diff -Nru wine1.3-1.3.0/aclocal.m4 wine1.3-1.3.1/aclocal.m4 --- wine1.3-1.3.0/aclocal.m4 2010-07-30 18:43:56.000000000 +0100 +++ wine1.3-1.3.1/aclocal.m4 2010-08-20 18:23:50.000000000 +0100 @@ -270,9 +270,9 @@ then wine_fn_append_rule ALL_MAKEFILE_DEPENDS \ "__builddeps__: $ac_file.$IMPLIBEXT -$ac_file.def: dlls/$ac_dir/$ac_dir.spec \$(WINEBUILD) +$ac_file.def: dlls/$ac_dir/$ac_dir.spec dlls/$ac_dir/Makefile \$(WINEBUILD) \$(WINEBUILD) \$(TARGETFLAGS)$ac_implibflags -w --def -o \$[@] --export \$(SRCDIR)/dlls/$ac_dir/$ac_dir.spec -$ac_file.a: dlls/$ac_dir/$ac_dir.spec \$(WINEBUILD) +$ac_file.a: dlls/$ac_dir/$ac_dir.spec dlls/$ac_dir/Makefile \$(WINEBUILD) \$(WINEBUILD) \$(TARGETFLAGS)$ac_implibflags -w --implib -o \$[@] --export \$(SRCDIR)/dlls/$ac_dir/$ac_dir.spec install-dev:: dlls/$ac_dir/Makefile __builddeps__ @cd dlls/$ac_dir && \$(MAKE) install-dev" @@ -280,7 +280,7 @@ then wine_fn_append_rule ALL_MAKEFILE_DEPENDS \ "__builddeps__: $ac_file.cross.a -$ac_file.cross.a: dlls/$ac_dir/$ac_dir.spec \$(WINEBUILD) +$ac_file.cross.a: dlls/$ac_dir/$ac_dir.spec dlls/$ac_dir/Makefile \$(WINEBUILD) \$(WINEBUILD) \$(CROSSTARGET:%=-b %)$ac_implibflags -w --implib -o \$[@] --export \$(SRCDIR)/dlls/$ac_dir/$ac_dir.spec" fi diff -Nru wine1.3-1.3.0/ANNOUNCE wine1.3-1.3.1/ANNOUNCE --- wine1.3-1.3.0/ANNOUNCE 2010-07-30 18:43:56.000000000 +0100 +++ wine1.3-1.3.1/ANNOUNCE 2010-08-20 18:23:50.000000000 +0100 @@ -1,17 +1,18 @@ -The Wine development release 1.3.0 is now available. +The Wine development release 1.3.1 is now available. What's new in this release (see below for details): - - Beginnings of a user interface for the builtin Internet Explorer. - - Support for cross-process OLE drag & drop. - - New builtin wscript.exe (Windows Script Host) program. - - Open/save dialogs remember the last used directory. - - Translation updates. + - Support for drag & drop between X11 and OLE. + - New ipconfig.exe builtin tool. + - Support for favorites in builtin Internet Explorer. + - Beginnings of a shell Explorer control. + - A number of DirectDraw code cleanups. + - Improvements to the calendar control. - Various bug fixes. The source is available from the following locations: - http://ibiblio.org/pub/linux/system/emulators/wine/wine-1.3.0.tar.bz2 - http://prdownloads.sourceforge.net/wine/wine-1.3.0.tar.bz2 + http://ibiblio.org/pub/linux/system/emulators/wine/wine-1.3.1.tar.bz2 + http://prdownloads.sourceforge.net/wine/wine-1.3.1.tar.bz2 Binary packages for various distributions will be available from: @@ -27,911 +28,704 @@ ---------------------------------------------------------------- -Bugs fixed in 1.3.0: +Bugs fixed in 1.3.1: - 8742 Bridge Base On Line - 10280 Oblivion: Horse Armor Crash - 10284 No$gba doesn't load previous directory in rom select - 10466 Radmin viewer 3.1: "Scanning for Active Servers" action does not work properly in main viewer window - 10711 unhandled page fault when installing EccoPro 4.01 16 & 32-bit versions - 10903 Fail to run Visere - 10961 application made using a compiler/embedder fails to start - 11060 z-order problem with Gecko prompt window starting Heredis 9 for first time - 11310 PowerCad Pro 7 - 11325 wpkg doesn't seem to work - 11802 Homeworld: sound broken usually - 11805 WMP stops playback after few seconds - 11986 Homeworld crashes at startup. - 12161 Adobe Photoshop CS2: progress bar appearing on active viewport with "on top" - 12559 UltimateBet does not start - 12620 Minimize to tray broken - NoteTab - 12870 Guild Wars doesn't start - Error Message: Graphic driver error - 12996 Orienteering Organizer stucks when opening file from remote directory (cifs or sshfs) - 13089 Adobe Acrobat Pro 7 / Acrobat Reader 7 -- How To window does not work - 13310 Magic DVD Copier has jagged border around window - bad transparancy mask? - 13344 DPP 3.4.1.1 - Images with "Fit to window" corrupted - 13378 Xplorer2 lite crashes in SHChangeNotify when deleting directory - 13531 dxi plugins don't run in wine - 13652 Trillian: Dragging a chat container outside of the screen looses the container - 13654 Diablo 2 in fullscreen mode, the bottom 6th of the screen is cut off (widescreen display) - 13744 FlashVideo MX gives an error when launched and terminates - 14210 Frostwire - right clicking tray icon doesn't work, closes immediately (dogfood) - 14272 Maximized and restored state not reported properly by GetWindowPlacement - 14328 Artificial Girl 3: Crashes when trying to start any executable - 14375 Mouse cursor flickers in Myst IV - Revelation - 14583 Free Music Zilla incurs unhandled page fault on exit - 14649 Blades of Exile/OpenBOE crashes when playing certain sounds if ALSA driver is used - 14727 Gadu-Gadu 7.7: buddy list not visible (gray), some menu options have wrong size (status options) - 14782 drakensang demo crashes on startup - 14799 RnQ: no tray/statusbar icons. - 14924 Fantasy Grounds 2: display flashes to black frequently - 14951 Heroes of Might and Magic V - Cursor error - 15154 Code::Blocks IDE 8.02 crash at codecompletion - 15198 improve speed while rendering text in Fine Reader 8 - 15223 ryzom client fails to create window - 15495 Lineage 2: Gracia - Part1: DirectX 9.0 error - 15499 IFC Trade Terminal hangs after select add existing account - 15517 Crash while playing heroes V - 15518 Garena won't start Warcraft3 - 15856 Internet Explorer embedded crash - 15911 Fallout 3 configuration detection is wrong - 16047 Garena client crashes in WSASendTo - 16276 Vixen + mono20 shows zero-height dialog - 16487 SOE Station Launcher does not display windows - 16501 Some moving objects in Myst IV - Revelation turn black on most camera angles - 16643 GetSocial fails to start - 16896 Flashing of the screen - 17057 Dragon NaturallySpeaking 8 installs but does not run. - 17060 Eve Online graphical glitch - 17149 HOMM 5: Invalid pointer error makes game crash - 17633 Zoner Photo Studio has broken computer tree - 17853 EQ2 Particle errors - 17955 Eve online hanhs during random action - 18360 Implement ntoskrnl.exe.MmMapIoSpace - 18785 tsMuxeR GUI does not show any text - 19212 secur32.SECUR32_initNegotiateSP() is unused - 19307 Font distorted in Safari 3.2 for Windows - 19308 Window border does not appear initially on Safari 3.2.3 - 19319 Word Viewer 2003 - installs wrong files (appinstall) - 19500 Dungeon Keeper II: installer crashes near completion - 19547 The wineserver sometimes crashes after The Movies demo installer fails - 19860 Music won't play on Phantasy Star Universe A.I. - 20047 Champions Online crashes due to d3d failure - 20376 Albumplayer craches with dotnet20 function - 20408 EVE Online freezes with DSOUND overflow after login - 20885 Adobe Acrobat 9 Pro Extended scanning not integrated for OCR Scanning with HP Officejet 5610v - 20894 Unimplemented function d3dx9_36.dll.D3DXCreateEffectPool - 21133 FreeSerifSoftware PhotoPlus SE installer fails with "this action is not supported, please use setup.exe to begin installation" - 21435 MessageBoxEx() fails with wLanguageId=0x019. Can't find dialog resource for that lang - 21546 Microsoft Flight Simulator 9 "remove debugger" - 21604 Office 2003: can no longer insert picture from file without manually setting override for gdiplus - 21732 HTML-Kit can't display embedded web pages - 21832 PSDK example doesn't render correctly - 21920 Houaiss Portuguese Dictionary won't install - 22021 Switching pages in ElsterFormular 2009/2010 needs much time - 22202 Dragon Age: Origins - gameplay is very glitchy (mostly black screen) - 22664 EVE Online Unhandled page fault during load screen - 22774 DirectX installer very slow on wine - 22972 new Firefox Setups wont run - 22992 SVN-Monitor needs gdiplus.dll.GdipGetRenderingOrigin - 23085 Printing in notepad displays "Page &p" instead of actual page number. - 23095 The win_skip()s in msvcrt/tests/printf.c are broken on Win95/98 and NT4 - 23115 IStorage Created with StgOpenStorageOnILockBytes doesn't use 'Stat' method of the IlockBytes Object - 23181 Absolute Poker won't start anymore - 23214 WM Desktop Alert crashes immediately after being run, without native gdiplus - 23280 The Starcraft 2 Editor crashes when you add a Model to the Previewer. - 23340 Winscard : test program : unimplemented function winscard.dll.SCardIsValidContext and winscard.dll.SCardReleaseContext - 23348 Need for Speed: Shift Demo has white fog during gameplay - 23372 AOE III: Crash at Ensemble Studios video - 23392 Magic the Gathering: Duel of the Planeswalker crashes on startup - 23528 Eclipse crashes immediately after startup - 23535 Fallout 3: no sound in childbirth scene if alsa driver is used - 23538 incredimail doesn't install - 23556 Starcraft 2 beta displays a black screen right after starting - 23578 Team Fortress 2: Significant lag disrupts gameplay... - 23581 Wine's README does not mention Win64 - 23613 Learning Software "lino" crashes at installation - 23617 Drakan: Order of the flame crashes on start - 23678 Crystal Cubes: fonts not drawn correctly - 23704 winhelp failed to load any help file - 23737 Modelsim XE III 6.4b/6.5c startup crashes - 23744 double click does not work in cell like window - 23762 wineboot aborts if "Terminate Process" is clicked - 23772 The bug in NtQueryInformationProcess with ProcessInformationClass = ProcessDebugObjectHandle - 23788 Samsung Kies installer stops early - 23808 Marmot Project doesn't start - 23810 16-bit setup program can't find its files - 23814 Enterprise Architect crashes on start in RegisterDragDrop() + 3975 FILE: printing does not work as expected + 5779 Corrupted Graphics in Tropico / Tropico Paradise Island + 6580 Mia's Math crashes on startup if you have saved a game + 6869 Need for Speed Carbon wont install due to detecting Wine as having DirectX 0 + 7575 Corel Lightning demo installer hangs + 9724 Intellicad - Unhandled exception when saving + 10815 Drag from native apps, drop to Wine doesn't work + 11067 Kid Pix Deluxe 4 Home Edition installer hangs near end + 11539 Anycount 6.0 refuses to start (VMWare backdoor check, magic 0x564D5868 on port 0x5658) + 12269 DirectX 6 SDK d3dim sample programs fail + 12710 Call of Duty 2 1.02: Game hangs up after several seconds + 12720 Text missing in Miranda's "View/Change My Details" dialog + 12874 The Master Genealogist 4.0d - Unhandled page fault on write access + 12977 Kid Pix Deluxe 4 Home Edition crashes if you click on Backgrounds + 13265 winepath exit always with zero code + 13690 failed to crosscompile dbghelp.dll (dogfood) + 14101 DirectX update takes very long time to complete + 15011 ooVoo: Interface isn't drawn correctly, is unusable. + 15370 DX-applications (mostly games) do not render shadows correctly + 15482 iTunes 8.0.2.20 fails while sign in to iTunes Store + 15957 GRLevelX Images Hidden + 16211 DC++ .707 fails to run, throws an unhandled exception + 16378 Mia's Math sound regressions + 16413 Ignored return values + 16450 EssentialPIM: Doesn't restore from tray + 17084 .NET 1.0: imagehlp.ImageGetDigestStream needs more flesh (assembly registration fails) + 17435 AntiDupl: crashes when duplicated images founded + 17699 World In Conflict 1.010: New launcher crashes preventing application usage + 17704 Seamonkey 2.0b1pre not drawing images + 18149 msvcrt.dll.??2@YAPEAX_K@Z is not implemented + 18165 dlls/winhttp/net.c: assignment discards qualifies from pointer target type + 18170 regedit should accept CR-separated lines + 18365 Shareaza uses 100% CPU when not minimized + 18401 Cars won't be renderer with PC3 shaders + 18955 SupremeCommander: GPGNet fails to install + 19093 Canon DPP: Editor window quits unexpectedly when zooming to 100% + 19245 GPUZ crashes on unimplemented hal and ntoskrnl APIs + 19276 Internet Explorer 1.0 fails to install + 19414 Excel 2003 & 2007 crash trying to run macros + 19529 .NET 2.0: LDAP authorization fails + 19849 Links 2003 does not run + 19867 Active Identity installation crashes due to unimplemented function winscard.dll.SCardListCardsA + 20001 Unimplemented function ntdll.dll.NtQuerySystemEnvironmentValue + 20429 X3 Terran Conflict (v 2.5) - intermittent cursor problems + 20443 EslWire: crash at start (dwmapi.DwmDefWindowProc is not implemented) + 20828 InstallUtil.exe fails on "Appraise It" setup + 20864 Tropico 3 1.09 crashes in-game after several seconds + 21027 Lego Digital Designer hangs on startup + 21568 advapi32/crypt tests crash with +heap + 22121 EVEMon (v1.3.1.2138): crashes on adding an account + 22131 CDBurnerXP 4.3.x: arrow buttons do not appear correctly + 22277 Pool Sharks requires implemented GdipSetImageAttributesWrapMode + 22504 Bioshock: fog renders red + 22540 CMake hangs when trying to detect and test MinGW compiler (gcc.exe & g++.exe) + 22574 Blockland v14 freezes on startup + 22605 Open R-Community Tools crashes (SafeNativeMethods.SelectObject Exception) + 22881 Custom-decorated windows not movable with Openbox (affects steam, wow...) + 22958 Missing disc icon on CDBurnerXP's progress dialog + 23014 InstallShield .prq doesn't find Windows Installer 4.5 + 23385 NVIDIA Demo: Cascades needs unimplemented function d3d10.dll.D3D10ReflectShader + 23477 WoW Cataclysm Beta needs KERNEL32.SetFileValidData + 23701 Crucial Memory Application - CrucialScan.exe + 23705 Runes of Magic says it can't log in if ConnectEx not available + 23707 stack overflow when destroying a window whose owner is itself + 23753 3D Sexvilla 2 : Installs but doesn't launch. + 23754 Kintecus: missing ipconfig.exe + 23801 Need for Speed: Shift Demo has partly transparant pit crew + 23818 Adobe FrameMaker 8: crashes on exit + 23834 Black Buccaneer: game freezes at start + 23848 Unable to build a shared WoW 64 build + 23849 Hofmann photo album app has access violation dialog during startup + 23879 Mopsos does not start + 23885 Build fails in dlls/d3dx9_36/tests + 23904 Starcraft II game screens are rendered upside-down + 23908 regedit fails to process some registry files + 23935 Can't install video conferencing program from NanoCorp + 23940 SetWindowPos does not work for other process windows + 23953 qemu.exe exhausts file descriptors + 24046 Keypressing in listview can result in infinite hang + 24047 Chessmaster Grandmaster Edition crashes + 24054 Unreal Tournament fails to start ---------------------------------------------------------------- -Changes since 1.2: +Changes since 1.3.0: -Alexander Nicolaysen Sørnes (12): - shdocvw: Fix a buffer overflow in InternetShortcut's IPersistFile::Load. - shdocvw: Add menu bar to Internet Explorer. - shdocvw: Allow printing from the menubar in IE. - shdocvw: Add About dialog to IE. - shdocvw: Add Open URL dialog to IE. - shdocvw: Make the Open URL dialog open URLs. - shdocvw: Add an address bar to IE. - shdocvw: Make the addressbar in IE do something useful. - shdocvw: Add DocHostContainer interface to interact with WB2/IE. - shdocvw: Update the address bar when URL changes. - shdocvw: Add a statusbar to IE. - shdocvw: Add support for setting the statusbar text in IE. - -Alexandre Goujon (2): - oleaut32/typelib: Fix ITypeInfo_Invoke with restricted keyword. - advapi32: Fix cred domain according to tests. - -Alexandre Julliard (53): - gdi32/tests: Fixed coordinates matching to use a relative error. - tests: Try to avoid message boxes popping up in non-interactive testing. - tests: Print information about the last executed test before crashing. - tests: Run all tests with the default FPU control word. - gdi32: Reject invalid DIB depths in CreateDIBSection. - comctl32: Fix positioning of toolbars that have the WS_BORDER style. - winebuild: Add more checks to protect against corrupted resource files. - server: Try to use /proc/pid/mem to read process memory since it should be faster. - d3d9/tests: Avoid sizeof in a trace. - sane.ds: Remove unused variables. - gphoto2.ds: Remove unused variables. - msvcrt/tests: Fix printf format warnings with ptrdiff_t. - rundll32: Fix a pointer conversion warning on 64-bit. - winebuild: Add a -m16 option to specify a 16-bit build. - winegcc: Add support for a -m16 option to specify a 16-bit build. - winegcc: Don't pass -nodefaultlibs to the Unix compiler so that it can be used by Wine. - makefiles: Specify -nodefaultlibs when building low-level dlls. - winegcc: Import kernel32 and ntdll by default also when building Wine. - dlls: Remove explicit imports of kernel32 and ntdll. - programs: Remove explicit imports of kernel32 and ntdll. - rpcrt4: Don't align the buffer after reading the conformance, we need to read the variance first. - wrc: Display a warning in pedantic mode when using memory options in 32-bit resources. - msvcrt: Use the appropriate mangled names for operator new/delete on 64-bit. - include: Make sure wine/port.h and msvcrt headers are not used together. - user32: DCX_NORESETATTRS should be applied at DC release time. - gdi32/tests: Fix a typo in a macro name. - gdi32: Update the DC mappings when the layout is changed. - include: Don't install tlb files, they are platform-dependent. - user32: Don't make constants static to avoid compile error without optimization. - configure: Disable the unused result warnings when Fortify is enabled. - winegcc: Don't import winecrt0 by default when building with -nodefaultlibs. - makefiles: Always build the static cross libraries if crosstest is supported. - makefiles: Always build the cross import libraries if crosstest is supported. - gdi.exe: Disable the remaining 16-bit visible region functions, they can't work. - gdi32: Replace the SelectVisRgn Wine-specific export by a private entry point. - gdi32: Store the total visible rectangle in the DC. - gdi32: Get rid of the GetDCOrgEx driver entry point, GDI can implement this itself now. - configure: Only output the disabled crosstest rule once. - configure: Build the import libraries without recursing when possible. - configure: Send the flex error output to config.log. - urlmon/tests: Don't bother testing unimplemented functions to reduce test output. - server: Use tgkill to send signals on x86_64 too. - gdi32: Make the top right corner the DC origin for RTL layouts. - gdi32/tests: Make function pointers global in the mapping test. - gdi32/tests: Add some tests for the DC origin in RTL layouts. - winex11: Fix handling of the lpDx array in ExtTextOut for the non-Xrender case. - gdi32: Make sure the text dimensions are always positive in the ExtTextOut normal case. - gdi32: Mirror the clip region when the DC is mirrored, with tests. - gdi32: Fix text positioning in mirrored DCs. - gdi32: Fix offset for mirrored devices that have a non-zero viewport offset. - winex11: Fix the positioning of some graphics primitives on mirrored contexts. - gdi32: Refresh the DC transforms when the visible rectangle is changed. - gdi32: Replicate a Windows bug in StretchDIBits for top-down bitmaps in the non-stretching case. - -Alistair Leslie-Hughes (1): - dwmapi: Add stub DwmEnableBlurBehindWindow. - -Anders Jonsson (1): - shdocvw: Add Swedish translation. - -Andrew Eikum (9): - oleaut32: Don't fail if member is missing in ITypeComp::Bind. - shlwapi: Be less strict on which type of IShellFolder can be enumerated. - shlwapi: Implement SHGetIniStringW. - shlwapi: Implement SHSetIniStringW. - shell32: IShellFolder::ParseDisplayName should work for missing files if given valid IBindCtx. - comdlg32/tests: Untie ok_testcases from test_ok(). - comdlg32: Store and use save/open dialogs' most-recently-used data. - notepad: Don't specify initial dir for save and open dialogs. - comdlg32/tests: Use GetOpenFileNameA instead of GetOpenFileNameW. - -Andrew Nguyen (29): - krnl386.exe: Use the correct format specifier for size traces. - krnl386.exe: Fix a potential leak and NULL dereference in DPMI_xrealloc. - ddraw: Return a failure code in IDirectDrawSurfaceImpl::QueryInterface if IDirect3D7::CreateDevice fails. - ddraw: Don't permit the enumeration of the Direct3D reference device in IDirect3D1::FindDevice. - ddraw/tests: Test IDirect3D::FindDevice HAL enumeration. - shlwapi/tests: Fix Win98 SE test failures for StrFormatKBSizeA/W. - shlwapi/tests: Add tests for StrStrA. - shlwapi: Fix handling of an empty search string in StrStrW. - shlwapi/tests: Add tests for StrStrIA. - shlwapi/tests: Add tests for StrStrIW. - shlwapi: Implement StrStrNW. - shlwapi: Implement StrStrNIW. - shlwapi/tests: Rename a string variable for clarity. - shlwapi/tests: Skip SHAnsiToAnsi tests on Win98. - shlwapi/tests: Skip SHUnicodeToUnicode tests on Win98. - shlwapi/tests: Skip StrRStrI tests on older Win9x platforms. - shlwapi/tests: Skip a StrCpyNW test that crashes on older Win9x. - shlwapi/tests: Correct the prototype of the StrRetToBSTR function pointer. - propsys: Implement PSStringFromPropertyKey. - propsys/tests: Add tests for PSStringFromPropertyKey. - propsys: Implement PSPropertyKeyFromString. - propsys/tests: Add tests for PSPropertyKeyFromString. - propsys: Fix comma processing in PSPropertyKeyFromString. - ntdll: Fix the status code for ProcessDebugObjectHandle class in NtQueryInformationProcess when the debugger is absent. - krnl386.exe: Fix last error check for DOS compatibility hack. - comdlg32: Avoid a NULL dereference when changing the file type selection of a Unicode Win3.1-style dialog. - oleaut32: Partially implement RegisterTypeLibForUser. - oleaut32: Partially implement UnRegisterTypeLibForUser. - oleaut32/tests: Test typelib registration in the user registry. - -Andrew Talbot (2): - advapi32: Constify some variables. - advapi32: Constify some variables. - -Andrey Turkin (6): - oleaut32: Reuse existing function to encode custom data. - oleaut32: Add support for const variables. - oleaut32: Better handle secondary type when generating type descriptors. - kernel32: Enhance EndUpdateResource. - imagehlp: Add tests for ImageGetDigestStream. - imagehlp: Implement ImageGetDigestStream. - -André Hentschel (10): - winecfg: Improve German view. - shlwapi/tests: Fix GLE for SHFormatDateTimeA. - ntdll: Add LDT error codes. - shell32: Add stub for SHGetPropertyStoreFromParsingName. - ws2_32: Fix test message. - krnl386.exe16: Add an error code. - shdocvw: Add German translation. - kernel32: Spelling fix in a comment. - jscript: Fix typo in registry information. - msi: Prevent cryptic error. - -Aric Stewart (7): - libwine: Update wctype table to represent windows 7 values. - libwine: Add C1_DEFINED to our C1 types and set it properly. - libwine: Remove some previous c1 cntrl exceptions that are no longer valid. - libwine: There are a number of characters of non punctuation type in the latin I block that Windows considers to be punctuation. - libwine: There are a few supercript characters (No, Lm types) that Windows marks as being either digit or as a letter. - kernel32/tests: Add test for CT_TYPE1 of GetStringTypeW. - usp10: Start implementing Chaining Context Substitution Format 3: Coverage-based Chaining Context Glyph Substitution. - -Aurimas Fišeras (1): - shdocvw: Add Lithuanian translation. - -Austin English (8): - winscard: Add stubs for SCardIsValidContext/SCardReleaseContext. - ntoskrnl.exe: Add stubs for MmMapIoSpace/MmUnmapIoSpace. - Remove references to wineprefixcreate. - rpcrt4/tests: Improve failure messages. - ws2_32: Remove unused variable. - setupapi/tests: Remove unused variable. - dmusic: use a previously unused variable. - kernel32/tests: Add a test for CreateFileA. - -Damjan Jovanovic (8): - notepad: Substitute the page number in the footer. - winemenubuilder: Always initialize COM. - ntdll: Convert even Unix paths outside Wine's drive mappings to DOS paths. - kernel32: Deal with unix paths in wine_get_dos_file_name. - winemenubuilder: Use windowscodecs for some ICO to PNG conversion. - winemenubuilder: Use windowscodecs for all ICO to PNG conversion. - winemenubuilder: Remove legacy PNG and XPM conversion code. - winemenubuilder: Add an option for thumbnailing .lnk files. - -David Hedberg (33): - include: Fix ExplorerBrowser interface declaration. - shell32: Fix some return values from the shellview contextmenu. - include: Add some new TreeView messages and extended style defines. - comctl32: Add support for expanded state image in treeview. - comctl32: Warn when using unsupported extended styles. - include: Add some missing function declarations in shlwapi.h. - include: Add SIGDN enumeration. - shell32: Shell_MergeMenus should be declared in shlobj.h and exported by name. - shell32: Shell_GetImageLists should be declared in shlobj.h and exported by name. - include: Add IEnumShellItems interface declaration. - include: Add IShellItemArray and IShellItemFilter interface declarations. - shell32/tests: Try harder to subclass the listview. - shell32: Implement IPersistFolder2 for the desktop folder. - include: Add INameSpaceTreeControl, INameSpaceTreeControl2 and INameSpaceTreeControlEvents interface declarations. - include: Add INameSpaceTreeControlCustomDraw interface declaration. - include: Add INameSpaceTreeControlDropHandler interface declaration. - include: Add a few IFileDialog related interface declarations. - include: Add IFileDialogCustomize interface declaration. - include: Add IFileDialogControlEvents interface declaration. - shell32: Change a fixme to a trace in shfldr_unixfs.c. - shell32: Implement Set/GetCurrentViewMode in the default shellview. - shell32: Implement SHGetNameFromIDList and IShellItem::GetDisplayName. - shell32: Implement SHCreateItemFromParsingName. - shell32: Implement SHCreateItemFromIDList. - shell32: Implement SHGetItemFromDataObject. - shell32: Implement SHGetIDListFromObject. - include: Add CLSID_NamespaceTreeControl, CLSID_FileOpenDialog and CLSID_FileSaveDialog. - shell32: Implement SHGetItemFromObject. - shell32: Implement IShellItem::Compare. - shell32: Initial implementation of IShellItemArray with SHCreateShellItemArray. - shell32: Implement SHCreateShellItemArrayFromShellItem. - shell32: Implement SHCreateShellItemArrayFromDataObject. - shell32: Fixup IShellItemArray_Constructor helper. - -Davide Pizzetti (3): - winecfg: Italian translation update. - winedbg: Italian translation update. +Alexander Nicolaysen Sørnes (9): + shdocvw: Add Favorites menu to IE. + shdocvw: Allow navigating to Favorites in IE. + shdocvw: Recurse into directories when adding Favorite in IE. + shdocvw: Add a toolbar to IE. + shdocvw: Make the Home button in IE work. + shdocvw: Add icons to the IE toolbar. + shdocvw: Allow the addressbar text in IE to be localized. + shdocvw: Add View menu to IE with list of installed toolbars. + mshtml: Send more informative messages to OleInPlaceFrame. + +Alexandre Goujon (1): + atl: Fix AtlAxAttachControl wine check. + +Alexandre Julliard (15): + configure: Add dependency on makefile for import libs to make sure the destination directory is created. + winex11: Sending a move/resize client message to the root requires a SubstructureRedirect mask too. + winebuild: Copy the strmake function from winegcc to simplify string formatting. + winebuild: Support an arbitrary number of temporary files. + winebuild: Add a spawn() helper function to avoid starting a shell where possible. + winebuild: Get rid of the ignored symbol support. + winegcc: Add a printf format attribute to the strmake() function. + winemenubuilder: Rename some variables to reflect the fact that we no longer use XPM format. + shdocvw: Fix an incorrect const typecast. + makefiles: Add dependencies for cross-compiled objects in static libraries. + configure: Check that the cross-compiler that we found actually works. + d3dx9: Fix some incorrect const typecasts. + explorer: Only run the systray timer when a systray icon is present. + configure: Require autoconf 2.62, older versions don't handle source dir symlinks correctly. + winhttp: Make WinHttpQueryHeaders behave the same way for all query types. + +Anders Jonsson (16): + mapi32: Add Swedish translation. + cryptui: Add Swedish translation. + README: Update Swedish translation. + cryptui: Fix typos in English resources. + winmm: Fix typo in English, Slovak resources. + xcopy: Add Swedish translation. + start: Add Swedish translation. + reg: Add Swedish translation. + jscript: Add Swedish translation. + credui: Update Swedish translation. + setupapi: Update Swedish translation. + wininet: Update Swedish translation. + mshtml: Update Swedish translation. + shdocvw: Update Swedish translation. + ipconfig: Add Swedish translation. + jscript: Update Swedish translation. + +Andrew Eikum (10): + regedit: Add regedit test suite. + regedit: Process reg files which use \r line endings. + shell32/tests: Fix some Win9x failures. + shell32: Add tests for SHChangeNotify functions. + regedit: Improve importing of REG_SZ with invalid quoting. + hlink: Implement HLINKGETREF flags handling. + oleaut32: Use correct bitpattern if referenced type is not user defined. + oleaut32: Overwrite previous CustData segment. + oleaut32: Ensure that CyclicList nodes have a type. + oleaut32: Implement ITypeInfo2::GetCustData. + +Andrew Nguyen (8): + gdi32: Improve AddFontMemResourceEx parameter validation. + mpr: Initialize the output enumeration handle to NULL in WNetOpenEnumA/W with no providers available. + ipconfig: Add stub implementation. + ipconfig: Implement basic command-line parsing. + include: Add prototype for GetAdaptersAddresses. + ipconfig: Partially implement basic adapter information output. + include: Add definitions for IP_ADAPTER_ADDRESSES flag values. + ipconfig: Partially implement full adapter information output. + +Andrew Talbot (8): + comctl32: Constify some variables. + comctl32: Constify some variables. + comctl32: Constify some variables. + comdlg32: Constify a variable. + crypt32: Constify some variables. + crypt32: Constify some variables. + crypt32: Constify some variables. + crypt32: Constify some variables. + +Andrey Turkin (2): + imagehlp: Remove uninitialized variable. + ntdll/tests: Do not check signedness for char types. + +André Hentschel (13): + winecfg: Sync German keyboard shortcuts. + comdlg32: Fix German font dialog. + comdlg32: Fix German shortcut conflict. + ntdll: Add SXS error codes. + shdocvw: Update German translation. + mshtml: Update German translation. + mshtml: Fix indentation in resource file. + shdocvw: Update German translation. + dwmapi: Add stub for DwmDefWindowProc. + user32: Use a macro instead of direct values. + jscript: Update German translation. + ntdll: Add more error codes. + ipconfig: Add German translation. + +Aric Stewart (8): + usp10: Add beginning support for GSUB Alternate Substitution Subtable. + usp10: Factor out script ranges in an more expandable way. + usp10: Report accurate information about our currently known scripts. + usp10: Have ScriptIsComplex reflect information in our scripts. + usp10: Generalize out applying Opentype features and define default features for currently known scripts. + usp10: Add contextual shaping proc to the script shaping data. + usp10: Add Syriac contextual shaping. + usp10: Update pwLogClust with glyph transformations. + +Aurimas Fišeras (5): + shdocvw: Updated Lithuanian translation. + mshtml: Update Lithuanian translation. + shdocvw: Updated Lithuanian translation. + jscript: Update Lithuanian translation. + ipconfig: Add Lithuanian translation. + +Austin English (2): + kernel32: Add stub for SetFileValidData. + ntdll: Check for __FreeBSD_kernel__, remove redundant ifdef's, make FIXME's consistent. + +Austin Lund (6): + dmime/tests: Added tests for IDirectMusicPerformance. + dmime: Ensure IDirectMusicPort is initialised when calling IDirectMusicPerformance::PChannelInfo. + advapi32: Add magic codes to HCRYPTKEY and HCRYPTHASH. + advapi32/tests: Add more error reporting for ReportEvent tests. + comctl32/tests: Do not perform comparison of dates if GetDateFormat fails. + comctl32/tests: DateTimePicker and MonthCalendar controls only support Gregorian calendar. + +Damjan Jovanovic (4): + winex11.drv: Use a Wine list to store XDnD data. + winex11.drv: Filter out all CF_* formats when CF_HDROP is present. + winex11.drv: Implement a framework for dragging from X and dropping to OLE. + winex11.drv: Implement the DataObject for dragging from X and dropping to OLE. + +David Hedberg (37): + explorerframe: Add dll stub. + explorerframe: Implement DllGetVersion. + explorerframe: Add a stub of NamespaceTreeControl. + explorerframe: Add classfactory implementation. + explorerframe/tests: Add initial NamespaceTreeControl tests. + explorerframe: Add some infrastructure to register the NamespaceTreeControl CLSID. + shell32: Replace some checks with calls to _ILIsEmpty(). + explorerframe: Implement Initialize. + explorerframe: Create the treeview on initialization. + explorerframe: Add IOleWindow implementation. + explorerframe: Implement Set/GetControlStyle(2). + explorerframe: Implement TreeAdvise/TreeUnadvise. + explorerframe: Implement InsertRoot and AppendRoot. + explorerframe: Handle TVN_GETDISPINFO to get icons, filename and information about subfolders. + explorerframe: Implement RemoveRoot and RemoveAllRoots. + explorerframe: Implement GetRootItems. + shell32: Partial implementation of IShellItem::BindToHandler. + explorerframe: Fix INameSpaceTreeControl::RemoveRoot. + explorerframe: Implement expansion of nodes. + explorerframe: Handle changing the selection. + explorerframe: Handle keyboard events. + explorerframe: Handle some mouse events. + explorerframe: Implement CollapseAll. + comctl32: Don't break on TVIS_NOSINGLEEXPAND. + explorerframe: Implement SetItemState and GetItemState. + comctl32: Return 0 when extended item state is requested from a treeview. + explorerframe: Implement GetNextItem. + explorerframe: Implement GetSelectedItems. + explorerframe: Implement GetItemRect. + explorerframe: Implement HitTest. + explorerframe: Implement EnsureItemVisible. + explorerframe: Some additional basic tests. + shell32: Add IExplorerBrowser interface stub. + shell32/tests: Add initial tests for the IExplorerBrowser control. + shell32: Add IShellBrowser stub. + shell32: Implement IExplorerBrowser::Initialize. + shell32: Implement IExplorerBrowser::SetRect. + +Davide Pizzetti (2): xcopy: Italian translation update. + wordpad: Italian translation update. -Detlef Riekenberg (2): - winhelp.exe16: Add missing separator after command name. - rundll.exe16: Add program as 16bit wrapper for rundll32.exe. - -Dmitry Timoshkov (3): - comctl32: Make sure that the focus is set to an existing property sheet button. - winex11: Remember last window that had the XIC focus and use it in ToUnicode() to make dead keys work more reliably. - gdi32: Make sure that all the glyph metrics are transformed before caching them. - -Dylan Smith (28): - richedit: Don't break when streaming out a table, just continue. - richedit: Fix streaming rtf with table at the start of the text. - user32: RegisterClassEx should check for invalid cbSize field. - wordpad: Fix behaviour of find/replace dialog. - wordpad: Find dialogs intialize find field with selection. - wordpad: Search finished message box should be modal. - wordpad: Reduce unnecessary flicker from extra background erasing. - wordpad: Remove sized print preview page buffer. - wordpad: Avoid filling overlapping rectangles in print preview. - wordpad: Save and load word wrap registry options. - comdlg32: Check for valid replace parameters on ReplaceTextW. - comdlg32: Zero length replace buffer is valid for ReplaceText. - comdlg32: Test and fix Find/ReplaceText parameter checking code. - user32: DefMDIChildProc sends WM_MDINEXT with active child handle. - user32/tests: Minimized windows shouldn't be resizable. - user32: Prevent resize of minimized windows from SetWindowPos. - wordpad: Allow objects & images to be added with native riched20. - richedit: EN_UPDATE notification is sent on WM_PAINT. - richedit: Remove redundant commit and repaint in ME_StreamInText. - richedit: Invalidate without calling UpdateWindow in many cases. - richedit: Removed redundant variable ptLastSplittableRun. - richedit: Removed unused run flags values. - richedit: Return correct values when EM_SETTEXTMODE fails. - richedit: Don't change text mode with undo or redo stack. - richedit: Check for bits instead of equality in EM_SETCHARFORMAT. - richedit: Remove checks for converting internal CHARFORMAT structs. - richedit: Use ME_Cursor as parameter to ME_SplitRunSimple. - richedit: Avoid redundant calls to ME_CalcRunExtent. - -Eric Pouech (1): - wineoss.drv: Be consistent for aux devices about what we actually support. - -Florian Köberle (3): - comctl32: Call TREEVIEW_SendExpanded after expanding. - comctl32: Simplify the code. - wined3d: Let GetRasterStatus return D3DERR_INVALIDCALL. - -Francois Gouget (1): - wine.inf: Let winebrowser handle the ftp URLs. - -Frédéric Delanoy (2): - shdocvw: Add French translation. - shdocvw: Fix French translation. - -Greg Geldorp (2): - winetest: Take manifests into account when hunting for DLLs. - msvcrt/tests: ecvt on Win9x and NT4 will corrupt memory if nrdigits < 0. - -Hans Leidekker (35): - advapi32: Stub out the Safer* functions a bit more. - shlwapi: Don't trace the contents of output buffers. - msi: Add a test for MsiSetFeatureState. - msi: Store the patch state in the registry. - msi: Unpublish the product after running all the actions. - msi: Keep track of the patch filename in apply_registered_patch. - msi: Publish patches regardless of any features being installed locally. - msi: Set feature states to the installed state if the Preselected property is not set. - msi: Move the component enabled check into the standard actions. - msi: Reverse the transform storage list order. - msi: Improve traces in db_get_raw_stream. - msi: Remove a fixme that no longer applies. - msi/tests: Double null-terminate a REG_MULTI_SZ string. - msi: Properly advance the patch pointer in msi_check_product_patches. - winhttp: Add a partial implementation of WINHTTP_OPTION_SECURITY_CERTIFICATE_STRUCT. - winhttp: Handle errors from SSL_read. - msi: Make sure properties are updated after applying a patch. - msi: Downgrade a warning. - msi/tests: Fix test failures on wow64. - msi/tests: Return an error code from helper_createpackage and package_from_db. - msi/tests: Skip tests when the current user has insufficient rights. - msi/tests: Avoid a long timeout in the test for DeleteServices. - msi/tests: Fix some more wow64 test failures. - msi: Fix a memory leak. - msi/tests: Initialize a string buffer and fix some leaks. - msi/tests: Properly contruct the icon path for win9x. - msi: Never defer standard actions. - msi: Set/unset the SourceDir property at the right stage in the execution sequence. - msi: Add some tests for MsiGetSourcePath. - msi: Warn if a transform file cannot be opened. - msi: Register dlls directly in the SelfRegModules and SelfUnregModules actions. - msi: Synchronize the spec file with version 5.0. - msi/tests: Skip a test if the current user has insufficient rights. - include: Add the TOKEN_ELEVATION_TYPE enumeration. - msi/tests: Skip tests if UAC is enabled and the process is not running elevated. - -Harald Hoyer (1): - preloader: Fix moving of auxiliary values. - -Harry Jeffery (1): - Fixed various spelling mistakes. - -Henri Verbeet (40): - ddraw: Avoid some forward declarations. - ddraw: Get rid of the useless "ddraw_owner" fields. - ddraw: Get rid of some dead code. - ddraw: The surface isn't allowed to be NULL in EnumSurfacesCallbackThunk() and EnumCallback(). - ddraw: Merge the ddraw thunks into ddraw.c. - ddraw: Merge the surface thunks into surface.c. - wined3d: Consolidate surface related prototypes in wined3d_private.h. - wined3d: Remove restoring the read buffer from read_from_framebuffer_texture(). - wined3d: Add some missing flags to debug_d3dusage(). - wined3d: Remove an unused prototype. - wined3d: Just implement BindTexture() for GDI surfaces in surface_gdi.c. - wined3d: Use a more consistent name for the normalized texrect "extension". - wined3d: Remove ModifyLocation() from the public wined3d surface interface. - wined3d: Remove LoadLocation() from the public wined3d surface interface. - wined3d: Preload resources before FBO setup. - wined3d: Framebuffer blits are affected by the color mask. - d3d9/tests: Introduce a vertex shader to the MRT test. - wined3d: Clear all render targets in an MRT setup. - d3d9/tests: Add a test for clearing render targets in an MRT. - wined3d: Avoid loading the destination surface in stretch_rect_fbo() if it will be completely overwritten. - wined3d: Do RGB <=> sRGB transfers using FBO blits. - wined3d: Merge strect_rect_fbo() and surface_load_srgb_fbo(). - wined3d: Add a missing return statement to surface_prepare_texture(). - wined3d: Cleanup Get/SetRenderState traces a bit. - wined3d: Check for unread registers in a more logical way in handle_ps3_input(). - wined3d: Properly take both input and output masks into account in handle_ps3_input(). - wined3d: Invalid NP2 fixup info is an internal error. - wined3d: Setting render target 0 to NULL in an application error. - wined3d: Unify vertex shader output handling between shader models. - wined3d: Clamp vertex shader outputs. - d3d9/tests: Add a test for handling floating point specials in shaders. - d3d9/tests: Fix an ok() message in pointsize_test(). - ddraw: Use a less offensive handle table implementation for materials. - ddraw: Use a less offensive handle table implementation for matrices. - ddraw: Use a less offensive handle table implementation for stateblocks. - ddraw: Use a less offensive handle table implementation for surfaces. - wined3d: The stateblock doesn't have a parent. - wined3d: Move the draw buffer array to the context. - wined3d: Add support for ARB_texture_compression_rgtc. - d3d9/tests: Read from the appropriate pixels in test_constant_clamp_vs(). - -Howell Tam (1): - ws2_32: Wrapped WSASendTo/WSARecvFrom with a different function name. - -Huw Davies (4): - ole32/tests: Relax the reference counting tests a bit. We only care whether references are held or not. - ole32: Implement cross-process drag and drop. - ole32: Pass a real IUnknown ptr to CoMarshalInterface. - oleaut32: Don't invoke a function that has the restricted attribute or is part of an interface that's marked as restricted. - -Hwang YunSong (2): - shdocvw: New Korean resource. - start: Update Korean resource. - -Igor Paliychuk (29): - shell32: Update Ukrainian translation. - taskmgr: Add Ukrainian translation. - regedit: Add Ukrainian translation. - oleview: Add Ukrainian translation. - winecfg: Add Ukrainian translation. - notepad: Add Ukrainian translation. - appwiz.cpl: Add Ukrainian translation. - cryptui: Add Ukrainian translation. - net: Add Ukrainian translation. - progman: Add Ukrainian translation. - wineboot: Add Ukrainian translation. - winedbg: Add Ukrainian translation. - progman: Ukrainian translation fix. - notepad: Ukrainian translation fix. - browseui: Add Ukrainian translation. - jscript: Add Ukrainian translation. - gphoto2.ds: Add Ukrainian translation. - sane.ds: Add Ukrainian translation. - winspool.drv: Add Ukrainian translation. - wineconsole: Add Ukrainian translation. - cmdlgtst: Add Ukrainian translation. - start: Add Ukrainian translation. - shdocvw: Add Ukrainian translation. - cmd: Add Ukrainian translation. - taskmgr: Fixed Ukrainian translation. - comdlg32: Ukrainian translation update. - crypt32: Ukrainian translation update. - comdlg32: Fixed Russian standard dialog sizes. - comdlg32: Fixed Ukrainian standard dialog sizes. - -Ilya Basin (2): - shell32: Fix CommandLineToArgvW("") truncating returned exe path. - shell32/tests: CommandLineToArgvW("") shouldn't truncate returned exe path. - -Jacek Caban (24): - jscript: Fixed sort_cmp for non-string arguments. - mshtml: Added IHTMLElement2::getBoundingClientRect implementation. - mshtml: Added IHTMLRect::get_top implementation. - mshtml: Added implementation of remaining IHTMLRect getters. - mshtml: Added IHTMLDocument3::detachEvent implementation. - shdocvw: Don't fail on invalid headers argument in navigate_url. - mshtml: Removed frozen status comments from nsiface.idl. - jscript: Added support for Function.arguments property. - jscript: Use generic object constants for Math constants. - shdocvw: Moved IHlinkFrame implementation to separated object. - shdocvw: Moved ITargetFrame2 implementation to HlinkFrame object. - shdocvw: Inherit HlinkFrame in InternetExplorer object. - wscript.exe: Added stub implementation. - jscript: Return S_OK in SetScriptState for SCRIPTSTATE_INITIALIZED. - jscript: Register .js file type. - wscript.exe: Added engine lookup implementation. - wscript.exe: Added script engine host implementation. - wscript.exe: Added parsing script file implmentation. - wscript.exe: Added IHost typelib. - wscript.exe: Added IHost stub implementation. - wscript.exe: Added missing vararg attribute. - wscript.exe: Added IHost's IDispatch functions implementation. - wscript.exe: Added support for IHost type info. - mshtml: Pass processed URI to NewURI. - -Johan Gill (1): - ddraw: Added a todo_wine test for SetCooperativeLevel. - -Jörg Höhle (2): - msvfw32/tests: Add ICDecompressQuery format tests. - msvidc: ICDecompressQuery returns ICERR_BADFORMAT on error. - -Louis Lenders (3): - d3d9/tests: Test GetAdapterDisplayModeEx with D3DDISPLAYROTATION null-pointer. - wine.inf: Add key HKLM\SOFTWARE\Microsoft\NET Framework Setup\NDP\v3.5\1033. - wine.inf: Add key HKCU,%CurrentVersion%\Run. - -Luke Bratch (1): - wined3d: Add Nvidia 8800GTX detection. - -Maarten Lankhorst (14): - wineserver: Use syscall instead of int $0x80. - ntdll: Use syscall instead of int $0x80. - mmdevapi: Blacklist portaudio. - quartz: Fix flushing in dsound renderer. - quartz: Accept tiny discontinuities in video renderer without printing out an error. - quartz: Make it possible to just override IMediaSeeking::GetCurrentPosition. - quartz: Implement MediaSeekingPassThru. - quartz: Add support for renderer methods to MediaSeekingPassThru. - mciqtz32: Remove individual queryinterfaces. - mciqtz32: Add support for mciWindow. - mciqtz32: Add support for MCI_STATUS_MODE. - mciqtz32: Simplify mciWhere. - mciqtz32: Fix mciOpen. - mciqtz32: Fix mciPlay. - -Marcus Meissner (2): - gdi32: Rebuild font hash after changing the matrix. - ddraw: Tighten up checks in DuplicateSurface (Coverity). - -Mariusz Pluciński (4): - gameux: Add gameux.dll library stub. - gameux: Add stub of IGameExplorer implementation. - gameux: Add IClassFactory implementation. - gameux: Add interface registration routines. - -Marko Nikolic (3): - advapi32/tests: Removed sign comparison warning in service.c. - libwine: Removed sign comparison warning. - advapi32: Removed sign comparison warning. - -Matt 'Murph' Finnicum (1): - imm32: Set size of OSVERSIONINFOA before calling GetVersionExA. - -Matteo Bruni (16): - d3dx9: Remove unused parameter from get_regname(). - d3dx9: Improve a FIXME. - d3dx9: Error out on dcl output instruction where not supported. - d3dx9: Check dcl input instruction syntax against shader version. - d3dx9: Add ps_1_x source register modifiers to the shader assembler. - d3dx9: Add shift modifiers parsing to the shader assembler. - d3dx9: Add ps_1_4 instructions parsing to the shader assembler. - d3dx9: Shader assembler ps_1_4 support. - d3dx9: Fix dst register handling in ps_1_4. - d3dx9: Add <= ps_1_3 instruction parsing to the shader assembler. - d3dx9: Shader assembler <= ps_1_3 support. - windowscodecs: Reset the stream pointer when initializing JPEG decoder. - wined3d: Setup target if offscreen rendering setting changed. - include: Add the ID3D10Blob interface. - d3dx9: Handle parent_data parameter of D3DXInclude.Open() function. - d3dx9: Implement D3DXAssembleShaderFromFile. - -Max TenEyck Woodbury (1): - ntdll: Setting FileAllInformation is not allowed. - -Michael Mc Donnell (1): - shell32/tests: Test that clicking "Make New Folder" makes a new folder. - -Michael Stefaniuc (70): - cmd: Remove stray ';' from the resource files. - winhlp32: Move from a per resource to a global LANGUAGE setting. - winmm: Move from a per resource to a global LANGUAGE setting. - clock: Move from a per resource to a global LANGUAGE setting. - start: Remove the redundant per resource LANGUAGE settings. - notepad: Move from a per resource to a global LANGUAGE setting. - avifil32: Remove the ignored common resource attributes. - comctl32: Remove the ignored common resource attributes. - comdlg32: Remove the ignored common resource attributes. - crypt32: Remove the ignored common resource attributes. - cryptui: Remove the ignored common resource attributes. - devenum: Remove the ignored common resource attributes. - gphoto2.ds: Remove the ignored common resource attributes. - iccvid: Remove the ignored common resource attributes. - jscript: Remove the ignored common resource attributes. - localui: Remove the ignored common resource attributes. - mshtml: Remove the ignored common resource attributes. - mshtml.tlb: Remove the ignored common resource attributes. - msrle32: Remove the ignored common resource attributes. - msvfw32: Remove the ignored common resource attributes. - oleacc: Remove the ignored common resource attributes. - pstorec: Remove the ignored common resource attributes. - setupapi: Remove the ignored common resource attributes. - shdocvw: Remove the ignored common resource attributes. - shell32: Remove the ignored common resource attributes. - user32: Remove the ignored common resource attributes. - wininet: Remove the ignored common resource attributes. - cmdlgtst: Remove the ignored common resource attributes. - notepad: Remove the ignored common resource attributes. - progman: Remove the ignored common resource attributes. - taskmgr: Remove the ignored common resource attributes. - winecfg: Remove the ignored common resource attributes. - winemine: Remove the ignored common resource attributes. - wordpad: Remove the ignored common resource attributes. - msxml3: Remove the ignored common resource attributes. - msvidc32: Remove the ignored common resource attributes. - winspool.drv: Remove the ignored common resource attributes. - oleview: Remove the ignored common resource attributes. - stdole2.tlb: Remove the ignored common resource attributes. - wldap32: Remove the ignored common resource attributes. - wineboot: Remove the ignored common resource attributes. - msacm32: Remove the ignored common resource attributes. - oledlg: Remove the ignored common resource attributes. - localspl: Remove the ignored common resource attributes. - winhlp32: Remove the ignored common resource attributes. - wineps.drv: Remove the ignored common resource attributes. - wineconsole: Remove the ignored common resource attributes. - stdole32.tlb: Remove the ignored common resource attributes. - uninstaller: Remove the ignored common resource attributes. - cryptdlg: Remove the ignored common resource attributes. - clock: Remove the ignored common resource attributes. - regedit: Remove the ignored common resource attributes. - start: Remove the ignored common resource attributes. - oleaut32: Remove the ignored common resource attributes. - mpr: Remove the ignored common resource attributes. - shlwapi: Remove the ignored common resource attributes. - winefile: Remove the ignored common resource attributes. - msiexec: Remove the ignored common resource attributes. - shdoclc: Remove the ignored common resource attributes. - view: Remove the ignored common resource attributes. - msi: Remove the ignored common resource attributes. - serialui: Remove the ignored common resource attributes. - credui: Remove the ignored common resource attributes. - sane.ds: Remove the ignored common resource attributes. - ole32: Use IsEqualIID instead of memcmp to compare REFIIDs. - oleaut32/tests: Use IsEqualIID instead of memcmp to compare REFIIDs. - oleaut32: Use IsEqualGUID instead of memcmp to compare GUIDs. - shdocvw: Add the Romanian translation. - ntdll: Use IsEqualGUID instead of memcmp to compare GUIDs. - server: Simplify tkill() and remove unreachable code (Smatch). +Detlef Riekenberg (10): + include: Add a closing bracket. + shdocvw: Do not trim the last character, when using the iexplore open menu. + gdi32: Always use a HANDLE for GDI_ReleaseObj. + shlwapi/tests: Run more language dependent tests only on English locales. + include: Add inaddr.h. + wineps: Use winspool.drv for job management. + qmgr/tests: Detect when the service is disabled. + ntdll: Implement RtlIpv4AddressToString / RtlIpv4AddressToStringEx. + ntdll/tests: Add tests for RtlIpv4AddressToString / RtlIpv4AddressToStringEx. + gdi32/enhmfdrv: Remove unneded if() before HeapFree. + +Dmitry Timoshkov (5): + gdi32: Do not crash on an invalid pointer passed to AddFontMemResourceEx. + user32: Add a test for GetClassInfo, make it pass under Wine. + ws2_32: Rearrange the code to avoid a needless release_sock_fd(). + user32: Protect from setting as a window owner one of its successors. + user32: Properly pack the WM_WINE_SETWINDOWPOS internal message. + +Frédéric Delanoy (5): + shdocvw: Update French translation. + shdocvw: Update French translation. + mshtml: Update French translation. + jscript: Update French translation. + ipconfig: Add French translation. + +Gerald Pfeifer (2): + comctl32: Merge is_textT and is_textW into a single is_text. + d3dx9_36: minwidth and minheight are set but not used in point_filter_simple_data; remove them. + +Hans Leidekker (7): + mscms/tests: Mark some win98 test results as broken. + msi/tests: Fix some WoW64 test failures. + msi/tests: Use HKEY_CURRENT_USER instead of HKEY_LOCAL_MACHINE for registry tests. + msi/tests: Skip SourceDir tests on win9x. + msi: Handle signature filenames in short|long notation. + msi: Bump version to 4.5. + wldap32: Fix handling of zero timeout value in ldap_search_extW. + +Henri Verbeet (51): + d3dx9_36/tests: Avoid the non-portable NAN macro. + wined3d: Use the correct divider for 15-bit depth formats in IWineD3DSurfaceImpl_BltZ(). + wined3d: Pass the color as floating point values to device_clear_render_targets(). + wined3d: Always set the get_drawable_size() surface function. + wined3d: Allow filtering and blending with WINED3DFMT_ATI2N. + wined3d: Replace color_fill_fbo() with device_clear_render_targets(). + wined3d: Cleanup Get/SetRenderTarget(). + wined3d: Cleanup Get/SetDepthStencilSurface(). + wined3d: Only try to acquire a context in surface_cleanup() if there are GL resources to be destroyed. + wined3d: Make some lookup tables const. + wined3d: Reattach FBO attachments when any of the corresponding surfaces is unloaded. + wined3d: Fix some misspellings of "surface". + wined3d: Cleanup IWineD3DBaseSwapChainImpl_GetBackBuffer() a bit. + wined3d: Print the correct resource location in surface_set_texture_name(). + wined3d: Correctly calculate the resource size for ATI2N surfaces. + wined3d: Rename surface_calculate_size() to wined3d_format_calculate_size(). + wined3d: Round up to complete compressed blocks in IWineD3DDeviceImpl_UpdateSurface(). + wined3d: Fix a couple of typos. + wined3d: Remove SetContainer() from the public IWineD3DVolume interface. + wined3d: Remove SetContainer() from the public IWineD3DSurface interface. + wined3d: A volume's container is always a volume texture. + wined3d: Also store the subresource container type. + wined3d: Get rid of the now redundant SFLAG_SWAPCHAIN surface flag. + wined3d: Avoid IWineD3DSurface_GetContainer(). + dsound: Remove the useless CINTERFACE definition. + mmdevapi: Remove the useless CINTERFACE definitions. + wined3d: Add a TRACE to IWineD3DSurfaceImpl_LoadTexture(). + ddraw: Merge direct3d.c into ddraw.c. + ddraw: Remove useless light callbacks. + ddraw: Remove a useless material callback. + ddraw: Remove a useless viewport callback. + wined3d: Don't print format IDs in decimal. + wined3d: Release the previous render target only after replacing it in IWineD3DDeviceImpl_SetRenderTarget(). + wined3d: Cleanup device_resource_released(). + ddraw: Merge gamma.c into surface.c. + ddraw: Merge texture.c into surface.c. + ddraw: Remove unused / redundant includes. + ddraw: Add a separate function for light initialization. + ddraw: Add a separate function for material initialization. + ddraw: Add a separate function for viewport initialization. + ddraw: Add a separate function for parent initialization. + ddraw: Add a separate function for clipper initialization. + usp10: Pass the correct buffer size to lstrcpynA() in load_GSUB_feature(). + ddraw: Add a separate function for device initialization. + ddraw: Add a separate function for execute buffer initialization. + ddraw: Add a separate function for palette initialization. + ddraw: Add a separate function for vertex buffer initialization. + ddraw: Add a separate function for ddraw initialization. + ddraw: Add a separate function for surface initialization. + ddraw: Add / improve TRACEs. + wined3d: Do not release a reference we do not have in IWineD3DSurfaceImpl_Flip(). + +Huw Davies (1): + rpcrt4: Add a missing STUBLESS_INITOUT case. + +Hwang YunSong (3): + mshtml: Update Korean resource. + shdocvw: Update Korean resource. + winmm: Update Korean resource. + +Igor Paliychuk (4): + shdocvw: Update Ukrainian translation. + mshtml: Update Ukrainian translation. + jscript: Ukrainian translation update. + ipconfig: Added Ukrainian translation. + +Jacek Caban (41): + mshtml: Get rid of useless nsQIResult type. + jscript: Use generic properties for NaN and Infinity implementation. + jscript: Fixed test crash on some win9x installations. + jscript: Use generic property for Error.number. + mshtml: Improved tracing of nsACString arguments. + mshtml: Moved HTTP headers list freeing to separated function. + mshtml: Moved getting HTTP header to separated function. + mshtml: Moved setting HTTP header to separated function. + mshtml: Moved headers parsing to separated function. + mshtml: Allow customization of BeginningTransaction. + mshtml: Store request headers in nsChannel if possible. + mshtml: Added nsIChannel::GetRequestHeader implementation. + mshtml: Added nsIChannel::SetRequestHeader implementation. + mshtml: Store request method in nsChannel. + mshtml: Added nsIChannel::GetRequestMethod implementation. + mshtml: Added support for custom post data type. + jscript: Use generic property for Error.description. + jscript: Use generic property for Error.message. + jscript: Fixed Error.toString implementation for non-Error this. + jscript: Get rid of no longer needed ErrorInstance struct. + jscript: Throw TypeError in instanceof_expression_eval. + jscript: Throw TypeError in in_eval. + shdocvw: Ignore invalid NULL PostData. + dbghelp: Silence template related dwarf FIXMEs. + mshtml: Use QueryCommandState to get align state. + mshtml: Added nsIHttpChannel::referrer implementation. + mshtml: Treat file URLs pointing to Gecko installation directory as special URIs. + mshtml: Added nsIURL::Resolve implementation. + mshtml: Use fake scheme only for about protocol in nsIURI::GetScheme. + mshtml: Return true spec in nsIURI::GetSpec. + mshtml: Added nsIChannel::GetName implementation. + mshtml: Call nsILoadGroup::AddRequest from AsyncOpen. + mshtml: Moved update_window_doc to on_start_nsrequest and update callback's document if needed. + mshtml: Skip mutation notifications on documents that are being replaced. + mshtml: Call on_stop_nsrequest asynchronously. + mshtml: Avoid asynchronous parse_complete call. + mshtml: Added an explicit CDECL attribute to imported functions. + mshtml: Don't use start_binding in IPersistStreamInit::InitNew. + oleaut32: Try both SYS_WIN64 and SYS_WIN32 syskind in QueryPathOfRegTypeLib on win64. + ntdll: IMAGE_REL_BASED_HIGH, IMAGE_REL_BASED_LOW and IMAGE_REL_BASED_HIGHLOW should be supported on win64. + wscript.exe: Improved argument parsing. + +Jeff Cook (2): + winealsa.drv: Init mixer on cards with a single Mic control, like snd_usb_audio mics. + winealsa.drv: If we can't open a device as stereo, try mono. This is necessary for snd-usb-audio mics. + +Jeff Latimer (1): + msvcirt: Add some stubs. + +Jerome Leclanche (1): + gdi32: Properly set ERROR_NOACCESS when GetObject receives invalid arguments. + +Jose Rostagno (5): + shdocvw: Add Spanish translation. + notepad: Fix Spanish translation. + cmd: Fix Spanish translation. + shdocvw: Update Spanish translation. + mshtml: Update Spanish translation. + +Juan Lang (8): + ntdll: Implement NtQueryInformationProcess for ProcessDefaultHardErrorMode. + ntdll: Implement NtSetInformationProcess for ProcessDefaultHardErrorMode. + kernel32: Implement GetErrorMode/SetErrorMode on top of NTDLL. + crypt32/tests: Add a test of SSL_EXTRA_CERT_CHAIN_POLICY_PARA's fdwChecks field. + crypt32: Honor SECURITY_FLAG_IGNORE_CERT_CN_INVALID. + iphlpapi: Don't overwrite last IPv4 address with first IPv6 address. + shdocvw: Apply default scheme when none is present. + mshtml: Fix off by one error in setting status text. + +Jörg Höhle (5): + winecoreaudio: Use same hard-coded limit on frequency as ALSA/OSS. + mcicda: Rework MCI notification system. + mcicda: Fix several return codes. + mcicda: Fix seeking. + kernel32/tests: GetVolumeInformationA X: succeeds iff drive's default dir is root. + +Konrad Wartke (2): + wineboot: Added more architectures in create_enviroment_registry_keys. + browseui: Improved a FIXME in DllGetVersion. + +Luca Bennati (6): + shdocvw: Add Italian translation. + shdocvw: Update Italian translation. + shdocvw: Update Italian translation. + mshtml: Update Italian translation. + jscript: Update Italian translation. + ipconfig: Add Italian translation. + +Maarten Lankhorst (2): + winmm: Fix fd leak on restarting timer. + mciqtz32: Fix window visibility. + +Mariusz Pluciński (6): + gameux/tests: Add test of IGameExplorer creation. + gameux: Add stub of IGameStatisticsMgr implementation. + gameux/tests: Add test of IGameStatisticsMgr creation. + gameux: Add IGameExplorer2 implementation stub. + gameux/tests: Add test of IGameExplorer2 creation. + gameux: Add definitions of resource identifiers to header file. + +Marko Nikolic (2): + advapi32/tests: Removed sign comparison warnings in eventlog tests. + advpack/tests: Removed sign comparison warning in advpack tests. + +Matteo Bruni (18): + d3dcompiler_43: Add dll directory. + include: Add some d3dcompiler-related definitions. + include: Fix some d3d10shader.h defines. + include: Stub d3dcompiler.h, d3d11shader.h. + d3dcompiler_42: Stub dll. + d3dcompiler_41: Stub dll. + wined3d: Call set_render_offscreen at the end of context_setup_target. + wined3d: Fix context_apply_clear_state with ORM = backbuffer. + wined3d: Remove isInDraw hack from context_setup_target. + d3dcompiler: Remove useless kernel32 imports. + d3dcompiler_40: Stub dll. + d3dcompiler_39: Stub dll. + d3dcompiler_38: Stub dll. + d3dcompiler_37: Stub dll. + d3dcompiler_36: Stub dll. + d3dcompiler_35: Stub dll. + d3dcompiler_34: Stub dll. + d3dcompiler_33: Stub dll. + +Michael Stefaniuc (3): + ddraw: Use FAILED instead of NOT SUCCEEDED. + gameux: Don't bother to output a "stub" FIXME in DllCanUnloadNow(). + explorerframe: Don't cast NULL. Mike Kaplinskiy (7): - server: Move signaling FD_* events to a separate function. - server: Propagate error from recv. - server: In case of hangup/error, wake up all asyncs that can no longer be completed. - server: Forward the correct error to asyncs. - server: Consume events triggered. - server: Don't delay events, we simply shouldn't send them in the first place. - server: Fix some comments. - -Misha Koshelev (1): - d3dx9: Add stub and basic test for D3DXCreateSphere. - -Nikolay Sivov (19): - comctl32/monthcal: Separate single calendar data. - comctl32/monthcal: Prepare drawing helpers for multiple calendars. - comctl32/monthcal: Modify hittesting helper to work with multiple calendars. - comctl32/monthcal: Get rid of goto jumps in hit test helper. - comctl32/monthcal: Prepare MCM_GETMONTHRANGE with GMR_VISIBLE for multiple calendars. - msxml3: Speed up a IPersistStreamInit::Save() by querying for BSTR length. - comctl32/monthcal: Use memcpy to copy day state arrays. - ole32: Remove redundant variables. - ole32: Fix assumption about HRESULT failure code value. - ole32: No need to test for interface pointer being null. - ole32: Use IsEqualIID() instead of memcmp(). - comctl32/treeview: Properly initialize expanded image index. - comctl32/treeview: Fix TVS_SINGLEEXPAND notifications order. - comctl32/tests: Merge one test function to existing tests, use explicit message numbers. - comctl32/treeview: Fix possible crash in TVS_SINGELEXPAND helper (Coverity). - shlwapi/tests: Fix some test failures on Win2000. - shlwapi: Partially implement SHGetShellKey. - shlwapi: Implement SKGetValueW over SHGetShellKey. - shlwapi/tests: Fix some test failures on RTL enabled boxes. - -Octavian Voicu (1): - mmdevapi/tests: Prevent crash when GetMixFormat fails. - -Owen Rudge (7): - fusion: Install assemblies into correct directory for architecture. - fusion: Implement IAssemblyNameImpl_GetDisplayName more completely. - d3dx9/tests: Add beginning of general tests for texture functions. - d3dx9: Implement D3DXCheckTextureRequirements. - d3dx9/tests: Implement additional texture requirement tests. - d3dx9: Implement D3DXCreateTexture plus tests. - d3dx9: Add basic implementation of D3DXFilterTexture, plus tests. - -Paul Chitescu (4): - t2embed: Forward several stdcall-decorated names to existing undecorated stubs. - kernel32: Declare structures related to logical processor information (core, cache, node, group). - kernel32: Declare and add stubs for GetLogicalProcessorInformation(Ex). - d3dx9_36: Provide an empty error message in the stub D3DXCompileShader. - -Paul Vriens (19): - comctl32: Add the Serbian (Latin) translation. - msi: Add the Serbian (Latin) translation. - atl/tests: Skip tests if function is not implemented. - msi: Add the Serbian (Cyrillic) translation. - comctl32: Add the Serbian (Cyrillic) translation. - appwiz.cpl: Add the Serbian (Latin) translation. - comctl32: Use the Cyrillic 'O' in the Serbian translation. - appwiz.cpl: Add the Serbian (Cyrillic) translation. - comdlg32: Add the Serbian (Latin) translation. - shlwapi/tests: Load shell32 explicitly. - shell32: Add the Serbian (Latin) translation. - user32: Add the Serbian (Latin) translation. - winhlp32: Add the Serbian (Latin) translation. - shell32: Fix the Serbian (Latin) translation. - shell32: Add the Serbian (Cyrillic) translation. - user32: Add the Serbian (Cyrillic) translation. - winecfg: Add the Serbian (Latin) translation. - msxml3: Ignore a property. - setupapi: Add a stub for SetupDiLoadClassIcon. - -Peter Urbanec (1): - wintab32: Avoid NULL pointer dereferences. - -Piotr Caban (23): - msxml3: Correctly allocate namespaces stack in saxreader. - msxml3: Improve QName_from_xmlChar implementation. - msxml3: Improve bstr_from_xmlCharN implementation. - wininet: Fix reporting errors in callbacks. - wininet: Delete authorization data on unsucessful login. - wininet: Cache non basic authorization data. - wininet: Don't report error in read_gzip_data when to much data was cached. - wininet: Allow HTTPREQ_ReadFileEx read more then one data chunk. - msvcp90: Added stub dll. - msvcp90: Added char_traits implementation. - msvcp90: Added char_traits implementation. - msvcp90: Added char_traits implementation. - msvcp90/tests: Added char_traits assign tests. - msvcp90/tests: Added char_traits equal tests. - msvcp90/tests: Added char_traits::_Copy_s tests. - shlwapi: Improved UrlCanonicalizeW implementation. - msvcrt: Fixed strtod_l/wcstod_l implementation. - msvcp90: Added allocator implementation. - atl: Improved AtlInternalQueryInterface implementation. - wininet: Fixed CreateUrlCacheEntryA implementation. - wininet: Commit URL cache entry when cache file is closed. - msvcp90: Correctly declare pointers to delete/new functions. - msvcp90: Added 64-bit exports. - -Reece Dunn (1): - ntdll/tests: check io.Status in the file tests. - -Rico Schüller (8): - wined3d: Add GL_NV_point_sprite extension. - d3d10: Move some helper funcs to utils. - d3d10: Add data and size check to parse_dxbc(). - d3d10: Add the ID3D10ShaderReflectionType interface. - d3d10: Add the ID3D10ShaderReflectionVariable interface. - d3d10: Add the ID3D10ShaderReflectionConstantBuffer interface. - d3d10: Add the ID3D10ShaderReflection interface. - d3d10: Add a stub ID3D10ReflectShader implementation. - -Seth Shelnutt (1): - wined3d: Nvidia Geforce 8400 and 8500 are now reported as 8400GS instead of 8300GS. - -Stefan Dösinger (16): - d3d9: Remove the fog vs sRGB test. - d3d9: Win7+Nvidia returns c2 in COISSUE'd CND. - d3d9: Use a vertex shader for the nested loop test. - d3d9: Use a vertex shader in the vFace test. - d3d9: Use a vertex shader in the vpos test. - wined3d: Only perform sRGB write correction on formats that advertise it. - wined3d: Check the writemask before activating the oC0 optimization. - d3d9: Remove the shader version varying tests. - wined3d: Use powf instead of pow. - wined3d: Use a int for the mantissa in float_24_to_32. - wined3d: Fix an msvc anachronism warning. - wined3d: Add casts for int to float conversions. - wined3d: The ARB loop unroller's iteration is unsigned. - wined3d: The flag parameter in shader_hw_sample is a WORD. - wined3d: Make glClearColor parameters floats. - wined3d: Use the correct type in device_unit_free_for_vs. - -Sven Baars (3): - kernel32: Update the Dutch translation. - user32: Fix the Dutch translation. - shdocvw: Add the Dutch translation. - -Thomas Mullaly (33): - urlmon: Implemented functionality for retrieving the RAW_URI property of a IUri. - include: Updated the URL_SCHEME enum. - urlmon: Added a scheme name parser for the IUri interface. - urlmon: Added a parser function to determine the scheme type of a URI. - urlmon: Added a canonicalization function for the scheme of a URI. - urlmon: Implemented functionality for retrieving the scheme name of a IUri. - urlmon: Implemented functionality for retrieving the scheme type of a IUri. - urlmon/tests: Added more test data for scheme parsing and canonicalization. - urlmon: Fixed the scheme name parser to handle wildcard schemes. - urlmon: Added a stub implementation for parsing the hier-part of a URI. - urlmon: Implemented parser for the userinfo of a URI. - urlmon: Implemented the canonicalization routine for the userinfo of a URI. - urlmon/tests: Added more test URI's. - urlmon: Implemented IUri_GetUserInfo. - urlmon: Implemented IUri_GetUserName. - urlmon: Implemented IUri_GetPassword. - urlmon: Implemented a parser for IPv4 addresses. - urlmon: Implemented canonicalization functions for IPv4 addresses. - urlmon/tests: Added more test URIs. - urlmon: Partially implemented IUri_GetHost. - urlmon: Added parser for IPv6 addresses. - urlmon: Added parser for IPvFuture addresses. - urlmon: Added parser for registered host names. - urlmon/tests: Added more URI test cases. - urlmon: Implemented canonicalization for IPv6 addresses. - urlmon/tests: Added more test URIs for IPv6 canonicalization. - urlmon: Implemented canonicalization for reg-names. - urlmon: Fixed a bug that would cause tests to randomly fail. - urlmon: Implemented a port parse for URIs. - urlmon/tests: Restructured invalid URI tests plus added more test data. - urlmon: Implemented canonicalization for ports in URIs. - urlmon: Implemented IUri_GetPort. - urlmon/tests: Added some more test URIs. - -Tim Cadogan-Cowper (1): - winmm: Wrap TRACE strings with debugstr_a/debugstr_an. - -Travis Athougies (1): - wpp: Fixed bug in preventing add_text_to_macro from handling macros over 1 kb large. - -Vincent Povirk (17): - windowscodecs: Ignore the length field of RLE compressed bitmaps. - oleaut32: Add test for dibs vs. ddbs in IPicture. - user32: Don't dump structures of some ambiguous listview messages. - shell32: Don't access szFullPath when SHGFI_PIDL is set in SHGetFileInfo. - ole32: Update storage header saving code based on the latest MS spec. - ole32: Don't map storage files in memory. - ole32: Remove the BigBlockFile abstraction and always use an ILockBytes. - ole32: Use ILockBytes_Stat to get the filename of a storage. - ole32: Remove an unused variable. - ole32: Flush the ILockBytes object of a storage on commit and final release. - gdiplus: Stub GdipGetMetafileHeaderFromFile. - gdiplus: Stub GdipGetMetafileHeaderFromStream. - gdiplus: Return copies of fonts from GdipGetFontCollectionFamilyList. - gdiplus: Stub GdipGetPenCompoundCount. - gdiplus: Stub GdipMultiplyPenTransform. - wineboot: Query windows from all desktops when --end-session --kill is used. - wineboot: Don't abort shutdown if we have to terminate a process. - -Wade Gobel (2): - gdiplus: Fixed GdipFillClosedCurve2 and GdipFillClosedCurve2I in the cases that count <= 1. - gdiplus: Implemented GdipFillClosedCurve and GdipFillClosedCurveI. - -Yaron Shahrabani (2): - wine.desktop: Add Hebrew translation. - notepad: Add Persian translation. + include/mswsock: Add WS_ prefix if necessary. + ws2_32/tests: Test ConnectEx. + ws2_32: Don't set FD_READ/FD_WRITE before the connection is complete. + ws2_32: Create a wrapper for connect. + ws2_32: Implement ConnectEx. + ws2_32: Implement SO_UPDATE_CONNECT_CONTEXT. + ws2_32: Fix a bad pointer crash. + +Mikko Rasa (1): + crypt32: Only clear *pcbDecoded on error in CryptVerifyMessageSignature. + +Misha Koshelev (4): + d3dx9: Complete test for D3DXCreateSphere. + d3dx9: Add _D3DXMESH enumeration. + d3dx9: Add stub and tests for D3DXCreateMesh. + d3dx9: Add tests for FVF <-> declaration conversion. + +Nikolay Sivov (25): + comctl32/monthcal: Rename button navigation helper to better reflect its purpose. + comctl32/monthcal: Fix navigation from last day in a month. + comctl32/monthcal: Add helper to jump to specified number of months. + comctl32/monthcal: Add support for month delta in button navigation. + comctl32/monthcal: Get rid of stored current selection date, it's always synced with lower bound. + comctl32/monthcal: No need to calculate month length on every iteration. + comctl32/monthcal: Erase week numbers rectangle before drawing new text. + comctl32/monthcal: Add some tests for post-V1 hittest fields. + comctl32/tests: Remove some noise from function names. + comctl32/monthcal: Support new hittest fields for some cases. + comctl32/monthcal: Properly adjust selections on scrolling. + comctl32/monthcal: Make month popup menu respect multiple calendars. + comctl32/monthcal: Properly scroll calendars on year change. + comctl32/monthcal: Remove macro used once. + comctl32/monthcal: Fix assumption about a single calendar for minimal rectangle calculation. + comctl32/monthcal: Store all control colors in a single array. + comctl32/monthcal: Use recently introduced enum in scroll buttons painting helper. + comctl32/listview: Fix infinite loop case for full item range as a first search range. + comctl32/tests: Use better names for test functions, discover some new test failures. + comctl32/tests: Use reduced IMAGELISTDRAWPARAMS structure size for tests. + comctl32/imagelist: Fix failure code for IImageList_Draw(). + comctl32/imagelist: Fix failure code for IImageList_Remove(). + comctl32/tests: More imagelist tests to show broken parameter validation. + comctl32/imagelist: Fail in ImageList_GetIconSize on null parameters. + comctl32/imagelist: Fail to create imagelist with zero or negative image dimensions. + +Oldřich Jedlička (3): + ddraw/tests: New CreateSurface for DDSCAPS_BACKBUFFER tests. + ddraw/tests: New attachment/flipping tests for back buffers. + ddraw/tests: Add test for bad size of surface caps in CreateSurface. + +Owen Rudge (11): + d3dx10: Add stub for d3dx10_43. + d3dx10: Add stub for d3dx10_42. + d3dx10: Add stub for d3dx10_41. + d3dx10: Add stub for d3dx10_40. + d3dx10: Add stub for d3dx10_39. + d3dx10: Add stub for d3dx10_38. + d3dx10: Add stub for d3dx10_37. + d3dx10: Add stub for d3dx10_36. + d3dx10: Add stub for d3dx10_35. + d3dx10: Add stub for d3dx10_34. + d3dx10: Add stub for d3dx10_33. + +Paul Vriens (1): + cmd: Add the Swedish translation. + +Piotr Caban (22): + msvcp90: Added char_traits 64-bit exports. + msvcp90: Added char_traits 64-bit exports. + msvcp90: Added char_traits 64-bit exports. + msvcp90: Added 64-bit char_traits tests. + msvcp90: Added allocator 64-bit exports. + msvcp90/tests: Added allocator tests. + msvcp90: Add exception throwing function. + msvcp90: Added bad_alloc exception. + msvcp90: Added allocator implementation. + msvcp90: Added allocator implementation. + msvcp90: Added allocator implementation. + msvcp90: Added basic_string constructor (with no arguments) implementation. + msvcp90: Added basic_string::npos. + msvcp90: Added basic_string::erase implementation. + msvcp90: Added some basic_string::assign implementations. + msvcp90: Added ~basic_string implementation. + msvcp90: Added basic_string copy constructor implementation. + msvcp90: Added basic_string constructor implementation (from cstr). + msvcp90: Added basic_string::c_str implementation. + msvcp90: Added logic_error exception. + msvcp90: Added _String_base::Xlen implementation. + msvcp90: Added _String_base::Xran implementation. + +Rico Schüller (7): + d3d10: Fix d3dcommon.h inclusion. + d3dcompiler: Implement D3DCreateBlob(). + d3dcompiler: Implement ID3DBlob::GetBufferPointer(). + d3dcompiler: Implement ID3DBlob::GetBufferSize(). + d3d10: Forward D3D10CreateBlob to d3dcompiler_43.dll. + d3dcompiler: Add D3DCreateBlob() declaration. + d3dcompiler: Add D3DCreateBlob() test. + +Roderick Colenbrander (1): + winex11: X11DRV_nores_SetCurrentMode return DISP_CHANGE_SUCCESSFUL when switching to the current mode. + +Stefan Dösinger (4): + wined3d: Add double to float conversion casts in device.c. + wined3d: Fix another DWORD to WORD conversion warning. + wined3d: Replace pow with powf in surface_base.c. + wined3d: MSVC fixes in state.c. + +Sven Baars (4): + shdocvw: Update the Dutch translation. + shdocvw: Update the Dutch translation. + mshtml: Update the Dutch translation. + shdocvw: Update the Dutch translation. + +Thomas Mullaly (36): + urlmon: Implemented IUri_GetHostType. + urlmon: Silenced a noisy fixme. + urlmon: Implemented IUri_GetAuthority. + urlmon: Implemented function for finding the domain name of a URI. + urlmon: Implemented IUri_GetDomain. + urlmon: Implemented a path parser for hierarchical URIs. + urlmon: Implemented a path parser for opaque URIs. + urlmon: Implemented canonicalization function for hierarchical URI paths. + urlmon: Implemented a function which removes dot segments from paths of hierarchical URIs. + urlmon: Implemented canonicalization function for paths in opaque URIs. + urlmon: Implemented IUri_GetPath. + urlmon: Implemented function to the file extension of a file in a URI path. + urlmon: Implemented IUri_GetExtension. + urlmon: Implemented a parser for URI query strings. + urlmon: Implemented canonicalization of query strings. + urlmon: Implemented IUri_GetQuery. + urlmon: Implemented IUri_GetPathAndQuery. + urlmon: Implemented a fragment parser. + urlmon: Implemented canonicalization for URI fragments. + urlmon: Implemented IUri_GetFragment. + urlmon: Implemented IUri_GetAbsoluteUri. + urlmon: Implemented IUri_GetDisplayUri. + urlmon: Implemented IUri_GetProperties and IUri_HasProperty. + urlmon: Added support for pre-processing URI strings. + urlmon: Added support for invalid flag combinations to CreateUri. + urlmon: Print fixme for unsupported flags to CreateUri. + urlmon: Implemented IUri_IsEqual. + urlmon: Added stub for CreateUriWithFragment. + urlmon/tests: Added testing suite for CreateUriWithFragment. + urlmon: Implemented CreateUriWithFragment. + urlmon: Added documentation for CreateUri and CreateUriWithFragment. + urlmon/tests: Added a few tests for CreateIUriBuilder. + urlmon/tests: Added tests for IUriBuilder_CreateUri. + urlmon/tests: Added tests for IUriBuilder_CreateUriSimple. + urlmon/tests: Added tests for IUriBuilder_CreateUriWithFlags. + urlmon/tests: Added tests for IUriBuilder_GetFragment. + +Tony Wasserka (3): + d3dx9: Move pixel sampling and recombination in copy_simple_data to separate helper functions. + d3dx9: Return D3DERR_INVALIDCALL in D3DXLoadSurfaceFromMemory if pDestRect is invalid. + d3dx9: Implement ARGB point filtering in D3DXLoadSurfaceFromMemory. + +Uwe Bonnes (1): + wininet: Add const qualifier after openssl version check. + +Vincent Povirk (18): + gdiplus: Stub GdipSetPenTransform. + gdiplus: Stub GdipRotatePenTransform. + gdiplus: Stub GdipGetPenTransform. + gdiplus: Stub GdipGetPathGradientPresetBlendCount. + gdiplus: Stub GdipMultiplyPathGradientTransform. + gdiplus: Don't require an HDC for the convert_unit function. + gdiplus: Don't require an HDC in get_graphics_bounds. + gdiplus: Give a nice warning when we try to draw to an HDC-less graphics. + gdiplus: Don't require an HDC to get the resolution of a graphics object. + gdiplus: Create HBITMAP-less bitmap objects for exotic pixel formats. + gdiplus: Stub GdipSetPathGradientTransform. + gdiplus: Stub GdipRotatePathGradientTransform. + gdiplus: Stub GdipScalePathGradientTransform. + gdiplus: Stub GdipSetPathGradientLinearBlend. + gdiplus: Stub GdipGetPathGradientTransform. + gdiplus: Use the software method to draw HBITMAP-less bitmaps. + gdiplus: Add tests for the HDC's we get from bitmap objects. + gdiplus: Add a fallback method for getting HDC's from Graphics objects. + +Wolfgang Schwotzer (2): + ws2_32/tests: Only log threads which not terminated by themselves. + ws2_32: Initialize variable lsap_sel. + +Wolfram Sang (2): + user32: Check for valid pointer in CreateIconFromResource. + kernel32: Change fixme to trace in comm.c. + +Yaron Shahrabani (4): + wineboot: Added Hebrew translation. + clock: Added Hebrew translation. + regedit: Added Hebrew translation. + clock: Updated Hebrew translation. + +Łukasz Wojniłowicz (1): + shdocvw: Add the Polish translation. -- Alexandre Julliard diff -Nru wine1.3-1.3.0/configure wine1.3-1.3.1/configure --- wine1.3-1.3.0/configure 2010-07-30 18:43:56.000000000 +0100 +++ wine1.3-1.3.1/configure 2010-08-20 18:23:50.000000000 +0100 @@ -1,6 +1,6 @@ #! /bin/sh # Guess values for system-dependent variables and create Makefiles. -# Generated by GNU Autoconf 2.65 for Wine 1.3.0. +# Generated by GNU Autoconf 2.65 for Wine 1.3.1. # # Report bugs to . # @@ -552,8 +552,8 @@ # Identity of this package. PACKAGE_NAME='Wine' PACKAGE_TARNAME='wine' -PACKAGE_VERSION='1.3.0' -PACKAGE_STRING='Wine 1.3.0' +PACKAGE_VERSION='1.3.1' +PACKAGE_STRING='Wine 1.3.1' PACKAGE_BUGREPORT='wine-devel@winehq.org' PACKAGE_URL='http://www.winehq.org' @@ -1364,7 +1364,7 @@ # Omit some internal or obsolete options to make the list less imposing. # This message is too long to be a string in the A/UX 3.1 sh. cat <<_ACEOF -\`configure' configures Wine 1.3.0 to adapt to many kinds of systems. +\`configure' configures Wine 1.3.1 to adapt to many kinds of systems. Usage: $0 [OPTION]... [VAR=VALUE]... @@ -1433,7 +1433,7 @@ if test -n "$ac_init_help"; then case $ac_init_help in - short | recursive ) echo "Configuration of Wine 1.3.0:";; + short | recursive ) echo "Configuration of Wine 1.3.1:";; esac cat <<\_ACEOF @@ -1576,7 +1576,7 @@ test -n "$ac_init_help" && exit $ac_status if $ac_init_version; then cat <<\_ACEOF -Wine configure 1.3.0 +Wine configure 1.3.1 generated by GNU Autoconf 2.65 Copyright (C) 2009 Free Software Foundation, Inc. @@ -2096,7 +2096,7 @@ This file contains any messages produced by compilers while running configure, to aid debugging if configure makes a mistake. -It was created by Wine $as_me 1.3.0, which was +It was created by Wine $as_me 1.3.1, which was generated by GNU Autoconf 2.65. Invocation command line was $ $0 $@ @@ -7054,22 +7054,46 @@ if test "$CROSSCC" != "false" then - CROSSTEST_DISABLE="" - set x $CROSSCC - shift - target="" - while test $# -ge 1 - do - case "$1" in - *-gcc) target=`expr "$1" : '\(.*\)-gcc'` ;; - esac - shift - done - if test -n "$target" - then - CROSSTARGET="$target" + ac_save_CC="$CC" + CC="$CROSSCC" + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CROSSCC works" >&5 +$as_echo_n "checking whether $CROSSCC works... " >&6; } + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ - fi +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } + set x $CROSSCC + shift + target="" + while test $# -ge 1 + do + case "$1" in + *-gcc) target=`expr "$1" : '\(.*\)-gcc'` ;; + esac + shift + done + if test -n "$target" + then + CROSSTEST_DISABLE="" + CROSSTARGET="$target" + + fi +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + CC="$ac_save_CC" fi fi @@ -14139,9 +14163,9 @@ then wine_fn_append_rule ALL_MAKEFILE_DEPENDS \ "__builddeps__: $ac_file.$IMPLIBEXT -$ac_file.def: dlls/$ac_dir/$ac_dir.spec \$(WINEBUILD) +$ac_file.def: dlls/$ac_dir/$ac_dir.spec dlls/$ac_dir/Makefile \$(WINEBUILD) \$(WINEBUILD) \$(TARGETFLAGS)$ac_implibflags -w --def -o \$@ --export \$(SRCDIR)/dlls/$ac_dir/$ac_dir.spec -$ac_file.a: dlls/$ac_dir/$ac_dir.spec \$(WINEBUILD) +$ac_file.a: dlls/$ac_dir/$ac_dir.spec dlls/$ac_dir/Makefile \$(WINEBUILD) \$(WINEBUILD) \$(TARGETFLAGS)$ac_implibflags -w --implib -o \$@ --export \$(SRCDIR)/dlls/$ac_dir/$ac_dir.spec install-dev:: dlls/$ac_dir/Makefile __builddeps__ @cd dlls/$ac_dir && \$(MAKE) install-dev" @@ -14149,7 +14173,7 @@ then wine_fn_append_rule ALL_MAKEFILE_DEPENDS \ "__builddeps__: $ac_file.cross.a -$ac_file.cross.a: dlls/$ac_dir/$ac_dir.spec \$(WINEBUILD) +$ac_file.cross.a: dlls/$ac_dir/$ac_dir.spec dlls/$ac_dir/Makefile \$(WINEBUILD) \$(WINEBUILD) \$(CROSSTARGET:%=-b %)$ac_implibflags -w --implib -o \$@ --export \$(SRCDIR)/dlls/$ac_dir/$ac_dir.spec" fi @@ -14429,9 +14453,32 @@ wine_fn_config_test dlls/d3d8/tests d3d8_test wine_fn_config_dll d3d9 enable_d3d9 d3d9 wine_fn_config_test dlls/d3d9/tests d3d9_test +wine_fn_config_dll d3dcompiler_33 enable_d3dcompiler_33 +wine_fn_config_dll d3dcompiler_34 enable_d3dcompiler_34 +wine_fn_config_dll d3dcompiler_35 enable_d3dcompiler_35 +wine_fn_config_dll d3dcompiler_36 enable_d3dcompiler_36 +wine_fn_config_dll d3dcompiler_37 enable_d3dcompiler_37 +wine_fn_config_dll d3dcompiler_38 enable_d3dcompiler_38 +wine_fn_config_dll d3dcompiler_39 enable_d3dcompiler_39 +wine_fn_config_dll d3dcompiler_40 enable_d3dcompiler_40 +wine_fn_config_dll d3dcompiler_41 enable_d3dcompiler_41 +wine_fn_config_dll d3dcompiler_42 enable_d3dcompiler_42 +wine_fn_config_dll d3dcompiler_43 enable_d3dcompiler_43 d3dcompiler +wine_fn_config_test dlls/d3dcompiler_43/tests d3dcompiler_43_test wine_fn_config_dll d3dim enable_d3dim d3dim wine_fn_config_dll d3drm enable_d3drm d3drm wine_fn_config_test dlls/d3drm/tests d3drm_test +wine_fn_config_dll d3dx10_33 enable_d3dx10_33 +wine_fn_config_dll d3dx10_34 enable_d3dx10_34 +wine_fn_config_dll d3dx10_35 enable_d3dx10_35 +wine_fn_config_dll d3dx10_36 enable_d3dx10_36 +wine_fn_config_dll d3dx10_37 enable_d3dx10_37 +wine_fn_config_dll d3dx10_38 enable_d3dx10_38 +wine_fn_config_dll d3dx10_39 enable_d3dx10_39 +wine_fn_config_dll d3dx10_40 enable_d3dx10_40 +wine_fn_config_dll d3dx10_41 enable_d3dx10_41 +wine_fn_config_dll d3dx10_42 enable_d3dx10_42 +wine_fn_config_dll d3dx10_43 enable_d3dx10_43 wine_fn_config_dll d3dx9_24 enable_d3dx9_24 wine_fn_config_dll d3dx9_25 enable_d3dx9_25 wine_fn_config_dll d3dx9_26 enable_d3dx9_26 @@ -14472,6 +14519,7 @@ wine_fn_config_dll dmband enable_dmband wine_fn_config_dll dmcompos enable_dmcompos wine_fn_config_dll dmime enable_dmime +wine_fn_config_test dlls/dmime/tests dmime_test wine_fn_config_dll dmloader enable_dmloader wine_fn_config_test dlls/dmloader/tests dmloader_test wine_fn_config_dll dmscript enable_dmscript @@ -14502,12 +14550,15 @@ wine_fn_config_dll dxgi enable_dxgi dxgi wine_fn_config_test dlls/dxgi/tests dxgi_test wine_fn_config_lib dxguid +wine_fn_config_dll explorerframe enable_explorerframe +wine_fn_config_test dlls/explorerframe/tests explorerframe_test wine_fn_config_dll faultrep enable_faultrep wine_fn_config_dll fltlib enable_fltlib wine_fn_config_dll fusion enable_fusion wine_fn_config_test dlls/fusion/tests fusion_test wine_fn_config_dll fwpuclnt enable_fwpuclnt wine_fn_config_dll gameux enable_gameux +wine_fn_config_test dlls/gameux/tests gameux_test wine_fn_config_dll gdi.exe16 enable_win16 wine_fn_config_dll gdi32 enable_gdi32 gdi32 wine_fn_config_test dlls/gdi32/tests gdi32_test @@ -14870,6 +14921,7 @@ wine_fn_config_program hh enable_hh install wine_fn_config_program icinfo enable_icinfo install wine_fn_config_program iexplore enable_iexplore install +wine_fn_config_program ipconfig enable_ipconfig install wine_fn_config_program lodctr enable_lodctr install wine_fn_config_program mshta enable_mshta install wine_fn_config_program msiexec enable_msiexec installbin @@ -14881,6 +14933,7 @@ wine_fn_config_program progman enable_progman install wine_fn_config_program reg enable_reg install wine_fn_config_program regedit enable_regedit installbin +wine_fn_config_test programs/regedit/tests regedit.exe_test wine_fn_config_program regsvr32 enable_regsvr32 installbin wine_fn_config_program rpcss enable_rpcss install wine_fn_config_program rundll.exe16 enable_win16 install @@ -15451,7 +15504,7 @@ # report actual input values of CONFIG_FILES etc. instead of their # values after options handling. ac_log=" -This file was extended by Wine $as_me 1.3.0, which was +This file was extended by Wine $as_me 1.3.1, which was generated by GNU Autoconf 2.65. Invocation command line was CONFIG_FILES = $CONFIG_FILES @@ -15522,7 +15575,7 @@ cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`" ac_cs_version="\\ -Wine config.status 1.3.0 +Wine config.status 1.3.1 configured by $0, generated by GNU Autoconf 2.65, with options \\"\$ac_cs_config\\" diff -Nru wine1.3-1.3.0/configure.ac wine1.3-1.3.1/configure.ac --- wine1.3-1.3.0/configure.ac 2010-07-30 18:43:56.000000000 +0100 +++ wine1.3-1.3.1/configure.ac 2010-08-20 18:23:50.000000000 +0100 @@ -4,8 +4,8 @@ m4_define(WINE_VERSION,regexp(m4_include(VERSION),[version \([-.0-9A-Za-z]+\)],[\1])) -dnl autoconf versions before 2.59d don't handle multi-line subst variables correctly -AC_PREREQ(2.59d) +dnl autoconf versions before 2.62 don't handle source dir symlinks correctly +AC_PREREQ(2.62) AC_INIT([Wine],[WINE_VERSION],[wine-devel@winehq.org],[wine],[http://www.winehq.org]) AC_CONFIG_SRCDIR(server/atom.c) AC_CONFIG_HEADERS(include/config.h) @@ -838,21 +838,28 @@ WINE_CHECK_MINGW_PROG(CROSSCC,gcc,false) if test "$CROSSCC" != "false" then - CROSSTEST_DISABLE="" - set x $CROSSCC - shift - target="" - while test $# -ge 1 - do - case "$1" in - *-gcc) target=`expr "$1" : '\(.*\)-gcc'` ;; - esac - shift - done - if test -n "$target" - then - AC_SUBST(CROSSTARGET,"$target") - fi + ac_save_CC="$CC" + CC="$CROSSCC" + AC_MSG_CHECKING([whether $CROSSCC works]) + AC_COMPILE_IFELSE(AC_LANG_PROGRAM([]), + [AC_MSG_RESULT([yes]) + set x $CROSSCC + shift + target="" + while test $# -ge 1 + do + case "$1" in + *-gcc) target=`expr "$1" : '\(.*\)-gcc'` ;; + esac + shift + done + if test -n "$target" + then + CROSSTEST_DISABLE="" + AC_SUBST(CROSSTARGET,"$target") + fi], + [AC_MSG_RESULT([no])]) + CC="$ac_save_CC" fi fi @@ -2285,9 +2292,32 @@ WINE_CONFIG_TEST(dlls/d3d8/tests) WINE_CONFIG_DLL(d3d9,,[d3d9]) WINE_CONFIG_TEST(dlls/d3d9/tests) +WINE_CONFIG_DLL(d3dcompiler_33) +WINE_CONFIG_DLL(d3dcompiler_34) +WINE_CONFIG_DLL(d3dcompiler_35) +WINE_CONFIG_DLL(d3dcompiler_36) +WINE_CONFIG_DLL(d3dcompiler_37) +WINE_CONFIG_DLL(d3dcompiler_38) +WINE_CONFIG_DLL(d3dcompiler_39) +WINE_CONFIG_DLL(d3dcompiler_40) +WINE_CONFIG_DLL(d3dcompiler_41) +WINE_CONFIG_DLL(d3dcompiler_42) +WINE_CONFIG_DLL(d3dcompiler_43,,[d3dcompiler]) +WINE_CONFIG_TEST(dlls/d3dcompiler_43/tests) WINE_CONFIG_DLL(d3dim,,[d3dim]) WINE_CONFIG_DLL(d3drm,,[d3drm]) WINE_CONFIG_TEST(dlls/d3drm/tests) +WINE_CONFIG_DLL(d3dx10_33) +WINE_CONFIG_DLL(d3dx10_34) +WINE_CONFIG_DLL(d3dx10_35) +WINE_CONFIG_DLL(d3dx10_36) +WINE_CONFIG_DLL(d3dx10_37) +WINE_CONFIG_DLL(d3dx10_38) +WINE_CONFIG_DLL(d3dx10_39) +WINE_CONFIG_DLL(d3dx10_40) +WINE_CONFIG_DLL(d3dx10_41) +WINE_CONFIG_DLL(d3dx10_42) +WINE_CONFIG_DLL(d3dx10_43) WINE_CONFIG_DLL(d3dx9_24) WINE_CONFIG_DLL(d3dx9_25) WINE_CONFIG_DLL(d3dx9_26) @@ -2328,6 +2358,7 @@ WINE_CONFIG_DLL(dmband) WINE_CONFIG_DLL(dmcompos) WINE_CONFIG_DLL(dmime) +WINE_CONFIG_TEST(dlls/dmime/tests) WINE_CONFIG_DLL(dmloader) WINE_CONFIG_TEST(dlls/dmloader/tests) WINE_CONFIG_DLL(dmscript) @@ -2358,12 +2389,15 @@ WINE_CONFIG_DLL(dxgi,,[dxgi]) WINE_CONFIG_TEST(dlls/dxgi/tests) WINE_CONFIG_LIB(dxguid) +WINE_CONFIG_DLL(explorerframe) +WINE_CONFIG_TEST(dlls/explorerframe/tests) WINE_CONFIG_DLL(faultrep) WINE_CONFIG_DLL(fltlib) WINE_CONFIG_DLL(fusion) WINE_CONFIG_TEST(dlls/fusion/tests) WINE_CONFIG_DLL(fwpuclnt) WINE_CONFIG_DLL(gameux) +WINE_CONFIG_TEST(dlls/gameux/tests) WINE_CONFIG_DLL(gdi.exe16,enable_win16) WINE_CONFIG_DLL(gdi32,,[gdi32]) WINE_CONFIG_TEST(dlls/gdi32/tests) @@ -2726,6 +2760,7 @@ WINE_CONFIG_PROGRAM(hh,install) WINE_CONFIG_PROGRAM(icinfo,install) WINE_CONFIG_PROGRAM(iexplore,install) +WINE_CONFIG_PROGRAM(ipconfig,install) WINE_CONFIG_PROGRAM(lodctr,install) WINE_CONFIG_PROGRAM(mshta,install) WINE_CONFIG_PROGRAM(msiexec,installbin) @@ -2737,6 +2772,7 @@ WINE_CONFIG_PROGRAM(progman,install) WINE_CONFIG_PROGRAM(reg,install) WINE_CONFIG_PROGRAM(regedit,installbin) +WINE_CONFIG_TEST(programs/regedit/tests) WINE_CONFIG_PROGRAM(regsvr32,installbin) WINE_CONFIG_PROGRAM(rpcss,install) WINE_CONFIG_PROGRAM(rundll.exe16,install,enable_win16) diff -Nru wine1.3-1.3.0/debian/changelog wine1.3-1.3.1/debian/changelog --- wine1.3-1.3.0/debian/changelog 2010-08-17 11:37:53.000000000 +0100 +++ wine1.3-1.3.1/debian/changelog 2010-08-22 22:24:30.000000000 +0100 @@ -1,3 +1,18 @@ +wine1.3 (1.3.1-0ubuntu1) lucid; urgency=low + + * New upstream release + - Support for drag & drop between X11 and OLE. + - New ipconfig.exe builtin tool. + - Support for favorites in builtin Internet Explorer. + - Beginnings of a shell Explorer control. + - A number of DirectDraw code cleanups. + - Improvements to the calendar control. + - Various bug fixes. + * debian/copyright: winehq.org and 2010 + * Remove old config.sub and config.guess (newer one in tools folder) + + -- Scott Ritchie Sun, 22 Aug 2010 13:15:48 -0700 + wine1.3 (1.3.0-0ubuntu5) lucid; urgency=low * debian/control: build-depend on unixodbc-dev diff -Nru wine1.3-1.3.0/debian/copyright wine1.3-1.3.1/debian/copyright --- wine1.3-1.3.0/debian/copyright 2010-08-04 11:20:59.000000000 +0100 +++ wine1.3-1.3.1/debian/copyright 2010-08-22 22:24:30.000000000 +0100 @@ -2,10 +2,10 @@ taken over by Vincent Renardias, then by Andrew Lenharth, then by Ove Kaaven. This package is currently maintained by Scott Ritchie: scott@open-vote.org -The Wine homepage is http://www.winehq.com/ +The Wine homepage is http://www.winehq.org/ Download locations are listed in the ANNOUNCE file. -Copyright (c) 1993-2009 the Wine project authors (see the file AUTHORS +Copyright (c) 1993-2010 the Wine project authors (see the file AUTHORS for a complete list) Wine is free software; you can redistribute it and/or modify it under diff -Nru wine1.3-1.3.0/dlls/advapi32/crypt.c wine1.3-1.3.1/dlls/advapi32/crypt.c --- wine1.3-1.3.0/dlls/advapi32/crypt.c 2010-07-30 18:43:56.000000000 +0100 +++ wine1.3-1.3.1/dlls/advapi32/crypt.c 2010-08-20 18:23:50.000000000 +0100 @@ -725,7 +725,8 @@ SetLastError(ERROR_INVALID_HANDLE); return FALSE; } - if (!phHash || prov->dwMagic != MAGIC_CRYPTPROV) + if (!phHash || prov->dwMagic != MAGIC_CRYPTPROV || + (key && key->dwMagic != MAGIC_CRYPTKEY)) { SetLastError(ERROR_INVALID_PARAMETER); return FALSE; @@ -742,7 +743,7 @@ } hash->pProvider = prov; - + hash->dwMagic = MAGIC_CRYPTHASH; if (prov->pFuncs->pCPCreateHash(prov->hPrivate, Algid, key ? key->hPrivate : 0, 0, &hash->hPrivate)) { @@ -751,6 +752,7 @@ } /* CSP error! */ + hash->dwMagic = 0; CRYPT_Free(hash); *phHash = 0; return FALSE; @@ -783,7 +785,9 @@ TRACE("(0x%lx, 0x%lx, %d, %08x, %p, %p)\n", hKey, hHash, Final, dwFlags, pbData, pdwDataLen); - if (!key || !pbData || !pdwDataLen || !key->pProvider || key->pProvider->dwMagic != MAGIC_CRYPTPROV) + if (!key || !pbData || !pdwDataLen || + !key->pProvider || key->dwMagic != MAGIC_CRYPTKEY || + key->pProvider->dwMagic != MAGIC_CRYPTPROV) { SetLastError(ERROR_INVALID_PARAMETER); return FALSE; @@ -824,7 +828,7 @@ SetLastError(ERROR_INVALID_HANDLE); return FALSE; } - if (!phKey || prov->dwMagic != MAGIC_CRYPTPROV) + if (!phKey || prov->dwMagic != MAGIC_CRYPTPROV || hash->dwMagic != MAGIC_CRYPTHASH) { SetLastError(ERROR_INVALID_PARAMETER); return FALSE; @@ -836,6 +840,7 @@ } key->pProvider = prov; + key->dwMagic = MAGIC_CRYPTKEY; if (prov->pFuncs->pCPDeriveKey(prov->hPrivate, Algid, hash->hPrivate, dwFlags, &key->hPrivate)) { *phKey = (HCRYPTKEY)key; @@ -843,6 +848,7 @@ } /* CSP error! */ + key->dwMagic = 0; CRYPT_Free(key); *phKey = 0; return FALSE; @@ -874,7 +880,8 @@ return FALSE; } - if (!hash->pProvider || hash->pProvider->dwMagic != MAGIC_CRYPTPROV) + if (!hash->pProvider || hash->dwMagic != MAGIC_CRYPTHASH || + hash->pProvider->dwMagic != MAGIC_CRYPTPROV) { SetLastError(ERROR_INVALID_PARAMETER); return FALSE; @@ -882,6 +889,7 @@ prov = hash->pProvider; ret = prov->pFuncs->pCPDestroyHash(prov->hPrivate, hash->hPrivate); + hash->dwMagic = 0; CRYPT_Free(hash); return ret; } @@ -912,7 +920,8 @@ return FALSE; } - if (!key->pProvider || key->pProvider->dwMagic != MAGIC_CRYPTPROV) + if (!key->pProvider || key->dwMagic != MAGIC_CRYPTKEY || + key->pProvider->dwMagic != MAGIC_CRYPTPROV) { SetLastError(ERROR_INVALID_PARAMETER); return FALSE; @@ -920,6 +929,7 @@ prov = key->pProvider; ret = prov->pFuncs->pCPDestroyKey(prov->hPrivate, key->hPrivate); + key->dwMagic = 0; CRYPT_Free(key); return ret; } @@ -948,8 +958,8 @@ TRACE("(0x%lx, %p, %08x, %p)\n", hHash, pdwReserved, dwFlags, phHash); orghash = (PCRYPTHASH)hHash; - if (!orghash || pdwReserved || !phHash || !orghash->pProvider || - orghash->pProvider->dwMagic != MAGIC_CRYPTPROV) + if (!orghash || pdwReserved || !phHash || !orghash->pProvider || + orghash->dwMagic != MAGIC_CRYPTHASH || orghash->pProvider->dwMagic != MAGIC_CRYPTPROV) { SetLastError(ERROR_INVALID_PARAMETER); return FALSE; @@ -969,11 +979,13 @@ } newhash->pProvider = prov; + newhash->dwMagic = MAGIC_CRYPTHASH; if (prov->pFuncs->pCPDuplicateHash(prov->hPrivate, orghash->hPrivate, pdwReserved, dwFlags, &newhash->hPrivate)) { *phHash = (HCRYPTHASH)newhash; return TRUE; } + newhash->dwMagic = 0; CRYPT_Free(newhash); return FALSE; } @@ -1001,7 +1013,8 @@ TRACE("(0x%lx, %p, %08x, %p)\n", hKey, pdwReserved, dwFlags, phKey); orgkey = (PCRYPTKEY)hKey; - if (!orgkey || pdwReserved || !phKey || !orgkey->pProvider || + if (!orgkey || pdwReserved || !phKey || !orgkey->pProvider || + orgkey->dwMagic != MAGIC_CRYPTKEY || orgkey->pProvider->dwMagic != MAGIC_CRYPTPROV) { SetLastError(ERROR_INVALID_PARAMETER); @@ -1022,11 +1035,13 @@ } newkey->pProvider = prov; + newkey->dwMagic = MAGIC_CRYPTKEY; if (prov->pFuncs->pCPDuplicateKey(prov->hPrivate, orgkey->hPrivate, pdwReserved, dwFlags, &newkey->hPrivate)) { *phKey = (HCRYPTKEY)newkey; return TRUE; } + newkey->dwMagic = 0; CRYPT_Free(newkey); return FALSE; } @@ -1063,7 +1078,8 @@ TRACE("(0x%lx, 0x%lx, %d, %08x, %p, %p, %d)\n", hKey, hHash, Final, dwFlags, pbData, pdwDataLen, dwBufLen); - if (!key || !pdwDataLen || !key->pProvider || key->pProvider->dwMagic != MAGIC_CRYPTPROV) + if (!key || !pdwDataLen || !key->pProvider || + key->dwMagic != MAGIC_CRYPTKEY || key->pProvider->dwMagic != MAGIC_CRYPTPROV) { SetLastError(ERROR_INVALID_PARAMETER); return FALSE; @@ -1370,7 +1386,8 @@ TRACE("(0x%lx, 0x%lx, %d, %08x, %p, %p)\n", hKey, hExpKey, dwBlobType, dwFlags, pbData, pdwDataLen); - if (!key || !pdwDataLen || !key->pProvider || key->pProvider->dwMagic != MAGIC_CRYPTPROV) + if (!key || !pdwDataLen || !key->pProvider || + key->dwMagic != MAGIC_CRYPTKEY || key->pProvider->dwMagic != MAGIC_CRYPTPROV) { SetLastError(ERROR_INVALID_PARAMETER); return FALSE; @@ -1420,7 +1437,7 @@ } key->pProvider = prov; - + key->dwMagic = MAGIC_CRYPTKEY; if (prov->pFuncs->pCPGenKey(prov->hPrivate, Algid, dwFlags, &key->hPrivate)) { *phKey = (HCRYPTKEY)key; @@ -1428,6 +1445,7 @@ } /* CSP error! */ + key->dwMagic = 0; CRYPT_Free(key); return FALSE; } @@ -1566,7 +1584,8 @@ TRACE("(0x%lx, %d, %p, %p, %08x)\n", hHash, dwParam, pbData, pdwDataLen, dwFlags); - if (!hash || !pdwDataLen || !hash->pProvider || hash->pProvider->dwMagic != MAGIC_CRYPTPROV) + if (!hash || !pdwDataLen || !hash->pProvider || + hash->dwMagic != MAGIC_CRYPTHASH || hash->pProvider->dwMagic != MAGIC_CRYPTPROV) { SetLastError(ERROR_INVALID_PARAMETER); return FALSE; @@ -1604,7 +1623,8 @@ TRACE("(0x%lx, %d, %p, %p, %08x)\n", hKey, dwParam, pbData, pdwDataLen, dwFlags); - if (!key || !pdwDataLen || !key->pProvider || key->pProvider->dwMagic != MAGIC_CRYPTPROV) + if (!key || !pdwDataLen || !key->pProvider || + key->dwMagic != MAGIC_CRYPTKEY || key->pProvider->dwMagic != MAGIC_CRYPTPROV) { SetLastError(ERROR_INVALID_PARAMETER); return FALSE; @@ -1688,7 +1708,7 @@ } key->pProvider = prov; - + key->dwMagic = MAGIC_CRYPTKEY; if (prov->pFuncs->pCPGetUserKey(prov->hPrivate, dwKeySpec, &key->hPrivate)) { *phUserKey = (HCRYPTKEY)key; @@ -1696,6 +1716,7 @@ } /* CSP Error */ + key->dwMagic = 0; CRYPT_Free(key); *phUserKey = 0; return FALSE; @@ -1728,7 +1749,8 @@ SetLastError(ERROR_INVALID_HANDLE); return FALSE; } - if (!hash->pProvider || hash->pProvider->dwMagic != MAGIC_CRYPTPROV) + if (!hash->pProvider || hash->dwMagic != MAGIC_CRYPTHASH || + hash->pProvider->dwMagic != MAGIC_CRYPTPROV) { SetLastError(ERROR_INVALID_PARAMETER); return FALSE; @@ -1766,7 +1788,8 @@ return FALSE; } - if (!hash->pProvider || hash->pProvider->dwMagic != MAGIC_CRYPTPROV) + if (!hash->pProvider || hash->dwMagic != MAGIC_CRYPTHASH || + hash->pProvider->dwMagic != MAGIC_CRYPTPROV || key->dwMagic != MAGIC_CRYPTKEY) { SetLastError(ERROR_INVALID_PARAMETER); return FALSE; @@ -1801,7 +1824,9 @@ TRACE("(0x%lx, %p, %d, 0x%lx, %08x, %p)\n", hProv, pbData, dwDataLen, hPubKey, dwFlags, phKey); - if (!prov || !pbData || !dwDataLen || !phKey || prov->dwMagic != MAGIC_CRYPTPROV) + if (!prov || !pbData || !dwDataLen || !phKey || + prov->dwMagic != MAGIC_CRYPTPROV || + (pubkey && pubkey->dwMagic != MAGIC_CRYPTKEY)) { SetLastError(ERROR_INVALID_PARAMETER); return FALSE; @@ -1814,6 +1839,7 @@ } importkey->pProvider = prov; + importkey->dwMagic = MAGIC_CRYPTKEY; if (prov->pFuncs->pCPImportKey(prov->hPrivate, pbData, dwDataLen, pubkey ? pubkey->hPrivate : 0, dwFlags, &importkey->hPrivate)) { @@ -1821,6 +1847,7 @@ return TRUE; } + importkey->dwMagic = 0; CRYPT_Free(importkey); return FALSE; } @@ -1861,7 +1888,8 @@ SetLastError(ERROR_INVALID_HANDLE); return FALSE; } - if (!pdwSigLen || !hash->pProvider || hash->pProvider->dwMagic != MAGIC_CRYPTPROV) + if (!pdwSigLen || !hash->pProvider || hash->dwMagic != MAGIC_CRYPTHASH || + hash->pProvider->dwMagic != MAGIC_CRYPTPROV) { SetLastError(ERROR_INVALID_PARAMETER); return FALSE; @@ -1915,7 +1943,8 @@ TRACE("(0x%lx, %d, %p, %08x)\n", hHash, dwParam, pbData, dwFlags); - if (!hash || !pbData || !hash->pProvider || hash->pProvider->dwMagic != MAGIC_CRYPTPROV) + if (!hash || !pbData || !hash->pProvider || + hash->dwMagic != MAGIC_CRYPTHASH || hash->pProvider->dwMagic != MAGIC_CRYPTPROV) { SetLastError(ERROR_INVALID_PARAMETER); return FALSE; @@ -1948,7 +1977,8 @@ TRACE("(0x%lx, %d, %p, %08x)\n", hKey, dwParam, pbData, dwFlags); - if (!key || !pbData || !key->pProvider || key->pProvider->dwMagic != MAGIC_CRYPTPROV) + if (!key || !pbData || !key->pProvider || + key->dwMagic != MAGIC_CRYPTKEY || key->pProvider->dwMagic != MAGIC_CRYPTPROV) { SetLastError(ERROR_INVALID_PARAMETER); return FALSE; @@ -2184,7 +2214,7 @@ TRACE("(0x%lx, %p, %d, 0x%lx, %s, %08x)\n", hHash, pbSignature, dwSigLen, hPubKey, debugstr_w(sDescription), dwFlags); - if (!hash || !key || + if (!hash || !key || key->dwMagic != MAGIC_CRYPTKEY || hash->dwMagic != MAGIC_CRYPTHASH || !hash->pProvider || hash->pProvider->dwMagic != MAGIC_CRYPTPROV || !key->pProvider || key->pProvider->dwMagic != MAGIC_CRYPTPROV) { diff -Nru wine1.3-1.3.0/dlls/advapi32/crypt.h wine1.3-1.3.1/dlls/advapi32/crypt.h --- wine1.3-1.3.0/dlls/advapi32/crypt.h 2010-07-30 18:43:56.000000000 +0100 +++ wine1.3-1.3.1/dlls/advapi32/crypt.h 2010-08-20 18:23:50.000000000 +0100 @@ -57,6 +57,8 @@ } PROVFUNCS, *PPROVFUNCS; #define MAGIC_CRYPTPROV 0xA39E741F +#define MAGIC_CRYPTKEY 0xA39E741E +#define MAGIC_CRYPTHASH 0xA39E741D typedef struct tagCRYPTPROV { @@ -70,12 +72,14 @@ typedef struct tagCRYPTKEY { + DWORD dwMagic; PCRYPTPROV pProvider; HCRYPTKEY hPrivate; /*CSP's handle - Should not be given to application under any circumstances!*/ } CRYPTKEY, *PCRYPTKEY; typedef struct tagCRYPTHASH { + DWORD dwMagic; PCRYPTPROV pProvider; HCRYPTHASH hPrivate; /*CSP's handle - Should not be given to application under any circumstances!*/ } CRYPTHASH, *PCRYPTHASH; diff -Nru wine1.3-1.3.0/dlls/advapi32/tests/eventlog.c wine1.3-1.3.1/dlls/advapi32/tests/eventlog.c --- wine1.3-1.3.0/dlls/advapi32/tests/eventlog.c 2010-07-30 18:43:56.000000000 +0100 +++ wine1.3-1.3.1/dlls/advapi32/tests/eventlog.c 2010-08-20 18:23:50.000000000 +0100 @@ -633,7 +633,7 @@ HKEY key, eventkey; BOOL bret = FALSE; LONG lret; - int i; + DWORD i; /* First create our eventlog */ lret = RegOpenKeyA(HKEY_LOCAL_MACHINE, eventlogsvc, &key); @@ -711,7 +711,7 @@ DWORD sidsize, count; BOOL ret, sidavailable; BOOL on_vista = FALSE; /* Used to indicate Vista, W2K8 or Win7 */ - int i; + DWORD i; char *localcomputer = NULL; DWORD size; @@ -826,21 +826,24 @@ ret = ReportEvent(handle, read_write[i].evt_type, read_write[i].evt_cat, read_write[i].evt_id, run_sidtests ? user : NULL, read_write[i].evt_numstrings, 0, read_write[i].evt_strings, NULL); + ok(ret, "Expected ReportEvent success : %d\n", GetLastError()); count = 0xdeadbeef; + SetLastError(0xdeadbeef); ret = GetNumberOfEventLogRecords(handle, &count); - ok(ret, "Expected success\n"); + ok(ret, "Expected GetNumberOfEventLogRecords success : %d\n", GetLastError()); ok(count == (i + 1), "Expected %d records, got %d\n", i + 1, count); oldest = 0xdeadbeef; ret = GetOldestEventLogRecord(handle, &oldest); - ok(ret, "Expected success\n"); + ok(ret, "Expected GetOldestEventLogRecord success : %d\n", GetLastError()); ok(oldest == 1 || (oldest > 1 && oldest != 0xdeadbeef), /* Vista SP1+, W2K8 and Win7 */ "Expected oldest to be 1 or higher, got %d\n", oldest); if (oldest > 1 && oldest != 0xdeadbeef) on_vista = TRUE; + SetLastError(0xdeadbeef); if (i % 2) ret = CloseEventLog(handle); else @@ -1092,7 +1095,7 @@ BOOL bret; LONG lret; HKEY key; - int i; + DWORD i; char winesvc[MAX_PATH]; /* Delete the registry tree */ diff -Nru wine1.3-1.3.0/dlls/advpack/tests/advpack.c wine1.3-1.3.1/dlls/advpack/tests/advpack.c --- wine1.3-1.3.0/dlls/advpack/tests/advpack.c 2010-07-30 18:43:56.000000000 +0100 +++ wine1.3-1.3.1/dlls/advpack/tests/advpack.c 2010-08-20 18:23:50.000000000 +0100 @@ -130,7 +130,7 @@ HRESULT hr; HANDLE hn; CHAR currDir[MAX_PATH]; - int currDirLen; + UINT currDirLen; /* Native DelNode apparently does not support relative paths, so we use absolute paths for testing */ @@ -446,7 +446,7 @@ ok(hr == S_OK, "Expected S_OK, got %08x\n", hr); ok(!lstrcmpi(buffer, PROG_FILES_ROOT), "Expected %s, got %s\n", PROG_FILES_ROOT, buffer); - ok(size == lstrlenA(PROG_FILES_ROOT)+1, "Expected size %d, got %d\n", + ok(size == strlen(PROG_FILES_ROOT)+1, "Expected size %d, got %d\n", lstrlenA(PROG_FILES_ROOT)+1, size); memset(buffer, 'a', APP_PATH_LEN); @@ -457,7 +457,7 @@ ok(hr == S_OK, "Expected S_OK, got %08x\n", hr); ok(!lstrcmpi(buffer, PROG_FILES_ROOT), "Expected %s, got %s\n", PROG_FILES_ROOT, buffer); - ok(size == lstrlenA(PROG_FILES_ROOT)+1, "Expected size %d, got %d\n", + ok(size == strlen(PROG_FILES_ROOT)+1, "Expected size %d, got %d\n", lstrlenA(PROG_FILES_ROOT)+1, size); { @@ -473,7 +473,7 @@ ok(hr == S_OK, "Expected S_OK, got %08x\n", hr); ok(!lstrcmpi(buffer, drive), "Expected %s, got %s\n", drive, buffer); - ok(size == lstrlenA(drive)+1, "Expected size %d, got %d\n", + ok(size == strlen(drive)+1, "Expected size %d, got %d\n", lstrlenA(drive)+1, size); } @@ -531,7 +531,7 @@ ok(hr == S_OK, "Expected S_OK, got %08x\n", hr); ok(!lstrcmpi(buffer, PROG_FILES_ROOT), "Expected %s, got %s\n", PROG_FILES_ROOT, buffer); - ok(size == lstrlenA(PROG_FILES_ROOT)+1, "Expected size %d, got %d\n", + ok(size == strlen(PROG_FILES_ROOT)+1, "Expected size %d, got %d\n", lstrlenA(PROG_FILES_ROOT)+1, size); /* close the INF again */ diff -Nru wine1.3-1.3.0/dlls/atl/atl_ax.c wine1.3-1.3.1/dlls/atl/atl_ax.c --- wine1.3-1.3.0/dlls/atl/atl_ax.c 2010-07-30 18:43:56.000000000 +0100 +++ wine1.3-1.3.1/dlls/atl/atl_ax.c 2010-08-20 18:23:50.000000000 +0100 @@ -1053,6 +1053,9 @@ *ppUnkContainer = (IUnknown*) pUnkContainer; } + if(!hWnd) + return S_FALSE; + return hr; } diff -Nru wine1.3-1.3.0/dlls/atl/tests/atl_ax.c wine1.3-1.3.1/dlls/atl/tests/atl_ax.c --- wine1.3-1.3.0/dlls/atl/tests/atl_ax.c 2010-07-30 18:43:56.000000000 +0100 +++ wine1.3-1.3.1/dlls/atl/tests/atl_ax.c 2010-08-20 18:23:50.000000000 +0100 @@ -94,12 +94,10 @@ } hr = pAtlAxAttachControl(pObj, NULL, NULL); - todo_wine ok(hr == S_FALSE, "Expected AtlAxAttachControl to return S_FALSE, got 0x%08x\n", hr); pContainer = (IUnknown *)0xdeadbeef; hr = pAtlAxAttachControl(pObj, NULL, &pContainer); - todo_wine ok(hr == S_FALSE, "Expected AtlAxAttachControl to return S_FALSE, got 0x%08x\n", hr); ok(pContainer != (IUnknown *)0xdeadbeef && pContainer != NULL, diff -Nru wine1.3-1.3.0/dlls/browseui/browseui_main.c wine1.3-1.3.1/dlls/browseui/browseui_main.c --- wine1.3-1.3.0/dlls/browseui/browseui_main.c 2010-07-30 18:43:56.000000000 +0100 +++ wine1.3-1.3.1/dlls/browseui/browseui_main.c 2010-08-20 18:23:50.000000000 +0100 @@ -183,15 +183,28 @@ */ HRESULT WINAPI DllGetVersion(DLLVERSIONINFO *info) { - if (info->cbSize != sizeof(DLLVERSIONINFO)) FIXME("support DLLVERSIONINFO2\n"); - - /* this is what IE6 on Windows 98 reports */ - info->dwMajorVersion = 6; - info->dwMinorVersion = 0; - info->dwBuildNumber = 2600; - info->dwPlatformID = DLLVER_PLATFORM_WINDOWS; + if(info->cbSize == sizeof(DLLVERSIONINFO) || + info->cbSize == sizeof(DLLVERSIONINFO2)) + { + /* this is what IE6 on Windows 98 reports */ + info->dwMajorVersion = 6; + info->dwMinorVersion = 0; + info->dwBuildNumber = 2600; + info->dwPlatformID = DLLVER_PLATFORM_WINDOWS; + if(info->cbSize == sizeof(DLLVERSIONINFO2)) + { + DLLVERSIONINFO2 *info2 = (DLLVERSIONINFO2*) info; + info2->dwFlags = 0; + info2->ullVersion = MAKEDLLVERULL(info->dwMajorVersion, + info->dwMinorVersion, + info->dwBuildNumber, + 0); /* FIXME: correct hotfix number */ + } + return S_OK; + } - return NOERROR; + WARN("wrong DLLVERSIONINFO size from app.\n"); + return E_INVALIDARG; } /*********************************************************************** diff -Nru wine1.3-1.3.0/dlls/comctl32/comboex.c wine1.3-1.3.1/dlls/comctl32/comboex.c --- wine1.3-1.3.0/dlls/comctl32/comboex.c 2010-07-30 18:43:56.000000000 +0100 +++ wine1.3-1.3.1/dlls/comctl32/comboex.c 2010-08-20 18:23:50.000000000 +0100 @@ -758,7 +758,7 @@ return himlTemp; } -static BOOL COMBOEX_SetItemW (const COMBOEX_INFO *infoPtr, COMBOBOXEXITEMW *cit) +static BOOL COMBOEX_SetItemW (const COMBOEX_INFO *infoPtr, const COMBOBOXEXITEMW *cit) { INT_PTR index = cit->iItem; CBE_ITEMDATA *item; diff -Nru wine1.3-1.3.0/dlls/comctl32/datetime.c wine1.3-1.3.1/dlls/comctl32/datetime.c --- wine1.3-1.3.0/dlls/comctl32/datetime.c 2010-07-30 18:43:56.000000000 +0100 +++ wine1.3-1.3.1/dlls/comctl32/datetime.c 2010-08-20 18:23:50.000000000 +0100 @@ -1368,7 +1368,7 @@ static INT -DATETIME_GetText (DATETIME_INFO *infoPtr, INT count, LPWSTR dst) +DATETIME_GetText (const DATETIME_INFO *infoPtr, INT count, LPWSTR dst) { WCHAR buf[80]; int i; diff -Nru wine1.3-1.3.0/dlls/comctl32/header.c wine1.3-1.3.1/dlls/comctl32/header.c --- wine1.3-1.3.0/dlls/comctl32/header.c 2010-07-30 18:43:56.000000000 +0100 +++ wine1.3-1.3.1/dlls/comctl32/header.c 2010-08-20 18:23:50.000000000 +0100 @@ -1215,7 +1215,7 @@ /* Returns index of first duplicate 'value' from [0,to) range, or -1 if there isn't any */ -static INT has_duplicate(INT *array, INT to, INT value) +static INT has_duplicate(const INT *array, INT to, INT value) { INT i; for(i = 0; i < to; i++) @@ -1224,7 +1224,7 @@ } /* returns next available value from [0,max] not to duplicate in [0,to) */ -static INT get_nextvalue(INT *array, INT to, INT max) +static INT get_nextvalue(const INT *array, INT to, INT max) { INT i; for(i = 0; i < max; i++) diff -Nru wine1.3-1.3.0/dlls/comctl32/imagelist.c wine1.3-1.3.1/dlls/comctl32/imagelist.c --- wine1.3-1.3.0/dlls/comctl32/imagelist.c 2010-07-30 18:43:56.000000000 +0100 +++ wine1.3-1.3.1/dlls/comctl32/imagelist.c 2010-08-20 18:23:50.000000000 +0100 @@ -694,6 +694,8 @@ TRACE("(%d %d 0x%x %d %d)\n", cx, cy, flags, cInitial, cGrow); + if (cx <= 0 || cy <= 0) return NULL; + /* Create the IImageList interface for the image list */ if (FAILED(ImageListImpl_CreateInstance(NULL, &IID_IImageList, (void **)&himl))) return NULL; @@ -1726,15 +1728,13 @@ BOOL WINAPI ImageList_GetIconSize (HIMAGELIST himl, INT *cx, INT *cy) { - if (!is_valid(himl)) + if (!is_valid(himl) || !cx || !cy) return FALSE; if ((himl->cx <= 0) || (himl->cy <= 0)) return FALSE; - if (cx) - *cx = himl->cx; - if (cy) - *cy = himl->cy; + *cx = himl->cx; + *cy = himl->cy; return TRUE; } @@ -3298,11 +3298,8 @@ IMAGELISTDRAWPARAMS *pimldp) { HIMAGELIST This = (HIMAGELIST) iface; - HIMAGELIST old_himl = 0; - int ret = 0; - - if (!pimldp) - return E_FAIL; + HIMAGELIST old_himl; + int ret; /* As far as I can tell, Windows simply ignores the contents of pimldp->himl so we shall simulate the same */ @@ -3312,12 +3309,12 @@ ret = ImageList_DrawIndirect(pimldp); pimldp->himl = old_himl; - return ret ? S_OK : E_FAIL; + return ret ? S_OK : E_INVALIDARG; } static HRESULT WINAPI ImageListImpl_Remove(IImageList *iface, int i) { - return (ImageList_Remove((HIMAGELIST) iface, i) == 0) ? E_FAIL : S_OK; + return (ImageList_Remove((HIMAGELIST) iface, i) == 0) ? E_INVALIDARG : S_OK; } static HRESULT WINAPI ImageListImpl_GetIcon(IImageList *iface, int i, UINT flags, diff -Nru wine1.3-1.3.0/dlls/comctl32/listview.c wine1.3-1.3.1/dlls/comctl32/listview.c --- wine1.3-1.3.0/dlls/comctl32/listview.c 2010-07-30 18:43:56.000000000 +0100 +++ wine1.3-1.3.1/dlls/comctl32/listview.c 2010-08-20 18:23:50.000000000 +0100 @@ -474,20 +474,14 @@ * W: Unicode, T: ANSI/Unicode - function of isW */ -static inline BOOL is_textW(LPCWSTR text) +static inline BOOL is_text(LPCWSTR text) { return text != NULL && text != LPSTR_TEXTCALLBACKW; } -static inline BOOL is_textT(LPCWSTR text, BOOL isW) -{ - /* we can ignore isW since LPSTR_TEXTCALLBACKW == LPSTR_TEXTCALLBACKA */ - return is_textW(text); -} - static inline int textlenT(LPCWSTR text, BOOL isW) { - return !is_textT(text, isW) ? 0 : + return !is_text(text) ? 0 : isW ? lstrlenW(text) : lstrlenA((LPCSTR)text); } @@ -505,7 +499,7 @@ { LPWSTR wstr = (LPWSTR)text; - if (!isW && is_textT(text, isW)) + if (!isW && is_text(text)) { INT len = MultiByteToWideChar(CP_ACP, 0, (LPCSTR)text, -1, NULL, 0); wstr = Alloc(len * sizeof(WCHAR)); @@ -517,7 +511,7 @@ static inline void textfreeT(LPWSTR wstr, BOOL isW) { - if (!isW && is_textT(wstr, isW)) Free (wstr); + if (!isW && is_text(wstr)) Free (wstr); } /* @@ -530,7 +524,7 @@ if (src == LPSTR_TEXTCALLBACKW) { - if (is_textW(*dest)) Free(*dest); + if (is_text(*dest)) Free(*dest); *dest = LPSTR_TEXTCALLBACKW; } else @@ -946,7 +940,7 @@ UINT realNotifCode; LPWSTR pszTempBuf = NULL, savPszText = NULL; - if ((pdi->item.mask & LVIF_TEXT) && is_textT(pdi->item.pszText, isW)) + if ((pdi->item.mask & LVIF_TEXT) && is_text(pdi->item.pszText)) { convertToAnsi = (isW && infoPtr->notifyFormat == NFR_ANSI); convertToUnicode = (!isW && infoPtr->notifyFormat == NFR_UNICODE); @@ -1855,8 +1849,9 @@ } } - /* found something or second search completed with any result */ - if (nItem != -1 || endidx != infoPtr->nItemCount) + if ( nItem != -1 || /* found something */ + endidx != infoPtr->nItemCount || /* second search done */ + (startidx == 0 && endidx == infoPtr->nItemCount) /* full range for first search */ ) break; }; } @@ -2325,7 +2320,7 @@ /* we need the text in non owner draw mode */ assert(lpLVItem->mask & LVIF_TEXT); - if (is_textT(lpLVItem->pszText, TRUE)) + if (is_text(lpLVItem->pszText)) { HFONT hFont = infoPtr->hFont ? infoPtr->hFont : infoPtr->hDefaultFont; HDC hdc = GetDC(infoPtr->hwndSelf); @@ -3704,7 +3699,9 @@ * RETURN: * None. */ -static void LISTVIEW_MarqueeHighlight(LISTVIEW_INFO *infoPtr, LPPOINT coords_orig, LPPOINT coords_offs, LPPOINT offset, INT scroll) +static void LISTVIEW_MarqueeHighlight(LISTVIEW_INFO *infoPtr, const POINT *coords_orig, + const POINT *coords_offs, const POINT *offset, + INT scroll) { BOOL controlDown = FALSE; LVITEMW item; @@ -4318,7 +4315,7 @@ return FALSE; /* For efficiency, we transform the lpLVItem->pszText to Unicode here */ - if ((lpLVItem->mask & LVIF_TEXT) && is_textW(lpLVItem->pszText)) + if ((lpLVItem->mask & LVIF_TEXT) && is_text(lpLVItem->pszText)) { pszText = lpLVItem->pszText; lpLVItem->pszText = textdupTtoW(lpLVItem->pszText, isW); @@ -5307,7 +5304,7 @@ for (j = 0; j < DPA_GetPtrCount(hdpaSubItems); j++) { hdrItem = DPA_GetPtr(hdpaSubItems, j); - if (is_textW(hdrItem->pszText)) Free(hdrItem->pszText); + if (is_text(hdrItem->pszText)) Free(hdrItem->pszText); Free(hdrItem); } DPA_Destroy(hdpaSubItems); @@ -5449,7 +5446,7 @@ if (nSubItem > 0) { /* free string */ - if (is_textW(lpDelItem->hdr.pszText)) + if (is_text(lpDelItem->hdr.pszText)) Free(lpDelItem->hdr.pszText); /* free item */ @@ -5598,7 +5595,7 @@ for (i = 0; i < DPA_GetPtrCount(hdpaSubItems); i++) { hdrItem = DPA_GetPtr(hdpaSubItems, i); - if (is_textW(hdrItem->pszText)) Free(hdrItem->pszText); + if (is_text(hdrItem->pszText)) Free(hdrItem->pszText); Free(hdrItem); } DPA_Destroy(hdpaSubItems); @@ -6598,7 +6595,7 @@ /* Apps depend on calling back for text if it is NULL or LPSTR_TEXTCALLBACKW */ if ((lpLVItem->mask & LVIF_TEXT) && !(lpLVItem->mask & LVIF_NORECOMPUTE) && - !is_textW(pItemHdr->pszText)) + !is_text(pItemHdr->pszText)) { dispInfo.item.mask |= LVIF_TEXT; dispInfo.item.pszText = lpLVItem->pszText; @@ -6646,7 +6643,7 @@ else if (lpLVItem->mask & LVIF_TEXT) { /* if LVN_GETDISPINFO's disabled with LVIF_NORECOMPUTE return callback placeholder */ - if (isW || !is_textW(pItemHdr->pszText)) lpLVItem->pszText = pItemHdr->pszText; + if (isW || !is_text(pItemHdr->pszText)) lpLVItem->pszText = pItemHdr->pszText; else textcpynT(lpLVItem->pszText, isW, pItemHdr->pszText, TRUE, lpLVItem->cchTextMax); } @@ -7353,7 +7350,7 @@ SIZE stringSize; stringSize.cx = 0; - if (is_textT(lpszText, isW)) + if (is_text(lpszText)) { HFONT hFont = infoPtr->hFont ? infoPtr->hFont : infoPtr->hDefaultFont; HDC hdc = GetDC(infoPtr->hwndSelf); @@ -8677,7 +8674,7 @@ * SUCCESS : TRUE * FAILURE : FALSE */ -static BOOL LISTVIEW_SetItemPosition(LISTVIEW_INFO *infoPtr, INT nItem, POINT *pt) +static BOOL LISTVIEW_SetItemPosition(LISTVIEW_INFO *infoPtr, INT nItem, const POINT *pt) { POINT Origin, Pt; diff -Nru wine1.3-1.3.0/dlls/comctl32/monthcal.c wine1.3-1.3.1/dlls/comctl32/monthcal.c --- wine1.3-1.3.0/dlls/comctl32/monthcal.c 2010-07-30 18:43:56.000000000 +0100 +++ wine1.3-1.3.1/dlls/comctl32/monthcal.c 2010-08-20 18:23:50.000000000 +0100 @@ -94,12 +94,9 @@ { HWND hwndSelf; DWORD dwStyle; /* cached GWL_STYLE */ - COLORREF bk; - COLORREF txt; - COLORREF titlebk; - COLORREF titletxt; - COLORREF monthbk; - COLORREF trailingtxt; + + COLORREF colors[MCSC_TRAILINGTEXT+1]; + HFONT hFont; HFONT hBoldFont; int textHeight; @@ -122,9 +119,8 @@ int status; /* See MC_SEL flags */ SYSTEMTIME firstSel; /* first selected day */ INT maxSelCount; - SYSTEMTIME minSel; + SYSTEMTIME minSel; /* contains single selection when used without MCS_MULTISELECT */ SYSTEMTIME maxSel; - SYSTEMTIME curSel; /* contains currently selected year, month and day */ SYSTEMTIME focusedSel; /* date currently focused with mouse movement */ DWORD rangeValid; SYSTEMTIME minDate; @@ -150,8 +146,12 @@ static const SYSTEMTIME max_allowed_date = { .wYear = 9999, .wMonth = 12, .wDay = 31 }; static const SYSTEMTIME min_allowed_date = { .wYear = 1752, .wMonth = 9, .wDay = 14 }; - -#define MONTHCAL_GetInfoPtr(hwnd) ((MONTHCAL_INFO *)GetWindowLongPtrW(hwnd, 0)) +/* Prev/Next buttons */ +enum nav_direction +{ + DIRECTION_BACKWARD, + DIRECTION_FORWARD +}; /* helper functions */ @@ -449,26 +449,29 @@ return st.wDayOfWeek; } +/* add/substract 'months' from date */ +static inline void MONTHCAL_GetMonth(SYSTEMTIME *date, INT months) +{ + INT length, m = date->wMonth + months; + + date->wYear += m > 0 ? (m - 1) / 12 : m / 12 - 1; + date->wMonth = m > 0 ? (m - 1) % 12 + 1 : 12 + m % 12; + /* fix moving from last day in a month */ + length = MONTHCAL_MonthLength(date->wMonth, date->wYear); + if(date->wDay > length) date->wDay = length; + MONTHCAL_CalculateDayOfWeek(date, TRUE); +} + /* properly updates date to point on next month */ static inline void MONTHCAL_GetNextMonth(SYSTEMTIME *date) { - if(++date->wMonth > 12) - { - date->wMonth = 1; - date->wYear++; - } - MONTHCAL_CalculateDayOfWeek(date, TRUE); + return MONTHCAL_GetMonth(date, 1); } /* properly updates date to point on prev month */ static inline void MONTHCAL_GetPrevMonth(SYSTEMTIME *date) { - if(--date->wMonth < 1) - { - date->wMonth = 12; - date->wYear--; - } - MONTHCAL_CalculateDayOfWeek(date, TRUE); + return MONTHCAL_GetMonth(date, -1); } /* Returns full date for a first currently visible day */ @@ -520,7 +523,7 @@ { int retval, firstDay; RECT rcClient; - SYSTEMTIME st = infoPtr->curSel; + SYSTEMTIME st = infoPtr->minSel; GetClientRect(infoPtr->hwndSelf, &rcClient); @@ -548,20 +551,20 @@ * [O] y : week column (zero based) */ static void MONTHCAL_CalcDayXY(const MONTHCAL_INFO *infoPtr, - const SYSTEMTIME *date, int *x, int *y) + const SYSTEMTIME *date, INT *x, INT *y) { - SYSTEMTIME st = infoPtr->curSel; + SYSTEMTIME st = infoPtr->minSel; LONG cmp; int first; st.wDay = 1; first = (MONTHCAL_CalculateDayOfWeek(&st, FALSE) + 6 - infoPtr->firstDay) % 7; - cmp = MONTHCAL_CompareMonths(date, &infoPtr->curSel); + cmp = MONTHCAL_CompareMonths(date, &infoPtr->minSel); /* previous month */ if(cmp == -1) { - *x = (first - MONTHCAL_MonthLength(date->wMonth, infoPtr->curSel.wYear) + date->wDay) % 7; + *x = (first - MONTHCAL_MonthLength(date->wMonth, infoPtr->minSel.wYear) + date->wDay) % 7; *y = 0; return; } @@ -569,7 +572,7 @@ /* next month calculation is same as for current, just add current month length */ if(cmp == 1) { - first += MONTHCAL_MonthLength(infoPtr->curSel.wMonth, infoPtr->curSel.wYear); + first += MONTHCAL_MonthLength(infoPtr->minSel.wMonth, infoPtr->minSel.wYear); } *x = (date->wDay + first) % 7; @@ -681,8 +684,8 @@ TRACE("%d %d %d\n", st->wDay, infoPtr->minSel.wDay, infoPtr->maxSel.wDay); TRACE("%s\n", wine_dbgstr_rect(&r)); - oldCol = SetTextColor(hdc, infoPtr->monthbk); - oldBk = SetBkColor(hdc, infoPtr->trailingtxt); + oldCol = SetTextColor(hdc, infoPtr->colors[MCSC_MONTHBK]); + oldBk = SetBkColor(hdc, infoPtr->colors[MCSC_TRAILINGTEXT]); hbr = GetSysColorBrush(COLOR_HIGHLIGHT); FillRect(hdc, &r, hbr); @@ -709,12 +712,12 @@ } -static void MONTHCAL_PaintButton(MONTHCAL_INFO *infoPtr, HDC hdc, BOOL btnNext) +static void MONTHCAL_PaintButton(MONTHCAL_INFO *infoPtr, HDC hdc, enum nav_direction button) { HTHEME theme = GetWindowTheme (infoPtr->hwndSelf); - RECT *r = btnNext ? &infoPtr->titlebtnnext : &infoPtr->titlebtnprev; - BOOL pressed = btnNext ? (infoPtr->status & MC_NEXTPRESSED) : - (infoPtr->status & MC_PREVPRESSED); + RECT *r = button == DIRECTION_FORWARD ? &infoPtr->titlebtnnext : &infoPtr->titlebtnprev; + BOOL pressed = button == DIRECTION_FORWARD ? infoPtr->status & MC_NEXTPRESSED : + infoPtr->status & MC_PREVPRESSED; if (theme) { static const int states[] = { @@ -723,7 +726,7 @@ /* Next button */ ABS_RIGHTNORMAL, ABS_RIGHTPRESSED, ABS_RIGHTDISABLED }; - int stateNum = btnNext ? 3 : 0; + int stateNum = button == DIRECTION_FORWARD ? 3 : 0; if (pressed) stateNum += 1; else @@ -734,7 +737,7 @@ } else { - int style = btnNext ? DFCS_SCROLLRIGHT : DFCS_SCROLLLEFT; + int style = button == DIRECTION_FORWARD ? DFCS_SCROLLRIGHT : DFCS_SCROLLLEFT; if (pressed) style |= DFCS_PUSHED; else @@ -750,24 +753,25 @@ { static const WCHAR fmt_monthW[] = { '%','s',' ','%','l','d',0 }; RECT *title = &infoPtr->calendars[calIdx].title; + const SYSTEMTIME *st = &infoPtr->calendars[calIdx].month; WCHAR buf_month[80], buf_fmt[80]; HBRUSH hbr; SIZE sz; /* fill header box */ - hbr = CreateSolidBrush(infoPtr->titlebk); + hbr = CreateSolidBrush(infoPtr->colors[MCSC_TITLEBK]); FillRect(hdc, title, hbr); DeleteObject(hbr); /* month/year string */ - SetBkColor(hdc, infoPtr->titlebk); - SetTextColor(hdc, infoPtr->titletxt); + SetBkColor(hdc, infoPtr->colors[MCSC_TITLEBK]); + SetTextColor(hdc, infoPtr->colors[MCSC_TITLETEXT]); SelectObject(hdc, infoPtr->hBoldFont); - GetLocaleInfoW(LOCALE_USER_DEFAULT, LOCALE_SMONTHNAME1+infoPtr->curSel.wMonth-1, + GetLocaleInfoW(LOCALE_USER_DEFAULT, LOCALE_SMONTHNAME1 + st->wMonth - 1, buf_month, countof(buf_month)); - wsprintfW(buf_fmt, fmt_monthW, buf_month, infoPtr->curSel.wYear); + wsprintfW(buf_fmt, fmt_monthW, buf_month, st->wYear); DrawTextW(hdc, buf_fmt, strlenW(buf_fmt), title, DT_CENTER | DT_VCENTER | DT_SINGLELINE); @@ -783,20 +787,22 @@ static void MONTHCAL_PaintWeeknumbers(const MONTHCAL_INFO *infoPtr, HDC hdc, const PAINTSTRUCT *ps, INT calIdx) { + const SYSTEMTIME *date = &infoPtr->calendars[calIdx].month; static const WCHAR fmt_weekW[] = { '%','d',0 }; INT mindays, weeknum, weeknum1, startofprescal; - SYSTEMTIME st = infoPtr->curSel; - RECT r; - WCHAR buf[80]; INT i, prev_month; + SYSTEMTIME st; + WCHAR buf[80]; + HBRUSH hbr; + RECT r; if (!(infoPtr->dwStyle & MCS_WEEKNUMBERS)) return; MONTHCAL_GetMinDate(infoPtr, &st); startofprescal = st.wDay; - st = infoPtr->curSel; + st = *date; - prev_month = infoPtr->curSel.wMonth - 1; + prev_month = date->wMonth - 1; if(prev_month == 0) prev_month = 12; /* @@ -823,7 +829,7 @@ mindays = 0; } - if (infoPtr->curSel.wMonth == 1) + if (date->wMonth == 1) { /* calculate all those exceptions for january */ st.wDay = st.wMonth = 1; @@ -834,7 +840,7 @@ { weeknum = 0; for(i = 0; i < 11; i++) - weeknum += MONTHCAL_MonthLength(i+1, infoPtr->curSel.wYear - 1); + weeknum += MONTHCAL_MonthLength(i+1, date->wYear - 1); weeknum += startofprescal + 7; weeknum /= 7; @@ -847,7 +853,7 @@ { weeknum = 0; for(i = 0; i < prev_month - 1; i++) - weeknum += MONTHCAL_MonthLength(i+1, infoPtr->curSel.wYear); + weeknum += MONTHCAL_MonthLength(i+1, date->wYear); weeknum += startofprescal + 7; weeknum /= 7; @@ -857,6 +863,13 @@ } r = infoPtr->calendars[calIdx].weeknums; + + /* erase whole week numbers area */ + hbr = CreateSolidBrush(infoPtr->colors[MCSC_MONTHBK]); + FillRect(hdc, &r, hbr); + DeleteObject(hbr); + + /* reduce rectangle to one week number */ r.bottom = r.top + infoPtr->height_increment; for(i = 0; i < 6; i++) { @@ -919,8 +932,8 @@ /* today mark + focus */ static void MONTHCAL_PaintFocusAndCircle(const MONTHCAL_INFO *infoPtr, HDC hdc, const PAINTSTRUCT *ps) { - if((infoPtr->curSel.wMonth == infoPtr->todaysDate.wMonth) && - (infoPtr->curSel.wYear == infoPtr->todaysDate.wYear) && + if((infoPtr->minSel.wMonth == infoPtr->todaysDate.wMonth) && + (infoPtr->minSel.wYear == infoPtr->todaysDate.wYear) && !(infoPtr->dwStyle & MCS_NOTODAYCIRCLE)) { MONTHCAL_CircleDay(infoPtr, hdc, &infoPtr->todaysDate); @@ -937,19 +950,20 @@ /* paint a calendar area */ static void MONTHCAL_PaintCalendar(const MONTHCAL_INFO *infoPtr, HDC hdc, const PAINTSTRUCT *ps, INT calIdx) { - INT prev_month, i, j; + const SYSTEMTIME *date = &infoPtr->calendars[calIdx].month; + INT prev_month, i, j, length; + RECT r, fill_bk_rect; + SYSTEMTIME st; WCHAR buf[80]; HBRUSH hbr; - RECT r, fill_bk_rect; int mask; - SYSTEMTIME st; /* fill whole days area - from week days area to today note rectangle */ fill_bk_rect = infoPtr->calendars[calIdx].wdays; fill_bk_rect.bottom = infoPtr->calendars[calIdx].days.bottom + (infoPtr->todayrect.bottom - infoPtr->todayrect.top); - hbr = CreateSolidBrush(infoPtr->monthbk); + hbr = CreateSolidBrush(infoPtr->colors[MCSC_MONTHBK]); FillRect(hdc, &fill_bk_rect, hbr); DeleteObject(hbr); @@ -959,7 +973,7 @@ LineTo(hdc, infoPtr->calendars[calIdx].days.right - 3, infoPtr->calendars[calIdx].title.bottom + infoPtr->textHeight + 1); - prev_month = infoPtr->curSel.wMonth - 1; + prev_month = date->wMonth - 1; if (prev_month == 0) prev_month = 12; infoPtr->calendars[calIdx].wdays.left = infoPtr->calendars[calIdx].days.left = @@ -967,8 +981,8 @@ /* 1. draw day abbreviations */ SelectObject(hdc, infoPtr->hFont); - SetBkColor(hdc, infoPtr->monthbk); - SetTextColor(hdc, infoPtr->trailingtxt); + SetBkColor(hdc, infoPtr->colors[MCSC_MONTHBK]); + SetTextColor(hdc, infoPtr->colors[MCSC_TRAILINGTEXT]); /* rectangle to draw a single day abbreviation within */ r = infoPtr->calendars[calIdx].wdays; r.right = r.left + infoPtr->width_increment; @@ -985,15 +999,16 @@ { SYSTEMTIME st_max; - SetTextColor(hdc, infoPtr->trailingtxt); + SetTextColor(hdc, infoPtr->colors[MCSC_TRAILINGTEXT]); /* draw prev month */ if (calIdx == 0) { MONTHCAL_GetMinDate(infoPtr, &st); mask = 1 << (st.wDay-1); + length = MONTHCAL_MonthLength(prev_month, date->wYear); - while(st.wDay <= MONTHCAL_MonthLength(prev_month, infoPtr->curSel.wYear)) + while(st.wDay <= length) { MONTHCAL_DrawDay(infoPtr, hdc, &st, infoPtr->monthdayState[0] & mask, ps); mask <<= 1; @@ -1004,7 +1019,7 @@ /* draw next month */ if (calIdx == infoPtr->cal_num - 1) { - st = infoPtr->curSel; + st = *date; st.wDay = 1; MONTHCAL_GetNextMonth(&st); MONTHCAL_GetMaxDate(infoPtr, &st_max); @@ -1020,11 +1035,13 @@ } /* 3. current month */ - SetTextColor(hdc, infoPtr->txt); - st = infoPtr->curSel; + SetTextColor(hdc, infoPtr->colors[MCSC_TEXT]); + st = *date; st.wDay = 1; mask = 1; - while(st.wDay <= MONTHCAL_MonthLength(infoPtr->curSel.wMonth, infoPtr->curSel.wYear)) { + length = MONTHCAL_MonthLength(date->wMonth, date->wYear); + while(st.wDay <= length) + { MONTHCAL_DrawDay(infoPtr, hdc, &st, infoPtr->monthdayState[1] & mask, ps); mask <<= 1; st.wDay++; @@ -1066,8 +1083,8 @@ MONTHCAL_PaintTodayTitle(infoPtr, hdc, ps); /* navigation buttons */ - MONTHCAL_PaintButton(infoPtr, hdc, FALSE); - MONTHCAL_PaintButton(infoPtr, hdc, TRUE); + MONTHCAL_PaintButton(infoPtr, hdc, DIRECTION_BACKWARD); + MONTHCAL_PaintButton(infoPtr, hdc, DIRECTION_FORWARD); /* restore context */ SetBkColor(hdc, old_bk_clr); @@ -1076,91 +1093,51 @@ } static LRESULT -MONTHCAL_GetMinReqRect(const MONTHCAL_INFO *infoPtr, LPRECT lpRect) +MONTHCAL_GetMinReqRect(const MONTHCAL_INFO *infoPtr, RECT *rect) { - TRACE("rect %p\n", lpRect); + TRACE("rect %p\n", rect); - if(!lpRect) return FALSE; + if(!rect) return FALSE; - lpRect->left = infoPtr->calendars[0].title.left; - lpRect->top = infoPtr->calendars[0].title.top; - lpRect->right = infoPtr->calendars[0].title.right; - lpRect->bottom = infoPtr->todayrect.bottom; + *rect = infoPtr->calendars[0].title; + rect->bottom = infoPtr->calendars[0].days.bottom + infoPtr->todayrect.bottom - + infoPtr->todayrect.top; - AdjustWindowRect(lpRect, infoPtr->dwStyle, FALSE); + AdjustWindowRect(rect, infoPtr->dwStyle, FALSE); /* minimal rectangle is zero based */ - OffsetRect(lpRect, -lpRect->left, -lpRect->top); + OffsetRect(rect, -rect->left, -rect->top); - TRACE("%s\n", wine_dbgstr_rect(lpRect)); + TRACE("%s\n", wine_dbgstr_rect(rect)); return TRUE; } - -static LRESULT -MONTHCAL_GetColor(const MONTHCAL_INFO *infoPtr, INT index) +static COLORREF +MONTHCAL_GetColor(const MONTHCAL_INFO *infoPtr, UINT index) { - TRACE("\n"); + TRACE("%p, %d\n", infoPtr, index); - switch(index) { - case MCSC_BACKGROUND: - return infoPtr->bk; - case MCSC_TEXT: - return infoPtr->txt; - case MCSC_TITLEBK: - return infoPtr->titlebk; - case MCSC_TITLETEXT: - return infoPtr->titletxt; - case MCSC_MONTHBK: - return infoPtr->monthbk; - case MCSC_TRAILINGTEXT: - return infoPtr->trailingtxt; - } - - return -1; + if (index > MCSC_TRAILINGTEXT) return -1; + return infoPtr->colors[index]; } - static LRESULT -MONTHCAL_SetColor(MONTHCAL_INFO *infoPtr, INT index, COLORREF color) +MONTHCAL_SetColor(MONTHCAL_INFO *infoPtr, UINT index, COLORREF color) { - COLORREF prev = -1; + COLORREF prev; - TRACE("%d: color %08x\n", index, color); + TRACE("%p, %d: color %08x\n", infoPtr, index, color); - switch(index) { - case MCSC_BACKGROUND: - prev = infoPtr->bk; - infoPtr->bk = color; - break; - case MCSC_TEXT: - prev = infoPtr->txt; - infoPtr->txt = color; - break; - case MCSC_TITLEBK: - prev = infoPtr->titlebk; - infoPtr->titlebk = color; - break; - case MCSC_TITLETEXT: - prev=infoPtr->titletxt; - infoPtr->titletxt = color; - break; - case MCSC_MONTHBK: - prev = infoPtr->monthbk; - infoPtr->monthbk = color; - break; - case MCSC_TRAILINGTEXT: - prev = infoPtr->trailingtxt; - infoPtr->trailingtxt = color; - break; - } + if (index > MCSC_TRAILINGTEXT) return -1; + + prev = infoPtr->colors[index]; + infoPtr->colors[index] = color; InvalidateRect(infoPtr->hwndSelf, NULL, index == MCSC_BACKGROUND ? TRUE : FALSE); return prev; } - static LRESULT MONTHCAL_GetMonthDelta(const MONTHCAL_INFO *infoPtr) { @@ -1399,7 +1376,7 @@ if(!curSel) return FALSE; if(infoPtr->dwStyle & MCS_MULTISELECT) return FALSE; - *curSel = infoPtr->curSel; + *curSel = infoPtr->minSel; TRACE("%d/%d/%d\n", curSel->wYear, curSel->wMonth, curSel->wDay); return TRUE; } @@ -1407,7 +1384,8 @@ static LRESULT MONTHCAL_SetCurSel(MONTHCAL_INFO *infoPtr, SYSTEMTIME *curSel) { - SYSTEMTIME prev = infoPtr->curSel; + SYSTEMTIME prev = infoPtr->minSel; + WORD day; TRACE("%p\n", curSel); if(!curSel) return FALSE; @@ -1415,21 +1393,23 @@ if(!MONTHCAL_ValidateDate(curSel)) return FALSE; /* exit earlier if selection equals current */ - if (MONTHCAL_IsDateEqual(&infoPtr->curSel, curSel)) return TRUE; + if (MONTHCAL_IsDateEqual(&infoPtr->minSel, curSel)) return TRUE; if(!MONTHCAL_IsDateInValidRange(infoPtr, curSel, FALSE)) return FALSE; + infoPtr->calendars[0].month = *curSel; infoPtr->minSel = *curSel; infoPtr->maxSel = *curSel; /* if selection is still in current month, reduce rectangle */ + day = prev.wDay; prev.wDay = curSel->wDay; if (MONTHCAL_IsDateEqual(&prev, curSel)) { RECT r_prev, r_new; - /* note that infoPtr->curSel isn't updated yet */ - MONTHCAL_CalcPosFromDay(infoPtr, &infoPtr->curSel, &r_prev); + prev.wDay = day; + MONTHCAL_CalcPosFromDay(infoPtr, &prev, &r_prev); MONTHCAL_CalcPosFromDay(infoPtr, curSel, &r_new); InvalidateRect(infoPtr->hwndSelf, &r_prev, FALSE); @@ -1438,9 +1418,6 @@ else InvalidateRect(infoPtr->hwndSelf, NULL, FALSE); - infoPtr->curSel = *curSel; - infoPtr->calendars[0].month = *curSel; - return TRUE; } @@ -1519,13 +1496,11 @@ infoPtr->minSel = range[1]; infoPtr->maxSel = range[0]; } - infoPtr->curSel = infoPtr->minSel; infoPtr->calendars[0].month = infoPtr->minSel; /* update day of week */ MONTHCAL_CalculateDayOfWeek(&infoPtr->minSel, TRUE); MONTHCAL_CalculateDayOfWeek(&infoPtr->maxSel, TRUE); - MONTHCAL_CalculateDayOfWeek(&infoPtr->curSel, TRUE); /* redraw if bounds changed */ /* FIXME: no actual need to redraw everything */ @@ -1612,10 +1587,22 @@ return -1; } +static inline UINT fill_hittest_info(const MCHITTESTINFO *src, MCHITTESTINFO *dest) +{ + dest->uHit = src->uHit; + dest->st = src->st; + + if (dest->cbSize == sizeof(MCHITTESTINFO)) + memcpy(&dest->rc, &src->rc, sizeof(MCHITTESTINFO) - MCHITTESTINFO_V1_SIZE); + + return src->uHit; +} + static LRESULT MONTHCAL_HitTest(const MONTHCAL_INFO *infoPtr, MCHITTESTINFO *lpht) { INT day, wday, wnum, calIdx; + MCHITTESTINFO htinfo; SYSTEMTIME ht_month; UINT x, y; @@ -1624,7 +1611,11 @@ x = lpht->pt.x; y = lpht->pt.y; - memset(&lpht->st, 0, sizeof(lpht->st)); + htinfo.st = st_null; + + /* we should preserve passed fields if hit area doesn't need them */ + if (lpht->cbSize == sizeof(MCHITTESTINFO)) + memcpy(&htinfo.rc, &lpht->rc, sizeof(MCHITTESTINFO) - MCHITTESTINFO_V1_SIZE); /* Comment in for debugging... TRACE("%d %d wd[%d %d %d %d] d[%d %d %d %d] t[%d %d %d %d] wn[%d %d %d %d]\n", x, y, @@ -1643,12 +1634,15 @@ if (calIdx == -1) { if (PtInRect(&infoPtr->todayrect, lpht->pt)) - lpht->uHit = MCHT_TODAYLINK; + { + htinfo.uHit = MCHT_TODAYLINK; + htinfo.rc = infoPtr->todayrect; + } else /* outside of calendar area? What's left must be background :-) */ - lpht->uHit = MCHT_CALENDARBK; + htinfo.uHit = MCHT_CALENDARBK; - return lpht->uHit; + return fill_hittest_info(&htinfo, lpht); } ht_month = infoPtr->calendars[calIdx].month; @@ -1659,85 +1653,101 @@ two calendars have buttons */ if (calIdx == 0 && PtInRect(&infoPtr->titlebtnprev, lpht->pt)) { - lpht->uHit = MCHT_TITLEBTNPREV; + htinfo.uHit = MCHT_TITLEBTNPREV; + htinfo.rc = infoPtr->titlebtnprev; } else if (PtInRect(&infoPtr->titlebtnnext, lpht->pt)) { - lpht->uHit = MCHT_TITLEBTNNEXT; + htinfo.uHit = MCHT_TITLEBTNNEXT; + htinfo.rc = infoPtr->titlebtnnext; } else if (PtInRect(&infoPtr->calendars[calIdx].titlemonth, lpht->pt)) { - lpht->uHit = MCHT_TITLEMONTH; + htinfo.uHit = MCHT_TITLEMONTH; + htinfo.rc = infoPtr->calendars[calIdx].titlemonth; + htinfo.iOffset = calIdx; } else if (PtInRect(&infoPtr->calendars[calIdx].titleyear, lpht->pt)) { - lpht->uHit = MCHT_TITLEYEAR; + htinfo.uHit = MCHT_TITLEYEAR; + htinfo.rc = infoPtr->calendars[calIdx].titleyear; + htinfo.iOffset = calIdx; } else - lpht->uHit = MCHT_TITLE; + { + htinfo.uHit = MCHT_TITLE; + htinfo.rc = infoPtr->calendars[calIdx].title; + htinfo.iOffset = calIdx; + } - return lpht->uHit; + return fill_hittest_info(&htinfo, lpht); } /* days area (including week days and week numbers */ day = MONTHCAL_CalcDayFromPos(infoPtr, x, y, &wday, &wnum); if (PtInRect(&infoPtr->calendars[calIdx].wdays, lpht->pt)) { - lpht->uHit = MCHT_CALENDARDAY; - lpht->st.wYear = ht_month.wYear; - lpht->st.wMonth = (day < 1) ? ht_month.wMonth -1 : ht_month.wMonth; - lpht->st.wDay = (day < 1) ? + htinfo.uHit = MCHT_CALENDARDAY; + htinfo.iOffset = calIdx; + htinfo.st.wYear = ht_month.wYear; + htinfo.st.wMonth = (day < 1) ? ht_month.wMonth -1 : ht_month.wMonth; + htinfo.st.wDay = (day < 1) ? MONTHCAL_MonthLength(ht_month.wMonth-1, ht_month.wYear) - day : day; + + MONTHCAL_CalcDayXY(infoPtr, &htinfo.st, &htinfo.iCol, &htinfo.iRow); } else if(PtInRect(&infoPtr->calendars[calIdx].weeknums, lpht->pt)) { - lpht->uHit = MCHT_CALENDARWEEKNUM; - lpht->st.wYear = ht_month.wYear; + htinfo.uHit = MCHT_CALENDARWEEKNUM; + htinfo.st.wYear = ht_month.wYear; + htinfo.iOffset = calIdx; - if (day < 1) { - lpht->st.wMonth = ht_month.wMonth - 1; + if (day < 1) + { + htinfo.st.wMonth = ht_month.wMonth - 1; + htinfo.st.wDay = MONTHCAL_MonthLength(ht_month.wMonth-1, ht_month.wYear) - day; } - else if (day > MONTHCAL_MonthLength(ht_month.wMonth, ht_month.wYear)) { - lpht->st.wMonth = ht_month.wMonth + 1; + else if (day > MONTHCAL_MonthLength(ht_month.wMonth, ht_month.wYear)) + { + htinfo.st.wMonth = ht_month.wMonth + 1; + htinfo.st.wDay = day - MONTHCAL_MonthLength(ht_month.wMonth, ht_month.wYear); } else - lpht->st.wMonth = ht_month.wMonth; - - if (day < 1) { - lpht->st.wDay = MONTHCAL_MonthLength(ht_month.wMonth-1, ht_month.wYear) - day; - } - else if (day > MONTHCAL_MonthLength(ht_month.wMonth, ht_month.wYear)) { - lpht->st.wDay = day - MONTHCAL_MonthLength(ht_month.wMonth, ht_month.wYear); + { + htinfo.st.wMonth = ht_month.wMonth; + htinfo.st.wDay = day; } - else - lpht->st.wDay = day; } else if(PtInRect(&infoPtr->calendars[calIdx].days, lpht->pt)) { - lpht->st.wYear = ht_month.wYear; - lpht->st.wMonth = ht_month.wMonth; + htinfo.iOffset = calIdx; + htinfo.st.wYear = ht_month.wYear; + htinfo.st.wMonth = ht_month.wMonth; if (day < 1) { - lpht->uHit = MCHT_CALENDARDATEPREV; - MONTHCAL_GetPrevMonth(&lpht->st); - lpht->st.wDay = MONTHCAL_MonthLength(lpht->st.wMonth, lpht->st.wYear) + day; + htinfo.uHit = MCHT_CALENDARDATEPREV; + MONTHCAL_GetPrevMonth(&htinfo.st); + htinfo.st.wDay = MONTHCAL_MonthLength(lpht->st.wMonth, lpht->st.wYear) + day; } else if (day > MONTHCAL_MonthLength(ht_month.wMonth, ht_month.wYear)) { - lpht->uHit = MCHT_CALENDARDATENEXT; - MONTHCAL_GetNextMonth(&lpht->st); - lpht->st.wDay = day - MONTHCAL_MonthLength(ht_month.wMonth, ht_month.wYear); + htinfo.uHit = MCHT_CALENDARDATENEXT; + MONTHCAL_GetNextMonth(&htinfo.st); + htinfo.st.wDay = day - MONTHCAL_MonthLength(ht_month.wMonth, ht_month.wYear); } - else { - lpht->uHit = MCHT_CALENDARDATE; - lpht->st.wDay = day; + else + { + htinfo.uHit = MCHT_CALENDARDATE; + htinfo.st.wDay = day; } + MONTHCAL_CalcDayXY(infoPtr, &htinfo.st, &htinfo.iCol, &htinfo.iRow); + MONTHCAL_CalcDayRect(infoPtr, &htinfo.rc, htinfo.iCol, htinfo.iRow); /* always update day of week */ - MONTHCAL_CalculateDayOfWeek(&lpht->st, TRUE); + MONTHCAL_CalculateDayOfWeek(&htinfo.st, TRUE); } - return lpht->uHit; + return fill_hittest_info(&htinfo, lpht); } /* MCN_GETDAYSTATE notification helper */ @@ -1753,8 +1763,8 @@ nmds.prgDayState = Alloc(infoPtr->monthRange * sizeof(MONTHDAYSTATE)); nmds.stStart = infoPtr->todaysDate; - nmds.stStart.wYear = infoPtr->curSel.wYear; - nmds.stStart.wMonth = infoPtr->curSel.wMonth; + nmds.stStart.wYear = infoPtr->minSel.wYear; + nmds.stStart.wMonth = infoPtr->minSel.wMonth; nmds.stStart.wDay = 1; SendMessageW(infoPtr->hwndNotify, WM_NOTIFY, nmds.nmhdr.idFrom, (LPARAM)&nmds); @@ -1764,41 +1774,62 @@ } } -static void MONTHCAL_GoToPrevNextMonth(MONTHCAL_INFO *infoPtr, BOOL prev) +/* no valid range check performed */ +static void MONTHCAL_Scroll(MONTHCAL_INFO *infoPtr, INT delta) { - SYSTEMTIME st = infoPtr->curSel; + INT i, selIdx = -1; - TRACE("%s\n", prev ? "prev" : "next"); - - if(prev) MONTHCAL_GetPrevMonth(&st); else MONTHCAL_GetNextMonth(&st); + for(i = 0; i < infoPtr->cal_num; i++) + { + /* save selection position to shift it later */ + if (selIdx == -1 && MONTHCAL_CompareMonths(&infoPtr->minSel, &infoPtr->calendars[i].month) == 0) + selIdx = i; - if(!MONTHCAL_IsDateInValidRange(infoPtr, &st, FALSE)) return; + MONTHCAL_GetMonth(&infoPtr->calendars[i].month, delta); + } + /* selection is always shifted to first calendar */ if(infoPtr->dwStyle & MCS_MULTISELECT) { SYSTEMTIME range[2]; - range[0] = infoPtr->minSel; - range[1] = infoPtr->maxSel; - - if(prev) - { - MONTHCAL_GetPrevMonth(&range[0]); - MONTHCAL_GetPrevMonth(&range[1]); - } - else - { - MONTHCAL_GetNextMonth(&range[0]); - MONTHCAL_GetNextMonth(&range[1]); - } - + MONTHCAL_GetSelRange(infoPtr, range); + MONTHCAL_GetMonth(&range[0], delta - selIdx); + MONTHCAL_GetMonth(&range[1], delta - selIdx); MONTHCAL_SetSelRange(infoPtr, range); } else + { + SYSTEMTIME st = infoPtr->minSel; + + MONTHCAL_GetMonth(&st, delta - selIdx); MONTHCAL_SetCurSel(infoPtr, &st); + } +} - MONTHCAL_NotifyDayState(infoPtr); +static void MONTHCAL_GoToMonth(MONTHCAL_INFO *infoPtr, enum nav_direction direction) +{ + INT delta = infoPtr->delta ? infoPtr->delta : infoPtr->cal_num; + SYSTEMTIME st; + + TRACE("%s\n", direction == DIRECTION_BACKWARD ? "back" : "fwd"); + /* check if change allowed by range set */ + if(direction == DIRECTION_BACKWARD) + { + st = infoPtr->calendars[0].month; + MONTHCAL_GetMonth(&st, -delta); + } + else + { + st = infoPtr->calendars[infoPtr->cal_num-1].month; + MONTHCAL_GetMonth(&st, delta); + } + + if(!MONTHCAL_IsDateInValidRange(infoPtr, &st, FALSE)) return; + + MONTHCAL_Scroll(infoPtr, direction == DIRECTION_BACKWARD ? -delta : delta); + MONTHCAL_NotifyDayState(infoPtr); MONTHCAL_NotifySelectionChange(infoPtr); } @@ -1823,7 +1854,6 @@ if( TrackPopupMenu(hMenu, TPM_RIGHTBUTTON | TPM_NONOTIFY | TPM_RETURNCMD, menupoint.x, menupoint.y, 0, infoPtr->hwndSelf, NULL)) { - infoPtr->curSel = infoPtr->todaysDate; infoPtr->calendars[0].month = infoPtr->todaysDate; infoPtr->minSel = infoPtr->todaysDate; infoPtr->maxSel = infoPtr->todaysDate; @@ -1881,12 +1911,15 @@ } /* creates updown control and edit box */ -static void MONTHCAL_EditYear(MONTHCAL_INFO *infoPtr) +static void MONTHCAL_EditYear(MONTHCAL_INFO *infoPtr, INT calIdx) { + RECT *rc = &infoPtr->calendars[calIdx].titleyear; + RECT *title = &infoPtr->calendars[calIdx].title; + infoPtr->hWndYearEdit = CreateWindowExW(0, WC_EDITW, 0, WS_VISIBLE | WS_CHILD | ES_READONLY, - infoPtr->calendars[0].titleyear.left + 3, infoPtr->titlebtnnext.top, - infoPtr->calendars[0].titleyear.right - infoPtr->calendars[0].titleyear.left + 4, + rc->left + 3, (title->bottom + title->top - infoPtr->textHeight) / 2, + rc->right - rc->left + 4, infoPtr->textHeight, infoPtr->hwndSelf, NULL, NULL, NULL); @@ -1895,7 +1928,7 @@ infoPtr->hWndYearUpDown = CreateWindowExW(0, UPDOWN_CLASSW, 0, WS_VISIBLE | WS_CHILD | UDS_SETBUDDYINT | UDS_NOTHOUSANDS | UDS_ARROWKEYS, - infoPtr->calendars[0].titleyear.right + 7, infoPtr->titlebtnnext.top, + rc->right + 7, (title->bottom + title->top - infoPtr->textHeight) / 2, 18, infoPtr->textHeight, infoPtr->hwndSelf, NULL, NULL, NULL); @@ -1903,7 +1936,7 @@ SendMessageW(infoPtr->hWndYearUpDown, UDM_SETRANGE, 0, MAKELONG(max_allowed_date.wYear, min_allowed_date.wYear)); SendMessageW(infoPtr->hWndYearUpDown, UDM_SETBUDDY, (WPARAM)infoPtr->hWndYearEdit, 0); - SendMessageW(infoPtr->hWndYearUpDown, UDM_SETPOS, 0, infoPtr->curSel.wYear); + SendMessageW(infoPtr->hWndYearUpDown, UDM_SETPOS, 0, infoPtr->calendars[calIdx].month.wYear); /* subclass edit box */ infoPtr->EditWndProc = (WNDPROC)SetWindowLongPtrW(infoPtr->hWndYearEdit, @@ -1939,14 +1972,14 @@ switch(hit) { case MCHT_TITLEBTNNEXT: - MONTHCAL_GoToPrevNextMonth(infoPtr, FALSE); + MONTHCAL_GoToMonth(infoPtr, DIRECTION_FORWARD); infoPtr->status = MC_NEXTPRESSED; SetTimer(infoPtr->hwndSelf, MC_PREVNEXTMONTHTIMER, MC_PREVNEXTMONTHDELAY, 0); InvalidateRect(infoPtr->hwndSelf, NULL, FALSE); return 0; case MCHT_TITLEBTNPREV: - MONTHCAL_GoToPrevNextMonth(infoPtr, TRUE); + MONTHCAL_GoToMonth(infoPtr, DIRECTION_BACKWARD); infoPtr->status = MC_PREVPRESSED; SetTimer(infoPtr->hwndSelf, MC_PREVNEXTMONTHTIMER, MC_PREVNEXTMONTHDELAY, 0); InvalidateRect(infoPtr->hwndSelf, NULL, FALSE); @@ -1970,22 +2003,33 @@ i = TrackPopupMenu(hMenu,TPM_LEFTALIGN | TPM_NONOTIFY | TPM_RIGHTBUTTON | TPM_RETURNCMD, menupoint.x, menupoint.y, 0, infoPtr->hwndSelf, NULL); - if ((i > 0) && (i < 13) && infoPtr->curSel.wMonth != i) + if ((i > 0) && (i < 13) && infoPtr->calendars[ht.iOffset].month.wMonth != i) { - infoPtr->curSel.wMonth = i; - MONTHCAL_IsDateInValidRange(infoPtr, &infoPtr->curSel, TRUE); - InvalidateRect(infoPtr->hwndSelf, NULL, FALSE); + INT delta = i - infoPtr->calendars[ht.iOffset].month.wMonth; + SYSTEMTIME st; + + /* check if change allowed by range set */ + st = delta < 0 ? infoPtr->calendars[0].month : + infoPtr->calendars[infoPtr->cal_num-1].month; + MONTHCAL_GetMonth(&st, delta); + + if (MONTHCAL_IsDateInValidRange(infoPtr, &st, FALSE)) + { + MONTHCAL_Scroll(infoPtr, delta); + MONTHCAL_NotifyDayState(infoPtr); + MONTHCAL_NotifySelectionChange(infoPtr); + InvalidateRect(infoPtr->hwndSelf, NULL, FALSE); + } } return 0; } case MCHT_TITLEYEAR: { - MONTHCAL_EditYear(infoPtr); + MONTHCAL_EditYear(infoPtr, ht.iOffset); return 0; } case MCHT_TODAYLINK: { - infoPtr->curSel = infoPtr->todaysDate; infoPtr->calendars[0].month = infoPtr->todaysDate; infoPtr->minSel = infoPtr->todaysDate; infoPtr->maxSel = infoPtr->todaysDate; @@ -2058,7 +2102,7 @@ if((hit & MCHT_CALENDARDATE) == MCHT_CALENDARDATE) { - SYSTEMTIME sel = infoPtr->curSel; + SYSTEMTIME sel = infoPtr->minSel; /* will be invalidated here */ MONTHCAL_SetCurSel(infoPtr, &ht.st); @@ -2081,8 +2125,8 @@ switch(id) { case MC_PREVNEXTMONTHTIMER: - if(infoPtr->status & MC_NEXTPRESSED) MONTHCAL_GoToPrevNextMonth(infoPtr, FALSE); - if(infoPtr->status & MC_PREVPRESSED) MONTHCAL_GoToPrevNextMonth(infoPtr, TRUE); + if(infoPtr->status & MC_NEXTPRESSED) MONTHCAL_GoToMonth(infoPtr, DIRECTION_FORWARD); + if(infoPtr->status & MC_PREVPRESSED) MONTHCAL_GoToMonth(infoPtr, DIRECTION_BACKWARD); InvalidateRect(infoPtr->hwndSelf, NULL, FALSE); break; case MC_TODAYUPDATETIMER: @@ -2199,7 +2243,7 @@ if (!GetClipBox(hdc, &rc)) return FALSE; /* fill background */ - hbr = CreateSolidBrush (infoPtr->bk); + hbr = CreateSolidBrush (infoPtr->colors[MCSC_BACKGROUND]); FillRect(hdc, &rc, hbr); DeleteObject(hbr); @@ -2374,8 +2418,6 @@ TRACE("(width=%d, height=%d)\n", Width, Height); MONTHCAL_UpdateSize(infoPtr); - - /* invalidate client area and erase background */ InvalidateRect(infoPtr->hwndSelf, NULL, TRUE); return 0; @@ -2489,16 +2531,15 @@ infoPtr->monthdayState = Alloc(infoPtr->monthRange * sizeof(MONTHDAYSTATE)); if (!infoPtr->monthdayState) goto fail; - infoPtr->titlebk = comctl32_color.clrActiveCaption; - infoPtr->titletxt = comctl32_color.clrWindow; - infoPtr->monthbk = comctl32_color.clrWindow; - infoPtr->trailingtxt = comctl32_color.clrGrayText; - infoPtr->bk = comctl32_color.clrWindow; - infoPtr->txt = comctl32_color.clrWindowText; + infoPtr->colors[MCSC_BACKGROUND] = comctl32_color.clrWindow; + infoPtr->colors[MCSC_TEXT] = comctl32_color.clrWindowText; + infoPtr->colors[MCSC_TITLEBK] = comctl32_color.clrActiveCaption; + infoPtr->colors[MCSC_TITLETEXT] = comctl32_color.clrWindow; + infoPtr->colors[MCSC_MONTHBK] = comctl32_color.clrWindow; + infoPtr->colors[MCSC_TRAILINGTEXT] = comctl32_color.clrGrayText; infoPtr->minSel = infoPtr->todaysDate; infoPtr->maxSel = infoPtr->todaysDate; - infoPtr->curSel = infoPtr->todaysDate; infoPtr->calendars[0].month = infoPtr->todaysDate; infoPtr->isUnicode = TRUE; @@ -2545,16 +2586,12 @@ { NMUPDOWN *nmud = (NMUPDOWN*)hdr; - if (hdr->hwndFrom == infoPtr->hWndYearUpDown) + if (hdr->hwndFrom == infoPtr->hWndYearUpDown && nmud->iDelta) { /* year value limits are set up explicitly after updown creation */ - if ((nmud->iDelta + nmud->iPos) != infoPtr->curSel.wYear) - { - SYSTEMTIME new_date = infoPtr->curSel; - - new_date.wYear = nmud->iDelta + nmud->iPos; - MONTHCAL_SetCurSel(infoPtr, &new_date); - } + MONTHCAL_Scroll(infoPtr, 12 * nmud->iDelta); + MONTHCAL_NotifyDayState(infoPtr); + MONTHCAL_NotifySelectionChange(infoPtr); } } return 0; @@ -2577,11 +2614,10 @@ static LRESULT WINAPI MONTHCAL_WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) { - MONTHCAL_INFO *infoPtr; + MONTHCAL_INFO *infoPtr = (MONTHCAL_INFO *)GetWindowLongPtrW(hwnd, 0); TRACE("hwnd=%p msg=%x wparam=%lx lparam=%lx\n", hwnd, uMsg, wParam, lParam); - infoPtr = MONTHCAL_GetInfoPtr(hwnd); if (!infoPtr && (uMsg != WM_CREATE)) return DefWindowProcW(hwnd, uMsg, wParam, lParam); switch(uMsg) diff -Nru wine1.3-1.3.0/dlls/comctl32/rebar.c wine1.3-1.3.1/dlls/comctl32/rebar.c --- wine1.3-1.3.0/dlls/comctl32/rebar.c 2010-07-30 18:43:56.000000000 +0100 +++ wine1.3-1.3.1/dlls/comctl32/rebar.c 2010-08-20 18:23:50.000000000 +0100 @@ -2397,7 +2397,7 @@ static LRESULT -REBAR_InsertBandT(REBAR_INFO *infoPtr, INT iIndex, LPREBARBANDINFOW lprbbi, BOOL bUnicode) +REBAR_InsertBandT(REBAR_INFO *infoPtr, INT iIndex, const REBARBANDINFOW *lprbbi, BOOL bUnicode) { REBAR_BAND *lpBand; @@ -2613,7 +2613,7 @@ } static LRESULT -REBAR_SetBandInfoT(REBAR_INFO *infoPtr, INT iBand, LPREBARBANDINFOW lprbbi, BOOL bUnicode) +REBAR_SetBandInfoT(REBAR_INFO *infoPtr, INT iBand, const REBARBANDINFOW *lprbbi, BOOL bUnicode) { REBAR_BAND *lpBand; UINT uChanged; @@ -2661,7 +2661,7 @@ static LRESULT -REBAR_SetBarInfo (REBAR_INFO *infoPtr, LPREBARINFO lpInfo) +REBAR_SetBarInfo (REBAR_INFO *infoPtr, const REBARINFO *lpInfo) { REBAR_BAND *lpBand; UINT i; @@ -3126,7 +3126,7 @@ static LRESULT -REBAR_NCCreate (HWND hwnd, LPCREATESTRUCTW cs) +REBAR_NCCreate (HWND hwnd, const CREATESTRUCTW *cs) { REBAR_INFO *infoPtr = REBAR_GetInfoPtr (hwnd); RECT wnrc1, clrc1; diff -Nru wine1.3-1.3.0/dlls/comctl32/tab.c wine1.3-1.3.1/dlls/comctl32/tab.c --- wine1.3-1.3.0/dlls/comctl32/tab.c 2010-07-30 18:43:56.000000000 +0100 +++ wine1.3-1.3.1/dlls/comctl32/tab.c 2010-08-20 18:23:50.000000000 +0100 @@ -1163,14 +1163,14 @@ if (!(infoPtr->fHeightSet)) { int item_height; - int icon_height = 0; + INT icon_height = 0, cx; /* Use the current font to determine the height of a tab. */ GetTextMetricsW(hdc, &fontMetrics); /* Get the icon height */ if (infoPtr->himl) - ImageList_GetIconSize(infoPtr->himl, 0, &icon_height); + ImageList_GetIconSize(infoPtr->himl, &cx, &icon_height); /* Take the highest between font or icon */ if (fontMetrics.tmHeight > icon_height) @@ -1195,7 +1195,9 @@ /* Get the icon width */ if (infoPtr->himl) { - ImageList_GetIconSize(infoPtr->himl, &icon_width, 0); + INT cy; + + ImageList_GetIconSize(infoPtr->himl, &icon_width, &cy); if (infoPtr->dwStyle & TCS_FIXEDWIDTH) icon_width += 4; @@ -2620,7 +2622,7 @@ } static LRESULT -TAB_InsertItemT (TAB_INFO *infoPtr, INT iItem, TCITEMW *pti, BOOL bUnicode) +TAB_InsertItemT (TAB_INFO *infoPtr, INT iItem, const TCITEMW *pti, BOOL bUnicode) { TAB_ITEM *item; RECT rect; diff -Nru wine1.3-1.3.0/dlls/comctl32/tests/datetime.c wine1.3-1.3.1/dlls/comctl32/tests/datetime.c --- wine1.3-1.3.0/dlls/comctl32/tests/datetime.c 2010-07-30 18:43:56.000000000 +0100 +++ wine1.3-1.3.1/dlls/comctl32/tests/datetime.c 2010-08-20 18:23:50.000000000 +0100 @@ -659,7 +659,7 @@ static void test_wm_set_get_text(void) { static const CHAR a_str[] = "a"; - char buff[16], time[16]; + CHAR buff[16], time[16], caltype[3]; HWND hWnd; LRESULT ret; @@ -673,10 +673,23 @@ buff[0] = 0; ret = SendMessage(hWnd, WM_GETTEXT, sizeof(buff), (LPARAM)buff); - ok(strcmp(buff, a_str) != 0, "Expected text not to change, got %s\n", buff); + ok(strcmp(buff, a_str) != 0, "Expected text to change, got %s\n", buff); + ok(ret != 0, "Expected non-zero return value\n"); - GetDateFormat(LOCALE_USER_DEFAULT, 0, NULL, NULL, time, sizeof(time)); - ok(!strcmp(buff, time), "Expected %s, got %s\n", time, buff); + SetLastError(0xdeadbeef); + ret = GetLocaleInfoA(LOCALE_USER_DEFAULT, LOCALE_ICALENDARTYPE, caltype, 3); + if (ret == 0) + skip("Must know local calendar type (%x)\n", GetLastError()); + else if (atoi(caltype) != CAL_GREGORIAN) + skip("DateTimePicker Control only supports Gregorian calendar (type: %s)\n", caltype); + else { + SetLastError(0xdeadbeef); + ret = GetDateFormat(LOCALE_USER_DEFAULT, 0, NULL, NULL, time, sizeof(time)); + if (ret == 0) + skip("GetDateFormat failed, returned %ld, error %d\n", ret, GetLastError()); + else + ok(!strcmp(buff, time), "Expected %s, got %s\n", time, buff); + } DestroyWindow(hWnd); } diff -Nru wine1.3-1.3.0/dlls/comctl32/tests/imagelist.c wine1.3-1.3.1/dlls/comctl32/tests/imagelist.c --- wine1.3-1.3.0/dlls/comctl32/tests/imagelist.c 2010-07-30 18:43:56.000000000 +0100 +++ wine1.3-1.3.1/dlls/comctl32/tests/imagelist.c 2010-08-20 18:23:50.000000000 +0100 @@ -254,7 +254,7 @@ #endif /* VISIBLE */ } -static void testHotspot (void) +static void test_hotspot(void) { struct hotspot { int dx; @@ -328,7 +328,7 @@ DestroyWindow(hwnd); } -static BOOL DoTest1(void) +static void test_add_remove(void) { HIMAGELIST himl ; @@ -369,67 +369,38 @@ /* remove one extra */ ok(!ImageList_Remove(himl,0),"removed nonexistent icon\n"); - /* check SetImageCount/GetImageCount */ - if (pImageList_SetImageCount) - { - ok(pImageList_SetImageCount(himl, 3), "couldn't increase image count\n"); - ok(ImageList_GetImageCount(himl) == 3, "invalid image count after increase\n"); - ok(pImageList_SetImageCount(himl, 1), "couldn't decrease image count\n"); - ok(ImageList_GetImageCount(himl) == 1, "invalid image count after decrease to 1\n"); - ok(pImageList_SetImageCount(himl, 0), "couldn't decrease image count\n"); - ok(ImageList_GetImageCount(himl) == 0, "invalid image count after decrease to 0\n"); - } - else - { - skip("skipped ImageList_SetImageCount tests\n"); - } - /* destroy it */ ok(ImageList_Destroy(himl),"destroy imagelist failed\n"); ok(DestroyIcon(hicon1),"icon 1 wasn't deleted\n"); ok(DestroyIcon(hicon2),"icon 2 wasn't deleted\n"); ok(DestroyIcon(hicon3),"icon 3 wasn't deleted\n"); - - return TRUE; } -static BOOL DoTest2(void) +static void test_imagecount(void) { - HIMAGELIST himl ; + HIMAGELIST himl; - HICON hicon1 ; - HICON hicon2 ; - HICON hicon3 ; + if (!pImageList_SetImageCount) + { + win_skip("ImageList_SetImageCount not available\n"); + return; + } - /* create an imagelist to play with */ himl = ImageList_Create(84, 84, ILC_COLOR16, 0, 3); ok(himl!=0,"failed to create imagelist\n"); - /* load the icons to add to the image list */ - hicon1 = CreateIcon(hinst, 32, 32, 1, 1, icon_bits, icon_bits); - ok(hicon1 != 0, "no hicon1\n"); - hicon2 = CreateIcon(hinst, 32, 32, 1, 1, icon_bits, icon_bits); - ok(hicon2 != 0, "no hicon2\n"); - hicon3 = CreateIcon(hinst, 32, 32, 1, 1, icon_bits, icon_bits); - ok(hicon3 != 0, "no hicon3\n"); - - /* add three */ - ok(0==ImageList_AddIcon(himl, hicon1),"failed to add icon1\n"); - ok(1==ImageList_AddIcon(himl, hicon2),"failed to add icon2\n"); - ok(2==ImageList_AddIcon(himl, hicon3),"failed to add icon3\n"); - - /* destroy it */ - ok(ImageList_Destroy(himl),"destroy imagelist failed\n"); + ok(pImageList_SetImageCount(himl, 3), "couldn't increase image count\n"); + ok(ImageList_GetImageCount(himl) == 3, "invalid image count after increase\n"); + ok(pImageList_SetImageCount(himl, 1), "couldn't decrease image count\n"); + ok(ImageList_GetImageCount(himl) == 1, "invalid image count after decrease to 1\n"); + ok(pImageList_SetImageCount(himl, 0), "couldn't decrease image count\n"); + ok(ImageList_GetImageCount(himl) == 0, "invalid image count after decrease to 0\n"); - ok(DestroyIcon(hicon1),"icon 1 wasn't deleted\n"); - ok(DestroyIcon(hicon2),"icon 2 wasn't deleted\n"); - ok(DestroyIcon(hicon3),"icon 3 wasn't deleted\n"); - - return TRUE; + ok(ImageList_Destroy(himl), "destroy imagelist failed\n"); } -static BOOL DoTest3(void) +static void test_DrawIndirect(void) { HIMAGELIST himl; @@ -444,7 +415,7 @@ if (!pImageList_DrawIndirect) { win_skip("ImageList_DrawIndirect not available, skipping test\n"); - return TRUE; + return; } hwndfortest = create_a_window(); @@ -476,17 +447,12 @@ memset(&imldp, 0, sizeof (imldp)); ok(!pImageList_DrawIndirect(&imldp), "zero data succeeded!\n"); - imldp.cbSize = sizeof (imldp); + imldp.cbSize = IMAGELISTDRAWPARAMS_V3_SIZE; ok(!pImageList_DrawIndirect(&imldp), "zero hdc succeeded!\n"); imldp.hdcDst = hdc; ok(!pImageList_DrawIndirect(&imldp),"zero himl succeeded!\n"); imldp.himl = himl; - if (!pImageList_DrawIndirect(&imldp)) - { - /* Earlier versions of native comctl32 use a smaller structure */ - imldp.cbSize -= 3 * sizeof(DWORD); - ok(pImageList_DrawIndirect(&imldp),"DrawIndirect should succeed\n"); - } + REDRAW(hwndfortest); WAIT; @@ -518,11 +484,9 @@ ReleaseDC(hwndfortest, hdc); DestroyWindow(hwndfortest); - - return TRUE; } -static void testMerge(void) +static void test_merge(void) { HIMAGELIST himl1, himl2, hmerge; HICON hicon1; @@ -1426,7 +1390,7 @@ ImageList_Destroy(himl); } -static void testHotspot_v6(void) +static void test_hotspot_v6(void) { struct hotspot { int dx; @@ -1501,7 +1465,7 @@ IImageList_Release(imgl1); } -static void DoTest1_v6(void) +static void test_IImageList_Add_Remove(void) { IImageList *imgl; HIMAGELIST himl; @@ -1511,7 +1475,7 @@ HICON hicon2; HICON hicon3; - int ret = 0; + int ret; /* create an imagelist to play with */ himl = ImageList_Create(84, 84, ILC_COLOR16, 0, 3); @@ -1529,45 +1493,71 @@ /* remove when nothing exists */ hr = IImageList_Remove(imgl, 0); - ok(!(SUCCEEDED(hr)), "removed nonexistent icon\n"); + ok(hr == E_INVALIDARG, "got 0x%08x\n", hr); /* removing everything from an empty imagelist should succeed */ hr = IImageList_Remove(imgl, -1); - ok(SUCCEEDED(hr), "removed nonexistent icon\n"); + ok(hr == S_OK, "removed nonexistent icon\n"); /* add three */ - ok(SUCCEEDED(IImageList_ReplaceIcon(imgl, -1, hicon1, &ret)) && (ret == 0),"failed to add icon1\n"); - ok(SUCCEEDED(IImageList_ReplaceIcon(imgl, -1, hicon2, &ret)) && (ret == 1),"failed to add icon2\n"); - ok(SUCCEEDED(IImageList_ReplaceIcon(imgl, -1, hicon3, &ret)) && (ret == 2),"failed to add icon3\n"); + ret = -1; + ok( IImageList_ReplaceIcon(imgl, -1, hicon1, &ret) == S_OK && (ret == 0),"failed to add icon1\n"); + ret = -1; + ok( IImageList_ReplaceIcon(imgl, -1, hicon2, &ret) == S_OK && (ret == 1),"failed to add icon2\n"); + ret = -1; + ok( IImageList_ReplaceIcon(imgl, -1, hicon3, &ret) == S_OK && (ret == 2),"failed to add icon3\n"); /* remove an index out of range */ - ok(FAILED(IImageList_Remove(imgl, 4711)),"removed nonexistent icon\n"); + ok( IImageList_Remove(imgl, 4711) == E_INVALIDARG, "got 0x%08x\n", hr); /* remove three */ - ok(SUCCEEDED(IImageList_Remove(imgl,0)),"can't remove 0\n"); - ok(SUCCEEDED(IImageList_Remove(imgl,0)),"can't remove 0\n"); - ok(SUCCEEDED(IImageList_Remove(imgl,0)),"can't remove 0\n"); + ok( IImageList_Remove(imgl,0) == S_OK, "can't remove 0\n"); + ok( IImageList_Remove(imgl,0) == S_OK, "can't remove 0\n"); + ok( IImageList_Remove(imgl,0) == S_OK, "can't remove 0\n"); /* remove one extra */ - ok(FAILED(IImageList_Remove(imgl, 0)),"removed nonexistent icon\n"); - - /* check SetImageCount/GetImageCount */ - ok(SUCCEEDED(IImageList_SetImageCount(imgl, 3)), "couldn't increase image count\n"); - ok(SUCCEEDED(IImageList_GetImageCount(imgl, &ret)) && (ret == 3), "invalid image count after increase\n"); - ok(SUCCEEDED(IImageList_SetImageCount(imgl, 1)), "couldn't decrease image count\n"); - ok(SUCCEEDED(IImageList_GetImageCount(imgl, &ret)) && (ret == 1), "invalid image count after decrease to 1\n"); - ok(SUCCEEDED(IImageList_SetImageCount(imgl, 0)), "couldn't decrease image count\n"); - ok(SUCCEEDED(IImageList_GetImageCount(imgl, &ret)) && (ret == 0), "invalid image count after decrease to 0\n"); - - /* destroy it */ - ok(SUCCEEDED(IImageList_Release(imgl)),"release imagelist failed\n"); + ok( IImageList_Remove(imgl, 0) == E_INVALIDARG, "got 0x%08x\n", hr); + IImageList_Release(imgl); ok(DestroyIcon(hicon1),"icon 1 wasn't deleted\n"); ok(DestroyIcon(hicon2),"icon 2 wasn't deleted\n"); ok(DestroyIcon(hicon3),"icon 3 wasn't deleted\n"); } -static void DoTest3_v6(void) +static void test_IImageList_Get_SetImageCount(void) +{ + IImageList *imgl; + HIMAGELIST himl; + HRESULT hr; + INT ret; + + /* create an imagelist to play with */ + himl = ImageList_Create(84, 84, ILC_COLOR16, 0, 3); + ok(himl != 0,"failed to create imagelist\n"); + + imgl = (IImageList *) himl; + + /* check SetImageCount/GetImageCount */ + hr = IImageList_SetImageCount(imgl, 3); + ok(hr == S_OK, "got 0x%08x\n", hr); + ret = 0; + hr = IImageList_GetImageCount(imgl, &ret); + ok(hr == S_OK && ret == 3, "invalid image count after increase\n"); + hr = IImageList_SetImageCount(imgl, 1); + ok(hr == S_OK, "got 0x%08x\n", hr); + ret = 0; + hr = IImageList_GetImageCount(imgl, &ret); + ok(hr == S_OK && ret == 1, "invalid image count after decrease to 1\n"); + hr = IImageList_SetImageCount(imgl, 0); + ok(hr == S_OK, "got 0x%08x\n", hr); + ret = -1; + hr = IImageList_GetImageCount(imgl, &ret); + ok(hr == S_OK && ret == 0, "invalid image count after decrease to 0\n"); + + IImageList_Release(imgl); +} + +static void test_IImageList_Draw(void) { IImageList *imgl; HIMAGELIST himl; @@ -1578,6 +1568,7 @@ IMAGELISTDRAWPARAMS imldp; HWND hwndfortest; + HRESULT hr; HDC hdc; int ret; @@ -1600,26 +1591,28 @@ ok(hbm3 != 0, "no bitmap 3\n"); /* add three */ - ok(SUCCEEDED(IImageList_Add(imgl, hbm1, 0, &ret)) && (ret == 0), "failed to add bitmap 1\n"); - ok(SUCCEEDED(IImageList_Add(imgl, hbm2, 0, &ret)) && (ret == 1), "failed to add bitmap 2\n"); + ret = -1; + ok( IImageList_Add(imgl, hbm1, 0, &ret) == S_OK && (ret == 0), "failed to add bitmap 1\n"); + ret = -1; + ok( IImageList_Add(imgl, hbm2, 0, &ret) == S_OK && (ret == 1), "failed to add bitmap 2\n"); - ok(SUCCEEDED(IImageList_SetImageCount(imgl, 3)), "Setimage count failed\n"); - ok(SUCCEEDED(IImageList_Replace(imgl, 2, hbm3, 0)), "failed to replace bitmap 3\n"); + ok( IImageList_SetImageCount(imgl, 3) == S_OK, "Setimage count failed\n"); + ok( IImageList_Replace(imgl, 2, hbm3, 0) == S_OK, "failed to replace bitmap 3\n"); + +if (0) +{ + /* crashes on native */ + hr = IImageList_Draw(imgl, NULL); +} memset(&imldp, 0, sizeof (imldp)); - ok(FAILED(IImageList_Draw(imgl, &imldp)), "zero data succeeded!\n"); + hr = IImageList_Draw(imgl, &imldp); + ok( hr == E_INVALIDARG, "got 0x%08x\n", hr); - imldp.cbSize = sizeof (imldp); + imldp.cbSize = IMAGELISTDRAWPARAMS_V3_SIZE; imldp.hdcDst = hdc; imldp.himl = himl; - if (FAILED(IImageList_Draw(imgl, &imldp))) - { - /* Earlier versions of native comctl32 use a smaller structure */ - imldp.cbSize -= 3 * sizeof(DWORD); - ok(SUCCEEDED(IImageList_Draw(imgl, &imldp)), "should succeed\n"); - } - REDRAW(hwndfortest); WAIT; @@ -1628,21 +1621,21 @@ imldp.rgbFg = CLR_DEFAULT; imldp.y = 100; imldp.x = 100; - ok(SUCCEEDED(IImageList_Draw(imgl, &imldp)), "should succeed\n"); + ok( IImageList_Draw(imgl, &imldp) == S_OK, "should succeed\n"); imldp.i ++; - ok(SUCCEEDED(IImageList_Draw(imgl, &imldp)), "should succeed\n"); + ok( IImageList_Draw(imgl, &imldp) == S_OK, "should succeed\n"); imldp.i ++; - ok(SUCCEEDED(IImageList_Draw(imgl, &imldp)), "should succeed\n"); + ok( IImageList_Draw(imgl, &imldp) == S_OK, "should succeed\n"); imldp.i ++; - ok(FAILED(IImageList_Draw(imgl, &imldp)), "should fail\n"); + ok( IImageList_Draw(imgl, &imldp) == E_INVALIDARG, "should fail\n"); /* remove three */ - ok(SUCCEEDED(IImageList_Remove(imgl, 0)), "removing 1st bitmap\n"); - ok(SUCCEEDED(IImageList_Remove(imgl, 0)), "removing 2nd bitmap\n"); - ok(SUCCEEDED(IImageList_Remove(imgl, 0)), "removing 3rd bitmap\n"); + ok( IImageList_Remove(imgl, 0) == S_OK, "removing 1st bitmap\n"); + ok( IImageList_Remove(imgl, 0) == S_OK, "removing 2nd bitmap\n"); + ok( IImageList_Remove(imgl, 0) == S_OK, "removing 3rd bitmap\n"); /* destroy it */ - ok(SUCCEEDED(IImageList_Release(imgl)), "release imagelist failed\n"); + IImageList_Release(imgl); /* bitmaps should not be deleted by the imagelist */ ok(DeleteObject(hbm1),"bitmap 1 can't be deleted\n"); @@ -1653,7 +1646,7 @@ DestroyWindow(hwndfortest); } -static void testMerge_v6(void) +static void test_IImageList_Merge(void) { HIMAGELIST himl1, himl2; IImageList *imgl1, *imgl2, *merge; @@ -1678,16 +1671,17 @@ imgl1 = (IImageList *) himl1; imgl2 = (IImageList *) himl2; - ok(SUCCEEDED(IImageList_ReplaceIcon(imgl2, -1, hicon1, &ret)) && (ret == 0),"add icon1 to himl2 failed\n"); + ret = -1; + ok( IImageList_ReplaceIcon(imgl2, -1, hicon1, &ret) == S_OK && (ret == 0),"add icon1 to himl2 failed\n"); /* If himl1 has no images, merge still succeeds */ hr = IImageList_Merge(imgl1, -1, (IUnknown *) imgl2, 0, 0, 0, &IID_IImageList, (void **) &merge); - ok(SUCCEEDED(hr), "merge himl1,-1 failed\n"); - if (SUCCEEDED(hr)) IImageList_Release(merge); + ok(hr == S_OK, "merge himl1,-1 failed\n"); + if (hr == S_OK) IImageList_Release(merge); hr = IImageList_Merge(imgl1, 0, (IUnknown *) imgl2, 0, 0, 0, &IID_IImageList, (void **) &merge); - ok(SUCCEEDED(hr), "merge himl1,0 failed\n"); - if (SUCCEEDED(hr)) IImageList_Release(merge); + ok(hr == S_OK, "merge himl1,0 failed\n"); + if (hr == S_OK) IImageList_Release(merge); /* Same happens if himl2 is empty */ IImageList_Release(imgl2); @@ -1697,30 +1691,32 @@ imgl2 = (IImageList *) himl2; hr = IImageList_Merge(imgl1, -1, (IUnknown *) imgl2, -1, 0, 0, &IID_IImageList, (void **) &merge); - ok(SUCCEEDED(hr), "merge himl2,-1 failed\n"); - if (SUCCEEDED(hr)) IImageList_Release(merge); + ok(hr == S_OK, "merge himl2,-1 failed\n"); + if (hr == S_OK) IImageList_Release(merge); hr = IImageList_Merge(imgl1, -1, (IUnknown *) imgl2, 0, 0, 0, &IID_IImageList, (void **) &merge); - ok(SUCCEEDED(hr), "merge himl2,0 failed\n"); - if (SUCCEEDED(hr)) IImageList_Release(merge); + ok(hr == S_OK, "merge himl2,0 failed\n"); + if (hr == S_OK) IImageList_Release(merge); /* Now try merging an image with itself */ - ok(SUCCEEDED(IImageList_ReplaceIcon(imgl2, -1, hicon1, &ret)) && (ret == 0),"re-add icon1 to himl2 failed\n"); + ret = -1; + ok( IImageList_ReplaceIcon(imgl2, -1, hicon1, &ret) == S_OK && (ret == 0),"re-add icon1 to himl2 failed\n"); hr = IImageList_Merge(imgl2, 0, (IUnknown *) imgl2, 0, 0, 0, &IID_IImageList, (void **) &merge); - ok(SUCCEEDED(hr), "merge himl2 with itself failed\n"); - if (SUCCEEDED(hr)) IImageList_Release(merge); + ok(hr == S_OK, "merge himl2 with itself failed\n"); + if (hr == S_OK) IImageList_Release(merge); /* Try merging 2 different image lists */ - ok(SUCCEEDED(IImageList_ReplaceIcon(imgl1, -1, hicon1, &ret)) && (ret == 0),"add icon1 to himl1 failed\n"); + ret = -1; + ok( IImageList_ReplaceIcon(imgl1, -1, hicon1, &ret) == S_OK && (ret == 0),"add icon1 to himl1 failed\n"); hr = IImageList_Merge(imgl1, 0, (IUnknown *) imgl2, 0, 0, 0, &IID_IImageList, (void **) &merge); - ok(SUCCEEDED(hr), "merge himl1 with himl2 failed\n"); - if (SUCCEEDED(hr)) IImageList_Release(merge); + ok(hr == S_OK, "merge himl1 with himl2 failed\n"); + if (hr == S_OK) IImageList_Release(merge); hr = IImageList_Merge(imgl1, 0, (IUnknown *) imgl2, 0, 8, 16, &IID_IImageList, (void **) &merge); - ok(SUCCEEDED(hr), "merge himl1 with himl2 8,16 failed\n"); - if (SUCCEEDED(hr)) IImageList_Release(merge); + ok(hr == S_OK, "merge himl1 with himl2 8,16 failed\n"); + if (hr == S_OK) IImageList_Release(merge); IImageList_Release(imgl1); IImageList_Release(imgl2); @@ -1729,6 +1725,52 @@ DestroyWindow(hwnd); } +static void test_iconsize(void) +{ + HIMAGELIST himl; + INT cx, cy; + BOOL ret; + + himl = ImageList_Create(16, 16, ILC_COLOR16, 0, 3); + /* null pointers, not zero imagelist dimensions */ + ret = ImageList_GetIconSize(himl, NULL, NULL); + ok(!ret, "got %d\n", ret); + + /* doesn't touch return pointers */ + cx = 0xdeadbeef; + ret = ImageList_GetIconSize(himl, &cx, NULL); + ok(!ret, "got %d\n", ret); + ok(cx == 0xdeadbeef, "got %d\n", cx); + + cy = 0xdeadbeef; + ret = ImageList_GetIconSize(himl, NULL, &cy); + ok(!ret, "got %d\n", ret); + ok(cy == 0xdeadbeef, "got %d\n", cy); + + ImageList_Destroy(himl); +} + +static void test_create(void) +{ + HIMAGELIST himl; + + /* list with zero or negative image dimensions */ + himl = ImageList_Create(0, 0, ILC_COLOR16, 0, 3); + ok(himl == NULL, "got %p\n", himl); + + himl = ImageList_Create(0, 16, ILC_COLOR16, 0, 3); + ok(himl == NULL, "got %p\n", himl); + + himl = ImageList_Create(16, 0, ILC_COLOR16, 0, 3); + ok(himl == NULL, "got %p\n", himl); + + himl = ImageList_Create(16, -1, ILC_COLOR16, 0, 3); + ok(himl == NULL, "got %p\n", himl); + + himl = ImageList_Create(-1, 16, ILC_COLOR16, 0, 3); + ok(himl == NULL, "got %p\n", himl); +} + START_TEST(imagelist) { ULONG_PTR ctx_cookie; @@ -1744,12 +1786,14 @@ InitCommonControls(); - testHotspot(); - DoTest1(); - DoTest2(); - DoTest3(); - testMerge(); + test_create(); + test_hotspot(); + test_add_remove(); + test_imagecount(); + test_DrawIndirect(); + test_merge(); test_imagelist_storage(); + test_iconsize(); FreeLibrary(hComCtl32); @@ -1774,10 +1818,11 @@ test_shell_imagelist(); test_iimagelist(); - testHotspot_v6(); - DoTest1_v6(); - DoTest3_v6(); - testMerge_v6(); + test_hotspot_v6(); + test_IImageList_Add_Remove(); + test_IImageList_Get_SetImageCount(); + test_IImageList_Draw(); + test_IImageList_Merge(); CoUninitialize(); diff -Nru wine1.3-1.3.0/dlls/comctl32/tests/monthcal.c wine1.3-1.3.1/dlls/comctl32/tests/monthcal.c --- wine1.3-1.3.0/dlls/comctl32/tests/monthcal.c 2010-07-30 18:43:56.000000000 +0100 +++ wine1.3-1.3.1/dlls/comctl32/tests/monthcal.c 2010-08-20 18:23:50.000000000 +0100 @@ -28,12 +28,14 @@ #include "commctrl.h" #include "wine/test.h" +#include "v6util.h" #include #include #include "msg.h" #define expect(expected, got) ok(expected == got, "Expected %d, got %d\n", expected, got); #define expect_hex(expected, got) ok(expected == got, "Expected %x, got %x\n", expected, got); +#define expect_d(expected, got) ok(abs((expected) - (got)) <= 2, "Expected %d, got %d\n", expected, got); #define NUM_MSG_SEQUENCES 2 #define PARENT_SEQ_INDEX 0 @@ -83,45 +85,6 @@ { 0 } }; -static const struct message monthcal_color_seq[] = { - { MCM_GETCOLOR, sent|wparam|lparam, MCSC_BACKGROUND, 0}, - { MCM_SETCOLOR, sent|wparam|lparam, MCSC_BACKGROUND, RGB(0,0,0)}, - { MCM_GETCOLOR, sent|wparam|lparam, MCSC_BACKGROUND, 0}, - { MCM_SETCOLOR, sent|wparam|lparam, MCSC_BACKGROUND, RGB(255,255,255)}, - { MCM_GETCOLOR, sent|wparam|lparam, MCSC_BACKGROUND, 0}, - - { MCM_GETCOLOR, sent|wparam|lparam, MCSC_MONTHBK, 0}, - { MCM_SETCOLOR, sent|wparam|lparam, MCSC_MONTHBK, RGB(0,0,0)}, - { MCM_GETCOLOR, sent|wparam|lparam, MCSC_MONTHBK, 0}, - { MCM_SETCOLOR, sent|wparam|lparam, MCSC_MONTHBK, RGB(255,255,255)}, - { MCM_GETCOLOR, sent|wparam|lparam, MCSC_MONTHBK, 0}, - - { MCM_GETCOLOR, sent|wparam|lparam, MCSC_TEXT, 0}, - { MCM_SETCOLOR, sent|wparam|lparam, MCSC_TEXT, RGB(0,0,0)}, - { MCM_GETCOLOR, sent|wparam|lparam, MCSC_TEXT, 0}, - { MCM_SETCOLOR, sent|wparam|lparam, MCSC_TEXT, RGB(255,255,255)}, - { MCM_GETCOLOR, sent|wparam|lparam, MCSC_TEXT, 0}, - - { MCM_GETCOLOR, sent|wparam|lparam, MCSC_TITLEBK, 0}, - { MCM_SETCOLOR, sent|wparam|lparam, MCSC_TITLEBK, RGB(0,0,0)}, - { MCM_GETCOLOR, sent|wparam|lparam, MCSC_TITLEBK, 0}, - { MCM_SETCOLOR, sent|wparam|lparam, MCSC_TITLEBK, RGB(255,255,255)}, - { MCM_GETCOLOR, sent|wparam|lparam, MCSC_TITLEBK, 0}, - - { MCM_GETCOLOR, sent|wparam|lparam, MCSC_TITLETEXT, 0}, - { MCM_SETCOLOR, sent|wparam|lparam, MCSC_TITLETEXT, RGB(0,0,0)}, - { MCM_GETCOLOR, sent|wparam|lparam, MCSC_TITLETEXT, 0}, - { MCM_SETCOLOR, sent|wparam|lparam, MCSC_TITLETEXT, RGB(255,255,255)}, - { MCM_GETCOLOR, sent|wparam|lparam, MCSC_TITLETEXT, 0}, - - { MCM_GETCOLOR, sent|wparam|lparam, MCSC_TRAILINGTEXT, 0}, - { MCM_SETCOLOR, sent|wparam|lparam, MCSC_TRAILINGTEXT, RGB(0,0,0)}, - { MCM_GETCOLOR, sent|wparam|lparam, MCSC_TRAILINGTEXT, 0}, - { MCM_SETCOLOR, sent|wparam|lparam, MCSC_TRAILINGTEXT, RGB(255,255,255)}, - { MCM_GETCOLOR, sent|wparam|lparam, MCSC_TRAILINGTEXT, 0}, - { 0 } -}; - static const struct message monthcal_curr_date_seq[] = { { MCM_SETCURSEL, sent|wparam, 0}, { WM_PAINT, sent|wparam|lparam|defwinproc, 0, 0}, @@ -292,26 +255,6 @@ { 0 } }; -/* expected message sequence for parent window*/ -static const struct message destroy_parent_seq[] = { - { 0x0090, sent|optional }, /* Vista */ - { WM_WINDOWPOSCHANGING, sent|wparam, 0}, - { WM_WINDOWPOSCHANGED, sent|wparam, 0}, - { WM_IME_SETCONTEXT, sent|wparam|optional, 0}, - { WM_IME_NOTIFY, sent|wparam|lparam|defwinproc|optional, 1, 0}, - { WM_NCACTIVATE, sent|wparam|optional, 0}, - { WM_ACTIVATE, sent|wparam|optional, 0}, - { WM_NCACTIVATE, sent|wparam|lparam|optional, 0, 0}, - { WM_ACTIVATE, sent|wparam|lparam|optional, 0, 0}, - { WM_ACTIVATEAPP, sent|wparam|optional, 0}, - { WM_KILLFOCUS, sent|wparam|lparam|optional, 0, 0}, - { WM_IME_SETCONTEXT, sent|wparam|optional, 0}, - { WM_IME_NOTIFY, sent|wparam|lparam|defwinproc|optional, 1, 0}, - { WM_DESTROY, sent|wparam|lparam, 0, 0}, - { WM_NCDESTROY, sent|wparam|lparam, 0, 0}, - { 0 } -}; - static void test_monthcal(void) { HWND hwnd; @@ -629,82 +572,83 @@ /* Setter and Getters Tests */ -static void test_monthcal_color(void) +static void test_color(void) { - int res, temp; + COLORREF color, prev; HWND hwnd; hwnd = create_monthcal_control(0); - flush_sequences(sequences, NUM_MSG_SEQUENCES); - - /* Setter and Getters for color*/ - temp = SendMessage(hwnd, MCM_GETCOLOR, MCSC_BACKGROUND, 0); - res = SendMessage(hwnd, MCM_SETCOLOR, MCSC_BACKGROUND, RGB(0,0,0)); - expect(temp, res); - temp = SendMessage(hwnd, MCM_GETCOLOR, MCSC_BACKGROUND, 0); - expect(RGB(0,0,0), temp); - res = SendMessage(hwnd, MCM_SETCOLOR, MCSC_BACKGROUND, RGB(255,255,255)); - expect(temp, res); - temp = SendMessage(hwnd, MCM_GETCOLOR, MCSC_BACKGROUND, 0); - expect(RGB(255,255,255), temp); - - temp = SendMessage(hwnd, MCM_GETCOLOR, MCSC_MONTHBK, 0); - res = SendMessage(hwnd, MCM_SETCOLOR, MCSC_MONTHBK, RGB(0,0,0)); - expect(temp, res); - temp = SendMessage(hwnd, MCM_GETCOLOR, MCSC_MONTHBK, 0); - expect(RGB(0,0,0), temp); - res = SendMessage(hwnd, MCM_SETCOLOR, MCSC_MONTHBK, RGB(255,255,255)); - expect(temp, res); - temp = SendMessage(hwnd, MCM_GETCOLOR, MCSC_MONTHBK, 0); - expect(RGB(255,255,255), temp); - - temp = SendMessage(hwnd, MCM_GETCOLOR, MCSC_TEXT, 0); - res = SendMessage(hwnd, MCM_SETCOLOR, MCSC_TEXT, RGB(0,0,0)); - expect(temp, res); - temp = SendMessage(hwnd, MCM_GETCOLOR, MCSC_TEXT, 0); - expect(RGB(0,0,0), temp); - res = SendMessage(hwnd, MCM_SETCOLOR, MCSC_TEXT, RGB(255,255,255)); - expect(temp, res); - temp = SendMessage(hwnd, MCM_GETCOLOR, MCSC_TEXT, 0); - expect(RGB(255,255,255), temp); - - temp = SendMessage(hwnd, MCM_GETCOLOR, MCSC_TITLEBK, 0); - res = SendMessage(hwnd, MCM_SETCOLOR, MCSC_TITLEBK, RGB(0,0,0)); - expect(temp, res); - temp = SendMessage(hwnd, MCM_GETCOLOR, MCSC_TITLEBK, 0); - expect(RGB(0,0,0), temp); - res = SendMessage(hwnd, MCM_SETCOLOR, MCSC_TITLEBK, RGB(255,255,255)); - expect(temp, res); - temp = SendMessage(hwnd, MCM_GETCOLOR, MCSC_TITLEBK, 0); - expect(RGB(255,255,255), temp); - - temp = SendMessage(hwnd, MCM_GETCOLOR, MCSC_TITLETEXT, 0); - res = SendMessage(hwnd, MCM_SETCOLOR, MCSC_TITLETEXT, RGB(0,0,0)); - expect(temp, res); - temp = SendMessage(hwnd, MCM_GETCOLOR, MCSC_TITLETEXT, 0); - expect(RGB(0,0,0), temp); - res = SendMessage(hwnd, MCM_SETCOLOR, MCSC_TITLETEXT, RGB(255,255,255)); - expect(temp, res); - temp = SendMessage(hwnd, MCM_GETCOLOR, MCSC_TITLETEXT, 0); - expect(RGB(255,255,255), temp); - - temp = SendMessage(hwnd, MCM_GETCOLOR, MCSC_TRAILINGTEXT, 0); - res = SendMessage(hwnd, MCM_SETCOLOR, MCSC_TRAILINGTEXT, RGB(0,0,0)); - expect(temp, res); - temp = SendMessage(hwnd, MCM_GETCOLOR, MCSC_TRAILINGTEXT, 0); - expect(RGB(0,0,0), temp); - res = SendMessage(hwnd, MCM_SETCOLOR, MCSC_TRAILINGTEXT, RGB(255,255,255)); - expect(temp, res); - temp = SendMessage(hwnd, MCM_GETCOLOR, MCSC_TRAILINGTEXT, 0); - expect(RGB(255,255,255), temp); - - ok_sequence(sequences, MONTHCAL_SEQ_INDEX, monthcal_color_seq, "monthcal color", FALSE); + /* invalid color index */ + color = SendMessage(hwnd, MCM_GETCOLOR, MCSC_TRAILINGTEXT + 1, 0); + expect(-1, color); + prev = SendMessage(hwnd, MCM_SETCOLOR, MCSC_TRAILINGTEXT + 1, RGB(255,255,255)); + expect(-1, prev); + + color = SendMessage(hwnd, MCM_GETCOLOR, MCSC_BACKGROUND, 0); + prev = SendMessage(hwnd, MCM_SETCOLOR, MCSC_BACKGROUND, RGB(0,0,0)); + expect(color, prev); + color = SendMessage(hwnd, MCM_GETCOLOR, MCSC_BACKGROUND, 0); + expect(RGB(0,0,0), color); + prev = SendMessage(hwnd, MCM_SETCOLOR, MCSC_BACKGROUND, RGB(255,255,255)); + expect(color, prev); + color = SendMessage(hwnd, MCM_GETCOLOR, MCSC_BACKGROUND, 0); + expect(RGB(255,255,255), color); + + color = SendMessage(hwnd, MCM_GETCOLOR, MCSC_MONTHBK, 0); + prev = SendMessage(hwnd, MCM_SETCOLOR, MCSC_MONTHBK, RGB(0,0,0)); + expect(color, prev); + color = SendMessage(hwnd, MCM_GETCOLOR, MCSC_MONTHBK, 0); + expect(RGB(0,0,0), color); + prev = SendMessage(hwnd, MCM_SETCOLOR, MCSC_MONTHBK, RGB(255,255,255)); + expect(color, prev); + color = SendMessage(hwnd, MCM_GETCOLOR, MCSC_MONTHBK, 0); + expect(RGB(255,255,255), color); + + color = SendMessage(hwnd, MCM_GETCOLOR, MCSC_TEXT, 0); + prev = SendMessage(hwnd, MCM_SETCOLOR, MCSC_TEXT, RGB(0,0,0)); + expect(color, prev); + color = SendMessage(hwnd, MCM_GETCOLOR, MCSC_TEXT, 0); + expect(RGB(0,0,0), color); + prev = SendMessage(hwnd, MCM_SETCOLOR, MCSC_TEXT, RGB(255,255,255)); + expect(color, prev); + color = SendMessage(hwnd, MCM_GETCOLOR, MCSC_TEXT, 0); + expect(RGB(255,255,255), color); + + color = SendMessage(hwnd, MCM_GETCOLOR, MCSC_TITLEBK, 0); + prev = SendMessage(hwnd, MCM_SETCOLOR, MCSC_TITLEBK, RGB(0,0,0)); + expect(color, prev); + color = SendMessage(hwnd, MCM_GETCOLOR, MCSC_TITLEBK, 0); + expect(RGB(0,0,0), color); + prev = SendMessage(hwnd, MCM_SETCOLOR, MCSC_TITLEBK, RGB(255,255,255)); + expect(color, prev); + color = SendMessage(hwnd, MCM_GETCOLOR, MCSC_TITLEBK, 0); + expect(RGB(255,255,255), color); + + color = SendMessage(hwnd, MCM_GETCOLOR, MCSC_TITLETEXT, 0); + prev = SendMessage(hwnd, MCM_SETCOLOR, MCSC_TITLETEXT, RGB(0,0,0)); + expect(color, prev); + color = SendMessage(hwnd, MCM_GETCOLOR, MCSC_TITLETEXT, 0); + expect(RGB(0,0,0), color); + prev = SendMessage(hwnd, MCM_SETCOLOR, MCSC_TITLETEXT, RGB(255,255,255)); + expect(color, prev); + color = SendMessage(hwnd, MCM_GETCOLOR, MCSC_TITLETEXT, 0); + expect(RGB(255,255,255), color); + + color = SendMessage(hwnd, MCM_GETCOLOR, MCSC_TRAILINGTEXT, 0); + prev = SendMessage(hwnd, MCM_SETCOLOR, MCSC_TRAILINGTEXT, RGB(0,0,0)); + expect(color, prev); + color = SendMessage(hwnd, MCM_GETCOLOR, MCSC_TRAILINGTEXT, 0); + expect(RGB(0,0,0), color); + prev = SendMessage(hwnd, MCM_SETCOLOR, MCSC_TRAILINGTEXT, RGB(255,255,255)); + expect(color, prev); + color = SendMessage(hwnd, MCM_GETCOLOR, MCSC_TRAILINGTEXT, 0); + expect(RGB(255,255,255), color); DestroyWindow(hwnd); } -static void test_monthcal_currdate(void) +static void test_currdate(void) { SYSTEMTIME st_original, st_new, st_test; int res; @@ -834,12 +778,23 @@ DestroyWindow(hwnd); } -static void test_monthcal_firstDay(void) +static void test_firstDay(void) { int res, fday, i, prev; - CHAR b[128]; + CHAR b[128], caltype[3]; LCID lcid = LOCALE_USER_DEFAULT; HWND hwnd; + LRESULT ret; + + SetLastError(0xdeadbeef); + ret = GetLocaleInfoA(lcid, LOCALE_ICALENDARTYPE, caltype, 3); + if (ret == 0) { + skip("Must know local calendar type (%x)\n", GetLastError()); + return; + } else if (atoi(caltype) != CAL_GREGORIAN) { + skip("MonthCalendar Control only supports Gregorian calendar (type: %s)\n", caltype); + return; + } hwnd = create_monthcal_control(0); @@ -881,7 +836,7 @@ DestroyWindow(hwnd); } -static void test_monthcal_unicode(void) +static void test_unicode(void) { int res, temp; HWND hwnd; @@ -924,7 +879,7 @@ DestroyWindow(hwnd); } -static void test_monthcal_hittest(void) +static void test_hittest(void) { typedef struct hittest_test { @@ -1175,7 +1130,7 @@ DestroyWindow(hwnd); } -static void test_monthcal_todaylink(void) +static void test_todaylink(void) { MCHITTESTINFO mchit; SYSTEMTIME st_test, st_new; @@ -1230,7 +1185,7 @@ DestroyWindow(hwnd); } -static void test_monthcal_today(void) +static void test_today(void) { SYSTEMTIME st_test, st_new; int res; @@ -1285,7 +1240,7 @@ DestroyWindow(hwnd); } -static void test_monthcal_scroll(void) +static void test_scroll(void) { int res; HWND hwnd; @@ -1323,7 +1278,7 @@ DestroyWindow(hwnd); } -static void test_monthcal_monthrange(void) +static void test_monthrange(void) { int res; SYSTEMTIME st_visible[2], st_daystate[2], st; @@ -1416,7 +1371,7 @@ DestroyWindow(hwnd); } -static void test_monthcal_maxselday(void) +static void test_maxselday(void) { int res; HWND hwnd; @@ -1482,7 +1437,7 @@ DestroyWindow(hwnd); } -static void test_monthcal_size(void) +static void test_size(void) { int res; RECT r1, r2; @@ -1518,7 +1473,7 @@ DestroyWindow(hwnd); } -static void test_monthcal_create(void) +static void test_create(void) { HWND hwnd; @@ -1535,7 +1490,7 @@ DestroyWindow(hwnd); } -static void test_monthcal_destroy(void) +static void test_destroy(void) { HWND hwnd; @@ -1552,7 +1507,7 @@ ok_sequence(sequences, MONTHCAL_SEQ_INDEX, destroy_monthcal_multi_sel_style_seq, "Destroy monthcal (multi sel style)", FALSE); } -static void test_monthcal_selrange(void) +static void test_selrange(void) { HWND hwnd; SYSTEMTIME st, range[2], range2[2]; @@ -1680,11 +1635,135 @@ DestroyWindow(hwnd); } +static void test_hittest_v6(void) +{ + MCHITTESTINFO mchit; + DWORD ret; + HWND hwnd; + RECT r; + + hwnd = create_monthcal_control(0); + SendMessage(hwnd, MCM_SETCALENDARBORDER, TRUE, 0); + + SendMessage(hwnd, MCM_GETMINREQRECT, 0, (LPARAM)&r); + /* reserving some area around calendar */ + MoveWindow(hwnd, 0, 0, r.right * 3 / 2, r.bottom * 3 / 2, FALSE); + mchit.cbSize = sizeof(MCHITTESTINFO); + mchit.pt.x = mchit.pt.y = 0; + mchit.iOffset = -1; + mchit.iRow = -1; + mchit.iCol = -1; + ret = SendMessage(hwnd, MCM_HITTEST, 0, (LPARAM)&mchit); + if (ret == -1) + { + win_skip("Only MCHITTESTINFO_V1 supported\n"); + DestroyWindow(hwnd); + return; + } + todo_wine expect_hex(MCHT_NOWHERE, ret); + expect(-1, mchit.iOffset); + expect(-1, mchit.iRow); + expect(-1, mchit.iCol); + + MoveWindow(hwnd, 0, 0, r.right, r.bottom, FALSE); + mchit.pt.x = r.right / 2; + mchit.pt.y = r.bottom / 2; + mchit.iOffset = -1; + ret = SendMessage(hwnd, MCM_HITTEST, 0, (LPARAM)&mchit); + expect_hex(MCHT_CALENDARDATE, ret); + expect(0, mchit.iOffset); + + /* over day area */ + mchit.pt.x = r.right / (7*2); + mchit.pt.y = r.bottom / 2; + mchit.iOffset = -1; + mchit.iCol = mchit.iRow = -1; + mchit.uHit = 0; + mchit.rc.left = mchit.rc.right = mchit.rc.top = mchit.rc.bottom = -1; + ret = SendMessage(hwnd, MCM_HITTEST, 0, (LPARAM)&mchit); + expect_hex(MCHT_CALENDARDATE, ret); + expect_hex(MCHT_CALENDARDATE, mchit.uHit); + expect(0, mchit.iOffset); + expect(2, mchit.iRow); + expect(0, mchit.iCol); + /* returned a one day rectangle */ + expect_d(r.right / 7, mchit.rc.right - mchit.rc.left); + expect_d(r.bottom / 10, mchit.rc.bottom - mchit.rc.top); + + /* title */ + mchit.pt.x = 1; + mchit.pt.y = 1; + mchit.iOffset = -1; + mchit.iCol = mchit.iRow = -1; + mchit.uHit = 0; + mchit.rc.left = mchit.rc.right = mchit.rc.top = mchit.rc.bottom = -1; + ret = SendMessage(hwnd, MCM_HITTEST, 0, (LPARAM)&mchit); + expect_hex(MCHT_TITLE, ret); + expect_hex(MCHT_TITLE, mchit.uHit); + expect(0, mchit.iOffset); + expect(-1, mchit.iRow); + expect(-1, mchit.iCol); + expect(0, mchit.rc.left); + expect(0, mchit.rc.top); + expect_d(r.right, mchit.rc.right); + ok(mchit.rc.bottom > 0, "got %d\n", mchit.rc.bottom); + + /* between two calendars */ + MoveWindow(hwnd, 0, 0, r.right * 5/2, r.bottom, FALSE); + mchit.pt.x = r.right / (5*4); + mchit.pt.y = r.bottom / 2; + mchit.iOffset = -2; + mchit.iCol = mchit.iRow = -2; + mchit.uHit = ~0; + mchit.rc.left = mchit.rc.right = mchit.rc.top = mchit.rc.bottom = -1; + ret = SendMessage(hwnd, MCM_HITTEST, 0, (LPARAM)&mchit); + todo_wine expect_hex(MCHT_NOWHERE, ret); + todo_wine expect_hex(MCHT_NOWHERE, mchit.uHit); + expect(-2, mchit.iOffset); + expect(-2, mchit.iRow); + expect(-2, mchit.iCol); + todo_wine expect(0, mchit.rc.left); + todo_wine expect(0, mchit.rc.top); + todo_wine expect_d(r.right * 5/2, mchit.rc.right); + todo_wine expect_d(r.bottom, mchit.rc.bottom); + + DestroyWindow(hwnd); +} + +static void test_get_set_border(void) +{ + HWND hwnd; + DWORD ret; + + hwnd = create_monthcal_control(0); + + /* a non-default value */ + ret = SendMessage(hwnd, MCM_SETCALENDARBORDER, TRUE, 10); + expect(0, ret); + + ret = SendMessage(hwnd, MCM_GETCALENDARBORDER, 0, 0); + + if (ret != 10) + { + skip("MCM_GET/SETCALENDARBORDER not supported\n"); + DestroyWindow(hwnd); + return; + } + + expect(10, ret); + + DestroyWindow(hwnd); +} + START_TEST(monthcal) { - HMODULE hComctl32; BOOL (WINAPI *pInitCommonControlsEx)(const INITCOMMONCONTROLSEX*); INITCOMMONCONTROLSEX iccex; + HMODULE hComctl32; + HWND hwnd; + + ULONG_PTR ctx_cookie; + HANDLE hCtx; hComctl32 = GetModuleHandleA("comctl32.dll"); pInitCommonControlsEx = (void*)GetProcAddress(hComctl32, "InitCommonControlsEx"); @@ -1703,23 +1782,47 @@ parent_wnd = create_parent_window(); - test_monthcal_create(); - test_monthcal_destroy(); - test_monthcal_color(); - test_monthcal_currdate(); - test_monthcal_firstDay(); - test_monthcal_unicode(); - test_monthcal_today(); - test_monthcal_scroll(); - test_monthcal_monthrange(); - test_monthcal_hittest(); - test_monthcal_todaylink(); - test_monthcal_size(); - test_monthcal_maxselday(); - test_monthcal_selrange(); + test_create(); + test_destroy(); + test_color(); + test_currdate(); + test_firstDay(); + test_unicode(); + test_today(); + test_scroll(); + test_monthrange(); + test_hittest(); + test_todaylink(); + test_size(); + test_maxselday(); + test_selrange(); test_killfocus(); - flush_sequences(sequences, NUM_MSG_SEQUENCES); + if (!load_v6_module(&ctx_cookie, &hCtx)) + { + DestroyWindow(parent_wnd); + return; + } + + /* this is a XP SP3 failure workaround */ + hwnd = CreateWindowExA(0, MONTHCAL_CLASSA, "foo", + WS_CHILD | WS_BORDER | WS_VISIBLE, + 0, 0, 100, 100, + parent_wnd, NULL, GetModuleHandleA(NULL), NULL); + if (!IsWindow(hwnd)) + { + win_skip("FIXME: failed to create Monthcal window.\n"); + unload_v6_module(ctx_cookie, hCtx); + DestroyWindow(parent_wnd); + return; + } + else + DestroyWindow(hwnd); + + test_hittest_v6(); + test_get_set_border(); + + unload_v6_module(ctx_cookie, hCtx); + DestroyWindow(parent_wnd); - ok_sequence(sequences, PARENT_SEQ_INDEX, destroy_parent_seq, "Destroy parent window", FALSE); } diff -Nru wine1.3-1.3.0/dlls/comctl32/treeview.c wine1.3-1.3.1/dlls/comctl32/treeview.c --- wine1.3-1.3.0/dlls/comctl32/treeview.c 2010-07-30 18:43:56.000000000 +0100 +++ wine1.3-1.3.1/dlls/comctl32/treeview.c 2010-08-20 18:23:50.000000000 +0100 @@ -33,7 +33,8 @@ * * missing styles: TVS_FULLROWSELECT, TVS_INFOTIP, TVS_RTLREADING, * - * missing item styles: TVIS_CUT, TVIS_EXPANDPARTIAL + * missing item styles: TVIS_CUT, TVIS_EXPANDPARTIAL, TVIS_EX_FLAT, + * TVIS_EX_DISABLED * * Make the insertion mark look right. * Scroll (instead of repaint) as much as possible. @@ -2142,6 +2143,13 @@ } } } + + if (tvItem->mask & TVIF_STATEEX) + { + FIXME("Extended item state not supported, returning 0.\n"); + tvItem->uStateEx = 0; + } + TRACE("item <%p>, txt %p, img %p, mask %x\n", wineItem, tvItem->pszText, &tvItem->iImage, tvItem->mask); @@ -4351,6 +4359,9 @@ switch (action) { + case TVGN_CARET|TVSI_NOSINGLEEXPAND: + FIXME("TVSI_NOSINGLEEXPAND specified.\n"); + /* Fall through */ case TVGN_CARET: prevSelect = infoPtr->selectedItem; @@ -5829,10 +5840,10 @@ /* Tree Verification ****************************************************/ static inline void -TREEVIEW_VerifyChildren(TREEVIEW_INFO *infoPtr, TREEVIEW_ITEM *item); +TREEVIEW_VerifyChildren(TREEVIEW_INFO *infoPtr, const TREEVIEW_ITEM *item); static inline void TREEVIEW_VerifyItemCommon(TREEVIEW_INFO *infoPtr, - TREEVIEW_ITEM *item) + const TREEVIEW_ITEM *item) { assert(infoPtr != NULL); assert(item != NULL); @@ -5871,7 +5882,7 @@ } static inline void -TREEVIEW_VerifyItem(TREEVIEW_INFO *infoPtr, TREEVIEW_ITEM *item) +TREEVIEW_VerifyItem(TREEVIEW_INFO *infoPtr, const TREEVIEW_ITEM *item) { assert(item != NULL); @@ -5887,9 +5898,9 @@ } static inline void -TREEVIEW_VerifyChildren(TREEVIEW_INFO *infoPtr, TREEVIEW_ITEM *item) +TREEVIEW_VerifyChildren(TREEVIEW_INFO *infoPtr, const TREEVIEW_ITEM *item) { - TREEVIEW_ITEM *child; + const TREEVIEW_ITEM *child; assert(item != NULL); for (child = item->firstChild; child != NULL; child = child->nextSibling) diff -Nru wine1.3-1.3.0/dlls/comdlg32/cdlg_De.rc wine1.3-1.3.1/dlls/comdlg32/cdlg_De.rc --- wine1.3-1.3.0/dlls/comdlg32/cdlg_De.rc 2010-07-30 18:43:56.000000000 +0100 +++ wine1.3-1.3.1/dlls/comdlg32/cdlg_De.rc 2010-08-20 18:23:50.000000000 +0100 @@ -46,7 +46,7 @@ DEFPUSHBUTTON "Öffnen", IDOK, 208, 6, 56, 14, BS_DEFPUSHBUTTON | WS_GROUP | WS_TABSTOP PUSHBUTTON "Abbrechen", IDCANCEL, 208, 24, 56, 14, WS_GROUP | WS_TABSTOP PUSHBUTTON "&Hilfe", pshHelp, 208, 46, 56, 14, WS_GROUP | WS_TABSTOP - CHECKBOX "&Schreibgeschützt", 1040, 208, 68, 50, 12, BS_AUTOCHECKBOX | WS_GROUP | WS_TABSTOP + CHECKBOX "Schreibgeschüt&zt", 1040, 208, 68, 50, 12, BS_AUTOCHECKBOX | WS_GROUP | WS_TABSTOP } @@ -68,7 +68,7 @@ DEFPUSHBUTTON "Speichern als", IDOK, 208, 6, 56, 14, BS_DEFPUSHBUTTON | WS_GROUP | WS_TABSTOP PUSHBUTTON "Abbrechen", IDCANCEL, 208, 24, 56, 14, WS_GROUP | WS_TABSTOP PUSHBUTTON "&Hilfe", pshHelp, 208, 46, 56, 14, WS_GROUP | WS_TABSTOP - CHECKBOX "&Schreibgeschützt", 1040, 208, 68, 50, 12, BS_AUTOCHECKBOX | WS_GROUP | WS_TABSTOP + CHECKBOX "Schreibgeschüt&zt", 1040, 208, 68, 50, 12, BS_AUTOCHECKBOX | WS_GROUP | WS_TABSTOP } @@ -162,7 +162,7 @@ LTEXT "Schrift&stil:",1089 ,108,3,44,9 COMBOBOX 1137,108,13,64,54, CBS_OWNERDRAWFIXED | CBS_HASSTRINGS | CBS_DISABLENOSCROLL | WS_VSCROLL | WS_TABSTOP | CBS_SIMPLE - LTEXT "Schrift&größe:",1090,179,3,30,9 + LTEXT "&Größe:",1090,179,3,30,9 COMBOBOX 1138,179,13,32,54, CBS_OWNERDRAWFIXED | CBS_HASSTRINGS | CBS_DISABLENOSCROLL | WS_VSCROLL | WS_TABSTOP | CBS_SIMPLE | CBS_SORT DEFPUSHBUTTON "OK",IDOK,218,6,40,14,WS_GROUP @@ -270,7 +270,7 @@ LTEXT "Datei&typen",IDC_FILETYPESTATIC,5,128,42,8, SS_NOTIFY COMBOBOX IDC_FILETYPE,54,126,155,53,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP - CONTROL "&Schreibgeschützt",IDC_OPENREADONLY,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,54,145,100,10 + CONTROL "Schreibgeschüt&zt",IDC_OPENREADONLY,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,54,145,100,10 DEFPUSHBUTTON "Ö&ffnen", IDOK,222,110,50,14 PUSHBUTTON "Abbrechen", IDCANCEL,222,128,50,14 diff -Nru wine1.3-1.3.0/dlls/comdlg32/fontdlg.c wine1.3-1.3.1/dlls/comdlg32/fontdlg.c --- wine1.3-1.3.0/dlls/comdlg32/fontdlg.c 2010-07-30 18:43:56.000000000 +0100 +++ wine1.3-1.3.1/dlls/comdlg32/fontdlg.c 2010-08-20 18:23:50.000000000 +0100 @@ -772,12 +772,12 @@ HFONT hfontprev; TEXTMETRICW tm; LPMEASUREITEMSTRUCT lpmi=(LPMEASUREITEMSTRUCT)lParam; - INT height = 0; + INT height = 0, cx; if (!himlTT) himlTT = ImageList_LoadImageW( COMDLG32_hInstance, MAKEINTRESOURCEW(38), TTBITMAP_XSIZE, 0, CLR_DEFAULT, IMAGE_BITMAP, 0); - ImageList_GetIconSize( himlTT, 0, &height); + ImageList_GetIconSize( himlTT, &cx, &height); lpmi->itemHeight = height + 2; /* use MAX of bitmap height and tm.tmHeight .*/ hdc=GetDC(hDlg); diff -Nru wine1.3-1.3.0/dlls/comdlg32/printdlg.c wine1.3-1.3.1/dlls/comdlg32/printdlg.c --- wine1.3-1.3.0/dlls/comdlg32/printdlg.c 2010-07-30 18:43:56.000000000 +0100 +++ wine1.3-1.3.1/dlls/comdlg32/printdlg.c 2010-08-20 18:23:50.000000000 +0100 @@ -3584,7 +3584,7 @@ return name; } -static void pagesetup_dump_dlg_struct(pagesetup_data *data) +static void pagesetup_dump_dlg_struct(const pagesetup_data *data) { if(TRACE_ON(commdlg)) { diff -Nru wine1.3-1.3.0/dlls/credui/credui_Sv.rc wine1.3-1.3.1/dlls/credui/credui_Sv.rc --- wine1.3-1.3.0/dlls/credui/credui_Sv.rc 2010-07-30 18:43:56.000000000 +0100 +++ wine1.3-1.3.1/dlls/credui/credui_Sv.rc 2010-08-20 18:23:50.000000000 +0100 @@ -35,8 +35,18 @@ CBS_NOINTEGRALHEIGHT | WS_TABSTOP,80,62,126,87 LTEXT "&Lsenord:",-1,8,80,72,12,SS_CENTERIMAGE EDITTEXT IDC_PASSWORD,80,80,126,12,ES_PASSWORD | ES_AUTOHSCROLL - CONTROL "&Remember my password",IDC_SAVE,"Button", + CONTROL "&Kom ihg lsenord",IDC_SAVE,"Button", BS_AUTOCHECKBOX | WS_TABSTOP,80,98,126,12 DEFPUSHBUTTON "OK",IDOK,97,128,50,14 PUSHBUTTON "Avbryt",IDCANCEL,156,128,50,14 END + +STRINGTABLE +{ + IDS_TITLEFORMAT "Anslut till %s" + IDS_MESSAGEFORMAT "Ansluter till %s" + IDS_INCORRECTPASSWORDTITLE "Inloggningen misslyckades" + IDS_INCORRECTPASSWORD "Kontrollera att anvndarnamn\noch lsenord stmmer." + IDS_CAPSLOCKONTITLE "Caps Lock r p" + IDS_CAPSLOCKON "Om Caps Lock r p kan det leda till att lsenordet skrivs in felaktigt.\n\nTryck Caps Lock p tangentbordet fr att sl av Caps Lock innan\ndu skriver in ditt lsenord." +} diff -Nru wine1.3-1.3.0/dlls/crypt32/chain.c wine1.3-1.3.1/dlls/crypt32/chain.c --- wine1.3-1.3.0/dlls/crypt32/chain.c 2010-07-30 18:43:56.000000000 +0100 +++ wine1.3-1.3.1/dlls/crypt32/chain.c 2010-08-20 18:23:50.000000000 +0100 @@ -23,6 +23,7 @@ #define CERT_CHAIN_PARA_HAS_EXTRA_FIELDS #define CERT_REVOCATION_PARA_HAS_EXTRA_FIELDS #include "wincrypt.h" +#include "wininet.h" #include "wine/debug.h" #include "wine/unicode.h" #include "crypt32_private.h" @@ -1343,7 +1344,7 @@ return policies; } -static void CRYPT_CheckPolicies(CERT_POLICIES_INFO *policies, CERT_INFO *cert, +static void CRYPT_CheckPolicies(const CERT_POLICIES_INFO *policies, CERT_INFO *cert, DWORD *errorStatus) { DWORD i; @@ -3001,7 +3002,7 @@ return TRUE; } -static BOOL match_dns_to_subject_alt_name(PCERT_EXTENSION ext, +static BOOL match_dns_to_subject_alt_name(const CERT_EXTENSION *ext, LPCWSTR server_name) { BOOL matches = FALSE; @@ -3069,7 +3070,7 @@ return matches; } -static BOOL find_matching_domain_component(CERT_NAME_INFO *name, +static BOOL find_matching_domain_component(const CERT_NAME_INFO *name, LPCWSTR component) { BOOL matches = FALSE; @@ -3080,7 +3081,7 @@ if (!strcmp(szOID_DOMAIN_COMPONENT, name->rgRDN[i].rgRDNAttr[j].pszObjId)) { - PCERT_RDN_ATTR attr; + const CERT_RDN_ATTR *attr; attr = &name->rgRDN[i].rgRDNAttr[j]; /* Compare with memicmpW rather than strcmpiW in order to avoid @@ -3088,7 +3089,7 @@ * must match one domain component attribute's entire string * value with a case-insensitive match. */ - matches = !memicmpW(component, (LPWSTR)attr->Value.pbData, + matches = !memicmpW(component, (LPCWSTR)attr->Value.pbData, attr->Value.cbData / sizeof(WCHAR)); } return matches; @@ -3149,7 +3150,7 @@ return matches; } -static BOOL match_common_name(LPCWSTR server_name, PCERT_RDN_ATTR nameAttr) +static BOOL match_common_name(LPCWSTR server_name, const CERT_RDN_ATTR *nameAttr) { LPCWSTR allowed = (LPCWSTR)nameAttr->Value.pbData; LPCWSTR allowed_component = allowed; @@ -3331,7 +3332,8 @@ if (sslPara && sslPara->u.cbSize >= sizeof(HTTPSPolicyCallbackData)) { if (sslPara->dwAuthType == AUTHTYPE_SERVER && - sslPara->pwszServerName) + sslPara->pwszServerName && + !(sslPara->fdwChecks & SECURITY_FLAG_IGNORE_CERT_CN_INVALID)) { PCCERT_CONTEXT cert; PCERT_EXTENSION altNameExt; diff -Nru wine1.3-1.3.0/dlls/crypt32/collectionstore.c wine1.3-1.3.1/dlls/crypt32/collectionstore.c --- wine1.3-1.3.0/dlls/crypt32/collectionstore.c 2010-07-30 18:43:56.000000000 +0100 +++ wine1.3-1.3.1/dlls/crypt32/collectionstore.c 2010-08-20 18:23:50.000000000 +0100 @@ -134,7 +134,7 @@ * Assumes the collection store's lock is held. */ static void *CRYPT_CollectionAdvanceEnum(PWINE_COLLECTIONSTORE store, - PWINE_STORE_LIST_ENTRY storeEntry, PCONTEXT_FUNCS contextFuncs, + PWINE_STORE_LIST_ENTRY storeEntry, const CONTEXT_FUNCS *contextFuncs, PCWINE_CONTEXT_INTERFACE contextInterface, void *pPrev, size_t contextSize) { void *ret, *child; @@ -165,7 +165,7 @@ /* We always want the same function pointers (from certs, crls) * in the next store, so use the same offset into the next store. */ - size_t offset = (LPBYTE)contextFuncs - (LPBYTE)storeEntry->store; + size_t offset = (const BYTE *)contextFuncs - (LPBYTE)storeEntry->store; PWINE_STORE_LIST_ENTRY storeNextEntry = LIST_ENTRY(storeNext, WINE_STORE_LIST_ENTRY, entry); PCONTEXT_FUNCS storeNextContexts = diff -Nru wine1.3-1.3.0/dlls/crypt32/crypt32_private.h wine1.3-1.3.1/dlls/crypt32/crypt32_private.h --- wine1.3-1.3.0/dlls/crypt32/crypt32_private.h 2010-07-30 18:43:56.000000000 +0100 +++ wine1.3-1.3.1/dlls/crypt32/crypt32_private.h 2010-08-20 18:23:50.000000000 +0100 @@ -106,7 +106,7 @@ * If CRYPT_ENCODE_ALLOC_FLAG is set in dwFlags, *pbEncoded will be set to a * pointer to the newly allocated memory. */ -BOOL CRYPT_EncodeEnsureSpace(DWORD dwFlags, PCRYPT_ENCODE_PARA pEncodePara, +BOOL CRYPT_EncodeEnsureSpace(DWORD dwFlags, const CRYPT_ENCODE_PARA *pEncodePara, BYTE *pbEncoded, DWORD *pcbEncoded, DWORD bytesNeeded); BOOL CRYPT_AsnDecodePKCSDigestedData(const BYTE *pbEncoded, DWORD cbEncoded, diff -Nru wine1.3-1.3.0/dlls/crypt32/decode.c wine1.3-1.3.1/dlls/crypt32/decode.c --- wine1.3-1.3.0/dlls/crypt32/decode.c 2010-07-30 18:43:56.000000000 +0100 +++ wine1.3-1.3.1/dlls/crypt32/decode.c 2010-08-20 18:23:50.000000000 +0100 @@ -205,7 +205,7 @@ * pointer to the newly allocated memory. */ static BOOL CRYPT_DecodeEnsureSpace(DWORD dwFlags, - PCRYPT_DECODE_PARA pDecodePara, void *pvStructInfo, DWORD *pcbStructInfo, + const CRYPT_DECODE_PARA *pDecodePara, void *pvStructInfo, DWORD *pcbStructInfo, DWORD bytesNeeded) { BOOL ret = TRUE; @@ -232,7 +232,7 @@ return ret; } -static void CRYPT_FreeSpace(PCRYPT_DECODE_PARA pDecodePara, LPVOID pv) +static void CRYPT_FreeSpace(const CRYPT_DECODE_PARA *pDecodePara, LPVOID pv) { if (pDecodePara && pDecodePara->pfnFree) pDecodePara->pfnFree(pv); @@ -611,7 +611,7 @@ */ static BOOL CRYPT_AsnDecodeArray(const struct AsnArrayDescriptor *arrayDesc, const BYTE *pbEncoded, DWORD cbEncoded, DWORD dwFlags, - PCRYPT_DECODE_PARA pDecodePara, void *pvStructInfo, DWORD *pcbStructInfo, + const CRYPT_DECODE_PARA *pDecodePara, void *pvStructInfo, DWORD *pcbStructInfo, DWORD *pcbDecoded) { BOOL ret = TRUE; diff -Nru wine1.3-1.3.0/dlls/crypt32/encode.c wine1.3-1.3.1/dlls/crypt32/encode.c --- wine1.3-1.3.0/dlls/crypt32/encode.c 2010-07-30 18:43:56.000000000 +0100 +++ wine1.3-1.3.1/dlls/crypt32/encode.c 2010-08-20 18:23:50.000000000 +0100 @@ -100,7 +100,7 @@ LPCSTR lpszStructType, const void *pvStructInfo, DWORD dwFlags, PCRYPT_ENCODE_PARA pEncodePara, BYTE *pbEncoded, DWORD *pcbEncoded); -BOOL CRYPT_EncodeEnsureSpace(DWORD dwFlags, PCRYPT_ENCODE_PARA pEncodePara, +BOOL CRYPT_EncodeEnsureSpace(DWORD dwFlags, const CRYPT_ENCODE_PARA *pEncodePara, BYTE *pbEncoded, DWORD *pcbEncoded, DWORD bytesNeeded) { BOOL ret = TRUE; @@ -910,7 +910,7 @@ } static BOOL CRYPT_AsnEncodeStringCoerce(const CERT_NAME_VALUE *value, - BYTE tag, DWORD dwFlags, PCRYPT_ENCODE_PARA pEncodePara, BYTE *pbEncoded, + BYTE tag, DWORD dwFlags, const CRYPT_ENCODE_PARA *pEncodePara, BYTE *pbEncoded, DWORD *pcbEncoded) { BOOL ret = TRUE; @@ -939,7 +939,7 @@ } static BOOL CRYPT_AsnEncodeBMPString(const CERT_NAME_VALUE *value, - DWORD dwFlags, PCRYPT_ENCODE_PARA pEncodePara, BYTE *pbEncoded, + DWORD dwFlags, const CRYPT_ENCODE_PARA *pEncodePara, BYTE *pbEncoded, DWORD *pcbEncoded) { BOOL ret = TRUE; @@ -979,7 +979,7 @@ } static BOOL CRYPT_AsnEncodeUTF8String(const CERT_NAME_VALUE *value, - DWORD dwFlags, PCRYPT_ENCODE_PARA pEncodePara, BYTE *pbEncoded, + DWORD dwFlags, const CRYPT_ENCODE_PARA *pEncodePara, BYTE *pbEncoded, DWORD *pcbEncoded) { BOOL ret = TRUE; @@ -1940,7 +1940,7 @@ } static BOOL CRYPT_AsnEncodeUnicodeStringCoerce(const CERT_NAME_VALUE *value, - BYTE tag, DWORD dwFlags, PCRYPT_ENCODE_PARA pEncodePara, BYTE *pbEncoded, + BYTE tag, DWORD dwFlags, const CRYPT_ENCODE_PARA *pEncodePara, BYTE *pbEncoded, DWORD *pcbEncoded) { BOOL ret = TRUE; @@ -1972,7 +1972,7 @@ return ret; } -static void CRYPT_FreeSpace(PCRYPT_ENCODE_PARA pEncodePara, LPVOID pv) +static void CRYPT_FreeSpace(const CRYPT_ENCODE_PARA *pEncodePara, LPVOID pv) { if (pEncodePara && pEncodePara->pfnFree) pEncodePara->pfnFree(pv); @@ -1981,7 +1981,7 @@ } static BOOL CRYPT_AsnEncodeNumericString(const CERT_NAME_VALUE *value, - DWORD dwFlags, PCRYPT_ENCODE_PARA pEncodePara, BYTE *pbEncoded, + DWORD dwFlags, const CRYPT_ENCODE_PARA *pEncodePara, BYTE *pbEncoded, DWORD *pcbEncoded) { BOOL ret = TRUE; @@ -2035,7 +2035,7 @@ } static BOOL CRYPT_AsnEncodePrintableString(const CERT_NAME_VALUE *value, - DWORD dwFlags, PCRYPT_ENCODE_PARA pEncodePara, BYTE *pbEncoded, + DWORD dwFlags, const CRYPT_ENCODE_PARA *pEncodePara, BYTE *pbEncoded, DWORD *pcbEncoded) { BOOL ret = TRUE; @@ -2082,7 +2082,7 @@ } static BOOL CRYPT_AsnEncodeIA5String(const CERT_NAME_VALUE *value, - DWORD dwFlags, PCRYPT_ENCODE_PARA pEncodePara, BYTE *pbEncoded, + DWORD dwFlags, const CRYPT_ENCODE_PARA *pEncodePara, BYTE *pbEncoded, DWORD *pcbEncoded) { BOOL ret = TRUE; @@ -2129,7 +2129,7 @@ } static BOOL CRYPT_AsnEncodeUniversalString(const CERT_NAME_VALUE *value, - DWORD dwFlags, PCRYPT_ENCODE_PARA pEncodePara, BYTE *pbEncoded, + DWORD dwFlags, const CRYPT_ENCODE_PARA *pEncodePara, BYTE *pbEncoded, DWORD *pcbEncoded) { BOOL ret = TRUE; diff -Nru wine1.3-1.3.0/dlls/crypt32/message.c wine1.3-1.3.1/dlls/crypt32/message.c --- wine1.3-1.3.0/dlls/crypt32/message.c 2010-07-30 18:43:56.000000000 +0100 +++ wine1.3-1.3.1/dlls/crypt32/message.c 2010-08-20 18:23:50.000000000 +0100 @@ -194,13 +194,13 @@ if (ppSignerCert) *ppSignerCert = NULL; - if (pcbDecoded) - *pcbDecoded = 0; if (!pVerifyPara || pVerifyPara->cbSize != sizeof(CRYPT_VERIFY_MESSAGE_PARA) || GET_CMSG_ENCODING_TYPE(pVerifyPara->dwMsgAndCertEncodingType) != PKCS_7_ASN_ENCODING) { + if(pcbDecoded) + *pcbDecoded = 0; SetLastError(E_INVALIDARG); return FALSE; } @@ -246,6 +246,8 @@ } CryptMsgClose(msg); } + if(!ret && pcbDecoded) + *pcbDecoded = 0; TRACE("returning %d\n", ret); return ret; } diff -Nru wine1.3-1.3.0/dlls/crypt32/msg.c wine1.3-1.3.1/dlls/crypt32/msg.c --- wine1.3-1.3.0/dlls/crypt32/msg.c 2010-07-30 18:43:56.000000000 +0100 +++ wine1.3-1.3.1/dlls/crypt32/msg.c 2010-08-20 18:23:50.000000000 +0100 @@ -145,7 +145,7 @@ return ret; } -static BOOL CRYPT_EncodeDataContentInfoHeader(CDataEncodeMsg *msg, +static BOOL CRYPT_EncodeDataContentInfoHeader(const CDataEncodeMsg *msg, CRYPT_DATA_BLOB *header) { BOOL ret; @@ -623,7 +623,7 @@ PCERT_BLOB rgAttrCertEncoded; } CMSG_SIGNED_ENCODE_INFO_WITH_CMS, *PCMSG_SIGNED_ENCODE_INFO_WITH_CMS; -static BOOL CRYPT_IsValidSigner(CMSG_SIGNER_ENCODE_INFO_WITH_CMS *signer) +static BOOL CRYPT_IsValidSigner(const CMSG_SIGNER_ENCODE_INFO_WITH_CMS *signer) { if (signer->cbSize != sizeof(CMSG_SIGNER_ENCODE_INFO) && signer->cbSize != sizeof(CMSG_SIGNER_ENCODE_INFO_WITH_CMS)) @@ -720,7 +720,7 @@ } static BOOL CRYPT_ConstructBlobArray(DWORD *outCBlobs, - PCRYPT_DATA_BLOB *outPBlobs, DWORD cBlobs, const PCRYPT_DATA_BLOB pBlobs) + PCRYPT_DATA_BLOB *outPBlobs, DWORD cBlobs, const CRYPT_DATA_BLOB *pBlobs) { BOOL ret = TRUE; @@ -1647,7 +1647,7 @@ } static BOOL CDecodeMsg_DecodeSignedContent(CDecodeMsg *msg, - CRYPT_DER_BLOB *blob) + const CRYPT_DER_BLOB *blob) { BOOL ret; CRYPT_SIGNED_INFO *signedInfo; @@ -1666,7 +1666,7 @@ * It doesn't just use msg's type, to allow a recursive call from an implicitly * typed message once the outer content info has been decoded. */ -static BOOL CDecodeMsg_DecodeContent(CDecodeMsg *msg, CRYPT_DER_BLOB *blob, +static BOOL CDecodeMsg_DecodeContent(CDecodeMsg *msg, const CRYPT_DER_BLOB *blob, DWORD type) { BOOL ret; diff -Nru wine1.3-1.3.0/dlls/crypt32/object.c wine1.3-1.3.1/dlls/crypt32/object.c --- wine1.3-1.3.0/dlls/crypt32/object.c 2010-07-30 18:43:56.000000000 +0100 +++ wine1.3-1.3.1/dlls/crypt32/object.c 2010-08-20 18:23:50.000000000 +0100 @@ -1170,7 +1170,7 @@ static const WCHAR colonCrlf[] = { ':','\r','\n',0 }; static BOOL CRYPT_FormatAltNameEntry(DWORD dwFormatStrType, DWORD indentLevel, - CERT_ALT_NAME_ENTRY *entry, LPWSTR str, DWORD *pcbStr) + const CERT_ALT_NAME_ENTRY *entry, LPWSTR str, DWORD *pcbStr) { BOOL ret; WCHAR buf[MAX_STRING_RESOURCE_LEN]; @@ -1354,7 +1354,7 @@ } static BOOL CRYPT_FormatAltNameInfo(DWORD dwFormatStrType, DWORD indentLevel, - CERT_ALT_NAME_INFO *name, LPWSTR str, DWORD *pcbStr) + const CERT_ALT_NAME_INFO *name, LPWSTR str, DWORD *pcbStr) { DWORD i, size, bytesNeeded = 0; BOOL ret = TRUE; @@ -1437,7 +1437,7 @@ } static BOOL CRYPT_FormatCertIssuer(DWORD dwFormatStrType, - CERT_ALT_NAME_INFO *issuer, LPWSTR str, DWORD *pcbStr) + const CERT_ALT_NAME_INFO *issuer, LPWSTR str, DWORD *pcbStr) { WCHAR buf[MAX_STRING_RESOURCE_LEN]; DWORD bytesNeeded, sepLen; diff -Nru wine1.3-1.3.0/dlls/crypt32/str.c wine1.3-1.3.1/dlls/crypt32/str.c --- wine1.3-1.3.0/dlls/crypt32/str.c 2010-07-30 18:43:56.000000000 +0100 +++ wine1.3-1.3.1/dlls/crypt32/str.c 2010-08-20 18:23:50.000000000 +0100 @@ -970,7 +970,7 @@ } static DWORD cert_get_name_from_rdn_attr(DWORD encodingType, - PCERT_NAME_BLOB name, LPCSTR oid, LPWSTR pszNameString, DWORD cchNameString) + const CERT_NAME_BLOB *name, LPCSTR oid, LPWSTR pszNameString, DWORD cchNameString) { CERT_NAME_INFO *nameInfo; DWORD bytes = 0, ret = 0; diff -Nru wine1.3-1.3.0/dlls/crypt32/tests/chain.c wine1.3-1.3.1/dlls/crypt32/tests/chain.c --- wine1.3-1.3.0/dlls/crypt32/tests/chain.c 2010-07-30 18:43:56.000000000 +0100 +++ wine1.3-1.3.1/dlls/crypt32/tests/chain.c 2010-08-20 18:23:50.000000000 +0100 @@ -24,6 +24,7 @@ #include #include #include +#include #include "wine/test.h" @@ -4198,6 +4199,10 @@ sslPolicyPara.pwszServerName = a_dot_b_dot_winehq_dot_org; checkChainPolicyStatus(CERT_CHAIN_POLICY_SSL, engine, &winehqPolicyCheckWithoutMatchingName, 0, &oct2007, &policyPara); + /* When specifying to ignore name mismatch: match */ + sslPolicyPara.fdwChecks |= SECURITY_FLAG_IGNORE_CERT_CN_INVALID; + checkChainPolicyStatus(CERT_CHAIN_POLICY_SSL, engine, + &winehqPolicyCheckWithMatchingName, 0, &oct2007, &policyPara); CertFreeCertificateChainEngine(engine); CertCloseStore(testRoot, 0); } diff -Nru wine1.3-1.3.0/dlls/cryptui/cryptui_En.rc wine1.3-1.3.1/dlls/cryptui/cryptui_En.rc --- wine1.3-1.3.0/dlls/cryptui/cryptui_En.rc 2010-07-30 18:43:56.000000000 +0100 +++ wine1.3-1.3.1/dlls/cryptui/cryptui_En.rc 2010-08-20 18:23:50.000000000 +0100 @@ -118,10 +118,10 @@ IDS_WARN_REMOVE_PLURAL_DEFAULT "Are you sure you want to remove these certificates?" IDS_CERT_MGR "Certificates" IDS_FRIENDLY_NAME_NONE "" - IDS_PURPOSE_SERVER_AUTH "Ensures the identify of a remote computer" + IDS_PURPOSE_SERVER_AUTH "Ensures the identity of a remote computer" IDS_PURPOSE_CLIENT_AUTH "Proves your identity to a remote computer" IDS_PURPOSE_CODE_SIGNING "Ensures software came from software publisher\nProtects software from alteration after publication" - IDS_PURPOSE_EMAIL_PROTECTION "Protects e-mail messges" + IDS_PURPOSE_EMAIL_PROTECTION "Protects e-mail messages" IDS_PURPOSE_IPSEC "Allows secure communication over the Internet" IDS_PURPOSE_TIMESTAMP_SIGNING "Allows data to be signed with the current time" IDS_PURPOSE_CTL_USAGE_SIGNING "Allows you to digitally sign a certificate trust list" diff -Nru wine1.3-1.3.0/dlls/cryptui/cryptui_Sv.rc wine1.3-1.3.1/dlls/cryptui/cryptui_Sv.rc --- wine1.3-1.3.0/dlls/cryptui/cryptui_Sv.rc 1970-01-01 01:00:00.000000000 +0100 +++ wine1.3-1.3.1/dlls/cryptui/cryptui_Sv.rc 2010-08-20 18:23:50.000000000 +0100 @@ -0,0 +1,466 @@ +/* + * cryptui dll Swedish resources + * + * Copyright 2010 Anders Jonsson + * + * 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 "cryptuires.h" + +#pragma code_page(65001) + +LANGUAGE LANG_SWEDISH, SUBLANG_NEUTRAL + +STRINGTABLE +{ + IDS_CERTIFICATE "Certifikat" + IDS_CERTIFICATEINFORMATION "Certifikatsinformation" + IDS_CERT_INFO_BAD_SIG "Detta certifikat har en ogiltig signatur. Certifikatet kan ha ändrats eller skadats." + IDS_CERT_INFO_UNTRUSTED_CA "Detta rot-certifikat är inte betrott. För att lita på det, lägg till det till ditt systems betrodda rot-certifikatlager." + IDS_CERT_INFO_UNTRUSTED_ROOT "Detta certifikat kunde inte valideras till ett betrott rot-certifikat." + IDS_CERT_INFO_PARTIAL_CHAIN "Detta certifikats utfärdare kunde inte hittas." + IDS_CERT_INFO_BAD_PURPOSES "Alla avsedda syften för detta certifikat kunde inte valideras." + IDS_CERT_INFO_PURPOSES "Detta certifikat är avsett för följande syften:" + IDS_SUBJECT_HEADING "Utfärdat till: " + IDS_ISSUER_HEADING "Utfärdat av: " + IDS_VALID_FROM "Giltigt från " + IDS_VALID_TO " till " + IDS_CERTIFICATE_BAD_SIGNATURE "Detta certifikat har en ogiltig signatur." + IDS_CERTIFICATE_BAD_TIME "Detta certifikat har gått ut eller är ännu inte giltigt." + IDS_CERTIFICATE_BAD_TIMENEST "Detta certifikats giltighetsperiod är längre än utfärdarens." + IDS_CERTIFICATE_REVOKED "Detta certifikat återkallades av sin utfärdare." + IDS_CERTIFICATE_VALID "Detta certifikat är OK." + IDS_FIELD "Fält" + IDS_VALUE "Värde" + IDS_FIELDS_ALL "" + IDS_FIELDS_V1 "Enbart Version 1-fält" + IDS_FIELDS_EXTENSIONS "Enbart tillägg" + IDS_FIELDS_CRITICAL_EXTENSIONS "Enbart kritiska tillägg" + IDS_FIELDS_PROPERTIES "Enbart egenskaper" + IDS_FIELD_VERSION "Version" + IDS_FIELD_SERIAL_NUMBER "Serienummer" + IDS_FIELD_ISSUER "Utfärdare" + IDS_FIELD_VALID_FROM "Giltigt från" + IDS_FIELD_VALID_TO "Giltigt till" + IDS_FIELD_SUBJECT "Ämne" + IDS_FIELD_PUBLIC_KEY "Offentlig nyckel" + IDS_FIELD_PUBLIC_KEY_FORMAT "%s (%d bitar)" + IDS_PROP_HASH "SHA1 hash" + IDS_PROP_ENHKEY_USAGE "Utökad nyckelanvändning (egenskap)" + IDS_PROP_FRIENDLY_NAME "Vänligt namn" + IDS_PROP_DESCRIPTION "Beskrivning" + IDS_CERTIFICATE_PROPERTIES "Certifikats-egenskaper" + IDS_CERTIFICATE_PURPOSE_ERROR "Var god fyll i en OID på formen 1.2.3.4" + IDS_CERTIFICATE_PURPOSE_EXISTS "Den OID du angav existerar redan." + IDS_SELECT_STORE_TITLE "Välj certifikatlager" + IDS_SELECT_STORE "Var god välj ett certifikatlager." + IDS_IMPORT_WIZARD "Guiden för import av certifikat" + IDS_IMPORT_TYPE_MISMATCH "Filen innehåller objekt som inte uppfyller de givna kriterierna. Var god välj en annan fil." + IDS_IMPORT_FILE_TITLE "Fil att importera" + IDS_IMPORT_FILE_SUBTITLE "Ange filen du vill importera." + IDS_IMPORT_STORE_TITLE "Certifikatlager" + IDS_IMPORT_STORE_SUBTITLE "Certifikatlager är samlingar av certifikat, listor över återkallade certifikat, samt listor över betrodda certifikat." + IDS_IMPORT_FILTER_CERT "X.509-certifikat (*.cer; *.crt)" + IDS_IMPORT_FILTER_PFX "Personal Information Exchange (*.pfx; *.p12)" + IDS_IMPORT_FILTER_CRL "Lista över återkallade certifikat (*.crl)" + IDS_IMPORT_FILTER_CTL "Lista över betrodda certifikat (*.stl)" + IDS_IMPORT_FILTER_SERIALIZED_STORE "Microsoft Serialized Certificate Store (*.sst)" + IDS_IMPORT_FILTER_CMS "CMS/PKCS #7-meddelanden (*.spc; *.p7b)" + IDS_IMPORT_FILTER_ALL "Alla filer (*.*)" + IDS_IMPORT_EMPTY_FILE "Var god välj en fil." + IDS_IMPORT_BAD_FORMAT "Filformatet kändes inte igen. Var god välj en annan fil." + IDS_IMPORT_OPEN_FAILED "Kunde inte öppna " + IDS_IMPORT_DEST_DETERMINED "Bestämd av programmet" + IDS_IMPORT_SELECT_STORE "Var god välj ett lager" + IDS_IMPORT_STORE_SELECTION "Certifikatlager valt" + IDS_IMPORT_DEST_AUTOMATIC "Automatiskt bestämt av programmet" + IDS_IMPORT_FILE "Fil" + IDS_IMPORT_CONTENT "Innehåll" + IDS_IMPORT_CONTENT_CERT "Certifikat" + IDS_IMPORT_CONTENT_CRL "Lista över återkallade certifikat" + IDS_IMPORT_CONTENT_CTL "Lista över betrodda certifikat" + IDS_IMPORT_CONTENT_CMS "CMS/PKCS #7-meddelande" + IDS_IMPORT_CONTENT_PFX "Personal Information Exchange" + IDS_IMPORT_CONTENT_STORE "Certifikatlager" + IDS_IMPORT_SUCCEEDED "Importen lyckades." + IDS_IMPORT_FAILED "Importen misslyckades." + IDS_WIZARD_TITLE_FONT "Arial" + IDS_PURPOSE_ALL "" + IDS_PURPOSE_ADVANCED "" + IDS_SUBJECT_COLUMN "Utfärdat till" + IDS_ISSUER_COLUMN "Utfärdat av" + IDS_EXPIRATION_COLUMN "Utgångsdatum" + IDS_FRIENDLY_NAME_COLUMN "Vänligt namn" + IDS_ALLOWED_PURPOSE_ALL "" + IDS_ALLOWED_PURPOSE_NONE "" + IDS_WARN_REMOVE_MY "Du kommer inte längre kunna dekryptera eller signera meddelanden med detta certifikat.\nÄr du säker du vill ta bort detta certifikat?" + IDS_WARN_REMOVE_PLURAL_MY "Du kommer inte längre kunna dekryptera eller signera meddelanden med dessa certifikat.\nÄr du säker du vill ta bort dessa certifikat?" + IDS_WARN_REMOVE_ADDRESSBOOK "Du kommer inte längre kunna kryptera meddelanden med detta certifikat, eller verifiera meddelanden som är signerade med det.\nÄr du säker du vill ta bort detta certifikat?" + IDS_WARN_REMOVE_PLURAL_ADDRESSBOOK "Du kommer inte längre kunna kryptera meddelanden med dessa certifikat, eller verifiera meddelanden som är signerade med dem.\nÄr du säker du vill ta bort dessa certifikat?" + IDS_WARN_REMOVE_CA "Certifikat utfärdade av denna certifieringsauktoritet kommer inte längre vara betrodda.\nÄr du säker du vill ta bort detta certifikat?" + IDS_WARN_REMOVE_PLURAL_CA "Certifikat utfärdade av dessa certifieringsauktoriteter kommer inte längre vara betrodda.\nÄr du säker du vill ta bort dessa certifikat?" + IDS_WARN_REMOVE_ROOT "Certifikat utfärdade av denna rot-certifieringsauktoritet, eller av någon av dess utfärdade certifieringsauktoriteter kommer inte längre vara betrodda.\nÄr du säker du vill ta bort detta betrodda rot-certifikat?" + IDS_WARN_REMOVE_PLURAL_ROOT "Certifikat utfärdade av dessa rot-certifieringsauktoriteter, eller av någon av deras utfärdade certifieringsauktoriteter kommer inte längre vara betrodda.\nÄr du säker du vill ta bort dessa betrodda rot-certifikat?" + IDS_WARN_REMOVE_TRUSTEDPUBLISHER "Mjukvara signerad av denna utgivare kommer inte längre vara betrodd.\nÄr du säker du vill ta bort detta certifikat?" + IDS_WARN_REMOVE_PLURAL_TRUSTEDPUBLISHER "Mjukvara signerad av dessa utgivare kommer inte längre vara betrodd.\nÄr du säker du vill ta bort dessa certifikat?" + IDS_WARN_REMOVE_DEFAULT "Är du säker du vill ta bort detta certifikat?" + IDS_WARN_REMOVE_PLURAL_DEFAULT "Är du säker du vill ta bort dessa certifikat?" + IDS_CERT_MGR "Certifikat" + IDS_FRIENDLY_NAME_NONE "" + IDS_PURPOSE_SERVER_AUTH "Säkerställer identiteten av en fjärrdator" + IDS_PURPOSE_CLIENT_AUTH "Bevisar din identitet för en fjärrdator" + IDS_PURPOSE_CODE_SIGNING "Säkerställer att mjukvara kommer från ursprunglig utgivare\nSkyddar mjukvara från ändring efter utgivning" + IDS_PURPOSE_EMAIL_PROTECTION "Skyddar e-postmeddelanden" + IDS_PURPOSE_IPSEC "Möjliggör säker kommunikation över internet" + IDS_PURPOSE_TIMESTAMP_SIGNING "Möjliggör att signera data med aktuell tid" + IDS_PURPOSE_CTL_USAGE_SIGNING "Tillåter dig att digitalt signera en lista över betrodda certifikat" + IDS_PURPOSE_EFS "Möjliggör för data på disk att krypteras" + IDS_PURPOSE_EFS_RECOVERY "Filåterskapande" + IDS_PURPOSE_WHQL "Verifiering av Windows-hårdvarudrivrutin" + IDS_PURPOSE_NT5 "Verifiering av Windows-systemkomponent" + IDS_PURPOSE_OEM_WHQL "Verifiering av OEM Windows-systemkomponent" + IDS_PURPOSE_EMBEDDED_NT "Verifiering av inbäddad Windows-systemkomponent" + IDS_PURPOSE_ROOT_LIST_SIGNER "Signerare av rotlista" + IDS_PURPOSE_QUALIFIED_SUBORDINATION "Kvalifierad underordning" + IDS_PURPOSE_KEY_RECOVERY "Nyckelåterställning" + IDS_PURPOSE_DOCUMENT_SIGNING "Dokumentsignering" + IDS_PURPOSE_LIFETIME_SIGNING "Livstidssignering" + IDS_PURPOSE_DRM "Digitala rättigheter" + IDS_PURPOSE_LICENSES "Licenser för nyckelpaket" + IDS_PURPOSE_LICENSE_SERVER "Verifiering av licensserver" + IDS_PURPOSE_ENROLLMENT_AGENT "Agent för certifikatförfrågningar" + IDS_PURPOSE_SMARTCARD_LOGON "Smart Card-inloggning" + IDS_PURPOSE_CA_EXCHANGE "Arkivering av privat nyckel" + IDS_PURPOSE_KEY_RECOVERY_AGENT "Agent för nyckelåterställande" + IDS_PURPOSE_DS_EMAIL_REPLICATION "Kopiering av e-post från katalogtjänster" + IDS_EXPORT_WIZARD "Guiden för export av certifikat" + IDS_EXPORT_FORMAT_TITLE "Exportera format" + IDS_EXPORT_FORMAT_SUBTITLE "Välj format i vilket innehållet kommer sparas." + IDS_EXPORT_FILE_TITLE "Exportera filnamn" + IDS_EXPORT_FILE_SUBTITLE "Ange namnet på filen i vilken innehållet kommer sparas." + IDS_EXPORT_FILE_EXISTS "Den angivna filen existerar redan. Vill du ersätta den?" + IDS_EXPORT_FILTER_CERT "DER-kodad binär X.509 (*.cer)" + IDS_EXPORT_FILTER_BASE64_CERT "Base64-kodad X.509 (*.cer)" + IDS_EXPORT_FILTER_CRL "Lista över återkallade certifikat (*.crl)" + IDS_EXPORT_FILTER_CTL "Lista över betrodda certifikat (*.stl)" + IDS_EXPORT_FILTER_CMS "CMS/PKCS #7-meddelanden (*.p7b)" + IDS_EXPORT_FILTER_PFX "Personal Information Exchange (*.pfx)" + IDS_EXPORT_FILTER_SERIALIZED_CERT_STORE "Serialiserat certifikatlager (*.sst)" + IDS_EXPORT_FORMAT "Filformat" + IDS_EXPORT_INCLUDE_CHAIN "Inkludera alla certifikat i certifikatsökvägen" + IDS_EXPORT_KEYS "Exportera nycklar" + IDS_YES "Ja" + IDS_NO "Nej" + IDS_EXPORT_SUCCEEDED "Exporten lyckades." + IDS_EXPORT_FAILED "Exporten misslyckades." + IDS_EXPORT_PRIVATE_KEY_TITLE "Exportera privat nyckel" + IDS_EXPORT_PRIVATE_KEY_SUBTITLE "Certifikatet innehåller en privat nyckel som kan exporteras tillsammans med certifikatet." + IDS_EXPORT_PASSWORD_TITLE "Ange lösenord" + IDS_EXPORT_PASSWORD_SUBTITLE "Du kan lösenordsskydda en privat nyckel." + IDS_EXPORT_PASSWORD_MISMATCH "Lösenorden matchar inte." + IDS_EXPORT_PRIVATE_KEY_UNAVAILABLE "Obs: Den privata nyckeln för detta certifikat kunde inte öppnas." + IDS_EXPORT_PRIVATE_KEY_NON_EXPORTABLE "Obs: Den privata nyckeln för detta certifikat kan inte exporteras." +} + +IDD_GENERAL DIALOG 0, 0, 255, 236 +CAPTION "Allmänt" +STYLE WS_VISIBLE +FONT 8, "MS Shell Dlg" +BEGIN + CONTROL "", -1, "Static", WS_BORDER|SS_WHITERECT, 6,10,241,200 + CONTROL "", IDC_CERTIFICATE_ICON,"RichEdit20W", + ES_READONLY|WS_DISABLED,8,11,26,26 + CONTROL "", IDC_CERTIFICATE_INFO,"RichEdit20W", + ES_READONLY|WS_DISABLED,34,11,212,26 + CONTROL "", -1, "Static", SS_BLACKFRAME, 16,37,222,1 + CONTROL "", IDC_CERTIFICATE_STATUS,"RichEdit20W", + ES_READONLY|ES_MULTILINE,8,38,238,78 + CONTROL "", -1, "Static", SS_BLACKFRAME, 16,116,222,1 + CONTROL "", IDC_CERTIFICATE_NAMES,"RichEdit20W", + ES_READONLY|ES_MULTILINE|WS_DISABLED,8,118,238,90 + PUSHBUTTON "&Installera certifikat...", IDC_ADDTOSTORE,103,216,70,14 + PUSHBUTTON "Utfärdarens &utlåtande", IDC_ISSUERSTATEMENT,177,216,70,14 +END + +IDD_DETAIL DIALOG 0, 0, 255, 236 +CAPTION "Detaljer" +STYLE WS_VISIBLE +FONT 8, "MS Shell Dlg" +BEGIN + LTEXT "&Visa:", -1, 6,12,40,14 + COMBOBOX IDC_DETAIL_SELECT, 28,10,100,14, + CBS_DROPDOWNLIST|WS_BORDER|WS_VSCROLL|WS_TABSTOP + CONTROL "", IDC_DETAIL_LIST, "SysListView32", + LVS_REPORT|LVS_SINGLESEL|WS_CHILD|WS_VISIBLE|WS_TABSTOP|WS_BORDER, + 6,28,241,100 + CONTROL "", IDC_DETAIL_VALUE, "RichEdit20W", + ES_READONLY|ES_MULTILINE|WS_TABSTOP, 6,136,241,70 + PUSHBUTTON "&Ändra egenskaper...", IDC_EDITPROPERTIES,103,216,70,14 + PUSHBUTTON "&Spara till fil...", IDC_EXPORT,177,216,70,14 +END + +IDD_HIERARCHY DIALOG 0, 0, 255, 236 +CAPTION "Certifieringssökväg" +STYLE WS_VISIBLE +FONT 8, "MS Shell Dlg" +BEGIN + GROUPBOX "Certifierings&sökväg", -1,6,10,245,165, BS_GROUPBOX + CONTROL "",IDC_CERTPATH, "SysTreeView32", TVS_HASLINES|WS_BORDER, + 13,22,231,130 + PUSHBUTTON "&Visa certifikat", IDC_VIEWCERTIFICATE,175,156,70,14 + LTEXT "&Certifikatsstatus:", IDC_CERTIFICATESTATUS,6,183,70,14 + CONTROL "", IDC_CERTIFICATESTATUSTEXT,"RichEdit20W", + WS_BORDER|ES_READONLY|ES_MULTILINE|WS_DISABLED,6,195,245,36 +END + +IDD_USERNOTICE DIALOG 0, 0, 255, 256 +CAPTION "Ansvarsfriskrivning" +STYLE WS_VISIBLE +FONT 8, "MS Shell Dlg" +BEGIN + CONTROL "", IDC_USERNOTICE,"RichEdit20W", + WS_BORDER|ES_READONLY|ES_MULTILINE|WS_DISABLED,6,10,241,200 + PUSHBUTTON "Stäng", IDOK,103,216,70,14 + PUSHBUTTON "Mer &Info", IDC_CPS,177,216,70,14 +END + +IDD_CERT_PROPERTIES_GENERAL DIALOG 0, 0, 255, 236 +CAPTION "Allmänt" +STYLE WS_VISIBLE +FONT 8, "MS Shell Dlg" +BEGIN + LTEXT "Vänligt &namn:", -1, 6,14,60,14 + EDITTEXT IDC_FRIENDLY_NAME, 60,12,191,14, ES_AUTOHSCROLL|WS_TABSTOP + LTEXT "&Beskrivning:", -1, 6,32,60,14 + EDITTEXT IDC_DESCRIPTION, 60,30,191,14, ES_AUTOVSCROLL|ES_MULTILINE|WS_TABSTOP|WS_VSCROLL + GROUPBOX "Certifikatssyften", -1,6,48,245,165, BS_GROUPBOX + AUTORADIOBUTTON "&Aktivera alla syften för detta certifikat", + IDC_ENABLE_ALL_PURPOSES, 12,58,180,14, BS_AUTORADIOBUTTON|WS_TABSTOP + AUTORADIOBUTTON "A&vaktivera alla syften för detta certifikat", + IDC_DISABLE_ALL_PURPOSES, 12,70,180,14, BS_AUTORADIOBUTTON + AUTORADIOBUTTON "Aktivera &enbart följande syften för detta certifikat:", + IDC_ENABLE_SELECTED_PURPOSES, 12,82,180,14, BS_AUTORADIOBUTTON + CONTROL "", IDC_CERTIFICATE_USAGES,"SysListView32", + LVS_REPORT|LVS_NOCOLUMNHEADER|LVS_SINGLESEL|WS_CHILD|WS_VISIBLE|WS_TABSTOP|WS_BORDER, + 24,100,220,90 + PUSHBUTTON "Lägg till &syfte...", IDC_ADD_PURPOSE,184,194,60,14 +END + +IDD_ADD_CERT_PURPOSE DIALOG 0,0,200,68 +CAPTION "Lägg till syfte" +FONT 8, "MS Shell Dlg" +BEGIN + LTEXT "Lägg till objektidentifieraren (OID) för certifikatssyftet du vill lägga till:", + -1, 6,6,190,28 + EDITTEXT IDC_NEW_PURPOSE, 6,28,190,14, ES_AUTOVSCROLL|ES_MULTILINE|WS_TABSTOP|WS_VSCROLL + PUSHBUTTON "OK", IDOK, 33,48,60,14 + PUSHBUTTON "Avbryt", IDCANCEL, 100,48,60,14 +END + +IDD_SELECT_STORE DIALOG 0,0,200,136 +CAPTION "Välj certifikatlager" +FONT 8, "MS Shell Dlg" +BEGIN + LTEXT "Välj certifikatlagret du vill använda:", IDC_STORE_TEXT, 6,6,190,28 + CONTROL "",IDC_STORE_LIST, "SysTreeView32", TVS_HASLINES|WS_BORDER|WS_TABSTOP, + 6,28,188,70 + CHECKBOX "&Visa fysiska lager", IDC_SHOW_PHYSICAL_STORES, 6,102,90,14, + BS_AUTOCHECKBOX|WS_TABSTOP + PUSHBUTTON "OK", IDOK, 90,118,50,14, BS_DEFPUSHBUTTON + PUSHBUTTON "Avbryt", IDCANCEL, 144,118,50,14 +END + +IDD_IMPORT_WELCOME DIALOG 0,0,317,143 +CAPTION "Guiden för import av certifikat" +FONT 8, "MS Shell Dlg" +BEGIN + LTEXT "Välkommen till guiden för import av certifikat", IDC_IMPORT_TITLE, + 115,7,195,12 + LTEXT "Denna guide hjälper dig att importera certifikat, listor över återkallade certifikat, och listor över betrodda certifikat från en fil till ett certifikatlager.", + -1, 115,26,195,25 + LTEXT "Ett certifikat kan användas för att identifiera dig eller datorn som du kommunicerar med. Det kan även användas för autentisering samt för att signera meddelanden. Certifikatlager är samlingar av certifikat, listor över återkallade certifikat, och listor över betrodda certifikat.", + -1, 115,56,195,40 + LTEXT "För att fortsätta, klicka Nästa.", + -1, 115,103,195,8 +END + +IDD_IMPORT_FILE DIALOG 0,0,317,178 +CAPTION "Guiden för import av certifikat" +FONT 8, "MS Shell Dlg" +BEGIN + LTEXT "&Filnamn:", -1, 21,1,195,10 + EDITTEXT IDC_IMPORT_FILENAME, 21,11,208,14, ES_AUTOHSCROLL|WS_TABSTOP + PUSHBUTTON "&Bläddra...", IDC_IMPORT_BROWSE_FILE, 236,11,60,14 + LTEXT "Obs: Följande filformat kan innehålla mer än ett certifikat och listor över återkallade eller betrodda certifikat:", + -1, 21,26,265,16 + LTEXT "Standard för kryptografisk meddelandesyntax/PKCS #7-meddelande (.p7b)", + -1, 31,49,265,10 + LTEXT "Personal Information Exchange/PKCS #12 (.pfx, .p12)", + -1, 31,64,265,10 + LTEXT "Microsoft Serialized Certificate Store (.sst)", + -1, 31,79,265,10 +END + +IDD_IMPORT_STORE DIALOG 0,0,317,143 +CAPTION "Guiden för import av certifikat" +FONT 8, "MS Shell Dlg" +BEGIN + LTEXT "Wine kan välja certifikatlagret automatiskt, eller så kan du ange en sökväg för certifikaten.", + -1, 21,1,195,20 + AUTORADIOBUTTON "Välj certifikatlager &automatiskt", + IDC_IMPORT_AUTO_STORE, 31,18,180,12, BS_AUTORADIOBUTTON|WS_TABSTOP + AUTORADIOBUTTON "&Placera alla certifikat i följande lager:", + IDC_IMPORT_SPECIFY_STORE, 31,30,180,12, BS_AUTORADIOBUTTON + EDITTEXT IDC_IMPORT_STORE, 44,49,185,14, ES_READONLY + PUSHBUTTON "&Bläddra...", IDC_IMPORT_BROWSE_STORE, 236,49,60,14 +END + +IDD_IMPORT_FINISH DIALOG 0,0,317,178 +CAPTION "Guiden för import av certifikat" +FONT 8, "MS Shell Dlg" +BEGIN + LTEXT "Avslutar guiden för import av certifikat", IDC_IMPORT_TITLE, + 115,1,195,40 + LTEXT "Du har slutfört guiden för import av certifikat.", + -1, 115,33,195,24 + LTEXT "Du har angett följande inställningar:", + -1, 115,57,195,12 + CONTROL "", IDC_IMPORT_SETTINGS, "SysListView32", + LVS_REPORT|LVS_NOCOLUMNHEADER|LVS_SINGLESEL|WS_CHILD|WS_VISIBLE|WS_TABSTOP|WS_BORDER, + 115,67,174,100 +END + +IDD_CERT_MGR DIALOG 0,0,335,270 +CAPTION "Certifikat" +FONT 8, "MS Shell Dlg" +BEGIN + LTEXT "Avsett s&yfte:", -1, 7,9,100,12 + COMBOBOX IDC_MGR_PURPOSE_SELECTION, 83,7,245,14, + CBS_DROPDOWNLIST|WS_BORDER|WS_VSCROLL|WS_TABSTOP + CONTROL "", IDC_MGR_STORES, "SysTabControl32", + WS_CLIPSIBLINGS|WS_TABSTOP, 7,25,321,140 + CONTROL "", IDC_MGR_CERTS, "SysListView32", + LVS_REPORT|WS_CHILD|WS_VISIBLE|WS_TABSTOP|WS_BORDER, 15,46,305,111 + PUSHBUTTON "&Importera...", IDC_MGR_IMPORT, 7,172,51,14 + PUSHBUTTON "&Exportera...", IDC_MGR_EXPORT, 62,172,51,14, WS_DISABLED + PUSHBUTTON "&Ta bort", IDC_MGR_REMOVE, 117,172,51,14, WS_DISABLED + PUSHBUTTON "&Avancerat...", IDC_MGR_ADVANCED, 277,172,51,14 + GROUPBOX "Avsedda syften för certifikat", -1,7,194,321,47, BS_GROUPBOX + LTEXT "", IDC_MGR_PURPOSES, 13,208,252,30 + PUSHBUTTON "&Visa...", IDC_MGR_VIEW, 269,218,51,14, WS_DISABLED + PUSHBUTTON "&Stäng", IDCANCEL, 277,249,51,14, BS_DEFPUSHBUTTON +END + +IDD_CERT_MGR_ADVANCED DIALOG 0,0,248,176 +CAPTION "Avancerade val" +FONT 8, "MS Shell Dlg" +BEGIN + GROUPBOX "Syfte för certifikat", -1, 7,7,234,141, BS_GROUPBOX + LTEXT "Välj ett eller flera syften att listas när Avancerade Syften är valt.", + -1, 14,18,220,16 + LTEXT "&Syften för certifikat:", -1, 14,41,90,12, WS_TABSTOP + CONTROL "", IDC_CERTIFICATE_USAGES,"SysListView32", + LVS_REPORT|LVS_NOCOLUMNHEADER|LVS_SINGLESEL|WS_CHILD|WS_VISIBLE|WS_TABSTOP|WS_BORDER, + 14,51,220,90 + PUSHBUTTON "OK", IDOK, 132,155,51,14, BS_DEFPUSHBUTTON + PUSHBUTTON "Avbryt", IDCANCEL, 190,155,51,14 +END + +IDD_EXPORT_WELCOME DIALOG 0,0,317,143 +CAPTION "Guiden för export av certifikat" +FONT 8, "MS Shell Dlg" +BEGIN + LTEXT "Välkommen till guiden för export av certifikat", IDC_EXPORT_TITLE, + 115,7,195,12 + LTEXT "Denna guide hjälper dig att exportera certifikat, listor över återkallade certifikat och listor över betrodda certifikat från ett certifikatlager till en fil.", + -1, 115,26,195,25 + LTEXT "Ett certifikat kan användas för att identifiera dig eller datorn som du kommunicerar med. Det kan också användas till autentisering, samt signering av meddelanden. Certifikatlager är samlingar av certifikat, listor över återkallade certifikat och listor över betrodda certifikat.", + -1, 115,56,195,40 + LTEXT "För att fortsätta, klicka Nästa.", + -1, 115,103,195,8 +END + +IDD_EXPORT_PRIVATE_KEY DIALOG 0,0,317,143 +CAPTION "Guiden för export av certifikat" +FONT 8, "MS Shell Dlg" +BEGIN + LTEXT "Om du väljer att exportera den privata nyckeln så kommer du på en senare sida tillbes ange ett lösenord för att skydda den privata nyckeln.", -1, 21,1,195,25 + LTEXT "Vill du exportera den privata nyckeln?", -1, 21,27,195,10 + AUTORADIOBUTTON "&Ja, exportera den privata nyckeln", + IDC_EXPORT_PRIVATE_KEY_YES, 31,36,200,12, BS_AUTORADIOBUTTON|WS_TABSTOP + AUTORADIOBUTTON "&Nej, exportera inte den privata nyckeln", + IDC_EXPORT_PRIVATE_KEY_NO, 31,48,200,12, BS_AUTORADIOBUTTON + LTEXT "", IDC_EXPORT_PRIVATE_KEY_UNAVAILABLE, 21,60,200,24 +END + +IDD_EXPORT_PASSWORD DIALOG 0,0,317,143 +CAPTION "Guiden för export av certifikat" +FONT 8, "MS Shell Dlg" +BEGIN + LTEXT "&Lösenord:", -1, 21,1,195,10 + EDITTEXT IDC_EXPORT_PASSWORD, 21,11,208,14, ES_AUTOHSCROLL|WS_TABSTOP + LTEXT "&Bekräfta lösenord:", -1, 21,35,195,10 + EDITTEXT IDC_EXPORT_PASSWORD_CONFIRM, 21,45,208,14, ES_AUTOHSCROLL|WS_TABSTOP +END + +IDD_EXPORT_FORMAT DIALOG 0,0,317,143 +CAPTION "Guiden för export av certifikat" +FONT 8, "MS Shell Dlg" +BEGIN + LTEXT "Välj formatet du vill använda:", -1, 21,1,195,10 + AUTORADIOBUTTON "&DER-kodad X.509 (.cer)", + IDC_EXPORT_FORMAT_DER, 31,18,240,12, BS_AUTORADIOBUTTON|WS_TABSTOP + AUTORADIOBUTTON "Ba&se64-kodad X.509 (.cer):", + IDC_EXPORT_FORMAT_BASE64, 31,30,240,12, BS_AUTORADIOBUTTON + AUTORADIOBUTTON "Standard för &kryptografisk meddelandesyntax/PKCS #7 (.p7b)", + IDC_EXPORT_FORMAT_CMS, 31,42,240,12, BS_AUTORADIOBUTTON + CHECKBOX "&Inkludera alla certifikat i certifieringssökvägen om möjligt", + IDC_EXPORT_CMS_INCLUDE_CHAIN, 44,57,240,8, BS_AUTOCHECKBOX|WS_TABSTOP|WS_DISABLED + AUTORADIOBUTTON "&Personal Information Exchange/PKCS #12 (.pfx)", + IDC_EXPORT_FORMAT_PFX, 31,72,240,12, BS_AUTORADIOBUTTON|WS_DISABLED + CHECKBOX "Inkl&udera alla certifikat i certifieringssökvägen om möjligt", + IDC_EXPORT_PFX_INCLUDE_CHAIN, 44,87,240,8, BS_AUTOCHECKBOX|WS_TABSTOP|WS_DISABLED + CHECKBOX "&Använd stark kryptering", + IDC_EXPORT_PFX_STRONG_ENCRYPTION, 44,102,240,8, + BS_AUTOCHECKBOX|WS_TABSTOP|WS_DISABLED + CHECKBOX "Ta bort den privata &nyckeln om exporten lyckas", + IDC_EXPORT_PFX_DELETE_PRIVATE_KEY, 44,117,240,8, + BS_AUTOCHECKBOX|WS_TABSTOP|WS_DISABLED +END + +IDD_EXPORT_FILE DIALOG 0,0,317,143 +CAPTION "Guiden för export av certifikat" +FONT 8, "MS Shell Dlg" +BEGIN + LTEXT "&Filnamn:", -1, 21,1,195,10 + EDITTEXT IDC_EXPORT_FILENAME, 21,11,208,14, ES_AUTOHSCROLL|WS_TABSTOP + PUSHBUTTON "&Bläddra...", IDC_EXPORT_BROWSE_FILE, 236,11,60,14 +END + +IDD_EXPORT_FINISH DIALOG 0,0,317,178 +CAPTION "Guiden för export av certifikat" +FONT 8, "MS Shell Dlg" +BEGIN + LTEXT "Avslutar guiden för export av certifikat", IDC_EXPORT_TITLE, + 115,1,195,40 + LTEXT "Du har nu fullföljt guiden för export av certifikat.", + -1, 115,33,195,24 + LTEXT "Du har angett följande inställningar:", + -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 -Nru wine1.3-1.3.0/dlls/cryptui/Makefile.in wine1.3-1.3.1/dlls/cryptui/Makefile.in --- wine1.3-1.3.0/dlls/cryptui/Makefile.in 2010-07-30 18:43:56.000000000 +0100 +++ wine1.3-1.3.1/dlls/cryptui/Makefile.in 2010-08-20 18:23:50.000000000 +0100 @@ -23,6 +23,7 @@ cryptui_Pl.rc \ cryptui_Pt.rc \ cryptui_Ro.rc \ + cryptui_Sv.rc \ cryptui_Uk.rc @MAKE_DLL_RULES@ diff -Nru wine1.3-1.3.0/dlls/d3d10/d3d10.spec wine1.3-1.3.1/dlls/d3d10/d3d10.spec --- wine1.3-1.3.0/dlls/d3d10/d3d10.spec 2010-07-30 18:43:56.000000000 +0100 +++ wine1.3-1.3.1/dlls/d3d10/d3d10.spec 2010-08-20 18:23:50.000000000 +0100 @@ -1,6 +1,6 @@ @ stub D3D10CompileEffectFromMemory @ stub D3D10CompileShader -@ stub D3D10CreateBlob +@ stdcall D3D10CreateBlob(long ptr) d3dcompiler_43.D3DCreateBlob @ stdcall D3D10CreateDevice(ptr long ptr long long ptr) @ stdcall D3D10CreateDeviceAndSwapChain(ptr long ptr long long ptr ptr ptr) @ stdcall D3D10CreateEffectFromMemory(ptr long long ptr ptr ptr) diff -Nru wine1.3-1.3.0/dlls/d3dcompiler_33/d3dcompiler_33_main.c wine1.3-1.3.1/dlls/d3dcompiler_33/d3dcompiler_33_main.c --- wine1.3-1.3.0/dlls/d3dcompiler_33/d3dcompiler_33_main.c 1970-01-01 01:00:00.000000000 +0100 +++ wine1.3-1.3.1/dlls/d3dcompiler_33/d3dcompiler_33_main.c 2010-08-20 18:23:50.000000000 +0100 @@ -0,0 +1,44 @@ +/* + * Direct3D shader compiler main file + * + * Copyright 2010 Matteo Bruni for 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 "wine/port.h" + +#include + +#include "windef.h" +#include "winbase.h" + +BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved) +{ + switch (fdwReason) + { + case DLL_WINE_PREATTACH: + return FALSE; /* prefer native version */ + case DLL_PROCESS_ATTACH: + DisableThreadLibraryCalls(hinstDLL); + break; + case DLL_PROCESS_DETACH: + break; + } + + return TRUE; +} diff -Nru wine1.3-1.3.0/dlls/d3dcompiler_33/d3dcompiler_33.spec wine1.3-1.3.1/dlls/d3dcompiler_33/d3dcompiler_33.spec --- wine1.3-1.3.0/dlls/d3dcompiler_33/d3dcompiler_33.spec 1970-01-01 01:00:00.000000000 +0100 +++ wine1.3-1.3.1/dlls/d3dcompiler_33/d3dcompiler_33.spec 2010-08-20 18:23:50.000000000 +0100 @@ -0,0 +1,10 @@ +@ stdcall D3DCompileFromMemory(ptr long str ptr ptr str str long long ptr ptr) d3dcompiler_43.D3DCompile +@ stdcall D3DDisassembleCode(ptr long long ptr ptr) d3dcompiler_43.D3DDisassemble +@ stdcall D3DDisassembleEffect(ptr long ptr) d3dcompiler_43.D3DDisassemble10Effect +@ stdcall D3DGetCodeDebugInfo(ptr long ptr) d3dcompiler_43.D3DGetDebugInfo +@ stdcall D3DGetInputAndOutputSignatureBlob(ptr long ptr) d3dcompiler_43.D3DGetInputAndOutputSignatureBlob +@ stdcall D3DGetInputSignatureBlob(ptr long ptr) d3dcompiler_43.D3DGetInputSignatureBlob +@ stdcall D3DGetOutputSignatureBlob(ptr long ptr) d3dcompiler_43.D3DGetOutputSignatureBlob +@ stdcall D3DPreprocessFromMemory(ptr long str ptr ptr ptr ptr) d3dcompiler_43.D3DPreprocess +@ stdcall D3DReflectCode(ptr long ptr ptr) d3dcompiler_43.D3DReflect +@ stub DebugSetMute diff -Nru wine1.3-1.3.0/dlls/d3dcompiler_33/Makefile.in wine1.3-1.3.1/dlls/d3dcompiler_33/Makefile.in --- wine1.3-1.3.0/dlls/d3dcompiler_33/Makefile.in 1970-01-01 01:00:00.000000000 +0100 +++ wine1.3-1.3.1/dlls/d3dcompiler_33/Makefile.in 2010-08-20 18:23:50.000000000 +0100 @@ -0,0 +1,12 @@ +TOPSRCDIR = @top_srcdir@ +TOPOBJDIR = ../.. +SRCDIR = @srcdir@ +VPATH = @srcdir@ +MODULE = d3dcompiler_33.dll + +C_SRCS = \ + d3dcompiler_33_main.c + +RC_SRCS = version.rc + +@MAKE_DLL_RULES@ diff -Nru wine1.3-1.3.0/dlls/d3dcompiler_33/version.rc wine1.3-1.3.1/dlls/d3dcompiler_33/version.rc --- wine1.3-1.3.0/dlls/d3dcompiler_33/version.rc 1970-01-01 01:00:00.000000000 +0100 +++ wine1.3-1.3.1/dlls/d3dcompiler_33/version.rc 2010-08-20 18:23:50.000000000 +0100 @@ -0,0 +1,27 @@ +/* + * Copyright 2010 Matteo Bruni for 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 + * + */ + +#define WINE_FILEDESCRIPTION_STR "Wine D3DCompiler" +#define WINE_FILENAME_STR "d3dcompiler_1.dll" +#define WINE_FILEVERSION 9,18,904,15 +#define WINE_FILEVERSION_STR "9.18.904.0015" +#define WINE_PRODUCTVERSION 9,18,904,15 +#define WINE_PRODUCTVERSION_STR "9.18.904.0015" + +#include "wine/wine_common_ver.rc" diff -Nru wine1.3-1.3.0/dlls/d3dcompiler_34/d3dcompiler_34_main.c wine1.3-1.3.1/dlls/d3dcompiler_34/d3dcompiler_34_main.c --- wine1.3-1.3.0/dlls/d3dcompiler_34/d3dcompiler_34_main.c 1970-01-01 01:00:00.000000000 +0100 +++ wine1.3-1.3.1/dlls/d3dcompiler_34/d3dcompiler_34_main.c 2010-08-20 18:23:50.000000000 +0100 @@ -0,0 +1,44 @@ +/* + * Direct3D shader compiler main file + * + * Copyright 2010 Matteo Bruni for 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 "wine/port.h" + +#include + +#include "windef.h" +#include "winbase.h" + +BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved) +{ + switch (fdwReason) + { + case DLL_WINE_PREATTACH: + return FALSE; /* prefer native version */ + case DLL_PROCESS_ATTACH: + DisableThreadLibraryCalls(hinstDLL); + break; + case DLL_PROCESS_DETACH: + break; + } + + return TRUE; +} diff -Nru wine1.3-1.3.0/dlls/d3dcompiler_34/d3dcompiler_34.spec wine1.3-1.3.1/dlls/d3dcompiler_34/d3dcompiler_34.spec --- wine1.3-1.3.0/dlls/d3dcompiler_34/d3dcompiler_34.spec 1970-01-01 01:00:00.000000000 +0100 +++ wine1.3-1.3.1/dlls/d3dcompiler_34/d3dcompiler_34.spec 2010-08-20 18:23:50.000000000 +0100 @@ -0,0 +1,10 @@ +@ stdcall D3DCompileFromMemory(ptr long str ptr ptr str str long long ptr ptr) d3dcompiler_43.D3DCompile +@ stdcall D3DDisassembleCode(ptr long long ptr ptr) d3dcompiler_43.D3DDisassemble +@ stdcall D3DDisassembleEffect(ptr long ptr) d3dcompiler_43.D3DDisassemble10Effect +@ stdcall D3DGetCodeDebugInfo(ptr long ptr) d3dcompiler_43.D3DGetDebugInfo +@ stdcall D3DGetInputAndOutputSignatureBlob(ptr long ptr) d3dcompiler_43.D3DGetInputAndOutputSignatureBlob +@ stdcall D3DGetInputSignatureBlob(ptr long ptr) d3dcompiler_43.D3DGetInputSignatureBlob +@ stdcall D3DGetOutputSignatureBlob(ptr long ptr) d3dcompiler_43.D3DGetOutputSignatureBlob +@ stdcall D3DPreprocessFromMemory(ptr long str ptr ptr ptr ptr) d3dcompiler_43.D3DPreprocess +@ stdcall D3DReflectCode(ptr long ptr ptr) d3dcompiler_43.D3DReflect +@ stub DebugSetMute diff -Nru wine1.3-1.3.0/dlls/d3dcompiler_34/Makefile.in wine1.3-1.3.1/dlls/d3dcompiler_34/Makefile.in --- wine1.3-1.3.0/dlls/d3dcompiler_34/Makefile.in 1970-01-01 01:00:00.000000000 +0100 +++ wine1.3-1.3.1/dlls/d3dcompiler_34/Makefile.in 2010-08-20 18:23:50.000000000 +0100 @@ -0,0 +1,12 @@ +TOPSRCDIR = @top_srcdir@ +TOPOBJDIR = ../.. +SRCDIR = @srcdir@ +VPATH = @srcdir@ +MODULE = d3dcompiler_34.dll + +C_SRCS = \ + d3dcompiler_34_main.c + +RC_SRCS = version.rc + +@MAKE_DLL_RULES@ diff -Nru wine1.3-1.3.0/dlls/d3dcompiler_34/version.rc wine1.3-1.3.1/dlls/d3dcompiler_34/version.rc --- wine1.3-1.3.0/dlls/d3dcompiler_34/version.rc 1970-01-01 01:00:00.000000000 +0100 +++ wine1.3-1.3.1/dlls/d3dcompiler_34/version.rc 2010-08-20 18:23:50.000000000 +0100 @@ -0,0 +1,27 @@ +/* + * Copyright 2010 Matteo Bruni for 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 + * + */ + +#define WINE_FILEDESCRIPTION_STR "Wine D3DCompiler" +#define WINE_FILENAME_STR "d3dcompiler_1.dll" +#define WINE_FILEVERSION 9,19,949,46 +#define WINE_FILEVERSION_STR "9.19.949.0046" +#define WINE_PRODUCTVERSION 9,19,949,46 +#define WINE_PRODUCTVERSION_STR "9.19.949.0046" + +#include "wine/wine_common_ver.rc" diff -Nru wine1.3-1.3.0/dlls/d3dcompiler_35/d3dcompiler_35_main.c wine1.3-1.3.1/dlls/d3dcompiler_35/d3dcompiler_35_main.c --- wine1.3-1.3.0/dlls/d3dcompiler_35/d3dcompiler_35_main.c 1970-01-01 01:00:00.000000000 +0100 +++ wine1.3-1.3.1/dlls/d3dcompiler_35/d3dcompiler_35_main.c 2010-08-20 18:23:50.000000000 +0100 @@ -0,0 +1,44 @@ +/* + * Direct3D shader compiler main file + * + * Copyright 2010 Matteo Bruni for 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 "wine/port.h" + +#include + +#include "windef.h" +#include "winbase.h" + +BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved) +{ + switch (fdwReason) + { + case DLL_WINE_PREATTACH: + return FALSE; /* prefer native version */ + case DLL_PROCESS_ATTACH: + DisableThreadLibraryCalls(hinstDLL); + break; + case DLL_PROCESS_DETACH: + break; + } + + return TRUE; +} diff -Nru wine1.3-1.3.0/dlls/d3dcompiler_35/d3dcompiler_35.spec wine1.3-1.3.1/dlls/d3dcompiler_35/d3dcompiler_35.spec --- wine1.3-1.3.0/dlls/d3dcompiler_35/d3dcompiler_35.spec 1970-01-01 01:00:00.000000000 +0100 +++ wine1.3-1.3.1/dlls/d3dcompiler_35/d3dcompiler_35.spec 2010-08-20 18:23:50.000000000 +0100 @@ -0,0 +1,10 @@ +@ stdcall D3DCompileFromMemory(ptr long str ptr ptr str str long long ptr ptr) d3dcompiler_43.D3DCompile +@ stdcall D3DDisassembleCode(ptr long long ptr ptr) d3dcompiler_43.D3DDisassemble +@ stdcall D3DDisassembleEffect(ptr long ptr) d3dcompiler_43.D3DDisassemble10Effect +@ stdcall D3DGetCodeDebugInfo(ptr long ptr) d3dcompiler_43.D3DGetDebugInfo +@ stdcall D3DGetInputAndOutputSignatureBlob(ptr long ptr) d3dcompiler_43.D3DGetInputAndOutputSignatureBlob +@ stdcall D3DGetInputSignatureBlob(ptr long ptr) d3dcompiler_43.D3DGetInputSignatureBlob +@ stdcall D3DGetOutputSignatureBlob(ptr long ptr) d3dcompiler_43.D3DGetOutputSignatureBlob +@ stdcall D3DPreprocessFromMemory(ptr long str ptr ptr ptr ptr) d3dcompiler_43.D3DPreprocess +@ stdcall D3DReflectCode(ptr long ptr ptr) d3dcompiler_43.D3DReflect +@ stub DebugSetMute diff -Nru wine1.3-1.3.0/dlls/d3dcompiler_35/Makefile.in wine1.3-1.3.1/dlls/d3dcompiler_35/Makefile.in --- wine1.3-1.3.0/dlls/d3dcompiler_35/Makefile.in 1970-01-01 01:00:00.000000000 +0100 +++ wine1.3-1.3.1/dlls/d3dcompiler_35/Makefile.in 2010-08-20 18:23:50.000000000 +0100 @@ -0,0 +1,12 @@ +TOPSRCDIR = @top_srcdir@ +TOPOBJDIR = ../.. +SRCDIR = @srcdir@ +VPATH = @srcdir@ +MODULE = d3dcompiler_35.dll + +C_SRCS = \ + d3dcompiler_35_main.c + +RC_SRCS = version.rc + +@MAKE_DLL_RULES@ diff -Nru wine1.3-1.3.0/dlls/d3dcompiler_35/version.rc wine1.3-1.3.1/dlls/d3dcompiler_35/version.rc --- wine1.3-1.3.0/dlls/d3dcompiler_35/version.rc 1970-01-01 01:00:00.000000000 +0100 +++ wine1.3-1.3.1/dlls/d3dcompiler_35/version.rc 2010-08-20 18:23:50.000000000 +0100 @@ -0,0 +1,27 @@ +/* + * Copyright 2010 Matteo Bruni for 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 + * + */ + +#define WINE_FILEDESCRIPTION_STR "Wine D3DCompiler" +#define WINE_FILENAME_STR "d3dcompiler_35.dll" +#define WINE_FILEVERSION 9,19,949,1104 +#define WINE_FILEVERSION_STR "9.19.949.1104" +#define WINE_PRODUCTVERSION 9,19,949,1104 +#define WINE_PRODUCTVERSION_STR "9.19.949.1104" + +#include "wine/wine_common_ver.rc" diff -Nru wine1.3-1.3.0/dlls/d3dcompiler_36/d3dcompiler_36_main.c wine1.3-1.3.1/dlls/d3dcompiler_36/d3dcompiler_36_main.c --- wine1.3-1.3.0/dlls/d3dcompiler_36/d3dcompiler_36_main.c 1970-01-01 01:00:00.000000000 +0100 +++ wine1.3-1.3.1/dlls/d3dcompiler_36/d3dcompiler_36_main.c 2010-08-20 18:23:50.000000000 +0100 @@ -0,0 +1,44 @@ +/* + * Direct3D shader compiler main file + * + * Copyright 2010 Matteo Bruni for 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 "wine/port.h" + +#include + +#include "windef.h" +#include "winbase.h" + +BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved) +{ + switch (fdwReason) + { + case DLL_WINE_PREATTACH: + return FALSE; /* prefer native version */ + case DLL_PROCESS_ATTACH: + DisableThreadLibraryCalls(hinstDLL); + break; + case DLL_PROCESS_DETACH: + break; + } + + return TRUE; +} diff -Nru wine1.3-1.3.0/dlls/d3dcompiler_36/d3dcompiler_36.spec wine1.3-1.3.1/dlls/d3dcompiler_36/d3dcompiler_36.spec --- wine1.3-1.3.0/dlls/d3dcompiler_36/d3dcompiler_36.spec 1970-01-01 01:00:00.000000000 +0100 +++ wine1.3-1.3.1/dlls/d3dcompiler_36/d3dcompiler_36.spec 2010-08-20 18:23:50.000000000 +0100 @@ -0,0 +1,10 @@ +@ stdcall D3DCompileFromMemory(ptr long str ptr ptr str str long long ptr ptr) d3dcompiler_43.D3DCompile +@ stdcall D3DDisassembleCode(ptr long long ptr ptr) d3dcompiler_43.D3DDisassemble +@ stdcall D3DDisassembleEffect(ptr long ptr) d3dcompiler_43.D3DDisassemble10Effect +@ stdcall D3DGetCodeDebugInfo(ptr long ptr) d3dcompiler_43.D3DGetDebugInfo +@ stdcall D3DGetInputAndOutputSignatureBlob(ptr long ptr) d3dcompiler_43.D3DGetInputAndOutputSignatureBlob +@ stdcall D3DGetInputSignatureBlob(ptr long ptr) d3dcompiler_43.D3DGetInputSignatureBlob +@ stdcall D3DGetOutputSignatureBlob(ptr long ptr) d3dcompiler_43.D3DGetOutputSignatureBlob +@ stdcall D3DPreprocessFromMemory(ptr long str ptr ptr ptr ptr) d3dcompiler_43.D3DPreprocess +@ stdcall D3DReflectCode(ptr long ptr ptr) d3dcompiler_43.D3DReflect +@ stub DebugSetMute diff -Nru wine1.3-1.3.0/dlls/d3dcompiler_36/Makefile.in wine1.3-1.3.1/dlls/d3dcompiler_36/Makefile.in --- wine1.3-1.3.0/dlls/d3dcompiler_36/Makefile.in 1970-01-01 01:00:00.000000000 +0100 +++ wine1.3-1.3.1/dlls/d3dcompiler_36/Makefile.in 2010-08-20 18:23:50.000000000 +0100 @@ -0,0 +1,12 @@ +TOPSRCDIR = @top_srcdir@ +TOPOBJDIR = ../.. +SRCDIR = @srcdir@ +VPATH = @srcdir@ +MODULE = d3dcompiler_36.dll + +C_SRCS = \ + d3dcompiler_36_main.c + +RC_SRCS = version.rc + +@MAKE_DLL_RULES@ diff -Nru wine1.3-1.3.0/dlls/d3dcompiler_36/version.rc wine1.3-1.3.1/dlls/d3dcompiler_36/version.rc --- wine1.3-1.3.0/dlls/d3dcompiler_36/version.rc 1970-01-01 01:00:00.000000000 +0100 +++ wine1.3-1.3.1/dlls/d3dcompiler_36/version.rc 2010-08-20 18:23:50.000000000 +0100 @@ -0,0 +1,27 @@ +/* + * Copyright 2010 Matteo Bruni for 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 + * + */ + +#define WINE_FILEDESCRIPTION_STR "Wine D3DCompiler" +#define WINE_FILENAME_STR "d3dcompiler_36.dll" +#define WINE_FILEVERSION 9,19,949,2111 +#define WINE_FILEVERSION_STR "9.19.949.2111" +#define WINE_PRODUCTVERSION 9,19,949,2111 +#define WINE_PRODUCTVERSION_STR "9.19.949.2111" + +#include "wine/wine_common_ver.rc" diff -Nru wine1.3-1.3.0/dlls/d3dcompiler_37/d3dcompiler_37_main.c wine1.3-1.3.1/dlls/d3dcompiler_37/d3dcompiler_37_main.c --- wine1.3-1.3.0/dlls/d3dcompiler_37/d3dcompiler_37_main.c 1970-01-01 01:00:00.000000000 +0100 +++ wine1.3-1.3.1/dlls/d3dcompiler_37/d3dcompiler_37_main.c 2010-08-20 18:23:50.000000000 +0100 @@ -0,0 +1,44 @@ +/* + * Direct3D shader compiler main file + * + * Copyright 2010 Matteo Bruni for 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 "wine/port.h" + +#include + +#include "windef.h" +#include "winbase.h" + +BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved) +{ + switch (fdwReason) + { + case DLL_WINE_PREATTACH: + return FALSE; /* prefer native version */ + case DLL_PROCESS_ATTACH: + DisableThreadLibraryCalls(hinstDLL); + break; + case DLL_PROCESS_DETACH: + break; + } + + return TRUE; +} diff -Nru wine1.3-1.3.0/dlls/d3dcompiler_37/d3dcompiler_37.spec wine1.3-1.3.1/dlls/d3dcompiler_37/d3dcompiler_37.spec --- wine1.3-1.3.0/dlls/d3dcompiler_37/d3dcompiler_37.spec 1970-01-01 01:00:00.000000000 +0100 +++ wine1.3-1.3.1/dlls/d3dcompiler_37/d3dcompiler_37.spec 2010-08-20 18:23:50.000000000 +0100 @@ -0,0 +1,10 @@ +@ stdcall D3DCompileFromMemory(ptr long str ptr ptr str str long long ptr ptr) d3dcompiler_43.D3DCompile +@ stdcall D3DDisassembleCode(ptr long long ptr ptr) d3dcompiler_43.D3DDisassemble +@ stdcall D3DDisassembleEffect(ptr long ptr) d3dcompiler_43.D3DDisassemble10Effect +@ stdcall D3DGetCodeDebugInfo(ptr long ptr) d3dcompiler_43.D3DGetDebugInfo +@ stdcall D3DGetInputAndOutputSignatureBlob(ptr long ptr) d3dcompiler_43.D3DGetInputAndOutputSignatureBlob +@ stdcall D3DGetInputSignatureBlob(ptr long ptr) d3dcompiler_43.D3DGetInputSignatureBlob +@ stdcall D3DGetOutputSignatureBlob(ptr long ptr) d3dcompiler_43.D3DGetOutputSignatureBlob +@ stdcall D3DPreprocessFromMemory(ptr long str ptr ptr ptr ptr) d3dcompiler_43.D3DPreprocess +@ stdcall D3DReflectCode(ptr long ptr ptr) d3dcompiler_43.D3DReflect +@ stub DebugSetMute diff -Nru wine1.3-1.3.0/dlls/d3dcompiler_37/Makefile.in wine1.3-1.3.1/dlls/d3dcompiler_37/Makefile.in --- wine1.3-1.3.0/dlls/d3dcompiler_37/Makefile.in 1970-01-01 01:00:00.000000000 +0100 +++ wine1.3-1.3.1/dlls/d3dcompiler_37/Makefile.in 2010-08-20 18:23:50.000000000 +0100 @@ -0,0 +1,12 @@ +TOPSRCDIR = @top_srcdir@ +TOPOBJDIR = ../.. +SRCDIR = @srcdir@ +VPATH = @srcdir@ +MODULE = d3dcompiler_37.dll + +C_SRCS = \ + d3dcompiler_37_main.c + +RC_SRCS = version.rc + +@MAKE_DLL_RULES@ diff -Nru wine1.3-1.3.0/dlls/d3dcompiler_37/version.rc wine1.3-1.3.1/dlls/d3dcompiler_37/version.rc --- wine1.3-1.3.0/dlls/d3dcompiler_37/version.rc 1970-01-01 01:00:00.000000000 +0100 +++ wine1.3-1.3.1/dlls/d3dcompiler_37/version.rc 2010-08-20 18:23:50.000000000 +0100 @@ -0,0 +1,27 @@ +/* + * Copyright 2010 Matteo Bruni for 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 + * + */ + +#define WINE_FILEDESCRIPTION_STR "Wine D3DCompiler" +#define WINE_FILENAME_STR "d3dcompiler_37.dll" +#define WINE_FILEVERSION 9,22,949,2248 +#define WINE_FILEVERSION_STR "9.22.949.2248" +#define WINE_PRODUCTVERSION 9,22,949,2248 +#define WINE_PRODUCTVERSION_STR "9.22.949.2248" + +#include "wine/wine_common_ver.rc" diff -Nru wine1.3-1.3.0/dlls/d3dcompiler_38/d3dcompiler_38_main.c wine1.3-1.3.1/dlls/d3dcompiler_38/d3dcompiler_38_main.c --- wine1.3-1.3.0/dlls/d3dcompiler_38/d3dcompiler_38_main.c 1970-01-01 01:00:00.000000000 +0100 +++ wine1.3-1.3.1/dlls/d3dcompiler_38/d3dcompiler_38_main.c 2010-08-20 18:23:50.000000000 +0100 @@ -0,0 +1,44 @@ +/* + * Direct3D shader compiler main file + * + * Copyright 2010 Matteo Bruni for 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 "wine/port.h" + +#include + +#include "windef.h" +#include "winbase.h" + +BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved) +{ + switch (fdwReason) + { + case DLL_WINE_PREATTACH: + return FALSE; /* prefer native version */ + case DLL_PROCESS_ATTACH: + DisableThreadLibraryCalls(hinstDLL); + break; + case DLL_PROCESS_DETACH: + break; + } + + return TRUE; +} diff -Nru wine1.3-1.3.0/dlls/d3dcompiler_38/d3dcompiler_38.spec wine1.3-1.3.1/dlls/d3dcompiler_38/d3dcompiler_38.spec --- wine1.3-1.3.0/dlls/d3dcompiler_38/d3dcompiler_38.spec 1970-01-01 01:00:00.000000000 +0100 +++ wine1.3-1.3.1/dlls/d3dcompiler_38/d3dcompiler_38.spec 2010-08-20 18:23:50.000000000 +0100 @@ -0,0 +1,11 @@ +@ stdcall D3DCompileFromMemory(ptr long str ptr ptr str str long long ptr ptr) d3dcompiler_43.D3DCompile +@ stdcall D3DDisassembleCode(ptr long long ptr ptr) d3dcompiler_43.D3DDisassemble +@ stdcall D3DDisassembleEffect(ptr long ptr) d3dcompiler_43.D3DDisassemble10Effect +@ stdcall D3DGetCodeDebugInfo(ptr long ptr) d3dcompiler_43.D3DGetDebugInfo +@ stdcall D3DGetInputAndOutputSignatureBlob(ptr long ptr) d3dcompiler_43.D3DGetInputAndOutputSignatureBlob +@ stdcall D3DGetInputSignatureBlob(ptr long ptr) d3dcompiler_43.D3DGetInputSignatureBlob +@ stdcall D3DGetOutputSignatureBlob(ptr long ptr) d3dcompiler_43.D3DGetOutputSignatureBlob +@ stdcall D3DPreprocessFromMemory(ptr long str ptr ptr ptr ptr) d3dcompiler_43.D3DPreprocess +@ stdcall D3DReflectCode(ptr long ptr ptr) d3dcompiler_43.D3DReflect +@ stub D3DReturnFailure1 +@ stub DebugSetMute diff -Nru wine1.3-1.3.0/dlls/d3dcompiler_38/Makefile.in wine1.3-1.3.1/dlls/d3dcompiler_38/Makefile.in --- wine1.3-1.3.0/dlls/d3dcompiler_38/Makefile.in 1970-01-01 01:00:00.000000000 +0100 +++ wine1.3-1.3.1/dlls/d3dcompiler_38/Makefile.in 2010-08-20 18:23:50.000000000 +0100 @@ -0,0 +1,12 @@ +TOPSRCDIR = @top_srcdir@ +TOPOBJDIR = ../.. +SRCDIR = @srcdir@ +VPATH = @srcdir@ +MODULE = d3dcompiler_38.dll + +C_SRCS = \ + d3dcompiler_38_main.c + +RC_SRCS = version.rc + +@MAKE_DLL_RULES@ diff -Nru wine1.3-1.3.0/dlls/d3dcompiler_38/version.rc wine1.3-1.3.1/dlls/d3dcompiler_38/version.rc --- wine1.3-1.3.0/dlls/d3dcompiler_38/version.rc 1970-01-01 01:00:00.000000000 +0100 +++ wine1.3-1.3.1/dlls/d3dcompiler_38/version.rc 2010-08-20 18:23:50.000000000 +0100 @@ -0,0 +1,27 @@ +/* + * Copyright 2010 Matteo Bruni for 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 + * + */ + +#define WINE_FILEDESCRIPTION_STR "Wine D3DCompiler" +#define WINE_FILENAME_STR "d3dcompiler_38.dll" +#define WINE_FILEVERSION 9,23,949,2378 +#define WINE_FILEVERSION_STR "9.23.949.2378" +#define WINE_PRODUCTVERSION 9,23,949,2378 +#define WINE_PRODUCTVERSION_STR "9.23.949.2378" + +#include "wine/wine_common_ver.rc" diff -Nru wine1.3-1.3.0/dlls/d3dcompiler_39/d3dcompiler_39_main.c wine1.3-1.3.1/dlls/d3dcompiler_39/d3dcompiler_39_main.c --- wine1.3-1.3.0/dlls/d3dcompiler_39/d3dcompiler_39_main.c 1970-01-01 01:00:00.000000000 +0100 +++ wine1.3-1.3.1/dlls/d3dcompiler_39/d3dcompiler_39_main.c 2010-08-20 18:23:50.000000000 +0100 @@ -0,0 +1,44 @@ +/* + * Direct3D shader compiler main file + * + * Copyright 2010 Matteo Bruni for 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 "wine/port.h" + +#include + +#include "windef.h" +#include "winbase.h" + +BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved) +{ + switch (fdwReason) + { + case DLL_WINE_PREATTACH: + return FALSE; /* prefer native version */ + case DLL_PROCESS_ATTACH: + DisableThreadLibraryCalls(hinstDLL); + break; + case DLL_PROCESS_DETACH: + break; + } + + return TRUE; +} diff -Nru wine1.3-1.3.0/dlls/d3dcompiler_39/d3dcompiler_39.spec wine1.3-1.3.1/dlls/d3dcompiler_39/d3dcompiler_39.spec --- wine1.3-1.3.0/dlls/d3dcompiler_39/d3dcompiler_39.spec 1970-01-01 01:00:00.000000000 +0100 +++ wine1.3-1.3.1/dlls/d3dcompiler_39/d3dcompiler_39.spec 2010-08-20 18:23:50.000000000 +0100 @@ -0,0 +1,11 @@ +@ stdcall D3DCompileFromMemory(ptr long str ptr ptr str str long long ptr ptr) d3dcompiler_43.D3DCompile +@ stdcall D3DDisassembleCode(ptr long long ptr ptr) d3dcompiler_43.D3DDisassemble +@ stdcall D3DDisassembleEffect(ptr long ptr) d3dcompiler_43.D3DDisassemble10Effect +@ stdcall D3DGetCodeDebugInfo(ptr long ptr) d3dcompiler_43.D3DGetDebugInfo +@ stdcall D3DGetInputAndOutputSignatureBlob(ptr long ptr) d3dcompiler_43.D3DGetInputAndOutputSignatureBlob +@ stdcall D3DGetInputSignatureBlob(ptr long ptr) d3dcompiler_43.D3DGetInputSignatureBlob +@ stdcall D3DGetOutputSignatureBlob(ptr long ptr) d3dcompiler_43.D3DGetOutputSignatureBlob +@ stdcall D3DPreprocessFromMemory(ptr long str ptr ptr ptr ptr) d3dcompiler_43.D3DPreprocess +@ stdcall D3DReflectCode(ptr long ptr ptr) d3dcompiler_43.D3DReflect +@ stub D3DReturnFailure1 +@ stub DebugSetMute diff -Nru wine1.3-1.3.0/dlls/d3dcompiler_39/Makefile.in wine1.3-1.3.1/dlls/d3dcompiler_39/Makefile.in --- wine1.3-1.3.0/dlls/d3dcompiler_39/Makefile.in 1970-01-01 01:00:00.000000000 +0100 +++ wine1.3-1.3.1/dlls/d3dcompiler_39/Makefile.in 2010-08-20 18:23:50.000000000 +0100 @@ -0,0 +1,12 @@ +TOPSRCDIR = @top_srcdir@ +TOPOBJDIR = ../.. +SRCDIR = @srcdir@ +VPATH = @srcdir@ +MODULE = d3dcompiler_39.dll + +C_SRCS = \ + d3dcompiler_39_main.c + +RC_SRCS = version.rc + +@MAKE_DLL_RULES@ diff -Nru wine1.3-1.3.0/dlls/d3dcompiler_39/version.rc wine1.3-1.3.1/dlls/d3dcompiler_39/version.rc --- wine1.3-1.3.0/dlls/d3dcompiler_39/version.rc 1970-01-01 01:00:00.000000000 +0100 +++ wine1.3-1.3.1/dlls/d3dcompiler_39/version.rc 2010-08-20 18:23:50.000000000 +0100 @@ -0,0 +1,27 @@ +/* + * Copyright 2010 Matteo Bruni for 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 + * + */ + +#define WINE_FILEDESCRIPTION_STR "Wine D3DCompiler" +#define WINE_FILENAME_STR "d3dcompiler_39.dll" +#define WINE_FILEVERSION 9,24,949,2307 +#define WINE_FILEVERSION_STR "9.24.949.2307" +#define WINE_PRODUCTVERSION 9,24,949,2307 +#define WINE_PRODUCTVERSION_STR "9.24.949.2307" + +#include "wine/wine_common_ver.rc" diff -Nru wine1.3-1.3.0/dlls/d3dcompiler_40/d3dcompiler_40_main.c wine1.3-1.3.1/dlls/d3dcompiler_40/d3dcompiler_40_main.c --- wine1.3-1.3.0/dlls/d3dcompiler_40/d3dcompiler_40_main.c 1970-01-01 01:00:00.000000000 +0100 +++ wine1.3-1.3.1/dlls/d3dcompiler_40/d3dcompiler_40_main.c 2010-08-20 18:23:50.000000000 +0100 @@ -0,0 +1,44 @@ +/* + * Direct3D shader compiler main file + * + * Copyright 2010 Matteo Bruni for 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 "wine/port.h" + +#include + +#include "windef.h" +#include "winbase.h" + +BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved) +{ + switch (fdwReason) + { + case DLL_WINE_PREATTACH: + return FALSE; /* prefer native version */ + case DLL_PROCESS_ATTACH: + DisableThreadLibraryCalls(hinstDLL); + break; + case DLL_PROCESS_DETACH: + break; + } + + return TRUE; +} diff -Nru wine1.3-1.3.0/dlls/d3dcompiler_40/d3dcompiler_40.spec wine1.3-1.3.1/dlls/d3dcompiler_40/d3dcompiler_40.spec --- wine1.3-1.3.0/dlls/d3dcompiler_40/d3dcompiler_40.spec 1970-01-01 01:00:00.000000000 +0100 +++ wine1.3-1.3.1/dlls/d3dcompiler_40/d3dcompiler_40.spec 2010-08-20 18:23:50.000000000 +0100 @@ -0,0 +1,12 @@ +@ stub DebugSetMute +@ stdcall D3DCompile(ptr long str ptr ptr str str long long ptr ptr) d3dcompiler_43.D3DCompile +@ stdcall D3DDisassemble10Effect(ptr long ptr) d3dcompiler_43.D3DDisassemble10Effect +@ stdcall D3DDisassemble(ptr long long ptr ptr) d3dcompiler_43.D3DDisassemble +@ stdcall D3DGetDebugInfo(ptr long ptr) d3dcompiler_43.D3DGetDebugInfo +@ stdcall D3DGetInputAndOutputSignatureBlob(ptr long ptr) d3dcompiler_43.D3DGetInputAndOutputSignatureBlob +@ stdcall D3DGetInputSignatureBlob(ptr long ptr) d3dcompiler_43.D3DGetInputSignatureBlob +@ stdcall D3DGetOutputSignatureBlob(ptr long ptr) d3dcompiler_43.D3DGetOutputSignatureBlob +@ stdcall D3DPreprocess(ptr long str ptr ptr ptr ptr) d3dcompiler_43.D3DPreprocess +@ stdcall D3DReflect(ptr long ptr ptr) d3dcompiler_43.D3DReflect +@ stub D3DReturnFailure1 +@ stdcall D3DStripShader(ptr long long ptr) d3dcompiler_43.D3DStripShader diff -Nru wine1.3-1.3.0/dlls/d3dcompiler_40/Makefile.in wine1.3-1.3.1/dlls/d3dcompiler_40/Makefile.in --- wine1.3-1.3.0/dlls/d3dcompiler_40/Makefile.in 1970-01-01 01:00:00.000000000 +0100 +++ wine1.3-1.3.1/dlls/d3dcompiler_40/Makefile.in 2010-08-20 18:23:50.000000000 +0100 @@ -0,0 +1,12 @@ +TOPSRCDIR = @top_srcdir@ +TOPOBJDIR = ../.. +SRCDIR = @srcdir@ +VPATH = @srcdir@ +MODULE = d3dcompiler_40.dll + +C_SRCS = \ + d3dcompiler_40_main.c + +RC_SRCS = version.rc + +@MAKE_DLL_RULES@ diff -Nru wine1.3-1.3.0/dlls/d3dcompiler_40/version.rc wine1.3-1.3.1/dlls/d3dcompiler_40/version.rc --- wine1.3-1.3.0/dlls/d3dcompiler_40/version.rc 1970-01-01 01:00:00.000000000 +0100 +++ wine1.3-1.3.1/dlls/d3dcompiler_40/version.rc 2010-08-20 18:23:50.000000000 +0100 @@ -0,0 +1,27 @@ +/* + * Copyright 2010 Matteo Bruni for 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 + * + */ + +#define WINE_FILEDESCRIPTION_STR "Wine D3DCompiler" +#define WINE_FILENAME_STR "d3dcompiler_40.dll" +#define WINE_FILEVERSION 9,24,950,2656 +#define WINE_FILEVERSION_STR "9.24.950.2656" +#define WINE_PRODUCTVERSION 9,24,950,2656 +#define WINE_PRODUCTVERSION_STR "9.24.950.2656" + +#include "wine/wine_common_ver.rc" diff -Nru wine1.3-1.3.0/dlls/d3dcompiler_41/d3dcompiler_41_main.c wine1.3-1.3.1/dlls/d3dcompiler_41/d3dcompiler_41_main.c --- wine1.3-1.3.0/dlls/d3dcompiler_41/d3dcompiler_41_main.c 1970-01-01 01:00:00.000000000 +0100 +++ wine1.3-1.3.1/dlls/d3dcompiler_41/d3dcompiler_41_main.c 2010-08-20 18:23:50.000000000 +0100 @@ -0,0 +1,44 @@ +/* + * Direct3D shader compiler main file + * + * Copyright 2010 Matteo Bruni for 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 "wine/port.h" + +#include + +#include "windef.h" +#include "winbase.h" + +BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved) +{ + switch (fdwReason) + { + case DLL_WINE_PREATTACH: + return FALSE; /* prefer native version */ + case DLL_PROCESS_ATTACH: + DisableThreadLibraryCalls(hinstDLL); + break; + case DLL_PROCESS_DETACH: + break; + } + + return TRUE; +} diff -Nru wine1.3-1.3.0/dlls/d3dcompiler_41/d3dcompiler_41.spec wine1.3-1.3.1/dlls/d3dcompiler_41/d3dcompiler_41.spec --- wine1.3-1.3.0/dlls/d3dcompiler_41/d3dcompiler_41.spec 1970-01-01 01:00:00.000000000 +0100 +++ wine1.3-1.3.1/dlls/d3dcompiler_41/d3dcompiler_41.spec 2010-08-20 18:23:50.000000000 +0100 @@ -0,0 +1,13 @@ +@ stdcall D3DAssemble(ptr long str ptr ptr long ptr ptr) d3dcompiler_43.D3DAssemble +@ stub DebugSetMute +@ stdcall D3DCompile(ptr long str ptr ptr str str long long ptr ptr) d3dcompiler_43.D3DCompile +@ stdcall D3DDisassemble10Effect(ptr long ptr) d3dcompiler_43.D3DDisassemble10Effect +@ stdcall D3DDisassemble(ptr long long ptr ptr) d3dcompiler_43.D3DDisassemble +@ stdcall D3DGetDebugInfo(ptr long ptr) d3dcompiler_43.D3DGetDebugInfo +@ stdcall D3DGetInputAndOutputSignatureBlob(ptr long ptr) d3dcompiler_43.D3DGetInputAndOutputSignatureBlob +@ stdcall D3DGetInputSignatureBlob(ptr long ptr) d3dcompiler_43.D3DGetInputSignatureBlob +@ stdcall D3DGetOutputSignatureBlob(ptr long ptr) d3dcompiler_43.D3DGetOutputSignatureBlob +@ stdcall D3DPreprocess(ptr long str ptr ptr ptr ptr) d3dcompiler_43.D3DPreprocess +@ stdcall D3DReflect(ptr long ptr ptr) d3dcompiler_43.D3DReflect +@ stub D3DReturnFailure1 +@ stdcall D3DStripShader(ptr long long ptr) d3dcompiler_43.D3DStripShader diff -Nru wine1.3-1.3.0/dlls/d3dcompiler_41/Makefile.in wine1.3-1.3.1/dlls/d3dcompiler_41/Makefile.in --- wine1.3-1.3.0/dlls/d3dcompiler_41/Makefile.in 1970-01-01 01:00:00.000000000 +0100 +++ wine1.3-1.3.1/dlls/d3dcompiler_41/Makefile.in 2010-08-20 18:23:50.000000000 +0100 @@ -0,0 +1,12 @@ +TOPSRCDIR = @top_srcdir@ +TOPOBJDIR = ../.. +SRCDIR = @srcdir@ +VPATH = @srcdir@ +MODULE = d3dcompiler_41.dll + +C_SRCS = \ + d3dcompiler_41_main.c + +RC_SRCS = version.rc + +@MAKE_DLL_RULES@ diff -Nru wine1.3-1.3.0/dlls/d3dcompiler_41/version.rc wine1.3-1.3.1/dlls/d3dcompiler_41/version.rc --- wine1.3-1.3.0/dlls/d3dcompiler_41/version.rc 1970-01-01 01:00:00.000000000 +0100 +++ wine1.3-1.3.1/dlls/d3dcompiler_41/version.rc 2010-08-20 18:23:50.000000000 +0100 @@ -0,0 +1,27 @@ +/* + * Copyright 2010 Matteo Bruni for 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 + * + */ + +#define WINE_FILEDESCRIPTION_STR "Wine D3DCompiler" +#define WINE_FILENAME_STR "d3dcompiler_41.dll" +#define WINE_FILEVERSION 9,26,952,2844 +#define WINE_FILEVERSION_STR "9.26.952.2844" +#define WINE_PRODUCTVERSION 9,26,952,2844 +#define WINE_PRODUCTVERSION_STR "9.26.952.2844" + +#include "wine/wine_common_ver.rc" diff -Nru wine1.3-1.3.0/dlls/d3dcompiler_42/d3dcompiler_42_main.c wine1.3-1.3.1/dlls/d3dcompiler_42/d3dcompiler_42_main.c --- wine1.3-1.3.0/dlls/d3dcompiler_42/d3dcompiler_42_main.c 1970-01-01 01:00:00.000000000 +0100 +++ wine1.3-1.3.1/dlls/d3dcompiler_42/d3dcompiler_42_main.c 2010-08-20 18:23:50.000000000 +0100 @@ -0,0 +1,44 @@ +/* + * Direct3D shader compiler main file + * + * Copyright 2010 Matteo Bruni for 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 "wine/port.h" + +#include + +#include "windef.h" +#include "winbase.h" + +BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved) +{ + switch (fdwReason) + { + case DLL_WINE_PREATTACH: + return FALSE; /* prefer native version */ + case DLL_PROCESS_ATTACH: + DisableThreadLibraryCalls(hinstDLL); + break; + case DLL_PROCESS_DETACH: + break; + } + + return TRUE; +} diff -Nru wine1.3-1.3.0/dlls/d3dcompiler_42/d3dcompiler_42.spec wine1.3-1.3.1/dlls/d3dcompiler_42/d3dcompiler_42.spec --- wine1.3-1.3.0/dlls/d3dcompiler_42/d3dcompiler_42.spec 1970-01-01 01:00:00.000000000 +0100 +++ wine1.3-1.3.1/dlls/d3dcompiler_42/d3dcompiler_42.spec 2010-08-20 18:23:50.000000000 +0100 @@ -0,0 +1,13 @@ +@ stdcall D3DAssemble(ptr long str ptr ptr long ptr ptr) d3dcompiler_43.D3DAssemble +@ stub DebugSetMute +@ stdcall D3DCompile(ptr long str ptr ptr str str long long ptr ptr) d3dcompiler_43.D3DCompile +@ stdcall D3DDisassemble10Effect(ptr long ptr) d3dcompiler_43.D3DDisassemble10Effect +@ stdcall D3DDisassemble(ptr long long ptr ptr) d3dcompiler_43.D3DDisassemble +@ stdcall D3DGetDebugInfo(ptr long ptr) d3dcompiler_43.D3DGetDebugInfo +@ stdcall D3DGetInputAndOutputSignatureBlob(ptr long ptr) d3dcompiler_43.D3DGetInputAndOutputSignatureBlob +@ stdcall D3DGetInputSignatureBlob(ptr long ptr) d3dcompiler_43.D3DGetInputSignatureBlob +@ stdcall D3DGetOutputSignatureBlob(ptr long ptr) d3dcompiler_43.D3DGetOutputSignatureBlob +@ stdcall D3DPreprocess(ptr long str ptr ptr ptr ptr) d3dcompiler_43.D3DPreprocess +@ stdcall D3DReflect(ptr long ptr ptr) d3dcompiler_43.D3DReflect +@ stub D3DReturnFailure1 +@ stdcall D3DStripShader(ptr long long ptr) d3dcompiler_43.D3DStripShader diff -Nru wine1.3-1.3.0/dlls/d3dcompiler_42/Makefile.in wine1.3-1.3.1/dlls/d3dcompiler_42/Makefile.in --- wine1.3-1.3.0/dlls/d3dcompiler_42/Makefile.in 1970-01-01 01:00:00.000000000 +0100 +++ wine1.3-1.3.1/dlls/d3dcompiler_42/Makefile.in 2010-08-20 18:23:50.000000000 +0100 @@ -0,0 +1,12 @@ +TOPSRCDIR = @top_srcdir@ +TOPOBJDIR = ../.. +SRCDIR = @srcdir@ +VPATH = @srcdir@ +MODULE = d3dcompiler_42.dll + +C_SRCS = \ + d3dcompiler_42_main.c + +RC_SRCS = version.rc + +@MAKE_DLL_RULES@ diff -Nru wine1.3-1.3.0/dlls/d3dcompiler_42/version.rc wine1.3-1.3.1/dlls/d3dcompiler_42/version.rc --- wine1.3-1.3.0/dlls/d3dcompiler_42/version.rc 1970-01-01 01:00:00.000000000 +0100 +++ wine1.3-1.3.1/dlls/d3dcompiler_42/version.rc 2010-08-20 18:23:50.000000000 +0100 @@ -0,0 +1,27 @@ +/* + * Copyright 2010 Matteo Bruni for 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 + * + */ + +#define WINE_FILEDESCRIPTION_STR "Wine D3DCompiler" +#define WINE_FILENAME_STR "d3dcompiler_42.dll" +#define WINE_FILEVERSION 9,27,952,3022 +#define WINE_FILEVERSION_STR "9.27.952.3022" +#define WINE_PRODUCTVERSION 9,27,952,3022 +#define WINE_PRODUCTVERSION_STR "9.27.952.3022" + +#include "wine/wine_common_ver.rc" diff -Nru wine1.3-1.3.0/dlls/d3dcompiler_43/blob.c wine1.3-1.3.1/dlls/d3dcompiler_43/blob.c --- wine1.3-1.3.0/dlls/d3dcompiler_43/blob.c 1970-01-01 01:00:00.000000000 +0100 +++ wine1.3-1.3.1/dlls/d3dcompiler_43/blob.c 2010-08-20 18:23:50.000000000 +0100 @@ -0,0 +1,121 @@ +/* + * Direct3D blob file + * + * Copyright 2010 Rico Schüller + * + * 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 "wine/port.h" + +#include "d3dcompiler_private.h" +#include "wine/debug.h" + +WINE_DEFAULT_DEBUG_CHANNEL(d3dcompiler); + +/* IUnknown methods */ + +static HRESULT STDMETHODCALLTYPE d3dcompiler_blob_QueryInterface(ID3DBlob *iface, REFIID riid, void **object) +{ + TRACE("iface %p, riid %s, object %p\n", iface, debugstr_guid(riid), object); + + if (IsEqualGUID(riid, &IID_ID3D10Blob) + || IsEqualGUID(riid, &IID_IUnknown)) + { + IUnknown_AddRef(iface); + *object = iface; + return S_OK; + } + + WARN("%s not implemented, returning E_NOINTERFACE\n", debugstr_guid(riid)); + + *object = NULL; + return E_NOINTERFACE; +} + +static ULONG STDMETHODCALLTYPE d3dcompiler_blob_AddRef(ID3DBlob *iface) +{ + struct d3dcompiler_blob *blob = (struct d3dcompiler_blob *)iface; + ULONG refcount = InterlockedIncrement(&blob->refcount); + + TRACE("%p increasing refcount to %u\n", blob, refcount); + + return refcount; +} + +static ULONG STDMETHODCALLTYPE d3dcompiler_blob_Release(ID3DBlob *iface) +{ + struct d3dcompiler_blob *blob = (struct d3dcompiler_blob *)iface; + ULONG refcount = InterlockedDecrement(&blob->refcount); + + TRACE("%p decreasing refcount to %u\n", blob, refcount); + + if (!refcount) + { + HeapFree(GetProcessHeap(), 0, blob->data); + HeapFree(GetProcessHeap(), 0, blob); + } + + return refcount; +} + +/* ID3DBlob methods */ + +static void * STDMETHODCALLTYPE d3dcompiler_blob_GetBufferPointer(ID3DBlob *iface) +{ + struct d3dcompiler_blob *blob = (struct d3dcompiler_blob *)iface; + + TRACE("iface %p\n", iface); + + return blob->data; +} + +static SIZE_T STDMETHODCALLTYPE d3dcompiler_blob_GetBufferSize(ID3DBlob *iface) +{ + struct d3dcompiler_blob *blob = (struct d3dcompiler_blob *)iface; + + TRACE("iface %p\n", iface); + + return blob->size; +} + +const struct ID3D10BlobVtbl d3dcompiler_blob_vtbl = +{ + /* IUnknown methods */ + d3dcompiler_blob_QueryInterface, + d3dcompiler_blob_AddRef, + d3dcompiler_blob_Release, + /* ID3DBlob methods */ + d3dcompiler_blob_GetBufferPointer, + d3dcompiler_blob_GetBufferSize, +}; + +HRESULT d3dcompiler_blob_init(struct d3dcompiler_blob *blob, SIZE_T data_size) +{ + blob->vtbl = &d3dcompiler_blob_vtbl; + blob->refcount = 1; + blob->size = data_size; + + blob->data = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, data_size); + if (!blob->data) + { + ERR("Failed to allocate D3D blob data memory\n"); + return E_OUTOFMEMORY; + } + + return S_OK; +} diff -Nru wine1.3-1.3.0/dlls/d3dcompiler_43/d3dcompiler_43_main.c wine1.3-1.3.1/dlls/d3dcompiler_43/d3dcompiler_43_main.c --- wine1.3-1.3.0/dlls/d3dcompiler_43/d3dcompiler_43_main.c 1970-01-01 01:00:00.000000000 +0100 +++ wine1.3-1.3.1/dlls/d3dcompiler_43/d3dcompiler_43_main.c 2010-08-20 18:23:50.000000000 +0100 @@ -0,0 +1,82 @@ +/* + * Direct3D shader compiler main file + * + * Copyright 2010 Matteo Bruni for 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 + +#include "windef.h" +#include "winbase.h" +#include "wine/debug.h" + +#include "d3dcompiler_private.h" + +WINE_DEFAULT_DEBUG_CHANNEL(d3dcompiler); + +BOOL WINAPI DllMain(HINSTANCE inst, DWORD reason, LPVOID reserved) +{ + switch (reason) + { + case DLL_WINE_PREATTACH: + return FALSE; /* prefer native version */ + case DLL_PROCESS_ATTACH: + DisableThreadLibraryCalls(inst); + break; + case DLL_PROCESS_DETACH: + break; + } + return TRUE; +} + +HRESULT WINAPI D3DCreateBlob(SIZE_T data_size, ID3DBlob **blob) +{ + struct d3dcompiler_blob *object; + HRESULT hr; + + TRACE("data_size %lu, blob %p\n", data_size, blob); + + if (!blob) + { + WARN("Invalid blob specified.\n"); + return D3DERR_INVALIDCALL; + } + + object = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(*object)); + if (!object) + { + ERR("Failed to allocate D3D blob object memory\n"); + return E_OUTOFMEMORY; + } + + hr = d3dcompiler_blob_init(object, data_size); + if (FAILED(hr)) + { + WARN("Failed to initialize blob, hr %#x.\n", hr); + HeapFree(GetProcessHeap(), 0, object); + return hr; + } + + *blob = (ID3DBlob *)object; + + TRACE("Created ID3DBlob %p\n", object); + + return S_OK; +} diff -Nru wine1.3-1.3.0/dlls/d3dcompiler_43/d3dcompiler_43.spec wine1.3-1.3.1/dlls/d3dcompiler_43/d3dcompiler_43.spec --- wine1.3-1.3.0/dlls/d3dcompiler_43/d3dcompiler_43.spec 1970-01-01 01:00:00.000000000 +0100 +++ wine1.3-1.3.1/dlls/d3dcompiler_43/d3dcompiler_43.spec 2010-08-20 18:23:50.000000000 +0100 @@ -0,0 +1,17 @@ +@ stub D3DAssemble +@ stub DebugSetMute +@ stub D3DCompile +@ stub D3DCompressShaders +@ stdcall D3DCreateBlob(long ptr) +@ stub D3DDecompressShaders +@ stub D3DDisassemble10Effect +@ stub D3DDisassemble +@ stub D3DGetBlobPart +@ stub D3DGetDebugInfo +@ stub D3DGetInputAndOutputSignatureBlob +@ stub D3DGetInputSignatureBlob +@ stub D3DGetOutputSignatureBlob +@ stub D3DPreprocess +@ stub D3DReflect +@ stub D3DReturnFailure1 +@ stub D3DStripShader diff -Nru wine1.3-1.3.0/dlls/d3dcompiler_43/d3dcompiler_private.h wine1.3-1.3.1/dlls/d3dcompiler_43/d3dcompiler_private.h --- wine1.3-1.3.0/dlls/d3dcompiler_43/d3dcompiler_private.h 1970-01-01 01:00:00.000000000 +0100 +++ wine1.3-1.3.1/dlls/d3dcompiler_43/d3dcompiler_private.h 2010-08-20 18:23:50.000000000 +0100 @@ -0,0 +1,50 @@ +/* + * Copyright 2010 Rico Schüller + * + * 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_D3DCOMPILER_PRIVATE_H +#define __WINE_D3DCOMPILER_PRIVATE_H + +#include + +#define COBJMACROS +#include "windef.h" +#include "winbase.h" +#include "objbase.h" + +#include "d3dcompiler.h" + +/* + * This doesn't belong here, but for some functions it is possible to return that value, + * see http://msdn.microsoft.com/en-us/library/bb205278%28v=VS.85%29.aspx + * The original definition is in D3DX10core.h. + */ +#define D3DERR_INVALIDCALL 0x8876086c + +/* ID3DBlob */ +struct d3dcompiler_blob +{ + const struct ID3D10BlobVtbl *vtbl; + LONG refcount; + + SIZE_T size; + void *data; +}; + +HRESULT d3dcompiler_blob_init(struct d3dcompiler_blob *blob, SIZE_T data_size) DECLSPEC_HIDDEN; + +#endif /* __WINE_D3DCOMPILER_PRIVATE_H */ diff -Nru wine1.3-1.3.0/dlls/d3dcompiler_43/Makefile.in wine1.3-1.3.1/dlls/d3dcompiler_43/Makefile.in --- wine1.3-1.3.0/dlls/d3dcompiler_43/Makefile.in 1970-01-01 01:00:00.000000000 +0100 +++ wine1.3-1.3.1/dlls/d3dcompiler_43/Makefile.in 2010-08-20 18:23:50.000000000 +0100 @@ -0,0 +1,15 @@ +TOPSRCDIR = @top_srcdir@ +TOPOBJDIR = ../.. +SRCDIR = @srcdir@ +VPATH = @srcdir@ +MODULE = d3dcompiler_43.dll +IMPORTLIB = d3dcompiler +IMPORTS = dxguid uuid + +C_SRCS = \ + blob.c \ + d3dcompiler_43_main.c + +RC_SRCS = version.rc + +@MAKE_DLL_RULES@ diff -Nru wine1.3-1.3.0/dlls/d3dcompiler_43/tests/blob.c wine1.3-1.3.1/dlls/d3dcompiler_43/tests/blob.c --- wine1.3-1.3.0/dlls/d3dcompiler_43/tests/blob.c 1970-01-01 01:00:00.000000000 +0100 +++ wine1.3-1.3.1/dlls/d3dcompiler_43/tests/blob.c 2010-08-20 18:23:50.000000000 +0100 @@ -0,0 +1,58 @@ +/* + * Copyright 2010 Rico Schüller + * + * 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 + */ + +/* + * Nearly all compiler functions need the shader blob and the size. The size + * is always located at DWORD #6 in the shader blob (blob[6]). + * The functions are e.g.: D3DGet*SignatureBlob, D3DReflect + */ + +#define COBJMACROS +#include "d3dcompiler.h" +#include "wine/test.h" + +/* + * This doesn't belong here, but for some functions it is possible to return that value, + * see http://msdn.microsoft.com/en-us/library/bb205278%28v=VS.85%29.aspx + * The original definition is in D3DX10core.h. + */ +#define D3DERR_INVALIDCALL 0x8876086c + +static void test_create_blob(void) +{ + ID3D10Blob *blob; + HRESULT hr; + ULONG refcount; + + hr = D3DCreateBlob(1, NULL); + ok(hr == D3DERR_INVALIDCALL, "D3DCreateBlob failed with %x\n", hr); + + hr = D3DCreateBlob(0, NULL); + ok(hr == D3DERR_INVALIDCALL, "D3DCreateBlob failed with %x\n", hr); + + hr = D3DCreateBlob(0, &blob); + ok(hr == S_OK, "D3DCreateBlob failed with %x\n", hr); + + refcount = blob->lpVtbl->Release(blob); + ok(!refcount, "ID3DBlob has %u references left\n", refcount); +} + +START_TEST(blob) +{ + test_create_blob(); +} diff -Nru wine1.3-1.3.0/dlls/d3dcompiler_43/tests/Makefile.in wine1.3-1.3.1/dlls/d3dcompiler_43/tests/Makefile.in --- wine1.3-1.3.0/dlls/d3dcompiler_43/tests/Makefile.in 1970-01-01 01:00:00.000000000 +0100 +++ wine1.3-1.3.1/dlls/d3dcompiler_43/tests/Makefile.in 2010-08-20 18:23:50.000000000 +0100 @@ -0,0 +1,11 @@ +TOPSRCDIR = @top_srcdir@ +TOPOBJDIR = ../../.. +SRCDIR = @srcdir@ +VPATH = @srcdir@ +TESTDLL = d3dcompiler_43.dll +IMPORTS = d3dcompiler + +C_SRCS = \ + blob.c + +@MAKE_TEST_RULES@ diff -Nru wine1.3-1.3.0/dlls/d3dcompiler_43/version.rc wine1.3-1.3.1/dlls/d3dcompiler_43/version.rc --- wine1.3-1.3.0/dlls/d3dcompiler_43/version.rc 1970-01-01 01:00:00.000000000 +0100 +++ wine1.3-1.3.1/dlls/d3dcompiler_43/version.rc 2010-08-20 18:23:50.000000000 +0100 @@ -0,0 +1,26 @@ +/* + * Copyright 2010 Matteo Bruni for 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 + */ + +#define WINE_FILEDESCRIPTION_STR "Wine D3DCompiler" +#define WINE_FILENAME_STR "d3dcompiler_43.dll" +#define WINE_FILEVERSION 9,29,952,3111 +#define WINE_FILEVERSION_STR "9.29.952.3111" +#define WINE_PRODUCTVERSION 9,29,952,3111 +#define WINE_PRODUCTVERSION_STR "9.29.952.3111" + +#include "wine/wine_common_ver.rc" diff -Nru wine1.3-1.3.0/dlls/d3dx10_33/d3dx10_33_main.c wine1.3-1.3.1/dlls/d3dx10_33/d3dx10_33_main.c --- wine1.3-1.3.0/dlls/d3dx10_33/d3dx10_33_main.c 1970-01-01 01:00:00.000000000 +0100 +++ wine1.3-1.3.1/dlls/d3dx10_33/d3dx10_33_main.c 2010-08-20 18:23:50.000000000 +0100 @@ -0,0 +1,63 @@ +/* + * D3DX10 main file + * + * Copyright (c) 2010 Owen Rudge for 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 "wine/port.h" + +#include + +#define COBJMACROS + +#include "windef.h" +#include "winbase.h" +#include "winuser.h" +#include "objbase.h" + +#include "d3d10.h" + +BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved) +{ + switch (fdwReason) + { + case DLL_WINE_PREATTACH: + return FALSE; /* prefer native version */ + case DLL_PROCESS_ATTACH: + DisableThreadLibraryCalls(hinstDLL); + break; + case DLL_PROCESS_DETACH: + break; + } + + return TRUE; +} + +/*********************************************************************** + * D3DX10CheckVersion + * + * Checks whether we are compiling against the correct d3d and d3dx library. + */ +BOOL WINAPI D3DX10CheckVersion(UINT d3dsdkvers, UINT d3dxsdkvers) +{ + if ((d3dsdkvers == D3D10_SDK_VERSION) && (d3dxsdkvers == 33)) + return TRUE; + + return FALSE; +} diff -Nru wine1.3-1.3.0/dlls/d3dx10_33/d3dx10_33.spec wine1.3-1.3.1/dlls/d3dx10_33/d3dx10_33.spec --- wine1.3-1.3.0/dlls/d3dx10_33/d3dx10_33.spec 1970-01-01 01:00:00.000000000 +0100 +++ wine1.3-1.3.1/dlls/d3dx10_33/d3dx10_33.spec 2010-08-20 18:23:50.000000000 +0100 @@ -0,0 +1,177 @@ +@ stdcall D3DX10CreateThreadPump(long long ptr) d3dx10_43.D3DX10CreateThreadPump +@ stdcall D3DX10CheckVersion(long long) +@ stdcall D3DX10CompileFromFileA(str ptr ptr str str long long ptr ptr ptr ptr) d3dx10_43.D3DX10CompileFromFileA +@ stdcall D3DX10CompileFromFileW(wstr ptr ptr str str long long ptr ptr ptr ptr) d3dx10_43.D3DX10CompileFromFileW +@ stdcall D3DX10CompileFromMemory(str long str ptr ptr str str long long ptr ptr ptr ptr) d3dx10_43.D3DX10CompileFromMemory +@ stdcall D3DX10CompileFromResourceA(long str str ptr ptr str str long long ptr ptr ptr ptr) d3dx10_43.D3DX10CompileFromResourceA +@ stdcall D3DX10CompileFromResourceW(long wstr wstr ptr ptr str str long long ptr ptr ptr ptr) d3dx10_43.D3DX10CompileFromResourceW +@ stdcall D3DX10ComputeNormalMap(ptr long long long ptr) d3dx10_43.D3DX10ComputeNormalMap +@ stdcall D3DX10CreateAsyncCompilerProcessor(str ptr ptr str str long long ptr ptr ptr) d3dx10_43.D3DX10CreateAsyncCompilerProcessor +@ stdcall D3DX10CreateAsyncEffectCreateProcessor(str ptr ptr str long long ptr ptr ptr ptr) d3dx10_43.D3DX10CreateAsyncEffectCreateProcessor +@ stdcall D3DX10CreateAsyncEffectPoolCreateProcessor(str ptr ptr str long long ptr ptr ptr) d3dx10_43.D3DX10CreateAsyncEffectPoolCreateProcessor +@ stdcall D3DX10CreateAsyncFileLoaderA(str ptr) d3dx10_43.D3DX10CreateAsyncFileLoaderA +@ stdcall D3DX10CreateAsyncFileLoaderW(wstr ptr) d3dx10_43.D3DX10CreateAsyncFileLoaderW +@ stdcall D3DX10CreateAsyncMemoryLoader(ptr long ptr) d3dx10_43.D3DX10CreateAsyncMemoryLoader +@ stdcall D3DX10CreateAsyncResourceLoaderA(long str ptr) d3dx10_43.D3DX10CreateAsyncResourceLoaderA +@ stdcall D3DX10CreateAsyncResourceLoaderW(long wstr ptr) d3dx10_43.D3DX10CreateAsyncResourceLoaderW +@ stdcall D3DX10CreateAsyncShaderPreprocessProcessor(str ptr ptr ptr ptr ptr) d3dx10_43.D3DX10CreateAsyncShaderPreprocessProcessor +@ stdcall D3DX10CreateAsyncShaderResourceViewProcessor(ptr ptr ptr) d3dx10_43.D3DX10CreateAsyncShaderResourceViewProcessor +@ stdcall D3DX10CreateAsyncTextureInfoProcessor(ptr ptr) d3dx10_43.D3DX10CreateAsyncTextureInfoProcessor +@ stdcall D3DX10CreateAsyncTextureProcessor(ptr ptr ptr) d3dx10_43.D3DX10CreateAsyncTextureProcessor +@ stdcall D3DX10CreateEffectFromFileA(str ptr ptr str long long ptr ptr ptr ptr ptr ptr) d3dx10_43.D3DX10CreateEffectFromFileA +@ stdcall D3DX10CreateEffectFromFileW(wstr ptr ptr str long long ptr ptr ptr ptr ptr ptr) d3dx10_43.D3DX10CreateEffectFromFileW +@ stdcall D3DX10CreateEffectFromMemory(ptr long str ptr ptr str long long ptr ptr ptr ptr ptr ptr) d3dx10_43.D3DX10CreateEffectFromMemory +@ stdcall D3DX10CreateEffectFromResourceA(long str str ptr ptr str long long ptr ptr ptr ptr ptr ptr) d3dx10_43.D3DX10CreateEffectFromResourceA +@ stdcall D3DX10CreateEffectFromResourceW(long wstr wstr ptr ptr str long long ptr ptr ptr ptr ptr ptr) d3dx10_43.D3DX10CreateEffectFromResourceW +@ stdcall D3DX10CreateEffectPoolFromFileA(str ptr ptr str long long ptr ptr ptr ptr ptr) d3dx10_43.D3DX10CreateEffectPoolFromFileA +@ stdcall D3DX10CreateEffectPoolFromFileW(wstr ptr ptr str long long ptr ptr ptr ptr ptr) d3dx10_43.D3DX10CreateEffectPoolFromFileW +@ stdcall D3DX10CreateEffectPoolFromMemory(ptr long str ptr ptr str long long ptr ptr ptr ptr ptr) d3dx10_43.D3DX10CreateEffectPoolFromMemory +@ stdcall D3DX10CreateEffectPoolFromResourceA(long str str ptr ptr str long long ptr ptr ptr ptr ptr) d3dx10_43.D3DX10CreateEffectPoolFromResourceA +@ stdcall D3DX10CreateEffectPoolFromResourceW(long wstr wstr ptr ptr str long long ptr ptr ptr ptr ptr) d3dx10_43.D3DX10CreateEffectPoolFromResourceW +@ stdcall D3DX10CreateFontA(ptr long long long long long long long long long str ptr) d3dx10_43.D3DX10CreateFontA +@ stdcall D3DX10CreateFontIndirectA(ptr ptr ptr) d3dx10_43.D3DX10CreateFontIndirectA +@ stdcall D3DX10CreateFontIndirectW(ptr ptr ptr) d3dx10_43.D3DX10CreateFontIndirectW +@ stdcall D3DX10CreateFontW(ptr long long long long long long long long long wstr ptr) d3dx10_43.D3DX10CreateFontW +@ stdcall D3DX10CreateMesh(ptr ptr long str long long long ptr) d3dx10_43.D3DX10CreateMesh +@ stdcall D3DX10CreateShaderResourceViewFromFileA(ptr str ptr ptr ptr ptr) d3dx10_43.D3DX10CreateShaderResourceViewFromFileA +@ stdcall D3DX10CreateShaderResourceViewFromFileW(ptr wstr ptr ptr ptr ptr) d3dx10_43.D3DX10CreateShaderResourceViewFromFileW +@ stdcall D3DX10CreateShaderResourceViewFromMemory(ptr ptr long ptr ptr ptr ptr) d3dx10_43.D3DX10CreateShaderResourceViewFromMemory +@ stdcall D3DX10CreateShaderResourceViewFromResourceA(ptr long str ptr ptr ptr ptr) d3dx10_43.D3DX10CreateShaderResourceViewFromResourceA +@ stdcall D3DX10CreateShaderResourceViewFromResourceW(ptr long wstr ptr ptr ptr ptr) d3dx10_43.D3DX10CreateShaderResourceViewFromResourceW +@ stdcall D3DX10CreateSkinInfo(ptr) d3dx10_43.D3DX10CreateSkinInfo +@ stdcall D3DX10CreateSprite(ptr long ptr) d3dx10_43.D3DX10CreateSprite +@ stdcall D3DX10CreateTextureFromFileA(ptr str ptr ptr ptr ptr) d3dx10_43.D3DX10CreateTextureFromFileA +@ stdcall D3DX10CreateTextureFromFileW(ptr wstr ptr ptr ptr ptr) d3dx10_43.D3DX10CreateTextureFromFileW +@ stdcall D3DX10CreateTextureFromMemory(ptr ptr long ptr ptr ptr ptr) d3dx10_43.D3DX10CreateTextureFromMemory +@ stdcall D3DX10CreateTextureFromResourceA(ptr long str ptr ptr ptr ptr) d3dx10_43.D3DX10CreateTextureFromResourceA +@ stdcall D3DX10CreateTextureFromResourceW(ptr long wstr ptr ptr ptr ptr) d3dx10_43.D3DX10CreateTextureFromResourceW +@ stdcall D3DX10DisassembleEffect(ptr long ptr) d3dx10_39.D3DX10DisassembleEffect +@ stdcall D3DX10DisassembleShader(ptr long long str ptr) d3dx10_39.D3DX10DisassembleShader +@ stdcall D3DX10FilterTexture(ptr long long) d3dx10_43.D3DX10FilterTexture +@ stdcall D3DX10GetDriverLevel(ptr) d3dx10_37.D3DX10GetDriverLevel +@ stdcall D3DX10GetImageInfoFromFileA(str ptr ptr ptr) d3dx10_43.D3DX10GetImageInfoFromFileA +@ stdcall D3DX10GetImageInfoFromFileW(wstr ptr ptr ptr) d3dx10_43.D3DX10GetImageInfoFromFileW +@ stdcall D3DX10GetImageInfoFromMemory(ptr long ptr ptr ptr) d3dx10_43.D3DX10GetImageInfoFromMemory +@ stdcall D3DX10GetImageInfoFromResourceA(long str ptr ptr ptr) d3dx10_43.D3DX10GetImageInfoFromResourceA +@ stdcall D3DX10GetImageInfoFromResourceW(long wstr ptr ptr ptr) d3dx10_43.D3DX10GetImageInfoFromResourceW +@ stdcall D3DX10LoadTextureFromTexture(ptr ptr ptr) d3dx10_43.D3DX10LoadTextureFromTexture +@ stdcall D3DX10PreprocessShaderFromFileA(str ptr ptr ptr ptr ptr) d3dx10_43.D3DX10PreprocessShaderFromFileA +@ stdcall D3DX10PreprocessShaderFromFileW(wstr ptr ptr ptr ptr ptr) d3dx10_43.D3DX10PreprocessShaderFromFileW +@ stdcall D3DX10PreprocessShaderFromMemory(str long str ptr ptr ptr ptr ptr) d3dx10_43.D3DX10PreprocessShaderFromMemory +@ stdcall D3DX10PreprocessShaderFromResourceA(long str str ptr ptr ptr ptr ptr) d3dx10_43.D3DX10PreprocessShaderFromResourceA +@ stdcall D3DX10PreprocessShaderFromResourceW(long wstr wstr ptr ptr ptr ptr ptr) d3dx10_43.D3DX10PreprocessShaderFromResourceW +@ stdcall D3DX10ReflectShader(ptr long ptr) d3dx10_39.D3DX10ReflectShader +@ stdcall D3DX10SHProjectCubeMap(long ptr ptr ptr ptr) d3dx10_43.D3DX10SHProjectCubeMap +@ stdcall D3DX10SaveTextureToFileA(ptr ptr str) d3dx10_43.D3DX10SaveTextureToFileA +@ stdcall D3DX10SaveTextureToFileW(ptr ptr wstr) d3dx10_43.D3DX10SaveTextureToFileW +@ stdcall D3DX10SaveTextureToMemory(ptr ptr ptr long) d3dx10_43.D3DX10SaveTextureToMemory +@ stdcall D3DX10UnsetAllDeviceObjects(ptr) d3dx10_43.D3DX10UnsetAllDeviceObjects +@ stdcall D3DXBoxBoundProbe(ptr ptr ptr ptr) d3dx10_43.D3DXBoxBoundProbe +@ stdcall D3DXColorAdjustContrast(ptr ptr long) d3dx10_43.3DXColorAdjustContrast +@ stdcall D3DXColorAdjustSaturation(ptr ptr long) d3dx10_43.D3DXColorAdjustSaturation +@ stdcall D3DXComputeBoundingBox(ptr long long ptr ptr) d3dx10_43.D3DXComputeBoundingBox +@ stdcall D3DXComputeBoundingSphere(ptr long long ptr ptr) d3dx10_43.D3DXComputeBoundingSphere +@ stdcall D3DXCpuOptimizations(long) d3dx10_43.D3DXCpuOptimizations +@ stdcall D3DXCreateMatrixStack(long ptr) d3dx10_43.D3DXCreateMatrixStack +@ stdcall D3DXFloat16To32Array(ptr ptr long) d3dx10_43.D3DXFloat16To32Array +@ stdcall D3DXFloat32To16Array(ptr ptr long) d3dx10_43.D3DXFloat32To16Array +@ stdcall D3DXFresnelTerm(long long) d3dx10_43.D3DXFresnelTerm +@ stdcall D3DXIntersectTri(ptr ptr ptr ptr ptr ptr ptr ptr) d3dx10_43.D3DXIntersectTri +@ stdcall D3DXMatrixAffineTransformation2D(ptr long ptr long ptr) d3dx10_43.D3DXMatrixAffineTransformation2D +@ stdcall D3DXMatrixAffineTransformation(ptr long ptr ptr ptr) d3dx10_43.D3DXMatrixAffineTransformation +@ stdcall D3DXMatrixDecompose(ptr ptr ptr ptr) d3dx10_43.D3DXMatrixDecompose +@ stdcall D3DXMatrixDeterminant(ptr) d3dx10_43.D3DXMatrixDeterminant +@ stdcall D3DXMatrixInverse(ptr ptr ptr) d3dx10_43.D3DXMatrixInverse +@ stdcall D3DXMatrixLookAtLH(ptr ptr ptr ptr) d3dx10_43.D3DXMatrixLookAtLH +@ stdcall D3DXMatrixLookAtRH(ptr ptr ptr ptr) d3dx10_43.D3DXMatrixLookAtRH +@ stdcall D3DXMatrixMultiply(ptr ptr ptr) d3dx10_43.D3DXMatrixMultiply +@ stdcall D3DXMatrixMultiplyTranspose(ptr ptr ptr) d3dx10_43.D3DXMatrixMultiplyTranspose +@ stdcall D3DXMatrixOrthoLH(ptr long long long long) d3dx10_43.D3DXMatrixOrthoLH +@ stdcall D3DXMatrixOrthoOffCenterLH(ptr long long long long long long) d3dx10_43.D3DXMatrixOrthoOffCenterLH +@ stdcall D3DXMatrixOrthoOffCenterRH(ptr long long long long long long) d3dx10_43.D3DXMatrixOrthoOffCenterRH +@ stdcall D3DXMatrixOrthoRH(ptr long long long long) d3dx10_43.D3DXMatrixOrthoRH +@ stdcall D3DXMatrixPerspectiveFovLH(ptr long long long long) d3dx10_43.D3DXMatrixPerspectiveFovLH +@ stdcall D3DXMatrixPerspectiveFovRH(ptr long long long long) d3dx10_43.D3DXMatrixPerspectiveFovRH +@ stdcall D3DXMatrixPerspectiveLH(ptr long long long long) d3dx10_43.D3DXMatrixPerspectiveLH +@ stdcall D3DXMatrixPerspectiveOffCenterLH(ptr long long long long long long) d3dx10_43.D3DXMatrixPerspectiveOffCenterLH +@ stdcall D3DXMatrixPerspectiveOffCenterRH(ptr long long long long long long) d3dx10_43.D3DXMatrixPerspectiveOffCenterRH +@ stdcall D3DXMatrixPerspectiveRH(ptr long long long long) d3dx10_43.D3DXMatrixPerspectiveRH +@ stdcall D3DXMatrixReflect(ptr ptr) d3dx10_43.D3DXMatrixReflect +@ stdcall D3DXMatrixRotationAxis(ptr ptr long) d3dx10_43.D3DXMatrixRotationAxis +@ stdcall D3DXMatrixRotationQuaternion(ptr ptr) d3dx10_43.D3DXMatrixRotationQuaternion +@ stdcall D3DXMatrixRotationX(ptr long) d3dx10_43.D3DXMatrixRotationX +@ stdcall D3DXMatrixRotationY(ptr long) d3dx10_43.D3DXMatrixRotationY +@ stdcall D3DXMatrixRotationYawPitchRoll(ptr long long long) d3dx10_43.D3DXMatrixRotationYawPitchRoll +@ stdcall D3DXMatrixRotationZ(ptr long) d3dx10_43.D3DXMatrixRotationZ +@ stdcall D3DXMatrixScaling(ptr long long long) d3dx10_43.D3DXMatrixScaling +@ stdcall D3DXMatrixShadow(ptr ptr ptr) d3dx10_43.D3DXMatrixShadow +@ stdcall D3DXMatrixTransformation2D(ptr ptr long ptr ptr long ptr) d3dx10_43.D3DXMatrixTransformation2D +@ stdcall D3DXMatrixTransformation(ptr ptr ptr ptr ptr ptr ptr) d3dx10_43.D3DXMatrixTransformation +@ stdcall D3DXMatrixTranslation(ptr long long long) d3dx10_43.D3DXMatrixTranslation +@ stdcall D3DXMatrixTranspose(ptr ptr) d3dx10_43.D3DXMatrixTranspose +@ stdcall D3DXPlaneFromPointNormal(ptr ptr ptr) d3dx10_43.D3DXPlaneFromPointNormal +@ stdcall D3DXPlaneFromPoints(ptr ptr ptr ptr) d3dx10_43.D3DXPlaneFromPoints +@ stdcall D3DXPlaneIntersectLine(ptr ptr ptr ptr) d3dx10_43.D3DXPlaneIntersectLine +@ stdcall D3DXPlaneNormalize(ptr ptr) d3dx10_43.D3DXPlaneNormalize +@ stdcall D3DXPlaneTransform(ptr ptr ptr) d3dx10_43.D3DXPlaneTransform +@ stdcall D3DXPlaneTransformArray(ptr long ptr long ptr long) d3dx10_43.D3DXPlaneTransformArray +@ stdcall D3DXQuaternionBaryCentric(ptr ptr ptr ptr long long) d3dx10_43.D3DXQuaternionBaryCentric +@ stdcall D3DXQuaternionExp(ptr ptr) d3dx10_43.D3DXQuaternionExp +@ stdcall D3DXQuaternionInverse(ptr ptr) d3dx10_43.D3DXQuaternionInverse +@ stdcall D3DXQuaternionLn(ptr ptr) d3dx10_43.D3DXQuaternionLn +@ stdcall D3DXQuaternionMultiply(ptr ptr ptr) d3dx10_43.D3DXQuaternionMultiply +@ stdcall D3DXQuaternionNormalize(ptr ptr) d3dx10_43.D3DXQuaternionNormalize +@ stdcall D3DXQuaternionRotationAxis(ptr ptr long) d3dx10_43.D3DXQuaternionRotationAxis +@ stdcall D3DXQuaternionRotationMatrix(ptr ptr) d3dx10_43.D3DXQuaternionRotationMatrix +@ stdcall D3DXQuaternionRotationYawPitchRoll(ptr long long long) d3dx10_43.D3DXQuaternionRotationYawPitchRoll +@ stdcall D3DXQuaternionSlerp(ptr ptr ptr long) d3dx10_43.D3DXQuaternionSlerp +@ stdcall D3DXQuaternionSquad(ptr ptr ptr ptr ptr long) d3dx10_43.D3DXQuaternionSquad +@ stdcall D3DXQuaternionSquadSetup(ptr ptr ptr ptr ptr ptr ptr) d3dx10_43.D3DXQuaternionSquadSetup +@ stdcall D3DXQuaternionToAxisAngle(ptr ptr ptr) d3dx10_43.D3DXQuaternionToAxisAngle +@ stdcall D3DXSHAdd(ptr long ptr ptr) d3dx10_43.D3DXSHAdd +@ stdcall D3DXSHDot(long ptr ptr) d3dx10_43.D3DXSHDot +@ stdcall D3DXSHEvalConeLight(long ptr long long long long ptr ptr ptr) d3dx10_43.D3DXSHEvalConeLight +@ stdcall D3DXSHEvalDirection(ptr long ptr) d3dx10_43.D3DXSHEvalDirection +@ stdcall D3DXSHEvalDirectionalLight(long ptr long long long long ptr ptr ptr) d3dx10_43.D3DXSHEvalDirectionalLight +@ stdcall D3DXSHEvalHemisphereLight(long ptr long long ptr ptr ptr) d3dx10_43.D3DXSHEvalHemisphereLight +@ stdcall D3DXSHEvalSphericalLight(long ptr long long long long ptr ptr ptr) d3dx10_43.D3DXSHEvalSphericalLight +@ stdcall D3DXSHMultiply2(ptr ptr ptr) d3dx10_43.D3DXSHMultiply2 +@ stdcall D3DXSHMultiply3(ptr ptr ptr) d3dx10_43.D3DXSHMultiply3 +@ stdcall D3DXSHMultiply4(ptr ptr ptr) d3dx10_43.D3DXSHMultiply4 +@ stdcall D3DXSHMultiply5(ptr ptr ptr) d3dx10_43.D3DXSHMultiply5 +@ stdcall D3DXSHMultiply6(ptr ptr ptr) d3dx10_43.D3DXSHMultiply6 +@ stdcall D3DXSHRotate(ptr long ptr ptr) d3dx10_43.D3DXSHRotate +@ stdcall D3DXSHRotateZ(ptr long long ptr) d3dx10_43.D3DXSHRotateZ +@ stdcall D3DXSHScale(ptr long ptr ptr) d3dx10_43.D3DXSHScale +@ stdcall D3DXSphereBoundProbe(ptr long ptr ptr) d3dx10_43.D3DXSphereBoundProbe +@ stdcall D3DXVec2BaryCentric(ptr ptr ptr ptr long long) d3dx10_43.D3DXVec2BaryCentric +@ stdcall D3DXVec2CatmullRom(ptr ptr ptr ptr ptr long) d3dx10_43.D3DXVec2CatmullRom +@ stdcall D3DXVec2Hermite(ptr ptr ptr ptr ptr long) d3dx10_43.D3DXVec2Hermite +@ stdcall D3DXVec2Normalize(ptr ptr) d3dx10_43.D3DXVec2Normalize +@ stdcall D3DXVec2Transform(ptr ptr ptr) d3dx10_43.D3DXVec2Transform +@ stdcall D3DXVec2TransformArray(ptr long ptr long ptr long) d3dx10_43.D3DXVec2TransformArray +@ stdcall D3DXVec2TransformCoord(ptr ptr ptr) d3dx10_43.D3DXVec2TransformCoord +@ stdcall D3DXVec2TransformCoordArray(ptr long ptr long ptr long) d3dx10_43.D3DXVec2TransformCoordArray +@ stdcall D3DXVec2TransformNormal(ptr ptr ptr) d3dx10_43.D3DXVec2TransformNormal +@ stdcall D3DXVec2TransformNormalArray(ptr long ptr long ptr long) d3dx10_43.D3DXVec2TransformNormalArray +@ stdcall D3DXVec3BaryCentric(ptr ptr ptr ptr long long) d3dx10_43.D3DXVec3BaryCentric +@ stdcall D3DXVec3CatmullRom(ptr ptr ptr ptr ptr long) d3dx10_43.D3DXVec3CatmullRom +@ stdcall D3DXVec3Hermite(ptr ptr ptr ptr ptr long) d3dx10_43.D3DXVec3Hermite +@ stdcall D3DXVec3Normalize(ptr ptr) d3dx10_43.D3DXVec3Normalize +@ stdcall D3DXVec3Project(ptr ptr ptr ptr ptr ptr) d3dx10_43.D3DXVec3Project +@ stdcall D3DXVec3ProjectArray(ptr long ptr long ptr ptr ptr ptr long) d3dx10_43.D3DXVec3ProjectArray +@ stdcall D3DXVec3Transform(ptr ptr ptr) d3dx10_43.D3DXVec3Transform +@ stdcall D3DXVec3TransformArray(ptr long ptr long ptr long) d3dx10_43.D3DXVec3TransformArray +@ stdcall D3DXVec3TransformCoord(ptr ptr ptr) d3dx10_43.D3DXVec3TransformCoord +@ stdcall D3DXVec3TransformCoordArray(ptr long ptr long ptr long) d3dx10_43.D3DXVec3TransformCoordArray +@ stdcall D3DXVec3TransformNormal(ptr ptr ptr) d3dx10_43.D3DXVec3TransformNormal +@ stdcall D3DXVec3TransformNormalArray(ptr long ptr long ptr long) d3dx10_43.D3DXVec3TransformNormalArray +@ stdcall D3DXVec3Unproject(ptr ptr ptr ptr ptr ptr) d3dx10_43.D3DXVec3Unproject +@ stdcall D3DXVec3UnprojectArray(ptr long ptr long ptr ptr ptr ptr long) d3dx10_43.D3DXVec3UnprojectArray +@ stdcall D3DXVec4BaryCentric(ptr ptr ptr ptr long long) d3dx10_43.D3DXVec4BaryCentric +@ stdcall D3DXVec4CatmullRom(ptr ptr ptr ptr ptr long) d3dx10_43.D3DXVec4CatmullRom +@ stdcall D3DXVec4Cross(ptr ptr ptr ptr) d3dx10_43.D3DXVec4Cross +@ stdcall D3DXVec4Hermite(ptr ptr ptr ptr ptr long) d3dx10_43.D3DXVec4Hermite +@ stdcall D3DXVec4Normalize(ptr ptr) d3dx10_43.D3DXVec4Normalize +@ stdcall D3DXVec4Transform(ptr ptr ptr) d3dx10_43.D3DXVec4Transform +@ stdcall D3DXVec4TransformArray(ptr long ptr long ptr long) d3dx10_43.D3DXVec4TransformArray diff -Nru wine1.3-1.3.0/dlls/d3dx10_33/Makefile.in wine1.3-1.3.1/dlls/d3dx10_33/Makefile.in --- wine1.3-1.3.0/dlls/d3dx10_33/Makefile.in 1970-01-01 01:00:00.000000000 +0100 +++ wine1.3-1.3.1/dlls/d3dx10_33/Makefile.in 2010-08-20 18:23:50.000000000 +0100 @@ -0,0 +1,12 @@ +TOPSRCDIR = @top_srcdir@ +TOPOBJDIR = ../.. +SRCDIR = @srcdir@ +VPATH = @srcdir@ +MODULE = d3dx10_33.dll + +C_SRCS = \ + d3dx10_33_main.c + +RC_SRCS = version.rc + +@MAKE_DLL_RULES@ diff -Nru wine1.3-1.3.0/dlls/d3dx10_33/version.rc wine1.3-1.3.1/dlls/d3dx10_33/version.rc --- wine1.3-1.3.0/dlls/d3dx10_33/version.rc 1970-01-01 01:00:00.000000000 +0100 +++ wine1.3-1.3.1/dlls/d3dx10_33/version.rc 2010-08-20 18:23:50.000000000 +0100 @@ -0,0 +1,26 @@ +/* + * Copyright 2010 Owen Rudge for 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 + */ + +#define WINE_FILEDESCRIPTION_STR "Wine D3DX10" +#define WINE_FILENAME_STR "d3dx10_33.dll" +#define WINE_FILEVERSION 9,18,904,21 +#define WINE_FILEVERSION_STR "9.18.904.21" +#define WINE_PRODUCTVERSION 9,18,904,21 +#define WINE_PRODUCTVERSION_STR "9.18.904.21" + +#include "wine/wine_common_ver.rc" diff -Nru wine1.3-1.3.0/dlls/d3dx10_34/d3dx10_34_main.c wine1.3-1.3.1/dlls/d3dx10_34/d3dx10_34_main.c --- wine1.3-1.3.0/dlls/d3dx10_34/d3dx10_34_main.c 1970-01-01 01:00:00.000000000 +0100 +++ wine1.3-1.3.1/dlls/d3dx10_34/d3dx10_34_main.c 2010-08-20 18:23:50.000000000 +0100 @@ -0,0 +1,63 @@ +/* + * D3DX10 main file + * + * Copyright (c) 2010 Owen Rudge for 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 "wine/port.h" + +#include + +#define COBJMACROS + +#include "windef.h" +#include "winbase.h" +#include "winuser.h" +#include "objbase.h" + +#include "d3d10.h" + +BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved) +{ + switch (fdwReason) + { + case DLL_WINE_PREATTACH: + return FALSE; /* prefer native version */ + case DLL_PROCESS_ATTACH: + DisableThreadLibraryCalls(hinstDLL); + break; + case DLL_PROCESS_DETACH: + break; + } + + return TRUE; +} + +/*********************************************************************** + * D3DX10CheckVersion + * + * Checks whether we are compiling against the correct d3d and d3dx library. + */ +BOOL WINAPI D3DX10CheckVersion(UINT d3dsdkvers, UINT d3dxsdkvers) +{ + if ((d3dsdkvers == D3D10_SDK_VERSION) && (d3dxsdkvers == 34)) + return TRUE; + + return FALSE; +} diff -Nru wine1.3-1.3.0/dlls/d3dx10_34/d3dx10_34.spec wine1.3-1.3.1/dlls/d3dx10_34/d3dx10_34.spec --- wine1.3-1.3.0/dlls/d3dx10_34/d3dx10_34.spec 1970-01-01 01:00:00.000000000 +0100 +++ wine1.3-1.3.1/dlls/d3dx10_34/d3dx10_34.spec 2010-08-20 18:23:50.000000000 +0100 @@ -0,0 +1,177 @@ +@ stdcall D3DX10CreateThreadPump(long long ptr) d3dx10_43.D3DX10CreateThreadPump +@ stdcall D3DX10CheckVersion(long long) +@ stdcall D3DX10CompileFromFileA(str ptr ptr str str long long ptr ptr ptr ptr) d3dx10_43.D3DX10CompileFromFileA +@ stdcall D3DX10CompileFromFileW(wstr ptr ptr str str long long ptr ptr ptr ptr) d3dx10_43.D3DX10CompileFromFileW +@ stdcall D3DX10CompileFromMemory(str long str ptr ptr str str long long ptr ptr ptr ptr) d3dx10_43.D3DX10CompileFromMemory +@ stdcall D3DX10CompileFromResourceA(long str str ptr ptr str str long long ptr ptr ptr ptr) d3dx10_43.D3DX10CompileFromResourceA +@ stdcall D3DX10CompileFromResourceW(long wstr wstr ptr ptr str str long long ptr ptr ptr ptr) d3dx10_43.D3DX10CompileFromResourceW +@ stdcall D3DX10ComputeNormalMap(ptr long long long ptr) d3dx10_43.D3DX10ComputeNormalMap +@ stdcall D3DX10CreateAsyncCompilerProcessor(str ptr ptr str str long long ptr ptr ptr) d3dx10_43.D3DX10CreateAsyncCompilerProcessor +@ stdcall D3DX10CreateAsyncEffectCreateProcessor(str ptr ptr str long long ptr ptr ptr ptr) d3dx10_43.D3DX10CreateAsyncEffectCreateProcessor +@ stdcall D3DX10CreateAsyncEffectPoolCreateProcessor(str ptr ptr str long long ptr ptr ptr) d3dx10_43.D3DX10CreateAsyncEffectPoolCreateProcessor +@ stdcall D3DX10CreateAsyncFileLoaderA(str ptr) d3dx10_43.D3DX10CreateAsyncFileLoaderA +@ stdcall D3DX10CreateAsyncFileLoaderW(wstr ptr) d3dx10_43.D3DX10CreateAsyncFileLoaderW +@ stdcall D3DX10CreateAsyncMemoryLoader(ptr long ptr) d3dx10_43.D3DX10CreateAsyncMemoryLoader +@ stdcall D3DX10CreateAsyncResourceLoaderA(long str ptr) d3dx10_43.D3DX10CreateAsyncResourceLoaderA +@ stdcall D3DX10CreateAsyncResourceLoaderW(long wstr ptr) d3dx10_43.D3DX10CreateAsyncResourceLoaderW +@ stdcall D3DX10CreateAsyncShaderPreprocessProcessor(str ptr ptr ptr ptr ptr) d3dx10_43.D3DX10CreateAsyncShaderPreprocessProcessor +@ stdcall D3DX10CreateAsyncShaderResourceViewProcessor(ptr ptr ptr) d3dx10_43.D3DX10CreateAsyncShaderResourceViewProcessor +@ stdcall D3DX10CreateAsyncTextureInfoProcessor(ptr ptr) d3dx10_43.D3DX10CreateAsyncTextureInfoProcessor +@ stdcall D3DX10CreateAsyncTextureProcessor(ptr ptr ptr) d3dx10_43.D3DX10CreateAsyncTextureProcessor +@ stdcall D3DX10CreateEffectFromFileA(str ptr ptr str long long ptr ptr ptr ptr ptr ptr) d3dx10_43.D3DX10CreateEffectFromFileA +@ stdcall D3DX10CreateEffectFromFileW(wstr ptr ptr str long long ptr ptr ptr ptr ptr ptr) d3dx10_43.D3DX10CreateEffectFromFileW +@ stdcall D3DX10CreateEffectFromMemory(ptr long str ptr ptr str long long ptr ptr ptr ptr ptr ptr) d3dx10_43.D3DX10CreateEffectFromMemory +@ stdcall D3DX10CreateEffectFromResourceA(long str str ptr ptr str long long ptr ptr ptr ptr ptr ptr) d3dx10_43.D3DX10CreateEffectFromResourceA +@ stdcall D3DX10CreateEffectFromResourceW(long wstr wstr ptr ptr str long long ptr ptr ptr ptr ptr ptr) d3dx10_43.D3DX10CreateEffectFromResourceW +@ stdcall D3DX10CreateEffectPoolFromFileA(str ptr ptr str long long ptr ptr ptr ptr ptr) d3dx10_43.D3DX10CreateEffectPoolFromFileA +@ stdcall D3DX10CreateEffectPoolFromFileW(wstr ptr ptr str long long ptr ptr ptr ptr ptr) d3dx10_43.D3DX10CreateEffectPoolFromFileW +@ stdcall D3DX10CreateEffectPoolFromMemory(ptr long str ptr ptr str long long ptr ptr ptr ptr ptr) d3dx10_43.D3DX10CreateEffectPoolFromMemory +@ stdcall D3DX10CreateEffectPoolFromResourceA(long str str ptr ptr str long long ptr ptr ptr ptr ptr) d3dx10_43.D3DX10CreateEffectPoolFromResourceA +@ stdcall D3DX10CreateEffectPoolFromResourceW(long wstr wstr ptr ptr str long long ptr ptr ptr ptr ptr) d3dx10_43.D3DX10CreateEffectPoolFromResourceW +@ stdcall D3DX10CreateFontA(ptr long long long long long long long long long str ptr) d3dx10_43.D3DX10CreateFontA +@ stdcall D3DX10CreateFontIndirectA(ptr ptr ptr) d3dx10_43.D3DX10CreateFontIndirectA +@ stdcall D3DX10CreateFontIndirectW(ptr ptr ptr) d3dx10_43.D3DX10CreateFontIndirectW +@ stdcall D3DX10CreateFontW(ptr long long long long long long long long long wstr ptr) d3dx10_43.D3DX10CreateFontW +@ stdcall D3DX10CreateMesh(ptr ptr long str long long long ptr) d3dx10_43.D3DX10CreateMesh +@ stdcall D3DX10CreateShaderResourceViewFromFileA(ptr str ptr ptr ptr ptr) d3dx10_43.D3DX10CreateShaderResourceViewFromFileA +@ stdcall D3DX10CreateShaderResourceViewFromFileW(ptr wstr ptr ptr ptr ptr) d3dx10_43.D3DX10CreateShaderResourceViewFromFileW +@ stdcall D3DX10CreateShaderResourceViewFromMemory(ptr ptr long ptr ptr ptr ptr) d3dx10_43.D3DX10CreateShaderResourceViewFromMemory +@ stdcall D3DX10CreateShaderResourceViewFromResourceA(ptr long str ptr ptr ptr ptr) d3dx10_43.D3DX10CreateShaderResourceViewFromResourceA +@ stdcall D3DX10CreateShaderResourceViewFromResourceW(ptr long wstr ptr ptr ptr ptr) d3dx10_43.D3DX10CreateShaderResourceViewFromResourceW +@ stdcall D3DX10CreateSkinInfo(ptr) d3dx10_43.D3DX10CreateSkinInfo +@ stdcall D3DX10CreateSprite(ptr long ptr) d3dx10_43.D3DX10CreateSprite +@ stdcall D3DX10CreateTextureFromFileA(ptr str ptr ptr ptr ptr) d3dx10_43.D3DX10CreateTextureFromFileA +@ stdcall D3DX10CreateTextureFromFileW(ptr wstr ptr ptr ptr ptr) d3dx10_43.D3DX10CreateTextureFromFileW +@ stdcall D3DX10CreateTextureFromMemory(ptr ptr long ptr ptr ptr ptr) d3dx10_43.D3DX10CreateTextureFromMemory +@ stdcall D3DX10CreateTextureFromResourceA(ptr long str ptr ptr ptr ptr) d3dx10_43.D3DX10CreateTextureFromResourceA +@ stdcall D3DX10CreateTextureFromResourceW(ptr long wstr ptr ptr ptr ptr) d3dx10_43.D3DX10CreateTextureFromResourceW +@ stdcall D3DX10DisassembleEffect(ptr long ptr) d3dx10_39.D3DX10DisassembleEffect +@ stdcall D3DX10DisassembleShader(ptr long long str ptr) d3dx10_39.D3DX10DisassembleShader +@ stdcall D3DX10FilterTexture(ptr long long) d3dx10_43.D3DX10FilterTexture +@ stdcall D3DX10GetDriverLevel(ptr) d3dx10_37.D3DX10GetDriverLevel +@ stdcall D3DX10GetImageInfoFromFileA(str ptr ptr ptr) d3dx10_43.D3DX10GetImageInfoFromFileA +@ stdcall D3DX10GetImageInfoFromFileW(wstr ptr ptr ptr) d3dx10_43.D3DX10GetImageInfoFromFileW +@ stdcall D3DX10GetImageInfoFromMemory(ptr long ptr ptr ptr) d3dx10_43.D3DX10GetImageInfoFromMemory +@ stdcall D3DX10GetImageInfoFromResourceA(long str ptr ptr ptr) d3dx10_43.D3DX10GetImageInfoFromResourceA +@ stdcall D3DX10GetImageInfoFromResourceW(long wstr ptr ptr ptr) d3dx10_43.D3DX10GetImageInfoFromResourceW +@ stdcall D3DX10LoadTextureFromTexture(ptr ptr ptr) d3dx10_43.D3DX10LoadTextureFromTexture +@ stdcall D3DX10PreprocessShaderFromFileA(str ptr ptr ptr ptr ptr) d3dx10_43.D3DX10PreprocessShaderFromFileA +@ stdcall D3DX10PreprocessShaderFromFileW(wstr ptr ptr ptr ptr ptr) d3dx10_43.D3DX10PreprocessShaderFromFileW +@ stdcall D3DX10PreprocessShaderFromMemory(str long str ptr ptr ptr ptr ptr) d3dx10_43.D3DX10PreprocessShaderFromMemory +@ stdcall D3DX10PreprocessShaderFromResourceA(long str str ptr ptr ptr ptr ptr) d3dx10_43.D3DX10PreprocessShaderFromResourceA +@ stdcall D3DX10PreprocessShaderFromResourceW(long wstr wstr ptr ptr ptr ptr ptr) d3dx10_43.D3DX10PreprocessShaderFromResourceW +@ stdcall D3DX10ReflectShader(ptr long ptr) d3dx10_39.D3DX10ReflectShader +@ stdcall D3DX10SHProjectCubeMap(long ptr ptr ptr ptr) d3dx10_43.D3DX10SHProjectCubeMap +@ stdcall D3DX10SaveTextureToFileA(ptr ptr str) d3dx10_43.D3DX10SaveTextureToFileA +@ stdcall D3DX10SaveTextureToFileW(ptr ptr wstr) d3dx10_43.D3DX10SaveTextureToFileW +@ stdcall D3DX10SaveTextureToMemory(ptr ptr ptr long) d3dx10_43.D3DX10SaveTextureToMemory +@ stdcall D3DX10UnsetAllDeviceObjects(ptr) d3dx10_43.D3DX10UnsetAllDeviceObjects +@ stdcall D3DXBoxBoundProbe(ptr ptr ptr ptr) d3dx10_43.D3DXBoxBoundProbe +@ stdcall D3DXColorAdjustContrast(ptr ptr long) d3dx10_43.3DXColorAdjustContrast +@ stdcall D3DXColorAdjustSaturation(ptr ptr long) d3dx10_43.D3DXColorAdjustSaturation +@ stdcall D3DXComputeBoundingBox(ptr long long ptr ptr) d3dx10_43.D3DXComputeBoundingBox +@ stdcall D3DXComputeBoundingSphere(ptr long long ptr ptr) d3dx10_43.D3DXComputeBoundingSphere +@ stdcall D3DXCpuOptimizations(long) d3dx10_43.D3DXCpuOptimizations +@ stdcall D3DXCreateMatrixStack(long ptr) d3dx10_43.D3DXCreateMatrixStack +@ stdcall D3DXFloat16To32Array(ptr ptr long) d3dx10_43.D3DXFloat16To32Array +@ stdcall D3DXFloat32To16Array(ptr ptr long) d3dx10_43.D3DXFloat32To16Array +@ stdcall D3DXFresnelTerm(long long) d3dx10_43.D3DXFresnelTerm +@ stdcall D3DXIntersectTri(ptr ptr ptr ptr ptr ptr ptr ptr) d3dx10_43.D3DXIntersectTri +@ stdcall D3DXMatrixAffineTransformation2D(ptr long ptr long ptr) d3dx10_43.D3DXMatrixAffineTransformation2D +@ stdcall D3DXMatrixAffineTransformation(ptr long ptr ptr ptr) d3dx10_43.D3DXMatrixAffineTransformation +@ stdcall D3DXMatrixDecompose(ptr ptr ptr ptr) d3dx10_43.D3DXMatrixDecompose +@ stdcall D3DXMatrixDeterminant(ptr) d3dx10_43.D3DXMatrixDeterminant +@ stdcall D3DXMatrixInverse(ptr ptr ptr) d3dx10_43.D3DXMatrixInverse +@ stdcall D3DXMatrixLookAtLH(ptr ptr ptr ptr) d3dx10_43.D3DXMatrixLookAtLH +@ stdcall D3DXMatrixLookAtRH(ptr ptr ptr ptr) d3dx10_43.D3DXMatrixLookAtRH +@ stdcall D3DXMatrixMultiply(ptr ptr ptr) d3dx10_43.D3DXMatrixMultiply +@ stdcall D3DXMatrixMultiplyTranspose(ptr ptr ptr) d3dx10_43.D3DXMatrixMultiplyTranspose +@ stdcall D3DXMatrixOrthoLH(ptr long long long long) d3dx10_43.D3DXMatrixOrthoLH +@ stdcall D3DXMatrixOrthoOffCenterLH(ptr long long long long long long) d3dx10_43.D3DXMatrixOrthoOffCenterLH +@ stdcall D3DXMatrixOrthoOffCenterRH(ptr long long long long long long) d3dx10_43.D3DXMatrixOrthoOffCenterRH +@ stdcall D3DXMatrixOrthoRH(ptr long long long long) d3dx10_43.D3DXMatrixOrthoRH +@ stdcall D3DXMatrixPerspectiveFovLH(ptr long long long long) d3dx10_43.D3DXMatrixPerspectiveFovLH +@ stdcall D3DXMatrixPerspectiveFovRH(ptr long long long long) d3dx10_43.D3DXMatrixPerspectiveFovRH +@ stdcall D3DXMatrixPerspectiveLH(ptr long long long long) d3dx10_43.D3DXMatrixPerspectiveLH +@ stdcall D3DXMatrixPerspectiveOffCenterLH(ptr long long long long long long) d3dx10_43.D3DXMatrixPerspectiveOffCenterLH +@ stdcall D3DXMatrixPerspectiveOffCenterRH(ptr long long long long long long) d3dx10_43.D3DXMatrixPerspectiveOffCenterRH +@ stdcall D3DXMatrixPerspectiveRH(ptr long long long long) d3dx10_43.D3DXMatrixPerspectiveRH +@ stdcall D3DXMatrixReflect(ptr ptr) d3dx10_43.D3DXMatrixReflect +@ stdcall D3DXMatrixRotationAxis(ptr ptr long) d3dx10_43.D3DXMatrixRotationAxis +@ stdcall D3DXMatrixRotationQuaternion(ptr ptr) d3dx10_43.D3DXMatrixRotationQuaternion +@ stdcall D3DXMatrixRotationX(ptr long) d3dx10_43.D3DXMatrixRotationX +@ stdcall D3DXMatrixRotationY(ptr long) d3dx10_43.D3DXMatrixRotationY +@ stdcall D3DXMatrixRotationYawPitchRoll(ptr long long long) d3dx10_43.D3DXMatrixRotationYawPitchRoll +@ stdcall D3DXMatrixRotationZ(ptr long) d3dx10_43.D3DXMatrixRotationZ +@ stdcall D3DXMatrixScaling(ptr long long long) d3dx10_43.D3DXMatrixScaling +@ stdcall D3DXMatrixShadow(ptr ptr ptr) d3dx10_43.D3DXMatrixShadow +@ stdcall D3DXMatrixTransformation2D(ptr ptr long ptr ptr long ptr) d3dx10_43.D3DXMatrixTransformation2D +@ stdcall D3DXMatrixTransformation(ptr ptr ptr ptr ptr ptr ptr) d3dx10_43.D3DXMatrixTransformation +@ stdcall D3DXMatrixTranslation(ptr long long long) d3dx10_43.D3DXMatrixTranslation +@ stdcall D3DXMatrixTranspose(ptr ptr) d3dx10_43.D3DXMatrixTranspose +@ stdcall D3DXPlaneFromPointNormal(ptr ptr ptr) d3dx10_43.D3DXPlaneFromPointNormal +@ stdcall D3DXPlaneFromPoints(ptr ptr ptr ptr) d3dx10_43.D3DXPlaneFromPoints +@ stdcall D3DXPlaneIntersectLine(ptr ptr ptr ptr) d3dx10_43.D3DXPlaneIntersectLine +@ stdcall D3DXPlaneNormalize(ptr ptr) d3dx10_43.D3DXPlaneNormalize +@ stdcall D3DXPlaneTransform(ptr ptr ptr) d3dx10_43.D3DXPlaneTransform +@ stdcall D3DXPlaneTransformArray(ptr long ptr long ptr long) d3dx10_43.D3DXPlaneTransformArray +@ stdcall D3DXQuaternionBaryCentric(ptr ptr ptr ptr long long) d3dx10_43.D3DXQuaternionBaryCentric +@ stdcall D3DXQuaternionExp(ptr ptr) d3dx10_43.D3DXQuaternionExp +@ stdcall D3DXQuaternionInverse(ptr ptr) d3dx10_43.D3DXQuaternionInverse +@ stdcall D3DXQuaternionLn(ptr ptr) d3dx10_43.D3DXQuaternionLn +@ stdcall D3DXQuaternionMultiply(ptr ptr ptr) d3dx10_43.D3DXQuaternionMultiply +@ stdcall D3DXQuaternionNormalize(ptr ptr) d3dx10_43.D3DXQuaternionNormalize +@ stdcall D3DXQuaternionRotationAxis(ptr ptr long) d3dx10_43.D3DXQuaternionRotationAxis +@ stdcall D3DXQuaternionRotationMatrix(ptr ptr) d3dx10_43.D3DXQuaternionRotationMatrix +@ stdcall D3DXQuaternionRotationYawPitchRoll(ptr long long long) d3dx10_43.D3DXQuaternionRotationYawPitchRoll +@ stdcall D3DXQuaternionSlerp(ptr ptr ptr long) d3dx10_43.D3DXQuaternionSlerp +@ stdcall D3DXQuaternionSquad(ptr ptr ptr ptr ptr long) d3dx10_43.D3DXQuaternionSquad +@ stdcall D3DXQuaternionSquadSetup(ptr ptr ptr ptr ptr ptr ptr) d3dx10_43.D3DXQuaternionSquadSetup +@ stdcall D3DXQuaternionToAxisAngle(ptr ptr ptr) d3dx10_43.D3DXQuaternionToAxisAngle +@ stdcall D3DXSHAdd(ptr long ptr ptr) d3dx10_43.D3DXSHAdd +@ stdcall D3DXSHDot(long ptr ptr) d3dx10_43.D3DXSHDot +@ stdcall D3DXSHEvalConeLight(long ptr long long long long ptr ptr ptr) d3dx10_43.D3DXSHEvalConeLight +@ stdcall D3DXSHEvalDirection(ptr long ptr) d3dx10_43.D3DXSHEvalDirection +@ stdcall D3DXSHEvalDirectionalLight(long ptr long long long long ptr ptr ptr) d3dx10_43.D3DXSHEvalDirectionalLight +@ stdcall D3DXSHEvalHemisphereLight(long ptr long long ptr ptr ptr) d3dx10_43.D3DXSHEvalHemisphereLight +@ stdcall D3DXSHEvalSphericalLight(long ptr long long long long ptr ptr ptr) d3dx10_43.D3DXSHEvalSphericalLight +@ stdcall D3DXSHMultiply2(ptr ptr ptr) d3dx10_43.D3DXSHMultiply2 +@ stdcall D3DXSHMultiply3(ptr ptr ptr) d3dx10_43.D3DXSHMultiply3 +@ stdcall D3DXSHMultiply4(ptr ptr ptr) d3dx10_43.D3DXSHMultiply4 +@ stdcall D3DXSHMultiply5(ptr ptr ptr) d3dx10_43.D3DXSHMultiply5 +@ stdcall D3DXSHMultiply6(ptr ptr ptr) d3dx10_43.D3DXSHMultiply6 +@ stdcall D3DXSHRotate(ptr long ptr ptr) d3dx10_43.D3DXSHRotate +@ stdcall D3DXSHRotateZ(ptr long long ptr) d3dx10_43.D3DXSHRotateZ +@ stdcall D3DXSHScale(ptr long ptr ptr) d3dx10_43.D3DXSHScale +@ stdcall D3DXSphereBoundProbe(ptr long ptr ptr) d3dx10_43.D3DXSphereBoundProbe +@ stdcall D3DXVec2BaryCentric(ptr ptr ptr ptr long long) d3dx10_43.D3DXVec2BaryCentric +@ stdcall D3DXVec2CatmullRom(ptr ptr ptr ptr ptr long) d3dx10_43.D3DXVec2CatmullRom +@ stdcall D3DXVec2Hermite(ptr ptr ptr ptr ptr long) d3dx10_43.D3DXVec2Hermite +@ stdcall D3DXVec2Normalize(ptr ptr) d3dx10_43.D3DXVec2Normalize +@ stdcall D3DXVec2Transform(ptr ptr ptr) d3dx10_43.D3DXVec2Transform +@ stdcall D3DXVec2TransformArray(ptr long ptr long ptr long) d3dx10_43.D3DXVec2TransformArray +@ stdcall D3DXVec2TransformCoord(ptr ptr ptr) d3dx10_43.D3DXVec2TransformCoord +@ stdcall D3DXVec2TransformCoordArray(ptr long ptr long ptr long) d3dx10_43.D3DXVec2TransformCoordArray +@ stdcall D3DXVec2TransformNormal(ptr ptr ptr) d3dx10_43.D3DXVec2TransformNormal +@ stdcall D3DXVec2TransformNormalArray(ptr long ptr long ptr long) d3dx10_43.D3DXVec2TransformNormalArray +@ stdcall D3DXVec3BaryCentric(ptr ptr ptr ptr long long) d3dx10_43.D3DXVec3BaryCentric +@ stdcall D3DXVec3CatmullRom(ptr ptr ptr ptr ptr long) d3dx10_43.D3DXVec3CatmullRom +@ stdcall D3DXVec3Hermite(ptr ptr ptr ptr ptr long) d3dx10_43.D3DXVec3Hermite +@ stdcall D3DXVec3Normalize(ptr ptr) d3dx10_43.D3DXVec3Normalize +@ stdcall D3DXVec3Project(ptr ptr ptr ptr ptr ptr) d3dx10_43.D3DXVec3Project +@ stdcall D3DXVec3ProjectArray(ptr long ptr long ptr ptr ptr ptr long) d3dx10_43.D3DXVec3ProjectArray +@ stdcall D3DXVec3Transform(ptr ptr ptr) d3dx10_43.D3DXVec3Transform +@ stdcall D3DXVec3TransformArray(ptr long ptr long ptr long) d3dx10_43.D3DXVec3TransformArray +@ stdcall D3DXVec3TransformCoord(ptr ptr ptr) d3dx10_43.D3DXVec3TransformCoord +@ stdcall D3DXVec3TransformCoordArray(ptr long ptr long ptr long) d3dx10_43.D3DXVec3TransformCoordArray +@ stdcall D3DXVec3TransformNormal(ptr ptr ptr) d3dx10_43.D3DXVec3TransformNormal +@ stdcall D3DXVec3TransformNormalArray(ptr long ptr long ptr long) d3dx10_43.D3DXVec3TransformNormalArray +@ stdcall D3DXVec3Unproject(ptr ptr ptr ptr ptr ptr) d3dx10_43.D3DXVec3Unproject +@ stdcall D3DXVec3UnprojectArray(ptr long ptr long ptr ptr ptr ptr long) d3dx10_43.D3DXVec3UnprojectArray +@ stdcall D3DXVec4BaryCentric(ptr ptr ptr ptr long long) d3dx10_43.D3DXVec4BaryCentric +@ stdcall D3DXVec4CatmullRom(ptr ptr ptr ptr ptr long) d3dx10_43.D3DXVec4CatmullRom +@ stdcall D3DXVec4Cross(ptr ptr ptr ptr) d3dx10_43.D3DXVec4Cross +@ stdcall D3DXVec4Hermite(ptr ptr ptr ptr ptr long) d3dx10_43.D3DXVec4Hermite +@ stdcall D3DXVec4Normalize(ptr ptr) d3dx10_43.D3DXVec4Normalize +@ stdcall D3DXVec4Transform(ptr ptr ptr) d3dx10_43.D3DXVec4Transform +@ stdcall D3DXVec4TransformArray(ptr long ptr long ptr long) d3dx10_43.D3DXVec4TransformArray diff -Nru wine1.3-1.3.0/dlls/d3dx10_34/Makefile.in wine1.3-1.3.1/dlls/d3dx10_34/Makefile.in --- wine1.3-1.3.0/dlls/d3dx10_34/Makefile.in 1970-01-01 01:00:00.000000000 +0100 +++ wine1.3-1.3.1/dlls/d3dx10_34/Makefile.in 2010-08-20 18:23:50.000000000 +0100 @@ -0,0 +1,12 @@ +TOPSRCDIR = @top_srcdir@ +TOPOBJDIR = ../.. +SRCDIR = @srcdir@ +VPATH = @srcdir@ +MODULE = d3dx10_34.dll + +C_SRCS = \ + d3dx10_34_main.c + +RC_SRCS = version.rc + +@MAKE_DLL_RULES@ diff -Nru wine1.3-1.3.0/dlls/d3dx10_34/version.rc wine1.3-1.3.1/dlls/d3dx10_34/version.rc --- wine1.3-1.3.0/dlls/d3dx10_34/version.rc 1970-01-01 01:00:00.000000000 +0100 +++ wine1.3-1.3.1/dlls/d3dx10_34/version.rc 2010-08-20 18:23:50.000000000 +0100 @@ -0,0 +1,26 @@ +/* + * Copyright 2010 Owen Rudge for 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 + */ + +#define WINE_FILEDESCRIPTION_STR "Wine D3DX10" +#define WINE_FILENAME_STR "d3dx10_34.dll" +#define WINE_FILEVERSION 9,19,949,46 +#define WINE_FILEVERSION_STR "9.19.949.46" +#define WINE_PRODUCTVERSION 9,19,949,46 +#define WINE_PRODUCTVERSION_STR "9.19.949.46" + +#include "wine/wine_common_ver.rc" diff -Nru wine1.3-1.3.0/dlls/d3dx10_35/d3dx10_35_main.c wine1.3-1.3.1/dlls/d3dx10_35/d3dx10_35_main.c --- wine1.3-1.3.0/dlls/d3dx10_35/d3dx10_35_main.c 1970-01-01 01:00:00.000000000 +0100 +++ wine1.3-1.3.1/dlls/d3dx10_35/d3dx10_35_main.c 2010-08-20 18:23:50.000000000 +0100 @@ -0,0 +1,63 @@ +/* + * D3DX10 main file + * + * Copyright (c) 2010 Owen Rudge for 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 "wine/port.h" + +#include + +#define COBJMACROS + +#include "windef.h" +#include "winbase.h" +#include "winuser.h" +#include "objbase.h" + +#include "d3d10.h" + +BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved) +{ + switch (fdwReason) + { + case DLL_WINE_PREATTACH: + return FALSE; /* prefer native version */ + case DLL_PROCESS_ATTACH: + DisableThreadLibraryCalls(hinstDLL); + break; + case DLL_PROCESS_DETACH: + break; + } + + return TRUE; +} + +/*********************************************************************** + * D3DX10CheckVersion + * + * Checks whether we are compiling against the correct d3d and d3dx library. + */ +BOOL WINAPI D3DX10CheckVersion(UINT d3dsdkvers, UINT d3dxsdkvers) +{ + if ((d3dsdkvers == D3D10_SDK_VERSION) && (d3dxsdkvers == 35)) + return TRUE; + + return FALSE; +} diff -Nru wine1.3-1.3.0/dlls/d3dx10_35/d3dx10_35.spec wine1.3-1.3.1/dlls/d3dx10_35/d3dx10_35.spec --- wine1.3-1.3.0/dlls/d3dx10_35/d3dx10_35.spec 1970-01-01 01:00:00.000000000 +0100 +++ wine1.3-1.3.1/dlls/d3dx10_35/d3dx10_35.spec 2010-08-20 18:23:50.000000000 +0100 @@ -0,0 +1,180 @@ +@ stdcall D3DX10CreateThreadPump(long long ptr) d3dx10_43.D3DX10CreateThreadPump +@ stdcall D3DX10CheckVersion(long long) +@ stdcall D3DX10CompileFromFileA(str ptr ptr str str long long ptr ptr ptr ptr) d3dx10_43.D3DX10CompileFromFileA +@ stdcall D3DX10CompileFromFileW(wstr ptr ptr str str long long ptr ptr ptr ptr) d3dx10_43.D3DX10CompileFromFileW +@ stdcall D3DX10CompileFromMemory(str long str ptr ptr str str long long ptr ptr ptr ptr) d3dx10_43.D3DX10CompileFromMemory +@ stdcall D3DX10CompileFromResourceA(long str str ptr ptr str str long long ptr ptr ptr ptr) d3dx10_43.D3DX10CompileFromResourceA +@ stdcall D3DX10CompileFromResourceW(long wstr wstr ptr ptr str str long long ptr ptr ptr ptr) d3dx10_43.D3DX10CompileFromResourceW +@ stdcall D3DX10ComputeNormalMap(ptr long long long ptr) d3dx10_43.D3DX10ComputeNormalMap +@ stdcall D3DX10CreateAsyncCompilerProcessor(str ptr ptr str str long long ptr ptr ptr) d3dx10_43.D3DX10CreateAsyncCompilerProcessor +@ stdcall D3DX10CreateAsyncEffectCreateProcessor(str ptr ptr str long long ptr ptr ptr ptr) d3dx10_43.D3DX10CreateAsyncEffectCreateProcessor +@ stdcall D3DX10CreateAsyncEffectPoolCreateProcessor(str ptr ptr str long long ptr ptr ptr) d3dx10_43.D3DX10CreateAsyncEffectPoolCreateProcessor +@ stdcall D3DX10CreateAsyncFileLoaderA(str ptr) d3dx10_43.D3DX10CreateAsyncFileLoaderA +@ stdcall D3DX10CreateAsyncFileLoaderW(wstr ptr) d3dx10_43.D3DX10CreateAsyncFileLoaderW +@ stdcall D3DX10CreateAsyncMemoryLoader(ptr long ptr) d3dx10_43.D3DX10CreateAsyncMemoryLoader +@ stdcall D3DX10CreateAsyncResourceLoaderA(long str ptr) d3dx10_43.D3DX10CreateAsyncResourceLoaderA +@ stdcall D3DX10CreateAsyncResourceLoaderW(long wstr ptr) d3dx10_43.D3DX10CreateAsyncResourceLoaderW +@ stdcall D3DX10CreateAsyncShaderPreprocessProcessor(str ptr ptr ptr ptr ptr) d3dx10_43.D3DX10CreateAsyncShaderPreprocessProcessor +@ stdcall D3DX10CreateAsyncShaderResourceViewProcessor(ptr ptr ptr) d3dx10_43.D3DX10CreateAsyncShaderResourceViewProcessor +@ stdcall D3DX10CreateAsyncTextureInfoProcessor(ptr ptr) d3dx10_43.D3DX10CreateAsyncTextureInfoProcessor +@ stdcall D3DX10CreateAsyncTextureProcessor(ptr ptr ptr) d3dx10_43.D3DX10CreateAsyncTextureProcessor +@ stdcall D3DX10CreateDevice(ptr long long long ptr) d3dx10_43.D3DX10CreateDevice +@ stdcall D3DX10CreateDeviceAndSwapChain(ptr long long long ptr ptr ptr) d3dx10_43.D3DX10CreateDeviceAndSwapChain +@ stdcall D3DX10CreateEffectFromFileA(str ptr ptr str long long ptr ptr ptr ptr ptr ptr) d3dx10_43.D3DX10CreateEffectFromFileA +@ stdcall D3DX10CreateEffectFromFileW(wstr ptr ptr str long long ptr ptr ptr ptr ptr ptr) d3dx10_43.D3DX10CreateEffectFromFileW +@ stdcall D3DX10CreateEffectFromMemory(ptr long str ptr ptr str long long ptr ptr ptr ptr ptr ptr) d3dx10_43.D3DX10CreateEffectFromMemory +@ stdcall D3DX10CreateEffectFromResourceA(long str str ptr ptr str long long ptr ptr ptr ptr ptr ptr) d3dx10_43.D3DX10CreateEffectFromResourceA +@ stdcall D3DX10CreateEffectFromResourceW(long wstr wstr ptr ptr str long long ptr ptr ptr ptr ptr ptr) d3dx10_43.D3DX10CreateEffectFromResourceW +@ stdcall D3DX10CreateEffectPoolFromFileA(str ptr ptr str long long ptr ptr ptr ptr ptr) d3dx10_43.D3DX10CreateEffectPoolFromFileA +@ stdcall D3DX10CreateEffectPoolFromFileW(wstr ptr ptr str long long ptr ptr ptr ptr ptr) d3dx10_43.D3DX10CreateEffectPoolFromFileW +@ stdcall D3DX10CreateEffectPoolFromMemory(ptr long str ptr ptr str long long ptr ptr ptr ptr ptr) d3dx10_43.D3DX10CreateEffectPoolFromMemory +@ stdcall D3DX10CreateEffectPoolFromResourceA(long str str ptr ptr str long long ptr ptr ptr ptr ptr) d3dx10_43.D3DX10CreateEffectPoolFromResourceA +@ stdcall D3DX10CreateEffectPoolFromResourceW(long wstr wstr ptr ptr str long long ptr ptr ptr ptr ptr) d3dx10_43.D3DX10CreateEffectPoolFromResourceW +@ stdcall D3DX10CreateFontA(ptr long long long long long long long long long str ptr) d3dx10_43.D3DX10CreateFontA +@ stdcall D3DX10CreateFontIndirectA(ptr ptr ptr) d3dx10_43.D3DX10CreateFontIndirectA +@ stdcall D3DX10CreateFontIndirectW(ptr ptr ptr) d3dx10_43.D3DX10CreateFontIndirectW +@ stdcall D3DX10CreateFontW(ptr long long long long long long long long long wstr ptr) d3dx10_43.D3DX10CreateFontW +@ stdcall D3DX10CreateMesh(ptr ptr long str long long long ptr) d3dx10_43.D3DX10CreateMesh +@ stdcall D3DX10CreateShaderResourceViewFromFileA(ptr str ptr ptr ptr ptr) d3dx10_43.D3DX10CreateShaderResourceViewFromFileA +@ stdcall D3DX10CreateShaderResourceViewFromFileW(ptr wstr ptr ptr ptr ptr) d3dx10_43.D3DX10CreateShaderResourceViewFromFileW +@ stdcall D3DX10CreateShaderResourceViewFromMemory(ptr ptr long ptr ptr ptr ptr) d3dx10_43.D3DX10CreateShaderResourceViewFromMemory +@ stdcall D3DX10CreateShaderResourceViewFromResourceA(ptr long str ptr ptr ptr ptr) d3dx10_43.D3DX10CreateShaderResourceViewFromResourceA +@ stdcall D3DX10CreateShaderResourceViewFromResourceW(ptr long wstr ptr ptr ptr ptr) d3dx10_43.D3DX10CreateShaderResourceViewFromResourceW +@ stdcall D3DX10CreateSkinInfo(ptr) d3dx10_43.D3DX10CreateSkinInfo +@ stdcall D3DX10CreateSprite(ptr long ptr) d3dx10_43.D3DX10CreateSprite +@ stdcall D3DX10CreateTextureFromFileA(ptr str ptr ptr ptr ptr) d3dx10_43.D3DX10CreateTextureFromFileA +@ stdcall D3DX10CreateTextureFromFileW(ptr wstr ptr ptr ptr ptr) d3dx10_43.D3DX10CreateTextureFromFileW +@ stdcall D3DX10CreateTextureFromMemory(ptr ptr long ptr ptr ptr ptr) d3dx10_43.D3DX10CreateTextureFromMemory +@ stdcall D3DX10CreateTextureFromResourceA(ptr long str ptr ptr ptr ptr) d3dx10_43.D3DX10CreateTextureFromResourceA +@ stdcall D3DX10CreateTextureFromResourceW(ptr long wstr ptr ptr ptr ptr) d3dx10_43.D3DX10CreateTextureFromResourceW +@ stdcall D3DX10DisassembleEffect(ptr long ptr) d3dx10_39.D3DX10DisassembleEffect +@ stdcall D3DX10DisassembleShader(ptr long long str ptr) d3dx10_39.D3DX10DisassembleShader +@ stdcall D3DX10FilterTexture(ptr long long) d3dx10_43.D3DX10FilterTexture +@ stdcall D3DX10GetDriverLevel(ptr) d3dx10_37.D3DX10GetDriverLevel +@ stdcall D3DX10GetFeatureLevel1(ptr ptr) d3dx10_43.D3DX10GetFeatureLevel1 +@ stdcall D3DX10GetImageInfoFromFileA(str ptr ptr ptr) d3dx10_43.D3DX10GetImageInfoFromFileA +@ stdcall D3DX10GetImageInfoFromFileW(wstr ptr ptr ptr) d3dx10_43.D3DX10GetImageInfoFromFileW +@ stdcall D3DX10GetImageInfoFromMemory(ptr long ptr ptr ptr) d3dx10_43.D3DX10GetImageInfoFromMemory +@ stdcall D3DX10GetImageInfoFromResourceA(long str ptr ptr ptr) d3dx10_43.D3DX10GetImageInfoFromResourceA +@ stdcall D3DX10GetImageInfoFromResourceW(long wstr ptr ptr ptr) d3dx10_43.D3DX10GetImageInfoFromResourceW +@ stdcall D3DX10LoadTextureFromTexture(ptr ptr ptr) d3dx10_43.D3DX10LoadTextureFromTexture +@ stdcall D3DX10PreprocessShaderFromFileA(str ptr ptr ptr ptr ptr) d3dx10_43.D3DX10PreprocessShaderFromFileA +@ stdcall D3DX10PreprocessShaderFromFileW(wstr ptr ptr ptr ptr ptr) d3dx10_43.D3DX10PreprocessShaderFromFileW +@ stdcall D3DX10PreprocessShaderFromMemory(str long str ptr ptr ptr ptr ptr) d3dx10_43.D3DX10PreprocessShaderFromMemory +@ stdcall D3DX10PreprocessShaderFromResourceA(long str str ptr ptr ptr ptr ptr) d3dx10_43.D3DX10PreprocessShaderFromResourceA +@ stdcall D3DX10PreprocessShaderFromResourceW(long wstr wstr ptr ptr ptr ptr ptr) d3dx10_43.D3DX10PreprocessShaderFromResourceW +@ stdcall D3DX10ReflectShader(ptr long ptr) d3dx10_39.D3DX10ReflectShader +@ stdcall D3DX10SHProjectCubeMap(long ptr ptr ptr ptr) d3dx10_43.D3DX10SHProjectCubeMap +@ stdcall D3DX10SaveTextureToFileA(ptr ptr str) d3dx10_43.D3DX10SaveTextureToFileA +@ stdcall D3DX10SaveTextureToFileW(ptr ptr wstr) d3dx10_43.D3DX10SaveTextureToFileW +@ stdcall D3DX10SaveTextureToMemory(ptr ptr ptr long) d3dx10_43.D3DX10SaveTextureToMemory +@ stdcall D3DX10UnsetAllDeviceObjects(ptr) d3dx10_43.D3DX10UnsetAllDeviceObjects +@ stdcall D3DXBoxBoundProbe(ptr ptr ptr ptr) d3dx10_43.D3DXBoxBoundProbe +@ stdcall D3DXColorAdjustContrast(ptr ptr long) d3dx10_43.3DXColorAdjustContrast +@ stdcall D3DXColorAdjustSaturation(ptr ptr long) d3dx10_43.D3DXColorAdjustSaturation +@ stdcall D3DXComputeBoundingBox(ptr long long ptr ptr) d3dx10_43.D3DXComputeBoundingBox +@ stdcall D3DXComputeBoundingSphere(ptr long long ptr ptr) d3dx10_43.D3DXComputeBoundingSphere +@ stdcall D3DXCpuOptimizations(long) d3dx10_43.D3DXCpuOptimizations +@ stdcall D3DXCreateMatrixStack(long ptr) d3dx10_43.D3DXCreateMatrixStack +@ stdcall D3DXFloat16To32Array(ptr ptr long) d3dx10_43.D3DXFloat16To32Array +@ stdcall D3DXFloat32To16Array(ptr ptr long) d3dx10_43.D3DXFloat32To16Array +@ stdcall D3DXFresnelTerm(long long) d3dx10_43.D3DXFresnelTerm +@ stdcall D3DXIntersectTri(ptr ptr ptr ptr ptr ptr ptr ptr) d3dx10_43.D3DXIntersectTri +@ stdcall D3DXMatrixAffineTransformation2D(ptr long ptr long ptr) d3dx10_43.D3DXMatrixAffineTransformation2D +@ stdcall D3DXMatrixAffineTransformation(ptr long ptr ptr ptr) d3dx10_43.D3DXMatrixAffineTransformation +@ stdcall D3DXMatrixDecompose(ptr ptr ptr ptr) d3dx10_43.D3DXMatrixDecompose +@ stdcall D3DXMatrixDeterminant(ptr) d3dx10_43.D3DXMatrixDeterminant +@ stdcall D3DXMatrixInverse(ptr ptr ptr) d3dx10_43.D3DXMatrixInverse +@ stdcall D3DXMatrixLookAtLH(ptr ptr ptr ptr) d3dx10_43.D3DXMatrixLookAtLH +@ stdcall D3DXMatrixLookAtRH(ptr ptr ptr ptr) d3dx10_43.D3DXMatrixLookAtRH +@ stdcall D3DXMatrixMultiply(ptr ptr ptr) d3dx10_43.D3DXMatrixMultiply +@ stdcall D3DXMatrixMultiplyTranspose(ptr ptr ptr) d3dx10_43.D3DXMatrixMultiplyTranspose +@ stdcall D3DXMatrixOrthoLH(ptr long long long long) d3dx10_43.D3DXMatrixOrthoLH +@ stdcall D3DXMatrixOrthoOffCenterLH(ptr long long long long long long) d3dx10_43.D3DXMatrixOrthoOffCenterLH +@ stdcall D3DXMatrixOrthoOffCenterRH(ptr long long long long long long) d3dx10_43.D3DXMatrixOrthoOffCenterRH +@ stdcall D3DXMatrixOrthoRH(ptr long long long long) d3dx10_43.D3DXMatrixOrthoRH +@ stdcall D3DXMatrixPerspectiveFovLH(ptr long long long long) d3dx10_43.D3DXMatrixPerspectiveFovLH +@ stdcall D3DXMatrixPerspectiveFovRH(ptr long long long long) d3dx10_43.D3DXMatrixPerspectiveFovRH +@ stdcall D3DXMatrixPerspectiveLH(ptr long long long long) d3dx10_43.D3DXMatrixPerspectiveLH +@ stdcall D3DXMatrixPerspectiveOffCenterLH(ptr long long long long long long) d3dx10_43.D3DXMatrixPerspectiveOffCenterLH +@ stdcall D3DXMatrixPerspectiveOffCenterRH(ptr long long long long long long) d3dx10_43.D3DXMatrixPerspectiveOffCenterRH +@ stdcall D3DXMatrixPerspectiveRH(ptr long long long long) d3dx10_43.D3DXMatrixPerspectiveRH +@ stdcall D3DXMatrixReflect(ptr ptr) d3dx10_43.D3DXMatrixReflect +@ stdcall D3DXMatrixRotationAxis(ptr ptr long) d3dx10_43.D3DXMatrixRotationAxis +@ stdcall D3DXMatrixRotationQuaternion(ptr ptr) d3dx10_43.D3DXMatrixRotationQuaternion +@ stdcall D3DXMatrixRotationX(ptr long) d3dx10_43.D3DXMatrixRotationX +@ stdcall D3DXMatrixRotationY(ptr long) d3dx10_43.D3DXMatrixRotationY +@ stdcall D3DXMatrixRotationYawPitchRoll(ptr long long long) d3dx10_43.D3DXMatrixRotationYawPitchRoll +@ stdcall D3DXMatrixRotationZ(ptr long) d3dx10_43.D3DXMatrixRotationZ +@ stdcall D3DXMatrixScaling(ptr long long long) d3dx10_43.D3DXMatrixScaling +@ stdcall D3DXMatrixShadow(ptr ptr ptr) d3dx10_43.D3DXMatrixShadow +@ stdcall D3DXMatrixTransformation2D(ptr ptr long ptr ptr long ptr) d3dx10_43.D3DXMatrixTransformation2D +@ stdcall D3DXMatrixTransformation(ptr ptr ptr ptr ptr ptr ptr) d3dx10_43.D3DXMatrixTransformation +@ stdcall D3DXMatrixTranslation(ptr long long long) d3dx10_43.D3DXMatrixTranslation +@ stdcall D3DXMatrixTranspose(ptr ptr) d3dx10_43.D3DXMatrixTranspose +@ stdcall D3DXPlaneFromPointNormal(ptr ptr ptr) d3dx10_43.D3DXPlaneFromPointNormal +@ stdcall D3DXPlaneFromPoints(ptr ptr ptr ptr) d3dx10_43.D3DXPlaneFromPoints +@ stdcall D3DXPlaneIntersectLine(ptr ptr ptr ptr) d3dx10_43.D3DXPlaneIntersectLine +@ stdcall D3DXPlaneNormalize(ptr ptr) d3dx10_43.D3DXPlaneNormalize +@ stdcall D3DXPlaneTransform(ptr ptr ptr) d3dx10_43.D3DXPlaneTransform +@ stdcall D3DXPlaneTransformArray(ptr long ptr long ptr long) d3dx10_43.D3DXPlaneTransformArray +@ stdcall D3DXQuaternionBaryCentric(ptr ptr ptr ptr long long) d3dx10_43.D3DXQuaternionBaryCentric +@ stdcall D3DXQuaternionExp(ptr ptr) d3dx10_43.D3DXQuaternionExp +@ stdcall D3DXQuaternionInverse(ptr ptr) d3dx10_43.D3DXQuaternionInverse +@ stdcall D3DXQuaternionLn(ptr ptr) d3dx10_43.D3DXQuaternionLn +@ stdcall D3DXQuaternionMultiply(ptr ptr ptr) d3dx10_43.D3DXQuaternionMultiply +@ stdcall D3DXQuaternionNormalize(ptr ptr) d3dx10_43.D3DXQuaternionNormalize +@ stdcall D3DXQuaternionRotationAxis(ptr ptr long) d3dx10_43.D3DXQuaternionRotationAxis +@ stdcall D3DXQuaternionRotationMatrix(ptr ptr) d3dx10_43.D3DXQuaternionRotationMatrix +@ stdcall D3DXQuaternionRotationYawPitchRoll(ptr long long long) d3dx10_43.D3DXQuaternionRotationYawPitchRoll +@ stdcall D3DXQuaternionSlerp(ptr ptr ptr long) d3dx10_43.D3DXQuaternionSlerp +@ stdcall D3DXQuaternionSquad(ptr ptr ptr ptr ptr long) d3dx10_43.D3DXQuaternionSquad +@ stdcall D3DXQuaternionSquadSetup(ptr ptr ptr ptr ptr ptr ptr) d3dx10_43.D3DXQuaternionSquadSetup +@ stdcall D3DXQuaternionToAxisAngle(ptr ptr ptr) d3dx10_43.D3DXQuaternionToAxisAngle +@ stdcall D3DXSHAdd(ptr long ptr ptr) d3dx10_43.D3DXSHAdd +@ stdcall D3DXSHDot(long ptr ptr) d3dx10_43.D3DXSHDot +@ stdcall D3DXSHEvalConeLight(long ptr long long long long ptr ptr ptr) d3dx10_43.D3DXSHEvalConeLight +@ stdcall D3DXSHEvalDirection(ptr long ptr) d3dx10_43.D3DXSHEvalDirection +@ stdcall D3DXSHEvalDirectionalLight(long ptr long long long long ptr ptr ptr) d3dx10_43.D3DXSHEvalDirectionalLight +@ stdcall D3DXSHEvalHemisphereLight(long ptr long long ptr ptr ptr) d3dx10_43.D3DXSHEvalHemisphereLight +@ stdcall D3DXSHEvalSphericalLight(long ptr long long long long ptr ptr ptr) d3dx10_43.D3DXSHEvalSphericalLight +@ stdcall D3DXSHMultiply2(ptr ptr ptr) d3dx10_43.D3DXSHMultiply2 +@ stdcall D3DXSHMultiply3(ptr ptr ptr) d3dx10_43.D3DXSHMultiply3 +@ stdcall D3DXSHMultiply4(ptr ptr ptr) d3dx10_43.D3DXSHMultiply4 +@ stdcall D3DXSHMultiply5(ptr ptr ptr) d3dx10_43.D3DXSHMultiply5 +@ stdcall D3DXSHMultiply6(ptr ptr ptr) d3dx10_43.D3DXSHMultiply6 +@ stdcall D3DXSHRotate(ptr long ptr ptr) d3dx10_43.D3DXSHRotate +@ stdcall D3DXSHRotateZ(ptr long long ptr) d3dx10_43.D3DXSHRotateZ +@ stdcall D3DXSHScale(ptr long ptr ptr) d3dx10_43.D3DXSHScale +@ stdcall D3DXSphereBoundProbe(ptr long ptr ptr) d3dx10_43.D3DXSphereBoundProbe +@ stdcall D3DXVec2BaryCentric(ptr ptr ptr ptr long long) d3dx10_43.D3DXVec2BaryCentric +@ stdcall D3DXVec2CatmullRom(ptr ptr ptr ptr ptr long) d3dx10_43.D3DXVec2CatmullRom +@ stdcall D3DXVec2Hermite(ptr ptr ptr ptr ptr long) d3dx10_43.D3DXVec2Hermite +@ stdcall D3DXVec2Normalize(ptr ptr) d3dx10_43.D3DXVec2Normalize +@ stdcall D3DXVec2Transform(ptr ptr ptr) d3dx10_43.D3DXVec2Transform +@ stdcall D3DXVec2TransformArray(ptr long ptr long ptr long) d3dx10_43.D3DXVec2TransformArray +@ stdcall D3DXVec2TransformCoord(ptr ptr ptr) d3dx10_43.D3DXVec2TransformCoord +@ stdcall D3DXVec2TransformCoordArray(ptr long ptr long ptr long) d3dx10_43.D3DXVec2TransformCoordArray +@ stdcall D3DXVec2TransformNormal(ptr ptr ptr) d3dx10_43.D3DXVec2TransformNormal +@ stdcall D3DXVec2TransformNormalArray(ptr long ptr long ptr long) d3dx10_43.D3DXVec2TransformNormalArray +@ stdcall D3DXVec3BaryCentric(ptr ptr ptr ptr long long) d3dx10_43.D3DXVec3BaryCentric +@ stdcall D3DXVec3CatmullRom(ptr ptr ptr ptr ptr long) d3dx10_43.D3DXVec3CatmullRom +@ stdcall D3DXVec3Hermite(ptr ptr ptr ptr ptr long) d3dx10_43.D3DXVec3Hermite +@ stdcall D3DXVec3Normalize(ptr ptr) d3dx10_43.D3DXVec3Normalize +@ stdcall D3DXVec3Project(ptr ptr ptr ptr ptr ptr) d3dx10_43.D3DXVec3Project +@ stdcall D3DXVec3ProjectArray(ptr long ptr long ptr ptr ptr ptr long) d3dx10_43.D3DXVec3ProjectArray +@ stdcall D3DXVec3Transform(ptr ptr ptr) d3dx10_43.D3DXVec3Transform +@ stdcall D3DXVec3TransformArray(ptr long ptr long ptr long) d3dx10_43.D3DXVec3TransformArray +@ stdcall D3DXVec3TransformCoord(ptr ptr ptr) d3dx10_43.D3DXVec3TransformCoord +@ stdcall D3DXVec3TransformCoordArray(ptr long ptr long ptr long) d3dx10_43.D3DXVec3TransformCoordArray +@ stdcall D3DXVec3TransformNormal(ptr ptr ptr) d3dx10_43.D3DXVec3TransformNormal +@ stdcall D3DXVec3TransformNormalArray(ptr long ptr long ptr long) d3dx10_43.D3DXVec3TransformNormalArray +@ stdcall D3DXVec3Unproject(ptr ptr ptr ptr ptr ptr) d3dx10_43.D3DXVec3Unproject +@ stdcall D3DXVec3UnprojectArray(ptr long ptr long ptr ptr ptr ptr long) d3dx10_43.D3DXVec3UnprojectArray +@ stdcall D3DXVec4BaryCentric(ptr ptr ptr ptr long long) d3dx10_43.D3DXVec4BaryCentric +@ stdcall D3DXVec4CatmullRom(ptr ptr ptr ptr ptr long) d3dx10_43.D3DXVec4CatmullRom +@ stdcall D3DXVec4Cross(ptr ptr ptr ptr) d3dx10_43.D3DXVec4Cross +@ stdcall D3DXVec4Hermite(ptr ptr ptr ptr ptr long) d3dx10_43.D3DXVec4Hermite +@ stdcall D3DXVec4Normalize(ptr ptr) d3dx10_43.D3DXVec4Normalize +@ stdcall D3DXVec4Transform(ptr ptr ptr) d3dx10_43.D3DXVec4Transform +@ stdcall D3DXVec4TransformArray(ptr long ptr long ptr long) d3dx10_43.D3DXVec4TransformArray diff -Nru wine1.3-1.3.0/dlls/d3dx10_35/Makefile.in wine1.3-1.3.1/dlls/d3dx10_35/Makefile.in --- wine1.3-1.3.0/dlls/d3dx10_35/Makefile.in 1970-01-01 01:00:00.000000000 +0100 +++ wine1.3-1.3.1/dlls/d3dx10_35/Makefile.in 2010-08-20 18:23:50.000000000 +0100 @@ -0,0 +1,12 @@ +TOPSRCDIR = @top_srcdir@ +TOPOBJDIR = ../.. +SRCDIR = @srcdir@ +VPATH = @srcdir@ +MODULE = d3dx10_35.dll + +C_SRCS = \ + d3dx10_35_main.c + +RC_SRCS = version.rc + +@MAKE_DLL_RULES@ diff -Nru wine1.3-1.3.0/dlls/d3dx10_35/version.rc wine1.3-1.3.1/dlls/d3dx10_35/version.rc --- wine1.3-1.3.0/dlls/d3dx10_35/version.rc 1970-01-01 01:00:00.000000000 +0100 +++ wine1.3-1.3.1/dlls/d3dx10_35/version.rc 2010-08-20 18:23:50.000000000 +0100 @@ -0,0 +1,26 @@ +/* + * Copyright 2010 Owen Rudge for 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 + */ + +#define WINE_FILEDESCRIPTION_STR "Wine D3DX10" +#define WINE_FILENAME_STR "d3dx10_35.dll" +#define WINE_FILEVERSION 9,19,949,1104 +#define WINE_FILEVERSION_STR "9.19.949.1104" +#define WINE_PRODUCTVERSION 9,19,949,1104 +#define WINE_PRODUCTVERSION_STR "9.19.949.1104" + +#include "wine/wine_common_ver.rc" diff -Nru wine1.3-1.3.0/dlls/d3dx10_36/d3dx10_36_main.c wine1.3-1.3.1/dlls/d3dx10_36/d3dx10_36_main.c --- wine1.3-1.3.0/dlls/d3dx10_36/d3dx10_36_main.c 1970-01-01 01:00:00.000000000 +0100 +++ wine1.3-1.3.1/dlls/d3dx10_36/d3dx10_36_main.c 2010-08-20 18:23:50.000000000 +0100 @@ -0,0 +1,63 @@ +/* + * D3DX10 main file + * + * Copyright (c) 2010 Owen Rudge for 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 "wine/port.h" + +#include + +#define COBJMACROS + +#include "windef.h" +#include "winbase.h" +#include "winuser.h" +#include "objbase.h" + +#include "d3d10.h" + +BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved) +{ + switch (fdwReason) + { + case DLL_WINE_PREATTACH: + return FALSE; /* prefer native version */ + case DLL_PROCESS_ATTACH: + DisableThreadLibraryCalls(hinstDLL); + break; + case DLL_PROCESS_DETACH: + break; + } + + return TRUE; +} + +/*********************************************************************** + * D3DX10CheckVersion + * + * Checks whether we are compiling against the correct d3d and d3dx library. + */ +BOOL WINAPI D3DX10CheckVersion(UINT d3dsdkvers, UINT d3dxsdkvers) +{ + if ((d3dsdkvers == D3D10_SDK_VERSION) && (d3dxsdkvers == 36)) + return TRUE; + + return FALSE; +} diff -Nru wine1.3-1.3.0/dlls/d3dx10_36/d3dx10_36.spec wine1.3-1.3.1/dlls/d3dx10_36/d3dx10_36.spec --- wine1.3-1.3.0/dlls/d3dx10_36/d3dx10_36.spec 1970-01-01 01:00:00.000000000 +0100 +++ wine1.3-1.3.1/dlls/d3dx10_36/d3dx10_36.spec 2010-08-20 18:23:50.000000000 +0100 @@ -0,0 +1,180 @@ +@ stdcall D3DX10CreateThreadPump(long long ptr) d3dx10_43.D3DX10CreateThreadPump +@ stdcall D3DX10CheckVersion(long long) +@ stdcall D3DX10CompileFromFileA(str ptr ptr str str long long ptr ptr ptr ptr) d3dx10_43.D3DX10CompileFromFileA +@ stdcall D3DX10CompileFromFileW(wstr ptr ptr str str long long ptr ptr ptr ptr) d3dx10_43.D3DX10CompileFromFileW +@ stdcall D3DX10CompileFromMemory(str long str ptr ptr str str long long ptr ptr ptr ptr) d3dx10_43.D3DX10CompileFromMemory +@ stdcall D3DX10CompileFromResourceA(long str str ptr ptr str str long long ptr ptr ptr ptr) d3dx10_43.D3DX10CompileFromResourceA +@ stdcall D3DX10CompileFromResourceW(long wstr wstr ptr ptr str str long long ptr ptr ptr ptr) d3dx10_43.D3DX10CompileFromResourceW +@ stdcall D3DX10ComputeNormalMap(ptr long long long ptr) d3dx10_43.D3DX10ComputeNormalMap +@ stdcall D3DX10CreateAsyncCompilerProcessor(str ptr ptr str str long long ptr ptr ptr) d3dx10_43.D3DX10CreateAsyncCompilerProcessor +@ stdcall D3DX10CreateAsyncEffectCreateProcessor(str ptr ptr str long long ptr ptr ptr ptr) d3dx10_43.D3DX10CreateAsyncEffectCreateProcessor +@ stdcall D3DX10CreateAsyncEffectPoolCreateProcessor(str ptr ptr str long long ptr ptr ptr) d3dx10_43.D3DX10CreateAsyncEffectPoolCreateProcessor +@ stdcall D3DX10CreateAsyncFileLoaderA(str ptr) d3dx10_43.D3DX10CreateAsyncFileLoaderA +@ stdcall D3DX10CreateAsyncFileLoaderW(wstr ptr) d3dx10_43.D3DX10CreateAsyncFileLoaderW +@ stdcall D3DX10CreateAsyncMemoryLoader(ptr long ptr) d3dx10_43.D3DX10CreateAsyncMemoryLoader +@ stdcall D3DX10CreateAsyncResourceLoaderA(long str ptr) d3dx10_43.D3DX10CreateAsyncResourceLoaderA +@ stdcall D3DX10CreateAsyncResourceLoaderW(long wstr ptr) d3dx10_43.D3DX10CreateAsyncResourceLoaderW +@ stdcall D3DX10CreateAsyncShaderPreprocessProcessor(str ptr ptr ptr ptr ptr) d3dx10_43.D3DX10CreateAsyncShaderPreprocessProcessor +@ stdcall D3DX10CreateAsyncShaderResourceViewProcessor(ptr ptr ptr) d3dx10_43.D3DX10CreateAsyncShaderResourceViewProcessor +@ stdcall D3DX10CreateAsyncTextureInfoProcessor(ptr ptr) d3dx10_43.D3DX10CreateAsyncTextureInfoProcessor +@ stdcall D3DX10CreateAsyncTextureProcessor(ptr ptr ptr) d3dx10_43.D3DX10CreateAsyncTextureProcessor +@ stdcall D3DX10CreateDevice(ptr long long long ptr) d3dx10_43.D3DX10CreateDevice +@ stdcall D3DX10CreateDeviceAndSwapChain(ptr long long long ptr ptr ptr) d3dx10_43.D3DX10CreateDeviceAndSwapChain +@ stdcall D3DX10CreateEffectFromFileA(str ptr ptr str long long ptr ptr ptr ptr ptr ptr) d3dx10_43.D3DX10CreateEffectFromFileA +@ stdcall D3DX10CreateEffectFromFileW(wstr ptr ptr str long long ptr ptr ptr ptr ptr ptr) d3dx10_43.D3DX10CreateEffectFromFileW +@ stdcall D3DX10CreateEffectFromMemory(ptr long str ptr ptr str long long ptr ptr ptr ptr ptr ptr) d3dx10_43.D3DX10CreateEffectFromMemory +@ stdcall D3DX10CreateEffectFromResourceA(long str str ptr ptr str long long ptr ptr ptr ptr ptr ptr) d3dx10_43.D3DX10CreateEffectFromResourceA +@ stdcall D3DX10CreateEffectFromResourceW(long wstr wstr ptr ptr str long long ptr ptr ptr ptr ptr ptr) d3dx10_43.D3DX10CreateEffectFromResourceW +@ stdcall D3DX10CreateEffectPoolFromFileA(str ptr ptr str long long ptr ptr ptr ptr ptr) d3dx10_43.D3DX10CreateEffectPoolFromFileA +@ stdcall D3DX10CreateEffectPoolFromFileW(wstr ptr ptr str long long ptr ptr ptr ptr ptr) d3dx10_43.D3DX10CreateEffectPoolFromFileW +@ stdcall D3DX10CreateEffectPoolFromMemory(ptr long str ptr ptr str long long ptr ptr ptr ptr ptr) d3dx10_43.D3DX10CreateEffectPoolFromMemory +@ stdcall D3DX10CreateEffectPoolFromResourceA(long str str ptr ptr str long long ptr ptr ptr ptr ptr) d3dx10_43.D3DX10CreateEffectPoolFromResourceA +@ stdcall D3DX10CreateEffectPoolFromResourceW(long wstr wstr ptr ptr str long long ptr ptr ptr ptr ptr) d3dx10_43.D3DX10CreateEffectPoolFromResourceW +@ stdcall D3DX10CreateFontA(ptr long long long long long long long long long str ptr) d3dx10_43.D3DX10CreateFontA +@ stdcall D3DX10CreateFontIndirectA(ptr ptr ptr) d3dx10_43.D3DX10CreateFontIndirectA +@ stdcall D3DX10CreateFontIndirectW(ptr ptr ptr) d3dx10_43.D3DX10CreateFontIndirectW +@ stdcall D3DX10CreateFontW(ptr long long long long long long long long long wstr ptr) d3dx10_43.D3DX10CreateFontW +@ stdcall D3DX10CreateMesh(ptr ptr long str long long long ptr) d3dx10_43.D3DX10CreateMesh +@ stdcall D3DX10CreateShaderResourceViewFromFileA(ptr str ptr ptr ptr ptr) d3dx10_43.D3DX10CreateShaderResourceViewFromFileA +@ stdcall D3DX10CreateShaderResourceViewFromFileW(ptr wstr ptr ptr ptr ptr) d3dx10_43.D3DX10CreateShaderResourceViewFromFileW +@ stdcall D3DX10CreateShaderResourceViewFromMemory(ptr ptr long ptr ptr ptr ptr) d3dx10_43.D3DX10CreateShaderResourceViewFromMemory +@ stdcall D3DX10CreateShaderResourceViewFromResourceA(ptr long str ptr ptr ptr ptr) d3dx10_43.D3DX10CreateShaderResourceViewFromResourceA +@ stdcall D3DX10CreateShaderResourceViewFromResourceW(ptr long wstr ptr ptr ptr ptr) d3dx10_43.D3DX10CreateShaderResourceViewFromResourceW +@ stdcall D3DX10CreateSkinInfo(ptr) d3dx10_43.D3DX10CreateSkinInfo +@ stdcall D3DX10CreateSprite(ptr long ptr) d3dx10_43.D3DX10CreateSprite +@ stdcall D3DX10CreateTextureFromFileA(ptr str ptr ptr ptr ptr) d3dx10_43.D3DX10CreateTextureFromFileA +@ stdcall D3DX10CreateTextureFromFileW(ptr wstr ptr ptr ptr ptr) d3dx10_43.D3DX10CreateTextureFromFileW +@ stdcall D3DX10CreateTextureFromMemory(ptr ptr long ptr ptr ptr ptr) d3dx10_43.D3DX10CreateTextureFromMemory +@ stdcall D3DX10CreateTextureFromResourceA(ptr long str ptr ptr ptr ptr) d3dx10_43.D3DX10CreateTextureFromResourceA +@ stdcall D3DX10CreateTextureFromResourceW(ptr long wstr ptr ptr ptr ptr) d3dx10_43.D3DX10CreateTextureFromResourceW +@ stdcall D3DX10DisassembleEffect(ptr long ptr) d3dx10_39.D3DX10DisassembleEffect +@ stdcall D3DX10DisassembleShader(ptr long long str ptr) d3dx10_39.D3DX10DisassembleShader +@ stdcall D3DX10FilterTexture(ptr long long) d3dx10_43.D3DX10FilterTexture +@ stdcall D3DX10GetDriverLevel(ptr) d3dx10_37.D3DX10GetDriverLevel +@ stdcall D3DX10GetFeatureLevel1(ptr ptr) d3dx10_43.D3DX10GetFeatureLevel1 +@ stdcall D3DX10GetImageInfoFromFileA(str ptr ptr ptr) d3dx10_43.D3DX10GetImageInfoFromFileA +@ stdcall D3DX10GetImageInfoFromFileW(wstr ptr ptr ptr) d3dx10_43.D3DX10GetImageInfoFromFileW +@ stdcall D3DX10GetImageInfoFromMemory(ptr long ptr ptr ptr) d3dx10_43.D3DX10GetImageInfoFromMemory +@ stdcall D3DX10GetImageInfoFromResourceA(long str ptr ptr ptr) d3dx10_43.D3DX10GetImageInfoFromResourceA +@ stdcall D3DX10GetImageInfoFromResourceW(long wstr ptr ptr ptr) d3dx10_43.D3DX10GetImageInfoFromResourceW +@ stdcall D3DX10LoadTextureFromTexture(ptr ptr ptr) d3dx10_43.D3DX10LoadTextureFromTexture +@ stdcall D3DX10PreprocessShaderFromFileA(str ptr ptr ptr ptr ptr) d3dx10_43.D3DX10PreprocessShaderFromFileA +@ stdcall D3DX10PreprocessShaderFromFileW(wstr ptr ptr ptr ptr ptr) d3dx10_43.D3DX10PreprocessShaderFromFileW +@ stdcall D3DX10PreprocessShaderFromMemory(str long str ptr ptr ptr ptr ptr) d3dx10_43.D3DX10PreprocessShaderFromMemory +@ stdcall D3DX10PreprocessShaderFromResourceA(long str str ptr ptr ptr ptr ptr) d3dx10_43.D3DX10PreprocessShaderFromResourceA +@ stdcall D3DX10PreprocessShaderFromResourceW(long wstr wstr ptr ptr ptr ptr ptr) d3dx10_43.D3DX10PreprocessShaderFromResourceW +@ stdcall D3DX10ReflectShader(ptr long ptr) d3dx10_39.D3DX10ReflectShader +@ stdcall D3DX10SHProjectCubeMap(long ptr ptr ptr ptr) d3dx10_43.D3DX10SHProjectCubeMap +@ stdcall D3DX10SaveTextureToFileA(ptr ptr str) d3dx10_43.D3DX10SaveTextureToFileA +@ stdcall D3DX10SaveTextureToFileW(ptr ptr wstr) d3dx10_43.D3DX10SaveTextureToFileW +@ stdcall D3DX10SaveTextureToMemory(ptr ptr ptr long) d3dx10_43.D3DX10SaveTextureToMemory +@ stdcall D3DX10UnsetAllDeviceObjects(ptr) d3dx10_43.D3DX10UnsetAllDeviceObjects +@ stdcall D3DXBoxBoundProbe(ptr ptr ptr ptr) d3dx10_43.D3DXBoxBoundProbe +@ stdcall D3DXColorAdjustContrast(ptr ptr long) d3dx10_43.3DXColorAdjustContrast +@ stdcall D3DXColorAdjustSaturation(ptr ptr long) d3dx10_43.D3DXColorAdjustSaturation +@ stdcall D3DXComputeBoundingBox(ptr long long ptr ptr) d3dx10_43.D3DXComputeBoundingBox +@ stdcall D3DXComputeBoundingSphere(ptr long long ptr ptr) d3dx10_43.D3DXComputeBoundingSphere +@ stdcall D3DXCpuOptimizations(long) d3dx10_43.D3DXCpuOptimizations +@ stdcall D3DXCreateMatrixStack(long ptr) d3dx10_43.D3DXCreateMatrixStack +@ stdcall D3DXFloat16To32Array(ptr ptr long) d3dx10_43.D3DXFloat16To32Array +@ stdcall D3DXFloat32To16Array(ptr ptr long) d3dx10_43.D3DXFloat32To16Array +@ stdcall D3DXFresnelTerm(long long) d3dx10_43.D3DXFresnelTerm +@ stdcall D3DXIntersectTri(ptr ptr ptr ptr ptr ptr ptr ptr) d3dx10_43.D3DXIntersectTri +@ stdcall D3DXMatrixAffineTransformation2D(ptr long ptr long ptr) d3dx10_43.D3DXMatrixAffineTransformation2D +@ stdcall D3DXMatrixAffineTransformation(ptr long ptr ptr ptr) d3dx10_43.D3DXMatrixAffineTransformation +@ stdcall D3DXMatrixDecompose(ptr ptr ptr ptr) d3dx10_43.D3DXMatrixDecompose +@ stdcall D3DXMatrixDeterminant(ptr) d3dx10_43.D3DXMatrixDeterminant +@ stdcall D3DXMatrixInverse(ptr ptr ptr) d3dx10_43.D3DXMatrixInverse +@ stdcall D3DXMatrixLookAtLH(ptr ptr ptr ptr) d3dx10_43.D3DXMatrixLookAtLH +@ stdcall D3DXMatrixLookAtRH(ptr ptr ptr ptr) d3dx10_43.D3DXMatrixLookAtRH +@ stdcall D3DXMatrixMultiply(ptr ptr ptr) d3dx10_43.D3DXMatrixMultiply +@ stdcall D3DXMatrixMultiplyTranspose(ptr ptr ptr) d3dx10_43.D3DXMatrixMultiplyTranspose +@ stdcall D3DXMatrixOrthoLH(ptr long long long long) d3dx10_43.D3DXMatrixOrthoLH +@ stdcall D3DXMatrixOrthoOffCenterLH(ptr long long long long long long) d3dx10_43.D3DXMatrixOrthoOffCenterLH +@ stdcall D3DXMatrixOrthoOffCenterRH(ptr long long long long long long) d3dx10_43.D3DXMatrixOrthoOffCenterRH +@ stdcall D3DXMatrixOrthoRH(ptr long long long long) d3dx10_43.D3DXMatrixOrthoRH +@ stdcall D3DXMatrixPerspectiveFovLH(ptr long long long long) d3dx10_43.D3DXMatrixPerspectiveFovLH +@ stdcall D3DXMatrixPerspectiveFovRH(ptr long long long long) d3dx10_43.D3DXMatrixPerspectiveFovRH +@ stdcall D3DXMatrixPerspectiveLH(ptr long long long long) d3dx10_43.D3DXMatrixPerspectiveLH +@ stdcall D3DXMatrixPerspectiveOffCenterLH(ptr long long long long long long) d3dx10_43.D3DXMatrixPerspectiveOffCenterLH +@ stdcall D3DXMatrixPerspectiveOffCenterRH(ptr long long long long long long) d3dx10_43.D3DXMatrixPerspectiveOffCenterRH +@ stdcall D3DXMatrixPerspectiveRH(ptr long long long long) d3dx10_43.D3DXMatrixPerspectiveRH +@ stdcall D3DXMatrixReflect(ptr ptr) d3dx10_43.D3DXMatrixReflect +@ stdcall D3DXMatrixRotationAxis(ptr ptr long) d3dx10_43.D3DXMatrixRotationAxis +@ stdcall D3DXMatrixRotationQuaternion(ptr ptr) d3dx10_43.D3DXMatrixRotationQuaternion +@ stdcall D3DXMatrixRotationX(ptr long) d3dx10_43.D3DXMatrixRotationX +@ stdcall D3DXMatrixRotationY(ptr long) d3dx10_43.D3DXMatrixRotationY +@ stdcall D3DXMatrixRotationYawPitchRoll(ptr long long long) d3dx10_43.D3DXMatrixRotationYawPitchRoll +@ stdcall D3DXMatrixRotationZ(ptr long) d3dx10_43.D3DXMatrixRotationZ +@ stdcall D3DXMatrixScaling(ptr long long long) d3dx10_43.D3DXMatrixScaling +@ stdcall D3DXMatrixShadow(ptr ptr ptr) d3dx10_43.D3DXMatrixShadow +@ stdcall D3DXMatrixTransformation2D(ptr ptr long ptr ptr long ptr) d3dx10_43.D3DXMatrixTransformation2D +@ stdcall D3DXMatrixTransformation(ptr ptr ptr ptr ptr ptr ptr) d3dx10_43.D3DXMatrixTransformation +@ stdcall D3DXMatrixTranslation(ptr long long long) d3dx10_43.D3DXMatrixTranslation +@ stdcall D3DXMatrixTranspose(ptr ptr) d3dx10_43.D3DXMatrixTranspose +@ stdcall D3DXPlaneFromPointNormal(ptr ptr ptr) d3dx10_43.D3DXPlaneFromPointNormal +@ stdcall D3DXPlaneFromPoints(ptr ptr ptr ptr) d3dx10_43.D3DXPlaneFromPoints +@ stdcall D3DXPlaneIntersectLine(ptr ptr ptr ptr) d3dx10_43.D3DXPlaneIntersectLine +@ stdcall D3DXPlaneNormalize(ptr ptr) d3dx10_43.D3DXPlaneNormalize +@ stdcall D3DXPlaneTransform(ptr ptr ptr) d3dx10_43.D3DXPlaneTransform +@ stdcall D3DXPlaneTransformArray(ptr long ptr long ptr long) d3dx10_43.D3DXPlaneTransformArray +@ stdcall D3DXQuaternionBaryCentric(ptr ptr ptr ptr long long) d3dx10_43.D3DXQuaternionBaryCentric +@ stdcall D3DXQuaternionExp(ptr ptr) d3dx10_43.D3DXQuaternionExp +@ stdcall D3DXQuaternionInverse(ptr ptr) d3dx10_43.D3DXQuaternionInverse +@ stdcall D3DXQuaternionLn(ptr ptr) d3dx10_43.D3DXQuaternionLn +@ stdcall D3DXQuaternionMultiply(ptr ptr ptr) d3dx10_43.D3DXQuaternionMultiply +@ stdcall D3DXQuaternionNormalize(ptr ptr) d3dx10_43.D3DXQuaternionNormalize +@ stdcall D3DXQuaternionRotationAxis(ptr ptr long) d3dx10_43.D3DXQuaternionRotationAxis +@ stdcall D3DXQuaternionRotationMatrix(ptr ptr) d3dx10_43.D3DXQuaternionRotationMatrix +@ stdcall D3DXQuaternionRotationYawPitchRoll(ptr long long long) d3dx10_43.D3DXQuaternionRotationYawPitchRoll +@ stdcall D3DXQuaternionSlerp(ptr ptr ptr long) d3dx10_43.D3DXQuaternionSlerp +@ stdcall D3DXQuaternionSquad(ptr ptr ptr ptr ptr long) d3dx10_43.D3DXQuaternionSquad +@ stdcall D3DXQuaternionSquadSetup(ptr ptr ptr ptr ptr ptr ptr) d3dx10_43.D3DXQuaternionSquadSetup +@ stdcall D3DXQuaternionToAxisAngle(ptr ptr ptr) d3dx10_43.D3DXQuaternionToAxisAngle +@ stdcall D3DXSHAdd(ptr long ptr ptr) d3dx10_43.D3DXSHAdd +@ stdcall D3DXSHDot(long ptr ptr) d3dx10_43.D3DXSHDot +@ stdcall D3DXSHEvalConeLight(long ptr long long long long ptr ptr ptr) d3dx10_43.D3DXSHEvalConeLight +@ stdcall D3DXSHEvalDirection(ptr long ptr) d3dx10_43.D3DXSHEvalDirection +@ stdcall D3DXSHEvalDirectionalLight(long ptr long long long long ptr ptr ptr) d3dx10_43.D3DXSHEvalDirectionalLight +@ stdcall D3DXSHEvalHemisphereLight(long ptr long long ptr ptr ptr) d3dx10_43.D3DXSHEvalHemisphereLight +@ stdcall D3DXSHEvalSphericalLight(long ptr long long long long ptr ptr ptr) d3dx10_43.D3DXSHEvalSphericalLight +@ stdcall D3DXSHMultiply2(ptr ptr ptr) d3dx10_43.D3DXSHMultiply2 +@ stdcall D3DXSHMultiply3(ptr ptr ptr) d3dx10_43.D3DXSHMultiply3 +@ stdcall D3DXSHMultiply4(ptr ptr ptr) d3dx10_43.D3DXSHMultiply4 +@ stdcall D3DXSHMultiply5(ptr ptr ptr) d3dx10_43.D3DXSHMultiply5 +@ stdcall D3DXSHMultiply6(ptr ptr ptr) d3dx10_43.D3DXSHMultiply6 +@ stdcall D3DXSHRotate(ptr long ptr ptr) d3dx10_43.D3DXSHRotate +@ stdcall D3DXSHRotateZ(ptr long long ptr) d3dx10_43.D3DXSHRotateZ +@ stdcall D3DXSHScale(ptr long ptr ptr) d3dx10_43.D3DXSHScale +@ stdcall D3DXSphereBoundProbe(ptr long ptr ptr) d3dx10_43.D3DXSphereBoundProbe +@ stdcall D3DXVec2BaryCentric(ptr ptr ptr ptr long long) d3dx10_43.D3DXVec2BaryCentric +@ stdcall D3DXVec2CatmullRom(ptr ptr ptr ptr ptr long) d3dx10_43.D3DXVec2CatmullRom +@ stdcall D3DXVec2Hermite(ptr ptr ptr ptr ptr long) d3dx10_43.D3DXVec2Hermite +@ stdcall D3DXVec2Normalize(ptr ptr) d3dx10_43.D3DXVec2Normalize +@ stdcall D3DXVec2Transform(ptr ptr ptr) d3dx10_43.D3DXVec2Transform +@ stdcall D3DXVec2TransformArray(ptr long ptr long ptr long) d3dx10_43.D3DXVec2TransformArray +@ stdcall D3DXVec2TransformCoord(ptr ptr ptr) d3dx10_43.D3DXVec2TransformCoord +@ stdcall D3DXVec2TransformCoordArray(ptr long ptr long ptr long) d3dx10_43.D3DXVec2TransformCoordArray +@ stdcall D3DXVec2TransformNormal(ptr ptr ptr) d3dx10_43.D3DXVec2TransformNormal +@ stdcall D3DXVec2TransformNormalArray(ptr long ptr long ptr long) d3dx10_43.D3DXVec2TransformNormalArray +@ stdcall D3DXVec3BaryCentric(ptr ptr ptr ptr long long) d3dx10_43.D3DXVec3BaryCentric +@ stdcall D3DXVec3CatmullRom(ptr ptr ptr ptr ptr long) d3dx10_43.D3DXVec3CatmullRom +@ stdcall D3DXVec3Hermite(ptr ptr ptr ptr ptr long) d3dx10_43.D3DXVec3Hermite +@ stdcall D3DXVec3Normalize(ptr ptr) d3dx10_43.D3DXVec3Normalize +@ stdcall D3DXVec3Project(ptr ptr ptr ptr ptr ptr) d3dx10_43.D3DXVec3Project +@ stdcall D3DXVec3ProjectArray(ptr long ptr long ptr ptr ptr ptr long) d3dx10_43.D3DXVec3ProjectArray +@ stdcall D3DXVec3Transform(ptr ptr ptr) d3dx10_43.D3DXVec3Transform +@ stdcall D3DXVec3TransformArray(ptr long ptr long ptr long) d3dx10_43.D3DXVec3TransformArray +@ stdcall D3DXVec3TransformCoord(ptr ptr ptr) d3dx10_43.D3DXVec3TransformCoord +@ stdcall D3DXVec3TransformCoordArray(ptr long ptr long ptr long) d3dx10_43.D3DXVec3TransformCoordArray +@ stdcall D3DXVec3TransformNormal(ptr ptr ptr) d3dx10_43.D3DXVec3TransformNormal +@ stdcall D3DXVec3TransformNormalArray(ptr long ptr long ptr long) d3dx10_43.D3DXVec3TransformNormalArray +@ stdcall D3DXVec3Unproject(ptr ptr ptr ptr ptr ptr) d3dx10_43.D3DXVec3Unproject +@ stdcall D3DXVec3UnprojectArray(ptr long ptr long ptr ptr ptr ptr long) d3dx10_43.D3DXVec3UnprojectArray +@ stdcall D3DXVec4BaryCentric(ptr ptr ptr ptr long long) d3dx10_43.D3DXVec4BaryCentric +@ stdcall D3DXVec4CatmullRom(ptr ptr ptr ptr ptr long) d3dx10_43.D3DXVec4CatmullRom +@ stdcall D3DXVec4Cross(ptr ptr ptr ptr) d3dx10_43.D3DXVec4Cross +@ stdcall D3DXVec4Hermite(ptr ptr ptr ptr ptr long) d3dx10_43.D3DXVec4Hermite +@ stdcall D3DXVec4Normalize(ptr ptr) d3dx10_43.D3DXVec4Normalize +@ stdcall D3DXVec4Transform(ptr ptr ptr) d3dx10_43.D3DXVec4Transform +@ stdcall D3DXVec4TransformArray(ptr long ptr long ptr long) d3dx10_43.D3DXVec4TransformArray diff -Nru wine1.3-1.3.0/dlls/d3dx10_36/Makefile.in wine1.3-1.3.1/dlls/d3dx10_36/Makefile.in --- wine1.3-1.3.0/dlls/d3dx10_36/Makefile.in 1970-01-01 01:00:00.000000000 +0100 +++ wine1.3-1.3.1/dlls/d3dx10_36/Makefile.in 2010-08-20 18:23:50.000000000 +0100 @@ -0,0 +1,12 @@ +TOPSRCDIR = @top_srcdir@ +TOPOBJDIR = ../.. +SRCDIR = @srcdir@ +VPATH = @srcdir@ +MODULE = d3dx10_36.dll + +C_SRCS = \ + d3dx10_36_main.c + +RC_SRCS = version.rc + +@MAKE_DLL_RULES@ diff -Nru wine1.3-1.3.0/dlls/d3dx10_36/version.rc wine1.3-1.3.1/dlls/d3dx10_36/version.rc --- wine1.3-1.3.0/dlls/d3dx10_36/version.rc 1970-01-01 01:00:00.000000000 +0100 +++ wine1.3-1.3.1/dlls/d3dx10_36/version.rc 2010-08-20 18:23:50.000000000 +0100 @@ -0,0 +1,26 @@ +/* + * Copyright 2010 Owen Rudge for 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 + */ + +#define WINE_FILEDESCRIPTION_STR "Wine D3DX10" +#define WINE_FILENAME_STR "d3dx10_36.dll" +#define WINE_FILEVERSION 9,19,949,2009 +#define WINE_FILEVERSION_STR "9.19.949.2009" +#define WINE_PRODUCTVERSION 9,19,949,2009 +#define WINE_PRODUCTVERSION_STR "9.19.949.2009" + +#include "wine/wine_common_ver.rc" diff -Nru wine1.3-1.3.0/dlls/d3dx10_37/d3dx10_37_main.c wine1.3-1.3.1/dlls/d3dx10_37/d3dx10_37_main.c --- wine1.3-1.3.0/dlls/d3dx10_37/d3dx10_37_main.c 1970-01-01 01:00:00.000000000 +0100 +++ wine1.3-1.3.1/dlls/d3dx10_37/d3dx10_37_main.c 2010-08-20 18:23:50.000000000 +0100 @@ -0,0 +1,63 @@ +/* + * D3DX10 main file + * + * Copyright (c) 2010 Owen Rudge for 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 "wine/port.h" + +#include + +#define COBJMACROS + +#include "windef.h" +#include "winbase.h" +#include "winuser.h" +#include "objbase.h" + +#include "d3d10.h" + +BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved) +{ + switch (fdwReason) + { + case DLL_WINE_PREATTACH: + return FALSE; /* prefer native version */ + case DLL_PROCESS_ATTACH: + DisableThreadLibraryCalls(hinstDLL); + break; + case DLL_PROCESS_DETACH: + break; + } + + return TRUE; +} + +/*********************************************************************** + * D3DX10CheckVersion + * + * Checks whether we are compiling against the correct d3d and d3dx library. + */ +BOOL WINAPI D3DX10CheckVersion(UINT d3dsdkvers, UINT d3dxsdkvers) +{ + if ((d3dsdkvers == D3D10_SDK_VERSION) && (d3dxsdkvers == 37)) + return TRUE; + + return FALSE; +} diff -Nru wine1.3-1.3.0/dlls/d3dx10_37/d3dx10_37.spec wine1.3-1.3.1/dlls/d3dx10_37/d3dx10_37.spec --- wine1.3-1.3.0/dlls/d3dx10_37/d3dx10_37.spec 1970-01-01 01:00:00.000000000 +0100 +++ wine1.3-1.3.1/dlls/d3dx10_37/d3dx10_37.spec 2010-08-20 18:23:50.000000000 +0100 @@ -0,0 +1,181 @@ +@ stub D3DX10CreateReduction +@ stdcall D3DX10CreateThreadPump(long long ptr) d3dx10_43.D3DX10CreateThreadPump +@ stub D3DX10GetDriverLevel +@ stdcall D3DX10CheckVersion(long long) +@ stdcall D3DX10CompileFromFileA(str ptr ptr str str long long ptr ptr ptr ptr) d3dx10_43.D3DX10CompileFromFileA +@ stdcall D3DX10CompileFromFileW(wstr ptr ptr str str long long ptr ptr ptr ptr) d3dx10_43.D3DX10CompileFromFileW +@ stdcall D3DX10CompileFromMemory(str long str ptr ptr str str long long ptr ptr ptr ptr) d3dx10_43.D3DX10CompileFromMemory +@ stdcall D3DX10CompileFromResourceA(long str str ptr ptr str str long long ptr ptr ptr ptr) d3dx10_43.D3DX10CompileFromResourceA +@ stdcall D3DX10CompileFromResourceW(long wstr wstr ptr ptr str str long long ptr ptr ptr ptr) d3dx10_43.D3DX10CompileFromResourceW +@ stdcall D3DX10ComputeNormalMap(ptr long long long ptr) d3dx10_43.D3DX10ComputeNormalMap +@ stdcall D3DX10CreateAsyncCompilerProcessor(str ptr ptr str str long long ptr ptr ptr) d3dx10_43.D3DX10CreateAsyncCompilerProcessor +@ stdcall D3DX10CreateAsyncEffectCreateProcessor(str ptr ptr str long long ptr ptr ptr ptr) d3dx10_43.D3DX10CreateAsyncEffectCreateProcessor +@ stdcall D3DX10CreateAsyncEffectPoolCreateProcessor(str ptr ptr str long long ptr ptr ptr) d3dx10_43.D3DX10CreateAsyncEffectPoolCreateProcessor +@ stdcall D3DX10CreateAsyncFileLoaderA(str ptr) d3dx10_43.D3DX10CreateAsyncFileLoaderA +@ stdcall D3DX10CreateAsyncFileLoaderW(wstr ptr) d3dx10_43.D3DX10CreateAsyncFileLoaderW +@ stdcall D3DX10CreateAsyncMemoryLoader(ptr long ptr) d3dx10_43.D3DX10CreateAsyncMemoryLoader +@ stdcall D3DX10CreateAsyncResourceLoaderA(long str ptr) d3dx10_43.D3DX10CreateAsyncResourceLoaderA +@ stdcall D3DX10CreateAsyncResourceLoaderW(long wstr ptr) d3dx10_43.D3DX10CreateAsyncResourceLoaderW +@ stdcall D3DX10CreateAsyncShaderPreprocessProcessor(str ptr ptr ptr ptr ptr) d3dx10_43.D3DX10CreateAsyncShaderPreprocessProcessor +@ stdcall D3DX10CreateAsyncShaderResourceViewProcessor(ptr ptr ptr) d3dx10_43.D3DX10CreateAsyncShaderResourceViewProcessor +@ stdcall D3DX10CreateAsyncTextureInfoProcessor(ptr ptr) d3dx10_43.D3DX10CreateAsyncTextureInfoProcessor +@ stdcall D3DX10CreateAsyncTextureProcessor(ptr ptr ptr) d3dx10_43.D3DX10CreateAsyncTextureProcessor +@ stdcall D3DX10CreateDevice(ptr long long long ptr) d3dx10_43.D3DX10CreateDevice +@ stdcall D3DX10CreateDeviceAndSwapChain(ptr long long long ptr ptr ptr) d3dx10_43.D3DX10CreateDeviceAndSwapChain +@ stdcall D3DX10CreateEffectFromFileA(str ptr ptr str long long ptr ptr ptr ptr ptr ptr) d3dx10_43.D3DX10CreateEffectFromFileA +@ stdcall D3DX10CreateEffectFromFileW(wstr ptr ptr str long long ptr ptr ptr ptr ptr ptr) d3dx10_43.D3DX10CreateEffectFromFileW +@ stdcall D3DX10CreateEffectFromMemory(ptr long str ptr ptr str long long ptr ptr ptr ptr ptr ptr) d3dx10_43.D3DX10CreateEffectFromMemory +@ stdcall D3DX10CreateEffectFromResourceA(long str str ptr ptr str long long ptr ptr ptr ptr ptr ptr) d3dx10_43.D3DX10CreateEffectFromResourceA +@ stdcall D3DX10CreateEffectFromResourceW(long wstr wstr ptr ptr str long long ptr ptr ptr ptr ptr ptr) d3dx10_43.D3DX10CreateEffectFromResourceW +@ stdcall D3DX10CreateEffectPoolFromFileA(str ptr ptr str long long ptr ptr ptr ptr ptr) d3dx10_43.D3DX10CreateEffectPoolFromFileA +@ stdcall D3DX10CreateEffectPoolFromFileW(wstr ptr ptr str long long ptr ptr ptr ptr ptr) d3dx10_43.D3DX10CreateEffectPoolFromFileW +@ stdcall D3DX10CreateEffectPoolFromMemory(ptr long str ptr ptr str long long ptr ptr ptr ptr ptr) d3dx10_43.D3DX10CreateEffectPoolFromMemory +@ stdcall D3DX10CreateEffectPoolFromResourceA(long str str ptr ptr str long long ptr ptr ptr ptr ptr) d3dx10_43.D3DX10CreateEffectPoolFromResourceA +@ stdcall D3DX10CreateEffectPoolFromResourceW(long wstr wstr ptr ptr str long long ptr ptr ptr ptr ptr) d3dx10_43.D3DX10CreateEffectPoolFromResourceW +@ stdcall D3DX10CreateFontA(ptr long long long long long long long long long str ptr) d3dx10_43.D3DX10CreateFontA +@ stdcall D3DX10CreateFontIndirectA(ptr ptr ptr) d3dx10_43.D3DX10CreateFontIndirectA +@ stdcall D3DX10CreateFontIndirectW(ptr ptr ptr) d3dx10_43.D3DX10CreateFontIndirectW +@ stdcall D3DX10CreateFontW(ptr long long long long long long long long long wstr ptr) d3dx10_43.D3DX10CreateFontW +@ stdcall D3DX10CreateMesh(ptr ptr long str long long long ptr) d3dx10_43.D3DX10CreateMesh +@ stdcall D3DX10CreateShaderResourceViewFromFileA(ptr str ptr ptr ptr ptr) d3dx10_43.D3DX10CreateShaderResourceViewFromFileA +@ stdcall D3DX10CreateShaderResourceViewFromFileW(ptr wstr ptr ptr ptr ptr) d3dx10_43.D3DX10CreateShaderResourceViewFromFileW +@ stdcall D3DX10CreateShaderResourceViewFromMemory(ptr ptr long ptr ptr ptr ptr) d3dx10_43.D3DX10CreateShaderResourceViewFromMemory +@ stdcall D3DX10CreateShaderResourceViewFromResourceA(ptr long str ptr ptr ptr ptr) d3dx10_43.D3DX10CreateShaderResourceViewFromResourceA +@ stdcall D3DX10CreateShaderResourceViewFromResourceW(ptr long wstr ptr ptr ptr ptr) d3dx10_43.D3DX10CreateShaderResourceViewFromResourceW +@ stdcall D3DX10CreateSkinInfo(ptr) d3dx10_43.D3DX10CreateSkinInfo +@ stdcall D3DX10CreateSprite(ptr long ptr) d3dx10_43.D3DX10CreateSprite +@ stdcall D3DX10CreateTextureFromFileA(ptr str ptr ptr ptr ptr) d3dx10_43.D3DX10CreateTextureFromFileA +@ stdcall D3DX10CreateTextureFromFileW(ptr wstr ptr ptr ptr ptr) d3dx10_43.D3DX10CreateTextureFromFileW +@ stdcall D3DX10CreateTextureFromMemory(ptr ptr long ptr ptr ptr ptr) d3dx10_43.D3DX10CreateTextureFromMemory +@ stdcall D3DX10CreateTextureFromResourceA(ptr long str ptr ptr ptr ptr) d3dx10_43.D3DX10CreateTextureFromResourceA +@ stdcall D3DX10CreateTextureFromResourceW(ptr long wstr ptr ptr ptr ptr) d3dx10_43.D3DX10CreateTextureFromResourceW +@ stdcall D3DX10DisassembleEffect(ptr long ptr) d3dx10_39.D3DX10DisassembleEffect +@ stdcall D3DX10DisassembleShader(ptr long long str ptr) d3dx10_39.D3DX10DisassembleShader +@ stdcall D3DX10FilterTexture(ptr long long) d3dx10_43.D3DX10FilterTexture +@ stdcall D3DX10GetFeatureLevel1(ptr ptr) d3dx10_43.D3DX10GetFeatureLevel1 +@ stdcall D3DX10GetImageInfoFromFileA(str ptr ptr ptr) d3dx10_43.D3DX10GetImageInfoFromFileA +@ stdcall D3DX10GetImageInfoFromFileW(wstr ptr ptr ptr) d3dx10_43.D3DX10GetImageInfoFromFileW +@ stdcall D3DX10GetImageInfoFromMemory(ptr long ptr ptr ptr) d3dx10_43.D3DX10GetImageInfoFromMemory +@ stdcall D3DX10GetImageInfoFromResourceA(long str ptr ptr ptr) d3dx10_43.D3DX10GetImageInfoFromResourceA +@ stdcall D3DX10GetImageInfoFromResourceW(long wstr ptr ptr ptr) d3dx10_43.D3DX10GetImageInfoFromResourceW +@ stdcall D3DX10LoadTextureFromTexture(ptr ptr ptr) d3dx10_43.D3DX10LoadTextureFromTexture +@ stdcall D3DX10PreprocessShaderFromFileA(str ptr ptr ptr ptr ptr) d3dx10_43.D3DX10PreprocessShaderFromFileA +@ stdcall D3DX10PreprocessShaderFromFileW(wstr ptr ptr ptr ptr ptr) d3dx10_43.D3DX10PreprocessShaderFromFileW +@ stdcall D3DX10PreprocessShaderFromMemory(str long str ptr ptr ptr ptr ptr) d3dx10_43.D3DX10PreprocessShaderFromMemory +@ stdcall D3DX10PreprocessShaderFromResourceA(long str str ptr ptr ptr ptr ptr) d3dx10_43.D3DX10PreprocessShaderFromResourceA +@ stdcall D3DX10PreprocessShaderFromResourceW(long wstr wstr ptr ptr ptr ptr ptr) d3dx10_43.D3DX10PreprocessShaderFromResourceW +@ stdcall D3DX10ReflectShader(ptr long ptr) d3dx10_39.D3DX10ReflectShader +@ stdcall D3DX10SHProjectCubeMap(long ptr ptr ptr ptr) d3dx10_43.D3DX10SHProjectCubeMap +@ stdcall D3DX10SaveTextureToFileA(ptr ptr str) d3dx10_43.D3DX10SaveTextureToFileA +@ stdcall D3DX10SaveTextureToFileW(ptr ptr wstr) d3dx10_43.D3DX10SaveTextureToFileW +@ stdcall D3DX10SaveTextureToMemory(ptr ptr ptr long) d3dx10_43.D3DX10SaveTextureToMemory +@ stdcall D3DX10UnsetAllDeviceObjects(ptr) d3dx10_43.D3DX10UnsetAllDeviceObjects +@ stdcall D3DXBoxBoundProbe(ptr ptr ptr ptr) d3dx10_43.D3DXBoxBoundProbe +@ stdcall D3DXColorAdjustContrast(ptr ptr long) d3dx10_43.3DXColorAdjustContrast +@ stdcall D3DXColorAdjustSaturation(ptr ptr long) d3dx10_43.D3DXColorAdjustSaturation +@ stdcall D3DXComputeBoundingBox(ptr long long ptr ptr) d3dx10_43.D3DXComputeBoundingBox +@ stdcall D3DXComputeBoundingSphere(ptr long long ptr ptr) d3dx10_43.D3DXComputeBoundingSphere +@ stdcall D3DXCpuOptimizations(long) d3dx10_43.D3DXCpuOptimizations +@ stdcall D3DXCreateMatrixStack(long ptr) d3dx10_43.D3DXCreateMatrixStack +@ stdcall D3DXFloat16To32Array(ptr ptr long) d3dx10_43.D3DXFloat16To32Array +@ stdcall D3DXFloat32To16Array(ptr ptr long) d3dx10_43.D3DXFloat32To16Array +@ stdcall D3DXFresnelTerm(long long) d3dx10_43.D3DXFresnelTerm +@ stdcall D3DXIntersectTri(ptr ptr ptr ptr ptr ptr ptr ptr) d3dx10_43.D3DXIntersectTri +@ stdcall D3DXMatrixAffineTransformation2D(ptr long ptr long ptr) d3dx10_43.D3DXMatrixAffineTransformation2D +@ stdcall D3DXMatrixAffineTransformation(ptr long ptr ptr ptr) d3dx10_43.D3DXMatrixAffineTransformation +@ stdcall D3DXMatrixDecompose(ptr ptr ptr ptr) d3dx10_43.D3DXMatrixDecompose +@ stdcall D3DXMatrixDeterminant(ptr) d3dx10_43.D3DXMatrixDeterminant +@ stdcall D3DXMatrixInverse(ptr ptr ptr) d3dx10_43.D3DXMatrixInverse +@ stdcall D3DXMatrixLookAtLH(ptr ptr ptr ptr) d3dx10_43.D3DXMatrixLookAtLH +@ stdcall D3DXMatrixLookAtRH(ptr ptr ptr ptr) d3dx10_43.D3DXMatrixLookAtRH +@ stdcall D3DXMatrixMultiply(ptr ptr ptr) d3dx10_43.D3DXMatrixMultiply +@ stdcall D3DXMatrixMultiplyTranspose(ptr ptr ptr) d3dx10_43.D3DXMatrixMultiplyTranspose +@ stdcall D3DXMatrixOrthoLH(ptr long long long long) d3dx10_43.D3DXMatrixOrthoLH +@ stdcall D3DXMatrixOrthoOffCenterLH(ptr long long long long long long) d3dx10_43.D3DXMatrixOrthoOffCenterLH +@ stdcall D3DXMatrixOrthoOffCenterRH(ptr long long long long long long) d3dx10_43.D3DXMatrixOrthoOffCenterRH +@ stdcall D3DXMatrixOrthoRH(ptr long long long long) d3dx10_43.D3DXMatrixOrthoRH +@ stdcall D3DXMatrixPerspectiveFovLH(ptr long long long long) d3dx10_43.D3DXMatrixPerspectiveFovLH +@ stdcall D3DXMatrixPerspectiveFovRH(ptr long long long long) d3dx10_43.D3DXMatrixPerspectiveFovRH +@ stdcall D3DXMatrixPerspectiveLH(ptr long long long long) d3dx10_43.D3DXMatrixPerspectiveLH +@ stdcall D3DXMatrixPerspectiveOffCenterLH(ptr long long long long long long) d3dx10_43.D3DXMatrixPerspectiveOffCenterLH +@ stdcall D3DXMatrixPerspectiveOffCenterRH(ptr long long long long long long) d3dx10_43.D3DXMatrixPerspectiveOffCenterRH +@ stdcall D3DXMatrixPerspectiveRH(ptr long long long long) d3dx10_43.D3DXMatrixPerspectiveRH +@ stdcall D3DXMatrixReflect(ptr ptr) d3dx10_43.D3DXMatrixReflect +@ stdcall D3DXMatrixRotationAxis(ptr ptr long) d3dx10_43.D3DXMatrixRotationAxis +@ stdcall D3DXMatrixRotationQuaternion(ptr ptr) d3dx10_43.D3DXMatrixRotationQuaternion +@ stdcall D3DXMatrixRotationX(ptr long) d3dx10_43.D3DXMatrixRotationX +@ stdcall D3DXMatrixRotationY(ptr long) d3dx10_43.D3DXMatrixRotationY +@ stdcall D3DXMatrixRotationYawPitchRoll(ptr long long long) d3dx10_43.D3DXMatrixRotationYawPitchRoll +@ stdcall D3DXMatrixRotationZ(ptr long) d3dx10_43.D3DXMatrixRotationZ +@ stdcall D3DXMatrixScaling(ptr long long long) d3dx10_43.D3DXMatrixScaling +@ stdcall D3DXMatrixShadow(ptr ptr ptr) d3dx10_43.D3DXMatrixShadow +@ stdcall D3DXMatrixTransformation2D(ptr ptr long ptr ptr long ptr) d3dx10_43.D3DXMatrixTransformation2D +@ stdcall D3DXMatrixTransformation(ptr ptr ptr ptr ptr ptr ptr) d3dx10_43.D3DXMatrixTransformation +@ stdcall D3DXMatrixTranslation(ptr long long long) d3dx10_43.D3DXMatrixTranslation +@ stdcall D3DXMatrixTranspose(ptr ptr) d3dx10_43.D3DXMatrixTranspose +@ stdcall D3DXPlaneFromPointNormal(ptr ptr ptr) d3dx10_43.D3DXPlaneFromPointNormal +@ stdcall D3DXPlaneFromPoints(ptr ptr ptr ptr) d3dx10_43.D3DXPlaneFromPoints +@ stdcall D3DXPlaneIntersectLine(ptr ptr ptr ptr) d3dx10_43.D3DXPlaneIntersectLine +@ stdcall D3DXPlaneNormalize(ptr ptr) d3dx10_43.D3DXPlaneNormalize +@ stdcall D3DXPlaneTransform(ptr ptr ptr) d3dx10_43.D3DXPlaneTransform +@ stdcall D3DXPlaneTransformArray(ptr long ptr long ptr long) d3dx10_43.D3DXPlaneTransformArray +@ stdcall D3DXQuaternionBaryCentric(ptr ptr ptr ptr long long) d3dx10_43.D3DXQuaternionBaryCentric +@ stdcall D3DXQuaternionExp(ptr ptr) d3dx10_43.D3DXQuaternionExp +@ stdcall D3DXQuaternionInverse(ptr ptr) d3dx10_43.D3DXQuaternionInverse +@ stdcall D3DXQuaternionLn(ptr ptr) d3dx10_43.D3DXQuaternionLn +@ stdcall D3DXQuaternionMultiply(ptr ptr ptr) d3dx10_43.D3DXQuaternionMultiply +@ stdcall D3DXQuaternionNormalize(ptr ptr) d3dx10_43.D3DXQuaternionNormalize +@ stdcall D3DXQuaternionRotationAxis(ptr ptr long) d3dx10_43.D3DXQuaternionRotationAxis +@ stdcall D3DXQuaternionRotationMatrix(ptr ptr) d3dx10_43.D3DXQuaternionRotationMatrix +@ stdcall D3DXQuaternionRotationYawPitchRoll(ptr long long long) d3dx10_43.D3DXQuaternionRotationYawPitchRoll +@ stdcall D3DXQuaternionSlerp(ptr ptr ptr long) d3dx10_43.D3DXQuaternionSlerp +@ stdcall D3DXQuaternionSquad(ptr ptr ptr ptr ptr long) d3dx10_43.D3DXQuaternionSquad +@ stdcall D3DXQuaternionSquadSetup(ptr ptr ptr ptr ptr ptr ptr) d3dx10_43.D3DXQuaternionSquadSetup +@ stdcall D3DXQuaternionToAxisAngle(ptr ptr ptr) d3dx10_43.D3DXQuaternionToAxisAngle +@ stdcall D3DXSHAdd(ptr long ptr ptr) d3dx10_43.D3DXSHAdd +@ stdcall D3DXSHDot(long ptr ptr) d3dx10_43.D3DXSHDot +@ stdcall D3DXSHEvalConeLight(long ptr long long long long ptr ptr ptr) d3dx10_43.D3DXSHEvalConeLight +@ stdcall D3DXSHEvalDirection(ptr long ptr) d3dx10_43.D3DXSHEvalDirection +@ stdcall D3DXSHEvalDirectionalLight(long ptr long long long long ptr ptr ptr) d3dx10_43.D3DXSHEvalDirectionalLight +@ stdcall D3DXSHEvalHemisphereLight(long ptr long long ptr ptr ptr) d3dx10_43.D3DXSHEvalHemisphereLight +@ stdcall D3DXSHEvalSphericalLight(long ptr long long long long ptr ptr ptr) d3dx10_43.D3DXSHEvalSphericalLight +@ stdcall D3DXSHMultiply2(ptr ptr ptr) d3dx10_43.D3DXSHMultiply2 +@ stdcall D3DXSHMultiply3(ptr ptr ptr) d3dx10_43.D3DXSHMultiply3 +@ stdcall D3DXSHMultiply4(ptr ptr ptr) d3dx10_43.D3DXSHMultiply4 +@ stdcall D3DXSHMultiply5(ptr ptr ptr) d3dx10_43.D3DXSHMultiply5 +@ stdcall D3DXSHMultiply6(ptr ptr ptr) d3dx10_43.D3DXSHMultiply6 +@ stdcall D3DXSHRotate(ptr long ptr ptr) d3dx10_43.D3DXSHRotate +@ stdcall D3DXSHRotateZ(ptr long long ptr) d3dx10_43.D3DXSHRotateZ +@ stdcall D3DXSHScale(ptr long ptr ptr) d3dx10_43.D3DXSHScale +@ stdcall D3DXSphereBoundProbe(ptr long ptr ptr) d3dx10_43.D3DXSphereBoundProbe +@ stdcall D3DXVec2BaryCentric(ptr ptr ptr ptr long long) d3dx10_43.D3DXVec2BaryCentric +@ stdcall D3DXVec2CatmullRom(ptr ptr ptr ptr ptr long) d3dx10_43.D3DXVec2CatmullRom +@ stdcall D3DXVec2Hermite(ptr ptr ptr ptr ptr long) d3dx10_43.D3DXVec2Hermite +@ stdcall D3DXVec2Normalize(ptr ptr) d3dx10_43.D3DXVec2Normalize +@ stdcall D3DXVec2Transform(ptr ptr ptr) d3dx10_43.D3DXVec2Transform +@ stdcall D3DXVec2TransformArray(ptr long ptr long ptr long) d3dx10_43.D3DXVec2TransformArray +@ stdcall D3DXVec2TransformCoord(ptr ptr ptr) d3dx10_43.D3DXVec2TransformCoord +@ stdcall D3DXVec2TransformCoordArray(ptr long ptr long ptr long) d3dx10_43.D3DXVec2TransformCoordArray +@ stdcall D3DXVec2TransformNormal(ptr ptr ptr) d3dx10_43.D3DXVec2TransformNormal +@ stdcall D3DXVec2TransformNormalArray(ptr long ptr long ptr long) d3dx10_43.D3DXVec2TransformNormalArray +@ stdcall D3DXVec3BaryCentric(ptr ptr ptr ptr long long) d3dx10_43.D3DXVec3BaryCentric +@ stdcall D3DXVec3CatmullRom(ptr ptr ptr ptr ptr long) d3dx10_43.D3DXVec3CatmullRom +@ stdcall D3DXVec3Hermite(ptr ptr ptr ptr ptr long) d3dx10_43.D3DXVec3Hermite +@ stdcall D3DXVec3Normalize(ptr ptr) d3dx10_43.D3DXVec3Normalize +@ stdcall D3DXVec3Project(ptr ptr ptr ptr ptr ptr) d3dx10_43.D3DXVec3Project +@ stdcall D3DXVec3ProjectArray(ptr long ptr long ptr ptr ptr ptr long) d3dx10_43.D3DXVec3ProjectArray +@ stdcall D3DXVec3Transform(ptr ptr ptr) d3dx10_43.D3DXVec3Transform +@ stdcall D3DXVec3TransformArray(ptr long ptr long ptr long) d3dx10_43.D3DXVec3TransformArray +@ stdcall D3DXVec3TransformCoord(ptr ptr ptr) d3dx10_43.D3DXVec3TransformCoord +@ stdcall D3DXVec3TransformCoordArray(ptr long ptr long ptr long) d3dx10_43.D3DXVec3TransformCoordArray +@ stdcall D3DXVec3TransformNormal(ptr ptr ptr) d3dx10_43.D3DXVec3TransformNormal +@ stdcall D3DXVec3TransformNormalArray(ptr long ptr long ptr long) d3dx10_43.D3DXVec3TransformNormalArray +@ stdcall D3DXVec3Unproject(ptr ptr ptr ptr ptr ptr) d3dx10_43.D3DXVec3Unproject +@ stdcall D3DXVec3UnprojectArray(ptr long ptr long ptr ptr ptr ptr long) d3dx10_43.D3DXVec3UnprojectArray +@ stdcall D3DXVec4BaryCentric(ptr ptr ptr ptr long long) d3dx10_43.D3DXVec4BaryCentric +@ stdcall D3DXVec4CatmullRom(ptr ptr ptr ptr ptr long) d3dx10_43.D3DXVec4CatmullRom +@ stdcall D3DXVec4Cross(ptr ptr ptr ptr) d3dx10_43.D3DXVec4Cross +@ stdcall D3DXVec4Hermite(ptr ptr ptr ptr ptr long) d3dx10_43.D3DXVec4Hermite +@ stdcall D3DXVec4Normalize(ptr ptr) d3dx10_43.D3DXVec4Normalize +@ stdcall D3DXVec4Transform(ptr ptr ptr) d3dx10_43.D3DXVec4Transform +@ stdcall D3DXVec4TransformArray(ptr long ptr long ptr long) d3dx10_43.D3DXVec4TransformArray diff -Nru wine1.3-1.3.0/dlls/d3dx10_37/Makefile.in wine1.3-1.3.1/dlls/d3dx10_37/Makefile.in --- wine1.3-1.3.0/dlls/d3dx10_37/Makefile.in 1970-01-01 01:00:00.000000000 +0100 +++ wine1.3-1.3.1/dlls/d3dx10_37/Makefile.in 2010-08-20 18:23:50.000000000 +0100 @@ -0,0 +1,12 @@ +TOPSRCDIR = @top_srcdir@ +TOPOBJDIR = ../.. +SRCDIR = @srcdir@ +VPATH = @srcdir@ +MODULE = d3dx10_37.dll + +C_SRCS = \ + d3dx10_37_main.c + +RC_SRCS = version.rc + +@MAKE_DLL_RULES@ diff -Nru wine1.3-1.3.0/dlls/d3dx10_37/version.rc wine1.3-1.3.1/dlls/d3dx10_37/version.rc --- wine1.3-1.3.0/dlls/d3dx10_37/version.rc 1970-01-01 01:00:00.000000000 +0100 +++ wine1.3-1.3.1/dlls/d3dx10_37/version.rc 2010-08-20 18:23:50.000000000 +0100 @@ -0,0 +1,26 @@ +/* + * Copyright 2010 Owen Rudge for 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 + */ + +#define WINE_FILEDESCRIPTION_STR "Wine D3DX10" +#define WINE_FILENAME_STR "d3dx10_37.dll" +#define WINE_FILEVERSION 9,19,949,2187 +#define WINE_FILEVERSION_STR "9.19.949.2187" +#define WINE_PRODUCTVERSION 9,19,949,2187 +#define WINE_PRODUCTVERSION_STR "9.19.949.2187" + +#include "wine/wine_common_ver.rc" diff -Nru wine1.3-1.3.0/dlls/d3dx10_38/d3dx10_38_main.c wine1.3-1.3.1/dlls/d3dx10_38/d3dx10_38_main.c --- wine1.3-1.3.0/dlls/d3dx10_38/d3dx10_38_main.c 1970-01-01 01:00:00.000000000 +0100 +++ wine1.3-1.3.1/dlls/d3dx10_38/d3dx10_38_main.c 2010-08-20 18:23:50.000000000 +0100 @@ -0,0 +1,63 @@ +/* + * D3DX10 main file + * + * Copyright (c) 2010 Owen Rudge for 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 "wine/port.h" + +#include + +#define COBJMACROS + +#include "windef.h" +#include "winbase.h" +#include "winuser.h" +#include "objbase.h" + +#include "d3d10.h" + +BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved) +{ + switch (fdwReason) + { + case DLL_WINE_PREATTACH: + return FALSE; /* prefer native version */ + case DLL_PROCESS_ATTACH: + DisableThreadLibraryCalls(hinstDLL); + break; + case DLL_PROCESS_DETACH: + break; + } + + return TRUE; +} + +/*********************************************************************** + * D3DX10CheckVersion + * + * Checks whether we are compiling against the correct d3d and d3dx library. + */ +BOOL WINAPI D3DX10CheckVersion(UINT d3dsdkvers, UINT d3dxsdkvers) +{ + if ((d3dsdkvers == D3D10_SDK_VERSION) && (d3dxsdkvers == 38)) + return TRUE; + + return FALSE; +} diff -Nru wine1.3-1.3.0/dlls/d3dx10_38/d3dx10_38.spec wine1.3-1.3.1/dlls/d3dx10_38/d3dx10_38.spec --- wine1.3-1.3.0/dlls/d3dx10_38/d3dx10_38.spec 1970-01-01 01:00:00.000000000 +0100 +++ wine1.3-1.3.1/dlls/d3dx10_38/d3dx10_38.spec 2010-08-20 18:23:50.000000000 +0100 @@ -0,0 +1,180 @@ +@ stub D3DX10CreateReduction +@ stdcall D3DX10CreateThreadPump(long long ptr) d3dx10_43.D3DX10CreateThreadPump +@ stdcall D3DX10CheckVersion(long long) +@ stdcall D3DX10CompileFromFileA(str ptr ptr str str long long ptr ptr ptr ptr) d3dx10_43.D3DX10CompileFromFileA +@ stdcall D3DX10CompileFromFileW(wstr ptr ptr str str long long ptr ptr ptr ptr) d3dx10_43.D3DX10CompileFromFileW +@ stdcall D3DX10CompileFromMemory(str long str ptr ptr str str long long ptr ptr ptr ptr) d3dx10_43.D3DX10CompileFromMemory +@ stdcall D3DX10CompileFromResourceA(long str str ptr ptr str str long long ptr ptr ptr ptr) d3dx10_43.D3DX10CompileFromResourceA +@ stdcall D3DX10CompileFromResourceW(long wstr wstr ptr ptr str str long long ptr ptr ptr ptr) d3dx10_43.D3DX10CompileFromResourceW +@ stdcall D3DX10ComputeNormalMap(ptr long long long ptr) d3dx10_43.D3DX10ComputeNormalMap +@ stdcall D3DX10CreateAsyncCompilerProcessor(str ptr ptr str str long long ptr ptr ptr) d3dx10_43.D3DX10CreateAsyncCompilerProcessor +@ stdcall D3DX10CreateAsyncEffectCreateProcessor(str ptr ptr str long long ptr ptr ptr ptr) d3dx10_43.D3DX10CreateAsyncEffectCreateProcessor +@ stdcall D3DX10CreateAsyncEffectPoolCreateProcessor(str ptr ptr str long long ptr ptr ptr) d3dx10_43.D3DX10CreateAsyncEffectPoolCreateProcessor +@ stdcall D3DX10CreateAsyncFileLoaderA(str ptr) d3dx10_43.D3DX10CreateAsyncFileLoaderA +@ stdcall D3DX10CreateAsyncFileLoaderW(wstr ptr) d3dx10_43.D3DX10CreateAsyncFileLoaderW +@ stdcall D3DX10CreateAsyncMemoryLoader(ptr long ptr) d3dx10_43.D3DX10CreateAsyncMemoryLoader +@ stdcall D3DX10CreateAsyncResourceLoaderA(long str ptr) d3dx10_43.D3DX10CreateAsyncResourceLoaderA +@ stdcall D3DX10CreateAsyncResourceLoaderW(long wstr ptr) d3dx10_43.D3DX10CreateAsyncResourceLoaderW +@ stdcall D3DX10CreateAsyncShaderPreprocessProcessor(str ptr ptr ptr ptr ptr) d3dx10_43.D3DX10CreateAsyncShaderPreprocessProcessor +@ stdcall D3DX10CreateAsyncShaderResourceViewProcessor(ptr ptr ptr) d3dx10_43.D3DX10CreateAsyncShaderResourceViewProcessor +@ stdcall D3DX10CreateAsyncTextureInfoProcessor(ptr ptr) d3dx10_43.D3DX10CreateAsyncTextureInfoProcessor +@ stdcall D3DX10CreateAsyncTextureProcessor(ptr ptr ptr) d3dx10_43.D3DX10CreateAsyncTextureProcessor +@ stdcall D3DX10CreateDevice(ptr long long long ptr) d3dx10_43.D3DX10CreateDevice +@ stdcall D3DX10CreateDeviceAndSwapChain(ptr long long long ptr ptr ptr) d3dx10_43.D3DX10CreateDeviceAndSwapChain +@ stdcall D3DX10CreateEffectFromFileA(str ptr ptr str long long ptr ptr ptr ptr ptr ptr) d3dx10_43.D3DX10CreateEffectFromFileA +@ stdcall D3DX10CreateEffectFromFileW(wstr ptr ptr str long long ptr ptr ptr ptr ptr ptr) d3dx10_43.D3DX10CreateEffectFromFileW +@ stdcall D3DX10CreateEffectFromMemory(ptr long str ptr ptr str long long ptr ptr ptr ptr ptr ptr) d3dx10_43.D3DX10CreateEffectFromMemory +@ stdcall D3DX10CreateEffectFromResourceA(long str str ptr ptr str long long ptr ptr ptr ptr ptr ptr) d3dx10_43.D3DX10CreateEffectFromResourceA +@ stdcall D3DX10CreateEffectFromResourceW(long wstr wstr ptr ptr str long long ptr ptr ptr ptr ptr ptr) d3dx10_43.D3DX10CreateEffectFromResourceW +@ stdcall D3DX10CreateEffectPoolFromFileA(str ptr ptr str long long ptr ptr ptr ptr ptr) d3dx10_43.D3DX10CreateEffectPoolFromFileA +@ stdcall D3DX10CreateEffectPoolFromFileW(wstr ptr ptr str long long ptr ptr ptr ptr ptr) d3dx10_43.D3DX10CreateEffectPoolFromFileW +@ stdcall D3DX10CreateEffectPoolFromMemory(ptr long str ptr ptr str long long ptr ptr ptr ptr ptr) d3dx10_43.D3DX10CreateEffectPoolFromMemory +@ stdcall D3DX10CreateEffectPoolFromResourceA(long str str ptr ptr str long long ptr ptr ptr ptr ptr) d3dx10_43.D3DX10CreateEffectPoolFromResourceA +@ stdcall D3DX10CreateEffectPoolFromResourceW(long wstr wstr ptr ptr str long long ptr ptr ptr ptr ptr) d3dx10_43.D3DX10CreateEffectPoolFromResourceW +@ stdcall D3DX10CreateFontA(ptr long long long long long long long long long str ptr) d3dx10_43.D3DX10CreateFontA +@ stdcall D3DX10CreateFontIndirectA(ptr ptr ptr) d3dx10_43.D3DX10CreateFontIndirectA +@ stdcall D3DX10CreateFontIndirectW(ptr ptr ptr) d3dx10_43.D3DX10CreateFontIndirectW +@ stdcall D3DX10CreateFontW(ptr long long long long long long long long long wstr ptr) d3dx10_43.D3DX10CreateFontW +@ stdcall D3DX10CreateMesh(ptr ptr long str long long long ptr) d3dx10_43.D3DX10CreateMesh +@ stdcall D3DX10CreateShaderResourceViewFromFileA(ptr str ptr ptr ptr ptr) d3dx10_43.D3DX10CreateShaderResourceViewFromFileA +@ stdcall D3DX10CreateShaderResourceViewFromFileW(ptr wstr ptr ptr ptr ptr) d3dx10_43.D3DX10CreateShaderResourceViewFromFileW +@ stdcall D3DX10CreateShaderResourceViewFromMemory(ptr ptr long ptr ptr ptr ptr) d3dx10_43.D3DX10CreateShaderResourceViewFromMemory +@ stdcall D3DX10CreateShaderResourceViewFromResourceA(ptr long str ptr ptr ptr ptr) d3dx10_43.D3DX10CreateShaderResourceViewFromResourceA +@ stdcall D3DX10CreateShaderResourceViewFromResourceW(ptr long wstr ptr ptr ptr ptr) d3dx10_43.D3DX10CreateShaderResourceViewFromResourceW +@ stdcall D3DX10CreateSkinInfo(ptr) d3dx10_43.D3DX10CreateSkinInfo +@ stdcall D3DX10CreateSprite(ptr long ptr) d3dx10_43.D3DX10CreateSprite +@ stdcall D3DX10CreateTextureFromFileA(ptr str ptr ptr ptr ptr) d3dx10_43.D3DX10CreateTextureFromFileA +@ stdcall D3DX10CreateTextureFromFileW(ptr wstr ptr ptr ptr ptr) d3dx10_43.D3DX10CreateTextureFromFileW +@ stdcall D3DX10CreateTextureFromMemory(ptr ptr long ptr ptr ptr ptr) d3dx10_43.D3DX10CreateTextureFromMemory +@ stdcall D3DX10CreateTextureFromResourceA(ptr long str ptr ptr ptr ptr) d3dx10_43.D3DX10CreateTextureFromResourceA +@ stdcall D3DX10CreateTextureFromResourceW(ptr long wstr ptr ptr ptr ptr) d3dx10_43.D3DX10CreateTextureFromResourceW +@ stdcall D3DX10DisassembleEffect(ptr long ptr) d3dx10_39.D3DX10DisassembleEffect +@ stdcall D3DX10DisassembleShader(ptr long long str ptr) d3dx10_39.D3DX10DisassembleShader +@ stdcall D3DX10FilterTexture(ptr long long) d3dx10_43.D3DX10FilterTexture +@ stdcall D3DX10GetFeatureLevel1(ptr ptr) d3dx10_43.D3DX10GetFeatureLevel1 +@ stdcall D3DX10GetImageInfoFromFileA(str ptr ptr ptr) d3dx10_43.D3DX10GetImageInfoFromFileA +@ stdcall D3DX10GetImageInfoFromFileW(wstr ptr ptr ptr) d3dx10_43.D3DX10GetImageInfoFromFileW +@ stdcall D3DX10GetImageInfoFromMemory(ptr long ptr ptr ptr) d3dx10_43.D3DX10GetImageInfoFromMemory +@ stdcall D3DX10GetImageInfoFromResourceA(long str ptr ptr ptr) d3dx10_43.D3DX10GetImageInfoFromResourceA +@ stdcall D3DX10GetImageInfoFromResourceW(long wstr ptr ptr ptr) d3dx10_43.D3DX10GetImageInfoFromResourceW +@ stdcall D3DX10LoadTextureFromTexture(ptr ptr ptr) d3dx10_43.D3DX10LoadTextureFromTexture +@ stdcall D3DX10PreprocessShaderFromFileA(str ptr ptr ptr ptr ptr) d3dx10_43.D3DX10PreprocessShaderFromFileA +@ stdcall D3DX10PreprocessShaderFromFileW(wstr ptr ptr ptr ptr ptr) d3dx10_43.D3DX10PreprocessShaderFromFileW +@ stdcall D3DX10PreprocessShaderFromMemory(str long str ptr ptr ptr ptr ptr) d3dx10_43.D3DX10PreprocessShaderFromMemory +@ stdcall D3DX10PreprocessShaderFromResourceA(long str str ptr ptr ptr ptr ptr) d3dx10_43.D3DX10PreprocessShaderFromResourceA +@ stdcall D3DX10PreprocessShaderFromResourceW(long wstr wstr ptr ptr ptr ptr ptr) d3dx10_43.D3DX10PreprocessShaderFromResourceW +@ stdcall D3DX10ReflectShader(ptr long ptr) d3dx10_39.D3DX10ReflectShader +@ stdcall D3DX10SHProjectCubeMap(long ptr ptr ptr ptr) d3dx10_43.D3DX10SHProjectCubeMap +@ stdcall D3DX10SaveTextureToFileA(ptr ptr str) d3dx10_43.D3DX10SaveTextureToFileA +@ stdcall D3DX10SaveTextureToFileW(ptr ptr wstr) d3dx10_43.D3DX10SaveTextureToFileW +@ stdcall D3DX10SaveTextureToMemory(ptr ptr ptr long) d3dx10_43.D3DX10SaveTextureToMemory +@ stdcall D3DX10UnsetAllDeviceObjects(ptr) d3dx10_43.D3DX10UnsetAllDeviceObjects +@ stdcall D3DXBoxBoundProbe(ptr ptr ptr ptr) d3dx10_43.D3DXBoxBoundProbe +@ stdcall D3DXColorAdjustContrast(ptr ptr long) d3dx10_43.3DXColorAdjustContrast +@ stdcall D3DXColorAdjustSaturation(ptr ptr long) d3dx10_43.D3DXColorAdjustSaturation +@ stdcall D3DXComputeBoundingBox(ptr long long ptr ptr) d3dx10_43.D3DXComputeBoundingBox +@ stdcall D3DXComputeBoundingSphere(ptr long long ptr ptr) d3dx10_43.D3DXComputeBoundingSphere +@ stdcall D3DXCpuOptimizations(long) d3dx10_43.D3DXCpuOptimizations +@ stdcall D3DXCreateMatrixStack(long ptr) d3dx10_43.D3DXCreateMatrixStack +@ stdcall D3DXFloat16To32Array(ptr ptr long) d3dx10_43.D3DXFloat16To32Array +@ stdcall D3DXFloat32To16Array(ptr ptr long) d3dx10_43.D3DXFloat32To16Array +@ stdcall D3DXFresnelTerm(long long) d3dx10_43.D3DXFresnelTerm +@ stdcall D3DXIntersectTri(ptr ptr ptr ptr ptr ptr ptr ptr) d3dx10_43.D3DXIntersectTri +@ stdcall D3DXMatrixAffineTransformation2D(ptr long ptr long ptr) d3dx10_43.D3DXMatrixAffineTransformation2D +@ stdcall D3DXMatrixAffineTransformation(ptr long ptr ptr ptr) d3dx10_43.D3DXMatrixAffineTransformation +@ stdcall D3DXMatrixDecompose(ptr ptr ptr ptr) d3dx10_43.D3DXMatrixDecompose +@ stdcall D3DXMatrixDeterminant(ptr) d3dx10_43.D3DXMatrixDeterminant +@ stdcall D3DXMatrixInverse(ptr ptr ptr) d3dx10_43.D3DXMatrixInverse +@ stdcall D3DXMatrixLookAtLH(ptr ptr ptr ptr) d3dx10_43.D3DXMatrixLookAtLH +@ stdcall D3DXMatrixLookAtRH(ptr ptr ptr ptr) d3dx10_43.D3DXMatrixLookAtRH +@ stdcall D3DXMatrixMultiply(ptr ptr ptr) d3dx10_43.D3DXMatrixMultiply +@ stdcall D3DXMatrixMultiplyTranspose(ptr ptr ptr) d3dx10_43.D3DXMatrixMultiplyTranspose +@ stdcall D3DXMatrixOrthoLH(ptr long long long long) d3dx10_43.D3DXMatrixOrthoLH +@ stdcall D3DXMatrixOrthoOffCenterLH(ptr long long long long long long) d3dx10_43.D3DXMatrixOrthoOffCenterLH +@ stdcall D3DXMatrixOrthoOffCenterRH(ptr long long long long long long) d3dx10_43.D3DXMatrixOrthoOffCenterRH +@ stdcall D3DXMatrixOrthoRH(ptr long long long long) d3dx10_43.D3DXMatrixOrthoRH +@ stdcall D3DXMatrixPerspectiveFovLH(ptr long long long long) d3dx10_43.D3DXMatrixPerspectiveFovLH +@ stdcall D3DXMatrixPerspectiveFovRH(ptr long long long long) d3dx10_43.D3DXMatrixPerspectiveFovRH +@ stdcall D3DXMatrixPerspectiveLH(ptr long long long long) d3dx10_43.D3DXMatrixPerspectiveLH +@ stdcall D3DXMatrixPerspectiveOffCenterLH(ptr long long long long long long) d3dx10_43.D3DXMatrixPerspectiveOffCenterLH +@ stdcall D3DXMatrixPerspectiveOffCenterRH(ptr long long long long long long) d3dx10_43.D3DXMatrixPerspectiveOffCenterRH +@ stdcall D3DXMatrixPerspectiveRH(ptr long long long long) d3dx10_43.D3DXMatrixPerspectiveRH +@ stdcall D3DXMatrixReflect(ptr ptr) d3dx10_43.D3DXMatrixReflect +@ stdcall D3DXMatrixRotationAxis(ptr ptr long) d3dx10_43.D3DXMatrixRotationAxis +@ stdcall D3DXMatrixRotationQuaternion(ptr ptr) d3dx10_43.D3DXMatrixRotationQuaternion +@ stdcall D3DXMatrixRotationX(ptr long) d3dx10_43.D3DXMatrixRotationX +@ stdcall D3DXMatrixRotationY(ptr long) d3dx10_43.D3DXMatrixRotationY +@ stdcall D3DXMatrixRotationYawPitchRoll(ptr long long long) d3dx10_43.D3DXMatrixRotationYawPitchRoll +@ stdcall D3DXMatrixRotationZ(ptr long) d3dx10_43.D3DXMatrixRotationZ +@ stdcall D3DXMatrixScaling(ptr long long long) d3dx10_43.D3DXMatrixScaling +@ stdcall D3DXMatrixShadow(ptr ptr ptr) d3dx10_43.D3DXMatrixShadow +@ stdcall D3DXMatrixTransformation2D(ptr ptr long ptr ptr long ptr) d3dx10_43.D3DXMatrixTransformation2D +@ stdcall D3DXMatrixTransformation(ptr ptr ptr ptr ptr ptr ptr) d3dx10_43.D3DXMatrixTransformation +@ stdcall D3DXMatrixTranslation(ptr long long long) d3dx10_43.D3DXMatrixTranslation +@ stdcall D3DXMatrixTranspose(ptr ptr) d3dx10_43.D3DXMatrixTranspose +@ stdcall D3DXPlaneFromPointNormal(ptr ptr ptr) d3dx10_43.D3DXPlaneFromPointNormal +@ stdcall D3DXPlaneFromPoints(ptr ptr ptr ptr) d3dx10_43.D3DXPlaneFromPoints +@ stdcall D3DXPlaneIntersectLine(ptr ptr ptr ptr) d3dx10_43.D3DXPlaneIntersectLine +@ stdcall D3DXPlaneNormalize(ptr ptr) d3dx10_43.D3DXPlaneNormalize +@ stdcall D3DXPlaneTransform(ptr ptr ptr) d3dx10_43.D3DXPlaneTransform +@ stdcall D3DXPlaneTransformArray(ptr long ptr long ptr long) d3dx10_43.D3DXPlaneTransformArray +@ stdcall D3DXQuaternionBaryCentric(ptr ptr ptr ptr long long) d3dx10_43.D3DXQuaternionBaryCentric +@ stdcall D3DXQuaternionExp(ptr ptr) d3dx10_43.D3DXQuaternionExp +@ stdcall D3DXQuaternionInverse(ptr ptr) d3dx10_43.D3DXQuaternionInverse +@ stdcall D3DXQuaternionLn(ptr ptr) d3dx10_43.D3DXQuaternionLn +@ stdcall D3DXQuaternionMultiply(ptr ptr ptr) d3dx10_43.D3DXQuaternionMultiply +@ stdcall D3DXQuaternionNormalize(ptr ptr) d3dx10_43.D3DXQuaternionNormalize +@ stdcall D3DXQuaternionRotationAxis(ptr ptr long) d3dx10_43.D3DXQuaternionRotationAxis +@ stdcall D3DXQuaternionRotationMatrix(ptr ptr) d3dx10_43.D3DXQuaternionRotationMatrix +@ stdcall D3DXQuaternionRotationYawPitchRoll(ptr long long long) d3dx10_43.D3DXQuaternionRotationYawPitchRoll +@ stdcall D3DXQuaternionSlerp(ptr ptr ptr long) d3dx10_43.D3DXQuaternionSlerp +@ stdcall D3DXQuaternionSquad(ptr ptr ptr ptr ptr long) d3dx10_43.D3DXQuaternionSquad +@ stdcall D3DXQuaternionSquadSetup(ptr ptr ptr ptr ptr ptr ptr) d3dx10_43.D3DXQuaternionSquadSetup +@ stdcall D3DXQuaternionToAxisAngle(ptr ptr ptr) d3dx10_43.D3DXQuaternionToAxisAngle +@ stdcall D3DXSHAdd(ptr long ptr ptr) d3dx10_43.D3DXSHAdd +@ stdcall D3DXSHDot(long ptr ptr) d3dx10_43.D3DXSHDot +@ stdcall D3DXSHEvalConeLight(long ptr long long long long ptr ptr ptr) d3dx10_43.D3DXSHEvalConeLight +@ stdcall D3DXSHEvalDirection(ptr long ptr) d3dx10_43.D3DXSHEvalDirection +@ stdcall D3DXSHEvalDirectionalLight(long ptr long long long long ptr ptr ptr) d3dx10_43.D3DXSHEvalDirectionalLight +@ stdcall D3DXSHEvalHemisphereLight(long ptr long long ptr ptr ptr) d3dx10_43.D3DXSHEvalHemisphereLight +@ stdcall D3DXSHEvalSphericalLight(long ptr long long long long ptr ptr ptr) d3dx10_43.D3DXSHEvalSphericalLight +@ stdcall D3DXSHMultiply2(ptr ptr ptr) d3dx10_43.D3DXSHMultiply2 +@ stdcall D3DXSHMultiply3(ptr ptr ptr) d3dx10_43.D3DXSHMultiply3 +@ stdcall D3DXSHMultiply4(ptr ptr ptr) d3dx10_43.D3DXSHMultiply4 +@ stdcall D3DXSHMultiply5(ptr ptr ptr) d3dx10_43.D3DXSHMultiply5 +@ stdcall D3DXSHMultiply6(ptr ptr ptr) d3dx10_43.D3DXSHMultiply6 +@ stdcall D3DXSHRotate(ptr long ptr ptr) d3dx10_43.D3DXSHRotate +@ stdcall D3DXSHRotateZ(ptr long long ptr) d3dx10_43.D3DXSHRotateZ +@ stdcall D3DXSHScale(ptr long ptr ptr) d3dx10_43.D3DXSHScale +@ stdcall D3DXSphereBoundProbe(ptr long ptr ptr) d3dx10_43.D3DXSphereBoundProbe +@ stdcall D3DXVec2BaryCentric(ptr ptr ptr ptr long long) d3dx10_43.D3DXVec2BaryCentric +@ stdcall D3DXVec2CatmullRom(ptr ptr ptr ptr ptr long) d3dx10_43.D3DXVec2CatmullRom +@ stdcall D3DXVec2Hermite(ptr ptr ptr ptr ptr long) d3dx10_43.D3DXVec2Hermite +@ stdcall D3DXVec2Normalize(ptr ptr) d3dx10_43.D3DXVec2Normalize +@ stdcall D3DXVec2Transform(ptr ptr ptr) d3dx10_43.D3DXVec2Transform +@ stdcall D3DXVec2TransformArray(ptr long ptr long ptr long) d3dx10_43.D3DXVec2TransformArray +@ stdcall D3DXVec2TransformCoord(ptr ptr ptr) d3dx10_43.D3DXVec2TransformCoord +@ stdcall D3DXVec2TransformCoordArray(ptr long ptr long ptr long) d3dx10_43.D3DXVec2TransformCoordArray +@ stdcall D3DXVec2TransformNormal(ptr ptr ptr) d3dx10_43.D3DXVec2TransformNormal +@ stdcall D3DXVec2TransformNormalArray(ptr long ptr long ptr long) d3dx10_43.D3DXVec2TransformNormalArray +@ stdcall D3DXVec3BaryCentric(ptr ptr ptr ptr long long) d3dx10_43.D3DXVec3BaryCentric +@ stdcall D3DXVec3CatmullRom(ptr ptr ptr ptr ptr long) d3dx10_43.D3DXVec3CatmullRom +@ stdcall D3DXVec3Hermite(ptr ptr ptr ptr ptr long) d3dx10_43.D3DXVec3Hermite +@ stdcall D3DXVec3Normalize(ptr ptr) d3dx10_43.D3DXVec3Normalize +@ stdcall D3DXVec3Project(ptr ptr ptr ptr ptr ptr) d3dx10_43.D3DXVec3Project +@ stdcall D3DXVec3ProjectArray(ptr long ptr long ptr ptr ptr ptr long) d3dx10_43.D3DXVec3ProjectArray +@ stdcall D3DXVec3Transform(ptr ptr ptr) d3dx10_43.D3DXVec3Transform +@ stdcall D3DXVec3TransformArray(ptr long ptr long ptr long) d3dx10_43.D3DXVec3TransformArray +@ stdcall D3DXVec3TransformCoord(ptr ptr ptr) d3dx10_43.D3DXVec3TransformCoord +@ stdcall D3DXVec3TransformCoordArray(ptr long ptr long ptr long) d3dx10_43.D3DXVec3TransformCoordArray +@ stdcall D3DXVec3TransformNormal(ptr ptr ptr) d3dx10_43.D3DXVec3TransformNormal +@ stdcall D3DXVec3TransformNormalArray(ptr long ptr long ptr long) d3dx10_43.D3DXVec3TransformNormalArray +@ stdcall D3DXVec3Unproject(ptr ptr ptr ptr ptr ptr) d3dx10_43.D3DXVec3Unproject +@ stdcall D3DXVec3UnprojectArray(ptr long ptr long ptr ptr ptr ptr long) d3dx10_43.D3DXVec3UnprojectArray +@ stdcall D3DXVec4BaryCentric(ptr ptr ptr ptr long long) d3dx10_43.D3DXVec4BaryCentric +@ stdcall D3DXVec4CatmullRom(ptr ptr ptr ptr ptr long) d3dx10_43.D3DXVec4CatmullRom +@ stdcall D3DXVec4Cross(ptr ptr ptr ptr) d3dx10_43.D3DXVec4Cross +@ stdcall D3DXVec4Hermite(ptr ptr ptr ptr ptr long) d3dx10_43.D3DXVec4Hermite +@ stdcall D3DXVec4Normalize(ptr ptr) d3dx10_43.D3DXVec4Normalize +@ stdcall D3DXVec4Transform(ptr ptr ptr) d3dx10_43.D3DXVec4Transform +@ stdcall D3DXVec4TransformArray(ptr long ptr long ptr long) d3dx10_43.D3DXVec4TransformArray diff -Nru wine1.3-1.3.0/dlls/d3dx10_38/Makefile.in wine1.3-1.3.1/dlls/d3dx10_38/Makefile.in --- wine1.3-1.3.0/dlls/d3dx10_38/Makefile.in 1970-01-01 01:00:00.000000000 +0100 +++ wine1.3-1.3.1/dlls/d3dx10_38/Makefile.in 2010-08-20 18:23:50.000000000 +0100 @@ -0,0 +1,12 @@ +TOPSRCDIR = @top_srcdir@ +TOPOBJDIR = ../.. +SRCDIR = @srcdir@ +VPATH = @srcdir@ +MODULE = d3dx10_38.dll + +C_SRCS = \ + d3dx10_38_main.c + +RC_SRCS = version.rc + +@MAKE_DLL_RULES@ diff -Nru wine1.3-1.3.0/dlls/d3dx10_38/version.rc wine1.3-1.3.1/dlls/d3dx10_38/version.rc --- wine1.3-1.3.0/dlls/d3dx10_38/version.rc 1970-01-01 01:00:00.000000000 +0100 +++ wine1.3-1.3.1/dlls/d3dx10_38/version.rc 2010-08-20 18:23:50.000000000 +0100 @@ -0,0 +1,26 @@ +/* + * Copyright 2010 Owen Rudge for 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 + */ + +#define WINE_FILEDESCRIPTION_STR "Wine D3DX10" +#define WINE_FILENAME_STR "d3dx10_38.dll" +#define WINE_FILEVERSION 9,23,949,2378 +#define WINE_FILEVERSION_STR "9.23.949.2378" +#define WINE_PRODUCTVERSION 9,23,949,2378 +#define WINE_PRODUCTVERSION_STR "9.23.949.2378" + +#include "wine/wine_common_ver.rc" diff -Nru wine1.3-1.3.0/dlls/d3dx10_39/d3dx10_39_main.c wine1.3-1.3.1/dlls/d3dx10_39/d3dx10_39_main.c --- wine1.3-1.3.0/dlls/d3dx10_39/d3dx10_39_main.c 1970-01-01 01:00:00.000000000 +0100 +++ wine1.3-1.3.1/dlls/d3dx10_39/d3dx10_39_main.c 2010-08-20 18:23:50.000000000 +0100 @@ -0,0 +1,63 @@ +/* + * D3DX10 main file + * + * Copyright (c) 2010 Owen Rudge for 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 "wine/port.h" + +#include + +#define COBJMACROS + +#include "windef.h" +#include "winbase.h" +#include "winuser.h" +#include "objbase.h" + +#include "d3d10.h" + +BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved) +{ + switch (fdwReason) + { + case DLL_WINE_PREATTACH: + return FALSE; /* prefer native version */ + case DLL_PROCESS_ATTACH: + DisableThreadLibraryCalls(hinstDLL); + break; + case DLL_PROCESS_DETACH: + break; + } + + return TRUE; +} + +/*********************************************************************** + * D3DX10CheckVersion + * + * Checks whether we are compiling against the correct d3d and d3dx library. + */ +BOOL WINAPI D3DX10CheckVersion(UINT d3dsdkvers, UINT d3dxsdkvers) +{ + if ((d3dsdkvers == D3D10_SDK_VERSION) && (d3dxsdkvers == 39)) + return TRUE; + + return FALSE; +} diff -Nru wine1.3-1.3.0/dlls/d3dx10_39/d3dx10_39.spec wine1.3-1.3.1/dlls/d3dx10_39/d3dx10_39.spec --- wine1.3-1.3.0/dlls/d3dx10_39/d3dx10_39.spec 1970-01-01 01:00:00.000000000 +0100 +++ wine1.3-1.3.1/dlls/d3dx10_39/d3dx10_39.spec 2010-08-20 18:23:50.000000000 +0100 @@ -0,0 +1,180 @@ +@ stub D3DX10CreateReduction +@ stdcall D3DX10CreateThreadPump(long long ptr) d3dx10_43.D3DX10CreateThreadPump +@ stdcall D3DX10CheckVersion(long long) +@ stdcall D3DX10CompileFromFileA(str ptr ptr str str long long ptr ptr ptr ptr) d3dx10_43.D3DX10CompileFromFileA +@ stdcall D3DX10CompileFromFileW(wstr ptr ptr str str long long ptr ptr ptr ptr) d3dx10_43.D3DX10CompileFromFileW +@ stdcall D3DX10CompileFromMemory(str long str ptr ptr str str long long ptr ptr ptr ptr) d3dx10_43.D3DX10CompileFromMemory +@ stdcall D3DX10CompileFromResourceA(long str str ptr ptr str str long long ptr ptr ptr ptr) d3dx10_43.D3DX10CompileFromResourceA +@ stdcall D3DX10CompileFromResourceW(long wstr wstr ptr ptr str str long long ptr ptr ptr ptr) d3dx10_43.D3DX10CompileFromResourceW +@ stdcall D3DX10ComputeNormalMap(ptr long long long ptr) d3dx10_43.D3DX10ComputeNormalMap +@ stdcall D3DX10CreateAsyncCompilerProcessor(str ptr ptr str str long long ptr ptr ptr) d3dx10_43.D3DX10CreateAsyncCompilerProcessor +@ stdcall D3DX10CreateAsyncEffectCreateProcessor(str ptr ptr str long long ptr ptr ptr ptr) d3dx10_43.D3DX10CreateAsyncEffectCreateProcessor +@ stdcall D3DX10CreateAsyncEffectPoolCreateProcessor(str ptr ptr str long long ptr ptr ptr) d3dx10_43.D3DX10CreateAsyncEffectPoolCreateProcessor +@ stdcall D3DX10CreateAsyncFileLoaderA(str ptr) d3dx10_43.D3DX10CreateAsyncFileLoaderA +@ stdcall D3DX10CreateAsyncFileLoaderW(wstr ptr) d3dx10_43.D3DX10CreateAsyncFileLoaderW +@ stdcall D3DX10CreateAsyncMemoryLoader(ptr long ptr) d3dx10_43.D3DX10CreateAsyncMemoryLoader +@ stdcall D3DX10CreateAsyncResourceLoaderA(long str ptr) d3dx10_43.D3DX10CreateAsyncResourceLoaderA +@ stdcall D3DX10CreateAsyncResourceLoaderW(long wstr ptr) d3dx10_43.D3DX10CreateAsyncResourceLoaderW +@ stdcall D3DX10CreateAsyncShaderPreprocessProcessor(str ptr ptr ptr ptr ptr) d3dx10_43.D3DX10CreateAsyncShaderPreprocessProcessor +@ stdcall D3DX10CreateAsyncShaderResourceViewProcessor(ptr ptr ptr) d3dx10_43.D3DX10CreateAsyncShaderResourceViewProcessor +@ stdcall D3DX10CreateAsyncTextureInfoProcessor(ptr ptr) d3dx10_43.D3DX10CreateAsyncTextureInfoProcessor +@ stdcall D3DX10CreateAsyncTextureProcessor(ptr ptr ptr) d3dx10_43.D3DX10CreateAsyncTextureProcessor +@ stdcall D3DX10CreateDevice(ptr long long long ptr) d3dx10_43.D3DX10CreateDevice +@ stdcall D3DX10CreateDeviceAndSwapChain(ptr long long long ptr ptr ptr) d3dx10_43.D3DX10CreateDeviceAndSwapChain +@ stdcall D3DX10CreateEffectFromFileA(str ptr ptr str long long ptr ptr ptr ptr ptr ptr) d3dx10_43.D3DX10CreateEffectFromFileA +@ stdcall D3DX10CreateEffectFromFileW(wstr ptr ptr str long long ptr ptr ptr ptr ptr ptr) d3dx10_43.D3DX10CreateEffectFromFileW +@ stdcall D3DX10CreateEffectFromMemory(ptr long str ptr ptr str long long ptr ptr ptr ptr ptr ptr) d3dx10_43.D3DX10CreateEffectFromMemory +@ stdcall D3DX10CreateEffectFromResourceA(long str str ptr ptr str long long ptr ptr ptr ptr ptr ptr) d3dx10_43.D3DX10CreateEffectFromResourceA +@ stdcall D3DX10CreateEffectFromResourceW(long wstr wstr ptr ptr str long long ptr ptr ptr ptr ptr ptr) d3dx10_43.D3DX10CreateEffectFromResourceW +@ stdcall D3DX10CreateEffectPoolFromFileA(str ptr ptr str long long ptr ptr ptr ptr ptr) d3dx10_43.D3DX10CreateEffectPoolFromFileA +@ stdcall D3DX10CreateEffectPoolFromFileW(wstr ptr ptr str long long ptr ptr ptr ptr ptr) d3dx10_43.D3DX10CreateEffectPoolFromFileW +@ stdcall D3DX10CreateEffectPoolFromMemory(ptr long str ptr ptr str long long ptr ptr ptr ptr ptr) d3dx10_43.D3DX10CreateEffectPoolFromMemory +@ stdcall D3DX10CreateEffectPoolFromResourceA(long str str ptr ptr str long long ptr ptr ptr ptr ptr) d3dx10_43.D3DX10CreateEffectPoolFromResourceA +@ stdcall D3DX10CreateEffectPoolFromResourceW(long wstr wstr ptr ptr str long long ptr ptr ptr ptr ptr) d3dx10_43.D3DX10CreateEffectPoolFromResourceW +@ stdcall D3DX10CreateFontA(ptr long long long long long long long long long str ptr) d3dx10_43.D3DX10CreateFontA +@ stdcall D3DX10CreateFontIndirectA(ptr ptr ptr) d3dx10_43.D3DX10CreateFontIndirectA +@ stdcall D3DX10CreateFontIndirectW(ptr ptr ptr) d3dx10_43.D3DX10CreateFontIndirectW +@ stdcall D3DX10CreateFontW(ptr long long long long long long long long long wstr ptr) d3dx10_43.D3DX10CreateFontW +@ stdcall D3DX10CreateMesh(ptr ptr long str long long long ptr) d3dx10_43.D3DX10CreateMesh +@ stdcall D3DX10CreateShaderResourceViewFromFileA(ptr str ptr ptr ptr ptr) d3dx10_43.D3DX10CreateShaderResourceViewFromFileA +@ stdcall D3DX10CreateShaderResourceViewFromFileW(ptr wstr ptr ptr ptr ptr) d3dx10_43.D3DX10CreateShaderResourceViewFromFileW +@ stdcall D3DX10CreateShaderResourceViewFromMemory(ptr ptr long ptr ptr ptr ptr) d3dx10_43.D3DX10CreateShaderResourceViewFromMemory +@ stdcall D3DX10CreateShaderResourceViewFromResourceA(ptr long str ptr ptr ptr ptr) d3dx10_43.D3DX10CreateShaderResourceViewFromResourceA +@ stdcall D3DX10CreateShaderResourceViewFromResourceW(ptr long wstr ptr ptr ptr ptr) d3dx10_43.D3DX10CreateShaderResourceViewFromResourceW +@ stdcall D3DX10CreateSkinInfo(ptr) d3dx10_43.D3DX10CreateSkinInfo +@ stdcall D3DX10CreateSprite(ptr long ptr) d3dx10_43.D3DX10CreateSprite +@ stdcall D3DX10CreateTextureFromFileA(ptr str ptr ptr ptr ptr) d3dx10_43.D3DX10CreateTextureFromFileA +@ stdcall D3DX10CreateTextureFromFileW(ptr wstr ptr ptr ptr ptr) d3dx10_43.D3DX10CreateTextureFromFileW +@ stdcall D3DX10CreateTextureFromMemory(ptr ptr long ptr ptr ptr ptr) d3dx10_43.D3DX10CreateTextureFromMemory +@ stdcall D3DX10CreateTextureFromResourceA(ptr long str ptr ptr ptr ptr) d3dx10_43.D3DX10CreateTextureFromResourceA +@ stdcall D3DX10CreateTextureFromResourceW(ptr long wstr ptr ptr ptr ptr) d3dx10_43.D3DX10CreateTextureFromResourceW +@ stub D3DX10DisassembleEffect +@ stub D3DX10DisassembleShader +@ stdcall D3DX10FilterTexture(ptr long long) d3dx10_43.D3DX10FilterTexture +@ stdcall D3DX10GetFeatureLevel1(ptr ptr) d3dx10_43.D3DX10GetFeatureLevel1 +@ stdcall D3DX10GetImageInfoFromFileA(str ptr ptr ptr) d3dx10_43.D3DX10GetImageInfoFromFileA +@ stdcall D3DX10GetImageInfoFromFileW(wstr ptr ptr ptr) d3dx10_43.D3DX10GetImageInfoFromFileW +@ stdcall D3DX10GetImageInfoFromMemory(ptr long ptr ptr ptr) d3dx10_43.D3DX10GetImageInfoFromMemory +@ stdcall D3DX10GetImageInfoFromResourceA(long str ptr ptr ptr) d3dx10_43.D3DX10GetImageInfoFromResourceA +@ stdcall D3DX10GetImageInfoFromResourceW(long wstr ptr ptr ptr) d3dx10_43.D3DX10GetImageInfoFromResourceW +@ stdcall D3DX10LoadTextureFromTexture(ptr ptr ptr) d3dx10_43.D3DX10LoadTextureFromTexture +@ stdcall D3DX10PreprocessShaderFromFileA(str ptr ptr ptr ptr ptr) d3dx10_43.D3DX10PreprocessShaderFromFileA +@ stdcall D3DX10PreprocessShaderFromFileW(wstr ptr ptr ptr ptr ptr) d3dx10_43.D3DX10PreprocessShaderFromFileW +@ stdcall D3DX10PreprocessShaderFromMemory(str long str ptr ptr ptr ptr ptr) d3dx10_43.D3DX10PreprocessShaderFromMemory +@ stdcall D3DX10PreprocessShaderFromResourceA(long str str ptr ptr ptr ptr ptr) d3dx10_43.D3DX10PreprocessShaderFromResourceA +@ stdcall D3DX10PreprocessShaderFromResourceW(long wstr wstr ptr ptr ptr ptr ptr) d3dx10_43.D3DX10PreprocessShaderFromResourceW +@ stub D3DX10ReflectShader +@ stdcall D3DX10SHProjectCubeMap(long ptr ptr ptr ptr) d3dx10_43.D3DX10SHProjectCubeMap +@ stdcall D3DX10SaveTextureToFileA(ptr ptr str) d3dx10_43.D3DX10SaveTextureToFileA +@ stdcall D3DX10SaveTextureToFileW(ptr ptr wstr) d3dx10_43.D3DX10SaveTextureToFileW +@ stdcall D3DX10SaveTextureToMemory(ptr ptr ptr long) d3dx10_43.D3DX10SaveTextureToMemory +@ stdcall D3DX10UnsetAllDeviceObjects(ptr) d3dx10_43.D3DX10UnsetAllDeviceObjects +@ stdcall D3DXBoxBoundProbe(ptr ptr ptr ptr) d3dx10_43.D3DXBoxBoundProbe +@ stdcall D3DXColorAdjustContrast(ptr ptr long) d3dx10_43.3DXColorAdjustContrast +@ stdcall D3DXColorAdjustSaturation(ptr ptr long) d3dx10_43.D3DXColorAdjustSaturation +@ stdcall D3DXComputeBoundingBox(ptr long long ptr ptr) d3dx10_43.D3DXComputeBoundingBox +@ stdcall D3DXComputeBoundingSphere(ptr long long ptr ptr) d3dx10_43.D3DXComputeBoundingSphere +@ stdcall D3DXCpuOptimizations(long) d3dx10_43.D3DXCpuOptimizations +@ stdcall D3DXCreateMatrixStack(long ptr) d3dx10_43.D3DXCreateMatrixStack +@ stdcall D3DXFloat16To32Array(ptr ptr long) d3dx10_43.D3DXFloat16To32Array +@ stdcall D3DXFloat32To16Array(ptr ptr long) d3dx10_43.D3DXFloat32To16Array +@ stdcall D3DXFresnelTerm(long long) d3dx10_43.D3DXFresnelTerm +@ stdcall D3DXIntersectTri(ptr ptr ptr ptr ptr ptr ptr ptr) d3dx10_43.D3DXIntersectTri +@ stdcall D3DXMatrixAffineTransformation2D(ptr long ptr long ptr) d3dx10_43.D3DXMatrixAffineTransformation2D +@ stdcall D3DXMatrixAffineTransformation(ptr long ptr ptr ptr) d3dx10_43.D3DXMatrixAffineTransformation +@ stdcall D3DXMatrixDecompose(ptr ptr ptr ptr) d3dx10_43.D3DXMatrixDecompose +@ stdcall D3DXMatrixDeterminant(ptr) d3dx10_43.D3DXMatrixDeterminant +@ stdcall D3DXMatrixInverse(ptr ptr ptr) d3dx10_43.D3DXMatrixInverse +@ stdcall D3DXMatrixLookAtLH(ptr ptr ptr ptr) d3dx10_43.D3DXMatrixLookAtLH +@ stdcall D3DXMatrixLookAtRH(ptr ptr ptr ptr) d3dx10_43.D3DXMatrixLookAtRH +@ stdcall D3DXMatrixMultiply(ptr ptr ptr) d3dx10_43.D3DXMatrixMultiply +@ stdcall D3DXMatrixMultiplyTranspose(ptr ptr ptr) d3dx10_43.D3DXMatrixMultiplyTranspose +@ stdcall D3DXMatrixOrthoLH(ptr long long long long) d3dx10_43.D3DXMatrixOrthoLH +@ stdcall D3DXMatrixOrthoOffCenterLH(ptr long long long long long long) d3dx10_43.D3DXMatrixOrthoOffCenterLH +@ stdcall D3DXMatrixOrthoOffCenterRH(ptr long long long long long long) d3dx10_43.D3DXMatrixOrthoOffCenterRH +@ stdcall D3DXMatrixOrthoRH(ptr long long long long) d3dx10_43.D3DXMatrixOrthoRH +@ stdcall D3DXMatrixPerspectiveFovLH(ptr long long long long) d3dx10_43.D3DXMatrixPerspectiveFovLH +@ stdcall D3DXMatrixPerspectiveFovRH(ptr long long long long) d3dx10_43.D3DXMatrixPerspectiveFovRH +@ stdcall D3DXMatrixPerspectiveLH(ptr long long long long) d3dx10_43.D3DXMatrixPerspectiveLH +@ stdcall D3DXMatrixPerspectiveOffCenterLH(ptr long long long long long long) d3dx10_43.D3DXMatrixPerspectiveOffCenterLH +@ stdcall D3DXMatrixPerspectiveOffCenterRH(ptr long long long long long long) d3dx10_43.D3DXMatrixPerspectiveOffCenterRH +@ stdcall D3DXMatrixPerspectiveRH(ptr long long long long) d3dx10_43.D3DXMatrixPerspectiveRH +@ stdcall D3DXMatrixReflect(ptr ptr) d3dx10_43.D3DXMatrixReflect +@ stdcall D3DXMatrixRotationAxis(ptr ptr long) d3dx10_43.D3DXMatrixRotationAxis +@ stdcall D3DXMatrixRotationQuaternion(ptr ptr) d3dx10_43.D3DXMatrixRotationQuaternion +@ stdcall D3DXMatrixRotationX(ptr long) d3dx10_43.D3DXMatrixRotationX +@ stdcall D3DXMatrixRotationY(ptr long) d3dx10_43.D3DXMatrixRotationY +@ stdcall D3DXMatrixRotationYawPitchRoll(ptr long long long) d3dx10_43.D3DXMatrixRotationYawPitchRoll +@ stdcall D3DXMatrixRotationZ(ptr long) d3dx10_43.D3DXMatrixRotationZ +@ stdcall D3DXMatrixScaling(ptr long long long) d3dx10_43.D3DXMatrixScaling +@ stdcall D3DXMatrixShadow(ptr ptr ptr) d3dx10_43.D3DXMatrixShadow +@ stdcall D3DXMatrixTransformation2D(ptr ptr long ptr ptr long ptr) d3dx10_43.D3DXMatrixTransformation2D +@ stdcall D3DXMatrixTransformation(ptr ptr ptr ptr ptr ptr ptr) d3dx10_43.D3DXMatrixTransformation +@ stdcall D3DXMatrixTranslation(ptr long long long) d3dx10_43.D3DXMatrixTranslation +@ stdcall D3DXMatrixTranspose(ptr ptr) d3dx10_43.D3DXMatrixTranspose +@ stdcall D3DXPlaneFromPointNormal(ptr ptr ptr) d3dx10_43.D3DXPlaneFromPointNormal +@ stdcall D3DXPlaneFromPoints(ptr ptr ptr ptr) d3dx10_43.D3DXPlaneFromPoints +@ stdcall D3DXPlaneIntersectLine(ptr ptr ptr ptr) d3dx10_43.D3DXPlaneIntersectLine +@ stdcall D3DXPlaneNormalize(ptr ptr) d3dx10_43.D3DXPlaneNormalize +@ stdcall D3DXPlaneTransform(ptr ptr ptr) d3dx10_43.D3DXPlaneTransform +@ stdcall D3DXPlaneTransformArray(ptr long ptr long ptr long) d3dx10_43.D3DXPlaneTransformArray +@ stdcall D3DXQuaternionBaryCentric(ptr ptr ptr ptr long long) d3dx10_43.D3DXQuaternionBaryCentric +@ stdcall D3DXQuaternionExp(ptr ptr) d3dx10_43.D3DXQuaternionExp +@ stdcall D3DXQuaternionInverse(ptr ptr) d3dx10_43.D3DXQuaternionInverse +@ stdcall D3DXQuaternionLn(ptr ptr) d3dx10_43.D3DXQuaternionLn +@ stdcall D3DXQuaternionMultiply(ptr ptr ptr) d3dx10_43.D3DXQuaternionMultiply +@ stdcall D3DXQuaternionNormalize(ptr ptr) d3dx10_43.D3DXQuaternionNormalize +@ stdcall D3DXQuaternionRotationAxis(ptr ptr long) d3dx10_43.D3DXQuaternionRotationAxis +@ stdcall D3DXQuaternionRotationMatrix(ptr ptr) d3dx10_43.D3DXQuaternionRotationMatrix +@ stdcall D3DXQuaternionRotationYawPitchRoll(ptr long long long) d3dx10_43.D3DXQuaternionRotationYawPitchRoll +@ stdcall D3DXQuaternionSlerp(ptr ptr ptr long) d3dx10_43.D3DXQuaternionSlerp +@ stdcall D3DXQuaternionSquad(ptr ptr ptr ptr ptr long) d3dx10_43.D3DXQuaternionSquad +@ stdcall D3DXQuaternionSquadSetup(ptr ptr ptr ptr ptr ptr ptr) d3dx10_43.D3DXQuaternionSquadSetup +@ stdcall D3DXQuaternionToAxisAngle(ptr ptr ptr) d3dx10_43.D3DXQuaternionToAxisAngle +@ stdcall D3DXSHAdd(ptr long ptr ptr) d3dx10_43.D3DXSHAdd +@ stdcall D3DXSHDot(long ptr ptr) d3dx10_43.D3DXSHDot +@ stdcall D3DXSHEvalConeLight(long ptr long long long long ptr ptr ptr) d3dx10_43.D3DXSHEvalConeLight +@ stdcall D3DXSHEvalDirection(ptr long ptr) d3dx10_43.D3DXSHEvalDirection +@ stdcall D3DXSHEvalDirectionalLight(long ptr long long long long ptr ptr ptr) d3dx10_43.D3DXSHEvalDirectionalLight +@ stdcall D3DXSHEvalHemisphereLight(long ptr long long ptr ptr ptr) d3dx10_43.D3DXSHEvalHemisphereLight +@ stdcall D3DXSHEvalSphericalLight(long ptr long long long long ptr ptr ptr) d3dx10_43.D3DXSHEvalSphericalLight +@ stdcall D3DXSHMultiply2(ptr ptr ptr) d3dx10_43.D3DXSHMultiply2 +@ stdcall D3DXSHMultiply3(ptr ptr ptr) d3dx10_43.D3DXSHMultiply3 +@ stdcall D3DXSHMultiply4(ptr ptr ptr) d3dx10_43.D3DXSHMultiply4 +@ stdcall D3DXSHMultiply5(ptr ptr ptr) d3dx10_43.D3DXSHMultiply5 +@ stdcall D3DXSHMultiply6(ptr ptr ptr) d3dx10_43.D3DXSHMultiply6 +@ stdcall D3DXSHRotate(ptr long ptr ptr) d3dx10_43.D3DXSHRotate +@ stdcall D3DXSHRotateZ(ptr long long ptr) d3dx10_43.D3DXSHRotateZ +@ stdcall D3DXSHScale(ptr long ptr ptr) d3dx10_43.D3DXSHScale +@ stdcall D3DXSphereBoundProbe(ptr long ptr ptr) d3dx10_43.D3DXSphereBoundProbe +@ stdcall D3DXVec2BaryCentric(ptr ptr ptr ptr long long) d3dx10_43.D3DXVec2BaryCentric +@ stdcall D3DXVec2CatmullRom(ptr ptr ptr ptr ptr long) d3dx10_43.D3DXVec2CatmullRom +@ stdcall D3DXVec2Hermite(ptr ptr ptr ptr ptr long) d3dx10_43.D3DXVec2Hermite +@ stdcall D3DXVec2Normalize(ptr ptr) d3dx10_43.D3DXVec2Normalize +@ stdcall D3DXVec2Transform(ptr ptr ptr) d3dx10_43.D3DXVec2Transform +@ stdcall D3DXVec2TransformArray(ptr long ptr long ptr long) d3dx10_43.D3DXVec2TransformArray +@ stdcall D3DXVec2TransformCoord(ptr ptr ptr) d3dx10_43.D3DXVec2TransformCoord +@ stdcall D3DXVec2TransformCoordArray(ptr long ptr long ptr long) d3dx10_43.D3DXVec2TransformCoordArray +@ stdcall D3DXVec2TransformNormal(ptr ptr ptr) d3dx10_43.D3DXVec2TransformNormal +@ stdcall D3DXVec2TransformNormalArray(ptr long ptr long ptr long) d3dx10_43.D3DXVec2TransformNormalArray +@ stdcall D3DXVec3BaryCentric(ptr ptr ptr ptr long long) d3dx10_43.D3DXVec3BaryCentric +@ stdcall D3DXVec3CatmullRom(ptr ptr ptr ptr ptr long) d3dx10_43.D3DXVec3CatmullRom +@ stdcall D3DXVec3Hermite(ptr ptr ptr ptr ptr long) d3dx10_43.D3DXVec3Hermite +@ stdcall D3DXVec3Normalize(ptr ptr) d3dx10_43.D3DXVec3Normalize +@ stdcall D3DXVec3Project(ptr ptr ptr ptr ptr ptr) d3dx10_43.D3DXVec3Project +@ stdcall D3DXVec3ProjectArray(ptr long ptr long ptr ptr ptr ptr long) d3dx10_43.D3DXVec3ProjectArray +@ stdcall D3DXVec3Transform(ptr ptr ptr) d3dx10_43.D3DXVec3Transform +@ stdcall D3DXVec3TransformArray(ptr long ptr long ptr long) d3dx10_43.D3DXVec3TransformArray +@ stdcall D3DXVec3TransformCoord(ptr ptr ptr) d3dx10_43.D3DXVec3TransformCoord +@ stdcall D3DXVec3TransformCoordArray(ptr long ptr long ptr long) d3dx10_43.D3DXVec3TransformCoordArray +@ stdcall D3DXVec3TransformNormal(ptr ptr ptr) d3dx10_43.D3DXVec3TransformNormal +@ stdcall D3DXVec3TransformNormalArray(ptr long ptr long ptr long) d3dx10_43.D3DXVec3TransformNormalArray +@ stdcall D3DXVec3Unproject(ptr ptr ptr ptr ptr ptr) d3dx10_43.D3DXVec3Unproject +@ stdcall D3DXVec3UnprojectArray(ptr long ptr long ptr ptr ptr ptr long) d3dx10_43.D3DXVec3UnprojectArray +@ stdcall D3DXVec4BaryCentric(ptr ptr ptr ptr long long) d3dx10_43.D3DXVec4BaryCentric +@ stdcall D3DXVec4CatmullRom(ptr ptr ptr ptr ptr long) d3dx10_43.D3DXVec4CatmullRom +@ stdcall D3DXVec4Cross(ptr ptr ptr ptr) d3dx10_43.D3DXVec4Cross +@ stdcall D3DXVec4Hermite(ptr ptr ptr ptr ptr long) d3dx10_43.D3DXVec4Hermite +@ stdcall D3DXVec4Normalize(ptr ptr) d3dx10_43.D3DXVec4Normalize +@ stdcall D3DXVec4Transform(ptr ptr ptr) d3dx10_43.D3DXVec4Transform +@ stdcall D3DXVec4TransformArray(ptr long ptr long ptr long) d3dx10_43.D3DXVec4TransformArray diff -Nru wine1.3-1.3.0/dlls/d3dx10_39/Makefile.in wine1.3-1.3.1/dlls/d3dx10_39/Makefile.in --- wine1.3-1.3.0/dlls/d3dx10_39/Makefile.in 1970-01-01 01:00:00.000000000 +0100 +++ wine1.3-1.3.1/dlls/d3dx10_39/Makefile.in 2010-08-20 18:23:50.000000000 +0100 @@ -0,0 +1,12 @@ +TOPSRCDIR = @top_srcdir@ +TOPOBJDIR = ../.. +SRCDIR = @srcdir@ +VPATH = @srcdir@ +MODULE = d3dx10_39.dll + +C_SRCS = \ + d3dx10_39_main.c + +RC_SRCS = version.rc + +@MAKE_DLL_RULES@ diff -Nru wine1.3-1.3.0/dlls/d3dx10_39/version.rc wine1.3-1.3.1/dlls/d3dx10_39/version.rc --- wine1.3-1.3.0/dlls/d3dx10_39/version.rc 1970-01-01 01:00:00.000000000 +0100 +++ wine1.3-1.3.1/dlls/d3dx10_39/version.rc 2010-08-20 18:23:50.000000000 +0100 @@ -0,0 +1,26 @@ +/* + * Copyright 2010 Owen Rudge for 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 + */ + +#define WINE_FILEDESCRIPTION_STR "Wine D3DX10" +#define WINE_FILENAME_STR "d3dx10_39.dll" +#define WINE_FILEVERSION 9,24,949,2307 +#define WINE_FILEVERSION_STR "9.24.949.2307" +#define WINE_PRODUCTVERSION 9,24,949,2307 +#define WINE_PRODUCTVERSION_STR "9.24.949.2307" + +#include "wine/wine_common_ver.rc" diff -Nru wine1.3-1.3.0/dlls/d3dx10_40/d3dx10_40_main.c wine1.3-1.3.1/dlls/d3dx10_40/d3dx10_40_main.c --- wine1.3-1.3.0/dlls/d3dx10_40/d3dx10_40_main.c 1970-01-01 01:00:00.000000000 +0100 +++ wine1.3-1.3.1/dlls/d3dx10_40/d3dx10_40_main.c 2010-08-20 18:23:50.000000000 +0100 @@ -0,0 +1,63 @@ +/* + * D3DX10 main file + * + * Copyright (c) 2010 Owen Rudge for 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 "wine/port.h" + +#include + +#define COBJMACROS + +#include "windef.h" +#include "winbase.h" +#include "winuser.h" +#include "objbase.h" + +#include "d3d10.h" + +BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved) +{ + switch (fdwReason) + { + case DLL_WINE_PREATTACH: + return FALSE; /* prefer native version */ + case DLL_PROCESS_ATTACH: + DisableThreadLibraryCalls(hinstDLL); + break; + case DLL_PROCESS_DETACH: + break; + } + + return TRUE; +} + +/*********************************************************************** + * D3DX10CheckVersion + * + * Checks whether we are compiling against the correct d3d and d3dx library. + */ +BOOL WINAPI D3DX10CheckVersion(UINT d3dsdkvers, UINT d3dxsdkvers) +{ + if ((d3dsdkvers == D3D10_SDK_VERSION) && (d3dxsdkvers == 40)) + return TRUE; + + return FALSE; +} diff -Nru wine1.3-1.3.0/dlls/d3dx10_40/d3dx10_40.spec wine1.3-1.3.1/dlls/d3dx10_40/d3dx10_40.spec --- wine1.3-1.3.0/dlls/d3dx10_40/d3dx10_40.spec 1970-01-01 01:00:00.000000000 +0100 +++ wine1.3-1.3.1/dlls/d3dx10_40/d3dx10_40.spec 2010-08-20 18:23:50.000000000 +0100 @@ -0,0 +1,176 @@ +@ stdcall D3DX10CreateThreadPump(long long ptr) d3dx10_43.D3DX10CreateThreadPump +@ stdcall D3DX10CheckVersion(long long) +@ stdcall D3DX10CompileFromFileA(str ptr ptr str str long long ptr ptr ptr ptr) d3dx10_43.D3DX10CompileFromFileA +@ stdcall D3DX10CompileFromFileW(wstr ptr ptr str str long long ptr ptr ptr ptr) d3dx10_43.D3DX10CompileFromFileW +@ stdcall D3DX10CompileFromMemory(str long str ptr ptr str str long long ptr ptr ptr ptr) d3dx10_43.D3DX10CompileFromMemory +@ stdcall D3DX10CompileFromResourceA(long str str ptr ptr str str long long ptr ptr ptr ptr) d3dx10_43.D3DX10CompileFromResourceA +@ stdcall D3DX10CompileFromResourceW(long wstr wstr ptr ptr str str long long ptr ptr ptr ptr) d3dx10_43.D3DX10CompileFromResourceW +@ stdcall D3DX10ComputeNormalMap(ptr long long long ptr) d3dx10_43.D3DX10ComputeNormalMap +@ stdcall D3DX10CreateAsyncCompilerProcessor(str ptr ptr str str long long ptr ptr ptr) d3dx10_43.D3DX10CreateAsyncCompilerProcessor +@ stdcall D3DX10CreateAsyncEffectCreateProcessor(str ptr ptr str long long ptr ptr ptr ptr) d3dx10_43.D3DX10CreateAsyncEffectCreateProcessor +@ stdcall D3DX10CreateAsyncEffectPoolCreateProcessor(str ptr ptr str long long ptr ptr ptr) d3dx10_43.D3DX10CreateAsyncEffectPoolCreateProcessor +@ stdcall D3DX10CreateAsyncFileLoaderA(str ptr) d3dx10_43.D3DX10CreateAsyncFileLoaderA +@ stdcall D3DX10CreateAsyncFileLoaderW(wstr ptr) d3dx10_43.D3DX10CreateAsyncFileLoaderW +@ stdcall D3DX10CreateAsyncMemoryLoader(ptr long ptr) d3dx10_43.D3DX10CreateAsyncMemoryLoader +@ stdcall D3DX10CreateAsyncResourceLoaderA(long str ptr) d3dx10_43.D3DX10CreateAsyncResourceLoaderA +@ stdcall D3DX10CreateAsyncResourceLoaderW(long wstr ptr) d3dx10_43.D3DX10CreateAsyncResourceLoaderW +@ stdcall D3DX10CreateAsyncShaderPreprocessProcessor(str ptr ptr ptr ptr ptr) d3dx10_43.D3DX10CreateAsyncShaderPreprocessProcessor +@ stdcall D3DX10CreateAsyncShaderResourceViewProcessor(ptr ptr ptr) d3dx10_43.D3DX10CreateAsyncShaderResourceViewProcessor +@ stdcall D3DX10CreateAsyncTextureInfoProcessor(ptr ptr) d3dx10_43.D3DX10CreateAsyncTextureInfoProcessor +@ stdcall D3DX10CreateAsyncTextureProcessor(ptr ptr ptr) d3dx10_43.D3DX10CreateAsyncTextureProcessor +@ stdcall D3DX10CreateDevice(ptr long long long ptr) d3dx10_43.D3DX10CreateDevice +@ stdcall D3DX10CreateDeviceAndSwapChain(ptr long long long ptr ptr ptr) d3dx10_43.D3DX10CreateDeviceAndSwapChain +@ stdcall D3DX10CreateEffectFromFileA(str ptr ptr str long long ptr ptr ptr ptr ptr ptr) d3dx10_43.D3DX10CreateEffectFromFileA +@ stdcall D3DX10CreateEffectFromFileW(wstr ptr ptr str long long ptr ptr ptr ptr ptr ptr) d3dx10_43.D3DX10CreateEffectFromFileW +@ stdcall D3DX10CreateEffectFromMemory(ptr long str ptr ptr str long long ptr ptr ptr ptr ptr ptr) d3dx10_43.D3DX10CreateEffectFromMemory +@ stdcall D3DX10CreateEffectFromResourceA(long str str ptr ptr str long long ptr ptr ptr ptr ptr ptr) d3dx10_43.D3DX10CreateEffectFromResourceA +@ stdcall D3DX10CreateEffectFromResourceW(long wstr wstr ptr ptr str long long ptr ptr ptr ptr ptr ptr) d3dx10_43.D3DX10CreateEffectFromResourceW +@ stdcall D3DX10CreateEffectPoolFromFileA(str ptr ptr str long long ptr ptr ptr ptr ptr) d3dx10_43.D3DX10CreateEffectPoolFromFileA +@ stdcall D3DX10CreateEffectPoolFromFileW(wstr ptr ptr str long long ptr ptr ptr ptr ptr) d3dx10_43.D3DX10CreateEffectPoolFromFileW +@ stdcall D3DX10CreateEffectPoolFromMemory(ptr long str ptr ptr str long long ptr ptr ptr ptr ptr) d3dx10_43.D3DX10CreateEffectPoolFromMemory +@ stdcall D3DX10CreateEffectPoolFromResourceA(long str str ptr ptr str long long ptr ptr ptr ptr ptr) d3dx10_43.D3DX10CreateEffectPoolFromResourceA +@ stdcall D3DX10CreateEffectPoolFromResourceW(long wstr wstr ptr ptr str long long ptr ptr ptr ptr ptr) d3dx10_43.D3DX10CreateEffectPoolFromResourceW +@ stdcall D3DX10CreateFontA(ptr long long long long long long long long long str ptr) d3dx10_43.D3DX10CreateFontA +@ stdcall D3DX10CreateFontIndirectA(ptr ptr ptr) d3dx10_43.D3DX10CreateFontIndirectA +@ stdcall D3DX10CreateFontIndirectW(ptr ptr ptr) d3dx10_43.D3DX10CreateFontIndirectW +@ stdcall D3DX10CreateFontW(ptr long long long long long long long long long wstr ptr) d3dx10_43.D3DX10CreateFontW +@ stdcall D3DX10CreateMesh(ptr ptr long str long long long ptr) d3dx10_43.D3DX10CreateMesh +@ stdcall D3DX10CreateShaderResourceViewFromFileA(ptr str ptr ptr ptr ptr) d3dx10_43.D3DX10CreateShaderResourceViewFromFileA +@ stdcall D3DX10CreateShaderResourceViewFromFileW(ptr wstr ptr ptr ptr ptr) d3dx10_43.D3DX10CreateShaderResourceViewFromFileW +@ stdcall D3DX10CreateShaderResourceViewFromMemory(ptr ptr long ptr ptr ptr ptr) d3dx10_43.D3DX10CreateShaderResourceViewFromMemory +@ stdcall D3DX10CreateShaderResourceViewFromResourceA(ptr long str ptr ptr ptr ptr) d3dx10_43.D3DX10CreateShaderResourceViewFromResourceA +@ stdcall D3DX10CreateShaderResourceViewFromResourceW(ptr long wstr ptr ptr ptr ptr) d3dx10_43.D3DX10CreateShaderResourceViewFromResourceW +@ stdcall D3DX10CreateSkinInfo(ptr) d3dx10_43.D3DX10CreateSkinInfo +@ stdcall D3DX10CreateSprite(ptr long ptr) d3dx10_43.D3DX10CreateSprite +@ stdcall D3DX10CreateTextureFromFileA(ptr str ptr ptr ptr ptr) d3dx10_43.D3DX10CreateTextureFromFileA +@ stdcall D3DX10CreateTextureFromFileW(ptr wstr ptr ptr ptr ptr) d3dx10_43.D3DX10CreateTextureFromFileW +@ stdcall D3DX10CreateTextureFromMemory(ptr ptr long ptr ptr ptr ptr) d3dx10_43.D3DX10CreateTextureFromMemory +@ stdcall D3DX10CreateTextureFromResourceA(ptr long str ptr ptr ptr ptr) d3dx10_43.D3DX10CreateTextureFromResourceA +@ stdcall D3DX10CreateTextureFromResourceW(ptr long wstr ptr ptr ptr ptr) d3dx10_43.D3DX10CreateTextureFromResourceW +@ stdcall D3DX10FilterTexture(ptr long long) d3dx10_43.D3DX10FilterTexture +@ stdcall D3DX10GetFeatureLevel1(ptr ptr) d3dx10_43.D3DX10GetFeatureLevel1 +@ stdcall D3DX10GetImageInfoFromFileA(str ptr ptr ptr) d3dx10_43.D3DX10GetImageInfoFromFileA +@ stdcall D3DX10GetImageInfoFromFileW(wstr ptr ptr ptr) d3dx10_43.D3DX10GetImageInfoFromFileW +@ stdcall D3DX10GetImageInfoFromMemory(ptr long ptr ptr ptr) d3dx10_43.D3DX10GetImageInfoFromMemory +@ stdcall D3DX10GetImageInfoFromResourceA(long str ptr ptr ptr) d3dx10_43.D3DX10GetImageInfoFromResourceA +@ stdcall D3DX10GetImageInfoFromResourceW(long wstr ptr ptr ptr) d3dx10_43.D3DX10GetImageInfoFromResourceW +@ stdcall D3DX10LoadTextureFromTexture(ptr ptr ptr) d3dx10_43.D3DX10LoadTextureFromTexture +@ stdcall D3DX10PreprocessShaderFromFileA(str ptr ptr ptr ptr ptr) d3dx10_43.D3DX10PreprocessShaderFromFileA +@ stdcall D3DX10PreprocessShaderFromFileW(wstr ptr ptr ptr ptr ptr) d3dx10_43.D3DX10PreprocessShaderFromFileW +@ stdcall D3DX10PreprocessShaderFromMemory(str long str ptr ptr ptr ptr ptr) d3dx10_43.D3DX10PreprocessShaderFromMemory +@ stdcall D3DX10PreprocessShaderFromResourceA(long str str ptr ptr ptr ptr ptr) d3dx10_43.D3DX10PreprocessShaderFromResourceA +@ stdcall D3DX10PreprocessShaderFromResourceW(long wstr wstr ptr ptr ptr ptr ptr) d3dx10_43.D3DX10PreprocessShaderFromResourceW +@ stdcall D3DX10SHProjectCubeMap(long ptr ptr ptr ptr) d3dx10_43.D3DX10SHProjectCubeMap +@ stdcall D3DX10SaveTextureToFileA(ptr ptr str) d3dx10_43.D3DX10SaveTextureToFileA +@ stdcall D3DX10SaveTextureToFileW(ptr ptr wstr) d3dx10_43.D3DX10SaveTextureToFileW +@ stdcall D3DX10SaveTextureToMemory(ptr ptr ptr long) d3dx10_43.D3DX10SaveTextureToMemory +@ stdcall D3DX10UnsetAllDeviceObjects(ptr) d3dx10_43.D3DX10UnsetAllDeviceObjects +@ stdcall D3DXBoxBoundProbe(ptr ptr ptr ptr) d3dx10_43.D3DXBoxBoundProbe +@ stdcall D3DXColorAdjustContrast(ptr ptr long) d3dx10_43.3DXColorAdjustContrast +@ stdcall D3DXColorAdjustSaturation(ptr ptr long) d3dx10_43.D3DXColorAdjustSaturation +@ stdcall D3DXComputeBoundingBox(ptr long long ptr ptr) d3dx10_43.D3DXComputeBoundingBox +@ stdcall D3DXComputeBoundingSphere(ptr long long ptr ptr) d3dx10_43.D3DXComputeBoundingSphere +@ stdcall D3DXCpuOptimizations(long) d3dx10_43.D3DXCpuOptimizations +@ stdcall D3DXCreateMatrixStack(long ptr) d3dx10_43.D3DXCreateMatrixStack +@ stdcall D3DXFloat16To32Array(ptr ptr long) d3dx10_43.D3DXFloat16To32Array +@ stdcall D3DXFloat32To16Array(ptr ptr long) d3dx10_43.D3DXFloat32To16Array +@ stdcall D3DXFresnelTerm(long long) d3dx10_43.D3DXFresnelTerm +@ stdcall D3DXIntersectTri(ptr ptr ptr ptr ptr ptr ptr ptr) d3dx10_43.D3DXIntersectTri +@ stdcall D3DXMatrixAffineTransformation2D(ptr long ptr long ptr) d3dx10_43.D3DXMatrixAffineTransformation2D +@ stdcall D3DXMatrixAffineTransformation(ptr long ptr ptr ptr) d3dx10_43.D3DXMatrixAffineTransformation +@ stdcall D3DXMatrixDecompose(ptr ptr ptr ptr) d3dx10_43.D3DXMatrixDecompose +@ stdcall D3DXMatrixDeterminant(ptr) d3dx10_43.D3DXMatrixDeterminant +@ stdcall D3DXMatrixInverse(ptr ptr ptr) d3dx10_43.D3DXMatrixInverse +@ stdcall D3DXMatrixLookAtLH(ptr ptr ptr ptr) d3dx10_43.D3DXMatrixLookAtLH +@ stdcall D3DXMatrixLookAtRH(ptr ptr ptr ptr) d3dx10_43.D3DXMatrixLookAtRH +@ stdcall D3DXMatrixMultiply(ptr ptr ptr) d3dx10_43.D3DXMatrixMultiply +@ stdcall D3DXMatrixMultiplyTranspose(ptr ptr ptr) d3dx10_43.D3DXMatrixMultiplyTranspose +@ stdcall D3DXMatrixOrthoLH(ptr long long long long) d3dx10_43.D3DXMatrixOrthoLH +@ stdcall D3DXMatrixOrthoOffCenterLH(ptr long long long long long long) d3dx10_43.D3DXMatrixOrthoOffCenterLH +@ stdcall D3DXMatrixOrthoOffCenterRH(ptr long long long long long long) d3dx10_43.D3DXMatrixOrthoOffCenterRH +@ stdcall D3DXMatrixOrthoRH(ptr long long long long) d3dx10_43.D3DXMatrixOrthoRH +@ stdcall D3DXMatrixPerspectiveFovLH(ptr long long long long) d3dx10_43.D3DXMatrixPerspectiveFovLH +@ stdcall D3DXMatrixPerspectiveFovRH(ptr long long long long) d3dx10_43.D3DXMatrixPerspectiveFovRH +@ stdcall D3DXMatrixPerspectiveLH(ptr long long long long) d3dx10_43.D3DXMatrixPerspectiveLH +@ stdcall D3DXMatrixPerspectiveOffCenterLH(ptr long long long long long long) d3dx10_43.D3DXMatrixPerspectiveOffCenterLH +@ stdcall D3DXMatrixPerspectiveOffCenterRH(ptr long long long long long long) d3dx10_43.D3DXMatrixPerspectiveOffCenterRH +@ stdcall D3DXMatrixPerspectiveRH(ptr long long long long) d3dx10_43.D3DXMatrixPerspectiveRH +@ stdcall D3DXMatrixReflect(ptr ptr) d3dx10_43.D3DXMatrixReflect +@ stdcall D3DXMatrixRotationAxis(ptr ptr long) d3dx10_43.D3DXMatrixRotationAxis +@ stdcall D3DXMatrixRotationQuaternion(ptr ptr) d3dx10_43.D3DXMatrixRotationQuaternion +@ stdcall D3DXMatrixRotationX(ptr long) d3dx10_43.D3DXMatrixRotationX +@ stdcall D3DXMatrixRotationY(ptr long) d3dx10_43.D3DXMatrixRotationY +@ stdcall D3DXMatrixRotationYawPitchRoll(ptr long long long) d3dx10_43.D3DXMatrixRotationYawPitchRoll +@ stdcall D3DXMatrixRotationZ(ptr long) d3dx10_43.D3DXMatrixRotationZ +@ stdcall D3DXMatrixScaling(ptr long long long) d3dx10_43.D3DXMatrixScaling +@ stdcall D3DXMatrixShadow(ptr ptr ptr) d3dx10_43.D3DXMatrixShadow +@ stdcall D3DXMatrixTransformation2D(ptr ptr long ptr ptr long ptr) d3dx10_43.D3DXMatrixTransformation2D +@ stdcall D3DXMatrixTransformation(ptr ptr ptr ptr ptr ptr ptr) d3dx10_43.D3DXMatrixTransformation +@ stdcall D3DXMatrixTranslation(ptr long long long) d3dx10_43.D3DXMatrixTranslation +@ stdcall D3DXMatrixTranspose(ptr ptr) d3dx10_43.D3DXMatrixTranspose +@ stdcall D3DXPlaneFromPointNormal(ptr ptr ptr) d3dx10_43.D3DXPlaneFromPointNormal +@ stdcall D3DXPlaneFromPoints(ptr ptr ptr ptr) d3dx10_43.D3DXPlaneFromPoints +@ stdcall D3DXPlaneIntersectLine(ptr ptr ptr ptr) d3dx10_43.D3DXPlaneIntersectLine +@ stdcall D3DXPlaneNormalize(ptr ptr) d3dx10_43.D3DXPlaneNormalize +@ stdcall D3DXPlaneTransform(ptr ptr ptr) d3dx10_43.D3DXPlaneTransform +@ stdcall D3DXPlaneTransformArray(ptr long ptr long ptr long) d3dx10_43.D3DXPlaneTransformArray +@ stdcall D3DXQuaternionBaryCentric(ptr ptr ptr ptr long long) d3dx10_43.D3DXQuaternionBaryCentric +@ stdcall D3DXQuaternionExp(ptr ptr) d3dx10_43.D3DXQuaternionExp +@ stdcall D3DXQuaternionInverse(ptr ptr) d3dx10_43.D3DXQuaternionInverse +@ stdcall D3DXQuaternionLn(ptr ptr) d3dx10_43.D3DXQuaternionLn +@ stdcall D3DXQuaternionMultiply(ptr ptr ptr) d3dx10_43.D3DXQuaternionMultiply +@ stdcall D3DXQuaternionNormalize(ptr ptr) d3dx10_43.D3DXQuaternionNormalize +@ stdcall D3DXQuaternionRotationAxis(ptr ptr long) d3dx10_43.D3DXQuaternionRotationAxis +@ stdcall D3DXQuaternionRotationMatrix(ptr ptr) d3dx10_43.D3DXQuaternionRotationMatrix +@ stdcall D3DXQuaternionRotationYawPitchRoll(ptr long long long) d3dx10_43.D3DXQuaternionRotationYawPitchRoll +@ stdcall D3DXQuaternionSlerp(ptr ptr ptr long) d3dx10_43.D3DXQuaternionSlerp +@ stdcall D3DXQuaternionSquad(ptr ptr ptr ptr ptr long) d3dx10_43.D3DXQuaternionSquad +@ stdcall D3DXQuaternionSquadSetup(ptr ptr ptr ptr ptr ptr ptr) d3dx10_43.D3DXQuaternionSquadSetup +@ stdcall D3DXQuaternionToAxisAngle(ptr ptr ptr) d3dx10_43.D3DXQuaternionToAxisAngle +@ stdcall D3DXSHAdd(ptr long ptr ptr) d3dx10_43.D3DXSHAdd +@ stdcall D3DXSHDot(long ptr ptr) d3dx10_43.D3DXSHDot +@ stdcall D3DXSHEvalConeLight(long ptr long long long long ptr ptr ptr) d3dx10_43.D3DXSHEvalConeLight +@ stdcall D3DXSHEvalDirection(ptr long ptr) d3dx10_43.D3DXSHEvalDirection +@ stdcall D3DXSHEvalDirectionalLight(long ptr long long long long ptr ptr ptr) d3dx10_43.D3DXSHEvalDirectionalLight +@ stdcall D3DXSHEvalHemisphereLight(long ptr long long ptr ptr ptr) d3dx10_43.D3DXSHEvalHemisphereLight +@ stdcall D3DXSHEvalSphericalLight(long ptr long long long long ptr ptr ptr) d3dx10_43.D3DXSHEvalSphericalLight +@ stdcall D3DXSHMultiply2(ptr ptr ptr) d3dx10_43.D3DXSHMultiply2 +@ stdcall D3DXSHMultiply3(ptr ptr ptr) d3dx10_43.D3DXSHMultiply3 +@ stdcall D3DXSHMultiply4(ptr ptr ptr) d3dx10_43.D3DXSHMultiply4 +@ stdcall D3DXSHMultiply5(ptr ptr ptr) d3dx10_43.D3DXSHMultiply5 +@ stdcall D3DXSHMultiply6(ptr ptr ptr) d3dx10_43.D3DXSHMultiply6 +@ stdcall D3DXSHRotate(ptr long ptr ptr) d3dx10_43.D3DXSHRotate +@ stdcall D3DXSHRotateZ(ptr long long ptr) d3dx10_43.D3DXSHRotateZ +@ stdcall D3DXSHScale(ptr long ptr ptr) d3dx10_43.D3DXSHScale +@ stdcall D3DXSphereBoundProbe(ptr long ptr ptr) d3dx10_43.D3DXSphereBoundProbe +@ stdcall D3DXVec2BaryCentric(ptr ptr ptr ptr long long) d3dx10_43.D3DXVec2BaryCentric +@ stdcall D3DXVec2CatmullRom(ptr ptr ptr ptr ptr long) d3dx10_43.D3DXVec2CatmullRom +@ stdcall D3DXVec2Hermite(ptr ptr ptr ptr ptr long) d3dx10_43.D3DXVec2Hermite +@ stdcall D3DXVec2Normalize(ptr ptr) d3dx10_43.D3DXVec2Normalize +@ stdcall D3DXVec2Transform(ptr ptr ptr) d3dx10_43.D3DXVec2Transform +@ stdcall D3DXVec2TransformArray(ptr long ptr long ptr long) d3dx10_43.D3DXVec2TransformArray +@ stdcall D3DXVec2TransformCoord(ptr ptr ptr) d3dx10_43.D3DXVec2TransformCoord +@ stdcall D3DXVec2TransformCoordArray(ptr long ptr long ptr long) d3dx10_43.D3DXVec2TransformCoordArray +@ stdcall D3DXVec2TransformNormal(ptr ptr ptr) d3dx10_43.D3DXVec2TransformNormal +@ stdcall D3DXVec2TransformNormalArray(ptr long ptr long ptr long) d3dx10_43.D3DXVec2TransformNormalArray +@ stdcall D3DXVec3BaryCentric(ptr ptr ptr ptr long long) d3dx10_43.D3DXVec3BaryCentric +@ stdcall D3DXVec3CatmullRom(ptr ptr ptr ptr ptr long) d3dx10_43.D3DXVec3CatmullRom +@ stdcall D3DXVec3Hermite(ptr ptr ptr ptr ptr long) d3dx10_43.D3DXVec3Hermite +@ stdcall D3DXVec3Normalize(ptr ptr) d3dx10_43.D3DXVec3Normalize +@ stdcall D3DXVec3Project(ptr ptr ptr ptr ptr ptr) d3dx10_43.D3DXVec3Project +@ stdcall D3DXVec3ProjectArray(ptr long ptr long ptr ptr ptr ptr long) d3dx10_43.D3DXVec3ProjectArray +@ stdcall D3DXVec3Transform(ptr ptr ptr) d3dx10_43.D3DXVec3Transform +@ stdcall D3DXVec3TransformArray(ptr long ptr long ptr long) d3dx10_43.D3DXVec3TransformArray +@ stdcall D3DXVec3TransformCoord(ptr ptr ptr) d3dx10_43.D3DXVec3TransformCoord +@ stdcall D3DXVec3TransformCoordArray(ptr long ptr long ptr long) d3dx10_43.D3DXVec3TransformCoordArray +@ stdcall D3DXVec3TransformNormal(ptr ptr ptr) d3dx10_43.D3DXVec3TransformNormal +@ stdcall D3DXVec3TransformNormalArray(ptr long ptr long ptr long) d3dx10_43.D3DXVec3TransformNormalArray +@ stdcall D3DXVec3Unproject(ptr ptr ptr ptr ptr ptr) d3dx10_43.D3DXVec3Unproject +@ stdcall D3DXVec3UnprojectArray(ptr long ptr long ptr ptr ptr ptr long) d3dx10_43.D3DXVec3UnprojectArray +@ stdcall D3DXVec4BaryCentric(ptr ptr ptr ptr long long) d3dx10_43.D3DXVec4BaryCentric +@ stdcall D3DXVec4CatmullRom(ptr ptr ptr ptr ptr long) d3dx10_43.D3DXVec4CatmullRom +@ stdcall D3DXVec4Cross(ptr ptr ptr ptr) d3dx10_43.D3DXVec4Cross +@ stdcall D3DXVec4Hermite(ptr ptr ptr ptr ptr long) d3dx10_43.D3DXVec4Hermite +@ stdcall D3DXVec4Normalize(ptr ptr) d3dx10_43.D3DXVec4Normalize +@ stdcall D3DXVec4Transform(ptr ptr ptr) d3dx10_43.D3DXVec4Transform +@ stdcall D3DXVec4TransformArray(ptr long ptr long ptr long) d3dx10_43.D3DXVec4TransformArray diff -Nru wine1.3-1.3.0/dlls/d3dx10_40/Makefile.in wine1.3-1.3.1/dlls/d3dx10_40/Makefile.in --- wine1.3-1.3.0/dlls/d3dx10_40/Makefile.in 1970-01-01 01:00:00.000000000 +0100 +++ wine1.3-1.3.1/dlls/d3dx10_40/Makefile.in 2010-08-20 18:23:50.000000000 +0100 @@ -0,0 +1,12 @@ +TOPSRCDIR = @top_srcdir@ +TOPOBJDIR = ../.. +SRCDIR = @srcdir@ +VPATH = @srcdir@ +MODULE = d3dx10_40.dll + +C_SRCS = \ + d3dx10_40_main.c + +RC_SRCS = version.rc + +@MAKE_DLL_RULES@ diff -Nru wine1.3-1.3.0/dlls/d3dx10_40/version.rc wine1.3-1.3.1/dlls/d3dx10_40/version.rc --- wine1.3-1.3.0/dlls/d3dx10_40/version.rc 1970-01-01 01:00:00.000000000 +0100 +++ wine1.3-1.3.1/dlls/d3dx10_40/version.rc 2010-08-20 18:23:50.000000000 +0100 @@ -0,0 +1,26 @@ +/* + * Copyright 2010 Owen Rudge for 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 + */ + +#define WINE_FILEDESCRIPTION_STR "Wine D3DX10" +#define WINE_FILENAME_STR "d3dx10_40.dll" +#define WINE_FILEVERSION 9,24,950,2656 +#define WINE_FILEVERSION_STR "9.24.950.2656" +#define WINE_PRODUCTVERSION 9,24,950,2656 +#define WINE_PRODUCTVERSION_STR "9.24.950.2656" + +#include "wine/wine_common_ver.rc" diff -Nru wine1.3-1.3.0/dlls/d3dx10_41/d3dx10_41_main.c wine1.3-1.3.1/dlls/d3dx10_41/d3dx10_41_main.c --- wine1.3-1.3.0/dlls/d3dx10_41/d3dx10_41_main.c 1970-01-01 01:00:00.000000000 +0100 +++ wine1.3-1.3.1/dlls/d3dx10_41/d3dx10_41_main.c 2010-08-20 18:23:50.000000000 +0100 @@ -0,0 +1,63 @@ +/* + * D3DX10 main file + * + * Copyright (c) 2010 Owen Rudge for 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 "wine/port.h" + +#include + +#define COBJMACROS + +#include "windef.h" +#include "winbase.h" +#include "winuser.h" +#include "objbase.h" + +#include "d3d10.h" + +BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved) +{ + switch (fdwReason) + { + case DLL_WINE_PREATTACH: + return FALSE; /* prefer native version */ + case DLL_PROCESS_ATTACH: + DisableThreadLibraryCalls(hinstDLL); + break; + case DLL_PROCESS_DETACH: + break; + } + + return TRUE; +} + +/*********************************************************************** + * D3DX10CheckVersion + * + * Checks whether we are compiling against the correct d3d and d3dx library. + */ +BOOL WINAPI D3DX10CheckVersion(UINT d3dsdkvers, UINT d3dxsdkvers) +{ + if ((d3dsdkvers == D3D10_SDK_VERSION) && (d3dxsdkvers == 41)) + return TRUE; + + return FALSE; +} diff -Nru wine1.3-1.3.0/dlls/d3dx10_41/d3dx10_41.spec wine1.3-1.3.1/dlls/d3dx10_41/d3dx10_41.spec --- wine1.3-1.3.0/dlls/d3dx10_41/d3dx10_41.spec 1970-01-01 01:00:00.000000000 +0100 +++ wine1.3-1.3.1/dlls/d3dx10_41/d3dx10_41.spec 2010-08-20 18:23:50.000000000 +0100 @@ -0,0 +1,176 @@ +@ stdcall D3DX10CreateThreadPump(long long ptr) d3dx10_43.D3DX10CreateThreadPump +@ stdcall D3DX10CheckVersion(long long) +@ stdcall D3DX10CompileFromFileA(str ptr ptr str str long long ptr ptr ptr ptr) d3dx10_43.D3DX10CompileFromFileA +@ stdcall D3DX10CompileFromFileW(wstr ptr ptr str str long long ptr ptr ptr ptr) d3dx10_43.D3DX10CompileFromFileW +@ stdcall D3DX10CompileFromMemory(str long str ptr ptr str str long long ptr ptr ptr ptr) d3dx10_43.D3DX10CompileFromMemory +@ stdcall D3DX10CompileFromResourceA(long str str ptr ptr str str long long ptr ptr ptr ptr) d3dx10_43.D3DX10CompileFromResourceA +@ stdcall D3DX10CompileFromResourceW(long wstr wstr ptr ptr str str long long ptr ptr ptr ptr) d3dx10_43.D3DX10CompileFromResourceW +@ stdcall D3DX10ComputeNormalMap(ptr long long long ptr) d3dx10_43.D3DX10ComputeNormalMap +@ stdcall D3DX10CreateAsyncCompilerProcessor(str ptr ptr str str long long ptr ptr ptr) d3dx10_43.D3DX10CreateAsyncCompilerProcessor +@ stdcall D3DX10CreateAsyncEffectCreateProcessor(str ptr ptr str long long ptr ptr ptr ptr) d3dx10_43.D3DX10CreateAsyncEffectCreateProcessor +@ stdcall D3DX10CreateAsyncEffectPoolCreateProcessor(str ptr ptr str long long ptr ptr ptr) d3dx10_43.D3DX10CreateAsyncEffectPoolCreateProcessor +@ stdcall D3DX10CreateAsyncFileLoaderA(str ptr) d3dx10_43.D3DX10CreateAsyncFileLoaderA +@ stdcall D3DX10CreateAsyncFileLoaderW(wstr ptr) d3dx10_43.D3DX10CreateAsyncFileLoaderW +@ stdcall D3DX10CreateAsyncMemoryLoader(ptr long ptr) d3dx10_43.D3DX10CreateAsyncMemoryLoader +@ stdcall D3DX10CreateAsyncResourceLoaderA(long str ptr) d3dx10_43.D3DX10CreateAsyncResourceLoaderA +@ stdcall D3DX10CreateAsyncResourceLoaderW(long wstr ptr) d3dx10_43.D3DX10CreateAsyncResourceLoaderW +@ stdcall D3DX10CreateAsyncShaderPreprocessProcessor(str ptr ptr ptr ptr ptr) d3dx10_43.D3DX10CreateAsyncShaderPreprocessProcessor +@ stdcall D3DX10CreateAsyncShaderResourceViewProcessor(ptr ptr ptr) d3dx10_43.D3DX10CreateAsyncShaderResourceViewProcessor +@ stdcall D3DX10CreateAsyncTextureInfoProcessor(ptr ptr) d3dx10_43.D3DX10CreateAsyncTextureInfoProcessor +@ stdcall D3DX10CreateAsyncTextureProcessor(ptr ptr ptr) d3dx10_43.D3DX10CreateAsyncTextureProcessor +@ stdcall D3DX10CreateDevice(ptr long long long ptr) d3dx10_43.D3DX10CreateDevice +@ stdcall D3DX10CreateDeviceAndSwapChain(ptr long long long ptr ptr ptr) d3dx10_43.D3DX10CreateDeviceAndSwapChain +@ stdcall D3DX10CreateEffectFromFileA(str ptr ptr str long long ptr ptr ptr ptr ptr ptr) d3dx10_43.D3DX10CreateEffectFromFileA +@ stdcall D3DX10CreateEffectFromFileW(wstr ptr ptr str long long ptr ptr ptr ptr ptr ptr) d3dx10_43.D3DX10CreateEffectFromFileW +@ stdcall D3DX10CreateEffectFromMemory(ptr long str ptr ptr str long long ptr ptr ptr ptr ptr ptr) d3dx10_43.D3DX10CreateEffectFromMemory +@ stdcall D3DX10CreateEffectFromResourceA(long str str ptr ptr str long long ptr ptr ptr ptr ptr ptr) d3dx10_43.D3DX10CreateEffectFromResourceA +@ stdcall D3DX10CreateEffectFromResourceW(long wstr wstr ptr ptr str long long ptr ptr ptr ptr ptr ptr) d3dx10_43.D3DX10CreateEffectFromResourceW +@ stdcall D3DX10CreateEffectPoolFromFileA(str ptr ptr str long long ptr ptr ptr ptr ptr) d3dx10_43.D3DX10CreateEffectPoolFromFileA +@ stdcall D3DX10CreateEffectPoolFromFileW(wstr ptr ptr str long long ptr ptr ptr ptr ptr) d3dx10_43.D3DX10CreateEffectPoolFromFileW +@ stdcall D3DX10CreateEffectPoolFromMemory(ptr long str ptr ptr str long long ptr ptr ptr ptr ptr) d3dx10_43.D3DX10CreateEffectPoolFromMemory +@ stdcall D3DX10CreateEffectPoolFromResourceA(long str str ptr ptr str long long ptr ptr ptr ptr ptr) d3dx10_43.D3DX10CreateEffectPoolFromResourceA +@ stdcall D3DX10CreateEffectPoolFromResourceW(long wstr wstr ptr ptr str long long ptr ptr ptr ptr ptr) d3dx10_43.D3DX10CreateEffectPoolFromResourceW +@ stdcall D3DX10CreateFontA(ptr long long long long long long long long long str ptr) d3dx10_43.D3DX10CreateFontA +@ stdcall D3DX10CreateFontIndirectA(ptr ptr ptr) d3dx10_43.D3DX10CreateFontIndirectA +@ stdcall D3DX10CreateFontIndirectW(ptr ptr ptr) d3dx10_43.D3DX10CreateFontIndirectW +@ stdcall D3DX10CreateFontW(ptr long long long long long long long long long wstr ptr) d3dx10_43.D3DX10CreateFontW +@ stdcall D3DX10CreateMesh(ptr ptr long str long long long ptr) d3dx10_43.D3DX10CreateMesh +@ stdcall D3DX10CreateShaderResourceViewFromFileA(ptr str ptr ptr ptr ptr) d3dx10_43.D3DX10CreateShaderResourceViewFromFileA +@ stdcall D3DX10CreateShaderResourceViewFromFileW(ptr wstr ptr ptr ptr ptr) d3dx10_43.D3DX10CreateShaderResourceViewFromFileW +@ stdcall D3DX10CreateShaderResourceViewFromMemory(ptr ptr long ptr ptr ptr ptr) d3dx10_43.D3DX10CreateShaderResourceViewFromMemory +@ stdcall D3DX10CreateShaderResourceViewFromResourceA(ptr long str ptr ptr ptr ptr) d3dx10_43.D3DX10CreateShaderResourceViewFromResourceA +@ stdcall D3DX10CreateShaderResourceViewFromResourceW(ptr long wstr ptr ptr ptr ptr) d3dx10_43.D3DX10CreateShaderResourceViewFromResourceW +@ stdcall D3DX10CreateSkinInfo(ptr) d3dx10_43.D3DX10CreateSkinInfo +@ stdcall D3DX10CreateSprite(ptr long ptr) d3dx10_43.D3DX10CreateSprite +@ stdcall D3DX10CreateTextureFromFileA(ptr str ptr ptr ptr ptr) d3dx10_43.D3DX10CreateTextureFromFileA +@ stdcall D3DX10CreateTextureFromFileW(ptr wstr ptr ptr ptr ptr) d3dx10_43.D3DX10CreateTextureFromFileW +@ stdcall D3DX10CreateTextureFromMemory(ptr ptr long ptr ptr ptr ptr) d3dx10_43.D3DX10CreateTextureFromMemory +@ stdcall D3DX10CreateTextureFromResourceA(ptr long str ptr ptr ptr ptr) d3dx10_43.D3DX10CreateTextureFromResourceA +@ stdcall D3DX10CreateTextureFromResourceW(ptr long wstr ptr ptr ptr ptr) d3dx10_43.D3DX10CreateTextureFromResourceW +@ stdcall D3DX10FilterTexture(ptr long long) d3dx10_43.D3DX10FilterTexture +@ stdcall D3DX10GetFeatureLevel1(ptr ptr) d3dx10_43.D3DX10GetFeatureLevel1 +@ stdcall D3DX10GetImageInfoFromFileA(str ptr ptr ptr) d3dx10_43.D3DX10GetImageInfoFromFileA +@ stdcall D3DX10GetImageInfoFromFileW(wstr ptr ptr ptr) d3dx10_43.D3DX10GetImageInfoFromFileW +@ stdcall D3DX10GetImageInfoFromMemory(ptr long ptr ptr ptr) d3dx10_43.D3DX10GetImageInfoFromMemory +@ stdcall D3DX10GetImageInfoFromResourceA(long str ptr ptr ptr) d3dx10_43.D3DX10GetImageInfoFromResourceA +@ stdcall D3DX10GetImageInfoFromResourceW(long wstr ptr ptr ptr) d3dx10_43.D3DX10GetImageInfoFromResourceW +@ stdcall D3DX10LoadTextureFromTexture(ptr ptr ptr) d3dx10_43.D3DX10LoadTextureFromTexture +@ stdcall D3DX10PreprocessShaderFromFileA(str ptr ptr ptr ptr ptr) d3dx10_43.D3DX10PreprocessShaderFromFileA +@ stdcall D3DX10PreprocessShaderFromFileW(wstr ptr ptr ptr ptr ptr) d3dx10_43.D3DX10PreprocessShaderFromFileW +@ stdcall D3DX10PreprocessShaderFromMemory(str long str ptr ptr ptr ptr ptr) d3dx10_43.D3DX10PreprocessShaderFromMemory +@ stdcall D3DX10PreprocessShaderFromResourceA(long str str ptr ptr ptr ptr ptr) d3dx10_43.D3DX10PreprocessShaderFromResourceA +@ stdcall D3DX10PreprocessShaderFromResourceW(long wstr wstr ptr ptr ptr ptr ptr) d3dx10_43.D3DX10PreprocessShaderFromResourceW +@ stdcall D3DX10SHProjectCubeMap(long ptr ptr ptr ptr) d3dx10_43.D3DX10SHProjectCubeMap +@ stdcall D3DX10SaveTextureToFileA(ptr ptr str) d3dx10_43.D3DX10SaveTextureToFileA +@ stdcall D3DX10SaveTextureToFileW(ptr ptr wstr) d3dx10_43.D3DX10SaveTextureToFileW +@ stdcall D3DX10SaveTextureToMemory(ptr ptr ptr long) d3dx10_43.D3DX10SaveTextureToMemory +@ stdcall D3DX10UnsetAllDeviceObjects(ptr) d3dx10_43.D3DX10UnsetAllDeviceObjects +@ stdcall D3DXBoxBoundProbe(ptr ptr ptr ptr) d3dx10_43.D3DXBoxBoundProbe +@ stdcall D3DXColorAdjustContrast(ptr ptr long) d3dx10_43.3DXColorAdjustContrast +@ stdcall D3DXColorAdjustSaturation(ptr ptr long) d3dx10_43.D3DXColorAdjustSaturation +@ stdcall D3DXComputeBoundingBox(ptr long long ptr ptr) d3dx10_43.D3DXComputeBoundingBox +@ stdcall D3DXComputeBoundingSphere(ptr long long ptr ptr) d3dx10_43.D3DXComputeBoundingSphere +@ stdcall D3DXCpuOptimizations(long) d3dx10_43.D3DXCpuOptimizations +@ stdcall D3DXCreateMatrixStack(long ptr) d3dx10_43.D3DXCreateMatrixStack +@ stdcall D3DXFloat16To32Array(ptr ptr long) d3dx10_43.D3DXFloat16To32Array +@ stdcall D3DXFloat32To16Array(ptr ptr long) d3dx10_43.D3DXFloat32To16Array +@ stdcall D3DXFresnelTerm(long long) d3dx10_43.D3DXFresnelTerm +@ stdcall D3DXIntersectTri(ptr ptr ptr ptr ptr ptr ptr ptr) d3dx10_43.D3DXIntersectTri +@ stdcall D3DXMatrixAffineTransformation2D(ptr long ptr long ptr) d3dx10_43.D3DXMatrixAffineTransformation2D +@ stdcall D3DXMatrixAffineTransformation(ptr long ptr ptr ptr) d3dx10_43.D3DXMatrixAffineTransformation +@ stdcall D3DXMatrixDecompose(ptr ptr ptr ptr) d3dx10_43.D3DXMatrixDecompose +@ stdcall D3DXMatrixDeterminant(ptr) d3dx10_43.D3DXMatrixDeterminant +@ stdcall D3DXMatrixInverse(ptr ptr ptr) d3dx10_43.D3DXMatrixInverse +@ stdcall D3DXMatrixLookAtLH(ptr ptr ptr ptr) d3dx10_43.D3DXMatrixLookAtLH +@ stdcall D3DXMatrixLookAtRH(ptr ptr ptr ptr) d3dx10_43.D3DXMatrixLookAtRH +@ stdcall D3DXMatrixMultiply(ptr ptr ptr) d3dx10_43.D3DXMatrixMultiply +@ stdcall D3DXMatrixMultiplyTranspose(ptr ptr ptr) d3dx10_43.D3DXMatrixMultiplyTranspose +@ stdcall D3DXMatrixOrthoLH(ptr long long long long) d3dx10_43.D3DXMatrixOrthoLH +@ stdcall D3DXMatrixOrthoOffCenterLH(ptr long long long long long long) d3dx10_43.D3DXMatrixOrthoOffCenterLH +@ stdcall D3DXMatrixOrthoOffCenterRH(ptr long long long long long long) d3dx10_43.D3DXMatrixOrthoOffCenterRH +@ stdcall D3DXMatrixOrthoRH(ptr long long long long) d3dx10_43.D3DXMatrixOrthoRH +@ stdcall D3DXMatrixPerspectiveFovLH(ptr long long long long) d3dx10_43.D3DXMatrixPerspectiveFovLH +@ stdcall D3DXMatrixPerspectiveFovRH(ptr long long long long) d3dx10_43.D3DXMatrixPerspectiveFovRH +@ stdcall D3DXMatrixPerspectiveLH(ptr long long long long) d3dx10_43.D3DXMatrixPerspectiveLH +@ stdcall D3DXMatrixPerspectiveOffCenterLH(ptr long long long long long long) d3dx10_43.D3DXMatrixPerspectiveOffCenterLH +@ stdcall D3DXMatrixPerspectiveOffCenterRH(ptr long long long long long long) d3dx10_43.D3DXMatrixPerspectiveOffCenterRH +@ stdcall D3DXMatrixPerspectiveRH(ptr long long long long) d3dx10_43.D3DXMatrixPerspectiveRH +@ stdcall D3DXMatrixReflect(ptr ptr) d3dx10_43.D3DXMatrixReflect +@ stdcall D3DXMatrixRotationAxis(ptr ptr long) d3dx10_43.D3DXMatrixRotationAxis +@ stdcall D3DXMatrixRotationQuaternion(ptr ptr) d3dx10_43.D3DXMatrixRotationQuaternion +@ stdcall D3DXMatrixRotationX(ptr long) d3dx10_43.D3DXMatrixRotationX +@ stdcall D3DXMatrixRotationY(ptr long) d3dx10_43.D3DXMatrixRotationY +@ stdcall D3DXMatrixRotationYawPitchRoll(ptr long long long) d3dx10_43.D3DXMatrixRotationYawPitchRoll +@ stdcall D3DXMatrixRotationZ(ptr long) d3dx10_43.D3DXMatrixRotationZ +@ stdcall D3DXMatrixScaling(ptr long long long) d3dx10_43.D3DXMatrixScaling +@ stdcall D3DXMatrixShadow(ptr ptr ptr) d3dx10_43.D3DXMatrixShadow +@ stdcall D3DXMatrixTransformation2D(ptr ptr long ptr ptr long ptr) d3dx10_43.D3DXMatrixTransformation2D +@ stdcall D3DXMatrixTransformation(ptr ptr ptr ptr ptr ptr ptr) d3dx10_43.D3DXMatrixTransformation +@ stdcall D3DXMatrixTranslation(ptr long long long) d3dx10_43.D3DXMatrixTranslation +@ stdcall D3DXMatrixTranspose(ptr ptr) d3dx10_43.D3DXMatrixTranspose +@ stdcall D3DXPlaneFromPointNormal(ptr ptr ptr) d3dx10_43.D3DXPlaneFromPointNormal +@ stdcall D3DXPlaneFromPoints(ptr ptr ptr ptr) d3dx10_43.D3DXPlaneFromPoints +@ stdcall D3DXPlaneIntersectLine(ptr ptr ptr ptr) d3dx10_43.D3DXPlaneIntersectLine +@ stdcall D3DXPlaneNormalize(ptr ptr) d3dx10_43.D3DXPlaneNormalize +@ stdcall D3DXPlaneTransform(ptr ptr ptr) d3dx10_43.D3DXPlaneTransform +@ stdcall D3DXPlaneTransformArray(ptr long ptr long ptr long) d3dx10_43.D3DXPlaneTransformArray +@ stdcall D3DXQuaternionBaryCentric(ptr ptr ptr ptr long long) d3dx10_43.D3DXQuaternionBaryCentric +@ stdcall D3DXQuaternionExp(ptr ptr) d3dx10_43.D3DXQuaternionExp +@ stdcall D3DXQuaternionInverse(ptr ptr) d3dx10_43.D3DXQuaternionInverse +@ stdcall D3DXQuaternionLn(ptr ptr) d3dx10_43.D3DXQuaternionLn +@ stdcall D3DXQuaternionMultiply(ptr ptr ptr) d3dx10_43.D3DXQuaternionMultiply +@ stdcall D3DXQuaternionNormalize(ptr ptr) d3dx10_43.D3DXQuaternionNormalize +@ stdcall D3DXQuaternionRotationAxis(ptr ptr long) d3dx10_43.D3DXQuaternionRotationAxis +@ stdcall D3DXQuaternionRotationMatrix(ptr ptr) d3dx10_43.D3DXQuaternionRotationMatrix +@ stdcall D3DXQuaternionRotationYawPitchRoll(ptr long long long) d3dx10_43.D3DXQuaternionRotationYawPitchRoll +@ stdcall D3DXQuaternionSlerp(ptr ptr ptr long) d3dx10_43.D3DXQuaternionSlerp +@ stdcall D3DXQuaternionSquad(ptr ptr ptr ptr ptr long) d3dx10_43.D3DXQuaternionSquad +@ stdcall D3DXQuaternionSquadSetup(ptr ptr ptr ptr ptr ptr ptr) d3dx10_43.D3DXQuaternionSquadSetup +@ stdcall D3DXQuaternionToAxisAngle(ptr ptr ptr) d3dx10_43.D3DXQuaternionToAxisAngle +@ stdcall D3DXSHAdd(ptr long ptr ptr) d3dx10_43.D3DXSHAdd +@ stdcall D3DXSHDot(long ptr ptr) d3dx10_43.D3DXSHDot +@ stdcall D3DXSHEvalConeLight(long ptr long long long long ptr ptr ptr) d3dx10_43.D3DXSHEvalConeLight +@ stdcall D3DXSHEvalDirection(ptr long ptr) d3dx10_43.D3DXSHEvalDirection +@ stdcall D3DXSHEvalDirectionalLight(long ptr long long long long ptr ptr ptr) d3dx10_43.D3DXSHEvalDirectionalLight +@ stdcall D3DXSHEvalHemisphereLight(long ptr long long ptr ptr ptr) d3dx10_43.D3DXSHEvalHemisphereLight +@ stdcall D3DXSHEvalSphericalLight(long ptr long long long long ptr ptr ptr) d3dx10_43.D3DXSHEvalSphericalLight +@ stdcall D3DXSHMultiply2(ptr ptr ptr) d3dx10_43.D3DXSHMultiply2 +@ stdcall D3DXSHMultiply3(ptr ptr ptr) d3dx10_43.D3DXSHMultiply3 +@ stdcall D3DXSHMultiply4(ptr ptr ptr) d3dx10_43.D3DXSHMultiply4 +@ stdcall D3DXSHMultiply5(ptr ptr ptr) d3dx10_43.D3DXSHMultiply5 +@ stdcall D3DXSHMultiply6(ptr ptr ptr) d3dx10_43.D3DXSHMultiply6 +@ stdcall D3DXSHRotate(ptr long ptr ptr) d3dx10_43.D3DXSHRotate +@ stdcall D3DXSHRotateZ(ptr long long ptr) d3dx10_43.D3DXSHRotateZ +@ stdcall D3DXSHScale(ptr long ptr ptr) d3dx10_43.D3DXSHScale +@ stdcall D3DXSphereBoundProbe(ptr long ptr ptr) d3dx10_43.D3DXSphereBoundProbe +@ stdcall D3DXVec2BaryCentric(ptr ptr ptr ptr long long) d3dx10_43.D3DXVec2BaryCentric +@ stdcall D3DXVec2CatmullRom(ptr ptr ptr ptr ptr long) d3dx10_43.D3DXVec2CatmullRom +@ stdcall D3DXVec2Hermite(ptr ptr ptr ptr ptr long) d3dx10_43.D3DXVec2Hermite +@ stdcall D3DXVec2Normalize(ptr ptr) d3dx10_43.D3DXVec2Normalize +@ stdcall D3DXVec2Transform(ptr ptr ptr) d3dx10_43.D3DXVec2Transform +@ stdcall D3DXVec2TransformArray(ptr long ptr long ptr long) d3dx10_43.D3DXVec2TransformArray +@ stdcall D3DXVec2TransformCoord(ptr ptr ptr) d3dx10_43.D3DXVec2TransformCoord +@ stdcall D3DXVec2TransformCoordArray(ptr long ptr long ptr long) d3dx10_43.D3DXVec2TransformCoordArray +@ stdcall D3DXVec2TransformNormal(ptr ptr ptr) d3dx10_43.D3DXVec2TransformNormal +@ stdcall D3DXVec2TransformNormalArray(ptr long ptr long ptr long) d3dx10_43.D3DXVec2TransformNormalArray +@ stdcall D3DXVec3BaryCentric(ptr ptr ptr ptr long long) d3dx10_43.D3DXVec3BaryCentric +@ stdcall D3DXVec3CatmullRom(ptr ptr ptr ptr ptr long) d3dx10_43.D3DXVec3CatmullRom +@ stdcall D3DXVec3Hermite(ptr ptr ptr ptr ptr long) d3dx10_43.D3DXVec3Hermite +@ stdcall D3DXVec3Normalize(ptr ptr) d3dx10_43.D3DXVec3Normalize +@ stdcall D3DXVec3Project(ptr ptr ptr ptr ptr ptr) d3dx10_43.D3DXVec3Project +@ stdcall D3DXVec3ProjectArray(ptr long ptr long ptr ptr ptr ptr long) d3dx10_43.D3DXVec3ProjectArray +@ stdcall D3DXVec3Transform(ptr ptr ptr) d3dx10_43.D3DXVec3Transform +@ stdcall D3DXVec3TransformArray(ptr long ptr long ptr long) d3dx10_43.D3DXVec3TransformArray +@ stdcall D3DXVec3TransformCoord(ptr ptr ptr) d3dx10_43.D3DXVec3TransformCoord +@ stdcall D3DXVec3TransformCoordArray(ptr long ptr long ptr long) d3dx10_43.D3DXVec3TransformCoordArray +@ stdcall D3DXVec3TransformNormal(ptr ptr ptr) d3dx10_43.D3DXVec3TransformNormal +@ stdcall D3DXVec3TransformNormalArray(ptr long ptr long ptr long) d3dx10_43.D3DXVec3TransformNormalArray +@ stdcall D3DXVec3Unproject(ptr ptr ptr ptr ptr ptr) d3dx10_43.D3DXVec3Unproject +@ stdcall D3DXVec3UnprojectArray(ptr long ptr long ptr ptr ptr ptr long) d3dx10_43.D3DXVec3UnprojectArray +@ stdcall D3DXVec4BaryCentric(ptr ptr ptr ptr long long) d3dx10_43.D3DXVec4BaryCentric +@ stdcall D3DXVec4CatmullRom(ptr ptr ptr ptr ptr long) d3dx10_43.D3DXVec4CatmullRom +@ stdcall D3DXVec4Cross(ptr ptr ptr ptr) d3dx10_43.D3DXVec4Cross +@ stdcall D3DXVec4Hermite(ptr ptr ptr ptr ptr long) d3dx10_43.D3DXVec4Hermite +@ stdcall D3DXVec4Normalize(ptr ptr) d3dx10_43.D3DXVec4Normalize +@ stdcall D3DXVec4Transform(ptr ptr ptr) d3dx10_43.D3DXVec4Transform +@ stdcall D3DXVec4TransformArray(ptr long ptr long ptr long) d3dx10_43.D3DXVec4TransformArray diff -Nru wine1.3-1.3.0/dlls/d3dx10_41/Makefile.in wine1.3-1.3.1/dlls/d3dx10_41/Makefile.in --- wine1.3-1.3.0/dlls/d3dx10_41/Makefile.in 1970-01-01 01:00:00.000000000 +0100 +++ wine1.3-1.3.1/dlls/d3dx10_41/Makefile.in 2010-08-20 18:23:50.000000000 +0100 @@ -0,0 +1,12 @@ +TOPSRCDIR = @top_srcdir@ +TOPOBJDIR = ../.. +SRCDIR = @srcdir@ +VPATH = @srcdir@ +MODULE = d3dx10_41.dll + +C_SRCS = \ + d3dx10_41_main.c + +RC_SRCS = version.rc + +@MAKE_DLL_RULES@ diff -Nru wine1.3-1.3.0/dlls/d3dx10_41/version.rc wine1.3-1.3.1/dlls/d3dx10_41/version.rc --- wine1.3-1.3.0/dlls/d3dx10_41/version.rc 1970-01-01 01:00:00.000000000 +0100 +++ wine1.3-1.3.1/dlls/d3dx10_41/version.rc 2010-08-20 18:23:50.000000000 +0100 @@ -0,0 +1,26 @@ +/* + * Copyright 2010 Owen Rudge for 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 + */ + +#define WINE_FILEDESCRIPTION_STR "Wine D3DX10" +#define WINE_FILENAME_STR "d3dx10_41.dll" +#define WINE_FILEVERSION 9,26,952,2844 +#define WINE_FILEVERSION_STR "9.26.952.2844" +#define WINE_PRODUCTVERSION 9,26,952,2844 +#define WINE_PRODUCTVERSION_STR "9.26.952.2844" + +#include "wine/wine_common_ver.rc" diff -Nru wine1.3-1.3.0/dlls/d3dx10_42/d3dx10_42_main.c wine1.3-1.3.1/dlls/d3dx10_42/d3dx10_42_main.c --- wine1.3-1.3.0/dlls/d3dx10_42/d3dx10_42_main.c 1970-01-01 01:00:00.000000000 +0100 +++ wine1.3-1.3.1/dlls/d3dx10_42/d3dx10_42_main.c 2010-08-20 18:23:50.000000000 +0100 @@ -0,0 +1,63 @@ +/* + * D3DX10 main file + * + * Copyright (c) 2010 Owen Rudge for 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 "wine/port.h" + +#include + +#define COBJMACROS + +#include "windef.h" +#include "winbase.h" +#include "winuser.h" +#include "objbase.h" + +#include "d3d10.h" + +BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved) +{ + switch (fdwReason) + { + case DLL_WINE_PREATTACH: + return FALSE; /* prefer native version */ + case DLL_PROCESS_ATTACH: + DisableThreadLibraryCalls(hinstDLL); + break; + case DLL_PROCESS_DETACH: + break; + } + + return TRUE; +} + +/*********************************************************************** + * D3DX10CheckVersion + * + * Checks whether we are compiling against the correct d3d and d3dx library. + */ +BOOL WINAPI D3DX10CheckVersion(UINT d3dsdkvers, UINT d3dxsdkvers) +{ + if ((d3dsdkvers == D3D10_SDK_VERSION) && (d3dxsdkvers == 42)) + return TRUE; + + return FALSE; +} diff -Nru wine1.3-1.3.0/dlls/d3dx10_42/d3dx10_42.spec wine1.3-1.3.1/dlls/d3dx10_42/d3dx10_42.spec --- wine1.3-1.3.0/dlls/d3dx10_42/d3dx10_42.spec 1970-01-01 01:00:00.000000000 +0100 +++ wine1.3-1.3.1/dlls/d3dx10_42/d3dx10_42.spec 2010-08-20 18:23:50.000000000 +0100 @@ -0,0 +1,176 @@ +@ stdcall D3DX10CreateThreadPump(long long ptr) d3dx10_43.D3DX10CreateThreadPump +@ stdcall D3DX10CheckVersion(long long) +@ stdcall D3DX10CompileFromFileA(str ptr ptr str str long long ptr ptr ptr ptr) d3dx10_43.D3DX10CompileFromFileA +@ stdcall D3DX10CompileFromFileW(wstr ptr ptr str str long long ptr ptr ptr ptr) d3dx10_43.D3DX10CompileFromFileW +@ stdcall D3DX10CompileFromMemory(str long str ptr ptr str str long long ptr ptr ptr ptr) d3dx10_43.D3DX10CompileFromMemory +@ stdcall D3DX10CompileFromResourceA(long str str ptr ptr str str long long ptr ptr ptr ptr) d3dx10_43.D3DX10CompileFromResourceA +@ stdcall D3DX10CompileFromResourceW(long wstr wstr ptr ptr str str long long ptr ptr ptr ptr) d3dx10_43.D3DX10CompileFromResourceW +@ stdcall D3DX10ComputeNormalMap(ptr long long long ptr) d3dx10_43.D3DX10ComputeNormalMap +@ stdcall D3DX10CreateAsyncCompilerProcessor(str ptr ptr str str long long ptr ptr ptr) d3dx10_43.D3DX10CreateAsyncCompilerProcessor +@ stdcall D3DX10CreateAsyncEffectCreateProcessor(str ptr ptr str long long ptr ptr ptr ptr) d3dx10_43.D3DX10CreateAsyncEffectCreateProcessor +@ stdcall D3DX10CreateAsyncEffectPoolCreateProcessor(str ptr ptr str long long ptr ptr ptr) d3dx10_43.D3DX10CreateAsyncEffectPoolCreateProcessor +@ stdcall D3DX10CreateAsyncFileLoaderA(str ptr) d3dx10_43.D3DX10CreateAsyncFileLoaderA +@ stdcall D3DX10CreateAsyncFileLoaderW(wstr ptr) d3dx10_43.D3DX10CreateAsyncFileLoaderW +@ stdcall D3DX10CreateAsyncMemoryLoader(ptr long ptr) d3dx10_43.D3DX10CreateAsyncMemoryLoader +@ stdcall D3DX10CreateAsyncResourceLoaderA(long str ptr) d3dx10_43.D3DX10CreateAsyncResourceLoaderA +@ stdcall D3DX10CreateAsyncResourceLoaderW(long wstr ptr) d3dx10_43.D3DX10CreateAsyncResourceLoaderW +@ stdcall D3DX10CreateAsyncShaderPreprocessProcessor(str ptr ptr ptr ptr ptr) d3dx10_43.D3DX10CreateAsyncShaderPreprocessProcessor +@ stdcall D3DX10CreateAsyncShaderResourceViewProcessor(ptr ptr ptr) d3dx10_43.D3DX10CreateAsyncShaderResourceViewProcessor +@ stdcall D3DX10CreateAsyncTextureInfoProcessor(ptr ptr) d3dx10_43.D3DX10CreateAsyncTextureInfoProcessor +@ stdcall D3DX10CreateAsyncTextureProcessor(ptr ptr ptr) d3dx10_43.D3DX10CreateAsyncTextureProcessor +@ stdcall D3DX10CreateDevice(ptr long long long ptr) d3dx10_43.D3DX10CreateDevice +@ stdcall D3DX10CreateDeviceAndSwapChain(ptr long long long ptr ptr ptr) d3dx10_43.D3DX10CreateDeviceAndSwapChain +@ stdcall D3DX10CreateEffectFromFileA(str ptr ptr str long long ptr ptr ptr ptr ptr ptr) d3dx10_43.D3DX10CreateEffectFromFileA +@ stdcall D3DX10CreateEffectFromFileW(wstr ptr ptr str long long ptr ptr ptr ptr ptr ptr) d3dx10_43.D3DX10CreateEffectFromFileW +@ stdcall D3DX10CreateEffectFromMemory(ptr long str ptr ptr str long long ptr ptr ptr ptr ptr ptr) d3dx10_43.D3DX10CreateEffectFromMemory +@ stdcall D3DX10CreateEffectFromResourceA(long str str ptr ptr str long long ptr ptr ptr ptr ptr ptr) d3dx10_43.D3DX10CreateEffectFromResourceA +@ stdcall D3DX10CreateEffectFromResourceW(long wstr wstr ptr ptr str long long ptr ptr ptr ptr ptr ptr) d3dx10_43.D3DX10CreateEffectFromResourceW +@ stdcall D3DX10CreateEffectPoolFromFileA(str ptr ptr str long long ptr ptr ptr ptr ptr) d3dx10_43.D3DX10CreateEffectPoolFromFileA +@ stdcall D3DX10CreateEffectPoolFromFileW(wstr ptr ptr str long long ptr ptr ptr ptr ptr) d3dx10_43.D3DX10CreateEffectPoolFromFileW +@ stdcall D3DX10CreateEffectPoolFromMemory(ptr long str ptr ptr str long long ptr ptr ptr ptr ptr) d3dx10_43.D3DX10CreateEffectPoolFromMemory +@ stdcall D3DX10CreateEffectPoolFromResourceA(long str str ptr ptr str long long ptr ptr ptr ptr ptr) d3dx10_43.D3DX10CreateEffectPoolFromResourceA +@ stdcall D3DX10CreateEffectPoolFromResourceW(long wstr wstr ptr ptr str long long ptr ptr ptr ptr ptr) d3dx10_43.D3DX10CreateEffectPoolFromResourceW +@ stdcall D3DX10CreateFontA(ptr long long long long long long long long long str ptr) d3dx10_43.D3DX10CreateFontA +@ stdcall D3DX10CreateFontIndirectA(ptr ptr ptr) d3dx10_43.D3DX10CreateFontIndirectA +@ stdcall D3DX10CreateFontIndirectW(ptr ptr ptr) d3dx10_43.D3DX10CreateFontIndirectW +@ stdcall D3DX10CreateFontW(ptr long long long long long long long long long wstr ptr) d3dx10_43.D3DX10CreateFontW +@ stdcall D3DX10CreateMesh(ptr ptr long str long long long ptr) d3dx10_43.D3DX10CreateMesh +@ stdcall D3DX10CreateShaderResourceViewFromFileA(ptr str ptr ptr ptr ptr) d3dx10_43.D3DX10CreateShaderResourceViewFromFileA +@ stdcall D3DX10CreateShaderResourceViewFromFileW(ptr wstr ptr ptr ptr ptr) d3dx10_43.D3DX10CreateShaderResourceViewFromFileW +@ stdcall D3DX10CreateShaderResourceViewFromMemory(ptr ptr long ptr ptr ptr ptr) d3dx10_43.D3DX10CreateShaderResourceViewFromMemory +@ stdcall D3DX10CreateShaderResourceViewFromResourceA(ptr long str ptr ptr ptr ptr) d3dx10_43.D3DX10CreateShaderResourceViewFromResourceA +@ stdcall D3DX10CreateShaderResourceViewFromResourceW(ptr long wstr ptr ptr ptr ptr) d3dx10_43.D3DX10CreateShaderResourceViewFromResourceW +@ stdcall D3DX10CreateSkinInfo(ptr) d3dx10_43.D3DX10CreateSkinInfo +@ stdcall D3DX10CreateSprite(ptr long ptr) d3dx10_43.D3DX10CreateSprite +@ stdcall D3DX10CreateTextureFromFileA(ptr str ptr ptr ptr ptr) d3dx10_43.D3DX10CreateTextureFromFileA +@ stdcall D3DX10CreateTextureFromFileW(ptr wstr ptr ptr ptr ptr) d3dx10_43.D3DX10CreateTextureFromFileW +@ stdcall D3DX10CreateTextureFromMemory(ptr ptr long ptr ptr ptr ptr) d3dx10_43.D3DX10CreateTextureFromMemory +@ stdcall D3DX10CreateTextureFromResourceA(ptr long str ptr ptr ptr ptr) d3dx10_43.D3DX10CreateTextureFromResourceA +@ stdcall D3DX10CreateTextureFromResourceW(ptr long wstr ptr ptr ptr ptr) d3dx10_43.D3DX10CreateTextureFromResourceW +@ stdcall D3DX10FilterTexture(ptr long long) d3dx10_43.D3DX10FilterTexture +@ stdcall D3DX10GetFeatureLevel1(ptr ptr) d3dx10_43.D3DX10GetFeatureLevel1 +@ stdcall D3DX10GetImageInfoFromFileA(str ptr ptr ptr) d3dx10_43.D3DX10GetImageInfoFromFileA +@ stdcall D3DX10GetImageInfoFromFileW(wstr ptr ptr ptr) d3dx10_43.D3DX10GetImageInfoFromFileW +@ stdcall D3DX10GetImageInfoFromMemory(ptr long ptr ptr ptr) d3dx10_43.D3DX10GetImageInfoFromMemory +@ stdcall D3DX10GetImageInfoFromResourceA(long str ptr ptr ptr) d3dx10_43.D3DX10GetImageInfoFromResourceA +@ stdcall D3DX10GetImageInfoFromResourceW(long wstr ptr ptr ptr) d3dx10_43.D3DX10GetImageInfoFromResourceW +@ stdcall D3DX10LoadTextureFromTexture(ptr ptr ptr) d3dx10_43.D3DX10LoadTextureFromTexture +@ stdcall D3DX10PreprocessShaderFromFileA(str ptr ptr ptr ptr ptr) d3dx10_43.D3DX10PreprocessShaderFromFileA +@ stdcall D3DX10PreprocessShaderFromFileW(wstr ptr ptr ptr ptr ptr) d3dx10_43.D3DX10PreprocessShaderFromFileW +@ stdcall D3DX10PreprocessShaderFromMemory(str long str ptr ptr ptr ptr ptr) d3dx10_43.D3DX10PreprocessShaderFromMemory +@ stdcall D3DX10PreprocessShaderFromResourceA(long str str ptr ptr ptr ptr ptr) d3dx10_43.D3DX10PreprocessShaderFromResourceA +@ stdcall D3DX10PreprocessShaderFromResourceW(long wstr wstr ptr ptr ptr ptr ptr) d3dx10_43.D3DX10PreprocessShaderFromResourceW +@ stdcall D3DX10SHProjectCubeMap(long ptr ptr ptr ptr) d3dx10_43.D3DX10SHProjectCubeMap +@ stdcall D3DX10SaveTextureToFileA(ptr ptr str) d3dx10_43.D3DX10SaveTextureToFileA +@ stdcall D3DX10SaveTextureToFileW(ptr ptr wstr) d3dx10_43.D3DX10SaveTextureToFileW +@ stdcall D3DX10SaveTextureToMemory(ptr ptr ptr long) d3dx10_43.D3DX10SaveTextureToMemory +@ stdcall D3DX10UnsetAllDeviceObjects(ptr) d3dx10_43.D3DX10UnsetAllDeviceObjects +@ stdcall D3DXBoxBoundProbe(ptr ptr ptr ptr) d3dx10_43.D3DXBoxBoundProbe +@ stdcall D3DXColorAdjustContrast(ptr ptr long) d3dx10_43.3DXColorAdjustContrast +@ stdcall D3DXColorAdjustSaturation(ptr ptr long) d3dx10_43.D3DXColorAdjustSaturation +@ stdcall D3DXComputeBoundingBox(ptr long long ptr ptr) d3dx10_43.D3DXComputeBoundingBox +@ stdcall D3DXComputeBoundingSphere(ptr long long ptr ptr) d3dx10_43.D3DXComputeBoundingSphere +@ stdcall D3DXCpuOptimizations(long) d3dx10_43.D3DXCpuOptimizations +@ stdcall D3DXCreateMatrixStack(long ptr) d3dx10_43.D3DXCreateMatrixStack +@ stdcall D3DXFloat16To32Array(ptr ptr long) d3dx10_43.D3DXFloat16To32Array +@ stdcall D3DXFloat32To16Array(ptr ptr long) d3dx10_43.D3DXFloat32To16Array +@ stdcall D3DXFresnelTerm(long long) d3dx10_43.D3DXFresnelTerm +@ stdcall D3DXIntersectTri(ptr ptr ptr ptr ptr ptr ptr ptr) d3dx10_43.D3DXIntersectTri +@ stdcall D3DXMatrixAffineTransformation2D(ptr long ptr long ptr) d3dx10_43.D3DXMatrixAffineTransformation2D +@ stdcall D3DXMatrixAffineTransformation(ptr long ptr ptr ptr) d3dx10_43.D3DXMatrixAffineTransformation +@ stdcall D3DXMatrixDecompose(ptr ptr ptr ptr) d3dx10_43.D3DXMatrixDecompose +@ stdcall D3DXMatrixDeterminant(ptr) d3dx10_43.D3DXMatrixDeterminant +@ stdcall D3DXMatrixInverse(ptr ptr ptr) d3dx10_43.D3DXMatrixInverse +@ stdcall D3DXMatrixLookAtLH(ptr ptr ptr ptr) d3dx10_43.D3DXMatrixLookAtLH +@ stdcall D3DXMatrixLookAtRH(ptr ptr ptr ptr) d3dx10_43.D3DXMatrixLookAtRH +@ stdcall D3DXMatrixMultiply(ptr ptr ptr) d3dx10_43.D3DXMatrixMultiply +@ stdcall D3DXMatrixMultiplyTranspose(ptr ptr ptr) d3dx10_43.D3DXMatrixMultiplyTranspose +@ stdcall D3DXMatrixOrthoLH(ptr long long long long) d3dx10_43.D3DXMatrixOrthoLH +@ stdcall D3DXMatrixOrthoOffCenterLH(ptr long long long long long long) d3dx10_43.D3DXMatrixOrthoOffCenterLH +@ stdcall D3DXMatrixOrthoOffCenterRH(ptr long long long long long long) d3dx10_43.D3DXMatrixOrthoOffCenterRH +@ stdcall D3DXMatrixOrthoRH(ptr long long long long) d3dx10_43.D3DXMatrixOrthoRH +@ stdcall D3DXMatrixPerspectiveFovLH(ptr long long long long) d3dx10_43.D3DXMatrixPerspectiveFovLH +@ stdcall D3DXMatrixPerspectiveFovRH(ptr long long long long) d3dx10_43.D3DXMatrixPerspectiveFovRH +@ stdcall D3DXMatrixPerspectiveLH(ptr long long long long) d3dx10_43.D3DXMatrixPerspectiveLH +@ stdcall D3DXMatrixPerspectiveOffCenterLH(ptr long long long long long long) d3dx10_43.D3DXMatrixPerspectiveOffCenterLH +@ stdcall D3DXMatrixPerspectiveOffCenterRH(ptr long long long long long long) d3dx10_43.D3DXMatrixPerspectiveOffCenterRH +@ stdcall D3DXMatrixPerspectiveRH(ptr long long long long) d3dx10_43.D3DXMatrixPerspectiveRH +@ stdcall D3DXMatrixReflect(ptr ptr) d3dx10_43.D3DXMatrixReflect +@ stdcall D3DXMatrixRotationAxis(ptr ptr long) d3dx10_43.D3DXMatrixRotationAxis +@ stdcall D3DXMatrixRotationQuaternion(ptr ptr) d3dx10_43.D3DXMatrixRotationQuaternion +@ stdcall D3DXMatrixRotationX(ptr long) d3dx10_43.D3DXMatrixRotationX +@ stdcall D3DXMatrixRotationY(ptr long) d3dx10_43.D3DXMatrixRotationY +@ stdcall D3DXMatrixRotationYawPitchRoll(ptr long long long) d3dx10_43.D3DXMatrixRotationYawPitchRoll +@ stdcall D3DXMatrixRotationZ(ptr long) d3dx10_43.D3DXMatrixRotationZ +@ stdcall D3DXMatrixScaling(ptr long long long) d3dx10_43.D3DXMatrixScaling +@ stdcall D3DXMatrixShadow(ptr ptr ptr) d3dx10_43.D3DXMatrixShadow +@ stdcall D3DXMatrixTransformation2D(ptr ptr long ptr ptr long ptr) d3dx10_43.D3DXMatrixTransformation2D +@ stdcall D3DXMatrixTransformation(ptr ptr ptr ptr ptr ptr ptr) d3dx10_43.D3DXMatrixTransformation +@ stdcall D3DXMatrixTranslation(ptr long long long) d3dx10_43.D3DXMatrixTranslation +@ stdcall D3DXMatrixTranspose(ptr ptr) d3dx10_43.D3DXMatrixTranspose +@ stdcall D3DXPlaneFromPointNormal(ptr ptr ptr) d3dx10_43.D3DXPlaneFromPointNormal +@ stdcall D3DXPlaneFromPoints(ptr ptr ptr ptr) d3dx10_43.D3DXPlaneFromPoints +@ stdcall D3DXPlaneIntersectLine(ptr ptr ptr ptr) d3dx10_43.D3DXPlaneIntersectLine +@ stdcall D3DXPlaneNormalize(ptr ptr) d3dx10_43.D3DXPlaneNormalize +@ stdcall D3DXPlaneTransform(ptr ptr ptr) d3dx10_43.D3DXPlaneTransform +@ stdcall D3DXPlaneTransformArray(ptr long ptr long ptr long) d3dx10_43.D3DXPlaneTransformArray +@ stdcall D3DXQuaternionBaryCentric(ptr ptr ptr ptr long long) d3dx10_43.D3DXQuaternionBaryCentric +@ stdcall D3DXQuaternionExp(ptr ptr) d3dx10_43.D3DXQuaternionExp +@ stdcall D3DXQuaternionInverse(ptr ptr) d3dx10_43.D3DXQuaternionInverse +@ stdcall D3DXQuaternionLn(ptr ptr) d3dx10_43.D3DXQuaternionLn +@ stdcall D3DXQuaternionMultiply(ptr ptr ptr) d3dx10_43.D3DXQuaternionMultiply +@ stdcall D3DXQuaternionNormalize(ptr ptr) d3dx10_43.D3DXQuaternionNormalize +@ stdcall D3DXQuaternionRotationAxis(ptr ptr long) d3dx10_43.D3DXQuaternionRotationAxis +@ stdcall D3DXQuaternionRotationMatrix(ptr ptr) d3dx10_43.D3DXQuaternionRotationMatrix +@ stdcall D3DXQuaternionRotationYawPitchRoll(ptr long long long) d3dx10_43.D3DXQuaternionRotationYawPitchRoll +@ stdcall D3DXQuaternionSlerp(ptr ptr ptr long) d3dx10_43.D3DXQuaternionSlerp +@ stdcall D3DXQuaternionSquad(ptr ptr ptr ptr ptr long) d3dx10_43.D3DXQuaternionSquad +@ stdcall D3DXQuaternionSquadSetup(ptr ptr ptr ptr ptr ptr ptr) d3dx10_43.D3DXQuaternionSquadSetup +@ stdcall D3DXQuaternionToAxisAngle(ptr ptr ptr) d3dx10_43.D3DXQuaternionToAxisAngle +@ stdcall D3DXSHAdd(ptr long ptr ptr) d3dx10_43.D3DXSHAdd +@ stdcall D3DXSHDot(long ptr ptr) d3dx10_43.D3DXSHDot +@ stdcall D3DXSHEvalConeLight(long ptr long long long long ptr ptr ptr) d3dx10_43.D3DXSHEvalConeLight +@ stdcall D3DXSHEvalDirection(ptr long ptr) d3dx10_43.D3DXSHEvalDirection +@ stdcall D3DXSHEvalDirectionalLight(long ptr long long long long ptr ptr ptr) d3dx10_43.D3DXSHEvalDirectionalLight +@ stdcall D3DXSHEvalHemisphereLight(long ptr long long ptr ptr ptr) d3dx10_43.D3DXSHEvalHemisphereLight +@ stdcall D3DXSHEvalSphericalLight(long ptr long long long long ptr ptr ptr) d3dx10_43.D3DXSHEvalSphericalLight +@ stdcall D3DXSHMultiply2(ptr ptr ptr) d3dx10_43.D3DXSHMultiply2 +@ stdcall D3DXSHMultiply3(ptr ptr ptr) d3dx10_43.D3DXSHMultiply3 +@ stdcall D3DXSHMultiply4(ptr ptr ptr) d3dx10_43.D3DXSHMultiply4 +@ stdcall D3DXSHMultiply5(ptr ptr ptr) d3dx10_43.D3DXSHMultiply5 +@ stdcall D3DXSHMultiply6(ptr ptr ptr) d3dx10_43.D3DXSHMultiply6 +@ stdcall D3DXSHRotate(ptr long ptr ptr) d3dx10_43.D3DXSHRotate +@ stdcall D3DXSHRotateZ(ptr long long ptr) d3dx10_43.D3DXSHRotateZ +@ stdcall D3DXSHScale(ptr long ptr ptr) d3dx10_43.D3DXSHScale +@ stdcall D3DXSphereBoundProbe(ptr long ptr ptr) d3dx10_43.D3DXSphereBoundProbe +@ stdcall D3DXVec2BaryCentric(ptr ptr ptr ptr long long) d3dx10_43.D3DXVec2BaryCentric +@ stdcall D3DXVec2CatmullRom(ptr ptr ptr ptr ptr long) d3dx10_43.D3DXVec2CatmullRom +@ stdcall D3DXVec2Hermite(ptr ptr ptr ptr ptr long) d3dx10_43.D3DXVec2Hermite +@ stdcall D3DXVec2Normalize(ptr ptr) d3dx10_43.D3DXVec2Normalize +@ stdcall D3DXVec2Transform(ptr ptr ptr) d3dx10_43.D3DXVec2Transform +@ stdcall D3DXVec2TransformArray(ptr long ptr long ptr long) d3dx10_43.D3DXVec2TransformArray +@ stdcall D3DXVec2TransformCoord(ptr ptr ptr) d3dx10_43.D3DXVec2TransformCoord +@ stdcall D3DXVec2TransformCoordArray(ptr long ptr long ptr long) d3dx10_43.D3DXVec2TransformCoordArray +@ stdcall D3DXVec2TransformNormal(ptr ptr ptr) d3dx10_43.D3DXVec2TransformNormal +@ stdcall D3DXVec2TransformNormalArray(ptr long ptr long ptr long) d3dx10_43.D3DXVec2TransformNormalArray +@ stdcall D3DXVec3BaryCentric(ptr ptr ptr ptr long long) d3dx10_43.D3DXVec3BaryCentric +@ stdcall D3DXVec3CatmullRom(ptr ptr ptr ptr ptr long) d3dx10_43.D3DXVec3CatmullRom +@ stdcall D3DXVec3Hermite(ptr ptr ptr ptr ptr long) d3dx10_43.D3DXVec3Hermite +@ stdcall D3DXVec3Normalize(ptr ptr) d3dx10_43.D3DXVec3Normalize +@ stdcall D3DXVec3Project(ptr ptr ptr ptr ptr ptr) d3dx10_43.D3DXVec3Project +@ stdcall D3DXVec3ProjectArray(ptr long ptr long ptr ptr ptr ptr long) d3dx10_43.D3DXVec3ProjectArray +@ stdcall D3DXVec3Transform(ptr ptr ptr) d3dx10_43.D3DXVec3Transform +@ stdcall D3DXVec3TransformArray(ptr long ptr long ptr long) d3dx10_43.D3DXVec3TransformArray +@ stdcall D3DXVec3TransformCoord(ptr ptr ptr) d3dx10_43.D3DXVec3TransformCoord +@ stdcall D3DXVec3TransformCoordArray(ptr long ptr long ptr long) d3dx10_43.D3DXVec3TransformCoordArray +@ stdcall D3DXVec3TransformNormal(ptr ptr ptr) d3dx10_43.D3DXVec3TransformNormal +@ stdcall D3DXVec3TransformNormalArray(ptr long ptr long ptr long) d3dx10_43.D3DXVec3TransformNormalArray +@ stdcall D3DXVec3Unproject(ptr ptr ptr ptr ptr ptr) d3dx10_43.D3DXVec3Unproject +@ stdcall D3DXVec3UnprojectArray(ptr long ptr long ptr ptr ptr ptr long) d3dx10_43.D3DXVec3UnprojectArray +@ stdcall D3DXVec4BaryCentric(ptr ptr ptr ptr long long) d3dx10_43.D3DXVec4BaryCentric +@ stdcall D3DXVec4CatmullRom(ptr ptr ptr ptr ptr long) d3dx10_43.D3DXVec4CatmullRom +@ stdcall D3DXVec4Cross(ptr ptr ptr ptr) d3dx10_43.D3DXVec4Cross +@ stdcall D3DXVec4Hermite(ptr ptr ptr ptr ptr long) d3dx10_43.D3DXVec4Hermite +@ stdcall D3DXVec4Normalize(ptr ptr) d3dx10_43.D3DXVec4Normalize +@ stdcall D3DXVec4Transform(ptr ptr ptr) d3dx10_43.D3DXVec4Transform +@ stdcall D3DXVec4TransformArray(ptr long ptr long ptr long) d3dx10_43.D3DXVec4TransformArray diff -Nru wine1.3-1.3.0/dlls/d3dx10_42/Makefile.in wine1.3-1.3.1/dlls/d3dx10_42/Makefile.in --- wine1.3-1.3.0/dlls/d3dx10_42/Makefile.in 1970-01-01 01:00:00.000000000 +0100 +++ wine1.3-1.3.1/dlls/d3dx10_42/Makefile.in 2010-08-20 18:23:50.000000000 +0100 @@ -0,0 +1,12 @@ +TOPSRCDIR = @top_srcdir@ +TOPOBJDIR = ../.. +SRCDIR = @srcdir@ +VPATH = @srcdir@ +MODULE = d3dx10_42.dll + +C_SRCS = \ + d3dx10_42_main.c + +RC_SRCS = version.rc + +@MAKE_DLL_RULES@ diff -Nru wine1.3-1.3.0/dlls/d3dx10_42/version.rc wine1.3-1.3.1/dlls/d3dx10_42/version.rc --- wine1.3-1.3.0/dlls/d3dx10_42/version.rc 1970-01-01 01:00:00.000000000 +0100 +++ wine1.3-1.3.1/dlls/d3dx10_42/version.rc 2010-08-20 18:23:50.000000000 +0100 @@ -0,0 +1,26 @@ +/* + * Copyright 2010 Owen Rudge for 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 + */ + +#define WINE_FILEDESCRIPTION_STR "Wine D3DX10" +#define WINE_FILENAME_STR "d3dx10_42.dll" +#define WINE_FILEVERSION 9,29,952,3001 +#define WINE_FILEVERSION_STR "9.29.952.3001" +#define WINE_PRODUCTVERSION 9,29,952,3001 +#define WINE_PRODUCTVERSION_STR "9.29.952.3001" + +#include "wine/wine_common_ver.rc" diff -Nru wine1.3-1.3.0/dlls/d3dx10_43/d3dx10_43_main.c wine1.3-1.3.1/dlls/d3dx10_43/d3dx10_43_main.c --- wine1.3-1.3.0/dlls/d3dx10_43/d3dx10_43_main.c 1970-01-01 01:00:00.000000000 +0100 +++ wine1.3-1.3.1/dlls/d3dx10_43/d3dx10_43_main.c 2010-08-20 18:23:50.000000000 +0100 @@ -0,0 +1,63 @@ +/* + * D3DX10 main file + * + * Copyright (c) 2010 Owen Rudge for 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 "wine/port.h" + +#include + +#define COBJMACROS + +#include "windef.h" +#include "winbase.h" +#include "winuser.h" +#include "objbase.h" + +#include "d3d10.h" + +BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved) +{ + switch (fdwReason) + { + case DLL_WINE_PREATTACH: + return FALSE; /* prefer native version */ + case DLL_PROCESS_ATTACH: + DisableThreadLibraryCalls(hinstDLL); + break; + case DLL_PROCESS_DETACH: + break; + } + + return TRUE; +} + +/*********************************************************************** + * D3DX10CheckVersion + * + * Checks whether we are compiling against the correct d3d and d3dx library. + */ +BOOL WINAPI D3DX10CheckVersion(UINT d3dsdkvers, UINT d3dxsdkvers) +{ + if ((d3dsdkvers == D3D10_SDK_VERSION) && (d3dxsdkvers == 43)) + return TRUE; + + return FALSE; +} diff -Nru wine1.3-1.3.0/dlls/d3dx10_43/d3dx10_43.spec wine1.3-1.3.1/dlls/d3dx10_43/d3dx10_43.spec --- wine1.3-1.3.0/dlls/d3dx10_43/d3dx10_43.spec 1970-01-01 01:00:00.000000000 +0100 +++ wine1.3-1.3.1/dlls/d3dx10_43/d3dx10_43.spec 2010-08-20 18:23:50.000000000 +0100 @@ -0,0 +1,176 @@ +@ stub D3DX10CreateThreadPump +@ stdcall D3DX10CheckVersion(long long) +@ stub D3DX10CompileFromFileA +@ stub D3DX10CompileFromFileW +@ stub D3DX10CompileFromMemory +@ stub D3DX10CompileFromResourceA +@ stub D3DX10CompileFromResourceW +@ stub D3DX10ComputeNormalMap +@ stub D3DX10CreateAsyncCompilerProcessor +@ stub D3DX10CreateAsyncEffectCreateProcessor +@ stub D3DX10CreateAsyncEffectPoolCreateProcessor +@ stub D3DX10CreateAsyncFileLoaderA +@ stub D3DX10CreateAsyncFileLoaderW +@ stub D3DX10CreateAsyncMemoryLoader +@ stub D3DX10CreateAsyncResourceLoaderA +@ stub D3DX10CreateAsyncResourceLoaderW +@ stub D3DX10CreateAsyncShaderPreprocessProcessor +@ stub D3DX10CreateAsyncShaderResourceViewProcessor +@ stub D3DX10CreateAsyncTextureInfoProcessor +@ stub D3DX10CreateAsyncTextureProcessor +@ stub D3DX10CreateDevice +@ stub D3DX10CreateDeviceAndSwapChain +@ stub D3DX10CreateEffectFromFileA +@ stub D3DX10CreateEffectFromFileW +@ stub D3DX10CreateEffectFromMemory +@ stub D3DX10CreateEffectFromResourceA +@ stub D3DX10CreateEffectFromResourceW +@ stub D3DX10CreateEffectPoolFromFileA +@ stub D3DX10CreateEffectPoolFromFileW +@ stub D3DX10CreateEffectPoolFromMemory +@ stub D3DX10CreateEffectPoolFromResourceA +@ stub D3DX10CreateEffectPoolFromResourceW +@ stub D3DX10CreateFontA +@ stub D3DX10CreateFontIndirectA +@ stub D3DX10CreateFontIndirectW +@ stub D3DX10CreateFontW +@ stub D3DX10CreateMesh +@ stub D3DX10CreateShaderResourceViewFromFileA +@ stub D3DX10CreateShaderResourceViewFromFileW +@ stub D3DX10CreateShaderResourceViewFromMemory +@ stub D3DX10CreateShaderResourceViewFromResourceA +@ stub D3DX10CreateShaderResourceViewFromResourceW +@ stub D3DX10CreateSkinInfo +@ stub D3DX10CreateSprite +@ stub D3DX10CreateTextureFromFileA +@ stub D3DX10CreateTextureFromFileW +@ stub D3DX10CreateTextureFromMemory +@ stub D3DX10CreateTextureFromResourceA +@ stub D3DX10CreateTextureFromResourceW +@ stub D3DX10FilterTexture +@ stub D3DX10GetFeatureLevel1 +@ stub D3DX10GetImageInfoFromFileA +@ stub D3DX10GetImageInfoFromFileW +@ stub D3DX10GetImageInfoFromMemory +@ stub D3DX10GetImageInfoFromResourceA +@ stub D3DX10GetImageInfoFromResourceW +@ stub D3DX10LoadTextureFromTexture +@ stub D3DX10PreprocessShaderFromFileA +@ stub D3DX10PreprocessShaderFromFileW +@ stub D3DX10PreprocessShaderFromMemory +@ stub D3DX10PreprocessShaderFromResourceA +@ stub D3DX10PreprocessShaderFromResourceW +@ stub D3DX10SHProjectCubeMap +@ stub D3DX10SaveTextureToFileA +@ stub D3DX10SaveTextureToFileW +@ stub D3DX10SaveTextureToMemory +@ stub D3DX10UnsetAllDeviceObjects +@ stdcall D3DXBoxBoundProbe(ptr ptr ptr ptr) d3dx9_36.D3DXBoxBoundProbe +@ stdcall D3DXColorAdjustContrast(ptr ptr long) d3dx9_36.3DXColorAdjustContrast +@ stdcall D3DXColorAdjustSaturation(ptr ptr long) d3dx9_36.D3DXColorAdjustSaturation +@ stdcall D3DXComputeBoundingBox(ptr long long ptr ptr) d3dx9_36.D3DXComputeBoundingBox +@ stdcall D3DXComputeBoundingSphere(ptr long long ptr ptr) d3dx9_36.D3DXComputeBoundingSphere +@ stub D3DXCpuOptimizations +@ stdcall D3DXCreateMatrixStack(long ptr) d3dx9_36.D3DXCreateMatrixStack +@ stdcall D3DXFloat16To32Array(ptr ptr long) d3dx9_36.D3DXFloat16To32Array +@ stdcall D3DXFloat32To16Array(ptr ptr long) d3dx9_36.D3DXFloat32To16Array +@ stdcall D3DXFresnelTerm(long long) d3dx9_36.D3DXFresnelTerm +@ stdcall D3DXIntersectTri(ptr ptr ptr ptr ptr ptr ptr ptr) d3dx9_36.D3DXIntersectTri +@ stdcall D3DXMatrixAffineTransformation2D(ptr long ptr long ptr) d3dx9_36.D3DXMatrixAffineTransformation2D +@ stdcall D3DXMatrixAffineTransformation(ptr long ptr ptr ptr) d3dx9_36.D3DXMatrixAffineTransformation +@ stdcall D3DXMatrixDecompose(ptr ptr ptr ptr) d3dx9_36.D3DXMatrixDecompose +@ stdcall D3DXMatrixDeterminant(ptr) d3dx9_36.D3DXMatrixDeterminant +@ stdcall D3DXMatrixInverse(ptr ptr ptr) d3dx9_36.D3DXMatrixInverse +@ stdcall D3DXMatrixLookAtLH(ptr ptr ptr ptr) d3dx9_36.D3DXMatrixLookAtLH +@ stdcall D3DXMatrixLookAtRH(ptr ptr ptr ptr) d3dx9_36.D3DXMatrixLookAtRH +@ stdcall D3DXMatrixMultiply(ptr ptr ptr) d3dx9_36.D3DXMatrixMultiply +@ stdcall D3DXMatrixMultiplyTranspose(ptr ptr ptr) d3dx9_36.D3DXMatrixMultiplyTranspose +@ stdcall D3DXMatrixOrthoLH(ptr long long long long) d3dx9_36.D3DXMatrixOrthoLH +@ stdcall D3DXMatrixOrthoOffCenterLH(ptr long long long long long long) d3dx9_36.D3DXMatrixOrthoOffCenterLH +@ stdcall D3DXMatrixOrthoOffCenterRH(ptr long long long long long long) d3dx9_36.D3DXMatrixOrthoOffCenterRH +@ stdcall D3DXMatrixOrthoRH(ptr long long long long) d3dx9_36.D3DXMatrixOrthoRH +@ stdcall D3DXMatrixPerspectiveFovLH(ptr long long long long) d3dx9_36.D3DXMatrixPerspectiveFovLH +@ stdcall D3DXMatrixPerspectiveFovRH(ptr long long long long) d3dx9_36.D3DXMatrixPerspectiveFovRH +@ stdcall D3DXMatrixPerspectiveLH(ptr long long long long) d3dx9_36.D3DXMatrixPerspectiveLH +@ stdcall D3DXMatrixPerspectiveOffCenterLH(ptr long long long long long long) d3dx9_36.D3DXMatrixPerspectiveOffCenterLH +@ stdcall D3DXMatrixPerspectiveOffCenterRH(ptr long long long long long long) d3dx9_36.D3DXMatrixPerspectiveOffCenterRH +@ stdcall D3DXMatrixPerspectiveRH(ptr long long long long) d3dx9_36.D3DXMatrixPerspectiveRH +@ stdcall D3DXMatrixReflect(ptr ptr) d3dx9_36.D3DXMatrixReflect +@ stdcall D3DXMatrixRotationAxis(ptr ptr long) d3dx9_36.D3DXMatrixRotationAxis +@ stdcall D3DXMatrixRotationQuaternion(ptr ptr) d3dx9_36.D3DXMatrixRotationQuaternion +@ stdcall D3DXMatrixRotationX(ptr long) d3dx9_36.D3DXMatrixRotationX +@ stdcall D3DXMatrixRotationY(ptr long) d3dx9_36.D3DXMatrixRotationY +@ stdcall D3DXMatrixRotationYawPitchRoll(ptr long long long) d3dx9_36.D3DXMatrixRotationYawPitchRoll +@ stdcall D3DXMatrixRotationZ(ptr long) d3dx9_36.D3DXMatrixRotationZ +@ stdcall D3DXMatrixScaling(ptr long long long) d3dx9_36.D3DXMatrixScaling +@ stdcall D3DXMatrixShadow(ptr ptr ptr) d3dx9_36.D3DXMatrixShadow +@ stdcall D3DXMatrixTransformation2D(ptr ptr long ptr ptr long ptr) d3dx9_36.D3DXMatrixTransformation2D +@ stdcall D3DXMatrixTransformation(ptr ptr ptr ptr ptr ptr ptr) d3dx9_36.D3DXMatrixTransformation +@ stdcall D3DXMatrixTranslation(ptr long long long) d3dx9_36.D3DXMatrixTranslation +@ stdcall D3DXMatrixTranspose(ptr ptr) d3dx9_36.D3DXMatrixTranspose +@ stdcall D3DXPlaneFromPointNormal(ptr ptr ptr) d3dx9_36.D3DXPlaneFromPointNormal +@ stdcall D3DXPlaneFromPoints(ptr ptr ptr ptr) d3dx9_36.D3DXPlaneFromPoints +@ stdcall D3DXPlaneIntersectLine(ptr ptr ptr ptr) d3dx9_36.D3DXPlaneIntersectLine +@ stdcall D3DXPlaneNormalize(ptr ptr) d3dx9_36.D3DXPlaneNormalize +@ stdcall D3DXPlaneTransform(ptr ptr ptr) d3dx9_36.D3DXPlaneTransform +@ stdcall D3DXPlaneTransformArray(ptr long ptr long ptr long) d3dx9_36.D3DXPlaneTransformArray +@ stdcall D3DXQuaternionBaryCentric(ptr ptr ptr ptr long long) d3dx9_36.D3DXQuaternionBaryCentric +@ stdcall D3DXQuaternionExp(ptr ptr) d3dx9_36.D3DXQuaternionExp +@ stdcall D3DXQuaternionInverse(ptr ptr) d3dx9_36.D3DXQuaternionInverse +@ stdcall D3DXQuaternionLn(ptr ptr) d3dx9_36.D3DXQuaternionLn +@ stdcall D3DXQuaternionMultiply(ptr ptr ptr) d3dx9_36.D3DXQuaternionMultiply +@ stdcall D3DXQuaternionNormalize(ptr ptr) d3dx9_36.D3DXQuaternionNormalize +@ stdcall D3DXQuaternionRotationAxis(ptr ptr long) d3dx9_36.D3DXQuaternionRotationAxis +@ stdcall D3DXQuaternionRotationMatrix(ptr ptr) d3dx9_36.D3DXQuaternionRotationMatrix +@ stdcall D3DXQuaternionRotationYawPitchRoll(ptr long long long) d3dx9_36.D3DXQuaternionRotationYawPitchRoll +@ stdcall D3DXQuaternionSlerp(ptr ptr ptr long) d3dx9_36.D3DXQuaternionSlerp +@ stdcall D3DXQuaternionSquad(ptr ptr ptr ptr ptr long) d3dx9_36.D3DXQuaternionSquad +@ stdcall D3DXQuaternionSquadSetup(ptr ptr ptr ptr ptr ptr ptr) d3dx9_36.D3DXQuaternionSquadSetup +@ stdcall D3DXQuaternionToAxisAngle(ptr ptr ptr) d3dx9_36.D3DXQuaternionToAxisAngle +@ stdcall D3DXSHAdd(ptr long ptr ptr) d3dx9_36.D3DXSHAdd +@ stdcall D3DXSHDot(long ptr ptr) d3dx9_36.D3DXSHDot +@ stdcall D3DXSHEvalConeLight(long ptr long long long long ptr ptr ptr) d3dx9_36.D3DXSHEvalConeLight +@ stdcall D3DXSHEvalDirection(ptr long ptr) d3dx9_36.D3DXSHEvalDirection +@ stdcall D3DXSHEvalDirectionalLight(long ptr long long long long ptr ptr ptr) d3dx9_36.D3DXSHEvalDirectionalLight +@ stdcall D3DXSHEvalHemisphereLight(long ptr long long ptr ptr ptr) d3dx9_36.D3DXSHEvalHemisphereLight +@ stdcall D3DXSHEvalSphericalLight(long ptr long long long long ptr ptr ptr) d3dx9_36.D3DXSHEvalSphericalLight +@ stdcall D3DXSHMultiply2(ptr ptr ptr) d3dx9_36.D3DXSHMultiply2 +@ stdcall D3DXSHMultiply3(ptr ptr ptr) d3dx9_36.D3DXSHMultiply3 +@ stdcall D3DXSHMultiply4(ptr ptr ptr) d3dx9_36.D3DXSHMultiply4 +@ stdcall D3DXSHMultiply5(ptr ptr ptr) d3dx9_36.D3DXSHMultiply5 +@ stdcall D3DXSHMultiply6(ptr ptr ptr) d3dx9_36.D3DXSHMultiply6 +@ stdcall D3DXSHRotate(ptr long ptr ptr) d3dx9_36.D3DXSHRotate +@ stdcall D3DXSHRotateZ(ptr long long ptr) d3dx9_36.D3DXSHRotateZ +@ stdcall D3DXSHScale(ptr long ptr ptr) d3dx9_36.D3DXSHScale +@ stdcall D3DXSphereBoundProbe(ptr long ptr ptr) d3dx9_36.D3DXSphereBoundProbe +@ stdcall D3DXVec2BaryCentric(ptr ptr ptr ptr long long) d3dx9_36.D3DXVec2BaryCentric +@ stdcall D3DXVec2CatmullRom(ptr ptr ptr ptr ptr long) d3dx9_36.D3DXVec2CatmullRom +@ stdcall D3DXVec2Hermite(ptr ptr ptr ptr ptr long) d3dx9_36.D3DXVec2Hermite +@ stdcall D3DXVec2Normalize(ptr ptr) d3dx9_36.D3DXVec2Normalize +@ stdcall D3DXVec2Transform(ptr ptr ptr) d3dx9_36.D3DXVec2Transform +@ stdcall D3DXVec2TransformArray(ptr long ptr long ptr long) d3dx9_36.D3DXVec2TransformArray +@ stdcall D3DXVec2TransformCoord(ptr ptr ptr) d3dx9_36.D3DXVec2TransformCoord +@ stdcall D3DXVec2TransformCoordArray(ptr long ptr long ptr long) d3dx9_36.D3DXVec2TransformCoordArray +@ stdcall D3DXVec2TransformNormal(ptr ptr ptr) d3dx9_36.D3DXVec2TransformNormal +@ stdcall D3DXVec2TransformNormalArray(ptr long ptr long ptr long) d3dx9_36.D3DXVec2TransformNormalArray +@ stdcall D3DXVec3BaryCentric(ptr ptr ptr ptr long long) d3dx9_36.D3DXVec3BaryCentric +@ stdcall D3DXVec3CatmullRom(ptr ptr ptr ptr ptr long) d3dx9_36.D3DXVec3CatmullRom +@ stdcall D3DXVec3Hermite(ptr ptr ptr ptr ptr long) d3dx9_36.D3DXVec3Hermite +@ stdcall D3DXVec3Normalize(ptr ptr) d3dx9_36.D3DXVec3Normalize +@ stdcall D3DXVec3Project(ptr ptr ptr ptr ptr ptr) d3dx9_36.D3DXVec3Project +@ stdcall D3DXVec3ProjectArray(ptr long ptr long ptr ptr ptr ptr long) d3dx9_36.D3DXVec3ProjectArray +@ stdcall D3DXVec3Transform(ptr ptr ptr) d3dx9_36.D3DXVec3Transform +@ stdcall D3DXVec3TransformArray(ptr long ptr long ptr long) d3dx9_36.D3DXVec3TransformArray +@ stdcall D3DXVec3TransformCoord(ptr ptr ptr) d3dx9_36.D3DXVec3TransformCoord +@ stdcall D3DXVec3TransformCoordArray(ptr long ptr long ptr long) d3dx9_36.D3DXVec3TransformCoordArray +@ stdcall D3DXVec3TransformNormal(ptr ptr ptr) d3dx9_36.D3DXVec3TransformNormal +@ stdcall D3DXVec3TransformNormalArray(ptr long ptr long ptr long) d3dx9_36.D3DXVec3TransformNormalArray +@ stdcall D3DXVec3Unproject(ptr ptr ptr ptr ptr ptr) d3dx9_36.D3DXVec3Unproject +@ stdcall D3DXVec3UnprojectArray(ptr long ptr long ptr ptr ptr ptr long) d3dx9_36.D3DXVec3UnprojectArray +@ stdcall D3DXVec4BaryCentric(ptr ptr ptr ptr long long) d3dx9_36.D3DXVec4BaryCentric +@ stdcall D3DXVec4CatmullRom(ptr ptr ptr ptr ptr long) d3dx9_36.D3DXVec4CatmullRom +@ stdcall D3DXVec4Cross(ptr ptr ptr ptr) d3dx9_36.D3DXVec4Cross +@ stdcall D3DXVec4Hermite(ptr ptr ptr ptr ptr long) d3dx9_36.D3DXVec4Hermite +@ stdcall D3DXVec4Normalize(ptr ptr) d3dx9_36.D3DXVec4Normalize +@ stdcall D3DXVec4Transform(ptr ptr ptr) d3dx9_36.D3DXVec4Transform +@ stdcall D3DXVec4TransformArray(ptr long ptr long ptr long) d3dx9_36.D3DXVec4TransformArray diff -Nru wine1.3-1.3.0/dlls/d3dx10_43/Makefile.in wine1.3-1.3.1/dlls/d3dx10_43/Makefile.in --- wine1.3-1.3.0/dlls/d3dx10_43/Makefile.in 1970-01-01 01:00:00.000000000 +0100 +++ wine1.3-1.3.1/dlls/d3dx10_43/Makefile.in 2010-08-20 18:23:50.000000000 +0100 @@ -0,0 +1,12 @@ +TOPSRCDIR = @top_srcdir@ +TOPOBJDIR = ../.. +SRCDIR = @srcdir@ +VPATH = @srcdir@ +MODULE = d3dx10_43.dll + +C_SRCS = \ + d3dx10_43_main.c + +RC_SRCS = version.rc + +@MAKE_DLL_RULES@ diff -Nru wine1.3-1.3.0/dlls/d3dx10_43/version.rc wine1.3-1.3.1/dlls/d3dx10_43/version.rc --- wine1.3-1.3.0/dlls/d3dx10_43/version.rc 1970-01-01 01:00:00.000000000 +0100 +++ wine1.3-1.3.1/dlls/d3dx10_43/version.rc 2010-08-20 18:23:50.000000000 +0100 @@ -0,0 +1,26 @@ +/* + * Copyright 2010 Owen Rudge for 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 + */ + +#define WINE_FILEDESCRIPTION_STR "Wine D3DX10" +#define WINE_FILENAME_STR "d3dx10_43.dll" +#define WINE_FILEVERSION 9,29,952,3111 +#define WINE_FILEVERSION_STR "9.29.952.3111" +#define WINE_PRODUCTVERSION 9,29,952,3111 +#define WINE_PRODUCTVERSION_STR "9.29.952.3111" + +#include "wine/wine_common_ver.rc" diff -Nru wine1.3-1.3.0/dlls/d3dx9_36/d3dx9_36.spec wine1.3-1.3.1/dlls/d3dx9_36/d3dx9_36.spec --- wine1.3-1.3.0/dlls/d3dx9_36/d3dx9_36.spec 2010-07-30 18:43:56.000000000 +0100 +++ wine1.3-1.3.1/dlls/d3dx9_36/d3dx9_36.spec 2010-08-20 18:23:50.000000000 +0100 @@ -71,7 +71,7 @@ @ stub D3DXCreateKeyframedAnimationSet @ stdcall D3DXCreateLine(ptr ptr) @ stdcall D3DXCreateMatrixStack(long ptr) -@ stub D3DXCreateMesh +@ stdcall D3DXCreateMesh(long long long ptr ptr ptr) @ stub D3DXCreateMeshFVF @ stub D3DXCreateNPatchMesh @ stub D3DXCreatePMeshFromStream @@ -139,7 +139,7 @@ @ stub D3DXFrameNumNamedMatrices @ stub D3DXFrameRegisterNamedMatrices @ stdcall D3DXFresnelTerm(long long) -@ stub D3DXFVFFromDeclarator +@ stdcall D3DXFVFFromDeclarator(ptr ptr) @ stub D3DXGatherFragments @ stub D3DXGatherFragmentsFromFileA @ stub D3DXGatherFragmentsFromFileW diff -Nru wine1.3-1.3.0/dlls/d3dx9_36/mesh.c wine1.3-1.3.1/dlls/d3dx9_36/mesh.c --- wine1.3-1.3.0/dlls/d3dx9_36/mesh.c 2010-07-30 18:43:56.000000000 +0100 +++ wine1.3-1.3.1/dlls/d3dx9_36/mesh.c 2010-08-20 18:23:50.000000000 +0100 @@ -1,6 +1,8 @@ /* * Mesh operations specific to D3DX9. * + * Copyright (C) 2005 Henri Verbeet + * Copyright (C) 2006 Ivan Gyurdiev * Copyright (C) 2009 David Adam * Copyright (C) 2010 Tony Wasserka * @@ -178,6 +180,16 @@ } /************************************************************************* + * D3DXFVFFromDeclarator + */ +HRESULT WINAPI D3DXFVFFromDeclarator(const LPD3DVERTEXELEMENT9 *declaration, DWORD *fvf) +{ + FIXME("(%p, %p): stub\n", declaration, fvf); + + return E_NOTIMPL; +} + +/************************************************************************* * D3DXGetFVFVertexSize */ static UINT Get_TexCoord_Size_From_FVF(DWORD FVF, int tex_num) @@ -328,6 +340,14 @@ return TRUE; } +HRESULT WINAPI D3DXCreateMesh(DWORD numfaces, DWORD numvertices, DWORD options, CONST LPD3DVERTEXELEMENT9 *declaration, + LPDIRECT3DDEVICE9 device, LPD3DXMESH *mesh) +{ + FIXME("(%d, %d, %d, %p, %p, %p): stub\n", numfaces, numvertices, options, declaration, device, mesh); + + return E_NOTIMPL; +} + HRESULT WINAPI D3DXCreateBox(LPDIRECT3DDEVICE9 device, FLOAT width, FLOAT height, FLOAT depth, LPD3DXMESH* mesh, LPD3DXBUFFER* adjacency) { diff -Nru wine1.3-1.3.0/dlls/d3dx9_36/surface.c wine1.3-1.3.1/dlls/d3dx9_36/surface.c --- wine1.3-1.3.0/dlls/d3dx9_36/surface.c 2010-07-30 18:43:56.000000000 +0100 +++ wine1.3-1.3.1/dlls/d3dx9_36/surface.c 2010-08-20 18:23:50.000000000 +0100 @@ -1,5 +1,5 @@ /* - * Copyright (C) 2009 Tony Wasserka + * Copyright (C) 2009-2010 Tony Wasserka * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public @@ -446,80 +446,154 @@ /************************************************************ - * copy_simple_data - * - * Copies the source buffer to the destination buffer, performing - * any necessary format conversion and color keying. - * Works only for ARGB formats with 1 - 4 bytes per pixel. + * helper functions for D3DXLoadSurfaceFromMemory */ -static void copy_simple_data(CONST BYTE *src, UINT srcpitch, POINT srcsize, CONST PixelFormatDesc *srcformat, - CONST BYTE *dest, UINT destpitch, POINT destsize, CONST PixelFormatDesc *destformat, - DWORD dwFilter) +struct argb_conversion_info { + CONST PixelFormatDesc *srcformat; + CONST PixelFormatDesc *destformat; DWORD srcshift[4], destshift[4]; DWORD srcmask[4], destmask[4]; BOOL process_channel[4]; - DWORD channels[4]; - DWORD channelmask = 0; + DWORD channelmask; +}; - UINT minwidth, minheight; - BYTE *srcptr, *destptr; - UINT i, x, y; +static void init_argb_conversion_info(CONST PixelFormatDesc *srcformat, CONST PixelFormatDesc *destformat, struct argb_conversion_info *info) +{ + UINT i; + ZeroMemory(info->process_channel, 4 * sizeof(BOOL)); + info->channelmask = 0; - ZeroMemory(channels, sizeof(channels)); - ZeroMemory(process_channel, sizeof(process_channel)); + info->srcformat = srcformat; + info->destformat = destformat; for(i = 0;i < 4;i++) { /* srcshift is used to extract the _relevant_ components */ - srcshift[i] = srcformat->shift[i] + max( srcformat->bits[i] - destformat->bits[i], 0); + info->srcshift[i] = srcformat->shift[i] + max( srcformat->bits[i] - destformat->bits[i], 0); /* destshift is used to move the components to the correct position */ - destshift[i] = destformat->shift[i] + max(destformat->bits[i] - srcformat->bits[i], 0); + info->destshift[i] = destformat->shift[i] + max(destformat->bits[i] - srcformat->bits[i], 0); - srcmask[i] = ((1 << srcformat->bits[i]) - 1) << srcformat->shift[i]; - destmask[i] = ((1 << destformat->bits[i]) - 1) << destformat->shift[i]; + info->srcmask[i] = ((1 << srcformat->bits[i]) - 1) << srcformat->shift[i]; + info->destmask[i] = ((1 << destformat->bits[i]) - 1) << destformat->shift[i]; /* channelmask specifies bits which aren't used in the source format but in the destination one */ if(destformat->bits[i]) { - if(srcformat->bits[i]) process_channel[i] = TRUE; - else channelmask |= destmask[i]; + if(srcformat->bits[i]) info->process_channel[i] = TRUE; + else info->channelmask |= info->destmask[i]; + } + } +} + +/************************************************************ + * get_relevant_argb_components + * + * Extracts the relevant components from the source color and + * drops the less significant bits if they aren't used by the destination format. + */ +static void get_relevant_argb_components(CONST struct argb_conversion_info *info, CONST DWORD col, DWORD *out) +{ + UINT i = 0; + for(;i < 4;i++) + if(info->process_channel[i]) + out[i] = (col & info->srcmask[i]) >> info->srcshift[i]; +} + +/************************************************************ + * make_argb_color + * + * Recombines the output of get_relevant_argb_components and converts + * it to the destination format. + */ +static void make_argb_color(CONST struct argb_conversion_info *info, CONST DWORD *in, DWORD *out) +{ + UINT i; + *out = 0; + + for(i = 0;i < 4;i++) { + if(info->process_channel[i]) { + /* necessary to make sure that e.g. an X4R4G4B4 white maps to an R8G8B8 white instead of 0xf0f0f0 */ + signed int shift; + for(shift = info->destshift[i]; shift > info->destformat->shift[i]; shift -= info->srcformat->bits[i]) *out |= in[i] << shift; + *out |= (in[i] >> (info->destformat->shift[i] - shift)) << info->destformat->shift[i]; } } + *out |= info->channelmask; /* new channels are set to their maximal value */ +} + +/************************************************************ + * copy_simple_data + * + * Copies the source buffer to the destination buffer, performing + * any necessary format conversion and color keying. + * Works only for ARGB formats with 1 - 4 bytes per pixel. + */ +static void copy_simple_data(CONST BYTE *src, UINT srcpitch, POINT srcsize, CONST PixelFormatDesc *srcformat, + BYTE *dest, UINT destpitch, POINT destsize, CONST PixelFormatDesc *destformat) +{ + struct argb_conversion_info conv_info; + DWORD channels[4]; + UINT minwidth, minheight; + UINT x, y; + + ZeroMemory(channels, sizeof(channels)); + init_argb_conversion_info(srcformat, destformat, &conv_info); minwidth = (srcsize.x < destsize.x) ? srcsize.x : destsize.x; minheight = (srcsize.y < destsize.y) ? srcsize.y : destsize.y; for(y = 0;y < minheight;y++) { - srcptr = (BYTE*)( src + y * srcpitch); - destptr = (BYTE*)(dest + y * destpitch); + const BYTE *srcptr = src + y * srcpitch; + BYTE *destptr = dest + y * destpitch; for(x = 0;x < minwidth;x++) { /* extract source color components */ - if(srcformat->type == FORMAT_ARGB) { - const DWORD col = *(DWORD*)srcptr; - for(i = 0;i < 4;i++) - if(process_channel[i]) - channels[i] = (col & srcmask[i]) >> srcshift[i]; - } + if(srcformat->type == FORMAT_ARGB) get_relevant_argb_components(&conv_info, *(const DWORD*)srcptr, channels); /* recombine the components */ - if(destformat->type == FORMAT_ARGB) { - DWORD* const pixel = (DWORD*)destptr; - *pixel = 0; - - for(i = 0;i < 4;i++) { - if(process_channel[i]) { - /* necessary to make sure that e.g. an X4R4G4B4 white maps to an R8G8B8 white instead of 0xf0f0f0 */ - signed int shift; - for(shift = destshift[i]; shift > destformat->shift[i]; shift -= srcformat->bits[i]) *pixel |= channels[i] << shift; - *pixel |= (channels[i] >> (destformat->shift[i] - shift)) << destformat->shift[i]; - } - } - *pixel |= channelmask; /* new channels are set to their maximal value */ - } + if(destformat->type == FORMAT_ARGB) make_argb_color(&conv_info, channels, (DWORD*)destptr); + srcptr += srcformat->bytes_per_pixel; destptr += destformat->bytes_per_pixel; } } + /* TODO: Black out unused pixels */ +} + +/************************************************************ + * point_filter_simple_data + * + * Copies the source buffer to the destination buffer, performing + * any necessary format conversion, color keying and stretching + * using a point filter. + * Works only for ARGB formats with 1 - 4 bytes per pixel. + */ +static void point_filter_simple_data(CONST BYTE *src, UINT srcpitch, POINT srcsize, CONST PixelFormatDesc *srcformat, + BYTE *dest, UINT destpitch, POINT destsize, CONST PixelFormatDesc *destformat) +{ + struct argb_conversion_info conv_info; + DWORD channels[4]; + + UINT x, y; + + ZeroMemory(channels, sizeof(channels)); + init_argb_conversion_info(srcformat, destformat, &conv_info); + + for(y = 0;y < destsize.y;y++) { + BYTE *destptr = dest + y * destpitch; + const BYTE *bufptr = src + srcpitch * (y * srcsize.y / destsize.y); + const BYTE *srcptr = bufptr; + + for(x = 0;x < destsize.x;x++) { + /* extract source color components */ + if(srcformat->type == FORMAT_ARGB) get_relevant_argb_components(&conv_info, *(const DWORD*)srcptr, channels); + + /* recombine the components */ + if(destformat->type == FORMAT_ARGB) make_argb_color(&conv_info, channels, (DWORD*)destptr); + + srcptr = bufptr + (x * srcsize.x / destsize.x) * srcformat->bytes_per_pixel; + destptr += destformat->bytes_per_pixel; + } + } } /************************************************************ @@ -544,7 +618,8 @@ * Success: D3D_OK, if we successfully load the pixel data into our surface or * if pSrcMemory is NULL but the other parameters are valid * Failure: D3DERR_INVALIDCALL, if pDestSurface, SrcPitch or pSrcRect are NULL or - * if SrcFormat is an invalid format (other than D3DFMT_UNKNOWN) + * if SrcFormat is an invalid format (other than D3DFMT_UNKNOWN) or + * if DestRect is invalid * D3DXERR_INVALIDDATA, if we fail to lock pDestSurface * E_FAIL, if SrcFormat is D3DFMT_UNKNOWN or the dimensions of pSrcRect are invalid * @@ -576,7 +651,7 @@ if( !pDestSurface || !pSrcMemory || !pSrcRect ) return D3DERR_INVALIDCALL; if(SrcFormat == D3DFMT_UNKNOWN || pSrcRect->left >= pSrcRect->right || pSrcRect->top >= pSrcRect->bottom) return E_FAIL; - if(dwFilter != D3DX_FILTER_NONE) return E_NOTIMPL; + if(dwFilter == D3DX_DEFAULT) dwFilter = D3DX_FILTER_TRIANGLE | D3DX_FILTER_DITHER; IDirect3DSurface9_GetDesc(pDestSurface, &surfdesc); @@ -591,16 +666,25 @@ destsize.x = surfdesc.Width; destsize.y = surfdesc.Height; } else { + if(pDestRect->left > pDestRect->right || pDestRect->right > surfdesc.Width) return D3DERR_INVALIDCALL; + if(pDestRect->top > pDestRect->bottom || pDestRect->bottom > surfdesc.Height) return D3DERR_INVALIDCALL; + if(pDestRect->left < 0 || pDestRect->top < 0) return D3DERR_INVALIDCALL; destsize.x = pDestRect->right - pDestRect->left; destsize.y = pDestRect->bottom - pDestRect->top; + if(destsize.x == 0 || destsize.y == 0) return D3D_OK; } hr = IDirect3DSurface9_LockRect(pDestSurface, &lockrect, pDestRect, 0); if(FAILED(hr)) return D3DXERR_INVALIDDATA; - copy_simple_data((CONST BYTE*)pSrcMemory, SrcPitch, srcsize, srcformatdesc, - (CONST BYTE*)lockrect.pBits, lockrect.Pitch, destsize, destformatdesc, - dwFilter); + if((dwFilter & 0xF) == D3DX_FILTER_NONE) { + copy_simple_data(pSrcMemory, SrcPitch, srcsize, srcformatdesc, + lockrect.pBits, lockrect.Pitch, destsize, destformatdesc); + } else /*if((dwFilter & 0xF) == D3DX_FILTER_POINT) */ { + /* always apply a point filter until D3DX_FILTER_LINEAR, D3DX_FILTER_TRIANGLE and D3DX_FILTER_BOX are implemented */ + point_filter_simple_data(pSrcMemory, SrcPitch, srcsize, srcformatdesc, + lockrect.pBits, lockrect.Pitch, destsize, destformatdesc); + } IDirect3DSurface9_UnlockRect(pDestSurface); return D3D_OK; diff -Nru wine1.3-1.3.0/dlls/d3dx9_36/tests/mesh.c wine1.3-1.3.1/dlls/d3dx9_36/tests/mesh.c --- wine1.3-1.3.0/dlls/d3dx9_36/tests/mesh.c 2010-07-30 18:43:56.000000000 +0100 +++ wine1.3-1.3.1/dlls/d3dx9_36/tests/mesh.c 2010-08-20 18:23:50.000000000 +0100 @@ -18,6 +18,7 @@ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */ +#include #include "wine/test.h" #include "d3dx9.h" @@ -37,6 +38,193 @@ return ( compare(u.x, v.x) && compare(u.y, v.y) && compare(u.z, v.z) ); } +struct vertex +{ + D3DXVECTOR3 position; + D3DXVECTOR3 normal; +}; + +typedef WORD face[3]; + +static BOOL compare_face(face a, face b) +{ + return (a[0]==b[0] && a[1] == b[1] && a[2] == b[2]); +} + +struct mesh +{ + DWORD number_of_vertices; + struct vertex *vertices; + + DWORD number_of_faces; + face *faces; +}; + +static void free_mesh(struct mesh *mesh) +{ + HeapFree(GetProcessHeap(), 0, mesh->faces); + HeapFree(GetProcessHeap(), 0, mesh->vertices); +} + +static BOOL new_mesh(struct mesh *mesh, DWORD number_of_vertices, DWORD number_of_faces) +{ + mesh->vertices = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, number_of_vertices * sizeof(*mesh->vertices)); + if (!mesh->vertices) + { + return FALSE; + } + mesh->number_of_vertices = number_of_vertices; + + mesh->faces = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, number_of_faces * sizeof(*mesh->faces)); + if (!mesh->faces) + { + HeapFree(GetProcessHeap(), 0, mesh->vertices); + return FALSE; + } + mesh->number_of_faces = number_of_faces; + + return TRUE; +} + +static void compare_mesh(const char *name, ID3DXMesh *d3dxmesh, struct mesh *mesh) +{ + HRESULT hr; + DWORD number_of_vertices, number_of_faces; + IDirect3DVertexBuffer9 *vertex_buffer; + IDirect3DIndexBuffer9 *index_buffer; + D3DVERTEXBUFFER_DESC vertex_buffer_description; + D3DINDEXBUFFER_DESC index_buffer_description; + struct vertex *vertices; + face *faces; + int expected, i; + + number_of_vertices = d3dxmesh->lpVtbl->GetNumVertices(d3dxmesh); + ok(number_of_vertices == mesh->number_of_vertices, "Test %s, result %u, expected %d\n", + name, number_of_vertices, mesh->number_of_vertices); + + number_of_faces = d3dxmesh->lpVtbl->GetNumFaces(d3dxmesh); + ok(number_of_faces == mesh->number_of_faces, "Test %s, result %u, expected %d\n", + name, number_of_faces, mesh->number_of_faces); + + /* vertex buffer */ + hr = d3dxmesh->lpVtbl->GetVertexBuffer(d3dxmesh, &vertex_buffer); + ok(hr == D3D_OK, "Test %s, result %x, expected 0 (D3D_OK)\n", name, hr); + + if (hr != D3D_OK) + { + skip("Couldn't get vertex buffer\n"); + } + else + { + hr = IDirect3DVertexBuffer9_GetDesc(vertex_buffer, &vertex_buffer_description); + ok(hr == D3D_OK, "Test %s, result %x, expected 0 (D3D_OK)\n", name, hr); + + if (hr != D3D_OK) + { + skip("Couldn't get vertex buffer description\n"); + } + else + { + ok(vertex_buffer_description.Format == D3DFMT_VERTEXDATA, "Test %s, result %x, expected %x (D3DFMT_VERTEXDATA)\n", + name, vertex_buffer_description.Format, D3DFMT_VERTEXDATA); + ok(vertex_buffer_description.Type == D3DRTYPE_VERTEXBUFFER, "Test %s, result %x, expected %x (D3DRTYPE_VERTEXBUFFER)\n", + name, vertex_buffer_description.Type, D3DRTYPE_VERTEXBUFFER); + ok(vertex_buffer_description.Usage == 0, "Test %s, result %x, expected %x\n", name, vertex_buffer_description.Usage, 0); + ok(vertex_buffer_description.Pool == D3DPOOL_MANAGED, "Test %s, result %x, expected %x (D3DPOOL_DEFAULT)\n", + name, vertex_buffer_description.Pool, D3DPOOL_DEFAULT); + expected = number_of_vertices * sizeof(D3DXVECTOR3) * 2; + ok(vertex_buffer_description.Size == expected, "Test %s, result %x, expected %x\n", + name, vertex_buffer_description.Size, expected); + ok(vertex_buffer_description.FVF == (D3DFVF_XYZ | D3DFVF_NORMAL), "Test %s, result %x, expected %x (D3DFVF_XYZ | D3DFVF_NORMAL)\n", + name, vertex_buffer_description.FVF, D3DFVF_XYZ | D3DFVF_NORMAL); + } + + /* specify offset and size to avoid potential overruns */ + hr = IDirect3DVertexBuffer9_Lock(vertex_buffer, 0, number_of_vertices * sizeof(D3DXVECTOR3) * 2, + (LPVOID *)&vertices, D3DLOCK_DISCARD); + ok(hr == D3D_OK, "Test %s, result %x, expected 0 (D3D_OK)\n", name, hr); + + if (hr != D3D_OK) + { + skip("Couldn't lock vertex buffer\n"); + } + else + { + for (i = 0; i < number_of_vertices; i++) + { + ok(compare_vec3(vertices[i].position, mesh->vertices[i].position), + "Test %s, vertex position %d, result (%g, %g, %g), expected (%g, %g, %g)\n", name, i, + vertices[i].position.x, vertices[i].position.y, vertices[i].position.z, + mesh->vertices[i].position.x, mesh->vertices[i].position.y, mesh->vertices[i].position.z); + ok(compare_vec3(vertices[i].normal, mesh->vertices[i].normal), + "Test %s, vertex normal %d, result (%g, %g, %g), expected (%g, %g, %g)\n", name, i, + vertices[i].normal.x, vertices[i].normal.y, vertices[i].normal.z, + mesh->vertices[i].normal.x, mesh->vertices[i].normal.y, mesh->vertices[i].normal.z); + } + + IDirect3DVertexBuffer9_Unlock(vertex_buffer); + } + + IDirect3DVertexBuffer9_Release(vertex_buffer); + } + + /* index buffer */ + hr = d3dxmesh->lpVtbl->GetIndexBuffer(d3dxmesh, &index_buffer); + ok(hr == D3D_OK, "Test %s, result %x, expected 0 (D3D_OK)\n", name, hr); + + if (!index_buffer) + { + skip("Couldn't get index buffer\n"); + } + else + { + hr = IDirect3DIndexBuffer9_GetDesc(index_buffer, &index_buffer_description); + ok(hr == D3D_OK, "Test %s, result %x, expected 0 (D3D_OK)\n", name, hr); + + if (hr != D3D_OK) + { + skip("Couldn't get index buffer description\n"); + } + else + { + ok(index_buffer_description.Format == D3DFMT_INDEX16, "Test %s, result %x, expected %x (D3DFMT_INDEX16)\n", + name, index_buffer_description.Format, D3DFMT_INDEX16); + ok(index_buffer_description.Type == D3DRTYPE_INDEXBUFFER, "Test %s, result %x, expected %x (D3DRTYPE_INDEXBUFFER)\n", + name, index_buffer_description.Type, D3DRTYPE_INDEXBUFFER); + ok(index_buffer_description.Usage == 0, "Test %s, result %x, expected %x\n", name, index_buffer_description.Usage, 0); + ok(index_buffer_description.Pool == D3DPOOL_MANAGED, "Test %s, result %x, expected %x (D3DPOOL_DEFAULT)\n", + name, index_buffer_description.Pool, D3DPOOL_DEFAULT); + expected = number_of_faces * sizeof(WORD) * 3; + ok(index_buffer_description.Size == expected, "Test %s, result %x, expected %x\n", + name, index_buffer_description.Size, expected); + } + + /* specify offset and size to avoid potential overruns */ + hr = IDirect3DIndexBuffer9_Lock(index_buffer, 0, number_of_faces * sizeof(WORD) * 3, + (LPVOID *)&faces, D3DLOCK_DISCARD); + ok(hr == D3D_OK, "Test %s, result %x, expected 0 (D3D_OK)\n", name, hr); + + if (hr != D3D_OK) + { + skip("Couldn't lock index buffer\n"); + } + else + { + for (i = 0; i < number_of_faces; i++) + { + ok(compare_face(faces[i], mesh->faces[i]), + "Test %s, face %d, result (%u, %u, %u), expected (%u, %u, %u)\n", name, i, + faces[i][0], faces[i][1], faces[i][2], + mesh->faces[i][0], mesh->faces[i][1], mesh->faces[i][2]); + } + + IDirect3DIndexBuffer9_Unlock(index_buffer); + } + + IDirect3DIndexBuffer9_Release(index_buffer); + } +} + static void D3DXBoundProbeTest(void) { BOOL result; @@ -322,6 +510,405 @@ } } +static inline void print_elements(const D3DVERTEXELEMENT9 *elements) +{ + D3DVERTEXELEMENT9 last = D3DDECL_END(); + const D3DVERTEXELEMENT9 *ptr = elements; + int count = 0; + + while (memcmp(ptr, &last, sizeof(D3DVERTEXELEMENT9))) + { + trace( + "[Element %d] Stream = %d, Offset = %d, Type = %d, Method = %d, Usage = %d, UsageIndex = %d\n", + count, ptr->Stream, ptr->Offset, ptr->Type, ptr->Method, ptr->Usage, ptr->UsageIndex); + ptr++; + count++; + } +} + +static inline void copy_elements(D3DVERTEXELEMENT9 *decl, const D3DVERTEXELEMENT9 *elements) +{ + unsigned int i; + D3DVERTEXELEMENT9 last = D3DDECL_END(); + int end1; + + for (i = 0; i < MAX_FVF_DECL_SIZE; i++) + { + memcpy(&decl[i], &elements[i], sizeof(D3DVERTEXELEMENT9)); + end1 = memcmp(&elements[i], &last, sizeof(D3DVERTEXELEMENT9)); + if (!end1) break; + } +} + +static void compare_elements(const D3DVERTEXELEMENT9 *elements, const D3DVERTEXELEMENT9 *expected_elements, + unsigned int line) +{ + unsigned int i; + D3DVERTEXELEMENT9 last = D3DDECL_END(); + int status, end1, end2; + + for (i = 0; i < MAX_FVF_DECL_SIZE; i++) + { + end1 = memcmp(&elements[i], &last, sizeof(D3DVERTEXELEMENT9)); + end2 = memcmp(&expected_elements[i], &last, sizeof(D3DVERTEXELEMENT9)); + + if (!end1 && !end2) break; + + status = ((end1 && !end2) || (!end1 && end2)); + ok (!status, "Mismatch in size, test declaration is %s than expected, line #%u\n", + (end1 && !end2) ? "shorter" : "longer", line); + if (status) { print_elements(elements); break; } + + status = memcmp(&elements[i], &expected_elements[i], sizeof(D3DVERTEXELEMENT9)); + ok (!status, "Mismatch in element %d, line #%u\n", i, line); + if (status) { print_elements(elements); break; } + } +} + +static void test_fvf_to_decl(DWORD test_fvf, const D3DVERTEXELEMENT9 expected_elements[], HRESULT expected_hr, + BOOL todo, unsigned int line) +{ + HRESULT hr; + D3DVERTEXELEMENT9 decl[MAX_FVF_DECL_SIZE]; + + hr = D3DXDeclaratorFromFVF(test_fvf, decl); + if (todo) todo_wine ok(hr == expected_hr, "D3DXDeclaratorFromFVF returned %#x, expected %#x, line #%u\n", + hr, expected_hr, line); + else ok(hr == expected_hr, "D3DXDeclaratorFromFVF returned %#x, expected %#x, line #%u\n", + hr, expected_hr, line); + if (SUCCEEDED(hr)) { compare_elements(decl, expected_elements, line); } +} + +static void test_decl_to_fvf(const D3DVERTEXELEMENT9 test_decl[], DWORD expected_fvf, HRESULT expected_hr, + BOOL todo, unsigned int line) +{ + HRESULT hr; + DWORD result_fvf = 0xdeadbeef; + D3DVERTEXELEMENT9 decl[MAX_FVF_DECL_SIZE]; + + copy_elements(decl, test_decl); + + hr = D3DXFVFFromDeclarator((D3DVERTEXELEMENT9 **)&decl, &result_fvf); + if (todo) todo_wine ok(hr == expected_hr, "D3DXFVFFromDeclarator returned %#x, expected %#x, line #%u\n", + hr, expected_hr, line); + else ok(hr == expected_hr, "D3DXFVFFromDeclarator returned %#x, expected %#x, line #%u\n", + hr, expected_hr, line); + if (SUCCEEDED(hr)) + { + ok(expected_fvf == result_fvf, "result FVF was %#x, expected %#x, line #%u\n", + result_fvf, expected_fvf, line); + } +} + +#define D3DFVF_RESERVED1 0x020 /* in d3dtypes.h */ + +static void test_fvf_decl_conversion(void) +{ + int i; + + /* Test conversions from vertex declaration to an FVF */ + { + CONST D3DVERTEXELEMENT9 test_buffer[] = + { { 0, 0, D3DDECLTYPE_FLOAT3, 0, D3DDECLUSAGE_POSITION, 0 }, D3DDECL_END() }; + test_decl_to_fvf(test_buffer, D3DFVF_XYZ, D3D_OK, TRUE, __LINE__); + } + { + CONST D3DVERTEXELEMENT9 test_buffer[] = + { { 0, 0, D3DDECLTYPE_FLOAT4, 0, D3DDECLUSAGE_POSITIONT, 0 }, D3DDECL_END() }; + test_decl_to_fvf(test_buffer, D3DFVF_XYZRHW, D3D_OK, TRUE, __LINE__); + } + for (i = 0; i < 4; i++) { + CONST D3DVERTEXELEMENT9 test_buffer[] = + { { 0, 0, D3DDECLTYPE_FLOAT1+i, 0, D3DDECLUSAGE_BLENDWEIGHT, 0}, D3DDECL_END() }; + test_decl_to_fvf(test_buffer, 0, D3DERR_INVALIDCALL, TRUE, __LINE__); + } + { + CONST D3DVERTEXELEMENT9 test_buffer[] = + { { 0, 0, D3DDECLTYPE_UBYTE4, 0, D3DDECLUSAGE_BLENDINDICES, 0}, D3DDECL_END() }; + test_decl_to_fvf(test_buffer, 0, D3DERR_INVALIDCALL, TRUE, __LINE__); + } + { + CONST D3DVERTEXELEMENT9 test_buffer[] = + { { 0, 0, D3DDECLTYPE_FLOAT3, 0, D3DDECLUSAGE_NORMAL, 0 }, D3DDECL_END() }; + test_decl_to_fvf(test_buffer, D3DFVF_NORMAL, D3D_OK, TRUE, __LINE__); + } + { + CONST D3DVERTEXELEMENT9 test_buffer[] = + { { 0, 0, D3DDECLTYPE_FLOAT1, 0, D3DDECLUSAGE_PSIZE, 0 }, D3DDECL_END() }; + test_decl_to_fvf(test_buffer, D3DFVF_RESERVED1, D3D_OK, TRUE, __LINE__); + } + { + CONST D3DVERTEXELEMENT9 test_buffer[] = + { { 0, 0, D3DDECLTYPE_D3DCOLOR, 0, D3DDECLUSAGE_COLOR, 0 }, D3DDECL_END() }; + test_decl_to_fvf(test_buffer, D3DFVF_DIFFUSE, D3D_OK, TRUE, __LINE__); + } + { + CONST D3DVERTEXELEMENT9 test_buffer[] = + { { 0, 0, D3DDECLTYPE_D3DCOLOR, 0, D3DDECLUSAGE_COLOR, 1 }, D3DDECL_END() }; + test_decl_to_fvf(test_buffer, D3DFVF_SPECULAR, D3D_OK, TRUE, __LINE__); + } + + /* Make sure textures of different sizes work */ + { + CONST D3DVERTEXELEMENT9 test_buffer[] = + { { 0, 0, D3DDECLTYPE_FLOAT1, 0, D3DDECLUSAGE_TEXCOORD, 0 }, D3DDECL_END() }; + test_decl_to_fvf(test_buffer, D3DFVF_TEX1 | D3DFVF_TEXCOORDSIZE1(0), + D3D_OK, TRUE, __LINE__); + } + { + CONST D3DVERTEXELEMENT9 test_buffer[] = + { { 0, 0, D3DDECLTYPE_FLOAT2, 0, D3DDECLUSAGE_TEXCOORD, 0 }, D3DDECL_END() }; + test_decl_to_fvf(test_buffer, D3DFVF_TEX1 | D3DFVF_TEXCOORDSIZE2(0), + D3D_OK, TRUE, __LINE__); + } + { + CONST D3DVERTEXELEMENT9 test_buffer[] = + { { 0, 0, D3DDECLTYPE_FLOAT3, 0, D3DDECLUSAGE_TEXCOORD, 0 }, D3DDECL_END() }; + test_decl_to_fvf(test_buffer, D3DFVF_TEX1 | D3DFVF_TEXCOORDSIZE3(0), + D3D_OK, TRUE, __LINE__); + } + { + CONST D3DVERTEXELEMENT9 test_buffer[] = + { { 0, 0, D3DDECLTYPE_FLOAT4, 0, D3DDECLUSAGE_TEXCOORD, 0 }, D3DDECL_END() }; + test_decl_to_fvf(test_buffer, D3DFVF_TEX1 | D3DFVF_TEXCOORDSIZE4(0), + D3D_OK, TRUE, __LINE__); + } + + /* Make sure the TEXCOORD index works correctly - try several textures */ + { + CONST D3DVERTEXELEMENT9 test_buffer[] = + { { 0, 0, D3DDECLTYPE_FLOAT1, 0, D3DDECLUSAGE_TEXCOORD, 0 }, + { 0, 4, D3DDECLTYPE_FLOAT3, 0, D3DDECLUSAGE_TEXCOORD, 1 }, + { 0, 16, D3DDECLTYPE_FLOAT2, 0, D3DDECLUSAGE_TEXCOORD, 2 }, + { 0, 24, D3DDECLTYPE_FLOAT4, 0, D3DDECLUSAGE_TEXCOORD, 3 }, D3DDECL_END() }; + test_decl_to_fvf(test_buffer, D3DFVF_TEX4 | + D3DFVF_TEXCOORDSIZE1(0) | D3DFVF_TEXCOORDSIZE2(2) | + D3DFVF_TEXCOORDSIZE3(1) | D3DFVF_TEXCOORDSIZE4(3), + D3D_OK, TRUE, __LINE__); + } + + /* Vary usage index */ + { + CONST D3DVERTEXELEMENT9 test_buffer[] = + { { 0, 0, D3DDECLTYPE_FLOAT3, 0, D3DDECLUSAGE_POSITION, 1 }, D3DDECL_END() }; + test_decl_to_fvf(test_buffer, D3DFVF_XYZ, D3D_OK, TRUE, __LINE__); + } + { + CONST D3DVERTEXELEMENT9 test_buffer[] = + { { 0, 0, D3DDECLTYPE_FLOAT3, 0, D3DDECLUSAGE_NORMAL, 1 }, D3DDECL_END() }; + test_decl_to_fvf(test_buffer, D3DFVF_NORMAL, D3D_OK, TRUE, __LINE__); + } + + /* Try empty declaration */ + { + CONST D3DVERTEXELEMENT9 test_buffer[] = { D3DDECL_END() }; + test_decl_to_fvf(test_buffer, 0, D3D_OK, TRUE, __LINE__); + } + + /* Now try a combination test */ + { + CONST D3DVERTEXELEMENT9 test_buffer[] = + { { 0, 0, D3DDECLTYPE_FLOAT3, 0, D3DDECLUSAGE_POSITIONT, 0 }, + { 0, 12, D3DDECLTYPE_FLOAT3, 0, D3DDECLUSAGE_NORMAL, 0 }, + { 0, 24, D3DDECLTYPE_FLOAT1, 0, D3DDECLUSAGE_PSIZE, 0 }, + { 0, 28, D3DDECLTYPE_D3DCOLOR, 0, D3DDECLUSAGE_COLOR, 1 }, + { 0, 32, D3DDECLTYPE_FLOAT1, 0, D3DDECLUSAGE_TEXCOORD, 0 }, + { 0, 44, D3DDECLTYPE_FLOAT4, 0, D3DDECLUSAGE_TEXCOORD, 1 }, D3DDECL_END() }; + test_decl_to_fvf(test_buffer, 0, D3DERR_INVALIDCALL, TRUE, __LINE__); + } + + /* Test conversions from FVF to a vertex declaration */ + { + CONST D3DVERTEXELEMENT9 test_buffer[] = + { { 0, 0, D3DDECLTYPE_FLOAT3, 0, D3DDECLUSAGE_POSITION, 0 }, D3DDECL_END() }; + test_fvf_to_decl(D3DFVF_XYZ, test_buffer, D3D_OK, TRUE, __LINE__); + } + { + CONST D3DVERTEXELEMENT9 test_buffer[] = + { { 0, 0, D3DDECLTYPE_FLOAT4, 0, D3DDECLUSAGE_POSITION, 0 }, D3DDECL_END() }; + test_fvf_to_decl(D3DFVF_XYZW, test_buffer, D3DERR_INVALIDCALL, TRUE, __LINE__); + } + { + CONST D3DVERTEXELEMENT9 test_buffer[] = + { { 0, 0, D3DDECLTYPE_FLOAT4, 0, D3DDECLUSAGE_POSITIONT, 0 }, D3DDECL_END() }; + test_fvf_to_decl(D3DFVF_XYZRHW, test_buffer, D3D_OK, TRUE, __LINE__); + } + { + CONST D3DVERTEXELEMENT9 test_buffer[] = + { { 0, 0, D3DDECLTYPE_FLOAT3, 0, D3DDECLUSAGE_POSITION, 0 }, + { 0, 12, D3DDECLTYPE_FLOAT4, 0, D3DDECLUSAGE_BLENDWEIGHT, 0 }, + { 0, 28, D3DDECLTYPE_UBYTE4, 0, D3DDECLUSAGE_BLENDINDICES, 0 }, D3DDECL_END() }; + test_fvf_to_decl(D3DFVF_XYZB5 | D3DFVF_LASTBETA_UBYTE4, test_buffer, D3D_OK, TRUE, __LINE__); + } + { + CONST D3DVERTEXELEMENT9 test_buffer[] = + { { 0, 0, D3DDECLTYPE_FLOAT3, 0, D3DDECLUSAGE_POSITION, 0 }, + { 0, 12, D3DDECLTYPE_FLOAT4, 0, D3DDECLUSAGE_BLENDWEIGHT, 0 }, + { 0, 28, D3DDECLTYPE_D3DCOLOR, 0, D3DDECLUSAGE_BLENDINDICES, 0 }, D3DDECL_END() }; + test_fvf_to_decl(D3DFVF_XYZB5 | D3DFVF_LASTBETA_D3DCOLOR, test_buffer, + D3D_OK, TRUE, __LINE__); + } + { + CONST D3DVERTEXELEMENT9 test_buffer[] = + { { 0, 0, D3DDECLTYPE_FLOAT3, 0, D3DDECLUSAGE_POSITION, 0 }, + { 0, 12, D3DDECLTYPE_FLOAT4, 0, D3DDECLUSAGE_BLENDWEIGHT, 0 }, + { 0, 28, D3DDECLTYPE_FLOAT1, 0, D3DDECLUSAGE_BLENDINDICES, 0 }, D3DDECL_END() }; + test_fvf_to_decl(D3DFVF_XYZB5, test_buffer, D3DERR_INVALIDCALL, TRUE, __LINE__); + } + { + CONST D3DVERTEXELEMENT9 test_buffer[] = + { { 0, 0, D3DDECLTYPE_FLOAT3, 0, D3DDECLUSAGE_POSITION, 0 }, + { 0, 12, D3DDECLTYPE_FLOAT1, 0, D3DDECLUSAGE_BLENDWEIGHT, 0 }, D3DDECL_END() }; + test_fvf_to_decl(D3DFVF_XYZB1, test_buffer, D3D_OK, TRUE, __LINE__); + } + { + CONST D3DVERTEXELEMENT9 test_buffer[] = + { { 0, 0, D3DDECLTYPE_FLOAT3, 0, D3DDECLUSAGE_POSITION, 0 }, + { 0, 12, D3DDECLTYPE_UBYTE4, 0, D3DDECLUSAGE_BLENDINDICES, 0 }, D3DDECL_END() }; + test_fvf_to_decl(D3DFVF_XYZB1 | D3DFVF_LASTBETA_UBYTE4, test_buffer, D3D_OK, TRUE, __LINE__); + } + { + CONST D3DVERTEXELEMENT9 test_buffer[] = + { { 0, 0, D3DDECLTYPE_FLOAT3, 0, D3DDECLUSAGE_POSITION, 0 }, + { 0, 12, D3DDECLTYPE_D3DCOLOR, 0, D3DDECLUSAGE_BLENDINDICES, 0 }, D3DDECL_END() }; + test_fvf_to_decl(D3DFVF_XYZB1 | D3DFVF_LASTBETA_D3DCOLOR, test_buffer, D3D_OK, TRUE, __LINE__); + } + { + CONST D3DVERTEXELEMENT9 test_buffer[] = + { { 0, 0, D3DDECLTYPE_FLOAT3, 0, D3DDECLUSAGE_POSITION, 0 }, + { 0, 12, D3DDECLTYPE_FLOAT2, 0, D3DDECLUSAGE_BLENDWEIGHT, 0 }, D3DDECL_END() }; + test_fvf_to_decl(D3DFVF_XYZB2, test_buffer, D3D_OK, TRUE, __LINE__); + } + { + CONST D3DVERTEXELEMENT9 test_buffer[] = + { { 0, 0, D3DDECLTYPE_FLOAT3, 0, D3DDECLUSAGE_POSITION, 0 }, + { 0, 12, D3DDECLTYPE_FLOAT1, 0, D3DDECLUSAGE_BLENDWEIGHT, 0 }, + { 0, 16, D3DDECLTYPE_UBYTE4, 0, D3DDECLUSAGE_BLENDINDICES, 0 }, D3DDECL_END() }; + test_fvf_to_decl(D3DFVF_XYZB2 | D3DFVF_LASTBETA_UBYTE4, test_buffer, + D3D_OK, TRUE, __LINE__); + } + { + CONST D3DVERTEXELEMENT9 test_buffer[] = + { { 0, 0, D3DDECLTYPE_FLOAT3, 0, D3DDECLUSAGE_POSITION, 0 }, + { 0, 12, D3DDECLTYPE_FLOAT1, 0, D3DDECLUSAGE_BLENDWEIGHT, 0 }, + { 0, 16, D3DDECLTYPE_D3DCOLOR, 0, D3DDECLUSAGE_BLENDINDICES, 0 }, D3DDECL_END() }; + test_fvf_to_decl(D3DFVF_XYZB2 | D3DFVF_LASTBETA_D3DCOLOR, test_buffer, + D3D_OK, TRUE, __LINE__); + } + { + CONST D3DVERTEXELEMENT9 test_buffer[] = + { { 0, 0, D3DDECLTYPE_FLOAT3, 0, D3DDECLUSAGE_POSITION, 0 }, + { 0, 12, D3DDECLTYPE_FLOAT3, 0, D3DDECLUSAGE_BLENDWEIGHT, 0 }, D3DDECL_END() }; + test_fvf_to_decl(D3DFVF_XYZB3, test_buffer, D3D_OK, TRUE, __LINE__); + } + { + CONST D3DVERTEXELEMENT9 test_buffer[] = + { { 0, 0, D3DDECLTYPE_FLOAT3, 0, D3DDECLUSAGE_POSITION, 0 }, + { 0, 12, D3DDECLTYPE_FLOAT2, 0, D3DDECLUSAGE_BLENDWEIGHT, 0 }, + { 0, 20, D3DDECLTYPE_UBYTE4, 0, D3DDECLUSAGE_BLENDINDICES, 0 }, D3DDECL_END() }; + test_fvf_to_decl(D3DFVF_XYZB3 | D3DFVF_LASTBETA_UBYTE4, test_buffer, + D3D_OK, TRUE, __LINE__); + } + { + CONST D3DVERTEXELEMENT9 test_buffer[] = + { { 0, 0, D3DDECLTYPE_FLOAT3, 0, D3DDECLUSAGE_POSITION, 0 }, + { 0, 12, D3DDECLTYPE_FLOAT2, 0, D3DDECLUSAGE_BLENDWEIGHT, 0 }, + { 0, 20, D3DDECLTYPE_D3DCOLOR, 0, D3DDECLUSAGE_BLENDINDICES, 0 }, D3DDECL_END() }; + test_fvf_to_decl(D3DFVF_XYZB3 | D3DFVF_LASTBETA_D3DCOLOR, test_buffer, + D3D_OK, TRUE, __LINE__); + } + { + CONST D3DVERTEXELEMENT9 test_buffer[] = + { { 0, 0, D3DDECLTYPE_FLOAT3, 0, D3DDECLUSAGE_POSITION, 0 }, + { 0, 12, D3DDECLTYPE_FLOAT4, 0, D3DDECLUSAGE_BLENDWEIGHT, 0 }, D3DDECL_END() }; + test_fvf_to_decl(D3DFVF_XYZB4, test_buffer, D3D_OK, TRUE, __LINE__); + } + { + CONST D3DVERTEXELEMENT9 test_buffer[] = + { { 0, 0, D3DDECLTYPE_FLOAT3, 0, D3DDECLUSAGE_POSITION, 0 }, + { 0, 12, D3DDECLTYPE_FLOAT3, 0, D3DDECLUSAGE_BLENDWEIGHT, 0 }, + { 0, 24, D3DDECLTYPE_UBYTE4, 0, D3DDECLUSAGE_BLENDINDICES, 0 }, D3DDECL_END() }; + test_fvf_to_decl(D3DFVF_XYZB4 | D3DFVF_LASTBETA_UBYTE4, test_buffer, + D3D_OK, TRUE, __LINE__); + } + { + CONST D3DVERTEXELEMENT9 test_buffer[] = + { { 0, 0, D3DDECLTYPE_FLOAT3, 0, D3DDECLUSAGE_POSITION, 0 }, + { 0, 12, D3DDECLTYPE_FLOAT3, 0, D3DDECLUSAGE_BLENDWEIGHT, 0 }, + { 0, 24, D3DDECLTYPE_D3DCOLOR, 0, D3DDECLUSAGE_BLENDINDICES, 0 }, D3DDECL_END() }; + test_fvf_to_decl(D3DFVF_XYZB4 | D3DFVF_LASTBETA_D3DCOLOR, test_buffer, D3D_OK, TRUE, __LINE__); + } + { + CONST D3DVERTEXELEMENT9 test_buffer[] = + { { 0, 0, D3DDECLTYPE_FLOAT3, 0, D3DDECLUSAGE_NORMAL, 0 }, D3DDECL_END() }; + test_fvf_to_decl(D3DFVF_NORMAL, test_buffer, D3D_OK, TRUE, __LINE__); + } + { + CONST D3DVERTEXELEMENT9 test_buffer[] = + { { 0, 0, D3DDECLTYPE_FLOAT1, 0, D3DDECLUSAGE_PSIZE, 0 }, D3DDECL_END() }; + test_fvf_to_decl(D3DFVF_PSIZE, test_buffer, D3D_OK, TRUE, __LINE__); + } + { + CONST D3DVERTEXELEMENT9 test_buffer[] = + { { 0, 0, D3DDECLTYPE_D3DCOLOR, 0, D3DDECLUSAGE_COLOR, 0 }, D3DDECL_END() }; + test_fvf_to_decl(D3DFVF_DIFFUSE, test_buffer, D3D_OK, TRUE, __LINE__); + } + { + CONST D3DVERTEXELEMENT9 test_buffer[] = + { { 0, 0, D3DDECLTYPE_D3DCOLOR, 0, D3DDECLUSAGE_COLOR, 1 }, D3DDECL_END() }; + test_fvf_to_decl(D3DFVF_SPECULAR, test_buffer, D3D_OK, TRUE, __LINE__); + } + + /* Make sure textures of different sizes work */ + { + CONST D3DVERTEXELEMENT9 test_buffer[] = + { { 0, 0, D3DDECLTYPE_FLOAT1, 0, D3DDECLUSAGE_TEXCOORD, 0 }, D3DDECL_END() }; + test_fvf_to_decl(D3DFVF_TEXCOORDSIZE1(0) | D3DFVF_TEX1, test_buffer, + D3D_OK, TRUE, __LINE__); + } + { + CONST D3DVERTEXELEMENT9 test_buffer[] = + { { 0, 0, D3DDECLTYPE_FLOAT2, 0, D3DDECLUSAGE_TEXCOORD, 0 }, D3DDECL_END() }; + test_fvf_to_decl(D3DFVF_TEXCOORDSIZE2(0) | D3DFVF_TEX1, test_buffer, D3D_OK, TRUE, __LINE__); + } + { + CONST D3DVERTEXELEMENT9 test_buffer[] = + { { 0, 0, D3DDECLTYPE_FLOAT3, 0, D3DDECLUSAGE_TEXCOORD, 0 }, D3DDECL_END() }; + test_fvf_to_decl(D3DFVF_TEXCOORDSIZE3(0) | D3DFVF_TEX1, test_buffer, D3D_OK, TRUE, __LINE__); + } + { + CONST D3DVERTEXELEMENT9 test_buffer[] = + { { 0, 0, D3DDECLTYPE_FLOAT4, 0, D3DDECLUSAGE_TEXCOORD, 0 }, D3DDECL_END() }; + test_fvf_to_decl(D3DFVF_TEXCOORDSIZE4(0) | D3DFVF_TEX1, test_buffer, D3D_OK, TRUE, __LINE__); + } + + /* Make sure the TEXCOORD index works correctly - try several textures */ + { + CONST D3DVERTEXELEMENT9 test_buffer[] = + { { 0, 0, D3DDECLTYPE_FLOAT1, 0, D3DDECLUSAGE_TEXCOORD, 0 }, + { 0, 4, D3DDECLTYPE_FLOAT3, 0, D3DDECLUSAGE_TEXCOORD, 1 }, + { 0, 16, D3DDECLTYPE_FLOAT2, 0, D3DDECLUSAGE_TEXCOORD, 2 }, + { 0, 24, D3DDECLTYPE_FLOAT4, 0, D3DDECLUSAGE_TEXCOORD, 3 }, D3DDECL_END() }; + test_fvf_to_decl(D3DFVF_TEXCOORDSIZE1(0) | D3DFVF_TEXCOORDSIZE3(1) | + D3DFVF_TEXCOORDSIZE2(2) | D3DFVF_TEXCOORDSIZE4(3) | D3DFVF_TEX4, + test_buffer, D3D_OK, TRUE, __LINE__); + } + + /* Now try a combination test */ + { + CONST D3DVERTEXELEMENT9 test_buffer[] = + { { 0, 0, D3DDECLTYPE_FLOAT3, 0, D3DDECLUSAGE_POSITION, 0 }, + { 0, 12, D3DDECLTYPE_FLOAT4, 0, D3DDECLUSAGE_BLENDWEIGHT, 0 }, + { 0, 28, D3DDECLTYPE_D3DCOLOR, 0, D3DDECLUSAGE_COLOR, 0 }, + { 0, 32, D3DDECLTYPE_D3DCOLOR, 0, D3DDECLUSAGE_COLOR, 1 }, + { 0, 36, D3DDECLTYPE_FLOAT2, 0, D3DDECLUSAGE_TEXCOORD, 0 }, + { 0, 44, D3DDECLTYPE_FLOAT3, 0, D3DDECLUSAGE_TEXCOORD, 1 }, D3DDECL_END() }; + test_fvf_to_decl(D3DFVF_XYZB4 | D3DFVF_SPECULAR | D3DFVF_DIFFUSE | + D3DFVF_TEXCOORDSIZE2(0) | D3DFVF_TEXCOORDSIZE3(1) | D3DFVF_TEX2, + test_buffer, D3D_OK, TRUE, __LINE__); + } +} + static void D3DXGetFVFVertexSizeTest(void) { UINT got; @@ -479,6 +1066,356 @@ ok( got_res == exp_res, "Expected result = %d, got %d\n",exp_res,got_res); } +static void D3DXCreateMeshTest(void) +{ + HRESULT hr; + HWND wnd; + IDirect3D9 *d3d; + IDirect3DDevice9 *device, *test_device; + D3DPRESENT_PARAMETERS d3dpp; + ID3DXMesh *d3dxmesh; + int i, size; + D3DVERTEXELEMENT9 test_decl[MAX_FVF_DECL_SIZE]; + DWORD fvf, options; + struct mesh mesh; + + static const D3DVERTEXELEMENT9 decl[3] = { + {0, 0, D3DDECLTYPE_FLOAT3, D3DDECLMETHOD_DEFAULT, D3DDECLUSAGE_POSITION, 0}, + {0, 0xC, D3DDECLTYPE_FLOAT3, D3DDECLMETHOD_DEFAULT, D3DDECLUSAGE_NORMAL, 0}, + D3DDECL_END(), }; + + hr = D3DXCreateMesh(0, 0, 0, NULL, NULL, NULL); + todo_wine ok(hr == D3DERR_INVALIDCALL, "Got result %x, expected %x (D3DERR_INVALIDCALL)\n", hr, D3DERR_INVALIDCALL); + + hr = D3DXCreateMesh(1, 3, D3DXMESH_MANAGED, (LPD3DVERTEXELEMENT9 *)&decl, NULL, &d3dxmesh); + todo_wine ok(hr == D3DERR_INVALIDCALL, "Got result %x, expected %x (D3DERR_INVALIDCALL)\n", hr, D3DERR_INVALIDCALL); + + wnd = CreateWindow("static", "d3dx9_test", 0, 0, 0, 0, 0, NULL, NULL, NULL, NULL); + if (!wnd) + { + skip("Couldn't create application window\n"); + return; + } + d3d = Direct3DCreate9(D3D_SDK_VERSION); + if (!d3d) + { + skip("Couldn't create IDirect3D9 object\n"); + DestroyWindow(wnd); + return; + } + + ZeroMemory(&d3dpp, sizeof(d3dpp)); + d3dpp.Windowed = TRUE; + d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD; + hr = IDirect3D9_CreateDevice(d3d, D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, wnd, D3DCREATE_MIXED_VERTEXPROCESSING, &d3dpp, &device); + if (FAILED(hr)) + { + skip("Failed to create IDirect3DDevice9 object %#x\n", hr); + IDirect3D9_Release(d3d); + DestroyWindow(wnd); + return; + } + + hr = D3DXCreateMesh(0, 3, D3DXMESH_MANAGED, (LPD3DVERTEXELEMENT9 *)&decl, device, &d3dxmesh); + todo_wine ok(hr == D3DERR_INVALIDCALL, "Got result %x, expected %x (D3DERR_INVALIDCALL)\n", hr, D3DERR_INVALIDCALL); + + hr = D3DXCreateMesh(1, 0, D3DXMESH_MANAGED, (LPD3DVERTEXELEMENT9 *)&decl, device, &d3dxmesh); + todo_wine ok(hr == D3DERR_INVALIDCALL, "Got result %x, expected %x (D3DERR_INVALIDCALL)\n", hr, D3DERR_INVALIDCALL); + + hr = D3DXCreateMesh(1, 3, 0, (LPD3DVERTEXELEMENT9 *)&decl, device, &d3dxmesh); + todo_wine ok(hr == D3D_OK, "Got result %x, expected %x (D3D_OK)\n", hr, D3D_OK); + + if (hr == D3D_OK) + { + d3dxmesh->lpVtbl->Release(d3dxmesh); + } + + hr = D3DXCreateMesh(1, 3, D3DXMESH_MANAGED, 0, device, &d3dxmesh); + todo_wine ok(hr == D3DERR_INVALIDCALL, "Got result %x, expected %x (D3DERR_INVALIDCALL)\n", hr, D3DERR_INVALIDCALL); + + hr = D3DXCreateMesh(1, 3, D3DXMESH_MANAGED, (LPD3DVERTEXELEMENT9 *)&decl, device, NULL); + todo_wine ok(hr == D3DERR_INVALIDCALL, "Got result %x, expected %x (D3DERR_INVALIDCALL)\n", hr, D3DERR_INVALIDCALL); + + hr = D3DXCreateMesh(1, 3, D3DXMESH_MANAGED, (LPD3DVERTEXELEMENT9 *)&decl, device, &d3dxmesh); + todo_wine ok(hr == D3D_OK, "Got result %x, expected 0 (D3D_OK)\n", hr); + + if (hr == D3D_OK) + { + /* device */ + hr = d3dxmesh->lpVtbl->GetDevice(d3dxmesh, NULL); + ok(hr == D3DERR_INVALIDCALL, "Got result %x, expected %x (D3DERR_INVALIDCALL)\n", hr, D3DERR_INVALIDCALL); + + hr = d3dxmesh->lpVtbl->GetDevice(d3dxmesh, &test_device); + ok(hr == D3D_OK, "Got result %x, expected %x (D3D_OK)\n", hr, D3D_OK); + ok(test_device == device, "Got result %p, expected %p\n", test_device, device); + + if (hr == D3D_OK) + { + IDirect3DDevice9_Release(device); + } + + /* declaration */ + hr = d3dxmesh->lpVtbl->GetDeclaration(d3dxmesh, test_decl); + ok(hr == D3D_OK, "Got result %x, expected 0 (D3D_OK)\n", hr); + + if (hr == D3D_OK) + { + size = sizeof(decl) / sizeof(decl[0]); + for (i = 0; i < size - 1; i++) + { + ok(test_decl[i].Stream == decl[i].Stream, "Returned stream %d, expected %d\n", test_decl[i].Stream, decl[i].Stream); + ok(test_decl[i].Type == decl[i].Type, "Returned type %d, expected %d\n", test_decl[i].Type, decl[i].Type); + ok(test_decl[i].Method == decl[i].Method, "Returned method %d, expected %d\n", test_decl[i].Method, decl[i].Method); + ok(test_decl[i].Usage == decl[i].Usage, "Returned usage %d, expected %d\n", test_decl[i].Usage, decl[i].Usage); + ok(test_decl[i].UsageIndex == decl[i].UsageIndex, "Returned usage index %d, expected %d\n", test_decl[i].UsageIndex, decl[i].UsageIndex); + ok(test_decl[i].Offset == decl[i].Offset, "Returned offset %d, expected %d\n", decl[1].Offset, decl[i].Offset); + } + ok(decl[size-1].Stream == 0xFF, "Returned too long vertex declaration\n"); /* end element */ + } + + /* FVF */ + fvf = d3dxmesh->lpVtbl->GetFVF(d3dxmesh); + ok(fvf == (D3DFVF_XYZ | D3DFVF_NORMAL), "Got result %x, expected %x (D3DFVF_XYZ | D3DFVF_NORMAL)\n", fvf, D3DFVF_XYZ | D3DFVF_NORMAL); + + /* options */ + options = d3dxmesh->lpVtbl->GetOptions(d3dxmesh); + ok(options == D3DXMESH_MANAGED, "Got result %x, expected %x (D3DXMESH_MANAGED)\n", options, D3DXMESH_MANAGED); + + /* rest */ + if (!new_mesh(&mesh, 3, 1)) + { + skip("Couldn't create mesh\n"); + } + else + { + memset(mesh.vertices, 0, mesh.number_of_vertices * sizeof(*mesh.vertices)); + memset(mesh.faces, 0, mesh.number_of_faces * sizeof(*mesh.faces)); + + compare_mesh("createmeshfvf", d3dxmesh, &mesh); + + free_mesh(&mesh); + } + + d3dxmesh->lpVtbl->Release(d3dxmesh); + } + + IDirect3DDevice9_Release(device); + IDirect3D9_Release(d3d); + DestroyWindow(wnd); +} + +struct sincos_table +{ + float *sin; + float *cos; +}; + +static void free_sincos_table(struct sincos_table *sincos_table) +{ + HeapFree(GetProcessHeap(), 0, sincos_table->cos); + HeapFree(GetProcessHeap(), 0, sincos_table->sin); +} + +/* pre compute sine and cosine tables; caller must free */ +static BOOL compute_sincos_table(struct sincos_table *sincos_table, float angle_start, float angle_step, int n) +{ + float angle; + int i; + + sincos_table->sin = HeapAlloc(GetProcessHeap(), 0, n * sizeof(*sincos_table->sin)); + if (!sincos_table->sin) + { + return FALSE; + } + sincos_table->cos = HeapAlloc(GetProcessHeap(), 0, n * sizeof(*sincos_table->cos)); + if (!sincos_table->cos) + { + HeapFree(GetProcessHeap(), 0, sincos_table->sin); + return FALSE; + } + + angle = angle_start; + for (i = 0; i < n; i++) + { + sincos_table->sin[i] = sin(angle); + sincos_table->cos[i] = cos(angle); + angle += angle_step; + } + + return TRUE; +} + +static WORD sphere_vertex(UINT slices, int slice, int stack) +{ + return stack*slices+slice+1; +} + +/* slices = subdivisions along xy plane, stacks = subdivisions along z axis */ +static BOOL compute_sphere(struct mesh *mesh, FLOAT radius, UINT slices, UINT stacks) +{ + float theta_step, theta_start; + struct sincos_table theta; + float phi_step, phi_start; + struct sincos_table phi; + DWORD number_of_vertices, number_of_faces; + DWORD vertex, face; + int slice, stack; + + /* theta = angle on xy plane wrt x axis */ + theta_step = M_PI / stacks; + theta_start = theta_step; + + /* phi = angle on xz plane wrt z axis */ + phi_step = -2 * M_PI / slices; + phi_start = M_PI / 2; + + if (!compute_sincos_table(&theta, theta_start, theta_step, stacks)) + { + return FALSE; + } + if (!compute_sincos_table(&phi, phi_start, phi_step, slices)) + { + free_sincos_table(&theta); + return FALSE; + } + + number_of_vertices = 2 + slices * (stacks-1); + number_of_faces = 2 * slices + (stacks - 2) * (2 * slices); + + if (!new_mesh(mesh, number_of_vertices, number_of_faces)) + { + free_sincos_table(&phi); + free_sincos_table(&theta); + return FALSE; + } + + vertex = 0; + face = 0; + stack = 0; + + mesh->vertices[vertex].normal.x = 0.0f; + mesh->vertices[vertex].normal.y = 0.0f; + mesh->vertices[vertex].normal.z = 1.0f; + mesh->vertices[vertex].position.x = 0.0f; + mesh->vertices[vertex].position.y = 0.0f; + mesh->vertices[vertex].position.z = radius; + vertex++; + + for (stack = 0; stack < stacks - 1; stack++) + { + for (slice = 0; slice < slices; slice++) + { + mesh->vertices[vertex].normal.x = theta.sin[stack] * phi.cos[slice]; + mesh->vertices[vertex].normal.y = theta.sin[stack] * phi.sin[slice]; + mesh->vertices[vertex].normal.z = theta.cos[stack]; + mesh->vertices[vertex].position.x = radius * theta.sin[stack] * phi.cos[slice]; + mesh->vertices[vertex].position.y = radius * theta.sin[stack] * phi.sin[slice]; + mesh->vertices[vertex].position.z = radius * theta.cos[stack]; + vertex++; + + if (slice > 0) + { + if (stack == 0) + { + /* top stack is triangle fan */ + mesh->faces[face][0] = 0; + mesh->faces[face][1] = slice + 1; + mesh->faces[face][2] = slice; + face++; + } + else + { + /* stacks in between top and bottom are quad strips */ + mesh->faces[face][0] = sphere_vertex(slices, slice-1, stack-1); + mesh->faces[face][1] = sphere_vertex(slices, slice, stack-1); + mesh->faces[face][2] = sphere_vertex(slices, slice-1, stack); + face++; + + mesh->faces[face][0] = sphere_vertex(slices, slice, stack-1); + mesh->faces[face][1] = sphere_vertex(slices, slice, stack); + mesh->faces[face][2] = sphere_vertex(slices, slice-1, stack); + face++; + } + } + } + + if (stack == 0) + { + mesh->faces[face][0] = 0; + mesh->faces[face][1] = 1; + mesh->faces[face][2] = slice; + face++; + } + else + { + mesh->faces[face][0] = sphere_vertex(slices, slice-1, stack-1); + mesh->faces[face][1] = sphere_vertex(slices, 0, stack-1); + mesh->faces[face][2] = sphere_vertex(slices, slice-1, stack); + face++; + + mesh->faces[face][0] = sphere_vertex(slices, 0, stack-1); + mesh->faces[face][1] = sphere_vertex(slices, 0, stack); + mesh->faces[face][2] = sphere_vertex(slices, slice-1, stack); + face++; + } + } + + mesh->vertices[vertex].position.x = 0.0f; + mesh->vertices[vertex].position.y = 0.0f; + mesh->vertices[vertex].position.z = -radius; + mesh->vertices[vertex].normal.x = 0.0f; + mesh->vertices[vertex].normal.y = 0.0f; + mesh->vertices[vertex].normal.z = -1.0f; + + /* bottom stack is triangle fan */ + for (slice = 1; slice < slices; slice++) + { + mesh->faces[face][0] = sphere_vertex(slices, slice-1, stack-1); + mesh->faces[face][1] = sphere_vertex(slices, slice, stack-1); + mesh->faces[face][2] = vertex; + face++; + } + + mesh->faces[face][0] = sphere_vertex(slices, slice-1, stack-1); + mesh->faces[face][1] = sphere_vertex(slices, 0, stack-1); + mesh->faces[face][2] = vertex; + + free_sincos_table(&phi); + free_sincos_table(&theta); + + return TRUE; +} + +static void test_sphere(IDirect3DDevice9 *device, FLOAT radius, UINT slices, UINT stacks) +{ + HRESULT hr; + ID3DXMesh *sphere; + struct mesh mesh; + char name[256]; + + hr = D3DXCreateSphere(device, radius, slices, stacks, &sphere, NULL); + todo_wine ok(hr == D3D_OK, "Got result %x, expected 0 (D3D_OK)\n", hr); + if (hr != D3D_OK) + { + skip("Couldn't create sphere\n"); + return; + } + + if (!compute_sphere(&mesh, radius, slices, stacks)) + { + skip("Couldn't create mesh\n"); + sphere->lpVtbl->Release(sphere); + return; + } + + sprintf(name, "sphere (%g, %u, %u)", radius, slices, stacks); + compare_mesh(name, sphere, &mesh); + + free_mesh(&mesh); + + sphere->lpVtbl->Release(sphere); +} + static void D3DXCreateSphereTest(void) { HRESULT hr; @@ -529,11 +1466,22 @@ hr = D3DXCreateSphere(device, 1.0f, 1, 1, &sphere, NULL); todo_wine ok( hr == D3DERR_INVALIDCALL, "Got result %x, expected %x (D3DERR_INVALIDCALL)\n",hr,D3DERR_INVALIDCALL); - hr = D3DXCreateSphere(device, 1.0f, 2, 2, &sphere, NULL); - todo_wine ok( hr == D3D_OK, "Got result %x, expected 0 (D3D_OK)\n",hr); + hr = D3DXCreateSphere(device, 1.0f, 2, 1, &sphere, NULL); + todo_wine ok(hr == D3DERR_INVALIDCALL, "Got result %x, expected %x (D3DERR_INVALIDCALL)\n", hr, D3DERR_INVALIDCALL); - if (sphere) - sphere->lpVtbl->Release(sphere); + hr = D3DXCreateSphere(device, 1.0f, 1, 2, &sphere, NULL); + todo_wine ok(hr == D3DERR_INVALIDCALL, "Got result %x, expected %x (D3DERR_INVALIDCALL)\n", hr, D3DERR_INVALIDCALL); + + hr = D3DXCreateSphere(device, -0.1f, 1, 2, &sphere, NULL); + todo_wine ok(hr == D3DERR_INVALIDCALL, "Got result %x, expected %x (D3DERR_INVALIDCALL)\n", hr, D3DERR_INVALIDCALL); + + test_sphere(device, 0.0f, 2, 2); + test_sphere(device, 1.0f, 2, 2); + test_sphere(device, 1.0f, 3, 2); + test_sphere(device, 1.0f, 4, 4); + test_sphere(device, 1.0f, 3, 4); + test_sphere(device, 5.0f, 6, 7); + test_sphere(device, 10.0f, 11, 12); IDirect3DDevice9_Release(device); IDirect3D9_Release(d3d); @@ -620,6 +1568,8 @@ D3DXDeclaratorFromFVFTest(); D3DXGetFVFVertexSizeTest(); D3DXIntersectTriTest(); + D3DXCreateMeshTest(); D3DXCreateSphereTest(); test_get_decl_vertex_size(); + test_fvf_decl_conversion(); } diff -Nru wine1.3-1.3.0/dlls/d3dx9_36/tests/surface.c wine1.3-1.3.1/dlls/d3dx9_36/tests/surface.c --- wine1.3-1.3.0/dlls/d3dx9_36/tests/surface.c 2010-07-30 18:43:56.000000000 +0100 +++ wine1.3-1.3.1/dlls/d3dx9_36/tests/surface.c 2010-08-20 18:23:50.000000000 +0100 @@ -217,7 +217,7 @@ HRESULT hr; BOOL testdummy_ok, testbitmap_ok; IDirect3DSurface9 *surf, *newsurf; - RECT rect; + RECT rect, destrect; D3DLOCKED_RECT lockrect; const WORD pixdata_a8r3g3b2[] = { 0x57df, 0x98fc, 0xacdd, 0xc891 }; const WORD pixdata_a1r5g5b5[] = { 0x46b5, 0x99c8, 0x06a2, 0x9431 }; @@ -330,14 +330,32 @@ hr = D3DXLoadSurfaceFromMemory(surf, NULL, NULL, pixdata, D3DFMT_UNKNOWN, sizeof(pixdata), NULL, &rect, D3DX_DEFAULT, 0); ok(hr == E_FAIL, "D3DXLoadSurfaceFromMemory returned %#x, expected %#x\n", hr, E_FAIL); + SetRect(&destrect, -1, -1, 1, 1); /* destination rect is partially outside texture boundaries */ + hr = D3DXLoadSurfaceFromMemory(surf, NULL, &destrect, pixdata, D3DFMT_A8R8G8B8, sizeof(pixdata), NULL, &rect, D3DX_FILTER_NONE, 0); + ok(hr == D3DERR_INVALIDCALL, "D3DXLoadSurfaceFromMemory returned %#x, expected %#x\n", hr, D3DERR_INVALIDCALL); + + SetRect(&destrect, 255, 255, 257, 257); /* destination rect is partially outside texture boundaries */ + hr = D3DXLoadSurfaceFromMemory(surf, NULL, &destrect, pixdata, D3DFMT_A8R8G8B8, sizeof(pixdata), NULL, &rect, D3DX_FILTER_NONE, 0); + ok(hr == D3DERR_INVALIDCALL, "D3DXLoadSurfaceFromMemory returned %#x, expected %#x\n", hr, D3DERR_INVALIDCALL); + + SetRect(&destrect, 1, 1, 0, 0); /* left > right, top > bottom */ + hr = D3DXLoadSurfaceFromMemory(surf, NULL, &destrect, pixdata, D3DFMT_A8R8G8B8, sizeof(pixdata), NULL, &rect, D3DX_FILTER_NONE, 0); + ok(hr == D3DERR_INVALIDCALL, "D3DXLoadSurfaceFromMemory returned %#x, expected %#x\n", hr, D3DERR_INVALIDCALL); + + SetRect(&destrect, 0, 0, 0, 0); /* left = right, top = bottom */ + hr = D3DXLoadSurfaceFromMemory(surf, NULL, &destrect, pixdata, D3DFMT_A8R8G8B8, sizeof(pixdata), NULL, &rect, D3DX_FILTER_NONE, 0); + ok(hr == D3D_OK, "D3DXLoadSurfaceFromMemory returned %#x, expected %#x\n", hr, D3D_OK); + + SetRect(&destrect, 257, 257, 257, 257); /* left = right, top = bottom, but invalid values */ + hr = D3DXLoadSurfaceFromMemory(surf, NULL, &destrect, pixdata, D3DFMT_A8R8G8B8, sizeof(pixdata), NULL, &rect, D3DX_FILTER_NONE, 0); + ok(hr == D3DERR_INVALIDCALL, "D3DXLoadSurfaceFromMemory returned %#x, expected %#x\n", hr, D3DERR_INVALIDCALL); + /* D3DXLoadSurfaceFromSurface */ hr = IDirect3DDevice9_CreateOffscreenPlainSurface(device, 256, 256, D3DFMT_A8R8G8B8, D3DPOOL_DEFAULT, &newsurf, NULL); if(SUCCEEDED(hr)) { - todo_wine { - hr = D3DXLoadSurfaceFromSurface(newsurf, NULL, NULL, surf, NULL, NULL, D3DX_DEFAULT, 0); - ok(hr == D3D_OK, "D3DXLoadSurfaceFromSurface returned %#x, expected %#x\n", hr, D3D_OK); - } + hr = D3DXLoadSurfaceFromSurface(newsurf, NULL, NULL, surf, NULL, NULL, D3DX_DEFAULT, 0); + ok(hr == D3D_OK, "D3DXLoadSurfaceFromSurface returned %#x, expected %#x\n", hr, D3D_OK); hr = D3DXLoadSurfaceFromSurface(NULL, NULL, NULL, surf, NULL, NULL, D3DX_DEFAULT, 0); ok(hr == D3DERR_INVALIDCALL, "D3DXLoadSurfaceFromSurface returned %#x, expected %#x\n", hr, D3DERR_INVALIDCALL); diff -Nru wine1.3-1.3.0/dlls/dbghelp/dwarf.c wine1.3-1.3.1/dlls/dbghelp/dwarf.c --- wine1.3-1.3.0/dlls/dbghelp/dwarf.c 2010-07-30 18:43:56.000000000 +0100 +++ wine1.3-1.3.1/dlls/dbghelp/dwarf.c 2010-08-20 18:23:50.000000000 +0100 @@ -1300,6 +1300,8 @@ /* FIXME: we need to handle nested udt definitions */ case DW_TAG_inheritance: case DW_TAG_subprogram: + case DW_TAG_template_type_param: + case DW_TAG_template_value_param: case DW_TAG_variable: /* FIXME: some C++ related stuff */ break; @@ -1771,6 +1773,8 @@ /* the type referred to will be loaded when we need it, so skip it */ break; case DW_TAG_unspecified_parameters: + case DW_TAG_template_type_param: + case DW_TAG_template_value_param: /* FIXME: no support in dbghelp's internals so far */ break; default: diff -Nru wine1.3-1.3.0/dlls/ddraw/clipper.c wine1.3-1.3.1/dlls/ddraw/clipper.c --- wine1.3-1.3.0/dlls/ddraw/clipper.c 2010-07-30 18:43:56.000000000 +0100 +++ wine1.3-1.3.1/dlls/ddraw/clipper.c 2010-08-20 18:23:50.000000000 +0100 @@ -20,23 +20,10 @@ */ #include "config.h" - -#include -#include -#include - -#define COBJMACROS - -#include "windef.h" -#include "winbase.h" -#include "wingdi.h" -#include "ddraw.h" -#include "winerror.h" +#include "wine/port.h" #include "ddraw_private.h" -#include "wine/debug.h" - WINE_DEFAULT_DEBUG_CHANNEL(ddraw); /***************************************************************************** @@ -62,6 +49,9 @@ static HRESULT WINAPI IDirectDrawClipperImpl_QueryInterface( LPDIRECTDRAWCLIPPER iface, REFIID riid, LPVOID* ppvObj ) { + + TRACE("iface %p, riid %s, object %p.\n", iface, debugstr_guid(riid), ppvObj); + if (IsEqualGUID(&IID_IUnknown, riid) || IsEqualGUID(&IID_IDirectDrawClipper, riid)) { @@ -86,7 +76,7 @@ IDirectDrawClipperImpl *This = (IDirectDrawClipperImpl *)iface; ULONG ref = InterlockedIncrement(&This->ref); - TRACE("(%p)->() incrementing from %u.\n", This, ref - 1); + TRACE("%p increasing refcount to %u.\n", This, ref); return ref; } @@ -102,7 +92,7 @@ IDirectDrawClipperImpl *This = (IDirectDrawClipperImpl *)iface; ULONG ref = InterlockedDecrement(&This->ref); - TRACE("(%p)->() decrementing from %u.\n", This, ref + 1); + TRACE("%p decreasing refcount to %u.\n", This, ref); if (ref == 0) { @@ -135,7 +125,8 @@ ) { IDirectDrawClipperImpl *This = (IDirectDrawClipperImpl *)iface; HRESULT hr; - TRACE("(%p)->(%08x,%p)\n", This, dwFlags, hWnd); + + TRACE("iface %p, flags %#x, window %p.\n", iface, dwFlags, hWnd); EnterCriticalSection(&ddraw_cs); hr = IWineD3DClipper_SetHWnd(This->wineD3DClipper, @@ -173,7 +164,9 @@ { IDirectDrawClipperImpl *This = (IDirectDrawClipperImpl *)iface; HRESULT hr; - TRACE("(%p,%p,%p,%p)\n", This, lpRect, lpClipList, lpdwSize); + + TRACE("iface %p, rect %s, clip_list %p, clip_list_size %p.\n", + iface, wine_dbgstr_rect(lpRect), lpClipList, lpdwSize); EnterCriticalSection(&ddraw_cs); hr = IWineD3DClipper_GetClipList(This->wineD3DClipper, @@ -204,6 +197,8 @@ IDirectDrawClipperImpl *This = (IDirectDrawClipperImpl *)iface; HRESULT hr; + TRACE("iface %p, clip_list %p, flags %#x.\n", iface, lprgn, dwFlag); + EnterCriticalSection(&ddraw_cs); hr = IWineD3DClipper_SetClipList(This->wineD3DClipper, lprgn, @@ -228,7 +223,8 @@ ) { IDirectDrawClipperImpl *This = (IDirectDrawClipperImpl *)iface; HRESULT hr; - TRACE("(%p)->(%p)\n", This, hWndPtr); + + TRACE("iface %p, window %p.\n", iface, hWndPtr); EnterCriticalSection(&ddraw_cs); hr = IWineD3DClipper_GetHWnd(This->wineD3DClipper, @@ -255,7 +251,8 @@ LPDIRECTDRAWCLIPPER iface, LPDIRECTDRAW lpDD, DWORD dwFlags ) { IDirectDrawClipperImpl *This = (IDirectDrawClipperImpl *)iface; - TRACE("(%p)->(%p,0x%08x)\n", This, lpDD, dwFlags); + + TRACE("iface %p, ddraw %p, flags %#x.\n", iface, lpDD, dwFlags); EnterCriticalSection(&ddraw_cs); if (This->initialized) @@ -284,8 +281,7 @@ static HRESULT WINAPI IDirectDrawClipperImpl_IsClipListChanged( LPDIRECTDRAWCLIPPER iface, BOOL* lpbChanged ) { - IDirectDrawClipperImpl *This = (IDirectDrawClipperImpl *)iface; - FIXME("(%p)->(%p),stub!\n",This,lpbChanged); + FIXME("iface %p, changed %p stub!\n", iface, lpbChanged); /* XXX What is safest? */ *lpbChanged = FALSE; @@ -296,7 +292,7 @@ /***************************************************************************** * The VTable *****************************************************************************/ -const IDirectDrawClipperVtbl IDirectDrawClipper_Vtbl = +static const struct IDirectDrawClipperVtbl ddraw_clipper_vtbl = { IDirectDrawClipperImpl_QueryInterface, IDirectDrawClipperImpl_AddRef, @@ -308,3 +304,17 @@ IDirectDrawClipperImpl_SetClipList, IDirectDrawClipperImpl_SetHwnd }; + +HRESULT ddraw_clipper_init(IDirectDrawClipperImpl *clipper) +{ + clipper->lpVtbl = &ddraw_clipper_vtbl; + clipper->ref = 1; + clipper->wineD3DClipper = pWineDirect3DCreateClipper((IUnknown *)clipper); + if (!clipper->wineD3DClipper) + { + WARN("Failed to create wined3d clipper.\n"); + return E_OUTOFMEMORY; + } + + return DD_OK; +} diff -Nru wine1.3-1.3.0/dlls/ddraw/ddraw.c wine1.3-1.3.1/dlls/ddraw/ddraw.c --- wine1.3-1.3.0/dlls/ddraw/ddraw.c 2010-07-30 18:43:56.000000000 +0100 +++ wine1.3-1.3.1/dlls/ddraw/ddraw.c 2010-08-20 18:23:50.000000000 +0100 @@ -23,25 +23,7 @@ #include "config.h" #include "wine/port.h" -#include -#include -#include -#include - -#define COBJMACROS -#define NONAMELESSUNION - -#include "windef.h" -#include "winbase.h" -#include "winerror.h" -#include "wingdi.h" -#include "wine/exception.h" - -#include "ddraw.h" -#include "d3d.h" - #include "ddraw_private.h" -#include "wine/debug.h" WINE_DEFAULT_DEBUG_CHANNEL(ddraw); @@ -112,7 +94,7 @@ { IDirectDrawImpl *This = (IDirectDrawImpl *)iface; - TRACE("(%p)->(%s,%p)\n", This, debugstr_guid(refiid), obj); + TRACE("iface %p, riid %s, object %p.\n", iface, debugstr_guid(refiid), obj); /* Can change surface impl type */ EnterCriticalSection(&ddraw_cs); @@ -260,6 +242,34 @@ return ddraw7_QueryInterface((IDirectDraw7 *)ddraw_from_ddraw1(iface), riid, object); } +static HRESULT WINAPI d3d7_QueryInterface(IDirect3D7 *iface, REFIID riid, void **object) +{ + TRACE("iface %p, riid %s, object %p.\n", iface, debugstr_guid(riid), object); + + return ddraw7_QueryInterface((IDirectDraw7 *)ddraw_from_d3d7(iface), riid, object); +} + +static HRESULT WINAPI d3d3_QueryInterface(IDirect3D3 *iface, REFIID riid, void **object) +{ + TRACE("iface %p, riid %s, object %p.\n", iface, debugstr_guid(riid), object); + + return ddraw7_QueryInterface((IDirectDraw7 *)ddraw_from_d3d3(iface), riid, object); +} + +static HRESULT WINAPI d3d2_QueryInterface(IDirect3D2 *iface, REFIID riid, void **object) +{ + TRACE("iface %p, riid %s, object %p.\n", iface, debugstr_guid(riid), object); + + return ddraw7_QueryInterface((IDirectDraw7 *)ddraw_from_d3d2(iface), riid, object); +} + +static HRESULT WINAPI d3d1_QueryInterface(IDirect3D *iface, REFIID riid, void **object) +{ + TRACE("iface %p, riid %s, object %p.\n", iface, debugstr_guid(riid), object); + + return ddraw7_QueryInterface((IDirectDraw7 *)ddraw_from_d3d1(iface), riid, object); +} + /***************************************************************************** * IDirectDraw7::AddRef * @@ -283,7 +293,7 @@ IDirectDrawImpl *This = (IDirectDrawImpl *)iface; ULONG ref = InterlockedIncrement(&This->ref7); - TRACE("(%p) : incrementing IDirectDraw7 refcount from %u.\n", This, ref -1); + TRACE("%p increasing refcount to %u.\n", This, ref); if(ref == 1) InterlockedIncrement(&This->numIfaces); @@ -338,6 +348,34 @@ return ref; } +static ULONG WINAPI d3d7_AddRef(IDirect3D7 *iface) +{ + TRACE("iface %p.\n", iface); + + return ddraw7_AddRef((IDirectDraw7 *)ddraw_from_d3d7(iface)); +} + +static ULONG WINAPI d3d3_AddRef(IDirect3D3 *iface) +{ + TRACE("iface %p.\n", iface); + + return ddraw1_AddRef((IDirectDraw *)&ddraw_from_d3d3(iface)->IDirectDraw_vtbl); +} + +static ULONG WINAPI d3d2_AddRef(IDirect3D2 *iface) +{ + TRACE("iface %p.\n", iface); + + return ddraw1_AddRef((IDirectDraw *)&ddraw_from_d3d2(iface)->IDirectDraw_vtbl); +} + +static ULONG WINAPI d3d1_AddRef(IDirect3D *iface) +{ + TRACE("iface %p.\n", iface); + + return ddraw1_AddRef((IDirectDraw *)&ddraw_from_d3d1(iface)->IDirectDraw_vtbl); +} + /***************************************************************************** * ddraw_destroy * @@ -385,7 +423,7 @@ IDirectDrawImpl *This = (IDirectDrawImpl *)iface; ULONG ref = InterlockedDecrement(&This->ref7); - TRACE("(%p)->() decrementing IDirectDraw7 refcount from %u.\n", This, ref +1); + TRACE("%p decreasing refcount to %u.\n", This, ref); if (!ref && !InterlockedDecrement(&This->numIfaces)) ddraw_destroy(This); @@ -445,6 +483,34 @@ return ref; } +static ULONG WINAPI d3d7_Release(IDirect3D7 *iface) +{ + TRACE("iface %p.\n", iface); + + return ddraw7_Release((IDirectDraw7 *)ddraw_from_d3d7(iface)); +} + +static ULONG WINAPI d3d3_Release(IDirect3D3 *iface) +{ + TRACE("iface %p.\n", iface); + + return ddraw1_Release((IDirectDraw *)&ddraw_from_d3d3(iface)->IDirectDraw_vtbl); +} + +static ULONG WINAPI d3d2_Release(IDirect3D2 *iface) +{ + TRACE("iface %p.\n", iface); + + return ddraw1_Release((IDirectDraw *)&ddraw_from_d3d2(iface)->IDirectDraw_vtbl); +} + +static ULONG WINAPI d3d1_Release(IDirect3D *iface) +{ + TRACE("iface %p.\n", iface); + + return ddraw1_Release((IDirectDraw *)&ddraw_from_d3d1(iface)->IDirectDraw_vtbl); +} + /***************************************************************************** * IDirectDraw methods *****************************************************************************/ @@ -498,7 +564,7 @@ IDirectDrawImpl *This = (IDirectDrawImpl *)iface; HWND window; - TRACE("(%p)->(%p,%08x)\n",This,hwnd,cooplevel); + TRACE("iface %p, window %p, flags %#x.\n", iface, hwnd, cooplevel); DDRAW_dump_cooperativelevel(cooplevel); EnterCriticalSection(&ddraw_cs); @@ -717,12 +783,14 @@ IDirectDrawImpl *This = (IDirectDrawImpl *)iface; WINED3DDISPLAYMODE Mode; HRESULT hr; - TRACE("(%p)->(%d,%d,%d,%d,%x): Relay!\n", This, Width, Height, BPP, RefreshRate, Flags); + + TRACE("iface %p, width %u, height %u, bpp %u, refresh_rate %u, flags %#x.\n", + iface, Width, Height, BPP, RefreshRate, Flags); EnterCriticalSection(&ddraw_cs); if( !Width || !Height ) { - ERR("Width=%d, Height=%d, what to do?\n", Width, Height); + ERR("Width %u, Height %u, what to do?\n", Width, Height); /* It looks like Need for Speed Porsche Unleashed expects DD_OK here */ LeaveCriticalSection(&ddraw_cs); return DD_OK; @@ -791,9 +859,13 @@ static HRESULT WINAPI ddraw7_SetDisplayMode(IDirectDraw7 *iface, DWORD Width, DWORD Height, DWORD BPP, DWORD RefreshRate, DWORD Flags) { + TRACE("iface %p, width %u, height %u, bpp %u, refresh_rate %u, flags %#x.\n", + iface, Width, Height, BPP, RefreshRate, Flags); + if (force_refresh_rate != 0) { - TRACE("ForceRefreshRate overriding passed-in refresh rate (%d Hz) to %d Hz\n", RefreshRate, force_refresh_rate); + TRACE("ForceRefreshRate overriding passed-in refresh rate (%u Hz) to %u Hz\n", + RefreshRate, force_refresh_rate); RefreshRate = force_refresh_rate; } @@ -861,7 +933,8 @@ static HRESULT WINAPI ddraw7_RestoreDisplayMode(IDirectDraw7 *iface) { IDirectDrawImpl *This = (IDirectDrawImpl *)iface; - TRACE("(%p)\n", This); + + TRACE("iface %p.\n", iface); return ddraw_set_display_mode(iface, This->orig_width, This->orig_height, This->orig_bpp, 0, 0); } @@ -916,7 +989,8 @@ WINED3DCAPS winecaps; HRESULT hr; DDSCAPS2 ddscaps = {0, 0, 0, 0}; - TRACE("(%p)->(%p,%p)\n", This, DriverCaps, HELCaps); + + TRACE("iface %p, driver_caps %p, hel_caps %p.\n", iface, DriverCaps, HELCaps); /* One structure must be != NULL */ if( (!DriverCaps) && (!HELCaps) ) @@ -1033,8 +1107,7 @@ *****************************************************************************/ static HRESULT WINAPI ddraw7_Compact(IDirectDraw7 *iface) { - IDirectDrawImpl *This = (IDirectDrawImpl *)iface; - TRACE("(%p)\n", This); + TRACE("iface %p.\n", iface); return DD_OK; } @@ -1087,7 +1160,8 @@ HRESULT hr; WINED3DDISPLAYMODE Mode; DWORD Size; - TRACE("(%p)->(%p): Relay\n", This, DDSD); + + TRACE("iface %p, surface_desc %p.\n", iface, DDSD); EnterCriticalSection(&ddraw_cs); /* This seems sane */ @@ -1190,7 +1264,8 @@ HRESULT hr; WINED3DDISPLAYMODE d3ddm; WINED3DSURFTYPE type = This->ImplType; - TRACE("(%p)->(%p, %p)\n", This, NumCodes, Codes); + + TRACE("iface %p, codes_count %p, codes %p.\n", iface, NumCodes, Codes); IWineD3DDevice_GetDisplayMode(This->wineD3DDevice, 0 /* swapchain 0 */, @@ -1268,8 +1343,7 @@ *****************************************************************************/ static HRESULT WINAPI ddraw7_GetMonitorFrequency(IDirectDraw7 *iface, DWORD *Freq) { - IDirectDrawImpl *This = (IDirectDrawImpl *)iface; - TRACE("(%p)->(%p)\n", This, Freq); + FIXME("iface %p, frequency %p stub!\n", iface, Freq); /* Ideally this should be in WineD3D, as it concerns the screen setup, * but for now this should make the games happy @@ -1323,7 +1397,8 @@ static HRESULT WINAPI ddraw7_GetVerticalBlankStatus(IDirectDraw7 *iface, BOOL *status) { IDirectDrawImpl *This = (IDirectDrawImpl *)iface; - TRACE("(%p)->(%p)\n", This, status); + + TRACE("iface %p, status %p.\n", iface, status); /* This looks sane, the MSDN suggests it too */ EnterCriticalSection(&ddraw_cs); @@ -1385,7 +1460,8 @@ static HRESULT WINAPI ddraw7_GetAvailableVidMem(IDirectDraw7 *iface, DDSCAPS2 *Caps, DWORD *total, DWORD *free) { IDirectDrawImpl *This = (IDirectDrawImpl *)iface; - TRACE("(%p)->(%p, %p, %p)\n", This, Caps, total, free); + + TRACE("iface %p, caps %p, total %p, free %p.\n", iface, Caps, total, free); if(TRACE_ON(ddraw)) { @@ -1459,7 +1535,8 @@ static HRESULT WINAPI ddraw7_Initialize(IDirectDraw7 *iface, GUID *Guid) { IDirectDrawImpl *This = (IDirectDrawImpl *)iface; - TRACE("(%p)->(%s): No-op\n", This, debugstr_guid(Guid)); + + TRACE("iface %p, guid %s.\n", iface, debugstr_guid(Guid)); if(This->initialized) { @@ -1499,6 +1576,13 @@ return ddraw7_Initialize((IDirectDraw7 *)ddraw_from_ddraw1(iface), guid); } +static HRESULT WINAPI d3d1_Initialize(IDirect3D *iface, REFIID riid) +{ + TRACE("iface %p, riid %s.\n", iface, debugstr_guid(riid)); + + return D3D_OK; +} + /***************************************************************************** * IDirectDraw7::FlipToGDISurface * @@ -1514,8 +1598,7 @@ *****************************************************************************/ static HRESULT WINAPI ddraw7_FlipToGDISurface(IDirectDraw7 *iface) { - IDirectDrawImpl *This = (IDirectDrawImpl *)iface; - TRACE("(%p)\n", This); + FIXME("iface %p stub!\n", iface); return DD_OK; } @@ -1565,15 +1648,16 @@ * Always returns DD_OK * *****************************************************************************/ -static HRESULT WINAPI ddraw7_WaitForVerticalBlank(IDirectDraw7 *iface, DWORD Flags, HANDLE h) +static HRESULT WINAPI ddraw7_WaitForVerticalBlank(IDirectDraw7 *iface, DWORD Flags, HANDLE event) { - IDirectDrawImpl *This = (IDirectDrawImpl *)iface; - static BOOL hide = FALSE; + static BOOL hide; + + TRACE("iface %p, flags %#x, event %p.\n", iface, Flags, event); /* This function is called often, so print the fixme only once */ if(!hide) { - FIXME("(%p)->(%x,%p): Stub\n", This, Flags, h); + FIXME("iface %p, flags %#x, event %p stub!\n", iface, Flags, event); hide = TRUE; } @@ -1630,11 +1714,13 @@ static BOOL hide = FALSE; WINED3DDISPLAYMODE Mode; + TRACE("iface %p, line %p.\n", iface, Scanline); + /* This function is called often, so print the fixme only once */ EnterCriticalSection(&ddraw_cs); if(!hide) { - FIXME("(%p)->(%p): Semi-Stub\n", This, Scanline); + FIXME("iface %p, line %p partial stub!\n", iface, Scanline); hide = TRUE; } @@ -1728,7 +1814,8 @@ IDirectDrawSurface7 *ddsurf; HRESULT hr; DDSCAPS2 ddsCaps; - TRACE("(%p)->(%p)\n", This, GDISurface); + + TRACE("iface %p, surface %p.\n", iface, GDISurface); /* Get the back buffer from the wineD3DDevice and search its * attached surfaces for the front buffer @@ -1868,7 +1955,8 @@ WINED3DFMT_P8_UINT, }; - TRACE("(%p)->(%p,%p,%p): Relay\n", This, DDSD, Context, cb); + TRACE("iface %p, flags %#x, surface_desc %p, context %p, callback %p.\n", + iface, Flags, DDSD, Context, cb); EnterCriticalSection(&ddraw_cs); /* This looks sane */ @@ -2073,8 +2161,7 @@ *****************************************************************************/ static HRESULT WINAPI ddraw7_EvaluateMode(IDirectDraw7 *iface, DWORD Flags, DWORD *Timeout) { - IDirectDrawImpl *This = (IDirectDrawImpl *)iface; - FIXME("(%p)->(%d,%p): Stub!\n", This, Flags, Timeout); + FIXME("iface %p, flags %#x, timeout %p stub!\n", iface, Flags, Timeout); /* When implementing this, implement it in WineD3D */ @@ -2099,8 +2186,7 @@ static HRESULT WINAPI ddraw7_GetDeviceIdentifier(IDirectDraw7 *iface, DDDEVICEIDENTIFIER2 *DDDI, DWORD Flags) { - IDirectDrawImpl *This = (IDirectDrawImpl *)iface; - TRACE("(%p)->(%p,%08x)\n", This, DDDI, Flags); + TRACE("iface %p, device_identifier %p, flags %#x.\n", iface, DDDI, Flags); if(!DDDI) return DDERR_INVALIDPARAMS; @@ -2203,8 +2289,7 @@ *****************************************************************************/ static HRESULT WINAPI ddraw7_RestoreAllSurfaces(IDirectDraw7 *iface) { - IDirectDrawImpl *This = (IDirectDrawImpl *)iface; - FIXME("(%p): Stub\n", This); + FIXME("iface %p stub!\n", iface); /* This isn't hard to implement: Enumerate all WineD3D surfaces, * get their parent and call their restore method. Do not implement @@ -2245,8 +2330,8 @@ *****************************************************************************/ static HRESULT WINAPI ddraw7_StartModeTest(IDirectDraw7 *iface, SIZE *Modes, DWORD NumModes, DWORD Flags) { - IDirectDrawImpl *This = (IDirectDrawImpl *)iface; - WARN("(%p)->(%p, %d, %x): Semi-Stub, most likely harmless\n", This, Modes, NumModes, Flags); + FIXME("iface %p, modes %p, mode_count %u, flags %#x partial stub!\n", + iface, Modes, NumModes, Flags); /* This looks sane */ if( (!Modes) || (NumModes == 0) ) return DDERR_INVALIDPARAMS; @@ -2289,7 +2374,8 @@ UINT Width; UINT Height; - TRACE("(%p): Enumerated Surface %p\n", This, surfImpl); + TRACE("surface %p, surface_desc %p, context %p.\n", + surf, desc, Context); /* For the enumeration */ IDirectDrawSurface7_Release(surf); @@ -2390,7 +2476,8 @@ ULONG WINAPI D3D7CB_DestroySwapChain(IWineD3DSwapChain *pSwapChain) { IUnknown* swapChainParent; - TRACE("(%p) call back\n", pSwapChain); + + TRACE("swapchain %p.\n", pSwapChain); IWineD3DSwapChain_GetParent(pSwapChain, &swapChainParent); IUnknown_Release(swapChainParent); @@ -2414,13 +2501,11 @@ static HRESULT ddraw_create_surface(IDirectDrawImpl *This, DDSURFACEDESC2 *pDDSD, IDirectDrawSurfaceImpl **ppSurf, UINT level) { - HRESULT hr; - UINT Width, Height; - WINED3DFORMAT Format = WINED3DFMT_UNKNOWN; - DWORD Usage = 0; WINED3DSURFTYPE ImplType = This->ImplType; - WINED3DSURFACE_DESC Desc; - WINED3DPOOL Pool = WINED3DPOOL_DEFAULT; + HRESULT hr; + + TRACE("ddraw %p, surface_desc %p, surface %p, level %u.\n", + This, pDDSD, ppSurf, level); if (TRACE_ON(ddraw)) { @@ -2483,57 +2568,6 @@ } } - if (!(pDDSD->ddsCaps.dwCaps & (DDSCAPS_VIDEOMEMORY | DDSCAPS_SYSTEMMEMORY)) && - !((pDDSD->ddsCaps.dwCaps & DDSCAPS_TEXTURE) && (pDDSD->ddsCaps.dwCaps2 & DDSCAPS2_TEXTUREMANAGE)) ) - { - /* Tests show surfaces without memory flags get these flags added right after creation. */ - pDDSD->ddsCaps.dwCaps |= DDSCAPS_LOCALVIDMEM | DDSCAPS_VIDEOMEMORY; - } - /* Get the correct wined3d usage */ - if (pDDSD->ddsCaps.dwCaps & (DDSCAPS_PRIMARYSURFACE | - DDSCAPS_3DDEVICE ) ) - { - Usage |= WINED3DUSAGE_RENDERTARGET; - - pDDSD->ddsCaps.dwCaps |= DDSCAPS_VISIBLE; - } - if (pDDSD->ddsCaps.dwCaps & (DDSCAPS_OVERLAY)) - { - Usage |= WINED3DUSAGE_OVERLAY; - } - if(This->depthstencil || (pDDSD->ddsCaps.dwCaps & DDSCAPS_ZBUFFER) ) - { - /* The depth stencil creation callback sets this flag. - * Set the WineD3D usage to let it know that it's a depth - * Stencil surface. - */ - Usage |= WINED3DUSAGE_DEPTHSTENCIL; - } - if(pDDSD->ddsCaps.dwCaps & DDSCAPS_SYSTEMMEMORY) - { - Pool = WINED3DPOOL_SYSTEMMEM; - } - else if(pDDSD->ddsCaps.dwCaps2 & DDSCAPS2_TEXTUREMANAGE) - { - Pool = WINED3DPOOL_MANAGED; - /* Managed textures have the system memory flag set */ - pDDSD->ddsCaps.dwCaps |= DDSCAPS_SYSTEMMEMORY; - } - else if(pDDSD->ddsCaps.dwCaps & DDSCAPS_VIDEOMEMORY) - { - /* Videomemory adds localvidmem, this is mutually exclusive with systemmemory - * and texturemanage - */ - pDDSD->ddsCaps.dwCaps |= DDSCAPS_LOCALVIDMEM; - } - - Format = PixelFormat_DD2WineD3D(&pDDSD->u4.ddpfPixelFormat); - if(Format == WINED3DFMT_UNKNOWN) - { - ERR("Unsupported / Unknown pixelformat\n"); - return DDERR_INVALIDPIXELFORMAT; - } - /* Create the Surface object */ *ppSurf = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(IDirectDrawSurfaceImpl)); if(!*ppSurf) @@ -2541,41 +2575,12 @@ ERR("(%p) Error allocating memory for a surface\n", This); return DDERR_OUTOFVIDEOMEMORY; } - (*ppSurf)->lpVtbl = &IDirectDrawSurface7_Vtbl; - (*ppSurf)->IDirectDrawSurface3_vtbl = &IDirectDrawSurface3_Vtbl; - (*ppSurf)->IDirectDrawGammaControl_vtbl = &IDirectDrawGammaControl_Vtbl; - (*ppSurf)->IDirect3DTexture2_vtbl = &IDirect3DTexture2_Vtbl; - (*ppSurf)->IDirect3DTexture_vtbl = &IDirect3DTexture1_Vtbl; - (*ppSurf)->ref = 1; - (*ppSurf)->version = 7; - TRACE("%p->version = %d\n", (*ppSurf), (*ppSurf)->version); - (*ppSurf)->ddraw = This; - (*ppSurf)->surface_desc.dwSize = sizeof(DDSURFACEDESC2); - (*ppSurf)->surface_desc.u4.ddpfPixelFormat.dwSize = sizeof(DDPIXELFORMAT); - DD_STRUCT_COPY_BYSIZE(&(*ppSurf)->surface_desc, pDDSD); - - /* Surface attachments */ - (*ppSurf)->next_attached = NULL; - (*ppSurf)->first_attached = *ppSurf; - - /* Needed to re-create the surface on an implementation change */ - (*ppSurf)->ImplType = ImplType; - - /* For D3DDevice creation */ - (*ppSurf)->isRenderTarget = FALSE; - - /* A trace message for debugging */ - TRACE("(%p) Created IDirectDrawSurface implementation structure at %p\n", This, *ppSurf); - - /* Now create the WineD3D Surface */ - hr = IWineD3DDevice_CreateSurface(This->wineD3DDevice, pDDSD->dwWidth, pDDSD->dwHeight, Format, - TRUE /* Lockable */, FALSE /* Discard */, level, &(*ppSurf)->WineD3DSurface, - Usage, Pool, WINED3DMULTISAMPLE_NONE, 0 /* MultiSampleQuality */, ImplType, - (IUnknown *)*ppSurf, &ddraw_null_wined3d_parent_ops); - if(hr != D3D_OK) + hr = ddraw_surface_init(*ppSurf, This, pDDSD, level, ImplType); + if (FAILED(hr)) { - ERR("IWineD3DDevice::CreateSurface failed. hr = %08x\n", hr); + WARN("Failed to initialize surface, hr %#x.\n", hr); + HeapFree(GetProcessHeap(), 0, *ppSurf); return hr; } @@ -2583,93 +2588,7 @@ InterlockedIncrement(&This->surfaces); list_add_head(&This->surface_list, &(*ppSurf)->surface_list_entry); - /* Here we could store all created surfaces in the DirectDrawImpl structure, - * But this could also be delegated to WineDDraw, as it keeps track of all its - * resources. Not implemented for now, as there are more important things ;) - */ - - /* Get the pixel format of the WineD3DSurface and store it. - * Don't use the Format choosen above, WineD3D might have - * changed it - */ - (*ppSurf)->surface_desc.dwFlags |= DDSD_PIXELFORMAT; - hr = IWineD3DSurface_GetDesc((*ppSurf)->WineD3DSurface, &Desc); - if(hr != D3D_OK) - { - ERR("IWineD3DSurface::GetDesc failed\n"); - IDirectDrawSurface7_Release( (IDirectDrawSurface7 *) *ppSurf); - return hr; - } - - Format = Desc.format; - Width = Desc.width; - Height = Desc.height; - - if(Format == WINED3DFMT_UNKNOWN) - { - FIXME("IWineD3DSurface::GetDesc returned WINED3DFMT_UNKNOWN\n"); - } - PixelFormat_WineD3DtoDD( &(*ppSurf)->surface_desc.u4.ddpfPixelFormat, Format); - - /* Anno 1602 stores the pitch right after surface creation, so make sure it's there. - * I can't LockRect() the surface here because if OpenGL surfaces are in use, the - * WineD3DDevice might not be usable for 3D yet, so an extra method was created. - * TODO: Test other fourcc formats - */ - if(Format == WINED3DFMT_DXT1 || Format == WINED3DFMT_DXT2 || Format == WINED3DFMT_DXT3 || - Format == WINED3DFMT_DXT4 || Format == WINED3DFMT_DXT5) - { - (*ppSurf)->surface_desc.dwFlags |= DDSD_LINEARSIZE; - if(Format == WINED3DFMT_DXT1) - { - (*ppSurf)->surface_desc.u1.dwLinearSize = max(4, Width) * max(4, Height) / 2; - } - else - { - (*ppSurf)->surface_desc.u1.dwLinearSize = max(4, Width) * max(4, Height); - } - } - else - { - (*ppSurf)->surface_desc.dwFlags |= DDSD_PITCH; - (*ppSurf)->surface_desc.u1.lPitch = IWineD3DSurface_GetPitch((*ppSurf)->WineD3DSurface); - } - - /* Application passed a color key? Set it! */ - if(pDDSD->dwFlags & DDSD_CKDESTOVERLAY) - { - IWineD3DSurface_SetColorKey((*ppSurf)->WineD3DSurface, - DDCKEY_DESTOVERLAY, - (WINEDDCOLORKEY *) &pDDSD->u3.ddckCKDestOverlay); - } - if(pDDSD->dwFlags & DDSD_CKDESTBLT) - { - IWineD3DSurface_SetColorKey((*ppSurf)->WineD3DSurface, - DDCKEY_DESTBLT, - (WINEDDCOLORKEY *) &pDDSD->ddckCKDestBlt); - } - if(pDDSD->dwFlags & DDSD_CKSRCOVERLAY) - { - IWineD3DSurface_SetColorKey((*ppSurf)->WineD3DSurface, - DDCKEY_SRCOVERLAY, - (WINEDDCOLORKEY *) &pDDSD->ddckCKSrcOverlay); - } - if(pDDSD->dwFlags & DDSD_CKSRCBLT) - { - IWineD3DSurface_SetColorKey((*ppSurf)->WineD3DSurface, - DDCKEY_SRCBLT, - (WINEDDCOLORKEY *) &pDDSD->ddckCKSrcBlt); - } - if ( pDDSD->dwFlags & DDSD_LPSURFACE) - { - hr = IWineD3DSurface_SetMem((*ppSurf)->WineD3DSurface, pDDSD->lpSurface); - if(hr != WINED3D_OK) - { - /* No need for a trace here, wined3d does that for us */ - IDirectDrawSurface7_Release((IDirectDrawSurface7 *)*ppSurf); - return hr; - } - } + TRACE("Created surface %p.\n", *ppSurf); return DD_OK; } @@ -2978,7 +2897,8 @@ WINED3DDISPLAYMODE Mode; const DWORD sysvidmem = DDSCAPS_VIDEOMEMORY | DDSCAPS_SYSTEMMEMORY; - TRACE("(%p)->(%p,%p,%p)\n", This, DDSD, Surf, UnkOuter); + TRACE("iface %p, surface_desc %p, surface %p, outer_unknown %p.\n", + iface, DDSD, Surf, UnkOuter); /* Some checks before we start */ if (TRACE_ON(ddraw)) @@ -3660,10 +3580,12 @@ DDSURFACEDESC2 desc; struct list *entry, *entry2; + TRACE("iface %p, flags %#x, surface_desc %p, context %p, callback %p.\n", + iface, Flags, DDSD, Context, Callback); + all = Flags & DDENUMSURFACES_ALL; nomatch = Flags & DDENUMSURFACES_NOMATCH; - TRACE("(%p)->(%x,%p,%p,%p)\n", This, Flags, DDSD, Context, Callback); EnterCriticalSection(&ddraw_cs); if(!Callback) @@ -3767,7 +3689,10 @@ IUnknown *UnkOuter) { IDirectDrawClipperImpl* object; - TRACE("(%08x,%p,%p)\n", Flags, Clipper, UnkOuter); + HRESULT hr; + + TRACE("flags %#x, clipper %p, outer_unknown %p.\n", + Flags, Clipper, UnkOuter); EnterCriticalSection(&ddraw_cs); if (UnkOuter != NULL) @@ -3790,16 +3715,16 @@ return E_OUTOFMEMORY; } - object->lpVtbl = &IDirectDrawClipper_Vtbl; - object->ref = 1; - object->wineD3DClipper = pWineDirect3DCreateClipper((IUnknown *) object); - if(!object->wineD3DClipper) + hr = ddraw_clipper_init(object); + if (FAILED(hr)) { + WARN("Failed to initialize clipper, hr %#x.\n", hr); HeapFree(GetProcessHeap(), 0, object); LeaveCriticalSection(&ddraw_cs); - return E_OUTOFMEMORY; + return hr; } + TRACE("Created clipper %p.\n", object); *Clipper = (IDirectDrawClipper *) object; LeaveCriticalSection(&ddraw_cs); return DD_OK; @@ -3814,8 +3739,9 @@ static HRESULT WINAPI ddraw7_CreateClipper(IDirectDraw7 *iface, DWORD Flags, IDirectDrawClipper **Clipper, IUnknown *UnkOuter) { - IDirectDrawImpl *This = (IDirectDrawImpl *)iface; - TRACE("(%p)->(%x,%p,%p)\n", This, Flags, Clipper, UnkOuter); + TRACE("iface %p, flags %#x, clipper %p, outer_unknown %p.\n", + iface, Flags, Clipper, UnkOuter); + return DirectDrawCreateClipper(Flags, Clipper, UnkOuter); } @@ -3877,8 +3803,10 @@ { IDirectDrawImpl *This = (IDirectDrawImpl *)iface; IDirectDrawPaletteImpl *object; - HRESULT hr = DDERR_GENERIC; - TRACE("(%p)->(%x,%p,%p,%p)\n", This, Flags, ColorTable, Palette, pUnkOuter); + HRESULT hr; + + TRACE("iface %p, flags %#x, color_table %p, palette %p, outer_unknown %p.\n", + iface, Flags, ColorTable, Palette, pUnkOuter); EnterCriticalSection(&ddraw_cs); if(pUnkOuter != NULL) @@ -3904,20 +3832,16 @@ return E_OUTOFMEMORY; } - object->lpVtbl = &IDirectDrawPalette_Vtbl; - object->ref = 1; - - hr = IWineD3DDevice_CreatePalette(This->wineD3DDevice, Flags, - ColorTable, &object->wineD3DPalette, (IUnknown *)object); - if(hr != DD_OK) + hr = ddraw_palette_init(object, This, Flags, ColorTable); + if (FAILED(hr)) { + WARN("Failed to initialize palette, hr %#x.\n", hr); HeapFree(GetProcessHeap(), 0, object); LeaveCriticalSection(&ddraw_cs); return hr; } - IDirectDraw7_AddRef(iface); - object->ifaceToRelease = (IUnknown *) iface; + TRACE("Created palette %p.\n", object); *Palette = (IDirectDrawPalette *)object; LeaveCriticalSection(&ddraw_cs); return DD_OK; @@ -4024,10 +3948,9 @@ static HRESULT WINAPI ddraw7_DuplicateSurface(IDirectDraw7 *iface, IDirectDrawSurface7 *Src, IDirectDrawSurface7 **Dest) { - IDirectDrawImpl *This = (IDirectDrawImpl *)iface; IDirectDrawSurfaceImpl *Surf = (IDirectDrawSurfaceImpl *)Src; - FIXME("(%p)->(%p,%p)\n", This, Surf, Dest); + FIXME("iface %p, src %p, dst %p partial stub!\n", iface, Src, Dest); /* For now, simply create a new, independent surface */ return IDirectDraw7_CreateSurface(iface, @@ -4054,7 +3977,7 @@ TRACE("iface %p, src %p, dst %p.\n", iface, src, dst); src7 = (IDirectDrawSurface7 *)surface_from_surface3((IDirectDrawSurface3 *)src); hr = ddraw7_DuplicateSurface((IDirectDraw7 *)ddraw_from_ddraw3(iface), src7, &dst7); - if (!SUCCEEDED(hr)) + if (FAILED(hr)) return hr; *dst = (IDirectDrawSurface *)&((IDirectDrawSurfaceImpl *)dst7)->IDirectDrawSurface3_vtbl; return hr; @@ -4069,7 +3992,7 @@ TRACE("iface %p, src %p, dst %p.\n", iface, src, dst); src7 = (IDirectDrawSurface7 *)surface_from_surface3((IDirectDrawSurface3 *)src); hr = ddraw7_DuplicateSurface((IDirectDraw7 *)ddraw_from_ddraw2(iface), src7, &dst7); - if (!SUCCEEDED(hr)) + if (FAILED(hr)) return hr; *dst = (IDirectDrawSurface *)&((IDirectDrawSurfaceImpl *)dst7)->IDirectDrawSurface3_vtbl; return hr; @@ -4084,61 +4007,1142 @@ TRACE("iface %p, src %p, dst %p.\n", iface, src, dst); src7 = (IDirectDrawSurface7 *)surface_from_surface3((IDirectDrawSurface3 *)src); hr = ddraw7_DuplicateSurface((IDirectDraw7 *)ddraw_from_ddraw1(iface), src7, &dst7); - if (!SUCCEEDED(hr)) + if (FAILED(hr)) return hr; *dst = (IDirectDrawSurface *)&((IDirectDrawSurfaceImpl *)dst7)->IDirectDrawSurface3_vtbl; return hr; } /***************************************************************************** - * IDirectDraw7 VTable + * IDirect3D7::EnumDevices + * + * The EnumDevices method for IDirect3D7. It enumerates all supported + * D3D7 devices. Currently the T&L, HAL and RGB devices are enumerated. + * + * Params: + * callback: Function to call for each enumerated device + * context: Pointer to pass back to the app + * + * Returns: + * D3D_OK, or the return value of the GetCaps call + * *****************************************************************************/ -const IDirectDraw7Vtbl IDirectDraw7_Vtbl = +static HRESULT WINAPI d3d7_EnumDevices(IDirect3D7 *iface, LPD3DENUMDEVICESCALLBACK7 callback, void *context) { - /* IUnknown */ - ddraw7_QueryInterface, - ddraw7_AddRef, - ddraw7_Release, - /* IDirectDraw */ - ddraw7_Compact, - ddraw7_CreateClipper, - ddraw7_CreatePalette, - ddraw7_CreateSurface, - ddraw7_DuplicateSurface, - ddraw7_EnumDisplayModes, - ddraw7_EnumSurfaces, - ddraw7_FlipToGDISurface, - ddraw7_GetCaps, - ddraw7_GetDisplayMode, - ddraw7_GetFourCCCodes, - ddraw7_GetGDISurface, - ddraw7_GetMonitorFrequency, - ddraw7_GetScanLine, - ddraw7_GetVerticalBlankStatus, - ddraw7_Initialize, - ddraw7_RestoreDisplayMode, - ddraw7_SetCooperativeLevel, - ddraw7_SetDisplayMode, - ddraw7_WaitForVerticalBlank, - /* IDirectDraw2 */ - ddraw7_GetAvailableVidMem, - /* IDirectDraw3 */ - ddraw7_GetSurfaceFromDC, - /* IDirectDraw4 */ - ddraw7_RestoreAllSurfaces, - ddraw7_TestCooperativeLevel, - ddraw7_GetDeviceIdentifier, - /* IDirectDraw7 */ - ddraw7_StartModeTest, - ddraw7_EvaluateMode -}; + char interface_name_tnl[] = "WINE Direct3D7 Hardware Transform and Lighting acceleration using WineD3D"; + char device_name_tnl[] = "Wine D3D7 T&L HAL"; + char interface_name_hal[] = "WINE Direct3D7 Hardware acceleration using WineD3D"; + char device_name_hal[] = "Wine D3D7 HAL"; + char interface_name_rgb[] = "WINE Direct3D7 RGB Software Emulation using WineD3D"; + char device_name_rgb[] = "Wine D3D7 RGB"; + + IDirectDrawImpl *ddraw = ddraw_from_d3d7(iface); + D3DDEVICEDESC7 device_desc7; + D3DDEVICEDESC device_desc1; + HRESULT hr; + + TRACE("iface %p, callback %p, context %p.\n", iface, callback, context); + + EnterCriticalSection(&ddraw_cs); + + hr = IDirect3DImpl_GetCaps(ddraw->wineD3D, &device_desc1, &device_desc7); + if (hr != D3D_OK) + { + LeaveCriticalSection(&ddraw_cs); + return hr; + } + callback(interface_name_tnl, device_name_tnl, &device_desc7, context); + + device_desc7.deviceGUID = IID_IDirect3DHALDevice; + callback(interface_name_hal, device_name_hal, &device_desc7, context); + + device_desc7.deviceGUID = IID_IDirect3DRGBDevice; + callback(interface_name_rgb, device_name_rgb, &device_desc7, context); + + TRACE("End of enumeration.\n"); + + LeaveCriticalSection(&ddraw_cs); -const struct IDirectDraw4Vtbl IDirectDraw4_Vtbl = + return D3D_OK; +} + +/***************************************************************************** + * IDirect3D3::EnumDevices + * + * Enumerates all supported Direct3DDevice interfaces. This is the + * implementation for Direct3D 1 to Direc3D 3, Version 7 has its own. + * + * Version 1, 2 and 3 + * + * Params: + * callback: Application-provided routine to call for each enumerated device + * Context: Pointer to pass to the callback + * + * Returns: + * D3D_OK on success, + * The result of IDirect3DImpl_GetCaps if it failed + * + *****************************************************************************/ +static HRESULT WINAPI d3d3_EnumDevices(IDirect3D3 *iface, LPD3DENUMDEVICESCALLBACK callback, void *context) { - /* IUnknown */ - ddraw4_QueryInterface, - ddraw4_AddRef, - ddraw4_Release, + static CHAR wined3d_description[] = "Wine D3DDevice using WineD3D and OpenGL"; + + IDirectDrawImpl *ddraw = ddraw_from_d3d3(iface); + D3DDEVICEDESC device_desc1, hal_desc, hel_desc; + D3DDEVICEDESC7 device_desc7; + HRESULT hr; + + /* Some games (Motoracer 2 demo) have the bad idea to modify the device + * name string. Let's put the string in a sufficiently sized array in + * writable memory. */ + char device_name[50]; + strcpy(device_name,"Direct3D HEL"); + + TRACE("iface %p, callback %p, context %p.\n", iface, callback, context); + + EnterCriticalSection(&ddraw_cs); + + hr = IDirect3DImpl_GetCaps(ddraw->wineD3D, &device_desc1, &device_desc7); + if (hr != D3D_OK) + { + LeaveCriticalSection(&ddraw_cs); + return hr; + } + + /* Do I have to enumerate the reference id? Note from old d3d7: + * "It seems that enumerating the reference IID on Direct3D 1 games + * (AvP / Motoracer2) breaks them". So do not enumerate this iid in V1 + * + * There's a registry key HKLM\Software\Microsoft\Direct3D\Drivers, + * EnumReference which enables / disables enumerating the reference + * rasterizer. It's a DWORD, 0 means disabled, 2 means enabled. The + * enablerefrast.reg and disablerefrast.reg files in the DirectX 7.0 sdk + * demo directory suggest this. + * + * Some games(GTA 2) seem to use the second enumerated device, so I have + * to enumerate at least 2 devices. So enumerate the reference device to + * have 2 devices. + * + * Other games (Rollcage) tell emulation and hal device apart by certain + * flags. Rollcage expects D3DPTEXTURECAPS_POW2 to be set (yeah, it is a + * limitation flag), and it refuses all devices that have the perspective + * flag set. This way it refuses the emulation device, and HAL devices + * never have POW2 unset in d3d7 on windows. */ + if (ddraw->d3dversion != 1) + { + static CHAR reference_description[] = "RGB Direct3D emulation"; + + TRACE("Enumerating WineD3D D3DDevice interface.\n"); + hal_desc = device_desc1; + hel_desc = device_desc1; + /* The rgb device has the pow2 flag set in the hel caps, but not in the hal caps. */ + hal_desc.dpcLineCaps.dwTextureCaps &= ~(D3DPTEXTURECAPS_POW2 + | D3DPTEXTURECAPS_NONPOW2CONDITIONAL | D3DPTEXTURECAPS_PERSPECTIVE); + hal_desc.dpcTriCaps.dwTextureCaps &= ~(D3DPTEXTURECAPS_POW2 + | D3DPTEXTURECAPS_NONPOW2CONDITIONAL | D3DPTEXTURECAPS_PERSPECTIVE); + hr = callback((GUID *)&IID_IDirect3DRGBDevice, reference_description, + device_name, &hal_desc, &hel_desc, context); + if (hr != D3DENUMRET_OK) + { + TRACE("Application cancelled the enumeration.\n"); + LeaveCriticalSection(&ddraw_cs); + return D3D_OK; + } + } + + strcpy(device_name,"Direct3D HAL"); + + TRACE("Enumerating HAL Direct3D device.\n"); + hal_desc = device_desc1; + hel_desc = device_desc1; + /* The hal device does not have the pow2 flag set in hel, but in hal. */ + hel_desc.dpcLineCaps.dwTextureCaps &= ~(D3DPTEXTURECAPS_POW2 + | D3DPTEXTURECAPS_NONPOW2CONDITIONAL | D3DPTEXTURECAPS_PERSPECTIVE); + hel_desc.dpcTriCaps.dwTextureCaps &= ~(D3DPTEXTURECAPS_POW2 + | D3DPTEXTURECAPS_NONPOW2CONDITIONAL | D3DPTEXTURECAPS_PERSPECTIVE); + hr = callback((GUID *)&IID_IDirect3DHALDevice, wined3d_description, + device_name, &hal_desc, &hel_desc, context); + if (hr != D3DENUMRET_OK) + { + TRACE("Application cancelled the enumeration.\n"); + LeaveCriticalSection(&ddraw_cs); + return D3D_OK; + } + + TRACE("End of enumeration.\n"); + + LeaveCriticalSection(&ddraw_cs); + return D3D_OK; +} + +static HRESULT WINAPI d3d2_EnumDevices(IDirect3D2 *iface, LPD3DENUMDEVICESCALLBACK callback, void *context) +{ + TRACE("iface %p, callback %p, context %p.\n", iface, callback, context); + + return d3d3_EnumDevices((IDirect3D3 *)&ddraw_from_d3d2(iface)->IDirect3D3_vtbl, callback, context); +} + +static HRESULT WINAPI d3d1_EnumDevices(IDirect3D *iface, LPD3DENUMDEVICESCALLBACK callback, void *context) +{ + TRACE("iface %p, callback %p, context %p.\n", iface, callback, context); + + return d3d3_EnumDevices((IDirect3D3 *)&ddraw_from_d3d1(iface)->IDirect3D3_vtbl, callback, context); +} + +/***************************************************************************** + * IDirect3D3::CreateLight + * + * Creates an IDirect3DLight interface. This interface is used in + * Direct3D3 or earlier for lighting. In Direct3D7 it has been replaced + * by the DIRECT3DLIGHT7 structure. Wine's Direct3DLight implementation + * uses the IDirect3DDevice7 interface with D3D7 lights. + * + * Version 1, 2 and 3 + * + * Params: + * light: Address to store the new interface pointer + * outer_unknown: Basically for aggregation, but ddraw doesn't support it. + * Must be NULL + * + * Returns: + * D3D_OK on success + * DDERR_OUTOFMEMORY if memory allocation failed + * CLASS_E_NOAGGREGATION if outer_unknown != NULL + * + *****************************************************************************/ +static HRESULT WINAPI d3d3_CreateLight(IDirect3D3 *iface, IDirect3DLight **light, IUnknown *outer_unknown) +{ + IDirect3DLightImpl *object; + + TRACE("iface %p, light %p, outer_unknown %p.\n", iface, light, outer_unknown); + + if (outer_unknown) return CLASS_E_NOAGGREGATION; + + object = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(*object)); + if (!object) + { + ERR("Failed to allocate light memory.\n"); + return DDERR_OUTOFMEMORY; + } + + d3d_light_init(object, ddraw_from_d3d3(iface)); + + TRACE("Created light %p.\n", object); + *light = (IDirect3DLight *)object; + + return D3D_OK; +} + +static HRESULT WINAPI d3d2_CreateLight(IDirect3D2 *iface, IDirect3DLight **light, IUnknown *outer_unknown) +{ + TRACE("iface %p, light %p, outer_unknown %p.\n", iface, light, outer_unknown); + + return d3d3_CreateLight((IDirect3D3 *)&ddraw_from_d3d2(iface)->IDirect3D3_vtbl, light, outer_unknown); +} + +static HRESULT WINAPI d3d1_CreateLight(IDirect3D *iface, IDirect3DLight **light, IUnknown *outer_unknown) +{ + TRACE("iface %p, light %p, outer_unknown %p.\n", iface, light, outer_unknown); + + return d3d3_CreateLight((IDirect3D3 *)&ddraw_from_d3d1(iface)->IDirect3D3_vtbl, light, outer_unknown); +} + +/***************************************************************************** + * IDirect3D3::CreateMaterial + * + * Creates an IDirect3DMaterial interface. This interface is used by Direct3D3 + * and older versions. The IDirect3DMaterial implementation wraps its + * functionality to IDirect3DDevice7::SetMaterial and friends. + * + * Version 1, 2 and 3 + * + * Params: + * material: Address to store the new interface's pointer to + * outer_unknown: Basically for aggregation, but ddraw doesn't support it. + * Must be NULL + * + * Returns: + * D3D_OK on success + * DDERR_OUTOFMEMORY if memory allocation failed + * CLASS_E_NOAGGREGATION if outer_unknown != NULL + * + *****************************************************************************/ +static HRESULT WINAPI d3d3_CreateMaterial(IDirect3D3 *iface, IDirect3DMaterial3 **material, IUnknown *outer_unknown) +{ + IDirect3DMaterialImpl *object; + + TRACE("iface %p, material %p, outer_unknown %p.\n", iface, material, outer_unknown); + + if (outer_unknown) return CLASS_E_NOAGGREGATION; + + object = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(*object)); + if (!object) + { + ERR("Failed to allocate material memory.\n"); + return DDERR_OUTOFMEMORY; + } + + d3d_material_init(object, ddraw_from_d3d3(iface)); + + TRACE("Created material %p.\n", object); + *material = (IDirect3DMaterial3 *)object; + + return D3D_OK; +} + +static HRESULT WINAPI d3d2_CreateMaterial(IDirect3D2 *iface, IDirect3DMaterial2 **material, IUnknown *outer_unknown) +{ + IDirect3DMaterial3 *material3; + HRESULT hr; + + TRACE("iface %p, material %p, outer_unknown %p.\n", iface, material, outer_unknown); + + hr = d3d3_CreateMaterial((IDirect3D3 *)&ddraw_from_d3d2(iface)->IDirect3D3_vtbl, &material3, outer_unknown); + *material = material3 ? (IDirect3DMaterial2 *)&((IDirect3DMaterialImpl *)material3)->IDirect3DMaterial2_vtbl : NULL; + + TRACE("Returning material %p.\n", *material); + + return hr; +} + +static HRESULT WINAPI d3d1_CreateMaterial(IDirect3D *iface, IDirect3DMaterial **material, IUnknown *outer_unknown) +{ + IDirect3DMaterial3 *material3; + HRESULT hr; + + TRACE("iface %p, material %p, outer_unknown %p.\n", iface, material, outer_unknown); + + hr = d3d3_CreateMaterial((IDirect3D3 *)&ddraw_from_d3d1(iface)->IDirect3D3_vtbl, &material3, outer_unknown); + *material = material3 ? (IDirect3DMaterial *)&((IDirect3DMaterialImpl *)material3)->IDirect3DMaterial_vtbl : NULL; + + TRACE("Returning material %p.\n", *material); + + return hr; +} + +/***************************************************************************** + * IDirect3D3::CreateViewport + * + * Creates an IDirect3DViewport interface. This interface is used + * by Direct3D and earlier versions for Viewport management. In Direct3D7 + * it has been replaced by a viewport structure and + * IDirect3DDevice7::*Viewport. Wine's IDirect3DViewport implementation + * uses the IDirect3DDevice7 methods for its functionality + * + * Params: + * Viewport: Address to store the new interface pointer + * outer_unknown: Basically for aggregation, but ddraw doesn't support it. + * Must be NULL + * + * Returns: + * D3D_OK on success + * DDERR_OUTOFMEMORY if memory allocation failed + * CLASS_E_NOAGGREGATION if outer_unknown != NULL + * + *****************************************************************************/ +static HRESULT WINAPI d3d3_CreateViewport(IDirect3D3 *iface, IDirect3DViewport3 **viewport, IUnknown *outer_unknown) +{ + IDirect3DViewportImpl *object; + + TRACE("iface %p, viewport %p, outer_unknown %p.\n", iface, viewport, outer_unknown); + + if (outer_unknown) return CLASS_E_NOAGGREGATION; + + object = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(*object)); + if (!object) + { + ERR("Failed to allocate viewport memory.\n"); + return DDERR_OUTOFMEMORY; + } + + d3d_viewport_init(object, ddraw_from_d3d3(iface)); + + TRACE("Created viewport %p.\n", object); + *viewport = (IDirect3DViewport3 *)object; + + return D3D_OK; +} + +static HRESULT WINAPI d3d2_CreateViewport(IDirect3D2 *iface, IDirect3DViewport2 **viewport, IUnknown *outer_unknown) +{ + TRACE("iface %p, viewport %p, outer_unknown %p.\n", iface, viewport, outer_unknown); + + return d3d3_CreateViewport((IDirect3D3 *)&ddraw_from_d3d2(iface)->IDirect3D3_vtbl, + (IDirect3DViewport3 **)viewport, outer_unknown); +} + +static HRESULT WINAPI d3d1_CreateViewport(IDirect3D *iface, IDirect3DViewport **viewport, IUnknown *outer_unknown) +{ + TRACE("iface %p, viewport %p, outer_unknown %p.\n", iface, viewport, outer_unknown); + + return d3d3_CreateViewport((IDirect3D3 *)&ddraw_from_d3d1(iface)->IDirect3D3_vtbl, + (IDirect3DViewport3 **)viewport, outer_unknown); +} + +/***************************************************************************** + * IDirect3D3::FindDevice + * + * This method finds a device with the requested properties and returns a + * device description + * + * Verion 1, 2 and 3 + * Params: + * fds: Describes the requested device characteristics + * fdr: Returns the device description + * + * Returns: + * D3D_OK on success + * DDERR_INVALIDPARAMS if no device was found + * + *****************************************************************************/ +static HRESULT WINAPI d3d3_FindDevice(IDirect3D3 *iface, D3DFINDDEVICESEARCH *fds, D3DFINDDEVICERESULT *fdr) +{ + IDirectDrawImpl *ddraw = ddraw_from_d3d3(iface); + D3DDEVICEDESC7 desc7; + D3DDEVICEDESC desc1; + HRESULT hr; + + TRACE("iface %p, fds %p, fdr %p.\n", iface, fds, fdr); + + if (!fds || !fdr) return DDERR_INVALIDPARAMS; + + if (fds->dwSize != sizeof(D3DFINDDEVICESEARCH) + || fdr->dwSize != sizeof(D3DFINDDEVICERESULT)) + return DDERR_INVALIDPARAMS; + + if ((fds->dwFlags & D3DFDS_COLORMODEL) + && fds->dcmColorModel != D3DCOLOR_RGB) + { + WARN("Trying to request a non-RGB D3D color model. Not supported.\n"); + return DDERR_INVALIDPARAMS; /* No real idea what to return here :-) */ + } + + if (fds->dwFlags & D3DFDS_GUID) + { + TRACE("Trying to match guid %s.\n", debugstr_guid(&(fds->guid))); + if (!IsEqualGUID(&IID_D3DDEVICE_WineD3D, &fds->guid) + && !IsEqualGUID(&IID_IDirect3DHALDevice, &fds->guid) + && !IsEqualGUID(&IID_IDirect3DRGBDevice, &fds->guid)) + { + WARN("No match for this GUID.\n"); + return DDERR_NOTFOUND; + } + } + + /* Get the caps */ + hr = IDirect3DImpl_GetCaps(ddraw->wineD3D, &desc1, &desc7); + if (hr != D3D_OK) return hr; + + /* Now return our own GUID */ + fdr->guid = IID_D3DDEVICE_WineD3D; + fdr->ddHwDesc = desc1; + fdr->ddSwDesc = desc1; + + TRACE("Returning Wine's wined3d device with (undumped) capabilities.\n"); + + return D3D_OK; +} + +static HRESULT WINAPI d3d2_FindDevice(IDirect3D2 *iface, D3DFINDDEVICESEARCH *fds, D3DFINDDEVICERESULT *fdr) +{ + TRACE("iface %p, fds %p, fdr %p.\n", iface, fds, fdr); + + return d3d3_FindDevice((IDirect3D3 *)&ddraw_from_d3d2(iface)->IDirect3D3_vtbl, fds, fdr); +} + +static HRESULT WINAPI d3d1_FindDevice(IDirect3D *iface, D3DFINDDEVICESEARCH *fds, D3DFINDDEVICERESULT *fdr) +{ + TRACE("iface %p, fds %p, fdr %p.\n", iface, fds, fdr); + + return d3d3_FindDevice((IDirect3D3 *)&ddraw_from_d3d1(iface)->IDirect3D3_vtbl, fds, fdr); +} + +/***************************************************************************** + * IDirect3D7::CreateDevice + * + * Creates an IDirect3DDevice7 interface. + * + * Version 2, 3 and 7. IDirect3DDevice 1 interfaces are interfaces to + * DirectDraw surfaces and are created with + * IDirectDrawSurface::QueryInterface. This method uses CreateDevice to + * create the device object and QueryInterfaces for IDirect3DDevice + * + * Params: + * refiid: IID of the device to create + * Surface: Initial rendertarget + * Device: Address to return the interface pointer + * + * Returns: + * D3D_OK on success + * DDERR_OUTOFMEMORY if memory allocation failed + * DDERR_INVALIDPARAMS if a device exists already + * + *****************************************************************************/ +static HRESULT WINAPI d3d7_CreateDevice(IDirect3D7 *iface, REFCLSID riid, + IDirectDrawSurface7 *surface, IDirect3DDevice7 **device) +{ + IDirectDrawSurfaceImpl *target = (IDirectDrawSurfaceImpl *)surface; + IDirectDrawImpl *ddraw = ddraw_from_d3d7(iface); + IDirect3DDeviceImpl *object; + HRESULT hr; + + TRACE("iface %p, riid %s, surface %p, device %p.\n", iface, debugstr_guid(riid), surface, device); + + EnterCriticalSection(&ddraw_cs); + *device = NULL; + + /* Fail device creation if non-opengl surfaces are used. */ + if (ddraw->ImplType != SURFACE_OPENGL) + { + ERR("The application wants to create a Direct3D device, but non-opengl surfaces are set in the registry.\n"); + ERR("Please set the surface implementation to opengl or autodetection to allow 3D rendering.\n"); + + /* We only hit this path if a default surface is set in the registry. Incorrect autodetection + * is caught in CreateSurface or QueryInterface. */ + LeaveCriticalSection(&ddraw_cs); + return DDERR_NO3D; + } + + if (ddraw->d3ddevice) + { + FIXME("Only one Direct3D device per DirectDraw object supported.\n"); + LeaveCriticalSection(&ddraw_cs); + return DDERR_INVALIDPARAMS; + } + + object = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(*object)); + if (!object) + { + ERR("Failed to allocate device memory.\n"); + LeaveCriticalSection(&ddraw_cs); + return DDERR_OUTOFMEMORY; + } + + hr = d3d_device_init(object, ddraw, target); + if (FAILED(hr)) + { + WARN("Failed to initialize device, hr %#x.\n", hr); + HeapFree(GetProcessHeap(), 0, object); + LeaveCriticalSection(&ddraw_cs); + return hr; + } + + TRACE("Created device %p.\n", object); + *device = (IDirect3DDevice7 *)object; + + LeaveCriticalSection(&ddraw_cs); + return D3D_OK; +} + +static HRESULT WINAPI d3d3_CreateDevice(IDirect3D3 *iface, REFCLSID riid, + IDirectDrawSurface4 *surface, IDirect3DDevice3 **device, IUnknown *outer_unknown) +{ + HRESULT hr; + + TRACE("iface %p, riid %s, surface %p, device %p, outer_unknown %p.\n", + iface, debugstr_guid(riid), surface, device, outer_unknown); + + if (outer_unknown) return CLASS_E_NOAGGREGATION; + + hr = d3d7_CreateDevice((IDirect3D7 *)&ddraw_from_d3d3(iface)->IDirect3D7_vtbl, riid, + (IDirectDrawSurface7 *)surface, (IDirect3DDevice7 **)device); + if (*device) *device = (IDirect3DDevice3 *)&((IDirect3DDeviceImpl *)*device)->IDirect3DDevice3_vtbl; + + return hr; +} + +static HRESULT WINAPI d3d2_CreateDevice(IDirect3D2 *iface, REFCLSID riid, + IDirectDrawSurface *surface, IDirect3DDevice2 **device) +{ + HRESULT hr; + + TRACE("iface %p, riid %s, surface %p, device %p.\n", + iface, debugstr_guid(riid), surface, device); + + hr = d3d7_CreateDevice((IDirect3D7 *)&ddraw_from_d3d2(iface)->IDirect3D7_vtbl, riid, + surface ? (IDirectDrawSurface7 *)surface_from_surface3((IDirectDrawSurface3 *)surface) : NULL, + (IDirect3DDevice7 **)device); + if (*device) *device = (IDirect3DDevice2 *)&((IDirect3DDeviceImpl *)*device)->IDirect3DDevice2_vtbl; + + return hr; +} + +/***************************************************************************** + * IDirect3D7::CreateVertexBuffer + * + * Creates a new vertex buffer object and returns a IDirect3DVertexBuffer7 + * interface. + * + * Version 3 and 7 + * + * Params: + * desc: Requested Vertex buffer properties + * vertex_buffer: Address to return the interface pointer at + * flags: Some flags, should be 0 + * + * Returns + * D3D_OK on success + * DDERR_OUTOFMEMORY if memory allocation failed + * The return value of IWineD3DDevice::CreateVertexBuffer if this call fails + * DDERR_INVALIDPARAMS if desc or vertex_buffer are NULL + * + *****************************************************************************/ +static HRESULT WINAPI d3d7_CreateVertexBuffer(IDirect3D7 *iface, D3DVERTEXBUFFERDESC *desc, + IDirect3DVertexBuffer7 **vertex_buffer, DWORD flags) +{ + IDirect3DVertexBufferImpl *object; + HRESULT hr; + + TRACE("iface %p, desc %p, vertex_buffer %p, flags %#x.\n", + iface, desc, vertex_buffer, flags); + + if (!vertex_buffer || !desc) return DDERR_INVALIDPARAMS; + + TRACE("Vertex buffer description:\n"); + TRACE(" dwSize %u\n", desc->dwSize); + TRACE(" dwCaps %#x\n", desc->dwCaps); + TRACE(" FVF %#x\n", desc->dwFVF); + TRACE(" dwNumVertices %u\n", desc->dwNumVertices); + + /* Now create the vertex buffer */ + object = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(*object)); + if (!object) + { + ERR("Failed to allocate vertex buffer memory.\n"); + return DDERR_OUTOFMEMORY; + } + + hr = d3d_vertex_buffer_init(object, ddraw_from_d3d7(iface), desc); + if (FAILED(hr)) + { + WARN("Failed to initialize vertex buffer, hr %#x.\n", hr); + HeapFree(GetProcessHeap(), 0, object); + return hr; + } + + TRACE("Created vertex buffer %p.\n", object); + *vertex_buffer = (IDirect3DVertexBuffer7 *)object; + + return D3D_OK; +} + +static HRESULT WINAPI d3d3_CreateVertexBuffer(IDirect3D3 *iface, D3DVERTEXBUFFERDESC *desc, + IDirect3DVertexBuffer **vertex_buffer, DWORD flags, IUnknown *outer_unknown) +{ + IDirectDrawImpl *This = ddraw_from_d3d3(iface); + HRESULT hr; + + TRACE("iface %p, desc %p, vertex_buffer %p, flags %#x, outer_unknown %p.\n", + iface, desc, vertex_buffer, flags, outer_unknown); + + if (outer_unknown) return CLASS_E_NOAGGREGATION; + + hr = d3d7_CreateVertexBuffer((IDirect3D7 *)&This->IDirect3D7_vtbl, + desc, (IDirect3DVertexBuffer7 **)vertex_buffer, flags); + if (*vertex_buffer) + *vertex_buffer = (IDirect3DVertexBuffer *)&((IDirect3DVertexBufferImpl *)*vertex_buffer)->IDirect3DVertexBuffer_vtbl; + + return hr; +} + +/***************************************************************************** + * IDirect3D7::EnumZBufferFormats + * + * Enumerates all supported Z buffer pixel formats + * + * Version 3 and 7 + * + * Params: + * device_iid: + * callback: callback to call for each pixel format + * context: Pointer to pass back to the callback + * + * Returns: + * D3D_OK on success + * DDERR_INVALIDPARAMS if callback is NULL + * For details, see IWineD3DDevice::EnumZBufferFormats + * + *****************************************************************************/ +static HRESULT WINAPI d3d7_EnumZBufferFormats(IDirect3D7 *iface, REFCLSID device_iid, + LPD3DENUMPIXELFORMATSCALLBACK callback, void *context) +{ + IDirectDrawImpl *ddraw = ddraw_from_d3d7(iface); + WINED3DDISPLAYMODE d3ddm; + WINED3DDEVTYPE type; + unsigned int i; + HRESULT hr; + + /* Order matters. Specifically, BattleZone II (full version) expects the + * 16-bit depth formats to be listed before the 24 and 32 ones. */ + static const WINED3DFORMAT formats[] = + { + WINED3DFMT_S1_UINT_D15_UNORM, + WINED3DFMT_D16_UNORM, + WINED3DFMT_X8D24_UNORM, + WINED3DFMT_S4X4_UINT_D24_UNORM, + WINED3DFMT_D24_UNORM_S8_UINT, + WINED3DFMT_D32_UNORM, + }; + + TRACE("iface %p, device_iid %s, callback %p, context %p.\n", + iface, debugstr_guid(device_iid), callback, context); + + if (!callback) return DDERR_INVALIDPARAMS; + + if (IsEqualGUID(device_iid, &IID_IDirect3DHALDevice) + || IsEqualGUID(device_iid, &IID_IDirect3DTnLHalDevice) + || IsEqualGUID(device_iid, &IID_D3DDEVICE_WineD3D)) + { + TRACE("Asked for HAL device.\n"); + type = WINED3DDEVTYPE_HAL; + } + else if (IsEqualGUID(device_iid, &IID_IDirect3DRGBDevice) + || IsEqualGUID(device_iid, &IID_IDirect3DMMXDevice)) + { + TRACE("Asked for SW device.\n"); + type = WINED3DDEVTYPE_SW; + } + else if (IsEqualGUID(device_iid, &IID_IDirect3DRefDevice)) + { + TRACE("Asked for REF device.\n"); + type = WINED3DDEVTYPE_REF; + } + else if (IsEqualGUID(device_iid, &IID_IDirect3DNullDevice)) + { + TRACE("Asked for NULLREF device.\n"); + type = WINED3DDEVTYPE_NULLREF; + } + else + { + FIXME("Unexpected device GUID %s.\n", debugstr_guid(device_iid)); + type = WINED3DDEVTYPE_HAL; + } + + EnterCriticalSection(&ddraw_cs); + /* We need an adapter format from somewhere to please wined3d and WGL. + * Use the current display mode. So far all cards offer the same depth + * stencil format for all modes, but if some do not and applications do + * not like that we'll have to find some workaround, like iterating over + * all imaginable formats and collecting all the depth stencil formats we + * can get. */ + hr = IWineD3DDevice_GetDisplayMode(ddraw->wineD3DDevice, 0, &d3ddm); + + for (i = 0; i < (sizeof(formats) / sizeof(*formats)); ++i) + { + hr = IWineD3D_CheckDeviceFormat(ddraw->wineD3D, WINED3DADAPTER_DEFAULT, type, d3ddm.Format, + WINED3DUSAGE_DEPTHSTENCIL, WINED3DRTYPE_SURFACE, formats[i], SURFACE_OPENGL); + if (SUCCEEDED(hr)) + { + DDPIXELFORMAT pformat; + + memset(&pformat, 0, sizeof(pformat)); + pformat.dwSize = sizeof(pformat); + PixelFormat_WineD3DtoDD(&pformat, formats[i]); + + TRACE("Enumerating wined3d format %#x.\n", formats[i]); + hr = callback(&pformat, context); + if (hr != DDENUMRET_OK) + { + TRACE("Format enumeration cancelled by application.\n"); + LeaveCriticalSection(&ddraw_cs); + return D3D_OK; + } + } + } + TRACE("End of enumeration.\n"); + + LeaveCriticalSection(&ddraw_cs); + return D3D_OK; +} + +static HRESULT WINAPI d3d3_EnumZBufferFormats(IDirect3D3 *iface, REFCLSID device_iid, + LPD3DENUMPIXELFORMATSCALLBACK callback, void *context) +{ + TRACE("iface %p, device_iid %s, callback %p, context %p.\n", + iface, debugstr_guid(device_iid), callback, context); + + return d3d7_EnumZBufferFormats((IDirect3D7 *)&ddraw_from_d3d3(iface)->IDirect3D7_vtbl, + device_iid, callback, context); +} + +/***************************************************************************** + * IDirect3D7::EvictManagedTextures + * + * Removes all managed textures (=surfaces with DDSCAPS2_TEXTUREMANAGE or + * DDSCAPS2_D3DTEXTUREMANAGE caps) to be removed from video memory. + * + * Version 3 and 7 + * + * Returns: + * D3D_OK, because it's a stub + * + *****************************************************************************/ +static HRESULT WINAPI d3d7_EvictManagedTextures(IDirect3D7 *iface) +{ + FIXME("iface %p stub!\n", iface); + + /* TODO: Just enumerate resources using IWineD3DDevice_EnumResources(), + * then unload surfaces / textures. */ + + return D3D_OK; +} + +static HRESULT WINAPI d3d3_EvictManagedTextures(IDirect3D3 *iface) +{ + TRACE("iface %p.\n", iface); + + return d3d7_EvictManagedTextures((IDirect3D7 *)&ddraw_from_d3d3(iface)->IDirect3D7_vtbl); +} + +/***************************************************************************** + * IDirect3DImpl_GetCaps + * + * This function retrieves the device caps from wined3d + * and converts it into a D3D7 and D3D - D3D3 structure + * This is a helper function called from various places in ddraw + * + * Params: + * wined3d: The interface to get the caps from + * desc1: Old D3D <3 structure to fill (needed) + * desc7: D3D7 device desc structure to fill (needed) + * + * Returns + * D3D_OK on success, or the return value of IWineD3D::GetCaps + * + *****************************************************************************/ +HRESULT IDirect3DImpl_GetCaps(IWineD3D *wined3d, D3DDEVICEDESC *desc1, D3DDEVICEDESC7 *desc7) +{ + WINED3DCAPS wined3d_caps; + HRESULT hr; + + TRACE("wined3d %p, desc1 %p, desc7 %p.\n", wined3d, desc1, desc7); + + memset(&wined3d_caps, 0, sizeof(wined3d_caps)); + + EnterCriticalSection(&ddraw_cs); + hr = IWineD3D_GetDeviceCaps(wined3d, 0, WINED3DDEVTYPE_HAL, &wined3d_caps); + LeaveCriticalSection(&ddraw_cs); + if (FAILED(hr)) + { + WARN("Failed to get device caps, hr %#x.\n", hr); + return hr; + } + + /* Copy the results into the d3d7 and d3d3 structures */ + desc7->dwDevCaps = wined3d_caps.DevCaps; + desc7->dpcLineCaps.dwMiscCaps = wined3d_caps.PrimitiveMiscCaps; + desc7->dpcLineCaps.dwRasterCaps = wined3d_caps.RasterCaps; + desc7->dpcLineCaps.dwZCmpCaps = wined3d_caps.ZCmpCaps; + desc7->dpcLineCaps.dwSrcBlendCaps = wined3d_caps.SrcBlendCaps; + desc7->dpcLineCaps.dwDestBlendCaps = wined3d_caps.DestBlendCaps; + desc7->dpcLineCaps.dwAlphaCmpCaps = wined3d_caps.AlphaCmpCaps; + desc7->dpcLineCaps.dwShadeCaps = wined3d_caps.ShadeCaps; + desc7->dpcLineCaps.dwTextureCaps = wined3d_caps.TextureCaps; + desc7->dpcLineCaps.dwTextureFilterCaps = wined3d_caps.TextureFilterCaps; + desc7->dpcLineCaps.dwTextureAddressCaps = wined3d_caps.TextureAddressCaps; + + desc7->dwMaxTextureWidth = wined3d_caps.MaxTextureWidth; + desc7->dwMaxTextureHeight = wined3d_caps.MaxTextureHeight; + + desc7->dwMaxTextureRepeat = wined3d_caps.MaxTextureRepeat; + desc7->dwMaxTextureAspectRatio = wined3d_caps.MaxTextureAspectRatio; + desc7->dwMaxAnisotropy = wined3d_caps.MaxAnisotropy; + desc7->dvMaxVertexW = wined3d_caps.MaxVertexW; + + desc7->dvGuardBandLeft = wined3d_caps.GuardBandLeft; + desc7->dvGuardBandTop = wined3d_caps.GuardBandTop; + desc7->dvGuardBandRight = wined3d_caps.GuardBandRight; + desc7->dvGuardBandBottom = wined3d_caps.GuardBandBottom; + + desc7->dvExtentsAdjust = wined3d_caps.ExtentsAdjust; + desc7->dwStencilCaps = wined3d_caps.StencilCaps; + + desc7->dwFVFCaps = wined3d_caps.FVFCaps; + desc7->dwTextureOpCaps = wined3d_caps.TextureOpCaps; + + desc7->dwVertexProcessingCaps = wined3d_caps.VertexProcessingCaps; + desc7->dwMaxActiveLights = wined3d_caps.MaxActiveLights; + + /* Remove all non-d3d7 caps */ + desc7->dwDevCaps &= ( + D3DDEVCAPS_FLOATTLVERTEX | D3DDEVCAPS_SORTINCREASINGZ | D3DDEVCAPS_SORTDECREASINGZ | + D3DDEVCAPS_SORTEXACT | D3DDEVCAPS_EXECUTESYSTEMMEMORY | D3DDEVCAPS_EXECUTEVIDEOMEMORY | + D3DDEVCAPS_TLVERTEXSYSTEMMEMORY | D3DDEVCAPS_TLVERTEXVIDEOMEMORY | D3DDEVCAPS_TEXTURESYSTEMMEMORY | + D3DDEVCAPS_TEXTUREVIDEOMEMORY | D3DDEVCAPS_DRAWPRIMTLVERTEX | D3DDEVCAPS_CANRENDERAFTERFLIP | + D3DDEVCAPS_TEXTURENONLOCALVIDMEM | D3DDEVCAPS_DRAWPRIMITIVES2 | D3DDEVCAPS_SEPARATETEXTUREMEMORIES | + D3DDEVCAPS_DRAWPRIMITIVES2EX | D3DDEVCAPS_HWTRANSFORMANDLIGHT | D3DDEVCAPS_CANBLTSYSTONONLOCAL | + D3DDEVCAPS_HWRASTERIZATION); + + desc7->dwStencilCaps &= ( + D3DSTENCILCAPS_KEEP | D3DSTENCILCAPS_ZERO | D3DSTENCILCAPS_REPLACE | + D3DSTENCILCAPS_INCRSAT | D3DSTENCILCAPS_DECRSAT | D3DSTENCILCAPS_INVERT | + D3DSTENCILCAPS_INCR | D3DSTENCILCAPS_DECR); + + /* FVF caps ?*/ + + desc7->dwTextureOpCaps &= ( + D3DTEXOPCAPS_DISABLE | D3DTEXOPCAPS_SELECTARG1 | D3DTEXOPCAPS_SELECTARG2 | + D3DTEXOPCAPS_MODULATE | D3DTEXOPCAPS_MODULATE2X | D3DTEXOPCAPS_MODULATE4X | + D3DTEXOPCAPS_ADD | D3DTEXOPCAPS_ADDSIGNED | D3DTEXOPCAPS_ADDSIGNED2X | + D3DTEXOPCAPS_SUBTRACT | D3DTEXOPCAPS_ADDSMOOTH | D3DTEXOPCAPS_BLENDTEXTUREALPHA | + D3DTEXOPCAPS_BLENDFACTORALPHA | D3DTEXOPCAPS_BLENDTEXTUREALPHAPM | D3DTEXOPCAPS_BLENDCURRENTALPHA | + D3DTEXOPCAPS_PREMODULATE | D3DTEXOPCAPS_MODULATEALPHA_ADDCOLOR | D3DTEXOPCAPS_MODULATECOLOR_ADDALPHA | + D3DTEXOPCAPS_MODULATEINVALPHA_ADDCOLOR | D3DTEXOPCAPS_MODULATEINVCOLOR_ADDALPHA | D3DTEXOPCAPS_BUMPENVMAP | + D3DTEXOPCAPS_BUMPENVMAPLUMINANCE | D3DTEXOPCAPS_DOTPRODUCT3); + + desc7->dwVertexProcessingCaps &= ( + D3DVTXPCAPS_TEXGEN | D3DVTXPCAPS_MATERIALSOURCE7 | D3DVTXPCAPS_VERTEXFOG | + D3DVTXPCAPS_DIRECTIONALLIGHTS | D3DVTXPCAPS_POSITIONALLIGHTS | D3DVTXPCAPS_LOCALVIEWER); + + desc7->dpcLineCaps.dwMiscCaps &= ( + D3DPMISCCAPS_MASKPLANES | D3DPMISCCAPS_MASKZ | D3DPMISCCAPS_LINEPATTERNREP | + D3DPMISCCAPS_CONFORMANT | D3DPMISCCAPS_CULLNONE | D3DPMISCCAPS_CULLCW | + D3DPMISCCAPS_CULLCCW); + + desc7->dpcLineCaps.dwRasterCaps &= ( + D3DPRASTERCAPS_DITHER | D3DPRASTERCAPS_ROP2 | D3DPRASTERCAPS_XOR | + D3DPRASTERCAPS_PAT | D3DPRASTERCAPS_ZTEST | D3DPRASTERCAPS_SUBPIXEL | + D3DPRASTERCAPS_SUBPIXELX | D3DPRASTERCAPS_FOGVERTEX | D3DPRASTERCAPS_FOGTABLE | + D3DPRASTERCAPS_STIPPLE | D3DPRASTERCAPS_ANTIALIASSORTDEPENDENT | D3DPRASTERCAPS_ANTIALIASSORTINDEPENDENT | + D3DPRASTERCAPS_ANTIALIASEDGES | D3DPRASTERCAPS_MIPMAPLODBIAS | D3DPRASTERCAPS_ZBIAS | + D3DPRASTERCAPS_ZBUFFERLESSHSR | D3DPRASTERCAPS_FOGRANGE | D3DPRASTERCAPS_ANISOTROPY | + D3DPRASTERCAPS_WBUFFER | D3DPRASTERCAPS_TRANSLUCENTSORTINDEPENDENT | D3DPRASTERCAPS_WFOG | + D3DPRASTERCAPS_ZFOG); + + desc7->dpcLineCaps.dwZCmpCaps &= ( + D3DPCMPCAPS_NEVER | D3DPCMPCAPS_LESS | D3DPCMPCAPS_EQUAL | + D3DPCMPCAPS_LESSEQUAL | D3DPCMPCAPS_GREATER | D3DPCMPCAPS_NOTEQUAL | + D3DPCMPCAPS_GREATEREQUAL | D3DPCMPCAPS_ALWAYS); + + desc7->dpcLineCaps.dwSrcBlendCaps &= ( + D3DPBLENDCAPS_ZERO | D3DPBLENDCAPS_ONE | D3DPBLENDCAPS_SRCCOLOR | + D3DPBLENDCAPS_INVSRCCOLOR | D3DPBLENDCAPS_SRCALPHA | D3DPBLENDCAPS_INVSRCALPHA | + D3DPBLENDCAPS_DESTALPHA | D3DPBLENDCAPS_INVDESTALPHA | D3DPBLENDCAPS_DESTCOLOR | + D3DPBLENDCAPS_INVDESTCOLOR | D3DPBLENDCAPS_SRCALPHASAT | D3DPBLENDCAPS_BOTHSRCALPHA | + D3DPBLENDCAPS_BOTHINVSRCALPHA); + + desc7->dpcLineCaps.dwDestBlendCaps &= ( + D3DPBLENDCAPS_ZERO | D3DPBLENDCAPS_ONE | D3DPBLENDCAPS_SRCCOLOR | + D3DPBLENDCAPS_INVSRCCOLOR | D3DPBLENDCAPS_SRCALPHA | D3DPBLENDCAPS_INVSRCALPHA | + D3DPBLENDCAPS_DESTALPHA | D3DPBLENDCAPS_INVDESTALPHA | D3DPBLENDCAPS_DESTCOLOR | + D3DPBLENDCAPS_INVDESTCOLOR | D3DPBLENDCAPS_SRCALPHASAT | D3DPBLENDCAPS_BOTHSRCALPHA | + D3DPBLENDCAPS_BOTHINVSRCALPHA); + + desc7->dpcLineCaps.dwAlphaCmpCaps &= ( + D3DPCMPCAPS_NEVER | D3DPCMPCAPS_LESS | D3DPCMPCAPS_EQUAL | + D3DPCMPCAPS_LESSEQUAL | D3DPCMPCAPS_GREATER | D3DPCMPCAPS_NOTEQUAL | + D3DPCMPCAPS_GREATEREQUAL | D3DPCMPCAPS_ALWAYS); + + desc7->dpcLineCaps.dwShadeCaps &= ( + D3DPSHADECAPS_COLORFLATMONO | D3DPSHADECAPS_COLORFLATRGB | D3DPSHADECAPS_COLORGOURAUDMONO | + D3DPSHADECAPS_COLORGOURAUDRGB | D3DPSHADECAPS_COLORPHONGMONO | D3DPSHADECAPS_COLORPHONGRGB | + D3DPSHADECAPS_SPECULARFLATMONO | D3DPSHADECAPS_SPECULARFLATRGB | D3DPSHADECAPS_SPECULARGOURAUDMONO | + D3DPSHADECAPS_SPECULARGOURAUDRGB | D3DPSHADECAPS_SPECULARPHONGMONO | D3DPSHADECAPS_SPECULARPHONGRGB | + D3DPSHADECAPS_ALPHAFLATBLEND | D3DPSHADECAPS_ALPHAFLATSTIPPLED | D3DPSHADECAPS_ALPHAGOURAUDBLEND | + D3DPSHADECAPS_ALPHAGOURAUDSTIPPLED | D3DPSHADECAPS_ALPHAPHONGBLEND | D3DPSHADECAPS_ALPHAPHONGSTIPPLED | + D3DPSHADECAPS_FOGFLAT | D3DPSHADECAPS_FOGGOURAUD | D3DPSHADECAPS_FOGPHONG); + + desc7->dpcLineCaps.dwTextureCaps &= ( + D3DPTEXTURECAPS_PERSPECTIVE | D3DPTEXTURECAPS_POW2 | D3DPTEXTURECAPS_ALPHA | + D3DPTEXTURECAPS_TRANSPARENCY | D3DPTEXTURECAPS_BORDER | D3DPTEXTURECAPS_SQUAREONLY | + D3DPTEXTURECAPS_TEXREPEATNOTSCALEDBYSIZE | D3DPTEXTURECAPS_ALPHAPALETTE| D3DPTEXTURECAPS_NONPOW2CONDITIONAL | + D3DPTEXTURECAPS_PROJECTED | D3DPTEXTURECAPS_CUBEMAP | D3DPTEXTURECAPS_COLORKEYBLEND); + + desc7->dpcLineCaps.dwTextureFilterCaps &= ( + D3DPTFILTERCAPS_NEAREST | D3DPTFILTERCAPS_LINEAR | D3DPTFILTERCAPS_MIPNEAREST | + D3DPTFILTERCAPS_MIPLINEAR | D3DPTFILTERCAPS_LINEARMIPNEAREST | D3DPTFILTERCAPS_LINEARMIPLINEAR | + D3DPTFILTERCAPS_MINFPOINT | D3DPTFILTERCAPS_MINFLINEAR | D3DPTFILTERCAPS_MINFANISOTROPIC | + D3DPTFILTERCAPS_MIPFPOINT | D3DPTFILTERCAPS_MIPFLINEAR | D3DPTFILTERCAPS_MAGFPOINT | + D3DPTFILTERCAPS_MAGFLINEAR | D3DPTFILTERCAPS_MAGFANISOTROPIC | D3DPTFILTERCAPS_MAGFAFLATCUBIC | + D3DPTFILTERCAPS_MAGFGAUSSIANCUBIC); + + desc7->dpcLineCaps.dwTextureBlendCaps &= ( + D3DPTBLENDCAPS_DECAL | D3DPTBLENDCAPS_MODULATE | D3DPTBLENDCAPS_DECALALPHA | + D3DPTBLENDCAPS_MODULATEALPHA | D3DPTBLENDCAPS_DECALMASK | D3DPTBLENDCAPS_MODULATEMASK | + D3DPTBLENDCAPS_COPY | D3DPTBLENDCAPS_ADD); + + desc7->dpcLineCaps.dwTextureAddressCaps &= ( + D3DPTADDRESSCAPS_WRAP | D3DPTADDRESSCAPS_MIRROR | D3DPTADDRESSCAPS_CLAMP | + D3DPTADDRESSCAPS_BORDER | D3DPTADDRESSCAPS_INDEPENDENTUV); + + if (!(desc7->dpcLineCaps.dwTextureCaps & D3DPTEXTURECAPS_POW2)) + { + /* DirectX7 always has the np2 flag set, no matter what the card + * supports. Some old games (Rollcage) check the caps incorrectly. + * If wined3d supports nonpow2 textures it also has np2 conditional + * support. */ + desc7->dpcLineCaps.dwTextureCaps |= D3DPTEXTURECAPS_POW2 | D3DPTEXTURECAPS_NONPOW2CONDITIONAL; + } + + /* Fill the missing members, and do some fixup */ + desc7->dpcLineCaps.dwSize = sizeof(desc7->dpcLineCaps); + desc7->dpcLineCaps.dwTextureBlendCaps = D3DPTBLENDCAPS_ADD | D3DPTBLENDCAPS_MODULATEMASK | + D3DPTBLENDCAPS_COPY | D3DPTBLENDCAPS_DECAL | + D3DPTBLENDCAPS_DECALALPHA | D3DPTBLENDCAPS_DECALMASK | + D3DPTBLENDCAPS_MODULATE | D3DPTBLENDCAPS_MODULATEALPHA; + desc7->dpcLineCaps.dwStippleWidth = 32; + desc7->dpcLineCaps.dwStippleHeight = 32; + /* Use the same for the TriCaps */ + desc7->dpcTriCaps = desc7->dpcLineCaps; + + desc7->dwDeviceRenderBitDepth = DDBD_16 | DDBD_24 | DDBD_32; + desc7->dwDeviceZBufferBitDepth = DDBD_16 | DDBD_24; + desc7->dwMinTextureWidth = 1; + desc7->dwMinTextureHeight = 1; + + /* Convert DWORDs safely to WORDs */ + if (wined3d_caps.MaxTextureBlendStages > 0xffff) desc7->wMaxTextureBlendStages = 0xffff; + else desc7->wMaxTextureBlendStages = (WORD)wined3d_caps.MaxTextureBlendStages; + if (wined3d_caps.MaxSimultaneousTextures > 0xffff) desc7->wMaxSimultaneousTextures = 0xffff; + else desc7->wMaxSimultaneousTextures = (WORD)wined3d_caps.MaxSimultaneousTextures; + + if (wined3d_caps.MaxUserClipPlanes > 0xffff) desc7->wMaxUserClipPlanes = 0xffff; + else desc7->wMaxUserClipPlanes = (WORD)wined3d_caps.MaxUserClipPlanes; + if (wined3d_caps.MaxVertexBlendMatrices > 0xffff) desc7->wMaxVertexBlendMatrices = 0xffff; + else desc7->wMaxVertexBlendMatrices = (WORD)wined3d_caps.MaxVertexBlendMatrices; + + desc7->deviceGUID = IID_IDirect3DTnLHalDevice; + + desc7->dwReserved1 = 0; + desc7->dwReserved2 = 0; + desc7->dwReserved3 = 0; + desc7->dwReserved4 = 0; + + /* Fill the old structure */ + memset(desc1, 0, sizeof(desc1)); + desc1->dwSize = sizeof(D3DDEVICEDESC); + desc1->dwFlags = D3DDD_COLORMODEL + | D3DDD_DEVCAPS + | D3DDD_TRANSFORMCAPS + | D3DDD_BCLIPPING + | D3DDD_LIGHTINGCAPS + | D3DDD_LINECAPS + | D3DDD_TRICAPS + | D3DDD_DEVICERENDERBITDEPTH + | D3DDD_DEVICEZBUFFERBITDEPTH + | D3DDD_MAXBUFFERSIZE + | D3DDD_MAXVERTEXCOUNT; + + desc1->dcmColorModel = D3DCOLOR_RGB; + desc1->dwDevCaps = desc7->dwDevCaps; + desc1->dtcTransformCaps.dwSize = sizeof(D3DTRANSFORMCAPS); + desc1->dtcTransformCaps.dwCaps = D3DTRANSFORMCAPS_CLIP; + desc1->bClipping = TRUE; + desc1->dlcLightingCaps.dwSize = sizeof(D3DLIGHTINGCAPS); + desc1->dlcLightingCaps.dwCaps = D3DLIGHTCAPS_DIRECTIONAL + | D3DLIGHTCAPS_PARALLELPOINT + | D3DLIGHTCAPS_POINT + | D3DLIGHTCAPS_SPOT; + + desc1->dlcLightingCaps.dwLightingModel = D3DLIGHTINGMODEL_RGB; + desc1->dlcLightingCaps.dwNumLights = desc7->dwMaxActiveLights; + + desc1->dpcLineCaps.dwSize = sizeof(D3DPRIMCAPS); + desc1->dpcLineCaps.dwMiscCaps = desc7->dpcLineCaps.dwMiscCaps; + desc1->dpcLineCaps.dwRasterCaps = desc7->dpcLineCaps.dwRasterCaps; + desc1->dpcLineCaps.dwZCmpCaps = desc7->dpcLineCaps.dwZCmpCaps; + desc1->dpcLineCaps.dwSrcBlendCaps = desc7->dpcLineCaps.dwSrcBlendCaps; + desc1->dpcLineCaps.dwDestBlendCaps = desc7->dpcLineCaps.dwDestBlendCaps; + desc1->dpcLineCaps.dwShadeCaps = desc7->dpcLineCaps.dwShadeCaps; + desc1->dpcLineCaps.dwTextureCaps = desc7->dpcLineCaps.dwTextureCaps; + desc1->dpcLineCaps.dwTextureFilterCaps = desc7->dpcLineCaps.dwTextureFilterCaps; + desc1->dpcLineCaps.dwTextureBlendCaps = desc7->dpcLineCaps.dwTextureBlendCaps; + desc1->dpcLineCaps.dwTextureAddressCaps = desc7->dpcLineCaps.dwTextureAddressCaps; + desc1->dpcLineCaps.dwStippleWidth = desc7->dpcLineCaps.dwStippleWidth; + desc1->dpcLineCaps.dwAlphaCmpCaps = desc7->dpcLineCaps.dwAlphaCmpCaps; + + desc1->dpcTriCaps.dwSize = sizeof(D3DPRIMCAPS); + desc1->dpcTriCaps.dwMiscCaps = desc7->dpcTriCaps.dwMiscCaps; + desc1->dpcTriCaps.dwRasterCaps = desc7->dpcTriCaps.dwRasterCaps; + desc1->dpcTriCaps.dwZCmpCaps = desc7->dpcTriCaps.dwZCmpCaps; + desc1->dpcTriCaps.dwSrcBlendCaps = desc7->dpcTriCaps.dwSrcBlendCaps; + desc1->dpcTriCaps.dwDestBlendCaps = desc7->dpcTriCaps.dwDestBlendCaps; + desc1->dpcTriCaps.dwShadeCaps = desc7->dpcTriCaps.dwShadeCaps; + desc1->dpcTriCaps.dwTextureCaps = desc7->dpcTriCaps.dwTextureCaps; + desc1->dpcTriCaps.dwTextureFilterCaps = desc7->dpcTriCaps.dwTextureFilterCaps; + desc1->dpcTriCaps.dwTextureBlendCaps = desc7->dpcTriCaps.dwTextureBlendCaps; + desc1->dpcTriCaps.dwTextureAddressCaps = desc7->dpcTriCaps.dwTextureAddressCaps; + desc1->dpcTriCaps.dwStippleWidth = desc7->dpcTriCaps.dwStippleWidth; + desc1->dpcTriCaps.dwAlphaCmpCaps = desc7->dpcTriCaps.dwAlphaCmpCaps; + + desc1->dwDeviceRenderBitDepth = desc7->dwDeviceRenderBitDepth; + desc1->dwDeviceZBufferBitDepth = desc7->dwDeviceZBufferBitDepth; + desc1->dwMaxBufferSize = 0; + desc1->dwMaxVertexCount = 65536; + desc1->dwMinTextureWidth = desc7->dwMinTextureWidth; + desc1->dwMinTextureHeight = desc7->dwMinTextureHeight; + desc1->dwMaxTextureWidth = desc7->dwMaxTextureWidth; + desc1->dwMaxTextureHeight = desc7->dwMaxTextureHeight; + desc1->dwMinStippleWidth = 1; + desc1->dwMinStippleHeight = 1; + desc1->dwMaxStippleWidth = 32; + desc1->dwMaxStippleHeight = 32; + desc1->dwMaxTextureRepeat = desc7->dwMaxTextureRepeat; + desc1->dwMaxTextureAspectRatio = desc7->dwMaxTextureAspectRatio; + desc1->dwMaxAnisotropy = desc7->dwMaxAnisotropy; + desc1->dvGuardBandLeft = desc7->dvGuardBandLeft; + desc1->dvGuardBandRight = desc7->dvGuardBandRight; + desc1->dvGuardBandTop = desc7->dvGuardBandTop; + desc1->dvGuardBandBottom = desc7->dvGuardBandBottom; + desc1->dvExtentsAdjust = desc7->dvExtentsAdjust; + desc1->dwStencilCaps = desc7->dwStencilCaps; + desc1->dwFVFCaps = desc7->dwFVFCaps; + desc1->dwTextureOpCaps = desc7->dwTextureOpCaps; + desc1->wMaxTextureBlendStages = desc7->wMaxTextureBlendStages; + desc1->wMaxSimultaneousTextures = desc7->wMaxSimultaneousTextures; + + return DD_OK; +} + +/***************************************************************************** + * IDirectDraw7 VTable + *****************************************************************************/ +static const struct IDirectDraw7Vtbl ddraw7_vtbl = +{ + /* IUnknown */ + ddraw7_QueryInterface, + ddraw7_AddRef, + ddraw7_Release, + /* IDirectDraw */ + ddraw7_Compact, + ddraw7_CreateClipper, + ddraw7_CreatePalette, + ddraw7_CreateSurface, + ddraw7_DuplicateSurface, + ddraw7_EnumDisplayModes, + ddraw7_EnumSurfaces, + ddraw7_FlipToGDISurface, + ddraw7_GetCaps, + ddraw7_GetDisplayMode, + ddraw7_GetFourCCCodes, + ddraw7_GetGDISurface, + ddraw7_GetMonitorFrequency, + ddraw7_GetScanLine, + ddraw7_GetVerticalBlankStatus, + ddraw7_Initialize, + ddraw7_RestoreDisplayMode, + ddraw7_SetCooperativeLevel, + ddraw7_SetDisplayMode, + ddraw7_WaitForVerticalBlank, + /* IDirectDraw2 */ + ddraw7_GetAvailableVidMem, + /* IDirectDraw3 */ + ddraw7_GetSurfaceFromDC, + /* IDirectDraw4 */ + ddraw7_RestoreAllSurfaces, + ddraw7_TestCooperativeLevel, + ddraw7_GetDeviceIdentifier, + /* IDirectDraw7 */ + ddraw7_StartModeTest, + ddraw7_EvaluateMode +}; + +static const struct IDirectDraw4Vtbl ddraw4_vtbl = +{ + /* IUnknown */ + ddraw4_QueryInterface, + ddraw4_AddRef, + ddraw4_Release, /* IDirectDraw */ ddraw4_Compact, ddraw4_CreateClipper, @@ -4170,7 +5174,7 @@ ddraw4_GetDeviceIdentifier, }; -const struct IDirectDraw3Vtbl IDirectDraw3_Vtbl = +static const struct IDirectDraw3Vtbl ddraw3_vtbl = { /* IUnknown */ ddraw3_QueryInterface, @@ -4203,7 +5207,7 @@ ddraw3_GetSurfaceFromDC, }; -const struct IDirectDraw2Vtbl IDirectDraw2_Vtbl = +static const struct IDirectDraw2Vtbl ddraw2_vtbl = { /* IUnknown */ ddraw2_QueryInterface, @@ -4234,7 +5238,7 @@ ddraw2_GetAvailableVidMem, }; -const struct IDirectDrawVtbl IDirectDraw1_Vtbl = +static const struct IDirectDrawVtbl ddraw1_vtbl = { /* IUnknown */ ddraw1_QueryInterface, @@ -4263,6 +5267,68 @@ ddraw1_WaitForVerticalBlank, }; +static const struct IDirect3D7Vtbl d3d7_vtbl = +{ + /* IUnknown methods */ + d3d7_QueryInterface, + d3d7_AddRef, + d3d7_Release, + /* IDirect3D7 methods */ + d3d7_EnumDevices, + d3d7_CreateDevice, + d3d7_CreateVertexBuffer, + d3d7_EnumZBufferFormats, + d3d7_EvictManagedTextures +}; + +static const struct IDirect3D3Vtbl d3d3_vtbl = +{ + /* IUnknown methods */ + d3d3_QueryInterface, + d3d3_AddRef, + d3d3_Release, + /* IDirect3D3 methods */ + d3d3_EnumDevices, + d3d3_CreateLight, + d3d3_CreateMaterial, + d3d3_CreateViewport, + d3d3_FindDevice, + d3d3_CreateDevice, + d3d3_CreateVertexBuffer, + d3d3_EnumZBufferFormats, + d3d3_EvictManagedTextures +}; + +static const struct IDirect3D2Vtbl d3d2_vtbl = +{ + /* IUnknown methods */ + d3d2_QueryInterface, + d3d2_AddRef, + d3d2_Release, + /* IDirect3D2 methods */ + d3d2_EnumDevices, + d3d2_CreateLight, + d3d2_CreateMaterial, + d3d2_CreateViewport, + d3d2_FindDevice, + d3d2_CreateDevice +}; + +static const struct IDirect3DVtbl d3d1_vtbl = +{ + /* IUnknown methods */ + d3d1_QueryInterface, + d3d1_AddRef, + d3d1_Release, + /* IDirect3D methods */ + d3d1_Initialize, + d3d1_EnumDevices, + d3d1_CreateLight, + d3d1_CreateMaterial, + d3d1_CreateViewport, + d3d1_FindDevice +}; + /***************************************************************************** * ddraw_find_decl * @@ -4573,8 +5639,7 @@ return DDERR_OUTOFVIDEOMEMORY; } - object->lpVtbl = &IParent_Vtbl; - object->ref = 1; + ddraw_parent_init(object); hr = IWineD3DDevice_CreateSwapChain(This->wineD3DDevice, present_parameters, swapchain, (IUnknown *)object, This->ImplType); @@ -4598,7 +5663,7 @@ return hr; } -const IWineD3DDeviceParentVtbl ddraw_wined3d_device_parent_vtbl = +static const IWineD3DDeviceParentVtbl ddraw_wined3d_device_parent_vtbl = { /* IUnknown methods */ device_parent_QueryInterface, @@ -4612,3 +5677,62 @@ device_parent_CreateVolume, device_parent_CreateSwapChain, }; + +HRESULT ddraw_init(IDirectDrawImpl *ddraw, WINED3DDEVTYPE device_type) +{ + HRESULT hr; + HDC hDC; + + ddraw->lpVtbl = &ddraw7_vtbl; + ddraw->IDirectDraw_vtbl = &ddraw1_vtbl; + ddraw->IDirectDraw2_vtbl = &ddraw2_vtbl; + ddraw->IDirectDraw3_vtbl = &ddraw3_vtbl; + ddraw->IDirectDraw4_vtbl = &ddraw4_vtbl; + ddraw->IDirect3D_vtbl = &d3d1_vtbl; + ddraw->IDirect3D2_vtbl = &d3d2_vtbl; + ddraw->IDirect3D3_vtbl = &d3d3_vtbl; + ddraw->IDirect3D7_vtbl = &d3d7_vtbl; + ddraw->device_parent_vtbl = &ddraw_wined3d_device_parent_vtbl; + ddraw->numIfaces = 1; + ddraw->ref7 = 1; + + /* See comments in IDirectDrawImpl_CreateNewSurface for a description of + * this field. */ + ddraw->ImplType = DefaultSurfaceType; + + /* Get the current screen settings. */ + hDC = GetDC(0); + ddraw->orig_bpp = GetDeviceCaps(hDC, BITSPIXEL) * GetDeviceCaps(hDC, PLANES); + ReleaseDC(0, hDC); + ddraw->orig_width = GetSystemMetrics(SM_CXSCREEN); + ddraw->orig_height = GetSystemMetrics(SM_CYSCREEN); + + if (!LoadWineD3D()) + { + ERR("Failed to load wined3d - broken OpenGL setup?\n"); + return DDERR_NODIRECTDRAWSUPPORT; + } + + ddraw->wineD3D = pWineDirect3DCreate(7, (IUnknown *)ddraw); + if (!ddraw->wineD3D) + { + WARN("Failed to create a wined3d object.\n"); + return E_OUTOFMEMORY; + } + + hr = IWineD3D_CreateDevice(ddraw->wineD3D, WINED3DADAPTER_DEFAULT, device_type, NULL, 0, (IUnknown *)ddraw, + (IWineD3DDeviceParent *)&ddraw->device_parent_vtbl, &ddraw->wineD3DDevice); + if (FAILED(hr)) + { + WARN("Failed to create a wined3d device, hr %#x.\n", hr); + IWineD3D_Release(ddraw->wineD3D); + return hr; + } + + /* Get the amount of video memory */ + ddraw->total_vidmem = IWineD3DDevice_GetAvailableTextureMem(ddraw->wineD3DDevice); + + list_init(&ddraw->surface_list); + + return DD_OK; +} diff -Nru wine1.3-1.3.0/dlls/ddraw/ddraw_private.h wine1.3-1.3.1/dlls/ddraw/ddraw_private.h --- wine1.3-1.3.0/dlls/ddraw/ddraw_private.h 2010-07-30 18:43:56.000000000 +0100 +++ wine1.3-1.3.1/dlls/ddraw/ddraw_private.h 2010-08-20 18:23:50.000000000 +0100 @@ -19,24 +19,22 @@ #ifndef __WINE_DLLS_DDRAW_DDRAW_PRIVATE_H #define __WINE_DLLS_DDRAW_DDRAW_PRIVATE_H -/* MAY NOT CONTAIN X11 or DGA specific includes/defines/structs! */ +#include +#define COBJMACROS +#define NONAMELESSSTRUCT +#define NONAMELESSUNION +#include "wine/debug.h" -#include -#include - -#include "windef.h" #include "winbase.h" -#include "wtypes.h" #include "wingdi.h" #include "winuser.h" -#include "ddraw.h" -#include "ddrawi.h" -#include "d3d.h" -#include "wine/list.h" +#include "d3d.h" +#include "ddraw.h" #ifdef DDRAW_INIT_GUID #include "initguid.h" #endif +#include "wine/list.h" #include "wine/wined3d.h" extern const struct wined3d_parent_ops ddraw_null_wined3d_parent_ops DECLSPEC_HIDDEN; @@ -162,13 +160,7 @@ #define DDRAW_WINDOW_CLASS_NAME "ddraw_wc" -/* Declare the VTables. They can be found ddraw.c */ -extern const IDirectDraw7Vtbl IDirectDraw7_Vtbl DECLSPEC_HIDDEN; -extern const IDirectDraw4Vtbl IDirectDraw4_Vtbl DECLSPEC_HIDDEN; -extern const IDirectDraw3Vtbl IDirectDraw3_Vtbl DECLSPEC_HIDDEN; -extern const IDirectDraw2Vtbl IDirectDraw2_Vtbl DECLSPEC_HIDDEN; -extern const IDirectDrawVtbl IDirectDraw1_Vtbl DECLSPEC_HIDDEN; -extern const IWineD3DDeviceParentVtbl ddraw_wined3d_device_parent_vtbl DECLSPEC_HIDDEN; +HRESULT ddraw_init(IDirectDrawImpl *ddraw, WINED3DDEVTYPE device_type) DECLSPEC_HIDDEN; /* Helper structures */ typedef struct EnumDisplayModesCBS @@ -215,6 +207,10 @@ /* The default surface type */ extern WINED3DSURFTYPE DefaultSurfaceType DECLSPEC_HIDDEN; +extern typeof(WineDirect3DCreateClipper) *pWineDirect3DCreateClipper DECLSPEC_HIDDEN; +extern typeof(WineDirect3DCreate) *pWineDirect3DCreate DECLSPEC_HIDDEN; + + /***************************************************************************** * IDirectDrawSurface implementation structure *****************************************************************************/ @@ -275,14 +271,9 @@ DWORD Handle; }; -/* VTable declaration. It's located in surface.c / surface_thunks.c */ -extern const IDirectDrawSurface7Vtbl IDirectDrawSurface7_Vtbl DECLSPEC_HIDDEN; -extern const IDirectDrawSurface3Vtbl IDirectDrawSurface3_Vtbl DECLSPEC_HIDDEN; -extern const IDirectDrawGammaControlVtbl IDirectDrawGammaControl_Vtbl DECLSPEC_HIDDEN; -extern const IDirect3DTexture2Vtbl IDirect3DTexture2_Vtbl DECLSPEC_HIDDEN; -extern const IDirect3DTextureVtbl IDirect3DTexture1_Vtbl DECLSPEC_HIDDEN; - void ddraw_surface_destroy(IDirectDrawSurfaceImpl *surface) DECLSPEC_HIDDEN; +HRESULT ddraw_surface_init(IDirectDrawSurfaceImpl *surface, IDirectDrawImpl *ddraw, + DDSURFACEDESC2 *desc, UINT mip_level, WINED3DSURFTYPE surface_type) DECLSPEC_HIDDEN; static inline IDirectDrawSurfaceImpl *surface_from_texture1(IDirect3DTexture *iface) { @@ -317,7 +308,7 @@ }; -extern const IParentVtbl IParent_Vtbl DECLSPEC_HIDDEN; +void ddraw_parent_init(IParentImpl *parent) DECLSPEC_HIDDEN; /***************************************************************************** * IDirect3DDevice implementation @@ -395,12 +386,8 @@ D3DMATRIXHANDLE world, proj, view; }; -/* Vtables in various versions */ -extern const IDirect3DDevice7Vtbl IDirect3DDevice7_FPUSetup_Vtbl DECLSPEC_HIDDEN; -extern const IDirect3DDevice7Vtbl IDirect3DDevice7_FPUPreserve_Vtbl DECLSPEC_HIDDEN; -extern const IDirect3DDevice3Vtbl IDirect3DDevice3_Vtbl DECLSPEC_HIDDEN; -extern const IDirect3DDevice2Vtbl IDirect3DDevice2_Vtbl DECLSPEC_HIDDEN; -extern const IDirect3DDeviceVtbl IDirect3DDevice1_Vtbl DECLSPEC_HIDDEN; +HRESULT d3d_device_init(IDirect3DDeviceImpl *device, IDirectDrawImpl *ddraw, + IDirectDrawSurfaceImpl *target) DECLSPEC_HIDDEN; /* The IID */ extern const GUID IID_D3DDEVICE_WineD3D DECLSPEC_HIDDEN; @@ -432,18 +419,6 @@ void *Context; }; -/***************************************************************************** - * IDirect3D implementation - *****************************************************************************/ - -/* No implementation structure as this is only another interface to DirectDraw */ - -/* the Vtables */ -extern const IDirect3DVtbl IDirect3D1_Vtbl DECLSPEC_HIDDEN; -extern const IDirect3D2Vtbl IDirect3D2_Vtbl DECLSPEC_HIDDEN; -extern const IDirect3D3Vtbl IDirect3D3_Vtbl DECLSPEC_HIDDEN; -extern const IDirect3D7Vtbl IDirect3D7_Vtbl DECLSPEC_HIDDEN; - /* Structure for EnumZBufferFormats */ struct EnumZBufferFormatsData { @@ -464,9 +439,7 @@ BOOL initialized; }; -extern const IDirectDrawClipperVtbl IDirectDrawClipper_Vtbl DECLSPEC_HIDDEN; - -typeof(WineDirect3DCreateClipper) *pWineDirect3DCreateClipper DECLSPEC_HIDDEN; +HRESULT ddraw_clipper_init(IDirectDrawClipperImpl *clipper) DECLSPEC_HIDDEN; /***************************************************************************** * IDirectDrawPalette implementation structure @@ -483,7 +456,9 @@ /* IDirectDrawPalette fields */ IUnknown *ifaceToRelease; }; -extern const IDirectDrawPaletteVtbl IDirectDrawPalette_Vtbl DECLSPEC_HIDDEN; + +HRESULT ddraw_palette_init(IDirectDrawPaletteImpl *palette, + IDirectDrawImpl *ddraw, DWORD flags, PALETTEENTRY *entries) DECLSPEC_HIDDEN; /****************************************************************************** * DirectDraw ClassFactory implementation - incomplete @@ -525,20 +500,12 @@ /* Chained list used for adding / removing from viewports */ IDirect3DLightImpl *next; - - /* Activation function */ - void (*activate)(IDirect3DLightImpl*); - void (*desactivate)(IDirect3DLightImpl*); - void (*update)(IDirect3DLightImpl*); }; -/* Vtable */ -extern const IDirect3DLightVtbl IDirect3DLight_Vtbl DECLSPEC_HIDDEN; - /* Helper functions */ -void light_update(IDirect3DLightImpl *This) DECLSPEC_HIDDEN; -void light_activate(IDirect3DLightImpl *This) DECLSPEC_HIDDEN; -void light_desactivate(IDirect3DLightImpl *This) DECLSPEC_HIDDEN; +void light_activate(IDirect3DLightImpl *light) DECLSPEC_HIDDEN; +void light_deactivate(IDirect3DLightImpl *light) DECLSPEC_HIDDEN; +void d3d_light_init(IDirect3DLightImpl *light, IDirectDrawImpl *ddraw) DECLSPEC_HIDDEN; /****************************************************************************** * IDirect3DMaterial implementation structure - Wraps to D3D7 @@ -556,17 +523,11 @@ D3DMATERIAL mat; DWORD Handle; - - void (*activate)(IDirect3DMaterialImpl* this); }; -/* VTables in various versions */ -extern const IDirect3DMaterialVtbl IDirect3DMaterial_Vtbl DECLSPEC_HIDDEN; -extern const IDirect3DMaterial2Vtbl IDirect3DMaterial2_Vtbl DECLSPEC_HIDDEN; -extern const IDirect3DMaterial3Vtbl IDirect3DMaterial3_Vtbl DECLSPEC_HIDDEN; - /* Helper functions */ void material_activate(IDirect3DMaterialImpl* This) DECLSPEC_HIDDEN; +void d3d_material_init(IDirect3DMaterialImpl *material, IDirectDrawImpl *ddraw) DECLSPEC_HIDDEN; /***************************************************************************** * IDirect3DViewport - Wraps to D3D7 @@ -593,9 +554,6 @@ D3DVIEWPORT2 vp2; } viewports; - /* Activation function */ - void (*activate)(IDirect3DViewportImpl*, BOOL); - /* Field used to chain viewports together */ IDirect3DViewportImpl *next; @@ -606,11 +564,9 @@ IDirect3DMaterialImpl *background; }; -/* Vtable */ -extern const IDirect3DViewport3Vtbl IDirect3DViewport3_Vtbl DECLSPEC_HIDDEN; - /* Helper functions */ void viewport_activate(IDirect3DViewportImpl* This, BOOL ignore_lights) DECLSPEC_HIDDEN; +void d3d_viewport_init(IDirect3DViewportImpl *viewport, IDirectDrawImpl *ddraw) DECLSPEC_HIDDEN; /***************************************************************************** * IDirect3DExecuteBuffer - Wraps to D3D7 @@ -639,8 +595,8 @@ BOOL need_free; }; -/* The VTable */ -extern const IDirect3DExecuteBufferVtbl IDirect3DExecuteBuffer_Vtbl DECLSPEC_HIDDEN; +HRESULT d3d_execute_buffer_init(IDirect3DExecuteBufferImpl *execute_buffer, + IDirect3DDeviceImpl *device, D3DEXECUTEBUFFERDESC *desc) DECLSPEC_HIDDEN; /* The execute function */ void IDirect3DExecuteBufferImpl_Execute(IDirect3DExecuteBufferImpl *This, @@ -666,9 +622,8 @@ DWORD fvf; }; -/* The Vtables */ -extern const IDirect3DVertexBuffer7Vtbl IDirect3DVertexBuffer7_Vtbl DECLSPEC_HIDDEN; -extern const IDirect3DVertexBufferVtbl IDirect3DVertexBuffer1_Vtbl DECLSPEC_HIDDEN; +HRESULT d3d_vertex_buffer_init(IDirect3DVertexBufferImpl *buffer, + IDirectDrawImpl *ddraw, D3DVERTEXBUFFERDESC *desc) DECLSPEC_HIDDEN; static inline IDirect3DVertexBufferImpl *vb_from_vb1(IDirect3DVertexBuffer *iface) { diff -Nru wine1.3-1.3.0/dlls/ddraw/device.c wine1.3-1.3.1/dlls/ddraw/device.c --- wine1.3-1.3.0/dlls/ddraw/device.c 2010-07-30 18:43:56.000000000 +0100 +++ wine1.3-1.3.1/dlls/ddraw/device.c 2010-08-20 18:23:50.000000000 +0100 @@ -30,28 +30,9 @@ #include "config.h" #include "wine/port.h" -#include -#include -#include -#include - -#define COBJMACROS -#define NONAMELESSUNION - -#include "windef.h" -#include "winbase.h" -#include "winerror.h" -#include "wingdi.h" -#include "wine/exception.h" - -#include "ddraw.h" -#include "d3d.h" - #include "ddraw_private.h" -#include "wine/debug.h" -WINE_DEFAULT_DEBUG_CHANNEL(d3d7); -WINE_DECLARE_DEBUG_CHANNEL(ddraw_thunk); +WINE_DEFAULT_DEBUG_CHANNEL(ddraw); /* The device ID */ const GUID IID_D3DDEVICE_WineD3D = { @@ -121,7 +102,8 @@ void **obj) { IDirect3DDeviceImpl *This = (IDirect3DDeviceImpl *)iface; - TRACE("(%p)->(%s,%p)\n", This, debugstr_guid(refiid), obj); + + TRACE("iface %p, riid %s, object %p.\n", iface, debugstr_guid(refiid), obj); /* According to COM docs, if the QueryInterface fails, obj should be set to NULL */ *obj = NULL; @@ -214,9 +196,9 @@ REFIID riid, void **obj) { - IDirect3DDeviceImpl *This = device_from_device3(iface); - TRACE_(ddraw_thunk)("(%p)->(%s,%p) thunking to IDirect3DDevice7 interface.\n", This, debugstr_guid(riid), obj); - return IDirect3DDevice7_QueryInterface((IDirect3DDevice7 *)This, riid, obj); + TRACE("iface %p, riid %s, object %p.\n", iface, debugstr_guid(riid), obj); + + return IDirect3DDevice7_QueryInterface((IDirect3DDevice7 *)device_from_device3(iface), riid, obj); } static HRESULT WINAPI @@ -224,9 +206,9 @@ REFIID riid, void **obj) { - IDirect3DDeviceImpl *This = device_from_device2(iface); - TRACE_(ddraw_thunk)("(%p)->(%s,%p) thunking to IDirect3DDevice7 interface.\n", This, debugstr_guid(riid), obj); - return IDirect3DDevice7_QueryInterface((IDirect3DDevice7 *)This, riid, obj); + TRACE("iface %p, riid %s, object %p.\n", iface, debugstr_guid(riid), obj); + + return IDirect3DDevice7_QueryInterface((IDirect3DDevice7 *)device_from_device2(iface), riid, obj); } static HRESULT WINAPI @@ -234,9 +216,9 @@ REFIID riid, void **obp) { - IDirect3DDeviceImpl *This = device_from_device1(iface); - TRACE_(ddraw_thunk)("(%p)->(%s,%p) thunking to IDirect3DDevice7 interface.\n", This, debugstr_guid(riid), obp); - return IDirect3DDevice7_QueryInterface((IDirect3DDevice7 *)This, riid, obp); + TRACE("iface %p, riid %s, object %p.\n", iface, debugstr_guid(riid), obp); + + return IDirect3DDevice7_QueryInterface((IDirect3DDevice7 *)device_from_device1(iface), riid, obp); } /***************************************************************************** @@ -257,7 +239,7 @@ IDirect3DDeviceImpl *This = (IDirect3DDeviceImpl *)iface; ULONG ref = InterlockedIncrement(&This->ref); - TRACE("(%p) : incrementing from %u.\n", This, ref -1); + TRACE("%p increasing refcount to %u.\n", This, ref); return ref; } @@ -265,23 +247,24 @@ static ULONG WINAPI Thunk_IDirect3DDeviceImpl_3_AddRef(IDirect3DDevice3 *iface) { - IDirect3DDeviceImpl *This = device_from_device3(iface); - TRACE_(ddraw_thunk)("(%p)->() thunking to IDirect3DDevice7 interface.\n", This); - return IDirect3DDevice7_AddRef((IDirect3DDevice7 *)This); + TRACE("iface %p.\n", iface); + + return IDirect3DDevice7_AddRef((IDirect3DDevice7 *)device_from_device3(iface)); } static ULONG WINAPI Thunk_IDirect3DDeviceImpl_2_AddRef(IDirect3DDevice2 *iface) { - IDirect3DDeviceImpl *This = device_from_device2(iface); - TRACE_(ddraw_thunk)("(%p)->() thunking to IDirect3DDevice7 interface.\n", This); - return IDirect3DDevice7_AddRef((IDirect3DDevice7 *)This); + TRACE("iface %p.\n", iface); + + return IDirect3DDevice7_AddRef((IDirect3DDevice7 *)device_from_device2(iface)); } static ULONG WINAPI Thunk_IDirect3DDeviceImpl_1_AddRef(IDirect3DDevice *iface) { - TRACE_(ddraw_thunk)("(%p)->() thunking to IDirect3DDevice7 interface.\n", iface); + TRACE("iface %p.\n", iface); + return IDirect3DDevice7_AddRef((IDirect3DDevice7 *)device_from_device1(iface)); } @@ -303,7 +286,7 @@ IDirect3DDeviceImpl *This = (IDirect3DDeviceImpl *)iface; ULONG ref = InterlockedDecrement(&This->ref); - TRACE("(%p)->() decrementing from %u.\n", This, ref +1); + TRACE("%p decreasing refcount to %u.\n", This, ref); /* This method doesn't destroy the WineD3DDevice, because it's still in use for * 2D rendering. IDirectDrawSurface7::Release will destroy the WineD3DDevice @@ -438,25 +421,25 @@ static ULONG WINAPI Thunk_IDirect3DDeviceImpl_3_Release(IDirect3DDevice3 *iface) { - IDirect3DDeviceImpl *This = device_from_device3(iface); - TRACE_(ddraw_thunk)("(%p)->() thunking to IDirect3DDevice7 interface.\n", This); - return IDirect3DDevice7_Release((IDirect3DDevice7 *)This); + TRACE("iface %p.\n", iface); + + return IDirect3DDevice7_Release((IDirect3DDevice7 *)device_from_device3(iface)); } static ULONG WINAPI Thunk_IDirect3DDeviceImpl_2_Release(IDirect3DDevice2 *iface) { - IDirect3DDeviceImpl *This = device_from_device2(iface); - TRACE_(ddraw_thunk)("(%p)->() thunking to IDirect3DDevice7 interface.\n", This); - return IDirect3DDevice7_Release((IDirect3DDevice7 *)This); + TRACE("iface %p.\n", iface); + + return IDirect3DDevice7_Release((IDirect3DDevice7 *)device_from_device2(iface)); } static ULONG WINAPI Thunk_IDirect3DDeviceImpl_1_Release(IDirect3DDevice *iface) { - IDirect3DDeviceImpl *This = device_from_device1(iface); - TRACE_(ddraw_thunk)("(%p)->() thunking to IDirect3DDevice7 interface.\n", This); - return IDirect3DDevice7_Release((IDirect3DDevice7 *)This); + TRACE("iface %p.\n", iface); + + return IDirect3DDevice7_Release((IDirect3DDevice7 *)device_from_device1(iface)); } /***************************************************************************** @@ -482,12 +465,10 @@ IDirect3D *Direct3D, GUID *guid, D3DDEVICEDESC *Desc) { - IDirect3DDeviceImpl *This = device_from_device1(iface); - /* It shouldn't be crucial, but print a FIXME, I'm interested if - * any game calls it and when - */ - FIXME("(%p)->(%p,%p,%p): No-op!\n", This, Direct3D, guid, Desc); + * any game calls it and when. */ + FIXME("iface %p, d3d %p, guid %s, device_desc %p nop!\n", + iface, Direct3D, debugstr_guid(guid), Desc); return D3D_OK; } @@ -514,7 +495,8 @@ { IDirect3DDeviceImpl *This = (IDirect3DDeviceImpl *)iface; D3DDEVICEDESC OldDesc; - TRACE("(%p)->(%p)\n", This, Desc); + + TRACE("iface %p, device_desc %p.\n", iface, Desc); /* Call the same function used by IDirect3D, this saves code */ return IDirect3DImpl_GetCaps(This->ddraw->wineD3D, &OldDesc, Desc); @@ -565,7 +547,8 @@ IDirect3DDeviceImpl *This = device_from_device3(iface); D3DDEVICEDESC7 newDesc; HRESULT hr; - TRACE("(%p)->(%p,%p)\n", iface, HWDesc, HelDesc); + + TRACE("iface %p, hw_desc %p, hel_desc %p.\n", iface, HWDesc, HelDesc); hr = IDirect3DImpl_GetCaps(This->ddraw->wineD3D, HWDesc, &newDesc); if(hr != D3D_OK) return hr; @@ -580,7 +563,7 @@ D3DDEVICEDESC *D3DHELDevDesc) { IDirect3DDeviceImpl *This = device_from_device2(iface); - TRACE_(ddraw_thunk)("(%p)->(%p,%p) thunking to IDirect3DDevice3 interface.\n", This, D3DHWDevDesc, D3DHELDevDesc); + TRACE("iface %p, hw_desc %p, hel_desc %p.\n", iface, D3DHWDevDesc, D3DHELDevDesc); return IDirect3DDevice3_GetCaps((IDirect3DDevice3 *)&This->IDirect3DDevice3_vtbl, D3DHWDevDesc, D3DHELDevDesc); } @@ -590,7 +573,7 @@ D3DDEVICEDESC *D3DHELDevDesc) { IDirect3DDeviceImpl *This = device_from_device1(iface); - TRACE_(ddraw_thunk)("(%p)->(%p,%p) thunking to IDirect3DDevice3 interface.\n", This, D3DHWDevDesc, D3DHELDevDesc); + TRACE("iface %p, hw_desc %p, hel_desc %p.\n", iface, D3DHWDevDesc, D3DHELDevDesc); return IDirect3DDevice3_GetCaps((IDirect3DDevice3 *)&This->IDirect3DDevice3_vtbl, D3DHWDevDesc, D3DHELDevDesc); } @@ -616,7 +599,7 @@ IDirectDrawSurfaceImpl *surf2 = surface_from_texture2(Tex2); DWORD h1, h2; - TRACE("(%p)->(%p,%p)\n", This, surf1, surf2); + TRACE("iface %p, tex1 %p, tex2 %p.\n", iface, Tex1, Tex2); EnterCriticalSection(&ddraw_cs); @@ -642,7 +625,9 @@ IDirectDrawSurfaceImpl *surf2 = surface_from_texture1(D3DTex2); IDirect3DTexture2 *t1 = surf1 ? (IDirect3DTexture2 *)&surf1->IDirect3DTexture2_vtbl : NULL; IDirect3DTexture2 *t2 = surf2 ? (IDirect3DTexture2 *)&surf2->IDirect3DTexture2_vtbl : NULL; - TRACE_(ddraw_thunk)("(%p)->(%p,%p) thunking to IDirect3DDevice2 interface.\n", This, surf1, surf2); + + TRACE("iface %p, tex1 %p, tex2 %p.\n", iface, D3DTex1, D3DTex2); + return IDirect3DDevice2_SwapTextureHandles((IDirect3DDevice2 *)&This->IDirect3DDevice2_vtbl, t1, t2); } @@ -668,8 +653,7 @@ IDirect3DDeviceImpl_3_GetStats(IDirect3DDevice3 *iface, D3DSTATS *Stats) { - IDirect3DDeviceImpl *This = device_from_device3(iface); - FIXME("(%p)->(%p): Stub!\n", This, Stats); + FIXME("iface %p, stats %p stub!\n", iface, Stats); if(!Stats) return DDERR_INVALIDPARAMS; @@ -689,7 +673,9 @@ D3DSTATS *Stats) { IDirect3DDeviceImpl *This = device_from_device2(iface); - TRACE_(ddraw_thunk)("(%p)->(%p) thunking to IDirect3DDevice3 interface.\n", This, Stats); + + TRACE("iface %p, stats %p.\n", iface, Stats); + return IDirect3DDevice3_GetStats((IDirect3DDevice3 *)&This->IDirect3DDevice3_vtbl, Stats); } @@ -698,7 +684,9 @@ D3DSTATS *Stats) { IDirect3DDeviceImpl *This = device_from_device1(iface); - TRACE_(ddraw_thunk)("(%p)->(%p) thunking to IDirect3DDevice3 interface.\n", This, Stats); + + TRACE("iface %p, stats %p.\n", iface, Stats); + return IDirect3DDevice3_GetStats((IDirect3DDevice3 *)&This->IDirect3DDevice3_vtbl, Stats); } @@ -730,7 +718,10 @@ { IDirect3DDeviceImpl *This = device_from_device1(iface); IDirect3DExecuteBufferImpl* object; - TRACE("(%p)->(%p,%p,%p)!\n", This, Desc, ExecuteBuffer, UnkOuter); + HRESULT hr; + + TRACE("iface %p, buffer_desc %p, buffer %p, outer_unknown %p.\n", + iface, Desc, ExecuteBuffer, UnkOuter); if(UnkOuter) return CLASS_E_NOAGGREGATION; @@ -743,46 +734,14 @@ return DDERR_OUTOFMEMORY; } - object->lpVtbl = &IDirect3DExecuteBuffer_Vtbl; - object->ref = 1; - object->d3ddev = This; - - /* Initializes memory */ - memcpy(&object->desc, Desc, Desc->dwSize); - - /* No buffer given */ - if ((object->desc.dwFlags & D3DDEB_LPDATA) == 0) - object->desc.lpData = NULL; - - /* No buffer size given */ - if ((object->desc.dwFlags & D3DDEB_BUFSIZE) == 0) - object->desc.dwBufferSize = 0; - - /* Create buffer if asked */ - if ((object->desc.lpData == NULL) && (object->desc.dwBufferSize > 0)) - { - object->need_free = TRUE; - object->desc.lpData = HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,object->desc.dwBufferSize); - if(!object->desc.lpData) - { - ERR("Out of memory when allocating the execute buffer data\n"); - HeapFree(GetProcessHeap(), 0, object); - return DDERR_OUTOFMEMORY; - } - } - else + hr = d3d_execute_buffer_init(object, This, Desc); + if (FAILED(hr)) { - object->need_free = FALSE; + WARN("Failed to initialize execute buffer, hr %#x.\n", hr); + HeapFree(GetProcessHeap(), 0, object); + return hr; } - /* No vertices for the moment */ - object->vertex_data = NULL; - - object->desc.dwFlags |= D3DDEB_LPDATA; - - object->indices = NULL; - object->nb_indices = 0; - *ExecuteBuffer = (IDirect3DExecuteBuffer *)object; TRACE(" Returning IDirect3DExecuteBuffer at %p, implementation is at %p\n", *ExecuteBuffer, object); @@ -815,7 +774,7 @@ IDirect3DExecuteBufferImpl *Direct3DExecuteBufferImpl = (IDirect3DExecuteBufferImpl *)ExecuteBuffer; IDirect3DViewportImpl *Direct3DViewportImpl = (IDirect3DViewportImpl *)Viewport; - TRACE("(%p)->(%p,%p,%08x)\n", This, Direct3DExecuteBufferImpl, Direct3DViewportImpl, Flags); + TRACE("iface %p, buffer %p, viewport %p, flags %#x.\n", iface, ExecuteBuffer, Viewport, Flags); if(!Direct3DExecuteBufferImpl) return DDERR_INVALIDPARAMS; @@ -852,7 +811,7 @@ IDirect3DDeviceImpl *This = device_from_device3(iface); IDirect3DViewportImpl *vp = (IDirect3DViewportImpl *)Viewport; - TRACE("(%p)->(%p)\n", This, vp); + TRACE("iface %p, viewport %p.\n", iface, Viewport); /* Sanity check */ if(!vp) @@ -874,7 +833,9 @@ { IDirect3DDeviceImpl *This = device_from_device2(iface); IDirect3DViewportImpl *vp = (IDirect3DViewportImpl *)Direct3DViewport2; - TRACE_(ddraw_thunk)("(%p)->(%p) thunking to IDirect3DDevice3 interface.\n", This, vp); + + TRACE("iface %p, viewport %p.\n", iface, Direct3DViewport2); + return IDirect3DDevice3_AddViewport((IDirect3DDevice3 *)&This->IDirect3DDevice3_vtbl, (IDirect3DViewport3 *)vp); } @@ -884,7 +845,9 @@ { IDirect3DDeviceImpl *This = device_from_device1(iface); IDirect3DViewportImpl *vp = (IDirect3DViewportImpl *)Direct3DViewport; - TRACE_(ddraw_thunk)("(%p)->(%p) thunking to IDirect3DDevice3 interface.\n", This, vp); + + TRACE("iface %p, viewport %p.\n", iface, Direct3DViewport); + return IDirect3DDevice3_AddViewport((IDirect3DDevice3 *)&This->IDirect3DDevice3_vtbl, (IDirect3DViewport3 *)vp); } @@ -912,7 +875,7 @@ IDirect3DViewportImpl *vp = (IDirect3DViewportImpl *) Viewport; IDirect3DViewportImpl *cur_viewport, *prev_viewport = NULL; - TRACE("(%p)->(%p)\n", This, vp); + TRACE("iface %p, viewport %p.\n", iface, Viewport); EnterCriticalSection(&ddraw_cs); cur_viewport = This->viewport_list; @@ -940,7 +903,9 @@ { IDirect3DDeviceImpl *This = device_from_device2(iface); IDirect3DViewportImpl *vp = (IDirect3DViewportImpl *)Direct3DViewport2; - TRACE_(ddraw_thunk)("(%p)->(%p) thunking to IDirect3DDevice3 interface.\n", This, vp); + + TRACE("iface %p, viewport %p.\n", iface, Direct3DViewport2); + return IDirect3DDevice3_DeleteViewport((IDirect3DDevice3 *)&This->IDirect3DDevice3_vtbl, (IDirect3DViewport3 *)vp); } @@ -950,7 +915,9 @@ { IDirect3DDeviceImpl *This = device_from_device1(iface); IDirect3DViewportImpl *vp = (IDirect3DViewportImpl *)Direct3DViewport; - TRACE_(ddraw_thunk)("(%p)->(%p) thunking to IDirect3DDevice3 interface.\n", This, vp); + + TRACE("iface %p, viewport %p.\n", iface, Direct3DViewport); + return IDirect3DDevice3_DeleteViewport((IDirect3DDevice3 *)&This->IDirect3DDevice3_vtbl, (IDirect3DViewport3 *)vp); } @@ -982,7 +949,8 @@ IDirect3DViewportImpl *vp = (IDirect3DViewportImpl *)Viewport3; IDirect3DViewportImpl *res = NULL; - TRACE("(%p)->(%p,%p,%08x)\n", This, vp, lplpDirect3DViewport3, Flags); + TRACE("iface %p, viewport %p, next %p, flags %#x.\n", + iface, Viewport3, lplpDirect3DViewport3, Flags); if(!vp) { @@ -1035,7 +1003,10 @@ IDirect3DViewportImpl *vp = (IDirect3DViewportImpl *)Viewport2; IDirect3DViewport3 *res; HRESULT hr; - TRACE_(ddraw_thunk)("(%p)->(%p,%p,%08x) thunking to IDirect3DDevice3 interface.\n", This, vp, lplpDirect3DViewport2, Flags); + + TRACE("iface %p, viewport %p, next %p, flags %#x.\n", + iface, Viewport2, lplpDirect3DViewport2, Flags); + hr = IDirect3DDevice3_NextViewport((IDirect3DDevice3 *)&This->IDirect3DDevice3_vtbl, (IDirect3DViewport3 *)vp, &res, Flags); *lplpDirect3DViewport2 = (IDirect3DViewport2 *)res; @@ -1052,7 +1023,10 @@ IDirect3DViewportImpl *vp = (IDirect3DViewportImpl *)Viewport; IDirect3DViewport3 *res; HRESULT hr; - TRACE_(ddraw_thunk)("(%p)->(%p,%p,%08x) thunking to IDirect3DDevice3 interface.\n", This, vp, lplpDirect3DViewport, Flags); + + TRACE("iface %p, viewport %p, next %p, flags %#x.\n", + iface, Viewport, lplpDirect3DViewport, Flags); + hr = IDirect3DDevice3_NextViewport((IDirect3DDevice3 *)&This->IDirect3DDevice3_vtbl, (IDirect3DViewport3 *)vp, &res, Flags); *lplpDirect3DViewport = (IDirect3DViewport *)res; @@ -1087,10 +1061,8 @@ DWORD Flags, D3DRECT *Rect) { - IDirect3DDeviceImpl *This = device_from_device1(iface); - IDirect3DExecuteBufferImpl *execbuf = (IDirect3DExecuteBufferImpl *)ExecuteBuffer; - IDirect3DViewportImpl *vp = (IDirect3DViewportImpl *)Viewport; - FIXME("(%p)->(%p,%p,%08x,%p): stub!\n", This, execbuf, vp, Flags, Rect); + FIXME("iface %p, buffer %p, viewport %p, flags %#x, rect %s stub!\n", + iface, ExecuteBuffer, Viewport, Flags, wine_dbgstr_rect((RECT *)Rect)); return D3D_OK; } @@ -1116,8 +1088,7 @@ DWORD *Count, D3DPICKRECORD *D3DPickRec) { - IDirect3DDeviceImpl *This = device_from_device1(iface); - FIXME("(%p)->(%p,%p): stub!\n", This, Count, D3DPickRec); + FIXME("iface %p, count %p, records %p stub!\n", iface, Count, D3DPickRec); return D3D_OK; } @@ -1181,7 +1152,7 @@ WINED3DFMT_R10G10B10_SNORM_A2_UNORM }; - TRACE("(%p)->(%p,%p): Relay\n", This, Callback, Arg); + TRACE("iface %p, callback %p, context %p.\n", iface, Callback, Arg); if(!Callback) return DDERR_INVALIDPARAMS; @@ -1289,7 +1260,9 @@ void *Arg) { IDirect3DDeviceImpl *This = device_from_device3(iface); - TRACE_(ddraw_thunk)("(%p)->(%p,%p) thunking to IDirect3DDevice7 interface.\n", This, Callback, Arg); + + TRACE("iface %p, callback %p, context %p.\n", iface, Callback, Arg); + return IDirect3DDevice7_EnumTextureFormats((IDirect3DDevice7 *)This, Callback, Arg); } @@ -1330,7 +1303,7 @@ /* FOURCC codes - Not in this version*/ }; - TRACE("(%p)->(%p,%p): Relay\n", This, Callback, Arg); + TRACE("iface %p, callback %p, context %p.\n", iface, Callback, Arg); if(!Callback) return DDERR_INVALIDPARAMS; @@ -1389,7 +1362,9 @@ void *Arg) { IDirect3DDeviceImpl *This = device_from_device1(iface); - TRACE_(ddraw_thunk)("(%p)->(%p,%p) thunking to IDirect3DDevice2 interface.\n", This, Callback, Arg); + + TRACE("iface %p, callback %p, context %p.\n", iface, Callback, Arg); + return IDirect3DDevice2_EnumTextureFormats((IDirect3DDevice2 *)&This->IDirect3DDevice2_vtbl, Callback, Arg); } @@ -1416,7 +1391,7 @@ D3DMATRIX *Matrix; DWORD h; - TRACE("(%p)->(%p)\n", This, D3DMatHandle); + TRACE("iface %p, matrix_handle %p.\n", iface, D3DMatHandle); if(!D3DMatHandle) return DDERR_INVALIDPARAMS; @@ -1473,7 +1448,7 @@ IDirect3DDeviceImpl *This = device_from_device1(iface); D3DMATRIX *m; - TRACE("(%p)->(%08x,%p)\n", This, D3DMatHandle, D3DMatrix); + TRACE("iface %p, matrix_handle %#x, matrix %p.\n", iface, D3DMatHandle, D3DMatrix); if (!D3DMatrix) return DDERR_INVALIDPARAMS; @@ -1487,7 +1462,7 @@ return DDERR_INVALIDPARAMS; } - if (TRACE_ON(d3d7)) + if (TRACE_ON(ddraw)) dump_D3DMATRIX(D3DMatrix); *m = *D3DMatrix; @@ -1516,7 +1491,7 @@ } /***************************************************************************** - * IDirect3DDevice::SetMatrix + * IDirect3DDevice::GetMatrix * * Returns the content of a D3DMATRIX handle * @@ -1539,7 +1514,7 @@ IDirect3DDeviceImpl *This = device_from_device1(iface); D3DMATRIX *m; - TRACE("(%p)->(%08x,%p)\n", This, D3DMatHandle, D3DMatrix); + TRACE("iface %p, matrix_handle %#x, matrix %p.\n", iface, D3DMatHandle, D3DMatrix); if (!D3DMatrix) return DDERR_INVALIDPARAMS; @@ -1581,7 +1556,7 @@ IDirect3DDeviceImpl *This = device_from_device1(iface); D3DMATRIX *m; - TRACE("(%p)->(%08x)\n", This, D3DMatHandle); + TRACE("iface %p, matrix_handle %#x.\n", iface, D3DMatHandle); EnterCriticalSection(&ddraw_cs); @@ -1619,7 +1594,8 @@ { IDirect3DDeviceImpl *This = (IDirect3DDeviceImpl *)iface; HRESULT hr; - TRACE("(%p): Relay\n", This); + + TRACE("iface %p.\n", iface); EnterCriticalSection(&ddraw_cs); hr = IWineD3DDevice_BeginScene(This->wineD3DDevice); @@ -1650,25 +1626,25 @@ static HRESULT WINAPI Thunk_IDirect3DDeviceImpl_3_BeginScene(IDirect3DDevice3 *iface) { - IDirect3DDeviceImpl *This = device_from_device3(iface); - TRACE_(ddraw_thunk)("(%p)->() thunking to IDirect3DDevice7 interface.\n", This); - return IDirect3DDevice7_BeginScene((IDirect3DDevice7 *)This); + TRACE("iface %p.\n", iface); + + return IDirect3DDevice7_BeginScene((IDirect3DDevice7 *)device_from_device3(iface)); } static HRESULT WINAPI Thunk_IDirect3DDeviceImpl_2_BeginScene(IDirect3DDevice2 *iface) { - IDirect3DDeviceImpl *This = device_from_device2(iface); - TRACE_(ddraw_thunk)("(%p)->() thunking to IDirect3DDevice7 interface.\n", This); - return IDirect3DDevice7_BeginScene((IDirect3DDevice7 *)This); + TRACE("iface %p.\n", iface); + + return IDirect3DDevice7_BeginScene((IDirect3DDevice7 *)device_from_device2(iface)); } static HRESULT WINAPI Thunk_IDirect3DDeviceImpl_1_BeginScene(IDirect3DDevice *iface) { - IDirect3DDeviceImpl *This = device_from_device1(iface); - TRACE_(ddraw_thunk)("(%p)->() thunking to IDirect3DDevice7 interface.\n", This); - return IDirect3DDevice7_BeginScene((IDirect3DDevice7 *)This); + TRACE("iface %p.\n", iface); + + return IDirect3DDevice7_BeginScene((IDirect3DDevice7 *)device_from_device1(iface)); } /***************************************************************************** @@ -1690,7 +1666,8 @@ { IDirect3DDeviceImpl *This = (IDirect3DDeviceImpl *)iface; HRESULT hr; - TRACE("(%p): Relay\n", This); + + TRACE("iface %p.\n", iface); EnterCriticalSection(&ddraw_cs); hr = IWineD3DDevice_EndScene(This->wineD3DDevice); @@ -1721,25 +1698,25 @@ static HRESULT WINAPI DECLSPEC_HOTPATCH Thunk_IDirect3DDeviceImpl_3_EndScene(IDirect3DDevice3 *iface) { - IDirect3DDeviceImpl *This = device_from_device3(iface); - TRACE_(ddraw_thunk)("(%p)->() thunking to IDirect3DDevice7 interface.\n", This); - return IDirect3DDevice7_EndScene((IDirect3DDevice7 *)This); + TRACE("iface %p.\n", iface); + + return IDirect3DDevice7_EndScene((IDirect3DDevice7 *)device_from_device3(iface)); } static HRESULT WINAPI DECLSPEC_HOTPATCH Thunk_IDirect3DDeviceImpl_2_EndScene(IDirect3DDevice2 *iface) { - IDirect3DDeviceImpl *This = device_from_device2(iface); - TRACE_(ddraw_thunk)("(%p)->() thunking to IDirect3DDevice7 interface.\n", This); - return IDirect3DDevice7_EndScene((IDirect3DDevice7 *)This); + TRACE("iface %p.\n", iface); + + return IDirect3DDevice7_EndScene((IDirect3DDevice7 *)device_from_device2(iface)); } static HRESULT WINAPI DECLSPEC_HOTPATCH Thunk_IDirect3DDeviceImpl_1_EndScene(IDirect3DDevice *iface) { - IDirect3DDeviceImpl *This = device_from_device1(iface); - TRACE_(ddraw_thunk)("(%p)->() thunking to IDirect3DDevice7 interface.\n", This); - return IDirect3DDevice7_EndScene((IDirect3DDevice7 *)This); + TRACE("iface %p.\n", iface); + + return IDirect3DDevice7_EndScene((IDirect3DDevice7 *)device_from_device1(iface)); } /***************************************************************************** @@ -1761,7 +1738,8 @@ IDirect3D7 **Direct3D7) { IDirect3DDeviceImpl *This = (IDirect3DDeviceImpl *)iface; - TRACE("(%p)->(%p)\n", This, Direct3D7); + + TRACE("iface %p, d3d %p.\n", iface, Direct3D7); if(!Direct3D7) return DDERR_INVALIDPARAMS; @@ -1781,7 +1759,8 @@ HRESULT ret; IDirect3D7 *ret_ptr; - TRACE_(ddraw_thunk)("(%p)->(%p) thunking to IDirect3DDevice7 interface.\n", This, Direct3D3); + TRACE("iface %p, d3d %p.\n", iface, Direct3D3); + ret = IDirect3DDevice7_GetDirect3D((IDirect3DDevice7 *)This, &ret_ptr); if(ret != D3D_OK) return ret; @@ -1798,7 +1777,8 @@ HRESULT ret; IDirect3D7 *ret_ptr; - TRACE_(ddraw_thunk)("(%p)->(%p) thunking to IDirect3DDevice7 interface.\n", This, Direct3D2); + TRACE("iface %p, d3d %p.\n", iface, Direct3D2); + ret = IDirect3DDevice7_GetDirect3D((IDirect3DDevice7 *)This, &ret_ptr); if(ret != D3D_OK) return ret; @@ -1815,7 +1795,8 @@ HRESULT ret; IDirect3D7 *ret_ptr; - TRACE_(ddraw_thunk)("(%p)->(%p) thunking to IDirect3DDevice7 interface.\n", This, Direct3D); + TRACE("iface %p, d3d %p.\n", iface, Direct3D); + ret = IDirect3DDevice7_GetDirect3D((IDirect3DDevice7 *)This, &ret_ptr); if(ret != D3D_OK) return ret; @@ -1846,7 +1827,8 @@ { IDirect3DDeviceImpl *This = device_from_device3(iface); IDirect3DViewportImpl *vp = (IDirect3DViewportImpl *)Direct3DViewport3; - TRACE("(%p)->(%p)\n", This, Direct3DViewport3); + + TRACE("iface %p, viewport %p.\n", iface, Direct3DViewport3); EnterCriticalSection(&ddraw_cs); /* Do nothing if the specified viewport is the same as the current one */ @@ -1872,7 +1854,7 @@ /* Activate this viewport */ This->current_viewport->active_device = This; - This->current_viewport->activate(This->current_viewport, FALSE); + viewport_activate(This->current_viewport, FALSE); LeaveCriticalSection(&ddraw_cs); return D3D_OK; @@ -1884,7 +1866,9 @@ { IDirect3DDeviceImpl *This = device_from_device2(iface); IDirect3DViewportImpl *vp = (IDirect3DViewportImpl *)Direct3DViewport2; - TRACE_(ddraw_thunk)("(%p)->(%p) thunking to IDirect3DDevice3 interface.\n", This, vp); + + TRACE("iface %p, viewport %p.\n", iface, Direct3DViewport2); + return IDirect3DDevice3_SetCurrentViewport((IDirect3DDevice3 *)&This->IDirect3DDevice3_vtbl, (IDirect3DViewport3 *)vp); } @@ -1909,7 +1893,8 @@ IDirect3DViewport3 **Direct3DViewport3) { IDirect3DDeviceImpl *This = device_from_device3(iface); - TRACE("(%p)->(%p)\n", This, Direct3DViewport3); + + TRACE("iface %p, viewport %p.\n", iface, Direct3DViewport3); if(!Direct3DViewport3) return DDERR_INVALIDPARAMS; @@ -1932,7 +1917,9 @@ { IDirect3DDeviceImpl *This = device_from_device2(iface); HRESULT hr; - TRACE_(ddraw_thunk)("(%p)->(%p) thunking to IDirect3DDevice3 interface.\n", This, Direct3DViewport2); + + TRACE("iface %p, viewport %p.\n", iface, Direct3DViewport2); + hr = IDirect3DDevice3_GetCurrentViewport((IDirect3DDevice3 *)&This->IDirect3DDevice3_vtbl, (IDirect3DViewport3 **)Direct3DViewport2); if(hr != D3D_OK) return hr; @@ -1965,7 +1952,8 @@ IDirect3DDeviceImpl *This = (IDirect3DDeviceImpl *)iface; IDirectDrawSurfaceImpl *Target = (IDirectDrawSurfaceImpl *)NewTarget; HRESULT hr; - TRACE("(%p)->(%p,%08x): Relay\n", This, NewTarget, Flags); + + TRACE("iface %p, target %p, flags %#x.\n", iface, NewTarget, Flags); EnterCriticalSection(&ddraw_cs); /* Flags: Not used */ @@ -2024,7 +2012,9 @@ { IDirect3DDeviceImpl *This = device_from_device3(iface); IDirectDrawSurfaceImpl *Target = (IDirectDrawSurfaceImpl *)NewRenderTarget; - TRACE_(ddraw_thunk)("(%p)->(%p,%08x) thunking to IDirect3DDevice7 interface.\n", This, Target, Flags); + + TRACE("iface %p, target %p, flags %#x.\n", iface, NewRenderTarget, Flags); + return IDirect3DDevice7_SetRenderTarget((IDirect3DDevice7 *)This, (IDirectDrawSurface7 *)Target, Flags); } @@ -2035,7 +2025,9 @@ { IDirect3DDeviceImpl *This = device_from_device2(iface); IDirectDrawSurfaceImpl *Target = (IDirectDrawSurfaceImpl *)NewRenderTarget; - TRACE_(ddraw_thunk)("(%p)->(%p,%08x) thunking to IDirect3DDevice7 interface.\n", This, Target, Flags); + + TRACE("iface %p, target %p, flags %#x.\n", iface, NewRenderTarget, Flags); + return IDirect3DDevice7_SetRenderTarget((IDirect3DDevice7 *)This, (IDirectDrawSurface7 *)Target, Flags); } @@ -2061,7 +2053,8 @@ IDirectDrawSurface7 **RenderTarget) { IDirect3DDeviceImpl *This = (IDirect3DDeviceImpl *)iface; - TRACE("(%p)->(%p): Relay\n", This, RenderTarget); + + TRACE("iface %p, target %p.\n", iface, RenderTarget); if(!RenderTarget) return DDERR_INVALIDPARAMS; @@ -2080,7 +2073,9 @@ { IDirect3DDeviceImpl *This = device_from_device3(iface); HRESULT hr; - TRACE_(ddraw_thunk)("(%p)->(%p) thunking to IDirect3DDevice7 interface.\n", This, RenderTarget); + + TRACE("iface %p, target %p.\n", iface, RenderTarget); + hr = IDirect3DDevice7_GetRenderTarget((IDirect3DDevice7 *)This, (IDirectDrawSurface7 **)RenderTarget); if(hr != D3D_OK) return hr; return D3D_OK; @@ -2092,7 +2087,9 @@ { IDirect3DDeviceImpl *This = device_from_device2(iface); HRESULT hr; - TRACE_(ddraw_thunk)("(%p)->(%p) thunking to IDirect3DDevice7 interface.\n", This, RenderTarget); + + TRACE("iface %p, target %p.\n", iface, RenderTarget); + hr = IDirect3DDevice7_GetRenderTarget((IDirect3DDevice7 *)This, (IDirectDrawSurface7 **)RenderTarget); if(hr != D3D_OK) return hr; *RenderTarget = *RenderTarget ? @@ -2125,7 +2122,9 @@ DWORD Flags) { IDirect3DDeviceImpl *This = device_from_device3(iface); - TRACE("(%p)->(%d,%d,%08x)\n", This, PrimitiveType, VertexTypeDesc, Flags); + + TRACE("iface %p, primitive_type %#x, FVF %#x, flags %#x.\n", + iface, PrimitiveType, VertexTypeDesc, Flags); EnterCriticalSection(&ddraw_cs); This->primitive_type = PrimitiveType; @@ -2146,7 +2145,9 @@ { DWORD FVF; IDirect3DDeviceImpl *This = device_from_device2(iface); - TRACE_(ddraw_thunk)("(%p/%p)->(%08x,%08x,%08x): Thunking to IDirect3DDevice3\n", This, iface, d3dpt, dwVertexTypeDesc, dwFlags); + + TRACE("iface %p, primitive_type %#x, vertex_type %#x, flags %#x.\n", + iface, d3dpt, dwVertexTypeDesc, dwFlags); switch(dwVertexTypeDesc) { @@ -2188,8 +2189,9 @@ DWORD NumVertices, DWORD Flags) { - IDirect3DDeviceImpl *This = device_from_device3(iface); - FIXME("(%p)->(%08x,%08x,%p,%08x,%08x): stub!\n", This, PrimitiveType, VertexType, Vertices, NumVertices, Flags); + FIXME("iface %p, primitive_type %#x, FVF %#x, vertices %p, vertex_count %u, flags %#x stub!\n", + iface, PrimitiveType, VertexType, Vertices, NumVertices, Flags); + return D3D_OK; } @@ -2204,7 +2206,9 @@ { DWORD FVF; IDirect3DDeviceImpl *This = device_from_device2(iface); - TRACE_(ddraw_thunk)("(%p/%p)->(%08x,%08x,%p,%08x,%08x): Thunking to IDirect3DDevice3\n", This, iface, d3dptPrimitiveType, d3dvtVertexType, lpvVertices, dwNumVertices, dwFlags); + + TRACE("iface %p, primitive_type %#x, vertex_type %#x, vertices %p, vertex_count %u, flags %#x stub!\n", + iface, d3dptPrimitiveType, d3dvtVertexType, lpvVertices, dwNumVertices, dwFlags); switch(d3dvtVertexType) { @@ -2242,7 +2246,8 @@ void *Vertex) { IDirect3DDeviceImpl *This = device_from_device3(iface); - TRACE("(%p)->(%p)\n", This, Vertex); + + TRACE("iface %p, vertex %p.\n", iface, Vertex); if(!Vertex) return DDERR_INVALIDPARAMS; @@ -2272,7 +2277,9 @@ void *lpVertexType) { IDirect3DDeviceImpl *This = device_from_device2(iface); - TRACE_(ddraw_thunk)("(%p)->(%p) thunking to IDirect3DDevice3 interface.\n", This, lpVertexType); + + TRACE("iface %p, vertex %p.\n", iface, lpVertexType); + return IDirect3DDevice3_Vertex((IDirect3DDevice3 *)&This->IDirect3DDevice3_vtbl, lpVertexType); } @@ -2293,8 +2300,8 @@ IDirect3DDeviceImpl_3_Index(IDirect3DDevice3 *iface, WORD VertexIndex) { - IDirect3DDeviceImpl *This = device_from_device3(iface); - FIXME("(%p)->(%04x): stub!\n", This, VertexIndex); + FIXME("iface %p, index %#x stub!\n", iface, VertexIndex); + return D3D_OK; } @@ -2303,7 +2310,9 @@ WORD wVertexIndex) { IDirect3DDeviceImpl *This = device_from_device2(iface); - TRACE_(ddraw_thunk)("(%p)->(%04x) thunking to IDirect3DDevice3 interface.\n", This, wVertexIndex); + + TRACE("iface %p, index %#x.\n", iface, wVertexIndex); + return IDirect3DDevice3_Index((IDirect3DDevice3 *)&This->IDirect3DDevice3_vtbl, wVertexIndex); } @@ -2330,7 +2339,8 @@ DWORD Flags) { IDirect3DDeviceImpl *This = device_from_device3(iface); - TRACE("(%p)->(%08x)\n", This, Flags); + + TRACE("iface %p, flags %#x.\n", iface, Flags); return IDirect3DDevice7_DrawPrimitive((IDirect3DDevice7 *)This, This->primitive_type, This->vertex_type, This->vertex_buffer, This->nb_vertices, This->render_flags); @@ -2341,7 +2351,9 @@ DWORD dwFlags) { IDirect3DDeviceImpl *This = device_from_device2(iface); - TRACE_(ddraw_thunk)("(%p)->(%08x) thunking to IDirect3DDevice3 interface.\n", This, dwFlags); + + TRACE("iface %p, flags %#x.\n", iface, dwFlags); + return IDirect3DDevice3_End((IDirect3DDevice3 *)&This->IDirect3DDevice3_vtbl, dwFlags); } @@ -2369,7 +2381,8 @@ { IDirect3DDeviceImpl *This = (IDirect3DDeviceImpl *)iface; HRESULT hr; - TRACE("(%p)->(%08x,%p): Relay\n", This, RenderStateType, Value); + + TRACE("iface %p, state %#x, value %p.\n", iface, RenderStateType, Value); if(!Value) return DDERR_INVALIDPARAMS; @@ -2525,7 +2538,8 @@ { IDirect3DDeviceImpl *This = device_from_device3(iface); HRESULT hr; - TRACE("(%p)->(%08x,%p)\n", This, dwRenderStateType, lpdwRenderState); + + TRACE("iface %p, state %#x, value %p.\n", iface, dwRenderStateType, lpdwRenderState); switch(dwRenderStateType) { @@ -2649,7 +2663,9 @@ DWORD *lpdwRenderState) { IDirect3DDeviceImpl *This = device_from_device2(iface); - TRACE_(ddraw_thunk)("(%p)->(%08x,%p) thunking to IDirect3DDevice3 interface.\n", This, dwRenderStateType, lpdwRenderState); + + TRACE("iface %p, state %#x, value %p.\n", iface, dwRenderStateType, lpdwRenderState); + return IDirect3DDevice3_GetRenderState((IDirect3DDevice3 *)&This->IDirect3DDevice3_vtbl, dwRenderStateType, lpdwRenderState); } @@ -2678,7 +2694,8 @@ { IDirect3DDeviceImpl *This = (IDirect3DDeviceImpl *)iface; HRESULT hr; - TRACE("(%p)->(%08x,%d): Relay\n", This, RenderStateType, Value); + + TRACE("iface %p, state %#x, value %#x.\n", iface, RenderStateType, Value); EnterCriticalSection(&ddraw_cs); /* Some render states need special care */ @@ -2863,7 +2880,8 @@ HRESULT hr; IDirect3DDeviceImpl *This = device_from_device3(iface); - TRACE("(%p)->(%08x,%d)\n", This, RenderStateType, Value); + + TRACE("iface %p, state %#x, value %#x.\n", iface, RenderStateType, Value); EnterCriticalSection(&ddraw_cs); @@ -2994,7 +3012,9 @@ DWORD Value) { IDirect3DDeviceImpl *This = device_from_device2(iface); - TRACE_(ddraw_thunk)("(%p)->(%08x,%d) thunking to IDirect3DDevice3 interface.\n", This, RenderStateType, Value); + + TRACE("iface %p, state %#x, value %#x.\n", iface, RenderStateType, Value); + return IDirect3DDevice3_SetRenderState((IDirect3DDevice3 *)&This->IDirect3DDevice3_vtbl, RenderStateType, Value); } @@ -3024,7 +3044,7 @@ IDirect3DDeviceImpl *This = device_from_device3(iface); HRESULT hr; - TRACE("(%p)->(%08x,%08x)\n", This, LightStateType, Value); + TRACE("iface %p, state %#x, value %#x.\n", iface, LightStateType, Value); if (!LightStateType || (LightStateType > D3DLIGHTSTATE_COLORVERTEX)) { @@ -3044,7 +3064,7 @@ } TRACE(" activating material %p.\n", m); - m->activate(m); + material_activate(m); This->material = Value; } @@ -3109,7 +3129,9 @@ DWORD Value) { IDirect3DDeviceImpl *This = device_from_device2(iface); - TRACE_(ddraw_thunk)("(%p)->(%08x,%08x) thunking to IDirect3DDevice3 interface.\n", This, LightStateType, Value); + + TRACE("iface %p, state %#x, value %#x.\n", iface, LightStateType, Value); + return IDirect3DDevice3_SetLightState((IDirect3DDevice3 *)&This->IDirect3DDevice3_vtbl, LightStateType, Value); } @@ -3139,7 +3161,7 @@ IDirect3DDeviceImpl *This = device_from_device3(iface); HRESULT hr; - TRACE("(%p)->(%08x,%p)\n", This, LightStateType, Value); + TRACE("iface %p, state %#x, value %p.\n", iface, LightStateType, Value); if (!LightStateType || (LightStateType > D3DLIGHTSTATE_COLORVERTEX)) { @@ -3203,7 +3225,9 @@ DWORD *Value) { IDirect3DDeviceImpl *This = device_from_device2(iface); - TRACE_(ddraw_thunk)("(%p)->(%08x,%p) thunking to IDirect3DDevice3 interface.\n", This, LightStateType, Value); + + TRACE("iface %p, state %#x, value %p.\n", iface, LightStateType, Value); + return IDirect3DDevice3_GetLightState((IDirect3DDevice3 *)&This->IDirect3DDevice3_vtbl, LightStateType, Value); } @@ -3236,7 +3260,8 @@ IDirect3DDeviceImpl *This = (IDirect3DDeviceImpl *)iface; D3DTRANSFORMSTATETYPE type; HRESULT hr; - TRACE("(%p)->(%08x,%p): Relay\n", This, TransformStateType, Matrix); + + TRACE("iface %p, state %#x, matrix %p.\n", iface, TransformStateType, Matrix); switch(TransformStateType) { @@ -3288,7 +3313,9 @@ D3DMATRIX *D3DMatrix) { IDirect3DDeviceImpl *This = device_from_device3(iface); - TRACE_(ddraw_thunk)("(%p)->(%08x,%p) thunking to IDirect3DDevice7 interface.\n", This, TransformStateType, D3DMatrix); + + TRACE("iface %p, state %#x, matrix %p.\n", iface, TransformStateType, D3DMatrix); + return IDirect3DDevice7_SetTransform((IDirect3DDevice7 *)This, TransformStateType, D3DMatrix); } @@ -3298,7 +3325,9 @@ D3DMATRIX *D3DMatrix) { IDirect3DDeviceImpl *This = device_from_device2(iface); - TRACE_(ddraw_thunk)("(%p)->(%08x,%p) thunking to IDirect3DDevice7 interface.\n", This, TransformStateType, D3DMatrix); + + TRACE("iface %p, state %#x, matrix %p.\n", iface, TransformStateType, D3DMatrix); + return IDirect3DDevice7_SetTransform((IDirect3DDevice7 *)This, TransformStateType, D3DMatrix); } @@ -3327,7 +3356,8 @@ IDirect3DDeviceImpl *This = (IDirect3DDeviceImpl *)iface; D3DTRANSFORMSTATETYPE type; HRESULT hr; - TRACE("(%p)->(%08x,%p): Relay\n", This, TransformStateType, Matrix); + + TRACE("iface %p, state %#x, matrix %p.\n", iface, TransformStateType, Matrix); switch(TransformStateType) { @@ -3377,7 +3407,9 @@ D3DMATRIX *D3DMatrix) { IDirect3DDeviceImpl *This = device_from_device3(iface); - TRACE_(ddraw_thunk)("(%p)->(%08x,%p) thunking to IDirect3DDevice7 interface.\n", This, TransformStateType, D3DMatrix); + + TRACE("iface %p, state %#x, matrix %p.\n", iface, TransformStateType, D3DMatrix); + return IDirect3DDevice7_GetTransform((IDirect3DDevice7 *)This, TransformStateType, D3DMatrix); } @@ -3387,7 +3419,9 @@ D3DMATRIX *D3DMatrix) { IDirect3DDeviceImpl *This = device_from_device2(iface); - TRACE_(ddraw_thunk)("(%p)->(%08x,%p) thunking to IDirect3DDevice7 interface.\n", This, TransformStateType, D3DMatrix); + + TRACE("iface %p, state %#x, matrix %p.\n", iface, TransformStateType, D3DMatrix); + return IDirect3DDevice7_GetTransform((IDirect3DDevice7 *)This, TransformStateType, D3DMatrix); } @@ -3417,7 +3451,8 @@ IDirect3DDeviceImpl *This = (IDirect3DDeviceImpl *)iface; HRESULT hr; D3DTRANSFORMSTATETYPE type; - TRACE("(%p)->(%08x,%p): Relay\n", This, TransformStateType, D3DMatrix); + + TRACE("iface %p, state %#x, matrix %p.\n", iface, TransformStateType, D3DMatrix); switch(TransformStateType) { @@ -3466,7 +3501,9 @@ D3DMATRIX *D3DMatrix) { IDirect3DDeviceImpl *This = device_from_device3(iface); - TRACE_(ddraw_thunk)("(%p)->(%08x,%p) thunking to IDirect3DDevice7 interface.\n", This, TransformStateType, D3DMatrix); + + TRACE("iface %p, state %#x, matrix %p.\n", iface, TransformStateType, D3DMatrix); + return IDirect3DDevice7_MultiplyTransform((IDirect3DDevice7 *)This, TransformStateType, D3DMatrix); } @@ -3476,7 +3513,9 @@ D3DMATRIX *D3DMatrix) { IDirect3DDeviceImpl *This = device_from_device2(iface); - TRACE_(ddraw_thunk)("(%p)->(%08x,%p) thunking to IDirect3DDevice7 interface.\n", This, TransformStateType, D3DMatrix); + + TRACE("iface %p, state %#x, matrix %p.\n", iface, TransformStateType, D3DMatrix); + return IDirect3DDevice7_MultiplyTransform((IDirect3DDevice7 *)This, TransformStateType, D3DMatrix); } @@ -3512,7 +3551,9 @@ IDirect3DDeviceImpl *This = (IDirect3DDeviceImpl *)iface; UINT stride; HRESULT hr; - TRACE("(%p)->(%08x,%08x,%p,%08x,%08x): Relay!\n", This, PrimitiveType, VertexType, Vertices, VertexCount, Flags); + + TRACE("iface %p, primitive_type %#x, FVF %#x, vertices %p, vertex_count %u, flags %#x.\n", + iface, PrimitiveType, VertexType, Vertices, VertexCount, Flags); if(!Vertices) return DDERR_INVALIDPARAMS; @@ -3573,9 +3614,10 @@ DWORD VertexCount, DWORD Flags) { - IDirect3DDeviceImpl *This = device_from_device3(iface); - TRACE_(ddraw_thunk)("(%p)->(%08x,%08x,%p,%08x,%08x) thunking to IDirect3DDevice7 interface.\n", This, PrimitiveType, VertexType, Vertices, VertexCount, Flags); - return IDirect3DDevice7_DrawPrimitive((IDirect3DDevice7 *)This, + TRACE("iface %p, primitive_type %#x, FVF %#x, vertices %p, vertex_count %u, flags %#x.\n", + iface, PrimitiveType, VertexType, Vertices, VertexCount, Flags); + + return IDirect3DDevice7_DrawPrimitive((IDirect3DDevice7 *)device_from_device3(iface), PrimitiveType, VertexType, Vertices, VertexCount, Flags); } @@ -3587,9 +3629,10 @@ DWORD VertexCount, DWORD Flags) { - IDirect3DDeviceImpl *This = device_from_device2(iface); DWORD FVF; - TRACE_(ddraw_thunk)("(%p)->(%08x,%08x,%p,%08x,%08x) thunking to IDirect3DDevice7 interface.\n", This, PrimitiveType, VertexType, Vertices, VertexCount, Flags); + + TRACE("iface %p, primitive_type %#x, vertex_type %#x, vertices %p, vertex_count %u, flags %#x.\n", + iface, PrimitiveType, VertexType, Vertices, VertexCount, Flags); switch(VertexType) { @@ -3601,7 +3644,8 @@ return DDERR_INVALIDPARAMS; /* Should never happen */ } - return IDirect3DDevice7_DrawPrimitive((IDirect3DDevice7 *)This, PrimitiveType, FVF, Vertices, VertexCount, Flags); + return IDirect3DDevice7_DrawPrimitive((IDirect3DDevice7 *)device_from_device2(iface), + PrimitiveType, FVF, Vertices, VertexCount, Flags); } /***************************************************************************** @@ -3640,7 +3684,9 @@ { IDirect3DDeviceImpl *This = (IDirect3DDeviceImpl *)iface; HRESULT hr; - TRACE("(%p)->(%08x,%08x,%p,%08x,%p,%08x,%08x): Relay!\n", This, PrimitiveType, VertexType, Vertices, VertexCount, Indices, IndexCount, Flags); + + TRACE("iface %p, primitive_type %#x, FVF %#x, vertices %p, vertex_count %u, indices %p, index_count %u, flags %#x.\n", + iface, PrimitiveType, VertexType, Vertices, VertexCount, Indices, IndexCount, Flags); /* Set the D3DDevice's FVF */ EnterCriticalSection(&ddraw_cs); @@ -3702,9 +3748,10 @@ DWORD IndexCount, DWORD Flags) { - IDirect3DDeviceImpl *This = device_from_device3(iface); - TRACE_(ddraw_thunk)("(%p)->(%08x,%08x,%p,%08x,%p,%08x,%08x) thunking to IDirect3DDevice7 interface.\n", This, PrimitiveType, VertexType, Vertices, VertexCount, Indices, IndexCount, Flags); - return IDirect3DDevice7_DrawIndexedPrimitive((IDirect3DDevice7 *)This, + TRACE("iface %p, primitive_type %#x, FVF %#x, vertices %p, vertex_count %u, indices %p, index_count %u, flags %#x.\n", + iface, PrimitiveType, VertexType, Vertices, VertexCount, Indices, IndexCount, Flags); + + return IDirect3DDevice7_DrawIndexedPrimitive((IDirect3DDevice7 *)device_from_device3(iface), PrimitiveType, VertexType, Vertices, VertexCount, Indices, IndexCount, Flags); } @@ -3719,8 +3766,9 @@ DWORD Flags) { DWORD FVF; - IDirect3DDeviceImpl *This = device_from_device2(iface); - TRACE_(ddraw_thunk)("(%p)->(%08x,%08x,%p,%08x,%p,%08x,%08x) thunking to IDirect3DDevice7 interface.\n", This, PrimitiveType, VertexType, Vertices, VertexCount, Indices, IndexCount, Flags); + + TRACE("iface %p, primitive_type %#x, vertex_type %#x, vertices %p, vertex_count %u, indices %p, index_count %u, flags %#x.\n", + iface, PrimitiveType, VertexType, Vertices, VertexCount, Indices, IndexCount, Flags); switch(VertexType) { @@ -3732,7 +3780,7 @@ return DDERR_INVALIDPARAMS; /* Should never happen */ } - return IDirect3DDevice7_DrawIndexedPrimitive((IDirect3DDevice7 *)This, + return IDirect3DDevice7_DrawIndexedPrimitive((IDirect3DDevice7 *)device_from_device2(iface), PrimitiveType, FVF, Vertices, VertexCount, Indices, IndexCount, Flags); } @@ -3756,8 +3804,7 @@ IDirect3DDeviceImpl_7_SetClipStatus(IDirect3DDevice7 *iface, D3DCLIPSTATUS *ClipStatus) { - IDirect3DDeviceImpl *This = (IDirect3DDeviceImpl *)iface; - FIXME("(%p)->(%p): Stub!\n", This, ClipStatus); + FIXME("iface %p, clip_status %p stub!\n", iface, ClipStatus); /* D3DCLIPSTATUS and WINED3DCLIPSTATUS are different. I don't know how to convert them * Perhaps this needs a new data type and an additional IWineD3DDevice method @@ -3770,18 +3817,18 @@ Thunk_IDirect3DDeviceImpl_3_SetClipStatus(IDirect3DDevice3 *iface, D3DCLIPSTATUS *ClipStatus) { - IDirect3DDeviceImpl *This = device_from_device3(iface); - TRACE_(ddraw_thunk)("(%p)->(%p) thunking to IDirect3DDevice7 interface.\n", This, ClipStatus); - return IDirect3DDevice7_SetClipStatus((IDirect3DDevice7 *)This, ClipStatus); + TRACE("iface %p, clip_status %p.\n", iface, ClipStatus); + + return IDirect3DDevice7_SetClipStatus((IDirect3DDevice7 *)device_from_device3(iface), ClipStatus); } static HRESULT WINAPI Thunk_IDirect3DDeviceImpl_2_SetClipStatus(IDirect3DDevice2 *iface, D3DCLIPSTATUS *ClipStatus) { - IDirect3DDeviceImpl *This = device_from_device2(iface); - TRACE_(ddraw_thunk)("(%p)->(%p) thunking to IDirect3DDevice7 interface.\n", This, ClipStatus); - return IDirect3DDevice7_SetClipStatus((IDirect3DDevice7 *)This, ClipStatus); + TRACE("iface %p, clip_status %p.\n", iface, ClipStatus); + + return IDirect3DDevice7_SetClipStatus((IDirect3DDevice7 *)device_from_device2(iface), ClipStatus); } /***************************************************************************** @@ -3800,8 +3847,7 @@ IDirect3DDeviceImpl_7_GetClipStatus(IDirect3DDevice7 *iface, D3DCLIPSTATUS *ClipStatus) { - IDirect3DDeviceImpl *This = (IDirect3DDeviceImpl *)iface; - FIXME("(%p)->(%p): Stub!\n", This, ClipStatus); + FIXME("iface %p, clip_status %p stub!\n", iface, ClipStatus); /* D3DCLIPSTATUS and WINED3DCLIPSTATUS are different. I don't know how to convert them */ /* return IWineD3DDevice_GetClipStatus(This->wineD3DDevice, ClipStatus);*/ @@ -3812,18 +3858,18 @@ Thunk_IDirect3DDeviceImpl_3_GetClipStatus(IDirect3DDevice3 *iface, D3DCLIPSTATUS *ClipStatus) { - IDirect3DDeviceImpl *This = device_from_device3(iface); - TRACE_(ddraw_thunk)("(%p)->(%p) thunking to IDirect3DDevice7 interface.\n", This, ClipStatus); - return IDirect3DDevice7_GetClipStatus((IDirect3DDevice7 *)This, ClipStatus); + TRACE("iface %p, clip_status %p.\n", iface, ClipStatus); + + return IDirect3DDevice7_GetClipStatus((IDirect3DDevice7 *)device_from_device3(iface), ClipStatus); } static HRESULT WINAPI Thunk_IDirect3DDeviceImpl_2_GetClipStatus(IDirect3DDevice2 *iface, D3DCLIPSTATUS *ClipStatus) { - IDirect3DDeviceImpl *This = device_from_device2(iface); - TRACE_(ddraw_thunk)("(%p)->(%p) thunking to IDirect3DDevice7 interface.\n", This, ClipStatus); - return IDirect3DDevice7_GetClipStatus((IDirect3DDevice7 *)This, ClipStatus); + TRACE("iface %p, clip_status %p.\n", iface, ClipStatus); + + return IDirect3DDevice7_GetClipStatus((IDirect3DDevice7 *)device_from_device2(iface), ClipStatus); } /***************************************************************************** @@ -3860,7 +3906,8 @@ DWORD i; HRESULT hr; - TRACE("(%p)->(%08x,%08x,%p,%08x,%08x): stub!\n", This, PrimitiveType, VertexType, D3DDrawPrimStrideData, VertexCount, Flags); + TRACE("iface %p, primitive_type %#x, FVF %#x, strided_data %p, vertex_count %u, flags %#x.\n", + iface, PrimitiveType, VertexType, D3DDrawPrimStrideData, VertexCount, Flags); memset(&WineD3DStrided, 0, sizeof(WineD3DStrided)); /* Get the strided data right. the wined3d structure is a bit bigger @@ -3963,9 +4010,10 @@ DWORD VertexCount, DWORD Flags) { - IDirect3DDeviceImpl *This = device_from_device3(iface); - TRACE_(ddraw_thunk)("(%p)->(%08x,%08x,%p,%08x,%08x) thunking to IDirect3DDevice7 interface.\n", This, PrimitiveType, VertexType, D3DDrawPrimStrideData, VertexCount, Flags); - return IDirect3DDevice7_DrawPrimitiveStrided((IDirect3DDevice7 *)This, + TRACE("iface %p, primitive_type %#x, FVF %#x, strided_data %p, vertex_count %u, flags %#x.\n", + iface, PrimitiveType, VertexType, D3DDrawPrimStrideData, VertexCount, Flags); + + return IDirect3DDevice7_DrawPrimitiveStrided((IDirect3DDevice7 *)device_from_device3(iface), PrimitiveType, VertexType, D3DDrawPrimStrideData, VertexCount, Flags); } @@ -4001,7 +4049,8 @@ DWORD i; HRESULT hr; - TRACE("(%p)->(%08x,%08x,%p,%08x,%p,%08x,%08x)\n", This, PrimitiveType, VertexType, D3DDrawPrimStrideData, VertexCount, Indices, IndexCount, Flags); + TRACE("iface %p, primitive_type %#x, FVF %#x, strided_data %p, vertex_count %u, indices %p, index_count %u, flags %#x.\n", + iface, PrimitiveType, VertexType, D3DDrawPrimStrideData, VertexCount, Indices, IndexCount, Flags); memset(&WineD3DStrided, 0, sizeof(WineD3DStrided)); /* Get the strided data right. the wined3d structure is a bit bigger @@ -4111,10 +4160,11 @@ DWORD IndexCount, DWORD Flags) { - IDirect3DDeviceImpl *This = device_from_device3(iface); - TRACE_(ddraw_thunk)("(%p)->(%08x,%08x,%p,%08x,%p,%08x,%08x) thunking to IDirect3DDevice7 interface.\n", iface, PrimitiveType, VertexType, D3DDrawPrimStrideData, VertexCount, Indices, IndexCount, Flags); - return IDirect3DDevice7_DrawIndexedPrimitiveStrided((IDirect3DDevice7 *)This, PrimitiveType, - VertexType, D3DDrawPrimStrideData, VertexCount, Indices, IndexCount, Flags); + TRACE("iface %p, primitive_type %#x, FVF %#x, strided_data %p, vertex_count %u, indices %p, index_count %u, flags %#x.\n", + iface, PrimitiveType, VertexType, D3DDrawPrimStrideData, VertexCount, Indices, IndexCount, Flags); + + return IDirect3DDevice7_DrawIndexedPrimitiveStrided((IDirect3DDevice7 *)device_from_device3(iface), + PrimitiveType, VertexType, D3DDrawPrimStrideData, VertexCount, Indices, IndexCount, Flags); } /***************************************************************************** @@ -4149,7 +4199,8 @@ HRESULT hr; DWORD stride; - TRACE("(%p)->(%08x,%p,%08x,%08x,%08x)\n", This, PrimitiveType, D3DVertexBuf, StartVertex, NumVertices, Flags); + TRACE("iface %p, primitive_type %#x, vb %p, start_vertex %u, vertex_count %u, flags %#x.\n", + iface, PrimitiveType, D3DVertexBuf, StartVertex, NumVertices, Flags); /* Sanity checks */ if(!vb) @@ -4226,11 +4277,13 @@ DWORD NumVertices, DWORD Flags) { - IDirect3DDeviceImpl *This = device_from_device3(iface); IDirect3DVertexBufferImpl *vb = D3DVertexBuf ? vb_from_vb1(D3DVertexBuf) : NULL; - TRACE_(ddraw_thunk)("(%p)->(%08x,%p,%08x,%08x,%08x) thunking to IDirect3DDevice7 interface.\n", This, PrimitiveType, vb, StartVertex, NumVertices, Flags); - return IDirect3DDevice7_DrawPrimitiveVB((IDirect3DDevice7 *)This, PrimitiveType, - (IDirect3DVertexBuffer7 *)vb, StartVertex, NumVertices, Flags); + + TRACE("iface %p, primitive_type %#x, vb %p, start_vertex %u, vertex_count %u, flags %#x.\n", + iface, PrimitiveType, D3DVertexBuf, StartVertex, NumVertices, Flags); + + return IDirect3DDevice7_DrawPrimitiveVB((IDirect3DDevice7 *)device_from_device3(iface), + PrimitiveType, (IDirect3DVertexBuffer7 *)vb, StartVertex, NumVertices, Flags); } @@ -4268,7 +4321,8 @@ HRESULT hr; WINED3DBUFFER_DESC desc; - TRACE("(%p)->(%08x,%p,%d,%d,%p,%d,%08x)\n", This, PrimitiveType, vb, StartVertex, NumVertices, Indices, IndexCount, Flags); + TRACE("iface %p, primitive_type %#x, vb %p, start_vertex %u, vertex_count %u, indices %p, index_count %u, flags %#x.\n", + iface, PrimitiveType, D3DVertexBuf, StartVertex, NumVertices, Indices, IndexCount, Flags); /* Steps: * 1) Upload the Indices to the index buffer @@ -4412,12 +4466,13 @@ DWORD IndexCount, DWORD Flags) { - IDirect3DDeviceImpl *This = device_from_device3(iface); IDirect3DVertexBufferImpl *VB = vb_from_vb1(D3DVertexBuf); - TRACE_(ddraw_thunk)("(%p)->(%08x,%p,%p,%08x,%08x) thunking to IDirect3DDevice7 interface.\n", This, PrimitiveType, VB, Indices, IndexCount, Flags); - return IDirect3DDevice7_DrawIndexedPrimitiveVB((IDirect3DDevice7 *)This, PrimitiveType, - (IDirect3DVertexBuffer7 *)VB, 0, IndexCount, Indices, IndexCount, Flags); + TRACE("iface %p, primitive_type %#x, vb %p, indices %p, index_count %u, flags %#x.\n", + iface, PrimitiveType, D3DVertexBuf, Indices, IndexCount, Flags); + + return IDirect3DDevice7_DrawIndexedPrimitiveVB((IDirect3DDevice7 *)device_from_device3(iface), + PrimitiveType, (IDirect3DVertexBuffer7 *)VB, 0, IndexCount, Indices, IndexCount, Flags); } /***************************************************************************** @@ -4473,7 +4528,8 @@ HRESULT hr; UINT i, j; - TRACE("(%p)->(%p,%p,%08x,%08x,%p)\n", iface, Centers, Radii, NumSpheres, Flags, ReturnValues); + TRACE("iface %p, centers %p, radii %p, sphere_count %u, flags %#x, return_values %p.\n", + iface, Centers, Radii, NumSpheres, Flags, ReturnValues); hr = IDirect3DDeviceImpl_7_GetTransform(iface, D3DTRANSFORMSTATE_WORLD, &m); if ( hr != DD_OK ) return DDERR_INVALIDPARAMS; @@ -4538,9 +4594,10 @@ DWORD Flags, DWORD *ReturnValues) { - IDirect3DDeviceImpl *This = device_from_device3(iface); - TRACE_(ddraw_thunk)("(%p)->(%p,%p,%08x,%08x,%p) thunking to IDirect3DDevice7 interface.\n", This, Centers, Radii, NumSpheres, Flags, ReturnValues); - return IDirect3DDevice7_ComputeSphereVisibility((IDirect3DDevice7 *)This, + TRACE("iface %p, centers %p, radii %p, sphere_count %u, flags %#x, return_values %p.\n", + iface, Centers, Radii, NumSpheres, Flags, ReturnValues); + + return IDirect3DDevice7_ComputeSphereVisibility((IDirect3DDevice7 *)device_from_device3(iface), Centers, Radii, NumSpheres, Flags, ReturnValues); } @@ -4571,7 +4628,8 @@ IDirect3DDeviceImpl *This = (IDirect3DDeviceImpl *)iface; IWineD3DBaseTexture *Surf; HRESULT hr; - TRACE("(%p)->(%d,%p): Relay\n", This, Stage, Texture); + + TRACE("iface %p, stage %u, texture %p.\n", iface, Stage, Texture); if(!Texture) { @@ -4625,16 +4683,16 @@ DWORD Stage, IDirect3DTexture2 **Texture2) { - IDirect3DDeviceImpl *This = device_from_device3(iface); HRESULT ret; IDirectDrawSurface7 *ret_val; - TRACE_(ddraw_thunk)("(%p)->(%d,%p) thunking to IDirect3DDevice7 interface.\n", This, Stage, Texture2); - ret = IDirect3DDevice7_GetTexture((IDirect3DDevice7 *)This, Stage, &ret_val); + TRACE("iface %p, stage %u, texture %p.\n", iface, Stage, Texture2); + + ret = IDirect3DDevice7_GetTexture((IDirect3DDevice7 *)device_from_device3(iface), Stage, &ret_val); *Texture2 = ret_val ? (IDirect3DTexture2 *)&((IDirectDrawSurfaceImpl *)ret_val)->IDirect3DTexture2_vtbl : NULL; - TRACE_(ddraw_thunk)(" returning interface %p.\n", *Texture2); + TRACE("Returning texture %p.\n", *Texture2); return ret; } @@ -4663,7 +4721,8 @@ IDirect3DDeviceImpl *This = (IDirect3DDeviceImpl *)iface; IDirectDrawSurfaceImpl *surf = (IDirectDrawSurfaceImpl *)Texture; HRESULT hr; - TRACE("(%p)->(%08x,%p): Relay!\n", This, Stage, surf); + + TRACE("iface %p, stage %u, texture %p.\n", iface, Stage, Texture); /* Texture may be NULL here */ EnterCriticalSection(&ddraw_cs); @@ -4706,7 +4765,8 @@ IDirectDrawSurfaceImpl *tex = Texture2 ? surface_from_texture2(Texture2) : NULL; DWORD texmapblend; HRESULT hr; - TRACE("(%p)->(%d,%p)\n", This, Stage, tex); + + TRACE("iface %p, stage %u, texture %p.\n", iface, Stage, Texture2); EnterCriticalSection(&ddraw_cs); @@ -4816,7 +4876,9 @@ IDirect3DDeviceImpl *This = (IDirect3DDeviceImpl *)iface; HRESULT hr; const struct tss_lookup *l = &tss_lookup[TexStageStateType]; - TRACE("(%p)->(%08x,%08x,%p): Relay!\n", This, Stage, TexStageStateType, State); + + TRACE("iface %p, stage %u, state %#x, value %p.\n", + iface, Stage, TexStageStateType, State); if(!State) return DDERR_INVALIDPARAMS; @@ -4914,9 +4976,11 @@ D3DTEXTURESTAGESTATETYPE TexStageStateType, DWORD *State) { - IDirect3DDeviceImpl *This = device_from_device3(iface); - TRACE_(ddraw_thunk)("(%p)->(%08x,%08x,%p) thunking to IDirect3DDevice7 interface.\n", This, Stage, TexStageStateType, State); - return IDirect3DDevice7_GetTextureStageState((IDirect3DDevice7 *)This, Stage, TexStageStateType, State); + TRACE("iface %p, stage %u, state %#x, value %p.\n", + iface, Stage, TexStageStateType, State); + + return IDirect3DDevice7_GetTextureStageState((IDirect3DDevice7 *)device_from_device3(iface), + Stage, TexStageStateType, State); } /***************************************************************************** @@ -4946,7 +5010,9 @@ IDirect3DDeviceImpl *This = (IDirect3DDeviceImpl *)iface; const struct tss_lookup *l = &tss_lookup[TexStageStateType]; HRESULT hr; - TRACE("(%p)->(%08x,%08x,%08x): Relay!\n", This, Stage, TexStageStateType, State); + + TRACE("iface %p, stage %u, state %#x, value %#x.\n", + iface, Stage, TexStageStateType, State); if (TexStageStateType > D3DTSS_TEXTURETRANSFORMFLAGS) { @@ -5045,9 +5111,11 @@ D3DTEXTURESTAGESTATETYPE TexStageStateType, DWORD State) { - IDirect3DDeviceImpl *This = device_from_device3(iface); - TRACE_(ddraw_thunk)("(%p)->(%08x,%08x,%08x) thunking to IDirect3DDevice7 interface.\n", This, Stage, TexStageStateType, State); - return IDirect3DDevice7_SetTextureStageState((IDirect3DDevice7 *)This, Stage, TexStageStateType, State); + TRACE("iface %p, stage %u, state %#x, value %#x.\n", + iface, Stage, TexStageStateType, State); + + return IDirect3DDevice7_SetTextureStageState((IDirect3DDevice7 *)device_from_device3(iface), + Stage, TexStageStateType, State); } /***************************************************************************** @@ -5074,7 +5142,8 @@ { IDirect3DDeviceImpl *This = (IDirect3DDeviceImpl *)iface; HRESULT hr; - TRACE("(%p)->(%p): Relay\n", This, NumPasses); + + TRACE("iface %p, pass_count %p.\n", iface, NumPasses); EnterCriticalSection(&ddraw_cs); hr = IWineD3DDevice_ValidateDevice(This->wineD3DDevice, NumPasses); @@ -5107,9 +5176,9 @@ Thunk_IDirect3DDeviceImpl_3_ValidateDevice(IDirect3DDevice3 *iface, DWORD *Passes) { - IDirect3DDeviceImpl *This = device_from_device3(iface); - TRACE_(ddraw_thunk)("(%p)->(%p) thunking to IDirect3DDevice7 interface.\n", This, Passes); - return IDirect3DDevice7_ValidateDevice((IDirect3DDevice7 *)This, Passes); + TRACE("iface %p, pass_count %p.\n", iface, Passes); + + return IDirect3DDevice7_ValidateDevice((IDirect3DDevice7 *)device_from_device3(iface), Passes); } /***************************************************************************** @@ -5144,7 +5213,9 @@ { IDirect3DDeviceImpl *This = (IDirect3DDeviceImpl *)iface; HRESULT hr; - TRACE("(%p)->(%08x,%p,%08x,%08x,%f,%08x): Relay\n", This, Count, Rects, Flags, Color, Z, Stencil); + + TRACE("iface %p, count %u, rects %p, flags %#x, color 0x%08x, z %.8e, stencil %#x.\n", + iface, Count, Rects, Flags, Color, Z, Stencil); /* Note; D3DRECT is compatible with WINED3DRECT */ EnterCriticalSection(&ddraw_cs); @@ -5207,7 +5278,8 @@ { IDirect3DDeviceImpl *This = (IDirect3DDeviceImpl *)iface; HRESULT hr; - TRACE("(%p)->(%p) Relay!\n", This, Data); + + TRACE("iface %p, viewport %p.\n", iface, Data); if(!Data) return DDERR_INVALIDPARAMS; @@ -5263,7 +5335,8 @@ { IDirect3DDeviceImpl *This = (IDirect3DDeviceImpl *)iface; HRESULT hr; - TRACE("(%p)->(%p) Relay!\n", This, Data); + + TRACE("iface %p, viewport %p.\n", iface, Data); if(!Data) return DDERR_INVALIDPARAMS; @@ -5320,7 +5393,8 @@ { IDirect3DDeviceImpl *This = (IDirect3DDeviceImpl *)iface; HRESULT hr; - TRACE("(%p)->(%p): Relay!\n", This, Mat); + + TRACE("iface %p, material %p.\n", iface, Mat); if (!Mat) return DDERR_INVALIDPARAMS; /* Note: D3DMATERIAL7 is compatible with WINED3DMATERIAL */ @@ -5374,7 +5448,8 @@ { IDirect3DDeviceImpl *This = (IDirect3DDeviceImpl *)iface; HRESULT hr; - TRACE("(%p)->(%p): Relay!\n", This, Mat); + + TRACE("iface %p, material %p.\n", iface, Mat); EnterCriticalSection(&ddraw_cs); /* Note: D3DMATERIAL7 is compatible with WINED3DMATERIAL */ @@ -5428,7 +5503,8 @@ { IDirect3DDeviceImpl *This = (IDirect3DDeviceImpl *)iface; HRESULT hr; - TRACE("(%p)->(%08x,%p): Relay!\n", This, LightIndex, Light); + + TRACE("iface %p, light_idx %u, light %p.\n", iface, LightIndex, Light); EnterCriticalSection(&ddraw_cs); /* Note: D3DLIGHT7 is compatible with WINED3DLIGHT */ @@ -5483,7 +5559,8 @@ { IDirect3DDeviceImpl *This = (IDirect3DDeviceImpl *)iface; HRESULT rc; - TRACE("(%p)->(%08x,%p): Relay!\n", This, LightIndex, Light); + + TRACE("iface %p, light_idx %u, light %p.\n", iface, LightIndex, Light); EnterCriticalSection(&ddraw_cs); /* Note: D3DLIGHT7 is compatible with WINED3DLIGHT */ @@ -5536,7 +5613,8 @@ { IDirect3DDeviceImpl *This = (IDirect3DDeviceImpl *)iface; HRESULT hr; - TRACE("(%p)->(): Relay!\n", This); + + TRACE("iface %p.\n", iface); EnterCriticalSection(&ddraw_cs); hr = IWineD3DDevice_BeginStateBlock(This->wineD3DDevice); @@ -5589,7 +5667,7 @@ HRESULT hr; DWORD h; - TRACE("(%p)->(%p): Relay!\n", This, BlockHandle); + TRACE("iface %p, stateblock %p.\n", iface, BlockHandle); if(!BlockHandle) { @@ -5666,10 +5744,9 @@ IDirect3DDeviceImpl_7_PreLoad(IDirect3DDevice7 *iface, IDirectDrawSurface7 *Texture) { - IDirect3DDeviceImpl *This = (IDirect3DDeviceImpl *)iface; IDirectDrawSurfaceImpl *surf = (IDirectDrawSurfaceImpl *)Texture; - TRACE("(%p)->(%p): Relay!\n", This, surf); + TRACE("iface %p, texture %p.\n", iface, Texture); if(!Texture) return DDERR_INVALIDPARAMS; @@ -5721,7 +5798,8 @@ IDirect3DDeviceImpl *This = (IDirect3DDeviceImpl *)iface; IWineD3DStateBlock *wined3d_sb; HRESULT hr; - TRACE("(%p)->(%08x): Relay!\n", This, BlockHandle); + + TRACE("iface %p, stateblock %#x.\n", iface, BlockHandle); EnterCriticalSection(&ddraw_cs); @@ -5783,7 +5861,8 @@ IDirect3DDeviceImpl *This = (IDirect3DDeviceImpl *)iface; IWineD3DStateBlock *wined3d_sb; HRESULT hr; - TRACE("(%p)->(%08x): Relay!\n", This, BlockHandle); + + TRACE("iface %p, stateblock %#x.\n", iface, BlockHandle); EnterCriticalSection(&ddraw_cs); @@ -5843,7 +5922,8 @@ IDirect3DDeviceImpl *This = (IDirect3DDeviceImpl *)iface; IWineD3DStateBlock *wined3d_sb; ULONG ref; - TRACE("(%p)->(%08x): Relay!\n", This, BlockHandle); + + TRACE("iface %p, stateblock %#x.\n", iface, BlockHandle); EnterCriticalSection(&ddraw_cs); @@ -5911,7 +5991,7 @@ HRESULT hr; DWORD h; - TRACE("(%p)->(%08x,%p)!\n", This, Type, BlockHandle); + TRACE("iface %p, type %#x, stateblock %p.\n", iface, Type, BlockHandle); if(!BlockHandle) { @@ -6166,7 +6246,9 @@ IDirectDrawSurfaceImpl *src = (IDirectDrawSurfaceImpl *)SrcTex; POINT destpoint; RECT srcrect; - TRACE("(%p)->(%p,%p,%p,%p,%08x)\n", This, dest, DestPoint, src, SrcRect, Flags); + + TRACE("iface %p, dst_texture %p, dst_pos %s, src_texture %p, src_rect %s, flags %#x.\n", + iface, DestTex, wine_dbgstr_point(DestPoint), SrcTex, wine_dbgstr_rect(SrcRect), Flags); if( (!src) || (!dest) ) return DDERR_INVALIDPARAMS; @@ -6376,7 +6458,8 @@ { IDirect3DDeviceImpl *This = (IDirect3DDeviceImpl *)iface; HRESULT hr; - TRACE("(%p)->(%08x,%d): Relay!\n", This, LightIndex, Enable); + + TRACE("iface %p, light_idx %u, enabled %#x.\n", iface, LightIndex, Enable); EnterCriticalSection(&ddraw_cs); hr = IWineD3DDevice_SetLightEnable(This->wineD3DDevice, LightIndex, Enable); @@ -6431,7 +6514,8 @@ { IDirect3DDeviceImpl *This = (IDirect3DDeviceImpl *)iface; HRESULT hr; - TRACE("(%p)->(%08x,%p): Relay\n", This, LightIndex, Enable); + + TRACE("iface %p, light_idx %u, enabled %p.\n", iface, LightIndex, Enable); if(!Enable) return DDERR_INVALIDPARAMS; @@ -6489,7 +6573,8 @@ { IDirect3DDeviceImpl *This = (IDirect3DDeviceImpl *)iface; HRESULT hr; - TRACE("(%p)->(%08x,%p): Relay!\n", This, Index, PlaneEquation); + + TRACE("iface %p, idx %u, plane %p.\n", iface, Index, PlaneEquation); if(!PlaneEquation) return DDERR_INVALIDPARAMS; @@ -6545,7 +6630,8 @@ { IDirect3DDeviceImpl *This = (IDirect3DDeviceImpl *)iface; HRESULT hr; - TRACE("(%p)->(%d,%p): Relay!\n", This, Index, PlaneEquation); + + TRACE("iface %p, idx %u, plane %p.\n", iface, Index, PlaneEquation); if(!PlaneEquation) return DDERR_INVALIDPARAMS; @@ -6601,10 +6687,10 @@ void *DevInfoStruct, DWORD Size) { - IDirect3DDeviceImpl *This = (IDirect3DDeviceImpl *)iface; - TRACE("(%p)->(%08x,%p,%08x)\n", This, DevInfoID, DevInfoStruct, Size); + TRACE("iface %p, info_id %#x, info %p, info_size %u.\n", + iface, DevInfoID, DevInfoStruct, Size); - if (TRACE_ON(d3d7)) + if (TRACE_ON(ddraw)) { TRACE(" info requested : "); switch (DevInfoID) @@ -6629,7 +6715,7 @@ * Device created with DDSCL_FPUPRESERVE - resets and restores FPU mode when necessary in * d3d calls (FPU may be in a mode non-suitable for d3d when the app calls d3d). Required * by Sacrifice (game). */ -const IDirect3DDevice7Vtbl IDirect3DDevice7_FPUSetup_Vtbl = +static const struct IDirect3DDevice7Vtbl d3d_device7_fpu_setup_vtbl = { /*** IUnknown Methods ***/ IDirect3DDeviceImpl_7_QueryInterface, @@ -6684,7 +6770,7 @@ IDirect3DDeviceImpl_7_GetInfo }; -const IDirect3DDevice7Vtbl IDirect3DDevice7_FPUPreserve_Vtbl = +static const struct IDirect3DDevice7Vtbl d3d_device7_fpu_preserve_vtbl = { /*** IUnknown Methods ***/ IDirect3DDeviceImpl_7_QueryInterface, @@ -6739,7 +6825,7 @@ IDirect3DDeviceImpl_7_GetInfo }; -const IDirect3DDevice3Vtbl IDirect3DDevice3_Vtbl = +static const struct IDirect3DDevice3Vtbl d3d_device3_vtbl = { /*** IUnknown Methods ***/ Thunk_IDirect3DDeviceImpl_3_QueryInterface, @@ -6787,7 +6873,7 @@ Thunk_IDirect3DDeviceImpl_3_ValidateDevice }; -const IDirect3DDevice2Vtbl IDirect3DDevice2_Vtbl = +static const struct IDirect3DDevice2Vtbl d3d_device2_vtbl = { /*** IUnknown Methods ***/ Thunk_IDirect3DDeviceImpl_2_QueryInterface, @@ -6826,7 +6912,7 @@ Thunk_IDirect3DDeviceImpl_2_GetClipStatus }; -const IDirect3DDeviceVtbl IDirect3DDevice1_Vtbl = +static const struct IDirect3DDeviceVtbl d3d_device1_vtbl = { /*** IUnknown Methods ***/ Thunk_IDirect3DDeviceImpl_1_QueryInterface, @@ -6888,3 +6974,117 @@ IDirectDrawSurface7_Release(depthStencil); return WINED3DZB_TRUE; } + +HRESULT d3d_device_init(IDirect3DDeviceImpl *device, IDirectDrawImpl *ddraw, IDirectDrawSurfaceImpl *target) +{ + IParentImpl *index_buffer_parent; + HRESULT hr; + + if (ddraw->cooperative_level & DDSCL_FPUPRESERVE) + device->lpVtbl = &d3d_device7_fpu_preserve_vtbl; + else + device->lpVtbl = &d3d_device7_fpu_setup_vtbl; + + device->IDirect3DDevice3_vtbl = &d3d_device3_vtbl; + device->IDirect3DDevice2_vtbl = &d3d_device2_vtbl; + device->IDirect3DDevice_vtbl = &d3d_device1_vtbl; + device->ref = 1; + device->ddraw = ddraw; + device->target = target; + + if (!ddraw_handle_table_init(&device->handle_table, 64)) + { + ERR("Failed to initialize handle table.\n"); + return DDERR_OUTOFMEMORY; + } + + device->legacyTextureBlending = FALSE; + + /* Create an index buffer, it's needed for indexed drawing */ + index_buffer_parent = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(*index_buffer_parent)); + if (!index_buffer_parent) + { + ERR("Failed to allocate index buffer parent memory.\n"); + ddraw_handle_table_destroy(&device->handle_table); + return DDERR_OUTOFMEMORY; + } + + ddraw_parent_init(index_buffer_parent); + + hr = IWineD3DDevice_CreateIndexBuffer(ddraw->wineD3DDevice, 0x40000 /* Length. Don't know how long it should be */, + WINED3DUSAGE_DYNAMIC /* Usage */, WINED3DPOOL_DEFAULT, &device->indexbuffer, + (IUnknown *)index_buffer_parent, &ddraw_null_wined3d_parent_ops); + if (FAILED(hr)) + { + ERR("Failed to create an index buffer, hr %#x.\n", hr); + HeapFree(GetProcessHeap(), 0, index_buffer_parent); + ddraw_handle_table_destroy(&device->handle_table); + return hr; + } + index_buffer_parent->child = (IUnknown *)device->indexbuffer; + + /* This is for convenience. */ + device->wineD3DDevice = ddraw->wineD3DDevice; + IWineD3DDevice_AddRef(ddraw->wineD3DDevice); + + /* This is for apps which create a non-flip, non-d3d primary surface + * and an offscreen D3DDEVICE surface, then render to the offscreen surface + * and do a Blt from the offscreen to the primary surface. + * + * Set the offscreen D3DDDEVICE surface(=target) as the back buffer, + * and the primary surface(=This->d3d_target) as the front buffer. + * + * This way the app will render to the D3DDEVICE surface and WineD3D + * will catch the Blt was Back Buffer -> Front buffer blt and perform + * a flip instead. This way we don't have to deal with a mixed GL / GDI + * environment. + * + * This should be checked against windowed apps. The only app tested with + * this is moto racer 2 during the loading screen. + */ + TRACE("Is rendertarget: %s, d3d_target %p.\n", + target->surface_desc.ddsCaps.dwCaps & DDSCAPS_PRIMARYSURFACE ? "true" : "false", ddraw->d3d_target); + + if (!(target->surface_desc.ddsCaps.dwCaps & DDSCAPS_PRIMARYSURFACE) + && ddraw->d3d_target != target) + { + TRACE("Using %p as front buffer, %p as back buffer.\n", ddraw->d3d_target, target); + + hr = IWineD3DDevice_SetFrontBackBuffers(ddraw->wineD3DDevice, + ddraw->d3d_target->WineD3DSurface, target->WineD3DSurface); + if (FAILED(hr)) + { + ERR("Failed to set front and back buffer, hr %#x.\n", hr); + IParent_Release((IParent *)index_buffer_parent); + ddraw_handle_table_destroy(&device->handle_table); + return hr; + } + + /* Render to the back buffer */ + IWineD3DDevice_SetRenderTarget(ddraw->wineD3DDevice, 0, target->WineD3DSurface, TRUE); + device->OffScreenTarget = TRUE; + } + else + { + device->OffScreenTarget = FALSE; + } + + /* FIXME: This is broken. The target AddRef() makes some sense, because + * we store a pointer during initialization, but then that's also where + * the AddRef() should be. We don't store ddraw->d3d_target anywhere. */ + /* AddRef the render target. Also AddRef the render target from ddraw, + * because if it is released before the app releases the D3D device, the + * D3D capabilities of wined3d will be uninitialized, which has bad effects. + * + * In most cases, those surfaces are the same anyway, but this will simply + * add another ref which is released when the device is destroyed. */ + IDirectDrawSurface7_AddRef((IDirectDrawSurface7 *)target); + IDirectDrawSurface7_AddRef((IDirectDrawSurface7 *)ddraw->d3d_target); + + ddraw->d3ddevice = device; + + IWineD3DDevice_SetRenderState(ddraw->wineD3DDevice, WINED3DRS_ZENABLE, + IDirect3DDeviceImpl_UpdateDepthStencil(device)); + + return D3D_OK; +} diff -Nru wine1.3-1.3.0/dlls/ddraw/direct3d.c wine1.3-1.3.1/dlls/ddraw/direct3d.c --- wine1.3-1.3.0/dlls/ddraw/direct3d.c 2010-07-30 18:43:56.000000000 +0100 +++ wine1.3-1.3.1/dlls/ddraw/direct3d.c 1970-01-01 01:00:00.000000000 +0100 @@ -1,1608 +0,0 @@ -/* - * Copyright (c) 2006 Stefan Dösinger - * - * 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 "wine/port.h" -#include "wine/debug.h" - -#include -#include -#include -#include - -#define COBJMACROS - -#include "windef.h" -#include "winbase.h" -#include "winerror.h" -#include "wingdi.h" -#include "wine/exception.h" - -#include "ddraw.h" -#include "d3d.h" - -#include "ddraw_private.h" - -WINE_DEFAULT_DEBUG_CHANNEL(d3d7); - -/***************************************************************************** - * IDirect3D7::QueryInterface - * - * QueryInterface implementation with thunks to IDirectDraw7 - * - *****************************************************************************/ -static HRESULT WINAPI -Thunk_IDirect3DImpl_7_QueryInterface(IDirect3D7 *iface, - REFIID refiid, - void **obj) -{ - IDirectDrawImpl *This = ddraw_from_d3d7(iface); - TRACE("(%p)->(%s,%p): Thunking to IDirectDraw7\n", This, debugstr_guid(refiid), obj); - - return IDirectDraw7_QueryInterface((IDirectDraw7 *)This, refiid, obj); -} - -static HRESULT WINAPI -Thunk_IDirect3DImpl_3_QueryInterface(IDirect3D3 *iface, - REFIID refiid, - void **obj) -{ - IDirectDrawImpl *This = ddraw_from_d3d3(iface); - TRACE("(%p)->(%s,%p): Thunking to IDirectDraw7\n", This, debugstr_guid(refiid), obj); - - return IDirectDraw7_QueryInterface((IDirectDraw7 *)This, refiid, obj); -} - -static HRESULT WINAPI -Thunk_IDirect3DImpl_2_QueryInterface(IDirect3D2 *iface, - REFIID refiid, - void **obj) -{ - IDirectDrawImpl *This = ddraw_from_d3d2(iface); - TRACE("(%p)->(%s,%p): Thunking to IDirectDraw7\n", This, debugstr_guid(refiid), obj); - - return IDirectDraw7_QueryInterface((IDirectDraw7 *)This, refiid, obj); -} - -static HRESULT WINAPI -Thunk_IDirect3DImpl_1_QueryInterface(IDirect3D *iface, - REFIID refiid, - void **obj) -{ - IDirectDrawImpl *This = ddraw_from_d3d1(iface); - TRACE("(%p)->(%s,%p): Thunking to IDirectDraw7\n", This, debugstr_guid(refiid), obj); - - return IDirectDraw7_QueryInterface((IDirectDraw7 *)This, refiid, obj); -} - -/***************************************************************************** - * IDirect3D7::AddRef - * - * DirectDraw refcounting is a bit odd. Every version of the ddraw interface - * has its own refcount, but IDirect3D 1/2/3 refcounts are linked to - * IDirectDraw, and IDirect3D7 is linked to IDirectDraw7 - * - * IDirect3D7 -> IDirectDraw7 - * IDirect3D3 -> IDirectDraw - * IDirect3D2 -> IDirectDraw - * IDirect3D -> IDirectDraw - * - * So every AddRef implementation thunks to a different interface, and the - * IDirectDrawX::AddRef implementations have different counters... - * - * Returns - * The new refcount - * - *****************************************************************************/ -static ULONG WINAPI -Thunk_IDirect3DImpl_7_AddRef(IDirect3D7 *iface) -{ - IDirectDrawImpl *This = ddraw_from_d3d7(iface); - TRACE("(%p) : Thunking to IDirectDraw7.\n", This); - - return IDirectDraw7_AddRef((IDirectDraw7 *)This); -} - -static ULONG WINAPI -Thunk_IDirect3DImpl_3_AddRef(IDirect3D3 *iface) -{ - IDirectDrawImpl *This = ddraw_from_d3d3(iface); - TRACE("(%p) : Thunking to IDirectDraw.\n", This); - - return IDirectDraw_AddRef((IDirectDraw *)&This->IDirectDraw_vtbl); -} - -static ULONG WINAPI -Thunk_IDirect3DImpl_2_AddRef(IDirect3D2 *iface) -{ - IDirectDrawImpl *This = ddraw_from_d3d2(iface); - TRACE("(%p) : Thunking to IDirectDraw.\n", This); - - return IDirectDraw_AddRef((IDirectDraw *)&This->IDirectDraw_vtbl); -} - -static ULONG WINAPI -Thunk_IDirect3DImpl_1_AddRef(IDirect3D *iface) -{ - IDirectDrawImpl *This = ddraw_from_d3d1(iface); - TRACE("(%p) : Thunking to IDirectDraw.\n", This); - - return IDirectDraw_AddRef((IDirectDraw *)&This->IDirectDraw_vtbl); -} - -/***************************************************************************** - * IDirect3D7::Release - * - * Same story as IDirect3D7::AddRef - * - * Returns: The new refcount - * - *****************************************************************************/ -static ULONG WINAPI -Thunk_IDirect3DImpl_7_Release(IDirect3D7 *iface) -{ - IDirectDrawImpl *This = ddraw_from_d3d7(iface); - TRACE("(%p) : Thunking to IDirectDraw7.\n", This); - - return IDirectDraw7_Release((IDirectDraw7 *)This); -} - -static ULONG WINAPI -Thunk_IDirect3DImpl_3_Release(IDirect3D3 *iface) -{ - IDirectDrawImpl *This = ddraw_from_d3d3(iface); - TRACE("(%p) : Thunking to IDirectDraw.\n", This); - - return IDirectDraw_Release((IDirectDraw *)&This->IDirectDraw_vtbl); -} - -static ULONG WINAPI -Thunk_IDirect3DImpl_2_Release(IDirect3D2 *iface) -{ - IDirectDrawImpl *This = ddraw_from_d3d2(iface); - TRACE("(%p) : Thunking to IDirectDraw.\n", This); - - return IDirectDraw_Release((IDirectDraw *)&This->IDirectDraw_vtbl); -} - -static ULONG WINAPI -Thunk_IDirect3DImpl_1_Release(IDirect3D *iface) -{ - IDirectDrawImpl *This = ddraw_from_d3d1(iface); - TRACE("(%p) : Thunking to IDirectDraw.\n", This); - - return IDirectDraw_Release((IDirectDraw *)&This->IDirectDraw_vtbl); -} - -/***************************************************************************** - * IDirect3D Methods - *****************************************************************************/ - -/***************************************************************************** - * IDirect3D::Initialize - * - * Initializes the IDirect3D interface. This is a no-op implementation, - * as all initialization is done at create time. - * - * Version 1 - * - * Params: - * refiid: ? - * - * Returns: - * D3D_OK, because it's a no-op - * - *****************************************************************************/ -static HRESULT WINAPI -IDirect3DImpl_1_Initialize(IDirect3D *iface, - REFIID refiid) -{ - IDirectDrawImpl *This = ddraw_from_d3d1(iface); - - TRACE("(%p)->(%s) no-op...\n", This, debugstr_guid(refiid)); - return D3D_OK; -} - -/***************************************************************************** - * IDirect3D7::EnumDevices - * - * The EnumDevices method for IDirect3D7. It enumerates all supported - * D3D7 devices. Currently the T&L, HAL and RGB devices are enumerated. - * - * Params: - * Callback: Function to call for each enumerated device - * Context: Pointer to pass back to the app - * - * Returns: - * D3D_OK, or the return value of the GetCaps call - * - *****************************************************************************/ -static HRESULT WINAPI -IDirect3DImpl_7_EnumDevices(IDirect3D7 *iface, - LPD3DENUMDEVICESCALLBACK7 Callback, - void *Context) -{ - IDirectDrawImpl *This = ddraw_from_d3d7(iface); - char interface_name_tnl[] = "WINE Direct3D7 Hardware Transform and Lighting acceleration using WineD3D"; - char device_name_tnl[] = "Wine D3D7 T&L HAL"; - char interface_name_hal[] = "WINE Direct3D7 Hardware acceleration using WineD3D"; - char device_name_hal[] = "Wine D3D7 HAL"; - char interface_name_rgb[] = "WINE Direct3D7 RGB Software Emulation using WineD3D"; - char device_name_rgb[] = "Wine D3D7 RGB"; - D3DDEVICEDESC7 ddesc; - D3DDEVICEDESC oldDesc; - HRESULT hr; - - TRACE("(%p)->(%p,%p)\n", This, Callback, Context); - EnterCriticalSection(&ddraw_cs); - - TRACE("(%p) Enumerating WineD3D D3Device7 interface\n", This); - hr = IDirect3DImpl_GetCaps(This->wineD3D, &oldDesc, &ddesc); - if(hr != D3D_OK) - { - LeaveCriticalSection(&ddraw_cs); - return hr; - } - Callback(interface_name_tnl, device_name_tnl, &ddesc, Context); - - ddesc.deviceGUID = IID_IDirect3DHALDevice; - Callback(interface_name_hal, device_name_hal, &ddesc, Context); - - ddesc.deviceGUID = IID_IDirect3DRGBDevice; - Callback(interface_name_rgb, device_name_rgb, &ddesc, Context); - - TRACE("(%p) End of enumeration\n", This); - LeaveCriticalSection(&ddraw_cs); - return D3D_OK; -} - -/***************************************************************************** - * IDirect3D3::EnumDevices - * - * Enumerates all supported Direct3DDevice interfaces. This is the - * implementation for Direct3D 1 to Direc3D 3, Version 7 has its own. - * - * Version 1, 2 and 3 - * - * Params: - * Callback: Application-provided routine to call for each enumerated device - * Context: Pointer to pass to the callback - * - * Returns: - * D3D_OK on success, - * The result of IDirect3DImpl_GetCaps if it failed - * - *****************************************************************************/ -static HRESULT WINAPI -IDirect3DImpl_3_EnumDevices(IDirect3D3 *iface, - LPD3DENUMDEVICESCALLBACK Callback, - void *Context) -{ - IDirectDrawImpl *This = ddraw_from_d3d3(iface); - D3DDEVICEDESC dref, d1, d2; - D3DDEVICEDESC7 newDesc; - static CHAR wined3d_description[] = "Wine D3DDevice using WineD3D and OpenGL"; - HRESULT hr; - - /* Some games (Motoracer 2 demo) have the bad idea to modify the device name string. - Let's put the string in a sufficiently sized array in writable memory. */ - char device_name[50]; - strcpy(device_name,"Direct3D HEL"); - - TRACE("(%p)->(%p,%p)\n", This, Callback, Context); - EnterCriticalSection(&ddraw_cs); - - hr = IDirect3DImpl_GetCaps(This->wineD3D, &dref, &newDesc); - if(hr != D3D_OK) - { - LeaveCriticalSection(&ddraw_cs); - return hr; - } - - /* Do I have to enumerate the reference id? Note from old d3d7: - * "It seems that enumerating the reference IID on Direct3D 1 games - * (AvP / Motoracer2) breaks them". So do not enumerate this iid in V1 - * - * There's a registry key HKLM\Software\Microsoft\Direct3D\Drivers, EnumReference - * which enables / disables enumerating the reference rasterizer. It's a DWORD, - * 0 means disabled, 2 means enabled. The enablerefrast.reg and disablerefrast.reg - * files in the DirectX 7.0 sdk demo directory suggest this. - * - * Some games(GTA 2) seem to use the second enumerated device, so I have to enumerate - * at least 2 devices. So enumerate the reference device to have 2 devices. - * - * Other games(Rollcage) tell emulation and hal device apart by certain flags. - * Rollcage expects D3DPTEXTURECAPS_POW2 to be set(yeah, it is a limitation flag), - * and it refuses all devices that have the perspective flag set. This way it refuses - * the emulation device, and HAL devices never have POW2 unset in d3d7 on windows. - */ - - if(This->d3dversion != 1) - { - static CHAR reference_description[] = "RGB Direct3D emulation"; - - TRACE("(%p) Enumerating WineD3D D3DDevice interface\n", This); - d1 = dref; - d2 = dref; - /* The rgb device has the pow2 flag set in the hel caps, but not in the hal caps */ - d1.dpcLineCaps.dwTextureCaps &= ~(D3DPTEXTURECAPS_POW2 | D3DPTEXTURECAPS_NONPOW2CONDITIONAL | D3DPTEXTURECAPS_PERSPECTIVE); - d1.dpcTriCaps.dwTextureCaps &= ~(D3DPTEXTURECAPS_POW2 | D3DPTEXTURECAPS_NONPOW2CONDITIONAL | D3DPTEXTURECAPS_PERSPECTIVE); - hr = Callback( (LPIID) &IID_IDirect3DRGBDevice, reference_description, device_name, &d1, &d2, Context); - if(hr != D3DENUMRET_OK) - { - TRACE("Application cancelled the enumeration\n"); - LeaveCriticalSection(&ddraw_cs); - return D3D_OK; - } - } - - strcpy(device_name,"Direct3D HAL"); - - TRACE("(%p) Enumerating HAL Direct3D device\n", This); - d1 = dref; - d2 = dref; - /* The hal device does not have the pow2 flag set in hel, but in hal */ - d2.dpcLineCaps.dwTextureCaps &= ~(D3DPTEXTURECAPS_POW2 | D3DPTEXTURECAPS_NONPOW2CONDITIONAL | D3DPTEXTURECAPS_PERSPECTIVE); - d2.dpcTriCaps.dwTextureCaps &= ~(D3DPTEXTURECAPS_POW2 | D3DPTEXTURECAPS_NONPOW2CONDITIONAL | D3DPTEXTURECAPS_PERSPECTIVE); - hr = Callback( (LPIID) &IID_IDirect3DHALDevice, wined3d_description, device_name, &d1, &d2, Context); - if(hr != D3DENUMRET_OK) - { - TRACE("Application cancelled the enumeration\n"); - LeaveCriticalSection(&ddraw_cs); - return D3D_OK; - } - TRACE("(%p) End of enumeration\n", This); - - LeaveCriticalSection(&ddraw_cs); - return D3D_OK; -} - -static HRESULT WINAPI -Thunk_IDirect3DImpl_2_EnumDevices(IDirect3D2 *iface, - LPD3DENUMDEVICESCALLBACK Callback, - void *Context) -{ - IDirectDrawImpl *This = ddraw_from_d3d2(iface); - TRACE("(%p)->(%p,%p) thunking to IDirect3D3 interface.\n", This, Callback, Context); - return IDirect3D3_EnumDevices((IDirect3D3 *)&This->IDirect3D3_vtbl, Callback, Context); -} - -static HRESULT WINAPI -Thunk_IDirect3DImpl_1_EnumDevices(IDirect3D *iface, - LPD3DENUMDEVICESCALLBACK Callback, - void *Context) -{ - IDirectDrawImpl *This = ddraw_from_d3d1(iface); - TRACE("(%p)->(%p,%p) thunking to IDirect3D3 interface.\n", This, Callback, Context); - return IDirect3D3_EnumDevices((IDirect3D3 *)&This->IDirect3D3_vtbl, Callback, Context); -} - -/***************************************************************************** - * IDirect3D3::CreateLight - * - * Creates an IDirect3DLight interface. This interface is used in - * Direct3D3 or earlier for lighting. In Direct3D7 it has been replaced - * by the DIRECT3DLIGHT7 structure. Wine's Direct3DLight implementation - * uses the IDirect3DDevice7 interface with D3D7 lights. - * - * Version 1, 2 and 3 - * - * Params: - * Light: Address to store the new interface pointer - * UnkOuter: Basically for aggregation, but ddraw doesn't support it. - * Must be NULL - * - * Returns: - * D3D_OK on success - * DDERR_OUTOFMEMORY if memory allocation failed - * CLASS_E_NOAGGREGATION if UnkOuter != NULL - * - *****************************************************************************/ -static HRESULT WINAPI -IDirect3DImpl_3_CreateLight(IDirect3D3 *iface, - IDirect3DLight **Light, - IUnknown *UnkOuter ) -{ - IDirectDrawImpl *This = ddraw_from_d3d3(iface); - IDirect3DLightImpl *object; - - TRACE("(%p)->(%p,%p)\n", This, Light, UnkOuter); - - if(UnkOuter) - return CLASS_E_NOAGGREGATION; - - object = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(IDirect3DLightImpl)); - if (object == NULL) - return DDERR_OUTOFMEMORY; - - object->lpVtbl = &IDirect3DLight_Vtbl; - object->ref = 1; - object->ddraw = This; - object->next = NULL; - object->active_viewport = NULL; - - /* Update functions */ - object->activate = light_update; - object->desactivate = light_activate; - object->update = light_desactivate; - object->active_viewport = NULL; - - *Light = (IDirect3DLight *)object; - - TRACE("(%p) creating implementation at %p.\n", This, object); - - return D3D_OK; -} - -static HRESULT WINAPI -Thunk_IDirect3DImpl_2_CreateLight(IDirect3D2 *iface, - IDirect3DLight **Direct3DLight, - IUnknown *UnkOuter) -{ - IDirectDrawImpl *This = ddraw_from_d3d2(iface); - TRACE("(%p)->(%p,%p) thunking to IDirect3D3 interface.\n", This, Direct3DLight, UnkOuter); - return IDirect3D3_CreateLight((IDirect3D3 *)&This->IDirect3D3_vtbl, Direct3DLight, UnkOuter); -} - -static HRESULT WINAPI -Thunk_IDirect3DImpl_1_CreateLight(IDirect3D *iface, - IDirect3DLight **Direct3DLight, - IUnknown *UnkOuter) -{ - IDirectDrawImpl *This = ddraw_from_d3d1(iface); - TRACE("(%p)->(%p,%p) thunking to IDirect3D3 interface.\n", This, Direct3DLight, UnkOuter); - return IDirect3D3_CreateLight((IDirect3D3 *)&This->IDirect3D3_vtbl, Direct3DLight, UnkOuter); -} - -/***************************************************************************** - * IDirect3D3::CreateMaterial - * - * Creates an IDirect3DMaterial interface. This interface is used by Direct3D3 - * and older versions. The IDirect3DMaterial implementation wraps its - * functionality to IDirect3DDevice7::SetMaterial and friends. - * - * Version 1, 2 and 3 - * - * Params: - * Material: Address to store the new interface's pointer to - * UnkOuter: Basically for aggregation, but ddraw doesn't support it. - * Must be NULL - * - * Returns: - * D3D_OK on success - * DDERR_OUTOFMEMORY if memory allocation failed - * CLASS_E_NOAGGREGATION if UnkOuter != NULL - * - *****************************************************************************/ -static HRESULT WINAPI -IDirect3DImpl_3_CreateMaterial(IDirect3D3 *iface, - IDirect3DMaterial3 **Material, - IUnknown *UnkOuter ) -{ - IDirectDrawImpl *This = ddraw_from_d3d3(iface); - IDirect3DMaterialImpl *object; - - TRACE("(%p)->(%p,%p)\n", This, Material, UnkOuter); - - if(UnkOuter) - return CLASS_E_NOAGGREGATION; - - object = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(IDirect3DMaterialImpl)); - if (object == NULL) - return DDERR_OUTOFMEMORY; - - object->lpVtbl = &IDirect3DMaterial3_Vtbl; - object->IDirect3DMaterial2_vtbl = &IDirect3DMaterial2_Vtbl; - object->IDirect3DMaterial_vtbl = &IDirect3DMaterial_Vtbl; - object->ref = 1; - object->ddraw = This; - object->activate = material_activate; - - *Material = (IDirect3DMaterial3 *)object; - - TRACE("(%p) creating implementation at %p.\n", This, object); - - return D3D_OK; -} - -static HRESULT WINAPI -Thunk_IDirect3DImpl_2_CreateMaterial(IDirect3D2 *iface, - IDirect3DMaterial2 **Direct3DMaterial, - IUnknown* UnkOuter) -{ - IDirectDrawImpl *This = ddraw_from_d3d2(iface); - HRESULT ret; - IDirect3DMaterial3 *ret_val; - - TRACE("(%p)->(%p,%p) thunking to IDirect3D3 interface.\n", This, Direct3DMaterial, UnkOuter); - ret = IDirect3D3_CreateMaterial((IDirect3D3 *)&This->IDirect3D3_vtbl, &ret_val, UnkOuter); - - *Direct3DMaterial = ret_val ? - (IDirect3DMaterial2 *)&((IDirect3DMaterialImpl *)ret_val)->IDirect3DMaterial2_vtbl : NULL; - - TRACE(" returning interface %p.\n", *Direct3DMaterial); - - return ret; -} - -static HRESULT WINAPI -Thunk_IDirect3DImpl_1_CreateMaterial(IDirect3D *iface, - IDirect3DMaterial **Direct3DMaterial, - IUnknown* UnkOuter) -{ - IDirectDrawImpl *This = ddraw_from_d3d1(iface); - HRESULT ret; - LPDIRECT3DMATERIAL3 ret_val; - - TRACE("(%p)->(%p,%p) thunking to IDirect3D3 interface.\n", This, Direct3DMaterial, UnkOuter); - ret = IDirect3D3_CreateMaterial((IDirect3D3 *)&This->IDirect3D3_vtbl, &ret_val, UnkOuter); - - *Direct3DMaterial = ret_val ? - (IDirect3DMaterial *)&((IDirect3DMaterialImpl *)ret_val)->IDirect3DMaterial_vtbl : NULL; - - TRACE(" returning interface %p.\n", *Direct3DMaterial); - - return ret; -} - -/***************************************************************************** - * IDirect3D3::CreateViewport - * - * Creates an IDirect3DViewport interface. This interface is used - * by Direct3D and earlier versions for Viewport management. In Direct3D7 - * it has been replaced by a viewport structure and - * IDirect3DDevice7::*Viewport. Wine's IDirect3DViewport implementation - * uses the IDirect3DDevice7 methods for its functionality - * - * Params: - * Viewport: Address to store the new interface pointer - * UnkOuter: Basically for aggregation, but ddraw doesn't support it. - * Must be NULL - * - * Returns: - * D3D_OK on success - * DDERR_OUTOFMEMORY if memory allocation failed - * CLASS_E_NOAGGREGATION if UnkOuter != NULL - * - *****************************************************************************/ -static HRESULT WINAPI -IDirect3DImpl_3_CreateViewport(IDirect3D3 *iface, - IDirect3DViewport3 **Viewport, - IUnknown *UnkOuter ) -{ - IDirectDrawImpl *This = ddraw_from_d3d3(iface); - IDirect3DViewportImpl *object; - - if(UnkOuter) - return CLASS_E_NOAGGREGATION; - - object = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(IDirect3DViewportImpl)); - if (object == NULL) - return DDERR_OUTOFMEMORY; - - object->lpVtbl = &IDirect3DViewport3_Vtbl; - object->ref = 1; - object->ddraw = This; - object->activate = viewport_activate; - object->use_vp2 = 0xFF; - object->next = NULL; - object->lights = NULL; - object->num_lights = 0; - object->map_lights = 0; - - *Viewport = (IDirect3DViewport3 *)object; - - TRACE("(%p) creating implementation at %p.\n",This, object); - - return D3D_OK; -} - -static HRESULT WINAPI -Thunk_IDirect3DImpl_2_CreateViewport(IDirect3D2 *iface, - IDirect3DViewport2 **D3DViewport2, - IUnknown *UnkOuter) -{ - IDirectDrawImpl *This = ddraw_from_d3d2(iface); - TRACE("(%p)->(%p,%p) thunking to IDirect3D3 interface.\n", This, D3DViewport2, UnkOuter); - - return IDirect3D3_CreateViewport((IDirect3D3 *)&This->IDirect3D3_vtbl, - (IDirect3DViewport3 **) D3DViewport2 /* No need to cast here */, - UnkOuter); -} - -static HRESULT WINAPI -Thunk_IDirect3DImpl_1_CreateViewport(IDirect3D *iface, - IDirect3DViewport **D3DViewport, - IUnknown* UnkOuter) -{ - IDirectDrawImpl *This = ddraw_from_d3d1(iface); - TRACE("(%p)->(%p,%p) thunking to IDirect3D3 interface.\n", This, D3DViewport, UnkOuter); - - return IDirect3D3_CreateViewport((IDirect3D3 *)&This->IDirect3D3_vtbl, - (IDirect3DViewport3 **) D3DViewport /* No need to cast here */, - UnkOuter); -} - -/***************************************************************************** - * IDirect3D3::FindDevice - * - * This method finds a device with the requested properties and returns a - * device description - * - * Verion 1, 2 and 3 - * Params: - * D3DDFS: Describes the requested device characteristics - * D3DFDR: Returns the device description - * - * Returns: - * D3D_OK on success - * DDERR_INVALIDPARAMS if no device was found - * - *****************************************************************************/ -static HRESULT WINAPI -IDirect3DImpl_3_FindDevice(IDirect3D3 *iface, - D3DFINDDEVICESEARCH *D3DDFS, - D3DFINDDEVICERESULT *D3DFDR) -{ - IDirectDrawImpl *This = ddraw_from_d3d3(iface); - D3DDEVICEDESC desc; - D3DDEVICEDESC7 newDesc; - HRESULT hr; - - TRACE("(%p)->(%p,%p)\n", This, D3DDFS, D3DFDR); - - if (!D3DDFS || !D3DFDR) - return DDERR_INVALIDPARAMS; - - if (D3DDFS->dwSize != sizeof(D3DFINDDEVICESEARCH) || - D3DFDR->dwSize != sizeof(D3DFINDDEVICERESULT)) - return DDERR_INVALIDPARAMS; - - if ((D3DDFS->dwFlags & D3DFDS_COLORMODEL) && - (D3DDFS->dcmColorModel != D3DCOLOR_RGB)) - { - TRACE(" trying to request a non-RGB D3D color model. Not supported.\n"); - return DDERR_INVALIDPARAMS; /* No real idea what to return here :-) */ - } - if (D3DDFS->dwFlags & D3DFDS_GUID) - { - TRACE(" trying to match guid %s.\n", debugstr_guid(&(D3DDFS->guid))); - if ((IsEqualGUID(&IID_D3DDEVICE_WineD3D, &(D3DDFS->guid)) == 0) && - (IsEqualGUID(&IID_IDirect3DHALDevice, &(D3DDFS->guid)) == 0) && - (IsEqualGUID(&IID_IDirect3DRGBDevice, &(D3DDFS->guid)) == 0)) - { - TRACE(" no match for this GUID.\n"); - return DDERR_NOTFOUND; - } - } - - /* Get the caps */ - hr = IDirect3DImpl_GetCaps(This->wineD3D, &desc, &newDesc); - if(hr != D3D_OK) return hr; - - /* Now return our own GUID */ - D3DFDR->guid = IID_D3DDEVICE_WineD3D; - D3DFDR->ddHwDesc = desc; - D3DFDR->ddSwDesc = desc; - - TRACE(" returning Wine's WineD3D device with (undumped) capabilities\n"); - - return D3D_OK; -} - -static HRESULT WINAPI -Thunk_IDirect3DImpl_2_FindDevice(IDirect3D2 *iface, - D3DFINDDEVICESEARCH *D3DDFS, - D3DFINDDEVICERESULT *D3DFDR) -{ - IDirectDrawImpl *This = ddraw_from_d3d2(iface); - TRACE("(%p)->(%p,%p) thunking to IDirect3D3 interface.\n", iface, D3DDFS, D3DFDR); - return IDirect3D3_FindDevice((IDirect3D3 *)&This->IDirect3D3_vtbl, D3DDFS, D3DFDR); -} - -static HRESULT WINAPI -Thunk_IDirect3DImpl_1_FindDevice(IDirect3D *iface, - D3DFINDDEVICESEARCH *D3DDFS, - D3DFINDDEVICERESULT *D3DDevice) -{ - IDirectDrawImpl *This = ddraw_from_d3d1(iface); - TRACE("(%p)->(%p,%p) thunking to IDirect3D3 interface.\n", This, D3DDFS, D3DDevice); - return IDirect3D3_FindDevice((IDirect3D3 *)&This->IDirect3D3_vtbl, D3DDFS, D3DDevice); -} - -/***************************************************************************** - * IDirect3D7::CreateDevice - * - * Creates an IDirect3DDevice7 interface. - * - * Version 2, 3 and 7. IDirect3DDevice 1 interfaces are interfaces to - * DirectDraw surfaces and are created with - * IDirectDrawSurface::QueryInterface. This method uses CreateDevice to - * create the device object and QueryInterfaces for IDirect3DDevice - * - * Params: - * refiid: IID of the device to create - * Surface: Initial rendertarget - * Device: Address to return the interface pointer - * - * Returns: - * D3D_OK on success - * DDERR_OUTOFMEMORY if memory allocation failed - * DDERR_INVALIDPARAMS if a device exists already - * - *****************************************************************************/ -static HRESULT WINAPI -IDirect3DImpl_7_CreateDevice(IDirect3D7 *iface, - REFCLSID refiid, - IDirectDrawSurface7 *Surface, - IDirect3DDevice7 **Device) -{ - IDirectDrawImpl *This = ddraw_from_d3d7(iface); - IDirect3DDeviceImpl *object; - IParentImpl *IndexBufferParent; - HRESULT hr; - IDirectDrawSurfaceImpl *target = (IDirectDrawSurfaceImpl *)Surface; - TRACE("(%p)->(%s,%p,%p)\n", iface, debugstr_guid(refiid), Surface, Device); - - EnterCriticalSection(&ddraw_cs); - *Device = NULL; - - /* Fail device creation if non-opengl surfaces are used */ - if(This->ImplType != SURFACE_OPENGL) - { - ERR("The application wants to create a Direct3D device, but non-opengl surfaces are set in the registry. Please set the surface implementation to opengl or autodetection to allow 3D rendering\n"); - - /* We only hit this path if a default surface is set in the registry. Incorrect autodetection - * is caught in CreateSurface or QueryInterface - */ - LeaveCriticalSection(&ddraw_cs); - return DDERR_NO3D; - } - - /* So far we can only create one device per ddraw object */ - if(This->d3ddevice) - { - FIXME("(%p): Only one Direct3D device per DirectDraw object supported\n", This); - LeaveCriticalSection(&ddraw_cs); - return DDERR_INVALIDPARAMS; - } - - object = HeapAlloc(GetProcessHeap(), 0, sizeof(IDirect3DDeviceImpl)); - if(!object) - { - ERR("Out of memory when allocating a IDirect3DDevice implementation\n"); - LeaveCriticalSection(&ddraw_cs); - return DDERR_OUTOFMEMORY; - } - - if (This->cooperative_level & DDSCL_FPUPRESERVE) - object->lpVtbl = &IDirect3DDevice7_FPUPreserve_Vtbl; - else - object->lpVtbl = &IDirect3DDevice7_FPUSetup_Vtbl; - - object->IDirect3DDevice3_vtbl = &IDirect3DDevice3_Vtbl; - object->IDirect3DDevice2_vtbl = &IDirect3DDevice2_Vtbl; - object->IDirect3DDevice_vtbl = &IDirect3DDevice1_Vtbl; - object->ref = 1; - object->ddraw = This; - object->viewport_list = NULL; - object->current_viewport = NULL; - object->material = 0; - object->target = target; - - if (!ddraw_handle_table_init(&object->handle_table, 64)) - { - ERR("Failed to initialize handle table.\n"); - HeapFree(GetProcessHeap(), 0, object); - LeaveCriticalSection(&ddraw_cs); - return DDERR_OUTOFMEMORY; - } - - object->legacyTextureBlending = FALSE; - - /* This is for convenience */ - object->wineD3DDevice = This->wineD3DDevice; - - /* Create an index buffer, it's needed for indexed drawing */ - IndexBufferParent = HeapAlloc(GetProcessHeap(), 0, sizeof(IParentImpl)); - if(!IndexBufferParent) - { - ERR("Allocating memory for an index buffer parent failed\n"); - ddraw_handle_table_destroy(&object->handle_table); - HeapFree(GetProcessHeap(), 0, object); - LeaveCriticalSection(&ddraw_cs); - return DDERR_OUTOFMEMORY; - } - IndexBufferParent->lpVtbl = &IParent_Vtbl; - IndexBufferParent->ref = 1; - - /* Create an Index Buffer. WineD3D needs one for Drawing indexed primitives - * Create a (hopefully) long enough buffer, and copy the indices into it - * Ideally, a IWineD3DBuffer::SetData method could be created, which - * takes the pointer and avoids the memcpy - */ - hr = IWineD3DDevice_CreateIndexBuffer(This->wineD3DDevice, 0x40000 /* Length. Don't know how long it should be */, - WINED3DUSAGE_DYNAMIC /* Usage */, WINED3DPOOL_DEFAULT, &object->indexbuffer, (IUnknown *)IndexBufferParent, - &ddraw_null_wined3d_parent_ops); - - if(FAILED(hr)) - { - ERR("Failed to create an index buffer\n"); - ddraw_handle_table_destroy(&object->handle_table); - HeapFree(GetProcessHeap(), 0, object); - LeaveCriticalSection(&ddraw_cs); - return hr; - } - IndexBufferParent->child = (IUnknown *) object->indexbuffer; - - /* No need to set the indices, it's done when necessary */ - - /* AddRef the WineD3D Device */ - IWineD3DDevice_AddRef(This->wineD3DDevice); - - /* Don't forget to return the interface ;) */ - *Device = (IDirect3DDevice7 *)object; - - TRACE(" (%p) Created an IDirect3DDeviceImpl object at %p\n", This, object); - - /* This is for apps which create a non-flip, non-d3d primary surface - * and an offscreen D3DDEVICE surface, then render to the offscreen surface - * and do a Blt from the offscreen to the primary surface. - * - * Set the offscreen D3DDDEVICE surface(=target) as the back buffer, - * and the primary surface(=This->d3d_target) as the front buffer. - * - * This way the app will render to the D3DDEVICE surface and WineD3D - * will catch the Blt was Back Buffer -> Front buffer blt and perform - * a flip instead. This way we don't have to deal with a mixed GL / GDI - * environment. - * - * This should be checked against windowed apps. The only app tested with - * this is moto racer 2 during the loading screen. - */ - TRACE("Isrendertarget: %s, d3d_target=%p\n", target->surface_desc.ddsCaps.dwCaps & DDSCAPS_PRIMARYSURFACE ? "true" : "false", This->d3d_target); - if(!(target->surface_desc.ddsCaps.dwCaps & DDSCAPS_PRIMARYSURFACE) && - (This->d3d_target != target)) - { - TRACE("(%p) Using %p as front buffer, %p as back buffer\n", This, This->d3d_target, target); - hr = IWineD3DDevice_SetFrontBackBuffers(This->wineD3DDevice, - This->d3d_target->WineD3DSurface, - target->WineD3DSurface); - if(hr != D3D_OK) - ERR("(%p) Error %08x setting the front and back buffer\n", This, hr); - - /* Render to the back buffer */ - IWineD3DDevice_SetRenderTarget(This->wineD3DDevice, 0, - target->WineD3DSurface, - TRUE); - object->OffScreenTarget = TRUE; - } - else - { - object->OffScreenTarget = FALSE; - } - - /* AddRef the render target. Also AddRef the render target from ddraw, - * because if it is released before the app releases the D3D device, the D3D capabilities - * of WineD3D will be uninitialized, which has bad effects. - * - * In most cases, those surfaces are the surfaces are the same anyway, but this will simply - * add another ref which is released when the device is destroyed. - */ - IDirectDrawSurface7_AddRef(Surface); - IDirectDrawSurface7_AddRef((IDirectDrawSurface7 *)This->d3d_target); - - This->d3ddevice = object; - - IWineD3DDevice_SetRenderState(This->wineD3DDevice, - WINED3DRS_ZENABLE, - IDirect3DDeviceImpl_UpdateDepthStencil(object)); - LeaveCriticalSection(&ddraw_cs); - return D3D_OK; -} - -static HRESULT WINAPI -Thunk_IDirect3DImpl_3_CreateDevice(IDirect3D3 *iface, - REFCLSID refiid, - IDirectDrawSurface4 *Surface, - IDirect3DDevice3 **Device, - IUnknown *UnkOuter) -{ - IDirectDrawImpl *This = ddraw_from_d3d3(iface); - HRESULT hr; - TRACE("(%p)->(%s,%p,%p,%p): Thunking to IDirect3D7\n", This, debugstr_guid(refiid), Surface, Device, UnkOuter); - - if(UnkOuter != NULL) - return CLASS_E_NOAGGREGATION; - - hr = IDirect3D7_CreateDevice((IDirect3D7 *)&This->IDirect3D7_vtbl, refiid, - (IDirectDrawSurface7 *)Surface /* Same VTables */, (IDirect3DDevice7 **)Device); - - *Device = *Device ? (IDirect3DDevice3 *)&((IDirect3DDeviceImpl *)*Device)->IDirect3DDevice3_vtbl : NULL; - return hr; -} - -static HRESULT WINAPI -Thunk_IDirect3DImpl_2_CreateDevice(IDirect3D2 *iface, - REFCLSID refiid, - IDirectDrawSurface *Surface, - IDirect3DDevice2 **Device) -{ - IDirectDrawImpl *This = ddraw_from_d3d2(iface); - HRESULT hr; - TRACE("(%p)->(%s,%p,%p): Thunking to IDirect3D7\n", This, debugstr_guid(refiid), Surface, Device); - - hr = IDirect3D7_CreateDevice((IDirect3D7 *)&This->IDirect3D7_vtbl, refiid, - Surface ? (IDirectDrawSurface7 *)surface_from_surface3((IDirectDrawSurface3 *)Surface) : NULL, - (IDirect3DDevice7 **)Device); - - *Device = *Device ? (IDirect3DDevice2 *)&((IDirect3DDeviceImpl *)*Device)->IDirect3DDevice2_vtbl : NULL; - return hr; -} - -/***************************************************************************** - * IDirect3D7::CreateVertexBuffer - * - * Creates a new vertex buffer object and returns a IDirect3DVertexBuffer7 - * interface. - * - * Version 3 and 7 - * - * Params: - * Desc: Requested Vertex buffer properties - * VertexBuffer: Address to return the interface pointer at - * Flags: Some flags, must be 0 - * - * Returns - * D3D_OK on success - * DDERR_OUTOFMEMORY if memory allocation failed - * The return value of IWineD3DDevice::CreateVertexBuffer if this call fails - * DDERR_INVALIDPARAMS if Desc or VertexBuffer are NULL, or Flags != 0 - * - *****************************************************************************/ -static HRESULT WINAPI -IDirect3DImpl_7_CreateVertexBuffer(IDirect3D7 *iface, - D3DVERTEXBUFFERDESC *Desc, - IDirect3DVertexBuffer7 **VertexBuffer, - DWORD Flags) -{ - IDirectDrawImpl *This = ddraw_from_d3d7(iface); - IDirect3DVertexBufferImpl *object; - HRESULT hr; - DWORD usage; - TRACE("(%p)->(%p,%p,%08x)\n", This, Desc, VertexBuffer, Flags); - - TRACE("(%p) Vertex buffer description:\n", This); - TRACE("(%p) dwSize=%d\n", This, Desc->dwSize); - TRACE("(%p) dwCaps=%08x\n", This, Desc->dwCaps); - TRACE("(%p) FVF=%08x\n", This, Desc->dwFVF); - TRACE("(%p) dwNumVertices=%d\n", This, Desc->dwNumVertices); - - /* D3D7 SDK: "No Flags are currently defined for this method. This - * parameter must be 0" - * - * Never trust the documentation - this is wrong - if(Flags != 0) - { - ERR("(%p) Flags is %08lx, returning DDERR_INVALIDPARAMS\n", This, Flags); - return DDERR_INVALIDPARAMS; - } - */ - - /* Well, this sounds sane */ - if( (!VertexBuffer) || (!Desc) ) - return DDERR_INVALIDPARAMS; - - /* Now create the vertex buffer */ - object = HeapAlloc(GetProcessHeap(), 0, sizeof(IDirect3DVertexBufferImpl)); - if(!object) - { - ERR("(%p) Out of memory when allocating a IDirect3DVertexBufferImpl structure\n", This); - return DDERR_OUTOFMEMORY; - } - - object->ref = 1; - object->lpVtbl = &IDirect3DVertexBuffer7_Vtbl; - object->IDirect3DVertexBuffer_vtbl = &IDirect3DVertexBuffer1_Vtbl; - - object->Caps = Desc->dwCaps; - object->ddraw = This; - object->fvf = Desc->dwFVF; - - usage = Desc->dwCaps & D3DVBCAPS_WRITEONLY ? WINED3DUSAGE_WRITEONLY : 0; - usage |= WINED3DUSAGE_STATICDECL; - - EnterCriticalSection(&ddraw_cs); - hr = IWineD3DDevice_CreateVertexBuffer(This->wineD3DDevice, - get_flexible_vertex_size(Desc->dwFVF) * Desc->dwNumVertices, - usage, Desc->dwCaps & D3DVBCAPS_SYSTEMMEMORY ? WINED3DPOOL_SYSTEMMEM : WINED3DPOOL_DEFAULT, - &object->wineD3DVertexBuffer, (IUnknown *)object, &ddraw_null_wined3d_parent_ops); - if(hr != D3D_OK) - { - ERR("(%p) IWineD3DDevice::CreateVertexBuffer failed with hr=%08x\n", This, hr); - HeapFree(GetProcessHeap(), 0, object); - LeaveCriticalSection(&ddraw_cs); - if (hr == WINED3DERR_INVALIDCALL) - return DDERR_INVALIDPARAMS; - else - return hr; - } - - object->wineD3DVertexDeclaration = ddraw_find_decl(This, Desc->dwFVF); - if (!object->wineD3DVertexDeclaration) - { - ERR("Cannot find the vertex declaration for fvf %08x\n", Desc->dwFVF); - IWineD3DBuffer_Release(object->wineD3DVertexBuffer); - HeapFree(GetProcessHeap(), 0, object); - LeaveCriticalSection(&ddraw_cs); - return DDERR_INVALIDPARAMS; - } - IWineD3DVertexDeclaration_AddRef(object->wineD3DVertexDeclaration); - - /* Return the interface */ - *VertexBuffer = (IDirect3DVertexBuffer7 *)object; - - TRACE("(%p) Created new vertex buffer implementation at %p, returning interface at %p\n", This, object, *VertexBuffer); - LeaveCriticalSection(&ddraw_cs); - return D3D_OK; -} - -static HRESULT WINAPI -Thunk_IDirect3DImpl_3_CreateVertexBuffer(IDirect3D3 *iface, - D3DVERTEXBUFFERDESC *Desc, - IDirect3DVertexBuffer **VertexBuffer, - DWORD Flags, - IUnknown *UnkOuter) -{ - IDirectDrawImpl *This = ddraw_from_d3d3(iface); - HRESULT hr; - TRACE("(%p)->(%p,%p,%08x,%p): Relaying to IDirect3D7\n", This, Desc, VertexBuffer, Flags, UnkOuter); - - if(UnkOuter != NULL) return CLASS_E_NOAGGREGATION; - - hr = IDirect3D7_CreateVertexBuffer((IDirect3D7 *)&This->IDirect3D7_vtbl, - Desc, (IDirect3DVertexBuffer7 **)VertexBuffer, Flags); - - *VertexBuffer = *VertexBuffer ? - (IDirect3DVertexBuffer *)&((IDirect3DVertexBufferImpl *)*VertexBuffer)->IDirect3DVertexBuffer_vtbl : NULL; - - return hr; -} - - -/***************************************************************************** - * IDirect3D7::EnumZBufferFormats - * - * Enumerates all supported Z buffer pixel formats - * - * Version 3 and 7 - * - * Params: - * refiidDevice: - * Callback: Callback to call for each pixel format - * Context: Pointer to pass back to the callback - * - * Returns: - * D3D_OK on success - * DDERR_INVALIDPARAMS if Callback is NULL - * For details, see IWineD3DDevice::EnumZBufferFormats - * - *****************************************************************************/ -static HRESULT WINAPI -IDirect3DImpl_7_EnumZBufferFormats(IDirect3D7 *iface, - REFCLSID refiidDevice, - LPD3DENUMPIXELFORMATSCALLBACK Callback, - void *Context) -{ - IDirectDrawImpl *This = ddraw_from_d3d7(iface); - HRESULT hr; - unsigned int i; - WINED3DDISPLAYMODE d3ddm; - WINED3DDEVTYPE type; - - /* Order matters. Specifically, BattleZone II (full version) expects the - * 16-bit depth formats to be listed before the 24 and 32 ones. */ - WINED3DFORMAT FormatList[] = { - WINED3DFMT_S1_UINT_D15_UNORM, - WINED3DFMT_D16_UNORM, - WINED3DFMT_X8D24_UNORM, - WINED3DFMT_S4X4_UINT_D24_UNORM, - WINED3DFMT_D24_UNORM_S8_UINT, - WINED3DFMT_D32_UNORM, - }; - - TRACE("(%p)->(%s,%p,%p): Relay\n", iface, debugstr_guid(refiidDevice), Callback, Context); - - if(!Callback) - return DDERR_INVALIDPARAMS; - - if(IsEqualGUID(refiidDevice, &IID_IDirect3DHALDevice) || - IsEqualGUID(refiidDevice, &IID_IDirect3DTnLHalDevice) || - IsEqualGUID(refiidDevice, &IID_D3DDEVICE_WineD3D)) - { - TRACE("Asked for HAL device\n"); - type = WINED3DDEVTYPE_HAL; - } - else if(IsEqualGUID(refiidDevice, &IID_IDirect3DRGBDevice) || - IsEqualGUID(refiidDevice, &IID_IDirect3DMMXDevice)) - { - TRACE("Asked for SW device\n"); - type = WINED3DDEVTYPE_SW; - } - else if(IsEqualGUID(refiidDevice, &IID_IDirect3DRefDevice)) - { - TRACE("Asked for REF device\n"); - type = WINED3DDEVTYPE_REF; - } - else if(IsEqualGUID(refiidDevice, &IID_IDirect3DNullDevice)) - { - TRACE("Asked for NULLREF device\n"); - type = WINED3DDEVTYPE_NULLREF; - } - else - { - FIXME("Unexpected device GUID %s\n", debugstr_guid(refiidDevice)); - type = WINED3DDEVTYPE_HAL; - } - - EnterCriticalSection(&ddraw_cs); - /* We need an adapter format from somewhere to please wined3d and WGL. Use the current display mode. - * So far all cards offer the same depth stencil format for all modes, but if some do not and apps - * do not like that we'll have to find some workaround, like iterating over all imaginable formats - * and collecting all the depth stencil formats we can get - */ - hr = IWineD3DDevice_GetDisplayMode(This->wineD3DDevice, - 0 /* swapchain 0 */, - &d3ddm); - - for(i = 0; i < (sizeof(FormatList) / sizeof(FormatList[0])); i++) - { - hr = IWineD3D_CheckDeviceFormat(This->wineD3D, - WINED3DADAPTER_DEFAULT /* Adapter */, - type /* DeviceType */, - d3ddm.Format /* AdapterFormat */, - WINED3DUSAGE_DEPTHSTENCIL /* Usage */, - WINED3DRTYPE_SURFACE, - FormatList[i], - SURFACE_OPENGL); - if(hr == D3D_OK) - { - DDPIXELFORMAT pformat; - - memset(&pformat, 0, sizeof(pformat)); - pformat.dwSize = sizeof(pformat); - PixelFormat_WineD3DtoDD(&pformat, FormatList[i]); - - TRACE("Enumerating WineD3DFormat %d\n", FormatList[i]); - hr = Callback(&pformat, Context); - if(hr != DDENUMRET_OK) - { - TRACE("Format enumeration cancelled by application\n"); - LeaveCriticalSection(&ddraw_cs); - return D3D_OK; - } - } - } - TRACE("End of enumeration\n"); - LeaveCriticalSection(&ddraw_cs); - return D3D_OK; -} - -static HRESULT WINAPI -Thunk_IDirect3DImpl_3_EnumZBufferFormats(IDirect3D3 *iface, - REFCLSID riidDevice, - LPD3DENUMPIXELFORMATSCALLBACK Callback, - void *Context) -{ - IDirectDrawImpl *This = ddraw_from_d3d3(iface); - TRACE("(%p)->(%s,%p,%p) thunking to IDirect3D7 interface.\n", This, debugstr_guid(riidDevice), Callback, Context); - return IDirect3D7_EnumZBufferFormats((IDirect3D7 *)&This->IDirect3D7_vtbl, riidDevice, Callback, Context); -} - -/***************************************************************************** - * IDirect3D7::EvictManagedTextures - * - * Removes all managed textures (=surfaces with DDSCAPS2_TEXTUREMANAGE or - * DDSCAPS2_D3DTEXTUREMANAGE caps) to be removed from video memory. - * - * Version 3 and 7 - * - * Returns: - * D3D_OK, because it's a stub - * - *****************************************************************************/ -static HRESULT WINAPI -IDirect3DImpl_7_EvictManagedTextures(IDirect3D7 *iface) -{ - IDirectDrawImpl *This = ddraw_from_d3d7(iface); - FIXME("(%p): Stub!\n", This); - - /* Implementation idea: - * Add an IWineD3DSurface method which sets the opengl texture - * priority low or even removes the opengl texture. - */ - - return D3D_OK; -} - -static HRESULT WINAPI -Thunk_IDirect3DImpl_3_EvictManagedTextures(IDirect3D3 *iface) -{ - IDirectDrawImpl *This = ddraw_from_d3d3(iface); - TRACE("(%p)->() thunking to IDirect3D7 interface.\n", This); - return IDirect3D7_EvictManagedTextures((IDirect3D7 *)&This->IDirect3D7_vtbl); -} - -/***************************************************************************** - * IDirect3DImpl_GetCaps - * - * This function retrieves the device caps from wined3d - * and converts it into a D3D7 and D3D - D3D3 structure - * This is a helper function called from various places in ddraw - * - * Params: - * WineD3D: The interface to get the caps from - * Desc123: Old D3D <3 structure to fill (needed) - * Desc7: D3D7 device desc structure to fill (needed) - * - * Returns - * D3D_OK on success, or the return value of IWineD3D::GetCaps - * - *****************************************************************************/ -HRESULT -IDirect3DImpl_GetCaps(IWineD3D *WineD3D, - D3DDEVICEDESC *Desc123, - D3DDEVICEDESC7 *Desc7) -{ - WINED3DCAPS WCaps; - HRESULT hr; - - /* Some variables to assign to the pointers in WCaps */ - TRACE("()->(%p,%p,%p\n", WineD3D, Desc123, Desc7); - - memset(&WCaps, 0, sizeof(WCaps)); - EnterCriticalSection(&ddraw_cs); - hr = IWineD3D_GetDeviceCaps(WineD3D, 0, WINED3DDEVTYPE_HAL, &WCaps); - LeaveCriticalSection(&ddraw_cs); - if(hr != D3D_OK) - { - return hr; - } - - /* Copy the results into the d3d7 and d3d3 structures */ - Desc7->dwDevCaps = WCaps.DevCaps; - Desc7->dpcLineCaps.dwMiscCaps = WCaps.PrimitiveMiscCaps; - Desc7->dpcLineCaps.dwRasterCaps = WCaps.RasterCaps; - Desc7->dpcLineCaps.dwZCmpCaps = WCaps.ZCmpCaps; - Desc7->dpcLineCaps.dwSrcBlendCaps = WCaps.SrcBlendCaps; - Desc7->dpcLineCaps.dwDestBlendCaps = WCaps.DestBlendCaps; - Desc7->dpcLineCaps.dwAlphaCmpCaps = WCaps.AlphaCmpCaps; - Desc7->dpcLineCaps.dwShadeCaps = WCaps.ShadeCaps; - Desc7->dpcLineCaps.dwTextureCaps = WCaps.TextureCaps; - Desc7->dpcLineCaps.dwTextureFilterCaps = WCaps.TextureFilterCaps; - Desc7->dpcLineCaps.dwTextureAddressCaps = WCaps.TextureAddressCaps; - - Desc7->dwMaxTextureWidth = WCaps.MaxTextureWidth; - Desc7->dwMaxTextureHeight = WCaps.MaxTextureHeight; - - Desc7->dwMaxTextureRepeat = WCaps.MaxTextureRepeat; - Desc7->dwMaxTextureAspectRatio = WCaps.MaxTextureAspectRatio; - Desc7->dwMaxAnisotropy = WCaps.MaxAnisotropy; - Desc7->dvMaxVertexW = WCaps.MaxVertexW; - - Desc7->dvGuardBandLeft = WCaps.GuardBandLeft; - Desc7->dvGuardBandTop = WCaps.GuardBandTop; - Desc7->dvGuardBandRight = WCaps.GuardBandRight; - Desc7->dvGuardBandBottom = WCaps.GuardBandBottom; - - Desc7->dvExtentsAdjust = WCaps.ExtentsAdjust; - Desc7->dwStencilCaps = WCaps.StencilCaps; - - Desc7->dwFVFCaps = WCaps.FVFCaps; - Desc7->dwTextureOpCaps = WCaps.TextureOpCaps; - - Desc7->dwVertexProcessingCaps = WCaps.VertexProcessingCaps; - Desc7->dwMaxActiveLights = WCaps.MaxActiveLights; - - /* Remove all non-d3d7 caps */ - Desc7->dwDevCaps &= ( - D3DDEVCAPS_FLOATTLVERTEX | D3DDEVCAPS_SORTINCREASINGZ | D3DDEVCAPS_SORTDECREASINGZ | - D3DDEVCAPS_SORTEXACT | D3DDEVCAPS_EXECUTESYSTEMMEMORY | D3DDEVCAPS_EXECUTEVIDEOMEMORY | - D3DDEVCAPS_TLVERTEXSYSTEMMEMORY | D3DDEVCAPS_TLVERTEXVIDEOMEMORY | D3DDEVCAPS_TEXTURESYSTEMMEMORY | - D3DDEVCAPS_TEXTUREVIDEOMEMORY | D3DDEVCAPS_DRAWPRIMTLVERTEX | D3DDEVCAPS_CANRENDERAFTERFLIP | - D3DDEVCAPS_TEXTURENONLOCALVIDMEM | D3DDEVCAPS_DRAWPRIMITIVES2 | D3DDEVCAPS_SEPARATETEXTUREMEMORIES | - D3DDEVCAPS_DRAWPRIMITIVES2EX | D3DDEVCAPS_HWTRANSFORMANDLIGHT | D3DDEVCAPS_CANBLTSYSTONONLOCAL | - D3DDEVCAPS_HWRASTERIZATION); - - Desc7->dwStencilCaps &= ( - D3DSTENCILCAPS_KEEP | D3DSTENCILCAPS_ZERO | D3DSTENCILCAPS_REPLACE | - D3DSTENCILCAPS_INCRSAT | D3DSTENCILCAPS_DECRSAT | D3DSTENCILCAPS_INVERT | - D3DSTENCILCAPS_INCR | D3DSTENCILCAPS_DECR); - - /* FVF caps ?*/ - - Desc7->dwTextureOpCaps &= ( - D3DTEXOPCAPS_DISABLE | D3DTEXOPCAPS_SELECTARG1 | D3DTEXOPCAPS_SELECTARG2 | - D3DTEXOPCAPS_MODULATE | D3DTEXOPCAPS_MODULATE2X | D3DTEXOPCAPS_MODULATE4X | - D3DTEXOPCAPS_ADD | D3DTEXOPCAPS_ADDSIGNED | D3DTEXOPCAPS_ADDSIGNED2X | - D3DTEXOPCAPS_SUBTRACT | D3DTEXOPCAPS_ADDSMOOTH | D3DTEXOPCAPS_BLENDTEXTUREALPHA | - D3DTEXOPCAPS_BLENDFACTORALPHA | D3DTEXOPCAPS_BLENDTEXTUREALPHAPM | D3DTEXOPCAPS_BLENDCURRENTALPHA | - D3DTEXOPCAPS_PREMODULATE | D3DTEXOPCAPS_MODULATEALPHA_ADDCOLOR | D3DTEXOPCAPS_MODULATECOLOR_ADDALPHA | - D3DTEXOPCAPS_MODULATEINVALPHA_ADDCOLOR | D3DTEXOPCAPS_MODULATEINVCOLOR_ADDALPHA | D3DTEXOPCAPS_BUMPENVMAP | - D3DTEXOPCAPS_BUMPENVMAPLUMINANCE | D3DTEXOPCAPS_DOTPRODUCT3); - - Desc7->dwVertexProcessingCaps &= ( - D3DVTXPCAPS_TEXGEN | D3DVTXPCAPS_MATERIALSOURCE7 | D3DVTXPCAPS_VERTEXFOG | - D3DVTXPCAPS_DIRECTIONALLIGHTS | D3DVTXPCAPS_POSITIONALLIGHTS | D3DVTXPCAPS_LOCALVIEWER); - - Desc7->dpcLineCaps.dwMiscCaps &= ( - D3DPMISCCAPS_MASKPLANES | D3DPMISCCAPS_MASKZ | D3DPMISCCAPS_LINEPATTERNREP | - D3DPMISCCAPS_CONFORMANT | D3DPMISCCAPS_CULLNONE | D3DPMISCCAPS_CULLCW | - D3DPMISCCAPS_CULLCCW); - - Desc7->dpcLineCaps.dwRasterCaps &= ( - D3DPRASTERCAPS_DITHER | D3DPRASTERCAPS_ROP2 | D3DPRASTERCAPS_XOR | - D3DPRASTERCAPS_PAT | D3DPRASTERCAPS_ZTEST | D3DPRASTERCAPS_SUBPIXEL | - D3DPRASTERCAPS_SUBPIXELX | D3DPRASTERCAPS_FOGVERTEX | D3DPRASTERCAPS_FOGTABLE | - D3DPRASTERCAPS_STIPPLE | D3DPRASTERCAPS_ANTIALIASSORTDEPENDENT | D3DPRASTERCAPS_ANTIALIASSORTINDEPENDENT | - D3DPRASTERCAPS_ANTIALIASEDGES | D3DPRASTERCAPS_MIPMAPLODBIAS | D3DPRASTERCAPS_ZBIAS | - D3DPRASTERCAPS_ZBUFFERLESSHSR | D3DPRASTERCAPS_FOGRANGE | D3DPRASTERCAPS_ANISOTROPY | - D3DPRASTERCAPS_WBUFFER | D3DPRASTERCAPS_TRANSLUCENTSORTINDEPENDENT | D3DPRASTERCAPS_WFOG | - D3DPRASTERCAPS_ZFOG); - - Desc7->dpcLineCaps.dwZCmpCaps &= ( - D3DPCMPCAPS_NEVER | D3DPCMPCAPS_LESS | D3DPCMPCAPS_EQUAL | - D3DPCMPCAPS_LESSEQUAL | D3DPCMPCAPS_GREATER | D3DPCMPCAPS_NOTEQUAL | - D3DPCMPCAPS_GREATEREQUAL | D3DPCMPCAPS_ALWAYS); - - Desc7->dpcLineCaps.dwSrcBlendCaps &= ( - D3DPBLENDCAPS_ZERO | D3DPBLENDCAPS_ONE | D3DPBLENDCAPS_SRCCOLOR | - D3DPBLENDCAPS_INVSRCCOLOR | D3DPBLENDCAPS_SRCALPHA | D3DPBLENDCAPS_INVSRCALPHA | - D3DPBLENDCAPS_DESTALPHA | D3DPBLENDCAPS_INVDESTALPHA | D3DPBLENDCAPS_DESTCOLOR | - D3DPBLENDCAPS_INVDESTCOLOR | D3DPBLENDCAPS_SRCALPHASAT | D3DPBLENDCAPS_BOTHSRCALPHA | - D3DPBLENDCAPS_BOTHINVSRCALPHA); - - Desc7->dpcLineCaps.dwDestBlendCaps &= ( - D3DPBLENDCAPS_ZERO | D3DPBLENDCAPS_ONE | D3DPBLENDCAPS_SRCCOLOR | - D3DPBLENDCAPS_INVSRCCOLOR | D3DPBLENDCAPS_SRCALPHA | D3DPBLENDCAPS_INVSRCALPHA | - D3DPBLENDCAPS_DESTALPHA | D3DPBLENDCAPS_INVDESTALPHA | D3DPBLENDCAPS_DESTCOLOR | - D3DPBLENDCAPS_INVDESTCOLOR | D3DPBLENDCAPS_SRCALPHASAT | D3DPBLENDCAPS_BOTHSRCALPHA | - D3DPBLENDCAPS_BOTHINVSRCALPHA); - - Desc7->dpcLineCaps.dwAlphaCmpCaps &= ( - D3DPCMPCAPS_NEVER | D3DPCMPCAPS_LESS | D3DPCMPCAPS_EQUAL | - D3DPCMPCAPS_LESSEQUAL | D3DPCMPCAPS_GREATER | D3DPCMPCAPS_NOTEQUAL | - D3DPCMPCAPS_GREATEREQUAL | D3DPCMPCAPS_ALWAYS); - - Desc7->dpcLineCaps.dwShadeCaps &= ( - D3DPSHADECAPS_COLORFLATMONO | D3DPSHADECAPS_COLORFLATRGB | D3DPSHADECAPS_COLORGOURAUDMONO | - D3DPSHADECAPS_COLORGOURAUDRGB | D3DPSHADECAPS_COLORPHONGMONO | D3DPSHADECAPS_COLORPHONGRGB | - D3DPSHADECAPS_SPECULARFLATMONO | D3DPSHADECAPS_SPECULARFLATRGB | D3DPSHADECAPS_SPECULARGOURAUDMONO | - D3DPSHADECAPS_SPECULARGOURAUDRGB | D3DPSHADECAPS_SPECULARPHONGMONO | D3DPSHADECAPS_SPECULARPHONGRGB | - D3DPSHADECAPS_ALPHAFLATBLEND | D3DPSHADECAPS_ALPHAFLATSTIPPLED | D3DPSHADECAPS_ALPHAGOURAUDBLEND | - D3DPSHADECAPS_ALPHAGOURAUDSTIPPLED | D3DPSHADECAPS_ALPHAPHONGBLEND | D3DPSHADECAPS_ALPHAPHONGSTIPPLED | - D3DPSHADECAPS_FOGFLAT | D3DPSHADECAPS_FOGGOURAUD | D3DPSHADECAPS_FOGPHONG); - - Desc7->dpcLineCaps.dwTextureCaps &= ( - D3DPTEXTURECAPS_PERSPECTIVE | D3DPTEXTURECAPS_POW2 | D3DPTEXTURECAPS_ALPHA | - D3DPTEXTURECAPS_TRANSPARENCY | D3DPTEXTURECAPS_BORDER | D3DPTEXTURECAPS_SQUAREONLY | - D3DPTEXTURECAPS_TEXREPEATNOTSCALEDBYSIZE | D3DPTEXTURECAPS_ALPHAPALETTE| D3DPTEXTURECAPS_NONPOW2CONDITIONAL | - D3DPTEXTURECAPS_PROJECTED | D3DPTEXTURECAPS_CUBEMAP | D3DPTEXTURECAPS_COLORKEYBLEND); - - Desc7->dpcLineCaps.dwTextureFilterCaps &= ( - D3DPTFILTERCAPS_NEAREST | D3DPTFILTERCAPS_LINEAR | D3DPTFILTERCAPS_MIPNEAREST | - D3DPTFILTERCAPS_MIPLINEAR | D3DPTFILTERCAPS_LINEARMIPNEAREST | D3DPTFILTERCAPS_LINEARMIPLINEAR | - D3DPTFILTERCAPS_MINFPOINT | D3DPTFILTERCAPS_MINFLINEAR | D3DPTFILTERCAPS_MINFANISOTROPIC | - D3DPTFILTERCAPS_MIPFPOINT | D3DPTFILTERCAPS_MIPFLINEAR | D3DPTFILTERCAPS_MAGFPOINT | - D3DPTFILTERCAPS_MAGFLINEAR | D3DPTFILTERCAPS_MAGFANISOTROPIC | D3DPTFILTERCAPS_MAGFAFLATCUBIC | - D3DPTFILTERCAPS_MAGFGAUSSIANCUBIC); - - Desc7->dpcLineCaps.dwTextureBlendCaps &= ( - D3DPTBLENDCAPS_DECAL | D3DPTBLENDCAPS_MODULATE | D3DPTBLENDCAPS_DECALALPHA | - D3DPTBLENDCAPS_MODULATEALPHA | D3DPTBLENDCAPS_DECALMASK | D3DPTBLENDCAPS_MODULATEMASK | - D3DPTBLENDCAPS_COPY | D3DPTBLENDCAPS_ADD); - - Desc7->dpcLineCaps.dwTextureAddressCaps &= ( - D3DPTADDRESSCAPS_WRAP | D3DPTADDRESSCAPS_MIRROR | D3DPTADDRESSCAPS_CLAMP | - D3DPTADDRESSCAPS_BORDER | D3DPTADDRESSCAPS_INDEPENDENTUV); - - if(!(Desc7->dpcLineCaps.dwTextureCaps & D3DPTEXTURECAPS_POW2)) { - /* DirectX7 always has the np2 flag set, no matter what the card supports. Some old games(rollcage) - * check the caps incorrectly. If wined3d supports nonpow2 textures it also has np2 conditional support - */ - Desc7->dpcLineCaps.dwTextureCaps |= D3DPTEXTURECAPS_POW2 | D3DPTEXTURECAPS_NONPOW2CONDITIONAL; - } - /* Fill the missing members, and do some fixup */ - Desc7->dpcLineCaps.dwSize = sizeof(Desc7->dpcLineCaps); - Desc7->dpcLineCaps.dwTextureBlendCaps = D3DPTBLENDCAPS_ADD | D3DPTBLENDCAPS_MODULATEMASK | - D3DPTBLENDCAPS_COPY | D3DPTBLENDCAPS_DECAL | - D3DPTBLENDCAPS_DECALALPHA | D3DPTBLENDCAPS_DECALMASK | - D3DPTBLENDCAPS_MODULATE | D3DPTBLENDCAPS_MODULATEALPHA; - Desc7->dpcLineCaps.dwStippleWidth = 32; - Desc7->dpcLineCaps.dwStippleHeight = 32; - /* Use the same for the TriCaps */ - Desc7->dpcTriCaps = Desc7->dpcLineCaps; - - Desc7->dwDeviceRenderBitDepth = DDBD_16 | DDBD_24 | DDBD_32; - Desc7->dwDeviceZBufferBitDepth = DDBD_16 | DDBD_24; - Desc7->dwMinTextureWidth = 1; - Desc7->dwMinTextureHeight = 1; - - /* Convert DWORDs safely to WORDs */ - if(WCaps.MaxTextureBlendStages > 65535) Desc7->wMaxTextureBlendStages = 65535; - else Desc7->wMaxTextureBlendStages = (WORD) WCaps.MaxTextureBlendStages; - if(WCaps.MaxSimultaneousTextures > 65535) Desc7->wMaxSimultaneousTextures = 65535; - else Desc7->wMaxSimultaneousTextures = (WORD) WCaps.MaxSimultaneousTextures; - - if(WCaps.MaxUserClipPlanes > 65535) Desc7->wMaxUserClipPlanes = 65535; - else Desc7->wMaxUserClipPlanes = (WORD) WCaps.MaxUserClipPlanes; - if(WCaps.MaxVertexBlendMatrices > 65535) Desc7->wMaxVertexBlendMatrices = 65535; - else Desc7->wMaxVertexBlendMatrices = (WORD) WCaps.MaxVertexBlendMatrices; - - Desc7->deviceGUID = IID_IDirect3DTnLHalDevice; - - Desc7->dwReserved1 = 0; - Desc7->dwReserved2 = 0; - Desc7->dwReserved3 = 0; - Desc7->dwReserved4 = 0; - - /* Fill the old structure */ - memset(Desc123, 0x0, sizeof(D3DDEVICEDESC)); - Desc123->dwSize = sizeof(D3DDEVICEDESC); - Desc123->dwFlags = D3DDD_COLORMODEL | - D3DDD_DEVCAPS | - D3DDD_TRANSFORMCAPS | - D3DDD_BCLIPPING | - D3DDD_LIGHTINGCAPS | - D3DDD_LINECAPS | - D3DDD_TRICAPS | - D3DDD_DEVICERENDERBITDEPTH | - D3DDD_DEVICEZBUFFERBITDEPTH | - D3DDD_MAXBUFFERSIZE | - D3DDD_MAXVERTEXCOUNT; - Desc123->dcmColorModel = D3DCOLOR_RGB; - Desc123->dwDevCaps = Desc7->dwDevCaps; - Desc123->dtcTransformCaps.dwSize = sizeof(D3DTRANSFORMCAPS); - Desc123->dtcTransformCaps.dwCaps = D3DTRANSFORMCAPS_CLIP; - Desc123->bClipping = TRUE; - Desc123->dlcLightingCaps.dwSize = sizeof(D3DLIGHTINGCAPS); - Desc123->dlcLightingCaps.dwCaps = D3DLIGHTCAPS_DIRECTIONAL | D3DLIGHTCAPS_PARALLELPOINT | D3DLIGHTCAPS_POINT | D3DLIGHTCAPS_SPOT; - Desc123->dlcLightingCaps.dwLightingModel = D3DLIGHTINGMODEL_RGB; - Desc123->dlcLightingCaps.dwNumLights = Desc7->dwMaxActiveLights; - - Desc123->dpcLineCaps.dwSize = sizeof(D3DPRIMCAPS); - Desc123->dpcLineCaps.dwMiscCaps = Desc7->dpcLineCaps.dwMiscCaps; - Desc123->dpcLineCaps.dwRasterCaps = Desc7->dpcLineCaps.dwRasterCaps; - Desc123->dpcLineCaps.dwZCmpCaps = Desc7->dpcLineCaps.dwZCmpCaps; - Desc123->dpcLineCaps.dwSrcBlendCaps = Desc7->dpcLineCaps.dwSrcBlendCaps; - Desc123->dpcLineCaps.dwDestBlendCaps = Desc7->dpcLineCaps.dwDestBlendCaps; - Desc123->dpcLineCaps.dwShadeCaps = Desc7->dpcLineCaps.dwShadeCaps; - Desc123->dpcLineCaps.dwTextureCaps = Desc7->dpcLineCaps.dwTextureCaps; - Desc123->dpcLineCaps.dwTextureFilterCaps = Desc7->dpcLineCaps.dwTextureFilterCaps; - Desc123->dpcLineCaps.dwTextureBlendCaps = Desc7->dpcLineCaps.dwTextureBlendCaps; - Desc123->dpcLineCaps.dwTextureAddressCaps = Desc7->dpcLineCaps.dwTextureAddressCaps; - Desc123->dpcLineCaps.dwStippleWidth = Desc7->dpcLineCaps.dwStippleWidth; - Desc123->dpcLineCaps.dwAlphaCmpCaps = Desc7->dpcLineCaps.dwAlphaCmpCaps; - - Desc123->dpcTriCaps.dwSize = sizeof(D3DPRIMCAPS); - Desc123->dpcTriCaps.dwMiscCaps = Desc7->dpcTriCaps.dwMiscCaps; - Desc123->dpcTriCaps.dwRasterCaps = Desc7->dpcTriCaps.dwRasterCaps; - Desc123->dpcTriCaps.dwZCmpCaps = Desc7->dpcTriCaps.dwZCmpCaps; - Desc123->dpcTriCaps.dwSrcBlendCaps = Desc7->dpcTriCaps.dwSrcBlendCaps; - Desc123->dpcTriCaps.dwDestBlendCaps = Desc7->dpcTriCaps.dwDestBlendCaps; - Desc123->dpcTriCaps.dwShadeCaps = Desc7->dpcTriCaps.dwShadeCaps; - Desc123->dpcTriCaps.dwTextureCaps = Desc7->dpcTriCaps.dwTextureCaps; - Desc123->dpcTriCaps.dwTextureFilterCaps = Desc7->dpcTriCaps.dwTextureFilterCaps; - Desc123->dpcTriCaps.dwTextureBlendCaps = Desc7->dpcTriCaps.dwTextureBlendCaps; - Desc123->dpcTriCaps.dwTextureAddressCaps = Desc7->dpcTriCaps.dwTextureAddressCaps; - Desc123->dpcTriCaps.dwStippleWidth = Desc7->dpcTriCaps.dwStippleWidth; - Desc123->dpcTriCaps.dwAlphaCmpCaps = Desc7->dpcTriCaps.dwAlphaCmpCaps; - - Desc123->dwDeviceRenderBitDepth = Desc7->dwDeviceRenderBitDepth; - Desc123->dwDeviceZBufferBitDepth = Desc7->dwDeviceZBufferBitDepth; - Desc123->dwMaxBufferSize = 0; - Desc123->dwMaxVertexCount = 65536; - Desc123->dwMinTextureWidth = Desc7->dwMinTextureWidth; - Desc123->dwMinTextureHeight = Desc7->dwMinTextureHeight; - Desc123->dwMaxTextureWidth = Desc7->dwMaxTextureWidth; - Desc123->dwMaxTextureHeight = Desc7->dwMaxTextureHeight; - Desc123->dwMinStippleWidth = 1; - Desc123->dwMinStippleHeight = 1; - Desc123->dwMaxStippleWidth = 32; - Desc123->dwMaxStippleHeight = 32; - Desc123->dwMaxTextureRepeat = Desc7->dwMaxTextureRepeat; - Desc123->dwMaxTextureAspectRatio = Desc7->dwMaxTextureAspectRatio; - Desc123->dwMaxAnisotropy = Desc7->dwMaxAnisotropy; - Desc123->dvGuardBandLeft = Desc7->dvGuardBandLeft; - Desc123->dvGuardBandRight = Desc7->dvGuardBandRight; - Desc123->dvGuardBandTop = Desc7->dvGuardBandTop; - Desc123->dvGuardBandBottom = Desc7->dvGuardBandBottom; - Desc123->dvExtentsAdjust = Desc7->dvExtentsAdjust; - Desc123->dwStencilCaps = Desc7->dwStencilCaps; - Desc123->dwFVFCaps = Desc7->dwFVFCaps; - Desc123->dwTextureOpCaps = Desc7->dwTextureOpCaps; - Desc123->wMaxTextureBlendStages = Desc7->wMaxTextureBlendStages; - Desc123->wMaxSimultaneousTextures = Desc7->wMaxSimultaneousTextures; - - return DD_OK; -} -/***************************************************************************** - * IDirect3D vtables in various versions - *****************************************************************************/ - -const IDirect3DVtbl IDirect3D1_Vtbl = -{ - /*** IUnknown methods ***/ - Thunk_IDirect3DImpl_1_QueryInterface, - Thunk_IDirect3DImpl_1_AddRef, - Thunk_IDirect3DImpl_1_Release, - /*** IDirect3D methods ***/ - IDirect3DImpl_1_Initialize, - Thunk_IDirect3DImpl_1_EnumDevices, - Thunk_IDirect3DImpl_1_CreateLight, - Thunk_IDirect3DImpl_1_CreateMaterial, - Thunk_IDirect3DImpl_1_CreateViewport, - Thunk_IDirect3DImpl_1_FindDevice -}; - -const IDirect3D2Vtbl IDirect3D2_Vtbl = -{ - /*** IUnknown methods ***/ - Thunk_IDirect3DImpl_2_QueryInterface, - Thunk_IDirect3DImpl_2_AddRef, - Thunk_IDirect3DImpl_2_Release, - /*** IDirect3D2 methods ***/ - Thunk_IDirect3DImpl_2_EnumDevices, - Thunk_IDirect3DImpl_2_CreateLight, - Thunk_IDirect3DImpl_2_CreateMaterial, - Thunk_IDirect3DImpl_2_CreateViewport, - Thunk_IDirect3DImpl_2_FindDevice, - Thunk_IDirect3DImpl_2_CreateDevice -}; - -const IDirect3D3Vtbl IDirect3D3_Vtbl = -{ - /*** IUnknown methods ***/ - Thunk_IDirect3DImpl_3_QueryInterface, - Thunk_IDirect3DImpl_3_AddRef, - Thunk_IDirect3DImpl_3_Release, - /*** IDirect3D3 methods ***/ - IDirect3DImpl_3_EnumDevices, - IDirect3DImpl_3_CreateLight, - IDirect3DImpl_3_CreateMaterial, - IDirect3DImpl_3_CreateViewport, - IDirect3DImpl_3_FindDevice, - Thunk_IDirect3DImpl_3_CreateDevice, - Thunk_IDirect3DImpl_3_CreateVertexBuffer, - Thunk_IDirect3DImpl_3_EnumZBufferFormats, - Thunk_IDirect3DImpl_3_EvictManagedTextures -}; - -const IDirect3D7Vtbl IDirect3D7_Vtbl = -{ - /*** IUnknown methods ***/ - Thunk_IDirect3DImpl_7_QueryInterface, - Thunk_IDirect3DImpl_7_AddRef, - Thunk_IDirect3DImpl_7_Release, - /*** IDirect3D7 methods ***/ - IDirect3DImpl_7_EnumDevices, - IDirect3DImpl_7_CreateDevice, - IDirect3DImpl_7_CreateVertexBuffer, - IDirect3DImpl_7_EnumZBufferFormats, - IDirect3DImpl_7_EvictManagedTextures -}; diff -Nru wine1.3-1.3.0/dlls/ddraw/executebuffer.c wine1.3-1.3.1/dlls/ddraw/executebuffer.c --- wine1.3-1.3.0/dlls/ddraw/executebuffer.c 2010-07-30 18:43:56.000000000 +0100 +++ wine1.3-1.3.1/dlls/ddraw/executebuffer.c 2010-08-20 18:23:50.000000000 +0100 @@ -23,27 +23,9 @@ #include "config.h" #include "wine/port.h" -#include -#include -#include -#include - -#define COBJMACROS -#define NONAMELESSUNION - -#include "windef.h" -#include "winbase.h" -#include "winerror.h" -#include "wingdi.h" -#include "wine/exception.h" - -#include "ddraw.h" -#include "d3d.h" - #include "ddraw_private.h" -#include "wine/debug.h" -WINE_DEFAULT_DEBUG_CHANNEL(d3d7); +WINE_DEFAULT_DEBUG_CHANNEL(ddraw); /***************************************************************************** * _dump_executedata @@ -103,10 +85,10 @@ /* Activate the viewport */ lpViewport->active_device = lpDevice; - lpViewport->activate(lpViewport, FALSE); + viewport_activate(lpViewport, FALSE); TRACE("ExecuteData :\n"); - if (TRACE_ON(d3d7)) + if (TRACE_ON(ddraw)) _dump_executedata(&(This->data)); while (1) { @@ -142,27 +124,28 @@ for (i = 0; i < count; i++) { LPD3DTRIANGLE ci = (LPD3DTRIANGLE) instr; - TRACE_(d3d7)(" v1: %d v2: %d v3: %d\n",ci->u1.v1, ci->u2.v2, ci->u3.v3); - TRACE_(d3d7)(" Flags : "); - if (TRACE_ON(d3d7)) { - /* Wireframe */ - if (ci->wFlags & D3DTRIFLAG_EDGEENABLE1) - TRACE_(d3d7)("EDGEENABLE1 "); - if (ci->wFlags & D3DTRIFLAG_EDGEENABLE2) - TRACE_(d3d7)("EDGEENABLE2 "); - if (ci->wFlags & D3DTRIFLAG_EDGEENABLE1) - TRACE_(d3d7)("EDGEENABLE3 "); - /* Strips / Fans */ - if (ci->wFlags == D3DTRIFLAG_EVEN) - TRACE_(d3d7)("EVEN "); - if (ci->wFlags == D3DTRIFLAG_ODD) - TRACE_(d3d7)("ODD "); - if (ci->wFlags == D3DTRIFLAG_START) - TRACE_(d3d7)("START "); - if ((ci->wFlags > 0) && (ci->wFlags < 30)) - TRACE_(d3d7)("STARTFLAT(%d) ", ci->wFlags); - TRACE_(d3d7)("\n"); - } + TRACE(" v1: %d v2: %d v3: %d\n",ci->u1.v1, ci->u2.v2, ci->u3.v3); + TRACE(" Flags : "); + if (TRACE_ON(ddraw)) + { + /* Wireframe */ + if (ci->wFlags & D3DTRIFLAG_EDGEENABLE1) + TRACE("EDGEENABLE1 "); + if (ci->wFlags & D3DTRIFLAG_EDGEENABLE2) + TRACE("EDGEENABLE2 "); + if (ci->wFlags & D3DTRIFLAG_EDGEENABLE1) + TRACE("EDGEENABLE3 "); + /* Strips / Fans */ + if (ci->wFlags == D3DTRIFLAG_EVEN) + TRACE("EVEN "); + if (ci->wFlags == D3DTRIFLAG_ODD) + TRACE("ODD "); + if (ci->wFlags == D3DTRIFLAG_START) + TRACE("START "); + if ((ci->wFlags > 0) && (ci->wFlags < 30)) + TRACE("STARTFLAT(%u) ", ci->wFlags); + TRACE("\n"); + } This->indices[(i * 3) ] = ci->u1.v1; This->indices[(i * 3) + 1] = ci->u2.v2; This->indices[(i * 3) + 2] = ci->u3.v3; @@ -261,7 +244,7 @@ if (!m) ERR("Invalid material handle %#x.\n", ci->u2.dwArg[0]); else - m->activate(m); + material_activate(m); } else if (ci->u1.dlstLightStateType == D3DLIGHTSTATE_COLORMODEL /* 3 */) { @@ -352,7 +335,8 @@ TRACE(" Start : %d Dest : %d Count : %d\n", ci->wStart, ci->wDest, ci->dwCount); TRACE(" Flags : "); - if (TRACE_ON(d3d7)) { + if (TRACE_ON(ddraw)) + { if (ci->dwFlags & D3DPROCESSVERTICES_COPY) TRACE("COPY "); if (ci->dwFlags & D3DPROCESSVERTICES_NOCOLOR) @@ -402,7 +386,8 @@ D3DMATRIX mat; D3DVIEWPORT* Viewport = &lpViewport->viewports.vp1; - if (TRACE_ON(d3d7)) { + if (TRACE_ON(ddraw)) + { TRACE(" Projection Matrix : (%p)\n", &proj_mat); dump_D3DMATRIX(&proj_mat); TRACE(" View Matrix : (%p)\n", &view_mat); @@ -446,7 +431,8 @@ D3DMATRIX mat; D3DVIEWPORT* Viewport = &lpViewport->viewports.vp1; - if (TRACE_ON(d3d7)) { + if (TRACE_ON(ddraw)) + { TRACE(" Projection Matrix : (%p)\n", &proj_mat); dump_D3DMATRIX(&proj_mat); TRACE(" View Matrix : (%p)\n",&view_mat); @@ -589,7 +575,7 @@ REFIID riid, void **obj) { - TRACE("(%p)->(%s,%p)\n", iface, debugstr_guid(riid), obj); + TRACE("iface %p, riid %s, object %p.\n", iface, debugstr_guid(riid), obj); *obj = NULL; @@ -625,7 +611,7 @@ IDirect3DExecuteBufferImpl *This = (IDirect3DExecuteBufferImpl *)iface; ULONG ref = InterlockedIncrement(&This->ref); - FIXME("(%p)->()incrementing from %u.\n", This, ref - 1); + TRACE("%p increasing refcount to %u.\n", This, ref); return ref; } @@ -645,7 +631,7 @@ IDirect3DExecuteBufferImpl *This = (IDirect3DExecuteBufferImpl *)iface; ULONG ref = InterlockedDecrement(&This->ref); - TRACE("(%p)->()decrementing from %u.\n", This, ref + 1); + TRACE("%p decreasing refcount to %u.\n", This, ref); if (!ref) { if (This->need_free) @@ -669,13 +655,11 @@ * D3D_OK * *****************************************************************************/ -static HRESULT WINAPI -IDirect3DExecuteBufferImpl_Initialize(IDirect3DExecuteBuffer *iface, - IDirect3DDevice *lpDirect3DDevice, - D3DEXECUTEBUFFERDESC *lpDesc) +static HRESULT WINAPI IDirect3DExecuteBufferImpl_Initialize(IDirect3DExecuteBuffer *iface, + IDirect3DDevice *device, D3DEXECUTEBUFFERDESC *desc) { - IDirect3DExecuteBufferImpl *This = (IDirect3DExecuteBufferImpl *)iface; - TRACE("(%p)->(%p,%p) no-op....\n", This, lpDirect3DDevice, lpDesc); + TRACE("iface %p, device %p, desc %p.\n", iface, device, desc); + return D3D_OK; } @@ -698,12 +682,14 @@ { IDirect3DExecuteBufferImpl *This = (IDirect3DExecuteBufferImpl *)iface; DWORD dwSize; - TRACE("(%p)->(%p)\n", This, lpDesc); + + TRACE("iface %p, desc %p.\n", iface, lpDesc); dwSize = lpDesc->dwSize; memcpy(lpDesc, &This->desc, dwSize); - if (TRACE_ON(d3d7)) { + if (TRACE_ON(ddraw)) + { TRACE(" Returning description :\n"); _dump_D3DEXECUTEBUFFERDESC(lpDesc); } @@ -719,11 +705,10 @@ * This implementation always returns D3D_OK * *****************************************************************************/ -static HRESULT WINAPI -IDirect3DExecuteBufferImpl_Unlock(IDirect3DExecuteBuffer *iface) +static HRESULT WINAPI IDirect3DExecuteBufferImpl_Unlock(IDirect3DExecuteBuffer *iface) { - IDirect3DExecuteBufferImpl *This = (IDirect3DExecuteBufferImpl *)iface; - TRACE("(%p)->() no-op...\n", This); + TRACE("iface %p.\n", iface); + return D3D_OK; } @@ -747,7 +732,8 @@ { IDirect3DExecuteBufferImpl *This = (IDirect3DExecuteBufferImpl *)iface; DWORD nbvert; - TRACE("(%p)->(%p)\n", This, lpData); + + TRACE("iface %p, data %p.\n", iface, lpData); memcpy(&This->data, lpData, lpData->dwSize); @@ -758,9 +744,8 @@ HeapFree(GetProcessHeap(), 0, This->vertex_data); This->vertex_data = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, nbvert * sizeof(D3DTLVERTEX)); - if (TRACE_ON(d3d7)) { + if (TRACE_ON(ddraw)) _dump_executedata(lpData); - } return D3D_OK; } @@ -783,12 +768,14 @@ { IDirect3DExecuteBufferImpl *This = (IDirect3DExecuteBufferImpl *)iface; DWORD dwSize; - TRACE("(%p)->(%p): stub!\n", This, lpData); + + TRACE("iface %p, data %p.\n", iface, lpData); dwSize = lpData->dwSize; memcpy(lpData, &This->data, dwSize); - if (TRACE_ON(d3d7)) { + if (TRACE_ON(ddraw)) + { TRACE("Returning data :\n"); _dump_executedata(lpData); } @@ -809,15 +796,14 @@ * DDERR_UNSUPPORTED, because it's not implemented in Windows. * *****************************************************************************/ -static HRESULT WINAPI -IDirect3DExecuteBufferImpl_Validate(IDirect3DExecuteBuffer *iface, - DWORD *Offset, - LPD3DVALIDATECALLBACK Func, - void *UserArg, - DWORD Reserved) +static HRESULT WINAPI IDirect3DExecuteBufferImpl_Validate(IDirect3DExecuteBuffer *iface, + DWORD *offset, LPD3DVALIDATECALLBACK callback, void *context, DWORD reserved) { - IDirect3DExecuteBufferImpl *This = (IDirect3DExecuteBufferImpl *)iface; - TRACE("(%p)->(%p,%p,%p,%08x): Unimplemented!\n", This, Offset, Func, UserArg, Reserved); + TRACE("iface %p, offset %p, callback %p, context %p, reserved %#x.\n", + iface, offset, callback, context, reserved); + + WARN("Not implemented.\n"); + return DDERR_UNSUPPORTED; /* Unchecked */ } @@ -834,16 +820,16 @@ * DDERR_UNSUPPORTED, because it's not implemented in Windows. * *****************************************************************************/ -static HRESULT WINAPI -IDirect3DExecuteBufferImpl_Optimize(IDirect3DExecuteBuffer *iface, - DWORD Dummy) +static HRESULT WINAPI IDirect3DExecuteBufferImpl_Optimize(IDirect3DExecuteBuffer *iface, DWORD reserved) { - IDirect3DExecuteBufferImpl *This = (IDirect3DExecuteBufferImpl *)iface; - TRACE("(%p)->(%08x): Unimplemented\n", This, Dummy); + TRACE("iface %p, reserved %#x.\n", iface, reserved); + + WARN("Not implemented.\n"); + return DDERR_UNSUPPORTED; /* Unchecked */ } -const IDirect3DExecuteBufferVtbl IDirect3DExecuteBuffer_Vtbl = +static const struct IDirect3DExecuteBufferVtbl d3d_execute_buffer_vtbl = { IDirect3DExecuteBufferImpl_QueryInterface, IDirect3DExecuteBufferImpl_AddRef, @@ -856,3 +842,38 @@ IDirect3DExecuteBufferImpl_Validate, IDirect3DExecuteBufferImpl_Optimize, }; + +HRESULT d3d_execute_buffer_init(IDirect3DExecuteBufferImpl *execute_buffer, + IDirect3DDeviceImpl *device, D3DEXECUTEBUFFERDESC *desc) +{ + execute_buffer->lpVtbl = &d3d_execute_buffer_vtbl; + execute_buffer->ref = 1; + execute_buffer->d3ddev = device; + + /* Initializes memory */ + memcpy(&execute_buffer->desc, desc, desc->dwSize); + + /* No buffer given */ + if (!(execute_buffer->desc.dwFlags & D3DDEB_LPDATA)) + execute_buffer->desc.lpData = NULL; + + /* No buffer size given */ + if (!(execute_buffer->desc.dwFlags & D3DDEB_BUFSIZE)) + execute_buffer->desc.dwBufferSize = 0; + + /* Create buffer if asked */ + if (!execute_buffer->desc.lpData && execute_buffer->desc.dwBufferSize) + { + execute_buffer->need_free = TRUE; + execute_buffer->desc.lpData = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, execute_buffer->desc.dwBufferSize); + if (!execute_buffer->desc.lpData) + { + ERR("Failed to allocate execute buffer data.\n"); + return DDERR_OUTOFMEMORY; + } + } + + execute_buffer->desc.dwFlags |= D3DDEB_LPDATA; + + return D3D_OK; +} diff -Nru wine1.3-1.3.0/dlls/ddraw/gamma.c wine1.3-1.3.1/dlls/ddraw/gamma.c --- wine1.3-1.3.0/dlls/ddraw/gamma.c 2010-07-30 18:43:56.000000000 +0100 +++ wine1.3-1.3.1/dlls/ddraw/gamma.c 1970-01-01 01:00:00.000000000 +0100 @@ -1,220 +0,0 @@ -/* DirectDrawGammaControl implementation - * - * Copyright 2001 TransGaming Technologies Inc. - * Copyright 2006 Stefan Dösinger - * - * 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 "wine/port.h" -#include "wine/debug.h" - -#include -#include -#include -#include - -#define COBJMACROS - -#include "windef.h" -#include "winbase.h" -#include "winerror.h" -#include "wingdi.h" -#include "wine/exception.h" - -#include "ddraw.h" -#include "d3d.h" - -#include "ddraw_private.h" - -WINE_DEFAULT_DEBUG_CHANNEL(ddraw); -WINE_DECLARE_DEBUG_CHANNEL(ddraw_thunk); - -static inline IDirectDrawSurfaceImpl *surface_from_gamma_control(IDirectDrawGammaControl *iface) -{ - return (IDirectDrawSurfaceImpl *)((char*)iface - - FIELD_OFFSET(IDirectDrawSurfaceImpl, IDirectDrawGammaControl_vtbl)); -} - -/********************************************************** - * IUnknown parts follow - **********************************************************/ - -/********************************************************** - * IDirectDrawGammaControl::QueryInterface - * - * QueryInterface, thunks to IDirectDrawSurface - * - * Params: - * riid: Interface id queried for - * obj: Returns the interface pointer - * - * Returns: - * S_OK or E_NOINTERFACE: See IDirectDrawSurface7::QueryInterface - * - **********************************************************/ -static HRESULT WINAPI -IDirectDrawGammaControlImpl_QueryInterface(IDirectDrawGammaControl *iface, REFIID riid, - void **obj) -{ - IDirectDrawSurfaceImpl *This = surface_from_gamma_control(iface); - TRACE_(ddraw_thunk)("(%p)->(%s,%p): Thunking to IDirectDrawSurface7\n", This, debugstr_guid(riid), obj); - - return IDirectDrawSurface7_QueryInterface((IDirectDrawSurface7 *)This, riid, obj); -} - -/********************************************************** - * IDirectDrawGammaControl::AddRef - * - * Addref, thunks to IDirectDrawSurface - * - * Returns: - * The new refcount - * - **********************************************************/ -static ULONG WINAPI -IDirectDrawGammaControlImpl_AddRef(IDirectDrawGammaControl *iface) -{ - IDirectDrawSurfaceImpl *This = surface_from_gamma_control(iface); - TRACE_(ddraw_thunk)("(%p)->() Thunking to IDirectDrawSurface7\n", This); - - return IDirectDrawSurface7_AddRef((IDirectDrawSurface7 *)This); -} - -/********************************************************** - * IDirectDrawGammaControl::Release - * - * Release, thunks to IDirectDrawSurface - * - * Returns: - * The new refcount - * - **********************************************************/ -static ULONG WINAPI -IDirectDrawGammaControlImpl_Release(IDirectDrawGammaControl *iface) -{ - IDirectDrawSurfaceImpl *This = surface_from_gamma_control(iface); - TRACE_(ddraw_thunk)("(%p)->() Thunking to IDirectDrawSurface7\n", This); - - return IDirectDrawSurface7_Release((IDirectDrawSurface7 *)This); -} - -/********************************************************** - * IDirectDrawGammaControl - **********************************************************/ - -/********************************************************** - * IDirectDrawGammaControl::GetGammaRamp - * - * Returns the current gamma ramp for a surface - * - * Params: - * Flags: Ignored - * GammaRamp: Address to write the ramp to - * - * Returns: - * DD_OK on success - * DDERR_INVALIDPARAMS if GammaRamp is NULL - * - **********************************************************/ -static HRESULT WINAPI -IDirectDrawGammaControlImpl_GetGammaRamp(IDirectDrawGammaControl *iface, - DWORD Flags, - DDGAMMARAMP *GammaRamp) -{ - IDirectDrawSurfaceImpl *This = surface_from_gamma_control(iface); - TRACE("(%p)->(%08x,%p)\n", This,Flags,GammaRamp); - - /* This looks sane */ - if(!GammaRamp) - { - ERR("(%p) GammaRamp is NULL, returning DDERR_INVALIDPARAMS\n", This); - return DDERR_INVALIDPARAMS; - } - - EnterCriticalSection(&ddraw_cs); - if(This->surface_desc.ddsCaps.dwCaps & DDSCAPS_PRIMARYSURFACE) - { - /* Note: DDGAMMARAMP is compatible with WINED3DGAMMARAMP */ - IWineD3DDevice_GetGammaRamp(This->ddraw->wineD3DDevice, - 0 /* Swapchain */, - (WINED3DGAMMARAMP *) GammaRamp); - } - else - { - ERR("(%p) Unimplemented for non-primary surfaces\n", This); - } - LeaveCriticalSection(&ddraw_cs); - - return DD_OK; -} - -/********************************************************** - * IDirectDrawGammaControl::SetGammaRamp - * - * Sets the red, green and blue gamma ramps for - * - * Params: - * Flags: Can be DDSGR_CALIBRATE to request calibration - * GammaRamp: Structure containing the new gamma ramp - * - * Returns: - * DD_OK on success - * DDERR_INVALIDPARAMS if GammaRamp is NULL - * - **********************************************************/ -static HRESULT WINAPI -IDirectDrawGammaControlImpl_SetGammaRamp(IDirectDrawGammaControl *iface, - DWORD Flags, - DDGAMMARAMP *GammaRamp) -{ - IDirectDrawSurfaceImpl *This = surface_from_gamma_control(iface); - TRACE("(%p)->(%08x,%p)\n", This,Flags,GammaRamp); - - /* This looks sane */ - if(!GammaRamp) - { - ERR("(%p) GammaRamp is NULL, returning DDERR_INVALIDPARAMS\n", This); - return DDERR_INVALIDPARAMS; - } - - EnterCriticalSection(&ddraw_cs); - if(This->surface_desc.ddsCaps.dwCaps & DDSCAPS_PRIMARYSURFACE) - { - - /* Note: DDGAMMARAMP is compatible with WINED3DGAMMARAMP */ - IWineD3DDevice_SetGammaRamp(This->ddraw->wineD3DDevice, - 0 /* Swapchain */, - Flags, - (WINED3DGAMMARAMP *) GammaRamp); - } - else - { - ERR("(%p) Unimplemented for non-primary surfaces\n", This); - } - LeaveCriticalSection(&ddraw_cs); - - return DD_OK; -} - -const IDirectDrawGammaControlVtbl IDirectDrawGammaControl_Vtbl = -{ - IDirectDrawGammaControlImpl_QueryInterface, - IDirectDrawGammaControlImpl_AddRef, - IDirectDrawGammaControlImpl_Release, - IDirectDrawGammaControlImpl_GetGammaRamp, - IDirectDrawGammaControlImpl_SetGammaRamp -}; diff -Nru wine1.3-1.3.0/dlls/ddraw/light.c wine1.3-1.3.1/dlls/ddraw/light.c --- wine1.3-1.3.0/dlls/ddraw/light.c 2010-07-30 18:43:56.000000000 +0100 +++ wine1.3-1.3.1/dlls/ddraw/light.c 2010-08-20 18:23:50.000000000 +0100 @@ -21,27 +21,75 @@ #include "config.h" #include "wine/port.h" -#include "wine/debug.h" -#include -#include -#include -#include - -#define COBJMACROS - -#include "windef.h" -#include "winbase.h" -#include "winerror.h" -#include "wingdi.h" -#include "wine/exception.h" +#include "ddraw_private.h" -#include "ddraw.h" -#include "d3d.h" +WINE_DEFAULT_DEBUG_CHANNEL(ddraw); -#include "ddraw_private.h" +/***************************************************************************** + * light_update + * + * Updates the Direct3DDevice7 lighting parameters + * + *****************************************************************************/ +static void light_update(IDirect3DLightImpl *light) +{ + IDirect3DDeviceImpl *device; -WINE_DEFAULT_DEBUG_CHANNEL(d3d7); + TRACE("light %p.\n", light); + + if (!light->active_viewport || !light->active_viewport->active_device) return; + device = light->active_viewport->active_device; + + IDirect3DDevice7_SetLight((IDirect3DDevice7 *)device, light->dwLightIndex, &light->light7); +} + +/***************************************************************************** + * light_activate + * + * Uses the Direct3DDevice7::LightEnable method to active the light + * + *****************************************************************************/ +void light_activate(IDirect3DLightImpl *light) +{ + IDirect3DDeviceImpl *device; + + TRACE("light %p.\n", light); + + if (!light->active_viewport || !light->active_viewport->active_device) return; + device = light->active_viewport->active_device; + + light_update(light); + if (!(light->light.dwFlags & D3DLIGHT_ACTIVE)) + { + IDirect3DDevice7_LightEnable((IDirect3DDevice7 *)device, light->dwLightIndex, TRUE); + light->light.dwFlags |= D3DLIGHT_ACTIVE; + } +} + +/***************************************************************************** + * + * light_deactivate + * + * Uses the Direct3DDevice7::LightEnable method to deactivate the light + * + *****************************************************************************/ +void light_deactivate(IDirect3DLightImpl *light) +{ + IDirect3DDeviceImpl *device; + + TRACE("light %p.\n", light); + + if (!light->active_viewport || !light->active_viewport->active_device) return; + device = light->active_viewport->active_device; + + /* If was not active, activate it */ + if (light->light.dwFlags & D3DLIGHT_ACTIVE) + { + IDirect3DDevice7_LightEnable((IDirect3DDevice7 *)device, light->dwLightIndex, FALSE); + light->light.dwFlags &= ~D3DLIGHT_ACTIVE; + } +} /***************************************************************************** * IUnknown Methods. @@ -60,14 +108,11 @@ * Returns: * E_NOINTERFACE, because it's a stub *****************************************************************************/ -static HRESULT WINAPI -IDirect3DLightImpl_QueryInterface(IDirect3DLight *iface, - REFIID riid, - void **obp) +static HRESULT WINAPI IDirect3DLightImpl_QueryInterface(IDirect3DLight *iface, REFIID riid, void **object) { - IDirect3DLightImpl *This = (IDirect3DLightImpl *)iface; - FIXME("(%p)->(%s,%p): stub!\n", This, debugstr_guid(riid), obp); - *obp = NULL; + FIXME("iface %p, riid %s, object %p stub!\n", iface, debugstr_guid(riid), object); + + *object = NULL; return E_NOINTERFACE; } @@ -86,7 +131,7 @@ IDirect3DLightImpl *This = (IDirect3DLightImpl *)iface; ULONG ref = InterlockedIncrement(&This->ref); - TRACE("(%p)->() incrementing from %u.\n", This, ref - 1); + TRACE("%p increasing refcount to %u.\n", This, ref); return ref; } @@ -107,7 +152,7 @@ IDirect3DLightImpl *This = (IDirect3DLightImpl *)iface; ULONG ref = InterlockedDecrement(&This->ref); - TRACE("(%p)->() decrementing from %u.\n", This, ref + 1); + TRACE("%p decreasing refcount to %u.\n", This, ref); if (!ref) { HeapFree(GetProcessHeap(), 0, This); @@ -133,13 +178,10 @@ * D3D_OK * *****************************************************************************/ -static HRESULT WINAPI -IDirect3DLightImpl_Initialize(IDirect3DLight *iface, - IDirect3D *lpDirect3D) +static HRESULT WINAPI IDirect3DLightImpl_Initialize(IDirect3DLight *iface, IDirect3D *d3d) { - IDirect3DLightImpl *This = (IDirect3DLightImpl *)iface; - IDirectDrawImpl *d3d = lpDirect3D ? ddraw_from_d3d1(lpDirect3D) : NULL; - TRACE("(%p)->(%p) no-op...\n", This, d3d); + TRACE("iface %p, d3d %p.\n", iface, d3d); + return D3D_OK; } @@ -171,8 +213,11 @@ { IDirect3DLightImpl *This = (IDirect3DLightImpl *)iface; LPD3DLIGHT7 light7 = &(This->light7); - TRACE("(%p)->(%p)\n", This, lpLight); - if (TRACE_ON(d3d7)) { + + TRACE("iface %p, light %p.\n", iface, lpLight); + + if (TRACE_ON(ddraw)) + { TRACE(" Light definition :\n"); dump_light((LPD3DLIGHT2) lpLight); } @@ -203,9 +248,8 @@ EnterCriticalSection(&ddraw_cs); memcpy(&This->light, lpLight, lpLight->dwSize); - if ((This->light.dwFlags & D3DLIGHT_ACTIVE) != 0) { - This->update(This); - } + if (This->light.dwFlags & D3DLIGHT_ACTIVE) + light_update(This); LeaveCriticalSection(&ddraw_cs); return D3D_OK; } @@ -227,8 +271,11 @@ D3DLIGHT *lpLight) { IDirect3DLightImpl *This = (IDirect3DLightImpl *)iface; - TRACE("(%p/%p)->(%p)\n", This, iface, lpLight); - if (TRACE_ON(d3d7)) { + + TRACE("iface %p, light %p.\n", iface, lpLight); + + if (TRACE_ON(ddraw)) + { TRACE(" Returning light definition :\n"); dump_light(&This->light); } @@ -240,74 +287,7 @@ return DD_OK; } -/***************************************************************************** - * light_update - * - * Updates the Direct3DDevice7 lighting parameters - * - *****************************************************************************/ -void light_update(IDirect3DLightImpl* This) -{ - IDirect3DDeviceImpl* device; - - TRACE("(%p)\n", This); - - if (!This->active_viewport || !This->active_viewport->active_device) - return; - device = This->active_viewport->active_device; - - IDirect3DDevice7_SetLight((IDirect3DDevice7 *)device, This->dwLightIndex, &(This->light7)); -} - -/***************************************************************************** - * light_activate - * - * Uses the Direct3DDevice7::LightEnable method to active the light - * - *****************************************************************************/ -void light_activate(IDirect3DLightImpl* This) -{ - IDirect3DDeviceImpl* device; - - TRACE("(%p)\n", This); - - if (!This->active_viewport || !This->active_viewport->active_device) - return; - device = This->active_viewport->active_device; - - light_update(This); - /* If was not active, activate it */ - if ((This->light.dwFlags & D3DLIGHT_ACTIVE) == 0) { - IDirect3DDevice7_LightEnable((IDirect3DDevice7 *)device, This->dwLightIndex, TRUE); - This->light.dwFlags |= D3DLIGHT_ACTIVE; - } -} - -/***************************************************************************** - * - * light_desactivate - * - * Uses the Direct3DDevice7::LightEnable method to deactivate the light - * - *****************************************************************************/ -void light_desactivate(IDirect3DLightImpl* This) -{ - IDirect3DDeviceImpl* device; - - TRACE("(%p)\n", This); - - if (!This->active_viewport || !This->active_viewport->active_device) - return; - device = This->active_viewport->active_device; - - /* If was not active, activate it */ - if ((This->light.dwFlags & D3DLIGHT_ACTIVE) != 0) { - IDirect3DDevice7_LightEnable((IDirect3DDevice7 *)device, This->dwLightIndex, FALSE); - This->light.dwFlags &= ~D3DLIGHT_ACTIVE; - } -} - -const IDirect3DLightVtbl IDirect3DLight_Vtbl = +static const struct IDirect3DLightVtbl d3d_light_vtbl = { /*** IUnknown Methods ***/ IDirect3DLightImpl_QueryInterface, @@ -318,3 +298,10 @@ IDirect3DLightImpl_SetLight, IDirect3DLightImpl_GetLight }; + +void d3d_light_init(IDirect3DLightImpl *light, IDirectDrawImpl *ddraw) +{ + light->lpVtbl = &d3d_light_vtbl; + light->ref = 1; + light->ddraw = ddraw; +} diff -Nru wine1.3-1.3.0/dlls/ddraw/main.c wine1.3-1.3.1/dlls/ddraw/main.c --- wine1.3-1.3.0/dlls/ddraw/main.c 2010-07-30 18:43:56.000000000 +0100 +++ wine1.3-1.3.1/dlls/ddraw/main.c 2010-08-20 18:23:50.000000000 +0100 @@ -26,35 +26,21 @@ #include "config.h" #include "wine/port.h" -#include "wine/debug.h" - -#include -#include -#include -#include - -#define COBJMACROS - -#include "windef.h" -#include "winbase.h" -#include "winerror.h" -#include "wingdi.h" -#include "wine/exception.h" -#include "winreg.h" - -#include "ddraw.h" -#include "d3d.h" #define DDRAW_INIT_GUID #include "ddraw_private.h" -static typeof(WineDirect3DCreate) *pWineDirect3DCreate; +#include "wine/exception.h" +#include "winreg.h" WINE_DEFAULT_DEBUG_CHANNEL(ddraw); /* The configured default surface */ WINED3DSURFTYPE DefaultSurfaceType = SURFACE_UNKNOWN; +typeof(WineDirect3DCreateClipper) *pWineDirect3DCreateClipper DECLSPEC_HIDDEN; +typeof(WineDirect3DCreate) *pWineDirect3DCreate DECLSPEC_HIDDEN; + /* DDraw list and critical section */ static struct list global_ddraw_list = LIST_INIT(global_ddraw_list); @@ -235,14 +221,12 @@ IUnknown *UnkOuter, REFIID iid) { - IDirectDrawImpl *This = NULL; - HRESULT hr; - IWineD3D *wineD3D = NULL; - IWineD3DDevice *wineD3DDevice = NULL; - HDC hDC; WINED3DDEVTYPE devicetype; + IDirectDrawImpl *This; + HRESULT hr; - TRACE("(%s,%p,%p)\n", debugstr_guid(guid), DD, UnkOuter); + TRACE("driver_guid %s, ddraw %p, outer_unknown %p, interface_iid %s.\n", + debugstr_guid(guid), DD, UnkOuter, debugstr_guid(iid)); *DD = NULL; @@ -278,99 +262,19 @@ return E_OUTOFMEMORY; } - /* The interfaces: - * IDirectDraw and IDirect3D are the same object, - * QueryInterface is used to get other interfaces. - */ - This->lpVtbl = &IDirectDraw7_Vtbl; - This->IDirectDraw_vtbl = &IDirectDraw1_Vtbl; - This->IDirectDraw2_vtbl = &IDirectDraw2_Vtbl; - This->IDirectDraw3_vtbl = &IDirectDraw3_Vtbl; - This->IDirectDraw4_vtbl = &IDirectDraw4_Vtbl; - This->IDirect3D_vtbl = &IDirect3D1_Vtbl; - This->IDirect3D2_vtbl = &IDirect3D2_Vtbl; - This->IDirect3D3_vtbl = &IDirect3D3_Vtbl; - This->IDirect3D7_vtbl = &IDirect3D7_Vtbl; - This->device_parent_vtbl = &ddraw_wined3d_device_parent_vtbl; - - /* See comments in IDirectDrawImpl_CreateNewSurface for a description - * of this member. - * Read from a registry key, should add a winecfg option later - */ - This->ImplType = DefaultSurfaceType; - - /* Get the current screen settings */ - hDC = GetDC(0); - This->orig_bpp = GetDeviceCaps(hDC, BITSPIXEL) * GetDeviceCaps(hDC, PLANES); - ReleaseDC(0, hDC); - This->orig_width = GetSystemMetrics(SM_CXSCREEN); - This->orig_height = GetSystemMetrics(SM_CYSCREEN); - - if (!LoadWineD3D()) - { - ERR("Couldn't load WineD3D - OpenGL libs not present?\n"); - hr = DDERR_NODIRECTDRAWSUPPORT; - goto err_out; - } - - /* Initialize WineD3D - * - * All Rendering (2D and 3D) is relayed to WineD3D, - * but DirectDraw specific management, like DDSURFACEDESC and DDPIXELFORMAT - * structure handling is handled in this lib. - */ - wineD3D = pWineDirect3DCreate(7 /* DXVersion */, (IUnknown *) This /* Parent */); - if(!wineD3D) - { - ERR("Failed to initialise WineD3D\n"); - hr = E_OUTOFMEMORY; - goto err_out; - } - This->wineD3D = wineD3D; - TRACE("WineD3D created at %p\n", wineD3D); - - /* Initialized member... - * - * It is set to false at creation time, and set to true in - * IDirectDraw7::Initialize. Its sole purpose is to return DD_OK on - * initialize only once - */ - This->initialized = FALSE; - - /* Initialize WineD3DDevice - * - * It is used for screen setup, surface and palette creation - * When a Direct3DDevice7 is created, the D3D capabilities of WineD3D are - * initialized - */ - hr = IWineD3D_CreateDevice(wineD3D, 0 /* D3D_ADAPTER_DEFAULT */, devicetype, NULL /* FocusWindow, don't know yet */, - 0 /* BehaviorFlags */, (IUnknown *)This, (IWineD3DDeviceParent *)&This->device_parent_vtbl, &wineD3DDevice); - if(FAILED(hr)) + hr = ddraw_init(This, devicetype); + if (FAILED(hr)) { - ERR("Failed to create a wineD3DDevice, result = %x\n", hr); - goto err_out; + WARN("Failed to initialize ddraw object, hr %#x.\n", hr); + HeapFree(GetProcessHeap(), 0, This); + return hr; } - This->wineD3DDevice = wineD3DDevice; - TRACE("wineD3DDevice created at %p\n", This->wineD3DDevice); - /* Get the amount of video memory */ - This->total_vidmem = IWineD3DDevice_GetAvailableTextureMem(This->wineD3DDevice); - - list_init(&This->surface_list); - list_add_head(&global_ddraw_list, &This->ddraw_list_entry); - - /* Call QueryInterface to get the pointer to the requested interface. This also initializes - * The required refcount - */ hr = IDirectDraw7_QueryInterface((IDirectDraw7 *)This, iid, DD); - if(SUCCEEDED(hr)) return DD_OK; + IDirectDraw7_Release((IDirectDraw7 *)This); + if (SUCCEEDED(hr)) list_add_head(&global_ddraw_list, &This->ddraw_list_entry); + else WARN("Failed to query interface %s from ddraw object %p.\n", debugstr_guid(iid), This); -err_out: - /* Let's hope we never need this ;) */ - if(wineD3DDevice) IWineD3DDevice_Release(wineD3DDevice); - if(wineD3D) IWineD3D_Release(wineD3D); - HeapFree(GetProcessHeap(), 0, This->decls); - HeapFree(GetProcessHeap(), 0, This); return hr; } @@ -389,7 +293,9 @@ IUnknown *UnkOuter) { HRESULT hr; - TRACE("(%s,%p,%p)\n", debugstr_guid(GUID), DD, UnkOuter); + + TRACE("driver_guid %s, ddraw %p, outer_unknown %p.\n", + debugstr_guid(GUID), DD, UnkOuter); EnterCriticalSection(&ddraw_cs); hr = DDRAW_Create(GUID, (void **) DD, UnkOuter, &IID_IDirectDraw); @@ -413,7 +319,9 @@ IUnknown *UnkOuter) { HRESULT hr; - TRACE("(%s,%p,%s,%p)\n", debugstr_guid(GUID), DD, debugstr_guid(iid), UnkOuter); + + TRACE("driver_guid %s, ddraw %p, interface_iid %s, outer_unknown %p.\n", + debugstr_guid(GUID), DD, debugstr_guid(iid), UnkOuter); if (!IsEqualGUID(iid, &IID_IDirectDraw7)) return DDERR_INVALIDPARAMS; @@ -444,11 +352,9 @@ * * ***********************************************************************/ -HRESULT WINAPI -DirectDrawEnumerateA(LPDDENUMCALLBACKA Callback, - LPVOID Context) +HRESULT WINAPI DirectDrawEnumerateA(LPDDENUMCALLBACKA Callback, void *Context) { - TRACE("(%p, %p)\n", Callback, Context); + TRACE("callback %p, context %p.\n", Callback, Context); TRACE(" Enumerating default DirectDraw HAL interface\n"); /* We only have one driver */ @@ -478,12 +384,9 @@ * The Flag member is not supported right now. * ***********************************************************************/ -HRESULT WINAPI -DirectDrawEnumerateExA(LPDDENUMCALLBACKEXA Callback, - LPVOID Context, - DWORD Flags) +HRESULT WINAPI DirectDrawEnumerateExA(LPDDENUMCALLBACKEXA Callback, void *Context, DWORD Flags) { - TRACE("(%p, %p, 0x%08x)\n", Callback, Context, Flags); + TRACE("callback %p, context %p, flags %#x.\n", Callback, Context, Flags); if (Flags & ~(DDENUM_ATTACHEDSECONDARYDEVICES | DDENUM_DETACHEDSECONDARYDEVICES | @@ -521,13 +424,11 @@ * This function is not implemented on Windows. * ***********************************************************************/ -HRESULT WINAPI -DirectDrawEnumerateW(LPDDENUMCALLBACKW Callback, - LPVOID Context) +HRESULT WINAPI DirectDrawEnumerateW(LPDDENUMCALLBACKW callback, void *context) { - TRACE("(%p, %p)\n", Callback, Context); + TRACE("callback %p, context %p.\n", callback, context); - if (!Callback) + if (!callback) return DDERR_INVALIDPARAMS; else return DDERR_UNSUPPORTED; @@ -540,12 +441,9 @@ * This function is not implemented on Windows. * ***********************************************************************/ -HRESULT WINAPI -DirectDrawEnumerateExW(LPDDENUMCALLBACKEXW Callback, - LPVOID Context, - DWORD Flags) +HRESULT WINAPI DirectDrawEnumerateExW(LPDDENUMCALLBACKEXW callback, void *context, DWORD flags) { - TRACE("(%p, %p, 0x%x)\n", Callback, Context, Flags); + TRACE("callback %p, context %p, flags %#x.\n", callback, context, flags); return DDERR_UNSUPPORTED; } @@ -574,7 +472,7 @@ { HRESULT hr; - TRACE("(%p,%s,%p)\n", UnkOuter, debugstr_guid(iid), obj); + TRACE("outer_unknown %p, riid %s, object %p.\n", UnkOuter, debugstr_guid(iid), obj); EnterCriticalSection(&ddraw_cs); hr = DDRAW_Create(NULL, obj, UnkOuter, iid); @@ -603,6 +501,8 @@ HRESULT hr; IDirectDrawClipper *Clip; + TRACE("outer_unknown %p, riid %s, object %p.\n", UnkOuter, debugstr_guid(riid), obj); + EnterCriticalSection(&ddraw_cs); hr = DirectDrawCreateClipper(0, &Clip, UnkOuter); if (hr != DD_OK) @@ -646,7 +546,7 @@ { IClassFactoryImpl *This = (IClassFactoryImpl *)iface; - TRACE("(%p)->(%s,%p)\n", This, debugstr_guid(riid), obj); + TRACE("iface %p, riid %s, object %p.\n", iface, debugstr_guid(riid), obj); if (IsEqualGUID(riid, &IID_IUnknown) || IsEqualGUID(riid, &IID_IClassFactory)) @@ -675,7 +575,7 @@ IClassFactoryImpl *This = (IClassFactoryImpl *)iface; ULONG ref = InterlockedIncrement(&This->ref); - TRACE("(%p)->() incrementing from %d.\n", This, ref - 1); + TRACE("%p increasing refcount to %u.\n", This, ref); return ref; } @@ -695,7 +595,8 @@ { IClassFactoryImpl *This = (IClassFactoryImpl *)iface; ULONG ref = InterlockedDecrement(&This->ref); - TRACE("(%p)->() decrementing from %d.\n", This, ref+1); + + TRACE("%p decreasing refcount to %u.\n", This, ref); if (ref == 0) HeapFree(GetProcessHeap(), 0, This); @@ -724,7 +625,8 @@ { IClassFactoryImpl *This = (IClassFactoryImpl *)iface; - TRACE("(%p)->(%p,%s,%p)\n",This,UnkOuter,debugstr_guid(riid),obj); + TRACE("iface %p, outer_unknown %p, riid %s, object %p.\n", + iface, UnkOuter, debugstr_guid(riid), obj); return This->pfnCreateInstance(UnkOuter, riid, obj); } @@ -741,11 +643,10 @@ * S_OK, because it's a stub * *******************************************************************************/ -static HRESULT WINAPI -IDirectDrawClassFactoryImpl_LockServer(IClassFactory *iface,BOOL dolock) +static HRESULT WINAPI IDirectDrawClassFactoryImpl_LockServer(IClassFactory *iface, BOOL dolock) { - IClassFactoryImpl *This = (IClassFactoryImpl *)iface; - FIXME("(%p)->(%d),stub!\n",This,dolock); + FIXME("iface %p, dolock %#x stub!\n", iface, dolock); + return S_OK; } @@ -783,7 +684,8 @@ unsigned int i; IClassFactoryImpl *factory; - TRACE("(%s,%s,%p)\n", debugstr_guid(rclsid), debugstr_guid(riid), ppv); + TRACE("rclsid %s, riid %s, object %p.\n", + debugstr_guid(rclsid), debugstr_guid(riid), ppv); if ( !IsEqualGUID( &IID_IClassFactory, riid ) && ! IsEqualGUID( &IID_IUnknown, riid) ) @@ -823,6 +725,8 @@ */ HRESULT WINAPI DllCanUnloadNow(void) { + TRACE("\n"); + return S_FALSE; } diff -Nru wine1.3-1.3.0/dlls/ddraw/Makefile.in wine1.3-1.3.1/dlls/ddraw/Makefile.in --- wine1.3-1.3.0/dlls/ddraw/Makefile.in 2010-07-30 18:43:56.000000000 +0100 +++ wine1.3-1.3.1/dlls/ddraw/Makefile.in 2010-08-20 18:23:50.000000000 +0100 @@ -10,9 +10,7 @@ clipper.c \ ddraw.c \ device.c \ - direct3d.c \ executebuffer.c \ - gamma.c \ light.c \ main.c \ material.c \ @@ -20,7 +18,6 @@ parent.c \ regsvr.c \ surface.c \ - texture.c \ utils.c \ vertexbuffer.c \ viewport.c diff -Nru wine1.3-1.3.0/dlls/ddraw/material.c wine1.3-1.3.1/dlls/ddraw/material.c --- wine1.3-1.3.0/dlls/ddraw/material.c 2010-07-30 18:43:56.000000000 +0100 +++ wine1.3-1.3.1/dlls/ddraw/material.c 2010-08-20 18:23:50.000000000 +0100 @@ -22,28 +22,9 @@ #include "config.h" #include "wine/port.h" -#include -#include -#include -#include - -#define COBJMACROS -#define NONAMELESSUNION - -#include "windef.h" -#include "winbase.h" -#include "winerror.h" -#include "wingdi.h" -#include "wine/exception.h" - -#include "ddraw.h" -#include "d3d.h" - #include "ddraw_private.h" -#include "wine/debug.h" -WINE_DEFAULT_DEBUG_CHANNEL(d3d7); -WINE_DECLARE_DEBUG_CHANNEL(ddraw_thunk); +WINE_DEFAULT_DEBUG_CHANNEL(ddraw); static void dump_material(const D3DMATERIAL *mat) { @@ -85,7 +66,8 @@ LPVOID* obp) { IDirect3DMaterialImpl *This = (IDirect3DMaterialImpl *)iface; - TRACE("(%p)->(%s,%p)\n", This, debugstr_guid(riid), obp); + + TRACE("iface %p, riid %s, object %p.\n", iface, debugstr_guid(riid), obp); *obp = NULL; @@ -132,7 +114,7 @@ IDirect3DMaterialImpl *This = (IDirect3DMaterialImpl *)iface; ULONG ref = InterlockedIncrement(&This->ref); - TRACE("(%p)->() incrementing from %u.\n", This, ref - 1); + TRACE("%p increasing refcount to %u.\n", This, ref); return ref; } @@ -153,7 +135,7 @@ IDirect3DMaterialImpl *This = (IDirect3DMaterialImpl *)iface; ULONG ref = InterlockedDecrement(&This->ref); - TRACE("(%p)->() decrementing from %u.\n", This, ref + 1); + TRACE("%p decreasing refcount to %u.\n", This, ref); if (!ref) { @@ -190,9 +172,7 @@ IDirect3DMaterialImpl_Initialize(IDirect3DMaterial *iface, IDirect3D *Direct3D) { - IDirect3DMaterialImpl *This = material_from_material1(iface); - - TRACE("(%p)->(%p) no-op...!\n", This, Direct3D); + TRACE("iface %p, d3d %p.\n", iface, Direct3D); return D3D_OK; } @@ -210,8 +190,7 @@ static HRESULT WINAPI IDirect3DMaterialImpl_Reserve(IDirect3DMaterial *iface) { - IDirect3DMaterialImpl *This = material_from_material1(iface); - TRACE("(%p)->() not implemented\n", This); + TRACE("iface %p.\n", iface); return DDERR_UNSUPPORTED; } @@ -228,8 +207,7 @@ static HRESULT WINAPI IDirect3DMaterialImpl_Unreserve(IDirect3DMaterial *iface) { - IDirect3DMaterialImpl *This = material_from_material1(iface); - TRACE("(%p)->() not implemented.\n", This); + TRACE("iface %p.\n", iface); return DDERR_UNSUPPORTED; } @@ -252,8 +230,9 @@ D3DMATERIAL *lpMat) { IDirect3DMaterialImpl *This = (IDirect3DMaterialImpl *)iface; - TRACE("(%p)->(%p)\n", This, lpMat); - if (TRACE_ON(d3d7)) + + TRACE("iface %p, material %p.\n", iface, lpMat); + if (TRACE_ON(ddraw)) dump_material(lpMat); /* Stores the material */ @@ -284,8 +263,10 @@ { IDirect3DMaterialImpl *This = (IDirect3DMaterialImpl *)iface; DWORD dwSize; - TRACE("(%p)->(%p)\n", This, lpMat); - if (TRACE_ON(d3d7)) { + + TRACE("iface %p, material %p.\n", iface, lpMat); + if (TRACE_ON(ddraw)) + { TRACE(" Returning material : "); dump_material(&This->mat); } @@ -321,7 +302,8 @@ { IDirect3DMaterialImpl *This = (IDirect3DMaterialImpl *)iface; IDirect3DDeviceImpl *device = device_from_device3(lpDirect3DDevice3); - TRACE("(%p/%p)->(%p,%p)\n", This, iface, device, lpHandle); + + TRACE("iface %p, device %p, handle %p.\n", iface, lpDirect3DDevice3, lpHandle); EnterCriticalSection(&ddraw_cs); This->active_device = device; @@ -349,7 +331,8 @@ LPDIRECT3DDEVICE2 lpDirect3DDevice2, LPD3DMATERIALHANDLE lpHandle) { - TRACE_(ddraw_thunk)("(%p)->(%p,%p) thunking to IDirect3DMaterial3 interface.\n", iface, lpDirect3DDevice2, lpHandle); + TRACE("iface %p, device %p, handle %p.\n", iface, lpDirect3DDevice2, lpHandle); + return IDirect3DMaterial3_GetHandle((IDirect3DMaterial3 *)material_from_material2(iface), lpDirect3DDevice2 ? (IDirect3DDevice3 *)&device_from_device2(lpDirect3DDevice2)->IDirect3DDevice3_vtbl : NULL, lpHandle); } @@ -359,7 +342,8 @@ LPDIRECT3DDEVICE lpDirect3DDevice, LPD3DMATERIALHANDLE lpHandle) { - TRACE_(ddraw_thunk)("(%p)->(%p,%p) thunking to IDirect3DMaterial3 interface.\n", iface, lpDirect3DDevice, lpHandle); + TRACE("iface %p, device %p, handle %p.\n", iface, lpDirect3DDevice, lpHandle); + return IDirect3DMaterial3_GetHandle((IDirect3DMaterial3 *)material_from_material1(iface), lpDirect3DDevice ? (IDirect3DDevice3 *)&device_from_device1(lpDirect3DDevice)->IDirect3DDevice3_vtbl : NULL, lpHandle); } @@ -369,7 +353,8 @@ REFIID riid, LPVOID* obp) { - TRACE_(ddraw_thunk)("(%p)->(%s,%p) thunking to IDirect3DMaterial3 interface.\n", iface, debugstr_guid(riid), obp); + TRACE("iface %p, riid %s, object %p.\n", iface, debugstr_guid(riid), obp); + return IDirect3DMaterial3_QueryInterface((IDirect3DMaterial3 *)material_from_material2(iface), riid, obp); } @@ -378,35 +363,40 @@ REFIID riid, LPVOID* obp) { - TRACE_(ddraw_thunk)("(%p)->(%s,%p) thunking to IDirect3DMaterial3 interface.\n", iface, debugstr_guid(riid), obp); + TRACE("iface %p, riid %s, object %p.\n", iface, debugstr_guid(riid), obp); + return IDirect3DMaterial3_QueryInterface((IDirect3DMaterial3 *)material_from_material1(iface), riid, obp); } static ULONG WINAPI Thunk_IDirect3DMaterialImpl_2_AddRef(LPDIRECT3DMATERIAL2 iface) { - TRACE_(ddraw_thunk)("(%p)->() thunking to IDirect3DMaterial3 interface.\n", iface); + TRACE("iface %p.\n", iface); + return IDirect3DMaterial3_AddRef((IDirect3DMaterial3 *)material_from_material2(iface)); } static ULONG WINAPI Thunk_IDirect3DMaterialImpl_1_AddRef(LPDIRECT3DMATERIAL iface) { - TRACE_(ddraw_thunk)("(%p)->() thunking to IDirect3DMaterial3 interface.\n", iface); + TRACE("iface %p.\n", iface); + return IDirect3DMaterial3_AddRef((IDirect3DMaterial3 *)material_from_material1(iface)); } static ULONG WINAPI Thunk_IDirect3DMaterialImpl_2_Release(LPDIRECT3DMATERIAL2 iface) { - TRACE_(ddraw_thunk)("(%p)->() thunking to IDirect3DMaterial3 interface.\n", iface); + TRACE("iface %p.\n", iface); + return IDirect3DMaterial3_Release((IDirect3DMaterial3 *)material_from_material2(iface)); } static ULONG WINAPI Thunk_IDirect3DMaterialImpl_1_Release(LPDIRECT3DMATERIAL iface) { - TRACE_(ddraw_thunk)("(%p)->() thunking to IDirect3DMaterial3 interface.\n", iface); + TRACE("iface %p.\n", iface); + return IDirect3DMaterial3_Release((IDirect3DMaterial3 *)material_from_material1(iface)); } @@ -414,7 +404,8 @@ Thunk_IDirect3DMaterialImpl_2_SetMaterial(LPDIRECT3DMATERIAL2 iface, LPD3DMATERIAL lpMat) { - TRACE_(ddraw_thunk)("(%p)->(%p) thunking to IDirect3DMaterial3 interface.\n", iface, lpMat); + TRACE("iface %p, material %p.\n", iface, lpMat); + return IDirect3DMaterial3_SetMaterial((IDirect3DMaterial3 *)material_from_material2(iface), lpMat); } @@ -422,7 +413,8 @@ Thunk_IDirect3DMaterialImpl_1_SetMaterial(LPDIRECT3DMATERIAL iface, LPD3DMATERIAL lpMat) { - TRACE_(ddraw_thunk)("(%p)->(%p) thunking to IDirect3DMaterial3 interface.\n", iface, lpMat); + TRACE("iface %p, material %p.\n", iface, lpMat); + return IDirect3DMaterial3_SetMaterial((IDirect3DMaterial3 *)material_from_material1(iface), lpMat); } @@ -430,7 +422,8 @@ Thunk_IDirect3DMaterialImpl_2_GetMaterial(LPDIRECT3DMATERIAL2 iface, LPD3DMATERIAL lpMat) { - TRACE_(ddraw_thunk)("(%p)->(%p) thunking to IDirect3DMaterial3 interface.\n", iface, lpMat); + TRACE("iface %p, material %p.\n", iface, lpMat); + return IDirect3DMaterial3_GetMaterial((IDirect3DMaterial3 *)material_from_material2(iface), lpMat); } @@ -438,7 +431,8 @@ Thunk_IDirect3DMaterialImpl_1_GetMaterial(LPDIRECT3DMATERIAL iface, LPD3DMATERIAL lpMat) { - TRACE_(ddraw_thunk)("(%p)->(%p) thunking to IDirect3DMaterial3 interface.\n", iface, lpMat); + TRACE("iface %p, material %p.\n", iface, lpMat); + return IDirect3DMaterial3_GetMaterial((IDirect3DMaterial3 *)material_from_material1(iface), lpMat); } @@ -466,7 +460,7 @@ IDirect3DDevice7_SetMaterial((IDirect3DDevice7 *)This->active_device, &d3d7mat); } -const IDirect3DMaterial3Vtbl IDirect3DMaterial3_Vtbl = +static const struct IDirect3DMaterial3Vtbl d3d_material3_vtbl = { /*** IUnknown Methods ***/ IDirect3DMaterialImpl_QueryInterface, @@ -478,7 +472,7 @@ IDirect3DMaterialImpl_GetHandle, }; -const IDirect3DMaterial2Vtbl IDirect3DMaterial2_Vtbl = +static const struct IDirect3DMaterial2Vtbl d3d_material2_vtbl = { /*** IUnknown Methods ***/ Thunk_IDirect3DMaterialImpl_2_QueryInterface, @@ -490,7 +484,7 @@ Thunk_IDirect3DMaterialImpl_2_GetHandle, }; -const IDirect3DMaterialVtbl IDirect3DMaterial_Vtbl = +static const struct IDirect3DMaterialVtbl d3d_material1_vtbl = { /*** IUnknown Methods ***/ Thunk_IDirect3DMaterialImpl_1_QueryInterface, @@ -504,3 +498,12 @@ IDirect3DMaterialImpl_Reserve, IDirect3DMaterialImpl_Unreserve }; + +void d3d_material_init(IDirect3DMaterialImpl *material, IDirectDrawImpl *ddraw) +{ + material->lpVtbl = &d3d_material3_vtbl; + material->IDirect3DMaterial2_vtbl = &d3d_material2_vtbl; + material->IDirect3DMaterial_vtbl = &d3d_material1_vtbl; + material->ref = 1; + material->ddraw = ddraw; +} diff -Nru wine1.3-1.3.0/dlls/ddraw/palette.c wine1.3-1.3.1/dlls/ddraw/palette.c --- wine1.3-1.3.0/dlls/ddraw/palette.c 2010-07-30 18:43:56.000000000 +0100 +++ wine1.3-1.3.1/dlls/ddraw/palette.c 2010-08-20 18:23:50.000000000 +0100 @@ -18,13 +18,7 @@ */ #include "config.h" -#include "winerror.h" -#include "wine/debug.h" - -#define COBJMACROS - -#include -#include +#include "wine/port.h" #include "ddraw_private.h" @@ -49,8 +43,7 @@ REFIID refiid, void **obj) { - IDirectDrawPaletteImpl *This = (IDirectDrawPaletteImpl *)iface; - TRACE("(%p)->(%s,%p)\n",This,debugstr_guid(refiid),obj); + TRACE("iface %p, riid %s, object %p.\n", iface, debugstr_guid(refiid), obj); if (IsEqualGUID(refiid, &IID_IUnknown) || IsEqualGUID(refiid, &IID_IDirectDrawPalette)) @@ -81,7 +74,7 @@ IDirectDrawPaletteImpl *This = (IDirectDrawPaletteImpl *)iface; ULONG ref = InterlockedIncrement(&This->ref); - TRACE("(%p)->() incrementing from %u.\n", This, ref - 1); + TRACE("%p increasing refcount to %u.\n", This, ref); return ref; } @@ -101,7 +94,7 @@ IDirectDrawPaletteImpl *This = (IDirectDrawPaletteImpl *)iface; ULONG ref = InterlockedDecrement(&This->ref); - TRACE("(%p)->() decrementing from %u.\n", This, ref + 1); + TRACE("%p decreasing refcount to %u.\n", This, ref); if (ref == 0) { @@ -139,7 +132,9 @@ DWORD Flags, PALETTEENTRY *ColorTable) { - TRACE("(%p)->(%p,%x,%p)\n", iface, DD, Flags, ColorTable); + TRACE("iface %p, ddraw %p, flags %#x, entries %p.\n", + iface, DD, Flags, ColorTable); + return DDERR_ALREADYINITIALIZED; } @@ -163,7 +158,8 @@ { IDirectDrawPaletteImpl *This = (IDirectDrawPaletteImpl *)iface; HRESULT hr; - TRACE("(%p)->(%p): Relay\n", This, Caps); + + TRACE("iface %p, caps %p.\n", iface, Caps); EnterCriticalSection(&ddraw_cs); hr = IWineD3DPalette_GetCaps(This->wineD3DPalette, Caps); @@ -198,7 +194,9 @@ { IDirectDrawPaletteImpl *This = (IDirectDrawPaletteImpl *)iface; HRESULT hr; - TRACE("(%p)->(%x,%d,%d,%p): Relay\n", This, Flags, Start, Count, PalEnt); + + TRACE("iface %p, flags %#x, start %u, count %u, entries %p.\n", + iface, Flags, Start, Count, PalEnt); if(!PalEnt) return DDERR_INVALIDPARAMS; @@ -235,7 +233,9 @@ { IDirectDrawPaletteImpl *This = (IDirectDrawPaletteImpl *)iface; HRESULT hr; - TRACE("(%p)->(%x,%d,%d,%p): Relay\n", This, Flags, Start, Count, PalEnt); + + TRACE("iface %p, flags %#x, start %u, count %u, entries %p.\n", + iface, Flags, Start, Count, PalEnt); if(!PalEnt) return DDERR_INVALIDPARAMS; @@ -246,7 +246,7 @@ return hr; } -const IDirectDrawPaletteVtbl IDirectDrawPalette_Vtbl = +static const struct IDirectDrawPaletteVtbl ddraw_palette_vtbl = { /*** IUnknown ***/ IDirectDrawPaletteImpl_QueryInterface, @@ -258,3 +258,25 @@ IDirectDrawPaletteImpl_Initialize, IDirectDrawPaletteImpl_SetEntries }; + +HRESULT ddraw_palette_init(IDirectDrawPaletteImpl *palette, + IDirectDrawImpl *ddraw, DWORD flags, PALETTEENTRY *entries) +{ + HRESULT hr; + + palette->lpVtbl = &ddraw_palette_vtbl; + palette->ref = 1; + + hr = IWineD3DDevice_CreatePalette(ddraw->wineD3DDevice, flags, + entries, &palette->wineD3DPalette, (IUnknown *)palette); + if (FAILED(hr)) + { + WARN("Failed to create wined3d palette, hr %#x.\n", hr); + return hr; + } + + palette->ifaceToRelease = (IUnknown *)ddraw; + IUnknown_AddRef(palette->ifaceToRelease); + + return DD_OK; +} diff -Nru wine1.3-1.3.0/dlls/ddraw/parent.c wine1.3-1.3.1/dlls/ddraw/parent.c --- wine1.3-1.3.0/dlls/ddraw/parent.c 2010-07-30 18:43:56.000000000 +0100 +++ wine1.3-1.3.1/dlls/ddraw/parent.c 2010-08-20 18:23:50.000000000 +0100 @@ -23,23 +23,6 @@ #include "config.h" #include "wine/port.h" -#include "wine/debug.h" - -#include -#include -#include -#include - -#define COBJMACROS - -#include "windef.h" -#include "winbase.h" -#include "winerror.h" -#include "wingdi.h" -#include "wine/exception.h" - -#include "ddraw.h" -#include "d3d.h" #include "ddraw_private.h" @@ -68,7 +51,7 @@ REFIID riid, void **obj) { - TRACE("(%p)->(%s,%p)\n", iface, debugstr_guid(riid), obj); + TRACE("iface %p, riid %s, object %p.\n", iface, debugstr_guid(riid), obj); *obj = NULL; if ( IsEqualGUID( &IID_IUnknown, riid ) || @@ -98,7 +81,7 @@ IParentImpl *This = (IParentImpl *)iface; ULONG ref = InterlockedIncrement(&This->ref); - TRACE("(%p) : AddRef from %d\n", This, ref - 1); + TRACE("%p increasing refcount to %u.\n", This, ref); return ref; } @@ -122,7 +105,7 @@ IParentImpl *This = (IParentImpl *)iface; ULONG ref = InterlockedDecrement(&This->ref); - TRACE("(%p) : ReleaseRef to %d\n", This, ref); + TRACE("%p decreasing refcount to %u.\n", This, ref); if (ref == 0) { @@ -138,9 +121,15 @@ /***************************************************************************** * The VTable *****************************************************************************/ -const IParentVtbl IParent_Vtbl = +static const struct IParentVtbl ddraw_parent_vtbl = { IParentImpl_QueryInterface, IParentImpl_AddRef, IParentImpl_Release, }; + +void ddraw_parent_init(IParentImpl *parent) +{ + parent->lpVtbl = &ddraw_parent_vtbl; + parent->ref = 1; +} diff -Nru wine1.3-1.3.0/dlls/ddraw/regsvr.c wine1.3-1.3.1/dlls/ddraw/regsvr.c --- wine1.3-1.3.0/dlls/ddraw/regsvr.c 2010-07-30 18:43:56.000000000 +0100 +++ wine1.3-1.3.1/dlls/ddraw/regsvr.c 2010-08-20 18:23:50.000000000 +0100 @@ -18,20 +18,12 @@ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */ -#include -#include +#include "config.h" +#include "wine/port.h" -#include "windef.h" -#include "winbase.h" -#include "winreg.h" -#include "wingdi.h" -#include "winuser.h" -#include "winerror.h" - -#include "ddraw.h" - -#include "wine/debug.h" +#include "ddraw_private.h" #include "wine/unicode.h" +#include "winreg.h" WINE_DEFAULT_DEBUG_CHANNEL(ddraw); diff -Nru wine1.3-1.3.0/dlls/ddraw/surface.c wine1.3-1.3.1/dlls/ddraw/surface.c --- wine1.3-1.3.0/dlls/ddraw/surface.c 2010-07-30 18:43:56.000000000 +0100 +++ wine1.3-1.3.1/dlls/ddraw/surface.c 2010-08-20 18:23:50.000000000 +0100 @@ -26,28 +26,16 @@ #include "config.h" #include "wine/port.h" -#include -#include -#include -#include - -#define COBJMACROS -#define NONAMELESSUNION - -#include "windef.h" -#include "winbase.h" -#include "winerror.h" -#include "wingdi.h" -#include "wine/exception.h" - -#include "ddraw.h" -#include "d3d.h" - #include "ddraw_private.h" -#include "wine/debug.h" WINE_DEFAULT_DEBUG_CHANNEL(ddraw); +static inline IDirectDrawSurfaceImpl *surface_from_gamma_control(IDirectDrawGammaControl *iface) +{ + return (IDirectDrawSurfaceImpl *)((char*)iface + - FIELD_OFFSET(IDirectDrawSurfaceImpl, IDirectDrawGammaControl_vtbl)); +} + /***************************************************************************** * IUnknown parts follow *****************************************************************************/ @@ -74,13 +62,14 @@ { IDirectDrawSurfaceImpl *This = (IDirectDrawSurfaceImpl *)iface; + TRACE("iface %p, riid %s, object %p.\n", iface, debugstr_guid(riid), obj); + /* According to COM docs, if the QueryInterface fails, obj should be set to NULL */ *obj = NULL; if(!riid) return DDERR_INVALIDPARAMS; - TRACE("(%p)->(%s,%p)\n",This,debugstr_guid(riid),obj); if (IsEqualGUID(riid, &IID_IUnknown) || IsEqualGUID(riid, &IID_IDirectDrawSurface7) || IsEqualGUID(riid, &IID_IDirectDrawSurface4) ) @@ -153,6 +142,27 @@ return ddraw_surface7_QueryInterface((IDirectDrawSurface7 *)surface_from_surface3(iface), riid, object); } +static HRESULT WINAPI ddraw_gamma_control_QueryInterface(IDirectDrawGammaControl *iface, REFIID riid, void **object) +{ + TRACE("iface %p, riid %s, object %p.\n", iface, debugstr_guid(riid), object); + + return ddraw_surface7_QueryInterface((IDirectDrawSurface7 *)surface_from_gamma_control(iface), riid, object); +} + +static HRESULT WINAPI d3d_texture2_QueryInterface(IDirect3DTexture2 *iface, REFIID riid, void **object) +{ + TRACE("iface %p, riid %s, object %p.\n", iface, debugstr_guid(riid), object); + + return ddraw_surface7_QueryInterface((IDirectDrawSurface7 *)surface_from_texture2(iface), riid, object); +} + +static HRESULT WINAPI d3d_texture1_QueryInterface(IDirect3DTexture *iface, REFIID riid, void **object) +{ + TRACE("iface %p, riid %s, object %p.\n", iface, debugstr_guid(riid), object); + + return ddraw_surface7_QueryInterface((IDirectDrawSurface7 *)surface_from_texture1(iface), riid, object); +} + /***************************************************************************** * IDirectDrawSurface7::AddRef * @@ -167,6 +177,8 @@ IDirectDrawSurfaceImpl *This = (IDirectDrawSurfaceImpl *)iface; ULONG refCount = InterlockedIncrement(&This->ref); + TRACE("%p increasing refcount to %u.\n", This, refCount); + if (refCount == 1 && This->WineD3DSurface) { EnterCriticalSection(&ddraw_cs); @@ -174,7 +186,6 @@ LeaveCriticalSection(&ddraw_cs); } - TRACE("(%p) : AddRef increasing from %d\n", This, refCount - 1); return refCount; } @@ -185,6 +196,27 @@ return ddraw_surface7_AddRef((IDirectDrawSurface7 *)surface_from_surface3(iface)); } +static ULONG WINAPI ddraw_gamma_control_AddRef(IDirectDrawGammaControl *iface) +{ + TRACE("iface %p.\n", iface); + + return ddraw_surface7_AddRef((IDirectDrawSurface7 *)surface_from_gamma_control(iface)); +} + +static ULONG WINAPI d3d_texture2_AddRef(IDirect3DTexture2 *iface) +{ + TRACE("iface %p.\n", iface); + + return ddraw_surface7_AddRef((IDirectDrawSurface7 *)surface_from_texture2(iface)); +} + +static ULONG WINAPI d3d_texture1_AddRef(IDirect3DTexture *iface) +{ + TRACE("iface %p.\n", iface); + + return ddraw_surface7_AddRef((IDirectDrawSurface7 *)surface_from_texture1(iface)); +} + /***************************************************************************** * ddraw_surface_destroy * @@ -199,7 +231,7 @@ *****************************************************************************/ void ddraw_surface_destroy(IDirectDrawSurfaceImpl *This) { - TRACE("(%p)\n", This); + TRACE("surface %p.\n", This); /* Check the refcount and give a warning */ if(This->ref > 1) @@ -292,9 +324,9 @@ static ULONG WINAPI ddraw_surface7_Release(IDirectDrawSurface7 *iface) { IDirectDrawSurfaceImpl *This = (IDirectDrawSurfaceImpl *)iface; - ULONG ref; - TRACE("(%p) : Releasing from %d\n", This, This->ref); - ref = InterlockedDecrement(&This->ref); + ULONG ref = InterlockedDecrement(&This->ref); + + TRACE("%p decreasing refcount to %u.\n", This, ref); if (ref == 0) { @@ -420,6 +452,27 @@ return ddraw_surface7_Release((IDirectDrawSurface7 *)surface_from_surface3(iface)); } +static ULONG WINAPI ddraw_gamma_control_Release(IDirectDrawGammaControl *iface) +{ + TRACE("iface %p.\n", iface); + + return ddraw_surface7_Release((IDirectDrawSurface7 *)surface_from_gamma_control(iface)); +} + +static ULONG WINAPI d3d_texture2_Release(IDirect3DTexture2 *iface) +{ + TRACE("iface %p.\n", iface); + + return ddraw_surface7_Release((IDirectDrawSurface7 *)surface_from_texture2(iface)); +} + +static ULONG WINAPI d3d_texture1_Release(IDirect3DTexture *iface) +{ + TRACE("iface %p.\n", iface); + + return ddraw_surface7_Release((IDirectDrawSurface7 *)surface_from_texture1(iface)); +} + /***************************************************************************** * IDirectDrawSurface7::GetAttachedSurface * @@ -455,7 +508,8 @@ DDSCAPS2 our_caps; int i; - TRACE("(%p)->(%p,%p)\n", This, Caps, Surface); + TRACE("iface %p, caps %p, attachment %p.\n", iface, Caps, Surface); + EnterCriticalSection(&ddraw_cs); if(This->version < 7) @@ -583,7 +637,9 @@ IDirectDrawSurfaceImpl *This = (IDirectDrawSurfaceImpl *)iface; WINED3DLOCKED_RECT LockedRect; HRESULT hr; - TRACE("(%p)->(%p,%p,%x,%p)\n", This, Rect, DDSD, Flags, h); + + TRACE("iface %p, rect %s, surface_desc %p, flags %#x, h %p.\n", + iface, wine_dbgstr_rect(Rect), DDSD, Flags, h); if(!DDSD) return DDERR_INVALIDPARAMS; @@ -684,7 +740,8 @@ { IDirectDrawSurfaceImpl *This = (IDirectDrawSurfaceImpl *)iface; HRESULT hr; - TRACE("(%p)->(%p)\n", This, pRect); + + TRACE("iface %p, rect %s.\n", iface, wine_dbgstr_rect(pRect)); EnterCriticalSection(&ddraw_cs); hr = IWineD3DSurface_UnlockRect(This->WineD3DSurface); @@ -729,7 +786,8 @@ IDirectDrawSurfaceImpl *Override = (IDirectDrawSurfaceImpl *)DestOverride; IDirectDrawSurface7 *Override7; HRESULT hr; - TRACE("(%p)->(%p,%x)\n", This, DestOverride, Flags); + + TRACE("iface %p, dst %p, flags %#x.\n", iface, DestOverride, Flags); /* Flip has to be called from a front buffer * What about overlay surfaces, AFAIK they can flip too? @@ -797,7 +855,9 @@ IDirectDrawSurfaceImpl *This = (IDirectDrawSurfaceImpl *)iface; IDirectDrawSurfaceImpl *Src = (IDirectDrawSurfaceImpl *)SrcSurface; HRESULT hr; - TRACE("(%p)->(%p,%p,%p,%x,%p)\n", This, DestRect, Src, SrcRect, Flags, DDBltFx); + + TRACE("iface %p, dst_rect %s, src_surface %p, src_rect %p, flags %#x, fx %p.\n", + iface, wine_dbgstr_rect(DestRect), SrcSurface, wine_dbgstr_rect(SrcRect), Flags, DDBltFx); /* Check for validity of the flags here. WineD3D Has the software-opengl selection path and would have * to check at 2 places, and sometimes do double checks. This also saves the call to wined3d :-) @@ -920,7 +980,7 @@ *****************************************************************************/ static HRESULT WINAPI ddraw_surface_attach_surface(IDirectDrawSurfaceImpl *This, IDirectDrawSurfaceImpl *Surf) { - TRACE("(%p)->(%p)\n", This, Surf); + TRACE("surface %p, attachment %p.\n", This, Surf); if(Surf == This) return DDERR_CANNOTATTACHSURFACE; /* unchecked */ @@ -960,6 +1020,8 @@ IDirectDrawSurfaceImpl *This = (IDirectDrawSurfaceImpl *)iface; IDirectDrawSurfaceImpl *Surf = (IDirectDrawSurfaceImpl *)Attach; + TRACE("iface %p, attachment %p.\n", iface, Attach); + /* Version 7 of this interface seems to refuse everything except z buffers, as per msdn */ if(!(Surf->surface_desc.ddsCaps.dwCaps & DDSCAPS_ZBUFFER)) { @@ -1031,7 +1093,8 @@ IDirectDrawSurfaceImpl *This = (IDirectDrawSurfaceImpl *)iface; IDirectDrawSurfaceImpl *Surf = (IDirectDrawSurfaceImpl *)Attach; IDirectDrawSurfaceImpl *Prev = This; - TRACE("(%p)->(%08x,%p)\n", This, Flags, Surf); + + TRACE("iface %p, flags %#x, attachment %p.\n", iface, Flags, Attach); EnterCriticalSection(&ddraw_cs); if (!Surf || (Surf->first_attached != This) || (Surf == This) ) @@ -1098,16 +1161,8 @@ *****************************************************************************/ static HRESULT WINAPI ddraw_surface7_AddOverlayDirtyRect(IDirectDrawSurface7 *iface, RECT *Rect) { - IDirectDrawSurfaceImpl *This = (IDirectDrawSurfaceImpl *)iface; - TRACE("(%p)->(%p)\n",This,Rect); + TRACE("iface %p, rect %s.\n", iface, wine_dbgstr_rect(Rect)); - /* MSDN says it's not implemented. I could forward it to WineD3D, - * then we'd implement it, but I don't think that's a good idea - * (Stefan Dösinger) - */ -#if 0 - return IWineD3DSurface_AddOverlayDirtyRect(This->WineD3DSurface, pRect); -#endif return DDERR_UNSUPPORTED; /* unchecked */ } @@ -1136,7 +1191,8 @@ { IDirectDrawSurfaceImpl *This = (IDirectDrawSurfaceImpl *)iface; HRESULT hr; - TRACE("(%p)->(%p): Relay\n", This, hdc); + + TRACE("iface %p, dc %p.\n", iface, hdc); if(!hdc) return DDERR_INVALIDPARAMS; @@ -1182,7 +1238,8 @@ { IDirectDrawSurfaceImpl *This = (IDirectDrawSurfaceImpl *)iface; HRESULT hr; - TRACE("(%p)->(%p): Relay\n", This, hdc); + + TRACE("iface %p, dc %p.\n", iface, hdc); EnterCriticalSection(&ddraw_cs); hr = IWineD3DSurface_ReleaseDC(This->WineD3DSurface, hdc); @@ -1213,7 +1270,8 @@ static HRESULT WINAPI ddraw_surface7_GetCaps(IDirectDrawSurface7 *iface, DDSCAPS2 *Caps) { IDirectDrawSurfaceImpl *This = (IDirectDrawSurfaceImpl *)iface; - TRACE("(%p)->(%p)\n",This,Caps); + + TRACE("iface %p, caps %p.\n", iface, Caps); if(!Caps) return DDERR_INVALIDPARAMS; @@ -1253,7 +1311,8 @@ { IDirectDrawSurfaceImpl *This = (IDirectDrawSurfaceImpl *)iface; HRESULT hr; - TRACE("(%p)->(%d): Relay!\n",This,Priority); + + TRACE("iface %p, priority %u.\n", iface, Priority); EnterCriticalSection(&ddraw_cs); hr = IWineD3DSurface_SetPriority(This->WineD3DSurface, Priority); @@ -1278,7 +1337,8 @@ static HRESULT WINAPI ddraw_surface7_GetPriority(IDirectDrawSurface7 *iface, DWORD *Priority) { IDirectDrawSurfaceImpl *This = (IDirectDrawSurfaceImpl *)iface; - TRACE("(%p)->(%p): Relay\n",This,Priority); + + TRACE("iface %p, priority %p.\n", iface, Priority); if(!Priority) { @@ -1313,7 +1373,9 @@ { IDirectDrawSurfaceImpl *This = (IDirectDrawSurfaceImpl *)iface; HRESULT hr; - TRACE("(%p)->(%s,%p,%d,%x): Relay\n", This, debugstr_guid(tag), Data, Size, Flags); + + TRACE("iface %p, tag %s, data %p, data_size %u, flags %#x.\n", + iface, debugstr_guid(tag), Data, Size, Flags); EnterCriticalSection(&ddraw_cs); hr = IWineD3DSurface_SetPrivateData(This->WineD3DSurface, @@ -1349,7 +1411,9 @@ { IDirectDrawSurfaceImpl *This = (IDirectDrawSurfaceImpl *)iface; HRESULT hr; - TRACE("(%p)->(%s,%p,%p): Relay\n", This, debugstr_guid(tag), Data, Size); + + TRACE("iface %p, tag %s, data %p, data_size %p.\n", + iface, debugstr_guid(tag), Data, Size); if(!Data) return DDERR_INVALIDPARAMS; @@ -1380,7 +1444,8 @@ { IDirectDrawSurfaceImpl *This = (IDirectDrawSurfaceImpl *)iface; HRESULT hr; - TRACE("(%p)->(%s): Relay\n", This, debugstr_guid(tag)); + + TRACE("iface %p, tag %s.\n", iface, debugstr_guid(tag)); EnterCriticalSection(&ddraw_cs); hr = IWineD3DSurface_FreePrivateData(This->WineD3DSurface, tag); @@ -1402,7 +1467,7 @@ *****************************************************************************/ static HRESULT WINAPI ddraw_surface7_PageLock(IDirectDrawSurface7 *iface, DWORD Flags) { - TRACE("(%p)->(%x)\n", iface, Flags); + TRACE("iface %p, flags %#x.\n", iface, Flags); /* This is Windows memory management related - we don't need this */ return DD_OK; @@ -1429,7 +1494,7 @@ *****************************************************************************/ static HRESULT WINAPI ddraw_surface7_PageUnlock(IDirectDrawSurface7 *iface, DWORD Flags) { - TRACE("(%p)->(%x)\n", iface, Flags); + TRACE("iface %p, flags %#x.\n", iface, Flags); return DD_OK; } @@ -1455,7 +1520,7 @@ *****************************************************************************/ static HRESULT WINAPI ddraw_surface7_BltBatch(IDirectDrawSurface7 *iface, DDBLTBATCH *Batch, DWORD Count, DWORD Flags) { - TRACE("(%p)->(%p,%d,%08x)\n",iface,Batch,Count,Flags); + TRACE("iface %p, batch %p, count %u, flags %#x.\n", iface, Batch, Count, Flags); /* MSDN: "not currently implemented" */ return DDERR_UNSUPPORTED; @@ -1491,7 +1556,7 @@ int i; /* Attached surfaces aren't handled in WineD3D */ - TRACE("(%p)->(%p,%p)\n",This,context,cb); + TRACE("iface %p, context %p, callback %p.\n", iface, context, cb); if(!cb) return DDERR_INVALIDPARAMS; @@ -1575,7 +1640,7 @@ static HRESULT WINAPI ddraw_surface7_EnumOverlayZOrders(IDirectDrawSurface7 *iface, DWORD Flags, void *context, LPDDENUMSURFACESCALLBACK7 cb) { - FIXME("(%p)->(%x,%p,%p): Stub!\n", iface, Flags, context, cb); + FIXME("iface %p, flags %#x, context %p, callback %p stub!\n", iface, Flags, context, cb); return DD_OK; } @@ -1610,7 +1675,8 @@ { IDirectDrawSurfaceImpl *This = (IDirectDrawSurfaceImpl *)iface; HRESULT hr; - TRACE("(%p)->(%x): Relay\n", This, Flags); + + TRACE("iface %p, flags %#x.\n", iface, Flags); EnterCriticalSection(&ddraw_cs); hr = IWineD3DSurface_GetBltStatus(This->WineD3DSurface, Flags); @@ -1646,7 +1712,8 @@ static HRESULT WINAPI ddraw_surface7_GetColorKey(IDirectDrawSurface7 *iface, DWORD Flags, DDCOLORKEY *CKey) { IDirectDrawSurfaceImpl *This = (IDirectDrawSurfaceImpl *)iface; - TRACE("(%p)->(%08x,%p)\n", This, Flags, CKey); + + TRACE("iface %p, flags %#x, color_key %p.\n", iface, Flags, CKey); if(!CKey) return DDERR_INVALIDPARAMS; @@ -1723,7 +1790,8 @@ { IDirectDrawSurfaceImpl *This = (IDirectDrawSurfaceImpl *)iface; HRESULT hr; - TRACE("(%p)->(%x): Relay\n", This, Flags); + + TRACE("iface %p, flags %#x.\n", iface, Flags); EnterCriticalSection(&ddraw_cs); hr = IWineD3DSurface_GetFlipStatus(This->WineD3DSurface, Flags); @@ -1758,7 +1826,8 @@ { IDirectDrawSurfaceImpl *This = (IDirectDrawSurfaceImpl *)iface; HRESULT hr; - TRACE("(%p)->(%p,%p): Relay\n", This, X, Y); + + TRACE("iface %p, x %p, y %p.\n", iface, X, Y); EnterCriticalSection(&ddraw_cs); hr = IWineD3DSurface_GetOverlayPosition(This->WineD3DSurface, @@ -1793,7 +1862,8 @@ { /* What is DDERR_INVALIDSURFACETYPE for here? */ IDirectDrawSurfaceImpl *This = (IDirectDrawSurfaceImpl *)iface; - TRACE("(%p)->(%p)\n",This,PixelFormat); + + TRACE("iface %p, pixel_format %p.\n", iface, PixelFormat); if(!PixelFormat) return DDERR_INVALIDPARAMS; @@ -1830,7 +1900,7 @@ { IDirectDrawSurfaceImpl *This = (IDirectDrawSurfaceImpl *)iface; - TRACE("(%p)->(%p)\n",This,DDSD); + TRACE("iface %p, surface_desc %p.\n", iface, DDSD); if(!DDSD) return DDERR_INVALIDPARAMS; @@ -1908,6 +1978,26 @@ } /***************************************************************************** + * IDirect3DTexture1::Initialize + * + * The sdk says it's not implemented + * + * Params: + * ? + * + * Returns + * DDERR_UNSUPPORTED + * + *****************************************************************************/ +static HRESULT WINAPI d3d_texture1_Initialize(IDirect3DTexture *iface, + IDirect3DDevice *device, IDirectDrawSurface *surface) +{ + TRACE("iface %p, device %p, surface %p.\n", iface, device, surface); + + return DDERR_UNSUPPORTED; /* Unchecked */ +} + +/***************************************************************************** * IDirectDrawSurface7::IsLost * * Checks if the surface is lost @@ -1922,7 +2012,8 @@ { IDirectDrawSurfaceImpl *This = (IDirectDrawSurfaceImpl *)iface; HRESULT hr; - TRACE("(%p)\n", This); + + TRACE("iface %p.\n", iface); EnterCriticalSection(&ddraw_cs); /* We lose the surface if the implementation was changed */ @@ -1971,7 +2062,8 @@ { IDirectDrawSurfaceImpl *This = (IDirectDrawSurfaceImpl *)iface; HRESULT hr; - TRACE("(%p)\n", This); + + TRACE("iface %p.\n", iface); EnterCriticalSection(&ddraw_cs); if(This->ImplType != This->ddraw->ImplType) @@ -2008,7 +2100,8 @@ { IDirectDrawSurfaceImpl *This = (IDirectDrawSurfaceImpl *)iface; HRESULT hr; - TRACE("(%p)->(%d,%d): Relay\n", This, X, Y); + + TRACE("iface %p, x %d, y %d.\n", iface, X, Y); EnterCriticalSection(&ddraw_cs); hr = IWineD3DSurface_SetOverlayPosition(This->WineD3DSurface, @@ -2046,7 +2139,9 @@ IDirectDrawSurfaceImpl *This = (IDirectDrawSurfaceImpl *)iface; IDirectDrawSurfaceImpl *Dst = (IDirectDrawSurfaceImpl *)DstSurface; HRESULT hr; - TRACE("(%p)->(%p,%p,%p,%x,%p): Relay\n", This, SrcRect, Dst, DstRect, Flags, FX); + + TRACE("iface %p, src_rect %s, dst_surface %p, dst_rect %s, flags %#x, fx %p.\n", + iface, wine_dbgstr_rect(SrcRect), DstSurface, wine_dbgstr_rect(DstRect), Flags, FX); EnterCriticalSection(&ddraw_cs); hr = IWineD3DSurface_UpdateOverlay(This->WineD3DSurface, @@ -2088,8 +2183,8 @@ *****************************************************************************/ static HRESULT WINAPI ddraw_surface7_UpdateOverlayDisplay(IDirectDrawSurface7 *iface, DWORD Flags) { - IDirectDrawSurfaceImpl *This = (IDirectDrawSurfaceImpl *)iface; - TRACE("(%p)->(%x)\n", This, Flags); + TRACE("iface %p, flags %#x.\n", iface, Flags); + return DDERR_UNSUPPORTED; } @@ -2120,7 +2215,8 @@ IDirectDrawSurfaceImpl *Ref = (IDirectDrawSurfaceImpl *)DDSRef; HRESULT hr; - TRACE("(%p)->(%x,%p): Relay\n", This, Flags, Ref); + TRACE("iface %p, flags %#x, reference %p.\n", iface, Flags, DDSRef); + EnterCriticalSection(&ddraw_cs); hr = IWineD3DSurface_UpdateOverlayZOrder(This->WineD3DSurface, Flags, @@ -2156,7 +2252,7 @@ { IDirectDrawSurfaceImpl *This = (IDirectDrawSurfaceImpl *)iface; - TRACE("(%p)->(%p)\n",This,DD); + TRACE("iface %p, ddraw %p.\n", iface, DD); if(!DD) return DDERR_INVALIDPARAMS; @@ -2198,7 +2294,8 @@ IDirectDrawSurfaceImpl *This = (IDirectDrawSurfaceImpl *)iface; volatile IDirectDrawSurfaceImpl* vThis = This; - TRACE("(%p)\n",This); + TRACE("iface %p.\n", iface); + EnterCriticalSection(&ddraw_cs); /* A uniqueness value of 0 is apparently special. * This needs to be checked. @@ -2226,7 +2323,8 @@ { IDirectDrawSurfaceImpl *This = (IDirectDrawSurfaceImpl *)iface; - TRACE("(%p)->(%p)\n",This,pValue); + TRACE("iface %p, value %p.\n", iface, pValue); + EnterCriticalSection(&ddraw_cs); *pValue = This->uniqueness_value; LeaveCriticalSection(&ddraw_cs); @@ -2250,7 +2348,8 @@ { IDirectDrawSurfaceImpl *This = (IDirectDrawSurfaceImpl *)iface; HRESULT hr; - TRACE("(%p)->(%d)\n", This, MaxLOD); + + TRACE("iface %p, lod %u.\n", iface, MaxLOD); EnterCriticalSection(&ddraw_cs); if (!(This->surface_desc.ddsCaps.dwCaps2 & DDSCAPS2_TEXTUREMANAGE)) @@ -2289,7 +2388,8 @@ static HRESULT WINAPI ddraw_surface7_GetLOD(IDirectDrawSurface7 *iface, DWORD *MaxLOD) { IDirectDrawSurfaceImpl *This = (IDirectDrawSurfaceImpl *)iface; - TRACE("(%p)->(%p)\n", This, MaxLOD); + + TRACE("iface %p, lod %p.\n", iface, MaxLOD); if(!MaxLOD) return DDERR_INVALIDPARAMS; @@ -2330,7 +2430,9 @@ IDirectDrawSurfaceImpl *src = (IDirectDrawSurfaceImpl *)Source; DWORD src_w, src_h, dst_w, dst_h; HRESULT hr; - TRACE("(%p)->(%d,%d,%p,%p,%d): Relay\n", This, dstx, dsty, Source, rsrc, trans); + + TRACE("iface %p, dst_x %u, dst_y %u, src_surface %p, src_rect %s, flags %#x.\n", + iface, dstx, dsty, Source, wine_dbgstr_rect(rsrc), trans); dst_w = This->surface_desc.dwWidth; dst_h = This->surface_desc.dwHeight; @@ -2407,7 +2509,8 @@ static HRESULT WINAPI ddraw_surface7_GetClipper(IDirectDrawSurface7 *iface, IDirectDrawClipper **Clipper) { IDirectDrawSurfaceImpl *This = (IDirectDrawSurfaceImpl *)iface; - TRACE("(%p)->(%p)\n", This, Clipper); + + TRACE("iface %p, clipper %p.\n", iface, Clipper); if(!Clipper) { @@ -2453,7 +2556,8 @@ IDirectDrawClipperImpl *oldClipper = This->clipper; HWND clipWindow; HRESULT hr; - TRACE("(%p)->(%p)\n",This,Clipper); + + TRACE("iface %p, clipper %p.\n", iface, Clipper); EnterCriticalSection(&ddraw_cs); if ((IDirectDrawClipperImpl *)Clipper == This->clipper) @@ -2518,7 +2622,8 @@ IDirectDrawSurfaceImpl *This = (IDirectDrawSurfaceImpl *)iface; WINED3DFORMAT newFormat = WINED3DFMT_UNKNOWN; HRESULT hr; - TRACE("(%p)->(%p,%x)\n", This, DDSD, Flags); + + TRACE("iface %p, surface_desc %p, flags %#x.\n", iface, DDSD, Flags); if(!DDSD) return DDERR_INVALIDPARAMS; @@ -2620,7 +2725,8 @@ IDirectDrawSurfaceImpl *This = (IDirectDrawSurfaceImpl *)iface; IWineD3DPalette *wPal; HRESULT hr; - TRACE("(%p)->(%p): Relay\n", This, Pal); + + TRACE("iface %p, palette %p.\n", iface, Pal); if(!Pal) return DDERR_INVALIDPARAMS; @@ -2713,7 +2819,8 @@ IDirectDrawSurfaceImpl *This = (IDirectDrawSurfaceImpl *)iface; DDCOLORKEY FixedCKey; struct SCKContext ctx = { DD_OK, (WINEDDCOLORKEY *) (CKey ? &FixedCKey : NULL), Flags }; - TRACE("(%p)->(%x,%p)\n", This, Flags, CKey); + + TRACE("iface %p, flags %#x, color_key %p.\n", iface, Flags, CKey); EnterCriticalSection(&ddraw_cs); if (CKey) @@ -2811,7 +2918,8 @@ IDirectDrawSurfaceImpl *surf; IDirectDrawPaletteImpl *PalImpl = (IDirectDrawPaletteImpl *)Pal; HRESULT hr; - TRACE("(%p)->(%p)\n", This, Pal); + + TRACE("iface %p, palette %p.\n", iface, Pal); if (!(This->surface_desc.u4.ddpfPixelFormat.dwFlags & (DDPF_PALETTEINDEXED1 | DDPF_PALETTEINDEXED2 | DDPF_PALETTEINDEXED4 | DDPF_PALETTEINDEXED8 | DDPF_PALETTEINDEXEDTO8))) { @@ -2874,11 +2982,409 @@ return ddraw_surface7_SetPalette((IDirectDrawSurface7 *)surface_from_surface3(iface), palette); } +/********************************************************** + * IDirectDrawGammaControl::GetGammaRamp + * + * Returns the current gamma ramp for a surface + * + * Params: + * flags: Ignored + * gamma_ramp: Address to write the ramp to + * + * Returns: + * DD_OK on success + * DDERR_INVALIDPARAMS if gamma_ramp is NULL + * + **********************************************************/ +static HRESULT WINAPI ddraw_gamma_control_GetGammaRamp(IDirectDrawGammaControl *iface, + DWORD flags, DDGAMMARAMP *gamma_ramp) +{ + IDirectDrawSurfaceImpl *surface = surface_from_gamma_control(iface); + + TRACE("iface %p, flags %#x, gamma_ramp %p.\n", iface, flags, gamma_ramp); + + if (!gamma_ramp) + { + WARN("Invalid gamma_ramp passed.\n"); + return DDERR_INVALIDPARAMS; + } + + EnterCriticalSection(&ddraw_cs); + if (surface->surface_desc.ddsCaps.dwCaps & DDSCAPS_PRIMARYSURFACE) + { + /* Note: DDGAMMARAMP is compatible with WINED3DGAMMARAMP. */ + IWineD3DDevice_GetGammaRamp(surface->ddraw->wineD3DDevice, 0, (WINED3DGAMMARAMP *)gamma_ramp); + } + else + { + ERR("Not implemented for non-primary surfaces.\n"); + } + LeaveCriticalSection(&ddraw_cs); + + return DD_OK; +} + +/********************************************************** + * IDirectDrawGammaControl::SetGammaRamp + * + * Sets the red, green and blue gamma ramps for + * + * Params: + * flags: Can be DDSGR_CALIBRATE to request calibration + * gamma_ramp: Structure containing the new gamma ramp + * + * Returns: + * DD_OK on success + * DDERR_INVALIDPARAMS if gamma_ramp is NULL + * + **********************************************************/ +static HRESULT WINAPI ddraw_gamma_control_SetGammaRamp(IDirectDrawGammaControl *iface, + DWORD flags, DDGAMMARAMP *gamma_ramp) +{ + IDirectDrawSurfaceImpl *surface = surface_from_gamma_control(iface); + + TRACE("iface %p, flags %#x, gamma_ramp %p.\n", iface, flags, gamma_ramp); + + if (!gamma_ramp) + { + WARN("Invalid gamma_ramp passed.\n"); + return DDERR_INVALIDPARAMS; + } + + EnterCriticalSection(&ddraw_cs); + if (surface->surface_desc.ddsCaps.dwCaps & DDSCAPS_PRIMARYSURFACE) + { + /* Note: DDGAMMARAMP is compatible with WINED3DGAMMARAMP */ + IWineD3DDevice_SetGammaRamp(surface->ddraw->wineD3DDevice, 0, flags, (WINED3DGAMMARAMP *)gamma_ramp); + } + else + { + ERR("Not implemented for non-primary surfaces.\n"); + } + LeaveCriticalSection(&ddraw_cs); + + return DD_OK; +} + +/***************************************************************************** + * IDirect3DTexture2::PaletteChanged + * + * Informs the texture about a palette change + * + * Params: + * start: Start index of the change + * count: The number of changed entries + * + * Returns + * D3D_OK, because it's a stub + * + *****************************************************************************/ +static HRESULT WINAPI d3d_texture2_PaletteChanged(IDirect3DTexture2 *iface, DWORD start, DWORD count) +{ + FIXME("iface %p, start %u, count %u stub!\n", iface, start, count); + + return D3D_OK; +} + +static HRESULT WINAPI d3d_texture1_PaletteChanged(IDirect3DTexture *iface, DWORD start, DWORD count) +{ + IDirectDrawSurfaceImpl *surface = surface_from_texture1(iface); + + TRACE("iface %p, start %u, count %u.\n", iface, start, count); + + return d3d_texture2_PaletteChanged((IDirect3DTexture2 *)&surface->IDirect3DTexture2_vtbl, start, count); +} + +/***************************************************************************** + * IDirect3DTexture::Unload + * + * DX5 SDK: "The IDirect3DTexture2::Unload method is not implemented + * + * + * Returns: + * DDERR_UNSUPPORTED + * + *****************************************************************************/ +static HRESULT WINAPI d3d_texture1_Unload(IDirect3DTexture *iface) +{ + WARN("iface %p. Not implemented.\n", iface); + + return DDERR_UNSUPPORTED; +} + +/***************************************************************************** + * IDirect3DTexture2::GetHandle + * + * Returns handle for the texture. At the moment, the interface + * to the IWineD3DTexture is used. + * + * Params: + * device: Device this handle is assigned to + * handle: Address to store the handle at. + * + * Returns: + * D3D_OK + * + *****************************************************************************/ +static HRESULT WINAPI d3d_texture2_GetHandle(IDirect3DTexture2 *iface, + IDirect3DDevice2 *device, D3DTEXTUREHANDLE *handle) +{ + IDirectDrawSurfaceImpl *surface = surface_from_texture2(iface); + + TRACE("iface %p, device %p, handle %p.\n", iface, device, handle); + + EnterCriticalSection(&ddraw_cs); + + if (!surface->Handle) + { + DWORD h = ddraw_allocate_handle(&device_from_device2(device)->handle_table, surface, DDRAW_HANDLE_SURFACE); + if (h == DDRAW_INVALID_HANDLE) + { + ERR("Failed to allocate a texture handle.\n"); + LeaveCriticalSection(&ddraw_cs); + return DDERR_OUTOFMEMORY; + } + + surface->Handle = h + 1; + } + + TRACE("Returning handle %08x.\n", surface->Handle); + *handle = surface->Handle; + + LeaveCriticalSection(&ddraw_cs); + + return D3D_OK; +} + +static HRESULT WINAPI d3d_texture1_GetHandle(IDirect3DTexture *iface, + IDirect3DDevice *device, D3DTEXTUREHANDLE *handle) +{ + IDirect3DTexture2 *texture2 = (IDirect3DTexture2 *)&surface_from_texture1(iface)->IDirect3DTexture2_vtbl; + IDirect3DDevice2 *device2 = (IDirect3DDevice2 *)&device_from_device1(device)->IDirect3DDevice2_vtbl; + + TRACE("iface %p, device %p, handle %p.\n", iface, device, handle); + + return d3d_texture2_GetHandle(texture2, device2, handle); +} + +/***************************************************************************** + * get_sub_mimaplevel + * + * Helper function that returns the next mipmap level + * + * tex_ptr: Surface of which to return the next level + * + *****************************************************************************/ +static IDirectDrawSurfaceImpl *get_sub_mimaplevel(IDirectDrawSurfaceImpl *surface) +{ + /* Now go down the mipmap chain to the next surface */ + static DDSCAPS2 mipmap_caps = { DDSCAPS_MIPMAP | DDSCAPS_TEXTURE, 0, 0, 0 }; + IDirectDrawSurface7 *next_level; + HRESULT hr; + + hr = ddraw_surface7_GetAttachedSurface((IDirectDrawSurface7 *)surface, &mipmap_caps, &next_level); + if (FAILED(hr)) return NULL; + + ddraw_surface7_Release(next_level); + + return (IDirectDrawSurfaceImpl *)next_level; +} + +/***************************************************************************** + * IDirect3DTexture2::Load + * + * Loads a texture created with the DDSCAPS_ALLOCONLOAD + * + * This function isn't relayed to WineD3D because the whole interface is + * implemented in DDraw only. For speed improvements a implementation which + * takes OpenGL more into account could be placed into WineD3D. + * + * Params: + * src_texture: Address of the texture to load + * + * Returns: + * D3D_OK on success + * D3DERR_TEXTURE_LOAD_FAILED. + * + *****************************************************************************/ +static HRESULT WINAPI d3d_texture2_Load(IDirect3DTexture2 *iface, IDirect3DTexture2 *src_texture) +{ + IDirectDrawSurfaceImpl *dst_surface = surface_from_texture2(iface); + IDirectDrawSurfaceImpl *src_surface = surface_from_texture2(src_texture); + HRESULT hr; + + TRACE("iface %p, src_texture %p.\n", iface, src_texture); + + if (src_surface == dst_surface) + { + TRACE("copying surface %p to surface %p, why?\n", src_surface, dst_surface); + return D3D_OK; + } + + EnterCriticalSection(&ddraw_cs); + + if (((src_surface->surface_desc.ddsCaps.dwCaps & DDSCAPS_MIPMAP) + != (dst_surface->surface_desc.ddsCaps.dwCaps & DDSCAPS_MIPMAP)) + || (src_surface->surface_desc.u2.dwMipMapCount != dst_surface->surface_desc.u2.dwMipMapCount)) + { + ERR("Trying to load surfaces with different mip-map counts.\n"); + } + + for (;;) + { + IWineD3DPalette *wined3d_dst_pal, *wined3d_src_pal; + IDirectDrawPalette *dst_pal = NULL, *src_pal = NULL; + DDSURFACEDESC *src_desc, *dst_desc; + + TRACE("Copying surface %p to surface %p (mipmap level %d).\n", + src_surface, dst_surface, src_surface->mipmap_level); + + /* Suppress the ALLOCONLOAD flag */ + dst_surface->surface_desc.ddsCaps.dwCaps &= ~DDSCAPS_ALLOCONLOAD; + + /* Get the palettes */ + hr = IWineD3DSurface_GetPalette(dst_surface->WineD3DSurface, &wined3d_dst_pal); + if (FAILED(hr)) + { + ERR("Failed to get destination palette, hr %#x.\n", hr); + LeaveCriticalSection(&ddraw_cs); + return D3DERR_TEXTURE_LOAD_FAILED; + } + if (wined3d_dst_pal) + { + hr = IWineD3DPalette_GetParent(wined3d_dst_pal, (IUnknown **)&dst_pal); + if (FAILED(hr)) + { + ERR("Failed to get destination palette parent, hr %#x.\n", hr); + LeaveCriticalSection(&ddraw_cs); + return D3DERR_TEXTURE_LOAD_FAILED; + } + } + + hr = IWineD3DSurface_GetPalette(src_surface->WineD3DSurface, &wined3d_src_pal); + if (FAILED(hr)) + { + ERR("Failed to get source palette, hr %#x.\n", hr); + LeaveCriticalSection(&ddraw_cs); + return D3DERR_TEXTURE_LOAD_FAILED; + } + if (wined3d_src_pal) + { + hr = IWineD3DPalette_GetParent(wined3d_src_pal, (IUnknown **)&src_pal); + if (FAILED(hr)) + { + ERR("Failed to get source palette parent, hr %#x.\n", hr); + if (dst_pal) IDirectDrawPalette_Release(dst_pal); + LeaveCriticalSection(&ddraw_cs); + return D3DERR_TEXTURE_LOAD_FAILED; + } + } + + if (src_pal) + { + PALETTEENTRY palent[256]; + + if (!dst_pal) + { + IDirectDrawPalette_Release(src_pal); + LeaveCriticalSection(&ddraw_cs); + return DDERR_NOPALETTEATTACHED; + } + IDirectDrawPalette_GetEntries(src_pal, 0, 0, 256, palent); + IDirectDrawPalette_SetEntries(dst_pal, 0, 0, 256, palent); + } + + if (dst_pal) IDirectDrawPalette_Release(dst_pal); + if (src_pal) IDirectDrawPalette_Release(src_pal); + + /* Copy one surface on the other */ + dst_desc = (DDSURFACEDESC *)&(dst_surface->surface_desc); + src_desc = (DDSURFACEDESC *)&(src_surface->surface_desc); + + if ((src_desc->dwWidth != dst_desc->dwWidth) || (src_desc->dwHeight != dst_desc->dwHeight)) + { + /* Should also check for same pixel format, u1.lPitch, ... */ + ERR("Error in surface sizes.\n"); + LeaveCriticalSection(&ddraw_cs); + return D3DERR_TEXTURE_LOAD_FAILED; + } + else + { + WINED3DLOCKED_RECT src_rect, dst_rect; + + /* Copy also the ColorKeying stuff */ + if (src_desc->dwFlags & DDSD_CKSRCBLT) + { + dst_desc->dwFlags |= DDSD_CKSRCBLT; + dst_desc->ddckCKSrcBlt.dwColorSpaceLowValue = src_desc->ddckCKSrcBlt.dwColorSpaceLowValue; + dst_desc->ddckCKSrcBlt.dwColorSpaceHighValue = src_desc->ddckCKSrcBlt.dwColorSpaceHighValue; + } + + /* Copy the main memory texture into the surface that corresponds + * to the OpenGL texture object. */ + + hr = IWineD3DSurface_LockRect(src_surface->WineD3DSurface, &src_rect, NULL, 0); + if (FAILED(hr)) + { + ERR("Failed to lock source surface, hr %#x.\n", hr); + LeaveCriticalSection(&ddraw_cs); + return D3DERR_TEXTURE_LOAD_FAILED; + } + + hr = IWineD3DSurface_LockRect(dst_surface->WineD3DSurface, &dst_rect, NULL, 0); + if (FAILED(hr)) + { + ERR("Failed to lock destination surface, hr %#x.\n", hr); + IWineD3DSurface_UnlockRect(src_surface->WineD3DSurface); + LeaveCriticalSection(&ddraw_cs); + return D3DERR_TEXTURE_LOAD_FAILED; + } + + if (dst_surface->surface_desc.u4.ddpfPixelFormat.dwFlags & DDPF_FOURCC) + memcpy(dst_rect.pBits, src_rect.pBits, src_surface->surface_desc.u1.dwLinearSize); + else + memcpy(dst_rect.pBits, src_rect.pBits, src_rect.Pitch * src_desc->dwHeight); + + IWineD3DSurface_UnlockRect(src_surface->WineD3DSurface); + IWineD3DSurface_UnlockRect(dst_surface->WineD3DSurface); + } + + if (src_surface->surface_desc.ddsCaps.dwCaps & DDSCAPS_MIPMAP) + src_surface = get_sub_mimaplevel(src_surface); + else + src_surface = NULL; + + if (dst_surface->surface_desc.ddsCaps.dwCaps & DDSCAPS_MIPMAP) + dst_surface = get_sub_mimaplevel(dst_surface); + else + dst_surface = NULL; + + if (!src_surface || !dst_surface) + { + if (src_surface != dst_surface) + ERR("Loading surface with different mipmap structure.\n"); + break; + } + } + + LeaveCriticalSection(&ddraw_cs); + + return hr; +} + +static HRESULT WINAPI d3d_texture1_Load(IDirect3DTexture *iface, IDirect3DTexture *src_texture) +{ + TRACE("iface %p, src_texture %p.\n", iface, src_texture); + + return d3d_texture2_Load((IDirect3DTexture2 *)&surface_from_texture1(iface)->IDirect3DTexture2_vtbl, + src_texture ? (IDirect3DTexture2 *)&surface_from_texture1(src_texture)->IDirect3DTexture2_vtbl : NULL); +} + /***************************************************************************** * The VTable *****************************************************************************/ -const IDirectDrawSurface7Vtbl IDirectDrawSurface7_Vtbl = +static const struct IDirectDrawSurface7Vtbl ddraw_surface7_vtbl = { /* IUnknown */ ddraw_surface7_QueryInterface, @@ -2937,7 +3443,7 @@ ddraw_surface7_GetLOD, }; -const IDirectDrawSurface3Vtbl IDirectDrawSurface3_Vtbl = +static const struct IDirectDrawSurface3Vtbl ddraw_surface3_vtbl = { /* IUnknown */ ddraw_surface3_QueryInterface, @@ -2984,3 +3490,191 @@ /* IDirectDrawSurface3 */ ddraw_surface3_SetSurfaceDesc, }; + +static const struct IDirectDrawGammaControlVtbl ddraw_gamma_control_vtbl = +{ + ddraw_gamma_control_QueryInterface, + ddraw_gamma_control_AddRef, + ddraw_gamma_control_Release, + ddraw_gamma_control_GetGammaRamp, + ddraw_gamma_control_SetGammaRamp, +}; + +static const struct IDirect3DTexture2Vtbl d3d_texture2_vtbl = +{ + d3d_texture2_QueryInterface, + d3d_texture2_AddRef, + d3d_texture2_Release, + d3d_texture2_GetHandle, + d3d_texture2_PaletteChanged, + d3d_texture2_Load, +}; + +static const struct IDirect3DTextureVtbl d3d_texture1_vtbl = +{ + d3d_texture1_QueryInterface, + d3d_texture1_AddRef, + d3d_texture1_Release, + d3d_texture1_Initialize, + d3d_texture1_GetHandle, + d3d_texture1_PaletteChanged, + d3d_texture1_Load, + d3d_texture1_Unload, +}; + +HRESULT ddraw_surface_init(IDirectDrawSurfaceImpl *surface, IDirectDrawImpl *ddraw, + DDSURFACEDESC2 *desc, UINT mip_level, WINED3DSURFTYPE surface_type) +{ + WINED3DPOOL pool = WINED3DPOOL_DEFAULT; + WINED3DSURFACE_DESC wined3d_desc; + WINED3DFORMAT format; + DWORD usage = 0; + HRESULT hr; + + if (!(desc->ddsCaps.dwCaps & (DDSCAPS_VIDEOMEMORY | DDSCAPS_SYSTEMMEMORY)) + && !((desc->ddsCaps.dwCaps & DDSCAPS_TEXTURE) + && (desc->ddsCaps.dwCaps2 & DDSCAPS2_TEXTUREMANAGE))) + { + /* Tests show surfaces without memory flags get these flags added + * right after creation. */ + desc->ddsCaps.dwCaps |= DDSCAPS_LOCALVIDMEM | DDSCAPS_VIDEOMEMORY; + } + + if (desc->ddsCaps.dwCaps & (DDSCAPS_PRIMARYSURFACE | DDSCAPS_3DDEVICE)) + { + usage |= WINED3DUSAGE_RENDERTARGET; + desc->ddsCaps.dwCaps |= DDSCAPS_VISIBLE; + } + + if (desc->ddsCaps.dwCaps & (DDSCAPS_OVERLAY)) + { + usage |= WINED3DUSAGE_OVERLAY; + } + + if (ddraw->depthstencil || (desc->ddsCaps.dwCaps & DDSCAPS_ZBUFFER)) + { + /* The depth stencil creation callback sets this flag. Set the + * wined3d usage to let it know it's a depth/stencil surface. */ + usage |= WINED3DUSAGE_DEPTHSTENCIL; + } + + if (desc->ddsCaps.dwCaps & DDSCAPS_SYSTEMMEMORY) + { + pool = WINED3DPOOL_SYSTEMMEM; + } + else if (desc->ddsCaps.dwCaps2 & DDSCAPS2_TEXTUREMANAGE) + { + pool = WINED3DPOOL_MANAGED; + /* Managed textures have the system memory flag set. */ + desc->ddsCaps.dwCaps |= DDSCAPS_SYSTEMMEMORY; + } + else if (desc->ddsCaps.dwCaps & DDSCAPS_VIDEOMEMORY) + { + /* Videomemory adds localvidmem. This is mutually exclusive with + * systemmemory and texturemanage. */ + desc->ddsCaps.dwCaps |= DDSCAPS_LOCALVIDMEM; + } + + format = PixelFormat_DD2WineD3D(&desc->u4.ddpfPixelFormat); + if (format == WINED3DFMT_UNKNOWN) + { + WARN("Unsupported / unknown pixelformat.\n"); + return DDERR_INVALIDPIXELFORMAT; + } + + surface->lpVtbl = &ddraw_surface7_vtbl; + surface->IDirectDrawSurface3_vtbl = &ddraw_surface3_vtbl; + surface->IDirectDrawGammaControl_vtbl = &ddraw_gamma_control_vtbl; + surface->IDirect3DTexture2_vtbl = &d3d_texture2_vtbl; + surface->IDirect3DTexture_vtbl = &d3d_texture1_vtbl; + surface->ref = 1; + surface->version = 7; + surface->ddraw = ddraw; + + surface->surface_desc.dwSize = sizeof(DDSURFACEDESC2); + surface->surface_desc.u4.ddpfPixelFormat.dwSize = sizeof(DDPIXELFORMAT); + DD_STRUCT_COPY_BYSIZE(&surface->surface_desc, desc); + + surface->first_attached = surface; + surface->ImplType = surface_type; + + hr = IWineD3DDevice_CreateSurface(ddraw->wineD3DDevice, desc->dwWidth, desc->dwHeight, format, + TRUE /* Lockable */, FALSE /* Discard */, mip_level, &surface->WineD3DSurface, + usage, pool, WINED3DMULTISAMPLE_NONE, 0 /* MultiSampleQuality */, surface_type, + (IUnknown *)surface, &ddraw_null_wined3d_parent_ops); + if (FAILED(hr)) + { + WARN("Failed to create wined3d surface, hr %#x.\n", hr); + return hr; + } + + surface->surface_desc.dwFlags |= DDSD_PIXELFORMAT; + hr = IWineD3DSurface_GetDesc(surface->WineD3DSurface, &wined3d_desc); + if (FAILED(hr)) + { + ERR("Failed to get wined3d surface desc, hr %#x.\n", hr); + IWineD3DSurface_Release(surface->WineD3DSurface); + return hr; + } + + format = wined3d_desc.format; + if (format == WINED3DFMT_UNKNOWN) + { + FIXME("IWineD3DSurface::GetDesc returned WINED3DFMT_UNKNOWN.\n"); + } + PixelFormat_WineD3DtoDD(&surface->surface_desc.u4.ddpfPixelFormat, format); + + /* Anno 1602 stores the pitch right after surface creation, so make sure + * it's there. TODO: Test other fourcc formats. */ + if (format == WINED3DFMT_DXT1 || format == WINED3DFMT_DXT2 || format == WINED3DFMT_DXT3 + || format == WINED3DFMT_DXT4 || format == WINED3DFMT_DXT5) + { + surface->surface_desc.dwFlags |= DDSD_LINEARSIZE; + if (format == WINED3DFMT_DXT1) + { + surface->surface_desc.u1.dwLinearSize = max(4, wined3d_desc.width) * max(4, wined3d_desc.height) / 2; + } + else + { + surface->surface_desc.u1.dwLinearSize = max(4, wined3d_desc.width) * max(4, wined3d_desc.height); + } + } + else + { + surface->surface_desc.dwFlags |= DDSD_PITCH; + surface->surface_desc.u1.lPitch = IWineD3DSurface_GetPitch(surface->WineD3DSurface); + } + + if (desc->dwFlags & DDSD_CKDESTOVERLAY) + { + IWineD3DSurface_SetColorKey(surface->WineD3DSurface, + DDCKEY_DESTOVERLAY, (WINEDDCOLORKEY *)&desc->u3.ddckCKDestOverlay); + } + if (desc->dwFlags & DDSD_CKDESTBLT) + { + IWineD3DSurface_SetColorKey(surface->WineD3DSurface, + DDCKEY_DESTBLT, (WINEDDCOLORKEY *)&desc->ddckCKDestBlt); + } + if (desc->dwFlags & DDSD_CKSRCOVERLAY) + { + IWineD3DSurface_SetColorKey(surface->WineD3DSurface, + DDCKEY_SRCOVERLAY, (WINEDDCOLORKEY *)&desc->ddckCKSrcOverlay); + } + if (desc->dwFlags & DDSD_CKSRCBLT) + { + IWineD3DSurface_SetColorKey(surface->WineD3DSurface, + DDCKEY_SRCBLT, (WINEDDCOLORKEY *)&desc->ddckCKSrcBlt); + } + if (desc->dwFlags & DDSD_LPSURFACE) + { + hr = IWineD3DSurface_SetMem(surface->WineD3DSurface, desc->lpSurface); + if (FAILED(hr)) + { + ERR("Failed to set surface memory, hr %#x.\n", hr); + IWineD3DSurface_Release(surface->WineD3DSurface); + return hr; + } + } + + return DD_OK; +} diff -Nru wine1.3-1.3.0/dlls/ddraw/tests/dsurface.c wine1.3-1.3.1/dlls/ddraw/tests/dsurface.c --- wine1.3-1.3.0/dlls/ddraw/tests/dsurface.c 2010-07-30 18:43:56.000000000 +0100 +++ wine1.3-1.3.1/dlls/ddraw/tests/dsurface.c 2010-08-20 18:23:50.000000000 +0100 @@ -25,11 +25,13 @@ #include #include "wine/test.h" +#include "wine/exception.h" #include "ddraw.h" #include "d3d.h" #include "unknwn.h" static LPDIRECTDRAW lpDD = NULL; +static DDCAPS ddcaps; static BOOL CreateDirectDraw(void) { @@ -2851,16 +2853,12 @@ DDSCAPS_PRIMARYSURFACE | DDSCAPS_SYSTEMMEMORY | DDSCAPS_VISIBLE }; UINT i; - DDCAPS ddcaps; /* Tests various surface flags, what changes do they undergo during surface creation. Forsaken * engine expects texture surfaces without memory flag to get a video memory flag right after * creation. Currently, Wine adds DDSCAPS_FRONTBUFFER to primary surface, but native doesn't do this * for single buffered primaries. Because of this primary surface creation tests are todo_wine. No real * app is known so far to care about this. */ - ddcaps.dwSize = sizeof(DDCAPS); - hr = IDirectDraw_GetCaps(lpDD, &ddcaps, NULL); - ok(hr == DD_OK, "IDirectDraw_GetCaps failed with %08x\n", hr); if (!(ddcaps.ddsCaps.dwCaps & DDSCAPS_VIDEOMEMORY)) { @@ -3378,6 +3376,336 @@ IDirectDraw7_Release(dd7); } +static void BackBufferCreateSurfaceTest(void) +{ + DDSURFACEDESC ddsd; + DDSURFACEDESC created_ddsd; + DDSURFACEDESC2 ddsd2; + IDirectDrawSurface *surf; + IDirectDrawSurface4 *surf4; + IDirectDrawSurface7 *surf7; + HRESULT hr; + IDirectDraw2 *dd2; + IDirectDraw4 *dd4; + IDirectDraw7 *dd7; + + const DWORD caps = DDSCAPS_BACKBUFFER; + const DWORD expected_caps = DDSCAPS_BACKBUFFER | DDSCAPS_VIDEOMEMORY | DDSCAPS_LOCALVIDMEM; + + if (!(ddcaps.ddsCaps.dwCaps & DDSCAPS_VIDEOMEMORY)) + { + skip("DDraw reported no VIDEOMEMORY cap. Broken video driver? Skipping surface caps tests.\n"); + return ; + } + + memset(&ddsd, 0, sizeof(ddsd)); + ddsd.dwSize = sizeof(ddsd); + ddsd.dwFlags = DDSD_CAPS | DDSD_WIDTH | DDSD_HEIGHT; + ddsd.dwWidth = 64; + ddsd.dwHeight = 64; + ddsd.ddsCaps.dwCaps = caps; + memset(&ddsd2, 0, sizeof(ddsd2)); + ddsd2.dwSize = sizeof(ddsd2); + ddsd2.dwFlags = DDSD_CAPS | DDSD_WIDTH | DDSD_HEIGHT; + ddsd2.dwWidth = 64; + ddsd2.dwHeight = 64; + ddsd2.ddsCaps.dwCaps = caps; + memset(&created_ddsd, 0, sizeof(created_ddsd)); + created_ddsd.dwSize = sizeof(DDSURFACEDESC); + + hr = IDirectDraw_CreateSurface(lpDD, &ddsd, &surf, NULL); + todo_wine ok(SUCCEEDED(hr), "IDirectDraw_CreateSurface failed: 0x%08x\n", hr); + if (surf != NULL) + { + hr = IDirectDrawSurface_GetSurfaceDesc(surf, &created_ddsd); + ok(SUCCEEDED(hr), "IDirectDraw_GetSurfaceDesc failed: 0x%08x\n", hr); + ok(created_ddsd.ddsCaps.dwCaps == expected_caps, + "GetSurfaceDesc returned caps %x, expected %x\n", created_ddsd.ddsCaps.dwCaps, + expected_caps); + IDirectDrawSurface_Release(surf); + } + + hr = IDirectDraw_QueryInterface(lpDD, &IID_IDirectDraw2, (void **) &dd2); + ok(SUCCEEDED(hr), "IDirectDraw_QueryInterface failed: 0x%08x\n", hr); + + hr = IDirectDraw2_CreateSurface(dd2, &ddsd, &surf, NULL); + ok(hr == DDERR_INVALIDCAPS, "IDirectDraw2_CreateSurface didn't return %x08x, but %x08x\n", + DDERR_INVALIDCAPS, hr); + + IDirectDraw2_Release(dd2); + + hr = IDirectDraw_QueryInterface(lpDD, &IID_IDirectDraw4, (void **) &dd4); + ok(SUCCEEDED(hr), "IDirectDraw_QueryInterface failed: 0x%08x\n", hr); + + hr = IDirectDraw4_CreateSurface(dd4, &ddsd2, &surf4, NULL); + ok(hr == DDERR_INVALIDCAPS, "IDirectDraw4_CreateSurface didn't return %x08x, but %x08x\n", + DDERR_INVALIDCAPS, hr); + + IDirectDraw4_Release(dd4); + + hr = IDirectDraw_QueryInterface(lpDD, &IID_IDirectDraw7, (void **) &dd7); + ok(SUCCEEDED(hr), "IDirectDraw_QueryInterface failed: 0x%08x\n", hr); + + hr = IDirectDraw7_CreateSurface(dd7, &ddsd2, &surf7, NULL); + ok(hr == DDERR_INVALIDCAPS, "IDirectDraw7_CreateSurface didn't return %x08x, but %x08x\n", + DDERR_INVALIDCAPS, hr); + + IDirectDraw7_Release(dd7); +} + +static void BackBufferAttachmentFlipTest(void) +{ + HRESULT hr; + IDirectDrawSurface *surface1, *surface2, *surface3, *surface4; + DDSURFACEDESC ddsd; + HWND window = CreateWindow( "static", "ddraw_test", WS_OVERLAPPEDWINDOW, 100, 100, 160, 160, NULL, NULL, NULL, NULL ); + + hr = IDirectDraw_SetCooperativeLevel(lpDD, window, DDSCL_EXCLUSIVE | DDSCL_FULLSCREEN); + ok(hr == DD_OK, "SetCooperativeLevel returned %08x\n", hr); + + /* Perform attachment tests on a back-buffer */ + memset(&ddsd, 0, sizeof(ddsd)); + ddsd.dwSize = sizeof(ddsd); + ddsd.dwFlags = DDSD_CAPS | DDSD_WIDTH | DDSD_HEIGHT; + ddsd.ddsCaps.dwCaps = DDSCAPS_BACKBUFFER; + ddsd.dwWidth = GetSystemMetrics(SM_CXSCREEN); + ddsd.dwHeight = GetSystemMetrics(SM_CYSCREEN); + hr = IDirectDraw_CreateSurface(lpDD, &ddsd, &surface2, NULL); + todo_wine ok(SUCCEEDED(hr), "CreateSurface returned: %x\n",hr); + + if (surface2 != NULL) + { + /* Try a single primary and a two back buffers */ + memset(&ddsd, 0, sizeof(ddsd)); + ddsd.dwSize = sizeof(ddsd); + ddsd.dwFlags = DDSD_CAPS; + ddsd.ddsCaps.dwCaps = DDSCAPS_PRIMARYSURFACE; + hr = IDirectDraw_CreateSurface(lpDD, &ddsd, &surface1, NULL); + ok(hr==DD_OK,"CreateSurface returned: %x\n",hr); + + memset(&ddsd, 0, sizeof(ddsd)); + ddsd.dwSize = sizeof(ddsd); + ddsd.dwFlags = DDSD_CAPS | DDSD_WIDTH | DDSD_HEIGHT; + ddsd.ddsCaps.dwCaps = DDSCAPS_BACKBUFFER; + ddsd.dwWidth = GetSystemMetrics(SM_CXSCREEN); + ddsd.dwHeight = GetSystemMetrics(SM_CYSCREEN); + hr = IDirectDraw_CreateSurface(lpDD, &ddsd, &surface3, NULL); + ok(hr==DD_OK,"CreateSurface returned: %x\n",hr); + + /* This one has a different size */ + memset(&ddsd, 0, sizeof(ddsd)); + ddsd.dwSize = sizeof(ddsd); + ddsd.dwFlags = DDSD_CAPS | DDSD_WIDTH | DDSD_HEIGHT; + ddsd.ddsCaps.dwCaps = DDSCAPS_BACKBUFFER; + ddsd.dwWidth = 128; + ddsd.dwHeight = 128; + hr = IDirectDraw_CreateSurface(lpDD, &ddsd, &surface4, NULL); + ok(hr==DD_OK,"CreateSurface returned: %x\n",hr); + + hr = IDirectDrawSurface_AddAttachedSurface(surface1, surface2); + todo_wine ok(hr == DD_OK || broken(hr == DDERR_CANNOTATTACHSURFACE), + "Attaching a back buffer to a front buffer returned %08x\n", hr); + if(SUCCEEDED(hr)) + { + /* Try flipping the surfaces */ + hr = IDirectDrawSurface_Flip(surface1, NULL, DDFLIP_WAIT); + todo_wine ok(hr == DD_OK, "IDirectDrawSurface_Flip returned 0x%08x\n", hr); + hr = IDirectDrawSurface_Flip(surface2, NULL, DDFLIP_WAIT); + todo_wine ok(hr == DDERR_NOTFLIPPABLE, "IDirectDrawSurface_Flip returned 0x%08x\n", hr); + + /* Try the reverse without detaching first */ + hr = IDirectDrawSurface_AddAttachedSurface(surface2, surface1); + ok(hr == DDERR_SURFACEALREADYATTACHED, "Attaching an attached surface to its attachee returned %08x\n", hr); + hr = IDirectDrawSurface_DeleteAttachedSurface(surface1, 0, surface2); + ok(hr == DD_OK, "DeleteAttachedSurface failed with %08x\n", hr); + } + hr = IDirectDrawSurface_AddAttachedSurface(surface2, surface1); + todo_wine ok(hr == DD_OK || broken(hr == DDERR_CANNOTATTACHSURFACE), + "Attaching a front buffer to a back buffer returned %08x\n", hr); + if(SUCCEEDED(hr)) + { + /* Try flipping the surfaces */ + hr = IDirectDrawSurface_Flip(surface1, NULL, DDFLIP_WAIT); + todo_wine ok(hr == DD_OK, "IDirectDrawSurface_Flip returned 0x%08x\n", hr); + hr = IDirectDrawSurface_Flip(surface2, NULL, DDFLIP_WAIT); + todo_wine ok(hr == DDERR_NOTFLIPPABLE, "IDirectDrawSurface_Flip returned 0x%08x\n", hr); + + /* Try to detach reversed */ + hr = IDirectDrawSurface_DeleteAttachedSurface(surface1, 0, surface2); + ok(hr == DDERR_CANNOTDETACHSURFACE, "DeleteAttachedSurface returned %08x\n", hr); + /* Now the proper detach */ + hr = IDirectDrawSurface_DeleteAttachedSurface(surface2, 0, surface1); + ok(hr == DD_OK, "DeleteAttachedSurface failed with %08x\n", hr); + } + hr = IDirectDrawSurface_AddAttachedSurface(surface2, surface3); + todo_wine ok(hr == DD_OK || broken(hr == DDERR_CANNOTATTACHSURFACE), + "Attaching a back buffer to another back buffer returned %08x\n", hr); + if(SUCCEEDED(hr)) + { + /* Try flipping the surfaces */ + hr = IDirectDrawSurface_Flip(surface3, NULL, DDFLIP_WAIT); + todo_wine ok(hr == DD_OK, "IDirectDrawSurface_Flip returned 0x%08x\n", hr); + hr = IDirectDrawSurface_Flip(surface2, NULL, DDFLIP_WAIT); + todo_wine ok(hr == DDERR_NOTFLIPPABLE, "IDirectDrawSurface_Flip returned 0x%08x\n", hr); + hr = IDirectDrawSurface_Flip(surface1, NULL, DDFLIP_WAIT); + ok(hr == DDERR_NOTFLIPPABLE, "IDirectDrawSurface_Flip returned 0x%08x\n", hr); + + hr = IDirectDrawSurface_DeleteAttachedSurface(surface2, 0, surface3); + ok(hr == DD_OK, "DeleteAttachedSurface failed with %08x\n", hr); + } + hr = IDirectDrawSurface_AddAttachedSurface(surface1, surface4); + ok(hr == DDERR_CANNOTATTACHSURFACE, "Attaching a back buffer to a front buffer of different size returned %08x\n", hr); + hr = IDirectDrawSurface_AddAttachedSurface(surface4, surface1); + ok(hr == DDERR_CANNOTATTACHSURFACE, "Attaching a front buffer to a back buffer of different size returned %08x\n", hr); + + IDirectDrawSurface_Release(surface4); + IDirectDrawSurface_Release(surface3); + IDirectDrawSurface_Release(surface2); + IDirectDrawSurface_Release(surface1); + } + + hr =IDirectDraw_SetCooperativeLevel(lpDD, NULL, DDSCL_NORMAL); + ok(hr == DD_OK, "SetCooperativeLevel returned %08x\n", hr); + + DestroyWindow(window); +} + +static void CreateSurfaceBadCapsSizeTest(void) +{ + DDSURFACEDESC ddsd_ok; + DDSURFACEDESC ddsd_bad1; + DDSURFACEDESC ddsd_bad2; + DDSURFACEDESC ddsd_bad3; + DDSURFACEDESC ddsd_bad4; + DDSURFACEDESC2 ddsd2_ok; + DDSURFACEDESC2 ddsd2_bad1; + DDSURFACEDESC2 ddsd2_bad2; + DDSURFACEDESC2 ddsd2_bad3; + DDSURFACEDESC2 ddsd2_bad4; + IDirectDrawSurface *surf; + IDirectDrawSurface4 *surf4; + IDirectDrawSurface7 *surf7; + HRESULT hr; + IDirectDraw2 *dd2; + IDirectDraw4 *dd4; + IDirectDraw7 *dd7; + + const DWORD caps = DDSCAPS_OFFSCREENPLAIN; + + memset(&ddsd_ok, 0, sizeof(ddsd_ok)); + ddsd_ok.dwSize = sizeof(ddsd_ok); + ddsd_ok.dwFlags = DDSD_CAPS | DDSD_WIDTH | DDSD_HEIGHT; + ddsd_ok.dwWidth = 64; + ddsd_ok.dwHeight = 64; + ddsd_ok.ddsCaps.dwCaps = caps; + memcpy(&ddsd_bad1, &ddsd_ok, sizeof(ddsd_bad1)); + ddsd_bad1.dwSize--; + memcpy(&ddsd_bad2, &ddsd_ok, sizeof(ddsd_bad2)); + ddsd_bad2.dwSize++; + memcpy(&ddsd_bad3, &ddsd_ok, sizeof(ddsd_bad3)); + ddsd_bad3.dwSize = 0; + memcpy(&ddsd_bad4, &ddsd_ok, sizeof(ddsd_bad4)); + ddsd_bad4.dwSize = sizeof(DDSURFACEDESC2); + + memset(&ddsd2_ok, 0, sizeof(ddsd2_ok)); + ddsd2_ok.dwSize = sizeof(ddsd2_ok); + ddsd2_ok.dwFlags = DDSD_CAPS | DDSD_WIDTH | DDSD_HEIGHT; + ddsd2_ok.dwWidth = 64; + ddsd2_ok.dwHeight = 64; + ddsd2_ok.ddsCaps.dwCaps = caps; + memcpy(&ddsd2_bad1, &ddsd2_ok, sizeof(ddsd2_bad1)); + ddsd2_bad1.dwSize--; + memcpy(&ddsd2_bad2, &ddsd2_ok, sizeof(ddsd2_bad2)); + ddsd2_bad2.dwSize++; + memcpy(&ddsd2_bad3, &ddsd2_ok, sizeof(ddsd2_bad3)); + ddsd2_bad3.dwSize = 0; + memcpy(&ddsd2_bad4, &ddsd2_ok, sizeof(ddsd2_bad4)); + ddsd2_bad4.dwSize = sizeof(DDSURFACEDESC); + + hr = IDirectDraw_CreateSurface(lpDD, &ddsd_ok, &surf, NULL); + ok(SUCCEEDED(hr), "IDirectDraw_CreateSurface failed: 0x%08x\n", hr); + IDirectDrawSurface_Release(surf); + + hr = IDirectDraw_CreateSurface(lpDD, &ddsd_bad1, &surf, NULL); + todo_wine ok(hr == DDERR_INVALIDPARAMS, "IDirectDraw_CreateSurface didn't return 0x%08x, but 0x%08x\n", + DDERR_INVALIDPARAMS, hr); + hr = IDirectDraw_CreateSurface(lpDD, &ddsd_bad2, &surf, NULL); + todo_wine ok(hr == DDERR_INVALIDPARAMS, "IDirectDraw_CreateSurface didn't return 0x%08x, but 0x%08x\n", + DDERR_INVALIDPARAMS, hr); + hr = IDirectDraw_CreateSurface(lpDD, &ddsd_bad3, &surf, NULL); + ok(hr == DDERR_INVALIDPARAMS, "IDirectDraw_CreateSurface didn't return 0x%08x, but 0x%08x\n", + DDERR_INVALIDPARAMS, hr); + hr = IDirectDraw_CreateSurface(lpDD, &ddsd_bad4, &surf, NULL); + todo_wine ok(hr == DDERR_INVALIDPARAMS, "IDirectDraw_CreateSurface didn't return 0x%08x, but 0x%08x\n", + DDERR_INVALIDPARAMS, hr); + + hr = IDirectDraw_QueryInterface(lpDD, &IID_IDirectDraw2, (void **) &dd2); + ok(SUCCEEDED(hr), "IDirectDraw_QueryInterface failed: 0x%08x\n", hr); + + hr = IDirectDraw2_CreateSurface(dd2, &ddsd_ok, &surf, NULL); + ok(SUCCEEDED(hr), "IDirectDraw2_CreateSurface failed: 0x%08x\n", hr); + IDirectDrawSurface_Release(surf); + + hr = IDirectDraw2_CreateSurface(dd2, &ddsd_bad1, &surf, NULL); + todo_wine ok(hr == DDERR_INVALIDPARAMS, "IDirectDraw2_CreateSurface didn't return 0x%08x, but 0x%08x\n", + DDERR_INVALIDPARAMS, hr); + hr = IDirectDraw2_CreateSurface(dd2, &ddsd_bad2, &surf, NULL); + todo_wine ok(hr == DDERR_INVALIDPARAMS, "IDirectDraw2_CreateSurface didn't return 0x%08x, but 0x%08x\n", + DDERR_INVALIDPARAMS, hr); + hr = IDirectDraw2_CreateSurface(dd2, &ddsd_bad3, &surf, NULL); + ok(hr == DDERR_INVALIDPARAMS, "IDirectDraw2_CreateSurface didn't return 0x%08x, but 0x%08x\n", + DDERR_INVALIDPARAMS, hr); + hr = IDirectDraw2_CreateSurface(dd2, &ddsd_bad4, &surf, NULL); + todo_wine ok(hr == DDERR_INVALIDPARAMS, "IDirectDraw2_CreateSurface didn't return 0x%08x, but 0x%08x\n", + DDERR_INVALIDPARAMS, hr); + + IDirectDraw2_Release(dd2); + + hr = IDirectDraw_QueryInterface(lpDD, &IID_IDirectDraw4, (void **) &dd4); + ok(SUCCEEDED(hr), "IDirectDraw_QueryInterface failed: 0x%08x\n", hr); + + hr = IDirectDraw4_CreateSurface(dd4, &ddsd2_ok, &surf4, NULL); + ok(SUCCEEDED(hr), "IDirectDraw4_CreateSurface failed: 0x%08x\n", hr); + IDirectDrawSurface4_Release(surf4); + + hr = IDirectDraw4_CreateSurface(dd4, &ddsd2_bad1, &surf4, NULL); + todo_wine ok(hr == DDERR_INVALIDPARAMS, "IDirectDraw4_CreateSurface didn't return 0x%08x, but 0x%08x\n", + DDERR_INVALIDPARAMS, hr); + hr = IDirectDraw4_CreateSurface(dd4, &ddsd2_bad2, &surf4, NULL); + todo_wine ok(hr == DDERR_INVALIDPARAMS, "IDirectDraw4_CreateSurface didn't return 0x%08x, but 0x%08x\n", + DDERR_INVALIDPARAMS, hr); + hr = IDirectDraw4_CreateSurface(dd4, &ddsd2_bad3, &surf4, NULL); + ok(hr == DDERR_INVALIDPARAMS, "IDirectDraw4_CreateSurface didn't return 0x%08x, but 0x%08x\n", + DDERR_INVALIDPARAMS, hr); + hr = IDirectDraw4_CreateSurface(dd4, &ddsd2_bad4, &surf4, NULL); + todo_wine ok(hr == DDERR_INVALIDPARAMS, "IDirectDraw4_CreateSurface didn't return 0x%08x, but 0x%08x\n", + DDERR_INVALIDPARAMS, hr); + + IDirectDraw4_Release(dd4); + + hr = IDirectDraw_QueryInterface(lpDD, &IID_IDirectDraw7, (void **) &dd7); + ok(SUCCEEDED(hr), "IDirectDraw_QueryInterface failed: 0x%08x\n", hr); + + hr = IDirectDraw7_CreateSurface(dd7, &ddsd2_ok, &surf7, NULL); + ok(SUCCEEDED(hr), "IDirectDraw7_CreateSurface failed: 0x%08x\n", hr); + IDirectDrawSurface7_Release(surf7); + + hr = IDirectDraw7_CreateSurface(dd7, &ddsd2_bad1, &surf7, NULL); + todo_wine ok(hr == DDERR_INVALIDPARAMS, "IDirectDraw7_CreateSurface didn't return 0x%08x, but 0x%08x\n", + DDERR_INVALIDPARAMS, hr); + hr = IDirectDraw7_CreateSurface(dd7, &ddsd2_bad2, &surf7, NULL); + todo_wine ok(hr == DDERR_INVALIDPARAMS, "IDirectDraw7_CreateSurface didn't return 0x%08x, but 0x%08x\n", + DDERR_INVALIDPARAMS, hr); + hr = IDirectDraw7_CreateSurface(dd7, &ddsd2_bad3, &surf7, NULL); + ok(hr == DDERR_INVALIDPARAMS, "IDirectDraw7_CreateSurface didn't return 0x%08x, but 0x%08x\n", + DDERR_INVALIDPARAMS, hr); + hr = IDirectDraw7_CreateSurface(dd7, &ddsd2_bad4, &surf7, NULL); + todo_wine ok(hr == DDERR_INVALIDPARAMS, "IDirectDraw7_CreateSurface didn't return 0x%08x, but 0x%08x\n", + DDERR_INVALIDPARAMS, hr); + + IDirectDraw7_Release(dd7); +} + START_TEST(dsurface) { HRESULT ret; @@ -3401,6 +3729,14 @@ return; } + ddcaps.dwSize = sizeof(DDCAPS); + ret = IDirectDraw_GetCaps(lpDD, &ddcaps, NULL); + if (ret != DD_OK) + { + skip("IDirectDraw_GetCaps failed with %08x\n", ret); + return; + } + MipMapCreationTest(); SrcColorKey32BlitTest(); QueryInterface(); @@ -3423,5 +3759,8 @@ SurfaceCapsTest(); GetDCTest(); GetDCFormatTest(); + BackBufferCreateSurfaceTest(); + BackBufferAttachmentFlipTest(); + CreateSurfaceBadCapsSizeTest(); ReleaseDirectDraw(); } diff -Nru wine1.3-1.3.0/dlls/ddraw/texture.c wine1.3-1.3.1/dlls/ddraw/texture.c --- wine1.3-1.3.0/dlls/ddraw/texture.c 2010-07-30 18:43:56.000000000 +0100 +++ wine1.3-1.3.1/dlls/ddraw/texture.c 1970-01-01 01:00:00.000000000 +0100 @@ -1,501 +0,0 @@ -/* Direct3D Texture - * Copyright (c) 1998 Lionel ULMER - * Copyright (c) 2006 Stefan DÖSINGER - * - * This file contains the implementation of interface Direct3DTexture2. - * - * 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 "wine/port.h" - -#include -#include -#include -#include - -#define COBJMACROS -#define NONAMELESSUNION - -#include "windef.h" -#include "winbase.h" -#include "winerror.h" -#include "wingdi.h" -#include "wine/exception.h" - -#include "ddraw.h" -#include "d3d.h" - -#include "ddraw_private.h" -#include "wine/debug.h" - -WINE_DEFAULT_DEBUG_CHANNEL(d3d7); -WINE_DECLARE_DEBUG_CHANNEL(ddraw_thunk); - -/***************************************************************************** - * IUnknown interfaces. They are thunks to IDirectDrawSurface7 - *****************************************************************************/ -static HRESULT WINAPI -Thunk_IDirect3DTextureImpl_2_QueryInterface(IDirect3DTexture2 *iface, - REFIID riid, - void **obj) -{ - IDirectDrawSurfaceImpl *This = surface_from_texture2(iface); - TRACE("(%p)->(%s,%p) thunking to IDirectDrawSurface7 interface.\n", This, debugstr_guid(riid), obj); - return IDirectDrawSurface7_QueryInterface((IDirectDrawSurface7 *)This, riid, obj); -} - -static HRESULT WINAPI -Thunk_IDirect3DTextureImpl_1_QueryInterface(IDirect3DTexture *iface, - REFIID riid, - void **obj) -{ - IDirectDrawSurfaceImpl *This = surface_from_texture1(iface); - TRACE("(%p)->(%s,%p) thunking to IDirectDrawSurface7 interface.\n", This, debugstr_guid(riid), obj); - - return IDirectDrawSurface7_QueryInterface((IDirectDrawSurface7 *)This, riid, obj); -} - -static ULONG WINAPI -Thunk_IDirect3DTextureImpl_2_AddRef(IDirect3DTexture2 *iface) -{ - IDirectDrawSurfaceImpl *This = surface_from_texture2(iface); - TRACE("(%p)->() thunking to IDirectDrawSurface7 interface.\n", This); - - return IDirectDrawSurface7_AddRef((IDirectDrawSurface7 *)This); -} - -static ULONG WINAPI -Thunk_IDirect3DTextureImpl_1_AddRef(IDirect3DTexture *iface) -{ - IDirectDrawSurfaceImpl *This = surface_from_texture1(iface); - TRACE("(%p)->() thunking to IDirectDrawSurface7 interface.\n", This); - - return IDirectDrawSurface7_AddRef((IDirectDrawSurface7 *)This); -} - -static ULONG WINAPI -Thunk_IDirect3DTextureImpl_2_Release(IDirect3DTexture2 *iface) -{ - IDirectDrawSurfaceImpl *This = surface_from_texture2(iface); - TRACE("(%p)->() thunking to IDirectDrawSurface7 interface.\n", This); - - return IDirectDrawSurface7_Release((IDirectDrawSurface7 *)This); -} - - -static ULONG WINAPI -Thunk_IDirect3DTextureImpl_1_Release(IDirect3DTexture *iface) -{ - IDirectDrawSurfaceImpl *This = surface_from_texture1(iface); - TRACE("(%p)->() thunking to IDirectDrawSurface7 interface.\n", This); - - return IDirectDrawSurface7_Release((IDirectDrawSurface7 *)This); -} - -/***************************************************************************** - * IDirect3DTexture interface - *****************************************************************************/ - -/***************************************************************************** - * IDirect3DTexture1::Initialize - * - * The sdk says it's not implemented - * - * Params: - * ? - * - * Returns - * DDERR_UNSUPPORTED - * - *****************************************************************************/ -static HRESULT WINAPI -IDirect3DTextureImpl_1_Initialize(IDirect3DTexture *iface, - IDirect3DDevice *Direct3DDevice, - IDirectDrawSurface *DDSurface) -{ - TRACE("(%p)->(%p,%p) Not implemented\n", iface, Direct3DDevice, DDSurface); - return DDERR_UNSUPPORTED; /* Unchecked */ -} - -/***************************************************************************** - * IDirect3DTexture2::PaletteChanged - * - * Informs the texture about a palette change - * - * Params: - * Start: Start index of the change - * Count: The number of changed entries - * - * Returns - * D3D_OK, because it's a stub - * - *****************************************************************************/ -static HRESULT WINAPI -IDirect3DTextureImpl_PaletteChanged(IDirect3DTexture2 *iface, - DWORD Start, - DWORD Count) -{ - IDirectDrawSurfaceImpl *This = surface_from_texture2(iface); - FIXME("(%p)->(%08x,%08x): stub!\n", This, Start, Count); - return D3D_OK; -} - -static HRESULT WINAPI -Thunk_IDirect3DTextureImpl_1_PaletteChanged(IDirect3DTexture *iface, - DWORD Start, - DWORD Count) -{ - IDirectDrawSurfaceImpl *This = surface_from_texture1(iface); - TRACE("(%p)->(%08x,%08x) thunking to IDirect3DTexture2 interface.\n", This, Start, Count); - - return IDirect3DTexture2_PaletteChanged((IDirect3DTexture2 *)&This->IDirect3DTexture2_vtbl, Start, Count); -} - - -/***************************************************************************** - * IDirect3DTexture::Unload - * - * DX5 SDK: "The IDirect3DTexture2::Unload method is not implemented - * - * - * Returns: - * DDERR_UNSUPPORTED - * - *****************************************************************************/ -static HRESULT WINAPI -IDirect3DTextureImpl_1_Unload(IDirect3DTexture *iface) -{ - IDirectDrawSurfaceImpl *This = surface_from_texture1(iface); - TRACE("(%p)->(): not implemented!\n", This); - return DDERR_UNSUPPORTED; -} - -/***************************************************************************** - * IDirect3DTexture2::GetHandle - * - * Returns handle for the texture. At the moment, the interface - * to the IWineD3DTexture is used. - * - * Params: - * Direct3DDevice2: Device this handle is assigned to - * Handle: Address to store the handle at. - * - * Returns: - * D3D_OK - * - *****************************************************************************/ -static HRESULT WINAPI -IDirect3DTextureImpl_GetHandle(IDirect3DTexture2 *iface, - IDirect3DDevice2 *Direct3DDevice2, - D3DTEXTUREHANDLE *lpHandle) -{ - IDirectDrawSurfaceImpl *This = surface_from_texture2(iface); - IDirect3DDeviceImpl *d3d = device_from_device2(Direct3DDevice2); - - TRACE("(%p)->(%p,%p)\n", This, d3d, lpHandle); - - EnterCriticalSection(&ddraw_cs); - if(!This->Handle) - { - DWORD h = ddraw_allocate_handle(&d3d->handle_table, This, DDRAW_HANDLE_SURFACE); - if (h == DDRAW_INVALID_HANDLE) - { - ERR("Failed to allocate a texture handle.\n"); - LeaveCriticalSection(&ddraw_cs); - return DDERR_OUTOFMEMORY; - } - - This->Handle = h + 1; - } - *lpHandle = This->Handle; - - TRACE(" returning handle %08x.\n", *lpHandle); - - LeaveCriticalSection(&ddraw_cs); - return D3D_OK; -} - -static HRESULT WINAPI -Thunk_IDirect3DTextureImpl_1_GetHandle(IDirect3DTexture *iface, - LPDIRECT3DDEVICE lpDirect3DDevice, - LPD3DTEXTUREHANDLE lpHandle) -{ - IDirectDrawSurfaceImpl *This = surface_from_texture1(iface); - IDirect3DDeviceImpl *d3d = device_from_device1(lpDirect3DDevice); - IDirect3DTexture2 *d3d_texture2 = (IDirect3DTexture2 *)&This->IDirect3DTexture2_vtbl; - IDirect3DDevice2 *d3d_device2 = (IDirect3DDevice2 *)&d3d->IDirect3DDevice2_vtbl; - - TRACE_(ddraw_thunk)("(%p)->(%p,%p) thunking to IDirect3DTexture2 interface.\n", This, d3d, lpHandle); - - return IDirect3DTexture2_GetHandle(d3d_texture2, d3d_device2, lpHandle); -} - - -/***************************************************************************** - * get_sub_mimaplevel - * - * Helper function that returns the next mipmap level - * - * tex_ptr: Surface of which to return the next level - * - *****************************************************************************/ -static IDirectDrawSurfaceImpl * -get_sub_mimaplevel(IDirectDrawSurfaceImpl *tex_ptr) -{ - /* Now go down the mipmap chain to the next surface */ - static DDSCAPS2 mipmap_caps = { DDSCAPS_MIPMAP | DDSCAPS_TEXTURE, 0, 0, 0 }; - LPDIRECTDRAWSURFACE7 next_level; - IDirectDrawSurfaceImpl *surf_ptr; - HRESULT hr; - - hr = IDirectDrawSurface7_GetAttachedSurface((IDirectDrawSurface7 *)tex_ptr, &mipmap_caps, &next_level); - if (FAILED(hr)) return NULL; - - surf_ptr = (IDirectDrawSurfaceImpl *)next_level; - IDirectDrawSurface7_Release(next_level); - - return surf_ptr; -} - -/***************************************************************************** - * IDirect3DTexture2::Load - * - * Loads a texture created with the DDSCAPS_ALLOCONLOAD - * - * This function isn't relayed to WineD3D because the whole interface is - * implemented in DDraw only. For speed improvements a implementation which - * takes OpenGL more into account could be placed into WineD3D. - * - * Params: - * D3DTexture2: Address of the texture to load - * - * Returns: - * D3D_OK on success - * D3DERR_TEXTURE_LOAD_FAILED. - * - *****************************************************************************/ -static HRESULT WINAPI -IDirect3DTextureImpl_Load(IDirect3DTexture2 *iface, - IDirect3DTexture2 *D3DTexture2) -{ - IDirectDrawSurfaceImpl *This = surface_from_texture2(iface); - IDirectDrawSurfaceImpl *src_ptr = surface_from_texture2(D3DTexture2); - HRESULT ret_value = D3D_OK; - if(src_ptr == This) - { - TRACE("copying surface %p to surface %p, why?\n", src_ptr, This); - return ret_value; - } - - TRACE("(%p)->(%p)\n", This, src_ptr); - EnterCriticalSection(&ddraw_cs); - - if (((src_ptr->surface_desc.ddsCaps.dwCaps & DDSCAPS_MIPMAP) != (This->surface_desc.ddsCaps.dwCaps & DDSCAPS_MIPMAP)) || - (src_ptr->surface_desc.u2.dwMipMapCount != This->surface_desc.u2.dwMipMapCount)) - { - ERR("Trying to load surfaces with different mip-map counts !\n"); - } - - while(1) - { - IWineD3DPalette *wine_pal, *wine_pal_src; - IDirectDrawPalette *pal = NULL, *pal_src = NULL; - DDSURFACEDESC *src_d, *dst_d; - - TRACE(" copying surface %p to surface %p (mipmap level %d)\n", src_ptr, This, src_ptr->mipmap_level); - - /* Suppress the ALLOCONLOAD flag */ - This->surface_desc.ddsCaps.dwCaps &= ~DDSCAPS_ALLOCONLOAD; - - /* Get the palettes */ - ret_value = IWineD3DSurface_GetPalette(This->WineD3DSurface, &wine_pal); - if( ret_value != D3D_OK) - { - ERR("IWineD3DSurface::GetPalette failed! This is unexpected\n"); - LeaveCriticalSection(&ddraw_cs); - return D3DERR_TEXTURE_LOAD_FAILED; - } - if(wine_pal) - { - ret_value = IWineD3DPalette_GetParent(wine_pal, (IUnknown **) &pal); - if(ret_value != D3D_OK) - { - ERR("IWineD3DPalette::GetParent failed! This is unexpected\n"); - LeaveCriticalSection(&ddraw_cs); - return D3DERR_TEXTURE_LOAD_FAILED; - } - } - - ret_value = IWineD3DSurface_GetPalette(src_ptr->WineD3DSurface, &wine_pal_src); - if( ret_value != D3D_OK) - { - ERR("IWineD3DSurface::GetPalette failed! This is unexpected\n"); - LeaveCriticalSection(&ddraw_cs); - return D3DERR_TEXTURE_LOAD_FAILED; - } - if(wine_pal_src) - { - ret_value = IWineD3DPalette_GetParent(wine_pal_src, (IUnknown **) &pal_src); - if(ret_value != D3D_OK) - { - ERR("IWineD3DPalette::GetParent failed! This is unexpected\n"); - if (pal) IDirectDrawPalette_Release(pal); - LeaveCriticalSection(&ddraw_cs); - return D3DERR_TEXTURE_LOAD_FAILED; - } - } - - if (pal_src != NULL) - { - PALETTEENTRY palent[256]; - - if (pal == NULL) - { - IDirectDrawPalette_Release(pal_src); - LeaveCriticalSection(&ddraw_cs); - return DDERR_NOPALETTEATTACHED; - } - IDirectDrawPalette_GetEntries(pal_src, 0, 0, 256, palent); - IDirectDrawPalette_SetEntries(pal, 0, 0, 256, palent); - } - - if (pal) IDirectDrawPalette_Release(pal); - if (pal_src) IDirectDrawPalette_Release(pal_src); - - /* Copy one surface on the other */ - dst_d = (DDSURFACEDESC *)&(This->surface_desc); - src_d = (DDSURFACEDESC *)&(src_ptr->surface_desc); - - if ((src_d->dwWidth != dst_d->dwWidth) || (src_d->dwHeight != dst_d->dwHeight)) - { - /* Should also check for same pixel format, u1.lPitch, ... */ - ERR("Error in surface sizes\n"); - LeaveCriticalSection(&ddraw_cs); - return D3DERR_TEXTURE_LOAD_FAILED; - } - else - { - WINED3DLOCKED_RECT pSrcRect, pDstRect; - - /* LPDIRECT3DDEVICE2 d3dd = (LPDIRECT3DDEVICE2) This->D3Ddevice; */ - /* I should put a macro for the calculus of bpp */ - - /* Copy also the ColorKeying stuff */ - if (src_d->dwFlags & DDSD_CKSRCBLT) - { - dst_d->dwFlags |= DDSD_CKSRCBLT; - dst_d->ddckCKSrcBlt.dwColorSpaceLowValue = src_d->ddckCKSrcBlt.dwColorSpaceLowValue; - dst_d->ddckCKSrcBlt.dwColorSpaceHighValue = src_d->ddckCKSrcBlt.dwColorSpaceHighValue; - } - - /* Copy the main memory texture into the surface that corresponds to the OpenGL - texture object. */ - - ret_value = IWineD3DSurface_LockRect(src_ptr->WineD3DSurface, &pSrcRect, NULL, 0); - if(ret_value != D3D_OK) - { - ERR(" (%p) Locking the source surface failed\n", This); - LeaveCriticalSection(&ddraw_cs); - return D3DERR_TEXTURE_LOAD_FAILED; - } - - ret_value = IWineD3DSurface_LockRect(This->WineD3DSurface, &pDstRect, NULL, 0); - if(ret_value != D3D_OK) - { - ERR(" (%p) Locking the destination surface failed\n", This); - IWineD3DSurface_UnlockRect(src_ptr->WineD3DSurface); - LeaveCriticalSection(&ddraw_cs); - return D3DERR_TEXTURE_LOAD_FAILED; - } - - if (This->surface_desc.u4.ddpfPixelFormat.dwFlags & DDPF_FOURCC) - memcpy(pDstRect.pBits, pSrcRect.pBits, src_ptr->surface_desc.u1.dwLinearSize); - else - memcpy(pDstRect.pBits, pSrcRect.pBits, pSrcRect.Pitch * src_d->dwHeight); - - IWineD3DSurface_UnlockRect(src_ptr->WineD3DSurface); - IWineD3DSurface_UnlockRect(This->WineD3DSurface); - } - - if (src_ptr->surface_desc.ddsCaps.dwCaps & DDSCAPS_MIPMAP) - { - src_ptr = get_sub_mimaplevel(src_ptr); - } - else - { - src_ptr = NULL; - } - if (This->surface_desc.ddsCaps.dwCaps & DDSCAPS_MIPMAP) - { - This = get_sub_mimaplevel(This); - } - else - { - This = NULL; - } - - if ((src_ptr == NULL) || (This == NULL)) - { - if (src_ptr != This) - { - ERR(" Loading surface with different mipmap structure !!!\n"); - } - break; - } - } - - LeaveCriticalSection(&ddraw_cs); - return ret_value; -} - -static HRESULT WINAPI -Thunk_IDirect3DTextureImpl_1_Load(IDirect3DTexture *iface, - IDirect3DTexture *D3DTexture) -{ - IDirectDrawSurfaceImpl *This = surface_from_texture1(iface); - IDirectDrawSurfaceImpl *Texture = surface_from_texture1(D3DTexture); - TRACE("(%p)->(%p) thunking to IDirect3DTexture2 interface.\n", This, Texture); - - return IDirect3DTexture2_Load((IDirect3DTexture2 *)&This->IDirect3DTexture2_vtbl, - D3DTexture ? (IDirect3DTexture2 *)&surface_from_texture1(D3DTexture)->IDirect3DTexture2_vtbl : NULL); -} - -/***************************************************************************** - * The VTables - *****************************************************************************/ -const IDirect3DTexture2Vtbl IDirect3DTexture2_Vtbl = -{ - Thunk_IDirect3DTextureImpl_2_QueryInterface, - Thunk_IDirect3DTextureImpl_2_AddRef, - Thunk_IDirect3DTextureImpl_2_Release, - IDirect3DTextureImpl_GetHandle, - IDirect3DTextureImpl_PaletteChanged, - IDirect3DTextureImpl_Load, -}; - - -const IDirect3DTextureVtbl IDirect3DTexture1_Vtbl = -{ - Thunk_IDirect3DTextureImpl_1_QueryInterface, - Thunk_IDirect3DTextureImpl_1_AddRef, - Thunk_IDirect3DTextureImpl_1_Release, - IDirect3DTextureImpl_1_Initialize, - Thunk_IDirect3DTextureImpl_1_GetHandle, - Thunk_IDirect3DTextureImpl_1_PaletteChanged, - Thunk_IDirect3DTextureImpl_1_Load, - IDirect3DTextureImpl_1_Unload, -}; diff -Nru wine1.3-1.3.0/dlls/ddraw/utils.c wine1.3-1.3.1/dlls/ddraw/utils.c --- wine1.3-1.3.0/dlls/ddraw/utils.c 2010-07-30 18:43:56.000000000 +0100 +++ wine1.3-1.3.1/dlls/ddraw/utils.c 2010-08-20 18:23:50.000000000 +0100 @@ -22,11 +22,9 @@ */ #include "config.h" - -#define NONAMELESSUNION +#include "wine/port.h" #include "ddraw_private.h" -#include "wine/debug.h" WINE_DEFAULT_DEBUG_CHANNEL(ddraw); diff -Nru wine1.3-1.3.0/dlls/ddraw/vertexbuffer.c wine1.3-1.3.1/dlls/ddraw/vertexbuffer.c --- wine1.3-1.3.0/dlls/ddraw/vertexbuffer.c 2010-07-30 18:43:56.000000000 +0100 +++ wine1.3-1.3.1/dlls/ddraw/vertexbuffer.c 2010-08-20 18:23:50.000000000 +0100 @@ -21,28 +21,10 @@ #include "config.h" #include "wine/port.h" -#include "wine/debug.h" - -#include -#include -#include -#include - -#define COBJMACROS - -#include "windef.h" -#include "winbase.h" -#include "winerror.h" -#include "wingdi.h" -#include "wine/exception.h" - -#include "ddraw.h" -#include "d3d.h" #include "ddraw_private.h" -WINE_DEFAULT_DEBUG_CHANNEL(d3d7); -WINE_DECLARE_DEBUG_CHANNEL(ddraw_thunk); +WINE_DEFAULT_DEBUG_CHANNEL(ddraw); /***************************************************************************** * IUnknown Methods @@ -69,7 +51,8 @@ void **obj) { IDirect3DVertexBufferImpl *This = (IDirect3DVertexBufferImpl *)iface; - TRACE("(%p)->(%s,%p)\n", This, debugstr_guid(riid), obj); + + TRACE("iface %p, riid %s, object %p.\n", iface, debugstr_guid(riid), obj); /* By default, set the object pointer to NULL */ *obj = NULL; @@ -104,10 +87,9 @@ REFIID riid, void **obj) { - IDirect3DVertexBufferImpl *This = vb_from_vb1(iface); - TRACE_(ddraw_thunk)("(%p)->(%s,%p) thunking to IDirect3DVertexBuffer7 interface.\n", This, debugstr_guid(riid), obj); + TRACE("iface %p, riid %s, object %p.\n", iface, debugstr_guid(riid), obj); - return IDirect3DVertexBuffer7_QueryInterface((IDirect3DVertexBuffer7 *)This, riid, obj); + return IDirect3DVertexBuffer7_QueryInterface((IDirect3DVertexBuffer7 *)vb_from_vb1(iface), riid, obj); } /***************************************************************************** @@ -125,7 +107,7 @@ IDirect3DVertexBufferImpl *This = (IDirect3DVertexBufferImpl *)iface; ULONG ref = InterlockedIncrement(&This->ref); - TRACE("(%p/%p)->() incrementing from %u.\n", This, iface, ref - 1); + TRACE("%p increasing refcount to %u.\n", This, ref); return ref; } @@ -133,10 +115,9 @@ static ULONG WINAPI Thunk_IDirect3DVertexBufferImpl_1_AddRef(IDirect3DVertexBuffer *iface) { - IDirect3DVertexBufferImpl *This = vb_from_vb1(iface); - TRACE_(ddraw_thunk)("(%p)->() thunking to IDirect3DVertexBuffer7 interface.\n", This); + TRACE("iface %p.\n", iface); - return IDirect3DVertexBuffer7_AddRef((IDirect3DVertexBuffer7 *)This); + return IDirect3DVertexBuffer7_AddRef((IDirect3DVertexBuffer7 *)vb_from_vb1(iface)); } @@ -155,7 +136,7 @@ IDirect3DVertexBufferImpl *This = (IDirect3DVertexBufferImpl *)iface; ULONG ref = InterlockedDecrement(&This->ref); - TRACE("(%p)->() decrementing from %u.\n", This, ref + 1); + TRACE("%p decreasing refcount to %u.\n", This, ref); if (ref == 0) { @@ -198,10 +179,9 @@ static ULONG WINAPI Thunk_IDirect3DVertexBufferImpl_1_Release(IDirect3DVertexBuffer *iface) { - IDirect3DVertexBufferImpl *This = vb_from_vb1(iface); - TRACE_(ddraw_thunk)("(%p)->() thunking to IDirect3DVertexBuffer7 interface.\n", This); + TRACE("iface %p.\n", iface); - return IDirect3DVertexBuffer7_Release((IDirect3DVertexBuffer7 *)This); + return IDirect3DVertexBuffer7_Release((IDirect3DVertexBuffer7 *)vb_from_vb1(iface)); } /***************************************************************************** @@ -237,7 +217,8 @@ WINED3DBUFFER_DESC Desc; HRESULT hr; DWORD wined3d_flags = 0; - TRACE("(%p)->(%08x,%p,%p)\n", This, Flags, Data, Size); + + TRACE("iface %p, flags %#x, data %p, data_size %p.\n", iface, Flags, Data, Size); /* Writeonly: Pointless. Event: Unsupported by native according to the sdk * nosyslock: Not applicable @@ -273,10 +254,9 @@ void **Data, DWORD *Size) { - IDirect3DVertexBufferImpl *This = vb_from_vb1(iface); - TRACE_(ddraw_thunk)("(%p)->(%08x,%p,%p) thunking to IDirect3DVertexBuffer7 interface.\n", This, Flags, Data, Size); + TRACE("iface %p, flags %#x, data %p, data_size %p.\n", iface, Flags, Data, Size); - return IDirect3DVertexBuffer7_Lock((IDirect3DVertexBuffer7 *)This, Flags, Data, Size); + return IDirect3DVertexBuffer7_Lock((IDirect3DVertexBuffer7 *)vb_from_vb1(iface), Flags, Data, Size); } /***************************************************************************** @@ -293,7 +273,8 @@ { IDirect3DVertexBufferImpl *This = (IDirect3DVertexBufferImpl *)iface; HRESULT hr; - TRACE("(%p)->()\n", This); + + TRACE("iface %p.\n", iface); EnterCriticalSection(&ddraw_cs); hr = IWineD3DBuffer_Unmap(This->wineD3DVertexBuffer); @@ -305,10 +286,9 @@ static HRESULT WINAPI Thunk_IDirect3DVertexBufferImpl_1_Unlock(IDirect3DVertexBuffer *iface) { - IDirect3DVertexBufferImpl *This = vb_from_vb1(iface); - TRACE_(ddraw_thunk)("(%p)->() thunking to IDirect3DVertexBuffer7 interface.\n", This); + TRACE("iface %p.\n", iface); - return IDirect3DVertexBuffer7_Unlock((IDirect3DVertexBuffer7 *)This); + return IDirect3DVertexBuffer7_Unlock((IDirect3DVertexBuffer7 *)vb_from_vb1(iface)); } @@ -350,7 +330,8 @@ BOOL oldClip, doClip; HRESULT hr; - TRACE("(%p)->(%08x,%d,%d,%p,%d,%p,%08x)\n", This, VertexOp, DestIndex, Count, Src, SrcIndex, D3D, Flags); + TRACE("iface %p, vertex_op %#x, dst_idx %u, count %u, src_buffer %p, src_idx %u, device %p, flags %#x.\n", + iface, VertexOp, DestIndex, Count, SrcBuffer, SrcIndex, D3DDevice, Flags); /* Vertex operations: * D3DVOP_CLIP: Clips vertices outside the viewing frustrum. Needs clipping information @@ -415,14 +396,14 @@ IDirect3DDevice3 *D3DDevice, DWORD Flags) { - IDirect3DVertexBufferImpl *This = vb_from_vb1(iface); IDirect3DVertexBufferImpl *Src = SrcBuffer ? vb_from_vb1(SrcBuffer) : NULL; IDirect3DDeviceImpl *D3D = D3DDevice ? device_from_device3(D3DDevice) : NULL; - TRACE_(ddraw_thunk)("(%p)->(%08x,%08x,%08x,%p,%08x,%p,%08x) thunking to IDirect3DVertexBuffer7 interface.\n", This, VertexOp, DestIndex, Count, Src, SrcIndex, D3D, Flags); + TRACE("iface %p, vertex_op %#x, dst_idx %u, count %u, src_buffer %p, src_idx %u, device %p, flags %#x.\n", + iface, VertexOp, DestIndex, Count, SrcBuffer, SrcIndex, D3DDevice, Flags); - return IDirect3DVertexBuffer7_ProcessVertices((IDirect3DVertexBuffer7 *)This, VertexOp, DestIndex, - Count, (IDirect3DVertexBuffer7 *)Src, SrcIndex, (IDirect3DDevice7 *)D3D, Flags); + return IDirect3DVertexBuffer7_ProcessVertices((IDirect3DVertexBuffer7 *)vb_from_vb1(iface), VertexOp, + DestIndex, Count, (IDirect3DVertexBuffer7 *)Src, SrcIndex, (IDirect3DDevice7 *)D3D, Flags); } /***************************************************************************** @@ -445,7 +426,8 @@ IDirect3DVertexBufferImpl *This = (IDirect3DVertexBufferImpl *)iface; WINED3DBUFFER_DESC WDesc; HRESULT hr; - TRACE("(%p)->(%p)\n", This, Desc); + + TRACE("iface %p, desc %p.\n", iface, Desc); if(!Desc) return DDERR_INVALIDPARAMS; @@ -471,10 +453,9 @@ Thunk_IDirect3DVertexBufferImpl_1_GetVertexBufferDesc(IDirect3DVertexBuffer *iface, D3DVERTEXBUFFERDESC *Desc) { - IDirect3DVertexBufferImpl *This = vb_from_vb1(iface); - TRACE_(ddraw_thunk)("(%p)->(%p) thunking to IDirect3DVertexBuffer7 interface.\n", This, Desc); + TRACE("iface %p, desc %p.\n", iface, Desc); - return IDirect3DVertexBuffer7_GetVertexBufferDesc((IDirect3DVertexBuffer7 *)This, Desc); + return IDirect3DVertexBuffer7_GetVertexBufferDesc((IDirect3DVertexBuffer7 *)vb_from_vb1(iface), Desc); } @@ -497,12 +478,13 @@ DWORD Flags) { IDirect3DVertexBufferImpl *This = (IDirect3DVertexBufferImpl *)iface; - IDirect3DDeviceImpl *D3D = (IDirect3DDeviceImpl *)D3DDevice; static BOOL hide = FALSE; + TRACE("iface %p, device %p, flags %#x.\n", iface, D3DDevice, Flags); + if (!hide) { - FIXME("(%p)->(%p,%08x): stub!\n", This, D3D, Flags); + FIXME("iface %p, device %p, flags %#x stub!\n", iface, D3DDevice, Flags); hide = TRUE; } @@ -521,11 +503,12 @@ IDirect3DDevice3 *D3DDevice, DWORD Flags) { - IDirect3DVertexBufferImpl *This = vb_from_vb1(iface); IDirect3DDeviceImpl *D3D = D3DDevice ? device_from_device3(D3DDevice) : NULL; - TRACE_(ddraw_thunk)("(%p)->(%p,%08x) thunking to IDirect3DVertexBuffer7 interface.\n", This, D3D, Flags); - return IDirect3DVertexBuffer7_Optimize((IDirect3DVertexBuffer7 *)This, (IDirect3DDevice7 *)D3D, Flags); + TRACE("iface %p, device %p, flags %#x.\n", iface, D3DDevice, Flags); + + return IDirect3DVertexBuffer7_Optimize((IDirect3DVertexBuffer7 *)vb_from_vb1(iface), + (IDirect3DDevice7 *)D3D, Flags); } /***************************************************************************** @@ -560,9 +543,9 @@ IDirect3DDevice7 *D3DDevice, DWORD Flags) { - IDirect3DVertexBufferImpl *This = (IDirect3DVertexBufferImpl *)iface; - IDirect3DDeviceImpl *D3D = (IDirect3DDeviceImpl *)D3DDevice; - FIXME("(%p)->(%08x,%08x,%08x,%p,%08x,%p,%08x): stub!\n", This, VertexOp, DestIndex, Count, StrideData, VertexTypeDesc, D3D, Flags); + FIXME("iface %p, vertex_op %#x, dst_idx %u, count %u, data %p, vertex_type %#x, device %p, flags %#x stub!\n", + iface, VertexOp, DestIndex, Count, StrideData, VertexTypeDesc, D3DDevice, Flags); + return DD_OK; } @@ -570,7 +553,7 @@ * The VTables *****************************************************************************/ -const IDirect3DVertexBuffer7Vtbl IDirect3DVertexBuffer7_Vtbl = +static const struct IDirect3DVertexBuffer7Vtbl d3d_vertex_buffer7_vtbl = { /*** IUnknown Methods ***/ IDirect3DVertexBufferImpl_QueryInterface, @@ -586,7 +569,7 @@ IDirect3DVertexBufferImpl_ProcessVerticesStrided }; -const IDirect3DVertexBufferVtbl IDirect3DVertexBuffer1_Vtbl = +static const struct IDirect3DVertexBufferVtbl d3d_vertex_buffer1_vtbl = { /*** IUnknown Methods ***/ Thunk_IDirect3DVertexBufferImpl_1_QueryInterface, @@ -599,3 +582,53 @@ Thunk_IDirect3DVertexBufferImpl_1_GetVertexBufferDesc, Thunk_IDirect3DVertexBufferImpl_1_Optimize }; + +HRESULT d3d_vertex_buffer_init(IDirect3DVertexBufferImpl *buffer, + IDirectDrawImpl *ddraw, D3DVERTEXBUFFERDESC *desc) +{ + DWORD usage; + HRESULT hr; + + buffer->lpVtbl = &d3d_vertex_buffer7_vtbl; + buffer->IDirect3DVertexBuffer_vtbl = &d3d_vertex_buffer1_vtbl; + buffer->ref = 1; + + buffer->ddraw = ddraw; + buffer->Caps = desc->dwCaps; + buffer->fvf = desc->dwFVF; + + usage = desc->dwCaps & D3DVBCAPS_WRITEONLY ? WINED3DUSAGE_WRITEONLY : 0; + usage |= WINED3DUSAGE_STATICDECL; + + EnterCriticalSection(&ddraw_cs); + + hr = IWineD3DDevice_CreateVertexBuffer(ddraw->wineD3DDevice, + get_flexible_vertex_size(desc->dwFVF) * desc->dwNumVertices, + usage, desc->dwCaps & D3DVBCAPS_SYSTEMMEMORY ? WINED3DPOOL_SYSTEMMEM : WINED3DPOOL_DEFAULT, + &buffer->wineD3DVertexBuffer, (IUnknown *)buffer, &ddraw_null_wined3d_parent_ops); + if (FAILED(hr)) + { + WARN("Failed to create wined3d vertex buffer, hr %#x.\n", hr); + LeaveCriticalSection(&ddraw_cs); + + if (hr == WINED3DERR_INVALIDCALL) + return DDERR_INVALIDPARAMS; + else + return hr; + } + + buffer->wineD3DVertexDeclaration = ddraw_find_decl(ddraw, desc->dwFVF); + if (!buffer->wineD3DVertexDeclaration) + { + ERR("Failed to find vertex declaration for fvf %#x.\n", desc->dwFVF); + IWineD3DBuffer_Release(buffer->wineD3DVertexBuffer); + LeaveCriticalSection(&ddraw_cs); + + return DDERR_INVALIDPARAMS; + } + IWineD3DVertexDeclaration_AddRef(buffer->wineD3DVertexDeclaration); + + LeaveCriticalSection(&ddraw_cs); + + return D3D_OK; +} diff -Nru wine1.3-1.3.0/dlls/ddraw/viewport.c wine1.3-1.3.1/dlls/ddraw/viewport.c --- wine1.3-1.3.0/dlls/ddraw/viewport.c 2010-07-30 18:43:56.000000000 +0100 +++ wine1.3-1.3.1/dlls/ddraw/viewport.c 2010-08-20 18:23:50.000000000 +0100 @@ -22,27 +22,9 @@ #include "config.h" #include "wine/port.h" -#include -#include -#include -#include - -#define COBJMACROS -#define NONAMELESSUNION - -#include "windef.h" -#include "winbase.h" -#include "winerror.h" -#include "wingdi.h" -#include "wine/exception.h" - -#include "ddraw.h" -#include "d3d.h" - #include "ddraw_private.h" -#include "wine/debug.h" -WINE_DEFAULT_DEBUG_CHANNEL(d3d7); +WINE_DEFAULT_DEBUG_CHANNEL(ddraw); /***************************************************************************** * Helper functions @@ -62,8 +44,9 @@ /* Activate all the lights associated with this context */ light = This->lights; - while (light != NULL) { - light->activate(light); + while (light) + { + light_activate(light); light = light->next; } } @@ -148,7 +131,7 @@ REFIID riid, void **obp) { - TRACE("(%p)->(%s,%p)\n", iface, debugstr_guid(riid), obp); + TRACE("iface %p, riid %s, object %p.\n", iface, debugstr_guid(riid), obp); *obp = NULL; @@ -180,7 +163,7 @@ IDirect3DViewportImpl *This = (IDirect3DViewportImpl *)iface; ULONG ref = InterlockedIncrement(&This->ref); - TRACE("(%p)->() incrementing from %u.\n", This, ref - 1); + TRACE("%p increasing refcount to %u.\n", This, ref); return ref; } @@ -200,7 +183,7 @@ IDirect3DViewportImpl *This = (IDirect3DViewportImpl *)iface; ULONG ref = InterlockedDecrement(&This->ref); - TRACE("(%p)->() decrementing from %u.\n", This, ref + 1); + TRACE("%p decreasing refcount to %u.\n", This, ref); if (!ref) { HeapFree(GetProcessHeap(), 0, This); @@ -229,7 +212,8 @@ IDirect3DViewportImpl_Initialize(IDirect3DViewport3 *iface, IDirect3D *Direct3D) { - TRACE("(%p)->(%p) no-op...\n", iface, Direct3D); + TRACE("iface %p, d3d %p.\n", iface, Direct3D); + return DDERR_ALREADYINITIALIZED; } @@ -252,7 +236,8 @@ { IDirect3DViewportImpl *This = (IDirect3DViewportImpl *)iface; DWORD dwSize; - TRACE("(%p/%p)->(%p)\n", This, iface, lpData); + + TRACE("iface %p, data %p.\n", iface, lpData); EnterCriticalSection(&ddraw_cs); dwSize = lpData->dwSize; @@ -275,7 +260,8 @@ memcpy(lpData, &vp1, dwSize); } - if (TRACE_ON(d3d7)) { + if (TRACE_ON(ddraw)) + { TRACE(" returning D3DVIEWPORT :\n"); _dump_D3DVIEWPORT(lpData); } @@ -303,9 +289,11 @@ { IDirect3DViewportImpl *This = (IDirect3DViewportImpl *)iface; LPDIRECT3DVIEWPORT3 current_viewport; - TRACE("(%p/%p)->(%p)\n", This, iface, lpData); - if (TRACE_ON(d3d7)) { + TRACE("iface %p, data %p.\n", iface, lpData); + + if (TRACE_ON(ddraw)) + { TRACE(" getting D3DVIEWPORT :\n"); _dump_D3DVIEWPORT(lpData); } @@ -324,8 +312,9 @@ if (This->active_device) { IDirect3DDevice3 *d3d_device3 = (IDirect3DDevice3 *)&This->active_device->IDirect3DDevice3_vtbl; IDirect3DDevice3_GetCurrentViewport(d3d_device3, ¤t_viewport); - if (current_viewport) { - if ((IDirect3DViewportImpl *)current_viewport == This) This->activate(This, FALSE); + if (current_viewport) + { + if ((IDirect3DViewportImpl *)current_viewport == This) viewport_activate(This, FALSE); IDirect3DViewport3_Release(current_viewport); } } @@ -376,7 +365,9 @@ unsigned int i; D3DVIEWPORT vp = This->viewports.vp1; D3DHVERTEX *outH; - TRACE("(%p)->(%08x,%p,%08x,%p)\n", This, dwVertexCount, lpData, dwFlags, lpOffScreen); + + TRACE("iface %p, vertex_count %u, vertex_data %p, flags %#x, clip_plane %p.\n", + iface, dwVertexCount, lpData, dwFlags, lpOffScreen); /* Tests on windows show that Windows crashes when this occurs, * so don't return the (intuitive) return value @@ -507,8 +498,8 @@ DWORD dwElementCount, LPD3DLIGHTDATA lpData) { - IDirect3DViewportImpl *This = (IDirect3DViewportImpl *)iface; - TRACE("(%p)->(%08x,%p): Unimplemented!\n", This, dwElementCount, lpData); + TRACE("iface %p, element_count %u, data %p.\n", iface, dwElementCount, lpData); + return DDERR_UNSUPPORTED; } @@ -531,7 +522,7 @@ IDirect3DViewportImpl *This = (IDirect3DViewportImpl *)iface; IDirect3DMaterialImpl *m; - TRACE("(%p)->(%d)\n", This, hMat); + TRACE("iface %p, material %#x.\n", iface, hMat); EnterCriticalSection(&ddraw_cs); @@ -579,7 +570,8 @@ BOOL *lpValid) { IDirect3DViewportImpl *This = (IDirect3DViewportImpl *)iface; - TRACE("(%p)->(%p,%p)\n", This, lphMat, lpValid); + + TRACE("iface %p, material %p, valid %p.\n", iface, lphMat, lpValid); EnterCriticalSection(&ddraw_cs); if(lpValid) @@ -618,8 +610,8 @@ IDirect3DViewportImpl_SetBackgroundDepth(IDirect3DViewport3 *iface, IDirectDrawSurface *lpDDSurface) { - IDirect3DViewportImpl *This = (IDirect3DViewportImpl *)iface; - FIXME("(%p)->(%p): stub!\n", This, lpDDSurface); + FIXME("iface %p, surface %p stub!\n", iface, lpDDSurface); + return D3D_OK; } @@ -642,8 +634,8 @@ IDirectDrawSurface **lplpDDSurface, LPBOOL lpValid) { - IDirect3DViewportImpl *This = (IDirect3DViewportImpl *)iface; - FIXME("(%p)->(%p,%p): stub!\n", This, lplpDDSurface, lpValid); + FIXME("iface %p, surface %p, valid %p stub!\n", iface, lplpDDSurface, lpValid); + return DD_OK; } @@ -673,7 +665,8 @@ LPDIRECT3DVIEWPORT3 current_viewport; IDirect3DDevice3 *d3d_device3; - TRACE("(%p/%p)->(%08x,%p,%08x)\n", This, iface, dwCount, lpRects, dwFlags); + TRACE("iface %p, rect_count %u, rects %p, flags %#x.\n", iface, dwCount, lpRects, dwFlags); + if (This->active_device == NULL) { ERR(" Trying to clear a viewport not attached to a device !\n"); return D3DERR_VIEWPORTHASNODEVICE; @@ -696,7 +689,7 @@ /* Need to temporarily activate viewport to clear it. Previously active one will be restored afterwards. */ - This->activate(This, TRUE); + viewport_activate(This, TRUE); hr = IDirect3DDevice7_Clear((IDirect3DDevice7 *)This->active_device, dwCount, lpRects, dwFlags & (D3DCLEAR_ZBUFFER | D3DCLEAR_TARGET), color, 1.0, 0x00000000); @@ -704,7 +697,7 @@ IDirect3DDevice3_GetCurrentViewport(d3d_device3, ¤t_viewport); if(current_viewport) { IDirect3DViewportImpl *vp = (IDirect3DViewportImpl *)current_viewport; - vp->activate(vp, TRUE); + viewport_activate(vp, TRUE); IDirect3DViewport3_Release(current_viewport); } @@ -735,7 +728,7 @@ DWORD i = 0; DWORD map = This->map_lights; - TRACE("(%p)->(%p)\n", This, lpDirect3DLight); + TRACE("iface %p, light %p.\n", iface, lpDirect3DLight); EnterCriticalSection(&ddraw_cs); if (This->num_lights >= 8) @@ -762,9 +755,8 @@ lpDirect3DLightImpl->active_viewport = This; /* If active, activate the light */ - if (This->active_device != NULL) { - lpDirect3DLightImpl->activate(lpDirect3DLightImpl); - } + if (This->active_device) + light_activate(lpDirect3DLightImpl); LeaveCriticalSection(&ddraw_cs); return D3D_OK; @@ -791,13 +783,14 @@ IDirect3DLightImpl *lpDirect3DLightImpl = (IDirect3DLightImpl *)lpDirect3DLight; IDirect3DLightImpl *cur_light, *prev_light = NULL; - TRACE("(%p)->(%p)\n", This, lpDirect3DLight); + TRACE("iface %p, light %p.\n", iface, lpDirect3DLight); EnterCriticalSection(&ddraw_cs); cur_light = This->lights; while (cur_light != NULL) { - if (cur_light == lpDirect3DLightImpl) { - lpDirect3DLightImpl->desactivate(lpDirect3DLightImpl); + if (cur_light == lpDirect3DLightImpl) + { + light_deactivate(lpDirect3DLightImpl); if (prev_light == NULL) This->lights = cur_light->next; else prev_light->next = cur_light->next; /* Detach the light to the viewport */ @@ -838,7 +831,8 @@ IDirect3DViewportImpl *This = (IDirect3DViewportImpl *)iface; IDirect3DLightImpl *cur_light, *prev_light = NULL; - TRACE("(%p)->(%p,%p,%08x)\n", This, lpDirect3DLight, lplpDirect3DLight, dwFlags); + TRACE("iface %p, light %p, next_light %p, flags %#x.\n", + iface, lpDirect3DLight, lplpDirect3DLight, dwFlags); if (!lplpDirect3DLight) return DDERR_INVALIDPARAMS; @@ -912,7 +906,8 @@ { IDirect3DViewportImpl *This = (IDirect3DViewportImpl *)iface; DWORD dwSize; - TRACE("(%p)->(%p)\n", This, lpData); + + TRACE("iface %p, data %p.\n", iface, lpData); EnterCriticalSection(&ddraw_cs); dwSize = lpData->dwSize; @@ -935,7 +930,8 @@ memcpy(lpData, &vp2, dwSize); } - if (TRACE_ON(d3d7)) { + if (TRACE_ON(ddraw)) + { TRACE(" returning D3DVIEWPORT2 :\n"); _dump_D3DVIEWPORT2(lpData); } @@ -962,9 +958,11 @@ { IDirect3DViewportImpl *This = (IDirect3DViewportImpl *)iface; LPDIRECT3DVIEWPORT3 current_viewport; - TRACE("(%p/%p)->(%p)\n", This, iface, lpData); - if (TRACE_ON(d3d7)) { + TRACE("iface %p, data %p.\n", iface, lpData); + + if (TRACE_ON(ddraw)) + { TRACE(" getting D3DVIEWPORT2 :\n"); _dump_D3DVIEWPORT2(lpData); } @@ -977,8 +975,9 @@ if (This->active_device) { IDirect3DDevice3 *d3d_device3 = (IDirect3DDevice3 *)&This->active_device->IDirect3DDevice3_vtbl; IDirect3DDevice3_GetCurrentViewport(d3d_device3, ¤t_viewport); - if (current_viewport) { - if ((IDirect3DViewportImpl *)current_viewport == This) This->activate(This, FALSE); + if (current_viewport) + { + if ((IDirect3DViewportImpl *)current_viewport == This) viewport_activate(This, FALSE); IDirect3DViewport3_Release(current_viewport); } } @@ -1007,8 +1006,8 @@ IDirect3DViewportImpl_SetBackgroundDepth2(IDirect3DViewport3 *iface, IDirectDrawSurface4 *lpDDS) { - IDirect3DViewportImpl *This = (IDirect3DViewportImpl *)iface; - FIXME("(%p)->(%p): stub!\n", This, lpDDS); + FIXME("iface %p, surface %p stub!\n", iface, lpDDS); + return D3D_OK; } @@ -1030,8 +1029,8 @@ IDirectDrawSurface4 **lplpDDS, BOOL *lpValid) { - IDirect3DViewportImpl *This = (IDirect3DViewportImpl *)iface; - FIXME("(%p/%p)->(%p,%p): stub!\n", This, iface, lplpDDS, lpValid); + FIXME("iface %p, surface %p, valid %p stub!\n", iface, lplpDDS, lpValid); + return D3D_OK; } @@ -1064,7 +1063,9 @@ HRESULT hr; LPDIRECT3DVIEWPORT3 current_viewport; IDirect3DDevice3 *d3d_device3; - TRACE("(%p)->(%08x,%p,%08x,%08x,%f,%08x)\n", This, dwCount, lpRects, dwFlags, dwColor, dvZ, dwStencil); + + TRACE("iface %p, rect_count %u, rects %p, flags %#x, color 0x%08x, depth %.8e, stencil %u.\n", + iface, dwCount, lpRects, dwFlags, dwColor, dvZ, dwStencil); EnterCriticalSection(&ddraw_cs); if (This->active_device == NULL) { @@ -1073,16 +1074,16 @@ return D3DERR_VIEWPORTHASNODEVICE; } d3d_device3 = (IDirect3DDevice3 *)&This->active_device->IDirect3DDevice3_vtbl; - /* Need to temporarily activate viewport to clear it. Previously active one will be restored - afterwards. */ - This->activate(This, TRUE); + /* Need to temporarily activate viewport to clear it. Previously active + * one will be restored afterwards. */ + viewport_activate(This, TRUE); hr = IDirect3DDevice7_Clear((IDirect3DDevice7 *)This->active_device, dwCount, lpRects, dwFlags, dwColor, dvZ, dwStencil); IDirect3DDevice3_GetCurrentViewport(d3d_device3, ¤t_viewport); if(current_viewport) { IDirect3DViewportImpl *vp = (IDirect3DViewportImpl *)current_viewport; - vp->activate(vp, TRUE); + viewport_activate(vp, TRUE); IDirect3DViewport3_Release(current_viewport); } LeaveCriticalSection(&ddraw_cs); @@ -1093,7 +1094,7 @@ * The VTable *****************************************************************************/ -const IDirect3DViewport3Vtbl IDirect3DViewport3_Vtbl = +static const struct IDirect3DViewport3Vtbl d3d_viewport_vtbl = { /*** IUnknown Methods ***/ IDirect3DViewportImpl_QueryInterface, @@ -1121,3 +1122,11 @@ IDirect3DViewportImpl_GetBackgroundDepth2, IDirect3DViewportImpl_Clear2, }; + +void d3d_viewport_init(IDirect3DViewportImpl *viewport, IDirectDrawImpl *ddraw) +{ + viewport->lpVtbl = &d3d_viewport_vtbl; + viewport->ref = 1; + viewport->ddraw = ddraw; + viewport->use_vp2 = 0xff; +} diff -Nru wine1.3-1.3.0/dlls/dmime/performance.c wine1.3-1.3.1/dlls/dmime/performance.c --- wine1.3-1.3.0/dlls/dmime/performance.c 2010-07-30 18:43:56.000000000 +0100 +++ wine1.3-1.3.1/dlls/dmime/performance.c 2010-08-20 18:23:50.000000000 +0100 @@ -588,7 +588,16 @@ static HRESULT WINAPI IDirectMusicPerformance8Impl_PChannelInfo (LPDIRECTMUSICPERFORMANCE8 iface, DWORD dwPChannel, IDirectMusicPort** ppPort, DWORD* pdwGroup, DWORD* pdwMChannel) { IDirectMusicPerformance8Impl *This = (IDirectMusicPerformance8Impl *)iface; + DMUS_PORTPARAMS8 dmusportparams; + GUID def; + FIXME("(%p, %d, %p, %p, %p): stub\n", This, dwPChannel, ppPort, pdwGroup, pdwMChannel); + + dmusportparams.dwSize = sizeof(DMUS_PORTPARAMS8); + dmusportparams.dwValidParams = 0; + IDirectMusic8_GetDefaultPort(This->pDirectMusic, &def); + IDirectMusic8_CreatePort(This->pDirectMusic, &def, &dmusportparams, ppPort, NULL); + return S_OK; } diff -Nru wine1.3-1.3.0/dlls/dmime/tests/Makefile.in wine1.3-1.3.1/dlls/dmime/tests/Makefile.in --- wine1.3-1.3.0/dlls/dmime/tests/Makefile.in 1970-01-01 01:00:00.000000000 +0100 +++ wine1.3-1.3.1/dlls/dmime/tests/Makefile.in 2010-08-20 18:23:50.000000000 +0100 @@ -0,0 +1,11 @@ +TOPSRCDIR = @top_srcdir@ +TOPOBJDIR = ../../.. +SRCDIR = @srcdir@ +VPATH = @srcdir@ +TESTDLL = dmime.dll +IMPORTS = user32 ole32 + +C_SRCS = \ + performance.c + +@MAKE_TEST_RULES@ diff -Nru wine1.3-1.3.0/dlls/dmime/tests/performance.c wine1.3-1.3.1/dlls/dmime/tests/performance.c --- wine1.3-1.3.0/dlls/dmime/tests/performance.c 1970-01-01 01:00:00.000000000 +0100 +++ wine1.3-1.3.1/dlls/dmime/tests/performance.c 2010-08-20 18:23:50.000000000 +0100 @@ -0,0 +1,102 @@ +/* + * Unit test suite for IDirectMusicPerformance + * + * Copyright 2010 Austin Lund + * + * 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 + +IDirectMusicPerformance8 *idmusicperformance; + +static HRESULT test_InitAudio(void) +{ + IDirectSound *pDirectSound; + HRESULT hr; + + pDirectSound = NULL; + hr = IDirectMusicPerformance8_InitAudio(idmusicperformance ,NULL, + &pDirectSound, NULL, DMUS_APATH_SHARED_STEREOPLUSREVERB, 128, DMUS_AUDIOF_ALL, NULL); + return hr; +} + +static void test_PChannelInfo(void) +{ + IDirectMusicPort *pDirectMusicPort; + HRESULT hr; + + pDirectMusicPort = NULL; + hr = IDirectMusicPerformance8_PChannelInfo(idmusicperformance, 0, &pDirectMusicPort, NULL, NULL); + ok(hr == S_OK, "Failed to call PChannelInfo (%x)\n", hr); + ok(pDirectMusicPort != NULL, "IDirectMusicPort not set\n"); + if (hr == S_OK && pDirectMusicPort != NULL) + IDirectMusicPort_Release(pDirectMusicPort); +} + +static void test_GetDefaultAudioPath(void) +{ + IDirectMusicAudioPath *pDirectMusicAudioPath; + HRESULT hr; + + hr = IDirectMusicPerformance8_GetDefaultAudioPath(idmusicperformance, &pDirectMusicAudioPath); + ok(hr == S_OK, "Failed to call GetDefaultAudioPath (%x)\n", hr); + if (hr == S_OK) + IDirectMusicAudioPath_Release(pDirectMusicAudioPath); +} + +static void test_CloseDown(void) +{ + HRESULT hr; + + hr = IDirectMusicPerformance8_CloseDown(idmusicperformance); + ok(hr == S_OK, "Failed to call CloseDown (%x)\n", hr); +} + +START_TEST( performance ) +{ + HRESULT hr; + + hr = CoInitialize(NULL); + if (FAILED(hr)) { + skip("Cannot initialize COM (%x)\n", hr); + return; + } + + hr = CoCreateInstance(&CLSID_DirectMusicPerformance, NULL, + CLSCTX_INPROC_SERVER, &IID_IDirectMusicPerformance8, (LPVOID *)&idmusicperformance); + if (hr != S_OK) { + skip("Cannot create DirectMusicPerformance object (%x)\n", hr); + CoUninitialize(); + return; + } + + hr = test_InitAudio(); + if (hr != S_OK) { + skip("InitAudio failed (%x)\n", hr); + return; + } + + test_GetDefaultAudioPath(); + test_PChannelInfo(); + test_CloseDown(); + + IDirectMusicPerformance8_Release(idmusicperformance); + CoUninitialize(); +} diff -Nru wine1.3-1.3.0/dlls/dsound/duplex.c wine1.3-1.3.1/dlls/dsound/duplex.c --- wine1.3-1.3.0/dlls/dsound/duplex.c 2010-07-30 18:43:56.000000000 +0100 +++ wine1.3-1.3.1/dlls/dsound/duplex.c 2010-08-20 18:23:50.000000000 +0100 @@ -24,7 +24,6 @@ #define NONAMELESSSTRUCT #define NONAMELESSUNION -#define CINTERFACE #define COBJMACROS #include "windef.h" #include "winbase.h" diff -Nru wine1.3-1.3.0/dlls/dwmapi/dwmapi_main.c wine1.3-1.3.1/dlls/dwmapi/dwmapi_main.c --- wine1.3-1.3.0/dlls/dwmapi/dwmapi_main.c 2010-07-30 18:43:56.000000000 +0100 +++ wine1.3-1.3.1/dlls/dwmapi/dwmapi_main.c 2010-08-20 18:23:50.000000000 +0100 @@ -176,3 +176,15 @@ return E_NOTIMPL; } + +/********************************************************************** + * DwmDefWindowProc (DWMAPI.@) + */ +BOOL WINAPI DwmDefWindowProc(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam, LRESULT *plResult) +{ + static int i; + + if (!i++) FIXME("stub\n"); + + return FALSE; +} diff -Nru wine1.3-1.3.0/dlls/dwmapi/dwmapi.spec wine1.3-1.3.1/dlls/dwmapi/dwmapi.spec --- wine1.3-1.3.0/dlls/dwmapi/dwmapi.spec 2010-07-30 18:43:56.000000000 +0100 +++ wine1.3-1.3.1/dlls/dwmapi/dwmapi.spec 2010-08-20 18:23:50.000000000 +0100 @@ -21,7 +21,7 @@ 120 stub @ @ stub DwmAttachMilContent -@ stub DwmDefWindowProc +@ stdcall DwmDefWindowProc(long long long long ptr) @ stub DwmDetachMilContent @ stdcall DwmEnableBlurBehindWindow(ptr ptr) @ stdcall DwmEnableMMCSS(long) diff -Nru wine1.3-1.3.0/dlls/explorerframe/eframe.rc wine1.3-1.3.1/dlls/explorerframe/eframe.rc --- wine1.3-1.3.0/dlls/explorerframe/eframe.rc 1970-01-01 01:00:00.000000000 +0100 +++ wine1.3-1.3.1/dlls/explorerframe/eframe.rc 2010-08-20 18:23:50.000000000 +0100 @@ -0,0 +1,22 @@ +/* + * ExplorerFrame main resource file + * + * Copyright 2010 David Hedberg + * + * 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 + */ + +/* @makedep: explorerframe.inf */ +REGINST REGINST explorerframe.inf diff -Nru wine1.3-1.3.0/dlls/explorerframe/explorerframe.inf wine1.3-1.3.1/dlls/explorerframe/explorerframe.inf --- wine1.3-1.3.0/dlls/explorerframe/explorerframe.inf 1970-01-01 01:00:00.000000000 +0100 +++ wine1.3-1.3.1/dlls/explorerframe/explorerframe.inf 2010-08-20 18:23:50.000000000 +0100 @@ -0,0 +1,17 @@ +[version] +Signature="$CHICAGO$" + +[RegisterDll] +AddReg=Classes.Reg + +[UnregisterDll] +DelReg=Classes.Reg + +[Classes.Reg] +; For some reason called "ListView" in the registry. +HKCR,"CLSID\%CLSID_NamespaceTreeControl%",,,"Shell Name Space ListView" +HKCR,"CLSID\%CLSID_NamespaceTreeControl%\InProcServer32",,,"%MODULE%" +HKCR,"CLSID\%CLSID_NamespaceTreeControl%\InProcServer32","ThreadingModel",,"Apartment" + +[Strings] +MODULE="explorerframe.dll" diff -Nru wine1.3-1.3.0/dlls/explorerframe/explorerframe_main.c wine1.3-1.3.1/dlls/explorerframe/explorerframe_main.c --- wine1.3-1.3.0/dlls/explorerframe/explorerframe_main.c 1970-01-01 01:00:00.000000000 +0100 +++ wine1.3-1.3.1/dlls/explorerframe/explorerframe_main.c 2010-08-20 18:23:50.000000000 +0100 @@ -0,0 +1,286 @@ +/* + * ExplorerFrame main functions + * + * Copyright 2010 David Hedberg + * + * 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 + +#define COBJMACROS +#define NONAMELESSUNION +#define NONAMELESSSTRUCT + +#include "windef.h" +#include "winbase.h" +#include "winuser.h" +#include "winreg.h" +#include "shlwapi.h" +#include "advpub.h" +#include "shobjidl.h" + +#include "wine/debug.h" + +#include "explorerframe_main.h" + +WINE_DEFAULT_DEBUG_CHANNEL(explorerframe); + +HINSTANCE explorerframe_hinstance; +LONG EFRAME_refCount = 0; + +/************************************************************************* + * DllMain (ExplorerFrame.@) + */ +BOOL WINAPI DllMain(HINSTANCE hinst, DWORD fdwReason, LPVOID fImpLoad) +{ + TRACE("%p, 0x%x, %p\n", hinst, fdwReason, fImpLoad); + switch (fdwReason) + { + case DLL_PROCESS_ATTACH: + DisableThreadLibraryCalls(hinst); + explorerframe_hinstance = hinst; + break; + case DLL_PROCESS_DETACH: + break; + } + return TRUE; +} + +/************************************************************************* + * DllCanUnloadNow (ExplorerFrame.@) + */ +HRESULT WINAPI DllCanUnloadNow(void) +{ + TRACE("refCount is %d\n", EFRAME_refCount); + return EFRAME_refCount ? S_FALSE : S_OK; +} + +/************************************************************************* + * DllGetVersion (ExplorerFrame.@) + */ +HRESULT WINAPI DllGetVersion(DLLVERSIONINFO *info) +{ + TRACE("%p\n", info); + if(info->cbSize == sizeof(DLLVERSIONINFO) || + info->cbSize == sizeof(DLLVERSIONINFO2)) + { + /* Windows 7 */ + info->dwMajorVersion = 6; + info->dwMinorVersion = 1; + info->dwBuildNumber = 7600; + info->dwPlatformID = DLLVER_PLATFORM_WINDOWS; + if(info->cbSize == sizeof(DLLVERSIONINFO2)) + { + DLLVERSIONINFO2 *info2 = (DLLVERSIONINFO2*)info; + info2->dwFlags = 0; + info2->ullVersion = MAKEDLLVERULL(info->dwMajorVersion, + info->dwMinorVersion, + info->dwBuildNumber, + 16385); /* "hotfix number" */ + } + return S_OK; + } + + WARN("wrong DLLVERSIONINFO size from app.\n"); + return E_INVALIDARG; +} + +/************************************************************************* + * Implement the ExplorerFrame class factory + * + * (Taken from shdocvw/factory.c; based on implementation in + * ddraw/main.c) + */ + +#define FACTORY(x) ((IClassFactory*) &(x)->lpClassFactoryVtbl) + +typedef struct +{ + const IClassFactoryVtbl *lpClassFactoryVtbl; + HRESULT (*cf)(IUnknown*, REFIID, void**); + LONG ref; +} IClassFactoryImpl; + +/************************************************************************* + * EFCF_QueryInterface (IUnknown) + */ +static HRESULT WINAPI EFCF_QueryInterface(IClassFactory* iface, + REFIID riid, void **ppobj) +{ + TRACE("%p (%s %p)\n", iface, debugstr_guid(riid), ppobj); + + if(!ppobj) + return E_POINTER; + + if(IsEqualGUID(&IID_IUnknown, riid) || IsEqualGUID(&IID_IClassFactory, riid)) + { + *ppobj = iface; + IClassFactory_AddRef(iface); + return S_OK; + } + + WARN("Interface not supported.\n"); + + *ppobj = NULL; + return E_NOINTERFACE; +} + +/************************************************************************* + * EFCF_AddRef (IUnknown) + */ +static ULONG WINAPI EFCF_AddRef(IClassFactory *iface) +{ + EFRAME_LockModule(); + + return 2; /* non-heap based object */ +} + +/************************************************************************* + * EFCF_Release (IUnknown) + */ +static ULONG WINAPI EFCF_Release(IClassFactory *iface) +{ + EFRAME_UnlockModule(); + + return 1; /* non-heap based object */ +} + +/************************************************************************* + * EFCF_CreateInstance (IClassFactory) + */ +static HRESULT WINAPI EFCF_CreateInstance(IClassFactory *iface, IUnknown *pOuter, + REFIID riid, void **ppobj) +{ + IClassFactoryImpl *This = (IClassFactoryImpl *)iface; + return This->cf(pOuter, riid, ppobj); +} + +/************************************************************************* + * EFCF_LockServer (IClassFactory) + */ +static HRESULT WINAPI EFCF_LockServer(IClassFactory *iface, BOOL dolock) +{ + TRACE("%p (%d)\n", iface, dolock); + + if (dolock) + EFRAME_LockModule(); + else + EFRAME_UnlockModule(); + + return S_OK; +} + +static const IClassFactoryVtbl EFCF_Vtbl = +{ + EFCF_QueryInterface, + EFCF_AddRef, + EFCF_Release, + EFCF_CreateInstance, + EFCF_LockServer +}; + +/************************************************************************* + * DllGetClassObject (ExplorerFrame.@) + */ +HRESULT WINAPI DllGetClassObject(REFCLSID rclsid, REFIID riid, void **ppv) +{ + static IClassFactoryImpl NSTCClassFactory = {&EFCF_Vtbl, NamespaceTreeControl_Constructor}; + + TRACE("%s, %s, %p\n", debugstr_guid(rclsid), debugstr_guid(riid), ppv); + + if(IsEqualGUID(&CLSID_NamespaceTreeControl, rclsid)) + return IClassFactory_QueryInterface(FACTORY(&NSTCClassFactory), riid, ppv); + + return CLASS_E_CLASSNOTAVAILABLE; +} + +/************************************************************************* + * Register/Unregister DLL, based on shdocvw/factory.c + */ +static HRESULT reg_install(LPCSTR section, STRTABLEA *strtable) +{ + HRESULT (WINAPI *pRegInstall)(HMODULE hm, LPCSTR pszSection, const STRTABLEA* pstTable); + HMODULE hadvpack; + HRESULT hres; + + static const WCHAR advpackW[] = {'a','d','v','p','a','c','k','.','d','l','l',0}; + + hadvpack = LoadLibraryW(advpackW); + pRegInstall = (void *)GetProcAddress(hadvpack, "RegInstall"); + + hres = pRegInstall(explorerframe_hinstance, section, strtable); + + FreeLibrary(hadvpack); + return hres; +} + +#define INF_SET_CLSID(clsid) \ + do \ + { \ + static CHAR name[] = "CLSID_" #clsid; \ + \ + pse[i].pszName = name; \ + clsids[i++] = &CLSID_ ## clsid; \ + } while (0) + +static HRESULT register_server(BOOL doregister) +{ + STRTABLEA strtable; + STRENTRYA pse[1]; + static CLSID const *clsids[1]; + unsigned int i = 0; + HRESULT hres; + + INF_SET_CLSID(NamespaceTreeControl); + + for(i = 0; i < sizeof(pse)/sizeof(pse[0]); i++) + { + pse[i].pszValue = HeapAlloc(GetProcessHeap(), 0, 39); + sprintf(pse[i].pszValue, "{%08X-%04X-%04X-%02X%02X-%02X%02X%02X%02X%02X%02X}", + clsids[i]->Data1, clsids[i]->Data2, clsids[i]->Data3, clsids[i]->Data4[0], + clsids[i]->Data4[1], clsids[i]->Data4[2], clsids[i]->Data4[3], clsids[i]->Data4[4], + clsids[i]->Data4[5], clsids[i]->Data4[6], clsids[i]->Data4[7]); + } + + strtable.cEntries = sizeof(pse)/sizeof(pse[0]); + strtable.pse = pse; + + hres = reg_install(doregister ? "RegisterDll" : "UnregisterDll", &strtable); + + for(i=0; i < sizeof(pse)/sizeof(pse[0]); i++) + HeapFree(GetProcessHeap(), 0, pse[i].pszValue); + + return hres; +} + +#undef INF_SET_CLSID + +/************************************************************************* + * DllRegisterServer (ExplorerFrame.@) + */ +HRESULT WINAPI DllRegisterServer(void) +{ + return register_server(TRUE); +} + +/************************************************************************* + * DllUnregisterServer (ExplorerFrame.@) + */ +HRESULT WINAPI DllUnregisterServer(void) +{ + return register_server(FALSE); +} diff -Nru wine1.3-1.3.0/dlls/explorerframe/explorerframe_main.h wine1.3-1.3.1/dlls/explorerframe/explorerframe_main.h --- wine1.3-1.3.0/dlls/explorerframe/explorerframe_main.h 1970-01-01 01:00:00.000000000 +0100 +++ wine1.3-1.3.1/dlls/explorerframe/explorerframe_main.h 2010-08-20 18:23:50.000000000 +0100 @@ -0,0 +1,37 @@ +/* + * ExplorerFrame main include + * + * Copyright 2010 David Hedberg + * + * 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_EXPLORERFRAME_H +#define __WINE_EXPLORERFRAME_H + +#include "shlobj.h" + +/* Not declared in commctrl.h ("for internal use (msdn)") */ +#define TVS_EX_NOSINGLECOLLAPSE 0x0001 + +extern HINSTANCE explorerframe_hinstance; + +extern LONG EFRAME_refCount; +static inline void EFRAME_LockModule(void) { InterlockedIncrement( &EFRAME_refCount ); } +static inline void EFRAME_UnlockModule(void) { InterlockedDecrement( &EFRAME_refCount ); } + +HRESULT NamespaceTreeControl_Constructor(IUnknown *pUnkOuter, REFIID riid, void **ppv); + +#endif /* __WINE_EXPLORERFRAME_H */ diff -Nru wine1.3-1.3.0/dlls/explorerframe/explorerframe.spec wine1.3-1.3.1/dlls/explorerframe/explorerframe.spec --- wine1.3-1.3.0/dlls/explorerframe/explorerframe.spec 1970-01-01 01:00:00.000000000 +0100 +++ wine1.3-1.3.1/dlls/explorerframe/explorerframe.spec 2010-08-20 18:23:50.000000000 +0100 @@ -0,0 +1,9 @@ +# 110 stub EXPLORERFRAME_110 +# 111 stub EXPLORERFRAME_111 +# 134 stub EXPLORERFRAME_134 + +@ stdcall -private DllCanUnloadNow() +@ stdcall -private DllGetClassObject(ptr ptr ptr) +@ stdcall -private DllGetVersion(ptr) +@ stdcall -private DllRegisterServer() +@ stdcall -private DllUnregisterServer() diff -Nru wine1.3-1.3.0/dlls/explorerframe/Makefile.in wine1.3-1.3.1/dlls/explorerframe/Makefile.in --- wine1.3-1.3.0/dlls/explorerframe/Makefile.in 1970-01-01 01:00:00.000000000 +0100 +++ wine1.3-1.3.1/dlls/explorerframe/Makefile.in 2010-08-20 18:23:50.000000000 +0100 @@ -0,0 +1,17 @@ +EXTRADEFS = -DCOM_NO_WINDOWS_H +TOPSRCDIR = @top_srcdir@ +TOPOBJDIR = ../.. +SRCDIR = @srcdir@ +VPATH = @srcdir@ +MODULE = explorerframe.dll +IMPORTS = uuid ole32 shell32 user32 + +C_SRCS = \ + explorerframe_main.c \ + nstc.c + +RC_SRCS = \ + eframe.rc \ + version.rc + +@MAKE_DLL_RULES@ diff -Nru wine1.3-1.3.0/dlls/explorerframe/nstc.c wine1.3-1.3.1/dlls/explorerframe/nstc.c --- wine1.3-1.3.0/dlls/explorerframe/nstc.c 1970-01-01 01:00:00.000000000 +0100 +++ wine1.3-1.3.1/dlls/explorerframe/nstc.c 2010-08-20 18:23:50.000000000 +0100 @@ -0,0 +1,1600 @@ +/* + * NamespaceTreeControl implementation. + * + * Copyright 2010 David Hedberg + * + * 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 +#define NONAMELESSUNION +#define NONAMELESSSTRUCT + +#include "winerror.h" +#include "windef.h" +#include "winbase.h" +#include "winuser.h" +#include "shellapi.h" + +#include "wine/list.h" +#include "wine/debug.h" + +#include "explorerframe_main.h" + +WINE_DEFAULT_DEBUG_CHANNEL(nstc); + +typedef struct nstc_root { + IShellItem *psi; + HTREEITEM htreeitem; + SHCONTF enum_flags; + NSTCROOTSTYLE root_style; + IShellItemFilter *pif; + struct list entry; +} nstc_root; + +typedef struct { + const INameSpaceTreeControl2Vtbl *lpVtbl; + const IOleWindowVtbl *lpowVtbl; + LONG ref; + + HWND hwnd_main; + HWND hwnd_tv; + + WNDPROC tv_oldwndproc; + + NSTCSTYLE style; + NSTCSTYLE2 style2; + struct list roots; + + INameSpaceTreeControlEvents *pnstce; +} NSTC2Impl; + +static const DWORD unsupported_styles = + NSTCS_SINGLECLICKEXPAND | NSTCS_NOREPLACEOPEN | NSTCS_NOORDERSTREAM | NSTCS_FAVORITESMODE | + NSTCS_EMPTYTEXT | NSTCS_ALLOWJUNCTIONS | NSTCS_SHOWTABSBUTTON | NSTCS_SHOWDELETEBUTTON | + NSTCS_SHOWREFRESHBUTTON | NSTCS_SPRINGEXPAND | NSTCS_RICHTOOLTIP | NSTCS_NOINDENTCHECKS; +static const DWORD unsupported_styles2 = + NSTCS2_INTERRUPTNOTIFICATIONS | NSTCS2_SHOWNULLSPACEMENU | NSTCS2_DISPLAYPADDING | + NSTCS2_DISPLAYPINNEDONLY | NTSCS2_NOSINGLETONAUTOEXPAND | NTSCS2_NEVERINSERTNONENUMERATED; + +/* Forward declarations */ +static LRESULT CALLBACK tv_wndproc(HWND hWnd, UINT uMessage, WPARAM wParam, LPARAM lParam); + +/************************************************************************* +* NamespaceTree event wrappers +*/ +static HRESULT events_OnGetDefaultIconIndex(NSTC2Impl *This, IShellItem *psi, + int *piDefaultIcon, int *piOpenIcon) +{ + HRESULT ret; + LONG refcount; + if(!This->pnstce) return E_NOTIMPL; + + refcount = IShellItem_AddRef(psi); + ret = INameSpaceTreeControlEvents_OnGetDefaultIconIndex(This->pnstce, psi, piDefaultIcon, piOpenIcon); + if(IShellItem_Release(psi) < refcount - 1) + ERR("ShellItem was released by client - please file a bug.\n"); + return ret; +} + +static HRESULT events_OnItemAdded(NSTC2Impl *This, IShellItem *psi, BOOL fIsRoot) +{ + HRESULT ret; + LONG refcount; + if(!This->pnstce) return S_OK; + + refcount = IShellItem_AddRef(psi); + ret = INameSpaceTreeControlEvents_OnItemAdded(This->pnstce, psi, fIsRoot); + if(IShellItem_Release(psi) < refcount - 1) + ERR("ShellItem was released by client - please file a bug.\n"); + return ret; +} + +static HRESULT events_OnItemDeleted(NSTC2Impl *This, IShellItem *psi, BOOL fIsRoot) +{ + HRESULT ret; + LONG refcount; + if(!This->pnstce) return S_OK; + + refcount = IShellItem_AddRef(psi); + ret = INameSpaceTreeControlEvents_OnItemDeleted(This->pnstce, psi, fIsRoot); + if(IShellItem_Release(psi) < refcount - 1) + ERR("ShellItem was released by client - please file a bug.\n"); + return ret; +} + +static HRESULT events_OnBeforeExpand(NSTC2Impl *This, IShellItem *psi) +{ + HRESULT ret; + LONG refcount; + if(!This->pnstce) return S_OK; + + refcount = IShellItem_AddRef(psi); + ret = INameSpaceTreeControlEvents_OnBeforeExpand(This->pnstce, psi); + if(IShellItem_Release(psi) < refcount - 1) + ERR("ShellItem was released by client - please file a bug.\n"); + return ret; +} + +static HRESULT events_OnAfterExpand(NSTC2Impl *This, IShellItem *psi) +{ + HRESULT ret; + LONG refcount; + if(!This->pnstce) return S_OK; + + refcount = IShellItem_AddRef(psi); + ret = INameSpaceTreeControlEvents_OnAfterExpand(This->pnstce, psi); + if(IShellItem_Release(psi) < refcount - 1) + ERR("ShellItem was released by client - please file a bug.\n"); + return ret; +} + +static HRESULT events_OnItemClick(NSTC2Impl *This, IShellItem *psi, + NSTCEHITTEST nstceHitTest, NSTCECLICKTYPE nstceClickType) +{ + HRESULT ret; + LONG refcount; + if(!This->pnstce) return S_OK; + + refcount = IShellItem_AddRef(psi); + ret = INameSpaceTreeControlEvents_OnItemClick(This->pnstce, psi, nstceHitTest, nstceClickType); + if(IShellItem_Release(psi) < refcount - 1) + ERR("ShellItem was released by client - please file a bug.\n"); + return ret; +} + +static HRESULT events_OnSelectionChanged(NSTC2Impl *This, IShellItemArray *psia) +{ + if(!This->pnstce) return S_OK; + + return INameSpaceTreeControlEvents_OnSelectionChanged(This->pnstce, psia); +} + +static HRESULT events_OnKeyboardInput(NSTC2Impl *This, UINT uMsg, WPARAM wParam, LPARAM lParam) +{ + if(!This->pnstce) return S_OK; + + return INameSpaceTreeControlEvents_OnKeyboardInput(This->pnstce, uMsg, wParam, lParam); +} + +/************************************************************************* + * NamespaceTree helper functions + */ +static DWORD treeview_style_from_nstcs(NSTC2Impl *This, NSTCSTYLE nstcs, + NSTCSTYLE nstcs_mask, DWORD *new_style) +{ + DWORD old_style, tv_mask = 0; + TRACE("%p, %x, %x, %p\n", This, nstcs, nstcs_mask, new_style); + + if(This->hwnd_tv) + old_style = GetWindowLongPtrW(This->hwnd_tv, GWL_STYLE); + else + old_style = /* The default */ + WS_CHILD | WS_VISIBLE | WS_CLIPSIBLINGS | WS_CLIPCHILDREN | + WS_TABSTOP | TVS_NOHSCROLL | TVS_NONEVENHEIGHT | TVS_INFOTIP | + TVS_EDITLABELS | TVS_TRACKSELECT; + + if(nstcs_mask & NSTCS_HASEXPANDOS) tv_mask |= TVS_HASBUTTONS; + if(nstcs_mask & NSTCS_HASLINES) tv_mask |= TVS_HASLINES; + if(nstcs_mask & NSTCS_FULLROWSELECT) tv_mask |= TVS_FULLROWSELECT; + if(nstcs_mask & NSTCS_HORIZONTALSCROLL) tv_mask |= TVS_NOHSCROLL; + if(nstcs_mask & NSTCS_ROOTHASEXPANDO) tv_mask |= TVS_LINESATROOT; + if(nstcs_mask & NSTCS_SHOWSELECTIONALWAYS) tv_mask |= TVS_SHOWSELALWAYS; + if(nstcs_mask & NSTCS_NOINFOTIP) tv_mask |= TVS_INFOTIP; + if(nstcs_mask & NSTCS_EVENHEIGHT) tv_mask |= TVS_NONEVENHEIGHT; + if(nstcs_mask & NSTCS_DISABLEDRAGDROP) tv_mask |= TVS_DISABLEDRAGDROP; + if(nstcs_mask & NSTCS_NOEDITLABELS) tv_mask |= TVS_EDITLABELS; + if(nstcs_mask & NSTCS_CHECKBOXES) tv_mask |= TVS_CHECKBOXES; + + *new_style = 0; + + if(nstcs & NSTCS_HASEXPANDOS) *new_style |= TVS_HASBUTTONS; + if(nstcs & NSTCS_HASLINES) *new_style |= TVS_HASLINES; + if(nstcs & NSTCS_FULLROWSELECT) *new_style |= TVS_FULLROWSELECT; + if(!(nstcs & NSTCS_HORIZONTALSCROLL)) *new_style |= TVS_NOHSCROLL; + if(nstcs & NSTCS_ROOTHASEXPANDO) *new_style |= TVS_LINESATROOT; + if(nstcs & NSTCS_SHOWSELECTIONALWAYS) *new_style |= TVS_SHOWSELALWAYS; + if(!(nstcs & NSTCS_NOINFOTIP)) *new_style |= TVS_INFOTIP; + if(!(nstcs & NSTCS_EVENHEIGHT)) *new_style |= TVS_NONEVENHEIGHT; + if(nstcs & NSTCS_DISABLEDRAGDROP) *new_style |= TVS_DISABLEDRAGDROP; + if(!(nstcs & NSTCS_NOEDITLABELS)) *new_style |= TVS_EDITLABELS; + if(nstcs & NSTCS_CHECKBOXES) *new_style |= TVS_CHECKBOXES; + + *new_style = (old_style & ~tv_mask) | (*new_style & tv_mask); + + TRACE("old: %08x, new: %08x\n", old_style, *new_style); + + return old_style^*new_style; +} + +static IShellItem *shellitem_from_treeitem(NSTC2Impl *This, HTREEITEM hitem) +{ + TVITEMEXW tvi; + + tvi.mask = TVIF_PARAM; + tvi.lParam = 0; + tvi.hItem = hitem; + + SendMessageW(This->hwnd_tv, TVM_GETITEMW, 0, (LPARAM)&tvi); + + TRACE("ShellItem: %p\n", (void*)tvi.lParam); + return (IShellItem*)tvi.lParam; +} + +/* Returns the root that the given treeitem belongs to. */ +static nstc_root *root_for_treeitem(NSTC2Impl *This, HTREEITEM hitem) +{ + HTREEITEM tmp, hroot = hitem; + nstc_root *root; + + /* Work our way up the hierarchy */ + for(tmp = hitem; tmp != NULL; hroot = tmp?tmp:hroot) + tmp = (HTREEITEM)SendMessageW(This->hwnd_tv, TVM_GETNEXTITEM, TVGN_PARENT, (LPARAM)hroot); + + /* Search through the list of roots for a match */ + LIST_FOR_EACH_ENTRY(root, &This->roots, nstc_root, entry) + if(root->htreeitem == hroot) + break; + + TRACE("root is %p\n", root); + return root; +} + +/* Find a shellitem in the tree, starting from the given node. */ +static HTREEITEM search_for_shellitem(NSTC2Impl *This, HTREEITEM node, + IShellItem *psi) +{ + IShellItem *psi_node; + HTREEITEM next, result = NULL; + HRESULT hr; + int cmpo; + TRACE("%p, %p, %p\n", This, node, psi); + + /* Check this node */ + psi_node = shellitem_from_treeitem(This, node); + hr = IShellItem_Compare(psi, psi_node, SICHINT_DISPLAY, &cmpo); + if(hr == S_OK) + return node; + + /* Any children? */ + next = (HTREEITEM)SendMessageW(This->hwnd_tv, TVM_GETNEXTITEM, + TVGN_CHILD, (LPARAM)node); + if(next) + { + result = search_for_shellitem(This, next, psi); + if(result) return result; + } + + /* Try our next sibling. */ + next = (HTREEITEM)SendMessageW(This->hwnd_tv, TVM_GETNEXTITEM, + TVGN_NEXT, (LPARAM)node); + if(next) + result = search_for_shellitem(This, next, psi); + + return result; +} + +static HTREEITEM treeitem_from_shellitem(NSTC2Impl *This, IShellItem *psi) +{ + HTREEITEM root; + TRACE("%p, %p\n", This, psi); + + root = (HTREEITEM)SendMessageW(This->hwnd_tv, TVM_GETNEXTITEM, + TVGN_ROOT, 0); + if(!root) + return NULL; + + return search_for_shellitem(This, root, psi); +} + +static int get_icon(LPCITEMIDLIST lpi, UINT extra_flags) +{ + SHFILEINFOW sfi; + UINT flags = SHGFI_PIDL | SHGFI_SYSICONINDEX | SHGFI_SMALLICON; + SHGetFileInfoW((LPCWSTR)lpi, 0 ,&sfi, sizeof(SHFILEINFOW), flags | extra_flags); + return sfi.iIcon; +} + +/* Insert a shellitem into the given place in the tree and return the + resulting treeitem. */ +static HTREEITEM insert_shellitem(NSTC2Impl *This, IShellItem *psi, + HTREEITEM hParent, HTREEITEM hInsertAfter) +{ + TVINSERTSTRUCTW tvins; + TVITEMEXW *tvi = &tvins.u.itemex; + HTREEITEM hinserted; + TRACE("%p (%p, %p)\n", psi, hParent, hInsertAfter); + + tvi->mask = TVIF_PARAM | TVIF_CHILDREN | TVIF_IMAGE | TVIF_SELECTEDIMAGE | TVIF_TEXT; + tvi->cChildren = I_CHILDRENCALLBACK; + tvi->iImage = tvi->iSelectedImage = I_IMAGECALLBACK; + tvi->pszText = LPSTR_TEXTCALLBACKW; + + /* Every treeitem contains a pointer to the corresponding ShellItem. */ + tvi->lParam = (LPARAM)psi; + tvins.hParent = hParent; + tvins.hInsertAfter = hInsertAfter; + + hinserted = (HTREEITEM)SendMessageW(This->hwnd_tv, TVM_INSERTITEMW, 0, + (LPARAM)(LPTVINSERTSTRUCTW)&tvins); + if(hinserted) + IShellItem_AddRef(psi); + + return hinserted; +} + +/* Enumerates the children of the folder represented by hitem + * according to the settings for the root, and adds them to the + * treeview. Returns the number of children added. */ +static UINT fill_sublevel(NSTC2Impl *This, HTREEITEM hitem) +{ + IShellItem *psiParent = shellitem_from_treeitem(This, hitem); + nstc_root *root = root_for_treeitem(This, hitem); + LPITEMIDLIST pidl_parent; + IShellFolder *psf; + IEnumIDList *peidl; + UINT added = 0; + HRESULT hr; + + hr = SHGetIDListFromObject((IUnknown*)psiParent, &pidl_parent); + if(SUCCEEDED(hr)) + { + hr = IShellItem_BindToHandler(psiParent, NULL, &BHID_SFObject, &IID_IShellFolder, (void**)&psf); + if(SUCCEEDED(hr)) + { + hr = IShellFolder_EnumObjects(psf, NULL, root->enum_flags, &peidl); + if(SUCCEEDED(hr)) + { + LPITEMIDLIST pidl; + IShellItem *psi; + ULONG fetched; + + while( S_OK == IEnumIDList_Next(peidl, 1, &pidl, &fetched) ) + { + hr = SHCreateShellItem(NULL, psf , pidl, &psi); + ILFree(pidl); + if(SUCCEEDED(hr)) + { + if(insert_shellitem(This, psi, hitem, NULL)) + { + events_OnItemAdded(This, psi, FALSE); + added++; + } + + IShellItem_Release(psi); + } + else + ERR("SHCreateShellItem failed with 0x%08x\n", hr); + } + IEnumIDList_Release(peidl); + } + else + ERR("EnumObjects failed with 0x%08x\n", hr); + + IShellFolder_Release(psf); + } + else + ERR("BindToHandler failed with 0x%08x\n", hr); + + ILFree(pidl_parent); + } + else + ERR("SHGetIDListFromObject failed with 0x%08x\n", hr); + + return added; +} + +static HTREEITEM get_selected_treeitem(NSTC2Impl *This) +{ + return (HTREEITEM)SendMessageW(This->hwnd_tv, TVM_GETNEXTITEM, TVGN_CARET, 0); +} + +static IShellItem *get_selected_shellitem(NSTC2Impl *This) +{ + return shellitem_from_treeitem(This, get_selected_treeitem(This)); +} + +static void collapse_all(NSTC2Impl *This, HTREEITEM node) +{ + HTREEITEM next; + + /* Collapse this node first, and then first child/next sibling. */ + SendMessageW(This->hwnd_tv, TVM_EXPAND, TVE_COLLAPSE, (LPARAM)node); + + next = (HTREEITEM)SendMessageW(This->hwnd_tv, TVM_GETNEXTITEM, TVGN_CHILD, (LPARAM)node); + if(next) collapse_all(This, next); + + next = (HTREEITEM)SendMessageW(This->hwnd_tv, TVM_GETNEXTITEM, TVGN_NEXT, (LPARAM)node); + if(next) collapse_all(This, next); +} + +static HTREEITEM treeitem_from_point(NSTC2Impl *This, POINT *pt, UINT *hitflag) +{ + TVHITTESTINFO tviht; + tviht.pt.x = pt->x; + tviht.pt.y = pt->y; + tviht.hItem = NULL; + + SendMessageW(This->hwnd_tv, TVM_HITTEST, 0, (LPARAM)&tviht); + if(hitflag) *hitflag = tviht.flags; + return tviht.hItem; +} + +/************************************************************************* + * NamespaceTree window functions + */ +static LRESULT create_namespacetree(HWND hWnd, CREATESTRUCTW *crs) +{ + NSTC2Impl *This = crs->lpCreateParams; + HIMAGELIST ShellSmallIconList; + DWORD treeview_style, treeview_ex_style; + + TRACE("%p (%p)\n", This, crs); + SetWindowLongPtrW(hWnd, GWLP_USERDATA, (LPARAM)This); + This->hwnd_main = hWnd; + + treeview_style_from_nstcs(This, This->style, 0xFFFFFFFF, &treeview_style); + + This->hwnd_tv = CreateWindowExW(0, WC_TREEVIEWW, NULL, treeview_style, + 0, 0, crs->cx, crs->cy, + hWnd, NULL, explorerframe_hinstance, NULL); + + if(!This->hwnd_tv) + { + ERR("Failed to create treeview!\n"); + return HRESULT_FROM_WIN32(GetLastError()); + } + + treeview_ex_style = TVS_EX_DRAWIMAGEASYNC | TVS_EX_RICHTOOLTIP | + TVS_EX_DOUBLEBUFFER | TVS_EX_NOSINGLECOLLAPSE; + + if(This->style & NSTCS_AUTOHSCROLL) + treeview_ex_style |= TVS_EX_AUTOHSCROLL; + if(This->style & NSTCS_FADEINOUTEXPANDOS) + treeview_ex_style |= TVS_EX_FADEINOUTEXPANDOS; + if(This->style & NSTCS_PARTIALCHECKBOXES) + treeview_ex_style |= TVS_EX_PARTIALCHECKBOXES; + if(This->style & NSTCS_EXCLUSIONCHECKBOXES) + treeview_ex_style |= TVS_EX_EXCLUSIONCHECKBOXES; + if(This->style & NSTCS_DIMMEDCHECKBOXES) + treeview_ex_style |= TVS_EX_DIMMEDCHECKBOXES; + + SendMessageW(This->hwnd_tv, TVM_SETEXTENDEDSTYLE, treeview_ex_style, 0xffff); + + if(Shell_GetImageLists(NULL, &ShellSmallIconList)) + { + SendMessageW(This->hwnd_tv, TVM_SETIMAGELIST, + (WPARAM)TVSIL_NORMAL, (LPARAM)ShellSmallIconList); + } + else + { + ERR("Failed to get the System Image List.\n"); + } + + INameSpaceTreeControl_AddRef((INameSpaceTreeControl*)This); + + /* Subclass the treeview to get the keybord events. */ + This->tv_oldwndproc = (WNDPROC)SetWindowLongPtrW(This->hwnd_tv, GWLP_WNDPROC, + (ULONG_PTR)tv_wndproc); + if(This->tv_oldwndproc) + SetPropA(This->hwnd_tv, "PROP_THIS", This); + + return TRUE; +} + +static LRESULT resize_namespacetree(NSTC2Impl *This) +{ + RECT rc; + TRACE("%p\n", This); + + GetClientRect(This->hwnd_main, &rc); + MoveWindow(This->hwnd_tv, 0, 0, rc.right-rc.left, rc.bottom-rc.top, TRUE); + + return TRUE; +} + +static LRESULT destroy_namespacetree(NSTC2Impl *This) +{ + TRACE("%p\n", This); + + /* Undo the subclassing */ + if(This->tv_oldwndproc) + { + SetWindowLongPtrW(This->hwnd_tv, GWLP_WNDPROC, (ULONG_PTR)This->tv_oldwndproc); + RemovePropA(This->hwnd_tv, "PROP_THIS"); + } + + INameSpaceTreeControl_RemoveAllRoots((INameSpaceTreeControl*)This); + + /* This reference was added in create_namespacetree */ + INameSpaceTreeControl_Release((INameSpaceTreeControl*)This); + return TRUE; +} + +static LRESULT on_tvn_deleteitemw(NSTC2Impl *This, LPARAM lParam) +{ + NMTREEVIEWW *nmtv = (NMTREEVIEWW*)lParam; + TRACE("%p\n", This); + + IShellItem_Release((IShellItem*)nmtv->itemOld.lParam); + return TRUE; +} + +static LRESULT on_tvn_getdispinfow(NSTC2Impl *This, LPARAM lParam) +{ + NMTVDISPINFOW *dispinfo = (NMTVDISPINFOW*)lParam; + TVITEMEXW *item = (TVITEMEXW*)&dispinfo->item; + IShellItem *psi = shellitem_from_treeitem(This, item->hItem); + HRESULT hr; + + TRACE("%p, %p (mask: %x)\n", This, dispinfo, item->mask); + + if(item->mask & TVIF_CHILDREN) + { + SFGAOF sfgao; + + hr = IShellItem_GetAttributes(psi, SFGAO_HASSUBFOLDER, &sfgao); + if(SUCCEEDED(hr)) + item->cChildren = (sfgao & SFGAO_HASSUBFOLDER)?1:0; + else + item->cChildren = 1; + + item->mask |= TVIF_DI_SETITEM; + } + + if(item->mask & (TVIF_IMAGE|TVIF_SELECTEDIMAGE)) + { + LPITEMIDLIST pidl; + + hr = events_OnGetDefaultIconIndex(This, psi, &item->iImage, &item->iSelectedImage); + if(FAILED(hr)) + { + hr = SHGetIDListFromObject((IUnknown*)psi, &pidl); + if(SUCCEEDED(hr)) + { + item->iImage = item->iSelectedImage = get_icon(pidl, 0); + item->mask |= TVIF_DI_SETITEM; + ILFree(pidl); + } + else + ERR("Failed to get IDList (%08x).\n", hr); + } + } + + if(item->mask & TVIF_TEXT) + { + LPWSTR display_name; + + hr = IShellItem_GetDisplayName(psi, SIGDN_NORMALDISPLAY, &display_name); + if(SUCCEEDED(hr)) + { + lstrcpynW(item->pszText, display_name, MAX_PATH); + item->mask |= TVIF_DI_SETITEM; + CoTaskMemFree(display_name); + } + else + ERR("Failed to get display name (%08x).\n", hr); + } + + return TRUE; +} + +static BOOL treenode_has_subfolders(NSTC2Impl *This, HTREEITEM node) +{ + return SendMessageW(This->hwnd_tv, TVM_GETNEXTITEM, TVGN_CHILD, (LPARAM)node); +} + +static LRESULT on_tvn_itemexpandingw(NSTC2Impl *This, LPARAM lParam) +{ + NMTREEVIEWW *nmtv = (NMTREEVIEWW*)lParam; + IShellItem *psi; + TRACE("%p\n", This); + + psi = shellitem_from_treeitem(This, nmtv->itemNew.hItem); + events_OnBeforeExpand(This, psi); + + if(!treenode_has_subfolders(This, nmtv->itemNew.hItem)) + { + /* The node has no children, try to find some */ + if(!fill_sublevel(This, nmtv->itemNew.hItem)) + { + TVITEMEXW tvi; + /* Failed to enumerate any children, remove the expando + * (if any). */ + tvi.hItem = nmtv->itemNew.hItem; + tvi.mask = TVIF_CHILDREN; + tvi.cChildren = 0; + SendMessageW(This->hwnd_tv, TVM_SETITEMW, 0, (LPARAM)&tvi); + + return TRUE; + } + } + return FALSE; +} + +static LRESULT on_tvn_itemexpandedw(NSTC2Impl *This, LPARAM lParam) +{ + NMTREEVIEWW *nmtv = (NMTREEVIEWW*)lParam; + IShellItem *psi; + TRACE("%p\n", This); + + psi = shellitem_from_treeitem(This, nmtv->itemNew.hItem); + events_OnAfterExpand(This, psi); + return TRUE; +} + +static LRESULT on_tvn_selchangedw(NSTC2Impl *This, LPARAM lParam) +{ + NMTREEVIEWW *nmtv = (NMTREEVIEWW*)lParam; + IShellItemArray *psia; + IShellItem *psi; + HRESULT hr; + TRACE("%p\n", This); + + /* Note: Only supports one selected item. */ + psi = shellitem_from_treeitem(This, nmtv->itemNew.hItem); + hr = SHCreateShellItemArrayFromShellItem(psi, &IID_IShellItemArray, (void**)&psia); + if(SUCCEEDED(hr)) + { + events_OnSelectionChanged(This, psia); + IShellItemArray_Release(psia); + } + + return TRUE; +} + +static LRESULT on_nm_click(NSTC2Impl *This, NMHDR *nmhdr) +{ + TVHITTESTINFO tvhit; + IShellItem *psi; + HRESULT hr; + TRACE("%p (%p)\n", This, nmhdr); + + GetCursorPos(&tvhit.pt); + ScreenToClient(This->hwnd_tv, &tvhit.pt); + SendMessageW(This->hwnd_tv, TVM_HITTEST, 0, (LPARAM)&tvhit); + + if(tvhit.flags & (TVHT_NOWHERE|TVHT_ABOVE|TVHT_BELOW)) + return TRUE; + + /* TVHT_ maps onto the corresponding NSTCEHT_ */ + psi = shellitem_from_treeitem(This, tvhit.hItem); + hr = events_OnItemClick(This, psi, tvhit.flags, NSTCECT_LBUTTON); + + /* The expando should not be expanded unless + * double-clicked. */ + if(tvhit.flags == TVHT_ONITEMBUTTON) + return TRUE; + + if(SUCCEEDED(hr)) + return FALSE; + else + return TRUE; +} + +static LRESULT on_wm_mbuttonup(NSTC2Impl *This, WPARAM wParam, LPARAM lParam) +{ + TVHITTESTINFO tvhit; + IShellItem *psi; + HRESULT hr; + TRACE("%p (%lx, %lx)\n", This, wParam, lParam); + + tvhit.pt.x = (int)(short)LOWORD(lParam); + tvhit.pt.y = (int)(short)HIWORD(lParam); + + SendMessageW(This->hwnd_tv, TVM_HITTEST, 0, (LPARAM)&tvhit); + + /* Seems to generate only ONITEM and ONITEMICON */ + if( !(tvhit.flags & (TVHT_ONITEM|TVHT_ONITEMICON)) ) + return FALSE; + + psi = shellitem_from_treeitem(This, tvhit.hItem); + hr = events_OnItemClick(This, psi, tvhit.flags, NSTCECT_MBUTTON); + + if(SUCCEEDED(hr)) + return FALSE; + else + return TRUE; +} + +static LRESULT on_kbd_event(NSTC2Impl *This, UINT uMsg, WPARAM wParam, LPARAM lParam) +{ + IShellItem *psi; + HTREEITEM hitem; + TRACE("%p : %d, %lx, %lx\n", This, uMsg, wParam, lParam); + + /* Handled by the client? */ + if(FAILED(events_OnKeyboardInput(This, uMsg, wParam, lParam))) + return TRUE; + + if(uMsg == WM_KEYDOWN) + { + switch(wParam) + { + case VK_DELETE: + psi = get_selected_shellitem(This); + FIXME("Deletion of file requested (shellitem: %p).\n", psi); + return TRUE; + + case VK_F2: + hitem = get_selected_treeitem(This); + SendMessageW(This->hwnd_tv, TVM_EDITLABELW, 0, (LPARAM)hitem); + return TRUE; + } + } + + /* Let the TreeView handle the key */ + return FALSE; +} + +static LRESULT CALLBACK tv_wndproc(HWND hWnd, UINT uMessage, WPARAM wParam, LPARAM lParam) +{ + NSTC2Impl *This = (NSTC2Impl*)GetPropA(hWnd, "PROP_THIS"); + + switch(uMessage) { + case WM_KEYDOWN: + case WM_KEYUP: + case WM_CHAR: + case WM_SYSKEYDOWN: + case WM_SYSKEYUP: + case WM_SYSCHAR: + if(on_kbd_event(This, uMessage, wParam, lParam)) + return TRUE; + break; + + case WM_MBUTTONUP: return on_wm_mbuttonup(This, wParam, lParam); + } + + /* Pass the message on to the treeview */ + return CallWindowProcW(This->tv_oldwndproc, hWnd, uMessage, wParam, lParam); +} + +static LRESULT CALLBACK NSTC2_WndProc(HWND hWnd, UINT uMessage, + WPARAM wParam, LPARAM lParam) +{ + NSTC2Impl *This = (NSTC2Impl*)GetWindowLongPtrW(hWnd, GWLP_USERDATA); + NMHDR *nmhdr; + + switch(uMessage) + { + case WM_NCCREATE: return create_namespacetree(hWnd, (CREATESTRUCTW*)lParam); + case WM_SIZE: return resize_namespacetree(This); + case WM_DESTROY: return destroy_namespacetree(This); + case WM_NOTIFY: + nmhdr = (NMHDR*)lParam; + switch(nmhdr->code) + { + case NM_CLICK: return on_nm_click(This, nmhdr); + case TVN_DELETEITEMW: return on_tvn_deleteitemw(This, lParam); + case TVN_GETDISPINFOW: return on_tvn_getdispinfow(This, lParam); + case TVN_ITEMEXPANDINGW: return on_tvn_itemexpandingw(This, lParam); + case TVN_ITEMEXPANDEDW: return on_tvn_itemexpandedw(This, lParam); + case TVN_SELCHANGEDW: return on_tvn_selchangedw(This, lParam); + default: break; + } + break; + default: return DefWindowProcW(hWnd, uMessage, wParam, lParam); + } + return 0; +} + +/************************************************************************** + * INameSpaceTreeControl2 Implementation + */ +static HRESULT WINAPI NSTC2_fnQueryInterface(INameSpaceTreeControl2* iface, + REFIID riid, + void **ppvObject) +{ + NSTC2Impl *This = (NSTC2Impl*)iface; + TRACE("%p (%s, %p)\n", This, debugstr_guid(riid), ppvObject); + + *ppvObject = NULL; + if(IsEqualIID(riid, &IID_INameSpaceTreeControl2) || + IsEqualIID(riid, &IID_INameSpaceTreeControl) || + IsEqualIID(riid, &IID_IUnknown)) + { + *ppvObject = This; + } + else if(IsEqualIID(riid, &IID_IOleWindow)) + { + *ppvObject = &This->lpowVtbl; + } + + if(*ppvObject) + { + IUnknown_AddRef((IUnknown*)*ppvObject); + return S_OK; + } + + return E_NOINTERFACE; +} + +static ULONG WINAPI NSTC2_fnAddRef(INameSpaceTreeControl2* iface) +{ + NSTC2Impl *This = (NSTC2Impl*)iface; + LONG ref = InterlockedIncrement(&This->ref); + + TRACE("%p - ref %d\n", This, ref); + + return ref; +} + +static ULONG WINAPI NSTC2_fnRelease(INameSpaceTreeControl2* iface) +{ + NSTC2Impl *This = (NSTC2Impl*)iface; + LONG ref = InterlockedDecrement(&This->ref); + + TRACE("%p - ref: %d\n", This, ref); + + if(!ref) + { + TRACE("Freeing.\n"); + HeapFree(GetProcessHeap(), 0, This); + EFRAME_UnlockModule(); + return 0; + } + + return ref; +} + +static HRESULT WINAPI NSTC2_fnInitialize(INameSpaceTreeControl2* iface, + HWND hwndParent, + RECT *prc, + NSTCSTYLE nstcsFlags) +{ + NSTC2Impl *This = (NSTC2Impl*)iface; + WNDCLASSW wc; + DWORD window_style, window_ex_style; + RECT rc; + static const WCHAR NSTC2_CLASS_NAME[] = + {'N','a','m','e','s','p','a','c','e','T','r','e','e', + 'C','o','n','t','r','o','l',0}; + + TRACE("%p (%p, %p, %x)\n", This, hwndParent, prc, nstcsFlags); + + if(nstcsFlags & unsupported_styles) + FIXME("0x%08x contains the unsupported style(s) 0x%08x\n", + nstcsFlags, nstcsFlags & unsupported_styles); + + This->style = nstcsFlags; + + if(!GetClassInfoW(explorerframe_hinstance, NSTC2_CLASS_NAME, &wc)) + { + wc.style = CS_HREDRAW | CS_VREDRAW; + wc.lpfnWndProc = NSTC2_WndProc; + wc.cbClsExtra = 0; + wc.cbWndExtra = 0; + wc.hInstance = explorerframe_hinstance; + wc.hIcon = 0; + wc.hCursor = LoadCursorW(0, (LPWSTR)IDC_ARROW); + wc.hbrBackground = (HBRUSH)(COLOR_WINDOW + 1); + wc.lpszMenuName = NULL; + wc.lpszClassName = NSTC2_CLASS_NAME; + + if (!RegisterClassW(&wc)) return E_FAIL; + } + + /* NSTCS_TABSTOP and NSTCS_BORDER affects the host window */ + window_style = WS_VISIBLE | WS_CHILD | WS_CLIPCHILDREN | WS_CLIPSIBLINGS | + (nstcsFlags & NSTCS_BORDER ? WS_BORDER : 0); + window_ex_style = nstcsFlags & NSTCS_TABSTOP ? WS_EX_CONTROLPARENT : 0; + + if(prc) + CopyRect(&rc, prc); + else + rc.left = rc.right = rc.top = rc.bottom = 0; + + This->hwnd_main = CreateWindowExW(window_ex_style, NSTC2_CLASS_NAME, NULL, window_style, + rc.left, rc.top, rc.right - rc.left, rc.bottom - rc.top, + hwndParent, 0, explorerframe_hinstance, This); + + if(!This->hwnd_main) + { + ERR("Failed to create the window.\n"); + return HRESULT_FROM_WIN32(GetLastError()); + } + + return S_OK; +} + +static HRESULT WINAPI NSTC2_fnTreeAdvise(INameSpaceTreeControl2* iface, + IUnknown *punk, + DWORD *pdwCookie) +{ + NSTC2Impl *This = (NSTC2Impl*)iface; + HRESULT hr; + TRACE("%p (%p, %p)\n", This, punk, pdwCookie); + + *pdwCookie = 0; + + /* Only one client supported */ + if(This->pnstce) + return E_FAIL; + + hr = IUnknown_QueryInterface(punk, &IID_INameSpaceTreeControlEvents,(void**)&This->pnstce); + if(SUCCEEDED(hr)) + { + *pdwCookie = 1; + return hr; + } + + return E_FAIL; +} + +static HRESULT WINAPI NSTC2_fnTreeUnadvise(INameSpaceTreeControl2* iface, + DWORD dwCookie) +{ + NSTC2Impl *This = (NSTC2Impl*)iface; + TRACE("%p (%x)\n", This, dwCookie); + + /* The cookie is ignored. */ + + if(This->pnstce) + { + INameSpaceTreeControlEvents_Release(This->pnstce); + This->pnstce = NULL; + } + + return S_OK; +} + +static HRESULT WINAPI NSTC2_fnInsertRoot(INameSpaceTreeControl2* iface, + int iIndex, + IShellItem *psiRoot, + SHCONTF grfEnumFlags, + NSTCROOTSTYLE grfRootStyle, + IShellItemFilter *pif) +{ + NSTC2Impl *This = (NSTC2Impl*)iface; + nstc_root *new_root; + struct list *add_after_entry; + HTREEITEM add_after_hitem; + UINT i; + + TRACE("%p, %d, %p, %x, %x, %p\n", This, iIndex, psiRoot, grfEnumFlags, grfRootStyle, pif); + + new_root = HeapAlloc(GetProcessHeap(), 0, sizeof(nstc_root)); + if(!new_root) + return E_OUTOFMEMORY; + + new_root->psi = psiRoot; + new_root->enum_flags = grfEnumFlags; + new_root->root_style = grfRootStyle; + new_root->pif = pif; + + /* We want to keep the roots in the internal list and in the + * treeview in the same order. */ + add_after_entry = &This->roots; + for(i = 0; i < max(0, iIndex) && list_next(&This->roots, add_after_entry); i++) + add_after_entry = list_next(&This->roots, add_after_entry); + + if(add_after_entry == &This->roots) + add_after_hitem = TVI_FIRST; + else + add_after_hitem = LIST_ENTRY(add_after_entry, nstc_root, entry)->htreeitem; + + new_root->htreeitem = insert_shellitem(This, psiRoot, TVI_ROOT, add_after_hitem); + if(!new_root->htreeitem) + { + WARN("Failed to add the root.\n"); + HeapFree(GetProcessHeap(), 0, new_root); + return E_FAIL; + } + + list_add_after(add_after_entry, &new_root->entry); + events_OnItemAdded(This, psiRoot, TRUE); + + if(grfRootStyle & NSTCRS_HIDDEN) + { + TVITEMEXW tvi; + tvi.mask = TVIF_STATEEX; + tvi.uStateEx = TVIS_EX_FLAT; + tvi.hItem = new_root->htreeitem; + + SendMessageW(This->hwnd_tv, TVM_SETITEMW, 0, (LPARAM)&tvi); + } + + if(grfRootStyle & NSTCRS_EXPANDED) + SendMessageW(This->hwnd_tv, TVM_EXPAND, TVE_EXPAND, + (LPARAM)new_root->htreeitem); + + return S_OK; +} + +static HRESULT WINAPI NSTC2_fnAppendRoot(INameSpaceTreeControl2* iface, + IShellItem *psiRoot, + SHCONTF grfEnumFlags, + NSTCROOTSTYLE grfRootStyle, + IShellItemFilter *pif) +{ + NSTC2Impl *This = (NSTC2Impl*)iface; + UINT root_count; + TRACE("%p, %p, %x, %x, %p\n", + This, psiRoot, grfEnumFlags, grfRootStyle, pif); + + root_count = list_count(&This->roots); + + return NSTC2_fnInsertRoot(iface, root_count, psiRoot, grfEnumFlags, grfRootStyle, pif); +} + +static HRESULT WINAPI NSTC2_fnRemoveRoot(INameSpaceTreeControl2* iface, + IShellItem *psiRoot) +{ + NSTC2Impl *This = (NSTC2Impl*)iface; + nstc_root *cursor, *root = NULL; + TRACE("%p (%p)\n", This, psiRoot); + + if(!psiRoot) + return E_NOINTERFACE; + + LIST_FOR_EACH_ENTRY(cursor, &This->roots, nstc_root, entry) + { + HRESULT hr; + int order; + hr = IShellItem_Compare(psiRoot, cursor->psi, SICHINT_DISPLAY, &order); + if(hr == S_OK) + { + root = cursor; + break; + } + } + + TRACE("root %p\n", root); + if(root) + { + events_OnItemDeleted(This, root->psi, TRUE); + SendMessageW(This->hwnd_tv, TVM_DELETEITEM, 0, (LPARAM)root->htreeitem); + list_remove(&root->entry); + HeapFree(GetProcessHeap(), 0, root); + return S_OK; + } + else + { + WARN("No matching root found.\n"); + return E_FAIL; + } +} + +static HRESULT WINAPI NSTC2_fnRemoveAllRoots(INameSpaceTreeControl2* iface) +{ + NSTC2Impl *This = (NSTC2Impl*)iface; + nstc_root *cur1, *cur2; + UINT removed = 0; + TRACE("%p\n", This); + + LIST_FOR_EACH_ENTRY_SAFE(cur1, cur2, &This->roots, nstc_root, entry) + { + NSTC2_fnRemoveRoot(iface, cur1->psi); + removed++; + } + + if(removed) + return S_OK; + else + return E_INVALIDARG; +} + +static HRESULT WINAPI NSTC2_fnGetRootItems(INameSpaceTreeControl2* iface, + IShellItemArray **ppsiaRootItems) +{ + NSTC2Impl *This = (NSTC2Impl*)iface; + IShellFolder *psf; + LPITEMIDLIST *array; + nstc_root *root; + UINT count, i; + HRESULT hr; + TRACE("%p (%p)\n", This, ppsiaRootItems); + + count = list_count(&This->roots); + + if(!count) + return E_INVALIDARG; + + array = HeapAlloc(GetProcessHeap(), 0, sizeof(LPITEMIDLIST*)*count); + + i = 0; + LIST_FOR_EACH_ENTRY(root, &This->roots, nstc_root, entry) + SHGetIDListFromObject((IUnknown*)root->psi, &array[i++]); + + SHGetDesktopFolder(&psf); + hr = SHCreateShellItemArray(NULL, psf, count, (PCUITEMID_CHILD_ARRAY)array, + ppsiaRootItems); + IShellFolder_Release(psf); + + for(i = 0; i < count; i++) + ILFree(array[i]); + + HeapFree(GetProcessHeap(), 0, array); + + return hr; +} + +static HRESULT WINAPI NSTC2_fnSetItemState(INameSpaceTreeControl2* iface, + IShellItem *psi, + NSTCITEMSTATE nstcisMask, + NSTCITEMSTATE nstcisFlags) +{ + NSTC2Impl *This = (NSTC2Impl*)iface; + TVITEMEXW tvi; + HTREEITEM hitem; + + TRACE("%p (%p, %x, %x)\n", This, psi, nstcisMask, nstcisFlags); + + hitem = treeitem_from_shellitem(This, psi); + if(!hitem) return E_INVALIDARG; + + /* Passing both NSTCIS_SELECTED and NSTCIS_SELECTEDNOEXPAND results + in two TVM_SETITEMW's */ + if((nstcisMask&nstcisFlags) & NSTCIS_SELECTED) + { + SendMessageW(This->hwnd_tv, TVM_SELECTITEM, TVGN_CARET, (LPARAM)hitem); + SendMessageW(This->hwnd_tv, TVM_ENSUREVISIBLE, 0, (LPARAM)hitem); + } + if((nstcisMask&nstcisFlags) & NSTCIS_SELECTEDNOEXPAND) + { + SendMessageW(This->hwnd_tv, TVM_SELECTITEM, TVGN_CARET|TVSI_NOSINGLEEXPAND, (LPARAM)hitem); + } + + /* If NSTCIS_EXPANDED is among the flags, the mask is ignored. */ + if((nstcisMask|nstcisFlags) & NSTCIS_EXPANDED) + { + WPARAM arg = nstcisFlags&NSTCIS_EXPANDED ? TVE_EXPAND:TVE_COLLAPSE; + SendMessageW(This->hwnd_tv, TVM_EXPAND, arg, (LPARAM)hitem); + } + + if(nstcisMask & NSTCIS_DISABLED) + tvi.mask = TVIF_STATE | TVIF_STATEEX; + else if( ((nstcisMask^nstcisFlags) & (NSTCIS_SELECTED|NSTCIS_EXPANDED|NSTCIS_SELECTEDNOEXPAND)) || + ((nstcisMask|nstcisFlags) & NSTCIS_BOLD) || + (nstcisFlags & NSTCIS_DISABLED) ) + tvi.mask = TVIF_STATE; + else + tvi.mask = 0; + + if(tvi.mask) + { + tvi.stateMask = tvi.state = 0; + tvi.stateMask |= ((nstcisFlags^nstcisMask)&NSTCIS_SELECTED) ? TVIS_SELECTED : 0; + tvi.stateMask |= (nstcisMask|nstcisFlags)&NSTCIS_BOLD ? TVIS_BOLD:0; + tvi.state |= (nstcisMask&nstcisFlags)&NSTCIS_BOLD ? TVIS_BOLD:0; + + if((nstcisMask&NSTCIS_EXPANDED)^(nstcisFlags&NSTCIS_EXPANDED)) + { + tvi.stateMask = 0; + } + + tvi.uStateEx = (nstcisFlags&nstcisMask)&NSTCIS_DISABLED?TVIS_EX_DISABLED:0; + tvi.hItem = hitem; + + SendMessageW(This->hwnd_tv, TVM_SETITEMW, 0, (LPARAM)&tvi); + } + + return S_OK; +} + +static HRESULT WINAPI NSTC2_fnGetItemState(INameSpaceTreeControl2* iface, + IShellItem *psi, + NSTCITEMSTATE nstcisMask, + NSTCITEMSTATE *pnstcisFlags) +{ + NSTC2Impl *This = (NSTC2Impl*)iface; + HTREEITEM hitem; + TVITEMEXW tvi; + TRACE("%p (%p, %x, %p)\n", This, psi, nstcisMask, pnstcisFlags); + + hitem = treeitem_from_shellitem(This, psi); + if(!hitem) + return E_INVALIDARG; + + *pnstcisFlags = 0; + + tvi.hItem = hitem; + tvi.mask = TVIF_STATE; + tvi.stateMask = TVIS_SELECTED|TVIS_EXPANDED|TVIS_BOLD; + + if(nstcisMask & NSTCIS_DISABLED) + tvi.mask |= TVIF_STATEEX; + + SendMessageW(This->hwnd_tv, TVM_GETITEMW, 0, (LPARAM)&tvi); + *pnstcisFlags |= (tvi.state & TVIS_SELECTED)?NSTCIS_SELECTED:0; + *pnstcisFlags |= (tvi.state & TVIS_EXPANDED)?NSTCIS_EXPANDED:0; + *pnstcisFlags |= (tvi.state & TVIS_BOLD)?NSTCIS_BOLD:0; + *pnstcisFlags |= (tvi.uStateEx & TVIS_EX_DISABLED)?NSTCIS_DISABLED:0; + + *pnstcisFlags &= nstcisMask; + + return S_OK; +} + +static HRESULT WINAPI NSTC2_fnGetSelectedItems(INameSpaceTreeControl2* iface, + IShellItemArray **psiaItems) +{ + NSTC2Impl *This = (NSTC2Impl*)iface; + IShellItem *psiselected; + HRESULT hr; + TRACE("%p (%p)\n", This, psiaItems); + + psiselected = get_selected_shellitem(This); + if(!psiselected) + return E_FAIL; + + hr = SHCreateShellItemArrayFromShellItem(psiselected, &IID_IShellItemArray, + (void**)psiaItems); + return hr; +} + +static HRESULT WINAPI NSTC2_fnGetItemCustomState(INameSpaceTreeControl2* iface, + IShellItem *psi, + int *piStateNumber) +{ + NSTC2Impl *This = (NSTC2Impl*)iface; + FIXME("stub, %p (%p, %p)\n", This, psi, piStateNumber); + return E_NOTIMPL; +} + +static HRESULT WINAPI NSTC2_fnSetItemCustomState(INameSpaceTreeControl2* iface, + IShellItem *psi, + int iStateNumber) +{ + NSTC2Impl *This = (NSTC2Impl*)iface; + FIXME("stub, %p (%p, %d)\n", This, psi, iStateNumber); + return E_NOTIMPL; +} + +static HRESULT WINAPI NSTC2_fnEnsureItemVisible(INameSpaceTreeControl2* iface, + IShellItem *psi) +{ + NSTC2Impl *This = (NSTC2Impl*)iface; + HTREEITEM hitem; + + TRACE("%p (%p)\n", This, psi); + + hitem = treeitem_from_shellitem(This, psi); + if(hitem) + { + SendMessageW(This->hwnd_tv, TVM_ENSUREVISIBLE, 0, (WPARAM)hitem); + return S_OK; + } + + return E_INVALIDARG; +} + +static HRESULT WINAPI NSTC2_fnSetTheme(INameSpaceTreeControl2* iface, + LPCWSTR pszTheme) +{ + NSTC2Impl *This = (NSTC2Impl*)iface; + FIXME("stub, %p (%p)\n", This, pszTheme); + return E_NOTIMPL; +} + +static HRESULT WINAPI NSTC2_fnGetNextItem(INameSpaceTreeControl2* iface, + IShellItem *psi, + NSTCGNI nstcgi, + IShellItem **ppsiNext) +{ + NSTC2Impl *This = (NSTC2Impl*)iface; + HTREEITEM hitem, hnext; + UINT tvgn; + TRACE("%p (%p, %x, %p)\n", This, psi, nstcgi, ppsiNext); + + if(!ppsiNext) return E_POINTER; + if(!psi) return E_FAIL; + + *ppsiNext = NULL; + + hitem = treeitem_from_shellitem(This, psi); + if(!hitem) + return E_INVALIDARG; + + switch(nstcgi) + { + case NSTCGNI_NEXT: tvgn = TVGN_NEXT; break; + case NSTCGNI_NEXTVISIBLE: tvgn = TVGN_NEXTVISIBLE; break; + case NSTCGNI_PREV: tvgn = TVGN_PREVIOUS; break; + case NSTCGNI_PREVVISIBLE: tvgn = TVGN_PREVIOUSVISIBLE; break; + case NSTCGNI_PARENT: tvgn = TVGN_PARENT; break; + case NSTCGNI_CHILD: tvgn = TVGN_CHILD; break; + case NSTCGNI_FIRSTVISIBLE: tvgn = TVGN_FIRSTVISIBLE; break; + case NSTCGNI_LASTVISIBLE: tvgn = TVGN_LASTVISIBLE; break; + default: + FIXME("Unknown nstcgi value %d\n", nstcgi); + return E_FAIL; + } + + hnext = (HTREEITEM)SendMessageW(This->hwnd_tv, TVM_GETNEXTITEM, tvgn, (WPARAM)hitem); + if(hnext) + { + *ppsiNext = shellitem_from_treeitem(This, hnext); + IShellItem_AddRef(*ppsiNext); + return S_OK; + } + + return E_FAIL; +} + +static HRESULT WINAPI NSTC2_fnHitTest(INameSpaceTreeControl2* iface, + POINT *ppt, + IShellItem **ppsiOut) +{ + NSTC2Impl *This = (NSTC2Impl*)iface; + HTREEITEM hitem; + TRACE("%p (%p, %p)\n", This, ppsiOut, ppt); + + if(!ppt || !ppsiOut) + return E_POINTER; + + *ppsiOut = NULL; + + hitem = treeitem_from_point(This, ppt, NULL); + if(hitem) + *ppsiOut = shellitem_from_treeitem(This, hitem); + + if(*ppsiOut) + { + IShellItem_AddRef(*ppsiOut); + return S_OK; + } + + return S_FALSE; +} + +static HRESULT WINAPI NSTC2_fnGetItemRect(INameSpaceTreeControl2* iface, + IShellItem *psi, + RECT *prect) +{ + NSTC2Impl *This = (NSTC2Impl*)iface; + HTREEITEM hitem; + TRACE("%p (%p, %p)\n", This, psi, prect); + + if(!psi || !prect) + return E_POINTER; + + hitem = treeitem_from_shellitem(This, psi); + if(hitem) + { + *(HTREEITEM*)prect = hitem; + if(SendMessageW(This->hwnd_tv, TVM_GETITEMRECT, FALSE, (LPARAM)prect)) + { + MapWindowPoints(This->hwnd_tv, HWND_DESKTOP, (POINT*)prect, 2); + return S_OK; + } + } + + return E_INVALIDARG; +} + +static HRESULT WINAPI NSTC2_fnCollapseAll(INameSpaceTreeControl2* iface) +{ + NSTC2Impl *This = (NSTC2Impl*)iface; + nstc_root *root; + TRACE("%p\n", This); + + LIST_FOR_EACH_ENTRY(root, &This->roots, nstc_root, entry) + collapse_all(This, root->htreeitem); + + return S_OK; +} + +static HRESULT WINAPI NSTC2_fnSetControlStyle(INameSpaceTreeControl2* iface, + NSTCSTYLE nstcsMask, + NSTCSTYLE nstcsStyle) +{ + NSTC2Impl *This = (NSTC2Impl*)iface; + static const DWORD tv_style_flags = + NSTCS_HASEXPANDOS | NSTCS_HASLINES | NSTCS_FULLROWSELECT | + NSTCS_HORIZONTALSCROLL | NSTCS_ROOTHASEXPANDO | + NSTCS_SHOWSELECTIONALWAYS | NSTCS_NOINFOTIP | NSTCS_EVENHEIGHT | + NSTCS_DISABLEDRAGDROP | NSTCS_NOEDITLABELS | NSTCS_CHECKBOXES; + static const DWORD host_style_flags = NSTCS_TABSTOP | NSTCS_BORDER; + static const DWORD nstc_flags = + NSTCS_SINGLECLICKEXPAND | NSTCS_NOREPLACEOPEN | NSTCS_NOORDERSTREAM | + NSTCS_FAVORITESMODE | NSTCS_EMPTYTEXT | NSTCS_ALLOWJUNCTIONS | + NSTCS_SHOWTABSBUTTON | NSTCS_SHOWDELETEBUTTON | NSTCS_SHOWREFRESHBUTTON; + TRACE("%p (%x, %x)\n", This, nstcsMask, nstcsStyle); + + /* Fail if there is an attempt to set an unknown style. */ + if(nstcsMask & ~(tv_style_flags | host_style_flags | nstc_flags)) + return E_FAIL; + + if(nstcsMask & tv_style_flags) + { + DWORD new_style; + treeview_style_from_nstcs(This, nstcsStyle, nstcsMask, &new_style); + SetWindowLongPtrW(This->hwnd_tv, GWL_STYLE, new_style); + } + + /* Flags affecting the host window */ + if(nstcsMask & NSTCS_BORDER) + { + DWORD new_style = GetWindowLongPtrW(This->hwnd_main, GWL_STYLE); + new_style &= ~WS_BORDER; + new_style |= nstcsStyle & NSTCS_BORDER ? WS_BORDER : 0; + SetWindowLongPtrW(This->hwnd_main, GWL_STYLE, new_style); + } + if(nstcsMask & NSTCS_TABSTOP) + { + DWORD new_style = GetWindowLongPtrW(This->hwnd_main, GWL_EXSTYLE); + new_style &= ~WS_EX_CONTROLPARENT; + new_style |= nstcsStyle & NSTCS_TABSTOP ? WS_EX_CONTROLPARENT : 0; + SetWindowLongPtrW(This->hwnd_main, GWL_EXSTYLE, new_style); + } + + if((nstcsStyle & nstcsMask) & unsupported_styles) + FIXME("mask & style (0x%08x) contains unsupported style(s): 0x%08x\n", + (nstcsStyle & nstcsMask), + (nstcsStyle & nstcsMask) & unsupported_styles); + + This->style &= ~nstcsMask; + This->style |= (nstcsStyle & nstcsMask); + + return S_OK; +} + +static HRESULT WINAPI NSTC2_fnGetControlStyle(INameSpaceTreeControl2* iface, + NSTCSTYLE nstcsMask, + NSTCSTYLE *pnstcsStyle) +{ + NSTC2Impl *This = (NSTC2Impl*)iface; + TRACE("%p (%x, %p)\n", This, nstcsMask, pnstcsStyle); + + *pnstcsStyle = (This->style & nstcsMask); + + return S_OK; +} + +static HRESULT WINAPI NSTC2_fnSetControlStyle2(INameSpaceTreeControl2* iface, + NSTCSTYLE2 nstcsMask, + NSTCSTYLE2 nstcsStyle) +{ + NSTC2Impl *This = (NSTC2Impl*)iface; + TRACE("%p (%x, %x)\n", This, nstcsMask, nstcsStyle); + + if((nstcsStyle & nstcsMask) & unsupported_styles2) + FIXME("mask & style (0x%08x) contains unsupported style(s): 0x%08x\n", + (nstcsStyle & nstcsMask), + (nstcsStyle & nstcsMask) & unsupported_styles2); + + This->style2 &= ~nstcsMask; + This->style2 |= (nstcsStyle & nstcsMask); + + return S_OK; +} + +static HRESULT WINAPI NSTC2_fnGetControlStyle2(INameSpaceTreeControl2* iface, + NSTCSTYLE2 nstcsMask, + NSTCSTYLE2 *pnstcsStyle) +{ + NSTC2Impl *This = (NSTC2Impl*)iface; + TRACE("%p (%x, %p)\n", This, nstcsMask, pnstcsStyle); + + *pnstcsStyle = (This->style2 & nstcsMask); + + return S_OK; +} + +static const INameSpaceTreeControl2Vtbl vt_INameSpaceTreeControl2 = { + NSTC2_fnQueryInterface, + NSTC2_fnAddRef, + NSTC2_fnRelease, + NSTC2_fnInitialize, + NSTC2_fnTreeAdvise, + NSTC2_fnTreeUnadvise, + NSTC2_fnAppendRoot, + NSTC2_fnInsertRoot, + NSTC2_fnRemoveRoot, + NSTC2_fnRemoveAllRoots, + NSTC2_fnGetRootItems, + NSTC2_fnSetItemState, + NSTC2_fnGetItemState, + NSTC2_fnGetSelectedItems, + NSTC2_fnGetItemCustomState, + NSTC2_fnSetItemCustomState, + NSTC2_fnEnsureItemVisible, + NSTC2_fnSetTheme, + NSTC2_fnGetNextItem, + NSTC2_fnHitTest, + NSTC2_fnGetItemRect, + NSTC2_fnCollapseAll, + NSTC2_fnSetControlStyle, + NSTC2_fnGetControlStyle, + NSTC2_fnSetControlStyle2, + NSTC2_fnGetControlStyle2 +}; + +/************************************************************************** + * IOleWindow Implementation + */ + +static inline NSTC2Impl *impl_from_IOleWindow(IOleWindow *iface) +{ + return (NSTC2Impl *)((char*)iface - FIELD_OFFSET(NSTC2Impl, lpowVtbl)); +} + +static HRESULT WINAPI IOW_fnQueryInterface(IOleWindow *iface, REFIID riid, void **ppvObject) +{ + NSTC2Impl *This = impl_from_IOleWindow(iface); + TRACE("%p\n", This); + return NSTC2_fnQueryInterface((INameSpaceTreeControl2*)This, riid, ppvObject); +} + +static ULONG WINAPI IOW_fnAddRef(IOleWindow *iface) +{ + NSTC2Impl *This = impl_from_IOleWindow(iface); + TRACE("%p\n", This); + return NSTC2_fnAddRef((INameSpaceTreeControl2*)This); +} + +static ULONG WINAPI IOW_fnRelease(IOleWindow *iface) +{ + NSTC2Impl *This = impl_from_IOleWindow(iface); + TRACE("%p\n", This); + return NSTC2_fnRelease((INameSpaceTreeControl2*)This); +} + +static HRESULT WINAPI IOW_fnGetWindow(IOleWindow *iface, HWND *phwnd) +{ + NSTC2Impl *This = impl_from_IOleWindow(iface); + TRACE("%p (%p)\n", This, phwnd); + + *phwnd = This->hwnd_main; + return S_OK; +} + +static HRESULT WINAPI IOW_fnContextSensitiveHelp(IOleWindow *iface, BOOL fEnterMode) +{ + NSTC2Impl *This = impl_from_IOleWindow(iface); + TRACE("%p (%d)\n", This, fEnterMode); + + /* Not implemented */ + return E_NOTIMPL; +} + +static const IOleWindowVtbl vt_IOleWindow = { + IOW_fnQueryInterface, + IOW_fnAddRef, + IOW_fnRelease, + IOW_fnGetWindow, + IOW_fnContextSensitiveHelp +}; + +HRESULT NamespaceTreeControl_Constructor(IUnknown *pUnkOuter, REFIID riid, void **ppv) +{ + NSTC2Impl *nstc; + HRESULT ret; + + TRACE ("%p %s %p\n", pUnkOuter, debugstr_guid(riid), ppv); + + if(!ppv) + return E_POINTER; + if(pUnkOuter) + return CLASS_E_NOAGGREGATION; + + EFRAME_LockModule(); + + nstc = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(NSTC2Impl)); + nstc->ref = 1; + nstc->lpVtbl = &vt_INameSpaceTreeControl2; + nstc->lpowVtbl = &vt_IOleWindow; + + list_init(&nstc->roots); + + ret = INameSpaceTreeControl_QueryInterface((INameSpaceTreeControl*)nstc, riid, ppv); + INameSpaceTreeControl_Release((INameSpaceTreeControl*)nstc); + + TRACE("--(%p)\n", ppv); + return ret; +} diff -Nru wine1.3-1.3.0/dlls/explorerframe/tests/Makefile.in wine1.3-1.3.1/dlls/explorerframe/tests/Makefile.in --- wine1.3-1.3.0/dlls/explorerframe/tests/Makefile.in 1970-01-01 01:00:00.000000000 +0100 +++ wine1.3-1.3.1/dlls/explorerframe/tests/Makefile.in 2010-08-20 18:23:50.000000000 +0100 @@ -0,0 +1,11 @@ +TOPSRCDIR = @top_srcdir@ +TOPOBJDIR = ../../.. +SRCDIR = @srcdir@ +VPATH = @srcdir@ +TESTDLL = explorerframe.dll +IMPORTS = uuid shell32 ole32 user32 + +C_SRCS = \ + nstc.c + +@MAKE_TEST_RULES@ diff -Nru wine1.3-1.3.0/dlls/explorerframe/tests/msg.h wine1.3-1.3.1/dlls/explorerframe/tests/msg.h --- wine1.3-1.3.0/dlls/explorerframe/tests/msg.h 1970-01-01 01:00:00.000000000 +0100 +++ wine1.3-1.3.1/dlls/explorerframe/tests/msg.h 2010-08-20 18:23:50.000000000 +0100 @@ -0,0 +1,116 @@ +/* Message Sequence Testing Code + * + * Copyright (C) 2007 James Hawkins + * Copyright (C) 2007 Lei Zhang + * + * 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 "wine/test.h" + +/* undocumented SWP flags - from SDK 3.1 */ +#define SWP_NOCLIENTSIZE 0x0800 +#define SWP_NOCLIENTMOVE 0x1000 + +typedef enum +{ + sent = 0x1, + posted = 0x2, + parent = 0x4, + wparam = 0x8, + lparam = 0x10, + defwinproc = 0x20, + beginpaint = 0x40, + optional = 0x80, + hook = 0x100, + winevent_hook =0x200, + id = 0x400 +} msg_flags_t; + +struct message +{ + UINT message; /* the WM_* code */ + msg_flags_t flags; /* message props */ + WPARAM wParam; /* expected value of wParam */ + LPARAM lParam; /* expected value of lParam */ + UINT id; /* extra message data: id of the window, + notify code etc. */ +}; + +struct msg_sequence +{ + int count; + int size; + struct message *sequence; +}; + +static void add_message(struct msg_sequence **seq, int sequence_index, + const struct message *msg) +{ + struct msg_sequence *msg_seq = seq[sequence_index]; + + if (!msg_seq->sequence) + { + msg_seq->size = 10; + msg_seq->sequence = HeapAlloc(GetProcessHeap(), 0, + msg_seq->size * sizeof (struct message)); + } + + if (msg_seq->count == msg_seq->size) + { + msg_seq->size *= 2; + msg_seq->sequence = HeapReAlloc(GetProcessHeap(), 0, + msg_seq->sequence, + msg_seq->size * sizeof (struct message)); + } + + assert(msg_seq->sequence); + + msg_seq->sequence[msg_seq->count].message = msg->message; + msg_seq->sequence[msg_seq->count].flags = msg->flags; + msg_seq->sequence[msg_seq->count].wParam = msg->wParam; + msg_seq->sequence[msg_seq->count].lParam = msg->lParam; + msg_seq->sequence[msg_seq->count].id = msg->id; + + msg_seq->count++; +} + +static void flush_sequence(struct msg_sequence **seg, int sequence_index) +{ + struct msg_sequence *msg_seq = seg[sequence_index]; + HeapFree(GetProcessHeap(), 0, msg_seq->sequence); + msg_seq->sequence = NULL; + msg_seq->count = msg_seq->size = 0; +} + +static void flush_sequences(struct msg_sequence **seq, int n) +{ + int i; + + for (i = 0; i < n; i++) + flush_sequence(seq, i); +} + +/* ok_sequence is stripped out as it is not currently used. */ + +static void init_msg_sequences(struct msg_sequence **seq, int n) +{ + int i; + + for (i = 0; i < n; i++) + seq[i] = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(struct msg_sequence)); +} diff -Nru wine1.3-1.3.0/dlls/explorerframe/tests/nstc.c wine1.3-1.3.1/dlls/explorerframe/tests/nstc.c --- wine1.3-1.3.0/dlls/explorerframe/tests/nstc.c 1970-01-01 01:00:00.000000000 +0100 +++ wine1.3-1.3.1/dlls/explorerframe/tests/nstc.c 2010-08-20 18:23:50.000000000 +0100 @@ -0,0 +1,2381 @@ +/* + * Unit tests for the NamespaceTree Control + * + * Copyright 2010 David Hedberg + * + * 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 "shlobj.h" +#include "wine/test.h" + +#include "msg.h" + +static HWND hwnd; + +/* "Intended for internal use" */ +#define TVS_EX_NOSINGLECOLLAPSE 0x1 + +static HRESULT (WINAPI *pSHCreateShellItem)(LPCITEMIDLIST,IShellFolder*,LPCITEMIDLIST,IShellItem**); +static HRESULT (WINAPI *pSHGetIDListFromObject)(IUnknown*, PIDLIST_ABSOLUTE*); +static HRESULT (WINAPI *pSHCreateItemFromParsingName)(PCWSTR,IBindCtx*,REFIID,void**); +static HRESULT (WINAPI *pSHGetSpecialFolderLocation)(HWND, int, LPITEMIDLIST *); + +#define NUM_MSG_SEQUENCES 1 +#define TREEVIEW_SEQ_INDEX 0 + +static struct msg_sequence *sequences[NUM_MSG_SEQUENCES]; + +/* Keep a copy of the last structure passed by TVM_SETITEMW */ +static TVITEMEXW last_tvi; +static int tvi_count; + +static void init_function_pointers(void) +{ + HMODULE hmod; + + hmod = GetModuleHandleA("shell32.dll"); + pSHCreateShellItem = (void*)GetProcAddress(hmod, "SHCreateShellItem"); + pSHGetIDListFromObject = (void*)GetProcAddress(hmod, "SHGetIDListFromObject"); + pSHCreateItemFromParsingName = (void*)GetProcAddress(hmod, "SHCreateItemFromParsingName"); + pSHGetSpecialFolderLocation = (void*)GetProcAddress(hmod, "SHGetSpecialFolderLocation"); +} + +/******************************************************* + * INameSpaceTreeControlEvents implementation. + */ +enum { OnItemClick = 0, OnPropertyItemCommit, OnItemStateChanging, OnItemStateChanged, + OnSelectionChanged, OnKeyboardInput, OnBeforeExpand, OnAfterExpand, OnBeginLabelEdit, + OnEndLabelEdit, OnGetToolTip, OnBeforeItemDelete, OnItemAdded, OnItemDeleted, + OnBeforeContextMenu, OnAfterContextMenu, OnBeforeStateImageChange, OnGetDefaultIconIndex, + LastEvent }; + +typedef struct { + const INameSpaceTreeControlEventsVtbl *lpVtbl; + UINT qi_called_count; /* Keep track of calls to QueryInterface */ + BOOL qi_enable_events; /* If FALSE, QueryInterface returns only E_NOINTERFACE */ + UINT count[LastEvent]; /* Keep track of calls to all On* functions. */ + LONG ref; +} INameSpaceTreeControlEventsImpl; + +#define NSTCE_IMPL(iface) \ + ((INameSpaceTreeControlEventsImpl*)iface) + +static HRESULT WINAPI NSTCEvents_fnQueryInterface( + INameSpaceTreeControlEvents* iface, + REFIID riid, + void **ppvObject) +{ + NSTCE_IMPL(iface)->qi_called_count++; + + if(NSTCE_IMPL(iface)->qi_enable_events && + IsEqualIID(riid, &IID_INameSpaceTreeControlEvents)) + { + IUnknown_AddRef(iface); + *ppvObject = iface; + return S_OK; + } + + return E_NOINTERFACE; +} + +static ULONG WINAPI NSTCEvents_fnAddRef( + INameSpaceTreeControlEvents* iface) +{ + return InterlockedIncrement(&NSTCE_IMPL(iface)->ref); +} + +static ULONG WINAPI NSTCEvents_fnRelease( + INameSpaceTreeControlEvents* iface) +{ + return InterlockedDecrement(&NSTCE_IMPL(iface)->ref); +} + +static HRESULT WINAPI NSTCEvents_fnOnItemClick( + INameSpaceTreeControlEvents* iface, + IShellItem *psi, + NSTCEHITTEST nstceHitTest, + NSTCECLICKTYPE nstceClickType) +{ + ok(psi != NULL, "NULL IShellItem\n"); + NSTCE_IMPL(iface)->count[OnItemClick]++; + return E_NOTIMPL; +} + +static HRESULT WINAPI NSTCEvents_fnOnPropertyItemCommit( + INameSpaceTreeControlEvents* iface, + IShellItem *psi) +{ + ok(psi != NULL, "NULL IShellItem\n"); + NSTCE_IMPL(iface)->count[OnPropertyItemCommit]++; + return E_NOTIMPL; +} + +static HRESULT WINAPI NSTCEvents_fnOnItemStateChanging( + INameSpaceTreeControlEvents* iface, + IShellItem *psi, + NSTCITEMSTATE nstcisMask, + NSTCITEMSTATE nstcisState) +{ + ok(psi != NULL, "NULL IShellItem\n"); + NSTCE_IMPL(iface)->count[OnItemStateChanging]++; + return E_NOTIMPL; +} + +static HRESULT WINAPI NSTCEvents_fnOnItemStateChanged( + INameSpaceTreeControlEvents* iface, + IShellItem *psi, + NSTCITEMSTATE nstcisMask, + NSTCITEMSTATE nstcisState) +{ + ok(psi != NULL, "NULL IShellItem\n"); + NSTCE_IMPL(iface)->count[OnItemStateChanged]++; + return E_NOTIMPL; +} + +static HRESULT WINAPI NSTCEvents_fnOnSelectionChanged( + INameSpaceTreeControlEvents* iface, + IShellItemArray *psiaSelection) +{ + ok(psiaSelection != NULL, "IShellItemArray was NULL.\n"); + if(psiaSelection) + { + HRESULT hr; + DWORD count = 0xdeadbeef; + hr = IShellItemArray_GetCount(psiaSelection, &count); + ok(hr == S_OK, "Got 0x%08x\n", hr); + ok(count == 1, "Got count 0x%x\n", count); + } + NSTCE_IMPL(iface)->count[OnSelectionChanged]++; + return E_NOTIMPL; +} + +static HRESULT WINAPI NSTCEvents_fnOnKeyboardInput( + INameSpaceTreeControlEvents* iface, + UINT uMsg, + WPARAM wParam, + LPARAM lParam) +{ + NSTCE_IMPL(iface)->count[OnKeyboardInput]++; + ok(wParam == 0x1234, "Got unexpected wParam %lx\n", wParam); + ok(lParam == 0x1234, "Got unexpected lParam %lx\n", lParam); + return E_NOTIMPL; +} + +static HRESULT WINAPI NSTCEvents_fnOnBeforeExpand( + INameSpaceTreeControlEvents* iface, + IShellItem *psi) +{ + ok(psi != NULL, "NULL IShellItem\n"); + NSTCE_IMPL(iface)->count[OnBeforeExpand]++; + return E_NOTIMPL; +} + +static HRESULT WINAPI NSTCEvents_fnOnAfterExpand( + INameSpaceTreeControlEvents* iface, + IShellItem *psi) +{ + ok(psi != NULL, "NULL IShellItem\n"); + NSTCE_IMPL(iface)->count[OnAfterExpand]++; + return E_NOTIMPL; +} + +static HRESULT WINAPI NSTCEvents_fnOnBeginLabelEdit( + INameSpaceTreeControlEvents* iface, + IShellItem *psi) +{ + ok(psi != NULL, "NULL IShellItem\n"); + NSTCE_IMPL(iface)->count[OnBeginLabelEdit]++; + return E_NOTIMPL; +} + +static HRESULT WINAPI NSTCEvents_fnOnEndLabelEdit( + INameSpaceTreeControlEvents* iface, + IShellItem *psi) +{ + ok(psi != NULL, "NULL IShellItem\n"); + NSTCE_IMPL(iface)->count[OnEndLabelEdit]++; + return E_NOTIMPL; +} + +static HRESULT WINAPI NSTCEvents_fnOnGetToolTip( + INameSpaceTreeControlEvents* iface, + IShellItem *psi, + LPWSTR pszTip, + int cchTip) +{ + ok(psi != NULL, "NULL IShellItem\n"); + NSTCE_IMPL(iface)->count[OnGetToolTip]++; + return E_NOTIMPL; +} + +static HRESULT WINAPI NSTCEvents_fnOnBeforeItemDelete( + INameSpaceTreeControlEvents* iface, + IShellItem *psi) +{ + ok(psi != NULL, "NULL IShellItem\n"); + NSTCE_IMPL(iface)->count[OnBeforeItemDelete]++; + return E_NOTIMPL; +} + +static HRESULT WINAPI NSTCEvents_fnOnItemAdded( + INameSpaceTreeControlEvents* iface, + IShellItem *psi, + BOOL fIsRoot) +{ + ok(psi != NULL, "NULL IShellItem\n"); + NSTCE_IMPL(iface)->count[OnItemAdded]++; + return S_OK; +} + +static HRESULT WINAPI NSTCEvents_fnOnItemDeleted( + INameSpaceTreeControlEvents* iface, + IShellItem *psi, + BOOL fIsRoot) +{ + ok(psi != NULL, "NULL IShellItem\n"); + NSTCE_IMPL(iface)->count[OnItemDeleted]++; + return S_OK; +} + +static HRESULT WINAPI NSTCEvents_fnOnBeforeContextMenu( + INameSpaceTreeControlEvents* iface, + IShellItem *psi, + REFIID riid, + void **ppv) +{ + NSTCE_IMPL(iface)->count[OnBeforeContextMenu]++; + return E_NOTIMPL; +} + +static HRESULT WINAPI NSTCEvents_fnOnAfterContextMenu( + INameSpaceTreeControlEvents* iface, + IShellItem *psi, + IContextMenu *pcmIn, + REFIID riid, + void **ppv) +{ + NSTCE_IMPL(iface)->count[OnAfterContextMenu]++; + return E_NOTIMPL; +} + +static HRESULT WINAPI NSTCEvents_fnOnBeforeStateImageChange( + INameSpaceTreeControlEvents* iface, + IShellItem *psi, + int *piDefaultIcon, + int *piOpenIcon) +{ + ok(psi != NULL, "NULL IShellItem\n"); + NSTCE_IMPL(iface)->count[OnBeforeStateImageChange]++; + return E_NOTIMPL; +} + +static HRESULT WINAPI NSTCEvents_fnOnGetDefaultIconIndex( + INameSpaceTreeControlEvents* iface, + IShellItem *psi, + int *piDefaultIcon, + int *piOpenIcon) +{ + ok(psi != NULL, "NULL IShellItem\n"); + NSTCE_IMPL(iface)->count[OnGetDefaultIconIndex]++; + return E_NOTIMPL; +} + +const INameSpaceTreeControlEventsVtbl vt_NSTCEvents = { + NSTCEvents_fnQueryInterface, + NSTCEvents_fnAddRef, + NSTCEvents_fnRelease, + NSTCEvents_fnOnItemClick, + NSTCEvents_fnOnPropertyItemCommit, + NSTCEvents_fnOnItemStateChanging, + NSTCEvents_fnOnItemStateChanged, + NSTCEvents_fnOnSelectionChanged, + NSTCEvents_fnOnKeyboardInput, + NSTCEvents_fnOnBeforeExpand, + NSTCEvents_fnOnAfterExpand, + NSTCEvents_fnOnBeginLabelEdit, + NSTCEvents_fnOnEndLabelEdit, + NSTCEvents_fnOnGetToolTip, + NSTCEvents_fnOnBeforeItemDelete, + NSTCEvents_fnOnItemAdded, + NSTCEvents_fnOnItemDeleted, + NSTCEvents_fnOnBeforeContextMenu, + NSTCEvents_fnOnAfterContextMenu, + NSTCEvents_fnOnBeforeStateImageChange, + NSTCEvents_fnOnGetDefaultIconIndex +}; +#undef NSTCE_IMPL + +static INameSpaceTreeControlEventsImpl *create_nstc_events(void) +{ + INameSpaceTreeControlEventsImpl *This; + This = HeapAlloc(GetProcessHeap(), 0, sizeof(INameSpaceTreeControlEventsImpl)); + This->lpVtbl = &vt_NSTCEvents; + This->ref = 1; + + return This; +} + +/********************************************************************* + * Event count checking + */ +static void ok_no_events_(INameSpaceTreeControlEventsImpl *impl, + const char *file, int line) +{ + UINT i; + for(i = 0; i < LastEvent; i++) + { + ok_(file, line) + (!impl->count[i], "Got event %d, count %d\n", i, impl->count[i]); + impl->count[i] = 0; + } +} +#define ok_no_events(impl) \ + ok_no_events_(impl, __FILE__, __LINE__) + +#define ok_event_count_broken(impl, event, c, b) \ + do { ok(impl->count[event] == c || broken(impl->count[event] == b), \ + "Got event %d, count %d\n", event, impl->count[event]); \ + impl->count[event] = 0; \ + } while(0) + +#define ok_event_count(impl, event, c) \ + ok_event_count_broken(impl, event, c, -1) + +#define ok_event_broken(impl, event) \ + do { ok(impl->count[event] || broken(!impl->count[event]), \ + "No event.\n"); \ + impl->count[event] = 0; \ + } while(0) + +#define ok_event(impl, event) \ + do { ok(impl->count[event], "No event %d.\n", event); \ + impl->count[event] = 0; \ + } while(0) + +/* Process some messages */ +static void process_msgs(void) +{ + MSG msg; + BOOL got_msg; + do { + got_msg = FALSE; + Sleep(100); + while(PeekMessage( &msg, NULL, 0, 0, PM_REMOVE)) + { + TranslateMessage(&msg); + DispatchMessage(&msg); + got_msg = TRUE; + } + } while(got_msg); + + /* There seem to be a timer that sometimes fires after about + 500ms, we need to wait for it. Failing to wait can result in + seemingly sporadic selection change events. (Timer ID is 87, + sending WM_TIMER manually does not seem to help us.) */ + Sleep(500); + + while(PeekMessage( &msg, NULL, 0, 0, PM_REMOVE)) + { + TranslateMessage(&msg); + DispatchMessage(&msg); + } +} + +/** Some functions from shell32/tests/shlfolder.c */ +/* creates a file with the specified name for tests */ +static void CreateTestFile(const CHAR *name) +{ + HANDLE file; + DWORD written; + + file = CreateFileA(name, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, 0, NULL); + if (file != INVALID_HANDLE_VALUE) + { + WriteFile(file, name, strlen(name), &written, NULL); + WriteFile(file, "\n", strlen("\n"), &written, NULL); + CloseHandle(file); + } +} +/* initializes the tests */ +static void CreateFilesFolders(void) +{ + CreateDirectoryA(".\\testdir", NULL); + CreateTestFile (".\\testdir\\test1.txt "); + CreateTestFile (".\\testdir\\test2.txt "); + CreateTestFile (".\\testdir\\test3.txt "); + CreateDirectoryA(".\\testdir\\testdir2 ", NULL); + CreateDirectoryA(".\\testdir\\testdir2\\subdir", NULL); +} + +/* cleans after tests */ +static void Cleanup(void) +{ + DeleteFileA(".\\testdir\\test1.txt"); + DeleteFileA(".\\testdir\\test2.txt"); + DeleteFileA(".\\testdir\\test3.txt"); + RemoveDirectoryA(".\\testdir\\testdir2\\subdir"); + RemoveDirectoryA(".\\testdir\\testdir2"); + RemoveDirectoryA(".\\testdir"); +} + +/* Based on PathAddBackslashW from dlls/shlwapi/path.c */ +static LPWSTR myPathAddBackslashW( LPWSTR lpszPath ) +{ + size_t iLen; + + if (!lpszPath || (iLen = lstrlenW(lpszPath)) >= MAX_PATH) + return NULL; + + if (iLen) + { + lpszPath += iLen; + if (lpszPath[-1] != '\\') + { + *lpszPath++ = '\\'; + *lpszPath = '\0'; + } + } + return lpszPath; +} + +static HWND get_treeview_hwnd(INameSpaceTreeControl *pnstc) +{ + IOleWindow *pow; + HRESULT hr; + HWND treeview = NULL; + + hr = INameSpaceTreeControl_QueryInterface(pnstc, &IID_IOleWindow, (void**)&pow); + ok(hr == S_OK, "Got 0x%08x\n", hr); + if(SUCCEEDED(hr)) + { + HWND host; + hr = IOleWindow_GetWindow(pow, &host); + ok(hr == S_OK, "Got 0x%08x\n", hr); + if(SUCCEEDED(hr)) + treeview = FindWindowExW(host, NULL, WC_TREEVIEWW, NULL); + IOleWindow_Release(pow); + } + + return treeview; +} + +static LRESULT WINAPI treeview_subclass_proc(HWND hwnd_tv, UINT message, WPARAM wParam, LPARAM lParam) +{ + WNDPROC oldproc = (WNDPROC)GetWindowLongPtrW(hwnd_tv, GWLP_USERDATA); + static LONG defwndproc_counter = 0; + LRESULT ret; + struct message msg; + + msg.message = message; + msg.flags = sent|wparam|lparam; + if (defwndproc_counter) msg.flags |= defwinproc; + msg.wParam = wParam; + msg.lParam = lParam; + msg.id = 0; + add_message(sequences, TREEVIEW_SEQ_INDEX, &msg); + + if(message == TVM_SETITEMW) + { + memcpy(&last_tvi, (void*)lParam, sizeof(TVITEMEXW)); + tvi_count++; + } + + defwndproc_counter++; + ret = CallWindowProcW(oldproc, hwnd_tv, message, wParam, lParam); + defwndproc_counter--; + return ret; +} + +static BOOL subclass_treeview(INameSpaceTreeControl *pnstc) +{ + HWND hwnd_tv; + WNDPROC oldproc = NULL; + + hwnd_tv = get_treeview_hwnd(pnstc); + if(hwnd_tv) + { + oldproc = (WNDPROC)SetWindowLongPtrW(hwnd_tv, GWLP_WNDPROC, + (LONG_PTR)treeview_subclass_proc); + SetWindowLongPtrW(hwnd_tv, GWLP_USERDATA, (LONG_PTR)oldproc); + ok(oldproc != NULL, "Failed to subclass.\n"); + } + + return oldproc?TRUE:FALSE; +} + +static UINT get_msg_count(struct msg_sequence **seq, int sequence_index, UINT message) +{ + struct msg_sequence *msg_seq = seq[sequence_index]; + UINT i, count = 0; + + for(i = 0; i < msg_seq->count ; i++) + if(msg_seq->sequence[i].message == message) + count++; + + return count; +} + +/* Returns FALSE if the NamespaceTreeControl failed to be instantiated. */ +static BOOL test_initialization(void) +{ + INameSpaceTreeControl *pnstc; + IOleWindow *pow; + IUnknown *punk; + HWND hwnd_host1; + LONG lres; + HRESULT hr; + RECT rc; + + hr = CoCreateInstance(&CLSID_NamespaceTreeControl, NULL, CLSCTX_INPROC_SERVER, + &IID_INameSpaceTreeControl, (void**)&pnstc); + ok(hr == S_OK || hr == REGDB_E_CLASSNOTREG, "Got 0x%08x\n", hr); + if(FAILED(hr)) + { + return FALSE; + } + + hr = INameSpaceTreeControl_Initialize(pnstc, NULL, NULL, 0); + ok(hr == HRESULT_FROM_WIN32(ERROR_TLW_WITH_WSCHILD), "Got (0x%08x)\n", hr); + + hr = INameSpaceTreeControl_Initialize(pnstc, (HWND)0xDEADBEEF, NULL, 0); + ok(hr == HRESULT_FROM_WIN32(ERROR_INVALID_WINDOW_HANDLE), "Got (0x%08x)\n", hr); + + ZeroMemory(&rc, sizeof(RECT)); + hr = INameSpaceTreeControl_Initialize(pnstc, NULL, &rc, 0); + ok(hr == HRESULT_FROM_WIN32(ERROR_TLW_WITH_WSCHILD), "Got (0x%08x)\n", hr); + + hr = INameSpaceTreeControl_Initialize(pnstc, (HWND)0xDEADBEEF, &rc, 0); + ok(hr == HRESULT_FROM_WIN32(ERROR_INVALID_WINDOW_HANDLE), "Got (0x%08x)\n", hr); + + hr = INameSpaceTreeControl_QueryInterface(pnstc, &IID_IOleWindow, (void**)&pow); + ok(hr == S_OK, "Got (0x%08x)\n", hr); + if(SUCCEEDED(hr)) + { + hr = IOleWindow_GetWindow(pow, &hwnd_host1); + ok(hr == S_OK, "Got (0x%08x)\n", hr); + ok(hwnd_host1 == NULL, "hwnd is not null.\n"); + + hr = IOleWindow_ContextSensitiveHelp(pow, TRUE); + ok(hr == E_NOTIMPL, "Got (0x%08x)\n", hr); + hr = IOleWindow_ContextSensitiveHelp(pow, FALSE); + ok(hr == E_NOTIMPL, "Got (0x%08x)\n", hr); + IOleWindow_Release(pow); + } + + hr = INameSpaceTreeControl_Initialize(pnstc, hwnd, NULL, 0); + ok(hr == S_OK, "Got (0x%08x)\n", hr); + hr = INameSpaceTreeControl_QueryInterface(pnstc, &IID_IOleWindow, (void**)&pow); + ok(hr == S_OK, "Got 0x%08x\n", hr); + if(SUCCEEDED(hr)) + { + static const CHAR namespacetree[] = "NamespaceTreeControl"; + char buf[1024]; + LONG style, expected_style; + HWND hwnd_tv; + hr = IOleWindow_GetWindow(pow, &hwnd_host1); + ok(hr == S_OK, "Got (0x%08x)\n", hr); + ok(hwnd_host1 != NULL, "hwnd_host1 is null.\n"); + buf[0] = '\0'; + GetClassNameA(hwnd_host1, buf, 1024); + ok(!lstrcmpA(namespacetree, buf), "Class name was %s\n", buf); + + expected_style = WS_CHILD | WS_VISIBLE | WS_CLIPSIBLINGS | WS_CLIPCHILDREN; + style = GetWindowLongPtrW(hwnd_host1, GWL_STYLE); + ok(style == expected_style, "Got style %08x\n", style); + + expected_style = 0; + style = GetWindowLongPtrW(hwnd_host1, GWL_EXSTYLE); + ok(style == expected_style, "Got style %08x\n", style); + + expected_style = 0; + style = SendMessageW(hwnd_host1, TVM_GETEXTENDEDSTYLE, 0, 0); + ok(style == expected_style, "Got 0x%08x\n", style); + + hwnd_tv = FindWindowExW(hwnd_host1, NULL, WC_TREEVIEWW, NULL); + ok(hwnd_tv != NULL, "Failed to get treeview hwnd.\n"); + if(hwnd_tv) + { + expected_style = WS_CHILD | WS_VISIBLE | WS_CLIPSIBLINGS | + WS_CLIPCHILDREN | WS_TABSTOP | TVS_NOHSCROLL | + TVS_NONEVENHEIGHT | TVS_INFOTIP | TVS_TRACKSELECT | TVS_EDITLABELS; + style = GetWindowLongPtrW(hwnd_tv, GWL_STYLE); + ok(style == expected_style, "Got style %08x\n", style); + + expected_style = 0; + style = GetWindowLongPtrW(hwnd_tv, GWL_EXSTYLE); + ok(style == expected_style, "Got style %08x\n", style); + + expected_style = TVS_EX_NOSINGLECOLLAPSE | TVS_EX_DOUBLEBUFFER | + TVS_EX_RICHTOOLTIP | TVS_EX_DRAWIMAGEASYNC; + style = SendMessageW(hwnd_tv, TVM_GETEXTENDEDSTYLE, 0, 0); + todo_wine ok(style == expected_style, "Got 0x%08x\n", style); + } + + IOleWindow_Release(pow); + } + + if(0) + { + /* The control can be initialized again without crashing, but + * the reference counting will break. */ + hr = INameSpaceTreeControl_Initialize(pnstc, hwnd, &rc, 0); + ok(hr == S_OK, "Got (0x%08x)\n", hr); + hr = INameSpaceTreeControl_QueryInterface(pnstc, &IID_IOleWindow, (void**)&pow); + if(SUCCEEDED(hr)) + { + HWND hwnd_host2; + hr = IOleWindow_GetWindow(pow, &hwnd_host2); + ok(hr == S_OK, "Got (0x%08x)\n", hr); + ok(hwnd_host1 != hwnd_host2, "Same hwnd.\n"); + IOleWindow_Release(pow); + } + } + + /* Some "random" interfaces */ + hr = INameSpaceTreeControl_QueryInterface(pnstc, &IID_IOleInPlaceObject, (void**)&punk); + ok(hr == E_NOINTERFACE || hr == S_OK /* vista, w2k8 */, "Got (0x%08x)\n", hr); + if(SUCCEEDED(hr)) IUnknown_Release(punk); + hr = INameSpaceTreeControl_QueryInterface(pnstc, &IID_IOleInPlaceActiveObject, (void**)&punk); + ok(hr == E_NOINTERFACE || hr == S_OK /* vista, w2k8 */, "Got (0x%08x)\n", hr); + if(SUCCEEDED(hr)) IUnknown_Release(punk); + hr = INameSpaceTreeControl_QueryInterface(pnstc, &IID_IOleInPlaceObjectWindowless, (void**)&punk); + ok(hr == E_NOINTERFACE || hr == S_OK /* vista, w2k8 */, "Got (0x%08x)\n", hr); + if(SUCCEEDED(hr)) IUnknown_Release(punk); + + hr = INameSpaceTreeControl_QueryInterface(pnstc, &IID_IOleInPlaceUIWindow, (void**)&punk); + ok(hr == E_NOINTERFACE, "Got (0x%08x)\n", hr); + hr = INameSpaceTreeControl_QueryInterface(pnstc, &IID_IOleInPlaceFrame, (void**)&punk); + ok(hr == E_NOINTERFACE, "Got (0x%08x)\n", hr); + hr = INameSpaceTreeControl_QueryInterface(pnstc, &IID_IOleInPlaceSite, (void**)&punk); + ok(hr == E_NOINTERFACE, "Got (0x%08x)\n", hr); + hr = INameSpaceTreeControl_QueryInterface(pnstc, &IID_IOleInPlaceSiteEx, (void**)&punk); + ok(hr == E_NOINTERFACE, "Got (0x%08x)\n", hr); + hr = INameSpaceTreeControl_QueryInterface(pnstc, &IID_IOleInPlaceSiteWindowless, (void**)&punk); + ok(hr == E_NOINTERFACE, "Got (0x%08x)\n", hr); + + /* On windows, the reference count won't go to zero until the + * window is destroyed. */ + INameSpaceTreeControl_AddRef(pnstc); + lres = INameSpaceTreeControl_Release(pnstc); + ok(lres > 1, "Reference count was (%d).\n", lres); + + DestroyWindow(hwnd_host1); + lres = INameSpaceTreeControl_Release(pnstc); + ok(!lres, "lres was %d\n", lres); + + return TRUE; +} + +static void verify_root_order_(INameSpaceTreeControl *pnstc, IShellItem **roots, + const char *file, int line) +{ + HRESULT hr; + IShellItemArray *psia; + + hr = INameSpaceTreeControl_GetRootItems(pnstc, &psia); + ok_(file,line) (hr == S_OK, "GetRootItems: got (0x%08x)\n", hr); + if(SUCCEEDED(hr)) + { + DWORD i, expected, count = -1; + hr = IShellItemArray_GetCount(psia, &count); + ok_(file,line) (hr == S_OK, "Got (0x%08x)\n", hr); + + for(expected = 0; roots[expected] != NULL; expected++); + ok_(file,line) (count == expected, "Got %d roots, expected %d\n", count, expected); + + for(i = 0; i < count && roots[i] != NULL; i++) + { + IShellItem *psi; + hr = IShellItemArray_GetItemAt(psia, i, &psi); + ok_(file,line) (hr == S_OK, "GetItemAt %i: got 0x%08x\n", i, hr); + if(SUCCEEDED(hr)) + { + int cmp; + hr = IShellItem_Compare(psi, roots[i], SICHINT_DISPLAY, &cmp); + ok_(file,line) (hr == S_OK, "Compare %i: got 0x%08x\n", i, hr); + IShellItem_Release(psi); + } + } + IShellItem_Release(psia); + } +} +#define verify_root_order(pnstc, psi_a) \ + verify_root_order_(pnstc, psi_a, __FILE__, __LINE__) + +static void test_basics(void) +{ + INameSpaceTreeControl *pnstc; + INameSpaceTreeControl2 *pnstc2; + IShellItemArray *psia; + IShellFolder *psfdesktop; + IShellItem *psi; + IShellItem *psidesktop, *psidesktop2; + IShellItem *psitestdir, *psitestdir2, *psitest1; + IOleWindow *pow; + LPITEMIDLIST pidl_desktop; + NSTCITEMSTATE istate; + HRESULT hr; + UINT i, res, height; + HWND hwnd_tv; + RECT rc; + IShellItem *roots[10]; + POINT pt; + int cbstate; + WCHAR curdirW[MAX_PATH]; + WCHAR buf[MAX_PATH]; + static const WCHAR testdirW[] = {'t','e','s','t','d','i','r',0}; + static const WCHAR testdir2W[] = + {'t','e','s','t','d','i','r','\\','t','e','s','t','d','i','r','2',0}; + static const WCHAR test1W[] = + {'t','e','s','t','d','i','r','\\','t','e','s','t','1','.','t','x','t',0}; + static const WCHAR explorerW[] = {'E','x','p','l','o','r','e','r',0}; + static const WCHAR randomW[] = {'_','_','h','e','l','l','o',0}; + + /* These should exist on platforms supporting the NSTC */ + ok(pSHCreateShellItem != NULL, "No SHCreateShellItem.\n"); + ok(pSHCreateItemFromParsingName != NULL, "No SHCreateItemFromParsingName\n"); + ok(pSHGetIDListFromObject != NULL, "No SHCreateShellItem.\n"); + ok(pSHCreateItemFromParsingName != NULL, "No SHCreateItemFromParsingName\n"); + + /* Create ShellItems for testing. */ + SHGetDesktopFolder(&psfdesktop); + hr = pSHGetIDListFromObject((IUnknown*)psfdesktop, &pidl_desktop); + ok(hr == S_OK, "Got 0x%08x\n", hr); + if(SUCCEEDED(hr)) + { + hr = pSHCreateShellItem(NULL, NULL, pidl_desktop, &psidesktop); + ok(hr == S_OK, "Got 0x%08x\n", hr); + if(SUCCEEDED(hr)) + { + hr = pSHCreateShellItem(NULL, NULL, pidl_desktop, &psidesktop2); + ok(hr == S_OK, "Got 0x%08x\n", hr); + if(FAILED(hr)) IShellItem_Release(psidesktop); + } + ILFree(pidl_desktop); + } + ok(psidesktop != psidesktop2, "psidesktop == psidesktop2\n"); + IShellFolder_Release(psfdesktop); + + if(FAILED(hr)) + { + win_skip("Test setup failed.\n"); + return; + } + + CreateFilesFolders(); + GetCurrentDirectoryW(MAX_PATH, curdirW); + ok(lstrlenW(curdirW), "Got 0 length string.\n"); + + lstrcpyW(buf, curdirW); + myPathAddBackslashW(buf); + lstrcatW(buf, testdirW); + hr = pSHCreateItemFromParsingName(buf, NULL, &IID_IShellItem, (void**)&psitestdir); + ok(hr == S_OK, "Got 0x%08x\n", hr); + if(FAILED(hr)) goto cleanup; + lstrcpyW(buf, curdirW); + myPathAddBackslashW(buf); + lstrcatW(buf, testdir2W); + hr = pSHCreateItemFromParsingName(buf, NULL, &IID_IShellItem, (void**)&psitestdir2); + ok(hr == S_OK, "Got 0x%08x\n", hr); + if(FAILED(hr)) goto cleanup; + lstrcpyW(buf, curdirW); + myPathAddBackslashW(buf); + lstrcatW(buf, test1W); + hr = pSHCreateItemFromParsingName(buf, NULL, &IID_IShellItem, (void**)&psitest1); + ok(hr == S_OK, "Got 0x%08x\n", hr); + if(FAILED(hr)) goto cleanup; + + hr = CoCreateInstance(&CLSID_NamespaceTreeControl, NULL, CLSCTX_INPROC_SERVER, + &IID_INameSpaceTreeControl, (void**)&pnstc); + ok(hr == S_OK, "Failed to initialize control (0x%08x)\n", hr); + + /* Some tests on an uninitialized control */ + hr = INameSpaceTreeControl_RemoveAllRoots(pnstc); + ok(hr == E_INVALIDARG, "Got (0x%08x)\n", hr); + hr = INameSpaceTreeControl_RemoveRoot(pnstc, psidesktop); + ok(hr == E_FAIL, "Got (0x%08x)\n", hr); + hr = INameSpaceTreeControl_RemoveRoot(pnstc, NULL); + ok(hr == E_NOINTERFACE, "Got (0x%08x)\n", hr); + hr = INameSpaceTreeControl_AppendRoot(pnstc, psidesktop, SHCONTF_NONFOLDERS, 0, NULL); + ok(hr == E_FAIL, "Got (0x%08x)\n", hr); + process_msgs(); + + /* Initialize the control */ + rc.top = rc.left = 0; rc.right = rc.bottom = 200; + hr = INameSpaceTreeControl_Initialize(pnstc, hwnd, &rc, 0); + ok(hr == S_OK, "Got (0x%08x)\n", hr); + + + /* Set/GetControlStyle(2) */ + hr = INameSpaceTreeControl_QueryInterface(pnstc, &IID_INameSpaceTreeControl2, (void**)&pnstc2); + ok(hr == S_OK || broken(hr == E_NOINTERFACE), "Got 0x%08x\n", hr); + if(SUCCEEDED(hr)) + { + DWORD tmp; + NSTCSTYLE style; + NSTCSTYLE2 style2; + static const NSTCSTYLE2 styles2[] = + { NSTCS2_INTERRUPTNOTIFICATIONS,NSTCS2_SHOWNULLSPACEMENU, + NSTCS2_DISPLAYPADDING,NSTCS2_DISPLAYPINNEDONLY, + NTSCS2_NOSINGLETONAUTOEXPAND,NTSCS2_NEVERINSERTNONENUMERATED, 0}; + + + /* We can use this to differentiate between two versions of + * this interface. Windows 7 returns hr == S_OK. */ + hr = INameSpaceTreeControl2_SetControlStyle(pnstc2, 0, 0); + ok(hr == S_OK || broken(hr == E_FAIL), "Got 0x%08x\n", hr); + if(hr == S_OK) + { + static const NSTCSTYLE styles_setable[] = + { NSTCS_HASEXPANDOS,NSTCS_HASLINES,NSTCS_SINGLECLICKEXPAND, + NSTCS_FULLROWSELECT,NSTCS_HORIZONTALSCROLL, + NSTCS_ROOTHASEXPANDO,NSTCS_SHOWSELECTIONALWAYS,NSTCS_NOINFOTIP, + NSTCS_EVENHEIGHT,NSTCS_NOREPLACEOPEN,NSTCS_DISABLEDRAGDROP, + NSTCS_NOORDERSTREAM,NSTCS_BORDER,NSTCS_NOEDITLABELS, + NSTCS_TABSTOP,NSTCS_FAVORITESMODE,NSTCS_EMPTYTEXT,NSTCS_CHECKBOXES, + NSTCS_ALLOWJUNCTIONS,NSTCS_SHOWTABSBUTTON,NSTCS_SHOWDELETEBUTTON, + NSTCS_SHOWREFRESHBUTTON, 0}; + static const NSTCSTYLE styles_nonsetable[] = + { NSTCS_SPRINGEXPAND, NSTCS_RICHTOOLTIP, NSTCS_AUTOHSCROLL, + NSTCS_FADEINOUTEXPANDOS, + NSTCS_PARTIALCHECKBOXES, NSTCS_EXCLUSIONCHECKBOXES, + NSTCS_DIMMEDCHECKBOXES, NSTCS_NOINDENTCHECKS,0}; + + /* Set/GetControlStyle */ + style = style2 = 0xdeadbeef; + hr = INameSpaceTreeControl2_GetControlStyle(pnstc2, 0xFFFFFFFF, &style); + ok(hr == S_OK, "Got 0x%08x\n", hr); + ok(style == 0, "Got style %x\n", style); + + hr = INameSpaceTreeControl2_SetControlStyle(pnstc2, 0, 0xFFFFFFF); + ok(hr == S_OK, "Got 0x%08x\n", hr); + + hr = INameSpaceTreeControl2_SetControlStyle(pnstc2, 0xFFFFFFFF, 0); + ok(hr == E_FAIL, "Got 0x%08x\n", hr); + hr = INameSpaceTreeControl2_SetControlStyle(pnstc2, 0xFFFFFFFF, 0xFFFFFFFF); + ok(hr == E_FAIL, "Got 0x%08x\n", hr); + + tmp = 0; + for(i = 0; styles_setable[i] != 0; i++) + { + hr = INameSpaceTreeControl2_SetControlStyle(pnstc2, styles_setable[i], styles_setable[i]); + ok(hr == S_OK, "Got 0x%08x (%x)\n", hr, styles_setable[i]); + if(SUCCEEDED(hr)) tmp |= styles_setable[i]; + } + for(i = 0; styles_nonsetable[i] != 0; i++) + { + hr = INameSpaceTreeControl2_SetControlStyle(pnstc2, styles_nonsetable[i], styles_nonsetable[i]); + ok(hr == E_FAIL, "Got 0x%08x (%x)\n", hr, styles_nonsetable[i]); + } + + hr = INameSpaceTreeControl2_GetControlStyle(pnstc2, 0xFFFFFFFF, &style); + ok(hr == S_OK, "Got 0x%08x\n", hr); + ok(style == tmp, "Got style %x (expected %x)\n", style, tmp); + if(SUCCEEDED(hr)) + { + DWORD tmp2; + for(i = 0; styles_setable[i] != 0; i++) + { + hr = INameSpaceTreeControl2_GetControlStyle(pnstc2, styles_setable[i], &tmp2); + ok(hr == S_OK, "Got 0x%08x\n", hr); + ok(tmp2 == (style & styles_setable[i]), "Got %x\n", tmp2); + } + } + + for(i = 0; styles_setable[i] != 0; i++) + { + hr = INameSpaceTreeControl2_SetControlStyle(pnstc2, styles_setable[i], 0); + ok(hr == S_OK, "Got 0x%08x (%x)\n", hr, styles_setable[i]); + } + for(i = 0; styles_nonsetable[i] != 0; i++) + { + hr = INameSpaceTreeControl2_SetControlStyle(pnstc2, styles_nonsetable[i], 0); + ok(hr == E_FAIL, "Got 0x%08x (%x)\n", hr, styles_nonsetable[i]); + } + hr = INameSpaceTreeControl2_GetControlStyle(pnstc2, 0xFFFFFFFF, &style); + ok(hr == S_OK, "Got 0x%08x\n", hr); + ok(style == 0, "Got style %x\n", style); + + /* Set/GetControlStyle2 */ + hr = INameSpaceTreeControl2_GetControlStyle2(pnstc2, 0xFFFFFFFF, &style2); + ok(hr == S_OK, "Got 0x%08x\n", hr); + ok(style2 == 0, "Got style %x\n", style2); + + hr = INameSpaceTreeControl2_SetControlStyle2(pnstc2, 0, 0); + ok(hr == S_OK, "Got 0x%08x\n", hr); + hr = INameSpaceTreeControl2_SetControlStyle2(pnstc2, 0, 0xFFFFFFFF); + ok(hr == S_OK, "Got 0x%08x\n", hr); + + hr = INameSpaceTreeControl2_SetControlStyle2(pnstc2, 0xFFFFFFFF, 0); + ok(hr == S_OK, "Got 0x%08x\n", hr); + hr = INameSpaceTreeControl2_SetControlStyle2(pnstc2, 0xFFFFFFFF, 0xFFFFFFFF); + ok(hr == S_OK, "Got 0x%08x\n", hr); + + hr = INameSpaceTreeControl2_SetControlStyle2(pnstc2, 0xFFFFFFFF, 0); + ok(hr == S_OK, "Got 0x%08x\n", hr); + hr = INameSpaceTreeControl2_GetControlStyle2(pnstc2, 0xFFFFFFFF, &style2); + ok(hr == S_OK, "Got 0x%08x\n", hr); + ok(style2 == 0x00000000, "Got style %x\n", style2); + + hr = INameSpaceTreeControl2_GetControlStyle2(pnstc2, 0xFFFF, &style2); + ok(hr == S_OK, "Got 0x%08x\n", hr); + ok(style2 == 0, "Got style %x\n", style2); + + tmp = 0; + for(i = 0; styles2[i] != 0; i++) + { + hr = INameSpaceTreeControl2_SetControlStyle2(pnstc2, styles2[i], styles2[i]); + ok(hr == S_OK, "Got 0x%08x (%x)\n", hr, styles2[i]); + if(SUCCEEDED(hr)) tmp |= styles2[i]; + } + + hr = INameSpaceTreeControl2_GetControlStyle2(pnstc2, 0xFFFF, &style2); + ok(hr == S_OK, "Got 0x%08x\n", hr); + ok(style2 == tmp, "Got style %x (expected %x)\n", style2, tmp); + if(SUCCEEDED(hr)) + { + DWORD tmp2; + for(i = 0; styles2[i] != 0; i++) + { + hr = INameSpaceTreeControl2_GetControlStyle2(pnstc2, styles2[i], &tmp2); + ok(hr == S_OK, "Got 0x%08x\n", hr); + ok(tmp2 == (style2 & styles2[i]), "Got %x\n", tmp2); + } + } + + for(i = 0; styles2[i] != 0; i++) + { + hr = INameSpaceTreeControl2_SetControlStyle2(pnstc2, styles2[i], 0); + ok(hr == S_OK, "Got 0x%08x (%x)\n", hr, styles2[i]); + } + hr = INameSpaceTreeControl2_GetControlStyle2(pnstc2, 0xFFFF, &style2); + ok(hr == S_OK, "Got 0x%08x\n", hr); + ok(style2 == 0, "Got style %x (expected 0)\n", style2); + } + else + { + /* 64-bit Windows Vista (others?) seems to have a somewhat + * different idea of how the methods of this interface + * should behave. */ + + static const NSTCSTYLE styles[] = + { NSTCS_HASEXPANDOS,NSTCS_HASLINES,NSTCS_SINGLECLICKEXPAND, + NSTCS_FULLROWSELECT,NSTCS_SPRINGEXPAND,NSTCS_HORIZONTALSCROLL, + NSTCS_RICHTOOLTIP, NSTCS_AUTOHSCROLL, + NSTCS_FADEINOUTEXPANDOS, + NSTCS_PARTIALCHECKBOXES,NSTCS_EXCLUSIONCHECKBOXES, + NSTCS_DIMMEDCHECKBOXES, NSTCS_NOINDENTCHECKS, + NSTCS_ROOTHASEXPANDO,NSTCS_SHOWSELECTIONALWAYS,NSTCS_NOINFOTIP, + NSTCS_EVENHEIGHT,NSTCS_NOREPLACEOPEN,NSTCS_DISABLEDRAGDROP, + NSTCS_NOORDERSTREAM,NSTCS_BORDER,NSTCS_NOEDITLABELS, + NSTCS_TABSTOP,NSTCS_FAVORITESMODE,NSTCS_EMPTYTEXT,NSTCS_CHECKBOXES, + NSTCS_ALLOWJUNCTIONS,NSTCS_SHOWTABSBUTTON,NSTCS_SHOWDELETEBUTTON, + NSTCS_SHOWREFRESHBUTTON, 0}; + trace("Detected broken INameSpaceTreeControl2.\n"); + + style = 0xdeadbeef; + hr = INameSpaceTreeControl2_GetControlStyle(pnstc2, 0xFFFFFFFF, &style); + ok(hr == S_OK, "Got 0x%08x\n", hr); + ok(style == 0xdeadbeef, "Got style %x\n", style); + + hr = INameSpaceTreeControl2_GetControlStyle2(pnstc2, 0xFFFFFFFF, &style2); + ok(hr == S_OK, "Got 0x%08x\n", hr); + ok(style2 == 0, "Got style %x\n", style2); + + tmp = 0; + for(i = 0; styles[i] != 0; i++) + { + hr = INameSpaceTreeControl2_SetControlStyle(pnstc2, styles[i], styles[i]); + ok(hr == E_FAIL || ((styles[i] & NSTCS_SPRINGEXPAND) && hr == S_OK), + "Got 0x%08x (%x)\n", hr, styles[i]); + if(SUCCEEDED(hr)) tmp |= styles[i]; + } + + style = 0xdeadbeef; + hr = INameSpaceTreeControl2_GetControlStyle(pnstc2, tmp, &style); + ok(hr == S_OK, "Got 0x%08x\n", hr); + ok(style == 0xdeadbeef, "Got style %x\n", style); + + tmp = 0; + for(i = 0; styles2[i] != 0; i++) + { + hr = INameSpaceTreeControl2_SetControlStyle2(pnstc2, styles2[i], styles2[i]); + ok(hr == S_OK, "Got 0x%08x (%x)\n", hr, styles2[i]); + if(SUCCEEDED(hr)) tmp |= styles2[i]; + } + + style2 = 0xdeadbeef; + hr = INameSpaceTreeControl2_GetControlStyle2(pnstc2, 0xFFFFFFFF, &style2); + ok(hr == S_OK, "Got 0x%08x\n", hr); + ok(style2 == tmp, "Got style %x\n", style2); + + } + + INameSpaceTreeControl2_Release(pnstc2); + } + else + { + skip("INameSpaceTreeControl2 missing.\n"); + } + + hr = INameSpaceTreeControl_RemoveRoot(pnstc, NULL); + ok(hr == E_NOINTERFACE, "Got (0x%08x)\n", hr); + + /* Append / Insert root */ + if(0) + { + /* Crashes under Windows 7 */ + hr = INameSpaceTreeControl_AppendRoot(pnstc, NULL, SHCONTF_FOLDERS, 0, NULL); + hr = INameSpaceTreeControl_InsertRoot(pnstc, 0, NULL, SHCONTF_FOLDERS, 0, NULL); + } + + /* Note the usage of psidesktop and psidesktop2 */ + hr = INameSpaceTreeControl_AppendRoot(pnstc, psidesktop, SHCONTF_FOLDERS, 0, NULL); + ok(hr == S_OK, "Got (0x%08x)\n", hr); + hr = INameSpaceTreeControl_AppendRoot(pnstc, psidesktop, SHCONTF_FOLDERS, 0, NULL); + ok(hr == S_OK, "Got (0x%08x)\n", hr); + hr = INameSpaceTreeControl_AppendRoot(pnstc, psidesktop2, SHCONTF_FOLDERS, 0, NULL); + ok(hr == S_OK, "Got (0x%08x)\n", hr); + process_msgs(); + + hr = INameSpaceTreeControl_RemoveRoot(pnstc, psidesktop); + ok(hr == S_OK, "Got (0x%08x)\n", hr); + hr = INameSpaceTreeControl_RemoveRoot(pnstc, psidesktop); + ok(hr == S_OK, "Got (0x%08x)\n", hr); + hr = INameSpaceTreeControl_RemoveRoot(pnstc, psidesktop); + ok(hr == S_OK, "Got (0x%08x)\n", hr); + + hr = INameSpaceTreeControl_RemoveRoot(pnstc, psidesktop); + ok(hr == E_FAIL, "Got (0x%08x)\n", hr); + hr = INameSpaceTreeControl_RemoveAllRoots(pnstc); + ok(hr == E_INVALIDARG, "Got (0x%08x)\n", hr); + + hr = INameSpaceTreeControl_AppendRoot(pnstc, psidesktop, SHCONTF_FOLDERS, 0, NULL); + ok(hr == S_OK, "Got (0x%08x)\n", hr); + hr = INameSpaceTreeControl_RemoveAllRoots(pnstc); + ok(hr == S_OK, "Got (0x%08x)\n", hr); + + hr = INameSpaceTreeControl_InsertRoot(pnstc, 0, psidesktop, SHCONTF_FOLDERS, 0, NULL); + ok(hr == S_OK, "Got (0x%08x)\n", hr); + hr = INameSpaceTreeControl_InsertRoot(pnstc, -1, psidesktop, SHCONTF_FOLDERS, 0, NULL); + ok(hr == S_OK, "Got (0x%08x)\n", hr); + hr = INameSpaceTreeControl_InsertRoot(pnstc, -1, psidesktop, SHCONTF_FOLDERS, 0, NULL); + ok(hr == S_OK, "Got (0x%08x)\n", hr); + hr = INameSpaceTreeControl_InsertRoot(pnstc, 50, psidesktop, SHCONTF_FOLDERS, 0, NULL); + ok(hr == S_OK, "Got (0x%08x)\n", hr); + hr = INameSpaceTreeControl_InsertRoot(pnstc, 1, psidesktop, SHCONTF_FOLDERS, 0, NULL); + ok(hr == S_OK, "Got (0x%08x)\n", hr); + + hr = INameSpaceTreeControl_RemoveAllRoots(pnstc); + ok(hr == S_OK, "Got (0x%08x)\n", hr); + + /* GetRootItems */ + if(0) + { + /* Crashes on native. */ + hr = INameSpaceTreeControl_GetRootItems(pnstc, NULL); + } + + hr = INameSpaceTreeControl_GetRootItems(pnstc, &psia); + ok(hr == E_INVALIDARG, "Got (0x%08x)\n", hr); + + hr = INameSpaceTreeControl_AppendRoot(pnstc, psidesktop, 0, 0, NULL); + ok(hr == S_OK, "Got 0x%08x\n", hr); + hr = INameSpaceTreeControl_AppendRoot(pnstc, psidesktop2, 0, 0, NULL); + ok(hr == S_OK, "Got 0x%08x\n", hr); + hr = INameSpaceTreeControl_AppendRoot(pnstc, psitestdir, 0, 0, NULL); + ok(hr == S_OK, "Got 0x%08x\n", hr); + hr = INameSpaceTreeControl_AppendRoot(pnstc, psitestdir2, 0, 0, NULL); + ok(hr == S_OK, "Got 0x%08x\n", hr); + + roots[0] = psidesktop; + roots[1] = psidesktop2; + roots[2] = psitestdir; + roots[3] = psitestdir2; + roots[4] = NULL; + verify_root_order(pnstc, roots); + + hr = INameSpaceTreeControl_InsertRoot(pnstc, 0, psitestdir2, 0, 0, NULL); + ok(hr == S_OK, "Got 0x%08x\n", hr); + + roots[0] = psitestdir2; + roots[1] = psidesktop; + roots[2] = psidesktop2; + roots[3] = psitestdir; + roots[4] = psitestdir2; + roots[5] = NULL; + verify_root_order(pnstc, roots); + + hr = INameSpaceTreeControl_InsertRoot(pnstc, 5, psidesktop, 0, 0, NULL); + ok(hr == S_OK, "Got 0x%08x\n", hr); + + roots[5] = psidesktop; + roots[6] = NULL; + verify_root_order(pnstc, roots); + + hr = INameSpaceTreeControl_InsertRoot(pnstc, 3, psitestdir2, 0, 0, NULL); + ok(hr == S_OK, "Got 0x%08x\n", hr); + + roots[3] = psitestdir2; + roots[4] = psitestdir; + roots[5] = psitestdir2; + roots[6] = psidesktop; + roots[7] = NULL; + verify_root_order(pnstc, roots); + + hr = INameSpaceTreeControl_AppendRoot(pnstc, psitestdir2, 0, 0, NULL); + ok(hr == S_OK, "Got 0x%08x\n", hr); + + roots[7] = psitestdir2; + roots[8] = NULL; + verify_root_order(pnstc, roots); + + hr = INameSpaceTreeControl_InsertRoot(pnstc, -1, psidesktop, 0, 0, NULL); + ok(hr == S_OK, "Got 0x%08x\n", hr); + + roots[0] = psidesktop; + roots[1] = psitestdir2; + roots[2] = psidesktop; + roots[3] = psidesktop2; + roots[4] = psitestdir2; + roots[5] = psitestdir; + roots[6] = psitestdir2; + roots[7] = psidesktop; + roots[8] = psitestdir2; + roots[9] = NULL; + verify_root_order(pnstc, roots); + + /* CollapseAll */ + hr = INameSpaceTreeControl_CollapseAll(pnstc); + ok(hr == S_OK, "Got 0x%08x\n", hr); + + hr = INameSpaceTreeControl_RemoveAllRoots(pnstc); + ok(hr == S_OK, "Got (0x%08x)\n", hr); + + hr = INameSpaceTreeControl_CollapseAll(pnstc); + ok(hr == S_OK, "Got 0x%08x\n", hr); + + /* SetItemState message checks */ + res = subclass_treeview(pnstc); + ok(res, "Failed to subclass treeview.\n"); + if(res) + { + UINT isMask, isFlags; + + hr = INameSpaceTreeControl_AppendRoot( + pnstc, psidesktop, SHCONTF_NONFOLDERS | SHCONTF_FOLDERS, 0, NULL); + ok(hr == S_OK, "Got (0x%08x)\n", hr); + flush_sequences(sequences, NUM_MSG_SEQUENCES); + + /* A special case - + * The first expansion results in an "unrelated" TVM_SETITEMW being sent + * (mask == 0x50 (TVIF_CHILDREN|TVIF_HANDLE) ) + */ + tvi_count = 0; + hr = INameSpaceTreeControl_SetItemState(pnstc, psidesktop, + NSTCIS_EXPANDED, NSTCIS_EXPANDED); + ok(hr == S_OK, "Got 0x%08x\n", hr); + todo_wine + { + ok(tvi_count == 1, "Got %d\n", tvi_count); + ok(last_tvi.mask == 0x50, "Got mask %x, expected 0x50\n", last_tvi.mask); + } + + tvi_count = 0; + hr = INameSpaceTreeControl_SetItemState(pnstc, psidesktop, + NSTCIS_EXPANDED, NSTCIS_EXPANDED); + ok(hr == S_OK, "Got 0x%08x\n", hr); + ok(tvi_count == 0, "Got %d\n", tvi_count); + + /* Test all the combinations of NSTCIS_SELECTED to NSTCIS_SELECTEDNOEXPAND */ + flush_sequences(sequences, NUM_MSG_SEQUENCES); + for(isMask = 0; isMask <= 0x1f; isMask++) + { + for(isFlags = 0; isFlags <= 0x1f; isFlags++) + { + UINT select_sent, select_sent_vista, ensurev_sent, expand_sent; + TVITEMEXW tviexp; + UINT msg_count; + + flush_sequences(sequences, NUM_MSG_SEQUENCES); + tvi_count = 0; + + hr = INameSpaceTreeControl_SetItemState(pnstc, psidesktop, isMask, isFlags); + ok(hr == S_OK, "(%x|%x)Got 0x%08x\n", isMask, isFlags, hr); + + /*****************************/ + /* Calculate expected values */ + /*****************************/ + + /* Number of TVM_SELECTITEM/TVM_ENSUREVISIBLE and TVM_EXPAND sent */ + select_sent = ((isMask&isFlags) & NSTCIS_SELECTED)?1:0; + select_sent_vista = ensurev_sent = select_sent; + + select_sent += ((isMask&isFlags) & NSTCIS_SELECTEDNOEXPAND)?1:0; + select_sent_vista += ((isMask&isFlags) & NSTCIS_EXPANDED)?1:0; + expand_sent = ((isMask|isFlags) & NSTCIS_EXPANDED)?1:0; + + /* Possible TWM_SETITEMW message and its contents */ + if(isMask & NSTCIS_DISABLED) + tviexp.mask = TVIF_STATE | TVIF_STATEEX; + else if( ((isMask^isFlags) & (NSTCIS_SELECTED|NSTCIS_EXPANDED|NSTCIS_SELECTEDNOEXPAND)) || + ((isMask|isFlags) & NSTCIS_BOLD) || (isFlags & NSTCIS_DISABLED) ) + tviexp.mask = TVIF_STATE; + else + tviexp.mask = 0; + + if(tviexp.mask) + { + tviexp.stateMask = tviexp.state = 0; + tviexp.stateMask |= ((isMask^isFlags)&NSTCIS_SELECTED) ? TVIS_SELECTED : 0; + tviexp.stateMask |= (isMask|isFlags)&NSTCIS_BOLD ? TVIS_BOLD:0; + tviexp.state |= (isMask&isFlags)&NSTCIS_BOLD ? TVIS_BOLD:0; + + if((isMask&NSTCIS_EXPANDED)^(isFlags&NSTCIS_EXPANDED)) + { + tviexp.stateMask = 0; + } + + tviexp.uStateEx = (isFlags&isMask)&NSTCIS_DISABLED?TVIS_EX_DISABLED:0; + } + else + { + /* Make sure that no tests accidentally succeeded + * (and avoid a gcc warning) */ + tviexp.stateMask = tviexp.state = tviexp.uStateEx = -1; + } + + /*****************************/ + /* Check the values. */ + /*****************************/ + + msg_count = get_msg_count(sequences, TREEVIEW_SEQ_INDEX, TVM_SELECTITEM); + ok(msg_count == select_sent || broken(msg_count == select_sent_vista), + "(%x|%x) Got msg_count %d, expected %d (%d)\n", + isMask, isFlags, msg_count, select_sent, select_sent_vista); + msg_count = get_msg_count(sequences, TREEVIEW_SEQ_INDEX, TVM_ENSUREVISIBLE); + ok(msg_count == ensurev_sent || broken(msg_count == 0 /* Vista */), + "(%x|%x) Got msg_count %d, expected %d\n", + isMask, isFlags, msg_count, ensurev_sent); + msg_count = get_msg_count(sequences, TREEVIEW_SEQ_INDEX, TVM_EXPAND); + ok(msg_count == expand_sent, "(%x|%x) Got msg_count %d, expected %d\n", + isMask, isFlags, msg_count, expand_sent); + + msg_count = get_msg_count(sequences, TREEVIEW_SEQ_INDEX, TVM_SETITEMW); + if(!tviexp.mask) + { + /* Four special cases for vista */ + BOOL vista_check = ( (isMask == 0x10 && isFlags == 0x10) || + (isMask == 0x11 && isFlags == 0x11) || + (isMask == 0x12 && isFlags == 0x12) || + (isMask == 0x13 && isFlags == 0x13) ); + + ok(msg_count == 0 || broken(msg_count == 1 && vista_check), + "(%x|%x) Got msg_count %d (tviexp.mask %x)\n", + isMask, isFlags, msg_count, tviexp.mask); + } + else + { + ok(msg_count == 1, "(%x|%x) Got msg_count %d, expected 1\n", + isMask, isFlags, msg_count); + ok(last_tvi.mask == tviexp.mask, + "(%x|%x) Got mask %x, expected %x\n", + isMask, isFlags, last_tvi.mask, tviexp.mask); + ok(last_tvi.stateMask == tviexp.stateMask, + "(%x|%x) Got stateMask %x, expected %x\n", + isMask, isFlags, last_tvi.stateMask, tviexp.stateMask); + ok(last_tvi.state == tviexp.state, + "(%x|%x) Got state %x, expected %x\n", + isMask, isFlags, last_tvi.state, tviexp.state); + ok(last_tvi.uStateEx == tviexp.uStateEx, + "(%x|%x) Got uStateEx %x, expected %x\n", + isMask, isFlags, last_tvi.uStateEx, tviexp.uStateEx); + } + } + } + hr = INameSpaceTreeControl_RemoveAllRoots(pnstc); + ok(hr == S_OK, "Got (0x%08x)\n", hr); + } + + /* GetSelectedItems */ + if(0) + { + /* Crashes under Windows 7 */ + hr = INameSpaceTreeControl_GetSelectedItems(pnstc, NULL); + } + + psia = (void*)0xdeadbeef; + hr = INameSpaceTreeControl_GetSelectedItems(pnstc, &psia); + ok(hr == E_FAIL, "Got 0x%08x\n", hr); + ok(psia == (void*)0xdeadbeef, "Got %p", psia); + + hr = INameSpaceTreeControl_AppendRoot(pnstc, psitestdir2, SHCONTF_FOLDERS, 0, NULL); + ok(hr == S_OK, "Got (0x%08x)\n", hr); + process_msgs(); + + hr = INameSpaceTreeControl_AppendRoot(pnstc, psitestdir, SHCONTF_FOLDERS, 0, NULL); + ok(hr == S_OK, "Got (0x%08x)\n", hr); + process_msgs(); + + hr = INameSpaceTreeControl_SetItemState(pnstc, psitestdir, + NSTCIS_SELECTED, NSTCIS_SELECTED); + ok(hr == S_OK, "Got 0x%08x\n", hr); + + hr = INameSpaceTreeControl_GetSelectedItems(pnstc, &psia); + ok(hr == S_OK, "Got 0x%08x\n", hr); + if(SUCCEEDED(hr)) + { + UINT count; + hr = IShellItemArray_GetCount(psia, &count); + ok(hr == S_OK, "Got 0x%08x\n", hr); + ok(count == 1, "Got %d selected items.\n", count); + if(count) + { + hr = IShellItemArray_GetItemAt(psia, 0, &psi); + ok(hr == S_OK, "Got 0x%08x\n", hr); + if(SUCCEEDED(hr)) + { + int cmp; + hr = IShellItem_Compare(psi, psitestdir, SICHINT_DISPLAY, &cmp); + ok(hr == S_OK, "Got 0x%08x\n", hr); + IShellItem_Release(psi); + } + } + IShellItemArray_Release(psia); + } + + hr = INameSpaceTreeControl_SetItemState(pnstc, psitestdir2, + NSTCIS_SELECTED, NSTCIS_SELECTED); + ok(hr == S_OK, "Got 0x%08x\n", hr); + process_msgs(); + + hr = INameSpaceTreeControl_GetSelectedItems(pnstc, &psia); + ok(hr == S_OK, "Got 0x%08x\n", hr); + if(SUCCEEDED(hr)) + { + UINT count; + hr = IShellItemArray_GetCount(psia, &count); + ok(hr == S_OK, "Got 0x%08x\n", hr); + ok(count == 1, "Got %d selected items.\n", count); + if(count) + { + hr = IShellItemArray_GetItemAt(psia, 0, &psi); + ok(hr == S_OK, "Got 0x%08x\n", hr); + if(SUCCEEDED(hr)) + { + int cmp; + hr = IShellItem_Compare(psi, psitestdir2, SICHINT_DISPLAY, &cmp); + ok(hr == S_OK, "Got 0x%08x\n", hr); + IShellItem_Release(psi); + } + } + IShellItemArray_Release(psia); + } + + hr = INameSpaceTreeControl_SetItemState(pnstc, psitest1, + NSTCIS_SELECTED, NSTCIS_SELECTED); + todo_wine ok(hr == S_OK, "Got 0x%08x\n", hr); + hr = INameSpaceTreeControl_GetSelectedItems(pnstc, &psia); + ok(hr == S_OK, "Got 0x%08x\n", hr); + if(SUCCEEDED(hr)) + { + UINT count; + hr = IShellItemArray_GetCount(psia, &count); + ok(hr == S_OK, "Got 0x%08x\n", hr); + ok(count == 1, "Got %d selected items.\n", count); + if(count) + { + hr = IShellItemArray_GetItemAt(psia, 0, &psi); + ok(hr == S_OK, "Got 0x%08x\n", hr); + if(SUCCEEDED(hr)) + { + int cmp; + hr = IShellItem_Compare(psi, psitest1, SICHINT_DISPLAY, &cmp); + todo_wine ok(hr == S_OK, "Got 0x%08x\n", hr); + IShellItem_Release(psi); + } + } + IShellItemArray_Release(psia); + } + + hr = INameSpaceTreeControl_RemoveAllRoots(pnstc); + ok(hr == S_OK || broken(hr == E_FAIL), "Got 0x%08x\n", hr); + if(hr == E_FAIL) + { + /* For some reason, Vista fails to properly remove both the + * roots here on the first try. */ + hr = INameSpaceTreeControl_RemoveAllRoots(pnstc); + ok(hr == S_OK, "Got 0x%08x\n", hr); + } + + /* Adding without NSTCRS_EXPANDED does not set the selection */ + hr = INameSpaceTreeControl_AppendRoot(pnstc, psitestdir, + SHCONTF_FOLDERS | SHCONTF_NONFOLDERS, + 0, NULL); + ok(hr == S_OK, "Got 0x%08x\n", hr); + process_msgs(); + + hr = INameSpaceTreeControl_GetItemState(pnstc, psitestdir, 0xFF, &istate); + ok(hr == S_OK, "Got 0x%08x\n", hr); + ok(!(istate & NSTCIS_SELECTED), "Got 0x%08x\n", istate); + hr = INameSpaceTreeControl_GetSelectedItems(pnstc, &psia); + ok(hr == E_FAIL, "Got 0x%08x\n", hr); + if(SUCCEEDED(hr)) IShellItemArray_Release(psia); + + hr = INameSpaceTreeControl_RemoveAllRoots(pnstc); + ok(hr == S_OK, "Got 0x%08x\n", hr); + + /* Adding with NSTCRS_EXPANDED sets the selection */ + hr = INameSpaceTreeControl_AppendRoot(pnstc, psitestdir, + SHCONTF_FOLDERS | SHCONTF_NONFOLDERS, + NSTCRS_EXPANDED, NULL); + ok(hr == S_OK, "Got 0x%08x\n", hr); + process_msgs(); + + hr = INameSpaceTreeControl_GetItemState(pnstc, psitestdir, 0xFF, &istate); + ok(hr == S_OK, "Got 0x%08x\n", hr); + todo_wine ok(istate & NSTCIS_SELECTED, "Got 0x%08x\n", istate); + hr = INameSpaceTreeControl_GetSelectedItems(pnstc, &psia); + todo_wine ok(hr == S_OK, "Got 0x%08x\n", hr); + if(SUCCEEDED(hr)) + { + IShellItem *psi; + + hr = IShellItemArray_GetItemAt(psia, 0, &psi); + if(SUCCEEDED(hr)) + { + INT cmp; + hr = IShellItem_Compare(psi, psitestdir, SICHINT_DISPLAY, &cmp); + ok(hr == S_OK, "Got 0x%08x\n", hr); + + IShellItem_Release(psi); + } + + IShellItemArray_Release(psia); + } + + /* Adding a second root with NSTCRS_EXPANDED does not change the selection */ + hr = INameSpaceTreeControl_AppendRoot(pnstc, psitestdir2, + SHCONTF_FOLDERS | SHCONTF_NONFOLDERS, + NSTCRS_EXPANDED, NULL); + ok(hr == S_OK, "Got 0x%08x\n", hr); + process_msgs(); + + hr = INameSpaceTreeControl_GetItemState(pnstc, psitestdir2, 0xFF, &istate); + ok(hr == S_OK, "Got 0x%08x\n", hr); + ok(!(istate & NSTCIS_SELECTED), "Got 0x%08x\n", istate); + hr = INameSpaceTreeControl_GetSelectedItems(pnstc, &psia); + todo_wine ok(hr == S_OK, "Got 0x%08x\n", hr); + if(SUCCEEDED(hr)) + { + IShellItem *psi; + + hr = IShellItemArray_GetItemAt(psia, 0, &psi); + if(SUCCEEDED(hr)) + { + INT cmp; + hr = IShellItem_Compare(psi, psitestdir, SICHINT_DISPLAY, &cmp); + ok(hr == S_OK, "Got 0x%08x\n", hr); + + IShellItem_Release(psi); + } + + IShellItemArray_Release(psia); + } + + hr = INameSpaceTreeControl_RemoveAllRoots(pnstc); + ok(hr == S_OK, "Got (0x%08x)\n", hr); + + /* GetItemRect */ + rc.top = rc.left = rc.bottom = rc.right = 0; + if(0) + { + /* Crashes under win 7 */ + hr = INameSpaceTreeControl_GetItemRect(pnstc, NULL, NULL); + hr = INameSpaceTreeControl_GetItemRect(pnstc, psitestdir, NULL); + hr = INameSpaceTreeControl_GetItemRect(pnstc, NULL, &rc); + } + + hr = INameSpaceTreeControl_GetItemRect(pnstc, psitestdir, &rc); + ok(hr == E_INVALIDARG, "Got 0x%08x\n", hr); + + hr = INameSpaceTreeControl_AppendRoot(pnstc, psitestdir, + SHCONTF_FOLDERS | SHCONTF_NONFOLDERS, + NSTCRS_EXPANDED, NULL); + ok(hr == S_OK, "Got 0x%08x\n", hr); + process_msgs(); + + hr = INameSpaceTreeControl_GetItemRect(pnstc, psitestdir, &rc); + ok(hr == S_OK, "Got 0x%08x\n", hr); + ok(rc.top != rc.bottom, "Got 0 height.\n"); + ok(rc.left != rc.bottom, "Got 0 width.\n"); + + height = 0; + hwnd_tv = get_treeview_hwnd(pnstc); + if(hwnd_tv) + { + HTREEITEM hroot = (HTREEITEM)SendMessageW(hwnd_tv, TVM_GETNEXTITEM, TVGN_ROOT, 0); + ok(hroot != NULL, "Failed to get root.\n"); + if(hroot) + { + RECT tv_rc; + BOOL bret; + + *(HTREEITEM*)&tv_rc = hroot; + bret = SendMessageW(hwnd_tv, TVM_GETITEMRECT, FALSE, (LPARAM)&tv_rc); + ok(bret, "TVM_GETITEMRECT failed.\n"); + + /* The NamespaceTreeControl returns screen coordinates. */ + MapWindowPoints(NULL, hwnd, (POINT*)&rc, 2); + ok(rc.left == tv_rc.left, "Differed, got %d and %d\n", rc.left, tv_rc.left); + ok(rc.top == tv_rc.top, "Differed, got %d and %d\n", rc.top, tv_rc.top); + ok(rc.right == tv_rc.right, "Differed, got %d and %d\n", rc.right, tv_rc.right); + ok(rc.bottom == tv_rc.bottom, "Differed, got %d and %d\n", rc.bottom, tv_rc.bottom); + + /* Save the height and compare to that of other items. + Observed values: 18, 19, 21 */ + height = rc.bottom - rc.top; + trace("height: %d\n", height); + } + } + else + win_skip("Skipping some GetItemRect tests.\n"); + + hr = INameSpaceTreeControl_RemoveAllRoots(pnstc); + ok(hr == S_OK, "Got (0x%08x)\n", hr); + + /* HitTest */ + hr = INameSpaceTreeControl_HitTest(pnstc, NULL, NULL); + ok(hr == E_POINTER, "Got 0x%08x\n", hr); + hr = INameSpaceTreeControl_HitTest(pnstc, &pt, NULL); + ok(hr == E_POINTER, "Got 0x%08x\n", hr); + hr = INameSpaceTreeControl_HitTest(pnstc, NULL, &psi); + ok(hr == E_POINTER, "Got 0x%08x\n", hr); + + psi = (void*)0xdeadbeef; + hr = INameSpaceTreeControl_HitTest(pnstc, &pt, &psi); + ok(hr == S_FALSE, "Got 0x%08x\n", hr); + ok(psi == NULL, "Got psi %p\n", psi); + + hr = INameSpaceTreeControl_AppendRoot(pnstc, psitestdir, + SHCONTF_FOLDERS | SHCONTF_NONFOLDERS, + NSTCRS_EXPANDED, NULL); + ok(hr == S_OK, "Got 0x%08x\n", hr); + process_msgs(); + + pt.x = pt.y = 0; + hr = INameSpaceTreeControl_HitTest(pnstc, &pt, &psi); + ok(hr == S_OK, "Got 0x%08x\n", hr); + if(SUCCEEDED(hr)) + { + int cmp; + hr = IShellItem_Compare(psi, psitestdir, SICHINT_DISPLAY, &cmp); + ok(hr == S_OK, "Got 0x%08x\n", hr); + ok(!cmp, "Got cmp %d\n", cmp); + IShellItem_Release(psi); + } + + pt.y += height - 1; + hr = INameSpaceTreeControl_HitTest(pnstc, &pt, &psi); + ok(hr == S_OK, "Got 0x%08x\n", hr); + if(SUCCEEDED(hr)) + { + int cmp; + hr = IShellItem_Compare(psi, psitestdir, SICHINT_DISPLAY, &cmp); + ok(hr == S_OK, "Got 0x%08x\n", hr); + ok(!cmp, "Got cmp %d\n", cmp); + IShellItem_Release(psi); + } + + pt.y += 1; + hr = INameSpaceTreeControl_HitTest(pnstc, &pt, &psi); + ok(hr == S_OK, "Got 0x%08x\n", hr); + if(SUCCEEDED(hr)) + { + int cmp; + todo_wine + { + hr = IShellItem_Compare(psi, psitestdir, SICHINT_DISPLAY, &cmp); + ok(hr == S_FALSE, "Got 0x%08x\n", hr); + ok(cmp, "no cmp value.\n"); + hr = IShellItem_Compare(psi, psitestdir2, SICHINT_DISPLAY, &cmp); + ok(hr == S_OK, "Got 0x%08x\n", hr); + ok(!cmp, "Got cmp %d\n", cmp); + } + IShellItem_Release(psi); + } + + hr = INameSpaceTreeControl_GetItemRect(pnstc, psitestdir2, &rc); + ok(hr == S_OK, "Got 0x%08x\n", hr); + if(SUCCEEDED(hr)) + { + MapWindowPoints(NULL, hwnd, (POINT*)&rc, 2); + pt.x = rc.left; pt.y = rc.top; + + hr = INameSpaceTreeControl_HitTest(pnstc, &pt, &psi); + ok(hr == S_OK, "Got 0x%08x\n", hr); + if(SUCCEEDED(hr)) + { + int cmp; + hr = IShellItem_Compare(psi, psitestdir2, SICHINT_DISPLAY, &cmp); + ok(hr == S_OK, "Got 0x%08x\n", hr); + ok(!cmp, "Got cmp %d\n", cmp); + IShellItem_Release(psi); + } + } + + hr = INameSpaceTreeControl_RemoveAllRoots(pnstc); + ok(hr == S_OK, "Got 0x%08x\n", hr); + + /* GetItemCustomState / SetItemCustomState */ + if(0) + { + /* Crashes under Windows 7 */ + hr = INameSpaceTreeControl_GetItemCustomState(pnstc, NULL, NULL); + hr = INameSpaceTreeControl_GetItemCustomState(pnstc, NULL, &cbstate); + hr = INameSpaceTreeControl_GetItemCustomState(pnstc, psitestdir, NULL); + hr = INameSpaceTreeControl_SetItemCustomState(pnstc, NULL, 0); + } + + hr = INameSpaceTreeControl_AppendRoot(pnstc, psitestdir, + SHCONTF_FOLDERS | SHCONTF_NONFOLDERS, + 0, NULL); + process_msgs(); + ok(hr == S_OK, "Got 0x%08x\n", hr); + + todo_wine + { + hr = INameSpaceTreeControl_GetItemCustomState(pnstc, psitestdir, &cbstate); + ok(hr == S_OK, "Got 0x%08x\n", hr); + ok(cbstate == BST_UNCHECKED || broken(cbstate == BST_CHECKED /* Vista x64 */), + "Got %d\n", cbstate); + + hr = INameSpaceTreeControl_SetItemCustomState(pnstc, psitestdir, BST_CHECKED); + ok(hr == S_OK, "Got 0x%08x\n", hr); + + hr = INameSpaceTreeControl_GetItemCustomState(pnstc, psitestdir, &cbstate); + ok(hr == S_OK, "Got 0x%08x\n", hr); + ok(cbstate == BST_CHECKED, "Got %d\n", cbstate); + + hr = INameSpaceTreeControl_SetItemCustomState(pnstc, psitestdir, 0xFFF); + ok(hr == S_OK, "Got 0x%08x\n", hr); + + hr = INameSpaceTreeControl_GetItemCustomState(pnstc, psitestdir, &cbstate); + ok(hr == S_OK, "Got 0x%08x\n", hr); + ok(cbstate == 0xF, "Got %d\n", cbstate); + } + + /* SetTheme */ + todo_wine + { + hr = INameSpaceTreeControl_SetTheme(pnstc, NULL); + ok(hr == S_OK, "Got 0x%08x\n", hr); + hr = INameSpaceTreeControl_SetTheme(pnstc, explorerW); + ok(hr == S_OK, "Got 0x%08x\n", hr); + hr = INameSpaceTreeControl_SetTheme(pnstc, randomW); + ok(hr == S_OK, "Got 0x%08x\n", hr); + } + + hr = INameSpaceTreeControl_RemoveAllRoots(pnstc); + ok(hr == S_OK, "Got (0x%08x)\n", hr); + + IShellItem_Release(psidesktop); + IShellItem_Release(psidesktop2); + IShellItem_Release(psitestdir); + IShellItem_Release(psitestdir2); + IShellItem_Release(psitest1); + + hr = INameSpaceTreeControl_QueryInterface(pnstc, &IID_IOleWindow, (void**)&pow); + ok(hr == S_OK, "Got 0x%08x\n", hr); + if(SUCCEEDED(hr)) + { + HWND hwnd_nstc; + hr = IOleWindow_GetWindow(pow, &hwnd_nstc); + ok(hr == S_OK, "Got 0x%08x\n", hr); + DestroyWindow(hwnd_nstc); + IOleWindow_Release(pow); + } + + res = INameSpaceTreeControl_Release(pnstc); + ok(!res, "res was %d!\n", res); + +cleanup: + Cleanup(); +} + +static void test_events(void) +{ + INameSpaceTreeControl *pnstc; + INameSpaceTreeControlEventsImpl *pnstceimpl, *pnstceimpl2; + INameSpaceTreeControlEvents *pnstce, *pnstce2; + IShellFolder *psfdesktop; + IShellItem *psidesktop; + IOleWindow *pow; + LPITEMIDLIST pidl_desktop; + LPITEMIDLIST pidl_drives; + NSTCITEMSTATE itemstate; + IShellItem *psi; + DWORD cookie1, cookie2; + HWND hwnd_tv; + HRESULT hr; + UINT res; + + hr = CoCreateInstance(&CLSID_NamespaceTreeControl, NULL, CLSCTX_INPROC_SERVER, + &IID_INameSpaceTreeControl, (void**)&pnstc); + ok(hr == S_OK, "Failed to initialize control (0x%08x)\n", hr); + + ok(pSHCreateShellItem != NULL, "No SHCreateShellItem.\n"); + ok(pSHGetIDListFromObject != NULL, "No SHCreateShellItem.\n"); + + SHGetDesktopFolder(&psfdesktop); + hr = pSHGetIDListFromObject((IUnknown*)psfdesktop, &pidl_desktop); + IShellFolder_Release(psfdesktop); + ok(hr == S_OK, "Got (0x%08x)\n", hr); + hr = pSHCreateShellItem(NULL, NULL, pidl_desktop, &psidesktop); + ok(hr == S_OK, "Got 0x%08x\n", hr); + ILFree(pidl_desktop); + + /* Create two instances of INameSpaceTreeControlEvents */ + pnstceimpl = create_nstc_events(); + pnstce = (INameSpaceTreeControlEvents*)pnstceimpl; + ZeroMemory(&pnstceimpl->count, sizeof(UINT)*LastEvent); + pnstceimpl2 = create_nstc_events(); + pnstce2 = (INameSpaceTreeControlEvents*)pnstceimpl2; + + if(0) + { + /* Crashes native */ + hr = INameSpaceTreeControl_TreeAdvise(pnstc, NULL, NULL); + hr = INameSpaceTreeControl_TreeAdvise(pnstc, NULL, &cookie1); + hr = INameSpaceTreeControl_TreeAdvise(pnstc, (IUnknown*)pnstce, NULL); + } + + /* TreeAdvise in NameSpaceTreeController seems to support only one + * client at the time. + */ + + /* First, respond with E_NOINTERFACE to all QI's */ + pnstceimpl->qi_enable_events = FALSE; + pnstceimpl->qi_called_count = 0; + cookie1 = 0xDEADBEEF; + hr = INameSpaceTreeControl_TreeAdvise(pnstc, (IUnknown*)pnstce, &cookie1); + ok(hr == E_FAIL, "Got (0x%08x)\n", hr); + ok(cookie1 == 0, "cookie now (0x%08x)\n", cookie1); + todo_wine + { + ok(pnstceimpl->qi_called_count == 7 || pnstceimpl->qi_called_count == 4 /* Vista */, + "QueryInterface called %d times.\n", + pnstceimpl->qi_called_count); + } + ok(pnstceimpl->ref == 1, "refcount was %d\n", pnstceimpl->ref); + + /* Accept query for IID_INameSpaceTreeControlEvents */ + pnstceimpl->qi_enable_events = TRUE; + pnstceimpl->qi_called_count = 0; + cookie1 = 0xDEADBEEF; + hr = INameSpaceTreeControl_TreeAdvise(pnstc, (IUnknown*)pnstce, &cookie1); + ok(hr == S_OK, "Got (0x%08x)\n", hr); + ok(cookie1 == 1, "cookie now (0x%08x)\n", cookie1); + todo_wine + { + ok(pnstceimpl->qi_called_count == 7 || pnstceimpl->qi_called_count == 4 /* Vista */, + "QueryInterface called %d times.\n", + pnstceimpl->qi_called_count); + } + ok(pnstceimpl->ref == 2, "refcount was %d\n", pnstceimpl->ref); + + /* A second time, query interface will not be called at all. */ + pnstceimpl->qi_enable_events = TRUE; + pnstceimpl->qi_called_count = 0; + cookie2 = 0xDEADBEEF; + hr = INameSpaceTreeControl_TreeAdvise(pnstc, (IUnknown*)pnstce, &cookie2); + ok(hr == E_FAIL, "Got (0x%08x)\n", hr); + ok(cookie2 == 0, "cookie now (0x%08x)\n", cookie2); + ok(!pnstceimpl->qi_called_count, "QueryInterface called %d times.\n", + pnstceimpl->qi_called_count); + ok(pnstceimpl->ref == 2, "refcount was %d\n", pnstceimpl->ref); + + /* Using another "instance" does not help. */ + pnstceimpl2->qi_enable_events = TRUE; + pnstceimpl2->qi_called_count = 0; + cookie2 = 0xDEADBEEF; + hr = INameSpaceTreeControl_TreeAdvise(pnstc, (IUnknown*)pnstce2, &cookie2); + ok(hr == E_FAIL, "Got (0x%08x)\n", hr); + ok(cookie2 == 0, "cookie now (0x%08x)\n", cookie2); + ok(!pnstceimpl2->qi_called_count, "QueryInterface called %d times.\n", + pnstceimpl2->qi_called_count); + ok(pnstceimpl2->ref == 1, "refcount was %d\n", pnstceimpl->ref); + + /* Unadvise with bogus cookie (will actually unadvise properly) */ + pnstceimpl->qi_enable_events = TRUE; + pnstceimpl->qi_called_count = 0; + hr = INameSpaceTreeControl_TreeUnadvise(pnstc, 1234); + ok(hr == S_OK, "Got (0x%08x)\n", hr); + ok(!pnstceimpl->qi_called_count, "QueryInterface called %d times.\n", + pnstceimpl->qi_called_count); + ok(pnstceimpl->ref == 1, "refcount was %d\n", pnstceimpl->ref); + + /* Unadvise "properly" (will have no additional effect) */ + pnstceimpl->qi_enable_events = TRUE; + pnstceimpl->qi_called_count = 0; + hr = INameSpaceTreeControl_TreeUnadvise(pnstc, cookie1); + ok(hr == S_OK, "Got (0x%08x)\n", hr); + ok(!pnstceimpl->qi_called_count, "QueryInterface called %d times.\n", + pnstceimpl->qi_called_count); + ok(pnstceimpl->ref == 1, "refcount was %d\n", pnstceimpl->ref); + + /* Advise again.. */ + pnstceimpl->qi_enable_events = 1; + pnstceimpl->qi_called_count = 0; + hr = INameSpaceTreeControl_TreeAdvise(pnstc, (IUnknown*)pnstce, &cookie2); + ok(hr == S_OK, "Got (0x%08x)\n", hr); + ok(cookie2 == 1, "Cookie is %d\n", cookie2); + ok(cookie1 == cookie2, "Old cookie differs from old cookie.\n"); + todo_wine + { + ok(pnstceimpl->qi_called_count == 7 || pnstceimpl->qi_called_count == 4 /* Vista */, + "QueryInterface called %d times.\n", + pnstceimpl->qi_called_count); + } + ok(pnstceimpl->ref == 2, "refcount was %d\n", pnstceimpl->ref); + + /* Initialize the control */ + hr = INameSpaceTreeControl_Initialize(pnstc, hwnd, NULL, 0); + ok(hr == S_OK, "Got (0x%08x)\n", hr); + ok_no_events(pnstceimpl); + + hr = INameSpaceTreeControl_AppendRoot(pnstc, psidesktop, + SHCONTF_FOLDERS | SHCONTF_NONFOLDERS, 0, NULL); + ok(hr == S_OK, "Got (0x%08x)\n", hr); + process_msgs(); + ok_event_count_broken(pnstceimpl, OnItemAdded, 1, 0 /* Vista */); + ok_event_count(pnstceimpl, OnGetDefaultIconIndex, 0); + ok_no_events(pnstceimpl); + + hwnd_tv = get_treeview_hwnd(pnstc); + ok(hwnd_tv != NULL, "Failed to get hwnd_tv HWND.\n"); + if(hwnd_tv) + { + HTREEITEM hroot, hitem; + UINT i; + static const UINT kbd_msgs_event[] = { + WM_KEYDOWN, WM_KEYUP, WM_CHAR, WM_SYSKEYDOWN, WM_SYSKEYUP, + WM_SYSCHAR, 0 }; + static const UINT kbd_msgs_noevent[] ={ + WM_DEADCHAR, WM_SYSDEADCHAR, WM_UNICHAR, 0 }; + + /* Test On*Expand */ + hroot = (HTREEITEM)SendMessageW(hwnd_tv, TVM_GETNEXTITEM, TVGN_ROOT, 0); + SendMessage(hwnd_tv, TVM_EXPAND, TVE_EXPAND, (LPARAM)hroot); + process_msgs(); + ok_event_count(pnstceimpl, OnBeforeExpand, 1); + ok_event_count(pnstceimpl, OnAfterExpand, 1); + ok_event_broken(pnstceimpl, OnItemAdded); /* No event on Vista */ + todo_wine ok_event_count(pnstceimpl, OnSelectionChanged, 1); + ok_no_events(pnstceimpl); + SendMessage(hwnd_tv, TVM_EXPAND, TVE_COLLAPSE, (LPARAM)hroot); + process_msgs(); + ok_no_events(pnstceimpl); + SendMessage(hwnd_tv, TVM_EXPAND, TVE_EXPAND, (LPARAM)hroot); + process_msgs(); + ok_no_events(pnstceimpl); + + /* Test OnSelectionChanged */ + hitem = (HTREEITEM)SendMessageW(hwnd_tv, TVM_GETNEXTITEM, TVGN_CHILD, (LPARAM)hroot); + SendMessageW(hwnd_tv, TVM_SELECTITEM, TVGN_CARET, (LPARAM)hitem); + process_msgs(); + ok_event_count(pnstceimpl, OnSelectionChanged, 1); + ok_no_events(pnstceimpl); + + /* Test OnKeyboardInput */ + for(i = 0; kbd_msgs_event[i] != 0; i++) + { + SendMessageW(hwnd_tv, kbd_msgs_event[i], 0x1234, 0x1234); + ok(pnstceimpl->count[OnKeyboardInput] == 1, + "%d (%x): Got count %d\n", + kbd_msgs_event[i], kbd_msgs_event[i], pnstceimpl->count[OnKeyboardInput]); + pnstceimpl->count[OnKeyboardInput] = 0; + } + + for(i = 0; kbd_msgs_noevent[i] != 0; i++) + { + SendMessageW(hwnd_tv, kbd_msgs_noevent[i], 0x1234, 0x1234); + ok(pnstceimpl->count[OnKeyboardInput] == 0, + "%d (%x): Got count %d\n", + kbd_msgs_noevent[i], kbd_msgs_noevent[i], pnstceimpl->count[OnKeyboardInput]); + pnstceimpl->count[OnKeyboardInput] = 0; + } + ok_no_events(pnstceimpl); + } + else + skip("Skipping some tests.\n"); + + hr = INameSpaceTreeControl_RemoveAllRoots(pnstc); + process_msgs(); + ok(hr == S_OK, "Got 0x%08x\n", hr); + ok_event(pnstceimpl, OnItemDeleted); + ok_no_events(pnstceimpl); + + hr = INameSpaceTreeControl_AppendRoot(pnstc, psidesktop, + SHCONTF_FOLDERS | SHCONTF_NONFOLDERS, 0, NULL); + ok(hr == S_OK, "Got (0x%08x)\n", hr); + process_msgs(); + ok_event_count_broken(pnstceimpl, OnItemAdded, 1, 0 /* Vista */); + ok_no_events(pnstceimpl); + + hr = INameSpaceTreeControl_GetItemState(pnstc, psidesktop, 0xffff, &itemstate); + ok(hr == S_OK, "Got (0x%08x)\n", hr); + ok(itemstate == NSTCIS_NONE, "itemstate is 0x%08x\n", itemstate); + process_msgs(); + ok_no_events(pnstceimpl); + + /* Expand the root */ + itemstate |= NSTCIS_EXPANDED; + hr = INameSpaceTreeControl_SetItemState(pnstc, psidesktop, 0xffff, itemstate); + ok(hr == S_OK, "Got (0x%08x)\n", hr); + process_msgs(); + ok_event_count(pnstceimpl, OnBeforeExpand, 1); + ok_event_broken(pnstceimpl, OnItemAdded); /* Does not fire on Vista */ + ok_event_count(pnstceimpl, OnAfterExpand, 1); + todo_wine + { + ok_event_count_broken(pnstceimpl, OnSelectionChanged, 1, 0 /* Vista*/); + } + ok_no_events(pnstceimpl); + + hr = INameSpaceTreeControl_GetItemState(pnstc, psidesktop, 0xffff, &itemstate); + ok(hr == S_OK, "Got (0x%08x)\n", hr); + ok(itemstate & NSTCIS_EXPANDED, "Item not expanded.\n"); + todo_wine + { + ok(itemstate == (NSTCIS_SELECTED | NSTCIS_EXPANDED)|| + broken(itemstate == NSTCIS_EXPANDED) /* Vista */, + "itemstate is 0x%08x\n", itemstate); + process_msgs(); + ok_event_count_broken(pnstceimpl, OnSelectionChanged, 1, 0 /* Vista*/); + } + ok_no_events(pnstceimpl); + + /* Deselect the root */ + itemstate &= ~NSTCIS_SELECTED; + hr = INameSpaceTreeControl_SetItemState(pnstc, psidesktop, 0xffff, itemstate); + ok(hr == S_OK, "Got (0x%08x)\n", hr); + process_msgs(); + ok_no_events(pnstceimpl); + + hr = INameSpaceTreeControl_GetItemState(pnstc, psidesktop, 0xffff, &itemstate); + ok(hr == S_OK, "Got (0x%08x)\n", hr); + ok(itemstate == (NSTCIS_EXPANDED), "itemstate is 0x%08x\n", itemstate); + ok_no_events(pnstceimpl); + + hr = INameSpaceTreeControl_CollapseAll(pnstc); + ok(hr == S_OK, "Got (0x%08x)\n", hr); + ok_no_events(pnstceimpl); + + /* Delete all roots */ + hr = INameSpaceTreeControl_RemoveAllRoots(pnstc); + ok(hr == S_OK, "Got (0x%08x)\n", hr); + ok_event_count(pnstceimpl, OnItemDeleted, 1); + ok_no_events(pnstceimpl); + + /* Get/SetItemState */ + if(0) + { + /* Crashes on Windows 7 */ + hr = INameSpaceTreeControl_SetItemState(pnstc, NULL, 0, 0); + hr = INameSpaceTreeControl_GetItemState(pnstc, NULL, 0, NULL); + hr = INameSpaceTreeControl_GetItemState(pnstc, psidesktop, 0, NULL); + hr = INameSpaceTreeControl_GetItemState(pnstc, NULL, 0, &itemstate); + hr = INameSpaceTreeControl_GetItemState(pnstc, psidesktop, 0, NULL); + hr = INameSpaceTreeControl_GetItemState(pnstc, NULL, 0, &itemstate); + } + + itemstate = 0xDEADBEEF; + hr = INameSpaceTreeControl_GetItemState(pnstc, psidesktop, 0xffff, &itemstate); + ok(hr == E_INVALIDARG, "Got (0x%08x)\n", hr); + hr = INameSpaceTreeControl_SetItemState(pnstc, psidesktop, 0xffff, 0); + ok(hr == E_INVALIDARG, "Got (0x%08x)\n", hr); + ok_no_events(pnstceimpl); + + hr = INameSpaceTreeControl_AppendRoot(pnstc, psidesktop, + SHCONTF_FOLDERS | SHCONTF_NONFOLDERS, 0, NULL); + ok(hr == S_OK, "Got (0x%08x)\n", hr); + process_msgs(); + ok_event_count_broken(pnstceimpl, OnItemAdded, 1, 0 /* Vista */); + ok_no_events(pnstceimpl); + + itemstate = 0xDEADBEEF; + hr = INameSpaceTreeControl_GetItemState(pnstc, psidesktop, 0xffff, &itemstate); + ok(hr == S_OK, "Got (0x%08x)\n", hr); + ok(itemstate == NSTCIS_NONE, "itemstate is 0x%08x\n", itemstate); + ok_no_events(pnstceimpl); + + hr = INameSpaceTreeControl_SetItemState(pnstc, psidesktop, 0, 0xffff); + ok(hr == S_OK, "Got (0x%08x)\n", hr); + process_msgs(); + todo_wine + { + ok_event_count(pnstceimpl, OnBeforeExpand, 0); + ok_event_count(pnstceimpl, OnAfterExpand, 0); + ok_event_count(pnstceimpl, OnItemAdded, 0); + } + ok_no_events(pnstceimpl); + + itemstate = 0xDEADBEEF; + hr = INameSpaceTreeControl_GetItemState(pnstc, psidesktop, 0xffff, &itemstate); + ok(hr == S_OK, "Got (0x%08x)\n", hr); + todo_wine + ok(itemstate == NSTCIS_NONE, "itemstate is 0x%08x\n", itemstate); + ok_no_events(pnstceimpl); + + hr = INameSpaceTreeControl_SetItemState(pnstc, psidesktop, 0xffff, 0); + ok(hr == S_OK, "Got (0x%08x)\n", hr); + process_msgs(); + ok_no_events(pnstceimpl); + + itemstate = 0xDEADBEEF; + hr = INameSpaceTreeControl_GetItemState(pnstc, psidesktop, 0xffff, &itemstate); + ok(hr == S_OK, "Got (0x%08x)\n", hr); + ok(itemstate == NSTCIS_NONE, "itemstate is 0x%08x\n", itemstate); + ok_no_events(pnstceimpl); + + hr = INameSpaceTreeControl_SetItemState(pnstc, psidesktop, 0xffff, NSTCIS_SELECTED); + ok(hr == S_OK, "Got (0x%08x)\n", hr); + process_msgs(); + ok_event_count(pnstceimpl, OnSelectionChanged, 1); + ok_no_events(pnstceimpl); + + itemstate = 0xDEADBEEF; + hr = INameSpaceTreeControl_GetItemState(pnstc, psidesktop, 0xffff, &itemstate); + ok(hr == S_OK, "Got (0x%08x)\n", hr); + ok(itemstate == NSTCIS_SELECTED, "itemstate is 0x%08x\n", itemstate); + ok_no_events(pnstceimpl); + + hr = INameSpaceTreeControl_SetItemState(pnstc, psidesktop, NSTCIS_EXPANDED, NSTCIS_SELECTED); + ok(hr == S_OK, "Got (0x%08x)\n", hr); + process_msgs(); + ok_no_events(pnstceimpl); + + itemstate = 0xDEADBEEF; + hr = INameSpaceTreeControl_GetItemState(pnstc, psidesktop, 0xffff, &itemstate); + ok(hr == S_OK, "Got (0x%08x)\n", hr); + ok(itemstate == NSTCIS_SELECTED, "itemstate is 0x%08x\n", itemstate); + ok_no_events(pnstceimpl); + + hr = INameSpaceTreeControl_SetItemState(pnstc, psidesktop, 0xffff, 0); + ok(hr == S_OK, "Got (0x%08x)\n", hr); + process_msgs(); + ok_no_events(pnstceimpl); + + itemstate = 0xDEADBEEF; + hr = INameSpaceTreeControl_GetItemState(pnstc, psidesktop, 0xffff, &itemstate); + ok(hr == S_OK, "Got (0x%08x)\n", hr); + ok(itemstate == NSTCIS_SELECTED, "itemstate is 0x%08x\n", itemstate); + ok_no_events(pnstceimpl); + + hr = INameSpaceTreeControl_SetItemState(pnstc, psidesktop, 0xffff, NSTCIS_SELECTEDNOEXPAND); + ok(hr == S_OK, "Got (0x%08x)\n", hr); + process_msgs(); + ok_no_events(pnstceimpl); + + itemstate = 0xDEADBEEF; + hr = INameSpaceTreeControl_GetItemState(pnstc, psidesktop, 0xffff, &itemstate); + ok(hr == S_OK, "Got (0x%08x)\n", hr); + ok(itemstate == NSTCIS_SELECTED, "itemstate is 0x%08x\n", itemstate); + ok_no_events(pnstceimpl); + + hr = INameSpaceTreeControl_SetItemState(pnstc, psidesktop, 0xffff, NSTCIS_EXPANDED); + ok(hr == S_OK, "Got (0x%08x)\n", hr); + process_msgs(); + todo_wine + { + ok_event_count(pnstceimpl, OnBeforeExpand, 1); + ok_event_broken(pnstceimpl, OnItemAdded); /* Does not fire on Vista */ + ok_event_count(pnstceimpl, OnAfterExpand, 1); + } + ok_no_events(pnstceimpl); + + itemstate = 0xDEADBEEF; + hr = INameSpaceTreeControl_GetItemState(pnstc, psidesktop, 0xffff, &itemstate); + ok(hr == S_OK, "Got (0x%08x)\n", hr); + ok(itemstate == NSTCIS_EXPANDED, "itemstate is 0x%08x\n", itemstate); + ok_no_events(pnstceimpl); + + hr = INameSpaceTreeControl_SetItemState(pnstc, psidesktop, 0xffff, 0); + ok(hr == S_OK, "Got (0x%08x)\n", hr); + process_msgs(); + ok_no_events(pnstceimpl); + + itemstate = 0xDEADBEEF; + hr = INameSpaceTreeControl_GetItemState(pnstc, psidesktop, 0xffff, &itemstate); + ok(hr == S_OK, "Got (0x%08x)\n", hr); + ok(itemstate == NSTCIS_NONE, "itemstate is 0x%08x\n", itemstate); + ok_no_events(pnstceimpl); + + hr = INameSpaceTreeControl_SetItemState(pnstc, psidesktop, 0xffff, 0xffff); + ok(hr == S_OK, "Got (0x%08x)\n", hr); + process_msgs(); + ok_no_events(pnstceimpl); + + itemstate = 0xDEADBEEF; + hr = INameSpaceTreeControl_GetItemState(pnstc, psidesktop, 0xffff, &itemstate); + ok(hr == S_OK, "Got (0x%08x)\n", hr); + todo_wine + { + ok(itemstate == (NSTCIS_EXPANDED | NSTCIS_BOLD | NSTCIS_DISABLED), + "itemstate is 0x%08x\n", itemstate); + } + ok_no_events(pnstceimpl); + + hr = INameSpaceTreeControl_SetItemState(pnstc, psidesktop, NSTCIS_SELECTED, NSTCIS_SELECTED); + ok(hr == S_OK, "Got (0x%08x)\n", hr); + process_msgs(); + ok_no_events(pnstceimpl); + + itemstate = 0xDEADBEEF; + hr = INameSpaceTreeControl_GetItemState(pnstc, psidesktop, 0xffff, &itemstate); + ok(hr == S_OK, "Got (0x%08x)\n", hr); + todo_wine + { + ok(itemstate == (NSTCIS_EXPANDED | NSTCIS_BOLD | NSTCIS_DISABLED), + "itemstate is 0x%08x\n", itemstate); + } + ok_no_events(pnstceimpl); + + hr = INameSpaceTreeControl_SetItemState(pnstc, psidesktop, + NSTCIS_SELECTED | NSTCIS_DISABLED, NSTCIS_SELECTED); + ok(hr == S_OK, "Got (0x%08x)\n", hr); + process_msgs(); + ok_no_events(pnstceimpl); + + itemstate = 0xDEADBEEF; + hr = INameSpaceTreeControl_GetItemState(pnstc, psidesktop, 0xffff, &itemstate); + ok(hr == S_OK, "Got (0x%08x)\n", hr); + ok(itemstate == (NSTCIS_BOLD | NSTCIS_EXPANDED), + "itemstate is 0x%08x\n", itemstate); + ok_no_events(pnstceimpl); + + hr = INameSpaceTreeControl_SetItemState(pnstc, psidesktop, NSTCIS_SELECTED, NSTCIS_SELECTED); + ok(hr == S_OK, "Got (0x%08x)\n", hr); + process_msgs(); + ok_no_events(pnstceimpl); + + itemstate = 0xDEADBEEF; + hr = INameSpaceTreeControl_GetItemState(pnstc, psidesktop, 0xffff, &itemstate); + ok(hr == S_OK, "Got (0x%08x)\n", hr); + ok(itemstate == (NSTCIS_BOLD | NSTCIS_EXPANDED), + "itemstate is 0x%08x\n", itemstate); + ok_no_events(pnstceimpl); + + hr = INameSpaceTreeControl_SetItemState(pnstc, psidesktop, 0xffff & ~NSTCIS_DISABLED, 0); + ok(hr == S_OK, "Got (0x%08x)\n", hr); + process_msgs(); + ok_no_events(pnstceimpl); + + itemstate = 0xDEADBEEF; + hr = INameSpaceTreeControl_GetItemState(pnstc, psidesktop, 0xffff, &itemstate); + ok(hr == S_OK, "Got (0x%08x)\n", hr); + ok(itemstate == (NSTCIS_BOLD), "itemstate is 0x%08x\n", itemstate); + ok_no_events(pnstceimpl); + + hr = INameSpaceTreeControl_RemoveAllRoots(pnstc); + ok(hr == S_OK, "Got (0x%08x)\n", hr); + ok_event_count(pnstceimpl, OnItemDeleted, 1); + ok_no_events(pnstceimpl); + + /* GetNextItem */ + hr = INameSpaceTreeControl_GetNextItem(pnstc, NULL, 0, NULL); + ok(hr == E_POINTER, "Got (0x%08x)\n", hr); + ok_no_events(pnstceimpl); + + hr = INameSpaceTreeControl_GetNextItem(pnstc, psidesktop, 0, NULL); + ok(hr == E_POINTER, "Got (0x%08x)\n", hr); + ok_no_events(pnstceimpl); + + hr = INameSpaceTreeControl_GetNextItem(pnstc, NULL, 0, &psi); + ok(hr == E_FAIL, "Got (0x%08x)\n", hr); + ok_no_events(pnstceimpl); + + hr = INameSpaceTreeControl_GetNextItem(pnstc, psidesktop, 0, &psi); + ok(hr == E_INVALIDARG, "Got (0x%08x)\n", hr); + ok_no_events(pnstceimpl); + + hr = INameSpaceTreeControl_AppendRoot(pnstc, psidesktop, SHCONTF_FOLDERS | SHCONTF_NONFOLDERS, 0, NULL); + ok(hr == S_OK, "Got (0x%08x)\n", hr); + process_msgs(); + ok_event_count_broken(pnstceimpl, OnItemAdded, 1, 0 /* Vista */); + ok_no_events(pnstceimpl); + + /* Get child from unexpanded and unfilled parent */ + psi = (void*)0xDEADBEEF; + hr = INameSpaceTreeControl_GetNextItem(pnstc, psidesktop, NSTCGNI_CHILD, &psi); + ok(hr == E_FAIL, "Got (0x%08x)\n", hr); + ok(psi == NULL, "psi is %p\n", psi); + process_msgs(); + ok_no_events(pnstceimpl); + + /* Expand and try again */ + hr = INameSpaceTreeControl_SetItemState(pnstc, psidesktop, NSTCIS_EXPANDED, 0xffff); + ok(hr == S_OK, "Got (0x%08x)\n", hr); + process_msgs(); + ok_event_count(pnstceimpl, OnBeforeExpand, 1); + ok_event_broken(pnstceimpl, OnItemAdded); /* Does not fire on Vista */ + ok_event_count(pnstceimpl, OnAfterExpand, 1); + todo_wine ok_event_count_broken(pnstceimpl, OnSelectionChanged, 1, 0 /*Vista */); + ok_no_events(pnstceimpl); + psi = (void*)0xDEADBEEF; + hr = INameSpaceTreeControl_GetNextItem(pnstc, psidesktop, NSTCGNI_CHILD, &psi); + ok(hr == S_OK, "Got (0x%08x)\n", hr); + ok((psi != NULL) && (psi != (void*)0xDEADBEEF), "psi is %p\n", psi); + process_msgs(); + ok_no_events(pnstceimpl); + if(SUCCEEDED(hr)) IShellItem_Release(psi); + + hr = INameSpaceTreeControl_RemoveAllRoots(pnstc); + ok(hr == S_OK, "Got (0x%08x)\n", hr); + ok_event_count(pnstceimpl, OnItemDeleted, 1); + ok_no_events(pnstceimpl); + + /* EnsureItemVisible */ + if(0) + { + /* Crashes on Windows 7 */ + hr = INameSpaceTreeControl_EnsureItemVisible(pnstc, NULL); + } + + hr = INameSpaceTreeControl_EnsureItemVisible(pnstc, psidesktop); + ok(hr == E_INVALIDARG || hr == E_FAIL, "Got (0x%08x)\n", hr); + ok_no_events(pnstceimpl); + + hr = pSHGetSpecialFolderLocation(NULL, CSIDL_DRIVES, &pidl_drives); + ok(hr == S_OK, "Got (0x%08x)\n", hr); + if(SUCCEEDED(hr)) + { + hr = pSHCreateShellItem(NULL, NULL, pidl_drives, &psi); + ok(hr == S_OK, "Got (0x%08x)\n", hr); + if(SUCCEEDED(hr)) + { + hr = INameSpaceTreeControl_AppendRoot(pnstc, psi, SHCONTF_FOLDERS | SHCONTF_NONFOLDERS, 0, NULL); + ok(hr == S_OK, "Got (0x%08x)\n", hr); + process_msgs(); + ok_event_count_broken(pnstceimpl, OnItemAdded, 1, 0 /* Vista */); + ok_no_events(pnstceimpl); + + hr = INameSpaceTreeControl_EnsureItemVisible(pnstc, psidesktop); + ok(hr == E_INVALIDARG, "Got (0x%08x)\n", hr); + ok_no_events(pnstceimpl); + + hr = INameSpaceTreeControl_EnsureItemVisible(pnstc, psi); + ok(hr == S_OK, "Got (0x%08x)\n", hr); + ok_no_events(pnstceimpl); + + hr = INameSpaceTreeControl_AppendRoot(pnstc, psidesktop, SHCONTF_FOLDERS | SHCONTF_NONFOLDERS, 0, NULL); + ok(hr == S_OK, "Got (0x%08x)\n", hr); + process_msgs(); + ok_event_count_broken(pnstceimpl, OnItemAdded, 1, 0 /* Vista */); + ok_no_events(pnstceimpl); + + hr = INameSpaceTreeControl_EnsureItemVisible(pnstc, psidesktop); + ok(hr == S_OK, "Got (0x%08x)\n", hr); + ok_no_events(pnstceimpl); + + hr = INameSpaceTreeControl_EnsureItemVisible(pnstc, psi); + ok(hr == S_OK, "Got (0x%08x)\n", hr); + ok_no_events(pnstceimpl); + + } + else + skip("Failed to create shellitem.\n"); + + ILFree(pidl_drives); + } + else + skip("Failed to get pidl for CSIDL_DRIVES.\n"); + + hr = INameSpaceTreeControl_RemoveAllRoots(pnstc); + ok(hr == S_OK, "Got (0x%08x)\n", hr); + ok_event_count(pnstceimpl, OnItemDeleted, 2); + ok_no_events(pnstceimpl); + + hr = INameSpaceTreeControl_QueryInterface(pnstc, &IID_IOleWindow, (void**)&pow); + ok(hr == S_OK, "Got 0x%08x\n", hr); + if(SUCCEEDED(hr)) + { + HWND hwnd_nstc; + hr = IOleWindow_GetWindow(pow, &hwnd_nstc); + ok(hr == S_OK, "Got 0x%08x\n", hr); + DestroyWindow(hwnd_nstc); + IOleWindow_Release(pow); + } + + hr = INameSpaceTreeControl_TreeUnadvise(pnstc, cookie2); + ok(hr == S_OK, "Got 0x%08x\n", hr); + + res = INameSpaceTreeControl_Release(pnstc); + ok(!res, "res was %d!\n", res); + + if(!res) + { + /* Freeing these prematurely causes a crash. */ + HeapFree(GetProcessHeap(), 0, pnstceimpl); + HeapFree(GetProcessHeap(), 0, pnstceimpl2); + } +} + +static void setup_window(void) +{ + WNDCLASSA wc; + static const char nstctest_wnd_name[] = "nstctest_wnd"; + + ZeroMemory(&wc, sizeof(WNDCLASSA)); + wc.lpfnWndProc = DefWindowProcA; + wc.lpszClassName = nstctest_wnd_name; + RegisterClassA(&wc); + hwnd = CreateWindowA(nstctest_wnd_name, NULL, WS_TABSTOP, + 0, 0, 200, 200, NULL, 0, 0, NULL); + ok(hwnd != NULL, "Failed to create window for test (lasterror: %d).\n", + GetLastError()); +} + +static void destroy_window(void) +{ + DestroyWindow(hwnd); +} + +START_TEST(nstc) +{ + OleInitialize(NULL); + setup_window(); + init_function_pointers(); + init_msg_sequences(sequences, NUM_MSG_SEQUENCES); + + if(test_initialization()) + { + test_basics(); + test_events(); + } + else + { + win_skip("No NamespaceTreeControl (or instantiation failed).\n"); + } + + destroy_window(); + OleUninitialize(); +} diff -Nru wine1.3-1.3.0/dlls/explorerframe/version.rc wine1.3-1.3.1/dlls/explorerframe/version.rc --- wine1.3-1.3.0/dlls/explorerframe/version.rc 1970-01-01 01:00:00.000000000 +0100 +++ wine1.3-1.3.1/dlls/explorerframe/version.rc 2010-08-20 18:23:50.000000000 +0100 @@ -0,0 +1,29 @@ +/* + * ExplorerFrame Version Resource + * + * Copyright 2010 David Hedberg + * + * 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 + */ + +#define WINE_OLESELFREGISTER +#define WINE_FILEDESCRIPTION_STR "Wine ExplorerFrame" +#define WINE_FILENAME_STR "explorerframe.dll" +#define WINE_FILEVERSION 6,1,7600,16385 +#define WINE_FILEVERSION_STR "6.1.7600.16385" +#define WINE_PRODUCTVERSION 6,1,7600,16385 +#define WINE_PRODUCTVERSION_STR "6.1.7600.16385" + +#include "wine/wine_common_ver.rc" diff -Nru wine1.3-1.3.0/dlls/gameux/factory.c wine1.3-1.3.1/dlls/gameux/factory.c --- wine1.3-1.3.0/dlls/gameux/factory.c 2010-07-30 18:43:56.000000000 +0100 +++ wine1.3-1.3.1/dlls/gameux/factory.c 2010-08-20 18:23:50.000000000 +0100 @@ -131,6 +131,7 @@ }; static gameuxcf gameexplorercf = { &gameuxcf_vtbl, GameExplorer_create }; +static gameuxcf gamestatisticscf = { &gameuxcf_vtbl, GameStatistics_create }; /*************************************************************** * gameux ClassFactory @@ -148,6 +149,10 @@ { cf = (IClassFactory*)&gameexplorercf.lpVtbl; } + else if( IsEqualCLSID( rclsid, &CLSID_GameStatistics )) + { + cf = (IClassFactory*) &gamestatisticscf.lpVtbl; + } if(!cf) return CLASS_E_CLASSNOTAVAILABLE; diff -Nru wine1.3-1.3.0/dlls/gameux/gameexplorer.c wine1.3-1.3.1/dlls/gameux/gameexplorer.c --- wine1.3-1.3.0/dlls/gameux/gameexplorer.c 2010-07-30 18:43:56.000000000 +0100 +++ wine1.3-1.3.1/dlls/gameux/gameexplorer.c 2010-08-20 18:23:50.000000000 +0100 @@ -31,12 +31,13 @@ WINE_DEFAULT_DEBUG_CHANNEL(gameux); /* - * IGameExplorer implementation + * GameExplorer implementation */ typedef struct _GameExplorerImpl { const struct IGameExplorerVtbl *lpGameExplorerVtbl; + const struct IGameExplorer2Vtbl *lpGameExplorer2Vtbl; LONG ref; } GameExplorerImpl; @@ -45,6 +46,21 @@ return (GameExplorerImpl*)((char*)iface - FIELD_OFFSET(GameExplorerImpl, lpGameExplorerVtbl)); } +static inline IGameExplorer* IGameExplorer_from_impl(GameExplorerImpl* This) +{ + return (struct IGameExplorer*)&This->lpGameExplorerVtbl; +} + +static inline GameExplorerImpl *impl_from_IGameExplorer2(IGameExplorer2 *iface) +{ + return (GameExplorerImpl*)((char*)iface - FIELD_OFFSET(GameExplorerImpl, lpGameExplorer2Vtbl)); +} + +static inline IGameExplorer2* IGameExplorer2_from_impl(GameExplorerImpl* This) +{ + return (struct IGameExplorer2*)&This->lpGameExplorer2Vtbl; +} + static HRESULT WINAPI GameExplorerImpl_QueryInterface( IGameExplorer *iface, REFIID riid, @@ -59,7 +75,11 @@ if(IsEqualGUID(riid, &IID_IUnknown) || IsEqualGUID(riid, &IID_IGameExplorer)) { - *ppvObject = iface; + *ppvObject = IGameExplorer_from_impl(This); + } + else if(IsEqualGUID(riid, &IID_IGameExplorer2)) + { + *ppvObject = IGameExplorer2_from_impl(This); } else { @@ -158,6 +178,68 @@ GameExplorerImpl_VerifyAccess }; + +static HRESULT WINAPI GameExplorer2Impl_QueryInterface( + IGameExplorer2 *iface, + REFIID riid, + void **ppvObject) +{ + GameExplorerImpl *This = impl_from_IGameExplorer2(iface); + return GameExplorerImpl_QueryInterface(IGameExplorer_from_impl(This), riid, ppvObject); +} + +static ULONG WINAPI GameExplorer2Impl_AddRef(IGameExplorer2 *iface) +{ + GameExplorerImpl *This = impl_from_IGameExplorer2(iface); + return GameExplorerImpl_AddRef(IGameExplorer_from_impl(This)); +} + +static ULONG WINAPI GameExplorer2Impl_Release(IGameExplorer2 *iface) +{ + GameExplorerImpl *This = impl_from_IGameExplorer2(iface); + return GameExplorerImpl_Release(IGameExplorer_from_impl(This)); +} + +static HRESULT WINAPI GameExplorer2Impl_CheckAccess( + IGameExplorer2 *iface, + LPCWSTR binaryGDFPath, + BOOL *pHasAccess) +{ + GameExplorerImpl *This = impl_from_IGameExplorer2(iface); + FIXME("stub (%p, %s, %p)\n", This, debugstr_w(binaryGDFPath), pHasAccess); + return E_NOTIMPL; +} + +static HRESULT WINAPI GameExplorer2Impl_InstallGame( + IGameExplorer2 *iface, + LPCWSTR binaryGDFPath, + LPCWSTR installDirectory, + GAME_INSTALL_SCOPE installScope) +{ + GameExplorerImpl *This = impl_from_IGameExplorer2(iface); + FIXME("stub (%p, %s, %s, 0x%x)\n", This, debugstr_w(binaryGDFPath), debugstr_w(installDirectory), installScope); + return E_NOTIMPL; +} + +static HRESULT WINAPI GameExplorer2Impl_UninstallGame( + IGameExplorer2 *iface, + LPCWSTR binaryGDFPath) +{ + GameExplorerImpl *This = impl_from_IGameExplorer2(iface); + FIXME("stub (%p, %s)\n", This, debugstr_w(binaryGDFPath)); + return E_NOTIMPL; +} + +static const struct IGameExplorer2Vtbl GameExplorer2ImplVtbl = +{ + GameExplorer2Impl_QueryInterface, + GameExplorer2Impl_AddRef, + GameExplorer2Impl_Release, + GameExplorer2Impl_InstallGame, + GameExplorer2Impl_UninstallGame, + GameExplorer2Impl_CheckAccess +}; + /* * Construction routine */ @@ -175,6 +257,7 @@ return E_OUTOFMEMORY; pGameExplorer->lpGameExplorerVtbl = &GameExplorerImplVtbl; + pGameExplorer->lpGameExplorer2Vtbl = &GameExplorer2ImplVtbl; pGameExplorer->ref = 1; *ppObj = (IUnknown*)(&pGameExplorer->lpGameExplorerVtbl); diff -Nru wine1.3-1.3.0/dlls/gameux/gamestatistics.c wine1.3-1.3.1/dlls/gameux/gamestatistics.c --- wine1.3-1.3.0/dlls/gameux/gamestatistics.c 1970-01-01 01:00:00.000000000 +0100 +++ wine1.3-1.3.1/dlls/gameux/gamestatistics.c 2010-08-20 18:23:50.000000000 +0100 @@ -0,0 +1,151 @@ +/* + * Gameux library coclass GameStatistics implementation + * + * Copyright (C) 2010 Mariusz Pluciński + * + * 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 + */ +#define COBJMACROS + +#include "config.h" + +#include "ole2.h" + +#include "gameux.h" +#include "gameux_private.h" + +#include "wine/debug.h" + +WINE_DEFAULT_DEBUG_CHANNEL(gameux); + +/* + * IGameStatisticsMgr implementation + */ + +typedef struct _GameStatisticsMgrImpl +{ + const struct IGameStatisticsMgrVtbl *lpVtbl; + LONG ref; +} GameStatisticsMgrImpl; + +static inline GameStatisticsMgrImpl *impl_from_IGameStatisticsMgr( IGameStatisticsMgr *iface ) +{ + return (GameStatisticsMgrImpl *)((char*)iface - FIELD_OFFSET(GameStatisticsMgrImpl, lpVtbl)); +} + + +static HRESULT WINAPI GameStatisticsMgrImpl_QueryInterface( + IGameStatisticsMgr *iface, + REFIID riid, + void **ppvObject) +{ + GameStatisticsMgrImpl *This = impl_from_IGameStatisticsMgr( iface ); + + TRACE("%p %s %p\n", This, debugstr_guid( riid ), ppvObject ); + + *ppvObject = NULL; + + if(IsEqualGUID(riid, &IID_IUnknown) || + IsEqualGUID(riid, &IID_IGameStatisticsMgr) ) + { + *ppvObject = iface; + } + else + { + FIXME("interface %s not implemented\n", debugstr_guid(riid)); + return E_NOINTERFACE; + } + + IGameStatisticsMgr_AddRef( iface ); + return S_OK; +} + +static ULONG WINAPI GameStatisticsMgrImpl_AddRef(IGameStatisticsMgr *iface) +{ + GameStatisticsMgrImpl *This = impl_from_IGameStatisticsMgr( iface ); + LONG ref; + + ref = InterlockedIncrement(&This->ref); + + TRACE("(%p): ref=%d\n", This, ref); + return ref; +} + +static ULONG WINAPI GameStatisticsMgrImpl_Release(IGameStatisticsMgr *iface) +{ + GameStatisticsMgrImpl *This = impl_from_IGameStatisticsMgr( iface ); + LONG ref; + + ref = InterlockedDecrement(&This->ref); + TRACE("(%p): ref=%d\n", This, ref); + + if ( ref == 0 ) + { + TRACE("freeing GameStatistics object\n"); + HeapFree( GetProcessHeap(), 0, This); + } + + return ref; +} + +static HRESULT STDMETHODCALLTYPE GameStatisticsMgrImpl_GetGameStatistics( + IGameStatisticsMgr* iface, + LPCWSTR GDFBinaryPath, + GAMESTATS_OPEN_TYPE openType, + GAMESTATS_OPEN_RESULT *pOpenResult, + IGameStatistics **ppiStats) +{ + FIXME("stub (%p, %s, 0x%x, %p, %p)\n", iface, debugstr_w(GDFBinaryPath), openType, pOpenResult, ppiStats); + return E_NOTIMPL; +} + +static HRESULT STDMETHODCALLTYPE GameStatisticsMgrImpl_RemoveGameStatistics( + IGameStatisticsMgr* iface, + LPCWSTR GDFBinaryPath) +{ + FIXME("stub (%p, %s)\n", iface, debugstr_w(GDFBinaryPath)); + return E_NOTIMPL; +} + +static const struct IGameStatisticsMgrVtbl GameStatisticsMgrImplVtbl = +{ + GameStatisticsMgrImpl_QueryInterface, + GameStatisticsMgrImpl_AddRef, + GameStatisticsMgrImpl_Release, + GameStatisticsMgrImpl_GetGameStatistics, + GameStatisticsMgrImpl_RemoveGameStatistics, +}; + +HRESULT GameStatistics_create( + IUnknown *pUnkOuter, + IUnknown **ppObj) +{ + GameStatisticsMgrImpl *pGameStatistics; + + TRACE("(%p, %p)\n", pUnkOuter, ppObj); + + pGameStatistics = HeapAlloc( GetProcessHeap(), 0, sizeof (*pGameStatistics) ); + + if( !pGameStatistics ) + return E_OUTOFMEMORY; + + pGameStatistics->lpVtbl = &GameStatisticsMgrImplVtbl; + pGameStatistics->ref = 1; + + *ppObj = (IUnknown*)(&pGameStatistics->lpVtbl); + + TRACE("returning iface %p\n", *ppObj); + return S_OK; +} diff -Nru wine1.3-1.3.0/dlls/gameux/gameux_private.h wine1.3-1.3.1/dlls/gameux/gameux_private.h --- wine1.3-1.3.0/dlls/gameux/gameux_private.h 2010-07-30 18:43:56.000000000 +0100 +++ wine1.3-1.3.1/dlls/gameux/gameux_private.h 2010-08-20 18:23:50.000000000 +0100 @@ -19,3 +19,4 @@ */ extern HRESULT GameExplorer_create(IUnknown* pUnkOuter, IUnknown **ppObj); +extern HRESULT GameStatistics_create(IUnknown* pUnkOuter, IUnknown **ppObj); diff -Nru wine1.3-1.3.0/dlls/gameux/main.c wine1.3-1.3.1/dlls/gameux/main.c --- wine1.3-1.3.0/dlls/gameux/main.c 2010-07-30 18:43:56.000000000 +0100 +++ wine1.3-1.3.1/dlls/gameux/main.c 2010-08-20 18:23:50.000000000 +0100 @@ -37,7 +37,6 @@ HRESULT WINAPI DllCanUnloadNow(void) { - FIXME("stub\n"); return S_FALSE; } diff -Nru wine1.3-1.3.0/dlls/gameux/Makefile.in wine1.3-1.3.1/dlls/gameux/Makefile.in --- wine1.3-1.3.0/dlls/gameux/Makefile.in 2010-07-30 18:43:56.000000000 +0100 +++ wine1.3-1.3.1/dlls/gameux/Makefile.in 2010-08-20 18:23:50.000000000 +0100 @@ -9,6 +9,7 @@ C_SRCS = \ factory.c \ gameexplorer.c \ + gamestatistics.c \ main.c \ regsvr.c diff -Nru wine1.3-1.3.0/dlls/gameux/regsvr.c wine1.3-1.3.1/dlls/gameux/regsvr.c --- wine1.3-1.3.0/dlls/gameux/regsvr.c 2010-07-30 18:43:56.000000000 +0100 +++ wine1.3-1.3.1/dlls/gameux/regsvr.c 2010-08-20 18:23:50.000000000 +0100 @@ -464,6 +464,15 @@ "gameux.GameExplorer.1", "1.0", }, + { + &CLSID_GameStatistics, + "GameStatistics Class", + NULL, + "gameux.dll", + "Apartment", + "gameux.GameStatistics.1", + "1,0", + }, { NULL } /* list terminator */ }; diff -Nru wine1.3-1.3.0/dlls/gameux/tests/gameexplorer.c wine1.3-1.3.1/dlls/gameux/tests/gameexplorer.c --- wine1.3-1.3.0/dlls/gameux/tests/gameexplorer.c 1970-01-01 01:00:00.000000000 +0100 +++ wine1.3-1.3.1/dlls/gameux/tests/gameexplorer.c 2010-08-20 18:23:50.000000000 +0100 @@ -0,0 +1,72 @@ +/* + * IGameExplorer and IGameExplorer2 tests + * + * Copyright (C) 2010 Mariusz Pluciński + * + * 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 + */ + +#define COBJMACROS + +#include "initguid.h" + +#include "windows.h" +#include "ole2.h" +#include "objsafe.h" +#include "objbase.h" +#include "gameux.h" + +#include "wine/test.h" + + +static void test_create( void ) +{ + HRESULT hr; + + IGameExplorer* ge = NULL; + IGameExplorer2* ge2 = NULL; + + /* interface available up from Vista */ + hr = CoCreateInstance( &CLSID_GameExplorer, NULL, CLSCTX_INPROC_SERVER, &IID_IGameExplorer, (LPVOID*)&ge); + if(ge) + { + ok(hr == S_OK, "IGameExplorer creating failed (result false)\n"); + IGameExplorer_Release(ge); + } + else + win_skip("IGameExplorer cannot be created\n"); + + /* interface available up from Win7 */ + hr = CoCreateInstance( &CLSID_GameExplorer, NULL, CLSCTX_INPROC_SERVER, &IID_IGameExplorer2, (LPVOID*)&ge2); + if(ge2) + { + ok( hr == S_OK, "IGameExplorer2 creating failed (result false)\n"); + IGameExplorer2_Release(ge2); + } + else + win_skip("IGameExplorer2 cannot be created\n"); +} + +START_TEST(gameexplorer) +{ + HRESULT r; + + r = CoInitialize( NULL ); + ok( r == S_OK, "failed to init COM\n"); + + test_create(); + + CoUninitialize(); +} diff -Nru wine1.3-1.3.0/dlls/gameux/tests/gamestatistics.c wine1.3-1.3.1/dlls/gameux/tests/gamestatistics.c --- wine1.3-1.3.0/dlls/gameux/tests/gamestatistics.c 1970-01-01 01:00:00.000000000 +0100 +++ wine1.3-1.3.1/dlls/gameux/tests/gamestatistics.c 2010-08-20 18:23:50.000000000 +0100 @@ -0,0 +1,53 @@ +/* + * IGameStatisticsMgr tests + * + * Copyright (C) 2010 Mariusz Pluciński + * + * 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 + */ + +#define COBJMACROS + +#include "gameux.h" +#include "wine/test.h" + +static void test_create( void ) +{ + HRESULT hr; + + IGameStatisticsMgr* gsm = NULL; + + /* interface available up from Win7 */ + hr = CoCreateInstance( &CLSID_GameStatistics, NULL, CLSCTX_INPROC_SERVER, &IID_IGameStatisticsMgr, (LPVOID*)&gsm); + if(gsm) + { + ok( hr == S_OK, "IGameStatisticsMgr creating failed (result: 0x%08x)\n", hr); + IGameStatisticsMgr_Release(gsm); + } + else + win_skip("IGameStatisticsMgr cannot be created\n"); +} + +START_TEST(gamestatistics) +{ + HRESULT hr; + + hr = CoInitialize( NULL ); + ok( hr == S_OK, "failed to init COM\n"); + + test_create(); + + CoUninitialize(); +} diff -Nru wine1.3-1.3.0/dlls/gameux/tests/Makefile.in wine1.3-1.3.1/dlls/gameux/tests/Makefile.in --- wine1.3-1.3.0/dlls/gameux/tests/Makefile.in 1970-01-01 01:00:00.000000000 +0100 +++ wine1.3-1.3.1/dlls/gameux/tests/Makefile.in 2010-08-20 18:23:50.000000000 +0100 @@ -0,0 +1,13 @@ +TOPSRCDIR = @top_srcdir@ +TOPOBJDIR = ../../.. +SRCDIR = @srcdir@ +VPATH = @srcdir@ +TESTDLL = gameux.dll +IMPORTS = ole32 + +C_SRCS = \ + gameexplorer.c \ + gamestatistics.c + + +@MAKE_TEST_RULES@ diff -Nru wine1.3-1.3.0/dlls/gdi32/dc.c wine1.3-1.3.1/dlls/gdi32/dc.c --- wine1.3-1.3.0/dlls/gdi32/dc.c 2010-07-30 18:43:56.000000000 +0100 +++ wine1.3-1.3.1/dlls/gdi32/dc.c 2010-08-20 18:23:50.000000000 +0100 @@ -1445,7 +1445,7 @@ else if (flags & DCHF_VALIDATEVISRGN || !flags) ret = InterlockedExchange( &dc->dirty, 0 ); - GDI_ReleaseObj( dc ); + GDI_ReleaseObj( hdc ); return ret; } diff -Nru wine1.3-1.3.0/dlls/gdi32/enhmfdrv/init.c wine1.3-1.3.1/dlls/gdi32/enhmfdrv/init.c --- wine1.3-1.3.0/dlls/gdi32/enhmfdrv/init.c 2010-07-30 18:43:56.000000000 +0100 +++ wine1.3-1.3.1/dlls/gdi32/enhmfdrv/init.c 2010-08-20 18:23:50.000000000 +0100 @@ -285,10 +285,8 @@ hReturnDC = CreateEnhMetaFileW(hdc, filenameW, rect, descriptionW); - if(filenameW) - HeapFree( GetProcessHeap(), 0, filenameW ); - if(descriptionW) - HeapFree( GetProcessHeap(), 0, descriptionW ); + HeapFree( GetProcessHeap(), 0, filenameW ); + HeapFree( GetProcessHeap(), 0, descriptionW ); return hReturnDC; } diff -Nru wine1.3-1.3.0/dlls/gdi32/font.c wine1.3-1.3.1/dlls/gdi32/font.c --- wine1.3-1.3.0/dlls/gdi32/font.c 2010-07-30 18:43:56.000000000 +0100 +++ wine1.3-1.3.1/dlls/gdi32/font.c 2010-08-20 18:23:50.000000000 +0100 @@ -33,6 +33,7 @@ #include "winnls.h" #include "wownt32.h" #include "gdi_private.h" +#include "wine/exception.h" #include "wine/unicode.h" #include "wine/debug.h" @@ -3184,7 +3185,31 @@ */ HANDLE WINAPI AddFontMemResourceEx( PVOID pbFont, DWORD cbFont, PVOID pdv, DWORD *pcFonts) { - return WineEngAddFontMemResourceEx(pbFont, cbFont, pdv, pcFonts); + HANDLE ret; + DWORD num_fonts; + + if (!pbFont || !cbFont || !pcFonts) + { + SetLastError(ERROR_INVALID_PARAMETER); + return NULL; + } + + ret = WineEngAddFontMemResourceEx(pbFont, cbFont, pdv, &num_fonts); + if (ret) + { + __TRY + { + *pcFonts = num_fonts; + } + __EXCEPT_PAGE_FAULT + { + WARN("page fault while writing to *pcFonts (%p)\n", pcFonts); + RemoveFontMemResourceEx(ret); + ret = 0; + } + __ENDTRY + } + return ret; } /*********************************************************************** diff -Nru wine1.3-1.3.0/dlls/gdi32/freetype.c wine1.3-1.3.1/dlls/gdi32/freetype.c --- wine1.3-1.3.0/dlls/gdi32/freetype.c 2010-07-30 18:43:56.000000000 +0100 +++ wine1.3-1.3.1/dlls/gdi32/freetype.c 2010-08-20 18:23:50.000000000 +0100 @@ -2151,7 +2151,7 @@ { TRACE("AddFontToList failed\n"); HeapFree(GetProcessHeap(), 0, pFontCopy); - return NULL; + return 0; } /* FIXME: is the handle only for use in RemoveFontMemResourceEx or should it be a true handle? * For now return something unique but quite random diff -Nru wine1.3-1.3.0/dlls/gdi32/gdiobj.c wine1.3-1.3.1/dlls/gdi32/gdiobj.c --- wine1.3-1.3.0/dlls/gdi32/gdiobj.c 2010-07-30 18:43:56.000000000 +0100 +++ wine1.3-1.3.1/dlls/gdi32/gdiobj.c 2010-08-20 18:23:50.000000000 +0100 @@ -973,7 +973,12 @@ GDI_ReleaseObj( handle ); if (funcs && funcs->pGetObjectA) - result = funcs->pGetObjectA( handle, count, buffer ); + { + if (buffer && ((ULONG_PTR)buffer >> 16) == 0) /* catch apps getting argument order wrong */ + SetLastError( ERROR_NOACCESS ); + else + result = funcs->pGetObjectA( handle, count, buffer ); + } else SetLastError( ERROR_INVALID_HANDLE ); @@ -995,7 +1000,12 @@ GDI_ReleaseObj( handle ); if (funcs && funcs->pGetObjectW) - result = funcs->pGetObjectW( handle, count, buffer ); + { + if (buffer && ((ULONG_PTR)buffer >> 16) == 0) /* catch apps getting argument order wrong */ + SetLastError( ERROR_NOACCESS ); + else + result = funcs->pGetObjectW( handle, count, buffer ); + } else SetLastError( ERROR_INVALID_HANDLE ); diff -Nru wine1.3-1.3.0/dlls/gdi32/tests/font.c wine1.3-1.3.1/dlls/gdi32/tests/font.c --- wine1.3-1.3.0/dlls/gdi32/tests/font.c 2010-07-30 18:43:56.000000000 +0100 +++ wine1.3-1.3.1/dlls/gdi32/tests/font.c 2010-08-20 18:23:50.000000000 +0100 @@ -44,6 +44,8 @@ DWORD (WINAPI *pGetGlyphIndicesW)(HDC hdc, LPCWSTR lpstr, INT count, LPWORD pgi, DWORD flags); BOOL (WINAPI *pGdiRealizationInfo)(HDC hdc, DWORD *); HFONT (WINAPI *pCreateFontIndirectExA)(const ENUMLOGFONTEXDV *); +HANDLE (WINAPI *pAddFontMemResourceEx)(PVOID, DWORD, PVOID, DWORD *); +BOOL (WINAPI *pRemoveFontMemResourceEx)(HANDLE); static HMODULE hgdi32 = 0; @@ -59,6 +61,8 @@ pGetGlyphIndicesW = (void *)GetProcAddress(hgdi32, "GetGlyphIndicesW"); pGdiRealizationInfo = (void *)GetProcAddress(hgdi32, "GdiRealizationInfo"); pCreateFontIndirectExA = (void *)GetProcAddress(hgdi32, "CreateFontIndirectExA"); + pAddFontMemResourceEx = (void *)GetProcAddress(hgdi32, "AddFontMemResourceEx"); + pRemoveFontMemResourceEx = (void *)GetProcAddress(hgdi32, "RemoveFontMemResourceEx"); } static INT CALLBACK is_truetype_font_installed_proc(const LOGFONT *elf, const TEXTMETRIC *ntm, DWORD type, LPARAM lParam) @@ -3142,6 +3146,162 @@ DeleteObject(hfont); } +static void free_font(void *font) +{ + UnmapViewOfFile(font); +} + +static void *load_font(const char *font_name, DWORD *font_size) +{ + char file_name[MAX_PATH]; + HANDLE file, mapping; + void *font; + + if (!GetWindowsDirectory(file_name, sizeof(file_name))) return NULL; + strcat(file_name, "\\fonts\\"); + strcat(file_name, font_name); + + file = CreateFile(file_name, GENERIC_READ, 0, NULL, OPEN_EXISTING, 0, 0); + if (file == INVALID_HANDLE_VALUE) return NULL; + + *font_size = GetFileSize(file, NULL); + + mapping = CreateFileMapping(file, NULL, PAGE_READONLY, 0, 0, NULL); + if (!mapping) + { + CloseHandle(file); + return NULL; + } + + font = MapViewOfFile(mapping, FILE_MAP_READ, 0, 0, 0); + + CloseHandle(file); + CloseHandle(mapping); + return font; +} + +static void test_AddFontMemResource(void) +{ + void *font; + DWORD font_size, num_fonts; + HANDLE ret; + DEVMODEA dmA; + BOOL is_winxp; + + if (!pAddFontMemResourceEx || !pRemoveFontMemResourceEx) + { + win_skip("AddFontMemResourceEx is not available on this platform\n"); + return; + } + + font = load_font("sserife.fon", &font_size); + if (!font) + { + skip("Unable to locate and load font sserife.fon\n"); + return; + } + + is_winxp = EnumDisplaySettingsA(NULL, ENUM_CURRENT_SETTINGS, &dmA) && + (dmA.dmFields & DM_DISPLAYORIENTATION); + + if (is_winxp) + { + SetLastError(0xdeadbeef); + ret = pAddFontMemResourceEx(NULL, 0, NULL, NULL); + ok(!ret, "AddFontMemResourceEx should fail\n"); + ok(GetLastError() == ERROR_INVALID_PARAMETER, + "Expected GetLastError() to return ERROR_INVALID_PARAMETER, got %u\n", + GetLastError()); + + SetLastError(0xdeadbeef); + ret = pAddFontMemResourceEx(NULL, 10, NULL, NULL); + ok(!ret, "AddFontMemResourceEx should fail\n"); + ok(GetLastError() == ERROR_INVALID_PARAMETER, + "Expected GetLastError() to return ERROR_INVALID_PARAMETER, got %u\n", + GetLastError()); + + SetLastError(0xdeadbeef); + ret = pAddFontMemResourceEx(NULL, 0, NULL, &num_fonts); + ok(!ret, "AddFontMemResourceEx should fail\n"); + ok(GetLastError() == ERROR_INVALID_PARAMETER, + "Expected GetLastError() to return ERROR_INVALID_PARAMETER, got %u\n", + GetLastError()); + + SetLastError(0xdeadbeef); + ret = pAddFontMemResourceEx(NULL, 10, NULL, &num_fonts); + ok(!ret, "AddFontMemResourceEx should fail\n"); + ok(GetLastError() == ERROR_INVALID_PARAMETER, + "Expected GetLastError() to return ERROR_INVALID_PARAMETER, got %u\n", + GetLastError()); + + SetLastError(0xdeadbeef); + ret = pAddFontMemResourceEx(font, 0, NULL, NULL); + ok(!ret, "AddFontMemResourceEx should fail\n"); + ok(GetLastError() == ERROR_INVALID_PARAMETER, + "Expected GetLastError() to return ERROR_INVALID_PARAMETER, got %u\n", + GetLastError()); + + SetLastError(0xdeadbeef); + ret = pAddFontMemResourceEx(font, 10, NULL, NULL); + ok(!ret, "AddFontMemResourceEx should fail\n"); + ok(GetLastError() == ERROR_INVALID_PARAMETER, + "Expected GetLastError() to return ERROR_INVALID_PARAMETER, got %u\n", + GetLastError()); + + num_fonts = 0xdeadbeef; + SetLastError(0xdeadbeef); + ret = pAddFontMemResourceEx(font, 0, NULL, &num_fonts); + ok(!ret, "AddFontMemResourceEx should fail\n"); + ok(GetLastError() == ERROR_INVALID_PARAMETER, + "Expected GetLastError() to return ERROR_INVALID_PARAMETER, got %u\n", + GetLastError()); + ok(num_fonts == 0xdeadbeef, "number of loaded fonts should be 0xdeadbeef\n"); + + num_fonts = 0xdeadbeef; + SetLastError(0xdeadbeef); + ret = pAddFontMemResourceEx(font, 10, NULL, &num_fonts); + ok(!ret, "AddFontMemResourceEx should fail\n"); + ok(GetLastError() == 0xdeadbeef, + "Expected GetLastError() to return 0xdeadbeef, got %u\n", + GetLastError()); + ok(num_fonts == 0xdeadbeef, "number of loaded fonts should be 0xdeadbeef\n"); + } + else + win_skip("AddFontMemResourceEx invalid parameter tests are problematic on Win2k\n"); + + num_fonts = 0xdeadbeef; + SetLastError(0xdeadbeef); + ret = pAddFontMemResourceEx(font, font_size, NULL, &num_fonts); + ok(ret != 0, "AddFontMemResourceEx error %d\n", GetLastError()); + ok(num_fonts != 0xdeadbeef, "number of loaded fonts should not be 0xdeadbeef\n"); + ok(num_fonts != 0, "number of loaded fonts should not be 0\n"); + + free_font(font); + + SetLastError(0xdeadbeef); + ok(pRemoveFontMemResourceEx(ret), "RemoveFontMemResourceEx error %d\n", GetLastError()); + + /* test invalid pointer to number of loaded fonts */ + font = load_font("sserife.fon", &font_size); + ok(font != NULL, "Unable to locate and load font sserife.fon\n"); + + SetLastError(0xdeadbeef); + ret = pAddFontMemResourceEx(font, font_size, NULL, (void *)0xdeadbeef); + ok(!ret, "AddFontMemResourceEx should fail\n"); + ok(GetLastError() == 0xdeadbeef, + "Expected GetLastError() to return 0xdeadbeef, got %u\n", + GetLastError()); + + SetLastError(0xdeadbeef); + ret = pAddFontMemResourceEx(font, font_size, NULL, NULL); + ok(!ret, "AddFontMemResourceEx should fail\n"); + ok(GetLastError() == ERROR_INVALID_PARAMETER, + "Expected GetLastError() to return ERROR_INVALID_PARAMETER, got %u\n", + GetLastError()); + + free_font(font); +} + START_TEST(font) { init(); @@ -3162,6 +3322,7 @@ test_nonexistent_font(); test_orientation(); test_height_selection(); + test_AddFontMemResource(); /* On Windows Arial has a lot of default charset aliases such as Arial Cyr, * I'd like to avoid them in this test. diff -Nru wine1.3-1.3.0/dlls/gdi32/tests/gdiobj.c wine1.3-1.3.1/dlls/gdi32/tests/gdiobj.c --- wine1.3-1.3.0/dlls/gdi32/tests/gdiobj.c 2010-07-30 18:43:56.000000000 +0100 +++ wine1.3-1.3.1/dlls/gdi32/tests/gdiobj.c 2010-08-20 18:23:50.000000000 +0100 @@ -81,6 +81,14 @@ "GetObject(NULL obj), expected 0, NO_ERROR, got %d, %u\n", i, GetLastError()); + /* GetObject expects ERROR_NOACCESS when passed an invalid buffer */ + hp = SelectObject(hdc, GetStockObject(BLACK_PEN)); + SetLastError(0); + i = GetObjectA(hp, (INT_PTR)buff, (LPVOID)sizeof(buff)); + ok (!i && GetLastError() == ERROR_NOACCESS, + "GetObject(invalid buff), expected 0, ERROR_NOACCESS, got %d, %u\n", + i, GetLastError()); + /* GetObjectType does SetLastError() on a null object */ SetLastError(0); i = GetObjectType(NULL); diff -Nru wine1.3-1.3.0/dlls/gdiplus/brush.c wine1.3-1.3.1/dlls/gdiplus/brush.c --- wine1.3-1.3.0/dlls/gdiplus/brush.c 2010-07-30 18:43:56.000000000 +0100 +++ wine1.3-1.3.1/dlls/gdiplus/brush.c 2010-08-20 18:23:50.000000000 +0100 @@ -1467,6 +1467,19 @@ return NotImplemented; } +GpStatus WINGDIPAPI GdipSetPathGradientLinearBlend(GpPathGradient *brush, + REAL focus, REAL scale) +{ + static int calls; + + TRACE("(%p,%0.2f,%0.2f)\n", brush, focus, scale); + + if(!(calls++)) + FIXME("not implemented\n"); + + return NotImplemented; +} + GpStatus WINGDIPAPI GdipSetPathGradientPresetBlend(GpPathGradient *brush, GDIPCONST ARGB *blend, GDIPCONST REAL *pos, INT count) { @@ -1474,6 +1487,13 @@ return NotImplemented; } +GpStatus WINGDIPAPI GdipGetPathGradientPresetBlendCount(GpPathGradient *brush, + INT *count) +{ + FIXME("(%p,%p): stub\n", brush, count); + return NotImplemented; +} + GpStatus WINGDIPAPI GdipSetPathGradientCenterColor(GpPathGradient *grad, ARGB argb) { @@ -1594,6 +1614,71 @@ return Ok; } +GpStatus WINGDIPAPI GdipSetPathGradientTransform(GpPathGradient *grad, + GpMatrix *matrix) +{ + static int calls; + + TRACE("(%p,%p)\n", grad, matrix); + + if(!(calls++)) + FIXME("not implemented\n"); + + return NotImplemented; +} + +GpStatus WINGDIPAPI GdipGetPathGradientTransform(GpPathGradient *grad, + GpMatrix *matrix) +{ + static int calls; + + TRACE("(%p,%p)\n", grad, matrix); + + if(!(calls++)) + FIXME("not implemented\n"); + + return NotImplemented; +} + +GpStatus WINGDIPAPI GdipMultiplyPathGradientTransform(GpPathGradient *grad, + GDIPCONST GpMatrix *matrix, GpMatrixOrder order) +{ + static int calls; + + TRACE("(%p,%p,%i)\n", grad, matrix, order); + + if(!(calls++)) + FIXME("not implemented\n"); + + return NotImplemented; +} + +GpStatus WINGDIPAPI GdipRotatePathGradientTransform(GpPathGradient *grad, + REAL angle, GpMatrixOrder order) +{ + static int calls; + + TRACE("(%p,%0.2f,%i)\n", grad, angle, order); + + if(!(calls++)) + FIXME("not implemented\n"); + + return NotImplemented; +} + +GpStatus WINGDIPAPI GdipScalePathGradientTransform(GpPathGradient *grad, + REAL sx, REAL sy, GpMatrixOrder order) +{ + static int calls; + + TRACE("(%p,%0.2f,%0.2f,%i)\n", grad, sx, sy, order); + + if(!(calls++)) + FIXME("not implemented\n"); + + return NotImplemented; +} + GpStatus WINGDIPAPI GdipSetSolidFillColor(GpSolidFill *sf, ARGB argb) { TRACE("(%p, %x)\n", sf, argb); diff -Nru wine1.3-1.3.0/dlls/gdiplus/gdiplus.c wine1.3-1.3.1/dlls/gdiplus/gdiplus.c --- wine1.3-1.3.0/dlls/gdiplus/gdiplus.c 2010-07-30 18:43:56.000000000 +0100 +++ wine1.3-1.3.1/dlls/gdiplus/gdiplus.c 2010-08-20 18:23:50.000000000 +0100 @@ -314,18 +314,18 @@ } /* converts a given unit to its value in pixels */ -REAL convert_unit(HDC hdc, GpUnit unit) +REAL convert_unit(REAL logpixels, GpUnit unit) { switch(unit) { case UnitInch: - return (REAL) GetDeviceCaps(hdc, LOGPIXELSX); + return logpixels; case UnitPoint: - return ((REAL)GetDeviceCaps(hdc, LOGPIXELSX)) / 72.0; + return logpixels / 72.0; case UnitDocument: - return ((REAL)GetDeviceCaps(hdc, LOGPIXELSX)) / 300.0; + return logpixels / 300.0; case UnitMillimeter: - return ((REAL)GetDeviceCaps(hdc, LOGPIXELSX)) / 25.4; + return logpixels / 25.4; case UnitWorld: ERR("cannot convert UnitWorld\n"); return 0.0; diff -Nru wine1.3-1.3.0/dlls/gdiplus/gdiplus_private.h wine1.3-1.3.1/dlls/gdiplus/gdiplus_private.h --- wine1.3-1.3.0/dlls/gdiplus/gdiplus_private.h 2010-07-30 18:43:56.000000000 +0100 +++ wine1.3-1.3.1/dlls/gdiplus/gdiplus_private.h 2010-08-20 18:23:50.000000000 +0100 @@ -47,7 +47,9 @@ REAL startAngle, REAL sweepAngle); extern REAL gdiplus_atan2(REAL dy, REAL dx); extern GpStatus hresult_to_status(HRESULT res); -extern REAL convert_unit(HDC hdc, GpUnit unit); +extern REAL convert_unit(REAL logpixels, GpUnit unit); + +extern GpStatus graphics_from_image(GpImage *image, GpGraphics **graphics); extern void calc_curve_bezier(CONST GpPointF *pts, REAL tension, REAL *x1, REAL *y1, REAL *x2, REAL *y2); @@ -150,6 +152,12 @@ UINT textcontrast; /* not used yet. get/set only */ struct list containers; GraphicsContainer contid; /* last-issued container ID */ + /* For giving the caller an HDC when we technically can't: */ + HBITMAP temp_hbitmap; + int temp_hbitmap_width; + int temp_hbitmap_height; + BYTE *temp_bits; + HDC temp_hdc; }; struct GpBrush{ @@ -269,6 +277,7 @@ HDC hdc; BYTE *bits; /* actual image bits if this is a DIB */ INT stride; /* stride of bits if this is a DIB */ + BYTE *own_bits; /* image bits that need to be freed with this object */ }; struct GpCachedBitmap{ diff -Nru wine1.3-1.3.0/dlls/gdiplus/gdiplus.spec wine1.3-1.3.1/dlls/gdiplus/gdiplus.spec --- wine1.3-1.3.0/dlls/gdiplus/gdiplus.spec 2010-07-30 18:43:56.000000000 +0100 +++ wine1.3-1.3.1/dlls/gdiplus/gdiplus.spec 2010-08-20 18:23:50.000000000 +0100 @@ -335,12 +335,12 @@ @ stub GdipGetPathGradientPath @ stdcall GdipGetPathGradientPointCount(ptr ptr) @ stub GdipGetPathGradientPresetBlend -@ stub GdipGetPathGradientPresetBlendCount +@ stdcall GdipGetPathGradientPresetBlendCount(ptr ptr) @ stdcall GdipGetPathGradientRect(ptr ptr) @ stdcall GdipGetPathGradientRectI(ptr ptr) @ stdcall GdipGetPathGradientSurroundColorCount(ptr ptr) @ stdcall GdipGetPathGradientSurroundColorsWithCount(ptr ptr ptr) -@ stub GdipGetPathGradientTransform +@ stdcall GdipGetPathGradientTransform(ptr ptr) @ stdcall GdipGetPathGradientWrapMode(ptr ptr) @ stdcall GdipGetPathLastPoint(ptr ptr) @ stdcall GdipGetPathPoints(ptr ptr long) @@ -365,7 +365,7 @@ @ stdcall GdipGetPenMiterLimit(ptr ptr) @ stdcall GdipGetPenMode(ptr ptr) @ stdcall GdipGetPenStartCap(ptr ptr) -@ stub GdipGetPenTransform +@ stdcall GdipGetPenTransform(ptr ptr) @ stdcall GdipGetPenUnit(ptr ptr) @ stdcall GdipGetPenWidth(ptr ptr) @ stdcall GdipGetPixelOffsetMode(ptr ptr) @@ -444,7 +444,7 @@ @ stdcall GdipMeasureString(ptr wstr long ptr ptr ptr ptr ptr ptr) @ stdcall GdipMultiplyLineTransform(ptr ptr long) @ stdcall GdipMultiplyMatrix(ptr ptr long) -@ stub GdipMultiplyPathGradientTransform +@ stdcall GdipMultiplyPathGradientTransform(ptr ptr long) @ stdcall GdipMultiplyPenTransform(ptr ptr long) @ stdcall GdipMultiplyTextureTransform(ptr ptr long) @ stdcall GdipMultiplyWorldTransform(ptr ptr long) @@ -487,8 +487,8 @@ @ stdcall GdipReversePath(ptr) @ stdcall GdipRotateLineTransform(ptr long long) @ stdcall GdipRotateMatrix(ptr long long) -@ stub GdipRotatePathGradientTransform -@ stub GdipRotatePenTransform +@ stdcall GdipRotatePathGradientTransform(ptr long long) +@ stdcall GdipRotatePenTransform(ptr long long) @ stdcall GdipRotateTextureTransform(ptr long long) @ stdcall GdipRotateWorldTransform(ptr long long) @ stub GdipSaveAdd @@ -498,7 +498,7 @@ @ stdcall GdipSaveImageToStream(ptr ptr ptr ptr) @ stdcall GdipScaleLineTransform(ptr long long long) @ stdcall GdipScaleMatrix(ptr long long long) -@ stub GdipScalePathGradientTransform +@ stdcall GdipScalePathGradientTransform(ptr long long long) @ stdcall GdipScalePenTransform(ptr long long long) @ stdcall GdipScaleTextureTransform(ptr long long long) @ stdcall GdipScaleWorldTransform(ptr long long long) @@ -554,12 +554,12 @@ @ stdcall GdipSetPathGradientCenterPointI(ptr ptr) @ stdcall GdipSetPathGradientFocusScales(ptr long long) @ stdcall GdipSetPathGradientGammaCorrection(ptr long) -@ stub GdipSetPathGradientLinearBlend +@ stdcall GdipSetPathGradientLinearBlend(ptr long long) @ stub GdipSetPathGradientPath @ stdcall GdipSetPathGradientPresetBlend(ptr ptr ptr long) @ stdcall GdipSetPathGradientSigmaBlend(ptr long long) @ stdcall GdipSetPathGradientSurroundColorsWithCount(ptr ptr ptr) -@ stub GdipSetPathGradientTransform +@ stdcall GdipSetPathGradientTransform(ptr ptr) @ stdcall GdipSetPathGradientWrapMode(ptr long) @ stdcall GdipSetPathMarker(ptr) @ stdcall GdipSetPenBrushFill(ptr ptr) @@ -577,7 +577,7 @@ @ stdcall GdipSetPenMiterLimit(ptr long) @ stdcall GdipSetPenMode(ptr long) @ stdcall GdipSetPenStartCap(ptr long) -@ stub GdipSetPenTransform +@ stdcall GdipSetPenTransform(ptr ptr) @ stub GdipSetPenUnit @ stdcall GdipSetPenWidth(ptr long) @ stdcall GdipSetPixelOffsetMode(ptr long) diff -Nru wine1.3-1.3.0/dlls/gdiplus/graphics.c wine1.3-1.3.1/dlls/gdiplus/graphics.c --- wine1.3-1.3.0/dlls/gdiplus/graphics.c 2010-07-30 18:43:56.000000000 +0100 +++ wine1.3-1.3.1/dlls/gdiplus/graphics.c 2010-08-20 18:23:50.000000000 +0100 @@ -84,14 +84,27 @@ return ret; } +static REAL graphics_res(GpGraphics *graphics) +{ + if (graphics->image) return graphics->image->xres; + else return (REAL)GetDeviceCaps(graphics->hdc, LOGPIXELSX); +} + static INT prepare_dc(GpGraphics *graphics, GpPen *pen) { HPEN gdipen; REAL width; - INT save_state = SaveDC(graphics->hdc), i, numdashes; + INT save_state, i, numdashes; GpPointF pt[2]; DWORD dash_array[MAX_DASHLEN]; + if (!graphics->hdc) + { + FIXME("graphics object has no HDC\n"); + } + + save_state = SaveDC(graphics->hdc); + EndPath(graphics->hdc); if(pen->unit == UnitPixel){ @@ -108,7 +121,7 @@ width = sqrt((pt[1].X - pt[0].X) * (pt[1].X - pt[0].X) + (pt[1].Y - pt[0].Y) * (pt[1].Y - pt[0].Y)) / sqrt(2.0); - width *= pen->width * convert_unit(graphics->hdc, + width *= pen->width * convert_unit(graphics_res(graphics), pen->unit == UnitWorld ? graphics->unit : pen->unit); } @@ -156,7 +169,7 @@ GpMatrix *matrix; int i; - unitscale = convert_unit(graphics->hdc, graphics->unit); + unitscale = convert_unit(graphics_res(graphics), graphics->unit); /* apply page scale */ if(graphics->unit != UnitDisplay) @@ -1131,6 +1144,8 @@ static GpStatus get_graphics_bounds(GpGraphics* graphics, GpRectF* rect) { RECT wnd_rect; + GpStatus stat=Ok; + GpUnit unit; if(graphics->hwnd) { if(!GetClientRect(graphics->hwnd, &wnd_rect)) @@ -1140,6 +1155,10 @@ rect->Y = wnd_rect.top; rect->Width = wnd_rect.right - wnd_rect.left; rect->Height = wnd_rect.bottom - wnd_rect.top; + }else if (graphics->image){ + stat = GdipGetImageBounds(graphics->image, rect, &unit); + if (stat == Ok && unit != UnitPixel) + FIXME("need to convert from unit %i\n", unit); }else{ rect->X = 0; rect->Y = 0; @@ -1147,7 +1166,7 @@ rect->Height = GetDeviceCaps(graphics->hdc, VERTRES); } - return Ok; + return stat; } /* on success, rgn will contain the region of the graphics object which @@ -1235,6 +1254,45 @@ return Ok; } +GpStatus graphics_from_image(GpImage *image, GpGraphics **graphics) +{ + GpStatus retval; + + *graphics = GdipAlloc(sizeof(GpGraphics)); + if(!*graphics) return OutOfMemory; + + if((retval = GdipCreateMatrix(&(*graphics)->worldtrans)) != Ok){ + GdipFree(*graphics); + return retval; + } + + if((retval = GdipCreateRegion(&(*graphics)->clip)) != Ok){ + GdipFree((*graphics)->worldtrans); + GdipFree(*graphics); + return retval; + } + + (*graphics)->hdc = NULL; + (*graphics)->hwnd = NULL; + (*graphics)->owndc = FALSE; + (*graphics)->image = image; + (*graphics)->smoothing = SmoothingModeDefault; + (*graphics)->compqual = CompositingQualityDefault; + (*graphics)->interpolation = InterpolationModeDefault; + (*graphics)->pixeloffset = PixelOffsetModeDefault; + (*graphics)->compmode = CompositingModeSourceOver; + (*graphics)->unit = UnitDisplay; + (*graphics)->scale = 1.0; + (*graphics)->busy = FALSE; + (*graphics)->textcontrast = 4; + list_init(&(*graphics)->containers); + (*graphics)->contid = 0; + + TRACE("<-- %p\n", *graphics); + + return Ok; +} + GpStatus WINGDIPAPI GdipCreateFromHWND(HWND hwnd, GpGraphics **graphics) { GpStatus ret; @@ -1961,6 +2019,11 @@ if (image->picture) { + if (!graphics->hdc) + { + FIXME("graphics object has no HDC\n"); + } + /* FIXME: partially implemented (only works for rectangular parallelograms) */ if(srcUnit == UnitInch) dx = dy = (REAL) INCH_HIMETRIC; @@ -1983,7 +2046,7 @@ return GenericError; } } - else if (image->type == ImageTypeBitmap && ((GpBitmap*)image)->hbitmap) + else if (image->type == ImageTypeBitmap) { GpBitmap* bitmap = (GpBitmap*)image; int use_software=0; @@ -1997,6 +2060,7 @@ if (imageAttributes || (graphics->image && graphics->image->type == ImageTypeBitmap) || + !((GpBitmap*)image)->hbitmap || ptf[1].Y != ptf[0].Y || ptf[2].X != ptf[0].X) use_software = 1; @@ -2760,6 +2824,12 @@ if(graphics->busy) return ObjectBusy; + if(!graphics->hdc) + { + FIXME("graphics object has no HDC\n"); + return Ok; + } + ptf[0].X = x; ptf[0].Y = y; ptf[1].X = x + width; @@ -2802,6 +2872,12 @@ if(graphics->busy) return ObjectBusy; + if(!graphics->hdc) + { + FIXME("graphics object has no HDC\n"); + return Ok; + } + save_state = SaveDC(graphics->hdc); EndPath(graphics->hdc); SetPolyFillMode(graphics->hdc, (path->fill == FillModeAlternate ? ALTERNATE @@ -2839,6 +2915,12 @@ if(graphics->busy) return ObjectBusy; + if(!graphics->hdc) + { + FIXME("graphics object has no HDC\n"); + return Ok; + } + save_state = SaveDC(graphics->hdc); EndPath(graphics->hdc); @@ -2878,6 +2960,12 @@ if(graphics->busy) return ObjectBusy; + if(!graphics->hdc) + { + FIXME("graphics object has no HDC\n"); + return Ok; + } + ptf = GdipAlloc(count * sizeof(GpPointF)); pti = GdipAlloc(count * sizeof(POINT)); if(!ptf || !pti){ @@ -2925,6 +3013,12 @@ if(graphics->busy) return ObjectBusy; + if(!graphics->hdc) + { + FIXME("graphics object has no HDC\n"); + return Ok; + } + ptf = GdipAlloc(count * sizeof(GpPointF)); pti = GdipAlloc(count * sizeof(POINT)); if(!ptf || !pti){ @@ -2990,6 +3084,12 @@ if(graphics->busy) return ObjectBusy; + if(!graphics->hdc) + { + FIXME("graphics object has no HDC\n"); + return Ok; + } + ptf[0].X = x; ptf[0].Y = y; ptf[1].X = x + width; @@ -3030,6 +3130,12 @@ if(graphics->busy) return ObjectBusy; + if(!graphics->hdc) + { + FIXME("graphics object has no HDC\n"); + return Ok; + } + ptf[0].X = x; ptf[0].Y = y; ptf[1].X = x + width; @@ -3122,6 +3228,12 @@ if(graphics->busy) return ObjectBusy; + if(!graphics->hdc) + { + FIXME("graphics object has no HDC\n"); + return Ok; + } + status = GdipGetRegionHRgn(region, graphics, &hrgn); if(status != Ok) return status; @@ -3732,6 +3844,12 @@ if (regionCount < stringFormat->range_count) return InvalidParameter; + if(!graphics->hdc) + { + FIXME("graphics object has no HDC\n"); + return NotImplemented; + } + if (stringFormat->attr) TRACE("may be ignoring some format flags: attr %x\n", stringFormat->attr); @@ -3801,6 +3919,12 @@ if(!graphics || !string || !font || !rect || !bounds) return InvalidParameter; + if(!graphics->hdc) + { + FIXME("graphics object has no HDC\n"); + return NotImplemented; + } + if(linesfilled) *linesfilled = 0; if(codepointsfitted) *codepointsfitted = 0; @@ -3874,6 +3998,12 @@ return NotImplemented; } + if(!graphics->hdc) + { + FIXME("graphics object has no HDC\n"); + return NotImplemented; + } + if(format){ TRACE("may be ignoring some format flags: attr %x\n", format->attr); @@ -4484,7 +4614,10 @@ if(graphics->busy) return ObjectBusy; - *dpi = (REAL)GetDeviceCaps(graphics->hdc, LOGPIXELSX); + if (graphics->image) + *dpi = graphics->image->xres; + else + *dpi = (REAL)GetDeviceCaps(graphics->hdc, LOGPIXELSX); return Ok; } @@ -4499,7 +4632,10 @@ if(graphics->busy) return ObjectBusy; - *dpi = (REAL)GetDeviceCaps(graphics->hdc, LOGPIXELSY); + if (graphics->image) + *dpi = graphics->image->yres; + else + *dpi = (REAL)GetDeviceCaps(graphics->hdc, LOGPIXELSY); return Ok; } @@ -4527,6 +4663,9 @@ return ret; } +/* Color used to fill bitmaps so we can tell which parts have been drawn over by gdi32. */ +static const COLORREF DC_BACKGROUND_KEY = 0x0c0b0d; + GpStatus WINGDIPAPI GdipGetDC(GpGraphics *graphics, HDC *hdc) { TRACE("(%p, %p)\n", graphics, hdc); @@ -4537,7 +4676,61 @@ if(graphics->busy) return ObjectBusy; - *hdc = graphics->hdc; + if (!graphics->hdc || + (graphics->image && graphics->image->type == ImageTypeBitmap && ((GpBitmap*)graphics->image)->format & PixelFormatAlpha)) + { + /* Create a fake HDC and fill it with a constant color. */ + HDC temp_hdc; + HBITMAP hbitmap; + GpStatus stat; + GpRectF bounds; + BITMAPINFOHEADER bmih; + int i; + + stat = get_graphics_bounds(graphics, &bounds); + if (stat != Ok) + return stat; + + graphics->temp_hbitmap_width = bounds.Width; + graphics->temp_hbitmap_height = bounds.Height; + + bmih.biSize = sizeof(bmih); + bmih.biWidth = graphics->temp_hbitmap_width; + bmih.biHeight = -graphics->temp_hbitmap_height; + bmih.biPlanes = 1; + bmih.biBitCount = 32; + bmih.biCompression = BI_RGB; + bmih.biSizeImage = 0; + bmih.biXPelsPerMeter = 0; + bmih.biYPelsPerMeter = 0; + bmih.biClrUsed = 0; + bmih.biClrImportant = 0; + + hbitmap = CreateDIBSection(NULL, (BITMAPINFO*)&bmih, DIB_RGB_COLORS, + (void**)&graphics->temp_bits, NULL, 0); + if (!hbitmap) + return GenericError; + + temp_hdc = CreateCompatibleDC(0); + if (!temp_hdc) + { + DeleteObject(hbitmap); + return GenericError; + } + + for (i=0; i<(graphics->temp_hbitmap_width * graphics->temp_hbitmap_height); i++) + ((DWORD*)graphics->temp_bits)[i] = DC_BACKGROUND_KEY; + + SelectObject(temp_hdc, hbitmap); + + graphics->temp_hbitmap = hbitmap; + *hdc = graphics->temp_hdc = temp_hdc; + } + else + { + *hdc = graphics->hdc; + } + graphics->busy = TRUE; return Ok; @@ -4547,12 +4740,40 @@ { TRACE("(%p, %p)\n", graphics, hdc); - if(!graphics) + if(!graphics || !hdc) return InvalidParameter; - if(graphics->hdc != hdc || !(graphics->busy)) + if((graphics->hdc != hdc && graphics->temp_hdc != hdc) || !(graphics->busy)) return InvalidParameter; + if (graphics->temp_hdc == hdc) + { + DWORD* pos; + int i; + + /* Find the pixels that have changed, and mark them as opaque. */ + pos = (DWORD*)graphics->temp_bits; + for (i=0; i<(graphics->temp_hbitmap_width * graphics->temp_hbitmap_height); i++) + { + if (*pos != DC_BACKGROUND_KEY) + { + *pos |= 0xff000000; + } + pos++; + } + + /* Write the changed pixels to the real target. */ + alpha_blend_pixels(graphics, 0, 0, graphics->temp_bits, + graphics->temp_hbitmap_width, graphics->temp_hbitmap_height, + graphics->temp_hbitmap_width * 4); + + /* Clean up. */ + DeleteDC(graphics->temp_hdc); + DeleteObject(graphics->temp_hbitmap); + graphics->temp_hdc = NULL; + graphics->temp_hbitmap = NULL; + } + graphics->busy = FALSE; return Ok; @@ -4602,7 +4823,7 @@ stat = GdipCreateMatrix(&matrix); if (stat == Ok) { - unitscale = convert_unit(graphics->hdc, graphics->unit); + unitscale = convert_unit(graphics_res(graphics), graphics->unit); if(graphics->unit != UnitDisplay) unitscale *= graphics->scale; diff -Nru wine1.3-1.3.0/dlls/gdiplus/image.c wine1.3-1.3.1/dlls/gdiplus/image.c --- wine1.3-1.3.0/dlls/gdiplus/image.c 2010-07-30 18:43:56.000000000 +0100 +++ wine1.3-1.3.1/dlls/gdiplus/image.c 2010-08-20 18:23:50.000000000 +0100 @@ -1626,10 +1626,10 @@ PixelFormat format, BYTE* scan0, GpBitmap** bitmap) { BITMAPINFO* pbmi; - HBITMAP hbitmap; + HBITMAP hbitmap=NULL; INT row_size, dib_stride; HDC hdc; - BYTE *bits; + BYTE *bits=NULL, *own_bits=NULL; int i; REAL xres, yres; GpStatus stat; @@ -1655,39 +1655,63 @@ if(stride == 0) stride = dib_stride; - pbmi = GdipAlloc(sizeof(BITMAPINFOHEADER) + 256 * sizeof(RGBQUAD)); - if (!pbmi) - return OutOfMemory; + if (format & PixelFormatGDI) + { + pbmi = GdipAlloc(sizeof(BITMAPINFOHEADER) + 256 * sizeof(RGBQUAD)); + if (!pbmi) + return OutOfMemory; + + pbmi->bmiHeader.biSize = sizeof(BITMAPINFOHEADER); + pbmi->bmiHeader.biWidth = width; + pbmi->bmiHeader.biHeight = -height; + pbmi->bmiHeader.biPlanes = 1; + /* FIXME: use the rest of the data from format */ + pbmi->bmiHeader.biBitCount = PIXELFORMATBPP(format); + pbmi->bmiHeader.biCompression = BI_RGB; + pbmi->bmiHeader.biSizeImage = 0; + pbmi->bmiHeader.biXPelsPerMeter = 0; + pbmi->bmiHeader.biYPelsPerMeter = 0; + pbmi->bmiHeader.biClrUsed = 0; + pbmi->bmiHeader.biClrImportant = 0; + + hdc = CreateCompatibleDC(NULL); + if (!hdc) { + GdipFree(pbmi); + return GenericError; + } - pbmi->bmiHeader.biSize = sizeof(BITMAPINFOHEADER); - pbmi->bmiHeader.biWidth = width; - pbmi->bmiHeader.biHeight = -height; - pbmi->bmiHeader.biPlanes = 1; - /* FIXME: use the rest of the data from format */ - pbmi->bmiHeader.biBitCount = PIXELFORMATBPP(format); - pbmi->bmiHeader.biCompression = BI_RGB; - pbmi->bmiHeader.biSizeImage = 0; - pbmi->bmiHeader.biXPelsPerMeter = 0; - pbmi->bmiHeader.biYPelsPerMeter = 0; - pbmi->bmiHeader.biClrUsed = 0; - pbmi->bmiHeader.biClrImportant = 0; + hbitmap = CreateDIBSection(hdc, pbmi, DIB_RGB_COLORS, (void**)&bits, NULL, 0); - hdc = CreateCompatibleDC(NULL); - if (!hdc) { + DeleteDC(hdc); GdipFree(pbmi); - return GenericError; - } - hbitmap = CreateDIBSection(hdc, pbmi, DIB_RGB_COLORS, (void**)&bits, NULL, 0); + if (!hbitmap) return GenericError; + } + else + { + /* Not a GDI format; don't try to make an HBITMAP. */ + if (scan0) + { + /* FIXME: We should do this with GDI formats too when scan0 is + * provided, but for now we need the HDC for most drawing + * operations. */ + bits = scan0; + } + else + { + INT size = abs(stride) * height; - DeleteDC(hdc); - GdipFree(pbmi); + own_bits = bits = GdipAlloc(size); + if (!own_bits) return OutOfMemory; - if (!hbitmap) return GenericError; + if (stride < 0) + bits += stride * (1 - height); + } + } /* copy bits to the dib if necessary */ /* FIXME: should reference the bits instead of copying them */ - if (scan0) + if (scan0 && bits != scan0) for (i=0; ihdc = NULL; (*bitmap)->bits = bits; (*bitmap)->stride = dib_stride; + (*bitmap)->own_bits = own_bits; if (format == PixelFormat1bppIndexed || format == PixelFormat4bppIndexed || @@ -1916,6 +1942,7 @@ dst->hdc = src->hdc; dst->bits = src->bits; dst->stride = src->stride; + dst->own_bits = src->own_bits; GdipFree(src); } @@ -1932,6 +1959,7 @@ if (image->type == ImageTypeBitmap) { GdipFree(((GpBitmap*)image)->bitmapbits); + GdipFree(((GpBitmap*)image)->own_bits); DeleteDC(((GpBitmap*)image)->hdc); DeleteObject(((GpBitmap*)image)->hbitmap); } @@ -2008,14 +2036,15 @@ if(image->type == ImageTypeMetafile){ HDC hdc = GetDC(0); + REAL res = (REAL)GetDeviceCaps(hdc, LOGPIXELSX); + + ReleaseDC(0, hdc); - *height = convert_unit(hdc, ((GpMetafile*)image)->unit) * + *height = convert_unit(res, ((GpMetafile*)image)->unit) * ((GpMetafile*)image)->bounds.Height; - *width = convert_unit(hdc, ((GpMetafile*)image)->unit) * + *width = convert_unit(res, ((GpMetafile*)image)->unit) * ((GpMetafile*)image)->bounds.Width; - - ReleaseDC(0, hdc); } else if(image->type == ImageTypeBitmap){ @@ -2047,18 +2076,23 @@ return NotImplemented; } - hdc = ((GpBitmap*)image)->hdc; + if (((GpBitmap*)image)->hbitmap) + { + hdc = ((GpBitmap*)image)->hdc; - if(!hdc){ - hdc = CreateCompatibleDC(0); - SelectObject(hdc, ((GpBitmap*)image)->hbitmap); - ((GpBitmap*)image)->hdc = hdc; - } + if(!hdc){ + hdc = CreateCompatibleDC(0); + SelectObject(hdc, ((GpBitmap*)image)->hbitmap); + ((GpBitmap*)image)->hdc = hdc; + } - stat = GdipCreateFromHDC(hdc, graphics); + stat = GdipCreateFromHDC(hdc, graphics); - if (stat == Ok) - (*graphics)->image = image; + if (stat == Ok) + (*graphics)->image = image; + } + else + stat = graphics_from_image(image, graphics); return stat; } @@ -2072,11 +2106,12 @@ if(image->type == ImageTypeMetafile){ HDC hdc = GetDC(0); - - *height = roundr(convert_unit(hdc, ((GpMetafile*)image)->unit) * - ((GpMetafile*)image)->bounds.Height); + REAL res = (REAL)GetDeviceCaps(hdc, LOGPIXELSX); ReleaseDC(0, hdc); + + *height = roundr(convert_unit(res, ((GpMetafile*)image)->unit) * + ((GpMetafile*)image)->bounds.Height); } else if(image->type == ImageTypeBitmap) *height = ((GpBitmap*)image)->height; @@ -2178,11 +2213,12 @@ if(image->type == ImageTypeMetafile){ HDC hdc = GetDC(0); - - *width = roundr(convert_unit(hdc, ((GpMetafile*)image)->unit) * - ((GpMetafile*)image)->bounds.Width); + REAL res = (REAL)GetDeviceCaps(hdc, LOGPIXELSX); ReleaseDC(0, hdc); + + *width = roundr(convert_unit(res, ((GpMetafile*)image)->unit) * + ((GpMetafile*)image)->bounds.Width); } else if(image->type == ImageTypeBitmap) *width = ((GpBitmap*)image)->width; diff -Nru wine1.3-1.3.0/dlls/gdiplus/pen.c wine1.3-1.3.1/dlls/gdiplus/pen.c --- wine1.3-1.3.0/dlls/gdiplus/pen.c 2010-07-30 18:43:56.000000000 +0100 +++ wine1.3-1.3.1/dlls/gdiplus/pen.c 2010-08-20 18:23:50.000000000 +0100 @@ -404,6 +404,36 @@ return NotImplemented; } +GpStatus WINGDIPAPI GdipSetPenTransform(GpPen *pen, GpMatrix *matrix) +{ + static int calls; + + TRACE("(%p,%p)\n", pen, matrix); + + if(!pen || !matrix) + return InvalidParameter; + + if(!(calls++)) + FIXME("not implemented\n"); + + return NotImplemented; +} + +GpStatus WINGDIPAPI GdipGetPenTransform(GpPen *pen, GpMatrix *matrix) +{ + static int calls; + + TRACE("(%p,%p)\n", pen, matrix); + + if(!pen || !matrix) + return InvalidParameter; + + if(!(calls++)) + FIXME("not implemented\n"); + + return NotImplemented; +} + GpStatus WINGDIPAPI GdipScalePenTransform(GpPen *pen, REAL sx, REAL sy, GpMatrixOrder order) { static int calls; @@ -419,6 +449,21 @@ return NotImplemented; } +GpStatus WINGDIPAPI GdipRotatePenTransform(GpPen *pen, REAL angle, GpMatrixOrder order) +{ + static int calls; + + TRACE("(%p,%0.2f,%u)\n", pen, angle, order); + + if(!pen) + return InvalidParameter; + + if(!(calls++)) + FIXME("not implemented\n"); + + return NotImplemented; +} + GpStatus WINGDIPAPI GdipMultiplyPenTransform(GpPen *pen, GDIPCONST GpMatrix *matrix, GpMatrixOrder order) { diff -Nru wine1.3-1.3.0/dlls/gdiplus/tests/graphics.c wine1.3-1.3.1/dlls/gdiplus/tests/graphics.c --- wine1.3-1.3.0/dlls/gdiplus/tests/graphics.c 2010-07-30 18:43:56.000000000 +0100 +++ wine1.3-1.3.1/dlls/gdiplus/tests/graphics.c 2010-08-20 18:23:50.000000000 +0100 @@ -2157,6 +2157,8 @@ GpGraphics *graphics = NULL; GpBitmap *bitmap = NULL; BYTE bits[48] = {0}; + HDC hdc=NULL; + COLORREF color; status = GdipCreateBitmapFromScan0(4, 4, 12, PixelFormat24bppRGB, bits, &bitmap); expect(Ok, status); @@ -2172,6 +2174,50 @@ /* drawing writes to the memory provided */ todo_wine expect(0x68, bits[10]); + status = GdipGetImageGraphicsContext((GpImage*)bitmap, &graphics); + expect(Ok, status); + + status = GdipGetDC(graphics, &hdc); + expect(Ok, status); + ok(hdc != NULL, "got NULL hdc\n"); + + color = GetPixel(hdc, 0, 0); + /* The HDC is write-only, and native fills with a solid color to figure out + * which pixels have changed. */ + todo_wine expect(0x0c0b0d, color); + + SetPixel(hdc, 0, 0, 0x797979); + SetPixel(hdc, 1, 0, 0x0c0b0d); + + status = GdipReleaseDC(graphics, hdc); + expect(Ok, status); + + GdipDeleteGraphics(graphics); + + todo_wine expect(0x79, bits[0]); + todo_wine expect(0x68, bits[3]); + + GdipDisposeImage((GpImage*)bitmap); + + /* We get the same kind of write-only HDC for a "normal" bitmap */ + status = GdipCreateBitmapFromScan0(4, 4, 12, PixelFormat24bppRGB, NULL, &bitmap); + expect(Ok, status); + + status = GdipGetImageGraphicsContext((GpImage*)bitmap, &graphics); + expect(Ok, status); + + status = GdipGetDC(graphics, &hdc); + expect(Ok, status); + ok(hdc != NULL, "got NULL hdc\n"); + + color = GetPixel(hdc, 0, 0); + todo_wine expect(0x0c0b0d, color); + + status = GdipReleaseDC(graphics, hdc); + expect(Ok, status); + + GdipDeleteGraphics(graphics); + GdipDisposeImage((GpImage*)bitmap); } @@ -2616,7 +2662,7 @@ GdipDisposeImage((GpImage*)bitmap); status = GdipCreateBitmapFromScan0(10, 10, 10, PixelFormat48bppRGB, NULL, &bitmap); - todo_wine expect(Ok, status); + expect(Ok, status); if (status == Ok) { status = GdipGetImageGraphicsContext((GpImage*)bitmap, &graphics); @@ -2629,7 +2675,7 @@ } status = GdipCreateBitmapFromScan0(10, 10, 10, PixelFormat64bppARGB, NULL, &bitmap); - todo_wine expect(Ok, status); + expect(Ok, status); if (status == Ok) { status = GdipGetImageGraphicsContext((GpImage*)bitmap, &graphics); @@ -2642,7 +2688,7 @@ } status = GdipCreateBitmapFromScan0(10, 10, 10, PixelFormat64bppPARGB, NULL, &bitmap); - todo_wine expect(Ok, status); + expect(Ok, status); if (status == Ok) { status = GdipGetImageGraphicsContext((GpImage*)bitmap, &graphics); diff -Nru wine1.3-1.3.0/dlls/hlink/link.c wine1.3-1.3.1/dlls/hlink/link.c --- wine1.3-1.3.0/dlls/hlink/link.c 2010-07-30 18:43:56.000000000 +0100 +++ wine1.3-1.3.1/dlls/hlink/link.c 2010-08-20 18:23:50.000000000 +0100 @@ -69,20 +69,40 @@ return (HlinkImpl*) ((CHAR*)iface - FIELD_OFFSET(HlinkImpl, lpDOVtbl)); } -static inline void __GetMoniker(HlinkImpl* This, IMoniker** moniker) +static HRESULT __GetMoniker(HlinkImpl* This, IMoniker** moniker, + DWORD ref_type) { - *moniker = NULL; - if (This->Moniker) - { - *moniker = This->Moniker; - if (*moniker) - IMoniker_AddRef(*moniker); - } - else if (This->Site) + HRESULT hres; + + if (ref_type == HLINKGETREF_DEFAULT) + ref_type = HLINKGETREF_RELATIVE; + + if (ref_type == HLINKGETREF_ABSOLUTE && This->Site) { - IHlinkSite_GetMoniker(This->Site, This->SiteData, - OLEGETMONIKER_FORCEASSIGN, OLEWHICHMK_CONTAINER, moniker); + IMoniker *hls_moniker; + + hres = IHlinkSite_GetMoniker(This->Site, This->SiteData, + OLEGETMONIKER_FORCEASSIGN, OLEWHICHMK_CONTAINER, &hls_moniker); + if (FAILED(hres)) + return hres; + + if (This->Moniker) + { + hres = IMoniker_ComposeWith(hls_moniker, This->Moniker, FALSE, + moniker); + IMoniker_Release(hls_moniker); + return hres; + } + + *moniker = hls_moniker; + return S_OK; } + + *moniker = This->Moniker; + if (*moniker) + IMoniker_AddRef(*moniker); + + return S_OK; } HRESULT WINAPI HLink_Constructor(IUnknown *pUnkOuter, REFIID riid, @@ -307,8 +327,16 @@ TRACE("(%p) -> (%i %p %p)\n", This, dwWhichRef, ppimkTarget, ppwzLocation); - if(ppimkTarget) - __GetMoniker(This, ppimkTarget); + if (ppimkTarget) + { + HRESULT hres = __GetMoniker(This, ppimkTarget, dwWhichRef); + if (FAILED(hres)) + { + if (ppwzLocation) + *ppwzLocation = NULL; + return hres; + } + } if (ppwzLocation) IHlink_GetStringReference(iface, dwWhichRef, NULL, ppwzLocation); @@ -323,7 +351,6 @@ TRACE("(%p) -> (%i %p %p)\n", This, dwWhichRef, ppwzTarget, ppwzLocation); - /* note: undocumented behavior with dwWhichRef == -1 */ if(dwWhichRef != -1 && dwWhichRef & ~(HLINKGETREF_DEFAULT | HLINKGETREF_ABSOLUTE | HLINKGETREF_RELATIVE)) { if(ppwzTarget) @@ -333,13 +360,16 @@ return E_INVALIDARG; } - if(dwWhichRef != HLINKGETREF_DEFAULT) - FIXME("unhandled flags: 0x%x\n", dwWhichRef); - if (ppwzTarget) { IMoniker* mon; - __GetMoniker(This, &mon); + HRESULT hres = __GetMoniker(This, &mon, dwWhichRef); + if (FAILED(hres)) + { + if (ppwzLocation) + *ppwzLocation = NULL; + return hres; + } if (mon) { IBindCtx *pbc; @@ -389,7 +419,12 @@ else { IMoniker *moniker; - __GetMoniker(This, &moniker); + HRESULT hres = __GetMoniker(This, &moniker, HLINKGETREF_DEFAULT); + if (FAILED(hres)) + { + *ppwzFriendlyName = NULL; + return hres; + } if (moniker) { IBindCtx *bcxt; @@ -440,20 +475,17 @@ { HlinkImpl *This = (HlinkImpl*)iface; IMoniker *mon = NULL; + HRESULT r; FIXME("Semi-Stub:(%p)->(%i %p %p %p)\n", This, grfHLNF, pbc, pbsc, phbc); - if (This->Site) - IHlinkSite_ReadyToNavigate(This->Site, This->SiteData, 0); - - __GetMoniker(This, &mon); + r = __GetMoniker(This, &mon, HLINKGETREF_ABSOLUTE); TRACE("Moniker %p\n", mon); - if (mon) + if (SUCCEEDED(r)) { IBindCtx *bcxt; IHlinkTarget *target = NULL; - HRESULT r = S_OK; CreateBindCtx(0, &bcxt); @@ -488,10 +520,10 @@ } if (This->Site) - IHlinkSite_OnNavigationComplete(This->Site, This->SiteData, 0, 0, NULL); + IHlinkSite_OnNavigationComplete(This->Site, This->SiteData, 0, r, NULL); TRACE("Finished Navigation\n"); - return S_OK; + return r; } static HRESULT WINAPI IHlink_fnSetAdditonalParams(IHlink* iface, @@ -782,14 +814,17 @@ static HRESULT WINAPI IPersistStream_fnSave(IPersistStream* iface, IStream* pStm, BOOL fClearDirty) { - HRESULT r = E_FAIL; + HRESULT r; HlinkImpl *This = HlinkImpl_from_IPersistStream(iface); DWORD hdr[2]; IMoniker *moniker; TRACE("(%p) Moniker(%p)\n", This, This->Moniker); - __GetMoniker(This, &moniker); + r = __GetMoniker(This, &moniker, HLINKGETREF_DEFAULT); + if (FAILED(r)) + return r; + r = E_FAIL; hdr[0] = HLINK_SAVE_MAGIC; hdr[1] = 0; @@ -850,7 +885,7 @@ static HRESULT WINAPI IPersistStream_fnGetSizeMax(IPersistStream* iface, ULARGE_INTEGER* pcbSize) { - HRESULT r = E_FAIL; + HRESULT r; HlinkImpl *This = HlinkImpl_from_IPersistStream(iface); IMoniker *moniker; @@ -864,7 +899,11 @@ if (This->FriendlyName) pcbSize->QuadPart += size_hlink_string(This->FriendlyName); - __GetMoniker(This, &moniker); + r = __GetMoniker(This, &moniker, HLINKGETREF_DEFAULT); + if (FAILED(r)) + return r; + r = E_FAIL; + if (moniker) { IPersistStream* monstream = NULL; diff -Nru wine1.3-1.3.0/dlls/hlink/tests/hlink.c wine1.3-1.3.1/dlls/hlink/tests/hlink.c --- wine1.3-1.3.0/dlls/hlink/tests/hlink.c 2010-07-30 18:43:56.000000000 +0100 +++ wine1.3-1.3.1/dlls/hlink/tests/hlink.c 2010-08-20 18:23:50.000000000 +0100 @@ -57,6 +57,11 @@ DEFINE_EXPECT(BindToStorage); DEFINE_EXPECT(GetDisplayName); +DEFINE_EXPECT(ComposeWith); +DEFINE_EXPECT(OnNavigationComplete); +DEFINE_EXPECT(Enum); +DEFINE_EXPECT(Reduce); + static const char *debugstr_guid(REFIID riid) { static char buf[50]; @@ -437,7 +442,7 @@ hr = HlinkCreateFromString(url, NULL, NULL, NULL, 0, NULL, &IID_IHlink, (LPVOID*) &lnk); - ok(hr == S_OK, "IHlinkCreateFromString failed with error 0x%08x\n", hr); + ok(hr == S_OK, "HlinkCreateFromString failed with error 0x%08x\n", hr); if (!lnk) { skip("Can't create lnk, skipping test_persist.\n"); return; @@ -449,7 +454,7 @@ hr = HlinkCreateFromString(url, NULL, friendly_name, NULL, 0, NULL, &IID_IHlink, (LPVOID*) &lnk); - ok(hr == S_OK, "IHlinCreateFromString failed with error 0x%08x\n", hr); + ok(hr == S_OK, "HlinkCreateFromString failed with error 0x%08x\n", hr); test_persist_save_data("url + friendly name", lnk, expected_hlink_data2, sizeof(expected_hlink_data2), expected_hlink_data2_ie7, sizeof(expected_hlink_data2_ie7)); @@ -457,7 +462,7 @@ hr = HlinkCreateFromString(url, location, friendly_name, NULL, 0, NULL, &IID_IHlink, (LPVOID*) &lnk); - ok(hr == S_OK, "IHlinCreateFromString failed with error 0x%08x\n", hr); + ok(hr == S_OK, "HlinkCreateFromString failed with error 0x%08x\n", hr); test_persist_save_data("url + friendly_name + location", lnk, expected_hlink_data3, sizeof(expected_hlink_data3), expected_hlink_data3_ie7, sizeof(expected_hlink_data3_ie7)); @@ -465,7 +470,7 @@ hr = HlinkCreateFromString(rel_url, NULL, NULL, NULL, 0, NULL, &IID_IHlink, (LPVOID*) &lnk); - ok(hr == S_OK, "IHlinCreateFromString failed with error 0x%08x\n", hr); + ok(hr == S_OK, "HlinkCreateFromString failed with error 0x%08x\n", hr); test_persist_save_data("relative url", lnk, expected_hlink_data4, sizeof(expected_hlink_data4), expected_hlink_data4, sizeof(expected_hlink_data4)); @@ -473,7 +478,7 @@ hr = HlinkCreateFromString(url, NULL, NULL, NULL, 0, NULL, &IID_IHlink, (LPVOID*) &lnk); - ok(hr == S_OK, "IHlinCreateFromString failed with error 0x%08x\n", hr); + ok(hr == S_OK, "HlinkCreateFromString failed with error 0x%08x\n", hr); hr = IHlink_SetTargetFrameName(lnk, target_frame_name); ok(hr == S_OK, "IHlink_SetTargetFrameName failed with error 0x%08x\n", hr); test_persist_save_data("url + target frame name", lnk, @@ -483,7 +488,7 @@ hr = HlinkCreateFromString(filename, NULL, NULL, NULL, 0, NULL, &IID_IHlink, (LPVOID*) &lnk); - ok(hr == S_OK, "IHlinCreateFromString failed with error 0x%08x\n", hr); + ok(hr == S_OK, "HlinkCreateFromString failed with error 0x%08x\n", hr); test_persist_save_data("filename", lnk, expected_hlink_data6, sizeof(expected_hlink_data6), expected_hlink_data6, sizeof(expected_hlink_data6)); @@ -876,7 +881,7 @@ static HRESULT WINAPI Moniker_Reduce(IMoniker *iface, IBindCtx *pbc, DWORD dwReduceHowFar, IMoniker **ppmkToLeft, IMoniker **ppmkReduced) { - ok(0, "unexpected call\n"); + CHECK_EXPECT(Reduce); return E_NOTIMPL; } @@ -889,7 +894,7 @@ static HRESULT WINAPI Moniker_Enum(IMoniker *iface, BOOL fForwrd, IEnumMoniker **ppenumMoniker) { - ok(0, "unexpected call\n"); + CHECK_EXPECT(Enum); return E_NOTIMPL; } @@ -1442,6 +1447,256 @@ } } +static WCHAR site_monikerW[] = {'S','I','T','E','_','M','O','N','I','K','E','R',0}; +static WCHAR ref_monikerW[] = {'R','E','F','_','M','O','N','I','K','E','R',0}; + +static HRESULT WINAPI hls_test_Moniker_BindToStorage(IMoniker *iface, + IBindCtx *pbc, IMoniker *toLeft, REFIID riid, void **obj) +{ + ok(0, "BTS: %p %p %p %p %p\n", iface, pbc, toLeft, riid, obj); + return E_NOTIMPL; +} + +static HRESULT WINAPI hls_site_Moniker_ComposeWith(IMoniker *iface, + IMoniker *right, BOOL onlyIfNotGeneric, IMoniker **composite) +{ + LPOLESTR rightName; + HRESULT hres; + + ok(onlyIfNotGeneric == 0, "Expected onlyIfNotGeneric to be FALSE\n"); + + CHECK_EXPECT(ComposeWith); + + hres = IMoniker_GetDisplayName(right, NULL, NULL, &rightName); + ok(hres == S_OK, "GetDisplayName failed: %08x\n", hres); + ok(!lstrcmpW(rightName, ref_monikerW), + "Expected to get moniker set via SetMonikerReference, instead got: %s\n", + wine_dbgstr_w(rightName)); + CoTaskMemFree(rightName); + + *composite = NULL; + + /* unlikely error code to verify this return result is used */ + return E_OUTOFMEMORY; +} + +static HRESULT WINAPI hls_site_Moniker_GetDisplayName(IMoniker *iface, + IBindCtx *pbc, IMoniker *toLeft, LPOLESTR *displayName) +{ + *displayName = CoTaskMemAlloc(sizeof(site_monikerW)); + memcpy(*displayName, site_monikerW, sizeof(site_monikerW)); + return S_OK; +} + +static HRESULT WINAPI hls_ref_Moniker_GetDisplayName(IMoniker *iface, + IBindCtx *pbc, IMoniker *toLeft, LPOLESTR *displayName) +{ + *displayName = CoTaskMemAlloc(sizeof(ref_monikerW)); + memcpy(*displayName, ref_monikerW, sizeof(ref_monikerW)); + return S_OK; +} + +static HRESULT WINAPI hls_test_Moniker_IsSystemMoniker(IMoniker *iface, + DWORD *mksys) +{ + return S_FALSE; +} + +static IMonikerVtbl hls_site_MonikerVtbl = { + Moniker_QueryInterface, + Moniker_AddRef, + Moniker_Release, + Moniker_GetClassID, + Moniker_IsDirty, + Moniker_Load, + Moniker_Save, + Moniker_GetSizeMax, + Moniker_BindToObject, + hls_test_Moniker_BindToStorage, + Moniker_Reduce, + hls_site_Moniker_ComposeWith, + Moniker_Enum, + Moniker_IsEqual, + Moniker_Hash, + Moniker_IsRunning, + Moniker_GetTimeOfLastChange, + Moniker_Inverse, + Moniker_CommonPrefixWith, + Moniker_RelativePathTo, + hls_site_Moniker_GetDisplayName, + Moniker_ParseDisplayName, + hls_test_Moniker_IsSystemMoniker +}; + +static IMonikerVtbl hls_ref_MonikerVtbl = { + Moniker_QueryInterface, + Moniker_AddRef, + Moniker_Release, + Moniker_GetClassID, + Moniker_IsDirty, + Moniker_Load, + Moniker_Save, + Moniker_GetSizeMax, + Moniker_BindToObject, + hls_test_Moniker_BindToStorage, + Moniker_Reduce, + Moniker_ComposeWith, + Moniker_Enum, + Moniker_IsEqual, + Moniker_Hash, + Moniker_IsRunning, + Moniker_GetTimeOfLastChange, + Moniker_Inverse, + Moniker_CommonPrefixWith, + Moniker_RelativePathTo, + hls_ref_Moniker_GetDisplayName, + Moniker_ParseDisplayName, + hls_test_Moniker_IsSystemMoniker +}; + +static IMoniker hls_site_Moniker = { &hls_site_MonikerVtbl }; +static IMoniker hls_ref_Moniker = { &hls_ref_MonikerVtbl }; + +static HRESULT WINAPI hls_QueryInterface(IHlinkSite *iface, REFGUID iid, + void **obj) +{ + ok(0, "QI: %p %s %p\n", iface, debugstr_guid(iid), obj); + return E_NOTIMPL; +} + +static ULONG WINAPI hls_AddRef(IHlinkSite *iface) +{ + return 2; +} + +static ULONG WINAPI hls_Release(IHlinkSite *iface) +{ + return 1; +} + +static HRESULT WINAPI hls_QueryService(IHlinkSite *iface, DWORD siteData, + REFGUID service, REFIID riid, IUnknown **punk) +{ + ok(0, "QS: %p %x %s %s %p\n", iface, siteData, debugstr_guid(service), + debugstr_guid(riid), punk); + return E_NOTIMPL; +} + +static HRESULT WINAPI hls_GetMoniker(IHlinkSite *iface, DWORD siteData, + DWORD assign, DWORD which, IMoniker **pmk) +{ + ok(siteData == 17, "Expected siteData == 17, got: %d\n", siteData); + *pmk = &hls_site_Moniker; + return S_OK; +} + +static HRESULT WINAPI hls_ReadyToNavigate(IHlinkSite *iface, DWORD siteData, + DWORD reserved) +{ + ok(0, "RTN: %p %x %x\n", iface, siteData, reserved); + return E_NOTIMPL; +} + +static HRESULT WINAPI hls_OnNavigationComplete(IHlinkSite *iface, + DWORD siteData, DWORD reserved, HRESULT error, LPCWSTR errorStr) +{ + CHECK_EXPECT(OnNavigationComplete); + ok(siteData == 17, "Expected siteData == 17, got: %d\n", siteData); + ok(error == E_OUTOFMEMORY, "Expected E_OUTOFMEMORY, got: %08x\n", error); + return E_NOTIMPL; +} + +static IHlinkSiteVtbl HlinkSiteVtbl = { + hls_QueryInterface, + hls_AddRef, + hls_Release, + hls_QueryService, + hls_GetMoniker, + hls_ReadyToNavigate, + hls_OnNavigationComplete +}; + +static IHlinkSite HlinkSite = { &HlinkSiteVtbl }; + +static void test_HlinkSite(void) +{ + IHlink *hl; + IMoniker *mon_ref; + IBindCtx *pbc; + HRESULT hres; + + hres = HlinkCreateFromString(NULL, NULL, NULL, NULL, 0, NULL, + &IID_IHlink, (LPVOID*)&hl); + ok(hres == S_OK, "HlinkCreateFromString failed: %08x\n", hres); + getMonikerRef(hl, NULL, NULL); + + hres = IHlink_SetHlinkSite(hl, &HlinkSite, 17); + ok(hres == S_OK, "SetHlinkSite failed: %08x\n", hres); + getMonikerRef(hl, NULL, NULL); + getStringRef(hl, NULL, NULL); + + hres = IHlink_GetMonikerReference(hl, HLINKGETREF_RELATIVE, &mon_ref, NULL); + ok(hres == S_OK, "GetMonikerReference failed: %08x\n", hres); + ok(mon_ref == NULL, "Didn't get expected moniker, instead: %p\n", mon_ref); + + hres = IHlink_GetMonikerReference(hl, HLINKGETREF_ABSOLUTE, &mon_ref, NULL); + ok(hres == S_OK, "GetMonikerReference failed: %08x\n", hres); + ok(mon_ref == &hls_site_Moniker, "Didn't get expected moniker, instead: %p\n", mon_ref); + + SET_EXPECT(Reduce); + SET_EXPECT(Enum); + hres = IHlink_SetMonikerReference(hl, HLINKSETF_TARGET, &hls_ref_Moniker, NULL); + ok(hres == S_OK, "SetMonikerReference failed: %08x\n", hres); + todo_wine CHECK_CALLED(Reduce); + todo_wine CHECK_CALLED(Enum); + + getMonikerRef(hl, &hls_ref_Moniker, NULL); + + SET_EXPECT(Enum); + getStringRef(hl, ref_monikerW, NULL); + todo_wine CHECK_CALLED(Enum); + + hres = IHlink_GetMonikerReference(hl, HLINKGETREF_RELATIVE, &mon_ref, NULL); + ok(hres == S_OK, "GetMonikerReference failed: %08x\n", hres); + ok(mon_ref == &hls_ref_Moniker, "Didn't get expected moniker, instead: %p\n", mon_ref); + IMoniker_Release(mon_ref); + + SET_EXPECT(ComposeWith); + hres = IHlink_GetMonikerReference(hl, HLINKGETREF_ABSOLUTE, &mon_ref, NULL); + ok(hres == E_OUTOFMEMORY, "Expected E_OUTOFMEMORY, got: %08x\n", hres); + ok(mon_ref == NULL, "Shouldn't have got a Moniker, got: %p\n", mon_ref); + CHECK_CALLED(ComposeWith); + + hres = CreateBindCtx(0, &pbc); + ok(hres == S_OK, "CreateBindCtx failed: %08x\n", hres); + + SET_EXPECT(ComposeWith); + SET_EXPECT(OnNavigationComplete); + hres = IHlink_Navigate(hl, 0, pbc, NULL, NULL); + ok(hres == E_OUTOFMEMORY, "Navigate should've failed: %08x\n", hres); + CHECK_CALLED(ComposeWith); + CHECK_CALLED(OnNavigationComplete); + + IBindCtx_Release(pbc); + IHlink_Release(hl); + + SET_EXPECT(Reduce); + SET_EXPECT(Enum); + hres = HlinkCreateFromMoniker(&hls_ref_Moniker, NULL, NULL, &HlinkSite, 17, + NULL, &IID_IHlink, (LPVOID*)&hl); + ok(hres == S_OK, "HlinkCreateFromMoniker failed: %08x\n", hres); + todo_wine CHECK_CALLED(Reduce); + todo_wine CHECK_CALLED(Enum); + getMonikerRef(hl, &hls_ref_Moniker, NULL); + IHlink_Release(hl); + + hres = HlinkCreateFromMoniker(NULL, NULL, NULL, &HlinkSite, 17, + NULL, &IID_IHlink, (LPVOID*)&hl); + ok(hres == S_OK, "HlinkCreateFromMoniker failed: %08x\n", hres); + getMonikerRef(hl, NULL, NULL); + IHlink_Release(hl); +} + START_TEST(hlink) { CoInitialize(NULL); @@ -1457,6 +1712,7 @@ test_HlinkGetSetStringReference(); test_HlinkMoniker(); test_HashLink(); + test_HlinkSite(); CoUninitialize(); } diff -Nru wine1.3-1.3.0/dlls/imagehlp/integrity.c wine1.3-1.3.1/dlls/imagehlp/integrity.c --- wine1.3-1.3.0/dlls/imagehlp/integrity.c 2010-07-30 18:43:56.000000000 +0100 +++ wine1.3-1.3.1/dlls/imagehlp/integrity.c 2010-08-20 18:23:50.000000000 +0100 @@ -717,7 +717,6 @@ { BOOL ret = FALSE; DWORD offset, size, base; - PBYTE import; /* Get import data */ offset = IMAGEHLP_GetSectionOffset( hdr, num_sections, ".idata", &size, @@ -740,7 +739,7 @@ SetLastError(ERROR_INVALID_PARAMETER); ret = FALSE; } - HeapFree( GetProcessHeap(), 0, import ); + return ret; } diff -Nru wine1.3-1.3.0/dlls/iphlpapi/iphlpapi_main.c wine1.3-1.3.1/dlls/iphlpapi/iphlpapi_main.c --- wine1.3-1.3.0/dlls/iphlpapi/iphlpapi_main.c 2010-07-30 18:43:56.000000000 +0100 +++ wine1.3-1.3.1/dlls/iphlpapi/iphlpapi_main.c 2010-08-20 18:23:50.000000000 +0100 @@ -721,6 +721,7 @@ for (ua = aa->FirstUnicastAddress; ua->Next; ua = ua->Next) ; ua->Next = (IP_ADAPTER_UNICAST_ADDRESS *)ptr; + ua = (IP_ADAPTER_UNICAST_ADDRESS *)ptr; } else ua = aa->FirstUnicastAddress = (IP_ADAPTER_UNICAST_ADDRESS *)ptr; diff -Nru wine1.3-1.3.0/dlls/jscript/engine.c wine1.3-1.3.1/dlls/jscript/engine.c --- wine1.3-1.3.0/dlls/jscript/engine.c 2010-07-30 18:43:56.000000000 +0100 +++ wine1.3-1.3.1/dlls/jscript/engine.c 2010-08-20 18:23:50.000000000 +0100 @@ -1999,10 +1999,8 @@ static const WCHAR prototypeW[] = {'p','r','o','t','o','t', 'y', 'p','e',0}; - if(V_VT(objv) != VT_DISPATCH) { - FIXME("throw TypeError\n"); - return E_FAIL; - } + if(V_VT(objv) != VT_DISPATCH || !V_DISPATCH(objv)) + return throw_type_error(ctx->parser->script, ei, IDS_NOT_FUNC, NULL); obj = iface_to_jsdisp((IUnknown*)V_DISPATCH(objv)); if(!obj) { @@ -2067,10 +2065,8 @@ BSTR str; HRESULT hres; - if(V_VT(obj) != VT_DISPATCH) { - FIXME("throw TypeError\n"); - return E_FAIL; - } + if(V_VT(obj) != VT_DISPATCH || !V_DISPATCH(obj)) + return throw_type_error(ctx->parser->script, ei, IDS_OBJECT_EXPECTED, NULL); hres = to_string(ctx->parser->script, lval, ei, &str); if(FAILED(hres)) diff -Nru wine1.3-1.3.0/dlls/jscript/error.c wine1.3-1.3.1/dlls/jscript/error.c --- wine1.3-1.3.0/dlls/jscript/error.c 2010-07-30 18:43:56.000000000 +0100 +++ wine1.3-1.3.1/dlls/jscript/error.c 2010-08-20 18:23:50.000000000 +0100 @@ -26,128 +26,65 @@ WINE_DEFAULT_DEBUG_CHANNEL(jscript); -typedef struct { - DispatchEx dispex; - - VARIANT number; - VARIANT description; - VARIANT message; -} ErrorInstance; - static const WCHAR descriptionW[] = {'d','e','s','c','r','i','p','t','i','o','n',0}; static const WCHAR messageW[] = {'m','e','s','s','a','g','e',0}; static const WCHAR nameW[] = {'n','a','m','e',0}; static const WCHAR numberW[] = {'n','u','m','b','e','r',0}; static const WCHAR toStringW[] = {'t','o','S','t','r','i','n','g',0}; -static inline ErrorInstance *error_from_vdisp(vdisp_t *vdisp) -{ - return (ErrorInstance*)vdisp->u.jsdisp; -} - -static inline ErrorInstance *error_this(vdisp_t *jsthis) -{ - return is_vclass(jsthis, JSCLASS_ERROR) ? error_from_vdisp(jsthis) : NULL; -} - -static HRESULT Error_number(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, - DISPPARAMS *dp, VARIANT *retv, jsexcept_t *ei, IServiceProvider *sp) -{ - ErrorInstance *This = error_from_vdisp(jsthis); - - TRACE("\n"); - - switch(flags) { - case DISPATCH_PROPERTYGET: - return VariantCopy(retv, &This->number); - case DISPATCH_PROPERTYPUT: - return VariantCopy(&This->number, get_arg(dp, 0)); - default: - FIXME("unimplemented flags %x\n", flags); - return E_NOTIMPL; - } -} - -static HRESULT Error_description(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, - DISPPARAMS *dp, VARIANT *retv, jsexcept_t *ei, IServiceProvider *sp) -{ - ErrorInstance *This = error_from_vdisp(jsthis); - - TRACE("\n"); - - switch(flags) { - case DISPATCH_PROPERTYGET: - return VariantCopy(retv, &This->description); - case DISPATCH_PROPERTYPUT: - return VariantCopy(&This->description, get_arg(dp, 0)); - default: - FIXME("unimplemented flags %x\n", flags); - return E_NOTIMPL; - } -} - -/* ECMA-262 3rd Edition 15.11.4.3 */ -static HRESULT Error_message(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, - DISPPARAMS *dp, VARIANT *retv, jsexcept_t *ei, IServiceProvider *sp) -{ - ErrorInstance *This = error_from_vdisp(jsthis); - - TRACE("\n"); - - switch(flags) { - case DISPATCH_PROPERTYGET: - return VariantCopy(retv, &This->message); - case DISPATCH_PROPERTYPUT: - return VariantCopy(&This->message, get_arg(dp, 0)); - default: - FIXME("unimplemented flags %x\n", flags); - return E_NOTIMPL; - } -} - /* ECMA-262 3rd Edition 15.11.4.4 */ -static HRESULT Error_toString(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, +static HRESULT Error_toString(script_ctx_t *ctx, vdisp_t *vthis, WORD flags, DISPPARAMS *dp, VARIANT *retv, jsexcept_t *ei, IServiceProvider *caller) { - ErrorInstance *error; - BSTR name, msg = NULL, ret = NULL; + DispatchEx *jsthis; + BSTR name = NULL, msg = NULL, ret = NULL; VARIANT v; HRESULT hres; - static const WCHAR str[] = {'[','o','b','j','e','c','t',' ','E','r','r','o','r',']',0}; + static const WCHAR object_errorW[] = {'[','o','b','j','e','c','t',' ','E','r','r','o','r',']',0}; TRACE("\n"); - error = error_this(jsthis); - if(ctx->version < 2 || !error) { + jsthis = get_jsdisp(vthis); + if(!jsthis || ctx->version < 2) { if(retv) { V_VT(retv) = VT_BSTR; - V_BSTR(retv) = SysAllocString(str); + V_BSTR(retv) = SysAllocString(object_errorW); if(!V_BSTR(retv)) return E_OUTOFMEMORY; } return S_OK; } - hres = jsdisp_propget_name(&error->dispex, nameW, &v, ei, caller); + hres = jsdisp_propget_name(jsthis, nameW, &v, ei, caller); if(FAILED(hres)) return hres; - hres = to_string(ctx, &v, ei, &name); - VariantClear(&v); - if(FAILED(hres)) - return hres; + if(V_VT(&v) != VT_EMPTY) { + hres = to_string(ctx, &v, ei, &name); + VariantClear(&v); + if(FAILED(hres)) + return hres; + if(!*name) { + SysFreeString(name); + name = NULL; + } + } - if(V_VT(&error->message) != VT_EMPTY) { - hres = to_string(ctx, &error->message, ei, &msg); - if(SUCCEEDED(hres) && !*msg) { - SysFreeString(msg); - msg = NULL; + hres = jsdisp_propget_name(jsthis, messageW, &v, ei, caller); + if(SUCCEEDED(hres)) { + if(V_VT(&v) != VT_EMPTY) { + hres = to_string(ctx, &v, ei, &msg); + VariantClear(&v); + if(SUCCEEDED(hres) && !*msg) { + SysFreeString(msg); + msg = NULL; + } } } if(SUCCEEDED(hres)) { - if(msg) { + if(name && msg) { DWORD name_len, msg_len; name_len = SysStringLen(name); @@ -160,9 +97,16 @@ ret[name_len+1] = ' '; memcpy(ret+name_len+2, msg, msg_len*sizeof(WCHAR)); } - }else { + }else if(name) { ret = name; name = NULL; + }else if(msg) { + ret = msg; + msg = NULL; + }else { + ret = SysAllocString(object_errorW); + if(!V_BSTR(retv)) + hres = E_OUTOFMEMORY; } } @@ -199,20 +143,7 @@ return S_OK; } -static void Error_destructor(DispatchEx *dispex) -{ - ErrorInstance *This = (ErrorInstance*)dispex; - - VariantClear(&This->number); - VariantClear(&This->description); - VariantClear(&This->message); - heap_free(This); -} - static const builtin_prop_t Error_props[] = { - {descriptionW, Error_description, 0}, - {messageW, Error_message, 0}, - {numberW, Error_number, 0}, {toStringW, Error_toString, PROPF_METHOD} }; @@ -221,39 +152,33 @@ {NULL, Error_value, 0}, sizeof(Error_props)/sizeof(*Error_props), Error_props, - Error_destructor, + NULL, NULL }; -static const builtin_prop_t ErrorInst_props[] = { - {descriptionW, Error_description, 0}, - {messageW, Error_message, 0}, - {numberW, Error_number, 0}, -}; - static const builtin_info_t ErrorInst_info = { JSCLASS_ERROR, {NULL, Error_value, 0}, - sizeof(ErrorInst_props)/sizeof(*ErrorInst_props), - ErrorInst_props, - Error_destructor, + 0, + NULL, + NULL, NULL }; static HRESULT alloc_error(script_ctx_t *ctx, DispatchEx *prototype, - DispatchEx *constr, ErrorInstance **ret) + DispatchEx *constr, DispatchEx **ret) { - ErrorInstance *err; + DispatchEx *err; HRESULT hres; - err = heap_alloc_zero(sizeof(ErrorInstance)); + err = heap_alloc_zero(sizeof(*err)); if(!err) return E_OUTOFMEMORY; if(prototype) - hres = init_dispex(&err->dispex, ctx, &Error_info, prototype); + hres = init_dispex(err, ctx, &Error_info, prototype); else - hres = init_dispex_from_constr(&err->dispex, ctx, &ErrorInst_info, + hres = init_dispex_from_constr(err, ctx, &ErrorInst_info, constr ? constr : ctx->error_constr); if(FAILED(hres)) { heap_free(err); @@ -265,46 +190,54 @@ } static HRESULT create_error(script_ctx_t *ctx, DispatchEx *constr, - const UINT *number, const WCHAR *msg, DispatchEx **ret) + UINT number, const WCHAR *msg, DispatchEx **ret) { - ErrorInstance *err; + DispatchEx *err; + VARIANT v; HRESULT hres; hres = alloc_error(ctx, NULL, constr, &err); if(FAILED(hres)) return hres; - if(number) { - V_VT(&err->number) = VT_I4; - V_I4(&err->number) = *number; + V_VT(&v) = VT_I4; + V_I4(&v) = number; + hres = jsdisp_propput_name(err, numberW, &v, NULL/*FIXME*/, NULL/*FIXME*/); + if(FAILED(hres)) { + jsdisp_release(err); + return hres; } - V_VT(&err->message) = VT_BSTR; - if(msg) V_BSTR(&err->message) = SysAllocString(msg); - else V_BSTR(&err->message) = SysAllocStringLen(NULL, 0); - - VariantCopy(&err->description, &err->message); - - if(!V_BSTR(&err->message)) { - heap_free(err); - return E_OUTOFMEMORY; + V_VT(&v) = VT_BSTR; + if(msg) V_BSTR(&v) = SysAllocString(msg); + else V_BSTR(&v) = SysAllocStringLen(NULL, 0); + if(V_BSTR(&v)) { + hres = jsdisp_propput_name(err, messageW, &v, NULL/*FIXME*/, NULL/*FIXME*/); + if(SUCCEEDED(hres)) + hres = jsdisp_propput_name(err, descriptionW, &v, NULL/*FIXME*/, NULL/*FIXME*/); + SysFreeString(V_BSTR(&v)); + }else { + hres = E_OUTOFMEMORY; + } + if(FAILED(hres)) { + jsdisp_release(err); + return hres; } - *ret = &err->dispex; + *ret = err; return S_OK; } static HRESULT error_constr(script_ctx_t *ctx, WORD flags, DISPPARAMS *dp, VARIANT *retv, jsexcept_t *ei, DispatchEx *constr) { DispatchEx *err; - VARIANT numv; - UINT num; + UINT num = 0; BSTR msg = NULL; HRESULT hres; - V_VT(&numv) = VT_NULL; - if(arg_cnt(dp)) { + VARIANT numv; + hres = to_number(ctx, get_arg(dp, 0), ei, &numv); if(FAILED(hres) || (V_VT(&numv)==VT_R8 && isnan(V_R8(&numv)))) hres = to_string(ctx, get_arg(dp, 0), ei, &msg); @@ -326,10 +259,7 @@ switch(flags) { case INVOKE_FUNC: case DISPATCH_CONSTRUCT: - if(V_VT(&numv) == VT_NULL) - hres = create_error(ctx, constr, NULL, msg, &err); - else - hres = create_error(ctx, constr, &num, msg, &err); + hres = create_error(ctx, constr, num, msg, &err); SysFreeString(msg); if(FAILED(hres)) @@ -426,7 +356,7 @@ RangeErrorConstr_value, ReferenceErrorConstr_value, RegExpErrorConstr_value, SyntaxErrorConstr_value, TypeErrorConstr_value, URIErrorConstr_value}; - ErrorInstance *err; + DispatchEx *err; INT i; VARIANT v; HRESULT hres; @@ -439,17 +369,17 @@ V_VT(&v) = VT_BSTR; V_BSTR(&v) = SysAllocString(names[i]); if(!V_BSTR(&v)) { - jsdisp_release(&err->dispex); + jsdisp_release(err); return E_OUTOFMEMORY; } - hres = jsdisp_propput_name(&err->dispex, nameW, &v, NULL/*FIXME*/, NULL/*FIXME*/); + hres = jsdisp_propput_name(err, nameW, &v, NULL/*FIXME*/, NULL/*FIXME*/); if(SUCCEEDED(hres)) hres = create_builtin_function(ctx, constr_val[i], names[i], NULL, - PROPF_CONSTR|1, &err->dispex, constr_addr[i]); + PROPF_CONSTR|1, err, constr_addr[i]); - jsdisp_release(&err->dispex); + jsdisp_release(err); VariantClear(&v); if(FAILED(hres)) return hres; @@ -477,7 +407,7 @@ WARN("%s\n", debugstr_w(buf)); id |= JSCRIPT_ERROR; - hres = create_error(ctx, constr, &id, buf, &err); + hres = create_error(ctx, constr, id, buf, &err); if(FAILED(hres)) return hres; diff -Nru wine1.3-1.3.0/dlls/jscript/global.c wine1.3-1.3.1/dlls/jscript/global.c --- wine1.3-1.3.0/dlls/jscript/global.c 2010-07-30 18:43:56.000000000 +0100 +++ wine1.3-1.3.1/dlls/jscript/global.c 2010-08-20 18:23:50.000000000 +0100 @@ -118,42 +118,6 @@ return S_OK; } -static HRESULT JSGlobal_NaN(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, DISPPARAMS *dp, - VARIANT *retv, jsexcept_t *ei, IServiceProvider *sp) -{ - TRACE("\n"); - - switch(flags) { - case DISPATCH_PROPERTYGET: - num_set_nan(retv); - break; - - default: - FIXME("unimplemented flags %x\n", flags); - return E_NOTIMPL; - } - - return S_OK; -} - -static HRESULT JSGlobal_Infinity(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, DISPPARAMS *dp, - VARIANT *retv, jsexcept_t *ei, IServiceProvider *sp) -{ - TRACE("\n"); - - switch(flags) { - case DISPATCH_PROPERTYGET: - num_set_inf(retv, TRUE); - break; - - default: - FIXME("unimplemented flags %x\n", flags); - return E_NOTIMPL; - } - - return S_OK; -} - static HRESULT JSGlobal_Array(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, DISPPARAMS *dp, VARIANT *retv, jsexcept_t *ei, IServiceProvider *sp) { @@ -1063,9 +1027,6 @@ {EvalErrorW, JSGlobal_EvalError, PROPF_CONSTR|1}, {FunctionW, JSGlobal_Function, PROPF_CONSTR|1}, {_GetObjectW, JSGlobal_GetObject, PROPF_METHOD|2}, - {InfinityW, JSGlobal_Infinity, 0}, -/* {MathW, JSGlobal_Math, 0}, */ - {NaNW, JSGlobal_NaN, 0}, {NumberW, JSGlobal_Number, PROPF_CONSTR|1}, {ObjectW, JSGlobal_Object, PROPF_CONSTR|1}, {RangeErrorW, JSGlobal_RangeError, PROPF_CONSTR|1}, @@ -1175,15 +1136,24 @@ if(FAILED(hres)) return hres; + V_VT(&var) = VT_DISPATCH; + V_DISPATCH(&var) = (IDispatch*)_IDispatchEx_(math); + hres = jsdisp_propput_name(ctx->global, MathW, &var, NULL/*FIXME*/, NULL/*FIXME*/); + jsdisp_release(math); + if(FAILED(hres)) + return hres; + V_VT(&var) = VT_EMPTY; hres = jsdisp_propput_name(ctx->global, undefinedW, &var, NULL/*FIXME*/, NULL/*FIXME*/); if(FAILED(hres)) return hres; - V_VT(&var) = VT_DISPATCH; - V_DISPATCH(&var) = (IDispatch*)_IDispatchEx_(math); - hres = jsdisp_propput_name(ctx->global, MathW, &var, NULL/*FIXME*/, NULL/*FIXME*/); - jsdisp_release(math); + num_set_nan(&var); + hres = jsdisp_propput_name(ctx->global, NaNW, &var, NULL/*FIXME*/, NULL/*FIXME*/); + if(FAILED(hres)) + return hres; + num_set_inf(&var, TRUE); + hres = jsdisp_propput_name(ctx->global, InfinityW, &var, NULL/*FIXME*/, NULL/*FIXME*/); return hres; } diff -Nru wine1.3-1.3.0/dlls/jscript/jscript_De.rc wine1.3-1.3.1/dlls/jscript/jscript_De.rc --- wine1.3-1.3.0/dlls/jscript/jscript_De.rc 2010-07-30 18:43:56.000000000 +0100 +++ wine1.3-1.3.1/dlls/jscript/jscript_De.rc 2010-08-20 18:23:50.000000000 +0100 @@ -28,6 +28,7 @@ IDS_INVALID_CALL_ARG "Ungültiger Funktionsaufruf oder Argument" IDS_CREATE_OBJ_ERROR "Automatisierungsserver konnte das Objekt nicht erstellen" IDS_NO_PROPERTY "Das Objekt unterstützt diese Eigenschaft oder Methode nicht" + IDS_UNSUPPORTED_ACTION "Das Objekt unterstützt diese Aktion nicht" IDS_ARG_NOT_OPT "Argument nicht optional" IDS_SYNTAX_ERROR "Syntax Fehler" IDS_SEMICOLON "';' erwartet" diff -Nru wine1.3-1.3.0/dlls/jscript/jscript_En.rc wine1.3-1.3.1/dlls/jscript/jscript_En.rc --- wine1.3-1.3.0/dlls/jscript/jscript_En.rc 2010-07-30 18:43:56.000000000 +0100 +++ wine1.3-1.3.1/dlls/jscript/jscript_En.rc 2010-08-20 18:23:50.000000000 +0100 @@ -26,6 +26,7 @@ IDS_INVALID_CALL_ARG "Invalid procedure call or argument" IDS_CREATE_OBJ_ERROR "Automation server can't create object" IDS_NO_PROPERTY "Object doesn't support this property or method" + IDS_UNSUPPORTED_ACTION "Object doesn't support this action" IDS_ARG_NOT_OPT "Argument not optional" IDS_SYNTAX_ERROR "Syntax error" IDS_SEMICOLON "Expected ';'" diff -Nru wine1.3-1.3.0/dlls/jscript/jscript_Fr.rc wine1.3-1.3.1/dlls/jscript/jscript_Fr.rc --- wine1.3-1.3.0/dlls/jscript/jscript_Fr.rc 2010-07-30 18:43:56.000000000 +0100 +++ wine1.3-1.3.1/dlls/jscript/jscript_Fr.rc 2010-08-20 18:23:50.000000000 +0100 @@ -1,7 +1,7 @@ /* * French resources for jscript * - * Copyright 2009 Frédéric Delanoy + * Copyright 2009-2010 Frédéric Delanoy * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public @@ -31,6 +31,7 @@ IDS_INVALID_CALL_ARG "Appel de procédure ou argument invalide" IDS_CREATE_OBJ_ERROR "Le serveur d'automatisation ne peut créer l'objet" IDS_NO_PROPERTY "Cet objet ne supporte pas cette propriété ou méthode" + IDS_UNSUPPORTED_ACTION "Cet objet ne supporte pas cette action" IDS_ARG_NOT_OPT "Argument non optionnel" IDS_SYNTAX_ERROR "Erreur de syntaxe" IDS_SEMICOLON "« ; » attendu" diff -Nru wine1.3-1.3.0/dlls/jscript/jscript_It.rc wine1.3-1.3.1/dlls/jscript/jscript_It.rc --- wine1.3-1.3.0/dlls/jscript/jscript_It.rc 2010-07-30 18:43:56.000000000 +0100 +++ wine1.3-1.3.1/dlls/jscript/jscript_It.rc 2010-08-20 18:23:50.000000000 +0100 @@ -30,6 +30,7 @@ IDS_INVALID_CALL_ARG "Chiamata o argomento di procedura non valido" IDS_CREATE_OBJ_ERROR "Il server di automazione non può creare l'oggetto" IDS_NO_PROPERTY "L'oggetto non supporta questa proprietà o metodo" + IDS_UNSUPPORTED_ACTION "L'oggetto non supporta questa azione" IDS_ARG_NOT_OPT "Argomento non opzionale" IDS_SYNTAX_ERROR "Errore di sintassi" IDS_SEMICOLON "Richiesto ';'" diff -Nru wine1.3-1.3.0/dlls/jscript/jscript_Lt.rc wine1.3-1.3.1/dlls/jscript/jscript_Lt.rc --- wine1.3-1.3.0/dlls/jscript/jscript_Lt.rc 2010-07-30 18:43:56.000000000 +0100 +++ wine1.3-1.3.1/dlls/jscript/jscript_Lt.rc 2010-08-20 18:23:50.000000000 +0100 @@ -1,5 +1,5 @@ /* - * Copyright 2009 Aurimas Fišeras + * Copyright 2009-2010 Aurimas Fišeras * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public @@ -29,6 +29,7 @@ IDS_INVALID_CALL_ARG "Netinkamas kreipinys į procedūrą ar argumentas" IDS_CREATE_OBJ_ERROR "Automatizacijos serveriui nepavyko sukurti objekto" IDS_NO_PROPERTY "Objektas nepalaiko šios savybės ar metodo" + IDS_UNSUPPORTED_ACTION "Objektas nepalaiko šio veiksmo" IDS_ARG_NOT_OPT "Argumentas nėra neprivalomas" IDS_SYNTAX_ERROR "Sintaksės klaida" IDS_SEMICOLON "Tikėtasi „;“" diff -Nru wine1.3-1.3.0/dlls/jscript/jscript_Sv.rc wine1.3-1.3.1/dlls/jscript/jscript_Sv.rc --- wine1.3-1.3.0/dlls/jscript/jscript_Sv.rc 1970-01-01 01:00:00.000000000 +0100 +++ wine1.3-1.3.1/dlls/jscript/jscript_Sv.rc 2010-08-20 18:23:50.000000000 +0100 @@ -0,0 +1,50 @@ +/* + * Copyright 2010 Anders Jonsson + * + * 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 "resource.h" + +#pragma code_page(65001) + +LANGUAGE LANG_SWEDISH, SUBLANG_NEUTRAL + +STRINGTABLE +{ + IDS_TO_PRIMITIVE "Kunde inte konvertera objekt till primitiv typ" + IDS_INVALID_CALL_ARG "Ogiltigt funktionsanrop eller argument" + IDS_CREATE_OBJ_ERROR "Automationsservern kunde inte skapa objekt" + IDS_NO_PROPERTY "Objektet stöder inte denna egenskap eller metod" + IDS_UNSUPPORTED_ACTION "Objektet stöder inte denna handling" + IDS_ARG_NOT_OPT "Argumentet är inte valfritt" + IDS_SYNTAX_ERROR "Syntaxfel" + IDS_SEMICOLON "';' förväntades" + IDS_LBRACKET "'(' förväntades" + IDS_RBRACKET "')' förväntades" + IDS_UNTERMINATED_STR "Oterminerad strängkonstant" + IDS_NOT_FUNC "Funktion förväntades" + IDS_NOT_DATE "'[object]' är inte ett datumobjekt" + IDS_NOT_NUM "Nummer förväntades" + IDS_OBJECT_EXPECTED "Objekt förväntades" + IDS_ILLEGAL_ASSIGN "Ogiltig tilldelning" + IDS_UNDEFINED "'|' är odefinierat" + IDS_NOT_BOOL "Boolskt objekt förväntades" + IDS_JSCRIPT_EXPECTED "JScript-objekt förväntades" + IDS_REGEXP_SYNTAX_ERROR "Syntaxfel i reguljärt uttryck" + IDS_URI_INVALID_CHAR "Den URI som ska kodas innehåller ogiltiga tecken" + IDS_INVALID_LENGTH "Array-längd måste vara ett positivt ändligt heltal" + IDS_ARRAY_EXPECTED "Array-objekt förväntades" +} diff -Nru wine1.3-1.3.0/dlls/jscript/jscript_Uk.rc wine1.3-1.3.1/dlls/jscript/jscript_Uk.rc --- wine1.3-1.3.0/dlls/jscript/jscript_Uk.rc 2010-07-30 18:43:56.000000000 +0100 +++ wine1.3-1.3.1/dlls/jscript/jscript_Uk.rc 2010-08-20 18:23:50.000000000 +0100 @@ -30,6 +30,7 @@ IDS_INVALID_CALL_ARG "Невірний виклик процедури або аргумент" IDS_CREATE_OBJ_ERROR "Сервер автоматизації не може створити об'єкт" IDS_NO_PROPERTY "Об'єкт не підтримує цю властивість чи метод" + IDS_UNSUPPORTED_ACTION "Об'єкт не підтримує цю дію" IDS_ARG_NOT_OPT "Відсутній обов'язковий аргумент" IDS_SYNTAX_ERROR "Синтаксична помилка" IDS_SEMICOLON "Очікується ';'" diff -Nru wine1.3-1.3.0/dlls/jscript/Makefile.in wine1.3-1.3.1/dlls/jscript/Makefile.in --- wine1.3-1.3.0/dlls/jscript/Makefile.in 2010-07-30 18:43:56.000000000 +0100 +++ wine1.3-1.3.1/dlls/jscript/Makefile.in 2010-08-20 18:23:50.000000000 +0100 @@ -23,6 +23,7 @@ jscript_Ro.rc \ jscript_Ru.rc \ jscript_Si.rc \ + jscript_Sv.rc \ jscript_Uk.rc \ rsrc.rc diff -Nru wine1.3-1.3.0/dlls/jscript/resource.h wine1.3-1.3.1/dlls/jscript/resource.h --- wine1.3-1.3.0/dlls/jscript/resource.h 2010-07-30 18:43:56.000000000 +0100 +++ wine1.3-1.3.1/dlls/jscript/resource.h 2010-08-20 18:23:50.000000000 +0100 @@ -22,6 +22,7 @@ #define IDS_INVALID_CALL_ARG 0x0005 #define IDS_CREATE_OBJ_ERROR 0x01AD #define IDS_NO_PROPERTY 0x01B6 +#define IDS_UNSUPPORTED_ACTION 0x01BD #define IDS_ARG_NOT_OPT 0x01c1 #define IDS_SYNTAX_ERROR 0x03EA #define IDS_SEMICOLON 0x03EC diff -Nru wine1.3-1.3.0/dlls/jscript/tests/api.js wine1.3-1.3.1/dlls/jscript/tests/api.js --- wine1.3-1.3.0/dlls/jscript/tests/api.js 2010-07-30 18:43:56.000000000 +0100 +++ wine1.3-1.3.1/dlls/jscript/tests/api.js 2010-08-20 18:23:50.000000000 +0100 @@ -1772,10 +1772,22 @@ ok(err.toString() === (invokeVersion < 2 ? "[object Error]" : "Error: message"), "err.toString() = " + err.toString()); err = new Error(123); ok(err.number === 123, "err.number = " + err.number); +err.number = 254; +ok(err.number === 254, "err.number = " + err.number); err = new Error(0, "message"); ok(err.number === 0, "err.number = " + err.number); ok(err.message === "message", "err.message = " + err.message); ok(err.description === "message", "err.description = " + err.description); +err = new Error(); +ok(err.number === 0, "err.number = " + err.number); +ok(err.description === "", "err.description = " + err.description); +err.description = 5; +ok(err.description === 5, "err.description = " + err.description); +ok(err.message === "", "err.message = " + err.message); +err.message = 4; +ok(err.message === 4, "err.message = " + err.message); + +ok(!("number" in Error), "number is in Error"); tmp = new Object(); tmp.toString = function() { return "test"; }; @@ -1783,6 +1795,33 @@ tmp = Error.prototype.toString.call(tmp); ok(tmp === "[object Error]", "Error.prototype.toString.call(tmp) = " + tmp); +if(invokeVersion >= 2) { + obj = new Object(); + obj.name = "test"; + tmp = Error.prototype.toString.call(obj); + ok(tmp === "test", "Error.prototype.toString.call(obj) = " + tmp); + + obj = new Object(); + obj.name = 6; + obj.message = false; + tmp = Error.prototype.toString.call(obj); + ok(tmp === "6: false", "Error.prototype.toString.call(obj) = " + tmp); + + obj = new Object(); + obj.message = "test"; + tmp = Error.prototype.toString.call(obj); + ok(tmp === "test", "Error.prototype.toString.call(obj) = " + tmp); + + obj = new Object(); + obj.name = ""; + obj.message = "test"; + tmp = Error.prototype.toString.call(obj); + ok(tmp === "test", "Error.prototype.toString.call(obj) = " + tmp); +} + +tmp = Error.prototype.toString.call(testObj); +ok(tmp === "[object Error]", "Error.prototype.toString.call(testObj) = " + tmp); + err = new Error(); err.name = null; ok(err.name === null, "err.name = " + err.name + " expected null"); @@ -1849,6 +1888,12 @@ exception_test(function() {eval("nonexistingfunc()")}, "TypeError", -2146823281); exception_test(function() {RegExp(/a/, "g");}, "RegExpError", -2146823271); exception_test(function() {encodeURI('\udcaa');}, "URIError", -2146823264); +exception_test(function() {(new Object()) instanceof 3;}, "TypeError", -2146823286); +exception_test(function() {(new Object()) instanceof null;}, "TypeError", -2146823286); +exception_test(function() {(new Object()) instanceof nullDisp;}, "TypeError", -2146823286); +exception_test(function() {"test" in 3;}, "TypeError", -2146823281); +exception_test(function() {"test" in null;}, "TypeError", -2146823281); +exception_test(function() {"test" in nullDisp;}, "TypeError", -2146823281); function testThisExcept(func, number) { exception_test(function() {func.call(new Object())}, "TypeError", number); diff -Nru wine1.3-1.3.0/dlls/jscript/tests/jscript.c wine1.3-1.3.1/dlls/jscript/tests/jscript.c --- wine1.3-1.3.0/dlls/jscript/tests/jscript.c 2010-07-30 18:43:56.000000000 +0100 +++ wine1.3-1.3.1/dlls/jscript/tests/jscript.c 2010-08-20 18:23:50.000000000 +0100 @@ -335,7 +335,10 @@ hres = IActiveScript_QueryInterface(engine, &IID_IActiveScriptProperty, (void**)&script_prop); - ok(hres == S_OK, "Could not get IActiveScriptProperty iface: %08x\n", hres); + if(FAILED(hres)) { + win_skip("IActiveScriptProperty not supported\n"); + return E_NOTIMPL; + } hres = IActiveScriptProperty_SetProperty(script_prop, property, NULL, val); IActiveScriptProperty_Release(script_prop); diff -Nru wine1.3-1.3.0/dlls/jscript/tests/lang.js wine1.3-1.3.1/dlls/jscript/tests/lang.js --- wine1.3-1.3.0/dlls/jscript/tests/lang.js 2010-07-30 18:43:56.000000000 +0100 +++ wine1.3-1.3.1/dlls/jscript/tests/lang.js 2010-08-20 18:23:50.000000000 +0100 @@ -1044,4 +1044,13 @@ undefined = 6; ok(undefined === 6, "undefined = " + undefined); +NaN = 6; +ok(NaN === 6, "NaN !== 6"); + +Infinity = 6; +ok(Infinity === 6, "Infinity !== 6"); + +Math = 6; +ok(Math === 6, "NaN !== 6"); + reportSuccess(); diff -Nru wine1.3-1.3.0/dlls/kernel32/comm.c wine1.3-1.3.1/dlls/kernel32/comm.c --- wine1.3-1.3.0/dlls/kernel32/comm.c 2010-07-30 18:43:56.000000000 +0100 +++ wine1.3-1.3.1/dlls/kernel32/comm.c 2010-08-20 18:23:50.000000000 +0100 @@ -1138,7 +1138,7 @@ HANDLE hFile, /* [in] handle of the comm port */ LPCOMMPROP lpCommProp) /* [out] pointer to struct to be filled */ { - FIXME("(%p %p )\n",hFile,lpCommProp); + TRACE("(%p %p)\n",hFile,lpCommProp); if(!lpCommProp) return FALSE; @@ -1150,7 +1150,6 @@ lpCommProp->wPacketLength = 1; lpCommProp->wPacketVersion = 1; lpCommProp->dwServiceMask = SP_SERIALCOMM; - lpCommProp->dwReserved1 = 0; lpCommProp->dwMaxTxQueue = 4096; lpCommProp->dwMaxRxQueue = 4096; lpCommProp->dwMaxBaud = BAUD_115200; diff -Nru wine1.3-1.3.0/dlls/kernel32/file.c wine1.3-1.3.1/dlls/kernel32/file.c --- wine1.3-1.3.0/dlls/kernel32/file.c 2010-07-30 18:43:56.000000000 +0100 +++ wine1.3-1.3.1/dlls/kernel32/file.c 2010-08-20 18:23:50.000000000 +0100 @@ -1001,6 +1001,16 @@ } /*********************************************************************** + * SetFileValidData (KERNEL32.@) + */ +BOOL WINAPI SetFileValidData( HANDLE hFile, LONGLONG ValidDataLength ) +{ + FIXME("stub: %p, %s\n", hFile, wine_dbgstr_longlong(ValidDataLength)); + SetLastError(ERROR_CALL_NOT_IMPLEMENTED); + return FALSE; +} + +/*********************************************************************** * GetFileTime (KERNEL32.@) */ BOOL WINAPI GetFileTime( HANDLE hFile, FILETIME *lpCreationTime, diff -Nru wine1.3-1.3.0/dlls/kernel32/kernel32.spec wine1.3-1.3.1/dlls/kernel32/kernel32.spec --- wine1.3-1.3.0/dlls/kernel32/kernel32.spec 2010-07-30 18:43:56.000000000 +0100 +++ wine1.3-1.3.1/dlls/kernel32/kernel32.spec 2010-08-20 18:23:50.000000000 +0100 @@ -1030,7 +1030,7 @@ # @ stub SetFileShortNameA # @ stub SetFileShortNameW @ stdcall SetFileTime(long ptr ptr ptr) -# @ stub SetFileValidData +@ stdcall SetFileValidData(ptr double) # @ stub SetFirmwareEnvironmentVariableA # @ stub SetFirmwareEnvironmentVariableW @ stdcall SetHandleContext(long long) diff -Nru wine1.3-1.3.0/dlls/kernel32/process.c wine1.3-1.3.1/dlls/kernel32/process.c --- wine1.3-1.3.0/dlls/kernel32/process.c 2010-07-30 18:43:56.000000000 +0100 +++ wine1.3-1.3.1/dlls/kernel32/process.c 2010-08-20 18:23:50.000000000 +0100 @@ -70,8 +70,6 @@ DWORD dwReserved; } LOADPARMS32; -static UINT process_error_mode; - static DWORD shutdown_flags = 0; static DWORD shutdown_priority = 0x280; static BOOL is_wow64; @@ -2450,8 +2448,12 @@ */ UINT WINAPI SetErrorMode( UINT mode ) { - UINT old = process_error_mode; - process_error_mode = mode; + UINT old; + + NtQueryInformationProcess( GetCurrentProcess(), ProcessDefaultHardErrorMode, + &old, sizeof(old), NULL ); + NtSetInformationProcess( GetCurrentProcess(), ProcessDefaultHardErrorMode, + &mode, sizeof(mode) ); return old; } @@ -2460,7 +2462,11 @@ */ UINT WINAPI GetErrorMode( void ) { - return process_error_mode; + UINT mode; + + NtQueryInformationProcess( GetCurrentProcess(), ProcessDefaultHardErrorMode, + &mode, sizeof(mode), NULL ); + return mode; } /********************************************************************** diff -Nru wine1.3-1.3.0/dlls/kernel32/tests/volume.c wine1.3-1.3.1/dlls/kernel32/tests/volume.c --- wine1.3-1.3.0/dlls/kernel32/tests/volume.c 2010-07-30 18:43:56.000000000 +0100 +++ wine1.3-1.3.1/dlls/kernel32/tests/volume.c 2010-08-20 18:23:50.000000000 +0100 @@ -293,9 +293,9 @@ { BOOL ret; UINT result; - char Root_Dir0[]="C:"; - char Root_Dir1[]="C:\\"; - char Root_Dir2[]="\\\\?\\C:\\"; + char Root_Colon[]="C:"; + char Root_Slash[]="C:\\"; + char Root_UNC[]="\\\\?\\C:\\"; char volume[MAX_PATH+1]; DWORD vol_name_size=MAX_PATH+1, vol_serial_num=-1, max_comp_len=0, fs_flags=0, fs_name_len=MAX_PATH+1; char vol_name_buf[MAX_PATH+1], fs_name_buf[MAX_PATH+1]; @@ -311,40 +311,27 @@ result = GetWindowsDirectory(windowsdir, sizeof(windowsdir)); ok(result < sizeof(windowsdir), "windowsdir is abnormally long!\n"); ok(result != 0, "GetWindowsDirectory: error %d\n", GetLastError()); - Root_Dir0[0] = windowsdir[0]; - Root_Dir1[0] = windowsdir[0]; - Root_Dir2[4] = windowsdir[0]; + Root_Colon[0] = windowsdir[0]; + Root_Slash[0] = windowsdir[0]; + Root_UNC[4] = windowsdir[0]; result = GetCurrentDirectory(MAX_PATH, currentdir); ok(result, "GetCurrentDirectory: error %d\n", GetLastError()); - - /* **** now start the tests **** */ - /* check for error on no trailing \ */ - if (result > 3) - { - SetLastError(0xdeadbeef); - ret = pGetVolumeInformationA(Root_Dir0, vol_name_buf, vol_name_size, NULL, - NULL, NULL, fs_name_buf, fs_name_len); - ok(!ret && (GetLastError() == ERROR_INVALID_NAME || - broken(GetLastError() == ERROR_BAD_PATHNAME/* win9x */)), - "GetVolumeInformationA w/o '\\' did%s fail, last error %u\n", ret ? " not":"", GetLastError()); - } - else - skip("Running on a root directory\n"); + /* Note that GetCurrentDir yields no trailing slash for subdirs */ /* check for NO error on no trailing \ when current dir is root dir */ - ret = SetCurrentDirectory(Root_Dir1); + ret = SetCurrentDirectory(Root_Slash); ok(ret, "SetCurrentDirectory: error %d\n", GetLastError()); - ret = pGetVolumeInformationA(Root_Dir0, vol_name_buf, vol_name_size, NULL, + ret = pGetVolumeInformationA(Root_Colon, vol_name_buf, vol_name_size, NULL, NULL, NULL, fs_name_buf, fs_name_len); todo_wine - ok(ret, "GetVolumeInformationA failed, last error %u\n", GetLastError()); + ok(ret, "GetVolumeInformationA root failed, last error %u\n", GetLastError()); - /* check for error on no trailing \ when current dir is windows dir */ + /* check for error on no trailing \ when current dir is subdir (windows) of queried drive */ ret = SetCurrentDirectory(windowsdir); ok(ret, "SetCurrentDirectory: error %d\n", GetLastError()); SetLastError(0xdeadbeef); - ret = pGetVolumeInformationA(Root_Dir0, vol_name_buf, vol_name_size, NULL, + ret = pGetVolumeInformationA(Root_Colon, vol_name_buf, vol_name_size, NULL, NULL, NULL, fs_name_buf, fs_name_len); ok(!ret && (GetLastError() == ERROR_INVALID_NAME || broken(GetLastError() == ERROR_BAD_PATHNAME/* win9x */)), @@ -354,30 +341,95 @@ ret = SetCurrentDirectory(currentdir); ok(ret, "SetCurrentDirectory: error %d\n", GetLastError()); + if (toupper(currentdir[0]) == toupper(windowsdir[0])) { + skip("Please re-run from another device than %c:\n", windowsdir[0]); + /* FIXME: Use GetLogicalDrives to find another device to avoid this skip. */ + } else { + char Root_Env[]="=C:"; /* where MS maintains the per volume directory */ + Root_Env[1] = windowsdir[0]; + + /* C:\windows becomes the current directory on drive C: */ + /* Note that paths to subdirs are stored without trailing slash, like what GetCurrentDir yields. */ + ret = SetEnvironmentVariable(Root_Env, windowsdir); + ok(ret, "SetEnvironmentVariable %s failed\n", Root_Env); + + ret = SetCurrentDirectory(windowsdir); + ok(ret, "SetCurrentDirectory: error %d\n", GetLastError()); + ret = SetCurrentDirectory(currentdir); + ok(ret, "SetCurrentDirectory: error %d\n", GetLastError()); + + /* windows dir is current on the root drive, call fails */ + SetLastError(0xdeadbeef); + ret = pGetVolumeInformationA(Root_Colon, vol_name_buf, vol_name_size, NULL, + NULL, NULL, fs_name_buf, fs_name_len); + ok(!ret && (GetLastError() == ERROR_INVALID_NAME || + broken(GetLastError() == ERROR_BAD_PATHNAME/* Win9x */)), + "GetVolumeInformationA did%s fail, last error %u\n", ret ? " not":"", GetLastError()); + + /* Try normal drive letter with trailing \ */ + ret = pGetVolumeInformationA(Root_Slash, vol_name_buf, vol_name_size, NULL, + NULL, NULL, fs_name_buf, fs_name_len); + ok(ret, "GetVolumeInformationA with \\ failed, last error %u\n", GetLastError()); + + ret = SetCurrentDirectory(Root_Slash); + ok(ret, "SetCurrentDirectory: error %d\n", GetLastError()); + ret = SetCurrentDirectory(currentdir); + ok(ret, "SetCurrentDirectory: error %d\n", GetLastError()); + + /* windows dir is STILL CURRENT on root drive; the call fails as before, */ + /* proving that SetCurrentDir did not remember the other drive's directory */ + SetLastError(0xdeadbeef); + ret = pGetVolumeInformationA(Root_Colon, vol_name_buf, vol_name_size, NULL, + NULL, NULL, fs_name_buf, fs_name_len); + ok(!ret && (GetLastError() == ERROR_INVALID_NAME || + broken(GetLastError() == ERROR_BAD_PATHNAME/* Win9x */)), + "GetVolumeInformationA did%s fail, last error %u\n", ret ? " not":"", GetLastError()); + + /* Now C:\ becomes the current directory on drive C: */ + ret = SetEnvironmentVariable(Root_Env, Root_Slash); /* set =C:=C:\ */ + ok(ret, "SetEnvironmentVariable %s failed\n", Root_Env); + + /* \ is current on root drive, call succeeds */ + ret = pGetVolumeInformationA(Root_Colon, vol_name_buf, vol_name_size, NULL, + NULL, NULL, fs_name_buf, fs_name_len); + todo_wine ok(ret, "GetVolumeInformationA failed, last error %u\n", GetLastError()); + + /* again, SetCurrentDirectory on another drive does not matter */ + ret = SetCurrentDirectory(Root_Slash); + ok(ret, "SetCurrentDirectory: error %d\n", GetLastError()); + ret = SetCurrentDirectory(currentdir); + ok(ret, "SetCurrentDirectory: error %d\n", GetLastError()); + + /* \ is current on root drive, call succeeds */ + ret = pGetVolumeInformationA(Root_Colon, vol_name_buf, vol_name_size, NULL, + NULL, NULL, fs_name_buf, fs_name_len); + todo_wine ok(ret, "GetVolumeInformationA failed, last error %u\n", GetLastError()); + } + /* try null root directory to return "root of the current directory" */ ret = pGetVolumeInformationA(NULL, vol_name_buf, vol_name_size, NULL, NULL, NULL, fs_name_buf, fs_name_len); ok(ret, "GetVolumeInformationA failed on null root dir, last error %u\n", GetLastError()); /* Try normal drive letter with trailing \ */ - ret = pGetVolumeInformationA(Root_Dir1, vol_name_buf, vol_name_size, + ret = pGetVolumeInformationA(Root_Slash, vol_name_buf, vol_name_size, &vol_serial_num, &max_comp_len, &fs_flags, fs_name_buf, fs_name_len); - ok(ret, "GetVolumeInformationA failed, root=%s, last error=%u\n", Root_Dir1, GetLastError()); + ok(ret, "GetVolumeInformationA failed, root=%s, last error=%u\n", Root_Slash, GetLastError()); /* try again with drive letter and the "disable parsing" prefix */ SetLastError(0xdeadbeef); - ret = pGetVolumeInformationA(Root_Dir2, vol_name_buf, vol_name_size, + ret = pGetVolumeInformationA(Root_UNC, vol_name_buf, vol_name_size, &vol_serial_num, &max_comp_len, &fs_flags, fs_name_buf, fs_name_len); todo_wine ok(ret || broken(!ret /* win9x */ && GetLastError()==ERROR_BAD_NETPATH), - "GetVolumeInformationA did%s fail, root=%s, last error=%u\n", ret ? " not":"", Root_Dir2, GetLastError()); + "GetVolumeInformationA did%s fail, root=%s, last error=%u\n", ret ? " not":"", Root_UNC, GetLastError()); /* try again with device name space */ - Root_Dir2[2] = '.'; + Root_UNC[2] = '.'; SetLastError(0xdeadbeef); - ret = pGetVolumeInformationA(Root_Dir2, vol_name_buf, vol_name_size, + ret = pGetVolumeInformationA(Root_UNC, vol_name_buf, vol_name_size, &vol_serial_num, &max_comp_len, &fs_flags, fs_name_buf, fs_name_len); todo_wine ok(ret || broken(!ret /* win9x */ && GetLastError()==ERROR_BAD_NETPATH), - "GetVolumeInformationA did%s fail, root=%s, last error=%u\n", ret ? " not":"", Root_Dir2, GetLastError()); + "GetVolumeInformationA did%s fail, root=%s, last error=%u\n", ret ? " not":"", Root_UNC, GetLastError()); /* try again with a directory off the root - should generate error */ if (windowsdir[strlen(windowsdir)-1] != '\\') strcat(windowsdir, "\\"); @@ -385,7 +437,15 @@ ret = pGetVolumeInformationA(windowsdir, vol_name_buf, vol_name_size, &vol_serial_num, &max_comp_len, &fs_flags, fs_name_buf, fs_name_len); todo_wine ok(!ret && (GetLastError()==ERROR_DIR_NOT_ROOT || - /* win9x */ broken(GetLastError()==ERROR_BAD_PATHNAME)), + broken(GetLastError()==ERROR_BAD_PATHNAME/* win9x */)), + "GetVolumeInformationA did%s fail, root=%s, last error=%u\n", ret ? " not":"", windowsdir, GetLastError()); + /* A subdir with trailing \ yields DIR_NOT_ROOT instead of INVALID_NAME */ + if (windowsdir[strlen(windowsdir)-1] == '\\') windowsdir[strlen(windowsdir)-1] = 0; + SetLastError(0xdeadbeef); + ret = pGetVolumeInformationA(windowsdir, vol_name_buf, vol_name_size, + &vol_serial_num, &max_comp_len, &fs_flags, fs_name_buf, fs_name_len); + ok(!ret && (GetLastError()==ERROR_INVALID_NAME || + broken(GetLastError()==ERROR_BAD_PATHNAME/* win9x */)), "GetVolumeInformationA did%s fail, root=%s, last error=%u\n", ret ? " not":"", windowsdir, GetLastError()); if (!pGetVolumeNameForVolumeMountPointA) { @@ -393,7 +453,7 @@ return; } /* get the unique volume name for the windows drive */ - ret = pGetVolumeNameForVolumeMountPointA(Root_Dir1, volume, MAX_PATH); + ret = pGetVolumeNameForVolumeMountPointA(Root_Slash, volume, MAX_PATH); ok(ret == TRUE, "GetVolumeNameForVolumeMountPointA failed\n"); /* try again with unique volume name */ diff -Nru wine1.3-1.3.0/dlls/Makeimplib.rules.in wine1.3-1.3.1/dlls/Makeimplib.rules.in --- wine1.3-1.3.0/dlls/Makeimplib.rules.in 2010-07-30 18:43:56.000000000 +0100 +++ wine1.3-1.3.1/dlls/Makeimplib.rules.in 2010-08-20 18:23:50.000000000 +0100 @@ -9,6 +9,7 @@ DLLFLAGS = @DLLFLAGS@ DEFS = -D__WINESRC__ $(EXTRADEFS) INSTALLDIRS = $(DESTDIR)$(dlldir) +MAKEDEPFLAGS = -xo -xcross.o @MAKE_RULES@ diff -Nru wine1.3-1.3.0/dlls/mapi32/Makefile.in wine1.3-1.3.1/dlls/mapi32/Makefile.in --- wine1.3-1.3.0/dlls/mapi32/Makefile.in 2010-07-30 18:43:56.000000000 +0100 +++ wine1.3-1.3.1/dlls/mapi32/Makefile.in 2010-08-20 18:23:50.000000000 +0100 @@ -33,6 +33,7 @@ Ro.rc \ Ru.rc \ Si.rc \ + Sv.rc \ Uk.rc \ version.rc diff -Nru wine1.3-1.3.0/dlls/mapi32/Sv.rc wine1.3-1.3.1/dlls/mapi32/Sv.rc --- wine1.3-1.3.0/dlls/mapi32/Sv.rc 1970-01-01 01:00:00.000000000 +0100 +++ wine1.3-1.3.1/dlls/mapi32/Sv.rc 2010-08-20 18:23:50.000000000 +0100 @@ -0,0 +1,32 @@ +/* +* MAPI32 Swedish resources +* +* Copyright 2010 Anders Jonsson +* +* 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 "res.h" + +#pragma code_page(65001) + +LANGUAGE LANG_SWEDISH, SUBLANG_NEUTRAL + +STRINGTABLE +{ + IDS_NO_MAPI_CLIENT, "Kunde inte skicka e-post eftersom ingen MAPI-kompatibel e-postklient finns installerad." + IDS_SEND_MAIL, "Skicka e-post" +} diff -Nru wine1.3-1.3.0/dlls/mcicda/mcicda.c wine1.3-1.3.1/dlls/mcicda/mcicda.c --- wine1.3-1.3.0/dlls/mcicda/mcicda.c 2010-07-30 18:43:56.000000000 +0100 +++ wine1.3-1.3.1/dlls/mcicda/mcicda.c 2010-08-20 18:23:50.000000000 +0100 @@ -58,7 +58,7 @@ UINT wDevID; int nUseCount; /* Incremented for each shared open */ BOOL fShareable; /* TRUE if first open was shareable */ - WORD wNotifyDeviceID; /* MCI device ID with a pending notification */ + MCIDEVICEID wNotifyDeviceID; /* MCI device ID with a pending notification */ HANDLE hCallback; /* Callback handle for pending notification */ DWORD dwTimeFormat; HANDLE handle; @@ -141,17 +141,12 @@ IDirectSoundBuffer_Stop(wmcda->dsBuf); SetEvent(wmcda->stopEvent); - EnterCriticalSection(&wmcda->cs); - if (wmcda->hCallback) { - mciDriverNotify(wmcda->hCallback, wmcda->wNotifyDeviceID, - FAILED(hr) ? MCI_NOTIFY_FAILURE : - ((endPos!=lastPos) ? MCI_NOTIFY_ABORTED : - MCI_NOTIFY_SUCCESSFUL)); - wmcda->hCallback = NULL; - } - LeaveCriticalSection(&wmcda->cs); + /* A design bug in native: the independent CD player called by the + * MCI has no means to signal end of playing, therefore the MCI + * notification is left hanging. MCI_NOTIFY_SUPERSEDED will be + * signaled by the next command that has MCI_NOTIFY set (or + * MCI_NOTIFY_ABORTED for MCI_PLAY). */ - ExitThread(0); return 0; } @@ -216,6 +211,20 @@ } /************************************************************************** + * MCICDA_mciNotify [internal] + * + * Notifications in MCI work like a 1-element queue. + * Each new notification request supersedes the previous one. + */ +static void MCICDA_Notify(DWORD_PTR hWndCallBack, WINE_MCICDAUDIO* wmcda, UINT wStatus) +{ + MCIDEVICEID wDevID = wmcda->wNotifyDeviceID; + HANDLE old = InterlockedExchangePointer(&wmcda->hCallback, NULL); + if (old) mciDriverNotify(old, wDevID, MCI_NOTIFY_SUPERSEDED); + mciDriverNotify(HWND_32(LOWORD(hWndCallBack)), wDevID, wStatus); +} + +/************************************************************************** * MCICDA_GetStatus [internal] */ static DWORD MCICDA_GetStatus(WINE_MCICDAUDIO* wmcda) @@ -269,6 +278,7 @@ switch (GetLastError()) { case ERROR_NOT_READY: return MCIERR_DEVICE_NOT_READY; + case ERROR_NOT_SUPPORTED: case ERROR_IO_DEVICE: return MCIERR_HARDWARE; default: FIXME("Unknown mode %u\n", GetLastError()); @@ -383,7 +393,6 @@ return dwTime; } -static DWORD MCICDA_Seek(UINT wDevID, DWORD dwFlags, LPMCI_SEEK_PARMS lpParms); static DWORD MCICDA_Stop(UINT wDevID, DWORD dwFlags, LPMCI_GENERIC_PARMS lpParms); /************************************************************************** @@ -468,9 +477,8 @@ goto the_error; if (dwFlags & MCI_NOTIFY) { - TRACE("MCI_NOTIFY_SUCCESSFUL %08lX !\n", lpOpenParms->dwCallback); mciDriverNotify(HWND_32(LOWORD(lpOpenParms->dwCallback)), - wmcda->wNotifyDeviceID, MCI_NOTIFY_SUCCESSFUL); + dwDeviceID, MCI_NOTIFY_SUCCESSFUL); } return 0; @@ -495,6 +503,8 @@ if (--wmcda->nUseCount == 0) { CloseHandle(wmcda->handle); } + if ((dwParam & MCI_NOTIFY) && lpParms) + MCICDA_Notify(lpParms->dwCallback, wmcda, MCI_NOTIFY_SUCCESSFUL); return 0; } @@ -504,11 +514,13 @@ static DWORD MCICDA_GetDevCaps(UINT wDevID, DWORD dwFlags, LPMCI_GETDEVCAPS_PARMS lpParms) { + WINE_MCICDAUDIO* wmcda = (WINE_MCICDAUDIO*)mciGetDriverData(wDevID); DWORD ret = 0; TRACE("(%04X, %08X, %p);\n", wDevID, dwFlags, lpParms); if (lpParms == NULL) return MCIERR_NULL_PARAMETER_BLOCK; + if (wmcda == NULL) return MCIERR_INVALID_DEVICE_ID; if (dwFlags & MCI_GETDEVCAPS_ITEM) { TRACE("MCI_GETDEVCAPS_ITEM dwItem=%08X;\n", lpParms->dwItem); @@ -551,14 +563,17 @@ ret = MCI_RESOURCE_RETURNED; break; default: - ERR("Unsupported %x devCaps item\n", lpParms->dwItem); - return MCIERR_UNRECOGNIZED_COMMAND; + WARN("Unsupported %x devCaps item\n", lpParms->dwItem); + return MCIERR_UNSUPPORTED_FUNCTION; } } else { TRACE("No GetDevCaps-Item !\n"); - return MCIERR_UNRECOGNIZED_COMMAND; + return MCIERR_MISSING_PARAMETER; } TRACE("lpParms->dwReturn=%08X;\n", lpParms->dwReturn); + if (dwFlags & MCI_NOTIFY) { + MCICDA_Notify(lpParms->dwCallback, wmcda, MCI_NOTIFY_SUCCESSFUL); + } return ret; } @@ -631,7 +646,7 @@ str = buffer; } else { WARN("Don't know this info command (%u)\n", dwFlags); - ret = MCIERR_UNRECOGNIZED_COMMAND; + ret = MCIERR_MISSING_PARAMETER; } if (str) { if (lpParms->dwRetSize <= strlenW(str)) { @@ -644,6 +659,9 @@ *lpParms->lpstrReturn = 0; } TRACE("=> %s (%d)\n", debugstr_w(lpParms->lpstrReturn), ret); + + if (MMSYSERR_NOERROR==ret && (dwFlags & MCI_NOTIFY)) + MCICDA_Notify(lpParms->dwCallback, wmcda, MCI_NOTIFY_SUCCESSFUL); return ret; } @@ -664,11 +682,6 @@ if (lpParms == NULL) return MCIERR_NULL_PARAMETER_BLOCK; if (wmcda == NULL) return MCIERR_INVALID_DEVICE_ID; - if (dwFlags & MCI_NOTIFY) { - TRACE("MCI_NOTIFY_SUCCESSFUL %08lX !\n", lpParms->dwCallback); - mciDriverNotify(HWND_32(LOWORD(lpParms->dwCallback)), - wmcda->wNotifyDeviceID, MCI_NOTIFY_SUCCESSFUL); - } if (dwFlags & MCI_STATUS_ITEM) { TRACE("dwItem = %x\n", lpParms->dwItem); switch (lpParms->dwItem) { @@ -678,6 +691,7 @@ &data, sizeof(data), &br, NULL)) { return MCICDA_GetError(wmcda); + /* alt. data.CurrentPosition.TrackNumber = 1; -- what native yields */ } lpParms->dwReturn = data.CurrentPosition.TrackNumber; TRACE("CURRENT_TRACK=%lu\n", lpParms->dwReturn); @@ -736,7 +750,8 @@ return MCICDA_GetError(wmcda); break; case MCI_STATUS_POSITION: - if (dwFlags & MCI_STATUS_START) { + switch (dwFlags & (MCI_STATUS_START | MCI_TRACK)) { + case MCI_STATUS_START: if (!DeviceIoControl(wmcda->handle, IOCTL_CDROM_READ_TOC, NULL, 0, &toc, sizeof(toc), &br, NULL)) { WARN("error reading TOC !\n"); @@ -744,7 +759,8 @@ } lpParms->dwReturn = FRAME_OF_TOC(toc, toc.FirstTrack); TRACE("get MCI_STATUS_START !\n"); - } else if (dwFlags & MCI_TRACK) { + break; + case MCI_TRACK: if (!DeviceIoControl(wmcda->handle, IOCTL_CDROM_READ_TOC, NULL, 0, &toc, sizeof(toc), &br, NULL)) { WARN("error reading TOC !\n"); @@ -754,13 +770,17 @@ return MCIERR_OUTOFRANGE; lpParms->dwReturn = FRAME_OF_TOC(toc, lpParms->dwTrack); TRACE("get MCI_TRACK #%u !\n", lpParms->dwTrack); - } else { + break; + case 0: fmt.Format = IOCTL_CDROM_CURRENT_POSITION; if (!DeviceIoControl(wmcda->handle, IOCTL_CDROM_READ_Q_CHANNEL, &fmt, sizeof(fmt), &data, sizeof(data), &br, NULL)) { return MCICDA_GetError(wmcda); } lpParms->dwReturn = FRAME_OF_ADDR(data.CurrentPosition.AbsoluteAddress); + break; + default: + return MCIERR_FLAGS_NOT_COMPATIBLE; } lpParms->dwReturn = MCICDA_CalcTime(wmcda, wmcda->dwTimeFormat, lpParms->dwReturn, &ret); TRACE("MCI_STATUS_POSITION=%08lX\n", lpParms->dwReturn); @@ -800,16 +820,17 @@ else lpParms->dwReturn = (toc.TrackData[lpParms->dwTrack - toc.FirstTrack].Control & 0x04) ? MCI_CDA_TRACK_OTHER : MCI_CDA_TRACK_AUDIO; + /* FIXME: MAKEMCIRESOURCE "audio" | "other", localised */ } TRACE("MCI_CDA_STATUS_TYPE_TRACK[%d]=%ld\n", lpParms->dwTrack, lpParms->dwReturn); break; default: FIXME("unknown command %08X !\n", lpParms->dwItem); - return MCIERR_UNRECOGNIZED_COMMAND; + return MCIERR_UNSUPPORTED_FUNCTION; } - } else { - WARN("not MCI_STATUS_ITEM !\n"); - } + } else return MCIERR_MISSING_PARAMETER; + if ((dwFlags & MCI_NOTIFY) && HRESULT_CODE(ret)==0) + MCICDA_Notify(lpParms->dwCallback, wmcda, MCI_NOTIFY_SUCCESSFUL); return ret; } @@ -826,24 +847,23 @@ WARN("error reading TOC !\n"); return MCICDA_GetError(wmcda); } - /* Locate first track whose starting frame is bigger than frame */ - for(i=toc.FirstTrack;i<=toc.LastTrack+1;i++) - if ( FRAME_OF_TOC(toc, i) > *frame ) break; - if (i <= toc.FirstTrack && i>toc.LastTrack+1) { - i = 0; /* requested address is out of range: go back to start */ - *frame = FRAME_OF_TOC(toc,toc.FirstTrack); - } - else - i--; + if (*frame < FRAME_OF_TOC(toc,toc.FirstTrack) || + *frame >= FRAME_OF_TOC(toc,toc.LastTrack+1)) /* lead-out */ + return MCIERR_OUTOFRANGE; + for(i=toc.LastTrack+1;i>toc.FirstTrack;i--) + if ( FRAME_OF_TOC(toc, i) <= *frame ) break; /* i points to last track whose start address is not greater than frame. * Now skip non-audio tracks */ - for(;i<=toc.LastTrack+1;i++) + for(;i<=toc.LastTrack;i++) if ( ! (toc.TrackData[i-toc.FirstTrack].Control & 4) ) break; /* The frame will be an address in the next audio track or * address of lead-out. */ if ( FRAME_OF_TOC(toc, i) > *frame ) *frame = FRAME_OF_TOC(toc, i); + /* Lead-out is an invalid seek position (on Linux as well). */ + if (*frame == FRAME_OF_TOC(toc,toc.LastTrack+1)) + (*frame)--; return 0; } @@ -854,6 +874,7 @@ { WINE_MCICDAUDIO* wmcda = MCICDA_GetOpenDrv(wDevID); DWORD ret = 0, start, end; + HANDLE oldcb; DWORD br; CDROM_PLAY_AUDIO_MSF play; CDROM_SUB_Q_DATA_FORMAT fmt; @@ -891,12 +912,27 @@ } if (dwFlags & MCI_TO) { end = MCICDA_CalcFrame(wmcda, lpParms->dwTo); + if ( (ret=MCICDA_SkipDataTracks(wmcda, &end)) ) + return ret; TRACE("MCI_TO=%08X -> %u\n", lpParms->dwTo, end); } else { end = FRAME_OF_TOC(toc, toc.LastTrack + 1) - 1; } + if (end < start) return MCIERR_OUTOFRANGE; TRACE("Playing from %u to %u\n", start, end); + oldcb = InterlockedExchangePointer(&wmcda->hCallback, + (dwFlags & MCI_NOTIFY) ? HWND_32(LOWORD(lpParms->dwCallback)) : NULL); + if (oldcb) mciDriverNotify(oldcb, wmcda->wNotifyDeviceID, MCI_NOTIFY_ABORTED); + + if (start == end || start == FRAME_OF_TOC(toc,toc.LastTrack+1)-1) { + if (dwFlags & MCI_NOTIFY) { + oldcb = InterlockedExchangePointer(&wmcda->hCallback, NULL); + if (oldcb) mciDriverNotify(oldcb, wDevID, MCI_NOTIFY_SUCCESSFUL); + } + return MMSYSERR_NOERROR; + } + if (wmcda->hThread != 0) { SetEvent(wmcda->stopEvent); WaitForSingleObject(wmcda->hThread, INFINITE); @@ -912,14 +948,6 @@ IDirectSound_Release(wmcda->dsObj); wmcda->dsObj = NULL; } - else if(wmcda->hCallback) { - mciDriverNotify(wmcda->hCallback, wmcda->wNotifyDeviceID, - MCI_NOTIFY_ABORTED); - wmcda->hCallback = NULL; - } - - if ((dwFlags&MCI_NOTIFY)) - wmcda->hCallback = HWND_32(LOWORD(lpParms->dwCallback)); if (pDirectSoundCreate) { WAVEFORMATEX format; @@ -979,8 +1007,15 @@ wmcda->hThread = CreateThread(NULL, 0, MCICDA_playLoop, wmcda, 0, &br); if (wmcda->hThread != 0) { hr = IDirectSoundBuffer_Play(wmcda->dsBuf, 0, 0, DSBPLAY_LOOPING); - if (SUCCEEDED(hr)) + if (SUCCEEDED(hr)) { + /* FIXME: implement MCI_WAIT and send notification only in that case */ + if (0) { + oldcb = InterlockedExchangePointer(&wmcda->hCallback, NULL); + if (oldcb) mciDriverNotify(oldcb, wmcda->wNotifyDeviceID, + FAILED(hr) ? MCI_NOTIFY_FAILURE : MCI_NOTIFY_SUCCESSFUL); + } return ret; + } SetEvent(wmcda->stopEvent); WaitForSingleObject(wmcda->hThread, INFINITE); @@ -1013,13 +1048,9 @@ NULL, 0, &br, NULL)) { wmcda->hCallback = NULL; ret = MCIERR_HARDWARE; - } else if (dwFlags & MCI_NOTIFY) { - TRACE("MCI_NOTIFY_SUCCESSFUL %08lX !\n", lpParms->dwCallback); - /* - mciDriverNotify(HWND_32(LOWORD(lpParms->dwCallback)), - wmcda->wNotifyDeviceID, MCI_NOTIFY_SUCCESSFUL); - */ } + /* The independent CD player has no means to signal MCI_NOTIFY when it's done. + * Native sends a notification with MCI_WAIT only. */ return ret; } @@ -1029,12 +1060,16 @@ static DWORD MCICDA_Stop(UINT wDevID, DWORD dwFlags, LPMCI_GENERIC_PARMS lpParms) { WINE_MCICDAUDIO* wmcda = MCICDA_GetOpenDrv(wDevID); + HANDLE oldcb; DWORD br; TRACE("(%04X, %08X, %p);\n", wDevID, dwFlags, lpParms); if (wmcda == NULL) return MCIERR_INVALID_DEVICE_ID; + oldcb = InterlockedExchangePointer(&wmcda->hCallback, NULL); + if (oldcb) mciDriverNotify(oldcb, wmcda->wNotifyDeviceID, MCI_NOTIFY_ABORTED); + if (wmcda->hThread != 0) { SetEvent(wmcda->stopEvent); WaitForSingleObject(wmcda->hThread, INFINITE); @@ -1052,16 +1087,8 @@ else if (!DeviceIoControl(wmcda->handle, IOCTL_CDROM_STOP_AUDIO, NULL, 0, NULL, 0, &br, NULL)) return MCIERR_HARDWARE; - if (wmcda->hCallback) { - mciDriverNotify(wmcda->hCallback, wmcda->wNotifyDeviceID, MCI_NOTIFY_ABORTED); - wmcda->hCallback = NULL; - } - - if (lpParms && (dwFlags & MCI_NOTIFY)) { - TRACE("MCI_NOTIFY_SUCCESSFUL %08lX !\n", lpParms->dwCallback); - mciDriverNotify(HWND_32(LOWORD(lpParms->dwCallback)), - wmcda->wNotifyDeviceID, MCI_NOTIFY_SUCCESSFUL); - } + if ((dwFlags & MCI_NOTIFY) && lpParms) + MCICDA_Notify(lpParms->dwCallback, wmcda, MCI_NOTIFY_SUCCESSFUL); return 0; } @@ -1071,12 +1098,16 @@ static DWORD MCICDA_Pause(UINT wDevID, DWORD dwFlags, LPMCI_GENERIC_PARMS lpParms) { WINE_MCICDAUDIO* wmcda = MCICDA_GetOpenDrv(wDevID); + HANDLE oldcb; DWORD br; TRACE("(%04X, %08X, %p);\n", wDevID, dwFlags, lpParms); if (wmcda == NULL) return MCIERR_INVALID_DEVICE_ID; + oldcb = InterlockedExchangePointer(&wmcda->hCallback, NULL); + if (oldcb) mciDriverNotify(oldcb, wmcda->wNotifyDeviceID, MCI_NOTIFY_ABORTED); + if (wmcda->hThread != 0) { /* Don't bother calling stop if the playLoop thread has already stopped */ if(WaitForSingleObject(wmcda->stopEvent, 0) != WAIT_OBJECT_0 && @@ -1086,18 +1117,8 @@ else if (!DeviceIoControl(wmcda->handle, IOCTL_CDROM_PAUSE_AUDIO, NULL, 0, NULL, 0, &br, NULL)) return MCIERR_HARDWARE; - EnterCriticalSection(&wmcda->cs); - if (wmcda->hCallback) { - mciDriverNotify(wmcda->hCallback, wmcda->wNotifyDeviceID, MCI_NOTIFY_SUPERSEDED); - wmcda->hCallback = NULL; - } - LeaveCriticalSection(&wmcda->cs); - - if (lpParms && (dwFlags & MCI_NOTIFY)) { - TRACE("MCI_NOTIFY_SUCCESSFUL %08lX !\n", lpParms->dwCallback); - mciDriverNotify(HWND_32(LOWORD(lpParms->dwCallback)), - wmcda->wNotifyDeviceID, MCI_NOTIFY_SUCCESSFUL); - } + if ((dwFlags & MCI_NOTIFY) && lpParms) + MCICDA_Notify(lpParms->dwCallback, wmcda, MCI_NOTIFY_SUCCESSFUL); return 0; } @@ -1122,11 +1143,8 @@ else if (!DeviceIoControl(wmcda->handle, IOCTL_CDROM_RESUME_AUDIO, NULL, 0, NULL, 0, &br, NULL)) return MCIERR_HARDWARE; - if (lpParms && (dwFlags & MCI_NOTIFY)) { - TRACE("MCI_NOTIFY_SUCCESSFUL %08lX !\n", lpParms->dwCallback); - mciDriverNotify(HWND_32(LOWORD(lpParms->dwCallback)), - wmcda->wNotifyDeviceID, MCI_NOTIFY_SUCCESSFUL); - } + if ((dwFlags & MCI_NOTIFY) && lpParms) + MCICDA_Notify(lpParms->dwCallback, wmcda, MCI_NOTIFY_SUCCESSFUL); return 0; } @@ -1138,7 +1156,7 @@ DWORD at; WINE_MCICDAUDIO* wmcda = MCICDA_GetOpenDrv(wDevID); CDROM_SEEK_AUDIO_MSF seek; - DWORD br, ret; + DWORD br, position, ret; CDROM_TOC toc; TRACE("(%04X, %08X, %p);\n", wDevID, dwFlags, lpParms); @@ -1146,12 +1164,21 @@ if (wmcda == NULL) return MCIERR_INVALID_DEVICE_ID; if (lpParms == NULL) return MCIERR_NULL_PARAMETER_BLOCK; + position = dwFlags & (MCI_SEEK_TO_START|MCI_SEEK_TO_END|MCI_TO); + if (!position) return MCIERR_MISSING_PARAMETER; + if (position&(position-1)) return MCIERR_FLAGS_NOT_COMPATIBLE; + + /* Stop sends MCI_NOTIFY_ABORTED when needed. + * Tests show that native first sends ABORTED and reads the TOC, + * then only checks the position flags, then stops and seeks. */ + MCICDA_Stop(wDevID, MCI_WAIT, 0); + if (!DeviceIoControl(wmcda->handle, IOCTL_CDROM_READ_TOC, NULL, 0, &toc, sizeof(toc), &br, NULL)) { WARN("error reading TOC !\n"); return MCICDA_GetError(wmcda); } - switch (dwFlags & ~(MCI_NOTIFY|MCI_WAIT)) { + switch (position) { case MCI_SEEK_TO_START: TRACE("Seeking to start\n"); at = FRAME_OF_TOC(toc,toc.FirstTrack); @@ -1160,6 +1187,8 @@ break; case MCI_SEEK_TO_END: TRACE("Seeking to end\n"); + /* End is prior to lead-out + * yet Win9X seeks to even one frame less than that. */ at = FRAME_OF_TOC(toc, toc.LastTrack + 1) - 1; if ( (ret=MCICDA_SkipDataTracks(wmcda, &at)) ) return ret; @@ -1171,18 +1200,10 @@ return ret; break; default: - TRACE("Unknown seek action %08lX\n", - (dwFlags & ~(MCI_NOTIFY|MCI_WAIT))); - return MCIERR_UNSUPPORTED_FUNCTION; + return MCIERR_FLAGS_NOT_COMPATIBLE; } - if (wmcda->hThread != 0) { - EnterCriticalSection(&wmcda->cs); - wmcda->start = at - FRAME_OF_TOC(toc, toc.FirstTrack); - /* Flush remaining data, or just let it play into the new data? */ - LeaveCriticalSection(&wmcda->cs); - } - else { + { seek.M = at / CDFRAMES_PERMIN; seek.S = (at / CDFRAMES_PERSEC) % 60; seek.F = at % CDFRAMES_PERSEC; @@ -1191,11 +1212,8 @@ return MCIERR_HARDWARE; } - if (dwFlags & MCI_NOTIFY) { - TRACE("MCI_NOTIFY_SUCCESSFUL %08lX !\n", lpParms->dwCallback); - mciDriverNotify(HWND_32(LOWORD(lpParms->dwCallback)), - wmcda->wNotifyDeviceID, MCI_NOTIFY_SUCCESSFUL); - } + if (dwFlags & MCI_NOTIFY) + MCICDA_Notify(lpParms->dwCallback, wmcda, MCI_NOTIFY_SUCCESSFUL); return 0; } @@ -1241,7 +1259,6 @@ if (lpParms == NULL) return MCIERR_NULL_PARAMETER_BLOCK; /* TRACE("dwTimeFormat=%08lX\n", lpParms->dwTimeFormat); - TRACE("dwAudio=%08lX\n", lpParms->dwAudio); */ if (dwFlags & MCI_SET_TIME_FORMAT) { switch (lpParms->dwTimeFormat) { @@ -1255,20 +1272,15 @@ TRACE("MCI_FORMAT_TMSF !\n"); break; default: - WARN("bad time format !\n"); return MCIERR_BAD_TIME_FORMAT; } wmcda->dwTimeFormat = lpParms->dwTimeFormat; } - if (dwFlags & MCI_SET_VIDEO) return MCIERR_UNSUPPORTED_FUNCTION; - if (dwFlags & MCI_SET_ON) return MCIERR_UNSUPPORTED_FUNCTION; - if (dwFlags & MCI_SET_OFF) return MCIERR_UNSUPPORTED_FUNCTION; - if (dwFlags & MCI_NOTIFY) { - TRACE("MCI_NOTIFY_SUCCESSFUL %08lX !\n", - lpParms->dwCallback); - mciDriverNotify(HWND_32(LOWORD(lpParms->dwCallback)), - wmcda->wNotifyDeviceID, MCI_NOTIFY_SUCCESSFUL); - } + if (dwFlags & MCI_SET_AUDIO) /* one xp machine ignored it */ + TRACE("SET_AUDIO %X %x\n", dwFlags, lpParms->dwAudio); + + if (dwFlags & MCI_NOTIFY) + MCICDA_Notify(lpParms->dwCallback, wmcda, MCI_NOTIFY_SUCCESSFUL); return 0; } @@ -1307,10 +1319,11 @@ case MCI_SEEK: return MCICDA_Seek(dwDevID, dwParam1, (LPMCI_SEEK_PARMS)dwParam2); /* commands that should report an error as they are not supported in * the native version */ - case MCI_SET_DOOR_CLOSED: - case MCI_SET_DOOR_OPEN: + case MCI_RECORD: case MCI_LOAD: case MCI_SAVE: + return MCIERR_UNSUPPORTED_FUNCTION; + case MCI_BREAK: case MCI_FREEZE: case MCI_PUT: case MCI_REALIZE: diff -Nru wine1.3-1.3.0/dlls/mciqtz32/mciqtz.c wine1.3-1.3.1/dlls/mciqtz32/mciqtz.c --- wine1.3-1.3.0/dlls/mciqtz32/mciqtz.c 2010-07-30 18:43:56.000000000 +0100 +++ wine1.3-1.3.1/dlls/mciqtz32/mciqtz.c 2010-08-20 18:23:50.000000000 +0100 @@ -330,8 +330,7 @@ return MCIERR_INTERNAL; } - if (!wma->parent) - IVideoWindow_put_Visible(wma->vidwin, OATRUE); + IVideoWindow_put_Visible(wma->vidwin, OATRUE); if (dwFlags & MCI_NOTIFY) mciDriverNotify(HWND_32(LOWORD(lpParms->dwCallback)), wDevID, MCI_NOTIFY_SUCCESSFUL); @@ -770,8 +769,10 @@ return 0; if (dwFlags & MCI_DGV_WINDOW_HWND && (IsWindow(lpParms->hWnd) || !lpParms->hWnd)) { + LONG visible = OATRUE; LONG style = 0; TRACE("Setting hWnd to %p\n", lpParms->hWnd); + IVideoWindow_get_Visible(wma->vidwin, &visible); IVideoWindow_put_Visible(wma->vidwin, OAFALSE); IVideoWindow_get_WindowStyle(wma->vidwin, &style); style &= ~WS_CHILD; @@ -781,7 +782,7 @@ IVideoWindow_put_WindowStyle(wma->vidwin, style); IVideoWindow_put_Owner(wma->vidwin, (OAHWND)lpParms->hWnd); IVideoWindow_put_MessageDrain(wma->vidwin, (OAHWND)lpParms->hWnd); - IVideoWindow_put_Visible(wma->vidwin, OATRUE); + IVideoWindow_put_Visible(wma->vidwin, visible); wma->parent = lpParms->hWnd; } if (dwFlags & MCI_DGV_WINDOW_STATE) { @@ -818,12 +819,15 @@ BITMAPINFO *info; HRESULT hr; RECT src, dest; + LONG visible = OATRUE; res = MCIERR_INTERNAL; /* If in stopped state, nothing has been drawn to screen * moving to pause, which is needed for the old dib renderer, will result * in a single frame drawn, so hide the window here */ - IVideoWindow_put_Visible(wma->vidwin, OAFALSE); + IVideoWindow_get_Visible(wma->vidwin, &visible); + if (wma->parent) + IVideoWindow_put_Visible(wma->vidwin, OAFALSE); /* FIXME: Should we check the original state and restore it? */ IMediaControl_Pause(wma->pmctrl); IMediaControl_GetState(wma->pmctrl, -1, &state); @@ -846,7 +850,7 @@ res = 0; out: if (wma->parent) - IVideoWindow_put_Visible(wma->vidwin, OATRUE); + IVideoWindow_put_Visible(wma->vidwin, visible); } else if (dwFlags) FIXME("Unhandled flags %x\n", dwFlags); diff -Nru wine1.3-1.3.0/dlls/mmdevapi/audio.c wine1.3-1.3.1/dlls/mmdevapi/audio.c --- wine1.3-1.3.0/dlls/mmdevapi/audio.c 2010-07-30 18:43:56.000000000 +0100 +++ wine1.3-1.3.1/dlls/mmdevapi/audio.c 2010-08-20 18:23:50.000000000 +0100 @@ -17,7 +17,6 @@ */ #define NONAMELESSUNION -#define CINTERFACE #define COBJMACROS #include "config.h" diff -Nru wine1.3-1.3.0/dlls/mmdevapi/audiovolume.c wine1.3-1.3.1/dlls/mmdevapi/audiovolume.c --- wine1.3-1.3.0/dlls/mmdevapi/audiovolume.c 2010-07-30 18:43:56.000000000 +0100 +++ wine1.3-1.3.1/dlls/mmdevapi/audiovolume.c 2010-08-20 18:23:50.000000000 +0100 @@ -18,7 +18,6 @@ #define NONAMELESSUNION -#define CINTERFACE #define COBJMACROS #include "config.h" diff -Nru wine1.3-1.3.0/dlls/mmdevapi/devenum.c wine1.3-1.3.1/dlls/mmdevapi/devenum.c --- wine1.3-1.3.0/dlls/mmdevapi/devenum.c 2010-07-30 18:43:56.000000000 +0100 +++ wine1.3-1.3.1/dlls/mmdevapi/devenum.c 2010-08-20 18:23:50.000000000 +0100 @@ -29,7 +29,6 @@ #endif #define NONAMELESSUNION -#define CINTERFACE #define COBJMACROS #include "windef.h" #include "winbase.h" diff -Nru wine1.3-1.3.0/dlls/mmdevapi/main.c wine1.3-1.3.1/dlls/mmdevapi/main.c --- wine1.3-1.3.0/dlls/mmdevapi/main.c 2010-07-30 18:43:56.000000000 +0100 +++ wine1.3-1.3.1/dlls/mmdevapi/main.c 2010-08-20 18:23:50.000000000 +0100 @@ -29,7 +29,6 @@ #include #endif -#define CINTERFACE #define COBJMACROS #include "windef.h" #include "winbase.h" diff -Nru wine1.3-1.3.0/dlls/mmdevapi/tests/capture.c wine1.3-1.3.1/dlls/mmdevapi/tests/capture.c --- wine1.3-1.3.0/dlls/mmdevapi/tests/capture.c 2010-07-30 18:43:56.000000000 +0100 +++ wine1.3-1.3.1/dlls/mmdevapi/tests/capture.c 2010-08-20 18:23:50.000000000 +0100 @@ -23,7 +23,6 @@ #include "wine/test.h" -#define CINTERFACE #define COBJMACROS #ifdef STANDALONE diff -Nru wine1.3-1.3.0/dlls/mmdevapi/tests/dependency.c wine1.3-1.3.1/dlls/mmdevapi/tests/dependency.c --- wine1.3-1.3.0/dlls/mmdevapi/tests/dependency.c 2010-07-30 18:43:56.000000000 +0100 +++ wine1.3-1.3.1/dlls/mmdevapi/tests/dependency.c 2010-08-20 18:23:50.000000000 +0100 @@ -18,7 +18,6 @@ #include "wine/test.h" -#define CINTERFACE #define COBJMACROS #ifdef STANDALONE diff -Nru wine1.3-1.3.0/dlls/mmdevapi/tests/mmdevenum.c wine1.3-1.3.1/dlls/mmdevapi/tests/mmdevenum.c --- wine1.3-1.3.0/dlls/mmdevapi/tests/mmdevenum.c 2010-07-30 18:43:56.000000000 +0100 +++ wine1.3-1.3.1/dlls/mmdevapi/tests/mmdevenum.c 2010-08-20 18:23:50.000000000 +0100 @@ -18,7 +18,6 @@ #include "wine/test.h" -#define CINTERFACE #define COBJMACROS #include "initguid.h" diff -Nru wine1.3-1.3.0/dlls/mmdevapi/tests/propstore.c wine1.3-1.3.1/dlls/mmdevapi/tests/propstore.c --- wine1.3-1.3.0/dlls/mmdevapi/tests/propstore.c 2010-07-30 18:43:56.000000000 +0100 +++ wine1.3-1.3.1/dlls/mmdevapi/tests/propstore.c 2010-08-20 18:23:50.000000000 +0100 @@ -19,7 +19,6 @@ #define NONAMELESSUNION #include "wine/test.h" -#define CINTERFACE #define COBJMACROS #ifdef STANDALONE diff -Nru wine1.3-1.3.0/dlls/mmdevapi/tests/render.c wine1.3-1.3.1/dlls/mmdevapi/tests/render.c --- wine1.3-1.3.0/dlls/mmdevapi/tests/render.c 2010-07-30 18:43:56.000000000 +0100 +++ wine1.3-1.3.1/dlls/mmdevapi/tests/render.c 2010-08-20 18:23:50.000000000 +0100 @@ -23,7 +23,6 @@ #include "wine/test.h" -#define CINTERFACE #define COBJMACROS #ifdef STANDALONE diff -Nru wine1.3-1.3.0/dlls/mpr/wnet.c wine1.3-1.3.1/dlls/mpr/wnet.c --- wine1.3-1.3.0/dlls/mpr/wnet.c 2010-07-30 18:43:56.000000000 +0100 +++ wine1.3-1.3.1/dlls/mpr/wnet.c 2010-08-20 18:23:50.000000000 +0100 @@ -638,7 +638,7 @@ ret = WN_BAD_POINTER; else if (!providerTable || providerTable->numProviders == 0) { - lphEnum = NULL; + *lphEnum = NULL; ret = WN_NO_NETWORK; } else @@ -730,7 +730,7 @@ ret = WN_BAD_POINTER; else if (!providerTable || providerTable->numProviders == 0) { - lphEnum = NULL; + *lphEnum = NULL; ret = WN_NO_NETWORK; } else diff -Nru wine1.3-1.3.0/dlls/mscms/tests/profile.c wine1.3-1.3.1/dlls/mscms/tests/profile.c --- wine1.3-1.3.0/dlls/mscms/tests/profile.c 2010-07-30 18:43:56.000000000 +0100 +++ wine1.3-1.3.1/dlls/mscms/tests/profile.c 2010-08-20 18:23:50.000000000 +0100 @@ -459,39 +459,42 @@ DWORD size; CHAR oldprofile[MAX_PATH]; CHAR newprofile[MAX_PATH]; - const CHAR emptyA[] = ""; - DWORD zero = 0; - DWORD sizeP = sizeof(newprofile); /* Parameter checks */ /* Single invalid parameter checks: */ + size = sizeof(newprofile); SetLastError(0xfaceabee); /* 1st param, */ - ret = pGetStandardColorSpaceProfileA(machine, LCS_sRGB, newprofile, &sizeP); + ret = pGetStandardColorSpaceProfileA(machine, LCS_sRGB, newprofile, &size); ok( !ret && GetLastError() == ERROR_NOT_SUPPORTED, "GetStandardColorSpaceProfileA() returns %d (GLE=%d)\n", ret, GetLastError() ); + size = sizeof(newprofile); SetLastError(0xfaceabee); /* 2nd param, */ - ret = pGetStandardColorSpaceProfileA(NULL, (DWORD)-1, newprofile, &sizeP); + ret = pGetStandardColorSpaceProfileA(NULL, (DWORD)-1, newprofile, &size); ok( !ret && GetLastError() == ERROR_FILE_NOT_FOUND, "GetStandardColorSpaceProfileA() returns %d (GLE=%d)\n", ret, GetLastError() ); + size = sizeof(newprofile); SetLastError(0xfaceabee); /* 4th param, */ ret = pGetStandardColorSpaceProfileA(NULL, LCS_sRGB, newprofile, NULL); ok( !ret && GetLastError() == ERROR_INVALID_PARAMETER, "GetStandardColorSpaceProfileA() returns %d (GLE=%d)\n", ret, GetLastError() ); + size = sizeof(newprofile); SetLastError(0xfaceabee); /* 3rd param, */ - ret = pGetStandardColorSpaceProfileA(NULL, LCS_sRGB, NULL, &sizeP); + ret = pGetStandardColorSpaceProfileA(NULL, LCS_sRGB, NULL, &size); ok( !ret && GetLastError() == ERROR_INSUFFICIENT_BUFFER, "GetStandardColorSpaceProfileA() returns %d (GLE=%d)\n", ret, GetLastError() ); + size = 0; SetLastError(0xfaceabee); /* dereferenced 4th param, */ - ret = pGetStandardColorSpaceProfileA(NULL, LCS_sRGB, newprofile, &zero); + ret = pGetStandardColorSpaceProfileA(NULL, LCS_sRGB, newprofile, &size); ok( !ret && (GetLastError() == ERROR_MORE_DATA || GetLastError() == ERROR_INSUFFICIENT_BUFFER), "GetStandardColorSpaceProfileA() returns %d (GLE=%d)\n", ret, GetLastError() ); /* Several invalid parameter checks: */ + size = 0; SetLastError(0xfaceabee); /* 1st, maybe 2nd and then dereferenced 4th param, */ - ret = pGetStandardColorSpaceProfileA(machine, 0, newprofile, &zero); + ret = pGetStandardColorSpaceProfileA(machine, 0, newprofile, &size); ok( !ret && (GetLastError() == ERROR_INVALID_PARAMETER || GetLastError() == ERROR_NOT_SUPPORTED), "GetStandardColorSpaceProfileA() returns %d (GLE=%d)\n", ret, GetLastError() ); @@ -499,15 +502,17 @@ ret = pGetStandardColorSpaceProfileA(NULL, 0, newprofile, NULL); ok( !ret && GetLastError() == ERROR_INVALID_PARAMETER, "GetStandardColorSpaceProfileA() returns %d (GLE=%d)\n", ret, GetLastError() ); + size = 0; SetLastError(0xfaceabee); /* maybe 2nd, then 3rd and dereferenced 4th param, */ - ret = pGetStandardColorSpaceProfileA(NULL, 0, NULL, &zero); + ret = pGetStandardColorSpaceProfileA(NULL, 0, NULL, &size); ok( !ret && (GetLastError() == ERROR_INSUFFICIENT_BUFFER || GetLastError() == ERROR_FILE_NOT_FOUND), "GetStandardColorSpaceProfileA() returns %d (GLE=%d)\n", ret, GetLastError() ); + size = sizeof(newprofile); SetLastError(0xfaceabee); /* maybe 2nd param. */ - ret = pGetStandardColorSpaceProfileA(NULL, 0, newprofile, &sizeP); + ret = pGetStandardColorSpaceProfileA(NULL, 0, newprofile, &size); if (!ret) ok( GetLastError() == ERROR_FILE_NOT_FOUND, "GetStandardColorSpaceProfileA() returns %d (GLE=%d)\n", ret, GetLastError() ); - else ok( !lstrcmpiA( newprofile, emptyA ) && GetLastError() == 0xfaceabee, + else ok( !lstrcmpiA( newprofile, "" ) && GetLastError() == 0xfaceabee, "GetStandardColorSpaceProfileA() returns %d (GLE=%d)\n", ret, GetLastError() ); /* Functional checks */ @@ -540,45 +545,55 @@ WCHAR oldprofile[MAX_PATH]; WCHAR newprofile[MAX_PATH]; CHAR newprofileA[MAX_PATH]; - const CHAR empty[] = ""; - DWORD zero = 0; - DWORD sizeP = sizeof(newprofile); /* Parameter checks */ /* Single invalid parameter checks: */ + size = sizeof(newprofile); SetLastError(0xfaceabee); /* 1st param, */ - ret = pGetStandardColorSpaceProfileW(machineW, LCS_sRGB, newprofile, &sizeP); + ret = pGetStandardColorSpaceProfileW(machineW, LCS_sRGB, newprofile, &size); ok( !ret && GetLastError() == ERROR_NOT_SUPPORTED, "GetStandardColorSpaceProfileW() returns %d (GLE=%d)\n", ret, GetLastError() ); + size = sizeof(newprofile); SetLastError(0xfaceabee); /* 2nd param, */ - ret = pGetStandardColorSpaceProfileW(NULL, (DWORD)-1, newprofile, &sizeP); + ret = pGetStandardColorSpaceProfileW(NULL, (DWORD)-1, newprofile, &size); ok( !ret && GetLastError() == ERROR_FILE_NOT_FOUND, "GetStandardColorSpaceProfileW() returns %d (GLE=%d)\n", ret, GetLastError() ); + size = sizeof(newprofile); SetLastError(0xfaceabee); /* 2nd param, */ - ret = pGetStandardColorSpaceProfileW(NULL, 0, newprofile, &sizeP); + ret = pGetStandardColorSpaceProfileW(NULL, 0, newprofile, &size); ok( (!ret && GetLastError() == ERROR_FILE_NOT_FOUND) || broken(ret), /* Win98 and WinME */ "GetStandardColorSpaceProfileW() returns %d (GLE=%d)\n", ret, GetLastError() ); + size = sizeof(newprofile); SetLastError(0xfaceabee); /* 3rd param, */ - ret = pGetStandardColorSpaceProfileW(NULL, LCS_sRGB, NULL, &sizeP); - ok( !ret && GetLastError() == ERROR_INSUFFICIENT_BUFFER, "GetStandardColorSpaceProfileW() returns %d (GLE=%d)\n", ret, GetLastError() ); + ret = pGetStandardColorSpaceProfileW(NULL, LCS_sRGB, NULL, &size); + ok( !ret || broken(ret) /* win98 */, "GetStandardColorSpaceProfileW succeeded\n" ); + ok( GetLastError() == ERROR_INSUFFICIENT_BUFFER || + broken(GetLastError() == 0xfaceabee) /* win98 */, + "GetStandardColorSpaceProfileW() returns GLE=%u\n", GetLastError() ); + size = sizeof(newprofile); SetLastError(0xfaceabee); /* 4th param, */ ret = pGetStandardColorSpaceProfileW(NULL, LCS_sRGB, newprofile, NULL); ok( !ret && GetLastError() == ERROR_INVALID_PARAMETER, "GetStandardColorSpaceProfileW() returns %d (GLE=%d)\n", ret, GetLastError() ); + size = 0; SetLastError(0xfaceabee); /* dereferenced 4th param. */ - ret = pGetStandardColorSpaceProfileW(NULL, LCS_sRGB, newprofile, &zero); - ok( !ret && (GetLastError() == ERROR_MORE_DATA || GetLastError() == ERROR_INSUFFICIENT_BUFFER), - "GetStandardColorSpaceProfileW() returns %d (GLE=%d)\n", ret, GetLastError() ); + ret = pGetStandardColorSpaceProfileW(NULL, LCS_sRGB, newprofile, &size); + ok( !ret || broken(ret) /* win98 */, "GetStandardColorSpaceProfileW succeeded\n" ); + ok( GetLastError() == ERROR_MORE_DATA || + GetLastError() == ERROR_INSUFFICIENT_BUFFER || + broken(GetLastError() == 0xfaceabee) /* win98 */, + "GetStandardColorSpaceProfileW() returns GLE=%u\n", GetLastError() ); /* Several invalid parameter checks: */ + size = 0; SetLastError(0xfaceabee); /* 1st, maybe 2nd and then dereferenced 4th param, */ - ret = pGetStandardColorSpaceProfileW(machineW, 0, newprofile, &zero); + ret = pGetStandardColorSpaceProfileW(machineW, 0, newprofile, &size); ok( !ret && (GetLastError() == ERROR_INVALID_PARAMETER || GetLastError() == ERROR_NOT_SUPPORTED), "GetStandardColorSpaceProfileW() returns %d (GLE=%d)\n", ret, GetLastError() ); @@ -586,18 +601,23 @@ ret = pGetStandardColorSpaceProfileW(NULL, 0, newprofile, NULL); ok( !ret && GetLastError() == ERROR_INVALID_PARAMETER, "GetStandardColorSpaceProfileW() returns %d (GLE=%d)\n", ret, GetLastError() ); + size = 0; SetLastError(0xfaceabee); /* maybe 2nd, then 3rd and dereferenced 4th param, */ - ret = pGetStandardColorSpaceProfileW(NULL, 0, NULL, &zero); - ok( !ret && (GetLastError() == ERROR_INSUFFICIENT_BUFFER || GetLastError() == ERROR_FILE_NOT_FOUND), - "GetStandardColorSpaceProfileW() returns %d (GLE=%d)\n", ret, GetLastError() ); + ret = pGetStandardColorSpaceProfileW(NULL, 0, NULL, &size); + ok( !ret || broken(ret) /* win98 */, "GetStandardColorSpaceProfileW succeeded\n" ); + ok( GetLastError() == ERROR_INSUFFICIENT_BUFFER || + GetLastError() == ERROR_FILE_NOT_FOUND || + broken(GetLastError() == 0xfaceabee) /* win98 */, + "GetStandardColorSpaceProfileW() returns GLE=%u\n", GetLastError() ); + size = sizeof(newprofile); SetLastError(0xfaceabee); /* maybe 2nd param. */ - ret = pGetStandardColorSpaceProfileW(NULL, 0, newprofile, &sizeP); + ret = pGetStandardColorSpaceProfileW(NULL, 0, newprofile, &size); if (!ret) ok( GetLastError() == ERROR_FILE_NOT_FOUND, "GetStandardColorSpaceProfileW() returns %d (GLE=%d)\n", ret, GetLastError() ); else { WideCharToMultiByte(CP_ACP, 0, newprofile, -1, newprofileA, sizeof(newprofileA), NULL, NULL); - ok( !lstrcmpiA( newprofileA, empty ) && GetLastError() == 0xfaceabee, + ok( !lstrcmpiA( newprofileA, "" ) && GetLastError() == 0xfaceabee, "GetStandardColorSpaceProfileW() returns %d (GLE=%d)\n", ret, GetLastError() ); } diff -Nru wine1.3-1.3.0/dlls/mshtml/De.rc wine1.3-1.3.1/dlls/mshtml/De.rc --- wine1.3-1.3.0/dlls/mshtml/De.rc 2010-07-30 18:43:56.000000000 +0100 +++ wine1.3-1.3.1/dlls/mshtml/De.rc 2010-08-20 18:23:50.000000000 +0100 @@ -2,6 +2,7 @@ * German resources for mshtml * * Copyright 2005 Henning Gerhardt + * Copyright 2010 André Hentschel * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public @@ -26,6 +27,12 @@ STRINGTABLE { + IDS_STATUS_DONE "Fertig" + IDS_STATUS_DOWNLOADINGFROM "Herunterladen von %s..." +} + +STRINGTABLE +{ IDS_HTMLDISABLED "Die HTML-Darstellung ist zur Zeit ausgeschaltet." IDS_HTMLDOCUMENT "HTML-Dokument" IDS_DOWNLOADING "Lade herunter..." diff -Nru wine1.3-1.3.0/dlls/mshtml/editor.c wine1.3-1.3.1/dlls/mshtml/editor.c --- wine1.3-1.3.0/dlls/mshtml/editor.c 2010-07-30 18:43:56.000000000 +0100 +++ wine1.3-1.3.1/dlls/mshtml/editor.c 2010-08-20 18:23:50.000000000 +0100 @@ -180,25 +180,33 @@ nsICommandParams_Release(nsparam); } -static DWORD query_align_status(HTMLDocument *This, const char *align_str) +static DWORD query_align_status(HTMLDocument *This, const WCHAR *align) { - nsICommandParams *nsparam; - char *align = NULL; + DWORD ret = OLECMDF_SUPPORTED | OLECMDF_ENABLED; + nsIDOMNSHTMLDocument *nsdoc; + nsAString justify_str; + PRBool b; + nsresult nsres; if(This->doc_obj->usermode != EDITMODE || This->window->readystate < READYSTATE_INTERACTIVE) return OLECMDF_SUPPORTED; - if(This->doc_obj->nscontainer) { - nsparam = create_nscommand_params(); - get_ns_command_state(This->doc_obj->nscontainer, NSCMD_ALIGN, nsparam); - - nsICommandParams_GetCStringValue(nsparam, NSSTATE_ATTRIBUTE, &align); - nsICommandParams_Release(nsparam); + nsres = nsIDOMHTMLDocument_QueryInterface(This->doc_node->nsdoc, &IID_nsIDOMNSHTMLDocument, + (void**)&nsdoc); + if(NS_FAILED(nsres)) { + ERR("Could not get nsIDOMNSHTMLDocument iface: %08x\n", nsres); + return 0; } - return OLECMDF_SUPPORTED | OLECMDF_ENABLED - | (align && !strcmp(align_str, align) ? OLECMDF_LATCHED : 0); + nsAString_Init(&justify_str, align); + nsres = nsIDOMNSHTMLDocument_QueryCommandState(nsdoc, &justify_str, &b); + nsAString_Finish(&justify_str); + if(NS_SUCCEEDED(nsres) && b) + ret |= OLECMDF_LATCHED; + + nsIDOMNSHTMLDocument_Release(nsdoc); + return ret; } @@ -704,10 +712,13 @@ static HRESULT query_justify(HTMLDocument *This, OLECMD *cmd) { + static const PRUnichar justifycenterW[] = {'j','u','s','t','i','f','y','c','e','n','t','e','r',0}; + static const PRUnichar justifyrightW[] = {'j','u','s','t','i','f','y','r','i','g','h','t',0}; + switch(cmd->cmdID) { case IDM_JUSTIFYCENTER: TRACE("(%p) IDM_JUSTIFYCENTER\n", This); - cmd->cmdf = query_align_status(This, NSALIGN_CENTER); + cmd->cmdf = query_align_status(This, justifycenterW); break; case IDM_JUSTIFYLEFT: TRACE("(%p) IDM_JUSTIFYLEFT\n", This); @@ -719,7 +730,7 @@ break; case IDM_JUSTIFYRIGHT: TRACE("(%p) IDM_JUSTIFYRIGHT\n", This); - cmd->cmdf = query_align_status(This, NSALIGN_RIGHT); + cmd->cmdf = query_align_status(This, justifyrightW); break; } diff -Nru wine1.3-1.3.0/dlls/mshtml/En.rc wine1.3-1.3.1/dlls/mshtml/En.rc --- wine1.3-1.3.0/dlls/mshtml/En.rc 2010-07-30 18:43:56.000000000 +0100 +++ wine1.3-1.3.1/dlls/mshtml/En.rc 2010-08-20 18:23:50.000000000 +0100 @@ -22,6 +22,12 @@ STRINGTABLE { + IDS_STATUS_DONE "Done" + IDS_STATUS_DOWNLOADINGFROM "Downloading from %s..." +} + +STRINGTABLE +{ IDS_HTMLDISABLED "HTML rendering is currently disabled." IDS_HTMLDOCUMENT "HTML Document" IDS_DOWNLOADING "Downloading..." diff -Nru wine1.3-1.3.0/dlls/mshtml/Es.rc wine1.3-1.3.1/dlls/mshtml/Es.rc --- wine1.3-1.3.0/dlls/mshtml/Es.rc 2010-07-30 18:43:56.000000000 +0100 +++ wine1.3-1.3.1/dlls/mshtml/Es.rc 2010-08-20 18:23:50.000000000 +0100 @@ -2,6 +2,7 @@ * Spanish resources for mshtml * * Copyright 2006 Jos Manuel Ferrer Ortiz + * Copyright 2010 Jos Rostagno * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public @@ -24,6 +25,12 @@ STRINGTABLE { + IDS_STATUS_DONE "Listo" + IDS_STATUS_DOWNLOADINGFROM "Descargando desde %s..." +} + +STRINGTABLE +{ IDS_HTMLDISABLED "El renderizado HTML est actualmente deshabilitado." IDS_HTMLDOCUMENT "Documento HTML" IDS_DOWNLOADING "Descargando..." @@ -35,9 +42,10 @@ CAPTION "Instalador de Gecko de Wine" FONT 8, "MS Shell Dlg" { - LTEXT "Wine could not find a Gecko package which is needed for applications embedding HTML " \ - "to work correctly. Wine can automatically download and install it for you.\n\n" \ - "Note: it's recommended to use distro packages instead. See http://wiki.winehq.org/Gecko for details.", + LTEXT "Wine no pudo encontrar el paquete Gecko, que necesitan las aplicaciones que incrustan HTML " \ + "para funcionar correctamente. Wine puede descargarlo automticamente e instalarlo para usted.\n\n" \ + "Nota: Se recomienda utilizar el paquete para su distribucin si est disponible. " \ + "Consulte http://wiki.winehq.org/Gecko para ms detalles.", ID_DWL_STATUS, 10, 10, 240, 50, SS_LEFT CONTROL "Progreso", ID_DWL_PROGRESS, PROGRESS_CLASSA, WS_BORDER|PBS_SMOOTH, 10, 50, 240, 12 DEFPUSHBUTTON "&Instalar", ID_DWL_INSTALL, 200, 70, 50, 15, WS_GROUP | WS_TABSTOP diff -Nru wine1.3-1.3.0/dlls/mshtml/Fr.rc wine1.3-1.3.1/dlls/mshtml/Fr.rc --- wine1.3-1.3.0/dlls/mshtml/Fr.rc 2010-07-30 18:43:56.000000000 +0100 +++ wine1.3-1.3.1/dlls/mshtml/Fr.rc 2010-08-20 18:23:50.000000000 +0100 @@ -29,6 +29,12 @@ STRINGTABLE { + IDS_STATUS_DONE "Terminé" + IDS_STATUS_DOWNLOADINGFROM "Téléchargement depuis %s..." +} + +STRINGTABLE +{ IDS_HTMLDISABLED "Le rendu HTML est actuellement désactivé." IDS_HTMLDOCUMENT "Document HTML" IDS_DOWNLOADING "Téléchargement..." diff -Nru wine1.3-1.3.0/dlls/mshtml/It.rc wine1.3-1.3.1/dlls/mshtml/It.rc --- wine1.3-1.3.0/dlls/mshtml/It.rc 2010-07-30 18:43:56.000000000 +0100 +++ wine1.3-1.3.1/dlls/mshtml/It.rc 2010-08-20 18:23:50.000000000 +0100 @@ -25,7 +25,13 @@ STRINGTABLE { - IDS_HTMLDISABLED "Il rendering HTML è correntemente disattivato." + IDS_STATUS_DONE "Fatto" + IDS_STATUS_DOWNLOADINGFROM "Scaricando da %s..." +} + +STRINGTABLE +{ + IDS_HTMLDISABLED "Il rendering HTML è attualmente disattivato." IDS_HTMLDOCUMENT "Documento HTML" IDS_DOWNLOADING "Scaricando..." IDS_INSTALLING "Installando..." diff -Nru wine1.3-1.3.0/dlls/mshtml/Ko.rc wine1.3-1.3.1/dlls/mshtml/Ko.rc --- wine1.3-1.3.0/dlls/mshtml/Ko.rc 2010-07-30 18:43:56.000000000 +0100 +++ wine1.3-1.3.1/dlls/mshtml/Ko.rc 2010-08-20 18:23:50.000000000 +0100 @@ -19,42 +19,50 @@ #include "resource.h" +#pragma code_page(65001) + LANGUAGE LANG_KOREAN, SUBLANG_DEFAULT + STRINGTABLE + { + IDS_STATUS_DONE "끝남" + IDS_STATUS_DOWNLOADINGFROM "%s로부터 다운로드중..." +} + STRINGTABLE { - IDS_HTMLDISABLED "HTML ." - IDS_HTMLDOCUMENT "HTML " - IDS_DOWNLOADING "ٿε ..." - IDS_INSTALLING "ġ ..." + IDS_HTMLDISABLED "HTML 렌더링은 현재 가능하지 않음." + IDS_HTMLDOCUMENT "HTML 문서" + IDS_DOWNLOADING "다운로드 중..." + IDS_INSTALLING "설치 중..." } ID_DWL_DIALOG DIALOG 0, 0, 260, 95 STYLE DS_MODALFRAME | DS_CENTER | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU -CAPTION "Wine Gecko ġ Ǯ׸" +CAPTION "Wine Gecko 설치 풀그림" FONT 9, "MS Shell Dlg" { LTEXT "Wine could not find a Gecko package which is needed for applications embedding HTML " \ "to work correctly. Wine can automatically download and install it for you.\n\n" \ "Note: it's recommended to use distro packages instead. See http://wiki.winehq.org/Gecko for details.", ID_DWL_STATUS, 10, 10, 240, 50, SS_LEFT - CONTROL "", ID_DWL_PROGRESS, PROGRESS_CLASSA, WS_BORDER|PBS_SMOOTH, 10, 40, 240, 12 - DEFPUSHBUTTON "ġ(&I)", ID_DWL_INSTALL, 200, 70, 50, 15, WS_GROUP | WS_TABSTOP - PUSHBUTTON "(&C)", IDCANCEL, 140, 70, 50, 15, WS_GROUP | WS_TABSTOP + CONTROL "진행중", ID_DWL_PROGRESS, PROGRESS_CLASSA, WS_BORDER|PBS_SMOOTH, 10, 40, 240, 12 + DEFPUSHBUTTON "설치(&I)", ID_DWL_INSTALL, 200, 70, 50, 15, WS_GROUP | WS_TABSTOP + PUSHBUTTON "취소(&C)", IDCANCEL, 140, 70, 50, 15, WS_GROUP | WS_TABSTOP } IDD_HYPERLINK DIALOG 0, 0, 250, 65 STYLE DS_CENTER | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU -CAPTION "۸ũ" +CAPTION "하이퍼링크" FONT 9, "MS Shell Dlg" { - GROUPBOX "۸ũ ", -1, 5, 5, 190, 55 - LTEXT "(&T):", -1, 10, 22, 24, 10 + GROUPBOX "하이퍼링크 정보", -1, 5, 5, 190, 55 + LTEXT "형식(&T):", -1, 10, 22, 24, 10 COMBOBOX IDC_TYPE, 35, 20, 45, 100, WS_TABSTOP | WS_GROUP | WS_VSCROLL | CBS_DROPDOWNLIST | CBS_HASSTRINGS - LTEXT "ּ(&U):", -1, 10, 42, 24, 10 + LTEXT "주소(&U):", -1, 10, 42, 24, 10 EDITTEXT IDC_URL, 35, 40, 150, 14, ES_AUTOHSCROLL | WS_BORDER | WS_GROUP | WS_TABSTOP - PUSHBUTTON "Ȯ", IDOK, 200, 10, 45, 14, BS_DEFPUSHBUTTON | WS_GROUP | WS_TABSTOP - PUSHBUTTON "", IDCANCEL, 200, 28, 45, 14, WS_GROUP | WS_TABSTOP + PUSHBUTTON "확인", IDOK, 200, 10, 45, 14, BS_DEFPUSHBUTTON | WS_GROUP | WS_TABSTOP + PUSHBUTTON "취소", IDCANCEL, 200, 28, 45, 14, WS_GROUP | WS_TABSTOP } ID_PROMPT_DIALOG DIALOG 0, 0, 200, 90 @@ -64,6 +72,6 @@ { LTEXT "", ID_PROMPT_PROMPT, 10, 10, 180, 30 EDITTEXT ID_PROMPT_EDIT, 10, 45, 180, 14, ES_AUTOHSCROLL | WS_BORDER | WS_GROUP | WS_TABSTOP - PUSHBUTTON "Ȯ", IDOK, 40, 65, 45, 15, BS_DEFPUSHBUTTON | WS_GROUP | WS_TABSTOP - PUSHBUTTON "", IDCANCEL, 115, 65, 45, 15, WS_GROUP | WS_TABSTOP + PUSHBUTTON "확인", IDOK, 40, 65, 45, 15, BS_DEFPUSHBUTTON | WS_GROUP | WS_TABSTOP + PUSHBUTTON "취소", IDCANCEL, 115, 65, 45, 15, WS_GROUP | WS_TABSTOP } diff -Nru wine1.3-1.3.0/dlls/mshtml/Lt.rc wine1.3-1.3.1/dlls/mshtml/Lt.rc --- wine1.3-1.3.0/dlls/mshtml/Lt.rc 2010-07-30 18:43:56.000000000 +0100 +++ wine1.3-1.3.1/dlls/mshtml/Lt.rc 2010-08-20 18:23:50.000000000 +0100 @@ -1,5 +1,5 @@ /* - * Copyright 2009 Aurimas Fišeras + * Copyright 2009-2010 Aurimas Fišeras * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public @@ -23,6 +23,12 @@ LANGUAGE LANG_LITHUANIAN, SUBLANG_NEUTRAL + STRINGTABLE + { + IDS_STATUS_DONE "Baigta" + IDS_STATUS_DOWNLOADINGFROM "Atsiunčiama iš %s..." +} + STRINGTABLE { IDS_HTMLDISABLED "HTML atvaizdavimas yra išjungtas." diff -Nru wine1.3-1.3.0/dlls/mshtml/main.c wine1.3-1.3.1/dlls/mshtml/main.c --- wine1.3-1.3.0/dlls/mshtml/main.c 2010-07-30 18:43:56.000000000 +0100 +++ wine1.3-1.3.1/dlls/mshtml/main.c 2010-08-20 18:23:50.000000000 +0100 @@ -40,6 +40,7 @@ #define INIT_GUID #include "mshtml_private.h" +#include "resource.h" WINE_DEFAULT_DEBUG_CHANNEL(mshtml); @@ -48,6 +49,7 @@ static HINSTANCE shdoclc = NULL; static HDC display_dc; +static LPWSTR status_strings[NUM_STATUS_STRINGS]; static void thread_detach(void) { @@ -63,6 +65,13 @@ heap_free(thread_data); } +void free_strings(void) +{ + int i; + for(i = 0; i < NUM_STATUS_STRINGS; i++) + heap_free(status_strings[i]); +} + static void process_detach(void) { close_gecko(); @@ -74,6 +83,46 @@ TlsFree(mshtml_tls); if(display_dc) DeleteObject(display_dc); + + free_strings(); +} + +void set_statustext(HTMLDocumentObj* doc, INT id, LPCWSTR arg) +{ + int index = id - IDS_STATUS_DONE; + LPWSTR p = status_strings[index]; + + if(!doc->frame) + return; + + if(!p) + { + DWORD len = 255; + p = heap_alloc(len * sizeof(WCHAR)); + len = LoadStringW(hInst, id, p, len); + len++; + p = heap_realloc(p, len * sizeof(WCHAR)); + if(InterlockedCompareExchangePointer((void**)&status_strings[index], p, NULL)) + { + heap_free(p); + p = status_strings[index]; + } + } + + if(arg) + { + DWORD len = lstrlenW(p) + lstrlenW(arg) - 1; + LPWSTR buf = heap_alloc(len * sizeof(WCHAR)); + + snprintfW(buf, len, p, arg); + + p = buf; + } + + IOleInPlaceFrame_SetStatusText(doc->frame, p); + + if(arg) + heap_free(p); } HINSTANCE get_shdoclc(void) diff -Nru wine1.3-1.3.0/dlls/mshtml/mshtml_private.h wine1.3-1.3.1/dlls/mshtml/mshtml_private.h --- wine1.3-1.3.0/dlls/mshtml/mshtml_private.h 2010-07-30 18:43:56.000000000 +0100 +++ wine1.3-1.3.1/dlls/mshtml/mshtml_private.h 2010-08-20 18:23:50.000000000 +0100 @@ -36,6 +36,7 @@ #define NS_OK ((nsresult)0x00000000L) #define NS_ERROR_FAILURE ((nsresult)0x80004005L) +#define NS_ERROR_OUT_OF_MEMORY ((nsresult)0x8007000EL) #define NS_NOINTERFACE ((nsresult)0x80004002L) #define NS_ERROR_NOT_IMPLEMENTED ((nsresult)0x80004001L) #define NS_ERROR_NOT_AVAILABLE ((nsresult)0x80040111L) @@ -446,6 +447,13 @@ HRESULT set_wine_url(nsWineURI*,LPCWSTR); nsresult on_start_uri_open(NSContainer*,nsIURI*,PRBool*); +/* Keep sync with request_method_strings in nsio.c */ +typedef enum { + METHOD_GET, + METHOD_PUT, + METHOD_POST +} REQUEST_METHOD; + typedef struct { const nsIHttpChannelVtbl *lpHttpChannelVtbl; const nsIUploadChannelVtbl *lpUploadChannelVtbl; @@ -455,23 +463,29 @@ nsWineURI *uri; nsIInputStream *post_data_stream; + BOOL parse_stream; nsILoadGroup *load_group; nsIInterfaceRequestor *notif_callback; nsISupports *owner; nsLoadFlags load_flags; nsIURI *original_uri; + nsIURI *referrer; char *content_type; char *charset; PRUint32 response_status; + REQUEST_METHOD request_method; struct list response_headers; + struct list request_headers; UINT url_scheme; } nsChannel; -struct ResponseHeader { +typedef struct { struct list entry; WCHAR *header; WCHAR *data; -}; +} http_header_t; + +HRESULT set_http_header(struct list*,const WCHAR*,int,const WCHAR*,int); typedef struct { HRESULT (*qi)(HTMLDOMNode*,REFIID,void**); @@ -572,6 +586,7 @@ nsDocumentEventListener *nsevent_listener; BOOL *event_vector; + BOOL skip_mutation_notif; mutation_queue_t *mutation_queue; mutation_queue_t *mutation_queue_tail; @@ -713,6 +728,7 @@ void init_nsio(nsIComponentManager*,nsIComponentRegistrar*); void release_nsio(void); BOOL install_wine_gecko(BOOL); +BOOL is_gecko_path(const char*); HRESULT nsuri_to_url(LPCWSTR,BOOL,BSTR*); HRESULT create_doc_uri(HTMLWindow*,WCHAR*,nsWineURI**); @@ -943,6 +959,19 @@ return ret; } +static inline LPWSTR heap_strndupW(LPCWSTR str, unsigned len) +{ + LPWSTR ret = NULL; + + if(str) { + ret = heap_alloc((len+1)*sizeof(WCHAR)); + memcpy(ret, str, len*sizeof(WCHAR)); + ret[len] = 0; + } + + return ret; +} + static inline char *heap_strdupA(const char *str) { char *ret = NULL; @@ -999,5 +1028,6 @@ HDC get_display_dc(void); HINSTANCE get_shdoclc(void); +void set_statustext(HTMLDocumentObj*,INT,LPCWSTR); extern HINSTANCE hInst; diff -Nru wine1.3-1.3.0/dlls/mshtml/mutation.c wine1.3-1.3.1/dlls/mshtml/mutation.c --- wine1.3-1.3.0/dlls/mshtml/mutation.c 2010-07-30 18:43:56.000000000 +0100 +++ wine1.3-1.3.1/dlls/mshtml/mutation.c 2010-08-20 18:23:50.000000000 +0100 @@ -200,7 +200,7 @@ #define NSRUNNABLE_THIS(iface) DEFINE_THIS(HTMLDocumentNode, IRunnable, iface) static nsresult NSAPI nsRunnable_QueryInterface(nsIRunnable *iface, - nsIIDRef riid, nsQIResult result) + nsIIDRef riid, void **result) { HTMLDocumentNode *This = NSRUNNABLE_THIS(iface); @@ -312,10 +312,8 @@ FIXME("handle result\n"); } -static void parse_complete_proc(task_t *task) +static void parse_complete(HTMLDocumentObj *doc) { - HTMLDocumentObj *doc = ((docobj_task_t*)task)->doc; - TRACE("(%p)\n", doc); if(doc->usermode == EDITMODE) @@ -328,35 +326,24 @@ call_explorer_69(doc); /* FIXME: IE7 calls EnableModelless(TRUE), EnableModelless(FALSE) and sets interactive state here */ - - set_ready_state(doc->basedoc.window, READYSTATE_INTERACTIVE); } static void handle_end_load(HTMLDocumentNode *This) { - docobj_task_t *task; - TRACE("\n"); if(!This->basedoc.doc_obj) return; - if(This != This->basedoc.doc_obj->basedoc.doc_node) { - set_ready_state(This->basedoc.window, READYSTATE_INTERACTIVE); - return; + if(This == This->basedoc.doc_obj->basedoc.doc_node) { + /* + * This should be done in the worker thread that parses HTML, + * but we don't have such thread (Gecko parses HTML for us). + */ + parse_complete(This->basedoc.doc_obj); } - task = heap_alloc(sizeof(docobj_task_t)); - if(!task) - return; - - task->doc = This->basedoc.doc_obj; - - /* - * This should be done in the worker thread that parses HTML, - * but we don't have such thread (Gecko parses HTML for us). - */ - push_task(&task->header, &parse_complete_proc, This->basedoc.doc_obj->basedoc.task_magic); + set_ready_state(This->basedoc.window, READYSTATE_INTERACTIVE); } static nsresult NSAPI nsRunnable_Run(nsIRunnable *iface) @@ -460,7 +447,7 @@ #define NSDOCOBS_THIS(iface) DEFINE_THIS(HTMLDocumentNode, IDocumentObserver, iface) static nsresult NSAPI nsDocumentObserver_QueryInterface(nsIDocumentObserver *iface, - nsIIDRef riid, nsQIResult result) + nsIIDRef riid, void **result) { HTMLDocumentNode *This = NSDOCOBS_THIS(iface); @@ -558,6 +545,9 @@ TRACE("\n"); + if(This->skip_mutation_notif) + return; + This->content_ready = TRUE; push_mutation_queue(This, MUTATION_ENDLOAD, NULL); } diff -Nru wine1.3-1.3.0/dlls/mshtml/navigate.c wine1.3-1.3.1/dlls/mshtml/navigate.c --- wine1.3-1.3.0/dlls/mshtml/navigate.c 2010-07-30 18:43:56.000000000 +0100 +++ wine1.3-1.3.1/dlls/mshtml/navigate.c 2010-08-20 18:23:50.000000000 +0100 @@ -1,5 +1,5 @@ /* - * Copyright 2006-2007 Jacek Caban for CodeWeavers + * Copyright 2006-2010 Jacek Caban for CodeWeavers * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public @@ -63,6 +63,7 @@ HRESULT (*read_data)(BSCallback*,IStream*); HRESULT (*on_progress)(BSCallback*,ULONG,LPCWSTR); HRESULT (*on_response)(BSCallback*,DWORD,LPCWSTR); + HRESULT (*beginning_transaction)(BSCallback*,WCHAR**); } BSCallbackVtbl; struct BSCallback { @@ -93,7 +94,7 @@ #define NSINSTREAM_THIS(iface) DEFINE_THIS(nsProtocolStream, InputStream, iface) static nsresult NSAPI nsInputStream_QueryInterface(nsIInputStream *iface, nsIIDRef riid, - nsQIResult result) + void **result) { nsProtocolStream *This = NSINSTREAM_THIS(iface); @@ -468,19 +469,26 @@ LPCWSTR szURL, LPCWSTR szHeaders, DWORD dwReserved, LPWSTR *pszAdditionalHeaders) { BSCallback *This = HTTPNEG_THIS(iface); - DWORD size; + HRESULT hres; TRACE("(%p)->(%s %s %d %p)\n", This, debugstr_w(szURL), debugstr_w(szHeaders), dwReserved, pszAdditionalHeaders); - if(!This->headers) { - *pszAdditionalHeaders = NULL; - return S_OK; - } + *pszAdditionalHeaders = NULL; - size = (strlenW(This->headers)+1)*sizeof(WCHAR); - *pszAdditionalHeaders = CoTaskMemAlloc(size); - memcpy(*pszAdditionalHeaders, This->headers, size); + hres = This->vtbl->beginning_transaction(This, pszAdditionalHeaders); + if(hres != S_FALSE) + return hres; + + if(This->headers) { + DWORD size; + + size = (strlenW(This->headers)+1)*sizeof(WCHAR); + *pszAdditionalHeaders = CoTaskMemAlloc(size); + if(!*pszAdditionalHeaders) + return E_OUTOFMEMORY; + memcpy(*pszAdditionalHeaders, This->headers, size); + } return S_OK; } @@ -638,20 +646,81 @@ FIXME("handle result\n"); } +static HRESULT parse_headers(const WCHAR *headers, struct list *headers_list) +{ + const WCHAR *header, *header_end, *colon, *value; + HRESULT hres; + + header = headers; + while(*header) { + if(header[0] == '\r' && header[1] == '\n' && !header[2]) + break; + for(colon = header; *colon && *colon != ':' && *colon != '\r'; colon++); + if(*colon != ':') + return E_FAIL; + + value = colon+1; + while(*value == ' ') + value++; + if(!*value) + return E_FAIL; + + for(header_end = value+1; *header_end && *header_end != '\r'; header_end++); + + hres = set_http_header(headers_list, header, colon-header, value, header_end-value); + if(FAILED(hres)) + return hres; + + header = header_end; + if(header[0] == '\r' && header[1] == '\n') + header += 2; + } + + return S_OK; +} + +static HRESULT read_post_data_stream(nsIInputStream *stream, HGLOBAL *post_data, + ULONG *post_data_len) +{ + PRUint32 data_len = 0, available = 0; + char *data; + nsresult nsres; + + nsres = nsIInputStream_Available(stream, &available); + if(NS_FAILED(nsres)) + return E_FAIL; + + data = GlobalAlloc(0, available+1); + if(!data) + return E_OUTOFMEMORY; + + nsres = nsIInputStream_Read(stream, data, available, &data_len); + if(NS_FAILED(nsres)) { + GlobalFree(data); + return E_FAIL; + } + + data[data_len] = 0; + *post_data = data; + *post_data_len = data_len; + return S_OK; +} + static void parse_post_data(nsIInputStream *post_data_stream, LPWSTR *headers_ret, HGLOBAL *post_data_ret, ULONG *post_data_len_ret) { - PRUint32 post_data_len = 0, available = 0; + ULONG post_data_len; HGLOBAL post_data = NULL; LPWSTR headers = NULL; DWORD headers_len = 0, len; const char *ptr, *ptr2, *post_data_end; - - nsIInputStream_Available(post_data_stream, &available); - post_data = GlobalAlloc(0, available+1); - nsIInputStream_Read(post_data_stream, post_data, available, &post_data_len); + HRESULT hres; - TRACE("post_data = %s\n", debugstr_an(post_data, post_data_len)); + hres = read_post_data_stream(post_data_stream, &post_data, &post_data_len); + if(FAILED(hres)) { + FIXME("read_post_data_stream failed: %08x\n", hres); + return; + } ptr = ptr2 = post_data; post_data_end = (const char*)post_data+post_data_len; @@ -831,6 +900,11 @@ return S_OK; } +static HRESULT BufferBSC_beginning_transaction(BSCallback *bsc, WCHAR **additional_headers) +{ + return S_FALSE; +} + #undef BUFFERBSC_THIS static const BSCallbackVtbl BufferBSCVtbl = { @@ -840,7 +914,8 @@ BufferBSC_stop_binding, BufferBSC_read_data, BufferBSC_on_progress, - BufferBSC_on_response + BufferBSC_on_response, + BufferBSC_beginning_transaction }; @@ -889,7 +964,7 @@ nsProtocolStream *nsstream; }; -static void on_start_nsrequest(nsChannelBSC *This) +static HRESULT on_start_nsrequest(nsChannelBSC *This) { nsresult nsres; @@ -899,26 +974,45 @@ nsres = nsIStreamListener_OnStartRequest(This->nslistener, (nsIRequest*)NSCHANNEL(This->nschannel), This->nscontext); - if(NS_FAILED(nsres)) + if(NS_FAILED(nsres)) { FIXME("OnStartRequest failed: %08x\n", nsres); + return E_FAIL; + } + + if(This->window) { + update_window_doc(This->window); + if(This->window->doc != This->bsc.doc) + This->bsc.doc = This->window->doc; + if(This->window->readystate != READYSTATE_LOADING) + set_ready_state(This->window, READYSTATE_LOADING); + } + + return S_OK; } static void on_stop_nsrequest(nsChannelBSC *This, HRESULT result) { nsresult nsres; - if(!This->nslistener) - return; - if(!This->bsc.readed && SUCCEEDED(result)) { TRACE("No data read! Calling OnStartRequest\n"); on_start_nsrequest(This); } - nsres = nsIStreamListener_OnStopRequest(This->nslistener, (nsIRequest*)NSCHANNEL(This->nschannel), - This->nscontext, SUCCEEDED(result) ? NS_OK : NS_ERROR_FAILURE); - if(NS_FAILED(nsres)) - WARN("OnStopRequest failed: %08x\n", nsres); + if(This->nslistener) { + nsres = nsIStreamListener_OnStopRequest(This->nslistener, + (nsIRequest*)NSCHANNEL(This->nschannel), + This->nscontext, SUCCEEDED(result) ? NS_OK : NS_ERROR_FAILURE); + if(NS_FAILED(nsres)) + WARN("OnStopRequet failed: %08x\n", nsres); + } + + if(This->nschannel->load_group) { + nsres = nsILoadGroup_RemoveRequest(This->nschannel->load_group, + (nsIRequest*)NSCHANNEL(This->nschannel), NULL, NS_OK); + if(NS_FAILED(nsres)) + ERR("RemoveRequest failed: %08x\n", nsres); + } } static HRESULT read_stream_data(nsChannelBSC *This, IStream *stream) @@ -972,12 +1066,6 @@ } on_start_nsrequest(This); - - if(This->window) { - update_window_doc(This->window); - if(This->window->readystate != READYSTATE_LOADING) - set_ready_state(This->window, READYSTATE_LOADING); - } } This->bsc.readed += This->nsstream->buf_size; @@ -998,20 +1086,6 @@ return S_OK; } -static void add_nsrequest(nsChannelBSC *This) -{ - nsresult nsres; - - if(!This->nschannel || !This->nschannel->load_group) - return; - - nsres = nsILoadGroup_AddRequest(This->nschannel->load_group, - (nsIRequest*)NSCHANNEL(This->nschannel), This->nscontext); - - if(NS_FAILED(nsres)) - ERR("AddRequest failed:%08x\n", nsres); -} - #define NSCHANNELBSC_THIS(bsc) ((nsChannelBSC*) bsc) static void nsChannelBSC_destroy(BSCallback *bsc) @@ -1033,7 +1107,8 @@ { nsChannelBSC *This = NSCHANNELBSC_THIS(bsc); - add_nsrequest(This); + if(This->window) + This->window->doc->skip_mutation_notif = FALSE; return S_OK; } @@ -1041,33 +1116,72 @@ static HRESULT nsChannelBSC_init_bindinfo(BSCallback *bsc) { nsChannelBSC *This = NSCHANNELBSC_THIS(bsc); + HRESULT hres; if(This->nschannel && This->nschannel->post_data_stream) { - parse_post_data(This->nschannel->post_data_stream, &This->bsc.headers, &This->bsc.post_data, &This->bsc.post_data_len); - TRACE("headers = %s post_data = %s\n", debugstr_w(This->bsc.headers), - debugstr_an(This->bsc.post_data, This->bsc.post_data_len)); + if(This->nschannel->parse_stream) { + WCHAR *headers; + + parse_post_data(This->nschannel->post_data_stream, &headers, + &This->bsc.post_data, &This->bsc.post_data_len); + + hres = parse_headers(headers, &This->nschannel->request_headers); + heap_free(headers); + if(FAILED(hres)) + return hres; + }else { + hres = read_post_data_stream(This->nschannel->post_data_stream, + &This->bsc.post_data, &This->bsc.post_data_len); + if(FAILED(hres)) + return hres; + } + + TRACE("post_data = %s\n", debugstr_an(This->bsc.post_data, This->bsc.post_data_len)); } return S_OK; } -static HRESULT nsChannelBSC_stop_binding(BSCallback *bsc, HRESULT result) +typedef struct { + task_t header; + nsChannelBSC *bsc; +} stop_request_task_t; + +static void stop_request_proc(task_t *_task) { - nsChannelBSC *This = NSCHANNELBSC_THIS(bsc); + stop_request_task_t *task = (stop_request_task_t*)_task; - on_stop_nsrequest(This, result); + TRACE("(%p)\n", task->bsc); - if(This->nslistener) { - if(This->nschannel->load_group) { - nsresult nsres; + on_stop_nsrequest(task->bsc, S_OK); + IBindStatusCallback_Release(STATUSCLB(&task->bsc->bsc)); +} - nsres = nsILoadGroup_RemoveRequest(This->nschannel->load_group, - (nsIRequest*)NSCHANNEL(This->nschannel), NULL, NS_OK); - if(NS_FAILED(nsres)) - ERR("RemoveRequest failed: %08x\n", nsres); - } +static HRESULT async_stop_request(nsChannelBSC *This) +{ + stop_request_task_t *task; + + task = heap_alloc(sizeof(*task)); + if(!task) + return E_OUTOFMEMORY; + + IBindStatusCallback_AddRef(STATUSCLB(&This->bsc)); + task->bsc = This; + push_task(&task->header, stop_request_proc, This->bsc.doc->basedoc.doc_obj->basedoc.task_magic); + return S_OK; +} + +static HRESULT nsChannelBSC_stop_binding(BSCallback *bsc, HRESULT result) +{ + nsChannelBSC *This = NSCHANNELBSC_THIS(bsc); + + if(This->window && SUCCEEDED(result)) { + result = async_stop_request(This); + if(SUCCEEDED(result)) + return S_OK; } + on_stop_nsrequest(This, result); return S_OK; } @@ -1104,68 +1218,73 @@ LPCWSTR response_headers) { nsChannelBSC *This = NSCHANNELBSC_THIS(bsc); + HRESULT hres; This->nschannel->response_status = response_code; if(response_headers) { - const WCHAR *hdr_start, *hdr_end; + const WCHAR *headers; - hdr_start = strchrW(response_headers, '\r'); - while(hdr_start) { - const WCHAR *colon; - struct ResponseHeader *new_header; - int len; - - hdr_start += 2; - hdr_end = strchrW(hdr_start, '\r'); - if(!hdr_end) { - WARN("Header doesn't end with CRLF: %s\n", wine_dbgstr_w(hdr_start)); - break; + headers = strchrW(response_headers, '\r'); + if(headers && headers[1] == '\n') { + headers += 2; + hres = parse_headers(headers, &This->nschannel->response_headers); + if(FAILED(hres)) { + WARN("parsing headers failed: %08x\n", hres); + return hres; } - if(hdr_end == hdr_start) - break; + } + } - for(colon = hdr_start; *colon != ':' && colon != hdr_end; ++colon); - if(*colon != ':') { - WARN("Header missing colon: %s\n", wine_dbgstr_w(hdr_start)); - hdr_start = strchrW(hdr_start, '\r'); - continue; - } + return S_OK; +} - new_header = heap_alloc(sizeof(struct ResponseHeader)); - if(!new_header) - return E_OUTOFMEMORY; - - len = colon - hdr_start; - new_header->header = heap_alloc((len + 1) * sizeof(WCHAR)); - if(!new_header->header) { - heap_free(new_header); - return E_OUTOFMEMORY; - } - memcpy(new_header->header, hdr_start, len * sizeof(WCHAR)); - new_header->header[len] = 0; +static HRESULT nsChannelBSC_beginning_transaction(BSCallback *bsc, WCHAR **additional_headers) +{ + nsChannelBSC *This = NSCHANNELBSC_THIS(bsc); + http_header_t *iter; + DWORD len = 0; + WCHAR *ptr; - colon++; - while(*colon == ' ') - colon++; - - len = hdr_end - colon; - new_header->data = heap_alloc((len + 1) * sizeof(WCHAR)); - if(!new_header->data) { - heap_free(new_header->header); - heap_free(new_header); - return E_OUTOFMEMORY; - } - memcpy(new_header->data, colon, len * sizeof(WCHAR)); - new_header->data[len] = 0; + static const WCHAR content_lengthW[] = + {'C','o','n','t','e','n','t','-','L','e','n','g','t','h',0}; - list_add_head(&This->nschannel->response_headers, &new_header->entry); - TRACE("Adding header to list: (%s):(%s)\n", wine_dbgstr_w(new_header->header), wine_dbgstr_w(new_header->data)); + if(!This->nschannel) + return S_FALSE; - hdr_start = strchrW(hdr_start, '\r'); - } + LIST_FOR_EACH_ENTRY(iter, &This->nschannel->request_headers, http_header_t, entry) { + if(strcmpW(iter->header, content_lengthW)) + len += strlenW(iter->header) + 2 /* ": " */ + strlenW(iter->data) + 2 /* "\r\n" */; } + if(!len) + return S_OK; + + *additional_headers = ptr = CoTaskMemAlloc((len+1)*sizeof(WCHAR)); + if(!ptr) + return E_OUTOFMEMORY; + + LIST_FOR_EACH_ENTRY(iter, &This->nschannel->request_headers, http_header_t, entry) { + if(!strcmpW(iter->header, content_lengthW)) + continue; + + len = strlenW(iter->header); + memcpy(ptr, iter->header, len*sizeof(WCHAR)); + ptr += len; + + *ptr++ = ':'; + *ptr++ = ' '; + + len = strlenW(iter->data); + memcpy(ptr, iter->data, len*sizeof(WCHAR)); + ptr += len; + + *ptr++ = '\r'; + *ptr++ = '\n'; + } + + *ptr = 0; + return S_OK; } @@ -1178,7 +1297,8 @@ nsChannelBSC_stop_binding, nsChannelBSC_read_data, nsChannelBSC_on_progress, - nsChannelBSC_on_response + nsChannelBSC_on_response, + nsChannelBSC_beginning_transaction }; HRESULT create_channelbsc(IMoniker *mon, WCHAR *headers, BYTE *post_data, DWORD post_data_size, nsChannelBSC **retval) @@ -1285,7 +1405,7 @@ HRESULT channelbsc_load_stream(nsChannelBSC *bscallback, IStream *stream) { - HRESULT hres; + HRESULT hres = S_OK; if(!bscallback->nschannel) { ERR("NULL nschannel\n"); @@ -1296,10 +1416,12 @@ if(!bscallback->nschannel->content_type) return E_OUTOFMEMORY; - add_nsrequest(bscallback); - - hres = read_stream_data(bscallback, stream); - IBindStatusCallback_OnStopBinding(STATUSCLB(&bscallback->bsc), hres, ERROR_SUCCESS); + if(stream) + hres = read_stream_data(bscallback, stream); + if(SUCCEEDED(hres)) + hres = async_stop_request(bscallback); + if(FAILED(hres)) + IBindStatusCallback_OnStopBinding(STATUSCLB(&bscallback->bsc), hres, ERROR_SUCCESS); return hres; } @@ -1316,6 +1438,16 @@ nsISupports_AddRef(context); This->nscontext = context; } + + if(This->bsc.headers) { + HRESULT hres; + + hres = parse_headers(This->bsc.headers, &channel->request_headers); + heap_free(This->bsc.headers); + This->bsc.headers = NULL; + if(FAILED(hres)) + WARN("parse_headers failed: %08x\n", hres); + } } HRESULT hlink_frame_navigate(HTMLDocument *doc, LPCWSTR url, diff -Nru wine1.3-1.3.0/dlls/mshtml/Nl.rc wine1.3-1.3.1/dlls/mshtml/Nl.rc --- wine1.3-1.3.0/dlls/mshtml/Nl.rc 2010-07-30 18:43:56.000000000 +0100 +++ wine1.3-1.3.1/dlls/mshtml/Nl.rc 2010-08-20 18:23:50.000000000 +0100 @@ -24,6 +24,12 @@ STRINGTABLE { + IDS_STATUS_DONE "Klaar" + IDS_STATUS_DOWNLOADINGFROM "Downloaden van %s..." +} + +STRINGTABLE +{ IDS_HTMLDISABLED "De HTML weergave is op dit moment uitgeschakeld." IDS_HTMLDOCUMENT "HTML document" IDS_DOWNLOADING "Bezig met downloaden..." diff -Nru wine1.3-1.3.0/dlls/mshtml/nsembed.c wine1.3-1.3.1/dlls/mshtml/nsembed.c --- wine1.3-1.3.0/dlls/mshtml/nsembed.c 2010-07-30 18:43:56.000000000 +0100 +++ wine1.3-1.3.1/dlls/mshtml/nsembed.c 2010-08-20 18:23:50.000000000 +0100 @@ -52,18 +52,18 @@ #define NS_STRING_CONTAINER_INIT_DEPEND 0x0002 #define NS_CSTRING_CONTAINER_INIT_DEPEND 0x0002 -static nsresult (*NS_InitXPCOM2)(nsIServiceManager**,void*,void*); -static nsresult (*NS_ShutdownXPCOM)(nsIServiceManager*); -static nsresult (*NS_GetComponentRegistrar)(nsIComponentRegistrar**); -static nsresult (*NS_StringContainerInit2)(nsStringContainer*,const PRUnichar*,PRUint32,PRUint32); -static nsresult (*NS_CStringContainerInit2)(nsCStringContainer*,const char*,PRUint32,PRUint32); -static nsresult (*NS_StringContainerFinish)(nsStringContainer*); -static nsresult (*NS_CStringContainerFinish)(nsCStringContainer*); -static nsresult (*NS_StringSetData)(nsAString*,const PRUnichar*,PRUint32); -static nsresult (*NS_CStringSetData)(nsACString*,const char*,PRUint32); -static nsresult (*NS_NewLocalFile)(const nsAString*,PRBool,nsIFile**); -static PRUint32 (*NS_StringGetData)(const nsAString*,const PRUnichar **,PRBool*); -static PRUint32 (*NS_CStringGetData)(const nsACString*,const char**,PRBool*); +static nsresult (CDECL *NS_InitXPCOM2)(nsIServiceManager**,void*,void*); +static nsresult (CDECL *NS_ShutdownXPCOM)(nsIServiceManager*); +static nsresult (CDECL *NS_GetComponentRegistrar)(nsIComponentRegistrar**); +static nsresult (CDECL *NS_StringContainerInit2)(nsStringContainer*,const PRUnichar*,PRUint32,PRUint32); +static nsresult (CDECL *NS_CStringContainerInit2)(nsCStringContainer*,const char*,PRUint32,PRUint32); +static nsresult (CDECL *NS_StringContainerFinish)(nsStringContainer*); +static nsresult (CDECL *NS_CStringContainerFinish)(nsCStringContainer*); +static nsresult (CDECL *NS_StringSetData)(nsAString*,const PRUnichar*,PRUint32); +static nsresult (CDECL *NS_CStringSetData)(nsACString*,const char*,PRUint32); +static nsresult (CDECL *NS_NewLocalFile)(const nsAString*,PRBool,nsIFile**); +static PRUint32 (CDECL *NS_StringGetData)(const nsAString*,const PRUnichar **,PRBool*); +static PRUint32 (CDECL *NS_CStringGetData)(const nsACString*,const char**,PRBool*); static HINSTANCE hXPCOM = NULL; @@ -74,6 +74,8 @@ static const WCHAR wszNsContainer[] = {'N','s','C','o','n','t','a','i','n','e','r',0}; static ATOM nscontainer_class; +static WCHAR gecko_path[MAX_PATH]; +static unsigned gecko_path_len; static LRESULT WINAPI nsembed_proc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) { @@ -411,6 +413,7 @@ nsIComponentRegistrar *registrar = NULL; nsAString path; nsIFile *gre_dir; + WCHAR *ptr; nsAString_InitDepend(&path, gre_path); nsres = NS_NewLocalFile(&path, FALSE, &gre_dir); @@ -428,6 +431,13 @@ return FALSE; } + strcpyW(gecko_path, gre_path); + for(ptr = gecko_path; *ptr; ptr++) { + if(*ptr == '\\') + *ptr = '/'; + } + gecko_path_len = ptr-gecko_path; + nsres = nsIServiceManager_QueryInterface(pServMgr, &IID_nsIComponentManager, (void**)&pCompMgr); if(NS_FAILED(nsres)) ERR("Could not get nsIComponentManager: %08x\n", nsres); @@ -788,6 +798,26 @@ /* if (hXPCOM) FreeLibrary(hXPCOM); */ } +BOOL is_gecko_path(const char *path) +{ + WCHAR *buf, *ptr; + BOOL ret; + + buf = heap_strdupAtoW(path); + if(strlenW(buf) < gecko_path_len) + return FALSE; + + buf[gecko_path_len] = 0; + for(ptr = buf; *ptr; ptr++) { + if(*ptr == '\\') + *ptr = '/'; + } + + ret = !strcmpiW(buf, gecko_path); + heap_free(buf); + return ret; +} + /********************************************************** * nsIWebBrowserChrome interface */ @@ -795,7 +825,7 @@ #define NSWBCHROME_THIS(iface) DEFINE_THIS(NSContainer, WebBrowserChrome, iface) static nsresult NSAPI nsWebBrowserChrome_QueryInterface(nsIWebBrowserChrome *iface, - nsIIDRef riid, nsQIResult result) + nsIIDRef riid, void **result) { NSContainer *This = NSWBCHROME_THIS(iface); @@ -979,7 +1009,7 @@ #define NSCML_THIS(iface) DEFINE_THIS(NSContainer, ContextMenuListener, iface) static nsresult NSAPI nsContextMenuListener_QueryInterface(nsIContextMenuListener *iface, - nsIIDRef riid, nsQIResult result) + nsIIDRef riid, void **result) { NSContainer *This = NSCML_THIS(iface); return nsIWebBrowserChrome_QueryInterface(NSWBCHROME(This), riid, result); @@ -1061,7 +1091,7 @@ #define NSURICL_THIS(iface) DEFINE_THIS(NSContainer, URIContentListener, iface) static nsresult NSAPI nsURIContentListener_QueryInterface(nsIURIContentListener *iface, - nsIIDRef riid, nsQIResult result) + nsIIDRef riid, void **result) { NSContainer *This = NSURICL_THIS(iface); return nsIWebBrowserChrome_QueryInterface(NSWBCHROME(This), riid, result); @@ -1231,7 +1261,7 @@ #define NSEMBWNDS_THIS(iface) DEFINE_THIS(NSContainer, EmbeddingSiteWindow, iface) static nsresult NSAPI nsEmbeddingSiteWindow_QueryInterface(nsIEmbeddingSiteWindow *iface, - nsIIDRef riid, nsQIResult result) + nsIIDRef riid, void **result) { NSContainer *This = NSEMBWNDS_THIS(iface); return nsIWebBrowserChrome_QueryInterface(NSWBCHROME(This), riid, result); @@ -1339,7 +1369,7 @@ #define NSTOOLTIP_THIS(iface) DEFINE_THIS(NSContainer, TooltipListener, iface) static nsresult NSAPI nsTooltipListener_QueryInterface(nsITooltipListener *iface, nsIIDRef riid, - nsQIResult result) + void **result) { NSContainer *This = NSTOOLTIP_THIS(iface); return nsIWebBrowserChrome_QueryInterface(NSWBCHROME(This), riid, result); @@ -1391,7 +1421,7 @@ #define NSIFACEREQ_THIS(iface) DEFINE_THIS(NSContainer, InterfaceRequestor, iface) static nsresult NSAPI nsInterfaceRequestor_QueryInterface(nsIInterfaceRequestor *iface, - nsIIDRef riid, nsQIResult result) + nsIIDRef riid, void **result) { NSContainer *This = NSIFACEREQ_THIS(iface); return nsIWebBrowserChrome_QueryInterface(NSWBCHROME(This), riid, result); @@ -1410,7 +1440,7 @@ } static nsresult NSAPI nsInterfaceRequestor_GetInterface(nsIInterfaceRequestor *iface, - nsIIDRef riid, nsQIResult result) + nsIIDRef riid, void **result) { NSContainer *This = NSIFACEREQ_THIS(iface); @@ -1434,7 +1464,7 @@ #define NSWEAKREF_THIS(iface) DEFINE_THIS(NSContainer, WeakReference, iface) static nsresult NSAPI nsWeakReference_QueryInterface(nsIWeakReference *iface, - nsIIDRef riid, nsQIResult result) + nsIIDRef riid, void **result) { NSContainer *This = NSWEAKREF_THIS(iface); return nsIWebBrowserChrome_QueryInterface(NSWBCHROME(This), riid, result); @@ -1471,7 +1501,7 @@ #define NSSUPWEAKREF_THIS(iface) DEFINE_THIS(NSContainer, SupportsWeakReference, iface) static nsresult NSAPI nsSupportsWeakReference_QueryInterface(nsISupportsWeakReference *iface, - nsIIDRef riid, nsQIResult result) + nsIIDRef riid, void **result) { NSContainer *This = NSSUPWEAKREF_THIS(iface); return nsIWebBrowserChrome_QueryInterface(NSWBCHROME(This), riid, result); diff -Nru wine1.3-1.3.0/dlls/mshtml/nsevents.c wine1.3-1.3.1/dlls/mshtml/nsevents.c --- wine1.3-1.3.0/dlls/mshtml/nsevents.c 2010-07-30 18:43:56.000000000 +0100 +++ wine1.3-1.3.1/dlls/mshtml/nsevents.c 2010-08-20 18:23:50.000000000 +0100 @@ -34,6 +34,7 @@ #include "mshtml_private.h" #include "htmlevent.h" +#include "resource.h" WINE_DEFAULT_DEBUG_CHANNEL(mshtml); @@ -69,7 +70,7 @@ #define NSEVENTLIST_THIS(iface) DEFINE_THIS(nsEventListener, DOMEventListener, iface) static nsresult NSAPI nsDOMEventListener_QueryInterface(nsIDOMEventListener *iface, - nsIIDRef riid, nsQIResult result) + nsIIDRef riid, void **result) { nsEventListener *This = NSEVENTLIST_THIS(iface); @@ -239,10 +240,7 @@ if(doc_obj->view_sink) IAdviseSink_OnViewChange(doc_obj->view_sink, DVASPECT_CONTENT, -1); - if(doc_obj->frame) { - static const WCHAR wszDone[] = {'D','o','n','e',0}; - IOleInPlaceFrame_SetStatusText(doc_obj->frame, wszDone); - } + set_statustext(doc_obj, IDS_STATUS_DONE, NULL); update_title(doc_obj); } diff -Nru wine1.3-1.3.0/dlls/mshtml/nsiface.idl wine1.3-1.3.1/dlls/mshtml/nsiface.idl --- wine1.3-1.3.0/dlls/mshtml/nsiface.idl 2010-07-30 18:43:56.000000000 +0100 +++ wine1.3-1.3.1/dlls/mshtml/nsiface.idl 2010-08-20 18:23:50.000000000 +0100 @@ -42,7 +42,6 @@ typedef REFIID nsIIDRef; typedef nsIIDRef nsCIDRef; -typedef void** nsQIResult; typedef WCHAR PRUnichar; typedef ULONG PRUint32; typedef LONG PRInt32; @@ -100,7 +99,7 @@ ] interface nsISupports { - nsresult QueryInterface(nsIIDRef riid, nsQIResult result); + nsresult QueryInterface(nsIIDRef riid, void **result); nsrefcnt AddRef(); nsrefcnt Release(); } @@ -189,12 +188,12 @@ ] interface nsIComponentManager : nsISupports { - nsresult GetClassObject(nsCIDRef aClass, nsIIDRef aIID, nsQIResult result); - nsresult GetClassObjectByContractID(const char *aContractID, nsIIDRef aIID, nsQIResult result); + nsresult GetClassObject(nsCIDRef aClass, nsIIDRef aIID, void **result); + nsresult GetClassObjectByContractID(const char *aContractID, nsIIDRef aIID, void **result); nsresult CreateInstance(nsCIDRef aClass, nsISupports *aDelegate, nsIIDRef aIID, - nsQIResult result); + void **result); nsresult CreateInstanceByContractID(const char *aContractID, nsISupports *aDelegate, - nsIIDRef aIID, nsQIResult result); + nsIIDRef aIID, void **result); } [ diff -Nru wine1.3-1.3.0/dlls/mshtml/nsio.c wine1.3-1.3.1/dlls/mshtml/nsio.c --- wine1.3-1.3.0/dlls/mshtml/nsio.c 2010-07-30 18:43:56.000000000 +0100 +++ wine1.3-1.3.1/dlls/mshtml/nsio.c 2010-08-20 18:23:50.000000000 +0100 @@ -1,5 +1,5 @@ /* - * Copyright 2006-2007 Jacek Caban for CodeWeavers + * Copyright 2006-2010 Jacek Caban for CodeWeavers * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public @@ -51,6 +51,8 @@ static const WCHAR about_blankW[] = {'a','b','o','u','t',':','b','l','a','n','k',0}; +static const char *request_method_strings[] = {"GET", "PUT", "POST"}; + struct nsWineURI { const nsIURLVtbl *lpIURLVtbl; @@ -157,6 +159,7 @@ { nsIWebNavigation *web_navigation; nsIDocShell *doc_shell; + HTMLDocumentNode *doc; nsresult nsres; nsres = get_nsinterface((nsISupports*)window->nswindow, &IID_nsIWebNavigation, (void**)&web_navigation); @@ -172,9 +175,12 @@ return E_FAIL; } - uri->channel_bsc = channelbsc; + doc = window->doc; + doc->skip_mutation_notif = TRUE; nsres = nsIDocShell_LoadURI(doc_shell, NSURI(uri), NULL, flags, FALSE); + if(doc == window->doc) + doc->skip_mutation_notif = FALSE; uri->channel_bsc = NULL; nsIDocShell_Release(doc_shell); if(NS_FAILED(nsres)) { @@ -311,9 +317,123 @@ return This->url_scheme == URL_SCHEME_HTTP || This->url_scheme == URL_SCHEME_HTTPS; } +static http_header_t *find_http_header(struct list *headers, const WCHAR *name, int len) +{ + http_header_t *iter; + + LIST_FOR_EACH_ENTRY(iter, headers, http_header_t, entry) { + if(!strcmpiW(iter->header, name)) + return iter; + } + + return NULL; +} + +static nsresult get_channel_http_header(struct list *headers, const nsACString *header_name_str, + nsACString *_retval) +{ + const char *header_namea; + http_header_t *header; + WCHAR *header_name; + char *data; + + nsACString_GetData(header_name_str, &header_namea); + header_name = heap_strdupAtoW(header_namea); + if(!header_name) + return NS_ERROR_UNEXPECTED; + + header = find_http_header(headers, header_name, strlenW(header_name)); + heap_free(header_name); + if(!header) + return NS_ERROR_NOT_AVAILABLE; + + data = heap_strdupWtoA(header->data); + if(!data) + return NS_ERROR_UNEXPECTED; + + nsACString_SetData(_retval, data); + heap_free(data); + return NS_OK; +} + +HRESULT set_http_header(struct list *headers, const WCHAR *name, int name_len, + const WCHAR *value, int value_len) +{ + http_header_t *header; + + TRACE("%s: %s\n", debugstr_wn(name, name_len), debugstr_wn(value, value_len)); + + header = find_http_header(headers, name, name_len); + if(header) { + WCHAR *new_data; + + new_data = heap_strndupW(value, value_len); + if(!new_data) + return E_OUTOFMEMORY; + + heap_free(header->data); + header->data = new_data; + }else { + header = heap_alloc(sizeof(http_header_t)); + if(!header) + return E_OUTOFMEMORY; + + header->header = heap_strndupW(name, name_len); + header->data = heap_strndupW(value, value_len); + if(!header->header || !header->data) { + heap_free(header->header); + heap_free(header->data); + heap_free(header); + return E_OUTOFMEMORY; + } + + list_add_tail(headers, &header->entry); + } + + return S_OK; +} + +static nsresult set_channel_http_header(struct list *headers, const nsACString *name_str, + const nsACString *value_str) +{ + const char *namea, *valuea; + WCHAR *name, *value; + HRESULT hres; + + nsACString_GetData(name_str, &namea); + name = heap_strdupAtoW(namea); + if(!name) + return NS_ERROR_UNEXPECTED; + + nsACString_GetData(value_str, &valuea); + value = heap_strdupAtoW(valuea); + if(!value) { + heap_free(name); + return NS_ERROR_UNEXPECTED; + } + + hres = set_http_header(headers, name, strlenW(name), value, strlenW(value)); + + heap_free(name); + heap_free(value); + return SUCCEEDED(hres) ? NS_OK : NS_ERROR_UNEXPECTED; +} + +static void free_http_headers(struct list *list) +{ + http_header_t *iter, *iter_next; + + LIST_FOR_EACH_ENTRY_SAFE(iter, iter_next, list, http_header_t, entry) { + list_remove(&iter->entry); + heap_free(iter->header); + heap_free(iter->data); + heap_free(iter); + } +} + #define NSCHANNEL_THIS(iface) DEFINE_THIS(nsChannel, HttpChannel, iface) -static nsresult NSAPI nsChannel_QueryInterface(nsIHttpChannel *iface, nsIIDRef riid, nsQIResult result) +static nsresult NSAPI nsChannel_QueryInterface(nsIHttpChannel *iface, nsIIDRef riid, void **result) { nsChannel *This = NSCHANNEL_THIS(iface); @@ -364,8 +484,6 @@ LONG ref = InterlockedDecrement(&This->ref); if(!ref) { - struct ResponseHeader *header, *next_hdr; - nsIURI_Release(NSURI(This->uri)); if(This->owner) nsISupports_Release(This->owner); @@ -377,16 +495,14 @@ nsIInterfaceRequestor_Release(This->notif_callback); if(This->original_uri) nsIURI_Release(This->original_uri); - heap_free(This->content_type); - heap_free(This->charset); + if(This->referrer) + nsIURI_Release(This->referrer); - LIST_FOR_EACH_ENTRY_SAFE(header, next_hdr, &This->response_headers, struct ResponseHeader, entry) { - list_remove(&header->entry); - heap_free(header->header); - heap_free(header->data); - heap_free(header); - } + free_http_headers(&This->response_headers); + free_http_headers(&This->request_headers); + heap_free(This->content_type); + heap_free(This->charset); heap_free(This); } @@ -397,9 +513,9 @@ { nsChannel *This = NSCHANNEL_THIS(iface); - FIXME("(%p)->(%p)\n", This, aName); + TRACE("(%p)->(%p)\n", This, aName); - return NS_ERROR_NOT_IMPLEMENTED; + return nsIURI_GetSpec(NSURI(This->uri), aName); } static nsresult NSAPI nsChannel_IsPending(nsIHttpChannel *iface, PRBool *_retval) @@ -623,12 +739,9 @@ nsChannel *This = NSCHANNEL_THIS(iface); const char *content_type; - TRACE("(%p)->(%p)\n", This, aContentType); + TRACE("(%p)->(%s)\n", This, debugstr_nsacstr(aContentType)); nsACString_GetData(aContentType, &content_type); - - TRACE("content_type %s\n", content_type); - heap_free(This->content_type); This->content_type = heap_strdupA(content_type); @@ -656,7 +769,7 @@ { nsChannel *This = NSCHANNEL_THIS(iface); - FIXME("(%p)->(%p)\n", This, aContentCharset); + FIXME("(%p)->(%s)\n", This, debugstr_nsacstr(aContentCharset)); return NS_ERROR_NOT_IMPLEMENTED; } @@ -926,6 +1039,12 @@ if(open) nsres = async_open(This, window, This->uri->is_doc_uri, aListener, aContext); + if(NS_SUCCEEDED(nsres) && This->load_group) { + nsres = nsILoadGroup_AddRequest(This->load_group, (nsIRequest*)NSCHANNEL(This), aContext); + if(NS_FAILED(nsres)) + ERR("AddRequest failed: %08x\n", nsres); + } + IHTMLWindow2_Release(HTMLWINDOW2(window)); return nsres; } @@ -934,36 +1053,56 @@ { nsChannel *This = NSCHANNEL_THIS(iface); - FIXME("(%p)->(%p)\n", This, aRequestMethod); + TRACE("(%p)->(%p)\n", This, aRequestMethod); - return NS_ERROR_NOT_IMPLEMENTED; + nsACString_SetData(aRequestMethod, request_method_strings[This->request_method]); + return NS_OK; } static nsresult NSAPI nsChannel_SetRequestMethod(nsIHttpChannel *iface, const nsACString *aRequestMethod) { nsChannel *This = NSCHANNEL_THIS(iface); + const char *method; + unsigned i; - TRACE("(%p)->(%p): Returning NS_OK\n", This, aRequestMethod); + TRACE("(%p)->(%s)\n", This, debugstr_nsacstr(aRequestMethod)); - return NS_OK; + nsACString_GetData(aRequestMethod, &method); + for(i=0; i < sizeof(request_method_strings)/sizeof(*request_method_strings); i++) { + if(!strcasecmp(method, request_method_strings[i])) { + This->request_method = i; + return NS_OK; + } + } + + ERR("Invalid method %s\n", debugstr_a(method)); + return NS_ERROR_UNEXPECTED; } static nsresult NSAPI nsChannel_GetReferrer(nsIHttpChannel *iface, nsIURI **aReferrer) { nsChannel *This = NSCHANNEL_THIS(iface); - FIXME("(%p)->(%p)\n", This, aReferrer); + TRACE("(%p)->(%p)\n", This, aReferrer); - return NS_ERROR_NOT_IMPLEMENTED; + if(This->referrer) + nsIURI_AddRef(This->referrer); + *aReferrer = This->referrer; + return NS_OK; } static nsresult NSAPI nsChannel_SetReferrer(nsIHttpChannel *iface, nsIURI *aReferrer) { nsChannel *This = NSCHANNEL_THIS(iface); - FIXME("(%p)->(%p)\n", This, aReferrer); + TRACE("(%p)->(%p)\n", This, aReferrer); + if(aReferrer) + nsIURI_AddRef(aReferrer); + if(This->referrer) + nsIURI_Release(This->referrer); + This->referrer = aReferrer; return NS_OK; } @@ -972,9 +1111,9 @@ { nsChannel *This = NSCHANNEL_THIS(iface); - FIXME("(%p)->(%p %p)\n", This, aHeader, _retval); + TRACE("(%p)->(%s %p)\n", This, debugstr_nsacstr(aHeader), _retval); - return NS_ERROR_NOT_IMPLEMENTED; + return get_channel_http_header(&This->request_headers, aHeader, _retval); } static nsresult NSAPI nsChannel_SetRequestHeader(nsIHttpChannel *iface, @@ -982,9 +1121,12 @@ { nsChannel *This = NSCHANNEL_THIS(iface); - FIXME("(%p)->(%p %p %x)\n", This, aHeader, aValue, aMerge); + TRACE("(%p)->(%s %s %x)\n", This, debugstr_nsacstr(aHeader), debugstr_nsacstr(aValue), aMerge); - return NS_OK; + if(aMerge) + FIXME("aMerge not supported\n"); + + return set_channel_http_header(&This->request_headers, aHeader, aValue); } static nsresult NSAPI nsChannel_VisitRequestHeaders(nsIHttpChannel *iface, @@ -1077,34 +1219,10 @@ const nsACString *header, nsACString *_retval) { nsChannel *This = NSCHANNEL_THIS(iface); - const char *header_str; - WCHAR *header_wstr; - struct ResponseHeader *this_header; - - nsACString_GetData(header, &header_str); - TRACE("(%p)->(%p(%s) %p)\n", This, header, header_str, _retval); - - header_wstr = heap_strdupAtoW(header_str); - if(!header_wstr) - return NS_ERROR_UNEXPECTED; - - LIST_FOR_EACH_ENTRY(this_header, &This->response_headers, struct ResponseHeader, entry) { - if(!strcmpW(this_header->header, header_wstr)) { - char *data = heap_strdupWtoA(this_header->data); - if(!data) { - heap_free(header_wstr); - return NS_ERROR_UNEXPECTED; - } - nsACString_SetData(_retval, data); - heap_free(data); - heap_free(header_wstr); - return NS_OK; - } - } - heap_free(header_wstr); + TRACE("(%p)->(%s %p)\n", This, debugstr_nsacstr(header), _retval); - return NS_ERROR_NOT_AVAILABLE; + return get_channel_http_header(&This->response_headers, header, _retval); } static nsresult NSAPI nsChannel_SetResponseHeader(nsIHttpChannel *iface, @@ -1112,7 +1230,7 @@ { nsChannel *This = NSCHANNEL_THIS(iface); - FIXME("(%p)->(%p %p %x)\n", This, header, value, merge); + FIXME("(%p)->(%s %s %x)\n", This, debugstr_nsacstr(header), debugstr_nsacstr(value), merge); return NS_ERROR_NOT_IMPLEMENTED; } @@ -1201,7 +1319,7 @@ #define NSUPCHANNEL_THIS(iface) DEFINE_THIS(nsChannel, UploadChannel, iface) static nsresult NSAPI nsUploadChannel_QueryInterface(nsIUploadChannel *iface, nsIIDRef riid, - nsQIResult result) + void **result) { nsChannel *This = NSUPCHANNEL_THIS(iface); return nsIChannel_QueryInterface(NSCHANNEL(This), riid, result); @@ -1225,17 +1343,31 @@ nsChannel *This = NSUPCHANNEL_THIS(iface); const char *content_type; - TRACE("(%p)->(%p %p %d)\n", This, aStream, aContentType, aContentLength); + static const WCHAR content_typeW[] = + {'C','o','n','t','e','n','t','-','T','y','p','e',0}; - if(This->post_data_stream) - nsIInputStream_Release(This->post_data_stream); + TRACE("(%p)->(%p %s %d)\n", This, aStream, debugstr_nsacstr(aContentType), aContentLength); + This->parse_stream = TRUE; if(aContentType) { nsACString_GetData(aContentType, &content_type); - if(*content_type) - FIXME("Unsupported aContentType argument: %s\n", debugstr_a(content_type)); + if(*content_type) { + WCHAR *ct; + + ct = heap_strdupAtoW(content_type); + if(!ct) + return NS_ERROR_UNEXPECTED; + + set_http_header(&This->request_headers, content_typeW, + sizeof(content_typeW)/sizeof(WCHAR), ct, strlenW(ct)); + heap_free(ct); + This->parse_stream = FALSE; + } } + if(This->post_data_stream) + nsIInputStream_Release(This->post_data_stream); + if(aContentLength != -1) FIXME("Unsupported acontentLength = %d\n", aContentLength); @@ -1245,6 +1377,7 @@ if(aStream) nsIInputStream_AddRef(aStream); + This->request_method = METHOD_POST; return NS_OK; } @@ -1275,7 +1408,7 @@ #define NSHTTPINTERNAL_THIS(iface) DEFINE_THIS(nsChannel, IHttpChannelInternal, iface) static nsresult NSAPI nsHttpChannelInternal_QueryInterface(nsIHttpChannelInternal *iface, nsIIDRef riid, - nsQIResult result) + void **result) { nsChannel *This = NSHTTPINTERNAL_THIS(iface); return nsIChannel_QueryInterface(NSCHANNEL(This), riid, result); @@ -1383,7 +1516,7 @@ #define NSURI_THIS(iface) DEFINE_THIS(nsWineURI, IURL, iface) -static nsresult NSAPI nsURI_QueryInterface(nsIURL *iface, nsIIDRef riid, nsQIResult result) +static nsresult NSAPI nsURI_QueryInterface(nsIURL *iface, nsIIDRef riid, void **result) { nsWineURI *This = NSURI_THIS(iface); @@ -1452,8 +1585,8 @@ TRACE("(%p)->(%p)\n", This, aSpec); if(This->use_wine_url) { - char speca[INTERNET_MAX_URL_LENGTH] = "wine:"; - WideCharToMultiByte(CP_ACP, 0, This->wine_url, -1, speca+5, sizeof(speca)-5, NULL, NULL); + char speca[INTERNET_MAX_URL_LENGTH]; + WideCharToMultiByte(CP_ACP, 0, This->wine_url, -1, speca, sizeof(speca), NULL, NULL); nsACString_SetData(aSpec, speca); return NS_OK; @@ -1471,7 +1604,7 @@ { nsWineURI *This = NSURI_THIS(iface); - TRACE("(%p)->(%p)\n", This, aSpec); + TRACE("(%p)->(%p)\n", This, debugstr_nsacstr(aSpec)); if(This->uri) return nsIURI_SetSpec(This->uri, aSpec); @@ -1500,11 +1633,20 @@ TRACE("(%p)->(%p)\n", This, aScheme); if(This->use_wine_url) { - /* - * For Gecko we set scheme to unknown so it won't be handled - * as any special case. - */ - nsACString_SetData(aScheme, "wine"); + char scheme[INTERNET_MAX_SCHEME_LENGTH+1]; + WCHAR *ptr; + int len; + + ptr = strchrW(This->wine_url, ':'); + if(!ptr) { + nsACString_SetData(aScheme, "wine"); + return NS_OK; + } + + len = WideCharToMultiByte(CP_ACP, 0, This->wine_url, ptr-This->wine_url, scheme, + sizeof(scheme), NULL, NULL); + scheme[min(len,sizeof(scheme)-1)] = 0; + nsACString_SetData(aScheme, strcmp(scheme, "about") ? scheme : "wine"); return NS_OK; } @@ -1519,7 +1661,7 @@ { nsWineURI *This = NSURI_THIS(iface); - TRACE("(%p)->(%p)\n", This, aScheme); + TRACE("(%p)->(%s)\n", This, debugstr_nsacstr(aScheme)); if(This->uri) return nsIURI_SetScheme(This->uri, aScheme); @@ -1545,7 +1687,7 @@ { nsWineURI *This = NSURI_THIS(iface); - TRACE("(%p)->(%p)\n", This, aUserPass); + TRACE("(%p)->(%s)\n", This, debugstr_nsacstr(aUserPass)); if(This->uri) return nsIURI_SetUserPass(This->uri, aUserPass); @@ -1571,7 +1713,7 @@ { nsWineURI *This = NSURI_THIS(iface); - TRACE("(%p)->(%p)\n", This, aUsername); + TRACE("(%p)->(%s)\n", This, debugstr_nsacstr(aUsername)); if(This->uri) return nsIURI_SetUsername(This->uri, aUsername); @@ -1597,7 +1739,7 @@ { nsWineURI *This = NSURI_THIS(iface); - TRACE("(%p)->(%p)\n", This, aPassword); + TRACE("(%p)->(%s)\n", This, debugstr_nsacstr(aPassword)); if(This->uri) return nsIURI_SetPassword(This->uri, aPassword); @@ -1623,7 +1765,7 @@ { nsWineURI *This = NSURI_THIS(iface); - TRACE("(%p)->(%p)\n", This, aHostPort); + TRACE("(%p)->(%s)\n", This, debugstr_nsacstr(aHostPort)); if(This->uri) return nsIURI_SetHostPort(This->uri, aHostPort); @@ -1649,7 +1791,7 @@ { nsWineURI *This = NSURI_THIS(iface); - TRACE("(%p)->(%p)\n", This, aHost); + TRACE("(%p)->(%s)\n", This, debugstr_nsacstr(aHost)); if(This->uri) return nsIURI_SetHost(This->uri, aHost); @@ -1702,10 +1844,9 @@ nsWineURI *This = NSURI_THIS(iface); const char *path; - nsACString_GetData(aPath, &path); - TRACE("(%p)->(%p(%s))\n", This, aPath, debugstr_a(path)); - + TRACE("(%p)->(%s)\n", This, debugstr_nsacstr(aPath)); + nsACString_GetData(aPath, &path); if(This->wine_url) { WCHAR new_url[INTERNET_MAX_URL_LENGTH]; DWORD size = sizeof(new_url)/sizeof(WCHAR); @@ -1803,18 +1944,44 @@ return NS_OK; } -static nsresult NSAPI nsURI_Resolve(nsIURL *iface, const nsACString *arelativePath, +static nsresult NSAPI nsURI_Resolve(nsIURL *iface, const nsACString *aRelativePath, nsACString *_retval) { nsWineURI *This = NSURI_THIS(iface); + WCHAR url[INTERNET_MAX_URL_LENGTH]; + const char *patha; + WCHAR *path; + char *urla; + DWORD len; + HRESULT hres; - TRACE("(%p)->(%p %p)\n", This, arelativePath, _retval); + TRACE("(%p)->(%s %p)\n", This, debugstr_nsacstr(aRelativePath), _retval); if(This->uri) - return nsIURI_Resolve(This->uri, arelativePath, _retval); + return nsIURI_Resolve(This->uri, aRelativePath, _retval); - FIXME("default action not implemented\n"); - return NS_ERROR_NOT_IMPLEMENTED; + nsACString_GetData(aRelativePath, &patha); + path = heap_strdupAtoW(patha); + if(!path) + return NS_ERROR_OUT_OF_MEMORY; + + hres = CoInternetCombineUrl(This->wine_url, path, + URL_ESCAPE_SPACES_ONLY|URL_DONT_ESCAPE_EXTRA_INFO, + url, sizeof(url)/sizeof(WCHAR), &len, 0); + heap_free(path); + if(FAILED(hres)) { + ERR("CoIntenetCombineUrl failed: %08x\n", hres); + return NS_ERROR_FAILURE; + } + + urla = heap_strdupWtoA(url); + if(!urla) + return NS_ERROR_OUT_OF_MEMORY; + + TRACE("returning %s\n", debugstr_a(urla)); + nsACString_SetData(_retval, urla); + heap_free(urla); + return NS_OK; } static nsresult NSAPI nsURI_GetAsciiSpec(nsIURL *iface, nsACString *aAsciiSpec) @@ -2238,7 +2405,7 @@ #define NSPROTHANDLER_THIS(iface) DEFINE_THIS(nsProtocolHandler, ProtocolHandler, iface) static nsresult NSAPI nsProtocolHandler_QueryInterface(nsIProtocolHandler *iface, nsIIDRef riid, - nsQIResult result) + void **result) { nsProtocolHandler *This = NSPROTHANDLER_THIS(iface); @@ -2330,7 +2497,8 @@ { nsProtocolHandler *This = NSPROTHANDLER_THIS(iface); - TRACE("((%p)->%p %s %p %p)\n", This, aSpec, debugstr_a(aOriginCharset), aBaseURI, _retval); + TRACE("((%p)->%s %s %p %p)\n", This, debugstr_nsacstr(aSpec), debugstr_a(aOriginCharset), + aBaseURI, _retval); if(This->nshandler) return nsIProtocolHandler_NewURI(This->nshandler, aSpec, aOriginCharset, aBaseURI, _retval); @@ -2386,7 +2554,7 @@ return NSPROTHANDLER(ret); } -static nsresult NSAPI nsIOService_QueryInterface(nsIIOService*,nsIIDRef,nsQIResult); +static nsresult NSAPI nsIOService_QueryInterface(nsIIOService*,nsIIDRef,void**); static nsrefcnt NSAPI nsIOService_AddRef(nsIIOService *iface) { @@ -2443,6 +2611,13 @@ return TRUE; } + if(!strncasecmp(spec, "file:", 5)) { + const char *ptr = spec+5; + while(*ptr == '/') + ptr++; + return is_gecko_path(ptr); + } + return FALSE; } @@ -2457,11 +2632,11 @@ nsACString spec_str; nsresult nsres; - nsACString_GetData(aSpec, &spec); - TRACE("(%p(%s) %s %p %p)\n", aSpec, debugstr_a(spec), debugstr_a(aOriginCharset), + TRACE("(%s %s %p %p)\n", debugstr_nsacstr(aSpec), debugstr_a(aOriginCharset), aBaseURI, _retval); + nsACString_GetData(aSpec, &spec); if(is_gecko_special_uri(spec)) return nsIIOService_NewURI(nsio, aSpec, aOriginCharset, aBaseURI, _retval); @@ -2556,7 +2731,9 @@ ret->lpIHttpChannelInternalVtbl = &nsHttpChannelInternalVtbl; ret->ref = 1; ret->uri = wine_uri; + ret->request_method = METHOD_GET; list_init(&ret->response_headers); + list_init(&ret->request_headers); nsIURI_AddRef(aURI); ret->original_uri = aURI; @@ -2570,7 +2747,7 @@ static nsresult NSAPI nsIOService_NewChannel(nsIIOService *iface, const nsACString *aSpec, const char *aOriginCharset, nsIURI *aBaseURI, nsIChannel **_retval) { - TRACE("(%p %s %p %p)\n", aSpec, debugstr_a(aOriginCharset), aBaseURI, _retval); + TRACE("(%s %s %p %p)\n", debugstr_nsacstr(aSpec), debugstr_a(aOriginCharset), aBaseURI, _retval); return nsIIOService_NewChannel(nsio, aSpec, aOriginCharset, aBaseURI, _retval); } @@ -2596,7 +2773,7 @@ static nsresult NSAPI nsIOService_ExtractScheme(nsIIOService *iface, const nsACString *urlString, nsACString * _retval) { - TRACE("(%p %p)\n", urlString, _retval); + TRACE("(%s %p)\n", debugstr_nsacstr(urlString), _retval); return nsIIOService_ExtractScheme(nsio, urlString, _retval); } @@ -2619,7 +2796,7 @@ static nsIIOService nsIOService = { &nsIOServiceVtbl }; static nsresult NSAPI nsNetUtil_QueryInterface(nsINetUtil *iface, nsIIDRef riid, - nsQIResult result) + void **result) { return nsIIOService_QueryInterface(&nsIOService, riid, result); } @@ -2637,7 +2814,7 @@ static nsresult NSAPI nsNetUtil_ParseContentType(nsINetUtil *iface, const nsACString *aTypeHeader, nsACString *aCharset, PRBool *aHadCharset, nsACString *aContentType) { - TRACE("(%p %p %p %p)\n", aTypeHeader, aCharset, aHadCharset, aContentType); + TRACE("(%s %p %p %p)\n", debugstr_nsacstr(aTypeHeader), aCharset, aHadCharset, aContentType); return nsINetUtil_ParseContentType(net_util, aTypeHeader, aCharset, aHadCharset, aContentType); } @@ -2671,7 +2848,7 @@ static nsresult NSAPI nsNetUtil_EscapeString(nsINetUtil *iface, const nsACString *aString, PRUint32 aEscapeType, nsACString *_retval) { - TRACE("(%p %x %p)\n", aString, aEscapeType, _retval); + TRACE("(%s %x %p)\n", debugstr_nsacstr(aString), aEscapeType, _retval); return nsINetUtil_EscapeString(net_util, aString, aEscapeType, _retval); } @@ -2679,7 +2856,7 @@ static nsresult NSAPI nsNetUtil_EscapeURL(nsINetUtil *iface, const nsACString *aStr, PRUint32 aFlags, nsACString *_retval) { - TRACE("(%p %08x %p)\n", aStr, aFlags, _retval); + TRACE("(%s %08x %p)\n", debugstr_nsacstr(aStr), aFlags, _retval); return nsINetUtil_EscapeURL(net_util, aStr, aFlags, _retval); } @@ -2687,7 +2864,7 @@ static nsresult NSAPI nsNetUtil_UnescapeString(nsINetUtil *iface, const nsACString *aStr, PRUint32 aFlags, nsACString *_retval) { - TRACE("(%p %08x %p)\n", aStr, aFlags, _retval); + TRACE("(%s %08x %p)\n", debugstr_nsacstr(aStr), aFlags, _retval); return nsINetUtil_UnescapeString(net_util, aStr, aFlags, _retval); } @@ -2695,7 +2872,8 @@ static nsresult NSAPI nsNetUtil_ExtractCharsetFromContentType(nsINetUtil *iface, const nsACString *aTypeHeader, nsACString *aCharset, PRInt32 *aCharsetStart, PRInt32 *aCharsetEnd, PRBool *_retval) { - TRACE("(%p %p %p %p %p)\n", aTypeHeader, aCharset, aCharsetStart, aCharsetEnd, _retval); + TRACE("(%s %p %p %p %p)\n", debugstr_nsacstr(aTypeHeader), aCharset, aCharsetStart, + aCharsetEnd, _retval); return nsINetUtil_ExtractCharsetFromContentType(net_util, aTypeHeader, aCharset, aCharsetStart, aCharsetEnd, _retval); } @@ -2717,7 +2895,7 @@ static nsINetUtil nsNetUtil = { &nsNetUtilVtbl }; static nsresult NSAPI nsIOService_QueryInterface(nsIIOService *iface, nsIIDRef riid, - nsQIResult result) + void **result) { *result = NULL; @@ -2738,7 +2916,7 @@ } static nsresult NSAPI nsIOServiceFactory_QueryInterface(nsIFactory *iface, nsIIDRef riid, - nsQIResult result) + void **result) { *result = NULL; diff -Nru wine1.3-1.3.0/dlls/mshtml/nsservice.c wine1.3-1.3.1/dlls/mshtml/nsservice.c --- wine1.3-1.3.0/dlls/mshtml/nsservice.c 2010-07-30 18:43:56.000000000 +0100 +++ wine1.3-1.3.1/dlls/mshtml/nsservice.c 2010-08-20 18:23:50.000000000 +0100 @@ -47,7 +47,7 @@ {0x0b666e3e,0x569a,0x462c,{0xa7,0xf0,0xb1,0x6b,0xb1,0x5d,0x42,0xff}}; static nsresult NSAPI nsWindowCreator_QueryInterface(nsIWindowCreator2 *iface, nsIIDRef riid, - nsQIResult result) + void **result) { *result = NULL; @@ -114,7 +114,7 @@ static nsIWindowCreator2 nsWindowCreator = { &nsWindowCreatorVtbl }; static nsresult NSAPI nsPromptService_QueryInterface(nsIPromptService *iface, - nsIIDRef riid, nsQIResult result) + nsIIDRef riid, void **result) { *result = NULL; @@ -280,7 +280,7 @@ static nsIPromptService nsPromptService = { &PromptServiceVtbl }; static nsresult NSAPI nsTooltipTextProvider_QueryInterface(nsITooltipTextProvider *iface, - nsIIDRef riid, nsQIResult result) + nsIIDRef riid, void **result) { *result = NULL; @@ -387,7 +387,7 @@ #define NSFACTORY_THIS(iface) DEFINE_THIS(nsServiceFactory, Factory, iface) static nsresult NSAPI nsServiceFactory_QueryInterface(nsIFactory *iface, nsIIDRef riid, - nsQIResult result) + void **result) { nsServiceFactory *This = NSFACTORY_THIS(iface); diff -Nru wine1.3-1.3.0/dlls/mshtml/persist.c wine1.3-1.3.1/dlls/mshtml/persist.c --- wine1.3-1.3.0/dlls/mshtml/persist.c 2010-07-30 18:43:56.000000000 +0100 +++ wine1.3-1.3.1/dlls/mshtml/persist.c 2010-08-20 18:23:50.000000000 +0100 @@ -37,6 +37,7 @@ #include "mshtml_private.h" #include "htmlevent.h" +#include "resource.h" WINE_DEFAULT_DEBUG_CHANNEL(mshtml); @@ -44,6 +45,7 @@ task_t header; HTMLDocumentObj *doc; BOOL set_download; + LPOLESTR url; } download_proc_task_t; static BOOL use_gecko_script(LPCWSTR url) @@ -134,8 +136,8 @@ TRACE("(%p)\n", doc); - if(doc->frame) - IOleInPlaceFrame_SetStatusText(doc->frame, NULL /* FIXME */); + set_statustext(doc, IDS_STATUS_DOWNLOADINGFROM, task->url); + CoTaskMemFree(task->url); if(!doc->client) return; @@ -243,26 +245,31 @@ } hres = create_doc_uri(This->window, url, &nsuri); - CoTaskMemFree(url); - if(FAILED(hres)) - return hres; - if(async_bsc) { - bscallback = async_bsc; - }else { - hres = create_channelbsc(mon, NULL, NULL, 0, &bscallback); - if(FAILED(hres)) - return hres; + if(SUCCEEDED(hres)) + { + if(async_bsc) { + bscallback = async_bsc; + }else { + hres = create_channelbsc(mon, NULL, NULL, 0, &bscallback); + } } - hres = load_nsuri(This->window, nsuri, bscallback, LOAD_INITIAL_DOCUMENT_URI); - nsISupports_Release((nsISupports*)nsuri); /* FIXME */ if(SUCCEEDED(hres)) - set_window_bscallback(This->window, bscallback); - if(bscallback != async_bsc) - IUnknown_Release((IUnknown*)bscallback); + { + hres = load_nsuri(This->window, nsuri, bscallback, LOAD_INITIAL_DOCUMENT_URI); + nsISupports_Release((nsISupports*)nsuri); /* FIXME */ + if(SUCCEEDED(hres)) + set_window_bscallback(This->window, bscallback); + if(bscallback != async_bsc) + IUnknown_Release((IUnknown*)bscallback); + } + if(FAILED(hres)) + { + CoTaskMemFree(url); return hres; + } HTMLDocument_LockContainer(This->doc_obj, TRUE); @@ -275,6 +282,7 @@ download_task = heap_alloc(sizeof(download_proc_task_t)); download_task->doc = This->doc_obj; download_task->set_download = set_download; + download_task->url = url; push_task(&download_task->header, set_downloading_proc, This->doc_obj->basedoc.task_magic); return S_OK; @@ -728,7 +736,7 @@ if(FAILED(hres)) return hres; - return start_binding(This->window, NULL, (BSCallback*)This->window->bscallback, NULL); + return channelbsc_load_stream(This->window->bscallback, NULL); } #undef PERSTRINIT_THIS diff -Nru wine1.3-1.3.0/dlls/mshtml/resource.h wine1.3-1.3.1/dlls/mshtml/resource.h --- wine1.3-1.3.0/dlls/mshtml/resource.h 2010-07-30 18:43:56.000000000 +0100 +++ wine1.3-1.3.1/dlls/mshtml/resource.h 2010-08-20 18:23:50.000000000 +0100 @@ -25,6 +25,10 @@ #define IDS_DOWNLOADING 7502 #define IDS_INSTALLING 7503 +#define NUM_STATUS_STRINGS 2 +#define IDS_STATUS_DOWNLOADINGFROM 7550 +#define IDS_STATUS_DONE 7551 + #define ID_DWL_DIALOG 7600 #define ID_DWL_PROGRESS 7601 #define ID_DWL_INSTALL 7602 diff -Nru wine1.3-1.3.0/dlls/mshtml/Sv.rc wine1.3-1.3.1/dlls/mshtml/Sv.rc --- wine1.3-1.3.0/dlls/mshtml/Sv.rc 2010-07-30 18:43:56.000000000 +0100 +++ wine1.3-1.3.1/dlls/mshtml/Sv.rc 2010-08-20 18:23:50.000000000 +0100 @@ -22,6 +22,12 @@ STRINGTABLE { + IDS_STATUS_DONE "Klar" + IDS_STATUS_DOWNLOADINGFROM "Hmtar frn %s..." +} + +STRINGTABLE +{ IDS_HTMLDISABLED "HTML-visning r inte aktiverad." IDS_HTMLDOCUMENT "HTML-dokument" IDS_DOWNLOADING "Hmtar..." diff -Nru wine1.3-1.3.0/dlls/mshtml/Uk.rc wine1.3-1.3.1/dlls/mshtml/Uk.rc --- wine1.3-1.3.0/dlls/mshtml/Uk.rc 2010-07-30 18:43:56.000000000 +0100 +++ wine1.3-1.3.1/dlls/mshtml/Uk.rc 2010-08-20 18:23:50.000000000 +0100 @@ -24,6 +24,12 @@ LANGUAGE LANG_UKRAINIAN, SUBLANG_DEFAULT + STRINGTABLE + { + IDS_STATUS_DONE "Готово" + IDS_STATUS_DOWNLOADINGFROM "Завантаження з %s..." +} + STRINGTABLE { IDS_HTMLDISABLED "В даний момент відображення HTML вимкнено." diff -Nru wine1.3-1.3.0/dlls/msi/appsearch.c wine1.3-1.3.1/dlls/msi/appsearch.c --- wine1.3-1.3.0/dlls/msi/appsearch.c 2010-07-30 18:43:56.000000000 +0100 +++ wine1.3-1.3.1/dlls/msi/appsearch.c 2010-08-20 18:23:50.000000000 +0100 @@ -89,7 +89,7 @@ 'S','i','g','n','a','t','u','r','e',' ', 'w','h','e','r','e',' ','S','i','g','n','a','t','u','r','e',' ','=',' ', '\'','%','s','\'',0}; - LPWSTR minVersion, maxVersion; + LPWSTR minVersion, maxVersion, p; MSIRECORD *row; DWORD time; @@ -106,6 +106,12 @@ /* get properties */ sig->File = msi_dup_record_field(row,2); + if ((p = strchrW(sig->File, '|'))) + { + p++; + memmove(sig->File, p, (strlenW(p) + 1) * sizeof(WCHAR)); + } + minVersion = msi_dup_record_field(row,3); if (minVersion) { diff -Nru wine1.3-1.3.0/dlls/msi/msipriv.h wine1.3-1.3.1/dlls/msi/msipriv.h --- wine1.3-1.3.0/dlls/msi/msipriv.h 2010-07-30 18:43:56.000000000 +0100 +++ wine1.3-1.3.1/dlls/msi/msipriv.h 2010-08-20 18:23:50.000000000 +0100 @@ -595,9 +595,9 @@ #define MSIHANDLETYPE_PACKAGE 5 #define MSIHANDLETYPE_PREVIEW 6 -#define MSI_MAJORVERSION 3 -#define MSI_MINORVERSION 1 -#define MSI_BUILDNUMBER 4000 +#define MSI_MAJORVERSION 4 +#define MSI_MINORVERSION 5 +#define MSI_BUILDNUMBER 6001 #define GUID_SIZE 39 #define SQUISH_GUID_SIZE 33 diff -Nru wine1.3-1.3.0/dlls/msi/tests/automation.c wine1.3-1.3.1/dlls/msi/tests/automation.c --- wine1.3-1.3.0/dlls/msi/tests/automation.c 2010-07-30 18:43:56.000000000 +0100 +++ wine1.3-1.3.1/dlls/msi/tests/automation.c 2010-08-20 18:23:50.000000000 +0100 @@ -151,10 +151,10 @@ static const CHAR registry_dat[] = "Registry\tRoot\tKey\tName\tValue\tComponent_\n" "s72\ti2\tl255\tL255\tL0\ts72\n" "Registry\tRegistry\n" - "Apples\t2\tSOFTWARE\\Wine\\msitest\tName\timaname\tOne\n" - "Oranges\t2\tSOFTWARE\\Wine\\msitest\tnumber\t#314\tTwo\n" - "regdata\t2\tSOFTWARE\\Wine\\msitest\tblah\tbad\tdangler\n" - "OrderTest\t2\tSOFTWARE\\Wine\\msitest\tOrderTestName\tOrderTestValue\tcomponent"; + "Apples\t1\tSOFTWARE\\Wine\\msitest\tName\timaname\tOne\n" + "Oranges\t1\tSOFTWARE\\Wine\\msitest\tnumber\t#314\tTwo\n" + "regdata\t1\tSOFTWARE\\Wine\\msitest\tblah\tbad\tdangler\n" + "OrderTest\t1\tSOFTWARE\\Wine\\msitest\tOrderTestName\tOrderTestValue\tcomponent"; typedef struct _msi_table { @@ -2514,7 +2514,7 @@ ok(delete_pf("msitest\\filename", TRUE), "File not installed\n"); ok(delete_pf("msitest", FALSE), "File not installed\n"); - res = RegOpenKeyEx(HKEY_LOCAL_MACHINE, "SOFTWARE\\Wine\\msitest", 0, access, &hkey); + res = RegOpenKeyA(HKEY_CURRENT_USER, "SOFTWARE\\Wine\\msitest", &hkey); ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res); size = MAX_PATH; @@ -2542,7 +2542,7 @@ RegCloseKey(hkey); - res = delete_key_portable(HKEY_LOCAL_MACHINE, "SOFTWARE\\Wine\\msitest", access); + res = RegDeleteKeyA(HKEY_CURRENT_USER, "SOFTWARE\\Wine\\msitest"); ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res); /* Remove registry keys written by RegisterProduct standard action */ diff -Nru wine1.3-1.3.0/dlls/msi/tests/install.c wine1.3-1.3.1/dlls/msi/tests/install.c --- wine1.3-1.3.0/dlls/msi/tests/install.c 2010-07-30 18:43:56.000000000 +0100 +++ wine1.3-1.3.1/dlls/msi/tests/install.c 2010-08-20 18:23:50.000000000 +0100 @@ -362,10 +362,10 @@ static const CHAR registry_dat[] = "Registry\tRoot\tKey\tName\tValue\tComponent_\n" "s72\ti2\tl255\tL255\tL0\ts72\n" "Registry\tRegistry\n" - "Apples\t2\tSOFTWARE\\Wine\\msitest\tName\timaname\tOne\n" - "Oranges\t2\tSOFTWARE\\Wine\\msitest\tnumber\t#314\tTwo\n" - "regdata\t2\tSOFTWARE\\Wine\\msitest\tblah\tbad\tdangler\n" - "OrderTest\t2\tSOFTWARE\\Wine\\msitest\tOrderTestName\tOrderTestValue\tcomponent"; + "Apples\t1\tSOFTWARE\\Wine\\msitest\tName\timaname\tOne\n" + "Oranges\t1\tSOFTWARE\\Wine\\msitest\tnumber\t#314\tTwo\n" + "regdata\t1\tSOFTWARE\\Wine\\msitest\tblah\tbad\tdangler\n" + "OrderTest\t1\tSOFTWARE\\Wine\\msitest\tOrderTestName\tOrderTestValue\tcomponent"; static const CHAR service_install_dat[] = "ServiceInstall\tName\tDisplayName\tServiceType\tStartType\tErrorControl\t" "LoadOrderGroup\tDependencies\tStartName\tPassword\tArguments\tComponent_\tDescription\n" @@ -3731,7 +3731,7 @@ ok(delete_pf("msitest\\service.exe", TRUE), "File not installed\n"); ok(delete_pf("msitest", FALSE), "File not installed\n"); - res = RegOpenKeyEx(HKEY_LOCAL_MACHINE, "SOFTWARE\\Wine\\msitest", 0, access, &hkey); + res = RegOpenKeyEx(HKEY_CURRENT_USER, "SOFTWARE\\Wine\\msitest", 0, access, &hkey); ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res); size = MAX_PATH; @@ -3759,7 +3759,7 @@ check_service_is_installed(); - delete_key(HKEY_LOCAL_MACHINE, "SOFTWARE\\Wine\\msitest", access); + delete_key(HKEY_CURRENT_USER, "SOFTWARE\\Wine\\msitest", access); /* not published, reinstall */ r = MsiInstallProductA(msifile, NULL); @@ -3778,9 +3778,9 @@ ok(delete_pf("msitest\\service.exe", TRUE), "File not installed\n"); ok(delete_pf("msitest", FALSE), "File not installed\n"); - res = RegOpenKeyExA(HKEY_LOCAL_MACHINE, "SOFTWARE\\Wine\\msitest", 0, access, &hkey); + res = RegOpenKeyA(HKEY_CURRENT_USER, "SOFTWARE\\Wine\\msitest", &hkey); ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res); - delete_key(HKEY_LOCAL_MACHINE, "SOFTWARE\\Wine\\msitest", access); + RegDeleteKeyA(HKEY_CURRENT_USER, "SOFTWARE\\Wine\\msitest"); create_database(msifile, up_tables, sizeof(up_tables) / sizeof(msi_table)); @@ -3801,9 +3801,9 @@ ok(delete_pf("msitest\\service.exe", TRUE), "File not installed\n"); ok(delete_pf("msitest", FALSE), "File not installed\n"); - res = RegOpenKeyExA(HKEY_LOCAL_MACHINE, "SOFTWARE\\Wine\\msitest", 0, access, &hkey); + res = RegOpenKeyA(HKEY_CURRENT_USER, "SOFTWARE\\Wine\\msitest", &hkey); ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res); - delete_key(HKEY_LOCAL_MACHINE, "SOFTWARE\\Wine\\msitest", access); + RegDeleteKeyA(HKEY_CURRENT_USER, "SOFTWARE\\Wine\\msitest"); create_database(msifile, up2_tables, sizeof(up2_tables) / sizeof(msi_table)); @@ -3824,9 +3824,9 @@ ok(delete_pf("msitest\\service.exe", TRUE), "File not installed\n"); ok(delete_pf("msitest", FALSE), "File not installed\n"); - res = RegOpenKeyExA(HKEY_LOCAL_MACHINE, "SOFTWARE\\Wine\\msitest", 0, access, &hkey); + res = RegOpenKeyA(HKEY_CURRENT_USER, "SOFTWARE\\Wine\\msitest", &hkey); ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res); - delete_key(HKEY_LOCAL_MACHINE, "SOFTWARE\\Wine\\msitest", access); + RegDeleteKeyA(HKEY_CURRENT_USER, "SOFTWARE\\Wine\\msitest"); create_database(msifile, up3_tables, sizeof(up3_tables) / sizeof(msi_table)); @@ -3847,9 +3847,9 @@ ok(delete_pf("msitest\\service.exe", TRUE), "File not installed\n"); ok(delete_pf("msitest", FALSE), "File not installed\n"); - res = RegOpenKeyExA(HKEY_LOCAL_MACHINE, "SOFTWARE\\Wine\\msitest", 0, access, &hkey); + res = RegOpenKeyA(HKEY_CURRENT_USER, "SOFTWARE\\Wine\\msitest", &hkey); ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res); - delete_key(HKEY_LOCAL_MACHINE, "SOFTWARE\\Wine\\msitest", access); + RegDeleteKeyA(HKEY_CURRENT_USER, "SOFTWARE\\Wine\\msitest"); create_database(msifile, up4_tables, sizeof(up4_tables) / sizeof(msi_table)); @@ -3870,7 +3870,7 @@ ok(delete_pf("msitest\\service.exe", TRUE), "File not installed\n"); ok(delete_pf("msitest", FALSE), "File not installed\n"); - res = RegOpenKeyExA(HKEY_LOCAL_MACHINE, "SOFTWARE\\Wine\\msitest", 0, access, &hkey); + res = RegOpenKeyA(HKEY_CURRENT_USER, "SOFTWARE\\Wine\\msitest", &hkey); ok(res == ERROR_FILE_NOT_FOUND, "Expected ERROR_FILE_NOT_FOUND, got %d\n", res); create_database(msifile, up4_tables, sizeof(up4_tables) / sizeof(msi_table)); @@ -3892,7 +3892,7 @@ ok(delete_pf("msitest\\service.exe", TRUE), "File not installed\n"); ok(delete_pf("msitest", FALSE), "File not installed\n"); - res = RegOpenKeyExA(HKEY_LOCAL_MACHINE, "SOFTWARE\\Wine\\msitest", 0, access, &hkey); + res = RegOpenKeyA(HKEY_CURRENT_USER, "SOFTWARE\\Wine\\msitest", &hkey); ok(res == ERROR_FILE_NOT_FOUND, "Expected ERROR_FILE_NOT_FOUND, got %d\n", res); create_database(msifile, up5_tables, sizeof(up5_tables) / sizeof(msi_table)); @@ -3914,7 +3914,7 @@ ok(delete_pf("msitest\\service.exe", TRUE), "File not installed\n"); ok(delete_pf("msitest", FALSE), "File not installed\n"); - res = RegOpenKeyExA(HKEY_LOCAL_MACHINE, "SOFTWARE\\Wine\\msitest", 0, access, &hkey); + res = RegOpenKeyA(HKEY_CURRENT_USER, "SOFTWARE\\Wine\\msitest", &hkey); ok(res == ERROR_FILE_NOT_FOUND, "Expected ERROR_FILE_NOT_FOUND, got %d\n", res); create_database(msifile, up6_tables, sizeof(up6_tables) / sizeof(msi_table)); @@ -3936,7 +3936,7 @@ ok(delete_pf("msitest\\service.exe", TRUE), "File not installed\n"); ok(delete_pf("msitest", FALSE), "File not installed\n"); - res = RegOpenKeyExA(HKEY_LOCAL_MACHINE, "SOFTWARE\\Wine\\msitest", 0, access, &hkey); + res = RegOpenKeyA(HKEY_CURRENT_USER, "SOFTWARE\\Wine\\msitest", &hkey); ok(res == ERROR_FILE_NOT_FOUND, "Expected ERROR_FILE_NOT_FOUND, got %d\n", res); create_database(msifile, up7_tables, sizeof(up7_tables) / sizeof(msi_table)); @@ -3958,7 +3958,7 @@ ok(delete_pf("msitest\\service.exe", TRUE), "File not installed\n"); ok(delete_pf("msitest", FALSE), "File not installed\n"); - res = RegOpenKeyExA(HKEY_LOCAL_MACHINE, "SOFTWARE\\Wine\\msitest", 0, access, &hkey); + res = RegOpenKeyA(HKEY_CURRENT_USER, "SOFTWARE\\Wine\\msitest", &hkey); ok(res == ERROR_FILE_NOT_FOUND, "Expected ERROR_FILE_NOT_FOUND, got %d\n", res); r = MsiInstallProductA(msifile, "REMOVE=ALL"); @@ -7447,7 +7447,7 @@ ok(delete_pf("msitest\\augustus", TRUE), "File installed\n"); ok(delete_pf("msitest", FALSE), "File installed\n"); - res = RegOpenKeyExA(HKEY_LOCAL_MACHINE, "SOFTWARE\\Wine\\msitest", 0, access, &hkey); + res = RegOpenKeyA(HKEY_LOCAL_MACHINE, "SOFTWARE\\Wine\\msitest", &hkey); ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res); size = MAX_PATH; @@ -7459,8 +7459,7 @@ ok(size == 15, "Expected 15, got %d\n", size); ok(type == REG_MULTI_SZ, "Expected REG_MULTI_SZ, got %d\n", type); - delete_key(HKEY_LOCAL_MACHINE, "SOFTWARE\\Wine\\msitest", access); - delete_key(HKEY_LOCAL_MACHINE, "SOFTWARE\\Wine", access); + RegDeleteKeyA(HKEY_CURRENT_USER, "SOFTWARE\\Wine\\msitest"); error: DeleteFile(msifile); @@ -10573,6 +10572,11 @@ { UINT r; + if (on_win9x) + { + win_skip("skipping sourcedir tests on win9x\n"); + return; + } if (is_process_limited()) { skip("process is limited\n"); diff -Nru wine1.3-1.3.0/dlls/msi/tests/msi.c wine1.3-1.3.1/dlls/msi/tests/msi.c --- wine1.3-1.3.0/dlls/msi/tests/msi.c 2010-07-30 18:43:56.000000000 +0100 +++ wine1.3-1.3.1/dlls/msi/tests/msi.c 2010-08-20 18:23:50.000000000 +0100 @@ -4800,7 +4800,7 @@ lstrcpyA(keypath, "Software\\Microsoft\\Installer\\Products\\"); lstrcatA(keypath, prod_squashed); - res = RegCreateKeyA(HKEY_CURRENT_USER, keypath, &prodkey); + res = RegCreateKeyExA(HKEY_CURRENT_USER, keypath, 0, NULL, 0, access, NULL, &prodkey, NULL); ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res); sz = MAX_PATH; @@ -5191,7 +5191,7 @@ RegDeleteValueA(prodkey, "HelpTelephone"); RegDeleteValueA(prodkey, "HelpLink"); RegDeleteValueA(prodkey, "LocalPackage"); - RegDeleteKeyA(prodkey, ""); + delete_key(prodkey, "", access & KEY_WOW64_64KEY); RegCloseKey(prodkey); /* MSIINSTALLCONTEXT_USERMANAGED */ @@ -5604,9 +5604,9 @@ RegDeleteValueA(propkey, "HelpTelephone"); RegDeleteValueA(propkey, "HelpLink"); RegDeleteValueA(propkey, "ManagedLocalPackage"); - RegDeleteKeyA(propkey, ""); + delete_key(propkey, "", access & KEY_WOW64_64KEY); RegCloseKey(propkey); - RegDeleteKeyA(localkey, ""); + delete_key(localkey, "", access & KEY_WOW64_64KEY); RegCloseKey(localkey); lstrcpyA(keypath, "Software\\Microsoft\\Windows\\CurrentVersion\\Installer\\Managed\\"); diff -Nru wine1.3-1.3.0/dlls/msi/tests/package.c wine1.3-1.3.1/dlls/msi/tests/package.c --- wine1.3-1.3.0/dlls/msi/tests/package.c 2010-07-30 18:43:56.000000000 +0100 +++ wine1.3-1.3.1/dlls/msi/tests/package.c 2010-08-20 18:23:50.000000000 +0100 @@ -7507,7 +7507,7 @@ UINT r; MSIHANDLE hdb; CHAR prop[MAX_PATH]; - DWORD size = MAX_PATH; + DWORD size; hdb = create_package_db(); ok ( hdb, "failed to create package database\n" ); @@ -7518,17 +7518,29 @@ r = add_appsearch_entry( hdb, "'WEBBROWSERPROG', 'NewSignature1'" ); ok( r == ERROR_SUCCESS, "cannot add entry: %d\n", r ); + r = add_appsearch_entry( hdb, "'NOTEPAD', 'NewSignature2'" ); + ok( r == ERROR_SUCCESS, "cannot add entry: %d\n", r ); + r = create_reglocator_table( hdb ); ok( r == ERROR_SUCCESS, "cannot create RegLocator table: %d\n", r ); r = add_reglocator_entry( hdb, "'NewSignature1', 0, 'htmlfile\\shell\\open\\command', '', 1" ); ok( r == ERROR_SUCCESS, "cannot create RegLocator table: %d\n", r ); + r = create_drlocator_table( hdb ); + ok( r == ERROR_SUCCESS, "cannot create DrLocator table: %d\n", r ); + + r = add_drlocator_entry( hdb, "'NewSignature2', 0, 'c:\\windows\\system32', 0" ); + ok( r == ERROR_SUCCESS, "cannot create RegLocator table: %d\n", r ); + r = create_signature_table( hdb ); ok( r == ERROR_SUCCESS, "cannot create Signature table: %d\n", r ); r = add_signature_entry( hdb, "'NewSignature1', 'FileName', '', '', '', '', '', '', ''" ); - ok( r == ERROR_SUCCESS, "cannot create Signature table: %d\n", r ); + ok( r == ERROR_SUCCESS, "cannot add signature: %d\n", r ); + + r = add_signature_entry( hdb, "'NewSignature2', 'NOTEPAD.EXE|notepad.exe', '', '', '', '', '', '', ''" ); + ok( r == ERROR_SUCCESS, "cannot add signature: %d\n", r ); r = package_from_db( hdb, &hpkg ); if (r == ERROR_INSTALL_PACKAGE_REJECTED) @@ -7538,12 +7550,14 @@ return; } ok( r == ERROR_SUCCESS, "failed to create package %u\n", r ); - MsiCloseHandle( hdb ); + if (r != ERROR_SUCCESS) + goto done; r = MsiDoAction( hpkg, "AppSearch" ); ok( r == ERROR_SUCCESS, "AppSearch failed: %d\n", r); + size = sizeof(prop); r = MsiGetPropertyA( hpkg, "WEBBROWSERPROG", prop, &size ); ok( r == ERROR_SUCCESS, "get property failed: %d\n", r); todo_wine @@ -7551,6 +7565,11 @@ ok( lstrlenA(prop) != 0, "Expected non-zero length\n"); } + size = sizeof(prop); + r = MsiGetPropertyA( hpkg, "NOTEPAD", prop, &size ); + ok( r == ERROR_SUCCESS, "get property failed: %d\n", r); + +done: MsiCloseHandle( hpkg ); DeleteFileA(msifile); } @@ -7866,11 +7885,6 @@ LPCSTR str; LONG res; UINT r; - REGSAM access = KEY_ALL_ACCESS; - BOOL wow64; - - if (pIsWow64Process && pIsWow64Process(GetCurrentProcess(), &wow64) && wow64) - access |= KEY_WOW64_64KEY; version = TRUE; if (!create_file_with_version("test.dll", MAKELONG(2, 1), MAKELONG(4, 3))) @@ -7910,7 +7924,7 @@ ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res); } - res = RegCreateKeyExA(HKEY_LOCAL_MACHINE, "Software\\Wine", 0, NULL, 0, access, NULL, &hklm, NULL); + res = RegCreateKeyA(HKEY_LOCAL_MACHINE, "Software\\Wine", &hklm); ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res); res = RegSetValueA(hklm, NULL, REG_SZ, "defvalue", 8); @@ -8516,7 +8530,7 @@ RegDeleteValueA(hklm, "Value15"); RegDeleteValueA(hklm, "Value16"); RegDeleteValueA(hklm, "Value17"); - delete_key(hklm, "", access); + RegDeleteKey(hklm, ""); RegCloseKey(hklm); RegDeleteValueA(classes, "Value1"); diff -Nru wine1.3-1.3.0/dlls/msi/version.rc wine1.3-1.3.1/dlls/msi/version.rc --- wine1.3-1.3.0/dlls/msi/version.rc 2010-07-30 18:43:56.000000000 +0100 +++ wine1.3-1.3.1/dlls/msi/version.rc 2010-08-20 18:23:50.000000000 +0100 @@ -18,9 +18,9 @@ #define WINE_FILEDESCRIPTION_STR "Wine MSI dll" #define WINE_FILENAME_STR "msi.dll" -#define WINE_FILEVERSION 3,1,4000,2435 -#define WINE_FILEVERSION_STR "3.1.4000.2435" -#define WINE_PRODUCTVERSION 3,1,4000,2435 -#define WINE_PRODUCTVERSION_STR "3.1.4000.2435" +#define WINE_FILEVERSION 4,5,6001,22159 +#define WINE_FILEVERSION_STR "4.5.6001.22159" +#define WINE_PRODUCTVERSION 4,5,6001,22159 +#define WINE_PRODUCTVERSION_STR "4.5.6001.22159" #include "wine/wine_common_ver.rc" diff -Nru wine1.3-1.3.0/dlls/msvcirt/msvcirt.c wine1.3-1.3.1/dlls/msvcirt/msvcirt.c --- wine1.3-1.3.0/dlls/msvcirt/msvcirt.c 2010-07-30 18:43:56.000000000 +0100 +++ wine1.3-1.3.1/dlls/msvcirt/msvcirt.c 2010-08-20 18:23:50.000000000 +0100 @@ -29,8 +29,16 @@ typedef struct { LPVOID VTable; +} class_ios; + +typedef struct { + LPVOID VTable; } class_ostream; +typedef struct { + LPVOID VTable; +} class_strstreambuf; + #ifdef __i386__ /* thiscall functions are i386-specific */ #define THISCALL(func) __thiscall_ ## func @@ -51,6 +59,39 @@ #endif /* __i386__ */ /****************************************************************** + * ??1ios@@UAE@XZ (MSVCRTI.@) + * class ios & __thiscall ios::-ios<<(void) + */ +DEFINE_THISCALL_WRAPPER(MSVCIRT_ios_sl_void,4) +void * __stdcall MSVCIRT_ios_sl_void(class_ios * _this) +{ + FIXME("(%p) stub\n", _this); + return _this; +} + +/****************************************************************** + * ??0ostrstream@@QAE@XZ (MSVCRTI.@) + * class ostream & __thiscall ostrstream::ostrstream<<(void) + */ +DEFINE_THISCALL_WRAPPER(MSVCIRT_ostrstream_sl_void,4) +void * __stdcall MSVCIRT_ostrstream_sl_void(class_ostream * _this) +{ + FIXME("(%p) stub\n", _this); + return _this; +} + +/****************************************************************** + * ??6ostream@@QAEAAV0@E@Z (MSVCRTI.@) + * class ostream & __thiscall ostream::operator<<(unsigned char) + */ +DEFINE_THISCALL_WRAPPER(MSVCIRT_operator_sl_uchar,8) +void * __stdcall MSVCIRT_operator_sl_uchar(class_ostream * _this, unsigned char ch) +{ + FIXME("(%p)->(%c) stub\n", _this, ch); + return _this; +} + +/****************************************************************** * ??6ostream@@QAEAAV0@H@Z (MSVCRTI.@) * class ostream & __thiscall ostream::operator<<(int) */ @@ -93,6 +134,27 @@ return _this; } +/****************************************************************** + * ?ends@@YAAAVostream@@AAV1@@Z (MSVCRTI.@) + * class ostream & __cdecl ends(class ostream &) + */ +void * CDECL MSVCIRT_ends(class_ostream * _this) +{ + FIXME("(%p)->() stub\n", _this); + return _this; +} + +/****************************************************************** + * ?str@strstreambuf@@QAEPADXZ (MSVCRTI.@) + * class strstreambuf & __thiscall strstreambuf::str(class strstreambuf &) + */ +DEFINE_THISCALL_WRAPPER(MSVCIRT_str_sl_void,4) +char * __stdcall MSVCIRT_str_sl_void(class_strstreambuf * _this) +{ + FIXME("(%p)->() stub\n", _this); + return 0; +} + BOOL WINAPI DllMain( HINSTANCE inst, DWORD reason, LPVOID reserved ) { switch (reason) diff -Nru wine1.3-1.3.0/dlls/msvcirt/msvcirt.spec wine1.3-1.3.1/dlls/msvcirt/msvcirt.spec --- wine1.3-1.3.0/dlls/msvcirt/msvcirt.spec 2010-07-30 18:43:56.000000000 +0100 +++ wine1.3-1.3.1/dlls/msvcirt/msvcirt.spec 2010-08-20 18:23:50.000000000 +0100 @@ -47,7 +47,7 @@ @ stub ??0ostream_withassign@@QAE@XZ # __thiscall ostream_withassign::ostream_withassign(void) @ stub ??0ostrstream@@QAE@ABV0@@Z # __thiscall ostrstream::ostrstream(class ostrstream const &) @ stub ??0ostrstream@@QAE@PADHH@Z # __thiscall ostrstream::ostrstream(char *,int,int) -@ stub ??0ostrstream@@QAE@XZ # __thiscall ostrstream::ostrstream(void) +@ cdecl -i386 -norelay ??0ostrstream@@QAE@XZ(ptr) __thiscall_MSVCIRT_ostrstream_sl_void # __thiscall ostrstream::ostrstream(void) @ stub ??0stdiobuf@@QAE@ABV0@@Z # __thiscall stdiobuf::stdiobuf(class stdiobuf const &) @ stub ??0stdiobuf@@QAE@PAU_iobuf@@@Z # __thiscall stdiobuf::stdiobuf(struct _iobuf *) @ stub ??0stdiostream@@QAE@ABV0@@Z # __thiscall stdiostream::stdiostream(class stdiostream const &) @@ -69,7 +69,7 @@ @ stub ??1filebuf@@UAE@XZ # virtual __thiscall filebuf::~filebuf(void) @ stub ??1fstream@@UAE@XZ # virtual __thiscall fstream::~fstream(void) @ stub ??1ifstream@@UAE@XZ # virtual __thiscall ifstream::~ifstream(void) -@ stub ??1ios@@UAE@XZ # virtual __thiscall ios::~ios(void) +@ cdecl -i386 -norelay ??1ios@@UAE@XZ(ptr) __thiscall_MSVCIRT_ios_sl_void # virtual __thiscall ios::~ios(void) @ stub ??1iostream@@UAE@XZ # virtual __thiscall iostream::~iostream(void) @ stub ??1istream@@UAE@XZ # virtual __thiscall istream::~istream(void) @ stub ??1istream_withassign@@UAE@XZ # virtual __thiscall istream_withassign::~istream_withassign(void) @@ -78,7 +78,7 @@ @ stub ??1ofstream@@UAE@XZ # virtual __thiscall ofstream::~ofstream(void) @ stub ??1ostream@@UAE@XZ # virtual __thiscall ostream::~ostream(void) @ stub ??1ostream_withassign@@UAE@XZ # virtual __thiscall ostream_withassign::~ostream_withassign(void) -@ stub ??1ostrstream@@UAE@XZ # virtual __thiscall ostrstream::~ostrstream(void) +@ cdecl -i386 -norelay ??1ostrstream@@UAE@XZ(ptr) __thiscall_MSVCIRT_ostrstream_sl_void # virtual __thiscall ostrstream::~ostrstream(void) @ stub ??1stdiobuf@@UAE@XZ # virtual __thiscall stdiobuf::~stdiobuf(void) @ stub ??1stdiostream@@UAE@XZ # virtual __thiscall stdiostream::~stdiostream(void) @ stub ??1streambuf@@UAE@XZ # virtual __thiscall streambuf::~streambuf(void) @@ -131,7 +131,7 @@ @ stub ??5istream@@QAEAAV0@PAVstreambuf@@@Z # class istream & __thiscall istream::operator>>(class streambuf *) @ stub ??6ostream@@QAEAAV0@C@Z # class ostream & __thiscall ostream::operator<<(signed char) @ stub ??6ostream@@QAEAAV0@D@Z # class ostream & __thiscall ostream::operator<<(char) -@ stub ??6ostream@@QAEAAV0@E@Z # class ostream & __thiscall ostream::operator<<(unsigned char) +@ cdecl -i386 -norelay ??6ostream@@QAEAAV0@E@Z(ptr long) __thiscall_MSVCIRT_operator_sl_uchar # class ostream & __thiscall ostream::operator<<(unsigned char) @ stub ??6ostream@@QAEAAV0@F@Z # class ostream & __thiscall ostream::operator<<(short) @ stub ??6ostream@@QAEAAV0@G@Z # class ostream & __thiscall ostream::operator<<(unsigned short) @ cdecl -i386 -norelay ??6ostream@@QAEAAV0@H@Z(ptr long) __thiscall_MSVCIRT_operator_sl_int # class ostream & __thiscall ostream::operator<<(int) @@ -269,7 +269,7 @@ @ stub ?ebuf@streambuf@@IBEPADXZ # char * __thiscall streambuf::ebuf(void)const @ stub ?egptr@streambuf@@IBEPADXZ # char * __thiscall streambuf::egptr(void)const @ cdecl ?endl@@YAAAVostream@@AAV1@@Z(ptr) MSVCIRT_endl # class ostream & __cdecl endl(class ostream &) -@ stub ?ends@@YAAAVostream@@AAV1@@Z # class ostream & __cdecl ends(class ostream &) +@ cdecl ?ends@@YAAAVostream@@AAV1@@Z(ptr) MSVCIRT_ends # class ostream & __cdecl ends(class ostream &) @ stub ?eof@ios@@QBEHXZ # int __thiscall ios::eof(void)const @ stub ?epptr@streambuf@@IBEPADXZ # char * __thiscall streambuf::epptr(void)const # @ extern ?fLockcInit@ios@@0HA # static int ios::fLockcInit @@ -402,7 +402,7 @@ @ stub ?str@istrstream@@QAEPADXZ # char * __thiscall istrstream::str(void) @ stub ?str@ostrstream@@QAEPADXZ # char * __thiscall ostrstream::str(void) @ stub ?str@strstream@@QAEPADXZ # char * __thiscall strstream::str(void) -@ stub ?str@strstreambuf@@QAEPADXZ # char * __thiscall strstreambuf::str(void) +@ cdecl -i386 -norelay ?str@strstreambuf@@QAEPADXZ(ptr) __thiscall_MSVCIRT_str_sl_void # char * __thiscall strstreambuf::str(void) # @ extern ?sunk_with_stdio@ios@@0HA # static int ios::sunk_with_stdio @ stub ?sync@filebuf@@UAEHXZ # virtual int __thiscall filebuf::sync(void) @ stub ?sync@istream@@QAEHXZ # int __thiscall istream::sync(void) diff -Nru wine1.3-1.3.0/dlls/msvcp90/exception.c wine1.3-1.3.1/dlls/msvcp90/exception.c --- wine1.3-1.3.0/dlls/msvcp90/exception.c 1970-01-01 01:00:00.000000000 +0100 +++ wine1.3-1.3.1/dlls/msvcp90/exception.c 2010-08-20 18:23:50.000000000 +0100 @@ -0,0 +1,661 @@ +/* + * Copyright 2010 Piotr Caban for 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 + +#include "msvcp90.h" + +#include "windef.h" +#include "winbase.h" +#include "wine/debug.h" +WINE_DEFAULT_DEBUG_CHANNEL(msvcp90); + +/* dlls/msvcrt/cppexcept.h */ +typedef void (*cxx_copy_ctor)(void); + +/* complete information about a C++ type */ +typedef struct __cxx_type_info +{ + UINT flags; /* flags (see CLASS_* flags below) */ + const type_info *type_info; /* C++ type info */ + this_ptr_offsets offsets; /* offsets for computing the this pointer */ + unsigned int size; /* object size */ + cxx_copy_ctor copy_ctor; /* copy constructor */ +} cxx_type_info; +#define CLASS_IS_SIMPLE_TYPE 1 +#define CLASS_HAS_VIRTUAL_BASE_CLASS 4 + +/* table of C++ types that apply for a given object */ +typedef struct __cxx_type_info_table +{ + UINT count; /* number of types */ + const cxx_type_info *info[3]; /* variable length, we declare it large enough for static RTTI */ +} cxx_type_info_table; + +/* type information for an exception object */ +typedef struct __cxx_exception_type +{ + UINT flags; /* TYPE_FLAG flags */ + void (*destructor)(void);/* exception object destructor */ + void* /*cxx_exc_custom_handler*/ custom_handler; /* custom handler for this exception */ + const cxx_type_info_table *type_info_table; /* list of types for this exception object */ +} cxx_exception_type; + +void CDECL _CxxThrowException(exception*,const cxx_exception_type*); + +/* vtables */ + +#ifdef _WIN64 + +#define __ASM_VTABLE(name,funcs) \ + __asm__(".data\n" \ + "\t.align 8\n" \ + "\t.quad " __ASM_NAME(#name "_rtti") "\n" \ + "\t.globl " __ASM_NAME("MSVCP_" #name "_vtable") "\n" \ + __ASM_NAME("MSVCP_" #name "_vtable") ":\n" \ + "\t.quad " THISCALL_NAME(MSVCP_ ## name ## _vector_dtor) "\n" \ + funcs "\n\t.text"); + +#define __ASM_EXCEPTION_VTABLE(name) \ + __ASM_VTABLE(name, "\t.quad " THISCALL_NAME(MSVCP_what_exception) ) + +#define __ASM_EXCEPTION_STRING_VTABLE(name) \ + __ASM_VTABLE(name, "\t.quad " THISCALL_NAME(MSVCP_logic_error_what) ) + +#else + +#define __ASM_VTABLE(name,funcs) \ + __asm__(".data\n" \ + "\t.align 4\n" \ + "\t.long " __ASM_NAME(#name "_rtti") "\n" \ + "\t.globl " __ASM_NAME("MSVCP_" #name "_vtable") "\n" \ + __ASM_NAME("MSVCP_" #name "_vtable") ":\n" \ + "\t.long " THISCALL_NAME(MSVCP_ ## name ## _vector_dtor) "\n" \ + funcs "\n\t.text"); + +#define __ASM_EXCEPTION_VTABLE(name) \ + __ASM_VTABLE(name, "\t.long " THISCALL_NAME(MSVCP_what_exception) ) + +#define __ASM_EXCEPTION_STRING_VTABLE(name) \ + __ASM_VTABLE(name, "\t.long " THISCALL_NAME(MSVCP_logic_error_what) ) + +#endif /* _WIN64 */ + +extern const vtable_ptr MSVCP_bad_alloc_vtable; +extern const vtable_ptr MSVCP_logic_error_vtable; +extern const vtable_ptr MSVCP_length_error_vtable; +extern const vtable_ptr MSVCP_out_of_range_vtable; + +/* exception class data */ +static type_info exception_type_info = { + NULL, /* set by set_exception_vtable */ + NULL, + ".?AVexception@std@@" +}; + +DEFINE_THISCALL_WRAPPER(MSVCP_exception_ctor, 8) +exception* __stdcall MSVCP_exception_ctor(exception *this, const char **name) +{ + TRACE("(%p %s)\n", this, *name); + + this->vtable = exception_type_info.vtable; + if(*name) { + unsigned int name_len = strlen(*name) + 1; + this->name = malloc(name_len); + memcpy(this->name, *name, name_len); + this->do_free = TRUE; + } else { + this->name = NULL; + this->do_free = FALSE; + } + return this; +} + +DEFINE_THISCALL_WRAPPER(MSVCP_exception_copy_ctor,8) +exception* __stdcall MSVCP_exception_copy_ctor(exception *this, const exception *rhs) +{ + TRACE("(%p,%p)\n", this, rhs); + + if(!rhs->do_free) { + this->vtable = exception_type_info.vtable; + this->name = rhs->name; + this->do_free = FALSE; + } else + MSVCP_exception_ctor(this, (const char**)&rhs->name); + TRACE("name = %s\n", this->name); + return this; +} + +DEFINE_THISCALL_WRAPPER(MSVCP_exception_dtor,4) +void __stdcall MSVCP_exception_dtor(exception *this) +{ + TRACE("(%p)\n", this); + this->vtable = exception_type_info.vtable; + if(this->do_free) + free(this->name); +} + +static const rtti_base_descriptor exception_rtti_base_descriptor = { + &exception_type_info, + 0, + { 0, -1, 0 }, + 0 +}; + +static const cxx_type_info exception_cxx_type_info = { + 0, + &exception_type_info, + { 0, -1, 0 }, + sizeof(exception), + (cxx_copy_ctor)THISCALL(MSVCP_exception_dtor) +}; + +static const cxx_type_info_table exception_cxx_type_table = { + 1, + { + &exception_cxx_type_info, + NULL, + NULL + } +}; + +static const cxx_exception_type exception_cxx_type = { + 0, + (cxx_copy_ctor)THISCALL(MSVCP_exception_copy_ctor), + NULL, + &exception_cxx_type_table +}; + +void set_exception_vtable(void) +{ + HMODULE hmod = GetModuleHandleA("msvcrt.dll"); + exception_type_info.vtable = (void*)GetProcAddress(hmod, "??_7exception@@6B@"); +} + +/* bad_alloc class data */ +typedef exception bad_alloc; + +DEFINE_THISCALL_WRAPPER(MSVCP_bad_alloc_ctor, 8) +bad_alloc* __stdcall MSVCP_bad_alloc_ctor(bad_alloc *this, const char **name) +{ + TRACE("%p %s\n", this, *name); + MSVCP_exception_ctor(this, name); + this->vtable = &MSVCP_bad_alloc_vtable; + return this; +} + +DEFINE_THISCALL_WRAPPER(MSVCP_bad_alloc_copy_ctor, 8) +bad_alloc* __stdcall MSVCP_bad_alloc_copy_ctor(bad_alloc *this, const bad_alloc *rhs) +{ + TRACE("%p %p\n", this, rhs); + MSVCP_exception_copy_ctor(this, rhs); + this->vtable = &MSVCP_bad_alloc_vtable; + return this; +} + +DEFINE_THISCALL_WRAPPER(MSVCP_bad_alloc_dtor, 4) +void __stdcall MSVCP_bad_alloc_dtor(bad_alloc *this) +{ + TRACE("%p\n", this); + MSVCP_exception_dtor(this); +} + +DEFINE_THISCALL_WRAPPER(MSVCP_bad_alloc_vector_dtor, 8) +void * __stdcall MSVCP_bad_alloc_vector_dtor(bad_alloc *this, unsigned int flags) +{ + TRACE("%p %x\n", this, flags); + if(flags & 2) { + /* we have an array, with the number of elements stored before the first object */ + int i, *ptr = (int *)this-1; + + for(i=*ptr-1; i>=0; i--) + MSVCP_bad_alloc_dtor(this+i); + MSVCRT_operator_delete(ptr); + } else { + MSVCP_bad_alloc_dtor(this); + if(flags & 1) + MSVCRT_operator_delete(this); + } + + return this; +} + +DEFINE_THISCALL_WRAPPER(MSVCP_what_exception,4) +const char* __stdcall MSVCP_what_exception(exception * this) +{ + TRACE("(%p) returning %s\n", this, this->name); + return this->name ? this->name : "Unknown exception"; +} + +static const type_info bad_alloc_type_info = { + &MSVCP_bad_alloc_vtable, + NULL, + ".?AVbad_alloc@std@@" +}; + +static const rtti_base_descriptor bad_alloc_rtti_base_descriptor = { + &bad_alloc_type_info, + 1, + { 0, -1, 0 }, + 64 +}; + +static const rtti_base_array bad_alloc_rtti_base_array = { + { + &bad_alloc_rtti_base_descriptor, + &exception_rtti_base_descriptor, + NULL + } +}; + +static const rtti_object_hierarchy bad_alloc_type_hierarchy = { + 0, + 0, + 2, + &bad_alloc_rtti_base_array +}; + +const rtti_object_locator bad_alloc_rtti = { + 0, + 0, + 0, + &bad_alloc_type_info, + &bad_alloc_type_hierarchy +}; + +static const cxx_type_info bad_alloc_cxx_type_info = { + 0, + &bad_alloc_type_info, + { 0, -1, 0 }, + sizeof(bad_alloc), + (cxx_copy_ctor)THISCALL(MSVCP_bad_alloc_copy_ctor) +}; + +static const cxx_type_info_table bad_alloc_cxx_type_table = { + 2, + { + &bad_alloc_cxx_type_info, + &exception_cxx_type_info, + NULL + } +}; + +static const cxx_exception_type bad_alloc_cxx_type = { + 0, + (cxx_copy_ctor)THISCALL(MSVCP_bad_alloc_dtor), + NULL, + &bad_alloc_cxx_type_table +}; + +/* logic_error class data */ +typedef struct _logic_error { + exception e; + basic_string_char str; +} logic_error; + +DEFINE_THISCALL_WRAPPER(MSVCP_logic_error_ctor, 8) +logic_error* __stdcall MSVCP_logic_error_ctor( + logic_error *this, const char **name) +{ + TRACE("%p %s\n", this, *name); + this->e.vtable = &MSVCP_logic_error_vtable; + this->e.name = NULL; + this->e.do_free = FALSE; + MSVCP_basic_string_char_ctor_cstr(&this->str, *name); + return this; +} + +DEFINE_THISCALL_WRAPPER(MSVCP_logic_error_copy_ctor, 8) +logic_error* __stdcall MSVCP_logic_error_copy_ctor( + logic_error *this, logic_error *rhs) +{ + TRACE("%p %p\n", this, rhs); + MSVCP_exception_copy_ctor(&this->e, &rhs->e); + MSVCP_basic_string_char_copy_ctor(&this->str, &rhs->str); + this->e.vtable = &MSVCP_logic_error_vtable; + return this; +} + +DEFINE_THISCALL_WRAPPER(MSVCP_logic_error_dtor, 4) +void __stdcall MSVCP_logic_error_dtor(logic_error *this) +{ + TRACE("%p\n", this); + MSVCP_exception_dtor(&this->e); + MSVCP_basic_string_char_dtor(&this->str); +} + +DEFINE_THISCALL_WRAPPER(MSVCP_logic_error_vector_dtor, 8) +void* __stdcall MSVCP_logic_error_vector_dtor( + logic_error *this, unsigned int flags) +{ + TRACE("%p %x\n", this, flags); + if(flags & 2) { + /* we have an array, with the number of elements stored before the first object */ + int i, *ptr = (int *)this-1; + + for(i=*ptr-1; i>=0; i--) + MSVCP_logic_error_dtor(this+i); + MSVCRT_operator_delete(ptr); + } else { + MSVCP_logic_error_dtor(this); + if(flags & 1) + MSVCRT_operator_delete(this); + } + + return this; +} + +DEFINE_THISCALL_WRAPPER(MSVCP_logic_error_what, 4) +const char* __stdcall MSVCP_logic_error_what(logic_error *this) +{ + TRACE("%p\n", this); + return MSVCP_basic_string_char_c_str(&this->str); +} + +static const type_info logic_error_type_info = { + &MSVCP_logic_error_vtable, + NULL, + ".?AVlogic_error@std@@" +}; + +static const rtti_base_descriptor logic_error_rtti_base_descriptor = { + &logic_error_type_info, + 1, + { 0, -1, 0 }, + 64 +}; + +static const rtti_base_array logic_error_rtti_base_array = { + { + &logic_error_rtti_base_descriptor, + &exception_rtti_base_descriptor, + NULL + } +}; + +static const rtti_object_hierarchy logic_error_type_hierarchy = { + 0, + 0, + 2, + &logic_error_rtti_base_array +}; + +const rtti_object_locator logic_error_rtti = { + 0, + 0, + 0, + &logic_error_type_info, + &logic_error_type_hierarchy +}; + +static const cxx_type_info logic_error_cxx_type_info = { + 0, + &logic_error_type_info, + { 0, -1, 0 }, + sizeof(logic_error), + (cxx_copy_ctor)THISCALL(MSVCP_logic_error_copy_ctor) +}; + +static const cxx_type_info_table logic_error_cxx_type_table = { + 2, + { + &logic_error_cxx_type_info, + &exception_cxx_type_info, + NULL + } +}; + +static const cxx_exception_type logic_error_cxx_type = { + 0, + (cxx_copy_ctor)THISCALL(MSVCP_logic_error_dtor), + NULL, + &logic_error_cxx_type_table +}; + +/* length_error class data */ +typedef logic_error length_error; + +DEFINE_THISCALL_WRAPPER(MSVCP_length_error_ctor, 8) +length_error* __stdcall MSVCP_length_error_ctor( + length_error *this, const char **name) +{ + TRACE("%p %s\n", this, *name); + MSVCP_logic_error_ctor(this, name); + this->e.vtable = &MSVCP_length_error_vtable; + return this; +} + +DEFINE_THISCALL_WRAPPER(MSVCP_length_error_copy_ctor, 8) +length_error* __stdcall MSVCP_length_error_copy_ctor( + length_error *this, length_error *rhs) +{ + TRACE("%p %p\n", this, rhs); + MSVCP_logic_error_copy_ctor(this, rhs); + this->e.vtable = &MSVCP_length_error_vtable; + return this; +} + +DEFINE_THISCALL_WRAPPER(MSVCP_length_error_vector_dtor, 8) +void* __stdcall MSVCP_length_error_vector_dtor( + length_error *this, unsigned int flags) +{ + TRACE("%p %x\n", this, flags); + return MSVCP_logic_error_vector_dtor(this, flags); +} + +static const type_info length_error_type_info = { + &MSVCP_length_error_vtable, + NULL, + ".?AVlength_error@std@@" +}; + +static const rtti_base_descriptor length_error_rtti_base_descriptor = { + &length_error_type_info, + 2, + { 0, -1, 0 }, + 64 +}; + +static const rtti_base_array length_error_rtti_base_array = { + { + &length_error_rtti_base_descriptor, + &logic_error_rtti_base_descriptor, + &exception_rtti_base_descriptor + } +}; + +static const rtti_object_hierarchy length_error_type_hierarchy = { + 0, + 0, + 3, + &length_error_rtti_base_array +}; + +const rtti_object_locator length_error_rtti = { + 0, + 0, + 0, + &length_error_type_info, + &length_error_type_hierarchy +}; + +static const cxx_type_info length_error_cxx_type_info = { + 0, + &length_error_type_info, + { 0, -1, 0 }, + sizeof(length_error), + (cxx_copy_ctor)THISCALL(MSVCP_length_error_copy_ctor) +}; + +static const cxx_type_info_table length_error_cxx_type_table = { + 3, + { + &length_error_cxx_type_info, + &logic_error_cxx_type_info, + &exception_cxx_type_info + } +}; + +static const cxx_exception_type length_error_cxx_type = { + 0, + (cxx_copy_ctor)THISCALL(MSVCP_logic_error_dtor), + NULL, + &length_error_cxx_type_table +}; + +/* out_of_range class data */ +typedef logic_error out_of_range; + +DEFINE_THISCALL_WRAPPER(MSVCP_out_of_range_ctor, 8) +out_of_range* __stdcall MSVCP_out_of_range_ctor( + out_of_range *this, const char **name) +{ + TRACE("%p %s\n", this, *name); + MSVCP_logic_error_ctor(this, name); + this->e.vtable = &MSVCP_out_of_range_vtable; + return this; +} + +DEFINE_THISCALL_WRAPPER(MSVCP_out_of_range_copy_ctor, 8) +out_of_range* __stdcall MSVCP_out_of_range_copy_ctor( + out_of_range *this, out_of_range *rhs) +{ + TRACE("%p %p\n", this, rhs); + MSVCP_logic_error_copy_ctor(this, rhs); + this->e.vtable = &MSVCP_out_of_range_vtable; + return this; +} + +DEFINE_THISCALL_WRAPPER(MSVCP_out_of_range_vector_dtor, 8) +void* __stdcall MSVCP_out_of_range_vector_dtor( + out_of_range *this, unsigned int flags) +{ + TRACE("%p %x\n", this, flags); + return MSVCP_logic_error_vector_dtor(this, flags); +} + +static const type_info out_of_range_type_info = { + &MSVCP_out_of_range_vtable, + NULL, + ".?AVout_of_range@std@@" +}; + +static const rtti_base_descriptor out_of_range_rtti_base_descriptor = { + &out_of_range_type_info, + 2, + { 0, -1, 0 }, + 64 +}; + +static const rtti_base_array out_of_range_rtti_base_array = { + { + &out_of_range_rtti_base_descriptor, + &logic_error_rtti_base_descriptor, + &exception_rtti_base_descriptor + } +}; + +static const rtti_object_hierarchy out_of_range_type_hierarchy = { + 0, + 0, + 3, + &out_of_range_rtti_base_array +}; + +const rtti_object_locator out_of_range_rtti = { + 0, + 0, + 0, + &out_of_range_type_info, + &out_of_range_type_hierarchy +}; + +static const cxx_type_info out_of_range_cxx_type_info = { + 0, + &out_of_range_type_info, + { 0, -1, 0 }, + sizeof(out_of_range), + (cxx_copy_ctor)THISCALL(MSVCP_out_of_range_copy_ctor) +}; + +static const cxx_type_info_table out_of_range_cxx_type_table = { + 3, + { + &out_of_range_cxx_type_info, + &logic_error_cxx_type_info, + &exception_cxx_type_info + } +}; + +static const cxx_exception_type out_of_range_cxx_type = { + 0, + (cxx_copy_ctor)THISCALL(MSVCP_logic_error_dtor), + NULL, + &out_of_range_cxx_type_table +}; + +#ifndef __GNUC__ +void __asm_dummy_vtables(void) { +#endif + __ASM_EXCEPTION_VTABLE(bad_alloc) + __ASM_EXCEPTION_STRING_VTABLE(logic_error) + __ASM_EXCEPTION_STRING_VTABLE(length_error) + __ASM_EXCEPTION_STRING_VTABLE(out_of_range) +#ifndef __GNUC__ +} +#endif + +/* Internal: throws selected exception */ +void throw_exception(exception_type et, const char *str) +{ + const char *addr = str; + + switch(et) { + case EXCEPTION: { + exception e; + MSVCP_exception_ctor(&e, &addr); + _CxxThrowException(&e, &exception_cxx_type); + return; + } + case EXCEPTION_BAD_ALLOC: { + bad_alloc e; + MSVCP_bad_alloc_ctor(&e, &addr); + _CxxThrowException(&e, &bad_alloc_cxx_type); + return; + } + case EXCEPTION_LOGIC_ERROR: { + logic_error e; + MSVCP_logic_error_ctor(&e, &addr); + _CxxThrowException((exception*)&e, &logic_error_cxx_type); + return; + } + case EXCEPTION_LENGTH_ERROR: { + length_error e; + MSVCP_length_error_ctor(&e, &addr); + _CxxThrowException((exception*)&e, &length_error_cxx_type); + return; + } + case EXCEPTION_OUT_OF_RANGE: { + out_of_range e; + MSVCP_out_of_range_ctor(&e, &addr); + _CxxThrowException((exception*)&e, &out_of_range_cxx_type); + } + } +} diff -Nru wine1.3-1.3.0/dlls/msvcp90/Makefile.in wine1.3-1.3.1/dlls/msvcp90/Makefile.in --- wine1.3-1.3.0/dlls/msvcp90/Makefile.in 2010-07-30 18:43:56.000000000 +0100 +++ wine1.3-1.3.1/dlls/msvcp90/Makefile.in 2010-08-20 18:23:50.000000000 +0100 @@ -8,6 +8,7 @@ EXTRAINCL = -I$(TOPSRCDIR)/include/msvcrt C_SRCS = \ + exception.c \ memory.c \ msvcp90_main.c \ string.c diff -Nru wine1.3-1.3.0/dlls/msvcp90/memory.c wine1.3-1.3.1/dlls/msvcp90/memory.c --- wine1.3-1.3.0/dlls/msvcp90/memory.c 2010-07-30 18:43:56.000000000 +0100 +++ wine1.3-1.3.1/dlls/msvcp90/memory.c 2010-08-20 18:23:50.000000000 +0100 @@ -29,6 +29,7 @@ WINE_DEFAULT_DEBUG_CHANNEL(msvcp90); /* ?address@?$allocator@D@std@@QBEPADAAD@Z */ +/* ?address@?$allocator@D@std@@QEBAPEADAEAD@Z */ DEFINE_THISCALL_WRAPPER(MSVCP_allocator_char_address, 8) char* __stdcall MSVCP_allocator_char_address(void *this, char *ptr) { @@ -36,6 +37,7 @@ } /* ?address@?$allocator@D@std@@QBEPBDABD@Z */ +/* ?address@?$allocator@D@std@@QEBAPEBDAEBD@Z */ DEFINE_THISCALL_WRAPPER(MSVCP_allocator_char_const_address, 8) const char* __stdcall MSVCP_allocator_char_const_address(void *this, const char *ptr) { @@ -43,6 +45,7 @@ } /* ??0?$allocator@D@std@@QAE@XZ */ +/* ??0?$allocator@D@std@@QEAA@XZ */ DEFINE_THISCALL_WRAPPER(MSVCP_allocator_char_ctor, 4) void* __stdcall MSVCP_allocator_char_ctor(void *this) { @@ -50,6 +53,7 @@ } /* ??0?$allocator@D@std@@QAE@ABV01@@Z */ +/* ??0?$allocator@D@std@@QEAA@AEBV01@@Z */ DEFINE_THISCALL_WRAPPER(MSVCP_allocator_char_copy_ctor, 8) void* __stdcall MSVCP_allocator_char_copy_ctor(void *this, void *copy) { @@ -57,6 +61,7 @@ } /* ??4?$allocator@D@std@@QAEAAV01@ABV01@@Z */ +/* ??4?$allocator@D@std@@QEAAAEAV01@AEBV01@@Z */ DEFINE_THISCALL_WRAPPER(MSVCP_allocator_char_assign, 8); void* __stdcall MSVCP_allocator_char_assign(void *this, void *assign) { @@ -64,29 +69,33 @@ } /* ?deallocate@?$allocator@D@std@@QAEXPADI@Z */ +/* ?deallocate@?$allocator@D@std@@QEAAXPEAD_K@Z */ DEFINE_THISCALL_WRAPPER(MSVCP_allocator_char_deallocate, 12); -void __stdcall MSVCP_allocator_char_deallocate(void *this, char *ptr, unsigned int size) +void __stdcall MSVCP_allocator_char_deallocate(void *this, char *ptr, size_t size) { MSVCRT_operator_delete(ptr); } /* ?allocate@?$allocator@D@std@@QAEPADI@Z */ +/* ?allocate@?$allocator@D@std@@QEAAPEAD_K@Z */ DEFINE_THISCALL_WRAPPER(MSVCP_allocator_char_allocate, 8); -char* __stdcall MSVCP_allocator_char_allocate(void *this, unsigned int count) +char* __stdcall MSVCP_allocator_char_allocate(void *this, size_t count) { return MSVCRT_operator_new(sizeof(char[count])); } /* ?allocate@?$allocator@D@std@@QAEPADIPBX@Z */ +/* ?allocate@?$allocator@D@std@@QEAAPEAD_KPEBX@Z */ DEFINE_THISCALL_WRAPPER(MSVCP_allocator_char_allocate_hint, 12); char* __stdcall MSVCP_allocator_char_allocate_hint(void *this, - unsigned int count, const void *hint) + size_t count, const void *hint) { /* Native ignores hint */ return MSVCP_allocator_char_allocate(this, count); } /* ?construct@?$allocator@D@std@@QAEXPADABD@Z */ +/* ?construct@?$allocator@D@std@@QEAAXPEADAEBD@Z */ DEFINE_THISCALL_WRAPPER(MSVCP_allocator_char_construct, 12); void __stdcall MSVCP_allocator_char_construct(void *this, char *ptr, const char *val) { @@ -94,14 +103,237 @@ } /* ?destroy@?$allocator@D@std@@QAEXPAD@Z */ +/* ?destroy@?$allocator@D@std@@QEAAXPEAD@Z */ DEFINE_THISCALL_WRAPPER(MSVCP_allocator_char_destroy, 8); void __stdcall MSVCP_allocator_char_destroy(void *this, char *ptr) { } /* ?max_size@?$allocator@D@std@@QBEIXZ */ +/* ?max_size@?$allocator@D@std@@QEBA_KXZ */ DEFINE_THISCALL_WRAPPER(MSVCP_allocator_char_max_size, 4); -unsigned int __stdcall MSVCP_allocator_char_max_size(void *this) +size_t __stdcall MSVCP_allocator_char_max_size(void *this) { return UINT_MAX/sizeof(char); } + + +/* allocator */ +/* ?address@?$allocator@_W@std@@QBEPA_WAA_W@Z */ +/* ?address@?$allocator@_W@std@@QEBAPEA_WAEA_W@Z */ +DEFINE_THISCALL_WRAPPER(MSVCP_allocator_wchar_address, 8) +wchar_t* __stdcall MSVCP_allocator_wchar_address(void *this, wchar_t *ptr) +{ + return ptr; +} + +/* ?address@?$allocator@_W@std@@QBEPB_WAB_W@Z */ +/* ?address@?$allocator@_W@std@@QEBAPEB_WAEB_W@Z */ +DEFINE_THISCALL_WRAPPER(MSVCP_allocator_wchar_const_address, 8) +const wchar_t* __stdcall MSVCP_allocator_wchar_const_address(void *this, const wchar_t *ptr) +{ + return ptr; +} + +/* ??0?$allocator@_W@std@@QAE@XZ */ +/* ??0?$allocator@_W@std@@QEAA@XZ */ +DEFINE_THISCALL_WRAPPER(MSVCP_allocator_wchar_ctor, 4) +void* __stdcall MSVCP_allocator_wchar_ctor(void *this) +{ + return this; +} + +/* ??0?$allocator@_W@std@@QAE@ABV01@@Z */ +/* ??0?$allocator@_W@std@@QEAA@AEBV01@@Z */ +DEFINE_THISCALL_WRAPPER(MSVCP_allocator_wchar_copy_ctor, 8) +void* __stdcall MSVCP_allocator_wchar_copy_ctor(void *this, void *copy) +{ + return this; +} + +/* ??4?$allocator@_W@std@@QAEAAV01@ABV01@@Z */ +/* ??4?$allocator@_W@std@@QEAAAEAV01@AEBV01@@Z */ +DEFINE_THISCALL_WRAPPER(MSVCP_allocator_wchar_assign, 8) +void* __stdcall MSVCP_allocator_wchar_assign(void *this, void *assign) +{ + return this; +} + +/* ?deallocate@?$allocator@_W@std@@QAEXPA_WI@Z */ +/* ?deallocate@?$allocator@_W@std@@QEAAXPEA_W_K@Z */ +DEFINE_THISCALL_WRAPPER(MSVCP_allocator_wchar_deallocate, 12) +void __stdcall MSVCP_allocator_wchar_deallocate(void *this, + wchar_t *ptr, size_t size) +{ + MSVCRT_operator_delete(ptr); +} + +/* ?allocate@?$allocator@_W@std@@QAEPA_WI@Z */ +/* ?allocate@?$allocator@_W@std@@QEAAPEA_W_K@Z */ +DEFINE_THISCALL_WRAPPER(MSVCP_allocator_wchar_allocate, 8) +wchar_t* __stdcall MSVCP_allocator_wchar_allocate(void *this, size_t count) +{ + if(UINT_MAX/count < sizeof(wchar_t)) { + throw_exception(EXCEPTION_BAD_ALLOC, NULL); + return NULL; + } + + return MSVCRT_operator_new(sizeof(wchar_t[count])); +} + +/* ?allocate@?$allocator@_W@std@@QAEPA_WIPBX@Z */ +/* ?allocate@?$allocator@_W@std@@QEAAPEA_W_KPEBX@Z */ +DEFINE_THISCALL_WRAPPER(MSVCP_allocator_wchar_allocate_hint, 12) +wchar_t* __stdcall MSVCP_allocator_wchar_allocate_hint(void *this, + size_t count, const void *hint) +{ + return MSVCP_allocator_wchar_allocate(this, count); +} + +/* ?construct@?$allocator@_W@std@@QAEXPA_WAB_W@Z */ +/* ?construct@?$allocator@_W@std@@QEAAXPEA_WAEB_W@Z */ +DEFINE_THISCALL_WRAPPER(MSVCP_allocator_wchar_construct, 12) +void __stdcall MSVCP_allocator_wchar_construct(void *this, + wchar_t *ptr, const wchar_t *val) +{ + *ptr = *val; +} + +/* ?destroy@?$allocator@_W@std@@QAEXPA_W@Z */ +/* ?destroy@?$allocator@_W@std@@QEAAXPEA_W@Z */ +DEFINE_THISCALL_WRAPPER(MSVCP_allocator_wchar_destroy, 8) +void __stdcall MSVCP_allocator_wchar_destroy(void *this, char *ptr) +{ +} + +/* ?max_size@?$allocator@_W@std@@QBEIXZ */ +/* ?max_size@?$allocator@_W@std@@QEBA_KXZ */ +DEFINE_THISCALL_WRAPPER(MSVCP_allocator_wchar_max_size, 4) +size_t __stdcall MSVCP_allocator_wchar_max_size(void *this) +{ + return UINT_MAX/sizeof(wchar_t); +} + +/* allocator */ +/* ?address@?$allocator@G@std@@QBEPAGAAG@Z */ +/* ?address@?$allocator@G@std@@QEBAPEAGAEAG@Z */ +DEFINE_THISCALL_WRAPPER(MSVCP_allocator_short_address, 8) +unsigned short* __stdcall MSVCP_allocator_short_address( + void *this, unsigned short *ptr) +{ + return ptr; +} + +/* ?address@?$allocator@G@std@@QBEPBGABG@Z */ +/* ?address@?$allocator@G@std@@QEBAPEBGAEBG@Z */ +DEFINE_THISCALL_WRAPPER(MSVCP_allocator_short_const_address, 8) +const unsigned short* __stdcall MSVCP_allocator_short_const_address( + void *this, const unsigned short *ptr) +{ + return ptr; +} + +/* ??0?$allocator@G@std@@QAE@XZ */ +/* ??0?$allocator@G@std@@QEAA@XZ */ +DEFINE_THISCALL_WRAPPER(MSVCP_allocator_short_ctor, 4) +void* __stdcall MSVCP_allocator_short_ctor(void *this) +{ + return this; +} + +/* ??0?$allocator@G@std@@QAE@ABV01@@Z */ +/* ??0?$allocator@G@std@@QEAA@AEBV01@@Z */ +DEFINE_THISCALL_WRAPPER(MSVCP_allocator_short_copy_ctor, 8) +void* __stdcall MSVCP_allocator_short_copy_ctor(void *this, void *copy) +{ + return this; +} + +/* ??4?$allocator@G@std@@QAEAAV01@ABV01@@Z */ +/* ??4?$allocator@G@std@@QEAAAEAV01@AEBV01@@Z */ +DEFINE_THISCALL_WRAPPER(MSVCP_allocator_short_assign, 8) +void* __stdcall MSVCP_allocator_short_assign(void *this, void *assign) +{ + return this; +} + +/* ?deallocate@?$allocator@G@std@@QAEXPAGI@Z */ +/* ?deallocate@?$allocator@G@std@@QEAAXPEAG_K@Z */ +DEFINE_THISCALL_WRAPPER(MSVCP_allocator_short_deallocate, 12) +void __stdcall MSVCP_allocator_short_deallocate(void *this, + unsigned short *ptr, size_t size) +{ + MSVCRT_operator_delete(ptr); +} + +/* ?allocate@?$allocator@G@std@@QAEPAGI@Z */ +/* ?allocate@?$allocator@G@std@@QEAAPEAG_K@Z */ +DEFINE_THISCALL_WRAPPER(MSVCP_allocator_short_allocate, 8) +unsigned short* __stdcall MSVCP_allocator_short_allocate( + void *this, size_t count) +{ + if(UINT_MAX/count < sizeof(unsigned short)) { + throw_exception(EXCEPTION_BAD_ALLOC, NULL); + return NULL; + } + + return MSVCRT_operator_new(sizeof(unsigned short[count])); +} + +/* ?allocate@?$allocator@G@std@@QAEPAGIPBX@Z */ +/* ?allocate@?$allocator@G@std@@QEAAPEAG_KPEBX@Z */ +DEFINE_THISCALL_WRAPPER(MSVCP_allocator_short_allocate_hint, 12) +unsigned short* __stdcall MSVCP_allocator_short_allocate_hint( + void *this, size_t count, const void *hint) +{ + return MSVCP_allocator_short_allocate(this, count); +} + +/* ?construct@?$allocator@G@std@@QAEXPAGABG@Z */ +/* ?construct@?$allocator@G@std@@QEAAXPEAGAEBG@Z */ +DEFINE_THISCALL_WRAPPER(MSVCP_allocator_short_construct, 12) +void __stdcall MSVCP_allocator_short_construct(void *this, + unsigned short *ptr, unsigned short *val) +{ + *ptr = *val; +} + +/* ?destroy@?$allocator@G@std@@QAEXPAG@Z */ +/* ?destroy@?$allocator@G@std@@QEAAXPEAG@Z */ +DEFINE_THISCALL_WRAPPER(MSVCP_allocator_short_destroy, 8) +void __stdcall MSVCP_allocator_short_destroy(void *this, size_t *ptr) +{ +} + +/* ?max_size@?$allocator@G@std@@QBEIXZ */ +/* ?max_size@?$allocator@G@std@@QEBA_KXZ */ +DEFINE_THISCALL_WRAPPER(MSVCP_allocator_short_max_size, 4) +size_t __stdcall MSVCP_allocator_short_max_size(void *this) +{ + return UINT_MAX/sizeof(unsigned short); +} + +/* allocator */ +/* ??0?$allocator@X@std@@QAE@XZ */ +/* ??0?$allocator@X@std@@QEAA@XZ */ +DEFINE_THISCALL_WRAPPER(MSVCP_allocator_void_ctor, 4); +void* __stdcall MSVCP_allocator_void_ctor(void *this) +{ + return this; +} + +/* ??0?$allocator@X@std@@QAE@ABV01@@Z */ +/* ??0?$allocator@X@std@@QEAA@AEBV01@@Z */ +DEFINE_THISCALL_WRAPPER(MSVCP_allocator_void_copy_ctor, 8); +void* __stdcall MSVCP_allocator_void_copy_ctor(void *this, void *copy) +{ + return this; +} + +/* ??4?$allocator@X@std@@QAEAAV01@ABV01@@Z */ +/* ??4?$allocator@X@std@@QEAAAEAV01@AEBV01@@Z */ +DEFINE_THISCALL_WRAPPER(MSVCP_allocator_void_assign, 8); +void* __stdcall MSVCP_allocator_void_assign(void *this, void *assign) +{ + return this; +} diff -Nru wine1.3-1.3.0/dlls/msvcp90/msvcp90.h wine1.3-1.3.1/dlls/msvcp90/msvcp90.h --- wine1.3-1.3.0/dlls/msvcp90/msvcp90.h 2010-07-30 18:43:56.000000000 +0100 +++ wine1.3-1.3.1/dlls/msvcp90/msvcp90.h 2010-08-20 18:23:50.000000000 +0100 @@ -17,6 +17,7 @@ */ #include "stdlib.h" +#include "windef.h" typedef unsigned char MSVCP_BOOL; @@ -30,6 +31,7 @@ #ifdef __i386__ /* thiscall functions are i386-specific */ #define THISCALL(func) __thiscall_ ## func +#define THISCALL_NAME(func) __ASM_NAME("__thiscall_" #func) #define DEFINE_THISCALL_WRAPPER(func,args) \ extern void THISCALL(func)(void); \ __ASM_GLOBAL_FUNC(__thiscall_ ## func, \ @@ -40,6 +42,94 @@ #else /* __i386__ */ #define THISCALL(func) func +#define THISCALL_NAME(func) __ASM_NAME(#func) #define DEFINE_THISCALL_WRAPPER(func,args) /* nothing */ #endif /* __i386__ */ + +/* exception object */ +typedef void (*vtable_ptr)(void); +typedef struct __exception +{ + const vtable_ptr *vtable; + char *name; /* Name of this exception, always a new copy for each object */ + int do_free; /* Whether to free 'name' in our dtor */ +} exception; + +/* Internal: throws selected exception */ +typedef enum __exception_type { + EXCEPTION, + EXCEPTION_BAD_ALLOC, + EXCEPTION_LOGIC_ERROR, + EXCEPTION_LENGTH_ERROR, + EXCEPTION_OUT_OF_RANGE +} exception_type; +void throw_exception(exception_type, const char *); +void set_exception_vtable(void); + +/* rtti */ +typedef struct __type_info +{ + const vtable_ptr *vtable; + char *name; /* Unmangled name, allocated lazily */ + char mangled[32]; /* Variable length, but we declare it large enough for static RTTI */ +} type_info; + +/* offsets for computing the this pointer */ +typedef struct +{ + int this_offset; /* offset of base class this pointer from start of object */ + int vbase_descr; /* offset of virtual base class descriptor */ + int vbase_offset; /* offset of this pointer offset in virtual base class descriptor */ +} this_ptr_offsets; + +typedef struct _rtti_base_descriptor +{ + const type_info *type_descriptor; + int num_base_classes; + this_ptr_offsets offsets; /* offsets for computing the this pointer */ + unsigned int attributes; +} rtti_base_descriptor; + +typedef struct _rtti_base_array +{ + const rtti_base_descriptor *bases[3]; /* First element is the class itself */ +} rtti_base_array; + +typedef struct _rtti_object_hierarchy +{ + unsigned int signature; + unsigned int attributes; + int array_len; /* Size of the array pointed to by 'base_classes' */ + const rtti_base_array *base_classes; +} rtti_object_hierarchy; + +typedef struct _rtti_object_locator +{ + unsigned int signature; + int base_class_offset; + unsigned int flags; + const type_info *type_descriptor; + const rtti_object_hierarchy *type_hierarchy; +} rtti_object_locator; + +/* basic_string, allocator> */ +#define BUF_SIZE_CHAR 16 +typedef struct _basic_string_char +{ + void *allocator; + union _data { + char buf[BUF_SIZE_CHAR]; + char *ptr; + } data; + size_t size; + size_t res; +} basic_string_char; + +basic_string_char* __stdcall MSVCP_basic_string_char_ctor_cstr(basic_string_char*, const char*); +basic_string_char* __stdcall MSVCP_basic_string_char_copy_ctor(basic_string_char*, const basic_string_char*); +void __stdcall MSVCP_basic_string_char_dtor(basic_string_char*); +const char* __stdcall MSVCP_basic_string_char_c_str(basic_string_char*); + +char* __stdcall MSVCP_allocator_char_allocate(void*, size_t); +void __stdcall MSVCP_allocator_char_deallocate(void*, char*, size_t); diff -Nru wine1.3-1.3.0/dlls/msvcp90/msvcp90_main.c wine1.3-1.3.1/dlls/msvcp90/msvcp90_main.c --- wine1.3-1.3.0/dlls/msvcp90/msvcp90_main.c 2010-07-30 18:43:56.000000000 +0100 +++ wine1.3-1.3.1/dlls/msvcp90/msvcp90_main.c 2010-08-20 18:23:50.000000000 +0100 @@ -56,6 +56,7 @@ return FALSE; /* prefer native version */ case DLL_PROCESS_ATTACH: init_cxx_funcs(); + set_exception_vtable(); break; case DLL_PROCESS_DETACH: break; diff -Nru wine1.3-1.3.0/dlls/msvcp90/msvcp90.spec wine1.3-1.3.1/dlls/msvcp90/msvcp90.spec --- wine1.3-1.3.0/dlls/msvcp90/msvcp90.spec 2010-07-30 18:43:56.000000000 +0100 +++ wine1.3-1.3.1/dlls/msvcp90/msvcp90.spec 2010-08-20 18:23:50.000000000 +0100 @@ -531,21 +531,21 @@ @ stub -arch=win32 ??0?$_String_val@_WV?$allocator@_W@std@@@std@@QAE@ABV01@@Z @ stub -arch=win64 ??0?$_String_val@_WV?$allocator@_W@std@@@std@@QEAA@AEBV01@@Z @ cdecl -arch=win32 -i386 -norelay ??0?$allocator@D@std@@QAE@ABV01@@Z(ptr) __thiscall_MSVCP_allocator_char_copy_ctor -@ stub -arch=win64 ??0?$allocator@D@std@@QEAA@AEBV01@@Z +@ cdecl -arch=win64 ??0?$allocator@D@std@@QEAA@AEBV01@@Z(ptr ptr) MSVCP_allocator_char_copy_ctor @ cdecl -arch=win32 -i386 -norelay ??0?$allocator@D@std@@QAE@XZ() __thiscall_MSVCP_allocator_char_ctor -@ stub -arch=win64 ??0?$allocator@D@std@@QEAA@XZ -@ stub -arch=win32 ??0?$allocator@G@std@@QAE@ABV01@@Z -@ stub -arch=win64 ??0?$allocator@G@std@@QEAA@AEBV01@@Z -@ stub -arch=win32 ??0?$allocator@G@std@@QAE@XZ -@ stub -arch=win64 ??0?$allocator@G@std@@QEAA@XZ -@ stub -arch=win32 ??0?$allocator@X@std@@QAE@ABV01@@Z -@ stub -arch=win64 ??0?$allocator@X@std@@QEAA@AEBV01@@Z -@ stub -arch=win32 ??0?$allocator@X@std@@QAE@XZ -@ stub -arch=win64 ??0?$allocator@X@std@@QEAA@XZ -@ stub -arch=win32 ??0?$allocator@_W@std@@QAE@ABV01@@Z -@ stub -arch=win64 ??0?$allocator@_W@std@@QEAA@AEBV01@@Z -@ stub -arch=win32 ??0?$allocator@_W@std@@QAE@XZ -@ stub -arch=win64 ??0?$allocator@_W@std@@QEAA@XZ +@ cdecl -arch=win64 ??0?$allocator@D@std@@QEAA@XZ(ptr) MSVCP_allocator_char_ctor +@ cdecl -arch=win32 -i386 -norelay ??0?$allocator@G@std@@QAE@ABV01@@Z(ptr) __thiscall_MSVCP_allocator_short_copy_ctor +@ cdecl -arch=win64 ??0?$allocator@G@std@@QEAA@AEBV01@@Z(ptr ptr) MSVCP_allocator_short_copy_ctor +@ cdecl -arch=win32 -i386 -norelay ??0?$allocator@G@std@@QAE@XZ() __thiscall_MSVCP_allocator_short_ctor +@ cdecl -arch=win64 ??0?$allocator@G@std@@QEAA@XZ(ptr) MSVCP_allocator_short_ctor +@ cdecl -arch=win32 -i386 -norelay ??0?$allocator@X@std@@QAE@ABV01@@Z(ptr) __thiscall_MSVCP_allocator_void_copy_ctor +@ cdecl -arch=win64 ??0?$allocator@X@std@@QEAA@AEBV01@@Z(ptr ptr) MSVCP_allocator_void_copy_ctor +@ cdecl -arch=win32 -i386 -norelay ??0?$allocator@X@std@@QAE@XZ() __thiscall_MSVCP_allocator_void_ctor +@ cdecl -arch=win64 ??0?$allocator@X@std@@QEAA@XZ(ptr) MSVCP_allocator_void_ctor +@ cdecl -arch=win32 -i386 -norelay ??0?$allocator@_W@std@@QAE@ABV01@@Z(ptr) __thiscall_MSVCP_allocator_wchar_copy_ctor +@ cdecl -arch=win64 ??0?$allocator@_W@std@@QEAA@AEBV01@@Z(ptr ptr) MSVCP_allocator_wchar_copy_ctor +@ cdecl -arch=win32 -i386 -norelay ??0?$allocator@_W@std@@QAE@XZ() __thiscall_MSVCP_allocator_wchar_ctor +@ cdecl -arch=win64 ??0?$allocator@_W@std@@QEAA@XZ(ptr) MSVCP_allocator_wchar_ctor @ stub -arch=win32 ??0?$basic_filebuf@DU?$char_traits@D@std@@@std@@QAE@PAU_iobuf@@@Z @ stub -arch=win64 ??0?$basic_filebuf@DU?$char_traits@D@std@@@std@@QEAA@PEAU_iobuf@@@Z @ stub -arch=win32 ??0?$basic_filebuf@DU?$char_traits@D@std@@@std@@QAE@W4_Uninitialized@1@@Z @@ -732,8 +732,8 @@ @ stub -arch=win64 ??0?$basic_streambuf@_WU?$char_traits@_W@std@@@std@@IEAA@W4_Uninitialized@1@@Z @ stub -arch=win32 ??0?$basic_streambuf@_WU?$char_traits@_W@std@@@std@@IAE@XZ @ stub -arch=win64 ??0?$basic_streambuf@_WU?$char_traits@_W@std@@@std@@IEAA@XZ -@ stub -arch=win32 ??0?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QAE@ABV01@@Z -@ stub -arch=win64 ??0?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QEAA@AEBV01@@Z +@ cdecl -arch=win32 -i386 -norelay ??0?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QAE@ABV01@@Z(ptr) __thiscall_MSVCP_basic_string_char_copy_ctor +@ cdecl -arch=win64 ??0?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QEAA@AEBV01@@Z(ptr ptr) MSVCP_basic_string_char_copy_ctor @ stub -arch=win32 ??0?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QAE@ABV01@II@Z @ stub -arch=win64 ??0?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QEAA@AEBV01@_K1@Z @ stub -arch=win32 ??0?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QAE@ABV01@IIABV?$allocator@D@1@@Z @@ -743,20 +743,20 @@ @ stub -arch=win32 ??0?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QAE@ID@Z @ stub -arch=win64 ??0?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QEAA@PEBD0@Z @ stub -arch=win32 ??0?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QAE@IDABV?$allocator@D@1@@Z -@ stub -arch=win64 ??0?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QEAA@PEBD@Z +@ cdecl -arch=win64 ??0?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QEAA@PEBD@Z(ptr str) MSVCP_basic_string_char_ctor_cstr @ stub -arch=win32 ??0?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QAE@PBD0@Z @ stub -arch=win64 ??0?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QEAA@PEBDAEBV?$allocator@D@1@@Z -@ stub -arch=win32 ??0?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QAE@PBD@Z +@ cdecl -arch=win32 -i386 -norelay ??0?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QAE@PBD@Z(str) __thiscall_MSVCP_basic_string_char_ctor_cstr @ stub -arch=win64 ??0?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QEAA@PEBD_K@Z @ stub -arch=win32 ??0?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QAE@PBDABV?$allocator@D@1@@Z @ stub -arch=win64 ??0?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QEAA@PEBD_KAEBV?$allocator@D@1@@Z @ stub -arch=win32 ??0?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QAE@PBDI@Z @ stub -arch=win64 ??0?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QEAA@V?$_String_const_iterator@DU?$char_traits@D@std@@V?$allocator@D@2@@1@0@Z @ stub -arch=win32 ??0?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QAE@PBDIABV?$allocator@D@1@@Z -@ stub -arch=win64 ??0?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QEAA@XZ +@ cdecl -arch=win64 ??0?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QEAA@XZ(ptr) MSVCP_basic_string_char_ctor @ stub -arch=win32 ??0?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QAE@V?$_String_const_iterator@DU?$char_traits@D@std@@V?$allocator@D@2@@1@0@Z @ stub -arch=win64 ??0?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QEAA@_KD@Z -@ stub -arch=win32 ??0?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QAE@XZ +@ cdecl -arch=win32 -i386 -norelay ??0?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QAE@XZ() __thiscall_MSVCP_basic_string_char_ctor @ stub -arch=win64 ??0?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QEAA@_KDAEBV?$allocator@D@1@@Z @ stub -arch=win32 ??0?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QAE@ABV01@@Z @ stub -arch=win64 ??0?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QEAA@AEBV01@@Z @@ -1212,8 +1212,8 @@ @ stub -arch=win64 ??1?$basic_streambuf@GU?$char_traits@G@std@@@std@@UEAA@XZ @ stub -arch=win32 ??1?$basic_streambuf@_WU?$char_traits@_W@std@@@std@@UAE@XZ @ stub -arch=win64 ??1?$basic_streambuf@_WU?$char_traits@_W@std@@@std@@UEAA@XZ -@ stub -arch=win32 ??1?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QAE@XZ -@ stub -arch=win64 ??1?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QEAA@XZ +@ cdecl -arch=win32 -i386 -norelay ??1?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QAE@XZ() __thiscall_MSVCP_basic_string_char_dtor +@ cdecl -arch=win64 ??1?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QEAA@XZ(ptr) MSVCP_basic_string_char_dtor @ stub -arch=win32 ??1?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QAE@XZ @ stub -arch=win64 ??1?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QEAA@XZ @ stub -arch=win32 ??1?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QAE@XZ @@ -1373,13 +1373,13 @@ @ stub -arch=win32 ??4?$_String_val@_WV?$allocator@_W@std@@@std@@QAEAAV01@ABV01@@Z @ stub -arch=win64 ??4?$_String_val@_WV?$allocator@_W@std@@@std@@QEAAAEAV01@AEBV01@@Z @ cdecl -arch=win32 -i386 -norelay ??4?$allocator@D@std@@QAEAAV01@ABV01@@Z(ptr) __thiscall_MSVCP_allocator_char_assign -@ stub -arch=win64 ??4?$allocator@D@std@@QEAAAEAV01@AEBV01@@Z -@ stub -arch=win32 ??4?$allocator@G@std@@QAEAAV01@ABV01@@Z -@ stub -arch=win64 ??4?$allocator@G@std@@QEAAAEAV01@AEBV01@@Z -@ stub -arch=win32 ??4?$allocator@X@std@@QAEAAV01@ABV01@@Z -@ stub -arch=win64 ??4?$allocator@X@std@@QEAAAEAV01@AEBV01@@Z -@ stub -arch=win32 ??4?$allocator@_W@std@@QAEAAV01@ABV01@@Z -@ stub -arch=win64 ??4?$allocator@_W@std@@QEAAAEAV01@AEBV01@@Z +@ cdecl -arch=win64 ??4?$allocator@D@std@@QEAAAEAV01@AEBV01@@Z(ptr ptr) MSVCP_allocator_char_assign +@ cdecl -arch=win32 -i386 -norelay ??4?$allocator@G@std@@QAEAAV01@ABV01@@Z(ptr) __thiscall_MSVCP_allocator_short_assign +@ cdecl -arch=win64 ??4?$allocator@G@std@@QEAAAEAV01@AEBV01@@Z(ptr ptr) MSVCP_allocator_short_assign +@ cdecl -arch=win32 -i386 -norelay ??4?$allocator@X@std@@QAEAAV01@ABV01@@Z(ptr) __thiscall_MSVCP_allocator_void_assign +@ cdecl -arch=win64 ??4?$allocator@X@std@@QEAAAEAV01@AEBV01@@Z(ptr ptr) MSVCP_allocator_void_assign +@ cdecl -arch=win32 -i386 -norelay ??4?$allocator@_W@std@@QAEAAV01@ABV01@@Z(ptr) __thiscall_MSVCP_allocator_wchar_assign +@ cdecl -arch=win64 ??4?$allocator@_W@std@@QEAAAEAV01@AEBV01@@Z(ptr ptr) MSVCP_allocator_wchar_assign @ stub -arch=win32 ??4?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QAEAAV01@ABV01@@Z @ stub -arch=win64 ??4?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QEAAAEAV01@AEBV01@@Z @ stub -arch=win32 ??4?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QAEAAV01@D@Z @@ -2146,11 +2146,11 @@ @ stub -arch=win32 ?_Copy_s@?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QBEIPA_WIII@Z @ stub -arch=win64 ?_Copy_s@?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QEBA_KPEA_W_K11@Z @ cdecl -arch=win32 ?_Copy_s@?$char_traits@D@std@@SAPADPADIPBDI@Z(ptr long ptr long) MSVCP_char_traits_char__Copy_s -@ stub -arch=win64 ?_Copy_s@?$char_traits@D@std@@SAPEADPEAD_KPEBD1@Z +@ cdecl -arch=win64 ?_Copy_s@?$char_traits@D@std@@SAPEADPEAD_KPEBD1@Z(ptr long ptr long) MSVCP_char_traits_char__Copy_s @ cdecl -arch=win32 ?_Copy_s@?$char_traits@G@std@@SAPAGPAGIPBGI@Z(ptr long ptr long) MSVCP_char_traits_short__Copy_s -@ stub -arch=win64 ?_Copy_s@?$char_traits@G@std@@SAPEAGPEAG_KPEBG1@Z +@ cdecl -arch=win64 ?_Copy_s@?$char_traits@G@std@@SAPEAGPEAG_KPEBG1@Z(ptr long ptr long) MSVCP_char_traits_short__Copy_s @ cdecl -arch=win32 ?_Copy_s@?$char_traits@_W@std@@SAPA_WPA_WIPB_WI@Z(ptr long ptr long) MSVCP_char_traits_wchar__Copy_s -@ stub -arch=win64 ?_Copy_s@?$char_traits@_W@std@@SAPEA_WPEA_W_KPEB_W1@Z +@ cdecl -arch=win64 ?_Copy_s@?$char_traits@_W@std@@SAPEA_WPEA_W_KPEB_W1@Z(ptr long ptr long) MSVCP_char_traits_wchar__Copy_s @ stub ?_Cosh@?$_Ctraits@M@std@@SAMMM@Z @ stub ?_Cosh@?$_Ctraits@N@std@@SANNN@Z @ stub ?_Cosh@?$_Ctraits@O@std@@SAOOO@Z @@ -2630,11 +2630,11 @@ @ stub -arch=win32 ?_Makpat@?$_Mpunct@_W@std@@AAEXAAUpattern@money_base@2@III@Z @ stub -arch=win64 ?_Makpat@?$_Mpunct@_W@std@@AEAAXAEAUpattern@money_base@2@III@Z @ cdecl -arch=win32 ?_Move_s@?$char_traits@D@std@@SAPADPADIPBDI@Z(ptr long ptr long) MSVCP_char_traits_char__Move_s -@ stub -arch=win64 ?_Move_s@?$char_traits@D@std@@SAPEADPEAD_KPEBD1@Z +@ cdecl -arch=win64 ?_Move_s@?$char_traits@D@std@@SAPEADPEAD_KPEBD1@Z(ptr long ptr long) MSVCP_char_traits_char__Move_s @ cdecl -arch=win32 ?_Move_s@?$char_traits@G@std@@SAPAGPAGIPBGI@Z(ptr long ptr long) MSVCP_char_traits_short__Move_s -@ stub -arch=win64 ?_Move_s@?$char_traits@G@std@@SAPEAGPEAG_KPEBG1@Z +@ cdecl -arch=win64 ?_Move_s@?$char_traits@G@std@@SAPEAGPEAG_KPEBG1@Z(ptr long ptr long) MSVCP_char_traits_short__Move_s @ cdecl -arch=win32 ?_Move_s@?$char_traits@_W@std@@SAPA_WPA_WIPB_WI@Z(ptr long ptr long) MSVCP_char_traits_wchar__Move_s -@ stub -arch=win64 ?_Move_s@?$char_traits@_W@std@@SAPEA_WPEA_W_KPEB_W1@Z +@ cdecl -arch=win64 ?_Move_s@?$char_traits@_W@std@@SAPEA_WPEA_W_KPEB_W1@Z(ptr long ptr long) MSVCP_char_traits_wchar__Move_s @ stub -arch=win32 ?_Mutex_Lock@_Mutex@std@@CAXPAV12@@Z @ stub -arch=win64 ?_Mutex_Lock@_Mutex@std@@CAXPEAV12@@Z @ stub -arch=win32 ?_Mutex_Unlock@_Mutex@std@@CAXPAV12@@Z @@ -2878,10 +2878,10 @@ @ stub -arch=win32 ?_Xinvalid@tr1@std@@YAXPBD@Z @ stub -arch=win64 ?_Xinvalid@tr1@std@@YAXPEBD@Z @ stub ?_Xinvarg@_String_base@std@@SAXXZ -@ stub ?_Xlen@_String_base@std@@SAXXZ +@ cdecl ?_Xlen@_String_base@std@@SAXXZ() MSVCP__String_base_Xlen @ stub ?_Xmem@tr1@std@@YAXXZ @ stub ?_Xoutrange@tr1@std@@YAXXZ -@ stub ?_Xran@_String_base@std@@SAXXZ +@ cdecl ?_Xran@_String_base@std@@SAXXZ() MSVCP__String_base_Xran @ stub ?_Xran@ctype_base@std@@KAXXZ @ stub -arch=win32 ?_Xsgetn_s@?$basic_streambuf@DU?$char_traits@D@std@@@std@@MAEHPADIH@Z @ stub -arch=win64 ?_Xsgetn_s@?$basic_streambuf@DU?$char_traits@D@std@@@std@@MEAA_JPEAD_K_J@Z @@ -2891,29 +2891,29 @@ @ stub -arch=win64 ?_Xsgetn_s@?$basic_streambuf@_WU?$char_traits@_W@std@@@std@@MEAA_JPEA_W_K_J@Z @ stub ?_Xweak@tr1@std@@YAXXZ @ cdecl -arch=win32 -i386 -norelay ?address@?$allocator@D@std@@QBEPADAAD@Z(ptr) __thiscall_MSVCP_allocator_char_address -@ stub -arch=win64 ?address@?$allocator@D@std@@QEBAPEADAEAD@Z +@ cdecl -arch=win64 ?address@?$allocator@D@std@@QEBAPEADAEAD@Z(ptr ptr) MSVCP_allocator_char_address @ cdecl -arch=win32 -i386 -norelay ?address@?$allocator@D@std@@QBEPBDABD@Z(ptr) __thiscall_MSVCP_allocator_char_const_address -@ stub -arch=win64 ?address@?$allocator@D@std@@QEBAPEBDAEBD@Z -@ stub -arch=win32 ?address@?$allocator@G@std@@QBEPAGAAG@Z -@ stub -arch=win64 ?address@?$allocator@G@std@@QEBAPEAGAEAG@Z -@ stub -arch=win32 ?address@?$allocator@G@std@@QBEPBGABG@Z -@ stub -arch=win64 ?address@?$allocator@G@std@@QEBAPEBGAEBG@Z -@ stub -arch=win32 ?address@?$allocator@_W@std@@QBEPA_WAA_W@Z -@ stub -arch=win64 ?address@?$allocator@_W@std@@QEBAPEA_WAEA_W@Z -@ stub -arch=win32 ?address@?$allocator@_W@std@@QBEPB_WAB_W@Z -@ stub -arch=win64 ?address@?$allocator@_W@std@@QEBAPEB_WAEB_W@Z +@ cdecl -arch=win64 ?address@?$allocator@D@std@@QEBAPEBDAEBD@Z(ptr ptr) MSVCP_allocator_char_const_address +@ cdecl -arch=win32 -i386 -norelay ?address@?$allocator@G@std@@QBEPAGAAG@Z(ptr) __thiscall_MSVCP_allocator_short_address +@ cdecl -arch=win64 ?address@?$allocator@G@std@@QEBAPEAGAEAG@Z(ptr ptr) MSVCP_allocator_short_address +@ cdecl -arch=win32 -i386 -norelay ?address@?$allocator@G@std@@QBEPBGABG@Z(ptr) __thiscall_MSVCP_allocator_short_const_address +@ cdecl -arch=win64 ?address@?$allocator@G@std@@QEBAPEBGAEBG@Z(ptr ptr) MSVCP_allocator_short_const_address +@ cdecl -arch=win32 -i386 -norelay ?address@?$allocator@_W@std@@QBEPA_WAA_W@Z(ptr) __thiscall_MSVCP_allocator_wchar_address +@ cdecl -arch=win64 ?address@?$allocator@_W@std@@QEBAPEA_WAEA_W@Z(ptr ptr) MSVCP_allocator_wchar_address +@ cdecl -arch=win32 -i386 -norelay ?address@?$allocator@_W@std@@QBEPB_WAB_W@Z(ptr) __thiscall_MSVCP_allocator_wchar_const_address +@ cdecl -arch=win64 ?address@?$allocator@_W@std@@QEBAPEB_WAEB_W@Z(ptr ptr) MSVCP_allocator_wchar_const_address @ cdecl -arch=win32 -i386 -norelay ?allocate@?$allocator@D@std@@QAEPADI@Z(long) __thiscall_MSVCP_allocator_char_allocate -@ stub -arch=win64 ?allocate@?$allocator@D@std@@QEAAPEAD_K@Z +@ cdecl -arch=win64 ?allocate@?$allocator@D@std@@QEAAPEAD_K@Z(ptr long) MSVCP_allocator_char_allocate @ cdecl -arch=win32 -i386 -norelay ?allocate@?$allocator@D@std@@QAEPADIPBX@Z(long ptr) __thiscall_MSVCP_allocator_char_allocate_hint -@ stub -arch=win64 ?allocate@?$allocator@D@std@@QEAAPEAD_KPEBX@Z -@ stub -arch=win32 ?allocate@?$allocator@G@std@@QAEPAGI@Z -@ stub -arch=win64 ?allocate@?$allocator@G@std@@QEAAPEAG_K@Z -@ stub -arch=win32 ?allocate@?$allocator@G@std@@QAEPAGIPBX@Z -@ stub -arch=win64 ?allocate@?$allocator@G@std@@QEAAPEAG_KPEBX@Z -@ stub -arch=win32 ?allocate@?$allocator@_W@std@@QAEPA_WI@Z -@ stub -arch=win64 ?allocate@?$allocator@_W@std@@QEAAPEA_W_K@Z -@ stub -arch=win32 ?allocate@?$allocator@_W@std@@QAEPA_WIPBX@Z -@ stub -arch=win64 ?allocate@?$allocator@_W@std@@QEAAPEA_W_KPEBX@Z +@ cdecl -arch=win64 ?allocate@?$allocator@D@std@@QEAAPEAD_KPEBX@Z(ptr long ptr) MSVCP_allocator_char_allocate_hint +@ cdecl -arch=win32 -i386 -norelay ?allocate@?$allocator@G@std@@QAEPAGI@Z(long) __thiscall_MSVCP_allocator_short_allocate +@ cdecl -arch=win64 ?allocate@?$allocator@G@std@@QEAAPEAG_K@Z(ptr long) MSVCP_allocator_short_allocate +@ cdecl -arch=win32 -i386 -norelay ?allocate@?$allocator@G@std@@QAEPAGIPBX@Z(long ptr) __thiscall_MSVCP_allocator_short_allocate_hint +@ cdecl -arch=win64 ?allocate@?$allocator@G@std@@QEAAPEAG_KPEBX@Z(ptr long ptr) MSVCP_allocator_short_allocate_hint +@ cdecl -arch=win32 -i386 -norelay ?allocate@?$allocator@_W@std@@QAEPA_WI@Z(long) __thiscall_MSVCP_allocator_wchar_allocate +@ cdecl -arch=win64 ?allocate@?$allocator@_W@std@@QEAAPEA_W_K@Z(ptr long) MSVCP_allocator_wchar_allocate +@ cdecl -arch=win32 -i386 -norelay ?allocate@?$allocator@_W@std@@QAEPA_WIPBX@Z(long ptr) __thiscall_MSVCP_allocator_wchar_allocate_hint +@ cdecl -arch=win64 ?allocate@?$allocator@_W@std@@QEAAPEA_W_KPEBX@Z(ptr long ptr) MSVCP_allocator_wchar_allocate_hint @ stub -arch=win32 ?always_noconv@codecvt_base@std@@QBE_NXZ @ stub -arch=win64 ?always_noconv@codecvt_base@std@@QEBA_NXZ @ stub -arch=win32 ?append@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QAEAAV12@ABV12@@Z @@ -2958,17 +2958,17 @@ @ stub -arch=win64 ?append@?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QEAAAEAV12@V?$_String_const_iterator@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@2@0@Z @ stub -arch=win32 ?append@?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QAEAAV12@V?$_String_const_iterator@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@2@0@Z @ stub -arch=win64 ?append@?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QEAAAEAV12@_K_W@Z -@ stub -arch=win32 ?assign@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QAEAAV12@ABV12@@Z -@ stub -arch=win64 ?assign@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QEAAAEAV12@AEBV12@@Z -@ stub -arch=win32 ?assign@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QAEAAV12@ABV12@II@Z -@ stub -arch=win64 ?assign@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QEAAAEAV12@AEBV12@_K1@Z +@ cdecl -arch=win32 -i386 -norelay ?assign@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QAEAAV12@ABV12@@Z(ptr) __thiscall_MSVCP_basic_string_char_assign +@ cdecl -arch=win64 ?assign@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QEAAAEAV12@AEBV12@@Z(ptr ptr) MSVCP_basic_string_char_assign +@ cdecl -arch=win32 -i386 -norelay ?assign@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QAEAAV12@ABV12@II@Z(ptr long long) __thiscall_MSVCP_basic_string_char_assign_substr +@ cdecl -arch=win64 ?assign@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QEAAAEAV12@AEBV12@_K1@Z(ptr ptr long long) MSVCP_basic_string_char_assign_substr @ stub -arch=win32 ?assign@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QAEAAV12@ID@Z @ stub -arch=win64 ?assign@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QEAAAEAV12@PEBD0@Z @ stub -arch=win32 ?assign@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QAEAAV12@PBD0@Z -@ stub -arch=win64 ?assign@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QEAAAEAV12@PEBD@Z -@ stub -arch=win32 ?assign@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QAEAAV12@PBD@Z -@ stub -arch=win64 ?assign@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QEAAAEAV12@PEBD_K@Z -@ stub -arch=win32 ?assign@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QAEAAV12@PBDI@Z +@ cdecl -arch=win64 ?assign@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QEAAAEAV12@PEBD@Z(ptr str) MSVCP_basic_string_char_assign_cstr +@ cdecl -arch=win32 -i386 -norelay ?assign@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QAEAAV12@PBD@Z(str) __thiscall_MSVCP_basic_string_char_assign_cstr +@ cdecl -arch=win64 ?assign@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QEAAAEAV12@PEBD_K@Z(ptr ptr long) MSVCP_basic_string_char_assign_cstr_len +@ cdecl -arch=win32 -i386 -norelay ?assign@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QAEAAV12@PBDI@Z(ptr long) __thiscall_MSVCP_basic_string_char_assign_cstr_len @ stub -arch=win64 ?assign@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QEAAAEAV12@V?$_String_const_iterator@DU?$char_traits@D@std@@V?$allocator@D@2@@2@0@Z @ stub -arch=win32 ?assign@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QAEAAV12@V?$_String_const_iterator@DU?$char_traits@D@std@@V?$allocator@D@2@@2@0@Z @ stub -arch=win64 ?assign@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QEAAAEAV12@_KD@Z @@ -3001,17 +3001,17 @@ @ stub -arch=win32 ?assign@?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QAEAAV12@V?$_String_const_iterator@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@2@0@Z @ stub -arch=win64 ?assign@?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QEAAAEAV12@_K_W@Z @ cdecl -arch=win32 ?assign@?$char_traits@D@std@@SAPADPADID@Z(ptr long long) MSVCP_char_traits_char_assignn -@ stub -arch=win64 ?assign@?$char_traits@D@std@@SAPEADPEAD_KD@Z +@ cdecl -arch=win64 ?assign@?$char_traits@D@std@@SAPEADPEAD_KD@Z(ptr long long) MSVCP_char_traits_char_assignn @ cdecl -arch=win32 ?assign@?$char_traits@D@std@@SAXAADABD@Z(ptr ptr) MSVCP_char_traits_char_assign -@ stub -arch=win64 ?assign@?$char_traits@D@std@@SAXAEADAEBD@Z +@ cdecl -arch=win64 ?assign@?$char_traits@D@std@@SAXAEADAEBD@Z(ptr ptr) MSVCP_char_traits_char_assign @ cdecl -arch=win32 ?assign@?$char_traits@G@std@@SAPAGPAGIG@Z(ptr long long) MSVCP_char_traits_short_assignn -@ stub -arch=win64 ?assign@?$char_traits@G@std@@SAPEAGPEAG_KG@Z +@ cdecl -arch=win64 ?assign@?$char_traits@G@std@@SAPEAGPEAG_KG@Z(ptr long long) MSVCP_char_traits_short_assignn @ cdecl -arch=win32 ?assign@?$char_traits@G@std@@SAXAAGABG@Z(ptr ptr) MSVCP_char_traits_short_assign -@ stub -arch=win64 ?assign@?$char_traits@G@std@@SAXAEAGAEBG@Z +@ cdecl -arch=win64 ?assign@?$char_traits@G@std@@SAXAEAGAEBG@Z(ptr ptr) MSVCP_char_traits_short_assign @ cdecl -arch=win32 ?assign@?$char_traits@_W@std@@SAPA_WPA_WI_W@Z(ptr long long) MSVCP_char_traits_wchar_assignn -@ stub -arch=win64 ?assign@?$char_traits@_W@std@@SAPEA_WPEA_W_K_W@Z +@ cdecl -arch=win64 ?assign@?$char_traits@_W@std@@SAPEA_WPEA_W_K_W@Z(ptr long long) MSVCP_char_traits_wchar_assignn @ cdecl -arch=win32 ?assign@?$char_traits@_W@std@@SAXAA_WAB_W@Z(ptr ptr) MSVCP_char_traits_wchar_assign -@ stub -arch=win64 ?assign@?$char_traits@_W@std@@SAXAEA_WAEB_W@Z +@ cdecl -arch=win64 ?assign@?$char_traits@_W@std@@SAXAEA_WAEB_W@Z(ptr ptr) MSVCP_char_traits_wchar_assign @ stub -arch=win32 ?at@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QAEAADI@Z @ stub -arch=win64 ?at@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QEAAAEAD_K@Z @ stub -arch=win32 ?at@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QBEABDI@Z @@ -3041,8 +3041,8 @@ @ stub -arch=win64 ?begin@?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QEAA?AV?$_String_iterator@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@2@XZ @ stub -arch=win32 ?begin@?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QBE?AV?$_String_const_iterator@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@2@XZ @ stub -arch=win64 ?begin@?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QEBA?AV?$_String_const_iterator@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@2@XZ -@ stub -arch=win32 ?c_str@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QBEPBDXZ -@ stub -arch=win64 ?c_str@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QEBAPEBDXZ +@ cdecl -arch=win32 -i386 -norelay ?c_str@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QBEPBDXZ() __thiscall_MSVCP_basic_string_char_c_str +@ cdecl -arch=win64 ?c_str@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QEBAPEBDXZ(ptr) MSVCP_basic_string_char_c_str @ stub -arch=win32 ?c_str@?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QBEPBGXZ @ stub -arch=win64 ?c_str@?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QEBAPEBGXZ @ stub -arch=win32 ?c_str@?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QBEPB_WXZ @@ -3151,11 +3151,11 @@ @ stub -arch=win32 ?compare@?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QBEHPB_W@Z @ stub -arch=win64 ?compare@?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QEBAH_K0PEB_W@Z @ cdecl -arch=win32 ?compare@?$char_traits@D@std@@SAHPBD0I@Z(ptr ptr long) MSVCP_char_traits_char_compare -@ stub -arch=win64 ?compare@?$char_traits@D@std@@SAHPEBD0_K@Z +@ cdecl -arch=win64 ?compare@?$char_traits@D@std@@SAHPEBD0_K@Z(ptr ptr long) MSVCP_char_traits_char_compare @ cdecl -arch=win32 ?compare@?$char_traits@G@std@@SAHPBG0I@Z(ptr ptr long) MSVCP_char_traits_short_compare -@ stub -arch=win64 ?compare@?$char_traits@G@std@@SAHPEBG0_K@Z +@ cdecl -arch=win64 ?compare@?$char_traits@G@std@@SAHPEBG0_K@Z(ptr ptr long) MSVCP_char_traits_short_compare @ cdecl -arch=win32 ?compare@?$char_traits@_W@std@@SAHPB_W0I@Z(ptr ptr long) MSVCP_char_traits_wchar_compare -@ stub -arch=win64 ?compare@?$char_traits@_W@std@@SAHPEB_W0_K@Z +@ cdecl -arch=win64 ?compare@?$char_traits@_W@std@@SAHPEB_W0_K@Z(ptr ptr long) MSVCP_char_traits_wchar_compare @ stub -arch=win32 ?compare@?$collate@D@std@@QBEHPBD000@Z @ stub -arch=win64 ?compare@?$collate@D@std@@QEBAHPEBD000@Z @ stub -arch=win32 ?compare@?$collate@G@std@@QBEHPBG000@Z @@ -3163,11 +3163,11 @@ @ stub -arch=win32 ?compare@?$collate@_W@std@@QBEHPB_W000@Z @ stub -arch=win64 ?compare@?$collate@_W@std@@QEBAHPEB_W000@Z @ cdecl -arch=win32 -i386 -norelay ?construct@?$allocator@D@std@@QAEXPADABD@Z(ptr ptr) __thiscall_MSVCP_allocator_char_construct -@ stub -arch=win64 ?construct@?$allocator@D@std@@QEAAXPEADAEBD@Z -@ stub -arch=win32 ?construct@?$allocator@G@std@@QAEXPAGABG@Z -@ stub -arch=win64 ?construct@?$allocator@G@std@@QEAAXPEAGAEBG@Z -@ stub -arch=win32 ?construct@?$allocator@_W@std@@QAEXPA_WAB_W@Z -@ stub -arch=win64 ?construct@?$allocator@_W@std@@QEAAXPEA_WAEB_W@Z +@ cdecl -arch=win64 ?construct@?$allocator@D@std@@QEAAXPEADAEBD@Z(ptr ptr ptr) MSVCP_allocator_char_construct +@ cdecl -arch=win32 -i386 -norelay ?construct@?$allocator@G@std@@QAEXPAGABG@Z(ptr ptr) __thiscall_MSVCP_allocator_short_construct +@ cdecl -arch=win64 ?construct@?$allocator@G@std@@QEAAXPEAGAEBG@Z(ptr ptr ptr) MSVCP_allocator_short_construct +@ cdecl -arch=win32 -i386 -norelay ?construct@?$allocator@_W@std@@QAEXPA_WAB_W@Z(ptr ptr) __thiscall_MSVCP_allocator_wchar_construct +@ cdecl -arch=win64 ?construct@?$allocator@_W@std@@QEAAXPEA_WAEB_W@Z(ptr ptr ptr) MSVCP_allocator_wchar_construct @ stub -arch=win32 ?copy@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QBEIPADII@Z @ stub -arch=win64 ?copy@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QEBA_KPEAD_K1@Z @ stub -arch=win32 ?copy@?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QBEIPAGII@Z @@ -3175,11 +3175,11 @@ @ stub -arch=win32 ?copy@?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QBEIPA_WII@Z @ stub -arch=win64 ?copy@?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QEBA_KPEA_W_K1@Z @ cdecl -arch=win32 ?copy@?$char_traits@D@std@@SAPADPADPBDI@Z(ptr ptr long) MSVCP_char_traits_char_copy -@ stub -arch=win64 ?copy@?$char_traits@D@std@@SAPEADPEADPEBD_K@Z +@ cdecl -arch=win64 ?copy@?$char_traits@D@std@@SAPEADPEADPEBD_K@Z(ptr ptr long) MSVCP_char_traits_char_copy @ cdecl -arch=win32 ?copy@?$char_traits@G@std@@SAPAGPAGPBGI@Z(ptr ptr long) MSVCP_char_traits_short_copy -@ stub -arch=win64 ?copy@?$char_traits@G@std@@SAPEAGPEAGPEBG_K@Z +@ cdecl -arch=win64 ?copy@?$char_traits@G@std@@SAPEAGPEAGPEBG_K@Z(ptr ptr long) MSVCP_char_traits_short_copy @ cdecl -arch=win32 ?copy@?$char_traits@_W@std@@SAPA_WPA_WPB_WI@Z(ptr ptr long) MSVCP_char_traits_wchar_copy -@ stub -arch=win64 ?copy@?$char_traits@_W@std@@SAPEA_WPEA_WPEB_W_K@Z +@ cdecl -arch=win64 ?copy@?$char_traits@_W@std@@SAPEA_WPEA_WPEB_W_K@Z(ptr ptr long) MSVCP_char_traits_wchar_copy @ stub -arch=win32 ?copyfmt@?$basic_ios@DU?$char_traits@D@std@@@std@@QAEAAV12@ABV12@@Z @ stub -arch=win64 ?copyfmt@?$basic_ios@DU?$char_traits@D@std@@@std@@QEAAAEAV12@AEBV12@@Z @ stub -arch=win32 ?copyfmt@?$basic_ios@GU?$char_traits@G@std@@@std@@QAEAAV12@ABV12@@Z @@ -3211,11 +3211,11 @@ @ stub -arch=win32 ?date_order@?$time_get@_WV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@QBE?AW4dateorder@time_base@2@XZ @ stub -arch=win64 ?date_order@?$time_get@_WV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@QEBA?AW4dateorder@time_base@2@XZ @ cdecl -arch=win32 -i386 -norelay ?deallocate@?$allocator@D@std@@QAEXPADI@Z(ptr long) __thiscall_MSVCP_allocator_char_deallocate -@ stub -arch=win64 ?deallocate@?$allocator@D@std@@QEAAXPEAD_K@Z -@ stub -arch=win32 ?deallocate@?$allocator@G@std@@QAEXPAGI@Z -@ stub -arch=win64 ?deallocate@?$allocator@G@std@@QEAAXPEAG_K@Z -@ stub -arch=win32 ?deallocate@?$allocator@_W@std@@QAEXPA_WI@Z -@ stub -arch=win64 ?deallocate@?$allocator@_W@std@@QEAAXPEA_W_K@Z +@ cdecl -arch=win64 ?deallocate@?$allocator@D@std@@QEAAXPEAD_K@Z(ptr ptr long) MSVCP_allocator_char_deallocate +@ cdecl -arch=win32 -i386 -norelay ?deallocate@?$allocator@G@std@@QAEXPAGI@Z(ptr long) __thiscall_MSVCP_allocator_short_deallocate +@ cdecl -arch=win64 ?deallocate@?$allocator@G@std@@QEAAXPEAG_K@Z(ptr ptr long) MSVCP_allocator_short_deallocate +@ cdecl -arch=win32 -i386 -norelay ?deallocate@?$allocator@_W@std@@QAEXPA_WI@Z(ptr long) __thiscall_MSVCP_allocator_wchar_deallocate +@ cdecl -arch=win64 ?deallocate@?$allocator@_W@std@@QEAAXPEA_W_K@Z(ptr ptr long) MSVCP_allocator_wchar_deallocate @ stub -arch=win32 ?decimal_point@?$_Mpunct@D@std@@QBEDXZ @ stub -arch=win64 ?decimal_point@?$_Mpunct@D@std@@QEBADXZ @ stub -arch=win32 ?decimal_point@?$_Mpunct@G@std@@QBEGXZ @@ -3245,11 +3245,11 @@ @ stub ?denorm_min@?$numeric_limits@_N@std@@SA_NXZ @ stub ?denorm_min@?$numeric_limits@_W@std@@SA_WXZ @ cdecl -arch=win32 -i386 -norelay ?destroy@?$allocator@D@std@@QAEXPAD@Z(ptr) __thiscall_MSVCP_allocator_char_destroy -@ stub -arch=win64 ?destroy@?$allocator@D@std@@QEAAXPEAD@Z -@ stub -arch=win32 ?destroy@?$allocator@G@std@@QAEXPAG@Z -@ stub -arch=win64 ?destroy@?$allocator@G@std@@QEAAXPEAG@Z -@ stub -arch=win32 ?destroy@?$allocator@_W@std@@QAEXPA_W@Z -@ stub -arch=win64 ?destroy@?$allocator@_W@std@@QEAAXPEA_W@Z +@ cdecl -arch=win64 ?destroy@?$allocator@D@std@@QEAAXPEAD@Z(ptr ptr) MSVCP_allocator_char_destroy +@ cdecl -arch=win32 -i386 -norelay ?destroy@?$allocator@G@std@@QAEXPAG@Z(ptr) __thiscall_MSVCP_allocator_short_destroy +@ cdecl -arch=win64 ?destroy@?$allocator@G@std@@QEAAXPEAG@Z(ptr ptr) MSVCP_allocator_short_destroy +@ cdecl -arch=win32 -i386 -norelay ?destroy@?$allocator@_W@std@@QAEXPA_W@Z(ptr) __thiscall_MSVCP_allocator_wchar_destroy +@ cdecl -arch=win64 ?destroy@?$allocator@_W@std@@QEAAXPEA_W@Z(ptr ptr) MSVCP_allocator_wchar_destroy @ stub ?digits10@?$numeric_limits@C@std@@2HB @ stub ?digits10@?$numeric_limits@D@std@@2HB @ stub ?digits10@?$numeric_limits@E@std@@2HB @@ -3759,23 +3759,23 @@ @ stub ?epsilon@?$numeric_limits@_N@std@@SA_NXZ @ stub ?epsilon@?$numeric_limits@_W@std@@SA_WXZ @ cdecl -arch=win32 ?eq@?$char_traits@D@std@@SA_NABD0@Z(ptr ptr) MSVCP_char_traits_char_eq -@ stub -arch=win64 ?eq@?$char_traits@D@std@@SA_NAEBD0@Z +@ cdecl -arch=win64 ?eq@?$char_traits@D@std@@SA_NAEBD0@Z(ptr ptr) MSVCP_char_traits_char_eq @ cdecl -arch=win32 ?eq@?$char_traits@G@std@@SA_NABG0@Z(ptr ptr) MSVCP_char_traits_short_eq -@ stub -arch=win64 ?eq@?$char_traits@G@std@@SA_NAEBG0@Z +@ cdecl -arch=win64 ?eq@?$char_traits@G@std@@SA_NAEBG0@Z(ptr ptr) MSVCP_char_traits_short_eq @ cdecl -arch=win32 ?eq@?$char_traits@_W@std@@SA_NAB_W0@Z(ptr ptr) MSVCP_char_traits_wchar_eq -@ stub -arch=win64 ?eq@?$char_traits@_W@std@@SA_NAEB_W0@Z +@ cdecl -arch=win64 ?eq@?$char_traits@_W@std@@SA_NAEB_W0@Z(ptr ptr) MSVCP_char_traits_wchar_eq @ cdecl -arch=win32 ?eq_int_type@?$char_traits@D@std@@SA_NABH0@Z(ptr ptr) MSVCP_char_traits_char_eq_int_type -@ stub -arch=win64 ?eq_int_type@?$char_traits@D@std@@SA_NAEBH0@Z +@ cdecl -arch=win64 ?eq_int_type@?$char_traits@D@std@@SA_NAEBH0@Z(ptr ptr) MSVCP_char_traits_char_eq_int_type @ cdecl -arch=win32 ?eq_int_type@?$char_traits@G@std@@SA_NABG0@Z(ptr ptr) MSVCP_char_traits_short_eq_int_type -@ stub -arch=win64 ?eq_int_type@?$char_traits@G@std@@SA_NAEBG0@Z +@ cdecl -arch=win64 ?eq_int_type@?$char_traits@G@std@@SA_NAEBG0@Z(ptr ptr) MSVCP_char_traits_short_eq_int_type @ cdecl -arch=win32 ?eq_int_type@?$char_traits@_W@std@@SA_NABG0@Z(ptr ptr) MSVCP_char_traits_wchar_eq_int_tpe -@ stub -arch=win64 ?eq_int_type@?$char_traits@_W@std@@SA_NAEBG0@Z +@ cdecl -arch=win64 ?eq_int_type@?$char_traits@_W@std@@SA_NAEBG0@Z(ptr ptr) MSVCP_char_traits_wchar_eq_int_tpe @ stub -arch=win32 ?erase@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QAE?AV?$_String_iterator@DU?$char_traits@D@std@@V?$allocator@D@2@@2@V?$_String_const_iterator@DU?$char_traits@D@std@@V?$allocator@D@2@@2@0@Z @ stub -arch=win64 ?erase@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QEAA?AV?$_String_iterator@DU?$char_traits@D@std@@V?$allocator@D@2@@2@V?$_String_const_iterator@DU?$char_traits@D@std@@V?$allocator@D@2@@2@0@Z @ stub -arch=win32 ?erase@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QAE?AV?$_String_iterator@DU?$char_traits@D@std@@V?$allocator@D@2@@2@V?$_String_const_iterator@DU?$char_traits@D@std@@V?$allocator@D@2@@2@@Z @ stub -arch=win64 ?erase@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QEAA?AV?$_String_iterator@DU?$char_traits@D@std@@V?$allocator@D@2@@2@V?$_String_const_iterator@DU?$char_traits@D@std@@V?$allocator@D@2@@2@@Z -@ stub -arch=win32 ?erase@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QAEAAV12@II@Z -@ stub -arch=win64 ?erase@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QEAAAEAV12@_K0@Z +@ cdecl -arch=win32 -i386 -norelay ?erase@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QAEAAV12@II@Z(long long) __thiscall_MSVCP_basic_string_char_erase +@ cdecl -arch=win64 ?erase@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QEAAAEAV12@_K0@Z(ptr long long) MSVCP_basic_string_char_erase @ stub -arch=win32 ?erase@?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QAE?AV?$_String_iterator@GU?$char_traits@G@std@@V?$allocator@G@2@@2@V?$_String_const_iterator@GU?$char_traits@G@std@@V?$allocator@G@2@@2@0@Z @ stub -arch=win64 ?erase@?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QEAA?AV?$_String_iterator@GU?$char_traits@G@std@@V?$allocator@G@2@@2@V?$_String_const_iterator@GU?$char_traits@G@std@@V?$allocator@G@2@@2@0@Z @ stub -arch=win32 ?erase@?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QAE?AV?$_String_iterator@GU?$char_traits@G@std@@V?$allocator@G@2@@2@V?$_String_const_iterator@GU?$char_traits@G@std@@V?$allocator@G@2@@2@@Z @@ -3842,11 +3842,11 @@ @ stub -arch=win32 ?find@?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QBEI_WI@Z @ stub -arch=win64 ?find@?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QEBA_K_W_K@Z @ cdecl -arch=win32 ?find@?$char_traits@D@std@@SAPBDPBDIABD@Z(ptr long ptr) MSVCP_char_traits_char_find -@ stub -arch=win64 ?find@?$char_traits@D@std@@SAPEBDPEBD_KAEBD@Z +@ cdecl -arch=win64 ?find@?$char_traits@D@std@@SAPEBDPEBD_KAEBD@Z(ptr long ptr) MSVCP_char_traits_char_find @ cdecl -arch=win32 ?find@?$char_traits@G@std@@SAPBGPBGIABG@Z(ptr long ptr) MSVCP_char_traits_short_find -@ stub -arch=win64 ?find@?$char_traits@G@std@@SAPEBGPEBG_KAEBG@Z +@ cdecl -arch=win64 ?find@?$char_traits@G@std@@SAPEBGPEBG_KAEBG@Z(ptr long ptr) MSVCP_char_traits_short_find @ cdecl -arch=win32 ?find@?$char_traits@_W@std@@SAPB_WPB_WIAB_W@Z(ptr long ptr) MSVCP_char_traits_wchar_find -@ stub -arch=win64 ?find@?$char_traits@_W@std@@SAPEB_WPEB_W_KAEB_W@Z +@ cdecl -arch=win64 ?find@?$char_traits@_W@std@@SAPEB_WPEB_W_KAEB_W@Z(ptr long ptr) MSVCP_char_traits_wchar_find @ stub -arch=win32 ?find_first_not_of@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QBEIABV12@I@Z @ stub -arch=win64 ?find_first_not_of@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QEBA_KAEBV12@_K@Z @ stub -arch=win32 ?find_first_not_of@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QBEIDI@Z @@ -4463,11 +4463,11 @@ @ stub -arch=win32 ?length@?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QBEIXZ @ stub -arch=win64 ?length@?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QEBA_KXZ @ cdecl -arch=win32 ?length@?$char_traits@D@std@@SAIPBD@Z(ptr) MSVCP_char_traits_char_length -@ stub -arch=win64 ?length@?$char_traits@D@std@@SA_KPEBD@Z +@ cdecl -arch=win64 ?length@?$char_traits@D@std@@SA_KPEBD@Z(ptr) MSVCP_char_traits_char_length @ cdecl -arch=win32 ?length@?$char_traits@G@std@@SAIPBG@Z(ptr) MSVCP_char_traits_short_length -@ stub -arch=win64 ?length@?$char_traits@G@std@@SA_KPEBG@Z +@ cdecl -arch=win64 ?length@?$char_traits@G@std@@SA_KPEBG@Z(ptr) MSVCP_char_traits_short_length @ cdecl -arch=win32 ?length@?$char_traits@_W@std@@SAIPB_W@Z(ptr) MSVCP_char_traits_wchar_length -@ stub -arch=win64 ?length@?$char_traits@_W@std@@SA_KPEB_W@Z +@ cdecl -arch=win64 ?length@?$char_traits@_W@std@@SA_KPEB_W@Z(ptr) MSVCP_char_traits_wchar_length @ stub -arch=win32 ?length@?$codecvt@DDH@std@@QBEHABHPBD1I@Z @ stub -arch=win64 ?length@?$codecvt@DDH@std@@QEBAHAEBHPEBD1_K@Z @ stub -arch=win32 ?length@?$codecvt@GDH@std@@QBEHABHPBD1I@Z @@ -4478,11 +4478,11 @@ @ stub ?log@?$_Ctraits@N@std@@SANN@Z @ stub ?log@?$_Ctraits@O@std@@SAOO@Z @ cdecl -arch=win32 ?lt@?$char_traits@D@std@@SA_NABD0@Z(ptr ptr) MSVCP_char_traits_lt -@ stub -arch=win64 ?lt@?$char_traits@D@std@@SA_NAEBD0@Z +@ cdecl -arch=win64 ?lt@?$char_traits@D@std@@SA_NAEBD0@Z(ptr ptr) MSVCP_char_traits_lt @ cdecl -arch=win32 ?lt@?$char_traits@G@std@@SA_NABG0@Z(ptr ptr) MSVCP_char_traits_short_lt -@ stub -arch=win64 ?lt@?$char_traits@G@std@@SA_NAEBG0@Z +@ cdecl -arch=win64 ?lt@?$char_traits@G@std@@SA_NAEBG0@Z(ptr ptr) MSVCP_char_traits_short_lt @ cdecl -arch=win32 ?lt@?$char_traits@_W@std@@SA_NAB_W0@Z(ptr ptr) MSVCP_char_traits_wchar_lt -@ stub -arch=win64 ?lt@?$char_traits@_W@std@@SA_NAEB_W0@Z +@ cdecl -arch=win64 ?lt@?$char_traits@_W@std@@SA_NAEB_W0@Z(ptr ptr) MSVCP_char_traits_wchar_lt @ stub ?max@?$numeric_limits@C@std@@SACXZ @ stub ?max@?$numeric_limits@D@std@@SADXZ @ stub ?max@?$numeric_limits@E@std@@SAEXZ @@ -4510,11 +4510,11 @@ @ stub -arch=win32 ?max_length@codecvt_base@std@@QBEHXZ @ stub -arch=win64 ?max_length@codecvt_base@std@@QEBAHXZ @ cdecl -arch=win32 -i386 -norelay ?max_size@?$allocator@D@std@@QBEIXZ() __thiscall_MSVCP_allocator_char_max_size -@ stub -arch=win64 ?max_size@?$allocator@D@std@@QEBA_KXZ -@ stub -arch=win32 ?max_size@?$allocator@G@std@@QBEIXZ -@ stub -arch=win64 ?max_size@?$allocator@G@std@@QEBA_KXZ -@ stub -arch=win32 ?max_size@?$allocator@_W@std@@QBEIXZ -@ stub -arch=win64 ?max_size@?$allocator@_W@std@@QEBA_KXZ +@ cdecl -arch=win64 ?max_size@?$allocator@D@std@@QEBA_KXZ(ptr) MSVCP_allocator_char_max_size +@ cdecl -arch=win32 -i386 -norelay ?max_size@?$allocator@G@std@@QBEIXZ() __thiscall_MSVCP_allocator_short_max_size +@ cdecl -arch=win64 ?max_size@?$allocator@G@std@@QEBA_KXZ(ptr) MSVCP_allocator_short_max_size +@ cdecl -arch=win32 -i386 -norelay ?max_size@?$allocator@_W@std@@QBEIXZ() __thiscall_MSVCP_allocator_wchar_max_size +@ cdecl -arch=win64 ?max_size@?$allocator@_W@std@@QEBA_KXZ(ptr) MSVCP_allocator_wchar_max_size @ stub -arch=win32 ?max_size@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QBEIXZ @ stub -arch=win64 ?max_size@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QEBA_KXZ @ stub -arch=win32 ?max_size@?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QBEIXZ @@ -4546,11 +4546,11 @@ @ stub ?min_exponent@?$numeric_limits@O@std@@2HB @ stub ?min_exponent@_Num_base@std@@2HB @ cdecl -arch=win32 ?move@?$char_traits@D@std@@SAPADPADPBDI@Z(ptr ptr long) MSVCP_char_traits_char_move -@ stub -arch=win64 ?move@?$char_traits@D@std@@SAPEADPEADPEBD_K@Z +@ cdecl -arch=win64 ?move@?$char_traits@D@std@@SAPEADPEADPEBD_K@Z(ptr ptr long) MSVCP_char_traits_char_move @ cdecl -arch=win32 ?move@?$char_traits@G@std@@SAPAGPAGPBGI@Z(ptr ptr long) MSVCP_char_traits_short_move -@ stub -arch=win64 ?move@?$char_traits@G@std@@SAPEAGPEAGPEBG_K@Z +@ cdecl -arch=win64 ?move@?$char_traits@G@std@@SAPEAGPEAGPEBG_K@Z(ptr ptr long) MSVCP_char_traits_short_move @ cdecl -arch=win32 ?move@?$char_traits@_W@std@@SAPA_WPA_WPB_WI@Z(ptr ptr long) MSVCP_char_traits_wchar_move -@ stub -arch=win64 ?move@?$char_traits@_W@std@@SAPEA_WPEA_WPEB_W_K@Z +@ cdecl -arch=win64 ?move@?$char_traits@_W@std@@SAPEA_WPEA_WPEB_W_K@Z(ptr ptr long) MSVCP_char_traits_wchar_move @ stub -arch=win32 ?name@locale@std@@QBE?AV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@2@XZ @ stub -arch=win64 ?name@locale@std@@QEBA?AV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@2@XZ @ stub -arch=win32 ?narrow@?$basic_ios@DU?$char_traits@D@std@@@std@@QBEDDD@Z @@ -4584,12 +4584,12 @@ @ stub -arch=win32 ?negative_sign@?$_Mpunct@_W@std@@QBE?AV?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@2@XZ @ stub -arch=win64 ?negative_sign@?$_Mpunct@_W@std@@QEBA?AV?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@2@XZ @ cdecl -arch=win32 ?not_eof@?$char_traits@D@std@@SAHABH@Z(ptr) MSVCP_char_traits_char_not_eof -@ stub -arch=win64 ?not_eof@?$char_traits@D@std@@SAHAEBH@Z +@ cdecl -arch=win64 ?not_eof@?$char_traits@D@std@@SAHAEBH@Z(ptr) MSVCP_char_traits_char_not_eof @ cdecl -arch=win32 ?not_eof@?$char_traits@G@std@@SAGABG@Z(ptr) MSVCP_char_traits_short_not_eof -@ stub -arch=win64 ?not_eof@?$char_traits@G@std@@SAGAEBG@Z +@ cdecl -arch=win64 ?not_eof@?$char_traits@G@std@@SAGAEBG@Z(ptr) MSVCP_char_traits_short_not_eof @ cdecl -arch=win32 ?not_eof@?$char_traits@_W@std@@SAGABG@Z(ptr) MSVCP_char_traits_wchar_not_eof -@ stub -arch=win64 ?not_eof@?$char_traits@_W@std@@SAGAEBG@Z -@ stub -arch=win32 ?npos@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@2IB +@ cdecl -arch=win64 ?not_eof@?$char_traits@_W@std@@SAGAEBG@Z(ptr) MSVCP_char_traits_wchar_not_eof +@ extern -arch=win32 ?npos@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@2IB MSVCP_basic_string_char_npos @ stub -arch=win64 ?npos@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@2_KB @ stub -arch=win32 ?npos@?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@2IB @ stub -arch=win64 ?npos@?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@2_KB @@ -5579,17 +5579,17 @@ @ stub ?tinyness_before@_Num_base@std@@2_NB @ stub ?tinyness_before@_Num_float_base@std@@2_NB @ cdecl -arch=win32 ?to_char_type@?$char_traits@D@std@@SADABH@Z(ptr) MSVCP_char_traits_char_to_char_type -@ stub -arch=win64 ?to_char_type@?$char_traits@D@std@@SADAEBH@Z +@ cdecl -arch=win64 ?to_char_type@?$char_traits@D@std@@SADAEBH@Z(ptr) MSVCP_char_traits_char_to_char_type @ cdecl -arch=win32 ?to_char_type@?$char_traits@G@std@@SAGABG@Z(ptr) MSVCP_char_traits_short_to_char_type -@ stub -arch=win64 ?to_char_type@?$char_traits@G@std@@SAGAEBG@Z +@ cdecl -arch=win64 ?to_char_type@?$char_traits@G@std@@SAGAEBG@Z(ptr) MSVCP_char_traits_short_to_char_type @ cdecl -arch=win32 ?to_char_type@?$char_traits@_W@std@@SA_WABG@Z(ptr) MSVCP_char_traits_wchar_to_char_type -@ stub -arch=win64 ?to_char_type@?$char_traits@_W@std@@SA_WAEBG@Z +@ cdecl -arch=win64 ?to_char_type@?$char_traits@_W@std@@SA_WAEBG@Z(ptr) MSVCP_char_traits_wchar_to_char_type @ cdecl -arch=win32 ?to_int_type@?$char_traits@D@std@@SAHABD@Z(ptr) MSVCP_char_traits_char_to_int_type -@ stub -arch=win64 ?to_int_type@?$char_traits@D@std@@SAHAEBD@Z +@ cdecl -arch=win64 ?to_int_type@?$char_traits@D@std@@SAHAEBD@Z(ptr) MSVCP_char_traits_char_to_int_type @ cdecl -arch=win32 ?to_int_type@?$char_traits@G@std@@SAGABG@Z(ptr) MSVCP_char_traits_short_to_int_type -@ stub -arch=win64 ?to_int_type@?$char_traits@G@std@@SAGAEBG@Z +@ cdecl -arch=win64 ?to_int_type@?$char_traits@G@std@@SAGAEBG@Z(ptr) MSVCP_char_traits_short_to_int_type @ cdecl -arch=win32 ?to_int_type@?$char_traits@_W@std@@SAGAB_W@Z(ptr) MSVCP_char_traits_wchar_to_int_type -@ stub -arch=win64 ?to_int_type@?$char_traits@_W@std@@SAGAEB_W@Z +@ cdecl -arch=win64 ?to_int_type@?$char_traits@_W@std@@SAGAEB_W@Z(ptr) MSVCP_char_traits_wchar_to_int_type @ stub -arch=win32 ?tolower@?$ctype@D@std@@QBEDD@Z @ stub -arch=win64 ?tolower@?$ctype@D@std@@QEBADD@Z @ stub -arch=win32 ?tolower@?$ctype@D@std@@QBEPBDPADPBD@Z diff -Nru wine1.3-1.3.0/dlls/msvcp90/string.c wine1.3-1.3.1/dlls/msvcp90/string.c --- wine1.3-1.3.0/dlls/msvcp90/string.c 2010-07-30 18:43:56.000000000 +0100 +++ wine1.3-1.3.1/dlls/msvcp90/string.c 2010-08-20 18:23:50.000000000 +0100 @@ -16,6 +16,8 @@ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */ +#include "config.h" + #include #include "msvcp90.h" @@ -28,40 +30,46 @@ /* char_traits */ /* ?assign@?$char_traits@D@std@@SAXAADABD@Z */ +/* ?assign@?$char_traits@D@std@@SAXAEADAEBD@Z */ void CDECL MSVCP_char_traits_char_assign(char *ch, const char *assign) { *ch = *assign; } /* ?eq@?$char_traits@D@std@@SA_NABD0@Z */ +/* ?eq@?$char_traits@D@std@@SA_NAEBD0@Z */ MSVCP_BOOL CDECL MSVCP_char_traits_char_eq(const char *ch1, const char *ch2) { return *ch1 == *ch2; } /* ?lt@?$char_traits@D@std@@SA_NABD0@Z */ +/* ?lt@?$char_traits@D@std@@SA_NAEBD0@Z */ MSVCP_BOOL CDECL MSVCP_char_traits_lt(const char *ch1, const char *ch2) { return *ch1 < *ch2; } -/*?compare@?$char_traits@D@std@@SAHPBD0I@Z */ +/* ?compare@?$char_traits@D@std@@SAHPBD0I@Z */ +/* ?compare@?$char_traits@D@std@@SAHPEBD0_K@Z */ int CDECL MSVCP_char_traits_char_compare( - const char *s1, const char *s2, unsigned int count) + const char *s1, const char *s2, size_t count) { int ret = memcmp(s1, s2, count); return (ret>0 ? 1 : (ret<0 ? -1 : 0)); } /* ?length@?$char_traits@D@std@@SAIPBD@Z */ -int CDECL MSVCP_char_traits_char_length(const char *str) +/* ?length@?$char_traits@D@std@@SA_KPEBD@Z */ +size_t CDECL MSVCP_char_traits_char_length(const char *str) { return strlen(str); } /* ?_Copy_s@?$char_traits@D@std@@SAPADPADIPBDI@Z */ +/* ?_Copy_s@?$char_traits@D@std@@SAPEADPEAD_KPEBD1@Z */ char* CDECL MSVCP_char_traits_char__Copy_s(char *dest, - unsigned int size, const char *src, unsigned int count) + size_t size, const char *src, size_t count) { if(!dest || !src || size */ /* ?assign@?$char_traits@_W@std@@SAXAA_WAB_W@Z */ +/* ?assign@?$char_traits@_W@std@@SAXAEA_WAEB_W@Z */ void CDECL MSVCP_char_traits_wchar_assign(wchar_t *ch, const wchar_t *assign) { @@ -154,12 +172,14 @@ } /* ?eq@?$char_traits@_W@std@@SA_NAB_W0@Z */ +/* ?eq@?$char_traits@_W@std@@SA_NAEB_W0@Z */ MSVCP_BOOL CDECL MSVCP_char_traits_wchar_eq(wchar_t *ch1, wchar_t *ch2) { return *ch1 == *ch2; } /* ?lt@?$char_traits@_W@std@@SA_NAB_W0@Z */ +/* ?lt@?$char_traits@_W@std@@SA_NAEB_W0@Z */ MSVCP_BOOL CDECL MSVCP_char_traits_wchar_lt(const wchar_t *ch1, const wchar_t *ch2) { @@ -167,22 +187,25 @@ } /* ?compare@?$char_traits@_W@std@@SAHPB_W0I@Z */ +/* ?compare@?$char_traits@_W@std@@SAHPEB_W0_K@Z */ int CDECL MSVCP_char_traits_wchar_compare(const wchar_t *s1, - const wchar_t *s2, unsigned int count) + const wchar_t *s2, size_t count) { int ret = memcmp(s1, s2, sizeof(wchar_t[count])); return (ret>0 ? 1 : (ret<0 ? -1 : 0)); } /* ?length@?$char_traits@_W@std@@SAIPB_W@Z */ -int CDECL MSVCP_char_traits_wchar_length(const wchar_t *str) +/* ?length@?$char_traits@_W@std@@SA_KPEB_W@Z */ +size_t CDECL MSVCP_char_traits_wchar_length(const wchar_t *str) { return wcslen((WCHAR*)str); } /* ?_Copy_s@?$char_traits@_W@std@@SAPA_WPA_WIPB_WI@Z */ +/* ?_Copy_s@?$char_traits@_W@std@@SAPEA_WPEA_W_KPEB_W1@Z */ wchar_t* CDECL MSVCP_char_traits_wchar__Copy_s(wchar_t *dest, - unsigned int size, const wchar_t *src, unsigned int count) + size_t size, const wchar_t *src, size_t count) { if(!dest || !src || size */ /* ?assign@?$char_traits@G@std@@SAXAAGABG@Z */ +/* ?assign@?$char_traits@G@std@@SAXAEAGAEBG@Z */ void CDECL MSVCP_char_traits_short_assign(unsigned short *ch, const unsigned short *assign) { @@ -288,6 +321,7 @@ } /* ?eq@?$char_traits@G@std@@SA_NABG0@Z */ +/* ?eq@?$char_traits@G@std@@SA_NAEBG0@Z */ MSVCP_BOOL CDECL MSVCP_char_traits_short_eq(const unsigned short *ch1, const unsigned short *ch2) { @@ -295,6 +329,7 @@ } /* ?lt@?$char_traits@G@std@@SA_NABG0@Z */ +/* ?lt@?$char_traits@G@std@@SA_NAEBG0@Z */ MSVCP_BOOL CDECL MSVCP_char_traits_short_lt(const unsigned short *ch1, const unsigned short *ch2) { @@ -302,10 +337,11 @@ } /* ?compare@?$char_traits@G@std@@SAHPBG0I@Z */ +/* ?compare@?$char_traits@G@std@@SAHPEBG0_K@Z */ int CDECL MSVCP_char_traits_short_compare(const unsigned short *s1, - const unsigned short *s2, unsigned int count) + const unsigned short *s2, size_t count) { - unsigned int i; + size_t i; for(i=0; i, allocator> */ +/* ?npos@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@2IB */ +const size_t MSVCP_basic_string_char_npos = -1; + +/* Internal: basic_string_char_ptr - return pointer to stored string */ +static char* basic_string_char_ptr(basic_string_char *this) +{ + if(this->res == BUF_SIZE_CHAR-1) + return this->data.buf; + return this->data.ptr; +} + +/* Internal: basic_string_char_const_ptr - returns const pointer to stored string */ +static const char* basic_string_char_const_ptr(const basic_string_char *this) +{ + if(this->res == BUF_SIZE_CHAR-1) + return this->data.buf; + return this->data.ptr; +} + +/* Internal: basic_string_char_eos - sets string length, puts '\0' on the end */ +static void basic_string_char_eos(basic_string_char *this, size_t len) +{ + static const char nullbyte = '\0'; + + this->size = len; + MSVCP_char_traits_char_assign(basic_string_char_ptr(this)+len, &nullbyte); +} + +/* Internal: basic_string_char_inside - checks if given pointer points inside stored string */ +static MSVCP_BOOL basic_string_char_inside( + basic_string_char *this, const char *ptr) +{ + char *cstr = basic_string_char_ptr(this); + + return (ptr=cstr+this->size) ? FALSE : TRUE; +} + +/* Internal: basic_string_char_tidy - initialize basic_string buffer, deallocates data */ +/* Caution: new_size have to be smaller than BUF_SIZE_CHAR */ +static void basic_string_char_tidy(basic_string_char *this, + MSVCP_BOOL built, int new_size) +{ + if(built && BUF_SIZE_CHAR<=this->res) { + char *ptr = this->data.ptr; + + if(new_size > 0) + MSVCP_char_traits_char__Copy_s(this->data.buf, BUF_SIZE_CHAR, ptr, new_size); + MSVCP_allocator_char_deallocate(this->allocator, ptr, this->res+1); + } + + this->res = BUF_SIZE_CHAR-1; + basic_string_char_eos(this, new_size); +} + +/* Internal: basic_string_char_grow - changes size of internal buffer */ +static MSVCP_BOOL basic_string_char_grow( + basic_string_char *this, size_t new_size, MSVCP_BOOL trim) +{ + if(this->res < new_size) { + size_t new_res = new_size; + char *ptr; + + new_res |= 0xf; + + if(new_res/3 < this->res/2) + new_res = this->res + this->res/2; + + ptr = MSVCP_allocator_char_allocate(this->allocator, new_res); + if(!ptr) + ptr = MSVCP_allocator_char_allocate(this->allocator, new_size+1); + else + new_size = new_res; + if(!ptr) { + ERR("Out of memory\n"); + basic_string_char_tidy(this, TRUE, 0); + return FALSE; + } + + MSVCP_char_traits_char__Copy_s(ptr, new_size, + basic_string_char_ptr(this), this->size); + basic_string_char_tidy(this, TRUE, 0); + this->data.ptr = ptr; + this->res = new_size; + basic_string_char_eos(this, this->size); + } else if(trim && new_size < BUF_SIZE_CHAR) + basic_string_char_tidy(this, TRUE, + new_sizesize ? new_size : this->size); + else if(new_size == 0) + basic_string_char_eos(this, 0); + + return (new_size>0); +} + +/* ?erase@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QAEAAV12@II@Z */ +/* ?erase@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QEAAAEAV12@_K0@Z */ +DEFINE_THISCALL_WRAPPER(MSVCP_basic_string_char_erase, 12) +basic_string_char* __stdcall MSVCP_basic_string_char_erase( + basic_string_char *this, size_t pos, size_t len) +{ + TRACE("%p %d %d\n", this, pos, len); + + if(pos > this->size) { + MSVCP__String_base_Xran(); + return NULL; + } + + if(len > this->size-pos) + len = this->size-pos; + + if(len) { + MSVCP_char_traits_char__Move_s(basic_string_char_ptr(this)+pos, + this->res-pos, basic_string_char_ptr(this)+pos+len, + this->size-pos-len); + basic_string_char_eos(this, this->size-len); + } + + return this; +} + +/* ?assign@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QAEAAV12@ABV12@II@Z */ +/* ?assign@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QEAAAEAV12@AEBV12@_K1@Z */ +DEFINE_THISCALL_WRAPPER(MSVCP_basic_string_char_assign_substr, 16) +basic_string_char* __stdcall MSVCP_basic_string_char_assign_substr( + basic_string_char *this, const basic_string_char *assign, + size_t pos, size_t len) +{ + TRACE("%p %p %d %d\n", this, assign, pos, len); + + if(assign->size < pos) { + MSVCP__String_base_Xran(); + return NULL; + } + + if(len > assign->size-pos) + len = assign->size-pos; + + if(this == assign) { + MSVCP_basic_string_char_erase(this, pos+len, MSVCP_basic_string_char_npos); + MSVCP_basic_string_char_erase(this, 0, pos); + } else if(basic_string_char_grow(this, len, FALSE)) { + MSVCP_char_traits_char__Copy_s(basic_string_char_ptr(this), + this->res, basic_string_char_const_ptr(assign)+pos, len); + basic_string_char_eos(this, len); + } + + return this; +} + +/* ?assign@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QAEAAV12@ABV12@@Z */ +/* ?assign@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QEAAAEAV12@AEBV12@@Z */ +DEFINE_THISCALL_WRAPPER(MSVCP_basic_string_char_assign, 8) +basic_string_char* __stdcall MSVCP_basic_string_char_assign( + basic_string_char *this, const basic_string_char *assign) +{ + return MSVCP_basic_string_char_assign_substr(this, assign, + 0, MSVCP_basic_string_char_npos); +} + +/* ?assign@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QAEAAV12@PBDI@Z */ +/* ?assign@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QEAAAEAV12@PEBD_K@Z */ +DEFINE_THISCALL_WRAPPER(MSVCP_basic_string_char_assign_cstr_len, 12) +basic_string_char* __stdcall MSVCP_basic_string_char_assign_cstr_len( + basic_string_char *this, const char *str, size_t len) +{ + TRACE("%p %s %d\n", this, debugstr_a(str), len); + + if(basic_string_char_inside(this, str)) + return MSVCP_basic_string_char_assign_substr(this, this, + str-basic_string_char_ptr(this), len); + else if(basic_string_char_grow(this, len, FALSE)) { + MSVCP_char_traits_char__Copy_s(basic_string_char_ptr(this), + this->res, str, len); + basic_string_char_eos(this, len); + } + + return this; +} + +/* ?assign@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QAEAAV12@PBD@Z */ +/* ?assign@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QEAAAEAV12@PEBD@Z */ +DEFINE_THISCALL_WRAPPER(MSVCP_basic_string_char_assign_cstr, 8) +basic_string_char* __stdcall MSVCP_basic_string_char_assign_cstr( + basic_string_char *this, const char *str) +{ + return MSVCP_basic_string_char_assign_cstr_len(this, str, + MSVCP_char_traits_char_length(str)); +} + +/* ?c_str@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QBEPBDXZ */ +/* ?c_str@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QEBAPEBDXZ */ +DEFINE_THISCALL_WRAPPER(MSVCP_basic_string_char_c_str, 4) +const char* __stdcall MSVCP_basic_string_char_c_str(basic_string_char *this) +{ + TRACE("%p\n", this); + return basic_string_char_const_ptr(this); +} + +/* ??0?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QAE@XZ */ +/* ??0?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QEAA@XZ */ +DEFINE_THISCALL_WRAPPER(MSVCP_basic_string_char_ctor, 4) +basic_string_char* __stdcall MSVCP_basic_string_char_ctor(basic_string_char *this) +{ + TRACE("%p\n", this); + + basic_string_char_tidy(this, FALSE, 0); + return this; +} + +/* ??0?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QAE@ABV01@@Z */ +/* ??0?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QEAA@AEBV01@@Z */ +DEFINE_THISCALL_WRAPPER(MSVCP_basic_string_char_copy_ctor, 8) +basic_string_char* __stdcall MSVCP_basic_string_char_copy_ctor( + basic_string_char *this, const basic_string_char *copy) +{ + TRACE("%p %p\n", this, copy); + + basic_string_char_tidy(this, FALSE, 0); + MSVCP_basic_string_char_assign(this, copy); + return this; +} + +/* ??0?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QAE@PBD@Z */ +/* ??0?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QEAA@PEBD@Z */ +DEFINE_THISCALL_WRAPPER(MSVCP_basic_string_char_ctor_cstr, 8) +basic_string_char* __stdcall MSVCP_basic_string_char_ctor_cstr( + basic_string_char *this, const char *str) +{ + TRACE("%p %s\n", this, debugstr_a(str)); + + basic_string_char_tidy(this, FALSE, 0); + MSVCP_basic_string_char_assign_cstr(this, str); + return this; +} + +/* ??1?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QAE@XZ */ +/* ??1?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QEAA@XZ */ +DEFINE_THISCALL_WRAPPER(MSVCP_basic_string_char_dtor, 4) +void __stdcall MSVCP_basic_string_char_dtor(basic_string_char *this) +{ + TRACE("%p\n", this); + basic_string_char_tidy(this, TRUE, 0); +} diff -Nru wine1.3-1.3.0/dlls/msvcp90/tests/misc.c wine1.3-1.3.1/dlls/msvcp90/tests/misc.c --- wine1.3-1.3.0/dlls/msvcp90/tests/misc.c 2010-07-30 18:43:56.000000000 +0100 +++ wine1.3-1.3.1/dlls/msvcp90/tests/misc.c 2010-08-20 18:23:50.000000000 +0100 @@ -32,7 +32,23 @@ static BYTE (__cdecl *p_wchar_eq)(const void*, const void*); static BYTE (__cdecl *p_short_eq)(const void*, const void*); -static char* (__cdecl *p_Copy_s)(char*, unsigned int, const char*, unsigned int); +static char* (__cdecl *p_Copy_s)(char*, size_t, const char*, size_t); + +#ifdef __i386__ +static char* (WINAPI *p_char_address)(char*); +static void* (WINAPI *p_char_ctor)(void); +static void (WINAPI *p_char_deallocate)(char*, size_t); +static char* (WINAPI *p_char_allocate)(size_t); +static void (WINAPI *p_char_construct)(char*, const char*); +static size_t (WINAPI *p_char_max_size)(void); +#else +static char* (__cdecl *p_char_address)(void*, char*); +static void* (__cdecl *p_char_ctor)(void*); +static void (__cdecl *p_char_deallocate)(void*, char*, size_t); +static char* (__cdecl *p_char_allocate)(void*, size_t); +static void (__cdecl *p_char_construct)(void*, char*, const char*); +static size_t (__cdecl *p_char_max_size)(void*); +#endif static int invalid_parameter = 0; static void __cdecl test_invalid_parameter_handler(const wchar_t *expression, @@ -47,6 +63,105 @@ invalid_parameter++; } +/* Emulate a __thiscall */ +#ifdef __i386__ +#ifdef _MSC_VER +static inline void* do_call_func1(void *func, void *_this) +{ + volatile void* retval = 0; + __asm + { + push ecx + mov ecx, _this + call func + mov retval, eax + pop ecx + } + return (void*)retval; +} + +static inline void* do_call_func2(void *func, void *_this, const void *arg) +{ + volatile void* retval = 0; + __asm + { + push ecx + push arg + mov ecx, _this + call func + mov retval, eax + pop ecx + } + return (void*)retval; +} + +static inline void* do_call_func3(void *func, void *_this, + const void *arg1, const void *arg2) +{ + volatile void* retval = 0; + __asm + { + push ecx + push arg1 + push arg2 + mov ecx, _this + call func + mov retval, eax + pop ecx + } + return (void*)retval; +} +#else +static void* do_call_func1(void *func, void *_this) +{ + void *ret, *dummy; + __asm__ __volatile__ ( + "call *%2" + : "=a" (ret), "=c" (dummy) + : "g" (func), "1" (_this) + : "edx", "memory" + ); + return ret; +} + +static void* do_call_func2(void *func, void *_this, const void *arg) +{ + void *ret, *dummy; + __asm__ __volatile__ ( + "pushl %3\n\tcall *%2" + : "=a" (ret), "=c" (dummy) + : "r" (func), "r" (arg), "1" (_this) + : "edx", "memory" + ); + return ret; +} + +static void* do_call_func3(void *func, void *_this, + const void *arg1, const void *arg2) +{ + void *ret, *dummy; + __asm__ __volatile__ ( + "pushl %4\n\tpushl %3\n\tcall *%2" + : "=a" (ret), "=c" (dummy) + : "r" (func), "r" (arg1), "r" (arg2), "1" (_this) + : "edx", "memory" + ); + return ret; +} +#endif + +#define call_func1(func,_this) do_call_func1(func,_this) +#define call_func2(func,_this,a) do_call_func2(func,_this,(const void*)a) +#define call_func3(func,_this,a,b) do_call_func3(func,_this,(const void*)a,(const void*)b) + +#else + +#define call_func1(func,_this) func(_this) +#define call_func2(func,_this,a) func(_this,a) +#define call_func3(func,_this,a,b) func(_this,a,b) + +#endif /* __i386__ */ + static BOOL init(void) { HMODULE msvcr = LoadLibraryA("msvcr90.dll"); @@ -64,15 +179,41 @@ p_set_invalid_parameter_handler(test_invalid_parameter_handler); - p_char_assign = (void*)GetProcAddress(msvcp, "?assign@?$char_traits@D@std@@SAXAADABD@Z"); - p_wchar_assign = (void*)GetProcAddress(msvcp, "?assign@?$char_traits@_W@std@@SAXAA_WAB_W@Z"); - p_short_assign = (void*)GetProcAddress(msvcp, "?assign@?$char_traits@G@std@@SAXAAGABG@Z"); - - p_char_eq = (void*)GetProcAddress(msvcp, "?eq@?$char_traits@D@std@@SA_NABD0@Z"); - p_wchar_eq = (void*)GetProcAddress(msvcp, "?eq@?$char_traits@_W@std@@SA_NAB_W0@Z"); - p_short_eq = (void*)GetProcAddress(msvcp, "?eq@?$char_traits@G@std@@SA_NABG0@Z"); - - p_Copy_s = (void*)GetProcAddress(msvcp, "?_Copy_s@?$char_traits@D@std@@SAPADPADIPBDI@Z"); + if(sizeof(void*) == 8) { /* 64-bit initialization */ + p_char_assign = (void*)GetProcAddress(msvcp, "?assign@?$char_traits@D@std@@SAXAEADAEBD@Z"); + p_wchar_assign = (void*)GetProcAddress(msvcp, "?assign@?$char_traits@_W@std@@SAXAEA_WAEB_W@Z"); + p_short_assign = (void*)GetProcAddress(msvcp, "?assign@?$char_traits@G@std@@SAXAEAGAEBG@Z"); + + p_char_eq = (void*)GetProcAddress(msvcp, "?eq@?$char_traits@D@std@@SA_NAEBD0@Z"); + p_wchar_eq = (void*)GetProcAddress(msvcp, "?eq@?$char_traits@_W@std@@SA_NAEB_W0@Z"); + p_short_eq = (void*)GetProcAddress(msvcp, "?eq@?$char_traits@G@std@@SA_NAEBG0@Z"); + + p_Copy_s = (void*)GetProcAddress(msvcp, "?_Copy_s@?$char_traits@D@std@@SAPEADPEAD_KPEBD1@Z"); + + p_char_address = (void*)GetProcAddress(msvcp, "?address@?$allocator@D@std@@QEBAPEADAEAD@Z"); + p_char_ctor = (void*)GetProcAddress(msvcp, "??0?$allocator@D@std@@QEAA@XZ"); + p_char_deallocate = (void*)GetProcAddress(msvcp, "?deallocate@?$allocator@D@std@@QEAAXPEAD_K@Z"); + p_char_allocate = (void*)GetProcAddress(msvcp, "?allocate@?$allocator@D@std@@QEAAPEAD_K@Z"); + p_char_construct = (void*)GetProcAddress(msvcp, "?construct@?$allocator@D@std@@QEAAXPEADAEBD@Z"); + p_char_max_size = (void*)GetProcAddress(msvcp, "?max_size@?$allocator@D@std@@QEBA_KXZ"); + } else { + p_char_assign = (void*)GetProcAddress(msvcp, "?assign@?$char_traits@D@std@@SAXAADABD@Z"); + p_wchar_assign = (void*)GetProcAddress(msvcp, "?assign@?$char_traits@_W@std@@SAXAA_WAB_W@Z"); + p_short_assign = (void*)GetProcAddress(msvcp, "?assign@?$char_traits@G@std@@SAXAAGABG@Z"); + + p_char_eq = (void*)GetProcAddress(msvcp, "?eq@?$char_traits@D@std@@SA_NABD0@Z"); + p_wchar_eq = (void*)GetProcAddress(msvcp, "?eq@?$char_traits@_W@std@@SA_NAB_W0@Z"); + p_short_eq = (void*)GetProcAddress(msvcp, "?eq@?$char_traits@G@std@@SA_NABG0@Z"); + + p_Copy_s = (void*)GetProcAddress(msvcp, "?_Copy_s@?$char_traits@D@std@@SAPADPADIPBDI@Z"); + + p_char_address = (void*)GetProcAddress(msvcp, "?address@?$allocator@D@std@@QBEPADAAD@Z"); + p_char_ctor = (void*)GetProcAddress(msvcp, "??0?$allocator@D@std@@QAE@XZ"); + p_char_deallocate = (void*)GetProcAddress(msvcp, "?deallocate@?$allocator@D@std@@QAEXPADI@Z"); + p_char_allocate = (void*)GetProcAddress(msvcp, "?allocate@?$allocator@D@std@@QAEPADI@Z"); + p_char_construct = (void*)GetProcAddress(msvcp, "?construct@?$allocator@D@std@@QAEXPADABD@Z"); + p_char_max_size = (void*)GetProcAddress(msvcp, "?max_size@?$allocator@D@std@@QBEIXZ"); + } return TRUE; } @@ -83,7 +224,7 @@ char out[4]; if(!p_char_assign || !p_wchar_assign || !p_short_assign) { - skip("assign tests skipped\n"); + win_skip("assign tests skipped\n"); return; } @@ -114,7 +255,7 @@ BYTE ret; if(!p_char_eq || !p_wchar_eq || !p_short_eq) { - skip("equal tests skipped\n"); + win_skip("equal tests skipped\n"); return; } @@ -146,7 +287,7 @@ char dest[32], *ret; if(!p_Copy_s) { - skip("Copy_s tests skipped\n"); + win_skip("Copy_s tests skipped\n"); return; } @@ -187,6 +328,43 @@ ok(errno == 0xdeadbeef, "errno = %d\n", errno); } +static void test_allocator_char(void) +{ + void *allocator = (void*)0xdeadbeef; + char *ptr; + char val; + unsigned int size; + + if(!p_char_address || !p_char_ctor || !p_char_deallocate || !p_char_allocate + || !p_char_construct || !p_char_max_size) { + win_skip("allocator class not available\n"); + return; + } + + allocator = call_func1(p_char_ctor, allocator); + ok(allocator == (void*)0xdeadbeef, "allocator = %p\n", allocator); + + ptr = call_func2(p_char_address, NULL, (void*)0xdeadbeef); + ok(ptr == (void*)0xdeadbeef, "incorrect address (%p)\n", ptr); + + ptr = NULL; + ptr = call_func2(p_char_allocate, allocator, 10); + ok(ptr != NULL, "Memory allocation failed\n"); + + ptr[0] = ptr[1] = '#'; + val = 'a'; + call_func3(p_char_construct, allocator, ptr, &val); + val = 'b'; + call_func3(p_char_construct, allocator, (ptr+1), &val); + ok(ptr[0] == 'a', "ptr[0] = %c\n", ptr[0]); + ok(ptr[1] == 'b', "ptr[1] = %c\n", ptr[1]); + + call_func3(p_char_deallocate, allocator, ptr, -1); + + size = (unsigned int)call_func1(p_char_max_size, allocator); + ok(size == (unsigned int)0xffffffff, "size = %x\n", size); +} + START_TEST(misc) { if(!init()) @@ -196,5 +374,7 @@ test_equal(); test_Copy_s(); + test_allocator_char(); + ok(!invalid_parameter, "invalid_parameter_handler was invoked too many times\n"); } diff -Nru wine1.3-1.3.0/dlls/ntdll/cdrom.c wine1.3-1.3.1/dlls/ntdll/cdrom.c --- wine1.3-1.3.0/dlls/ntdll/cdrom.c 2010-07-30 18:43:56.000000000 +0100 +++ wine1.3-1.3.1/dlls/ntdll/cdrom.c 2010-08-20 18:23:50.000000000 +0100 @@ -464,7 +464,7 @@ cdrom_cache[dev].toc_good = 1; return STATUS_SUCCESS; -#elif defined(__FreeBSD__) || defined(__NetBSD__) +#elif defined(__FreeBSD__) || defined(__FreeBSD_kernel__) || defined(__NetBSD__) int i, tsz; struct ioc_toc_header hdr; @@ -545,6 +545,7 @@ cdrom_cache[dev].toc_good = 1; return STATUS_SUCCESS; #else + FIXME("not supported on this O/S\n"); return STATUS_NOT_SUPPORTED; #endif } @@ -629,11 +630,8 @@ } } return 0; -#elif defined(__FreeBSD__) - FIXME("not implemented for BSD\n"); - return 0; #else - FIXME("not implemented for nonlinux\n"); + FIXME("not implemented on this O/S\n"); return 0; #endif } @@ -766,9 +764,10 @@ { #if defined(linux) return CDROM_GetStatusCode(ioctl(fd, CDROMRESET)); -#elif defined(__FreeBSD__) || defined(__NetBSD__) +#elif defined(__FreeBSD__) || defined(__FreeBSD_kernel__) || defined(__NetBSD__) return CDROM_GetStatusCode(ioctl(fd, CDIOCRESET, NULL)); #else + FIXME("not supported on this O/S\n"); return STATUS_NOT_SUPPORTED; #endif } @@ -782,7 +781,7 @@ { #if defined(linux) return CDROM_GetStatusCode(ioctl(fd, doEject ? CDROMEJECT : CDROMCLOSETRAY)); -#elif defined(__FreeBSD__) || defined(__NetBSD__) +#elif defined(__FreeBSD__) || defined(__FreeBSD_kernel__) || defined(__NetBSD__) return CDROM_GetStatusCode((ioctl(fd, CDIOCALLOW, NULL)) || (ioctl(fd, doEject ? CDIOCEJECT : CDIOCCLOSE, NULL)) || (ioctl(fd, CDIOCPREVENT, NULL))); @@ -790,6 +789,7 @@ if (doEject) return CDROM_GetStatusCode( ioctl( fd, DKIOCEJECT, NULL ) ); else return STATUS_NOT_SUPPORTED; #else + FIXME("not supported on this O/S\n"); return STATUS_NOT_SUPPORTED; #endif } @@ -803,9 +803,10 @@ { #if defined(linux) return CDROM_GetStatusCode(ioctl(fd, CDROM_LOCKDOOR, rmv->PreventMediaRemoval)); -#elif defined(__FreeBSD__) || defined(__NetBSD__) +#elif defined(__FreeBSD__) || defined(__FreeBSD_kernel__) || defined(__NetBSD__) return CDROM_GetStatusCode(ioctl(fd, (rmv->PreventMediaRemoval) ? CDIOCPREVENT : CDIOCALLOW, NULL)); #else + FIXME("not supported on this O/S\n"); return STATUS_NOT_SUPPORTED; #endif } @@ -957,7 +958,7 @@ end: ret = CDROM_GetStatusCode(io); -#elif defined(__FreeBSD__) || defined(__NetBSD__) +#elif defined(__FreeBSD__) || defined(__FreeBSD_kernel__) || defined(__NetBSD__) SUB_Q_HEADER* hdr = (SUB_Q_HEADER*)data; int io; struct ioc_read_subchannel read_sc; @@ -1113,7 +1114,7 @@ return STATUS_SUCCESS; else return STATUS_NO_MEDIA_IN_DEVICE; -#elif defined(__FreeBSD__) +#elif defined(__FreeBSD__) || defined(__FreeBSD_kernel__) int ret; ret = ioctl(fd, CDIOCSTART, NULL); if(ret == 0) @@ -1121,7 +1122,7 @@ else return STATUS_NO_MEDIA_IN_DEVICE; #else - FIXME("not implemented for non-linux\n"); + FIXME("not supported on this O/S\n"); return STATUS_NOT_SUPPORTED; #endif } @@ -1162,7 +1163,7 @@ msf.cdmsf_min1, msf.cdmsf_sec1, msf.cdmsf_frame1); end: ret = CDROM_GetStatusCode(io); -#elif defined(__FreeBSD__) || defined(__NetBSD__) +#elif defined(__FreeBSD__) || defined(__FreeBSD_kernel__) || defined(__NetBSD__) struct ioc_play_msf msf; int io; @@ -1207,7 +1208,7 @@ #if defined(linux) struct cdrom_msf0 msf; struct cdrom_subchnl sc; -#elif defined(__FreeBSD__) || defined(__NetBSD__) +#elif defined(__FreeBSD__) || defined(__FreeBSD_kernel__) || defined(__NetBSD__) struct ioc_play_msf msf; struct ioc_read_subchannel read_sc; struct cd_sub_channel_info sc; @@ -1260,7 +1261,7 @@ return CDROM_GetStatusCode(ioctl(fd, CDROMSEEK, &msf)); } return STATUS_SUCCESS; -#elif defined(__FreeBSD__) || defined(__NetBSD__) +#elif defined(__FreeBSD__) || defined(__FreeBSD_kernel__) || defined(__NetBSD__) read_sc.address_format = CD_MSF_FORMAT; read_sc.track = 0; read_sc.data_len = sizeof(sc); @@ -1287,6 +1288,7 @@ } return STATUS_SUCCESS; #else + FIXME("not supported on this O/S\n"); return STATUS_NOT_SUPPORTED; #endif } @@ -1300,9 +1302,10 @@ { #if defined(linux) return CDROM_GetStatusCode(ioctl(fd, CDROMPAUSE)); -#elif defined(__FreeBSD__) || defined(__NetBSD__) +#elif defined(__FreeBSD__) || defined(__FreeBSD_kernel__) || defined(__NetBSD__) return CDROM_GetStatusCode(ioctl(fd, CDIOCPAUSE, NULL)); #else + FIXME(": not supported on this O/S\n"); return STATUS_NOT_SUPPORTED; #endif } @@ -1316,9 +1319,10 @@ { #if defined(linux) return CDROM_GetStatusCode(ioctl(fd, CDROMRESUME)); -#elif defined(__FreeBSD__) || defined(__NetBSD__) +#elif defined(__FreeBSD__) || defined(__FreeBSD_kernel__) || defined(__NetBSD__) return CDROM_GetStatusCode(ioctl(fd, CDIOCRESUME, NULL)); #else + FIXME("not supported on this O/S\n"); return STATUS_NOT_SUPPORTED; #endif } @@ -1332,9 +1336,10 @@ { #if defined(linux) return CDROM_GetStatusCode(ioctl(fd, CDROMSTOP)); -#elif defined(__FreeBSD__) || defined(__NetBSD__) +#elif defined(__FreeBSD__) || defined(__FreeBSD_kernel__) || defined(__NetBSD__) return CDROM_GetStatusCode(ioctl(fd, CDIOCSTOP, NULL)); #else + FIXME("not supported on this O/S\n"); return STATUS_NOT_SUPPORTED; #endif } @@ -1359,7 +1364,7 @@ vc->PortVolume[3] = volc.channel3; } return CDROM_GetStatusCode(io); -#elif defined(__FreeBSD__) || defined(__NetBSD__) +#elif defined(__FreeBSD__) || defined(__FreeBSD_kernel__) || defined(__NetBSD__) struct ioc_vol volc; int io; @@ -1373,6 +1378,7 @@ } return CDROM_GetStatusCode(io); #else + FIXME("not supported on this O/S\n"); return STATUS_NOT_SUPPORTED; #endif } @@ -1393,7 +1399,7 @@ volc.channel3 = vc->PortVolume[3]; return CDROM_GetStatusCode(ioctl(fd, CDROMVOLCTRL, &volc)); -#elif defined(__FreeBSD__) || defined(__NetBSD__) +#elif defined(__FreeBSD__) || defined(__FreeBSD_kernel__) || defined(__NetBSD__) struct ioc_vol volc; volc.vol[0] = vc->PortVolume[0]; @@ -1403,6 +1409,7 @@ return CDROM_GetStatusCode(ioctl(fd, CDIOCSETVOL, &volc)); #else + FIXME(": not supported on this O/S\n"); return STATUS_NOT_SUPPORTED; #endif } @@ -2128,8 +2135,6 @@ ret =CDROM_GetStatusCode(ioctl(fd, DVD_AUTH, &auth_info)); *sid_out = auth_info.lsa.agid; return ret; -#elif defined(__FreeBSD__) || defined(__NetBSD__) - return STATUS_NOT_SUPPORTED; #elif defined(__APPLE__) NTSTATUS ret = STATUS_NOT_SUPPORTED; dk_dvd_report_key_t dvdrk; @@ -2145,6 +2150,7 @@ *sid_out = agid_info.grantID; return ret; #else + FIXME("not supported on this O/S\n"); return STATUS_NOT_SUPPORTED; #endif } @@ -2165,8 +2171,6 @@ TRACE("\n"); return CDROM_GetStatusCode(ioctl(fd, DVD_AUTH, &auth_info)); -#elif defined(__FreeBSD__) || defined(__NetBSD__) - return STATUS_NOT_SUPPORTED; #elif defined(__APPLE__) dk_dvd_send_key_t dvdsk; @@ -2176,6 +2180,7 @@ return CDROM_GetStatusCode(ioctl(fd, DKIOCDVDSENDKEY, &dvdsk)); #else + FIXME("not supported on this O/S\n"); return STATUS_NOT_SUPPORTED; #endif } @@ -2261,7 +2266,7 @@ return CDROM_GetStatusCode(ioctl(fd, DKIOCDVDSENDKEY, &dvdsk)); #else - FIXME("unsupported on this platform\n"); + FIXME("not supported on this O/S\n"); return STATUS_NOT_SUPPORTED; #endif } @@ -2350,9 +2355,6 @@ FIXME("Unknown keytype 0x%x\n",key->KeyType); } return ret; -#elif defined(__FreeBSD__) || defined(__NetBSD__) - TRACE("bsd\n"); - return STATUS_NOT_SUPPORTED; #elif defined(__APPLE__) union { @@ -2502,7 +2504,7 @@ } return ret; #else - TRACE("outside\n"); + FIXME("not supported on this O/S\n"); return STATUS_NOT_SUPPORTED; #endif } @@ -2540,9 +2542,6 @@ } } return ret; -#elif defined(__FreeBSD__) || defined(__NetBSD__) - TRACE("bsd\n"); - return STATUS_NOT_SUPPORTED; #elif defined(__APPLE__) dk_dvd_report_key_t key; dk_dvd_read_structure_t dvd; @@ -2574,7 +2573,7 @@ } return ret; #else - FIXME("\n"); + FIXME("not supported on this O/S\n"); return STATUS_NOT_SUPPORTED; #endif } @@ -2878,7 +2877,7 @@ pInquiryData->NextInquiryDataOffset = 0; return STATUS_SUCCESS; #else - FIXME("not implemented for nonlinux\n"); + FIXME("not supported on this O/S\n"); return STATUS_NOT_SUPPORTED; #endif } diff -Nru wine1.3-1.3.0/dlls/ntdll/error.c wine1.3-1.3.1/dlls/ntdll/error.c --- wine1.3-1.3.0/dlls/ntdll/error.c 2010-07-30 18:43:56.000000000 +0100 +++ wine1.3-1.3.1/dlls/ntdll/error.c 2010-08-20 18:23:50.000000000 +0100 @@ -3,6 +3,7 @@ * * Copyright 2000 Alexandre Julliard * Copyright 2002 Andriy Palamarchuk + * Copyright 2010 André Hentschel * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public @@ -210,10 +211,10 @@ ERROR_DS_MEMBERSHIP_EVALUATED_LOCALLY /* 00000121 (STATUS_DS_MEMBERSHIP_EVALUATED_LOCALLY) */ }; -static const DWORD table_40000002[12] = +static const DWORD table_40000002[36] = { ERROR_INVALID_PARAMETER, /* 40000002 (STATUS_WORKING_SET_LIMIT_RANGE) */ - 0, /* 40000003 (STATUS_IMAGE_NOT_AT_BASE) */ + ERROR_IMAGE_NOT_AT_BASE, /* 40000003 (STATUS_IMAGE_NOT_AT_BASE) */ 0, /* 40000004 (STATUS_RXACT_STATE_CREATED) */ 0, /* 40000005 (STATUS_SEGMENT_NOTIFICATION) */ ERROR_LOCAL_USER_SESSION_KEY, /* 40000006 (STATUS_LOCAL_USER_SESSION_KEY) */ @@ -223,7 +224,31 @@ 0, /* 4000000a (STATUS_FT_READ_RECOVERY_FROM_BACKUP) */ 0, /* 4000000b (STATUS_FT_WRITE_RECOVERY) */ ERROR_COUNTER_TIMEOUT, /* 4000000c (STATUS_SERIAL_COUNTER_TIMEOUT) */ - ERROR_NULL_LM_PASSWORD /* 4000000d (STATUS_NULL_LM_PASSWORD) */ + ERROR_NULL_LM_PASSWORD, /* 4000000d (STATUS_NULL_LM_PASSWORD) */ + ERROR_IMAGE_MACHINE_TYPE_MISMATCH, /* 4000000e (STATUS_IMAGE_MACHINE_TYPE_MISMATCH) */ + ERROR_RECEIVE_PARTIAL, /* 4000000f (STATUS_RECEIVE_PARTIAL) */ + ERROR_RECEIVE_EXPEDITED, /* 40000010 (STATUS_RECEIVE_EXPEDITED) */ + ERROR_RECEIVE_PARTIAL_EXPEDITED, /* 40000011 (STATUS_RECEIVE_PARTIAL_EXPEDITED) */ + ERROR_EVENT_DONE, /* 40000012 (STATUS_EVENT_DONE) */ + ERROR_EVENT_PENDING, /* 40000013 (STATUS_EVENT_PENDING) */ + ERROR_CHECKING_FILE_SYSTEM, /* 40000014 (STATUS_CHECKING_FILE_SYSTEM) */ + ERROR_FATAL_APP_EXIT, /* 40000015 (STATUS_FATAL_APP_EXIT) */ + ERROR_PREDEFINED_HANDLE, /* 40000016 (STATUS_PREDEFINED_HANDLE) */ + ERROR_WAS_UNLOCKED, /* 40000017 (STATUS_WAS_UNLOCKED) */ + ERROR_SERVICE_NOTIFICATION, /* 40000018 (STATUS_SERVICE_NOTIFICATION) */ + ERROR_WAS_LOCKED, /* 40000019 (STATUS_WAS_LOCKED) */ + ERROR_LOG_HARD_ERROR, /* 4000001a (STATUS_LOG_HARD_ERROR) */ + ERROR_ALREADY_WIN32, /* 4000001b (STATUS_ALREADY_WIN32) */ + 0, /* 4000001c (STATUS_WX86_UNSIMULATE) */ + 0, /* 4000001d (STATUS_WX86_CONTINUE) */ + 0, /* 4000001e (STATUS_WX86_SINGLE_STEP) */ + 0, /* 4000001f (STATUS_WX86_BREAKPOINT) */ + 0, /* 40000020 (STATUS_WX86_EXCEPTION_CONTINUE) */ + 0, /* 40000021 (STATUS_WX86_EXCEPTION_LASTCHANCE) */ + 0, /* 40000022 (STATUS_WX86_EXCEPTION_CHAIN) */ + ERROR_IMAGE_MACHINE_TYPE_MISMATCH_EXE, /* 40000023 (STATUS_IMAGE_MACHINE_TYPE_MISMATCH_EXE) */ + ERROR_NO_YIELD_PERFORMED, /* 40000024 (STATUS_NO_YIELD_PERFORMED) */ + ERROR_TIMER_RESUME_IGNORED /* 40000025 (STATUS_TIMER_RESUME_IGNORED) */ }; static const DWORD table_40000370[1] = @@ -699,11 +724,11 @@ ERROR_TIME_SKEW, /* c0000133 (STATUS_TIME_DIFFERENCE_AT_DC) */ 0, /* c0000134 (STATUS_SYNCHRONIZATION_REQUIRED) */ ERROR_MOD_NOT_FOUND, /* c0000135 (STATUS_DLL_NOT_FOUND) */ - 0, /* c0000136 (STATUS_OPEN_FAILED) */ - 0, /* c0000137 (STATUS_IO_PRIVILEGE_FAILED) */ + ERROR_NET_OPEN_FAILED, /* c0000136 (STATUS_OPEN_FAILED) */ + ERROR_IO_PRIVILEGE_FAILED, /* c0000137 (STATUS_IO_PRIVILEGE_FAILED) */ ERROR_INVALID_ORDINAL, /* c0000138 (STATUS_ORDINAL_NOT_FOUND) */ ERROR_PROC_NOT_FOUND, /* c0000139 (STATUS_ENTRYPOINT_NOT_FOUND) */ - 0, /* c000013a (STATUS_CONTROL_C_EXIT) */ + ERROR_CONTROL_C_EXIT, /* c000013a (STATUS_CONTROL_C_EXIT) */ ERROR_NETNAME_DELETED, /* c000013b (STATUS_LOCAL_DISCONNECT) */ ERROR_NETNAME_DELETED, /* c000013c (STATUS_REMOTE_DISCONNECT) */ ERROR_REM_NOT_LIST, /* c000013d (STATUS_REMOTE_RESOURCES) */ @@ -712,18 +737,18 @@ ERROR_UNEXP_NET_ERR, /* c0000140 (STATUS_INVALID_CONNECTION) */ ERROR_UNEXP_NET_ERR, /* c0000141 (STATUS_INVALID_ADDRESS) */ ERROR_DLL_INIT_FAILED, /* c0000142 (STATUS_DLL_INIT_FAILED) */ - 0, /* c0000143 (STATUS_MISSING_SYSTEMFILE) */ - 0, /* c0000144 (STATUS_UNHANDLED_EXCEPTION) */ - 0, /* c0000145 (STATUS_APP_INIT_FAILURE) */ - 0, /* c0000146 (STATUS_PAGEFILE_CREATE_FAILED) */ - 0, /* c0000147 (STATUS_NO_PAGEFILE) */ + ERROR_MISSING_SYSTEMFILE, /* c0000143 (STATUS_MISSING_SYSTEMFILE) */ + ERROR_UNHANDLED_EXCEPTION, /* c0000144 (STATUS_UNHANDLED_EXCEPTION) */ + ERROR_APP_INIT_FAILURE, /* c0000145 (STATUS_APP_INIT_FAILURE) */ + ERROR_PAGEFILE_CREATE_FAILED, /* c0000146 (STATUS_PAGEFILE_CREATE_FAILED) */ + ERROR_NO_PAGEFILE, /* c0000147 (STATUS_NO_PAGEFILE) */ ERROR_INVALID_LEVEL, /* c0000148 (STATUS_INVALID_LEVEL) */ ERROR_INVALID_PASSWORD, /* c0000149 (STATUS_WRONG_PASSWORD_CORE) */ - 0, /* c000014a (STATUS_ILLEGAL_FLOAT_CONTEXT) */ + ERROR_ILLEGAL_FLOAT_CONTEXT, /* c000014a (STATUS_ILLEGAL_FLOAT_CONTEXT) */ ERROR_BROKEN_PIPE, /* c000014b (STATUS_PIPE_BROKEN) */ ERROR_BADDB, /* c000014c (STATUS_REGISTRY_CORRUPT) */ ERROR_REGISTRY_IO_FAILED, /* c000014d (STATUS_REGISTRY_IO_FAILED) */ - 0, /* c000014e (STATUS_NO_EVENT_PAIR) */ + ERROR_NO_EVENT_PAIR, /* c000014e (STATUS_NO_EVENT_PAIR) */ ERROR_UNRECOGNIZED_VOLUME, /* c000014f (STATUS_UNRECOGNIZED_VOLUME) */ ERROR_SERIAL_NO_DEVICE, /* c0000150 (STATUS_SERIAL_NO_DEVICE_INITED) */ ERROR_NO_SUCH_ALIAS, /* c0000151 (STATUS_NO_SUCH_ALIAS) */ @@ -739,7 +764,7 @@ ERROR_LOGON_TYPE_NOT_GRANTED, /* c000015b (STATUS_LOGON_TYPE_NOT_GRANTED) */ ERROR_NOT_REGISTRY_FILE, /* c000015c (STATUS_NOT_REGISTRY_FILE) */ ERROR_NT_CROSS_ENCRYPTION_REQUIRED, /* c000015d (STATUS_NT_CROSS_ENCRYPTION_REQUIRED) */ - 0, /* c000015e (STATUS_DOMAIN_CTRLR_CONFIG_ERROR) */ + ERROR_DOMAIN_CTRLR_CONFIG_ERROR, /* c000015e (STATUS_DOMAIN_CTRLR_CONFIG_ERROR) */ ERROR_IO_DEVICE, /* c000015f (STATUS_FT_MISSING_MEMBER) */ 0, /* c0000160 (STATUS_ILL_FORMED_SERVICE_ENTRY) */ 0, /* c0000161 (STATUS_ILLEGAL_CHARACTER) */ @@ -1419,7 +1444,7 @@ ERROR_CLUSTER_NETWORK_NOT_INTERNAL /* c0130016 (STATUS_CLUSTER_NETWORK_NOT_INTERNAL) */ }; -static const DWORD table_c0150001[14] = +static const DWORD table_c0150001[39] = { ERROR_SXS_SECTION_NOT_FOUND, /* c0150001 (STATUS_SXS_SECTION_NOT_FOUND) */ ERROR_SXS_CANT_GEN_ACTCTX, /* c0150002 (STATUS_SXS_CANT_GEN_ACTCTX) */ @@ -1429,18 +1454,43 @@ ERROR_SXS_MANIFEST_PARSE_ERROR, /* c0150006 (STATUS_SXS_MANIFEST_PARSE_ERROR) */ ERROR_SXS_ACTIVATION_CONTEXT_DISABLED, /* c0150007 (STATUS_SXS_ACTIVATION_CONTEXT_DISABLED) */ ERROR_SXS_KEY_NOT_FOUND, /* c0150008 (STATUS_SXS_KEY_NOT_FOUND) */ - 0, /* c0150009 (STATUS_SXS_VERSION_CONFLICT) */ + ERROR_SXS_VERSION_CONFLICT, /* c0150009 (STATUS_SXS_VERSION_CONFLICT) */ ERROR_SXS_WRONG_SECTION_TYPE, /* c015000a (STATUS_SXS_WRONG_SECTION_TYPE) */ ERROR_SXS_THREAD_QUERIES_DISABLED, /* c015000b (STATUS_SXS_THREAD_QUERIES_DISABLED) */ - 0, /* c015000c (STATUS_SXS_ASSEMBLY_MISSING) */ + ERROR_SXS_ASSEMBLY_MISSING, /* c015000c (STATUS_SXS_ASSEMBLY_MISSING) */ 0, /* c015000d */ - ERROR_SXS_PROCESS_DEFAULT_ALREADY_SET /* c015000e (STATUS_SXS_PROCESS_DEFAULT_ALREADY_SET) */ + ERROR_SXS_PROCESS_DEFAULT_ALREADY_SET, /* c015000e (STATUS_SXS_PROCESS_DEFAULT_ALREADY_SET) */ + ERROR_SXS_EARLY_DEACTIVATION, /* c015000f (STATUS_SXS_EARLY_DEACTIVATION) */ + ERROR_SXS_INVALID_DEACTIVATION, /* c0150010 (STATUS_SXS_INVALID_DEACTIVATION) */ + ERROR_SXS_MULTIPLE_DEACTIVATION, /* c0150011 (STATUS_SXS_MULTIPLE_DEACTIVATION) */ + ERROR_SXS_SYSTEM_DEFAULT_ACTIVATION_CONTEXT_EMPTY, /* c0150012 (STATUS_SXS_SYSTEM_DEFAULT_ACTIVATION_CONTEXT_EMPTY) */ + ERROR_SXS_PROCESS_TERMINATION_REQUESTED, /* c0150013 (STATUS_SXS_PROCESS_TERMINATION_REQUESTED) */ + ERROR_SXS_CORRUPT_ACTIVATION_STACK, /* c0150014 (STATUS_SXS_CORRUPT_ACTIVATION_STACK) */ + ERROR_SXS_CORRUPTION, /* c0150015 (STATUS_SXS_CORRUPTION) */ + ERROR_SXS_INVALID_IDENTITY_ATTRIBUTE_VALUE, /* c0150016 (STATUS_SXS_INVALID_IDENTITY_ATTRIBUTE_VALUE) */ + ERROR_SXS_INVALID_IDENTITY_ATTRIBUTE_NAME, /* c0150017 (STATUS_SXS_INVALID_IDENTITY_ATTRIBUTE_NAME) */ + ERROR_SXS_IDENTITY_DUPLICATE_ATTRIBUTE, /* c0150018 (STATUS_SXS_IDENTITY_DUPLICATE_ATTRIBUTE) */ + ERROR_SXS_IDENTITY_PARSE_ERROR, /* c0150019 (STATUS_SXS_IDENTITY_PARSE_ERROR) */ + ERROR_SXS_COMPONENT_STORE_CORRUPT, /* c015001a (STATUS_SXS_COMPONENT_STORE_CORRUPT) */ + ERROR_SXS_FILE_HASH_MISMATCH, /* c015001b (STATUS_SXS_FILE_HASH_MISMATCH) */ + ERROR_SXS_MANIFEST_IDENTITY_SAME_BUT_CONTENTS_DIFFERENT, /* c015001c (STATUS_SXS_MANIFEST_IDENTITY_SAME_BUT_CONTENTS_DIFFERENT) */ + ERROR_SXS_IDENTITIES_DIFFERENT, /* c015001d (STATUS_SXS_IDENTITIES_DIFFERENT) */ + ERROR_SXS_ASSEMBLY_IS_NOT_A_DEPLOYMENT, /* c015001e (STATUS_SXS_ASSEMBLY_IS_NOT_A_DEPLOYMENT) */ + ERROR_SXS_FILE_NOT_PART_OF_ASSEMBLY, /* c015001f (STATUS_SXS_FILE_NOT_PART_OF_ASSEMBLY) */ + ERROR_ADVANCED_INSTALLER_FAILED, /* c0150020 (STATUS_ADVANCED_INSTALLER_FAILED) */ + ERROR_XML_ENCODING_MISMATCH, /* c0150021 (STATUS_XML_ENCODING_MISMATCH) */ + ERROR_SXS_MANIFEST_TOO_BIG, /* c0150022 (STATUS_SXS_MANIFEST_TOO_BIG) */ + ERROR_SXS_SETTING_NOT_REGISTERED, /* c0150023 (STATUS_SXS_SETTING_NOT_REGISTERED) */ + ERROR_SXS_TRANSACTION_CLOSURE_INCOMPLETE, /* c0150024 (STATUS_SXS_TRANSACTION_CLOSURE_INCOMPLETE) */ + ERROR_SMI_PRIMITIVE_INSTALLER_FAILED, /* c0150025 (STATUS_SXS_PRIMITIVE_INSTALLER_FAILED) */ + ERROR_GENERIC_COMMAND_FAILED, /* c0150026 (STATUS_GENERIC_COMMAND_FAILED) */ + ERROR_SXS_FILE_HASH_MISSING /* c0150027 (STATUS_SXS_FILE_HASH_MISSING) */ }; static const struct error_table error_table[] = { { 0x00000102, 0x00000122, table_00000102 }, - { 0x40000002, 0x4000000e, table_40000002 }, + { 0x40000002, 0x40000026, table_40000002 }, { 0x40000370, 0x40000371, table_40000370 }, { 0x40020056, 0x40020057, table_40020056 }, { 0x400200af, 0x400200b0, table_400200af }, @@ -1457,6 +1507,6 @@ { 0xc0030059, 0xc0030062, table_c0030059 }, { 0xc00a0001, 0xc00a0037, table_c00a0001 }, { 0xc0130001, 0xc0130017, table_c0130001 }, - { 0xc0150001, 0xc015000f, table_c0150001 }, + { 0xc0150001, 0xc0150028, table_c0150001 }, { 0, 0, NULL } /* last entry */ }; diff -Nru wine1.3-1.3.0/dlls/ntdll/loader.c wine1.3-1.3.1/dlls/ntdll/loader.c --- wine1.3-1.3.0/dlls/ntdll/loader.c 2010-07-30 18:43:56.000000000 +0100 +++ wine1.3-1.3.1/dlls/ntdll/loader.c 2010-08-20 18:23:50.000000000 +0100 @@ -2120,7 +2120,6 @@ { case IMAGE_REL_BASED_ABSOLUTE: break; -#ifdef __i386__ case IMAGE_REL_BASED_HIGH: *(short *)((char *)page + offset) += HIWORD(delta); break; @@ -2130,7 +2129,7 @@ case IMAGE_REL_BASED_HIGHLOW: *(int *)((char *)page + offset) += delta; break; -#elif defined(__x86_64__) +#ifdef __x86_64__ case IMAGE_REL_BASED_DIR64: *(INT_PTR *)((char *)page + offset) += delta; break; diff -Nru wine1.3-1.3.0/dlls/ntdll/ntdll.spec wine1.3-1.3.1/dlls/ntdll/ntdll.spec --- wine1.3-1.3.0/dlls/ntdll/ntdll.spec 2010-07-30 18:43:56.000000000 +0100 +++ wine1.3-1.3.1/dlls/ntdll/ntdll.spec 2010-08-20 18:23:50.000000000 +0100 @@ -690,10 +690,10 @@ @ stdcall RtlInterlockedPushEntrySList(ptr ptr) @ stdcall RtlInterlockedPushListSList(ptr ptr ptr long) # @ stub RtlInvertRangeList -# @ stub RtlIpv4AddressToStringA -# @ stub RtlIpv4AddressToStringExA -@ stdcall RtlIpv4AddressToStringExW(ptr ptr ptr ptr) -# @ stub RtlIpv4AddressToStringW +@ stdcall RtlIpv4AddressToStringA(ptr ptr) +@ stdcall RtlIpv4AddressToStringExA(ptr long ptr ptr) +@ stdcall RtlIpv4AddressToStringExW(ptr long ptr ptr) +@ stdcall RtlIpv4AddressToStringW(ptr ptr) # @ stub RtlIpv4StringToAddressA # @ stub RtlIpv4StringToAddressExA @ stdcall RtlIpv4StringToAddressExW(ptr ptr wstr ptr) diff -Nru wine1.3-1.3.0/dlls/ntdll/process.c wine1.3-1.3.1/dlls/ntdll/process.c --- wine1.3-1.3.0/dlls/ntdll/process.c 2010-07-30 18:43:56.000000000 +0100 +++ wine1.3-1.3.1/dlls/ntdll/process.c 2010-08-20 18:23:50.000000000 +0100 @@ -90,6 +90,7 @@ return ret; } +static UINT process_error_mode; #define UNIMPLEMENTED_INFO_CLASS(c) \ case c: \ @@ -126,7 +127,6 @@ UNIMPLEMENTED_INFO_CLASS(ProcessAccessToken); UNIMPLEMENTED_INFO_CLASS(ProcessLdtInformation); UNIMPLEMENTED_INFO_CLASS(ProcessLdtSize); - UNIMPLEMENTED_INFO_CLASS(ProcessDefaultHardErrorMode); UNIMPLEMENTED_INFO_CLASS(ProcessIoPortHandlers); UNIMPLEMENTED_INFO_CLASS(ProcessPooledUsageAndLimits); UNIMPLEMENTED_INFO_CLASS(ProcessWorkingSetWatch); @@ -314,6 +314,13 @@ else ret = STATUS_INFO_LENGTH_MISMATCH; break; + case ProcessDefaultHardErrorMode: + len = sizeof(process_error_mode); + if (ProcessInformationLength == len) + memcpy(ProcessInformation, &process_error_mode, len); + else + ret = STATUS_INFO_LENGTH_MISMATCH; + break; case ProcessDebugObjectHandle: /* "These are not the debuggers you are looking for." * * set it to 0 aka "no debugger" to satisfy copy protections */ @@ -433,6 +440,10 @@ switch (ProcessInformationClass) { + case ProcessDefaultHardErrorMode: + if (ProcessInformationLength != sizeof(UINT)) return STATUS_INVALID_PARAMETER; + process_error_mode = *(UINT *)ProcessInformation; + break; case ProcessAffinityMask: if (ProcessInformationLength != sizeof(DWORD_PTR)) return STATUS_INVALID_PARAMETER; if (*(PDWORD_PTR)ProcessInformation & ~(((DWORD_PTR)1 << NtCurrentTeb()->Peb->NumberOfProcessors) - 1)) diff -Nru wine1.3-1.3.0/dlls/ntdll/rtl.c wine1.3-1.3.1/dlls/ntdll/rtl.c --- wine1.3-1.3.0/dlls/ntdll/rtl.c 2010-07-30 18:43:56.000000000 +0100 +++ wine1.3-1.3.1/dlls/ntdll/rtl.c 2010-08-20 18:23:50.000000000 +0100 @@ -30,14 +30,20 @@ #include #include #include +#ifdef HAVE_NETINET_IN_H +#include +#endif #include "ntstatus.h" #define NONAMELESSSTRUCT #define WIN32_NO_STATUS +#define USE_WS_PREFIX #include "windef.h" #include "winternl.h" #include "wine/debug.h" #include "wine/exception.h" +#include "wine/unicode.h" #include "ntdll_misc.h" +#include "inaddr.h" WINE_DEFAULT_DEBUG_CHANNEL(ntdll); @@ -904,14 +910,122 @@ return STATUS_SUCCESS; } -NTSTATUS WINAPI RtlIpv4AddressToStringExW (PULONG IP, PULONG Port, - LPWSTR Buffer, PULONG MaxSize) +/*********************************************************************** + * RtlIpv4AddressToStringExW [NTDLL.@] + * + * Convert the given ipv4 address and optional the port to a string + * + * PARAMS + * pin [I] PTR to the ip address to convert (network byte order) + * port [I] optional port to convert (network byte order) + * buffer [O] destination buffer for the result + * psize [IO] PTR to available/used size of the destination buffer + * + * RETURNS + * Success: STATUS_SUCCESS + * Failure: STATUS_INVALID_PARAMETER + * + */ +NTSTATUS WINAPI RtlIpv4AddressToStringExW(const IN_ADDR *pin, USHORT port, LPWSTR buffer, PULONG psize) { - FIXME("(%p,%p,%p,%p): stub\n", IP, Port, Buffer, MaxSize); + WCHAR tmp_ip[32]; + static const WCHAR fmt_ip[] = {'%','u','.','%','u','.','%','u','.','%','u',0}; + static const WCHAR fmt_port[] = {':','%','u',0}; + ULONG needed; - return STATUS_SUCCESS; + if (!pin || !buffer || !psize) + return STATUS_INVALID_PARAMETER; + + TRACE("(%p:0x%x, %d, %p, %p:%d)\n", pin, pin->S_un.S_addr, port, buffer, psize, *psize); + + needed = sprintfW(tmp_ip, fmt_ip, + pin->S_un.S_un_b.s_b1, pin->S_un.S_un_b.s_b2, + pin->S_un.S_un_b.s_b3, pin->S_un.S_un_b.s_b4); + + if (port) needed += sprintfW(tmp_ip + needed, fmt_port, ntohs(port)); + + if (*psize > needed) { + *psize = needed + 1; + strcpyW(buffer, tmp_ip); + return STATUS_SUCCESS; + } + + *psize = needed + 1; + return STATUS_INVALID_PARAMETER; +} + +/*********************************************************************** + * RtlIpv4AddressToStringExA [NTDLL.@] + * + * Convert the given ipv4 address and optional the port to a string + * + * See RtlIpv4AddressToStringExW + */ +NTSTATUS WINAPI RtlIpv4AddressToStringExA(const IN_ADDR *pin, USHORT port, LPSTR buffer, PULONG psize) +{ + CHAR tmp_ip[32]; + ULONG needed; + + if (!pin || !buffer || !psize) + return STATUS_INVALID_PARAMETER; + + TRACE("(%p:0x%x, %d, %p, %p:%d)\n", pin, pin->S_un.S_addr, port, buffer, psize, *psize); + + needed = sprintf(tmp_ip, "%u.%u.%u.%u", + pin->S_un.S_un_b.s_b1, pin->S_un.S_un_b.s_b2, + pin->S_un.S_un_b.s_b3, pin->S_un.S_un_b.s_b4); + + if (port) needed += sprintf(tmp_ip + needed, ":%u", ntohs(port)); + + if (*psize > needed) { + *psize = needed + 1; + strcpy(buffer, tmp_ip); + return STATUS_SUCCESS; + } + + *psize = needed + 1; + return STATUS_INVALID_PARAMETER; } +/*********************************************************************** + * RtlIpv4AddressToStringW [NTDLL.@] + * + * Convert the given ipv4 address to a string + * + * PARAMS + * pin [I] PTR to the ip address to convert (network byte order) + * buffer [O] destination buffer for the result (at least 16 character) + * + * RETURNS + * PTR to the 0 character at the end of the converted string + * + */ +WCHAR * WINAPI RtlIpv4AddressToStringW(const IN_ADDR *pin, LPWSTR buffer) +{ + ULONG size = 16; + + if (RtlIpv4AddressToStringExW(pin, 0, buffer, &size)) size = 0; + return buffer + size - 1; +} + +/*********************************************************************** + * RtlIpv4AddressToStringA [NTDLL.@] + * + * Convert the given ipv4 address to a string + * + * See RtlIpv4AddressToStringW + */ +CHAR * WINAPI RtlIpv4AddressToStringA(const IN_ADDR *pin, LPSTR buffer) +{ + ULONG size = 16; + + if (RtlIpv4AddressToStringExA(pin, 0, buffer, &size)) size = 0; + return buffer + size - 1; +} + +/*********************************************************************** + * get_pointer_obfuscator (internal) + */ static DWORD_PTR get_pointer_obfuscator( void ) { static DWORD_PTR pointer_obfuscator; diff -Nru wine1.3-1.3.0/dlls/ntdll/tests/error.c wine1.3-1.3.1/dlls/ntdll/tests/error.c --- wine1.3-1.3.0/dlls/ntdll/tests/error.c 2010-07-30 18:43:56.000000000 +0100 +++ wine1.3-1.3.1/dlls/ntdll/tests/error.c 2010-08-20 18:23:50.000000000 +0100 @@ -2,6 +2,7 @@ * Unit tests for RtlNtStatusToDosError function * * Copyright (c) 2002 Andriy Palamarchuk + * Copyright (c) 2010 André Hentschel * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public @@ -156,6 +157,8 @@ cmp(STATUS_CHILD_MUST_BE_VOLATILE, ERROR_CHILD_MUST_BE_VOLATILE); cmp(STATUS_REGISTRY_CORRUPT, ERROR_BADDB); cmp(STATUS_DLL_NOT_FOUND, ERROR_MOD_NOT_FOUND); + cmp2(STATUS_OPEN_FAILED, ERROR_NET_OPEN_FAILED); + cmp2(STATUS_IO_PRIVILEGE_FAILED, ERROR_IO_PRIVILEGE_FAILED); cmp(STATUS_DLL_INIT_FAILED, ERROR_DLL_INIT_FAILED); cmp2(STATUS_INVALID_IMPORT_OF_NON_DLL, ERROR_INVALID_IMPORT_OF_NON_DLL); cmp(STATUS_ORDINAL_NOT_FOUND, ERROR_INVALID_ORDINAL); @@ -465,6 +468,23 @@ cmp(STATUS_NO_QUOTAS_FOR_ACCOUNT, ERROR_NO_QUOTAS_FOR_ACCOUNT); cmp(STATUS_LOCAL_USER_SESSION_KEY, ERROR_LOCAL_USER_SESSION_KEY); cmp(STATUS_NULL_LM_PASSWORD, ERROR_NULL_LM_PASSWORD); + cmp2(STATUS_IMAGE_MACHINE_TYPE_MISMATCH, ERROR_IMAGE_MACHINE_TYPE_MISMATCH); + cmp2(STATUS_RECEIVE_PARTIAL, ERROR_RECEIVE_PARTIAL); + cmp2(STATUS_RECEIVE_EXPEDITED, ERROR_RECEIVE_EXPEDITED); + cmp2(STATUS_RECEIVE_PARTIAL_EXPEDITED, ERROR_RECEIVE_PARTIAL_EXPEDITED); + cmp2(STATUS_EVENT_DONE, ERROR_EVENT_DONE); + cmp2(STATUS_EVENT_PENDING, ERROR_EVENT_PENDING); + cmp2(STATUS_CHECKING_FILE_SYSTEM, ERROR_CHECKING_FILE_SYSTEM); + cmp2(STATUS_FATAL_APP_EXIT, ERROR_FATAL_APP_EXIT); + cmp2(STATUS_PREDEFINED_HANDLE, ERROR_PREDEFINED_HANDLE); + cmp2(STATUS_WAS_UNLOCKED, ERROR_WAS_UNLOCKED); + cmp2(STATUS_SERVICE_NOTIFICATION, ERROR_SERVICE_NOTIFICATION); + cmp2(STATUS_WAS_LOCKED, ERROR_WAS_LOCKED); + cmp2(STATUS_LOG_HARD_ERROR, ERROR_LOG_HARD_ERROR); + cmp2(STATUS_ALREADY_WIN32, ERROR_ALREADY_WIN32); + cmp2(STATUS_IMAGE_MACHINE_TYPE_MISMATCH_EXE, ERROR_IMAGE_MACHINE_TYPE_MISMATCH_EXE); + cmp2(STATUS_NO_YIELD_PERFORMED, ERROR_NO_YIELD_PERFORMED); + cmp2(STATUS_TIMER_RESUME_IGNORED, ERROR_TIMER_RESUME_IGNORED); cmp(STATUS_BAD_INHERITANCE_ACL, ERROR_BAD_INHERITANCE_ACL); cmp(STATUS_INVALID_GROUP_ATTRIBUTES, ERROR_INVALID_GROUP_ATTRIBUTES); cmp(STATUS_BAD_IMPERSONATION_LEVEL, ERROR_BAD_IMPERSONATION_LEVEL); @@ -514,6 +534,7 @@ cmp(STATUS_TOO_MANY_SIDS, ERROR_TOO_MANY_SIDS); cmp(STATUS_LM_CROSS_ENCRYPTION_REQUIRED, ERROR_LM_CROSS_ENCRYPTION_REQUIRED); cmp(STATUS_MESSAGE_NOT_FOUND, ERROR_MR_MID_NOT_FOUND); + cmp2(STATUS_CONTROL_C_EXIT, ERROR_CONTROL_C_EXIT); cmp(STATUS_LOCAL_DISCONNECT, ERROR_NETNAME_DELETED); cmp(STATUS_REMOTE_DISCONNECT, ERROR_NETNAME_DELETED); cmp(STATUS_REMOTE_RESOURCES, ERROR_REM_NOT_LIST); @@ -521,6 +542,14 @@ cmp(STATUS_LINK_TIMEOUT, ERROR_UNEXP_NET_ERR); cmp(STATUS_INVALID_CONNECTION, ERROR_UNEXP_NET_ERR); cmp(STATUS_INVALID_ADDRESS, ERROR_UNEXP_NET_ERR); + cmp2(STATUS_MISSING_SYSTEMFILE, ERROR_MISSING_SYSTEMFILE); + cmp2(STATUS_PAGEFILE_CREATE_FAILED, ERROR_PAGEFILE_CREATE_FAILED); + cmp2(STATUS_UNHANDLED_EXCEPTION, ERROR_UNHANDLED_EXCEPTION); + cmp2(STATUS_APP_INIT_FAILURE, ERROR_APP_INIT_FAILURE); + cmp2(STATUS_NO_PAGEFILE, ERROR_NO_PAGEFILE); + cmp2(STATUS_ILLEGAL_FLOAT_CONTEXT, ERROR_ILLEGAL_FLOAT_CONTEXT); + cmp2(STATUS_NO_EVENT_PAIR, ERROR_NO_EVENT_PAIR); + cmp2(STATUS_DOMAIN_CTRLR_CONFIG_ERROR, ERROR_DOMAIN_CTRLR_CONFIG_ERROR); cmp(STATUS_IO_DEVICE_ERROR, ERROR_IO_DEVICE); cmp(STATUS_DEVICE_PROTOCOL_ERROR, ERROR_IO_DEVICE); cmp(STATUS_DRIVER_INTERNAL_ERROR, ERROR_IO_DEVICE); @@ -907,9 +936,36 @@ cmp2(STATUS_SXS_MANIFEST_PARSE_ERROR, ERROR_SXS_MANIFEST_PARSE_ERROR); cmp2(STATUS_SXS_ACTIVATION_CONTEXT_DISABLED, ERROR_SXS_ACTIVATION_CONTEXT_DISABLED); cmp2(STATUS_SXS_KEY_NOT_FOUND, ERROR_SXS_KEY_NOT_FOUND); + cmp2(STATUS_SXS_VERSION_CONFLICT, ERROR_SXS_VERSION_CONFLICT); cmp2(STATUS_SXS_WRONG_SECTION_TYPE, ERROR_SXS_WRONG_SECTION_TYPE); cmp2(STATUS_SXS_THREAD_QUERIES_DISABLED, ERROR_SXS_THREAD_QUERIES_DISABLED); + cmp2(STATUS_SXS_ASSEMBLY_MISSING, ERROR_SXS_ASSEMBLY_MISSING); cmp2(STATUS_SXS_PROCESS_DEFAULT_ALREADY_SET, ERROR_SXS_PROCESS_DEFAULT_ALREADY_SET); + cmp2(STATUS_SXS_EARLY_DEACTIVATION, ERROR_SXS_EARLY_DEACTIVATION); + cmp2(STATUS_SXS_INVALID_DEACTIVATION, ERROR_SXS_INVALID_DEACTIVATION); + cmp2(STATUS_SXS_MULTIPLE_DEACTIVATION, ERROR_SXS_MULTIPLE_DEACTIVATION); + cmp2(STATUS_SXS_SYSTEM_DEFAULT_ACTIVATION_CONTEXT_EMPTY, ERROR_SXS_SYSTEM_DEFAULT_ACTIVATION_CONTEXT_EMPTY); + cmp2(STATUS_SXS_PROCESS_TERMINATION_REQUESTED, ERROR_SXS_PROCESS_TERMINATION_REQUESTED); + cmp2(STATUS_SXS_CORRUPT_ACTIVATION_STACK, ERROR_SXS_CORRUPT_ACTIVATION_STACK); + cmp2(STATUS_SXS_CORRUPTION, ERROR_SXS_CORRUPTION); + cmp2(STATUS_SXS_INVALID_IDENTITY_ATTRIBUTE_VALUE, ERROR_SXS_INVALID_IDENTITY_ATTRIBUTE_VALUE); + cmp2(STATUS_SXS_INVALID_IDENTITY_ATTRIBUTE_NAME, ERROR_SXS_INVALID_IDENTITY_ATTRIBUTE_NAME); + cmp2(STATUS_SXS_IDENTITY_DUPLICATE_ATTRIBUTE, ERROR_SXS_IDENTITY_DUPLICATE_ATTRIBUTE); + cmp2(STATUS_SXS_IDENTITY_PARSE_ERROR, ERROR_SXS_IDENTITY_PARSE_ERROR); + cmp2(STATUS_SXS_COMPONENT_STORE_CORRUPT, ERROR_SXS_COMPONENT_STORE_CORRUPT); + cmp2(STATUS_SXS_FILE_HASH_MISMATCH, ERROR_SXS_FILE_HASH_MISMATCH); + cmp2(STATUS_SXS_MANIFEST_IDENTITY_SAME_BUT_CONTENTS_DIFFERENT, ERROR_SXS_MANIFEST_IDENTITY_SAME_BUT_CONTENTS_DIFFERENT); + cmp2(STATUS_SXS_IDENTITIES_DIFFERENT, ERROR_SXS_IDENTITIES_DIFFERENT); + cmp2(STATUS_SXS_ASSEMBLY_IS_NOT_A_DEPLOYMENT, ERROR_SXS_ASSEMBLY_IS_NOT_A_DEPLOYMENT); + cmp2(STATUS_SXS_FILE_NOT_PART_OF_ASSEMBLY, ERROR_SXS_FILE_NOT_PART_OF_ASSEMBLY); + cmp2(STATUS_ADVANCED_INSTALLER_FAILED, ERROR_ADVANCED_INSTALLER_FAILED); + cmp2(STATUS_XML_ENCODING_MISMATCH, ERROR_XML_ENCODING_MISMATCH); + cmp2(STATUS_SXS_MANIFEST_TOO_BIG, ERROR_SXS_MANIFEST_TOO_BIG); + cmp2(STATUS_SXS_SETTING_NOT_REGISTERED, ERROR_SXS_SETTING_NOT_REGISTERED); + cmp2(STATUS_SXS_TRANSACTION_CLOSURE_INCOMPLETE, ERROR_SXS_TRANSACTION_CLOSURE_INCOMPLETE); + cmp2(STATUS_SXS_PRIMITIVE_INSTALLER_FAILED, ERROR_SMI_PRIMITIVE_INSTALLER_FAILED); + cmp2(STATUS_GENERIC_COMMAND_FAILED, ERROR_GENERIC_COMMAND_FAILED); + cmp2(STATUS_SXS_FILE_HASH_MISSING, ERROR_SXS_FILE_HASH_MISSING); cmp2(STATUS_REDIRECTOR_STARTED, ERROR_SERVICE_ALREADY_RUNNING); cmp2(STATUS_AUDITING_DISABLED, ERROR_AUDITING_DISABLED); cmp2(STATUS_CLUSTER_NODE_ALREADY_UP, ERROR_CLUSTER_NODE_ALREADY_UP); diff -Nru wine1.3-1.3.0/dlls/ntdll/tests/generated.c wine1.3-1.3.1/dlls/ntdll/tests/generated.c --- wine1.3-1.3.0/dlls/ntdll/tests/generated.c 2010-07-30 18:43:56.000000000 +0100 +++ wine1.3-1.3.1/dlls/ntdll/tests/generated.c 2010-08-20 18:23:50.000000000 +0100 @@ -375,7 +375,6 @@ /* CCHAR */ TEST_TYPE_SIZE (CCHAR, 1) TEST_TYPE_ALIGN (CCHAR, 1) - TEST_TYPE_SIGNED(CCHAR) } static void test_pack_CHAR(void) @@ -383,7 +382,6 @@ /* CHAR */ TEST_TYPE_SIZE (CHAR, 1) TEST_TYPE_ALIGN (CHAR, 1) - TEST_TYPE_SIGNED(CHAR) } static void test_pack_DWORDLONG(void) @@ -3786,7 +3784,6 @@ /* CCHAR */ TEST_TYPE_SIZE (CCHAR, 1) TEST_TYPE_ALIGN (CCHAR, 1) - TEST_TYPE_SIGNED(CCHAR) } static void test_pack_CHAR(void) @@ -3794,7 +3791,6 @@ /* CHAR */ TEST_TYPE_SIZE (CHAR, 1) TEST_TYPE_ALIGN (CHAR, 1) - TEST_TYPE_SIGNED(CHAR) } static void test_pack_DWORDLONG(void) diff -Nru wine1.3-1.3.0/dlls/ntdll/tests/rtl.c wine1.3-1.3.1/dlls/ntdll/tests/rtl.c --- wine1.3-1.3.0/dlls/ntdll/tests/rtl.c 2010-07-30 18:43:56.000000000 +0100 +++ wine1.3-1.3.1/dlls/ntdll/tests/rtl.c 2010-08-20 18:23:50.000000000 +0100 @@ -24,6 +24,7 @@ #include #include "ntdll_test.h" +#include "inaddr.h" #ifndef __WINE_WINTERNL_H @@ -45,6 +46,20 @@ #endif +/* avoid #include */ +#undef htons +#ifdef WORDS_BIGENDIAN +#define htons(s) ((USHORT)(s)) +#else /* WORDS_BIGENDIAN */ +static inline USHORT __my_ushort_swap(USHORT s) +{ + return (s >> 8) | (s << 8); +} +#define htons(s) __my_ushort_swap(s) +#endif /* WORDS_BIGENDIAN */ + + + /* Function ptrs for ntdll calls */ static HMODULE hntdll = 0; static SIZE_T (WINAPI *pRtlCompareMemory)(LPCVOID,LPCVOID,SIZE_T); @@ -70,8 +85,14 @@ static struct _TEB * (WINAPI *pNtCurrentTeb)(void); static DWORD (WINAPI *pRtlGetThreadErrorMode)(void); static NTSTATUS (WINAPI *pRtlSetThreadErrorMode)(DWORD, LPDWORD); +static IMAGE_BASE_RELOCATION *(WINAPI *pLdrProcessRelocationBlock)(void*,UINT,USHORT*,INT_PTR); +static CHAR * (WINAPI *pRtlIpv4AddressToStringA)(const IN_ADDR *, LPSTR); +static NTSTATUS (WINAPI *pRtlIpv4AddressToStringExA)(const IN_ADDR *, USHORT, LPSTR, PULONG); + static HMODULE hkernel32 = 0; static BOOL (WINAPI *pIsWow64Process)(HANDLE, PBOOL); + + #define LEN 16 static const char* src_src = "This is a test!"; /* 16 bytes long, incl NUL */ static ULONG src_aligned_block[4]; @@ -107,6 +128,9 @@ pNtCurrentTeb = (void *)GetProcAddress(hntdll, "NtCurrentTeb"); pRtlGetThreadErrorMode = (void *)GetProcAddress(hntdll, "RtlGetThreadErrorMode"); pRtlSetThreadErrorMode = (void *)GetProcAddress(hntdll, "RtlSetThreadErrorMode"); + pLdrProcessRelocationBlock = (void *)GetProcAddress(hntdll, "LdrProcessRelocationBlock"); + pRtlIpv4AddressToStringA = (void *)GetProcAddress(hntdll, "RtlIpv4AddressToStringA"); + pRtlIpv4AddressToStringExA = (void *)GetProcAddress(hntdll, "RtlIpv4AddressToStringExA"); } hkernel32 = LoadLibraryA("kernel32.dll"); ok(hkernel32 != 0, "LoadLibrary failed\n"); @@ -1094,6 +1118,201 @@ pRtlSetThreadErrorMode(oldmode, NULL); } +static void test_LdrProcessRelocationBlock(void) +{ + IMAGE_BASE_RELOCATION *ret; + USHORT reloc; + DWORD addr32; + SHORT addr16; + + if(!pLdrProcessRelocationBlock) { + win_skip("LdrProcessRelocationBlock not available\n"); + return; + } + + addr32 = 0x50005; + reloc = IMAGE_REL_BASED_HIGHLOW<<12; + ret = pLdrProcessRelocationBlock(&addr32, 1, &reloc, 0x500050); + ok((USHORT*)ret == &reloc+1, "ret = %p, expected %p\n", ret, &reloc+1); + ok(addr32 == 0x550055, "addr32 = %x, expected 0x550055\n", addr32); + + addr16 = 0x505; + reloc = IMAGE_REL_BASED_HIGH<<12; + ret = pLdrProcessRelocationBlock(&addr16, 1, &reloc, 0x500060); + ok((USHORT*)ret == &reloc+1, "ret = %p, expected %p\n", ret, &reloc+1); + ok(addr16 == 0x555, "addr16 = %x, expected 0x555\n", addr16); + + addr16 = 0x505; + reloc = IMAGE_REL_BASED_LOW<<12; + ret = pLdrProcessRelocationBlock(&addr16, 1, &reloc, 0x500060); + ok((USHORT*)ret == &reloc+1, "ret = %p, expected %p\n", ret, &reloc+1); + ok(addr16 == 0x565, "addr16 = %x, expected 0x565\n", addr16); +} + +static void test_RtlIpv4AddressToString(void) +{ + CHAR buffer[20]; + CHAR *res; + IN_ADDR ip; + DWORD len; + + if (!pRtlIpv4AddressToStringA) + { + win_skip("RtlIpv4AddressToStringA not available\n"); + return; + } + + ip.S_un.S_un_b.s_b1 = 1; + ip.S_un.S_un_b.s_b2 = 2; + ip.S_un.S_un_b.s_b3 = 3; + ip.S_un.S_un_b.s_b4 = 4; + + memset(buffer, '#', sizeof(buffer) - 1); + buffer[sizeof(buffer) -1] = 0; + res = pRtlIpv4AddressToStringA(&ip, buffer); + len = strlen(buffer); + ok(res == (buffer + len), "got %p with '%s' (expected %p)\n", res, buffer, buffer + len); + + res = pRtlIpv4AddressToStringA(&ip, NULL); + ok( (res == (char *)~0) || + broken(res == (char *)0 + len), /* XP and w2003 */ + "got %p (expected ~0)\n", res); + + if (0) { + /* this crashes in windows */ + memset(buffer, '#', sizeof(buffer) - 1); + buffer[sizeof(buffer) -1] = 0; + res = pRtlIpv4AddressToStringA(NULL, buffer); + trace("got %p with '%s'\n", res, buffer); + } + + if (0) { + /* this crashes in windows */ + res = pRtlIpv4AddressToStringA(NULL, NULL); + trace("got %p\n", res); + } +} + +static void test_RtlIpv4AddressToStringEx(void) +{ + CHAR ip_1234[] = "1.2.3.4"; + CHAR ip_1234_80[] = "1.2.3.4:80"; + LPSTR expect; + CHAR buffer[30]; + NTSTATUS res; + IN_ADDR ip; + ULONG size; + DWORD used; + USHORT port; + + if (!pRtlIpv4AddressToStringExA) + { + win_skip("RtlIpv4AddressToStringExA not available\n"); + return; + } + + ip.S_un.S_un_b.s_b1 = 1; + ip.S_un.S_un_b.s_b2 = 2; + ip.S_un.S_un_b.s_b3 = 3; + ip.S_un.S_un_b.s_b4 = 4; + + port = htons(80); + expect = ip_1234_80; + + size = sizeof(buffer); + memset(buffer, '#', sizeof(buffer) - 1); + buffer[sizeof(buffer) -1] = 0; + res = pRtlIpv4AddressToStringExA(&ip, port, buffer, &size); + used = strlen(buffer); + ok( (res == STATUS_SUCCESS) && + (size == strlen(expect) + 1) && !strcmp(buffer, expect), + "got 0x%x and size %d with '%s'\n", res, size, buffer); + + size = used + 1; + memset(buffer, '#', sizeof(buffer) - 1); + buffer[sizeof(buffer) -1] = 0; + res = pRtlIpv4AddressToStringExA(&ip, port, buffer, &size); + ok( (res == STATUS_SUCCESS) && + (size == strlen(expect) + 1) && !strcmp(buffer, expect), + "got 0x%x and size %d with '%s'\n", res, size, buffer); + + size = used; + memset(buffer, '#', sizeof(buffer) - 1); + buffer[sizeof(buffer) -1] = 0; + res = pRtlIpv4AddressToStringExA(&ip, port, buffer, &size); + ok( (res == STATUS_INVALID_PARAMETER) && (size == used + 1), + "got 0x%x and %d with '%s' (expected STATUS_INVALID_PARAMETER and %d)\n", + res, size, buffer, used + 1); + + size = used - 1; + memset(buffer, '#', sizeof(buffer) - 1); + buffer[sizeof(buffer) -1] = 0; + res = pRtlIpv4AddressToStringExA(&ip, port, buffer, &size); + ok( (res == STATUS_INVALID_PARAMETER) && (size == used + 1), + "got 0x%x and %d with '%s' (expected STATUS_INVALID_PARAMETER and %d)\n", + res, size, buffer, used + 1); + + + /* to get only the ip, use 0 as port */ + port = 0; + expect = ip_1234; + + size = sizeof(buffer); + memset(buffer, '#', sizeof(buffer) - 1); + buffer[sizeof(buffer) -1] = 0; + res = pRtlIpv4AddressToStringExA(&ip, port, buffer, &size); + used = strlen(buffer); + ok( (res == STATUS_SUCCESS) && + (size == strlen(expect) + 1) && !strcmp(buffer, expect), + "got 0x%x and size %d with '%s'\n", res, size, buffer); + + size = used + 1; + memset(buffer, '#', sizeof(buffer) - 1); + buffer[sizeof(buffer) -1] = 0; + res = pRtlIpv4AddressToStringExA(&ip, port, buffer, &size); + ok( (res == STATUS_SUCCESS) && + (size == strlen(expect) + 1) && !strcmp(buffer, expect), + "got 0x%x and size %d with '%s'\n", res, size, buffer); + + size = used; + memset(buffer, '#', sizeof(buffer) - 1); + buffer[sizeof(buffer) -1] = 0; + res = pRtlIpv4AddressToStringExA(&ip, port, buffer, &size); + ok( (res == STATUS_INVALID_PARAMETER) && (size == used + 1), + "got 0x%x and %d with '%s' (expected STATUS_INVALID_PARAMETER and %d)\n", + res, size, buffer, used + 1); + + size = used - 1; + memset(buffer, '#', sizeof(buffer) - 1); + buffer[sizeof(buffer) -1] = 0; + res = pRtlIpv4AddressToStringExA(&ip, port, buffer, &size); + ok( (res == STATUS_INVALID_PARAMETER) && (size == used + 1), + "got 0x%x and %d with '%s' (expected STATUS_INVALID_PARAMETER and %d)\n", + res, size, buffer, used + 1); + + + /* parameters are checked */ + memset(buffer, '#', sizeof(buffer) - 1); + buffer[sizeof(buffer) -1] = 0; + res = pRtlIpv4AddressToStringExA(&ip, 0, buffer, NULL); + ok(res == STATUS_INVALID_PARAMETER, + "got 0x%x with '%s' (expected STATUS_INVALID_PARAMETER)\n", res, buffer); + + size = sizeof(buffer); + res = pRtlIpv4AddressToStringExA(&ip, 0, NULL, &size); + ok( res == STATUS_INVALID_PARAMETER, + "got 0x%x and size %d (expected STATUS_INVALID_PARAMETER)\n", res, size); + + size = sizeof(buffer); + memset(buffer, '#', sizeof(buffer) - 1); + buffer[sizeof(buffer) -1] = 0; + res = pRtlIpv4AddressToStringExA(NULL, 0, buffer, &size); + ok( res == STATUS_INVALID_PARAMETER, + "got 0x%x and size %d with '%s' (expected STATUS_INVALID_PARAMETER)\n", + res, size, buffer); +} + + START_TEST(rtl) { InitFunctionPtrs(); @@ -1114,4 +1333,7 @@ test_RtlAllocateAndInitializeSid(); test_RtlDeleteTimer(); test_RtlThreadErrorMode(); + test_LdrProcessRelocationBlock(); + test_RtlIpv4AddressToString(); + test_RtlIpv4AddressToStringEx(); } diff -Nru wine1.3-1.3.0/dlls/oleaut32/tests/typelib.c wine1.3-1.3.1/dlls/oleaut32/tests/typelib.c --- wine1.3-1.3.0/dlls/oleaut32/tests/typelib.c 2010-07-30 18:43:56.000000000 +0100 +++ wine1.3-1.3.1/dlls/oleaut32/tests/typelib.c 2010-08-20 18:23:50.000000000 +0100 @@ -692,10 +692,10 @@ return ret; } -static BOOL do_typelib_reg_key(GUID *uid, WORD maj, WORD min, LPCWSTR base, BOOL remove) +static BOOL do_typelib_reg_key(GUID *uid, WORD maj, WORD min, DWORD arch, LPCWSTR base, BOOL remove) { static const WCHAR typelibW[] = {'T','y','p','e','l','i','b','\\',0}; - static const WCHAR formatW[] = {'\\','%','u','.','%','u','\\','0','\\','w','i','n','3','2',0}; + static const WCHAR formatW[] = {'\\','%','u','.','%','u','\\','0','\\','w','i','n','%','u',0}; static const WCHAR format2W[] = {'%','s','_','%','u','_','%','u','.','d','l','l',0}; WCHAR buf[128]; HKEY hkey; @@ -711,7 +711,7 @@ return TRUE; } - wsprintfW(buf + lstrlenW(buf), formatW, maj, min ); + wsprintfW(buf + lstrlenW(buf), formatW, maj, min, arch); SetLastError(0xdeadbeef); res = RegCreateKeyExW(HKEY_CLASSES_ROOT, buf, 0, NULL, 0, @@ -724,7 +724,7 @@ if (res != ERROR_SUCCESS) { - trace("RegCreateKeyExW failed\n"); + trace("RegCreateKeyExW failed: %u\n", res); return FALSE; } @@ -739,7 +739,7 @@ return ret; } -static void test_QueryPathOfRegTypeLib(void) +static void test_QueryPathOfRegTypeLib(DWORD arch) { static const struct test_data { @@ -760,6 +760,7 @@ { 4, 0, TYPE_E_LIBNOTREGISTERED, { 0 } } }; static const WCHAR base[] = {'f','a','k','e',0}; + static const WCHAR wrongW[] = {'w','r','o','n','g',0}; UINT i; RPC_STATUS status; GUID uid; @@ -773,10 +774,11 @@ StringFromGUID2(&uid, uid_str, 40); /*trace("GUID: %s\n", wine_dbgstr_w(uid_str));*/ - if (!do_typelib_reg_key(&uid, 3, 0, base, 0)) return; - if (!do_typelib_reg_key(&uid, 3, 1, base, 0)) return; - if (!do_typelib_reg_key(&uid, 3, 37, base, 0)) return; - if (!do_typelib_reg_key(&uid, 5, 37, base, 0)) return; + if (!do_typelib_reg_key(&uid, 3, 0, arch, base, 0)) return; + if (!do_typelib_reg_key(&uid, 3, 1, arch, base, 0)) return; + if (!do_typelib_reg_key(&uid, 3, 37, arch, base, 0)) return; + if (!do_typelib_reg_key(&uid, 5, 37, arch, base, 0)) return; + if (arch == 64 && !do_typelib_reg_key(&uid, 5, 37, 32, wrongW, 0)) return; for (i = 0; i < sizeof(td)/sizeof(td[0]); i++) { @@ -789,7 +791,7 @@ } } - do_typelib_reg_key(&uid, 0, 0, NULL, 1); + do_typelib_reg_key(&uid, 0, 0, arch, NULL, 1); } static void test_inheritance(void) @@ -1076,10 +1078,12 @@ static OLECHAR prop1W[] = {'P','r','o','p','1',0}; static OLECHAR param1W[] = {'p','a','r','a','m','1',0}; static OLECHAR param2W[] = {'p','a','r','a','m','2',0}; + static OLECHAR asdfW[] = {'A','s','d','f',0}; static OLECHAR *names1[] = {func1W, param1W, param2W}; static OLECHAR *names2[] = {func2W, param1W, param2W}; static OLECHAR *propname[] = {prop1W, param1W}; static const GUID custguid = {0xbf611abe,0x5b38,0x11df,{0x91,0x5c,0x08,0x02,0x79,0x79,0x94,0x70}}; + static const GUID bogusguid = {0xbf611abe,0x5b38,0x11df,{0x91,0x5c,0x08,0x02,0x79,0x79,0x94,0x71}}; char filename[MAX_PATH]; WCHAR filenameW[MAX_PATH]; @@ -1444,15 +1448,12 @@ ok(hres == S_OK, "got %08x\n", hres); hres = ITypeInfo2_GetCustData(ti2, NULL, NULL); - todo_wine ok(hres == E_INVALIDARG, "got %08x\n", hres); hres = ITypeInfo2_GetCustData(ti2, &custguid, NULL); - todo_wine ok(hres == E_INVALIDARG, "got %08x\n", hres); hres = ITypeInfo2_GetCustData(ti2, &custguid, &cust_data); - todo_wine ok(hres == S_OK, "got %08x\n", hres); hres = ICreateTypeInfo2_SetCustData(createti2, NULL, NULL); @@ -1474,12 +1475,9 @@ V_VT(&cust_data) = VT_EMPTY; hres = ITypeInfo2_GetCustData(ti2, &custguid, &cust_data); - todo_wine ok(hres == S_OK, "got %08x\n", hres); - todo_wine ok(V_VT(&cust_data) == VT_UI4, "got %d\n", V_VT(&cust_data)); - todo_wine ok(V_I4(&cust_data) == 0xdeadbeef, "got 0x%08x\n", V_I4(&cust_data)); V_VT(&cust_data) = VT_UI4; @@ -1492,14 +1490,36 @@ V_VT(&cust_data) = VT_EMPTY; hres = ITypeInfo2_GetCustData(ti2, &custguid, &cust_data); - todo_wine ok(hres == S_OK, "got %08x\n", hres); - todo_wine ok(V_VT(&cust_data) == VT_UI4, "got %d\n", V_VT(&cust_data)); - todo_wine ok(V_I4(&cust_data) == 12345678, "got 0x%08x\n", V_I4(&cust_data)); + V_VT(&cust_data) = VT_BSTR; + V_BSTR(&cust_data) = SysAllocString(asdfW); + + hres = ICreateTypeInfo2_SetCustData(createti2, &custguid, &cust_data); + ok(hres == S_OK, "got %08x\n", hres); + + SysFreeString(V_BSTR(&cust_data)); + V_I4(&cust_data) = 0; + V_VT(&cust_data) = VT_EMPTY; + + hres = ITypeInfo2_GetCustData(ti2, &custguid, &cust_data); + ok(hres == S_OK, "got %08x\n", hres); + + ok(V_VT(&cust_data) == VT_BSTR, "got %d\n", V_VT(&cust_data)); + ok(!lstrcmpW(V_BSTR(&cust_data), asdfW), "got %s\n", wine_dbgstr_w(V_BSTR(&cust_data))); + SysFreeString(V_BSTR(&cust_data)); + + V_VT(&cust_data) = VT_UI4; + V_UI4(&cust_data) = 17; + + hres = ITypeInfo2_GetCustData(ti2, &bogusguid, &cust_data); + ok(hres == S_OK, "got %08x\n", hres); + + ok(V_VT(&cust_data) == VT_EMPTY, "got: %d\n", V_VT(&cust_data)); + ITypeInfo2_Release(ti2); ICreateTypeInfo2_Release(createti2); ICreateTypeInfo_Release(createti); @@ -2322,7 +2342,9 @@ test_TypeComp(); test_CreateDispTypeInfo(); test_TypeInfo(); - test_QueryPathOfRegTypeLib(); + test_QueryPathOfRegTypeLib(32); + if(sizeof(void*) == 8) + test_QueryPathOfRegTypeLib(64); test_inheritance(); test_CreateTypeLib(); diff -Nru wine1.3-1.3.0/dlls/oleaut32/typelib2.c wine1.3-1.3.1/dlls/oleaut32/typelib2.c --- wine1.3-1.3.0/dlls/oleaut32/typelib2.c 2010-07-30 18:43:56.000000000 +0100 +++ wine1.3-1.3.1/dlls/oleaut32/typelib2.c 2010-08-20 18:23:50.000000000 +0100 @@ -118,15 +118,16 @@ /*================== Implementation Structures ===================================*/ /* Used for storing cyclic list. Tail address is kept */ -enum tagCyclicListElementType { +typedef enum tagCyclicListElementType { + CyclicListSentinel, CyclicListFunc, CyclicListVar -}; +} CyclicListElementType; typedef struct tagCyclicList { struct tagCyclicList *next; int indice; int name; - enum tagCyclicListElementType type; + CyclicListElementType type; union { int val; @@ -218,6 +219,14 @@ static ULONG WINAPI ICreateTypeLib2_fnRelease(ICreateTypeLib2 *iface); +static CyclicList *alloc_cyclic_list_item(CyclicListElementType type) +{ + CyclicList *ret = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(CyclicList)); + if (!ret) + return NULL; + ret->type = type; + return ret; +} /*================== Internal functions ===================================*/ @@ -921,6 +930,84 @@ } } +static int ctl2_find_custdata( + ICreateTypeLib2Impl *This, + REFGUID guid, + int offset) +{ + while (offset != -1) { + MSFT_CDGuid *cdentry = + (MSFT_CDGuid *)&This->typelib_segment_data[MSFT_SEG_CUSTDATAGUID][offset]; + MSFT_GuidEntry *guidentry = + (MSFT_GuidEntry *)&This->typelib_segment_data[MSFT_SEG_GUID][cdentry->GuidOffset]; + + if (IsEqualGUID(guidentry, guid)) + return offset; + + offset = cdentry->next; + } + + return -1; +} + +/**************************************************************************** + * ctl2_decode_variant + * + * Decodes a variant + * + * RETURNS + * + * Success: S_OK + * Failure: Error code from winerror.h + */ +static HRESULT ctl2_decode_variant( + ICreateTypeLib2Impl *This, /* [I] The typelib that contains the variant */ + int data_offs, /* [I] Offset within the data array, or the encoded value itself */ + VARIANT *value) /* [O] Decoded value */ +{ + char *encoded_data; + VARTYPE type; + + if (data_offs & 0x80000000) { + /* data_offs contains the encoded value */ + V_VT(value) = (data_offs & ~0x80000000) >> 26; + V_UI4(value) = data_offs & ~0xFF000000; + return S_OK; + } + + encoded_data = &This->typelib_segment_data[MSFT_SEG_CUSTDATA][data_offs]; + type = *encoded_data; + + switch(type) { + case VT_I4: + case VT_R4: + case VT_UI4: + case VT_INT: + case VT_UINT: + case VT_HRESULT: + case VT_PTR: { + V_VT(value) = type; + V_UI4(value) = *(unsigned*)(encoded_data + 2); + return S_OK; + } + case VT_BSTR: { + unsigned len, i; + + len = *(unsigned*)(encoded_data + 2); + + V_VT(value) = type; + V_BSTR(value) = SysAllocStringByteLen(NULL, len * sizeof(OLECHAR)); + for (i = 0; i < len; ++i) + V_BSTR(value)[i] = *(encoded_data + 6 + i); + + return S_OK; + } + default: + FIXME("Don't yet have decoder for this VARTYPE: %u\n", type); + return E_NOTIMPL; + } +} + /**************************************************************************** * ctl2_set_custdata * @@ -943,6 +1030,7 @@ int guidoffset; int custoffset; int *custdata; + BOOL new_segment = FALSE; switch(V_VT(pVarVal)) { @@ -971,14 +1059,21 @@ if (status) return status; - custoffset = ctl2_alloc_segment(This, MSFT_SEG_CUSTDATAGUID, 12, 0); - if (custoffset == -1) return E_OUTOFMEMORY; + custoffset = ctl2_find_custdata(This, guid, *offset); + if (custoffset == -1) { + custoffset = ctl2_alloc_segment(This, MSFT_SEG_CUSTDATAGUID, 12, 0); + if (custoffset == -1) + return E_OUTOFMEMORY; + new_segment = TRUE; + } custdata = (int *)&This->typelib_segment_data[MSFT_SEG_CUSTDATAGUID][custoffset]; custdata[0] = guidoffset; custdata[1] = dataoffset; - custdata[2] = *offset; - *offset = custoffset; + if (new_segment) { + custdata[2] = *offset; + *offset = custoffset; + } return S_OK; } @@ -1109,7 +1204,7 @@ mix_field = typedata[0]>>16; break; default: - mix_field = 0x7fff; + mix_field = ((typedata[0] >> 16) == 0x7fff) ? 0x7fff : 0x7ffe; break; } } @@ -1765,19 +1860,18 @@ } if (!This->typedata) { - This->typedata = HeapAlloc(GetProcessHeap(), 0, sizeof(CyclicList)); + This->typedata = alloc_cyclic_list_item(CyclicListSentinel); if(!This->typedata) return E_OUTOFMEMORY; This->typedata->next = This->typedata; - This->typedata->u.val = 0; if(This->dual) This->dual->typedata = This->typedata; } /* allocate type data space for us */ - insert = HeapAlloc(GetProcessHeap(), 0, sizeof(CyclicList)); + insert = alloc_cyclic_list_item(CyclicListFunc); if(!insert) return E_OUTOFMEMORY; insert->u.data = HeapAlloc(GetProcessHeap(), 0, sizeof(int[6])+sizeof(int[(num_defaults?4:3)])*pFuncDesc->cParams); @@ -1833,7 +1927,6 @@ /* update the index data */ insert->indice = pFuncDesc->memid; insert->name = -1; - insert->type = CyclicListFunc; /* insert type data to list */ if(index == This->typeinfo->cElement) { @@ -2048,19 +2141,18 @@ } if (!This->typedata) { - This->typedata = HeapAlloc(GetProcessHeap(), 0, sizeof(CyclicList)); + This->typedata = alloc_cyclic_list_item(CyclicListSentinel); if(!This->typedata) return E_OUTOFMEMORY; This->typedata->next = This->typedata; - This->typedata->u.val = 0; if(This->dual) This->dual->typedata = This->typedata; } /* allocate type data space for us */ - insert = HeapAlloc(GetProcessHeap(), 0, sizeof(CyclicList)); + insert = alloc_cyclic_list_item(CyclicListVar); if(!insert) return E_OUTOFMEMORY; insert->u.data = HeapAlloc(GetProcessHeap(), 0, sizeof(int[5])); @@ -2087,7 +2179,6 @@ /* update the index data */ insert->indice = 0x40000000 + index; insert->name = -1; - insert->type = CyclicListVar; /* figure out type widths and whatnot */ ctl2_encode_typedesc(This->typelib, &pVarDesc->elemdescVar.tdesc, @@ -3577,8 +3668,23 @@ REFGUID guid, /* [I] The GUID under which the custom data is stored. */ VARIANT* pVarVal) /* [O] The custom data. */ { - FIXME("(%p,%s,%p), stub!\n", iface, debugstr_guid(guid), pVarVal); - return E_OUTOFMEMORY; + ICreateTypeInfo2Impl *This = impl_from_ITypeInfo2(iface); + MSFT_CDGuid *cdentry; + int offset; + + TRACE("(%p,%s,%p)\n", iface, debugstr_guid(guid), pVarVal); + + if (!guid || !pVarVal) + return E_INVALIDARG; + + VariantClear(pVarVal); + + offset = ctl2_find_custdata(This->typelib, guid, This->typeinfo->oCustData); + if (offset == -1) + return S_OK; + + cdentry = (MSFT_CDGuid *)&This->typelib->typelib_segment_data[MSFT_SEG_CUSTDATAGUID][offset]; + return ctl2_decode_variant(This->typelib, cdentry->DataOffset, pVarVal); } /****************************************************************************** diff -Nru wine1.3-1.3.0/dlls/oleaut32/typelib.c wine1.3-1.3.1/dlls/oleaut32/typelib.c --- wine1.3-1.3.0/dlls/oleaut32/typelib.c 2010-07-30 18:43:56.000000000 +0100 +++ wine1.3-1.3.1/dlls/oleaut32/typelib.c 2010-08-20 18:23:50.000000000 +0100 @@ -367,6 +367,11 @@ */ HRESULT WINAPI QueryPathOfRegTypeLib( REFGUID guid, WORD wMaj, WORD wMin, LCID lcid, LPBSTR path ) { +#ifdef _WIN64 + HRESULT hres = query_typelib_path( guid, wMaj, wMin, SYS_WIN64, lcid, path ); + if(SUCCEEDED(hres)) + return hres; +#endif return query_typelib_path( guid, wMaj, wMin, SYS_WIN32, lcid, path ); } diff -Nru wine1.3-1.3.0/dlls/qmgr/tests/qmgr.c wine1.3-1.3.1/dlls/qmgr/tests/qmgr.c --- wine1.3-1.3.0/dlls/qmgr/tests/qmgr.c 2010-07-30 18:43:56.000000000 +0100 +++ wine1.3-1.3.1/dlls/qmgr/tests/qmgr.c 2010-08-20 18:23:50.000000000 +0100 @@ -38,6 +38,11 @@ /* Creating BITS instance */ hres = CoCreateInstance(&CLSID_BackgroundCopyManager, NULL, CLSCTX_LOCAL_SERVER, &IID_IBackgroundCopyManager, (void **) &manager); + + if(hres == __HRESULT_FROM_WIN32(ERROR_SERVICE_DISABLED)) { + skip("Needed Service is disabled\n"); + return; + } ok(hres == S_OK, "CoCreateInstance failed: %08x\n", hres); if(hres != S_OK) { skip("Unable to create bits instance.\n"); diff -Nru wine1.3-1.3.0/dlls/rpcrt4/ndr_stubless.c wine1.3-1.3.1/dlls/rpcrt4/ndr_stubless.c --- wine1.3-1.3.0/dlls/rpcrt4/ndr_stubless.c 2010-07-30 18:43:56.000000000 +0100 +++ wine1.3-1.3.1/dlls/rpcrt4/ndr_stubless.c 2010-08-20 18:23:50.000000000 +0100 @@ -1258,6 +1258,8 @@ if (pParam->param_direction == RPC_FC_IN_PARAM_BASETYPE) call_freer(pStubMsg, pArg, pTypeFormat); break; + case STUBLESS_INITOUT: + break; case STUBLESS_UNMARSHAL: if (pParam->param_direction == RPC_FC_IN_PARAM_BASETYPE) call_unmarshaller(pStubMsg, &pArg, pTypeFormat, 0); @@ -1512,13 +1514,6 @@ if (pThis) *(void **)args = ((CStdStubBuffer *)pThis)->pvServerObject; - /* order of phases: - * 1. STUBLESS_UNMARHSAL - unmarshal [in] params from buffer - * 2. STUBLESS_CALLSERVER - send/receive buffer - * 3. STUBLESS_CALCSIZE - get [out] buffer size - * 4. STUBLESS_GETBUFFER - allocate [out] buffer - * 5. STUBLESS_MARHSAL - marshal [out] params to buffer - */ for (phase = STUBLESS_UNMARSHAL; phase <= STUBLESS_FREE; phase++) { TRACE("phase = %d\n", phase); diff -Nru wine1.3-1.3.0/dlls/setupapi/Sv.rc wine1.3-1.3.1/dlls/setupapi/Sv.rc --- wine1.3-1.3.0/dlls/setupapi/Sv.rc 2010-07-30 18:43:56.000000000 +0100 +++ wine1.3-1.3.1/dlls/setupapi/Sv.rc 2010-08-20 18:23:50.000000000 +0100 @@ -22,6 +22,14 @@ LANGUAGE LANG_SWEDISH, SUBLANG_NEUTRAL +STRINGTABLE +{ + IDS_PROMPTDISK "Filen '%s' p %s behvs" + IDS_UNKNOWN "Oknd" + IDS_COPYFROM "Kopiera filer frn:" + IDS_INFO "Skriv skvgen dr filen finns och klicka sedan OK." +} + COPYFILEDLGORD DIALOG 20, 20, 208, 105 STYLE DS_MODALFRAME | DS_SETFONT | WS_POPUP | WS_VISIBLE | WS_CAPTION CAPTION "Kopierar filer..." @@ -34,3 +42,17 @@ LTEXT "", DESTSTRORD, 7, 41, 194, 22, WS_CHILD | WS_VISIBLE | WS_GROUP CONTROL "", PROGRESSORD, "setupx_progress", 7, 63, 194, 13, WS_CHILD | WS_VISIBLE | WS_TABSTOP END + +IDPROMPTFORDISK DIALOG 0, 0, 250, 120 +STYLE DS_MODALFRAME | WS_CAPTION | WS_SYSMENU +CAPTION "Filer behvs" +FONT 8, "MS Shell Dlg" +BEGIN + LTEXT "Stt i tillverkarens installationsdisk och\nkontrollera att rtt disk r vald nedan", IDC_FILENEEDED, 10, 10, 175, 22, WS_CHILD | WS_VISIBLE | WS_GROUP + LTEXT "", IDC_INFO, 10, 50, 175, 22, WS_CHILD | WS_VISIBLE | WS_GROUP + LTEXT "Kopiera tillverkarens filer frn:", IDC_COPYFROM, 10, 90, 175, 11, WS_CHILD | WS_VISIBLE | WS_GROUP + CONTROL "", IDC_PATH, "COMBOBOX", WS_TABSTOP | WS_GROUP | WS_VSCROLL | WS_VISIBLE | CBS_DISABLENOSCROLL | CBS_AUTOHSCROLL | CBS_DROPDOWN, 10, 100, 175, 14 + PUSHBUTTON "OK", IDOK, 195, 10, 50, 14, WS_CHILD | WS_VISIBLE | WS_TABSTOP + PUSHBUTTON "Avbryt", IDCANCEL, 195, 30, 50, 14, WS_CHILD | WS_VISIBLE | WS_TABSTOP + PUSHBUTTON "Blddra...", IDC_RUNDLG_BROWSE, 195, 100, 50, 14, WS_CHILD | WS_VISIBLE | WS_TABSTOP +END diff -Nru wine1.3-1.3.0/dlls/shdocvw/De.rc wine1.3-1.3.1/dlls/shdocvw/De.rc --- wine1.3-1.3.0/dlls/shdocvw/De.rc 2010-07-30 18:43:56.000000000 +0100 +++ wine1.3-1.3.1/dlls/shdocvw/De.rc 2010-08-20 18:23:50.000000000 +0100 @@ -40,20 +40,48 @@ { POPUP "&Neu" { - MENUITEM "&Fenster" ID_BROWSE_NEW_WINDOW + MENUITEM "&Fenster" ID_BROWSE_NEW_WINDOW } - MENUITEM "&Öffnen...", ID_BROWSE_OPEN - MENUITEM "&Speichern", ID_BROWSE_SAVE + MENUITEM "Ö&ffnen...", ID_BROWSE_OPEN + MENUITEM "&Speichern", ID_BROWSE_SAVE MENUITEM "Speichern &als...", ID_BROWSE_SAVE_AS MENUITEM SEPARATOR - MENUITEM "Seite &einrichten...", ID_BROWSE_PRINT_FORMAT - MENUITEM "Dr&ucken...", ID_BROWSE_PRINT - MENUITEM "Seiten&vorschau...", ID_BROWSE_PRINT_PREVIEW + MENUITEM "Seite &einrichten...", ID_BROWSE_PRINT_FORMAT + MENUITEM "Dr&ucken...", ID_BROWSE_PRINT + MENUITEM "Seiten&vorschau...", ID_BROWSE_PRINT_PREVIEW + MENUITEM SEPARATOR + MENUITEM "Ei&genschaften...", ID_BROWSE_PROPERTIES + } + POPUP "&Ansicht" + { + POPUP "&Symbolleisten" + { + MENUITEM "&Standard" ID_BROWSE_BAR_STD + MENUITEM "&Adressleiste" ID_BROWSE_BAR_ADDR + } + } + POPUP "&Favoriten" + { + MENUITEM "&Zu den Favoriten hinzufügen..." ID_BROWSE_ADDFAV MENUITEM SEPARATOR - MENUITEM "&Eigenschaften...", ID_BROWSE_PROPERTIES } POPUP "&Hilfe" { - MENUITEM "&Über Internet Explorer...", ID_BROWSE_ABOUT + MENUITEM "Über &Internet Explorer...", ID_BROWSE_ABOUT } } + +STRINGTABLE +{ + IDS_TB_BACK "Zurück" + IDS_TB_FORWARD "Vorwärts" + IDS_TB_STOP "Stopp" + IDS_TB_REFRESH "Neu laden" + IDS_TB_HOME "Start" + IDS_TB_PRINT "Drucken" +} + +STRINGTABLE +{ + IDS_ADDRESS "Adresse" +} diff -Nru wine1.3-1.3.0/dlls/shdocvw/En.rc wine1.3-1.3.1/dlls/shdocvw/En.rc --- wine1.3-1.3.0/dlls/shdocvw/En.rc 2010-07-30 18:43:56.000000000 +0100 +++ wine1.3-1.3.1/dlls/shdocvw/En.rc 2010-08-20 18:23:50.000000000 +0100 @@ -50,8 +50,36 @@ MENUITEM SEPARATOR MENUITEM "&Properties...", ID_BROWSE_PROPERTIES } + POPUP "&View" + { + POPUP "&Toolbars" + { + MENUITEM "&Standard bar" ID_BROWSE_BAR_STD + MENUITEM "&Address bar" ID_BROWSE_BAR_ADDR + } + } + POPUP "&Favorites" + { + MENUITEM "&Add to Favorites..." ID_BROWSE_ADDFAV + MENUITEM SEPARATOR + } POPUP "&Help" { MENUITEM "&About Internet Explorer...", ID_BROWSE_ABOUT } } + +STRINGTABLE +{ + IDS_TB_BACK "Back" + IDS_TB_FORWARD "Forward" + IDS_TB_STOP "Stop" + IDS_TB_REFRESH "Refresh" + IDS_TB_HOME "Home" + IDS_TB_PRINT "Print" +} + +STRINGTABLE +{ + IDS_ADDRESS "Address" +} diff -Nru wine1.3-1.3.0/dlls/shdocvw/Es.rc wine1.3-1.3.1/dlls/shdocvw/Es.rc --- wine1.3-1.3.0/dlls/shdocvw/Es.rc 1970-01-01 01:00:00.000000000 +0100 +++ wine1.3-1.3.1/dlls/shdocvw/Es.rc 2010-08-20 18:23:50.000000000 +0100 @@ -0,0 +1,89 @@ +/* + * Spanish resources for shdocvw + * + * Copyright 2010 José Rostagno + * + * 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 "resource.h" + +#pragma code_page(65001) + +LANGUAGE LANG_SPANISH, SUBLANG_NEUTRAL + +IDD_BROWSE_OPEN DIALOG 10, 10, 200, 70 +STYLE DS_MODALFRAME | WS_CAPTION +CAPTION "Abrir URL" +FONT 8, "MS Shell Dlg" +{ + LTEXT "Especifique la dirección que desea abrir en Internet Explorer",-1,25, 5, 150,15 + LTEXT "Abrir:", -1, 2, 32, 20, 15 + EDITTEXT IDC_BROWSE_OPEN_URL, 25, 30, 160, 13 + DEFPUSHBUTTON "&Aceptar", IDOK, 25, 50, 50, 15 + PUSHBUTTON "&Cancelar", IDCANCEL, 85, 50, 50, 15 +} + +IDR_BROWSE_MAIN_MENU MENU +{ + POPUP "&Archivo" + { + POPUP "&Nuevo" + { + MENUITEM "&Ventana" ID_BROWSE_NEW_WINDOW + } + MENUITEM "&Abrir...", ID_BROWSE_OPEN + MENUITEM "&Guardar", ID_BROWSE_SAVE + MENUITEM "Guardar &como...", ID_BROWSE_SAVE_AS + MENUITEM SEPARATOR + MENUITEM "&Formato de impresión...", ID_BROWSE_PRINT_FORMAT + MENUITEM "&Imprimir...", ID_BROWSE_PRINT + MENUITEM "&Vista previa de impresión...", ID_BROWSE_PRINT_PREVIEW + MENUITEM SEPARATOR + MENUITEM "&Propiedades...", ID_BROWSE_PROPERTIES + } + POPUP "&Ver" + { + POPUP "&Barra de herramientas" + { + MENUITEM "Barra &estándar" ID_BROWSE_BAR_STD + MENUITEM "Barra de &direcciones" ID_BROWSE_BAR_ADDR + } + } + POPUP "&Favoritos" + { + MENUITEM "&Añadir a Favoritos..." ID_BROWSE_ADDFAV + MENUITEM SEPARATOR + } + POPUP "A&yuda" + { + MENUITEM "Acerca &de Internet Explorer...", ID_BROWSE_ABOUT + } +} + +STRINGTABLE +{ + IDS_TB_BACK "Atrás" + IDS_TB_FORWARD "Adelante" + IDS_TB_STOP "Detener" + IDS_TB_REFRESH "Recargar" + IDS_TB_HOME "Inicio" + IDS_TB_PRINT "Imprimir" +} + +STRINGTABLE +{ + IDS_ADDRESS "Dirección" +} diff -Nru wine1.3-1.3.0/dlls/shdocvw/Fr.rc wine1.3-1.3.1/dlls/shdocvw/Fr.rc --- wine1.3-1.3.0/dlls/shdocvw/Fr.rc 2010-07-30 18:43:56.000000000 +0100 +++ wine1.3-1.3.1/dlls/shdocvw/Fr.rc 2010-08-20 18:23:50.000000000 +0100 @@ -55,8 +55,36 @@ MENUITEM SEPARATOR MENUITEM "&Propriétés...", ID_BROWSE_PROPERTIES } - POPUP "&Aide" + POPUP "&Afficher" + { + POPUP "&Barres d'outils" + { + MENUITEM "Barre &standard" ID_BROWSE_BAR_STD + MENUITEM "Barre d'&adresse" ID_BROWSE_BAR_ADDR + } + } + POPUP "&Favoris" + { + MENUITEM "&Ajouter aux favoris..." ID_BROWSE_ADDFAV + MENUITEM SEPARATOR + } + POPUP "A&ide" { MENUITEM "À &propos d'Internet Explorer...", ID_BROWSE_ABOUT } } + +STRINGTABLE +{ + IDS_TB_BACK "Précédent" + IDS_TB_FORWARD "Suivant" + IDS_TB_STOP "Arrêter" + IDS_TB_REFRESH "Recharger" + IDS_TB_HOME "Accueil" + IDS_TB_PRINT "Imprimer" +} + +STRINGTABLE +{ + IDS_ADDRESS "Adresse" +} diff -Nru wine1.3-1.3.0/dlls/shdocvw/ie.c wine1.3-1.3.1/dlls/shdocvw/ie.c --- wine1.3-1.3.0/dlls/shdocvw/ie.c 2010-07-30 18:43:56.000000000 +0100 +++ wine1.3-1.3.1/dlls/shdocvw/ie.c 2010-08-20 18:23:50.000000000 +0100 @@ -430,19 +430,11 @@ TRACE("(%p)->(%x)\n", This, Value); - if((menu = GetMenu(This->frame_hwnd))) - DestroyMenu(menu); - - menu = NULL; - if(Value) - menu = LoadMenuW(shdocvw_hinstance, MAKEINTRESOURCEW(IDR_BROWSE_MAIN_MENU)); + menu = This->menu; if(!SetMenu(This->frame_hwnd, menu)) - { - DestroyMenu(menu); return HRESULT_FROM_WIN32(GetLastError()); - } return S_OK; } Binary files /tmp/b7mT0KZlDl/wine1.3-1.3.0/dlls/shdocvw/ietoolbar.bmp and /tmp/EzbZKBRQw6/wine1.3-1.3.1/dlls/shdocvw/ietoolbar.bmp differ diff -Nru wine1.3-1.3.0/dlls/shdocvw/iexplore.c wine1.3-1.3.1/dlls/shdocvw/iexplore.c --- wine1.3-1.3.0/dlls/shdocvw/iexplore.c 2010-07-30 18:43:56.000000000 +0100 +++ wine1.3-1.3.1/dlls/shdocvw/iexplore.c 2010-08-20 18:23:50.000000000 +0100 @@ -34,6 +34,9 @@ #include "shdocvw.h" #include "mshtmcid.h" #include "shellapi.h" +#include "winreg.h" +#include "shlwapi.h" +#include "intshcut.h" #include "wine/debug.h" @@ -75,6 +78,265 @@ } } +static HMENU get_tb_menu(HMENU menu) +{ + HMENU menu_view = GetSubMenu(menu, 1); + + return GetSubMenu(menu_view, 0); +} + +static HMENU get_fav_menu(HMENU menu) +{ + return GetSubMenu(menu, 2); +} + +static LPWSTR get_fav_url_from_id(HMENU menu, UINT id) +{ + MENUITEMINFOW item; + + item.cbSize = sizeof(item); + item.fMask = MIIM_DATA; + + if(!GetMenuItemInfoW(menu, id, FALSE, &item)) + return NULL; + + return (LPWSTR)item.dwItemData; +} + +static void free_fav_menu_data(HMENU menu) +{ + LPWSTR url; + int i; + + for(i = 0; (url = get_fav_url_from_id(menu, ID_BROWSE_GOTOFAV_FIRST + i)); i++) + heap_free( url ); +} + +static int get_menu_item_count(HMENU menu) +{ + MENUITEMINFOW item; + int count = 0; + int i; + + item.cbSize = sizeof(item); + item.fMask = MIIM_DATA | MIIM_SUBMENU; + + for(i = 0; GetMenuItemInfoW(menu, i, TRUE, &item); i++) + { + if(item.hSubMenu) + count += get_menu_item_count(item.hSubMenu); + else + count++; + } + + return count; +} + +static void add_fav_to_menu(HMENU favmenu, HMENU menu, LPWSTR title, LPCWSTR url) +{ + MENUITEMINFOW item; + /* Subtract the number of standard elements in the Favorites menu */ + int favcount = get_menu_item_count(favmenu) - 2; + LPWSTR urlbuf; + + if(favcount > (ID_BROWSE_GOTOFAV_MAX - ID_BROWSE_GOTOFAV_FIRST)) + { + FIXME("Add support for more than %d Favorites\n", favcount); + return; + } + + urlbuf = heap_alloc((lstrlenW(url) + 1) * sizeof(WCHAR)); + + if(!urlbuf) + return; + + lstrcpyW(urlbuf, url); + + item.cbSize = sizeof(item); + item.fMask = MIIM_FTYPE | MIIM_STRING | MIIM_DATA | MIIM_ID; + item.fType = MFT_STRING; + item.dwTypeData = title; + item.wID = ID_BROWSE_GOTOFAV_FIRST + favcount; + item.dwItemData = (ULONG_PTR)urlbuf; + InsertMenuItemW(menu, -1, TRUE, &item); +} + +static void add_favs_to_menu(HMENU favmenu, HMENU menu, LPCWSTR dir) +{ + WCHAR path[MAX_PATH*2]; + const WCHAR search[] = {'*',0}; + WCHAR* filename; + HANDLE findhandle; + WIN32_FIND_DATAW finddata; + IUniformResourceLocatorW* urlobj; + IPersistFile* urlfile; + HRESULT res; + + lstrcpyW(path, dir); + PathAppendW(path, search); + + findhandle = FindFirstFileW(path, &finddata); + + if(findhandle == INVALID_HANDLE_VALUE) + return; + + res = CoCreateInstance(&CLSID_InternetShortcut, NULL, CLSCTX_INPROC_SERVER, &IID_IUniformResourceLocatorW, (PVOID*)&urlobj); + + if(SUCCEEDED(res)) + res = IUnknown_QueryInterface(urlobj, &IID_IPersistFile, (PVOID*)&urlfile); + + if(SUCCEEDED(res)) + { + filename = path + lstrlenW(path) - lstrlenW(search); + + do + { + lstrcpyW(filename, finddata.cFileName); + + if(finddata.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) + { + MENUITEMINFOW item; + const WCHAR ignore1[] = {'.','.',0}; + const WCHAR ignore2[] = {'.',0}; + + if(!lstrcmpW(filename, ignore1) || !lstrcmpW(filename, ignore2)) + continue; + + item.cbSize = sizeof(item); + item.fMask = MIIM_STRING | MIIM_SUBMENU; + item.dwTypeData = filename; + item.hSubMenu = CreatePopupMenu(); + InsertMenuItemW(menu, -1, TRUE, &item); + add_favs_to_menu(favmenu, item.hSubMenu, path); + } else + { + WCHAR* fileext; + WCHAR* url = NULL; + const WCHAR urlext[] = {'.','u','r','l',0}; + + if(lstrcmpiW(PathFindExtensionW(filename), urlext)) + continue; + + if(FAILED(IPersistFile_Load(urlfile, path, 0))) + continue; + + urlobj->lpVtbl->GetURL(urlobj, &url); + + if(!url) + continue; + + fileext = filename + lstrlenW(filename) - lstrlenW(urlext); + *fileext = 0; + add_fav_to_menu(favmenu, menu, filename, url); + } + } while(FindNextFileW(findhandle, &finddata)); + } + + if(urlfile) + IPersistFile_Release(urlfile); + + if(urlobj) + IUnknown_Release(urlobj); + + FindClose(findhandle); +} + +static void add_tbs_to_menu(HMENU menu) +{ + HUSKEY toolbar_handle; + WCHAR toolbar_key[] = {'S','o','f','t','w','a','r','e','\\', + 'M','i','c','r','o','s','o','f','t','\\', + 'I','n','t','e','r','n','e','t',' ', + 'E','x','p','l','o','r','e','r','\\', + 'T','o','o','l','b','a','r',0}; + + if(SHRegOpenUSKeyW(toolbar_key, KEY_READ, NULL, &toolbar_handle, TRUE) == ERROR_SUCCESS) + { + HUSKEY classes_handle; + WCHAR classes_key[] = {'S','o','f','t','w','a','r','e','\\', + 'C','l','a','s','s','e','s','\\','C','L','S','I','D',0}; + WCHAR guid[39]; + DWORD value_len = sizeof(guid)/sizeof(guid[0]); + int i; + + if(SHRegOpenUSKeyW(classes_key, KEY_READ, NULL, &classes_handle, TRUE) != ERROR_SUCCESS) + { + SHRegCloseUSKey(toolbar_handle); + ERR("Failed to open key %s\n", debugstr_w(classes_key)); + return; + } + + for(i = 0; SHRegEnumUSValueW(toolbar_handle, i, guid, &value_len, NULL, NULL, NULL, SHREGENUM_HKLM) == ERROR_SUCCESS; i++) + { + WCHAR tb_name[100]; + DWORD tb_name_len = sizeof(tb_name)/sizeof(tb_name[0]); + HUSKEY tb_class_handle; + MENUITEMINFOW item; + LSTATUS ret; + value_len = sizeof(guid)/sizeof(guid[0]); + + if(lstrlenW(guid) != 38) + { + TRACE("Found invalid IE toolbar entry: %s\n", debugstr_w(guid)); + continue; + } + + if(SHRegOpenUSKeyW(guid, KEY_READ, classes_handle, &tb_class_handle, TRUE) != ERROR_SUCCESS) + { + ERR("Failed to get class info for %s\n", debugstr_w(guid)); + continue; + } + + ret = SHRegQueryUSValueW(tb_class_handle, NULL, NULL, tb_name, &tb_name_len, TRUE, NULL, 0); + + SHRegCloseUSKey(tb_class_handle); + + if(ret != ERROR_SUCCESS) + { + ERR("Failed to get toolbar name for %s\n", debugstr_w(guid)); + continue; + } + + item.cbSize = sizeof(item); + item.fMask = MIIM_STRING; + item.dwTypeData = tb_name; + InsertMenuItemW(menu, GetMenuItemCount(menu), TRUE, &item); + } + + SHRegCloseUSKey(classes_handle); + SHRegCloseUSKey(toolbar_handle); + } +} + +static HMENU create_ie_menu(void) +{ + HMENU menu = LoadMenuW(shdocvw_hinstance, MAKEINTRESOURCEW(IDR_BROWSE_MAIN_MENU)); + HMENU favmenu = get_fav_menu(menu); + WCHAR path[MAX_PATH]; + + add_tbs_to_menu(get_tb_menu(menu)); + + if(SHGetFolderPathW(NULL, CSIDL_COMMON_FAVORITES, NULL, SHGFP_TYPE_CURRENT, path) == S_OK) + add_favs_to_menu(favmenu, favmenu, path); + + if(SHGetFolderPathW(NULL, CSIDL_FAVORITES, NULL, SHGFP_TYPE_CURRENT, path) == S_OK) + add_favs_to_menu(favmenu, favmenu, path); + + return menu; +} + +static void ie_navigate(InternetExplorer* This, LPCWSTR url) +{ + VARIANT variant; + + V_VT(&variant) = VT_BSTR; + V_BSTR(&variant) = SysAllocString(url); + + IWebBrowser2_Navigate2(WEBBROWSER2(This), &variant, NULL, NULL, NULL, NULL); + + SysFreeString(V_BSTR(&variant)); +} + static INT_PTR CALLBACK ie_dialog_open_proc(HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam) { static InternetExplorer* This; @@ -109,7 +371,7 @@ V_VT(&url) = VT_BSTR; V_BSTR(&url) = SysAllocStringLen(NULL, len); - GetWindowTextW(hwndurl, V_BSTR(&url), len); + GetWindowTextW(hwndurl, V_BSTR(&url), len + 1); IWebBrowser2_Navigate2(WEBBROWSER2(This), &url, NULL, NULL, NULL, NULL); SysFreeString(V_BSTR(&url)); @@ -133,13 +395,46 @@ DestroyIcon(icon); } +static void add_tb_separator(HWND hwnd) +{ + TBBUTTON btn; + + ZeroMemory(&btn, sizeof(btn)); + + btn.iBitmap = 3; + btn.fsStyle = BTNS_SEP; + SendMessageW(hwnd, TB_ADDBUTTONSW, 1, (LPARAM)&btn); +} + +static void add_tb_button(HWND hwnd, int bmp, int cmd, int strId) +{ + TBBUTTON btn; + WCHAR buf[30]; + + LoadStringW(shdocvw_hinstance, strId, buf, sizeof(buf)/sizeof(buf[0])); + + btn.iBitmap = bmp; + btn.idCommand = cmd; + btn.fsState = TBSTATE_ENABLED; + btn.fsStyle = BTNS_SHOWTEXT; + btn.dwData = 0; + btn.iString = (INT_PTR)buf; + + SendMessageW(hwnd, TB_ADDBUTTONSW, 1, (LPARAM)&btn); +} + static void create_rebar(HWND hwnd) { HWND hwndRebar; HWND hwndAddress; + HWND hwndToolbar; REBARINFO rebarinf; REBARBANDINFOW bandinf; - WCHAR addr[] = {'A','d','d','r','e','s','s',0}; + WCHAR addr[40]; + HIMAGELIST imagelist; + WCHAR idb_ietoolbar[] = {'I','D','B','_','I','E','T','O','O','L','B','A','R',0}; + + LoadStringW(shdocvw_hinstance, IDS_ADDRESS, addr, sizeof(addr)/sizeof(addr[0])); hwndRebar = CreateWindowExW(WS_EX_TOOLWINDOW, REBARCLASSNAMEW, NULL, WS_CHILD|WS_VISIBLE|WS_CLIPSIBLINGS|WS_CLIPCHILDREN|RBS_VARHEIGHT|CCS_TOP|CCS_NODIVIDER, 0, 0, 0, 0, hwnd, (HMENU)IDC_BROWSE_REBAR, shdocvw_hinstance, NULL); @@ -150,16 +445,40 @@ SendMessageW(hwndRebar, RB_SETBARINFO, 0, (LPARAM)&rebarinf); + hwndToolbar = CreateWindowExW(TBSTYLE_EX_MIXEDBUTTONS, TOOLBARCLASSNAMEW, NULL, TBSTYLE_FLAT | WS_CHILD | WS_VISIBLE, 0, 0, 0, 0, hwndRebar, (HMENU)IDC_BROWSE_TOOLBAR, shdocvw_hinstance, NULL); + + imagelist = ImageList_LoadImageW(shdocvw_hinstance, idb_ietoolbar, 32, 0, RGB(255,0,255), IMAGE_BITMAP, LR_DEFAULTCOLOR); + + SendMessageW(hwndToolbar, TB_SETIMAGELIST, 0, (LPARAM)imagelist); + SendMessageW(hwndToolbar, TB_BUTTONSTRUCTSIZE, sizeof(TBBUTTON), 0); + add_tb_button(hwndToolbar, 0, 0, IDS_TB_BACK); + add_tb_button(hwndToolbar, 1, 0, IDS_TB_FORWARD); + add_tb_button(hwndToolbar, 2, 0, IDS_TB_STOP); + add_tb_button(hwndToolbar, 3, 0, IDS_TB_REFRESH); + add_tb_button(hwndToolbar, 4, ID_BROWSE_HOME, IDS_TB_HOME); + add_tb_separator(hwndToolbar); + add_tb_button(hwndToolbar, 5, ID_BROWSE_PRINT, IDS_TB_PRINT); + SendMessageW(hwndToolbar, TB_SETBUTTONSIZE, 0, MAKELPARAM(55,50)); + SendMessageW(hwndToolbar, TB_AUTOSIZE, 0, 0); + + bandinf.cbSize = sizeof(bandinf); + bandinf.fMask = RBBIM_STYLE | RBBIM_CHILD | RBBIM_CHILDSIZE | RBBIM_SIZE; + bandinf.fStyle = RBBS_CHILDEDGE; + bandinf.cx = 100; + bandinf.cyMinChild = 52; + bandinf.hwndChild = hwndToolbar; + + SendMessageW(hwndRebar, RB_INSERTBANDW, -1, (LPARAM)&bandinf); + hwndAddress = CreateWindowExW(0, WC_COMBOBOXEXW, NULL, WS_BORDER|WS_CHILD|WS_VISIBLE|CBS_DROPDOWN, 0, 0, 100,20,hwndRebar, (HMENU)IDC_BROWSE_ADDRESSBAR, shdocvw_hinstance, NULL); - bandinf.fMask = RBBIM_STYLE | RBBIM_CHILD | RBBIM_CHILDSIZE | RBBIM_SIZE | RBBIM_TEXT; - bandinf.fStyle = RBBS_CHILDEDGE | RBBS_GRIPPERALWAYS; + bandinf.fMask |= RBBIM_TEXT; + bandinf.fStyle = RBBS_CHILDEDGE | RBBS_BREAK; bandinf.lpText = addr; - bandinf.cx = 100; bandinf.cyMinChild = 20; bandinf.hwndChild = hwndAddress; - SendMessageW(hwndRebar, RB_INSERTBANDW, 0, (LPARAM)&bandinf); + SendMessageW(hwndRebar, RB_INSERTBANDW, -1, (LPARAM)&bandinf); } static LRESULT iewnd_OnCreate(HWND hwnd, LPCREATESTRUCTW lpcs) @@ -167,6 +486,8 @@ InternetExplorer* This = (InternetExplorer*)lpcs->lpCreateParams; SetWindowLongPtrW(hwnd, 0, (LONG_PTR) lpcs->lpCreateParams); + This->menu = create_ie_menu(); + This->status_hwnd = CreateStatusWindowW(CCS_NODIVIDER|WS_CHILD|WS_VISIBLE, NULL, hwnd, IDC_BROWSE_STATUSBAR); SendMessageW(This->status_hwnd, SB_SIMPLE, TRUE, 0); @@ -222,8 +543,14 @@ static LRESULT iewnd_OnDestroy(InternetExplorer *This) { + HWND hwndRebar = GetDlgItem(This->frame_hwnd, IDC_BROWSE_REBAR); + HWND hwndToolbar = GetDlgItem(hwndRebar, IDC_BROWSE_TOOLBAR); + HIMAGELIST list = (HIMAGELIST)SendMessageW(hwndToolbar, TB_GETIMAGELIST, 0, 0); + TRACE("%p\n", This); + free_fav_menu_data(get_fav_menu(This->menu)); + ImageList_Destroy(list); This->frame_hwnd = NULL; PostQuitMessage(0); /* FIXME */ @@ -252,11 +579,22 @@ } break; + case ID_BROWSE_HOME: + IWebBrowser2_GoHome(WEBBROWSER2(This)); + break; + case ID_BROWSE_ABOUT: ie_dialog_about(hwnd); break; default: + if(LOWORD(wparam) >= ID_BROWSE_GOTOFAV_FIRST && LOWORD(wparam) <= ID_BROWSE_GOTOFAV_MAX) + { + LPCWSTR url = get_fav_url_from_id(get_fav_menu(This->menu), LOWORD(wparam)); + + if(url) + ie_navigate(This, url); + } return DefWindowProcW(hwnd, msg, wparam, lparam); } return 0; diff -Nru wine1.3-1.3.0/dlls/shdocvw/It.rc wine1.3-1.3.1/dlls/shdocvw/It.rc --- wine1.3-1.3.0/dlls/shdocvw/It.rc 1970-01-01 01:00:00.000000000 +0100 +++ wine1.3-1.3.1/dlls/shdocvw/It.rc 2010-08-20 18:23:50.000000000 +0100 @@ -0,0 +1,89 @@ +/* + * Copyright 2010 Alexander N. Sørnes + * Copyright 2010 Luca Bennati + * + * 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 "resource.h" + +/* UTF-8 */ +#pragma code_page(65001) + +LANGUAGE LANG_ITALIAN, SUBLANG_NEUTRAL + +IDD_BROWSE_OPEN DIALOG 10, 10, 200, 70 +STYLE DS_MODALFRAME | WS_CAPTION +CAPTION "Apri URL" +FONT 8, "MS Shell Dlg" +{ + LTEXT "Specifica l'URL che vuoi aprire in Internet Explorer",-1,25, 5, 150,15 + LTEXT "Apri:", -1, 2, 32, 20, 15 + EDITTEXT IDC_BROWSE_OPEN_URL, 25, 30, 160, 13 + DEFPUSHBUTTON "&OK", IDOK, 25, 50, 50, 15 + PUSHBUTTON "&Annulla", IDCANCEL, 85, 50, 50, 15 +} + +IDR_BROWSE_MAIN_MENU MENU +{ + POPUP "&File" + { + POPUP "&Nuova" + { + MENUITEM "Fin&estra" ID_BROWSE_NEW_WINDOW + } + MENUITEM "&Apri...", ID_BROWSE_OPEN + MENUITEM "&Salva", ID_BROWSE_SAVE + MENUITEM "Salva &come...", ID_BROWSE_SAVE_AS + MENUITEM SEPARATOR + MENUITEM "&Imposta pagina...", ID_BROWSE_PRINT_FORMAT + MENUITEM "S&tampa...", ID_BROWSE_PRINT + MENUITEM "Antepri&ma di stampa...", ID_BROWSE_PRINT_PREVIEW + MENUITEM SEPARATOR + MENUITEM "&Proprietà...", ID_BROWSE_PROPERTIES + } + POPUP "&Visualizza" + { + POPUP "&Barre degli strumenti" + { + MENUITEM "Barra &predefinita" ID_BROWSE_BAR_STD + MENUITEM "Barra dell'&indirizzo" ID_BROWSE_BAR_ADDR + } + } + POPUP "&Preferiti" + { + MENUITEM "&Aggiungi ai Preferiti..." ID_BROWSE_ADDFAV + MENUITEM SEPARATOR + } + POPUP "&Aiuto" + { + MENUITEM "&Informazioni su Internet Explorer...", ID_BROWSE_ABOUT + } +} + +STRINGTABLE +{ + IDS_TB_BACK "Indietro" + IDS_TB_FORWARD "Avanti" + IDS_TB_STOP "Ferma" + IDS_TB_REFRESH "Aggiorna" + IDS_TB_HOME "Home" + IDS_TB_PRINT "Stampa" +} + +STRINGTABLE +{ + IDS_ADDRESS "Indirizzo" +} diff -Nru wine1.3-1.3.0/dlls/shdocvw/Ko.rc wine1.3-1.3.1/dlls/shdocvw/Ko.rc --- wine1.3-1.3.0/dlls/shdocvw/Ko.rc 2010-07-30 18:43:56.000000000 +0100 +++ wine1.3-1.3.1/dlls/shdocvw/Ko.rc 2010-08-20 18:23:50.000000000 +0100 @@ -53,8 +53,36 @@ MENUITEM SEPARATOR MENUITEM "속성(&P)...", ID_BROWSE_PROPERTIES } + POPUP "보기(&V)" + { + POPUP "도구바(&T)" + { + MENUITEM "표준 바(&S)" ID_BROWSE_BAR_STD + MENUITEM "주소 바(&A)" ID_BROWSE_BAR_ADDR + } + } + POPUP "즐겨찾기(&F)" + { + MENUITEM "즐겨찾기 추가(&A)..." ID_BROWSE_ADDFAV + MENUITEM SEPARATOR + } POPUP "도움말(&H)" { MENUITEM "인터넷 익스플로어 정보(&A)...", ID_BROWSE_ABOUT } } + +STRINGTABLE +{ + IDS_TB_BACK "뒤로" + IDS_TB_FORWARD "앞으로" + IDS_TB_STOP "멈추기" + IDS_TB_REFRESH "새로 고침" + IDS_TB_HOME "홈" + IDS_TB_PRINT "인쇄" +} + +STRINGTABLE +{ + IDS_ADDRESS "주소" +} diff -Nru wine1.3-1.3.0/dlls/shdocvw/Lt.rc wine1.3-1.3.1/dlls/shdocvw/Lt.rc --- wine1.3-1.3.0/dlls/shdocvw/Lt.rc 2010-07-30 18:43:56.000000000 +0100 +++ wine1.3-1.3.1/dlls/shdocvw/Lt.rc 2010-08-20 18:23:50.000000000 +0100 @@ -28,7 +28,7 @@ CAPTION "Atverti URL" FONT 8, "MS Shell Dlg" { - LTEXT "Nurodykite URL, kurį norite atverti su Internet Explorer",-1,30, 5, 150,15 + LTEXT "Nurodykite URL, kurį norite atverti su interneto naršykle",-1 ,30, 5, 150, 16 LTEXT "Atverti:", -1, 2, 32, 25, 15 EDITTEXT IDC_BROWSE_OPEN_URL, 30, 30, 160, 13 DEFPUSHBUTTON "&Gerai", IDOK, 30, 50, 50, 15 @@ -53,8 +53,36 @@ MENUITEM SEPARATOR MENUITEM "&Savybės...", ID_BROWSE_PROPERTIES } + POPUP "&Rodymas" + { + POPUP "&Įrankių juosta" + { + MENUITEM "Į&prastinė juosta" ID_BROWSE_BAR_STD + MENUITEM "&Adreso juosta" ID_BROWSE_BAR_ADDR + } + } + POPUP "&Adresynas" + { + MENUITEM "Į&rašyti į adresyną..." ID_BROWSE_ADDFAV + MENUITEM SEPARATOR + } POPUP "&Žinynas" { - MENUITEM "&Apie Internet Explorer...", ID_BROWSE_ABOUT + MENUITEM "&Apie interneto naršyklę...", ID_BROWSE_ABOUT } } + +STRINGTABLE +{ + IDS_TB_BACK "Atgal" + IDS_TB_FORWARD "Pirmyn" + IDS_TB_STOP "Stabdyti" + IDS_TB_REFRESH "Atnaujinti" + IDS_TB_HOME "Pradžia" + IDS_TB_PRINT "Spausdinti" +} + +STRINGTABLE +{ + IDS_ADDRESS "Adresas" +} diff -Nru wine1.3-1.3.0/dlls/shdocvw/Makefile.in wine1.3-1.3.1/dlls/shdocvw/Makefile.in --- wine1.3-1.3.0/dlls/shdocvw/Makefile.in 2010-07-30 18:43:56.000000000 +0100 +++ wine1.3-1.3.1/dlls/shdocvw/Makefile.in 2010-08-20 18:23:50.000000000 +0100 @@ -31,10 +31,13 @@ RC_SRCS = \ De.rc \ En.rc \ + Es.rc \ Fr.rc \ + It.rc \ Ko.rc \ Lt.rc \ Nl.rc \ + Pl.rc \ Ro.rc \ Sv.rc \ Uk.rc \ diff -Nru wine1.3-1.3.0/dlls/shdocvw/navigate.c wine1.3-1.3.1/dlls/shdocvw/navigate.c --- wine1.3-1.3.0/dlls/shdocvw/navigate.c 2010-07-30 18:43:56.000000000 +0100 +++ wine1.3-1.3.1/dlls/shdocvw/navigate.c 2010-08-20 18:23:50.000000000 +0100 @@ -761,7 +761,7 @@ Flags, Flags ? V_VT(Flags) : -1, TargetFrameName, TargetFrameName ? V_VT(TargetFrameName) : -1); - if(PostData && V_VT(PostData) == (VT_ARRAY | VT_UI1)) { + if(PostData && V_VT(PostData) == (VT_ARRAY | VT_UI1) && V_ARRAY(PostData)) { SafeArrayAccessData(V_ARRAY(PostData), (void**)&post_data); post_data_len = V_ARRAY(PostData)->rgsabound[0].cElements; } @@ -783,7 +783,8 @@ DWORD size; size = sizeof(new_url)/sizeof(WCHAR); - hres = UrlApplySchemeW(url, new_url, &size, URL_APPLY_GUESSSCHEME); + hres = UrlApplySchemeW(url, new_url, &size, + URL_APPLY_GUESSSCHEME | URL_APPLY_DEFAULT); if(FAILED(hres)) { WARN("UrlApplyScheme failed: %08x\n", hres); new_url[0] = 0; diff -Nru wine1.3-1.3.0/dlls/shdocvw/Nl.rc wine1.3-1.3.1/dlls/shdocvw/Nl.rc --- wine1.3-1.3.0/dlls/shdocvw/Nl.rc 2010-07-30 18:43:56.000000000 +0100 +++ wine1.3-1.3.1/dlls/shdocvw/Nl.rc 2010-08-20 18:23:50.000000000 +0100 @@ -50,8 +50,36 @@ MENUITEM SEPARATOR MENUITEM "&Eigenschappen...", ID_BROWSE_PROPERTIES } + POPUP "Bee&ld" + { + POPUP "&Werkbalken" + { + MENUITEM "&Standaardbalk" ID_BROWSE_BAR_STD + MENUITEM "&Adresbalk" ID_BROWSE_BAR_ADDR + } + } + POPUP "&Favorieten" + { + MENUITEM "&Toevoegen aan Favorieten..." ID_BROWSE_ADDFAV + MENUITEM SEPARATOR + } POPUP "&Help" { MENUITEM "&Over Internet Explorer...", ID_BROWSE_ABOUT } } + +STRINGTABLE +{ + IDS_TB_BACK "Terug" + IDS_TB_FORWARD "Vooruit" + IDS_TB_STOP "Stoppen" + IDS_TB_REFRESH "Vernieuwen" + IDS_TB_HOME "Startpagina" + IDS_TB_PRINT "Printen" +} + +STRINGTABLE +{ + IDS_ADDRESS "Adres" +} diff -Nru wine1.3-1.3.0/dlls/shdocvw/Pl.rc wine1.3-1.3.1/dlls/shdocvw/Pl.rc --- wine1.3-1.3.0/dlls/shdocvw/Pl.rc 1970-01-01 01:00:00.000000000 +0100 +++ wine1.3-1.3.1/dlls/shdocvw/Pl.rc 2010-08-20 18:23:50.000000000 +0100 @@ -0,0 +1,57 @@ +/* + * Copyright 2010 ukasz Wojniowicz + * + * 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 "resource.h" + +LANGUAGE LANG_POLISH, SUBLANG_DEFAULT + +IDD_BROWSE_OPEN DIALOG 10, 10, 200, 70 +STYLE DS_MODALFRAME | WS_CAPTION +CAPTION "Otwrz URL" +FONT 8, "MS Shell Dlg" +{ + LTEXT "Podaj adres URL, ktry chcesz otworzy w Internet Explorerze",-1,25, 5, 150,15 + LTEXT "Otwrz:", -1, 2, 32, 20, 15 + EDITTEXT IDC_BROWSE_OPEN_URL, 25, 30, 160, 13 + DEFPUSHBUTTON "&OK", IDOK, 25, 50, 50, 15 + PUSHBUTTON "&Anuluj", IDCANCEL, 85, 50, 50, 15 +} + +IDR_BROWSE_MAIN_MENU MENU +{ + POPUP "&Plik" + { + POPUP "&Nowe" + { + MENUITEM "&Okno" ID_BROWSE_NEW_WINDOW + } + MENUITEM "&Otwrz...", ID_BROWSE_OPEN + MENUITEM "&Zapisz", ID_BROWSE_SAVE + MENUITEM "Zapisz &jako...", ID_BROWSE_SAVE_AS + MENUITEM SEPARATOR + MENUITEM "Forma&t wydruku...", ID_BROWSE_PRINT_FORMAT + MENUITEM "&Drukuj...", ID_BROWSE_PRINT + MENUITEM "Podgl&d wydruku...", ID_BROWSE_PRINT_PREVIEW + MENUITEM SEPARATOR + MENUITEM "&Waciwoci...", ID_BROWSE_PROPERTIES + } + POPUP "&Pomoc" + { + MENUITEM "&O Internet Explorer...", ID_BROWSE_ABOUT + } +} diff -Nru wine1.3-1.3.0/dlls/shdocvw/resource.h wine1.3-1.3.1/dlls/shdocvw/resource.h --- wine1.3-1.3.0/dlls/shdocvw/resource.h 2010-07-30 18:43:56.000000000 +0100 +++ wine1.3-1.3.1/dlls/shdocvw/resource.h 2010-08-20 18:23:50.000000000 +0100 @@ -27,6 +27,8 @@ #define IDC_BROWSE_REBAR 1003 #define IDC_BROWSE_ADDRESSBAR 1004 #define IDC_BROWSE_STATUSBAR 1005 +#define IDC_BROWSE_TOOLBAR 1006 +#define IDB_IETOOLBAR 1007 #define ID_BROWSE_NEW_WINDOW 275 #define ID_BROWSE_OPEN 256 @@ -37,3 +39,21 @@ #define ID_BROWSE_PRINT_PREVIEW 277 #define ID_BROWSE_PROPERTIES 262 #define ID_BROWSE_ABOUT 336 + +#define ID_BROWSE_ADDFAV 1200 +#define ID_BROWSE_HOME 1201 + +#define ID_BROWSE_BAR_STD 1300 +#define ID_BROWSE_BAR_ADDR 1301 + +#define ID_BROWSE_GOTOFAV_FIRST 2000 +#define ID_BROWSE_GOTOFAV_MAX 65000 + +#define IDS_TB_BACK 1100 +#define IDS_TB_FORWARD 1101 +#define IDS_TB_STOP 1102 +#define IDS_TB_REFRESH 1103 +#define IDS_TB_HOME 1104 +#define IDS_TB_PRINT 1105 + +#define IDS_ADDRESS 1106 diff -Nru wine1.3-1.3.0/dlls/shdocvw/shdocvw.h wine1.3-1.3.1/dlls/shdocvw/shdocvw.h --- wine1.3-1.3.0/dlls/shdocvw/shdocvw.h 2010-07-30 18:43:56.000000000 +0100 +++ wine1.3-1.3.1/dlls/shdocvw/shdocvw.h 2010-08-20 18:23:50.000000000 +0100 @@ -190,6 +190,7 @@ HWND frame_hwnd; HWND status_hwnd; + HMENU menu; DocHost doc_host; }; diff -Nru wine1.3-1.3.0/dlls/shdocvw/shdocvw.rc wine1.3-1.3.1/dlls/shdocvw/shdocvw.rc --- wine1.3-1.3.0/dlls/shdocvw/shdocvw.rc 2010-07-30 18:43:56.000000000 +0100 +++ wine1.3-1.3.1/dlls/shdocvw/shdocvw.rc 2010-08-20 18:23:50.000000000 +0100 @@ -33,3 +33,6 @@ /* @makedep: shdocvw.inf */ REGINST REGINST shdocvw.inf + +/* @makedep: ietoolbar.bmp */ +IDB_IETOOLBAR BITMAP ietoolbar.bmp diff -Nru wine1.3-1.3.0/dlls/shdocvw/Sv.rc wine1.3-1.3.1/dlls/shdocvw/Sv.rc --- wine1.3-1.3.0/dlls/shdocvw/Sv.rc 2010-07-30 18:43:56.000000000 +0100 +++ wine1.3-1.3.1/dlls/shdocvw/Sv.rc 2010-08-20 18:23:50.000000000 +0100 @@ -52,8 +52,36 @@ MENUITEM SEPARATOR MENUITEM "&Egenskaper...", ID_BROWSE_PROPERTIES } + POPUP "&Visa" + { + POPUP "Verktygs&fält" + { + MENUITEM "&Standardfält" ID_BROWSE_BAR_STD + MENUITEM "&Adressfält" ID_BROWSE_BAR_ADDR + } + } + POPUP "&Favoriter" + { + MENUITEM "&Lägg till favoriter..." ID_BROWSE_ADDFAV + MENUITEM SEPARATOR + } POPUP "&Hjälp" { MENUITEM "&Om Internet Explorer...", ID_BROWSE_ABOUT } } + +STRINGTABLE +{ + IDS_TB_BACK "Bakåt" + IDS_TB_FORWARD "Framåt" + IDS_TB_STOP "Stopp" + IDS_TB_REFRESH "Uppdatera" + IDS_TB_HOME "Hem" + IDS_TB_PRINT "Skriv ut" +} + +STRINGTABLE +{ + IDS_ADDRESS "Adress" +} diff -Nru wine1.3-1.3.0/dlls/shdocvw/Uk.rc wine1.3-1.3.1/dlls/shdocvw/Uk.rc --- wine1.3-1.3.0/dlls/shdocvw/Uk.rc 2010-07-30 18:43:56.000000000 +0100 +++ wine1.3-1.3.1/dlls/shdocvw/Uk.rc 2010-08-20 18:23:50.000000000 +0100 @@ -54,8 +54,36 @@ MENUITEM SEPARATOR MENUITEM "В&ластивості...", ID_BROWSE_PROPERTIES } + POPUP "&Вигляд" + { + POPUP "&Панелі інструментів" + { + MENUITEM "&Стандартна панель" ID_BROWSE_BAR_STD + MENUITEM "Рядок &адреси" ID_BROWSE_BAR_ADDR + } + } + POPUP "&Обране" + { + MENUITEM "&Додати до Обраного..." ID_BROWSE_ADDFAV + MENUITEM SEPARATOR + } POPUP "&Довідка" { MENUITEM "&Про Internet Explorer...", ID_BROWSE_ABOUT } } + +STRINGTABLE +{ + IDS_TB_BACK "Назад" + IDS_TB_FORWARD "Вперед" + IDS_TB_STOP "Зупинити" + IDS_TB_REFRESH "Оновити" + IDS_TB_HOME "Додому" + IDS_TB_PRINT "Друк" +} + +STRINGTABLE +{ + IDS_ADDRESS "Адреса" +} diff -Nru wine1.3-1.3.0/dlls/shell32/brsfolder.c wine1.3-1.3.1/dlls/shell32/brsfolder.c --- wine1.3-1.3.0/dlls/shell32/brsfolder.c 2010-07-30 18:43:56.000000000 +0100 +++ wine1.3-1.3.1/dlls/shell32/brsfolder.c 2010-08-20 18:23:50.000000000 +0100 @@ -239,7 +239,7 @@ return; } - if (pidlChild && pidlChild->mkid.cb) { + if (!_ILIsEmpty(pidlChild)) { hr = IShellFolder_BindToObject(lpsfParent, pidlChild, 0, &IID_IShellFolder, (LPVOID*)&lpsfRoot); } else { lpsfRoot = lpsfParent; @@ -519,7 +519,7 @@ if ((pnmtv->itemNew.state & TVIS_EXPANDEDONCE)) return 0; - if (lptvid->lpi && lptvid->lpi->mkid.cb) { + if (!_ILIsEmpty(lptvid->lpi)) { r = IShellFolder_BindToObject( lptvid->lpsfParent, lptvid->lpi, 0, &IID_IShellFolder, (LPVOID *)&lpsf2 ); } else { diff -Nru wine1.3-1.3.0/dlls/shell32/ebrowser.c wine1.3-1.3.1/dlls/shell32/ebrowser.c --- wine1.3-1.3.0/dlls/shell32/ebrowser.c 1970-01-01 01:00:00.000000000 +0100 +++ wine1.3-1.3.1/dlls/shell32/ebrowser.c 2010-08-20 18:23:50.000000000 +0100 @@ -0,0 +1,568 @@ +/* + * ExplorerBrowser Control implementation. + * + * Copyright 2010 David Hedberg + * + * 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 +#define NONAMELESSUNION +#define NONAMELESSSTRUCT + +#include "winerror.h" +#include "windef.h" +#include "winbase.h" + +#include "wine/debug.h" +#include "debughlp.h" + +#include "shell32_main.h" + +WINE_DEFAULT_DEBUG_CHANNEL(shell); + +typedef struct _ExplorerBrowserImpl { + const IExplorerBrowserVtbl *lpVtbl; + const IShellBrowserVtbl *lpsbVtbl; + LONG ref; + BOOL destroyed; + + HWND hwnd_main; +} ExplorerBrowserImpl; + +/************************************************************************** + * Main window related functions. + */ +static LRESULT main_on_wm_create(HWND hWnd, CREATESTRUCTW *crs) +{ + ExplorerBrowserImpl *This = crs->lpCreateParams; + TRACE("%p\n", This); + + SetWindowLongPtrW(hWnd, GWLP_USERDATA, (LPARAM)This); + This->hwnd_main = hWnd; + + return TRUE; +} + +static LRESULT CALLBACK main_wndproc(HWND hWnd, UINT uMessage, WPARAM wParam, LPARAM lParam) +{ + switch(uMessage) + { + case WM_CREATE: return main_on_wm_create(hWnd, (CREATESTRUCTW*)lParam); + default: return DefWindowProcW(hWnd, uMessage, wParam, lParam); + } + + return 0; +} + +/************************************************************************** + * IExplorerBrowser Implementation + */ +static HRESULT WINAPI IExplorerBrowser_fnQueryInterface(IExplorerBrowser *iface, + REFIID riid, void **ppvObject) +{ + ExplorerBrowserImpl *This = (ExplorerBrowserImpl*)iface; + TRACE("%p (%s, %p)\n", This, shdebugstr_guid(riid), ppvObject); + + *ppvObject = NULL; + if(IsEqualIID(riid, &IID_IExplorerBrowser) || + IsEqualIID(riid, &IID_IUnknown)) + { + *ppvObject = This; + } + else if(IsEqualIID(riid, &IID_IShellBrowser)) + { + *ppvObject = &This->lpsbVtbl; + } + + if(*ppvObject) + { + IUnknown_AddRef((IUnknown*)*ppvObject); + return S_OK; + } + + return E_NOINTERFACE; +} + +static ULONG WINAPI IExplorerBrowser_fnAddRef(IExplorerBrowser *iface) +{ + ExplorerBrowserImpl *This = (ExplorerBrowserImpl*)iface; + LONG ref = InterlockedIncrement(&This->ref); + TRACE("%p - ref %d\n", This, ref); + + return ref; +} + +static ULONG WINAPI IExplorerBrowser_fnRelease(IExplorerBrowser *iface) +{ + ExplorerBrowserImpl *This = (ExplorerBrowserImpl*)iface; + LONG ref = InterlockedDecrement(&This->ref); + TRACE("%p - ref %d\n", This, ref); + + if(!ref) + { + TRACE("Freeing.\n"); + + if(!This->destroyed) + IExplorerBrowser_Destroy(iface); + + HeapFree(GetProcessHeap(), 0, This); + return 0; + } + + return ref; +} + +static HRESULT WINAPI IExplorerBrowser_fnInitialize(IExplorerBrowser *iface, + HWND hwndParent, const RECT *prc, + const FOLDERSETTINGS *pfs) +{ + ExplorerBrowserImpl *This = (ExplorerBrowserImpl*)iface; + WNDCLASSW wc; + LONG style; + static const WCHAR EB_CLASS_NAME[] = + {'E','x','p','l','o','r','e','r','B','r','o','w','s','e','r','C','o','n','t','r','o','l',0}; + + TRACE("%p (%p, %p, %p)\n", This, hwndParent, prc, pfs); + + if(This->hwnd_main) + return E_UNEXPECTED; + + if(!hwndParent) + return E_INVALIDARG; + + if( !GetClassInfoW(shell32_hInstance, EB_CLASS_NAME, &wc) ) + { + wc.style = CS_HREDRAW | CS_VREDRAW; + wc.lpfnWndProc = main_wndproc; + wc.cbClsExtra = 0; + wc.cbWndExtra = 0; + wc.hInstance = shell32_hInstance; + wc.hIcon = 0; + wc.hCursor = LoadCursorW(0, (LPWSTR)IDC_ARROW); + wc.hbrBackground = (HBRUSH)(COLOR_WINDOW + 1); + wc.lpszMenuName = NULL; + wc.lpszClassName = EB_CLASS_NAME; + + if (!RegisterClassW(&wc)) return E_FAIL; + } + + style = WS_CHILD | WS_VISIBLE | WS_CLIPSIBLINGS | WS_BORDER; + This->hwnd_main = CreateWindowExW(WS_EX_CONTROLPARENT, EB_CLASS_NAME, NULL, style, + prc->left, prc->top, + prc->right - prc->left, prc->bottom - prc->top, + hwndParent, 0, shell32_hInstance, This); + + if(!This->hwnd_main) + { + ERR("Failed to create the window.\n"); + return E_FAIL; + } + + return S_OK; +} + +static HRESULT WINAPI IExplorerBrowser_fnDestroy(IExplorerBrowser *iface) +{ + ExplorerBrowserImpl *This = (ExplorerBrowserImpl*)iface; + TRACE("%p\n", This); + + DestroyWindow(This->hwnd_main); + This->destroyed = TRUE; + + return S_OK; +} + +static HRESULT WINAPI IExplorerBrowser_fnSetRect(IExplorerBrowser *iface, + HDWP *phdwp, RECT rcBrowser) +{ + ExplorerBrowserImpl *This = (ExplorerBrowserImpl*)iface; + TRACE("%p (%p, %s)\n", This, phdwp, wine_dbgstr_rect(&rcBrowser)); + + if(phdwp) + { + *phdwp = DeferWindowPos(*phdwp, This->hwnd_main, NULL, rcBrowser.left, rcBrowser.top, + rcBrowser.right - rcBrowser.left, rcBrowser.bottom - rcBrowser.top, + SWP_NOZORDER | SWP_NOACTIVATE); + } + else + { + MoveWindow(This->hwnd_main, rcBrowser.left, rcBrowser.top, + rcBrowser.right - rcBrowser.left, rcBrowser.bottom - rcBrowser.top, TRUE); + } + + return S_OK; +} + +static HRESULT WINAPI IExplorerBrowser_fnSetPropertyBag(IExplorerBrowser *iface, + LPCWSTR pszPropertyBag) +{ + ExplorerBrowserImpl *This = (ExplorerBrowserImpl*)iface; + FIXME("stub, %p (%s)\n", This, debugstr_w(pszPropertyBag)); + + return E_NOTIMPL; +} + +static HRESULT WINAPI IExplorerBrowser_fnSetEmptyText(IExplorerBrowser *iface, + LPCWSTR pszEmptyText) +{ + ExplorerBrowserImpl *This = (ExplorerBrowserImpl*)iface; + FIXME("stub, %p (%s)\n", This, debugstr_w(pszEmptyText)); + + return E_NOTIMPL; +} + +static HRESULT WINAPI IExplorerBrowser_fnSetFolderSettings(IExplorerBrowser *iface, + const FOLDERSETTINGS *pfs) +{ + ExplorerBrowserImpl *This = (ExplorerBrowserImpl*)iface; + FIXME("stub, %p (%p)\n", This, pfs); + + return E_NOTIMPL; +} + +static HRESULT WINAPI IExplorerBrowser_fnAdvise(IExplorerBrowser *iface, + IExplorerBrowserEvents *psbe, + DWORD *pdwCookie) +{ + ExplorerBrowserImpl *This = (ExplorerBrowserImpl*)iface; + FIXME("stub, %p (%p, %p)\n", This, psbe, pdwCookie); + + return E_NOTIMPL; +} + +static HRESULT WINAPI IExplorerBrowser_fnUnadvise(IExplorerBrowser *iface, + DWORD dwCookie) +{ + ExplorerBrowserImpl *This = (ExplorerBrowserImpl*)iface; + FIXME("stub, %p (0x%x)\n", This, dwCookie); + + return E_NOTIMPL; +} + +static HRESULT WINAPI IExplorerBrowser_fnSetOptions(IExplorerBrowser *iface, + EXPLORER_BROWSER_OPTIONS dwFlag) +{ + ExplorerBrowserImpl *This = (ExplorerBrowserImpl*)iface; + FIXME("stub, %p (0x%x)\n", This, dwFlag); + + return E_NOTIMPL; +} + +static HRESULT WINAPI IExplorerBrowser_fnGetOptions(IExplorerBrowser *iface, + EXPLORER_BROWSER_OPTIONS *pdwFlag) +{ + ExplorerBrowserImpl *This = (ExplorerBrowserImpl*)iface; + FIXME("stub, %p (%p)\n", This, pdwFlag); + + return E_NOTIMPL; +} + +static HRESULT WINAPI IExplorerBrowser_fnBrowseToIDList(IExplorerBrowser *iface, + PCUIDLIST_RELATIVE pidl, + UINT uFlags) +{ + ExplorerBrowserImpl *This = (ExplorerBrowserImpl*)iface; + FIXME("stub, %p (%p, 0x%x)\n", This, pidl, uFlags); + + return E_NOTIMPL; +} + +static HRESULT WINAPI IExplorerBrowser_fnBrowseToObject(IExplorerBrowser *iface, + IUnknown *punk, UINT uFlags) +{ + ExplorerBrowserImpl *This = (ExplorerBrowserImpl*)iface; + FIXME("stub, %p (%p, 0x%x)\n", This, punk, uFlags); + + return E_NOTIMPL; +} + +static HRESULT WINAPI IExplorerBrowser_fnFillFromObject(IExplorerBrowser *iface, + IUnknown *punk, + EXPLORER_BROWSER_FILL_FLAGS dwFlags) +{ + ExplorerBrowserImpl *This = (ExplorerBrowserImpl*)iface; + FIXME("stub, %p (%p, 0x%x)\n", This, punk, dwFlags); + + return E_NOTIMPL; +} + +static HRESULT WINAPI IExplorerBrowser_fnRemoveAll(IExplorerBrowser *iface) +{ + ExplorerBrowserImpl *This = (ExplorerBrowserImpl*)iface; + FIXME("stub, %p\n", This); + + return E_NOTIMPL; +} + +static HRESULT WINAPI IExplorerBrowser_fnGetCurrentView(IExplorerBrowser *iface, + REFIID riid, void **ppv) +{ + ExplorerBrowserImpl *This = (ExplorerBrowserImpl*)iface; + FIXME("stub, %p (%s, %p)\n", This, shdebugstr_guid(riid), ppv); + + *ppv = NULL; + return E_FAIL; +} + +static const IExplorerBrowserVtbl vt_IExplorerBrowser = +{ + IExplorerBrowser_fnQueryInterface, + IExplorerBrowser_fnAddRef, + IExplorerBrowser_fnRelease, + IExplorerBrowser_fnInitialize, + IExplorerBrowser_fnDestroy, + IExplorerBrowser_fnSetRect, + IExplorerBrowser_fnSetPropertyBag, + IExplorerBrowser_fnSetEmptyText, + IExplorerBrowser_fnSetFolderSettings, + IExplorerBrowser_fnAdvise, + IExplorerBrowser_fnUnadvise, + IExplorerBrowser_fnSetOptions, + IExplorerBrowser_fnGetOptions, + IExplorerBrowser_fnBrowseToIDList, + IExplorerBrowser_fnBrowseToObject, + IExplorerBrowser_fnFillFromObject, + IExplorerBrowser_fnRemoveAll, + IExplorerBrowser_fnGetCurrentView +}; + +/************************************************************************** + * IShellBrowser Implementation + */ + +static inline ExplorerBrowserImpl *impl_from_IShellBrowser(IShellBrowser *iface) +{ + return (ExplorerBrowserImpl *)((char*)iface - FIELD_OFFSET(ExplorerBrowserImpl, lpsbVtbl)); +} + +static HRESULT WINAPI IShellBrowser_fnQueryInterface(IShellBrowser *iface, + REFIID riid, void **ppvObject) +{ + ExplorerBrowserImpl *This = impl_from_IShellBrowser(iface); + TRACE("%p\n", This); + return IUnknown_QueryInterface((IUnknown*) This, riid, ppvObject); +} + +static ULONG WINAPI IShellBrowser_fnAddRef(IShellBrowser *iface) +{ + ExplorerBrowserImpl *This = impl_from_IShellBrowser(iface); + TRACE("%p\n", This); + return IUnknown_AddRef((IUnknown*) This); +} + +static ULONG WINAPI IShellBrowser_fnRelease(IShellBrowser *iface) +{ + ExplorerBrowserImpl *This = impl_from_IShellBrowser(iface); + TRACE("%p\n", This); + return IUnknown_Release((IUnknown*) This); +} + +static HRESULT WINAPI IShellBrowser_fnGetWindow(IShellBrowser *iface, HWND *phwnd) +{ + ExplorerBrowserImpl *This = impl_from_IShellBrowser(iface); + TRACE("%p (%p)\n", This, phwnd); + + if(!This->hwnd_main) + return E_FAIL; + + *phwnd = This->hwnd_main; + return S_OK; +} + +static HRESULT WINAPI IShellBrowser_fnContextSensitiveHelp(IShellBrowser *iface, + BOOL fEnterMode) +{ + ExplorerBrowserImpl *This = impl_from_IShellBrowser(iface); + FIXME("stub, %p (%d)\n", This, fEnterMode); + + return E_NOTIMPL; +} + +static HRESULT WINAPI IShellBrowser_fnInsertMenusSB(IShellBrowser *iface, + HMENU hmenuShared, + LPOLEMENUGROUPWIDTHS lpMenuWidths) +{ + ExplorerBrowserImpl *This = impl_from_IShellBrowser(iface); + TRACE("%p (%p, %p)\n", This, hmenuShared, lpMenuWidths); + + /* Not implemented. */ + return E_NOTIMPL; +} + +static HRESULT WINAPI IShellBrowser_fnSetMenuSB(IShellBrowser *iface, + HMENU hmenuShared, + HOLEMENU holemenuReserved, + HWND hwndActiveObject) +{ + ExplorerBrowserImpl *This = impl_from_IShellBrowser(iface); + TRACE("%p (%p, %p, %p)\n", This, hmenuShared, holemenuReserved, hwndActiveObject); + + /* Not implemented. */ + return E_NOTIMPL; +} + +static HRESULT WINAPI IShellBrowser_fnRemoveMenusSB(IShellBrowser *iface, + HMENU hmenuShared) +{ + ExplorerBrowserImpl *This = impl_from_IShellBrowser(iface); + TRACE("%p (%p)\n", This, hmenuShared); + + /* Not implemented. */ + return E_NOTIMPL; +} + +static HRESULT WINAPI IShellBrowser_fnSetStatusTextSB(IShellBrowser *iface, + LPCOLESTR pszStatusText) +{ + ExplorerBrowserImpl *This = impl_from_IShellBrowser(iface); + FIXME("stub, %p (%s)\n", This, debugstr_w(pszStatusText)); + + return E_NOTIMPL; +} + +static HRESULT WINAPI IShellBrowser_fnEnableModelessSB(IShellBrowser *iface, + BOOL fEnable) +{ + ExplorerBrowserImpl *This = impl_from_IShellBrowser(iface); + FIXME("stub, %p (%d)\n", This, fEnable); + + return E_NOTIMPL; +} + +static HRESULT WINAPI IShellBrowser_fnTranslateAcceleratorSB(IShellBrowser *iface, + MSG *pmsg, WORD wID) +{ + ExplorerBrowserImpl *This = impl_from_IShellBrowser(iface); + FIXME("stub, %p (%p, 0x%x)\n", This, pmsg, wID); + + return E_NOTIMPL; +} + +static HRESULT WINAPI IShellBrowser_fnBrowseObject(IShellBrowser *iface, + LPCITEMIDLIST pidl, UINT wFlags) +{ + ExplorerBrowserImpl *This = impl_from_IShellBrowser(iface); + FIXME("stub, %p\n", This); + + return E_NOTIMPL; +} + +static HRESULT WINAPI IShellBrowser_fnGetViewStateStream(IShellBrowser *iface, + DWORD grfMode, + IStream **ppStrm) +{ + ExplorerBrowserImpl *This = impl_from_IShellBrowser(iface); + FIXME("stub, %p (0x%x, %p)\n", This, grfMode, ppStrm); + + *ppStrm = NULL; + return E_FAIL; +} + +static HRESULT WINAPI IShellBrowser_fnGetControlWindow(IShellBrowser *iface, + UINT id, HWND *phwnd) +{ + ExplorerBrowserImpl *This = impl_from_IShellBrowser(iface); + TRACE("%p (%d, %p)\n", This, id, phwnd); + + /* Not implemented. */ + return E_NOTIMPL; +} + +static HRESULT WINAPI IShellBrowser_fnSendControlMsg(IShellBrowser *iface, + UINT id, UINT uMsg, + WPARAM wParam, LPARAM lParam, + LRESULT *pret) +{ + ExplorerBrowserImpl *This = impl_from_IShellBrowser(iface); + FIXME("stub, %p (%d, %d, %lx, %lx, %p)\n", This, id, uMsg, wParam, lParam, pret); + + return E_NOTIMPL; +} + +static HRESULT WINAPI IShellBrowser_fnQueryActiveShellView(IShellBrowser *iface, + IShellView **ppshv) +{ + ExplorerBrowserImpl *This = impl_from_IShellBrowser(iface); + FIXME("stub, %p (%p)\n", This, ppshv); + + return E_NOTIMPL; +} + +static HRESULT WINAPI IShellBrowser_fnOnViewWindowActive(IShellBrowser *iface, + IShellView *pshv) +{ + ExplorerBrowserImpl *This = impl_from_IShellBrowser(iface); + FIXME("stub, %p (%p)\n", This, pshv); + + return E_NOTIMPL; +} + +static HRESULT WINAPI IShellBrowser_fnSetToolbarItems(IShellBrowser *iface, + LPTBBUTTONSB lpButtons, + UINT nButtons, UINT uFlags) +{ + ExplorerBrowserImpl *This = impl_from_IShellBrowser(iface); + FIXME("stub, %p (%p, %d, 0x%x)\n", This, lpButtons, nButtons, uFlags); + + return E_NOTIMPL; +} + +static const IShellBrowserVtbl vt_IShellBrowser = { + IShellBrowser_fnQueryInterface, + IShellBrowser_fnAddRef, + IShellBrowser_fnRelease, + IShellBrowser_fnGetWindow, + IShellBrowser_fnContextSensitiveHelp, + IShellBrowser_fnInsertMenusSB, + IShellBrowser_fnSetMenuSB, + IShellBrowser_fnRemoveMenusSB, + IShellBrowser_fnSetStatusTextSB, + IShellBrowser_fnEnableModelessSB, + IShellBrowser_fnTranslateAcceleratorSB, + IShellBrowser_fnBrowseObject, + IShellBrowser_fnGetViewStateStream, + IShellBrowser_fnGetControlWindow, + IShellBrowser_fnSendControlMsg, + IShellBrowser_fnQueryActiveShellView, + IShellBrowser_fnOnViewWindowActive, + IShellBrowser_fnSetToolbarItems +}; + +HRESULT WINAPI ExplorerBrowser_Constructor(IUnknown *pUnkOuter, REFIID riid, void **ppv) +{ + ExplorerBrowserImpl *eb; + HRESULT ret; + + TRACE("%p %s %p\n", pUnkOuter, shdebugstr_guid (riid), ppv); + + if(!ppv) + return E_POINTER; + if(pUnkOuter) + return CLASS_E_NOAGGREGATION; + + eb = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(ExplorerBrowserImpl)); + eb->ref = 1; + eb->lpVtbl = &vt_IExplorerBrowser; + eb->lpsbVtbl = &vt_IShellBrowser; + + ret = IExplorerBrowser_QueryInterface((IExplorerBrowser*)eb, riid, ppv); + IExplorerBrowser_Release((IExplorerBrowser*)eb); + + TRACE("--(%p)\n", ppv); + return ret; +} diff -Nru wine1.3-1.3.0/dlls/shell32/Makefile.in wine1.3-1.3.1/dlls/shell32/Makefile.in --- wine1.3-1.3.0/dlls/shell32/Makefile.in 2010-07-30 18:43:56.000000000 +0100 +++ wine1.3-1.3.1/dlls/shell32/Makefile.in 2010-08-20 18:23:50.000000000 +0100 @@ -23,6 +23,7 @@ debughlp.c \ dialogs.c \ dragdrophelper.c \ + ebrowser.c \ enumidlist.c \ folders.c \ iconcache.c \ diff -Nru wine1.3-1.3.0/dlls/shell32/pidl.c wine1.3-1.3.1/dlls/shell32/pidl.c --- wine1.3-1.3.0/dlls/shell32/pidl.c 2010-07-30 18:43:56.000000000 +0100 +++ wine1.3-1.3.1/dlls/shell32/pidl.c 2010-08-20 18:23:50.000000000 +0100 @@ -217,7 +217,7 @@ { TRACE_(shell)("pidl=%p\n",pidl); - if (!pidl || !pidl->mkid.cb) + if (_ILIsEmpty(pidl)) return FALSE; ILFindLastID(pidl)->mkid.cb = 0; return TRUE; @@ -2062,7 +2062,7 @@ */ LPPIDLDATA _ILGetDataPointer(LPCITEMIDLIST pidl) { - if(pidl && pidl->mkid.cb != 0x00) + if(!_ILIsEmpty(pidl)) return (LPPIDLDATA)pidl->mkid.abID; return NULL; } diff -Nru wine1.3-1.3.0/dlls/shell32/regsvr.c wine1.3-1.3.1/dlls/shell32/regsvr.c --- wine1.3-1.3.0/dlls/shell32/regsvr.c 2010-07-30 18:43:56.000000000 +0100 +++ wine1.3-1.3.1/dlls/shell32/regsvr.c 2010-08-20 18:23:50.000000000 +0100 @@ -681,6 +681,13 @@ "shell32.dll", "Apartment" }, + { &CLSID_ExplorerBrowser, + "Explorer Browser", + 0, + NULL, + "shell32.dll", + "Apartment" + }, { NULL } /* list terminator */ }; diff -Nru wine1.3-1.3.0/dlls/shell32/shell32_main.h wine1.3-1.3.1/dlls/shell32/shell32_main.h --- wine1.3-1.3.0/dlls/shell32/shell32_main.h 2010-07-30 18:43:56.000000000 +0100 +++ wine1.3-1.3.1/dlls/shell32/shell32_main.h 2010-08-20 18:23:50.000000000 +0100 @@ -97,6 +97,7 @@ HRESULT WINAPI MyDocuments_Constructor(IUnknown * pUnkOuter, REFIID riid, LPVOID *ppv); HRESULT WINAPI RecycleBin_Constructor(IUnknown * pUnkOuter, REFIID riif, LPVOID *ppv); HRESULT WINAPI QueryAssociations_Constructor(IUnknown *pUnkOuter, REFIID riid, LPVOID *ppOutput); +HRESULT WINAPI ExplorerBrowser_Constructor(IUnknown *pUnkOuter, REFIID riid, LPVOID *ppv); extern HRESULT CPanel_GetIconLocationW(LPCITEMIDLIST, LPWSTR, UINT, int*); HRESULT WINAPI CPanel_ExtractIconA(LPITEMIDLIST pidl, LPCSTR pszFile, UINT nIconIndex, HICON *phiconLarge, HICON *phiconSmall, UINT nIconSize); HRESULT WINAPI CPanel_ExtractIconW(LPITEMIDLIST pidl, LPCWSTR pszFile, UINT nIconIndex, HICON *phiconLarge, HICON *phiconSmall, UINT nIconSize); diff -Nru wine1.3-1.3.0/dlls/shell32/shellitem.c wine1.3-1.3.1/dlls/shell32/shellitem.c --- wine1.3-1.3.0/dlls/shell32/shellitem.c 2010-07-30 18:43:56.000000000 +0100 +++ wine1.3-1.3.1/dlls/shell32/shellitem.c 2010-08-20 18:23:50.000000000 +0100 @@ -147,14 +147,53 @@ return ret; } +static HRESULT ShellItem_get_shellfolder(ShellItem *This, IBindCtx *pbc, IShellFolder **ppsf) +{ + IShellFolder *desktop; + HRESULT ret; + + ret = SHGetDesktopFolder(&desktop); + if (SUCCEEDED(ret)) + { + if (_ILIsDesktop(This->pidl)) + { + *ppsf = desktop; + IShellFolder_AddRef(*ppsf); + } + else + { + ret = IShellFolder_BindToObject(desktop, This->pidl, pbc, &IID_IShellFolder, (void**)ppsf); + } + + IShellFolder_Release(desktop); + } + + return ret; +} + static HRESULT WINAPI ShellItem_BindToHandler(IShellItem *iface, IBindCtx *pbc, REFGUID rbhid, REFIID riid, void **ppvOut) { - FIXME("(%p,%p,%s,%p,%p)\n", iface, pbc, shdebugstr_guid(rbhid), riid, ppvOut); + ShellItem *This = (ShellItem*)iface; + HRESULT ret; + TRACE("(%p,%p,%s,%p,%p)\n", iface, pbc, shdebugstr_guid(rbhid), riid, ppvOut); *ppvOut = NULL; + if (IsEqualGUID(rbhid, &BHID_SFObject)) + { + IShellFolder *psf; + ret = ShellItem_get_shellfolder(This, pbc, &psf); + if (SUCCEEDED(ret)) + { + ret = IShellFolder_QueryInterface(psf, riid, ppvOut); + IShellFolder_Release(psf); + } + return ret; + } - return E_NOTIMPL; + FIXME("Unsupported BHID %s.\n", debugstr_guid(rbhid)); + + return MK_E_NOOBJECT; } static HRESULT WINAPI ShellItem_GetParent(IShellItem *iface, IShellItem **ppsi) diff -Nru wine1.3-1.3.0/dlls/shell32/shellole.c wine1.3-1.3.1/dlls/shell32/shellole.c --- wine1.3-1.3.0/dlls/shell32/shellole.c 2010-07-30 18:43:56.000000000 +0100 +++ wine1.3-1.3.1/dlls/shell32/shellole.c 2010-08-20 18:23:50.000000000 +0100 @@ -77,6 +77,7 @@ {&CLSID_ShellLink, IShellLink_Constructor}, {&CLSID_UnixDosFolder, UnixDosFolder_Constructor}, {&CLSID_UnixFolder, UnixFolder_Constructor}, + {&CLSID_ExplorerBrowser,ExplorerBrowser_Constructor}, {NULL, NULL} }; diff -Nru wine1.3-1.3.0/dlls/shell32/shfldr_unixfs.c wine1.3-1.3.1/dlls/shell32/shfldr_unixfs.c --- wine1.3-1.3.0/dlls/shell32/shfldr_unixfs.c 2010-07-30 18:43:56.000000000 +0100 +++ wine1.3-1.3.1/dlls/shell32/shfldr_unixfs.c 2010-08-20 18:23:50.000000000 +0100 @@ -716,7 +716,7 @@ WCHAR *dos_name; /* Determine the path's length bytes */ - while (current && current->mkid.cb) { + while (!_ILIsEmpty(current)) { dwPathLen += UNIXFS_filename_from_shitemid(current, NULL) + 1; /* For the '/' */ current = ILGetNext(current); }; @@ -734,7 +734,7 @@ pNextDir += strlen(szBasePath); if (This->m_dwPathMode == PATHMODE_UNIX || IsEqualCLSID(&CLSID_MyDocuments, This->m_pCLSID)) This->m_dwAttributes |= SFGAO_FILESYSTEM; - while (current && current->mkid.cb) { + while (!_ILIsEmpty(current)) { pNextDir += UNIXFS_filename_from_shitemid(current, pNextDir); *pNextDir++ = '/'; current = ILGetNext(current); @@ -948,7 +948,7 @@ TRACE("(iface=%p, pidl=%p, pbcReserver=%p, riid=%p, ppvOut=%p)\n", iface, pidl, pbcReserved, riid, ppvOut); - if (!pidl || !pidl->mkid.cb) + if (_ILIsEmpty(pidl)) return E_INVALIDARG; if (IsEqualCLSID(This->m_pCLSID, &CLSID_FolderShortcut)) { @@ -993,8 +993,8 @@ TRACE("(iface=%p, lParam=%ld, pidl1=%p, pidl2=%p)\n", iface, lParam, pidl1, pidl2); - isEmpty1 = !pidl1 || !pidl1->mkid.cb; - isEmpty2 = !pidl2 || !pidl2->mkid.cb; + isEmpty1 = _ILIsEmpty(pidl1); + isEmpty2 = _ILIsEmpty(pidl2); if (isEmpty1 && isEmpty2) return MAKE_HRESULT(SEVERITY_SUCCESS, 0, 0); @@ -1160,7 +1160,7 @@ if ((GET_SHGDN_FOR(uFlags) & SHGDN_FORPARSING) && (GET_SHGDN_RELATION(uFlags) != SHGDN_INFOLDER)) { - if (!pidl || !pidl->mkid.cb) { + if (_ILIsEmpty(pidl)) { lpName->uType = STRRET_WSTR; if (This->m_dwPathMode == PATHMODE_UNIX) { UINT len = MultiByteToWideChar(CP_UNIXCP, 0, This->m_pszPath, -1, NULL, 0); diff -Nru wine1.3-1.3.0/dlls/shell32/shlfolder.c wine1.3-1.3.1/dlls/shell32/shlfolder.c --- wine1.3-1.3.0/dlls/shell32/shlfolder.c 2010-07-30 18:43:56.000000000 +0100 +++ wine1.3-1.3.1/dlls/shell32/shlfolder.c 2010-08-20 18:23:50.000000000 +0100 @@ -271,7 +271,7 @@ TRACE("(%p %s %p %s %p)\n", pidlRoot, debugstr_w(pathRoot), pidlComplete, debugstr_guid(riid), ppvOut); - if (!pidlRoot || !ppvOut || !pidlComplete || !pidlComplete->mkid.cb) + if (!pidlRoot || !ppvOut || _ILIsEmpty(pidlComplete)) return E_INVALIDARG; *ppvOut = NULL; diff -Nru wine1.3-1.3.0/dlls/shell32/tests/ebrowser.c wine1.3-1.3.1/dlls/shell32/tests/ebrowser.c --- wine1.3-1.3.0/dlls/shell32/tests/ebrowser.c 1970-01-01 01:00:00.000000000 +0100 +++ wine1.3-1.3.1/dlls/shell32/tests/ebrowser.c 2010-08-20 18:23:50.000000000 +0100 @@ -0,0 +1,388 @@ +/* + * Unit tests for the Explorer Browser control + * + * Copyright 2010 David Hedberg + * + * 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 "shlobj.h" + +#include "wine/test.h" + +static HWND hwnd; + +/********************************************************************* + * Some simple helpers + */ +static HRESULT ebrowser_instantiate(IExplorerBrowser **peb) +{ + return CoCreateInstance(&CLSID_ExplorerBrowser, NULL, CLSCTX_INPROC_SERVER, + &IID_IExplorerBrowser, (void**)peb); +} + +static HRESULT ebrowser_initialize(IExplorerBrowser *peb) +{ + RECT rc; + rc.top = rc.left = 0; rc.bottom = rc.right = 500; + return IExplorerBrowser_Initialize(peb, hwnd, &rc, NULL); +} + +static void test_QueryInterface(void) +{ + IExplorerBrowser *peb; + IUnknown *punk; + HRESULT hr; + LONG lres; + + hr = ebrowser_instantiate(&peb); + ok(hr == S_OK, "Got 0x%08x\n", hr); + +#define test_qinterface(iid, exp) \ + do { \ + hr = IExplorerBrowser_QueryInterface(peb, &iid, (void**)&punk); \ + ok(hr == exp, "(%s:)Expected (0x%08x), got (0x%08x)\n", \ + #iid, exp, hr); \ + if(SUCCEEDED(hr)) IUnknown_Release(punk); \ + } while(0) + + test_qinterface(IID_IUnknown, S_OK); + test_qinterface(IID_IExplorerBrowser, S_OK); + test_qinterface(IID_IShellBrowser, S_OK); + todo_wine test_qinterface(IID_IOleWindow, S_OK); + todo_wine test_qinterface(IID_ICommDlgBrowser, S_OK); + todo_wine test_qinterface(IID_ICommDlgBrowser2, S_OK); + todo_wine test_qinterface(IID_ICommDlgBrowser3, S_OK); + todo_wine test_qinterface(IID_IServiceProvider, S_OK); + todo_wine test_qinterface(IID_IObjectWithSite, S_OK); + todo_wine test_qinterface(IID_IConnectionPointContainer, S_OK); + test_qinterface(IID_IOleObject, E_NOINTERFACE); + test_qinterface(IID_IViewObject, E_NOINTERFACE); + test_qinterface(IID_IViewObject2, E_NOINTERFACE); + test_qinterface(IID_IViewObjectEx, E_NOINTERFACE); + test_qinterface(IID_IConnectionPoint, E_NOINTERFACE); + test_qinterface(IID_IShellView, E_NOINTERFACE); + test_qinterface(IID_INameSpaceTreeControlEvents, E_NOINTERFACE); + +#undef test_qinterface + + lres = IExplorerBrowser_Release(peb); + ok(lres == 0, "Got %d\n", lres); +} + +static void test_SB_misc(void) +{ + IExplorerBrowser *peb; + IShellBrowser *psb; + HRESULT hr; + HWND retHwnd; + LONG lres; + + ebrowser_instantiate(&peb); + hr = IExplorerBrowser_QueryInterface(peb, &IID_IShellBrowser, (void**)&psb); + ok(hr == S_OK, "Got 0x%08x\n", hr); + if(FAILED(hr)) + { + skip("Failed to get IShellBrowser interface.\n"); + return; + } + + /* Some unimplemented methods */ + retHwnd = (HWND)0xDEADBEEF; + hr = IShellBrowser_GetControlWindow(psb, FCW_TOOLBAR, &retHwnd); + ok(hr == E_NOTIMPL, "got (0x%08x)\n", hr); + ok(retHwnd == (HWND)0xDEADBEEF, "HWND overwritten\n"); + + hr = IShellBrowser_GetControlWindow(psb, FCW_STATUS, &retHwnd); + ok(hr == E_NOTIMPL, "got (0x%08x)\n", hr); + ok(retHwnd == (HWND)0xDEADBEEF, "HWND overwritten\n"); + + hr = IShellBrowser_GetControlWindow(psb, FCW_TREE, &retHwnd); + ok(hr == E_NOTIMPL, "got (0x%08x)\n", hr); + ok(retHwnd == (HWND)0xDEADBEEF, "HWND overwritten\n"); + + hr = IShellBrowser_GetControlWindow(psb, FCW_PROGRESS, &retHwnd); + ok(hr == E_NOTIMPL, "got (0x%08x)\n", hr); + ok(retHwnd == (HWND)0xDEADBEEF, "HWND overwritten\n"); + + /* ::InsertMenuSB */ + hr = IShellBrowser_InsertMenusSB(psb, NULL, NULL); + ok(hr == E_NOTIMPL, "got (0x%08x)\n", hr); + + /* ::RemoveMenusSB */ + hr = IShellBrowser_RemoveMenusSB(psb, NULL); + ok(hr == E_NOTIMPL, "got (0x%08x)\n", hr); + + /* ::SetMenuSB */ + hr = IShellBrowser_SetMenuSB(psb, NULL, NULL, NULL); + ok(hr == E_NOTIMPL, "got (0x%08x)\n", hr); + + IShellBrowser_Release(psb); + lres = IExplorerBrowser_Release(peb); + ok(lres == 0, "Got %d\n", lres); +} + +static void test_initialization(void) +{ + IExplorerBrowser *peb; + IShellBrowser *psb; + HRESULT hr; + ULONG lres; + RECT rc; + + ebrowser_instantiate(&peb); + + if(0) + { + /* Crashes on Windows 7 */ + hr = IExplorerBrowser_Initialize(peb, NULL, NULL, NULL); + hr = IExplorerBrowser_Initialize(peb, hwnd, NULL, NULL); + } + + ZeroMemory(&rc, sizeof(RECT)); + + hr = IExplorerBrowser_Initialize(peb, NULL, &rc, NULL); + ok(hr == E_INVALIDARG, "got (0x%08x)\n", hr); + + hr = IExplorerBrowser_Initialize(peb, hwnd, &rc, NULL); + ok(hr == S_OK, "got (0x%08x)\n", hr); + + /* Initialize twice */ + hr = IExplorerBrowser_Initialize(peb, hwnd, &rc, NULL); + ok(hr == E_UNEXPECTED, "got (0x%08x)\n", hr); + + hr = IExplorerBrowser_Destroy(peb); + ok(hr == S_OK, "got (0x%08x)\n", hr); + + /* Initialize again */ + hr = IExplorerBrowser_Initialize(peb, hwnd, &rc, NULL); + ok(hr == E_UNEXPECTED, "got (0x%08x)\n", hr); + + /* Destroy again */ + hr = IExplorerBrowser_Destroy(peb); + ok(hr == S_OK, "got (0x%08x)\n", hr); + lres = IExplorerBrowser_Release(peb); + ok(lres == 0, "Got %d\n", lres); + + /* Initialize with a few different rectangles */ + peb = NULL; + ebrowser_instantiate(&peb); + rc.left = 50; rc.top = 20; rc.right = 100; rc.bottom = 80; + hr = IExplorerBrowser_Initialize(peb, hwnd, &rc, NULL); + ok(hr == S_OK, "got (0x%08x)\n", hr); + hr = IExplorerBrowser_QueryInterface(peb, &IID_IShellBrowser, (void**)&psb); + ok(hr == S_OK, "Got 0x%08x\n", hr); + if(SUCCEEDED(hr)) + { + HWND eb_hwnd; + RECT eb_rc; + char buf[1024]; + LONG style, expected_style; + static const RECT exp_rc = {0, 0, 48, 58}; + + hr = IShellBrowser_GetWindow(psb, &eb_hwnd); + ok(hr == S_OK, "Got 0x%08x\n", hr); + + GetClientRect(eb_hwnd, &eb_rc); + ok(EqualRect(&eb_rc, &exp_rc), "Got client rect (%d, %d)-(%d, %d)\n", + eb_rc.left, eb_rc.top, eb_rc.right, eb_rc.bottom); + + GetWindowRect(eb_hwnd, &eb_rc); + ok(eb_rc.right - eb_rc.left == 50, "Got window width %d\n", eb_rc.right - eb_rc.left); + ok(eb_rc.bottom - eb_rc.top == 60, "Got window height %d\n", eb_rc.bottom - eb_rc.top); + + buf[0] = '\0'; + GetClassNameA(eb_hwnd, buf, 1024); + ok(!lstrcmpA(buf, "ExplorerBrowserControl"), "Unexpected classname %s\n", buf); + + expected_style = WS_CHILD | WS_VISIBLE | WS_CLIPSIBLINGS | WS_CLIPCHILDREN | WS_BORDER; + style = GetWindowLongPtrW(eb_hwnd, GWL_STYLE); + todo_wine ok(style == expected_style, "Got style 0x%08x, expected 0x%08x\n", style, expected_style); + + expected_style = WS_EX_CONTROLPARENT; + style = GetWindowLongPtrW(eb_hwnd, GWL_EXSTYLE); + ok(style == expected_style, "Got exstyle 0x%08x, expected 0x%08x\n", style, expected_style); + + ok(GetParent(eb_hwnd) == hwnd, "GetParent returns %p\n", GetParent(eb_hwnd)); + + /* ::Destroy() destroys the window. */ + ok(IsWindow(eb_hwnd), "eb_hwnd invalid.\n"); + IExplorerBrowser_Destroy(peb); + ok(!IsWindow(eb_hwnd), "eb_hwnd valid.\n"); + + IShellBrowser_Release(psb); + lres = IExplorerBrowser_Release(peb); + ok(lres == 0, "Got refcount %d\n", lres); + } + else + { + skip("Skipping some tests.\n"); + + IExplorerBrowser_Destroy(peb); + lres = IExplorerBrowser_Release(peb); + ok(lres == 0, "Got refcount %d\n", lres); + } + + ebrowser_instantiate(&peb); + rc.left = 0; rc.top = 0; rc.right = 0; rc.bottom = 0; + hr = IExplorerBrowser_Initialize(peb, hwnd, &rc, NULL); + ok(hr == S_OK, "got (0x%08x)\n", hr); + IExplorerBrowser_Destroy(peb); + lres = IExplorerBrowser_Release(peb); + ok(lres == 0, "Got refcount %d\n", lres); + + ebrowser_instantiate(&peb); + rc.left = -1; rc.top = -1; rc.right = 1; rc.bottom = 1; + hr = IExplorerBrowser_Initialize(peb, hwnd, &rc, NULL); + ok(hr == S_OK, "got (0x%08x)\n", hr); + IExplorerBrowser_Destroy(peb); + lres = IExplorerBrowser_Release(peb); + ok(lres == 0, "Got refcount %d\n", lres); + + ebrowser_instantiate(&peb); + rc.left = 10; rc.top = 10; rc.right = 5; rc.bottom = 5; + hr = IExplorerBrowser_Initialize(peb, hwnd, &rc, NULL); + ok(hr == S_OK, "got (0x%08x)\n", hr); + IExplorerBrowser_Destroy(peb); + lres = IExplorerBrowser_Release(peb); + ok(lres == 0, "Got refcount %d\n", lres); + + ebrowser_instantiate(&peb); + rc.left = 10; rc.top = 10; rc.right = 5; rc.bottom = 5; + hr = IExplorerBrowser_Initialize(peb, hwnd, &rc, NULL); + ok(hr == S_OK, "got (0x%08x)\n", hr); + IExplorerBrowser_Destroy(peb); + lres = IExplorerBrowser_Release(peb); + ok(lres == 0, "Got refcount %d\n", lres); +} + +static void test_basics(void) +{ + IExplorerBrowser *peb; + IShellBrowser *psb; + ULONG lres; + HDWP hdwp; + RECT rc; + HRESULT hr; + + ebrowser_instantiate(&peb); + ebrowser_initialize(peb); + + /* SetRect */ + rc.left = 0; rc.top = 0; rc.right = 0; rc.bottom = 0; + hr = IExplorerBrowser_SetRect(peb, NULL, rc); + ok(hr == S_OK, "got (0x%08x)\n", hr); + + rc.left = 100; rc.top = 100; rc.right = 10; rc.bottom = 10; + hr = IExplorerBrowser_SetRect(peb, NULL, rc); + ok(hr == S_OK, "got (0x%08x)\n", hr); + + /* SetRect with DeferWindowPos */ + rc.left = rc.top = 0; rc.right = rc.bottom = 10; + hdwp = BeginDeferWindowPos(1); + hr = IExplorerBrowser_SetRect(peb, &hdwp, rc); + ok(hr == S_OK, "got (0x%08x)\n", hr); + lres = EndDeferWindowPos(hdwp); + ok(lres, "EndDeferWindowPos failed.\n"); + + hdwp = NULL; + hr = IExplorerBrowser_SetRect(peb, &hdwp, rc); + ok(hr == S_OK, "got (0x%08x)\n", hr); + ok(hdwp == NULL, "got %p\n", hdwp); + lres = EndDeferWindowPos(hdwp); + ok(!lres, "EndDeferWindowPos succeeded unexpectedly.\n"); + + /* Test positioning */ + rc.left = 10; rc.top = 20; rc.right = 50; rc.bottom = 50; + hr = IExplorerBrowser_SetRect(peb, NULL, rc); + ok(hr == S_OK, "got (0x%08x)\n", hr); + hr = IExplorerBrowser_QueryInterface(peb, &IID_IShellBrowser, (void**)&psb); + ok(hr == S_OK, "Got 0x%08x\n", hr); + if(SUCCEEDED(hr)) + { + HWND eb_hwnd; + RECT eb_rc; + static const RECT exp_rc = {11, 21, 49, 49}; + + hr = IShellBrowser_GetWindow(psb, &eb_hwnd); + ok(hr == S_OK, "Got 0x%08x\n", hr); + + GetClientRect(eb_hwnd, &eb_rc); + MapWindowPoints(eb_hwnd, hwnd, (POINT*)&eb_rc, 2); + ok(EqualRect(&eb_rc, &exp_rc), "Got rect (%d, %d) - (%d, %d)\n", + eb_rc.left, eb_rc.top, eb_rc.right, eb_rc.bottom); + + IShellBrowser_Release(psb); + } + + IExplorerBrowser_Destroy(peb); + lres = IExplorerBrowser_Release(peb); + ok(lres == 0, "Got %d\n", lres); +} + +static BOOL test_instantiate_control(void) +{ + IExplorerBrowser *peb; + HRESULT hr; + + hr = ebrowser_instantiate(&peb); + ok(hr == S_OK || hr == REGDB_E_CLASSNOTREG, "Got (0x%08x)\n", hr); + if(FAILED(hr)) + return FALSE; + + IExplorerBrowser_Release(peb); + return TRUE; +} + +static void setup_window(void) +{ + WNDCLASSW wc; + static const WCHAR ebtestW[] = {'e','b','t','e','s','t',0}; + + ZeroMemory(&wc, sizeof(WNDCLASSW)); + wc.lpfnWndProc = DefWindowProcW; + wc.lpszClassName = ebtestW; + RegisterClassW(&wc); + hwnd = CreateWindowExW(0, ebtestW, NULL, 0, + 0, 0, 500, 500, + NULL, 0, 0, NULL); + ok(hwnd != NULL, "Failed to create window for tests.\n"); +} + +START_TEST(ebrowser) +{ + OleInitialize(NULL); + + if(!test_instantiate_control()) + { + win_skip("No ExplorerBrowser control..\n"); + OleUninitialize(); + return; + } + + setup_window(); + + test_QueryInterface(); + test_SB_misc(); + test_initialization(); + test_basics(); + + DestroyWindow(hwnd); + OleUninitialize(); +} diff -Nru wine1.3-1.3.0/dlls/shell32/tests/Makefile.in wine1.3-1.3.1/dlls/shell32/tests/Makefile.in --- wine1.3-1.3.0/dlls/shell32/tests/Makefile.in 2010-07-30 18:43:56.000000000 +0100 +++ wine1.3-1.3.1/dlls/shell32/tests/Makefile.in 2010-08-20 18:23:50.000000000 +0100 @@ -9,6 +9,7 @@ appbar.c \ autocomplete.c \ brsfolder.c \ + ebrowser.c \ generated.c \ progman_dde.c \ shelllink.c \ diff -Nru wine1.3-1.3.0/dlls/shell32/tests/shlfolder.c wine1.3-1.3.1/dlls/shell32/tests/shlfolder.c --- wine1.3-1.3.0/dlls/shell32/tests/shlfolder.c 2010-07-30 18:43:56.000000000 +0100 +++ wine1.3-1.3.1/dlls/shell32/tests/shlfolder.c 2010-08-20 18:23:50.000000000 +0100 @@ -69,6 +69,13 @@ static HRESULT (WINAPI *pSHGetIDListFromObject)(IUnknown*, PIDLIST_ABSOLUTE*); static HRESULT (WINAPI *pSHGetItemFromObject)(IUnknown*,REFIID,void**); +static int strcmp_wa(LPCWSTR strw, const char *stra) +{ + CHAR buf[512]; + WideCharToMultiByte(CP_ACP, 0, strw, -1, buf, sizeof(buf), NULL, NULL); + return lstrcmpA(stra, buf); +} + static void init_function_pointers(void) { HMODULE hmod; @@ -2233,13 +2240,16 @@ } IShellFolder_Release(psf); - hrSI = pSHGetNameFromIDList(pidl, SIGDN_FILESYSPATH, &nameSI); - ok(hrSI == S_OK, "Got 0x%08x\n", hrSI); - res = SHGetPathFromIDListW(pidl, buf); - ok(res == TRUE, "Got %d\n", res); - if(SUCCEEDED(hrSI) && res) - ok(!lstrcmpW(nameSI, buf), "Strings differ.\n"); - if(SUCCEEDED(hrSI)) CoTaskMemFree(nameSI); + if(pSHGetPathFromIDListW){ + hrSI = pSHGetNameFromIDList(pidl, SIGDN_FILESYSPATH, &nameSI); + ok(hrSI == S_OK, "Got 0x%08x\n", hrSI); + res = pSHGetPathFromIDListW(pidl, buf); + ok(res == TRUE, "Got %d\n", res); + if(SUCCEEDED(hrSI) && res) + ok(!lstrcmpW(nameSI, buf), "Strings differ.\n"); + if(SUCCEEDED(hrSI)) CoTaskMemFree(nameSI); + }else + win_skip("pSHGetPathFromIDListW not available\n"); hres = pSHGetNameFromIDList(pidl, SIGDN_URL, &name_string); todo_wine ok(hres == S_OK, "Got 0x%08x\n", hres); @@ -2289,13 +2299,16 @@ } IShellFolder_Release(psf); - hrSI = pSHGetNameFromIDList(pidl, SIGDN_FILESYSPATH, &nameSI); - ok(hrSI == E_INVALIDARG, "Got 0x%08x\n", hrSI); - res = SHGetPathFromIDListW(pidl, buf); - ok(res == FALSE, "Got %d\n", res); - if(SUCCEEDED(hrSI) && res) - ok(!lstrcmpW(nameSI, buf), "Strings differ.\n"); - if(SUCCEEDED(hrSI)) CoTaskMemFree(nameSI); + if(pSHGetPathFromIDListW){ + hrSI = pSHGetNameFromIDList(pidl, SIGDN_FILESYSPATH, &nameSI); + ok(hrSI == E_INVALIDARG, "Got 0x%08x\n", hrSI); + res = pSHGetPathFromIDListW(pidl, buf); + ok(res == FALSE, "Got %d\n", res); + if(SUCCEEDED(hrSI) && res) + ok(!lstrcmpW(nameSI, buf), "Strings differ.\n"); + if(SUCCEEDED(hrSI)) CoTaskMemFree(nameSI); + }else + win_skip("pSHGetPathFromIDListW not available\n"); hres = pSHGetNameFromIDList(pidl, SIGDN_URL, &name_string); todo_wine ok(hres == E_NOTIMPL /* Win7 */ || hres == S_OK /* Vista */, @@ -3205,6 +3218,157 @@ Cleanup(); } +static void test_ShellItemBindToHandler(void) +{ + IShellItem *psi; + LPITEMIDLIST pidl_desktop; + HRESULT hr; + + if(!pSHCreateShellItem) + { + skip("SHCreateShellItem missing.\n"); + return; + } + + hr = pSHGetSpecialFolderLocation(NULL, CSIDL_DESKTOP, &pidl_desktop); + ok(hr == S_OK, "Got 0x%08x\n", hr); + if(SUCCEEDED(hr)) + { + hr = pSHCreateShellItem(NULL, NULL, pidl_desktop, &psi); + ok(hr == S_OK, "Got 0x%08x\n", hr); + } + if(SUCCEEDED(hr)) + { + IPersistFolder2 *ppf2; + IUnknown *punk; + + if(0) + { + /* Crashes under Windows 7 */ + hr = IShellItem_BindToHandler(psi, NULL, NULL, NULL, NULL); + hr = IShellItem_BindToHandler(psi, NULL, &IID_IUnknown, &IID_IUnknown, NULL); + } + hr = IShellItem_BindToHandler(psi, NULL, &IID_IUnknown, &IID_IUnknown, (void**)&punk); + ok(hr == MK_E_NOOBJECT, "Got 0x%08x\n", hr); + + /* BHID_SFObject */ + hr = IShellItem_BindToHandler(psi, NULL, &BHID_SFObject, &IID_IShellFolder, (void**)&punk); + ok(hr == S_OK, "Got 0x%08x\n", hr); + if(SUCCEEDED(hr)) IUnknown_Release(punk); + hr = IShellItem_BindToHandler(psi, NULL, &BHID_SFObject, &IID_IPersistFolder2, (void**)&ppf2); + ok(hr == S_OK, "Got 0x%08x\n", hr); + if(SUCCEEDED(hr)) + { + LPITEMIDLIST pidl_tmp; + hr = IPersistFolder2_GetCurFolder(ppf2, &pidl_tmp); + ok(hr == S_OK, "Got 0x%08x\n", hr); + if(SUCCEEDED(hr)) + { + ok(ILIsEqual(pidl_desktop, pidl_tmp), "Pidl not equal (%p, %p)\n", pidl_desktop, pidl_tmp); + pILFree(pidl_tmp); + } + IPersistFolder2_Release(ppf2); + } + + todo_wine + { + /* BHID_SFUIObject */ + hr = IShellItem_BindToHandler(psi, NULL, &BHID_SFUIObject, &IID_IDataObject, (void**)&punk); + ok(hr == S_OK || broken(hr == E_NOINTERFACE /* XP */), "Got 0x%08x\n", hr); + if(SUCCEEDED(hr)) IUnknown_Release(punk); + hr = IShellItem_BindToHandler(psi, NULL, &BHID_SFUIObject, &IID_IContextMenu, (void**)&punk); + ok(hr == S_OK || broken(hr == E_NOINTERFACE /* XP */), "Got 0x%08x\n", hr); + if(SUCCEEDED(hr)) IUnknown_Release(punk); + + /* BHID_SFViewObject */ + hr = IShellItem_BindToHandler(psi, NULL, &BHID_SFViewObject, &IID_IShellView, (void**)&punk); + ok(hr == S_OK, "Got 0x%08x\n", hr); + if(SUCCEEDED(hr)) IUnknown_Release(punk); + hr = IShellItem_BindToHandler(psi, NULL, &BHID_SFViewObject, &IID_IShellFolderView, (void**)&punk); + ok(hr == E_NOINTERFACE, "Got 0x%08x\n", hr); + if(SUCCEEDED(hr)) IUnknown_Release(punk); + + /* BHID_Storage */ + hr = IShellItem_BindToHandler(psi, NULL, &BHID_Storage, &IID_IStream, (void**)&punk); + ok(hr == E_NOINTERFACE, "Got 0x%08x\n", hr); + if(SUCCEEDED(hr)) IUnknown_Release(punk); + hr = IShellItem_BindToHandler(psi, NULL, &BHID_Storage, &IID_IUnknown, (void**)&punk); + ok(hr == S_OK, "Got 0x%08x\n", hr); + if(SUCCEEDED(hr)) IUnknown_Release(punk); + + /* BHID_Stream */ + hr = IShellItem_BindToHandler(psi, NULL, &BHID_Stream, &IID_IStream, (void**)&punk); + ok(hr == E_NOINTERFACE, "Got 0x%08x\n", hr); + if(SUCCEEDED(hr)) IUnknown_Release(punk); + hr = IShellItem_BindToHandler(psi, NULL, &BHID_Stream, &IID_IUnknown, (void**)&punk); + ok(hr == S_OK, "Got 0x%08x\n", hr); + if(SUCCEEDED(hr)) IUnknown_Release(punk); + + /* BHID_StorageEnum */ + hr = IShellItem_BindToHandler(psi, NULL, &BHID_StorageEnum, &IID_IEnumShellItems, (void**)&punk); + ok(hr == S_OK, "Got 0x%08x\n", hr); + if(SUCCEEDED(hr)) IUnknown_Release(punk); + + /* BHID_Transfer */ + hr = IShellItem_BindToHandler(psi, NULL, &BHID_Transfer, &IID_IUnknown, (void**)&punk); + ok(hr == E_NOINTERFACE || broken(hr == MK_E_NOOBJECT /* XP */), "Got 0x%08x\n", hr); + if(SUCCEEDED(hr)) IUnknown_Release(punk); + + /* BHID_EnumItems */ + hr = IShellItem_BindToHandler(psi, NULL, &BHID_EnumItems, &IID_IEnumShellItems, (void**)&punk); + ok(hr == S_OK || broken(hr == MK_E_NOOBJECT /* XP */), "Got 0x%08x\n", hr); + if(SUCCEEDED(hr)) IUnknown_Release(punk); + + /* BHID_DataObject */ + hr = IShellItem_BindToHandler(psi, NULL, &BHID_DataObject, &IID_IDataObject, (void**)&punk); + ok(hr == S_OK || broken(hr == MK_E_NOOBJECT /* XP */), "Got 0x%08x\n", hr); + if(SUCCEEDED(hr)) IUnknown_Release(punk); + + /* BHID_Filter */ + hr = IShellItem_BindToHandler(psi, NULL, &BHID_Filter, &IID_IUnknown, (void**)&punk); + ok(hr == S_OK || broken(hr == MK_E_NOOBJECT /* XP */), "Got 0x%08x\n", hr); + if(SUCCEEDED(hr)) IUnknown_Release(punk); + + /* BHID_LinkTargetItem */ + hr = IShellItem_BindToHandler(psi, NULL, &BHID_LinkTargetItem, &IID_IShellItem, (void**)&punk); + ok(hr == E_NOINTERFACE || broken(hr == E_INVALIDARG /* XP */), "Got 0x%08x\n", hr); + if(SUCCEEDED(hr)) IUnknown_Release(punk); + hr = IShellItem_BindToHandler(psi, NULL, &BHID_LinkTargetItem, &IID_IUnknown, (void**)&punk); + ok(hr == E_NOINTERFACE || broken(hr == E_INVALIDARG /* XP */), "Got 0x%08x\n", hr); + if(SUCCEEDED(hr)) IUnknown_Release(punk); + + /* BHID_PropertyStore */ + hr = IShellItem_BindToHandler(psi, NULL, &BHID_PropertyStore, &IID_IPropertyStore, (void**)&punk); + ok(hr == E_NOINTERFACE || broken(hr == MK_E_NOOBJECT /* XP */), "Got 0x%08x\n", hr); + if(SUCCEEDED(hr)) IUnknown_Release(punk); + hr = IShellItem_BindToHandler(psi, NULL, &BHID_PropertyStore, &IID_IPropertyStoreFactory, (void**)&punk); + ok(hr == E_NOINTERFACE || broken(hr == MK_E_NOOBJECT /* XP */), "Got 0x%08x\n", hr); + if(SUCCEEDED(hr)) IUnknown_Release(punk); + + /* BHID_ThumbnailHandler */ + hr = IShellItem_BindToHandler(psi, NULL, &BHID_ThumbnailHandler, &IID_IUnknown, (void**)&punk); + ok(hr == E_INVALIDARG || broken(hr == MK_E_NOOBJECT /* XP */), "Got 0x%08x\n", hr); + if(SUCCEEDED(hr)) IUnknown_Release(punk); + + /* BHID_AssociationArray */ + hr = IShellItem_BindToHandler(psi, NULL, &BHID_AssociationArray, &IID_IQueryAssociations, (void**)&punk); + ok(hr == S_OK || broken(hr == MK_E_NOOBJECT /* XP */), "Got 0x%08x\n", hr); + if(SUCCEEDED(hr)) IUnknown_Release(punk); + + /* BHID_EnumAssocHandlers */ + hr = IShellItem_BindToHandler(psi, NULL, &BHID_EnumAssocHandlers, &IID_IUnknown, (void**)&punk); + ok(hr == E_NOINTERFACE || broken(hr == MK_E_NOOBJECT /* XP */), "Got 0x%08x\n", hr); + if(SUCCEEDED(hr)) IUnknown_Release(punk); + } + + IShellItem_Release(psi); + } + else + skip("Failed to create ShellItem.\n"); + + pILFree(pidl_desktop); +} + static void test_SHParseDisplayName(void) { LPITEMIDLIST pidl1, pidl2; @@ -3347,7 +3511,7 @@ CreateFilesFolders(); hr = IShellFolder_ParseDisplayName(psf_desktop, NULL, NULL, path, NULL, &pidl, 0); - ok(hr == S_OK, "Got 0x%08x\n", hr); + ok(hr == S_OK || broken(hr == E_FAIL) /* WinME */, "Got 0x%08x\n", hr); if(SUCCEEDED(hr)) { IShellFolder *psf; @@ -3462,10 +3626,17 @@ return; } - ok_(__FILE__,l)(filename.uType == STRRET_WSTR, "Got unexpected string type: %d\n", filename.uType); - ok_(__FILE__,l)(lstrcmpW(path, filename.pOleStr) == 0, - "didn't get expected path (%s), instead: %s\n", - wine_dbgstr_w(path), wine_dbgstr_w(filename.pOleStr)); + ok_(__FILE__,l)(filename.uType == STRRET_WSTR || filename.uType == STRRET_CSTR, + "Got unexpected string type: %d\n", filename.uType); + if(filename.uType == STRRET_WSTR){ + ok_(__FILE__,l)(lstrcmpW(path, filename.pOleStr) == 0, + "didn't get expected path (%s), instead: %s\n", + wine_dbgstr_w(path), wine_dbgstr_w(filename.pOleStr)); + }else if(filename.uType == STRRET_CSTR){ + ok_(__FILE__,l)(strcmp_wa(path, filename.cStr) == 0, + "didn't get expected path (%s), instead: %s\n", + wine_dbgstr_w(path), filename.cStr); + } IShellFolder_Release(parent); }else @@ -3686,6 +3857,171 @@ IShellFolder_Release(psf); } +static const CHAR testwindow_class[] = "testwindow"; +#define WM_USER_NOTIFY (WM_APP+1) + +static struct { + const char *id; + BOOL exp_notify; + UINT signal; + const WCHAR *path_1; + const WCHAR *path_2; +} exp_data; + +static LRESULT CALLBACK testwindow_wndproc(HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam) +{ + UINT signal = (UINT)lparam; + + switch(msg){ + case WM_USER_NOTIFY: + if(exp_data.exp_notify){ + LPCITEMIDLIST *pidls = (LPCITEMIDLIST*)wparam; + + ok(exp_data.signal == signal, + "%s: expected notification type %x, got: %x\n", + exp_data.id, exp_data.signal, signal); + + trace("verifying pidls for: %s\n", exp_data.id); + verify_pidl(pidls[0], exp_data.path_1); + verify_pidl(pidls[1], exp_data.path_2); + + exp_data.exp_notify = FALSE; + }else + ok(exp_data.exp_notify, "Didn't expect a WM_USER_NOTIFY message (event: %x)\n", signal); + return 0; + } + return DefWindowProc(hwnd, msg, wparam, lparam); +} + +static void register_testwindow_class(void) +{ + WNDCLASSEXA cls; + ATOM ret; + + ZeroMemory(&cls, sizeof(cls)); + cls.cbSize = sizeof(cls); + cls.style = 0; + cls.lpfnWndProc = testwindow_wndproc; + cls.hInstance = GetModuleHandleA(NULL); + cls.lpszClassName = testwindow_class; + + SetLastError(0); + ret = RegisterClassExA(&cls); + ok(ret != 0, "RegisterClassExA failed: %d\n", GetLastError()); +} + +/* SHCNF_FLUSH doesn't seem to work as advertised for SHCNF_PATHA, so we + * have to poll repeatedly for the message to appear */ +static void do_events(void) +{ + int c = 0; + while (exp_data.exp_notify && (c++ < 10)){ + MSG msg; + while(PeekMessageA(&msg, NULL, 0, 0, PM_REMOVE)){ + TranslateMessage(&msg); + DispatchMessageA(&msg); + } + if(exp_data.exp_notify) + Sleep(500); + } + trace("%s: took %d tries\n", exp_data.id, c); +} + +static void test_SHChangeNotify(void) +{ + HWND wnd; + ULONG notifyID; + HRESULT hr; + BOOL br, has_unicode; + SHChangeNotifyEntry entries[1]; + const CHAR root_dirA[] = "C:\\shell32_cn_test"; + const WCHAR root_dirW[] = {'C',':','\\','s','h','e','l','l','3','2','_','c','n','_','t','e','s','t',0}; + const CHAR test_dirA[] = "C:\\shell32_cn_test\\test"; + const WCHAR test_dirW[] = {'C',':','\\','s','h','e','l','l','3','2','_','c','n','_','t','e','s','t','\\','t','e','s','t',0}; + + CreateDirectoryW(NULL, NULL); + has_unicode = !(GetLastError() == ERROR_CALL_NOT_IMPLEMENTED); + + /* set up the root directory & window */ + br = CreateDirectoryA(root_dirA, NULL); + ok(br == TRUE, "CreateDirectory failed: %d\n", GetLastError()); + + register_testwindow_class(); + + wnd = CreateWindowExA(0, testwindow_class, testwindow_class, 0, + CW_USEDEFAULT, CW_USEDEFAULT, 130, 105, + NULL, NULL, GetModuleHandleA(NULL), 0); + ok(wnd != NULL, "Failed to make a window\n"); + + entries[0].pidl = NULL; + if(has_unicode) + hr = SHILCreateFromPath(root_dirW, (LPITEMIDLIST*)&entries[0].pidl, 0); + else + hr = SHILCreateFromPath((LPCVOID)root_dirA, (LPITEMIDLIST*)&entries[0].pidl, 0); + ok(hr == S_OK, "SHILCreateFromPath failed: 0x%08x\n", hr); + entries[0].fRecursive = TRUE; + + notifyID = SHChangeNotifyRegister(wnd, SHCNRF_ShellLevel, + SHCNE_ALLEVENTS, WM_USER_NOTIFY, 1, entries); + ok(notifyID != 0, "Failed to register a window for change notifications\n"); + + /* MKDIR */ + br = CreateDirectoryA(test_dirA, NULL); + ok(br == TRUE, "CreateDirectory failed: %d\n", GetLastError()); + + if(has_unicode){ + exp_data.id = "MKDIR PATHW"; + exp_data.signal = SHCNE_MKDIR; + exp_data.exp_notify = TRUE; + exp_data.path_1 = test_dirW; + exp_data.path_2 = NULL; + SHChangeNotify(SHCNE_MKDIR, SHCNF_PATHW | SHCNF_FLUSH, test_dirW, NULL); + do_events(); + ok(exp_data.exp_notify == FALSE, "Expected wndproc to be called\n"); + }else + win_skip("skipping WCHAR tests\n"); + + exp_data.id = "MKDIR PATHA"; + exp_data.signal = SHCNE_MKDIR; + exp_data.exp_notify = TRUE; + exp_data.path_1 = test_dirW; + exp_data.path_2 = NULL; + SHChangeNotify(SHCNE_MKDIR, SHCNF_PATHA | SHCNF_FLUSH, test_dirA, NULL); + do_events(); + ok(exp_data.exp_notify == FALSE, "Expected wndproc to be called\n"); + + /* RMDIR */ + br = RemoveDirectoryA(test_dirA); + ok(br == TRUE, "RemoveDirectory failed: %d\n", GetLastError()); + + if(has_unicode){ + exp_data.id = "RMDIR PATHW"; + exp_data.signal = SHCNE_RMDIR; + exp_data.exp_notify = TRUE; + exp_data.path_1 = test_dirW; + exp_data.path_2 = NULL; + SHChangeNotify(SHCNE_RMDIR, SHCNF_PATHW | SHCNF_FLUSH, test_dirW, NULL); + do_events(); + ok(exp_data.exp_notify == FALSE, "Expected wndproc to be called\n"); + }else + win_skip("skipping WCHAR tests\n"); + + exp_data.id = "RMDIR PATHA"; + exp_data.signal = SHCNE_RMDIR; + exp_data.exp_notify = TRUE; + exp_data.path_1 = test_dirW; + exp_data.path_2 = NULL; + SHChangeNotify(SHCNE_RMDIR, SHCNF_PATHA | SHCNF_FLUSH, test_dirA, NULL); + do_events(); + ok(exp_data.exp_notify == FALSE, "Expected wndproc to be called\n"); + + SHChangeNotifyDeregister(notifyID); + DestroyWindow(wnd); + + br = RemoveDirectoryA(root_dirA); + ok(br == TRUE, "RemoveDirectory failed: %d\n", GetLastError()); +} + START_TEST(shlfolder) { init_function_pointers(); @@ -3716,6 +4052,8 @@ test_SHGetIDListFromObject(); test_SHGetItemFromObject(); test_ShellItemCompare(); + test_SHChangeNotify(); + test_ShellItemBindToHandler(); OleUninitialize(); } diff -Nru wine1.3-1.3.0/dlls/shlwapi/tests/string.c wine1.3-1.3.1/dlls/shlwapi/tests/string.c --- wine1.3-1.3.0/dlls/shlwapi/tests/string.c 2010-07-30 18:43:56.000000000 +0100 +++ wine1.3-1.3.1/dlls/shlwapi/tests/string.c 2010-08-20 18:23:50.000000000 +0100 @@ -1421,19 +1421,17 @@ test_StrToIntExA(); test_StrToIntExW(); test_StrDupA(); - if (lstrcmp(thousandDelim, ",")==0 && lstrcmp(decimalDelim, ".")==0) - { - /* these tests are locale-dependent */ - test_StrFormatByteSize64A(); - test_StrFormatKBSizeA(); - test_StrFormatKBSizeW(); - } /* language-dependent test */ if (PRIMARYLANGID(GetUserDefaultLangID()) != LANG_ENGLISH) - trace("Skipping StrFromTimeInterval test for non English language\n"); + skip("English is required for StrFromTimeInterval and StrFormat*Size tests\n"); else + { + test_StrFormatByteSize64A(); + test_StrFormatKBSizeA(); + test_StrFormatKBSizeW(); test_StrFromTimeIntervalA(); + } test_StrCmpA(); test_StrCmpW(); diff -Nru wine1.3-1.3.0/dlls/urlmon/tests/uri.c wine1.3-1.3.1/dlls/urlmon/tests/uri.c --- wine1.3-1.3.0/dlls/urlmon/tests/uri.c 2010-07-30 18:43:56.000000000 +0100 +++ wine1.3-1.3.1/dlls/urlmon/tests/uri.c 2010-08-20 18:23:50.000000000 +0100 @@ -18,16 +18,6 @@ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */ -/* - * IUri testing framework goals: - * - Test invalid args - * - invalid flags - * - invalid args (IUri, uri string) - * - Test parsing for components when no canonicalization occurs - * - Test parsing for components when canonicalization occurs. - * - More tests... - */ - #include #include #include @@ -41,11 +31,16 @@ #define URI_STR_PROPERTY_COUNT Uri_PROPERTY_STRING_LAST+1 #define URI_DWORD_PROPERTY_COUNT (Uri_PROPERTY_DWORD_LAST - Uri_PROPERTY_DWORD_START)+1 +#define URI_BUILDER_STR_PROPERTY_COUNT 7 static HRESULT (WINAPI *pCreateUri)(LPCWSTR, DWORD, DWORD_PTR, IUri**); +static HRESULT (WINAPI *pCreateUriWithFragment)(LPCWSTR, LPCWSTR, DWORD, DWORD_PTR, IUri**); +static HRESULT (WINAPI *pCreateIUriBuilder)(IUri*, DWORD, DWORD_PTR, IUriBuilder**); static const WCHAR http_urlW[] = { 'h','t','t','p',':','/','/','w','w','w','.','w','i','n','e','h','q', '.','o','r','g','/',0}; +static const WCHAR http_url_fragW[] = { 'h','t','t','p',':','/','/','w','w','w','.','w','i','n','e','h','q', + '.','o','r','g','/','#','F','r','a','g',0}; typedef struct _uri_create_flag_test { DWORD flags; @@ -92,26 +87,26 @@ Uri_HAS_ABSOLUTE_URI|Uri_HAS_AUTHORITY|Uri_HAS_DISPLAY_URI|Uri_HAS_DOMAIN|Uri_HAS_HOST| Uri_HAS_PATH|Uri_HAS_PATH_AND_QUERY|Uri_HAS_RAW_URI|Uri_HAS_SCHEME_NAME|Uri_HAS_HOST_TYPE| Uri_HAS_PORT|Uri_HAS_SCHEME, - TRUE, + FALSE, { - {"http://www.winehq.org/",S_OK,TRUE}, /* ABSOLUTE_URI */ - {"www.winehq.org",S_OK,TRUE}, /* AUTHORITY */ - {"http://www.winehq.org/",S_OK,TRUE}, /* DISPLAY_URI */ - {"winehq.org",S_OK,TRUE}, /* DOMAIN */ - {"",S_FALSE,TRUE}, /* EXTENSION */ - {"",S_FALSE,TRUE}, /* FRAGMENT */ + {"http://www.winehq.org/",S_OK,FALSE}, /* ABSOLUTE_URI */ + {"www.winehq.org",S_OK,FALSE}, /* AUTHORITY */ + {"http://www.winehq.org/",S_OK,FALSE}, /* DISPLAY_URI */ + {"winehq.org",S_OK,FALSE}, /* DOMAIN */ + {"",S_FALSE,FALSE}, /* EXTENSION */ + {"",S_FALSE,FALSE}, /* FRAGMENT */ {"www.winehq.org",S_OK,FALSE}, /* HOST */ {"",S_FALSE,FALSE}, /* PASSWORD */ - {"/",S_OK,TRUE}, /* PATH */ - {"/",S_OK,TRUE}, /* PATH_AND_QUERY */ - {"",S_FALSE,TRUE}, /* QUERY */ + {"/",S_OK,FALSE}, /* PATH */ + {"/",S_OK,FALSE}, /* PATH_AND_QUERY */ + {"",S_FALSE,FALSE}, /* QUERY */ {"http://www.winehq.org/tests/../tests/../..",S_OK,FALSE}, /* RAW_URI */ {"http",S_OK,FALSE}, /* SCHEME_NAME */ {"",S_FALSE,FALSE}, /* USER_INFO */ {"",S_FALSE,FALSE} /* USER_NAME */ }, { - {Uri_HOST_DNS,S_OK,TRUE}, /* HOST_TYPE */ + {Uri_HOST_DNS,S_OK,FALSE}, /* HOST_TYPE */ {80,S_OK,FALSE}, /* PORT */ {URL_SCHEME_HTTP,S_OK,FALSE}, /* SCHEME */ {URLZONE_INVALID,E_NOTIMPL,FALSE} /* ZONE */ @@ -121,26 +116,26 @@ Uri_HAS_ABSOLUTE_URI|Uri_HAS_AUTHORITY|Uri_HAS_DISPLAY_URI|Uri_HAS_DOMAIN|Uri_HAS_HOST| Uri_HAS_PATH|Uri_HAS_PATH_AND_QUERY|Uri_HAS_RAW_URI|Uri_HAS_SCHEME_NAME|Uri_HAS_HOST_TYPE| Uri_HAS_PORT|Uri_HAS_SCHEME, - TRUE, + FALSE, { - {"http://winehq.org/tests",S_OK,TRUE}, - {"winehq.org",S_OK,TRUE}, - {"http://winehq.org/tests",S_OK,TRUE}, - {"winehq.org",S_OK,TRUE}, - {"",S_FALSE,TRUE}, - {"",S_FALSE,TRUE}, + {"http://winehq.org/tests",S_OK,FALSE}, + {"winehq.org",S_OK,FALSE}, + {"http://winehq.org/tests",S_OK,FALSE}, {"winehq.org",S_OK,FALSE}, {"",S_FALSE,FALSE}, - {"/tests",S_OK,TRUE}, - {"/tests",S_OK,TRUE}, - {"",S_FALSE,TRUE}, + {"",S_FALSE,FALSE}, + {"winehq.org",S_OK,FALSE}, + {"",S_FALSE,FALSE}, + {"/tests",S_OK,FALSE}, + {"/tests",S_OK,FALSE}, + {"",S_FALSE,FALSE}, {"http://winehq.org/tests/.././tests",S_OK,FALSE}, {"http",S_OK,FALSE}, {"",S_FALSE,FALSE}, {"",S_FALSE,FALSE} }, { - {Uri_HOST_DNS,S_OK,TRUE}, + {Uri_HOST_DNS,S_OK,FALSE}, {80,S_OK,FALSE}, {URL_SCHEME_HTTP,S_OK,FALSE}, {URLZONE_INVALID,E_NOTIMPL,FALSE} @@ -150,26 +145,26 @@ Uri_HAS_ABSOLUTE_URI|Uri_HAS_AUTHORITY|Uri_HAS_DISPLAY_URI|Uri_HAS_DOMAIN|Uri_HAS_HOST| Uri_HAS_DOMAIN|Uri_HAS_PATH|Uri_HAS_PATH_AND_QUERY|Uri_HAS_QUERY|Uri_HAS_RAW_URI| Uri_HAS_SCHEME_NAME|Uri_HAS_HOST_TYPE|Uri_HAS_PORT|Uri_HAS_SCHEME, - TRUE, + FALSE, { - {"http://www.winehq.org/?query=x&return=y",S_OK,TRUE}, - {"www.winehq.org",S_OK,TRUE}, - {"http://www.winehq.org/?query=x&return=y",S_OK,TRUE}, - {"winehq.org",S_OK,TRUE}, - {"",S_FALSE,TRUE}, - {"",S_FALSE,TRUE}, + {"http://www.winehq.org/?query=x&return=y",S_OK,FALSE}, + {"www.winehq.org",S_OK,FALSE}, + {"http://www.winehq.org/?query=x&return=y",S_OK,FALSE}, + {"winehq.org",S_OK,FALSE}, + {"",S_FALSE,FALSE}, + {"",S_FALSE,FALSE}, {"www.winehq.org",S_OK,FALSE}, {"",S_FALSE,FALSE}, - {"/",S_OK,TRUE}, - {"/?query=x&return=y",S_OK,TRUE}, - {"?query=x&return=y",S_OK,TRUE}, + {"/",S_OK,FALSE}, + {"/?query=x&return=y",S_OK,FALSE}, + {"?query=x&return=y",S_OK,FALSE}, {"HtTp://www.winehq.org/tests/..?query=x&return=y",S_OK,FALSE}, {"http",S_OK,FALSE}, {"",S_FALSE,FALSE}, {"",S_FALSE,FALSE} }, { - {Uri_HOST_DNS,S_OK,TRUE}, + {Uri_HOST_DNS,S_OK,FALSE}, {80,S_OK,FALSE}, {URL_SCHEME_HTTP,S_OK,FALSE}, {URLZONE_INVALID,E_NOTIMPL,FALSE}, @@ -179,26 +174,26 @@ Uri_HAS_ABSOLUTE_URI|Uri_HAS_AUTHORITY|Uri_HAS_DISPLAY_URI|Uri_HAS_DOMAIN|Uri_HAS_HOST|Uri_HAS_PATH| Uri_HAS_PATH_AND_QUERY|Uri_HAS_RAW_URI|Uri_HAS_SCHEME_NAME|Uri_HAS_USER_INFO|Uri_HAS_USER_NAME| Uri_HAS_HOST_TYPE|Uri_HAS_PORT|Uri_HAS_SCHEME, - TRUE, + FALSE, { - {"http://usEr%3Ainfo@example.com/path/a/Forbidden'%3C%7C%3E%20Characters",S_OK,TRUE}, - {"usEr%3Ainfo@example.com",S_OK,TRUE}, - {"http://example.com/path/a/Forbidden'%3C%7C%3E%20Characters",S_OK,TRUE}, - {"example.com",S_OK,TRUE}, - {"",S_FALSE,TRUE}, - {"",S_FALSE,TRUE}, + {"http://usEr%3Ainfo@example.com/path/a/Forbidden'%3C%7C%3E%20Characters",S_OK,FALSE}, + {"usEr%3Ainfo@example.com",S_OK,FALSE}, + {"http://example.com/path/a/Forbidden'%3C%7C%3E%20Characters",S_OK,FALSE}, {"example.com",S_OK,FALSE}, {"",S_FALSE,FALSE}, - {"/path/a/Forbidden'%3C%7C%3E%20Characters",S_OK,TRUE}, - {"/path/a/Forbidden'%3C%7C%3E%20Characters",S_OK,TRUE}, - {"",S_FALSE,TRUE}, + {"",S_FALSE,FALSE}, + {"example.com",S_OK,FALSE}, + {"",S_FALSE,FALSE}, + {"/path/a/Forbidden'%3C%7C%3E%20Characters",S_OK,FALSE}, + {"/path/a/Forbidden'%3C%7C%3E%20Characters",S_OK,FALSE}, + {"",S_FALSE,FALSE}, {"hTTp://us%45r%3Ainfo@examp%4CE.com:80/path/a/b/./c/../%2E%2E/Forbidden'<|> Characters",S_OK,FALSE}, {"http",S_OK,FALSE}, {"usEr%3Ainfo",S_OK,FALSE}, {"usEr%3Ainfo",S_OK,FALSE} }, { - {Uri_HOST_DNS,S_OK,TRUE}, + {Uri_HOST_DNS,S_OK,FALSE}, {80,S_OK,FALSE}, {URL_SCHEME_HTTP,S_OK,FALSE}, {URLZONE_INVALID,E_NOTIMPL,FALSE}, @@ -209,26 +204,26 @@ Uri_HAS_HOST|Uri_HAS_PASSWORD|Uri_HAS_PATH|Uri_HAS_PATH_AND_QUERY|Uri_HAS_RAW_URI| Uri_HAS_SCHEME_NAME|Uri_HAS_USER_INFO|Uri_HAS_USER_NAME|Uri_HAS_HOST_TYPE|Uri_HAS_PORT| Uri_HAS_SCHEME, - TRUE, + FALSE, { - {"ftp://winepass:wine@ftp.winehq.org:9999/dir/foo%20bar.txt",S_OK,TRUE}, - {"winepass:wine@ftp.winehq.org:9999",S_OK,TRUE}, - {"ftp://ftp.winehq.org:9999/dir/foo%20bar.txt",S_OK,TRUE}, - {"winehq.org",S_OK,TRUE}, - {".txt",S_OK,TRUE}, - {"",S_FALSE,TRUE}, + {"ftp://winepass:wine@ftp.winehq.org:9999/dir/foo%20bar.txt",S_OK,FALSE}, + {"winepass:wine@ftp.winehq.org:9999",S_OK,FALSE}, + {"ftp://ftp.winehq.org:9999/dir/foo%20bar.txt",S_OK,FALSE}, + {"winehq.org",S_OK,FALSE}, + {".txt",S_OK,FALSE}, + {"",S_FALSE,FALSE}, {"ftp.winehq.org",S_OK,FALSE}, {"wine",S_OK,FALSE}, - {"/dir/foo%20bar.txt",S_OK,TRUE}, - {"/dir/foo%20bar.txt",S_OK,TRUE}, - {"",S_FALSE,TRUE}, + {"/dir/foo%20bar.txt",S_OK,FALSE}, + {"/dir/foo%20bar.txt",S_OK,FALSE}, + {"",S_FALSE,FALSE}, {"ftp://winepass:wine@ftp.winehq.org:9999/dir/foo bar.txt",S_OK,FALSE}, {"ftp",S_OK,FALSE}, {"winepass:wine",S_OK,FALSE}, {"winepass",S_OK,FALSE} }, { - {Uri_HOST_DNS,S_OK,TRUE}, + {Uri_HOST_DNS,S_OK,FALSE}, {9999,S_OK,FALSE}, {URL_SCHEME_FTP,S_OK,FALSE}, {URLZONE_INVALID,E_NOTIMPL,FALSE} @@ -237,26 +232,26 @@ { "file://c:\\tests\\../tests/foo%20bar.mp3", 0, S_OK, FALSE, Uri_HAS_ABSOLUTE_URI|Uri_HAS_DISPLAY_URI|Uri_HAS_EXTENSION|Uri_HAS_PATH| Uri_HAS_PATH_AND_QUERY|Uri_HAS_RAW_URI|Uri_HAS_SCHEME_NAME|Uri_HAS_HOST_TYPE|Uri_HAS_SCHEME, - TRUE, + FALSE, { - {"file:///c:/tests/foo%2520bar.mp3",S_OK,TRUE}, - {"",S_FALSE,TRUE}, - {"file:///c:/tests/foo%2520bar.mp3",S_OK,TRUE}, - {"",S_FALSE,TRUE}, - {".mp3",S_OK,TRUE}, - {"",S_FALSE,TRUE}, + {"file:///c:/tests/foo%2520bar.mp3",S_OK,FALSE}, + {"",S_FALSE,FALSE}, + {"file:///c:/tests/foo%2520bar.mp3",S_OK,FALSE}, {"",S_FALSE,FALSE}, + {".mp3",S_OK,FALSE}, + {"",S_FALSE,FALSE}, + {"",S_FALSE,FALSE}, + {"",S_FALSE,FALSE}, + {"/c:/tests/foo%2520bar.mp3",S_OK,FALSE}, + {"/c:/tests/foo%2520bar.mp3",S_OK,FALSE}, {"",S_FALSE,FALSE}, - {"/c:/tests/foo%2520bar.mp3",S_OK,TRUE}, - {"/c:/tests/foo%2520bar.mp3",S_OK,TRUE}, - {"",S_FALSE,TRUE}, {"file://c:\\tests\\../tests/foo%20bar.mp3",S_OK,FALSE}, {"file",S_OK,FALSE}, {"",S_FALSE,FALSE}, {"",S_FALSE,FALSE} }, { - {Uri_HOST_UNKNOWN,S_OK,TRUE}, + {Uri_HOST_UNKNOWN,S_OK,FALSE}, {0,S_FALSE,FALSE}, {URL_SCHEME_FILE,S_OK,FALSE}, {URLZONE_INVALID,E_NOTIMPL,FALSE} @@ -265,26 +260,26 @@ { "FILE://localhost/test dir\\../tests/test%20file.README.txt", 0, S_OK, FALSE, Uri_HAS_ABSOLUTE_URI|Uri_HAS_DISPLAY_URI|Uri_HAS_EXTENSION|Uri_HAS_PATH| Uri_HAS_PATH_AND_QUERY|Uri_HAS_RAW_URI|Uri_HAS_SCHEME_NAME|Uri_HAS_HOST_TYPE|Uri_HAS_SCHEME, - TRUE, + FALSE, { - {"file:///tests/test%20file.README.txt",S_OK,TRUE}, - {"",S_FALSE,TRUE}, - {"file:///tests/test%20file.README.txt",S_OK,TRUE}, - {"",S_FALSE,TRUE}, - {".txt",S_OK,TRUE}, - {"",S_FALSE,TRUE}, + {"file:///tests/test%20file.README.txt",S_OK,FALSE}, + {"",S_FALSE,FALSE}, + {"file:///tests/test%20file.README.txt",S_OK,FALSE}, {"",S_FALSE,FALSE}, + {".txt",S_OK,FALSE}, + {"",S_FALSE,FALSE}, + {"",S_FALSE,FALSE}, + {"",S_FALSE,FALSE}, + {"/tests/test%20file.README.txt",S_OK,FALSE}, + {"/tests/test%20file.README.txt",S_OK,FALSE}, {"",S_FALSE,FALSE}, - {"/tests/test%20file.README.txt",S_OK,TRUE}, - {"/tests/test%20file.README.txt",S_OK,TRUE}, - {"",S_FALSE,TRUE}, {"FILE://localhost/test dir\\../tests/test%20file.README.txt",S_OK,FALSE}, {"file",S_OK,FALSE}, {"",S_FALSE,FALSE}, {"",S_FALSE,FALSE} }, { - {Uri_HOST_UNKNOWN,S_OK,TRUE}, + {Uri_HOST_UNKNOWN,S_OK,FALSE}, {0,S_FALSE,FALSE}, {URL_SCHEME_FILE,S_OK,FALSE}, {URLZONE_INVALID,E_NOTIMPL,FALSE} @@ -293,26 +288,26 @@ { "urn:nothing:should:happen here", 0, S_OK, FALSE, Uri_HAS_ABSOLUTE_URI|Uri_HAS_DISPLAY_URI|Uri_HAS_PATH|Uri_HAS_PATH_AND_QUERY| Uri_HAS_RAW_URI|Uri_HAS_SCHEME_NAME|Uri_HAS_HOST_TYPE|Uri_HAS_SCHEME, - TRUE, + FALSE, { - {"urn:nothing:should:happen here",S_OK,TRUE}, - {"",S_FALSE,TRUE}, - {"urn:nothing:should:happen here",S_OK,TRUE}, - {"",S_FALSE,TRUE}, - {"",S_FALSE,TRUE}, - {"",S_FALSE,TRUE}, + {"urn:nothing:should:happen here",S_OK,FALSE}, + {"",S_FALSE,FALSE}, + {"urn:nothing:should:happen here",S_OK,FALSE}, + {"",S_FALSE,FALSE}, + {"",S_FALSE,FALSE}, {"",S_FALSE,FALSE}, {"",S_FALSE,FALSE}, - {"nothing:should:happen here",S_OK,TRUE}, - {"nothing:should:happen here",S_OK,TRUE}, - {"",S_FALSE,TRUE}, + {"",S_FALSE,FALSE}, + {"nothing:should:happen here",S_OK,FALSE}, + {"nothing:should:happen here",S_OK,FALSE}, + {"",S_FALSE,FALSE}, {"urn:nothing:should:happen here",S_OK,FALSE}, {"urn",S_OK,FALSE}, {"",S_FALSE,FALSE}, {"",S_FALSE,FALSE} }, { - {Uri_HOST_UNKNOWN,S_OK,TRUE}, + {Uri_HOST_UNKNOWN,S_OK,FALSE}, {0,S_FALSE,FALSE}, {URL_SCHEME_UNKNOWN,S_OK,FALSE}, {URLZONE_INVALID,E_NOTIMPL,FALSE} @@ -322,26 +317,26 @@ Uri_HAS_ABSOLUTE_URI|Uri_HAS_AUTHORITY|Uri_HAS_DISPLAY_URI|Uri_HAS_EXTENSION| Uri_HAS_HOST|Uri_HAS_PATH|Uri_HAS_PATH_AND_QUERY|Uri_HAS_RAW_URI|Uri_HAS_SCHEME_NAME| Uri_HAS_HOST_TYPE|Uri_HAS_PORT|Uri_HAS_SCHEME, - TRUE, + FALSE, { - {"http://127.0.0.1/test%20dir/test.txt",S_OK,TRUE}, - {"127.0.0.1",S_OK,TRUE}, - {"http://127.0.0.1/test%20dir/test.txt",S_OK,TRUE}, - {"",S_FALSE,TRUE}, - {".txt",S_OK,TRUE}, - {"",S_FALSE,TRUE}, + {"http://127.0.0.1/test%20dir/test.txt",S_OK,FALSE}, + {"127.0.0.1",S_OK,FALSE}, + {"http://127.0.0.1/test%20dir/test.txt",S_OK,FALSE}, + {"",S_FALSE,FALSE}, + {".txt",S_OK,FALSE}, + {"",S_FALSE,FALSE}, {"127.0.0.1",S_OK,FALSE}, {"",S_FALSE,FALSE}, - {"/test%20dir/test.txt",S_OK,TRUE}, - {"/test%20dir/test.txt",S_OK,TRUE}, - {"",S_FALSE,TRUE}, + {"/test%20dir/test.txt",S_OK,FALSE}, + {"/test%20dir/test.txt",S_OK,FALSE}, + {"",S_FALSE,FALSE}, {"http://127.0.0.1/tests/../test dir/./test.txt",S_OK,FALSE}, {"http",S_OK,FALSE}, {"",S_FALSE,FALSE}, {"",S_FALSE,FALSE} }, { - {Uri_HOST_IPV4,S_OK,TRUE}, + {Uri_HOST_IPV4,S_OK,FALSE}, {80,S_OK,FALSE}, {URL_SCHEME_HTTP,S_OK,FALSE}, {URLZONE_INVALID,E_NOTIMPL,FALSE} @@ -351,26 +346,26 @@ Uri_HAS_ABSOLUTE_URI|Uri_HAS_AUTHORITY|Uri_HAS_DISPLAY_URI|Uri_HAS_HOST| Uri_HAS_PATH|Uri_HAS_PATH_AND_QUERY|Uri_HAS_RAW_URI|Uri_HAS_SCHEME_NAME| Uri_HAS_HOST_TYPE|Uri_HAS_PORT|Uri_HAS_SCHEME, - TRUE, + FALSE, { - {"http://[fedc:ba98:7654:3210:fedc:ba98:7654:3210]/",S_OK,TRUE}, - {"[fedc:ba98:7654:3210:fedc:ba98:7654:3210]",S_OK,TRUE}, - {"http://[fedc:ba98:7654:3210:fedc:ba98:7654:3210]/",S_OK,TRUE}, - {"",S_FALSE,TRUE}, - {"",S_FALSE,TRUE}, - {"",S_FALSE,TRUE}, + {"http://[fedc:ba98:7654:3210:fedc:ba98:7654:3210]/",S_OK,FALSE}, + {"[fedc:ba98:7654:3210:fedc:ba98:7654:3210]",S_OK,FALSE}, + {"http://[fedc:ba98:7654:3210:fedc:ba98:7654:3210]/",S_OK,FALSE}, + {"",S_FALSE,FALSE}, + {"",S_FALSE,FALSE}, + {"",S_FALSE,FALSE}, {"fedc:ba98:7654:3210:fedc:ba98:7654:3210",S_OK,FALSE}, {"",S_FALSE,FALSE}, - {"/",S_OK,TRUE}, - {"/",S_OK,TRUE}, - {"",S_FALSE,TRUE}, + {"/",S_OK,FALSE}, + {"/",S_OK,FALSE}, + {"",S_FALSE,FALSE}, {"http://[FEDC:BA98:7654:3210:FEDC:BA98:7654:3210]",S_OK,FALSE}, {"http",S_OK,FALSE}, {"",S_FALSE,FALSE}, {"",S_FALSE,FALSE} }, { - {Uri_HOST_IPV6,S_OK,TRUE}, + {Uri_HOST_IPV6,S_OK,FALSE}, {80,S_OK,FALSE}, {URL_SCHEME_HTTP,S_OK,FALSE}, {URLZONE_INVALID,E_NOTIMPL,FALSE} @@ -380,26 +375,26 @@ Uri_HAS_ABSOLUTE_URI|Uri_HAS_AUTHORITY|Uri_HAS_DISPLAY_URI|Uri_HAS_HOST| Uri_HAS_PATH|Uri_HAS_PATH_AND_QUERY|Uri_HAS_RAW_URI|Uri_HAS_SCHEME_NAME| Uri_HAS_HOST_TYPE|Uri_HAS_PORT|Uri_HAS_SCHEME, - TRUE, + FALSE, { - {"ftp://[::13.1.68.3]/",S_OK,TRUE}, - {"[::13.1.68.3]",S_OK,TRUE}, - {"ftp://[::13.1.68.3]/",S_OK,TRUE}, - {"",S_FALSE,TRUE}, - {"",S_FALSE,TRUE}, - {"",S_FALSE,TRUE}, + {"ftp://[::13.1.68.3]/",S_OK,FALSE}, + {"[::13.1.68.3]",S_OK,FALSE}, + {"ftp://[::13.1.68.3]/",S_OK,FALSE}, + {"",S_FALSE,FALSE}, + {"",S_FALSE,FALSE}, + {"",S_FALSE,FALSE}, {"::13.1.68.3",S_OK,FALSE}, {"",S_FALSE,FALSE}, - {"/",S_OK,TRUE}, - {"/",S_OK,TRUE}, - {"",S_FALSE,TRUE}, + {"/",S_OK,FALSE}, + {"/",S_OK,FALSE}, + {"",S_FALSE,FALSE}, {"ftp://[::13.1.68.3]",S_OK,FALSE}, {"ftp",S_OK,FALSE}, {"",S_FALSE,FALSE}, {"",S_FALSE,FALSE} }, { - {Uri_HOST_IPV6,S_OK,TRUE}, + {Uri_HOST_IPV6,S_OK,FALSE}, {21,S_OK,FALSE}, {URL_SCHEME_FTP,S_OK,FALSE}, {URLZONE_INVALID,E_NOTIMPL,FALSE} @@ -409,26 +404,26 @@ Uri_HAS_ABSOLUTE_URI|Uri_HAS_AUTHORITY|Uri_HAS_DISPLAY_URI|Uri_HAS_HOST| Uri_HAS_PATH|Uri_HAS_PATH_AND_QUERY|Uri_HAS_RAW_URI|Uri_HAS_SCHEME_NAME| Uri_HAS_HOST_TYPE|Uri_HAS_PORT|Uri_HAS_SCHEME, - TRUE, + FALSE, { - {"http://[fedc:ba98::3210]/",S_OK,TRUE}, - {"[fedc:ba98::3210]",S_OK,TRUE}, - {"http://[fedc:ba98::3210]/",S_OK,TRUE}, - {"",S_FALSE,TRUE}, - {"",S_FALSE,TRUE}, - {"",S_FALSE,TRUE}, + {"http://[fedc:ba98::3210]/",S_OK,FALSE}, + {"[fedc:ba98::3210]",S_OK,FALSE}, + {"http://[fedc:ba98::3210]/",S_OK,FALSE}, + {"",S_FALSE,FALSE}, + {"",S_FALSE,FALSE}, + {"",S_FALSE,FALSE}, {"fedc:ba98::3210",S_OK,FALSE}, {"",S_FALSE,FALSE}, - {"/",S_OK,TRUE}, - {"/",S_OK,TRUE}, - {"",S_FALSE,TRUE}, + {"/",S_OK,FALSE}, + {"/",S_OK,FALSE}, + {"",S_FALSE,FALSE}, {"http://[FEDC:BA98:0:0:0:0:0:3210]",S_OK,FALSE}, {"http",S_OK,FALSE}, {"",S_FALSE,FALSE}, {"",S_FALSE,FALSE}, }, { - {Uri_HOST_IPV6,S_OK,TRUE}, + {Uri_HOST_IPV6,S_OK,FALSE}, {80,S_OK,FALSE}, {URL_SCHEME_HTTP,S_OK,FALSE}, {URLZONE_INVALID,E_NOTIMPL,FALSE} @@ -438,26 +433,26 @@ Uri_HAS_ABSOLUTE_URI|Uri_HAS_AUTHORITY|Uri_HAS_DISPLAY_URI|Uri_HAS_DOMAIN| Uri_HAS_HOST|Uri_HAS_PATH|Uri_HAS_PATH_AND_QUERY|Uri_HAS_RAW_URI|Uri_HAS_SCHEME_NAME| Uri_HAS_HOST_TYPE|Uri_HAS_SCHEME, - TRUE, + FALSE, { - {"1234://www.winehq.org/",S_OK,TRUE}, - {"www.winehq.org",S_OK,TRUE}, - {"1234://www.winehq.org/",S_OK,TRUE}, - {"winehq.org",S_OK,TRUE}, - {"",S_FALSE,TRUE}, - {"",S_FALSE,TRUE}, + {"1234://www.winehq.org/",S_OK,FALSE}, + {"www.winehq.org",S_OK,FALSE}, + {"1234://www.winehq.org/",S_OK,FALSE}, + {"winehq.org",S_OK,FALSE}, + {"",S_FALSE,FALSE}, + {"",S_FALSE,FALSE}, {"www.winehq.org",S_OK,FALSE}, {"",S_FALSE,FALSE}, - {"/",S_OK,TRUE}, - {"/",S_OK,TRUE}, - {"",S_FALSE,TRUE}, + {"/",S_OK,FALSE}, + {"/",S_OK,FALSE}, + {"",S_FALSE,FALSE}, {"1234://www.winehq.org",S_OK,FALSE}, {"1234",S_OK,FALSE}, {"",S_FALSE,FALSE}, {"",S_FALSE,FALSE} }, { - {Uri_HOST_DNS,S_OK,TRUE}, + {Uri_HOST_DNS,S_OK,FALSE}, {0,S_FALSE,FALSE}, {URL_SCHEME_UNKNOWN,S_OK,FALSE}, {URLZONE_INVALID,E_NOTIMPL,FALSE} @@ -467,26 +462,26 @@ { "C:/test/test.mp3", Uri_CREATE_ALLOW_IMPLICIT_FILE_SCHEME, S_OK, FALSE, Uri_HAS_ABSOLUTE_URI|Uri_HAS_DISPLAY_URI|Uri_HAS_EXTENSION|Uri_HAS_PATH| Uri_HAS_PATH_AND_QUERY|Uri_HAS_RAW_URI|Uri_HAS_SCHEME_NAME|Uri_HAS_HOST_TYPE|Uri_HAS_SCHEME, - TRUE, + FALSE, { - {"file:///C:/test/test.mp3",S_OK,TRUE}, - {"",S_FALSE,TRUE}, - {"file:///C:/test/test.mp3",S_OK,TRUE}, - {"",S_FALSE,TRUE}, - {".mp3",S_OK,TRUE}, - {"",S_FALSE,TRUE}, + {"file:///C:/test/test.mp3",S_OK,FALSE}, + {"",S_FALSE,FALSE}, + {"file:///C:/test/test.mp3",S_OK,FALSE}, {"",S_FALSE,FALSE}, + {".mp3",S_OK,FALSE}, + {"",S_FALSE,FALSE}, + {"",S_FALSE,FALSE}, + {"",S_FALSE,FALSE}, + {"/C:/test/test.mp3",S_OK,FALSE}, + {"/C:/test/test.mp3",S_OK,FALSE}, {"",S_FALSE,FALSE}, - {"/C:/test/test.mp3",S_OK,TRUE}, - {"/C:/test/test.mp3",S_OK,TRUE}, - {"",S_FALSE,TRUE}, {"C:/test/test.mp3",S_OK,FALSE}, {"file",S_OK,FALSE}, {"",S_FALSE,FALSE}, {"",S_FALSE,FALSE} }, { - {Uri_HOST_UNKNOWN,S_OK,TRUE}, + {Uri_HOST_UNKNOWN,S_OK,FALSE}, {0,S_FALSE,FALSE}, {URL_SCHEME_FILE,S_OK,FALSE}, {URLZONE_INVALID,E_NOTIMPL,FALSE} @@ -497,26 +492,26 @@ Uri_HAS_ABSOLUTE_URI|Uri_HAS_AUTHORITY|Uri_HAS_DISPLAY_URI|Uri_HAS_EXTENSION| Uri_HAS_PATH|Uri_HAS_PATH_AND_QUERY|Uri_HAS_HOST|Uri_HAS_RAW_URI|Uri_HAS_SCHEME_NAME| Uri_HAS_HOST_TYPE|Uri_HAS_SCHEME, - TRUE, + FALSE, { - {"file://server/test.mp3",S_OK,TRUE}, - {"server",S_OK,TRUE}, - {"file://server/test.mp3",S_OK,TRUE}, - {"",S_FALSE,TRUE}, - {".mp3",S_OK,TRUE}, - {"",S_FALSE,TRUE}, + {"file://server/test.mp3",S_OK,FALSE}, + {"server",S_OK,FALSE}, + {"file://server/test.mp3",S_OK,FALSE}, + {"",S_FALSE,FALSE}, + {".mp3",S_OK,FALSE}, + {"",S_FALSE,FALSE}, {"server",S_OK,FALSE}, {"",S_FALSE,FALSE}, - {"/test.mp3",S_OK,TRUE}, - {"/test.mp3",S_OK,TRUE}, - {"",S_FALSE,TRUE}, + {"/test.mp3",S_OK,FALSE}, + {"/test.mp3",S_OK,FALSE}, + {"",S_FALSE,FALSE}, {"\\\\Server/test.mp3",S_OK,FALSE}, {"file",S_OK,FALSE}, {"",S_FALSE,FALSE}, {"",S_FALSE,FALSE} }, { - {Uri_HOST_DNS,S_OK,TRUE}, + {Uri_HOST_DNS,S_OK,FALSE}, {0,S_FALSE,FALSE}, {URL_SCHEME_FILE,S_OK,FALSE}, {URLZONE_INVALID,E_NOTIMPL,FALSE} @@ -526,26 +521,26 @@ Uri_HAS_ABSOLUTE_URI|Uri_HAS_AUTHORITY|Uri_HAS_DISPLAY_URI|Uri_HAS_DOMAIN|Uri_HAS_HOST| Uri_HAS_PATH|Uri_HAS_PATH_AND_QUERY|Uri_HAS_RAW_URI|Uri_HAS_SCHEME_NAME|Uri_HAS_HOST_TYPE| Uri_HAS_SCHEME, - TRUE, + FALSE, { - {"*:www.winehq.org/test",S_OK,TRUE}, - {"www.winehq.org",S_OK,TRUE}, - {"*:www.winehq.org/test",S_OK,TRUE}, - {"winehq.org",S_OK,TRUE}, - {"",S_FALSE,TRUE}, - {"",S_FALSE,TRUE}, + {"*:www.winehq.org/test",S_OK,FALSE}, {"www.winehq.org",S_OK,FALSE}, + {"*:www.winehq.org/test",S_OK,FALSE}, + {"winehq.org",S_OK,FALSE}, + {"",S_FALSE,FALSE}, + {"",S_FALSE,FALSE}, + {"www.winehq.org",S_OK,FALSE}, + {"",S_FALSE,FALSE}, + {"/test",S_OK,FALSE}, + {"/test",S_OK,FALSE}, {"",S_FALSE,FALSE}, - {"/test",S_OK,TRUE}, - {"/test",S_OK,TRUE}, - {"",S_FALSE,TRUE}, {"www.winehq.org/test",S_OK,FALSE}, {"*",S_OK,FALSE}, {"",S_FALSE,FALSE}, {"",S_FALSE,FALSE} }, { - {Uri_HOST_DNS,S_OK,TRUE}, + {Uri_HOST_DNS,S_OK,FALSE}, {0,S_FALSE,FALSE}, {URL_SCHEME_WILDCARD,S_OK,FALSE}, {URLZONE_INVALID,E_NOTIMPL,FALSE} @@ -556,26 +551,26 @@ Uri_HAS_ABSOLUTE_URI|Uri_HAS_AUTHORITY|Uri_HAS_DISPLAY_URI|Uri_HAS_DOMAIN|Uri_HAS_HOST| Uri_HAS_PATH|Uri_HAS_PATH_AND_QUERY|Uri_HAS_RAW_URI|Uri_HAS_SCHEME_NAME|Uri_HAS_HOST_TYPE| Uri_HAS_SCHEME, - TRUE, + FALSE, { - {"*:www.winehq.org/test",S_OK,TRUE}, - {"www.winehq.org",S_OK,TRUE}, - {"*:www.winehq.org/test",S_OK,TRUE}, - {"winehq.org",S_OK,TRUE}, - {"",S_FALSE,TRUE}, - {"",S_FALSE,TRUE}, + {"*:www.winehq.org/test",S_OK,FALSE}, + {"www.winehq.org",S_OK,FALSE}, + {"*:www.winehq.org/test",S_OK,FALSE}, + {"winehq.org",S_OK,FALSE}, + {"",S_FALSE,FALSE}, + {"",S_FALSE,FALSE}, {"www.winehq.org",S_OK,FALSE}, {"",S_FALSE,FALSE}, - {"/test",S_OK,TRUE}, - {"/test",S_OK,TRUE}, - {"",S_FALSE,TRUE}, + {"/test",S_OK,FALSE}, + {"/test",S_OK,FALSE}, + {"",S_FALSE,FALSE}, {"*:www.winehq.org/test",S_OK,FALSE}, {"*",S_OK,FALSE}, {"",S_FALSE,FALSE}, {"",S_FALSE,FALSE} }, { - {Uri_HOST_DNS,S_OK,TRUE}, + {Uri_HOST_DNS,S_OK,FALSE}, {0,S_FALSE,FALSE}, {URL_SCHEME_WILDCARD,S_OK,FALSE}, {URLZONE_INVALID,E_NOTIMPL,FALSE} @@ -584,26 +579,26 @@ { "/../some dir/test.ext", Uri_CREATE_ALLOW_RELATIVE, S_OK, FALSE, Uri_HAS_ABSOLUTE_URI|Uri_HAS_DISPLAY_URI|Uri_HAS_EXTENSION|Uri_HAS_PATH| Uri_HAS_PATH_AND_QUERY|Uri_HAS_RAW_URI|Uri_HAS_HOST_TYPE|Uri_HAS_SCHEME, - TRUE, + FALSE, { - {"/../some dir/test.ext",S_OK,TRUE}, - {"",S_FALSE,TRUE}, - {"/../some dir/test.ext",S_OK,TRUE}, - {"",S_FALSE,TRUE}, - {".ext",S_OK,TRUE}, - {"",S_FALSE,TRUE}, + {"/../some dir/test.ext",S_OK,FALSE}, + {"",S_FALSE,FALSE}, + {"/../some dir/test.ext",S_OK,FALSE}, {"",S_FALSE,FALSE}, + {".ext",S_OK,FALSE}, + {"",S_FALSE,FALSE}, + {"",S_FALSE,FALSE}, + {"",S_FALSE,FALSE}, + {"/../some dir/test.ext",S_OK,FALSE}, + {"/../some dir/test.ext",S_OK,FALSE}, {"",S_FALSE,FALSE}, - {"/../some dir/test.ext",S_OK,TRUE}, - {"/../some dir/test.ext",S_OK,TRUE}, - {"",S_FALSE,TRUE}, {"/../some dir/test.ext",S_OK,FALSE}, {"",S_FALSE,FALSE}, {"",S_FALSE,FALSE}, {"",S_FALSE,FALSE} }, { - {Uri_HOST_UNKNOWN,S_OK,TRUE}, + {Uri_HOST_UNKNOWN,S_OK,FALSE}, {0,S_FALSE,FALSE}, {URL_SCHEME_UNKNOWN,S_OK,FALSE}, {URLZONE_INVALID,E_NOTIMPL,FALSE} @@ -612,26 +607,26 @@ { "//implicit/wildcard/uri scheme", Uri_CREATE_ALLOW_RELATIVE|Uri_CREATE_ALLOW_IMPLICIT_WILDCARD_SCHEME, S_OK, FALSE, Uri_HAS_ABSOLUTE_URI|Uri_HAS_AUTHORITY|Uri_HAS_DISPLAY_URI|Uri_HAS_HOST|Uri_HAS_PATH| Uri_HAS_PATH_AND_QUERY|Uri_HAS_RAW_URI|Uri_HAS_SCHEME_NAME|Uri_HAS_HOST_TYPE|Uri_HAS_SCHEME, - TRUE, + FALSE, { - {"*://implicit/wildcard/uri%20scheme",S_OK,TRUE}, - {"",S_OK,TRUE}, - {"*://implicit/wildcard/uri%20scheme",S_OK,TRUE}, - {"",S_FALSE,TRUE}, - {"",S_FALSE,TRUE}, - {"",S_FALSE,TRUE}, + {"*://implicit/wildcard/uri%20scheme",S_OK,FALSE}, + {"",S_OK,FALSE}, + {"*://implicit/wildcard/uri%20scheme",S_OK,FALSE}, + {"",S_FALSE,FALSE}, + {"",S_FALSE,FALSE}, + {"",S_FALSE,FALSE}, {"",S_OK,FALSE}, {"",S_FALSE,FALSE}, - {"//implicit/wildcard/uri%20scheme",S_OK,TRUE}, - {"//implicit/wildcard/uri%20scheme",S_OK,TRUE}, - {"",S_FALSE,TRUE}, + {"//implicit/wildcard/uri%20scheme",S_OK,FALSE}, + {"//implicit/wildcard/uri%20scheme",S_OK,FALSE}, + {"",S_FALSE,FALSE}, {"//implicit/wildcard/uri scheme",S_OK,FALSE}, {"*",S_OK,FALSE}, {"",S_FALSE,FALSE}, {"",S_FALSE,FALSE}, }, { - {Uri_HOST_UNKNOWN,S_OK,TRUE}, + {Uri_HOST_UNKNOWN,S_OK,FALSE}, {0,S_FALSE,FALSE}, {URL_SCHEME_WILDCARD,S_OK,FALSE}, {URLZONE_INVALID,E_NOTIMPL,FALSE} @@ -642,26 +637,26 @@ Uri_HAS_ABSOLUTE_URI|Uri_HAS_DISPLAY_URI|Uri_HAS_EXTENSION|Uri_HAS_PATH| Uri_HAS_PATH_AND_QUERY|Uri_HAS_RAW_URI|Uri_HAS_HOST_TYPE|Uri_HAS_SCHEME_NAME| Uri_HAS_SCHEME, - TRUE, + FALSE, { - {"zip:/.//google.com",S_OK,TRUE}, - {"",S_FALSE,TRUE}, - {"zip:/.//google.com",S_OK,TRUE}, - {"",S_FALSE,TRUE}, - {".com",S_OK,TRUE}, - {"",S_FALSE,TRUE}, + {"zip:/.//google.com",S_OK,FALSE}, + {"",S_FALSE,FALSE}, + {"zip:/.//google.com",S_OK,FALSE}, + {"",S_FALSE,FALSE}, + {".com",S_OK,FALSE}, {"",S_FALSE,FALSE}, {"",S_FALSE,FALSE}, - {"/.//google.com",S_OK,TRUE}, - {"/.//google.com",S_OK,TRUE}, - {"",S_FALSE,TRUE}, + {"",S_FALSE,FALSE}, + {"/.//google.com",S_OK,FALSE}, + {"/.//google.com",S_OK,FALSE}, + {"",S_FALSE,FALSE}, {"zip://google.com",S_OK,FALSE}, {"zip",S_OK,FALSE}, {"",S_FALSE,FALSE}, {"",S_FALSE,FALSE} }, { - {Uri_HOST_UNKNOWN,S_OK,TRUE}, + {Uri_HOST_UNKNOWN,S_OK,FALSE}, {0,S_FALSE,FALSE}, {URL_SCHEME_UNKNOWN,S_OK,FALSE}, {URLZONE_INVALID,E_NOTIMPL,FALSE} @@ -673,26 +668,26 @@ Uri_HAS_HOST|Uri_HAS_PASSWORD|Uri_HAS_PATH|Uri_HAS_PATH_AND_QUERY|Uri_HAS_RAW_URI| Uri_HAS_SCHEME_NAME|Uri_HAS_USER_INFO|Uri_HAS_USER_NAME|Uri_HAS_HOST_TYPE|Uri_HAS_PORT| Uri_HAS_SCHEME, - TRUE, + FALSE, { - {"ftp://user:pass:word@winehq.org/",S_OK,TRUE}, - {"user:pass:word@winehq.org",S_OK,TRUE}, - {"ftp://winehq.org/",S_OK,TRUE}, - {"winehq.org",S_OK,TRUE}, - {"",S_FALSE,TRUE}, - {"",S_FALSE,TRUE}, + {"ftp://user:pass:word@winehq.org/",S_OK,FALSE}, + {"user:pass:word@winehq.org",S_OK,FALSE}, + {"ftp://winehq.org/",S_OK,FALSE}, + {"winehq.org",S_OK,FALSE}, + {"",S_FALSE,FALSE}, + {"",S_FALSE,FALSE}, {"winehq.org",S_OK,FALSE}, {"pass:word",S_OK,FALSE}, - {"/",S_OK,TRUE}, - {"/",S_OK,TRUE}, - {"",S_FALSE,TRUE}, + {"/",S_OK,FALSE}, + {"/",S_OK,FALSE}, + {"",S_FALSE,FALSE}, {"ftp://user:pass:word@winehq.org/",S_OK,FALSE}, {"ftp",S_OK,FALSE}, {"user:pass:word",S_OK,FALSE}, {"user",S_OK,FALSE} }, { - {Uri_HOST_DNS,S_OK,TRUE}, + {Uri_HOST_DNS,S_OK,FALSE}, {21,S_OK,FALSE}, {URL_SCHEME_FTP,S_OK,FALSE}, {URLZONE_INVALID,E_NOTIMPL,FALSE} @@ -704,26 +699,26 @@ Uri_HAS_HOST|Uri_HAS_PASSWORD|Uri_HAS_PATH|Uri_HAS_PATH_AND_QUERY|Uri_HAS_RAW_URI| Uri_HAS_SCHEME_NAME|Uri_HAS_USER_INFO|Uri_HAS_USER_NAME|Uri_HAS_HOST_TYPE|Uri_HAS_PORT| Uri_HAS_SCHEME, - TRUE, + FALSE, { - {"ftp://wINe:PASS@ftp.google.com/",S_OK,TRUE}, - {"wINe:PASS@ftp.google.com",S_OK,TRUE}, - {"ftp://ftp.google.com/",S_OK,TRUE}, - {"google.com",S_OK,TRUE}, - {"",S_FALSE,TRUE}, - {"",S_FALSE,TRUE}, + {"ftp://wINe:PASS@ftp.google.com/",S_OK,FALSE}, + {"wINe:PASS@ftp.google.com",S_OK,FALSE}, + {"ftp://ftp.google.com/",S_OK,FALSE}, + {"google.com",S_OK,FALSE}, + {"",S_FALSE,FALSE}, + {"",S_FALSE,FALSE}, {"ftp.google.com",S_OK,FALSE}, {"PASS",S_OK,FALSE}, - {"/",S_OK,TRUE}, - {"/",S_OK,TRUE}, - {"",S_FALSE,TRUE}, + {"/",S_OK,FALSE}, + {"/",S_OK,FALSE}, + {"",S_FALSE,FALSE}, {"ftp://w%49%4Ee:PA%53%53@ftp.google.com/",S_OK,FALSE}, {"ftp",S_OK,FALSE}, {"wINe:PASS",S_OK,FALSE}, {"wINe",S_OK,FALSE} }, { - {Uri_HOST_DNS,S_OK,TRUE}, + {Uri_HOST_DNS,S_OK,FALSE}, {21,S_OK,FALSE}, {URL_SCHEME_FTP,S_OK,FALSE}, {URLZONE_INVALID,E_NOTIMPL,FALSE} @@ -735,26 +730,26 @@ Uri_HAS_HOST|Uri_HAS_PASSWORD|Uri_HAS_PATH|Uri_HAS_PATH_AND_QUERY|Uri_HAS_RAW_URI| Uri_HAS_SCHEME_NAME|Uri_HAS_USER_INFO|Uri_HAS_USER_NAME|Uri_HAS_HOST_TYPE|Uri_HAS_PORT| Uri_HAS_SCHEME, - TRUE, + FALSE, { - {"ftp://w%5D%5Be:PA%7B%7D@ftp.google.com/",S_OK,TRUE}, - {"w%5D%5Be:PA%7B%7D@ftp.google.com",S_OK,TRUE}, - {"ftp://ftp.google.com/",S_OK,TRUE}, - {"google.com",S_OK,TRUE}, - {"",S_FALSE,TRUE}, - {"",S_FALSE,TRUE}, + {"ftp://w%5D%5Be:PA%7B%7D@ftp.google.com/",S_OK,FALSE}, + {"w%5D%5Be:PA%7B%7D@ftp.google.com",S_OK,FALSE}, + {"ftp://ftp.google.com/",S_OK,FALSE}, + {"google.com",S_OK,FALSE}, + {"",S_FALSE,FALSE}, + {"",S_FALSE,FALSE}, {"ftp.google.com",S_OK,FALSE}, {"PA%7B%7D",S_OK,FALSE}, - {"/",S_OK,TRUE}, - {"/",S_OK,TRUE}, - {"",S_FALSE,TRUE}, + {"/",S_OK,FALSE}, + {"/",S_OK,FALSE}, + {"",S_FALSE,FALSE}, {"ftp://w%5D%5Be:PA%7B%7D@ftp.google.com/",S_OK,FALSE}, {"ftp",S_OK,FALSE}, {"w%5D%5Be:PA%7B%7D",S_OK,FALSE}, {"w%5D%5Be",S_OK,FALSE} }, { - {Uri_HOST_DNS,S_OK,TRUE}, + {Uri_HOST_DNS,S_OK,FALSE}, {21,S_OK,FALSE}, {URL_SCHEME_FTP,S_OK,FALSE}, {URLZONE_INVALID,E_NOTIMPL,FALSE} @@ -766,26 +761,26 @@ Uri_HAS_HOST|Uri_HAS_PASSWORD|Uri_HAS_PATH|Uri_HAS_PATH_AND_QUERY|Uri_HAS_RAW_URI| Uri_HAS_SCHEME_NAME|Uri_HAS_USER_INFO|Uri_HAS_USER_NAME|Uri_HAS_HOST_TYPE|Uri_HAS_PORT| Uri_HAS_SCHEME, - TRUE, + FALSE, { - {"ftp://empty:@ftp.google.com/",S_OK,TRUE}, - {"empty:@ftp.google.com",S_OK,TRUE}, - {"ftp://ftp.google.com/",S_OK,TRUE}, - {"google.com",S_OK,TRUE}, - {"",S_FALSE,TRUE}, - {"",S_FALSE,TRUE}, + {"ftp://empty:@ftp.google.com/",S_OK,FALSE}, + {"empty:@ftp.google.com",S_OK,FALSE}, + {"ftp://ftp.google.com/",S_OK,FALSE}, + {"google.com",S_OK,FALSE}, + {"",S_FALSE,FALSE}, + {"",S_FALSE,FALSE}, {"ftp.google.com",S_OK,FALSE}, {"",S_OK,FALSE}, - {"/",S_OK,TRUE}, - {"/",S_OK,TRUE}, - {"",S_FALSE,TRUE}, + {"/",S_OK,FALSE}, + {"/",S_OK,FALSE}, + {"",S_FALSE,FALSE}, {"ftp://empty:@ftp.google.com/",S_OK,FALSE}, {"ftp",S_OK,FALSE}, {"empty:",S_OK,FALSE}, {"empty",S_OK,FALSE} }, { - {Uri_HOST_DNS,S_OK,TRUE}, + {Uri_HOST_DNS,S_OK,FALSE}, {21,S_OK,FALSE}, {URL_SCHEME_FTP,S_OK,FALSE}, {URLZONE_INVALID,E_NOTIMPL,FALSE} @@ -797,26 +792,26 @@ Uri_HAS_HOST|Uri_HAS_PATH|Uri_HAS_PATH_AND_QUERY|Uri_HAS_RAW_URI| Uri_HAS_SCHEME_NAME|Uri_HAS_USER_INFO|Uri_HAS_USER_NAME|Uri_HAS_HOST_TYPE|Uri_HAS_PORT| Uri_HAS_SCHEME, - TRUE, + FALSE, { - {"ftp://%22%20%22weird@ftp.google.com/",S_OK,TRUE}, - {"%22%20%22weird@ftp.google.com",S_OK,TRUE}, - {"ftp://ftp.google.com/",S_OK,TRUE}, - {"google.com",S_OK,TRUE}, - {"",S_FALSE,TRUE}, - {"",S_FALSE,TRUE}, + {"ftp://%22%20%22weird@ftp.google.com/",S_OK,FALSE}, + {"%22%20%22weird@ftp.google.com",S_OK,FALSE}, + {"ftp://ftp.google.com/",S_OK,FALSE}, + {"google.com",S_OK,FALSE}, + {"",S_FALSE,FALSE}, + {"",S_FALSE,FALSE}, {"ftp.google.com",S_OK,FALSE}, {"",S_FALSE,FALSE}, - {"/",S_OK,TRUE}, - {"/",S_OK,TRUE}, - {"",S_FALSE,TRUE}, + {"/",S_OK,FALSE}, + {"/",S_OK,FALSE}, + {"",S_FALSE,FALSE}, {"ftp://\" \"weird@ftp.google.com/",S_OK,FALSE}, {"ftp",S_OK,FALSE}, {"%22%20%22weird",S_OK,FALSE}, {"%22%20%22weird",S_OK,FALSE} }, { - {Uri_HOST_DNS,S_OK,TRUE}, + {Uri_HOST_DNS,S_OK,FALSE}, {21,S_OK,FALSE}, {URL_SCHEME_FTP,S_OK,FALSE}, {URLZONE_INVALID,E_NOTIMPL,FALSE} @@ -828,26 +823,26 @@ Uri_HAS_HOST|Uri_HAS_PATH|Uri_HAS_PATH_AND_QUERY|Uri_HAS_RAW_URI| Uri_HAS_SCHEME_NAME|Uri_HAS_USER_INFO|Uri_HAS_USER_NAME|Uri_HAS_HOST_TYPE|Uri_HAS_PORT| Uri_HAS_SCHEME, - TRUE, + FALSE, { - {"ftp://\" \"weird@ftp.google.com/",S_OK,TRUE}, - {"\" \"weird@ftp.google.com",S_OK,TRUE}, - {"ftp://ftp.google.com/",S_OK,TRUE}, - {"google.com",S_OK,TRUE}, - {"",S_FALSE,TRUE}, - {"",S_FALSE,TRUE}, + {"ftp://\" \"weird@ftp.google.com/",S_OK,FALSE}, + {"\" \"weird@ftp.google.com",S_OK,FALSE}, + {"ftp://ftp.google.com/",S_OK,FALSE}, + {"google.com",S_OK,FALSE}, + {"",S_FALSE,FALSE}, + {"",S_FALSE,FALSE}, {"ftp.google.com",S_OK,FALSE}, {"",S_FALSE,FALSE}, - {"/",S_OK,TRUE}, - {"/",S_OK,TRUE}, - {"",S_FALSE,TRUE}, + {"/",S_OK,FALSE}, + {"/",S_OK,FALSE}, + {"",S_FALSE,FALSE}, {"ftp://\" \"weird@ftp.google.com/",S_OK,FALSE}, {"ftp",S_OK,FALSE}, {"\" \"weird",S_OK,FALSE}, {"\" \"weird",S_OK,FALSE} }, { - {Uri_HOST_DNS,S_OK,TRUE}, + {Uri_HOST_DNS,S_OK,FALSE}, {21,S_OK,FALSE}, {URL_SCHEME_FTP,S_OK,FALSE}, {URLZONE_INVALID,E_NOTIMPL,FALSE} @@ -858,26 +853,26 @@ Uri_HAS_ABSOLUTE_URI|Uri_HAS_AUTHORITY|Uri_HAS_DISPLAY_URI|Uri_HAS_DOMAIN| Uri_HAS_HOST|Uri_HAS_PASSWORD|Uri_HAS_PATH|Uri_HAS_PATH_AND_QUERY|Uri_HAS_RAW_URI| Uri_HAS_SCHEME_NAME|Uri_HAS_USER_INFO|Uri_HAS_USER_NAME|Uri_HAS_HOST_TYPE|Uri_HAS_SCHEME, - TRUE, + FALSE, { - {"zip://%xy:word@winehq.org/",S_OK,TRUE}, - {"%xy:word@winehq.org",S_OK,TRUE}, - {"zip://%xy:word@winehq.org/",S_OK,TRUE}, - {"winehq.org",S_OK,TRUE}, - {"",S_FALSE,TRUE}, - {"",S_FALSE,TRUE}, + {"zip://%xy:word@winehq.org/",S_OK,FALSE}, + {"%xy:word@winehq.org",S_OK,FALSE}, + {"zip://%xy:word@winehq.org/",S_OK,FALSE}, + {"winehq.org",S_OK,FALSE}, + {"",S_FALSE,FALSE}, + {"",S_FALSE,FALSE}, {"winehq.org",S_OK,FALSE}, {"word",S_OK,FALSE}, - {"/",S_OK,TRUE}, - {"/",S_OK,TRUE}, - {"",S_FALSE,TRUE}, + {"/",S_OK,FALSE}, + {"/",S_OK,FALSE}, + {"",S_FALSE,FALSE}, {"zip://%xy:word@winehq.org/",S_OK,FALSE}, {"zip",S_OK,FALSE}, {"%xy:word",S_OK,FALSE}, {"%xy",S_OK,FALSE} }, { - {Uri_HOST_DNS,S_OK,TRUE}, + {Uri_HOST_DNS,S_OK,FALSE}, {0,S_FALSE,FALSE}, {URL_SCHEME_UNKNOWN,S_OK,FALSE}, {URLZONE_INVALID,E_NOTIMPL,FALSE} @@ -890,26 +885,26 @@ Uri_HAS_ABSOLUTE_URI|Uri_HAS_AUTHORITY|Uri_HAS_DISPLAY_URI|Uri_HAS_DOMAIN| Uri_HAS_HOST|Uri_HAS_PASSWORD|Uri_HAS_PATH|Uri_HAS_PATH_AND_QUERY|Uri_HAS_RAW_URI| Uri_HAS_SCHEME_NAME|Uri_HAS_USER_INFO|Uri_HAS_USER_NAME|Uri_HAS_HOST_TYPE|Uri_HAS_SCHEME, - TRUE, + FALSE, { - {"zip://%2E:%52%53ord@winehq.org/",S_OK,TRUE}, - {"%2E:%52%53ord@winehq.org",S_OK,TRUE}, - {"zip://%2E:%52%53ord@winehq.org/",S_OK,TRUE}, - {"winehq.org",S_OK,TRUE}, - {"",S_FALSE,TRUE}, - {"",S_FALSE,TRUE}, + {"zip://%2E:%52%53ord@winehq.org/",S_OK,FALSE}, + {"%2E:%52%53ord@winehq.org",S_OK,FALSE}, + {"zip://%2E:%52%53ord@winehq.org/",S_OK,FALSE}, + {"winehq.org",S_OK,FALSE}, + {"",S_FALSE,FALSE}, + {"",S_FALSE,FALSE}, {"winehq.org",S_OK,FALSE}, {"%52%53ord",S_OK,FALSE}, - {"/",S_OK,TRUE}, - {"/",S_OK,TRUE}, - {"",S_FALSE,TRUE}, + {"/",S_OK,FALSE}, + {"/",S_OK,FALSE}, + {"",S_FALSE,FALSE}, {"zip://%2E:%52%53ord@winehq.org/",S_OK,FALSE}, {"zip",S_OK,FALSE}, {"%2E:%52%53ord",S_OK,FALSE}, {"%2E",S_OK,FALSE} }, { - {Uri_HOST_DNS,S_OK,TRUE}, + {Uri_HOST_DNS,S_OK,FALSE}, {0,S_FALSE,FALSE}, {URL_SCHEME_UNKNOWN,S_OK,FALSE}, {URLZONE_INVALID,E_NOTIMPL,FALSE} @@ -920,26 +915,26 @@ Uri_HAS_HOST|Uri_HAS_PASSWORD|Uri_HAS_PATH|Uri_HAS_PATH_AND_QUERY|Uri_HAS_RAW_URI| Uri_HAS_SCHEME_NAME|Uri_HAS_USER_INFO|Uri_HAS_USER_NAME|Uri_HAS_HOST_TYPE|Uri_HAS_PORT| Uri_HAS_SCHEME, - TRUE, + FALSE, { - {"ftp://[](),'test':word@winehq.org/",S_OK,TRUE}, - {"[](),'test':word@winehq.org",S_OK,TRUE}, - {"ftp://winehq.org/",S_OK,TRUE}, - {"winehq.org",S_OK,TRUE}, - {"",S_FALSE,TRUE}, - {"",S_FALSE,TRUE}, + {"ftp://[](),'test':word@winehq.org/",S_OK,FALSE}, + {"[](),'test':word@winehq.org",S_OK,FALSE}, + {"ftp://winehq.org/",S_OK,FALSE}, + {"winehq.org",S_OK,FALSE}, + {"",S_FALSE,FALSE}, + {"",S_FALSE,FALSE}, {"winehq.org",S_OK,FALSE}, {"word",S_OK,FALSE}, - {"/",S_OK,TRUE}, - {"/",S_OK,TRUE}, - {"",S_FALSE,TRUE}, + {"/",S_OK,FALSE}, + {"/",S_OK,FALSE}, + {"",S_FALSE,FALSE}, {"ftp://[](),'test':word@winehq.org/",S_OK,FALSE}, {"ftp",S_OK,FALSE}, {"[](),'test':word",S_OK,FALSE}, {"[](),'test'",S_OK,FALSE} }, { - {Uri_HOST_DNS,S_OK,TRUE}, + {Uri_HOST_DNS,S_OK,FALSE}, {21,S_OK,FALSE}, {URL_SCHEME_FTP,S_OK,FALSE}, {URLZONE_INVALID,E_NOTIMPL,FALSE} @@ -949,26 +944,26 @@ Uri_HAS_ABSOLUTE_URI|Uri_HAS_AUTHORITY|Uri_HAS_DISPLAY_URI|Uri_HAS_HOST| Uri_HAS_PATH|Uri_HAS_PATH_AND_QUERY|Uri_HAS_QUERY|Uri_HAS_RAW_URI|Uri_HAS_SCHEME_NAME| Uri_HAS_HOST_TYPE|Uri_HAS_PORT|Uri_HAS_SCHEME, - TRUE, + FALSE, { - {"ftp://test/?:word@winehq.org/",S_OK,TRUE}, - {"test",S_OK,TRUE}, - {"ftp://test/?:word@winehq.org/",S_OK,TRUE}, - {"",S_FALSE,TRUE}, - {"",S_FALSE,TRUE}, - {"",S_FALSE,TRUE}, + {"ftp://test/?:word@winehq.org/",S_OK,FALSE}, + {"test",S_OK,FALSE}, + {"ftp://test/?:word@winehq.org/",S_OK,FALSE}, + {"",S_FALSE,FALSE}, + {"",S_FALSE,FALSE}, + {"",S_FALSE,FALSE}, {"test",S_OK,FALSE}, {"",S_FALSE,FALSE}, - {"/",S_OK,TRUE}, - {"/?:word@winehq.org/",S_OK,TRUE}, - {"?:word@winehq.org/",S_OK,TRUE}, + {"/",S_OK,FALSE}, + {"/?:word@winehq.org/",S_OK,FALSE}, + {"?:word@winehq.org/",S_OK,FALSE}, {"ftp://test?:word@winehq.org/",S_OK,FALSE}, {"ftp",S_OK,FALSE}, {"",S_FALSE,FALSE}, {"",S_FALSE,FALSE} }, { - {Uri_HOST_DNS,S_OK,TRUE}, + {Uri_HOST_DNS,S_OK,FALSE}, {21,S_OK,FALSE}, {URL_SCHEME_FTP,S_OK,FALSE}, {URLZONE_INVALID,E_NOTIMPL,FALSE} @@ -978,26 +973,26 @@ Uri_HAS_ABSOLUTE_URI|Uri_HAS_AUTHORITY|Uri_HAS_DISPLAY_URI|Uri_HAS_FRAGMENT|Uri_HAS_HOST| Uri_HAS_PATH|Uri_HAS_PATH_AND_QUERY|Uri_HAS_RAW_URI|Uri_HAS_SCHEME_NAME| Uri_HAS_HOST_TYPE|Uri_HAS_PORT|Uri_HAS_SCHEME, - TRUE, + FALSE, { - {"ftp://test/#:word@winehq.org/",S_OK,TRUE}, - {"test",S_OK,TRUE}, - {"ftp://test/#:word@winehq.org/",S_OK,TRUE}, - {"",S_FALSE,TRUE}, - {"",S_FALSE,TRUE}, - {"#:word@winehq.org/",S_OK,TRUE}, + {"ftp://test/#:word@winehq.org/",S_OK,FALSE}, + {"test",S_OK,FALSE}, + {"ftp://test/#:word@winehq.org/",S_OK,FALSE}, + {"",S_FALSE,FALSE}, + {"",S_FALSE,FALSE}, + {"#:word@winehq.org/",S_OK,FALSE}, {"test",S_OK,FALSE}, {"",S_FALSE,FALSE}, - {"/",S_OK,TRUE}, - {"/",S_OK,TRUE}, - {"",S_FALSE,TRUE}, + {"/",S_OK,FALSE}, + {"/",S_OK,FALSE}, + {"",S_FALSE,FALSE}, {"ftp://test#:word@winehq.org/",S_OK,FALSE}, {"ftp",S_OK,FALSE}, {"",S_FALSE,FALSE}, {"",S_FALSE,FALSE} }, { - {Uri_HOST_DNS,S_OK,TRUE}, + {Uri_HOST_DNS,S_OK,FALSE}, {21,S_OK,FALSE}, {URL_SCHEME_FTP,S_OK,FALSE}, {URLZONE_INVALID,E_NOTIMPL,FALSE} @@ -1008,26 +1003,26 @@ Uri_HAS_ABSOLUTE_URI|Uri_HAS_AUTHORITY|Uri_HAS_DISPLAY_URI|Uri_HAS_DOMAIN|Uri_HAS_HOST| Uri_HAS_PASSWORD|Uri_HAS_PATH|Uri_HAS_PATH_AND_QUERY|Uri_HAS_RAW_URI|Uri_HAS_SCHEME_NAME| Uri_HAS_USER_INFO|Uri_HAS_USER_NAME|Uri_HAS_HOST_TYPE|Uri_HAS_SCHEME, - TRUE, + FALSE, { - {"zip://test\\:word@winehq.org/",S_OK,TRUE}, - {"test\\:word@winehq.org",S_OK,TRUE}, - {"zip://test\\:word@winehq.org/",S_OK,TRUE}, - {"winehq.org",S_OK,TRUE}, - {"",S_FALSE,TRUE}, - {"",S_FALSE,TRUE}, + {"zip://test\\:word@winehq.org/",S_OK,FALSE}, + {"test\\:word@winehq.org",S_OK,FALSE}, + {"zip://test\\:word@winehq.org/",S_OK,FALSE}, + {"winehq.org",S_OK,FALSE}, + {"",S_FALSE,FALSE}, + {"",S_FALSE,FALSE}, {"winehq.org",S_OK,FALSE}, {"word",S_OK,FALSE}, - {"/",S_OK,TRUE}, - {"/",S_OK,TRUE}, - {"",S_FALSE,TRUE}, + {"/",S_OK,FALSE}, + {"/",S_OK,FALSE}, + {"",S_FALSE,FALSE}, {"zip://test\\:word@winehq.org/",S_OK,FALSE}, {"zip",S_OK,FALSE}, {"test\\:word",S_OK,FALSE}, {"test\\",S_OK,FALSE} }, { - {Uri_HOST_DNS,S_OK,TRUE}, + {Uri_HOST_DNS,S_OK,FALSE}, {0,S_FALSE,FALSE}, {URL_SCHEME_UNKNOWN,S_OK,FALSE}, {URLZONE_INVALID,E_NOTIMPL,FALSE} @@ -1038,26 +1033,26 @@ Uri_HAS_ABSOLUTE_URI|Uri_HAS_AUTHORITY|Uri_HAS_DISPLAY_URI|Uri_HAS_HOST| Uri_HAS_PATH|Uri_HAS_PATH_AND_QUERY|Uri_HAS_RAW_URI|Uri_HAS_SCHEME_NAME| Uri_HAS_HOST_TYPE|Uri_HAS_PORT|Uri_HAS_SCHEME, - TRUE, + FALSE, { - {"http://127.0.0.100/",S_OK,TRUE}, - {"127.0.0.100",S_OK,TRUE}, - {"http://127.0.0.100/",S_OK,TRUE}, - {"",S_FALSE,TRUE}, - {"",S_FALSE,TRUE}, - {"",S_FALSE,TRUE}, + {"http://127.0.0.100/",S_OK,FALSE}, + {"127.0.0.100",S_OK,FALSE}, + {"http://127.0.0.100/",S_OK,FALSE}, + {"",S_FALSE,FALSE}, + {"",S_FALSE,FALSE}, + {"",S_FALSE,FALSE}, {"127.0.0.100",S_OK,FALSE}, {"",S_FALSE,FALSE}, - {"/",S_OK,TRUE}, - {"/",S_OK,TRUE}, - {"",S_FALSE,TRUE}, + {"/",S_OK,FALSE}, + {"/",S_OK,FALSE}, + {"",S_FALSE,FALSE}, {"http://127.000.000.100/",S_OK,FALSE}, {"http",S_OK,FALSE}, {"",S_FALSE,FALSE}, {"",S_FALSE,FALSE} }, { - {Uri_HOST_IPV4,S_OK,TRUE}, + {Uri_HOST_IPV4,S_OK,FALSE}, {80,S_OK,FALSE}, {URL_SCHEME_HTTP,S_OK,FALSE}, {URLZONE_INVALID,E_NOTIMPL,FALSE} @@ -1068,26 +1063,26 @@ Uri_HAS_ABSOLUTE_URI|Uri_HAS_AUTHORITY|Uri_HAS_DISPLAY_URI|Uri_HAS_HOST| Uri_HAS_PATH|Uri_HAS_PATH_AND_QUERY|Uri_HAS_RAW_URI|Uri_HAS_SCHEME_NAME| Uri_HAS_HOST_TYPE|Uri_HAS_PORT|Uri_HAS_SCHEME, - TRUE, + FALSE, { - {"http://127.0.0.0/",S_OK,TRUE}, - {"127.0.0.0",S_OK,TRUE}, - {"http://127.0.0.0/",S_OK,TRUE}, - {"",S_FALSE,TRUE}, - {"",S_FALSE,TRUE}, - {"",S_FALSE,TRUE}, + {"http://127.0.0.0/",S_OK,FALSE}, + {"127.0.0.0",S_OK,FALSE}, + {"http://127.0.0.0/",S_OK,FALSE}, + {"",S_FALSE,FALSE}, + {"",S_FALSE,FALSE}, + {"",S_FALSE,FALSE}, {"127.0.0.0",S_OK,FALSE}, {"",S_FALSE,FALSE}, - {"/",S_OK,TRUE}, - {"/",S_OK,TRUE}, - {"",S_FALSE,TRUE}, + {"/",S_OK,FALSE}, + {"/",S_OK,FALSE}, + {"",S_FALSE,FALSE}, {"http://127.0/",S_OK,FALSE}, {"http",S_OK,FALSE}, {"",S_FALSE,FALSE}, {"",S_FALSE,FALSE} }, { - {Uri_HOST_IPV4,S_OK,TRUE}, + {Uri_HOST_IPV4,S_OK,FALSE}, {80,S_OK,FALSE}, {URL_SCHEME_HTTP,S_OK,FALSE}, {URLZONE_INVALID,E_NOTIMPL,FALSE} @@ -1098,26 +1093,26 @@ Uri_HAS_ABSOLUTE_URI|Uri_HAS_AUTHORITY|Uri_HAS_DISPLAY_URI|Uri_HAS_HOST| Uri_HAS_PATH|Uri_HAS_PATH_AND_QUERY|Uri_HAS_RAW_URI|Uri_HAS_SCHEME_NAME| Uri_HAS_HOST_TYPE|Uri_HAS_PORT|Uri_HAS_SCHEME, - TRUE, + FALSE, { - {"http://0.1.226.64/",S_OK,TRUE}, - {"0.1.226.64",S_OK,TRUE}, - {"http://0.1.226.64/",S_OK,TRUE}, - {"",S_FALSE,TRUE}, - {"",S_FALSE,TRUE}, - {"",S_FALSE,TRUE}, + {"http://0.1.226.64/",S_OK,FALSE}, + {"0.1.226.64",S_OK,FALSE}, + {"http://0.1.226.64/",S_OK,FALSE}, + {"",S_FALSE,FALSE}, + {"",S_FALSE,FALSE}, + {"",S_FALSE,FALSE}, {"0.1.226.64",S_OK,FALSE}, {"",S_FALSE,FALSE}, - {"/",S_OK,TRUE}, - {"/",S_OK,TRUE}, - {"",S_FALSE,TRUE}, + {"/",S_OK,FALSE}, + {"/",S_OK,FALSE}, + {"",S_FALSE,FALSE}, {"http://123456/",S_OK,FALSE}, {"http",S_OK,FALSE}, {"",S_FALSE,FALSE}, {"",S_FALSE,FALSE} }, { - {Uri_HOST_IPV4,S_OK,TRUE}, + {Uri_HOST_IPV4,S_OK,FALSE}, {80,S_OK,FALSE}, {URL_SCHEME_HTTP,S_OK,FALSE}, {URLZONE_INVALID,E_NOTIMPL,FALSE} @@ -1128,26 +1123,26 @@ Uri_HAS_ABSOLUTE_URI|Uri_HAS_AUTHORITY|Uri_HAS_DISPLAY_URI|Uri_HAS_HOST| Uri_HAS_PATH|Uri_HAS_PATH_AND_QUERY|Uri_HAS_RAW_URI|Uri_HAS_SCHEME_NAME| Uri_HAS_HOST_TYPE|Uri_HAS_PORT|Uri_HAS_SCHEME, - TRUE, + FALSE, { - {"http://255.255.255.255/",S_OK,TRUE}, - {"255.255.255.255",S_OK,TRUE}, - {"http://255.255.255.255/",S_OK,TRUE}, - {"",S_FALSE,TRUE}, - {"",S_FALSE,TRUE}, - {"",S_FALSE,TRUE}, + {"http://255.255.255.255/",S_OK,FALSE}, {"255.255.255.255",S_OK,FALSE}, + {"http://255.255.255.255/",S_OK,FALSE}, + {"",S_FALSE,FALSE}, + {"",S_FALSE,FALSE}, + {"",S_FALSE,FALSE}, + {"255.255.255.255",S_OK,FALSE}, + {"",S_FALSE,FALSE}, + {"/",S_OK,FALSE}, + {"/",S_OK,FALSE}, {"",S_FALSE,FALSE}, - {"/",S_OK,TRUE}, - {"/",S_OK,TRUE}, - {"",S_FALSE,TRUE}, {"http://4294967295/",S_OK,FALSE}, {"http",S_OK,FALSE}, {"",S_FALSE,FALSE}, {"",S_FALSE,FALSE} }, { - {Uri_HOST_IPV4,S_OK,TRUE}, + {Uri_HOST_IPV4,S_OK,FALSE}, {80,S_OK,FALSE}, {URL_SCHEME_HTTP,S_OK,FALSE}, {URLZONE_INVALID,E_NOTIMPL,FALSE} @@ -1158,26 +1153,26 @@ Uri_HAS_ABSOLUTE_URI|Uri_HAS_AUTHORITY|Uri_HAS_DISPLAY_URI|Uri_HAS_HOST| Uri_HAS_PATH|Uri_HAS_PATH_AND_QUERY|Uri_HAS_RAW_URI|Uri_HAS_SCHEME_NAME| Uri_HAS_HOST_TYPE|Uri_HAS_PORT|Uri_HAS_SCHEME, - TRUE, + FALSE, { - {"http://4294967296/",S_OK,TRUE}, - {"4294967296",S_OK,TRUE}, - {"http://4294967296/",S_OK,TRUE}, - {"",S_FALSE,TRUE}, - {"",S_FALSE,TRUE}, - {"",S_FALSE,TRUE}, + {"http://4294967296/",S_OK,FALSE}, + {"4294967296",S_OK,FALSE}, + {"http://4294967296/",S_OK,FALSE}, + {"",S_FALSE,FALSE}, + {"",S_FALSE,FALSE}, + {"",S_FALSE,FALSE}, {"4294967296",S_OK,FALSE}, {"",S_FALSE,FALSE}, - {"/",S_OK,TRUE}, - {"/",S_OK,TRUE}, - {"",S_FALSE,TRUE}, + {"/",S_OK,FALSE}, + {"/",S_OK,FALSE}, + {"",S_FALSE,FALSE}, {"http://4294967296/",S_OK,FALSE}, {"http",S_OK,FALSE}, {"",S_FALSE,FALSE}, {"",S_FALSE,FALSE} }, { - {Uri_HOST_DNS,S_OK,TRUE}, + {Uri_HOST_DNS,S_OK,FALSE}, {80,S_OK,FALSE}, {URL_SCHEME_HTTP,S_OK,FALSE}, {URLZONE_INVALID,E_NOTIMPL,FALSE} @@ -1188,26 +1183,26 @@ Uri_HAS_ABSOLUTE_URI|Uri_HAS_AUTHORITY|Uri_HAS_DISPLAY_URI|Uri_HAS_HOST| Uri_HAS_PATH|Uri_HAS_PATH_AND_QUERY|Uri_HAS_RAW_URI|Uri_HAS_SCHEME_NAME| Uri_HAS_HOST_TYPE|Uri_HAS_SCHEME, - TRUE, + FALSE, { - {"1234://4294967295/",S_OK,TRUE}, - {"4294967295",S_OK,TRUE}, - {"1234://4294967295/",S_OK,TRUE}, - {"",S_FALSE,TRUE}, - {"",S_FALSE,TRUE}, - {"",S_FALSE,TRUE}, + {"1234://4294967295/",S_OK,FALSE}, + {"4294967295",S_OK,FALSE}, + {"1234://4294967295/",S_OK,FALSE}, + {"",S_FALSE,FALSE}, + {"",S_FALSE,FALSE}, + {"",S_FALSE,FALSE}, {"4294967295",S_OK,FALSE}, {"",S_FALSE,FALSE}, - {"/",S_OK,TRUE}, - {"/",S_OK,TRUE}, - {"",S_FALSE,TRUE}, + {"/",S_OK,FALSE}, + {"/",S_OK,FALSE}, + {"",S_FALSE,FALSE}, {"1234://4294967295/",S_OK,FALSE}, {"1234",S_OK,FALSE}, {"",S_FALSE,FALSE}, {"",S_FALSE,FALSE} }, { - {Uri_HOST_IPV4,S_OK,TRUE}, + {Uri_HOST_IPV4,S_OK,FALSE}, {0,S_FALSE,FALSE}, {URL_SCHEME_UNKNOWN,S_OK,FALSE}, {URLZONE_INVALID,E_NOTIMPL,FALSE} @@ -1218,26 +1213,26 @@ Uri_HAS_ABSOLUTE_URI|Uri_HAS_AUTHORITY|Uri_HAS_DISPLAY_URI|Uri_HAS_HOST| Uri_HAS_PATH|Uri_HAS_PATH_AND_QUERY|Uri_HAS_RAW_URI|Uri_HAS_SCHEME_NAME| Uri_HAS_HOST_TYPE|Uri_HAS_SCHEME, - TRUE, + FALSE, { - {"1234://127.001/",S_OK,TRUE}, - {"127.001",S_OK,TRUE}, - {"1234://127.001/",S_OK,TRUE}, - {"",S_FALSE,TRUE}, - {"",S_FALSE,TRUE}, - {"",S_FALSE,TRUE}, + {"1234://127.001/",S_OK,FALSE}, + {"127.001",S_OK,FALSE}, + {"1234://127.001/",S_OK,FALSE}, + {"",S_FALSE,FALSE}, + {"",S_FALSE,FALSE}, + {"",S_FALSE,FALSE}, {"127.001",S_OK,FALSE}, {"",S_FALSE,FALSE}, - {"/",S_OK,TRUE}, - {"/",S_OK,TRUE}, - {"",S_FALSE,TRUE}, + {"/",S_OK,FALSE}, + {"/",S_OK,FALSE}, + {"",S_FALSE,FALSE}, {"1234://127.001/",S_OK,FALSE}, {"1234",S_OK,FALSE}, {"",S_FALSE,FALSE}, {"",S_FALSE,FALSE} }, { - {Uri_HOST_IPV4,S_OK,TRUE}, + {Uri_HOST_IPV4,S_OK,FALSE}, {0,S_FALSE,FALSE}, {URL_SCHEME_UNKNOWN,S_OK,FALSE}, {URLZONE_INVALID,E_NOTIMPL,FALSE} @@ -1247,26 +1242,26 @@ Uri_HAS_ABSOLUTE_URI|Uri_HAS_AUTHORITY|Uri_HAS_DISPLAY_URI|Uri_HAS_HOST| Uri_HAS_PATH|Uri_HAS_PATH_AND_QUERY|Uri_HAS_RAW_URI|Uri_HAS_SCHEME_NAME| Uri_HAS_HOST_TYPE|Uri_HAS_PORT|Uri_HAS_SCHEME, - TRUE, + FALSE, { - {"http://[fedc:ba98::3210]/",S_OK,TRUE}, - {"[fedc:ba98::3210]",S_OK,TRUE}, - {"http://[fedc:ba98::3210]/",S_OK,TRUE}, - {"",S_FALSE,TRUE}, - {"",S_FALSE,TRUE}, - {"",S_FALSE,TRUE}, + {"http://[fedc:ba98::3210]/",S_OK,FALSE}, + {"[fedc:ba98::3210]",S_OK,FALSE}, + {"http://[fedc:ba98::3210]/",S_OK,FALSE}, + {"",S_FALSE,FALSE}, + {"",S_FALSE,FALSE}, + {"",S_FALSE,FALSE}, {"fedc:ba98::3210",S_OK,FALSE}, {"",S_FALSE,FALSE}, - {"/",S_OK,TRUE}, - {"/",S_OK,TRUE}, - {"",S_FALSE,TRUE}, + {"/",S_OK,FALSE}, + {"/",S_OK,FALSE}, + {"",S_FALSE,FALSE}, {"http://[FEDC:BA98::3210]",S_OK,FALSE}, {"http",S_OK,FALSE}, {"",S_FALSE,FALSE}, {"",S_FALSE,FALSE}, }, { - {Uri_HOST_IPV6,S_OK,TRUE}, + {Uri_HOST_IPV6,S_OK,FALSE}, {80,S_OK,FALSE}, {URL_SCHEME_HTTP,S_OK,FALSE}, {URLZONE_INVALID,E_NOTIMPL,FALSE} @@ -1276,26 +1271,26 @@ Uri_HAS_ABSOLUTE_URI|Uri_HAS_AUTHORITY|Uri_HAS_DISPLAY_URI|Uri_HAS_HOST| Uri_HAS_PATH|Uri_HAS_PATH_AND_QUERY|Uri_HAS_RAW_URI|Uri_HAS_SCHEME_NAME| Uri_HAS_HOST_TYPE|Uri_HAS_PORT|Uri_HAS_SCHEME, - TRUE, + FALSE, { - {"http://[::]/",S_OK,TRUE}, - {"[::]",S_OK,TRUE}, - {"http://[::]/",S_OK,TRUE}, - {"",S_FALSE,TRUE}, - {"",S_FALSE,TRUE}, - {"",S_FALSE,TRUE}, + {"http://[::]/",S_OK,FALSE}, + {"[::]",S_OK,FALSE}, + {"http://[::]/",S_OK,FALSE}, + {"",S_FALSE,FALSE}, + {"",S_FALSE,FALSE}, + {"",S_FALSE,FALSE}, {"::",S_OK,FALSE}, {"",S_FALSE,FALSE}, - {"/",S_OK,TRUE}, - {"/",S_OK,TRUE}, - {"",S_FALSE,TRUE}, + {"/",S_OK,FALSE}, + {"/",S_OK,FALSE}, + {"",S_FALSE,FALSE}, {"http://[::]",S_OK,FALSE}, {"http",S_OK,FALSE}, {"",S_FALSE,FALSE}, {"",S_FALSE,FALSE}, }, { - {Uri_HOST_IPV6,S_OK,TRUE}, + {Uri_HOST_IPV6,S_OK,FALSE}, {80,S_OK,FALSE}, {URL_SCHEME_HTTP,S_OK,FALSE}, {URLZONE_INVALID,E_NOTIMPL,FALSE} @@ -1305,26 +1300,26 @@ Uri_HAS_ABSOLUTE_URI|Uri_HAS_AUTHORITY|Uri_HAS_DISPLAY_URI|Uri_HAS_HOST| Uri_HAS_PATH|Uri_HAS_PATH_AND_QUERY|Uri_HAS_RAW_URI|Uri_HAS_SCHEME_NAME| Uri_HAS_HOST_TYPE|Uri_HAS_PORT|Uri_HAS_SCHEME, - TRUE, + FALSE, { - {"http://[fedc:ba98::]/",S_OK,TRUE}, - {"[fedc:ba98::]",S_OK,TRUE}, - {"http://[fedc:ba98::]/",S_OK,TRUE}, - {"",S_FALSE,TRUE}, - {"",S_FALSE,TRUE}, - {"",S_FALSE,TRUE}, + {"http://[fedc:ba98::]/",S_OK,FALSE}, + {"[fedc:ba98::]",S_OK,FALSE}, + {"http://[fedc:ba98::]/",S_OK,FALSE}, + {"",S_FALSE,FALSE}, + {"",S_FALSE,FALSE}, + {"",S_FALSE,FALSE}, {"fedc:ba98::",S_OK,FALSE}, {"",S_FALSE,FALSE}, - {"/",S_OK,TRUE}, - {"/",S_OK,TRUE}, - {"",S_FALSE,TRUE}, + {"/",S_OK,FALSE}, + {"/",S_OK,FALSE}, + {"",S_FALSE,FALSE}, {"http://[FEDC:BA98::]",S_OK,FALSE}, {"http",S_OK,FALSE}, {"",S_FALSE,FALSE}, {"",S_FALSE,FALSE}, }, { - {Uri_HOST_IPV6,S_OK,TRUE}, + {Uri_HOST_IPV6,S_OK,FALSE}, {80,S_OK,FALSE}, {URL_SCHEME_HTTP,S_OK,FALSE}, {URLZONE_INVALID,E_NOTIMPL,FALSE} @@ -1335,26 +1330,26 @@ Uri_HAS_ABSOLUTE_URI|Uri_HAS_AUTHORITY|Uri_HAS_DISPLAY_URI|Uri_HAS_HOST| Uri_HAS_PATH|Uri_HAS_PATH_AND_QUERY|Uri_HAS_RAW_URI|Uri_HAS_SCHEME_NAME| Uri_HAS_HOST_TYPE|Uri_HAS_PORT|Uri_HAS_SCHEME, - TRUE, + FALSE, { - {"http://[1:0:3:4:5:6:7:8]/",S_OK,TRUE}, - {"[1:0:3:4:5:6:7:8]",S_OK,TRUE}, - {"http://[1:0:3:4:5:6:7:8]/",S_OK,TRUE}, - {"",S_FALSE,TRUE}, - {"",S_FALSE,TRUE}, - {"",S_FALSE,TRUE}, + {"http://[1:0:3:4:5:6:7:8]/",S_OK,FALSE}, + {"[1:0:3:4:5:6:7:8]",S_OK,FALSE}, + {"http://[1:0:3:4:5:6:7:8]/",S_OK,FALSE}, + {"",S_FALSE,FALSE}, + {"",S_FALSE,FALSE}, + {"",S_FALSE,FALSE}, {"1:0:3:4:5:6:7:8",S_OK,FALSE}, {"",S_FALSE,FALSE}, - {"/",S_OK,TRUE}, - {"/",S_OK,TRUE}, - {"",S_FALSE,TRUE}, + {"/",S_OK,FALSE}, + {"/",S_OK,FALSE}, + {"",S_FALSE,FALSE}, {"http://[1::3:4:5:6:7:8]",S_OK,FALSE}, {"http",S_OK,FALSE}, {"",S_FALSE,FALSE}, {"",S_FALSE,FALSE}, }, { - {Uri_HOST_IPV6,S_OK,TRUE}, + {Uri_HOST_IPV6,S_OK,FALSE}, {80,S_OK,FALSE}, {URL_SCHEME_HTTP,S_OK,FALSE}, {URLZONE_INVALID,E_NOTIMPL,FALSE} @@ -1364,26 +1359,26 @@ Uri_HAS_ABSOLUTE_URI|Uri_HAS_AUTHORITY|Uri_HAS_DISPLAY_URI|Uri_HAS_HOST| Uri_HAS_PATH|Uri_HAS_PATH_AND_QUERY|Uri_HAS_RAW_URI|Uri_HAS_SCHEME_NAME| Uri_HAS_HOST_TYPE|Uri_HAS_PORT|Uri_HAS_SCHEME, - TRUE, + FALSE, { - {"http://[v2.34]/",S_OK,TRUE}, - {"[v2.34]",S_OK,TRUE}, - {"http://[v2.34]/",S_OK,TRUE}, - {"",S_FALSE,TRUE}, - {"",S_FALSE,TRUE}, - {"",S_FALSE,TRUE}, + {"http://[v2.34]/",S_OK,FALSE}, + {"[v2.34]",S_OK,FALSE}, + {"http://[v2.34]/",S_OK,FALSE}, + {"",S_FALSE,FALSE}, + {"",S_FALSE,FALSE}, + {"",S_FALSE,FALSE}, {"[v2.34]",S_OK,FALSE}, {"",S_FALSE,FALSE}, - {"/",S_OK,TRUE}, - {"/",S_OK,TRUE}, - {"",S_FALSE,TRUE}, + {"/",S_OK,FALSE}, + {"/",S_OK,FALSE}, + {"",S_FALSE,FALSE}, {"http://[v2.34]/",S_OK,FALSE}, {"http",S_OK,FALSE}, {"",S_FALSE,FALSE}, {"",S_FALSE,FALSE} }, { - {Uri_HOST_UNKNOWN,S_OK,TRUE}, + {Uri_HOST_UNKNOWN,S_OK,FALSE}, {80,S_OK,FALSE}, {URL_SCHEME_HTTP,S_OK,FALSE}, {URLZONE_INVALID,E_NOTIMPL,FALSE} @@ -1394,26 +1389,26 @@ Uri_HAS_ABSOLUTE_URI|Uri_HAS_AUTHORITY|Uri_HAS_DISPLAY_URI|Uri_HAS_DOMAIN| Uri_HAS_HOST|Uri_HAS_PATH|Uri_HAS_PATH_AND_QUERY|Uri_HAS_RAW_URI| Uri_HAS_SCHEME_NAME|Uri_HAS_HOST_TYPE|Uri_HAS_PORT|Uri_HAS_SCHEME, - TRUE, + FALSE, { - {"http://[xyz:12345.com/test",S_OK,TRUE}, - {"[xyz:12345.com",S_OK,TRUE}, - {"http://[xyz:12345.com/test",S_OK,TRUE}, - {"[xyz:12345.com",S_OK,TRUE}, - {"",S_FALSE,TRUE}, - {"",S_FALSE,TRUE}, + {"http://[xyz:12345.com/test",S_OK,FALSE}, + {"[xyz:12345.com",S_OK,FALSE}, + {"http://[xyz:12345.com/test",S_OK,FALSE}, {"[xyz:12345.com",S_OK,FALSE}, {"",S_FALSE,FALSE}, - {"/test",S_OK,TRUE}, - {"/test",S_OK,TRUE}, - {"",S_FALSE,TRUE}, + {"",S_FALSE,FALSE}, + {"[xyz:12345.com",S_OK,FALSE}, + {"",S_FALSE,FALSE}, + {"/test",S_OK,FALSE}, + {"/test",S_OK,FALSE}, + {"",S_FALSE,FALSE}, {"http://[xyz:12345.com/test",S_OK,FALSE}, {"http",S_OK,FALSE}, {"",S_FALSE,FALSE}, {"",S_FALSE,FALSE} }, { - {Uri_HOST_DNS,S_OK,TRUE}, + {Uri_HOST_DNS,S_OK,FALSE}, {80,S_OK,FALSE}, {URL_SCHEME_HTTP,S_OK,FALSE}, {URLZONE_INVALID,E_NOTIMPL,FALSE} @@ -1426,26 +1421,26 @@ Uri_HAS_ABSOLUTE_URI|Uri_HAS_AUTHORITY|Uri_HAS_DISPLAY_URI|Uri_HAS_DOMAIN| Uri_HAS_HOST|Uri_HAS_PATH|Uri_HAS_PATH_AND_QUERY|Uri_HAS_RAW_URI| Uri_HAS_SCHEME_NAME|Uri_HAS_HOST_TYPE|Uri_HAS_PORT|Uri_HAS_SCHEME, - TRUE, + FALSE, { - {"ftp://www.[works].com/",S_OK,TRUE}, - {"www.[works].com",S_OK,TRUE}, - {"ftp://www.[works].com/",S_OK,TRUE}, - {"[works].com",S_OK,TRUE}, - {"",S_FALSE,TRUE}, - {"",S_FALSE,TRUE}, + {"ftp://www.[works].com/",S_OK,FALSE}, + {"www.[works].com",S_OK,FALSE}, + {"ftp://www.[works].com/",S_OK,FALSE}, + {"[works].com",S_OK,FALSE}, + {"",S_FALSE,FALSE}, + {"",S_FALSE,FALSE}, {"www.[works].com",S_OK,FALSE}, {"",S_FALSE,FALSE}, - {"/",S_OK,TRUE}, - {"/",S_OK,TRUE}, - {"",S_FALSE,TRUE}, + {"/",S_OK,FALSE}, + {"/",S_OK,FALSE}, + {"",S_FALSE,FALSE}, {"ftp://www.[works].com/",S_OK,FALSE}, {"ftp",S_OK,FALSE}, {"",S_FALSE,FALSE}, {"",S_FALSE,FALSE} }, { - {Uri_HOST_DNS,S_OK,TRUE}, + {Uri_HOST_DNS,S_OK,FALSE}, {21,S_OK,FALSE}, {URL_SCHEME_FTP,S_OK,FALSE}, {URLZONE_INVALID,E_NOTIMPL,FALSE} @@ -1456,26 +1451,26 @@ Uri_HAS_ABSOLUTE_URI|Uri_HAS_AUTHORITY|Uri_HAS_DISPLAY_URI|Uri_HAS_DOMAIN| Uri_HAS_HOST|Uri_HAS_PATH|Uri_HAS_PATH_AND_QUERY|Uri_HAS_RAW_URI| Uri_HAS_SCHEME_NAME|Uri_HAS_HOST_TYPE|Uri_HAS_PORT|Uri_HAS_SCHEME, - TRUE, + FALSE, { - {"http://www.google.com]:12345/",S_OK,TRUE}, - {"www.google.com]:12345",S_OK,TRUE}, - {"http://www.google.com]:12345/",S_OK,TRUE}, - {"google.com]",S_OK,TRUE}, - {"",S_FALSE,TRUE}, - {"",S_FALSE,TRUE}, + {"http://www.google.com]:12345/",S_OK,FALSE}, + {"www.google.com]:12345",S_OK,FALSE}, + {"http://www.google.com]:12345/",S_OK,FALSE}, + {"google.com]",S_OK,FALSE}, + {"",S_FALSE,FALSE}, + {"",S_FALSE,FALSE}, {"www.google.com]",S_OK,FALSE}, {"",S_FALSE,FALSE}, - {"/",S_OK,TRUE}, - {"/",S_OK,TRUE}, - {"",S_FALSE,TRUE}, + {"/",S_OK,FALSE}, + {"/",S_OK,FALSE}, + {"",S_FALSE,FALSE}, {"http://www.google.com]:12345/",S_OK,FALSE}, {"http",S_OK,FALSE}, {"",S_FALSE,FALSE}, {"",S_FALSE,FALSE} }, { - {Uri_HOST_DNS,S_OK,TRUE}, + {Uri_HOST_DNS,S_OK,FALSE}, {12345,S_OK,FALSE}, {URL_SCHEME_HTTP,S_OK,FALSE}, {URLZONE_INVALID,E_NOTIMPL,FALSE} @@ -1486,26 +1481,26 @@ Uri_HAS_ABSOLUTE_URI|Uri_HAS_AUTHORITY|Uri_HAS_DISPLAY_URI|Uri_HAS_DOMAIN| Uri_HAS_HOST|Uri_HAS_PATH|Uri_HAS_PATH_AND_QUERY|Uri_HAS_RAW_URI| Uri_HAS_SCHEME_NAME|Uri_HAS_HOST_TYPE|Uri_HAS_SCHEME, - TRUE, + FALSE, { - {"zip://w%XXw%GEw.google.com/",S_OK,TRUE}, - {"w%XXw%GEw.google.com",S_OK,TRUE}, - {"zip://w%XXw%GEw.google.com/",S_OK,TRUE}, - {"google.com",S_OK,TRUE}, - {"",S_FALSE,TRUE}, - {"",S_FALSE,TRUE}, + {"zip://w%XXw%GEw.google.com/",S_OK,FALSE}, + {"w%XXw%GEw.google.com",S_OK,FALSE}, + {"zip://w%XXw%GEw.google.com/",S_OK,FALSE}, + {"google.com",S_OK,FALSE}, + {"",S_FALSE,FALSE}, + {"",S_FALSE,FALSE}, {"w%XXw%GEw.google.com",S_OK,FALSE}, {"",S_FALSE,FALSE}, - {"/",S_OK,TRUE}, - {"/",S_OK,TRUE}, - {"",S_FALSE,TRUE}, + {"/",S_OK,FALSE}, + {"/",S_OK,FALSE}, + {"",S_FALSE,FALSE}, {"zip://w%XXw%GEw.google.com/",S_OK,FALSE}, {"zip",S_OK,FALSE}, {"",S_FALSE,FALSE}, {"",S_FALSE,FALSE} }, { - {Uri_HOST_DNS,S_OK,TRUE}, + {Uri_HOST_DNS,S_OK,FALSE}, {0,S_FALSE,FALSE}, {URL_SCHEME_UNKNOWN,S_OK,FALSE}, {URLZONE_INVALID,E_NOTIMPL,FALSE} @@ -1516,26 +1511,26 @@ Uri_HAS_ABSOLUTE_URI|Uri_HAS_AUTHORITY|Uri_HAS_DISPLAY_URI|Uri_HAS_DOMAIN| Uri_HAS_HOST|Uri_HAS_PATH|Uri_HAS_PATH_AND_QUERY|Uri_HAS_RAW_URI| Uri_HAS_SCHEME_NAME|Uri_HAS_HOST_TYPE|Uri_HAS_SCHEME, - TRUE, + FALSE, { - {"zip://GOOGLE.com/",S_OK,TRUE}, - {"GOOGLE.com",S_OK,TRUE}, - {"zip://GOOGLE.com/",S_OK,TRUE}, - {"GOOGLE.com",S_OK,TRUE}, - {"",S_FALSE,TRUE}, - {"",S_FALSE,TRUE}, + {"zip://GOOGLE.com/",S_OK,FALSE}, + {"GOOGLE.com",S_OK,FALSE}, + {"zip://GOOGLE.com/",S_OK,FALSE}, + {"GOOGLE.com",S_OK,FALSE}, + {"",S_FALSE,FALSE}, + {"",S_FALSE,FALSE}, {"GOOGLE.com",S_OK,FALSE}, {"",S_FALSE,FALSE}, - {"/",S_OK,TRUE}, - {"/",S_OK,TRUE}, - {"",S_FALSE,TRUE}, + {"/",S_OK,FALSE}, + {"/",S_OK,FALSE}, + {"",S_FALSE,FALSE}, {"zip://GOOGLE.com/",S_OK,FALSE}, {"zip",S_OK,FALSE}, {"",S_FALSE,FALSE}, {"",S_FALSE,FALSE} }, { - {Uri_HOST_DNS,S_OK,TRUE}, + {Uri_HOST_DNS,S_OK,FALSE}, {0,S_FALSE,FALSE}, {URL_SCHEME_UNKNOWN,S_OK,FALSE}, {URLZONE_INVALID,E_NOTIMPL,FALSE} @@ -1546,26 +1541,26 @@ Uri_HAS_ABSOLUTE_URI|Uri_HAS_AUTHORITY|Uri_HAS_DISPLAY_URI|Uri_HAS_DOMAIN| Uri_HAS_HOST|Uri_HAS_PATH|Uri_HAS_PATH_AND_QUERY|Uri_HAS_RAW_URI| Uri_HAS_SCHEME_NAME|Uri_HAS_HOST_TYPE|Uri_HAS_PORT|Uri_HAS_SCHEME, - TRUE, + FALSE, { - {"http://www.google.com/",S_OK,TRUE}, - {"www.google.com",S_OK,TRUE}, - {"http://www.google.com/",S_OK,TRUE}, - {"google.com",S_OK,TRUE}, - {"",S_FALSE,TRUE}, - {"",S_FALSE,TRUE}, + {"http://www.google.com/",S_OK,FALSE}, + {"www.google.com",S_OK,FALSE}, + {"http://www.google.com/",S_OK,FALSE}, + {"google.com",S_OK,FALSE}, + {"",S_FALSE,FALSE}, + {"",S_FALSE,FALSE}, {"www.google.com",S_OK,FALSE}, {"",S_FALSE,FALSE}, - {"/",S_OK,TRUE}, - {"/",S_OK,TRUE}, - {"",S_FALSE,TRUE}, + {"/",S_OK,FALSE}, + {"/",S_OK,FALSE}, + {"",S_FALSE,FALSE}, {"http://WWW.GOOGLE.com/",S_OK,FALSE}, {"http",S_OK,FALSE}, {"",S_FALSE,FALSE}, {"",S_FALSE,FALSE} }, { - {Uri_HOST_DNS,S_OK,TRUE}, + {Uri_HOST_DNS,S_OK,FALSE}, {80,S_OK,FALSE}, {URL_SCHEME_HTTP,S_OK,FALSE}, {URLZONE_INVALID,E_NOTIMPL,FALSE} @@ -1578,26 +1573,26 @@ Uri_HAS_ABSOLUTE_URI|Uri_HAS_AUTHORITY|Uri_HAS_DISPLAY_URI|Uri_HAS_DOMAIN| Uri_HAS_HOST|Uri_HAS_PATH|Uri_HAS_PATH_AND_QUERY|Uri_HAS_RAW_URI| Uri_HAS_SCHEME_NAME|Uri_HAS_HOST_TYPE|Uri_HAS_PORT|Uri_HAS_SCHEME, - TRUE, + FALSE, { - {"http://www.%7cgoogle%7c.com/",S_OK,TRUE}, - {"www.%7cgoogle%7c.com",S_OK,TRUE}, - {"http://www.%7cgoogle%7c.com/",S_OK,TRUE}, - {"%7cgoogle%7c.com",S_OK,TRUE}, - {"",S_FALSE,TRUE}, - {"",S_FALSE,TRUE}, + {"http://www.%7cgoogle%7c.com/",S_OK,FALSE}, {"www.%7cgoogle%7c.com",S_OK,FALSE}, + {"http://www.%7cgoogle%7c.com/",S_OK,FALSE}, + {"%7cgoogle%7c.com",S_OK,FALSE}, {"",S_FALSE,FALSE}, - {"/",S_OK,TRUE}, - {"/",S_OK,TRUE}, - {"",S_FALSE,TRUE}, - {"http://www.%7Cgoogle|.com/",S_OK,FALSE}, - {"http",S_OK,FALSE}, + {"",S_FALSE,FALSE}, + {"www.%7cgoogle%7c.com",S_OK,FALSE}, + {"",S_FALSE,FALSE}, + {"/",S_OK,FALSE}, + {"/",S_OK,FALSE}, + {"",S_FALSE,FALSE}, + {"http://www.%7Cgoogle|.com/",S_OK,FALSE}, + {"http",S_OK,FALSE}, {"",S_FALSE,FALSE}, {"",S_FALSE,FALSE} }, { - {Uri_HOST_DNS,S_OK,TRUE}, + {Uri_HOST_DNS,S_OK,FALSE}, {80,S_OK,FALSE}, {URL_SCHEME_HTTP,S_OK,FALSE}, {URLZONE_INVALID,E_NOTIMPL,FALSE} @@ -1608,26 +1603,26 @@ Uri_HAS_ABSOLUTE_URI|Uri_HAS_AUTHORITY|Uri_HAS_DISPLAY_URI|Uri_HAS_HOST| Uri_HAS_PATH|Uri_HAS_PATH_AND_QUERY|Uri_HAS_RAW_URI|Uri_HAS_SCHEME_NAME| Uri_HAS_HOST_TYPE|Uri_HAS_PORT|Uri_HAS_SCHEME, - TRUE, + FALSE, { - {"http://[1:2:3:4:5:6::]/",S_OK,TRUE}, - {"[1:2:3:4:5:6::]",S_OK,TRUE}, - {"http://[1:2:3:4:5:6::]/",S_OK,TRUE}, - {"",S_FALSE,TRUE}, - {"",S_FALSE,TRUE}, - {"",S_FALSE,TRUE}, + {"http://[1:2:3:4:5:6::]/",S_OK,FALSE}, + {"[1:2:3:4:5:6::]",S_OK,FALSE}, + {"http://[1:2:3:4:5:6::]/",S_OK,FALSE}, + {"",S_FALSE,FALSE}, + {"",S_FALSE,FALSE}, + {"",S_FALSE,FALSE}, {"1:2:3:4:5:6::",S_OK,FALSE}, {"",S_FALSE,FALSE}, - {"/",S_OK,TRUE}, - {"/",S_OK,TRUE}, - {"",S_FALSE,TRUE}, + {"/",S_OK,FALSE}, + {"/",S_OK,FALSE}, + {"",S_FALSE,FALSE}, {"http://[1:2:3:4:5:6:0.0.0.0]",S_OK,FALSE}, {"http",S_OK,FALSE}, {"",S_FALSE,FALSE}, {"",S_FALSE,FALSE}, }, { - {Uri_HOST_IPV6,S_OK,TRUE}, + {Uri_HOST_IPV6,S_OK,FALSE}, {80,S_OK,FALSE}, {URL_SCHEME_HTTP,S_OK,FALSE}, {URLZONE_INVALID,E_NOTIMPL,FALSE} @@ -1638,26 +1633,26 @@ Uri_HAS_ABSOLUTE_URI|Uri_HAS_AUTHORITY|Uri_HAS_DISPLAY_URI|Uri_HAS_HOST| Uri_HAS_PATH|Uri_HAS_PATH_AND_QUERY|Uri_HAS_RAW_URI|Uri_HAS_SCHEME_NAME| Uri_HAS_HOST_TYPE|Uri_HAS_PORT|Uri_HAS_SCHEME, - TRUE, + FALSE, { - {"http://[::1.2.3.0]/",S_OK,TRUE}, - {"[::1.2.3.0]",S_OK,TRUE}, - {"http://[::1.2.3.0]/",S_OK,TRUE}, - {"",S_FALSE,TRUE}, - {"",S_FALSE,TRUE}, - {"",S_FALSE,TRUE}, + {"http://[::1.2.3.0]/",S_OK,FALSE}, + {"[::1.2.3.0]",S_OK,FALSE}, + {"http://[::1.2.3.0]/",S_OK,FALSE}, + {"",S_FALSE,FALSE}, + {"",S_FALSE,FALSE}, + {"",S_FALSE,FALSE}, {"::1.2.3.0",S_OK,FALSE}, {"",S_FALSE,FALSE}, - {"/",S_OK,TRUE}, - {"/",S_OK,TRUE}, - {"",S_FALSE,TRUE}, + {"/",S_OK,FALSE}, + {"/",S_OK,FALSE}, + {"",S_FALSE,FALSE}, {"http://[::001.002.003.000]",S_OK,FALSE}, {"http",S_OK,FALSE}, {"",S_FALSE,FALSE}, {"",S_FALSE,FALSE}, }, { - {Uri_HOST_IPV6,S_OK,TRUE}, + {Uri_HOST_IPV6,S_OK,FALSE}, {80,S_OK,FALSE}, {URL_SCHEME_HTTP,S_OK,FALSE}, {URLZONE_INVALID,E_NOTIMPL,FALSE} @@ -1668,26 +1663,26 @@ Uri_HAS_ABSOLUTE_URI|Uri_HAS_AUTHORITY|Uri_HAS_DISPLAY_URI|Uri_HAS_HOST| Uri_HAS_PATH|Uri_HAS_PATH_AND_QUERY|Uri_HAS_RAW_URI|Uri_HAS_SCHEME_NAME| Uri_HAS_HOST_TYPE|Uri_HAS_SCHEME, - TRUE, + FALSE, { - {"zip://[0001:0:000:0004:0005:0006:001.002.003.000]/",S_OK,TRUE}, - {"[0001:0:000:0004:0005:0006:001.002.003.000]",S_OK,TRUE}, - {"zip://[0001:0:000:0004:0005:0006:001.002.003.000]/",S_OK,TRUE}, - {"",S_FALSE,TRUE}, - {"",S_FALSE,TRUE}, - {"",S_FALSE,TRUE}, + {"zip://[0001:0:000:0004:0005:0006:001.002.003.000]/",S_OK,FALSE}, + {"[0001:0:000:0004:0005:0006:001.002.003.000]",S_OK,FALSE}, + {"zip://[0001:0:000:0004:0005:0006:001.002.003.000]/",S_OK,FALSE}, + {"",S_FALSE,FALSE}, + {"",S_FALSE,FALSE}, + {"",S_FALSE,FALSE}, {"0001:0:000:0004:0005:0006:001.002.003.000",S_OK,FALSE}, {"",S_FALSE,FALSE}, - {"/",S_OK,TRUE}, - {"/",S_OK,TRUE}, - {"",S_FALSE,TRUE}, + {"/",S_OK,FALSE}, + {"/",S_OK,FALSE}, + {"",S_FALSE,FALSE}, {"zip://[0001:0:000:0004:0005:0006:001.002.003.000]",S_OK,FALSE}, {"zip",S_OK,FALSE}, {"",S_FALSE,FALSE}, {"",S_FALSE,FALSE}, }, { - {Uri_HOST_IPV6,S_OK,TRUE}, + {Uri_HOST_IPV6,S_OK,FALSE}, {0,S_FALSE,FALSE}, {URL_SCHEME_UNKNOWN,S_OK,FALSE}, {URLZONE_INVALID,E_NOTIMPL,FALSE} @@ -1698,26 +1693,26 @@ Uri_HAS_ABSOLUTE_URI|Uri_HAS_AUTHORITY|Uri_HAS_DISPLAY_URI|Uri_HAS_HOST| Uri_HAS_PATH|Uri_HAS_PATH_AND_QUERY|Uri_HAS_RAW_URI|Uri_HAS_SCHEME_NAME| Uri_HAS_HOST_TYPE|Uri_HAS_PORT|Uri_HAS_SCHEME, - TRUE, + FALSE, { - {"http://[ffff::c0de:6f20]/",S_OK,TRUE}, - {"[ffff::c0de:6f20]",S_OK,TRUE}, - {"http://[ffff::c0de:6f20]/",S_OK,TRUE}, - {"",S_FALSE,TRUE}, - {"",S_FALSE,TRUE}, - {"",S_FALSE,TRUE}, + {"http://[ffff::c0de:6f20]/",S_OK,FALSE}, + {"[ffff::c0de:6f20]",S_OK,FALSE}, + {"http://[ffff::c0de:6f20]/",S_OK,FALSE}, + {"",S_FALSE,FALSE}, + {"",S_FALSE,FALSE}, + {"",S_FALSE,FALSE}, {"ffff::c0de:6f20",S_OK,FALSE}, {"",S_FALSE,FALSE}, - {"/",S_OK,TRUE}, - {"/",S_OK,TRUE}, - {"",S_FALSE,TRUE}, + {"/",S_OK,FALSE}, + {"/",S_OK,FALSE}, + {"",S_FALSE,FALSE}, {"http://[ffff::192.222.111.32]",S_OK,FALSE}, {"http",S_OK,FALSE}, {"",S_FALSE,FALSE}, {"",S_FALSE,FALSE}, }, { - {Uri_HOST_IPV6,S_OK,TRUE}, + {Uri_HOST_IPV6,S_OK,FALSE}, {80,S_OK,FALSE}, {URL_SCHEME_HTTP,S_OK,FALSE}, {URLZONE_INVALID,E_NOTIMPL,FALSE} @@ -1728,26 +1723,26 @@ Uri_HAS_ABSOLUTE_URI|Uri_HAS_AUTHORITY|Uri_HAS_DISPLAY_URI|Uri_HAS_DOMAIN| Uri_HAS_HOST|Uri_HAS_PATH|Uri_HAS_PATH_AND_QUERY|Uri_HAS_RAW_URI|Uri_HAS_SCHEME_NAME| Uri_HAS_HOST_TYPE|Uri_HAS_PORT|Uri_HAS_SCHEME, - TRUE, + FALSE, { - {"http://google.com:65535/",S_OK,TRUE}, - {"google.com:65535",S_OK,TRUE}, - {"http://google.com:65535/",S_OK,TRUE}, - {"google.com",S_OK,TRUE}, - {"",S_FALSE,TRUE}, - {"",S_FALSE,TRUE}, + {"http://google.com:65535/",S_OK,FALSE}, + {"google.com:65535",S_OK,FALSE}, + {"http://google.com:65535/",S_OK,FALSE}, + {"google.com",S_OK,FALSE}, + {"",S_FALSE,FALSE}, + {"",S_FALSE,FALSE}, {"google.com",S_OK,FALSE}, {"",S_FALSE,FALSE}, - {"/",S_OK,TRUE}, - {"/",S_OK,TRUE}, - {"",S_FALSE,TRUE}, + {"/",S_OK,FALSE}, + {"/",S_OK,FALSE}, + {"",S_FALSE,FALSE}, {"http://google.com:65535",S_OK,FALSE}, {"http",S_OK,FALSE}, {"",S_FALSE,FALSE}, {"",S_FALSE,FALSE} }, { - {Uri_HOST_DNS,S_OK,TRUE}, + {Uri_HOST_DNS,S_OK,FALSE}, {65535,S_OK,FALSE}, {URL_SCHEME_HTTP,S_OK,FALSE}, {URLZONE_INVALID,E_NOTIMPL,FALSE} @@ -1757,26 +1752,26 @@ Uri_HAS_ABSOLUTE_URI|Uri_HAS_AUTHORITY|Uri_HAS_DISPLAY_URI|Uri_HAS_DOMAIN| Uri_HAS_HOST|Uri_HAS_PATH|Uri_HAS_PATH_AND_QUERY|Uri_HAS_RAW_URI|Uri_HAS_SCHEME_NAME| Uri_HAS_HOST_TYPE|Uri_HAS_SCHEME, - TRUE, + FALSE, { - {"zip://google.com:65536/",S_OK,TRUE}, - {"google.com:65536",S_OK,TRUE}, - {"zip://google.com:65536/",S_OK,TRUE}, - {"google.com:65536",S_OK,TRUE}, - {"",S_FALSE,TRUE}, - {"",S_FALSE,TRUE}, + {"zip://google.com:65536/",S_OK,FALSE}, + {"google.com:65536",S_OK,FALSE}, + {"zip://google.com:65536/",S_OK,FALSE}, + {"google.com:65536",S_OK,FALSE}, + {"",S_FALSE,FALSE}, + {"",S_FALSE,FALSE}, {"google.com:65536",S_OK,FALSE}, {"",S_FALSE,FALSE}, - {"/",S_OK,TRUE}, - {"/",S_OK,TRUE}, - {"",S_FALSE,TRUE}, + {"/",S_OK,FALSE}, + {"/",S_OK,FALSE}, + {"",S_FALSE,FALSE}, {"zip://google.com:65536",S_OK,FALSE}, {"zip",S_OK,FALSE}, {"",S_FALSE,FALSE}, {"",S_FALSE,FALSE} }, { - {Uri_HOST_DNS,S_OK,TRUE}, + {Uri_HOST_DNS,S_OK,FALSE}, {0,S_FALSE,FALSE}, {URL_SCHEME_UNKNOWN,S_OK,FALSE}, {URLZONE_INVALID,E_NOTIMPL,FALSE} @@ -1786,26 +1781,26 @@ Uri_HAS_ABSOLUTE_URI|Uri_HAS_AUTHORITY|Uri_HAS_DISPLAY_URI|Uri_HAS_DOMAIN| Uri_HAS_HOST|Uri_HAS_PATH|Uri_HAS_PATH_AND_QUERY|Uri_HAS_RAW_URI|Uri_HAS_SCHEME_NAME| Uri_HAS_HOST_TYPE|Uri_HAS_SCHEME, - TRUE, + FALSE, { - {"zip://google.com:65536:25/",S_OK,TRUE}, - {"google.com:65536:25",S_OK,TRUE}, - {"zip://google.com:65536:25/",S_OK,TRUE}, - {"google.com:65536:25",S_OK,TRUE}, - {"",S_FALSE,TRUE}, - {"",S_FALSE,TRUE}, + {"zip://google.com:65536:25/",S_OK,FALSE}, + {"google.com:65536:25",S_OK,FALSE}, + {"zip://google.com:65536:25/",S_OK,FALSE}, {"google.com:65536:25",S_OK,FALSE}, {"",S_FALSE,FALSE}, - {"/",S_OK,TRUE}, - {"/",S_OK,TRUE}, - {"",S_FALSE,TRUE}, + {"",S_FALSE,FALSE}, + {"google.com:65536:25",S_OK,FALSE}, + {"",S_FALSE,FALSE}, + {"/",S_OK,FALSE}, + {"/",S_OK,FALSE}, + {"",S_FALSE,FALSE}, {"zip://google.com:65536:25",S_OK,FALSE}, {"zip",S_OK,FALSE}, {"",S_FALSE,FALSE}, {"",S_FALSE,FALSE} }, { - {Uri_HOST_DNS,S_OK,TRUE}, + {Uri_HOST_DNS,S_OK,FALSE}, {0,S_FALSE,FALSE}, {URL_SCHEME_UNKNOWN,S_OK,FALSE}, {URLZONE_INVALID,E_NOTIMPL,FALSE} @@ -1815,26 +1810,26 @@ Uri_HAS_ABSOLUTE_URI|Uri_HAS_AUTHORITY|Uri_HAS_DISPLAY_URI| Uri_HAS_HOST|Uri_HAS_PATH|Uri_HAS_PATH_AND_QUERY|Uri_HAS_RAW_URI|Uri_HAS_SCHEME_NAME| Uri_HAS_HOST_TYPE|Uri_HAS_SCHEME, - TRUE, + FALSE, { - {"zip://[::ffff]:abcd/",S_OK,TRUE}, - {"[::ffff]:abcd",S_OK,TRUE}, - {"zip://[::ffff]:abcd/",S_OK,TRUE}, - {"",S_FALSE,TRUE}, - {"",S_FALSE,TRUE}, - {"",S_FALSE,TRUE}, + {"zip://[::ffff]:abcd/",S_OK,FALSE}, + {"[::ffff]:abcd",S_OK,FALSE}, + {"zip://[::ffff]:abcd/",S_OK,FALSE}, + {"",S_FALSE,FALSE}, + {"",S_FALSE,FALSE}, + {"",S_FALSE,FALSE}, {"[::ffff]:abcd",S_OK,FALSE}, {"",S_FALSE,FALSE}, - {"/",S_OK,TRUE}, - {"/",S_OK,TRUE}, - {"",S_FALSE,TRUE}, + {"/",S_OK,FALSE}, + {"/",S_OK,FALSE}, + {"",S_FALSE,FALSE}, {"zip://[::ffff]:abcd",S_OK,FALSE}, {"zip",S_OK,FALSE}, {"",S_FALSE,FALSE}, {"",S_FALSE,FALSE} }, { - {Uri_HOST_DNS,S_OK,TRUE}, + {Uri_HOST_DNS,S_OK,FALSE}, {0,S_FALSE,FALSE}, {URL_SCHEME_UNKNOWN,S_OK,FALSE}, {URLZONE_INVALID,E_NOTIMPL,FALSE} @@ -1844,26 +1839,26 @@ Uri_HAS_ABSOLUTE_URI|Uri_HAS_AUTHORITY|Uri_HAS_DISPLAY_URI|Uri_HAS_DOMAIN| Uri_HAS_HOST|Uri_HAS_PATH|Uri_HAS_PATH_AND_QUERY|Uri_HAS_RAW_URI|Uri_HAS_SCHEME_NAME| Uri_HAS_HOST_TYPE|Uri_HAS_SCHEME, - TRUE, + FALSE, { - {"zip://127.0.0.1:abcd/",S_OK,TRUE}, - {"127.0.0.1:abcd",S_OK,TRUE}, - {"zip://127.0.0.1:abcd/",S_OK,TRUE}, - {"0.1:abcd",S_OK,TRUE}, - {"",S_FALSE,TRUE}, - {"",S_FALSE,TRUE}, + {"zip://127.0.0.1:abcd/",S_OK,FALSE}, + {"127.0.0.1:abcd",S_OK,FALSE}, + {"zip://127.0.0.1:abcd/",S_OK,FALSE}, + {"0.1:abcd",S_OK,FALSE}, + {"",S_FALSE,FALSE}, + {"",S_FALSE,FALSE}, {"127.0.0.1:abcd",S_OK,FALSE}, {"",S_FALSE,FALSE}, - {"/",S_OK,TRUE}, - {"/",S_OK,TRUE}, - {"",S_FALSE,TRUE}, + {"/",S_OK,FALSE}, + {"/",S_OK,FALSE}, + {"",S_FALSE,FALSE}, {"zip://127.0.0.1:abcd",S_OK,FALSE}, {"zip",S_OK,FALSE}, {"",S_FALSE,FALSE}, {"",S_FALSE,FALSE} }, { - {Uri_HOST_DNS,S_OK,TRUE}, + {Uri_HOST_DNS,S_OK,FALSE}, {0,S_FALSE,FALSE}, {URL_SCHEME_UNKNOWN,S_OK,FALSE}, {URLZONE_INVALID,E_NOTIMPL,FALSE} @@ -1873,26 +1868,26 @@ { "http://google.com:00035", Uri_CREATE_NO_CANONICALIZE, S_OK, FALSE, Uri_HAS_ABSOLUTE_URI|Uri_HAS_AUTHORITY|Uri_HAS_DISPLAY_URI|Uri_HAS_DOMAIN| Uri_HAS_HOST|Uri_HAS_RAW_URI|Uri_HAS_SCHEME_NAME|Uri_HAS_HOST_TYPE|Uri_HAS_PORT|Uri_HAS_SCHEME, - TRUE, + FALSE, { - {"http://google.com:00035",S_OK,TRUE}, - {"google.com:00035",S_OK,TRUE}, - {"http://google.com:00035",S_OK,TRUE,"http://google.com:35"}, - {"google.com",S_OK,TRUE}, - {"",S_FALSE,TRUE}, - {"",S_FALSE,TRUE}, + {"http://google.com:00035",S_OK,FALSE}, + {"google.com:00035",S_OK,FALSE}, + {"http://google.com:00035",S_OK,FALSE,"http://google.com:35"}, + {"google.com",S_OK,FALSE}, + {"",S_FALSE,FALSE}, + {"",S_FALSE,FALSE}, {"google.com",S_OK,FALSE}, {"",S_FALSE,FALSE}, - {"",S_FALSE,TRUE}, - {"",S_FALSE,TRUE}, - {"",S_FALSE,TRUE}, + {"",S_FALSE,FALSE}, + {"",S_FALSE,FALSE}, + {"",S_FALSE,FALSE}, {"http://google.com:00035",S_OK,FALSE}, {"http",S_OK,FALSE}, {"",S_FALSE,FALSE}, {"",S_FALSE,FALSE} }, { - {Uri_HOST_DNS,S_OK,TRUE}, + {Uri_HOST_DNS,S_OK,FALSE}, {35,S_OK,FALSE}, {URL_SCHEME_HTTP,S_OK,FALSE}, {URLZONE_INVALID,E_NOTIMPL,FALSE} @@ -1902,117 +1897,1911 @@ { "http://google.com:80", Uri_CREATE_NO_CANONICALIZE, S_OK, FALSE, Uri_HAS_ABSOLUTE_URI|Uri_HAS_AUTHORITY|Uri_HAS_DISPLAY_URI|Uri_HAS_DOMAIN| Uri_HAS_HOST|Uri_HAS_RAW_URI|Uri_HAS_SCHEME_NAME|Uri_HAS_HOST_TYPE|Uri_HAS_PORT|Uri_HAS_SCHEME, - TRUE, + FALSE, { - {"http://google.com:80",S_OK,TRUE}, - {"google.com:80",S_OK,TRUE}, - {"http://google.com:80",S_OK,TRUE}, - {"google.com",S_OK,TRUE}, - {"",S_FALSE,TRUE}, - {"",S_FALSE,TRUE}, + {"http://google.com:80",S_OK,FALSE}, + {"google.com:80",S_OK,FALSE}, + {"http://google.com:80",S_OK,FALSE}, + {"google.com",S_OK,FALSE}, + {"",S_FALSE,FALSE}, + {"",S_FALSE,FALSE}, {"google.com",S_OK,FALSE}, {"",S_FALSE,FALSE}, - {"",S_FALSE,TRUE}, - {"",S_FALSE,TRUE}, - {"",S_FALSE,TRUE}, + {"",S_FALSE,FALSE}, + {"",S_FALSE,FALSE}, + {"",S_FALSE,FALSE}, {"http://google.com:80",S_OK,FALSE}, {"http",S_OK,FALSE}, {"",S_FALSE,FALSE}, {"",S_FALSE,FALSE} }, { - {Uri_HOST_DNS,S_OK,TRUE}, + {Uri_HOST_DNS,S_OK,FALSE}, {80,S_OK,FALSE}, {URL_SCHEME_HTTP,S_OK,FALSE}, {URLZONE_INVALID,E_NOTIMPL,FALSE} } - } -}; - -typedef struct _invalid_uri { - const char* uri; - DWORD flags; - BOOL todo; -} invalid_uri; - -static const invalid_uri invalid_uri_tests[] = { - /* Has to have a scheme name. */ - {"://www.winehq.org",0,FALSE}, - /* Window's doesn't like URI's which are implicitly file paths without the - * ALLOW_IMPLICIT_FILE_SCHEME flag set. - */ - {"C:/test/test.mp3",0,FALSE}, - {"\\\\Server/test/test.mp3",0,FALSE}, - {"C:/test/test.mp3",Uri_CREATE_ALLOW_IMPLICIT_WILDCARD_SCHEME,FALSE}, - {"\\\\Server/test/test.mp3",Uri_CREATE_ALLOW_RELATIVE,FALSE}, - /* Invalid schemes. */ - {"*abcd://not.valid.com",0,FALSE}, - {"*a*b*c*d://not.valid.com",0,FALSE}, - /* Not allowed to have invalid % encoded data. */ - {"ftp://google.co%XX/",0,FALSE}, - /* To many h16 components. */ - {"http://[1:2:3:4:5:6:7:8:9]",0,FALSE}, - /* Not enough room for IPv4 address. */ - {"http://[1:2:3:4:5:6:7:192.0.1.0]",0,FALSE}, - /* Not enough h16 components. */ - {"http://[1:2:3:4]",0,FALSE}, - /* Not enough components including IPv4. */ - {"http://[1:192.0.1.0]",0,FALSE}, - /* Not allowed to have partial IPv4 in IPv6. */ - {"http://[::192.0]",0,FALSE}, - /* Can't have elision of 1 h16 at beginning of address. */ - {"http://[::2:3:4:5:6:7:8]",0,FALSE}, - /* Can't have elision of 1 h16 at end of address. */ - {"http://[1:2:3:4:5:6:7::]",0,FALSE}, - /* Expects a valid IP Literal. */ - {"ftp://[not.valid.uri]/",0,FALSE}, - /* Expects valid port for a known scheme type. */ - {"ftp://www.winehq.org:123fgh",0,FALSE}, - /* Port exceeds USHORT_MAX for known scheme type. */ - {"ftp://www.winehq.org:65536",0,FALSE}, - /* Invalid port with IPv4 address. */ - {"http://www.winehq.org:1abcd",0,FALSE}, - /* Invalid port with IPv6 address. */ - {"http://[::ffff]:32xy",0,FALSE} -}; - -typedef struct _uri_equality { - const char* a; - DWORD create_flags_a; - BOOL create_todo_a; - const char* b; - DWORD create_flags_b; - BOOL create_todo_b; - BOOL equal; - BOOL todo; -} uri_equality; - -static const uri_equality equality_tests[] = { - { - "HTTP://www.winehq.org/test dir/./",0,FALSE, - "http://www.winehq.org/test dir/../test dir/",0,FALSE, - TRUE, TRUE }, - { - /* http://www.winehq.org/test%20dir */ - "http://%77%77%77%2E%77%69%6E%65%68%71%2E%6F%72%67/%74%65%73%74%20%64%69%72",0,FALSE, - "http://www.winehq.org/test dir",0,FALSE, - TRUE, TRUE, + { "http://google.com.uk", 0, S_OK, FALSE, + Uri_HAS_ABSOLUTE_URI|Uri_HAS_AUTHORITY|Uri_HAS_DISPLAY_URI|Uri_HAS_DOMAIN| + Uri_HAS_HOST|Uri_HAS_PATH|Uri_HAS_PATH_AND_QUERY|Uri_HAS_RAW_URI|Uri_HAS_SCHEME_NAME| + Uri_HAS_HOST_TYPE|Uri_HAS_PORT|Uri_HAS_SCHEME, + FALSE, + { + {"http://google.com.uk/",S_OK,FALSE}, + {"google.com.uk",S_OK,FALSE}, + {"http://google.com.uk/",S_OK,FALSE}, + {"google.com.uk",S_OK,FALSE}, + {"",S_FALSE,FALSE}, + {"",S_FALSE,FALSE}, + {"google.com.uk",S_OK,FALSE}, + {"",S_FALSE,FALSE}, + {"/",S_OK,FALSE}, + {"/",S_OK,FALSE}, + {"",S_FALSE,FALSE}, + {"http://google.com.uk",S_OK,FALSE}, + {"http",S_OK,FALSE}, + {"",S_FALSE,FALSE}, + {"",S_FALSE,FALSE} + }, + { + {Uri_HOST_DNS,S_OK,FALSE}, + {80,S_OK,FALSE}, + {URL_SCHEME_HTTP,S_OK,FALSE}, + {URLZONE_INVALID,E_NOTIMPL,FALSE} + } }, - { - "c:\\test.mp3",Uri_CREATE_ALLOW_IMPLICIT_FILE_SCHEME,FALSE, - "file:///c:/test.mp3",0,FALSE, - TRUE,TRUE + { "http://google.com.com", 0, S_OK, FALSE, + Uri_HAS_ABSOLUTE_URI|Uri_HAS_AUTHORITY|Uri_HAS_DISPLAY_URI|Uri_HAS_DOMAIN| + Uri_HAS_HOST|Uri_HAS_PATH|Uri_HAS_PATH_AND_QUERY|Uri_HAS_RAW_URI|Uri_HAS_SCHEME_NAME| + Uri_HAS_HOST_TYPE|Uri_HAS_PORT|Uri_HAS_SCHEME, + FALSE, + { + {"http://google.com.com/",S_OK,FALSE}, + {"google.com.com",S_OK,FALSE}, + {"http://google.com.com/",S_OK,FALSE}, + {"com.com",S_OK,FALSE}, + {"",S_FALSE,FALSE}, + {"",S_FALSE,FALSE}, + {"google.com.com",S_OK,FALSE}, + {"",S_FALSE,FALSE}, + {"/",S_OK,FALSE}, + {"/",S_OK,FALSE}, + {"",S_FALSE,FALSE}, + {"http://google.com.com",S_OK,FALSE}, + {"http",S_OK,FALSE}, + {"",S_FALSE,FALSE}, + {"",S_FALSE,FALSE} + }, + { + {Uri_HOST_DNS,S_OK,FALSE}, + {80,S_OK,FALSE}, + {URL_SCHEME_HTTP,S_OK,FALSE}, + {URLZONE_INVALID,E_NOTIMPL,FALSE} + } }, - { - "ftp://ftp.winehq.org/",0,FALSE, - "ftp://ftp.winehq.org",0,FALSE, - TRUE, TRUE + { "http://google.uk.1", 0, S_OK, FALSE, + Uri_HAS_ABSOLUTE_URI|Uri_HAS_AUTHORITY|Uri_HAS_DISPLAY_URI|Uri_HAS_DOMAIN| + Uri_HAS_HOST|Uri_HAS_PATH|Uri_HAS_PATH_AND_QUERY|Uri_HAS_RAW_URI|Uri_HAS_SCHEME_NAME| + Uri_HAS_HOST_TYPE|Uri_HAS_PORT|Uri_HAS_SCHEME, + FALSE, + { + {"http://google.uk.1/",S_OK,FALSE}, + {"google.uk.1",S_OK,FALSE}, + {"http://google.uk.1/",S_OK,FALSE}, + {"google.uk.1",S_OK,FALSE}, + {"",S_FALSE,FALSE}, + {"",S_FALSE,FALSE}, + {"google.uk.1",S_OK,FALSE}, + {"",S_FALSE,FALSE}, + {"/",S_OK,FALSE}, + {"/",S_OK,FALSE}, + {"",S_FALSE,FALSE}, + {"http://google.uk.1",S_OK,FALSE}, + {"http",S_OK,FALSE}, + {"",S_FALSE,FALSE}, + {"",S_FALSE,FALSE} + }, + { + {Uri_HOST_DNS,S_OK,FALSE}, + {80,S_OK,FALSE}, + {URL_SCHEME_HTTP,S_OK,FALSE}, + {URLZONE_INVALID,E_NOTIMPL,FALSE} + } }, - { - "ftp://ftp.winehq.org/test/test2/../../testB/",0,FALSE, - "ftp://ftp.winehq.org/t%45stB/",0,FALSE, - FALSE, TRUE + /* Since foo isn't a recognized 3 character TLD its considered the domain name. */ + { "http://google.foo.uk", 0, S_OK, FALSE, + Uri_HAS_ABSOLUTE_URI|Uri_HAS_AUTHORITY|Uri_HAS_DISPLAY_URI|Uri_HAS_DOMAIN| + Uri_HAS_HOST|Uri_HAS_PATH|Uri_HAS_PATH_AND_QUERY|Uri_HAS_RAW_URI|Uri_HAS_SCHEME_NAME| + Uri_HAS_HOST_TYPE|Uri_HAS_PORT|Uri_HAS_SCHEME, + FALSE, + { + {"http://google.foo.uk/",S_OK,FALSE}, + {"google.foo.uk",S_OK,FALSE}, + {"http://google.foo.uk/",S_OK,FALSE}, + {"foo.uk",S_OK,FALSE}, + {"",S_FALSE,FALSE}, + {"",S_FALSE,FALSE}, + {"google.foo.uk",S_OK,FALSE}, + {"",S_FALSE,FALSE}, + {"/",S_OK,FALSE}, + {"/",S_OK,FALSE}, + {"",S_FALSE,FALSE}, + {"http://google.foo.uk",S_OK,FALSE}, + {"http",S_OK,FALSE}, + {"",S_FALSE,FALSE}, + {"",S_FALSE,FALSE} + }, + { + {Uri_HOST_DNS,S_OK,FALSE}, + {80,S_OK,FALSE}, + {URL_SCHEME_HTTP,S_OK,FALSE}, + {URLZONE_INVALID,E_NOTIMPL,FALSE} + } + }, + { "http://.com", 0, S_OK, FALSE, + Uri_HAS_ABSOLUTE_URI|Uri_HAS_AUTHORITY|Uri_HAS_DISPLAY_URI|Uri_HAS_DOMAIN| + Uri_HAS_HOST|Uri_HAS_PATH|Uri_HAS_PATH_AND_QUERY|Uri_HAS_RAW_URI|Uri_HAS_SCHEME_NAME| + Uri_HAS_HOST_TYPE|Uri_HAS_PORT|Uri_HAS_SCHEME, + FALSE, + { + {"http://.com/",S_OK,FALSE}, + {".com",S_OK,FALSE}, + {"http://.com/",S_OK,FALSE}, + {".com",S_OK,FALSE}, + {"",S_FALSE,FALSE}, + {"",S_FALSE,FALSE}, + {".com",S_OK,FALSE}, + {"",S_FALSE,FALSE}, + {"/",S_OK,FALSE}, + {"/",S_OK,FALSE}, + {"",S_FALSE,FALSE}, + {"http://.com",S_OK,FALSE}, + {"http",S_OK,FALSE}, + {"",S_FALSE,FALSE}, + {"",S_FALSE,FALSE} + }, + { + {Uri_HOST_DNS,S_OK,FALSE}, + {80,S_OK,FALSE}, + {URL_SCHEME_HTTP,S_OK,FALSE}, + {URLZONE_INVALID,E_NOTIMPL,FALSE} + } + }, + { "http://.uk", 0, S_OK, FALSE, + Uri_HAS_ABSOLUTE_URI|Uri_HAS_AUTHORITY|Uri_HAS_DISPLAY_URI|Uri_HAS_HOST| + Uri_HAS_PATH|Uri_HAS_PATH_AND_QUERY|Uri_HAS_RAW_URI|Uri_HAS_SCHEME_NAME| + Uri_HAS_HOST_TYPE|Uri_HAS_PORT|Uri_HAS_SCHEME, + FALSE, + { + {"http://.uk/",S_OK,FALSE}, + {".uk",S_OK,FALSE}, + {"http://.uk/",S_OK,FALSE}, + {"",S_FALSE,FALSE}, + {"",S_FALSE,FALSE}, + {"",S_FALSE,FALSE}, + {".uk",S_OK,FALSE}, + {"",S_FALSE,FALSE}, + {"/",S_OK,FALSE}, + {"/",S_OK,FALSE}, + {"",S_FALSE,FALSE}, + {"http://.uk",S_OK,FALSE}, + {"http",S_OK,FALSE}, + {"",S_FALSE,FALSE}, + {"",S_FALSE,FALSE} + }, + { + {Uri_HOST_DNS,S_OK,FALSE}, + {80,S_OK,FALSE}, + {URL_SCHEME_HTTP,S_OK,FALSE}, + {URLZONE_INVALID,E_NOTIMPL,FALSE} + } + }, + { "http://www.co.google.com.[]", 0, S_OK, FALSE, + Uri_HAS_ABSOLUTE_URI|Uri_HAS_AUTHORITY|Uri_HAS_DISPLAY_URI|Uri_HAS_DOMAIN| + Uri_HAS_HOST|Uri_HAS_PATH|Uri_HAS_PATH_AND_QUERY|Uri_HAS_RAW_URI|Uri_HAS_SCHEME_NAME| + Uri_HAS_HOST_TYPE|Uri_HAS_PORT|Uri_HAS_SCHEME, + FALSE, + { + {"http://www.co.google.com.[]/",S_OK,FALSE}, + {"www.co.google.com.[]",S_OK,FALSE}, + {"http://www.co.google.com.[]/",S_OK,FALSE}, + {"google.com.[]",S_OK,FALSE}, + {"",S_FALSE,FALSE}, + {"",S_FALSE,FALSE}, + {"www.co.google.com.[]",S_OK,FALSE}, + {"",S_FALSE,FALSE}, + {"/",S_OK,FALSE}, + {"/",S_OK,FALSE}, + {"",S_FALSE,FALSE}, + {"http://www.co.google.com.[]",S_OK,FALSE}, + {"http",S_OK,FALSE}, + {"",S_FALSE,FALSE}, + {"",S_FALSE,FALSE} + }, + { + {Uri_HOST_DNS,S_OK,FALSE}, + {80,S_OK,FALSE}, + {URL_SCHEME_HTTP,S_OK,FALSE}, + {URLZONE_INVALID,E_NOTIMPL,FALSE} + } + }, + { "http://co.uk", 0, S_OK, FALSE, + Uri_HAS_ABSOLUTE_URI|Uri_HAS_AUTHORITY|Uri_HAS_DISPLAY_URI|Uri_HAS_HOST| + Uri_HAS_PATH|Uri_HAS_PATH_AND_QUERY|Uri_HAS_RAW_URI|Uri_HAS_SCHEME_NAME| + Uri_HAS_HOST_TYPE|Uri_HAS_PORT|Uri_HAS_SCHEME, + FALSE, + { + {"http://co.uk/",S_OK,FALSE}, + {"co.uk",S_OK,FALSE}, + {"http://co.uk/",S_OK,FALSE}, + {"",S_FALSE,FALSE}, + {"",S_FALSE,FALSE}, + {"",S_FALSE,FALSE}, + {"co.uk",S_OK,FALSE}, + {"",S_FALSE,FALSE}, + {"/",S_OK,FALSE}, + {"/",S_OK,FALSE}, + {"",S_FALSE,FALSE}, + {"http://co.uk",S_OK,FALSE}, + {"http",S_OK,FALSE}, + {"",S_FALSE,FALSE}, + {"",S_FALSE,FALSE} + }, + { + {Uri_HOST_DNS,S_OK,FALSE}, + {80,S_OK,FALSE}, + {URL_SCHEME_HTTP,S_OK,FALSE}, + {URLZONE_INVALID,E_NOTIMPL,FALSE} + } + }, + { "http://www.co.google.us.test", 0, S_OK, FALSE, + Uri_HAS_ABSOLUTE_URI|Uri_HAS_AUTHORITY|Uri_HAS_DISPLAY_URI|Uri_HAS_DOMAIN| + Uri_HAS_HOST|Uri_HAS_PATH|Uri_HAS_PATH_AND_QUERY|Uri_HAS_RAW_URI|Uri_HAS_SCHEME_NAME| + Uri_HAS_HOST_TYPE|Uri_HAS_PORT|Uri_HAS_SCHEME, + FALSE, + { + {"http://www.co.google.us.test/",S_OK,FALSE}, + {"www.co.google.us.test",S_OK,FALSE}, + {"http://www.co.google.us.test/",S_OK,FALSE}, + {"us.test",S_OK,FALSE}, + {"",S_FALSE,FALSE}, + {"",S_FALSE,FALSE}, + {"www.co.google.us.test",S_OK,FALSE}, + {"",S_FALSE,FALSE}, + {"/",S_OK,FALSE}, + {"/",S_OK,FALSE}, + {"",S_FALSE,FALSE}, + {"http://www.co.google.us.test",S_OK,FALSE}, + {"http",S_OK,FALSE}, + {"",S_FALSE,FALSE}, + {"",S_FALSE,FALSE} + }, + { + {Uri_HOST_DNS,S_OK,FALSE}, + {80,S_OK,FALSE}, + {URL_SCHEME_HTTP,S_OK,FALSE}, + {URLZONE_INVALID,E_NOTIMPL,FALSE} + } + }, + { "http://gov.uk", 0, S_OK, FALSE, + Uri_HAS_ABSOLUTE_URI|Uri_HAS_AUTHORITY|Uri_HAS_DISPLAY_URI|Uri_HAS_HOST| + Uri_HAS_PATH|Uri_HAS_PATH_AND_QUERY|Uri_HAS_RAW_URI|Uri_HAS_SCHEME_NAME| + Uri_HAS_HOST_TYPE|Uri_HAS_PORT|Uri_HAS_SCHEME, + FALSE, + { + {"http://gov.uk/",S_OK,FALSE}, + {"gov.uk",S_OK,FALSE}, + {"http://gov.uk/",S_OK,FALSE}, + {"",S_FALSE,FALSE}, + {"",S_FALSE,FALSE}, + {"",S_FALSE,FALSE}, + {"gov.uk",S_OK,FALSE}, + {"",S_FALSE,FALSE}, + {"/",S_OK,FALSE}, + {"/",S_OK,FALSE}, + {"",S_FALSE,FALSE}, + {"http://gov.uk",S_OK,FALSE}, + {"http",S_OK,FALSE}, + {"",S_FALSE,FALSE}, + {"",S_FALSE,FALSE} + }, + { + {Uri_HOST_DNS,S_OK,FALSE}, + {80,S_OK,FALSE}, + {URL_SCHEME_HTTP,S_OK,FALSE}, + {URLZONE_INVALID,E_NOTIMPL,FALSE} + } + }, + { "zip://www.google.com\\test", Uri_CREATE_NO_CANONICALIZE, S_OK, FALSE, + Uri_HAS_ABSOLUTE_URI|Uri_HAS_AUTHORITY|Uri_HAS_DISPLAY_URI|Uri_HAS_DOMAIN| + Uri_HAS_HOST|Uri_HAS_RAW_URI|Uri_HAS_SCHEME_NAME|Uri_HAS_HOST_TYPE|Uri_HAS_SCHEME, + FALSE, + { + {"zip://www.google.com\\test",S_OK,FALSE}, + {"www.google.com\\test",S_OK,FALSE}, + {"zip://www.google.com\\test",S_OK,FALSE}, + {"google.com\\test",S_OK,FALSE}, + {"",S_FALSE,FALSE}, + {"",S_FALSE,FALSE}, + {"www.google.com\\test",S_OK,FALSE}, + {"",S_FALSE,FALSE}, + {"",S_FALSE,FALSE}, + {"",S_FALSE,FALSE}, + {"",S_FALSE,FALSE}, + {"zip://www.google.com\\test",S_OK,FALSE}, + {"zip",S_OK,FALSE}, + {"",S_FALSE,FALSE}, + {"",S_FALSE,FALSE} + }, + { + {Uri_HOST_DNS,S_OK,FALSE}, + {0,S_FALSE,FALSE}, + {URL_SCHEME_UNKNOWN,S_OK,FALSE}, + {URLZONE_INVALID,E_NOTIMPL,FALSE} + } + }, + { "urn:excepts:bad:%XY:encoded", 0, S_OK, FALSE, + Uri_HAS_ABSOLUTE_URI|Uri_HAS_DISPLAY_URI|Uri_HAS_PATH|Uri_HAS_PATH_AND_QUERY| + Uri_HAS_RAW_URI|Uri_HAS_SCHEME_NAME|Uri_HAS_HOST_TYPE|Uri_HAS_SCHEME, + FALSE, + { + {"urn:excepts:bad:%XY:encoded",S_OK,FALSE}, + {"",S_FALSE,FALSE}, + {"urn:excepts:bad:%XY:encoded",S_OK,FALSE}, + {"",S_FALSE,FALSE}, + {"",S_FALSE,FALSE}, + {"",S_FALSE,FALSE}, + {"",S_FALSE,FALSE}, + {"",S_FALSE,FALSE}, + {"excepts:bad:%XY:encoded",S_OK,FALSE}, + {"excepts:bad:%XY:encoded",S_OK,FALSE}, + {"",S_FALSE,FALSE}, + {"urn:excepts:bad:%XY:encoded",S_OK,FALSE}, + {"urn",S_OK,FALSE}, + {"",S_FALSE,FALSE}, + {"",S_FALSE,FALSE} + }, + { + {Uri_HOST_UNKNOWN,S_OK,FALSE}, + {0,S_FALSE,FALSE}, + {URL_SCHEME_UNKNOWN,S_OK,FALSE}, + {URLZONE_INVALID,E_NOTIMPL,FALSE} + } + }, + /* Since the original URI doesn't contain an extra '/' before the path no % encoded values + * are decoded and all '%' are encoded. + */ + { "file://C:/te%3Es%2Et/tes%t.mp3", 0, S_OK, FALSE, + Uri_HAS_ABSOLUTE_URI|Uri_HAS_DISPLAY_URI|Uri_HAS_EXTENSION|Uri_HAS_PATH| + Uri_HAS_PATH_AND_QUERY|Uri_HAS_RAW_URI|Uri_HAS_SCHEME_NAME|Uri_HAS_HOST_TYPE|Uri_HAS_SCHEME, + FALSE, + { + {"file:///C:/te%253Es%252Et/tes%25t.mp3",S_OK,FALSE}, + {"",S_FALSE,FALSE}, + {"file:///C:/te%253Es%252Et/tes%25t.mp3",S_OK,FALSE}, + {"",S_FALSE,FALSE}, + {".mp3",S_OK,FALSE}, + {"",S_FALSE,FALSE}, + {"",S_FALSE,FALSE}, + {"",S_FALSE,FALSE}, + {"/C:/te%253Es%252Et/tes%25t.mp3",S_OK,FALSE}, + {"/C:/te%253Es%252Et/tes%25t.mp3",S_OK,FALSE}, + {"",S_FALSE,FALSE}, + {"file://C:/te%3Es%2Et/tes%t.mp3",S_OK,FALSE}, + {"file",S_OK,FALSE}, + {"",S_FALSE,FALSE}, + {"",S_FALSE,FALSE} + }, + { + {Uri_HOST_UNKNOWN,S_OK,FALSE}, + {0,S_FALSE,FALSE}, + {URL_SCHEME_FILE,S_OK,FALSE}, + {URLZONE_INVALID,E_NOTIMPL,FALSE} + } + }, + /* Since there's a '/' in front of the drive letter, any percent encoded, non-forbidden character + * is decoded and only %'s in front of invalid hex digits are encoded. + */ + { "file:///C:/te%3Es%2Et/t%23es%t.mp3", 0, S_OK, FALSE, + Uri_HAS_ABSOLUTE_URI|Uri_HAS_DISPLAY_URI|Uri_HAS_EXTENSION|Uri_HAS_PATH| + Uri_HAS_PATH_AND_QUERY|Uri_HAS_RAW_URI|Uri_HAS_SCHEME_NAME|Uri_HAS_HOST_TYPE|Uri_HAS_SCHEME, + FALSE, + { + {"file:///C:/te%3Es.t/t#es%25t.mp3",S_OK,FALSE}, + {"",S_FALSE,FALSE}, + {"file:///C:/te%3Es.t/t#es%25t.mp3",S_OK,FALSE}, + {"",S_FALSE,FALSE}, + {".mp3",S_OK,FALSE}, + {"",S_FALSE,FALSE}, + {"",S_FALSE,FALSE}, + {"",S_FALSE,FALSE}, + {"/C:/te%3Es.t/t#es%25t.mp3",S_OK,FALSE}, + {"/C:/te%3Es.t/t#es%25t.mp3",S_OK,FALSE}, + {"",S_FALSE,FALSE}, + {"file:///C:/te%3Es%2Et/t%23es%t.mp3",S_OK,FALSE}, + {"file",S_OK,FALSE}, + {"",S_FALSE,FALSE}, + {"",S_FALSE,FALSE} + }, + { + {Uri_HOST_UNKNOWN,S_OK,FALSE}, + {0,S_FALSE,FALSE}, + {URL_SCHEME_FILE,S_OK,FALSE}, + {URLZONE_INVALID,E_NOTIMPL,FALSE} + } + }, + /* Only unreserved percent encoded characters are decoded for known schemes that aren't file. */ + { "http://[::001.002.003.000]/%3F%23%2E%54/test", 0, S_OK, FALSE, + Uri_HAS_ABSOLUTE_URI|Uri_HAS_AUTHORITY|Uri_HAS_DISPLAY_URI|Uri_HAS_HOST| + Uri_HAS_PATH|Uri_HAS_PATH_AND_QUERY|Uri_HAS_RAW_URI|Uri_HAS_SCHEME_NAME| + Uri_HAS_HOST_TYPE|Uri_HAS_PORT|Uri_HAS_SCHEME, + FALSE, + { + {"http://[::1.2.3.0]/%3F%23.T/test",S_OK,FALSE}, + {"[::1.2.3.0]",S_OK,FALSE}, + {"http://[::1.2.3.0]/%3F%23.T/test",S_OK,FALSE}, + {"",S_FALSE,FALSE}, + {"",S_FALSE,FALSE}, + {"",S_FALSE,FALSE}, + {"::1.2.3.0",S_OK,FALSE}, + {"",S_FALSE,FALSE}, + {"/%3F%23.T/test",S_OK,FALSE}, + {"/%3F%23.T/test",S_OK,FALSE}, + {"",S_FALSE,FALSE}, + {"http://[::001.002.003.000]/%3F%23%2E%54/test",S_OK,FALSE}, + {"http",S_OK,FALSE}, + {"",S_FALSE,FALSE}, + {"",S_FALSE,FALSE}, + }, + { + {Uri_HOST_IPV6,S_OK,FALSE}, + {80,S_OK,FALSE}, + {URL_SCHEME_HTTP,S_OK,FALSE}, + {URLZONE_INVALID,E_NOTIMPL,FALSE} + } + }, + /* Forbidden characters are always encoded for file URIs. */ + { "file:///C:/\"test\"/test.mp3", Uri_CREATE_NO_ENCODE_FORBIDDEN_CHARACTERS, S_OK, FALSE, + Uri_HAS_ABSOLUTE_URI|Uri_HAS_DISPLAY_URI|Uri_HAS_EXTENSION|Uri_HAS_PATH| + Uri_HAS_PATH_AND_QUERY|Uri_HAS_RAW_URI|Uri_HAS_SCHEME_NAME|Uri_HAS_HOST_TYPE|Uri_HAS_SCHEME, + FALSE, + { + {"file:///C:/%22test%22/test.mp3",S_OK,FALSE}, + {"",S_FALSE,FALSE}, + {"file:///C:/%22test%22/test.mp3",S_OK,FALSE}, + {"",S_FALSE,FALSE}, + {".mp3",S_OK,FALSE}, + {"",S_FALSE,FALSE}, + {"",S_FALSE,FALSE}, + {"",S_FALSE,FALSE}, + {"/C:/%22test%22/test.mp3",S_OK,FALSE}, + {"/C:/%22test%22/test.mp3",S_OK,FALSE}, + {"",S_FALSE,FALSE}, + {"file:///C:/\"test\"/test.mp3",S_OK,FALSE}, + {"file",S_OK,FALSE}, + {"",S_FALSE,FALSE}, + {"",S_FALSE,FALSE} + }, + { + {Uri_HOST_UNKNOWN,S_OK,FALSE}, + {0,S_FALSE,FALSE}, + {URL_SCHEME_FILE,S_OK,FALSE}, + {URLZONE_INVALID,E_NOTIMPL,FALSE} + } + }, + /* Forbidden characters are never encoded for unknown scheme types. */ + { "1234://4294967295/<|>\" test<|>", 0, S_OK, FALSE, + Uri_HAS_ABSOLUTE_URI|Uri_HAS_AUTHORITY|Uri_HAS_DISPLAY_URI|Uri_HAS_HOST| + Uri_HAS_PATH|Uri_HAS_PATH_AND_QUERY|Uri_HAS_RAW_URI|Uri_HAS_SCHEME_NAME| + Uri_HAS_HOST_TYPE|Uri_HAS_SCHEME, + FALSE, + { + {"1234://4294967295/<|>\" test<|>",S_OK,FALSE}, + {"4294967295",S_OK,FALSE}, + {"1234://4294967295/<|>\" test<|>",S_OK,FALSE}, + {"",S_FALSE,FALSE}, + {"",S_FALSE,FALSE}, + {"",S_FALSE,FALSE}, + {"4294967295",S_OK,FALSE}, + {"",S_FALSE,FALSE}, + {"/<|>\" test<|>",S_OK,FALSE}, + {"/<|>\" test<|>",S_OK,FALSE}, + {"",S_FALSE,FALSE}, + {"1234://4294967295/<|>\" test<|>",S_OK,FALSE}, + {"1234",S_OK,FALSE}, + {"",S_FALSE,FALSE}, + {"",S_FALSE,FALSE} + }, + { + {Uri_HOST_IPV4,S_OK,FALSE}, + {0,S_FALSE,FALSE}, + {URL_SCHEME_UNKNOWN,S_OK,FALSE}, + {URLZONE_INVALID,E_NOTIMPL,FALSE} + } + }, + /* Make sure forbidden characters are percent encoded. */ + { "http://gov.uk/<|> test<|>", 0, S_OK, FALSE, + Uri_HAS_ABSOLUTE_URI|Uri_HAS_AUTHORITY|Uri_HAS_DISPLAY_URI|Uri_HAS_HOST| + Uri_HAS_PATH|Uri_HAS_PATH_AND_QUERY|Uri_HAS_RAW_URI|Uri_HAS_SCHEME_NAME| + Uri_HAS_HOST_TYPE|Uri_HAS_PORT|Uri_HAS_SCHEME, + FALSE, + { + {"http://gov.uk/%3C%7C%3E%20test%3C%7C%3E",S_OK,FALSE}, + {"gov.uk",S_OK,FALSE}, + {"http://gov.uk/%3C%7C%3E%20test%3C%7C%3E",S_OK,FALSE}, + {"",S_FALSE,FALSE}, + {"",S_FALSE,FALSE}, + {"",S_FALSE,FALSE}, + {"gov.uk",S_OK,FALSE}, + {"",S_FALSE,FALSE}, + {"/%3C%7C%3E%20test%3C%7C%3E",S_OK,FALSE}, + {"/%3C%7C%3E%20test%3C%7C%3E",S_OK,FALSE}, + {"",S_FALSE,FALSE}, + {"http://gov.uk/<|> test<|>",S_OK,FALSE}, + {"http",S_OK,FALSE}, + {"",S_FALSE,FALSE}, + {"",S_FALSE,FALSE} + }, + { + {Uri_HOST_DNS,S_OK,FALSE}, + {80,S_OK,FALSE}, + {URL_SCHEME_HTTP,S_OK,FALSE}, + {URLZONE_INVALID,E_NOTIMPL,FALSE} + } + }, + { "http://gov.uk/test/../test2/././../test3/.././././", 0, S_OK, FALSE, + Uri_HAS_ABSOLUTE_URI|Uri_HAS_AUTHORITY|Uri_HAS_DISPLAY_URI|Uri_HAS_HOST| + Uri_HAS_PATH|Uri_HAS_PATH_AND_QUERY|Uri_HAS_RAW_URI|Uri_HAS_SCHEME_NAME| + Uri_HAS_HOST_TYPE|Uri_HAS_PORT|Uri_HAS_SCHEME, + FALSE, + { + {"http://gov.uk/",S_OK,FALSE}, + {"gov.uk",S_OK,FALSE}, + {"http://gov.uk/",S_OK,FALSE}, + {"",S_FALSE,FALSE}, + {"",S_FALSE,FALSE}, + {"",S_FALSE,FALSE}, + {"gov.uk",S_OK,FALSE}, + {"",S_FALSE,FALSE}, + {"/",S_OK,FALSE}, + {"/",S_OK,FALSE}, + {"",S_FALSE,FALSE}, + {"http://gov.uk/test/../test2/././../test3/.././././",S_OK,FALSE}, + {"http",S_OK,FALSE}, + {"",S_FALSE,FALSE}, + {"",S_FALSE,FALSE} + }, + { + {Uri_HOST_DNS,S_OK,FALSE}, + {80,S_OK,FALSE}, + {URL_SCHEME_HTTP,S_OK,FALSE}, + {URLZONE_INVALID,E_NOTIMPL,FALSE} + } + }, + { "http://gov.uk/test/test2/../../..", 0, S_OK, FALSE, + Uri_HAS_ABSOLUTE_URI|Uri_HAS_AUTHORITY|Uri_HAS_DISPLAY_URI|Uri_HAS_HOST| + Uri_HAS_PATH|Uri_HAS_PATH_AND_QUERY|Uri_HAS_RAW_URI|Uri_HAS_SCHEME_NAME| + Uri_HAS_HOST_TYPE|Uri_HAS_PORT|Uri_HAS_SCHEME, + FALSE, + { + {"http://gov.uk/",S_OK,FALSE}, + {"gov.uk",S_OK,FALSE}, + {"http://gov.uk/",S_OK,FALSE}, + {"",S_FALSE,FALSE}, + {"",S_FALSE,FALSE}, + {"",S_FALSE,FALSE}, + {"gov.uk",S_OK,FALSE}, + {"",S_FALSE,FALSE}, + {"/",S_OK,FALSE}, + {"/",S_OK,FALSE}, + {"",S_FALSE,FALSE}, + {"http://gov.uk/test/test2/../../..",S_OK,FALSE}, + {"http",S_OK,FALSE}, + {"",S_FALSE,FALSE}, + {"",S_FALSE,FALSE} + }, + { + {Uri_HOST_DNS,S_OK,FALSE}, + {80,S_OK,FALSE}, + {URL_SCHEME_HTTP,S_OK,FALSE}, + {URLZONE_INVALID,E_NOTIMPL,FALSE} + } + }, + { "http://gov.uk/test/test2/../../.", 0, S_OK, FALSE, + Uri_HAS_ABSOLUTE_URI|Uri_HAS_AUTHORITY|Uri_HAS_DISPLAY_URI|Uri_HAS_HOST| + Uri_HAS_PATH|Uri_HAS_PATH_AND_QUERY|Uri_HAS_RAW_URI|Uri_HAS_SCHEME_NAME| + Uri_HAS_HOST_TYPE|Uri_HAS_PORT|Uri_HAS_SCHEME, + FALSE, + { + {"http://gov.uk/",S_OK,FALSE}, + {"gov.uk",S_OK,FALSE}, + {"http://gov.uk/",S_OK,FALSE}, + {"",S_FALSE,FALSE}, + {"",S_FALSE,FALSE}, + {"",S_FALSE,FALSE}, + {"gov.uk",S_OK,FALSE}, + {"",S_FALSE,FALSE}, + {"/",S_OK,FALSE}, + {"/",S_OK,FALSE}, + {"",S_FALSE,FALSE}, + {"http://gov.uk/test/test2/../../.",S_OK,FALSE}, + {"http",S_OK,FALSE}, + {"",S_FALSE,FALSE}, + {"",S_FALSE,FALSE} + }, + { + {Uri_HOST_DNS,S_OK,FALSE}, + {80,S_OK,FALSE}, + {URL_SCHEME_HTTP,S_OK,FALSE}, + {URLZONE_INVALID,E_NOTIMPL,FALSE} + } + }, + { "file://c:\\tests\\../tests\\./.\\..\\foo%20bar.mp3", 0, S_OK, FALSE, + Uri_HAS_ABSOLUTE_URI|Uri_HAS_DISPLAY_URI|Uri_HAS_EXTENSION|Uri_HAS_PATH| + Uri_HAS_PATH_AND_QUERY|Uri_HAS_RAW_URI|Uri_HAS_SCHEME_NAME|Uri_HAS_HOST_TYPE|Uri_HAS_SCHEME, + FALSE, + { + {"file:///c:/foo%2520bar.mp3",S_OK,FALSE}, + {"",S_FALSE,FALSE}, + {"file:///c:/foo%2520bar.mp3",S_OK,FALSE}, + {"",S_FALSE,FALSE}, + {".mp3",S_OK,FALSE}, + {"",S_FALSE,FALSE}, + {"",S_FALSE,FALSE}, + {"",S_FALSE,FALSE}, + {"/c:/foo%2520bar.mp3",S_OK,FALSE}, + {"/c:/foo%2520bar.mp3",S_OK,FALSE}, + {"",S_FALSE,FALSE}, + {"file://c:\\tests\\../tests\\./.\\..\\foo%20bar.mp3",S_OK,FALSE}, + {"file",S_OK,FALSE}, + {"",S_FALSE,FALSE}, + {"",S_FALSE,FALSE} + }, + { + {Uri_HOST_UNKNOWN,S_OK,FALSE}, + {0,S_FALSE,FALSE}, + {URL_SCHEME_FILE,S_OK,FALSE}, + {URLZONE_INVALID,E_NOTIMPL,FALSE} + } + }, + /* Dot removal happens for unknown scheme types. */ + { "zip://gov.uk/test/test2/../../.", 0, S_OK, FALSE, + Uri_HAS_ABSOLUTE_URI|Uri_HAS_AUTHORITY|Uri_HAS_DISPLAY_URI|Uri_HAS_HOST| + Uri_HAS_PATH|Uri_HAS_PATH_AND_QUERY|Uri_HAS_RAW_URI|Uri_HAS_SCHEME_NAME| + Uri_HAS_HOST_TYPE|Uri_HAS_SCHEME, + FALSE, + { + {"zip://gov.uk/",S_OK,FALSE}, + {"gov.uk",S_OK,FALSE}, + {"zip://gov.uk/",S_OK,FALSE}, + {"",S_FALSE,FALSE}, + {"",S_FALSE,FALSE}, + {"",S_FALSE,FALSE}, + {"gov.uk",S_OK,FALSE}, + {"",S_FALSE,FALSE}, + {"/",S_OK,FALSE}, + {"/",S_OK,FALSE}, + {"",S_FALSE,FALSE}, + {"zip://gov.uk/test/test2/../../.",S_OK,FALSE}, + {"zip",S_OK,FALSE}, + {"",S_FALSE,FALSE}, + {"",S_FALSE,FALSE} + }, + { + {Uri_HOST_DNS,S_OK,FALSE}, + {0,S_FALSE,FALSE}, + {URL_SCHEME_UNKNOWN,S_OK,FALSE}, + {URLZONE_INVALID,E_NOTIMPL,FALSE} + } + }, + /* Dot removal doesn't happen if NO_CANONICALIZE is set. */ + { "http://gov.uk/test/test2/../../.", Uri_CREATE_NO_CANONICALIZE, S_OK, FALSE, + Uri_HAS_ABSOLUTE_URI|Uri_HAS_AUTHORITY|Uri_HAS_DISPLAY_URI|Uri_HAS_EXTENSION| + Uri_HAS_HOST|Uri_HAS_PATH|Uri_HAS_PATH_AND_QUERY|Uri_HAS_RAW_URI|Uri_HAS_SCHEME_NAME| + Uri_HAS_HOST_TYPE|Uri_HAS_PORT|Uri_HAS_SCHEME, + FALSE, + { + {"http://gov.uk/test/test2/../../.",S_OK,FALSE}, + {"gov.uk",S_OK,FALSE}, + {"http://gov.uk/test/test2/../../.",S_OK,FALSE}, + {"",S_FALSE,FALSE}, + {".",S_OK,FALSE}, + {"",S_FALSE,FALSE}, + {"gov.uk",S_OK,FALSE}, + {"",S_FALSE,FALSE}, + {"/test/test2/../../.",S_OK,FALSE}, + {"/test/test2/../../.",S_OK,FALSE}, + {"",S_FALSE,FALSE}, + {"http://gov.uk/test/test2/../../.",S_OK,FALSE}, + {"http",S_OK,FALSE}, + {"",S_FALSE,FALSE}, + {"",S_FALSE,FALSE} + }, + { + {Uri_HOST_DNS,S_OK,FALSE}, + {80,S_OK,FALSE}, + {URL_SCHEME_HTTP,S_OK,FALSE}, + {URLZONE_INVALID,E_NOTIMPL,FALSE} + } + }, + /* Dot removal doesn't happen for wildcard scheme types. */ + { "*:gov.uk/test/test2/../../.", 0, S_OK, FALSE, + Uri_HAS_ABSOLUTE_URI|Uri_HAS_AUTHORITY|Uri_HAS_DISPLAY_URI|Uri_HAS_EXTENSION| + Uri_HAS_HOST|Uri_HAS_PATH|Uri_HAS_PATH_AND_QUERY|Uri_HAS_RAW_URI|Uri_HAS_SCHEME_NAME| + Uri_HAS_HOST_TYPE|Uri_HAS_SCHEME, + FALSE, + { + {"*:gov.uk/test/test2/../../.",S_OK,FALSE}, + {"gov.uk",S_OK,FALSE}, + {"*:gov.uk/test/test2/../../.",S_OK,FALSE}, + {"",S_FALSE,FALSE}, + {".",S_OK,FALSE}, + {"",S_FALSE,FALSE}, + {"gov.uk",S_OK,FALSE}, + {"",S_FALSE,FALSE}, + {"/test/test2/../../.",S_OK,FALSE}, + {"/test/test2/../../.",S_OK,FALSE}, + {"",S_FALSE,FALSE}, + {"*:gov.uk/test/test2/../../.",S_OK,FALSE}, + {"*",S_OK,FALSE}, + {"",S_FALSE,FALSE}, + {"",S_FALSE,FALSE} + }, + { + {Uri_HOST_DNS,S_OK,FALSE}, + {0,S_FALSE,FALSE}, + {URL_SCHEME_WILDCARD,S_OK,FALSE}, + {URLZONE_INVALID,E_NOTIMPL,FALSE} + } + }, + /* Forbidden characters are encoded for opaque known scheme types. */ + { "mailto:\"acco<|>unt@example.com\"", 0, S_OK, FALSE, + Uri_HAS_ABSOLUTE_URI|Uri_HAS_DISPLAY_URI|Uri_HAS_EXTENSION|Uri_HAS_PATH|Uri_HAS_PATH_AND_QUERY| + Uri_HAS_RAW_URI|Uri_HAS_SCHEME_NAME|Uri_HAS_HOST_TYPE|Uri_HAS_SCHEME, + FALSE, + { + {"mailto:%22acco%3C%7C%3Eunt@example.com%22",S_OK,FALSE}, + {"",S_FALSE,FALSE}, + {"mailto:%22acco%3C%7C%3Eunt@example.com%22",S_OK,FALSE}, + {"",S_FALSE,FALSE}, + {".com%22",S_OK,FALSE}, + {"",S_FALSE,FALSE}, + {"",S_FALSE,FALSE}, + {"",S_FALSE,FALSE}, + {"%22acco%3C%7C%3Eunt@example.com%22",S_OK,FALSE}, + {"%22acco%3C%7C%3Eunt@example.com%22",S_OK,FALSE}, + {"",S_FALSE,FALSE}, + {"mailto:\"acco<|>unt@example.com\"",S_OK,FALSE}, + {"mailto",S_OK,FALSE}, + {"",S_FALSE,FALSE}, + {"",S_FALSE,FALSE} + }, + { + {Uri_HOST_UNKNOWN,S_OK,FALSE}, + {0,S_FALSE,FALSE}, + {URL_SCHEME_MAILTO,S_OK,FALSE}, + {URLZONE_INVALID,E_NOTIMPL,FALSE} + } + }, + { "news:test.tes<|>t.com", 0, S_OK, FALSE, + Uri_HAS_ABSOLUTE_URI|Uri_HAS_DISPLAY_URI|Uri_HAS_EXTENSION|Uri_HAS_PATH|Uri_HAS_PATH_AND_QUERY| + Uri_HAS_RAW_URI|Uri_HAS_SCHEME_NAME|Uri_HAS_HOST_TYPE|Uri_HAS_SCHEME, + FALSE, + { + {"news:test.tes%3C%7C%3Et.com",S_OK,FALSE}, + {"",S_FALSE,FALSE}, + {"news:test.tes%3C%7C%3Et.com",S_OK,FALSE}, + {"",S_FALSE,FALSE}, + {".com",S_OK,FALSE}, + {"",S_FALSE,FALSE}, + {"",S_FALSE,FALSE}, + {"",S_FALSE,FALSE}, + {"test.tes%3C%7C%3Et.com",S_OK,FALSE}, + {"test.tes%3C%7C%3Et.com",S_OK,FALSE}, + {"",S_FALSE,FALSE}, + {"news:test.tes<|>t.com",S_OK,FALSE}, + {"news",S_OK,FALSE}, + {"",S_FALSE,FALSE}, + {"",S_FALSE,FALSE} + }, + { + {Uri_HOST_UNKNOWN,S_OK,FALSE}, + {0,S_FALSE,FALSE}, + {URL_SCHEME_NEWS,S_OK,FALSE}, + {URLZONE_INVALID,E_NOTIMPL,FALSE} + } + }, + /* Don't encode forbidden characters. */ + { "news:test.tes<|>t.com", Uri_CREATE_NO_ENCODE_FORBIDDEN_CHARACTERS, S_OK, FALSE, + Uri_HAS_ABSOLUTE_URI|Uri_HAS_DISPLAY_URI|Uri_HAS_EXTENSION|Uri_HAS_PATH|Uri_HAS_PATH_AND_QUERY| + Uri_HAS_RAW_URI|Uri_HAS_SCHEME_NAME|Uri_HAS_HOST_TYPE|Uri_HAS_SCHEME, + FALSE, + { + {"news:test.tes<|>t.com",S_OK,FALSE}, + {"",S_FALSE,FALSE}, + {"news:test.tes<|>t.com",S_OK,FALSE}, + {"",S_FALSE,FALSE}, + {".com",S_OK,FALSE}, + {"",S_FALSE,FALSE}, + {"",S_FALSE,FALSE}, + {"",S_FALSE,FALSE}, + {"test.tes<|>t.com",S_OK,FALSE}, + {"test.tes<|>t.com",S_OK,FALSE}, + {"",S_FALSE,FALSE}, + {"news:test.tes<|>t.com",S_OK,FALSE}, + {"news",S_OK,FALSE}, + {"",S_FALSE,FALSE}, + {"",S_FALSE,FALSE} + }, + { + {Uri_HOST_UNKNOWN,S_OK,FALSE}, + {0,S_FALSE,FALSE}, + {URL_SCHEME_NEWS,S_OK,FALSE}, + {URLZONE_INVALID,E_NOTIMPL,FALSE} + } + }, + /* Forbidden characters aren't encoded for unknown, opaque URIs. */ + { "urn:test.tes<|>t.com", 0, S_OK, FALSE, + Uri_HAS_ABSOLUTE_URI|Uri_HAS_DISPLAY_URI|Uri_HAS_EXTENSION|Uri_HAS_PATH|Uri_HAS_PATH_AND_QUERY| + Uri_HAS_RAW_URI|Uri_HAS_SCHEME_NAME|Uri_HAS_HOST_TYPE|Uri_HAS_SCHEME, + FALSE, + { + {"urn:test.tes<|>t.com",S_OK,FALSE}, + {"",S_FALSE,FALSE}, + {"urn:test.tes<|>t.com",S_OK,FALSE}, + {"",S_FALSE,FALSE}, + {".com",S_OK,FALSE}, + {"",S_FALSE,FALSE}, + {"",S_FALSE,FALSE}, + {"",S_FALSE,FALSE}, + {"test.tes<|>t.com",S_OK,FALSE}, + {"test.tes<|>t.com",S_OK,FALSE}, + {"",S_FALSE,FALSE}, + {"urn:test.tes<|>t.com",S_OK,FALSE}, + {"urn",S_OK,FALSE}, + {"",S_FALSE,FALSE}, + {"",S_FALSE,FALSE} + }, + { + {Uri_HOST_UNKNOWN,S_OK,FALSE}, + {0,S_FALSE,FALSE}, + {URL_SCHEME_UNKNOWN,S_OK,FALSE}, + {URLZONE_INVALID,E_NOTIMPL,FALSE} + } + }, + /* Percent encoded unreserved characters are decoded for known opaque URIs. */ + { "news:test.%74%65%73%74.com", 0, S_OK, FALSE, + Uri_HAS_ABSOLUTE_URI|Uri_HAS_DISPLAY_URI|Uri_HAS_EXTENSION|Uri_HAS_PATH|Uri_HAS_PATH_AND_QUERY| + Uri_HAS_RAW_URI|Uri_HAS_SCHEME_NAME|Uri_HAS_HOST_TYPE|Uri_HAS_SCHEME, + FALSE, + { + {"news:test.test.com",S_OK,FALSE}, + {"",S_FALSE,FALSE}, + {"news:test.test.com",S_OK,FALSE}, + {"",S_FALSE,FALSE}, + {".com",S_OK,FALSE}, + {"",S_FALSE,FALSE}, + {"",S_FALSE,FALSE}, + {"",S_FALSE,FALSE}, + {"test.test.com",S_OK,FALSE}, + {"test.test.com",S_OK,FALSE}, + {"",S_FALSE,FALSE}, + {"news:test.%74%65%73%74.com",S_OK,FALSE}, + {"news",S_OK,FALSE}, + {"",S_FALSE,FALSE}, + {"",S_FALSE,FALSE} + }, + { + {Uri_HOST_UNKNOWN,S_OK,FALSE}, + {0,S_FALSE,FALSE}, + {URL_SCHEME_NEWS,S_OK,FALSE}, + {URLZONE_INVALID,E_NOTIMPL,FALSE} + } + }, + /* Percent encoded characters are still decoded for known scheme types. */ + { "news:test.%74%65%73%74.com", Uri_CREATE_NO_CANONICALIZE, S_OK, FALSE, + Uri_HAS_ABSOLUTE_URI|Uri_HAS_DISPLAY_URI|Uri_HAS_EXTENSION|Uri_HAS_PATH|Uri_HAS_PATH_AND_QUERY| + Uri_HAS_RAW_URI|Uri_HAS_SCHEME_NAME|Uri_HAS_HOST_TYPE|Uri_HAS_SCHEME, + FALSE, + { + {"news:test.test.com",S_OK,FALSE}, + {"",S_FALSE,FALSE}, + {"news:test.test.com",S_OK,FALSE}, + {"",S_FALSE,FALSE}, + {".com",S_OK,FALSE}, + {"",S_FALSE,FALSE}, + {"",S_FALSE,FALSE}, + {"",S_FALSE,FALSE}, + {"test.test.com",S_OK,FALSE}, + {"test.test.com",S_OK,FALSE}, + {"",S_FALSE,FALSE}, + {"news:test.%74%65%73%74.com",S_OK,FALSE}, + {"news",S_OK,FALSE}, + {"",S_FALSE,FALSE}, + {"",S_FALSE,FALSE} + }, + { + {Uri_HOST_UNKNOWN,S_OK,FALSE}, + {0,S_FALSE,FALSE}, + {URL_SCHEME_NEWS,S_OK,FALSE}, + {URLZONE_INVALID,E_NOTIMPL,FALSE} + } + }, + /* Percent encoded characters aren't decoded for unknown scheme types. */ + { "urn:test.%74%65%73%74.com", 0, S_OK, FALSE, + Uri_HAS_ABSOLUTE_URI|Uri_HAS_DISPLAY_URI|Uri_HAS_EXTENSION|Uri_HAS_PATH|Uri_HAS_PATH_AND_QUERY| + Uri_HAS_RAW_URI|Uri_HAS_SCHEME_NAME|Uri_HAS_HOST_TYPE|Uri_HAS_SCHEME, + FALSE, + { + {"urn:test.%74%65%73%74.com",S_OK,FALSE}, + {"",S_FALSE,FALSE}, + {"urn:test.%74%65%73%74.com",S_OK,FALSE}, + {"",S_FALSE,FALSE}, + {".com",S_OK,FALSE}, + {"",S_FALSE,FALSE}, + {"",S_FALSE,FALSE}, + {"",S_FALSE,FALSE}, + {"test.%74%65%73%74.com",S_OK,FALSE}, + {"test.%74%65%73%74.com",S_OK,FALSE}, + {"",S_FALSE,FALSE}, + {"urn:test.%74%65%73%74.com",S_OK,FALSE}, + {"urn",S_OK,FALSE}, + {"",S_FALSE,FALSE}, + {"",S_FALSE,FALSE} + }, + { + {Uri_HOST_UNKNOWN,S_OK,FALSE}, + {0,S_FALSE,FALSE}, + {URL_SCHEME_UNKNOWN,S_OK,FALSE}, + {URLZONE_INVALID,E_NOTIMPL,FALSE} + } + }, + /* Unknown scheme types can have invalid % encoded data in query string. */ + { "zip://www.winehq.org/tests/..?query=%xx&return=y", 0, S_OK, FALSE, + Uri_HAS_ABSOLUTE_URI|Uri_HAS_AUTHORITY|Uri_HAS_DISPLAY_URI|Uri_HAS_DOMAIN|Uri_HAS_HOST| + Uri_HAS_DOMAIN|Uri_HAS_PATH|Uri_HAS_PATH_AND_QUERY|Uri_HAS_QUERY|Uri_HAS_RAW_URI| + Uri_HAS_SCHEME_NAME|Uri_HAS_HOST_TYPE|Uri_HAS_SCHEME, + FALSE, + { + {"zip://www.winehq.org/?query=%xx&return=y",S_OK,FALSE}, + {"www.winehq.org",S_OK,FALSE}, + {"zip://www.winehq.org/?query=%xx&return=y",S_OK,FALSE}, + {"winehq.org",S_OK,FALSE}, + {"",S_FALSE,FALSE}, + {"",S_FALSE,FALSE}, + {"www.winehq.org",S_OK,FALSE}, + {"",S_FALSE,FALSE}, + {"/",S_OK,FALSE}, + {"/?query=%xx&return=y",S_OK,FALSE}, + {"?query=%xx&return=y",S_OK,FALSE}, + {"zip://www.winehq.org/tests/..?query=%xx&return=y",S_OK,FALSE}, + {"zip",S_OK,FALSE}, + {"",S_FALSE,FALSE}, + {"",S_FALSE,FALSE} + }, + { + {Uri_HOST_DNS,S_OK,FALSE}, + {0,S_FALSE,FALSE}, + {URL_SCHEME_UNKNOWN,S_OK,FALSE}, + {URLZONE_INVALID,E_NOTIMPL,FALSE}, + } + }, + /* Known scheme types can have invalid % encoded data with the right flags. */ + { "http://www.winehq.org/tests/..?query=%xx&return=y", Uri_CREATE_NO_DECODE_EXTRA_INFO, S_OK, FALSE, + Uri_HAS_ABSOLUTE_URI|Uri_HAS_AUTHORITY|Uri_HAS_DISPLAY_URI|Uri_HAS_DOMAIN|Uri_HAS_HOST| + Uri_HAS_DOMAIN|Uri_HAS_PATH|Uri_HAS_PATH_AND_QUERY|Uri_HAS_PORT|Uri_HAS_QUERY|Uri_HAS_RAW_URI| + Uri_HAS_SCHEME_NAME|Uri_HAS_HOST_TYPE|Uri_HAS_SCHEME, + FALSE, + { + {"http://www.winehq.org/?query=%xx&return=y",S_OK,FALSE}, + {"www.winehq.org",S_OK,FALSE}, + {"http://www.winehq.org/?query=%xx&return=y",S_OK,FALSE}, + {"winehq.org",S_OK,FALSE}, + {"",S_FALSE,FALSE}, + {"",S_FALSE,FALSE}, + {"www.winehq.org",S_OK,FALSE}, + {"",S_FALSE,FALSE}, + {"/",S_OK,FALSE}, + {"/?query=%xx&return=y",S_OK,FALSE}, + {"?query=%xx&return=y",S_OK,FALSE}, + {"http://www.winehq.org/tests/..?query=%xx&return=y",S_OK,FALSE}, + {"http",S_OK,FALSE}, + {"",S_FALSE,FALSE}, + {"",S_FALSE,FALSE} + }, + { + {Uri_HOST_DNS,S_OK,FALSE}, + {80,S_OK,FALSE}, + {URL_SCHEME_HTTP,S_OK,FALSE}, + {URLZONE_INVALID,E_NOTIMPL,FALSE}, + } + }, + /* Forbidden characters in query aren't percent encoded for known scheme types with this flag. */ + { "http://www.winehq.org/tests/..?query=<|>&return=y", Uri_CREATE_NO_DECODE_EXTRA_INFO, S_OK, FALSE, + Uri_HAS_ABSOLUTE_URI|Uri_HAS_AUTHORITY|Uri_HAS_DISPLAY_URI|Uri_HAS_DOMAIN|Uri_HAS_HOST| + Uri_HAS_DOMAIN|Uri_HAS_PATH|Uri_HAS_PATH_AND_QUERY|Uri_HAS_PORT|Uri_HAS_QUERY|Uri_HAS_RAW_URI| + Uri_HAS_SCHEME_NAME|Uri_HAS_HOST_TYPE|Uri_HAS_SCHEME, + FALSE, + { + {"http://www.winehq.org/?query=<|>&return=y",S_OK,FALSE}, + {"www.winehq.org",S_OK,FALSE}, + {"http://www.winehq.org/?query=<|>&return=y",S_OK,FALSE}, + {"winehq.org",S_OK,FALSE}, + {"",S_FALSE,FALSE}, + {"",S_FALSE,FALSE}, + {"www.winehq.org",S_OK,FALSE}, + {"",S_FALSE,FALSE}, + {"/",S_OK,FALSE}, + {"/?query=<|>&return=y",S_OK,FALSE}, + {"?query=<|>&return=y",S_OK,FALSE}, + {"http://www.winehq.org/tests/..?query=<|>&return=y",S_OK,FALSE}, + {"http",S_OK,FALSE}, + {"",S_FALSE,FALSE}, + {"",S_FALSE,FALSE} + }, + { + {Uri_HOST_DNS,S_OK,FALSE}, + {80,S_OK,FALSE}, + {URL_SCHEME_HTTP,S_OK,FALSE}, + {URLZONE_INVALID,E_NOTIMPL,FALSE}, + } + }, + /* Forbidden characters in query aren't percent encoded for known scheme types with this flag. */ + { "http://www.winehq.org/tests/..?query=<|>&return=y", Uri_CREATE_NO_ENCODE_FORBIDDEN_CHARACTERS, S_OK, FALSE, + Uri_HAS_ABSOLUTE_URI|Uri_HAS_AUTHORITY|Uri_HAS_DISPLAY_URI|Uri_HAS_DOMAIN|Uri_HAS_HOST| + Uri_HAS_DOMAIN|Uri_HAS_PATH|Uri_HAS_PATH_AND_QUERY|Uri_HAS_PORT|Uri_HAS_QUERY|Uri_HAS_RAW_URI| + Uri_HAS_SCHEME_NAME|Uri_HAS_HOST_TYPE|Uri_HAS_SCHEME, + FALSE, + { + {"http://www.winehq.org/?query=<|>&return=y",S_OK,FALSE}, + {"www.winehq.org",S_OK,FALSE}, + {"http://www.winehq.org/?query=<|>&return=y",S_OK,FALSE}, + {"winehq.org",S_OK,FALSE}, + {"",S_FALSE,FALSE}, + {"",S_FALSE,FALSE}, + {"www.winehq.org",S_OK,FALSE}, + {"",S_FALSE,FALSE}, + {"/",S_OK,FALSE}, + {"/?query=<|>&return=y",S_OK,FALSE}, + {"?query=<|>&return=y",S_OK,FALSE}, + {"http://www.winehq.org/tests/..?query=<|>&return=y",S_OK,FALSE}, + {"http",S_OK,FALSE}, + {"",S_FALSE,FALSE}, + {"",S_FALSE,FALSE} + }, + { + {Uri_HOST_DNS,S_OK,FALSE}, + {80,S_OK,FALSE}, + {URL_SCHEME_HTTP,S_OK,FALSE}, + {URLZONE_INVALID,E_NOTIMPL,FALSE}, + } + }, + /* Forbidden characters are encoded for known scheme types. */ + { "http://www.winehq.org/tests/..?query=<|>&return=y", 0, S_OK, FALSE, + Uri_HAS_ABSOLUTE_URI|Uri_HAS_AUTHORITY|Uri_HAS_DISPLAY_URI|Uri_HAS_DOMAIN|Uri_HAS_HOST| + Uri_HAS_DOMAIN|Uri_HAS_PATH|Uri_HAS_PATH_AND_QUERY|Uri_HAS_PORT|Uri_HAS_QUERY|Uri_HAS_RAW_URI| + Uri_HAS_SCHEME_NAME|Uri_HAS_HOST_TYPE|Uri_HAS_SCHEME, + FALSE, + { + {"http://www.winehq.org/?query=%3C%7C%3E&return=y",S_OK,FALSE}, + {"www.winehq.org",S_OK,FALSE}, + {"http://www.winehq.org/?query=%3C%7C%3E&return=y",S_OK,FALSE}, + {"winehq.org",S_OK,FALSE}, + {"",S_FALSE,FALSE}, + {"",S_FALSE,FALSE}, + {"www.winehq.org",S_OK,FALSE}, + {"",S_FALSE,FALSE}, + {"/",S_OK,FALSE}, + {"/?query=%3C%7C%3E&return=y",S_OK,FALSE}, + {"?query=%3C%7C%3E&return=y",S_OK,FALSE}, + {"http://www.winehq.org/tests/..?query=<|>&return=y",S_OK,FALSE}, + {"http",S_OK,FALSE}, + {"",S_FALSE,FALSE}, + {"",S_FALSE,FALSE} + }, + { + {Uri_HOST_DNS,S_OK,FALSE}, + {80,S_OK,FALSE}, + {URL_SCHEME_HTTP,S_OK,FALSE}, + {URLZONE_INVALID,E_NOTIMPL,FALSE}, + } + }, + /* Forbidden characters are not encoded for unknown scheme types. */ + { "zip://www.winehq.org/tests/..?query=<|>&return=y", 0, S_OK, FALSE, + Uri_HAS_ABSOLUTE_URI|Uri_HAS_AUTHORITY|Uri_HAS_DISPLAY_URI|Uri_HAS_DOMAIN|Uri_HAS_HOST| + Uri_HAS_DOMAIN|Uri_HAS_PATH|Uri_HAS_PATH_AND_QUERY|Uri_HAS_QUERY|Uri_HAS_RAW_URI| + Uri_HAS_SCHEME_NAME|Uri_HAS_HOST_TYPE|Uri_HAS_SCHEME, + FALSE, + { + {"zip://www.winehq.org/?query=<|>&return=y",S_OK,FALSE}, + {"www.winehq.org",S_OK,FALSE}, + {"zip://www.winehq.org/?query=<|>&return=y",S_OK,FALSE}, + {"winehq.org",S_OK,FALSE}, + {"",S_FALSE,FALSE}, + {"",S_FALSE,FALSE}, + {"www.winehq.org",S_OK,FALSE}, + {"",S_FALSE,FALSE}, + {"/",S_OK,FALSE}, + {"/?query=<|>&return=y",S_OK,FALSE}, + {"?query=<|>&return=y",S_OK,FALSE}, + {"zip://www.winehq.org/tests/..?query=<|>&return=y",S_OK,FALSE}, + {"zip",S_OK,FALSE}, + {"",S_FALSE,FALSE}, + {"",S_FALSE,FALSE} + }, + { + {Uri_HOST_DNS,S_OK,FALSE}, + {0,S_FALSE,FALSE}, + {URL_SCHEME_UNKNOWN,S_OK,FALSE}, + {URLZONE_INVALID,E_NOTIMPL,FALSE}, + } + }, + /* Percent encoded, unreserved characters are decoded for known scheme types. */ + { "http://www.winehq.org/tests/..?query=%30%31&return=y", 0, S_OK, FALSE, + Uri_HAS_ABSOLUTE_URI|Uri_HAS_AUTHORITY|Uri_HAS_DISPLAY_URI|Uri_HAS_DOMAIN|Uri_HAS_HOST| + Uri_HAS_DOMAIN|Uri_HAS_PATH|Uri_HAS_PATH_AND_QUERY|Uri_HAS_PORT|Uri_HAS_QUERY|Uri_HAS_RAW_URI| + Uri_HAS_SCHEME_NAME|Uri_HAS_HOST_TYPE|Uri_HAS_SCHEME, + FALSE, + { + {"http://www.winehq.org/?query=01&return=y",S_OK,FALSE}, + {"www.winehq.org",S_OK,FALSE}, + {"http://www.winehq.org/?query=01&return=y",S_OK,FALSE}, + {"winehq.org",S_OK,FALSE}, + {"",S_FALSE,FALSE}, + {"",S_FALSE,FALSE}, + {"www.winehq.org",S_OK,FALSE}, + {"",S_FALSE,FALSE}, + {"/",S_OK,FALSE}, + {"/?query=01&return=y",S_OK,FALSE}, + {"?query=01&return=y",S_OK,FALSE}, + {"http://www.winehq.org/tests/..?query=%30%31&return=y",S_OK,FALSE}, + {"http",S_OK,FALSE}, + {"",S_FALSE,FALSE}, + {"",S_FALSE,FALSE} + }, + { + {Uri_HOST_DNS,S_OK,FALSE}, + {80,S_OK,FALSE}, + {URL_SCHEME_HTTP,S_OK,FALSE}, + {URLZONE_INVALID,E_NOTIMPL,FALSE}, + } + }, + /* Percent encoded, unreserved characters aren't decoded for unknown scheme types. */ + { "zip://www.winehq.org/tests/..?query=%30%31&return=y", 0, S_OK, FALSE, + Uri_HAS_ABSOLUTE_URI|Uri_HAS_AUTHORITY|Uri_HAS_DISPLAY_URI|Uri_HAS_DOMAIN|Uri_HAS_HOST| + Uri_HAS_DOMAIN|Uri_HAS_PATH|Uri_HAS_PATH_AND_QUERY|Uri_HAS_QUERY|Uri_HAS_RAW_URI| + Uri_HAS_SCHEME_NAME|Uri_HAS_HOST_TYPE|Uri_HAS_SCHEME, + FALSE, + { + {"zip://www.winehq.org/?query=%30%31&return=y",S_OK,FALSE}, + {"www.winehq.org",S_OK,FALSE}, + {"zip://www.winehq.org/?query=%30%31&return=y",S_OK,FALSE}, + {"winehq.org",S_OK,FALSE}, + {"",S_FALSE,FALSE}, + {"",S_FALSE,FALSE}, + {"www.winehq.org",S_OK,FALSE}, + {"",S_FALSE,FALSE}, + {"/",S_OK,FALSE}, + {"/?query=%30%31&return=y",S_OK,FALSE}, + {"?query=%30%31&return=y",S_OK,FALSE}, + {"zip://www.winehq.org/tests/..?query=%30%31&return=y",S_OK,FALSE}, + {"zip",S_OK,FALSE}, + {"",S_FALSE,FALSE}, + {"",S_FALSE,FALSE} + }, + { + {Uri_HOST_DNS,S_OK,FALSE}, + {0,S_FALSE,FALSE}, + {URL_SCHEME_UNKNOWN,S_OK,FALSE}, + {URLZONE_INVALID,E_NOTIMPL,FALSE}, + } + }, + /* Percent encoded characters aren't decoded when NO_DECODE_EXTRA_INFO is set. */ + { "http://www.winehq.org/tests/..?query=%30%31&return=y", Uri_CREATE_NO_DECODE_EXTRA_INFO, S_OK, FALSE, + Uri_HAS_ABSOLUTE_URI|Uri_HAS_AUTHORITY|Uri_HAS_DISPLAY_URI|Uri_HAS_DOMAIN|Uri_HAS_HOST| + Uri_HAS_DOMAIN|Uri_HAS_PATH|Uri_HAS_PATH_AND_QUERY|Uri_HAS_PORT|Uri_HAS_QUERY|Uri_HAS_RAW_URI| + Uri_HAS_SCHEME_NAME|Uri_HAS_HOST_TYPE|Uri_HAS_SCHEME, + FALSE, + { + {"http://www.winehq.org/?query=%30%31&return=y",S_OK,FALSE}, + {"www.winehq.org",S_OK,FALSE}, + {"http://www.winehq.org/?query=%30%31&return=y",S_OK,FALSE}, + {"winehq.org",S_OK,FALSE}, + {"",S_FALSE,FALSE}, + {"",S_FALSE,FALSE}, + {"www.winehq.org",S_OK,FALSE}, + {"",S_FALSE,FALSE}, + {"/",S_OK,FALSE}, + {"/?query=%30%31&return=y",S_OK,FALSE}, + {"?query=%30%31&return=y",S_OK,FALSE}, + {"http://www.winehq.org/tests/..?query=%30%31&return=y",S_OK,FALSE}, + {"http",S_OK,FALSE}, + {"",S_FALSE,FALSE}, + {"",S_FALSE,FALSE} + }, + { + {Uri_HOST_DNS,S_OK,FALSE}, + {80,S_OK,FALSE}, + {URL_SCHEME_HTTP,S_OK,FALSE}, + {URLZONE_INVALID,E_NOTIMPL,FALSE}, + } + }, + { "http://www.winehq.org?query=12&return=y", Uri_CREATE_NO_CANONICALIZE, S_OK, FALSE, + Uri_HAS_ABSOLUTE_URI|Uri_HAS_AUTHORITY|Uri_HAS_DISPLAY_URI|Uri_HAS_DOMAIN|Uri_HAS_HOST| + Uri_HAS_DOMAIN|Uri_HAS_PATH_AND_QUERY|Uri_HAS_PORT|Uri_HAS_QUERY|Uri_HAS_RAW_URI| + Uri_HAS_SCHEME_NAME|Uri_HAS_HOST_TYPE|Uri_HAS_SCHEME, + FALSE, + { + {"http://www.winehq.org?query=12&return=y",S_OK,FALSE}, + {"www.winehq.org",S_OK,FALSE}, + {"http://www.winehq.org?query=12&return=y",S_OK,FALSE}, + {"winehq.org",S_OK,FALSE}, + {"",S_FALSE,FALSE}, + {"",S_FALSE,FALSE}, + {"www.winehq.org",S_OK,FALSE}, + {"",S_FALSE,FALSE}, + {"",S_FALSE,FALSE}, + {"?query=12&return=y",S_OK,FALSE}, + {"?query=12&return=y",S_OK,FALSE}, + {"http://www.winehq.org?query=12&return=y",S_OK,FALSE}, + {"http",S_OK,FALSE}, + {"",S_FALSE,FALSE}, + {"",S_FALSE,FALSE} + }, + { + {Uri_HOST_DNS,S_OK,FALSE}, + {80,S_OK,FALSE}, + {URL_SCHEME_HTTP,S_OK,FALSE}, + {URLZONE_INVALID,E_NOTIMPL,FALSE}, + } + }, + /* Unknown scheme types can have invalid % encoded data in fragments. */ + { "zip://www.winehq.org/tests/#Te%xx", 0, S_OK, FALSE, + Uri_HAS_ABSOLUTE_URI|Uri_HAS_AUTHORITY|Uri_HAS_DISPLAY_URI|Uri_HAS_DOMAIN|Uri_HAS_FRAGMENT| + Uri_HAS_HOST|Uri_HAS_DOMAIN|Uri_HAS_PATH|Uri_HAS_PATH_AND_QUERY|Uri_HAS_RAW_URI| + Uri_HAS_SCHEME_NAME|Uri_HAS_HOST_TYPE|Uri_HAS_SCHEME, + FALSE, + { + {"zip://www.winehq.org/tests/#Te%xx",S_OK,FALSE}, + {"www.winehq.org",S_OK,FALSE}, + {"zip://www.winehq.org/tests/#Te%xx",S_OK,FALSE}, + {"winehq.org",S_OK,FALSE}, + {"",S_FALSE,FALSE}, + {"#Te%xx",S_OK,FALSE}, + {"www.winehq.org",S_OK,FALSE}, + {"",S_FALSE,FALSE}, + {"/tests/",S_OK,FALSE}, + {"/tests/",S_OK,FALSE}, + {"",S_FALSE,FALSE}, + {"zip://www.winehq.org/tests/#Te%xx",S_OK,FALSE}, + {"zip",S_OK,FALSE}, + {"",S_FALSE,FALSE}, + {"",S_FALSE,FALSE} + }, + { + {Uri_HOST_DNS,S_OK,FALSE}, + {0,S_FALSE,FALSE}, + {URL_SCHEME_UNKNOWN,S_OK,FALSE}, + {URLZONE_INVALID,E_NOTIMPL,FALSE}, + } + }, + /* Forbidden characters in fragment aren't encoded for unknown schemes. */ + { "zip://www.winehq.org/tests/#Te<|>", 0, S_OK, FALSE, + Uri_HAS_ABSOLUTE_URI|Uri_HAS_AUTHORITY|Uri_HAS_DISPLAY_URI|Uri_HAS_DOMAIN|Uri_HAS_FRAGMENT| + Uri_HAS_HOST|Uri_HAS_DOMAIN|Uri_HAS_PATH|Uri_HAS_PATH_AND_QUERY|Uri_HAS_RAW_URI| + Uri_HAS_SCHEME_NAME|Uri_HAS_HOST_TYPE|Uri_HAS_SCHEME, + FALSE, + { + {"zip://www.winehq.org/tests/#Te<|>",S_OK,FALSE}, + {"www.winehq.org",S_OK,FALSE}, + {"zip://www.winehq.org/tests/#Te<|>",S_OK,FALSE}, + {"winehq.org",S_OK,FALSE}, + {"",S_FALSE,FALSE}, + {"#Te<|>",S_OK,FALSE}, + {"www.winehq.org",S_OK,FALSE}, + {"",S_FALSE,FALSE}, + {"/tests/",S_OK,FALSE}, + {"/tests/",S_OK,FALSE}, + {"",S_FALSE,FALSE}, + {"zip://www.winehq.org/tests/#Te<|>",S_OK,FALSE}, + {"zip",S_OK,FALSE}, + {"",S_FALSE,FALSE}, + {"",S_FALSE,FALSE} + }, + { + {Uri_HOST_DNS,S_OK,FALSE}, + {0,S_FALSE,FALSE}, + {URL_SCHEME_UNKNOWN,S_OK,FALSE}, + {URLZONE_INVALID,E_NOTIMPL,FALSE}, + } + }, + /* Forbidden characters in the fragment are percent encoded for known schemes. */ + { "http://www.winehq.org/tests/#Te<|>", 0, S_OK, FALSE, + Uri_HAS_ABSOLUTE_URI|Uri_HAS_AUTHORITY|Uri_HAS_DISPLAY_URI|Uri_HAS_DOMAIN|Uri_HAS_FRAGMENT| + Uri_HAS_HOST|Uri_HAS_DOMAIN|Uri_HAS_PATH|Uri_HAS_PATH_AND_QUERY|Uri_HAS_RAW_URI| + Uri_HAS_SCHEME_NAME|Uri_HAS_HOST_TYPE|Uri_HAS_PORT|Uri_HAS_SCHEME, + FALSE, + { + {"http://www.winehq.org/tests/#Te%3C%7C%3E",S_OK,FALSE}, + {"www.winehq.org",S_OK,FALSE}, + {"http://www.winehq.org/tests/#Te%3C%7C%3E",S_OK,FALSE}, + {"winehq.org",S_OK,FALSE}, + {"",S_FALSE,FALSE}, + {"#Te%3C%7C%3E",S_OK,FALSE}, + {"www.winehq.org",S_OK,FALSE}, + {"",S_FALSE,FALSE}, + {"/tests/",S_OK,FALSE}, + {"/tests/",S_OK,FALSE}, + {"",S_FALSE,FALSE}, + {"http://www.winehq.org/tests/#Te<|>",S_OK,FALSE}, + {"http",S_OK,FALSE}, + {"",S_FALSE,FALSE}, + {"",S_FALSE,FALSE} + }, + { + {Uri_HOST_DNS,S_OK,FALSE}, + {80,S_OK,FALSE}, + {URL_SCHEME_HTTP,S_OK,FALSE}, + {URLZONE_INVALID,E_NOTIMPL,FALSE}, + } + }, + /* Forbidden characters aren't encoded in the fragment with this flag. */ + { "http://www.winehq.org/tests/#Te<|>", Uri_CREATE_NO_DECODE_EXTRA_INFO, S_OK, FALSE, + Uri_HAS_ABSOLUTE_URI|Uri_HAS_AUTHORITY|Uri_HAS_DISPLAY_URI|Uri_HAS_DOMAIN|Uri_HAS_FRAGMENT| + Uri_HAS_HOST|Uri_HAS_DOMAIN|Uri_HAS_PATH|Uri_HAS_PATH_AND_QUERY|Uri_HAS_RAW_URI| + Uri_HAS_SCHEME_NAME|Uri_HAS_HOST_TYPE|Uri_HAS_PORT|Uri_HAS_SCHEME, + FALSE, + { + {"http://www.winehq.org/tests/#Te<|>",S_OK,FALSE}, + {"www.winehq.org",S_OK,FALSE}, + {"http://www.winehq.org/tests/#Te<|>",S_OK,FALSE}, + {"winehq.org",S_OK,FALSE}, + {"",S_FALSE,FALSE}, + {"#Te<|>",S_OK,FALSE}, + {"www.winehq.org",S_OK,FALSE}, + {"",S_FALSE,FALSE}, + {"/tests/",S_OK,FALSE}, + {"/tests/",S_OK,FALSE}, + {"",S_FALSE,FALSE}, + {"http://www.winehq.org/tests/#Te<|>",S_OK,FALSE}, + {"http",S_OK,FALSE}, + {"",S_FALSE,FALSE}, + {"",S_FALSE,FALSE} + }, + { + {Uri_HOST_DNS,S_OK,FALSE}, + {80,S_OK,FALSE}, + {URL_SCHEME_HTTP,S_OK,FALSE}, + {URLZONE_INVALID,E_NOTIMPL,FALSE}, + } + }, + /* Forbidden characters aren't encoded in the fragment with this flag. */ + { "http://www.winehq.org/tests/#Te<|>", Uri_CREATE_NO_ENCODE_FORBIDDEN_CHARACTERS, S_OK, FALSE, + Uri_HAS_ABSOLUTE_URI|Uri_HAS_AUTHORITY|Uri_HAS_DISPLAY_URI|Uri_HAS_DOMAIN|Uri_HAS_FRAGMENT| + Uri_HAS_HOST|Uri_HAS_DOMAIN|Uri_HAS_PATH|Uri_HAS_PATH_AND_QUERY|Uri_HAS_RAW_URI| + Uri_HAS_SCHEME_NAME|Uri_HAS_HOST_TYPE|Uri_HAS_PORT|Uri_HAS_SCHEME, + FALSE, + { + {"http://www.winehq.org/tests/#Te<|>",S_OK,FALSE}, + {"www.winehq.org",S_OK,FALSE}, + {"http://www.winehq.org/tests/#Te<|>",S_OK,FALSE}, + {"winehq.org",S_OK,FALSE}, + {"",S_FALSE,FALSE}, + {"#Te<|>",S_OK,FALSE}, + {"www.winehq.org",S_OK,FALSE}, + {"",S_FALSE,FALSE}, + {"/tests/",S_OK,FALSE}, + {"/tests/",S_OK,FALSE}, + {"",S_FALSE,FALSE}, + {"http://www.winehq.org/tests/#Te<|>",S_OK,FALSE}, + {"http",S_OK,FALSE}, + {"",S_FALSE,FALSE}, + {"",S_FALSE,FALSE} + }, + { + {Uri_HOST_DNS,S_OK,FALSE}, + {80,S_OK,FALSE}, + {URL_SCHEME_HTTP,S_OK,FALSE}, + {URLZONE_INVALID,E_NOTIMPL,FALSE}, + } + }, + /* Percent encoded, unreserved characters aren't decoded for known scheme types. */ + { "zip://www.winehq.org/tests/#Te%30%31%32", 0, S_OK, FALSE, + Uri_HAS_ABSOLUTE_URI|Uri_HAS_AUTHORITY|Uri_HAS_DISPLAY_URI|Uri_HAS_DOMAIN|Uri_HAS_FRAGMENT| + Uri_HAS_HOST|Uri_HAS_DOMAIN|Uri_HAS_PATH|Uri_HAS_PATH_AND_QUERY|Uri_HAS_RAW_URI| + Uri_HAS_SCHEME_NAME|Uri_HAS_HOST_TYPE|Uri_HAS_SCHEME, + FALSE, + { + {"zip://www.winehq.org/tests/#Te%30%31%32",S_OK,FALSE}, + {"www.winehq.org",S_OK,FALSE}, + {"zip://www.winehq.org/tests/#Te%30%31%32",S_OK,FALSE}, + {"winehq.org",S_OK,FALSE}, + {"",S_FALSE,FALSE}, + {"#Te%30%31%32",S_OK,FALSE}, + {"www.winehq.org",S_OK,FALSE}, + {"",S_FALSE,FALSE}, + {"/tests/",S_OK,FALSE}, + {"/tests/",S_OK,FALSE}, + {"",S_FALSE,FALSE}, + {"zip://www.winehq.org/tests/#Te%30%31%32",S_OK,FALSE}, + {"zip",S_OK,FALSE}, + {"",S_FALSE,FALSE}, + {"",S_FALSE,FALSE} + }, + { + {Uri_HOST_DNS,S_OK,FALSE}, + {0,S_FALSE,FALSE}, + {URL_SCHEME_UNKNOWN,S_OK,FALSE}, + {URLZONE_INVALID,E_NOTIMPL,FALSE}, + } + }, + /* Percent encoded, unreserved characters are decoded for known schemes. */ + { "http://www.winehq.org/tests/#Te%30%31%32", 0, S_OK, FALSE, + Uri_HAS_ABSOLUTE_URI|Uri_HAS_AUTHORITY|Uri_HAS_DISPLAY_URI|Uri_HAS_DOMAIN|Uri_HAS_FRAGMENT| + Uri_HAS_HOST|Uri_HAS_DOMAIN|Uri_HAS_PATH|Uri_HAS_PATH_AND_QUERY|Uri_HAS_RAW_URI| + Uri_HAS_SCHEME_NAME|Uri_HAS_HOST_TYPE|Uri_HAS_PORT|Uri_HAS_SCHEME, + FALSE, + { + {"http://www.winehq.org/tests/#Te012",S_OK,FALSE}, + {"www.winehq.org",S_OK,FALSE}, + {"http://www.winehq.org/tests/#Te012",S_OK,FALSE}, + {"winehq.org",S_OK,FALSE}, + {"",S_FALSE,FALSE}, + {"#Te012",S_OK,FALSE}, + {"www.winehq.org",S_OK,FALSE}, + {"",S_FALSE,FALSE}, + {"/tests/",S_OK,FALSE}, + {"/tests/",S_OK,FALSE}, + {"",S_FALSE,FALSE}, + {"http://www.winehq.org/tests/#Te%30%31%32",S_OK,FALSE}, + {"http",S_OK,FALSE}, + {"",S_FALSE,FALSE}, + {"",S_FALSE,FALSE} + }, + { + {Uri_HOST_DNS,S_OK,FALSE}, + {80,S_OK,FALSE}, + {URL_SCHEME_HTTP,S_OK,FALSE}, + {URLZONE_INVALID,E_NOTIMPL,FALSE}, + } + }, + /* Percent encoded, unreserved characters are decoded even if NO_CANONICALIZE is set. */ + { "http://www.winehq.org/tests/#Te%30%31%32", Uri_CREATE_NO_CANONICALIZE, S_OK, FALSE, + Uri_HAS_ABSOLUTE_URI|Uri_HAS_AUTHORITY|Uri_HAS_DISPLAY_URI|Uri_HAS_DOMAIN|Uri_HAS_FRAGMENT| + Uri_HAS_HOST|Uri_HAS_DOMAIN|Uri_HAS_PATH|Uri_HAS_PATH_AND_QUERY|Uri_HAS_RAW_URI| + Uri_HAS_SCHEME_NAME|Uri_HAS_HOST_TYPE|Uri_HAS_PORT|Uri_HAS_SCHEME, + FALSE, + { + {"http://www.winehq.org/tests/#Te012",S_OK,FALSE}, + {"www.winehq.org",S_OK,FALSE}, + {"http://www.winehq.org/tests/#Te012",S_OK,FALSE}, + {"winehq.org",S_OK,FALSE}, + {"",S_FALSE,FALSE}, + {"#Te012",S_OK,FALSE}, + {"www.winehq.org",S_OK,FALSE}, + {"",S_FALSE,FALSE}, + {"/tests/",S_OK,FALSE}, + {"/tests/",S_OK,FALSE}, + {"",S_FALSE,FALSE}, + {"http://www.winehq.org/tests/#Te%30%31%32",S_OK,FALSE}, + {"http",S_OK,FALSE}, + {"",S_FALSE,FALSE}, + {"",S_FALSE,FALSE} + }, + { + {Uri_HOST_DNS,S_OK,FALSE}, + {80,S_OK,FALSE}, + {URL_SCHEME_HTTP,S_OK,FALSE}, + {URLZONE_INVALID,E_NOTIMPL,FALSE}, + } + }, + /* Percent encoded, unreserved characters aren't decoded when NO_DECODE_EXTRA is set. */ + { "http://www.winehq.org/tests/#Te%30%31%32", Uri_CREATE_NO_DECODE_EXTRA_INFO, S_OK, FALSE, + Uri_HAS_ABSOLUTE_URI|Uri_HAS_AUTHORITY|Uri_HAS_DISPLAY_URI|Uri_HAS_DOMAIN|Uri_HAS_FRAGMENT| + Uri_HAS_HOST|Uri_HAS_DOMAIN|Uri_HAS_PATH|Uri_HAS_PATH_AND_QUERY|Uri_HAS_RAW_URI| + Uri_HAS_SCHEME_NAME|Uri_HAS_HOST_TYPE|Uri_HAS_PORT|Uri_HAS_SCHEME, + FALSE, + { + {"http://www.winehq.org/tests/#Te%30%31%32",S_OK,FALSE}, + {"www.winehq.org",S_OK,FALSE}, + {"http://www.winehq.org/tests/#Te%30%31%32",S_OK,FALSE}, + {"winehq.org",S_OK,FALSE}, + {"",S_FALSE,FALSE}, + {"#Te%30%31%32",S_OK,FALSE}, + {"www.winehq.org",S_OK,FALSE}, + {"",S_FALSE,FALSE}, + {"/tests/",S_OK,FALSE}, + {"/tests/",S_OK,FALSE}, + {"",S_FALSE,FALSE}, + {"http://www.winehq.org/tests/#Te%30%31%32",S_OK,FALSE}, + {"http",S_OK,FALSE}, + {"",S_FALSE,FALSE}, + {"",S_FALSE,FALSE} + }, + { + {Uri_HOST_DNS,S_OK,FALSE}, + {80,S_OK,FALSE}, + {URL_SCHEME_HTTP,S_OK,FALSE}, + {URLZONE_INVALID,E_NOTIMPL,FALSE}, + } + }, + /* Leading/Trailing whitespace is removed. */ + { " http://google.com/ ", 0, S_OK, FALSE, + Uri_HAS_ABSOLUTE_URI|Uri_HAS_AUTHORITY|Uri_HAS_DISPLAY_URI|Uri_HAS_DOMAIN| + Uri_HAS_HOST|Uri_HAS_PATH|Uri_HAS_PATH_AND_QUERY|Uri_HAS_RAW_URI| + Uri_HAS_SCHEME_NAME|Uri_HAS_HOST_TYPE|Uri_HAS_PORT|Uri_HAS_SCHEME, + FALSE, + { + {"http://google.com/",S_OK,FALSE}, + {"google.com",S_OK,FALSE}, + {"http://google.com/",S_OK,FALSE}, + {"google.com",S_OK,FALSE}, + {"",S_FALSE,FALSE}, + {"",S_FALSE,FALSE}, + {"google.com",S_OK,FALSE}, + {"",S_FALSE,FALSE}, + {"/",S_OK,FALSE}, + {"/",S_OK,FALSE}, + {"",S_FALSE,FALSE}, + {"http://google.com/",S_OK,FALSE}, + {"http",S_OK,FALSE}, + {"",S_FALSE,FALSE}, + {"",S_FALSE,FALSE} + }, + { + {Uri_HOST_DNS,S_OK,FALSE}, + {80,S_OK,FALSE}, + {URL_SCHEME_HTTP,S_OK,FALSE}, + {URLZONE_INVALID,E_NOTIMPL,FALSE} + } + }, + { "\t\t\r\nhttp\n://g\noogle.co\rm/\n\n\n", 0, S_OK, FALSE, + Uri_HAS_ABSOLUTE_URI|Uri_HAS_AUTHORITY|Uri_HAS_DISPLAY_URI|Uri_HAS_DOMAIN| + Uri_HAS_HOST|Uri_HAS_PATH|Uri_HAS_PATH_AND_QUERY|Uri_HAS_RAW_URI| + Uri_HAS_SCHEME_NAME|Uri_HAS_HOST_TYPE|Uri_HAS_PORT|Uri_HAS_SCHEME, + FALSE, + { + {"http://google.com/",S_OK,FALSE}, + {"google.com",S_OK,FALSE}, + {"http://google.com/",S_OK,FALSE}, + {"google.com",S_OK,FALSE}, + {"",S_FALSE,FALSE}, + {"",S_FALSE,FALSE}, + {"google.com",S_OK,FALSE}, + {"",S_FALSE,FALSE}, + {"/",S_OK,FALSE}, + {"/",S_OK,FALSE}, + {"",S_FALSE,FALSE}, + {"http://google.com/",S_OK,FALSE}, + {"http",S_OK,FALSE}, + {"",S_FALSE,FALSE}, + {"",S_FALSE,FALSE} + }, + { + {Uri_HOST_DNS,S_OK,FALSE}, + {80,S_OK,FALSE}, + {URL_SCHEME_HTTP,S_OK,FALSE}, + {URLZONE_INVALID,E_NOTIMPL,FALSE} + } + }, + { "http://g\noogle.co\rm/\n\n\n", Uri_CREATE_NO_PRE_PROCESS_HTML_URI, S_OK, FALSE, + Uri_HAS_ABSOLUTE_URI|Uri_HAS_AUTHORITY|Uri_HAS_DISPLAY_URI|Uri_HAS_DOMAIN| + Uri_HAS_HOST|Uri_HAS_PATH|Uri_HAS_PATH_AND_QUERY|Uri_HAS_RAW_URI| + Uri_HAS_SCHEME_NAME|Uri_HAS_HOST_TYPE|Uri_HAS_PORT|Uri_HAS_SCHEME, + FALSE, + { + {"http://g%0aoogle.co%0dm/%0A%0A%0A",S_OK,FALSE}, + {"g%0aoogle.co%0dm",S_OK,FALSE}, + {"http://g%0aoogle.co%0dm/%0A%0A%0A",S_OK,FALSE}, + {"g%0aoogle.co%0dm",S_OK,FALSE}, + {"",S_FALSE,FALSE}, + {"",S_FALSE,FALSE}, + {"g%0aoogle.co%0dm",S_OK,FALSE}, + {"",S_FALSE,FALSE}, + {"/%0A%0A%0A",S_OK,FALSE}, + {"/%0A%0A%0A",S_OK,FALSE}, + {"",S_FALSE,FALSE}, + {"http://g\noogle.co\rm/\n\n\n",S_OK,FALSE}, + {"http",S_OK,FALSE}, + {"",S_FALSE,FALSE}, + {"",S_FALSE,FALSE} + }, + { + {Uri_HOST_DNS,S_OK,FALSE}, + {80,S_OK,FALSE}, + {URL_SCHEME_HTTP,S_OK,FALSE}, + {URLZONE_INVALID,E_NOTIMPL,FALSE} + } + }, + { "zip://g\noogle.co\rm/\n\n\n", Uri_CREATE_NO_PRE_PROCESS_HTML_URI, S_OK, FALSE, + Uri_HAS_ABSOLUTE_URI|Uri_HAS_AUTHORITY|Uri_HAS_DISPLAY_URI|Uri_HAS_DOMAIN| + Uri_HAS_HOST|Uri_HAS_PATH|Uri_HAS_PATH_AND_QUERY|Uri_HAS_RAW_URI| + Uri_HAS_SCHEME_NAME|Uri_HAS_HOST_TYPE|Uri_HAS_SCHEME, + FALSE, + { + {"zip://g\noogle.co\rm/\n\n\n",S_OK,FALSE}, + {"g\noogle.co\rm",S_OK,FALSE}, + {"zip://g\noogle.co\rm/\n\n\n",S_OK,FALSE}, + {"g\noogle.co\rm",S_OK,FALSE}, + {"",S_FALSE,FALSE}, + {"",S_FALSE,FALSE}, + {"g\noogle.co\rm",S_OK,FALSE}, + {"",S_FALSE,FALSE}, + {"/\n\n\n",S_OK,FALSE}, + {"/\n\n\n",S_OK,FALSE}, + {"",S_FALSE,FALSE}, + {"zip://g\noogle.co\rm/\n\n\n",S_OK,FALSE}, + {"zip",S_OK,FALSE}, + {"",S_FALSE,FALSE}, + {"",S_FALSE,FALSE} + }, + { + {Uri_HOST_DNS,S_OK,FALSE}, + {0,S_FALSE,FALSE}, + {URL_SCHEME_UNKNOWN,S_OK,FALSE}, + {URLZONE_INVALID,E_NOTIMPL,FALSE} + } + } +}; + +typedef struct _invalid_uri { + const char* uri; + DWORD flags; + BOOL todo; +} invalid_uri; + +static const invalid_uri invalid_uri_tests[] = { + /* Has to have a scheme name. */ + {"://www.winehq.org",0,FALSE}, + /* Window's doesn't like URI's which are implicitly file paths without the + * ALLOW_IMPLICIT_FILE_SCHEME flag set. + */ + {"C:/test/test.mp3",0,FALSE}, + {"\\\\Server/test/test.mp3",0,FALSE}, + {"C:/test/test.mp3",Uri_CREATE_ALLOW_IMPLICIT_WILDCARD_SCHEME,FALSE}, + {"\\\\Server/test/test.mp3",Uri_CREATE_ALLOW_RELATIVE,FALSE}, + /* Invalid schemes. */ + {"*abcd://not.valid.com",0,FALSE}, + {"*a*b*c*d://not.valid.com",0,FALSE}, + /* Not allowed to have invalid % encoded data. */ + {"ftp://google.co%XX/",0,FALSE}, + /* To many h16 components. */ + {"http://[1:2:3:4:5:6:7:8:9]",0,FALSE}, + /* Not enough room for IPv4 address. */ + {"http://[1:2:3:4:5:6:7:192.0.1.0]",0,FALSE}, + /* Not enough h16 components. */ + {"http://[1:2:3:4]",0,FALSE}, + /* Not enough components including IPv4. */ + {"http://[1:192.0.1.0]",0,FALSE}, + /* Not allowed to have partial IPv4 in IPv6. */ + {"http://[::192.0]",0,FALSE}, + /* Can't have elision of 1 h16 at beginning of address. */ + {"http://[::2:3:4:5:6:7:8]",0,FALSE}, + /* Can't have elision of 1 h16 at end of address. */ + {"http://[1:2:3:4:5:6:7::]",0,FALSE}, + /* Expects a valid IP Literal. */ + {"ftp://[not.valid.uri]/",0,FALSE}, + /* Expects valid port for a known scheme type. */ + {"ftp://www.winehq.org:123fgh",0,FALSE}, + /* Port exceeds USHORT_MAX for known scheme type. */ + {"ftp://www.winehq.org:65536",0,FALSE}, + /* Invalid port with IPv4 address. */ + {"http://www.winehq.org:1abcd",0,FALSE}, + /* Invalid port with IPv6 address. */ + {"http://[::ffff]:32xy",0,FALSE}, + /* Not allowed to have backslashes with NO_CANONICALIZE. */ + {"gopher://www.google.com\\test",Uri_CREATE_NO_CANONICALIZE,FALSE}, + /* Not allowed to have invalid % encoded data in opaque URI path. */ + {"news:test%XX",0,FALSE}, + {"mailto:wine@winehq%G8.com",0,FALSE}, + /* Known scheme types can't have invalid % encoded data in query string. */ + {"http://google.com/?query=te%xx",0,FALSE}, + /* Invalid % encoded data in fragment of know scheme type. */ + {"ftp://google.com/#Test%xx",0,FALSE}, + {" http://google.com/",Uri_CREATE_NO_PRE_PROCESS_HTML_URI,FALSE}, + {"\n\nhttp://google.com/",Uri_CREATE_NO_PRE_PROCESS_HTML_URI,FALSE} +}; + +typedef struct _uri_equality { + const char* a; + DWORD create_flags_a; + BOOL create_todo_a; + const char* b; + DWORD create_flags_b; + BOOL create_todo_b; + BOOL equal; + BOOL todo; +} uri_equality; + +static const uri_equality equality_tests[] = { + { + "HTTP://www.winehq.org/test dir/./",0,FALSE, + "http://www.winehq.org/test dir/../test dir/",0,FALSE, + TRUE, FALSE + }, + { + /* http://www.winehq.org/test%20dir */ + "http://%77%77%77%2E%77%69%6E%65%68%71%2E%6F%72%67/%74%65%73%74%20%64%69%72",0,FALSE, + "http://www.winehq.org/test dir",0,FALSE, + TRUE, FALSE + }, + { + "c:\\test.mp3",Uri_CREATE_ALLOW_IMPLICIT_FILE_SCHEME,FALSE, + "file:///c:/test.mp3",0,FALSE, + TRUE, FALSE + }, + { + "ftp://ftp.winehq.org/",0,FALSE, + "ftp://ftp.winehq.org",0,FALSE, + TRUE, FALSE + }, + { + "ftp://ftp.winehq.org/test/test2/../../testB/",0,FALSE, + "ftp://ftp.winehq.org/t%45stB/",0,FALSE, + FALSE, FALSE + }, + { + "http://google.com/TEST",0,FALSE, + "http://google.com/test",0,FALSE, + FALSE, FALSE + }, + { + "http://GOOGLE.com/",0,FALSE, + "http://google.com/",0,FALSE, + TRUE, FALSE + }, + /* Performs case insensitive compare of host names (for known scheme types). */ + { + "ftp://GOOGLE.com/",Uri_CREATE_NO_CANONICALIZE,FALSE, + "ftp://google.com/",0,FALSE, + TRUE, FALSE + }, + { + "zip://GOOGLE.com/",0,FALSE, + "zip://google.com/",0,FALSE, + FALSE, FALSE + }, + { + "file:///c:/TEST/TeST/",0,FALSE, + "file:///c:/test/test/",0,FALSE, + TRUE, FALSE + }, + { + "file:///server/TEST",0,FALSE, + "file:///SERVER/TEST",0,FALSE, + TRUE, FALSE + }, + { + "http://google.com",Uri_CREATE_NO_CANONICALIZE,FALSE, + "http://google.com/",0,FALSE, + TRUE, FALSE + }, + { + "ftp://google.com:21/",0,FALSE, + "ftp://google.com/",0,FALSE, + TRUE, FALSE + }, + { + "http://google.com:80/",Uri_CREATE_NO_CANONICALIZE,FALSE, + "http://google.com/",0,FALSE, + TRUE, FALSE + }, + { + "http://google.com:70/",0,FALSE, + "http://google.com:71/",0,FALSE, + FALSE, FALSE + } +}; + +typedef struct _uri_with_fragment { + const char* uri; + const char* fragment; + DWORD create_flags; + HRESULT create_expected; + BOOL create_todo; + + const char* expected_uri; + BOOL expected_todo; +} uri_with_fragment; + +static const uri_with_fragment uri_fragment_tests[] = { + { + "http://google.com/","#fragment",0,S_OK,FALSE, + "http://google.com/#fragment",FALSE + }, + { + "http://google.com/","fragment",0,S_OK,FALSE, + "http://google.com/#fragment",FALSE + }, + { + "zip://test.com/","?test",0,S_OK,FALSE, + "zip://test.com/#?test",FALSE + }, + /* The fragment can be empty. */ + { + "ftp://ftp.google.com/","",0,S_OK,FALSE, + "ftp://ftp.google.com/#",FALSE + } +}; + +typedef struct _uri_builder_property { + BOOL change; + const char *value; + const char *expected_value; + Uri_PROPERTY property; + HRESULT expected; + BOOL todo; +} uri_builder_property; + +typedef struct _uri_builder_port { + BOOL change; + BOOL set; + DWORD value; + HRESULT expected; + BOOL todo; +} uri_builder_port; + +typedef struct _uri_builder_test { + const char *uri; + DWORD create_flags; + HRESULT create_builder_expected; + BOOL create_builder_todo; + + uri_builder_property properties[URI_BUILDER_STR_PROPERTY_COUNT]; + + uri_builder_port port_prop; + + const char *uri_expected; + DWORD uri_flags; + HRESULT uri_hres; + BOOL uri_todo; + + const char *uri_simple_expected; + DWORD uri_simple_encode_flags; + HRESULT uri_simple_hres; + BOOL uri_simple_todo; + + const char *uri_with_expected; + DWORD uri_with_flags; + DWORD uri_with_builder_flags; + DWORD uri_with_encode_flags; + HRESULT uri_with_hres; + BOOL uri_with_todo; +} uri_builder_test; + +static const uri_builder_test uri_builder_tests[] = { + { "http://google.com/",0,S_OK,FALSE, + { + {TRUE,"#fragment",NULL,Uri_PROPERTY_FRAGMENT,S_OK,TRUE}, + {TRUE,"password",NULL,Uri_PROPERTY_PASSWORD,S_OK,TRUE}, + {TRUE,"?query=x",NULL,Uri_PROPERTY_QUERY,S_OK,TRUE}, + {TRUE,"username",NULL,Uri_PROPERTY_USER_NAME,S_OK,TRUE} + }, + {FALSE}, + "http://username:password@google.com/?query=x#fragment",0,S_OK,TRUE, + "http://username:password@google.com/?query=x#fragment",0,S_OK,TRUE, + "http://username:password@google.com/?query=x#fragment",0,0,0,S_OK,TRUE + }, + { "http://google.com/",0,S_OK,FALSE, + { + {TRUE,"test",NULL,Uri_PROPERTY_SCHEME_NAME,S_OK,TRUE} + }, + {TRUE,TRUE,120,S_OK,TRUE}, + "test://google.com:120/",0,S_OK,TRUE, + "test://google.com:120/",0,S_OK,TRUE, + "test://google.com:120/",0,0,0,S_OK,TRUE + }, + { "/Test/test dir",Uri_CREATE_ALLOW_RELATIVE,S_OK,FALSE, + { + {TRUE,"http",NULL,Uri_PROPERTY_SCHEME_NAME,S_OK,TRUE}, + {TRUE,"::192.2.3.4",NULL,Uri_PROPERTY_HOST,S_OK,TRUE}, + {TRUE,NULL,NULL,Uri_PROPERTY_PATH,S_OK,TRUE} + }, + {FALSE}, + "http://[::192.2.3.4]/",0,S_OK,TRUE, + "http://[::192.2.3.4]/",0,S_OK,TRUE, + "http://[::192.2.3.4]/",0,0,0,S_OK,TRUE } }; @@ -2039,6 +3828,123 @@ return ret; } +static inline ULONG get_refcnt(IUri *uri) { + IUri_AddRef(uri); + return IUri_Release(uri); +} + +static void change_property(IUriBuilder *builder, const uri_builder_property *prop, + DWORD test_index) { + HRESULT hr; + LPWSTR valueW; + + valueW = a2w(prop->value); + switch(prop->property) { + case Uri_PROPERTY_FRAGMENT: + hr = IUriBuilder_SetFragment(builder, valueW); + if(prop->todo) { + todo_wine { + ok(hr == prop->expected, + "Error: IUriBuilder_SetFragment returned 0x%08x, expected 0x%08x on uri_builder_tests[%d].\n", + hr, prop->expected, test_index); + } + } else { + ok(hr == prop->expected, + "Error: IUriBuilder_SetFragment returned 0x%08x, expected 0x%08x on uri_builder_tests[%d].\n", + hr, prop->expected, test_index); + } + break; + case Uri_PROPERTY_HOST: + hr = IUriBuilder_SetHost(builder, valueW); + if(prop->todo) { + todo_wine { + ok(hr == prop->expected, + "Error: IUriBuilder_SetHost returned 0x%08x, expected 0x%08x on uri_builder_tests[%d].\n", + hr, prop->expected, test_index); + } + } else { + ok(hr == prop->expected, + "Error: IUriBuilder_SetHost returned 0x%08x, expected 0x%08x on uri_builder_tests[%d].\n", + hr, prop->expected, test_index); + } + break; + case Uri_PROPERTY_PASSWORD: + hr = IUriBuilder_SetPassword(builder, valueW); + if(prop->todo) { + todo_wine { + ok(hr == prop->expected, + "Error: IUriBuilder_SetPassword returned 0x%08x, expected 0x%08x on uri_builder_tests[%d].\n", + hr, prop->expected, test_index); + } + } else { + ok(hr == prop->expected, + "Error: IUriBuilder_SetPassword returned 0x%08x, expected 0x%08x on uri_builder_tests[%d].\n", + hr, prop->expected, test_index); + } + break; + case Uri_PROPERTY_PATH: + hr = IUriBuilder_SetPath(builder, valueW); + if(prop->todo) { + todo_wine { + ok(hr == prop->expected, + "Error: IUriBuilder_SetPath returned 0x%08x, expected 0x%08x on uri_builder_tests[%d].\n", + hr, prop->expected, test_index); + } + } else { + ok(hr == prop->expected, + "Error: IUriBuilder_SetPath returned 0x%08x, expected 0x%08x on uri_builder_tests[%d].\n", + hr, prop->expected, test_index); + } + break; + case Uri_PROPERTY_QUERY: + hr = IUriBuilder_SetQuery(builder, valueW); + if(prop->todo) { + todo_wine { + ok(hr == prop->expected, + "Error: IUriBuilder_SetQuery returned 0x%08x, expected 0x%08x on uri_builder_tests[%d].\n", + hr, prop->expected, test_index); + } + } else { + ok(hr == prop->expected, + "Error: IUriBuilder_SetQuery returned 0x%08x, expected 0x%08x on uri_builder_tests[%d].\n", + hr, prop->expected, test_index); + } + break; + case Uri_PROPERTY_SCHEME_NAME: + hr = IUriBuilder_SetSchemeName(builder, valueW); + if(prop->todo) { + todo_wine { + ok(hr == prop->expected, + "Error: IUriBuilder_SetSchemeName returned 0x%08x, expected 0x%08x on uri_builder_tests[%d].\n", + hr, prop->expected, test_index); + } + } else { + ok(hr == prop->expected, + "Error: IUriBuilder_SetSchemeName returned 0x%08x, expected 0x%08x on uri_builder_tests[%d].\n", + hr, prop->expected, test_index); + } + break; + case Uri_PROPERTY_USER_NAME: + hr = IUriBuilder_SetUserName(builder, valueW); + if(prop->todo) { + todo_wine { + ok(hr == prop->expected, + "Error: IUriBuilder_SetUserName returned 0x%08x, expected 0x%08x on uri_builder_tests[%d].\n", + hr, prop->expected, test_index); + } + } else { + ok(hr == prop->expected, + "Error: IUriBuilder_SetUserName returned 0x%08x, expected 0x%08x on uri_builder_tests[%d].\n", + hr, prop->expected, test_index); + } + break; + default: + trace("Unsupported operation for %d on uri_builder_tests[%d].\n", prop->property, test_index); + } + + heap_free(valueW); +} + /* * Simple tests to make sure the CreateUri function handles invalid flag combinations * correctly. @@ -2051,11 +3957,9 @@ IUri *uri = (void*) 0xdeadbeef; hr = pCreateUri(http_urlW, invalid_flag_tests[i].flags, 0, &uri); - todo_wine { - ok(hr == invalid_flag_tests[i].expected, "Error: CreateUri returned 0x%08x, expected 0x%08x, flags=0x%08x\n", - hr, invalid_flag_tests[i].expected, invalid_flag_tests[i].flags); - } - todo_wine { ok(uri == NULL, "Error: expected the IUri to be NULL, but it was %p instead\n", uri); } + ok(hr == invalid_flag_tests[i].expected, "Error: CreateUri returned 0x%08x, expected 0x%08x, flags=0x%08x\n", + hr, invalid_flag_tests[i].expected, invalid_flag_tests[i].flags); + ok(uri == NULL, "Error: expected the IUri to be NULL, but it was %p instead\n", uri); } } @@ -2171,12 +4075,6 @@ "Expected %s but got %s on uri_tests[%d].str_props[%d].\n", prop.value, wine_dbgstr_w(received), i, j); } - if (hr == E_NOTIMPL) /* no point in continuing */ - { - if(uri) IUri_Release(uri); - heap_free(uriW); - return; - } } else { ok(hr == prop.expected, "GetPropertyBSTR returned 0x%08x, expected 0x%08x. On uri_tests[%d].str_props[%d].\n", hr, prop.expected, i, j); @@ -2249,12 +4147,6 @@ ok(prop.value == received, "Expected %d but got %d on uri_tests[%d].dword_props[%d].\n", prop.value, received, i, j); } - if (hr == E_NOTIMPL) /* no point in continuing */ - { - if(uri) IUri_Release(uri); - heap_free(uriW); - return; - } } else { ok(hr == prop.expected, "GetPropertyDWORD returned 0x%08x, expected 0x%08x. On uri_tests[%d].dword_props[%d].\n", hr, prop.expected, i, j); @@ -2351,7 +4243,6 @@ /* GetAbsoluteUri() tests. */ prop = test.str_props[Uri_PROPERTY_ABSOLUTE_URI]; hr = IUri_GetAbsoluteUri(uri, &received); - if (hr == E_NOTIMPL) goto skip_unimplemented; if(prop.todo) { todo_wine { ok(hr == prop.expected, "Error: GetAbsoluteUri returned 0x%08x, expected 0x%08x on uri_tests[%d].\n", @@ -2477,12 +4368,12 @@ SysFreeString(received); received = NULL; - /* GetPassword() tests. */ - prop = test.str_props[Uri_PROPERTY_PASSWORD]; - hr = IUri_GetPassword(uri, &received); + /* GetHost() tests. */ + prop = test.str_props[Uri_PROPERTY_HOST]; + hr = IUri_GetHost(uri, &received); if(prop.todo) { todo_wine { - ok(hr == prop.expected, "Error: GetPassword returned 0x%08x, expected 0x%08x on uri_tests[%d].\n", + ok(hr == prop.expected, "Error: GetHost returned 0x%08x, expected 0x%08x on uri_tests[%d].\n", hr, prop.expected, i); } todo_wine { @@ -2490,7 +4381,7 @@ prop.value, wine_dbgstr_w(received), i); } } else { - ok(hr == prop.expected, "Error: GetPassword returned 0x%08x, expected 0x%08x on uri_tests[%d].\n", + ok(hr == prop.expected, "Error: GetHost returned 0x%08x, expected 0x%08x on uri_tests[%d].\n", hr, prop.expected, i); ok(!strcmp_aw(prop.value, received), "Error: Expected %s but got %s on uri_tests[%d].\n", prop.value, wine_dbgstr_w(received), i); @@ -2498,13 +4389,12 @@ SysFreeString(received); received = NULL; - skip_unimplemented: - /* GetHost() tests. */ - prop = test.str_props[Uri_PROPERTY_HOST]; - hr = IUri_GetHost(uri, &received); + /* GetPassword() tests. */ + prop = test.str_props[Uri_PROPERTY_PASSWORD]; + hr = IUri_GetPassword(uri, &received); if(prop.todo) { todo_wine { - ok(hr == prop.expected, "Error: GetHost returned 0x%08x, expected 0x%08x on uri_tests[%d].\n", + ok(hr == prop.expected, "Error: GetPassword returned 0x%08x, expected 0x%08x on uri_tests[%d].\n", hr, prop.expected, i); } todo_wine { @@ -2512,7 +4402,7 @@ prop.value, wine_dbgstr_w(received), i); } } else { - ok(hr == prop.expected, "Error: GetHost returned 0x%08x, expected 0x%08x on uri_tests[%d].\n", + ok(hr == prop.expected, "Error: GetPassword returned 0x%08x, expected 0x%08x on uri_tests[%d].\n", hr, prop.expected, i); ok(!strcmp_aw(prop.value, received), "Error: Expected %s but got %s on uri_tests[%d].\n", prop.value, wine_dbgstr_w(received), i); @@ -2725,7 +4615,6 @@ /* GetHostType() tests. */ prop = test.dword_props[Uri_PROPERTY_HOST_TYPE-Uri_PROPERTY_DWORD_START]; hr = IUri_GetHostType(uri, &received); - if (hr == E_NOTIMPL) goto skip_unimplemented; if(prop.todo) { todo_wine { ok(hr == prop.expected, "Error: GetHostType returned 0x%08x, expected 0x%08x on uri_tests[%d].\n", @@ -2741,7 +4630,6 @@ } received = -9999999; - skip_unimplemented: /* GetPort() tests. */ prop = test.dword_props[Uri_PROPERTY_PORT-Uri_PROPERTY_DWORD_START]; hr = IUri_GetPort(uri, &received); @@ -2863,12 +4751,6 @@ "Error: Expected a length of %d but got %d on uri_tests[%d].str_props[%d].\n", expectedLen, receivedLen, i, j); } - if (hr == E_NOTIMPL) /* no point in continuing */ - { - if(uri) IUri_Release(uri); - heap_free(uriW); - return; - } } else { ok(hr == prop.expected, "Error: GetPropertyLength returned 0x%08x, expected 0x%08x on uri_tests[%d].str_props[%d].\n", hr, prop.expected, i, j); @@ -2922,12 +4804,6 @@ todo_wine { ok(hr == S_OK, "Error: GetProperties returned 0x%08x, expected 0x%08x.\n", hr, S_OK); } - if (hr == E_NOTIMPL) /* no point in continuing */ - { - if(uri) IUri_Release(uri); - heap_free(uriW); - return; - } } else { ok(hr == S_OK, "Error: GetProperties returned 0x%08x, expected 0x%08x.\n", hr, S_OK); } @@ -2999,12 +4875,6 @@ ok(hr == S_OK, "Error: HasProperty returned 0x%08x, expected 0x%08x for property %d on uri_tests[%d].\n", hr, S_OK, j, i); } - if (hr == E_NOTIMPL) /* no point in continuing */ - { - if(uri) IUri_Release(uri); - heap_free(uriW); - return; - } /* Check if the property should be true. */ if(test.props & (1 << j)) { @@ -3115,11 +4985,537 @@ } } +static void test_CreateUriWithFragment_InvalidArgs(void) { + HRESULT hr; + IUri *uri = (void*) 0xdeadbeef; + const WCHAR fragmentW[] = {'#','f','r','a','g','m','e','n','t',0}; + + hr = pCreateUriWithFragment(NULL, fragmentW, 0, 0, &uri); + ok(hr == E_INVALIDARG, "Error: CreateUriWithFragment returned 0x%08x, expected 0x%08x.\n", hr, E_INVALIDARG); + ok(uri == NULL, "Error: Expected uri to be NULL, but was %p instead.\n", uri); + + hr = pCreateUriWithFragment(http_urlW, fragmentW, 0, 0, NULL); + ok(hr == E_INVALIDARG, "Error: CreateUriWithFragment returned 0x%08x, expected 0x%08x.\n", hr, E_INVALIDARG); + + /* Original URI can't already contain a fragment component. */ + uri = (void*) 0xdeadbeef; + hr = pCreateUriWithFragment(http_url_fragW, fragmentW, 0, 0, &uri); + ok(hr == E_INVALIDARG, "Error: CreateUriWithFragment returned 0x%08x, expected 0x%08x.\n", hr, E_INVALIDARG); + ok(uri == NULL, "Error: Expected uri to be NULL, but was %p instead.\n", uri); +} + +/* CreateUriWithFragment has the same invalid flag combinations as CreateUri. */ +static void test_CreateUriWithFragment_InvalidFlags(void) { + DWORD i; + + for(i = 0; i < sizeof(invalid_flag_tests)/sizeof(invalid_flag_tests[0]); ++i) { + HRESULT hr; + IUri *uri = (void*) 0xdeadbeef; + + hr = pCreateUriWithFragment(http_urlW, NULL, invalid_flag_tests[i].flags, 0, &uri); + ok(hr == invalid_flag_tests[i].expected, "Error: CreateUriWithFragment returned 0x%08x, expected 0x%08x. flags=0x%08x.\n", + hr, invalid_flag_tests[i].expected, invalid_flag_tests[i].flags); + ok(uri == NULL, "Error: Expected uri to be NULL, but was %p instead.\n", uri); + } +} + +static void test_CreateUriWithFragment(void) { + DWORD i; + + for(i = 0; i < sizeof(uri_fragment_tests)/sizeof(uri_fragment_tests[0]); ++i) { + HRESULT hr; + IUri *uri = NULL; + LPWSTR uriW, fragW; + uri_with_fragment test = uri_fragment_tests[i]; + + uriW = a2w(test.uri); + fragW = a2w(test.fragment); + + hr = pCreateUriWithFragment(uriW, fragW, test.create_flags, 0, &uri); + if(test.expected_todo) { + todo_wine { + ok(hr == test.create_expected, + "Error: CreateUriWithFragment returned 0x%08x, expected 0x%08x on uri_fragment_tests[%d].\n", + hr, test.create_expected, i); + } + } else + ok(hr == test.create_expected, + "Error: CreateUriWithFragment returned 0x%08x, expected 0x%08x on uri_fragment_tests[%d].\n", + hr, test.create_expected, i); + + if(SUCCEEDED(hr)) { + BSTR received = NULL; + + hr = IUri_GetAbsoluteUri(uri, &received); + if(test.expected_todo) { + todo_wine { + ok(hr == S_OK, + "Error: GetAbsoluteUri returned 0x%08x, expected 0x%08x on uri_fragment_tests[%d].\n", + hr, S_OK, i); + } + todo_wine { + ok(!strcmp_aw(test.expected_uri, received), + "Error: Expected %s but got %s on uri_fragment_tests[%d].\n", + test.expected_uri, wine_dbgstr_w(received), i); + } + } else { + ok(hr == S_OK, "Error: GetAbsoluteUri returned 0x%08x, expected 0x%08x on uri_fragment_tests[%d].\n", + hr, S_OK, i); + ok(!strcmp_aw(test.expected_uri, received), "Error: Expected %s but got %s on uri_fragment_tests[%d].\n", + test.expected_uri, wine_dbgstr_w(received), i); + } + + SysFreeString(received); + } + + if(uri) IUri_Release(uri); + heap_free(uriW); + } +} + +static void test_CreateIUriBuilder(void) { + HRESULT hr; + IUriBuilder *builder = NULL; + IUri *uri; + + hr = pCreateIUriBuilder(NULL, 0, 0, NULL); + ok(hr == E_POINTER, "Error: CreateIUriBuilder returned 0x%08x, expected 0x%08x\n", + hr, E_POINTER); + + /* CreateIUriBuilder increases the ref count of the IUri it receives. */ + hr = pCreateUri(http_urlW, 0, 0, &uri); + ok(hr == S_OK, "Error: CreateUri returned 0x%08x, expected 0x%08x.\n", hr, S_OK); + if(SUCCEEDED(hr)) { + ULONG cur_count, orig_count; + + orig_count = get_refcnt(uri); + hr = pCreateIUriBuilder(uri, 0, 0, &builder); + ok(hr == S_OK, "Error: CreateIUriBuilder returned 0x%08x, expected 0x%08x.\n", hr, S_OK); + ok(builder != NULL, "Error: Expecting builder not to be NULL\n"); + + cur_count = get_refcnt(uri); + ok(cur_count == orig_count+1, "Error: Expected the ref count to be %u, but was %u instead.\n", orig_count+1, cur_count); + + if(builder) IUriBuilder_Release(builder); + cur_count = get_refcnt(uri); + ok(cur_count == orig_count, "Error: Expected the ref count to be %u, but was %u instead.\n", orig_count, cur_count); + } + if(uri) IUri_Release(uri); +} + +static void test_IUriBuilder_CreateUri(IUriBuilder *builder, const uri_builder_test *test, + DWORD test_index) { + HRESULT hr; + IUri *uri = NULL; + + hr = IUriBuilder_CreateUri(builder, test->uri_flags, 0, 0, &uri); + if(test->uri_todo) { + todo_wine { + ok(hr == test->uri_hres, + "Error: IUriBuilder_CreateUri returned 0x%08x, expected 0x%08x on uri_builder_tests[%d].\n", + hr, test->uri_hres, test_index); + } + } else { + ok(hr == test->uri_hres, + "Error: IUriBuilder_CreateUri returned 0x%08x, expected 0x%08x on uri_builder_tests[%d].\n", + hr, test->uri_hres, test_index); + } + + if(SUCCEEDED(hr)) { + BSTR received = NULL; + + hr = IUri_GetAbsoluteUri(uri, &received); + ok(hr == S_OK, "Error: IUri_GetAbsoluteUri returned 0x%08x, expected 0x%08x on uri_builder_tests[%d].\n", + hr, S_OK, test_index); + ok(!strcmp_aw(test->uri_expected, received), + "Error: Expected the URI to be %s but was %s instead on uri_builder_tests[%d].\n", + test->uri_expected, wine_dbgstr_w(received), test_index); + SysFreeString(received); + } + if(uri) IUri_Release(uri); +} + +static void test_IUriBuilder_CreateUriSimple(IUriBuilder *builder, const uri_builder_test *test, + DWORD test_index) { + HRESULT hr; + IUri *uri = NULL; + + hr = IUriBuilder_CreateUriSimple(builder, test->uri_simple_encode_flags, 0, &uri); + if(test->uri_todo) { + todo_wine { + ok(hr == test->uri_simple_hres, + "Error: IUriBuilder_CreateUriSimple returned 0x%08x, expected 0x%08x on uri_builder_tests[%d].\n", + hr, test->uri_simple_hres, test_index); + } + } else { + ok(hr == test->uri_simple_hres, + "Error: IUriBuilder_CreateUriSimple returned 0x%08x, expected 0x%08x on uri_builder_tests[%d].\n", + hr, test->uri_simple_hres, test_index); + } + + if(SUCCEEDED(hr)) { + BSTR received = NULL; + + hr = IUri_GetAbsoluteUri(uri, &received); + ok(hr == S_OK, "Error: IUri_GetAbsoluteUri returned 0x%08x, expected 0x%08x on uri_builder_tests[%d].\n", + hr, S_OK, test_index); + ok(!strcmp_aw(test->uri_simple_expected, received), + "Error: Expected the URI to be %s but was %s instead on uri_builder_tests[%d].\n", + test->uri_simple_expected, wine_dbgstr_w(received), test_index); + SysFreeString(received); + } + if(uri) IUri_Release(uri); +} + +static void test_IUriBuilder_CreateUriWithFlags(IUriBuilder *builder, const uri_builder_test *test, + DWORD test_index) { + HRESULT hr; + IUri *uri = NULL; + + hr = IUriBuilder_CreateUriWithFlags(builder, test->uri_with_flags, test->uri_with_builder_flags, + test->uri_with_encode_flags, 0, &uri); + if(test->uri_todo) { + todo_wine { + ok(hr == test->uri_with_hres, + "Error: IUriBuilder_CreateUriWithFlags returned 0x%08x, expected 0x%08x on uri_builder_tests[%d].\n", + hr, test->uri_with_hres, test_index); + } + } else { + ok(hr == test->uri_with_hres, + "Error: IUriBuilder_CreateUriWithFlags returned 0x%08x, expected 0x%08x on uri_builder_tests[%d].\n", + hr, test->uri_with_hres, test_index); + } + + if(SUCCEEDED(hr)) { + BSTR received = NULL; + + hr = IUri_GetAbsoluteUri(uri, &received); + ok(hr == S_OK, "Error: IUri_GetAbsoluteUri returned 0x%08x, expected 0x%08x on uri_builder_tests[%d].\n", + hr, S_OK, test_index); + ok(!strcmp_aw(test->uri_with_expected, received), + "Error: Expected the URI to be %s but was %s instead on uri_builder_tests[%d].\n", + test->uri_with_expected, wine_dbgstr_w(received), test_index); + SysFreeString(received); + } + if(uri) IUri_Release(uri); +} + +static void test_IUriBuilder_CreateInvalidArgs(void) { + IUriBuilder *builder; + HRESULT hr; + + hr = pCreateIUriBuilder(NULL, 0, 0, &builder); + ok(hr == S_OK, "Error: CreateIUriBuilder returned 0x%08x, expected 0x%08x.\n", hr, S_OK); + if(SUCCEEDED(hr)) { + IUri *test = NULL, *uri = (void*) 0xdeadbeef; + + /* Test what happens if the IUriBuilder doesn't have a IUri set. */ + hr = IUriBuilder_CreateUri(builder, 0, 0, 0, &uri); + ok(hr == INET_E_INVALID_URL, "Error: IUriBuilder_CreateUri returned 0x%08x, expected 0x%08x.\n", hr, INET_E_INVALID_URL); + ok(uri == NULL, "Error: Expected uri to be NULL, but was %p instead.\n", uri); + + hr = IUriBuilder_CreateUri(builder, 0, 0, 0, NULL); + ok(hr == E_POINTER, "Error: IUriBuilder_CreateUri returned 0x%08x, expected 0x%08x.\n", hr, E_POINTER); + + uri = (void*) 0xdeadbeef; + hr = IUriBuilder_CreateUri(builder, 0, Uri_HAS_USER_NAME, 0, &uri); + ok(hr == E_NOTIMPL, "Error: IUriBuilder_CreateUri returned 0x%08x, expected 0x%08x.\n", hr, E_NOTIMPL); + ok(uri == NULL, "Error: expected uri to be NULL, but was %p instead.\n", uri); + + uri = (void*) 0xdeadbeef; + hr = IUriBuilder_CreateUriSimple(builder, 0, 0, &uri); + ok(hr == INET_E_INVALID_URL, "Error: IUriBuilder_CreateUriSimple returned 0x%08x, expected 0x%08x.\n", + hr, INET_E_INVALID_URL); + ok(!uri, "Error: Expected uri to be NULL, but was %p instead.\n", uri); + + hr = IUriBuilder_CreateUriSimple(builder, 0, 0, NULL); + ok(hr == E_POINTER, "Error: IUriBuilder_CreateUriSimple returned 0x%08x, expected 0x%08x.\n", + hr, E_POINTER); + + uri = (void*) 0xdeadbeef; + hr = IUriBuilder_CreateUriSimple(builder, Uri_HAS_USER_NAME, 0, &uri); + ok(hr == E_NOTIMPL, "Error: IUriBuilder_CreateUriSimple returned 0x%08x, expected 0x%08x.\n", + hr, E_NOTIMPL); + ok(!uri, "Error: Expected uri to NULL, but was %p instead.\n", uri); + + uri = (void*) 0xdeadbeef; + hr = IUriBuilder_CreateUriWithFlags(builder, 0, 0, 0, 0, &uri); + ok(hr == INET_E_INVALID_URL, + "Error: IUriBuilder_CreateUriWithFlags returned 0x%08x, expected 0x%08x.\n", + hr, INET_E_INVALID_URL); + ok(!uri, "Error: Expected uri to be NULL, but was %p instead.\n", uri); + + hr = IUriBuilder_CreateUriWithFlags(builder, 0, 0, 0, 0, NULL); + ok(hr == E_POINTER, "Error: IUriBuilder_CreateUriWithFlags returned 0x%08x, expected 0x%08x.\n", + hr, E_POINTER); + + uri = (void*) 0xdeadbeef; + hr = IUriBuilder_CreateUriWithFlags(builder, 0, 0, Uri_HAS_USER_NAME, 0, &uri); + ok(hr == E_NOTIMPL, "Error: IUriBuilder_CreateUriWithFlags returned 0x%08x, expected 0x%08x.\n", + hr, E_NOTIMPL); + ok(!uri, "Error: Expected uri to be NULL, but was %p instead.\n", uri); + + hr = pCreateUri(http_urlW, 0, 0, &test); + ok(hr == S_OK, "Error: CreateUri returned 0x%08x, expected 0x%08x.\n", hr, S_OK); + if(SUCCEEDED(hr)) { + hr = IUriBuilder_SetIUri(builder, test); + todo_wine { ok(hr == S_OK, "Error: IUriBuilder_SetIUri returned 0x%08x, expected 0x%08x.\n", hr, S_OK); } + + /* No longer returns E_NOTIMPL, since a IUri has been set and hasn't been modified. */ + uri = NULL; + hr = IUriBuilder_CreateUri(builder, 0, Uri_HAS_USER_NAME, 0, &uri); + todo_wine { + ok(hr == S_OK, "Error: IUriBuilder_CreateUri returned 0x%08x, expected 0x%08x.\n", hr, S_OK); + } + todo_wine { ok(uri != NULL, "Error: The uri was NULL.\n"); } + if(uri) IUri_Release(uri); + + uri = NULL; + hr = IUriBuilder_CreateUriSimple(builder, Uri_HAS_USER_NAME, 0, &uri); + todo_wine { + ok(hr == S_OK, "Error: IUriBuilder_CreateUriSimple returned 0x%08x, expected 0x%08x.\n", + hr, S_OK); + } + todo_wine { ok(uri != NULL, "Error: uri was NULL.\n"); } + if(uri) IUri_Release(uri); + + uri = NULL; + hr = IUriBuilder_CreateUriWithFlags(builder, 0, 0, 0, 0, &uri); + todo_wine { + ok(hr == S_OK, "Error: IUriBuilder_CreateUriWithFlags returned 0x%08x, expected 0x%08x.\n", + hr, S_OK); + } + todo_wine { ok(uri != NULL, "Error: uri was NULL.\n"); } + if(uri) IUri_Release(uri); + + hr = IUriBuilder_SetFragment(builder, NULL); + todo_wine { ok(hr == S_OK, "Error: IUriBuilder_SetFragment returned 0x%08x, expected 0x%08x.\n", hr, S_OK); } + + /* The IUriBuilder is changed, so it returns E_NOTIMPL again. */ + uri = (void*) 0xdeadbeef; + hr = IUriBuilder_CreateUri(builder, 0, Uri_HAS_USER_NAME, 0, &uri); + ok(hr == E_NOTIMPL, "Error: IUriBuilder_CreateUri returned 0x%08x, expected 0x%08x.\n", hr, S_OK); + ok(!uri, "Error: Expected uri to be NULL but was %p instead.\n", uri); + + uri = (void*) 0xdeadbeef; + hr = IUriBuilder_CreateUriSimple(builder, Uri_HAS_USER_NAME, 0, &uri); + ok(hr == E_NOTIMPL, "Error: IUriBuilder_CreateUriSimple returned 0x%08x, expected 0x%08x.\n", + hr, S_OK); + ok(!uri, "Error: Expected uri to be NULL, but was %p instead.\n", uri); + + uri = (void*) 0xdeadbeef; + hr = IUriBuilder_CreateUriWithFlags(builder, 0, 0, Uri_HAS_USER_NAME, 0, &uri); + ok(hr == E_NOTIMPL, "Error: IUriBuilder_CreateUriWithFlags returned 0x%08x, expected 0x%08x.\n", + hr, E_NOTIMPL); + ok(!uri, "Error: Expected uri to be NULL, but was %p instead.\n", uri); + } + if(test) IUri_Release(test); + } + if(builder) IUriBuilder_Release(builder); +} + +/* Tests invalid args to the "Get*" functions. */ +static void test_IUriBuilder_GetInvalidArgs(void) { + IUriBuilder *builder = NULL; + HRESULT hr; + + hr = pCreateIUriBuilder(NULL, 0, 0, &builder); + ok(hr == S_OK, "Error: CreateIUriBuilder returned 0x%08x, expected 0x%08x.\n", hr, S_OK); + if(SUCCEEDED(hr)) { + LPCWSTR received = (void*) 0xdeadbeef; + DWORD len = -1; + + hr = IUriBuilder_GetFragment(builder, NULL, NULL); + ok(hr == E_POINTER, "Error: IUriBuilder_GetFragment returned 0x%08x, expected 0x%08x.\n", + hr, E_POINTER); + hr = IUriBuilder_GetFragment(builder, NULL, &received); + ok(hr == E_POINTER, "Error: IUriBuilder_GetFragment returned 0x%08x, expected 0x%08x.\n", + hr, E_POINTER); + ok(!received, "Error: Expected received to be NULL, but was %p instead.\n", received); + hr = IUriBuilder_GetFragment(builder, &len, NULL); + ok(hr == E_POINTER, "Error: IUriBuilder_GetFragment returned 0x%08x, expected 0x%08x.\n", + hr, E_POINTER); + ok(!len, "Error: Expected len to be 0, but was %d instead.\n", len); + } + if(builder) IUriBuilder_Release(builder); +} + +static void test_IUriBuilder_GetFragment(IUriBuilder *builder, const uri_builder_test *test, + DWORD test_index) { + HRESULT hr; + DWORD i; + LPCWSTR received = NULL; + DWORD len = -1; + const uri_builder_property *prop = NULL; + + /* Check if the property was set earlier. */ + for(i = 0; i < sizeof(test->properties)/sizeof(test->properties[0]); ++i) { + if(test->properties[i].change && test->properties[i].property == Uri_PROPERTY_FRAGMENT) + prop = &(test->properties[i]); + } + + if(prop) { + /* Use expected_value unless it's NULL, then use value. */ + LPCSTR expected = prop->expected_value ? prop->expected_value : prop->value; + hr = IUriBuilder_GetFragment(builder, &len, &received); + if(prop->todo) { + todo_wine { + ok(hr == (expected ? S_OK : S_FALSE), + "Error: IUriBuilder_GetFragment returned 0x%08x, expected 0x%08x on uri_builder_tests[%d].\n", + hr, (expected ? S_OK : S_FALSE), test_index); + } + todo_wine { + ok(!strcmp_aw(expected, received), "Error: Expected %s but got %s on uri_builder_tests[%d].\n", + expected, wine_dbgstr_w(received), test_index); + } + todo_wine { + ok(lstrlen(expected) == len, + "Error: Expected the length to be %d, but was %d instead on uri_builder_tests[%d].\n", + lstrlen(expected), len, test_index); + } + } else { + ok(hr == (expected ? S_OK : S_FALSE), + "Error: IUriBuilder_GetFragment returned 0x%08x, expected 0x%08x on uri_builder_tests[%d].\n", + hr, (expected ? S_OK : S_FALSE), test_index); + ok(!strcmp_aw(expected, received), "Error: Expected %s but got %s on uri_builder_tests[%d].\n", + expected, wine_dbgstr_w(received), test_index); + ok(lstrlen(expected) == len, + "Error: Expected the length to be %d, but was %d instead on uri_builder_tests[%d].\n", + lstrlen(expected), len, test_index); + } + } else { + /* The property wasn't set earlier, so it should return whatever + * the base IUri contains (if anything). + */ + IUri *uri = NULL; + hr = IUriBuilder_GetIUri(builder, &uri); + todo_wine { + ok(hr == S_OK, + "Error: IUriBuilder_GetIUri returned 0x%08x, expected 0x%08x on uri_builder_tests[%d].\n", + hr, S_OK, test_index); + } + if(SUCCEEDED(hr)) { + BOOL has_prop = FALSE; + BSTR expected = NULL; + + hr = IUri_GetFragment(uri, &expected); + ok(SUCCEEDED(hr), + "Error: Expected IUri_GetFragment to succeed, but got 0x%08x instead on uri_builder_tests[%d].\n", + hr, test_index); + has_prop = hr == S_OK; + + hr = IUriBuilder_GetFragment(builder, &len, &received); + if(has_prop) { + todo_wine { + ok(hr == S_OK, + "Error: IUriBuilder_GetFragment returned 0x%08x, expected 0x%08x on uri_builder_tests[%d].\n", + hr, S_OK, test_index); + } + if(SUCCEEDED(hr)) { + todo_wine { + ok(!lstrcmpW(expected, received), + "Error: Expected %s but got %s instead on uri_builder_tests[%d].\n", + wine_dbgstr_w(expected), wine_dbgstr_w(received), test_index); + } + todo_wine { + ok(lstrlenW(expected) == len, + "Error: Expected the length to be %d, but was %d instead on uri_builder_tests[%d].\n", + lstrlenW(expected), len, test_index); + } + } + } else { + todo_wine { + ok(hr == S_FALSE, + "Error: IUriBuilder_GetFragment returned 0x%08x, expected 0x%08x on uri_builder_tests[%d].\n", + hr, S_FALSE, test_index); + } + todo_wine { + ok(!received, "Error: Expected received to be NULL on uri_builder_tests[%d].\n", test_index); + } + todo_wine { + ok(!len, "Error: Expected the length to be 0, but was %d instead on uri_builder_tests[%d].\n", + len, test_index); + } + } + SysFreeString(expected); + } + if(uri) IUri_Release(uri); + } +} + +/* Tests IUriBuilder functions. */ +static void test_IUriBuilder(void) { + HRESULT hr; + IUriBuilder *builder; + DWORD i; + + for(i = 0; i < sizeof(uri_builder_tests)/sizeof(uri_builder_tests[0]); ++i) { + IUri *uri; + uri_builder_test test = uri_builder_tests[i]; + LPWSTR uriW; + + uriW = a2w(test.uri); + hr = pCreateUri(uriW, test.create_flags, 0, &uri); + ok(hr == S_OK, "Error: CreateUri returned 0x%08x, expected 0x%08x on uri_builder_tests[%d].\n", + hr, S_OK, i); + if(SUCCEEDED(hr)) { + hr = pCreateIUriBuilder(uri, 0, 0, &builder); + if(test.create_builder_todo) { + todo_wine { + ok(hr == test.create_builder_expected, + "Error: CreateIUriBuilder returned 0x%08x, expected 0x%08x on uri_builder_tests[%d].\n", + hr, test.create_builder_expected, i); + } + } else { + ok(hr == test.create_builder_expected, + "Error: CreateIUriBuilder returned 0x%08x, expected 0x%08x on uri_builder_tests[%d].\n", + hr, test.create_builder_expected, i); + } + if(SUCCEEDED(hr)) { + DWORD j; + + /* Perform all the string property changes. */ + for(j = 0; j < URI_BUILDER_STR_PROPERTY_COUNT; ++j) { + uri_builder_property prop = test.properties[j]; + if(prop.change) + change_property(builder, &prop, i); + } + + if(test.port_prop.change) { + hr = IUriBuilder_SetPort(builder, test.port_prop.set, test.port_prop.value); + if(test.port_prop.todo) { + todo_wine { + ok(hr == test.port_prop.expected, + "Error: IUriBuilder_SetPort returned 0x%08x, expected 0x%08x on uri_builder_tests[%d].\n", + hr, test.port_prop.expected, i); + } + } else { + ok(hr == test.port_prop.expected, + "Error: IUriBuilder_SetPort returned 0x%08x, expected 0x%08x on uri_builder_tests[%d].\n", + hr, test.port_prop.expected, i); + } + } + + /* Test the "Get*" functions. */ + test_IUriBuilder_GetFragment(builder, &test, i); + + test_IUriBuilder_CreateUri(builder, &test, i); + test_IUriBuilder_CreateUriSimple(builder, &test, i); + test_IUriBuilder_CreateUriWithFlags(builder, &test, i); + } + if(builder) IUriBuilder_Release(builder); + } + if(uri) IUri_Release(uri); + } +} + START_TEST(uri) { HMODULE hurlmon; hurlmon = GetModuleHandle("urlmon.dll"); pCreateUri = (void*) GetProcAddress(hurlmon, "CreateUri"); + pCreateUriWithFragment = (void*) GetProcAddress(hurlmon, "CreateUriWithFragment"); + pCreateIUriBuilder = (void*) GetProcAddress(hurlmon, "CreateIUriBuilder"); if(!pCreateUri) { win_skip("CreateUri is not present, skipping tests.\n"); @@ -3158,4 +5554,25 @@ trace("test IUri_IsEqual...\n"); test_IUri_IsEqual(); + + trace("test CreateUriWithFragment invalid args...\n"); + test_CreateUriWithFragment_InvalidArgs(); + + trace("test CreateUriWithFragment invalid flags...\n"); + test_CreateUriWithFragment_InvalidFlags(); + + trace("test CreateUriWithFragment...\n"); + test_CreateUriWithFragment(); + + trace("test CreateIUriBuilder...\n"); + test_CreateIUriBuilder(); + + trace("test IUriBuilder_CreateInvalidArgs...\n"); + test_IUriBuilder_CreateInvalidArgs(); + + trace("test IUriBuilder...\n"); + test_IUriBuilder(); + + trace("test IUriBuilder_GetInvalidArgs...\n"); + test_IUriBuilder_GetInvalidArgs(); } diff -Nru wine1.3-1.3.0/dlls/urlmon/uri.c wine1.3-1.3.1/dlls/urlmon/uri.c --- wine1.3-1.3.0/dlls/urlmon/uri.c 2010-07-30 18:43:56.000000000 +0100 +++ wine1.3-1.3.1/dlls/urlmon/uri.c 2010-08-20 18:23:50.000000000 +0100 @@ -28,6 +28,8 @@ WINE_DEFAULT_DEBUG_CHANNEL(urlmon); +static const IID IID_IUriObj = {0x4b364760,0x9f51,0x11df,{0x98,0x1c,0x08,0x00,0x20,0x0c,0x9a,0x66}}; + typedef struct { const IUriVtbl *lpIUriVtbl; LONG ref; @@ -53,11 +55,28 @@ USHORT port; BOOL has_port; + + INT authority_start; + DWORD authority_len; + + INT domain_offset; + + INT path_start; + DWORD path_len; + INT extension_offset; + + INT query_start; + DWORD query_len; + + INT fragment_start; + DWORD fragment_len; } Uri; typedef struct { const IUriBuilderVtbl *lpIUriBuilderVtbl; LONG ref; + + IUri *uri; } UriBuilder; typedef struct { @@ -108,6 +127,15 @@ const WCHAR *port; DWORD port_len; USHORT port_value; + + const WCHAR *path; + DWORD path_len; + + const WCHAR *query; + DWORD query_len; + + const WCHAR *fragment; + DWORD fragment_len; } parse_data; static const CHAR hexDigits[] = "0123456789ABCDEF"; @@ -155,6 +183,30 @@ {URL_SCHEME_HTTPS, 443}, }; +/* List of 3 character top level domain names Windows seems to recognize. + * There might be more, but, these are the only ones I've found so far. + */ +static const struct { + WCHAR tld_name[4]; +} recognized_tlds[] = { + {{'c','o','m',0}}, + {{'e','d','u',0}}, + {{'g','o','v',0}}, + {{'i','n','t',0}}, + {{'m','i','l',0}}, + {{'n','e','t',0}}, + {{'o','r','g',0}} +}; + +static Uri *get_uri_obj(IUri *uri) +{ + Uri *ret; + HRESULT hres; + + hres = IUri_QueryInterface(uri, &IID_IUriObj, (void**)&ret); + return SUCCEEDED(hres) ? ret : NULL; +} + static inline BOOL is_alpha(WCHAR val) { return ((val >= 'a' && val <= 'z') || (val >= 'A' && val <= 'Z')); } @@ -237,6 +289,108 @@ (val >= '0' && val <= '9')); } +static inline BOOL is_path_delim(WCHAR val) { + return (!val || val == '#' || val == '?'); +} + +/* Checks if the two Uri's are logically equivalent. It's a simple + * comparison, since they are both of type Uri, and it can access + * the properties of each Uri directly without the need to go + * through the "IUri_Get*" interface calls. + */ +static BOOL are_equal_simple(const Uri *a, const Uri *b) { + if(a->scheme_type == b->scheme_type) { + const BOOL known_scheme = a->scheme_type != URL_SCHEME_UNKNOWN; + const BOOL are_hierarchical = + (a->authority_start > -1 && b->authority_start > -1); + + if(a->scheme_type == URL_SCHEME_FILE) { + if(a->canon_len == b->canon_len) + return !StrCmpIW(a->canon_uri, b->canon_uri); + } + + /* Only compare the scheme names (if any) if their unknown scheme types. */ + if(!known_scheme) { + if((a->scheme_start > -1 && b->scheme_start > -1) && + (a->scheme_len == b->scheme_len)) { + /* Make sure the schemes are the same. */ + if(StrCmpNW(a->canon_uri+a->scheme_start, b->canon_uri+b->scheme_start, a->scheme_len)) + return FALSE; + } else if(a->scheme_len != b->scheme_len) + /* One of the Uri's has a scheme name, while the other doesn't. */ + return FALSE; + } + + /* If they have a userinfo component, perform case sensitive compare. */ + if((a->userinfo_start > -1 && b->userinfo_start > -1) && + (a->userinfo_len == b->userinfo_len)) { + if(StrCmpNW(a->canon_uri+a->userinfo_start, b->canon_uri+b->userinfo_start, a->userinfo_len)) + return FALSE; + } else if(a->userinfo_len != b->userinfo_len) + /* One of the Uri's had a userinfo, while the other one doesn't. */ + return FALSE; + + /* Check if they have a host name. */ + if((a->host_start > -1 && b->host_start > -1) && + (a->host_len == b->host_len)) { + /* Perform a case insensitive compare if they are a known scheme type. */ + if(known_scheme) { + if(StrCmpNIW(a->canon_uri+a->host_start, b->canon_uri+b->host_start, a->host_len)) + return FALSE; + } else if(StrCmpNW(a->canon_uri+a->host_start, b->canon_uri+b->host_start, a->host_len)) + return FALSE; + } else if(a->host_len != b->host_len) + /* One of the Uri's had a host, while the other one didn't. */ + return FALSE; + + if(a->has_port && b->has_port) { + if(a->port != b->port) + return FALSE; + } else if(a->has_port || b->has_port) + /* One had a port, while the other one didn't. */ + return FALSE; + + /* Windows is weird with how it handles paths. For example + * One URI could be "http://google.com" (after canonicalization) + * and one could be "http://google.com/" and the IsEqual function + * would still evaluate to TRUE, but, only if they are both hierarchical + * URIs. + */ + if((a->path_start > -1 && b->path_start > -1) && + (a->path_len == b->path_len)) { + if(StrCmpNW(a->canon_uri+a->path_start, b->canon_uri+b->path_start, a->path_len)) + return FALSE; + } else if(are_hierarchical && a->path_len == -1 && b->path_len == 0) { + if(*(a->canon_uri+a->path_start) != '/') + return FALSE; + } else if(are_hierarchical && b->path_len == 1 && a->path_len == 0) { + if(*(b->canon_uri+b->path_start) != '/') + return FALSE; + } else if(a->path_len != b->path_len) + return FALSE; + + /* Compare the query strings of the two URIs. */ + if((a->query_start > -1 && b->query_start > -1) && + (a->query_len == b->query_len)) { + if(StrCmpNW(a->canon_uri+a->query_start, b->canon_uri+b->query_start, a->query_len)) + return FALSE; + } else if(a->query_len != b->query_len) + return FALSE; + + if((a->fragment_start > -1 && b->fragment_start > -1) && + (a->fragment_len == b->fragment_len)) { + if(StrCmpNW(a->canon_uri+a->fragment_start, b->canon_uri+b->fragment_start, a->fragment_len)) + return FALSE; + } else if(a->fragment_len != b->fragment_len) + return FALSE; + + /* If we get here, the two URIs are equivalent. */ + return TRUE; + } + + return FALSE; +} + /* Computes the size of the given IPv6 address. * Each h16 component is 16bits, if there is an IPv4 address, it's * 32bits. If there's an elision it can be 16bits to 128bits, depending @@ -309,6 +463,214 @@ dest[2] = hexDigits[val & 0xf]; } +/* Scans the range of characters [str, end] and returns the last occurence + * of 'ch' or returns NULL. + */ +static const WCHAR *str_last_of(const WCHAR *str, const WCHAR *end, WCHAR ch) { + const WCHAR *ptr = end; + + while(ptr >= str) { + if(*ptr == ch) + return ptr; + --ptr; + } + + return NULL; +} + +/* Attempts to parse the domain name from the host. + * + * This function also includes the Top-level Domain (TLD) name + * of the host when it tries to find the domain name. If it finds + * a valid domain name it will assign 'domain_start' the offset + * into 'host' where the domain name starts. + * + * It's implied that if a domain name its range is implied to be + * [host+domain_start, host+host_len). + */ +static void find_domain_name(const WCHAR *host, DWORD host_len, + INT *domain_start) { + const WCHAR *last_tld, *sec_last_tld, *end; + + end = host+host_len-1; + + *domain_start = -1; + + /* There has to be at least enough room for a '.' followed by a + * 3 character TLD for a domain to even exist in the host name. + */ + if(host_len < 4) + return; + + last_tld = str_last_of(host, end, '.'); + if(!last_tld) + /* http://hostname -> has no domain name. */ + return; + + sec_last_tld = str_last_of(host, last_tld-1, '.'); + if(!sec_last_tld) { + /* If the '.' is at the beginning of the host there + * has to be at least 3 characters in the TLD for it + * to be valid. + * Ex: .com -> .com as the domain name. + * .co -> has no domain name. + */ + if(last_tld-host == 0) { + if(end-(last_tld-1) < 3) + return; + } else if(last_tld-host == 3) { + DWORD i; + + /* If there's three characters in front of last_tld and + * they are on the list of recognized TLDs, then this + * host doesn't have a domain (since the host only contains + * a TLD name. + * Ex: edu.uk -> has no domain name. + * foo.uk -> foo.uk as the domain name. + */ + for(i = 0; i < sizeof(recognized_tlds)/sizeof(recognized_tlds[0]); ++i) { + if(!StrCmpNIW(host, recognized_tlds[i].tld_name, 3)) + return; + } + } else if(last_tld-host < 3) + /* Anything less then 3 characters is considered part + * of the TLD name. + * Ex: ak.uk -> Has no domain name. + */ + return; + + /* Otherwise the domain name is the whole host name. */ + *domain_start = 0; + } else if(end+1-last_tld > 3) { + /* If the last_tld has more then 3 characters then it's automatically + * considered the TLD of the domain name. + * Ex: www.winehq.org.uk.test -> uk.test as the domain name. + */ + *domain_start = (sec_last_tld+1)-host; + } else if(last_tld - (sec_last_tld+1) < 4) { + DWORD i; + /* If the sec_last_tld is 3 characters long it HAS to be on the list of + * recognized to still be considered part of the TLD name, otherwise + * its considered the domain name. + * Ex: www.google.com.uk -> google.com.uk as the domain name. + * www.google.foo.uk -> foo.uk as the domain name. + */ + if(last_tld - (sec_last_tld+1) == 3) { + for(i = 0; i < sizeof(recognized_tlds)/sizeof(recognized_tlds[0]); ++i) { + if(!StrCmpNIW(sec_last_tld+1, recognized_tlds[i].tld_name, 3)) { + const WCHAR *domain = str_last_of(host, sec_last_tld-1, '.'); + + if(!domain) + *domain_start = 0; + else + *domain_start = (domain+1) - host; + TRACE("Found domain name %s\n", debugstr_wn(host+*domain_start, + (host+host_len)-(host+*domain_start))); + return; + } + } + + *domain_start = (sec_last_tld+1)-host; + } else { + /* Since the sec_last_tld is less then 3 characters it's considered + * part of the TLD. + * Ex: www.google.fo.uk -> google.fo.uk as the domain name. + */ + const WCHAR *domain = str_last_of(host, sec_last_tld-1, '.'); + + if(!domain) + *domain_start = 0; + else + *domain_start = (domain+1) - host; + } + } else { + /* The second to last TLD has more then 3 characters making it + * the domain name. + * Ex: www.google.test.us -> test.us as the domain name. + */ + *domain_start = (sec_last_tld+1)-host; + } + + TRACE("Found domain name %s\n", debugstr_wn(host+*domain_start, + (host+host_len)-(host+*domain_start))); +} + +/* Removes the dot segments from a heirarchical URIs path component. This + * function performs the removal in place. + * + * This is a modified version of Qt's QUrl function "removeDotsFromPath". + * + * This function returns the new length of the path string. + */ +static DWORD remove_dot_segments(WCHAR *path, DWORD path_len) { + WCHAR *out = path; + const WCHAR *in = out; + const WCHAR *end = out + path_len; + DWORD len; + + while(in < end) { + /* A. if the input buffer begins with a prefix of "/./" or "/.", + * where "." is a complete path segment, then replace that + * prefix with "/" in the input buffer; otherwise, + */ + if(in <= end - 3 && in[0] == '/' && in[1] == '.' && in[2] == '/') { + in += 2; + continue; + } else if(in == end - 2 && in[0] == '/' && in[1] == '.') { + *out++ = '/'; + in += 2; + break; + } + + /* B. if the input buffer begins with a prefix of "/../" or "/..", + * where ".." is a complete path segment, then replace that + * prefix with "/" in the input buffer and remove the last + * segment and its preceding "/" (if any) from the output + * buffer; otherwise, + */ + if(in <= end - 4 && in[0] == '/' && in[1] == '.' && in[2] == '.' && in[3] == '/') { + while(out > path && *(--out) != '/'); + + in += 3; + continue; + } else if(in == end - 3 && in[0] == '/' && in[1] == '.' && in[2] == '.') { + while(out > path && *(--out) != '/'); + + if(*out == '/') + ++out; + + in += 3; + break; + } + + /* C. move the first path segment in the input buffer to the end of + * the output buffer, including the initial "/" character (if + * any) and any subsequent characters up to, but not including, + * the next "/" character or the end of the input buffer. + */ + *out++ = *in++; + while(in < end && *in != '/') + *out++ = *in++; + } + + len = out - path; + TRACE("(%p %d): Path after dot segments removed %s len=%d\n", path, path_len, + debugstr_wn(path, len), len); + return len; +} + +/* Attempts to find the file extension in a given path. */ +static INT find_file_extension(const WCHAR *path, DWORD path_len) { + const WCHAR *end; + + for(end = path+path_len-1; end >= path && *end != '/' && *end != '\\'; --end) { + if(*end == '.') + return end-path; + } + + return -1; +} + /* Computes the location where the elision should occur in the IPv6 * address using the numerical values of each component stored in * 'values'. If the address shouldn't contain an elision then 'index' @@ -375,6 +737,45 @@ *count = max_len; } +/* Removes all the leading and trailing white spaces or + * control characters from the URI and removes all control + * characters inside of the URI string. + */ +static BSTR pre_process_uri(LPCWSTR uri) { + BSTR ret; + DWORD len; + const WCHAR *start, *end; + WCHAR *buf, *ptr; + + len = lstrlenW(uri); + + start = uri; + /* Skip leading controls and whitespace. */ + while(iscntrlW(*start) || isspaceW(*start)) ++start; + + end = uri+len-1; + if(start == end) + /* URI consisted only of control/whitespace. */ + ret = SysAllocStringLen(NULL, 0); + else { + while(iscntrlW(*end) || isspaceW(*end)) --end; + + buf = heap_alloc(((end+1)-start)*sizeof(WCHAR)); + if(!buf) + return NULL; + + for(ptr = buf; start < end+1; ++start) { + if(!iscntrlW(*start)) + *ptr++ = *start; + } + + ret = SysAllocStringLen(buf, ptr-buf); + heap_free(buf); + } + + return ret; +} + /* Converts the specified IPv4 address into an uint value. * * This function assumes that the IPv4 address has already been validated. @@ -1330,6 +1731,101 @@ return TRUE; } +/* Attempts to parse the path information of a hierarchical URI. */ +static BOOL parse_path_hierarchical(const WCHAR **ptr, parse_data *data, DWORD flags) { + const WCHAR *start = *ptr; + static const WCHAR slash[] = {'/',0}; + + if(is_path_delim(**ptr)) { + if(data->scheme_type == URL_SCHEME_WILDCARD) { + /* Wildcard schemes don't get a '/' attached if their path is + * empty. + */ + data->path = NULL; + data->path_len = 0; + } else if(!(flags & Uri_CREATE_NO_CANONICALIZE)) { + /* If the path component is empty, then a '/' is added. */ + data->path = slash; + data->path_len = 1; + } + } else { + while(!is_path_delim(**ptr)) { + if(**ptr == '%' && data->scheme_type != URL_SCHEME_UNKNOWN && + data->scheme_type != URL_SCHEME_FILE) { + if(!check_pct_encoded(ptr)) { + *ptr = start; + return FALSE; + } else + continue; + } else if(**ptr == '\\') { + /* Not allowed to have a backslash if NO_CANONICALIZE is set + * and the scheme is known type (but not a file scheme). + */ + if(flags & Uri_CREATE_NO_CANONICALIZE) { + if(data->scheme_type != URL_SCHEME_FILE && + data->scheme_type != URL_SCHEME_UNKNOWN) { + *ptr = start; + return FALSE; + } + } + } + + ++(*ptr); + } + + /* The only time a URI doesn't have a path is when + * the NO_CANONICALIZE flag is set and the raw URI + * didn't contain one. + */ + if(*ptr == start) { + data->path = NULL; + data->path_len = 0; + } else { + data->path = start; + data->path_len = *ptr - start; + } + } + + if(data->path) + TRACE("(%p %p %x): Parsed path %s len=%d\n", ptr, data, flags, + debugstr_wn(data->path, data->path_len), data->path_len); + else + TRACE("(%p %p %x): The URI contained no path\n", ptr, data, flags); + + return TRUE; +} + +/* Parses the path of a opaque URI (much less strict then the parser + * for a hierarchical URI). + * + * NOTE: + * Windows allows invalid % encoded data to appear in opaque URI paths + * for unknown scheme types. + */ +static BOOL parse_path_opaque(const WCHAR **ptr, parse_data *data, DWORD flags) { + const BOOL known_scheme = data->scheme_type != URL_SCHEME_UNKNOWN; + + data->path = *ptr; + + while(!is_path_delim(**ptr)) { + if(**ptr == '%' && known_scheme) { + if(!check_pct_encoded(ptr)) { + *ptr = data->path; + data->path = NULL; + return FALSE; + } else + continue; + } + + ++(*ptr); + } + + data->path_len = *ptr - data->path; + TRACE("(%p %p %x): Parsed opaque URI path %s len=%d\n", ptr, data, flags, + debugstr_wn(data->path, data->path_len), data->path_len); + return TRUE; +} + /* Determines how the URI should be parsed after the scheme information. * * If the scheme is followed, by "//" then, it is treated as an hierarchical URI @@ -1354,6 +1850,8 @@ * (per MSDN documentation). */ static BOOL parse_hierpart(const WCHAR **ptr, parse_data *data, DWORD flags) { + const WCHAR *start = *ptr; + /* Checks if the authority information needs to be parsed. * * Relative URI's aren't hierarchical URI's, but, they could trick @@ -1373,12 +1871,20 @@ TRACE("(%p %p %x): Treating URI as an hierarchical URI.\n", ptr, data, flags); data->is_opaque = FALSE; + if(data->scheme_type == URL_SCHEME_FILE) + /* Skip past the "//" after the scheme (if any). */ + check_hierarchical(ptr); + /* TODO: Handle hierarchical URI's, parse authority then parse the path. */ if(!parse_authority(ptr, data, flags)) return FALSE; - return TRUE; - } + return parse_path_hierarchical(ptr, data, flags); + } else + /* Reset ptr to it's starting position so opaque path parsing + * begins at the correct location. + */ + *ptr = start; } /* If it reaches here, then the URI will be treated as an opaque @@ -1388,7 +1894,87 @@ TRACE("(%p %p %x): Treating URI as an opaque URI.\n", ptr, data, flags); data->is_opaque = TRUE; - /* TODO: Handle opaque URI's, parse path. */ + if(!parse_path_opaque(ptr, data, flags)) + return FALSE; + + return TRUE; +} + +/* Attempts to parse the query string from the URI. + * + * NOTES: + * If NO_DECODE_EXTRA_INFO flag is set, then invalid percent encoded + * data is allowed appear in the query string. For unknown scheme types + * invalid percent encoded data is allowed to appear reguardless. + */ +static BOOL parse_query(const WCHAR **ptr, parse_data *data, DWORD flags) { + const BOOL known_scheme = data->scheme_type != URL_SCHEME_UNKNOWN; + + if(**ptr != '?') { + TRACE("(%p %p %x): URI didn't contain a query string.\n", ptr, data, flags); + return TRUE; + } + + data->query = *ptr; + + ++(*ptr); + while(**ptr && **ptr != '#') { + if(**ptr == '%' && known_scheme && + !(flags & Uri_CREATE_NO_DECODE_EXTRA_INFO)) { + if(!check_pct_encoded(ptr)) { + *ptr = data->query; + data->query = NULL; + return FALSE; + } else + continue; + } + + ++(*ptr); + } + + data->query_len = *ptr - data->query; + + TRACE("(%p %p %x): Parsed query string %s len=%d\n", ptr, data, flags, + debugstr_wn(data->query, data->query_len), data->query_len); + return TRUE; +} + +/* Attempts to parse the fragment from the URI. + * + * NOTES: + * If NO_DECODE_EXTRA_INFO flag is set, then invalid percent encoded + * data is allowed appear in the query string. For unknown scheme types + * invalid percent encoded data is allowed to appear reguardless. + */ +static BOOL parse_fragment(const WCHAR **ptr, parse_data *data, DWORD flags) { + const BOOL known_scheme = data->scheme_type != URL_SCHEME_UNKNOWN; + + if(**ptr != '#') { + TRACE("(%p %p %x): URI didn't contain a fragment.\n", ptr, data, flags); + return TRUE; + } + + data->fragment = *ptr; + + ++(*ptr); + while(**ptr) { + if(**ptr == '%' && known_scheme && + !(flags & Uri_CREATE_NO_DECODE_EXTRA_INFO)) { + if(!check_pct_encoded(ptr)) { + *ptr = data->fragment; + data->fragment = NULL; + return FALSE; + } else + continue; + } + + ++(*ptr); + } + + data->fragment_len = *ptr - data->fragment; + + TRACE("(%p %p %x): Parsed fragment %s len=%d\n", ptr, data, flags, + debugstr_wn(data->fragment, data->fragment_len), data->fragment_len); return TRUE; } @@ -1412,6 +1998,12 @@ if(!parse_hierpart(pptr, data, flags)) return FALSE; + if(!parse_query(pptr, data, flags)) + return FALSE; + + if(!parse_fragment(pptr, data, flags)) + return FALSE; + TRACE("(%p %x): FINISHED PARSING URI.\n", data, flags); return TRUE; } @@ -1590,6 +2182,10 @@ computeOnly, debugstr_wn(uri->canon_uri+uri->host_start, uri->host_len), uri->host_len); + if(!computeOnly) + find_domain_name(uri->canon_uri+uri->host_start, uri->host_len, + &(uri->domain_offset)); + return TRUE; } @@ -1867,6 +2463,7 @@ static BOOL canonicalize_host(const parse_data *data, Uri *uri, DWORD flags, BOOL computeOnly) { uri->host_start = -1; uri->host_len = 0; + uri->domain_offset = -1; if(data->host) { switch(data->host_type) { @@ -1902,8 +2499,9 @@ uri->host_type = Uri_HOST_UNKNOWN; break; default: - WARN("(%p %p %x %d): Canonicalization not supported yet\n", data, - uri, flags, computeOnly); + FIXME("(%p %p %x %d): Canonicalization for host type %d not supported.\n", data, + uri, flags, computeOnly, data->host_type); + return FALSE; } } @@ -1978,6 +2576,9 @@ /* Canonicalizes the authority of the URI represented by the parse_data. */ static BOOL canonicalize_authority(const parse_data *data, Uri *uri, DWORD flags, BOOL computeOnly) { + uri->authority_start = uri->canon_len; + uri->authority_len = 0; + if(!canonicalize_userinfo(data, uri, flags, computeOnly)) return FALSE; @@ -1987,17 +2588,217 @@ if(!canonicalize_port(data, uri, flags, computeOnly)) return FALSE; + if(uri->host_start != -1) + uri->authority_len = uri->canon_len - uri->authority_start; + else + uri->authority_start = -1; + return TRUE; } -/* Determines how the URI represented by the parse_data should be canonicalized. +/* Attempts to canonicalize the path of a hierarchical URI. * - * Essentially, if the parse_data represents an hierarchical URI then it calls - * canonicalize_authority and the canonicalization functions for the path. If the - * URI is opaque it canonicalizes the path of the URI. + * Things that happen: + * 1). Forbidden characters are percent encoded, unless the NO_ENCODE_FORBIDDEN + * flag is set or it's a file URI. Forbidden characters are always encoded + * for file schemes reguardless and forbidden characters are never encoded + * for unknown scheme types. + * + * 2). For known scheme types '\\' are changed to '/'. + * + * 3). Percent encoded, unreserved characters are decoded to their actual values. + * Unless the scheme type is unknown. For file schemes any percent encoded + * character in the unreserved or reserved set is decoded. + * + * 4). For File schemes if the path is starts with a drive letter and doesn't + * start with a '/' then one is appended. + * Ex: file://c:/test.mp3 -> file:///c:/test.mp3 + * + * 5). Dot segments are removed from the path for all scheme types + * unless NO_CANONICALIZE flag is set. Dot segments aren't removed + * for wildcard scheme types. + * + * NOTES: + * file://c:/test%20test -> file:///c:/test%2520test + * file://c:/test%3Etest -> file:///c:/test%253Etest + * file:///c:/test%20test -> file:///c:/test%20test + * file:///c:/test%test -> file:///c:/test%25test */ -static BOOL canonicalize_hierpart(const parse_data *data, Uri *uri, DWORD flags, BOOL computeOnly) { - if(!data->is_opaque) { +static BOOL canonicalize_path_hierarchical(const parse_data *data, Uri *uri, + DWORD flags, BOOL computeOnly) { + const WCHAR *ptr; + const BOOL known_scheme = data->scheme_type != URL_SCHEME_UNKNOWN; + const BOOL is_file = data->scheme_type == URL_SCHEME_FILE; + + BOOL escape_pct = FALSE; + + if(!data->path) { + uri->path_start = -1; + uri->path_len = 0; + return TRUE; + } + + uri->path_start = uri->canon_len; + + /* Check if a '/' needs to be appended for the file scheme. */ + if(is_file) { + if(data->path_len > 1 && is_alpha(*(data->path)) && + *(data->path+1) == ':') { + if(!computeOnly) + uri->canon_uri[uri->canon_len] = '/'; + uri->canon_len++; + escape_pct = TRUE; + } + } + + for(ptr = data->path; ptr < data->path+data->path_len; ++ptr) { + if(*ptr == '%') { + const WCHAR *tmp = ptr; + WCHAR val; + + /* Check if the % represents a valid encoded char, or if it needs encoded. */ + BOOL force_encode = !check_pct_encoded(&tmp) && is_file; + val = decode_pct_val(ptr); + + if(force_encode || escape_pct) { + /* Escape the percent sign in the file URI. */ + if(!computeOnly) + pct_encode_val(*ptr, uri->canon_uri+uri->canon_len); + uri->canon_len += 3; + } else if((is_unreserved(val) && known_scheme) || + (is_file && (is_unreserved(val) || is_reserved(val)))) { + if(!computeOnly) + uri->canon_uri[uri->canon_len] = val; + ++uri->canon_len; + + ptr += 2; + continue; + } else { + if(!computeOnly) + uri->canon_uri[uri->canon_len] = *ptr; + ++uri->canon_len; + } + } else if(*ptr == '\\' && known_scheme) { + if(!computeOnly) + uri->canon_uri[uri->canon_len] = '/'; + ++uri->canon_len; + } else if(known_scheme && !is_unreserved(*ptr) && !is_reserved(*ptr) && + (!(flags & Uri_CREATE_NO_ENCODE_FORBIDDEN_CHARACTERS) || is_file)) { + /* Escape the forbidden character. */ + if(!computeOnly) + pct_encode_val(*ptr, uri->canon_uri+uri->canon_len); + uri->canon_len += 3; + } else { + if(!computeOnly) + uri->canon_uri[uri->canon_len] = *ptr; + ++uri->canon_len; + } + } + + uri->path_len = uri->canon_len - uri->path_start; + + /* Removing the dot segments only happens when it's not in + * computeOnly mode and it's not a wildcard scheme. + */ + if(!computeOnly && data->scheme_type != URL_SCHEME_WILDCARD) { + if(!(flags & Uri_CREATE_NO_CANONICALIZE)) { + /* Remove the dot segments (if any) and reset everything to the new + * correct length. + */ + DWORD new_len = remove_dot_segments(uri->canon_uri+uri->path_start, uri->path_len); + uri->canon_len -= uri->path_len-new_len; + uri->path_len = new_len; + } + } + + if(!computeOnly) + TRACE("Canonicalized path %s len=%d\n", + debugstr_wn(uri->canon_uri+uri->path_start, uri->path_len), + uri->path_len); + + return TRUE; +} + +/* Attempts to canonicalize the path for an opaque URI. + * + * For known scheme types: + * 1) forbidden characters are percent encoded if + * NO_ENCODE_FORBIDDEN_CHARACTERS isn't set. + * + * 2) Percent encoded, unreserved characters are decoded + * to their actual values, for known scheme types. + * + * 3) '\\' are changed to '/' for known scheme types + * except for mailto schemes. + */ +static BOOL canonicalize_path_opaque(const parse_data *data, Uri *uri, DWORD flags, BOOL computeOnly) { + const WCHAR *ptr; + const BOOL known_scheme = data->scheme_type != URL_SCHEME_UNKNOWN; + + if(!data->path) { + uri->path_start = -1; + uri->path_len = 0; + return TRUE; + } + + uri->path_start = uri->canon_len; + + /* Windows doesn't allow a "//" to appear after the scheme + * of a URI, if it's an opaque URI. + */ + if(data->scheme && *(data->path) == '/' && *(data->path+1) == '/') { + /* So it inserts a "/." before the "//" if it exists. */ + if(!computeOnly) { + uri->canon_uri[uri->canon_len] = '/'; + uri->canon_uri[uri->canon_len+1] = '.'; + } + + uri->canon_len += 2; + } + + for(ptr = data->path; ptr < data->path+data->path_len; ++ptr) { + if(*ptr == '%' && known_scheme) { + WCHAR val = decode_pct_val(ptr); + + if(is_unreserved(val)) { + if(!computeOnly) + uri->canon_uri[uri->canon_len] = val; + ++uri->canon_len; + + ptr += 2; + continue; + } else { + if(!computeOnly) + uri->canon_uri[uri->canon_len] = *ptr; + ++uri->canon_len; + } + } else if(known_scheme && !is_unreserved(*ptr) && !is_reserved(*ptr) && + !(flags & Uri_CREATE_NO_ENCODE_FORBIDDEN_CHARACTERS)) { + if(!computeOnly) + pct_encode_val(*ptr, uri->canon_uri+uri->canon_len); + uri->canon_len += 3; + } else { + if(!computeOnly) + uri->canon_uri[uri->canon_len] = *ptr; + ++uri->canon_len; + } + } + + uri->path_len = uri->canon_len - uri->path_start; + + TRACE("(%p %p %x %d): Canonicalized opaque URI path %s len=%d\n", data, uri, flags, computeOnly, + debugstr_wn(uri->canon_uri+uri->path_start, uri->path_len), uri->path_len); + return TRUE; +} + +/* Determines how the URI represented by the parse_data should be canonicalized. + * + * Essentially, if the parse_data represents an hierarchical URI then it calls + * canonicalize_authority and the canonicalization functions for the path. If the + * URI is opaque it canonicalizes the path of the URI. + */ +static BOOL canonicalize_hierpart(const parse_data *data, Uri *uri, DWORD flags, BOOL computeOnly) { + if(!data->is_opaque) { /* "//" is only added for non-wildcard scheme types. */ if(data->scheme_type != URL_SCHEME_WILDCARD) { if(!computeOnly) { @@ -2012,7 +2813,9 @@ if(!canonicalize_authority(data, uri, flags, computeOnly)) return FALSE; - /* TODO: Canonicalize the path of the URI. */ + /* TODO: Canonicalize the path of the URI. */ + if(!canonicalize_path_hierarchical(data, uri, flags, computeOnly)) + return FALSE; } else { /* Opaque URI's don't have an authority. */ @@ -2020,9 +2823,132 @@ uri->userinfo_len = 0; uri->host_start = -1; uri->host_len = 0; + uri->host_type = Uri_HOST_UNKNOWN; uri->has_port = FALSE; + uri->authority_start = -1; + uri->authority_len = 0; + uri->domain_offset = -1; + + if(!canonicalize_path_opaque(data, uri, flags, computeOnly)) + return FALSE; } + if(uri->path_start > -1 && !computeOnly) + /* Finding file extensions happens for both types of URIs. */ + uri->extension_offset = find_file_extension(uri->canon_uri+uri->path_start, uri->path_len); + else + uri->extension_offset = -1; + + return TRUE; +} + +/* Attempts to canonicalize the query string of the URI. + * + * Things that happen: + * 1) For known scheme types forbidden characters + * are percent encoded, unless the NO_DECODE_EXTRA_INFO flag is set + * or NO_ENCODE_FORBIDDEN_CHARACTERS is set. + * + * 2) For known scheme types, percent encoded, unreserved characters + * are decoded as long as the NO_DECODE_EXTRA_INFO flag isn't set. + */ +static BOOL canonicalize_query(const parse_data *data, Uri *uri, DWORD flags, BOOL computeOnly) { + const WCHAR *ptr, *end; + const BOOL known_scheme = data->scheme_type != URL_SCHEME_UNKNOWN; + + if(!data->query) { + uri->query_start = -1; + uri->query_len = 0; + return TRUE; + } + + uri->query_start = uri->canon_len; + + end = data->query+data->query_len; + for(ptr = data->query; ptr < end; ++ptr) { + if(*ptr == '%') { + if(known_scheme && !(flags & Uri_CREATE_NO_DECODE_EXTRA_INFO)) { + WCHAR val = decode_pct_val(ptr); + if(is_unreserved(val)) { + if(!computeOnly) + uri->canon_uri[uri->canon_len] = val; + ++uri->canon_len; + + ptr += 2; + continue; + } + } + } else if(known_scheme && !is_unreserved(*ptr) && !is_reserved(*ptr)) { + if(!(flags & Uri_CREATE_NO_ENCODE_FORBIDDEN_CHARACTERS) && + !(flags & Uri_CREATE_NO_DECODE_EXTRA_INFO)) { + if(!computeOnly) + pct_encode_val(*ptr, uri->canon_uri+uri->canon_len); + uri->canon_len += 3; + continue; + } + } + + if(!computeOnly) + uri->canon_uri[uri->canon_len] = *ptr; + ++uri->canon_len; + } + + uri->query_len = uri->canon_len - uri->query_start; + + if(!computeOnly) + TRACE("(%p %p %x %d): Canonicalized query string %s len=%d\n", data, uri, flags, + computeOnly, debugstr_wn(uri->canon_uri+uri->query_start, uri->query_len), + uri->query_len); + return TRUE; +} + +static BOOL canonicalize_fragment(const parse_data *data, Uri *uri, DWORD flags, BOOL computeOnly) { + const WCHAR *ptr, *end; + const BOOL known_scheme = data->scheme_type != URL_SCHEME_UNKNOWN; + + if(!data->fragment) { + uri->fragment_start = -1; + uri->fragment_len = 0; + return TRUE; + } + + uri->fragment_start = uri->canon_len; + + end = data->fragment + data->fragment_len; + for(ptr = data->fragment; ptr < end; ++ptr) { + if(*ptr == '%') { + if(known_scheme && !(flags & Uri_CREATE_NO_DECODE_EXTRA_INFO)) { + WCHAR val = decode_pct_val(ptr); + if(is_unreserved(val)) { + if(!computeOnly) + uri->canon_uri[uri->canon_len] = val; + ++uri->canon_len; + + ptr += 2; + continue; + } + } + } else if(known_scheme && !is_unreserved(*ptr) && !is_reserved(*ptr)) { + if(!(flags & Uri_CREATE_NO_ENCODE_FORBIDDEN_CHARACTERS) && + !(flags & Uri_CREATE_NO_DECODE_EXTRA_INFO)) { + if(!computeOnly) + pct_encode_val(*ptr, uri->canon_uri+uri->canon_len); + uri->canon_len += 3; + continue; + } + } + + if(!computeOnly) + uri->canon_uri[uri->canon_len] = *ptr; + ++uri->canon_len; + } + + uri->fragment_len = uri->canon_len - uri->fragment_start; + + if(!computeOnly) + TRACE("(%p %p %x %d): Canonicalized fragment %s len=%d\n", data, uri, flags, + computeOnly, debugstr_wn(uri->canon_uri+uri->fragment_start, uri->fragment_len), + uri->fragment_len); return TRUE; } @@ -2088,6 +3014,16 @@ return -1; } + if(!canonicalize_query(data, &uri, flags, TRUE)) { + ERR("(%p %x): Failed to compute query string length.\n", data, flags); + return -1; + } + + if(!canonicalize_fragment(data, &uri, flags, TRUE)) { + ERR("(%p %x): Failed to compute fragment length.\n", data, flags); + return -1; + } + TRACE("(%p %x): Finished computing canonicalized URI length. length=%d\n", data, flags, uri.canon_len); return uri.canon_len; @@ -2121,6 +3057,7 @@ if(!uri->canon_uri) return E_OUTOFMEMORY; + uri->canon_size = len; if(!canonicalize_scheme(data, uri, flags, FALSE)) { ERR("(%p %p %x): Unable to canonicalize the scheme of the URI.\n", data, uri, flags); heap_free(uri->canon_uri); @@ -2134,6 +3071,33 @@ return E_INVALIDARG; } + if(!canonicalize_query(data, uri, flags, FALSE)) { + ERR("(%p %p %x): Unable to canonicalize query string of the URI.\n", + data, uri, flags); + return E_INVALIDARG; + } + + if(!canonicalize_fragment(data, uri, flags, FALSE)) { + ERR("(%p %p %x): Unable to canonicalize fragment of the URI.\n", + data, uri, flags); + return E_INVALIDARG; + } + + /* There's a possibility we didn't use all the space we allocated + * earlier. + */ + if(uri->canon_len < uri->canon_size) { + /* This happens if the URI is hierarchical and dot + * segments were removed from it's path. + */ + WCHAR *tmp = heap_realloc(uri->canon_uri, (uri->canon_len+1)*sizeof(WCHAR)); + if(!tmp) + return E_OUTOFMEMORY; + + uri->canon_uri = tmp; + uri->canon_size = uri->canon_len; + } + uri->canon_uri[uri->canon_len] = '\0'; TRACE("(%p %p %x): finished canonicalizing the URI. uri=%s\n", data, uri, flags, debugstr_w(uri->canon_uri)); @@ -2155,6 +3119,10 @@ }else if(IsEqualGUID(&IID_IUri, riid)) { TRACE("(%p)->(IID_IUri %p)\n", This, ppv); *ppv = URI(This); + }else if(IsEqualGUID(&IID_IUriObj, riid)) { + TRACE("(%p)->(IID_IUriObj %p)\n", This, ppv); + *ppv = This; + return S_OK; }else { TRACE("(%p)->(%s %p)\n", This, debugstr_guid(riid), ppv); *ppv = NULL; @@ -2220,6 +3188,93 @@ } switch(uriProp) { + case Uri_PROPERTY_ABSOLUTE_URI: + *pbstrProperty = SysAllocString(This->canon_uri); + + if(!(*pbstrProperty)) + hres = E_OUTOFMEMORY; + else + hres = S_OK; + + break; + case Uri_PROPERTY_AUTHORITY: + if(This->authority_start > -1) { + *pbstrProperty = SysAllocStringLen(This->canon_uri+This->authority_start, This->authority_len); + hres = S_OK; + } else { + *pbstrProperty = SysAllocStringLen(NULL, 0); + hres = S_FALSE; + } + + if(!(*pbstrProperty)) + hres = E_OUTOFMEMORY; + + break; + case Uri_PROPERTY_DISPLAY_URI: + /* The Display URI contains everything except for the userinfo for known + * scheme types. + */ + if(This->scheme_type != URL_SCHEME_UNKNOWN && This->userinfo_start > -1) { + *pbstrProperty = SysAllocStringLen(NULL, This->canon_len-This->userinfo_len); + + if(*pbstrProperty) { + /* Copy everything before the userinfo over. */ + memcpy(*pbstrProperty, This->canon_uri, This->userinfo_start*sizeof(WCHAR)); + /* Copy everything after the userinfo over. */ + memcpy(*pbstrProperty+This->userinfo_start, + This->canon_uri+This->userinfo_start+This->userinfo_len+1, + (This->canon_len-(This->userinfo_start+This->userinfo_len+1))*sizeof(WCHAR)); + } + } else + *pbstrProperty = SysAllocString(This->canon_uri); + + if(!(*pbstrProperty)) + hres = E_OUTOFMEMORY; + else + hres = S_OK; + + break; + case Uri_PROPERTY_DOMAIN: + if(This->domain_offset > -1) { + *pbstrProperty = SysAllocStringLen(This->canon_uri+This->host_start+This->domain_offset, + This->host_len-This->domain_offset); + hres = S_OK; + } else { + *pbstrProperty = SysAllocStringLen(NULL, 0); + hres = S_FALSE; + } + + if(!(*pbstrProperty)) + hres = E_OUTOFMEMORY; + + break; + case Uri_PROPERTY_EXTENSION: + if(This->extension_offset > -1) { + *pbstrProperty = SysAllocStringLen(This->canon_uri+This->path_start+This->extension_offset, + This->path_len-This->extension_offset); + hres = S_OK; + } else { + *pbstrProperty = SysAllocStringLen(NULL, 0); + hres = S_FALSE; + } + + if(!(*pbstrProperty)) + hres = E_OUTOFMEMORY; + + break; + case Uri_PROPERTY_FRAGMENT: + if(This->fragment_start > -1) { + *pbstrProperty = SysAllocStringLen(This->canon_uri+This->fragment_start, This->fragment_len); + hres = S_OK; + } else { + *pbstrProperty = SysAllocStringLen(NULL, 0); + hres = S_FALSE; + } + + if(!(*pbstrProperty)) + hres = E_OUTOFMEMORY; + + break; case Uri_PROPERTY_HOST: if(This->host_start > -1) { /* The '[' and ']' aren't included for IPv6 addresses. */ @@ -2253,6 +3308,48 @@ return E_OUTOFMEMORY; break; + case Uri_PROPERTY_PATH: + if(This->path_start > -1) { + *pbstrProperty = SysAllocStringLen(This->canon_uri+This->path_start, This->path_len); + hres = S_OK; + } else { + *pbstrProperty = SysAllocStringLen(NULL, 0); + hres = S_FALSE; + } + + if(!(*pbstrProperty)) + hres = E_OUTOFMEMORY; + + break; + case Uri_PROPERTY_PATH_AND_QUERY: + if(This->path_start > -1) { + *pbstrProperty = SysAllocStringLen(This->canon_uri+This->path_start, This->path_len+This->query_len); + hres = S_OK; + } else if(This->query_start > -1) { + *pbstrProperty = SysAllocStringLen(This->canon_uri+This->query_start, This->query_len); + hres = S_OK; + } else { + *pbstrProperty = SysAllocStringLen(NULL, 0); + hres = S_FALSE; + } + + if(!(*pbstrProperty)) + hres = E_OUTOFMEMORY; + + break; + case Uri_PROPERTY_QUERY: + if(This->query_start > -1) { + *pbstrProperty = SysAllocStringLen(This->canon_uri+This->query_start, This->query_len); + hres = S_OK; + } else { + *pbstrProperty = SysAllocStringLen(NULL, 0); + hres = S_FALSE; + } + + if(!(*pbstrProperty)) + hres = E_OUTOFMEMORY; + + break; case Uri_PROPERTY_RAW_URI: *pbstrProperty = SysAllocString(This->raw_uri); if(!(*pbstrProperty)) @@ -2335,6 +3432,44 @@ } switch(uriProp) { + case Uri_PROPERTY_ABSOLUTE_URI: + *pcchProperty = This->canon_len; + hres = S_OK; + break; + case Uri_PROPERTY_AUTHORITY: + *pcchProperty = This->authority_len; + hres = (This->authority_start > -1) ? S_OK : S_FALSE; + break; + case Uri_PROPERTY_DISPLAY_URI: + if(This->scheme_type != URL_SCHEME_UNKNOWN && This->userinfo_start > -1) + *pcchProperty = This->canon_len-This->userinfo_len-1; + else + *pcchProperty = This->canon_len; + + hres = S_OK; + break; + case Uri_PROPERTY_DOMAIN: + if(This->domain_offset > -1) + *pcchProperty = This->host_len - This->domain_offset; + else + *pcchProperty = 0; + + hres = (This->domain_offset > -1) ? S_OK : S_FALSE; + break; + case Uri_PROPERTY_EXTENSION: + if(This->extension_offset > -1) { + *pcchProperty = This->path_len - This->extension_offset; + hres = S_OK; + } else { + *pcchProperty = 0; + hres = S_FALSE; + } + + break; + case Uri_PROPERTY_FRAGMENT: + *pcchProperty = This->fragment_len; + hres = (This->fragment_start > -1) ? S_OK : S_FALSE; + break; case Uri_PROPERTY_HOST: *pcchProperty = This->host_len; @@ -2348,6 +3483,18 @@ *pcchProperty = (This->userinfo_split > -1) ? This->userinfo_len-This->userinfo_split-1 : 0; hres = (This->userinfo_split > -1) ? S_OK : S_FALSE; break; + case Uri_PROPERTY_PATH: + *pcchProperty = This->path_len; + hres = (This->path_start > -1) ? S_OK : S_FALSE; + break; + case Uri_PROPERTY_PATH_AND_QUERY: + *pcchProperty = This->path_len+This->query_len; + hres = (This->path_start > -1 || This->query_start > -1) ? S_OK : S_FALSE; + break; + case Uri_PROPERTY_QUERY: + *pcchProperty = This->query_len; + hres = (This->query_start > -1) ? S_OK : S_FALSE; + break; case Uri_PROPERTY_RAW_URI: *pcchProperty = SysStringLen(This->raw_uri); hres = S_OK; @@ -2398,8 +3545,8 @@ } switch(uriProp) { - case Uri_PROPERTY_SCHEME: - *pcchProperty = This->scheme_type; + case Uri_PROPERTY_HOST_TYPE: + *pcchProperty = This->host_type; hres = S_OK; break; case Uri_PROPERTY_PORT: @@ -2412,6 +3559,10 @@ } break; + case Uri_PROPERTY_SCHEME: + *pcchProperty = This->scheme_type; + hres = S_OK; + break; default: FIXME("(%p)->(%d %p %x)\n", This, uriProp, pcchProperty, dwFlags); hres = E_NOTIMPL; @@ -2423,78 +3574,109 @@ static HRESULT WINAPI Uri_HasProperty(IUri *iface, Uri_PROPERTY uriProp, BOOL *pfHasProperty) { Uri *This = URI_THIS(iface); - FIXME("(%p)->(%d %p)\n", This, uriProp, pfHasProperty); + TRACE("(%p)->(%d %p)\n", This, uriProp, pfHasProperty); if(!pfHasProperty) return E_INVALIDARG; - return E_NOTIMPL; + switch(uriProp) { + case Uri_PROPERTY_ABSOLUTE_URI: + *pfHasProperty = TRUE; + break; + case Uri_PROPERTY_AUTHORITY: + *pfHasProperty = This->authority_start > -1; + break; + case Uri_PROPERTY_DISPLAY_URI: + *pfHasProperty = TRUE; + break; + case Uri_PROPERTY_DOMAIN: + *pfHasProperty = This->domain_offset > -1; + break; + case Uri_PROPERTY_EXTENSION: + *pfHasProperty = This->extension_offset > -1; + break; + case Uri_PROPERTY_FRAGMENT: + *pfHasProperty = This->fragment_start > -1; + break; + case Uri_PROPERTY_HOST: + *pfHasProperty = This->host_start > -1; + break; + case Uri_PROPERTY_PASSWORD: + *pfHasProperty = This->userinfo_split > -1; + break; + case Uri_PROPERTY_PATH: + *pfHasProperty = This->path_start > -1; + break; + case Uri_PROPERTY_PATH_AND_QUERY: + *pfHasProperty = (This->path_start > -1 || This->query_start > -1); + break; + case Uri_PROPERTY_QUERY: + *pfHasProperty = This->query_start > -1; + break; + case Uri_PROPERTY_RAW_URI: + *pfHasProperty = TRUE; + break; + case Uri_PROPERTY_SCHEME_NAME: + *pfHasProperty = This->scheme_start > -1; + break; + case Uri_PROPERTY_USER_INFO: + case Uri_PROPERTY_USER_NAME: + *pfHasProperty = This->userinfo_start > -1; + break; + case Uri_PROPERTY_HOST_TYPE: + *pfHasProperty = TRUE; + break; + case Uri_PROPERTY_PORT: + *pfHasProperty = This->has_port; + break; + case Uri_PROPERTY_SCHEME: + *pfHasProperty = TRUE; + break; + case Uri_PROPERTY_ZONE: + *pfHasProperty = FALSE; + break; + default: + FIXME("(%p)->(%d %p): Unsupported property type.\n", This, uriProp, pfHasProperty); + return E_NOTIMPL; + } + + return S_OK; } static HRESULT WINAPI Uri_GetAbsoluteUri(IUri *iface, BSTR *pstrAbsoluteUri) { - Uri *This = URI_THIS(iface); - FIXME("(%p)->(%p)\n", This, pstrAbsoluteUri); - - if(!pstrAbsoluteUri) - return E_POINTER; - - return E_NOTIMPL; + TRACE("(%p)->(%p)\n", iface, pstrAbsoluteUri); + return Uri_GetPropertyBSTR(iface, Uri_PROPERTY_ABSOLUTE_URI, pstrAbsoluteUri, 0); } static HRESULT WINAPI Uri_GetAuthority(IUri *iface, BSTR *pstrAuthority) { - Uri *This = URI_THIS(iface); - FIXME("(%p)->(%p)\n", This, pstrAuthority); - - if(!pstrAuthority) - return E_POINTER; - - return E_NOTIMPL; + TRACE("(%p)->(%p)\n", iface, pstrAuthority); + return Uri_GetPropertyBSTR(iface, Uri_PROPERTY_AUTHORITY, pstrAuthority, 0); } static HRESULT WINAPI Uri_GetDisplayUri(IUri *iface, BSTR *pstrDisplayUri) { - Uri *This = URI_THIS(iface); - FIXME("(%p)->(%p)\n", This, pstrDisplayUri); - - if(!pstrDisplayUri) - return E_POINTER; - - return E_NOTIMPL; + TRACE("(%p)->(%p)\n", iface, pstrDisplayUri); + return Uri_GetPropertyBSTR(iface, Uri_PROPERTY_DISPLAY_URI, pstrDisplayUri, 0); } static HRESULT WINAPI Uri_GetDomain(IUri *iface, BSTR *pstrDomain) { - Uri *This = URI_THIS(iface); - FIXME("(%p)->(%p)\n", This, pstrDomain); - - if(!pstrDomain) - return E_POINTER; - - return E_NOTIMPL; + TRACE("(%p)->(%p)\n", iface, pstrDomain); + return Uri_GetPropertyBSTR(iface, Uri_PROPERTY_DOMAIN, pstrDomain, 0); } static HRESULT WINAPI Uri_GetExtension(IUri *iface, BSTR *pstrExtension) { - Uri *This = URI_THIS(iface); - FIXME("(%p)->(%p)\n", This, pstrExtension); - - if(!pstrExtension) - return E_POINTER; - - return E_NOTIMPL; + TRACE("(%p)->(%p)\n", iface, pstrExtension); + return Uri_GetPropertyBSTR(iface, Uri_PROPERTY_EXTENSION, pstrExtension, 0); } static HRESULT WINAPI Uri_GetFragment(IUri *iface, BSTR *pstrFragment) { - Uri *This = URI_THIS(iface); - FIXME("(%p)->(%p)\n", This, pstrFragment); - - if(!pstrFragment) - return E_POINTER; - - return E_NOTIMPL; + TRACE("(%p)->(%p)\n", iface, pstrFragment); + return Uri_GetPropertyBSTR(iface, Uri_PROPERTY_FRAGMENT, pstrFragment, 0); } static HRESULT WINAPI Uri_GetHost(IUri *iface, BSTR *pstrHost) @@ -2511,35 +3693,20 @@ static HRESULT WINAPI Uri_GetPath(IUri *iface, BSTR *pstrPath) { - Uri *This = URI_THIS(iface); - FIXME("(%p)->(%p)\n", This, pstrPath); - - if(!pstrPath) - return E_POINTER; - - return E_NOTIMPL; + TRACE("(%p)->(%p)\n", iface, pstrPath); + return Uri_GetPropertyBSTR(iface, Uri_PROPERTY_PATH, pstrPath, 0); } static HRESULT WINAPI Uri_GetPathAndQuery(IUri *iface, BSTR *pstrPathAndQuery) { - Uri *This = URI_THIS(iface); - FIXME("(%p)->(%p)\n", This, pstrPathAndQuery); - - if(!pstrPathAndQuery) - return E_POINTER; - - return E_NOTIMPL; + TRACE("(%p)->(%p)\n", iface, pstrPathAndQuery); + return Uri_GetPropertyBSTR(iface, Uri_PROPERTY_PATH_AND_QUERY, pstrPathAndQuery, 0); } static HRESULT WINAPI Uri_GetQuery(IUri *iface, BSTR *pstrQuery) { - Uri *This = URI_THIS(iface); - FIXME("(%p)->(%p)\n", This, pstrQuery); - - if(!pstrQuery) - return E_POINTER; - - return E_NOTIMPL; + TRACE("(%p)->(%p)\n", iface, pstrQuery); + return Uri_GetPropertyBSTR(iface, Uri_PROPERTY_QUERY, pstrQuery, 0); } static HRESULT WINAPI Uri_GetRawUri(IUri *iface, BSTR *pstrRawUri) @@ -2572,13 +3739,8 @@ static HRESULT WINAPI Uri_GetHostType(IUri *iface, DWORD *pdwHostType) { - Uri *This = URI_THIS(iface); - FIXME("(%p)->(%p)\n", This, pdwHostType); - - if(!pdwHostType) - return E_INVALIDARG; - - return E_NOTIMPL; + TRACE("(%p)->(%p)\n", iface, pdwHostType); + return Uri_GetPropertyDWORD(iface, Uri_PROPERTY_HOST_TYPE, pdwHostType, 0); } static HRESULT WINAPI Uri_GetPort(IUri *iface, DWORD *pdwPort) @@ -2596,33 +3758,58 @@ static HRESULT WINAPI Uri_GetZone(IUri *iface, DWORD *pdwZone) { - Uri *This = URI_THIS(iface); - FIXME("(%p)->(%p)\n", This, pdwZone); - - if(!pdwZone) - return E_INVALIDARG; - - /* Microsoft doesn't seem to have this implemented yet... See - * the comment in Uri_GetPropertyDWORD for more about this. - */ - *pdwZone = URLZONE_INVALID; - return E_NOTIMPL; + TRACE("(%p)->(%p)\n", iface, pdwZone); + return Uri_GetPropertyDWORD(iface, Uri_PROPERTY_ZONE,pdwZone, 0); } static HRESULT WINAPI Uri_GetProperties(IUri *iface, DWORD *pdwProperties) { Uri *This = URI_THIS(iface); - FIXME("(%p)->(%p)\n", This, pdwProperties); + TRACE("(%p)->(%p)\n", This, pdwProperties); if(!pdwProperties) return E_INVALIDARG; - return E_NOTIMPL; + /* All URIs have these. */ + *pdwProperties = Uri_HAS_ABSOLUTE_URI|Uri_HAS_DISPLAY_URI|Uri_HAS_RAW_URI| + Uri_HAS_SCHEME|Uri_HAS_HOST_TYPE; + + if(This->scheme_start > -1) + *pdwProperties |= Uri_HAS_SCHEME_NAME; + + if(This->authority_start > -1) { + *pdwProperties |= Uri_HAS_AUTHORITY; + if(This->userinfo_start > -1) + *pdwProperties |= Uri_HAS_USER_INFO|Uri_HAS_USER_NAME; + if(This->userinfo_split > -1) + *pdwProperties |= Uri_HAS_PASSWORD; + if(This->host_start > -1) + *pdwProperties |= Uri_HAS_HOST; + if(This->domain_offset > -1) + *pdwProperties |= Uri_HAS_DOMAIN; + if(This->has_port) + *pdwProperties |= Uri_HAS_PORT; + } + + if(This->path_start > -1) + *pdwProperties |= Uri_HAS_PATH|Uri_HAS_PATH_AND_QUERY; + if(This->query_start > -1) + *pdwProperties |= Uri_HAS_QUERY|Uri_HAS_PATH_AND_QUERY; + + if(This->extension_offset > -1) + *pdwProperties |= Uri_HAS_EXTENSION; + + if(This->fragment_start > -1) + *pdwProperties |= Uri_HAS_FRAGMENT; + + return S_OK; } static HRESULT WINAPI Uri_IsEqual(IUri *iface, IUri *pUri, BOOL *pfEqual) { Uri *This = URI_THIS(iface); + Uri *other; + TRACE("(%p)->(%p %p)\n", This, pUri, pfEqual); if(!pfEqual) @@ -2635,8 +3822,16 @@ return S_OK; } - FIXME("(%p)->(%p %p)\n", This, pUri, pfEqual); - return E_NOTIMPL; + /* Try to convert it to a Uri (allows for a more simple comparison). */ + if((other = get_uri_obj(pUri))) + *pfEqual = are_equal_simple(This, other); + else { + /* Do it the hard way. */ + FIXME("(%p)->(%p %p) No support for unknown IUri's yet.\n", iface, pUri, pfEqual); + return E_NOTIMPL; + } + + return S_OK; } #undef URI_THIS @@ -2674,9 +3869,35 @@ /*********************************************************************** * CreateUri (urlmon.@) + * + * Creates a new IUri object using the URI represented by pwzURI. This function + * parses and validates the components of pwzURI and then canonicalizes the + * parsed components. + * + * PARAMS + * pwzURI [I] The URI to parse, validate, and canonicalize. + * dwFlags [I] Flags which can affect how the parsing/canonicalization is performed. + * dwReserved [I] Reserved (not used). + * ppURI [O] The resulting IUri after parsing/canonicalization occurs. + * + * RETURNS + * Success: Returns S_OK. ppURI contains the pointer to the newly allocated IUri. + * Failure: E_INVALIDARG if there's invalid flag combinations in dwFlags, or an + * invalid parameters, or pwzURI doesn't represnt a valid URI. + * E_OUTOFMEMORY if any memory allocation fails. + * + * NOTES + * Default flags: + * Uri_CREATE_CANONICALIZE, Uri_CREATE_DECODE_EXTRA_INFO, Uri_CREATE_CRACK_UNKNOWN_SCHEMES, + * Uri_CREATE_PRE_PROCESS_HTML_URI, Uri_CREATE_NO_IE_SETTINGS. */ HRESULT WINAPI CreateUri(LPCWSTR pwzURI, DWORD dwFlags, DWORD_PTR dwReserved, IUri **ppURI) { + const DWORD supported_flags = Uri_CREATE_ALLOW_RELATIVE|Uri_CREATE_ALLOW_IMPLICIT_WILDCARD_SCHEME| + Uri_CREATE_ALLOW_IMPLICIT_FILE_SCHEME|Uri_CREATE_NO_CANONICALIZE|Uri_CREATE_CANONICALIZE| + Uri_CREATE_DECODE_EXTRA_INFO|Uri_CREATE_NO_DECODE_EXTRA_INFO|Uri_CREATE_CRACK_UNKNOWN_SCHEMES| + Uri_CREATE_NO_CRACK_UNKNOWN_SCHEMES|Uri_CREATE_PRE_PROCESS_HTML_URI|Uri_CREATE_NO_PRE_PROCESS_HTML_URI| + Uri_CREATE_NO_IE_SETTINGS|Uri_CREATE_NO_ENCODE_FORBIDDEN_CHARACTERS; Uri *ret; HRESULT hr; parse_data data; @@ -2691,6 +3912,20 @@ return E_INVALIDARG; } + /* Check for invalid flags. */ + if((dwFlags & Uri_CREATE_DECODE_EXTRA_INFO && dwFlags & Uri_CREATE_NO_DECODE_EXTRA_INFO) || + (dwFlags & Uri_CREATE_CANONICALIZE && dwFlags & Uri_CREATE_NO_CANONICALIZE) || + (dwFlags & Uri_CREATE_CRACK_UNKNOWN_SCHEMES && dwFlags & Uri_CREATE_NO_CRACK_UNKNOWN_SCHEMES) || + (dwFlags & Uri_CREATE_PRE_PROCESS_HTML_URI && dwFlags & Uri_CREATE_NO_PRE_PROCESS_HTML_URI) || + (dwFlags & Uri_CREATE_IE_SETTINGS && dwFlags & Uri_CREATE_NO_IE_SETTINGS)) { + *ppURI = NULL; + return E_INVALIDARG; + } + + /* Currently unsupported. */ + if(dwFlags & ~supported_flags) + FIXME("Ignoring unsupported flags %x\n", dwFlags & ~supported_flags); + ret = heap_alloc(sizeof(Uri)); if(!ret) return E_OUTOFMEMORY; @@ -2698,8 +3933,12 @@ ret->lpIUriVtbl = &UriVtbl; ret->ref = 1; - /* Create a copy of pwzURI and store it as the raw_uri. */ - ret->raw_uri = SysAllocString(pwzURI); + /* Pre process the URI, unless told otherwise. */ + if(!(dwFlags & Uri_CREATE_NO_PRE_PROCESS_HTML_URI)) + ret->raw_uri = pre_process_uri(pwzURI); + else + ret->raw_uri = SysAllocString(pwzURI); + if(!ret->raw_uri) { heap_free(ret); return E_OUTOFMEMORY; @@ -2730,6 +3969,80 @@ return S_OK; } +/*********************************************************************** + * CreateUriWithFragment (urlmon.@) + * + * Creates a new IUri object. This is almost the same as CreateUri, expect that + * it allows you to explicitly specify a fragment (pwzFragment) for pwzURI. + * + * PARAMS + * pwzURI [I] The URI to parse and perform canonicalization on. + * pwzFragment [I] The explict fragment string which should be added to pwzURI. + * dwFlags [I] The flags which will be passed to CreateUri. + * dwReserved [I] Reserved (not used). + * ppURI [O] The resulting IUri after parsing/canonicalization. + * + * RETURNS + * Success: S_OK. ppURI contains the pointer to the newly allocated IUri. + * Failure: E_INVALIDARG if pwzURI already contains a fragment and pwzFragment + * isn't NULL. Will also return E_INVALIDARG for the same reasons as + * CreateUri will. E_OUTOFMEMORY if any allocations fail. + */ +HRESULT WINAPI CreateUriWithFragment(LPCWSTR pwzURI, LPCWSTR pwzFragment, DWORD dwFlags, + DWORD_PTR dwReserved, IUri **ppURI) +{ + HRESULT hres; + TRACE("(%s %s %x %x %p)\n", debugstr_w(pwzURI), debugstr_w(pwzFragment), dwFlags, (DWORD)dwReserved, ppURI); + + if(!ppURI) + return E_INVALIDARG; + + if(!pwzURI) { + *ppURI = NULL; + return E_INVALIDARG; + } + + /* Check if a fragment should be appended to the URI string. */ + if(pwzFragment) { + WCHAR *uriW; + DWORD uri_len, frag_len; + BOOL add_pound; + + /* Check if the original URI already has a fragment component. */ + if(StrChrW(pwzURI, '#')) { + *ppURI = NULL; + return E_INVALIDARG; + } + + uri_len = lstrlenW(pwzURI); + frag_len = lstrlenW(pwzFragment); + + /* If the fragment doesn't start with a '#', one will be added. */ + add_pound = *pwzFragment != '#'; + + if(add_pound) + uriW = heap_alloc((uri_len+frag_len+2)*sizeof(WCHAR)); + else + uriW = heap_alloc((uri_len+frag_len+1)*sizeof(WCHAR)); + + if(!uriW) + return E_OUTOFMEMORY; + + memcpy(uriW, pwzURI, uri_len*sizeof(WCHAR)); + if(add_pound) + uriW[uri_len++] = '#'; + memcpy(uriW+uri_len, pwzFragment, (frag_len+1)*sizeof(WCHAR)); + + hres = CreateUri(uriW, dwFlags, 0, ppURI); + + heap_free(uriW); + } else + /* A fragment string wasn't specified, so just forward the call. */ + hres = CreateUri(pwzURI, dwFlags, 0, ppURI); + + return hres; +} + #define URIBUILDER_THIS(iface) DEFINE_THIS(UriBuilder, IUriBuilder, iface) static HRESULT WINAPI UriBuilder_QueryInterface(IUriBuilder *iface, REFIID riid, void **ppv) @@ -2769,8 +4082,10 @@ TRACE("(%p) ref=%d\n", This, ref); - if(!ref) + if(!ref) { + if(This->uri) IUri_Release(This->uri); heap_free(This); + } return ref; } @@ -2781,6 +4096,22 @@ IUri **ppIUri) { UriBuilder *This = URIBUILDER_THIS(iface); + TRACE("(%p)->(%d %d %p)\n", This, dwAllowEncodingPropertyMask, (DWORD)dwReserved, ppIUri); + + if(!ppIUri) + return E_POINTER; + + /* Acts the same way as CreateUri. */ + if(dwAllowEncodingPropertyMask && !This->uri) { + *ppIUri = NULL; + return E_NOTIMPL; + } + + if(!This->uri) { + *ppIUri = NULL; + return INET_E_INVALID_URL; + } + FIXME("(%p)->(%d %d %p)\n", This, dwAllowEncodingPropertyMask, (DWORD)dwReserved, ppIUri); return E_NOTIMPL; } @@ -2792,6 +4123,27 @@ IUri **ppIUri) { UriBuilder *This = URIBUILDER_THIS(iface); + TRACE("(%p)->(0x%08x %d %d %p)\n", This, dwCreateFlags, dwAllowEncodingPropertyMask, (DWORD)dwReserved, ppIUri); + + if(!ppIUri) + return E_POINTER; + + /* The only time it doesn't return E_NOTIMPL when the dwAllow parameter + * has flags set, is when the IUriBuilder has a IUri set and it hasn't + * been modified (a call to a "Set*" hasn't been performed). + * + * TODO: Check if the IUriBuilder's properties have been modified. + */ + if(dwAllowEncodingPropertyMask && !This->uri) { + *ppIUri = NULL; + return E_NOTIMPL; + } + + if(!This->uri) { + *ppIUri = NULL; + return INET_E_INVALID_URL; + } + FIXME("(%p)->(0x%08x %d %d %p)\n", This, dwCreateFlags, dwAllowEncodingPropertyMask, (DWORD)dwReserved, ppIUri); return E_NOTIMPL; } @@ -2804,6 +4156,23 @@ IUri **ppIUri) { UriBuilder *This = URIBUILDER_THIS(iface); + TRACE("(%p)->(0x%08x 0x%08x %d %d %p)\n", This, dwCreateFlags, dwUriBuilderFlags, + dwAllowEncodingPropertyMask, (DWORD)dwReserved, ppIUri); + + if(!ppIUri) + return E_POINTER; + + /* Same as CreateUri. */ + if(dwAllowEncodingPropertyMask && !This->uri) { + *ppIUri = NULL; + return E_NOTIMPL; + } + + if(!This->uri) { + *ppIUri = NULL; + return INET_E_INVALID_URL; + } + FIXME("(%p)->(0x%08x 0x%08x %d %d %p)\n", This, dwCreateFlags, dwUriBuilderFlags, dwAllowEncodingPropertyMask, (DWORD)dwReserved, ppIUri); return E_NOTIMPL; @@ -2826,6 +4195,19 @@ static HRESULT WINAPI UriBuilder_GetFragment(IUriBuilder *iface, DWORD *pcchFragment, LPCWSTR *ppwzFragment) { UriBuilder *This = URIBUILDER_THIS(iface); + TRACE("(%p)->(%p %p)\n", This, pcchFragment, ppwzFragment); + + if(!pcchFragment) { + if(ppwzFragment) + *ppwzFragment = NULL; + return E_POINTER; + } + + if(!ppwzFragment) { + *pcchFragment = 0; + return E_POINTER; + } + FIXME("(%p)->(%p %p)\n", This, pcchFragment, ppwzFragment); return E_NOTIMPL; } @@ -2989,6 +4371,9 @@ TRACE("(%p %x %x %p)\n", pIUri, dwFlags, (DWORD)dwReserved, ppIUriBuilder); + if(!ppIUriBuilder) + return E_POINTER; + ret = heap_alloc(sizeof(UriBuilder)); if(!ret) return E_OUTOFMEMORY; @@ -2996,6 +4381,10 @@ ret->lpIUriBuilderVtbl = &UriBuilderVtbl; ret->ref = 1; + ret->uri = pIUri; + if(pIUri) + IUri_AddRef(pIUri); + *ppIUriBuilder = URIBUILDER(ret); return S_OK; } diff -Nru wine1.3-1.3.0/dlls/urlmon/urlmon.spec wine1.3-1.3.1/dlls/urlmon/urlmon.spec --- wine1.3-1.3.0/dlls/urlmon/urlmon.spec 2010-07-30 18:43:56.000000000 +0100 +++ wine1.3-1.3.1/dlls/urlmon/urlmon.spec 2010-08-20 18:23:50.000000000 +0100 @@ -29,6 +29,7 @@ @ stdcall CreateFormatEnumerator(long ptr ptr) @ stdcall CreateIUriBuilder(ptr long long ptr) @ stdcall CreateUri(wstr long long ptr) +@ stdcall CreateUriWithFragment(wstr wstr long long ptr) @ stdcall CreateURLMoniker(ptr wstr ptr) @ stdcall CreateURLMonikerEx(ptr wstr ptr long) @ stdcall -private DllCanUnloadNow() diff -Nru wine1.3-1.3.0/dlls/user32/button.c wine1.3-1.3.1/dlls/user32/button.c --- wine1.3-1.3.0/dlls/user32/button.c 2010-07-30 18:43:56.000000000 +0100 +++ wine1.3-1.3.1/dlls/user32/button.c 2010-08-20 18:23:50.000000000 +0100 @@ -31,7 +31,6 @@ * Styles * - BS_NOTIFY: is it complete? * - BS_RIGHTBUTTON: same as BS_LEFTTEXT - * - BS_TYPEMASK * * Messages * - WM_CHAR: Checks a (manual or automatic) check box on '+' or '=', clears it on '-' key. @@ -191,7 +190,7 @@ static inline UINT get_button_type( LONG window_style ) { - return (window_style & 0x0f); + return (window_style & BS_TYPEMASK); } /* paint a button of any type */ @@ -273,8 +272,8 @@ /* XP turns a BS_USERBUTTON into BS_PUSHBUTTON */ if (btn_type == BS_USERBUTTON ) { - style = (style & ~0x0f) | BS_PUSHBUTTON; - WIN_SetStyle( hWnd, style, 0x0f & ~style ); + style = (style & ~BS_TYPEMASK) | BS_PUSHBUTTON; + WIN_SetStyle( hWnd, style, BS_TYPEMASK & ~style ); } set_button_state( hWnd, BUTTON_UNCHECKED ); return 0; @@ -459,10 +458,10 @@ break; case BM_SETSTYLE: - if ((wParam & 0x0f) >= MAX_BTN_TYPE) break; - btn_type = wParam & 0x0f; - style = (style & ~0x0f) | btn_type; - WIN_SetStyle( hWnd, style, 0x0f & ~style ); + if ((wParam & BS_TYPEMASK) >= MAX_BTN_TYPE) break; + btn_type = wParam & BS_TYPEMASK; + style = (style & ~BS_TYPEMASK) | btn_type; + WIN_SetStyle( hWnd, style, BS_TYPEMASK & ~style ); /* Only redraw if lParam flag is set.*/ if (lParam) @@ -547,7 +546,7 @@ /* "Convert" pushlike buttons to pushbuttons */ if (style & BS_PUSHLIKE) - style &= ~0x0F; + style &= ~BS_TYPEMASK; if (!(style & BS_MULTILINE)) dtStyle |= DT_SINGLELINE; @@ -988,7 +987,7 @@ { if (!sibling) break; if ((hwnd != sibling) && - ((GetWindowLongW( sibling, GWL_STYLE) & 0x0f) == BS_AUTORADIOBUTTON)) + ((GetWindowLongW( sibling, GWL_STYLE) & BS_TYPEMASK) == BS_AUTORADIOBUTTON)) SendMessageW( sibling, BM_SETCHECK, BUTTON_UNCHECKED, 0 ); sibling = GetNextDlgGroupItem( parent, sibling, FALSE ); } while (sibling != start); diff -Nru wine1.3-1.3.0/dlls/user32/class.c wine1.3-1.3.1/dlls/user32/class.c --- wine1.3-1.3.0/dlls/user32/class.c 2010-07-30 18:43:56.000000000 +0100 +++ wine1.3-1.3.1/dlls/user32/class.c 2010-08-20 18:23:50.000000000 +0100 @@ -1070,6 +1070,12 @@ TRACE("%p %s %p\n", hInstance, debugstr_a(name), wc); + if (!wc) + { + SetLastError( ERROR_NOACCESS ); + return FALSE; + } + if (!hInstance) hInstance = user32_module; if (!IS_INTRESOURCE(name)) @@ -1115,6 +1121,12 @@ TRACE("%p %s %p\n", hInstance, debugstr_w(name), wc); + if (!wc) + { + SetLastError( ERROR_NOACCESS ); + return FALSE; + } + if (!hInstance) hInstance = user32_module; if (!(classPtr = CLASS_FindClass( name, hInstance ))) diff -Nru wine1.3-1.3.0/dlls/user32/cursoricon.c wine1.3-1.3.1/dlls/user32/cursoricon.c --- wine1.3-1.3.0/dlls/user32/cursoricon.c 2010-07-30 18:43:56.000000000 +0100 +++ wine1.3-1.3.1/dlls/user32/cursoricon.c 2010-08-20 18:23:50.000000000 +0100 @@ -1064,8 +1064,6 @@ TRACE("bits %p, bits_size %d\n", bits, bits_size); - if (!bits) return 0; - riff_find_chunk( ANI_ACON_ID, ANI_RIFF_ID, &root_chunk, &ACON_chunk ); if (!ACON_chunk.data) { @@ -1104,6 +1102,7 @@ width, height, depth ); frame_bits = HeapAlloc( GetProcessHeap(), 0, entry->dwDIBSize ); + if (!frame_bits) return 0; memcpy( frame_bits, icon_data + entry->dwDIBOffset, entry->dwDIBSize ); if (!header.width || !header.height) @@ -1142,6 +1141,8 @@ bits, cbSize, dwVersion, width, height, bIcon ? "icon" : "cursor", (cFlag & LR_MONOCHROME) ? "mono" : "" ); + if (!bits) return 0; + if (bIcon) { hotspot.x = width / 2; diff -Nru wine1.3-1.3.0/dlls/user32/message.c wine1.3-1.3.1/dlls/user32/message.c --- wine1.3-1.3.0/dlls/user32/message.c 2010-07-30 18:43:56.000000000 +0100 +++ wine1.3-1.3.1/dlls/user32/message.c 2010-08-20 18:23:50.000000000 +0100 @@ -835,6 +835,7 @@ push_data( data, &data->ps.cis, sizeof(data->ps.cis) ); return 0; } + case WM_WINE_SETWINDOWPOS: case WM_WINDOWPOSCHANGING: case WM_WINDOWPOSCHANGED: { @@ -1015,9 +1016,6 @@ push_data( data, header, header->dbch_size ); return 0; } - case WM_WINE_SETWINDOWPOS: - push_data( data, (WINDOWPOS *)lparam, sizeof(WINDOWPOS) ); - return 0; case WM_WINE_KEYBOARD_LL_HOOK: { struct hook_extra_info *h_extra = (struct hook_extra_info *)lparam; diff -Nru wine1.3-1.3.0/dlls/user32/tests/class.c wine1.3-1.3.1/dlls/user32/tests/class.c --- wine1.3-1.3.0/dlls/user32/tests/class.c 2010-07-30 18:43:56.000000000 +0100 +++ wine1.3-1.3.1/dlls/user32/tests/class.c 2010-08-20 18:23:50.000000000 +0100 @@ -900,10 +900,71 @@ } } +static void test_GetClassInfo(void) +{ + static const WCHAR staticW[] = {'s','t','a','t','i','c',0}; + WNDCLASSA wc; + WNDCLASSEXA wcx; + BOOL ret; + + SetLastError(0xdeadbeef); + ret = GetClassInfoA(0, "static", &wc); + ok(ret, "GetClassInfoA() error %d\n", GetLastError()); + +if (0) { /* crashes under XP */ + SetLastError(0xdeadbeef); + ret = GetClassInfoA(0, "static", NULL); + ok(ret, "GetClassInfoA() error %d\n", GetLastError()); + + SetLastError(0xdeadbeef); + ret = GetClassInfoW(0, staticW, NULL); + ok(ret, "GetClassInfoW() error %d\n", GetLastError()); +} + + wcx.cbSize = sizeof(wcx); + SetLastError(0xdeadbeef); + ret = GetClassInfoExA(0, "static", &wcx); + ok(ret, "GetClassInfoExA() error %d\n", GetLastError()); + + SetLastError(0xdeadbeef); + ret = GetClassInfoExA(0, "static", NULL); + ok(!ret, "GetClassInfoExA() should fail\n"); + ok(GetLastError() == ERROR_NOACCESS || + broken(GetLastError() == 0xdeadbeef), /* win9x */ + "expected ERROR_NOACCESS, got %d\n", GetLastError()); + + SetLastError(0xdeadbeef); + ret = GetClassInfoExW(0, staticW, NULL); + ok(!ret, "GetClassInfoExW() should fail\n"); + ok(GetLastError() == ERROR_NOACCESS || + broken(GetLastError() == 0xdeadbeef) /* NT4 */ || + broken(GetLastError() == ERROR_CALL_NOT_IMPLEMENTED), /* win9x */ + "expected ERROR_NOACCESS, got %d\n", GetLastError()); + + wcx.cbSize = 0; + SetLastError(0xdeadbeef); + ret = GetClassInfoExA(0, "static", &wcx); + ok(ret, "GetClassInfoExA() error %d\n", GetLastError()); + ok(wcx.cbSize == 0, "expected 0, got %u\n", wcx.cbSize); + + wcx.cbSize = sizeof(wcx) - 1; + SetLastError(0xdeadbeef); + ret = GetClassInfoExA(0, "static", &wcx); + ok(ret, "GetClassInfoExA() error %d\n", GetLastError()); + ok(wcx.cbSize == sizeof(wcx) - 1, "expected sizeof(wcx)-1, got %u\n", wcx.cbSize); + + wcx.cbSize = sizeof(wcx) + 1; + SetLastError(0xdeadbeef); + ret = GetClassInfoExA(0, "static", &wcx); + ok(ret, "GetClassInfoExA() error %d\n", GetLastError()); + ok(wcx.cbSize == sizeof(wcx) + 1, "expected sizeof(wcx)+1, got %u\n", wcx.cbSize); +} + START_TEST(class) { HANDLE hInstance = GetModuleHandleA( NULL ); + test_GetClassInfo(); test_extra_values(); if (!GetModuleHandleW(0)) diff -Nru wine1.3-1.3.0/dlls/user32/tests/cursoricon.c wine1.3-1.3.1/dlls/user32/tests/cursoricon.c --- wine1.3-1.3.0/dlls/user32/tests/cursoricon.c 2010-07-30 18:43:56.000000000 +0100 +++ wine1.3-1.3.1/dlls/user32/tests/cursoricon.c 2010-08-20 18:23:50.000000000 +0100 @@ -1005,6 +1005,11 @@ error = GetLastError(); ok(error == 0xdeadbeef, "Last error: %u\n", error); + /* Rejection of NULL pointer crashes at least on WNT4WSSP6, W2KPROSP4, WXPPROSP3 + * + * handle = CreateIconFromResource(NULL, ICON_RES_SIZE, TRUE, 0x00030000); + * ok(handle == NULL, "Invalid pointer accepted (%p)\n", handle); + */ HeapFree(GetProcessHeap(), 0, hotspot); } diff -Nru wine1.3-1.3.0/dlls/user32/tests/win.c wine1.3-1.3.1/dlls/user32/tests/win.c --- wine1.3-1.3.0/dlls/user32/tests/win.c 2010-07-30 18:43:56.000000000 +0100 +++ wine1.3-1.3.1/dlls/user32/tests/win.c 2010-08-20 18:23:50.000000000 +0100 @@ -380,6 +380,15 @@ check_parents( test, desktop, 0, desktop, 0, test, desktop ); /* window is now child of desktop so GWLP_HWNDPARENT changes owner from now on */ + if (!is_win9x) + { + ret = (HWND)SetWindowLongPtrA( test, GWLP_HWNDPARENT, (LONG_PTR)test ); + ok( ret == 0, "GWL_HWNDPARENT return value %p expected 0\n", ret ); + check_parents( test, desktop, 0, desktop, 0, test, desktop ); + } + else + win_skip("Test creates circular window tree under Win9x/WinMe\n" ); + ret = (HWND)SetWindowLongPtrA( test, GWLP_HWNDPARENT, (LONG_PTR)child ); ok( ret == 0, "GWL_HWNDPARENT return value %p expected 0\n", ret ); check_parents( test, desktop, child, desktop, child, test, desktop ); diff -Nru wine1.3-1.3.0/dlls/usp10/shape.c wine1.3-1.3.1/dlls/usp10/shape.c --- wine1.3-1.3.0/dlls/usp10/shape.c 2010-07-30 18:43:56.000000000 +0100 +++ wine1.3-1.3.1/dlls/usp10/shape.c 2010-08-20 18:23:50.000000000 +0100 @@ -37,6 +37,12 @@ #define FIRST_ARABIC_CHAR 0x0600 #define LAST_ARABIC_CHAR 0x06ff +typedef VOID (*ContextualShapingProc)(HDC, ScriptCache*, SCRIPT_ANALYSIS*, + WCHAR*, INT, WORD*, INT*, INT, WORD*); + +static void ContextualShape_Arabic(HDC hdc, ScriptCache *psc, SCRIPT_ANALYSIS *psa, WCHAR* pwcChars, INT cChars, WORD* pwOutGlyphs, INT* pcGlyphs, INT cMaxGlyphs, WORD *pwLogClust); +static void ContextualShape_Syriac(HDC hdc, ScriptCache *psc, SCRIPT_ANALYSIS *psa, WCHAR* pwcChars, INT cChars, WORD* pwOutGlyphs, INT* pcGlyphs, INT cMaxGlyphs, WORD *pwLogClust); + extern const unsigned short wine_shaping_table[]; extern const unsigned short wine_shaping_forms[LAST_ARABIC_CHAR - FIRST_ARABIC_CHAR + 1][4]; @@ -53,7 +59,11 @@ Xn=0, Xr, Xl, - Xm + Xm, + /* Syriac Alaph */ + Afj, + Afn, + Afx }; #ifdef WORDS_BIGENDIAN @@ -219,6 +229,18 @@ GSUB_SubstLookupRecord SubstLookupRecord[1]; }GSUB_ChainContextSubstFormat3_4; +typedef struct { + WORD SubstFormat; /* = 1 */ + WORD Coverage; + WORD AlternateSetCount; + WORD AlternateSet[1]; +} GSUB_AlternateSubstFormat1; + +typedef struct{ + WORD GlyphCount; + WORD Alternate[1]; +} GSUB_AlternateSet; + static INT GSUB_apply_lookup(const GSUB_LookupList* lookup, INT lookup_index, WORD *glyphs, INT glyph_index, INT write_dir, INT *glyph_count); /* the orders of joined_forms and contextual_features need to line up */ @@ -227,18 +249,62 @@ "isol", "fina", "init", - "medi" + "medi", + /* Syriac Alaph */ + "med2", + "fin2", + "fin3" +}; + +static OPENTYPE_FEATURE_RECORD standard_features[] = +{ + { 0x6167696c /*liga*/, 1}, + { 0x67696c63 /*clig*/, 1}, +}; + +static OPENTYPE_FEATURE_RECORD arabic_features[] = +{ + { 0x67696c72 /*rlig*/, 1}, + { 0x746c6163 /*calt*/, 1}, + { 0x6167696c /*liga*/, 1}, + { 0x67696c64 /*dlig*/, 1}, + { 0x68777363 /*cswh*/, 1}, + { 0x7465736d /*mset*/, 1}, +}; + +static OPENTYPE_FEATURE_RECORD hebrew_features[] = +{ + { 0x67696c64 /*dlig*/, 1}, +}; + +static OPENTYPE_FEATURE_RECORD syriac_features[] = +{ + { 0x67696c72 /*rlig*/, 1}, + { 0x746c6163 /*calt*/, 1}, + { 0x6167696c /*liga*/, 1}, + { 0x67696c64 /*dlig*/, 1}, }; -static const char* arabic_GSUB_features[] = +typedef struct ScriptShapeDataTag { + TEXTRANGE_PROPERTIES defaultTextRange; + CHAR otTag[5]; + ContextualShapingProc contextProc; +} ScriptShapeData; + +/* in order of scripts */ +static const ScriptShapeData ShapingData[] = { - "rlig", - "calt", - "liga", - "dlig", - "cswh", - "mset", - NULL + {{ standard_features, 2}, "", NULL}, + {{ standard_features, 2}, "latn", NULL}, + {{ standard_features, 2}, "latn", NULL}, + {{ standard_features, 2}, "latn", NULL}, + {{ standard_features, 2}, "" , NULL}, + {{ standard_features, 2}, "latn", NULL}, + {{ arabic_features, 6}, "arab", ContextualShape_Arabic}, + {{ arabic_features, 6}, "arab", ContextualShape_Arabic}, + {{ hebrew_features, 1}, "hebr", NULL}, + {{ syriac_features, 4}, "syrc", ContextualShape_Syriac}, + {{ arabic_features, 6}, "arab", ContextualShape_Arabic}, }; static INT GSUB_is_glyph_covered(LPCVOID table , UINT glyph) @@ -400,6 +466,38 @@ return GSUB_E_NOGLYPH; } +static INT GSUB_apply_AlternateSubst(const GSUB_LookupTable *look, WORD *glyphs, INT glyph_index, INT write_dir, INT *glyph_count) +{ + int j; + TRACE("Alternate Substitution Subtable\n"); + + for (j = 0; j < GET_BE_WORD(look->SubTableCount); j++) + { + int offset; + const GSUB_AlternateSubstFormat1 *asf1; + INT index; + + offset = GET_BE_WORD(look->SubTable[j]); + asf1 = (const GSUB_AlternateSubstFormat1*)((const BYTE*)look+offset); + offset = GET_BE_WORD(asf1->Coverage); + + index = GSUB_is_glyph_covered((const BYTE*)asf1+offset, glyphs[glyph_index]); + if (index != -1) + { + const GSUB_AlternateSet *as; + offset = GET_BE_WORD(asf1->AlternateSet[index]); + as = (const GSUB_AlternateSet*)((const BYTE*)asf1+offset); + FIXME("%i alternates, picking index 0\n",GET_BE_WORD(as->GlyphCount)); + + TRACE(" Glyph 0x%x ->",glyphs[glyph_index]); + glyphs[glyph_index] = GET_BE_WORD(as->Alternate[0]); + TRACE(" 0x%x\n",glyphs[glyph_index]); + return glyph_index + 1; + } + } + return GSUB_E_NOGLYPH; +} + static INT GSUB_apply_LigatureSubst(const GSUB_LookupTable *look, WORD *glyphs, INT glyph_index, INT write_dir, INT *glyph_count) { int j; @@ -572,6 +670,8 @@ { case 1: return GSUB_apply_SingleSubst(look, glyphs, glyph_index, write_dir, glyph_count); + case 3: + return GSUB_apply_AlternateSubst(look, glyphs, glyph_index, write_dir, glyph_count); case 4: return GSUB_apply_LigatureSubst(look, glyphs, glyph_index, write_dir, glyph_count); case 6: @@ -606,20 +706,8 @@ { UINT charset; - switch (psa->eScript) - { - case Script_Arabic: - return "arab"; - case Script_Syriac: - return "syrc"; - case Script_Hebrew: - return "hebr"; - case Script_Latin: - case Script_Numeric: - case Script_CR: - case Script_LF: - return "latn"; - } + if (ShapingData[psa->eScript].otTag[0] != 0) + return ShapingData[psa->eScript].otTag; /* * fall back to the font charset @@ -646,38 +734,67 @@ } } -static INT apply_GSUB_feature_to_glyph(HDC hdc, SCRIPT_ANALYSIS *psa, void* GSUB_Table, WORD *glyphs, INT index, INT write_dir, INT* glyph_count, const char* feat) +static LPCVOID load_GSUB_feature(HDC hdc, SCRIPT_ANALYSIS *psa, ScriptCache *psc, const char* feat) { - const GSUB_Header *header; - const GSUB_Script *script; - const GSUB_LangSys *language; const GSUB_Feature *feature; + int i; - if (!GSUB_Table) - return GSUB_E_NOFEATURE; + for (i = 0; i < psc->feature_count; i++) + if (strncmp(psc->features[i].tag,feat,4)==0) + return psc->features[i].feature; - header = GSUB_Table; + feature = NULL; - script = GSUB_get_script_table(header, get_opentype_script(hdc,psa)); - if (!script) + if (psc->GSUB_Table) { - TRACE("Script not found\n"); - return GSUB_E_NOFEATURE; - } - language = GSUB_get_lang_table(script, "xxxx"); /* Need to get Lang tag */ - if (!language) - { - TRACE("Language not found\n"); - return GSUB_E_NOFEATURE; + const GSUB_Script *script; + const GSUB_LangSys *language; + + script = GSUB_get_script_table(psc->GSUB_Table, get_opentype_script(hdc,psa)); + if (script) + { + language = GSUB_get_lang_table(script, "xxxx"); /* Need to get Lang tag */ + if (language) + feature = GSUB_get_feature(psc->GSUB_Table, language, feat); + } + + /* try in the default (latin) table */ + if (!feature) + { + script = GSUB_get_script_table(psc->GSUB_Table, "latn"); + if (script) + { + language = GSUB_get_lang_table(script, "xxxx"); /* Need to get Lang tag */ + if (language) + feature = GSUB_get_feature(psc->GSUB_Table, language, feat); + } + } } - feature = GSUB_get_feature(header, language, feat); + + TRACE("Feature %s located at %p\n",debugstr_an(feat,4),feature); + + psc->feature_count++; + + if (psc->features) + psc->features = HeapReAlloc(GetProcessHeap(), 0, psc->features, psc->feature_count * sizeof(LoadedFeature)); + else + psc->features = HeapAlloc(GetProcessHeap(), 0, psc->feature_count * sizeof(LoadedFeature)); + + lstrcpynA(psc->features[psc->feature_count - 1].tag, feat, 5); + psc->features[psc->feature_count - 1].feature = feature; + return feature; +} + +static INT apply_GSUB_feature_to_glyph(HDC hdc, SCRIPT_ANALYSIS *psa, ScriptCache* psc, WORD *glyphs, INT index, INT write_dir, INT* glyph_count, const char* feat) +{ + const GSUB_Feature *feature; + + feature = load_GSUB_feature(hdc, psa, psc, feat); if (!feature) - { - TRACE("%s feature not found\n",feat); return GSUB_E_NOFEATURE; - } + TRACE("applying feature %s\n",feat); - return GSUB_apply_feature(header, feature, glyphs, index, write_dir, glyph_count); + return GSUB_apply_feature(psc->GSUB_Table, feature, glyphs, index, write_dir, glyph_count); } static VOID *load_gsub_table(HDC hdc) @@ -693,49 +810,98 @@ return GSUB_Table; } -static int apply_GSUB_feature(HDC hdc, SCRIPT_ANALYSIS *psa, void* GSUB_Table, WORD *pwOutGlyphs, int write_dir, INT* pcGlyphs, const char* feat) +static void UpdateClusters(int nextIndex, int changeCount, int write_dir, int chars, WORD* pwLogClust ) { - int i; - - if (GSUB_Table) + if (changeCount == 0) + return; + else { - const GSUB_Header *header; - const GSUB_Script *script; - const GSUB_LangSys *language; - const GSUB_Feature *feature; - - if (!GSUB_Table) - return GSUB_E_NOFEATURE; + int i; + int target_glyph = nextIndex - 1; + int target_index = -1; + int replacing_glyph = -1; + int changed = 0; - header = GSUB_Table; + if (write_dir > 0) + for (i = 0; i < chars; i++) + { + if (pwLogClust[i] == target_glyph) + { + target_index = i; + break; + } + } + else + for (i = chars - 1; i >= 0; i--) + { + if (pwLogClust[i] == target_glyph) + { + target_index = i; + break; + } + } + if (target_index == -1) + { + ERR("Unable to find target glyph\n"); + return; + } - script = GSUB_get_script_table(header, get_opentype_script(hdc,psa)); - if (!script) + if (changeCount < 0) { - TRACE("Script not found\n"); - return GSUB_E_NOFEATURE; + /* merge glyphs */ + for(i = target_index; i < chars && i >= 0; i+=write_dir) + { + if (pwLogClust[i] == target_glyph) + continue; + if(pwLogClust[i] == replacing_glyph) + pwLogClust[i] = target_glyph; + else + { + changed--; + if (changed >= changeCount) + { + replacing_glyph = pwLogClust[i]; + pwLogClust[i] = target_glyph; + } + else + break; + } + } } - language = GSUB_get_lang_table(script, "xxxx"); - if (!language) + + /* renumber trailing indexes*/ + for(i = target_index; i < chars && i >= 0; i+=write_dir) { - TRACE("Language not found\n"); - return GSUB_E_NOFEATURE; + if (pwLogClust[i] != target_glyph) + pwLogClust[i] += changeCount; } - feature = GSUB_get_feature(header, language, feat); + } +} + +static int apply_GSUB_feature(HDC hdc, SCRIPT_ANALYSIS *psa, ScriptCache* psc, WORD *pwOutGlyphs, int write_dir, INT* pcGlyphs, INT cChars, const char* feat, WORD *pwLogClust ) +{ + int i; + + if (psc->GSUB_Table) + { + const GSUB_Feature *feature; + + feature = load_GSUB_feature(hdc, psa, psc, feat); if (!feature) - { - TRACE("%s feature not found\n",feat); return GSUB_E_NOFEATURE; - } i = 0; - TRACE("applying feature %s\n",feat); + TRACE("applying feature %s\n",debugstr_an(feat,4)); while(i < *pcGlyphs) { INT nextIndex; - nextIndex = GSUB_apply_feature(header, feature, pwOutGlyphs, i, write_dir, pcGlyphs); + INT prevCount = *pcGlyphs; + nextIndex = GSUB_apply_feature(psc->GSUB_Table, feature, pwOutGlyphs, i, write_dir, pcGlyphs); if (nextIndex > GSUB_E_NOGLYPH) + { + UpdateClusters(nextIndex, *pcGlyphs - prevCount, write_dir, cChars, pwLogClust); i = nextIndex; + } else i++; } @@ -744,6 +910,18 @@ return GSUB_E_NOFEATURE; } +static WCHAR neighbour_char(int i, int delta, const WCHAR* chars, INT cchLen) +{ + if (i + delta < 0) + return 0; + if ( i+ delta >= cchLen) + return 0; + + i += delta; + + return chars[i]; +} + static CHAR neighbour_joining_type(int i, int delta, const CHAR* context_type, INT cchLen, SCRIPT_ANALYSIS *psa) { if (i + delta < 0) @@ -779,25 +957,30 @@ return (joining_type == jtR || joining_type == jtD || joining_type == jtC); } -/* SHAPE_ShapeArabicGlyphs +static inline BOOL word_break_causing(WCHAR chr) +{ + /* we are working within a string of characters already guareented to + be within one script, Syriac, so we do not worry about any characers + other than the space character outside of that range */ + return (chr == 0 || chr == 0x20 ); +} + +/* + * ContextualShape_Arabic */ -void SHAPE_ShapeArabicGlyphs(HDC hdc, ScriptCache *psc, SCRIPT_ANALYSIS *psa, WCHAR* pwcChars, INT cChars, WORD* pwOutGlyphs, INT* pcGlyphs, INT cMaxGlyphs) +static void ContextualShape_Arabic(HDC hdc, ScriptCache *psc, SCRIPT_ANALYSIS *psa, WCHAR* pwcChars, INT cChars, WORD* pwOutGlyphs, INT* pcGlyphs, INT cMaxGlyphs, WORD *pwLogClust) { CHAR *context_type; INT *context_shape; INT dirR, dirL; int i; - if (psa->eScript != Script_Arabic) - return; - if (*pcGlyphs != cChars) { ERR("Number of Glyphs and Chars need to match at the beginning\n"); return; } - if (!psa->fLogicalOrder && psa->fRTL) { dirR = 1; @@ -843,9 +1026,13 @@ if (psc->GSUB_Table) { INT nextIndex; - nextIndex = apply_GSUB_feature_to_glyph(hdc, psa, psc->GSUB_Table, pwOutGlyphs, i, dirL, pcGlyphs, contextual_features[context_shape[i]]); + INT prevCount = *pcGlyphs; + nextIndex = apply_GSUB_feature_to_glyph(hdc, psa, psc, pwOutGlyphs, i, dirL, pcGlyphs, contextual_features[context_shape[i]]); if (nextIndex > GSUB_E_NOGLYPH) + { i = nextIndex; + UpdateClusters(nextIndex, *pcGlyphs - prevCount, dirL, cChars, pwLogClust); + } shaped = (nextIndex > GSUB_E_NOGLYPH); } @@ -863,13 +1050,138 @@ } } + HeapFree(GetProcessHeap(),0,context_shape); + HeapFree(GetProcessHeap(),0,context_type); +} + +/* + * ContextualShape_Syriac + */ + +#define ALAPH 0x710 +#define DALATH 0x715 +#define RISH 0x72A + +static void ContextualShape_Syriac(HDC hdc, ScriptCache *psc, SCRIPT_ANALYSIS *psa, WCHAR* pwcChars, INT cChars, WORD* pwOutGlyphs, INT* pcGlyphs, INT cMaxGlyphs, WORD *pwLogClust) +{ + CHAR *context_type; + INT *context_shape; + INT dirR, dirL; + int i; + + if (*pcGlyphs != cChars) + { + ERR("Number of Glyphs and Chars need to match at the beginning\n"); + return; + } + + if (!psa->fLogicalOrder && psa->fRTL) + { + dirR = 1; + dirL = -1; + } + else + { + dirR = -1; + dirL = 1; + } + + if (!psc->GSUB_Table) + psc->GSUB_Table = load_gsub_table(hdc); + + if (!psc->GSUB_Table) + return; + + context_type = HeapAlloc(GetProcessHeap(),0,cChars); + context_shape = HeapAlloc(GetProcessHeap(),0,sizeof(INT) * cChars); + + for (i = 0; i < cChars; i++) + context_type[i] = wine_shaping_table[wine_shaping_table[pwcChars[i] >> 8] + (pwcChars[i] & 0xff)]; + + for (i = 0; i < cChars; i++) + { + if (pwcChars[i] == ALAPH) + { + WCHAR rchar = neighbour_char(i,dirR,pwcChars,cChars); + + if (left_join_causing(neighbour_joining_type(i,dirR,context_type,cChars,psa)) && word_break_causing(neighbour_char(i,dirL,pwcChars,cChars))) + context_shape[i] = Afj; + else if ( rchar != DALATH && rchar != RISH && +!left_join_causing(neighbour_joining_type(i,dirR,context_type,cChars,psa)) && +word_break_causing(neighbour_char(i,dirL,pwcChars,cChars))) + context_shape[i] = Afn; + else if ( (rchar == DALATH || rchar == RISH) && word_break_causing(neighbour_char(i,dirL,pwcChars,cChars))) + context_shape[i] = Afx; + } + else if (context_type[i] == jtR && +right_join_causing(neighbour_joining_type(i,dirR,context_type,cChars,psa))) + context_shape[i] = Xr; + else if (context_type[i] == jtL && left_join_causing(neighbour_joining_type(i,dirL,context_type,cChars,psa))) + context_shape[i] = Xl; + else if (context_type[i] == jtD && left_join_causing(neighbour_joining_type(i,dirL,context_type,cChars,psa)) && right_join_causing(neighbour_joining_type(i,dirR,context_type,cChars,psa))) + context_shape[i] = Xm; + else if (context_type[i] == jtD && right_join_causing(neighbour_joining_type(i,dirR,context_type,cChars,psa))) + context_shape[i] = Xr; + else if (context_type[i] == jtD && left_join_causing(neighbour_joining_type(i,dirL,context_type,cChars,psa))) + context_shape[i] = Xl; + else + context_shape[i] = Xn; + } + + /* Contextual Shaping */ i = 0; - while (arabic_GSUB_features[i] != NULL) + while(i < *pcGlyphs) { - apply_GSUB_feature(hdc, psa, psc->GSUB_Table, pwOutGlyphs, dirL, pcGlyphs, arabic_GSUB_features[i]); - i++; + INT nextIndex; + INT prevCount = *pcGlyphs; + nextIndex = apply_GSUB_feature_to_glyph(hdc, psa, psc, pwOutGlyphs, i, dirL, pcGlyphs, contextual_features[context_shape[i]]); + if (nextIndex > GSUB_E_NOGLYPH) + { + UpdateClusters(nextIndex, *pcGlyphs - prevCount, dirL, cChars, pwLogClust); + i = nextIndex; + } } HeapFree(GetProcessHeap(),0,context_shape); HeapFree(GetProcessHeap(),0,context_type); } + +void SHAPE_ContextualShaping(HDC hdc, ScriptCache *psc, SCRIPT_ANALYSIS *psa, WCHAR* pwcChars, INT cChars, WORD* pwOutGlyphs, INT* pcGlyphs, INT cMaxGlyphs, WORD *pwLogClust) +{ + if (ShapingData[psa->eScript].contextProc) + ShapingData[psa->eScript].contextProc(hdc, psc, psa, pwcChars, cChars, pwOutGlyphs, pcGlyphs, cMaxGlyphs, pwLogClust); +} + +void SHAPE_ApplyOpenTypeFeatures(HDC hdc, ScriptCache *psc, SCRIPT_ANALYSIS *psa, WORD* pwOutGlyphs, INT* pcGlyphs, INT cMaxGlyphs, INT cChars, const TEXTRANGE_PROPERTIES *rpRangeProperties, WORD *pwLogClust) +{ + int i; + INT dirL; + + if (!rpRangeProperties) + return; + + if (!psc->GSUB_Table) + psc->GSUB_Table = load_gsub_table(hdc); + + if (!psc->GSUB_Table) + return; + + if (!psa->fLogicalOrder && psa->fRTL) + dirL = -1; + else + dirL = 1; + + for (i = 0; i < rpRangeProperties->cotfRecords; i++) + { + if (rpRangeProperties->potfRecords[i].lParameter > 0) + apply_GSUB_feature(hdc, psa, psc, pwOutGlyphs, dirL, pcGlyphs, cChars, (const char*)&rpRangeProperties->potfRecords[i].tagFeature, pwLogClust); + } +} + +void SHAPE_ApplyDefaultOpentypeFeatures(HDC hdc, ScriptCache *psc, SCRIPT_ANALYSIS *psa, WORD* pwOutGlyphs, INT* pcGlyphs, INT cMaxGlyphs, INT cChars, WORD *pwLogClust) +{ +const TEXTRANGE_PROPERTIES *rpRangeProperties; +rpRangeProperties = &ShapingData[psa->eScript].defaultTextRange; + + SHAPE_ApplyOpenTypeFeatures(hdc, psc, psa, pwOutGlyphs, pcGlyphs, cMaxGlyphs, cChars, rpRangeProperties, pwLogClust); +} diff -Nru wine1.3-1.3.0/dlls/usp10/tests/usp10.c wine1.3-1.3.1/dlls/usp10/tests/usp10.c --- wine1.3-1.3.0/dlls/usp10/tests/usp10.c 2010-07-30 18:43:56.000000000 +0100 +++ wine1.3-1.3.1/dlls/usp10/tests/usp10.c 2010-08-20 18:23:50.000000000 +0100 @@ -407,7 +407,7 @@ trace("number of script properties %d\n", iMaxProps); ok (iMaxProps > 0, "Number of scripts returned should not be 0\n"); if (iMaxProps > 0) - ok( ppSp[5]->langid == 9, "Langid[5] not = to 9\n"); /* Check a known value to ensure */ + ok( ppSp[0]->langid == 0, "Langid[0] not = to 0\n"); /* Check a known value to ensure */ /* ptrs work */ /* This is a valid test that will cause parsing to take place */ diff -Nru wine1.3-1.3.0/dlls/usp10/usp10.c wine1.3-1.3.1/dlls/usp10/usp10.c --- wine1.3-1.3.0/dlls/usp10/usp10.c 2010-07-30 18:43:56.000000000 +0100 +++ wine1.3-1.3.1/dlls/usp10/usp10.c 2010-08-20 18:23:50.000000000 +0100 @@ -40,105 +40,96 @@ WINE_DEFAULT_DEBUG_CHANNEL(uniscribe); -static const SCRIPT_PROPERTIES props[] = +typedef struct _scriptRange { - { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, - { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, - { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, - { 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, - { 9, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, - { 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0 }, - { 9, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0 }, - { 8, 0, 0, 0, 0, 161, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, - { 25, 0, 0, 0, 0, 204, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, - { 43, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0 }, - { 55, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0 }, - { 42, 0, 0, 0, 0, 163, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, - { 9, 0, 1, 0, 1, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0 }, - { 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 1, 0, 0 }, - { 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0 }, - { 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0 }, - { 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0 }, - { 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0 }, - { 18, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0 }, - { 18, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0 }, - { 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0 }, - { 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0 }, - { 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0 }, - { 9, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0 }, - { 13, 0, 1, 0, 1, 177, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, - { 13, 0, 1, 0, 0, 177, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, - { 1, 0, 1, 0, 0, 178, 0, 0, 0, 0, 0, 0, 1, 1, 0 }, - { 1, 1, 1, 0, 0, 178, 0, 0, 0, 0, 0, 0, 1, 0, 0 }, - { 41, 1, 1, 0, 0, 178, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, - { 32, 1, 1, 0, 0, 178, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, - { 90, 0, 1, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 1, 0 }, - { 30, 0, 1, 1, 1, 222, 0, 0, 1, 0, 1, 0, 0, 0, 1 }, - { 30, 1, 1, 0, 0, 222, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, - { 30, 0, 1, 0, 0, 222, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, - { 57, 0, 1, 0, 1, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0 }, - { 57, 1, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, - { 73, 0, 1, 0, 1, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0 }, - { 73, 1, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, - { 69, 0, 1, 0, 1, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0 }, - { 69, 1, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, - { 69, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, - { 70, 0, 1, 0, 1, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0 }, - { 70, 1, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, - { 71, 0, 1, 0, 1, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0 }, - { 71, 1, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, - { 72, 0, 1, 0, 1, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0 }, - { 72, 1, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, - { 74, 0, 1, 0, 1, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0 }, - { 74, 1, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, - { 75, 0, 1, 0, 1, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0 }, - { 75, 1, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, - { 76, 0, 1, 0, 1, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0 }, - { 76, 1, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, - { 81, 0, 1, 1, 1, 1, 0, 0, 1, 0, 1, 0, 0, 0, 0 }, - { 81, 1, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, - { 84, 0, 1, 1, 1, 1, 0, 0, 1, 0, 1, 0, 0, 0, 0 }, - { 84, 1, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, - { 83, 0, 1, 1, 1, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0 }, - { 83, 1, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, - { 85, 0, 1, 1, 1, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0 }, - { 85, 1, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, - { 80, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, - { 80, 1, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, - { 94, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, - { 94, 1, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, - { 101, 0, 1, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, - { 93, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, - { 92, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, - { 9, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, - { 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, - { 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, - { 91, 0, 1, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, - { 9, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0 }, - { 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + WORD script; + WORD rangeFirst; + WORD rangeLast; + WORD numericScript; + WORD punctScript; +} scriptRange; + +static const scriptRange scriptRanges[] = { + + /* Basic Latin: U+0000–U+007A */ + /* Latin-1 Supplement: U+0080–U+00FF */ + /* Latin Extended-A: U+0100–U+017F */ + /* Latin Extended-B: U+0180–U+024F */ + /* IPA Extensions: U+0250–U+02AF */ + { Script_Latin, 0x00, 0x2af , Script_Numeric, Script_Punctuation}, + /* Hebrew: U+0590–U+05FF */ + { Script_Hebrew, 0x590, 0x5ff, 0, 0}, + /* Arabic: U+0600–U+06FF */ + { Script_Arabic, 0x600, 0x6ef, Script_Arabic_Numeric, 0}, + /* Defined by Windows */ + { Script_Persian, 0x6f0, 0x6f9, 0, 0}, + /* Continue Arabic: U+0600–U+06FF */ + { Script_Arabic, 0x6fa, 0x6ff, 0, 0}, + /* Syriac: U+0700–U+074F*/ + { Script_Syriac, 0x700, 0x74f, 0, 0}, + /* Arabic Supplement: U+0750–U+077F */ + { Script_Arabic, 0x750, 0x77f, 0, 0}, + /* Phonetic Extensions: U+1D00–U+1DBF */ + { Script_Latin, 0x1d00, 0x1dbf, 0, 0}, + /* Latin Extended Additional: U+1E00–U+1EFF */ + { Script_Latin, 0x1e00, 0x1eff, 0, 0}, + /* Latin Extended-C: U+2C60–U+2C7F */ + { Script_Latin, 0x2c60, 0x2c7f, 0, 0}, + /* Modifier Tone Letters: U+A700–U+A71F */ + /* Latin Extended-D: U+A720–U+A7FF */ + { Script_Latin, 0xa700, 0xa7ff, 0, 0}, + /* Latin Ligatures: U+FB00–U+FB06 */ + { Script_Latin, 0xfb00, 0xfb06, 0, 0}, + /* Alphabetic Presentation Forms: U+FB1D–U+FB4F */ + { Script_Hebrew, 0xfb1d, 0xfb4f, 0, 0}, + /* Arabic Presentation Forms-A: U+FB50–U+FDFF*/ + { Script_Arabic, 0xfb50, 0xfdff, 0, 0}, + /* Arabic Presentation Forms-B: U+FE70–U+FEFF*/ + { Script_Arabic, 0xfe70, 0xfeff, 0, 0}, + /* END */ + { SCRIPT_UNDEFINED, 0, 0, 0} +}; + +typedef struct _scriptData +{ + SCRIPT_ANALYSIS a; + SCRIPT_PROPERTIES props; +} scriptData; + +/* the must be in order so that the index matches the Script value */ +static const scriptData scriptInformation[] = { + {{SCRIPT_UNDEFINED, 0, 0, 0, 0, 0, 0, { 0,0,0,0,0,0,0,0,0,0,0}}, + {LANG_NEUTRAL, 0, 0, 0, 0, ANSI_CHARSET, 0, 0, 0, 0, 0, 0, 0, 0, 0}}, + {{Script_Latin, 0, 0, 0, 0, 0, 0, { 0,0,0,0,0,0,0,0,0,0,0}}, + {LANG_ENGLISH, 0, 0, 0, 0, ANSI_CHARSET, 0, 0, 0, 0, 0, 0, 1, 0, 0}}, + {{Script_CR, 0, 0, 0, 0, 0, 0, { 0,0,0,0,0,0,0,0,0,0,0}}, + {LANG_NEUTRAL, 0, 0, 0, 0, ANSI_CHARSET, 0, 0, 0, 0, 0, 0, 0, 0, 0}}, + {{Script_Numeric, 0, 0, 0, 0, 0, 0, { 0,0,0,0,0,0,0,0,0,0,0}}, + {LANG_ENGLISH, 1, 0, 0, 0, ANSI_CHARSET, 0, 0, 0, 0, 0, 0, 0, 0, 0}}, + {{Script_Control, 0, 0, 0, 0, 0, 0, { 0,0,0,0,0,0,0,0,0,0,0}}, + {LANG_ENGLISH, 0, 1, 0, 0, ANSI_CHARSET, 1, 0, 0, 0, 0, 0, 1, 0, 0}}, + {{Script_Punctuation, 0, 0, 0, 0, 0, 0, { 0,0,0,0,0,0,0,0,0,0,0}}, + {LANG_NEUTRAL, 0, 0, 0, 0, ANSI_CHARSET, 0, 0, 0, 0, 0, 0, 0, 0, 0}}, + {{Script_Arabic, 1, 1, 0, 0, 0, 0, { 1,0,0,0,0,0,0,0,0,0,0}}, + {LANG_ARABIC, 0, 1, 0, 0, ARABIC_CHARSET, 0, 0, 0, 0, 0, 0, 1, 1, 0}}, + {{Script_Arabic_Numeric, 1, 1, 0, 0, 0, 0, { 1,0,0,0,0,0,0,0,0,0,0}}, + {LANG_ARABIC, 1, 1, 0, 0, ARABIC_CHARSET, 0, 0, 0, 0, 0, 0, 1, 0, 0}}, + {{Script_Hebrew, 1, 1, 0, 0, 0, 0, { 1,0,0,0,0,0,0,0,0,0,0}}, + {LANG_HEBREW, 0, 1, 0, 1, HEBREW_CHARSET, 0, 0, 0, 0, 0, 0, 0, 0, 0}}, + {{Script_Syriac, 1, 1, 0, 0, 0, 0, { 1,0,0,0,0,0,0,0,0,0,0}}, + {LANG_SYRIAC, 0, 1, 0, 0, DEFAULT_CHARSET, 0, 0, 0, 0, 1, 0, 0, 1, 0}}, + {{Script_Persian, 1, 1, 0, 0, 0, 0, { 1,0,0,0,0,0,0,0,0,0,0}}, + {LANG_PERSIAN, 1, 1, 0, 0, ARABIC_CHARSET, 0, 0, 0, 0, 0, 0, 0, 0, 0}}, }; static const SCRIPT_PROPERTIES *script_props[] = { - &props[0], &props[1], &props[2], &props[3], - &props[4], &props[5], &props[6], &props[7], - &props[8], &props[9], &props[11], &props[12], - &props[13], &props[14], &props[15], &props[16], - &props[17], &props[18], &props[19], &props[20], - &props[21], &props[22], &props[23], &props[24], - &props[25], &props[26], &props[27], &props[28], - &props[29], &props[30], &props[31], &props[32], - &props[33], &props[34], &props[35], &props[36], - &props[37], &props[38], &props[39], &props[40], - &props[41], &props[42], &props[43], &props[44], - &props[45], &props[46], &props[47], &props[48], - &props[49], &props[50], &props[51], &props[52], - &props[53], &props[54], &props[55], &props[56], - &props[57], &props[58], &props[59], &props[60], - &props[61], &props[62], &props[63], &props[64], - &props[65], &props[66], &props[67], &props[68], - &props[69], &props[70], &props[71], &props[72], - &props[73] + &scriptInformation[0].props, &scriptInformation[1].props, + &scriptInformation[2].props, &scriptInformation[3].props, + &scriptInformation[4].props, &scriptInformation[5].props, + &scriptInformation[6].props, &scriptInformation[7].props, + &scriptInformation[8].props, &scriptInformation[9].props, + &scriptInformation[10].props }; typedef struct { @@ -265,6 +256,42 @@ return ch + wine_mirror_map[wine_mirror_map[ch >> 8] + (ch & 0xff)]; } +static WORD get_char_script( WCHAR ch) +{ + WORD type = 0; + int i; + + if (ch == 0xc || ch == 0x20 || ch == 0x202f) + return Script_CR; + + GetStringTypeW(CT_CTYPE1, &ch, 1, &type); + + if (type == 0) + return SCRIPT_UNDEFINED; + + if (type & C1_CNTRL) + return Script_Control; + + i = 0; + do + { + if (ch < scriptRanges[i].rangeFirst || scriptRanges[i].script == SCRIPT_UNDEFINED) + break; + + if (ch >= scriptRanges[i].rangeFirst && ch <= scriptRanges[i].rangeLast) + { + if (scriptRanges[i].numericScript && type & C1_DIGIT) + return scriptRanges[i].numericScript; + if (scriptRanges[i].punctScript && type & C1_PUNCT) + return scriptRanges[i].punctScript; + return scriptRanges[i].script; + } + i++; + } while (1); + + return SCRIPT_UNDEFINED; +} + /*********************************************************************** * DllMain * @@ -307,6 +334,7 @@ heap_free(((ScriptCache *)*psc)->widths[i]); } heap_free(((ScriptCache *)*psc)->GSUB_Table); + heap_free(((ScriptCache *)*psc)->features); heap_free(*psc); *psc = NULL; } @@ -507,17 +535,7 @@ SCRIPT_ITEM *pItems, int *pcItems) { -#define Numeric_start 0x0030 -#define Numeric_stop 0x0039 #define Numeric_space 0x0020 -#define Arabic_start 0x0600 -#define Arabic_stop 0x06ff -#define Hebrew_start 0x0590 -#define Hebrew_stop 0x05ff -#define Syriac_start 0x0700 -#define Syriac_stop 0x074f -#define Latin_start 0x0001 -#define Latin_stop 0x024f int cnt = 0, index = 0; int New_Script = SCRIPT_UNDEFINED; @@ -550,28 +568,7 @@ } pItems[index].iCharPos = 0; - memset(&pItems[index].a, 0, sizeof(SCRIPT_ANALYSIS)); - - if (pwcInChars[cnt] == '\r') - pItems[index].a.eScript = Script_CR; - else - if (pwcInChars[cnt] == '\n') - pItems[index].a.eScript = Script_LF; - else - if (pwcInChars[cnt] >= Numeric_start && pwcInChars[cnt] <= Numeric_stop) - pItems[index].a.eScript = Script_Numeric; - else - if (pwcInChars[cnt] >= Arabic_start && pwcInChars[cnt] <= Arabic_stop) - pItems[index].a.eScript = Script_Arabic; - else - if (pwcInChars[cnt] >= Hebrew_start && pwcInChars[cnt] <= Hebrew_stop) - pItems[index].a.eScript = Script_Hebrew; - else - if (pwcInChars[cnt] >= Syriac_start && pwcInChars[cnt] <= Syriac_stop) - pItems[index].a.eScript = Script_Syriac; - else - if (pwcInChars[cnt] >= Latin_start && pwcInChars[cnt] <= Latin_stop) - pItems[index].a.eScript = Script_Latin; + pItems[index].a = scriptInformation[get_char_script(pwcInChars[cnt])].a; if (levels) { @@ -579,15 +576,7 @@ pItems[index].a.fLayoutRTL = odd(levels[cnt]); pItems[index].a.s.uBidiLevel = levels[cnt]; } - else if ((pItems[index].a.eScript == Script_Arabic) || - (pItems[index].a.eScript == Script_Hebrew) || - (pItems[index].a.eScript == Script_Syriac)) - { - pItems[index].a.s.uBidiLevel = 1; - pItems[index].a.fRTL = 1; - pItems[index].a.fLayoutRTL = 1; - } - else + else if (!pItems[index].a.s.uBidiLevel) { pItems[index].a.s.uBidiLevel = baselevel; pItems[index].a.fLayoutRTL = odd(baselevel); @@ -603,35 +592,10 @@ if (levels && (levels[cnt] == pItems[index].a.s.uBidiLevel)) continue; - if (pwcInChars[cnt] == '\r') - New_Script = Script_CR; - else - if (pwcInChars[cnt] == '\n') - New_Script = Script_LF; - else - if ((pwcInChars[cnt] >= Numeric_start && pwcInChars[cnt] <= Numeric_stop) - || (New_Script == Script_Numeric && pwcInChars[cnt] == Numeric_space)) - New_Script = Script_Numeric; - else - if ((pwcInChars[cnt] >= Arabic_start && pwcInChars[cnt] <= Arabic_stop) - || (New_Script == Script_Arabic && pwcInChars[cnt] == Numeric_space)) - New_Script = Script_Arabic; - else - if ((pwcInChars[cnt] >= Hebrew_start && pwcInChars[cnt] <= Hebrew_stop) - || (New_Script == Script_Hebrew && pwcInChars[cnt] == Numeric_space)) - New_Script = Script_Hebrew; - else - if ((pwcInChars[cnt] >= Syriac_start && pwcInChars[cnt] <= Syriac_stop) - || (New_Script == Script_Syriac && pwcInChars[cnt] == Numeric_space)) - New_Script = Script_Syriac; - else - if ((pwcInChars[cnt] >= Latin_start && pwcInChars[cnt] <= Latin_stop) - || (New_Script == Script_Latin && pwcInChars[cnt] == Numeric_space)) - New_Script = Script_Latin; - else - New_Script = SCRIPT_UNDEFINED; + if(pwcInChars[cnt] != Numeric_space) + New_Script = get_char_script(pwcInChars[cnt]); - if ((levels && (levels[cnt] != pItems[index].a.s.uBidiLevel)) || New_Script != pItems[index].a.eScript) + if ((levels && (levels[cnt] != pItems[index].a.s.uBidiLevel)) || New_Script != pItems[index].a.eScript || New_Script == Script_Control) { TRACE("New_Level = %i, New_Script=%d, eScript=%d ", levels?levels[cnt]:-1, New_Script, pItems[index].a.eScript); index++; @@ -641,29 +605,20 @@ pItems[index].iCharPos = cnt; memset(&pItems[index].a, 0, sizeof(SCRIPT_ANALYSIS)); + pItems[index].a = scriptInformation[New_Script].a; if (levels) { pItems[index].a.fRTL = odd(levels[cnt]); pItems[index].a.fLayoutRTL = odd(levels[cnt]); pItems[index].a.s.uBidiLevel = levels[cnt]; } - else if ((New_Script == Script_Arabic) || - (New_Script == Script_Hebrew) || - (New_Script == Script_Syriac)) - { - pItems[index].a.s.uBidiLevel = 1; - pItems[index].a.fRTL = 1; - pItems[index].a.fLayoutRTL = 1; - } - else + else if (!pItems[index].a.s.uBidiLevel) { pItems[index].a.s.uBidiLevel = baselevel; pItems[index].a.fLayoutRTL = odd(baselevel); pItems[index].a.fRTL = odd(baselevel); } - pItems[index].a.eScript = New_Script; - TRACE("index=%d cnt=%d iCharPos=%d\n", index, cnt, pItems[index].iCharPos); } } @@ -1141,163 +1096,9 @@ return S_OK; } -static const struct -{ - WCHAR start; - WCHAR end; - DWORD flag; -} -complex_ranges[] = -{ - { 0, 0x0b, SIC_COMPLEX }, - { 0x0c, 0x0c, SIC_NEUTRAL }, - { 0x0d, 0x1f, SIC_COMPLEX }, - { 0x20, 0x2f, SIC_NEUTRAL }, - { 0x30, 0x39, SIC_ASCIIDIGIT }, - { 0x3a, 0x40, SIC_NEUTRAL }, - { 0x5b, 0x60, SIC_NEUTRAL }, - { 0x7b, 0x7e, SIC_NEUTRAL }, - { 0x7f, 0x9f, SIC_COMPLEX }, - { 0xa0, 0xa5, SIC_NEUTRAL }, - { 0xa7, 0xa8, SIC_NEUTRAL }, - { 0xab, 0xab, SIC_NEUTRAL }, - { 0xad, 0xad, SIC_NEUTRAL }, - { 0xaf, 0xaf, SIC_NEUTRAL }, - { 0xb0, 0xb1, SIC_NEUTRAL }, - { 0xb4, 0xb4, SIC_NEUTRAL }, - { 0xb6, 0xb8, SIC_NEUTRAL }, - { 0xbb, 0xbf, SIC_NEUTRAL }, - { 0xd7, 0xd7, SIC_NEUTRAL }, - { 0xf7, 0xf7, SIC_NEUTRAL }, - { 0x2b9, 0x2ba, SIC_NEUTRAL }, - { 0x2c2, 0x2cf, SIC_NEUTRAL }, - { 0x2d2, 0x2df, SIC_NEUTRAL }, - { 0x2e5, 0x2e9, SIC_COMPLEX }, - { 0x2ea, 0x2ed, SIC_NEUTRAL }, - { 0x300, 0x362, SIC_COMPLEX }, - { 0x530, 0x60b, SIC_COMPLEX }, - { 0x60c, 0x60d, SIC_NEUTRAL }, - { 0x60e, 0x669, SIC_COMPLEX }, - { 0x66a, 0x66a, SIC_NEUTRAL }, - { 0x66b, 0x6e8, SIC_COMPLEX }, - { 0x6e9, 0x6e9, SIC_NEUTRAL }, - { 0x6ea, 0x7bf, SIC_COMPLEX }, - { 0x900, 0x1360, SIC_COMPLEX }, - { 0x137d, 0x137f, SIC_COMPLEX }, - { 0x1680, 0x1680, SIC_NEUTRAL }, - { 0x1780, 0x18af, SIC_COMPLEX }, - { 0x2000, 0x200a, SIC_NEUTRAL }, - { 0x200b, 0x200f, SIC_COMPLEX }, - { 0x2010, 0x2016, SIC_NEUTRAL }, - { 0x2018, 0x2022, SIC_NEUTRAL }, - { 0x2024, 0x2028, SIC_NEUTRAL }, - { 0x2029, 0x202e, SIC_COMPLEX }, - { 0x202f, 0x2037, SIC_NEUTRAL }, - { 0x2039, 0x203c, SIC_NEUTRAL }, - { 0x2044, 0x2046, SIC_NEUTRAL }, - { 0x206a, 0x206f, SIC_COMPLEX }, - { 0x207a, 0x207e, SIC_NEUTRAL }, - { 0x208a, 0x20aa, SIC_NEUTRAL }, - { 0x20ac, 0x20cf, SIC_NEUTRAL }, - { 0x20d0, 0x20ff, SIC_COMPLEX }, - { 0x2103, 0x2103, SIC_NEUTRAL }, - { 0x2105, 0x2105, SIC_NEUTRAL }, - { 0x2109, 0x2109, SIC_NEUTRAL }, - { 0x2116, 0x2116, SIC_NEUTRAL }, - { 0x2121, 0x2122, SIC_NEUTRAL }, - { 0x212e, 0x212e, SIC_NEUTRAL }, - { 0x2153, 0x2154, SIC_NEUTRAL }, - { 0x215b, 0x215e, SIC_NEUTRAL }, - { 0x2190, 0x2199, SIC_NEUTRAL }, - { 0x21b8, 0x21b9, SIC_NEUTRAL }, - { 0x21d2, 0x21d2, SIC_NEUTRAL }, - { 0x21d4, 0x21d4, SIC_NEUTRAL }, - { 0x21e7, 0x21e7, SIC_NEUTRAL }, - { 0x2200, 0x2200, SIC_NEUTRAL }, - { 0x2202, 0x2203, SIC_NEUTRAL }, - { 0x2207, 0x2208, SIC_NEUTRAL }, - { 0x220b, 0x220b, SIC_NEUTRAL }, - { 0x220f, 0x220f, SIC_NEUTRAL }, - { 0x2211, 0x2213, SIC_NEUTRAL }, - { 0x2215, 0x2215, SIC_NEUTRAL }, - { 0x221a, 0x221a, SIC_NEUTRAL }, - { 0x221d, 0x2220, SIC_NEUTRAL }, - { 0x2223, 0x2223, SIC_NEUTRAL }, - { 0x2225, 0x2225, SIC_NEUTRAL }, - { 0x2227, 0x222c, SIC_NEUTRAL }, - { 0x222e, 0x222e, SIC_NEUTRAL }, - { 0x2234, 0x2237, SIC_NEUTRAL }, - { 0x223c, 0x223d, SIC_NEUTRAL }, - { 0x2248, 0x2248, SIC_NEUTRAL }, - { 0x224c, 0x224c, SIC_NEUTRAL }, - { 0x2252, 0x2252, SIC_NEUTRAL }, - { 0x2260, 0x2261, SIC_NEUTRAL }, - { 0x2264, 0x2267, SIC_NEUTRAL }, - { 0x226a, 0x226b, SIC_NEUTRAL }, - { 0x226e, 0x226f, SIC_NEUTRAL }, - { 0x2282, 0x2283, SIC_NEUTRAL }, - { 0x2286, 0x2287, SIC_NEUTRAL }, - { 0x2295, 0x2295, SIC_NEUTRAL }, - { 0x2299, 0x2299, SIC_NEUTRAL }, - { 0x22a5, 0x22a5, SIC_NEUTRAL }, - { 0x22bf, 0x22bf, SIC_NEUTRAL }, - { 0x2312, 0x2312, SIC_NEUTRAL }, - { 0x24ea, 0x24ea, SIC_COMPLEX }, - { 0x2500, 0x254b, SIC_NEUTRAL }, - { 0x2550, 0x256d, SIC_NEUTRAL }, - { 0x256e, 0x2574, SIC_NEUTRAL }, - { 0x2581, 0x258f, SIC_NEUTRAL }, - { 0x2592, 0x2595, SIC_NEUTRAL }, - { 0x25a0, 0x25a1, SIC_NEUTRAL }, - { 0x25a3, 0x25a9, SIC_NEUTRAL }, - { 0x25b2, 0x25b3, SIC_NEUTRAL }, - { 0x25b6, 0x25b7, SIC_NEUTRAL }, - { 0x25bc, 0x25bd, SIC_NEUTRAL }, - { 0x25c0, 0x25c1, SIC_NEUTRAL }, - { 0x25c6, 0x25c8, SIC_NEUTRAL }, - { 0x25cb, 0x25cb, SIC_NEUTRAL }, - { 0x25ce, 0x25d1, SIC_NEUTRAL }, - { 0x25e2, 0x25e5, SIC_NEUTRAL }, - { 0x25ef, 0x25ef, SIC_NEUTRAL }, - { 0x2605, 0x2606, SIC_NEUTRAL }, - { 0x2609, 0x2609, SIC_NEUTRAL }, - { 0x260e, 0x260f, SIC_NEUTRAL }, - { 0x261c, 0x261c, SIC_NEUTRAL }, - { 0x261e, 0x261e, SIC_NEUTRAL }, - { 0x2640, 0x2640, SIC_NEUTRAL }, - { 0x2642, 0x2642, SIC_NEUTRAL }, - { 0x2660, 0x2661, SIC_NEUTRAL }, - { 0x2663, 0x2665, SIC_NEUTRAL }, - { 0x2667, 0x266a, SIC_NEUTRAL }, - { 0x266c, 0x266d, SIC_NEUTRAL }, - { 0x266f, 0x266f, SIC_NEUTRAL }, - { 0x273d, 0x273d, SIC_NEUTRAL }, - { 0x2e80, 0x312f, SIC_COMPLEX }, - { 0x3190, 0x31bf, SIC_COMPLEX }, - { 0x31f0, 0x31ff, SIC_COMPLEX }, - { 0x3220, 0x325f, SIC_COMPLEX }, - { 0x3280, 0xa4ff, SIC_COMPLEX }, - { 0xd800, 0xdfff, SIC_COMPLEX }, - { 0xe000, 0xf8ff, SIC_NEUTRAL }, - { 0xf900, 0xfaff, SIC_COMPLEX }, - { 0xfb13, 0xfb28, SIC_COMPLEX }, - { 0xfb29, 0xfb29, SIC_NEUTRAL }, - { 0xfb2a, 0xfb4f, SIC_COMPLEX }, - { 0xfd3e, 0xfd3f, SIC_NEUTRAL }, - { 0xfdd0, 0xfdef, SIC_COMPLEX }, - { 0xfe20, 0xfe6f, SIC_COMPLEX }, - { 0xfeff, 0xfeff, SIC_COMPLEX }, - { 0xff01, 0xff5e, SIC_COMPLEX }, - { 0xff61, 0xff9f, SIC_COMPLEX }, - { 0xffe0, 0xffe6, SIC_COMPLEX }, - { 0xffe8, 0xffee, SIC_COMPLEX }, - { 0xfff9, 0xfffb, SIC_COMPLEX }, - { 0xfffe, 0xfffe, SIC_COMPLEX } -}; - /*********************************************************************** * ScriptIsComplex (USP10.@) - * + * * Determine if a string is complex. * * PARAMS @@ -1309,24 +1110,24 @@ * Success: S_OK * Failure: S_FALSE * - * NOTES - * Behaviour matches that of WinXP. */ HRESULT WINAPI ScriptIsComplex(const WCHAR *chars, int len, DWORD flag) { int i; - unsigned int j; TRACE("(%s,%d,0x%x)\n", debugstr_wn(chars, len), len, flag); for (i = 0; i < len; i++) { - for (j = 0; j < sizeof(complex_ranges)/sizeof(complex_ranges[0]); j++) - { - if (chars[i] >= complex_ranges[j].start && - chars[i] <= complex_ranges[j].end && - (flag & complex_ranges[j].flag)) return S_OK; - } + int script; + + if ((flag & SIC_ASCIIDIGIT) && chars[i] >= 0x30 && chars[i] <= 0x39) + return S_OK; + + script = get_char_script(chars[i]); + if ((scriptInformation[script].props.fComplex && (flag & SIC_COMPLEX))|| + (!scriptInformation[script].props.fComplex && (flag & SIC_NEUTRAL))) + return S_OK; } return S_FALSE; } @@ -1375,6 +1176,22 @@ if ((hr = init_script_cache(hdc, psc)) != S_OK) return hr; if (!pwLogClust) return E_FAIL; + /* Initialize a SCRIPT_VISATTR and LogClust for each char in this run */ + for (i = 0; i < cChars; i++) + { + int idx = i; + if (rtl) idx = cChars - 1 - i; + /* FIXME: set to better values */ + psva[i].uJustification = (pwcChars[idx] == ' ') ? SCRIPT_JUSTIFY_BLANK : SCRIPT_JUSTIFY_CHARACTER; + psva[i].fClusterStart = 1; + psva[i].fDiacritic = 0; + psva[i].fZeroWidth = 0; + psva[i].fReserved = 0; + psva[i].fShapeReserved = 0; + + pwLogClust[i] = idx; + } + if ((get_cache_pitch_family(psc) & TMPF_TRUETYPE) && !psa->fNoGlyphIndex) { WCHAR *rChars = heap_alloc(sizeof(WCHAR) * cChars); @@ -1397,7 +1214,8 @@ } rChars[i] = chInput; } - SHAPE_ShapeArabicGlyphs(hdc, (ScriptCache *)*psc, psa, rChars, cChars, pwOutGlyphs, pcGlyphs, cMaxGlyphs); + SHAPE_ContextualShaping(hdc, (ScriptCache *)*psc, psa, rChars, cChars, pwOutGlyphs, pcGlyphs, cMaxGlyphs, pwLogClust); + SHAPE_ApplyDefaultOpentypeFeatures(hdc, (ScriptCache *)*psc, psa, pwOutGlyphs, pcGlyphs, cMaxGlyphs, cChars, pwLogClust); heap_free(rChars); } else @@ -1412,21 +1230,6 @@ } } - /* set up a valid SCRIPT_VISATTR and LogClust for each char in this run */ - for (i = 0; i < cChars; i++) - { - int idx = i; - if (rtl) idx = cChars - 1 - i; - /* FIXME: set to better values */ - psva[i].uJustification = (pwcChars[idx] == ' ') ? SCRIPT_JUSTIFY_BLANK : SCRIPT_JUSTIFY_CHARACTER; - psva[i].fClusterStart = 1; - psva[i].fDiacritic = 0; - psva[i].fZeroWidth = 0; - psva[i].fReserved = 0; - psva[i].fShapeReserved = 0; - - pwLogClust[i] = idx; - } return S_OK; } diff -Nru wine1.3-1.3.0/dlls/usp10/usp10_internal.h wine1.3-1.3.1/dlls/usp10/usp10_internal.h --- wine1.3-1.3.0/dlls/usp10/usp10_internal.h 2010-07-30 18:43:56.000000000 +0100 +++ wine1.3-1.3.1/dlls/usp10/usp10_internal.h 2010-08-20 18:23:50.000000000 +0100 @@ -19,13 +19,16 @@ * */ -#define Script_Syriac 8 -#define Script_Hebrew 7 -#define Script_Arabic 6 #define Script_Latin 1 -#define Script_Numeric 5 -#define Script_CR 22 -#define Script_LF 23 +#define Script_CR 2 +#define Script_Numeric 3 +#define Script_Control 4 +#define Script_Punctuation 5 +#define Script_Arabic 6 +#define Script_Arabic_Numeric 7 +#define Script_Hebrew 8 +#define Script_Syriac 9 +#define Script_Persian 10 #define GLYPH_BLOCK_SHIFT 8 #define GLYPH_BLOCK_SIZE (1UL << GLYPH_BLOCK_SHIFT) @@ -33,11 +36,18 @@ #define GLYPH_MAX 65536 typedef struct { + char tag[4]; + LPCVOID feature; +} LoadedFeature; + +typedef struct { LOGFONTW lf; TEXTMETRICW tm; WORD *glyphs[GLYPH_MAX / GLYPH_BLOCK_SIZE]; ABC *widths[GLYPH_MAX / GLYPH_BLOCK_SIZE]; - LPVOID *GSUB_Table; + LPVOID GSUB_Table; + INT feature_count; + LoadedFeature *features; } ScriptCache; #define odd(x) ((x) & 1) @@ -47,4 +57,5 @@ INT BIDI_ReorderV2lLevel(int level, int *pIndexs, const BYTE* plevel, int cch, BOOL fReverse); INT BIDI_ReorderL2vLevel(int level, int *pIndexs, const BYTE* plevel, int cch, BOOL fReverse); -void SHAPE_ShapeArabicGlyphs(HDC hdc, ScriptCache *psc, SCRIPT_ANALYSIS *psa, WCHAR* pwcChars, INT cChars, WORD* pwOutGlyphs, INT* pcGlyphs, INT cMaxGlyphs); +void SHAPE_ContextualShaping(HDC hdc, ScriptCache *psc, SCRIPT_ANALYSIS *psa, WCHAR* pwcChars, INT cChars, WORD* pwOutGlyphs, INT* pcGlyphs, INT cMaxGlyphs, WORD *pwLogClust); +void SHAPE_ApplyDefaultOpentypeFeatures(HDC hdc, ScriptCache *psc, SCRIPT_ANALYSIS *psa, WORD* pwOutGlyphs, INT* pcGlyphs, INT cMaxGlyphs, INT cChars, WORD *pwLogClust); diff -Nru wine1.3-1.3.0/dlls/winealsa.drv/mixer.c wine1.3-1.3.1/dlls/winealsa.drv/mixer.c --- wine1.3-1.3.0/dlls/winealsa.drv/mixer.c 2010-07-30 18:43:56.000000000 +0100 +++ wine1.3-1.3.1/dlls/winealsa.drv/mixer.c 2010-08-20 18:23:50.000000000 +0100 @@ -250,6 +250,8 @@ long min, max; TRACE("Filling control %d\n", id); + if (!mline->elem) + break; if (id == 1 && !mline->elem) continue; @@ -332,16 +334,20 @@ snd_mixer_elem_t *elem; line *mline = mmixer->lines; - /* Master control */ - MultiByteToWideChar(CP_UNIXCP, 0, snd_mixer_selem_get_name(mastelem), -1, mline->name, sizeof(mline->name)/sizeof(WCHAR)); - mline->component = getcomponenttype(snd_mixer_selem_get_name(mastelem)); - mline->dst = 0; - mline->capt = 0; - mline->elem = mastelem; - mline->chans = chans(mmixer, mastelem, 0); + if (mastelem) { + /* Master control */ + MultiByteToWideChar(CP_UNIXCP, 0, snd_mixer_selem_get_name(mastelem), -1, mline->name, sizeof(mline->name)/sizeof(WCHAR)); + mline->component = getcomponenttype(snd_mixer_selem_get_name(mastelem)); + mline->dst = 0; + mline->capt = 0; + mline->elem = mastelem; + mline->chans = chans(mmixer, mastelem, 0); - snd_mixer_elem_set_callback(mastelem, &elem_callback); - snd_mixer_elem_set_callback_private(mastelem, mmixer); + snd_mixer_elem_set_callback(mastelem, &elem_callback); + snd_mixer_elem_set_callback_private(mastelem, mmixer); + } else { + MultiByteToWideChar(CP_UNIXCP, 0, "Empty Master Element", -1, mline->name, sizeof(mline->name)/sizeof(WCHAR)); + } /* Capture control * Note: since mmixer->dests = 1, it means only playback control is visible @@ -395,6 +401,21 @@ } } +static void filllines_no_master(mixer *mmixer, snd_mixer_elem_t *captelem, int capt) +{ + line *mline = mmixer->lines; + + MultiByteToWideChar(CP_UNIXCP, 0, snd_mixer_selem_get_name(captelem), -1, mline->name, sizeof(mline->name)/sizeof(WCHAR)); + mline->component = getcomponenttype(snd_mixer_selem_get_name(captelem)); + mline->dst = 0; + mline->capt = 1; + mline->elem = captelem; + mline->chans = chans(mmixer, captelem, 1); + + snd_mixer_elem_set_callback(captelem, &elem_callback); + snd_mixer_elem_set_callback_private(captelem, mmixer); +} + /* Windows api wants to have a 'master' device to which all slaves are attached * There are 2 ones in this code: * - 'Master', fall back to 'Headphone' if unavailable, and if that's not available 'PCM' @@ -414,7 +435,7 @@ char cardind[6], cardname[10]; snd_ctl_t *ctl; - snd_mixer_elem_t *elem, *mastelem = NULL, *headelem = NULL, *captelem = NULL, *pcmelem = NULL; + snd_mixer_elem_t *elem, *mastelem = NULL, *headelem = NULL, *captelem = NULL, *pcmelem = NULL, *micelem = NULL; memset(info, 0, snd_ctl_card_info_sizeof()); memset(&mixdev[mixnum], 0, sizeof(*mixdev)); @@ -470,6 +491,9 @@ mastelem = elem; else if (!strcasecmp(snd_mixer_selem_get_name(elem), "Capture") && !captelem) captelem = elem; + else if (!strcasecmp(snd_mixer_selem_get_name(elem), "Mic") && !micelem && !mastelem) + /* this is what snd-usb-audio mics look like; just a Mic control and that's it.*/ + micelem = elem; else if (!blacklisted(elem)) { DWORD comp = getcomponenttype(snd_mixer_selem_get_name(elem)); @@ -519,7 +543,7 @@ mastelem = pcmelem; capcontrols -= !!snd_mixer_selem_has_capture_switch(mastelem); } - else if (!mastelem) + else if (!mastelem && !captelem && !micelem) { /* If there is nothing sensible that can act as 'Master' control, something is wrong */ FIXME("No master control found on %s, disabling mixer\n", snd_ctl_card_info_get_name(info)); @@ -549,7 +573,10 @@ if (!mixdev[mixnum].lines || !mixdev[mixnum].controls) goto close; - filllines(&mixdev[mixnum], mastelem, captelem, capcontrols); + if (mastelem) + filllines(&mixdev[mixnum], mastelem, captelem, capcontrols); + else + filllines_no_master(&mixdev[mixnum], micelem, 1); fillcontrols(&mixdev[mixnum]); TRACE("%s: Amount of controls: %i/%i, name: %s\n", cardname, mixdev[mixnum].dests, mixdev[mixnum].chans, debugstr_w(mixdev[mixnum].mixername)); diff -Nru wine1.3-1.3.0/dlls/winealsa.drv/waveinit.c wine1.3-1.3.1/dlls/winealsa.drv/waveinit.c --- wine1.3-1.3.0/dlls/winealsa.drv/waveinit.c 2010-07-30 18:43:56.000000000 +0100 +++ wine1.3-1.3.1/dlls/winealsa.drv/waveinit.c 2010-08-20 18:23:50.000000000 +0100 @@ -106,6 +106,10 @@ retcode = snd_pcm_hw_params_set_channels(pcm, hwparams, 2); if (retcode < 0) { + retcode = snd_pcm_hw_params_set_channels(pcm, hwparams, 1); /* If we can't open stereo, try mono; this is vital for snd_usb_audio microphones */ + } + if (retcode < 0) + { reason = "Could not set channels"; goto exit; } diff -Nru wine1.3-1.3.0/dlls/winecoreaudio.drv/audio.c wine1.3-1.3.1/dlls/winecoreaudio.drv/audio.c --- wine1.3-1.3.0/dlls/winecoreaudio.drv/audio.c 2010-07-30 18:43:56.000000000 +0100 +++ wine1.3-1.3.1/dlls/winecoreaudio.drv/audio.c 2010-08-20 18:23:50.000000000 +0100 @@ -442,7 +442,7 @@ static BOOL supportedFormat(LPWAVEFORMATEX wf) { - if (wf->nSamplesPerSec == 0) + if (wf->nSamplesPerSec < DSBFREQUENCY_MIN || wf->nSamplesPerSec > DSBFREQUENCY_MAX) return FALSE; if (wf->wFormatTag == WAVE_FORMAT_PCM) { @@ -464,7 +464,7 @@ } else WARN("only KSDATAFORMAT_SUBTYPE_PCM supported\n"); } else - WARN("only WAVE_FORMAT_PCM supported\n"); + WARN("only WAVE_FORMAT_PCM and WAVE_FORMAT_EXTENSIBLE supported\n"); return FALSE; } diff -Nru wine1.3-1.3.0/dlls/wined3d/arb_program_shader.c wine1.3-1.3.1/dlls/wined3d/arb_program_shader.c --- wine1.3-1.3.0/dlls/wined3d/arb_program_shader.c 2010-07-30 18:43:56.000000000 +0100 +++ wine1.3-1.3.1/dlls/wined3d/arb_program_shader.c 2010-08-20 18:23:50.000000000 +0100 @@ -3412,7 +3412,7 @@ static void init_ps_input(const IWineD3DPixelShaderImpl *This, const struct arb_ps_compile_args *args, struct shader_arb_ctx_priv *priv) { - const char *texcoords[8] = + static const char * const texcoords[8] = { "fragment.texcoord[0]", "fragment.texcoord[1]", "fragment.texcoord[2]", "fragment.texcoord[3]", "fragment.texcoord[4]", "fragment.texcoord[5]", "fragment.texcoord[6]", "fragment.texcoord[7]" @@ -3894,7 +3894,7 @@ struct arb_vs_compiled_shader *compiled) { unsigned int i, j; - static const char *texcoords[8] = + static const char * const texcoords[8] = { "result.texcoord[0]", "result.texcoord[1]", "result.texcoord[2]", "result.texcoord[3]", "result.texcoord[4]", "result.texcoord[5]", "result.texcoord[6]", "result.texcoord[7]" @@ -3908,10 +3908,10 @@ /* Write generic input varyings 0 to 7 to result.texcoord[], varying 8 to result.color.primary * and varying 9 to result.color.secondary */ - const char *decl_idx_to_string[MAX_REG_INPUT] = + static const char * const decl_idx_to_string[MAX_REG_INPUT] = { - texcoords[0], texcoords[1], texcoords[2], texcoords[3], - texcoords[4], texcoords[5], texcoords[6], texcoords[7], + "result.texcoord[0]", "result.texcoord[1]", "result.texcoord[2]", "result.texcoord[3]", + "result.texcoord[4]", "result.texcoord[5]", "result.texcoord[6]", "result.texcoord[7]", "result.color.primary", "result.color.secondary" }; @@ -7144,7 +7144,8 @@ * Also beware of the origin difference(top left vs bottom left). * Also beware that the front buffer's surface size is screen width x screen height, * whereas the real gl drawable size is the size of the window. */ - dst_swapchain = (dst_surface->Flags & SFLAG_SWAPCHAIN) ? (IWineD3DSwapChainImpl *)dst_surface->container : NULL; + dst_swapchain = dst_surface->container.type == WINED3D_CONTAINER_SWAPCHAIN + ? dst_surface->container.u.swapchain : NULL; if (dst_swapchain && dst_surface == dst_swapchain->front_buffer) surface_translate_frontbuffer_coords(dst_surface, context->win_handle, &dst_rect); diff -Nru wine1.3-1.3.0/dlls/wined3d/basetexture.c wine1.3-1.3.1/dlls/wined3d/basetexture.c --- wine1.3-1.3.0/dlls/wined3d/basetexture.c 2010-07-30 18:43:56.000000000 +0100 +++ wine1.3-1.3.1/dlls/wined3d/basetexture.c 2010-08-20 18:23:50.000000000 +0100 @@ -129,6 +129,8 @@ This->baseTexture.texture_rgb.dirty = TRUE; This->baseTexture.texture_srgb.dirty = TRUE; + + resource_unload((IWineD3DResourceImpl *)This); } DWORD basetexture_set_lod(IWineD3DBaseTexture *iface, DWORD LODNew) diff -Nru wine1.3-1.3.0/dlls/wined3d/buffer.c wine1.3-1.3.1/dlls/wined3d/buffer.c --- wine1.3-1.3.0/dlls/wined3d/buffer.c 2010-07-30 18:43:56.000000000 +0100 +++ wine1.3-1.3.1/dlls/wined3d/buffer.c 2010-08-20 18:23:50.000000000 +0100 @@ -720,6 +720,8 @@ This->conversion_stride = 0; This->flags &= ~WINED3D_BUFFER_HASDESC; } + + resource_unload((IWineD3DResourceImpl *)This); } static ULONG STDMETHODCALLTYPE buffer_Release(IWineD3DBuffer *iface) diff -Nru wine1.3-1.3.0/dlls/wined3d/context.c wine1.3-1.3.1/dlls/wined3d/context.c --- wine1.3-1.3.0/dlls/wined3d/context.c 2010-07-30 18:43:56.000000000 +0100 +++ wine1.3-1.3.1/dlls/wined3d/context.c 2010-08-20 18:23:50.000000000 +0100 @@ -114,12 +114,10 @@ /* GL locking is done by the caller */ static void context_apply_attachment_filter_states(IWineD3DSurfaceImpl *surface, DWORD location) { - IWineD3DBaseTextureImpl *texture_impl; - /* Update base texture states array */ - if (SUCCEEDED(IWineD3DSurface_GetContainer((IWineD3DSurface *)surface, - &IID_IWineD3DBaseTexture, (void **)&texture_impl))) + if (surface->container.type == WINED3D_CONTAINER_TEXTURE) { + IWineD3DBaseTextureImpl *texture_impl = surface->container.u.texture; IWineD3DDeviceImpl *device = surface->resource.device; BOOL update_minfilter = FALSE; BOOL update_magfilter = FALSE; @@ -161,8 +159,6 @@ IWineD3DDeviceImpl_MarkStateDirty(device, STATE_SAMPLER(texture_impl->baseTexture.sampler)); } - IWineD3DBaseTexture_Release((IWineD3DBaseTexture *)texture_impl); - if (update_minfilter || update_magfilter) { GLenum target, bind_target; @@ -650,50 +646,78 @@ context->free_event_queries[context->free_event_query_count++] = query->object; } -void context_resource_released(IWineD3DDevice *iface, IWineD3DResource *resource, WINED3DRESOURCETYPE type) +typedef void (context_fbo_entry_func_t)(struct wined3d_context *context, struct fbo_entry *entry); + +static void context_enum_surface_fbo_entries(IWineD3DDeviceImpl *device, + IWineD3DSurfaceImpl *surface, context_fbo_entry_func_t *callback) { - IWineD3DDeviceImpl *This = (IWineD3DDeviceImpl *)iface; UINT i; - if (!This->d3d_initialized) return; - - switch(type) + for (i = 0; i < device->numContexts; ++i) { - case WINED3DRTYPE_SURFACE: + struct wined3d_context *context = device->contexts[i]; + const struct wined3d_gl_info *gl_info = context->gl_info; + struct fbo_entry *entry, *entry2; + + if (context->current_rt == surface) context->current_rt = NULL; + + LIST_FOR_EACH_ENTRY_SAFE(entry, entry2, &context->fbo_list, struct fbo_entry, entry) { - for (i = 0; i < This->numContexts; ++i) - { - struct wined3d_context *context = This->contexts[i]; - const struct wined3d_gl_info *gl_info = context->gl_info; - struct fbo_entry *entry, *entry2; + UINT j; - if (context->current_rt == (IWineD3DSurfaceImpl *)resource) context->current_rt = NULL; + if (entry->depth_stencil == surface) + { + callback(context, entry); + continue; + } - LIST_FOR_EACH_ENTRY_SAFE(entry, entry2, &context->fbo_list, struct fbo_entry, entry) + for (j = 0; j < gl_info->limits.buffers; ++j) + { + if (entry->render_targets[j] == surface) { - UINT j; - - if (entry->depth_stencil == (IWineD3DSurfaceImpl *)resource) - { - list_remove(&entry->entry); - list_add_head(&context->fbo_destroy_list, &entry->entry); - continue; - } - - for (j = 0; j < gl_info->limits.buffers; ++j) - { - if (entry->render_targets[j] == (IWineD3DSurfaceImpl *)resource) - { - list_remove(&entry->entry); - list_add_head(&context->fbo_destroy_list, &entry->entry); - break; - } - } + callback(context, entry); + break; } } + } + } +} + +static void context_queue_fbo_entry_destruction(struct wined3d_context *context, struct fbo_entry *entry) +{ + list_remove(&entry->entry); + list_add_head(&context->fbo_destroy_list, &entry->entry); +} + +void context_resource_released(IWineD3DDeviceImpl *device, IWineD3DResource *resource, WINED3DRESOURCETYPE type) +{ + if (!device->d3d_initialized) return; + switch (type) + { + case WINED3DRTYPE_SURFACE: + context_enum_surface_fbo_entries(device, (IWineD3DSurfaceImpl *)resource, + context_queue_fbo_entry_destruction); + break; + + default: + break; + } +} + +static void context_detach_fbo_entry(struct wined3d_context *context, struct fbo_entry *entry) +{ + entry->attached = FALSE; +} + +void context_resource_unloaded(IWineD3DDeviceImpl *device, IWineD3DResource *resource, WINED3DRESOURCETYPE type) +{ + switch (type) + { + case WINED3DRTYPE_SURFACE: + context_enum_surface_fbo_entries(device, (IWineD3DSurfaceImpl *)resource, + context_detach_fbo_entry); break; - } default: break; @@ -1870,7 +1894,6 @@ *****************************************************************************/ static struct wined3d_context *FindContext(IWineD3DDeviceImpl *This, IWineD3DSurfaceImpl *target) { - IWineD3DSwapChain *swapchain = NULL; struct wined3d_context *current_context = context_get_current(); DWORD tid = GetCurrentThreadId(); struct wined3d_context *context; @@ -1899,11 +1922,13 @@ return current_context; } - if (target->Flags & SFLAG_SWAPCHAIN) + if (target->container.type == WINED3D_CONTAINER_SWAPCHAIN) { + IWineD3DSwapChain *swapchain; + TRACE("Rendering onscreen\n"); - swapchain = (IWineD3DSwapChain *)target->container; + swapchain = (IWineD3DSwapChain *)target->container.u.swapchain; context = findThreadContextForSwapChain(swapchain, tid); } else @@ -1944,7 +1969,7 @@ { ENTER_GL(); glDrawBuffer(surface_get_gl_buffer(rt)); - checkGLcall("glDrawBuffers()"); + checkGLcall("glDrawBuffer()"); LEAVE_GL(); } else @@ -2050,7 +2075,7 @@ struct wined3d_context *context, IWineD3DSurfaceImpl *depth_stencil) { /* Onscreen surfaces are always in a swapchain */ - IWineD3DSwapChainImpl *swapchain = (IWineD3DSwapChainImpl *)context->current_rt->container; + IWineD3DSwapChainImpl *swapchain = context->current_rt->container.u.swapchain; if (context->render_offscreen || !depth_stencil) return; if (match_depth_stencil_format(swapchain->ds_format, depth_stencil->resource.format_desc)) return; @@ -2144,22 +2169,29 @@ } else { - const struct wined3d_gl_info *gl_info = context->gl_info; + ENTER_GL(); - for (i = 0; i < gl_info->limits.buffers; ++i) + if (wined3d_settings.offscreen_rendering_mode == ORM_FBO) { - if (i < rt_count && rts[i]) - context->draw_buffers[i] = GL_COLOR_ATTACHMENT0 + i; - else - context->draw_buffers[i] = GL_NONE; + const struct wined3d_gl_info *gl_info = context->gl_info; + for (i = 0; i < gl_info->limits.buffers; ++i) + { + if (i < rt_count && rts[i]) + context->draw_buffers[i] = GL_COLOR_ATTACHMENT0 + i; + else + context->draw_buffers[i] = GL_NONE; + } + GL_EXTCALL(glDrawBuffersARB(gl_info->limits.buffers, context->draw_buffers)); + checkGLcall("glDrawBuffers()"); + context->draw_buffer_dirty = TRUE; + } + else + { + glDrawBuffer(device->offscreenBuffer); + checkGLcall("glDrawBuffer()"); } - ENTER_GL(); - GL_EXTCALL(glDrawBuffersARB(gl_info->limits.buffers, context->draw_buffers)); - checkGLcall("glDrawBuffers()"); LEAVE_GL(); - - context->draw_buffer_dirty = TRUE; } if (context->last_was_blit) @@ -2250,8 +2282,6 @@ render_offscreen = surface_is_offscreen(target); if (context->current_rt == target && render_offscreen == old_render_offscreen) return; - context_set_render_offscreen(context, StateTable, render_offscreen); - /* To compensate the lack of format switching with some offscreen rendering methods and on onscreen buffers * the alpha blend state changes with different render target formats. */ if (!context->current_rt) @@ -2288,19 +2318,6 @@ if (wined3d_settings.offscreen_rendering_mode != ORM_FBO && old_render_offscreen && context->current_rt != target) { - BOOL oldInDraw = device->isInDraw; - - /* surface_internal_preload() requires a context to load the - * texture, so it will call context_acquire(). Set isInDraw to true - * to signal surface_internal_preload() that it has a context. */ - - /* FIXME: This is just broken. There's no guarantee whatsoever - * that the currently active context, if any, is appropriate for - * reading back the render target. We should probably call - * context_set_current(context) here and then rely on - * context_acquire() doing the right thing. */ - device->isInDraw = TRUE; - /* Read the back buffer of the old drawable into the destination texture. */ if (context->current_rt->texture_name_srgb) { @@ -2312,13 +2329,12 @@ } surface_modify_location(context->current_rt, SFLAG_INDRAWABLE, FALSE); - - device->isInDraw = oldInDraw; } } context->draw_buffer_dirty = TRUE; context->current_rt = target; + context_set_render_offscreen(context, StateTable, render_offscreen); } /***************************************************************************** diff -Nru wine1.3-1.3.0/dlls/wined3d/cubetexture.c wine1.3-1.3.1/dlls/wined3d/cubetexture.c --- wine1.3-1.3.0/dlls/wined3d/cubetexture.c 2010-07-30 18:43:56.000000000 +0100 +++ wine1.3-1.3.1/dlls/wined3d/cubetexture.c 2010-08-20 18:23:50.000000000 +0100 @@ -127,7 +127,7 @@ surface_set_texture_name(surface, 0, TRUE); surface_set_texture_name(surface, 0, FALSE); surface_set_texture_target(surface, 0); - IWineD3DSurface_SetContainer((IWineD3DSurface *)surface, NULL); + surface_set_container(surface, WINED3D_CONTAINER_NONE, NULL); IWineD3DSurface_Release((IWineD3DSurface *)surface); } } @@ -558,7 +558,7 @@ return hr; } - IWineD3DSurface_SetContainer(surface, (IWineD3DBase *)texture); + surface_set_container((IWineD3DSurfaceImpl *)surface, WINED3D_CONTAINER_TEXTURE, (IWineD3DBase *)texture); surface_set_texture_target((IWineD3DSurfaceImpl *)surface, cube_targets[j]); texture->baseTexture.sub_resources[idx] = (IWineD3DResourceImpl *)surface; TRACE("Created surface level %u @ %p.\n", i, surface); diff -Nru wine1.3-1.3.0/dlls/wined3d/device.c wine1.3-1.3.1/dlls/wined3d/device.c --- wine1.3-1.3.0/dlls/wined3d/device.c 2010-07-30 18:43:56.000000000 +0100 +++ wine1.3-1.3.1/dlls/wined3d/device.c 2010-08-20 18:23:50.000000000 +0100 @@ -655,7 +655,7 @@ } HRESULT device_clear_render_targets(IWineD3DDeviceImpl *device, UINT rt_count, IWineD3DSurfaceImpl **rts, - UINT rect_count, const WINED3DRECT *rects, DWORD flags, WINED3DCOLOR color, float depth, DWORD stencil) + UINT rect_count, const WINED3DRECT *rects, DWORD flags, const float color[4], float depth, DWORD stencil) { const RECT *clear_rect = (rect_count > 0 && rects) ? (const RECT *)rects : NULL; IWineD3DSurfaceImpl *depth_stencil = device->depth_stencil; @@ -741,7 +741,7 @@ IWineD3DDeviceImpl_MarkStateDirty(device, STATE_RENDER(WINED3DRS_COLORWRITEENABLE1)); IWineD3DDeviceImpl_MarkStateDirty(device, STATE_RENDER(WINED3DRS_COLORWRITEENABLE2)); IWineD3DDeviceImpl_MarkStateDirty(device, STATE_RENDER(WINED3DRS_COLORWRITEENABLE3)); - glClearColor(D3DCOLOR_R(color), D3DCOLOR_G(color), D3DCOLOR_B(color), D3DCOLOR_A(color)); + glClearColor(color[0], color[1], color[2], color[3]); checkGLcall("glClearColor"); clear_mask = clear_mask | GL_COLOR_BUFFER_BIT; } @@ -804,8 +804,8 @@ LEAVE_GL(); - if (wined3d_settings.strict_draw_ordering || ((target->Flags & SFLAG_SWAPCHAIN) - && ((IWineD3DSwapChainImpl *)target->container)->front_buffer == target)) + if (wined3d_settings.strict_draw_ordering || (target->container.type == WINED3D_CONTAINER_SWAPCHAIN + && target->container.u.swapchain->front_buffer == target)) wglFlush(); /* Flush to ensure ordering across contexts. */ context_release(context); @@ -1040,7 +1040,7 @@ } static HRESULT WINAPI IWineD3DDeviceImpl_CreateSurface(IWineD3DDevice *iface, UINT Width, UINT Height, - WINED3DFORMAT Format, BOOL Lockable, BOOL Discard, UINT Level, IWineD3DSurface **ppSurface, + WINED3DFORMAT Format, BOOL Lockable, BOOL Discard, UINT Level, IWineD3DSurface **surface, DWORD Usage, WINED3DPOOL Pool, WINED3DMULTISAMPLE_TYPE MultiSample, DWORD MultisampleQuality, WINED3DSURFTYPE Impl, IUnknown *parent, const struct wined3d_parent_ops *parent_ops) { @@ -1051,7 +1051,7 @@ TRACE("iface %p, width %u, height %u, format %s (%#x), lockable %#x, discard %#x, level %u\n", iface, Width, Height, debug_d3dformat(Format), Format, Lockable, Discard, Level); TRACE("surface %p, usage %s (%#x), pool %s (%#x), multisample_type %#x, multisample_quality %u\n", - ppSurface, debug_d3dusage(Usage), Usage, debug_d3dpool(Pool), Pool, MultiSample, MultisampleQuality); + surface, debug_d3dusage(Usage), Usage, debug_d3dpool(Pool), Pool, MultiSample, MultisampleQuality); TRACE("surface_type %#x, parent %p, parent_ops %p.\n", Impl, parent, parent_ops); if (Impl == SURFACE_OPENGL && !This->adapter) @@ -1078,7 +1078,7 @@ TRACE("(%p) : Created surface %p\n", This, object); - *ppSurface = (IWineD3DSurface *)object; + *surface = (IWineD3DSurface *)object; return hr; } @@ -2611,7 +2611,7 @@ { object->exponent = 128.0f; } - object->cutoff = pLight->Phi*90/M_PI; + object->cutoff = (float) (pLight->Phi*90/M_PI); /* FIXME: Range */ break; @@ -2814,10 +2814,10 @@ return WINED3DERR_INVALIDCALL; } - pPlane[0] = This->stateBlock->clipplane[Index][0]; - pPlane[1] = This->stateBlock->clipplane[Index][1]; - pPlane[2] = This->stateBlock->clipplane[Index][2]; - pPlane[3] = This->stateBlock->clipplane[Index][3]; + pPlane[0] = (float) This->stateBlock->clipplane[Index][0]; + pPlane[1] = (float) This->stateBlock->clipplane[Index][1]; + pPlane[2] = (float) This->stateBlock->clipplane[Index][2]; + pPlane[3] = (float) This->stateBlock->clipplane[Index][3]; return WINED3D_OK; } @@ -4567,7 +4567,7 @@ for(i = 0 ; i < swapchains ; i ++) { IWineD3DDeviceImpl_GetSwapChain(iface, i, &swapChain); - TRACE("presentinng chain %d, %p\n", i, swapChain); + TRACE("Presenting chain %d, %p.\n", i, swapChain); IWineD3DSwapChain_Present(swapChain, pSourceRect, pDestRect, hDestWindowOverride, pDirtyRegion, 0); IWineD3DSwapChain_Release(swapChain); } @@ -4576,12 +4576,13 @@ } static HRESULT WINAPI IWineD3DDeviceImpl_Clear(IWineD3DDevice *iface, DWORD Count, - const WINED3DRECT *pRects, DWORD Flags, WINED3DCOLOR Color, float Z, DWORD Stencil) + const WINED3DRECT *pRects, DWORD Flags, WINED3DCOLOR color, float Z, DWORD Stencil) { + const float c[] = {D3DCOLOR_R(color), D3DCOLOR_G(color), D3DCOLOR_B(color), D3DCOLOR_A(color)}; IWineD3DDeviceImpl *This = (IWineD3DDeviceImpl *)iface; - TRACE("(%p) Count (%d), pRects (%p), Flags (%x), Color (0x%08x), Z (%f), Stencil (%d)\n", This, - Count, pRects, Flags, Color, Z, Stencil); + TRACE("(%p) Count (%d), pRects (%p), Flags (%x), color (0x%08x), Z (%f), Stencil (%d)\n", This, + Count, pRects, Flags, color, Z, Stencil); if (Flags & (WINED3DCLEAR_ZBUFFER | WINED3DCLEAR_STENCIL) && !This->depth_stencil) { @@ -4591,7 +4592,7 @@ } return device_clear_render_targets(This, This->adapter->gl_info.limits.buffers, - This->render_targets, Count, pRects, Flags, Color, Z, Stencil); + This->render_targets, Count, pRects, Flags, c, Z, Stencil); } /***** @@ -4983,14 +4984,20 @@ return WINED3D_OK; } -static HRESULT WINAPI IWineD3DDeviceImpl_GetFrontBufferData(IWineD3DDevice *iface,UINT iSwapChain, IWineD3DSurface *pDestSurface) { - IWineD3DSwapChain *swapChain; +static HRESULT WINAPI IWineD3DDeviceImpl_GetFrontBufferData(IWineD3DDevice *iface, + UINT swapchain_idx, IWineD3DSurface *dst_surface) +{ + IWineD3DSwapChain *swapchain; HRESULT hr; - hr = IWineD3DDeviceImpl_GetSwapChain(iface, iSwapChain, &swapChain); - if(hr == WINED3D_OK) { - hr = IWineD3DSwapChain_GetFrontBufferData(swapChain, pDestSurface); - IWineD3DSwapChain_Release(swapChain); - } + + TRACE("iface %p, swapchain_idx %u, dst_surface %p.\n", iface, swapchain_idx, dst_surface); + + hr = IWineD3DDeviceImpl_GetSwapChain(iface, swapchain_idx, &swapchain); + if (FAILED(hr)) return hr; + + hr = IWineD3DSwapChain_GetFrontBufferData(swapchain, dst_surface); + IWineD3DSwapChain_Release(swapchain); + return hr; } @@ -5297,9 +5304,9 @@ if (dst_format->Flags & WINED3DFMT_FLAG_COMPRESSED) { - UINT row_length = (update_w / src_format->block_width) * src_format->block_byte_count; - UINT row_count = update_h / src_format->block_height; - UINT src_pitch = IWineD3DSurface_GetPitch(src_surface); + UINT row_length = wined3d_format_calculate_size(src_format, 1, update_w, 1); + UINT row_count = (update_h + src_format->block_height - 1) / src_format->block_height; + UINT src_pitch = wined3d_format_calculate_size(src_format, 1, src_w, 1); if (src_rect) { @@ -5484,74 +5491,34 @@ return WINED3DERR_INVALIDCALL; } -static void color_fill_fbo(IWineD3DDevice *iface, IWineD3DSurfaceImpl *surface, - const WINED3DRECT *rect, const float color[4]) -{ - IWineD3DDeviceImpl *This = (IWineD3DDeviceImpl *) iface; - struct wined3d_context *context; - - if (rect) surface_load_location(surface, SFLAG_INDRAWABLE, NULL); - surface_modify_location(surface, SFLAG_INDRAWABLE, TRUE); - - context = context_acquire(This, surface); - context_apply_clear_state(context, This, 1, &surface, NULL); - - ENTER_GL(); - - if (rect) - { - if (surface_is_offscreen(surface)) - glScissor(rect->x1, rect->y1, rect->x2 - rect->x1, rect->y2 - rect->y1); - else - glScissor(rect->x1, surface->currentDesc.Height - rect->y2, - rect->x2 - rect->x1, rect->y2 - rect->y1); - checkGLcall("glScissor"); - } - else - { - glDisable(GL_SCISSOR_TEST); - } - - glColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE); - IWineD3DDeviceImpl_MarkStateDirty(This, STATE_RENDER(WINED3DRS_COLORWRITEENABLE)); - IWineD3DDeviceImpl_MarkStateDirty(This, STATE_RENDER(WINED3DRS_COLORWRITEENABLE1)); - IWineD3DDeviceImpl_MarkStateDirty(This, STATE_RENDER(WINED3DRS_COLORWRITEENABLE2)); - IWineD3DDeviceImpl_MarkStateDirty(This, STATE_RENDER(WINED3DRS_COLORWRITEENABLE3)); - - glClearColor(color[0], color[1], color[2], color[3]); - glClear(GL_COLOR_BUFFER_BIT); - checkGLcall("glClear"); - - LEAVE_GL(); - - if (wined3d_settings.strict_draw_ordering) wglFlush(); /* Flush to ensure ordering across contexts. */ - - context_release(context); -} - static HRESULT WINAPI IWineD3DDeviceImpl_ColorFill(IWineD3DDevice *iface, - IWineD3DSurface *pSurface, const WINED3DRECT *pRect, WINED3DCOLOR color) + IWineD3DSurface *surface, const WINED3DRECT *pRect, WINED3DCOLOR color) { - IWineD3DSurfaceImpl *surface = (IWineD3DSurfaceImpl *) pSurface; + IWineD3DSurfaceImpl *s = (IWineD3DSurfaceImpl *)surface; WINEDDBLTFX BltFx; - TRACE("iface %p, surface %p, rect %p, color 0x%08x.\n", iface, pSurface, pRect, color); + TRACE("iface %p, surface %p, rect %s, color 0x%08x.\n", + iface, surface, wine_dbgstr_rect((const RECT *)pRect), color); - if (surface->resource.pool != WINED3DPOOL_DEFAULT && surface->resource.pool != WINED3DPOOL_SYSTEMMEM) { + if (s->resource.pool != WINED3DPOOL_DEFAULT && s->resource.pool != WINED3DPOOL_SYSTEMMEM) + { FIXME("call to colorfill with non WINED3DPOOL_DEFAULT or WINED3DPOOL_SYSTEMMEM surface\n"); return WINED3DERR_INVALIDCALL; } if (wined3d_settings.offscreen_rendering_mode == ORM_FBO) { const float c[4] = {D3DCOLOR_R(color), D3DCOLOR_G(color), D3DCOLOR_B(color), D3DCOLOR_A(color)}; - color_fill_fbo(iface, surface, pRect, c); - return WINED3D_OK; - } else { + + return device_clear_render_targets((IWineD3DDeviceImpl *)iface, 1, &s, + !!pRect, pRect, WINED3DCLEAR_TARGET, c, 0.0f, 0); + } + else + { /* Just forward this to the DirectDraw blitting engine */ memset(&BltFx, 0, sizeof(BltFx)); BltFx.dwSize = sizeof(BltFx); - BltFx.u5.dwFillColor = color_convert_argb_to_fmt(color, surface->resource.format_desc->format); - return IWineD3DSurface_Blt(pSurface, (const RECT *)pRect, NULL, NULL, + BltFx.u5.dwFillColor = color_convert_argb_to_fmt(color, s->resource.format_desc->format); + return IWineD3DSurface_Blt(surface, (const RECT *)pRect, NULL, NULL, WINEDDBLT_COLORFILL, &BltFx, WINED3DTEXF_POINT); } } @@ -5581,7 +5548,8 @@ if (wined3d_settings.offscreen_rendering_mode == ORM_FBO) { - color_fill_fbo(iface, surface, NULL, color); + device_clear_render_targets((IWineD3DDeviceImpl *)iface, 1, &surface, + 0, NULL, WINED3DCLEAR_TARGET, color, 0.0f, 0); } else { @@ -5611,21 +5579,25 @@ } /* rendertarget and depth stencil functions */ -static HRESULT WINAPI IWineD3DDeviceImpl_GetRenderTarget(IWineD3DDevice* iface,DWORD RenderTargetIndex, IWineD3DSurface **ppRenderTarget) { - IWineD3DDeviceImpl *This = (IWineD3DDeviceImpl *)iface; +static HRESULT WINAPI IWineD3DDeviceImpl_GetRenderTarget(IWineD3DDevice *iface, + DWORD render_target_idx, IWineD3DSurface **render_target) +{ + IWineD3DDeviceImpl *device = (IWineD3DDeviceImpl *)iface; + + TRACE("iface %p, render_target_idx %u, render_target %p.\n", + iface, render_target_idx, render_target); - if (RenderTargetIndex >= This->adapter->gl_info.limits.buffers) + if (render_target_idx >= device->adapter->gl_info.limits.buffers) { - ERR("(%p) : Only %d render targets are supported.\n", - This, This->adapter->gl_info.limits.buffers); + WARN("Only %u render targets are supported.\n", device->adapter->gl_info.limits.buffers); return WINED3DERR_INVALIDCALL; } - *ppRenderTarget = (IWineD3DSurface *)This->render_targets[RenderTargetIndex]; - TRACE("(%p) : RenderTarget %d Index returning %p\n", This, RenderTargetIndex, *ppRenderTarget); - /* Note inc ref on returned surface */ - if(*ppRenderTarget != NULL) - IWineD3DSurface_AddRef(*ppRenderTarget); + *render_target = (IWineD3DSurface *)device->render_targets[render_target_idx]; + if (*render_target) IWineD3DSurface_AddRef(*render_target); + + TRACE("Returning render target %p.\n", *render_target); + return WINED3D_OK; } @@ -5678,17 +5650,11 @@ TRACE("Changing the front buffer from %p to %p.\n", swapchain->front_buffer, front_impl); if (swapchain->front_buffer) - { - IWineD3DSurface_SetContainer((IWineD3DSurface *)swapchain->front_buffer, NULL); - swapchain->front_buffer->Flags &= ~SFLAG_SWAPCHAIN; - } + surface_set_container(swapchain->front_buffer, WINED3D_CONTAINER_NONE, NULL); swapchain->front_buffer = front_impl; - if (front) - { - IWineD3DSurface_SetContainer(front, (IWineD3DBase *)swapchain); - front_impl->Flags |= SFLAG_SWAPCHAIN; - } + if (front_impl) + surface_set_container(front_impl, WINED3D_CONTAINER_SWAPCHAIN, (IWineD3DBase *)swapchain); } if (swapchain->back_buffers[0] != back_impl) @@ -5696,21 +5662,17 @@ TRACE("Changing the back buffer from %p to %p.\n", swapchain->back_buffers[0], back_impl); if (swapchain->back_buffers[0]) - { - IWineD3DSurface_SetContainer((IWineD3DSurface *)swapchain->back_buffers[0], NULL); - swapchain->back_buffers[0]->Flags &= ~SFLAG_SWAPCHAIN; - } + surface_set_container(swapchain->back_buffers[0], WINED3D_CONTAINER_TEXTURE, NULL); swapchain->back_buffers[0] = back_impl; - if (back) + if (back_impl) { swapchain->presentParms.BackBufferWidth = back_impl->currentDesc.Width; swapchain->presentParms.BackBufferHeight = back_impl->currentDesc.Height; swapchain->presentParms.BackBufferFormat = back_impl->resource.format_desc->format; swapchain->presentParms.BackBufferCount = 1; - IWineD3DSurface_SetContainer(back, (IWineD3DBase *)swapchain); - back_impl->Flags |= SFLAG_SWAPCHAIN; + surface_set_container(back_impl, WINED3D_CONTAINER_SWAPCHAIN, (IWineD3DBase *)swapchain); } else { @@ -5724,87 +5686,93 @@ return WINED3D_OK; } -static HRESULT WINAPI IWineD3DDeviceImpl_GetDepthStencilSurface(IWineD3DDevice* iface, IWineD3DSurface **ppZStencilSurface) { - IWineD3DDeviceImpl *This = (IWineD3DDeviceImpl *)iface; - *ppZStencilSurface = (IWineD3DSurface *)This->depth_stencil; - TRACE("(%p) : zStencilSurface returning %p\n", This, *ppZStencilSurface); +static HRESULT WINAPI IWineD3DDeviceImpl_GetDepthStencilSurface(IWineD3DDevice *iface, IWineD3DSurface **depth_stencil) +{ + IWineD3DDeviceImpl *device = (IWineD3DDeviceImpl *)iface; - if(*ppZStencilSurface != NULL) { - /* Note inc ref on returned surface */ - IWineD3DSurface_AddRef(*ppZStencilSurface); - return WINED3D_OK; - } else { - return WINED3DERR_NOTFOUND; - } + TRACE("iface %p, depth_stencil %p.\n", iface, depth_stencil); + + *depth_stencil = (IWineD3DSurface *)device->depth_stencil; + TRACE("Returning depth/stencil surface %p.\n", *depth_stencil); + if (!*depth_stencil) return WINED3DERR_NOTFOUND; + IWineD3DSurface_AddRef(*depth_stencil); + + return WINED3D_OK; } -static HRESULT WINAPI IWineD3DDeviceImpl_SetRenderTarget(IWineD3DDevice *iface, DWORD RenderTargetIndex, IWineD3DSurface *pRenderTarget, - BOOL set_viewport) { - IWineD3DDeviceImpl *This = (IWineD3DDeviceImpl *)iface; +static HRESULT WINAPI IWineD3DDeviceImpl_SetRenderTarget(IWineD3DDevice *iface, + DWORD render_target_idx, IWineD3DSurface *render_target, BOOL set_viewport) +{ + IWineD3DDeviceImpl *device = (IWineD3DDeviceImpl *)iface; + IWineD3DSurfaceImpl *prev; - TRACE("(%p) : Setting rendertarget %d to %p\n", This, RenderTargetIndex, pRenderTarget); + TRACE("iface %p, render_target_idx %u, render_target %p, set_viewport %#x.\n", + iface, render_target_idx, render_target, set_viewport); - if (RenderTargetIndex >= This->adapter->gl_info.limits.buffers) + if (render_target_idx >= device->adapter->gl_info.limits.buffers) { - WARN("(%p) : Unsupported target %u set, returning WINED3DERR_INVALIDCALL(only %u supported)\n", - This, RenderTargetIndex, This->adapter->gl_info.limits.buffers); + WARN("Only %u render targets are supported.\n", device->adapter->gl_info.limits.buffers); return WINED3DERR_INVALIDCALL; } + prev = device->render_targets[render_target_idx]; + if (render_target == (IWineD3DSurface *)prev) + { + TRACE("Trying to do a NOP SetRenderTarget operation.\n"); + return WINED3D_OK; + } + /* Render target 0 can't be set to NULL. */ - if (!pRenderTarget && !RenderTargetIndex) + if (!render_target && !render_target_idx) { WARN("Trying to set render target 0 to NULL.\n"); return WINED3DERR_INVALIDCALL; } - if (pRenderTarget && !(((IWineD3DSurfaceImpl *)pRenderTarget)->resource.usage & WINED3DUSAGE_RENDERTARGET)) { - FIXME("(%p)Trying to set the render target to a surface(%p) that wasn't created with a usage of WINED3DUSAGE_RENDERTARGET\n",This ,pRenderTarget); + if (render_target && !(((IWineD3DSurfaceImpl *)render_target)->resource.usage & WINED3DUSAGE_RENDERTARGET)) + { + FIXME("Surface %p doesn't have render target usage.\n", render_target); return WINED3DERR_INVALIDCALL; } - /* If we are trying to set what we already have, don't bother */ - if (pRenderTarget == (IWineD3DSurface *)This->render_targets[RenderTargetIndex]) + if (render_target) IWineD3DSurface_AddRef(render_target); + device->render_targets[render_target_idx] = (IWineD3DSurfaceImpl *)render_target; + /* Release after the assignment, to prevent device_resource_released() + * from seeing the surface as still in use. */ + if (prev) IWineD3DSurface_Release((IWineD3DSurface *)prev); + + /* Render target 0 is special. */ + if (!render_target_idx && set_viewport) { - TRACE("Trying to do a NOP SetRenderTarget operation\n"); - return WINED3D_OK; - } - if (pRenderTarget) - IWineD3DSurface_AddRef(pRenderTarget); - if (This->render_targets[RenderTargetIndex]) - IWineD3DSurface_Release((IWineD3DSurface *)This->render_targets[RenderTargetIndex]); - This->render_targets[RenderTargetIndex] = (IWineD3DSurfaceImpl *)pRenderTarget; - - /* Render target 0 is special */ - if(RenderTargetIndex == 0 && set_viewport) { - /* Finally, reset the viewport and scissor rect as the MSDN states. - * Tests show that stateblock recording is ignored, the change goes - * directly into the primary stateblock. - */ - This->stateBlock->viewport.Height = This->render_targets[0]->currentDesc.Height; - This->stateBlock->viewport.Width = This->render_targets[0]->currentDesc.Width; - This->stateBlock->viewport.X = 0; - This->stateBlock->viewport.Y = 0; - This->stateBlock->viewport.MaxZ = 1.0f; - This->stateBlock->viewport.MinZ = 0.0f; - IWineD3DDeviceImpl_MarkStateDirty(This, STATE_VIEWPORT); + /* Set the viewport and scissor rectangles, if requested. Tests show + * that stateblock recording is ignored, the change goes directly + * into the primary stateblock. */ + device->stateBlock->viewport.Height = device->render_targets[0]->currentDesc.Height; + device->stateBlock->viewport.Width = device->render_targets[0]->currentDesc.Width; + device->stateBlock->viewport.X = 0; + device->stateBlock->viewport.Y = 0; + device->stateBlock->viewport.MaxZ = 1.0f; + device->stateBlock->viewport.MinZ = 0.0f; + IWineD3DDeviceImpl_MarkStateDirty(device, STATE_VIEWPORT); - This->stateBlock->scissorRect.top = 0; - This->stateBlock->scissorRect.left = 0; - This->stateBlock->scissorRect.right = This->stateBlock->viewport.Width; - This->stateBlock->scissorRect.bottom = This->stateBlock->viewport.Height; - IWineD3DDeviceImpl_MarkStateDirty(This, STATE_SCISSORRECT); + device->stateBlock->scissorRect.top = 0; + device->stateBlock->scissorRect.left = 0; + device->stateBlock->scissorRect.right = device->stateBlock->viewport.Width; + device->stateBlock->scissorRect.bottom = device->stateBlock->viewport.Height; + IWineD3DDeviceImpl_MarkStateDirty(device, STATE_SCISSORRECT); } + return WINED3D_OK; } -static HRESULT WINAPI IWineD3DDeviceImpl_SetDepthStencilSurface(IWineD3DDevice *iface, IWineD3DSurface *pNewZStencil) { +static HRESULT WINAPI IWineD3DDeviceImpl_SetDepthStencilSurface(IWineD3DDevice *iface, IWineD3DSurface *depth_stencil) +{ IWineD3DDeviceImpl *This = (IWineD3DDeviceImpl *)iface; IWineD3DSurfaceImpl *tmp; - TRACE("device %p, depth_stencil %p, old depth_stencil %p.\n", This, pNewZStencil, This->depth_stencil); + TRACE("device %p, depth_stencil %p, old depth_stencil %p.\n", This, depth_stencil, This->depth_stencil); - if (This->depth_stencil == (IWineD3DSurfaceImpl *)pNewZStencil) + if (This->depth_stencil == (IWineD3DSurfaceImpl *)depth_stencil) { TRACE("Trying to do a NOP SetRenderTarget operation.\n"); return WINED3D_OK; @@ -5827,11 +5795,11 @@ } tmp = This->depth_stencil; - This->depth_stencil = (IWineD3DSurfaceImpl *)pNewZStencil; + This->depth_stencil = (IWineD3DSurfaceImpl *)depth_stencil; if (This->depth_stencil) IWineD3DSurface_AddRef((IWineD3DSurface *)This->depth_stencil); if (tmp) IWineD3DSurface_Release((IWineD3DSurface *)tmp); - if ((!tmp && pNewZStencil) || (!pNewZStencil && tmp)) + if ((!tmp && depth_stencil) || (!depth_stencil && tmp)) { /* Swapping NULL / non NULL depth stencil affects the depth and tests */ IWineD3DDeviceImpl_MarkStateDirty(This, STATE_RENDER(WINED3DRS_ZENABLE)); @@ -5842,14 +5810,15 @@ return WINED3D_OK; } -static HRESULT WINAPI IWineD3DDeviceImpl_SetCursorProperties(IWineD3DDevice* iface, UINT XHotSpot, - UINT YHotSpot, IWineD3DSurface *pCursorBitmap) { - IWineD3DDeviceImpl *This = (IWineD3DDeviceImpl *) iface; - /* TODO: the use of Impl is deprecated. */ - IWineD3DSurfaceImpl * pSur = (IWineD3DSurfaceImpl *) pCursorBitmap; +static HRESULT WINAPI IWineD3DDeviceImpl_SetCursorProperties(IWineD3DDevice *iface, + UINT XHotSpot, UINT YHotSpot, IWineD3DSurface *cursor_image) +{ + IWineD3DDeviceImpl *This = (IWineD3DDeviceImpl *)iface; + IWineD3DSurfaceImpl *s = (IWineD3DSurfaceImpl *)cursor_image; WINED3DLOCKED_RECT lockedRect; - TRACE("(%p) : Spot Pos(%u,%u)\n", This, XHotSpot, YHotSpot); + TRACE("iface %p, hotspot_x %u, hotspot_y %u, cursor_image %p.\n", + iface, XHotSpot, YHotSpot, cursor_image); /* some basic validation checks */ if (This->cursorTexture) @@ -5862,25 +5831,28 @@ This->cursorTexture = 0; } - if ( (pSur->currentDesc.Width == 32) && (pSur->currentDesc.Height == 32) ) + if ((s->currentDesc.Width == 32) && (s->currentDesc.Height == 32)) This->haveHardwareCursor = TRUE; else This->haveHardwareCursor = FALSE; - if(pCursorBitmap) { + if (cursor_image) + { WINED3DLOCKED_RECT rect; /* MSDN: Cursor must be A8R8G8B8 */ - if (pSur->resource.format_desc->format != WINED3DFMT_B8G8R8A8_UNORM) + if (s->resource.format_desc->format != WINED3DFMT_B8G8R8A8_UNORM) { - ERR("(%p) : surface(%p) has an invalid format\n", This, pCursorBitmap); + WARN("surface %p has an invalid format.\n", cursor_image); return WINED3DERR_INVALIDCALL; } /* MSDN: Cursor must be smaller than the display mode */ - if(pSur->currentDesc.Width > This->ddraw_width || - pSur->currentDesc.Height > This->ddraw_height) { - ERR("(%p) : Surface(%p) is %dx%d pixels, but screen res is %dx%d\n", This, pSur, pSur->currentDesc.Width, pSur->currentDesc.Height, This->ddraw_width, This->ddraw_height); + if (s->currentDesc.Width > This->ddraw_width + || s->currentDesc.Height > This->ddraw_height) + { + WARN("Surface %p dimensions are %ux%u, but screen dimensions are %ux%u.\n", + s, s->currentDesc.Width, s->currentDesc.Height, This->ddraw_width, This->ddraw_height); return WINED3DERR_INVALIDCALL; } @@ -5893,9 +5865,9 @@ * creating circular refcount dependencies. Copy out the gl texture * instead. */ - This->cursorWidth = pSur->currentDesc.Width; - This->cursorHeight = pSur->currentDesc.Height; - if (SUCCEEDED(IWineD3DSurface_LockRect(pCursorBitmap, &rect, NULL, WINED3DLOCK_READONLY))) + This->cursorWidth = s->currentDesc.Width; + This->cursorHeight = s->currentDesc.Height; + if (SUCCEEDED(IWineD3DSurface_LockRect(cursor_image, &rect, NULL, WINED3DLOCK_READONLY))) { const struct wined3d_gl_info *gl_info = &This->adapter->gl_info; const struct wined3d_format_desc *format_desc = getFormatDescEntry(WINED3DFMT_B8G8R8A8_UNORM, gl_info); @@ -5915,7 +5887,7 @@ mem = HeapAlloc(GetProcessHeap(), 0, width * height * bpp); for(i = 0; i < height; i++) memcpy(&mem[width * bpp * i], &bits[rect.Pitch * i], width * bpp); - IWineD3DSurface_UnlockRect(pCursorBitmap); + IWineD3DSurface_UnlockRect(cursor_image); context = context_acquire(This, NULL); @@ -5970,22 +5942,17 @@ * 32-bit cursors. 32x32 bits split into 32-bit chunks == 32 * chunks. */ DWORD *maskBits = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, - (pSur->currentDesc.Width * pSur->currentDesc.Height / 8)); - IWineD3DSurface_LockRect(pCursorBitmap, &lockedRect, NULL, - WINED3DLOCK_NO_DIRTY_UPDATE | - WINED3DLOCK_READONLY - ); - TRACE("width: %i height: %i\n", pSur->currentDesc.Width, - pSur->currentDesc.Height); + (s->currentDesc.Width * s->currentDesc.Height / 8)); + IWineD3DSurface_LockRect(cursor_image, &lockedRect, NULL, + WINED3DLOCK_NO_DIRTY_UPDATE | WINED3DLOCK_READONLY); + TRACE("width: %u height: %u.\n", s->currentDesc.Width, s->currentDesc.Height); cursorInfo.fIcon = FALSE; cursorInfo.xHotspot = XHotSpot; cursorInfo.yHotspot = YHotSpot; - cursorInfo.hbmMask = CreateBitmap(pSur->currentDesc.Width, pSur->currentDesc.Height, - 1, 1, maskBits); - cursorInfo.hbmColor = CreateBitmap(pSur->currentDesc.Width, pSur->currentDesc.Height, - 1, 32, lockedRect.pBits); - IWineD3DSurface_UnlockRect(pCursorBitmap); + cursorInfo.hbmMask = CreateBitmap(s->currentDesc.Width, s->currentDesc.Height, 1, 1, maskBits); + cursorInfo.hbmColor = CreateBitmap(s->currentDesc.Width, s->currentDesc.Height, 1, 32, lockedRect.pBits); + IWineD3DSurface_UnlockRect(cursor_image); /* Create our cursor and clean up. */ cursor = CreateIconIndirect(&cursorInfo); SetCursor(cursor); @@ -6571,100 +6538,102 @@ list_remove(&((IWineD3DResourceImpl *) resource)->resource.resource_list_entry); } -void device_resource_released(IWineD3DDeviceImpl *This, IWineD3DResource *resource) +void device_resource_released(IWineD3DDeviceImpl *device, IWineD3DResource *resource) { WINED3DRESOURCETYPE type = IWineD3DResource_GetType(resource); - int counter; + unsigned int i; - TRACE("(%p) : resource %p\n", This, resource); + TRACE("device %p, resource %p, type %s.\n", device, resource, debug_d3dresourcetype(type)); - context_resource_released((IWineD3DDevice *)This, resource, type); + context_resource_released(device, resource, type); - switch (type) { - /* TODO: check front and back buffers, rendertargets etc.. possibly swapchains? */ - case WINED3DRTYPE_SURFACE: { - unsigned int i; + switch (type) + { + case WINED3DRTYPE_SURFACE: + if (!device->d3d_initialized) break; - if (This->d3d_initialized) + for (i = 0; i < device->adapter->gl_info.limits.buffers; ++i) { - for (i = 0; i < This->adapter->gl_info.limits.buffers; ++i) + if (device->render_targets[i] == (IWineD3DSurfaceImpl *)resource) { - if (This->render_targets[i] == (IWineD3DSurfaceImpl *)resource) - This->render_targets[i] = NULL; + ERR("Surface %p is still in use as render target %u.\n", resource, i); + device->render_targets[i] = NULL; } - if (This->depth_stencil == (IWineD3DSurfaceImpl *)resource) - This->depth_stencil = NULL; } + if (device->depth_stencil == (IWineD3DSurfaceImpl *)resource) + { + ERR("Surface %p is still in use as depth/stencil buffer.\n", resource); + device->depth_stencil = NULL; + } break; - } + case WINED3DRTYPE_TEXTURE: case WINED3DRTYPE_CUBETEXTURE: case WINED3DRTYPE_VOLUMETEXTURE: - for (counter = 0; counter < MAX_COMBINED_SAMPLERS; counter++) { - if (This->stateBlock != NULL && This->stateBlock->textures[counter] == (IWineD3DBaseTexture *)resource) { - WARN("Texture being released is still by a stateblock, Stage = %u Texture = %p\n", counter, resource); - This->stateBlock->textures[counter] = NULL; - } - if (This->updateStateBlock != This->stateBlock ){ - if (This->updateStateBlock->textures[counter] == (IWineD3DBaseTexture *)resource) { - WARN("Texture being released is still by a stateblock, Stage = %u Texture = %p\n", counter, resource); - This->updateStateBlock->textures[counter] = NULL; - } - } + for (i = 0; i < MAX_COMBINED_SAMPLERS; ++i) + { + if (device->stateBlock && device->stateBlock->textures[i] == (IWineD3DBaseTexture *)resource) + { + ERR("Texture %p is still in use by stateblock %p, stage %u.\n", + resource, device->stateBlock, i); + device->stateBlock->textures[i] = NULL; } - break; - case WINED3DRTYPE_VOLUME: - /* TODO: nothing really? */ - break; - case WINED3DRTYPE_BUFFER: - { - int streamNumber; - TRACE("Cleaning up stream pointers\n"); - for(streamNumber = 0; streamNumber < MAX_STREAMS; streamNumber ++){ - /* FINDOUT: should a warn be generated if were recording and updateStateBlock->streamSource is lost? - FINDOUT: should changes.streamSource[StreamNumber] be set ? - */ - if (This->updateStateBlock != NULL ) { /* ==NULL when device is being destroyed */ - if ((IWineD3DResource *)This->updateStateBlock->streamSource[streamNumber] == resource) { - FIXME("Vertex buffer released while bound to a state block, stream %d\n", streamNumber); - This->updateStateBlock->streamSource[streamNumber] = 0; - /* Set changed flag? */ - } - } - if (This->stateBlock != NULL ) { /* only happens if there is an error in the application, or on reset/release (because we don't manage internal tracking properly) */ - if ((IWineD3DResource *)This->stateBlock->streamSource[streamNumber] == resource) { - TRACE("Vertex buffer released while bound to a state block, stream %d\n", streamNumber); - This->stateBlock->streamSource[streamNumber] = 0; - } + if (device->updateStateBlock != device->stateBlock + && device->updateStateBlock->textures[i] == (IWineD3DBaseTexture *)resource) + { + ERR("Texture %p is still in use by stateblock %p, stage %u.\n", + resource, device->updateStateBlock, i); + device->updateStateBlock->textures[i] = NULL; } } + break; - if (This->updateStateBlock != NULL ) { /* ==NULL when device is being destroyed */ - if (This->updateStateBlock->pIndexData == (IWineD3DBuffer *)resource) { - This->updateStateBlock->pIndexData = NULL; + case WINED3DRTYPE_BUFFER: + for (i = 0; i < MAX_STREAMS; ++i) + { + if (device->stateBlock && device->stateBlock->streamSource[i] == (IWineD3DBuffer *)resource) + { + ERR("Buffer %p is still in use by stateblock %p, stream %u.\n", + resource, device->stateBlock, i); + device->stateBlock->streamSource[i] = NULL; } - } - if (This->stateBlock != NULL ) { /* ==NULL when device is being destroyed */ - if (This->stateBlock->pIndexData == (IWineD3DBuffer *)resource) { - This->stateBlock->pIndexData = NULL; + + if (device->updateStateBlock != device->stateBlock + && device->updateStateBlock->streamSource[i] == (IWineD3DBuffer *)resource) + { + ERR("Buffer %p is still in use by stateblock %p, stream %u.\n", + resource, device->updateStateBlock, i); + device->updateStateBlock->streamSource[i] = NULL; } + } - } - break; + + if (device->stateBlock && device->stateBlock->pIndexData == (IWineD3DBuffer *)resource) + { + ERR("Buffer %p is still in use by stateblock %p as index buffer.\n", + resource, device->stateBlock); + device->stateBlock->pIndexData = NULL; + } + + if (device->updateStateBlock != device->stateBlock + && device->updateStateBlock->pIndexData == (IWineD3DBuffer *)resource) + { + ERR("Buffer %p is still in use by stateblock %p as index buffer.\n", + resource, device->updateStateBlock); + device->updateStateBlock->pIndexData = NULL; + } + break; default: - FIXME("(%p) unknown resource type %p %u\n", This, resource, IWineD3DResource_GetType(resource)); - break; + break; } - /* Remove the resource from the resourceStore */ - device_resource_remove(This, resource); - - TRACE("Resource released\n"); + device_resource_remove(device, resource); + TRACE("Resource released.\n"); } static HRESULT WINAPI IWineD3DDeviceImpl_EnumResources(IWineD3DDevice *iface, D3DCB_ENUMRESOURCES pCallback, void *pData) { diff -Nru wine1.3-1.3.0/dlls/wined3d/glsl_shader.c wine1.3-1.3.1/dlls/wined3d/glsl_shader.c --- wine1.3-1.3.0/dlls/wined3d/glsl_shader.c 2010-07-30 18:43:56.000000000 +0100 +++ wine1.3-1.3.1/dlls/wined3d/glsl_shader.c 2010-08-20 18:23:50.000000000 +0100 @@ -4462,18 +4462,16 @@ GLhandleARB vshader_id, pshader_id; const char *blt_pshader; - static const char *blt_vshader[] = - { + static const char *blt_vshader = "#version 120\n" "void main(void)\n" "{\n" " gl_Position = gl_Vertex;\n" " gl_FrontColor = vec4(1.0);\n" " gl_TexCoord[0] = gl_MultiTexCoord0;\n" - "}\n" - }; + "}\n"; - static const char *blt_pshaders_full[tex_type_count] = + static const char * const blt_pshaders_full[tex_type_count] = { /* tex_1d */ NULL, @@ -4503,7 +4501,7 @@ "}\n", }; - static const char *blt_pshaders_masked[tex_type_count] = + static const char * const blt_pshaders_masked[tex_type_count] = { /* tex_1d */ NULL, @@ -4547,7 +4545,7 @@ } vshader_id = GL_EXTCALL(glCreateShaderObjectARB(GL_VERTEX_SHADER_ARB)); - GL_EXTCALL(glShaderSourceARB(vshader_id, 1, blt_vshader, NULL)); + GL_EXTCALL(glShaderSourceARB(vshader_id, 1, &blt_vshader, NULL)); GL_EXTCALL(glCompileShaderARB(vshader_id)); pshader_id = GL_EXTCALL(glCreateShaderObjectARB(GL_FRAGMENT_SHADER_ARB)); diff -Nru wine1.3-1.3.0/dlls/wined3d/palette.c wine1.3-1.3.1/dlls/wined3d/palette.c --- wine1.3-1.3.0/dlls/wined3d/palette.c 2010-07-30 18:43:56.000000000 +0100 +++ wine1.3-1.3.1/dlls/wined3d/palette.c 2010-08-20 18:23:50.000000000 +0100 @@ -74,7 +74,7 @@ } /* Not called from the vtable */ -static DWORD IWineD3DPaletteImpl_Size(DWORD dwFlags) +static WORD IWineD3DPaletteImpl_Size(DWORD dwFlags) { switch (dwFlags & SIZE_BITS) { case WINEDDPCAPS_1BIT: return 2; diff -Nru wine1.3-1.3.0/dlls/wined3d/resource.c wine1.3-1.3.1/dlls/wined3d/resource.c --- wine1.3-1.3.0/dlls/wined3d/resource.c 2010-07-30 18:43:56.000000000 +0100 +++ wine1.3-1.3.1/dlls/wined3d/resource.c 2010-08-20 18:23:50.000000000 +0100 @@ -105,6 +105,12 @@ if (This->resource.device) device_resource_released(This->resource.device, iface); } +void resource_unload(IWineD3DResourceImpl *resource) +{ + context_resource_unloaded(resource->resource.device, (IWineD3DResource *)resource, + resource->resource.resourceType); +} + static PrivateData* resource_find_private_data(IWineD3DResourceImpl *This, REFGUID tag) { PrivateData *data; diff -Nru wine1.3-1.3.0/dlls/wined3d/shader.c wine1.3-1.3.1/dlls/wined3d/shader.c --- wine1.3-1.3.0/dlls/wined3d/shader.c 2010-07-30 18:43:56.000000000 +0100 +++ wine1.3-1.3.1/dlls/wined3d/shader.c 2010-08-20 18:23:50.000000000 +0100 @@ -33,7 +33,7 @@ WINE_DEFAULT_DEBUG_CHANNEL(d3d_shader); WINE_DECLARE_DEBUG_CHANNEL(d3d); -static const char *shader_opcode_names[] = +static const char * const shader_opcode_names[] = { /* WINED3DSIH_ABS */ "abs", /* WINED3DSIH_ADD */ "add", @@ -125,7 +125,7 @@ /* WINED3DSIH_TEXREG2RGB */ "texreg2rgb", }; -static const char *semantic_names[] = +static const char * const semantic_names[] = { /* WINED3DDECLUSAGE_POSITION */ "SV_POSITION", /* WINED3DDECLUSAGE_BLENDWEIGHT */ "BLENDWEIGHT", diff -Nru wine1.3-1.3.0/dlls/wined3d/state.c wine1.3-1.3.1/dlls/wined3d/state.c --- wine1.3-1.3.0/dlls/wined3d/state.c 2010-07-30 18:43:56.000000000 +0100 +++ wine1.3-1.3.1/dlls/wined3d/state.c 2010-08-20 18:23:50.000000000 +0100 @@ -1459,7 +1459,7 @@ if(stateblock->renderState[WINED3DRS_POINTSCALEENABLE]) { GLfloat scaleFactor; - float h = stateblock->viewport.Height; + DWORD h = stateblock->viewport.Height; if (pointSize.f < gl_info->limits.pointsize_min) { @@ -1487,7 +1487,7 @@ } else { scaleFactor = 1.0f; } - scaleFactor = pow(h * scaleFactor, 2); + scaleFactor = powf(h * scaleFactor, 2); att[0] = A.f / scaleFactor; att[1] = B.f / scaleFactor; @@ -3600,7 +3600,7 @@ IWineD3DDeviceImpl *device = stateblock->device; BOOL use_pshader = use_ps(stateblock); BOOL use_vshader = use_vs(stateblock); - int i; + unsigned int i; if (use_pshader) { if(!context->last_was_pshader) { diff -Nru wine1.3-1.3.0/dlls/wined3d/surface_base.c wine1.3-1.3.1/dlls/wined3d/surface_base.c --- wine1.3-1.3.0/dlls/wined3d/surface_base.c 2010-07-30 18:43:56.000000000 +0100 +++ wine1.3-1.3.1/dlls/wined3d/surface_base.c 2010-08-20 18:23:50.000000000 +0100 @@ -46,18 +46,18 @@ if(isnan(*in)) return 0x7C01; if (isinf(*in)) return (*in < 0.0f ? 0xFC00 : 0x7c00); - if(tmp < pow(2, 10)) { + if(tmp < powf(2, 10)) { do { tmp = tmp * 2.0f; exp--; - }while(tmp < pow(2, 10)); - } else if(tmp >= pow(2, 11)) { + }while(tmp < powf(2, 10)); + } else if(tmp >= powf(2, 11)) { do { tmp /= 2.0f; exp++; - }while(tmp >= pow(2, 11)); + }while(tmp >= powf(2, 11)); } mantissa = (unsigned int) tmp; @@ -159,7 +159,7 @@ } /* Standalone surfaces return the device as container. */ - if (This->container) container = This->container; + if (This->container.u.base) container = This->container.u.base; else container = (IWineD3DBase *)This->resource.device; TRACE("Relaying to QueryInterface\n"); @@ -327,7 +327,8 @@ DWORD ret; TRACE("(%p)\n", This); - if (format_desc->Flags & WINED3DFMT_FLAG_COMPRESSED) + if ((format_desc->Flags & (WINED3DFMT_FLAG_COMPRESSED | WINED3DFMT_FLAG_BROKEN_PITCH)) + == WINED3DFMT_FLAG_COMPRESSED) { /* Since compressed formats are block based, pitch means the amount of * bytes to the next row of block rather than the next row of pixels. */ @@ -484,19 +485,6 @@ return WINED3D_OK; } -HRESULT WINAPI IWineD3DBaseSurfaceImpl_SetContainer(IWineD3DSurface *iface, IWineD3DBase *container) { - IWineD3DSurfaceImpl *This = (IWineD3DSurfaceImpl *)iface; - - TRACE("This %p, container %p\n", This, container); - - /* We can't keep a reference to the container, since the container already keeps a reference to us. */ - - TRACE("Setting container to %p from %p\n", container, This->container); - This->container = container; - - return WINED3D_OK; -} - HRESULT WINAPI IWineD3DBaseSurfaceImpl_SetFormat(IWineD3DSurface *iface, WINED3DFORMAT format) { IWineD3DSurfaceImpl *This = (IWineD3DSurfaceImpl *)iface; const struct wined3d_format_desc *format_desc = getFormatDescEntry(format, @@ -510,7 +498,7 @@ TRACE("(%p) : Setting texture format to (%d,%s)\n", This, format, debug_d3dformat(format)); - This->resource.size = surface_calculate_size(format_desc, This->resource.device->surface_alignment, + This->resource.size = wined3d_format_calculate_size(format_desc, This->resource.device->surface_alignment, This->pow2Width, This->pow2Height); This->Flags |= (WINED3DFMT_D16_LOCKABLE == format) ? SFLAG_LOCKABLE : 0; @@ -944,14 +932,14 @@ * * Params: * DestRect: Destination rectangle to write to - * SrcSurface: Source surface, can be NULL + * src_surface: Source surface, can be NULL * SrcRect: Source rectangle *****************************************************************************/ -HRESULT WINAPI IWineD3DBaseSurfaceImpl_Blt(IWineD3DSurface *iface, const RECT *DestRect, IWineD3DSurface *SrcSurface, +HRESULT WINAPI IWineD3DBaseSurfaceImpl_Blt(IWineD3DSurface *iface, const RECT *DestRect, IWineD3DSurface *src_surface, const RECT *SrcRect, DWORD Flags, const WINEDDBLTFX *DDBltFx, WINED3DTEXTUREFILTERTYPE Filter) { - IWineD3DSurfaceImpl *This = (IWineD3DSurfaceImpl *) iface; - IWineD3DSurfaceImpl *Src = (IWineD3DSurfaceImpl *) SrcSurface; + IWineD3DSurfaceImpl *This = (IWineD3DSurfaceImpl *)iface; + IWineD3DSurfaceImpl *src = (IWineD3DSurfaceImpl *)src_surface; RECT xdst,xsrc; HRESULT ret = WINED3D_OK; WINED3DLOCKED_RECT dlock, slock; @@ -960,17 +948,12 @@ int x, y; const BYTE *sbuf; BYTE *dbuf; - TRACE("(%p)->(%p,%p,%p,%x,%p)\n", This, DestRect, Src, SrcRect, Flags, DDBltFx); - if (TRACE_ON(d3d_surface)) - { - if (DestRect) TRACE("\tdestrect :%dx%d-%dx%d\n", - DestRect->left, DestRect->top, DestRect->right, DestRect->bottom); - if (SrcRect) TRACE("\tsrcrect :%dx%d-%dx%d\n", - SrcRect->left, SrcRect->top, SrcRect->right, SrcRect->bottom); - } + TRACE("iface %p, dst_rect %s, src_surface %p, src_rect %s, flags %#x, fx %p, filter %s.\n", + iface, wine_dbgstr_rect(DestRect), src_surface, wine_dbgstr_rect(SrcRect), + Flags, DDBltFx, debug_d3dtexturefiltertype(Filter)); - if ( (This->Flags & SFLAG_LOCKED) || ((Src != NULL) && (Src->Flags & SFLAG_LOCKED))) + if ((This->Flags & SFLAG_LOCKED) || (src && (src->Flags & SFLAG_LOCKED))) { WARN(" Surface is busy, returning DDERR_SURFACEBUSY\n"); return WINEDDERR_SURFACEBUSY; @@ -986,21 +969,21 @@ if (SrcRect) { - if (Src) + if (src) { if (SrcRect->right < SrcRect->left || SrcRect->bottom < SrcRect->top - || SrcRect->left > Src->currentDesc.Width || SrcRect->left < 0 - || SrcRect->top > Src->currentDesc.Height || SrcRect->top < 0 - || SrcRect->right > Src->currentDesc.Width || SrcRect->right < 0 - || SrcRect->bottom > Src->currentDesc.Height || SrcRect->bottom < 0) + || SrcRect->left > src->currentDesc.Width || SrcRect->left < 0 + || SrcRect->top > src->currentDesc.Height || SrcRect->top < 0 + || SrcRect->right > src->currentDesc.Width || SrcRect->right < 0 + || SrcRect->bottom > src->currentDesc.Height || SrcRect->bottom < 0) { WARN("Application gave us bad source rectangle for Blt.\n"); return WINEDDERR_INVALIDRECT; } if (!SrcRect->right || !SrcRect->bottom - || SrcRect->left == (int)Src->currentDesc.Width - || SrcRect->top == (int)Src->currentDesc.Height) + || SrcRect->left == (int)src->currentDesc.Width + || SrcRect->top == (int)src->currentDesc.Height) { TRACE("Nothing to be done.\n"); return WINED3D_OK; @@ -1009,12 +992,12 @@ xsrc = *SrcRect; } - else if (Src) + else if (src) { xsrc.left = 0; xsrc.top = 0; - xsrc.right = Src->currentDesc.Width; - xsrc.bottom = Src->currentDesc.Height; + xsrc.right = src->currentDesc.Width; + xsrc.bottom = src->currentDesc.Height; } else { @@ -1043,7 +1026,7 @@ return WINED3D_OK; } - if (!Src) + if (!src) { RECT full_rect; @@ -1105,8 +1088,8 @@ || (xdst.left >= (int)This->currentDesc.Width) || (xdst.top >= (int)This->currentDesc.Height) || (xsrc.right <= 0) || (xsrc.bottom <= 0) - || (xsrc.left >= (int) Src->currentDesc.Width) - || (xsrc.top >= (int)Src->currentDesc.Height)) + || (xsrc.left >= (int)src->currentDesc.Width) + || (xsrc.top >= (int)src->currentDesc.Height)) { TRACE("Nothing to be done after clipping.\n"); return WINED3D_OK; @@ -1122,7 +1105,7 @@ xdst.bottom = This->currentDesc.Height; } - if (Src == This) + if (src == This) { IWineD3DSurface_LockRect(iface, &dlock, NULL, 0); slock = dlock; @@ -1132,19 +1115,20 @@ else { dEntry = This->resource.format_desc; - if (Src) + if (src) { - if (This->resource.format_desc->format != Src->resource.format_desc->format) + if (This->resource.format_desc->format != src->resource.format_desc->format) { - Src = surface_convert_format(Src, dEntry->format); - if(!Src) { + src = surface_convert_format(src, dEntry->format); + if (!src) + { /* The conv function writes a FIXME */ WARN("Cannot convert source surface format to dest format\n"); goto release; } } - IWineD3DSurface_LockRect((IWineD3DSurface *) Src, &slock, NULL, WINED3DLOCK_READONLY); - sEntry = Src->resource.format_desc; + IWineD3DSurface_LockRect((IWineD3DSurface *)src, &slock, NULL, WINED3DLOCK_READONLY); + sEntry = src->resource.format_desc; } else { @@ -1160,7 +1144,7 @@ if (sEntry->Flags & dEntry->Flags & WINED3DFMT_FLAG_FOURCC) { - if (!DestRect || Src == This) + if (!DestRect || src == This) { memcpy(dlock.pBits, slock.pBits, This->resource.size); goto release; @@ -1174,7 +1158,7 @@ dstwidth = xdst.right - xdst.left; width = (xdst.right - xdst.left) * bpp; - if (DestRect && Src != This) + if (DestRect && src != This) dbuf = dlock.pBits; else dbuf = (BYTE*)dlock.pBits+(xdst.top*dlock.Pitch)+(xdst.left*bpp); @@ -1239,7 +1223,7 @@ FIXME("\tDdraw Raster Ops: %08x Pattern: %p\n", DDBltFx->dwDDROP, DDBltFx->u5.lpDDSPattern); } /* Now the 'with source' blits */ - if (Src) + if (src) { const BYTE *sbase; int sx, xinc, sy, yinc; @@ -1262,7 +1246,7 @@ sbuf = sbase; /* check for overlapping surfaces */ - if (Src != This || xdst.top < xsrc.top || + if (src != This || xdst.top < xsrc.top || xdst.right <= xsrc.left || xsrc.right <= xdst.left) { /* no overlap, or dst above src, so copy from top downwards */ @@ -1370,8 +1354,8 @@ /* The color keying flags are checked for correctness in ddraw */ if (Flags & WINEDDBLT_KEYSRC) { - keylow = Src->SrcBltCKey.dwColorSpaceLowValue; - keyhigh = Src->SrcBltCKey.dwColorSpaceHighValue; + keylow = src->SrcBltCKey.dwColorSpaceLowValue; + keyhigh = src->SrcBltCKey.dwColorSpaceHighValue; } else if (Flags & WINEDDBLT_KEYSRCOVERRIDE) { @@ -1382,8 +1366,8 @@ if (Flags & WINEDDBLT_KEYDEST) { /* Destination color keys are taken from the source surface ! */ - destkeylow = Src->DestBltCKey.dwColorSpaceLowValue; - destkeyhigh = Src->DestBltCKey.dwColorSpaceHighValue; + destkeylow = src->DestBltCKey.dwColorSpaceLowValue; + destkeyhigh = src->DestBltCKey.dwColorSpaceHighValue; } else if (Flags & WINEDDBLT_KEYDESTOVERRIDE) { @@ -1554,9 +1538,9 @@ release: IWineD3DSurface_UnlockRect(iface); - if (Src && Src != This) IWineD3DSurface_UnlockRect((IWineD3DSurface *) Src); + if (src && src != This) IWineD3DSurface_UnlockRect((IWineD3DSurface *)src); /* Release the converted surface if any */ - if (Src && SrcSurface != (IWineD3DSurface *) Src) IWineD3DSurface_Release((IWineD3DSurface *) Src); + if (src && src_surface != (IWineD3DSurface *)src) IWineD3DSurface_Release((IWineD3DSurface *)src); return ret; } @@ -1570,7 +1554,7 @@ * Params: * dstx: * dsty: - * Source: Source surface to copy from + * src_surface: Source surface to copy from * rsrc: Source rectangle * trans: Some Flags * @@ -1579,10 +1563,10 @@ * *****************************************************************************/ HRESULT WINAPI IWineD3DBaseSurfaceImpl_BltFast(IWineD3DSurface *iface, DWORD dstx, DWORD dsty, - IWineD3DSurface *Source, const RECT *rsrc, DWORD trans) + IWineD3DSurface *src_surface, const RECT *rsrc, DWORD trans) { - IWineD3DSurfaceImpl *This = (IWineD3DSurfaceImpl *) iface; - IWineD3DSurfaceImpl *Src = (IWineD3DSurfaceImpl *) Source; + IWineD3DSurfaceImpl *This = (IWineD3DSurfaceImpl *)iface; + IWineD3DSurfaceImpl *src = (IWineD3DSurfaceImpl *)src_surface; int bpp, w, h, x, y; WINED3DLOCKED_RECT dlock,slock; @@ -1593,23 +1577,10 @@ BYTE *dbuf; const struct wined3d_format_desc *sEntry, *dEntry; - if (TRACE_ON(d3d_surface)) - { - TRACE("(%p)->(%d,%d,%p,%p,%08x)\n", This,dstx,dsty,Src,rsrc,trans); - - if (rsrc) - { - TRACE("\tsrcrect: %dx%d-%dx%d\n",rsrc->left,rsrc->top, - rsrc->right,rsrc->bottom); - } - else - { - TRACE(" srcrect: NULL\n"); - } - } + TRACE("iface %p, dst_x %u, dst_y %u, src_surface %p, src_rect %s, flags %#x.\n", + iface, dstx, dsty, src_surface, wine_dbgstr_rect(rsrc), trans); - if ((This->Flags & SFLAG_LOCKED) || - (Src->Flags & SFLAG_LOCKED)) + if ((This->Flags & SFLAG_LOCKED) || (src->Flags & SFLAG_LOCKED)) { WARN(" Surface is busy, returning DDERR_SURFACEBUSY\n"); return WINEDDERR_SURFACEBUSY; @@ -1620,17 +1591,17 @@ WARN("rsrc is NULL!\n"); rsrc2.left = 0; rsrc2.top = 0; - rsrc2.right = Src->currentDesc.Width; - rsrc2.bottom = Src->currentDesc.Height; + rsrc2.right = src->currentDesc.Width; + rsrc2.bottom = src->currentDesc.Height; rsrc = &rsrc2; } /* Check source rect for validity. Copied from normal Blt. Fixes Baldur's Gate.*/ - if ((rsrc->bottom > Src->currentDesc.Height) || (rsrc->bottom < 0) || - (rsrc->top > Src->currentDesc.Height) || (rsrc->top < 0) || - (rsrc->left > Src->currentDesc.Width) || (rsrc->left < 0) || - (rsrc->right > Src->currentDesc.Width) || (rsrc->right < 0) || - (rsrc->right < rsrc->left) || (rsrc->bottom < rsrc->top)) + if ((rsrc->bottom > src->currentDesc.Height) || (rsrc->bottom < 0) + || (rsrc->top > src->currentDesc.Height) || (rsrc->top < 0) + || (rsrc->left > src->currentDesc.Width) || (rsrc->left < 0) + || (rsrc->right > src->currentDesc.Width) || (rsrc->right < 0) + || (rsrc->right < rsrc->left) || (rsrc->bottom < rsrc->top)) { WARN("Application gave us bad source rectangle for BltFast.\n"); return WINEDDERR_INVALIDRECT; @@ -1638,12 +1609,12 @@ h = rsrc->bottom - rsrc->top; if (h > This->currentDesc.Height-dsty) h = This->currentDesc.Height-dsty; - if (h > Src->currentDesc.Height-rsrc->top) h=Src->currentDesc.Height-rsrc->top; + if (h > src->currentDesc.Height-rsrc->top) h = src->currentDesc.Height-rsrc->top; if (h <= 0) return WINEDDERR_INVALIDRECT; w = rsrc->right - rsrc->left; if (w > This->currentDesc.Width-dstx) w = This->currentDesc.Width-dstx; - if (w > Src->currentDesc.Width-rsrc->left) w = Src->currentDesc.Width-rsrc->left; + if (w > src->currentDesc.Width-rsrc->left) w = src->currentDesc.Width-rsrc->left; if (w <= 0) return WINEDDERR_INVALIDRECT; /* Now compute the locking rectangle... */ @@ -1660,7 +1631,7 @@ bpp = This->resource.format_desc->byte_count; /* We need to lock the surfaces, or we won't get refreshes when done. */ - if (Src == This) + if (src == This) { int pitch; @@ -1676,12 +1647,12 @@ /* Since slock was originally copied from this surface's description, we can just reuse it */ sbuf = This->resource.allocatedMemory + lock_src.top * pitch + lock_src.left * bpp; dbuf = This->resource.allocatedMemory + lock_dst.top * pitch + lock_dst.left * bpp; - sEntry = Src->resource.format_desc; + sEntry = src->resource.format_desc; dEntry = sEntry; } else { - ret = IWineD3DSurface_LockRect(Source, &slock, &lock_src, WINED3DLOCK_READONLY); + ret = IWineD3DSurface_LockRect(src_surface, &slock, &lock_src, WINED3DLOCK_READONLY); if(ret != WINED3D_OK) goto error; ret = IWineD3DSurface_LockRect(iface, &dlock, &lock_dst, 0); if(ret != WINED3D_OK) goto error; @@ -1690,7 +1661,7 @@ dbuf = dlock.pBits; TRACE("Dst is at %p, Src is at %p\n", dbuf, sbuf); - sEntry = Src->resource.format_desc; + sEntry = src->resource.format_desc; dEntry = This->resource.format_desc; } @@ -1704,7 +1675,7 @@ FIXME("trans arg not supported when a compressed surface is involved\n"); if (dstx || dsty) FIXME("offset for destination surface is not supported\n"); - if (Src->resource.format_desc->format != This->resource.format_desc->format) + if (src->resource.format_desc->format != This->resource.format_desc->format) { FIXME("compressed -> compressed copy only supported for the same type of surface\n"); ret = WINED3DERR_WRONGTEXTUREFORMAT; @@ -1733,9 +1704,9 @@ if (trans & (WINEDDBLTFAST_SRCCOLORKEY | WINEDDBLTFAST_DESTCOLORKEY)) { DWORD keylow, keyhigh; - DWORD mask = Src->resource.format_desc->red_mask | - Src->resource.format_desc->green_mask | - Src->resource.format_desc->blue_mask; + DWORD mask = src->resource.format_desc->red_mask + | src->resource.format_desc->green_mask + | src->resource.format_desc->blue_mask; /* For some 8-bit formats like L8 and P8 color masks don't make sense */ if(!mask && bpp==1) @@ -1744,8 +1715,8 @@ TRACE("Color keyed copy\n"); if (trans & WINEDDBLTFAST_SRCCOLORKEY) { - keylow = Src->SrcBltCKey.dwColorSpaceLowValue; - keyhigh = Src->SrcBltCKey.dwColorSpaceHighValue; + keylow = src->SrcBltCKey.dwColorSpaceLowValue; + keyhigh = src->SrcBltCKey.dwColorSpaceHighValue; } else { @@ -1836,14 +1807,14 @@ } error: - if (Src == This) + if (src == This) { IWineD3DSurface_UnlockRect(iface); } else { IWineD3DSurface_UnlockRect(iface); - IWineD3DSurface_UnlockRect(Source); + IWineD3DSurface_UnlockRect(src_surface); } return ret; @@ -1877,7 +1848,8 @@ TRACE("Lock Rect (%p) = l %d, t %d, r %d, b %d\n", pRect, pRect->left, pRect->top, pRect->right, pRect->bottom); - if (format_desc->Flags & WINED3DFMT_FLAG_COMPRESSED) + if ((format_desc->Flags & (WINED3DFMT_FLAG_COMPRESSED | WINED3DFMT_FLAG_BROKEN_PITCH)) + == WINED3DFMT_FLAG_COMPRESSED) { /* Compressed textures are block based, so calculate the offset of * the block that contains the top-left pixel of the locked rectangle. */ diff -Nru wine1.3-1.3.0/dlls/wined3d/surface.c wine1.3-1.3.1/dlls/wined3d/surface.c --- wine1.3-1.3.0/dlls/wined3d/surface.c 2010-07-30 18:43:56.000000000 +0100 +++ wine1.3-1.3.1/dlls/wined3d/surface.c 2010-08-20 18:23:50.000000000 +0100 @@ -36,44 +36,42 @@ static void surface_cleanup(IWineD3DSurfaceImpl *This) { - IWineD3DDeviceImpl *device = This->resource.device; - const struct wined3d_gl_info *gl_info = &device->adapter->gl_info; - struct wined3d_context *context = NULL; - renderbuffer_entry_t *entry, *entry2; - TRACE("(%p) : Cleaning up.\n", This); - /* Need a context to destroy the texture. Use the currently active render - * target, but only if the primary render target exists. Otherwise - * lastActiveRenderTarget is garbage. When destroying the primary render - * target, Uninit3D() will activate a context before doing anything. */ - if (device->render_targets && device->render_targets[0]) + if (This->texture_name || (This->Flags & SFLAG_PBO) || !list_empty(&This->renderbuffers)) { - context = context_acquire(device, NULL); - } + const struct wined3d_gl_info *gl_info; + renderbuffer_entry_t *entry, *entry2; + struct wined3d_context *context; - ENTER_GL(); + context = context_acquire(This->resource.device, NULL); + gl_info = context->gl_info; - if (This->texture_name) - { - /* Release the OpenGL texture. */ - TRACE("Deleting texture %u.\n", This->texture_name); - glDeleteTextures(1, &This->texture_name); - } + ENTER_GL(); - if (This->Flags & SFLAG_PBO) - { - /* Delete the PBO. */ - GL_EXTCALL(glDeleteBuffersARB(1, &This->pbo)); - } + if (This->texture_name) + { + TRACE("Deleting texture %u.\n", This->texture_name); + glDeleteTextures(1, &This->texture_name); + } - LIST_FOR_EACH_ENTRY_SAFE(entry, entry2, &This->renderbuffers, renderbuffer_entry_t, entry) - { - gl_info->fbo_ops.glDeleteRenderbuffers(1, &entry->id); - HeapFree(GetProcessHeap(), 0, entry); - } + if (This->Flags & SFLAG_PBO) + { + TRACE("Deleting PBO %u.\n", This->pbo); + GL_EXTCALL(glDeleteBuffersARB(1, &This->pbo)); + } - LEAVE_GL(); + LIST_FOR_EACH_ENTRY_SAFE(entry, entry2, &This->renderbuffers, renderbuffer_entry_t, entry) + { + TRACE("Deleting renderbuffer %u.\n", entry->id); + gl_info->fbo_ops.glDeleteRenderbuffers(1, &entry->id); + HeapFree(GetProcessHeap(), 0, entry); + } + + LEAVE_GL(); + + context_release(context); + } if (This->Flags & SFLAG_DIBSECTION) { @@ -92,33 +90,36 @@ HeapFree(GetProcessHeap(), 0, This->palette9); resource_cleanup((IWineD3DResource *)This); - - if (context) context_release(context); } -UINT surface_calculate_size(const struct wined3d_format_desc *format_desc, UINT alignment, UINT width, UINT height) +void surface_set_container(IWineD3DSurfaceImpl *surface, enum wined3d_container_type type, IWineD3DBase *container) { - UINT size; + TRACE("surface %p, container %p.\n", surface, container); - if (format_desc->format == WINED3DFMT_UNKNOWN) - { - size = 0; - } - else if (format_desc->Flags & WINED3DFMT_FLAG_COMPRESSED) + if (type == WINED3D_CONTAINER_SWAPCHAIN) { - UINT row_block_count = (width + format_desc->block_width - 1) / format_desc->block_width; - UINT row_count = (height + format_desc->block_height - 1) / format_desc->block_height; - size = row_count * row_block_count * format_desc->block_byte_count; + surface->get_drawable_size = get_drawable_size_swapchain; } else { - /* The pitch is a multiple of 4 bytes. */ - size = height * (((width * format_desc->byte_count) + alignment - 1) & ~(alignment - 1)); - } + switch (wined3d_settings.offscreen_rendering_mode) + { + case ORM_FBO: + surface->get_drawable_size = get_drawable_size_fbo; + break; + + case ORM_BACKBUFFER: + surface->get_drawable_size = get_drawable_size_backbuffer; + break; - if (format_desc->heightscale != 0.0f) size *= format_desc->heightscale; + default: + ERR("Unhandled offscreen rendering mode %#x.\n", wined3d_settings.offscreen_rendering_mode); + return; + } + } - return size; + surface->container.type = type; + surface->container.u.base = container; } struct blt_info @@ -287,7 +288,6 @@ /* GL locking and context activation is done by the caller */ void draw_textured_quad(IWineD3DSurfaceImpl *src_surface, const RECT *src_rect, const RECT *dst_rect, WINED3DTEXTUREFILTERTYPE Filter) { - IWineD3DBaseTextureImpl *texture; struct blt_info info; surface_get_blt_info(src_surface->texture_target, src_rect, src_surface->pow2Width, src_surface->pow2Height, &info); @@ -332,12 +332,12 @@ /* We changed the filtering settings on the texture. Inform the * container about this to get the filters reset properly next draw. */ - if (SUCCEEDED(IWineD3DSurface_GetContainer((IWineD3DSurface *)src_surface, &IID_IWineD3DBaseTexture, (void **)&texture))) + if (src_surface->container.type == WINED3D_CONTAINER_TEXTURE) { + IWineD3DBaseTextureImpl *texture = src_surface->container.u.texture; texture->baseTexture.texture_rgb.states[WINED3DTEXSTA_MAGFILTER] = WINED3DTEXF_POINT; texture->baseTexture.texture_rgb.states[WINED3DTEXSTA_MINFILTER] = WINED3DTEXF_POINT; texture->baseTexture.texture_rgb.states[WINED3DTEXSTA_MIPFILTER] = WINED3DTEXF_NONE; - IWineD3DBaseTexture_Release((IWineD3DBaseTexture *)texture); } } @@ -360,7 +360,7 @@ /* FIXME: Check that the format is supported by the device. */ - resource_size = surface_calculate_size(format_desc, alignment, width, height); + resource_size = wined3d_format_calculate_size(format_desc, alignment, width, height); /* Look at the implementation and set the correct Vtable. */ switch (surface_type) @@ -389,7 +389,7 @@ } /* "Standalone" surface. */ - IWineD3DSurface_SetContainer((IWineD3DSurface *)surface, NULL); + surface_set_container(surface, WINED3D_CONTAINER_NONE, NULL); surface->currentDesc.Width = width; surface->currentDesc.Height = height; @@ -489,7 +489,7 @@ /* FIXME: We shouldn't need to remove SFLAG_INTEXTURE if the * surface has no texture name yet. See if we can get rid of this. */ if (surface->Flags & flag) - ERR("Surface has SFLAG_INTEXTURE set, but no texture name\n"); + ERR("Surface has %s set, but no texture name.\n", debug_surflocation(flag)); surface_modify_location(surface, flag, FALSE); } @@ -921,11 +921,11 @@ GLenum surface_get_gl_buffer(IWineD3DSurfaceImpl *surface) { - IWineD3DSwapChainImpl *swapchain = (IWineD3DSwapChainImpl *)surface->container; + IWineD3DSwapChainImpl *swapchain = surface->container.u.swapchain; TRACE("surface %p.\n", surface); - if (!(surface->Flags & SFLAG_SWAPCHAIN)) + if (surface->container.type != WINED3D_CONTAINER_SWAPCHAIN) { ERR("Surface %p is not on a swapchain.\n", surface); return GL_NONE; @@ -954,8 +954,6 @@ /* Slightly inefficient way to handle multiple dirty rects but it works :) */ void surface_add_dirty_rect(IWineD3DSurfaceImpl *surface, const RECT *dirty_rect) { - IWineD3DBaseTexture *baseTexture = NULL; - TRACE("surface %p, dirty_rect %s.\n", surface, wine_dbgstr_rect(dirty_rect)); if (!(surface->Flags & SFLAG_INSYSMEM) && (surface->Flags & SFLAG_INTEXTURE)) @@ -979,12 +977,10 @@ } /* if the container is a basetexture then mark it dirty. */ - if (SUCCEEDED(IWineD3DSurface_GetContainer((IWineD3DSurface *)surface, - &IID_IWineD3DBaseTexture, (void **)&baseTexture))) + if (surface->container.type == WINED3D_CONTAINER_TEXTURE) { - TRACE("Passing to container\n"); - IWineD3DBaseTexture_SetDirty(baseTexture, TRUE); - IWineD3DBaseTexture_Release(baseTexture); + TRACE("Passing to container.\n"); + IWineD3DBaseTexture_SetDirty((IWineD3DBaseTexture *)surface->container.u.texture, TRUE); } } @@ -1067,19 +1063,19 @@ void surface_internal_preload(IWineD3DSurfaceImpl *surface, enum WINED3DSRGB srgb) { - /* TODO: check for locks */ IWineD3DDeviceImpl *device = surface->resource.device; - IWineD3DBaseTexture *baseTexture = NULL; - TRACE("(%p)Checking to see if the container is a base texture\n", surface); - if (SUCCEEDED(IWineD3DSurface_GetContainer((IWineD3DSurface *)surface, - &IID_IWineD3DBaseTexture, (void **)&baseTexture))) - { - IWineD3DBaseTextureImpl *tex_impl = (IWineD3DBaseTextureImpl *)baseTexture; - TRACE("Passing to container\n"); - tex_impl->baseTexture.internal_preload(baseTexture, srgb); - IWineD3DBaseTexture_Release(baseTexture); - } else { + TRACE("iface %p, srgb %#x.\n", surface, srgb); + + if (surface->container.type == WINED3D_CONTAINER_TEXTURE) + { + IWineD3DBaseTextureImpl *texture = surface->container.u.texture; + + TRACE("Passing to container.\n"); + texture->baseTexture.internal_preload((IWineD3DBaseTexture *)texture, srgb); + } + else + { struct wined3d_context *context = NULL; TRACE("(%p) : About to load surface\n", surface); @@ -1164,8 +1160,8 @@ return TRUE; } -static void WINAPI IWineD3DSurfaceImpl_UnLoad(IWineD3DSurface *iface) { - IWineD3DBaseTexture *texture = NULL; +static void WINAPI IWineD3DSurfaceImpl_UnLoad(IWineD3DSurface *iface) +{ IWineD3DSurfaceImpl *This = (IWineD3DSurfaceImpl *) iface; IWineD3DDeviceImpl *device = This->resource.device; const struct wined3d_gl_info *gl_info; @@ -1218,22 +1214,21 @@ list_init(&This->renderbuffers); This->current_renderbuffer = NULL; - /* If we're in a texture, the texture name belongs to the texture. Otherwise, - * destroy it - */ - IWineD3DSurface_GetContainer(iface, &IID_IWineD3DBaseTexture, (void **) &texture); - if(!texture) { + /* If we're in a texture, the texture name belongs to the texture. + * Otherwise, destroy it. */ + if (This->container.type != WINED3D_CONTAINER_TEXTURE) + { ENTER_GL(); glDeleteTextures(1, &This->texture_name); This->texture_name = 0; glDeleteTextures(1, &This->texture_name_srgb); This->texture_name_srgb = 0; LEAVE_GL(); - } else { - IWineD3DBaseTexture_Release(texture); } context_release(context); + + resource_unload((IWineD3DResourceImpl *)This); } /* ****************************************************** @@ -1552,11 +1547,9 @@ /* Context activation is done by the caller. */ void surface_prepare_texture(IWineD3DSurfaceImpl *surface, const struct wined3d_gl_info *gl_info, BOOL srgb) { - IWineD3DBaseTextureImpl *texture; - - if (SUCCEEDED(IWineD3DSurface_GetContainer((IWineD3DSurface *)surface, - &IID_IWineD3DBaseTexture, (void **)&texture))) + if (surface->container.type == WINED3D_CONTAINER_TEXTURE) { + IWineD3DBaseTextureImpl *texture = surface->container.u.texture; UINT sub_count = texture->baseTexture.level_count * texture->baseTexture.layer_count; UINT i; @@ -1568,8 +1561,6 @@ surface_prepare_texture_internal(s, gl_info, srgb); } - IWineD3DBaseTexture_Release((IWineD3DBaseTexture *)texture); - return; } @@ -1697,7 +1688,7 @@ } if (!(wined3d_settings.rendertargetlock_mode == RTL_DISABLE - && ((This->Flags & SFLAG_SWAPCHAIN) || This == device->render_targets[0]))) + && ((This->container.type == WINED3D_CONTAINER_SWAPCHAIN) || This == device->render_targets[0]))) { surface_load_location(This, SFLAG_INSYSMEM, pass_rect); } @@ -1733,20 +1724,18 @@ if (Flags & (WINED3DLOCK_NO_DIRTY_UPDATE | WINED3DLOCK_READONLY)) { /* Don't dirtify */ - } else { - IWineD3DBaseTexture *pBaseTexture; - /** - * Dirtify on lock - * as seen in msdn docs - */ + } + else + { surface_add_dirty_rect(This, pRect); - /** Dirtify Container if needed */ - if (SUCCEEDED(IWineD3DSurface_GetContainer(iface, &IID_IWineD3DBaseTexture, (void **)&pBaseTexture))) { - TRACE("Making container dirty\n"); - IWineD3DBaseTexture_SetDirty(pBaseTexture, TRUE); - IWineD3DBaseTexture_Release(pBaseTexture); - } else { + if (This->container.type == WINED3D_CONTAINER_TEXTURE) + { + TRACE("Making container dirty.\n"); + IWineD3DBaseTexture_SetDirty((IWineD3DBaseTexture *)This->container.u.texture, TRUE); + } + else + { TRACE("Surface is standalone, no need to dirty the container\n"); } } @@ -1889,7 +1878,8 @@ goto unlock_end; } - if ((This->Flags & SFLAG_SWAPCHAIN) || (device->render_targets && This == device->render_targets[0])) + if (This->container.type == WINED3D_CONTAINER_SWAPCHAIN + || (device->render_targets && This == device->render_targets[0])) { if(wined3d_settings.rendertargetlock_mode == RTL_DISABLE) { static BOOL warned = FALSE; @@ -1942,15 +1932,15 @@ FIXME("Depth Stencil buffer locking is not implemented\n"); } else { /* The rest should be a normal texture */ - IWineD3DBaseTextureImpl *impl; /* Check if the texture is bound, if yes dirtify the sampler to force a re-upload of the texture * Can't load the texture here because PreLoad may destroy and recreate the gl texture, so sampler * states need resetting */ - if(IWineD3DSurface_GetContainer(iface, &IID_IWineD3DBaseTexture, (void **)&impl) == WINED3D_OK) { - if (impl->baseTexture.bindCount) - IWineD3DDeviceImpl_MarkStateDirty(device, STATE_SAMPLER(impl->baseTexture.sampler)); - IWineD3DBaseTexture_Release((IWineD3DBaseTexture *) impl); + if (This->container.type == WINED3D_CONTAINER_TEXTURE) + { + IWineD3DBaseTextureImpl *texture = This->container.u.texture; + if (texture->baseTexture.bindCount) + IWineD3DDeviceImpl_MarkStateDirty(device, STATE_SAMPLER(texture->baseTexture.sampler)); } } @@ -2497,6 +2487,8 @@ IWineD3DSurfaceImpl *This = (IWineD3DSurfaceImpl *)iface; DWORD flag = srgb_mode ? SFLAG_INSRGBTEX : SFLAG_INTEXTURE; + TRACE("iface %p, srgb %#x.\n", iface, srgb_mode); + if (!(This->Flags & flag)) { TRACE("Reloading because surface is dirty\n"); } else if(/* Reload: gl texture has ck, now no ckey is set OR */ @@ -2545,16 +2537,16 @@ } /* Context activation is done by the caller. */ -static void WINAPI IWineD3DSurfaceImpl_BindTexture(IWineD3DSurface *iface, BOOL srgb) { - /* TODO: check for locks */ +static void WINAPI IWineD3DSurfaceImpl_BindTexture(IWineD3DSurface *iface, BOOL srgb) +{ IWineD3DSurfaceImpl *This = (IWineD3DSurfaceImpl *)iface; - IWineD3DBaseTexture *baseTexture = NULL; - TRACE("(%p)Checking to see if the container is a base texture\n", This); - if (IWineD3DSurface_GetContainer(iface, &IID_IWineD3DBaseTexture, (void **)&baseTexture) == WINED3D_OK) { - TRACE("Passing to container\n"); - IWineD3DBaseTexture_BindTexture(baseTexture, srgb); - IWineD3DBaseTexture_Release(baseTexture); + TRACE("iface %p, srgb %#x.\n", iface, srgb); + + if (This->container.type == WINED3D_CONTAINER_TEXTURE) + { + TRACE("Passing to container.\n"); + IWineD3DBaseTexture_BindTexture((IWineD3DBaseTexture *)This->container.u.texture, srgb); } else { @@ -2747,7 +2739,7 @@ static HRESULT WINAPI IWineD3DSurfaceImpl_Flip(IWineD3DSurface *iface, IWineD3DSurface *override, DWORD Flags) { IWineD3DSurfaceImpl *This = (IWineD3DSurfaceImpl *)iface; IWineD3DSwapChainImpl *swapchain = NULL; - HRESULT hr; + TRACE("(%p)->(%p,%x)\n", This, override, Flags); /* Flipping is only supported on RenderTargets and overlays*/ @@ -2775,11 +2767,12 @@ */ } - IWineD3DSurface_GetContainer(iface, &IID_IWineD3DSwapChain, (void **) &swapchain); - if(!swapchain) { + if (This->container.type != WINED3D_CONTAINER_SWAPCHAIN) + { ERR("Flipped surface is not on a swapchain\n"); return WINEDDERR_NOTFLIPPABLE; } + swapchain = This->container.u.swapchain; /* Just overwrite the swapchain presentation interval. This is ok because only ddraw apps can call Flip, * and only d3d8 and d3d9 apps specify the presentation interval @@ -2798,10 +2791,8 @@ } /* Flipping a OpenGL surface -> Use WineD3DDevice::Present */ - hr = IWineD3DSwapChain_Present((IWineD3DSwapChain *)swapchain, + return IWineD3DSwapChain_Present((IWineD3DSwapChain *)swapchain, NULL, NULL, swapchain->win_handle, NULL, 0); - IWineD3DSwapChain_Release((IWineD3DSwapChain *) swapchain); - return hr; } /* Does a direct frame buffer -> texture copy. Stretching is done @@ -3021,8 +3012,8 @@ wined3d_gl_min_mip_filter(minMipLookup, Filter, WINED3DTEXF_NONE)); checkGLcall("glTexParameteri"); - IWineD3DSurface_GetContainer((IWineD3DSurface *)src_surface, &IID_IWineD3DSwapChain, (void **)&src_swapchain); - if (src_swapchain) IWineD3DSwapChain_Release((IWineD3DSwapChain *)src_swapchain); + if (src_surface->container.type == WINED3D_CONTAINER_SWAPCHAIN) + src_swapchain = src_surface->container.u.swapchain; if (!src_swapchain || src_surface == src_swapchain->back_buffers[0]) { src = backup ? backup : src_surface->texture_name; @@ -3380,8 +3371,10 @@ WARN("Destination is in sysmem, rejecting gl blt\n"); return WINED3DERR_INVALIDCALL; } - IWineD3DSurface_GetContainer((IWineD3DSurface *)dst_surface, &IID_IWineD3DSwapChain, (void **)&dstSwapchain); - if (dstSwapchain) IWineD3DSwapChain_Release((IWineD3DSwapChain *)dstSwapchain); + + if (dst_surface->container.type == WINED3D_CONTAINER_SWAPCHAIN) + dstSwapchain = dst_surface->container.u.swapchain; + if (src_surface) { if (src_surface->resource.pool == WINED3DPOOL_SYSTEMMEM) @@ -3389,8 +3382,9 @@ WARN("Src is in sysmem, rejecting gl blt\n"); return WINED3DERR_INVALIDCALL; } - IWineD3DSurface_GetContainer((IWineD3DSurface *)src_surface, &IID_IWineD3DSwapChain, (void **)&srcSwapchain); - if (srcSwapchain) IWineD3DSwapChain_Release((IWineD3DSwapChain *)srcSwapchain); + + if (src_surface->container.type == WINED3D_CONTAINER_SWAPCHAIN) + srcSwapchain = src_surface->container.u.swapchain; } /* Early sort out of cases where no render target is used */ @@ -3766,7 +3760,7 @@ } static HRESULT IWineD3DSurfaceImpl_BltZ(IWineD3DSurfaceImpl *This, const RECT *DestRect, - IWineD3DSurface *SrcSurface, const RECT *SrcRect, DWORD Flags, const WINEDDBLTFX *DDBltFx) + IWineD3DSurface *src_surface, const RECT *src_rect, DWORD Flags, const WINEDDBLTFX *DDBltFx) { IWineD3DDeviceImpl *device = This->resource.device; float depth; @@ -3778,7 +3772,7 @@ depth = (float) DDBltFx->u5.dwFillDepth / (float) 0x0000ffff; break; case WINED3DFMT_S1_UINT_D15_UNORM: - depth = (float) DDBltFx->u5.dwFillDepth / (float) 0x0000fffe; + depth = (float) DDBltFx->u5.dwFillDepth / (float) 0x00007fff; break; case WINED3DFMT_D24_UNORM_S8_UINT: case WINED3DFMT_X8D24_UNORM: @@ -3800,16 +3794,20 @@ return WINED3DERR_INVALIDCALL; } -static HRESULT WINAPI IWineD3DSurfaceImpl_Blt(IWineD3DSurface *iface, const RECT *DestRect, IWineD3DSurface *SrcSurface, - const RECT *SrcRect, DWORD Flags, const WINEDDBLTFX *DDBltFx, WINED3DTEXTUREFILTERTYPE Filter) { +static HRESULT WINAPI IWineD3DSurfaceImpl_Blt(IWineD3DSurface *iface, const RECT *DestRect, + IWineD3DSurface *src_surface, const RECT *SrcRect, DWORD Flags, + const WINEDDBLTFX *DDBltFx, WINED3DTEXTUREFILTERTYPE Filter) +{ IWineD3DSurfaceImpl *This = (IWineD3DSurfaceImpl *)iface; - IWineD3DSurfaceImpl *Src = (IWineD3DSurfaceImpl *) SrcSurface; + IWineD3DSurfaceImpl *src = (IWineD3DSurfaceImpl *)src_surface; IWineD3DDeviceImpl *device = This->resource.device; - TRACE("(%p)->(%p,%p,%p,%x,%p)\n", This, DestRect, SrcSurface, SrcRect, Flags, DDBltFx); - TRACE("(%p): Usage is %s\n", This, debug_d3dusage(This->resource.usage)); + TRACE("iface %p, dst_rect %s, src_surface %p, src_rect %s, flags %#x, fx %p, filter %s.\n", + iface, wine_dbgstr_rect(DestRect), src_surface, wine_dbgstr_rect(SrcRect), + Flags, DDBltFx, debug_d3dtexturefiltertype(Filter)); + TRACE("Usage is %s.\n", debug_d3dusage(This->resource.usage)); - if ( (This->Flags & SFLAG_LOCKED) || ((Src != NULL) && (Src->Flags & SFLAG_LOCKED))) + if ((This->Flags & SFLAG_LOCKED) || (src && (src->Flags & SFLAG_LOCKED))) { WARN(" Surface is busy, returning DDERR_SURFACEBUSY\n"); return WINEDDERR_SURFACEBUSY; @@ -3818,13 +3816,15 @@ /* Accessing the depth stencil is supposed to fail between a BeginScene and EndScene pair, * except depth blits, which seem to work */ - if (This == device->depth_stencil || (Src && Src == device->depth_stencil)) + if (This == device->depth_stencil || (src && src == device->depth_stencil)) { if (device->inScene && !(Flags & WINEDDBLT_DEPTHFILL)) { TRACE("Attempt to access the depth stencil surface in a BeginScene / EndScene pair, returning WINED3DERR_INVALIDCALL\n"); return WINED3DERR_INVALIDCALL; - } else if(IWineD3DSurfaceImpl_BltZ(This, DestRect, SrcSurface, SrcRect, Flags, DDBltFx) == WINED3D_OK) { + } + else if (SUCCEEDED(IWineD3DSurfaceImpl_BltZ(This, DestRect, src_surface, SrcRect, Flags, DDBltFx))) + { TRACE("Z Blit override handled the blit\n"); return WINED3D_OK; } @@ -3832,48 +3832,49 @@ /* Special cases for RenderTargets */ if ((This->resource.usage & WINED3DUSAGE_RENDERTARGET) - || (Src && (Src->resource.usage & WINED3DUSAGE_RENDERTARGET))) + || (src && (src->resource.usage & WINED3DUSAGE_RENDERTARGET))) { - if (SUCCEEDED(IWineD3DSurfaceImpl_BltOverride(This, DestRect, Src, SrcRect, Flags, DDBltFx, Filter))) + if (SUCCEEDED(IWineD3DSurfaceImpl_BltOverride(This, DestRect, src, SrcRect, Flags, DDBltFx, Filter))) return WINED3D_OK; } /* For the rest call the X11 surface implementation. * For RenderTargets this should be implemented OpenGL accelerated in BltOverride, - * other Blts are rather rare - */ - return IWineD3DBaseSurfaceImpl_Blt(iface, DestRect, SrcSurface, SrcRect, Flags, DDBltFx, Filter); + * other Blts are rather rare. */ + return IWineD3DBaseSurfaceImpl_Blt(iface, DestRect, src_surface, SrcRect, Flags, DDBltFx, Filter); } static HRESULT WINAPI IWineD3DSurfaceImpl_BltFast(IWineD3DSurface *iface, DWORD dstx, DWORD dsty, - IWineD3DSurface *Source, const RECT *rsrc, DWORD trans) + IWineD3DSurface *src_surface, const RECT *rsrc, DWORD trans) { - IWineD3DSurfaceImpl *This = (IWineD3DSurfaceImpl *) iface; - IWineD3DSurfaceImpl *srcImpl = (IWineD3DSurfaceImpl *) Source; + IWineD3DSurfaceImpl *This = (IWineD3DSurfaceImpl *)iface; + IWineD3DSurfaceImpl *src = (IWineD3DSurfaceImpl *)src_surface; IWineD3DDeviceImpl *device = This->resource.device; - TRACE("(%p)->(%d, %d, %p, %p, %08x\n", iface, dstx, dsty, Source, rsrc, trans); + TRACE("iface %p, dst_x %u, dst_y %u, src_surface %p, src_rect %s, flags %#x.\n", + iface, dstx, dsty, src_surface, wine_dbgstr_rect(rsrc), trans); - if ( (This->Flags & SFLAG_LOCKED) || (srcImpl->Flags & SFLAG_LOCKED)) + if ((This->Flags & SFLAG_LOCKED) || (src->Flags & SFLAG_LOCKED)) { WARN(" Surface is busy, returning DDERR_SURFACEBUSY\n"); return WINEDDERR_SURFACEBUSY; } - if (device->inScene && (This == device->depth_stencil || srcImpl == device->depth_stencil)) + if (device->inScene && (This == device->depth_stencil || src == device->depth_stencil)) { TRACE("Attempt to access the depth stencil surface in a BeginScene / EndScene pair, returning WINED3DERR_INVALIDCALL\n"); return WINED3DERR_INVALIDCALL; } /* Special cases for RenderTargets */ - if( (This->resource.usage & WINED3DUSAGE_RENDERTARGET) || - (srcImpl->resource.usage & WINED3DUSAGE_RENDERTARGET) ) { + if ((This->resource.usage & WINED3DUSAGE_RENDERTARGET) + || (src->resource.usage & WINED3DUSAGE_RENDERTARGET)) + { RECT SrcRect, DstRect; DWORD Flags=0; - surface_get_rect(srcImpl, rsrc, &SrcRect); + surface_get_rect(src, rsrc, &SrcRect); DstRect.left = dstx; DstRect.top=dsty; @@ -3891,12 +3892,11 @@ Flags |= WINEDDBLT_DONOTWAIT; if (SUCCEEDED(IWineD3DSurfaceImpl_BltOverride(This, - &DstRect, srcImpl, &SrcRect, Flags, NULL, WINED3DTEXF_POINT))) + &DstRect, src, &SrcRect, Flags, NULL, WINED3DTEXF_POINT))) return WINED3D_OK; } - - return IWineD3DBaseSurfaceImpl_BltFast(iface, dstx, dsty, Source, rsrc, trans); + return IWineD3DBaseSurfaceImpl_BltFast(iface, dstx, dsty, src_surface, rsrc, trans); } static HRESULT WINAPI IWineD3DSurfaceImpl_RealizePalette(IWineD3DSurface *iface) @@ -4028,11 +4028,19 @@ } } - if(This->resource.usage & WINED3DUSAGE_RENDERTARGET) { - switch(wined3d_settings.offscreen_rendering_mode) { - case ORM_FBO: This->get_drawable_size = get_drawable_size_fbo; break; - case ORM_BACKBUFFER: This->get_drawable_size = get_drawable_size_backbuffer; break; - } + switch (wined3d_settings.offscreen_rendering_mode) + { + case ORM_FBO: + This->get_drawable_size = get_drawable_size_fbo; + break; + + case ORM_BACKBUFFER: + This->get_drawable_size = get_drawable_size_backbuffer; + break; + + default: + ERR("Unhandled offscreen rendering mode %#x.\n", wined3d_settings.offscreen_rendering_mode); + return WINED3DERR_INVALIDCALL; } This->Flags |= SFLAG_INSYSMEM; @@ -4248,10 +4256,9 @@ void surface_modify_location(IWineD3DSurfaceImpl *surface, DWORD flag, BOOL persistent) { - IWineD3DBaseTexture *texture; IWineD3DSurfaceImpl *overlay; - TRACE("surface %p, location %s, persitent %#x.\n", + TRACE("surface %p, location %s, persistent %#x.\n", surface, debug_surflocation(flag), persistent); if (wined3d_settings.offscreen_rendering_mode == ORM_FBO) @@ -4272,12 +4279,10 @@ if (((surface->Flags & SFLAG_INTEXTURE) && !(flag & SFLAG_INTEXTURE)) || ((surface->Flags & SFLAG_INSRGBTEX) && !(flag & SFLAG_INSRGBTEX))) { - if (SUCCEEDED(IWineD3DSurface_GetContainer((IWineD3DSurface *)surface, - &IID_IWineD3DBaseTexture, (void **)&texture))) + if (surface->container.type == WINED3D_CONTAINER_TEXTURE) { TRACE("Passing to container.\n"); - IWineD3DBaseTexture_SetDirty(texture, TRUE); - IWineD3DBaseTexture_Release(texture); + IWineD3DBaseTexture_SetDirty((IWineD3DBaseTexture *)surface->container.u.texture, TRUE); } } surface->Flags &= ~SFLAG_LOCATIONS; @@ -4296,12 +4301,10 @@ { if ((surface->Flags & (SFLAG_INTEXTURE | SFLAG_INSRGBTEX)) && (flag & (SFLAG_INTEXTURE | SFLAG_INSRGBTEX))) { - if (SUCCEEDED(IWineD3DSurface_GetContainer((IWineD3DSurface *)surface, - &IID_IWineD3DBaseTexture, (void **)&texture))) + if (surface->container.type == WINED3D_CONTAINER_TEXTURE) { TRACE("Passing to container\n"); - IWineD3DBaseTexture_SetDirty(texture, TRUE); - IWineD3DBaseTexture_Release(texture); + IWineD3DBaseTexture_SetDirty((IWineD3DBaseTexture *)surface->container.u.texture, TRUE); } } surface->Flags &= ~flag; @@ -4336,7 +4339,8 @@ dst_rect = src_rect; } - if ((This->Flags & SFLAG_SWAPCHAIN) && This == ((IWineD3DSwapChainImpl *)This->container)->front_buffer) + swapchain = This->container.type == WINED3D_CONTAINER_SWAPCHAIN ? This->container.u.swapchain : NULL; + if (swapchain && This == swapchain->front_buffer) surface_translate_frontbuffer_coords(This, context->win_handle, &dst_rect); device->blitter->set_shader((IWineD3DDevice *) device, This); @@ -4347,7 +4351,6 @@ device->blitter->unset_shader((IWineD3DDevice *) device); - swapchain = (This->Flags & SFLAG_SWAPCHAIN) ? (IWineD3DSwapChainImpl *)This->container : NULL; if (wined3d_settings.strict_draw_ordering || (swapchain && (This == swapchain->front_buffer || swapchain->num_contexts > 1))) wglFlush(); /* Flush to ensure ordering across contexts. */ @@ -4657,28 +4660,6 @@ return WINED3D_OK; } -static HRESULT WINAPI IWineD3DSurfaceImpl_SetContainer(IWineD3DSurface *iface, IWineD3DBase *container) -{ - IWineD3DSurfaceImpl *This = (IWineD3DSurfaceImpl *) iface; - IWineD3DSwapChain *swapchain = NULL; - - /* Update the drawable size method */ - if(container) { - IWineD3DBase_QueryInterface(container, &IID_IWineD3DSwapChain, (void **) &swapchain); - } - if(swapchain) { - This->get_drawable_size = get_drawable_size_swapchain; - IWineD3DSwapChain_Release(swapchain); - } else if(This->resource.usage & WINED3DUSAGE_RENDERTARGET) { - switch(wined3d_settings.offscreen_rendering_mode) { - case ORM_FBO: This->get_drawable_size = get_drawable_size_fbo; break; - case ORM_BACKBUFFER: This->get_drawable_size = get_drawable_size_backbuffer; break; - } - } - - return IWineD3DBaseSurfaceImpl_SetContainer(iface, container); -} - static WINED3DSURFTYPE WINAPI IWineD3DSurfaceImpl_GetImplType(IWineD3DSurface *iface) { return SURFACE_OPENGL; } @@ -4707,10 +4688,10 @@ BOOL surface_is_offscreen(IWineD3DSurfaceImpl *surface) { - IWineD3DSwapChainImpl *swapchain = (IWineD3DSwapChainImpl *)surface->container; + IWineD3DSwapChainImpl *swapchain = surface->container.u.swapchain; /* Not on a swapchain - must be offscreen */ - if (!(surface->Flags & SFLAG_SWAPCHAIN)) return TRUE; + if (surface->container.type != WINED3D_CONTAINER_SWAPCHAIN) return TRUE; /* The front buffer is always onscreen */ if (surface == swapchain->front_buffer) return FALSE; @@ -4765,7 +4746,6 @@ /* Internal use: */ IWineD3DSurfaceImpl_LoadTexture, IWineD3DSurfaceImpl_BindTexture, - IWineD3DSurfaceImpl_SetContainer, IWineD3DBaseSurfaceImpl_GetData, IWineD3DSurfaceImpl_SetFormat, IWineD3DSurfaceImpl_PrivateSetup, @@ -4890,10 +4870,12 @@ } static HRESULT ffp_blit_color_fill(IWineD3DDeviceImpl *device, - IWineD3DSurfaceImpl *dst_surface, const RECT *dst_rect, DWORD fill_color) + IWineD3DSurfaceImpl *dst_surface, const RECT *dst_rect, DWORD color) { + const float c[] = {D3DCOLOR_R(color), D3DCOLOR_G(color), D3DCOLOR_B(color), D3DCOLOR_A(color)}; + return device_clear_render_targets(device, 1 /* rt_count */, &dst_surface, 1 /* rect_count */, - (const WINED3DRECT *)dst_rect, WINED3DCLEAR_TARGET, fill_color, 0.0f /* depth */, 0 /* stencil */); + (const WINED3DRECT *)dst_rect, WINED3DCLEAR_TARGET, c, 0.0f /* depth */, 0 /* stencil */); } const struct blit_shader ffp_blit = { diff -Nru wine1.3-1.3.0/dlls/wined3d/surface_gdi.c wine1.3-1.3.1/dlls/wined3d/surface_gdi.c --- wine1.3-1.3.0/dlls/wined3d/surface_gdi.c 2010-07-30 18:43:56.000000000 +0100 +++ wine1.3-1.3.1/dlls/wined3d/surface_gdi.c 2010-08-20 18:23:50.000000000 +0100 @@ -167,7 +167,6 @@ IWineGDISurfaceImpl_UnlockRect(IWineD3DSurface *iface) { IWineD3DSurfaceImpl *This = (IWineD3DSurfaceImpl *)iface; - IWineD3DSwapChainImpl *swapchain = NULL; TRACE("(%p)\n", This); if (!(This->Flags & SFLAG_LOCKED)) @@ -177,13 +176,13 @@ } /* Tell the swapchain to update the screen */ - if (SUCCEEDED(IWineD3DSurface_GetContainer(iface, &IID_IWineD3DSwapChain, (void **)&swapchain))) + if (This->container.type == WINED3D_CONTAINER_SWAPCHAIN) { + IWineD3DSwapChainImpl *swapchain = This->container.u.swapchain; if (This == swapchain->front_buffer) { x11_copy_to_screen(swapchain, &This->lockedRect); } - IWineD3DSwapChain_Release((IWineD3DSwapChain *) swapchain); } This->Flags &= ~SFLAG_LOCKED; @@ -210,18 +209,20 @@ IWineD3DSurface *override, DWORD Flags) { - IWineD3DSwapChainImpl *swapchain = NULL; + IWineD3DSurfaceImpl *surface = (IWineD3DSurfaceImpl *)iface; + IWineD3DSwapChainImpl *swapchain; HRESULT hr; - if(FAILED(IWineD3DSurface_GetContainer(iface, &IID_IWineD3DSwapChain, (void **)&swapchain))) + if (surface->container.type != WINED3D_CONTAINER_SWAPCHAIN) { ERR("Flipped surface is not on a swapchain\n"); return WINEDDERR_NOTFLIPPABLE; } + swapchain = surface->container.u.swapchain; hr = IWineD3DSwapChain_Present((IWineD3DSwapChain *)swapchain, NULL, NULL, swapchain->win_handle, NULL, 0); - IWineD3DSwapChain_Release((IWineD3DSwapChain *) swapchain); + return hr; } @@ -349,7 +350,6 @@ RGBQUAD col[256]; IWineD3DPaletteImpl *pal = This->palette; unsigned int n; - IWineD3DSwapChainImpl *swapchain; TRACE("(%p)\n", This); if (!pal) return WINED3D_OK; @@ -368,13 +368,13 @@ /* Update the image because of the palette change. Some games like e.g Red Alert call SetEntries a lot to implement fading. */ /* Tell the swapchain to update the screen */ - if (SUCCEEDED(IWineD3DSurface_GetContainer(iface, &IID_IWineD3DSwapChain, (void **)&swapchain))) + if (This->container.type == WINED3D_CONTAINER_SWAPCHAIN) { + IWineD3DSwapChainImpl *swapchain = This->container.u.swapchain; if (This == swapchain->front_buffer) { x11_copy_to_screen(swapchain, NULL); } - IWineD3DSwapChain_Release((IWineD3DSwapChain *) swapchain); } return WINED3D_OK; @@ -531,7 +531,6 @@ /* Internal use: */ IWineGDISurfaceImpl_LoadTexture, IWineGDISurfaceImpl_BindTexture, - IWineD3DBaseSurfaceImpl_SetContainer, IWineD3DBaseSurfaceImpl_GetData, IWineD3DBaseSurfaceImpl_SetFormat, IWineGDISurfaceImpl_PrivateSetup, diff -Nru wine1.3-1.3.0/dlls/wined3d/swapchain_base.c wine1.3-1.3.1/dlls/wined3d/swapchain_base.c --- wine1.3-1.3.0/dlls/wined3d/swapchain_base.c 2010-07-30 18:43:56.000000000 +0100 +++ wine1.3-1.3.1/dlls/wined3d/swapchain_base.c 2010-08-20 18:23:50.000000000 +0100 @@ -72,11 +72,12 @@ return WINED3D_OK; } -HRESULT WINAPI IWineD3DBaseSwapChainImpl_GetFrontBufferData(IWineD3DSwapChain *iface, IWineD3DSurface *pDestSurface) { +HRESULT WINAPI IWineD3DBaseSwapChainImpl_GetFrontBufferData(IWineD3DSwapChain *iface, IWineD3DSurface *dst_surface) +{ IWineD3DSwapChainImpl *This = (IWineD3DSwapChainImpl *)iface; POINT start; - TRACE("(%p) : iface(%p) pDestSurface(%p)\n", This, iface, pDestSurface); + TRACE("iface %p, dst_surface %p.\n", iface, dst_surface); start.x = 0; start.y = 0; @@ -85,40 +86,38 @@ MapWindowPoints(This->win_handle, NULL, &start, 1); } - IWineD3DSurface_BltFast(pDestSurface, start.x, start.y, (IWineD3DSurface *)This->front_buffer, NULL, 0); + IWineD3DSurface_BltFast(dst_surface, start.x, start.y, (IWineD3DSurface *)This->front_buffer, NULL, 0); return WINED3D_OK; } -HRESULT WINAPI IWineD3DBaseSwapChainImpl_GetBackBuffer(IWineD3DSwapChain *iface, UINT iBackBuffer, WINED3DBACKBUFFER_TYPE Type, IWineD3DSurface **ppBackBuffer) { - - IWineD3DSwapChainImpl *This = (IWineD3DSwapChainImpl *)iface; +HRESULT WINAPI IWineD3DBaseSwapChainImpl_GetBackBuffer(IWineD3DSwapChain *iface, + UINT back_buffer_idx, WINED3DBACKBUFFER_TYPE type, IWineD3DSurface **back_buffer) +{ + IWineD3DSwapChainImpl *swapchain = (IWineD3DSwapChainImpl *)iface; - if (iBackBuffer > This->presentParms.BackBufferCount - 1) { - TRACE("Back buffer count out of range\n"); - /* Native d3d9 doesn't set NULL here, just as wine's d3d9. But set it - * here in wined3d to avoid problems in other libs - */ - *ppBackBuffer = NULL; - return WINED3DERR_INVALIDCALL; - } + TRACE("iface %p, back_buffer_idx %u, type %#x, back_buffer %p.\n", + iface, back_buffer_idx, type, back_buffer); - /* Return invalid if there is no backbuffer array, otherwise it will crash when ddraw is - * used (there This->backBuffer is always NULL). We need this because this function has - * to be called from IWineD3DStateBlockImpl_InitStartupStateBlock to get the default + /* Return invalid if there is no backbuffer array, otherwise it will + * crash when ddraw is used (there swapchain->back_buffers is always NULL). + * We need this because this function is called from + * IWineD3DStateBlockImpl_InitStartupStateBlock() to get the default * scissorrect dimensions. */ - if (!This->back_buffers) + if (!swapchain->back_buffers || back_buffer_idx >= swapchain->presentParms.BackBufferCount) { - *ppBackBuffer = NULL; + WARN("Invalid back buffer index.\n"); + /* Native d3d9 doesn't set NULL here, just as wine's d3d9. But set it + * here in wined3d to avoid problems in other libs. */ + *back_buffer = NULL; return WINED3DERR_INVALIDCALL; } - *ppBackBuffer = (IWineD3DSurface *)This->back_buffers[iBackBuffer]; - TRACE("(%p) : BackBuf %d Type %d returning %p\n", This, iBackBuffer, Type, *ppBackBuffer); + *back_buffer = (IWineD3DSurface *)swapchain->back_buffers[back_buffer_idx]; + if (*back_buffer) IWineD3DSurface_AddRef(*back_buffer); - /* Note inc ref on returned surface */ - if(*ppBackBuffer) IWineD3DSurface_AddRef(*ppBackBuffer); - return WINED3D_OK; + TRACE("Returning back buffer %p.\n", *back_buffer); + return WINED3D_OK; } HRESULT WINAPI IWineD3DBaseSwapChainImpl_GetRasterStatus(IWineD3DSwapChain *iface, WINED3DRASTER_STATUS *pRasterStatus) { diff -Nru wine1.3-1.3.0/dlls/wined3d/swapchain.c wine1.3-1.3.1/dlls/wined3d/swapchain.c --- wine1.3-1.3.0/dlls/wined3d/swapchain.c 2010-07-30 18:43:56.000000000 +0100 +++ wine1.3-1.3.1/dlls/wined3d/swapchain.c 2010-08-20 18:23:50.000000000 +0100 @@ -48,7 +48,7 @@ * the last buffer to be destroyed, FindContext() depends on that. */ if (This->front_buffer) { - IWineD3DSurface_SetContainer((IWineD3DSurface *)This->front_buffer, NULL); + surface_set_container(This->front_buffer, WINED3D_CONTAINER_NONE, NULL); if (IWineD3DSurface_Release((IWineD3DSurface *)This->front_buffer)) { WARN("(%p) Something's still holding the front buffer (%p).\n", @@ -63,7 +63,7 @@ while (i--) { - IWineD3DSurface_SetContainer((IWineD3DSurface *)This->back_buffers[i], NULL); + surface_set_container(This->back_buffers[i], WINED3D_CONTAINER_NONE, NULL); if (IWineD3DSurface_Release((IWineD3DSurface *)This->back_buffers[i])) WARN("(%p) Something's still holding back buffer %u (%p).\n", This, i, This->back_buffers[i]); @@ -731,8 +731,7 @@ goto err; } - IWineD3DSurface_SetContainer((IWineD3DSurface *)swapchain->front_buffer, (IWineD3DBase *)swapchain); - swapchain->front_buffer->Flags |= SFLAG_SWAPCHAIN; + surface_set_container(swapchain->front_buffer, WINED3D_CONTAINER_SWAPCHAIN, (IWineD3DBase *)swapchain); if (surface_type == SURFACE_OPENGL) { surface_modify_location(swapchain->front_buffer, SFLAG_INDRAWABLE, TRUE); @@ -847,8 +846,7 @@ goto err; } - IWineD3DSurface_SetContainer((IWineD3DSurface *)swapchain->back_buffers[i], (IWineD3DBase *)swapchain); - swapchain->back_buffers[i]->Flags |= SFLAG_SWAPCHAIN; + surface_set_container(swapchain->back_buffers[i], WINED3D_CONTAINER_SWAPCHAIN, (IWineD3DBase *)swapchain); } } @@ -869,7 +867,7 @@ goto err; } - IWineD3DSurface_SetContainer((IWineD3DSurface *)device->auto_depth_stencil, NULL); + surface_set_container(device->auto_depth_stencil, WINED3D_CONTAINER_NONE, NULL); } } diff -Nru wine1.3-1.3.0/dlls/wined3d/swapchain_gdi.c wine1.3-1.3.1/dlls/wined3d/swapchain_gdi.c --- wine1.3-1.3.0/dlls/wined3d/swapchain_gdi.c 2010-07-30 18:43:56.000000000 +0100 +++ wine1.3-1.3.1/dlls/wined3d/swapchain_gdi.c 2010-08-20 18:23:50.000000000 +0100 @@ -39,7 +39,7 @@ /* release the ref to the front and back buffer parents */ if (This->front_buffer) { - IWineD3DSurface_SetContainer((IWineD3DSurface *)This->front_buffer, NULL); + surface_set_container(This->front_buffer, WINED3D_CONTAINER_NONE, NULL); if (IWineD3DSurface_Release((IWineD3DSurface *)This->front_buffer) > 0) { WARN("(%p) Something's still holding the front buffer\n",This); @@ -51,7 +51,7 @@ UINT i; for (i = 0; i < This->presentParms.BackBufferCount; ++i) { - IWineD3DSurface_SetContainer((IWineD3DSurface *)This->back_buffers[i], NULL); + surface_set_container(This->back_buffers[i], WINED3D_CONTAINER_NONE, NULL); if (IWineD3DSurface_Release((IWineD3DSurface *)This->back_buffers[i])) { WARN("(%p) Something's still holding the back buffer\n",This); diff -Nru wine1.3-1.3.0/dlls/wined3d/texture.c wine1.3-1.3.1/dlls/wined3d/texture.c --- wine1.3-1.3.0/dlls/wined3d/texture.c 2010-07-30 18:43:56.000000000 +0100 +++ wine1.3-1.3.1/dlls/wined3d/texture.c 2010-08-20 18:23:50.000000000 +0100 @@ -119,7 +119,7 @@ surface_set_texture_name(surface, 0, TRUE); surface_set_texture_name(surface, 0, FALSE); surface_set_texture_target(surface, 0); - IWineD3DSurface_SetContainer((IWineD3DSurface *)surface, NULL); + surface_set_container(surface, WINED3D_CONTAINER_NONE, NULL); IWineD3DSurface_Release((IWineD3DSurface *)surface); } } @@ -611,7 +611,7 @@ return hr; } - IWineD3DSurface_SetContainer(surface, (IWineD3DBase *)texture); + surface_set_container((IWineD3DSurfaceImpl *)surface, WINED3D_CONTAINER_TEXTURE, (IWineD3DBase *)texture); surface_set_texture_target((IWineD3DSurfaceImpl *)surface, texture->target); texture->baseTexture.sub_resources[i] = (IWineD3DResourceImpl *)surface; TRACE("Created surface level %u @ %p.\n", i, surface); diff -Nru wine1.3-1.3.0/dlls/wined3d/utils.c wine1.3-1.3.1/dlls/wined3d/utils.c --- wine1.3-1.3.0/dlls/wined3d/utils.c 2010-07-30 18:43:56.000000000 +0100 +++ wine1.3-1.3.1/dlls/wined3d/utils.c 2010-08-20 18:23:50.000000000 +0100 @@ -139,6 +139,9 @@ DWORD flags; }; +/* The ATI2N format behaves like an uncompressed format in LockRect(), but + * still needs to use the correct block based calculation for e.g. the + * resource size. */ static const struct wined3d_format_base_flags format_base_flags[] = { {WINED3DFMT_UYVY, WINED3DFMT_FLAG_FOURCC}, @@ -163,7 +166,7 @@ {WINED3DFMT_B4G4R4X4_UNORM, WINED3DFMT_FLAG_GETDC}, {WINED3DFMT_R8G8B8A8_UNORM, WINED3DFMT_FLAG_GETDC}, {WINED3DFMT_R8G8B8X8_UNORM, WINED3DFMT_FLAG_GETDC}, - {WINED3DFMT_ATI2N, WINED3DFMT_FLAG_FOURCC}, + {WINED3DFMT_ATI2N, WINED3DFMT_FLAG_FOURCC | WINED3DFMT_FLAG_BROKEN_PITCH}, {WINED3DFMT_NVHU, WINED3DFMT_FLAG_FOURCC}, {WINED3DFMT_NVHS, WINED3DFMT_FLAG_FOURCC}, {WINED3DFMT_R32_FLOAT, WINED3DFMT_FLAG_FLOAT}, @@ -192,7 +195,7 @@ {WINED3DFMT_DXT3, 4, 4, 16}, {WINED3DFMT_DXT4, 4, 4, 16}, {WINED3DFMT_DXT5, 4, 4, 16}, - {WINED3DFMT_ATI2N, 1, 1, 1}, + {WINED3DFMT_ATI2N, 4, 4, 16}, }; struct wined3d_format_vertex_info @@ -845,11 +848,11 @@ /* Vendor-specific formats */ {WINED3DFMT_ATI2N, GL_COMPRESSED_LUMINANCE_ALPHA_3DC_ATI, GL_COMPRESSED_LUMINANCE_ALPHA_3DC_ATI, 0, GL_LUMINANCE_ALPHA, GL_UNSIGNED_BYTE, 0, - 0, + WINED3DFMT_FLAG_POSTPIXELSHADER_BLENDING | WINED3DFMT_FLAG_FILTERING, ATI_TEXTURE_COMPRESSION_3DC, NULL}, {WINED3DFMT_ATI2N, GL_COMPRESSED_RED_GREEN_RGTC2, GL_COMPRESSED_RED_GREEN_RGTC2, 0, GL_LUMINANCE_ALPHA, GL_UNSIGNED_BYTE, 0, - 0, + WINED3DFMT_FLAG_POSTPIXELSHADER_BLENDING | WINED3DFMT_FLAG_FILTERING, ARB_TEXTURE_COMPRESSION_RGTC, NULL}, }; @@ -1539,7 +1542,7 @@ int idx = getFmtIdx(fmt); if(idx == -1) { - FIXME("Can't find format %s(%d) in the format lookup table\n", debug_d3dformat(fmt), fmt); + FIXME("Can't find format %s (%#x) in the format lookup table\n", debug_d3dformat(fmt), fmt); /* Get the caller a valid pointer */ idx = getFmtIdx(WINED3DFMT_UNKNOWN); } @@ -1547,6 +1550,30 @@ return &gl_info->gl_formats[idx]; } +UINT wined3d_format_calculate_size(const struct wined3d_format_desc *format, UINT alignment, UINT width, UINT height) +{ + UINT size; + + if (format->format == WINED3DFMT_UNKNOWN) + { + size = 0; + } + else if (format->Flags & WINED3DFMT_FLAG_COMPRESSED) + { + UINT row_block_count = (width + format->block_width - 1) / format->block_width; + UINT row_count = (height + format->block_height - 1) / format->block_height; + size = row_count * (((row_block_count * format->block_byte_count) + alignment - 1) & ~(alignment - 1)); + } + else + { + size = height * (((width * format->byte_count) + alignment - 1) & ~(alignment - 1)); + } + + if (format->heightscale != 0.0f) size *= format->heightscale; + + return size; +} + /***************************************************************************** * Trace formatting of useful values */ @@ -1692,10 +1719,10 @@ fourcc[2] = (char)(fmt >> 16); fourcc[3] = (char)(fmt >> 24); fourcc[4] = 0; - if( isprint(fourcc[0]) && isprint(fourcc[1]) && isprint(fourcc[2]) && isprint(fourcc[3]) ) - FIXME("Unrecognized %u (as fourcc: %s) WINED3DFORMAT!\n", fmt, fourcc); + if (isprint(fourcc[0]) && isprint(fourcc[1]) && isprint(fourcc[2]) && isprint(fourcc[3])) + FIXME("Unrecognized %#x (as fourcc: %s) WINED3DFORMAT!\n", fmt, fourcc); else - FIXME("Unrecognized %u WINED3DFORMAT!\n", fmt); + FIXME("Unrecognized %#x WINED3DFORMAT!\n", fmt); } return "unrecognized"; } diff -Nru wine1.3-1.3.0/dlls/wined3d/volume.c wine1.3-1.3.1/dlls/wined3d/volume.c --- wine1.3-1.3.0/dlls/wined3d/volume.c 2010-07-30 18:43:56.000000000 +0100 +++ wine1.3-1.3.1/dlls/wined3d/volume.c 2010-08-20 18:23:50.000000000 +0100 @@ -30,7 +30,6 @@ static void volume_bind_and_dirtify(IWineD3DVolume *iface) { IWineD3DVolumeImpl *This = (IWineD3DVolumeImpl *)iface; const struct wined3d_gl_info *gl_info = &This->resource.device->adapter->gl_info; - IWineD3DVolumeTexture *texture; DWORD active_sampler; /* We don't need a specific texture unit, but after binding the texture the current unit is dirty. @@ -60,12 +59,7 @@ IWineD3DDeviceImpl_MarkStateDirty(This->resource.device, STATE_SAMPLER(active_sampler)); } - if (SUCCEEDED(IWineD3DSurface_GetContainer(iface, &IID_IWineD3DVolumeTexture, (void **)&texture))) { - IWineD3DVolumeTexture_BindTexture(texture, FALSE); - IWineD3DVolumeTexture_Release(texture); - } else { - ERR("Volume should be part of a volume texture\n"); - } + IWineD3DVolumeTexture_BindTexture((IWineD3DVolumeTexture *)This->container, FALSE); } void volume_add_dirty_box(IWineD3DVolume *iface, const WINED3DBOX *dirty_box) @@ -93,6 +87,13 @@ } } +void volume_set_container(IWineD3DVolumeImpl *volume, struct IWineD3DVolumeTextureImpl *container) +{ + TRACE("volume %p, container %p.\n", volume, container); + + volume->container = container; +} + /* ******************************************* IWineD3DVolume IUnknown parts follow ******************************************* */ @@ -166,11 +167,14 @@ FIXME("iface %p stub!\n", iface); } -static void WINAPI IWineD3DVolumeImpl_UnLoad(IWineD3DVolume *iface) { - /* The whole content is shadowed on This->resource.allocatedMemory, and the - * texture name is managed by the VolumeTexture container - */ - TRACE("(%p): Nothing to do\n", iface); +static void WINAPI IWineD3DVolumeImpl_UnLoad(IWineD3DVolume *iface) +{ + TRACE("iface %p.\n", iface); + + /* The whole content is shadowed on This->resource.allocatedMemory, and + * the texture name is managed by the VolumeTexture container. */ + + resource_unload((IWineD3DResourceImpl *)iface); } static WINED3DRESOURCETYPE WINAPI IWineD3DVolumeImpl_GetType(IWineD3DVolume *iface) { @@ -197,7 +201,7 @@ } TRACE("Relaying to QueryInterface\n"); - return IUnknown_QueryInterface(This->container, riid, ppContainer); + return IUnknown_QueryInterface((IWineD3DVolumeTexture *)This->container, riid, ppContainer); } static HRESULT WINAPI IWineD3DVolumeImpl_GetDesc(IWineD3DVolume *iface, WINED3DVOLUME_DESC* pDesc) { @@ -255,27 +259,12 @@ if (Flags & (WINED3DLOCK_NO_DIRTY_UPDATE | WINED3DLOCK_READONLY)) { /* Don't dirtify */ - } else { - /** - * Dirtify on lock - * as seen in msdn docs - */ - volume_add_dirty_box(iface, &This->lockedBox); - - /** Dirtify Container if needed */ - if (NULL != This->container) { - - IWineD3DVolumeTexture *cont = (IWineD3DVolumeTexture*) This->container; - WINED3DRESOURCETYPE containerType = IWineD3DBaseTexture_GetType((IWineD3DBaseTexture *) cont); - - if (containerType == WINED3DRTYPE_VOLUMETEXTURE) { - IWineD3DBaseTextureImpl* pTexture = (IWineD3DBaseTextureImpl*) cont; - pTexture->baseTexture.texture_rgb.dirty = TRUE; - pTexture->baseTexture.texture_srgb.dirty = TRUE; - } else { - FIXME("Set dirty on container type %d\n", containerType); - } - } + } + else + { + volume_add_dirty_box(iface, &This->lockedBox); + This->container->baseTexture.texture_rgb.dirty = TRUE; + This->container->baseTexture.texture_srgb.dirty = TRUE; } This->locked = TRUE; @@ -298,19 +287,6 @@ /* Internal use functions follow : */ -static HRESULT WINAPI IWineD3DVolumeImpl_SetContainer(IWineD3DVolume *iface, IWineD3DBase* container) { - IWineD3DVolumeImpl *This = (IWineD3DVolumeImpl *)iface; - - TRACE("This %p, container %p\n", This, container); - - /* We can't keep a reference to the container, since the container already keeps a reference to us. */ - - TRACE("Setting container to %p from %p\n", container, This->container); - This->container = container; - - return WINED3D_OK; -} - /* Context activation is done by the caller. */ static HRESULT WINAPI IWineD3DVolumeImpl_LoadTexture(IWineD3DVolume *iface, int gl_level, BOOL srgb_mode) { @@ -379,7 +355,6 @@ IWineD3DVolumeImpl_UnlockBox, /* Internal interface */ IWineD3DVolumeImpl_LoadTexture, - IWineD3DVolumeImpl_SetContainer }; HRESULT volume_init(IWineD3DVolumeImpl *volume, IWineD3DDeviceImpl *device, UINT width, diff -Nru wine1.3-1.3.0/dlls/wined3d/volumetexture.c wine1.3-1.3.1/dlls/wined3d/volumetexture.c --- wine1.3-1.3.0/dlls/wined3d/volumetexture.c 2010-07-30 18:43:56.000000000 +0100 +++ wine1.3-1.3.1/dlls/wined3d/volumetexture.c 2010-08-20 18:23:50.000000000 +0100 @@ -85,13 +85,13 @@ for (i = 0; i < This->baseTexture.level_count; ++i) { - IWineD3DVolume *volume = (IWineD3DVolume *)This->baseTexture.sub_resources[i]; + IWineD3DVolumeImpl *volume = (IWineD3DVolumeImpl *)This->baseTexture.sub_resources[i]; if (volume) { /* Cleanup the container. */ - IWineD3DVolume_SetContainer(volume, NULL); - IWineD3DVolume_Release(volume); + volume_set_container(volume, NULL); + IWineD3DVolume_Release((IWineD3DVolume *)volume); } } basetexture_cleanup((IWineD3DBaseTexture *)This); @@ -466,7 +466,7 @@ } /* Set its container to this texture. */ - IWineD3DVolume_SetContainer(volume, (IWineD3DBase *)texture); + volume_set_container((IWineD3DVolumeImpl *)volume, texture); texture->baseTexture.sub_resources[i] = (IWineD3DResourceImpl *)volume; /* Calculate the next mipmap level. */ diff -Nru wine1.3-1.3.0/dlls/wined3d/wined3d_private.h wine1.3-1.3.1/dlls/wined3d/wined3d_private.h --- wine1.3-1.3.0/dlls/wined3d/wined3d_private.h 2010-07-30 18:43:56.000000000 +0100 +++ wine1.3-1.3.1/dlls/wined3d/wined3d_private.h 2010-08-20 18:23:50.000000000 +0100 @@ -1177,7 +1177,9 @@ struct wined3d_context *context_get_current(void) DECLSPEC_HIDDEN; DWORD context_get_tls_idx(void) DECLSPEC_HIDDEN; void context_release(struct wined3d_context *context) DECLSPEC_HIDDEN; -void context_resource_released(IWineD3DDevice *iface, +void context_resource_released(IWineD3DDeviceImpl *device, + IWineD3DResource *resource, WINED3DRESOURCETYPE type) DECLSPEC_HIDDEN; +void context_resource_unloaded(IWineD3DDeviceImpl *device, IWineD3DResource *resource, WINED3DRESOURCETYPE type) DECLSPEC_HIDDEN; BOOL context_set_current(struct wined3d_context *ctx) DECLSPEC_HIDDEN; void context_set_draw_buffer(struct wined3d_context *context, GLenum buffer) DECLSPEC_HIDDEN; @@ -1688,7 +1690,7 @@ HRESULT device_clear_render_targets(IWineD3DDeviceImpl *device, UINT rt_count, IWineD3DSurfaceImpl **rts, UINT rect_count, const WINED3DRECT *rects, - DWORD flags, WINED3DCOLOR color, float depth, DWORD stencil) DECLSPEC_HIDDEN; + DWORD flags, const float color[4], float depth, DWORD stencil) DECLSPEC_HIDDEN; BOOL device_context_add(IWineD3DDeviceImpl *device, struct wined3d_context *context) DECLSPEC_HIDDEN; void device_context_remove(IWineD3DDeviceImpl *device, struct wined3d_context *context) DECLSPEC_HIDDEN; void device_get_draw_rect(IWineD3DDeviceImpl *device, RECT *rect) DECLSPEC_HIDDEN; @@ -1776,6 +1778,7 @@ DWORD resource_set_priority(IWineD3DResource *iface, DWORD new_priority) DECLSPEC_HIDDEN; HRESULT resource_set_private_data(IWineD3DResource *iface, REFGUID guid, const void *data, DWORD data_size, DWORD flags) DECLSPEC_HIDDEN; +void resource_unload(IWineD3DResourceImpl *resource) DECLSPEC_HIDDEN; /* Tests show that the start address of resources is 32 byte aligned */ #define RESOURCE_ALIGNMENT 16 @@ -1920,7 +1923,7 @@ /* WineD3DVolume Information */ WINED3DVOLUMET_DESC currentDesc; - IWineD3DBase *container; + struct IWineD3DVolumeTextureImpl *container; BOOL lockable; BOOL locked; WINED3DBOX lockedBox; @@ -1932,6 +1935,7 @@ HRESULT volume_init(IWineD3DVolumeImpl *volume, IWineD3DDeviceImpl *device, UINT width, UINT height, UINT depth, DWORD usage, WINED3DFORMAT format, WINED3DPOOL pool, IUnknown *parent, const struct wined3d_parent_ops *parent_ops) DECLSPEC_HIDDEN; +void volume_set_container(IWineD3DVolumeImpl *volume, struct IWineD3DVolumeTextureImpl *container) DECLSPEC_HIDDEN; /***************************************************************************** * IWineD3DVolumeTexture implementation structure (extends IWineD3DBaseTextureImpl) @@ -1996,6 +2000,23 @@ HWND hWnd; } IWineD3DClipperImpl; +enum wined3d_container_type +{ + WINED3D_CONTAINER_NONE = 0, + WINED3D_CONTAINER_SWAPCHAIN, + WINED3D_CONTAINER_TEXTURE, +}; + +struct wined3d_subresource_container +{ + enum wined3d_container_type type; + union + { + struct IWineD3DBase *base; + struct IWineD3DSwapChainImpl *swapchain; + struct IWineD3DBaseTextureImpl *texture; + } u; +}; /***************************************************************************** * IWineD3DSurface implementation structure @@ -2007,7 +2028,7 @@ IWineD3DResourceClass resource; /* IWineD3DSurface fields */ - IWineD3DBase *container; + struct wined3d_subresource_container container; WINED3DSURFACET_DESC currentDesc; IWineD3DPaletteImpl *palette; /* D3D7 style palette handling */ PALETTEENTRY *palette9; /* D3D8/9 style palette handling */ @@ -2065,8 +2086,6 @@ extern const IWineD3DSurfaceVtbl IWineGDISurface_Vtbl DECLSPEC_HIDDEN; void surface_add_dirty_rect(IWineD3DSurfaceImpl *surface, const RECT *dirty_rect) DECLSPEC_HIDDEN; -UINT surface_calculate_size(const struct wined3d_format_desc *format_desc, - UINT alignment, UINT width, UINT height) DECLSPEC_HIDDEN; void surface_gdi_cleanup(IWineD3DSurfaceImpl *This) DECLSPEC_HIDDEN; GLenum surface_get_gl_buffer(IWineD3DSurfaceImpl *surface) DECLSPEC_HIDDEN; HRESULT surface_init(IWineD3DSurfaceImpl *surface, WINED3DSURFTYPE surface_type, UINT alignment, @@ -2085,6 +2104,8 @@ const struct wined3d_gl_info *gl_info, BOOL srgb) DECLSPEC_HIDDEN; void surface_set_compatible_renderbuffer(IWineD3DSurfaceImpl *surface, unsigned int width, unsigned int height) DECLSPEC_HIDDEN; +void surface_set_container(IWineD3DSurfaceImpl *surface, + enum wined3d_container_type type, IWineD3DBase *container) DECLSPEC_HIDDEN; void surface_set_texture_name(IWineD3DSurfaceImpl *surface, GLuint name, BOOL srgb_name) DECLSPEC_HIDDEN; void surface_set_texture_target(IWineD3DSurfaceImpl *surface, GLenum target) DECLSPEC_HIDDEN; void surface_translate_frontbuffer_coords(IWineD3DSurfaceImpl *surface, HWND window, RECT *rect) DECLSPEC_HIDDEN; @@ -2113,7 +2134,6 @@ HRESULT WINAPI IWineD3DBaseSurfaceImpl_SetPalette(IWineD3DSurface *iface, IWineD3DPalette *Pal) DECLSPEC_HIDDEN; HRESULT WINAPI IWineD3DBaseSurfaceImpl_SetColorKey(IWineD3DSurface *iface, DWORD Flags, const WINEDDCOLORKEY *CKey) DECLSPEC_HIDDEN; -HRESULT WINAPI IWineD3DBaseSurfaceImpl_SetContainer(IWineD3DSurface *iface, IWineD3DBase *container) DECLSPEC_HIDDEN; DWORD WINAPI IWineD3DBaseSurfaceImpl_GetPitch(IWineD3DSurface *iface) DECLSPEC_HIDDEN; HRESULT WINAPI IWineD3DBaseSurfaceImpl_SetOverlayPosition(IWineD3DSurface *iface, LONG X, LONG Y) DECLSPEC_HIDDEN; HRESULT WINAPI IWineD3DBaseSurfaceImpl_GetOverlayPosition(IWineD3DSurface *iface, LONG *X, LONG *Y) DECLSPEC_HIDDEN; @@ -2125,8 +2145,8 @@ HRESULT WINAPI IWineD3DBaseSurfaceImpl_GetClipper(IWineD3DSurface *iface, IWineD3DClipper **clipper) DECLSPEC_HIDDEN; HRESULT WINAPI IWineD3DBaseSurfaceImpl_SetFormat(IWineD3DSurface *iface, WINED3DFORMAT format) DECLSPEC_HIDDEN; HRESULT IWineD3DBaseSurfaceImpl_CreateDIBSection(IWineD3DSurface *iface) DECLSPEC_HIDDEN; -HRESULT WINAPI IWineD3DBaseSurfaceImpl_Blt(IWineD3DSurface *iface, const RECT *DestRect, IWineD3DSurface *SrcSurface, - const RECT *SrcRect, DWORD Flags, const WINEDDBLTFX *DDBltFx, WINED3DTEXTUREFILTERTYPE Filter) DECLSPEC_HIDDEN; +HRESULT WINAPI IWineD3DBaseSurfaceImpl_Blt(IWineD3DSurface *iface, const RECT *dst_rect, IWineD3DSurface *src_surface, + const RECT *src_rect, DWORD flags, const WINEDDBLTFX *fx, WINED3DTEXTUREFILTERTYPE filter) DECLSPEC_HIDDEN; HRESULT WINAPI IWineD3DBaseSurfaceImpl_BltFast(IWineD3DSurface *iface, DWORD dstx, DWORD dsty, IWineD3DSurface *Source, const RECT *rsrc, DWORD trans) DECLSPEC_HIDDEN; HRESULT WINAPI IWineD3DBaseSurfaceImpl_LockRect(IWineD3DSurface *iface, WINED3DLOCKED_RECT *pLockedRect, @@ -2165,7 +2185,6 @@ #define SFLAG_DS_ONSCREEN 0x00200000 /* Is a depth stencil, last modified onscreen */ #define SFLAG_DS_OFFSCREEN 0x00400000 /* Is a depth stencil, last modified offscreen */ #define SFLAG_INOVERLAYDRAW 0x00800000 /* Overlay drawing is in progress. Recursion prevention */ -#define SFLAG_SWAPCHAIN 0x01000000 /* The surface is part of a swapchain */ /* In some conditions the surface memory must not be freed: * SFLAG_CONVERTED: Converting the data back would take too long @@ -2549,7 +2568,7 @@ ULONG WINAPI IWineD3DBaseSwapChainImpl_Release(IWineD3DSwapChain *iface) DECLSPEC_HIDDEN; HRESULT WINAPI IWineD3DBaseSwapChainImpl_GetParent(IWineD3DSwapChain *iface, IUnknown **ppParent) DECLSPEC_HIDDEN; HRESULT WINAPI IWineD3DBaseSwapChainImpl_GetFrontBufferData(IWineD3DSwapChain *iface, - IWineD3DSurface *pDestSurface) DECLSPEC_HIDDEN; + IWineD3DSurface *dst_surface) DECLSPEC_HIDDEN; HRESULT WINAPI IWineD3DBaseSwapChainImpl_GetBackBuffer(IWineD3DSwapChain *iface, UINT iBackBuffer, WINED3DBACKBUFFER_TYPE Type, IWineD3DSurface **ppBackBuffer) DECLSPEC_HIDDEN; HRESULT WINAPI IWineD3DBaseSwapChainImpl_GetRasterStatus(IWineD3DSwapChain *iface, @@ -2939,6 +2958,7 @@ #define WINED3DFMT_FLAG_VTF 0x00002000 #define WINED3DFMT_FLAG_SHADOW 0x00004000 #define WINED3DFMT_FLAG_COMPRESSED 0x00008000 +#define WINED3DFMT_FLAG_BROKEN_PITCH 0x00010000 struct wined3d_format_desc { @@ -2976,6 +2996,8 @@ const struct wined3d_format_desc *getFormatDescEntry(WINED3DFORMAT fmt, const struct wined3d_gl_info *gl_info) DECLSPEC_HIDDEN; +UINT wined3d_format_calculate_size(const struct wined3d_format_desc *format, + UINT alignment, UINT width, UINT height) DECLSPEC_HIDDEN; static inline BOOL use_vs(IWineD3DStateBlockImpl *stateblock) { diff -Nru wine1.3-1.3.0/dlls/wineps.drv/escape.c wine1.3-1.3.1/dlls/wineps.drv/escape.c --- wine1.3-1.3.0/dlls/wineps.drv/escape.c 2010-07-30 18:43:56.000000000 +0100 +++ wine1.3-1.3.1/dlls/wineps.drv/escape.c 2010-08-20 18:23:50.000000000 +0100 @@ -46,108 +46,13 @@ static const char psbegindocument[] = "%%BeginDocument: Wine passthrough\n"; -/* FIXME: should use winspool functions instead */ -static DWORD create_job(LPCSTR pszOutput) -{ - int fd = -1; - char psCmd[1024]; - const char *psCmdP = psCmd; - HKEY hkey; - - /* TTD convert the 'output device' into a spool file name */ - - if (pszOutput == NULL || *pszOutput == '\0') return 0; - - psCmd[0] = 0; - /* @@ Wine registry key: HKCU\Software\Wine\Printing\Spooler */ - if(!RegOpenKeyA(HKEY_CURRENT_USER, "Software\\Wine\\Printing\\Spooler", &hkey)) - { - DWORD type, count = sizeof(psCmd); - RegQueryValueExA(hkey, pszOutput, 0, &type, (LPBYTE)psCmd, &count); - RegCloseKey(hkey); - } - if (!psCmd[0] && !strncmp("LPR:",pszOutput,4)) - sprintf(psCmd,"|lpr -P'%s'",pszOutput+4); - - TRACE("Got printerSpoolCommand '%s' for output device '%s'\n", - psCmd, pszOutput); - if (!*psCmd) - psCmdP = pszOutput; - else - { - while (*psCmdP && isspace(*psCmdP)) - { - psCmdP++; - } - if (!*psCmdP) return 0; - } - TRACE("command: '%s'\n", psCmdP); -#ifdef HAVE_FORK - if (*psCmdP == '|') - { - int fds[2]; - if (pipe(fds)) { - ERR("pipe() failed!\n"); - return 0; - } - if (fork() == 0) - { - psCmdP++; - - TRACE("In child need to exec %s\n",psCmdP); - close(0); - dup2(fds[0],0); - close (fds[1]); - - /* reset signals that we previously set to SIG_IGN */ - signal( SIGPIPE, SIG_DFL ); - signal( SIGCHLD, SIG_DFL ); - - execl("/bin/sh", "/bin/sh", "-c", psCmdP, NULL); - _exit(1); - - } - close (fds[0]); - fd = fds[1]; - TRACE("Need to execute a cmnd and pipe the output to it\n"); - } - else -#endif - { - char *buffer; - WCHAR psCmdPW[MAX_PATH]; - - TRACE("Just assume it's a file\n"); - - /** - * The file name can be dos based, we have to find its - * corresponding Unix file name. - */ - MultiByteToWideChar(CP_ACP, 0, psCmdP, -1, psCmdPW, MAX_PATH); - if ((buffer = wine_get_unix_file_name(psCmdPW))) - { - if ((fd = open(buffer, O_CREAT | O_TRUNC | O_WRONLY, 0666)) < 0) - { - ERR("Failed to create spool file '%s' ('%s'). (error %s)\n", - buffer, psCmdP, strerror(errno)); - } - HeapFree(GetProcessHeap(), 0, buffer); - } - } - return fd + 1; -} - -static int close_job( DWORD id ) -{ - int fd = id - 1; - close( fd ); - return TRUE; -} DWORD write_spool( PSDRV_PDEVICE *physDev, const void *data, DWORD num ) { - int fd = physDev->job.id - 1; - if (write( fd, data, num) != num) return SP_OUTOFDISK; + DWORD written; + if (!WritePrinter(physDev->job.hprinter, (LPBYTE) data, num, &written) || (written != num)) + return SP_OUTOFDISK; + return num; } @@ -500,33 +405,41 @@ */ static INT PSDRV_StartDocA( PSDRV_PDEVICE *physDev, const DOCINFOA *doc ) { - LPCSTR output = "LPT1:"; - BYTE buf[300]; - HANDLE hprn = INVALID_HANDLE_VALUE; - PRINTER_INFO_5A *pi5 = (PRINTER_INFO_5A*)buf; - DWORD needed; + DOC_INFO_1A di; + + TRACE("(%p, %p) => %s, %s, %s\n", physDev, doc, debugstr_a(doc->lpszDocName), + debugstr_a(doc->lpszOutput), debugstr_a(doc->lpszDatatype)); if(physDev->job.id) { FIXME("hJob != 0. Now what?\n"); return 0; } + /* FIXME: use PRINTER_DEFAULTS here */ + if(!OpenPrinterA(physDev->pi->FriendlyName, &physDev->job.hprinter, NULL)) { + WARN("OpenPrinter(%s, ...) failed: %d\n", + debugstr_a(physDev->pi->FriendlyName), GetLastError()); + return 0; + } + + di.pDocName = (LPSTR) doc->lpszDocName; + di.pDatatype = NULL; + if(doc->lpszOutput) - output = doc->lpszOutput; + di.pOutputFile = (LPSTR) doc->lpszOutput; else if(physDev->job.output) - output = physDev->job.output; - else { - if(OpenPrinterA(physDev->pi->FriendlyName, &hprn, NULL) && - GetPrinterA(hprn, 5, buf, sizeof(buf), &needed)) { - output = pi5->pPortName; - } - if(hprn != INVALID_HANDLE_VALUE) - ClosePrinter(hprn); - } + di.pOutputFile = physDev->job.output; + else + di.pOutputFile = NULL; - physDev->job.id = create_job( output ); + TRACE("using output: %s\n", debugstr_a(di.pOutputFile)); + + /* redirection located in HKCU\Software\Wine\Printing\Spooler + is done during winspool.drv,ScheduleJob */ + physDev->job.id = StartDocPrinterA(physDev->job.hprinter, 1, (LPBYTE) &di); if(!physDev->job.id) { - WARN("OpenJob failed\n"); + WARN("StartDocPrinter() failed: %d\n", GetLastError()); + ClosePrinter(physDev->job.hprinter); return 0; } physDev->job.banding = FALSE; @@ -553,6 +466,9 @@ INT ret, len; LPSTR docname = NULL, output = NULL, datatype = NULL; + TRACE("(%p, %p) => %d,%s,%s,%s\n", physDev, doc, doc->cbSize, debugstr_w(doc->lpszDocName), + debugstr_w(doc->lpszOutput), debugstr_w(doc->lpszDatatype)); + docA.cbSize = doc->cbSize; if (doc->lpszDocName) { @@ -603,7 +519,9 @@ } PSDRV_WriteFooter( physDev ); - ret = close_job( physDev->job.id ); + ret = EndDocPrinter(physDev->job.hprinter); + ClosePrinter(physDev->job.hprinter); + physDev->job.hprinter = NULL; physDev->job.id = 0; HeapFree(GetProcessHeap(), 0, physDev->job.DocName); physDev->job.DocName = NULL; diff -Nru wine1.3-1.3.0/dlls/wineps.drv/psdrv.h wine1.3-1.3.1/dlls/wineps.drv/psdrv.h --- wine1.3-1.3.0/dlls/wineps.drv/psdrv.h 2010-07-30 18:43:56.000000000 +0100 +++ wine1.3-1.3.1/dlls/wineps.drv/psdrv.h 2010-08-20 18:23:50.000000000 +0100 @@ -340,6 +340,7 @@ typedef struct { DWORD id; /* Job id */ + HANDLE hprinter; /* Printer handle */ LPSTR output; /* Output file/port */ LPSTR DocName; /* Document Name */ BOOL banding; /* Have we received a NEXTBAND */ diff -Nru wine1.3-1.3.0/dlls/winex11.drv/Makefile.in wine1.3-1.3.1/dlls/winex11.drv/Makefile.in --- wine1.3-1.3.0/dlls/winex11.drv/Makefile.in 2010-07-30 18:43:56.000000000 +0100 +++ wine1.3-1.3.1/dlls/winex11.drv/Makefile.in 2010-08-20 18:23:50.000000000 +0100 @@ -3,8 +3,8 @@ SRCDIR = @srcdir@ VPATH = @srcdir@ MODULE = winex11.drv -IMPORTS = user32 gdi32 advapi32 imm32 -DELAYIMPORTS = comctl32 +IMPORTS = uuid user32 gdi32 advapi32 imm32 +DELAYIMPORTS = comctl32 ole32 shell32 EXTRAINCL = @X_CFLAGS@ EXTRALIBS = @X_LIBS@ @X_PRE_LIBS@ @XLIB@ @X_EXTRA_LIBS@ diff -Nru wine1.3-1.3.0/dlls/winex11.drv/settings.c wine1.3-1.3.1/dlls/winex11.drv/settings.c --- wine1.3-1.3.0/dlls/winex11.drv/settings.c 2010-07-30 18:43:56.000000000 +0100 +++ wine1.3-1.3.1/dlls/winex11.drv/settings.c 2010-08-20 18:23:50.000000000 +0100 @@ -150,7 +150,8 @@ static LONG X11DRV_nores_SetCurrentMode(int mode) { - TRACE("Ignoring mode change request\n"); + if (mode == 0) return DISP_CHANGE_SUCCESSFUL; + TRACE("Ignoring mode change request mode=%d\n", mode); return DISP_CHANGE_FAILED; } diff -Nru wine1.3-1.3.0/dlls/winex11.drv/window.c wine1.3-1.3.1/dlls/winex11.drv/window.c --- wine1.3-1.3.0/dlls/winex11.drv/window.c 2010-07-30 18:43:56.000000000 +0100 +++ wine1.3-1.3.1/dlls/winex11.drv/window.c 2010-08-20 18:23:50.000000000 +0100 @@ -2671,7 +2671,7 @@ * with a ButtonPress event */ wine_tsx11_lock(); XUngrabPointer( display, CurrentTime ); - XSendEvent(display, root_window, False, SubstructureNotifyMask, &xev); + XSendEvent(display, root_window, False, SubstructureNotifyMask | SubstructureRedirectMask, &xev); wine_tsx11_unlock(); return 0; } diff -Nru wine1.3-1.3.0/dlls/winex11.drv/xdnd.c wine1.3-1.3.1/dlls/winex11.drv/xdnd.c --- wine1.3-1.3.0/dlls/winex11.drv/xdnd.c 2010-07-30 18:43:56.000000000 +0100 +++ wine1.3-1.3.1/dlls/winex11.drv/xdnd.c 2010-08-20 18:23:50.000000000 +0100 @@ -34,11 +34,15 @@ #include "wingdi.h" #include "winuser.h" +#define COBJMACROS #include "x11drv.h" #include "shlobj.h" /* DROPFILES */ +#include "oleidl.h" +#include "objidl.h" #include "wine/unicode.h" #include "wine/debug.h" +#include "wine/list.h" WINE_DEFAULT_DEBUG_CHANNEL(xdnd); @@ -52,11 +56,18 @@ Atom cf_xdnd; void *data; unsigned int size; - struct tagXDNDDATA *next; + struct list entry; } XDNDDATA, *LPXDNDDATA; -static LPXDNDDATA XDNDData = NULL; +static struct list xdndData = LIST_INIT(xdndData); static POINT XDNDxy = { 0, 0 }; +static IDataObject XDNDDataObject; +static BOOL XDNDAccepted = FALSE; +static DWORD XDNDDropEffect = DROPEFFECT_NONE; +/* the last window the mouse was over */ +static HWND XDNDLastTargetWnd; +/* might be a ancestor of XDNDLastTargetWnd */ +static HWND XDNDLastDropTargetWnd; static void X11DRV_XDND_InsertXDNDData(int property, int format, void* data, unsigned int len); static int X11DRV_XDND_DeconstructTextURIList(int property, void* data, int len); @@ -80,6 +91,109 @@ static CRITICAL_SECTION xdnd_cs = { &critsect_debug, -1, 0, 0, 0, 0 }; +/* Based on functions in dlls/ole32/ole2.c */ +static HANDLE get_droptarget_local_handle(HWND hwnd) +{ + static const WCHAR prop_marshalleddroptarget[] = + {'W','i','n','e','M','a','r','s','h','a','l','l','e','d','D','r','o','p','T','a','r','g','e','t',0}; + HANDLE handle; + HANDLE local_handle = 0; + + handle = GetPropW(hwnd, prop_marshalleddroptarget); + if (handle) + { + DWORD pid; + HANDLE process; + + GetWindowThreadProcessId(hwnd, &pid); + process = OpenProcess(PROCESS_DUP_HANDLE, FALSE, pid); + if (process) + { + DuplicateHandle(process, handle, GetCurrentProcess(), &local_handle, 0, FALSE, DUPLICATE_SAME_ACCESS); + CloseHandle(process); + } + } + return local_handle; +} + +static HRESULT create_stream_from_map(HANDLE map, IStream **stream) +{ + HRESULT hr = E_OUTOFMEMORY; + HGLOBAL hmem; + void *data; + MEMORY_BASIC_INFORMATION info; + + data = MapViewOfFile(map, FILE_MAP_READ, 0, 0, 0); + if(!data) return hr; + + VirtualQuery(data, &info, sizeof(info)); + TRACE("size %d\n", (int)info.RegionSize); + + hmem = GlobalAlloc(GMEM_MOVEABLE, info.RegionSize); + if(hmem) + { + memcpy(GlobalLock(hmem), data, info.RegionSize); + GlobalUnlock(hmem); + hr = CreateStreamOnHGlobal(hmem, TRUE, stream); + } + UnmapViewOfFile(data); + return hr; +} + +static IDropTarget* get_droptarget_pointer(HWND hwnd) +{ + IDropTarget *droptarget = NULL; + HANDLE map; + IStream *stream; + + map = get_droptarget_local_handle(hwnd); + if(!map) return NULL; + + if(SUCCEEDED(create_stream_from_map(map, &stream))) + { + CoUnmarshalInterface(stream, &IID_IDropTarget, (void**)&droptarget); + IStream_Release(stream); + } + CloseHandle(map); + return droptarget; +} + +/************************************************************************** + * X11DRV_XDND_XdndActionToDROPEFFECT + */ +static DWORD X11DRV_XDND_XdndActionToDROPEFFECT(long action) +{ + /* In Windows, nothing but the given effects is allowed. + * In X the given action is just a hint, and you can always + * XdndActionCopy and XdndActionPrivate, so be more permissive. */ + if (action == x11drv_atom(XdndActionCopy)) + return DROPEFFECT_COPY; + else if (action == x11drv_atom(XdndActionMove)) + return DROPEFFECT_MOVE | DROPEFFECT_COPY; + else if (action == x11drv_atom(XdndActionLink)) + return DROPEFFECT_LINK | DROPEFFECT_COPY; + else if (action == x11drv_atom(XdndActionAsk)) + /* FIXME: should we somehow ask the user what to do here? */ + return DROPEFFECT_COPY | DROPEFFECT_MOVE | DROPEFFECT_LINK; + FIXME("unknown action %ld, assuming DROPEFFECT_COPY\n", action); + return DROPEFFECT_COPY; +} + +/************************************************************************** + * X11DRV_XDND_DROPEFFECTToXdndAction + */ +static long X11DRV_XDND_DROPEFFECTToXdndAction(DWORD effect) +{ + if (effect == DROPEFFECT_COPY) + return x11drv_atom(XdndActionCopy); + else if (effect == DROPEFFECT_MOVE) + return x11drv_atom(XdndActionMove); + else if (effect == DROPEFFECT_LINK) + return x11drv_atom(XdndActionLink); + FIXME("unknown drop effect %u, assuming XdndActionCopy\n", effect); + return x11drv_atom(XdndActionCopy); +} + /************************************************************************** * X11DRV_XDND_EnterEvent * @@ -103,6 +217,8 @@ return; } + XDNDAccepted = FALSE; + /* If the source supports more than 3 data types we retrieve * the entire list. */ if (event->data.l[1] & 1) @@ -158,12 +274,79 @@ { XClientMessageEvent e; int accept = 0; /* Assume we're not accepting */ + IDropTarget *dropTarget = NULL; + DWORD effect; + POINTL pointl; + HWND targetWindow; + HRESULT hr; XDNDxy.x = event->data.l[2] >> 16; XDNDxy.y = event->data.l[2] & 0xFFFF; + targetWindow = WindowFromPoint(XDNDxy); + + pointl.x = XDNDxy.x; + pointl.y = XDNDxy.y; + effect = X11DRV_XDND_XdndActionToDROPEFFECT(event->data.l[4]); - /* FIXME: Notify OLE of DragEnter. Result determines if we accept */ + if (!XDNDAccepted || XDNDLastTargetWnd != targetWindow) + { + /* Notify OLE of DragEnter. Result determines if we accept */ + HWND dropTargetWindow; + + if (XDNDLastDropTargetWnd) + { + dropTarget = get_droptarget_pointer(XDNDLastDropTargetWnd); + if (dropTarget) + { + hr = IDropTarget_DragLeave(dropTarget); + if (FAILED(hr)) + WARN("IDropTarget_DragLeave failed, error 0x%08X\n", hr); + IDropTarget_Release(dropTarget); + } + } + dropTargetWindow = targetWindow; + do + { + dropTarget = get_droptarget_pointer(dropTargetWindow); + } while (dropTarget == NULL && (dropTargetWindow = GetParent(dropTargetWindow)) != NULL); + XDNDLastTargetWnd = targetWindow; + XDNDLastDropTargetWnd = dropTargetWindow; + if (dropTarget) + { + hr = IDropTarget_DragEnter(dropTarget, &XDNDDataObject, + MK_LBUTTON, pointl, &effect); + if (SUCCEEDED(hr)) + { + if (effect != DROPEFFECT_NONE) + { + XDNDAccepted = TRUE; + TRACE("the application accepted the drop\n"); + } + else + TRACE("the application refused the drop\n"); + } + else + WARN("IDropTarget_DragEnter failed, error 0x%08X\n", hr); + IDropTarget_Release(dropTarget); + } + } + if (XDNDAccepted && XDNDLastTargetWnd == targetWindow) + { + /* If drag accepted notify OLE of DragOver */ + dropTarget = get_droptarget_pointer(XDNDLastDropTargetWnd); + if (dropTarget) + { + hr = IDropTarget_DragOver(dropTarget, MK_LBUTTON, pointl, &effect); + if (SUCCEEDED(hr)) + XDNDDropEffect = effect; + else + WARN("IDropTarget_DragOver failed, error 0x%08X\n", hr); + IDropTarget_Release(dropTarget); + } + } + if (XDNDAccepted) + accept = 1; if (GetWindowLongW( hWnd, GWL_EXSTYLE ) & WS_EX_ACCEPTFILES) accept = 1; @@ -184,14 +367,12 @@ e.data.l[2] = 0; /* Empty Rect */ e.data.l[3] = 0; /* Empty Rect */ if (accept) - e.data.l[4] = event->data.l[4]; + e.data.l[4] = X11DRV_XDND_DROPEFFECTToXdndAction(effect); else e.data.l[4] = None; wine_tsx11_lock(); XSendEvent(event->display, event->data.l[0], False, NoEventMask, (XEvent*)&e); wine_tsx11_unlock(); - - /* FIXME: if drag accepted notify OLE of DragOver */ } /************************************************************************** @@ -202,6 +383,7 @@ void X11DRV_XDND_DropEvent( HWND hWnd, XClientMessageEvent *event ) { XClientMessageEvent e; + IDropTarget *dropTarget; TRACE("\n"); @@ -209,7 +391,30 @@ if (GetWindowLongW( hWnd, GWL_EXSTYLE ) & WS_EX_ACCEPTFILES) X11DRV_XDND_SendDropFiles( hWnd ); - /* FIXME: Notify OLE of Drop */ + /* Notify OLE of Drop */ + dropTarget = get_droptarget_pointer(XDNDLastDropTargetWnd); + if (dropTarget) + { + HRESULT hr; + POINTL pointl; + DWORD effect = XDNDDropEffect; + + pointl.x = XDNDxy.x; + pointl.y = XDNDxy.y; + hr = IDropTarget_Drop(dropTarget, &XDNDDataObject, MK_LBUTTON, + pointl, &effect); + if (SUCCEEDED(hr)) + { + if (effect != DROPEFFECT_NONE) + TRACE("drop succeeded\n"); + else + TRACE("the application refused the drop\n"); + } + else + WARN("drop failed, error 0x%08X\n", hr); + IDropTarget_Release(dropTarget); + } + X11DRV_XDND_FreeDragDropOp(); /* Tell the target we are finished. */ @@ -232,11 +437,21 @@ */ void X11DRV_XDND_LeaveEvent( HWND hWnd, XClientMessageEvent *event ) { + IDropTarget *dropTarget; + TRACE("DND Operation canceled\n"); - X11DRV_XDND_FreeDragDropOp(); + /* Notify OLE of DragLeave */ + dropTarget = get_droptarget_pointer(XDNDLastDropTargetWnd); + if (dropTarget) + { + HRESULT hr = IDropTarget_DragLeave(dropTarget); + if (FAILED(hr)) + WARN("IDropTarget_DragLeave failed, error 0x%08X\n", hr); + IDropTarget_Release(dropTarget); + } - /* FIXME: Notify OLE of DragLeave */ + X11DRV_XDND_FreeDragDropOp(); } @@ -256,6 +471,8 @@ unsigned long bytesret, icount; int entries = 0; unsigned char* data = NULL; + XDNDDATA *current, *next; + BOOL haveHDROP = FALSE; TRACE("count(%ld)\n", *count); @@ -300,6 +517,31 @@ wine_tsx11_unlock(); } + /* On Windows when there is a CF_HDROP, there are no other CF_ formats. + * foobar2000 relies on this (spaces -> %20's without it). + */ + LIST_FOR_EACH_ENTRY(current, &xdndData, XDNDDATA, entry) + { + if (current->cf_win == CF_HDROP) + { + haveHDROP = TRUE; + break; + } + } + if (haveHDROP) + { + LIST_FOR_EACH_ENTRY_SAFE(current, next, &xdndData, XDNDDATA, entry) + { + if (current->cf_win != CF_HDROP && current->cf_win < CF_MAX) + { + list_remove(¤t->entry); + HeapFree(GetProcessHeap(), 0, current->data); + HeapFree(GetProcessHeap(), 0, current); + --entries; + } + } + } + *count = entries; } @@ -316,12 +558,11 @@ if (current) { EnterCriticalSection(&xdnd_cs); - current->next = XDNDData; current->cf_xdnd = property; current->cf_win = format; current->data = data; current->size = len; - XDNDData = current; + list_add_tail(&xdndData, ¤t->entry); LeaveCriticalSection(&xdnd_cs); } } @@ -484,21 +725,22 @@ */ static void X11DRV_XDND_SendDropFiles(HWND hwnd) { - LPXDNDDATA current; + LPXDNDDATA current = NULL; + BOOL found = FALSE; EnterCriticalSection(&xdnd_cs); - current = XDNDData; - /* Find CF_HDROP type if any */ - while (current != NULL) + LIST_FOR_EACH_ENTRY(current, &xdndData, XDNDDATA, entry) { if (current->cf_win == CF_HDROP) + { + found = TRUE; break; - current = current->next; + } } - if (current != NULL) + if (found) { DROPFILES *lpDrop = current->data; @@ -530,18 +772,17 @@ EnterCriticalSection(&xdnd_cs); - current = XDNDData; - /** Free data cache */ - while (current != NULL) + LIST_FOR_EACH_ENTRY_SAFE(current, next, &xdndData, XDNDDATA, entry) { - next = current->next; + list_remove(¤t->entry); HeapFree(GetProcessHeap(), 0, current); - current = next; } - XDNDData = NULL; XDNDxy.x = XDNDxy.y = 0; + XDNDLastTargetWnd = NULL; + XDNDLastDropTargetWnd = NULL; + XDNDAccepted = FALSE; LeaveCriticalSection(&xdnd_cs); } @@ -661,3 +902,248 @@ HeapFree(GetProcessHeap(), 0, uri); return ret; } + + +/************************************************************************** + * X11DRV_XDND_DescribeClipboardFormat + */ +static void X11DRV_XDND_DescribeClipboardFormat(int cfFormat, char *buffer, int size) +{ +#define D(x) case x: lstrcpynA(buffer, #x, size); return; + switch (cfFormat) + { + D(CF_TEXT) + D(CF_BITMAP) + D(CF_METAFILEPICT) + D(CF_SYLK) + D(CF_DIF) + D(CF_TIFF) + D(CF_OEMTEXT) + D(CF_DIB) + D(CF_PALETTE) + D(CF_PENDATA) + D(CF_RIFF) + D(CF_WAVE) + D(CF_UNICODETEXT) + D(CF_ENHMETAFILE) + D(CF_HDROP) + D(CF_LOCALE) + D(CF_DIBV5) + } +#undef D + + if (CF_PRIVATEFIRST <= cfFormat && cfFormat <= CF_PRIVATELAST) + { + lstrcpynA(buffer, "some private object", size); + return; + } + if (CF_GDIOBJFIRST <= cfFormat && cfFormat <= CF_GDIOBJLAST) + { + lstrcpynA(buffer, "some GDI object", size); + return; + } + + GetClipboardFormatNameA(cfFormat, buffer, size); +} + + +/* The IDataObject singleton we feed to OLE follows */ + +static HRESULT WINAPI XDNDDATAOBJECT_QueryInterface(IDataObject *dataObject, + REFIID riid, void **ppvObject) +{ + TRACE("(%p, %s, %p)\n", dataObject, debugstr_guid(riid), ppvObject); + if (IsEqualIID(riid, &IID_IUnknown) || IsEqualIID(riid, &IID_IDataObject)) + { + *ppvObject = dataObject; + IDataObject_AddRef(dataObject); + return S_OK; + } + *ppvObject = NULL; + return E_NOINTERFACE; +} + +static ULONG WINAPI XDNDDATAOBJECT_AddRef(IDataObject *dataObject) +{ + TRACE("(%p)\n", dataObject); + return 2; +} + +static ULONG WINAPI XDNDDATAOBJECT_Release(IDataObject *dataObject) +{ + TRACE("(%p)\n", dataObject); + return 1; +} + +static HRESULT WINAPI XDNDDATAOBJECT_GetData(IDataObject *dataObject, + FORMATETC *formatEtc, + STGMEDIUM *pMedium) +{ + HRESULT hr; + char formatDesc[1024]; + + TRACE("(%p, %p, %p)\n", dataObject, formatEtc, pMedium); + X11DRV_XDND_DescribeClipboardFormat(formatEtc->cfFormat, + formatDesc, sizeof(formatDesc)); + TRACE("application is looking for %s\n", formatDesc); + + hr = IDataObject_QueryGetData(dataObject, formatEtc); + if (SUCCEEDED(hr)) + { + XDNDDATA *current; + LIST_FOR_EACH_ENTRY(current, &xdndData, XDNDDATA, entry) + { + if (current->cf_win == formatEtc->cfFormat) + { + pMedium->tymed = TYMED_HGLOBAL; + pMedium->hGlobal = HeapAlloc(GetProcessHeap(), 0, current->size); + if (pMedium->hGlobal == NULL) + return E_OUTOFMEMORY; + memcpy(pMedium->hGlobal, current->data, current->size); + pMedium->pUnkForRelease = 0; + return S_OK; + } + } + } + return hr; +} + +static HRESULT WINAPI XDNDDATAOBJECT_GetDataHere(IDataObject *dataObject, + FORMATETC *formatEtc, + STGMEDIUM *pMedium) +{ + FIXME("(%p, %p, %p): stub\n", dataObject, formatEtc, pMedium); + return DATA_E_FORMATETC; +} + +static HRESULT WINAPI XDNDDATAOBJECT_QueryGetData(IDataObject *dataObject, + FORMATETC *formatEtc) +{ + char formatDesc[1024]; + XDNDDATA *current; + + TRACE("(%p, %p={.tymed=0x%x, .dwAspect=%d, .cfFormat=%d}\n", + dataObject, formatEtc, formatEtc->tymed, formatEtc->dwAspect, formatEtc->cfFormat); + X11DRV_XDND_DescribeClipboardFormat(formatEtc->cfFormat, formatDesc, sizeof(formatDesc)); + + if (formatEtc->tymed && !(formatEtc->tymed & TYMED_HGLOBAL)) + { + FIXME("only HGLOBAL medium types supported right now\n"); + return DV_E_TYMED; + } + if (formatEtc->dwAspect != DVASPECT_CONTENT) + { + FIXME("only the content aspect is supported right now\n"); + return E_NOTIMPL; + } + + LIST_FOR_EACH_ENTRY(current, &xdndData, XDNDDATA, entry) + { + if (current->cf_win == formatEtc->cfFormat) + { + TRACE("application found %s\n", formatDesc); + return S_OK; + } + } + TRACE("application didn't find %s\n", formatDesc); + return DV_E_FORMATETC; +} + +static HRESULT WINAPI XDNDDATAOBJECT_GetCanonicalFormatEtc(IDataObject *dataObject, + FORMATETC *formatEtc, + FORMATETC *formatEtcOut) +{ + FIXME("(%p, %p, %p): stub\n", dataObject, formatEtc, formatEtcOut); + formatEtcOut->ptd = NULL; + return E_NOTIMPL; +} + +static HRESULT WINAPI XDNDDATAOBJECT_SetData(IDataObject *dataObject, + FORMATETC *formatEtc, + STGMEDIUM *pMedium, BOOL fRelease) +{ + FIXME("(%p, %p, %p, %s): stub\n", dataObject, formatEtc, + pMedium, fRelease?"TRUE":"FALSE"); + return E_NOTIMPL; +} + +static HRESULT WINAPI XDNDDATAOBJECT_EnumFormatEtc(IDataObject *dataObject, + DWORD dwDirection, + IEnumFORMATETC **ppEnumFormatEtc) +{ + DWORD count; + FORMATETC *formats; + + TRACE("(%p, %u, %p)\n", dataObject, dwDirection, ppEnumFormatEtc); + + if (dwDirection != DATADIR_GET) + { + FIXME("only the get direction is implemented\n"); + return E_NOTIMPL; + } + + count = list_count(&xdndData); + formats = HeapAlloc(GetProcessHeap(), 0, count * sizeof(FORMATETC)); + if (formats) + { + XDNDDATA *current; + DWORD i = 0; + HRESULT hr; + LIST_FOR_EACH_ENTRY(current, &xdndData, XDNDDATA, entry) + { + formats[i].cfFormat = current->cf_win; + formats[i].ptd = NULL; + formats[i].dwAspect = DVASPECT_CONTENT; + formats[i].lindex = -1; + formats[i].tymed = TYMED_HGLOBAL; + i++; + } + hr = SHCreateStdEnumFmtEtc(count, formats, ppEnumFormatEtc); + HeapFree(GetProcessHeap(), 0, formats); + return hr; + } + else + return E_OUTOFMEMORY; +} + +static HRESULT WINAPI XDNDDATAOBJECT_DAdvise(IDataObject *dataObject, + FORMATETC *formatEtc, DWORD advf, + IAdviseSink *adviseSink, + DWORD *pdwConnection) +{ + FIXME("(%p, %p, %u, %p, %p): stub\n", dataObject, formatEtc, advf, + adviseSink, pdwConnection); + return OLE_E_ADVISENOTSUPPORTED; +} + +static HRESULT WINAPI XDNDDATAOBJECT_DUnadvise(IDataObject *dataObject, + DWORD dwConnection) +{ + FIXME("(%p, %u): stub\n", dataObject, dwConnection); + return OLE_E_ADVISENOTSUPPORTED; +} + +static HRESULT WINAPI XDNDDATAOBJECT_EnumDAdvise(IDataObject *dataObject, + IEnumSTATDATA **pEnumAdvise) +{ + FIXME("(%p, %p): stub\n", dataObject, pEnumAdvise); + return OLE_E_ADVISENOTSUPPORTED; +} + +static IDataObjectVtbl xdndDataObjectVtbl = +{ + XDNDDATAOBJECT_QueryInterface, + XDNDDATAOBJECT_AddRef, + XDNDDATAOBJECT_Release, + XDNDDATAOBJECT_GetData, + XDNDDATAOBJECT_GetDataHere, + XDNDDATAOBJECT_QueryGetData, + XDNDDATAOBJECT_GetCanonicalFormatEtc, + XDNDDATAOBJECT_SetData, + XDNDDATAOBJECT_EnumFormatEtc, + XDNDDATAOBJECT_DAdvise, + XDNDDATAOBJECT_DUnadvise, + XDNDDATAOBJECT_EnumDAdvise +}; + +static IDataObject XDNDDataObject = { &xdndDataObjectVtbl }; diff -Nru wine1.3-1.3.0/dlls/winhttp/net.c wine1.3-1.3.1/dlls/winhttp/net.c --- wine1.3-1.3.0/dlls/winhttp/net.c 2010-07-30 18:43:56.000000000 +0100 +++ wine1.3-1.3.1/dlls/winhttp/net.c 2010-08-20 18:23:50.000000000 +0100 @@ -38,6 +38,7 @@ #endif #ifdef HAVE_OPENSSL_SSL_H # include +# include #undef FAR #undef DSA #endif @@ -91,7 +92,11 @@ static void *libssl_handle; static void *libcrypto_handle; +#if defined(OPENSSL_VERSION_NUMBER) && (OPENSSL_VERSION_NUMBER> 0x1000000) +static const SSL_METHOD *method; +#else static SSL_METHOD *method; +#endif static SSL_CTX *ctx; static int hostname_idx; static int error_idx; diff -Nru wine1.3-1.3.0/dlls/winhttp/request.c wine1.3-1.3.1/dlls/winhttp/request.c --- wine1.3-1.3.0/dlls/winhttp/request.c 2010-07-30 18:43:56.000000000 +0100 +++ wine1.3-1.3.1/dlls/winhttp/request.c 2010-08-20 18:23:50.000000000 +0100 @@ -602,12 +602,12 @@ if (!(p = headers)) return FALSE; for (len = 0; *p; p++) if (*p != '\r') len++; - if ((len + 1) * sizeof(WCHAR) > *buflen || !buffer) + if (!buffer || (len + 1) * sizeof(WCHAR) > *buflen) { len++; set_last_error( ERROR_INSUFFICIENT_BUFFER ); } - else if (buffer) + else { for (p = headers, q = buffer; *p; p++, q++) { @@ -637,12 +637,12 @@ if (!headers) return FALSE; len = strlenW( headers ) * sizeof(WCHAR); - if (len + sizeof(WCHAR) > *buflen || !buffer) + if (!buffer || len + sizeof(WCHAR) > *buflen) { len += sizeof(WCHAR); set_last_error( ERROR_INSUFFICIENT_BUFFER ); } - else if (buffer) + else { memcpy( buffer, headers, len + sizeof(WCHAR) ); TRACE("returning data: %s\n", debugstr_wn(buffer, len / sizeof(WCHAR))); @@ -653,43 +653,38 @@ return ret; } case WINHTTP_QUERY_VERSION: - { - DWORD len = (strlenW( request->version ) + 1) * sizeof(WCHAR); - if (len > *buflen) + len = strlenW( request->version ) * sizeof(WCHAR); + if (!buffer || len + sizeof(WCHAR) > *buflen) { + len += sizeof(WCHAR); set_last_error( ERROR_INSUFFICIENT_BUFFER ); - *buflen = len; - return FALSE; } - else if (buffer) + else { strcpyW( buffer, request->version ); TRACE("returning string: %s\n", debugstr_w(buffer)); ret = TRUE; } - *buflen = len - sizeof(WCHAR); + *buflen = len; return ret; - } + case WINHTTP_QUERY_STATUS_TEXT: - { - DWORD len = (strlenW( request->status_text ) + 1) * sizeof(WCHAR); - if (len > *buflen) + len = strlenW( request->status_text ) * sizeof(WCHAR); + if (!buffer || len + sizeof(WCHAR) > *buflen) { + len += sizeof(WCHAR); set_last_error( ERROR_INSUFFICIENT_BUFFER ); - *buflen = len; - return FALSE; } - else if (buffer) + else { strcpyW( buffer, request->status_text ); TRACE("returning string: %s\n", debugstr_w(buffer)); ret = TRUE; } - *buflen = len - sizeof(WCHAR); + *buflen = len; return ret; - } + default: - { if (attr >= sizeof(attribute_table)/sizeof(attribute_table[0]) || !attribute_table[attr]) { FIXME("attribute %u not implemented\n", attr); @@ -697,7 +692,7 @@ } TRACE("attribute %s\n", debugstr_w(attribute_table[attr])); header_index = get_header_index( request, attribute_table[attr], requested_index, request_only ); - } + break; } if (header_index >= 0) @@ -712,13 +707,13 @@ if (index) *index += 1; if (level & WINHTTP_QUERY_FLAG_NUMBER) { - int *number = buffer; - if (sizeof(int) > *buflen) + if (!buffer || sizeof(int) > *buflen) { set_last_error( ERROR_INSUFFICIENT_BUFFER ); } - else if (number) + else { + int *number = buffer; *number = atoiW( header->value ); TRACE("returning number: %d\n", *number); ret = TRUE; @@ -728,11 +723,11 @@ else if (level & WINHTTP_QUERY_FLAG_SYSTEMTIME) { SYSTEMTIME *st = buffer; - if (sizeof(SYSTEMTIME) > *buflen) + if (!buffer || sizeof(SYSTEMTIME) > *buflen) { set_last_error( ERROR_INSUFFICIENT_BUFFER ); } - else if (st && (ret = WinHttpTimeToSystemTime( header->value, st ))) + else if ((ret = WinHttpTimeToSystemTime( header->value, st ))) { TRACE("returning time: %04d/%02d/%02d - %d - %02d:%02d:%02d.%02d\n", st->wYear, st->wMonth, st->wDay, st->wDayOfWeek, @@ -742,21 +737,19 @@ } else if (header->value) { - WCHAR *string = buffer; - DWORD len = (strlenW( header->value ) + 1) * sizeof(WCHAR); - if (len > *buflen) + len = strlenW( header->value ) * sizeof(WCHAR); + if (!buffer || len + sizeof(WCHAR) > *buflen) { + len += sizeof(WCHAR); set_last_error( ERROR_INSUFFICIENT_BUFFER ); - *buflen = len; - return FALSE; } - else if (string) + else { - strcpyW( string, header->value ); - TRACE("returning string: %s\n", debugstr_w(string)); + strcpyW( buffer, header->value ); + TRACE("returning string: %s\n", debugstr_w(buffer)); ret = TRUE; } - *buflen = len - sizeof(WCHAR); + *buflen = len; } return ret; } diff -Nru wine1.3-1.3.0/dlls/wininet/netconnection.c wine1.3-1.3.1/dlls/wininet/netconnection.c --- wine1.3-1.3.0/dlls/wininet/netconnection.c 2010-07-30 18:43:56.000000000 +0100 +++ wine1.3-1.3.1/dlls/wininet/netconnection.c 2010-08-20 18:23:50.000000000 +0100 @@ -60,6 +60,7 @@ #endif #ifdef HAVE_OPENSSL_SSL_H # include +# include #undef FAR #undef DSA #endif @@ -113,7 +114,11 @@ static void *OpenSSL_ssl_handle; static void *OpenSSL_crypto_handle; +#if defined(OPENSSL_VERSION_NUMBER) && (OPENSSL_VERSION_NUMBER> 0x1000000) +static const SSL_METHOD *meth; +#else static SSL_METHOD *meth; +#endif static SSL_CTX *ctx; static int hostname_idx; static int error_idx; diff -Nru wine1.3-1.3.0/dlls/wininet/wininet_Sv.rc wine1.3-1.3.1/dlls/wininet/wininet_Sv.rc --- wine1.3-1.3.0/dlls/wininet/wininet_Sv.rc 2010-07-30 18:43:56.000000000 +0100 +++ wine1.3-1.3.1/dlls/wininet/wininet_Sv.rc 2010-08-20 18:23:50.000000000 +0100 @@ -28,7 +28,7 @@ LTEXT "Ange ditt anvndarnamn och lsenord:", -1, 40, 6, 150, 15 LTEXT "Proxy", -1, 40, 26, 50, 10 LTEXT "Domn", -1, 40, 46, 50, 10 - LTEXT "Anvndarnamn", -1, 40, 66, 50, 10 + LTEXT "Anvndare", -1, 40, 66, 50, 10 LTEXT "Lsenord", -1, 40, 86, 50, 10 LTEXT "" IDC_PROXY, 80, 26, 150, 14, 0 LTEXT "" IDC_REALM, 80, 46, 150, 14, 0 @@ -40,6 +40,26 @@ PUSHBUTTON "Avbryt", IDCANCEL, 158, 126, 56, 14, WS_GROUP | WS_TABSTOP } +IDD_AUTHDLG DIALOG 36, 24, 250, 154 +STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU +CAPTION "Autentisering krvs" +FONT 8, "MS Shell Dlg" +{ + LTEXT "Ange ditt anvndarnamn och lsenord:", -1, 40, 6, 150, 15 + LTEXT "Server", -1, 40, 26, 50, 10 + LTEXT "Domn", -1, 40, 46, 50, 10 + LTEXT "Anvndare", -1, 40, 66, 50, 10 + LTEXT "Lsenord", -1, 40, 86, 50, 10 + LTEXT "" IDC_SERVER, 80, 26, 150, 14, 0 + LTEXT "" IDC_REALM, 80, 46, 150, 14, 0 + EDITTEXT IDC_USERNAME, 80, 66, 150, 14, ES_AUTOHSCROLL | WS_BORDER | WS_TABSTOP + EDITTEXT IDC_PASSWORD, 80, 86, 150, 14, ES_AUTOHSCROLL | WS_BORDER | WS_TABSTOP | ES_PASSWORD + CHECKBOX "&Spara detta lsenord (oskert)", IDC_SAVEPASSWORD, + 80, 106, 150, 12, BS_AUTOCHECKBOX | WS_GROUP | WS_TABSTOP + PUSHBUTTON "OK", IDOK, 98, 126, 56, 14, WS_GROUP | WS_TABSTOP | BS_DEFPUSHBUTTON + PUSHBUTTON "Avbryt", IDCANCEL, 158, 126, 56, 14, WS_GROUP | WS_TABSTOP +} + STRINGTABLE { IDS_LANCONNECTION "LAN-anslutning" diff -Nru wine1.3-1.3.0/dlls/winmm/time.c wine1.3-1.3.1/dlls/winmm/time.c --- wine1.3-1.3.0/dlls/winmm/time.c 2010-07-30 18:43:56.000000000 +0100 +++ wine1.3-1.3.1/dlls/winmm/time.c 2010-08-20 18:23:50.000000000 +0100 @@ -243,16 +243,19 @@ static void TIME_MMTimeStart(void) { TIME_TimeToDie = 0; - if (!TIME_hMMTimer) { - HMODULE mod; - if (pipe(TIME_fdWake) < 0) - { + + if (TIME_fdWake[0] < 0) { + if (pipe(TIME_fdWake) < 0) { TIME_fdWake[0] = TIME_fdWake[1] = -1; ERR("Cannot create pipe: %s\n", strerror(errno)); } else { fcntl(TIME_fdWake[0], F_SETFL, O_NONBLOCK); fcntl(TIME_fdWake[1], F_SETFL, O_NONBLOCK); } + } + + if (!TIME_hMMTimer) { + HMODULE mod; GetModuleHandleExW(GET_MODULE_HANDLE_EX_FLAG_FROM_ADDRESS, (LPCWSTR)TIME_MMSysTimeThread, &mod); TIME_hMMTimer = CreateThread(NULL, 0, TIME_MMSysTimeThread, mod, 0, NULL); SetThreadPriority(TIME_hMMTimer, THREAD_PRIORITY_TIME_CRITICAL); diff -Nru wine1.3-1.3.0/dlls/winmm/winmm_En.rc wine1.3-1.3.1/dlls/winmm/winmm_En.rc --- wine1.3-1.3.0/dlls/winmm/winmm_En.rc 2010-07-30 18:43:56.000000000 +0100 +++ wine1.3-1.3.1/dlls/winmm/winmm_En.rc 2010-08-20 18:23:50.000000000 +0100 @@ -121,7 +121,7 @@ MCIERR_FILE_WRITE, "Cannot write to the specified file. Make sure you have enough disk space or are still connected to the network." MCIERR_SEQ_DIV_INCOMPATIBLE, "The time formats of the ""song pointer"" and SMPTE are mutually exclusive. You can't use them together." MCIERR_SEQ_NOMIDIPRESENT, "The system has no installed MIDI devices. Use the Drivers option from the Control Panel to install a MIDI driver." -MCIERR_SEQ_PORT_INUSE, "The specified MIDI port is already in use. Wait until it is free; the try again." +MCIERR_SEQ_PORT_INUSE, "The specified MIDI port is already in use. Wait until it is free; then try again." MCIERR_SEQ_PORT_MAPNODEVICE, "The current MIDI Mapper setup refers to a MIDI device that is not installed on the system. Use the MIDI Mapper option from the Control Panel to edit the setup." MCIERR_SEQ_PORT_MISCERROR, "An error occurred with the specified port." MCIERR_SEQ_PORT_NONEXISTENT, "The specified MIDI device is not installed on the system. Use the Drivers option from the Control Panel to install a MIDI device." diff -Nru wine1.3-1.3.0/dlls/winmm/winmm_Ko.rc wine1.3-1.3.1/dlls/winmm/winmm_Ko.rc --- wine1.3-1.3.0/dlls/winmm/winmm_Ko.rc 2010-07-30 18:43:56.000000000 +0100 +++ wine1.3-1.3.1/dlls/winmm/winmm_Ko.rc 2010-08-20 18:23:50.000000000 +0100 @@ -20,113 +20,115 @@ #include "windef.h" #include "mmddk.h" +#pragma code_page(65001) + LANGUAGE LANG_KOREAN, SUBLANG_DEFAULT STRINGTABLE BEGIN /* MMSYS errors */ -MMSYSERR_NOERROR, " Ǿϴ." -MMSYSERR_ERROR, "˼ ܺ ." -MMSYSERR_BADDEVICEID, " ġID ý ۿ ǰ ֽϴ." -MMSYSERR_NOTENABLED, " ̹ ʽϴ." -MMSYSERR_ALLOCATED, " ġ ̹ Դϴ.Ӱ ɶ ٸ ٽ õϽʽÿ." -MMSYSERR_INVALHANDLE, " ġ ڵ ʽϴ." -MMSYSERR_NODRIVER, " ýۿ  ̹ ġǾ ʽϴ !\n" -MMSYSERR_NOMEM, " ۾ ޸𸮰 ϴ.ϳ Ǯ׸ Ƽ ޸𸮸 ø ٽ õϽʽÿ." -MMSYSERR_NOTSUPPORTED, " ʽϴ. ̹ ϴ ޼ Լ ִ Լ Ͻʽÿ." -MMSYSERR_BADERRNUM, " ѹ ýۿ ǵ ʾҽϴ." -MMSYSERR_INVALFLAG, "߸ ÷״ ý Լ ߽ϴ." -MMSYSERR_INVALPARAM, "߸ Ű ý Լ ߽ϴ." +MMSYSERR_NOERROR, "지정된 명령이 실행되었습니다." +MMSYSERR_ERROR, "알수 없는 외부 에러." +MMSYSERR_BADDEVICEID, "이 장치ID는 당신의 시스템 범위 밖에서 사용되고 있습니다." +MMSYSERR_NOTENABLED, "이 드라이버는 가능하지 않습니다." +MMSYSERR_ALLOCATED, "지정된 장치는 이미 사용중입니다.자유롭게 될때까지 기다리고 다시 시도하십시오." +MMSYSERR_INVALHANDLE, "지정된 장치 핸들은 적합하지 않습니다." +MMSYSERR_NODRIVER, "당신의 시스템에는 어떤 드라이버도 설치되어 있지 않습니다 !\n" +MMSYSERR_NOMEM, "이 작업을 위한 충분한 메모리가 없습니다.하나나더 많은 풀그림을 끝내아서 메모리를 늘리고 다시 시도하십시오." +MMSYSERR_NOTSUPPORTED, "이 기능은 지원되지 않습니다. 드라이버가 지원하는 메세지와 함수들을 결정할 수 있는 함수를 사용하십시오." +MMSYSERR_BADERRNUM, "이 에러 넘버는 시스템에서 정의되지 않았습니다." +MMSYSERR_INVALFLAG, "잘못된 플래그는 시스템 함수에서 무시했습니다." +MMSYSERR_INVALPARAM, "잘못된 매개변수는 시스템 함수에서 무시했습니다." /* WAVE errors */ -WAVERR_BADFORMAT, " ʰų ϴ. ϴ ϴ Լ Ͻʽÿ" -WAVERR_STILLPLAYING, "̵ Ÿ Ǵ ۾ ϴ. ġ ϰų, Ÿ ٸʽÿ." -WAVERR_UNPREPARED, "̺ غ ʾҽϴ. غϱ غ Լ Ͻʽÿ, ׸ ٽ õϽʽÿ." -WAVERR_SYNC, " WAVE_ALLOWSYNC ÷׸ ʰ ġ ϴ. ÷׸ ؼ ٽ õϽʽÿ." +WAVERR_BADFORMAT, "지정된 형식은 지원하지 않거나 전송할 수 없습니다. 지원하는 형식을 결정하는 가능한 함수를 사용하십시오" +WAVERR_STILLPLAYING, "미디어 데이타가 재생되는 동안 이 작업을 실행 할 수 없습니다. 장치를 리셋하거나, 데이타 재생이 끝날때까지 기다리십시오." +WAVERR_UNPREPARED, "웨이브 헤더는 준비되지 않았습니다. 헤더를 준비하기 위해 준비된 함수를 사용하십시오, 그리고 다시 시도하십시오." +WAVERR_SYNC, " WAVE_ALLOWSYNC 플래그를 사용하지 않고 장치를 열 수 없습니다. 이 플래그를 사용해서 다시 시도하십시오." /* MIDI errors */ -MIDIERR_UNPREPARED, "MIDI غ ʾҽϴ. غŰ غ Լ Ͻʽÿ, ׸ ٽ õϽʽÿn." -MIDIERR_STILLPLAYING, "̵ Ÿ Ǵ ۾ ϴ. ġ ϰų, Ÿ ٸʽÿ." -MIDIERR_NOMAP, "MIDI ã ϴ. ̹ ̰ų, MIDIMAP.CFG ų ֽϴ." -MIDIERR_NOTREADY, " Ʈ ġ Ÿ ű Դϴ. Ÿ Ű ٸʽÿ,׸ ٽ õϽʽÿ" -MIDIERR_NODEVICE, "MIDI ġ ϴ MIDI Mapper ýۿ ġǾ ʽϴ. MIDI Mapper ؼ ġʽÿ." -MIDIERR_INVALIDSETUP, " MIDI ջǾϴ. MIDIMAP.CFG SYSTEM 丮 ϰ, ٽ õϽʽÿ." +MIDIERR_UNPREPARED, "MIDI 헤더는 준비되지 않았습니다. 헤더를 준비시키기 위해 준비 함수를 사용하십시오, 그리고 다시 시도하십시오n." +MIDIERR_STILLPLAYING, "미디어 데이타가 재생되는 동안 이 작업을 실행 할 수 없습니다. 장치를 리셋하거나, 데이타 재생이 끝날때까지 기다리십시오." +MIDIERR_NOMAP, "MIDI 맵은 찾을 수 없습니다. 드라이버의 문제이거나, MIDIMAP.CFG 파일이 망가졌거나 없는 문제일 수도 있습니다." +MIDIERR_NOTREADY, "이 포트는 장치로 데이타를 옮기는 중입니다. 데이타가 다 옮겨질 때까지 기다리십시오,그리고 다시 시도하십시오" +MIDIERR_NODEVICE, "MIDI 장치를 지원하는 MIDI Mapper 설정은 시스템에 설치되어 있지 않습니다. MIDI Mapper 를 사용해서 설정을 고치십시오." +MIDIERR_INVALIDSETUP, "현재 MIDI 설정은 손상되었습니다. 본래 MIDIMAP.CFG 파일을 윈도우즈 SYSTEM 디렉토리에 복사하고, 다시 시도하십시오." /* MCI errors */ -MCIERR_INVALID_DEVICE_ID, "߸ MCI ġ ID. MCI ġ ȯ ID Ͻʽÿ." -MCIERR_UNRECOGNIZED_KEYWORD, " ̹ Ű ν ϴ." -MCIERR_UNRECOGNIZED_COMMAND, " ̹ ν ϴ." -MCIERR_HARDWARE, "̰ ̵ ġ Դϴ. ݵ ùٸ ۵Ѵٰ ȮѴٸ ġ ڿ Ͻʽÿ" -MCIERR_INVALID_DEVICE_NAME, " ġ ų MCI ν ϴ." -MCIERR_OUT_OF_MEMORY, " ۾ ޸𸮰 ϴ.\nϳ Ǯ׸ Ѽ ޸𸮸 Űÿ, ׸ ٽ õϽÿ." -MCIERR_DEVICE_OPEN, " ġ ̸ ̹ ٸ Ǯ׸ Դϴ. Ͻʽÿ." -MCIERR_CANNOT_LOAD_DRIVER, " ġ ̹ ҷ ߿ ֽϴ." -MCIERR_MISSING_COMMAND_STRING, " ɵ ǵ ʾҽϴ." -MCIERR_PARAM_OVERFLOW, " ڿ ȯ ۿ ä⿡ ʹ Ůϴ. ũ⸦ Űʽÿ." -MCIERR_MISSING_STRING_ARGUMENT, " ij-ڿ Ű 䱸մϴ. ֽʽÿ." -MCIERR_BAD_INTEGER, " ɿ ʽϴ." -MCIERR_PARSER_INTERNAL, " ġ ̹ ߸ ȯ ȯϿϴ. ġ ڿԼ ̹ ִ üũϽʽÿ." -MCIERR_DRIVER_INTERNAL, "̰ ġ ̹ Դϴ. ġ ڿԼ ̹ ִ üũϽʽÿ." -MCIERR_MISSING_PARAMETER, " Ű 䱸մϴ. Ű ߰Ͻʽÿ." -MCIERR_UNSUPPORTED_FUNCTION, " MCI ġ ʽϴ." -MCIERR_FILE_NOT_FOUND, " ã ϴ.ο ̸ ùٸ ȮϽʽÿ." -MCIERR_DEVICE_NOT_READY, "ġ ̹ غ ʾҽϴ." -MCIERR_INTERNAL, "MCI ʱȭ ߻߽ϴ. 츦 ϰ õغ." -MCIERR_DRIVER, "̰ ġ ̹ Դϴ. ̹ ϴ. ϴ." -MCIERR_CANNOT_USE_ALL, " ġ ̸ 'all' ϴ." -MCIERR_MULTIPLE, "ϳ ġ ߻. ġ ߻Ű ó Ҽ ֵ ġ Ͻʽÿ." -MCIERR_EXTENSION_NOT_FOUND, "־ Ȯڷ ġ Ÿ ϴ." -MCIERR_OUTOFRANGE, " Ű ۿ ֽϴ." -MCIERR_FLAGS_NOT_COMPATIBLE, " Ű Բ ϴ." -MCIERR_FILE_NOT_SAVED, " ϴ. ִ Ȯϰų.Ʈũ Ǿִ Ȯϼ." -MCIERR_DEVICE_TYPE_REQUIRED, " ġ ã ϴ.̰ ġȰ Ȯϴٸ ġ̸ ùٸ ȮϽʽÿ." -MCIERR_DEVICE_LOCKED, " ġ ϴ. ٸ Ŀ ٽ õϽʽÿ." -MCIERR_DUPLICATE_ALIAS, " ̹ α׷ Դϴ. ߺ ʴ Ͻʽÿ." -MCIERR_BAD_CONSTANT, " Ű ɿ ʽϴ." -MCIERR_MUST_USE_SHAREABLE, " ġ ̹ ̹ Դϴ. ̰ Ϸ, 'shareable' Ű 'open'ɰ Ͻʽÿ." -MCIERR_MISSING_DEVICE_NAME, " ,,̹ ġ ̸ ʿ մϴ. ̰ Ͻʽÿ." -MCIERR_BAD_TIME_FORMAT, "ð Ŀ ùٸ ʽϴ. MCI ùٸ ȮϽʽÿ." -MCIERR_NO_CLOSING_QUOTE, "Ű ǥ ϳ ϴ. ̰ Ͻʽÿ." -MCIERR_DUPLICATE_FLAGS, " Ű ι Ǿϴ. ϳ Ͻʽÿ" -MCIERR_INVALID_FILE, " MCIġ ϴ. ų ùٸ Դϴ." -MCIERR_NULL_PARAMETER_BLOCK, " Ű MCI õǾϴ." -MCIERR_UNNAMED_RESOURCE, "̸ ϴ. ̸ Ͻʽÿ." -MCIERR_NEW_REQUIRES_ALIAS, " 'ݵ new'Ű ־ մϴ." -MCIERR_NOTIFY_ON_AUTO_OPEN, "'notify' ÷״ ڵ ġ ϴ." -MCIERR_NO_ELEMENT_ALLOWED, " ġϰ ̸ ϴ." -MCIERR_NONAPPLICABLE_FUNCTION, " ϴ. ġ ٽ õϽʽÿ." -MCIERR_ILLEGAL_FOR_AUTO_OPEN, " ڵ ġ ϴ. ġ ⸦ ٸ ٽ õϽʽÿ." -MCIERR_FILENAME_REQUIRED, " ̸ ùٸ ʽϴ. ̸ Ȯڸ ؼ 8ں ȮϽʽÿ." -MCIERR_EXTRA_CHARACTERS, "οȣ ѷ ڿ ߰ ڸ ϴ." -MCIERR_DEVICE_NOT_INSTALLED, " ġ ýۿ ġǾ ʽϴ. ǿ ̹ ɼ ؼ ġ ġϽʽÿ." -MCIERR_GET_CD, " ̳ MCI ġ ϴ. 丮 ٲٰų ǻ͸ Ͻʽÿ." -MCIERR_SET_CD, "Ǯ׸ 丮 ٲ Ư ̳ MCIġ ϴ." -MCIERR_SET_DRIVE, "Ǯ׸ 丮 ٲ ̳ MCIġ ϴ." -MCIERR_DEVICE_LENGTH, "79ں ġ ̹ ̸ Ͻʽÿ." -MCIERR_DEVICE_ORD_LENGTH, "69ں ġ ̹ ̸ Ͻʽÿ." -MCIERR_NO_INTEGER, " Ű 䱸մϴ. ̰ Ͻʽÿ." -MCIERR_WAVE_OUTPUTSINUSE, " ϴ ̺ ġ Դϴ. ̺ ġ Ӱ ٽ õϽʽÿ." -MCIERR_WAVE_SETOUTPUTINUSE, "̹Ƿ ̺ ġ ÷ ϴ. ġ Ӱ ɶ ٸ, ٽ õϽʽÿ." -MCIERR_WAVE_INPUTSINUSE, " ϴ ̺ ġ Դϴ. ̺ ġ Ӱ ٽ õϽʽÿ." -MCIERR_WAVE_SETINPUTINUSE, "̹Ƿ ̺ ġ ϴ. ġ Ӱ ɶ ٸ, ٽ õϽʽÿ." -MCIERR_WAVE_OUTPUTUNSPECIFIED, " ȣȯ ִ ̺ ÷̹ ġ ɼ ֽϴ." -MCIERR_WAVE_INPUTUNSPECIFIED, " ȣȯ ִ ̺ ġ ɼ ֽϴ." -MCIERR_WAVE_OUTPUTSUNSUITABLE, " ִ  ̺ ġ ϴ. ̹ ɼǿ ̺ ġ ġϽʽÿ." -MCIERR_WAVE_SETOUTPUTUNSUITABLE," Ϸ ġ ν ϴ." -MCIERR_WAVE_INPUTSUNSUITABLE, " ִ  ̺ ġ ϴ. ̹ ɼǿ ̺ ġ ġϽʽÿ." -MCIERR_WAVE_SETINPUTUNSUITABLE, " Ϸ ġ ν ϴ." -MCIERR_NO_WINDOW, " ÷ â ϴ." -MCIERR_CREATEWINDOW, "â ϰų ϴ." -MCIERR_FILE_READ, " ϴ. ϴ Ȯϰų, ũ ƮƮ Ḧ üũغʽÿ." -MCIERR_FILE_WRITE, " Ͽ ϴ. ũ Ȯϰų. Ʈũ ȮϽʽÿ" -MCIERR_SEQ_DIV_INCOMPATIBLE, " ""song pointer"" ð ϰ SMPTE ŸԴϴ. ̰͵ ϴ." -MCIERR_SEQ_NOMIDIPRESENT, " ýۿ ġ MIDI ġ ϴ. ġ ɼǿMIDI ̹ ġϽʽÿ." -MCIERR_SEQ_PORT_INUSE, " MIDI Ʈ ̹ Դϴ.Ӱ ٸ ٽ õϽʽÿ." -MCIERR_SEQ_PORT_MAPNODEVICE, "MIDI õ MIDI Mapper ýۿ ġǾ ʽϴ. MIDI Mapper ɼ ؼ ġʽÿ." -MCIERR_SEQ_PORT_MISCERROR, " Ʈ ߻߽ϴ." -MCIERR_SEQ_PORT_NONEXISTENT, " MIDI ġ ýۿ ġǾ ʽϴ. ǿ ġ ɼ ؼ MIDI ġ ġϽʽÿ." -MCIERR_SEQ_PORTUNSPECIFIED, " ý ŵ MIDIƮ ʽϴ." -MCIERR_SEQ_TIMER, " Ƽ̵ Ÿ̸Ӵ ٸ Ǯ׸ Դϴ. ּ ϳ Ǯ׸ ٽ õϽʽÿ." +MCIERR_INVALID_DEVICE_ID, "잘못된 MCI 장치 ID. MCI 장치를 열 때 반환한 ID를 사용하십시오." +MCIERR_UNRECOGNIZED_KEYWORD, "이 드라이버는 지정된 명령 매개변수를 인식할 수 없습니다." +MCIERR_UNRECOGNIZED_COMMAND, "이 드라이버는 지정된 명령을 인식할 수 없습니다." +MCIERR_HARDWARE, "이것은 당신의 미디어 장치 문제입니다. 반드시 올바르게 작동한다고 확신한다면 장치 제조자에게 연락하십시오" +MCIERR_INVALID_DEVICE_NAME, "지정된 장치는 열수 없거나 MCI에서 인식 할 수 없습니다." +MCIERR_OUT_OF_MEMORY, "이 작업을 위한 충분한 메모리가 없습니다.\n하나나 더 많은 풀그림을 종료시켜서 가능한 메모리를 증가시키시오, 그리고 다시 시도하시오." +MCIERR_DEVICE_OPEN, "이 장치 이름은 이미 다른 풀그림에서 별명으로 사용중입니다. 유일한 별명을 사용하십시오." +MCIERR_CANNOT_LOAD_DRIVER, "이 지정된 장치 드라이버를 불러오는 중에 감지되지 않은 에러가 있습니다." +MCIERR_MISSING_COMMAND_STRING, "어떤 명령도 정의되지 않았습니다." +MCIERR_PARAM_OVERFLOW, "출력 문자열은 반환 버퍼에 채우기에는 너무 큽니다. 버퍼 크기를 증가시키십시오." +MCIERR_MISSING_STRING_ARGUMENT, "지정된 명령은 캐릭터-문자열 매개변수를 요구합니다. 지정해 주십시오." +MCIERR_BAD_INTEGER, "지정된 정수는 이 명령에 적합하지 않습니다." +MCIERR_PARSER_INTERNAL, "이 장치 드라이버는 잘못된 반환 값을 반환하였습니다. 장치 제조자에게서 새 드라이버를 얻을수 있는지 체크하십시오." +MCIERR_DRIVER_INTERNAL, "이것은 장치 드라이버 문제입니다. 장치 제조자에게서 새 드라이버를 얻을수 있는지 체크하십시오." +MCIERR_MISSING_PARAMETER, "지정된 명령은 매개변수를 요구합니다. 매개변수를 추가하십시오." +MCIERR_UNSUPPORTED_FUNCTION, "당신이 사용한 MCI 장치는 지정된 명령을 지원하지 않습니다." +MCIERR_FILE_NOT_FOUND, "지정된 파일을 찾을 수 없습니다.경로와 파일이름이 올바른지 확인하십시오." +MCIERR_DEVICE_NOT_READY, "장치 드라이버는 준비되지 않았습니다." +MCIERR_INTERNAL, "MCI 초기화시 문제가 발생했습니다. 윈도우를 재시작하고 시도해보세요." +MCIERR_DRIVER, "이것은 장치 드라이버 문제입니다. 드라이버가 닫혔습니다. 에러에 접근 할 수 없습니다." +MCIERR_CANNOT_USE_ALL, "지정된 명령의 장치 이름으로 'all'은 사용할 수 없습니다." +MCIERR_MULTIPLE, "하나나 더 많은 장치에서 에러 발생. 장치가 발생시키는 에러를 처리 할수 있도록 각가의 장치에 명령을 지정하십시오." +MCIERR_EXTENSION_NOT_FOUND, "주어진 파일 확장자로 장치 타입을 결정할 수 없습니다." +MCIERR_OUTOFRANGE, "지정된 매개변수는 지정된 명령 범위 밖에 있습니다." +MCIERR_FLAGS_NOT_COMPATIBLE, "지정된 매개변수는 함께 사용할 수 없습니다." +MCIERR_FILE_NOT_SAVED, "지정된 파일을 저장할 수 없습니다. 충분한 공간이 있는지 확인하거나.내트워크가 연결되어있는지 확인하세요." +MCIERR_DEVICE_TYPE_REQUIRED, "지정된 장치를 찾을 수 없습니다.이것이 설치된게 확실하다면 장치이름이 올바른지 확인하십시오." +MCIERR_DEVICE_LOCKED, "지정된 장치는 지금 닫혔습니다. 잠시 기다린 후에 다시 시도하십시오." +MCIERR_DUPLICATE_ALIAS, "지정된 별명은 이미 프로그램에 의해 사용중입니다. 중복되지 않는 별명을 사용하십시오." +MCIERR_BAD_CONSTANT, "지정된 매개변수는 이 명령에 적합하지 않습니다." +MCIERR_MUST_USE_SHAREABLE, "이 장치 드라이버는 이미 사용중입니다. 이것을 공유하려면, 'shareable' 매개변수를 'open'명령과 같이 사용하십시오." +MCIERR_MISSING_DEVICE_NAME, "지정된 명령은 별명,파일,드라이버나 장치 이름을 필요로 합니다. 이것을 지정하십시오." +MCIERR_BAD_TIME_FORMAT, "시간 형식에 지정된 값은 올바르지 않습니다. MCI 문서에서 올바를 형식을 확인하십시오." +MCIERR_NO_CLOSING_QUOTE, "매개변수 값에서 닫힌 쌍 따옴표 하나가 빠졌습니다. 이것을 지정하십시오." +MCIERR_DUPLICATE_FLAGS, "이 값의 매개변수는 두번 지정되었습니다. 오직 하나만 지정하십시오" +MCIERR_INVALID_FILE, "이 지정된 파일은 지정된 MCI장치에서 재생 할 수 없습니다. 이 파일이 깨졌거나 올바르지 않은 형식입니다." +MCIERR_NULL_PARAMETER_BLOCK, "이 빈 매개변수 블럭은 MCI에서 무시되었습니다." +MCIERR_UNNAMED_RESOURCE, "이름없는 파일을 저장할 수 없습니다. 파일 이름을 지정하십시오." +MCIERR_NEW_REQUIRES_ALIAS, " '반드시 new'매개변수를 사용할 별명을 지정해주어야 합니다." +MCIERR_NOTIFY_ON_AUTO_OPEN, "'notify' 플래그는 자동으로 열린 장치에 사용할 수 없습니다." +MCIERR_NO_ELEMENT_ALLOWED, "지정된 장치하고 파일이름은 같이 사용할 수 없습니다." +MCIERR_NONAPPLICABLE_FUNCTION, "명령을 지정된 순서대로 보낼 수 없습니다. 명령 순서를 고치고 다시 시도하십시오." +MCIERR_ILLEGAL_FOR_AUTO_OPEN, "지정된 명령을 자동으로 열린 장치에 보낼 수 없습니다. 장치가 닫히기를 기다리고 다시 시도하십시오." +MCIERR_FILENAME_REQUIRED, "이 파일이름은 올바르지 않습니다. 파일이름이 점과 확장자를 더해서 8자보다 길지 않은지 확인하십시오." +MCIERR_EXTRA_CHARACTERS, "인용부호로 둘러 싼 문자 뒤에 추가 문자를 지정 할 수 없습니다." +MCIERR_DEVICE_NOT_INSTALLED, "지정된 장치는 시스템에 설치되어 있지 않습니다. 제어판에서 드라이버 옵션을 사용해서 장치를 설치하십시오." +MCIERR_GET_CD, "지정된 파일이나 MCI 장치에 접근할 수 없습니다. 디렉토리를 바꾸거나 컴퓨터를 재시작하십시오." +MCIERR_SET_CD, "풀그림이 디렉토리를 바꿀 수 없기 때문에 지정된 특정한 파일이나 MCI장치에 접근할 수 없습니다." +MCIERR_SET_DRIVE, "풀그림이 디렉토리를 바꿀 수 없기 때문에 지정한 파일이나 MCI장치에 접근할 수 없습니다." +MCIERR_DEVICE_LENGTH, "79자보다 적게 장치나 드라이버 이름을 지정하십시오." +MCIERR_DEVICE_ORD_LENGTH, "69자보다 적게 장치나 드라이버 이름을 지정하십시오." +MCIERR_NO_INTEGER, "지정된 명령은 정수 매개 변수를 요구합니다. 이것을 지정하십시오." +MCIERR_WAVE_OUTPUTSINUSE, "현재 형식의 파일을 재생하는 모든 웨이브 장치는 사용중입니다. 웨이브 장치가 자유롭게 될 때 다시 시도하십시오." +MCIERR_WAVE_SETOUTPUTINUSE, "사용중이므로 현재 웨이브 장치를 플레이 백으로 설정 할 수 없습니다. 장치가 자유롭게 될때까지 기다리고, 다시 시도하십시오." +MCIERR_WAVE_INPUTSINUSE, "현재 형식의 파일을 녹음하는 모든 웨이브 장치는 사용중입니다. 웨이브 장치가 자유롭게 될 때 다시 시도하십시오." +MCIERR_WAVE_SETINPUTINUSE, "사용중이므로 현재 웨이브 장치를 녹음으로 설정 할 수 없습니다. 장치가 자유롭게 될때까지 기다리고, 다시 시도하십시오." +MCIERR_WAVE_OUTPUTUNSPECIFIED, "어떤 호환성이 있는 웨이브폼 플레이백 장치도 사용될수 있습니다." +MCIERR_WAVE_INPUTUNSPECIFIED, "어떤 호환성이 있는 웨이브폼 녹음 장치도 사용될수 있습니다." +MCIERR_WAVE_OUTPUTSUNSUITABLE, "현재 형식의 파일을 재생할 수 있는 어떤 웨이브 장치도 없습니다. 드라이버 옵션에서 웨이브 장치를 설치하십시오." +MCIERR_WAVE_SETOUTPUTUNSUITABLE,"당신이 재생하려는 장치는 현재 파일 형식을 인식 할 수 없습니다." +MCIERR_WAVE_INPUTSUNSUITABLE, "현재 형식의 파일을 녹음할 수 있는 어떤 웨이브 장치도 없습니다. 드라이버 옵션에서 웨이브 장치를 설치하십시오." +MCIERR_WAVE_SETINPUTUNSUITABLE, "당신이 녹음하려는 장치는 현재 파일 형식을 인식할 수 없습니다." +MCIERR_NO_WINDOW, "어떤 디스플레이 창도 없습니다." +MCIERR_CREATEWINDOW, "창을 사용하거나 만들 수 없습니다." +MCIERR_FILE_READ, "지정된 파일을 읽을 수 없습니다. 파일이 존재하는지 확인하거나,당신의 디스크나 네트워트 연결를 체크해보십시오." +MCIERR_FILE_WRITE, "지정된 파일에 기록할 수 없습니다. 디스크 공간이 충분한지 확인하거나. 네트워크에 연결중인지 확인하십시오" +MCIERR_SEQ_DIV_INCOMPATIBLE, " ""song pointer""의 시간 형식하고 SMPTE 는 서로 배타적입니다. 이것들을 같이 사용할 수 없습니다." +MCIERR_SEQ_NOMIDIPRESENT, "이 시스템에는 설치된 MIDI 장치가 없습니다. 제어판의 장치 옵션에서MIDI 드라이버를 설치하십시오." +MCIERR_SEQ_PORT_INUSE, "지정된 MIDI 포트는 이미 사용중입니다.자유롭게 될 때까지 기다리고 다시 시도하십시오." +MCIERR_SEQ_PORT_MAPNODEVICE, "MIDI 정차에 관련된 MIDI Mapper 설정은 시스템에 설치되어있지 않습니다. 제어판의 MIDI Mapper 옵션을 사용해서 설정을 고치십시오." +MCIERR_SEQ_PORT_MISCERROR, "지정된 포트에 에러가 발생했습니다." +MCIERR_SEQ_PORT_NONEXISTENT, "지정된 MIDI 장치는 시스템에 설치되어 있지 않습니다. 제어판에서 장치 옵션을 사용해서 MIDI 장치를 설치하십시오." +MCIERR_SEQ_PORTUNSPECIFIED, "이 시스템은 현재 열거된 MIDI포트를 가지고 있지 않습니다." +MCIERR_SEQ_TIMER, "모든 멀티미디어 타이머는 다른 풀그림에 의해 사용중입니다. 최소한 하나의 풀그림을 끝내고 다시 시도하십시오." END diff -Nru wine1.3-1.3.0/dlls/winmm/winmm_Sk.rc wine1.3-1.3.1/dlls/winmm/winmm_Sk.rc --- wine1.3-1.3.0/dlls/winmm/winmm_Sk.rc 2010-07-30 18:43:56.000000000 +0100 +++ wine1.3-1.3.1/dlls/winmm/winmm_Sk.rc 2010-08-20 18:23:50.000000000 +0100 @@ -121,7 +121,7 @@ MCIERR_FILE_WRITE, "Cannot write to the specified file. Make sure you have enough disk space or are still connected to the network." MCIERR_SEQ_DIV_INCOMPATIBLE, "The time formats of the ""song pointer"" and SMPTE are mutually exclusive. You can't use them together." MCIERR_SEQ_NOMIDIPRESENT, "The system has no installed MIDI devices. Use the Drivers option from the Control Panel to install a MIDI driver." -MCIERR_SEQ_PORT_INUSE, "The specified MIDI port is already in use. Wait until it is free; the try again." +MCIERR_SEQ_PORT_INUSE, "The specified MIDI port is already in use. Wait until it is free; then try again." MCIERR_SEQ_PORT_MAPNODEVICE, "The current MIDI Mapper setup refers to a MIDI device that is not installed on the system. Use the MIDI Mapper option from the Control Panel to edit the setup." MCIERR_SEQ_PORT_MISCERROR, "An error occurred with the specified port." MCIERR_SEQ_PORT_NONEXISTENT, "The specified MIDI device is not installed on the system. Use the Drivers option from the Control Panel to install a MIDI device." diff -Nru wine1.3-1.3.0/dlls/winspool.drv/info.c wine1.3-1.3.1/dlls/winspool.drv/info.c --- wine1.3-1.3.0/dlls/winspool.drv/info.c 2010-07-30 18:43:56.000000000 +0100 +++ wine1.3-1.3.1/dlls/winspool.drv/info.c 2010-08-20 18:23:50.000000000 +0100 @@ -6,7 +6,7 @@ * Copyright 1999 Klaas van Gend * Copyright 1999, 2000 Huw D M Davies * Copyright 2001 Marcus Meissner - * Copyright 2005-2009 Detlef Riekenberg + * Copyright 2005-2010 Detlef Riekenberg * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public @@ -97,6 +97,7 @@ struct list entry; DWORD job_id; WCHAR *filename; + WCHAR *portname; WCHAR *document_title; } job_t; @@ -325,6 +326,15 @@ } /****************************************************************** + * verify, that the filename is a local file + * + */ +static inline BOOL is_local_file(LPWSTR name) +{ + return (name[0] && (name[1] == ':') && (name[2] == '\\')); +} + +/****************************************************************** * Return the number of bytes for an multi_sz string. * The result includes all \0s * (specifically the extra \0, that is needed as multi_sz terminator). @@ -2975,6 +2985,7 @@ DWORD needed, ret = 0; HANDLE hf; WCHAR *filename; + job_t *job; TRACE("(hPrinter = %p, Level = %d, pDocInfo = %p {pDocName = %s, pOutputFile = %s, pDatatype = %s}):\n", hPrinter, Level, doc, debugstr_w(doc->pDocName), debugstr_w(doc->pOutputFile), @@ -3009,7 +3020,8 @@ goto end; } - if(doc->pOutputFile) + /* use pOutputFile only, when it is a real filename */ + if ((doc->pOutputFile) && is_local_file(doc->pOutputFile)) filename = doc->pOutputFile; else filename = addjob->Path; @@ -3025,6 +3037,9 @@ printer->doc = HeapAlloc(GetProcessHeap(), 0, sizeof(*printer->doc)); printer->doc->hf = hf; ret = printer->doc->job_id = addjob->JobId; + job = get_job(hPrinter, ret); + job->portname = strdupW(doc->pOutputFile); + end: LeaveCriticalSection(&printer_handles_cs); @@ -7465,18 +7480,23 @@ hf = CreateFileW(job->filename, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, 0, NULL); if(hf != INVALID_HANDLE_VALUE) { - PRINTER_INFO_5W *pi5; + PRINTER_INFO_5W *pi5 = NULL; + LPWSTR portname = job->portname; DWORD needed; HKEY hkey; WCHAR output[1024]; static const WCHAR spooler_key[] = {'S','o','f','t','w','a','r','e','\\','W','i','n','e','\\', 'P','r','i','n','t','i','n','g','\\','S','p','o','o','l','e','r',0}; - GetPrinterW(hPrinter, 5, NULL, 0, &needed); - pi5 = HeapAlloc(GetProcessHeap(), 0, needed); - GetPrinterW(hPrinter, 5, (LPBYTE)pi5, needed, &needed); + if (!portname) + { + GetPrinterW(hPrinter, 5, NULL, 0, &needed); + pi5 = HeapAlloc(GetProcessHeap(), 0, needed); + GetPrinterW(hPrinter, 5, (LPBYTE)pi5, needed, &needed); + portname = pi5->pPortName; + } TRACE("need to schedule job %d filename %s to port %s\n", job->job_id, debugstr_w(job->filename), - debugstr_w(pi5->pPortName)); + debugstr_w(portname)); output[0] = 0; @@ -7484,7 +7504,7 @@ if(RegOpenKeyW(HKEY_CURRENT_USER, spooler_key, &hkey) == ERROR_SUCCESS) { DWORD type, count = sizeof(output); - RegQueryValueExW(hkey, pi5->pPortName, NULL, &type, (LPBYTE)output, &count); + RegQueryValueExW(hkey, portname, NULL, &type, (LPBYTE)output, &count); RegCloseKey(hkey); } if(output[0] == '|') @@ -7495,21 +7515,21 @@ { ret = schedule_unixfile(output, job->filename); } - else if(!strncmpW(pi5->pPortName, LPR_Port, strlenW(LPR_Port))) + else if(!strncmpW(portname, LPR_Port, strlenW(LPR_Port))) { - ret = schedule_lpr(pi5->pPortName + strlenW(LPR_Port), job->filename); + ret = schedule_lpr(portname + strlenW(LPR_Port), job->filename); } - else if(!strncmpW(pi5->pPortName, CUPS_Port, strlenW(CUPS_Port))) + else if(!strncmpW(portname, CUPS_Port, strlenW(CUPS_Port))) { - ret = schedule_cups(pi5->pPortName + strlenW(CUPS_Port), job->filename, job->document_title); + ret = schedule_cups(portname + strlenW(CUPS_Port), job->filename, job->document_title); } - else if(!strncmpW(pi5->pPortName, FILE_Port, strlenW(FILE_Port))) + else if(!strncmpW(portname, FILE_Port, strlenW(FILE_Port))) { ret = schedule_file(job->filename); } else { - FIXME("can't schedule to port %s\n", debugstr_w(pi5->pPortName)); + FIXME("can't schedule to port %s\n", debugstr_w(portname)); } HeapFree(GetProcessHeap(), 0, pi5); CloseHandle(hf); @@ -7517,6 +7537,7 @@ } list_remove(cursor); HeapFree(GetProcessHeap(), 0, job->document_title); + HeapFree(GetProcessHeap(), 0, job->portname); HeapFree(GetProcessHeap(), 0, job->filename); HeapFree(GetProcessHeap(), 0, job); break; diff -Nru wine1.3-1.3.0/dlls/wldap32/search.c wine1.3-1.3.1/dlls/wldap32/search.c --- wine1.3-1.3.0/dlls/wldap32/search.c 2010-07-30 18:43:56.000000000 +0100 +++ wine1.3-1.3.1/dlls/wldap32/search.c 2010-08-20 18:23:50.000000000 +0100 @@ -243,7 +243,7 @@ #ifdef HAVE_LDAP char *baseU = NULL, *filterU = NULL, **attrsU = NULL; LDAPControl **serverctrlsU = NULL, **clientctrlsU = NULL; - struct timeval tv; + struct timeval tv, *tvp = NULL; ret = WLDAP32_LDAP_NO_MEMORY; @@ -274,11 +274,15 @@ if (!clientctrlsU) goto exit; } - tv.tv_sec = timelimit; - tv.tv_usec = 0; + if (timelimit) + { + tv.tv_sec = timelimit; + tv.tv_usec = 0; + tvp = &tv; + } ret = map_error( ldap_search_ext( ld, baseU, scope, filterU, attrsU, attrsonly, - serverctrlsU, clientctrlsU, &tv, sizelimit, (int *)message )); + serverctrlsU, clientctrlsU, tvp, sizelimit, (int *)message )); exit: strfreeU( baseU ); diff -Nru wine1.3-1.3.0/dlls/wldap32/tests/parse.c wine1.3-1.3.1/dlls/wldap32/tests/parse.c --- wine1.3-1.3.0/dlls/wldap32/tests/parse.c 2010-07-30 18:43:56.000000000 +0100 +++ wine1.3-1.3.1/dlls/wldap32/tests/parse.c 2010-08-20 18:23:50.000000000 +0100 @@ -86,6 +86,25 @@ ldap_controls_free( server_ctrls ); } +static void test_ldap_search_extW( LDAP *ld ) +{ + ULONG ret, message, timelimit; + WCHAR base[] = {0}, filter[] = {'o','u','=','*',0}; + + timelimit = 20; + ret = ldap_search_extW( ld, base, LDAP_SCOPE_SUBTREE, filter, NULL, 0, NULL, NULL, timelimit, 0, &message ); + if (ret == LDAP_SERVER_DOWN) + { + skip("test server can't be reached\n"); + return; + } + ok( !ret, "ldap_search_extW failed 0x%08x\n", ret ); + + timelimit = 0; + ret = ldap_search_extW( ld, base, LDAP_SCOPE_SUBTREE, filter, NULL, 0, NULL, NULL, timelimit, 0, &message ); + ok( !ret, "ldap_search_extW failed 0x%08x\n", ret ); +} + START_TEST (parse) { LDAP *ld; @@ -94,5 +113,6 @@ ok( ld != NULL, "ldap_init failed\n" ); test_ldap_parse_sort_control( ld ); + test_ldap_search_extW( ld ); ldap_unbind( ld ); } diff -Nru wine1.3-1.3.0/dlls/ws2_32/socket.c wine1.3-1.3.1/dlls/ws2_32/socket.c --- wine1.3-1.3.0/dlls/ws2_32/socket.c 2010-07-30 18:43:56.000000000 +0100 +++ wine1.3-1.3.1/dlls/ws2_32/socket.c 2010-08-20 18:23:50.000000000 +0100 @@ -1190,7 +1190,7 @@ uin->sir_family = AF_IRDA; if (!strncmp( win->irdaServiceName, "LSAP-SEL", strlen( "LSAP-SEL" ) )) { - unsigned int lsap_sel; + unsigned int lsap_sel = 0; sscanf( win->irdaServiceName, "LSAP-SEL%u", &lsap_sel ); uin->sir_lsap_sel = lsap_sel; @@ -1803,6 +1803,33 @@ return SOCKET_ERROR; } +static int do_connect(int fd, const struct WS_sockaddr* name, int namelen) +{ + union generic_unix_sockaddr uaddr; + unsigned int uaddrlen = ws_sockaddr_ws2u(name, namelen, &uaddr); + + if (!uaddrlen) + return WSAEFAULT; + + if (name->sa_family == WS_AF_INET) + { + struct sockaddr_in *in4 = (struct sockaddr_in*) &uaddr; + if (memcmp(&in4->sin_addr, magic_loopback_addr, 4) == 0) + { + /* Trying to connect to magic replace-loopback address, + * assuming we really want to connect to localhost */ + TRACE("Trying to connect to magic IP address, using " + "INADDR_LOOPBACK instead.\n"); + in4->sin_addr.s_addr = htonl(WS_INADDR_LOOPBACK); + } + } + + if (connect(fd, &uaddr.addr, uaddrlen) == 0) + return 0; + + return wsaErrno(); +} + /*********************************************************************** * connect (WS2_32.4) */ @@ -1814,37 +1841,15 @@ if (fd != -1) { - union generic_unix_sockaddr uaddr; - unsigned int uaddrlen = ws_sockaddr_ws2u(name, namelen, &uaddr); + int ret = do_connect(fd, name, namelen); + if (ret == 0) + goto connect_success; - if (!uaddrlen) - { - SetLastError(WSAEFAULT); - } - else - { - if (name->sa_family == WS_AF_INET) - { - struct sockaddr_in *in4 = (struct sockaddr_in*) &uaddr; - if (memcmp(&in4->sin_addr, magic_loopback_addr, 4) == 0) - { - /* Trying to connect to magic replace-loopback address, - * assuming we really want to connect to localhost */ - TRACE("Trying to connect to magic IP address, using " - "INADDR_LOOPBACK instead.\n"); - in4->sin_addr.s_addr = htonl(WS_INADDR_LOOPBACK); - } - } - - if (connect(fd, &uaddr.addr, uaddrlen) == 0) - goto connect_success; - } - - if (errno == EINPROGRESS) + if (ret == WSAEINPROGRESS) { /* tell wineserver that a connection is in progress */ _enable_event(SOCKET2HANDLE(s), FD_CONNECT|FD_READ|FD_WRITE, - FD_CONNECT|FD_READ|FD_WRITE, + FD_CONNECT, FD_WINE_CONNECTED|FD_WINE_LISTENING); if (_is_blocking(s)) { @@ -1868,7 +1873,7 @@ } else { - SetLastError(wsaErrno()); + SetLastError(ret); } release_sock_fd( s, fd ); } @@ -1894,6 +1899,111 @@ return WS_connect( s, name, namelen ); } +/*********************************************************************** + * ConnectEx + */ +static BOOL WINAPI WS2_ConnectEx(SOCKET s, const struct WS_sockaddr* name, int namelen, + PVOID sendBuf, DWORD sendBufLen, LPDWORD sent, LPOVERLAPPED ov) +{ + int fd, ret, status; + + if (!ov) + { + SetLastError( ERROR_INVALID_PARAMETER ); + return FALSE; + } + + fd = get_sock_fd( s, FILE_READ_DATA, NULL ); + if (fd == -1) + { + SetLastError( WSAENOTSOCK ); + return FALSE; + } + + TRACE("socket %04lx, ptr %p %s, length %d, sendptr %p, len %d, ov %p\n", + s, name, debugstr_sockaddr(name), namelen, sendBuf, sendBufLen, ov); + + /* FIXME: technically the socket has to be bound */ + ret = do_connect(fd, name, namelen); + if (ret == 0) + { + WSABUF wsabuf; + + _enable_event(SOCKET2HANDLE(s), FD_CONNECT|FD_READ|FD_WRITE, + FD_WINE_CONNECTED|FD_READ|FD_WRITE, + FD_CONNECT|FD_WINE_LISTENING); + + wsabuf.len = sendBufLen; + wsabuf.buf = (char*) sendBuf; + + /* WSASend takes care of completion if need be */ + if (WSASend(s, &wsabuf, sendBuf ? 1 : 0, sent, 0, ov, NULL) != SOCKET_ERROR) + goto connection_success; + } + else if (ret == WSAEINPROGRESS) + { + struct ws2_async *wsa; + ULONG_PTR cvalue = (((ULONG_PTR)ov->hEvent & 1) == 0) ? (ULONG_PTR)ov : 0; + + _enable_event(SOCKET2HANDLE(s), FD_CONNECT|FD_READ|FD_WRITE, + FD_CONNECT, + FD_WINE_CONNECTED|FD_WINE_LISTENING); + + /* Indirectly call WSASend */ + if (!(wsa = HeapAlloc( GetProcessHeap(), 0, sizeof(*wsa) ))) + { + SetLastError(WSAEFAULT); + } + else + { + IO_STATUS_BLOCK *iosb = (IO_STATUS_BLOCK *)ov; + iosb->u.Status = STATUS_PENDING; + iosb->Information = 0; + + wsa->hSocket = SOCKET2HANDLE(s); + wsa->addr = NULL; + wsa->addrlen.val = 0; + wsa->flags = 0; + wsa->n_iovecs = sendBuf ? 1 : 0; + wsa->first_iovec = 0; + wsa->completion_func = NULL; + wsa->iovec[0].iov_base = sendBuf; + wsa->iovec[0].iov_len = sendBufLen; + + SERVER_START_REQ( register_async ) + { + req->type = ASYNC_TYPE_WRITE; + req->async.handle = wine_server_obj_handle( wsa->hSocket ); + req->async.callback = wine_server_client_ptr( WS2_async_send ); + req->async.iosb = wine_server_client_ptr( iosb ); + req->async.arg = wine_server_client_ptr( wsa ); + req->async.event = wine_server_obj_handle( ov->hEvent ); + req->async.cvalue = cvalue; + status = wine_server_call( req ); + } + SERVER_END_REQ; + + if (status != STATUS_PENDING) HeapFree(GetProcessHeap(), 0, wsa); + + /* If the connect already failed */ + if (status == STATUS_PIPE_DISCONNECTED) + status = _get_sock_error(s, FD_CONNECT_BIT); + SetLastError( NtStatusToWSAError(status) ); + } + } + else + { + SetLastError(ret); + } + + release_sock_fd( s, fd ); + return FALSE; + +connection_success: + release_sock_fd( s, fd ); + return TRUE; +} + /*********************************************************************** * getpeername (WS2_32.5) @@ -2737,7 +2847,8 @@ if ( IsEqualGUID(&connectex_guid, lpvInBuffer) ) { - FIXME("SIO_GET_EXTENSION_FUNCTION_POINTER: unimplemented ConnectEx\n"); + *(LPFN_CONNECTEX *)lpbOutBuffer = WS2_ConnectEx; + return 0; } else if ( IsEqualGUID(&disconnectex_guid, lpvInBuffer) ) { @@ -3386,7 +3497,7 @@ * setsockopt (WS2_32.21) */ int WINAPI WS_setsockopt(SOCKET s, int level, int optname, - const char *optval, int optlen) + const char *optval, int optlen) { int fd; int woptval; @@ -3397,7 +3508,7 @@ s, level, optname, optval, optlen); /* some broken apps pass the value directly instead of a pointer to it */ - if(IS_INTRESOURCE(optval)) + if(optlen && IS_INTRESOURCE(optval)) { SetLastError(WSAEFAULT); return SOCKET_ERROR; @@ -3475,6 +3586,12 @@ TRACE("Ignoring SO_EXCLUSIVEADDRUSE, is always set.\n"); return 0; + /* After a ConnectEx call succeeds, the socket can't be used with half of the + * normal winsock functions on windows. We don't have that problem. */ + case WS_SO_UPDATE_CONNECT_CONTEXT: + TRACE("Ignoring SO_UPDATE_CONNECT_CONTEXT, since our sockets are normal"); + return 0; + /* SO_OPENTYPE does not require a valid socket handle. */ case WS_SO_OPENTYPE: if (!optlen || optlen < sizeof(int) || !optval) diff -Nru wine1.3-1.3.0/dlls/ws2_32/tests/sock.c wine1.3-1.3.1/dlls/ws2_32/tests/sock.c --- wine1.3-1.3.0/dlls/ws2_32/tests/sock.c 2010-07-30 18:43:56.000000000 +0100 +++ wine1.3-1.3.1/dlls/ws2_32/tests/sock.c 2010-08-20 18:23:50.000000000 +0100 @@ -938,9 +938,11 @@ { for (i = 0; i <= n; i++) { - trace ("terminating thread %08x\n", thread_id[i]); if ( WaitForSingleObject ( thread[i], 0 ) != WAIT_OBJECT_0 ) + { + trace ("terminating thread %08x\n", thread_id[i]); TerminateThread ( thread [i], 0 ); + } } } CloseHandle ( server_ready ); @@ -3504,6 +3506,223 @@ pFreeAddrInfoW(result); } +static void test_ConnectEx(void) +{ + SOCKET listener = INVALID_SOCKET; + SOCKET acceptor = INVALID_SOCKET; + SOCKET connector = INVALID_SOCKET; + struct sockaddr_in address, conaddress; + int addrlen; + OVERLAPPED overlapped; + LPFN_CONNECTEX pConnectEx; + GUID connectExGuid = WSAID_CONNECTEX; + DWORD bytesReturned; + char buffer[1024]; + BOOL bret; + DWORD dwret; + int iret; + + memset(&overlapped, 0, sizeof(overlapped)); + + listener = socket(AF_INET, SOCK_STREAM, 0); + if (listener == INVALID_SOCKET) { + skip("could not create listener socket, error %d\n", WSAGetLastError()); + goto end; + } + + connector = socket(AF_INET, SOCK_STREAM, 0); + if (connector == INVALID_SOCKET) { + skip("could not create connector socket, error %d\n", WSAGetLastError()); + goto end; + } + + memset(&address, 0, sizeof(address)); + address.sin_family = AF_INET; + address.sin_addr.s_addr = inet_addr("127.0.0.1"); + iret = bind(listener, (struct sockaddr*)&address, sizeof(address)); + if (iret != 0) { + skip("failed to bind, error %d\n", WSAGetLastError()); + goto end; + } + + addrlen = sizeof(address); + iret = getsockname(listener, (struct sockaddr*)&address, &addrlen); + if (iret != 0) { + skip("failed to lookup bind address, error %d\n", WSAGetLastError()); + goto end; + } + + if (set_blocking(listener, TRUE)) { + skip("couldn't make socket non-blocking, error %d\n", WSAGetLastError()); + goto end; + } + + iret = WSAIoctl(connector, SIO_GET_EXTENSION_FUNCTION_POINTER, &connectExGuid, sizeof(connectExGuid), + &pConnectEx, sizeof(pConnectEx), &bytesReturned, NULL, NULL); + if (iret) { + win_skip("WSAIoctl failed to get ConnectEx with ret %d + errno %d\n", iret, WSAGetLastError()); + goto end; + } + + bret = pConnectEx(INVALID_SOCKET, (struct sockaddr*)&address, addrlen, NULL, 0, &bytesReturned, &overlapped); + ok(bret == FALSE && WSAGetLastError() == WSAENOTSOCK, "ConnectEx on invalid socket " + "returned %d + errno %d\n", bret, WSAGetLastError()); + + bret = pConnectEx(connector, (struct sockaddr*)&address, addrlen, NULL, 0, &bytesReturned, &overlapped); + todo_wine ok(bret == FALSE && WSAGetLastError() == WSAEINVAL, "ConnectEx on a unbound socket " + "returned %d + errno %d\n", bret, WSAGetLastError()); + if (bret == TRUE || WSAGetLastError() != WSAEINVAL) + { + acceptor = accept(listener, NULL, NULL); + if (acceptor != INVALID_SOCKET) { + closesocket(acceptor); + acceptor = INVALID_SOCKET; + } + + closesocket(connector); + connector = socket(AF_INET, SOCK_STREAM, 0); + if (connector == INVALID_SOCKET) { + skip("could not create connector socket, error %d\n", WSAGetLastError()); + goto end; + } + } + + /* ConnectEx needs a bound socket */ + memset(&conaddress, 0, sizeof(conaddress)); + conaddress.sin_family = AF_INET; + conaddress.sin_addr.s_addr = inet_addr("127.0.0.1"); + iret = bind(connector, (struct sockaddr*)&conaddress, sizeof(conaddress)); + if (iret != 0) { + skip("failed to bind, error %d\n", WSAGetLastError()); + goto end; + } + + bret = pConnectEx(connector, (struct sockaddr*)&address, addrlen, NULL, 0, &bytesReturned, NULL); + ok(bret == FALSE && WSAGetLastError() == ERROR_INVALID_PARAMETER, "ConnectEx on a NULL overlapped " + "returned %d + errno %d\n", bret, WSAGetLastError()); + + overlapped.hEvent = CreateEvent(NULL, FALSE, FALSE, NULL); + if (overlapped.hEvent == NULL) { + skip("could not create event object, errno = %d\n", GetLastError()); + goto end; + } + + iret = listen(listener, 1); + if (iret != 0) { + skip("listening failed, errno = %d\n", WSAGetLastError()); + goto end; + } + + bret = pConnectEx(connector, (struct sockaddr*)&address, addrlen, NULL, 0, &bytesReturned, &overlapped); + ok(bret == FALSE && WSAGetLastError() == ERROR_IO_PENDING, "ConnectEx failed: " + "returned %d + errno %d\n", bret, WSAGetLastError()); + dwret = WaitForSingleObject(overlapped.hEvent, 15000); + ok(dwret == WAIT_OBJECT_0, "Waiting for connect event failed with %d + errno %d\n", dwret, GetLastError()); + + bret = GetOverlappedResult((HANDLE)connector, &overlapped, &bytesReturned, FALSE); + ok(bret, "Connecting failed, error %d\n", GetLastError()); + ok(bytesReturned == 0, "Bytes sent is %d\n", bytesReturned); + + closesocket(connector); + connector = socket(AF_INET, SOCK_STREAM, 0); + if (connector == INVALID_SOCKET) { + skip("could not create connector socket, error %d\n", WSAGetLastError()); + goto end; + } + /* ConnectEx needs a bound socket */ + memset(&conaddress, 0, sizeof(conaddress)); + conaddress.sin_family = AF_INET; + conaddress.sin_addr.s_addr = inet_addr("127.0.0.1"); + iret = bind(connector, (struct sockaddr*)&conaddress, sizeof(conaddress)); + if (iret != 0) { + skip("failed to bind, error %d\n", WSAGetLastError()); + goto end; + } + + acceptor = accept(listener, NULL, NULL); + if (acceptor != INVALID_SOCKET) { + closesocket(acceptor); + acceptor = INVALID_SOCKET; + } + + buffer[0] = '1'; + buffer[1] = '2'; + buffer[2] = '3'; + bret = pConnectEx(connector, (struct sockaddr*)&address, addrlen, buffer, 3, &bytesReturned, &overlapped); + ok(bret == FALSE && WSAGetLastError() == ERROR_IO_PENDING, "ConnectEx failed: " + "returned %d + errno %d\n", bret, WSAGetLastError()); + dwret = WaitForSingleObject(overlapped.hEvent, 15000); + ok(dwret == WAIT_OBJECT_0, "Waiting for connect event failed with %d + errno %d\n", dwret, GetLastError()); + + bret = GetOverlappedResult((HANDLE)connector, &overlapped, &bytesReturned, FALSE); + ok(bret, "Connecting failed, error %d\n", GetLastError()); + ok(bytesReturned == 3, "Bytes sent is %d\n", bytesReturned); + + acceptor = accept(listener, NULL, NULL); + ok(acceptor != INVALID_SOCKET, "could not accept socket error %d\n", WSAGetLastError()); + + bytesReturned = recv(acceptor, buffer, 3, 0); + buffer[4] = 0; + ok(bytesReturned == 3, "Didn't get all sent data, got only %d\n", bytesReturned); + ok(buffer[0] == '1' && buffer[1] == '2' && buffer[2] == '3', + "Failed to get the right data, expected '123', got '%s'", buffer); + + closesocket(connector); + connector = socket(AF_INET, SOCK_STREAM, 0); + if (connector == INVALID_SOCKET) { + skip("could not create connector socket, error %d\n", WSAGetLastError()); + goto end; + } + /* ConnectEx needs a bound socket */ + memset(&conaddress, 0, sizeof(conaddress)); + conaddress.sin_family = AF_INET; + conaddress.sin_addr.s_addr = inet_addr("127.0.0.1"); + iret = bind(connector, (struct sockaddr*)&conaddress, sizeof(conaddress)); + if (iret != 0) { + skip("failed to bind, error %d\n", WSAGetLastError()); + goto end; + } + + if (acceptor != INVALID_SOCKET) { + closesocket(acceptor); + acceptor = INVALID_SOCKET; + } + + /* Connect with error */ + closesocket(listener); + listener = INVALID_SOCKET; + + address.sin_port = 1; + + bret = pConnectEx(connector, (struct sockaddr*)&address, addrlen, NULL, 0, &bytesReturned, &overlapped); + ok(bret == FALSE && GetLastError(), "ConnectEx to bad destination failed: " + "returned %d + errno %d\n", bret, GetLastError()); + + if (GetLastError() == ERROR_IO_PENDING) + { + dwret = WaitForSingleObject(overlapped.hEvent, 15000); + ok(dwret == WAIT_OBJECT_0, "Waiting for connect event failed with %d + errno %d\n", dwret, GetLastError()); + + bret = GetOverlappedResult((HANDLE)connector, &overlapped, &bytesReturned, FALSE); + ok(bret == FALSE && GetLastError() == ERROR_CONNECTION_REFUSED, + "Connecting to a disconnected host returned error %d - %d\n", bret, WSAGetLastError()); + } + else { + ok(GetLastError() == WSAECONNREFUSED, + "Connecting to a disconnected host returned error %d - %d\n", bret, WSAGetLastError()); + } + +end: + if (overlapped.hEvent) + WSACloseEvent(overlapped.hEvent); + if (listener != INVALID_SOCKET) + closesocket(listener); + if (acceptor != INVALID_SOCKET) + closesocket(acceptor); + if (connector != INVALID_SOCKET) + closesocket(connector); +} + static void test_AcceptEx(void) { SOCKET listener = INVALID_SOCKET; @@ -4082,6 +4301,7 @@ test_GetAddrInfoW(); test_AcceptEx(); + test_ConnectEx(); /* this is a io heavy test, do it at the end so the kernel doesn't start dropping packets */ test_send(); diff -Nru wine1.3-1.3.0/documentation/README.sv wine1.3-1.3.1/documentation/README.sv --- wine1.3-1.3.0/documentation/README.sv 2010-07-30 18:43:56.000000000 +0100 +++ wine1.3-1.3.1/documentation/README.sv 2010-08-20 18:23:50.000000000 +0100 @@ -1,13 +1,13 @@ 1. INLEDNING Wine r ett program som gr det mjligt att kra Windows-program -(inkluderat DOS, Windows 3.x och Win32) i Unix. Det bestr av en +(inkluderat DOS, Windows 3.x, Win32 och Win64) i Unix. Det bestr av en programstartare som startar och kr Windows-programfiler, samt ett bibliotek (kallat Winelib) som implementerar Windows API-anrop med hjlp av deras Unix- eller X11-motsvarigheter. Biblioteket kan ocks anvndas -till att porta Win32-kod till vanliga Unix-program. +till att porta Windows-kod till vanliga Unix-program. -Wine r fri programvara, utgett under villkren i GNU LGPL; se +Wine r fri programvara, utgett under villkoren i GNU LGPL; se filen LICENSE fr detaljer. 2. KOM IGNG @@ -39,12 +39,12 @@ Information fr Linux ven om Linux 2.2.x antagligen fortfarande fungerar, och Linux 2.0.x kanske fungerar (tidiga 2.0.x-versioner uppvisade trdrelaterade problem), s r - det bst att ha en nuvarande kernel som 2.4.x eller 2.6.x. + det bst att ha en aktuell kernel som 2.4.x eller 2.6.x. Information fr FreeBSD Wine kommer i regel inte fungera p FreeBSD-versioner ldre n 6.3 eller 7.0. FreeBSD 6.3 kan uppdateras for att stdja Wine. Se - fr mer information. + http://wiki.freebsd.org/Wine fr mer information. Information fr Solaris Wine mste antagligen byggas med GNU toolchain (gcc, gas etc.). @@ -72,7 +72,7 @@ Du mste givetvis ocks ha "make" (mest troligt "GNU make"). - Det r ocks ndvndigt att ha flex 2.5 eller senare samt bison. + Det r ocks ndvndigt att ha flex 2.5.33 eller senare samt bison. Valfria stdbibliotek: configure-skriptet visar varningar nr valfria bibliotek inte hittats. @@ -80,15 +80,16 @@ vilka paket du br installera. P 64 bit-system mste du skerstlla att 32 bit-versionerna av - ovannmnda bibliotek installerats; se - http://wiki.winehq.org/WineOn64bit fr nrmare detaljer. + ovannmnda bibliotek installerats; se http://wiki.winehq.org/WineOn64bit + fr nrmare detaljer. Om du vill ha ett sant 64-bit Wine (eller en mixad + 32- och 64-bit Wine-installation), se http://wiki.winehq.org/Wine64 fr + detaljer. 4. KOMPILERING Kr fljande kommandon fr att bygga Wine om du inte anvnder wineinstall: ./configure -make depend make Detta bygger programmet "wine" och diverse stdbibliotek/programfiler. @@ -98,18 +99,6 @@ Kr './configure --help' fr att se instllningar och val vid kompilering. -Gr fljande fr att uppgradera till en ny utgva med hjlp av en -uppdateringsfil: -G in i utgvans rotkatalog och kr kommandot "make clean". -Drefter uppdaterar du utgvan med - - bunzip -c uppdateringsfil | patch -p1 - -dr "uppdateringsfil" r namnet p uppdateringsfilen (ngot i stil med -wine-1.0.x.diff.bz2). Drefter kan du kra "./configure" och -"make depend && make". - - 5. INSTALLATION Nr Wine r byggt kan du kra "make install" fr att installera det; @@ -136,13 +125,11 @@ wine ~/.wine/drive_c/windows/notepad.exe (anvndning av Unix-filvgar) - wine notepad.exe /parameter1 -parameter2 parameter3 - (kra program med parametrar) + wine notepad.exe readme.txt (kra program med parametrar) -Wine r inte nnu frdigutvecklat, s det r mjligt att tskilliga program -kraschar. I s fall ppnas Wines felskare, dr du kan underska och fixa -problemet. Ls delen "debugging" i Wines utvecklarmanual fr mer information -om hur detta kan gras. +Wine r inte perfekt, s det r mjligt att vissa program kraschar. +I s fall fr du en kraschlogg som du br bifoga till din rapport d du +rapporterar ett fel. 7. MER INFORMATION @@ -153,29 +140,25 @@ Frgor: Frgor och svar om Wine finns samlade p http://www.winehq.org/FAQ -Usenet: Du kan diskutera problem med Wine och f hjlp p - comp.emulators.ms-windows.wine. - Fel: Rapportera fel till Wines Bugzilla p http://bugs.winehq.org Sk i Bugzilla-databasen fr att se om problemet redan finns - rapporterat innan du snder en felrapport. Du kan ocks rapportera - fel till comp.emulators.ms-windows.wine. + rapporterat innan du snder en felrapport. IRC: Hjlp finns tillgnglig online p kanalen #WineHQ p irc.freenode.net. -GIT: Wines nuvarande utvecklingsversion finns tillgnglig genom GIT. +Git: Wines nuvarande utvecklingsversion finns tillgnglig genom Git. G till http://www.winehq.org/git fr mer information. E-postlistor: - Det finns flera e-postlistor fr Wine-utvecklare; se - http://www.winehq.org/forums fr mer information. + Det finns flera e-postlistor fr Wine-anvndare och -utvecklare; se + http://www.winehq.org/forums fr mer information. -Wiki: Wines Wiki finns p http://wiki.winehq.org +Wiki: Wines Wiki finns p http://wiki.winehq.org Om du lgger till ngot eller fixar ett fel, r det bra om du snder -en patch (i 'diff -u'-format) till listan wine-patches@winehq.org fr -inkludering i nsta utgva av Wine. +en patch (frslagsvis med git-format-patch) till listan wine-patches@winehq.org +fr inkludering i nsta utgva av Wine. -- Originalet till denna fil skrevs av diff -Nru wine1.3-1.3.0/.gitignore wine1.3-1.3.1/.gitignore --- wine1.3-1.3.0/.gitignore 2010-07-30 18:43:56.000000000 +0100 +++ wine1.3-1.3.1/.gitignore 2010-08-20 18:23:50.000000000 +0100 @@ -68,6 +68,7 @@ dlls/kernel32/nls/winerr_ptg.mc.rc dlls/kernel32/nls/winerr_rus.mc.rc dlls/kernel32/nls/winerr_ukr.mc.rc +dlls/libd3dcompiler.def dlls/libd3dx9.def dlls/libkernel.def dlls/libwinspool.def diff -Nru wine1.3-1.3.0/include/commctrl.h wine1.3-1.3.1/include/commctrl.h --- wine1.3-1.3.0/include/commctrl.h 2010-07-30 18:43:56.000000000 +0100 +++ wine1.3-1.3.1/include/commctrl.h 2010-08-20 18:23:50.000000000 +0100 @@ -580,9 +580,10 @@ DWORD dwRop; DWORD fState; DWORD Frame; - DWORD crEffect; + COLORREF crEffect; } IMAGELISTDRAWPARAMS, *LPIMAGELISTDRAWPARAMS; +#define IMAGELISTDRAWPARAMS_V3_SIZE CCSIZEOF_STRUCT(IMAGELISTDRAWPARAMS, dwRop) HRESULT WINAPI HIMAGELIST_QueryInterface(HIMAGELIST,REFIID,void **); INT WINAPI ImageList_Add(HIMAGELIST,HBITMAP,HBITMAP); @@ -4675,6 +4676,8 @@ #define MCM_GETMONTHDELTA (MCM_FIRST + 19) #define MCM_SETMONTHDELTA (MCM_FIRST + 20) #define MCM_GETMAXTODAYWIDTH (MCM_FIRST + 21) +#define MCM_SETCALENDARBORDER (MCM_FIRST + 30) +#define MCM_GETCALENDARBORDER (MCM_FIRST + 31) #define MCM_GETUNICODEFORMAT CCM_GETUNICODEFORMAT #define MCM_SETUNICODEFORMAT CCM_SETUNICODEFORMAT diff -Nru wine1.3-1.3.0/include/d3d10.idl wine1.3-1.3.1/include/d3d10.idl --- wine1.3-1.3.0/include/d3d10.idl 2010-07-30 18:43:56.000000000 +0100 +++ wine1.3-1.3.1/include/d3d10.idl 2010-08-20 18:23:50.000000000 +0100 @@ -19,6 +19,7 @@ import "oaidl.idl"; import "ocidl.idl"; import "dxgi.idl"; +import "d3dcommon.idl"; cpp_quote("#ifndef _D3D10_CONSTANTS") cpp_quote("#define _D3D10_CONSTANTS") diff -Nru wine1.3-1.3.0/include/d3d10misc.h wine1.3-1.3.1/include/d3d10misc.h --- wine1.3-1.3.0/include/d3d10misc.h 2010-07-30 18:43:56.000000000 +0100 +++ wine1.3-1.3.1/include/d3d10misc.h 2010-08-20 18:23:50.000000000 +0100 @@ -39,6 +39,8 @@ HMODULE swrast, UINT flags, UINT sdk_version, DXGI_SWAP_CHAIN_DESC *swapchain_desc, IDXGISwapChain **swapchain, ID3D10Device **device); +HRESULT WINAPI D3D10CreateBlob(SIZE_T data_size, ID3D10Blob **blob); + #ifdef __cplusplus } #endif diff -Nru wine1.3-1.3.0/include/d3d10shader.h wine1.3-1.3.1/include/d3d10shader.h --- wine1.3-1.3.0/include/d3d10shader.h 2010-07-30 18:43:56.000000000 +0100 +++ wine1.3-1.3.1/include/d3d10shader.h 2010-08-20 18:23:50.000000000 +0100 @@ -32,10 +32,16 @@ #define D3D10_SHADER_FORCE_PS_SOFTWARE_NO_OPT 0x0080 #define D3D10_SHADER_NO_PRESHADER 0x0100 #define D3D10_SHADER_AVOID_FLOW_CONTROL 0x0200 -#define D3D10_SHADER_PREFER_FLOW_CONTROL 0x0300 -#define D3D10_SHADER_ENABLE_STRICTNESS 0x0400 -#define D3D10_SHADER_ENABLE_BACKWARDS_COMPATIBILITY 0x0800 -#define D3D10_SHADER_IEEE_STRICTNESS 0x1000 +#define D3D10_SHADER_PREFER_FLOW_CONTROL 0x0400 +#define D3D10_SHADER_ENABLE_STRICTNESS 0x0800 +#define D3D10_SHADER_ENABLE_BACKWARDS_COMPATIBILITY 0x1000 +#define D3D10_SHADER_IEEE_STRICTNESS 0x2000 +#define D3D10_SHADER_WARNINGS_ARE_ERRORS 0x40000 + +#define D3D10_SHADER_OPTIMIZATION_LEVEL0 0x4000 +#define D3D10_SHADER_OPTIMIZATION_LEVEL1 0x0000 +#define D3D10_SHADER_OPTIMIZATION_LEVEL2 0xC000 +#define D3D10_SHADER_OPTIMIZATION_LEVEL3 0x8000 typedef enum _D3D10_SHADER_VARIABLE_CLASS { diff -Nru wine1.3-1.3.0/include/d3d11shader.h wine1.3-1.3.1/include/d3d11shader.h --- wine1.3-1.3.0/include/d3d11shader.h 1970-01-01 01:00:00.000000000 +0100 +++ wine1.3-1.3.1/include/d3d11shader.h 2010-08-20 18:23:50.000000000 +0100 @@ -0,0 +1,24 @@ +/* + * Copyright 2010 Matteo Bruni for 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 + */ + +#ifndef __D3D11SHADER_H__ +#define __D3D11SHADER_H__ + +#include "d3dcommon.h" + +#endif diff -Nru wine1.3-1.3.0/include/d3dcommon.idl wine1.3-1.3.1/include/d3dcommon.idl --- wine1.3-1.3.0/include/d3dcommon.idl 2010-07-30 18:43:56.000000000 +0100 +++ wine1.3-1.3.1/include/d3dcommon.idl 2010-08-20 18:23:50.000000000 +0100 @@ -19,6 +19,14 @@ import "oaidl.idl"; import "ocidl.idl"; +typedef struct _D3D_SHADER_MACRO +{ + LPCSTR Name; + LPCSTR Definition; +} D3D_SHADER_MACRO; + +typedef struct _D3D_SHADER_MACRO* LPD3D_SHADER_MACRO; + [ object, local, @@ -27,9 +35,35 @@ interface ID3D10Blob : IUnknown { void *GetBufferPointer(); - DWORD GetBufferSize(); + SIZE_T GetBufferSize(); } typedef ID3D10Blob* LPD3D10BLOB; typedef ID3D10Blob ID3DBlob; typedef ID3DBlob* LPD3DBLOB; +cpp_quote("#define IID_ID3DBlob IID_ID3D10Blob") + +typedef enum _D3D_INCLUDE_TYPE +{ + D3D_INCLUDE_LOCAL = 0, + D3D_INCLUDE_SYSTEM, + D3D10_INCLUDE_LOCAL = D3D_INCLUDE_LOCAL, + D3D10_INCLUDE_SYSTEM = D3D_INCLUDE_SYSTEM, + D3D_INCLUDE_FORCE_DWORD = 0x7fffffff +} D3D_INCLUDE_TYPE; + +[ + object, + local, +] +interface ID3DInclude +{ + HRESULT Open(D3D_INCLUDE_TYPE include_type, + const char *filename, + const void *parent_data, + const void **data, + UINT *bytes); + HRESULT Close(const void *data); +} + +typedef ID3DInclude* LPD3DINCLUDE; diff -Nru wine1.3-1.3.0/include/d3dcompiler.h wine1.3-1.3.1/include/d3dcompiler.h --- wine1.3-1.3.0/include/d3dcompiler.h 1970-01-01 01:00:00.000000000 +0100 +++ wine1.3-1.3.1/include/d3dcompiler.h 2010-08-20 18:23:50.000000000 +0100 @@ -0,0 +1,46 @@ +/* + * Copyright 2010 Matteo Bruni for 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 + */ + +#ifndef __D3DCOMPILER_H__ +#define __D3DCOMPILER_H__ + +#include "d3d11shader.h" + +#define D3DCOMPILE_DEBUG 0x0001 +#define D3DCOMPILE_SKIP_VALIDATION 0x0002 +#define D3DCOMPILE_SKIP_OPTIMIZATION 0x0004 +#define D3DCOMPILE_PACK_MATRIX_ROW_MAJOR 0x0008 +#define D3DCOMPILE_PACK_MATRIX_COLUMN_MAJOR 0x0010 +#define D3DCOMPILE_PARTIAL_PRECISION 0x0020 +#define D3DCOMPILE_FORCE_VS_SOFTWARE_NO_OPT 0x0040 +#define D3DCOMPILE_FORCE_PS_SOFTWARE_NO_OPT 0x0080 +#define D3DCOMPILE_NO_PRESHADER 0x0100 +#define D3DCOMPILE_AVOID_FLOW_CONTROL 0x0200 +#define D3DCOMPILE_PREFER_FLOW_CONTROL 0x0400 +#define D3DCOMPILE_ENABLE_STRICTNESS 0x0800 +#define D3DCOMPILE_ENABLE_BACKWARDS_COMPATIBILITY 0x1000 +#define D3DCOMPILE_IEEE_STRICTNESS 0x2000 +#define D3DCOMPILE_OPTIMIZATION_LEVEL0 0x4000 +#define D3DCOMPILE_OPTIMIZATION_LEVEL1 0x0000 +#define D3DCOMPILE_OPTIMIZATION_LEVEL2 0xC000 +#define D3DCOMPILE_OPTIMIZATION_LEVEL3 0x8000 +#define D3DCOMPILE_WARNINGS_ARE_ERRORS 0x40000 + +HRESULT WINAPI D3DCreateBlob(SIZE_T data_size, ID3DBlob **blob); + +#endif diff -Nru wine1.3-1.3.0/include/d3dx9mesh.h wine1.3-1.3.1/include/d3dx9mesh.h --- wine1.3-1.3.0/include/d3dx9mesh.h 2010-07-30 18:43:56.000000000 +0100 +++ wine1.3-1.3.1/include/d3dx9mesh.h 2010-08-20 18:23:50.000000000 +0100 @@ -30,6 +30,32 @@ MAX_FVF_DECL_SIZE = MAXD3DDECLLENGTH + 1 }; +enum _D3DXMESH +{ + D3DXMESH_32BIT = 0x001, + D3DXMESH_DONOTCLIP = 0x002, + D3DXMESH_POINTS = 0x004, + D3DXMESH_RTPATCHES = 0x008, + D3DXMESH_NPATCHES = 0x4000, + D3DXMESH_VB_SYSTEMMEM = 0x010, + D3DXMESH_VB_MANAGED = 0x020, + D3DXMESH_VB_WRITEONLY = 0x040, + D3DXMESH_VB_DYNAMIC = 0x080, + D3DXMESH_VB_SOFTWAREPROCESSING = 0x8000, + D3DXMESH_IB_SYSTEMMEM = 0x100, + D3DXMESH_IB_MANAGED = 0x200, + D3DXMESH_IB_WRITEONLY = 0x400, + D3DXMESH_IB_DYNAMIC = 0x800, + D3DXMESH_IB_SOFTWAREPROCESSING = 0x10000, + D3DXMESH_VB_SHARE = 0x1000, + D3DXMESH_USEHWONLY = 0x2000, + D3DXMESH_SYSTEMMEM = 0x110, + D3DXMESH_MANAGED = 0x220, + D3DXMESH_WRITEONLY = 0x440, + D3DXMESH_DYNAMIC = 0x880, + D3DXMESH_SOFTWAREPROCESSING = 0x18000 +}; + typedef struct ID3DXBaseMesh* LPD3DXBASEMESH; typedef struct ID3DXMesh* LPD3DXMESH; @@ -124,6 +150,7 @@ extern "C" { #endif +HRESULT WINAPI D3DXCreateMesh(DWORD, DWORD, DWORD, CONST LPD3DVERTEXELEMENT9 *, LPDIRECT3DDEVICE9, LPD3DXMESH *); HRESULT WINAPI D3DXCreateBuffer(DWORD, LPD3DXBUFFER*); UINT WINAPI D3DXGetDeclVertexSize(const D3DVERTEXELEMENT9 *decl, DWORD stream_idx); UINT WINAPI D3DXGetFVFVertexSize(DWORD); @@ -132,6 +159,7 @@ HRESULT WINAPI D3DXComputeBoundingBox(CONST D3DXVECTOR3 *, DWORD, DWORD, D3DXVECTOR3 *, D3DXVECTOR3 *); HRESULT WINAPI D3DXComputeBoundingSphere(CONST D3DXVECTOR3 *, DWORD, DWORD, D3DXVECTOR3 *, FLOAT *); HRESULT WINAPI D3DXDeclaratorFromFVF(DWORD, D3DVERTEXELEMENT9[MAX_FVF_DECL_SIZE]); +HRESULT WINAPI D3DXFVFFromDeclarator(const LPD3DVERTEXELEMENT9 *, DWORD *); BOOL WINAPI D3DXIntersectTri(CONST D3DXVECTOR3 *, CONST D3DXVECTOR3 *, CONST D3DXVECTOR3 *, CONST D3DXVECTOR3 *, CONST D3DXVECTOR3*, FLOAT *, FLOAT *, FLOAT *); #ifdef __cplusplus diff -Nru wine1.3-1.3.0/include/dwmapi.h wine1.3-1.3.1/include/dwmapi.h --- wine1.3-1.3.0/include/dwmapi.h 2010-07-30 18:43:56.000000000 +0100 +++ wine1.3-1.3.1/include/dwmapi.h 2010-08-20 18:23:50.000000000 +0100 @@ -53,6 +53,7 @@ BOOL fTransitionOnMaximized; } DWM_BLURBEHIND, *PDWM_BLURBEHIND; +DWMAPI DwmDefWindowProc(HWND, UINT, WPARAM, LPARAM, LRESULT*); DWMAPI DwmEnableBlurBehindWindow(HWND, const DWM_BLURBEHIND *); DWMAPI DwmEnableComposition(UINT); DWMAPI DwmEnableMMCSS(BOOL); diff -Nru wine1.3-1.3.0/include/gameux.idl wine1.3-1.3.1/include/gameux.idl --- wine1.3-1.3.0/include/gameux.idl 2010-07-30 18:43:56.000000000 +0100 +++ wine1.3-1.3.1/include/gameux.idl 2010-08-20 18:23:50.000000000 +0100 @@ -32,6 +32,18 @@ { importlib("stdole2.tlb"); + cpp_quote("#define ID_GDF_XML __GDF_XML") + cpp_quote("#define ID_GDF_THUMBNAIL __GDF_THUMBNAIL") + cpp_quote("#define ID_ICON_ICO __ICON_ICO") + + cpp_quote("#if defined(__GNUC__)") + cpp_quote("#define ID_GDF_XML_STR (const WCHAR[]){'_','_','G','D','F','_','X','M','L',0}") + cpp_quote("#define ID_GDF_THUMBNAIL_STR (const WCHAR[]){'_','_','G','D','F','_','T','H','U','M','B','N','A','I','L',0}") + cpp_quote("#elif defined(_MSC_VER)") + cpp_quote("#define ID_GDF_XML_STR L\"__GDF_XML\"") + cpp_quote("#define ID_GDF_THUMBNAIL_STR L\"__GDF_THUMBNAIL\"") + cpp_quote("#endif") + typedef enum { GIS_NOT_INSTALLED = 1, diff -Nru wine1.3-1.3.0/include/inaddr.h wine1.3-1.3.1/include/inaddr.h --- wine1.3-1.3.0/include/inaddr.h 1970-01-01 01:00:00.000000000 +0100 +++ wine1.3-1.3.1/include/inaddr.h 2010-08-20 18:23:50.000000000 +0100 @@ -0,0 +1,53 @@ +/* + * Copyright 2010 Detlef Riekenberg + * + * 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 __INADDR_H__ +#define __INADDR_H__ + +#ifdef USE_WS_PREFIX +#define WS(x) WS_##x +#else +#define WS(x) x +#endif + +typedef struct WS(in_addr) +{ + union { + struct { + UCHAR s_b1,s_b2,s_b3,s_b4; + } S_un_b; + struct { + USHORT s_w1,s_w2; + } S_un_w; + ULONG S_addr; + } S_un; +} IN_ADDR, *PIN_ADDR, *LPIN_ADDR; + +#undef WS + +#ifndef USE_WS_PREFIX +#define s_addr S_un.S_addr +#define s_net S_un.S_un_b.s_b1 +#define s_host S_un.S_un_b.s_b2 +#define s_lh S_un.S_un_b.s_b3 +#define s_impno S_un.S_un_b.s_b4 +#define s_imp S_un.S_un_w.s_w2 +#endif /* USE_WS_PREFIX */ + +#endif /* __INADDR_H__ */ diff -Nru wine1.3-1.3.0/include/iphlpapi.h wine1.3-1.3.1/include/iphlpapi.h --- wine1.3-1.3.0/include/iphlpapi.h 2010-07-30 18:43:56.000000000 +0100 +++ wine1.3-1.3.1/include/iphlpapi.h 2010-08-20 18:23:50.000000000 +0100 @@ -141,6 +141,11 @@ DWORD WINAPI UnenableRouter(OVERLAPPED* pOverlapped, LPDWORD lpdwEnableCount); +#ifdef _WINSOCK2API_ +ULONG WINAPI GetAdaptersAddresses(ULONG family, ULONG flags, PVOID reserved, + PIP_ADAPTER_ADDRESSES aa, PULONG buflen); +#endif + #ifdef __cplusplus } #endif diff -Nru wine1.3-1.3.0/include/iptypes.h wine1.3-1.3.1/include/iptypes.h --- wine1.3-1.3.0/include/iptypes.h 2010-07-30 18:43:56.000000000 +0100 +++ wine1.3-1.3.1/include/iptypes.h 2010-08-20 18:23:50.000000000 +0100 @@ -189,6 +189,17 @@ ULONG PrefixLength; } IP_ADAPTER_PREFIX, *PIP_ADAPTER_PREFIX; +#define IP_ADAPTER_DDNS_ENABLED 0x1 +#define IP_ADAPTER_REGISTER_ADAPTER_SUFFIX 0x2 +#define IP_ADAPTER_DHCP_ENABLED 0x4 +#define IP_ADAPTER_RECEIVE_ONLY 0x8 +#define IP_ADAPTER_NO_MULTICAST 0x10 +#define IP_ADAPTER_IPV6_OTHER_STATEFUL_CONFIG 0x20 +#define IP_ADAPTER_NETBIOS_OVER_TCPIP_ENABLED 0x40 +#define IP_ADAPTER_IPV4_ENABLED 0x80 +#define IP_ADAPTER_IPV6_ENABLED 0x100 +#define IP_ADAPTER_IPV6_MANAGE_ADDRESS_CONFIG 0x200 + typedef struct _IP_ADAPTER_ADDRESSES { union { ULONGLONG Alignment; diff -Nru wine1.3-1.3.0/include/Makefile.in wine1.3-1.3.1/include/Makefile.in --- wine1.3-1.3.0/include/Makefile.in 2010-07-30 18:43:56.000000000 +0100 +++ wine1.3-1.3.1/include/Makefile.in 2010-08-20 18:23:50.000000000 +0100 @@ -156,6 +156,7 @@ d3d10effect.h \ d3d10misc.h \ d3d10shader.h \ + d3d11shader.h \ d3d8.h \ d3d8caps.h \ d3d8types.h \ @@ -163,6 +164,7 @@ d3d9caps.h \ d3d9types.h \ d3dcaps.h \ + d3dcompiler.h \ d3dhal.h \ d3drm.h \ d3drmdef.h \ @@ -279,6 +281,7 @@ imagehlp.h \ imm.h \ in6addr.h \ + inaddr.h \ initguid.h \ intshcut.h \ ipexport.h \ diff -Nru wine1.3-1.3.0/include/mswsock.h wine1.3-1.3.1/include/mswsock.h --- wine1.3-1.3.0/include/mswsock.h 2010-07-30 18:43:56.000000000 +0100 +++ wine1.3-1.3.1/include/mswsock.h 2010-08-20 18:23:50.000000000 +0100 @@ -22,6 +22,12 @@ extern "C" { #endif /* defined(__cplusplus) */ +#ifdef USE_WS_PREFIX +#define WS(x) WS_##x +#else +#define WS(x) x +#endif + #ifndef USE_WS_PREFIX #define SO_CONNDATA 0x7000 #define SO_CONNOPT 0x7001 @@ -166,16 +172,16 @@ } WSACMSGHDR, *PWSACMSGHDR, *LPWSACMSGHDR; typedef BOOL (WINAPI * LPFN_ACCEPTEX)(SOCKET, SOCKET, PVOID, DWORD, DWORD, DWORD, LPDWORD, LPOVERLAPPED); -typedef BOOL (WINAPI * LPFN_CONNECTEX)(SOCKET, const struct sockaddr *, int, PVOID, DWORD, LPDWORD, LPOVERLAPPED); +typedef BOOL (WINAPI * LPFN_CONNECTEX)(SOCKET, const struct WS(sockaddr) *, int, PVOID, DWORD, LPDWORD, LPOVERLAPPED); typedef BOOL (WINAPI * LPFN_DISCONNECTEX)(SOCKET, LPOVERLAPPED, DWORD, DWORD); -typedef VOID (WINAPI * LPFN_GETACCEPTEXSOCKADDRS)(PVOID, DWORD, DWORD, DWORD, struct sockaddr **, LPINT, struct sockaddr **, LPINT); +typedef VOID (WINAPI * LPFN_GETACCEPTEXSOCKADDRS)(PVOID, DWORD, DWORD, DWORD, struct WS(sockaddr) **, LPINT, struct WS(sockaddr) **, LPINT); typedef BOOL (WINAPI * LPFN_TRANSMITFILE)(SOCKET, HANDLE, DWORD, DWORD, LPOVERLAPPED, LPTRANSMIT_FILE_BUFFERS, DWORD); typedef BOOL (WINAPI * LPFN_TRANSMITPACKETS)(SOCKET, LPTRANSMIT_PACKETS_ELEMENT, DWORD, DWORD, LPOVERLAPPED, DWORD); typedef INT (WINAPI * LPFN_WSARECVMSG)(SOCKET, LPWSAMSG, LPDWORD, LPWSAOVERLAPPED, LPWSAOVERLAPPED_COMPLETION_ROUTINE); typedef INT (WINAPI * LPFN_WSASENDMSG)(SOCKET, LPWSAMSG, DWORD, LPDWORD, LPWSAOVERLAPPED, LPWSAOVERLAPPED_COMPLETION_ROUTINE); BOOL WINAPI AcceptEx(SOCKET, SOCKET, PVOID, DWORD, DWORD, DWORD, LPDWORD, LPOVERLAPPED); -VOID WINAPI GetAcceptExSockaddrs(PVOID, DWORD, DWORD, DWORD, struct sockaddr **, LPINT, struct sockaddr **, LPINT); +VOID WINAPI GetAcceptExSockaddrs(PVOID, DWORD, DWORD, DWORD, struct WS(sockaddr) **, LPINT, struct WS(sockaddr) **, LPINT); BOOL WINAPI TransmitFile(SOCKET, HANDLE, DWORD, DWORD, LPOVERLAPPED, LPTRANSMIT_FILE_BUFFERS, DWORD); INT WINAPI WSARecvEx(SOCKET, char *, INT, INT *); @@ -183,4 +189,6 @@ } #endif +#undef WS + #endif /* _MSWSOCK_ */ diff -Nru wine1.3-1.3.0/include/ntstatus.h wine1.3-1.3.1/include/ntstatus.h --- wine1.3-1.3.0/include/ntstatus.h 2010-07-30 18:43:56.000000000 +0100 +++ wine1.3-1.3.1/include/ntstatus.h 2010-08-20 18:23:50.000000000 +0100 @@ -1187,6 +1187,24 @@ #define STATUS_SXS_PROCESS_TERMINATION_REQUESTED ((NTSTATUS) 0xC0150013) #define STATUS_SXS_CORRUPT_ACTIVATION_STACK ((NTSTATUS) 0xC0150014) #define STATUS_SXS_CORRUPTION ((NTSTATUS) 0xC0150015) +#define STATUS_SXS_INVALID_IDENTITY_ATTRIBUTE_VALUE ((NTSTATUS) 0xC0150016) +#define STATUS_SXS_INVALID_IDENTITY_ATTRIBUTE_NAME ((NTSTATUS) 0xC0150017) +#define STATUS_SXS_IDENTITY_DUPLICATE_ATTRIBUTE ((NTSTATUS) 0xC0150018) +#define STATUS_SXS_IDENTITY_PARSE_ERROR ((NTSTATUS) 0xC0150019) +#define STATUS_SXS_COMPONENT_STORE_CORRUPT ((NTSTATUS) 0xC015001A) +#define STATUS_SXS_FILE_HASH_MISMATCH ((NTSTATUS) 0xC015001B) +#define STATUS_SXS_MANIFEST_IDENTITY_SAME_BUT_CONTENTS_DIFFERENT ((NTSTATUS) 0xC015001C) +#define STATUS_SXS_IDENTITIES_DIFFERENT ((NTSTATUS) 0xC015001D) +#define STATUS_SXS_ASSEMBLY_IS_NOT_A_DEPLOYMENT ((NTSTATUS) 0xC015001E) +#define STATUS_SXS_FILE_NOT_PART_OF_ASSEMBLY ((NTSTATUS) 0xC015001F) +#define STATUS_ADVANCED_INSTALLER_FAILED ((NTSTATUS) 0xC0150020) +#define STATUS_XML_ENCODING_MISMATCH ((NTSTATUS) 0xC0150021) +#define STATUS_SXS_MANIFEST_TOO_BIG ((NTSTATUS) 0xC0150022) +#define STATUS_SXS_SETTING_NOT_REGISTERED ((NTSTATUS) 0xC0150023) +#define STATUS_SXS_TRANSACTION_CLOSURE_INCOMPLETE ((NTSTATUS) 0xC0150024) +#define STATUS_SXS_PRIMITIVE_INSTALLER_FAILED ((NTSTATUS) 0xC0150025) +#define STATUS_GENERIC_COMMAND_FAILED ((NTSTATUS) 0xC0150026) +#define STATUS_SXS_FILE_HASH_MISSING ((NTSTATUS) 0xC0150027) #define DBG_EXCEPTION_HANDLED ((NTSTATUS) 0x00010001) #define DBG_CONTINUE ((NTSTATUS) 0x00010002) diff -Nru wine1.3-1.3.0/include/shlguid.h wine1.3-1.3.1/include/shlguid.h --- wine1.3-1.3.0/include/shlguid.h 2010-07-30 18:43:56.000000000 +0100 +++ wine1.3-1.3.1/include/shlguid.h 2010-08-20 18:23:50.000000000 +0100 @@ -174,4 +174,21 @@ DEFINE_GUID(EP_QueryPane, 0x65BCDE4F, 0x4F07, 0x4F27, 0x83, 0xA7, 0x1A, 0xFC, 0xA4, 0xDF, 0x7D, 0xDD); DEFINE_GUID(EP_AdvQueryPane, 0xB4E9DB8B, 0x34BA, 0x4C39, 0xB5, 0xCC, 0x16, 0xA1, 0xBD, 0x2C, 0x41, 0x1C); +/* IShellItem/IShellItemArray BindToHandler */ +DEFINE_GUID(BHID_SFObject, 0x3981E224, 0xF559, 0x11D3, 0x8E,0x3A, 0x00,0xC0,0x4F,0x68,0x37,0xD5); +DEFINE_GUID(BHID_SFUIObject, 0x3981E225, 0xF559, 0x11D3, 0x8E,0x3A, 0x00,0xC0,0x4F,0x68,0x37,0xD5); +DEFINE_GUID(BHID_SFViewObject,0x3981E226, 0xF559, 0x11D3, 0x8E,0x3A, 0x00,0xC0,0x4F,0x68,0x37,0xD5); +DEFINE_GUID(BHID_Storage, 0x3981E227, 0xF559, 0x11D3, 0x8E,0x3A, 0x00,0xC0,0x4F,0x68,0x37,0xD5); +DEFINE_GUID(BHID_Stream, 0x1CEBB3AB, 0x7C10, 0x499A, 0xA4,0x17, 0x92,0xCA,0x16,0xC4,0xCB,0x83); +DEFINE_GUID(BHID_StorageEnum, 0x4621A4E3, 0xF0D6, 0x4773, 0x8A,0x9C, 0x46,0xE7,0x7B,0x17,0x48,0x40); +DEFINE_GUID(BHID_Transfer, 0xD5E346A1, 0xF753, 0x4932, 0xB4,0x03, 0x45,0x74,0x80,0x0E,0x24,0x98); +DEFINE_GUID(BHID_EnumItems, 0x94F60519, 0x2850, 0x4924, 0xAA,0x5A, 0xD1,0x5E,0x84,0x86,0x80,0x39); +DEFINE_GUID(BHID_DataObject, 0xB8C0BD9F, 0xED24, 0x455C, 0x83,0xE6, 0xD5,0x39,0x0C,0x4F,0xE8,0xC4); +DEFINE_GUID(BHID_Filter, 0x38D08778, 0xF557, 0x4690, 0x9E,0xBF, 0xBA,0x54,0x70,0x6A,0xD8,0xF7); +DEFINE_GUID(BHID_LinkTargetItem, 0x3981E228, 0xF559, 0x11D3, 0x8E,0x3A, 0x00,0xC0,0x4F,0x68,0x37,0xD5); +DEFINE_GUID(BHID_PropertyStore, 0x0384E1A4, 0x1523, 0x439C, 0xA4,0xC8, 0xAB,0x91,0x10,0x52,0xF5,0x86); +DEFINE_GUID(BHID_ThumbnailHandler, 0x7B2E650A, 0x8E20, 0x4F4A, 0xB0,0x9E, 0x65,0x97,0xAF,0xC7,0x2F,0xB0); +DEFINE_GUID(BHID_AssociationArray, 0xBEA9EF17, 0x82F1, 0x4F60, 0x92,0x84, 0x4F,0x8D,0xB7,0x5C,0x3B,0xE9); +DEFINE_GUID(BHID_EnumAssocHandlers,0xB8AB0B9C, 0xC2EC, 0x4F7A, 0x91,0x8D, 0x31,0x49,0x00,0xE6,0x28,0x0A); + #endif /* __WINE_SHLGUID_H */ diff -Nru wine1.3-1.3.0/include/usp10.h wine1.3-1.3.1/include/usp10.h --- wine1.3-1.3.0/include/usp10.h 2010-07-30 18:43:56.000000000 +0100 +++ wine1.3-1.3.1/include/usp10.h 2010-08-20 18:23:50.000000000 +0100 @@ -202,6 +202,20 @@ } GOFFSET; #endif +typedef ULONG OPENTYPE_TAG; + +typedef struct tagOPENTYPE_FEATURE_RECORD +{ + OPENTYPE_TAG tagFeature; + LONG lParameter; +} OPENTYPE_FEATURE_RECORD; + +typedef struct tagTEXTRANGE_PROPERTIES +{ + OPENTYPE_FEATURE_RECORD *potfRecords; + INT cotfRecords; +} TEXTRANGE_PROPERTIES; + /* Function Declarations */ HRESULT WINAPI ScriptApplyDigitSubstitution(const SCRIPT_DIGITSUBSTITUTE* psds, diff -Nru wine1.3-1.3.0/include/wine/wined3d.idl wine1.3-1.3.1/include/wine/wined3d.idl --- wine1.3-1.3.0/include/wine/wined3d.idl 2010-07-30 18:43:56.000000000 +0100 +++ wine1.3-1.3.1/include/wine/wined3d.idl 2010-08-20 18:23:50.000000000 +0100 @@ -2481,9 +2481,6 @@ void BindTexture( [in] BOOL srgb ); - HRESULT SetContainer( - [in] IWineD3DBase *container - ); const void *GetData( ); HRESULT SetFormat( @@ -2522,9 +2519,6 @@ [in] int gl_level, [in] BOOL srgb_mode ); - HRESULT SetContainer( - [in] IWineD3DBase *container - ); } [ diff -Nru wine1.3-1.3.0/include/winerror.h wine1.3-1.3.1/include/winerror.h --- wine1.3-1.3.0/include/winerror.h 2010-07-30 18:43:56.000000000 +0100 +++ wine1.3-1.3.1/include/winerror.h 2010-08-20 18:23:50.000000000 +0100 @@ -308,7 +308,158 @@ #define ERROR_INVALID_LDT_SIZE 561 #define ERROR_INVALID_LDT_OFFSET 563 #define ERROR_INVALID_LDT_DESCRIPTOR 564 +#define ERROR_TOO_MANY_THREADS 565 +#define ERROR_THREAD_NOT_IN_PROCESS 566 +#define ERROR_PAGEFILE_QUOTA_EXCEEDED 567 +#define ERROR_LOGON_SERVER_CONFLICT 568 +#define ERROR_SYNCHRONIZATION_REQUIRED 569 +#define ERROR_NET_OPEN_FAILED 570 +#define ERROR_IO_PRIVILEGE_FAILED 571 +#define ERROR_CONTROL_C_EXIT 572 +#define ERROR_MISSING_SYSTEMFILE 573 +#define ERROR_UNHANDLED_EXCEPTION 574 +#define ERROR_APP_INIT_FAILURE 575 +#define ERROR_PAGEFILE_CREATE_FAILED 576 +#define ERROR_INVALID_IMAGE_HASH 577 +#define ERROR_NO_PAGEFILE 578 +#define ERROR_ILLEGAL_FLOAT_CONTEXT 579 +#define ERROR_NO_EVENT_PAIR 580 +#define ERROR_DOMAIN_CTRLR_CONFIG_ERROR 581 +#define ERROR_ILLEGAL_CHARACTER 582 +#define ERROR_UNDEFINED_CHARACTER 583 +#define ERROR_FLOPPY_VOLUME 584 +#define ERROR_BIOS_FAILED_TO_CONNECT_INTERRUPT 585 +#define ERROR_BACKUP_CONTROLLER 586 +#define ERROR_MUTANT_LIMIT_EXCEEDED 587 +#define ERROR_FS_DRIVER_REQUIRED 588 +#define ERROR_CANNOT_LOAD_REGISTRY_FILE 589 +#define ERROR_DEBUG_ATTACH_FAILED 590 +#define ERROR_SYSTEM_PROCESS_TERMINATED 591 +#define ERROR_DATA_NOT_ACCEPTED 592 +#define ERROR_VDM_HARD_ERROR 593 +#define ERROR_DRIVER_CANCEL_TIMEOUT 594 +#define ERROR_REPLY_MESSAGE_MISMATCH 595 +#define ERROR_LOST_WRITEBEHIND_DATA 596 +#define ERROR_CLIENT_SERVER_PARAMETERS_INVALID 597 +#define ERROR_NOT_TINY_STREAM 598 +#define ERROR_STACK_OVERFLOW_READ 599 +#define ERROR_CONVERT_TO_LARGE 600 +#define ERROR_FOUND_OUT_OF_SCOPE 601 +#define ERROR_ALLOCATE_BUCKET 602 +#define ERROR_MARSHALL_OVERFLOW 603 +#define ERROR_INVALID_VARIANT 604 +#define ERROR_BAD_COMPRESSION_BUFFER 605 +#define ERROR_AUDIT_FAILED 606 +#define ERROR_TIMER_RESOLUTION_NOT_SET 607 +#define ERROR_INSUFFICIENT_LOGON_INFO 608 +#define ERROR_BAD_DLL_ENTRYPOINT 609 +#define ERROR_BAD_SERVICE_ENTRYPOINT 610 +#define ERROR_IP_ADDRESS_CONFLICT1 611 +#define ERROR_IP_ADDRESS_CONFLICT2 612 +#define ERROR_REGISTRY_QUOTA_LIMIT 613 +#define ERROR_NO_CALLBACK_ACTIVE 614 +#define ERROR_PWD_TOO_SHORT 615 +#define ERROR_PWD_TOO_RECENT 616 +#define ERROR_PWD_HISTORY_CONFLICT 617 +#define ERROR_UNSUPPORTED_COMPRESSION 618 +#define ERROR_INVALID_HW_PROFILE 619 +#define ERROR_INVALID_PLUGPLAY_DEVICE_PATH 620 +#define ERROR_QUOTA_LIST_INCONSISTENT 621 +#define ERROR_EVALUATION_EXPIRATION 622 +#define ERROR_ILLEGAL_DLL_RELOCATION 623 +#define ERROR_DLL_INIT_FAILED_LOGOFF 624 +#define ERROR_VALIDATE_CONTINUE 625 +#define ERROR_NO_MORE_MATCHES 626 +#define ERROR_RANGE_LIST_CONFLICT 627 +#define ERROR_SERVER_SID_MISMATCH 628 +#define ERROR_CANT_ENABLE_DENY_ONLY 629 +#define ERROR_FLOAT_MULTIPLE_FAULTS 630 +#define ERROR_FLOAT_MULTIPLE_TRAPS 631 +#define ERROR_NOINTERFACE 632 +#define ERROR_DRIVER_FAILED_SLEEP 633 +#define ERROR_CORRUPT_SYSTEM_FILE 634 +#define ERROR_COMMITMENT_MINIMUM 635 +#define ERROR_PNP_RESTART_ENUMERATION 636 +#define ERROR_SYSTEM_IMAGE_BAD_SIGNATURE 637 +#define ERROR_PNP_REBOOT_REQUIRED 638 +#define ERROR_INSUFFICIENT_POWER 639 +#define ERROR_MULTIPLE_FAULT_VIOLATION 640 +#define ERROR_SYSTEM_SHUTDOWN 641 +#define ERROR_PORT_NOT_SET 642 +#define ERROR_DS_VERSION_CHECK_FAILURE 643 +#define ERROR_RANGE_NOT_FOUND 644 +#define ERROR_NOT_SAFE_MODE_DRIVER 646 +#define ERROR_FAILED_DRIVER_ENTRY 647 +#define ERROR_DEVICE_ENUMERATION_ERROR 648 +#define ERROR_MOUNT_POINT_NOT_RESOLVED 649 +#define ERROR_INVALID_DEVICE_OBJECT_PARAMETER 650 +#define ERROR_MCA_OCCURED 651 +#define ERROR_DRIVER_DATABASE_ERROR 652 +#define ERROR_SYSTEM_HIVE_TOO_LARGE 653 +#define ERROR_DRIVER_FAILED_PRIOR_UNLOAD 654 +#define ERROR_VOLSNAP_PREPARE_HIBERNATE 655 +#define ERROR_HIBERNATION_FAILURE 656 +#define ERROR_FILE_SYSTEM_LIMITATION 665 +#define ERROR_ASSERTION_FAILURE 668 +#define ERROR_ACPI_ERROR 669 +#define ERROR_WOW_ASSERTION 670 +#define ERROR_PNP_BAD_MPS_TABLE 671 +#define ERROR_PNP_TRANSLATION_FAILED 672 +#define ERROR_PNP_IRQ_TRANSLATION_FAILED 673 +#define ERROR_PNP_INVALID_ID 674 +#define ERROR_WAKE_SYSTEM_DEBUGGER 675 #define ERROR_HANDLES_CLOSED 676 +#define ERROR_EXTRANEOUS_INFORMATION 677 +#define ERROR_RXACT_COMMIT_NECESSARY 678 +#define ERROR_MEDIA_CHECK 679 +#define ERROR_GUID_SUBSTITUTION_MADE 680 +#define ERROR_STOPPED_ON_SYMLINK 681 +#define ERROR_LONGJUMP 682 +#define ERROR_PLUGPLAY_QUERY_VETOED 683 +#define ERROR_UNWIND_CONSOLIDATE 684 +#define ERROR_REGISTRY_HIVE_RECOVERED 685 +#define ERROR_DLL_MIGHT_BE_INSECURE 686 +#define ERROR_DLL_MIGHT_BE_INCOMPATIBLE 687 +#define ERROR_DBG_EXCEPTION_NOT_HANDLED 688 +#define ERROR_DBG_REPLY_LATER 689 +#define ERROR_DBG_UNABLE_TO_PROVIDE_HANDLE 690 +#define ERROR_DBG_TERMINATE_THREAD 691 +#define ERROR_DBG_TERMINATE_PROCESS 692 +#define ERROR_DBG_CONTROL_C 693 +#define ERROR_DBG_PRINTEXCEPTION_C 694 +#define ERROR_DBG_RIPEXCEPTION 695 +#define ERROR_DBG_CONTROL_BREAK 696 +#define ERROR_DBG_COMMAND_EXCEPTION 697 +#define ERROR_OBJECT_NAME_EXISTS 698 +#define ERROR_THREAD_WAS_SUSPENDED 699 +#define ERROR_IMAGE_NOT_AT_BASE 700 +#define ERROR_RXACT_STATE_CREATED 701 +#define ERROR_SEGMENT_NOTIFICATION 702 +#define ERROR_BAD_CURRENT_DIRECTORY 703 +#define ERROR_FT_READ_RECOVERY_FROM_BACKUP 704 +#define ERROR_FT_WRITE_RECOVERY 705 +#define ERROR_IMAGE_MACHINE_TYPE_MISMATCH 706 +#define ERROR_RECEIVE_PARTIAL 707 +#define ERROR_RECEIVE_EXPEDITED 708 +#define ERROR_RECEIVE_PARTIAL_EXPEDITED 709 +#define ERROR_EVENT_DONE 710 +#define ERROR_EVENT_PENDING 711 +#define ERROR_CHECKING_FILE_SYSTEM 712 +#define ERROR_FATAL_APP_EXIT 713 +#define ERROR_PREDEFINED_HANDLE 714 +#define ERROR_WAS_UNLOCKED 715 +#define ERROR_SERVICE_NOTIFICATION 716 +#define ERROR_WAS_LOCKED 717 +#define ERROR_LOG_HARD_ERROR 718 +#define ERROR_ALREADY_WIN32 719 +#define ERROR_IMAGE_MACHINE_TYPE_MISMATCH_EXE 720 +#define ERROR_NO_YIELD_PERFORMED 721 +#define ERROR_TIMER_RESUME_IGNORED 722 +#define ERROR_ARBITRATION_UNHANDLED 723 +#define ERROR_CARDBUS_NOT_SUPPORTED 724 +#define ERROR_MP_PROCESSOR_MISMATCH 725 +#define ERROR_HIBERNATED 726 +#define ERROR_RESUME_HIBERNATION 727 #define ERROR_EA_ACCESS_DENIED 994 #define ERROR_OPERATION_ABORTED 995 #define ERROR_IO_INCOMPLETE 996 @@ -1650,10 +1801,66 @@ #define ERROR_SXS_MANIFEST_PARSE_ERROR 14005 #define ERROR_SXS_ACTIVATION_CONTEXT_DISABLED 14006 #define ERROR_SXS_KEY_NOT_FOUND 14007 +#define ERROR_SXS_VERSION_CONFLICT 14008 #define ERROR_SXS_WRONG_SECTION_TYPE 14009 #define ERROR_SXS_THREAD_QUERIES_DISABLED 14010 #define ERROR_SXS_PROCESS_DEFAULT_ALREADY_SET 14011 +#define ERROR_SXS_UNKNOWN_ENCODING_GROUP 14012 +#define ERROR_SXS_UNKNOWN_ENCODING 14013 +#define ERROR_SXS_INVALID_XML_NAMESPACE_URI 14014 +#define ERROR_SXS_ROOT_MANIFEST_DEPENDENCY_NOT_INSTALLED 14015 +#define ERROR_SXS_LEAF_MANIFEST_DEPENDENCY_NOT_INSTALLED 14016 +#define ERROR_SXS_INVALID_ASSEMBLY_IDENTITY_ATTRIBUTE 14017 +#define ERROR_SXS_MANIFEST_MISSING_REQUIRED_DEFAULT_NAMESPACE 14018 +#define ERROR_SXS_MANIFEST_INVALID_REQUIRED_DEFAULT_NAMESPACE 14019 +#define ERROR_SXS_PRIVATE_MANIFEST_CROSS_PATH_WITH_REPARSE_POINT 14020 +#define ERROR_SXS_DUPLICATE_DLL_NAME 14021 +#define ERROR_SXS_DUPLICATE_WINDOWCLASS_NAME 14022 +#define ERROR_SXS_DUPLICATE_CLSID 14023 +#define ERROR_SXS_DUPLICATE_IID 14024 +#define ERROR_SXS_DUPLICATE_TLBID 14025 +#define ERROR_SXS_DUPLICATE_PROGID 14026 +#define ERROR_SXS_DUPLICATE_ASSEMBLY_NAME 14027 +#define ERROR_SXS_FILE_HASH_MISMATCH 14028 +#define ERROR_SXS_POLICY_PARSE_ERROR 14029 +#define ERROR_SXS_PROTECTION_RECOVERY_FAILED 14074 +#define ERROR_SXS_PROTECTION_PUBLIC_KEY_TOO_SHORT 14075 +#define ERROR_SXS_PROTECTION_CATALOG_NOT_VALID 14076 +#define ERROR_SXS_UNTRANSLATABLE_HRESULT 14077 +#define ERROR_SXS_PROTECTION_CATALOG_FILE_MISSING 14078 +#define ERROR_SXS_MISSING_ASSEMBLY_IDENTITY_ATTRIBUTE 14079 +#define ERROR_SXS_INVALID_ASSEMBLY_IDENTITY_ATTRIBUTE_NAME 14080 +#define ERROR_SXS_ASSEMBLY_MISSING 14081 +#define ERROR_SXS_CORRUPT_ACTIVATION_STACK 14082 #define ERROR_SXS_CORRUPTION 14083 +#define ERROR_SXS_EARLY_DEACTIVATION 14084 +#define ERROR_SXS_INVALID_DEACTIVATION 14085 +#define ERROR_SXS_MULTIPLE_DEACTIVATION 14086 +#define ERROR_SXS_PROCESS_TERMINATION_REQUESTED 14087 +#define ERROR_SXS_RELEASE_ACTIVATION_CONTEXT 14088 +#define ERROR_SXS_SYSTEM_DEFAULT_ACTIVATION_CONTEXT_EMPTY 14089 +#define ERROR_SXS_INVALID_IDENTITY_ATTRIBUTE_VALUE 14090 +#define ERROR_SXS_INVALID_IDENTITY_ATTRIBUTE_NAME 14091 +#define ERROR_SXS_IDENTITY_DUPLICATE_ATTRIBUTE 14092 +#define ERROR_SXS_IDENTITY_PARSE_ERROR 14093 +#define ERROR_SXS_IDENTITY_PARSE_ERROR 14093 +#define ERROR_MALFORMED_SUBSTITUTION_STRING 14094 +#define ERROR_SXS_INCORRECT_PUBLIC_KEY_TOKEN 14095 +#define ERROR_UNMAPPED_SUBSTITUTION_STRING 14096 +#define ERROR_SXS_ASSEMBLY_NOT_LOCKED 14097 +#define ERROR_SXS_COMPONENT_STORE_CORRUPT 14098 +#define ERROR_ADVANCED_INSTALLER_FAILED 14099 +#define ERROR_XML_ENCODING_MISMATCH 14100 +#define ERROR_SXS_MANIFEST_IDENTITY_SAME_BUT_CONTENTS_DIFFERENT 14101 +#define ERROR_SXS_IDENTITIES_DIFFERENT 14102 +#define ERROR_SXS_ASSEMBLY_IS_NOT_A_DEPLOYMENT 14103 +#define ERROR_SXS_FILE_NOT_PART_OF_ASSEMBLY 14104 +#define ERROR_SXS_MANIFEST_TOO_BIG 14105 +#define ERROR_SXS_SETTING_NOT_REGISTERED 14106 +#define ERROR_SXS_TRANSACTION_CLOSURE_INCOMPLETE 14107 +#define ERROR_SMI_PRIMITIVE_INSTALLER_FAILED 14108 +#define ERROR_GENERIC_COMMAND_FAILED 14109 +#define ERROR_SXS_FILE_HASH_MISSING 14110 #define ERROR_MUI_FILE_NOT_FOUND 15100 #define ERROR_MUI_INVALID_FILE 15101 #define ERROR_MUI_INVALID_RC_CONFIG 15102 diff -Nru wine1.3-1.3.0/include/wingdi.h wine1.3-1.3.1/include/wingdi.h --- wine1.3-1.3.0/include/wingdi.h 2010-07-30 18:43:56.000000000 +0100 +++ wine1.3-1.3.1/include/wingdi.h 2010-08-20 18:23:50.000000000 +0100 @@ -3630,6 +3630,7 @@ WINGDIAPI BOOL WINAPI Rectangle(HDC,INT,INT,INT,INT); WINGDIAPI BOOL WINAPI RectInRegion(HRGN,const RECT *); WINGDIAPI BOOL WINAPI RectVisible(HDC,const RECT*); +WINGDIAPI BOOL WINAPI RemoveFontMemResourceEx(HANDLE); WINGDIAPI BOOL WINAPI RemoveFontResourceA(LPCSTR); WINGDIAPI BOOL WINAPI RemoveFontResourceW(LPCWSTR); #define RemoveFontResource WINELIB_NAME_AW(RemoveFontResource) diff -Nru wine1.3-1.3.0/include/winsock2.h wine1.3-1.3.1/include/winsock2.h --- wine1.3-1.3.0/include/winsock2.h 2010-07-30 18:43:56.000000000 +0100 +++ wine1.3-1.3.1/include/winsock2.h 2010-08-20 18:23:50.000000000 +0100 @@ -550,7 +550,7 @@ typedef ULONG (WINAPI *LPFN_HTONL)(ULONG); typedef WS(u_short) (WINAPI *LPFN_HTONS)(WS(u_short)); typedef ULONG (WINAPI *LPFN_INET_ADDR)(const char*); -typedef char* (WINAPI *LPFN_INET_NTOA)(struct WS(in_addr); +typedef char* (WINAPI *LPFN_INET_NTOA)(struct WS(in_addr)); typedef int (WINAPI *LPFN_IOCTLSOCKET)(SOCKET,LONG,ULONG*); typedef int (WINAPI *LPFN_LISTEN)(SOCKET,int); typedef ULONG (WINAPI *LPFN_NTOHL)(ULONG); diff -Nru wine1.3-1.3.0/include/winuser.h wine1.3-1.3.1/include/winuser.h --- wine1.3-1.3.0/include/winuser.h 2010-07-30 18:43:56.000000000 +0100 +++ wine1.3-1.3.1/include/winuser.h 2010-08-20 18:23:50.000000000 +0100 @@ -711,6 +711,7 @@ #define BS_USERBUTTON 0x00000008L #define BS_AUTORADIOBUTTON 0x00000009L #define BS_OWNERDRAW 0x0000000BL +#define BS_TYPEMASK 0x0000000FL #define BS_LEFTTEXT 0x00000020L #define BS_RIGHTBUTTON BS_LEFTTEXT diff -Nru wine1.3-1.3.0/programs/clock/He.rc wine1.3-1.3.1/programs/clock/He.rc --- wine1.3-1.3.0/programs/clock/He.rc 1970-01-01 01:00:00.000000000 +0100 +++ wine1.3-1.3.1/programs/clock/He.rc 2010-08-20 18:23:50.000000000 +0100 @@ -0,0 +1,52 @@ +/* + * Clock (Hebrew resources) + * + * Copyright 1998 Marcel Baur + * Copyright 2002 Sylvain Petreolle + * Copyright 2010 Yaron Shahrabani + * + * 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 "clock_res.h" + +#pragma code_page(65001) + +LANGUAGE LANG_HEBREW, SUBLANG_DEFAULT + +MAIN_MENU MENU +{ + POPUP "&מאפיינים" { + MENUITEM "&אנלוגי", IDM_ANALOG + MENUITEM "&דיגיטלי", IDM_DIGITAL + MENUITEM SEPARATOR + MENUITEM "&גופן...", IDM_FONT + MENUITEM SEPARATOR + MENUITEM "&ללא שורת כותרת", IDM_NOTITLE + MENUITEM SEPARATOR + MENUITEM "&שניות", IDM_SECONDS + MENUITEM "&תאריך", IDM_DATE + MENUITEM SEPARATOR + MENUITEM "תמיד &עליון", IDM_ONTOP + } + POPUP "&פרטים" { + MENUITEM "על &אודות השעון...", IDM_ABOUT + } +} + +STRINGTABLE +{ +IDS_CLOCK, "שעון" +} diff -Nru wine1.3-1.3.0/programs/clock/Makefile.in wine1.3-1.3.1/programs/clock/Makefile.in --- wine1.3-1.3.0/programs/clock/Makefile.in 2010-07-30 18:43:56.000000000 +0100 +++ wine1.3-1.3.1/programs/clock/Makefile.in 2010-08-20 18:23:50.000000000 +0100 @@ -20,6 +20,7 @@ Es.rc \ Fi.rc \ Fr.rc \ + He.rc \ Hu.rc \ It.rc \ Ja.rc \ diff -Nru wine1.3-1.3.0/programs/cmd/Es.rc wine1.3-1.3.1/programs/cmd/Es.rc --- wine1.3-1.3.0/programs/cmd/Es.rc 2010-07-30 18:43:56.000000000 +0100 +++ wine1.3-1.3.1/programs/cmd/Es.rc 2010-08-20 18:23:50.000000000 +0100 @@ -262,34 +262,34 @@ WCMD_NO, "N" WCMD_NOASSOC, "Falta una asociacin de archivo para la extensin %s\n" WCMD_NOFTYPE, "Ningn comando de apertura asociado con el tipo de archivo '%s'\n" - WCMD_OVERWRITE, "Overwrite %s" + WCMD_OVERWRITE, "Sobrescribir %s" WCMD_MORESTR, "Ms..." - WCMD_TRUNCATEDLINE, "Line in Batch processing possibly truncated. Using:\n" - WCMD_NYI, "Not Yet Implemented\n\n" - WCMD_NOARG, "Argument missing\n" - WCMD_SYNTAXERR, "Syntax error\n" - WCMD_FILENOTFOUND, "%s : File Not Found\n" - WCMD_NOCMDHELP, "No help available for %s\n" - WCMD_NOTARGET, "Target to GOTO not found\n" - WCMD_CURRENTDATE, "Current Date is %s\n" - WCMD_CURRENTTIME, "Current Time is %s\n" - WCMD_NEWDATE, "Enter new date: " - WCMD_NEWTIME, "Enter new time: " - WCMD_MISSINGENV, "Environment variable %s not defined\n" - WCMD_READFAIL, "Failed to open '%s'\n" - WCMD_CALLINSCRIPT, "Cannot call batch label outside of a batch script\n" + WCMD_TRUNCATEDLINE, "Lnea en procesamiento por lotes posiblemente truncada. Usando:\n" + WCMD_NYI, "No implementado\n\n" + WCMD_NOARG, "Argumento faltante\n" + WCMD_SYNTAXERR, "Error de sintaxis\n" + WCMD_FILENOTFOUND, "%s : Archivo no encontrado\n" + WCMD_NOCMDHELP, "No hay ayuda disponible para %s\n" + WCMD_NOTARGET, "El destino de la instruccin GOTO no se ha encontrado\n" + WCMD_CURRENTDATE, "La fecha actual es %s\n" + WCMD_CURRENTTIME, "La hora actual es %s\n" + WCMD_NEWDATE, "Ingrese la nueva fecha: " + WCMD_NEWTIME, "Ingrese la nueva hora: " + WCMD_MISSINGENV, "Variable de entorno %s no definida\n" + WCMD_READFAIL, "No se pudo abrir '%s'\n" + WCMD_CALLINSCRIPT, "No se puede llamar a una etiqueta fuera de un script por lotes\n" WCMD_ALL, "A" - WCMD_DELPROMPT, "%s, Delete" - WCMD_ECHOPROMPT, "Echo is %s\n" - WCMD_VERIFYPROMPT, "Verify is %s\n" - WCMD_VERIFYERR, "Verify must be ON or OFF\n" - WCMD_ARGERR, "Parameter error\n" - WCMD_VOLUMEDETAIL, "Volume in drive %c is %s\nVolume Serial Number is %04x-%04x\n\n" - WCMD_VOLUMEPROMPT, "Volume label (11 characters, ENTER for none)?" - WCMD_NOPATH, "PATH not found\n" - WCMD_ANYKEY,"Press Return key to continue: " - WCMD_CONSTITLE,"Wine Command Prompt" - WCMD_VERSION,"CMD Version %s\n\n" - WCMD_MOREPROMPT, "More? " - WCMD_LINETOOLONG, "The input line is too long.\n" + WCMD_DELPROMPT, "%s, Borrar" + WCMD_ECHOPROMPT, "Echo es %s\n" + WCMD_VERIFYPROMPT, "Verificar es %s\n" + WCMD_VERIFYERR, "Verificar debe estar ON o OFF\n" + WCMD_ARGERR, "Error de parmetro\n" + WCMD_VOLUMEDETAIL, "El volumen en la unidad %c es %s\nEl nmero de serie del volumen es %04x-%04x\n\n" + WCMD_VOLUMEPROMPT, "Etiqueta del volumen (11 caracteres, Return para ninguno)?" + WCMD_NOPATH, "PATH no encontrado\n" + WCMD_ANYKEY,"Pulse la tecla Return para continuar: " + WCMD_CONSTITLE,"Wine Smbolo del sistema" + WCMD_VERSION,"CMD Versin %s\n\n" + WCMD_MOREPROMPT, "Ms? " + WCMD_LINETOOLONG, "La lnea de entrada es demasiado larga.\n" } diff -Nru wine1.3-1.3.0/programs/cmd/Makefile.in wine1.3-1.3.1/programs/cmd/Makefile.in --- wine1.3-1.3.0/programs/cmd/Makefile.in 2010-07-30 18:43:56.000000000 +0100 +++ wine1.3-1.3.1/programs/cmd/Makefile.in 2010-08-20 18:23:50.000000000 +0100 @@ -31,6 +31,7 @@ Ro.rc \ Ru.rc \ Si.rc \ + Sv.rc \ Tr.rc \ Uk.rc \ wcmdrc.rc diff -Nru wine1.3-1.3.0/programs/cmd/Sv.rc wine1.3-1.3.1/programs/cmd/Sv.rc --- wine1.3-1.3.0/programs/cmd/Sv.rc 1970-01-01 01:00:00.000000000 +0100 +++ wine1.3-1.3.1/programs/cmd/Sv.rc 2010-08-20 18:23:50.000000000 +0100 @@ -0,0 +1,281 @@ +/* + * Wine command prompt + * Swedish Language Support + * + * Copyright 2010 Rikard Johansson + * Paul Vriens + * + * 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 "wcmd.h" + +#pragma code_page(65001) + +LANGUAGE LANG_SWEDISH, SUBLANG_NEUTRAL + +STRINGTABLE +{ + WCMD_ATTRIB, "ATTRIB visar eller ändrar DOS-filers attribut.\n" + WCMD_CALL, +"CALL används inom en batchfil för att exekvera kommandon\n\ +från en annan batchfil. När den anropade batchfilen stängs ner, så återfår den\n\ +anropande batchfilen återigen kontrollen. Med CALL går det även att skicka med\n\ +parametrar till den anropade metoden.\n\ +\n\ +Ändringar av standardsökväg, miljövariabler o.s.v. som görs inom en anropad\n\ +process ärvs av den som anropar processen.\n" + + WCMD_CD, "CD är en synonym för CHDIR. Den används för att\nändra standardsökväg.\n" + WCMD_CHDIR, "CHDIR ändrar standardsökväg.\n" + + WCMD_CLS, "CLS rensar konsollen från text.\n" + + WCMD_COPY, "COPY kopierar en fil.\n" + WCMD_CTTY, "CTTY ändrar input/output-enheter.\n" + WCMD_DATE, "DATE visar eller ändrar systemets datum.\n" + WCMD_DEL, "DEL tar bort en eller flera filer.\n" + WCMD_DIR, "DIR visar mappens innehåll.\n" + + WCMD_ECHO, +"ECHO skriver ut i den aktuella terminalen.\n\ +\n\ +ECHO ON gör att alla följdkommandon från en batchfil skrivs ut i terminalen\n\ +innan dessa exekveras.\n\ +\n\ +ECHO OFF tar bort effekten av ett föregående ECHO ON. (ECHO är\n\ +OFF (avstängd) som standard.) Du kan förhindra ECHO OFF från att visas genom\n\ +att lägga till ett @-tecken innan kommandot.\n" + + WCMD_ERASE, "ERASE tar bort en eller flera filer.\n" + + WCMD_FOR, +"FOR används för att exekvera ett kommando var för ett flertal filer.\n\ +\n\ +Syntax: FOR %variabel IN (set) DO kommando\n\ +\n\ +Kravet att dubbla %-tecknet när FOR används i en batchfil\n\ +finns inte i Wines cmd.\n" + + WCMD_GOTO, +"Kommandot GOTO överlåter exekvering till ett annat påstående \n\ +inom en batch fil.\n\ +\n\ +En etikett, som är GOTO-kommandots mål, kan innehålla upp till 255\n\ +tecken, men blanksteg tillåts ej (till skillnad från andra operativsystem).\n\ +Om två eller flera identiska etiketter existerar i en batchfil, så kommer \n\ +alltid den första exekveras. Vid försök att använda GOTO till en icke\n\ +existerande etikett så avbryts batchfilens exekvering.\n\ +\n\ +GOTO har ingen effekt när det används interaktivt.\n" + + WCMD_HELP, "HELP skriver ut mer detaljerad information ang. ämnet.\nHELP utan ett argument visar alla inbyggda CMD-kommandon.\n" + + WCMD_IF, +"IF används för att villkorligt exekvera ett kommando.\n\ +\n\ +Syntax: IF [NOT] EXIST filnamn kommando\n\ + IF [NOT] sträng1==sträng2 kommando\n\ + IF [NOT] ERRORLEVEL nummer kommando\n\ +\n\ +I den andra IF-satsen måste sträng1 och sträng2 vara inom citattecken.\n\ +IF bryr sej inte om stora eller små bokstäver. D.v.s. gemener och versaler.\n" + + WCMD_LABEL, "LABEL används för att ge en hårddisk/enhet ett namn.\n\ +\n\ +Syntax: LABEL [diskvolym:]\n\ +Kommandot kommer fråga dig efter enhetens nya namn.\n\ +Du kan visa enhetens namn genom att använda kommandot VOL.\n" + + WCMD_MD, +"MD är en synonym för MKDIR. \nDen skapar en ny mapp i mappen du befinner dig i\n" + WCMD_MKDIR, "MKDIR skapar en ny mapp i mappen du befinner dig i.\n" + WCMD_MOVE, +"MOVE flyttar en fil eller mapp till ett nytt ställe inom filsystemet.\n\ +\n\ +Om du flyttar på en mapp, så flyttas allting under mappen med.\n\ +\n\ +MOVE misslyckas om den gamla och det den nya stället är på olika\n\ +DOS-enhetsbokstäver. Till exempel från C: till D:.\n" + + WCMD_PATH, +"PATH visar eller ändrar cmd:s sökväg.\n\ +\n\ +Om du skriver enbart PATH så visas den aktuella sökvägen \n\ +(som står i windowsregistret). För att ändra på denna inställning,\n\ +skriv PATH och sedan den nya sökvägen.\n\ +\n\ +Det går också att ändra PATH genom att använda PATH:s miljövariabler.\n\ +Till exempel:\n\ + PATH %PATH%;c:\\temp\n" + + WCMD_PAUSE, +"PAUSE visar meddelandet 'Tryck enterknappen för att fortsätta'\n\ +och väntar på att användaren skall trycka ner enterknappen.\n\ +PAUSE används mestadels i batchfiler så att användare hinner läsa\n\ +till exempel resultatet av ett kört kommando m.m. innan det rullar av skärmen.\n" + + WCMD_PROMPT, +"PROMPT aktiverar kommando-prompten.\n\ +\n\ +Inmatad sträng efter PROMPT-kommandot (och följande blanksteg)\n\ +visas i början av nästa rad, när cmd väntar på inmatning.\n\ +\n\ +Följande tecken betyder:\n\ +\n\ +$$ Dollartecknet $_ Fyll rad $b \"skicka vidare\"-tecknet (|)\n\ +$d Nuvarande datum $e Escape $g \">\"-tecknet\n\ +$l \"<\"-tecknet $n Befintlig enhet $p Nuvarande sökväg\n\ +$q \"=\"-tecknet $t Nuvarande tid $v cmd-version\n\ +\n\ +Notera att om PROMPT används utan en inmatning, så återställs\n\ +prompten till tidigare läge, d.v.s tidigare sökväg\n\ +(enhetstecken inkluderat) och ett större än-tecken (>).\n\ +(Som kommandot PROMPT $p$g).\n\ +\n\ +Prompteen går att ändra genom att modifiera miljövariabeln PROMPT,\n\ +så kommandot 'SET PROMPT=text' har samma effekt som 'PROMPT text'\n" + + WCMD_REM, +"En kommandorad som börjar på REM (med ett blanksteg efter) ignoreras.\n\ +Därav kan REM användas för att kommentera rader i en batchfil.\n" + + WCMD_REN, +"REN är en synonym för kommandot RENAME.\nREN döper om en fil.\n" + WCMD_RENAME, "RENAME döper om en fil.\n" + WCMD_RD, +"RD är en synonym för RMDIR. RD tar bort vald plats.\n" + WCMD_RMDIR, "RMDIR tar bort vald plats.\n" + + WCMD_SET, +"SET visar eller ändrar cmd:s miljövariabler.\n\ +\n\ +SET utan någon parameter visar alla befintliga miljövariabler.\n\ +\n\ +Syntaxen för att skapa eller ändra en miljövariabler är:\n\ +\n\ + SET =\n\ +\n\ +där och är teckensträngar. Inga blanksteg är\n\ +tillåtna varken innan lika med tecknet eller inom variabel namnet.\n\ +\n\ +I Wine inkluderas miljövariabler från det underliggande operativsystemet\n\ +i Win32 vilket resulterar i att det finns många fler värden\n\ +än i en riktig Win32-implementation. Notera att det inte går att påverka\n\ +operativsystemets miljövariabler via cmd.\n" + + WCMD_SHIFT, +"SHIFT används i batchfiler för att ta bort en parameter högst upp på listan.\nParametrar i turordning flyttas ner ett steg, parameter 2 blir parameter 1 o.s.v.\nSHIFT har ingen effekt om det anropas ifrån kommandoraden.\n" + + WCMD_TIME, "TIME ställer in eller skriver ut ditt systems tid.\n" + + WCMD_TITLE, "Ändrar fönsternamn för cmd-fönstret. Syntax: TITLE [namn]\n" + + WCMD_TYPE, +"TYPE kopierar till konsollen (eller annanstans om\n\ +angivet). TYPE kollar inte vad filen i fråga är för typ av fil.\n" + + WCMD_VERIFY, +"VERIFY används för att ställa in, rensa eller testa verifieraflaggan.\n\ +Godkänd användning är:\n\ +\n\ +VERIFY ON\tTillämpa flaggan\n\ +VERIFY OFF\tRensa flaggan\n\ +VERIFY\t\tVisar tillstånd på VERIFY. ON eller OFF.\n\ +\n\ +Det finns dock ingen användning för verifieraflaggor i Wine.\n" + + WCMD_VER, +"VER visar cmd:s version.\n" + + WCMD_VOL, "VOL visar namnet på en diskvolym.\n" + + WCMD_PUSHD, "PUSHD sparar nuvarande sökväg i en stack,\n\ +och ändrar sedan sökvägen till den angivna mappen.\n" + + WCMD_POPD, "POPD ändrar nuvarande sökväg till den senast angivna i PUSHD.\n" + + WCMD_MORE, "MORE skriver ut filers utskrift eller vidarebefodrade förfrågningar på sidor.\n" + + WCMD_EXIT, +"EXIT avslutar cmd och skickar tillbaks användaren till\n\ +operativsystemet eller skalet som cmd startades ifrån.\n" + + WCMD_ALLHELP, "CMD:s inbyggda kommandon är:\n\ +ATTRIB\t\tVisa eller ändra DOS-filers attribut\n\ +CALL\t\tAnropar en batchfil inifrån en annan \n\ +CD (CHDIR)\tÄndrar nuvarande standardsökväg\n\ +CLS\t\tRensar konsollen\n\ +COPY\t\tKopierar en fil\n\ +CTTY\t\tÄndrar input/output-enhet\n\ +DATE\t\tVisar eller ändrar systemets tid\n\ +DEL (ERASE)\tTar bort en eller flera filer\n\ +DIR\t\tVisar innehållet av en mapp\n\ +ECHO\t\tKopierar och skriver ut inmatad text\n\ +HELP\t\tVisar hjälpavsnitt om specificerat område\n\ +MD (MKDIR)\tSkapar en mapp i sökvägen\n\ +MORE\t\tVisar resultatet i sidor\n\ +MOVE\t\tFlyttar en fil eller en mapp med alla dess filer/mappar under\n\ +PATH\t\tVisar eller ställer in sökvägen\n\ +POPD\t\tÅterställer mappen till sökvägen sist sparad med PUSHD.\n\ +PROMPT\t\tÄndrar kommandoprompten\n\ +PUSHD\t\tSparar den nuvarande sökvägen i en stack\n\ +REN (RENAME)\tDöper om en fil\n\ +RD (RMDIR)\tTar bort en mapp\n\ +SET\t\tVisar eller ställer in miljövariabler\n\ +TIME\t\tVisar eller ställer in systemets tid\n\ +TITLE\t\tStäller in titeln för CMD:s session\n\ +TYPE\t\tSkriver ut innehållet av en fil\n\ +VER\t\tVisar CMD:s version\n\ +VOL\t\tVisar namnet på specificerad enhet\n\ +EXIT\t\tStänger CMD\n\n\ +Skriv HELP för mer information om något av kommandona ovanför\n" + + WCMD_CONFIRM, "Är du säker?" + WCMD_YES, "J" + WCMD_NO, "N" + WCMD_NOASSOC, "Det finns ingen filassociation för detta filformat %s\n" + WCMD_NOFTYPE, "Ingen kommando förknippat med filtyp '%s'\n" + WCMD_OVERWRITE, "Skriva över %s" + WCMD_MORESTR, "Mer..." + WCMD_TRUNCATEDLINE, "En rad i batch möjligtvis trunkerad. Använder:\n" + WCMD_NYI, "Ännu ej implementerat\n\n" + WCMD_NOARG, "Argument saknas\n" + WCMD_SYNTAXERR, "Syntaxfel\n" + WCMD_FILENOTFOUND, "%s : kunde inte hitta filen\n" + WCMD_NOCMDHELP, "Ingen hjälp tillgänglig för %s\n" + WCMD_NOTARGET, "Mål för GOTO ej funnet\n" + WCMD_CURRENTDATE, "Dagens datum är %s\n" + WCMD_CURRENTTIME, "Tiden är %s\n" + WCMD_NEWDATE, "Skriv nytt datum: " + WCMD_NEWTIME, "Skriv in den nya tiden: " + WCMD_MISSINGENV, "Miljövariabeln %s ej definierad\n" + WCMD_READFAIL, "Misslyckades med att öppna '%s'\n" + WCMD_CALLINSCRIPT, "Går ej att anropa en batchetikett utanför ett batchskript\n" + WCMD_ALL, "A" + WCMD_DELPROMPT, "%s, ta bort" + WCMD_ECHOPROMPT, "Ekot är %s\n" + WCMD_VERIFYPROMPT, "Verifiera blev %s\n" + WCMD_VERIFYERR, "Verifiera måste vara ON (på) eller OFF (av)\n" + WCMD_ARGERR, "Parameterfel\n" + WCMD_VOLUMEDETAIL, "Diskvolymen på hårddisk %c är %s\nDiskvolymens serienummer är %04x-%04x\n" + WCMD_VOLUMEPROMPT, "Diskvolymens namn (11 karaktärer, tryck enter för inget)?" + WCMD_NOPATH, "Sökväg ej funnen\n" + WCMD_ANYKEY,"Tryck enter för att fortsätta: " + WCMD_CONSTITLE,"Wine kommandoprompt" + WCMD_VERSION,"CMD Version %s\n" + WCMD_MOREPROMPT, "Mer? " + WCMD_LINETOOLONG, "Inmatningen är för lång.\n" +} diff -Nru wine1.3-1.3.0/programs/explorer/systray.c wine1.3-1.3.1/programs/explorer/systray.c --- wine1.3-1.3.0/programs/explorer/systray.c 2010-07-30 18:43:56.000000000 +0100 +++ wine1.3-1.3.1/programs/explorer/systray.c 2010-08-20 18:23:50.000000000 +0100 @@ -340,6 +340,7 @@ icon->owner = nid->hWnd; icon->display = -1; + if (list_empty( &icon_list )) SetTimer( tray_window, 1, 2000, NULL ); list_add_tail(&icon_list, &icon->entry); modify_icon( icon, nid ); @@ -355,6 +356,7 @@ list_remove(&icon->entry); DestroyIcon(icon->image); HeapFree(GetProcessHeap(), 0, icon); + if (list_empty( &icon_list )) KillTimer( tray_window, 1 ); return TRUE; } @@ -596,6 +598,4 @@ } if (hide_systray) do_hide_systray(); - - SetTimer( tray_window, 1, 2000, NULL ); } diff -Nru wine1.3-1.3.0/programs/ipconfig/De.rc wine1.3-1.3.1/programs/ipconfig/De.rc --- wine1.3-1.3.0/programs/ipconfig/De.rc 1970-01-01 01:00:00.000000000 +0100 +++ wine1.3-1.3.1/programs/ipconfig/De.rc 2010-08-20 18:23:50.000000000 +0100 @@ -0,0 +1,47 @@ +/* + * IP configuration utility + * German language support + * + * Copyright 2010 André Hentschel + * + * 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 "ipconfig.h" + +#pragma code_page(65001) + +LANGUAGE LANG_GERMAN, SUBLANG_NEUTRAL + +STRINGTABLE +{ + STRING_USAGE, "Gebrauch: ipconfig [ /? | /all ]\n" + STRING_INVALID_CMDLINE, "Fehler: Unbekannte oder ungültige Kommandozeilenparameter angegeben\n" + STRING_ADAPTER_FRIENDLY, "%s Adapter %s\n" + STRING_ETHERNET, "Ethernet" + STRING_UNKNOWN, "Unbekannt" + STRING_CONN_DNS_SUFFIX, "Verbindungsspezifisches DNS-Suffix" + STRING_IP_ADDRESS, "IP-Adresse" + STRING_HOSTNAME, "Hostname" + STRING_NODE_TYPE, "Knotentyp" + STRING_BROADCAST, "Broadcast" + STRING_PEER_TO_PEER, "Peer-to-peer" + STRING_MIXED, "Mixed" + STRING_HYBRID, "Hybrid" + STRING_IP_ROUTING, "IP-Routing aktiviert" + STRING_DESCRIPTION, "Beschreibung" + STRING_PHYS_ADDR, "Physikalische Adresse" + STRING_DHCP_ENABLED, "DHCP aktiviert" +} diff -Nru wine1.3-1.3.0/programs/ipconfig/En.rc wine1.3-1.3.1/programs/ipconfig/En.rc --- wine1.3-1.3.0/programs/ipconfig/En.rc 1970-01-01 01:00:00.000000000 +0100 +++ wine1.3-1.3.1/programs/ipconfig/En.rc 2010-08-20 18:23:50.000000000 +0100 @@ -0,0 +1,45 @@ +/* + * IP configuration utility + * English language support + * + * Copyright 2010 Andrew Nguyen + * + * 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 "ipconfig.h" + +LANGUAGE LANG_ENGLISH, SUBLANG_DEFAULT + +STRINGTABLE +{ + STRING_USAGE, "Usage: ipconfig [ /? | /all ]\n" + STRING_INVALID_CMDLINE, "Error: Unknown or invalid command line parameters specified\n" + STRING_ADAPTER_FRIENDLY, "%s adapter %s\n" + STRING_ETHERNET, "Ethernet" + STRING_UNKNOWN, "Unknown" + STRING_CONN_DNS_SUFFIX, "Connection-specific DNS suffix" + STRING_IP_ADDRESS, "IP address" + STRING_HOSTNAME, "Hostname" + STRING_NODE_TYPE, "Node type" + STRING_BROADCAST, "Broadcast" + STRING_PEER_TO_PEER, "Peer-to-peer" + STRING_MIXED, "Mixed" + STRING_HYBRID, "Hybrid" + STRING_IP_ROUTING, "IP routing enabled" + STRING_DESCRIPTION, "Description" + STRING_PHYS_ADDR, "Physical address" + STRING_DHCP_ENABLED, "DHCP enabled" +} diff -Nru wine1.3-1.3.0/programs/ipconfig/Fr.rc wine1.3-1.3.1/programs/ipconfig/Fr.rc --- wine1.3-1.3.0/programs/ipconfig/Fr.rc 1970-01-01 01:00:00.000000000 +0100 +++ wine1.3-1.3.1/programs/ipconfig/Fr.rc 2010-08-20 18:23:50.000000000 +0100 @@ -0,0 +1,47 @@ +/* + * IP configuration utility (French resources) + * + * Copyright 2010 Frédéric Delanoy + * + * 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 "ipconfig.h" + +/* UTF-8 */ +#pragma code_page(65001) + +LANGUAGE LANG_FRENCH, SUBLANG_NEUTRAL + +STRINGTABLE +{ + STRING_USAGE, "Usage : ipconfig [ /? | /all ]\n" + STRING_INVALID_CMDLINE, "Erreur : les paramètres de ligne de commande spécifiés sont inconnus ou invalides\n" + STRING_ADAPTER_FRIENDLY, "Adaptateur %s %s\n" + STRING_ETHERNET, "Ethernet" + STRING_UNKNOWN, "Inconnu" + STRING_CONN_DNS_SUFFIX, "Suffixe DNS propre à la connexion" + STRING_IP_ADDRESS, "Adresse IP" + STRING_HOSTNAME, "Nom d'hôte" + STRING_NODE_TYPE, "Type de nœud" + STRING_BROADCAST, "Diffusion" + STRING_PEER_TO_PEER, "Pair à pair" + STRING_MIXED, "Mixte" + STRING_HYBRID, "Hybride" + STRING_IP_ROUTING, "Routage IP activé" + STRING_DESCRIPTION, "Description" + STRING_PHYS_ADDR, "Adresse physique" + STRING_DHCP_ENABLED, "DHCP activé" +} diff -Nru wine1.3-1.3.0/programs/ipconfig/ipconfig.c wine1.3-1.3.1/programs/ipconfig/ipconfig.c --- wine1.3-1.3.0/programs/ipconfig/ipconfig.c 1970-01-01 01:00:00.000000000 +0100 +++ wine1.3-1.3.1/programs/ipconfig/ipconfig.c 2010-08-20 18:23:50.000000000 +0100 @@ -0,0 +1,360 @@ +/* + * IP configuration utility + * + * Copyright 2008 Andrew Riedi + * Copyright 2010 Andrew Nguyen + * + * 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 "ipconfig.h" + +WINE_DEFAULT_DEBUG_CHANNEL(ipconfig); + +static int ipconfig_vprintfW(const WCHAR *msg, va_list va_args) +{ + int wlen; + DWORD count, ret; + WCHAR msg_buffer[8192]; + + wlen = vsprintfW(msg_buffer, msg, va_args); + + ret = WriteConsoleW(GetStdHandle(STD_OUTPUT_HANDLE), msg_buffer, wlen, &count, NULL); + if (!ret) + { + DWORD len; + char *msgA; + + len = WideCharToMultiByte(GetConsoleOutputCP(), 0, msg_buffer, wlen, + NULL, 0, NULL, NULL); + msgA = HeapAlloc(GetProcessHeap(), 0, len); + if (!msgA) + return 0; + + WideCharToMultiByte(GetConsoleOutputCP(), 0, msg_buffer, wlen, msgA, len, + NULL, NULL); + WriteFile(GetStdHandle(STD_OUTPUT_HANDLE), msgA, len, &count, FALSE); + HeapFree(GetProcessHeap(), 0, msgA); + } + + return count; +} + +static int ipconfig_printfW(const WCHAR *msg, ...) +{ + va_list va_args; + int len; + + va_start(va_args, msg); + len = ipconfig_vprintfW(msg, va_args); + va_end(va_args); + + return len; +} + +static int ipconfig_message_printfW(int msg, ...) +{ + va_list va_args; + WCHAR msg_buffer[8192]; + int len; + + LoadStringW(GetModuleHandleW(NULL), msg, msg_buffer, + sizeof(msg_buffer)/sizeof(WCHAR)); + + va_start(va_args, msg); + len = ipconfig_vprintfW(msg_buffer, va_args); + va_end(va_args); + + return len; +} + +static int ipconfig_message(int msg) +{ + static const WCHAR formatW[] = {'%','s',0}; + WCHAR msg_buffer[8192]; + + LoadStringW(GetModuleHandleW(NULL), msg, msg_buffer, + sizeof(msg_buffer)/sizeof(WCHAR)); + + return ipconfig_printfW(formatW, msg_buffer); +} + +static const WCHAR *iftype_to_string(DWORD type) +{ + static WCHAR msg_buffer[50]; + + int msg; + + switch (type) + { + case IF_TYPE_ETHERNET_CSMACD: + /* The loopback adapter appears as an Ethernet device. */ + case IF_TYPE_SOFTWARE_LOOPBACK: + msg = STRING_ETHERNET; + break; + default: + msg = STRING_UNKNOWN; + } + + LoadStringW(GetModuleHandleW(NULL), msg, msg_buffer, + sizeof(msg_buffer)/sizeof(WCHAR)); + + return msg_buffer; +} + +static void print_field(int msg, const WCHAR *value) +{ + static const WCHAR formatW[] = {' ',' ',' ',' ','%','s',':',' ','%','s','\n',0}; + + WCHAR field[] = {'.',' ','.',' ','.',' ','.',' ','.',' ','.',' ','.',' ','.',' ','.', + ' ','.',' ','.',' ','.',' ','.',' ','.',' ','.',' ','.',' ','.',' ',0}; + WCHAR name_buffer[sizeof(field)/sizeof(WCHAR)]; + + LoadStringW(GetModuleHandleW(NULL), msg, name_buffer, sizeof(name_buffer)/sizeof(WCHAR)); + memcpy(field, name_buffer, sizeof(WCHAR) * min(strlenW(name_buffer), sizeof(field)/sizeof(WCHAR) - 1)); + + ipconfig_printfW(formatW, field, value); +} + +static void print_basic_information(void) +{ + IP_ADAPTER_ADDRESSES *adapters; + ULONG out = 0; + + if (GetAdaptersAddresses(AF_UNSPEC, 0, NULL, NULL, &out) == ERROR_BUFFER_OVERFLOW) + { + adapters = HeapAlloc(GetProcessHeap(), 0, out); + if (!adapters) + exit(1); + + if (GetAdaptersAddresses(AF_UNSPEC, 0, NULL, adapters, &out) == ERROR_SUCCESS) + { + IP_ADAPTER_ADDRESSES *p; + + for (p = adapters; p; p = p->Next) + { + static const WCHAR newlineW[] = {'\n',0}; + + IP_ADAPTER_UNICAST_ADDRESS *addr; + + ipconfig_message_printfW(STRING_ADAPTER_FRIENDLY, iftype_to_string(p->IfType), p->FriendlyName); + ipconfig_printfW(newlineW); + print_field(STRING_CONN_DNS_SUFFIX, p->DnsSuffix); + + for (addr = p->FirstUnicastAddress; addr; addr = addr->Next) + { + WCHAR addr_buf[54]; + DWORD len = sizeof(addr_buf)/sizeof(WCHAR); + + if (WSAAddressToStringW(addr->Address.lpSockaddr, + addr->Address.iSockaddrLength, NULL, + addr_buf, &len) == 0) + print_field(STRING_IP_ADDRESS, addr_buf); + /* FIXME: Output corresponding subnet mask. */ + } + + /* FIXME: Output default gateway address. */ + ipconfig_printfW(newlineW); + } + } + + HeapFree(GetProcessHeap(), 0, adapters); + } +} + +static const WCHAR *nodetype_to_string(DWORD type) +{ + static WCHAR msg_buffer[50]; + + int msg; + + switch (type) + { + case BROADCAST_NODETYPE: + msg = STRING_BROADCAST; + break; + case PEER_TO_PEER_NODETYPE: + msg = STRING_PEER_TO_PEER; + break; + case MIXED_NODETYPE: + msg = STRING_MIXED; + break; + case HYBRID_NODETYPE: + msg = STRING_HYBRID; + break; + default: + msg = STRING_UNKNOWN; + } + + LoadStringW(GetModuleHandleW(NULL), msg, msg_buffer, + sizeof(msg_buffer)/sizeof(WCHAR)); + + return msg_buffer; +} + +static WCHAR *physaddr_to_string(WCHAR *buf, BYTE *addr, DWORD len) +{ + static const WCHAR fmtW[] = {'%','0','2','X','-',0}; + static const WCHAR fmt2W[] = {'%','0','2','X',0}; + + if (!len) + *buf = '\0'; + else + { + WCHAR *p = buf; + DWORD i; + + for (i = 0; i < len - 1; i++) + { + sprintfW(p, fmtW, addr[i]); + p += 3; + } + sprintfW(p, fmt2W, addr[i]); + } + + return buf; +} + +static void print_full_information(void) +{ + static const WCHAR yesW[] = {'Y','e','s',0}; + static const WCHAR noW[] = {'N','o',0}; + static const WCHAR newlineW[] = {'\n',0}; + + FIXED_INFO *info; + IP_ADAPTER_ADDRESSES *adapters; + ULONG out = 0; + + if (GetNetworkParams(NULL, &out) == ERROR_BUFFER_OVERFLOW) + { + info = HeapAlloc(GetProcessHeap(), 0, out); + if (!info) + exit(1); + + if (GetNetworkParams(info, &out) == ERROR_SUCCESS) + { + WCHAR hostnameW[MAX_HOSTNAME_LEN + 4]; + + MultiByteToWideChar(CP_ACP, 0, info->HostName, -1, hostnameW, sizeof(hostnameW)); + print_field(STRING_HOSTNAME, hostnameW); + + /* FIXME: Output primary DNS suffix. */ + + print_field(STRING_NODE_TYPE, nodetype_to_string(info->NodeType)); + print_field(STRING_IP_ROUTING, info->EnableRouting ? yesW : noW); + + /* FIXME: Output WINS proxy status and DNS suffix search list. */ + + ipconfig_printfW(newlineW); + } + + HeapFree(GetProcessHeap(), 0, info); + } + + if (GetAdaptersAddresses(AF_UNSPEC, 0, NULL, NULL, &out) == ERROR_BUFFER_OVERFLOW) + { + adapters = HeapAlloc(GetProcessHeap(), 0, out); + if (!adapters) + exit(1); + + if (GetAdaptersAddresses(AF_UNSPEC, 0, NULL, adapters, &out) == ERROR_SUCCESS) + { + IP_ADAPTER_ADDRESSES *p; + + for (p = adapters; p; p = p->Next) + { + IP_ADAPTER_UNICAST_ADDRESS *addr; + WCHAR physaddr_buf[3 * MAX_ADAPTER_ADDRESS_LENGTH]; + + ipconfig_message_printfW(STRING_ADAPTER_FRIENDLY, iftype_to_string(p->IfType), p->FriendlyName); + ipconfig_printfW(newlineW); + print_field(STRING_CONN_DNS_SUFFIX, p->DnsSuffix); + print_field(STRING_DESCRIPTION, p->Description); + print_field(STRING_PHYS_ADDR, physaddr_to_string(physaddr_buf, p->PhysicalAddress, p->PhysicalAddressLength)); + print_field(STRING_DHCP_ENABLED, (p->Flags & IP_ADAPTER_DHCP_ENABLED) ? yesW : noW); + + /* FIXME: Output autoconfiguration status. */ + + for (addr = p->FirstUnicastAddress; addr; addr = addr->Next) + { + WCHAR addr_buf[54]; + DWORD len = sizeof(addr_buf)/sizeof(WCHAR); + + if (WSAAddressToStringW(addr->Address.lpSockaddr, + addr->Address.iSockaddrLength, NULL, + addr_buf, &len) == 0) + print_field(STRING_IP_ADDRESS, addr_buf); + /* FIXME: Output corresponding subnet mask. */ + } + + /* FIXME: Output default gateway address. */ + + ipconfig_printfW(newlineW); + } + } + + HeapFree(GetProcessHeap(), 0, adapters); + } +} + +int wmain(int argc, WCHAR *argv[]) +{ + static const WCHAR slashHelp[] = {'/','?',0}; + static const WCHAR slashAll[] = {'/','a','l','l',0}; + + WSADATA data; + + if (WSAStartup(MAKEWORD(2, 2), &data)) + return 1; + + if (argc > 1) + { + if (!strcmpW(slashHelp, argv[1])) + { + ipconfig_message(STRING_USAGE); + WSACleanup(); + return 1; + } + else if (!strcmpiW(slashAll, argv[1])) + { + if (argv[2]) + { + ipconfig_message(STRING_INVALID_CMDLINE); + ipconfig_message(STRING_USAGE); + WSACleanup(); + return 1; + } + + print_full_information(); + } + else + { + ipconfig_message(STRING_INVALID_CMDLINE); + ipconfig_message(STRING_USAGE); + WSACleanup(); + return 1; + } + } + else + print_basic_information(); + + WSACleanup(); + return 0; +} diff -Nru wine1.3-1.3.0/programs/ipconfig/ipconfig.h wine1.3-1.3.1/programs/ipconfig/ipconfig.h --- wine1.3-1.3.0/programs/ipconfig/ipconfig.h 1970-01-01 01:00:00.000000000 +0100 +++ wine1.3-1.3.1/programs/ipconfig/ipconfig.h 2010-08-20 18:23:50.000000000 +0100 @@ -0,0 +1,40 @@ +/* + * IP configuration utility private definitions + * + * Copyright 2010 Andrew Nguyen + * + * 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 + +/* Translation IDs. */ +#define STRING_USAGE 101 +#define STRING_INVALID_CMDLINE 102 +#define STRING_ADAPTER_FRIENDLY 103 +#define STRING_ETHERNET 104 +#define STRING_UNKNOWN 105 +#define STRING_CONN_DNS_SUFFIX 106 +#define STRING_IP_ADDRESS 107 +#define STRING_HOSTNAME 108 +#define STRING_NODE_TYPE 109 +#define STRING_BROADCAST 110 +#define STRING_PEER_TO_PEER 111 +#define STRING_MIXED 112 +#define STRING_HYBRID 113 +#define STRING_IP_ROUTING 114 +#define STRING_DESCRIPTION 115 +#define STRING_PHYS_ADDR 116 +#define STRING_DHCP_ENABLED 117 diff -Nru wine1.3-1.3.0/programs/ipconfig/It.rc wine1.3-1.3.1/programs/ipconfig/It.rc --- wine1.3-1.3.0/programs/ipconfig/It.rc 1970-01-01 01:00:00.000000000 +0100 +++ wine1.3-1.3.1/programs/ipconfig/It.rc 2010-08-20 18:23:50.000000000 +0100 @@ -0,0 +1,49 @@ +/* + * IP configuration utility + * Italian language support + * + * Copyright 2010 Andrew Nguyen + * Copyright 2010 Luca Bennati + * + * 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 "ipconfig.h" + +/* UTF-8 */ +#pragma code_page(65001) + +LANGUAGE LANG_ITALIAN, SUBLANG_NEUTRAL + +STRINGTABLE +{ + STRING_USAGE, "Uso: ipconfig [ /? | /all ]\n" + STRING_INVALID_CMDLINE, "Errore: i parametri specificati della riga di comando sono sconosciuti o non validi\n" + STRING_ADAPTER_FRIENDLY, "%s adattatore %s\n" + STRING_ETHERNET, "Ethernet" + STRING_UNKNOWN, "Sconosciuto" + STRING_CONN_DNS_SUFFIX, "Suffisso DNS specifico per la connessione" + STRING_IP_ADDRESS, "Indirizzo IP" + STRING_HOSTNAME, "Nome host" + STRING_NODE_TYPE, "Tipo nodo" + STRING_BROADCAST, "Broadcast" + STRING_PEER_TO_PEER, "Peer-to-peer" + STRING_MIXED, "Misto" + STRING_HYBRID, "Ibrido" + STRING_IP_ROUTING, "IP routing abilitato" + STRING_DESCRIPTION, "Descrizione" + STRING_PHYS_ADDR, "Indirizzo fisico" + STRING_DHCP_ENABLED, "DHCP abilitato" +} diff -Nru wine1.3-1.3.0/programs/ipconfig/Lt.rc wine1.3-1.3.1/programs/ipconfig/Lt.rc --- wine1.3-1.3.0/programs/ipconfig/Lt.rc 1970-01-01 01:00:00.000000000 +0100 +++ wine1.3-1.3.1/programs/ipconfig/Lt.rc 2010-08-20 18:23:50.000000000 +0100 @@ -0,0 +1,48 @@ +/* + * IP configuration utility + * Lithuanian language support + * + * Copyright 2010 Aurimas Fišeras + * + * 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 "ipconfig.h" + +/* UTF-8 */ +#pragma code_page(65001) + +LANGUAGE LANG_LITHUANIAN, SUBLANG_NEUTRAL + +STRINGTABLE +{ + STRING_USAGE, "Naudojimas: ipconfig [ /? | /all ]\n" + STRING_INVALID_CMDLINE, "Klaida: nurodytas nežinomas arba netinkamas komandinės eilutės parametras\n" + STRING_ADAPTER_FRIENDLY, "%s adapteris %s\n" + STRING_ETHERNET, "Eterneto" + STRING_UNKNOWN, "Nežinomas" + STRING_CONN_DNS_SUFFIX, "Ryšiui būdingas DNS sufiksas" + STRING_IP_ADDRESS, "IP adresas" + STRING_HOSTNAME, "Kompiuterio vardas" + STRING_NODE_TYPE, "Mazgo tipas" + STRING_BROADCAST, "Transliavimas" + STRING_PEER_TO_PEER, "Lygiarangis" + STRING_MIXED, "Maišytas" + STRING_HYBRID, "Mišrusis" + STRING_IP_ROUTING, "IP maršruto parinkimas įjungtas" + STRING_DESCRIPTION, "Aprašas" + STRING_PHYS_ADDR, "Fizinis adresas" + STRING_DHCP_ENABLED, "DHCP įjungta" +} diff -Nru wine1.3-1.3.0/programs/ipconfig/Makefile.in wine1.3-1.3.1/programs/ipconfig/Makefile.in --- wine1.3-1.3.0/programs/ipconfig/Makefile.in 1970-01-01 01:00:00.000000000 +0100 +++ wine1.3-1.3.1/programs/ipconfig/Makefile.in 2010-08-20 18:23:50.000000000 +0100 @@ -0,0 +1,21 @@ +EXTRADEFS = -DWINE_NO_UNICODE_MACROS +TOPSRCDIR = @top_srcdir@ +TOPOBJDIR = ../.. +SRCDIR = @srcdir@ +VPATH = @srcdir@ +MODULE = ipconfig.exe +APPMODE = -mconsole -municode +IMPORTS = iphlpapi ws2_32 user32 + +C_SRCS = ipconfig.c + +RC_SRCS = \ + De.rc \ + En.rc \ + Fr.rc \ + It.rc \ + Lt.rc \ + Sv.rc \ + Uk.rc + +@MAKE_PROG_RULES@ diff -Nru wine1.3-1.3.0/programs/ipconfig/Sv.rc wine1.3-1.3.1/programs/ipconfig/Sv.rc --- wine1.3-1.3.0/programs/ipconfig/Sv.rc 1970-01-01 01:00:00.000000000 +0100 +++ wine1.3-1.3.1/programs/ipconfig/Sv.rc 2010-08-20 18:23:50.000000000 +0100 @@ -0,0 +1,47 @@ +/* + * IP configuration utility + * Swedish language support + * + * Copyright 2010 Anders Jonsson + * + * 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 "ipconfig.h" + +#pragma code_page(65001) + +LANGUAGE LANG_SWEDISH, SUBLANG_NEUTRAL + +STRINGTABLE +{ + STRING_USAGE, "Användning: ipconfig [ /? | /all ]\n" + STRING_INVALID_CMDLINE, "Fel: Okända eller ogiltiga kommandoradsparametrar angavs\n" + STRING_ADAPTER_FRIENDLY, "%s-adapter %s\n" + STRING_ETHERNET, "Ethernet" + STRING_UNKNOWN, "Okänd" + STRING_CONN_DNS_SUFFIX, "Anslutningsspecifikt DNS-suffix" + STRING_IP_ADDRESS, "IP-adress" + STRING_HOSTNAME, "Värdnamn" + STRING_NODE_TYPE, "Nodtyp" + STRING_BROADCAST, "Broadcast" + STRING_PEER_TO_PEER, "Peer-to-peer" + STRING_MIXED, "Mixad" + STRING_HYBRID, "Hybrid" + STRING_IP_ROUTING, "IP-routning aktiverad" + STRING_DESCRIPTION, "Beskrivning" + STRING_PHYS_ADDR, "Fysisk adress" + STRING_DHCP_ENABLED, "DHCP aktiverat" +} diff -Nru wine1.3-1.3.0/programs/ipconfig/Uk.rc wine1.3-1.3.1/programs/ipconfig/Uk.rc --- wine1.3-1.3.0/programs/ipconfig/Uk.rc 1970-01-01 01:00:00.000000000 +0100 +++ wine1.3-1.3.1/programs/ipconfig/Uk.rc 2010-08-20 18:23:50.000000000 +0100 @@ -0,0 +1,49 @@ +/* + * IP configuration utility + * Ukrainian language support + * + * Copyright 2010 Andrew Nguyen + * Copyright 2010 Igor Paliychuk + * + * 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 "ipconfig.h" + +/* UTF-8 */ +#pragma code_page(65001) + +LANGUAGE LANG_UKRAINIAN, SUBLANG_DEFAULT + +STRINGTABLE +{ + STRING_USAGE, "Використання: ipconfig [ /? | /all ]\n" + STRING_INVALID_CMDLINE, "Помилка: Вказані невідомі чи невірні параметри командного рядка\n" + STRING_ADAPTER_FRIENDLY, "%s адаптер %s\n" + STRING_ETHERNET, "Ethernet" + STRING_UNKNOWN, "Невідомо" + STRING_CONN_DNS_SUFFIX, "DNS-суфікс підключення" + STRING_IP_ADDRESS, "IP-адреса" + STRING_HOSTNAME, "Ім'я хосту" + STRING_NODE_TYPE, "Тип вузла" + STRING_BROADCAST, "Передача" + STRING_PEER_TO_PEER, "Peer-to-peer" + STRING_MIXED, "Змішаний" + STRING_HYBRID, "Гібрид" + STRING_IP_ROUTING, "IP-маршрутизація включена" + STRING_DESCRIPTION, "Опис" + STRING_PHYS_ADDR, "Фізична адреса" + STRING_DHCP_ENABLED, "DHCP ввімкнено" +} diff -Nru wine1.3-1.3.0/programs/notepad/Es.rc wine1.3-1.3.1/programs/notepad/Es.rc --- wine1.3-1.3.0/programs/notepad/Es.rc 2010-07-30 18:43:56.000000000 +0100 +++ wine1.3-1.3.1/programs/notepad/Es.rc 2010-08-20 18:23:50.000000000 +0100 @@ -65,7 +65,7 @@ MENUITEM "&Buscar...", CMD_HELP_SEARCH MENUITEM "A&yuda sobre la ayuda", CMD_HELP_ON_HELP MENUITEM SEPARATOR - MENUITEM "&About Notepad", CMD_HELP_ABOUT_NOTEPAD + MENUITEM "Acerca &de Notepad", CMD_HELP_ABOUT_NOTEPAD } } diff -Nru wine1.3-1.3.0/programs/reg/Makefile.in wine1.3-1.3.1/programs/reg/Makefile.in --- wine1.3-1.3.0/programs/reg/Makefile.in 2010-07-30 18:43:56.000000000 +0100 +++ wine1.3-1.3.1/programs/reg/Makefile.in 2010-08-20 18:23:50.000000000 +0100 @@ -27,6 +27,7 @@ Ro.rc \ Ru.rc \ Si.rc \ + Sv.rc \ Uk.rc @MAKE_PROG_RULES@ diff -Nru wine1.3-1.3.0/programs/reg/Sv.rc wine1.3-1.3.1/programs/reg/Sv.rc --- wine1.3-1.3.0/programs/reg/Sv.rc 1970-01-01 01:00:00.000000000 +0100 +++ wine1.3-1.3.1/programs/reg/Sv.rc 2010-08-20 18:23:50.000000000 +0100 @@ -0,0 +1,39 @@ +/* + * REG.EXE - Wine-compatible reg program. + * Swedish language support + * + * Copyright 2010 Anders Jonsson + * + * 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 "reg.h" + +#pragma code_page(65001) + +LANGUAGE LANG_SWEDISH, SUBLANG_NEUTRAL + +STRINGTABLE +{ + STRING_USAGE, "Syntax för detta kommando är:\n\nREG [ ADD | DELETE | QUERY ]\nREG kommando /?\n" + STRING_ADD_USAGE, "REG ADD nyckelnamn [/v värdenamn | /ve] [/t typ] [/s separator] [/d data] [/f]\n" + STRING_DELETE_USAGE, "REG DELETE nyckelnamn [/v värdenamn | /ve | /va] [/f]\n" + STRING_QUERY_USAGE, "REG QUERY nyckelnamn [/v värdenamn | /ve] [/s]\n" + STRING_SUCCESS, "Operation slutfördes utan problem\n" + STRING_INVALID_KEY, "Fel: ogiltigt nyckelnamn\n" + STRING_INVALID_CMDLINE, "Fel: ogiltiga kommandoradsparametrar\n" + STRING_NO_REMOTE, "Fel: Kan inte lägga till nycklar till fjärrmaskin\n" + STRING_CANNOT_FIND, "Fel: Systemet kunde inte hitta angiven nyckel eller värde i registret\n" +} diff -Nru wine1.3-1.3.0/programs/regedit/He.rc wine1.3-1.3.1/programs/regedit/He.rc --- wine1.3-1.3.0/programs/regedit/He.rc 1970-01-01 01:00:00.000000000 +0100 +++ wine1.3-1.3.1/programs/regedit/He.rc 2010-08-20 18:23:50.000000000 +0100 @@ -0,0 +1,343 @@ +/* + * Regedit resources + * + * Copyright 2002 Robert Dickenson + * Copyright 2010 Yaron Shahrabani + * + * 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 "resource.h" + +#pragma code_page(65001) + +/* Hebrew Resources */ + +LANGUAGE LANG_HEBREW, SUBLANG_DEFAULT + +/* + * Menu + */ + +IDR_REGEDIT_MENU MENU +BEGIN + POPUP "&רישום המערכת" + BEGIN + MENUITEM "יי&בוא קובץ לרישום המערכת...", ID_REGISTRY_IMPORTREGISTRYFILE + MENUITEM "יי&צוא קובץ מרישום המערכת...", ID_REGISTRY_EXPORTREGISTRYFILE + MENUITEM SEPARATOR + MENUITEM "התחברות לרישום מערכת ב&רשת...", ID_REGISTRY_CONNECTNETWORKREGISTRY, GRAYED + MENUITEM "&ניתוק מרישום מערכת ברשת...", ID_REGISTRY_DISCONNECTNETWORKREGISTRY, GRAYED + MENUITEM SEPARATOR + MENUITEM "ה&דפסה\tCtrlP", ID_REGISTRY_PRINT, GRAYED + MENUITEM SEPARATOR + MENUITEM "י&ציאה", ID_REGISTRY_EXIT + END + POPUP "&עריכה" + BEGIN + MENUITEM "&שינוי", ID_EDIT_MODIFY + MENUITEM SEPARATOR + POPUP "ח&דש" + BEGIN + MENUITEM "&מפתח", ID_EDIT_NEW_KEY + MENUITEM SEPARATOR + MENUITEM "ערך &מחרוזת", ID_EDIT_NEW_STRINGVALUE + MENUITEM "ערך &בינרי", ID_EDIT_NEW_BINARYVALUE + MENUITEM "ערך &DWORD", ID_EDIT_NEW_DWORDVALUE + MENUITEM "ערך מ&רובה מחרוזות", ID_EDIT_NEW_MULTI_STRINGVALUE + END + MENUITEM SEPARATOR + MENUITEM "&מחיקה\tDel", ID_EDIT_DELETE + MENUITEM "שי&נוי שם\tF2", ID_EDIT_RENAME + MENUITEM SEPARATOR + MENUITEM "ה&עתקת שם המפתח", ID_EDIT_COPYKEYNAME + MENUITEM SEPARATOR + MENUITEM "&חיפוש\tCtrlF", ID_EDIT_FIND, GRAYED + MENUITEM "חיפוש ה&בא\tF3", ID_EDIT_FINDNEXT, GRAYED + END + POPUP "&תצוגה" + BEGIN + MENUITEM "שורת ה&מצב", ID_VIEW_STATUSBAR + MENUITEM SEPARATOR + MENUITEM "&פיצול", ID_VIEW_SPLIT + MENUITEM SEPARATOR + MENUITEM "&רענון\tF5", ID_VIEW_REFRESH + END + POPUP "&מועדפים" + BEGIN + MENUITEM "הוס&פה למועדפים...", ID_FAVORITES_ADDTOFAVORITES + MENUITEM "ה&סרת מועדף...", ID_FAVORITES_REMOVEFAVORITE + END + POPUP "ע&זרה" + BEGIN + MENUITEM "נושאי הע&עזרה\tF1", ID_HELP_HELPTOPICS + MENUITEM SEPARATOR + MENUITEM "על &אודות עורך רישום המערכת", ID_HELP_ABOUT + END +END + +IDR_POPUP_MENUS MENU +BEGIN + POPUP "" + BEGIN + MENUITEM "&שינוי", ID_EDIT_MODIFY + MENUITEM "שינוי נתונים בינריים", ID_EDIT_MODIFY_BIN + MENUITEM SEPARATOR + MENUITEM "&מחיקה\tDel", ID_EDIT_DELETE + MENUITEM "שי&נוי שם", ID_EDIT_RENAME + END + POPUP "" + BEGIN + POPUP "&חדש" + BEGIN + MENUITEM "מ&פתח", ID_EDIT_NEW_KEY + MENUITEM SEPARATOR + MENUITEM "ערך &מחרוזת", ID_EDIT_NEW_STRINGVALUE + MENUITEM "ערך &בינרי", ID_EDIT_NEW_BINARYVALUE + MENUITEM "ערך &DWORD", ID_EDIT_NEW_DWORDVALUE + MENUITEM "ערך מ&רובה מחרוזות", ID_EDIT_NEW_MULTI_STRINGVALUE + END + MENUITEM SEPARATOR + MENUITEM "&מחיקה\tDel", ID_EDIT_DELETE + MENUITEM "&שינוי שם\tF2", ID_EDIT_RENAME + MENUITEM SEPARATOR + MENUITEM "יי&צוא...", ID_EDIT_EXPORT + MENUITEM "ה&עתקת שם המפתח", ID_EDIT_COPYKEYNAME + MENUITEM SEPARATOR + MENUITEM "&חיפוש\tCtrlF", ID_EDIT_FIND, GRAYED + END +END + + +/* + * Dialog + */ + +IDD_EXPORT_TEMPLATE DIALOG 50, 50, 278, 54 +STYLE DS_3DLOOK | DS_CONTROL | WS_CHILD | WS_VISIBLE | WS_CLIPSIBLINGS | + WS_BORDER +EXSTYLE WS_EX_LAYOUTRTL +FONT 8, "MS Shell Dlg" +BEGIN + GROUPBOX "ייצוא רישום המערכת", IDC_EXPORT_BASE, 6, 6, 266, 42, WS_GROUP + AUTORADIOBUTTON "ה&כול", IDC_EXPORT_ALL, 12, 15, 244, 12 + AUTORADIOBUTTON "ה&ענפים הנבחרים:", IDC_EXPORT_SELECTED, 12, 30, 70, 12 + EDITTEXT IDC_EXPORT_PATH, 82, 30, 184, 12 +END + +IDD_FIND DIALOG 22, 17, 220, 85 +STYLE DS_MODALFRAME | WS_CAPTION | WS_SYSMENU +EXSTYLE WS_EX_LAYOUTRTL +CAPTION "חיפוש" +FONT 8, "MS Shell Dlg" +BEGIN + LTEXT "חיפוש:",IDC_STATIC,5,7,119,8 + EDITTEXT IDC_VALUE_NAME,40,5,125,12, WS_BORDER | WS_TABSTOP | ES_AUTOHSCROLL + LTEXT "חיפוש תחת:",IDC_STATIC,5, 22, 119, 8 + CHECKBOX "מפתחות", IDC_FIND_KEYS, 5, 34, 90, 10, WS_TABSTOP | WS_GROUP | BS_AUTOCHECKBOX + CHECKBOX "שמות ערכים", IDC_FIND_VALUES, 5, 46, 90, 10, WS_TABSTOP | BS_AUTOCHECKBOX + CHECKBOX "תוכן הערכים", IDC_FIND_CONTENT, 5, 58, 90, 10, WS_TABSTOP | BS_AUTOCHECKBOX + CHECKBOX "מחרוזות שלמות בלבד", IDC_FIND_WHOLE, 5, 70, 90, 10, WS_TABSTOP | BS_AUTOCHECKBOX + DEFPUSHBUTTON "חיפוש",IDOK,175,5,40,15,WS_GROUP + PUSHBUTTON "סגירה",IDCANCEL,175,24,40,15, WS_GROUP +END + +IDD_ADDFAVORITE DIALOG 22, 17, 210, 55 +STYLE DS_MODALFRAME | WS_CAPTION | WS_SYSMENU +EXSTYLE WS_EX_LAYOUTRTL +CAPTION "הוספה כמועדף" +FONT 8, "MS Shell Dlg" +BEGIN + LTEXT "שם:",IDC_STATIC,5,5,119,8 + EDITTEXT IDC_VALUE_NAME,5,15,200,12, WS_BORDER | WS_TABSTOP | ES_AUTOHSCROLL + DEFPUSHBUTTON "אישור",IDOK,120,36,40,15,WS_GROUP + PUSHBUTTON "ביטול",IDCANCEL,165,36,40,15,WS_GROUP +END + +IDD_DELFAVORITE DIALOG 22, 17, 210, 90 +STYLE DS_MODALFRAME | WS_CAPTION | WS_SYSMENU +EXSTYLE WS_EX_LAYOUTRTL +CAPTION "הסרת מועדף" +FONT 8, "MS Shell Dlg" +BEGIN + LTEXT "שם:",IDC_STATIC,5,5,119,8 + LISTBOX IDC_NAME_LIST,5,15,200,52, WS_BORDER | WS_TABSTOP | LBS_SORT | LBS_NOINTEGRALHEIGHT | WS_VSCROLL + DEFPUSHBUTTON "אישור",IDOK,120,72,40,15,WS_GROUP + PUSHBUTTON "ביטול",IDCANCEL,165,72,40,15,WS_GROUP +END + +IDD_EDIT_STRING DIALOG 22, 17, 210, 75 +STYLE DS_MODALFRAME | WS_CAPTION | WS_SYSMENU +EXSTYLE WS_EX_LAYOUTRTL +CAPTION "עריכת מחרוזת" +FONT 8, "MS Shell Dlg" +BEGIN + LTEXT "שם הערך:",IDC_STATIC,5,5,119,8 + EDITTEXT IDC_VALUE_NAME,5,15,200,12, WS_BORDER | WS_TABSTOP | ES_AUTOHSCROLL| WS_DISABLED + LTEXT "נתוני הערך:",IDC_STATIC,5,30,119,8 + EDITTEXT IDC_VALUE_DATA,5,40,200,12, WS_BORDER | WS_TABSTOP | ES_AUTOHSCROLL + DEFPUSHBUTTON "אישור",IDOK,120,56,40,15,WS_GROUP + PUSHBUTTON "ביטול",IDCANCEL,165,56,40,15,WS_GROUP +END + +IDD_EDIT_DWORD DIALOG 22, 17, 210, 100 +STYLE DS_MODALFRAME | DS_NOIDLEMSG | WS_CAPTION | WS_SYSMENU +EXSTYLE WS_EX_LAYOUTRTL +CAPTION "עריכת DWORD" +FONT 8, "MS Shell Dlg" +BEGIN + LTEXT "שם הערך:",IDC_STATIC,5,5,119,8 + EDITTEXT IDC_VALUE_NAME,5,15,200,12, WS_BORDER | WS_TABSTOP | ES_AUTOHSCROLL| WS_DISABLED + LTEXT "נתוני הערך:",IDC_STATIC,5,30,90,8 + EDITTEXT IDC_VALUE_DATA,5,40,90,12, WS_BORDER | WS_TABSTOP + GROUPBOX "בסיס", IDC_DWORD_BASE, 120, 30, 85, 37, BS_GROUPBOX + AUTORADIOBUTTON "הקסדצימלי", IDC_DWORD_HEX, 130, 40, 60, 10, WS_TABSTOP + AUTORADIOBUTTON "עשרוני", IDC_DWORD_DEC, 130, 52, 60, 10, WS_TABSTOP + DEFPUSHBUTTON "אישור",IDOK,120,78,40,15,WS_GROUP + PUSHBUTTON "ביטול",IDCANCEL,165,78,40,15,WS_GROUP +END + +IDD_EDIT_BINARY DIALOG 22, 17, 170, 100 +STYLE DS_MODALFRAME | DS_NOIDLEMSG | WS_CAPTION | WS_SYSMENU +EXSTYLE WS_EX_LAYOUTRTL +CAPTION "עריכת נתון בינרי" +FONT 8, "MS Shell Dlg" +BEGIN + LTEXT "שם הערך:",IDC_STATIC,5,5,119,8 + EDITTEXT IDC_VALUE_NAME,5,15,160,12, WS_BORDER | WS_TABSTOP | ES_AUTOHSCROLL| WS_DISABLED + LTEXT "נתוני הערך:",IDC_STATIC,5,30,90,8 + CONTROL "",IDC_VALUE_DATA,"HexEdit",WS_TABSTOP,5,40,160,40 + DEFPUSHBUTTON "אישור",IDOK,80,83,40,15,WS_GROUP + PUSHBUTTON "ביטול",IDCANCEL,125,83,40,15,WS_GROUP +END + +IDD_EDIT_MULTI_STRING DIALOG 22, 17, 210, 175 +STYLE DS_MODALFRAME | WS_CAPTION | WS_SYSMENU +EXSTYLE WS_EX_LAYOUTRTL +CAPTION "עריכת מרובה מחרוזות" +FONT 8, "MS Shell Dlg" +BEGIN + LTEXT "שם הערך:",IDC_STATIC,5,5,119,8 + EDITTEXT IDC_VALUE_NAME,5,15,200,12, WS_BORDER | WS_TABSTOP | ES_AUTOHSCROLL| WS_DISABLED + LTEXT "נתוני הערך:",IDC_STATIC,5,30,119,8 + EDITTEXT IDC_VALUE_DATA,5,40,200,112, WS_BORDER | WS_TABSTOP | WS_HSCROLL | WS_VSCROLL | ES_MULTILINE | ES_WANTRETURN + DEFPUSHBUTTON "אישור",IDOK,120,156,40,15,WS_GROUP + PUSHBUTTON "ביטול",IDCANCEL,165,156,40,15,WS_GROUP +END + +/* + * String Table + */ + +STRINGTABLE +BEGIN + IDS_LIST_COLUMN_NAME "שם" + IDS_LIST_COLUMN_TYPE "סוג" + IDS_LIST_COLUMN_DATA "נתון" +END + +STRINGTABLE +BEGIN + IDS_APP_TITLE "עורך רישום המערכת" +END + +STRINGTABLE +BEGIN + ID_REGISTRY_MENU "מכיל פקודות לעבודה עם כל רישום המערכת" + ID_EDIT_MENU "מכיל פקודות לעריכת ערכים או מפתחות" + ID_VIEW_MENU "מכיל פקודות להתאמת חלון רישום המערכת" + ID_FAVORITES_MENU "מכיל פקודות לגישה למפתחות הנמצאים בשימוש תדיר" + ID_HELP_MENU "מכיל פקודות להצגת עזרה ומידע על אודות עורך רישום המערכת" +END + +STRINGTABLE +BEGIN + ID_EDIT_MODIFY "שינוי נתוני הערך" + ID_EDIT_NEW_KEY "הוספת מפתח חדש" + ID_EDIT_NEW_STRINGVALUE "הוספת ערך מחרוזת חדש" + ID_EDIT_NEW_BINARYVALUE "הוספת ערך בינרי חדש" + ID_EDIT_NEW_DWORDVALUE "הוספת ערך חדש בגודל שני word" + ID_EDIT_NEW_MULTI_STRINGVALUE "הוספת ערך מרובה מחרוזות חדש" + ID_REGISTRY_IMPORTREGISTRYFILE "ייבוא קובץ טקסט לתוך רישום המערכת" + ID_REGISTRY_EXPORTREGISTRYFILE + "ייצוא כל רישום המערכת או רק חלק ממנו לקובץ טקסט" + ID_REGISTRY_CONNECTNETWORKREGISTRY + "התחברות לרישום מערכת של מחשב מרוחק" + ID_REGISTRY_DISCONNECTNETWORKREGISTRY + "ניתוק מרישום מערכת של מחשב מרוחק" + ID_REGISTRY_PRINT "הדפסת כל רישום המערכת או רק חלק ממנו" +/* ID_HELP_HELPTOPICS "Opens registry editor help" */ + ID_HELP_ABOUT "הצגת פרטים על אודות התכנה, מספר הגרסה וזכויות יוצרים" +END + +STRINGTABLE +BEGIN + ID_REGISTRY_EXIT "יציאה מעורך רישום המערכת" + ID_FAVORITES_ADDTOFAVORITES "הוספת מפתחות לרשימת המועדפים" + ID_FAVORITES_REMOVEFAVORITE "הסרת מפתחות מרשימת המועדפים" + ID_VIEW_STATUSBAR "הצגה או הסתרה של שורת המצב" + ID_VIEW_SPLIT "שינוי מיקום הפיצול בין שתי החלוניות" + ID_VIEW_REFRESH "רענון החלון" + ID_EDIT_DELETE "מחיקת הבחירה" + ID_EDIT_RENAME "שינוי שם הבחירה" + ID_EDIT_COPYKEYNAME "העתקת שם המפתח הנבחר ללוח הגזירים" + ID_EDIT_FIND "חיפוש מחרוזת טקסט בין מפתחות, ערכים ונתונים" + ID_EDIT_FINDNEXT "חיפוש המופע הבא של טקסט שצוין בחיפוש הקודם" + ID_EDIT_EXPORT "ייצוא הענף הנבחר מרישום המערכת לקובץ טקסט" +END + +STRINGTABLE +BEGIN + IDS_ERROR "שגיאה" + IDS_BAD_KEY "לא ניתן לתשאל את המפתח ׳%s׳" + IDS_BAD_VALUE "לא ניתן לתשאל את הערך ׳%s׳" + IDS_UNSUPPORTED_TYPE "לא ניתן לערוך מפתחות מסוג זה (%u)" + IDS_TOO_BIG_VALUE "הערך גדול מדי (%u)" + IDS_DELETE_BOX_TITLE "אישור מחיקת הערך" + IDS_DELETE_BOX_TEXT "האם ברצונך למחוק את הערך '%s'?" + IDS_DELETE_BOX_TEXT_MULTIPLE "האם ברצונך למחוק ערכים אלו?" + IDS_NEWKEY "מפתח חדש מס׳%d" + IDS_NEWVALUE "ערך חדש מס׳ %d" + IDS_NOTFOUND "מחרוזת החיפוש ׳%s׳ לא נמצאה" +END + +STRINGTABLE +BEGIN + IDS_FILEDIALOG_IMPORT_TITLE "ייבוא קובץ רישום מערכת" + IDS_FILEDIALOG_EXPORT_TITLE "ייצוא קובץ רישום מערכת" + IDS_FILEDIALOG_FILTER "קובצי רישום מערכת\0*.reg\0קובצי רישום מערכת שלWin9x/NT4 (REGEDIT4)\0*.reg\0כל הקבצים (*.*)\0*.*\0\0" +END + +STRINGTABLE +BEGIN + IDS_REGISTRY_ROOT_NAME "המחשב שלי" + IDS_REGISTRY_DEFAULT_VALUE "(ברירת המחדל)" + IDS_REGISTRY_VALUE_NOT_SET "(לא הוגדר ערך)" + IDS_REGISTRY_VALUE_CANT_DISPLAY "(לא ניתן להציג את הערך)" + IDS_REGISTRY_UNKNOWN_TYPE "(%d לא ידוע)" +END + +/*****************************************************************/ + +/* + * TEXTINCLUDE + */ + +1 TEXTINCLUDE +BEGIN + "resource.h\0" +END + +/*****************************************************************/ diff -Nru wine1.3-1.3.0/programs/regedit/Makefile.in wine1.3-1.3.1/programs/regedit/Makefile.in --- wine1.3-1.3.0/programs/regedit/Makefile.in 2010-07-30 18:43:56.000000000 +0100 +++ wine1.3-1.3.1/programs/regedit/Makefile.in 2010-08-20 18:23:50.000000000 +0100 @@ -30,6 +30,7 @@ En.rc \ Es.rc \ Fr.rc \ + He.rc \ Hu.rc \ It.rc \ Ja.rc \ diff -Nru wine1.3-1.3.0/programs/regedit/regproc.c wine1.3-1.3.1/programs/regedit/regproc.c --- wine1.3-1.3.0/programs/regedit/regproc.c 2010-07-30 18:43:56.000000000 +0100 +++ wine1.3-1.3.1/programs/regedit/regproc.c 2010-08-20 18:23:50.000000000 +0100 @@ -372,6 +372,8 @@ * the extra garbage in the registry. */ dwLen = lstrlenW(val_data); + if(val_data[dwLen-1] != '"') + return ERROR_INVALID_DATA; if (dwLen>0 && val_data[dwLen-1]=='"') { dwLen--; @@ -497,7 +499,7 @@ } else if (line[line_idx] == '\"') { line_idx++; val_name = line + line_idx; - while (TRUE) { + while (line[line_idx]) { if (line[line_idx] == '\\') /* skip escaped character */ { line_idx += 2; @@ -512,18 +514,22 @@ } } while ( isspaceW(line[line_idx]) ) line_idx++; + if (!line[line_idx]) { + fprintf(stderr, "%s: warning: unexpected EOL\n", getAppName()); + return; + } if (line[line_idx] != '=') { char* lineA; line[line_idx] = '\"'; lineA = GetMultiByteString(line); - fprintf(stderr,"Warning! unrecognized line:\n%s\n", lineA); + fprintf(stderr,"%s: warning: unrecognized line: '%s'\n", getAppName(), lineA); HeapFree(GetProcessHeap(), 0, lineA); return; } } else { char* lineA = GetMultiByteString(line); - fprintf(stderr,"Warning! unrecognized line:\n%s\n", lineA); + fprintf(stderr,"%s: warning: unrecognized line: '%s'\n", getAppName(), lineA); HeapFree(GetProcessHeap(), 0, lineA); return; } @@ -623,7 +629,6 @@ while (!feof(in)) { LPSTR s; /* The pointer into line for where the current fgets should read */ - LPSTR check; WCHAR* lineW; s = line; @@ -635,7 +640,7 @@ for (;;) { size_t size_remaining; - int size_to_get; + int size_to_get, i; char *s_eol; /* various local uses */ /* Do we need to expand the buffer ? */ @@ -661,27 +666,46 @@ */ size_to_get = (size_remaining > INT_MAX ? INT_MAX : size_remaining); - check = fgets (s, size_to_get, in); - - if (check == NULL) { - if (ferror(in)) { - perror ("While reading input"); - exit (IO_ERROR); - } else { - assert (feof(in)); - *s = '\0'; - /* It is not clear to me from the definition that the - * contents of the buffer are well defined on detecting - * an eof without managing to read anything. - */ + /* get a single line. note that `i' must be one past the last + * meaningful character in `s' when this loop exits */ + for(i = 0; i < size_to_get-1; ++i){ + s[i] = fgetc(in); + if(s[i] == EOF){ + if(ferror(in)){ + perror("While reading input"); + exit(IO_ERROR); + }else + assert(feof(in)); + break; + } + if(s[i] == '\r'){ + /* read the next character iff it's \n */ + s[i+1] = fgetc(in); + if(s[i+1] != '\n'){ + ungetc(s[i+1], in); + i = i+1; + }else{ + if(i+2 >= size_to_get){ + /* buffer too short, so put back the EOL chars to + * read next cycle */ + ungetc('\n', in); + ungetc('\r', in); + }else + i = i+2; + } + break; + } + if(s[i] == '\n'){ + i = i+1; + break; } } + s[i] = '\0'; /* If we didn't read the eol nor the eof go around for the rest */ - s_eol = strchr (s, '\n'); + s_eol = strpbrk (s, "\r\n"); if (!feof (in) && !s_eol) { s = strchr (s, '\0'); - /* It should be s + size_to_get - 1 but this is safer */ continue; } @@ -691,11 +715,11 @@ continue; } - /* Remove any line feed. Leave s_eol on the \0 */ + /* Remove any line feed. Leave s_eol on the first \0 */ if (s_eol) { - *s_eol = '\0'; - if (s_eol > line && *(s_eol-1) == '\r') - *--s_eol = '\0'; + if (*s_eol == '\r' && *(s_eol+1) == '\n') + *(s_eol+1) = '\0'; + *s_eol = '\0'; } else s_eol = strchr (s, '\0'); @@ -799,7 +823,8 @@ /* If we didn't read the eol nor the eof go around for the rest */ while(1) { - s_eol = strchrW(line, '\n'); + const WCHAR line_endings[] = {'\r','\n',0}; + s_eol = strpbrkW(line, line_endings); if(!s_eol) { /* Move the stub of the line to the start of the buffer so @@ -813,22 +838,22 @@ /* If it is a comment line then discard it and go around again */ if (*line == '#') { - line = s_eol + 1; + if (*s_eol == '\r' && *(s_eol+1) == '\n') + line = s_eol + 2; + else + line = s_eol + 1; continue; } /* If there is a concatenating \\ then go around again */ - if ((*(s_eol-1) == '\\') || - (*(s_eol-1) == '\r' && *(s_eol-2) == '\\')) { - WCHAR* NextLine = s_eol; + if (*(s_eol-1) == '\\') { + WCHAR* NextLine = s_eol + 1; - while(*(NextLine+1) == ' ' || *(NextLine+1) == '\t') + if(*s_eol == '\r' && *(s_eol+1) == '\n') NextLine++; - NextLine++; - - if(*(s_eol-1) == '\r') - s_eol--; + while(*(NextLine+1) == ' ' || *(NextLine+1) == '\t') + NextLine++; MoveMemory(s_eol - 1, NextLine, (CharsInBuf - (NextLine - s) + 1)*sizeof(WCHAR)); CharsInBuf -= NextLine - s_eol + 1; @@ -836,15 +861,10 @@ continue; } - /* Remove any line feed. Leave s_eol on the \0 */ - if (s_eol) { - *s_eol = '\0'; - if (s_eol > buf && *(s_eol-1) == '\r') - *(s_eol-1) = '\0'; - } - - if(!s_eol) - break; + /* Remove any line feed. Leave s_eol on the last \0 */ + if (*s_eol == '\r' && *(s_eol + 1) == '\n') + *s_eol++ = '\0'; + *s_eol = '\0'; processRegEntry(line, TRUE); line = s_eol + 1; diff -Nru wine1.3-1.3.0/programs/regedit/tests/Makefile.in wine1.3-1.3.1/programs/regedit/tests/Makefile.in --- wine1.3-1.3.0/programs/regedit/tests/Makefile.in 1970-01-01 01:00:00.000000000 +0100 +++ wine1.3-1.3.1/programs/regedit/tests/Makefile.in 2010-08-20 18:23:50.000000000 +0100 @@ -0,0 +1,11 @@ +TOPSRCDIR = @top_srcdir@ +TOPOBJDIR = ../../.. +SRCDIR = @srcdir@ +VPATH = @srcdir@ +TESTDLL = regedit.exe +IMPORTS = advapi32 + +C_SRCS = \ + regedit.c + +@MAKE_TEST_RULES@ diff -Nru wine1.3-1.3.0/programs/regedit/tests/regedit.c wine1.3-1.3.1/programs/regedit/tests/regedit.c --- wine1.3-1.3.0/programs/regedit/tests/regedit.c 1970-01-01 01:00:00.000000000 +0100 +++ wine1.3-1.3.1/programs/regedit/tests/regedit.c 2010-08-20 18:23:50.000000000 +0100 @@ -0,0 +1,392 @@ +/* + * Copyright 2010 Andrew Eikum for 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 + +#include "wine/test.h" + +static BOOL supports_wchar; + +#define lok ok_(__FILE__,line) + +#define exec_import_str(c) r_exec_import_str(__LINE__, c) +static BOOL r_exec_import_str(unsigned line, const char *file_contents) +{ + STARTUPINFOA si = {sizeof(STARTUPINFOA)}; + PROCESS_INFORMATION pi; + HANDLE regfile; + DWORD written, dr; + BOOL br; + char cmd[] = "regedit /s test.reg"; + + regfile = CreateFileA("test.reg", GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, + FILE_ATTRIBUTE_NORMAL, NULL); + lok(regfile != INVALID_HANDLE_VALUE, "Failed to create test.reg file\n"); + if(regfile == INVALID_HANDLE_VALUE) + return FALSE; + + br = WriteFile(regfile, file_contents, strlen(file_contents), &written, + NULL); + lok(br == TRUE, "WriteFile failed: %d\n", GetLastError()); + + CloseHandle(regfile); + + if(!CreateProcessA(NULL, cmd, NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi)) + return FALSE; + + dr = WaitForSingleObject(pi.hProcess, 10000); + if(dr == WAIT_TIMEOUT) + TerminateProcess(pi.hProcess, 1); + CloseHandle(pi.hThread); + CloseHandle(pi.hProcess); + + br = DeleteFileA("test.reg"); + lok(br == TRUE, "DeleteFileA failed: %d\n", GetLastError()); + + return (dr != WAIT_TIMEOUT); +} + +#define exec_import_wstr(c) r_exec_import_wstr(__LINE__, c) +static BOOL r_exec_import_wstr(unsigned line, const WCHAR *file_contents) +{ + STARTUPINFOA si = {sizeof(STARTUPINFOA)}; + PROCESS_INFORMATION pi; + HANDLE regfile; + DWORD written, dr; + BOOL br; + char cmd[] = "regedit /s test.reg"; + + regfile = CreateFileA("test.reg", GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, + FILE_ATTRIBUTE_NORMAL, NULL); + lok(regfile != INVALID_HANDLE_VALUE, "Failed to create test.reg file\n"); + if(regfile == INVALID_HANDLE_VALUE) + return FALSE; + + br = WriteFile(regfile, file_contents, + lstrlenW(file_contents) * sizeof(WCHAR), &written, NULL); + lok(br == TRUE, "WriteFile failed: %d\n", GetLastError()); + + CloseHandle(regfile); + + if(!CreateProcessA(NULL, cmd, NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi)) + return FALSE; + + dr = WaitForSingleObject(pi.hProcess, 10000); + if(dr == WAIT_TIMEOUT) + TerminateProcess(pi.hProcess, 1); + CloseHandle(pi.hThread); + CloseHandle(pi.hProcess); + + br = DeleteFileA("test.reg"); + lok(br == TRUE, "DeleteFileA failed: %d\n", GetLastError()); + + return (dr != WAIT_TIMEOUT); +} + +#define verify_reg_sz(k,s,n,e) r_verify_reg_sz(__LINE__,k,s,n,e) +static void r_verify_reg_sz(unsigned line, HKEY key, const char *subkey, + const char *value_name, const char *exp_value) +{ + LONG lr; + DWORD fnd_type, fnd_len; + char fnd_value[1024]; + HKEY fnd_key; + + lr = RegOpenKeyExA(key, subkey, 0, KEY_READ, &fnd_key); + lok(lr == ERROR_SUCCESS, "RegOpenKeyExA failed: %d\n", lr); + if(lr != ERROR_SUCCESS) + return; + + fnd_len = sizeof(fnd_value); + lr = RegQueryValueExA(fnd_key, value_name, NULL, &fnd_type, + (BYTE*)fnd_value, &fnd_len); + RegCloseKey(fnd_key); + lok(lr == ERROR_SUCCESS, "RegQueryValueExA failed: %d\n", lr); + if(lr != ERROR_SUCCESS) + return; + + lok(fnd_type == REG_SZ, "Got wrong type: %d\n", fnd_type); + if(fnd_type != REG_SZ) + return; + lok(!strcmp(exp_value, fnd_value), + "Strings differ: expected %s, got %s\n", exp_value, fnd_value); +} + +#define verify_reg_wsz(k,s,n,e) r_verify_reg_wsz(__LINE__,k,s,n,e) +static void r_verify_reg_wsz(unsigned line, HKEY key, const char *subkey, + const char *value_name, const WCHAR *exp_value) +{ + LONG lr; + DWORD fnd_type, fnd_len; + WCHAR fnd_value[1024], value_nameW[1024]; + HKEY fnd_key; + + lr = RegOpenKeyExA(key, subkey, 0, KEY_READ, &fnd_key); + lok(lr == ERROR_SUCCESS, "RegOpenKeyExA failed: %d\n", lr); + if(lr != ERROR_SUCCESS) + return; + + MultiByteToWideChar(CP_ACP, 0, value_name, -1, value_nameW, + sizeof(value_nameW)); + + fnd_len = sizeof(fnd_value); + lr = RegQueryValueExW(fnd_key, value_nameW, NULL, &fnd_type, + (BYTE*)fnd_value, &fnd_len); + RegCloseKey(fnd_key); + lok(lr == ERROR_SUCCESS, "RegQueryValueExW failed: %d\n", lr); + if(lr != ERROR_SUCCESS) + return; + + lok(fnd_type == REG_SZ, "Got wrong type: %d\n", fnd_type); + if(fnd_type != REG_SZ) + return; + lok(!lstrcmpW(exp_value, fnd_value), + "Strings differ: expected %s, got %s\n", + wine_dbgstr_w(exp_value), wine_dbgstr_w(fnd_value)); +} + +#define verify_reg_dword(k,s,n,e) r_verify_reg_dword(__LINE__,k,s,n,e) +static void r_verify_reg_dword(unsigned line, HKEY key, const char *subkey, + const char *value_name, DWORD exp_value) +{ + LONG lr; + DWORD fnd_type, fnd_len, fnd_value; + HKEY fnd_key; + + lr = RegOpenKeyExA(key, subkey, 0, KEY_READ, &fnd_key); + lok(lr == ERROR_SUCCESS, "RegOpenKeyExA failed: %d\n", lr); + if(lr != ERROR_SUCCESS) + return; + + fnd_len = sizeof(fnd_value); + lr = RegQueryValueExA(fnd_key, value_name, NULL, &fnd_type, + (BYTE *)&fnd_value, &fnd_len); + RegCloseKey(fnd_key); + lok(lr == ERROR_SUCCESS, "RegQueryValueExA failed: %d\n", lr); + if(lr != ERROR_SUCCESS) + return; + + lok(fnd_type == REG_DWORD, "Got wrong type: %d\n", fnd_type); + if(fnd_type != REG_DWORD) + return; + lok(fnd_value == exp_value, "Values differ: expected: 0x%x, got: 0x%x\n", + exp_value, fnd_value); +} + +#define verify_reg_binary(k,s,n,e,z) r_verify_reg_binary(__LINE__,k,s,n,e,z) +static void r_verify_reg_binary(unsigned line, HKEY key, const char *subkey, + const char *value_name, const char *exp_value, int exp_len) +{ + LONG lr; + DWORD fnd_type, fnd_len; + char fnd_value[1024]; + HKEY fnd_key; + + lr = RegOpenKeyExA(key, subkey, 0, KEY_READ, &fnd_key); + lok(lr == ERROR_SUCCESS, "RegOpenKeyExA failed: %d\n", lr); + if(lr != ERROR_SUCCESS) + return; + + fnd_len = sizeof(fnd_value); + lr = RegQueryValueExA(fnd_key, value_name, NULL, &fnd_type, + (BYTE*)fnd_value, &fnd_len); + RegCloseKey(fnd_key); + lok(lr == ERROR_SUCCESS, "RegQueryValueExA failed: %d\n", lr); + if(lr != ERROR_SUCCESS) + return; + + lok(fnd_type == REG_BINARY, "Got wrong type: %d\n", fnd_type); + if(fnd_type != REG_BINARY) + return; + lok(fnd_len == exp_len, + "Lengths differ: expected %d, got %d\n", exp_len, fnd_len); + lok(!memcmp(exp_value, fnd_value, exp_len), + "Data differs\n"); +} + +#define verify_reg_nonexist(k,s,n) r_verify_reg_nonexist(__LINE__,k,s,n) +static void r_verify_reg_nonexist(unsigned line, HKEY key, const char *subkey, + const char *value_name) +{ + LONG lr; + DWORD fnd_type, fnd_len; + char fnd_value[32]; + HKEY fnd_key; + + lr = RegOpenKeyExA(key, subkey, 0, KEY_READ, &fnd_key); + lok(lr == ERROR_SUCCESS, "RegOpenKeyExA failed: %d\n", lr); + if(lr != ERROR_SUCCESS) + return; + + fnd_len = sizeof(fnd_value); + lr = RegQueryValueExA(fnd_key, value_name, NULL, &fnd_type, + (BYTE*)fnd_value, &fnd_len); + RegCloseKey(fnd_key); + lok(lr == ERROR_FILE_NOT_FOUND, "Reg value shouldn't exist: %s\n", + value_name); +} + +static void test_basic_import(void) +{ + char exp_binary[] = {0xAA,0xBB,0xCC,0x11}; + WCHAR wide_test[] = {0xFEFF,'W','i','n','d','o','w','s',' ','R','e','g', + 'i','s','t','r','y',' ','E','d','i','t','o','r',' ','V','e','r','s', + 'i','o','n',' ','5','.','0','0','\n','\n', + '[','H','K','E','Y','_','C','U','R','R','E','N','T','_','U','S','E', + 'R','\\','S','o','f','t','w','a','r','e','\\','W','i','n','e','\\', + 'r','e','g','e','d','i','t','_','t','e','s','t',']','\n', + '"','T','e','s','t','V','a','l','u','e','3','"','=','"',0x3041,'V','a', + 'l','u','e','"','\n',0}; + WCHAR wide_test_r[] = {0xFEFF,'W','i','n','d','o','w','s',' ','R','e','g', + 'i','s','t','r','y',' ','E','d','i','t','o','r',' ','V','e','r','s', + 'i','o','n',' ','5','.','0','0','\r','\r', + '[','H','K','E','Y','_','C','U','R','R','E','N','T','_','U','S','E', + 'R','\\','S','o','f','t','w','a','r','e','\\','W','i','n','e','\\', + 'r','e','g','e','d','i','t','_','t','e','s','t',']','\r', + '"','T','e','s','t','V','a','l','u','e','5','"','=','"',0x3041,'V','a', + 'l','u','e','"','\r',0}; + WCHAR wide_exp[] = {0x3041,'V','a','l','u','e',0}; + LONG lr; + + lr = RegDeleteKeyA(HKEY_CURRENT_USER, "Software\\Wine\\regedit_test"); + ok(lr == ERROR_SUCCESS || lr == ERROR_FILE_NOT_FOUND, + "RegDeleteKeyA failed: %d\n", lr); + + exec_import_str("REGEDIT4\n\n" + "[HKEY_CURRENT_USER\\Software\\Wine\\regedit_test]\n" + "\"TestValue\"=\"AValue\"\n"); + verify_reg_sz(HKEY_CURRENT_USER, "Software\\Wine\\regedit_test", + "TestValue", "AValue"); + + exec_import_str("REGEDIT4\r\n\r\n" + "[HKEY_CURRENT_USER\\Software\\Wine\\regedit_test]\r\n" + "\"TestValue2\"=\"BValue\"\r\n"); + verify_reg_sz(HKEY_CURRENT_USER, "Software\\Wine\\regedit_test", + "TestValue2", "BValue"); + + if(supports_wchar){ + exec_import_wstr(wide_test); + verify_reg_wsz(HKEY_CURRENT_USER, "Software\\Wine\\regedit_test", + "TestValue3", wide_exp); + + exec_import_wstr(wide_test_r); + verify_reg_wsz(HKEY_CURRENT_USER, "Software\\Wine\\regedit_test", + "TestValue5", wide_exp); + }else + win_skip("Some WCHAR tests skipped\n"); + + exec_import_str("REGEDIT4\r\r" + "[HKEY_CURRENT_USER\\Software\\Wine\\regedit_test]\r" + "\"TestValue4\"=\"DValue\"\r"); + verify_reg_sz(HKEY_CURRENT_USER, "Software\\Wine\\regedit_test", + "TestValue4", "DValue"); + + exec_import_str("REGEDIT4\n\n" + "[HKEY_CURRENT_USER\\Software\\Wine\\regedit_test]\n" + "\"TestDword\"=dword:00000017\n"); + verify_reg_dword(HKEY_CURRENT_USER, "Software\\Wine\\regedit_test", + "TestDword", 0x17); + + exec_import_str("REGEDIT4\n\n" + "[HKEY_CURRENT_USER\\Software\\Wine\\regedit_test]\n" + "\"TestBinary\"=hex:aa,bb,cc,11\n"); + verify_reg_binary(HKEY_CURRENT_USER, "Software\\Wine\\regedit_test", + "TestBinary", exp_binary, sizeof(exp_binary)); + + exec_import_str("REGEDIT4\n\n" + "[HKEY_CURRENT_USER\\Software\\Wine\\regedit_test]\n" + "\"With=Equals\"=\"asdf\"\n"); + verify_reg_sz(HKEY_CURRENT_USER, "Software\\Wine\\regedit_test", + "With=Equals", "asdf"); + + lr = RegDeleteKeyA(HKEY_CURRENT_USER, "Software\\Wine\\regedit_test"); + ok(lr == ERROR_SUCCESS, "RegDeleteKeyA failed: %d\n", lr); +} + +static void test_invalid_import(void) +{ + LONG lr; + + lr = RegDeleteKeyA(HKEY_CURRENT_USER, "Software\\Wine\\regedit_test"); + ok(lr == ERROR_SUCCESS || lr == ERROR_FILE_NOT_FOUND, + "RegDeleteKeyA failed: %d\n", lr); + + exec_import_str("REGEDIT4\n\n" + "[HKEY_CURRENT_USER\\Software\\Wine\\regedit_test]\n" + "\"TestNoEndQuote\"=\"Asdffdsa\n"); + verify_reg_nonexist(HKEY_CURRENT_USER, "Software\\Wine\\regedit_test", + "TestNoEndQuote"); + + exec_import_str("REGEDIT4\n\n" + "[HKEY_CURRENT_USER\\Software\\Wine\\regedit_test]\n" + "\"TestNoBeginQuote\"=Asdffdsa\"\n"); + verify_reg_nonexist(HKEY_CURRENT_USER, "Software\\Wine\\regedit_test", + "TestNoBeginQuote"); + + exec_import_str("REGEDIT4\n\n" + "[HKEY_CURRENT_USER\\Software\\Wine\\regedit_test]\n" + "\"TestNoQuotes\"=Asdffdsa\n"); + verify_reg_nonexist(HKEY_CURRENT_USER, "Software\\Wine\\regedit_test", + "TestNoQuotes"); + + exec_import_str("REGEDIT4\n\n" + "[HKEY_CURRENT_USER\\Software\\Wine\\regedit_test]\n" + "\"NameNoEndQuote=\"Asdffdsa\"\n"); + verify_reg_nonexist(HKEY_CURRENT_USER, "Software\\Wine\\regedit_test", + "NameNoEndQuote"); + + exec_import_str("REGEDIT4\n\n" + "[HKEY_CURRENT_USER\\Software\\Wine\\regedit_test]\n" + "NameNoBeginQuote\"=\"Asdffdsa\"\n"); + verify_reg_nonexist(HKEY_CURRENT_USER, "Software\\Wine\\regedit_test", + "NameNoBeginQuote"); + + exec_import_str("REGEDIT4\n\n" + "[HKEY_CURRENT_USER\\Software\\Wine\\regedit_test]\n" + "NameNoQuotes=\"Asdffdsa\"\n"); + verify_reg_nonexist(HKEY_CURRENT_USER, "Software\\Wine\\regedit_test", + "NameNoQuotes"); + + exec_import_str("REGEDIT4\n\n" + "[HKEY_CURRENT_USER\\Software\\Wine\\regedit_test]\n" + "\"MixedQuotes=Asdffdsa\"\n"); + verify_reg_nonexist(HKEY_CURRENT_USER, "Software\\Wine\\regedit_test", + "MixedQuotes"); + verify_reg_nonexist(HKEY_CURRENT_USER, "Software\\Wine\\regedit_test", + "MixedQuotes=Asdffdsa"); + + lr = RegDeleteKeyA(HKEY_CURRENT_USER, "Software\\Wine\\regedit_test"); + ok(lr == ERROR_SUCCESS, "RegDeleteKeyA failed: %d\n", lr); +} + +START_TEST(regedit) +{ + WCHAR wchar_test[] = {0xFEFF,'W','i','n','d','o','w','s',' ','R','e','g', + 'i','s','t','r','y',' ','E','d','i','t','o','r',' ','V','e','r','s', + 'i','o','n',' ','5','.','0','0','\n','\n',0}; + + if(!exec_import_str("REGEDIT4\r\n\r\n")){ + win_skip("regedit not available, skipping regedit tests\n"); + return; + } + + supports_wchar = exec_import_wstr(wchar_test); + + test_basic_import(); + test_invalid_import(); +} diff -Nru wine1.3-1.3.0/programs/start/Makefile.in wine1.3-1.3.1/programs/start/Makefile.in --- wine1.3-1.3.0/programs/start/Makefile.in 2010-07-30 18:43:56.000000000 +0100 +++ wine1.3-1.3.1/programs/start/Makefile.in 2010-08-20 18:23:50.000000000 +0100 @@ -27,6 +27,7 @@ Ro.rc \ Ru.rc \ Si.rc \ + Sv.rc \ Tr.rc \ Uk.rc diff -Nru wine1.3-1.3.0/programs/start/Sv.rc wine1.3-1.3.1/programs/start/Sv.rc --- wine1.3-1.3.0/programs/start/Sv.rc 1970-01-01 01:00:00.000000000 +0100 +++ wine1.3-1.3.1/programs/start/Sv.rc 2010-08-20 18:23:50.000000000 +0100 @@ -0,0 +1,73 @@ +/* + * Start + * Swedish Language Support + * + * Copyright 2010 Anders Jonsson + * + * 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 "resources.h" + +#pragma code_page(65001) + +LANGUAGE LANG_SWEDISH, SUBLANG_NEUTRAL + +STRINGTABLE DISCARDABLE +{ +STRING_USAGE, "Starta ett program, eller öppna ett dokument i programmet som normalt används\n\ +för filer med den filändelsen.\n\ +Användning:\n\ +start [val] programmets_filnamn [...]\n\ +start [val] dokumentets_filnamn\n\ +\n\ +Val:\n\ +/M[inimized] Starta programmet minimerat.\n\ +/MAX[imized] Starta programmet maximerat.\n\ +/R[estored] Starta programmet normalt (varken minimerat eller maximerat).\n\ +/W[ait] Vänta på att startat program avslutar, avsluta sedan med dess\n\ avslutsskod.\n\ +/Unix Använd ett Unix-filnamn och starta filen som windows explorer.\n\ +/ProgIDOpen Öppna ett dokument med hjälp av följande progID.\n\ +/L Visa slutanvändarlicens.\n\ +\n\ +start.exe version 0.2 Copyright (C) 2003, Dan Kegel\n\ +Start kommer UTAN NÅGON SOM HELST GARANTI; kör med valet /L för detaljer.\n\ +Detta program är fri programvara, du är välkommen att distribuera det\n\ +vidare under vissa villkor; kör 'start /L' för detaljer.\n\ +" + +STRING_LICENSE, "start.exe version 0.2 Copyright (C) 2003, Dan Kegel\n\ +Detta program är fri programvara. Du kan distribuera det och/eller\n\ +modifiera det under villkoren i GNU Lesser Public License, publicerad\n\ +av Free Software Foundation, antingen version 2.1 eller (om du så vill)\n\ +någon senare version.\n\ +\n\ +Detta program distribueras i hopp om att det ska vara\n\ +användbart,men UTAN NÅGON SOM HELST GARANTI, även utan\n\ +underförstådd garanti om SÄLJBARHET eller LÄMPLIGHET FÖR NÅGOT\n\ +SPECIELLT ÄNDAMÅL. Se GNU Lesser Public License för ytterligare\n\ +information.\n\ +\n\ +Du bör ha fått en kopia av GNU Lesser Public License tillsammans\n\ +med detta program. Om inte, skriv till the Free Software Foundation,\n\ +Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA.\n\ +\n\ +Se filen COPYING.LIB för licensinformation.\n\ +" + +STRING_EXECFAIL, "Programmet kunde inte startas, eller så var inget program associerat med den angivna filen.\n'ShellExecuteEx' misslyckades" + +STRING_UNIXFAIL "Kunde inte konvertera Unix-filnamnet till ett DOS-filnamn." +} diff -Nru wine1.3-1.3.0/programs/wineboot/Makefile.in wine1.3-1.3.1/programs/wineboot/Makefile.in --- wine1.3-1.3.0/programs/wineboot/Makefile.in 2010-07-30 18:43:56.000000000 +0100 +++ wine1.3-1.3.1/programs/wineboot/Makefile.in 2010-08-20 18:23:50.000000000 +0100 @@ -18,6 +18,7 @@ wineboot_En.rc \ wineboot_Es.rc \ wineboot_Fr.rc \ + wineboot_He.rc \ wineboot_It.rc \ wineboot_Ja.rc \ wineboot_Ko.rc \ diff -Nru wine1.3-1.3.0/programs/wineboot/wineboot.c wine1.3-1.3.1/programs/wineboot/wineboot.c --- wine1.3-1.3.0/programs/wineboot/wineboot.c 2010-07-30 18:43:56.000000000 +0100 +++ wine1.3-1.3.1/programs/wineboot/wineboot.c 2010-08-20 18:23:50.000000000 +0100 @@ -261,6 +261,8 @@ static const WCHAR NumProcW[] = {'N','U','M','B','E','R','_','O','F','_','P','R','O','C','E','S','S','O','R','S',0}; static const WCHAR ProcArchW[] = {'P','R','O','C','E','S','S','O','R','_','A','R','C','H','I','T','E','C','T','U','R','E',0}; static const WCHAR x86W[] = {'x','8','6',0}; + static const WCHAR IA64W[] = {'I','A','6','4',0}; + static const WCHAR AMD64W[] = {'A','M','D','6','4',0}; static const WCHAR ProcIdW[] = {'P','R','O','C','E','S','S','O','R','_','I','D','E','N','T','I','F','I','E','R',0}; static const WCHAR ProcLvlW[] = {'P','R','O','C','E','S','S','O','R','_','L','E','V','E','L',0}; static const WCHAR ProcRevW[] = {'P','R','O','C','E','S','S','O','R','_','R','E','V','I','S','I','O','N',0}; @@ -280,8 +282,19 @@ sprintfW( buffer, PercentDW, NtCurrentTeb()->Peb->NumberOfProcessors ); set_reg_value( env_key, NumProcW, buffer ); - /* TODO: currently hardcoded x86, add different processors */ - set_reg_value( env_key, ProcArchW, x86W ); + switch(sci.Architecture) + { + case PROCESSOR_ARCHITECTURE_AMD64: + set_reg_value( env_key, ProcArchW, AMD64W ); + break; + case PROCESSOR_ARCHITECTURE_IA64: + set_reg_value( env_key, ProcArchW, IA64W ); + break; + case PROCESSOR_ARCHITECTURE_INTEL: + default: + set_reg_value( env_key, ProcArchW, x86W ); + break; + } /* TODO: currently hardcoded Intel, add different processors */ sprintfW( buffer, IntelCpuDescrW, sci.Level, HIBYTE(sci.Revision), LOBYTE(sci.Revision) ); diff -Nru wine1.3-1.3.0/programs/wineboot/wineboot_He.rc wine1.3-1.3.1/programs/wineboot/wineboot_He.rc --- wine1.3-1.3.0/programs/wineboot/wineboot_He.rc 1970-01-01 01:00:00.000000000 +0100 +++ wine1.3-1.3.1/programs/wineboot/wineboot_He.rc 2010-08-20 18:23:50.000000000 +0100 @@ -0,0 +1,52 @@ +/* + * WineBoot resources + * + * Copyright (C) 2007 Robert Shearman for CodeWeavers + * Hebrew translation by Yaron Shahrabani , 2010 + * + * 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 "resource.h" + +#pragma code_page(65001) + +LANGUAGE LANG_HEBREW, SUBLANG_DEFAULT + +IDD_ENDTASK DIALOG 0, 0, 186, 71 +STYLE DS_MODALFRAME | DS_NOIDLEMSG | DS_CENTER | WS_POPUP | WS_CAPTION | WS_SYSMENU +EXSTYLE WS_EX_LAYOUTRTL +CAPTION "בהמתנה לתכנה" +FONT 8, "MS Shell Dlg" +BEGIN + DEFPUSHBUTTON "ביטול",IDCANCEL,129,49,50,15 + PUSHBUTTON "חיסול התהליך",IDOK,51,49,71,15 + LTEXT "מתבצעת הדמייה של ניתוק או כיבוי, אך תכנית זו אינה מגיבה.", + IDC_STATIC,7,7,172,19 + LTEXT "אם התהליך יחוסל יתכן שכל הנתונים שלא נשמרו ילכו לאיבוד.", + IDC_STATIC,7,28,172,15 +END + +IDD_WAITDLG DIALOG 0, 0, 200, 50 +STYLE DS_MODALFRAME | DS_NOIDLEMSG | DS_CENTER | WS_POPUP | WS_DISABLED +EXSTYLE WS_EX_LAYOUTRTL +CAPTION "Wine" +FONT 8, "MS Shell Dlg" +BEGIN + ICON "", IDC_WAITICON, 3, 3, 10, 10 + LTEXT "התצורה של wine שב־%s מתעדכנת, נא להמתין...", + IDC_WAITTEXT, 40, 5, 150, 40, SS_NOPREFIX +END diff -Nru wine1.3-1.3.0/programs/winecfg/De.rc wine1.3-1.3.1/programs/winecfg/De.rc --- wine1.3-1.3.0/programs/winecfg/De.rc 2010-07-30 18:43:56.000000000 +0100 +++ wine1.3-1.3.1/programs/winecfg/De.rc 2010-08-20 18:23:50.000000000 +0100 @@ -72,20 +72,20 @@ FONT 8, "MS Shell Dlg" BEGIN GROUPBOX " Fenstereinstellungen ",IDC_STATIC,8,4,244,84 - CONTROL "DirectX-Anwendungen können Maus einfangen",IDC_DX_MOUSE_GRAB,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,15,20,230,8 + CONTROL "DirectX-Anwendungen können &Maus einfangen",IDC_DX_MOUSE_GRAB,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,15,20,230,8 CONTROL "Erlaube dem Fenstermanager die Fenster zu &dekorieren",IDC_ENABLE_DECORATED,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,15,32,230,8 - CONTROL "Erlaube dem Fenstermanager die Fenster zu kontrollieren",IDC_ENABLE_MANAGED,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,15,44,230,8 - CONTROL "Emuliere einen virtuellen Bildschirm",IDC_ENABLE_DESKTOP,"Button", + CONTROL "Erlaube dem Fenstermanager die &Fenster zu kontrollieren",IDC_ENABLE_MANAGED,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,15,44,230,8 + CONTROL "&Emuliere einen virtuellen Bildschirm",IDC_ENABLE_DESKTOP,"Button", BS_AUTOCHECKBOX | WS_TABSTOP,15,56,230,8 - LTEXT "Desktop-Größe:",IDC_DESKTOP_SIZE,15,70,54,8,WS_DISABLED + LTEXT "Desktop-&Größe:",IDC_DESKTOP_SIZE,15,70,54,8,WS_DISABLED LTEXT "X",IDC_DESKTOP_BY,119,70,8,8,WS_DISABLED EDITTEXT IDC_DESKTOP_WIDTH,74,68,40,12,ES_AUTOHSCROLL | ES_NUMBER | WS_DISABLED EDITTEXT IDC_DESKTOP_HEIGHT,127,68,40,12,ES_AUTOHSCROLL | ES_NUMBER | WS_DISABLED GROUPBOX " Direct3D ",IDC_STATIC,8,95,244,49 - LTEXT "Unterstützung für Vertex Shader: ",IDC_STATIC,15,106,80,32 + LTEXT "Unterstützung für &Vertex Shader: ",IDC_STATIC,15,106,80,32 COMBOBOX IDC_D3D_VSHADER_MODE,100,108,145,70,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP - CONTROL "Pixel Shader aktivieren (wenn von Hardware unterstützt)", IDC_D3D_PSHADER_MODE,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,15,126,230,10 + CONTROL "&Pixel Shader aktivieren (wenn von Hardware unterstützt)", IDC_D3D_PSHADER_MODE,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,15,126,230,10 GROUPBOX " Bildschi&rmauflösung ",IDC_STATIC,8,151,244,63 CONTROL "", IDC_RES_TRACKBAR, "msctls_trackbar32",WS_TABSTOP,12,161,187,15 @@ -101,10 +101,10 @@ GROUPBOX " DLL Überschreibung ",IDC_STATIC,8,4,244,210 LTEXT "DLLs (Dynamic Link Libraries) können einzeln eingestellt werden, entweder Builtin (gestellt durch Wine) oder Native (von Windows oder durch die Anwendung gestellt)." , IDC_STATIC,15,17,228,32 - LTEXT "Neue Überschreibung für:",IDC_STATIC,16,58,100,8 + LTEXT "&Neue Überschreibung für:",IDC_STATIC,16,58,100,8 COMBOBOX IDC_DLLCOMBO,16,68,140,14,CBS_DROPDOWN | WS_VSCROLL | WS_TABSTOP | CBS_SORT | CBS_LOWERCASE PUSHBUTTON "&Hinzufügen ",IDC_DLLS_ADDDLL, 164,68,82,13 - LTEXT "Bestehende Überschreibungen:",IDC_STATIC,16,86,100,8 + LTEXT "Bestehende Über&schreibungen:",IDC_STATIC,16,86,100,8 LISTBOX IDC_DLLS_LIST,16,96,140,112,WS_BORDER | WS_TABSTOP | WS_VSCROLL PUSHBUTTON "&Bearbeiten",IDC_DLLS_EDITDLL,164,96,82,14 PUSHBUTTON "&Entfernen",IDC_DLLS_REMOVEDLL,164,114,82,14 @@ -139,7 +139,7 @@ STYLE WS_CHILD | WS_DISABLED FONT 8, "MS Shell Dlg" BEGIN - GROUPBOX " Laufwerkszuordnung ",IDC_STATIC,8,4,244,195 + GROUPBOX " Laufwerksz&uordnung ",IDC_STATIC,8,4,244,195 LTEXT "Fehler beim Verbinden mit dem Mountmanager. Die Laufwerkskonfiguration kann nicht bearbeitet werden.", IDC_STATIC_MOUNTMGR_ERROR, 15,30,190,76 CONTROL "Listview",IDC_LIST_DRIVES,"SysListView32",LVS_REPORT | LVS_AUTOARRANGE | LVS_ALIGNLEFT | LVS_SINGLESEL | WS_BORDER | WS_TABSTOP, 15,18,232,76 @@ -165,7 +165,7 @@ LTEXT "S&eriennr:",IDC_STATIC_SERIAL,15,183,41,12 EDITTEXT IDC_EDIT_SERIAL,60,180,78,13,ES_AUTOHSCROLL | WS_TABSTOP - CONTROL "Zeige Dot-Dateien an",IDC_SHOW_DOT_FILES,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,8,205,230,8 + CONTROL "Zeige D&ot-Dateien an",IDC_SHOW_DOT_FILES,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,8,205,230,8 END IDD_AUDIOCFG DIALOG 0, 0, 260, 220 @@ -176,13 +176,13 @@ LTEXT "Wählen Sie einen Sound-Treiber durch ankreuzen des gewünschten Treibers. Ist kein Treiber ausgewählt, wird der Sound deaktiviert. Die Auswahl mehrerer Treiber ist nicht empfohlen. Ein Treiber kann durch Rechtsklicken konfiguriert werden.",IDC_STATIC,15,15,227,35 CONTROL "Geräte",IDC_AUDIO_TREE,"SysTreeView32",WS_BORDER | WS_TABSTOP,15,50,140,105 PUSHBUTTON "&Test Sound",IDC_AUDIO_TEST,170,50,59,14 - PUSHBUTTON "Einstellungen",IDC_AUDIO_CONTROL_PANEL,170,70,59,14 + PUSHBUTTON "&Einstellungen",IDC_AUDIO_CONTROL_PANEL,170,70,59,14 GROUPBOX " DirectSound ",IDC_STATIC,8,170,244,45 - LTEXT "Hardware-Beschleunigung: ", IDC_STATIC,15,180,90,10 + LTEXT "&Hardware-Beschleunigung: ", IDC_STATIC,15,180,90,10 COMBOBOX IDC_DSOUND_HW_ACCEL,105,178,140,70,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP - LTEXT "Abtastrate:",IDC_STATIC,15,197,70,8 + LTEXT "&Abtastrate:",IDC_STATIC,15,197,70,8 COMBOBOX IDC_DSOUND_RATES,90,195,42,76,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP - LTEXT "Bits pro Abtastung:",IDC_STATIC,137,197,80,8 + LTEXT "&Bits pro Abtastung:",IDC_STATIC,137,197,80,8 COMBOBOX IDC_DSOUND_BITS,220,195,30,56,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP END @@ -191,27 +191,27 @@ FONT 8, "MS Shell Dlg" BEGIN GROUPBOX " Darstellung ",IDC_STATIC,8,4,244,106 - LTEXT "Motiv:",IDC_STATIC,15,16,130,8 + LTEXT "&Motiv:",IDC_STATIC,15,16,130,8 COMBOBOX IDC_THEME_THEMECOMBO,15,24,130,14,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP - PUSHBUTTON "Motiv installieren...",IDC_THEME_INSTALL,152,23,93,14 - LTEXT "Farbe:",IDC_THEME_COLORTEXT,15,40,112,8 + PUSHBUTTON "Motiv &installieren...",IDC_THEME_INSTALL,152,23,93,14 + LTEXT "&Farbe:",IDC_THEME_COLORTEXT,15,40,112,8 COMBOBOX IDC_THEME_COLORCOMBO,15,48,112,14,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP - LTEXT "Größe:",IDC_THEME_SIZETEXT,135,40,110,8 + LTEXT "&Größe:",IDC_THEME_SIZETEXT,135,40,110,8 COMBOBOX IDC_THEME_SIZECOMBO,135,48,110,14,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP - LTEXT "Element:",IDC_STATIC,15,64,112,8 + LTEXT "&Element:",IDC_STATIC,15,64,112,8 COMBOBOX IDC_SYSPARAM_COMBO,15,74,112,120,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP | CBS_SORT - LTEXT "Farbe:",IDC_SYSPARAM_COLOR_TEXT,135,64,25,8,WS_DISABLED + LTEXT "F&arbe:",IDC_SYSPARAM_COLOR_TEXT,135,64,25,8,WS_DISABLED PUSHBUTTON "",IDC_SYSPARAM_COLOR,135,74,25,13,WS_DISABLED | BS_OWNERDRAW - LTEXT "Größe:",IDC_SYSPARAM_SIZE_TEXT,166,64,30,8,WS_DISABLED + LTEXT "G&röße:",IDC_SYSPARAM_SIZE_TEXT,166,64,30,8,WS_DISABLED EDITTEXT IDC_SYSPARAM_SIZE,166,74,23,13,ES_AUTOHSCROLL | WS_TABSTOP | WS_DISABLED CONTROL "",IDC_SYSPARAM_SIZE_UD,UPDOWN_CLASS,UDS_SETBUDDYINT | WS_DISABLED,187,74,15,13 - PUSHBUTTON "Schrift",IDC_SYSPARAM_FONT,208,74,37,13,WS_DISABLED - GROUPBOX " Shell-Ordner ",IDC_STATIC,8,114,244,100 + PUSHBUTTON "&Schrift",IDC_SYSPARAM_FONT,208,74,37,13,WS_DISABLED + GROUPBOX " Shell-&Ordner ",IDC_STATIC,8,114,244,100 CONTROL "Listview",IDC_LIST_SFPATHS,"SysListView32",LVS_REPORT | LVS_AUTOARRANGE | LVS_ALIGNLEFT | LVS_SINGLESEL | WS_BORDER | WS_TABSTOP, 15,126,230,64 - CONTROL "Verknüpfe:",IDC_LINK_SFPATH,"Button",BS_AUTOCHECKBOX|WS_TABSTOP|WS_DISABLED,15,195,50,13 + CONTROL "&Verknüpfe:",IDC_LINK_SFPATH,"Button",BS_AUTOCHECKBOX|WS_TABSTOP|WS_DISABLED,15,195,50,13 EDITTEXT IDC_EDIT_SFPATH,65,195,145,13,ES_AUTOHSCROLL|WS_TABSTOP|WS_DISABLED - PUSHBUTTON "Wählen",IDC_BROWSE_SFPATH,215,195,30,13,WS_DISABLED + PUSHBUTTON "&Wählen",IDC_BROWSE_SFPATH,215,195,30,13,WS_DISABLED END STRINGTABLE @@ -220,8 +220,8 @@ IDS_TAB_DLLS "Bibliotheken" IDS_TAB_DRIVES "Laufwerke" IDS_CHOOSE_PATH "Bitte wählen Sie das Ziel-Unix-Verzeichnis." - IDS_HIDE_ADVANCED "Verstecke Erweitert" - IDS_SHOW_ADVANCED "Zeige Erweitert" + IDS_HIDE_ADVANCED "nicht &Erweitert" + IDS_SHOW_ADVANCED "&Erweitert" IDS_NOTHEME "(Kein Motiv)" IDS_TAB_GRAPHICS "Grafik" IDS_TAB_DESKTOP_INTEGRATION "Desktop-Integration" diff -Nru wine1.3-1.3.0/programs/winemenubuilder/winemenubuilder.c wine1.3-1.3.1/programs/winemenubuilder/winemenubuilder.c --- wine1.3-1.3.0/programs/winemenubuilder/winemenubuilder.c 2010-07-30 18:43:56.000000000 +0100 +++ wine1.3-1.3.1/programs/winemenubuilder/winemenubuilder.c 2010-08-20 18:23:50.000000000 +0100 @@ -372,7 +372,7 @@ return TRUE; } -static BOOL extract_icon32(LPCWSTR szFileName, int nIndex, char *szXPMFileName) +static BOOL extract_icon_from_module(LPCWSTR szFileName, int nIndex, const char *icon_name) { HMODULE hModule; HRSRC hResInfo; @@ -452,7 +452,7 @@ { if ((pIcon = LockResource(hResData))) { - if (reassemble_and_save_to_png(&iconDirEntry, pIcon, szXPMFileName, szFileName)) + if (reassemble_and_save_to_png(&iconDirEntry, pIcon, icon_name, szFileName)) ret = TRUE; else ret = FALSE; @@ -466,24 +466,16 @@ return ret; } -static BOOL ExtractFromEXEDLL(LPCWSTR szFileName, int nIndex, char *szXPMFileName) +static int ExtractFromICO(LPCWSTR szFileName, const char *icon_name) { - if (!extract_icon32(szFileName, nIndex, szXPMFileName) /*&& - !extract_icon16(szFileName, szXPMFileName)*/) - return FALSE; - return TRUE; -} - -static int ExtractFromICO(LPCWSTR szFileName, char *szXPMFileName) -{ - FILE *fICOFile = NULL; + FILE *fICOFile; ICONDIR iconDir; ICONDIRENTRY *pIconDirEntry = NULL; int nMax = 0, nMaxBits = 0; int nIndex = 0; void *pIcon = NULL; int i; - char *filename = NULL; + char *filename; IStream *icoStream = NULL; HRESULT hr; @@ -536,7 +528,7 @@ goto error; } - if (!SaveIconStreamAsPNG(icoStream, nIndex, szXPMFileName, szFileName)) + if (!SaveIconStreamAsPNG(icoStream, nIndex, icon_name, szFileName)) goto error; HeapFree(GetProcessHeap(), 0, pIcon); @@ -556,7 +548,7 @@ return 0; } -static int ExtractFromFileType(LPCWSTR szFileName, char *szXPMFileName) +static int ExtractFromFileType(LPCWSTR szFileName, const char *icon_name) { int ret = 0; WCHAR *extension; @@ -590,7 +582,7 @@ WINE_TRACE("executable %s -> icon %s\n", wine_dbgstr_w(executable), wine_dbgstr_a(output_path)); } if (output_path) - ret = (rename(output_path, szXPMFileName) == 0); + ret = (rename(output_path, icon_name) == 0); end: HeapFree(GetProcessHeap(), 0, icon); @@ -599,11 +591,11 @@ return ret; } -static BOOL create_default_icon( char *filename ) +static BOOL create_default_icon( const char *filename ) { static const WCHAR user32W[] = {'u','s','e','r','3','2',0}; - return extract_icon32( user32W, -(INT_PTR)IDI_WINLOGO, filename ); + return extract_icon_from_module( user32W, -(INT_PTR)IDI_WINLOGO, filename ); } static unsigned short crc16(const char* string) @@ -737,7 +729,7 @@ static char *extract_icon( LPCWSTR path, int index, const char *destFilename, BOOL bWait ) { unsigned short crc; - char *iconsdir = NULL, *ico_path = NULL, *ico_name, *xpm_path = NULL; + char *iconsdir = NULL, *ico_path = NULL, *ico_name, *png_path = NULL; char* s; int n; @@ -781,37 +773,37 @@ /* Try to treat the source file as an exe */ if (destFilename) - xpm_path=heap_printf("%s/%s.png",iconsdir,destFilename); + png_path=heap_printf("%s/%s.png",iconsdir,destFilename); else - xpm_path=heap_printf("%s/%04x_%s.%d.png",iconsdir,crc,ico_name,index); - if (xpm_path == NULL) + png_path=heap_printf("%s/%04x_%s.%d.png",iconsdir,crc,ico_name,index); + if (png_path == NULL) { WINE_ERR("could not extract icon %s, out of memory\n", wine_dbgstr_a(ico_name)); return NULL; } - if (ExtractFromEXEDLL( path, index, xpm_path )) + if (extract_icon_from_module( path, index, png_path )) goto end; /* Must be something else, ignore the index in that case */ if (destFilename) - sprintf(xpm_path,"%s/%s.png",iconsdir,destFilename); + sprintf(png_path,"%s/%s.png",iconsdir,destFilename); else - sprintf(xpm_path,"%s/%04x_%s.png",iconsdir,crc,ico_name); - if (ExtractFromICO( path, xpm_path)) + sprintf(png_path,"%s/%04x_%s.png",iconsdir,crc,ico_name); + if (ExtractFromICO( path, png_path)) goto end; - if (ExtractFromFileType( path, xpm_path )) + if (ExtractFromFileType( path, png_path )) goto end; - if (!bWait && create_default_icon( xpm_path )) + if (!bWait && create_default_icon( png_path )) goto end; - HeapFree( GetProcessHeap(), 0, xpm_path ); - xpm_path=NULL; + HeapFree( GetProcessHeap(), 0, png_path ); + png_path=NULL; end: HeapFree(GetProcessHeap(), 0, iconsdir); HeapFree(GetProcessHeap(), 0, ico_path); - return xpm_path; + return png_path; } static HKEY open_menus_reg_key(void) @@ -2815,12 +2807,12 @@ if (szIconPath[0]) { - if (!ExtractFromEXEDLL(szIconPath, iconId, utf8OutputPath)) + if (!extract_icon_from_module(szIconPath, iconId, utf8OutputPath)) ExtractFromICO(szIconPath, utf8OutputPath); } else { - if (!ExtractFromEXEDLL(szPath, iconId, utf8OutputPath)) + if (!extract_icon_from_module(szPath, iconId, utf8OutputPath)) ExtractFromICO(szPath, utf8OutputPath); } diff -Nru wine1.3-1.3.0/programs/wordpad/It.rc wine1.3-1.3.1/programs/wordpad/It.rc --- wine1.3-1.3.0/programs/wordpad/It.rc 2010-07-30 18:43:56.000000000 +0100 +++ wine1.3-1.3.1/programs/wordpad/It.rc 2010-08-20 18:23:50.000000000 +0100 @@ -93,7 +93,7 @@ END POPUP "&Aiuto" BEGIN - MENUITEM "&Riguardo A Wine Wordpad" ID_ABOUT + MENUITEM "&Riguardo a Wine Wordpad" ID_ABOUT END END @@ -130,7 +130,7 @@ MENUITEM "Fucsia" ID_COLOR_FUCHSIA MENUITEM "Aqua" ID_COLOR_AQUA MENUITEM "Bianco" ID_COLOR_WHITE - MENUITEM "Automatic" ID_COLOR_AUTOMATIC + MENUITEM "Automatico" ID_COLOR_AUTOMATIC END END @@ -161,7 +161,7 @@ Caption "Formato del paragrafo" FONT 8, "MS Shell Dlg" BEGIN - GROUPBOX "Indentazione", -1, 10, 10, 120, 68 + GROUPBOX "Rientro", -1, 10, 10, 120, 68 LTEXT "Sinistra", -1, 15, 22, 40, 13 EDITTEXT IDC_PARA_LEFT, 55, 20, 60, 13 LTEXT "Destra", -1, 15, 40, 40, 13 @@ -211,7 +211,7 @@ STRING_TEXT_FILES_TXT, "File di testo (*.txt)" STRING_TEXT_FILES_UNICODE_TXT, "File di testo Unicode (*.txt)" STRING_RICHTEXT_FILES_RTF, "Formato rich text (*.rtf)" - STRING_NEWFILE_RICHTEXT, "Documento Rich text" + STRING_NEWFILE_RICHTEXT, "Documento rich text" STRING_NEWFILE_TXT, "Documento di testo" STRING_NEWFILE_TXT_UNICODE, "Documento di testo Unicode" STRING_PRINTER_FILES_PRN, "File di stampa (*.PRN)" @@ -264,6 +264,6 @@ STRING_WRITE_ACCESS_DENIED, "Non hai i diritti di accesso per salvare il file." STRING_OPEN_FAILED, "Impossibile aprire il file." STRING_OPEN_ACCESS_DENIED, "Non hai i diritti di accesso per aprire il file." - STRING_PRINTING_NOT_IMPLEMENTED, "Stampa non implementata" + STRING_PRINTING_NOT_IMPLEMENTED, "Stampa non implementata" STRING_MAX_TAB_STOPS, "Non si possono aggiungere più di 32 punti di fermata delle tabulazioni." END diff -Nru wine1.3-1.3.0/programs/wscript/main.c wine1.3-1.3.1/programs/wscript/main.c --- wine1.3-1.3.0/programs/wscript/main.c 2010-07-30 18:43:56.000000000 +0100 +++ wine1.3-1.3.1/programs/wscript/main.c 2010-08-20 18:23:50.000000000 +0100 @@ -320,21 +320,38 @@ int WINAPI wWinMain(HINSTANCE hInst, HINSTANCE hPrevInst, LPWSTR cmdline, int cmdshow) { + const WCHAR *ext, *filename = NULL; IActiveScriptParse *parser; IActiveScript *script; - const WCHAR *ext; + WCHAR **argv; CLSID clsid; + int argc, i; WINE_TRACE("(%p %p %s %x)\n", hInst, hPrevInst, wine_dbgstr_w(cmdline), cmdshow); - if(!*cmdline) + argv = CommandLineToArgvW(cmdline, &argc); + if(!argv) return 1; - ext = strchrW(cmdline, '.'); + for(i=0; i för att börja kopiera\n" + STRING_SIMCOPY, "%d fil(er) skulle kopieras\n" + STRING_COPY, "%d fil(er) kopierade\n" + STRING_QISDIR, "Är '%s' ett filnamn eller en katalog\n" \ + "på målet?\n" \ + "(F - Fil, K - Katalog)\n" + STRING_SRCPROMPT,"%s? (Ja|Nej)\n" + STRING_OVERWRITE,"Skriv över %s? (Ja|Nej|Alla)\n" + STRING_COPYFAIL, "Kunde inte kopiera '%s' till '%s'; misslyckades med r/c %d\n" + STRING_OPENFAIL, "Kunde inte öppna '%s'\n" + STRING_READFAIL, "Kunde inte läsa '%s'\n" + STRING_YES_CHAR, "J" + STRING_NO_CHAR, "N" + STRING_ALL_CHAR, "A" + STRING_FILE_CHAR,"F" + STRING_DIR_CHAR, "K" + + STRING_HELP, +"XCOPY - Kopierar källfiler eller katalogträd till ett mål\n\ +\n\ +Syntax:\n\ +XCOPY källa [dest] [/I] [/S] [/Q] [/F] [/L] [/W] [/T] [/N] [/U]\n\ +\t [/R] [/H] [/C] [/P] [/A] [/M] [/E] [/D] [/Y] [/-Y]\n\ +\n\ +Där:\n\ +\n\ +[/I] Antag att målet är en katalog om målet inte existerar och \n\ +\ två eller fler filer kopieras\n\ +[/S] Kopiera kataloger och underkataloger\n\ +[/E] Kopiera kataloger och underkataloger, inklusive tomma sådana\n\ +[/Q] Tyst läge: Lista inte filnamn under kopiering\n\ +[/F] Visa fulla käll- och målnamn under kopiering\n\ +[/L] Simulerar operationen och visar namn som skulle kopieras\n\ +[/W] Frågar innan kopieringen påbörjas\n\ +[/T] Skapar tom katalogstruktur men kopierar inga filer\n\ +[/Y] Fråga inte när filer skrivs över\n\ +[/-Y] Fråga innan filer skrivs över\n\ +[/P] Fråga för varje källfil som kopieras.\n\ +[/N] Kopiera som korta filnamn\n\ +[/U] Kopiera enbart filer som redan existerar i destinationskatalogen\n\ +[/R] Skriv över skrivskyddade filer\n\ +[/H] Inkludera gömda filer och systemfiler i kopian\n\ +[/C] Fortsätt även om ett fel uppstår under kopieringen\n\ +[/A] Kopiera enbart filer markerade som arkiv\n\ +[/M] Kopiera enbart filer markerade som arkiv, ta bort\n\ +\ markeringen\n\ +[/D | /D:m-d-y] Kopiera nya filer eller de ändrade efter angivet datum.\n\ +\t\tOm inget datum angivits utförs endast kopiering om målet är\n\ +\t\täldre än källan\n\n" + +} diff -Nru wine1.3-1.3.0/server/sock.c wine1.3-1.3.1/server/sock.c --- wine1.3-1.3.0/server/sock.c 2010-07-30 18:43:56.000000000 +0100 +++ wine1.3-1.3.1/server/sock.c 2010-08-20 18:23:50.000000000 +0100 @@ -524,6 +524,7 @@ static void sock_queue_async( struct fd *fd, const async_data_t *data, int type, int count ) { struct sock *sock = get_fd_user( fd ); + struct async *async; struct async_queue *queue; assert( sock->obj.ops == &sock_ops ); @@ -543,20 +544,19 @@ return; } - if ( ( !( sock->state & FD_READ ) && type == ASYNC_TYPE_READ ) || - ( !( sock->state & FD_WRITE ) && type == ASYNC_TYPE_WRITE ) ) + if ( ( !( sock->state & (FD_READ|FD_CONNECT) ) && type == ASYNC_TYPE_READ ) || + ( !( sock->state & (FD_WRITE|FD_CONNECT) ) && type == ASYNC_TYPE_WRITE ) ) { set_error( STATUS_PIPE_DISCONNECTED ); + return; } - else - { - struct async *async; - if (!(async = create_async( current, queue, data ))) return; - release_object( async ); - set_error( STATUS_PENDING ); - } + + if (!(async = create_async( current, queue, data ))) return; + release_object( async ); sock_reselect( sock ); + + set_error( STATUS_PENDING ); } static void sock_reselect_async( struct fd *fd, struct async_queue *queue ) diff -Nru wine1.3-1.3.0/server/window.c wine1.3-1.3.1/server/window.c --- wine1.3-1.3.0/server/window.c 2010-07-30 18:43:56.000000000 +0100 +++ wine1.3-1.3.1/server/window.c 2010-08-20 18:23:50.000000000 +0100 @@ -1834,7 +1834,7 @@ DECL_HANDLER(set_window_owner) { struct window *win = get_window( req->handle ); - struct window *owner = NULL; + struct window *owner = NULL, *ptr; if (!win) return; if (req->owner && !(owner = get_window( req->owner ))) return; @@ -1843,6 +1843,17 @@ set_error( STATUS_ACCESS_DENIED ); return; } + + /* make sure owner is not a successor of window */ + for (ptr = owner; ptr; ptr = ptr->owner ? get_window( ptr->owner ) : NULL) + { + if (ptr == win) + { + set_error( STATUS_INVALID_PARAMETER ); + return; + } + } + reply->prev_owner = win->owner; reply->full_owner = win->owner = owner ? owner->handle : 0; } diff -Nru wine1.3-1.3.0/tools/winapi/winapi_test wine1.3-1.3.1/tools/winapi/winapi_test --- wine1.3-1.3.0/tools/winapi/winapi_test 2010-07-30 18:43:56.000000000 +0100 +++ wine1.3-1.3.1/tools/winapi/winapi_test 2010-08-20 18:23:50.000000000 +0100 @@ -177,6 +177,10 @@ $align = $pointer_size; $kind = "pointer"; $size = $pointer_size; + } elsif(/^char$/) { + $align = 1; + $kind = "char"; + $size = 1; } elsif(/^(?:(signed|unsigned)\s+)?(?:__int8|char|byte)$/) { $align = 1; $kind = defined($1) ? $1 : "signed"; diff -Nru wine1.3-1.3.0/tools/winebuild/build.h wine1.3-1.3.1/tools/winebuild/build.h --- wine1.3-1.3.0/tools/winebuild/build.h 2010-07-30 18:43:56.000000000 +0100 +++ wine1.3-1.3.1/tools/winebuild/build.h 2010-08-20 18:23:50.000000000 +0100 @@ -135,6 +135,13 @@ extern enum target_cpu target_cpu; extern enum target_platform target_platform; +struct strarray +{ + const char **str; + unsigned int count; + unsigned int max; +}; + /* entry point flags */ #define FLAG_NORELAY 0x01 /* don't use relay debugging for this function */ #define FLAG_NONAME 0x02 /* don't export function by name */ @@ -199,6 +206,11 @@ extern char *xstrdup( const char *str ); extern char *strupper(char *s); extern int strendswith(const char* str, const char* end); +extern char *strmake(const char* fmt, ...) __attribute__((__format__ (__printf__, 1, 2 ))); +extern struct strarray *strarray_init(void); +extern void strarray_add( struct strarray *array, ... ); +extern void strarray_addv( struct strarray *array, char * const *argv ); +extern void strarray_free( struct strarray *array ); extern DECLSPEC_NORETURN void fatal_error( const char *msg, ... ) __attribute__ ((__format__ (__printf__, 1, 2))); extern DECLSPEC_NORETURN void fatal_perror( const char *msg, ... ) @@ -211,9 +223,10 @@ __attribute__ ((__format__ (__printf__, 1, 2))); extern void output_cfi( const char *format, ... ) __attribute__ ((__format__ (__printf__, 1, 2))); +extern void spawn( struct strarray *array ); extern char *find_tool( const char *name, const char * const *names ); -extern const char *get_as_command(void); -extern const char *get_ld_command(void); +extern struct strarray *get_as_command(void); +extern struct strarray *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); @@ -243,7 +256,6 @@ extern void add_import_dll( const char *name, const char *filename ); extern void add_delayed_import( const char *name ); -extern void add_ignore_symbol( const char *name ); extern void add_extra_ld_symbol( const char *name ); extern void read_undef_symbols( DLLSPEC *spec, char **argv ); extern void resolve_imports( DLLSPEC *spec ); diff -Nru wine1.3-1.3.0/tools/winebuild/import.c wine1.3-1.3.1/tools/winebuild/import.c --- wine1.3-1.3.0/tools/winebuild/import.c 2010-07-30 18:43:56.000000000 +0100 +++ wine1.3-1.3.1/tools/winebuild/import.c 2010-08-20 18:23:50.000000000 +0100 @@ -57,7 +57,6 @@ }; static struct name_table undef_symbols; /* list of undefined symbols */ -static struct name_table ignore_symbols; /* list of symbols to ignore */ static struct name_table extra_ld_symbols; /* list of extra symbols that ld should resolve */ static struct name_table delayed_imports; /* list of delayed import dlls */ static struct name_table ext_link_imports; /* list of external symbols to link to */ @@ -193,8 +192,7 @@ char *buffer; int fd; - buffer = xmalloc( strlen(path) + strlen(name) + 9 ); - sprintf( buffer, "%s/lib%s.def", path, name ); + buffer = strmake( "%s/lib%s.def", path, name ); /* check if the file exists */ if ((fd = open( buffer, O_RDONLY )) != -1) @@ -340,23 +338,6 @@ free_imports( imp ); } -/* add a symbol to the ignored symbol list */ -/* if the name starts with '-' the symbol is removed instead */ -void add_ignore_symbol( const char *name ) -{ - unsigned int i; - - if (name[0] == '-') /* remove it */ - { - if (!name[1]) empty_name_table( &ignore_symbols ); /* remove everything */ - else for (i = 0; i < ignore_symbols.count; i++) - { - if (!strcmp( ignore_symbols.names[i], name+1 )) remove_name( &ignore_symbols, i-- ); - } - } - else add_name( &ignore_symbols, name ); -} - /* add a symbol to the list of extra symbols that ld must resolve */ void add_extra_ld_symbol( const char *name ) { @@ -525,23 +506,16 @@ /* returns the name of the combined file */ 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; + char *ld_tmp_file, *undef_file; + struct strarray *args = get_ld_command(); undef_file = create_undef_symbols_file( spec ); - len += strlen(undef_file) + 1; ld_tmp_file = get_temp_file_name( output_file_name, ".o" ); - for (i = 0; argv[i]; i++) len += strlen(argv[i]) + 1; - 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", prog, err ); - free( cmd ); + + strarray_add( args, "-r", "-o", ld_tmp_file, undef_file, NULL ); + strarray_addv( args, argv ); + spawn( args ); + strarray_free( args ); return ld_tmp_file; } @@ -564,8 +538,7 @@ name = ldcombine_files( spec, argv ); - cmd = xmalloc( strlen(prog) + strlen(name) + 5 ); - sprintf( cmd, "%s -u %s", prog, name ); + cmd = strmake( "%s -u %s", prog, name ); if (!(f = popen( cmd, "r" ))) fatal_error( "Cannot execute '%s'\n", cmd ); @@ -591,7 +564,6 @@ unsigned int j, removed; ORDDEF *odp; - sort_names( &ignore_symbols ); check_undefined_forwards( spec ); for (i = 0; i < nb_imports; i++) @@ -600,7 +572,6 @@ for (j = removed = 0; j < undef_symbols.count; j++) { - if (find_name( undef_symbols.names[j], &ignore_symbols )) continue; odp = find_export( undef_symbols.names[j], imp->exports, imp->nb_exports ); if (odp) { @@ -1188,9 +1159,9 @@ for (i = pos = 0; i < ext_link_imports.count; i++) { - char buffer[256]; - sprintf( buffer, "__wine_spec_ext_link_%s", ext_link_imports.names[i] ); + char *buffer = strmake( "__wine_spec_ext_link_%s", ext_link_imports.names[i] ); output_import_thunk( buffer, ".L__wine_spec_external_links", pos ); + free( buffer ); pos += get_ptr_size(); } output_function_size( "__wine_spec_external_link_thunks" ); @@ -1320,9 +1291,8 @@ /* output an import library for a Win32 module and additional object files */ void output_import_lib( DLLSPEC *spec, char **argv ) { - char *dlltool, *def_file; - char *cmd; - int err; + struct strarray *args = strarray_init(); + char *def_file; if (target_platform != PLATFORM_WINDOWS) fatal_error( "Unix-style import libraries not supported yet\n" ); @@ -1335,33 +1305,17 @@ fclose( output_file ); output_file = NULL; - dlltool = find_tool( "dlltool", NULL ); - cmd = xmalloc( strlen(dlltool) + strlen(output_file_name) + strlen(def_file) + 12 ); - sprintf( cmd, "%s -k -l %s -d %s", dlltool, output_file_name, def_file ); - if (verbose) fprintf( stderr, "%s\n", cmd ); - err = system( cmd ); - if (err) fatal_error( "%s failed with status %d\n", dlltool, err ); - free( cmd ); - free( dlltool ); + strarray_add( args, find_tool( "dlltool", NULL ), "-k", "-l", output_file_name, "-d", def_file, NULL ); + spawn( args ); + strarray_free( args ); if (argv[0]) { - char *ar = find_tool( "ar", NULL ); - int i, len; - - for (i = len = 0; argv[i]; i++) len += strlen(argv[i]) + 1; - cmd = xmalloc( strlen(ar) + strlen(output_file_name) + len + 5 ); - sprintf( cmd, "%s rs %s", ar, output_file_name ); - for (i = 0; argv[i]; i++) - { - strcat( cmd, " " ); - strcat( cmd, argv[i] ); - } - if (verbose) fprintf( stderr, "%s\n", cmd ); - err = system( cmd ); - if (err) fatal_error( "%s failed with status %d\n", dlltool, err ); - free( cmd ); - free( ar ); + args = strarray_init(); + strarray_add( args, find_tool( "ar", NULL ), "rs", output_file_name, NULL ); + strarray_addv( args, argv ); + spawn( args ); + strarray_free( args ); } output_file_name = NULL; } diff -Nru wine1.3-1.3.0/tools/winebuild/main.c wine1.3-1.3.1/tools/winebuild/main.c --- wine1.3-1.3.0/tools/winebuild/main.c 2010-07-30 18:43:56.000000000 +0100 +++ wine1.3-1.3.1/tools/winebuild/main.c 2010-08-20 18:23:50.000000000 +0100 @@ -243,7 +243,6 @@ " --fake-module Create a fake binary module\n" " -h, --help Display this help message\n" " -H, --heap=SIZE Set the heap size for a Win16 dll\n" -" -i, --ignore=SYM[,SYM] Ignore specified symbols when resolving imports\n" " -I DIR Ignored for C flags compatibility\n" " -k, --kill-at Kill stdcall decorations in generated .def files\n" " -K, FLAGS Compiler flags (only -KPIC is supported)\n" @@ -291,7 +290,7 @@ LONG_OPT_VERSION }; -static const char short_options[] = "C:D:E:F:H:I:K:L:M:N:b:d:e:f:hi:kl:m:o:r:u:vw"; +static const char short_options[] = "C:D:E:F:H:I:K:L:M:N:b:d:e:f:hkl:m:o:r:u:vw"; static const struct option long_options[] = { @@ -318,7 +317,6 @@ { "filename", 1, 0, 'F' }, { "help", 0, 0, 'h' }, { "heap", 1, 0, 'H' }, - { "ignore", 1, 0, 'i' }, { "kill-at", 0, 0, 'k' }, { "library", 1, 0, 'l' }, { "library-path", 1, 0, 'L' }, @@ -413,18 +411,6 @@ case 'h': usage(0); break; - case 'i': - { - char *str = xstrdup( optarg ); - char *token = strtok( str, "," ); - while (token) - { - add_ignore_symbol( token ); - token = strtok( NULL, "," ); - } - free( str ); - } - break; case 'k': kill_at = 1; break; diff -Nru wine1.3-1.3.0/tools/winebuild/res32.c wine1.3-1.3.1/tools/winebuild/res32.c --- wine1.3-1.3.0/tools/winebuild/res32.c 2010-07-30 18:43:56.000000000 +0100 +++ wine1.3-1.3.1/tools/winebuild/res32.c 2010-08-20 18:23:50.000000000 +0100 @@ -601,7 +601,7 @@ { unsigned int i; char *res_file = NULL; - int fd, err; + int fd; if (!spec->nb_resources) fatal_error( "--resources mode needs at least one resource file as input\n" ); if (!output_file_name) fatal_error( "No output file name specified\n" ); @@ -656,14 +656,10 @@ if (res_file) { - char *prog = find_tool( "windres", NULL ); - char *cmd = xmalloc( strlen(prog) + strlen(res_file) + strlen(output_file_name) + 9 ); - sprintf( cmd, "%s -i %s -o %s", prog, res_file, output_file_name ); - if (verbose) fprintf( stderr, "%s\n", cmd ); - err = system( cmd ); - if (err) fatal_error( "%s failed with status %d\n", prog, err ); - free( cmd ); - free( prog ); + struct strarray *args = strarray_init(); + strarray_add( args, find_tool( "windres", NULL ), "-i", res_file, "-o", output_file_name, NULL ); + spawn( args ); + strarray_free( args ); } output_file_name = NULL; /* so we don't try to assemble it */ } diff -Nru wine1.3-1.3.0/tools/winebuild/spec16.c wine1.3-1.3.1/tools/winebuild/spec16.c --- wine1.3-1.3.0/tools/winebuild/spec16.c 2010-07-30 18:43:56.000000000 +0100 +++ wine1.3-1.3.1/tools/winebuild/spec16.c 2010-08-20 18:23:50.000000000 +0100 @@ -195,14 +195,15 @@ */ static const char *get_callfrom16_name( const ORDDEF *odp ) { - static char buffer[80]; + static char *buffer; - sprintf( buffer, "%s_%s_%s", - (odp->type == TYPE_PASCAL) ? "p" : - (odp->type == TYPE_VARARGS) ? "v" : "c", - (odp->flags & FLAG_REGISTER) ? "regs" : - (odp->flags & FLAG_RET16) ? "word" : "long", - odp->u.func.arg_types ); + free( buffer ); + buffer = strmake( "%s_%s_%s", + (odp->type == TYPE_PASCAL) ? "p" : + (odp->type == TYPE_VARARGS) ? "v" : "c", + (odp->flags & FLAG_REGISTER) ? "regs" : + (odp->flags & FLAG_RET16) ? "word" : "long", + odp->u.func.arg_types ); return buffer; } @@ -301,13 +302,13 @@ */ static void output_call16_function( ORDDEF *odp ) { - char name[256]; + char *name; int i, pos, stack_words; const char *args = odp->u.func.arg_types; int argsize = get_function_argsize( odp ); int needs_ldt = strchr( args, 'p' ) || strchr( args, 't' ); - sprintf( name, ".L__wine_spec_call16_%s", get_relay_name(odp) ); + name = strmake( ".L__wine_spec_call16_%s", get_relay_name(odp) ); output( "\t.align %d\n", get_alignment(4) ); output( "\t%s\n", func_declaration(name) ); @@ -406,6 +407,7 @@ output( "\tret\n" ); output_cfi( ".cfi_endproc" ); output_function_size( name ); + free( name ); } diff -Nru wine1.3-1.3.0/tools/winebuild/utils.c wine1.3-1.3.1/tools/winebuild/utils.c --- wine1.3-1.3.0/tools/winebuild/utils.c 2010-07-30 18:43:56.000000000 +0100 +++ wine1.3-1.3.1/tools/winebuild/utils.c 2010-08-20 18:23:50.000000000 +0100 @@ -39,9 +39,9 @@ #include "build.h" -#define MAX_TMP_FILES 8 -static const char *tmp_files[MAX_TMP_FILES]; +static const char **tmp_files; static unsigned int nb_tmp_files; +static unsigned int max_tmp_files; static const struct { @@ -66,7 +66,7 @@ static void cleanup_tmp_files(void) { unsigned int i; - for (i = 0; i < MAX_TMP_FILES; i++) if (tmp_files[i]) unlink( tmp_files[i] ); + for (i = 0; i < nb_tmp_files; i++) if (tmp_files[i]) unlink( tmp_files[i] ); } @@ -119,6 +119,65 @@ return l >= m && strcmp(str + l - m, end) == 0; } +char *strmake( const char* fmt, ... ) +{ + int n; + size_t size = 100; + va_list ap; + + for (;;) + { + char *p = xmalloc( size ); + va_start( ap, fmt ); + n = vsnprintf( p, size, fmt, ap ); + va_end( ap ); + if (n == -1) size *= 2; + else if ((size_t)n >= size) size = n + 1; + else return p; + free( p ); + } +} + +struct strarray *strarray_init(void) +{ + struct strarray *array = xmalloc( sizeof(*array) ); + array->count = 0; + array->max = 16; + array->str = xmalloc( array->max * sizeof(*array->str) ); + return array; +} + +static void strarray_add_one( struct strarray *array, const char *str ) +{ + if (array->count == array->max) + { + array->max *= 2; + array->str = xrealloc( array->str, array->max * sizeof(*array->str) ); + } + array->str[array->count++] = str; +} + +void strarray_add( struct strarray *array, ... ) +{ + va_list valist; + const char *str; + + va_start( valist, array ); + while ((str = va_arg( valist, const char *))) strarray_add_one( array, str ); + va_end( valist ); +} + +void strarray_addv( struct strarray *array, char * const *argv ) +{ + while (*argv) strarray_add_one( array, *argv++ ); +} + +void strarray_free( struct strarray *array ) +{ + free( array->str ); + free( array ); +} + void fatal_error( const char *msg, ... ) { va_list valist; @@ -199,6 +258,24 @@ return ret; } +void spawn( struct strarray *args ) +{ + unsigned int i; + int status; + + strarray_add_one( args, NULL ); + if (verbose) + for (i = 0; args->str[i]; i++) + fprintf( stderr, "%s%c", args->str[i], args->str[i+1] ? ' ' : '\n' ); + + if ((status = spawnvp( _P_WAIT, args->str[0], args->str ))) + { + if (status > 0) fatal_error( "%s failed with status %u\n", args->str[0], status ); + else fatal_perror( "winebuild" ); + exit( 1 ); + } +} + /* find a build tool in the path, trying the various names */ char *find_tool( const char *name, const char * const *names ) { @@ -210,14 +287,7 @@ unsigned int i, len; struct stat st; - if (target_alias) - { - file = xmalloc( strlen(target_alias) + strlen(name) + 2 ); - strcpy( file, target_alias ); - strcat( file, "-" ); - strcat( file, name ); - return file; - } + if (target_alias) return strmake( "%s-%s", target_alias, name ); if (!dirs) { @@ -270,53 +340,59 @@ return xstrdup( name ); } -const char *get_as_command(void) +struct strarray *get_as_command(void) { + struct strarray *args = strarray_init(); + if (!as_command) { static const char * const commands[] = { "gas", "as", NULL }; as_command = find_tool( "as", commands ); + } + strarray_add_one( args, as_command ); - if (force_pointer_size) + if (force_pointer_size) + { + switch (target_platform) { - const char *args = (target_platform == PLATFORM_APPLE) ? - ((force_pointer_size == 8) ? " -arch x86_64" : " -arch i386") : - ((force_pointer_size == 8) ? " --64" : " --32"); - as_command = xrealloc( as_command, strlen(as_command) + strlen(args) + 1 ); - strcat( as_command, args ); + case PLATFORM_APPLE: + strarray_add( args, "-arch", (force_pointer_size == 8) ? "x86_64" : "i386", NULL ); + break; + default: + strarray_add_one( args, (force_pointer_size == 8) ? "--64" : "--32" ); + break; } } - return as_command; + return args; } -const char *get_ld_command(void) +struct strarray *get_ld_command(void) { + struct strarray *args = strarray_init(); + if (!ld_command) { static const char * const commands[] = { "ld", "gld", NULL }; ld_command = find_tool( "ld", commands ); + } + strarray_add_one( args, ld_command ); - if (force_pointer_size) + if (force_pointer_size) + { + switch (target_platform) { - const char *args; - - switch (target_platform) - { - case PLATFORM_APPLE: - args = (force_pointer_size == 8) ? " -arch x86_64" : " -arch i386"; - break; - case PLATFORM_FREEBSD: - args = (force_pointer_size == 8) ? " -m elf_x86_64_fbsd" : " -m elf_i386_fbsd"; - break; - default: - args = (force_pointer_size == 8) ? " -m elf_x86_64" : " -m elf_i386"; - break; - } - ld_command = xrealloc( ld_command, strlen(ld_command) + strlen(args) + 1 ); - strcat( ld_command, args ); + case PLATFORM_APPLE: + strarray_add( args, "-arch", (force_pointer_size == 8) ? "x86_64" : "i386", NULL ); + break; + case PLATFORM_FREEBSD: + strarray_add( args, "-m", (force_pointer_size == 8) ? "elf_x86_64_fbsd" : "elf_i386_fbsd", NULL ); + break; + default: + strarray_add( args, "-m", (force_pointer_size == 8) ? "elf_x86_64" : "elf_i386", NULL ); + break; } } - return ld_command; + return args; } const char *get_nm_command(void) @@ -336,7 +412,6 @@ const char *ext; int fd; - assert( nb_tmp_files < MAX_TMP_FILES ); if (!nb_tmp_files && !save_temps) atexit( cleanup_tmp_files ); if (!prefix || !prefix[0]) prefix = "winebuild"; @@ -355,6 +430,11 @@ fatal_error( "could not generate a temp file\n" ); close( fd ); + if (nb_tmp_files >= max_tmp_files) + { + max_tmp_files = max( 2 * max_tmp_files, 8 ); + tmp_files = xrealloc( tmp_files, max_tmp_files * sizeof(tmp_files[0]) ); + } tmp_files[nb_tmp_files++] = name; return name; } @@ -548,10 +628,7 @@ if (!file && srcdir) { - fullname = xmalloc( strlen(srcdir) + strlen(name) + 2 ); - strcpy( fullname, srcdir ); - strcat( fullname, "/" ); - strcat( fullname, name ); + fullname = strmake( "%s/%s", srcdir, name ); file = fopen( fullname, "r" ); } else fullname = xstrdup( name ); @@ -601,16 +678,10 @@ */ void assemble_file( const char *src_file, const char *obj_file ) { - const char *prog = get_as_command(); - char *cmd; - int err; - - 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", prog, err ); - free( cmd ); + struct strarray *args = get_as_command(); + strarray_add( args, "-o", obj_file, src_file, NULL ); + spawn( args ); + strarray_free( args ); } @@ -708,16 +779,19 @@ */ const char *get_stub_name( const ORDDEF *odp, const DLLSPEC *spec ) { - static char buffer[256]; + static char *buffer; + + free( buffer ); if (odp->name || odp->export_name) { char *p; - sprintf( buffer, "__wine_stub_%s", odp->name ? odp->name : odp->export_name ); + buffer = strmake( "__wine_stub_%s", odp->name ? odp->name : odp->export_name ); /* make sure name is a legal C identifier */ for (p = buffer; *p; p++) if (!isalnum(*p) && *p != '_') break; if (!*p) return buffer; + free( buffer ); } - sprintf( buffer, "__wine_stub_%s_%d", make_c_identifier(spec->file_name), odp->ordinal ); + buffer = strmake( "__wine_stub_%s_%d", make_c_identifier(spec->file_name), odp->ordinal ); return buffer; } @@ -819,15 +893,15 @@ /* return the assembly name for a C symbol */ const char *asm_name( const char *sym ) { - static char buffer[256]; + static char *buffer; switch (target_platform) { case PLATFORM_APPLE: case PLATFORM_WINDOWS: if (sym[0] == '.' && sym[1] == 'L') return sym; - buffer[0] = '_'; - strcpy( buffer + 1, sym ); + free( buffer ); + buffer = strmake( "_%s", sym ); return buffer; default: return sym; @@ -837,23 +911,25 @@ /* return an assembly function declaration for a C function name */ const char *func_declaration( const char *func ) { - static char buffer[256]; + static char *buffer; switch (target_platform) { case PLATFORM_APPLE: return ""; case PLATFORM_WINDOWS: - sprintf( buffer, ".def _%s; .scl 2; .type 32; .endef", func ); + free( buffer ); + buffer = strmake( ".def _%s; .scl 2; .type 32; .endef", func ); break; default: + free( buffer ); switch(target_cpu) { case CPU_ARM: - sprintf( buffer, ".type %s,%%function", func ); + buffer = strmake( ".type %s,%%function", func ); break; default: - sprintf( buffer, ".type %s,@function", func ); + buffer = strmake( ".type %s,@function", func ); break; } break; @@ -913,20 +989,22 @@ /* return a global symbol declaration for an assembly symbol */ const char *asm_globl( const char *func ) { - static char buffer[256]; + static char *buffer; + free( buffer ); switch (target_platform) { case PLATFORM_APPLE: - sprintf( buffer, "\t.globl _%s\n\t.private_extern _%s\n_%s:", func, func, func ); - return buffer; + buffer = strmake( "\t.globl _%s\n\t.private_extern _%s\n_%s:", func, func, func ); + break; case PLATFORM_WINDOWS: - sprintf( buffer, "\t.globl _%s\n_%s:", func, func ); - return buffer; + buffer = strmake( "\t.globl _%s\n_%s:", func, func ); + break; default: - sprintf( buffer, "\t.globl %s\n\t.hidden %s\n%s:", func, func, func ); - return buffer; + buffer = strmake( "\t.globl %s\n\t.hidden %s\n%s:", func, func, func ); + break; } + return buffer; } const char *get_asm_ptr_keyword(void) diff -Nru wine1.3-1.3.0/tools/winebuild/winebuild.man.in wine1.3-1.3.1/tools/winebuild/winebuild.man.in --- wine1.3-1.3.0/tools/winebuild/winebuild.man.in 2010-07-30 18:43:56.000000000 +0100 +++ wine1.3-1.3.1/tools/winebuild/winebuild.man.in 2010-08-20 18:23:50.000000000 +0100 @@ -122,14 +122,6 @@ Specify the size of the module local heap in bytes (only valid for Win16 modules); default is no local heap. .TP -.BI \-i,\ --ignore= [-]symbol[,[-]symbol] -Specify a list of symbols that should be ignored when resolving -undefined symbols against the imported libraries. This forces these -symbols to be resolved from the Unix C library (or from another Unix -library linked with the application). If a symbol is prefixed by '-' -it is removed from the list instead of being added; a stand-alone '-' -clears the whole list. -.TP .BI \-I\ directory Ignored for compatibility with the C compiler. .TP diff -Nru wine1.3-1.3.0/tools/winegcc/utils.h wine1.3-1.3.1/tools/winegcc/utils.h --- wine1.3-1.3.0/tools/winegcc/utils.h 2010-07-30 18:43:56.000000000 +0100 +++ wine1.3-1.3.1/tools/winegcc/utils.h 2010-08-20 18:23:50.000000000 +0100 @@ -21,6 +21,10 @@ */ +#ifndef __GNUC__ +#define __attribute__(X) +#endif + #ifndef DECLSPEC_NORETURN # if defined(_MSC_VER) && (_MSC_VER >= 1200) && !defined(MIDL_PASS) # define DECLSPEC_NORETURN __declspec(noreturn) @@ -46,7 +50,7 @@ void* xmalloc(size_t size); void* xrealloc(void* p, size_t size); char *xstrdup( const char *str ); -char* strmake(const char* fmt, ...); +char* strmake(const char* fmt, ...) __attribute__((__format__ (__printf__, 1, 2 ))); int strendswith(const char* str, const char* end); typedef struct { diff -Nru wine1.3-1.3.0/tools/wine.inf.in wine1.3-1.3.1/tools/wine.inf.in --- wine1.3-1.3.0/tools/wine.inf.in 2010-07-30 18:43:56.000000000 +0100 +++ wine1.3-1.3.1/tools/wine.inf.in 2010-08-20 18:23:50.000000000 +0100 @@ -2507,6 +2507,7 @@ 11,,dsound.dll,1 11,,dswave.dll,1 11,,dxdiagn.dll,1 +11,,explorerframe.dll,1 11,,gameux.dll,1 11,,hhctrl.ocx,1 11,,hlink.dll,1 diff -Nru wine1.3-1.3.0/VERSION wine1.3-1.3.1/VERSION --- wine1.3-1.3.0/VERSION 2010-07-30 18:43:56.000000000 +0100 +++ wine1.3-1.3.1/VERSION 2010-08-20 18:23:50.000000000 +0100 @@ -1 +1 @@ -Wine version 1.3.0 +Wine version 1.3.1