From 638f169b1e2aefe02d3c2444faa6db624d52a674 Mon Sep 17 00:00:00 2001 From: Alexandre Julliard Date: Sun, 17 Jan 1999 16:32:32 +0000 Subject: [PATCH] Recovery of release 990110 after disk crash. See Changelog for changes between 990103 and 990110. --- ANNOUNCE | 18 +- ChangeLog | 241 +++++ Makefile.in | 3 +- configure | 266 +++-- configure.in | 14 +- console/ncurses.c | 13 +- controls/listbox.c | 21 +- debugger/editline.c | 11 +- debugger/msc.c | 102 +- dlls/comctl32/Makefile.in | 1 + dlls/comctl32/commctrl.c | 6 + dlls/comctl32/datetime.c | 50 +- dlls/comctl32/flatsb.c | 179 ++++ dlls/comctl32/imagelist.c | 4 +- dlls/comctl32/propsheet.c | 169 ++- dlls/comctl32/tab.c | 342 +++++- dlls/comctl32/trackbar.c | 7 +- dlls/ntdll/rtl.c | 11 + dlls/shell32/contmenu.c | 11 +- dlls/shell32/dataobject.c | 258 +++-- dlls/shell32/enumidlist.c | 3 +- dlls/shell32/folders.c | 3 +- dlls/shell32/iconcache.c | 2 +- dlls/shell32/pidl.c | 301 ++---- dlls/shell32/pidl.h | 81 +- dlls/shell32/shell32_main.c | 30 +- dlls/shell32/shell32_main.h | 2 +- dlls/shell32/shelllink.c | 279 ++--- dlls/shell32/shellole.c | 84 +- dlls/shell32/shellord.c | 5 +- dlls/shell32/shlfolder.c | 135 +-- dlls/shell32/shlview.c | 47 +- dlls/winaspi/winaspi16.c | 6 + documentation/bugreports | 22 +- documentation/fonts | 5 +- documentation/wine.man | 20 +- files/async.c | 3 +- files/file.c | 13 +- graphics/d3dcommon.c | 18 + graphics/d3ddevices.c | 7 +- graphics/d3dtexture.c | 83 +- graphics/ddraw.c | 106 +- graphics/vga.c | 3 +- graphics/x11drv/xfont.c | 6 +- if1632/compobj.spec | 20 +- if1632/relay.c | 6 +- include/acconfig.h | 3 + include/commctrl.h | 164 ++- include/compobj.h | 51 +- include/config.h.in | 6 + include/d3d.h | 66 +- include/ddraw.h | 5 +- include/debug.h | 103 +- include/debugdefs.h | 4 +- include/dinput.h | 2 + include/dosexe.h | 2 + include/dplay.h | 2 + include/dsound.h | 1 - include/flatsb.h | 20 + include/interfaces.h | 19 - include/main.h | 3 + include/miscemu.h | 5 +- include/msdos.h | 21 + include/multimedia.h | 8 +- include/objbase.h | 584 ++--------- include/objidl.h | 22 + include/ole.h | 33 +- include/ole2.h | 7 +- include/oleobj.h | 8 +- include/options.h | 3 +- include/propsheet.h | 21 + include/servprov.h | 34 + include/shell.h | 10 +- include/shlguid.h | 13 + include/shlobj.h | 175 +--- include/storage.h | 262 +---- include/tab.h | 19 +- include/unknwn.h | 8 + include/version.h | 2 +- include/winbase.h | 1 + include/windows.h | 12 +- include/{objbase.h => wine/obj_base.h} | 301 +++++- include/wine/obj_channel.h | 60 ++ include/wine/obj_clientserver.h | 57 + include/wine/obj_dataobject.h | 192 ++++ include/wine/obj_marshal.h | 34 + include/wine/obj_misc.h | 54 + include/wine/obj_moniker.h | 87 ++ include/wine/obj_propertystorage.h | 52 + include/wine/obj_storage.h | 459 ++++++++ include/winerror.h | 5 +- include/wtypes.h | 68 ++ include/x11drv.h | 2 + libtest/.cvsignore | 2 + libtest/Makefile.in | 6 +- libtest/vartest-Win32.log | 1800 ++++++++++++++++++++++++++++++++ libtest/vartest.c | 1051 +++++++++++++++++++ libtest/vartest.readme | 21 + loader/dos/dosmod.c | 74 +- loader/dos/dosmod.h | 1 + loader/dos/dosvm.c | 52 + loader/dos/module.c | 4 +- loader/main.c | 4 + loader/ne/convert.c | 26 + loader/ne/segment.c | 13 +- loader/task.c | 1 - memory/virtual.c | 11 +- misc/main.c | 26 +- misc/printdrv.c | 19 + misc/registry.c | 6 + misc/shell.c | 1 - misc/version.c | 47 +- misc/winsock_dns.c | 2 +- msdos/Makefile.in | 1 + msdos/cdrom.c | 5 +- msdos/dosconf.c | 440 ++++++++ msdos/int10.c | 14 +- msdos/int21.c | 51 +- msdos/ioports.c | 273 +++-- multimedia/dplay.c | 2 - multimedia/dsound.c | 27 +- objects/dc.c | 1 + objects/font.c | 2 +- ole/compobj.c | 158 ++- ole/ifs.c | 222 ++-- ole/moniker.c | 13 +- ole/ole2.c | 5 +- ole/ole2disp.c | 4 +- ole/oledlg.c | 2 +- ole/oleobj.c | 7 +- ole/storage.c | 159 +-- ole/typelib.c | 5 +- ole/variant.c | 12 +- programs/clock/language.c | 2 +- programs/notepad/language.c | 2 +- programs/progman/main.c | 4 +- relay32/builtin32.c | 1 + relay32/comctl32.spec | 28 +- relay32/ntdll.spec | 4 +- relay32/ole32.spec | 8 +- relay32/relay386.c | 1 + relay32/winspool.spec | 4 +- scheduler/k32obj.c | 1 + scheduler/syslevel.c | 1 + server/console.c | 2 +- server/file.c | 17 +- tools/wrc/CHANGES | 40 + tools/wrc/dumpres.c | 50 +- tools/wrc/genres.c | 71 ++ tools/wrc/newstruc.c | 11 +- tools/wrc/newstruc.h | 2 + tools/wrc/parser.l | 14 +- tools/wrc/parser.y | 188 +++- tools/wrc/readres.c | 1 + tools/wrc/utils.c | 18 +- tools/wrc/utils.h | 4 - tools/wrc/wrc.h | 39 +- tools/wrc/wrctypes.h | 55 + tools/wrc/writeres.c | 17 +- win32/console.c | 47 +- win32/device.c | 2 +- windows/dialog.c | 1 + windows/dinput.c | 4 +- windows/hook.c | 7 +- windows/queue.c | 7 + windows/sysmetrics.c | 12 + windows/win.c | 8 +- windows/winpos.c | 6 + windows/winproc.c | 14 + 169 files changed, 8863 insertions(+), 2487 deletions(-) create mode 100644 dlls/comctl32/flatsb.c rewrite include/compobj.h (99%) create mode 100644 include/flatsb.h rewrite include/objbase.h (99%) create mode 100644 include/objidl.h create mode 100644 include/propsheet.h create mode 100644 include/servprov.h create mode 100644 include/shlguid.h rewrite include/storage.h (99%) create mode 100644 include/unknwn.h copy include/{objbase.h => wine/obj_base.h} (66%) create mode 100644 include/wine/obj_channel.h create mode 100644 include/wine/obj_clientserver.h create mode 100644 include/wine/obj_dataobject.h create mode 100644 include/wine/obj_marshal.h create mode 100644 include/wine/obj_misc.h create mode 100644 include/wine/obj_moniker.h create mode 100644 include/wine/obj_propertystorage.h create mode 100644 include/wine/obj_storage.h create mode 100644 include/wtypes.h create mode 100644 libtest/vartest-Win32.log create mode 100644 libtest/vartest.c create mode 100644 libtest/vartest.readme create mode 100644 msdos/dosconf.c diff --git a/ANNOUNCE b/ANNOUNCE index 8e1d7d65ee9..960f4a5190d 100644 --- a/ANNOUNCE +++ b/ANNOUNCE @@ -1,4 +1,4 @@ -This is release 990103 of Wine, a free implementation of Windows on +This is release 990110 of Wine, a free implementation of Windows on Unix. This is still a developers only release. There are many bugs and unimplemented features. Most applications still do not work correctly. @@ -6,11 +6,9 @@ correctly. Patches should be submitted to "julliard@lrc.epfl.ch". Please don't forget to include a ChangeLog entry. -WHAT'S NEW with Wine-990103: (see ChangeLog for details) - - Improved console support. - - Tons of new stubs. - - Improvements to header files compatibility. - - More features in Wine server. +WHAT'S NEW with Wine-990110: (see ChangeLog for details) + - Many more COM interfaces definitions. + - Improvements to the resource compiler. - Lots of bug fixes. See the README file in the distribution for installation instructions. @@ -19,10 +17,10 @@ Because of lags created by using mirror, this message may reach you before the release is available at the ftp sites. The sources will be available from the following locations: - ftp://metalab.unc.edu/pub/Linux/ALPHA/wine/development/Wine-990103.tar.gz - ftp://tsx-11.mit.edu/pub/linux/ALPHA/Wine/development/Wine-990103.tar.gz - ftp://ftp.infomagic.com/pub/mirrors/linux/sunsite/ALPHA/wine/development/Wine-990103.tar.gz - ftp://ftp.progsoc.uts.edu.au/pub/Wine/development/Wine-990103.tar.gz + ftp://metalab.unc.edu/pub/Linux/ALPHA/wine/development/Wine-990110.tar.gz + ftp://tsx-11.mit.edu/pub/linux/ALPHA/Wine/development/Wine-990110.tar.gz + ftp://ftp.infomagic.com/pub/mirrors/linux/sunsite/ALPHA/wine/development/Wine-990110.tar.gz + ftp://ftp.progsoc.uts.edu.au/pub/Wine/development/Wine-990110.tar.gz It should also be available from any site that mirrors tsx-11 or sunsite. diff --git a/ChangeLog b/ChangeLog index 96c9e11c547..feec784a1fa 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,244 @@ +Sun Jan 10 14:40:34 1999 Alexandre Julliard + + * include/miscemu.h, include/msdos.h, loader/main.c, msdos/Makefile.in, msdos/dosconf.c, msdos/int21.c: + Andreas Mohr + Added config.sys parser. + + * controls/listbox.c: Pascal Cuoq + Small change in LB_SETCURSEL32 handling (the caret should be moved as + well). + + * configure, configure.in, files/async.c, include/config.h.in, misc/winsock_dns.c, msdos/int21.c, ole/compobj.c: + Marcus Meissner + Use autoconf check for presence of sys/file.h. + + * dlls/ntdll/rtl.c, relay32/ntdll.spec: + Marcus Meissner + Implemented DbgPrint, added ultoa. + + * win32/console.c: Peter Hunnisett + PeekConsoleInput & ReadConsoleInput need to return 0 records read in + the case of an invalid handle. + + * console/ncurses.c, loader/main.c: + Joseph Pranevich + More verbose debugging output. + Remove compilation warning. + + * msdos/int10.c: Joseph Pranevich + Fix up some interrupt calls to return at the data that they are supposed + to. Also increase comment verbosity to help debug things later. + + * include/options.h, misc/main.c, misc/version.c: + Andreas Mohr + Added switch -dosver. + Cleanup for OaBuildVersion(). + + * libtest/.cvsignore: Added vartest and volinfo + + * dlls/shell32/contmenu.c, dlls/shell32/pidl.c, dlls/shell32/pidl.h, dlls/shell32/shelllink.c, dlls/shell32/shellord.c, dlls/shell32/shlfolder.c, dlls/shell32/shlview.c, include/shell.h: + Juergen Schmied + Many bugfixes, code cleanup. + Removed a few glitches from the COM patch. + + * windows/dialog.c: Lawson Whitney + Only destroy window once. + + * graphics/ddraw.c, include/ddraw.h: + Marcus Meissner + - moved drawable to common since it is used by both DGA and Xlib. + (fixes one bad memory corruption bug in DGA (StarCraft and Diablo) + - added BltFast sanity checks. + + * windows/queue.c, loader/task.c: + Ulrich Weigand + InitApp() call removed from 32-bit application startup; + create task message queue in InitThreadInput() instead. + + * loader/ne/convert.c: + Ulrich Weigand + Added accelerator table PE->NE resource conversion. + + * debugger/editline.c: + Ulrich Weigand + Restart read() in case of EINTR in TTYget(). + + * dlls/shell32/shellole.c: Marcus Meissner + Ptr ref wrong. + + * tools/wrc/CHANGES, tools/wrc/dumpres.c, tools/wrc/genres.c, tools/wrc/newstruc.c, tools/wrc/newstruc.h, tools/wrc/parser.l, tools/wrc/parser.y, tools/wrc/readres.c, tools/wrc/utils.c, tools/wrc/utils.h, tools/wrc/wrc.h, tools/wrc/wrctypes.h, tools/wrc/writeres.c: + Bertho Stultiens + Wrc version 1.0.8. Toolbar resources are now supported. A couple of + other fixes are also included. See file tools/wrc/CHANGES for details. + + * ole/compobj.c: Marcus Meissner + Missing WINAPI. + + * include/x11drv.h, loader/dos/module.c, objects/dc.c, relay32/builtin32.c, relay32/relay386.c, scheduler/k32obj.c, files/async.c, if1632/relay.c, include/main.h, include/multimedia.h, include/windows.h: + James Juran + Add missing #includes and prototypes to eliminate some implicit + function declaration warnings and 'extern's in .c files. + + * configure, configure.in, console/ncurses.c, include/acconfig.h, include/config.h.in: + Ove Kaaven + Check for resizeterm in ncurses. + + * libtest/Makefile.in, libtest/vartest-Win32.log, libtest/vartest.c, libtest/vartest.readme: + Francis Beaudet + New test program for VARIANT functions. + + * debugger/msc.c: Eric Pouech + Some debug information (PDB) was not mapped when loading a module, + which caused a core in the debugger when it tried to access it. + + * Makefile.in: Ove Kaaven + Links libwine.so.1.0 to libwine.so in Wine's main directory. + Makes Wine compile with --enable-dll again. + +Sat Jan 9 09:12:40 1999 Alexandre Julliard + + * relay32/ole32.spec, windows/dinput.c, include/storage.h, include/unknwn.h, include/windows.h, include/wine/obj_base.h, include/wine/obj_channel.h, include/wine/obj_clientserver.h, include/wine/obj_dataobject.h, include/wine/obj_marshal.h, include/wine/obj_misc.h, include/wine/obj_moniker.h, include/wine/obj_propertystorage.h, include/wine/obj_storage.h, include/winerror.h, include/wtypes.h, misc/shell.c, multimedia/dplay.c, multimedia/dsound.c, objects/font.c, ole/compobj.c, ole/ifs.c, ole/moniker.c, ole/ole2.c, ole/ole2disp.c, ole/oledlg.c, ole/oleobj.c, ole/storage.c, ole/typelib.c, dlls/shell32/dataobject.c, dlls/shell32/enumidlist.c, dlls/shell32/folders.c, dlls/shell32/pidl.c, dlls/shell32/shell32_main.c, dlls/shell32/shelllink.c, dlls/shell32/shellole.c, dlls/shell32/shellord.c, dlls/shell32/shlfolder.c, dlls/shell32/shlview.c, graphics/ddraw.c, graphics/vga.c, if1632/compobj.spec, include/compobj.h, include/ddraw.h, include/dinput.h, include/dplay.h, include/dsound.h, include/interfaces.h, include/objbase.h, include/objidl.h, include/ole.h, include/ole2.h, include/oleobj.h, include/servprov.h, include/shell.h, include/shlguid.h, include/shlobj.h, dlls/comctl32/imagelist.c, dlls/shell32/contmenu.c: + Francois Gouget + Added a lot of COM interfaces definitions. + Restructured COM header files for better compatibility and clarity. + +Fri Jan 8 16:37:03 1999 Alexandre Julliard + + * files/file.c: Set GENERIC_READ|GENERIC_WRITE access for OF_CREATE. + Make GetFileType work for all handle types. + + * win32/device.c: Avoid crash on NULL dev->info. + + * include/flatsb.h, relay32/comctl32.spec, dlls/comctl32/Makefile.in, dlls/comctl32/commctrl.c, dlls/comctl32/flatsb.c, include/commctrl.h: + Alex Priem + Added stubs and defines for the flat scrollbar common control. + + * include/commctrl.h, dlls/comctl32/datetime.c: + Alex Priem + Added some defines needed for custom draw'ing and datetime common + controls. + + * dlls/shell32/iconcache.c: Eddie Carpenter + Fixed a small bug in function ExtractIconEx32A. + + * windows/winproc.c: Juergen Schmied + HTASK16 -> threadID mapping of WM_ACTIVATEAPP. + + * files/file.c: Bertho Stultiens + Make DeleteFile fail for empty path. + + * msdos/ioports.c: Gerald Pfeifer + Fix dummy_ctr stuff to work even without DIRECT_IO_ACCESS. + + * loader/ne/segment.c: Marcus Meissner + Fixed wrong buffer which caused fixups to fail. + + * graphics/d3dcommon.c, graphics/d3ddevices.c, graphics/d3dtexture.c, include/d3d.h: + Lionel Ulmer + - added all the Direct3D error codes + - added 8bit palettized texture support + + * msdos/cdrom.c: Marcus Meissner + ifdefs for defines not in linux 2.0. + + * relay32/winspool.spec, misc/printdrv.c: + Uwe Bonnes + Added two stubs for AddPrinterDriver. + + * include/dosexe.h, loader/dos/dosmod.c, loader/dos/dosmod.h, loader/dos/dosvm.c: + Ove Kaaven + Queue SIGALRM to reduce the "signal 14 lost" complaints. + Added support for reprogramming the DOS timer, and reading back the + current value. + + * misc/registry.c: Marcus Meissner + Wine hangs when registry (corrupted) has lone \ at end of file. + + * dlls/shell32/shell32_main.h, dlls/shell32/shell32_main.c: + Kostya Ivanov + Small patch that enables Clarion for Windows not to trap while + loading. + + * ole/variant.c: Marcus Meissner + Replace troublesome assignments by memset for whole struct. + + * graphics/ddraw.c: Lionel Ulmer + Added handling of the 'palent' field of the CreatePalette procedure. + + * documentation/wine.man: + Uwe Bonnes + Added description about including/excluding functions from relay + trace. + + * win32/console.c: Marcus Meissner + Read at least 1 input record in ReadConsoleInputA. + + * memory/virtual.c: + Fixed CreateMapping when a mapping with the same name already exists. + +Wed Jan 6 10:37:29 1999 Alexandre Julliard + + * server/file.c: Fixed file destruction when file has no name. + +Tue Jan 5 18:38:59 1999 Alexandre Julliard + + * misc/main.c: Eric Pouech + Warns user if multiple -dll switches are used on command line. + + * dlls/comctl32/trackbar.c: Alex Priem + Fixed a leftover HeapFree in the trackbar common control. + + * include/commctrl.h, include/debug.h, include/debugdefs.h, include/tab.h, dlls/comctl32/tab.c: + Alex Priem + Fixed some problems with the tab common control (with thanks to Anders + Carlsson ). + + * dlls/comctl32/commctrl.c, dlls/comctl32/propsheet.c, include/commctrl.h, include/propsheet.h, relay32/comctl32.spec: + Alex Priem + Added a missing PropertySheet32AW and CreatePropertySheetPage stub, + and some missing defines. + + * misc/main.c, scheduler/syslevel.c, graphics/vga.c: + Ulrich Weigand + Use MakeCriticalSectionGlobal on all critical sections used across + process boundaries. + + * include/winbase.h, include/windows.h: + Ulrich Weigand + Added prototypes for MakeCriticalSectionGlobal, ConvertToGlobalHandle. + + * documentation/wine.man: + Uwe Bonnes + Added environment variables in the man page. + + * loader/dos/module.c: Gerald Pfeifer + Fixed args of MZ_CreateProcess. + + * programs/clock/language.c, programs/notepad/language.c, programs/progman/main.c: + Andreas Mohr + Fixed string bug in programs/. + + * msdos/ioports.c: Andreas Mohr + Added stupid "action" emulation for hardware timers in ioports.c. + + * dlls/winaspi/winaspi16.c: Andreas Mohr + Again a small DOSASPI patch. + + * documentation/bugreports, documentation/fonts, windows/sysmetrics.c, windows/win.c, windows/winpos.c: + Andreas Mohr + Documentation updates. + + * graphics/ddraw.c: Lionel Ulmer + - check if palette is not null when setting a palette + - check if window handle is valid before getting its 'drawable' + + * graphics/x11drv/xfont.c: Eric Pouech + Prevent core dump with some TTF (when X11 runs with a true type + server). + + * server/console.c: Marcus Meissner + Use stdout for default console output. + ---------------------------------------------------------------- Sun Jan 3 17:00:20 1999 Alexandre Julliard diff --git a/Makefile.in b/Makefile.in index 4a07ba4261c..3c8de43602e 100644 --- a/Makefile.in +++ b/Makefile.in @@ -170,6 +170,7 @@ libwine.a: $(LIBOBJS) $(X11OBJS) libwine.so.1.0: $(LIBOBJS) $(X11OBJS) $(LDSHARED) -o$@ $(LIBOBJS) $(X11OBJS) $(LDOPTIONS) + ln -sf $@ libwine.so install_emu: install_lib [ -d $(bindir) ] || $(MKDIR) $(bindir) @@ -230,7 +231,7 @@ htmlpages: clean:: for i in $(ALLSUBDIRS); do (cd $$i; $(MAKE) clean) || exit 1; done for i in include; do (cd $$i; $(RM) *.o \#*\# .#* *~ *% *.bak *.orig *.rej *.flc); done - $(RM) wine wine.sym libwine.a libwine.so.1.0 TAGS .#* + $(RM) wine wine.sym libwine.a libwine.so.1.0 libwine.so TAGS .#* distclean: clean $(RM) config.* Make.rules include/config.h diff --git a/configure b/configure index 6f2682e2f3d..da1da01c460 100755 --- a/configure +++ b/configure @@ -2548,10 +2548,53 @@ else fi if test "$ac_cv_lib_ncurses_waddch" = "yes" -then : +then + echo $ac_n "checking for resizeterm in -lncurses""... $ac_c" 1>&6 +echo "configure:2554: checking for resizeterm in -lncurses" >&5 +ac_lib_var=`echo ncurses'_'resizeterm | sed 'y%./+-%__p_%'` +if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + ac_save_LIBS="$LIBS" +LIBS="-lncurses $LIBS" +cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest; then + rm -rf conftest* + eval "ac_cv_lib_$ac_lib_var=yes" +else + echo "configure: failed program was:" >&5 + cat conftest.$ac_ext >&5 + rm -rf conftest* + eval "ac_cv_lib_$ac_lib_var=no" +fi +rm -f conftest* +LIBS="$ac_save_LIBS" + +fi +if eval "test \"`echo '$ac_cv_lib_'$ac_lib_var`\" = yes"; then + echo "$ac_t""yes" 1>&6 + cat >> confdefs.h <<\EOF +#define HAVE_RESIZETERM 1 +EOF + +else + echo "$ac_t""no" 1>&6 +fi + else echo $ac_n "checking for waddch in -lcurses""... $ac_c" 1>&6 -echo "configure:2555: checking for waddch in -lcurses" >&5 +echo "configure:2598: checking for waddch in -lcurses" >&5 ac_lib_var=`echo curses'_'waddch | sed 'y%./+-%__p_%'` if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 @@ -2559,7 +2602,7 @@ else ac_save_LIBS="$LIBS" LIBS="-lcurses $LIBS" cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest; then +if { (eval echo configure:2617: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then rm -rf conftest* eval "ac_cv_lib_$ac_lib_var=yes" else @@ -2597,15 +2640,58 @@ else echo "$ac_t""no" 1>&6 fi + echo $ac_n "checking for resizeterm in -lcurses""... $ac_c" 1>&6 +echo "configure:2645: checking for resizeterm in -lcurses" >&5 +ac_lib_var=`echo curses'_'resizeterm | sed 'y%./+-%__p_%'` +if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + ac_save_LIBS="$LIBS" +LIBS="-lcurses $LIBS" +cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest; then + rm -rf conftest* + eval "ac_cv_lib_$ac_lib_var=yes" +else + echo "configure: failed program was:" >&5 + cat conftest.$ac_ext >&5 + rm -rf conftest* + eval "ac_cv_lib_$ac_lib_var=no" +fi +rm -f conftest* +LIBS="$ac_save_LIBS" + +fi +if eval "test \"`echo '$ac_cv_lib_'$ac_lib_var`\" = yes"; then + echo "$ac_t""yes" 1>&6 + cat >> confdefs.h <<\EOF +#define HAVE_RESIZETERM 1 +EOF + +else + echo "$ac_t""no" 1>&6 +fi + fi echo $ac_n "checking "for GNU style IPX support"""... $ac_c" 1>&6 -echo "configure:2604: checking "for GNU style IPX support"" >&5 +echo "configure:2690: checking "for GNU style IPX support"" >&5 if eval "test \"`echo '$''{'ac_cv_c_ipx_gnu'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext < #include @@ -2613,7 +2699,7 @@ int main() { ((struct sockaddr_ipx *)0)->sipx_family == AF_IPX ; return 0; } EOF -if { (eval echo configure:2617: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then +if { (eval echo configure:2703: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then rm -rf conftest* cat >> confdefs.h <<\EOF #define HAVE_IPX_GNU 1 @@ -2635,12 +2721,12 @@ echo "$ac_t""$ac_cv_c_ipx_gnu" 1>&6 if test "$ac_cv_c_ipx_gnu" = "no" then echo $ac_n "checking "for linux style IPX support"""... $ac_c" 1>&6 -echo "configure:2639: checking "for linux style IPX support"" >&5 +echo "configure:2725: checking "for linux style IPX support"" >&5 if eval "test \"`echo '$''{'ac_cv_c_ipx_linux'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext < #include @@ -2649,7 +2735,7 @@ int main() { ((struct sockaddr_ipx *)0)->sipx_family == AF_IPX ; return 0; } EOF -if { (eval echo configure:2653: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then +if { (eval echo configure:2739: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then rm -rf conftest* cat >> confdefs.h <<\EOF #define HAVE_IPX_LINUX 1 @@ -2673,17 +2759,17 @@ for ac_hdr in sys/soundcard.h machine/soundcard.h soundcard.h do ac_safe=`echo "$ac_hdr" | sed 'y%./+-%__p_%'` echo $ac_n "checking for $ac_hdr""... $ac_c" 1>&6 -echo "configure:2677: checking for $ac_hdr" >&5 +echo "configure:2763: checking for $ac_hdr" >&5 if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext < EOF ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" -{ (eval echo configure:2687: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } +{ (eval echo configure:2773: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } ac_err=`grep -v '^ *+' conftest.out` if test -z "$ac_err"; then rm -rf conftest* @@ -2711,12 +2797,12 @@ done echo $ac_n "checking "for Open Sound System"""... $ac_c" 1>&6 -echo "configure:2715: checking "for Open Sound System"" >&5 +echo "configure:2801: checking "for Open Sound System"" >&5 if eval "test \"`echo '$''{'ac_cv_c_opensoundsystem'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext <&5; (eval $ac_compile) 2>&5; }; then +if { (eval echo configure:2827: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then rm -rf conftest* ac_cv_c_opensoundsystem="yes" else @@ -2761,12 +2847,12 @@ fi echo $ac_n "checking "for union semun"""... $ac_c" 1>&6 -echo "configure:2765: checking "for union semun"" >&5 +echo "configure:2851: checking "for union semun"" >&5 if eval "test \"`echo '$''{'ac_cv_c_union_semun'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext < #include @@ -2774,7 +2860,7 @@ int main() { union semun foo ; return 0; } EOF -if { (eval echo configure:2778: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then +if { (eval echo configure:2864: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then rm -rf conftest* ac_cv_c_union_semun="yes" else @@ -2802,7 +2888,7 @@ if test "x${GCC}" = "xyes" then CFLAGS="$CFLAGS -Wall" echo $ac_n "checking "for gcc strength-reduce bug"""... $ac_c" 1>&6 -echo "configure:2806: checking "for gcc strength-reduce bug"" >&5 +echo "configure:2892: checking "for gcc strength-reduce bug"" >&5 if eval "test \"`echo '$''{'ac_cv_c_gcc_strength_bug'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else @@ -2810,7 +2896,7 @@ else ac_cv_c_gcc_strength_bug="yes" else cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest && (./conftest; exit) 2>/dev/null +if { (eval echo configure:2911: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest && (./conftest; exit) 2>/dev/null then ac_cv_c_gcc_strength_bug="no" else @@ -2844,7 +2930,7 @@ fi echo $ac_n "checking "whether external symbols need an underscore prefix"""... $ac_c" 1>&6 -echo "configure:2848: checking "whether external symbols need an underscore prefix"" >&5 +echo "configure:2934: checking "whether external symbols need an underscore prefix"" >&5 if eval "test \"`echo '$''{'ac_cv_c_extern_prefix'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else @@ -2856,14 +2942,14 @@ _ac_test: .long 0 EOF cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest; then +if { (eval echo configure:2953: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then rm -rf conftest* ac_cv_c_extern_prefix="yes" else @@ -2887,7 +2973,7 @@ fi echo $ac_n "checking "whether assembler accepts .string"""... $ac_c" 1>&6 -echo "configure:2891: checking "whether assembler accepts .string"" >&5 +echo "configure:2977: checking "whether assembler accepts .string"" >&5 if eval "test \"`echo '$''{'ac_cv_c_asm_string'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else @@ -2897,14 +2983,14 @@ cat > conftest_asm.s < conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest; then +if { (eval echo configure:2994: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then rm -rf conftest* ac_cv_c_asm_string="yes" else @@ -2932,21 +3018,21 @@ LDSHARED="" if test "$LIB_TARGET" = "libwine.so.1.0" then echo $ac_n "checking "whether we can build a Linux dll"""... $ac_c" 1>&6 -echo "configure:2936: checking "whether we can build a Linux dll"" >&5 +echo "configure:3022: checking "whether we can build a Linux dll"" >&5 if eval "test \"`echo '$''{'ac_cv_c_dll_linux'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else saved_cflags=$CFLAGS CFLAGS="$CFLAGS -fPIC -shared -Wl,-soname,conftest.so.1.0" cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest; then +if { (eval echo configure:3036: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then rm -rf conftest* ac_cv_c_dll_linux="yes" else @@ -2967,21 +3053,21 @@ echo "$ac_t""$ac_cv_c_dll_linux" 1>&6 LDSHARED="\$(CC) -shared -Wl,-soname,libwine.so" else echo $ac_n "checking "whether we can build a NetBSD dll"""... $ac_c" 1>&6 -echo "configure:2971: checking "whether we can build a NetBSD dll"" >&5 +echo "configure:3057: checking "whether we can build a NetBSD dll"" >&5 if eval "test \"`echo '$''{'ac_cv_c_dll_netbsd'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else saved_cflags=$CFLAGS CFLAGS="$CFLAGS -fPIC -Bshareable -Bforcearchive" cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest; then +if { (eval echo configure:3071: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then rm -rf conftest* ac_cv_c_dll_netbsd="yes" else @@ -3012,7 +3098,7 @@ fi echo $ac_n "checking "for reentrant libc"""... $ac_c" 1>&6 -echo "configure:3016: checking "for reentrant libc"" >&5 +echo "configure:3102: checking "for reentrant libc"" >&5 if eval "test \"`echo '$''{'wine_cv_libc_reentrant'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else @@ -3020,14 +3106,14 @@ else wine_cv_libc_reentrant=yes else cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest && (./conftest; exit) 2>/dev/null +if { (eval echo configure:3117: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest && (./conftest; exit) 2>/dev/null then wine_cv_libc_reentrant=yes else @@ -3052,7 +3138,7 @@ fi echo $ac_n "checking "for reentrant X libraries"""... $ac_c" 1>&6 -echo "configure:3056: checking "for reentrant X libraries"" >&5 +echo "configure:3142: checking "for reentrant X libraries"" >&5 if eval "test \"`echo '$''{'wine_cv_x_reentrant'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else @@ -3097,12 +3183,12 @@ fi for ac_func in clone getpagesize memmove sendmsg sigaltstack strerror stricmp tcgetattr timegm usleep wait4 waitpid vfscanf do echo $ac_n "checking for $ac_func""... $ac_c" 1>&6 -echo "configure:3101: checking for $ac_func" >&5 +echo "configure:3187: checking for $ac_func" >&5 if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest; then +if { (eval echo configure:3215: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then rm -rf conftest* eval "ac_cv_func_$ac_func=yes" else @@ -3149,21 +3235,21 @@ else fi done -for ac_hdr in wctype.h sys/syscall.h syscall.h sys/param.h sys/vfs.h sys/mount.h sys/statfs.h float.h linux/cdrom.h linux/ucdrom.h sys/cdio.h sys/filio.h sys/modem.h strings.h sys/strtio.h dlfcn.h unistd.h sys/sockio.h net/if.h netinet/in.h +for ac_hdr in wctype.h sys/syscall.h syscall.h sys/param.h sys/vfs.h sys/mount.h sys/statfs.h float.h linux/cdrom.h linux/ucdrom.h sys/cdio.h sys/filio.h sys/modem.h strings.h sys/strtio.h dlfcn.h unistd.h sys/sockio.h net/if.h netinet/in.h sys/file.h do ac_safe=`echo "$ac_hdr" | sed 'y%./+-%__p_%'` echo $ac_n "checking for $ac_hdr""... $ac_c" 1>&6 -echo "configure:3157: checking for $ac_hdr" >&5 +echo "configure:3243: checking for $ac_hdr" >&5 if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext < EOF ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" -{ (eval echo configure:3167: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } +{ (eval echo configure:3253: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } ac_err=`grep -v '^ *+' conftest.out` if test -z "$ac_err"; then rm -rf conftest* @@ -3190,12 +3276,12 @@ fi done echo $ac_n "checking whether stat file-mode macros are broken""... $ac_c" 1>&6 -echo "configure:3194: checking whether stat file-mode macros are broken" >&5 +echo "configure:3280: checking whether stat file-mode macros are broken" >&5 if eval "test \"`echo '$''{'ac_cv_header_stat_broken'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext < #include @@ -3246,12 +3332,12 @@ EOF fi echo $ac_n "checking for working const""... $ac_c" 1>&6 -echo "configure:3250: checking for working const" >&5 +echo "configure:3336: checking for working const" >&5 if eval "test \"`echo '$''{'ac_cv_c_const'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext <&5; (eval $ac_compile) 2>&5; }; then +if { (eval echo configure:3390: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then rm -rf conftest* ac_cv_c_const=yes else @@ -3321,12 +3407,12 @@ EOF fi echo $ac_n "checking for ANSI C header files""... $ac_c" 1>&6 -echo "configure:3325: checking for ANSI C header files" >&5 +echo "configure:3411: checking for ANSI C header files" >&5 if eval "test \"`echo '$''{'ac_cv_header_stdc'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext < #include @@ -3334,7 +3420,7 @@ else #include EOF ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" -{ (eval echo configure:3338: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } +{ (eval echo configure:3424: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } ac_err=`grep -v '^ *+' conftest.out` if test -z "$ac_err"; then rm -rf conftest* @@ -3351,7 +3437,7 @@ rm -f conftest* if test $ac_cv_header_stdc = yes; then # SunOS 4.x string.h does not declare mem*, contrary to ANSI. cat > conftest.$ac_ext < EOF @@ -3369,7 +3455,7 @@ fi if test $ac_cv_header_stdc = yes; then # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI. cat > conftest.$ac_ext < EOF @@ -3390,7 +3476,7 @@ if test "$cross_compiling" = yes; then : else cat > conftest.$ac_ext < #define ISLOWER(c) ('a' <= (c) && (c) <= 'z') @@ -3401,7 +3487,7 @@ if (XOR (islower (i), ISLOWER (i)) || toupper (i) != TOUPPER (i)) exit(2); exit (0); } EOF -if { (eval echo configure:3405: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest && (./conftest; exit) 2>/dev/null +if { (eval echo configure:3491: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest && (./conftest; exit) 2>/dev/null then : else @@ -3425,12 +3511,12 @@ EOF fi echo $ac_n "checking for size_t""... $ac_c" 1>&6 -echo "configure:3429: checking for size_t" >&5 +echo "configure:3515: checking for size_t" >&5 if eval "test \"`echo '$''{'ac_cv_type_size_t'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext < #if STDC_HEADERS @@ -3458,7 +3544,7 @@ EOF fi echo $ac_n "checking size of long long""... $ac_c" 1>&6 -echo "configure:3462: checking size of long long" >&5 +echo "configure:3548: checking size of long long" >&5 if eval "test \"`echo '$''{'ac_cv_sizeof_long_long'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else @@ -3466,7 +3552,7 @@ else ac_cv_sizeof_long_long=0 else cat > conftest.$ac_ext < main() @@ -3477,7 +3563,7 @@ main() exit(0); } EOF -if { (eval echo configure:3481: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest && (./conftest; exit) 2>/dev/null +if { (eval echo configure:3567: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest && (./conftest; exit) 2>/dev/null then ac_cv_sizeof_long_long=`cat conftestval` else @@ -3500,7 +3586,7 @@ EOF if test $ac_cv_func_sendmsg = no; then echo $ac_n "checking for sendmsg in -lsocket""... $ac_c" 1>&6 -echo "configure:3504: checking for sendmsg in -lsocket" >&5 +echo "configure:3590: checking for sendmsg in -lsocket" >&5 ac_lib_var=`echo socket'_'sendmsg | sed 'y%./+-%__p_%'` if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 @@ -3508,7 +3594,7 @@ else ac_save_LIBS="$LIBS" LIBS="-lsocket $LIBS" cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest; then +if { (eval echo configure:3609: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then rm -rf conftest* eval "ac_cv_lib_$ac_lib_var=yes" else @@ -3552,12 +3638,12 @@ fi if test "$ac_cv_header_sys_vfs_h" = "yes" then echo $ac_n "checking "whether sys/vfs.h defines statfs"""... $ac_c" 1>&6 -echo "configure:3556: checking "whether sys/vfs.h defines statfs"" >&5 +echo "configure:3642: checking "whether sys/vfs.h defines statfs"" >&5 if eval "test \"`echo '$''{'wine_cv_sys_vfs_has_statfs'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext < @@ -3574,7 +3660,7 @@ int main() { ; return 0; } EOF -if { (eval echo configure:3578: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then +if { (eval echo configure:3664: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then rm -rf conftest* wine_cv_sys_vfs_has_statfs=yes else @@ -3601,12 +3687,12 @@ fi if test "$ac_cv_header_sys_statfs_h" = "yes" then echo $ac_n "checking "whether sys/statfs.h defines statfs"""... $ac_c" 1>&6 -echo "configure:3605: checking "whether sys/statfs.h defines statfs"" >&5 +echo "configure:3691: checking "whether sys/statfs.h defines statfs"" >&5 if eval "test \"`echo '$''{'wine_cv_sys_statfs_has_statfs'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext < @@ -3621,7 +3707,7 @@ int main() { ; return 0; } EOF -if { (eval echo configure:3625: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then +if { (eval echo configure:3711: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then rm -rf conftest* wine_cv_sys_statfs_has_statfs=yes else @@ -3648,12 +3734,12 @@ fi if test "$ac_cv_header_sys_mount_h" = "yes" then echo $ac_n "checking "whether sys/mount.h defines statfs"""... $ac_c" 1>&6 -echo "configure:3652: checking "whether sys/mount.h defines statfs"" >&5 +echo "configure:3738: checking "whether sys/mount.h defines statfs"" >&5 if eval "test \"`echo '$''{'wine_cv_sys_mount_has_statfs'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext < @@ -3668,7 +3754,7 @@ int main() { ; return 0; } EOF -if { (eval echo configure:3672: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then +if { (eval echo configure:3758: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then rm -rf conftest* wine_cv_sys_mount_has_statfs=yes else @@ -3694,7 +3780,7 @@ fi echo $ac_n "checking "for statfs.f_bfree"""... $ac_c" 1>&6 -echo "configure:3698: checking "for statfs.f_bfree"" >&5 +echo "configure:3784: checking "for statfs.f_bfree"" >&5 if eval "test \"`echo '$''{'wine_cv_statfs_bfree'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else @@ -3703,7 +3789,7 @@ else wine_cv_statfs_bfree=no else cat > conftest.$ac_ext < @@ -3730,7 +3816,7 @@ int main() { ; return 0; } EOF -if { (eval echo configure:3734: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then +if { (eval echo configure:3820: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then rm -rf conftest* wine_cv_statfs_bfree=yes else @@ -3754,7 +3840,7 @@ EOF fi echo $ac_n "checking "for statfs.f_bavail"""... $ac_c" 1>&6 -echo "configure:3758: checking "for statfs.f_bavail"" >&5 +echo "configure:3844: checking "for statfs.f_bavail"" >&5 if eval "test \"`echo '$''{'wine_cv_statfs_bavail'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else @@ -3763,7 +3849,7 @@ else wine_cv_statfs_bavail=no else cat > conftest.$ac_ext < @@ -3790,7 +3876,7 @@ int main() { ; return 0; } EOF -if { (eval echo configure:3794: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then +if { (eval echo configure:3880: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then rm -rf conftest* wine_cv_statfs_bavail=yes else @@ -3815,7 +3901,7 @@ fi echo $ac_n "checking "for working sigaltstack"""... $ac_c" 1>&6 -echo "configure:3819: checking "for working sigaltstack"" >&5 +echo "configure:3905: checking "for working sigaltstack"" >&5 if eval "test \"`echo '$''{'ac_cv_c_working_sigaltstack'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else @@ -3824,7 +3910,7 @@ else else cat > conftest.$ac_ext < @@ -3862,7 +3948,7 @@ else } EOF -if { (eval echo configure:3866: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest && (./conftest; exit) 2>/dev/null +if { (eval echo configure:3952: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest && (./conftest; exit) 2>/dev/null then ac_cv_c_working_sigaltstack="yes" else @@ -3889,12 +3975,12 @@ fi echo $ac_n "checking "for msg_accrights in struct msghdr"""... $ac_c" 1>&6 -echo "configure:3893: checking "for msg_accrights in struct msghdr"" >&5 +echo "configure:3979: checking "for msg_accrights in struct msghdr"" >&5 if eval "test \"`echo '$''{'ac_cv_c_msg_accrights'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext < #include @@ -3902,7 +3988,7 @@ int main() { struct msghdr hdr; hdr.msg_accrights=0 ; return 0; } EOF -if { (eval echo configure:3906: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then +if { (eval echo configure:3992: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then rm -rf conftest* ac_cv_c_msg_accrights="yes" else @@ -4420,6 +4506,14 @@ rm -fr confdefs* $ac_clean_files test "$no_create" = yes || ${CONFIG_SHELL-/bin/sh} $CONFIG_STATUS || exit 1 +if test "$ac_cv_lib_ncurses_resizeterm" = "no" -a "$ac_cv_lib_ncurses_waddch" = "yes" +then + echo + echo "*** Warning: resizeterm not found in ncurses. Wine will be built without" + echo "*** terminal resize support. Consider upgrading ncurses." + echo +fi + if test "$wine_cv_libc_reentrant" = "no" then echo diff --git a/configure.in b/configure.in index 194029b5143..65c19c17ab9 100644 --- a/configure.in +++ b/configure.in @@ -117,9 +117,11 @@ fi dnl **** Check which curses lib to use *** AC_CHECK_LIB(ncurses,waddch) if test "$ac_cv_lib_ncurses_waddch" = "yes" -then : +then + AC_CHECK_LIB(ncurses,resizeterm,AC_DEFINE(HAVE_RESIZETERM)) else AC_CHECK_LIB(curses,waddch) + AC_CHECK_LIB(curses,resizeterm,AC_DEFINE(HAVE_RESIZETERM)) fi dnl **** Check for IPX (currently Linux only) **** @@ -342,7 +344,7 @@ fi dnl **** Check for functions and header files **** AC_CHECK_FUNCS(clone getpagesize memmove sendmsg sigaltstack strerror stricmp tcgetattr timegm usleep wait4 waitpid vfscanf) -AC_CHECK_HEADERS(wctype.h sys/syscall.h syscall.h sys/param.h sys/vfs.h sys/mount.h sys/statfs.h float.h linux/cdrom.h linux/ucdrom.h sys/cdio.h sys/filio.h sys/modem.h strings.h sys/strtio.h dlfcn.h unistd.h sys/sockio.h net/if.h netinet/in.h) +AC_CHECK_HEADERS(wctype.h sys/syscall.h syscall.h sys/param.h sys/vfs.h sys/mount.h sys/statfs.h float.h linux/cdrom.h linux/ucdrom.h sys/cdio.h sys/filio.h sys/modem.h strings.h sys/strtio.h dlfcn.h unistd.h sys/sockio.h net/if.h netinet/in.h sys/file.h) AC_HEADER_STAT() AC_C_CONST() AC_TYPE_SIZE_T() @@ -617,6 +619,14 @@ windows/Makefile windows/ttydrv/Makefile windows/x11drv/Makefile ]) +if test "$ac_cv_lib_ncurses_resizeterm" = "no" -a "$ac_cv_lib_ncurses_waddch" = "yes" +then + echo + echo "*** Warning: resizeterm not found in ncurses. Wine will be built without" + echo "*** terminal resize support. Consider upgrading ncurses." + echo +fi + if test "$wine_cv_libc_reentrant" = "no" then echo diff --git a/console/ncurses.c b/console/ncurses.c index 8bdc09a23f9..b5b5fc63abe 100644 --- a/console/ncurses.c +++ b/console/ncurses.c @@ -39,7 +39,9 @@ void NCURSES_Start() driver.getCursorPosition = NCURSES_GetCursorPosition; driver.getCharacterAtCursor = NCURSES_GetCharacterAtCursor; driver.clearScreen = NCURSES_ClearScreen; +#ifdef HAVE_RESIZETERM driver.notifyResizeScreen = NCURSES_NotifyResizeScreen; +#endif driver.checkForKeystroke = NCURSES_CheckForKeystroke; driver.getKeystroke = NCURSES_GetKeystroke; @@ -62,9 +64,14 @@ void NCURSES_Init() void NCURSES_Write(char output, int fg, int bg, int attribute) { + char row, col; + /* We can discard all extended information. */ if (waddch(stdscr, output) == ERR) - FIXME(console, "NCURSES: waddch() failed.\n"); + { + NCURSES_GetCursorPosition(&row, &col); + FIXME(console, "NCURSES: waddch() failed at %d, %d.\n", row, col); + } } void NCURSES_Close() @@ -137,6 +144,8 @@ void NCURSES_ClearScreen() werase(stdscr); } +#ifdef HAVE_RESIZETERM + void NCURSES_NotifyResizeScreen(int x, int y) { /* Note: This function gets called *after* another driver in the chain @@ -146,4 +155,6 @@ void NCURSES_NotifyResizeScreen(int x, int y) resizeterm(y, x); } +#endif + #endif /* WINE_NCURSES */ diff --git a/controls/listbox.c b/controls/listbox.c index 3405121b27c..74b16eb1c6e 100644 --- a/controls/listbox.c +++ b/controls/listbox.c @@ -1186,23 +1186,26 @@ static LRESULT LISTBOX_SelectItemRange( WND *wnd, LB_DESCR *descr, INT32 first, /*********************************************************************** * LISTBOX_SetCaretIndex + * + * NOTES + * index must be between 0 and descr->nb_items-1, or LB_ERR is returned. + * */ static LRESULT LISTBOX_SetCaretIndex( WND *wnd, LB_DESCR *descr, INT32 index, BOOL32 fully_visible ) { - INT32 oldfocus = descr->focus_item; + INT32 oldfocus = descr->focus_item; - if ((index < -1) || (index >= descr->nb_items)) return LB_ERR; + if ((index < 0) || (index >= descr->nb_items)) return LB_ERR; if (index == oldfocus) return LB_OKAY; descr->focus_item = index; if ((oldfocus != -1) && descr->caret_on && (GetFocus32() == wnd->hwndSelf)) LISTBOX_RepaintItem( wnd, descr, oldfocus, ODA_FOCUS ); - if (index != -1) - { - LISTBOX_MakeItemVisible( wnd, descr, index, fully_visible ); - if (descr->caret_on && (GetFocus32() == wnd->hwndSelf)) - LISTBOX_RepaintItem( wnd, descr, index, ODA_FOCUS ); - } + + LISTBOX_MakeItemVisible( wnd, descr, index, fully_visible ); + if (descr->caret_on && (GetFocus32() == wnd->hwndSelf)) + LISTBOX_RepaintItem( wnd, descr, index, ODA_FOCUS ); + return LB_OKAY; } @@ -2284,7 +2287,7 @@ LRESULT WINAPI ListBoxWndProc( HWND32 hwnd, UINT32 msg, wParam = (INT32)(INT16)wParam; /* fall through */ case LB_SETCURSEL32: - if (wParam != -1) LISTBOX_MakeItemVisible( wnd, descr, wParam, TRUE ); + LISTBOX_SetCaretIndex( wnd, descr, wParam, TRUE ); return LISTBOX_SetSelection( wnd, descr, wParam, TRUE, FALSE ); case LB_GETSELCOUNT16: diff --git a/debugger/editline.c b/debugger/editline.c index 51e7046d617..68645fcaa6d 100644 --- a/debugger/editline.c +++ b/debugger/editline.c @@ -28,6 +28,7 @@ #include #include #include +#include #include #include #include @@ -279,6 +280,7 @@ static unsigned int TTYget() { CHAR c; + int retv; TTYflush(); if (Pushed) { @@ -287,7 +289,14 @@ TTYget() } if (*Input) return *Input++; - return read(0, &c, (size_t)1) == 1 ? c : EOF; + + while ( ( retv = read( 0, &c, (size_t)1 ) ) == -1 ) + { + if ( errno != EINTR ) + perror( "read" ); + } + + return retv == 1 ? c : EOF; } #define TTYback() (backspace ? TTYputs((CHAR *)backspace) : TTYput('\b')) diff --git a/debugger/msc.c b/debugger/msc.c index 9b9b56e8b8b..80ed6cbb65d 100644 --- a/debugger/msc.c +++ b/debugger/msc.c @@ -33,7 +33,7 @@ #include "debugger.h" #include "peexe.h" #include "xmalloc.h" - +#include "file.h" /* * This is an index we use to keep track of the debug information @@ -888,7 +888,6 @@ DEBUG_RegisterDebugInfo( HMODULE32 hModule, const char *module_name, int rtn = FALSE; int orig_size; PIMAGE_DEBUG_DIRECTORY dbgptr; - struct deferred_debug_info * deefer; orig_size = size; dbgptr = (PIMAGE_DEBUG_DIRECTORY) (hModule + v_addr); @@ -934,35 +933,72 @@ DEBUG_RegisterDebugInfo( HMODULE32 hModule, const char *module_name, * means that this entry points to a .DBG file. Otherwise, * it just points to itself, and we can ignore this. */ - if( (dbgptr->Type == IMAGE_DEBUG_TYPE_MISC) - && (PE_HEADER(hModule)->FileHeader.Characteristics & IMAGE_FILE_DEBUG_STRIPPED) == 0 ) - { - break; - } - deefer = (struct deferred_debug_info *) xmalloc(sizeof(*deefer)); - deefer->module = hModule; - deefer->load_addr = (char *)hModule; - deefer->dbg_info = NULL; - deefer->dbg_size = 0; - /* - * Read the important bits. What we do after this depends - * upon the type, but this is always enough so we are able - * to proceed if we know what we need to do next. - */ - deefer->dbg_size = dbgptr->SizeOfData; - deefer->dbg_info = (char *)(hModule + dbgptr->PointerToRawData); - deefer->dbgdir = dbgptr; - deefer->next = dbglist; - deefer->loaded = FALSE; - deefer->dbg_index = DEBUG_next_index; - deefer->module_name = xstrdup(module_name); - - deefer->sectp = PE_SECTIONS(hModule); - deefer->nsect = PE_HEADER(hModule)->FileHeader.NumberOfSections; - - dbglist = deefer; + + + + + if( (dbgptr->Type != IMAGE_DEBUG_TYPE_MISC) || + (PE_HEADER(hModule)->FileHeader.Characteristics & IMAGE_FILE_DEBUG_STRIPPED) != 0 ) + { + struct deferred_debug_info* deefer = (struct deferred_debug_info *) xmalloc(sizeof(*deefer)); + + deefer->module = hModule; + deefer->load_addr = (char *)hModule; + + /* + * Read the important bits. What we do after this depends + * upon the type, but this is always enough so we are able + * to proceed if we know what we need to do next. + */ + /* in some cases, debug information has not been mapped, so load it... + * basically, the PE loader maps all sections (data, resources...), but doesn't map + * the DataDirectory array's content. One its entry contains the *beloved* + * debug information. (Note the DataDirectory is mapped, not its content) + */ + if (IsBadReadPtr32((void*)hModule, dbgptr->PointerToRawData + dbgptr->SizeOfData)) + { + char fn[PATH_MAX]; + int fd = -1; + DOS_FULL_NAME full_name; + + if (GetModuleFileName32A(hModule, fn, sizeof(fn)) > 0 && + DOSFS_GetFullName(fn, TRUE, &full_name) && + (fd = open(full_name.long_name, O_RDONLY)) > 0) + { + deefer->dbg_info = mmap(NULL, dbgptr->SizeOfData, + PROT_READ, MAP_PRIVATE, fd, dbgptr->PointerToRawData); + close(fd); + if( deefer->dbg_info == (char *) 0xffffffff ) + { + free(deefer); + break; + } + } + else + { + free(deefer); + fprintf(stderr, " (not mapped: fn=%s, lfn=%s, fd=%d)", fn, full_name.long_name, fd); + break; + } + } + else + { + deefer->dbg_info = (char *)(hModule + dbgptr->PointerToRawData); + } + deefer->dbg_size = dbgptr->SizeOfData; + deefer->dbgdir = dbgptr; + deefer->next = dbglist; + deefer->loaded = FALSE; + deefer->dbg_index = DEBUG_next_index; + deefer->module_name = xstrdup(module_name); + + deefer->sectp = PE_SECTIONS(hModule); + deefer->nsect = PE_HEADER(hModule)->FileHeader.NumberOfSections; + + dbglist = deefer; + } break; default: } @@ -1813,7 +1849,7 @@ DEBUG_ProcessPDBFile(struct deferred_debug_info * deefer, char * full_filename) status = stat(filename, &statbuf); if( status == -1 ) { - fprintf(stderr, "Unable to open .PDB file %s\n", filename); + fprintf(stderr, "-Unable to open .PDB file %s\n", filename); goto leave; } @@ -1823,7 +1859,7 @@ DEBUG_ProcessPDBFile(struct deferred_debug_info * deefer, char * full_filename) fd = open(filename, O_RDONLY); if( fd == -1 ) { - fprintf(stderr, "Unable to open .DBG file %s\n", filename); + fprintf(stderr, "-Unable to open .DBG file %s\n", filename); goto leave; } @@ -1835,7 +1871,7 @@ DEBUG_ProcessPDBFile(struct deferred_debug_info * deefer, char * full_filename) MAP_PRIVATE, fd, 0); if( addr == (char *) 0xffffffff ) { - fprintf(stderr, "Unable to mmap .DBG file %s\n", filename); + fprintf(stderr, "-Unable to mmap .DBG file %s\n", filename); goto leave; } @@ -2141,7 +2177,7 @@ DEBUG_ProcessDBGFile(struct deferred_debug_info * deefer, char * filename) status = stat(filename, &statbuf); if( status == -1 ) { - fprintf(stderr, "Unable to open .DBG file %s\n", filename); + fprintf(stderr, "-Unable to open .DBG file %s\n", filename); goto leave; } diff --git a/dlls/comctl32/Makefile.in b/dlls/comctl32/Makefile.in index 5bd0b5af739..a753752cb80 100644 --- a/dlls/comctl32/Makefile.in +++ b/dlls/comctl32/Makefile.in @@ -11,6 +11,7 @@ C_SRCS = \ comctl32undoc.c \ commctrl.c \ datetime.c \ + flatsb.c \ header.c \ hotkey.c \ imagelist.c \ diff --git a/dlls/comctl32/commctrl.c b/dlls/comctl32/commctrl.c index f579b6cbfdb..463b07fc721 100644 --- a/dlls/comctl32/commctrl.c +++ b/dlls/comctl32/commctrl.c @@ -12,6 +12,7 @@ #include "animate.h" #include "comboex.h" #include "datetime.h" +#include "flatsb.h" #include "header.h" #include "hotkey.h" #include "ipaddress.h" @@ -20,6 +21,7 @@ #include "nativefont.h" #include "pager.h" #include "progress.h" +#include "propsheet.h" #include "rebar.h" #include "status.h" #include "tab.h" @@ -70,9 +72,11 @@ COMCTL32_LibMain (HINSTANCE32 hinstDLL, DWORD fdwReason, LPVOID lpvReserved) /* register all Win95 common control classes */ ANIMATE_Register (); + FLATSB_Register (); HEADER_Register (); HOTKEY_Register (); LISTVIEW_Register (); + PROPSHEET_Register (); PROGRESS_Register (); STATUS_Register (); TAB_Register (); @@ -92,6 +96,7 @@ COMCTL32_LibMain (HINSTANCE32 hinstDLL, DWORD fdwReason, LPVOID lpvReserved) ANIMATE_Unregister (); COMBOEX_Unregister (); DATETIME_Unregister (); + FLATSB_Unregister (); HEADER_Unregister (); HOTKEY_Unregister (); IPADDRESS_Unregister (); @@ -99,6 +104,7 @@ COMCTL32_LibMain (HINSTANCE32 hinstDLL, DWORD fdwReason, LPVOID lpvReserved) MONTHCAL_Unregister (); NATIVEFONT_Unregister (); PAGER_Unregister (); + PROPSHEET_UnRegister (); PROGRESS_Unregister (); REBAR_Unregister (); STATUS_Unregister (); diff --git a/dlls/comctl32/datetime.c b/dlls/comctl32/datetime.c index d9f816a69b1..79963a86411 100644 --- a/dlls/comctl32/datetime.c +++ b/dlls/comctl32/datetime.c @@ -60,12 +60,7 @@ DATETIME_Destroy (WND *wndPtr, WPARAM32 wParam, LPARAM lParam) { DATETIME_INFO *infoPtr = DATETIME_GetInfoPtr(wndPtr); - - - - - - /* free ipaddress info data */ + /* free datetime info data */ COMCTL32_Free (infoPtr); return 0; @@ -82,6 +77,49 @@ DATETIME_WindowProc (HWND32 hwnd, UINT32 uMsg, WPARAM32 wParam, LPARAM lParam) switch (uMsg) { + case DTM_GETSYSTEMTIME: + FIXME (datetime, "Unimplemented msg DTM_GETSYSTEMTIME\n"); + return GDT_VALID; + + case DTM_SETSYSTEMTIME: + FIXME (datetime, "Unimplemented msg DTM_SETSYSTEMTIME\n"); + return 1; + + case DTM_GETRANGE: + FIXME (datetime, "Unimplemented msg DTM_GETRANGE\n"); + return 0; + + case DTM_SETRANGE: + FIXME (datetime, "Unimplemented msg DTM_SETRANGE\n"); + return 1; + + case DTM_SETFORMAT32A: + FIXME (datetime, "Unimplemented msg DTM_SETFORMAT32A\n"); + return 1; + + case DTM_SETFORMAT32W: + FIXME (datetime, "Unimplemented msg DTM_SETFORMAT32W\n"); + return 1; + + case DTM_SETMCCOLOR: + FIXME (datetime, "Unimplemented msg DTM_SETMCCOLOR\n"); + return 0; + + case DTM_GETMCCOLOR: + FIXME (datetime, "Unimplemented msg DTM_GETMCCOLOR\n"); + return 0; + + case DTM_GETMONTHCAL: + FIXME (datetime, "Unimplemented msg DTM_GETMONTHCAL\n"); + return 0; + + case DTM_SETMCFONT: + FIXME (datetime, "Unimplemented msg DTM_SETMCFONT\n"); + return 0; + + case DTM_GETMCFONT: + FIXME (datetime, "Unimplemented msg DTM_GETMCFONT\n"); + return 0; case WM_CREATE: return DATETIME_Create (wndPtr, wParam, lParam); diff --git a/dlls/comctl32/flatsb.c b/dlls/comctl32/flatsb.c new file mode 100644 index 00000000000..c61eb08f1d0 --- /dev/null +++ b/dlls/comctl32/flatsb.c @@ -0,0 +1,179 @@ +/* + * Flat Scrollbar control + * + * Copyright 1998 Eric Kohl + * + * NOTES + * This is just a dummy control. An author is needed! Any volunteers? + * I will only improve this control once in a while. + * Eric + * + * TODO: + * - All messages. + * - All notifications. + * + */ + +#include "windows.h" +#include "commctrl.h" +#include "flatsb.h" +#include "win.h" +#include "debug.h" + + +#define FlatSB_GetInfoPtr(wndPtr) ((FLATSB_INFO*)wndPtr->wExtra[0]) + + +BOOL32 WINAPI +FlatSB_EnableScrollBar(HWND32 hwnd, INT32 dummy, UINT32 dummy2) +{ + FIXME(commctrl,"stub\n"); + return 0; +} + +BOOL32 WINAPI +FlatSB_ShowScrollBar(HWND32 hwnd, INT32 code, BOOL32 flag) +{ + FIXME(commctrl,"stub\n"); + return 0; +} + +BOOL32 WINAPI +FlatSB_GetScrollRange(HWND32 hwnd, INT32 code, LPINT32 min, LPINT32 max) +{ + FIXME(commctrl,"stub\n"); + return 0; +} + +BOOL32 WINAPI +FlatSB_GetScrollInfo(HWND32 hwnd, INT32 code, LPSCROLLINFO info) +{ + FIXME(commctrl,"stub\n"); + return 0; +} + +INT32 WINAPI +FlatSB_GetScrollPos(HWND32 hwnd, INT32 code) +{ + FIXME(commctrl,"stub\n"); + return 0; +} + +BOOL32 WINAPI +FlatSB_GetScrollProp(HWND32 hwnd, INT32 propIndex, LPINT32 prop) +{ + FIXME(commctrl,"stub\n"); + return 0; +} + + +INT32 WINAPI +FlatSB_SetScrollPos(HWND32 hwnd, INT32 code, INT32 pos, BOOL32 fRedraw) +{ + FIXME(commctrl,"stub\n"); + return 0; +} + +INT32 WINAPI +FlatSB_SetScrollInfo(HWND32 hwnd, INT32 code, LPSCROLLINFO info, BOOL32 fRedraw) +{ + FIXME(commctrl,"stub\n"); + return 0; +} + +INT32 WINAPI +FlatSB_SetScrollRange(HWND32 hwnd, INT32 code, INT32 min, INT32 max, BOOL32 fRedraw) +{ + FIXME(commctrl,"stub\n"); + return 0; +} + +BOOL32 WINAPI +FlatSB_SetScrollProp(HWND32 hwnd, UINT32 index, INT32 newValue, BOOL32 flag) +{ + FIXME(commctrl,"stub\n"); + return 0; +} + + +BOOL32 WINAPI InitializeFlatSB(HWND32 hwnd) +{ + FIXME(commctrl,"stub\n"); + return 0; +} + +HRESULT WINAPI UninitializeFlatSB(HWND32 hwnd) +{ + FIXME(commctrl,"stub\n"); + return 0; +} + + + +static LRESULT +FlatSB_Create (WND *wndPtr, WPARAM32 wParam, LPARAM lParam) +{ + return 0; +} + + +static LRESULT +FlatSB_Destroy (WND *wndPtr, WPARAM32 wParam, LPARAM lParam) +{ + return 0; +} + + + + +LRESULT WINAPI +FlatSB_WindowProc (HWND32 hwnd, UINT32 uMsg, WPARAM32 wParam, LPARAM lParam) +{ + WND *wndPtr = WIN_FindWndPtr(hwnd); + + switch (uMsg) + { + + case WM_CREATE: + return FlatSB_Create (wndPtr, wParam, lParam); + + case WM_DESTROY: + return FlatSB_Destroy (wndPtr, wParam, lParam); + + default: + if (uMsg >= WM_USER) + ERR (datetime, "unknown msg %04x wp=%08x lp=%08lx\n", + uMsg, wParam, lParam); + return DefWindowProc32A (hwnd, uMsg, wParam, lParam); + } + return 0; +} + + +VOID +FLATSB_Register (VOID) +{ + WNDCLASS32A wndClass; + + if (GlobalFindAtom32A (FLATSB_CLASS32A)) return; + + ZeroMemory (&wndClass, sizeof(WNDCLASS32A)); + wndClass.style = CS_GLOBALCLASS; + wndClass.lpfnWndProc = (WNDPROC32)FlatSB_WindowProc; + wndClass.cbClsExtra = 0; + wndClass.cbWndExtra = sizeof(FLATSB_INFO *); + wndClass.hCursor = LoadCursor32A (0, IDC_ARROW32A); + wndClass.hbrBackground = (HBRUSH32)(COLOR_WINDOW + 1); + wndClass.lpszClassName = FLATSB_CLASS32A; + + RegisterClass32A (&wndClass); +} + + +VOID +FLATSB_Unregister (VOID) +{ + if (GlobalFindAtom32A (FLATSB_CLASS32A)) + UnregisterClass32A (FLATSB_CLASS32A, (HINSTANCE32)NULL); +} + diff --git a/dlls/comctl32/imagelist.c b/dlls/comctl32/imagelist.c index 993d35bdb54..70404fd4206 100644 --- a/dlls/comctl32/imagelist.c +++ b/dlls/comctl32/imagelist.c @@ -32,8 +32,8 @@ #include "windows.h" #include "winversion.h" -#include "compobj.h" -#include "storage.h" +#include "wine/obj_base.h" +#include "wine/obj_storage.h" #include "imagelist.h" #include "commctrl.h" #include "debug.h" diff --git a/dlls/comctl32/propsheet.c b/dlls/comctl32/propsheet.c index 4bfd3af7188..19341bf48b3 100644 --- a/dlls/comctl32/propsheet.c +++ b/dlls/comctl32/propsheet.c @@ -9,18 +9,50 @@ */ #include "windows.h" +#include "winversion.h" #include "commctrl.h" +#include "propsheet.h" #include "win.h" #include "debug.h" +LRESULT WINAPI +PROPSHEET_WindowProc (HWND32 hwnd, UINT32 uMsg, WPARAM32 wParam, LPARAM lParam); + + + + + +/***************************************************************** + * PropertySheet32AW (COMCTL32.83) + */ +INT32 WINAPI PropertySheet32AW(LPVOID propertySheetHeader) +{ + if (VERSION_OsIsUnicode()) + return PropertySheet32W ((LPCPROPSHEETHEADER32W) propertySheetHeader); + return PropertySheet32A ((LPCPROPSHEETHEADER32A) propertySheetHeader); +} + + + + /***************************************************************** * PropertySheet32A (COMCTL32.84) */ -INT32 WINAPI PropertySheet32A(LPCPROPSHEETHEADER32A propertySheetHeader) +INT32 WINAPI PropertySheet32A(LPCPROPSHEETHEADER32A lppsh) { - FIXME(commctrl, "(%p): stub\n", propertySheetHeader); + HWND32 hwnd; - return -1; + FIXME(propsheet, "(%p): stub\n", lppsh); + + if (lppsh->dwFlags & PSH_MODELESS) { + hwnd = CreateDialogParam32A ( lppsh->hInstance, WC_PROPSHEET32A, + lppsh->hwndParent, PROPSHEET_WindowProc, (LPARAM) lppsh ); + ShowWindow32 (hwnd, TRUE); + } else { + hwnd = DialogBoxParam32A ( lppsh->hInstance, WC_PROPSHEET32A, + lppsh->hwndParent, PROPSHEET_WindowProc, (LPARAM) lppsh ); + } + return hwnd; } /***************************************************************** @@ -28,17 +60,33 @@ INT32 WINAPI PropertySheet32A(LPCPROPSHEETHEADER32A propertySheetHeader) */ INT32 WINAPI PropertySheet32W(LPCPROPSHEETHEADER32W propertySheetHeader) { - FIXME(commctrl, "(%p): stub\n", propertySheetHeader); + FIXME(propsheet, "(%p): stub\n", propertySheetHeader); return -1; } + + + + +/***************************************************************** + * CreatePropertySheet32AW (COMCTL32.83) + */ +HPROPSHEETPAGE WINAPI CreatePropertySheetPage32AW (LPVOID lpPropSheetPage) +{ + if (VERSION_OsIsUnicode()) + return CreatePropertySheetPage32W((LPCPROPSHEETPAGE32W) lpPropSheetPage); + return CreatePropertySheetPage32A((LPCPROPSHEETPAGE32A) lpPropSheetPage); + +} + + /***************************************************************** * CreatePropertySheetPage32A (COMCTL32.19) */ HPROPSHEETPAGE WINAPI CreatePropertySheetPage32A(LPCPROPSHEETPAGE32A lpPropSheetPage) { - FIXME(commctrl, "(%p): stub\n", lpPropSheetPage); + FIXME(propsheet, "(%p): stub\n", lpPropSheetPage); return 0; } @@ -48,7 +96,7 @@ HPROPSHEETPAGE WINAPI CreatePropertySheetPage32A(LPCPROPSHEETPAGE32A lpPropSheet */ HPROPSHEETPAGE WINAPI CreatePropertySheetPage32W(LPCPROPSHEETPAGE32W lpPropSheetPage) { - FIXME(commctrl, "(%p): stub\n", lpPropSheetPage); + FIXME(propsheet, "(%p): stub\n", lpPropSheetPage); return 0; } @@ -58,8 +106,115 @@ HPROPSHEETPAGE WINAPI CreatePropertySheetPage32W(LPCPROPSHEETPAGE32W lpPropSheet */ BOOL32 WINAPI DestroyPropertySheetPage32(HPROPSHEETPAGE hPropPage) { - FIXME(commctrl, "(0x%x): stub\n", hPropPage); + FIXME(propsheet, "(0x%x): stub\n", hPropPage); return FALSE; } + + +LRESULT WINAPI +PROPSHEET_WindowProc (HWND32 hwnd, UINT32 uMsg, WPARAM32 wParam, LPARAM lParam) +{ + WND *wndPtr = WIN_FindWndPtr(hwnd); + + switch (uMsg) { + case PSM_SETCURSEL: + FIXME (propsheet, "Unimplemented msg PSM_SETCURSEL\n"); + return 0; + case PSM_REMOVEPAGE: + FIXME (propsheet, "Unimplemented msg PSM_REMOVEPAGE\n"); + return 0; + case PSM_ADDPAGE: + FIXME (propsheet, "Unimplemented msg PSM_ADDPAGE\n"); + return 0; + case PSM_CHANGED: + FIXME (propsheet, "Unimplemented msg PSM_CHANGED\n"); + return 0; + case PSM_RESTARTWINDOWS: + FIXME (propsheet, "Unimplemented msg PSM_RESTARTWINDOWS\n"); + return 0; + case PSM_REBOOTSYSTEM: + FIXME (propsheet, "Unimplemented msg PSM_REBOOTSYSTEM\n"); + return 0; + case PSM_CANCELTOCLOSE: + FIXME (propsheet, "Unimplemented msg PSM_CANCELTOCLOSE\n"); + return 0; + case PSM_QUERYSIBLINGS: + FIXME (propsheet, "Unimplemented msg PSM_QUERYSIBLINGS\n"); + return 0; + case PSM_UNCHANGED: + FIXME (propsheet, "Unimplemented msg PSM_UNCHANGED\n"); + return 0; + case PSM_APPLY: + FIXME (propsheet, "Unimplemented msg PSM_APPLY\n"); + return 0; + case PSM_SETTITLE32A: + FIXME (propsheet, "Unimplemented msg PSM_SETTITLE32A\n"); + return 0; + case PSM_SETTITLE32W: + FIXME (propsheet, "Unimplemented msg PSM_SETTITLE32W\n"); + return 0; + case PSM_SETWIZBUTTONS: + FIXME (propsheet, "Unimplemented msg PSM_SETWIZBUTTONS\n"); + return 0; + case PSM_PRESSBUTTON: + FIXME (propsheet, "Unimplemented msg PSM_PRESSBUTTON\n"); + return 0; + case PSM_SETCURSELID: + FIXME (propsheet, "Unimplemented msg PSM_SETCURSELID\n"); + return 0; + case PSM_SETFINISHTEXT32A: + FIXME (propsheet, "Unimplemented msg PSM_SETFINISHTEXT32A\n"); + return 0; + case PSM_SETFINISHTEXT32W: + FIXME (propsheet, "Unimplemented msg PSM_SETFINISHTEXT32W\n"); + return 0; + case PSM_GETTABCONTROL: + FIXME (propsheet, "Unimplemented msg PSM_GETTABCONTROL\n"); + return 0; + case PSM_ISDIALOGMESSAGE: + FIXME (propsheet, "Unimplemented msg PSM_ISDIALOGMESSAGE\n"); + return 0; + case PSM_GETCURRENTPAGEHWND: + FIXME (propsheet, "Unimplemented msg PSM_GETCURRENTPAGEHWND\n"); + return 0; + + default: + if (uMsg >= WM_USER) + ERR (propsheet, "unknown msg %04x wp=%08x lp=%08lx\n", + uMsg, wParam, lParam); + return DefWindowProc32A (hwnd, uMsg, wParam, lParam); + } + + +} + + +VOID +PROPSHEET_Register (VOID) +{ + WNDCLASS32A wndClass; + + if (GlobalFindAtom32A (WC_PROPSHEET32A)) return; + + ZeroMemory (&wndClass, sizeof(WNDCLASS32A)); + wndClass.style = CS_GLOBALCLASS | CS_DBLCLKS | CS_SAVEBITS; + wndClass.lpfnWndProc = (WNDPROC32)PROPSHEET_WindowProc; + wndClass.cbClsExtra = 0; + wndClass.cbWndExtra = sizeof(PROPSHEET_INFO *); + wndClass.hCursor = LoadCursor32A (0, IDC_ARROW32A); + wndClass.hbrBackground = 0; + wndClass.lpszClassName = WC_PROPSHEET32A; + + RegisterClass32A (&wndClass); +} + + +VOID +PROPSHEET_UnRegister (VOID) +{ + if (GlobalFindAtom32A (WC_PROPSHEET32A)) + UnregisterClass32A (WC_PROPSHEET32A, (HINSTANCE32)NULL); +} + diff --git a/dlls/comctl32/tab.c b/dlls/comctl32/tab.c index 9ca0bba2fb8..3013065f3e2 100644 --- a/dlls/comctl32/tab.c +++ b/dlls/comctl32/tab.c @@ -16,13 +16,17 @@ #include "windows.h" #include "commctrl.h" #include "tab.h" -#include "heap.h" #include "win.h" #include "debug.h" #define TAB_GetInfoPtr(wndPtr) ((TAB_INFO *)wndPtr->wExtra[0]) + + + + + static BOOL32 TAB_SendSimpleNotify (WND *wndPtr, UINT32 code) { @@ -44,6 +48,22 @@ TAB_GetCurSel (WND *wndPtr) return infoPtr->iSelected; } + +static LRESULT +TAB_SetCurSel (WND *wndPtr,WPARAM32 wParam) +{ + TAB_INFO *infoPtr = TAB_GetInfoPtr(wndPtr); + INT32 iItem=(INT32) wParam; + INT32 prevItem; + + prevItem=-1; + if ((iItem >= 0) && (iItem < infoPtr->uNumItem)) { + prevItem=infoPtr->iSelected; + infoPtr->iSelected=iItem; + } + return prevItem; +} + static LRESULT TAB_LButtonUp (WND *wndPtr, WPARAM32 wParam, LPARAM lParam) { @@ -78,6 +98,20 @@ TAB_LButtonUp (WND *wndPtr, WPARAM32 wParam, LPARAM lParam) return 0; } + +static LRESULT +TAB_AdjustRect (WND *wndPtr, WPARAM32 wParam, LPARAM lParam) +{ + + if (wParam==TRUE) { + FIXME (tab,"Should set display rectangle\n"); + } else { + FIXME (tab,"Should set window rectangle\n"); + } + + return 0; +} + static void TAB_SetItemBounds (WND *wndPtr) { @@ -129,9 +163,9 @@ TAB_DrawItem (WND *wndPtr, HDC32 hdc, INT32 iItem) RECT32 r; INT32 oldBkMode; - HPEN32 hwPen = CreatePen32 (PS_SOLID, 1, RGB (255, 255, 255 )); - HPEN32 hbPen = CreatePen32 (PS_SOLID, 1, GetSysColor32 (COLOR_BTNSHADOW)); - HPEN32 hsdPen = CreatePen32(PS_SOLID, 1, GetSysColor32 (COLOR_BTNTEXT)); + HPEN32 hwPen = GetSysColorPen32 (COLOR_3DHILIGHT); + HPEN32 hbPen = GetSysColorPen32 (COLOR_BTNSHADOW); + HPEN32 hsdPen = GetSysColorPen32 (COLOR_BTNTEXT); HPEN32 htmpPen = (HPEN32)NULL; CopyRect32(&r, &pti->rect); @@ -152,9 +186,6 @@ TAB_DrawItem (WND *wndPtr, HDC32 hdc, INT32 iItem) MoveToEx32 (hdc, r.right, r.top+1, NULL); LineTo32(hdc, r.right,r.bottom); hsdPen = SelectObject32(hdc,htmpPen); - DeleteObject32(hwPen); - DeleteObject32(hbPen); - DeleteObject32(hsdPen); oldBkMode = SetBkMode32(hdc, TRANSPARENT); r.left += 3; @@ -170,9 +201,10 @@ static void TAB_DrawBorder (WND *wndPtr, HDC32 hdc) { HPEN32 htmPen; - HPEN32 hwPen = GetStockObject32(WHITE_PEN); - HPEN32 hbPen = GetStockObject32(BLACK_PEN); - HPEN32 hShade = CreatePen32 ( PS_SOLID, 1, GetSysColor32 (COLOR_BTNSHADOW)); + HPEN32 hwPen = GetSysColorPen32 (COLOR_3DHILIGHT); + HPEN32 hbPen = GetSysColorPen32 (COLOR_3DDKSHADOW); + HPEN32 hShade = GetSysColorPen32 (COLOR_BTNSHADOW); + RECT32 rect; htmPen = SelectObject32 (hdc, hwPen); @@ -191,7 +223,6 @@ TAB_DrawBorder (WND *wndPtr, HDC32 hdc) LineTo32 (hdc, rect.right-1, rect.bottom-1); LineTo32 (hdc, rect.left, rect.bottom-1); hShade = SelectObject32(hdc, hShade); - DeleteObject32 (hShade); } @@ -199,17 +230,16 @@ static void TAB_Refresh (WND *wndPtr, HDC32 hdc) { TAB_INFO *infoPtr = TAB_GetInfoPtr(wndPtr); - HFONT32 hFont, hOldFont; - RECT32 rect; - HBRUSH32 hbrBk; + HFONT32 hOldFont; INT32 i; TAB_DrawBorder (wndPtr, hdc); + hOldFont = SelectObject32 (hdc, infoPtr->hFont); for (i = 0; i < infoPtr->uNumItem; i++) { TAB_DrawItem (wndPtr, hdc, i); } - + SelectObject32 (hdc, hOldFont); } static LRESULT @@ -230,11 +260,11 @@ static LRESULT TAB_InsertItem (WND *wndPtr, WPARAM32 wParam, LPARAM lParam) { TAB_INFO *infoPtr = TAB_GetInfoPtr(wndPtr); - TCITEM *pti; + TCITEM32A *pti; HDC32 hdc; INT32 iItem, len; - pti = (TCITEM*)lParam; + pti = (TCITEM32A *)lParam; iItem = (INT32)wParam; if (iItem < 0) return -1; @@ -242,16 +272,14 @@ TAB_InsertItem (WND *wndPtr, WPARAM32 wParam, LPARAM lParam) iItem = infoPtr->uNumItem; if (infoPtr->uNumItem == 0) { - infoPtr->items = HeapAlloc (GetProcessHeap (), HEAP_ZERO_MEMORY, - sizeof (TAB_ITEM)); + infoPtr->items = COMCTL32_Alloc (sizeof (TAB_ITEM)); infoPtr->uNumItem++; } else { TAB_ITEM *oldItems = infoPtr->items; infoPtr->uNumItem++; - infoPtr->items = HeapAlloc (GetProcessHeap (), HEAP_ZERO_MEMORY, - sizeof (TAB_ITEM) * infoPtr->uNumItem); + infoPtr->items = COMCTL32_Alloc (sizeof (TAB_ITEM) * infoPtr->uNumItem); /* pre insert copy */ if (iItem > 0) { @@ -266,20 +294,17 @@ TAB_InsertItem (WND *wndPtr, WPARAM32 wParam, LPARAM lParam) } - HeapFree (GetProcessHeap (), 0, oldItems); + COMCTL32_Free (oldItems); } infoPtr->items[iItem].mask = pti->mask; if (pti->mask & TCIF_TEXT) { len = lstrlen32A (pti->pszText); - infoPtr->items[iItem].pszText = - HeapAlloc (GetProcessHeap (), HEAP_ZERO_MEMORY, len+1); + infoPtr->items[iItem].pszText = COMCTL32_Alloc (len+1); lstrcpy32A (infoPtr->items[iItem].pszText, pti->pszText); infoPtr->items[iItem].cchTextMax = pti->cchTextMax; } - - if (pti->mask & TCIF_IMAGE) infoPtr->items[iItem].iImage = pti->iImage; @@ -298,12 +323,168 @@ TAB_InsertItem (WND *wndPtr, WPARAM32 wParam, LPARAM lParam) } static LRESULT +TAB_SetItem32A (WND *wndPtr, WPARAM32 wParam, LPARAM lParam) +{ + TAB_INFO *infoPtr = TAB_GetInfoPtr(wndPtr); + TCITEM32A *tabItem; + TAB_ITEM *wineItem; + INT32 iItem,len; + + iItem=(INT32) wParam; + tabItem=(LPTCITEM32A ) lParam; + TRACE (tab,"%d %p\n",iItem, tabItem); + if ((iItem<0) || (iItem>infoPtr->uNumItem)) return FALSE; + + wineItem=& infoPtr->items[iItem]; + + if (tabItem->mask & TCIF_IMAGE) + wineItem->iImage=tabItem->iImage; + + if (tabItem->mask & TCIF_PARAM) + wineItem->lParam=tabItem->lParam; + + if (tabItem->mask & TCIF_RTLREADING) + FIXME (tab,"TCIF_RTLREADING\n"); + + if (tabItem->mask & TCIF_STATE) + wineItem->dwState=tabItem->dwState; + + if (tabItem->mask & TCIF_TEXT) { + len=lstrlen32A (tabItem->pszText); + if (len>wineItem->cchTextMax) + wineItem->pszText= COMCTL32_ReAlloc (wineItem->pszText, len+1); + lstrcpyn32A (wineItem->pszText, tabItem->pszText, len); + } + + return TRUE; +} + +static LRESULT +TAB_GetItemCount (WND *wndPtr, WPARAM32 wParam, LPARAM lParam) +{ + TAB_INFO *infoPtr = TAB_GetInfoPtr(wndPtr); + + return infoPtr->uNumItem; +} + + +static LRESULT +TAB_GetItem32A (WND *wndPtr, WPARAM32 wParam, LPARAM lParam) +{ + TAB_INFO *infoPtr = TAB_GetInfoPtr(wndPtr); + TCITEM32A *tabItem; + TAB_ITEM *wineItem; + INT32 iItem; + + iItem=(INT32) wParam; + tabItem=(LPTCITEM32A) lParam; + TRACE (tab,"\n"); + if ((iItem<0) || (iItem>infoPtr->uNumItem)) return FALSE; + + wineItem=& infoPtr->items[iItem]; + + if (tabItem->mask & TCIF_IMAGE) + tabItem->iImage=wineItem->iImage; + + if (tabItem->mask & TCIF_PARAM) + tabItem->lParam=wineItem->lParam; + + if (tabItem->mask & TCIF_RTLREADING) + FIXME (tab, "TCIF_RTLREADING\n"); + + if (tabItem->mask & TCIF_STATE) + tabItem->dwState=wineItem->dwState; + + if (tabItem->mask & TCIF_TEXT) + lstrcpyn32A (tabItem->pszText, wineItem->pszText, tabItem->cchTextMax); + + return TRUE; +} + +static LRESULT +TAB_DeleteItem (WND *wndPtr, WPARAM32 wParam, LPARAM lParam) +{ + TAB_INFO *infoPtr = TAB_GetInfoPtr(wndPtr); + + FIXME (tab,"stub \n"); + return TRUE; +} +static LRESULT +TAB_DeleteAllItems (WND *wndPtr, WPARAM32 wParam, LPARAM lParam) +{ + TAB_INFO *infoPtr = TAB_GetInfoPtr(wndPtr); + + COMCTL32_Free (infoPtr->items); + infoPtr->uNumItem=0; + + return TRUE; +} + + +static LRESULT +TAB_GetFont (WND *wndPtr, WPARAM32 wParam, LPARAM lParam) +{ + TAB_INFO *infoPtr = TAB_GetInfoPtr(wndPtr); + + TRACE (tab,"\n"); + return (LRESULT)infoPtr->hFont; +} + +static LRESULT +TAB_SetFont (WND *wndPtr, WPARAM32 wParam, LPARAM lParam) + +{ + TAB_INFO *infoPtr = TAB_GetInfoPtr(wndPtr); + TEXTMETRIC32A tm; + HFONT32 hFont, hOldFont; + HDC32 hdc; + + TRACE (tab,"%x %lx\n",wParam, lParam); + + infoPtr->hFont = (HFONT32)wParam; + + hFont = infoPtr->hFont ? infoPtr->hFont : GetStockObject32 (SYSTEM_FONT); + + hdc = GetDC32 (0); + hOldFont = SelectObject32 (hdc, hFont); + GetTextMetrics32A (hdc, &tm); + infoPtr->nHeight= tm.tmHeight + tm.tmExternalLeading; + SelectObject32 (hdc, hOldFont); + + if (lParam) TAB_Refresh (wndPtr,hdc); + ReleaseDC32 (0, hdc); + + return 0; +} + + +static LRESULT +TAB_GetImageList (WND *wndPtr, WPARAM32 wParam, LPARAM lParam) +{ + TAB_INFO *infoPtr = TAB_GetInfoPtr(wndPtr); + + TRACE (tab,"\n"); + return (LRESULT)infoPtr->himl; +} + +static LRESULT +TAB_SetImageList (WND *wndPtr, WPARAM32 wParam, LPARAM lParam) +{ + TAB_INFO *infoPtr = TAB_GetInfoPtr(wndPtr); + HIMAGELIST himlPrev; + + TRACE (tab,"\n"); + himlPrev = infoPtr->himl; + infoPtr->himl= (HIMAGELIST)lParam; + return (LRESULT)himlPrev; +} + +static LRESULT TAB_Create (WND *wndPtr, WPARAM32 wParam, LPARAM lParam) { TAB_INFO *infoPtr; - infoPtr = (TAB_INFO *)HeapAlloc (GetProcessHeap (), HEAP_ZERO_MEMORY, - sizeof(TAB_INFO)); + infoPtr = (TAB_INFO *)COMCTL32_Alloc (sizeof(TAB_INFO)); wndPtr->wExtra[0] = (DWORD)infoPtr; infoPtr->uNumItem = 0; @@ -325,12 +506,12 @@ TAB_Destroy (WND *wndPtr, WPARAM32 wParam, LPARAM lParam) if (infoPtr->items) { for (iItem = 0; iItem < infoPtr->uNumItem; iItem++) { if (infoPtr->items[iItem].pszText) - HeapFree (GetProcessHeap (), 0, infoPtr->items[iItem].pszText); + COMCTL32_Free (infoPtr->items[iItem].pszText); } - HeapFree (GetProcessHeap (), 0, infoPtr->items); + COMCTL32_Free (infoPtr->items); } - HeapFree (GetProcessHeap (), 0, infoPtr); + COMCTL32_Free (infoPtr); return 0; } @@ -343,20 +524,117 @@ TAB_WindowProc (HWND32 hwnd, UINT32 uMsg, WPARAM32 wParam, LPARAM lParam) switch (uMsg) { + case TCM_GETIMAGELIST: + return TAB_GetImageList (wndPtr, wParam, lParam); + + case TCM_SETIMAGELIST: + return TAB_SetImageList (wndPtr, wParam, lParam); + + case TCM_GETITEMCOUNT: + return TAB_GetItemCount (wndPtr, wParam, lParam); + + case TCM_GETITEM32A: + return TAB_GetItem32A (wndPtr, wParam, lParam); + + case TCM_GETITEM32W: + FIXME (tab, "Unimplemented msg TCM_GETITEM32W\n"); + return 0; + + case TCM_SETITEM32A: + return TAB_SetItem32A (wndPtr, wParam, lParam); + + case TCM_SETITEM32W: + FIXME (tab, "Unimplemented msg TCM_GETITEM32W\n"); + return 0; + + case TCM_DELETEITEM: + return TAB_DeleteItem (wndPtr, wParam, lParam); + + case TCM_DELETEALLITEMS: + return TAB_DeleteAllItems (wndPtr, wParam, lParam); + + case TCM_GETITEMRECT: + FIXME (tab, "Unimplemented msg TCM_GETITEMRECT\n"); + return 0; + case TCM_GETCURSEL: return TAB_GetCurSel (wndPtr); - case TCM_INSERTITEM: + case TCM_SETCURSEL: + return TAB_SetCurSel (wndPtr, wParam); + + case TCM_INSERTITEM32A: return TAB_InsertItem (wndPtr, wParam, lParam); + case TCM_INSERTITEM32W: + FIXME (tab, "Unimplemented msg TCM_INSERTITEM32W\n"); + return 0; + + case TCM_SETITEMEXTRA: + FIXME (tab, "Unimplemented msg TCM_SETITEMEXTRA\n"); + return 0; + + case TCM_ADJUSTRECT: + return TAB_AdjustRect (wndPtr, wParam, lParam); + + case TCM_SETITEMSIZE: + FIXME (tab, "Unimplemented msg TCM_SETITEMSIZE\n"); + return 0; + + case TCM_REMOVEIMAGE: + FIXME (tab, "Unimplemented msg TCM_REMOVEIMAGE\n"); + return 0; + + case TCM_SETPADDING: + FIXME (tab, "Unimplemented msg TCM_SETPADDING\n"); + return 0; + + case TCM_GETROWCOUNT: + FIXME (tab, "Unimplemented msg TCM_GETROWCOUNT\n"); + return 0; + + case TCM_GETTOOLTIPS: + FIXME (tab, "Unimplemented msg TCM_GETTOOLTIPS\n"); + return 0; + + case TCM_SETTOOLTIPS: + FIXME (tab, "Unimplemented msg TCM_SETTOOLTIPS\n"); + return 0; + + case TCM_GETCURFOCUS: + FIXME (tab, "Unimplemented msg TCM_GETCURFOCUS\n"); + return 0; + + case TCM_SETCURFOCUS: + FIXME (tab, "Unimplemented msg TCM_SETCURFOCUS\n"); + return 0; + + case TCM_SETMINTTABWIDTH: + FIXME (tab, "Unimplemented msg TCM_SETMINTTABWIDTH\n"); + return 0; + + case TCM_DESELECTALL: + FIXME (tab, "Unimplemented msg TCM_DESELECTALL\n"); + return 0; + + case WM_GETFONT: + return TAB_GetFont (wndPtr, wParam, lParam); + + case WM_SETFONT: + return TAB_SetFont (wndPtr, wParam, lParam); + case WM_CREATE: return TAB_Create (wndPtr, wParam, lParam); case WM_DESTROY: return TAB_Destroy (wndPtr, wParam, lParam); + case WM_GETDLGCODE: + return DLGC_WANTARROWS | DLGC_WANTCHARS; + case WM_LBUTTONUP: return TAB_LButtonUp (wndPtr, wParam, lParam); + case WM_PAINT: return TAB_Paint (wndPtr, wParam); diff --git a/dlls/comctl32/trackbar.c b/dlls/comctl32/trackbar.c index c04b43237ef..65863b40581 100644 --- a/dlls/comctl32/trackbar.c +++ b/dlls/comctl32/trackbar.c @@ -2,7 +2,7 @@ * Trackbar control * * Copyright 1998 Eric Kohl - * Copyright 1998 Alex Priem + * Copyright 1998,1999 Alex Priem * * * TODO: @@ -11,7 +11,7 @@ * - handle dragging slider better * - better tic handling. * - more notifications. - * - tooltips + * */ /* known bugs: @@ -27,7 +27,6 @@ #include "windows.h" #include "commctrl.h" #include "trackbar.h" -#include "heap.h" #include "win.h" #include "debug.h" @@ -68,7 +67,7 @@ void TRACKBAR_RecalculateTics (TRACKBAR_INFO *infoPtr) nrTics=(infoPtr->nRangeMax - infoPtr->nRangeMin)/infoPtr->uTicFreq; else { nrTics=0; - HeapFree (SystemHeap,0,infoPtr->tics); + COMCTL32_Free (infoPtr->tics); infoPtr->tics=NULL; infoPtr->uNumTics=0; return; diff --git a/dlls/ntdll/rtl.c b/dlls/ntdll/rtl.c index 1b1537d66ad..e35464d8ea0 100644 --- a/dlls/ntdll/rtl.c +++ b/dlls/ntdll/rtl.c @@ -842,3 +842,14 @@ NTSTATUS WINAPI RtlCompareUnicodeString(LPUNICODE_STRING x1,LPUNICODE_STRING x2, FIXME(ntdll,"(0x%08lx,0x%08lx,0x%08lx),stub!\n",debugstr_w(x1->Buffer),debugstr_w(x2->Buffer),x3); return 0; } + +/****************************************************************************** + * DbgPrint [NTDLL] + */ +void __cdecl DbgPrint(LPCSTR fmt,LPVOID args) { + char buf[512]; + + wvsprintf32A(buf,fmt,&args); + MSG("DbgPrint says: %s",buf); + /* hmm, raise exception? */ +} diff --git a/dlls/shell32/contmenu.c b/dlls/shell32/contmenu.c index 504cc6c0869..da45f8a8470 100644 --- a/dlls/shell32/contmenu.c +++ b/dlls/shell32/contmenu.c @@ -8,6 +8,7 @@ #include "debug.h" #include "pidl.h" #include "shlobj.h" +#include "objbase.h" #include "shell32_main.h" #include "shresdef.h" #include "if_macros.h" @@ -52,8 +53,7 @@ static HRESULT WINAPI IContextMenu_QueryInterface(LPCONTEXTMENU this,REFIID riid { *ppvObj = (LPCONTEXTMENU)this; } else if(IsEqualIID(riid, &IID_IShellExtInit)) /*IShellExtInit*/ - { *ppvObj = (LPSHELLEXTINIT)this; - WARN(shell,"-- LPSHELLEXTINIT pointer requested\n"); + { FIXME (shell,"-- LPSHELLEXTINIT pointer requested\n"); } if(*ppvObj) @@ -270,7 +270,7 @@ static HRESULT WINAPI IContextMenu_InvokeCommand(LPCONTEXTMENU this, LPCMINVOKEC * IContextMenu_GetCommandString() */ static HRESULT WINAPI IContextMenu_GetCommandString( LPCONTEXTMENU this, UINT32 idCommand, - UINT32 uFlags,LPUINT32 lpReserved,LPSTR lpszName,UINT32 uMaxNameLen) + UINT32 uFlags,LPUINT32 lpReserved,LPSTR lpszName,UINT32 uMaxNameLen) { HRESULT hr = E_INVALIDARG; TRACE(shell,"(%p)->(idcom=%x flags=%x %p name=%p len=%x)\n",this, idCommand, uFlags, lpReserved, lpszName, uMaxNameLen); @@ -321,8 +321,9 @@ static HRESULT WINAPI IContextMenu_HandleMenuMsg(LPCONTEXTMENU this, UINT32 uMsg * IContextMenu_AllocPidlTable() */ BOOL32 IContextMenu_AllocPidlTable(LPCONTEXTMENU this, DWORD dwEntries) -{ /*add one for NULL terminator */ - TRACE(shell,"(%p)->(entrys=%lu)\n",this, dwEntries); +{ TRACE(shell,"(%p)->(entrys=%lu)\n",this, dwEntries); + + /*add one for NULL terminator */ dwEntries++; this->aPidls = (LPITEMIDLIST*)SHAlloc(dwEntries * sizeof(LPITEMIDLIST)); diff --git a/dlls/shell32/dataobject.c b/dlls/shell32/dataobject.c index 0bc6bf56b78..849a92d5215 100644 --- a/dlls/shell32/dataobject.c +++ b/dlls/shell32/dataobject.c @@ -7,7 +7,11 @@ */ #include "debug.h" #include "wintypes.h" -#include "shlobj.h" +#include "wine/obj_base.h" +#include "wine/obj_storage.h" +#include "wine/obj_moniker.h" +#include "wine/obj_dataobject.h" +#include "objbase.h" #include "pidl.h" #include "winerror.h" #include "shell32_main.h" @@ -19,29 +23,44 @@ UINT32 cfFileContents=0; /*********************************************************************** * IEnumFORMATETC implementation */ -static HRESULT WINAPI IEnumFORMATETC_QueryInterface (LPENUMFORMATETC this, REFIID riid, LPVOID * ppvObj); -static ULONG WINAPI IEnumFORMATETC_AddRef (LPENUMFORMATETC this); -static ULONG WINAPI IEnumFORMATETC_Release (LPENUMFORMATETC this); -static HRESULT WINAPI IEnumFORMATETC_Next(LPENUMFORMATETC this, ULONG celt, FORMATETC32 *rgelt, ULONG *pceltFethed); -static HRESULT WINAPI IEnumFORMATETC_Skip(LPENUMFORMATETC this, ULONG celt); -static HRESULT WINAPI IEnumFORMATETC_Reset(LPENUMFORMATETC this); -static HRESULT WINAPI IEnumFORMATETC_Clone(LPENUMFORMATETC this, LPENUMFORMATETC* ppenum); - -static struct IEnumFORMATETC_VTable efvt = -{ IEnumFORMATETC_QueryInterface, - IEnumFORMATETC_AddRef, - IEnumFORMATETC_Release, - IEnumFORMATETC_Next, - IEnumFORMATETC_Skip, - IEnumFORMATETC_Reset, - IEnumFORMATETC_Clone +typedef struct _IEnumFORMATETC +{ + /* IUnknown fields */ + ICOM_VTABLE(IEnumFORMATETC)* lpvtbl; + DWORD ref; + /* IEnumFORMATETC fields */ + UINT32 posFmt; + UINT32 countFmt; + LPFORMATETC32 pFmt; +} _IEnumFORMATETC; + +static HRESULT WINAPI IEnumFORMATETC_fnQueryInterface(LPUNKNOWN iface, REFIID riid, LPVOID* ppvObj); +static ULONG WINAPI IEnumFORMATETC_fnAddRef(LPUNKNOWN iface); +static ULONG WINAPI IEnumFORMATETC_fnRelease(LPUNKNOWN iface); +static HRESULT WINAPI IEnumFORMATETC_fnNext(LPENUMFORMATETC iface, ULONG celt, FORMATETC32* rgelt, ULONG* pceltFethed); +static HRESULT WINAPI IEnumFORMATETC_fnSkip(LPENUMFORMATETC iface, ULONG celt); +static HRESULT WINAPI IEnumFORMATETC_fnReset(LPENUMFORMATETC iface); +static HRESULT WINAPI IEnumFORMATETC_fnClone(LPENUMFORMATETC iface, LPENUMFORMATETC* ppenum); + +static struct ICOM_VTABLE(IEnumFORMATETC) efvt = +{ + { + IEnumFORMATETC_fnQueryInterface, + IEnumFORMATETC_fnAddRef, + IEnumFORMATETC_fnRelease + }, + IEnumFORMATETC_fnNext, + IEnumFORMATETC_fnSkip, + IEnumFORMATETC_fnReset, + IEnumFORMATETC_fnClone }; -extern LPENUMFORMATETC IEnumFORMATETC_Constructor(UINT32 cfmt, const FORMATETC32 afmt[]) -{ LPENUMFORMATETC ef; +LPENUMFORMATETC IEnumFORMATETC_Constructor(UINT32 cfmt, const FORMATETC32 afmt[]) +{ + _IEnumFORMATETC* ef; DWORD size=cfmt * sizeof(FORMATETC32); - ef=(LPENUMFORMATETC)HeapAlloc(GetProcessHeap(),0,sizeof(IEnumFORMATETC)); + ef=(_IEnumFORMATETC*)HeapAlloc(GetProcessHeap(),0,sizeof(_IEnumFORMATETC)); ef->ref=1; ef->lpvtbl=&efvt; @@ -54,10 +73,12 @@ extern LPENUMFORMATETC IEnumFORMATETC_Constructor(UINT32 cfmt, const FORMATETC32 } TRACE(shell,"(%p)->()\n",ef); - return ef; + return (LPENUMFORMATETC)ef; } -static HRESULT WINAPI IEnumFORMATETC_QueryInterface (LPENUMFORMATETC this, REFIID riid, LPVOID * ppvObj) -{ char xriid[50]; +static HRESULT WINAPI IEnumFORMATETC_fnQueryInterface(LPUNKNOWN iface, REFIID riid, LPVOID* ppvObj) +{ + ICOM_THIS(IEnumFORMATETC,iface); + char xriid[50]; WINE_StringFromCLSID((LPCLSID)riid,xriid); TRACE(shell,"(%p)->(\n\tIID:\t%s,%p)\n",this,xriid,ppvObj); @@ -71,7 +92,7 @@ static HRESULT WINAPI IEnumFORMATETC_QueryInterface (LPENUMFORMATETC this, REFII } if(*ppvObj) - { (*(LPENUMFORMATETC*)ppvObj)->lpvtbl->fnAddRef(this); + { IEnumFORMATETC_AddRef((IEnumFORMATETC*)*ppvObj); TRACE(shell,"-- Interface: (%p)->(%p)\n",ppvObj,*ppvObj); return S_OK; } @@ -79,12 +100,16 @@ static HRESULT WINAPI IEnumFORMATETC_QueryInterface (LPENUMFORMATETC this, REFII return E_NOINTERFACE; } -static ULONG WINAPI IEnumFORMATETC_AddRef (LPENUMFORMATETC this) -{ TRACE(shell,"(%p)->(count=%lu)\n",this,(this->ref)+1); +static ULONG WINAPI IEnumFORMATETC_fnAddRef(LPUNKNOWN iface) +{ + ICOM_THIS(IEnumFORMATETC,iface); + TRACE(shell,"(%p)->(count=%lu)\n",this,(this->ref)+1); return ++(this->ref); } -static ULONG WINAPI IEnumFORMATETC_Release (LPENUMFORMATETC this) -{ TRACE(shell,"(%p)->()\n",this); +static ULONG WINAPI IEnumFORMATETC_fnRelease(LPUNKNOWN iface) +{ + ICOM_THIS(IEnumFORMATETC,iface); + TRACE(shell,"(%p)->()\n",this); if (!--(this->ref)) { TRACE(shell," destroying IEnumFORMATETC(%p)\n",this); if (this->pFmt) @@ -95,8 +120,10 @@ static ULONG WINAPI IEnumFORMATETC_Release (LPENUMFORMATETC this) } return this->ref; } -static HRESULT WINAPI IEnumFORMATETC_Next(LPENUMFORMATETC this, ULONG celt, FORMATETC32 *rgelt, ULONG *pceltFethed) -{ UINT32 cfetch; +static HRESULT WINAPI IEnumFORMATETC_fnNext(LPENUMFORMATETC iface, ULONG celt, FORMATETC32 *rgelt, ULONG *pceltFethed) +{ + ICOM_THIS(IEnumFORMATETC,iface); + UINT32 cfetch; HRESULT hres = S_FALSE; TRACE (shell, "(%p)->()\n", this); @@ -120,8 +147,10 @@ static HRESULT WINAPI IEnumFORMATETC_Next(LPENUMFORMATETC this, ULONG celt, FORM return hres; } -static HRESULT WINAPI IEnumFORMATETC_Skip(LPENUMFORMATETC this, ULONG celt) -{ FIXME (shell, "(%p)->(num=%lu)\n", this, celt); +static HRESULT WINAPI IEnumFORMATETC_fnSkip(LPENUMFORMATETC iface, ULONG celt) +{ + ICOM_THIS(IEnumFORMATETC,iface); + FIXME (shell, "(%p)->(num=%lu)\n", this, celt); this->posFmt += celt; if (this->posFmt > this->countFmt) @@ -130,55 +159,73 @@ static HRESULT WINAPI IEnumFORMATETC_Skip(LPENUMFORMATETC this, ULONG celt) } return S_OK; } -static HRESULT WINAPI IEnumFORMATETC_Reset(LPENUMFORMATETC this) -{ FIXME (shell, "(%p)->()\n", this); +static HRESULT WINAPI IEnumFORMATETC_fnReset(LPENUMFORMATETC iface) +{ + ICOM_THIS(IEnumFORMATETC,iface); + FIXME (shell, "(%p)->()\n", this); this->posFmt = 0; return S_OK; } -static HRESULT WINAPI IEnumFORMATETC_Clone(LPENUMFORMATETC this, LPENUMFORMATETC* ppenum) -{ FIXME (shell, "(%p)->(ppenum=%p)\n", this, ppenum); +static HRESULT WINAPI IEnumFORMATETC_fnClone(LPENUMFORMATETC iface, LPENUMFORMATETC* ppenum) +{ + ICOM_THIS(IEnumFORMATETC,iface); + FIXME (shell, "(%p)->(ppenum=%p)\n", this, ppenum); return E_NOTIMPL; } /*********************************************************************** * IDataObject implementation */ - -static HRESULT WINAPI IDataObject_QueryInterface (LPDATAOBJECT, REFIID riid, LPVOID * ppvObj); -static ULONG WINAPI IDataObject_AddRef (LPDATAOBJECT); -static ULONG WINAPI IDataObject_Release (LPDATAOBJECT); -static HRESULT WINAPI IDataObject_GetData (LPDATAOBJECT, LPFORMATETC32 pformatetcIn, STGMEDIUM32 *pmedium); -static HRESULT WINAPI IDataObject_GetDataHere(LPDATAOBJECT, LPFORMATETC32 pformatetc, STGMEDIUM32 *pmedium); -static HRESULT WINAPI IDataObject_QueryGetData(LPDATAOBJECT, LPFORMATETC32 pformatetc); -static HRESULT WINAPI IDataObject_GetCanonicalFormatEtc(LPDATAOBJECT, LPFORMATETC32 pformatectIn, LPFORMATETC32 pformatetcOut); -static HRESULT WINAPI IDataObject_SetData(LPDATAOBJECT, LPFORMATETC32 pformatetc, STGMEDIUM32 *pmedium, BOOL32 fRelease); -static HRESULT WINAPI IDataObject_EnumFormatEtc(LPDATAOBJECT, DWORD dwDirection, IEnumFORMATETC **ppenumFormatEtc); -static HRESULT WINAPI IDataObject_DAdvise (LPDATAOBJECT, LPFORMATETC32 *pformatetc, DWORD advf, IAdviseSink *pAdvSink, DWORD *pdwConnection); -static HRESULT WINAPI IDataObject_DUnadvise(LPDATAOBJECT, DWORD dwConnection); -static HRESULT WINAPI IDataObject_EnumDAdvise(LPDATAOBJECT, IEnumSTATDATA **ppenumAdvise); - -static struct IDataObject_VTable dtovt = -{ IDataObject_QueryInterface, - IDataObject_AddRef, - IDataObject_Release, - IDataObject_GetData, - IDataObject_GetDataHere, - IDataObject_QueryGetData, - IDataObject_GetCanonicalFormatEtc, - IDataObject_SetData, - IDataObject_EnumFormatEtc, - IDataObject_DAdvise, - IDataObject_DUnadvise, - IDataObject_EnumDAdvise +typedef struct _IDataObject +{ + /* IUnknown fields */ + ICOM_VTABLE(IDataObject)* lpvtbl; + DWORD ref; + /* IDataObject fields */ + LPSHELLFOLDER psf; + LPIDLLIST lpill; /* the data of the dataobject */ + LPITEMIDLIST pidl; +} _IDataObject; + +static HRESULT WINAPI IDataObject_fnQueryInterface(LPUNKNOWN iface, REFIID riid, LPVOID* ppvObj); +static ULONG WINAPI IDataObject_fnAddRef(LPUNKNOWN iface); +static ULONG WINAPI IDataObject_fnRelease(LPUNKNOWN iface); +static HRESULT WINAPI IDataObject_fnGetData(LPDATAOBJECT iface, LPFORMATETC32 pformatetcIn, STGMEDIUM32* pmedium); +static HRESULT WINAPI IDataObject_fnGetDataHere(LPDATAOBJECT iface, LPFORMATETC32 pformatetc, STGMEDIUM32* pmedium); +static HRESULT WINAPI IDataObject_fnQueryGetData(LPDATAOBJECT iface, LPFORMATETC32 pformatetc); +static HRESULT WINAPI IDataObject_fnGetCanonicalFormatEtc(LPDATAOBJECT iface, LPFORMATETC32 pformatectIn, LPFORMATETC32 pformatetcOut); +static HRESULT WINAPI IDataObject_fnSetData(LPDATAOBJECT iface, LPFORMATETC32 pformatetc, STGMEDIUM32* pmedium, BOOL32 fRelease); +static HRESULT WINAPI IDataObject_fnEnumFormatEtc(LPDATAOBJECT iface, DWORD dwDirection, IEnumFORMATETC** ppenumFormatEtc); +static HRESULT WINAPI IDataObject_fnDAdvise(LPDATAOBJECT iface, LPFORMATETC32* pformatetc, DWORD advf, IAdviseSink* pAdvSink, DWORD* pdwConnection); +static HRESULT WINAPI IDataObject_fnDUnadvise(LPDATAOBJECT iface, DWORD dwConnection); +static HRESULT WINAPI IDataObject_fnEnumDAdvise(LPDATAOBJECT iface, IEnumSTATDATA **ppenumAdvise); + +static struct ICOM_VTABLE(IDataObject) dtovt = +{ + { + IDataObject_fnQueryInterface, + IDataObject_fnAddRef, + IDataObject_fnRelease + }, + IDataObject_fnGetData, + IDataObject_fnGetDataHere, + IDataObject_fnQueryGetData, + IDataObject_fnGetCanonicalFormatEtc, + IDataObject_fnSetData, + IDataObject_fnEnumFormatEtc, + IDataObject_fnDAdvise, + IDataObject_fnDUnadvise, + IDataObject_fnEnumDAdvise }; /************************************************************************** * IDataObject_Constructor */ LPDATAOBJECT IDataObject_Constructor(HWND32 hwndOwner, LPSHELLFOLDER psf, LPITEMIDLIST * apidl, UINT32 cidl) -{ LPDATAOBJECT dto; - if (!(dto = (LPDATAOBJECT)HeapAlloc(GetProcessHeap(),0,sizeof(IDataObject)))) +{ + _IDataObject* dto; + if (!(dto = (_IDataObject*)HeapAlloc(GetProcessHeap(),0,sizeof(_IDataObject)))) return NULL; dto->ref=1; @@ -194,13 +241,15 @@ LPDATAOBJECT IDataObject_Constructor(HWND32 hwndOwner, LPSHELLFOLDER psf, LPITEM dto->lpill->lpvtbl->fnAddItems(dto->lpill, apidl, cidl); TRACE(shell,"(%p)->(sf=%p apidl=%p cidl=%u)\n",dto, psf, apidl, cidl); - return dto; + return (LPDATAOBJECT)dto; } /*************************************************************************** * IDataObject_QueryInterface */ -static HRESULT WINAPI IDataObject_QueryInterface (LPDATAOBJECT this, REFIID riid, LPVOID * ppvObj) -{ char xriid[50]; +static HRESULT WINAPI IDataObject_fnQueryInterface (LPUNKNOWN iface, REFIID riid, LPVOID * ppvObj) +{ + ICOM_THIS(IDataObject,iface); + char xriid[50]; WINE_StringFromCLSID((LPCLSID)riid,xriid); TRACE(shell,"(%p)->(\n\tIID:\t%s,%p)\n",this,xriid,ppvObj); @@ -214,7 +263,7 @@ static HRESULT WINAPI IDataObject_QueryInterface (LPDATAOBJECT this, REFIID riid } if(*ppvObj) - { (*(LPDATAOBJECT*)ppvObj)->lpvtbl->fnAddRef(this); + { IDataObject_AddRef((IDataObject*)*ppvObj); TRACE(shell,"-- Interface: (%p)->(%p)\n",ppvObj,*ppvObj); return S_OK; } @@ -224,15 +273,19 @@ static HRESULT WINAPI IDataObject_QueryInterface (LPDATAOBJECT this, REFIID riid /************************************************************************** * IDataObject_AddRef */ -static ULONG WINAPI IDataObject_AddRef(LPDATAOBJECT this) -{ TRACE(shell,"(%p)->(count=%lu)\n",this,(this->ref)+1); +static ULONG WINAPI IDataObject_fnAddRef(LPUNKNOWN iface) +{ + ICOM_THIS(IDataObject,iface); + TRACE(shell,"(%p)->(count=%lu)\n",this,(this->ref)+1); return ++(this->ref); } /************************************************************************** * IDataObject_Release */ -static ULONG WINAPI IDataObject_Release(LPDATAOBJECT this) -{ TRACE(shell,"(%p)->()\n",this); +static ULONG WINAPI IDataObject_fnRelease(LPUNKNOWN iface) +{ + ICOM_THIS(IDataObject,iface); + TRACE(shell,"(%p)->()\n",this); if (!--(this->ref)) { TRACE(shell," destroying IDataObject(%p)\n",this); IDLList_Destructor(this->lpill); @@ -262,6 +315,7 @@ static BOOL32 DATAOBJECT_InitShellIDList(void) * NOTES * get or register the "FileGroupDescriptor" clipformat */ +/* FIXME: DATAOBJECT_InitFileGroupDesc is not used (19981226) static BOOL32 DATAOBJECT_InitFileGroupDesc(void) { if (cfFileGroupDesc) { return(TRUE); @@ -270,12 +324,14 @@ static BOOL32 DATAOBJECT_InitFileGroupDesc(void) cfFileGroupDesc = RegisterClipboardFormat32A(CFSTR_FILEDESCRIPTORA); return(cfFileGroupDesc != 0); } +*/ /************************************************************************** * DATAOBJECT_InitFileContents (internal) * * NOTES * get or register the "FileContents" clipformat */ +/* FIXME: DATAOBJECT_InitFileContents is not used (19981226) static BOOL32 DATAOBJECT_InitFileContents(void) { if (cfFileContents) { return(TRUE); @@ -284,13 +340,15 @@ static BOOL32 DATAOBJECT_InitFileContents(void) cfFileContents = RegisterClipboardFormat32A(CFSTR_FILECONTENTS); return(cfFileContents != 0); } - +*/ /************************************************************************** * interface implementation */ -static HRESULT WINAPI IDataObject_GetData (LPDATAOBJECT this, LPFORMATETC32 pformatetcIn, STGMEDIUM32 *pmedium) -{ char temp[256]; +static HRESULT WINAPI IDataObject_fnGetData(LPDATAOBJECT iface, LPFORMATETC32 pformatetcIn, STGMEDIUM32 *pmedium) +{ + ICOM_THIS(IDataObject,iface); + char temp[256]; UINT32 cItems; DWORD size, size1, size2; LPITEMIDLIST pidl; @@ -353,35 +411,51 @@ static HRESULT WINAPI IDataObject_GetData (LPDATAOBJECT this, LPFORMATETC32 pfor FIXME (shell, "-- clipformat not implemented\n"); return (E_INVALIDARG); } -static HRESULT WINAPI IDataObject_GetDataHere(LPDATAOBJECT this, LPFORMATETC32 pformatetc, STGMEDIUM32 *pmedium) -{ FIXME (shell, "(%p)->()\n", this); +static HRESULT WINAPI IDataObject_fnGetDataHere(LPDATAOBJECT iface, LPFORMATETC32 pformatetc, STGMEDIUM32 *pmedium) +{ + ICOM_THIS(IDataObject,iface); + FIXME (shell, "(%p)->()\n", this); return E_NOTIMPL; } -static HRESULT WINAPI IDataObject_QueryGetData(LPDATAOBJECT this, LPFORMATETC32 pformatetc) -{ FIXME (shell, "(%p)->()\n", this); +static HRESULT WINAPI IDataObject_fnQueryGetData(LPDATAOBJECT iface, LPFORMATETC32 pformatetc) +{ + ICOM_THIS(IDataObject,iface); + FIXME (shell, "(%p)->()\n", this); return E_NOTIMPL; } -static HRESULT WINAPI IDataObject_GetCanonicalFormatEtc(LPDATAOBJECT this, LPFORMATETC32 pformatectIn, LPFORMATETC32 pformatetcOut) -{ FIXME (shell, "(%p)->()\n", this); +static HRESULT WINAPI IDataObject_fnGetCanonicalFormatEtc(LPDATAOBJECT iface, LPFORMATETC32 pformatectIn, LPFORMATETC32 pformatetcOut) +{ + ICOM_THIS(IDataObject,iface); + FIXME (shell, "(%p)->()\n", this); return E_NOTIMPL; } -static HRESULT WINAPI IDataObject_SetData(LPDATAOBJECT this, LPFORMATETC32 pformatetc, STGMEDIUM32 *pmedium, BOOL32 fRelease) -{ FIXME (shell, "(%p)->()\n", this); +static HRESULT WINAPI IDataObject_fnSetData(LPDATAOBJECT iface, LPFORMATETC32 pformatetc, STGMEDIUM32 *pmedium, BOOL32 fRelease) +{ + ICOM_THIS(IDataObject,iface); + FIXME (shell, "(%p)->()\n", this); return E_NOTIMPL; } -static HRESULT WINAPI IDataObject_EnumFormatEtc(LPDATAOBJECT this, DWORD dwDirection, IEnumFORMATETC **ppenumFormatEtc) -{ FIXME (shell, "(%p)->()\n", this); +static HRESULT WINAPI IDataObject_fnEnumFormatEtc(LPDATAOBJECT iface, DWORD dwDirection, IEnumFORMATETC **ppenumFormatEtc) +{ + ICOM_THIS(IDataObject,iface); + FIXME (shell, "(%p)->()\n", this); return E_NOTIMPL; } -static HRESULT WINAPI IDataObject_DAdvise (LPDATAOBJECT this, LPFORMATETC32 *pformatetc, DWORD advf, IAdviseSink *pAdvSink, DWORD *pdwConnection) -{ FIXME (shell, "(%p)->()\n", this); +static HRESULT WINAPI IDataObject_fnDAdvise(LPDATAOBJECT iface, LPFORMATETC32 *pformatetc, DWORD advf, IAdviseSink *pAdvSink, DWORD *pdwConnection) +{ + ICOM_THIS(IDataObject,iface); + FIXME (shell, "(%p)->()\n", this); return E_NOTIMPL; } -static HRESULT WINAPI IDataObject_DUnadvise(LPDATAOBJECT this, DWORD dwConnection) -{ FIXME (shell, "(%p)->()\n", this); +static HRESULT WINAPI IDataObject_fnDUnadvise(LPDATAOBJECT iface, DWORD dwConnection) +{ + ICOM_THIS(IDataObject,iface); + FIXME (shell, "(%p)->()\n", this); return E_NOTIMPL; } -static HRESULT WINAPI IDataObject_EnumDAdvise(LPDATAOBJECT this, IEnumSTATDATA **ppenumAdvise) -{ FIXME (shell, "(%p)->()\n", this); +static HRESULT WINAPI IDataObject_fnEnumDAdvise(LPDATAOBJECT iface, IEnumSTATDATA **ppenumAdvise) +{ + ICOM_THIS(IDataObject,iface); + FIXME (shell, "(%p)->()\n", this); return E_NOTIMPL; } diff --git a/dlls/shell32/enumidlist.c b/dlls/shell32/enumidlist.c index 45cb0cf0e49..118d83940f2 100644 --- a/dlls/shell32/enumidlist.c +++ b/dlls/shell32/enumidlist.c @@ -10,9 +10,8 @@ #include "ole.h" #include "ole2.h" #include "debug.h" -#include "compobj.h" -#include "interfaces.h" #include "shlobj.h" +#include "objbase.h" #include "shell.h" #include "winerror.h" #include "winnls.h" diff --git a/dlls/shell32/folders.c b/dlls/shell32/folders.c index eb9082a3045..a3e86ed950d 100644 --- a/dlls/shell32/folders.c +++ b/dlls/shell32/folders.c @@ -10,9 +10,8 @@ #include "ole.h" #include "ole2.h" #include "debug.h" -#include "compobj.h" -#include "interfaces.h" #include "shlobj.h" +#include "objbase.h" #include "shell.h" #include "winerror.h" #include "winnls.h" diff --git a/dlls/shell32/iconcache.c b/dlls/shell32/iconcache.c index 2aae5e8d983..aad6a79f46c 100644 --- a/dlls/shell32/iconcache.c +++ b/dlls/shell32/iconcache.c @@ -741,7 +741,7 @@ HICON32 WINAPI ExtractIconEx32A ( LPSTR lpszFile, INT32 nIconIndex, HICON32 * ph if (phiconSmall) { ret = ICO_ExtractIconEx(lpszFile, phiconSmall, nIconIndex, nIcons, 16, 16 ); if ( nIcons==1 ) - { ret = phiconLarge[0]; + { ret = phiconSmall[0]; } } diff --git a/dlls/shell32/pidl.c b/dlls/shell32/pidl.c index 5819b6a701c..0f014b3ebc8 100644 --- a/dlls/shell32/pidl.c +++ b/dlls/shell32/pidl.c @@ -14,8 +14,6 @@ #include "ole.h" #include "ole2.h" #include "debug.h" -#include "compobj.h" -#include "interfaces.h" #include "shlobj.h" #include "shell.h" #include "winerror.h" @@ -556,8 +554,8 @@ LPITEMIDLIST WINAPI _ILCreateDesktop() return _ILCreate(PT_DESKTOP, NULL, 0); } LPITEMIDLIST WINAPI _ILCreateMyComputer() -{ TRACE(pidl,"()\n"); - return _ILCreate(PT_MYCOMP, (void *)"My Computer", strlen ("My Computer")+1); +{ TRACE(pidl,"()\n"); + return _ILCreate(PT_MYCOMP, (void *)"My Computer", strlen ("My Computer")+1); } LPITEMIDLIST WINAPI _ILCreateDrive( LPCSTR lpszNew) { char sTemp[4]; @@ -568,47 +566,58 @@ LPITEMIDLIST WINAPI _ILCreateDrive( LPCSTR lpszNew) return _ILCreate(PT_DRIVE,(LPVOID)&sTemp[0],4); } LPITEMIDLIST WINAPI _ILCreateFolder( LPCSTR lpszNew) -{ TRACE(pidl,"(%s)\n",lpszNew); - return _ILCreate(PT_FOLDER, (LPVOID)lpszNew, strlen(lpszNew)+1); +{ TRACE(pidl,"(%s)\n",lpszNew); + return _ILCreate(PT_FOLDER, (LPVOID)lpszNew, strlen(lpszNew)+1); } LPITEMIDLIST WINAPI _ILCreateValue(LPCSTR lpszNew) -{ TRACE(pidl,"(%s)\n",lpszNew); - return _ILCreate(PT_VALUE, (LPVOID)lpszNew, strlen(lpszNew)+1); +{ TRACE(pidl,"(%s)\n",lpszNew); + return _ILCreate(PT_VALUE, (LPVOID)lpszNew, strlen(lpszNew)+1); } /************************************************************************** * _ILGetDrive() * - * FIXME: quick hack + * Gets the text for the drive eg. 'c:\' + * + * RETURNS + * strlen (lpszText) */ -BOOL32 WINAPI _ILGetDrive(LPCITEMIDLIST pidl,LPSTR pOut, UINT16 uSize) -{ LPITEMIDLIST pidlTemp=NULL; +DWORD WINAPI _ILGetDrive(LPCITEMIDLIST pidl,LPSTR pOut, UINT16 uSize) +{ TRACE(pidl,"(%p,%p,%u)\n",pidl,pOut,uSize); - TRACE(pidl,"(%p,%p,%u)\n",pidl,pOut,uSize); if(_ILIsMyComputer(pidl)) - { pidlTemp = ILGetNext(pidl); - } - else if (pidlTemp && _ILIsDrive(pidlTemp)) - { return (BOOL32)_ILGetData(PT_DRIVE, pidlTemp, (LPVOID)pOut, uSize); - } - return FALSE; + pidl = ILGetNext(pidl); + + if (pidl && _ILIsDrive(pidl)) + return _ILGetData(PT_DRIVE, pidl, (LPVOID)pOut, uSize)-1; + + return 0; } /************************************************************************** * _ILGetItemText() - * Gets the text for only this item + * Gets the text for only the first item + * + * RETURNS + * strlen (lpszText) */ DWORD WINAPI _ILGetItemText(LPCITEMIDLIST pidl, LPSTR lpszText, UINT16 uSize) -{ TRACE(pidl,"(pidl=%p %p %x)\n",pidl,lpszText,uSize); +{ DWORD ret = 0; + + TRACE(pidl,"(pidl=%p %p %d)\n",pidl,lpszText,uSize); if (_ILIsMyComputer(pidl)) - { return _ILGetData(PT_MYCOMP, pidl, (LPVOID)lpszText, uSize); + { ret = _ILGetData(PT_MYCOMP, pidl, (LPVOID)lpszText, uSize)-1; } - if (_ILIsDrive(pidl)) - { return _ILGetData(PT_DRIVE, pidl, (LPVOID)lpszText, uSize); + else if (_ILIsDrive(pidl)) + { ret = _ILGetData(PT_DRIVE, pidl, (LPVOID)lpszText, uSize)-1; } - if (_ILIsFolder (pidl)) - { return _ILGetData(PT_FOLDER, pidl, (LPVOID)lpszText, uSize); + else if (_ILIsFolder (pidl)) + { ret = _ILGetData(PT_FOLDER, pidl, (LPVOID)lpszText, uSize)-1; } - return _ILGetData(PT_VALUE, pidl, (LPVOID)lpszText, uSize); + else if (_ILIsValue (pidl)) + { ret = _ILGetData(PT_VALUE, pidl, (LPVOID)lpszText, uSize)-1; + } + TRACE(pidl,"(-- %s)\n",debugstr_a(lpszText)); + return ret; } /************************************************************************** * _ILIsDesktop() @@ -617,82 +626,38 @@ DWORD WINAPI _ILGetItemText(LPCITEMIDLIST pidl, LPSTR lpszText, UINT16 uSize) * _ILIsValue() */ BOOL32 WINAPI _ILIsDesktop(LPCITEMIDLIST pidl) -{ TRACE(pidl,"(%p)\n",pidl); - - if (! pidl) - return TRUE; - - return ( pidl->mkid.cb == 0x00 ); +{ TRACE(pidl,"(%p)\n",pidl); + return ( !pidl || (pidl && pidl->mkid.cb == 0x00) ); } BOOL32 WINAPI _ILIsMyComputer(LPCITEMIDLIST pidl) -{ LPPIDLDATA pData; - TRACE(pidl,"(%p)\n",pidl); - - if (! pidl) - return FALSE; - - pData = _ILGetDataPointer(pidl); - return (PT_MYCOMP == pData->type); +{ TRACE(pidl,"(%p)\n",pidl); + return (pidl && PT_MYCOMP == _ILGetDataPointer(pidl)->type); } BOOL32 WINAPI _ILIsDrive(LPCITEMIDLIST pidl) -{ LPPIDLDATA pData; - TRACE(pidl,"(%p)\n",pidl); - - if (! pidl) - return FALSE; - - pData = _ILGetDataPointer(pidl); - return (PT_DRIVE == pData->type); +{ TRACE(pidl,"(%p)\n",pidl); + return (pidl && PT_DRIVE == _ILGetDataPointer(pidl)->type); } BOOL32 WINAPI _ILIsFolder(LPCITEMIDLIST pidl) -{ LPPIDLDATA pData; - TRACE(pidl,"(%p)\n",pidl); - - if (! pidl) - return FALSE; - - pData = _ILGetDataPointer(pidl); - return (PT_FOLDER == pData->type); +{ TRACE(pidl,"(%p)\n",pidl); + return (pidl && PT_FOLDER == _ILGetDataPointer(pidl)->type); } BOOL32 WINAPI _ILIsValue(LPCITEMIDLIST pidl) -{ LPPIDLDATA pData; - TRACE(pidl,"(%p)\n",pidl); - - if (! pidl) - return FALSE; - - pData = _ILGetDataPointer(pidl); - return (PT_VALUE == pData->type); -} -/************************************************************************** - * _ILHasFolders() - * fixme: quick hack - */ -BOOL32 WINAPI _ILHasFolders( LPSTR pszPath, LPCITEMIDLIST pidl) -{ BOOL32 bResult= FALSE; - WIN32_FIND_DATA32A stffile; - HANDLE32 hFile; - - TRACE(pidl,"%p %p\n", pszPath, pidl); - - hFile = FindFirstFile32A(pszPath,&stffile); - do - { if (! (stffile.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) ) - { bResult= TRUE; - } - } while( FindNextFile32A(hFile,&stffile)); - FindClose32 (hFile); - - return bResult; +{ TRACE(pidl,"(%p)\n",pidl); + return (pidl && PT_VALUE == _ILGetDataPointer(pidl)->type); } /************************************************************************** * _ILGetFolderText() - * Creates a Path string from a PIDL, filtering out the special Folders + * Creates a Path string from a PIDL, filtering out the special Folders and values + * There is no trailing backslash + * When lpszPath is NULL the needed size is returned + * + * RETURNS + * strlen(lpszPath) */ DWORD WINAPI _ILGetFolderText(LPCITEMIDLIST pidl,LPSTR lpszPath, DWORD dwSize) { LPITEMIDLIST pidlTemp; @@ -702,8 +667,7 @@ DWORD WINAPI _ILGetFolderText(LPCITEMIDLIST pidl,LPSTR lpszPath, DWORD dwSize) TRACE(pidl,"(%p path=%p)\n",pidl, lpszPath); if(!pidl) - { return 0; - } + return 0; if(_ILIsMyComputer(pidl)) { pidlTemp = ILGetNext(pidl); @@ -713,49 +677,36 @@ DWORD WINAPI _ILGetFolderText(LPCITEMIDLIST pidl,LPSTR lpszPath, DWORD dwSize) { pidlTemp = (LPITEMIDLIST)pidl; } - /*if this is NULL, return the required size of the buffer */ - if(!lpszPath) - { while(pidlTemp->mkid.cb) - { LPPIDLDATA pData = _ILGetDataPointer(pidlTemp); - pText = _ILGetTextPointer(pData->type,pData); - - /*add the length of this item plus one for the backslash - fixme: is one to much, drive has its own backslash*/ - dwCopied += strlen(pText) + 1; - pidlTemp = ILGetNext(pidlTemp); - } - - /*add one for the NULL terminator */ - TRACE(pidl,"-- (size=%lu)\n",dwCopied); - return dwCopied + 1; - } - - *lpszPath = 0; + if(lpszPath) + *lpszPath = 0; - while(pidlTemp->mkid.cb && (dwCopied < dwSize)) + while(pidlTemp->mkid.cb) { LPPIDLDATA pData = _ILGetDataPointer(pidlTemp); /*if this item is a value, then skip it and finish */ if(PT_VALUE == pData->type) { break; } - pText = _ILGetTextPointer(pData->type,pData); - strcat(lpszPath, pText); - PathAddBackslash32A(lpszPath); - dwCopied += strlen(pText) + 1; - pidlTemp = ILGetNext(pidlTemp); - - TRACE(pidl,"-- (size=%lu,%s)\n",dwCopied,lpszPath); - } - /*remove the last backslash if necessary */ - if(dwCopied) - { if(*(lpszPath + strlen(lpszPath) - 1) == '\\') - { *(lpszPath + strlen(lpszPath) - 1) = 0; - dwCopied--; + pText = _ILGetTextPointer(pData->type,pData); + pidlTemp = ILGetNext(pidlTemp); + dwCopied += strlen(pText); + + if (lpszPath) + { strcat(lpszPath, pText); + if (pidlTemp && lpszPath[dwCopied-1]!='\\') + { lpszPath[dwCopied] = '\\'; + lpszPath[dwCopied+1] = '\0'; + dwCopied++; + } + } + else /* only length */ + { if (pidlTemp && !_ILIsDrive (pidlTemp)) /* backslash between elements */ + dwCopied++; } } - TRACE(pidl,"-- (path=%s)\n",lpszPath); + + TRACE(pidl,"-- (size=%lu path=%s)\n",dwCopied, debugstr_a(lpszPath)); return dwCopied; } @@ -764,8 +715,7 @@ DWORD WINAPI _ILGetFolderText(LPCITEMIDLIST pidl,LPSTR lpszPath, DWORD dwSize) * _ILGetValueText() * Gets the text for the last item in the list */ -DWORD WINAPI _ILGetValueText( - LPCITEMIDLIST pidl, LPSTR lpszValue, DWORD dwSize) +DWORD WINAPI _ILGetValueText(LPCITEMIDLIST pidl, LPSTR lpszValue, DWORD dwSize) { LPITEMIDLIST pidlTemp=pidl; CHAR szText[MAX_PATH]; @@ -786,99 +736,53 @@ DWORD WINAPI _ILGetValueText( _ILGetItemText( pidlTemp, szText, sizeof(szText)); if(!lpszValue) - { return strlen(szText) + 1; + { return strlen(szText); } + strcpy(lpszValue, szText); + TRACE(pidl,"-- (pidl=%p %p=%s 0x%08lx)\n",pidl,lpszValue,lpszValue,dwSize); return strlen(lpszValue); } -/************************************************************************** - * _ILGetDataText() - * NOTES - * used from ShellView - */ -DWORD WINAPI _ILGetDataText( LPCITEMIDLIST pidlPath, LPCITEMIDLIST pidlValue, LPSTR lpszOut, DWORD dwOutSize) -{ LPSTR lpszFolder, - lpszValueName; - DWORD dwNameSize; - - FIXME(pidl,"(pidl=%p pidl=%p) stub\n",pidlPath,pidlValue); - - if(!lpszOut || !pidlPath || !pidlValue) - { return FALSE; - } - - /* fixme: get the driveletter*/ - - /*assemble the Folder string */ - dwNameSize = _ILGetFolderText(pidlPath, NULL, 0); - lpszFolder = (LPSTR)HeapAlloc(GetProcessHeap(),0,dwNameSize); - if(!lpszFolder) - { return FALSE; - } - _ILGetFolderText(pidlPath, lpszFolder, dwNameSize); - - /*assemble the value name */ - dwNameSize = _ILGetValueText(pidlValue, NULL, 0); - lpszValueName = (LPSTR)HeapAlloc(GetProcessHeap(),0,dwNameSize); - if(!lpszValueName) - { HeapFree(GetProcessHeap(),0,lpszFolder); - return FALSE; - } - _ILGetValueText(pidlValue, lpszValueName, dwNameSize); - - /* fixme: we've got the path now do something with it*/ - - HeapFree(GetProcessHeap(),0,lpszFolder); - HeapFree(GetProcessHeap(),0,lpszValueName); - - TRACE(pidl,"-- (%p=%s 0x%08lx)\n",lpszOut,lpszOut,dwOutSize); - - return TRUE; -} /************************************************************************** * _ILGetPidlPath() * Create a string that includes the Drive name, the folder text and * the value text. + * + * RETURNS + * strlen(lpszOut) */ DWORD WINAPI _ILGetPidlPath( LPCITEMIDLIST pidl, LPSTR lpszOut, DWORD dwOutSize) -{ LPSTR lpszTemp; - WORD len; +{ WORD len = 0; - TRACE(pidl,"(%p,%lu)\n",lpszOut,dwOutSize); + TRACE(pidl,"(%p,%lu)\n",lpszOut,dwOutSize); - if(!lpszOut) - { return 0; + if(!lpszOut) + { return 0; } - *lpszOut = 0; - lpszTemp = lpszOut; + *lpszOut = 0; - dwOutSize -= _ILGetFolderText(pidl, lpszTemp, dwOutSize); + len = _ILGetFolderText(pidl, lpszOut, dwOutSize); - /*add a backslash if necessary */ - len = strlen(lpszTemp); - if (len && lpszTemp[len-1]!='\\') - { lpszTemp[len+0]='\\'; - lpszTemp[len+1]='\0'; - dwOutSize--; - } + lpszOut += len; + strcpy (lpszOut,"\\"); + lpszOut++; - lpszTemp = lpszOut + strlen(lpszOut); + dwOutSize -= len+1;; - /*add the value string */ - _ILGetValueText(pidl, lpszTemp, dwOutSize); + len += _ILGetValueText(pidl, lpszOut, dwOutSize ); - /*remove the last backslash if necessary */ - if(*(lpszOut + strlen(lpszOut) - 1) == '\\') - { *(lpszOut + strlen(lpszOut) - 1) = 0; - } - - TRACE(pidl,"-- (%p=%s,%lu)\n",lpszOut,lpszOut,dwOutSize); + /*remove the last backslash if necessary */ + if( lpszOut[len-1]=='\\') + { lpszOut[len-1] = 0; + len--; + } - return strlen(lpszOut); + TRACE(pidl,"-- (%p=%s,%lu)\n",lpszOut,lpszOut,dwOutSize); + return len; } /************************************************************************** @@ -886,7 +790,7 @@ DWORD WINAPI _ILGetPidlPath( LPCITEMIDLIST pidl, LPSTR lpszOut, DWORD dwOutSize) * Creates a new PIDL * type = PT_DESKTOP | PT_DRIVE | PT_FOLDER | PT_VALUE * pIn = data - * uInSize = size of data + * uInSize = size of data (raw) */ LPITEMIDLIST WINAPI _ILCreate(PIDLTYPE type, LPVOID pIn, UINT16 uInSize) @@ -950,6 +854,9 @@ LPITEMIDLIST WINAPI _ILCreate(PIDLTYPE type, LPVOID pIn, UINT16 uInSize) } /************************************************************************** * _ILGetData(PIDLTYPE, LPCITEMIDLIST, LPVOID, UINT16) + * + * RETURNS + * length of data (raw) */ DWORD WINAPI _ILGetData(PIDLTYPE type, LPCITEMIDLIST pidl, LPVOID pOut, UINT32 uOutSize) { LPPIDLDATA pData; @@ -976,20 +883,20 @@ DWORD WINAPI _ILGetData(PIDLTYPE type, LPCITEMIDLIST pidl, LPVOID pOut, UINT32 u if(uOutSize < 1) return 0; strncpy((LPSTR)pOut, "My Computer", uOutSize); - dwReturn = strlen((LPSTR)pOut); + dwReturn = strlen((LPSTR)pOut)+1; break; case PT_DRIVE: if(uOutSize < 1) return 0; strncpy((LPSTR)pOut, pszSrc, uOutSize); - dwReturn = strlen((LPSTR)pOut); + dwReturn = strlen((LPSTR)pOut)+1; break; case PT_FOLDER: case PT_VALUE: strncpy((LPSTR)pOut, pszSrc, uOutSize); - dwReturn = strlen((LPSTR)pOut); + dwReturn = strlen((LPSTR)pOut)+1; break; default: ERR(pidl,"-- unknown type\n"); diff --git a/dlls/shell32/pidl.h b/dlls/shell32/pidl.h index 4ef48917636..d2cf699494e 100644 --- a/dlls/shell32/pidl.h +++ b/dlls/shell32/pidl.h @@ -22,7 +22,7 @@ * * a pidl of NULL means the desktop * -* The structure of the pidl seens to be a union. The first byte of the +* The structure of the pidl seems to be a union. The first byte of the * PIDLDATA desribes the type of pidl. * * first byte - my Computer 0x1F @@ -35,67 +35,92 @@ * file: see the PIDLDATA structure */ -#define PT_DESKTOP 0x00 /*fixme*/ +#define PT_DESKTOP 0x00 /* internal */ #define PT_MYCOMP 0x1F #define PT_SPECIAL 0x2E #define PT_DRIVE 0x23 #define PT_FOLDER 0x31 -#define PT_VALUE 0x33 /*fixme*/ +#define PT_VALUE 0x32 #pragma pack(1) typedef BYTE PIDLTYPE; typedef struct tagPIDLDATA -{ PIDLTYPE type; +{ PIDLTYPE type; /*00*/ union { struct - { CHAR szDriveName[4]; + { CHAR szDriveName[4]; /*01*/ /* end of MS compatible*/ - DWORD dwSFGAO; + DWORD dwSFGAO; /*05*/ + /* the drive seems to be 19 bytes every time */ } drive; struct - { BYTE dummy; - DWORD dwFileSize; - WORD uFileDate; - WORD uFileTime; - WORD uFileAttribs; - /* end of MS compatible*/ - DWORD dwSFGAO; + { BYTE dummy; /*01 is 0x00 for files or dirs */ + DWORD dwFileSize; /*02*/ + WORD uFileDate; /*06*/ + WORD uFileTime; /*08*/ + WORD uFileAttribs; /*10*/ + /* end of MS compatible. Here are comming just one or two + strings. The first is the long name. The second the dos name + when needed. */ + DWORD dwSFGAO; /*12*/ CHAR szAlternateName[14]; /* the 8.3 Name*/ - CHAR szText[1]; /* last entry, variable size */ + CHAR szText[1]; /* last entry, variable size */ } file, folder, generic; }u; } PIDLDATA, *LPPIDLDATA; #pragma pack(4) -LPITEMIDLIST WINAPI _ILCreateDesktop(void); -LPITEMIDLIST WINAPI _ILCreateMyComputer(void); -LPITEMIDLIST WINAPI _ILCreateDrive(LPCSTR); -LPITEMIDLIST WINAPI _ILCreateFolder(LPCSTR); -LPITEMIDLIST WINAPI _ILCreateValue(LPCSTR); -LPITEMIDLIST WINAPI _ILCreate(PIDLTYPE,LPVOID,UINT16); - -BOOL32 WINAPI _ILGetDrive(LPCITEMIDLIST,LPSTR,UINT16); +/* + * getting string values from pidls + * + * return value is strlen() + */ +DWORD WINAPI _ILGetDrive(LPCITEMIDLIST,LPSTR,UINT16); DWORD WINAPI _ILGetItemText(LPCITEMIDLIST,LPSTR,UINT16); DWORD WINAPI _ILGetFolderText(LPCITEMIDLIST,LPSTR,DWORD); DWORD WINAPI _ILGetValueText(LPCITEMIDLIST,LPSTR,DWORD); -DWORD WINAPI _ILGetDataText(LPCITEMIDLIST,LPCITEMIDLIST,LPSTR,DWORD); DWORD WINAPI _ILGetPidlPath(LPCITEMIDLIST,LPSTR,DWORD); -DWORD WINAPI _ILGetData(PIDLTYPE,LPCITEMIDLIST,LPVOID,UINT32); +/* + * getting special values from simple pidls + */ +BOOL32 WINAPI _ILGetFileDate (LPCITEMIDLIST pidl, LPSTR pOut, UINT32 uOutSize); +BOOL32 WINAPI _ILGetFileSize (LPCITEMIDLIST pidl, LPSTR pOut, UINT32 uOutSize); +BOOL32 WINAPI _ILGetExtension (LPCITEMIDLIST pidl, LPSTR pOut, UINT32 uOutSize); + + +/* + * testing simple pidls + */ BOOL32 WINAPI _ILIsDesktop(LPCITEMIDLIST); BOOL32 WINAPI _ILIsMyComputer(LPCITEMIDLIST); BOOL32 WINAPI _ILIsDrive(LPCITEMIDLIST); BOOL32 WINAPI _ILIsFolder(LPCITEMIDLIST); BOOL32 WINAPI _ILIsValue(LPCITEMIDLIST); -BOOL32 WINAPI _ILHasFolders(LPSTR,LPCITEMIDLIST); +/* + * simple pidls from strings + */ +LPITEMIDLIST WINAPI _ILCreateDesktop(void); +LPITEMIDLIST WINAPI _ILCreateMyComputer(void); +LPITEMIDLIST WINAPI _ILCreateDrive(LPCSTR); +LPITEMIDLIST WINAPI _ILCreateFolder(LPCSTR); +LPITEMIDLIST WINAPI _ILCreateValue(LPCSTR); +/* + * raw pidl handling (binary) + * + * data is binary / sizes are bytes + */ +DWORD WINAPI _ILGetData(PIDLTYPE,LPCITEMIDLIST,LPVOID,UINT32); +LPITEMIDLIST WINAPI _ILCreate(PIDLTYPE,LPVOID,UINT16); + +/* + * helper functions (getting struct-pointer) + */ LPPIDLDATA WINAPI _ILGetDataPointer(LPCITEMIDLIST); LPSTR WINAPI _ILGetTextPointer(PIDLTYPE type, LPPIDLDATA pidldata); -BOOL32 WINAPI _ILGetFileDate (LPCITEMIDLIST pidl, LPSTR pOut, UINT32 uOutSize); -BOOL32 WINAPI _ILGetFileSize (LPCITEMIDLIST pidl, LPSTR pOut, UINT32 uOutSize); -BOOL32 WINAPI _ILGetExtension (LPCITEMIDLIST pidl, LPSTR pOut, UINT32 uOutSize); void pdump (LPCITEMIDLIST pidl); #endif diff --git a/dlls/shell32/shell32_main.c b/dlls/shell32/shell32_main.c index 5acf03c8e11..78ca810f129 100644 --- a/dlls/shell32/shell32_main.c +++ b/dlls/shell32/shell32_main.c @@ -21,7 +21,6 @@ #include "dlgs.h" #include "win.h" #include "cursoricon.h" -#include "interfaces.h" #include "sysmetrics.h" #include "shlobj.h" #include "debug.h" @@ -382,30 +381,29 @@ DWORD WINAPI SHGetDesktopFolder(LPSHELLFOLDER *shellfolder) LPCLASSFACTORY lpclf; TRACE(shell,"%p->(%p)\n",shellfolder,*shellfolder); - if (pdesktopfolder) - { hres = NOERROR; - } - else - { lpclf = IClassFactory_Constructor(); + if (pdesktopfolder) { + hres = NOERROR; + } else { + lpclf = IClassFactory_Constructor(); /* fixme: the buildin IClassFactory_Constructor is at the moment only for rclsid=CLSID_ShellDesktop, so we get the right Interface (jsch)*/ - if(lpclf) - { hres = lpclf->lpvtbl->fnCreateInstance(lpclf,NULL,(REFIID)&IID_IShellFolder, (void*)&pdesktopfolder); - lpclf->lpvtbl->fnRelease(lpclf); + if(lpclf) { + hres = IClassFactory_CreateInstance(lpclf,NULL,(REFIID)&IID_IShellFolder, (void*)&pdesktopfolder); + IClassFactory_Release(lpclf); } } - if (pdesktopfolder) - { *shellfolder = pdesktopfolder; + if (pdesktopfolder) { + *shellfolder = pdesktopfolder; pdesktopfolder->lpvtbl->fnAddRef(pdesktopfolder); + } else { + *shellfolder=NULL; } - else - { *shellfolder=NULL; - } TRACE(shell,"-- %p->(%p)\n",shellfolder, *shellfolder); return hres; } + /************************************************************************* * SHGetPathFromIDList [SHELL32.221][NT 4.0: SHELL32.219] */ @@ -962,7 +960,7 @@ DWORD WINAPI SHGetPathFromIDList32W (LPCITEMIDLIST pidl,LPWSTR pszPath) } -void (CALLBACK* pDLLInitComctl)(void); +void (CALLBACK* pDLLInitComctl)(LPVOID); INT32 (CALLBACK* pImageList_AddIcon) (HIMAGELIST himl, HICON32 hIcon); INT32 (CALLBACK* pImageList_ReplaceIcon) (HIMAGELIST, INT32, HICON32); HIMAGELIST (CALLBACK * pImageList_Create) (INT32,INT32,UINT32,INT32,INT32); @@ -1000,7 +998,7 @@ BOOL32 WINAPI Shell32LibMain(HINSTANCE32 hinstDLL, DWORD fdwReason, LPVOID lpvRe if (hComctl32) { pDLLInitComctl=GetProcAddress32(hComctl32,"InitCommonControlsEx"); if (pDLLInitComctl) - { pDLLInitComctl(); + { pDLLInitComctl(NULL); } pImageList_Create=GetProcAddress32(hComctl32,"ImageList_Create"); pImageList_AddIcon=GetProcAddress32(hComctl32,"ImageList_AddIcon"); diff --git a/dlls/shell32/shell32_main.h b/dlls/shell32/shell32_main.h index 280e2694deb..ff64d054900 100644 --- a/dlls/shell32/shell32_main.h +++ b/dlls/shell32/shell32_main.h @@ -16,7 +16,7 @@ extern HIMAGELIST ShellBigIconList; /******************************************* * pointer to functions dynamically loaded */ -extern void (CALLBACK* pDLLInitComctl)(void); +extern void (CALLBACK* pDLLInitComctl)(LPVOID); extern INT32 (CALLBACK* pImageList_AddIcon) (HIMAGELIST himl, HICON32 hIcon); extern INT32 (CALLBACK* pImageList_ReplaceIcon) (HIMAGELIST, INT32, HICON32); extern HIMAGELIST (CALLBACK* pImageList_Create) (INT32,INT32,UINT32,INT32,INT32); diff --git a/dlls/shell32/shelllink.c b/dlls/shell32/shelllink.c index cb2fcae3b43..ddba978660f 100644 --- a/dlls/shell32/shelllink.c +++ b/dlls/shell32/shelllink.c @@ -11,9 +11,9 @@ #include "ole.h" #include "ole2.h" #include "debug.h" -#include "compobj.h" -#include "interfaces.h" -#include "shlobj.h" +#include "objbase.h" +#include "wine/obj_base.h" +#include "wine/obj_storage.h" #include "shell.h" #include "winerror.h" #include "winnls.h" @@ -24,48 +24,38 @@ #include "shell32_main.h" /* IPersistFile Implementation */ -static HRESULT WINAPI IPersistFile_QueryInterface(LPPERSISTFILE this, REFIID riid, LPVOID * ppvObj); -static ULONG WINAPI IPersistFile_AddRef(LPPERSISTFILE this); -static ULONG WINAPI IPersistFile_Release(LPPERSISTFILE this); - -static HRESULT WINAPI IPersistFile_GetClassID (LPPERSISTFILE this, CLSID *pClassID); -static HRESULT WINAPI IPersistFile_IsDirty (LPPERSISTFILE this); -static HRESULT WINAPI IPersistFile_Load (LPPERSISTFILE this, LPCOLESTR32 pszFileName, DWORD dwMode); -static HRESULT WINAPI IPersistFile_Save (LPPERSISTFILE this, LPCOLESTR32 pszFileName, BOOL32 fRemember); -static HRESULT WINAPI IPersistFile_SaveCompleted (LPPERSISTFILE this, LPCOLESTR32 pszFileName); -static HRESULT WINAPI IPersistFile_GetCurFile (LPPERSISTFILE this, LPOLESTR32 *ppszFileName); - -static struct IPersistFile_VTable pfvt = -{ IPersistFile_QueryInterface, - IPersistFile_AddRef, - IPersistFile_Release, - IPersistFile_GetClassID, - IPersistFile_IsDirty, - IPersistFile_Load, - IPersistFile_Save, - IPersistFile_SaveCompleted, - IPersistFile_GetCurFile -}; +typedef struct _IPersistFile { + /* IUnknown fields */ + ICOM_VTABLE(IPersistFile)* lpvtbl; + DWORD ref; +} _IPersistFile; + +static struct ICOM_VTABLE(IPersistFile) pfvt; + + /************************************************************************** * IPersistFile_Constructor */ LPPERSISTFILE IPersistFile_Constructor(void) -{ LPPERSISTFILE sl; +{ + _IPersistFile* sl; - sl = (LPPERSISTFILE)HeapAlloc(GetProcessHeap(),0,sizeof(IPersistFile)); + sl = (_IPersistFile*)HeapAlloc(GetProcessHeap(),0,sizeof(_IPersistFile)); sl->ref = 1; sl->lpvtbl = &pfvt; TRACE(shell,"(%p)->()\n",sl); - return sl; + return (LPPERSISTFILE)sl; } /************************************************************************** * IPersistFile_QueryInterface */ -static HRESULT WINAPI IPersistFile_QueryInterface( - LPPERSISTFILE this, REFIID riid, LPVOID *ppvObj) -{ char xriid[50]; +static HRESULT WINAPI IPersistFile_fnQueryInterface( + LPUNKNOWN iface, REFIID riid, LPVOID *ppvObj) +{ + ICOM_THIS(IPersistFile,iface); + char xriid[50]; WINE_StringFromCLSID((LPCLSID)riid,xriid); TRACE(shell,"(%p)->(\n\tIID:\t%s)\n",this,xriid); @@ -79,7 +69,7 @@ static HRESULT WINAPI IPersistFile_QueryInterface( } if(*ppvObj) - { (*(LPPERSISTFILE*)ppvObj)->lpvtbl->fnAddRef(this); + { IPersistFile_AddRef((IPersistFile*)*ppvObj); TRACE(shell,"-- Interface: (%p)->(%p)\n",ppvObj,*ppvObj); return S_OK; } @@ -89,15 +79,19 @@ static HRESULT WINAPI IPersistFile_QueryInterface( /****************************************************************************** * IPersistFile_AddRef */ -static ULONG WINAPI IPersistFile_AddRef(LPPERSISTFILE this) -{ TRACE(shell,"(%p)->(count=%lu)\n",this,this->ref); +static ULONG WINAPI IPersistFile_fnAddRef(LPUNKNOWN iface) +{ + ICOM_THIS(IPersistFile,iface); + TRACE(shell,"(%p)->(count=%lu)\n",this,this->ref); return ++(this->ref); } /****************************************************************************** * IPersistFile_Release */ -static ULONG WINAPI IPersistFile_Release(LPPERSISTFILE this) -{ TRACE(shell,"(%p)->(count=%lu)\n",this,this->ref); +static ULONG WINAPI IPersistFile_fnRelease(LPUNKNOWN iface) +{ + ICOM_THIS(IPersistFile,iface); + TRACE(shell,"(%p)->(count=%lu)\n",this,this->ref); if (!--(this->ref)) { TRACE(shell,"-- destroying IPersistFile(%p)\n",this); HeapFree(GetProcessHeap(),0,this); @@ -106,70 +100,89 @@ static ULONG WINAPI IPersistFile_Release(LPPERSISTFILE this) return this->ref; } -static HRESULT WINAPI IPersistFile_GetClassID (LPPERSISTFILE this, CLSID *pClassID) -{ FIXME(shell,"(%p)\n",this); +static HRESULT WINAPI IPersistFile_fnGetClassID(const IPersist* iface, CLSID *pClassID) +{ + ICOM_CTHIS(IPersistFile,iface); + FIXME(shell,"(%p)\n",this); return NOERROR; } -static HRESULT WINAPI IPersistFile_IsDirty (LPPERSISTFILE this) -{ FIXME(shell,"(%p)\n",this); +static HRESULT WINAPI IPersistFile_fnIsDirty(const IPersistFile* iface) +{ + ICOM_CTHIS(IPersistFile,iface); + FIXME(shell,"(%p)\n",this); return NOERROR; } -static HRESULT WINAPI IPersistFile_Load (LPPERSISTFILE this, LPCOLESTR32 pszFileName, DWORD dwMode) -{ FIXME(shell,"(%p)->(%s)\n",this,debugstr_w(pszFileName)); +static HRESULT WINAPI IPersistFile_fnLoad(LPPERSISTFILE iface, LPCOLESTR32 pszFileName, DWORD dwMode) +{ + ICOM_THIS(IPersistFile,iface); + FIXME(shell,"(%p)->(%s)\n",this,debugstr_w(pszFileName)); return E_FAIL; } -static HRESULT WINAPI IPersistFile_Save (LPPERSISTFILE this, LPCOLESTR32 pszFileName, BOOL32 fRemember) -{ FIXME(shell,"(%p)->(%s)\n",this,debugstr_w(pszFileName)); - return NOERROR; -} -static HRESULT WINAPI IPersistFile_SaveCompleted (LPPERSISTFILE this, LPCOLESTR32 pszFileName) -{ FIXME(shell,"(%p)->(%s)\n",this,debugstr_w(pszFileName)); - return NOERROR; -} -static HRESULT WINAPI IPersistFile_GetCurFile (LPPERSISTFILE this, LPOLESTR32 *ppszFileName) -{ FIXME(shell,"(%p)\n",this); - return NOERROR; -} +static HRESULT WINAPI IPersistFile_fnSave(LPPERSISTFILE iface, LPCOLESTR32 pszFileName, BOOL32 fRemember) +{ + ICOM_THIS(IPersistFile,iface); + FIXME(shell,"(%p)->(%s)\n",this,debugstr_w(pszFileName)); + return NOERROR; +} +static HRESULT WINAPI IPersistFile_fnSaveCompleted(LPPERSISTFILE iface, LPCOLESTR32 pszFileName) +{ + ICOM_THIS(IPersistFile,iface); + FIXME(shell,"(%p)->(%s)\n",this,debugstr_w(pszFileName)); + return NOERROR; +} +static HRESULT WINAPI IPersistFile_fnGetCurFile(const IPersistFile* iface, LPOLESTR32 *ppszFileName) +{ + ICOM_CTHIS(IPersistFile,iface); + FIXME(shell,"(%p)\n",this); + return NOERROR; +} + +static struct ICOM_VTABLE(IPersistFile) pfvt = +{ + { + { + IPersistFile_fnQueryInterface, + IPersistFile_fnAddRef, + IPersistFile_fnRelease + }, + IPersistFile_fnGetClassID + }, + IPersistFile_fnIsDirty, + IPersistFile_fnLoad, + IPersistFile_fnSave, + IPersistFile_fnSaveCompleted, + IPersistFile_fnGetCurFile +}; /************************************************************************** -* IClassFactory Implementation -*/ -static HRESULT WINAPI IShellLink_CF_QueryInterface(LPCLASSFACTORY,REFIID,LPVOID*); -static ULONG WINAPI IShellLink_CF_AddRef(LPCLASSFACTORY); -static ULONG WINAPI IShellLink_CF_Release(LPCLASSFACTORY); -static HRESULT WINAPI IShellLink_CF_CreateInstance(LPCLASSFACTORY, LPUNKNOWN, REFIID, LPVOID *); -static HRESULT WINAPI IShellLink_CF_LockServer(LPCLASSFACTORY, BOOL32); -/************************************************************************** - * IShellLink_CF_VTable +* IShellLink's IClassFactory implementation */ -static IClassFactory_VTable slcfvt = -{ IShellLink_CF_QueryInterface, - IShellLink_CF_AddRef, - IShellLink_CF_Release, - IShellLink_CF_CreateInstance, - IShellLink_CF_LockServer -}; + +static ICOM_VTABLE(IClassFactory) slcfvt; /************************************************************************** * IShellLink_CF_Constructor */ LPCLASSFACTORY IShellLink_CF_Constructor(void) -{ LPCLASSFACTORY lpclf; +{ + _IClassFactory* lpclf; - lpclf= (LPCLASSFACTORY)HeapAlloc(GetProcessHeap(),0,sizeof(IClassFactory)); + lpclf= (_IClassFactory*)HeapAlloc(GetProcessHeap(),0,sizeof(_IClassFactory)); lpclf->ref = 1; lpclf->lpvtbl = &slcfvt; TRACE(shell,"(%p)->()\n",lpclf); - return lpclf; + return (LPCLASSFACTORY)lpclf; } /************************************************************************** * IShellLink_CF_QueryInterface */ static HRESULT WINAPI IShellLink_CF_QueryInterface( - LPCLASSFACTORY this, REFIID riid, LPVOID *ppvObj) -{ char xriid[50]; + LPUNKNOWN iface, REFIID riid, LPVOID *ppvObj) +{ + ICOM_THIS(IClassFactory,iface); + char xriid[50]; WINE_StringFromCLSID((LPCLSID)riid,xriid); TRACE(shell,"(%p)->(\n\tIID:\t%s)\n",this,xriid); @@ -183,7 +196,7 @@ static HRESULT WINAPI IShellLink_CF_QueryInterface( } if(*ppvObj) - { (*(LPCLASSFACTORY*)ppvObj)->lpvtbl->fnAddRef(this); + { IUnknown_AddRef((IUnknown*)*ppvObj); TRACE(shell,"-- Interface: (%p)->(%p)\n",ppvObj,*ppvObj); return S_OK; } @@ -193,15 +206,19 @@ static HRESULT WINAPI IShellLink_CF_QueryInterface( /****************************************************************************** * IShellLink_CF_AddRef */ -static ULONG WINAPI IShellLink_CF_AddRef(LPCLASSFACTORY this) -{ TRACE(shell,"(%p)->(count=%lu)\n",this,this->ref); +static ULONG WINAPI IShellLink_CF_AddRef(LPUNKNOWN iface) +{ + ICOM_THIS(IClassFactory,iface); + TRACE(shell,"(%p)->(count=%lu)\n",this,this->ref); return ++(this->ref); } /****************************************************************************** * IShellLink_CF_Release */ -static ULONG WINAPI IShellLink_CF_Release(LPCLASSFACTORY this) -{ TRACE(shell,"(%p)->(count=%lu)\n",this,this->ref); +static ULONG WINAPI IShellLink_CF_Release(LPUNKNOWN iface) +{ + ICOM_THIS(IClassFactory,iface); + TRACE(shell,"(%p)->(count=%lu)\n",this,this->ref); if (!--(this->ref)) { TRACE(shell,"-- destroying IClassFactory(%p)\n",this); HeapFree(GetProcessHeap(),0,this); @@ -213,8 +230,10 @@ static ULONG WINAPI IShellLink_CF_Release(LPCLASSFACTORY this) * IShellLink_CF_CreateInstance */ static HRESULT WINAPI IShellLink_CF_CreateInstance( - LPCLASSFACTORY this, LPUNKNOWN pUnknown, REFIID riid, LPVOID *ppObject) -{ IUnknown *pObj = NULL; + LPCLASSFACTORY iface, LPUNKNOWN pUnknown, REFIID riid, LPVOID *ppObject) +{ + ICOM_THIS(IClassFactory,iface); + IUnknown *pObj = NULL; HRESULT hres; char xriid[50]; @@ -239,8 +258,8 @@ static HRESULT WINAPI IShellLink_CF_CreateInstance( { return(E_OUTOFMEMORY); } - hres = pObj->lpvtbl->fnQueryInterface(pObj,riid, ppObject); - pObj->lpvtbl->fnRelease(pObj); + hres = IUnknown_QueryInterface(pObj,riid, ppObject); + IUnknown_Release(pObj); TRACE(shell,"-- Object created: (%p)->%p\n",this,*ppObject); return hres; @@ -248,10 +267,22 @@ static HRESULT WINAPI IShellLink_CF_CreateInstance( /****************************************************************************** * IShellLink_CF_LockServer */ -static HRESULT WINAPI IShellLink_CF_LockServer(LPCLASSFACTORY this, BOOL32 fLock) -{ TRACE(shell,"%p->(0x%x), not implemented\n",this, fLock); +static HRESULT WINAPI IShellLink_CF_LockServer(LPCLASSFACTORY iface, BOOL32 fLock) +{ + ICOM_THIS(IClassFactory,iface); + TRACE(shell,"%p->(0x%x), not implemented\n",this, fLock); return E_NOTIMPL; } +static ICOM_VTABLE(IClassFactory) slcfvt = +{ + { + IShellLink_CF_QueryInterface, + IShellLink_CF_AddRef, + IShellLink_CF_Release + }, + IShellLink_CF_CreateInstance, + IShellLink_CF_LockServer +}; /* IShellLink Implementation */ static HRESULT WINAPI IShellLink_QueryInterface(LPSHELLLINK,REFIID,LPVOID*); @@ -280,6 +311,7 @@ static HRESULT WINAPI IShellLink_SetPath(LPSHELLLINK, LPCSTR); * IShellLink Implementation */ + static struct IShellLink_VTable slvt = { IShellLink_QueryInterface, IShellLink_AddRef, @@ -363,7 +395,7 @@ static ULONG WINAPI IShellLink_Release(LPSHELLLINK this) { TRACE(shell,"(%p)->(count=%lu)\n",this,this->ref); if (!--(this->ref)) { TRACE(shell,"-- destroying IShellLink(%p)\n",this); - this->lppf->lpvtbl->fnRelease(this->lppf); /* IPersistFile*/ + IPersistFile_Release(this->lppf); /* IPersistFile*/ HeapFree(GetProcessHeap(),0,this); return 0; } @@ -453,43 +485,33 @@ static HRESULT WINAPI IShellLink_SetPath(LPSHELLLINK this, LPCSTR pszFile) } /************************************************************************** -* IClassFactory for IShellLinkW +* IShellLink's IClassFactory implementation */ -static HRESULT WINAPI IShellLinkW_CF_QueryInterface(LPCLASSFACTORY,REFIID,LPVOID*); -static ULONG WINAPI IShellLinkW_CF_AddRef(LPCLASSFACTORY); -static ULONG WINAPI IShellLinkW_CF_Release(LPCLASSFACTORY); -static HRESULT WINAPI IShellLinkW_CF_CreateInstance(LPCLASSFACTORY, LPUNKNOWN, REFIID, LPVOID *); -static HRESULT WINAPI IShellLinkW_CF_LockServer(LPCLASSFACTORY, BOOL32); -/************************************************************************** - * IShellLinkW_CF_VTable - */ -static IClassFactory_VTable slwcfvt = -{ IShellLinkW_CF_QueryInterface, - IShellLinkW_CF_AddRef, - IShellLinkW_CF_Release, - IShellLinkW_CF_CreateInstance, - IShellLinkW_CF_LockServer -}; + +static ICOM_VTABLE(IClassFactory) slwcfvt; /************************************************************************** * IShellLinkW_CF_Constructor */ LPCLASSFACTORY IShellLinkW_CF_Constructor(void) -{ LPCLASSFACTORY lpclf; +{ + _IClassFactory* lpclf; - lpclf= (LPCLASSFACTORY)HeapAlloc(GetProcessHeap(),0,sizeof(IClassFactory)); + lpclf= (_IClassFactory*)HeapAlloc(GetProcessHeap(),0,sizeof(_IClassFactory)); lpclf->ref = 1; lpclf->lpvtbl = &slwcfvt; TRACE(shell,"(%p)->()\n",lpclf); - return lpclf; + return (LPCLASSFACTORY)lpclf; } /************************************************************************** * IShellLinkW_CF_QueryInterface */ static HRESULT WINAPI IShellLinkW_CF_QueryInterface( - LPCLASSFACTORY this, REFIID riid, LPVOID *ppvObj) -{ char xriid[50]; + LPUNKNOWN iface, REFIID riid, LPVOID *ppvObj) +{ + ICOM_THIS(IClassFactory,iface); + char xriid[50]; WINE_StringFromCLSID((LPCLSID)riid,xriid); TRACE(shell,"(%p)->(\n\tIID:\t%s)\n",this,xriid); @@ -502,8 +524,8 @@ static HRESULT WINAPI IShellLinkW_CF_QueryInterface( { *ppvObj = (LPCLASSFACTORY)this; } - if(*ppvObj) - { (*(LPCLASSFACTORY*)ppvObj)->lpvtbl->fnAddRef(this); + if(*ppvObj) { + IUnknown_AddRef((IUnknown*)*ppvObj); TRACE(shell,"-- Interface: (%p)->(%p)\n",ppvObj,*ppvObj); return S_OK; } @@ -513,15 +535,19 @@ static HRESULT WINAPI IShellLinkW_CF_QueryInterface( /****************************************************************************** * IShellLinkW_CF_AddRef */ -static ULONG WINAPI IShellLinkW_CF_AddRef(LPCLASSFACTORY this) -{ TRACE(shell,"(%p)->(count=%lu)\n",this,this->ref); +static ULONG WINAPI IShellLinkW_CF_AddRef(LPUNKNOWN iface) +{ + ICOM_THIS(IClassFactory,iface); + TRACE(shell,"(%p)->(count=%lu)\n",this,this->ref); return ++(this->ref); } /****************************************************************************** * IShellLinkW_CF_Release */ -static ULONG WINAPI IShellLinkW_CF_Release(LPCLASSFACTORY this) -{ TRACE(shell,"(%p)->(count=%lu)\n",this,this->ref); +static ULONG WINAPI IShellLinkW_CF_Release(LPUNKNOWN iface) +{ + ICOM_THIS(IClassFactory,iface); + TRACE(shell,"(%p)->(count=%lu)\n",this,this->ref); if (!--(this->ref)) { TRACE(shell,"-- destroying IClassFactory(%p)\n",this); HeapFree(GetProcessHeap(),0,this); @@ -533,8 +559,10 @@ static ULONG WINAPI IShellLinkW_CF_Release(LPCLASSFACTORY this) * IShellLinkW_CF_CreateInstance */ static HRESULT WINAPI IShellLinkW_CF_CreateInstance( - LPCLASSFACTORY this, LPUNKNOWN pUnknown, REFIID riid, LPVOID *ppObject) -{ IUnknown *pObj = NULL; + LPCLASSFACTORY iface, LPUNKNOWN pUnknown, REFIID riid, LPVOID *ppObject) +{ + ICOM_THIS(IClassFactory,iface); + IUnknown *pObj = NULL; HRESULT hres; char xriid[50]; @@ -569,11 +597,24 @@ static HRESULT WINAPI IShellLinkW_CF_CreateInstance( * IShellLinkW_CF_LockServer */ -static HRESULT WINAPI IShellLinkW_CF_LockServer(LPCLASSFACTORY this, BOOL32 fLock) -{ TRACE(shell,"%p->(0x%x), not implemented\n",this, fLock); +static HRESULT WINAPI IShellLinkW_CF_LockServer(LPCLASSFACTORY iface, BOOL32 fLock) +{ + ICOM_THIS(IClassFactory,iface); + TRACE(shell,"%p->(0x%x), not implemented\n",this, fLock); return E_NOTIMPL; } +static ICOM_VTABLE(IClassFactory) slwcfvt = +{ + { + IShellLinkW_CF_QueryInterface, + IShellLinkW_CF_AddRef, + IShellLinkW_CF_Release + }, + IShellLinkW_CF_CreateInstance, + IShellLinkW_CF_LockServer +}; + /* IShellLinkW Implementation */ static HRESULT WINAPI IShellLinkW_QueryInterface(LPSHELLLINKW,REFIID,LPVOID*); static ULONG WINAPI IShellLinkW_AddRef(LPSHELLLINKW); @@ -684,7 +725,7 @@ static ULONG WINAPI IShellLinkW_Release(LPSHELLLINKW this) { TRACE(shell,"(%p)->(count=%lu)\n",this,this->ref); if (!--(this->ref)) { TRACE(shell,"-- destroying IShellLinkW(%p)\n",this); - this->lppf->lpvtbl->fnRelease(this->lppf); /* IPersistFile*/ + IPersistFile_Release(this->lppf); /* IPersistFile*/ HeapFree(GetProcessHeap(),0,this); return 0; } diff --git a/dlls/shell32/shellole.c b/dlls/shell32/shellole.c index 0d8efa17d9b..b63f7d8a083 100644 --- a/dlls/shell32/shellole.c +++ b/dlls/shell32/shellole.c @@ -12,9 +12,8 @@ #include "ole.h" #include "ole2.h" #include "debug.h" -#include "compobj.h" -#include "interfaces.h" #include "shlobj.h" +#include "objbase.h" #include "shell.h" #include "winerror.h" #include "winnls.h" @@ -84,8 +83,8 @@ static DWORD SH_get_instance(REFCLSID clsid,LPSTR dllname,LPVOID unknownouter,RE { FIXME(shell,"no classfactory, but hres is 0x%ld!\n",hres); return E_FAIL; } - classfac->lpvtbl->fnCreateInstance(classfac,unknownouter,refiid,inst); - classfac->lpvtbl->fnRelease(classfac); + IClassFactory_CreateInstance(classfac,unknownouter,refiid,inst); + IClassFactory_Release(classfac); return 0; } @@ -185,9 +184,9 @@ DWORD WINAPI SHELL32_DllGetClassObject(REFCLSID rclsid,REFIID iid,LPVOID *ppv) { lpclf = IClassFactory_Constructor(); } - if(lpclf) - { hres = lpclf->lpvtbl->fnQueryInterface(lpclf,iid, ppv); - lpclf->lpvtbl->fnRelease(lpclf); + if(lpclf) { + hres = IClassFactory_QueryInterface(lpclf,iid, ppv); + IClassFactory_Release(lpclf); } } else @@ -216,41 +215,31 @@ DWORD WINAPI SHGetMalloc(LPMALLOC32 *lpmal) /************************************************************************** * IClassFactory Implementation */ -static HRESULT WINAPI IClassFactory_QueryInterface(LPCLASSFACTORY,REFIID,LPVOID*); -static ULONG WINAPI IClassFactory_AddRef(LPCLASSFACTORY); -static ULONG WINAPI IClassFactory_Release(LPCLASSFACTORY); -static HRESULT WINAPI IClassFactory_CreateInstance(LPCLASSFACTORY, LPUNKNOWN, REFIID, LPVOID *); -static HRESULT WINAPI IClassFactory_LockServer(LPCLASSFACTORY, BOOL32); -/************************************************************************** - * IClassFactory_VTable - */ -static IClassFactory_VTable clfvt = -{ IClassFactory_QueryInterface, - IClassFactory_AddRef, - IClassFactory_Release, - IClassFactory_CreateInstance, - IClassFactory_LockServer -}; + +static ICOM_VTABLE(IClassFactory) clfvt; /************************************************************************** * IClassFactory_Constructor */ LPCLASSFACTORY IClassFactory_Constructor(void) -{ LPCLASSFACTORY lpclf; +{ + _IClassFactory* lpclf; - lpclf= (LPCLASSFACTORY)HeapAlloc(GetProcessHeap(),0,sizeof(IClassFactory)); + lpclf= (_IClassFactory*)HeapAlloc(GetProcessHeap(),0,sizeof(_IClassFactory)); lpclf->ref = 1; lpclf->lpvtbl = &clfvt; TRACE(shell,"(%p)->()\n",lpclf); - return lpclf; + return (LPCLASSFACTORY)lpclf; } /************************************************************************** * IClassFactory_QueryInterface */ -static HRESULT WINAPI IClassFactory_QueryInterface( - LPCLASSFACTORY this, REFIID riid, LPVOID *ppvObj) -{ char xriid[50]; +static HRESULT WINAPI IClassFactory_fnQueryInterface( + LPUNKNOWN iface, REFIID riid, LPVOID *ppvObj) +{ + ICOM_THIS(IClassFactory,iface); + char xriid[50]; WINE_StringFromCLSID((LPCLSID)riid,xriid); TRACE(shell,"(%p)->(\n\tIID:\t%s)\n",this,xriid); @@ -264,7 +253,7 @@ static HRESULT WINAPI IClassFactory_QueryInterface( } if(*ppvObj) - { (*(LPCLASSFACTORY*)ppvObj)->lpvtbl->fnAddRef(this); + { IUnknown_AddRef((LPUNKNOWN)*ppvObj); TRACE(shell,"-- Interface: (%p)->(%p)\n",ppvObj,*ppvObj); return S_OK; } @@ -274,15 +263,19 @@ static HRESULT WINAPI IClassFactory_QueryInterface( /****************************************************************************** * IClassFactory_AddRef */ -static ULONG WINAPI IClassFactory_AddRef(LPCLASSFACTORY this) -{ TRACE(shell,"(%p)->(count=%lu)\n",this,this->ref); +static ULONG WINAPI IClassFactory_fnAddRef(LPUNKNOWN iface) +{ + ICOM_THIS(IClassFactory,iface); + TRACE(shell,"(%p)->(count=%lu)\n",this,this->ref); return ++(this->ref); } /****************************************************************************** * IClassFactory_Release */ -static ULONG WINAPI IClassFactory_Release(LPCLASSFACTORY this) -{ TRACE(shell,"(%p)->(count=%lu)\n",this,this->ref); +static ULONG WINAPI IClassFactory_fnRelease(LPUNKNOWN iface) +{ + ICOM_THIS(IClassFactory,iface); + TRACE(shell,"(%p)->(count=%lu)\n",this,this->ref); if (!--(this->ref)) { TRACE(shell,"-- destroying IClassFactory(%p)\n",this); HeapFree(GetProcessHeap(),0,this); @@ -293,9 +286,11 @@ static ULONG WINAPI IClassFactory_Release(LPCLASSFACTORY this) /****************************************************************************** * IClassFactory_CreateInstance */ -static HRESULT WINAPI IClassFactory_CreateInstance( - LPCLASSFACTORY this, LPUNKNOWN pUnknown, REFIID riid, LPVOID *ppObject) -{ IUnknown *pObj = NULL; +static HRESULT WINAPI IClassFactory_fnCreateInstance( + LPCLASSFACTORY iface, LPUNKNOWN pUnknown, REFIID riid, LPVOID *ppObject) +{ + ICOM_THIS(IClassFactory,iface); + IUnknown *pObj = NULL; HRESULT hres; char xriid[50]; @@ -341,7 +336,20 @@ static HRESULT WINAPI IClassFactory_CreateInstance( /****************************************************************************** * IClassFactory_LockServer */ -static HRESULT WINAPI IClassFactory_LockServer(LPCLASSFACTORY this, BOOL32 fLock) -{ TRACE(shell,"%p->(0x%x), not implemented\n",this, fLock); +static HRESULT WINAPI IClassFactory_fnLockServer(LPCLASSFACTORY iface, BOOL32 fLock) +{ + ICOM_THIS(IClassFactory,iface); + TRACE(shell,"%p->(0x%x), not implemented\n",this, fLock); return E_NOTIMPL; } + +static ICOM_VTABLE(IClassFactory) clfvt = +{ + { + IClassFactory_fnQueryInterface, + IClassFactory_fnAddRef, + IClassFactory_fnRelease + }, + IClassFactory_fnCreateInstance, + IClassFactory_fnLockServer +}; diff --git a/dlls/shell32/shellord.c b/dlls/shell32/shellord.c index cf2b4a89c20..2edd0dfc2e9 100644 --- a/dlls/shell32/shellord.c +++ b/dlls/shell32/shellord.c @@ -25,7 +25,6 @@ #include "dlgs.h" #include "win.h" #include "cursoricon.h" -#include "interfaces.h" #include "shlobj.h" #include "debug.h" #include "winreg.h" @@ -311,7 +310,9 @@ DWORD WINAPI SHCreateDirectory(LPSECURITY_ATTRIBUTES sec,LPCSTR path) { */ DWORD WINAPI SHFree(LPVOID x) { TRACE(shell,"%p\n",x); - /*return LocalFree32((HANDLE32)x);*/ /* crashes */ + if (!HIWORD(x)) + { *(LPDWORD)0xdeaf0000 = 0; + } return HeapFree(GetProcessHeap(),0,x); } diff --git a/dlls/shell32/shlfolder.c b/dlls/shell32/shlfolder.c index 969ce172edd..3fff67dc7e9 100644 --- a/dlls/shell32/shlfolder.c +++ b/dlls/shell32/shlfolder.c @@ -1,5 +1,5 @@ /* - * Shell Folder stuff (...and all the OLE-Objects of SHELL32.DLL) + * Shell Folder stuff * * Copyright 1997 Marcus Meissner * Copyright 1998 Juergen Schmied @@ -12,9 +12,8 @@ #include "ole.h" #include "ole2.h" #include "debug.h" -#include "compobj.h" -#include "interfaces.h" #include "shlobj.h" +#include "objbase.h" #include "shell.h" #include "winerror.h" #include "winnls.h" @@ -115,11 +114,11 @@ LPSHELLFOLDER IShellFolder_Constructor(LPSHELLFOLDER pParent,LPITEMIDLIST pidl) if(sf->mpidl) /* do we have a pidl? */ { dwSize = 0; if(sf->mpSFParent->sMyPath) /* get the size of the parents path */ - { dwSize += strlen(sf->mpSFParent->sMyPath) + 1; + { dwSize += strlen(sf->mpSFParent->sMyPath) ; TRACE(shell,"-- (%p)->(parent's path=%s)\n",sf, debugstr_a(sf->mpSFParent->sMyPath)); } dwSize += _ILGetFolderText(sf->mpidl,NULL,0); /* add the size of the foldername*/ - sf->sMyPath = SHAlloc(dwSize); + sf->sMyPath = SHAlloc(dwSize+1); if(sf->sMyPath) { *(sf->sMyPath)=0x00; if(sf->mpSFParent->sMyPath) /* if the parent has a path, get it*/ @@ -141,24 +140,24 @@ LPSHELLFOLDER IShellFolder_Constructor(LPSHELLFOLDER pParent,LPITEMIDLIST pidl) */ static HRESULT WINAPI IShellFolder_QueryInterface( LPSHELLFOLDER this, REFIID riid, LPVOID *ppvObj) -{ char xriid[50]; - WINE_StringFromCLSID((LPCLSID)riid,xriid); - TRACE(shell,"(%p)->(\n\tIID:\t%s,%p)\n",this,xriid,ppvObj); +{ char xriid[50]; + WINE_StringFromCLSID((LPCLSID)riid,xriid); + TRACE(shell,"(%p)->(\n\tIID:\t%s,%p)\n",this,xriid,ppvObj); - *ppvObj = NULL; + *ppvObj = NULL; - if(IsEqualIID(riid, &IID_IUnknown)) /*IUnknown*/ - { *ppvObj = this; - } - else if(IsEqualIID(riid, &IID_IShellFolder)) /*IShellFolder*/ - { *ppvObj = (IShellFolder*)this; - } - - if(*ppvObj) - { (*(LPSHELLFOLDER*)ppvObj)->lpvtbl->fnAddRef(this); - TRACE(shell,"-- Interface: (%p)->(%p)\n",ppvObj,*ppvObj); - return S_OK; - } + if(IsEqualIID(riid, &IID_IUnknown)) /*IUnknown*/ + { *ppvObj = this; + } + else if(IsEqualIID(riid, &IID_IShellFolder)) /*IShellFolder*/ + { *ppvObj = (IShellFolder*)this; + } + + if(*ppvObj) + { (*(LPSHELLFOLDER*)ppvObj)->lpvtbl->fnAddRef(this); + TRACE(shell,"-- Interface: (%p)->(%p)\n",ppvObj,*ppvObj); + return S_OK; + } TRACE(shell,"-- Interface: E_NOINTERFACE\n"); return E_NOINTERFACE; } @@ -223,36 +222,40 @@ static HRESULT WINAPI IShellFolder_ParseDisplayName( DWORD *pdwAttributes) { HRESULT hr=E_OUTOFMEMORY; LPITEMIDLIST pidlFull=NULL, pidlTemp = NULL, pidlOld = NULL; - LPSTR pszTemp, pszNext=NULL; - CHAR szElement[MAX_PATH]; + LPSTR pszNext=NULL; + CHAR szTemp[MAX_PATH],szElement[MAX_PATH]; BOOL32 bIsFile; - DWORD dwChars; TRACE(shell,"(%p)->(HWND=0x%08x,%p,%p=%s,%p,pidl=%p,%p)\n", this,hwndOwner,pbcReserved,lpszDisplayName, debugstr_w(lpszDisplayName),pchEaten,ppidl,pdwAttributes); - dwChars=lstrlen32W(lpszDisplayName) + 1; - pszTemp=(LPSTR)HeapAlloc(GetProcessHeap(),0,dwChars); - - if(pszTemp) { hr = E_FAIL; - WideCharToLocal32(pszTemp, lpszDisplayName, dwChars); - if(*pszTemp) - { if (strcmp(pszTemp,"Desktop")==0) - { pidlFull = (LPITEMIDLIST)HeapAlloc(GetProcessHeap(),0,2); - pidlFull->mkid.cb = 0; + WideCharToLocal32(szTemp, lpszDisplayName, lstrlen32W(lpszDisplayName) + 1); + if(szTemp[0]) + { if (strcmp(szTemp,"Desktop")==0) + { pidlFull = _ILCreateDesktop(); } - else if (strcmp(pszTemp,"My Computer")==0) + else if (strcmp(szTemp,"My Computer")==0) { pidlFull = _ILCreateMyComputer(); } else - { pidlFull = _ILCreateMyComputer(); - + { if (!PathIsRoot32A(szTemp)) + { if (this->sMyPath && strlen (this->sMyPath)) + { if (strcmp(this->sMyPath,"My Computer")) + { strcpy (szElement,this->sMyPath); + PathAddBackslash32A (szElement); + strcat (szElement, szTemp); + strcpy (szTemp, szElement); + } + } + } + /* check if the lpszDisplayName is Folder or File*/ - bIsFile = ! (GetFileAttributes32A(pszTemp) & FILE_ATTRIBUTE_DIRECTORY); - pszNext = GetNextElement(pszTemp, szElement, MAX_PATH); + bIsFile = ! (GetFileAttributes32A(szTemp) & FILE_ATTRIBUTE_DIRECTORY); + pszNext = GetNextElement(szTemp, szElement, MAX_PATH); + pidlFull = _ILCreateMyComputer(); pidlTemp = _ILCreateDrive(szElement); pidlOld = pidlFull; pidlFull = ILCombine(pidlFull,pidlTemp); @@ -275,7 +278,6 @@ static HRESULT WINAPI IShellFolder_ParseDisplayName( } } } - HeapFree(GetProcessHeap(),0,pszTemp); *ppidl = pidlFull; return hr; } @@ -358,19 +360,15 @@ static HRESULT WINAPI IShellFolder_BindToObject( LPSHELLFOLDER this, LPCITEMIDLI * REFIID riid, //[in ] Initial storage interface * LPVOID* ppvObject //[out] Interface* returned */ -static HRESULT WINAPI IShellFolder_BindToStorage( - LPSHELLFOLDER this, - LPCITEMIDLIST pidl, /*simple/complex pidl*/ - LPBC pbcReserved, - REFIID riid, - LPVOID *ppvOut) +static HRESULT WINAPI IShellFolder_BindToStorage(LPSHELLFOLDER this, + LPCITEMIDLIST pidl,LPBC pbcReserved, REFIID riid, LPVOID *ppvOut) { char xriid[50]; WINE_StringFromCLSID(riid,xriid); FIXME(shell,"(%p)->(pidl=%p,%p,\n\tIID:%s,%p) stub\n",this,pidl,pbcReserved,xriid,ppvOut); - *ppvOut = NULL; - return E_NOTIMPL; + *ppvOut = NULL; + return E_NOTIMPL; } /************************************************************************** @@ -463,8 +461,10 @@ static HRESULT WINAPI IShellFolder_CreateViewObject( LPSHELLFOLDER this, *ppvOut = NULL; pShellView = IShellView_Constructor(this, this->mpidl); + if(!pShellView) return E_OUTOFMEMORY; + hr = pShellView->lpvtbl->fnQueryInterface(pShellView, riid, ppvOut); pShellView->lpvtbl->fnRelease(pShellView); TRACE(shell,"-- (%p)->(interface=%p)\n",this, ppvOut); @@ -617,54 +617,56 @@ static HRESULT WINAPI IShellFolder_GetDisplayNameOf( LPSHELLFOLDER this, LPCITEM szSpecial[0]=0x00; szDrive[0]=0x00; + szText[0]=0x00; /* test if simple(relative) or complex(absolute) pidl */ pidlTemp = ILGetNext(pidl); if (pidlTemp && pidlTemp->mkid.cb==0x00) { bSimplePidl = TRUE; TRACE(shell,"-- simple pidl\n"); + } + if (_ILIsDesktop( pidl)) { strcpy (szText,"Desktop"); - } + } else - { if (_ILIsMyComputer( pidl)) - { _ILGetItemText( pidl, szSpecial, MAX_PATH); + { if (_ILIsMyComputer(pidl)) + { _ILGetItemText(pidl, szSpecial, MAX_PATH); + pidl = ILGetNext(pidl); } - if (_ILIsDrive( pidl)) - { pidlTemp = ILFindLastID(pidl); - if (pidlTemp) - { _ILGetItemText( pidlTemp, szTemp, MAX_PATH); - } - if ( dwFlags==SHGDN_NORMAL || dwFlags==SHGDN_INFOLDER) + + if (_ILIsDrive(pidl)) + { _ILGetDrive( pidl, szTemp, MAX_PATH); + + if ( dwFlags==SHGDN_NORMAL || dwFlags==SHGDN_INFOLDER) /* like "A1-dos (C:)" */ { GetVolumeInformation32A(szTemp,szDrive,MAX_PATH,&dwVolumeSerialNumber,&dwMaximumComponetLength,&dwFileSystemFlags,NULL,0); - if (szTemp[2]=='\\') - { szTemp[2]=0x00; - } + szTemp[2]=0x00; /* overwrite '\' */ strcat (szDrive," ("); strcat (szDrive,szTemp); strcat (szDrive,")"); } - else + else /* like "C:\" */ { PathAddBackslash32A (szTemp); strcpy(szDrive,szTemp); } } + switch(dwFlags) - { case SHGDN_NORMAL: + { case SHGDN_NORMAL: /* 0x0000 */ _ILGetPidlPath( pidl, szText, MAX_PATH); break; - case SHGDN_INFOLDER | SHGDN_FORPARSING: /*fall thru*/ - case SHGDN_INFOLDER: + case SHGDN_INFOLDER | SHGDN_FORPARSING: /* 0x8001 */ + case SHGDN_INFOLDER: /* 0x0001 */ pidlTemp = ILFindLastID(pidl); if (pidlTemp) { _ILGetItemText( pidlTemp, szText, MAX_PATH); } break; - case SHGDN_FORPARSING: + case SHGDN_FORPARSING: /* 0x8000 */ if (bSimplePidl) { /* if the IShellFolder has parents, get the path from the parent and add the ItemName*/ @@ -681,9 +683,8 @@ static HRESULT WINAPI IShellFolder_GetDisplayNameOf( LPSHELLFOLDER this, LPCITEM } strcat(szText,szTemp); } - else - { /* if the pidl is absolute, get everything from the pidl*/ - _ILGetPidlPath( pidl, szText, MAX_PATH); + else /* if the pidl is absolute, get everything from the pidl*/ + { _ILGetPidlPath( pidl, szText, MAX_PATH); } break; default: diff --git a/dlls/shell32/shlview.c b/dlls/shell32/shlview.c index 403c337c526..95a60b16d48 100644 --- a/dlls/shell32/shlview.c +++ b/dlls/shell32/shlview.c @@ -10,9 +10,9 @@ #include "ole.h" #include "ole2.h" #include "debug.h" -#include "compobj.h" -#include "interfaces.h" +#include "servprov.h" #include "shlobj.h" +#include "objbase.h" #include "shell.h" #include "winerror.h" #include "winnls.h" @@ -666,7 +666,7 @@ BOOL32 ShellView_AddRemoveDockingWindow(LPSHELLVIEW this, BOOL32 bAdd) hr = IShellBrowser_QueryInterface(this->pShellBrowser, (REFIID)&IID_IServiceProvider, (LPVOID*)&pSP); if(SUCCEEDED(hr)) { /*get the IDockingWindowFrame pointer*/ - hr = pSP->lpvtbl->fnQueryService(pSP, (REFGUID)&SID_SShellBrowser, (REFIID)&IID_IDockingWindowFrame, (LPVOID*)&pFrame); + hr = IServiceProvider_QueryService(pSP, (REFGUID)&SID_SShellBrowser, (REFIID)&IID_IDockingWindowFrame, (LPVOID*)&pFrame); if(SUCCEEDED(hr)) { if(bAdd) { hr = S_OK; @@ -706,7 +706,7 @@ BOOL32 ShellView_AddRemoveDockingWindow(LPSHELLVIEW this, BOOL32 bAdd) } pFrame->lpvtbl->fnRelease(pFrame); } - pSP->lpvtbl->fnRelease(pSP); + IServiceProvider_Release(pSP); } return bReturn; } @@ -725,12 +725,12 @@ BOOL32 ShellView_CanDoIDockingWindow(LPSHELLVIEW this) /*get the browser's IServiceProvider*/ hr = IShellBrowser_QueryInterface(this->pShellBrowser, (REFIID)&IID_IServiceProvider, (LPVOID*)&pSP); if(hr==S_OK) - { hr = pSP->lpvtbl->fnQueryService(pSP, (REFGUID)&SID_SShellBrowser, (REFIID)&IID_IDockingWindowFrame, (LPVOID*)&pFrame); + { hr = IServiceProvider_QueryService(pSP, (REFGUID)&SID_SShellBrowser, (REFIID)&IID_IDockingWindowFrame, (LPVOID*)&pFrame); if(SUCCEEDED(hr)) { bReturn = TRUE; pFrame->lpvtbl->fnRelease(pFrame); } - pSP->lpvtbl->fnRelease(pSP); + IServiceProvider_Release(pSP); } return bReturn; } @@ -843,6 +843,11 @@ UINT32 ShellView_GetSelections(LPSHELLVIEW this) { LVITEM32A lvItem; UINT32 i; + + if (this->aSelectedItems) + { SHFree(this->aSelectedItems); + } + this->uSelected = ListView_GetSelectedCount(this->hWndList); this->aSelectedItems = (LPITEMIDLIST*)SHAlloc(this->uSelected * sizeof(LPITEMIDLIST)); @@ -949,9 +954,6 @@ void ShellView_DoContextMenu(LPSHELLVIEW this, WORD x, WORD y, BOOL32 fDefault) if (pContextMenu) pContextMenu->lpvtbl->fnRelease(pContextMenu); } - SHFree(this->aSelectedItems); - this->aSelectedItems=NULL; - this->uSelected=0; } else /* background context menu */ { hMenu = LoadMenuIndirect32A(&_Resource_Men_MENU_002_0_data); @@ -1321,17 +1323,20 @@ static ULONG WINAPI IShellView_AddRef(LPSHELLVIEW this) * IShellView_Release */ static ULONG WINAPI IShellView_Release(LPSHELLVIEW this) -{ TRACE(shell,"(%p)->()\n",this); - if (!--(this->ref)) - { TRACE(shell," destroying IShellView(%p)\n",this); +{ TRACE(shell,"(%p)->()\n",this); + if (!--(this->ref)) + { TRACE(shell," destroying IShellView(%p)\n",this); - if(this->pSFParent) - this->pSFParent->lpvtbl->fnRelease(this->pSFParent); + if(this->pSFParent) + this->pSFParent->lpvtbl->fnRelease(this->pSFParent); - HeapFree(GetProcessHeap(),0,this); - return 0; - } - return this->ref; + if (this->aSelectedItems) + SHFree(this->aSelectedItems); + + HeapFree(GetProcessHeap(),0,this); + return 0; + } + return this->ref; } /************************************************************************** * ShellView_GetWindow @@ -1516,14 +1521,12 @@ static HRESULT WINAPI IShellView_GetItemObject(LPSHELLVIEW this, UINT32 uItem, R *ppvOut = NULL; if(IsEqualIID(riid, &IID_IContextMenu)) - { pObj =(LPUNKNOWN)IContextMenu_Constructor(this->pSFParent,this->aSelectedItems,this->uSelected); + { ShellView_GetSelections(this); + pObj =(LPUNKNOWN)IContextMenu_Constructor(this->pSFParent,this->aSelectedItems,this->uSelected); } else if (IsEqualIID(riid, &IID_IDataObject)) { ShellView_GetSelections(this); pObj =(LPUNKNOWN)IDataObject_Constructor(this->hWndParent, this->pSFParent,this->aSelectedItems,this->uSelected); - SHFree(this->aSelectedItems); - this->aSelectedItems=NULL; - this->uSelected=0; } TRACE(shell,"-- (%p)->(interface=%p)\n",this, ppvOut); diff --git a/dlls/winaspi/winaspi16.c b/dlls/winaspi/winaspi16.c index a9eb055682b..0dc0cbcaaa9 100644 --- a/dlls/winaspi/winaspi16.c +++ b/dlls/winaspi/winaspi16.c @@ -490,8 +490,14 @@ void ASPI_DOS_HandleInt(CONTEXT *context) { #ifdef linux FARPROC16 *p = (FARPROC16 *)CTX_SEG_OFF_TO_LIN(context, DS_reg(context), EDX_reg(context)); + if ((CX_reg(context) == 4) || (CX_reg(context) == 5)) + { *p = DPMI_AllocInternalRMCB(ASPI_DOS_func); TRACE(aspi, "allocated real mode proc %p\n", *p); + AX_reg(context) = CX_reg(context); + } + else + SET_CFLAG(context); #else SET_CFLAG(context); #endif diff --git a/documentation/bugreports b/documentation/bugreports index 52c28bcaf03..b20be06386f 100644 --- a/documentation/bugreports +++ b/documentation/bugreports @@ -1,4 +1,4 @@ -How to Report a Bug +How To Report A Bug ------------------- Some simple advice on making your bug report more useful (and thus more @@ -6,21 +6,23 @@ likely to get answered and fixed): 1) Post as much information as possible. - This means we need more information than, - "MS Word crashes whenever I run it. Do you know why?" Include at - least the following information: + This means we need more information than a simple + "MS Word crashes whenever I run it. Do you know why?" + Include at least the following information: - Version of Wine you're using (run 'wine -v') - Operating system you're using, what distribution (if any), and what - version. + version - Compiler and version (run 'gcc -v') + - Windows version, if installed - Program you're trying to run, its version number, and a URL for - where the program can be obtained (if available). + where the program can be obtained (if available) - Command line you used to start wine - - Any other information you think may be relevant or helpful. + - Any other information you think may be relevant or helpful, such as + X server version in case of X problems, libc version etc. -2) Re-run the program with the -debugmsg +relay option - (i.e., 'wine -debugmsg +relay sol.exe'). +2) Re-run the program with the -debugmsg +relay,+snoop option + (i.e., 'wine -debugmsg +relay,+snoop sol.exe'). If Wine crashes while running your program, it is important that we have this information to have a chance at figuring out what is causing @@ -32,7 +34,7 @@ likely to get answered and fixed): tcsh and other csh-like shells: - wine -debugmsg +relay [other_options] program_name |& tee filename.out + wine -debugmsg +relay,+snoop [other_options] program_name |& tee filename.out tail -100 filename.out > report_file bash and other sh-like shells: diff --git a/documentation/fonts b/documentation/fonts index 32ac06c329c..b3a6c2ef787 100644 --- a/documentation/fonts +++ b/documentation/fonts @@ -169,6 +169,5 @@ values in the 60 - 120 range. 96 is a good starting point. The most likely cause is a broken fonts.dir file in one of your font directories. You need to rerun 'mkfontdir' to rebuild this file. Read -its manpage for more information. - - +its manpage for more information. If you can't run mkfontdir on this machine +as you are not root, use "xset -fp xxx" to remove the broken font path. diff --git a/documentation/wine.man b/documentation/wine.man index 4ce56b7cc52..f43f1cf2919 100644 --- a/documentation/wine.man +++ b/documentation/wine.man @@ -94,7 +94,7 @@ Use the named configuration file rather than the default .I -debug Enter the debugger before starting application .TP -.I -debugmsg [xxx]#name[,[xxx1]#name1] +.I -debugmsg [xxx]#name[,[xxx1]#name1][,<+|->relay=yyy1[:yyy2]] Turn debugging messages on or off. .RS +7 .PP @@ -107,7 +107,10 @@ or If xxx is not specified, all debugging messages for the specified channel are turned on. Each channel will print messages about a particular component of Wine. # is required and can be either + or -. Note that -there is not a space after the comma between names. +there is not a space after the comma between names. yyy are either the +name of a whole DLL or a single API entry by Name you either +want to include or exclude from the relay listing. These names must be in +the case as names used in the relaylisting. You can do the same for snoop. .PP For instance: .PP @@ -117,6 +120,13 @@ will turn on DLL warning messages and all heap messages. .I -debugmsg fixme-all,warn+cursor,+relay will turn off all FIXME messages, turn on cursor warning messages, and turn on all relay messages (API calls). +.br +.I -debugmsg -relay=LeaveCriticalSection:EnterCriticalSection +will turn on all relay messages except for LeaveCriticalSection and +EnterCriticalSection. +.br +.I -debugmsg +relay=ADVAPI32 +will only turn on relay messages into the ADVAPI32 code. .PP The full list of names is: all, accel, advapi, animate, aspi, atom, bitblt, bitmap, caret, cd, cdaudio, class, clipboard, clipping, combo, @@ -234,6 +244,12 @@ file of this format in your home directory or have the environment variable .B WINE_INI pointing to a configuration file, or use the -config option on the command line. +.SH ENVIRONMENT VARIABLES +.B wine +makes the environment variables of the shell from which +.B wine +is started accesible to the windows/dos processes started. So use the +appropriate syntax for your shell to enter environment variables you need. .SH CONFIGURATION FILE FORMAT All entries are grouped in sections; a section begins with the line .br diff --git a/files/async.c b/files/async.c index 7f1c69fec03..c22da8e409f 100644 --- a/files/async.c +++ b/files/async.c @@ -18,6 +18,7 @@ #include #include +#include #include #include #include @@ -29,7 +30,7 @@ #ifdef HAVE_SYS_FILIO_H # include #endif -#ifdef __svr4__ +#ifdef HAVE_SYS_FILE_H # include #endif diff --git a/files/file.c b/files/file.c index dc17b99437e..fddb3043b83 100644 --- a/files/file.c +++ b/files/file.c @@ -911,9 +911,9 @@ static HFILE32 FILE_DoOpenFile( LPCSTR name, OFSTRUCT *ofs, UINT32 mode, if (mode & OF_CREATE) { - if ((hFileRet = CreateFile32A( name, access, sharing, NULL, - CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, - -1 ))== INVALID_HANDLE_VALUE32) + if ((hFileRet = CreateFile32A( name, GENERIC_READ | GENERIC_WRITE, + sharing, NULL, CREATE_ALWAYS, + FILE_ATTRIBUTE_NORMAL, -1 ))== INVALID_HANDLE_VALUE32) goto error; goto success; } @@ -1452,6 +1452,11 @@ BOOL32 WINAPI DeleteFile32A( LPCSTR path ) TRACE(file, "'%s'\n", path ); + if (!*path) + { + ERR(file, "Empty path passed\n"); + return FALSE; + } if (DOSFS_GetDevice( path )) { WARN(file, "cannot remove DOS device '%s'!\n", path); @@ -1581,7 +1586,7 @@ DWORD WINAPI GetFileType( HFILE32 hFile ) struct get_file_info_reply reply; if ((req.handle = HANDLE_GetServerHandle( PROCESS_Current(), hFile, - K32OBJ_FILE, 0 )) == -1) + K32OBJ_UNKNOWN, 0 )) == -1) return FILE_TYPE_UNKNOWN; CLIENT_SendRequest( REQ_GET_FILE_INFO, -1, 1, &req, sizeof(req) ); if (CLIENT_WaitSimpleReply( &reply, sizeof(reply), NULL )) diff --git a/graphics/d3dcommon.c b/graphics/d3dcommon.c index 8fa6c8b3f2c..b71351a104d 100644 --- a/graphics/d3dcommon.c +++ b/graphics/d3dcommon.c @@ -121,6 +121,24 @@ void set_render_state(D3DRENDERSTATETYPE dwRenderStateType, } else { /* All others state variables */ switch (dwRenderStateType) { + + case D3DRENDERSTATE_TEXTUREHANDLE: { + LPDIRECT3DTEXTURE2 tex = (LPDIRECT3DTEXTURE2) dwRenderState; + + if (tex == NULL) { + glBindTexture(GL_TEXTURE_2D, 0); + glDisable(GL_TEXTURE_2D); + } else { + TRACE(ddraw, "setting OpenGL texture handle : %d\n", tex->tex_name); + glEnable(GL_TEXTURE_2D); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); + glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE); + glBindTexture(GL_TEXTURE_2D, tex->tex_name); + } + } break; + + case D3DRENDERSTATE_ZENABLE: /* 7 */ if (dwRenderState) glEnable(GL_DEPTH_TEST); diff --git a/graphics/d3ddevices.c b/graphics/d3ddevices.c index dcbdc0c7a4d..a53f6db3d40 100644 --- a/graphics/d3ddevices.c +++ b/graphics/d3ddevices.c @@ -884,11 +884,12 @@ static HRESULT WINAPI IDirect3DDevice2_DrawPrimitive(LPDIRECT3DDEVICE2 this, glColor3f(((col >> 16) & 0xFF) / 255.0, ((col >> 8) & 0xFF) / 255.0, ((col >> 0) & 0xFF) / 255.0); - + glTexCoord2f(vx->u.tu, vx->v.tv); glVertex3f(vx->x.sx, vx->y.sy, vx->z.sz); - TRACE(ddraw, " TLV: %f %f %f (%02lx %02lx %02lx)\n", + TRACE(ddraw, " TLV: %f %f %f (%02lx %02lx %02lx) (%f %f)\n", vx->x.sx, vx->y.sy, vx->z.sz, - ((col >> 16) & 0xFF), ((col >> 8) & 0xFF), ((col >> 0) & 0xFF)); + ((col >> 16) & 0xFF), ((col >> 8) & 0xFF), ((col >> 0) & 0xFF), + vx->u.tu, vx->v.tv); } break; default: diff --git a/graphics/d3dtexture.c b/graphics/d3dtexture.c index f79ba156599..14bc4c4d5ee 100644 --- a/graphics/d3dtexture.c +++ b/graphics/d3dtexture.c @@ -98,9 +98,9 @@ static HRESULT WINAPI IDirect3DTexture_GetHandle(LPDIRECT3DTEXTURE this, { FIXME(ddraw, "(%p)->(%p,%p): stub\n", this, lpD3DDevice, lpHandle); - *lpHandle = (DWORD) this->surface; + *lpHandle = (DWORD) this; - return DD_OK; + return D3D_OK; } static HRESULT WINAPI IDirect3DTexture_Initialize(LPDIRECT3DTEXTURE this, @@ -116,7 +116,7 @@ static HRESULT WINAPI IDirect3DTexture_Unload(LPDIRECT3DTEXTURE this) { FIXME(ddraw, "(%p)->(): stub\n", this); - return DD_OK; + return D3D_OK; } /*** IDirect3DTexture2 methods ***/ @@ -124,11 +124,19 @@ static HRESULT WINAPI IDirect3DTexture2_GetHandle(LPDIRECT3DTEXTURE2 this, LPDIRECT3DDEVICE2 lpD3DDevice2, LPD3DTEXTUREHANDLE lpHandle) { - FIXME(ddraw, "(%p)->(%p,%p): stub\n", this, lpD3DDevice2, lpHandle); + TRACE(ddraw, "(%p)->(%p,%p)\n", this, lpD3DDevice2, lpHandle); - *lpHandle = (DWORD) this->surface; /* lpD3DDevice2->store_texture(this); */ + /* For 32 bits OSes, handles = pointers */ + *lpHandle = (DWORD) this; - return DD_OK; + /* Now, bind a new texture */ + lpD3DDevice2->set_context(lpD3DDevice2); + this->D3Ddevice = (void *) lpD3DDevice2; + glGenTextures(1, &(this->tex_name)); + + TRACE(ddraw, "OpenGL texture handle is : %d\n", this->tex_name); + + return D3D_OK; } /* Common methods */ @@ -138,17 +146,74 @@ static HRESULT WINAPI IDirect3DTexture2_PaletteChanged(LPDIRECT3DTEXTURE2 this, { FIXME(ddraw, "(%p)->(%8ld,%8ld): stub\n", this, dwStart, dwCount); - return DD_OK; + return D3D_OK; } static HRESULT WINAPI IDirect3DTexture2_Load(LPDIRECT3DTEXTURE2 this, LPDIRECT3DTEXTURE2 lpD3DTexture2) { - FIXME(ddraw, "(%p)->(%p): stub\n", this, lpD3DTexture2); + DDSURFACEDESC *src_d, *dst_d; + TRACE(ddraw, "(%p)->(%p)\n", this, lpD3DTexture2); /* Hack ? */ - FIXME(ddraw, "Sthis %p / Sload %p\n", this->surface, lpD3DTexture2->surface); + TRACE(ddraw, "Copied to surface %p, surface %p\n", this->surface, lpD3DTexture2->surface); this->surface->s.surface_desc.ddsCaps.dwCaps &= ~DDSCAPS_ALLOCONLOAD; + + /* Copy one surface on the other */ + dst_d = &(this->surface->s.surface_desc); + src_d = &(lpD3DTexture2->surface->s.surface_desc); + + if ((src_d->dwWidth != dst_d->dwWidth) || (src_d->dwHeight != dst_d->dwHeight)) { + /* Should also check for same pixel format, lPitch, ... */ + ERR(ddraw, "Error in surface sizes\n"); + return D3DERR_TEXTURE_LOAD_FAILED; + } else { + LPDIRECT3DDEVICE2 d3dd = (LPDIRECT3DDEVICE2) this->D3Ddevice; + /* I should put a macro for the calculus of bpp */ + int bpp = (src_d->ddpfPixelFormat.dwFlags & DDPF_PALETTEINDEXED8 ? + 1 /* 8 bit of palette index */: + src_d->ddpfPixelFormat.x.dwRGBBitCount / 8 /* RGB bits for each colors */ ); + + /* Not sure if this is usefull ! */ + memcpy(dst_d->y.lpSurface, src_d->y.lpSurface, src_d->dwWidth * src_d->dwHeight * bpp); + + /* Now, load the texture */ + d3dd->set_context(d3dd); + glBindTexture(GL_TEXTURE_2D, this->tex_name); + + if (src_d->ddpfPixelFormat.dwFlags & DDPF_PALETTEINDEXED8) { + LPDIRECTDRAWPALETTE pal = this->surface->s.palette; + BYTE table[256][4]; + int i; + + /* Get the surface's palette */ + for (i = 0; i < 256; i++) { + table[i][0] = pal->palents[i].peRed; + table[i][1] = pal->palents[i].peGreen; + table[i][2] = pal->palents[i].peBlue; + table[i][3] = 0xFF; + } + + /* Use Paletted Texture Extension */ + glColorTableEXT(GL_TEXTURE_2D, /* target */ + GL_RGBA, /* internal format */ + 256, /* table size */ + GL_RGBA, /* table format */ + GL_UNSIGNED_BYTE, /* table type */ + table); /* the color table */ + + glTexImage2D(GL_TEXTURE_2D, /* target */ + 0, /* level */ + GL_COLOR_INDEX8_EXT, /* internal format */ + src_d->dwWidth, src_d->dwHeight, /* width, height */ + 0, /* border */ + GL_COLOR_INDEX, /* texture format */ + GL_UNSIGNED_BYTE, /* texture type */ + src_d->y.lpSurface); /* the texture */ + } else { + ERR(ddraw, "Unhandled texture format\n"); + } + } return DD_OK; } diff --git a/graphics/ddraw.c b/graphics/ddraw.c index e0a61b3ea29..f297b9fa53b 100644 --- a/graphics/ddraw.c +++ b/graphics/ddraw.c @@ -33,7 +33,6 @@ #endif #include "winerror.h" -#include "interfaces.h" #include "gdi.h" #include "heap.h" #include "ldt.h" @@ -43,7 +42,6 @@ #include "ddraw.h" #include "d3d.h" #include "debug.h" -#include "compobj.h" #include "spy.h" #include "message.h" #include "x11drv.h" @@ -426,7 +424,7 @@ static HRESULT WINAPI Xlib_IDirectDrawSurface3_Unlock( #ifdef HAVE_LIBXXSHM if (this->s.ddraw->e.xlib.xshm_active) TSXShmPutImage(display, - this->s.ddraw->e.xlib.drawable, + this->s.ddraw->d.drawable, DefaultGCOfScreen(screen), this->t.xlib.image, 0, 0, 0, 0, @@ -436,7 +434,7 @@ static HRESULT WINAPI Xlib_IDirectDrawSurface3_Unlock( else #endif TSXPutImage( display, - this->s.ddraw->e.xlib.drawable, + this->s.ddraw->d.drawable, DefaultGCOfScreen(screen), this->t.xlib.image, 0, 0, 0, 0, @@ -444,7 +442,7 @@ static HRESULT WINAPI Xlib_IDirectDrawSurface3_Unlock( this->t.xlib.image->height); if (this->s.palette && this->s.palette->cm) - TSXSetWindowColormap(display,this->s.ddraw->e.xlib.drawable,this->s.palette->cm); + TSXSetWindowColormap(display,this->s.ddraw->d.drawable,this->s.palette->cm); } return DD_OK; @@ -503,7 +501,7 @@ static HRESULT WINAPI Xlib_IDirectDrawSurface3_Flip( #ifdef HAVE_LIBXXSHM if (this->s.ddraw->e.xlib.xshm_active) { TSXShmPutImage(display, - this->s.ddraw->e.xlib.drawable, + this->s.ddraw->d.drawable, DefaultGCOfScreen(screen), flipto->t.xlib.image, 0, 0, 0, 0, @@ -513,7 +511,7 @@ static HRESULT WINAPI Xlib_IDirectDrawSurface3_Flip( } else #endif TSXPutImage(display, - this->s.ddraw->e.xlib.drawable, + this->s.ddraw->d.drawable, DefaultGCOfScreen(screen), flipto->t.xlib.image, 0, 0, 0, 0, @@ -521,7 +519,7 @@ static HRESULT WINAPI Xlib_IDirectDrawSurface3_Flip( flipto->t.xlib.image->height); if (flipto->s.palette && flipto->s.palette->cm) { - TSXSetWindowColormap(display,this->s.ddraw->e.xlib.drawable,flipto->s.palette->cm); + TSXSetWindowColormap(display,this->s.ddraw->d.drawable,flipto->s.palette->cm); } if (flipto!=this) { XImage *tmp; @@ -547,12 +545,17 @@ static HRESULT WINAPI Xlib_IDirectDrawSurface3_SetPalette( int i; TRACE(ddraw,"(%p)->(%p)\n",this,pal); + if (pal == NULL) { + if( this->s.palette != NULL ) + this->s.palette->lpvtbl->fnRelease( this->s.palette ); + this->s.palette = pal; + + return DD_OK; + } + if( !(pal->cm) && (this->s.ddraw->d.depth<=8)) { - pal->cm = TSXCreateColormap(display,this->s.ddraw->e.xlib.drawable,DefaultVisualOfScreen(screen),AllocAll); - - /* FIXME: this is not correct, when using -managed (XSetWindowColormap??) */ - TSXInstallColormap(display,pal->cm); + pal->cm = TSXCreateColormap(display,this->s.ddraw->d.drawable,DefaultVisualOfScreen(screen),AllocAll); for (i=0;i<256;i++) { XColor xc; @@ -587,7 +590,7 @@ static HRESULT WINAPI Xlib_IDirectDrawSurface3_SetPalette( pal->lpvtbl->fnAddRef( pal ); } /* Perform the refresh */ - TSXSetWindowColormap(display,this->s.ddraw->e.xlib.drawable,this->s.palette->cm); + TSXSetWindowColormap(display,this->s.ddraw->d.drawable,this->s.palette->cm); } return DD_OK; } @@ -697,6 +700,7 @@ static HRESULT WINAPI IDirectDrawSurface3_Blt( if (dwFlags) { TRACE(ddraw,"\t(src=NULL):Unsupported flags: ");_dump_DDBLT(dwFlags);fprintf(stderr,"\n"); } + this->lpvtbl->fnUnlock(this,ddesc.y.lpSurface); return DD_OK; } @@ -768,24 +772,33 @@ static HRESULT WINAPI IDirectDrawSurface3_Blt( static HRESULT WINAPI IDirectDrawSurface3_BltFast( LPDIRECTDRAWSURFACE3 this,DWORD dstx,DWORD dsty,LPDIRECTDRAWSURFACE3 src,LPRECT32 rsrc,DWORD trans ) { - int i,bpp; + int i,bpp,w,h; DDSURFACEDESC ddesc,sdesc; - if (TRACE_ON(ddraw)) { - TRACE(ddraw,"(%p)->(%ld,%ld,%p,%p,%08lx)\n", + if (1 || TRACE_ON(ddraw)) { + FIXME(ddraw,"(%p)->(%ld,%ld,%p,%p,%08lx)\n", this,dstx,dsty,src,rsrc,trans ); - TRACE(ddraw," trans:");_dump_DDBLTFAST(trans);fprintf(stderr,"\n"); - TRACE(ddraw," srcrect: %dx%d-%dx%d\n",rsrc->left,rsrc->top,rsrc->right,rsrc->bottom); + FIXME(ddraw," trans:");_dump_DDBLTFAST(trans);fprintf(stderr,"\n"); + FIXME(ddraw," srcrect: %dx%d-%dx%d\n",rsrc->left,rsrc->top,rsrc->right,rsrc->bottom); } /* We need to lock the surfaces, or we won't get refreshes when done. */ src ->lpvtbl->fnLock(src, NULL,&sdesc,DDLOCK_READONLY, 0); this->lpvtbl->fnLock(this,NULL,&ddesc,DDLOCK_WRITEONLY,0); bpp = this->s.surface_desc.ddpfPixelFormat.x.dwRGBBitCount / 8; - for (i=0;ibottom-rsrc->top;i++) { + h=rsrc->bottom-rsrc->top; + if (h>ddesc.dwHeight-dsty) h=ddesc.dwHeight-dsty; + if (h>sdesc.dwHeight-rsrc->top) h=sdesc.dwHeight-rsrc->top; + if (h<0) h=0; + w=rsrc->right-rsrc->left; + if (w>ddesc.dwWidth-dstx) w=ddesc.dwWidth-dstx; + if (w>sdesc.dwWidth-rsrc->left) w=sdesc.dwWidth-rsrc->left; + if (w<0) w=0; + + for (i=0;itop+i)*sdesc.lPitch+rsrc->left*bpp, - (rsrc->right-rsrc->left)*bpp + w*bpp ); } this->lpvtbl->fnUnlock(this,ddesc.y.lpSurface); @@ -2247,7 +2260,8 @@ static HRESULT WINAPI IDirectDraw2_SetCooperativeLevel( /* This will be overwritten in the case of Full Screen mode. Windowed games could work with that :-) */ - this->e.xlib.drawable = ((X11DRV_WND_DATA *) WIN_FindWndPtr(hwnd)->pDriverData)->window; + if (hwnd) + this->d.drawable = ((X11DRV_WND_DATA *) WIN_FindWndPtr(hwnd)->pDriverData)->window; return DD_OK; } @@ -2414,10 +2428,10 @@ static HRESULT WINAPI Xlib_IDirectDraw_SetDisplayMode( _common_IDirectDraw_SetDisplayMode(this); this->e.xlib.paintable = 1; - this->e.xlib.drawable = ((X11DRV_WND_DATA *) WIN_FindWndPtr(this->d.window)->pDriverData)->window; + this->d.drawable = ((X11DRV_WND_DATA *) WIN_FindWndPtr(this->d.window)->pDriverData)->window; /* We don't have a context for this window. Host off the desktop */ - if( !this->e.xlib.drawable ) - this->e.xlib.drawable = ((X11DRV_WND_DATA *) WIN_GetDesktop()->pDriverData)->window; + if( !this->d.drawable ) + this->d.drawable = ((X11DRV_WND_DATA *) WIN_GetDesktop()->pDriverData)->window; return DD_OK; } @@ -2495,7 +2509,7 @@ static HRESULT WINAPI IDirectDraw2_CreateClipper( } static HRESULT WINAPI common_IDirectDraw2_CreatePalette( - LPDIRECTDRAW2 this,DWORD x,LPPALETTEENTRY palent,LPDIRECTDRAWPALETTE *lpddpal,LPUNKNOWN lpunk + LPDIRECTDRAW2 this,DWORD dwFlags,LPPALETTEENTRY palent,LPDIRECTDRAWPALETTE *lpddpal,LPUNKNOWN lpunk ) { *lpddpal = (LPDIRECTDRAWPALETTE)HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,sizeof(IDirectDrawPalette)); if (*lpddpal == NULL) return E_OUTOFMEMORY; @@ -2511,8 +2525,20 @@ static HRESULT WINAPI common_IDirectDraw2_CreatePalette( if (palent) { - /* Initialize the palette based on the passed palent struct */ - FIXME(ddraw,"needs to handle palent (%p)\n",palent); + int size = 0; + + if (dwFlags & DDPCAPS_1BIT) + size = 2; + else if (dwFlags & DDPCAPS_2BIT) + size = 4; + else if (dwFlags & DDPCAPS_4BIT) + size = 16; + else if (dwFlags & DDPCAPS_8BIT) + size = 256; + else + ERR(ddraw, "unhandled palette format\n"); + + memcpy((*lpddpal)->palents, palent, size * sizeof(PALETTEENTRY)); } return DD_OK; } @@ -2529,11 +2555,13 @@ static HRESULT WINAPI DGA_IDirectDraw2_CreatePalette( } static HRESULT WINAPI Xlib_IDirectDraw2_CreatePalette( - LPDIRECTDRAW2 this,DWORD x,LPPALETTEENTRY palent,LPDIRECTDRAWPALETTE *lpddpal,LPUNKNOWN lpunk + LPDIRECTDRAW2 this,DWORD dwFlags,LPPALETTEENTRY palent,LPDIRECTDRAWPALETTE *lpddpal,LPUNKNOWN lpunk ) { - TRACE(ddraw,"(%p)->(%08lx,%p,%p,%p)\n",this,x,palent,lpddpal,lpunk); + TRACE(ddraw,"(%p)->(%08lx,%p,%p,%p)\n",this,dwFlags,palent,lpddpal,lpunk); *lpddpal = (LPDIRECTDRAWPALETTE)HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,sizeof(IDirectDrawPalette)); + TRACE(ddraw, "Palette created : %p\n", *lpddpal); + if (*lpddpal == NULL) return E_OUTOFMEMORY; @@ -2544,8 +2572,22 @@ static HRESULT WINAPI Xlib_IDirectDraw2_CreatePalette( (*lpddpal)->ddraw = (LPDIRECTDRAW)this; this->lpvtbl->fnAddRef(this); - if (palent) - FIXME(ddraw,"needs to handle palent (%p)\n",palent); + if (palent) { + int size = 0; + + if (dwFlags & DDPCAPS_1BIT) + size = 2; + else if (dwFlags & DDPCAPS_2BIT) + size = 4; + else if (dwFlags & DDPCAPS_4BIT) + size = 16; + else if (dwFlags & DDPCAPS_8BIT) + size = 256; + else + ERR(ddraw, "unhandled palette format\n"); + + memcpy((*lpddpal)->palents, palent, size * sizeof(PALETTEENTRY)); + } return DD_OK; } @@ -3215,7 +3257,7 @@ HRESULT WINAPI Xlib_DirectDrawCreate( LPDIRECTDRAW *lplpDD, LPUNKNOWN pUnkOuter) *lplpDD = (LPDIRECTDRAW)HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,sizeof(IDirectDraw)); (*lplpDD)->lpvtbl = &xlib_ddvt; (*lplpDD)->ref = 1; - (*lplpDD)->e.xlib.drawable = 0; /* in SetDisplayMode */ + (*lplpDD)->d.drawable = 0; /* in SetDisplayMode */ (*lplpDD)->d.depth = DefaultDepthOfScreen(screen); (*lplpDD)->d.height = screenHeight; diff --git a/graphics/vga.c b/graphics/vga.c index 3f9480ebcc5..490074d936c 100644 --- a/graphics/vga.c +++ b/graphics/vga.c @@ -10,8 +10,6 @@ #include "winbase.h" #include "miscemu.h" #include "vga.h" -#include "compobj.h" -#include "interfaces.h" #include "ddraw.h" #include "debug.h" @@ -49,6 +47,7 @@ int VGA_SetMode(unsigned Xres,unsigned Yres,unsigned Depth) } vga_refresh=0; InitializeCriticalSection(&vga_crit); + MakeCriticalSectionGlobal(&vga_crit); /* poll every 20ms (50fps should provide adequate responsiveness) */ poll_timer = CreateSystemTimer( 20, VGA_Poll ); } diff --git a/graphics/x11drv/xfont.c b/graphics/x11drv/xfont.c index c0b7fda13c8..a36a5c091b8 100644 --- a/graphics/x11drv/xfont.c +++ b/graphics/x11drv/xfont.c @@ -1806,6 +1806,7 @@ BOOL32 X11DRV_FONT_Init( DeviceCaps* pDevCaps ) HeapFree(SystemHeap, 0, buffer); InitializeCriticalSection( &crtsc_fonts_X11 ); + MakeCriticalSectionGlobal( &crtsc_fonts_X11 ); /* fontList initialization is over, allocate X font cache */ @@ -1935,7 +1936,7 @@ static UINT32 XFONT_Match( fontMatch* pfm ) d = (h = pfi->df.dfPoints) + plf->lfHeight; else d = h = 0; - if( d && plf->lfHeight ) + if( d && h && plf->lfHeight ) { UINT16 height = ( plf->lfHeight > 0 ) ? plf->lfHeight : ((-plf->lfHeight * pfi->df.dfPixHeight) / h); @@ -1959,7 +1960,8 @@ static UINT32 XFONT_Match( fontMatch* pfm ) pfm->height = pfi->df.dfPixHeight; penalty += (d > 0)? d * 0x8 : -d * 0x10; } - } else pfm->height = pfi->df.dfPixHeight; + } + else pfm->height = pfi->df.dfPixHeight; if((pfm->flags & FO_MATCH_PAF) && (plf->lfPitchAndFamily & FF_FAMILY) != (pfi->df.dfPitchAndFamily & FF_FAMILY) ) diff --git a/if1632/compobj.spec b/if1632/compobj.spec index 3f245a45d4a..072204a128d 100644 --- a/if1632/compobj.spec +++ b/if1632/compobj.spec @@ -18,7 +18,7 @@ type win16 15 pascal CoDisconnectObject(ptr long) CoDisconnectObject 16 stub CORELEASEMARSHALDATA 17 pascal16 COFREEUNUSEDLIBRARIES() CoFreeUnusedLibraries -18 pascal16 IsEqualGUID(ptr ptr) IsEqualGUID +18 pascal16 IsEqualGUID(ptr ptr) IsEqualGUID16 19 pascal StringFromCLSID(ptr ptr) StringFromCLSID16 20 pascal CLSIDFromString(str ptr) CLSIDFromString16 21 stub ISVALIDPTRIN @@ -208,12 +208,12 @@ type win16 207 stub ADDAPPCOMPATFLAG # WINE internal relays (for Win16 interfaces) -500 cdecl IMalloc16_QueryInterface(ptr ptr ptr) IMalloc16_QueryInterface -501 cdecl IMalloc16_AddRef(ptr) IMalloc16_AddRef -502 cdecl IMalloc16_Release(ptr) IMalloc16_Release -503 cdecl IMalloc16_Alloc(ptr long) IMalloc16_Alloc -504 cdecl IMalloc16_Realloc(ptr segptr long) IMalloc16_Realloc -505 cdecl IMalloc16_Free(ptr segptr) IMalloc16_Free -506 cdecl IMalloc16_GetSize(ptr segptr) IMalloc16_GetSize -507 cdecl IMalloc16_DidAlloc(ptr segptr) IMalloc16_DidAlloc -508 cdecl IMalloc16_HeapMinimize(ptr) IMalloc16_HeapMinimize +500 cdecl IMalloc16_QueryInterface(ptr ptr ptr) IMalloc16_fnQueryInterface +501 cdecl IMalloc16_AddRef(ptr) IMalloc16_fnAddRef +502 cdecl IMalloc16_Release(ptr) IMalloc16_fnRelease +503 cdecl IMalloc16_Alloc(ptr long) IMalloc16_fnAlloc +504 cdecl IMalloc16_Realloc(ptr segptr long) IMalloc16_fnRealloc +505 cdecl IMalloc16_Free(ptr segptr) IMalloc16_fnFree +506 cdecl IMalloc16_GetSize(ptr segptr) IMalloc16_fnGetSize +507 cdecl IMalloc16_DidAlloc(ptr segptr) IMalloc16_fnDidAlloc +508 cdecl IMalloc16_HeapMinimize(ptr) IMalloc16_fnHeapMinimize diff --git a/if1632/relay.c b/if1632/relay.c index 35da94b7112..cc7c2e35faf 100644 --- a/if1632/relay.c +++ b/if1632/relay.c @@ -14,6 +14,7 @@ #include "task.h" #include "debugstr.h" #include "debug.h" +#include "main.h" /*********************************************************************** @@ -22,7 +23,6 @@ BOOL32 RELAY_Init(void) { WORD codesel; - extern BOOL32 THUNK_Init(void); /* Allocate the code selector for CallTo16 routines */ @@ -74,8 +74,6 @@ void RELAY_DebugCallFrom16( int func_type, char *args, char *args16; const char *funstr; int i; - /* from relay32/relay386.c */ - extern int RELAY_ShowDebugmsgRelay(const char *); if (!TRACE_ON(relay)) return; @@ -196,8 +194,6 @@ void RELAY_DebugCallFrom16Ret( int func_type, int ret_val, CONTEXT *context) STACK16FRAME *frame; WORD ordinal; const char *funstr; - /* from relay32/relay386.c */ - extern int RELAY_ShowDebugmsgRelay(const char *); if (!TRACE_ON(relay)) return; frame = CURRENT_STACK16; diff --git a/include/acconfig.h b/include/acconfig.h index 35c7acf6951..19e6bbabb82 100644 --- a/include/acconfig.h +++ b/include/acconfig.h @@ -63,6 +63,9 @@ /* Define if we can use curses (if no ncurses) for full-screen access */ #undef HAVE_LIBCURSES +/* Define if ncurses have the new resizeterm function */ +#undef HAVE_RESIZETERM + /* Define if we can a compatible xterm program */ #undef XTERM_PROGRAM diff --git a/include/commctrl.h b/include/commctrl.h index 00e09536431..49c888b85d1 100644 --- a/include/commctrl.h +++ b/include/commctrl.h @@ -93,6 +93,7 @@ BOOL32 WINAPI InitCommonControlsEx (LPINITCOMMONCONTROLSEX); #define I_IMAGECALLBACK (-1) #define I_INDENTCALLBACK (-1) +#define I_CHILDRENCALLBACK (-1) /* owner drawn types */ @@ -117,6 +118,66 @@ typedef struct tagNMTOOLTIPSCREATED #define SNDMSG WINELIB_NAME_AW(SendMessage) + +/* Custom Draw messages */ + +#define CDRF_DODEFAULT 0x0 +#define CDRF_NEWFONT 0x00000002 +#define CDRF_SKIPDEFAULT 0x00000004 +#define CDRF_NOTIFYPOSTPAINT 0x00000010 +#define CDRF_NOTIFYITEMDRAW 0x00000020 +#define CDRF_NOTIFYSUBITEMDRAW 0x00000020 +#define CDRF_NOTIFYPOSTERASE 0x00000040 +/* #define CDRF_NOTIFYITEMERASE 0x00000080 obsolete ? */ + + +/* drawstage flags */ + +#define CDDS_PREPAINT 1 +#define CDDS_POSTPAINT 2 +#define CDDS_PREERASE 3 +#define CDDS_POSTERASE 4 + +#define CDDS_ITEM 0x00010000 +#define CDDS_ITEMPREPAINT (CDDS_ITEM | CDDS_PREPAINT) +#define CDDS_ITEMPOSTPAINT (CDDS_ITEM | CDDS_POSTPAINT) +#define CDDS_ITEMPREERASE (CDDS_ITEM | CDDS_PREERASE) +#define CDDS_ITEMPOSTERASE (CDDS_ITEM | CDDS_POSTERASE) +#define CDDS_SUBITEM 0x00020000 + +/* itemState flags */ + +#define CDIS_SELECTED 0x0001 +#define CDIS_GRAYED 0x0002 +#define CDIS_DISABLED 0x0004 +#define CDIS_CHECKED 0x0008 +#define CDIS_FOCUS 0x0010 +#define CDIS_DEFAULT 0x0020 +#define CDIS_HOT 0x0040 +#define CDIS_MARKED 0x0080 +#define CDIS_INDETERMINATE 0x0100 + + +typedef struct tagNMCUSTOMDRAWINFO +{ + NMHDR hdr; + DWORD dwDrawStage; + HDC32 hdc; + RECT32 rc; + DWORD dwItemSpec; + UINT32 uItemState; + LPARAM lItemlParam; +} NMCUSTOMDRAW, *LPNMCUSTOMDRAW; + +typedef struct tagNMTTCUSTOMDRAW +{ + NMCUSTOMDRAW nmcd; + UINT32 uDrawFlags; +} NMTTCUSTOMDRAW, *LPNMTTCUSTOMDRAW; + + + + /* StatusWindow */ #define STATUSCLASSNAME16 "msctls_statusbar" @@ -395,6 +456,28 @@ BOOL32 WINAPI ImageList_Write(HIMAGELIST, LPSTREAM32); #define ImageList_RemoveAll(himl) ImageList_Remove(himl,-1) +/* Flat Scrollbar control */ + +#define FLATSB_CLASS16 "flatsb_class" +#define FLATSB_CLASS32A "flatsb_class32" +#define FLATSB_CLASS32W L"flatsb_class32" +#define FLATSB_CLASS WINELIB_NAME_AW(FLATSB_CLASS) + +BOOL32 WINAPI FlatSB_EnableScrollBar(HWND32, INT32, UINT32); +BOOL32 WINAPI FlatSB_ShowScrollBar(HWND32, INT32, BOOL32); +BOOL32 WINAPI FlatSB_GetScrollRange(HWND32, INT32, LPINT32, LPINT32); +BOOL32 WINAPI FlatSB_GetScrollInfo(HWND32, INT32, LPSCROLLINFO); +INT32 WINAPI FlatSB_GetScrollPos(HWND32, INT32); +BOOL32 WINAPI FlatSB_GetScrollProp(HWND32, INT32, LPINT32); +INT32 WINAPI FlatSB_SetScrollPos(HWND32, INT32, INT32, BOOL32); +INT32 WINAPI FlatSB_SetScrollInfo(HWND32, INT32, LPSCROLLINFO, BOOL32); +INT32 WINAPI FlatSB_SetScrollRange(HWND32, INT32, INT32, INT32, BOOL32); +BOOL32 WINAPI FlatSB_SetScrollProp(HWND32, UINT32, INT32, BOOL32); +BOOL32 WINAPI InitializeFlatSB(HWND32); +HRESULT WINAPI UninitializeFlatSB(HWND32); + + + /* Header control */ #define WC_HEADER16 "SysHeader" @@ -2307,9 +2390,15 @@ typedef INT32 (CALLBACK *PFNLVCOMPARE)(LPARAM, LPARAM, LPARAM); #define TCM_GETIMAGELIST (TCM_FIRST + 2) #define TCM_SETIMAGELIST (TCM_FIRST + 3) #define TCM_GETITEMCOUNT (TCM_FIRST + 4) -#define TCM_GETITEM (TCM_FIRST + 5) -#define TCM_SETITEM (TCM_FIRST + 6) -#define TCM_INSERTITEM (TCM_FIRST + 7) +#define TCM_GETITEM WINELIB_NAME_AW(TCM_GETITEM) +#define TCM_GETITEM32A (TCM_FIRST + 5) +#define TCM_GETITEM32W (TCM_FIRST + 60) +#define TCM_SETITEM32A (TCM_FIRST + 6) +#define TCM_SETITEM32W (TCM_FIRST + 61) +#define TCM_SETITEM WINELIB_NAME_AW(TCM_SETITEM) +#define TCM_INSERTITEM32A (TCM_FIRST + 7) +#define TCM_INSERTITEM32W (TCM_FIRST + 62) +#define TCM_INSERTITEM WINELIB_NAME_AW(TCM_INSERTITEM) #define TCM_DELETEITEM (TCM_FIRST + 8) #define TCM_DELETEALLITEMS (TCM_FIRST + 9) #define TCM_GETITEMRECT (TCM_FIRST + 10) @@ -2328,27 +2417,51 @@ typedef INT32 (CALLBACK *PFNLVCOMPARE)(LPARAM, LPARAM, LPARAM); #define TCM_SETCURFOCUS (TCM_FIRST + 48) #define TCM_SETMINTTABWIDTH (TCM_FIRST + 49) #define TCM_DESELECTALL (TCM_FIRST + 50) +#define TCM_HIGHLIGHTITEM (TCM_FIRST + 51) +#define TCM_SETEXTENDEDSTYLE (TCM_FIRST + 52) +#define TCM_GETEXTENDEDSTYLE (TCM_FIRST + 53) +#define TCM_SETUNICODEFORMAT CCM_SETUNICODEFORMAT +#define TCM_GETUNICODEFORMAT CCM_GETUNICODEFORMAT + #define TCIF_TEXT 0x0001 #define TCIF_IMAGE 0x0002 #define TCIF_RTLREADING 0x0004 #define TCIF_PARAM 0x0008 +#define TCIF_STATE 0x0010 + -typedef struct tagTCITEM { +typedef struct tagTCITEM32A { UINT32 mask; - UINT32 lpReserved1; - UINT32 lpReserved2; + UINT32 dwState; + UINT32 dwStateMask; LPSTR pszText; int cchTextMax; int iImage; LPARAM lParam; -} TCITEM, *LPTCITEM; +} TCITEM32A, *LPTCITEM32A; + +typedef struct tagTCITEM32W +{ + UINT32 mask; + DWORD dwState; + DWORD dwStateMask; + LPWSTR pszText; + INT32 cchTextMax; + INT32 iImage; + LPARAM lParam; +} TCITEM32W, *LPTCITEM32W; + +#define TCITEM WINELIB_NAME_AW(TCITEM) +#define LPTCITEM WINELIB_NAME_AW(LPTCITEM) + #define TCN_FIRST (0U-550U) #define TCN_LAST (0U-580U) #define TCN_KEYDOWN (TCN_FIRST - 0) #define TCN_SELCHANGE (TCN_FIRST - 1) #define TCN_SELCHANGING (TCN_FIRST - 2) +#define TCN_GETOBJECT (TCN_FIRST - 3) /* ComboBoxEx control */ @@ -2522,6 +2635,36 @@ typedef struct tagNMIPADDRESS #define DATETIMEPICK_CLASS32W L"SysDateTimePick32" #define DATETIMEPICK_CLASS WINELIB_NAME_AW(DATETIMEPICK_CLASS) +#define DTM_FIRST 0x1000 + +#define DTM_GETSYSTEMTIME (DTM_FIRST+1) +#define DTM_SETSYSTEMTIME (DTM_FIRST+2) +#define DTM_GETRANGE (DTM_FIRST+3) +#define DTM_SETRANGE (DTM_FIRST+4) +#define DTM_SETFORMAT32A (DTM_FIRST+5) +#define DTM_SETFORMAT32W (DTM_FIRST + 50) +#define DTM_SETFORMAT WINELIB_NAME_AW(DTM_SETFORMAT) +#define DTM_SETMCCOLOR (DTM_FIRST+6) +#define DTM_GETMCCOLOR (DTM_FIRST+7) + +#define DTM_GETMONTHCAL (DTM_FIRST+8) + +#define DTM_SETMCFONT (DTM_FIRST+9) +#define DTM_GETMCFONT (DTM_FIRST+10) + + + + +#define GDT_ERROR -1 +#define GDT_VALID 0 +#define GDT_NONE 1 + +#define GDTR_MIN 0x0001 +#define GDTR_MAX 0x0002 + + + + /************************************************************************** * UNDOCUMENTED functions @@ -2624,6 +2767,13 @@ LRESULT WINAPI COMCTL32_SendNotifyEx (HWND32, HWND32, UINT32, LPNMHDR, DWORD); /* * Property sheet support (callback procs) */ + + +#define WC_PROPSHEET32A "SysPager" +#define WC_PROPSHEET32W L"SysPager" +#define WC_PROPSHEET WINELIB_NAME_AW(WC_PROPSHEET) + + struct _PROPSHEETPAGE32A; /** need to forward declare those structs **/ struct _PROPSHEETPAGE32W; struct _PSP; diff --git a/include/compobj.h b/include/compobj.h dissimilarity index 99% index ecd57eb3a5f..e1b372b000b 100644 --- a/include/compobj.h +++ b/include/compobj.h @@ -1,43 +1,8 @@ -#ifndef COMPOBJ_H -#define COMPOBJ_H - -#include "ole.h" - -struct tagGUID -{ - DWORD Data1; - WORD Data2; - WORD Data3; - BYTE Data4[8]; -}; - -typedef struct tagGUID GUID,*LPGUID,*REFGUID; -typedef struct tagGUID CLSID,*LPCLSID,*REFCLSID; -typedef struct tagGUID IID,*REFIID,*LPIID; - -OLESTATUS WINAPI StringFromCLSID16(const CLSID *id, LPOLESTR16*); -OLESTATUS WINAPI StringFromCLSID32(const CLSID *id, LPOLESTR32*); -#define StringFromCLSID WINELIB_NAME(StringFromCLSID) -OLESTATUS WINAPI CLSIDFromString16(LPCOLESTR16, CLSID *); -OLESTATUS WINAPI CLSIDFromString32(LPCOLESTR32, CLSID *); -#define CLSIDFromString WINELIB_NAME(CLSIDFromString) - -OLESTATUS WINAPI WINE_StringFromCLSID(const CLSID *id, LPSTR); - -INT32 WINAPI StringFromGUID2(REFGUID id, LPOLESTR32 str, INT32 cmax); - - -#ifdef INITGUID -#define DEFINE_GUID(name, l, w1, w2, b1, b2, b3, b4, b5, b6, b7, b8) \ - const GUID name =\ - { l, w1, w2, { b1, b2, b3, b4, b5, b6, b7, b8 } } -#else -#define DEFINE_GUID(name, l, w1, w2, b1, b2, b3, b4, b5, b6, b7, b8) \ - extern const GUID name -#endif - -#define DEFINE_OLEGUID(name, l, w1, w2) \ - DEFINE_GUID(name, l, w1, w2, 0xC0,0,0,0,0,0,0,0x46) - -#define DEFINE_SHLGUID(name, l, w1, w2) DEFINE_OLEGUID(name,l,w1,w2) -#endif +#ifndef __WINE_COMPOBJ_H +#define __WINE_COMPOBJ_H + +/* "compobj.h" is obsolete, you should include "objbase.h" instead */ + +#include "objbase.h" + +#endif /* __WINE_COMPOBJ_H */ diff --git a/include/config.h.in b/include/config.h.in index 75367e9bb6f..9f1223440a8 100644 --- a/include/config.h.in +++ b/include/config.h.in @@ -69,6 +69,9 @@ /* Define if the struct statfs is defined by */ #undef STATFS_DEFINED_BY_SYS_MOUNT +/* Define if ncurses have the new resizeterm function */ +#undef HAVE_RESIZETERM + /* Define if IPX should use netipx/ipx.h from libc */ #undef HAVE_IPX_GNU @@ -153,6 +156,9 @@ /* Define if you have the header file. */ #undef HAVE_SYS_CDIO_H +/* Define if you have the header file. */ +#undef HAVE_SYS_FILE_H + /* Define if you have the header file. */ #undef HAVE_SYS_FILIO_H diff --git a/include/d3d.h b/include/d3d.h index d5729331d13..34e0cacc7c3 100644 --- a/include/d3d.h +++ b/include/d3d.h @@ -41,6 +41,65 @@ typedef struct IDirect3DTexture2 IDirect3DTexture, *LPDIRECT3DTEXTURE, IDir typedef struct IDirect3DExecuteBuffer IDirect3DExecuteBuffer, *LPDIRECT3DEXECUTEBUFFER; /* ******************************************************************** + Error Codes + ******************************************************************** */ +#define D3D_OK DD_OK +#define D3DERR_BADMAJORVERSION MAKE_DDHRESULT(700) +#define D3DERR_BADMINORVERSION MAKE_DDHRESULT(701) +#define D3DERR_INVALID_DEVICE MAKE_DDHRESULT(705) +#define D3DERR_INITFAILED MAKE_DDHRESULT(706) +#define D3DERR_DEVICEAGGREGATED MAKE_DDHRESULT(707) +#define D3DERR_EXECUTE_CREATE_FAILED MAKE_DDHRESULT(710) +#define D3DERR_EXECUTE_DESTROY_FAILED MAKE_DDHRESULT(711) +#define D3DERR_EXECUTE_LOCK_FAILED MAKE_DDHRESULT(712) +#define D3DERR_EXECUTE_UNLOCK_FAILED MAKE_DDHRESULT(713) +#define D3DERR_EXECUTE_LOCKED MAKE_DDHRESULT(714) +#define D3DERR_EXECUTE_NOT_LOCKED MAKE_DDHRESULT(715) +#define D3DERR_EXECUTE_FAILED MAKE_DDHRESULT(716) +#define D3DERR_EXECUTE_CLIPPED_FAILED MAKE_DDHRESULT(717) +#define D3DERR_TEXTURE_NO_SUPPORT MAKE_DDHRESULT(720) +#define D3DERR_TEXTURE_CREATE_FAILED MAKE_DDHRESULT(721) +#define D3DERR_TEXTURE_DESTROY_FAILED MAKE_DDHRESULT(722) +#define D3DERR_TEXTURE_LOCK_FAILED MAKE_DDHRESULT(723) +#define D3DERR_TEXTURE_UNLOCK_FAILED MAKE_DDHRESULT(724) +#define D3DERR_TEXTURE_LOAD_FAILED MAKE_DDHRESULT(725) +#define D3DERR_TEXTURE_SWAP_FAILED MAKE_DDHRESULT(726) +#define D3DERR_TEXTURE_LOCKED MAKE_DDHRESULT(727) +#define D3DERR_TEXTURE_NOT_LOCKED MAKE_DDHRESULT(728) +#define D3DERR_TEXTURE_GETSURF_FAILED MAKE_DDHRESULT(729) +#define D3DERR_MATRIX_CREATE_FAILED MAKE_DDHRESULT(730) +#define D3DERR_MATRIX_DESTROY_FAILED MAKE_DDHRESULT(731) +#define D3DERR_MATRIX_SETDATA_FAILED MAKE_DDHRESULT(732) +#define D3DERR_MATRIX_GETDATA_FAILED MAKE_DDHRESULT(733) +#define D3DERR_SETVIEWPORTDATA_FAILED MAKE_DDHRESULT(734) +#define D3DERR_INVALIDCURRENTVIEWPORT MAKE_DDHRESULT(735) +#define D3DERR_INVALIDPRIMITIVETYPE MAKE_DDHRESULT(736) +#define D3DERR_INVALIDVERTEXTYPE MAKE_DDHRESULT(737) +#define D3DERR_TEXTURE_BADSIZE MAKE_DDHRESULT(738) +#define D3DERR_INVALIDRAMPTEXTURE MAKE_DDHRESULT(739) +#define D3DERR_MATERIAL_CREATE_FAILED MAKE_DDHRESULT(740) +#define D3DERR_MATERIAL_DESTROY_FAILED MAKE_DDHRESULT(741) +#define D3DERR_MATERIAL_SETDATA_FAILED MAKE_DDHRESULT(742) +#define D3DERR_MATERIAL_GETDATA_FAILED MAKE_DDHRESULT(743) +#define D3DERR_INVALIDPALETTE MAKE_DDHRESULT(744) +#define D3DERR_ZBUFF_NEEDS_SYSTEMMEMORY MAKE_DDHRESULT(745) +#define D3DERR_ZBUFF_NEEDS_VIDEOMEMORY MAKE_DDHRESULT(746) +#define D3DERR_SURFACENOTINVIDMEM MAKE_DDHRESULT(747) +#define D3DERR_LIGHT_SET_FAILED MAKE_DDHRESULT(750) +#define D3DERR_LIGHTHASVIEWPORT MAKE_DDHRESULT(751) +#define D3DERR_LIGHTNOTINTHISVIEWPORT MAKE_DDHRESULT(752) +#define D3DERR_SCENE_IN_SCENE MAKE_DDHRESULT(760) +#define D3DERR_SCENE_NOT_IN_SCENE MAKE_DDHRESULT(761) +#define D3DERR_SCENE_BEGIN_FAILED MAKE_DDHRESULT(762) +#define D3DERR_SCENE_END_FAILED MAKE_DDHRESULT(763) +#define D3DERR_INBEGIN MAKE_DDHRESULT(770) +#define D3DERR_NOTINBEGIN MAKE_DDHRESULT(771) +#define D3DERR_NOVIEWPORTS MAKE_DDHRESULT(772) +#define D3DERR_VIEWPORTDATANOTSET MAKE_DDHRESULT(773) +#define D3DERR_VIEWPORTHASNODEVICE MAKE_DDHRESULT(774) +#define D3DERR_NOCURRENTVIEWPORT MAKE_DDHRESULT(775) + +/* ******************************************************************** Enums ******************************************************************** */ #define D3DNEXT_NEXT 0x01l @@ -1202,7 +1261,12 @@ typedef struct IDirect3DTexture2_VTable { struct IDirect3DTexture2 { LPDIRECT3DTEXTURE2_VTABLE lpvtbl; DWORD ref; - + + void *D3Ddevice; /* I put (void *) to use the same pointer for both + Direct3D and Direct3D2 */ +#ifdef HAVE_MESAGL + GLuint tex_name; +#endif LPDIRECTDRAWSURFACE3 surface; }; diff --git a/include/ddraw.h b/include/ddraw.h index 4b5e917132e..fdb74dce05c 100644 --- a/include/ddraw.h +++ b/include/ddraw.h @@ -1,6 +1,8 @@ #ifndef __WINE_DDRAW_H #define __WINE_DDRAW_H +#include "wine/obj_base.h" + #include "config.h" #ifndef X_DISPLAY_MISSING @@ -14,7 +16,6 @@ #define DIRECTDRAW_VERSION 0x0500 #endif /* DIRECTDRAW_VERSION */ - DEFINE_GUID( CLSID_DirectDraw, 0xD7B70EE0,0x4340,0x11CF,0xB0,0x63,0x00,0x20,0xAF,0xC2,0xCD,0x35 ); DEFINE_GUID( CLSID_DirectDrawClipper, 0x593817A0,0x7DB3,0x11CF,0xA2,0xDE,0x00,0xAA,0x00,0xb9,0x33,0x56 ); DEFINE_GUID( IID_IDirectDraw, 0x6C14DB80,0xA733,0x11CE,0xA5,0x21,0x00,0x20,0xAF,0x0B,0xE5,0x60 ); @@ -900,6 +901,7 @@ struct _common_directdrawdata { We need it also in DGA mode to make some games (for example Monkey Island III work) */ ATOM winclass; HWND32 window; + Window drawable; PAINTSTRUCT32 ps; }; @@ -910,7 +912,6 @@ struct _dga_directdrawdata { }; struct _xlib_directdrawdata { - Window drawable; int paintable; #ifdef HAVE_LIBXXSHM diff --git a/include/debug.h b/include/debug.h index f5e6447cf9b..8d0ea7ab6aa 100644 --- a/include/debug.h +++ b/include/debug.h @@ -101,57 +101,58 @@ #define dbch_profile 93 #define dbch_progress 94 #define dbch_prop 95 -#define dbch_psapi 96 -#define dbch_psdrv 97 -#define dbch_ras 98 -#define dbch_rebar 99 -#define dbch_reg 100 -#define dbch_region 101 -#define dbch_relay 102 -#define dbch_resource 103 -#define dbch_scroll 104 -#define dbch_security 105 -#define dbch_segment 106 -#define dbch_selector 107 -#define dbch_sem 108 -#define dbch_sendmsg 109 -#define dbch_server 110 -#define dbch_shell 111 -#define dbch_shm 112 -#define dbch_snoop 113 -#define dbch_sound 114 -#define dbch_static 115 -#define dbch_statusbar 116 -#define dbch_stress 117 -#define dbch_string 118 -#define dbch_syscolor 119 -#define dbch_system 120 -#define dbch_tab 121 -#define dbch_task 122 -#define dbch_text 123 -#define dbch_thread 124 -#define dbch_thunk 125 -#define dbch_timer 126 -#define dbch_toolbar 127 -#define dbch_toolhelp 128 -#define dbch_tooltips 129 -#define dbch_trackbar 130 -#define dbch_treeview 131 -#define dbch_tweak 132 -#define dbch_uitools 133 -#define dbch_updown 134 -#define dbch_ver 135 -#define dbch_virtual 136 -#define dbch_vxd 137 -#define dbch_wave 138 -#define dbch_win 139 -#define dbch_win16drv 140 -#define dbch_win32 141 -#define dbch_wing 142 -#define dbch_winsock 143 -#define dbch_wnet 144 -#define dbch_x11 145 -#define dbch_x11drv 146 +#define dbch_propsheet 96 +#define dbch_psapi 97 +#define dbch_psdrv 98 +#define dbch_ras 99 +#define dbch_rebar 100 +#define dbch_reg 101 +#define dbch_region 102 +#define dbch_relay 103 +#define dbch_resource 104 +#define dbch_scroll 105 +#define dbch_security 106 +#define dbch_segment 107 +#define dbch_selector 108 +#define dbch_sem 109 +#define dbch_sendmsg 110 +#define dbch_server 111 +#define dbch_shell 112 +#define dbch_shm 113 +#define dbch_snoop 114 +#define dbch_sound 115 +#define dbch_static 116 +#define dbch_statusbar 117 +#define dbch_stress 118 +#define dbch_string 119 +#define dbch_syscolor 120 +#define dbch_system 121 +#define dbch_tab 122 +#define dbch_task 123 +#define dbch_text 124 +#define dbch_thread 125 +#define dbch_thunk 126 +#define dbch_timer 127 +#define dbch_toolbar 128 +#define dbch_toolhelp 129 +#define dbch_tooltips 130 +#define dbch_trackbar 131 +#define dbch_treeview 132 +#define dbch_tweak 133 +#define dbch_uitools 134 +#define dbch_updown 135 +#define dbch_ver 136 +#define dbch_virtual 137 +#define dbch_vxd 138 +#define dbch_wave 139 +#define dbch_win 140 +#define dbch_win16drv 141 +#define dbch_win32 142 +#define dbch_wing 143 +#define dbch_winsock 144 +#define dbch_wnet 145 +#define dbch_x11 146 +#define dbch_x11drv 147 /* Definitions for classes identifiers */ #define dbcl_fixme 0 #define dbcl_err 1 diff --git a/include/debugdefs.h b/include/debugdefs.h index ea469b5625c..cd1a4721322 100644 --- a/include/debugdefs.h +++ b/include/debugdefs.h @@ -4,7 +4,7 @@ #include "debugtools.h" #endif -#define DEBUG_CHANNEL_COUNT 147 +#define DEBUG_CHANNEL_COUNT 148 #ifdef DEBUG_RUNTIME short debug_msg_enabled[][DEBUG_CLASS_COUNT] = { {1, 1, 0, 0}, @@ -154,6 +154,7 @@ short debug_msg_enabled[][DEBUG_CLASS_COUNT] = { {1, 1, 0, 0}, {1, 1, 0, 0}, {1, 1, 0, 0}, +{1, 1, 0, 0}, }; const char* debug_ch_name[] = { "accel", @@ -252,6 +253,7 @@ const char* debug_ch_name[] = { "profile", "progress", "prop", +"propsheet", "psapi", "psdrv", "ras", diff --git a/include/dinput.h b/include/dinput.h index 03978e2f0da..0bf86c33c90 100644 --- a/include/dinput.h +++ b/include/dinput.h @@ -1,6 +1,8 @@ #ifndef _WINE_DINPUT_H #define _WINE_DINPUT_H +#include "unknwn.h" + #define STDMETHOD(xfn) HRESULT (CALLBACK *fn##xfn) #define STDMETHOD_(ret,xfn) ret (CALLBACK *fn##xfn) #define PURE diff --git a/include/dosexe.h b/include/dosexe.h index 4f5c16b0c06..530cdd77e3b 100644 --- a/include/dosexe.h +++ b/include/dosexe.h @@ -51,5 +51,7 @@ extern void MZ_Tick( WORD handle ); extern HINSTANCE16 MZ_CreateProcess( LPCSTR name, LPCSTR cmdline, LPCSTR env, BOOL32 inherit, LPSTARTUPINFO32A startup, LPPROCESS_INFORMATION info ); extern int DOSVM_Enter( PCONTEXT context ); +extern void DOSVM_SetTimer( unsigned ticks ); +extern unsigned DOSVM_GetTimer( void ); #endif /* __WINE_DOSEXE_H */ diff --git a/include/dplay.h b/include/dplay.h index fd9552ee819..d6d55068d62 100644 --- a/include/dplay.h +++ b/include/dplay.h @@ -2,6 +2,8 @@ #ifndef __WINE_DPLAY_H #define __WINE_DPLAY_H +#include "unknwn.h" + #pragma pack(1) /* Return Values for Direct Play */ diff --git a/include/dsound.h b/include/dsound.h index 2b2bccadf0d..e944fabb849 100644 --- a/include/dsound.h +++ b/include/dsound.h @@ -3,7 +3,6 @@ #include "windows.h" #include "winbase.h" -#include "compobj.h" #include "mmsystem.h" #include "d3d.h" /*FIXME: Need to break out d3dtypes.h */ diff --git a/include/flatsb.h b/include/flatsb.h new file mode 100644 index 00000000000..2103ada05f7 --- /dev/null +++ b/include/flatsb.h @@ -0,0 +1,20 @@ +/* + * Date and time picker class extra info + * + * Copyright 1998 Eric Kohl + */ + +#ifndef __WINE_FLATSB_H +#define __WINE_FLATSB_H + +typedef struct tagFLATSB_INFO +{ + DWORD dwDummy; /* just to keep the compiler happy ;-) */ + +} FLATSB_INFO, *LPFLATSB_INFO; + + +extern VOID FLATSB_Register (VOID); +extern VOID FLATSB_Unregister (VOID); + +#endif /* __WINE_FLATSB_H */ diff --git a/include/interfaces.h b/include/interfaces.h index 26f28d516f5..a7621f6a5ac 100644 --- a/include/interfaces.h +++ b/include/interfaces.h @@ -48,7 +48,6 @@ DEFINE_GUID(IID_ISupportErrorInfo, 0xDF0B3D60,0x547D,0x101B,0x8E,0x65, #include "objbase.h" #define THIS LPCLASSFACTORY this -typedef struct IClassFactory *LPCLASSFACTORY,IClassFactory; typedef struct { STDMETHOD(QueryInterface) (THIS_ REFIID riid,LPVOID FAR* ppvObj) PURE; STDMETHOD_(ULONG,AddRef) (THIS) PURE; @@ -57,14 +56,9 @@ typedef struct { STDMETHOD(LockServer) (THIS_ BOOL32) PURE; } *LPCLASSFACTORY_VTABLE,IClassFactory_VTable; -struct IClassFactory { - LPCLASSFACTORY_VTABLE lpvtbl; - DWORD ref; -}; #undef THIS #define THIS LPMALLOC32 this -typedef struct IMalloc32 *LPMALLOC32,IMalloc32; typedef struct { STDMETHOD(QueryInterface) (THIS_ REFIID riid,LPVOID FAR* ppvObj) PURE; STDMETHOD_(ULONG,AddRef) (THIS) PURE; @@ -78,14 +72,9 @@ typedef struct { STDMETHOD_(LPVOID,HeapMinimize) ( THIS ); } *LPMALLOC32_VTABLE,IMalloc32_VTable; -struct IMalloc32 { - LPMALLOC32_VTABLE lpvtbl; - DWORD ref; -}; #undef THIS #define THIS LPMALLOC16 this -typedef struct IMalloc16 *LPMALLOC16,IMalloc16; typedef struct { STDMETHOD(QueryInterface) (THIS_ REFIID riid,LPVOID FAR* ppvObj) PURE; STDMETHOD_(ULONG,AddRef) (THIS) PURE; @@ -99,14 +88,6 @@ typedef struct { STDMETHOD_(LPVOID,HeapMinimize) ( THIS ); } *LPMALLOC16_VTABLE,IMalloc16_VTable; -struct IMalloc16 { - LPMALLOC16_VTABLE lpvtbl; - DWORD ref; - /* Gmm, I think one is not enough, we should probably manage a list of - * heaps - */ - HGLOBAL16 heap; -}; #undef THIS /* private prototypes for the constructors */ diff --git a/include/main.h b/include/main.h index dc0762a5c43..8e4af7554c9 100644 --- a/include/main.h +++ b/include/main.h @@ -12,6 +12,9 @@ extern HINSTANCE32 MAIN_WinelibInit( int *argc, char *argv[] ); extern int MAIN_GetLanguageID(char*lang, char*country, char*charset, char*dialect); extern BOOL32 RELAY_Init(void); +extern int RELAY_ShowDebugmsgRelay(const char *func); extern void* CALL32_Init(void); +extern BOOL32 THUNK_Init(void); + #endif /* __WINE_MAIN_H */ diff --git a/include/miscemu.h b/include/miscemu.h index 9b2598b858c..558f8410187 100644 --- a/include/miscemu.h +++ b/include/miscemu.h @@ -11,7 +11,10 @@ #include "winnt.h" #include "ldt.h" - /* msdos/dosmem.c */ +/* msdos/dosconf.c */ +extern int DOSCONF_ReadConfig(void); + +/* msdos/dosmem.c */ extern HANDLE16 DOSMEM_BiosSeg; extern DWORD DOSMEM_CollateTable; diff --git a/include/msdos.h b/include/msdos.h index dccb0720734..ca68cf2711b 100644 --- a/include/msdos.h +++ b/include/msdos.h @@ -196,4 +196,25 @@ void WINAPI DOS3Call( CONTEXT *context ); void do_mscdex( CONTEXT *context ); void do_mscdex_dd (CONTEXT * context, int dorealmode); +#define DOSCONF_MEM_HIGH 0x0001 +#define DOSCONF_MEM_UMB 0x0002 +#define DOSCONF_NUMLOCK 0x0004 +#define DOSCONF_KEYB_CONV 0x0008 + +typedef struct { + char lastdrive; + int brk_flag; + int files; + int stacks_nr; + int stacks_sz; + int buf; + int buf2; + int fcbs; + int flags; + char *shell; + char *country; +} DOSCONF; + +extern DOSCONF DOSCONF_config; + #endif /* __WINE_MSDOS_H */ diff --git a/include/multimedia.h b/include/multimedia.h index 4d97843113c..11ac6a4ba11 100644 --- a/include/multimedia.h +++ b/include/multimedia.h @@ -58,8 +58,8 @@ extern UINT16 MCI_FirstDevID(void); extern UINT16 MCI_NextDevID(UINT16 wDevID); extern BOOL32 MCI_DevIDValid(UINT16 wDevID); -extern int MCI_MapMsg16To32A(WORD uDevType, WORD wMsg, DWORD* lParam); -extern int MCI_UnMapMsg16To32A(WORD uDevTyp, WORD wMsg, DWORD lParam); +extern int MCI_MapMsg16To32A(WORD uDevType, WORD wMsg, DWORD* lParam); +extern int MCI_UnMapMsg16To32A(WORD uDevTyp, WORD wMsg, DWORD lParam); typedef LONG (*MCIPROC16)(DWORD, HDRVR16, WORD, DWORD, DWORD); typedef LONG (*MCIPROC32)(DWORD, HDRVR16, DWORD, DWORD, DWORD); @@ -69,7 +69,9 @@ extern WORD MCI_GetDevType(LPCSTR str); extern DWORD MCI_WriteString(LPSTR lpDstStr, DWORD dstSize, LPCSTR lpSrcStr); extern const char* MCI_CommandToString(UINT16 wMsg); -extern DWORD MCI_SendCommandAsync32(UINT32 wDevID, UINT32 wMsg, DWORD dwParam1, DWORD dwParam2); + +extern DWORD MCI_SendCommand32(UINT32 wDevID, UINT16 wMsg, DWORD dwParam1, DWORD dwParam2); +extern DWORD MCI_SendCommandAsync32(UINT32 wDevID, UINT32 wMsg, DWORD dwParam1, DWORD dwParam2); LONG MCIWAVE_DriverProc32(DWORD dwDevID, HDRVR16 hDriv, DWORD wMsg, DWORD dwParam1, DWORD dwParam2); diff --git a/include/objbase.h b/include/objbase.h dissimilarity index 99% index f7c569766d8..38a540ce743 100644 --- a/include/objbase.h +++ b/include/objbase.h @@ -1,468 +1,116 @@ -#ifndef __WINE_OBJBASE_H -#define __WINE_OBJBASE_H - - -/* - * The goal of the following set of definitions is to provide a way to use the same - * header file definitions to provide both a C interface and a C++ object oriented - * interface to COM interfaces. The type of interface is selected automatically - * depending on the language but it is always possible to get the C interface in C++ - * by defining CINTERFACE. - * - * It is based on the following assumptions: - * - all COM interfaces derive from IUnknown, this should not be a problem. - * - the header file only defines the interface, the actual fields are defined - * separately in the C file implementing the interface. - * - no COM method returns void. This seems to be the case but otherwise we could support this - * case by having one more set of macros. - * - * The natural approach to this problem would be to make sure we get a C++ class and - * virtual methods in C++ and a structure with a table of pointer to functions in C. - * Unfortunately the layout of the virtual table is compiler specific, the layout of - * g++ virtual tables is not the same as that of an egcs virtual table which is not the - * same as that generated by Visual C+. There are workarounds to make the virtual tables - * compatible via padding but unfortunately the one which is imposed to the WINE emulator - * by the Windows binaries, i.e. the Visual C++ one, is the most compact of all. - * - * So the solution I finally adopted does not use virtual tables. Instead I use inline - * non virtual methods that dereference the method pointer themselves and perform the call. - * - * Let's take Direct3D as an example: - * - * #define ICOM_INTERFACE IDirect3D - * ICOM_BEGIN(IDirect3D,IUnknown) - * ICOM_METHOD1(HRESULT,Initialize, REFIID,); - * ICOM_METHOD2(HRESULT,EnumDevices, LPD3DENUMDEVICESCALLBACK,, LPVOID,); - * ICOM_METHOD2(HRESULT,CreateLight, LPDIRECT3DLIGHT*,, IUnknown*,); - * ICOM_METHOD2(HRESULT,CreateMaterial,LPDIRECT3DMATERIAL*,, IUnknown*,); - * ICOM_METHOD2(HRESULT,CreateViewport,LPDIRECT3DVIEWPORT*,, IUnknown*,); - * ICOM_METHOD2(HRESULT,FindDevice, LPD3DFINDDEVICESEARCH,, LPD3DFINDDEVICERESULT,); - * ICOM_END(IDirect3D) - * #undef ICOM_INTERFACE - * - * #if !defined(__cplusplus) || defined(CINTERFACE) - * // *** IUnknown methods *** // - * #define IDirect3D_QueryInterface(p,a,b) ICOM_ICALL2(IUnknown,QueryInterface,p,a,b) - * #define IDirect3D_AddRef(p) ICOM_ICALL (IUnknown,AddRef,p) - * #define IDirect3D_Release(p) ICOM_ICALL (IUnknown,Release,p) - * // *** IDirect3D methods *** // - * #define IDirect3D_Initialize(p,a) ICOM_CALL1(Initialize,p,a) - * #define IDirect3D_EnumDevices(p,a,b) ICOM_CALL2(EnumDevice,p,a,b) - * #define IDirect3D_CreateLight(p,a,b) ICOM_CALL2(CreateLight,p,a,b) - * #define IDirect3D_CreateMaterial(p,a,b) ICOM_CALL2(CreateMaterial,p,a,b) - * #define IDirect3D_CreateViewport(p,a,b) ICOM_CALL2(CreateViewport,p,a,b) - * #define IDirect3D_FindDevice(p,a,b) ICOM_CALL2(FindDevice,p,a,b) - * #endif - * - * Comments: - * - The ICOM_INTERFACE is used in the ICOM_METHOD macros for the 'this' pointer and to cast - * pointers. Defining this macro here saves us the trouble of having to repeat the interface - * name everywhere. Note haowever that because of the way macros work a macro like ICOM_METHOD1 - * cannot use 'ICOM_INTERFACE##_VTABLE' because this would give 'ICOM_INTERFACE_VTABLE' and not - * 'IDirect3D_VTABLE'. - * - ICOM_BEGIN and ICOM_END are responsible for generating whatever structure is appropriate for - * representing the interface in the current language. In C this is a couple of structs in C++ - * it's a class. The first parameter is the interface name and the second one is the interface - * we inherit from. The reason why you have to repeat the interface name is because that's the - * only way these macro can successfully output "IDirect3D_VTABLE'. Trying to use ICOM_INTERFACE - * would, as in ICOM_METHOD, only yield 'ICOM_INTERFACE_VTABLE'. - * - With the way ICOM_BEGIN works you don't have to repeat the definitions of the methods of the - * parent interface. They are automatically inherited both in C and in C++. - * - In C++ the ICOM_METHOD macros generate a function prototype and a call to a function pointer - * method. This means using once 't1 p1, t2 p2, ...' and once 'p1, p2' without the types. The - * only way I found to handle this is to have one ICOM_METHOD macro per number of parameters and - * to have it take only the type information (with const if necessary) as parameters. - * The 'undef ICOM_INTERFACE' is here to remind you that using ICOM_INTERFACE in the following - * macros will not work. This time it's because the ICOM_CALL macro expansion is done only once - * the 'IDirect3D_Xxx' macro is expanded. And by that time ICOM_INTERFACE will be long gone - * anyway. - * - You may have noticed the double commas after each parameter type. This allows you to put the - * name of that parameter which I think is good for documentation. It is not required and since - * I did not know what to put there for this example (I could only find doc about IDirect3D2), - * I left them blank. - * - Finally the set of 'IDirect3D_Xxx' macros is a standard set of macros defined to ease access - * to the interface methods in C. Unfortunately I don't see any way to avoid having to duplicate - * the inherited method definitions there. We must use ICOM_ICALL to invoke inherited methods, - * because in C we have to cast the virtual table pointer, and we should use the ICOM_CALL - * method in the other cases. This time I could have used a trick to use only one macro whatever - * the number of parameters but I prefered to have it work the same way as above. - * - You probably have noticed that we don't define the fields we need to actually implement this - * interface: reference count, pointer to other resources and miscellaneous fields. That's - * because it's not needed, and the user will anyway only manipulate pointers to this structure - * so he does not need to know its real size. Of course on the implementation side we have the - * real definition of the interface structure and they should match what the macros yield in - * each language (or conversely). - * - * - * In C this gives: - * typedef struct IDirect3D_VTABLE IDirect3D_VTABLE; - * struct IDirect3D { - * IDirect3D_VTABLE* lpvtbl; - * }; - * struct IDirect3D_VTABLE { - * IUnknown_VTABLE bvt; - * HRESULT (*fnInitialize)(IDirect3D* me, REFIID a); - * HRESULT (*fnEnumDevices)(IDirect3D* me, LPD3DENUMDEVICESCALLBACK a, LPVOID b); - * HRESULT (*fnCreateLight)(IDirect3D* me, LPDIRECT3DLIGHT* a, IUnknown* b); - * HRESULT (*fnCreateMaterial)(IDirect3D* me, LPDIRECT3DMATERIAL* a, IUnknown* b); - * HRESULT (*fnCreateViewport)(IDirect3D* me, LPDIRECT3DVIEWPORT* a, IUnknown* b); - * HRESULT (*fnFindDevice)(IDirect3D* me, LPD3DFINDDEVICESEARCH a, LPD3DFINDDEVICERESULT b); - * }; - * - * #if !defined(__cplusplus) || defined(CINTERFACE) - * // *** IUnknown methods *** // - * #define IDirect3D_QueryInterface(p,a,b) ((IUnknown_VTABLE*)(p)->lpvtbl)->fnQueryInterface((IUnknown*)p,a,b) - * #define IDirect3D_AddRef(p) ((IUnknown_VTABLE*)(p)->lpvtbl)->fnAddRef((IUnknown*)p) - * #define IDirect3D_Release(p) ((IUnknown_VTABLE*)(p)->lpvtbl)->fnRelease((IUnknown*)p) - * // *** IDirect3D methods *** // - * #define IDirect3D_Initialize(p,a) (p)->lpvtbl->fnInitialize(p,a) - * #define IDirect3D_EnumDevices(p,a,b) (p)->lpvtbl->fnEnumDevice(p,a,b) - * #define IDirect3D_CreateLight(p,a,b) (p)->lpvtbl->fnCreateLight(p,a,b) - * #define IDirect3D_CreateMaterial(p,a,b) (p)->lpvtbl->fnCreateMaterial(p,a,b) - * #define IDirect3D_CreateViewport(p,a,b) (p)->lpvtbl->fnCreateViewport(p,a,b) - * #define IDirect3D_FindDevice(p,a,b) (p)->lpvtbl->fnFindDevice(p,a,b) - * #endif - * - * Comments: - * - IDirect3D only contains a pointer to the IDirect3D virtual/jump table. This is the only thing - * the user needs to know to use the interface. Of course the structure we will define to - * implement this interface will have more fields but the first one will match this pointer. - * - The code generated by ICOM_BEGIN goes up to the bvt field in the IDirect3D virtual table. - * This bvt field is what saves us from having to duplicate the inherited method definitions. - * It's a shame that C (gcc) will not allow unnamed structs. If this was possible we could - * seamlessly inherit and use the parent's interface function pointers. - * - What follows is just a bunch of function pointer definitions generated by the ICOM_METHOD - * macros. The implementation will fill this jump table with appropriate values in a static - * variable and initialize the lpvtbl field to point to this variable. - * - The IDirect3D_Xxx macros then just derefence the lpvtbl pointer and use the function pointer - * corresponding to the macro name. This emulates the behavior of a virtual table and should be - * about as fast. In the case of inherited methods we have some additional casting to do to - * because the inherited methods are defined in the bvt field or maybe further imbricated. Since - * the effect of the bvt field is that we inherit the parent virtual table fields this cast is - * relatively inocuous. A similar cast must be performed on the interface pointer before the - * invoked method will accept it. Despite all these casts there is little chance that you call a - * method on the wrong type of interface because the function names still have to match. But this - * is the only thing that will make the compilation fail. - * - * - * And in C++ (with gcc's g++): - * - * typedef struct IDirect3D: public IUnknown { - * private: HRESULT (*fnInitialize)(IDirect3D* me, REFIID a); - * public: inline HRESULT Initialize(REFIID a) { return ((IDirect3D*)t.lpvtbl)->fnInitialize(this,a); }; - * private: HRESULT (*fnEnumDevices)(IDirect3D* me, LPD3DENUMDEVICESCALLBACK a, LPVOID b); - * public: inline HRESULT EnumDevices(LPD3DENUMDEVICESCALLBACK a, LPVOID b) - * { return ((IDirect3D*)t.lpvtbl)->fnEnumDevices(this,a,b); }; - * private: HRESULT (*fnCreateLight)(IDirect3D* me, LPDIRECT3DLIGHT* a, IUnknown* b); - * public: inline HRESULT CreateLight(LPDIRECT3DLIGHT* a, IUnknown* b) - * { return ((IDirect3D*)t.lpvtbl)->fnCreateLight(this,a,b); }; - * private: HRESULT (*fnCreateMaterial)(IDirect3D* me, LPDIRECT3DMATERIAL* a, IUnknown* b); - * public: inline HRESULT CreateMaterial(LPDIRECT3DMATERIAL* a, IUnknown* b) - * { return ((IDirect3D*)t.lpvtbl)->fnCreateMaterial(this,a,b); }; - * private: HRESULT (*fnCreateViewport)(IDirect3D* me, LPDIRECT3DVIEWPORT* a, IUnknown* b); - * public: inline HRESULT CreateViewport(LPDIRECT3DVIEWPORT* a, IUnknown* b) - * { return ((IDirect3D*)t.lpvtbl)->fnCreateViewport(this,a,b); }; - * private: HRESULT (*fnFindDevice)(IDirect3D* me, LPD3DFINDDEVICESEARCH a, LPD3DFINDDEVICERESULT b); - * public: inline HRESULT FindDevice(LPD3DFINDDEVICESEARCH a, LPD3DFINDDEVICERESULT b) - * { return ((IDirect3D*)t.lpvtbl)->fnFindDevice(this,a,b); }; - * }; - * - * Comments: - * - In C++ IDirect3D does double duty as both the virtual/jump table and as the interface - * definition. The reason for this is to avoid having to duplicate the mehod definitions: once - * to have the function pointers in the jump table and once to have the methods in the interface - * class. Here one macro can generate both. This means though that the first pointer, t.lpvtbl - * defined in IUnknown, must be interpreted as the jump table pointer if we interpret the - * structure as the the interface class, and as the function pointer to the QueryInterface - * method, t.fnQueryInterface, if we interpret the structure as the jump table. Fortunately this - * gymnastic is entirely taken care of in the header of IUnknown. - * - Of course in C++ we use inheritance so that we don't have to duplicate the method definitions. - * - Since IDirect3D does double duty, each ICOM_METHOD macro defines both a function pointer and - * a non-vritual inline method which dereferences it and calls it. This way this method behaves - * just like a virtual method but does not create a true C++ virtual table which would break the - * structure layout. If you look at the implementation of these methods you'll notice that they - * would not work for void functions. We have to return something and fortunately this seems to - * be what all the COM methods do (otherwise we would need another set of macros). - * - Note how the ICOM_METHOD generates both function prototypes mixing types and formal parameter - * names and the method invocation using only the formal parameter name. This is the reason why - * we need different macros to handle different numbers of parameters. - * - Finally there is no IDirect3D_Xxx macro. These are not needed in C++ unless the CINTERFACE - * macro is defined in which case we would not be here. - * - * - * Implementing a COM interface. - * - * This continues the above example.I assume the implementation is in C but it would probably - * be similar in C++. - * - * typedef struct _IDirect3D { - * void* lpvtbl; - * // ... - * - * } _IDirect3D; - * - * static ICOM_VTABLE(IDirect3D) d3dvt; - * - * // implement the IDirect3D methods here - * - * int IDirect3D_fnQueryInterface(LPUNKNOWN me) - * { - * ICOM_THIS(IDirect3D,me); - * // ... - * } - * - * // ... - * - * static ICOM_VTABLE(IDirect3D) d3dvt = { - * { - * IDirect3D_fnQueryInterface, - * IUnknown_fnAdd, - * IUnknown_fnAdd2 - * }, - * IDirect3D_fnInitialize, - * IDirect3D_fnSetWidth - * }; - * - * Comments: - * - We first define what the interface really contains. This is th e_IDirect3D structure. The - * first field must of course be the virtual table pointer. Everything else is free. - * - Then we predeclare our static virtual table variable, we will need its address in some - * methods to initialize the virtual table pointer of the returned interface objects. - * - Then we implement the interface methods. To match what has been declared in the header file - * they must take a pointer to a IDirect3D structure so we must cast it to an _IDirect3D so that - * we can manipulate the fields. This is performed by the ICOM_THIS macro. - * - Finally we initialize the virtual table. The inherited methods must be in curly brackets to - * match the parent interface's virtual table definition. - */ - - -#define ICOM_VTABLE(iface) iface##_VTABLE - - -#if defined(__cplusplus) && !defined(CINTERFACE) -/* C++ interface */ - -#define ICOM_BEGIN(iface,ibase) \ - typedef struct iface: public ibase { - -#define ICOM_METHOD(ret,xfn) \ - private: ret (CALLBACK *fn##xfn)(ICOM_INTERFACE* me); \ - public: inline ret (CALLBACK xfn)(void) { return ((ICOM_INTERFACE*)t.lpvtbl)->fn##xfn(this); }; - -#define ICOM_METHOD1(ret,xfn,ta,na) \ - private: ret (CALLBACK *fn##xfn)(ICOM_INTERFACE* me,ta a); \ - public: inline ret (CALLBACK xfn)(ta a) { return ((ICOM_INTERFACE*)t.lpvtbl)->fn##xfn(this,a); }; - -#define ICOM_METHOD2(ret,xfn,ta,na,tb,nb) \ - private: ret (CALLBACK *fn##xfn)(ICOM_INTERFACE* me,ta a,tb b); \ - public: inline ret (CALLBACK xfn)(ta a,tb b) { return ((ICOM_INTERFACE*)t.lpvtbl)->fn##xfn(this,a,b); }; - -#define ICOM_METHOD3(ret,xfn,ta,na,tb,nb,tc,nc) \ - private: ret (CALLBACK *fn##xfn)(ICOM_INTERFACE* me,ta a,tb b,tc c); \ - public: inline ret (CALLBACK xfn)(ta a,tb b,tc c) { return ((ICOM_INTERFACE*)t.lpvtbl)->fn##xfn(this,a,b,c); }; - -#define ICOM_METHOD4(ret,xfn,ta,na,tb,nb,tc,nc,td,nd) \ - private: ret (CALLBACK *fn##xfn)(ICOM_INTERFACE* me,ta a,tb b,tc c,td d); \ - public: inline ret (CALLBACK xfn)(ta a,tb b,tc c,td d) { return ((ICOM_INTERFACE*)t.lpvtbl)->fn##xfn(this,a,b,c,d); }; - -#define ICOM_METHOD5(ret,xfn,ta,na,tb,nb,tc,nc,td,nd,te,ne) \ - private: ret (CALLBACK *fn##xfn)(ICOM_INTERFACE* me,ta a,tb b,tc c,td d,te e); \ - public: inline ret (CALLBACK xfn)(ta a,tb b,tc c,td d,te e) { return ((ICOM_INTERFACE*)t.lpvtbl)->fn##xfn(this,a,b,c,d,e); }; - -#define ICOM_METHOD6(ret,xfn,ta,na,tb,nb,tc,nc,td,nd,te,ne,tf,nf) \ - private: ret (CALLBACK *fn##xfn)(ICOM_INTERFACE* me,ta a,tb b,tc c,td d,te e,tf f); \ - public: inline ret (CALLBACK xfn)(ta a,tb b,tc c,td d,te e,tf f) { return ((ICOM_INTERFACE*)t.lpvtbl)->fn##xfn(this,a,b,c,d,e,f); }; - -#define ICOM_METHOD7(ret,xfn,ta,na,tb,nb,tc,nc,td,nd,te,ne,tf,nf,tg,ng) \ - private: ret (CALLBACK *fn##xfn)(ICOM_INTERFACE* me,ta a,tb b,tc c,td d,te e,tf f,tg g); \ - public: inline ret (CALLBACK xfn)(ta a,tb b,tc c,td d,te e,tf f,tg g) { return ((ICOM_INTERFACE*)t.lpvtbl)->fn##xfn(this,a,b,c,d,e,f,g); }; - - -#define ICOM_CMETHOD(ret,xfn) \ - private: ret (CALLBACK *fn##xfn)(const ICOM_INTERFACE* me); \ - public: inline ret (CALLBACK xfn)(void) const { return ((ICOM_INTERFACE*)t.lpvtbl)->fn##xfn(this); }; - -#define ICOM_CMETHOD1(ret,xfn,ta,na) \ - private: ret (CALLBACK *fn##xfn)(const ICOM_INTERFACE* me,ta a); \ - public: inline ret (CALLBACK xfn)(ta a) const { return ((ICOM_INTERFACE*)t.lpvtbl)->fn##xfn(this,a); }; - -#define ICOM_CMETHOD2(ret,xfn,ta,na,tb,nb) \ - private: ret (CALLBACK *fn##xfn)(const ICOM_INTERFACE* me,ta a,tb b); \ - public: inline ret (CALLBACK xfn)(ta a,tb b) const { return ((ICOM_INTERFACE*)t.lpvtbl)->fn##xfn(this,a,b); }; - -#define ICOM_CMETHOD3(ret,xfn,ta,na,tb,nb,tc,nc) \ - private: ret (CALLBACK *fn##xfn)(const ICOM_INTERFACE* me,ta a,tb b,tc c); \ - public: inline ret (CALLBACK xfn)(ta a,tb b,tc c) const { return ((ICOM_INTERFACE*)t.lpvtbl)->fn##xfn(this,a,b,c); }; - -#define ICOM_CMETHOD4(ret,xfn,ta,na,tb,nb,tc,nc,td,nd) \ - private: ret (CALLBACK *fn##xfn)(const ICOM_INTERFACE* me,ta a,tb b,tc c,td d); \ - public: inline ret (CALLBACK xfn)(ta a,tb b,tc c,td d) const { return ((ICOM_INTERFACE*)t.lpvtbl)->fn##xfn(this,a,b,c,d); }; - -#define ICOM_CMETHOD5(ret,xfn,ta,na,tb,nb,tc,nc,td,nd,te,ne) \ - private: ret (CALLBACK *fn##xfn)(const ICOM_INTERFACE* me,ta a,tb b,tc c,td d,te e); \ - public: inline ret (CALLBACK xfn)(ta a,tb b,tc c,td d,te e) const { return ((ICOM_INTERFACE*)t.lpvtbl)->fn##xfn(this,a,b,c,d,e); }; - -#define ICOM_CMETHOD6(ret,xfn,ta,na,tb,nb,tc,nc,td,nd,te,ne,tf,nf) \ - private: ret (CALLBACK *fn##xfn)(const ICOM_INTERFACE* me,ta a,tb b,tc c,td d,te e,tf f); \ - public: inline ret (CALLBACK xfn)(ta a,tb b,tc c,td d,te e,tf f) const { return ((ICOM_INTERFACE*)t.lpvtbl)->fn##xfn(this,a,b,c,d,e,f); }; - -#define ICOM_CMETHOD7(ret,xfn,ta,na,tb,nb,tc,nc,td,nd,te,ne,tf,nf,tg,ng) \ - private: ret (CALLBACK *fn##xfn)(const ICOM_INTERFACE* me,ta a,tb b,tc c,td d,te e,tf f,tg g); \ - public: inline ret (CALLBACK xfn)(ta a,tb b,tc c,td d,te e,tf f,tg g) const { return ((ICOM_INTERFACE*)t.lpvtbl)->fn##xfn(this,a,b,c,d,e,f,g); }; - - -#define ICOM_END(iface) \ - }; - -#define ICOM_ICALL(ibase, xfn, p) this_is_a_syntax_error -#define ICOM_ICALL1(ibase, xfn, p,a) this_is_a_syntax_error -#define ICOM_ICALL2(ibase, xfn, p,a,b) this_is_a_syntax_error -#define ICOM_ICALL3(ibase, xfn, p,a,b,c) this_is_a_syntax_error -#define ICOM_ICALL4(ibase, xfn, p,a,b,c,d) this_is_a_syntax_error -#define ICOM_ICALL5(ibase, xfn, p,a,b,c,d,e) this_is_a_syntax_error -#define ICOM_ICALL6(ibase, xfn, p,a,b,c,d,e,f) this_is_a_syntax_error -#define ICOM_ICALL7(ibase, xfn, p,a,b,c,d,e,f,g) this_is_a_syntax_error - -#define ICOM_CALL(xfn, p) this_is_a_syntax_error -#define ICOM_CALL1(xfn, p,a) this_is_a_syntax_error -#define ICOM_CALL2(xfn, p,a,b) this_is_a_syntax_error -#define ICOM_CALL3(xfn, p,a,b,c) this_is_a_syntax_error -#define ICOM_CALL4(xfn, p,a,b,c,d) this_is_a_syntax_error -#define ICOM_CALL5(xfn, p,a,b,c,d,e) this_is_a_syntax_error -#define ICOM_CALL6(xfn, p,a,b,c,d,e,f) this_is_a_syntax_error -#define ICOM_CALL7(xfn, p,a,b,c,d,e,f,g) this_is_a_syntax_error - - -#else -/* C interface */ - - -#define ICOM_BEGIN(iface,ibase) \ - typedef struct ICOM_VTABLE(iface) ICOM_VTABLE(iface); \ - struct iface { \ - const ICOM_VTABLE(iface)* lpvtbl; \ - }; \ - struct ICOM_VTABLE(iface) { \ - ICOM_VTABLE(ibase) bvt; - -#define ICOM_METHOD(ret, xfn) \ - ret (CALLBACK *fn##xfn)(ICOM_INTERFACE* me); - -#define ICOM_METHOD1(ret,xfn,ta,na) \ - ret (CALLBACK *fn##xfn)(ICOM_INTERFACE* me,ta a); - -#define ICOM_METHOD2(ret,xfn,ta,na,tb,nb) \ - ret (CALLBACK *fn##xfn)(ICOM_INTERFACE* me,ta a,tb b); - -#define ICOM_METHOD3(ret,xfn,ta,na,tb,nb,tc,nc) \ - ret (CALLBACK *fn##xfn)(ICOM_INTERFACE* me,ta a,tb b,tc c); - -#define ICOM_METHOD4(ret,xfn,ta,na,tb,nb,tc,nc,td,nd) \ - ret (CALLBACK *fn##xfn)(ICOM_INTERFACE* me,ta a,tb b,tc c,td d); - -#define ICOM_METHOD5(ret,xfn,ta,na,tb,nb,tc,nc,td,nd,te,ne) \ - ret (CALLBACK *fn##xfn)(ICOM_INTERFACE* me,ta a,tb b,tc c,td d,te e); - -#define ICOM_METHOD6(ret,xfn,ta,na,tb,nb,tc,nc,td,nd,te,ne,tf,nf) \ - ret (CALLBACK *fn##xfn)(ICOM_INTERFACE* me,ta a,tb b,tc c,td d,te e,tf f); - -#define ICOM_METHOD7(ret,xfn,ta,na,tb,nb,tc,nc,td,nd,te,ne,tf,nf,tg,ng) \ - ret (CALLBACK *fn##xfn)(ICOM_INTERFACE* me,ta a,tb b,tc c,td d,te e,tf f,tg g); - - -#define ICOM_CMETHOD(ret, xfn) \ - ret (CALLBACK *fn##xfn)(const ICOM_INTERFACE* me); - -#define ICOM_CMETHOD1(ret,xfn,ta,na) \ - ret (CALLBACK *fn##xfn)(const ICOM_INTERFACE* me,ta a); - -#define ICOM_CMETHOD2(ret,xfn,ta,na,tb,nb) \ - ret (CALLBACK *fn##xfn)(const ICOM_INTERFACE* me,ta a,tb b); - -#define ICOM_CMETHOD3(ret,xfn,ta,na,tb,nb,tc,nc) \ - ret (CALLBACK *fn##xfn)(const ICOM_INTERFACE* me,ta a,tb b,tc c); - -#define ICOM_CMETHOD4(ret,xfn,ta,na,tb,nb,tc,nc,td,nd) \ - ret (CALLBACK *fn##xfn)(const ICOM_INTERFACE* me,ta a,tb b,tc c,td d); - -#define ICOM_CMETHOD5(ret,xfn,ta,na,tb,nb,tc,nc,td,nd,te,ne) \ - ret (CALLBACK *fn##xfn)(const ICOM_INTERFACE* me,ta a,tb b,tc c,td d,te e); - -#define ICOM_CMETHOD6(ret,xfn,ta,na,tb,nb,tc,nc,td,nd,te,ne,tf,nf) \ - ret (CALLBACK *fn##xfn)(const ICOM_INTERFACE* me,ta a,tb b,tc c,td d,te e,tf f); - -#define ICOM_CMETHOD7(ret,xfn,ta,na,tb,nb,tc,nc,td,nd,te,ne,tf,nf,tg,ng) \ - ret (CALLBACK *fn##xfn)(const ICOM_INTERFACE* me,ta a,tb b,tc c,td d,te e,tf f,tg g); - -#define ICOM_END(iface) \ - }; - -#define ICOM_ICALL(ibase, xfn, p) ((ICOM_VTABLE(ibase)*)(p)->lpvtbl)->fn##xfn((ibase*)p) -#define ICOM_ICALL1(ibase, xfn, p,a) ((ICOM_VTABLE(ibase)*)(p)->lpvtbl)->fn##xfn((ibase*)p,a) -#define ICOM_ICALL2(ibase, xfn, p,a,b) ((ICOM_VTABLE(ibase)*)(p)->lpvtbl)->fn##xfn((ibase*)p,a,b) -#define ICOM_ICALL3(ibase, xfn, p,a,b,c) ((ICOM_VTABLE(ibase)*)(p)->lpvtbl)->fn##xfn((ibase*)p,a,b,c) -#define ICOM_ICALL4(ibase, xfn, p,a,b,c,d) ((ICOM_VTABLE(ibase)*)(p)->lpvtbl)->fn##xfn((ibase*)p,a,b,c,d) -#define ICOM_ICALL5(ibase, xfn, p,a,b,c,d,e) ((ICOM_VTABLE(ibase)*)(p)->lpvtbl)->fn##xfn((ibase*)p,a,b,c,d,e) -#define ICOM_ICALL6(ibase, xfn, p,a,b,c,d,e,f) ((ICOM_VTABLE(ibase)*)(p)->lpvtbl)->fn##xfn((ibase*)p,a,b,c,d,e,f) -#define ICOM_ICALL7(ibase, xfn, p,a,b,c,d,e,f,g) ((ICOM_VTABLE(ibase)*)(p)->lpvtbl)->fn##xfn((ibase*)p,a,b,c,d,e,f,g) - -#define ICOM_CALL(xfn, p) (p)->lpvtbl->fn##xfn(p) -#define ICOM_CALL1(xfn, p,a) (p)->lpvtbl->fn##xfn(p,a) -#define ICOM_CALL2(xfn, p,a,b) (p)->lpvtbl->fn##xfn(p,a,b) -#define ICOM_CALL3(xfn, p,a,b,c) (p)->lpvtbl->fn##xfn(p,a,b,c) -#define ICOM_CALL4(xfn, p,a,b,c,d) (p)->lpvtbl->fn##xfn(p,a,b,c,d) -#define ICOM_CALL5(xfn, p,a,b,c,d,e) (p)->lpvtbl->fn##xfn(p,a,b,c,d,e) -#define ICOM_CALL6(xfn, p,a,b,c,d,e,f) (p)->lpvtbl->fn##xfn(p,a,b,c,d,e,f) -#define ICOM_CALL7(xfn, p,a,b,c,d,e,f,g) (p)->lpvtbl->fn##xfn(p,a,b,c,d,e,f,g) - - -#define ICOM_THIS(iface,me) struct _##iface* this=(struct _##iface*)me -#define ICOM_CTHIS(iface,me) const _##iface* this=(const _##iface*)me - -#endif - - -/* FIXME: compobj.h seems to be obsolete (replaced by objbase.h!) but it still contains REFIID */ -#include "compobj.h" - -typedef struct IUnknown IUnknown ,*LPUNKNOWN; - - -/***************************************************************************** - * IUnknown interface - */ -#define ICOM_INTERFACE IUnknown -#if defined(__cplusplus) && !defined(CINTERFACE) -struct IUnknown { - union { - const void* lpvtbl; - HRESULT (CALLBACK *fnQueryInterface)(IUnknown* me, REFIID riid, LPVOID* ppvObj); - } t; - inline int QueryInterface(REFIID a, LPVOID* b) { return ((IUnknown*)t.lpvtbl)->t.fnQueryInterface(this,a,b); } -#else -typedef struct ICOM_VTABLE(IUnknown) ICOM_VTABLE(IUnknown); -struct IUnknown { - ICOM_VTABLE(IUnknown)* lpvtbl; -}; -struct ICOM_VTABLE(IUnknown) { - ICOM_METHOD2(HRESULT,QueryInterface,REFIID,riid, LPVOID*,ppvObj) -#endif - - ICOM_METHOD (ULONG,AddRef) - ICOM_METHOD (ULONG,Release) -#ifdef __WRC__ -}; /* FIXME: WRC does not support function macros and it is ICOM_END that is supposed to close the class */ -#else -ICOM_END(IUnknown) -#endif -#undef ICOM_INTERFACE - -#if !defined(__cplusplus) || defined(CINTERFACE) -/*** IUnknown methods ***/ -#define IUnknown_QueryInterface(p,a,b) ICOM_CALL2(QueryInterface,p,a,b) -#define IUnknown_AddRef(p) ICOM_CALL (AddRef,p) -#define IUnknown_Release(p) ICOM_CALL (Release,p) -#endif - - -#endif /* __WINE_OBJBASE_H */ +#ifndef __WINE_OBJBASE_H +#define __WINE_OBJBASE_H + + +#include "wine/obj_base.h" + +/* the following depend only on obj_base.h */ +#include "wine/obj_misc.h" +#include "wine/obj_channel.h" +#include "wine/obj_clientserver.h" +#include "wine/obj_marshal.h" +#include "wine/obj_storage.h" + +/* the following depend on obj_storage.h */ +#include "wine/obj_moniker.h" +#include "wine/obj_propertystorage.h" + +/* the following depend on obj_moniker.h */ +#include "wine/obj_dataobject.h" + +/* FIXME: the following should be moved to one of the wine/obj_XXX.h headers */ + +/***************************************************************************** + * CoXXX API + */ +/* FIXME: more CoXXX functions are missing */ +DWORD WINAPI CoBuildVersion(void); + +typedef enum tagCOINIT +{ + COINIT_APARTMENTTHREADED = 0x2, /* Apartment model */ + COINIT_MULTITHREADED = 0x0, /* OLE calls objects on any thread */ + COINIT_DISABLE_OLE1DDE = 0x4, /* Don't use DDE for Ole1 support */ + COINIT_SPEED_OVER_MEMORY = 0x8 /* Trade memory for speed */ +} COINIT; + +HRESULT WINAPI CoInitialize16(LPVOID lpReserved); +HRESULT WINAPI CoInitialize32(LPVOID lpReserved); +#define CoInitialize WINELIB_NAME(CoInitialize) + +HRESULT WINAPI CoInitializeEx32(LPVOID lpReserved, DWORD dwCoInit); +#define CoInitializeEx WINELIB_NAME(CoInitializeEx) + +void WINAPI CoUninitialize(void); + + +HRESULT WINAPI CoCreateGuid(GUID *pguid); + +/* class registration flags; passed to CoRegisterClassObject */ +typedef enum tagREGCLS +{ + REGCLS_SINGLEUSE = 0, + REGCLS_MULTIPLEUSE = 1, + REGCLS_MULTI_SEPARATE = 2, + REGCLS_SUSPENDED = 4 +} REGCLS; + +HRESULT WINAPI CoRegisterClassObject16(REFCLSID rclsid, LPUNKNOWN pUnk, DWORD dwClsContext, DWORD flags, LPDWORD lpdwRegister); +HRESULT WINAPI CoRegisterClassObject32(REFCLSID rclsid,LPUNKNOWN pUnk,DWORD dwClsContext,DWORD flags,LPDWORD lpdwRegister); +#define CoRegisterClassObject WINELIB_NAME(CoRegisterClassObject) + +HRESULT WINAPI CoRevokeClassObject(DWORD dwRegister); +HRESULT WINAPI CoGetClassObject(REFCLSID rclsid, DWORD dwClsContext,LPVOID pvReserved, const REFIID iid, LPVOID *ppv); + + +HRESULT WINAPI CoCreateInstance(REFCLSID rclsid,LPUNKNOWN pUnkOuter,DWORD dwClsContext,REFIID iid,LPVOID *ppv); +void WINAPI CoFreeLibrary(HINSTANCE32 hLibrary); +void WINAPI CoFreeAllLibraries(void); +void WINAPI CoFreeUnusedLibraries(void); +HRESULT WINAPI CoFileTimeNow(FILETIME *lpFileTime); +LPVOID WINAPI CoTaskMemAlloc(ULONG size); +void WINAPI CoTaskMemFree(LPVOID ptr); +HINSTANCE32 WINAPI CoLoadLibrary(LPOLESTR16 lpszLibName, BOOL32 bAutoFree); + +HRESULT WINAPI CoLockObjectExternal16(LPUNKNOWN pUnk,BOOL16 fLock,BOOL16 fLastUnlockReleases); +HRESULT WINAPI CoLockObjectExternal32(LPUNKNOWN pUnk,BOOL32 fLock,BOOL32 fLastUnlockReleases); +#define CoLockObjectExternal WINELIB_NAME(CoLockObjectExternal) + + +/* internal Wine stuff */ + + +/***************************************************************************** + * IClassFactory interface + */ + +typedef struct _IClassFactory { + /* IUnknown fields */ + ICOM_VTABLE(IClassFactory)* lpvtbl; + DWORD ref; +} _IClassFactory; + +HRESULT WINE_StringFromCLSID(const CLSID *id, LPSTR); + + +/***************************************************************************** + * IMalloc interface + */ +/* private prototypes for the constructors */ +LPMALLOC16 IMalloc16_Constructor(void); +LPMALLOC32 IMalloc32_Constructor(void); + + +/***************************************************************************** + * IUnknown interface + */ + +typedef struct _IUnknown { + /* IUnknown fields */ + ICOM_VTABLE(IUnknown)* lpvtbl; + DWORD ref; +} _IUnknown; + +LPUNKNOWN IUnknown_Constructor(void); + +#endif /* __WINE_OBJBASE_H */ diff --git a/include/objidl.h b/include/objidl.h new file mode 100644 index 00000000000..a923c1eac58 --- /dev/null +++ b/include/objidl.h @@ -0,0 +1,22 @@ +#ifndef __WINE_OBJIDL_H +#define __WINE_OBJIDL_H + + +#include "wine/obj_base.h" + +/* the following depend only on obj_base.h */ +#include "wine/obj_misc.h" +#include "wine/obj_channel.h" +#include "wine/obj_clientserver.h" +#include "wine/obj_marshal.h" +#include "wine/obj_storage.h" + +/* the following depend on obj_storage.h */ +#include "wine/obj_moniker.h" +#include "wine/obj_propertystorage.h" + +/* the following depend on obj_moniker.h */ +#include "wine/obj_dataobject.h" + + +#endif /* __WINE_OBJIDL_H */ diff --git a/include/ole.h b/include/ole.h index 0a368ef4e01..e5d4fab0767 100644 --- a/include/ole.h +++ b/include/ole.h @@ -7,37 +7,18 @@ #include "wingdi.h" -typedef CHAR OLECHAR16; -typedef OLECHAR16 *BSTR16; -typedef BSTR16 *LPBSTR16; -typedef LPSTR LPOLESTR16; -typedef LPCSTR LPCOLESTR16; -typedef WCHAR OLECHAR32; -typedef OLECHAR32 *BSTR32; -typedef BSTR32 *LPBSTR32; -typedef LPWSTR LPOLESTR32; -typedef LPCWSTR LPCOLESTR32; -DECL_WINELIB_TYPE(OLECHAR) -DECL_WINELIB_TYPE(LPOLESTR) -DECL_WINELIB_TYPE(LPCOLESTR) -DECL_WINELIB_TYPE(BSTR) -DECL_WINELIB_TYPE(LPBSTR) +/* FIXME: we need to include wtypes.h mainly, it seems, because we need BSTR. + * Normally none of the APIs in ole.h depend on it. It is most likey that they should + * be moved to ole2.h (which includes objbase.h and thus wtypes.h) or some other + * OLE include + */ +#include "wtypes.h" + #define OLESTR16(x) x #define OLESTR32(x) L##x /* probably wrong */ #define OLESTR WINELIB_NAME(OLESTR) -typedef enum tagCLSCTX -{ - CLSCTX_INPROC_SERVER = 0x1, - CLSCTX_INPROC_HANDLER = 0x2, - CLSCTX_LOCAL_SERVER = 0x4, - CLSCTX_REMOTE_SERVER = 0x10 -} CLSCTX; - -#define CLSCTX_SERVER (CLSCTX_INPROC_SERVER|CLSCTX_LOCAL_SERVER|CLSCTX_REMOTE_SERVER) -#define CLSCTX_ALL (CLSCTX_INPROC_HANDLER|CLSCTX_SERVER) - typedef unsigned short VARTYPE; typedef LONG DISPID; diff --git a/include/ole2.h b/include/ole2.h index dc604c4fcee..c91c9ae644d 100644 --- a/include/ole2.h +++ b/include/ole2.h @@ -6,18 +6,15 @@ #define __WINE_OLE2_H /* to be implemented */ -typedef LPVOID LPMESSAGEFILTER; +/* FIXME: this should be defined somewhere in oleidl.h instead, should it be repeated here ? */ typedef LPVOID LPDROPTARGET; -typedef struct tagMONIKER *LPMONIKER, IMoniker; -#define S_OK 0 -#define S_FALSE 1 /* OLE version */ #define rmm 23 #define rup 639 -/* FIXME should be in oleidl.h*/ +/* FIXME: should be in oleidl.h */ typedef struct tagOleMenuGroupWidths { LONG width[ 6 ]; } OLEMENUGROUPWIDTHS32; diff --git a/include/oleobj.h b/include/oleobj.h index ab21084e902..d846d97ac2c 100644 --- a/include/oleobj.h +++ b/include/oleobj.h @@ -3,8 +3,10 @@ #include "ole.h" #include "ole2.h" -#include "compobj.h" -/* #include "interfaces.h" */ +#include "wine/obj_base.h" +#include "wine/obj_storage.h" +#include "wine/obj_moniker.h" +#include "wine/obj_dataobject.h" #define STDMETHOD(xfn) HRESULT (CALLBACK *fn##xfn) #define STDMETHOD_(type,xfn) type (CALLBACK *fn##xfn) @@ -14,8 +16,6 @@ /* forward declaration of the objects*/ typedef struct tagOLEADVISEHOLDER *LPOLEADVISEHOLDER, IOleAdviseHolder; -typedef struct tagADVISESINK *LPADVISESINK, IAdviseSink; -typedef struct tagENUMSTATDATA *LPENUMSTATDATA, IEnumSTATDATA; /**************************************************************************** diff --git a/include/options.h b/include/options.h index 9a09ecb3673..84150fcabac 100644 --- a/include/options.h +++ b/include/options.h @@ -92,6 +92,7 @@ extern int PROFILE_GetWineIniBool( char const *section, char const *key_name, extern char* PROFILE_GetStringItem( char* ); /* Version functions */ -extern void VERSION_ParseVersion( char *arg ); +extern void VERSION_ParseWinVersion( const char *arg ); +extern void VERSION_ParseDosVersion( const char *arg ); #endif /* __WINE_OPTIONS_H */ diff --git a/include/propsheet.h b/include/propsheet.h new file mode 100644 index 00000000000..0a421590b75 --- /dev/null +++ b/include/propsheet.h @@ -0,0 +1,21 @@ +/* + * Property sheet class extra info + * + * Copyright 1998 Anders Carlsson + */ + +#ifndef __WINE_PROPSHEET_H +#define __WINE_PROPSHEET_H + +typedef struct tagPROPSHEET_INFO +{ + DWORD dwDummy; /* just to keep the compiler happy ;-) */ + +} PROPSHEET_INFO, *LPPROPSHEET_INFO; + + + +extern VOID PROPSHEET_Register (VOID); +extern VOID PROPSHEET_UnRegister (VOID); + +#endif /* __WINE_PROPSHEET_H */ diff --git a/include/servprov.h b/include/servprov.h new file mode 100644 index 00000000000..6df57b3708f --- /dev/null +++ b/include/servprov.h @@ -0,0 +1,34 @@ +#ifndef __WINE_SERVPROV_H +#define __WINE_SERVPROV_H + + +#include "unknwn.h" + + +/***************************************************************************** + * Predeclare the interfaces + */ +DEFINE_GUID (IID_IServiceProvider, 0x6d5140c1L, 0x7436, 0x11ce, 0x80, 0x34, 0x00, 0xaa, 0x00, 0x60, 0x09, 0xfa); +typedef struct IServiceProvider IServiceProvider,*LPSERVICEPROVIDER; + + +/***************************************************************************** + * IServiceProvider interface + */ +#define ICOM_INTERFACE IServiceProvider +ICOM_BEGIN(IServiceProvider,IUnknown) + ICOM_METHOD3(HRESULT,QueryService, REFGUID,guidService, REFIID,riid, void**,ppvObject); +ICOM_END(IServiceProvider) +#undef ICOM_INTERFACE + +#if !defined(__cplusplus) || defined(CINTERFACE) +/*** IUnknown methods ***/ +#define IServiceProvider_QueryInterface(p,a,b) ICOM_ICALL2(IUnknown,QueryInterface,p,a,b) +#define IServiceProvider_AddRef(p) ICOM_ICALL (IUnknown,AddRef,p) +#define IServiceProvider_Release(p) ICOM_ICALL (IUnknown,Release,p) +/*** IServiceProvider methods ***/ +#define IServiceProvider_QueryService(p,a,b,c) ICOM_CALL3(QueryService,p,a,b,c) +#endif + + +#endif /* __WINE_SERVPROV_H */ diff --git a/include/shell.h b/include/shell.h index c19af4954ef..2b5cdf69137 100644 --- a/include/shell.h +++ b/include/shell.h @@ -4,13 +4,10 @@ #ifndef __WINE_SHELL_H #define __WINE_SHELL_H -#include "wintypes.h" +#include "windows.h" #include "winreg.h" #include "imagelist.h" -#ifndef MAX_PATH -#define MAX_PATH 260 -#endif /**************************************************************************** * shell 16 @@ -247,6 +244,11 @@ HRESULT WINAPI SHGetSpecialFolderLocation(HWND32, INT32, LPITEMIDLIST *); /**************************************************************************** * string and path functions */ +BOOL32 WINAPI PathIsRoot32A(LPCSTR x); +BOOL32 WINAPI PathIsRoot32W(LPCWSTR x); +#define PathIsRoot WINELIB_NAME_AW(PathIsRoot) +BOOL32 WINAPI PathIsRoot32AW(LPCVOID x); + LPSTR WINAPI PathAddBackslash32A(LPSTR path); LPWSTR WINAPI PathAddBackslash32W(LPWSTR path); #define PathAddBackslash WINELIB_NAME_AW(PathAddBackslash) diff --git a/include/shlguid.h b/include/shlguid.h new file mode 100644 index 00000000000..3f6a85356cc --- /dev/null +++ b/include/shlguid.h @@ -0,0 +1,13 @@ +#ifndef __WINE_SHLGUID_H +#define __WINE_SHLGUID_H + + +/* This file defines the GUID of the shell objects. In WINE we define + * the GUIDs where the interface is declared so this file just + * includes shlobj.h + */ + +#include "shlobj.h" + + +#endif /* __WINE_SHLGUID_H */ diff --git a/include/shlobj.h b/include/shlobj.h index 8f823099c5a..c741985432f 100644 --- a/include/shlobj.h +++ b/include/shlobj.h @@ -1,15 +1,13 @@ -#ifndef _WINE_SHLOBJ_H -#define _WINE_SHLOBJ_H +#ifndef __WINE_SHLOBJ_H +#define __WINE_SHLOBJ_H +#include "wine/obj_base.h" #include "shell.h" #include "ole.h" #include "ole2.h" -#include "compobj.h" #include "oleobj.h" -#include "storage.h" #include "commctrl.h" #include "wintypes.h" -#include "interfaces.h" #define STDMETHOD(xfn) HRESULT (CALLBACK *fn##xfn) #define STDMETHOD_(type,xfn) type (CALLBACK *fn##xfn) @@ -23,22 +21,19 @@ DWORD WINAPI SHELL32_DllGetClassObject(LPCLSID,REFIID,LPVOID*); -typedef LPVOID LPBC; /* *IBindCtx really */ /* foreward declaration of the objects*/ -typedef struct tagPERSISTFILE *LPPERSISTFILE, IPersistFile; typedef struct tagCONTEXTMENU *LPCONTEXTMENU, IContextMenu; typedef struct tagSHELLEXTINIT *LPSHELLEXTINIT,IShellExtInit; typedef struct tagENUMIDLIST *LPENUMIDLIST, IEnumIDList; typedef struct tagSHELLFOLDER *LPSHELLFOLDER, IShellFolder; typedef struct tagSHELLVIEW *LPSHELLVIEW, IShellView; typedef struct tagSHELLBROWSER *LPSHELLBROWSER,IShellBrowser; -typedef struct tagDATAOBJECT *LPDATAOBJECT, IDataObject; typedef struct tagSHELLICON *LPSHELLICON, IShellIcon; typedef struct tagDOCKINGWINDOWFRAME *LPDOCKINGWINDOWFRAME, IDockingWindowFrame; -typedef struct tagSERVICEPROVIDER *LPSERVICEPROVIDER, IServiceProvider; typedef struct tagCOMMDLGBROWSER *LPCOMMDLGBROWSER, ICommDlgBrowser; -typedef struct tagENUMFORMATETC *LPENUMFORMATETC, IEnumFORMATETC; + + /**************************************************************************** * SHELL ID @@ -47,24 +42,13 @@ typedef struct tagENUMFORMATETC *LPENUMFORMATETC, IEnumFORMATETC; DEFINE_GUID (IID_MyComputer, 0x20D04FE0L, 0x3AEA, 0x1069, 0xA2, 0xD8, 0x08, 0x00, 0x2B, 0x30, 0x30, 0x9D); /* strange Objects */ -DEFINE_SHLGUID(IID_IEnumUnknown, 0x00000100L, 0, 0); -DEFINE_SHLGUID(IID_IEnumString, 0x00000101L, 0, 0); -DEFINE_SHLGUID(IID_IEnumMoniker, 0x00000102L, 0, 0); -DEFINE_SHLGUID(IID_IEnumFORMATETC, 0x00000103L, 0, 0); DEFINE_SHLGUID(IID_IEnumOLEVERB, 0x00000104L, 0, 0); -DEFINE_SHLGUID(IID_IEnumSTATDATA, 0x00000105L, 0, 0); -DEFINE_SHLGUID(IID_IPersistStream, 0x00000109L, 0, 0); -DEFINE_SHLGUID(IID_IPersistStorage, 0x0000010AL, 0, 0); -DEFINE_SHLGUID(IID_IPersistFile, 0x0000010BL, 0, 0); -DEFINE_SHLGUID(IID_IPersist, 0x0000010CL, 0, 0); DEFINE_SHLGUID(IID_IViewObject, 0x0000010DL, 0, 0); -DEFINE_SHLGUID(IID_IDataObject, 0x0000010EL, 0, 0); DEFINE_SHLGUID(IID_IDropSource, 0x00000121L, 0, 0); DEFINE_SHLGUID(IID_IDropTarget, 0x00000122L, 0, 0); -DEFINE_GUID (IID_IServiceProvider, 0x6D5140C1L, 0x7436, 0x11CE, 0x80, 0x34, 0x00, 0xAA, 0x00, 0x60, 0x09, 0xFA); DEFINE_GUID (IID_IDockingWindow, 0x012dd920L, 0x7B26, 0x11D0, 0x8C, 0xA9, 0x00, 0xA0, 0xC9, 0x2D, 0xBF, 0xE8); DEFINE_GUID (IID_IDockingWindowSite, 0x2A342FC2L, 0x7B26, 0x11D0, 0x8C, 0xA9, 0x00, 0xA0, 0xC9, 0x2D, 0xBF, 0xE8); DEFINE_GUID (IID_IDockingWindowFrame, 0x47D2657AL, 0x7B27, 0x11D0, 0x8C, 0xA9, 0x00, 0xA0, 0xC9, 0x2D, 0xBF, 0xE8); @@ -127,31 +111,8 @@ typedef struct _STRRET WCHAR cStrW[MAX_PATH]; }u; } STRRET,*LPSTRRET; -/***************************************************************************** - * IPersistFile interface - */ -#define THIS LPPERSISTFILE this -typedef struct IPersistFile_VTable -{ /* *** IUnknown methods *** */ - STDMETHOD(QueryInterface) (THIS_ REFIID riid, LPVOID * ppvObj) PURE; - STDMETHOD_(ULONG,AddRef) (THIS) PURE; - STDMETHOD_(ULONG,Release) (THIS) PURE; - STDMETHOD(GetClassID )(THIS_ CLSID *pClassID) PURE; - STDMETHOD(IsDirty )(THIS) PURE; - STDMETHOD(Load )(THIS_ LPCOLESTR32 pszFileName, DWORD dwMode) PURE; - STDMETHOD(Save )(THIS_ LPCOLESTR32 pszFileName, BOOL32 fRemember) PURE; - STDMETHOD(SaveCompleted )(THIS_ LPCOLESTR32 pszFileName) PURE; - STDMETHOD(GetCurFile )(THIS_ LPOLESTR32 *ppszFileName) PURE; -} IPersistFile_VTable,*LPPERSISTFILE_VTABLE; - -struct tagPERSISTFILE -{ LPPERSISTFILE_VTABLE lpvtbl; - DWORD ref; -}; - -#undef THIS /***************************************************************************** * IContextMenu interface */ @@ -282,52 +243,6 @@ typedef enum tagDVASPECT DVASPECT_DOCPRINT = 8 } DVASPECT; -typedef enum tagTYMED -{ TYMED_HGLOBAL = 1, - TYMED_FILE = 2, - TYMED_ISTREAM = 4, - TYMED_ISTORAGE = 8, - TYMED_GDI = 16, - TYMED_MFPICT = 32, - TYMED_ENHMF = 64, - TYMED_NULL = 0 -} TYMED; - -typedef struct -{ DWORD tdSize; - WORD tdDriverNameOffset; - WORD tdDeviceNameOffset; - WORD tdPortNameOffset; - WORD tdExtDevmodeOffset; - BYTE tdData[ 1 ]; -} DVTARGETDEVICE32; - -typedef WORD CLIPFORMAT32, *LPCLIPFORMAT32; - -/* dataobject as answer to a request */ -typedef struct -{ DWORD tymed; - union - { HBITMAP32 hBitmap; - /*HMETAFILEPICT32 hMetaFilePict;*/ - /*HENHMETAFILE32 hEnhMetaFile;*/ - HGLOBAL32 hGlobal; - LPOLESTR32 lpszFileName; - IStream32 *pstm; - IStorage32 *pstg; - } u; - IUnknown *pUnkForRelease; -} STGMEDIUM32; - -/* wished data format */ -typedef struct -{ CLIPFORMAT32 cfFormat; - DVTARGETDEVICE32 *ptd; - DWORD dwAspect; - LONG lindex; - DWORD tymed; -} FORMATETC32, *LPFORMATETC32; - /* shell specific clipboard formats */ /* DATAOBJECT_InitShellIDList*/ @@ -399,65 +314,6 @@ struct tagLPIDLLIST extern LPIDLLIST IDLList_Constructor (UINT32 uStep); extern void IDLList_Destructor(LPIDLLIST this); #undef THIS -/***************************************************************************** - * IEnumFORMATETC interface - */ -#define THIS LPENUMFORMATETC this - -typedef struct IEnumFORMATETC_VTable -{ /* IUnknown methods */ - STDMETHOD(QueryInterface) (THIS_ REFIID riid, LPVOID * ppvObj) PURE; - STDMETHOD_(ULONG,AddRef) (THIS) PURE; - STDMETHOD_(ULONG,Release) (THIS) PURE; - - /* IEnumFORMATETC methods */ - STDMETHOD (Next)(THIS_ ULONG celt, FORMATETC32 *rgelt, ULONG *pceltFethed) PURE; - STDMETHOD (Skip)(THIS_ ULONG celt) PURE; - STDMETHOD (Reset)(THIS) PURE; - STDMETHOD (Clone)(THIS_ IEnumFORMATETC ** ppenum) PURE; -} IEnumFORMATETC_VTable,*LPENUMFORMATETC_VTABLE; - -struct tagENUMFORMATETC -{ LPENUMFORMATETC_VTABLE lpvtbl; - DWORD ref; - UINT32 posFmt; - UINT32 countFmt; - LPFORMATETC32 pFmt; -}; - -#undef THIS - -/***************************************************************************** - * IDataObject interface - */ -#define THIS LPDATAOBJECT this - -typedef struct IDataObject_VTable -{ /*** IUnknown methods ***/ - STDMETHOD(QueryInterface) (THIS_ REFIID riid, LPVOID * ppvObj) PURE; - STDMETHOD_(ULONG,AddRef) (THIS) PURE; - STDMETHOD_(ULONG,Release) (THIS) PURE; - - STDMETHOD (GetData )(THIS_ LPFORMATETC32 pformatetcIn, STGMEDIUM32 *pmedium) PURE; - STDMETHOD (GetDataHere)(THIS_ LPFORMATETC32 pformatetc, STGMEDIUM32 *pmedium) PURE; - STDMETHOD (QueryGetData)(THIS_ LPFORMATETC32 pformatetc) PURE; - STDMETHOD (GetCanonicalFormatEtc)(THIS_ LPFORMATETC32 pformatectIn, LPFORMATETC32 pformatetcOut) PURE; - STDMETHOD (SetData)(THIS_ LPFORMATETC32 pformatetc, STGMEDIUM32 *pmedium, BOOL32 fRelease) PURE; - STDMETHOD (EnumFormatEtc)(THIS_ DWORD dwDirection, IEnumFORMATETC **ppenumFormatEtc) PURE; - STDMETHOD (DAdvise )(THIS_ LPFORMATETC32 *pformatetc, DWORD advf, IAdviseSink *pAdvSink, DWORD *pdwConnection) PURE; - STDMETHOD (DUnadvise)(THIS_ DWORD dwConnection) PURE; - STDMETHOD (EnumDAdvise)(THIS_ IEnumSTATDATA **ppenumAdvise) PURE; -} IDataObject_VTable,*LPDATAOBJECT_VTABLE; - -struct tagDATAOBJECT -{ LPDATAOBJECT_VTABLE lpvtbl; - DWORD ref; - LPSHELLFOLDER psf; - LPIDLLIST lpill; /* the data of the dataobject */ - LPITEMIDLIST pidl; -}; - -#undef THIS /***************************************************************************** @@ -1108,24 +964,6 @@ struct tagDOCKINGWINDOWFRAME #undef THIS /**************************************************************************** - * IServiceProvider interface - */ -#define THIS LPSERVICEPROVIDER this - -typedef struct IServiceProvider_VTable -{ /*** IUnknown methods ***/ - STDMETHOD(QueryInterface) (THIS_ REFIID riid, LPVOID * ppvObj) PURE; - STDMETHOD_(ULONG,AddRef) (THIS) PURE; - STDMETHOD_(ULONG,Release) (THIS) PURE; - - STDMETHOD(QueryService)(THIS_ REFGUID guidService, REFIID riid, void **ppvObject); -} IServiceProvider_VTable, *LPSERVICEPROVIDER_VTABLE; - -struct tagSERVICEPROVIDER -{ LPSERVICEPROVIDER_VTABLE lpvtbl; - DWORD ref; -}; -/**************************************************************************** * Shell Execute API */ #define SE_ERR_FNF 2 /* file not found */ @@ -1389,4 +1227,5 @@ typedef struct #undef THIS_ #undef STDMETHOD #undef STDMETHOD_ -#endif /*_WINE_SHLOBJ_H*/ + +#endif /* __WINE_SHLOBJ_H */ diff --git a/include/storage.h b/include/storage.h dissimilarity index 99% index 678ea766393..10fd6935a71 100644 --- a/include/storage.h +++ b/include/storage.h @@ -1,254 +1,8 @@ -#ifndef __WINE_STORAGE_H -#define __WINE_STORAGE_H - -#include "objbase.h" -#include "windows.h" - -/* Does this look like a cellar to you? */ - -struct storage_header { - BYTE magic[8]; /* 00: magic */ - BYTE unknown1[36]; /* 08: unknown */ - DWORD num_of_bbd_blocks;/* 2C: length of big datablocks */ - DWORD root_startblock;/* 30: root storage first big block */ - DWORD unknown2[2]; /* 34: unknown */ - DWORD sbd_startblock; /* 3C: small block depot first big block */ - DWORD unknown3[3]; /* 40: unknown */ - DWORD bbd_list[109]; /* 4C: big data block list (up to end of sector)*/ -}; -struct storage_pps_entry { - WCHAR pps_rawname[32];/* 00: \0 terminated widechar name */ - WORD pps_sizeofname; /* 40: namelength in bytes */ - BYTE pps_type; /* 42: flags, 1 storage/dir, 2 stream, 5 root */ - BYTE pps_unknown0; /* 43: unknown */ - DWORD pps_prev; /* 44: previous pps */ - DWORD pps_next; /* 48: next pps */ - DWORD pps_dir; /* 4C: directory pps */ - GUID pps_guid; /* 50: class ID */ - DWORD pps_unknown1; /* 60: unknown */ - FILETIME pps_ft1; /* 64: filetime1 */ - FILETIME pps_ft2; /* 70: filetime2 */ - DWORD pps_sb; /* 74: data startblock */ - DWORD pps_size; /* 78: datalength. (<0x1000)?small:big blocks*/ - DWORD pps_unknown2; /* 7C: unknown */ -}; - -#define STORAGE_CHAINENTRY_FAT 0xfffffffd -#define STORAGE_CHAINENTRY_ENDOFCHAIN 0xfffffffe -#define STORAGE_CHAINENTRY_FREE 0xffffffff - -typedef LPOLESTR16 *SNB16; -typedef LPOLESTR32 *SNB32; -DECL_WINELIB_TYPE(SNB) - -typedef struct IStorage16 IStorage16,*LPSTORAGE16; -typedef struct IStorage32 IStorage32,*LPSTORAGE32; -typedef struct IStream16 IStream16,*LPSTREAM16; -typedef struct IStream32 IStream32,*LPSTREAM32; - -typedef struct IEnumSTATSTG IEnumSTATSTG,*LPENUMSTATSTG; - -typedef struct { - LPOLESTR16 pwcsName; - DWORD type; - ULARGE_INTEGER cbSize; - FILETIME mtime; - FILETIME ctime; - FILETIME atime; - DWORD grfMode; - DWORD grfLocksSupported; - CLSID clsid; - DWORD grfStateBits; - DWORD reserved; -} STATSTG; - -#define STGM_DIRECT 0x00000000 -#define STGM_TRANSACTED 0x00010000 -#define STGM_SIMPLE 0x08000000 -#define STGM_READ 0x00000000 -#define STGM_WRITE 0x00000001 -#define STGM_READWRITE 0x00000002 -#define STGM_SHARE_DENY_NONE 0x00000040 -#define STGM_SHARE_DENY_READ 0x00000030 -#define STGM_SHARE_DENY_WRITE 0x00000020 -#define STGM_SHARE_EXCLUSIVE 0x00000010 -#define STGM_PRIORITY 0x00040000 -#define STGM_DELETEONRELEASE 0x04000000 -#define STGM_NOSCRATCH 0x00100000 -#define STGM_CREATE 0x00001000 -#define STGM_CONVERT 0x00020000 -#define STGM_FAILIFTHERE 0x00000000 - - -/***************************************************************************** - * IStorage16 interface - */ -#define ICOM_INTERFACE IStorage16 -ICOM_BEGIN(IStorage16,IUnknown) - ICOM_METHOD5(HRESULT,CreateStream, LPCOLESTR16,pwcsName, DWORD,grfMode, DWORD,reserved1, DWORD,reserved2, IStream16**,ppstm) - ICOM_METHOD5(HRESULT,OpenStream, LPCOLESTR16,pwcsName, void*,reserved1, DWORD,grfMode, DWORD,reserved2, IStream16**,ppstm) - ICOM_METHOD5(HRESULT,CreateStorage, LPCOLESTR16,pwcsName, DWORD,grfMode, DWORD,dwStgFmt, DWORD,reserved2, IStorage16**,ppstg) - ICOM_METHOD6(HRESULT,OpenStorage, LPCOLESTR16,pwcsName, IStorage16*,pstgPriority, DWORD,grfMode, SNB16,snb16Exclude, DWORD,reserved, IStorage16**,ppstg) - ICOM_METHOD4(HRESULT,CopyTo, DWORD,ciidExclude, const IID*,rgiidExclude, SNB16,snb16Exclude, IStorage16*,pstgDest) - ICOM_METHOD4(HRESULT,MoveElementTo, LPCOLESTR16,pwcsName, IStorage16*,pstgDest, LPCOLESTR16,pwcsNewName, DWORD,grfFlags) - ICOM_METHOD1(HRESULT,Commit, DWORD,grfCommitFlags) - ICOM_METHOD (HRESULT,Revert) - ICOM_METHOD4(HRESULT,EnumElements, DWORD,reserved1, void*,reserved2, DWORD,reserved3, IEnumSTATSTG**,ppenum) - ICOM_METHOD1(HRESULT,DestroyElement, LPCOLESTR16,pwcsName) - ICOM_METHOD2(HRESULT,RenameElement, LPCOLESTR16,pwcsOldName, LPCOLESTR16,pwcsNewName) - ICOM_METHOD4(HRESULT,SetElementTimes,LPCOLESTR16,pwcsName, const FILETIME*,pctime, const FILETIME*,patime, const FILETIME*,pmtime) - ICOM_METHOD1(HRESULT,SetClass, REFCLSID,clsid) - ICOM_METHOD2(HRESULT,SetStateBits, DWORD,grfStateBits, DWORD,grfMask) - ICOM_METHOD2(HRESULT,Stat, STATSTG*,pstatstg, DWORD,grfStatFlag) -ICOM_END(IStorage16) -#undef ICOM_INTERFACE - -#if !defined(__cplusplus) || defined(CINTERFACE) -/*** IUnknown methods ***/ -#define IStorage16_QueryInterface(p,a,b) ICOM_ICALL2(QueryInterface,p,a,b) -#define IStorage16_AddRef(p) ICOM_ICALL (AddRef,p) -#define IStorage16_Release(p) ICOM_ICALL (Release,p) -/*** IStorage16 methods ***/ -#define IStorage16_CreateStream(p,a,b,c,d,e) ICOM_CALL5(CreateStream,p,a,b,c,d,e) -#define IStorage16_OpenStream(p,a,b,c,d,e) ICOM_CALL5(OpenStream,p,a,b,c,d,e) -#define IStorage16_CreateStorage(p,a,b,c,d,e) ICOM_CALL5(CreateStorage,p,a,b,c,d,e) -#define IStorage16_OpenStorage(p,a,b,c,d,e,f) ICOM_CALL6(OpenStorage,p,a,b,c,d,e,f) -#define IStorage16_CopyTo(p,a,b,c,d) ICOM_CALL4(CopyTo,p,a,b,c,d) -#define IStorage16_MoveElementTo(p,a,b,c,d) ICOM_CALL4(MoveElementTo,p,a,b,c,d) -#define IStorage16_Commit(p,a) ICOM_CALL1(Commit,p,a) -#define IStorage16_Revert(p) ICOM_CALL (Revert,p) -#define IStorage16_EnumElements(p,a,b,c,d) ICOM_CALL4(EnumElements,p,a,b,c,d) -#define IStorage16_DestroyElement(p,a) ICOM_CALL1(DestroyElement,p,a) -#define IStorage16_RenameElement(p,a,b) ICOM_CALL2(RenameElement,p,a,b) -#define IStorage16_SetElementTimes(p,a,b,c,d) ICOM_CALL4(SetElementTimes,p,a,b,c,d) -#define IStorage16_SetClass(p,a) ICOM_CALL1(SetClass,p,a) -#define IStorage16_SetStateBits(p,a,b) ICOM_CALL2(SetStateBits,p,a,b) -#define IStorage16_Stat(p,a,b) ICOM_CALL2(Stat,p,a,b) -#endif - - -/***************************************************************************** - * IStorage32 interface - */ -#define ICOM_INTERFACE IStorage32 -ICOM_BEGIN(IStorage32,IUnknown) - ICOM_METHOD5(HRESULT,CreateStream, LPCOLESTR32,pwcsName, DWORD,grfMode, DWORD,reserved1, DWORD,reserved2, IStream32**,ppstm) - ICOM_METHOD5(HRESULT,OpenStream, LPCOLESTR32,pwcsName, void*,reserved1, DWORD,grfMode, DWORD,reserved2, IStream32**,ppstm) - ICOM_METHOD5(HRESULT,CreateStorage, LPCOLESTR32,pwcsName, DWORD,grfMode, DWORD,dwStgFmt, DWORD,reserved2, IStorage32**,ppstg) - ICOM_METHOD6(HRESULT,OpenStorage, LPCOLESTR32,pwcsName, IStorage32*,pstgPriority, DWORD,grfMode, SNB32,snb16Exclude, DWORD,reserved, IStorage32**,ppstg) - ICOM_METHOD4(HRESULT,CopyTo, DWORD,ciidExclude, const IID*,rgiidExclude, SNB32,snb16Exclude, IStorage32*,pstgDest) - ICOM_METHOD4(HRESULT,MoveElementTo, LPCOLESTR32,pwcsName, IStorage32*,pstgDest, LPCOLESTR32,pwcsNewName, DWORD,grfFlags) - ICOM_METHOD1(HRESULT,Commit, DWORD,grfCommitFlags) - ICOM_METHOD (HRESULT,Revert) - ICOM_METHOD4(HRESULT,EnumElements, DWORD,reserved1, void*,reserved2, DWORD,reserved3, IEnumSTATSTG**,ppenum) - ICOM_METHOD1(HRESULT,DestroyElement, LPCOLESTR32,pwcsName) - ICOM_METHOD2(HRESULT,RenameElement, LPCOLESTR32,pwcsOldName, LPCOLESTR32,pwcsNewName) - ICOM_METHOD4(HRESULT,SetElementTimes,LPCOLESTR32,pwcsName, const FILETIME*,pctime, const FILETIME*,patime, const FILETIME*,pmtime) - ICOM_METHOD1(HRESULT,SetClass, REFCLSID,clsid) - ICOM_METHOD2(HRESULT,SetStateBits, DWORD,grfStateBits, DWORD,grfMask) - ICOM_METHOD2(HRESULT,Stat, STATSTG*,pstatstg, DWORD,grfStatFlag) -ICOM_END(IStorage32) -#undef ICOM_INTERFACE - -#if !defined(__cplusplus) || defined(CINTERFACE) -/*** IUnknown methods ***/ -#define IStorage32_QueryInterface(p,a,b) ICOM_ICALL2(QueryInterface,p,a,b) -#define IStorage32_AddRef(p) ICOM_ICALL (AddRef,p) -#define IStorage32_Release(p) ICOM_ICALL (Release,p) -/*** IStorage32 methods ***/ -#define IStorage32_CreateStream(p,a,b,c,d,e) ICOM_CALL5(CreateStream,p,a,b,c,d,e) -#define IStorage32_OpenStream(p,a,b,c,d,e) ICOM_CALL5(OpenStream,p,a,b,c,d,e) -#define IStorage32_CreateStorage(p,a,b,c,d,e) ICOM_CALL5(CreateStorage,p,a,b,c,d,e) -#define IStorage32_OpenStorage(p,a,b,c,d,e,f) ICOM_CALL6(OpenStorage,p,a,b,c,d,e,f) -#define IStorage32_CopyTo(p,a,b,c,d) ICOM_CALL4(CopyTo,p,a,b,c,d) -#define IStorage32_MoveElementTo(p,a,b,c,d) ICOM_CALL4(MoveElementTo,p,a,b,c,d) -#define IStorage32_Commit(p,a) ICOM_CALL1(Commit,p,a) -#define IStorage32_Revert(p) ICOM_CALL (Revert,p) -#define IStorage32_EnumElements(p,a,b,c,d) ICOM_CALL4(EnumElements,p,a,b,c,d) -#define IStorage32_DestroyElement(p,a) ICOM_CALL1(DestroyElement,p,a) -#define IStorage32_RenameElement(p,a,b) ICOM_CALL2(RenameElement,p,a,b) -#define IStorage32_SetElementTimes(p,a,b,c,d) ICOM_CALL4(SetElementTimes,p,a,b,c,d) -#define IStorage32_SetClass(p,a) ICOM_CALL1(SetClass,p,a) -#define IStorage32_SetStateBits(p,a,b) ICOM_CALL2(SetStateBits,p,a,b) -#define IStorage32_Stat(p,a,b) ICOM_CALL2(Stat,p,a,b) -#endif - - -/***************************************************************************** - * IStream16 interface - */ -#define ICOM_INTERFACE IStream16 -ICOM_BEGIN(IStream16,IUnknown) - ICOM_METHOD3(HRESULT,Read, void*,pv, ULONG,cb, ULONG*,pcbRead) - ICOM_METHOD3(HRESULT,Write, const void*,pv, ULONG,cb, ULONG*,pcbWritten) - ICOM_METHOD3(HRESULT,Seek, LARGE_INTEGER,dlibMove, DWORD,dwOrigin, ULARGE_INTEGER*,plibNewPosition) - ICOM_METHOD1(HRESULT,SetSize, ULARGE_INTEGER,libNewSize) - ICOM_METHOD4(HRESULT,CopyTo, IStream16*,pstm, ULARGE_INTEGER,cb, ULARGE_INTEGER*,pcbRead, ULARGE_INTEGER*,pcbWritten) - ICOM_METHOD1(HRESULT,Commit, DWORD,grfCommitFlags) - ICOM_METHOD (HRESULT,Revert) - ICOM_METHOD3(HRESULT,LockRegion, ULARGE_INTEGER,libOffset, ULARGE_INTEGER,cb, DWORD,dwLockType) - ICOM_METHOD3(HRESULT,UnlockRegion,ULARGE_INTEGER,libOffset, ULARGE_INTEGER,cb, DWORD,dwLockType) - ICOM_METHOD2(HRESULT,Stat, STATSTG*,pstatstg, DWORD,grfStatFlag) - ICOM_METHOD1(HRESULT,Clone, IStream16**,ppstm) -ICOM_END(IStream16) -#undef ICOM_INTERFACE - -#if !defined(__cplusplus) || defined(CINTERFACE) -/*** IUnknown methods ***/ -#define IStream16_QueryInterface(p,a,b) ICOM_ICALL2(QueryInterface,p,a,b) -#define IStream16_AddRef(p) ICOM_ICALL (AddRef,p) -#define IStream16_Release(p) ICOM_ICALL (Release,p) -/*** IStream16 methods ***/ -#define IStream16_Read(p,a,b,c) ICOM_CALL3(Read,p,a,b,c) -#define IStream16_Write(p,a,b,c) ICOM_CALL3(Write,p,a,b,c) -#define IStream16_Seek(p) ICOM_CALL3(Seek,p) -#define IStream16_SetSize(p,a,b) ICOM_CALL1(SetSize,p,a,b) -#define IStream16_CopyTo(pa,b,c,d) ICOM_CALL4(CopyTo,pa,b,c,d) -#define IStream16_Commit(p,a) ICOM_CALL1(Commit,p,a) -#define IStream16_Revert(p) ICOM_CALL (Revert,p) -#define IStream16_LockRegion(pa,b,c) ICOM_CALL3(LockRegion,pa,b,c) -#define IStream16_UnlockRegion(p,a,b,c) ICOM_CALL3(UnlockRegion,p,a,b,c) -#define IStream16_Stat(p,a,b) ICOM_CALL2(Stat,p,a,b) -#define IStream16_Clone(p,a) ICOM_CALL1(Clone,p,a) -#endif - - -/***************************************************************************** - * IStream32 interface - */ -#define ICOM_INTERFACE IStream32 -ICOM_BEGIN(IStream32,IUnknown) - ICOM_METHOD3(HRESULT,Read, void*,pv, ULONG,cb, ULONG*,pcbRead) - ICOM_METHOD3(HRESULT,Write, const void*,pv, ULONG,cb, ULONG*,pcbWritten) - ICOM_METHOD3(HRESULT,Seek, LARGE_INTEGER,dlibMove, DWORD,dwOrigin, ULARGE_INTEGER*,plibNewPosition) - ICOM_METHOD1(HRESULT,SetSize, ULARGE_INTEGER,libNewSize) - ICOM_METHOD4(HRESULT,CopyTo, IStream32*,pstm, ULARGE_INTEGER,cb, ULARGE_INTEGER*,pcbRead, ULARGE_INTEGER*,pcbWritten) - ICOM_METHOD1(HRESULT,Commit, DWORD,grfCommitFlags) - ICOM_METHOD (HRESULT,Revert) - ICOM_METHOD3(HRESULT,LockRegion, ULARGE_INTEGER,libOffset, ULARGE_INTEGER,cb, DWORD,dwLockType) - ICOM_METHOD3(HRESULT,UnlockRegion,ULARGE_INTEGER,libOffset, ULARGE_INTEGER,cb, DWORD,dwLockType) - ICOM_METHOD2(HRESULT,Stat, STATSTG*,pstatstg, DWORD,grfStatFlag) - ICOM_METHOD1(HRESULT,Clone, IStream32**,ppstm) -ICOM_END(IStream32) -#undef ICOM_INTERFACE - -#if !defined(__cplusplus) || defined(CINTERFACE) -/*** IUnknown methods ***/ -#define IStream32_QueryInterface(p,a,b) ICOM_ICALL2(QueryInterface,p,a,b) -#define IStream32_AddRef(p) ICOM_ICALL (AddRef,p) -#define IStream32_Release(p) ICOM_ICALL (Release,p) -/*** IStream32 methods ***/ -#define IStream32_Read(p,a,b,c) ICOM_CALL3(Read,p,a,b,c) -#define IStream32_Write(p,a,b,c) ICOM_CALL3(Write,p,a,b,c) -#define IStream32_Seek(p) ICOM_CALL3(Seek,p) -#define IStream32_SetSize(p,a,b) ICOM_CALL1(SetSize,p,a,b) -#define IStream32_CopyTo(pa,b,c,d) ICOM_CALL4(CopyTo,pa,b,c,d) -#define IStream32_Commit(p,a) ICOM_CALL1(Commit,p,a) -#define IStream32_Revert(p) ICOM_CALL (Revert,p) -#define IStream32_LockRegion(pa,b,c) ICOM_CALL3(LockRegion,pa,b,c) -#define IStream32_UnlockRegion(p,a,b,c) ICOM_CALL3(UnlockRegion,p,a,b,c) -#define IStream32_Stat(p,a,b) ICOM_CALL2(Stat,p,a,b) -#define IStream32_Clone(p,a) ICOM_CALL1(Clone,p,a) -#endif - -#endif +#ifndef __WINE_STORAGE_H +#define __WINE_STORAGE_H + +/* "storage.h" is obsolete, you should include "objbase.h" instead */ + +#include "objbase.h" + +#endif diff --git a/include/tab.h b/include/tab.h index 81b72485120..40f6e361afe 100644 --- a/include/tab.h +++ b/include/tab.h @@ -9,11 +9,10 @@ typedef struct tagTAB_ITEM { - UINT32 mask; - UINT32 lpReserved1; - UINT32 lpReserved2; + UINT32 mask; + DWORD dwState; LPSTR pszText; - INT32 cchTextMax; + INT32 cchTextMax; INT32 iImage; LPARAM lParam; RECT32 rect; /* bounding rectangle of the item */ @@ -21,13 +20,15 @@ typedef struct tagTAB_ITEM typedef struct tagTAB_INFO { - UINT32 uNumItem; /* number of tab items */ - INT32 nHeight; /* height of the tab row */ - HFONT32 hFont; /* handle to the current font */ + UINT32 uNumItem; /* number of tab items */ + INT32 nHeight; /* height of the tab row */ + HFONT32 hFont; /* handle to the current font */ HCURSOR32 hcurArrow; /* handle to the current cursor */ - INT32 iSelected; /* the currently selected item */ + HIMAGELIST himl; /* handle to a image list (may be 0) */ + UINT32 cchTextMax; + INT32 iSelected; /* the currently selected item */ TAB_ITEM *items; /* pointer to an array of TAB_ITEM's */ - RECT32 rect; + RECT32 rect; } TAB_INFO; diff --git a/include/unknwn.h b/include/unknwn.h new file mode 100644 index 00000000000..1803cb2b9d0 --- /dev/null +++ b/include/unknwn.h @@ -0,0 +1,8 @@ +#ifndef __WINE_UNKNWN_H +#define __WINE_UNKNWN_H + + +#include "wine/obj_base.h" + + +#endif /* __WINE_UNKNWN_H */ diff --git a/include/version.h b/include/version.h index 6d6aa5a3e67..cf4f0e44ef0 100644 --- a/include/version.h +++ b/include/version.h @@ -1 +1 @@ -#define WINE_RELEASE_INFO "Wine release 990103" +#define WINE_RELEASE_INFO "Wine release 990110" diff --git a/include/winbase.h b/include/winbase.h index 8668da9a0a5..8df2d66229e 100644 --- a/include/winbase.h +++ b/include/winbase.h @@ -302,6 +302,7 @@ void WINAPI DeleteCriticalSection(CRITICAL_SECTION *lpCrit); void WINAPI EnterCriticalSection(CRITICAL_SECTION *lpCrit); void WINAPI InitializeCriticalSection(CRITICAL_SECTION *lpCrit); void WINAPI LeaveCriticalSection(CRITICAL_SECTION *lpCrit); +void WINAPI MakeCriticalSectionGlobal(CRITICAL_SECTION *lpCrit); HANDLE32 WINAPI OpenProcess(DWORD access, BOOL32 inherit, DWORD id); BOOL32 WINAPI GetProcessWorkingSetSize(HANDLE32,LPDWORD,LPDWORD); BOOL32 WINAPI SetProcessWorkingSetSize(HANDLE32,DWORD,DWORD); diff --git a/include/windows.h b/include/windows.h index db13b18da1c..3b602c4f3ab 100644 --- a/include/windows.h +++ b/include/windows.h @@ -12,8 +12,14 @@ extern "C" { #include "wintypes.h" #include "winbase.h" -/* FIXME: Maybe we should try to get something from the Unix headers instead, this should be in windef.h by the way */ +/* FIXME: Maybe MAX_PATH and _MAX_PATH should be computed from the Unix headers instead + * and by the way, _MAX_PATH should be defined in stdlib.h and MAX_PATH in windef.h + * and mapiwin.h + */ +#define _MAX_PATH 260 +#ifndef MAX_PATH #define MAX_PATH 260 +#endif #ifndef DONT_INCLUDE_WINGDI #include "winbase.h" @@ -3836,6 +3842,8 @@ VOID WINAPI OldYield(void); VOID WINAPI PostEvent(HTASK16); WORD WINAPI PrestoChangoSelector(WORD,WORD); BOOL32 WINAPI RegisterShellHook(HWND16,UINT16); +/* NOTE: This is SYSTEM.3, not USER.182, which is also named KillSystemTimer */ +WORD WINAPI SYSTEM_KillSystemTimer( WORD ); WORD WINAPI SelectorAccessRights(WORD,WORD,WORD); VOID WINAPI SetPriority(HTASK16,INT16); FARPROC16 WINAPI SetResourceHandler(HINSTANCE16,SEGPTR,FARPROC16); @@ -3857,6 +3865,7 @@ BOOL32 WINAPI AreFileApisANSI(void); BOOL32 WINAPI Beep(DWORD,DWORD); BOOL32 WINAPI CloseHandle(HANDLE32); BOOL32 WINAPI CloseServiceHandle(HANDLE32); +HANDLE32 WINAPI ConvertToGlobalHandle(HANDLE32 hSrc); BOOL32 WINAPI CopyFile32A(LPCSTR,LPCSTR,BOOL32); BOOL32 WINAPI CopyFile32W(LPCWSTR,LPCWSTR,BOOL32); #define CopyFile WINELIB_NAME_AW(CopyFile) @@ -4135,6 +4144,7 @@ LONG WINAPI RegSetKeySecurity(HKEY,SECURITY_INFORMATION,LPSECURITY_DESCRI LONG WINAPI RegUnLoadKey32A(HKEY,LPCSTR); LONG WINAPI RegUnLoadKey32W(HKEY,LPCWSTR); #define RegUnLoadKey WINELIB_NAME_AW(RegUnLoadKey) +BOOL32 WINAPI ReleaseMutex(HANDLE32); BOOL32 WINAPI ReleaseSemaphore(HANDLE32,LONG,LPLONG); BOOL32 WINAPI ResetEvent(HANDLE32); DWORD WINAPI ResumeThread(HANDLE32); diff --git a/include/objbase.h b/include/wine/obj_base.h similarity index 66% copy from include/objbase.h copy to include/wine/obj_base.h index f7c569766d8..d03d1e91304 100644 --- a/include/objbase.h +++ b/include/wine/obj_base.h @@ -1,7 +1,62 @@ -#ifndef __WINE_OBJBASE_H -#define __WINE_OBJBASE_H +/* + * This file defines the macros and types necessary to define COM interfaces, + * and the three most basic COM interfaces: IUnknown, IMalloc and IClassFactory. + */ + +#ifndef __WINE_WINE_OBJ_BASE_H +#define __WINE_WINE_OBJ_BASE_H + + +/***************************************************************************** + * Defines the basic types + */ +#include "wtypes.h" + + +/***************************************************************************** + * Macros to declare the GUIDs + */ +#ifdef INITGUID +#define DEFINE_GUID(name, l, w1, w2, b1, b2, b3, b4, b5, b6, b7, b8) \ + const GUID name = \ + { l, w1, w2, { b1, b2, b3, b4, b5, b6, b7, b8 } } +#else +#define DEFINE_GUID(name, l, w1, w2, b1, b2, b3, b4, b5, b6, b7, b8) \ + extern const GUID name +#endif + +#define DEFINE_OLEGUID(name, l, w1, w2) \ + DEFINE_GUID(name, l, w1, w2, 0xC0,0,0,0,0,0,0,0x46) + +#define DEFINE_SHLGUID(name, l, w1, w2) DEFINE_OLEGUID(name,l,w1,w2) + + +/***************************************************************************** + * GUID API + */ +HRESULT WINAPI StringFromCLSID16(const CLSID *id, LPOLESTR16*); +HRESULT WINAPI StringFromCLSID32(const CLSID *id, LPOLESTR32*); +#define StringFromCLSID WINELIB_NAME(StringFromCLSID) +HRESULT WINAPI CLSIDFromString16(LPCOLESTR16, CLSID *); +HRESULT WINAPI CLSIDFromString32(LPCOLESTR32, CLSID *); +#define CLSIDFromString WINELIB_NAME(CLSIDFromString) +HRESULT WINAPI CLSIDFromProgID16(LPCOLESTR16 progid, LPCLSID riid); +HRESULT WINAPI CLSIDFromProgID32(LPCOLESTR32 progid, LPCLSID riid); +#define CLSIDFromProgID WINELIB_NAME(CLSIDFromProgID) + +INT32 WINAPI StringFromGUID2(REFGUID id, LPOLESTR32 str, INT32 cmax); + +BOOL16 WINAPI IsEqualGUID16(GUID* g1,GUID* g2); +BOOL32 WINAPI IsEqualGUID32(REFGUID rguid1,REFGUID rguid2); +/*#define IsEqualGUID WINELIB_NAME(IsEqualGUID)*/ +#define IsEqualGUID(rguid1, rguid2) (!memcmp(rguid1, rguid2, sizeof(GUID))) +#define IsEqualIID(riid1, riid2) IsEqualGUID(riid1, riid2) +#define IsEqualCLSID(rclsid1, rclsid2) IsEqualGUID(rclsid1, rclsid2) +/***************************************************************************** + * Macros to define a COM interface + */ /* * The goal of the following set of definitions is to provide a way to use the same * header file definitions to provide both a C interface and a C++ object oriented @@ -13,8 +68,6 @@ * - all COM interfaces derive from IUnknown, this should not be a problem. * - the header file only defines the interface, the actual fields are defined * separately in the C file implementing the interface. - * - no COM method returns void. This seems to be the case but otherwise we could support this - * case by having one more set of macros. * * The natural approach to this problem would be to make sure we get a C++ class and * virtual methods in C++ and a structure with a table of pointer to functions in C. @@ -245,6 +298,7 @@ #define ICOM_BEGIN(iface,ibase) \ typedef struct iface: public ibase { + #define ICOM_METHOD(ret,xfn) \ private: ret (CALLBACK *fn##xfn)(ICOM_INTERFACE* me); \ public: inline ret (CALLBACK xfn)(void) { return ((ICOM_INTERFACE*)t.lpvtbl)->fn##xfn(this); }; @@ -311,6 +365,72 @@ public: inline ret (CALLBACK xfn)(ta a,tb b,tc c,td d,te e,tf f,tg g) const { return ((ICOM_INTERFACE*)t.lpvtbl)->fn##xfn(this,a,b,c,d,e,f,g); }; +#define ICOM_VMETHOD(xfn) \ + private: void (CALLBACK *fn##xfn)(ICOM_INTERFACE* me); \ + public: inline void (CALLBACK xfn)(void) { ((ICOM_INTERFACE*)t.lpvtbl)->fn##xfn(this); }; + +#define ICOM_VMETHOD1(xfn,ta,na) \ + private: void (CALLBACK *fn##xfn)(ICOM_INTERFACE* me,ta a); \ + public: inline void (CALLBACK xfn)(ta a) { ((ICOM_INTERFACE*)t.lpvtbl)->fn##xfn(this,a); }; + +#define ICOM_VMETHOD2(xfn,ta,na,tb,nb) \ + private: void (CALLBACK *fn##xfn)(ICOM_INTERFACE* me,ta a,tb b); \ + public: inline void (CALLBACK xfn)(ta a,tb b) { ((ICOM_INTERFACE*)t.lpvtbl)->fn##xfn(this,a,b); }; + +#define ICOM_VMETHOD3(xfn,ta,na,tb,nb,tc,nc) \ + private: void (CALLBACK *fn##xfn)(ICOM_INTERFACE* me,ta a,tb b,tc c); \ + public: inline void (CALLBACK xfn)(ta a,tb b,tc c) { ((ICOM_INTERFACE*)t.lpvtbl)->fn##xfn(this,a,b,c); }; + +#define ICOM_VMETHOD4(xfn,ta,na,tb,nb,tc,nc,td,nd) \ + private: void (CALLBACK *fn##xfn)(ICOM_INTERFACE* me,ta a,tb b,tc c,td d); \ + public: inline void (CALLBACK xfn)(ta a,tb b,tc c,td d) { ((ICOM_INTERFACE*)t.lpvtbl)->fn##xfn(this,a,b,c,d); }; + +#define ICOM_VMETHOD5(xfn,ta,na,tb,nb,tc,nc,td,nd,te,ne) \ + private: void (CALLBACK *fn##xfn)(ICOM_INTERFACE* me,ta a,tb b,tc c,td d,te e); \ + public: inline void (CALLBACK xfn)(ta a,tb b,tc c,td d,te e) { ((ICOM_INTERFACE*)t.lpvtbl)->fn##xfn(this,a,b,c,d,e); }; + +#define ICOM_VMETHOD6(xfn,ta,na,tb,nb,tc,nc,td,nd,te,ne,tf,nf) \ + private: void (CALLBACK *fn##xfn)(ICOM_INTERFACE* me,ta a,tb b,tc c,td d,te e,tf f); \ + public: inline void (CALLBACK xfn)(ta a,tb b,tc c,td d,te e,tf f) { ((ICOM_INTERFACE*)t.lpvtbl)->fn##xfn(this,a,b,c,d,e,f); }; + +#define ICOM_VMETHOD7(xfn,ta,na,tb,nb,tc,nc,td,nd,te,ne,tf,nf,tg,ng) \ + private: void (CALLBACK *fn##xfn)(ICOM_INTERFACE* me,ta a,tb b,tc c,td d,te e,tf f,tg g); \ + public: inline void (CALLBACK xfn)(ta a,tb b,tc c,td d,te e,tf f,tg g) { ((ICOM_INTERFACE*)t.lpvtbl)->fn##xfn(this,a,b,c,d,e,f,g); }; + + +#define ICOM_CVMETHOD(xfn) \ + private: void (CALLBACK *fn##xfn)(const ICOM_INTERFACE* me); \ + public: inline void (CALLBACK xfn)(void) const { ((ICOM_INTERFACE*)t.lpvtbl)->fn##xfn(this); }; + +#define ICOM_CVMETHOD1(xfn,ta,na) \ + private: void (CALLBACK *fn##xfn)(const ICOM_INTERFACE* me,ta a); \ + public: inline void (CALLBACK xfn)(ta a) const { ((ICOM_INTERFACE*)t.lpvtbl)->fn##xfn(this,a); }; + +#define ICOM_CVMETHOD2(xfn,ta,na,tb,nb) \ + private: void (CALLBACK *fn##xfn)(const ICOM_INTERFACE* me,ta a,tb b); \ + public: inline void (CALLBACK xfn)(ta a,tb b) const { ((ICOM_INTERFACE*)t.lpvtbl)->fn##xfn(this,a,b); }; + +#define ICOM_CVMETHOD3(xfn,ta,na,tb,nb,tc,nc) \ + private: void (CALLBACK *fn##xfn)(const ICOM_INTERFACE* me,ta a,tb b,tc c); \ + public: inline void (CALLBACK xfn)(ta a,tb b,tc c) const { ((ICOM_INTERFACE*)t.lpvtbl)->fn##xfn(this,a,b,c); }; + +#define ICOM_CVMETHOD4(xfn,ta,na,tb,nb,tc,nc,td,nd) \ + private: void (CALLBACK *fn##xfn)(const ICOM_INTERFACE* me,ta a,tb b,tc c,td d); \ + public: inline void (CALLBACK xfn)(ta a,tb b,tc c,td d) const { ((ICOM_INTERFACE*)t.lpvtbl)->fn##xfn(this,a,b,c,d); }; + +#define ICOM_CVMETHOD5(xfn,ta,na,tb,nb,tc,nc,td,nd,te,ne) \ + private: void (CALLBACK *fn##xfn)(const ICOM_INTERFACE* me,ta a,tb b,tc c,td d,te e); \ + public: inline void (CALLBACK xfn)(ta a,tb b,tc c,td d,te e) const { ((ICOM_INTERFACE*)t.lpvtbl)->fn##xfn(this,a,b,c,d,e); }; + +#define ICOM_CVMETHOD6(xfn,ta,na,tb,nb,tc,nc,td,nd,te,ne,tf,nf) \ + private: void (CALLBACK *fn##xfn)(const ICOM_INTERFACE* me,ta a,tb b,tc c,td d,te e,tf f); \ + public: inline void (CALLBACK xfn)(ta a,tb b,tc c,td d,te e,tf f) const { ((ICOM_INTERFACE*)t.lpvtbl)->fn##xfn(this,a,b,c,d,e,f); }; + +#define ICOM_CVMETHOD7(xfn,ta,na,tb,nb,tc,nc,td,nd,te,ne,tf,nf,tg,ng) \ + private: void (CALLBACK *fn##xfn)(const ICOM_INTERFACE* me,ta a,tb b,tc c,td d,te e,tf f,tg g); \ + public: inline void (CALLBACK xfn)(ta a,tb b,tc c,td d,te e,tf f,tg g) const { ((ICOM_INTERFACE*)t.lpvtbl)->fn##xfn(this,a,b,c,d,e,f,g); }; + + #define ICOM_END(iface) \ }; @@ -345,7 +465,8 @@ struct ICOM_VTABLE(iface) { \ ICOM_VTABLE(ibase) bvt; -#define ICOM_METHOD(ret, xfn) \ + +#define ICOM_METHOD(ret,xfn) \ ret (CALLBACK *fn##xfn)(ICOM_INTERFACE* me); #define ICOM_METHOD1(ret,xfn,ta,na) \ @@ -370,7 +491,7 @@ ret (CALLBACK *fn##xfn)(ICOM_INTERFACE* me,ta a,tb b,tc c,td d,te e,tf f,tg g); -#define ICOM_CMETHOD(ret, xfn) \ +#define ICOM_CMETHOD(ret,xfn) \ ret (CALLBACK *fn##xfn)(const ICOM_INTERFACE* me); #define ICOM_CMETHOD1(ret,xfn,ta,na) \ @@ -394,6 +515,57 @@ #define ICOM_CMETHOD7(ret,xfn,ta,na,tb,nb,tc,nc,td,nd,te,ne,tf,nf,tg,ng) \ ret (CALLBACK *fn##xfn)(const ICOM_INTERFACE* me,ta a,tb b,tc c,td d,te e,tf f,tg g); + +#define ICOM_VMETHOD(xfn) \ + void (CALLBACK *fn##xfn)(ICOM_INTERFACE* me); + +#define ICOM_VMETHOD1(xfn,ta,na) \ + void (CALLBACK *fn##xfn)(ICOM_INTERFACE* me,ta a); + +#define ICOM_VMETHOD2(xfn,ta,na,tb,nb) \ + void (CALLBACK *fn##xfn)(ICOM_INTERFACE* me,ta a,tb b); + +#define ICOM_VMETHOD3(xfn,ta,na,tb,nb,tc,nc) \ + void (CALLBACK *fn##xfn)(ICOM_INTERFACE* me,ta a,tb b,tc c); + +#define ICOM_VMETHOD4(xfn,ta,na,tb,nb,tc,nc,td,nd) \ + void (CALLBACK *fn##xfn)(ICOM_INTERFACE* me,ta a,tb b,tc c,td d); + +#define ICOM_VMETHOD5(xfn,ta,na,tb,nb,tc,nc,td,nd,te,ne) \ + void (CALLBACK *fn##xfn)(ICOM_INTERFACE* me,ta a,tb b,tc c,td d,te e); + +#define ICOM_VMETHOD6(xfn,ta,na,tb,nb,tc,nc,td,nd,te,ne,tf,nf) \ + void (CALLBACK *fn##xfn)(ICOM_INTERFACE* me,ta a,tb b,tc c,td d,te e,tf f); + +#define ICOM_VMETHOD7(xfn,ta,na,tb,nb,tc,nc,td,nd,te,ne,tf,nf,tg,ng) \ + void (CALLBACK *fn##xfn)(ICOM_INTERFACE* me,ta a,tb b,tc c,td d,te e,tf f,tg g); + + +#define ICOM_CVMETHOD(xfn) \ + void (CALLBACK *fn##xfn)(const ICOM_INTERFACE* me); + +#define ICOM_CVMETHOD1(xfn,ta,na) \ + void (CALLBACK *fn##xfn)(const ICOM_INTERFACE* me,ta a); + +#define ICOM_CVMETHOD2(xfn,ta,na,tb,nb) \ + void (CALLBACK *fn##xfn)(const ICOM_INTERFACE* me,ta a,tb b); + +#define ICOM_CVMETHOD3(xfn,ta,na,tb,nb,tc,nc) \ + void (CALLBACK *fn##xfn)(const ICOM_INTERFACE* me,ta a,tb b,tc c); + +#define ICOM_CVMETHOD4(xfn,ta,na,tb,nb,tc,nc,td,nd) \ + void (CALLBACK *fn##xfn)(const ICOM_INTERFACE* me,ta a,tb b,tc c,td d); + +#define ICOM_CVMETHOD5(xfn,ta,na,tb,nb,tc,nc,td,nd,te,ne) \ + void (CALLBACK *fn##xfn)(const ICOM_INTERFACE* me,ta a,tb b,tc c,td d,te e); + +#define ICOM_CVMETHOD6(xfn,ta,na,tb,nb,tc,nc,td,nd,te,ne,tf,nf) \ + void (CALLBACK *fn##xfn)(const ICOM_INTERFACE* me,ta a,tb b,tc c,td d,te e,tf f); + +#define ICOM_CVMETHOD7(xfn,ta,na,tb,nb,tc,nc,td,nd,te,ne,tf,nf,tg,ng) \ + void (CALLBACK *fn##xfn)(const ICOM_INTERFACE* me,ta a,tb b,tc c,td d,te e,tf f,tg g); + + #define ICOM_END(iface) \ }; @@ -422,10 +594,20 @@ #endif -/* FIXME: compobj.h seems to be obsolete (replaced by objbase.h!) but it still contains REFIID */ -#include "compobj.h" +/***************************************************************************** + * Predeclare the interfaces + */ +DEFINE_OLEGUID(IID_IClassFactory, 0x00000001L, 0, 0); +typedef struct IClassFactory IClassFactory, *LPCLASSFACTORY; + +DEFINE_OLEGUID(IID_IMalloc, 0x00000002L, 0, 0); +typedef struct IMalloc16 IMalloc16,*LPMALLOC16; +typedef struct IMalloc32 IMalloc32,*LPMALLOC32; +DECL_WINELIB_TYPE(IMalloc) +DECL_WINELIB_TYPE(LPMALLOC) -typedef struct IUnknown IUnknown ,*LPUNKNOWN; +DEFINE_OLEGUID(IID_IUnknown, 0x00000000L, 0, 0); +typedef struct IUnknown IUnknown, *LPUNKNOWN; /***************************************************************************** @@ -465,4 +647,103 @@ ICOM_END(IUnknown) #endif -#endif /* __WINE_OBJBASE_H */ +/***************************************************************************** + * IClassFactory interface + */ +#define ICOM_INTERFACE IClassFactory +ICOM_BEGIN(IClassFactory,IUnknown) + ICOM_METHOD3(HRESULT,CreateInstance, LPUNKNOWN,pUnkOuter, REFIID,riid, LPVOID*,ppvObject); + ICOM_METHOD1(HRESULT,LockServer, BOOL32,fLock); +ICOM_END(IClassFactory) +#undef ICOM_INTERFACE + +#if !defined(__cplusplus) || defined(CINTERFACE) +/*** IUnknown methods ***/ +#define IClassFactory_QueryInterface(p,a,b) ICOM_ICALL2(IUnknown,QueryInterface,p,a,b) +#define IClassFactory_AddRef(p) ICOM_ICALL (IUnknown,AddRef,p) +#define IClassFactory_Release(p) ICOM_ICALL (IUnknown,Release,p) +/*** IClassFactory methods ***/ +#define IClassFactory_CreateInstance(p,a,b,c) ICOM_CALL3(CreateInstance,p,a,b,c) +#define IClassFactory_LockServer(p,a) ICOM_CALL1(LockServer,p,a) +#endif + + +/***************************************************************************** + * IMalloc interface + */ +#define ICOM_INTERFACE IMalloc16 +ICOM_BEGIN(IMalloc16,IUnknown) + ICOM_METHOD1 (LPVOID,Alloc, DWORD,cb); + ICOM_METHOD2 (LPVOID,Realloc, LPVOID,pv, DWORD,cb); + ICOM_VMETHOD1( Free, LPVOID,pv); + ICOM_CMETHOD1(DWORD, GetSize, LPVOID,pv); + ICOM_CMETHOD1(INT16, DidAlloc, LPVOID,pv); + ICOM_METHOD (LPVOID,HeapMinimize); +ICOM_END(IMalloc16) +#undef ICOM_INTERFACE + +#if !defined(__cplusplus) || defined(CINTERFACE) +/*** IUnknown methods ***/ +#define IMalloc16_QueryInterface(p,a,b) ICOM_ICALL2(IUnknown,QueryInterface,p,a,b) +#define IMalloc16_AddRef(p) ICOM_ICALL (IUnknown,AddRef,p) +#define IMalloc16_Release(p) ICOM_ICALL (IUnknown,Release,p) +/*** IMalloc16 methods ***/ +#define IMalloc16_Alloc(p,a) ICOM_CALL1(Alloc,p,a) +#define IMalloc16_Realloc(p,a,b) ICOM_CALL2(Realloc,p,a,b) +#define IMalloc16_Free(p,a) ICOM_CALL1(Free,p,a) +#define IMalloc16_GetSize(p,a) ICOM_CALL1(GetSize,p,a) +#define IMalloc16_DidAlloc(p,a) ICOM_CALL1(DidAlloc,p,a) +#define IMalloc16_HeapMinimize(p) ICOM_CALL (HeapMinimize,p) +#endif + + +#define ICOM_INTERFACE IMalloc32 +ICOM_BEGIN(IMalloc32,IUnknown) + ICOM_METHOD1 (LPVOID,Alloc, DWORD,cb); + ICOM_METHOD2 (LPVOID,Realloc, LPVOID,pv, DWORD,cb); + ICOM_VMETHOD1( Free, LPVOID,pv); + ICOM_CMETHOD1(DWORD, GetSize, LPVOID,pv); + ICOM_CMETHOD1(INT32, DidAlloc, LPVOID,pv); + ICOM_METHOD (LPVOID,HeapMinimize); +ICOM_END(IMalloc32) +#undef ICOM_INTERFACE + +#if !defined(__cplusplus) || defined(CINTERFACE) +/*** IUnknown methods ***/ +#define IMalloc32_QueryInterface(p,a,b) ICOM_ICALL2(IUnknown,QueryInterface,p,a,b) +#define IMalloc32_AddRef(p) ICOM_ICALL (IUnknown,AddRef,p) +#define IMalloc32_Release(p) ICOM_ICALL (IUnknown,Release,p) +/*** IMalloc32 methods ***/ +#define IMalloc32_Alloc(p,a) ICOM_CALL1(Alloc,p,a) +#define IMalloc32_Realloc(p,a,b) ICOM_CALL2(Realloc,p,a,b) +#define IMalloc32_Free(p,a) ICOM_CALL1(Free,p,a) +#define IMalloc32_GetSize(p,a) ICOM_CALL1(GetSize,p,a) +#define IMalloc32_DidAlloc(p,a) ICOM_CALL1(DidAlloc,p,a) +#define IMalloc32_HeapMinimize(p) ICOM_CALL (HeapMinimize,p) + +#ifndef __WINE__ +/* Duplicated for WINELIB */ +/*** IUnknown methods ***/ +#define IMalloc_QueryInterface(p,a,b) ICOM_ICALL2(IUnknown,QueryInterface,p,a,b) +#define IMalloc_AddRef(p) ICOM_ICALL (IUnknown,AddRef,p) +#define IMalloc_Release(p) ICOM_ICALL (IUnknown,Release,p) +/*** IMalloc methods ***/ +#define IMalloc_Alloc(p,a) ICOM_CALL1(Alloc,p,a) +#define IMalloc_Realloc(p,a,b) ICOM_CALL2(Realloc,p,a,b) +#define IMalloc_Free(p,a) ICOM_CALL1(Free,p,a) +#define IMalloc_GetSize(p,a) ICOM_CALL1(GetSize,p,a) +#define IMalloc_DidAlloc(p,a) ICOM_CALL1(DidAlloc,p,a) +#define IMalloc_HeapMinimize(p) ICOM_CALL (HeapMinimize,p) +#endif +#endif + + +HRESULT WINAPI CoCreateStandardMalloc16(DWORD dwMemContext, LPMALLOC16* lpMalloc); +#define CoCreateStandardMalloc WINELIB_NAME(CoCreateStandardMalloc) + +HRESULT WINAPI CoGetMalloc16(DWORD dwMemContext,LPMALLOC16* lpMalloc); +HRESULT WINAPI CoGetMalloc32(DWORD dwMemContext,LPMALLOC32* lpMalloc); +#define CoGetMalloc WINELIB_NAME(CoGetMalloc) + + +#endif /* __WINE_WINE_OBJ_BASE_H */ diff --git a/include/wine/obj_channel.h b/include/wine/obj_channel.h new file mode 100644 index 00000000000..e6372c45b40 --- /dev/null +++ b/include/wine/obj_channel.h @@ -0,0 +1,60 @@ +/* + * Defines undocumented Microsoft COM interfaces and APIs seemingly related to some 'channel' notion. + * + * Depends on 'obj_base.h'. + */ + +#ifndef __WINE_WINE_OBJ_CHANNEL_H +#define __WINE_WINE_OBJ_CHANNEL_H + + +/***************************************************************************** + * Predeclare the interfaces + */ +DEFINE_GUID (IID_IChannelHook, 0x1008c4a0L, 0x7613, 0x11cf, 0x9a, 0xf1, 0x00, 0x20, 0xaf, 0x6e, 0x72, 0xf4); +typedef struct IChannelHook IChannelHook,*LPCHANNELHOOK; + +DEFINE_GUID (IID_IPSFactoryBuffer, 0xd5f569d0L, 0x593b, 0x101a, 0xb5, 0x69, 0x08, 0x00, 0x2b, 0x2d, 0xbf, 0x7a); +typedef struct IPSFactoryBuffer IPSFactoryBuffer,*LPPSFACTORYBUFFER; + +DEFINE_GUID (IID_IRpcChannelBuffer, 0xd5f56b60L, 0x593b, 0x101a, 0xb5, 0x69, 0x08, 0x00, 0x2b, 0x2d, 0xbf, 0x7a); +typedef struct IRpcChannelBuffer IRpcChannelBuffer,*LPRPCCHANNELBUFFER; + +DEFINE_GUID (IID_IRpcProxyBuffer, 0xd5f56a34L, 0x593b, 0x101a, 0xb5, 0x69, 0x08, 0x00, 0x2b, 0x2d, 0xbf, 0x7a); +typedef struct IRpcProxyBuffer IRpcProxyBuffer,*LPRPCPROXYBUFFER; + +DEFINE_GUID (IID_IRpcStubBuffer, 0xd5f56afcL, 0x593b, 0x101a, 0xb5, 0x69, 0x08, 0x00, 0x2b, 0x2d, 0xbf, 0x7a); +typedef struct IRpcStubBuffer IRpcStubBuffer,*LPRPCSTUBBUFFER; + + +/***************************************************************************** + * IChannelHook interface + */ +/* FIXME: not implemented */ + + +/***************************************************************************** + * IPSFactoryBuffer interface + */ +/* FIXME: not implemented */ + + +/***************************************************************************** + * IRpcChannelBuffer interface + */ +/* FIXME: not implemented */ + + +/***************************************************************************** + * IRpcProxyBuffer interface + */ +/* FIXME: not implemented */ + + +/***************************************************************************** + * IRpcStubBuffer interface + */ +/* FIXME: not implemented */ + + +#endif /* __WINE_WINE_OBJ_CHANNEL_H */ diff --git a/include/wine/obj_clientserver.h b/include/wine/obj_clientserver.h new file mode 100644 index 00000000000..81aa7c9ee7e --- /dev/null +++ b/include/wine/obj_clientserver.h @@ -0,0 +1,57 @@ +/* + * Defines the COM interfaces and APIs related to client/server aspects. + * + * Depends on 'obj_base.h'. + */ + +#ifndef __WINE_WINE_OBJ_CLIENTSERVER_H +#define __WINE_WINE_OBJ_CLIENTSERVER_H + + +/***************************************************************************** + * Predeclare the interfaces + */ +DEFINE_OLEGUID(IID_IClientSecurity, 0x0000013dL, 0, 0); +typedef struct IClientSecurity IClientSecurity,*LPCLIENTSECURITY; + +DEFINE_OLEGUID(IID_IExternalConnection, 0x00000019L, 0, 0); +typedef struct IExternalConnection IExternalConnection,*LPEXTERNALCONNECTION; + +DEFINE_OLEGUID(IID_IMessageFilter, 0x00000016L, 0, 0); +typedef struct IMessageFilter IMessageFilter,*LPMESSAGEFILTER; + +DEFINE_OLEGUID(IID_IServerSecurity, 0x0000013eL, 0, 0); +typedef struct IServerSecurity IServerSecurity,*LPSERVERSECURITY; + + +/***************************************************************************** + * IClientSecurity interface + */ +/* FIXME: not implemented */ + + +/***************************************************************************** + * IExternalConnection interface + */ +/* FIXME: not implemented */ + +HRESULT WINAPI CoDisconnectObject(LPUNKNOWN lpUnk, DWORD reserved); + + +/***************************************************************************** + * IMessageFilter interface + */ +/* FIXME: not implemented */ + +HRESULT WINAPI CoRegisterMessageFilter16(LPMESSAGEFILTER lpMessageFilter,LPMESSAGEFILTER *lplpMessageFilter); +HRESULT WINAPI CoRegisterMessageFilter32(LPMESSAGEFILTER lpMessageFilter,LPMESSAGEFILTER *lplpMessageFilter); +#define CoRegisterMessageFilter WINELIB_NAME(CoRegisterMessageFilter) + + +/***************************************************************************** + * IServerSecurity interface + */ +/* FIXME: not implemented */ + + +#endif /* __WINE_WINE_OBJ_CLIENTSERVER_H */ diff --git a/include/wine/obj_dataobject.h b/include/wine/obj_dataobject.h new file mode 100644 index 00000000000..4bc3bac519e --- /dev/null +++ b/include/wine/obj_dataobject.h @@ -0,0 +1,192 @@ +/* + * Defines the COM interfaces and APIs related to IDataObject. + * + * Depends on 'obj_moniker.h', 'obj_storage.h' and 'obj_base.h'. + */ + +#ifndef __WINE_WINE_OBJ_DATAOBJECT_H +#define __WINE_WINE_OBJ_DATAOBJECT_H + + +/***************************************************************************** + * Predeclare the structures + */ +typedef struct DVTARGETDEVICE32 DVTARGETDEVICE32, *LPDVTARGETDEVICE32; +DECL_WINELIB_TYPE(DVTARGETDEVICE) +DECL_WINELIB_TYPE(LPDVTARGETDEVICE) + +typedef struct FORMATETC32 FORMATETC32, *LPFORMATETC32; +DECL_WINELIB_TYPE(FORMATETC) +DECL_WINELIB_TYPE(LPFORMATETC) + +typedef struct STGMEDIUM32 STGMEDIUM32, *LPSTGMEDIUM32; +DECL_WINELIB_TYPE(STGMEDIUM) +DECL_WINELIB_TYPE(LPSTGMEDIUM) + + +/***************************************************************************** + * Predeclare the interfaces + */ +DEFINE_OLEGUID(IID_IAdviseSink, 0x0000010fL, 0, 0); +typedef struct IAdviseSink IAdviseSink,*LPADVISESINK; + +DEFINE_OLEGUID(IID_IAdviseSink2, 0x00000125L, 0, 0); +typedef struct IAdviseSink2 IAdviseSink2,*LPADVISESINK2; + +DEFINE_OLEGUID(IID_IDataAdviseHolder, 0x00000110L, 0, 0); +typedef struct IDataAdviseHolder IDataAdviseHolder,*LPDATAADVISEHOLDER; + +DEFINE_OLEGUID(IID_IDataObject, 0x0000010EL, 0, 0); +typedef struct IDataObject IDataObject,*LPDATAOBJECT; + +DEFINE_OLEGUID(IID_IEnumFORMATETC, 0x00000103L, 0, 0); +typedef struct IEnumFORMATETC IEnumFORMATETC,*LPENUMFORMATETC; + +DEFINE_OLEGUID(IID_IEnumSTATDATA, 0x00000105L, 0, 0); +typedef struct IEnumSTATDATA IEnumSTATDATA,*LPENUMSTATDATA; + + +/***************************************************************************** + * DVTARGETDEVICE structure + */ +struct DVTARGETDEVICE32 +{ + DWORD tdSize; + WORD tdDriverNameOffset; + WORD tdDeviceNameOffset; + WORD tdPortNameOffset; + WORD tdExtDevmodeOffset; + BYTE tdData[1]; +}; + + +/***************************************************************************** + * FORMATETC structure + */ +/* wished data format */ +struct FORMATETC32 +{ + CLIPFORMAT32 cfFormat; + DVTARGETDEVICE32* ptd; + DWORD dwAspect; + LONG lindex; + DWORD tymed; +}; + + +/***************************************************************************** + * STGMEDIUM structure + */ +typedef enum tagTYMED +{ TYMED_HGLOBAL = 1, + TYMED_FILE = 2, + TYMED_ISTREAM = 4, + TYMED_ISTORAGE = 8, + TYMED_GDI = 16, + TYMED_MFPICT = 32, + TYMED_ENHMF = 64, + TYMED_NULL = 0 +} TYMED; + +/* dataobject as answer to a request */ +struct STGMEDIUM32 +{ + DWORD tymed; + union { + HBITMAP32 hBitmap; + HMETAFILEPICT32 hMetaFilePict; + HENHMETAFILE32 hEnhMetaFile; + HGLOBAL32 hGlobal; + LPOLESTR32 lpszFileName; + IStream32 *pstm; + IStorage32 *pstg; + } u; + IUnknown *pUnkForRelease; +}; + + +/***************************************************************************** + * IAdviseSink interface + */ +/* FIXME: not implemented */ + + +/***************************************************************************** + * IAdviseSink2 interface + */ +/* FIXME: not implemented */ + + +/***************************************************************************** + * IDataAdviseHolder interface + */ +/* FIXME: not implemented */ + + +/***************************************************************************** + * IDataObject interface + */ +#define ICOM_INTERFACE IDataObject +ICOM_BEGIN(IDataObject,IUnknown) + ICOM_METHOD2(HRESULT,GetData, LPFORMATETC32,pformatetcIn, STGMEDIUM32*,pmedium); + ICOM_METHOD2(HRESULT,GetDataHere, LPFORMATETC32,pformatetc, STGMEDIUM32*,pmedium); + ICOM_METHOD1(HRESULT,QueryGetData, LPFORMATETC32,pformatetc); + ICOM_METHOD2(HRESULT,GetCanonicalFormatEtc, LPFORMATETC32,pformatectIn, LPFORMATETC32,pformatetcOut); + ICOM_METHOD3(HRESULT,SetData, LPFORMATETC32,pformatetc, STGMEDIUM32*,pmedium, BOOL32,fRelease); + ICOM_METHOD2(HRESULT,EnumFormatEtc, DWORD,dwDirection, IEnumFORMATETC**,ppenumFormatEtc); + ICOM_METHOD4(HRESULT,DAdvise, LPFORMATETC32*,pformatetc, DWORD,advf, IAdviseSink*,pAdvSink, DWORD*,pdwConnection); + ICOM_METHOD1(HRESULT,DUnadvise, DWORD,dwConnection); + ICOM_METHOD1(HRESULT,EnumDAdvise, IEnumSTATDATA**,ppenumAdvise); +ICOM_END(IDataObject) +#undef ICOM_INTERFACE + +#if !defined(__cplusplus) || defined(CINTERFACE) +/*** IUnknown methods ***/ +#define IDataObject_QueryInterface(p,a,b) ICOM_ICALL2(IUnknown,QueryInterface,p,a,b) +#define IDataObject_AddRef(p) ICOM_ICALL (IUnknown,AddRef,p) +#define IDataObject_Release(p) ICOM_ICALL (IUnknown,Release,p) +/*** IDataObject methods ***/ +#define IDataObject_GetData(p,a,b) ICOM_CALL2(GetData,p,a,b) +#define IDataObject_GetDataHere(p,a,b) ICOM_CALL2(GetDataHere,p,a,b) +#define IDataObject_QueryGetData(p,a) ICOM_CALL1(QueryGetData,p,a) +#define IDataObject_GetCanonicalFormatEtc(p,a,b) ICOM_CALL2(GetCanonicalFormatEtc,p,a,b) +#define IDataObject_SetData(p,a,b,c) ICOM_CALL3(SetData,p,a,b,c) +#define IDataObject_EnumFormatEtc(p,a,b) ICOM_CALL2(EnumFormatEtc,p,a,b) +#define IDataObject_DAdvise(p,a,b,c,d) ICOM_CALL4(DAdvise,p,a,b,c,d) +#define IDataObject_DUnadvise(p,a) ICOM_CALL1(DUnadvise,p,a) +#define IDataObject_EnumDAdvise(p,a) ICOM_CALL1(EnumDAdvise,p,a) +#endif + + +/***************************************************************************** + * IEnumFORMATETC interface + */ +#define ICOM_INTERFACE IEnumFORMATETC +ICOM_BEGIN(IEnumFORMATETC,IUnknown) + ICOM_METHOD3(HRESULT,Next, ULONG,celt, FORMATETC32*,rgelt, ULONG*,pceltFethed); + ICOM_METHOD1(HRESULT,Skip, ULONG,celt); + ICOM_METHOD (HRESULT,Reset); + ICOM_METHOD1(HRESULT,Clone, IEnumFORMATETC**,ppenum); +ICOM_END(IEnumFORMATETC) +#undef ICOM_INTERFACE + +#if !defined(__cplusplus) || defined(CINTERFACE) +/*** IUnknown methods ***/ +#define IEnumFORMATETC_QueryInterface(p,a,b) ICOM_ICALL2(IUnknown,QueryInterface,p,a,b) +#define IEnumFORMATETC_AddRef(p) ICOM_ICALL (IUnknown,AddRef,p) +#define IEnumFORMATETC_Release(p) ICOM_ICALL (IUnknown,Release,p) +/*** IEnumFORMATETC methods ***/ +#define IEnumFORMATETC_Next(p,a,b,c) ICOM_CALL3(Next,p,a,b,c) +#define IEnumFORMATETC_Skip(p,a) ICOM_CALL1(Skip,p,a) +#define IEnumFORMATETC_Reset(p) ICOM_CALL (Reset,p) +#define IEnumFORMATETC_Clone(p,a) ICOM_CALL1(Clone,p,a) +#endif + + +/***************************************************************************** + * IEnumSTATDATA interface + */ +/* FIXME: not implemented */ + + +#endif /* __WINE_WINE_OBJ_DATAOBJECT_H */ diff --git a/include/wine/obj_marshal.h b/include/wine/obj_marshal.h new file mode 100644 index 00000000000..92fc243e8eb --- /dev/null +++ b/include/wine/obj_marshal.h @@ -0,0 +1,34 @@ +/* + * Defines the COM interfaces and APIs that allow an interface to + * specify a custom marshaling for its objects. + * + * Depends on 'obj_storage.h' and 'obj_base.h'. + */ + +#ifndef __WINE_WINE_OBJ_MARSHAL_H +#define __WINE_WINE_OBJ_MARSHAL_H + + +/***************************************************************************** + * Predeclare the interfaces + */ +DEFINE_OLEGUID(IID_IMarshal, 0x00000003L, 0, 0); +typedef struct IMarshal IMarshal,*LPMARSHAL; + +DEFINE_OLEGUID(IID_IStdMarshalInfo, 0x00000018L, 0, 0); +typedef struct IStdMarshalInfo IStdMarshalInfo,*LPSTDMARSHALINFO; + + +/***************************************************************************** + * IMarshal interface + */ +/* FIXME: not implemented */ + + +/***************************************************************************** + * IStdMarshalInfo interface + */ +/* FIXME: not implemented */ + + +#endif /* __WINE_WINE_OBJ_MARSHAL_H */ diff --git a/include/wine/obj_misc.h b/include/wine/obj_misc.h new file mode 100644 index 00000000000..98dc1e4cc21 --- /dev/null +++ b/include/wine/obj_misc.h @@ -0,0 +1,54 @@ +/* + * Defines miscellaneous COM interfaces and APIs defined in objidl.h. + * These did not really fit into the other categories, whould have + * required their own specific category or are too rarely used to be + * put in 'obj_base.h'. + * + * Depends on 'obj_base.h'. + */ + +#ifndef __WINE_WINE_OBJ_MISC_H +#define __WINE_WINE_OBJ_MISC_H + + +/***************************************************************************** + * Predeclare the interfaces + */ +DEFINE_OLEGUID(IID_IEnumString, 0x00000101L, 0, 0); +typedef struct IEnumString IEnumString,*LPENUMSTRING; + +DEFINE_OLEGUID(IID_IEnumUnknown, 0x00000100L, 0, 0); +typedef struct IEnumUnknown IEnumUnknown,*LPENUMUNKNOWN; + +DEFINE_OLEGUID(IID_IMallocSpy, 0x0000001dL, 0, 0); +typedef struct IMallocSpy IMallocSpy,*LPMALLOCSPY; + +DEFINE_OLEGUID(IID_IMultiQI, 0x00000020L, 0, 0); +typedef struct IMultiQI IMultiQI,*LPMULTIQI; + + +/***************************************************************************** + * IEnumString interface + */ +/* FIXME: not implemented */ + + +/***************************************************************************** + * IEnumUnknown interface + */ +/* FIXME: not implemented */ + + +/***************************************************************************** + * IMallocSpy interface + */ +/* FIXME: not implemented */ + + +/***************************************************************************** + * IMultiQI interface + */ +/* FIXME: not implemented */ + + +#endif /* __WINE_WINE_OBJ_MISC_H */ diff --git a/include/wine/obj_moniker.h b/include/wine/obj_moniker.h new file mode 100644 index 00000000000..194ddd041a6 --- /dev/null +++ b/include/wine/obj_moniker.h @@ -0,0 +1,87 @@ +/* + * Defines the COM interfaces and APIs related to the moniker functionality. + * + * This file depends on 'obj_storage.h' and 'obj_base.h'. + */ + + +#ifndef __WINE_WINE_OBJ_MONIKER_H +#define __WINE_WINE_OBJ_MONIKER_H + + +/***************************************************************************** + * Predeclare the interfaces + */ +DEFINE_OLEGUID(IID_IBindCtx,0xe,0,0); +typedef struct IBindCtx IBindCtx,*LPBINDCTX; +typedef LPBINDCTX LPBC; + +DEFINE_OLEGUID(IID_IClassActivator, 0x00000140L, 0, 0); +typedef struct IClassActivator IClassActivator,*LPCLASSACTIVATOR; + +DEFINE_OLEGUID(IID_IEnumMoniker, 0x00000102L, 0, 0); +typedef struct IEnumMoniker IEnumMoniker,*LPENUMMONIKER; + +DEFINE_OLEGUID(IID_IMoniker, 0x0000000fL, 0, 0); +typedef struct IMoniker IMoniker,*LPMONIKER; + +DEFINE_GUID (IID_IROTData, 0xf29f6bc0L, 0x5021, 0x11ce, 0xaa, 0x15, 0x00, 0x00, 0x69, 0x01, 0x29, 0x3f); +typedef struct IROTData IROTData,*LPROTDATA; + +DEFINE_OLEGUID(IID_IRunnableObject, 0x00000126L, 0, 0); +typedef struct IRunnableObject IRunnableObject,*LPRUNNABLEOBJECT; + +DEFINE_OLEGUID(IID_IRunningObjectTable, 0x00000010L, 0, 0); +typedef struct IRunningObjectTable IRunningObjectTable,*LPRUNNINGOBJECTTABLE; + + +/***************************************************************************** + * IBindCtx interface + */ +/* FIXME: not implemented */ + + +/***************************************************************************** + * IClassActivator interface + */ +/* FIXME: not implemented */ + + +/***************************************************************************** + * IEnumMoniker interface + */ +/* FIXME: not implemented */ + + +/***************************************************************************** + * IMoniker interface + */ +/* FIXME: not implemented */ + +HRESULT WINAPI CreateFileMoniker16(LPCOLESTR16 lpszPathName,LPMONIKER* ppmk); +HRESULT WINAPI CreateFileMoniker32(LPCOLESTR32 lpszPathName,LPMONIKER* ppmk); +#define CreateFileMoniker WINELIB_NAME(CreateFileMoniker) + +HRESULT WINAPI CreateItemMoniker32(LPCOLESTR32 lpszDelim,LPCOLESTR32 lpszItem,LPMONIKER* ppmk); +#define CreateItemMoniker WINELIB_NAME(CreateItemMoniker) + + +/***************************************************************************** + * IROTData interface + */ +/* FIXME: not implemented */ + + +/***************************************************************************** + * IRunnableObject interface + */ +/* FIXME: not implemented */ + + +/***************************************************************************** + * IRunningObjectTable interface + */ +/* FIXME: not implemented */ + + +#endif /* __WINE_WINE_OBJ_MONIKER_H */ diff --git a/include/wine/obj_propertystorage.h b/include/wine/obj_propertystorage.h new file mode 100644 index 00000000000..837daa13d16 --- /dev/null +++ b/include/wine/obj_propertystorage.h @@ -0,0 +1,52 @@ +/* + * Defines the COM interfaces and APIs related to saving properties to file. + * + * Depends on 'obj_storage.h' and 'obj_base.h'. + */ + +#ifndef __WINE_WINE_OBJ_PROPERTYSTORAGE_H +#define __WINE_WINE_OBJ_PROPERTYSTORAGE_H + + +/***************************************************************************** + * Predeclare the interfaces + */ +DEFINE_OLEGUID(IID_IEnumSTATPROPSETSTG, 0x0000013bL, 0, 0); +typedef struct IEnumSTATPROPSETSTG IEnumSTATPROPSETSTG,*LPENUMSTATPROPSETSTG; + +DEFINE_OLEGUID(IID_IEnumSTATPROPSTG, 0x00000139L, 0, 0); +typedef struct IEnumSTATPROPSTG IEnumSTATPROPSTG,*LPENUMSTATPROPSTG; + +DEFINE_OLEGUID(IID_IPropertySetStorage, 0x0000013aL, 0, 0); +typedef struct IPropertySetStorage IPropertySetStorage,*LPPROPERTYSETSTORAGE; + +DEFINE_OLEGUID(IID_IPropertyStorage, 0x00000138L, 0, 0); +typedef struct IPropertyStorage IPropertyStorage,*LPPROPERTYSTORAGE; + + +/***************************************************************************** + * IEnumSTATPROPSETSTG interface + */ +/* FIXME: not implemented */ + + +/***************************************************************************** + * IEnumSTATPROPSTG interface + */ +/* FIXME: not implemented */ + + +/***************************************************************************** + * IPropertySetStorage interface + */ +/* FIXME: not implemented */ + + +/***************************************************************************** + * IPropertyStorage interface + */ +/* FIXME: not implemented */ + + + +#endif /* __WINE_WINE_OBJ_PROPERTYSTORAGE_H */ diff --git a/include/wine/obj_storage.h b/include/wine/obj_storage.h new file mode 100644 index 00000000000..88797d661bc --- /dev/null +++ b/include/wine/obj_storage.h @@ -0,0 +1,459 @@ +/* + * Defines the COM interfaces and APIs related to structured data storage. + * + * Depends on 'obj_base.h'. + */ + +#ifndef __WINE_WINE_OBJ_STORAGE_H +#define __WINE_WINE_OBJ_STORAGE_H + + +#include "winnt.h" + + +/***************************************************************************** + * Predeclare the structures + */ +typedef LPOLESTR16 *SNB16; +typedef LPOLESTR32 *SNB32; +DECL_WINELIB_TYPE(SNB) + +typedef struct STATSTG STATSTG; + + +/***************************************************************************** + * Predeclare the interfaces + */ +DEFINE_OLEGUID(IID_IEnumSTATSTG, 0x0000000dL, 0, 0); +typedef struct IEnumSTATSTG IEnumSTATSTG,*LPENUMSTATSTG; + +DEFINE_GUID (IID_IFillLockBytes, 0x99caf010L, 0x415e, 0x11cf, 0x88, 0x14, 0x00, 0xaa, 0x00, 0xb5, 0x69, 0xf5); +typedef struct IFillLockBytes IFillLockBytes,*LPFILLLOCKBYTES; + +DEFINE_GUID (IID_ILayoutStorage, 0x0e6d4d90L, 0x6738, 0x11cf, 0x96, 0x08, 0x00, 0xaa, 0x00, 0x68, 0x0d, 0xb4); +typedef struct ILayoutStorage ILayoutStorage,*LPLAYOUTSTORAGE; + +DEFINE_OLEGUID(IID_ILockBytes, 0x0000000aL, 0, 0); +typedef struct ILockBytes ILockBytes,*LPLOCKBYTES; + +DEFINE_OLEGUID(IID_IPersist, 0x0000010cL, 0, 0); +typedef struct IPersist IPersist,*LPPERSIST; + +DEFINE_OLEGUID(IID_IPersistFile, 0x0000010bL, 0, 0); +typedef struct IPersistFile IPersistFile,*LPPERSISTFILE; + +DEFINE_OLEGUID(IID_IPersistStorage, 0x0000010aL, 0, 0); +typedef struct IPersistStorage IPersistStorage,*LPPERSISTSTORAGE; + +DEFINE_OLEGUID(IID_IPersistStream, 0x00000109L, 0, 0); +typedef struct IPersistStream IPersistStream,*LPPERSISTSTREAM; + +DEFINE_GUID (IID_IProgressNotify, 0xa9d758a0L, 0x4617, 0x11cf, 0x95, 0xfc, 0x00, 0xaa, 0x00, 0x68, 0x0d, 0xb4); +typedef struct IProgressNotify IProgressNotify,*LPPROGRESSNOTIFY; + +DEFINE_OLEGUID(IID_IRootStorage, 0x00000012L, 0, 0); +typedef struct IRootStorage IRootStorage,*LPROOTSTORAGE; + +DEFINE_GUID (IID_ISequentialStream, 0x0c733a30L, 0x2a1c, 0x11ce, 0xad, 0xe5, 0x00, 0xaa, 0x00, 0x44, 0x77, 0x3d); +typedef struct ISequentialStream ISequentialStream,*LPSEQUENTIALSTREAM; + +DEFINE_OLEGUID(IID_IStorage, 0x0000000bL, 0, 0); +typedef struct IStorage16 IStorage16,*LPSTORAGE16; +typedef struct IStorage32 IStorage32,*LPSTORAGE32; +DECL_WINELIB_TYPE(IStorage) +DECL_WINELIB_TYPE(LPSTORAGE) + +DEFINE_OLEGUID(IID_IStream, 0x0000000cL, 0, 0); +typedef struct IStream16 IStream16,*LPSTREAM16; +typedef struct IStream32 IStream32,*LPSTREAM32; +DECL_WINELIB_TYPE(IStream) +DECL_WINELIB_TYPE(LPSTREAM) + + +/***************************************************************************** + * STGM enumeration + * + * See IStorage and IStream + */ +#define STGM_DIRECT 0x00000000 +#define STGM_TRANSACTED 0x00010000 +#define STGM_SIMPLE 0x08000000 +#define STGM_READ 0x00000000 +#define STGM_WRITE 0x00000001 +#define STGM_READWRITE 0x00000002 +#define STGM_SHARE_DENY_NONE 0x00000040 +#define STGM_SHARE_DENY_READ 0x00000030 +#define STGM_SHARE_DENY_WRITE 0x00000020 +#define STGM_SHARE_EXCLUSIVE 0x00000010 +#define STGM_PRIORITY 0x00040000 +#define STGM_DELETEONRELEASE 0x04000000 +#define STGM_CREATE 0x00001000 +#define STGM_CONVERT 0x00020000 +#define STGM_FAILIFTHERE 0x00000000 +#define STGM_NOSCRATCH 0x00100000 +#define STGM_NOSNAPSHOT 0x00200000 + + +/***************************************************************************** + * STATSTG structure + */ +struct STATSTG { + LPOLESTR16 pwcsName; + DWORD type; + ULARGE_INTEGER cbSize; + FILETIME mtime; + FILETIME ctime; + FILETIME atime; + DWORD grfMode; + DWORD grfLocksSupported; + CLSID clsid; + DWORD grfStateBits; + DWORD reserved; +}; + + +/***************************************************************************** + * IEnumSTATSTG interface + */ +/* FIXME: not implemented */ + + +/***************************************************************************** + * IFillLockBytes interface + */ +/* FIXME: not implemented */ + + +/***************************************************************************** + * ILayoutStorage interface + */ +/* FIXME: not implemented */ + + +/***************************************************************************** + * ILockBytes interface + */ +/* FIXME: not implemented */ + + +/***************************************************************************** + * IPersist interface + */ +#define ICOM_INTERFACE IPersist +ICOM_BEGIN(IPersist,IUnknown) + ICOM_CMETHOD1(HRESULT,GetClassID, CLSID*,pClassID); +ICOM_END(IPersist) +#undef ICOM_INTERFACE + +#if !defined(__cplusplus) || defined(CINTERFACE) +/*** IUnknown methods ***/ +#define IPersist_QueryInterface(p,a,b) ICOM_ICALL2(IUnknown,QueryInterface,p,a,b) +#define IPersist_AddRef(p) ICOM_ICALL (IUnknown,AddRef,p) +#define IPersist_Release(p) ICOM_ICALL (IUnknown,Release,p) +/*** IPersist methods ***/ +#define IPersist_GetClassID(p,a) ICOM_CALL1(GetClassID,p,a) +#endif + + +/***************************************************************************** + * IPersistFile interface + */ +#define ICOM_INTERFACE IPersistFile +ICOM_BEGIN(IPersistFile,IPersist) + ICOM_CMETHOD (HRESULT,IsDirty); + ICOM_METHOD2 (HRESULT,Load, LPCOLESTR32,pszFileName, DWORD,dwMode); + ICOM_METHOD2 (HRESULT,Save, LPCOLESTR32,pszFileName, BOOL32,fRemember); + ICOM_METHOD1 (HRESULT,SaveCompleted, LPCOLESTR32,pszFileName); + ICOM_CMETHOD1(HRESULT,GetCurFile, LPOLESTR32*,ppszFileName); +ICOM_END(IPersistFile) +#undef ICOM_INTERFACE + +#if !defined(__cplusplus) || defined(CINTERFACE) +/*** IUnknown methods ***/ +#define IPersistFile_QueryInterface(p,a,b) ICOM_ICALL2(IUnknown,QueryInterface,p,a,b) +#define IPersistFile_AddRef(p) ICOM_ICALL (IUnknown,AddRef,p) +#define IPersistFile_Release(p) ICOM_ICALL (IUnknown,Release,p) +/*** IPersist methods ***/ +#define IPersistFile_GetClassID(p,a) ICOM_ICALL1(IPersist,GetClassID,p,a) +/*** IPersistFile methods ***/ +#define IPersistFile_IsDirty(p) ICOM_CALL(IsDirty,p) +#define IPersistFile_Load(p,a,b) ICOM_CALL(Load,p,a,b) +#define IPersistFile_Save(p,a,b) ICOM_CALL(Save,p,a,b) +#define IPersistFile_SaveCompleted(p,a) ICOM_CALL(SaveCompleted,p,a) +#define IPersistFile_GetCurFile(p,a) ICOM_CALL(GetCurFile,p,a) +#endif + + +/***************************************************************************** + * IPersistStorage interface + */ +/* FIXME: not implemented */ + + +/***************************************************************************** + * IPersistStream interface + */ +/* FIXME: not implemented */ + + +/***************************************************************************** + * IProgressNotify interface + */ +/* FIXME: not implemented */ + + +/***************************************************************************** + * IRootStorage interface + */ +/* FIXME: not implemented */ + + +/***************************************************************************** + * ISequentialStream interface + */ +#define ICOM_INTERFACE ISequentialStream +ICOM_BEGIN(ISequentialStream,IUnknown) + ICOM_METHOD3(HRESULT,Read, void*,pv, ULONG,cb, ULONG*,pcbRead); + ICOM_METHOD3(HRESULT,Write, const void*,pv, ULONG,cb, ULONG*,pcbWritten); +ICOM_END(ISequentialStream) +#undef ICOM_INTERFACE + +#if !defined(__cplusplus) || defined(CINTERFACE) +/*** IUnknown methods ***/ +#define ISequentialStream_QueryInterface(p,a,b) ICOM_ICALL2(IUnknown,QueryInterface,p,a,b) +#define ISequentialStream_AddRef(p) ICOM_ICALL (IUnknown,AddRef,p) +#define ISequentialStream_Release(p) ICOM_ICALL (IUnknown,Release,p) +/*** ISequentialStream methods ***/ +#define ISequentialStream_Read(p,a,b,c) ICOM_CALL3(Read,p,a,b,c) +#define ISequentialStream_Write(p,a,b,c) ICOM_CALL3(Write,p,a,b,c) +#endif + + +/***************************************************************************** + * IStorage interface + */ +#define ICOM_INTERFACE IStorage16 +ICOM_BEGIN(IStorage16,IUnknown) + ICOM_METHOD5(HRESULT,CreateStream, LPCOLESTR16,pwcsName, DWORD,grfMode, DWORD,reserved1, DWORD,reserved2, IStream16**,ppstm) + ICOM_METHOD5(HRESULT,OpenStream, LPCOLESTR16,pwcsName, void*,reserved1, DWORD,grfMode, DWORD,reserved2, IStream16**,ppstm) + ICOM_METHOD5(HRESULT,CreateStorage, LPCOLESTR16,pwcsName, DWORD,grfMode, DWORD,dwStgFmt, DWORD,reserved2, IStorage16**,ppstg) + ICOM_METHOD6(HRESULT,OpenStorage, LPCOLESTR16,pwcsName, IStorage16*,pstgPriority, DWORD,grfMode, SNB16,snb16Exclude, DWORD,reserved, IStorage16**,ppstg) + ICOM_METHOD4(HRESULT,CopyTo, DWORD,ciidExclude, const IID*,rgiidExclude, SNB16,snb16Exclude, IStorage16*,pstgDest) + ICOM_METHOD4(HRESULT,MoveElementTo, LPCOLESTR16,pwcsName, IStorage16*,pstgDest, LPCOLESTR16,pwcsNewName, DWORD,grfFlags) + ICOM_METHOD1(HRESULT,Commit, DWORD,grfCommitFlags) + ICOM_METHOD (HRESULT,Revert) + ICOM_METHOD4(HRESULT,EnumElements, DWORD,reserved1, void*,reserved2, DWORD,reserved3, IEnumSTATSTG**,ppenum) + ICOM_METHOD1(HRESULT,DestroyElement, LPCOLESTR16,pwcsName) + ICOM_METHOD2(HRESULT,RenameElement, LPCOLESTR16,pwcsOldName, LPCOLESTR16,pwcsNewName) + ICOM_METHOD4(HRESULT,SetElementTimes,LPCOLESTR16,pwcsName, const FILETIME*,pctime, const FILETIME*,patime, const FILETIME*,pmtime) + ICOM_METHOD1(HRESULT,SetClass, REFCLSID,clsid) + ICOM_METHOD2(HRESULT,SetStateBits, DWORD,grfStateBits, DWORD,grfMask) + ICOM_METHOD2(HRESULT,Stat, STATSTG*,pstatstg, DWORD,grfStatFlag) +ICOM_END(IStorage16) +#undef ICOM_INTERFACE + +#if !defined(__cplusplus) || defined(CINTERFACE) +/*** IUnknown methods ***/ +#define IStorage16_QueryInterface(p,a,b) ICOM_ICALL2(IUnknown,QueryInterface,p,a,b) +#define IStorage16_AddRef(p) ICOM_ICALL (IUnknown,AddRef,p) +#define IStorage16_Release(p) ICOM_ICALL (IUnknown,Release,p) +/*** IStorage16 methods ***/ +#define IStorage16_CreateStream(p,a,b,c,d,e) ICOM_CALL5(CreateStream,p,a,b,c,d,e) +#define IStorage16_OpenStream(p,a,b,c,d,e) ICOM_CALL5(OpenStream,p,a,b,c,d,e) +#define IStorage16_CreateStorage(p,a,b,c,d,e) ICOM_CALL5(CreateStorage,p,a,b,c,d,e) +#define IStorage16_OpenStorage(p,a,b,c,d,e,f) ICOM_CALL6(OpenStorage,p,a,b,c,d,e,f) +#define IStorage16_CopyTo(p,a,b,c,d) ICOM_CALL4(CopyTo,p,a,b,c,d) +#define IStorage16_MoveElementTo(p,a,b,c,d) ICOM_CALL4(MoveElementTo,p,a,b,c,d) +#define IStorage16_Commit(p,a) ICOM_CALL1(Commit,p,a) +#define IStorage16_Revert(p) ICOM_CALL (Revert,p) +#define IStorage16_EnumElements(p,a,b,c,d) ICOM_CALL4(EnumElements,p,a,b,c,d) +#define IStorage16_DestroyElement(p,a) ICOM_CALL1(DestroyElement,p,a) +#define IStorage16_RenameElement(p,a,b) ICOM_CALL2(RenameElement,p,a,b) +#define IStorage16_SetElementTimes(p,a,b,c,d) ICOM_CALL4(SetElementTimes,p,a,b,c,d) +#define IStorage16_SetClass(p,a) ICOM_CALL1(SetClass,p,a) +#define IStorage16_SetStateBits(p,a,b) ICOM_CALL2(SetStateBits,p,a,b) +#define IStorage16_Stat(p,a,b) ICOM_CALL2(Stat,p,a,b) +#endif + + +#define ICOM_INTERFACE IStorage32 +ICOM_BEGIN(IStorage32,IUnknown) + ICOM_METHOD5(HRESULT,CreateStream, LPCOLESTR32,pwcsName, DWORD,grfMode, DWORD,reserved1, DWORD,reserved2, IStream32**,ppstm); + ICOM_METHOD5(HRESULT,OpenStream, LPCOLESTR32,pwcsName, void*,reserved1, DWORD,grfMode, DWORD,reserved2, IStream32**,ppstm); + ICOM_METHOD5(HRESULT,CreateStorage, LPCOLESTR32,pwcsName, DWORD,grfMode, DWORD,dwStgFmt, DWORD,reserved2, IStorage32**,ppstg); + ICOM_METHOD6(HRESULT,OpenStorage, LPCOLESTR32,pwcsName, IStorage32*,pstgPriority, DWORD,grfMode, SNB32,snb16Exclude, DWORD,reserved, IStorage32**,ppstg); + ICOM_METHOD4(HRESULT,CopyTo, DWORD,ciidExclude, const IID*,rgiidExclude, SNB32,snb16Exclude, IStorage32*,pstgDest); + ICOM_METHOD4(HRESULT,MoveElementTo, LPCOLESTR32,pwcsName, IStorage32*,pstgDest, LPCOLESTR32,pwcsNewName, DWORD,grfFlags); + ICOM_METHOD1(HRESULT,Commit, DWORD,grfCommitFlags); + ICOM_METHOD (HRESULT,Revert); + ICOM_METHOD4(HRESULT,EnumElements, DWORD,reserved1, void*,reserved2, DWORD,reserved3, IEnumSTATSTG**,ppenum); + ICOM_METHOD1(HRESULT,DestroyElement, LPCOLESTR32,pwcsName); + ICOM_METHOD2(HRESULT,RenameElement, LPCOLESTR32,pwcsOldName, LPCOLESTR32,pwcsNewName); + ICOM_METHOD4(HRESULT,SetElementTimes,LPCOLESTR32,pwcsName, const FILETIME*,pctime, const FILETIME*,patime, const FILETIME*,pmtime); + ICOM_METHOD1(HRESULT,SetClass, REFCLSID,clsid); + ICOM_METHOD2(HRESULT,SetStateBits, DWORD,grfStateBits, DWORD,grfMask); + ICOM_METHOD2(HRESULT,Stat, STATSTG*,pstatstg, DWORD,grfStatFlag); +ICOM_END(IStorage32) +#undef ICOM_INTERFACE + +#if !defined(__cplusplus) || defined(CINTERFACE) +/*** IUnknown methods ***/ +#define IStorage32_QueryInterface(p,a,b) ICOM_ICALL2(IUnknown,QueryInterface,p,a,b) +#define IStorage32_AddRef(p) ICOM_ICALL (IUnknown,AddRef,p) +#define IStorage32_Release(p) ICOM_ICALL (IUnknown,Release,p) +/*** IStorage32 methods ***/ +#define IStorage32_CreateStream(p,a,b,c,d,e) ICOM_CALL5(CreateStream,p,a,b,c,d,e) +#define IStorage32_OpenStream(p,a,b,c,d,e) ICOM_CALL5(OpenStream,p,a,b,c,d,e) +#define IStorage32_CreateStorage(p,a,b,c,d,e) ICOM_CALL5(CreateStorage,p,a,b,c,d,e) +#define IStorage32_OpenStorage(p,a,b,c,d,e,f) ICOM_CALL6(OpenStorage,p,a,b,c,d,e,f) +#define IStorage32_CopyTo(p,a,b,c,d) ICOM_CALL4(CopyTo,p,a,b,c,d) +#define IStorage32_MoveElementTo(p,a,b,c,d) ICOM_CALL4(MoveElementTo,p,a,b,c,d) +#define IStorage32_Commit(p,a) ICOM_CALL1(Commit,p,a) +#define IStorage32_Revert(p) ICOM_CALL (Revert,p) +#define IStorage32_EnumElements(p,a,b,c,d) ICOM_CALL4(EnumElements,p,a,b,c,d) +#define IStorage32_DestroyElement(p,a) ICOM_CALL1(DestroyElement,p,a) +#define IStorage32_RenameElement(p,a,b) ICOM_CALL2(RenameElement,p,a,b) +#define IStorage32_SetElementTimes(p,a,b,c,d) ICOM_CALL4(SetElementTimes,p,a,b,c,d) +#define IStorage32_SetClass(p,a) ICOM_CALL1(SetClass,p,a) +#define IStorage32_SetStateBits(p,a,b) ICOM_CALL2(SetStateBits,p,a,b) +#define IStorage32_Stat(p,a,b) ICOM_CALL2(Stat,p,a,b) + +#ifndef __WINE__ +/* Duplicated for WINELIB */ +/*** IUnknown methods ***/ +#define IStorage_QueryInterface(p,a,b) ICOM_ICALL2(IUnknown,QueryInterface,p,a,b) +#define IStorage_AddRef(p) ICOM_ICALL (IUnknown,AddRef,p) +#define IStorage_Release(p) ICOM_ICALL (IUnknown,Release,p) +/*** IStorage methods ***/ +#define IStorage_CreateStream(p,a,b,c,d,e) ICOM_CALL5(CreateStream,p,a,b,c,d,e) +#define IStorage_OpenStream(p,a,b,c,d,e) ICOM_CALL5(OpenStream,p,a,b,c,d,e) +#define IStorage_CreateStorage(p,a,b,c,d,e) ICOM_CALL5(CreateStorage,p,a,b,c,d,e) +#define IStorage_OpenStorage(p,a,b,c,d,e,f) ICOM_CALL6(OpenStorage,p,a,b,c,d,e,f) +#define IStorage_CopyTo(p,a,b,c,d) ICOM_CALL4(CopyTo,p,a,b,c,d) +#define IStorage_MoveElementTo(p,a,b,c,d) ICOM_CALL4(MoveElementTo,p,a,b,c,d) +#define IStorage_Commit(p,a) ICOM_CALL1(Commit,p,a) +#define IStorage_Revert(p) ICOM_CALL (Revert,p) +#define IStorage_EnumElements(p,a,b,c,d) ICOM_CALL4(EnumElements,p,a,b,c,d) +#define IStorage_DestroyElement(p,a) ICOM_CALL1(DestroyElement,p,a) +#define IStorage_RenameElement(p,a,b) ICOM_CALL2(RenameElement,p,a,b) +#define IStorage_SetElementTimes(p,a,b,c,d) ICOM_CALL4(SetElementTimes,p,a,b,c,d) +#define IStorage_SetClass(p,a) ICOM_CALL1(SetClass,p,a) +#define IStorage_SetStateBits(p,a,b) ICOM_CALL2(SetStateBits,p,a,b) +#define IStorage_Stat(p,a,b) ICOM_CALL2(Stat,p,a,b) +#endif +#endif + + +/***************************************************************************** + * IStream interface + */ +#define ICOM_INTERFACE IStream16 +ICOM_BEGIN(IStream16,ISequentialStream) + ICOM_METHOD3(HRESULT,Seek, LARGE_INTEGER,dlibMove, DWORD,dwOrigin, ULARGE_INTEGER*,plibNewPosition); + ICOM_METHOD1(HRESULT,SetSize, ULARGE_INTEGER,libNewSize); + ICOM_METHOD4(HRESULT,CopyTo, IStream16*,pstm, ULARGE_INTEGER,cb, ULARGE_INTEGER*,pcbRead, ULARGE_INTEGER*,pcbWritten); + ICOM_METHOD1(HRESULT,Commit, DWORD,grfCommitFlags); + ICOM_METHOD (HRESULT,Revert); + ICOM_METHOD3(HRESULT,LockRegion, ULARGE_INTEGER,libOffset, ULARGE_INTEGER,cb, DWORD,dwLockType); + ICOM_METHOD3(HRESULT,UnlockRegion,ULARGE_INTEGER,libOffset, ULARGE_INTEGER,cb, DWORD,dwLockType); + ICOM_METHOD2(HRESULT,Stat, STATSTG*,pstatstg, DWORD,grfStatFlag); + ICOM_METHOD1(HRESULT,Clone, IStream16**,ppstm); +ICOM_END(IStream16) +#undef ICOM_INTERFACE + +#if !defined(__cplusplus) || defined(CINTERFACE) +/*** IUnknown methods ***/ +#define IStream16_QueryInterface(p,a,b) ICOM_ICALL2(IUnknown,QueryInterface,p,a,b) +#define IStream16_AddRef(p) ICOM_ICALL (IUnknown,AddRef,p) +#define IStream16_Release(p) ICOM_ICALL (IUnknown,Release,p) +/*** ISequentialStream methods ***/ +#define IStream16_Read(p,a,b,c) ICOM_ICALL3(ISequentialStream,Read,p,a,b,c) +#define IStream16_Write(p,a,b,c) ICOM_ICALL3(ISequentialStream,Write,p,a,b,c) +/*** IStream16 methods ***/ +#define IStream16_Seek(p) ICOM_CALL3(Seek,p) +#define IStream16_SetSize(p,a,b) ICOM_CALL1(SetSize,p,a,b) +#define IStream16_CopyTo(pa,b,c,d) ICOM_CALL4(CopyTo,pa,b,c,d) +#define IStream16_Commit(p,a) ICOM_CALL1(Commit,p,a) +#define IStream16_Revert(p) ICOM_CALL (Revert,p) +#define IStream16_LockRegion(pa,b,c) ICOM_CALL3(LockRegion,pa,b,c) +#define IStream16_UnlockRegion(p,a,b,c) ICOM_CALL3(UnlockRegion,p,a,b,c) +#define IStream16_Stat(p,a,b) ICOM_CALL2(Stat,p,a,b) +#define IStream16_Clone(p,a) ICOM_CALL1(Clone,p,a) +#endif + + +#define ICOM_INTERFACE IStream32 +ICOM_BEGIN(IStream32,ISequentialStream) + ICOM_METHOD3(HRESULT,Seek, LARGE_INTEGER,dlibMove, DWORD,dwOrigin, ULARGE_INTEGER*,plibNewPosition); + ICOM_METHOD1(HRESULT,SetSize, ULARGE_INTEGER,libNewSize); + ICOM_METHOD4(HRESULT,CopyTo, IStream32*,pstm, ULARGE_INTEGER,cb, ULARGE_INTEGER*,pcbRead, ULARGE_INTEGER*,pcbWritten); + ICOM_METHOD1(HRESULT,Commit, DWORD,grfCommitFlags); + ICOM_METHOD (HRESULT,Revert); + ICOM_METHOD3(HRESULT,LockRegion, ULARGE_INTEGER,libOffset, ULARGE_INTEGER,cb, DWORD,dwLockType); + ICOM_METHOD3(HRESULT,UnlockRegion,ULARGE_INTEGER,libOffset, ULARGE_INTEGER,cb, DWORD,dwLockType); + ICOM_METHOD2(HRESULT,Stat, STATSTG*,pstatstg, DWORD,grfStatFlag); + ICOM_METHOD1(HRESULT,Clone, IStream32**,ppstm); +ICOM_END(IStream32) +#undef ICOM_INTERFACE + +#if !defined(__cplusplus) || defined(CINTERFACE) +/*** IUnknown methods ***/ +#define IStream32_QueryInterface(p,a,b) ICOM_ICALL2(IUnknown,QueryInterface,p,a,b) +#define IStream32_AddRef(p) ICOM_ICALL (IUnknown,AddRef,p) +#define IStream32_Release(p) ICOM_ICALL (IUnknown,Release,p) +/*** ISequentialStream methods ***/ +#define IStream32_Read(p,a,b,c) ICOM_ICALL3(ISequentialStream,Read,p,a,b,c) +#define IStream32_Write(p,a,b,c) ICOM_ICALL3(ISequentialStream,Write,p,a,b,c) +/*** IStream32 methods ***/ +#define IStream32_Seek(p) ICOM_CALL3(Seek,p) +#define IStream32_SetSize(p,a,b) ICOM_CALL1(SetSize,p,a,b) +#define IStream32_CopyTo(pa,b,c,d) ICOM_CALL4(CopyTo,pa,b,c,d) +#define IStream32_Commit(p,a) ICOM_CALL1(Commit,p,a) +#define IStream32_Revert(p) ICOM_CALL (Revert,p) +#define IStream32_LockRegion(pa,b,c) ICOM_CALL3(LockRegion,pa,b,c) +#define IStream32_UnlockRegion(p,a,b,c) ICOM_CALL3(UnlockRegion,p,a,b,c) +#define IStream32_Stat(p,a,b) ICOM_CALL2(Stat,p,a,b) +#define IStream32_Clone(p,a) ICOM_CALL1(Clone,p,a) + +#ifndef __WINE__ +/* Duplicated for WINELIB */ +/*** IUnknown methods ***/ +#define IStream_QueryInterface(p,a,b) ICOM_ICALL2(IUnknown,QueryInterface,p,a,b) +#define IStream_AddRef(p) ICOM_ICALL (IUnknown,AddRef,p) +#define IStream_Release(p) ICOM_ICALL (IUnknown,Release,p) +/*** ISequentialStream methods ***/ +#define IStream_Read(p,a,b,c) ICOM_ICALL3(ISequentialStream,Read,p,a,b,c) +#define IStream_Write(p,a,b,c) ICOM_ICALL3(ISequentialStream,Write,p,a,b,c) +/*** IStream methods ***/ +#define IStream_Seek(p) ICOM_CALL3(Seek,p) +#define IStream_SetSize(p,a,b) ICOM_CALL1(SetSize,p,a,b) +#define IStream_CopyTo(pa,b,c,d) ICOM_CALL4(CopyTo,pa,b,c,d) +#define IStream_Commit(p,a) ICOM_CALL1(Commit,p,a) +#define IStream_Revert(p) ICOM_CALL (Revert,p) +#define IStream_LockRegion(pa,b,c) ICOM_CALL3(LockRegion,pa,b,c) +#define IStream_UnlockRegion(p,a,b,c) ICOM_CALL3(UnlockRegion,p,a,b,c) +#define IStream_Stat(p,a,b) ICOM_CALL2(Stat,p,a,b) +#define IStream_Clone(p,a) ICOM_CALL1(Clone,p,a) +#endif +#endif + + +/***************************************************************************** + * StgXXX API + */ +/* FIXME: many functions are missing */ +HRESULT WINAPI StgCreateDocFile16(LPCOLESTR16 pwcsName,DWORD grfMode,DWORD reserved,IStorage16 **ppstgOpen); +HRESULT WINAPI StgCreateDocfile32(LPCOLESTR32 pwcsName,DWORD grfMode,DWORD reserved,IStorage32 **ppstgOpen); +#define StgCreateDocfile WINELIB_NAME(StgCreateDocfile) + +HRESULT WINAPI StgIsStorageFile16(LPCOLESTR16 fn); +HRESULT WINAPI StgIsStorageFile32(LPCOLESTR32 fn); +#define StgIsStorageFile WINELIB_NAME(StgIsStorageFile) + +HRESULT WINAPI StgOpenStorage16(const OLECHAR16* pwcsName,IStorage16* pstgPriority,DWORD grfMode,SNB16 snbExclude,DWORD reserved,IStorage16**ppstgOpen); +HRESULT WINAPI StgOpenStorage32(const OLECHAR32* pwcsName,IStorage32* pstgPriority,DWORD grfMode,SNB32 snbExclude,DWORD reserved,IStorage32**ppstgOpen); +#define StgOpenStorage WINELIB_NAME(StgOpenStorage) + + + +#endif /* __WINE_WINE_OBJ_STORAGE_H */ diff --git a/include/winerror.h b/include/winerror.h index da07d755444..b7fdcbbaf42 100644 --- a/include/winerror.h +++ b/include/winerror.h @@ -145,8 +145,9 @@ extern int WIN32_LastError; /* HRESULT values for OLE, SHELL and other Interface stuff */ /* the codes 4000-40ff are reserved for OLE */ -#define NOERROR 0 -#define S_OK 0 +#define NOERROR 0L +#define S_OK ((HRESULT)0L) +#define S_FALSE ((HRESULT)1L) #define DISP_E_BADVARTYPE 0x80020008L #define DISP_E_OVERFLOW 0x8002000AL diff --git a/include/wtypes.h b/include/wtypes.h new file mode 100644 index 00000000000..8d213494f20 --- /dev/null +++ b/include/wtypes.h @@ -0,0 +1,68 @@ +/* + * Defines the basic types used by COM interfaces. + */ + +#ifndef __WINE_WTYPES_H +#define __WINE_WTYPES_H + + +#include "wintypes.h" + + +typedef WORD CLIPFORMAT32, *LPCLIPFORMAT32; +DECL_WINELIB_TYPE(CLIPFORMAT) + +typedef CHAR OLECHAR16; +typedef WCHAR OLECHAR32; +DECL_WINELIB_TYPE(OLECHAR) + +typedef LPSTR LPOLESTR16; +typedef LPWSTR LPOLESTR32; +DECL_WINELIB_TYPE(LPOLESTR) + +typedef LPCSTR LPCOLESTR16; +typedef LPCWSTR LPCOLESTR32; +DECL_WINELIB_TYPE(LPCOLESTR) + +typedef OLECHAR16 *BSTR16; +typedef OLECHAR32 *BSTR32; +DECL_WINELIB_TYPE(BSTR) + +typedef BSTR16 *LPBSTR16; +typedef BSTR32 *LPBSTR32; +DECL_WINELIB_TYPE(LPBSTR) + +struct _GUID +{ + DWORD Data1; + WORD Data2; + WORD Data3; + BYTE Data4[8]; +}; + +typedef struct _GUID GUID,*LPGUID,*REFGUID; +typedef struct _GUID CLSID,*LPCLSID,*REFCLSID; +typedef struct _GUID IID,*REFIID,*LPIID; + +#define DECLARE_HANDLE(a) typedef HANDLE16 a##16; typedef HANDLE32 a##32 +DECLARE_HANDLE(HMETAFILEPICT); +#undef DECLARE_HANDLE + +typedef enum tagCLSCTX +{ + CLSCTX_INPROC_SERVER = 0x1, + CLSCTX_INPROC_HANDLER = 0x2, + CLSCTX_LOCAL_SERVER = 0x4, + CLSCTX_INPROC_SERVER16 = 0x8, + CLSCTX_REMOTE_SERVER = 0x10, + CLSCTX_INPROC_HANDLER16 = 0x20, + CLSCTX_INPROC_SERVERX86 = 0x40, + CLSCTX_INPROC_HANDLERX86 = 0x80 +} CLSCTX; + +#define CLSCTX_INPROC (CLSCTX_INPROC_SERVER | CLSCTX_INPROC_HANDLER) +#define CLSCTX_ALL (CLSCTX_INPROC_SERVER | CLSCTX_INPROC_HANDLER | CLSCTX_LOCAL_SERVER | CLSCTX_REMOTE_SERVER) +#define CLSCTX_SERVER (CLSCTX_INPROC_SERVER | CLSCTX_LOCAL_SERVER | CLSCTX_REMOTE_SERVER) + + +#endif /* __WINE_WTYPES_H */ diff --git a/include/x11drv.h b/include/x11drv.h index 01dfb7ad78d..1e896044b93 100644 --- a/include/x11drv.h +++ b/include/x11drv.h @@ -272,6 +272,8 @@ extern WORD X11DRV_KEYBOARD_VkKeyScan(CHAR cChar); extern UINT16 X11DRV_KEYBOARD_MapVirtualKey(UINT16 wCode, UINT16 wMapType); extern INT16 X11DRV_KEYBOARD_GetKeyNameText(LONG lParam, LPSTR lpBuffer, INT16 nSize); extern INT16 X11DRV_KEYBOARD_ToAscii(UINT16 virtKey, UINT16 scanCode, LPBYTE lpKeyState, LPVOID lpChar, UINT16 flags); +extern void KEYBOARD_HandleEvent( WND *pWnd, XKeyEvent *event ); +extern void KEYBOARD_UpdateState ( void ); /* X11 mouse driver */ diff --git a/libtest/.cvsignore b/libtest/.cvsignore index 19e32470ebd..eff5fce5cac 100644 --- a/libtest/.cvsignore +++ b/libtest/.cvsignore @@ -9,3 +9,5 @@ hello4 hello5 new rolex +vartest +volinfo diff --git a/libtest/Makefile.in b/libtest/Makefile.in index 084a2a6c692..f93f344d9d7 100644 --- a/libtest/Makefile.in +++ b/libtest/Makefile.in @@ -4,7 +4,7 @@ SRCDIR = @srcdir@ VPATH = @srcdir@ MODULE = none RCFLAGS = -w32 -h -PROGRAMS = expand hello hello2 hello3 hello4 hello5 new rolex volinfo +PROGRAMS = expand hello hello2 hello3 hello4 hello5 new rolex vartest volinfo ALL_LIBS = $(WINELIB) $(X_LIBS) $(XLIB) $(LIBS) C_SRCS = \ @@ -16,6 +16,7 @@ C_SRCS = \ hello5.c \ new.c \ rolex.c \ + vartest.c \ volinfo.c RC_SRCS = \ @@ -54,6 +55,9 @@ new: new.o rolex: rolex.o $(CC) -o rolex rolex.o $(LDOPTIONS) $(ALL_LIBS) +vartest: vartest.o + $(CC) -o vartest vartest.o $(LDOPTIONS) $(ALL_LIBS) + volinfo: volinfo.o $(CC) -o volinfo volinfo.o $(LDOPTIONS) $(ALL_LIBS) diff --git a/libtest/vartest-Win32.log b/libtest/vartest-Win32.log new file mode 100644 index 00000000000..3377dcc6a2c --- /dev/null +++ b/libtest/vartest-Win32.log @@ -0,0 +1,1800 @@ + + +======== Testing VarUI1FromXXX ======== +VarUI1FromI2: passing in NULL as return val makes it crash, 0 +VarUI1FromStr: passing in NULL as param: 80020005 +VarUI1FromI2: 0, 0, 0 +VarUI1FromI2: 69, 45, 0 +VarUI1FromI2: 70, 46, 0 +VarUI1FromI2: 128, 80, 0 +VarUI1FromI2: 255, FF, 0 +VarUI1FromI2: 256, FF, 8002000A +VarUI1FromI2: 257, FF, 8002000A +VarUI1FromR8: 0.0, 0, 0 +VarUI1FromR8: 69.33, 45, 0 +VarUI1FromR8: 69.66, 46, 0 +VarUI1FromR8: -69.33, 46, 8002000A +VarUI1FromR8: -69.66, 46, 8002000A +VarUI1FromR8: -0.5, 0, 0 +VarUI1FromR8: -0.51, 0, 8002000A +VarUI1FromR8: -0.49, 0, 0 +VarUI1FromR8: 0.5, 0, 0 +VarUI1FromR8: 0.51, 1, 0 +VarUI1FromR8: 0.49, 0, 0 +VarUI1FromDate: 0.0, 0, 0 +VarUI1FromDate: 69.33, 45, 0 +VarUI1FromDate: 69.66, 46, 0 +VarUI1FromDate: -69.33, 46, 8002000A +VarUI1FromDate: -69.66, 46, 8002000A +VarUI1FromBool: VARIANT_TRUE, FF, 0 +VarUI1FromBool: VARIANT_FALSE, 0, 0 +VarUI1FromStr: "-2", 0, 8002000A +VarUI1FromStr: "-1", 0, 8002000A +VarUI1FromStr: "-0.51", 0, 8002000A +VarUI1FromStr: "-0.5", 0, 0 +VarUI1FromStr: "-0.49", 0, 0 +VarUI1FromStr: "-0.0", 0, 0 +VarUI1FromStr: "0.0", 0, 0 +VarUI1FromStr: "0.49", 0, 0 +VarUI1FromStr: "0.5", 0, 0 +VarUI1FromStr: "0.51", 1, 0 +VarUI1FromStr: "1", 1, 0 +VarUI1FromStr: "127", 7F, 0 +VarUI1FromStr: "128", 80, 0 +VarUI1FromStr: "129", 81, 0 +VarUI1FromStr: "255", FF, 0 +VarUI1FromStr: "256", FF, 8002000A +VarUI1FromStr: "257", FF, 8002000A +VarUI1FromStr: "32767", FF, 8002000A +VarUI1FromStr: "32768", FF, 8002000A +VarUI1FromStr: "-32768", FF, 8002000A +VarUI1FromStr: "-32769", FF, 8002000A +VarUI1FromStr: "16777216", FF, 8002000A +VarUI1FromStr: "16777217", FF, 8002000A +VarUI1FromStr: "-16777216", FF, 8002000A +VarUI1FromStr: "16777217", FF, 8002000A +VarUI1FromStr: "2147483647", FF, 8002000A +VarUI1FromStr: "2147483648", FF, 8002000A +VarUI1FromStr: "-2147483647", FF, 8002000A +VarUI1FromStr: "-2147483648", FF, 8002000A +VarUI1FromStr: "", FF, 80020005 +VarUI1FromStr: " ", FF, 80020005 +VarUI1FromStr: "1F", FF, 80020005 +VarUI1FromStr: "1G", FF, 80020005 +VarUI1FromStr: " 1 ", 1, 0 +VarUI1FromStr: " 1 2 ", 1, 80020005 +VarUI1FromStr: "1,2,3", 7B, 0 +VarUI1FromStr: "1 2 3", 7B, 80020005 +VarUI1FromStr: "1,2, 3", 7B, 80020005 +VarUI1FromStr: "1;2;3", 7B, 80020005 +VarUI1FromStr: "1.2.3", 7B, 80020005 +VarUI1FromStr: "0.", 0, 0 +VarUI1FromStr: ".0", 0, 0 +VarUI1FromStr: "0.1E12", 0, 8002000A +VarUI1FromStr: "2.4,E1", 18, 0 +VarUI1FromStr: " +3.2,E1", 20, 0 +VarUI1FromStr: "4E2.5", 20, 80020005 +VarUI1FromStr: " 2E+2", C8, 0 +VarUI1FromStr: "1 E+2", C8, 80020005 +VarUI1FromStr: ".", C8, 80020005 +VarUI1FromStr: ".E2", C8, 80020005 +VarUI1FromStr: "1000000000000000000000000000000000000000000000000000000000000000", C8, 8002000A +VarUI1FromStr: "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001", 1, 0 +VarUI1FromStr: "00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001", 1, 0 +VarUI1FromStr: "100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001", 1, 8002000A +VarUI1FromStr: "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001", 1, 0 +VarUI1FromStr: "65535", 1, 8002000A +VarUI1FromStr: "65535.5", 1, 8002000A +VarUI1FromStr: "65536", 1, 8002000A +VarUI1FromStr: "4294967295", 1, 8002000A +VarUI1FromStr: "4294967296", 1, 8002000A +VarUI1FromStr: "1 January 99", 1, 80020005 +VarUI1FromStr: "December 31, 2078", 1, 80020005 +VarUI1FromStr: "January 1, 1900", 1, 80020005 +VarUI1FromStr: "January 2 1900", 1, 80020005 +VarUI1FromStr: "11.11.1999", 1, 80020005 +VarUI1FromStr: "11/11/1999", 1, 80020005 +VarUI1FromStr: " 11 / 11 / 1999", 1, 80020005 +VarUI1FromStr: "11/11/1999:11:11:1134", 1, 80020005 +VarUI1FromStr: "11/11/1999 11:11:11:1", 1, 80020005 +VarUI1FromStr: " 1999/ 11/21 11 :11:11am", 1, 80020005 +VarUI1FromStr: "11/11/1999 11:11:11Am", 1, 80020005 +VarUI1FromStr: "11/11/1999 11:11:11PM", 1, 80020005 +VarUI1FromStr: "11/11/199911:11:11PM", 1, 80020005 +VarUI1FromStr: "11/11/1999 0:0:11am", 1, 80020005 +VarUI1FromStr: "11/11/1999 11,11:11am", 1, 80020005 +VarUI1FromStr: "11/11/1999 11:11:11am", 1, 80020005 +VarUI1FromStr: "11/11/1999 11/11:11am", 1, 80020005 +VarUI1FromStr: "11/11/1999 11:11AM", 1, 80020005 +VarUI1FromStr: "11/11/1999 1AM", 1, 80020005 +VarUI1FromStr: "11/11/1999 0AM", 1, 80020005 +VarUI1FromStr: "11/11/1999 11:11:11", 1, 80020005 +VarUI1FromStr: "11/13/1999 0AM", 1, 80020005 +VarUI1FromStr: "13/13/1999 0AM", 1, 80020005 +VarUI1FromStr: "13/11/1999 0AM", 1, 80020005 +VarUI1FromStr: "11/33/1999 0AM", 1, 80020005 +VarUI1FromStr: "11/11/1999 AM", 1, 80020005 +VarUI1FromStr: "1/1/0 0AM", 1, 80020005 +VarUI1FromStr: "1/1/-1 0AM", 1, 80020005 +VarUI1FromStr: "1999 January 3 9AM", 1, 80020005 +VarUI1FromStr: "1 January 1999 11AM", 1, 80020005 +VarUI1FromStr: "4AM 11/11/1999", 1, 80020005 +VarUI1FromStr: "4:22 11/11/1999 AM", 1, 80020005 +VarUI1FromStr: " 1 1 /11/1999", 1, 80020005 +VarUI1FromStr: "11-11/1999 11:11:11.12AM", 1, 80020005 +VarUI1FromStr: "1999 January 3, 9AM", 1, 80020005 +VarUI1FromStr: "December, 31, 2078", 1, 80020005 +VarUI1FromStr: "December, 31, 2078,", 1, 80020005 +VarUI1FromStr: "December, 31 2078", 1, 80020005 +VarUI1FromStr: "11/99", 1, 80020005 +VarUI1FromStr: "11-1999", 1, 80020005 +VarUI1FromStr: "true", 1, 80020005 +VarUI1FromStr: "True", 1, 80020005 +VarUI1FromStr: "TRue", 1, 80020005 +VarUI1FromStr: "TRUE", 1, 80020005 +VarUI1FromStr: " TRUE", 1, 80020005 +VarUI1FromStr: "FALSE ", 1, 80020005 +VarUI1FromStr: "False", 1, 80020005 +VarUI1FromStr: "JustSomeText", 1, 80020005 +VarUI1FromStr: "Just Some Text", 1, 80020005 +VarUI1FromStr: "", 1, 80020005 +VarUI1FromStr: "1.5", 2, 0 +VarUI1FromStr: "2.5", 2, 0 +VarUI1FromStr: "3.5", 4, 0 +VarUI1FromStr: "4.5", 4, 0 +VarUI1FromStr: "", 4, 80020005 +VarUI1FromStr: "", 4, 80020005 +VarUI1FromStr: "", 4, 80020005 +VarUI1FromStr: "", 4, 80020005 +VarUI1FromStr: "", 4, 80020005 +VarUI1FromStr: "", 4, 80020005 + + +======== Testing VarUI2FromXXX ======== +VarUI2FromI2: -1, 0, 8002000A +VarUI2FromI2: passing in NULL as return val makes it crash, 8002000A +VarUI2FromStr: passing in NULL as param: 80020005 +VarUI2FromI2: 0, 0, 0 +VarUI2FromI2: 69, 69, 0 +VarUI2FromI2: 70, 70, 0 +VarUI2FromI2: 128, 128, 0 +VarUI2FromI4: 65535, 65535, 0 +VarUI2FromI4: 65536, 65535, 8002000A +VarUI2FromI4: 65537, 65535, 8002000A +VarUI2FromR8: 0.0, 0, 0 +VarUI2FromR8: 69.33, 69, 0 +VarUI2FromR8: 69.66, 70, 0 +VarUI2FromR8: -69.33, 70, 8002000A +VarUI2FromR8: -69.66, 70, 8002000A +VarUI2FromR8: -0.5, 0, 0 +VarUI2FromR8: -0.51, 0, 8002000A +VarUI2FromR8: -0.49, 0, 0 +VarUI2FromR8: 0.5, 0, 0 +VarUI2FromR8: 0.51, 1, 0 +VarUI2FromR8: 0.49, 0, 0 +VarUI2FromDate: 0.0, 0, 0 +VarUI2FromDate: 69.33, 69, 0 +VarUI2FromDate: 69.66, 70, 0 +VarUI2FromDate: -69.33, 70, 8002000A +VarUI2FromDate: -69.66, 70, 8002000A +VarUI2FromBool: VARIANT_TRUE, 65535, 0 +VarUI2FromBool: VARIANT_FALSE, 0, 0 +VarUI2FromStr: "-2", 0, 8002000A +VarUI2FromStr: "-1", 0, 8002000A +VarUI2FromStr: "-0.51", 0, 8002000A +VarUI2FromStr: "-0.5", 0, 0 +VarUI2FromStr: "-0.49", 0, 0 +VarUI2FromStr: "-0.0", 0, 0 +VarUI2FromStr: "0.0", 0, 0 +VarUI2FromStr: "0.49", 0, 0 +VarUI2FromStr: "0.5", 0, 0 +VarUI2FromStr: "0.51", 1, 0 +VarUI2FromStr: "1", 1, 0 +VarUI2FromStr: "127", 127, 0 +VarUI2FromStr: "128", 128, 0 +VarUI2FromStr: "129", 129, 0 +VarUI2FromStr: "255", 255, 0 +VarUI2FromStr: "256", 256, 0 +VarUI2FromStr: "257", 257, 0 +VarUI2FromStr: "32767", 32767, 0 +VarUI2FromStr: "32768", 32768, 0 +VarUI2FromStr: "-32768", 32768, 8002000A +VarUI2FromStr: "-32769", 32768, 8002000A +VarUI2FromStr: "16777216", 32768, 8002000A +VarUI2FromStr: "16777217", 32768, 8002000A +VarUI2FromStr: "-16777216", 32768, 8002000A +VarUI2FromStr: "16777217", 32768, 8002000A +VarUI2FromStr: "2147483647", 32768, 8002000A +VarUI2FromStr: "2147483648", 32768, 8002000A +VarUI2FromStr: "-2147483647", 32768, 8002000A +VarUI2FromStr: "-2147483648", 32768, 8002000A +VarUI2FromStr: "", 32768, 80020005 +VarUI2FromStr: " ", 32768, 80020005 +VarUI2FromStr: "1F", 32768, 80020005 +VarUI2FromStr: "1G", 32768, 80020005 +VarUI2FromStr: " 1 ", 1, 0 +VarUI2FromStr: " 1 2 ", 1, 80020005 +VarUI2FromStr: "1,2,3", 123, 0 +VarUI2FromStr: "1 2 3", 123, 80020005 +VarUI2FromStr: "1,2, 3", 123, 80020005 +VarUI2FromStr: "1;2;3", 123, 80020005 +VarUI2FromStr: "1.2.3", 123, 80020005 +VarUI2FromStr: "0.", 0, 0 +VarUI2FromStr: ".0", 0, 0 +VarUI2FromStr: "0.1E12", 0, 8002000A +VarUI2FromStr: "2.4,E1", 24, 0 +VarUI2FromStr: " +3.2,E1", 32, 0 +VarUI2FromStr: "4E2.5", 32, 80020005 +VarUI2FromStr: " 2E+2", 200, 0 +VarUI2FromStr: "1 E+2", 200, 80020005 +VarUI2FromStr: ".", 200, 80020005 +VarUI2FromStr: ".E2", 200, 80020005 +VarUI2FromStr: "1000000000000000000000000000000000000000000000000000000000000000", 200, 8002000A +VarUI2FromStr: "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001", 1, 0 +VarUI2FromStr: "00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001", 1, 0 +VarUI2FromStr: "100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001", 1, 8002000A +VarUI2FromStr: "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001", 1, 0 +VarUI2FromStr: "65535", 65535, 0 +VarUI2FromStr: "65535.5", 65535, 8002000A +VarUI2FromStr: "65536", 65535, 8002000A +VarUI2FromStr: "4294967295", 65535, 8002000A +VarUI2FromStr: "4294967296", 65535, 8002000A +VarUI2FromStr: "1 January 99", 65535, 80020005 +VarUI2FromStr: "December 31, 2078", 65535, 80020005 +VarUI2FromStr: "January 1, 1900", 65535, 80020005 +VarUI2FromStr: "January 2 1900", 65535, 80020005 +VarUI2FromStr: "11.11.1999", 65535, 80020005 +VarUI2FromStr: "11/11/1999", 65535, 80020005 +VarUI2FromStr: " 11 / 11 / 1999", 65535, 80020005 +VarUI2FromStr: "11/11/1999:11:11:1134", 65535, 80020005 +VarUI2FromStr: "11/11/1999 11:11:11:1", 65535, 80020005 +VarUI2FromStr: " 1999/ 11/21 11 :11:11am", 65535, 80020005 +VarUI2FromStr: "11/11/1999 11:11:11Am", 65535, 80020005 +VarUI2FromStr: "11/11/1999 11:11:11PM", 65535, 80020005 +VarUI2FromStr: "11/11/199911:11:11PM", 65535, 80020005 +VarUI2FromStr: "11/11/1999 0:0:11am", 65535, 80020005 +VarUI2FromStr: "11/11/1999 11,11:11am", 65535, 80020005 +VarUI2FromStr: "11/11/1999 11:11:11am", 65535, 80020005 +VarUI2FromStr: "11/11/1999 11/11:11am", 65535, 80020005 +VarUI2FromStr: "11/11/1999 11:11AM", 65535, 80020005 +VarUI2FromStr: "11/11/1999 1AM", 65535, 80020005 +VarUI2FromStr: "11/11/1999 0AM", 65535, 80020005 +VarUI2FromStr: "11/11/1999 11:11:11", 65535, 80020005 +VarUI2FromStr: "11/13/1999 0AM", 65535, 80020005 +VarUI2FromStr: "13/13/1999 0AM", 65535, 80020005 +VarUI2FromStr: "13/11/1999 0AM", 65535, 80020005 +VarUI2FromStr: "11/33/1999 0AM", 65535, 80020005 +VarUI2FromStr: "11/11/1999 AM", 65535, 80020005 +VarUI2FromStr: "1/1/0 0AM", 65535, 80020005 +VarUI2FromStr: "1/1/-1 0AM", 65535, 80020005 +VarUI2FromStr: "1999 January 3 9AM", 65535, 80020005 +VarUI2FromStr: "1 January 1999 11AM", 65535, 80020005 +VarUI2FromStr: "4AM 11/11/1999", 65535, 80020005 +VarUI2FromStr: "4:22 11/11/1999 AM", 65535, 80020005 +VarUI2FromStr: " 1 1 /11/1999", 65535, 80020005 +VarUI2FromStr: "11-11/1999 11:11:11.12AM", 65535, 80020005 +VarUI2FromStr: "1999 January 3, 9AM", 65535, 80020005 +VarUI2FromStr: "December, 31, 2078", 65535, 80020005 +VarUI2FromStr: "December, 31, 2078,", 65535, 80020005 +VarUI2FromStr: "December, 31 2078", 65535, 80020005 +VarUI2FromStr: "11/99", 65535, 80020005 +VarUI2FromStr: "11-1999", 65535, 80020005 +VarUI2FromStr: "true", 65535, 80020005 +VarUI2FromStr: "True", 65535, 80020005 +VarUI2FromStr: "TRue", 65535, 80020005 +VarUI2FromStr: "TRUE", 65535, 80020005 +VarUI2FromStr: " TRUE", 65535, 80020005 +VarUI2FromStr: "FALSE ", 65535, 80020005 +VarUI2FromStr: "False", 65535, 80020005 +VarUI2FromStr: "JustSomeText", 65535, 80020005 +VarUI2FromStr: "Just Some Text", 65535, 80020005 +VarUI2FromStr: "", 65535, 80020005 +VarUI2FromStr: "1.5", 2, 0 +VarUI2FromStr: "2.5", 2, 0 +VarUI2FromStr: "3.5", 4, 0 +VarUI2FromStr: "4.5", 4, 0 +VarUI2FromStr: "", 4, 80020005 +VarUI2FromStr: "", 4, 80020005 +VarUI2FromStr: "", 4, 80020005 +VarUI2FromStr: "", 4, 80020005 +VarUI2FromStr: "", 4, 80020005 +VarUI2FromStr: "", 4, 80020005 + + +======== Testing VarUI4FromXXX ======== +VarUI4FromI2: passing in NULL as return val makes it crash, 80020005 +VarUI4FromStr: passing in NULL as param: 80020005 +VarUI4FromI2: 0, 0, 0 +VarUI4FromI2: 69, 69, 0 +VarUI4FromI2: 70, 70, 0 +VarUI4FromI2: 128, 128, 0 +VarUI4FromI2: 255, 255, 0 +VarUI4FromR8: 4294967295, 4294967295, 0 +VarUI4FromR8: 4294967296, 4294967295, 8002000A +VarUI4FromR8: 0.0, 0, 0 +VarUI4FromR8: 69.33, 69, 0 +VarUI4FromR8: 69.66, 70, 0 +VarUI4FromR8: -69.33, 70, 8002000A +VarUI4FromR8: -69.66, 70, 8002000A +VarUI4FromR8: -0.5, 0, 0 +VarUI4FromR8: -0.51, 0, 8002000A +VarUI4FromR8: -0.49, 0, 0 +VarUI4FromR8: 0.5, 0, 0 +VarUI4FromR8: 0.51, 1, 0 +VarUI4FromR8: 0.49, 0, 0 +VarUI4FromDate: 0.0, 0, 0 +VarUI4FromDate: 69.33, 69, 0 +VarUI4FromDate: 69.66, 70, 0 +VarUI4FromDate: -69.33, 70, 8002000A +VarUI4FromDate: -69.66, 70, 8002000A +VarUI4FromBool: VARIANT_TRUE, 4294967295, 0 +VarUI4FromBool: VARIANT_FALSE, 0, 0 +VarUI4FromStr: "-2", 0, 8002000A +VarUI4FromStr: "-1", 0, 8002000A +VarUI4FromStr: "-0.51", 0, 8002000A +VarUI4FromStr: "-0.5", 0, 0 +VarUI4FromStr: "-0.49", 0, 0 +VarUI4FromStr: "-0.0", 0, 0 +VarUI4FromStr: "0.0", 0, 0 +VarUI4FromStr: "0.49", 0, 0 +VarUI4FromStr: "0.5", 0, 0 +VarUI4FromStr: "0.51", 1, 0 +VarUI4FromStr: "1", 1, 0 +VarUI4FromStr: "127", 127, 0 +VarUI4FromStr: "128", 128, 0 +VarUI4FromStr: "129", 129, 0 +VarUI4FromStr: "255", 255, 0 +VarUI4FromStr: "256", 256, 0 +VarUI4FromStr: "257", 257, 0 +VarUI4FromStr: "32767", 32767, 0 +VarUI4FromStr: "32768", 32768, 0 +VarUI4FromStr: "-32768", 32768, 8002000A +VarUI4FromStr: "-32769", 32768, 8002000A +VarUI4FromStr: "16777216", 16777216, 0 +VarUI4FromStr: "16777217", 16777217, 0 +VarUI4FromStr: "-16777216", 16777217, 8002000A +VarUI4FromStr: "16777217", 16777217, 0 +VarUI4FromStr: "2147483647", 2147483647, 0 +VarUI4FromStr: "2147483648", 2147483648, 0 +VarUI4FromStr: "-2147483647", 2147483648, 8002000A +VarUI4FromStr: "-2147483648", 2147483648, 8002000A +VarUI4FromStr: "", 2147483648, 80020005 +VarUI4FromStr: " ", 2147483648, 80020005 +VarUI4FromStr: "1F", 2147483648, 80020005 +VarUI4FromStr: "1G", 2147483648, 80020005 +VarUI4FromStr: " 1 ", 1, 0 +VarUI4FromStr: " 1 2 ", 1, 80020005 +VarUI4FromStr: "1,2,3", 123, 0 +VarUI4FromStr: "1 2 3", 123, 80020005 +VarUI4FromStr: "1,2, 3", 123, 80020005 +VarUI4FromStr: "1;2;3", 123, 80020005 +VarUI4FromStr: "1.2.3", 123, 80020005 +VarUI4FromStr: "0.", 0, 0 +VarUI4FromStr: ".0", 0, 0 +VarUI4FromStr: "0.1E12", 0, 8002000A +VarUI4FromStr: "2.4,E1", 24, 0 +VarUI4FromStr: " +3.2,E1", 32, 0 +VarUI4FromStr: "4E2.5", 32, 80020005 +VarUI4FromStr: " 2E+2", 200, 0 +VarUI4FromStr: "1 E+2", 200, 80020005 +VarUI4FromStr: ".", 200, 80020005 +VarUI4FromStr: ".E2", 200, 80020005 +VarUI4FromStr: "1000000000000000000000000000000000000000000000000000000000000000", 200, 8002000A +VarUI4FromStr: "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001", 1, 0 +VarUI4FromStr: "00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001", 1, 0 +VarUI4FromStr: "100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001", 1, 8002000A +VarUI4FromStr: "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001", 1, 0 +VarUI4FromStr: "65535", 65535, 0 +VarUI4FromStr: "65535.5", 65536, 0 +VarUI4FromStr: "65536", 65536, 0 +VarUI4FromStr: "4294967295", 4294967295, 0 +VarUI4FromStr: "4294967296", 4294967295, 8002000A +VarUI4FromStr: "1 January 99", 4294967295, 80020005 +VarUI4FromStr: "December 31, 2078", 4294967295, 80020005 +VarUI4FromStr: "January 1, 1900", 4294967295, 80020005 +VarUI4FromStr: "January 2 1900", 4294967295, 80020005 +VarUI4FromStr: "11.11.1999", 4294967295, 80020005 +VarUI4FromStr: "11/11/1999", 4294967295, 80020005 +VarUI4FromStr: " 11 / 11 / 1999", 4294967295, 80020005 +VarUI4FromStr: "11/11/1999:11:11:1134", 4294967295, 80020005 +VarUI4FromStr: "11/11/1999 11:11:11:1", 4294967295, 80020005 +VarUI4FromStr: " 1999/ 11/21 11 :11:11am", 4294967295, 80020005 +VarUI4FromStr: "11/11/1999 11:11:11Am", 4294967295, 80020005 +VarUI4FromStr: "11/11/1999 11:11:11PM", 4294967295, 80020005 +VarUI4FromStr: "11/11/199911:11:11PM", 4294967295, 80020005 +VarUI4FromStr: "11/11/1999 0:0:11am", 4294967295, 80020005 +VarUI4FromStr: "11/11/1999 11,11:11am", 4294967295, 80020005 +VarUI4FromStr: "11/11/1999 11:11:11am", 4294967295, 80020005 +VarUI4FromStr: "11/11/1999 11/11:11am", 4294967295, 80020005 +VarUI4FromStr: "11/11/1999 11:11AM", 4294967295, 80020005 +VarUI4FromStr: "11/11/1999 1AM", 4294967295, 80020005 +VarUI4FromStr: "11/11/1999 0AM", 4294967295, 80020005 +VarUI4FromStr: "11/11/1999 11:11:11", 4294967295, 80020005 +VarUI4FromStr: "11/13/1999 0AM", 4294967295, 80020005 +VarUI4FromStr: "13/13/1999 0AM", 4294967295, 80020005 +VarUI4FromStr: "13/11/1999 0AM", 4294967295, 80020005 +VarUI4FromStr: "11/33/1999 0AM", 4294967295, 80020005 +VarUI4FromStr: "11/11/1999 AM", 4294967295, 80020005 +VarUI4FromStr: "1/1/0 0AM", 4294967295, 80020005 +VarUI4FromStr: "1/1/-1 0AM", 4294967295, 80020005 +VarUI4FromStr: "1999 January 3 9AM", 4294967295, 80020005 +VarUI4FromStr: "1 January 1999 11AM", 4294967295, 80020005 +VarUI4FromStr: "4AM 11/11/1999", 4294967295, 80020005 +VarUI4FromStr: "4:22 11/11/1999 AM", 4294967295, 80020005 +VarUI4FromStr: " 1 1 /11/1999", 4294967295, 80020005 +VarUI4FromStr: "11-11/1999 11:11:11.12AM", 4294967295, 80020005 +VarUI4FromStr: "1999 January 3, 9AM", 4294967295, 80020005 +VarUI4FromStr: "December, 31, 2078", 4294967295, 80020005 +VarUI4FromStr: "December, 31, 2078,", 4294967295, 80020005 +VarUI4FromStr: "December, 31 2078", 4294967295, 80020005 +VarUI4FromStr: "11/99", 4294967295, 80020005 +VarUI4FromStr: "11-1999", 4294967295, 80020005 +VarUI4FromStr: "true", 4294967295, 80020005 +VarUI4FromStr: "True", 4294967295, 80020005 +VarUI4FromStr: "TRue", 4294967295, 80020005 +VarUI4FromStr: "TRUE", 4294967295, 80020005 +VarUI4FromStr: " TRUE", 4294967295, 80020005 +VarUI4FromStr: "FALSE ", 4294967295, 80020005 +VarUI4FromStr: "False", 4294967295, 80020005 +VarUI4FromStr: "JustSomeText", 4294967295, 80020005 +VarUI4FromStr: "Just Some Text", 4294967295, 80020005 +VarUI4FromStr: "", 4294967295, 80020005 +VarUI4FromStr: "1.5", 2, 0 +VarUI4FromStr: "2.5", 2, 0 +VarUI4FromStr: "3.5", 4, 0 +VarUI4FromStr: "4.5", 4, 0 +VarUI4FromStr: "", 4, 80020005 +VarUI4FromStr: "", 4, 80020005 +VarUI4FromStr: "", 4, 80020005 +VarUI4FromStr: "", 4, 80020005 +VarUI4FromStr: "", 4, 80020005 +VarUI4FromStr: "", 4, 80020005 + + +======== Testing VarI1FromXXX ======== +VarI1FromBool: VARIANT_TRUE, 255, 0 +VarI1FromBool: VARIANT_TRUE, -1, 0 +VarI1FromBool: VARIANT_FALSE, 0, 0 +VarI1FromUI1: 32767, 0, 8002000A +VarI1FromUI1: 65535, 0, 8002000A +VarI1FromI4: 32767, 0, 8002000A +VarI1FromI4: 32768, 0, 8002000A +VarI1FromI4: -32768, 0, 8002000A +VarI1FromI4: -32769, 0, 8002000A +VarI1FromR8: 69.33, 69, 0 +VarI1FromR8: 69.66, 70, 0 +VarI1FromR8: -69.33, -69, 0 +VarI1FromR8: -69.66, -70, 0 +VarI1FromDate: -69.66, -70, 0 +VarI1FromStr: "-2", -2, 0 +VarI1FromStr: "-1", -1, 0 +VarI1FromStr: "-0.51", -1, 0 +VarI1FromStr: "-0.5", 0, 0 +VarI1FromStr: "-0.49", 0, 0 +VarI1FromStr: "-0.0", 0, 0 +VarI1FromStr: "0.0", 0, 0 +VarI1FromStr: "0.49", 0, 0 +VarI1FromStr: "0.5", 0, 0 +VarI1FromStr: "0.51", 1, 0 +VarI1FromStr: "1", 1, 0 +VarI1FromStr: "127", 127, 0 +VarI1FromStr: "128", 127, 8002000A +VarI1FromStr: "129", 127, 8002000A +VarI1FromStr: "255", 127, 8002000A +VarI1FromStr: "256", 127, 8002000A +VarI1FromStr: "257", 127, 8002000A +VarI1FromStr: "32767", 127, 8002000A +VarI1FromStr: "32768", 127, 8002000A +VarI1FromStr: "-32768", 127, 8002000A +VarI1FromStr: "-32769", 127, 8002000A +VarI1FromStr: "16777216", 127, 8002000A +VarI1FromStr: "16777217", 127, 8002000A +VarI1FromStr: "-16777216", 127, 8002000A +VarI1FromStr: "16777217", 127, 8002000A +VarI1FromStr: "2147483647", 127, 8002000A +VarI1FromStr: "2147483648", 127, 8002000A +VarI1FromStr: "-2147483647", 127, 8002000A +VarI1FromStr: "-2147483648", 127, 8002000A +VarI1FromStr: "", 127, 80020005 +VarI1FromStr: " ", 127, 80020005 +VarI1FromStr: "1F", 127, 80020005 +VarI1FromStr: "1G", 127, 80020005 +VarI1FromStr: " 1 ", 1, 0 +VarI1FromStr: " 1 2 ", 1, 80020005 +VarI1FromStr: "1,2,3", 123, 0 +VarI1FromStr: "1 2 3", 123, 80020005 +VarI1FromStr: "1,2, 3", 123, 80020005 +VarI1FromStr: "1;2;3", 123, 80020005 +VarI1FromStr: "1.2.3", 123, 80020005 +VarI1FromStr: "0.", 0, 0 +VarI1FromStr: ".0", 0, 0 +VarI1FromStr: "0.1E12", 0, 8002000A +VarI1FromStr: "2.4,E1", 24, 0 +VarI1FromStr: " +3.2,E1", 32, 0 +VarI1FromStr: "4E2.5", 32, 80020005 +VarI1FromStr: " 2E+2", 32, 8002000A +VarI1FromStr: "1 E+2", 32, 80020005 +VarI1FromStr: ".", 32, 80020005 +VarI1FromStr: ".E2", 32, 80020005 +VarI1FromStr: "1000000000000000000000000000000000000000000000000000000000000000", 32, 8002000A +VarI1FromStr: "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001", 1, 0 +VarI1FromStr: "00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001", 1, 0 +VarI1FromStr: "100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001", 1, 8002000A +VarI1FromStr: "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001", 1, 0 +VarI1FromStr: "65535", 1, 8002000A +VarI1FromStr: "65535.5", 1, 8002000A +VarI1FromStr: "65536", 1, 8002000A +VarI1FromStr: "4294967295", 1, 8002000A +VarI1FromStr: "4294967296", 1, 8002000A +VarI1FromStr: "1 January 99", 1, 80020005 +VarI1FromStr: "December 31, 2078", 1, 80020005 +VarI1FromStr: "January 1, 1900", 1, 80020005 +VarI1FromStr: "January 2 1900", 1, 80020005 +VarI1FromStr: "11.11.1999", 1, 80020005 +VarI1FromStr: "11/11/1999", 1, 80020005 +VarI1FromStr: " 11 / 11 / 1999", 1, 80020005 +VarI1FromStr: "11/11/1999:11:11:1134", 1, 80020005 +VarI1FromStr: "11/11/1999 11:11:11:1", 1, 80020005 +VarI1FromStr: " 1999/ 11/21 11 :11:11am", 1, 80020005 +VarI1FromStr: "11/11/1999 11:11:11Am", 1, 80020005 +VarI1FromStr: "11/11/1999 11:11:11PM", 1, 80020005 +VarI1FromStr: "11/11/199911:11:11PM", 1, 80020005 +VarI1FromStr: "11/11/1999 0:0:11am", 1, 80020005 +VarI1FromStr: "11/11/1999 11,11:11am", 1, 80020005 +VarI1FromStr: "11/11/1999 11:11:11am", 1, 80020005 +VarI1FromStr: "11/11/1999 11/11:11am", 1, 80020005 +VarI1FromStr: "11/11/1999 11:11AM", 1, 80020005 +VarI1FromStr: "11/11/1999 1AM", 1, 80020005 +VarI1FromStr: "11/11/1999 0AM", 1, 80020005 +VarI1FromStr: "11/11/1999 11:11:11", 1, 80020005 +VarI1FromStr: "11/13/1999 0AM", 1, 80020005 +VarI1FromStr: "13/13/1999 0AM", 1, 80020005 +VarI1FromStr: "13/11/1999 0AM", 1, 80020005 +VarI1FromStr: "11/33/1999 0AM", 1, 80020005 +VarI1FromStr: "11/11/1999 AM", 1, 80020005 +VarI1FromStr: "1/1/0 0AM", 1, 80020005 +VarI1FromStr: "1/1/-1 0AM", 1, 80020005 +VarI1FromStr: "1999 January 3 9AM", 1, 80020005 +VarI1FromStr: "1 January 1999 11AM", 1, 80020005 +VarI1FromStr: "4AM 11/11/1999", 1, 80020005 +VarI1FromStr: "4:22 11/11/1999 AM", 1, 80020005 +VarI1FromStr: " 1 1 /11/1999", 1, 80020005 +VarI1FromStr: "11-11/1999 11:11:11.12AM", 1, 80020005 +VarI1FromStr: "1999 January 3, 9AM", 1, 80020005 +VarI1FromStr: "December, 31, 2078", 1, 80020005 +VarI1FromStr: "December, 31, 2078,", 1, 80020005 +VarI1FromStr: "December, 31 2078", 1, 80020005 +VarI1FromStr: "11/99", 1, 80020005 +VarI1FromStr: "11-1999", 1, 80020005 +VarI1FromStr: "true", 1, 80020005 +VarI1FromStr: "True", 1, 80020005 +VarI1FromStr: "TRue", 1, 80020005 +VarI1FromStr: "TRUE", 1, 80020005 +VarI1FromStr: " TRUE", 1, 80020005 +VarI1FromStr: "FALSE ", 1, 80020005 +VarI1FromStr: "False", 1, 80020005 +VarI1FromStr: "JustSomeText", 1, 80020005 +VarI1FromStr: "Just Some Text", 1, 80020005 +VarI1FromStr: "", 1, 80020005 +VarI1FromStr: "1.5", 2, 0 +VarI1FromStr: "2.5", 2, 0 +VarI1FromStr: "3.5", 4, 0 +VarI1FromStr: "4.5", 4, 0 +VarI1FromStr: "", 4, 80020005 +VarI1FromStr: "", 4, 80020005 +VarI1FromStr: "", 4, 80020005 +VarI1FromStr: "", 4, 80020005 +VarI1FromStr: "", 4, 80020005 +VarI1FromStr: "", 4, 80020005 + + +======== Testing VarI2FromXXX ======== +VarI2FromUI2: 32767, 32767, 0 +VarI2FromUI2: 65535, 32767, 8002000A +VarI2FromI4: 32767, 32767, 0 +VarI2FromI4: 32768, 32767, 8002000A +VarI2FromI4: -32768, -32768, 0 +VarI2FromI4: -32769, -32768, 8002000A +VarI2FromR8: 69.33, 69, 0 +VarI2FromR8: 69.66, 70, 0 +VarI2FromR8: -69.33, -69, 0 +VarI2FromR8: -69.66, -70, 0 +VarI2FromDate: -69.66, -70, 0 +VarI2FromStr: "-2", -2, 0 +VarI2FromStr: "-1", -1, 0 +VarI2FromStr: "-0.51", -1, 0 +VarI2FromStr: "-0.5", 0, 0 +VarI2FromStr: "-0.49", 0, 0 +VarI2FromStr: "-0.0", 0, 0 +VarI2FromStr: "0.0", 0, 0 +VarI2FromStr: "0.49", 0, 0 +VarI2FromStr: "0.5", 0, 0 +VarI2FromStr: "0.51", 1, 0 +VarI2FromStr: "1", 1, 0 +VarI2FromStr: "127", 127, 0 +VarI2FromStr: "128", 128, 0 +VarI2FromStr: "129", 129, 0 +VarI2FromStr: "255", 255, 0 +VarI2FromStr: "256", 256, 0 +VarI2FromStr: "257", 257, 0 +VarI2FromStr: "32767", 32767, 0 +VarI2FromStr: "32768", 32767, 8002000A +VarI2FromStr: "-32768", -32768, 0 +VarI2FromStr: "-32769", -32768, 8002000A +VarI2FromStr: "16777216", -32768, 8002000A +VarI2FromStr: "16777217", -32768, 8002000A +VarI2FromStr: "-16777216", -32768, 8002000A +VarI2FromStr: "16777217", -32768, 8002000A +VarI2FromStr: "2147483647", -32768, 8002000A +VarI2FromStr: "2147483648", -32768, 8002000A +VarI2FromStr: "-2147483647", -32768, 8002000A +VarI2FromStr: "-2147483648", -32768, 8002000A +VarI2FromStr: "", -32768, 80020005 +VarI2FromStr: " ", -32768, 80020005 +VarI2FromStr: "1F", -32768, 80020005 +VarI2FromStr: "1G", -32768, 80020005 +VarI2FromStr: " 1 ", 1, 0 +VarI2FromStr: " 1 2 ", 1, 80020005 +VarI2FromStr: "1,2,3", 123, 0 +VarI2FromStr: "1 2 3", 123, 80020005 +VarI2FromStr: "1,2, 3", 123, 80020005 +VarI2FromStr: "1;2;3", 123, 80020005 +VarI2FromStr: "1.2.3", 123, 80020005 +VarI2FromStr: "0.", 0, 0 +VarI2FromStr: ".0", 0, 0 +VarI2FromStr: "0.1E12", 0, 8002000A +VarI2FromStr: "2.4,E1", 24, 0 +VarI2FromStr: " +3.2,E1", 32, 0 +VarI2FromStr: "4E2.5", 32, 80020005 +VarI2FromStr: " 2E+2", 200, 0 +VarI2FromStr: "1 E+2", 200, 80020005 +VarI2FromStr: ".", 200, 80020005 +VarI2FromStr: ".E2", 200, 80020005 +VarI2FromStr: "1000000000000000000000000000000000000000000000000000000000000000", 200, 8002000A +VarI2FromStr: "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001", 1, 0 +VarI2FromStr: "00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001", 1, 0 +VarI2FromStr: "100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001", 1, 8002000A +VarI2FromStr: "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001", 1, 0 +VarI2FromStr: "65535", 1, 8002000A +VarI2FromStr: "65535.5", 1, 8002000A +VarI2FromStr: "65536", 1, 8002000A +VarI2FromStr: "4294967295", 1, 8002000A +VarI2FromStr: "4294967296", 1, 8002000A +VarI2FromStr: "1 January 99", 1, 80020005 +VarI2FromStr: "December 31, 2078", 1, 80020005 +VarI2FromStr: "January 1, 1900", 1, 80020005 +VarI2FromStr: "January 2 1900", 1, 80020005 +VarI2FromStr: "11.11.1999", 1, 80020005 +VarI2FromStr: "11/11/1999", 1, 80020005 +VarI2FromStr: " 11 / 11 / 1999", 1, 80020005 +VarI2FromStr: "11/11/1999:11:11:1134", 1, 80020005 +VarI2FromStr: "11/11/1999 11:11:11:1", 1, 80020005 +VarI2FromStr: " 1999/ 11/21 11 :11:11am", 1, 80020005 +VarI2FromStr: "11/11/1999 11:11:11Am", 1, 80020005 +VarI2FromStr: "11/11/1999 11:11:11PM", 1, 80020005 +VarI2FromStr: "11/11/199911:11:11PM", 1, 80020005 +VarI2FromStr: "11/11/1999 0:0:11am", 1, 80020005 +VarI2FromStr: "11/11/1999 11,11:11am", 1, 80020005 +VarI2FromStr: "11/11/1999 11:11:11am", 1, 80020005 +VarI2FromStr: "11/11/1999 11/11:11am", 1, 80020005 +VarI2FromStr: "11/11/1999 11:11AM", 1, 80020005 +VarI2FromStr: "11/11/1999 1AM", 1, 80020005 +VarI2FromStr: "11/11/1999 0AM", 1, 80020005 +VarI2FromStr: "11/11/1999 11:11:11", 1, 80020005 +VarI2FromStr: "11/13/1999 0AM", 1, 80020005 +VarI2FromStr: "13/13/1999 0AM", 1, 80020005 +VarI2FromStr: "13/11/1999 0AM", 1, 80020005 +VarI2FromStr: "11/33/1999 0AM", 1, 80020005 +VarI2FromStr: "11/11/1999 AM", 1, 80020005 +VarI2FromStr: "1/1/0 0AM", 1, 80020005 +VarI2FromStr: "1/1/-1 0AM", 1, 80020005 +VarI2FromStr: "1999 January 3 9AM", 1, 80020005 +VarI2FromStr: "1 January 1999 11AM", 1, 80020005 +VarI2FromStr: "4AM 11/11/1999", 1, 80020005 +VarI2FromStr: "4:22 11/11/1999 AM", 1, 80020005 +VarI2FromStr: " 1 1 /11/1999", 1, 80020005 +VarI2FromStr: "11-11/1999 11:11:11.12AM", 1, 80020005 +VarI2FromStr: "1999 January 3, 9AM", 1, 80020005 +VarI2FromStr: "December, 31, 2078", 1, 80020005 +VarI2FromStr: "December, 31, 2078,", 1, 80020005 +VarI2FromStr: "December, 31 2078", 1, 80020005 +VarI2FromStr: "11/99", 1, 80020005 +VarI2FromStr: "11-1999", 1, 80020005 +VarI2FromStr: "true", 1, 80020005 +VarI2FromStr: "True", 1, 80020005 +VarI2FromStr: "TRue", 1, 80020005 +VarI2FromStr: "TRUE", 1, 80020005 +VarI2FromStr: " TRUE", 1, 80020005 +VarI2FromStr: "FALSE ", 1, 80020005 +VarI2FromStr: "False", 1, 80020005 +VarI2FromStr: "JustSomeText", 1, 80020005 +VarI2FromStr: "Just Some Text", 1, 80020005 +VarI2FromStr: "", 1, 80020005 +VarI2FromStr: "1.5", 2, 0 +VarI2FromStr: "2.5", 2, 0 +VarI2FromStr: "3.5", 4, 0 +VarI2FromStr: "4.5", 4, 0 +VarI2FromStr: "", 4, 80020005 +VarI2FromStr: "", 4, 80020005 +VarI2FromStr: "", 4, 80020005 +VarI2FromStr: "", 4, 80020005 +VarI2FromStr: "", 4, 80020005 +VarI2FromStr: "", 4, 80020005 + + +======== Testing VarI4FromXXX ======== +VarIntFromI2: 3, 3, 0 +VarI4FromR8: 69.33, 69, 0 +VarI4FromR8: 69.66, 70, 0 +VarI4FromR8: -69.33, -69, 0 +VarI4FromR8: -69.66, -70, 0 +VarI4FromR8: 2147483647.0, 2147483647, 0 +VarI4FromR8: 2147483648.0, 2147483647, 8002000A +VarI4FromR8: -2147483647.0, -2147483647, 0 +VarI4FromR8: -2147483648.0, -2147483648, 0 +VarI4FromR8: -2147483649.0, -2147483648, 8002000A +VarI4FromDate: -2147483649.0, -2147483648, 8002000A +VarI4FromStr: "-2", -2, 0 +VarI4FromStr: "-1", -1, 0 +VarI4FromStr: "-0.51", -1, 0 +VarI4FromStr: "-0.5", 0, 0 +VarI4FromStr: "-0.49", 0, 0 +VarI4FromStr: "-0.0", 0, 0 +VarI4FromStr: "0.0", 0, 0 +VarI4FromStr: "0.49", 0, 0 +VarI4FromStr: "0.5", 0, 0 +VarI4FromStr: "0.51", 1, 0 +VarI4FromStr: "1", 1, 0 +VarI4FromStr: "127", 127, 0 +VarI4FromStr: "128", 128, 0 +VarI4FromStr: "129", 129, 0 +VarI4FromStr: "255", 255, 0 +VarI4FromStr: "256", 256, 0 +VarI4FromStr: "257", 257, 0 +VarI4FromStr: "32767", 32767, 0 +VarI4FromStr: "32768", 32768, 0 +VarI4FromStr: "-32768", -32768, 0 +VarI4FromStr: "-32769", -32769, 0 +VarI4FromStr: "16777216", 16777216, 0 +VarI4FromStr: "16777217", 16777217, 0 +VarI4FromStr: "-16777216", -16777216, 0 +VarI4FromStr: "16777217", 16777217, 0 +VarI4FromStr: "2147483647", 2147483647, 0 +VarI4FromStr: "2147483648", 2147483647, 8002000A +VarI4FromStr: "-2147483647", -2147483647, 0 +VarI4FromStr: "-2147483648", -2147483648, 0 +VarI4FromStr: "", -2147483648, 80020005 +VarI4FromStr: " ", -2147483648, 80020005 +VarI4FromStr: "1F", -2147483648, 80020005 +VarI4FromStr: "1G", -2147483648, 80020005 +VarI4FromStr: " 1 ", 1, 0 +VarI4FromStr: " 1 2 ", 1, 80020005 +VarI4FromStr: "1,2,3", 123, 0 +VarI4FromStr: "1 2 3", 123, 80020005 +VarI4FromStr: "1,2, 3", 123, 80020005 +VarI4FromStr: "1;2;3", 123, 80020005 +VarI4FromStr: "1.2.3", 123, 80020005 +VarI4FromStr: "0.", 0, 0 +VarI4FromStr: ".0", 0, 0 +VarI4FromStr: "0.1E12", 0, 8002000A +VarI4FromStr: "2.4,E1", 24, 0 +VarI4FromStr: " +3.2,E1", 32, 0 +VarI4FromStr: "4E2.5", 32, 80020005 +VarI4FromStr: " 2E+2", 200, 0 +VarI4FromStr: "1 E+2", 200, 80020005 +VarI4FromStr: ".", 200, 80020005 +VarI4FromStr: ".E2", 200, 80020005 +VarI4FromStr: "1000000000000000000000000000000000000000000000000000000000000000", 200, 8002000A +VarI4FromStr: "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001", 1, 0 +VarI4FromStr: "00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001", 1, 0 +VarI4FromStr: "100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001", 1, 8002000A +VarI4FromStr: "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001", 1, 0 +VarI4FromStr: "65535", 65535, 0 +VarI4FromStr: "65535.5", 65536, 0 +VarI4FromStr: "65536", 65536, 0 +VarI4FromStr: "4294967295", 65536, 8002000A +VarI4FromStr: "4294967296", 65536, 8002000A +VarI4FromStr: "1 January 99", 65536, 80020005 +VarI4FromStr: "December 31, 2078", 65536, 80020005 +VarI4FromStr: "January 1, 1900", 65536, 80020005 +VarI4FromStr: "January 2 1900", 65536, 80020005 +VarI4FromStr: "11.11.1999", 65536, 80020005 +VarI4FromStr: "11/11/1999", 65536, 80020005 +VarI4FromStr: " 11 / 11 / 1999", 65536, 80020005 +VarI4FromStr: "11/11/1999:11:11:1134", 65536, 80020005 +VarI4FromStr: "11/11/1999 11:11:11:1", 65536, 80020005 +VarI4FromStr: " 1999/ 11/21 11 :11:11am", 65536, 80020005 +VarI4FromStr: "11/11/1999 11:11:11Am", 65536, 80020005 +VarI4FromStr: "11/11/1999 11:11:11PM", 65536, 80020005 +VarI4FromStr: "11/11/199911:11:11PM", 65536, 80020005 +VarI4FromStr: "11/11/1999 0:0:11am", 65536, 80020005 +VarI4FromStr: "11/11/1999 11,11:11am", 65536, 80020005 +VarI4FromStr: "11/11/1999 11:11:11am", 65536, 80020005 +VarI4FromStr: "11/11/1999 11/11:11am", 65536, 80020005 +VarI4FromStr: "11/11/1999 11:11AM", 65536, 80020005 +VarI4FromStr: "11/11/1999 1AM", 65536, 80020005 +VarI4FromStr: "11/11/1999 0AM", 65536, 80020005 +VarI4FromStr: "11/11/1999 11:11:11", 65536, 80020005 +VarI4FromStr: "11/13/1999 0AM", 65536, 80020005 +VarI4FromStr: "13/13/1999 0AM", 65536, 80020005 +VarI4FromStr: "13/11/1999 0AM", 65536, 80020005 +VarI4FromStr: "11/33/1999 0AM", 65536, 80020005 +VarI4FromStr: "11/11/1999 AM", 65536, 80020005 +VarI4FromStr: "1/1/0 0AM", 65536, 80020005 +VarI4FromStr: "1/1/-1 0AM", 65536, 80020005 +VarI4FromStr: "1999 January 3 9AM", 65536, 80020005 +VarI4FromStr: "1 January 1999 11AM", 65536, 80020005 +VarI4FromStr: "4AM 11/11/1999", 65536, 80020005 +VarI4FromStr: "4:22 11/11/1999 AM", 65536, 80020005 +VarI4FromStr: " 1 1 /11/1999", 65536, 80020005 +VarI4FromStr: "11-11/1999 11:11:11.12AM", 65536, 80020005 +VarI4FromStr: "1999 January 3, 9AM", 65536, 80020005 +VarI4FromStr: "December, 31, 2078", 65536, 80020005 +VarI4FromStr: "December, 31, 2078,", 65536, 80020005 +VarI4FromStr: "December, 31 2078", 65536, 80020005 +VarI4FromStr: "11/99", 65536, 80020005 +VarI4FromStr: "11-1999", 65536, 80020005 +VarI4FromStr: "true", 65536, 80020005 +VarI4FromStr: "True", 65536, 80020005 +VarI4FromStr: "TRue", 65536, 80020005 +VarI4FromStr: "TRUE", 65536, 80020005 +VarI4FromStr: " TRUE", 65536, 80020005 +VarI4FromStr: "FALSE ", 65536, 80020005 +VarI4FromStr: "False", 65536, 80020005 +VarI4FromStr: "JustSomeText", 65536, 80020005 +VarI4FromStr: "Just Some Text", 65536, 80020005 +VarI4FromStr: "", 65536, 80020005 +VarI4FromStr: "1.5", 2, 0 +VarI4FromStr: "2.5", 2, 0 +VarI4FromStr: "3.5", 4, 0 +VarI4FromStr: "4.5", 4, 0 +VarI4FromStr: "", 4, 80020005 +VarI4FromStr: "", 4, 80020005 +VarI4FromStr: "", 4, 80020005 +VarI4FromStr: "", 4, 80020005 +VarI4FromStr: "", 4, 80020005 +VarI4FromStr: "", 4, 80020005 + + +======== Testing VarR4FromXXX ======== +VarR4FromI4: 16777216, 16777216.000000, 0 +VarR4FromI4: 16777217, 16777216.000000, 0 +VarR4FromI4: -16777216, -16777216.000000, 0 +VarR4FromI4: -16777217, -16777216.000000, 0 +VarR4FromR8: 16777216.0, 16777216.000000, 0 +VarR4FromR8: 16777217.0, 16777216.000000, 0 +VarR4FromR8: -16777216.0, -16777216.000000, 0 +VarR4FromR8: -16777217.0, -16777216.000000, 0 +VarR4FromR8: 16777218e31, 167772177736353110000000000000000000000.000000, 0 +VarR4FromR8: 16777218e32, 167772177736353110000000000000000000000.000000, 8002000A +VarR4FromDate: 16777218e31, 167772177736353110000000000000000000000.000000, 0 +VarR4FromStr: "-2", -2.000000, 0 +VarR4FromStr: "-1", -1.000000, 0 +VarR4FromStr: "-0.51", -0.510000, 0 +VarR4FromStr: "-0.5", -0.500000, 0 +VarR4FromStr: "-0.49", -0.490000, 0 +VarR4FromStr: "-0.0", 0.000000, 0 +VarR4FromStr: "0.0", 0.000000, 0 +VarR4FromStr: "0.49", 0.490000, 0 +VarR4FromStr: "0.5", 0.500000, 0 +VarR4FromStr: "0.51", 0.510000, 0 +VarR4FromStr: "1", 1.000000, 0 +VarR4FromStr: "127", 127.000000, 0 +VarR4FromStr: "128", 128.000000, 0 +VarR4FromStr: "129", 129.000000, 0 +VarR4FromStr: "255", 255.000000, 0 +VarR4FromStr: "256", 256.000000, 0 +VarR4FromStr: "257", 257.000000, 0 +VarR4FromStr: "32767", 32767.000000, 0 +VarR4FromStr: "32768", 32768.000000, 0 +VarR4FromStr: "-32768", -32768.000000, 0 +VarR4FromStr: "-32769", -32769.000000, 0 +VarR4FromStr: "16777216", 16777216.000000, 0 +VarR4FromStr: "16777217", 16777216.000000, 0 +VarR4FromStr: "-16777216", -16777216.000000, 0 +VarR4FromStr: "16777217", 16777216.000000, 0 +VarR4FromStr: "2147483647", 2147483648.000000, 0 +VarR4FromStr: "2147483648", 2147483648.000000, 0 +VarR4FromStr: "-2147483647", -2147483648.000000, 0 +VarR4FromStr: "-2147483648", -2147483648.000000, 0 +VarR4FromStr: "", -2147483648.000000, 80020005 +VarR4FromStr: " ", -2147483648.000000, 80020005 +VarR4FromStr: "1F", -2147483648.000000, 80020005 +VarR4FromStr: "1G", -2147483648.000000, 80020005 +VarR4FromStr: " 1 ", 1.000000, 0 +VarR4FromStr: " 1 2 ", 1.000000, 80020005 +VarR4FromStr: "1,2,3", 123.000000, 0 +VarR4FromStr: "1 2 3", 123.000000, 80020005 +VarR4FromStr: "1,2, 3", 123.000000, 80020005 +VarR4FromStr: "1;2;3", 123.000000, 80020005 +VarR4FromStr: "1.2.3", 123.000000, 80020005 +VarR4FromStr: "0.", 0.000000, 0 +VarR4FromStr: ".0", 0.000000, 0 +VarR4FromStr: "0.1E12", 99999997952.000000, 0 +VarR4FromStr: "2.4,E1", 24.000000, 0 +VarR4FromStr: " +3.2,E1", 32.000000, 0 +VarR4FromStr: "4E2.5", 32.000000, 80020005 +VarR4FromStr: " 2E+2", 200.000000, 0 +VarR4FromStr: "1 E+2", 200.000000, 80020005 +VarR4FromStr: ".", 200.000000, 80020005 +VarR4FromStr: ".E2", 200.000000, 80020005 +VarR4FromStr: "1000000000000000000000000000000000000000000000000000000000000000", 200.000000, 8002000A +VarR4FromStr: "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001", 1.000000, 0 +VarR4FromStr: "00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001", 1.000000, 0 +VarR4FromStr: "100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001", 1.000000, 8002000A +VarR4FromStr: "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001", 1.000000, 0 +VarR4FromStr: "65535", 65535.000000, 0 +VarR4FromStr: "65535.5", 65535.500000, 0 +VarR4FromStr: "65536", 65536.000000, 0 +VarR4FromStr: "4294967295", 4294967296.000000, 0 +VarR4FromStr: "4294967296", 4294967296.000000, 0 +VarR4FromStr: "1 January 99", 4294967296.000000, 80020005 +VarR4FromStr: "December 31, 2078", 4294967296.000000, 80020005 +VarR4FromStr: "January 1, 1900", 4294967296.000000, 80020005 +VarR4FromStr: "January 2 1900", 4294967296.000000, 80020005 +VarR4FromStr: "11.11.1999", 4294967296.000000, 80020005 +VarR4FromStr: "11/11/1999", 4294967296.000000, 80020005 +VarR4FromStr: " 11 / 11 / 1999", 4294967296.000000, 80020005 +VarR4FromStr: "11/11/1999:11:11:1134", 4294967296.000000, 80020005 +VarR4FromStr: "11/11/1999 11:11:11:1", 4294967296.000000, 80020005 +VarR4FromStr: " 1999/ 11/21 11 :11:11am", 4294967296.000000, 80020005 +VarR4FromStr: "11/11/1999 11:11:11Am", 4294967296.000000, 80020005 +VarR4FromStr: "11/11/1999 11:11:11PM", 4294967296.000000, 80020005 +VarR4FromStr: "11/11/199911:11:11PM", 4294967296.000000, 80020005 +VarR4FromStr: "11/11/1999 0:0:11am", 4294967296.000000, 80020005 +VarR4FromStr: "11/11/1999 11,11:11am", 4294967296.000000, 80020005 +VarR4FromStr: "11/11/1999 11:11:11am", 4294967296.000000, 80020005 +VarR4FromStr: "11/11/1999 11/11:11am", 4294967296.000000, 80020005 +VarR4FromStr: "11/11/1999 11:11AM", 4294967296.000000, 80020005 +VarR4FromStr: "11/11/1999 1AM", 4294967296.000000, 80020005 +VarR4FromStr: "11/11/1999 0AM", 4294967296.000000, 80020005 +VarR4FromStr: "11/11/1999 11:11:11", 4294967296.000000, 80020005 +VarR4FromStr: "11/13/1999 0AM", 4294967296.000000, 80020005 +VarR4FromStr: "13/13/1999 0AM", 4294967296.000000, 80020005 +VarR4FromStr: "13/11/1999 0AM", 4294967296.000000, 80020005 +VarR4FromStr: "11/33/1999 0AM", 4294967296.000000, 80020005 +VarR4FromStr: "11/11/1999 AM", 4294967296.000000, 80020005 +VarR4FromStr: "1/1/0 0AM", 4294967296.000000, 80020005 +VarR4FromStr: "1/1/-1 0AM", 4294967296.000000, 80020005 +VarR4FromStr: "1999 January 3 9AM", 4294967296.000000, 80020005 +VarR4FromStr: "1 January 1999 11AM", 4294967296.000000, 80020005 +VarR4FromStr: "4AM 11/11/1999", 4294967296.000000, 80020005 +VarR4FromStr: "4:22 11/11/1999 AM", 4294967296.000000, 80020005 +VarR4FromStr: " 1 1 /11/1999", 4294967296.000000, 80020005 +VarR4FromStr: "11-11/1999 11:11:11.12AM", 4294967296.000000, 80020005 +VarR4FromStr: "1999 January 3, 9AM", 4294967296.000000, 80020005 +VarR4FromStr: "December, 31, 2078", 4294967296.000000, 80020005 +VarR4FromStr: "December, 31, 2078,", 4294967296.000000, 80020005 +VarR4FromStr: "December, 31 2078", 4294967296.000000, 80020005 +VarR4FromStr: "11/99", 4294967296.000000, 80020005 +VarR4FromStr: "11-1999", 4294967296.000000, 80020005 +VarR4FromStr: "true", 4294967296.000000, 80020005 +VarR4FromStr: "True", 4294967296.000000, 80020005 +VarR4FromStr: "TRue", 4294967296.000000, 80020005 +VarR4FromStr: "TRUE", 4294967296.000000, 80020005 +VarR4FromStr: " TRUE", 4294967296.000000, 80020005 +VarR4FromStr: "FALSE ", 4294967296.000000, 80020005 +VarR4FromStr: "False", 4294967296.000000, 80020005 +VarR4FromStr: "JustSomeText", 4294967296.000000, 80020005 +VarR4FromStr: "Just Some Text", 4294967296.000000, 80020005 +VarR4FromStr: "", 4294967296.000000, 80020005 +VarR4FromStr: "1.5", 1.500000, 0 +VarR4FromStr: "2.5", 2.500000, 0 +VarR4FromStr: "3.5", 3.500000, 0 +VarR4FromStr: "4.5", 4.500000, 0 +VarR4FromStr: "", 4.500000, 80020005 +VarR4FromStr: "", 4.500000, 80020005 +VarR4FromStr: "", 4.500000, 80020005 +VarR4FromStr: "", 4.500000, 80020005 +VarR4FromStr: "", 4.500000, 80020005 +VarR4FromStr: "", 4.500000, 80020005 + + +======== Testing VarR8FromXXX ======== +VarR8FromDate: 900719925474099.0, 900719925474099.000000, 0 +VarR8FromStr: "-2", -2.000000, 0 +VarR8FromStr: "-1", -1.000000, 0 +VarR8FromStr: "-0.51", -0.510000, 0 +VarR8FromStr: "-0.5", -0.500000, 0 +VarR8FromStr: "-0.49", -0.490000, 0 +VarR8FromStr: "-0.0", 0.000000, 0 +VarR8FromStr: "0.0", 0.000000, 0 +VarR8FromStr: "0.49", 0.490000, 0 +VarR8FromStr: "0.5", 0.500000, 0 +VarR8FromStr: "0.51", 0.510000, 0 +VarR8FromStr: "1", 1.000000, 0 +VarR8FromStr: "127", 127.000000, 0 +VarR8FromStr: "128", 128.000000, 0 +VarR8FromStr: "129", 129.000000, 0 +VarR8FromStr: "255", 255.000000, 0 +VarR8FromStr: "256", 256.000000, 0 +VarR8FromStr: "257", 257.000000, 0 +VarR8FromStr: "32767", 32767.000000, 0 +VarR8FromStr: "32768", 32768.000000, 0 +VarR8FromStr: "-32768", -32768.000000, 0 +VarR8FromStr: "-32769", -32769.000000, 0 +VarR8FromStr: "16777216", 16777216.000000, 0 +VarR8FromStr: "16777217", 16777217.000000, 0 +VarR8FromStr: "-16777216", -16777216.000000, 0 +VarR8FromStr: "16777217", 16777217.000000, 0 +VarR8FromStr: "2147483647", 2147483647.000000, 0 +VarR8FromStr: "2147483648", 2147483648.000000, 0 +VarR8FromStr: "-2147483647", -2147483647.000000, 0 +VarR8FromStr: "-2147483648", -2147483648.000000, 0 +VarR8FromStr: "", -2147483648.000000, 80020005 +VarR8FromStr: " ", -2147483648.000000, 80020005 +VarR8FromStr: "1F", -2147483648.000000, 80020005 +VarR8FromStr: "1G", -2147483648.000000, 80020005 +VarR8FromStr: " 1 ", 1.000000, 0 +VarR8FromStr: " 1 2 ", 1.000000, 80020005 +VarR8FromStr: "1,2,3", 123.000000, 0 +VarR8FromStr: "1 2 3", 123.000000, 80020005 +VarR8FromStr: "1,2, 3", 123.000000, 80020005 +VarR8FromStr: "1;2;3", 123.000000, 80020005 +VarR8FromStr: "1.2.3", 123.000000, 80020005 +VarR8FromStr: "0.", 0.000000, 0 +VarR8FromStr: ".0", 0.000000, 0 +VarR8FromStr: "0.1E12", 100000000000.000000, 0 +VarR8FromStr: "2.4,E1", 24.000000, 0 +VarR8FromStr: " +3.2,E1", 32.000000, 0 +VarR8FromStr: "4E2.5", 32.000000, 80020005 +VarR8FromStr: " 2E+2", 200.000000, 0 +VarR8FromStr: "1 E+2", 200.000000, 80020005 +VarR8FromStr: ".", 200.000000, 80020005 +VarR8FromStr: ".E2", 200.000000, 80020005 +VarR8FromStr: "1000000000000000000000000000000000000000000000000000000000000000", 1000000000000000100000000000000000000000000000000000000000000000.000000, 0 +VarR8FromStr: "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001", 1.000000, 0 +VarR8FromStr: "00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001", 1.000000, 0 +VarR8FromStr: "100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001", 99999999999999997000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000.000000, 0 +VarR8FromStr: "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001", 1.000000, 0 +VarR8FromStr: "65535", 65535.000000, 0 +VarR8FromStr: "65535.5", 65535.500000, 0 +VarR8FromStr: "65536", 65536.000000, 0 +VarR8FromStr: "4294967295", 4294967295.000000, 0 +VarR8FromStr: "4294967296", 4294967296.000000, 0 +VarR8FromStr: "1 January 99", 4294967296.000000, 80020005 +VarR8FromStr: "December 31, 2078", 4294967296.000000, 80020005 +VarR8FromStr: "January 1, 1900", 4294967296.000000, 80020005 +VarR8FromStr: "January 2 1900", 4294967296.000000, 80020005 +VarR8FromStr: "11.11.1999", 4294967296.000000, 80020005 +VarR8FromStr: "11/11/1999", 4294967296.000000, 80020005 +VarR8FromStr: " 11 / 11 / 1999", 4294967296.000000, 80020005 +VarR8FromStr: "11/11/1999:11:11:1134", 4294967296.000000, 80020005 +VarR8FromStr: "11/11/1999 11:11:11:1", 4294967296.000000, 80020005 +VarR8FromStr: " 1999/ 11/21 11 :11:11am", 4294967296.000000, 80020005 +VarR8FromStr: "11/11/1999 11:11:11Am", 4294967296.000000, 80020005 +VarR8FromStr: "11/11/1999 11:11:11PM", 4294967296.000000, 80020005 +VarR8FromStr: "11/11/199911:11:11PM", 4294967296.000000, 80020005 +VarR8FromStr: "11/11/1999 0:0:11am", 4294967296.000000, 80020005 +VarR8FromStr: "11/11/1999 11,11:11am", 4294967296.000000, 80020005 +VarR8FromStr: "11/11/1999 11:11:11am", 4294967296.000000, 80020005 +VarR8FromStr: "11/11/1999 11/11:11am", 4294967296.000000, 80020005 +VarR8FromStr: "11/11/1999 11:11AM", 4294967296.000000, 80020005 +VarR8FromStr: "11/11/1999 1AM", 4294967296.000000, 80020005 +VarR8FromStr: "11/11/1999 0AM", 4294967296.000000, 80020005 +VarR8FromStr: "11/11/1999 11:11:11", 4294967296.000000, 80020005 +VarR8FromStr: "11/13/1999 0AM", 4294967296.000000, 80020005 +VarR8FromStr: "13/13/1999 0AM", 4294967296.000000, 80020005 +VarR8FromStr: "13/11/1999 0AM", 4294967296.000000, 80020005 +VarR8FromStr: "11/33/1999 0AM", 4294967296.000000, 80020005 +VarR8FromStr: "11/11/1999 AM", 4294967296.000000, 80020005 +VarR8FromStr: "1/1/0 0AM", 4294967296.000000, 80020005 +VarR8FromStr: "1/1/-1 0AM", 4294967296.000000, 80020005 +VarR8FromStr: "1999 January 3 9AM", 4294967296.000000, 80020005 +VarR8FromStr: "1 January 1999 11AM", 4294967296.000000, 80020005 +VarR8FromStr: "4AM 11/11/1999", 4294967296.000000, 80020005 +VarR8FromStr: "4:22 11/11/1999 AM", 4294967296.000000, 80020005 +VarR8FromStr: " 1 1 /11/1999", 4294967296.000000, 80020005 +VarR8FromStr: "11-11/1999 11:11:11.12AM", 4294967296.000000, 80020005 +VarR8FromStr: "1999 January 3, 9AM", 4294967296.000000, 80020005 +VarR8FromStr: "December, 31, 2078", 4294967296.000000, 80020005 +VarR8FromStr: "December, 31, 2078,", 4294967296.000000, 80020005 +VarR8FromStr: "December, 31 2078", 4294967296.000000, 80020005 +VarR8FromStr: "11/99", 4294967296.000000, 80020005 +VarR8FromStr: "11-1999", 4294967296.000000, 80020005 +VarR8FromStr: "true", 4294967296.000000, 80020005 +VarR8FromStr: "True", 4294967296.000000, 80020005 +VarR8FromStr: "TRue", 4294967296.000000, 80020005 +VarR8FromStr: "TRUE", 4294967296.000000, 80020005 +VarR8FromStr: " TRUE", 4294967296.000000, 80020005 +VarR8FromStr: "FALSE ", 4294967296.000000, 80020005 +VarR8FromStr: "False", 4294967296.000000, 80020005 +VarR8FromStr: "JustSomeText", 4294967296.000000, 80020005 +VarR8FromStr: "Just Some Text", 4294967296.000000, 80020005 +VarR8FromStr: "", 4294967296.000000, 80020005 +VarR8FromStr: "1.5", 1.500000, 0 +VarR8FromStr: "2.5", 2.500000, 0 +VarR8FromStr: "3.5", 3.500000, 0 +VarR8FromStr: "4.5", 4.500000, 0 +VarR8FromStr: "", 4.500000, 80020005 +VarR8FromStr: "", 4.500000, 80020005 +VarR8FromStr: "", 4.500000, 80020005 +VarR8FromStr: "", 4.500000, 80020005 +VarR8FromStr: "", 4.500000, 80020005 +VarR8FromStr: "", 4.500000, 80020005 + + +======== Testing VarDateFromXXX ======== +VarDateFromI4: 2958465, 2958465.000000, 0 +VarDateFromI4: 2958466, 2958465.000000, 8002000A +VarDateFromI4: -657434, -657434.000000, 0 +VarDateFromI4: -657435, -657434.000000, 8002000A +VarDateFromR8: 2958465.9999, 2958465.999900, 0 +VarDateFromR8: 2958466, 2958465.999900, 8002000A +VarDateFromR8: -657434.9999, -657434.999900, 0 +VarDateFromR8: -657435, -657434.999900, 8002000A +VarDateFromR8: 0.0, 0.000000, 0 +VarDateFromR8: 1.0, 1.000000, 0 +VarDateFromR8: 2.25, 2.250000, 0 +VarDateFromR8: -2.0, -2.000000, 0 +VarDateFromStr: "-2", -2.000000, 80020005 +VarDateFromStr: "-1", -2.000000, 80020005 +VarDateFromStr: "-0.51", -2.000000, 80020005 +VarDateFromStr: "-0.5", -2.000000, 80020005 +VarDateFromStr: "-0.49", -2.000000, 80020005 +VarDateFromStr: "-0.0", -2.000000, 80020005 +VarDateFromStr: "0.0", 0.000000, 0 +VarDateFromStr: "0.49", 0.034028, 0 +VarDateFromStr: "0.5", 0.003472, 0 +VarDateFromStr: "0.51", 0.035417, 0 +VarDateFromStr: "1", 0.035417, 80020005 +VarDateFromStr: "127", 0.035417, 80020005 +VarDateFromStr: "128", 0.035417, 80020005 +VarDateFromStr: "129", 0.035417, 80020005 +VarDateFromStr: "255", 0.035417, 80020005 +VarDateFromStr: "256", 0.035417, 80020005 +VarDateFromStr: "257", 0.035417, 80020005 +VarDateFromStr: "32767", 0.035417, 80020005 +VarDateFromStr: "32768", 0.035417, 80020005 +VarDateFromStr: "-32768", 0.035417, 80020005 +VarDateFromStr: "-32769", 0.035417, 80020005 +VarDateFromStr: "16777216", 0.035417, 80020005 +VarDateFromStr: "16777217", 0.035417, 80020005 +VarDateFromStr: "-16777216", 0.035417, 80020005 +VarDateFromStr: "16777217", 0.035417, 80020005 +VarDateFromStr: "2147483647", 0.035417, 80020005 +VarDateFromStr: "2147483648", 0.035417, 80020005 +VarDateFromStr: "-2147483647", 0.035417, 80020005 +VarDateFromStr: "-2147483648", 0.035417, 80020005 +VarDateFromStr: "", 0.035417, 80020005 +VarDateFromStr: " ", 0.035417, 80020005 +VarDateFromStr: "1F", 0.035417, 80020005 +VarDateFromStr: "1G", 0.035417, 80020005 +VarDateFromStr: " 1 ", 0.035417, 80020005 +VarDateFromStr: " 1 2 ", 35797.000000, 0 +VarDateFromStr: "1,2,3", 37623.000000, 0 +VarDateFromStr: "1 2 3", 37623.000000, 0 +VarDateFromStr: "1,2, 3", 37623.000000, 0 +VarDateFromStr: "1;2;3", 37623.000000, 80020005 +VarDateFromStr: "1.2.3", 0.043090, 0 +VarDateFromStr: "0.", 0.043090, 80020005 +VarDateFromStr: ".0", 0.043090, 80020005 +VarDateFromStr: "0.1E12", 0.043090, 80020005 +VarDateFromStr: "2.4,E1", 0.043090, 80020005 +VarDateFromStr: " +3.2,E1", 0.043090, 80020005 +VarDateFromStr: "4E2.5", 0.043090, 80020005 +VarDateFromStr: " 2E+2", 0.043090, 80020005 +VarDateFromStr: "1 E+2", 0.043090, 80020005 +VarDateFromStr: ".", 0.043090, 80020005 +VarDateFromStr: ".E2", 0.043090, 80020005 +VarDateFromStr: "1000000000000000000000000000000000000000000000000000000000000000", 0.043090, 80020005 +VarDateFromStr: "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001", 0.043090, 80020005 +VarDateFromStr: "00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001", 0.043090, 80020005 +VarDateFromStr: "100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001", 0.043090, 80020005 +VarDateFromStr: "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001", 0.043090, 80020005 +VarDateFromStr: "65535", 0.043090, 80020005 +VarDateFromStr: "65535.5", 0.043090, 80020005 +VarDateFromStr: "65536", 0.043090, 80020005 +VarDateFromStr: "4294967295", 0.043090, 80020005 +VarDateFromStr: "4294967296", 0.043090, 80020005 +VarDateFromStr: "1 January 99", 36161.000000, 0 +VarDateFromStr: "December 31, 2078", 65380.000000, 0 +VarDateFromStr: "January 1, 1900", 2.000000, 0 +VarDateFromStr: "January 2 1900", 3.000000, 0 +VarDateFromStr: "11.11.1999", 3.000000, 80020005 +VarDateFromStr: "11/11/1999", 36475.000000, 0 +VarDateFromStr: " 11 / 11 / 1999", 36475.000000, 0 +VarDateFromStr: "11/11/1999:11:11:1134", 36475.000000, 80020005 +VarDateFromStr: "11/11/1999 11:11:11:1", 36475.000000, 80020005 +VarDateFromStr: " 1999/ 11/21 11 :11:11am", 36485.466100, 0 +VarDateFromStr: "11/11/1999 11:11:11Am", 36475.466100, 0 +VarDateFromStr: "11/11/1999 11:11:11PM", 36475.966100, 0 +VarDateFromStr: "11/11/199911:11:11PM", 36475.966100, 80020005 +VarDateFromStr: "11/11/1999 0:0:11am", 36475.000127, 0 +VarDateFromStr: "11/11/1999 11,11:11am", 36475.000127, 80020005 +VarDateFromStr: "11/11/1999 11:11:11am", 36475.466100, 0 +VarDateFromStr: "11/11/1999 11/11:11am", 36475.466100, 80020005 +VarDateFromStr: "11/11/1999 11:11AM", 36475.465972, 0 +VarDateFromStr: "11/11/1999 1AM", 36475.041667, 0 +VarDateFromStr: "11/11/1999 0AM", 36475.000000, 0 +VarDateFromStr: "11/11/1999 11:11:11", 36475.466100, 0 +VarDateFromStr: "11/13/1999 0AM", 36477.000000, 0 +VarDateFromStr: "13/13/1999 0AM", 36477.000000, 80020005 +VarDateFromStr: "13/11/1999 0AM", 36477.000000, 0 +VarDateFromStr: "11/33/1999 0AM", 36477.000000, 80020005 +VarDateFromStr: "11/11/1999 AM", 36477.000000, 80020005 +VarDateFromStr: "1/1/0 0AM", 36526.000000, 0 +VarDateFromStr: "1/1/-1 0AM", 36526.000000, 80020005 +VarDateFromStr: "1999 January 3 9AM", 36163.375000, 0 +VarDateFromStr: "1 January 1999 11AM", 36161.458333, 0 +VarDateFromStr: "4AM 11/11/1999", 36475.166667, 0 +VarDateFromStr: "4:22 11/11/1999 AM", 36475.166667, 80020005 +VarDateFromStr: " 1 1 /11/1999", 36475.166667, 80020005 +VarDateFromStr: "11-11/1999 11:11:11.12AM", 36475.166667, 80020005 +VarDateFromStr: "1999 January 3, 9AM", 36475.166667, 80020005 +VarDateFromStr: "December, 31, 2078", 65380.000000, 0 +VarDateFromStr: "December, 31, 2078,", 65380.000000, 80020005 +VarDateFromStr: "December, 31 2078", 65380.000000, 0 +VarDateFromStr: "11/99", 36465.000000, 0 +VarDateFromStr: "11-1999", 36465.000000, 0 +VarDateFromStr: "true", 36465.000000, 80020005 +VarDateFromStr: "True", 36465.000000, 80020005 +VarDateFromStr: "TRue", 36465.000000, 80020005 +VarDateFromStr: "TRUE", 36465.000000, 80020005 +VarDateFromStr: " TRUE", 36465.000000, 80020005 +VarDateFromStr: "FALSE ", 36465.000000, 80020005 +VarDateFromStr: "False", 36465.000000, 80020005 +VarDateFromStr: "JustSomeText", 36465.000000, 80020005 +VarDateFromStr: "Just Some Text", 36465.000000, 80020005 +VarDateFromStr: "", 36465.000000, 80020005 +VarDateFromStr: "1.5", 0.045139, 0 +VarDateFromStr: "2.5", 0.086806, 0 +VarDateFromStr: "3.5", 0.128472, 0 +VarDateFromStr: "4.5", 0.170139, 0 +VarDateFromStr: "", 0.170139, 80020005 +VarDateFromStr: "", 0.170139, 80020005 +VarDateFromStr: "", 0.170139, 80020005 +VarDateFromStr: "", 0.170139, 80020005 +VarDateFromStr: "", 0.170139, 80020005 +VarDateFromStr: "", 0.170139, 80020005 + + +======== Testing VarBoolFromXXX ======== +VarBoolFromI4: 0, 0, 0 +VarBoolFromI4: 1, -1, 0 +VarBoolFromI4: -1, -1, 0 +VarBoolFromI4: 2, -1, 0 +VarBoolFromUI1: ' ', -1, 0 +VarBoolFromUI1: '\0', 0, 0 +VarBoolFromUI1: 0x0000, 0, 0 +VarBoolFromUI1: 0xFFF, -1, 0 +VarBoolFromUI1: 0xFFFF, -1, 0 +VarBoolFromR8: 0.0, 0, 0 +VarBoolFromR8: 1.1, -1, 0 +VarBoolFromR8: 0.5, -1, 0 +VarBoolFromR8: 0.49, -1, 0 +VarBoolFromR8: 0.51, -1, 0 +VarBoolFromR8: -0.5, -1, 0 +VarBoolFromR8: -0.49, -1, 0 +VarBoolFromR8: -0.51, -1, 0 +VarBoolFromStr: "-2", -1, 0 +VarBoolFromStr: "-1", -1, 0 +VarBoolFromStr: "-0.51", -1, 0 +VarBoolFromStr: "-0.5", -1, 0 +VarBoolFromStr: "-0.49", -1, 0 +VarBoolFromStr: "-0.0", 0, 0 +VarBoolFromStr: "0.0", 0, 0 +VarBoolFromStr: "0.49", -1, 0 +VarBoolFromStr: "0.5", -1, 0 +VarBoolFromStr: "0.51", -1, 0 +VarBoolFromStr: "1", -1, 0 +VarBoolFromStr: "127", -1, 0 +VarBoolFromStr: "128", -1, 0 +VarBoolFromStr: "129", -1, 0 +VarBoolFromStr: "255", -1, 0 +VarBoolFromStr: "256", -1, 0 +VarBoolFromStr: "257", -1, 0 +VarBoolFromStr: "32767", -1, 0 +VarBoolFromStr: "32768", -1, 0 +VarBoolFromStr: "-32768", -1, 0 +VarBoolFromStr: "-32769", -1, 0 +VarBoolFromStr: "16777216", -1, 0 +VarBoolFromStr: "16777217", -1, 0 +VarBoolFromStr: "-16777216", -1, 0 +VarBoolFromStr: "16777217", -1, 0 +VarBoolFromStr: "2147483647", -1, 0 +VarBoolFromStr: "2147483648", -1, 0 +VarBoolFromStr: "-2147483647", -1, 0 +VarBoolFromStr: "-2147483648", -1, 0 +VarBoolFromStr: "", -1, 80020005 +VarBoolFromStr: " ", -1, 80020005 +VarBoolFromStr: "1F", -1, 80020005 +VarBoolFromStr: "1G", -1, 80020005 +VarBoolFromStr: " 1 ", -1, 0 +VarBoolFromStr: " 1 2 ", -1, 80020005 +VarBoolFromStr: "1,2,3", -1, 0 +VarBoolFromStr: "1 2 3", -1, 80020005 +VarBoolFromStr: "1,2, 3", -1, 80020005 +VarBoolFromStr: "1;2;3", -1, 80020005 +VarBoolFromStr: "1.2.3", -1, 80020005 +VarBoolFromStr: "0.", 0, 0 +VarBoolFromStr: ".0", 0, 0 +VarBoolFromStr: "0.1E12", -1, 0 +VarBoolFromStr: "2.4,E1", -1, 0 +VarBoolFromStr: " +3.2,E1", -1, 0 +VarBoolFromStr: "4E2.5", -1, 80020005 +VarBoolFromStr: " 2E+2", -1, 0 +VarBoolFromStr: "1 E+2", -1, 80020005 +VarBoolFromStr: ".", -1, 80020005 +VarBoolFromStr: ".E2", -1, 80020005 +VarBoolFromStr: "1000000000000000000000000000000000000000000000000000000000000000", -1, 0 +VarBoolFromStr: "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001", -1, 0 +VarBoolFromStr: "00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001", -1, 0 +VarBoolFromStr: "100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001", -1, 0 +VarBoolFromStr: "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001", -1, 0 +VarBoolFromStr: "65535", -1, 0 +VarBoolFromStr: "65535.5", -1, 0 +VarBoolFromStr: "65536", -1, 0 +VarBoolFromStr: "4294967295", -1, 0 +VarBoolFromStr: "4294967296", -1, 0 +VarBoolFromStr: "1 January 99", -1, 80020005 +VarBoolFromStr: "December 31, 2078", -1, 80020005 +VarBoolFromStr: "January 1, 1900", -1, 80020005 +VarBoolFromStr: "January 2 1900", -1, 80020005 +VarBoolFromStr: "11.11.1999", -1, 80020005 +VarBoolFromStr: "11/11/1999", -1, 80020005 +VarBoolFromStr: " 11 / 11 / 1999", -1, 80020005 +VarBoolFromStr: "11/11/1999:11:11:1134", -1, 80020005 +VarBoolFromStr: "11/11/1999 11:11:11:1", -1, 80020005 +VarBoolFromStr: " 1999/ 11/21 11 :11:11am", -1, 80020005 +VarBoolFromStr: "11/11/1999 11:11:11Am", -1, 80020005 +VarBoolFromStr: "11/11/1999 11:11:11PM", -1, 80020005 +VarBoolFromStr: "11/11/199911:11:11PM", -1, 80020005 +VarBoolFromStr: "11/11/1999 0:0:11am", -1, 80020005 +VarBoolFromStr: "11/11/1999 11,11:11am", -1, 80020005 +VarBoolFromStr: "11/11/1999 11:11:11am", -1, 80020005 +VarBoolFromStr: "11/11/1999 11/11:11am", -1, 80020005 +VarBoolFromStr: "11/11/1999 11:11AM", -1, 80020005 +VarBoolFromStr: "11/11/1999 1AM", -1, 80020005 +VarBoolFromStr: "11/11/1999 0AM", -1, 80020005 +VarBoolFromStr: "11/11/1999 11:11:11", -1, 80020005 +VarBoolFromStr: "11/13/1999 0AM", -1, 80020005 +VarBoolFromStr: "13/13/1999 0AM", -1, 80020005 +VarBoolFromStr: "13/11/1999 0AM", -1, 80020005 +VarBoolFromStr: "11/33/1999 0AM", -1, 80020005 +VarBoolFromStr: "11/11/1999 AM", -1, 80020005 +VarBoolFromStr: "1/1/0 0AM", -1, 80020005 +VarBoolFromStr: "1/1/-1 0AM", -1, 80020005 +VarBoolFromStr: "1999 January 3 9AM", -1, 80020005 +VarBoolFromStr: "1 January 1999 11AM", -1, 80020005 +VarBoolFromStr: "4AM 11/11/1999", -1, 80020005 +VarBoolFromStr: "4:22 11/11/1999 AM", -1, 80020005 +VarBoolFromStr: " 1 1 /11/1999", -1, 80020005 +VarBoolFromStr: "11-11/1999 11:11:11.12AM", -1, 80020005 +VarBoolFromStr: "1999 January 3, 9AM", -1, 80020005 +VarBoolFromStr: "December, 31, 2078", -1, 80020005 +VarBoolFromStr: "December, 31, 2078,", -1, 80020005 +VarBoolFromStr: "December, 31 2078", -1, 80020005 +VarBoolFromStr: "11/99", -1, 80020005 +VarBoolFromStr: "11-1999", -1, 80020005 +VarBoolFromStr: "true", -1, 0 +VarBoolFromStr: "True", -1, 0 +VarBoolFromStr: "TRue", -1, 0 +VarBoolFromStr: "TRUE", -1, 0 +VarBoolFromStr: " TRUE", -1, 80020005 +VarBoolFromStr: "FALSE ", -1, 80020005 +VarBoolFromStr: "False", 0, 0 +VarBoolFromStr: "JustSomeText", 0, 80020005 +VarBoolFromStr: "Just Some Text", 0, 80020005 +VarBoolFromStr: "", 0, 80020005 +VarBoolFromStr: "1.5", -1, 0 +VarBoolFromStr: "2.5", -1, 0 +VarBoolFromStr: "3.5", -1, 0 +VarBoolFromStr: "4.5", -1, 0 +VarBoolFromStr: "", -1, 80020005 +VarBoolFromStr: "", -1, 80020005 +VarBoolFromStr: "", -1, 80020005 +VarBoolFromStr: "", -1, 80020005 +VarBoolFromStr: "", -1, 80020005 +VarBoolFromStr: "", -1, 80020005 +VarI1FromBool: VARIANT_TRUE, 255, 0 +VarUI2FromI2: -1, 0, 8002000A + + +======== Testing VarBSTRFromXXX ======== +VarBstrFromI1: -100, "-100", 0 +VarBstrFromUI1: 0x5A, "90", 0 +VarBstrFromI4: 2958465, "2958465", 0 +VarBstrFromR8: 1.000000, "1", 0 +VarBstrFromR8: -1.000000, "-1", 0 +VarBstrFromR8: 21.000000, "21", 0 +VarBstrFromR8: -21.000000, "-21", 0 +VarBstrFromR8: 321.000000, "321", 0 +VarBstrFromR8: -321.000000, "-321", 0 +VarBstrFromR8: 4321.000000, "4321", 0 +VarBstrFromR8: -4321.000000, "-4321", 0 +VarBstrFromR8: 54321.000000, "54321", 0 +VarBstrFromR8: -54321.000000, "-54321", 0 +VarBstrFromR8: 654321.000000, "654321", 0 +VarBstrFromR8: -654321.000000, "-654321", 0 +VarBstrFromR8: 7654321.000000, "7654321", 0 +VarBstrFromR8: -7654321.000000, "-7654321", 0 +VarBstrFromR8: 87654321.000000, "87654321", 0 +VarBstrFromR8: -87654321.000000, "-87654321", 0 +VarBstrFromR8: 987654321.000000, "987654321", 0 +VarBstrFromR8: -987654321.000000, "-987654321", 0 +VarBstrFromR8: 1987654321.000000, "1987654321", 0 +VarBstrFromR8: -1987654321.000000, "-1987654321", 0 +VarBstrFromR8: 21987654321.000000, "21987654321", 0 +VarBstrFromR8: -21987654321.000000, "-21987654321", 0 +VarBstrFromR8: 321987654321.000000, "321987654321", 0 +VarBstrFromR8: -321987654321.000000, "-321987654321", 0 +VarBstrFromR8: 4321987654321.000000, "4321987654321", 0 +VarBstrFromR8: -4321987654321.000000, "-4321987654321", 0 +VarBstrFromR8: 54321987654321.000000, "54321987654321", 0 +VarBstrFromR8: -54321987654321.000000, "-54321987654321", 0 +VarBstrFromR8: 654321987654321.000000, "654321987654321", 0 +VarBstrFromR8: -654321987654321.000000, "-654321987654321", 0 +VarBstrFromR8: 7654321987654321.000000, "7.65432198765432e+15", 0 +VarBstrFromR8: -7654321987654321.000000, "-7.65432198765432e+15", 0 +VarBstrFromR8: 87654321987654320.000000, "8.76543219876543e+16", 0 +VarBstrFromR8: -87654321987654320.000000, "-8.76543219876543e+16", 0 +VarBstrFromR8: 987654321987654270.000000, "9.87654321987654e+17", 0 +VarBstrFromR8: -987654321987654270.000000, "-9.87654321987654e+17", 0 +VarBstrFromR8: 1987654321987654100.000000, "1.98765432198765e+18", 0 +VarBstrFromR8: -1987654321987654100.000000, "-1.98765432198765e+18", 0 +VarBstrFromR8: 21987654321987654000.000000, "2.19876543219877e+19", 0 +VarBstrFromR8: -21987654321987654000.000000, "-2.19876543219877e+19", 0 +VarBstrFromR8: 1.000000, "1", 0 +VarBstrFromR8: 0.000000, "0", 0 +VarBstrFromR8: -1.000000, "-1", 0 +VarBstrFromR8: 1.200000, "1.2", 0 +VarBstrFromR8: 0.200000, "0.2", 0 +VarBstrFromR8: -1.200000, "-1.2", 0 +VarBstrFromR8: 1.230000, "1.23", 0 +VarBstrFromR8: 0.230000, "0.23", 0 +VarBstrFromR8: -1.230000, "-1.23", 0 +VarBstrFromR8: 1.234000, "1.234", 0 +VarBstrFromR8: 0.234000, "0.234", 0 +VarBstrFromR8: -1.234000, "-1.234", 0 +VarBstrFromR8: 1.234500, "1.2345", 0 +VarBstrFromR8: 0.234500, "0.2345", 0 +VarBstrFromR8: -1.234500, "-1.2345", 0 +VarBstrFromR8: 1.234560, "1.23456", 0 +VarBstrFromR8: 0.234560, "0.23456", 0 +VarBstrFromR8: -1.234560, "-1.23456", 0 +VarBstrFromR8: 1.234567, "1.234567", 0 +VarBstrFromR8: 0.234567, "0.234567", 0 +VarBstrFromR8: -1.234567, "-1.234567", 0 +VarBstrFromR8: 1.234568, "1.2345678", 0 +VarBstrFromR8: 0.234568, "0.2345678", 0 +VarBstrFromR8: -1.234568, "-1.2345678", 0 +VarBstrFromR8: 1.234568, "1.23456789", 0 +VarBstrFromR8: 0.234568, "0.23456789", 0 +VarBstrFromR8: -1.234568, "-1.23456789", 0 +VarBstrFromR8: 1.234568, "1.234567891", 0 +VarBstrFromR8: 0.234568, "0.234567891", 0 +VarBstrFromR8: -1.234568, "-1.234567891", 0 +VarBstrFromR8: 1.234568, "1.2345678912", 0 +VarBstrFromR8: 0.234568, "0.2345678912", 0 +VarBstrFromR8: -1.234568, "-1.2345678912", 0 +VarBstrFromR8: 1.234568, "1.23456789123", 0 +VarBstrFromR8: 0.234568, "0.23456789123", 0 +VarBstrFromR8: -1.234568, "-1.23456789123", 0 +VarBstrFromR8: 1.234568, "1.234567891234", 0 +VarBstrFromR8: 0.234568, "0.234567891234", 0 +VarBstrFromR8: -1.234568, "-1.234567891234", 0 +VarBstrFromR8: 1.234568, "1.2345678912345", 0 +VarBstrFromR8: 0.234568, "0.2345678912345", 0 +VarBstrFromR8: -1.234568, "-1.2345678912345", 0 +VarBstrFromR8: 1.234568, "1.23456789123456", 0 +VarBstrFromR8: 0.234568, "0.23456789123456", 0 +VarBstrFromR8: -1.234568, "-1.23456789123456", 0 +VarBstrFromR8: 1.234568, "1.23456789123457", 0 +VarBstrFromR8: 0.234568, "0.234567891234567", 0 +VarBstrFromR8: -1.234568, "-1.23456789123457", 0 +VarBstrFromR8: 1.234568, "1.23456789123457", 0 +VarBstrFromR8: 0.234568, "0.234567891234568", 0 +VarBstrFromR8: -1.234568, "-1.23456789123457", 0 +VarBstrFromR8: 1.234568, "1.23456789123457", 0 +VarBstrFromR8: 0.234568, "0.234567891234568", 0 +VarBstrFromR8: -1.234568, "-1.23456789123457", 0 +VarBstrFromR8: 1.234568, "1.23456789123457", 0 +VarBstrFromR8: 0.234568, "0.234567891234568", 0 +VarBstrFromR8: -1.234568, "-1.23456789123457", 0 +VarBstrFromR8: 1.234568, "1.23456789123457", 0 +VarBstrFromR8: 0.234568, "0.234567891234568", 0 +VarBstrFromR8: -1.234568, "-1.23456789123457", 0 +VarBstrFromR8: 2.000000, "2", 0 +VarBstrFromR8: -2.000000, "-2", 0 +VarBstrFromR8: 22.200000, "22.2", 0 +VarBstrFromR8: -22.200000, "-22.2", 0 +VarBstrFromR8: 322.230000, "322.23", 0 +VarBstrFromR8: -322.230000, "-322.23", 0 +VarBstrFromR8: 4322.234000, "4322.234", 0 +VarBstrFromR8: -4322.234000, "-4322.234", 0 +VarBstrFromR8: 54322.234500, "54322.2345", 0 +VarBstrFromR8: -54322.234500, "-54322.2345", 0 +VarBstrFromR8: 654322.234560, "654322.23456", 0 +VarBstrFromR8: -654322.234560, "-654322.23456", 0 +VarBstrFromR8: 7654322.234567, "7654322.234567", 0 +VarBstrFromR8: -7654322.234567, "-7654322.234567", 0 +VarBstrFromR8: 87654322.234568, "87654322.2345678", 0 +VarBstrFromR8: -87654322.234568, "-87654322.2345678", 0 +VarBstrFromR8: 987654322.234568, "987654322.234568", 0 +VarBstrFromR8: -987654322.234568, "-987654322.234568", 0 +VarBstrFromR8: 1987654322.234568, "1987654322.23457", 0 +VarBstrFromR8: -1987654322.234568, "-1987654322.23457", 0 +VarBstrFromR8: 21987654322.234570, "21987654322.2346", 0 +VarBstrFromR8: -21987654322.234570, "-21987654322.2346", 0 +VarBstrFromR8: 321987654322.234560, "321987654322.235", 0 +VarBstrFromR8: -321987654322.234560, "-321987654322.235", 0 +VarBstrFromR8: 4321987654322.234400, "4321987654322.23", 0 +VarBstrFromR8: -4321987654322.234400, "-4321987654322.23", 0 +VarBstrFromR8: 54321987654322.234000, "54321987654322.2", 0 +VarBstrFromR8: -54321987654322.234000, "-54321987654322.2", 0 +VarBstrFromR8: 654321987654322.250000, "654321987654322", 0 +VarBstrFromR8: -654321987654322.250000, "-654321987654322", 0 +VarBstrFromR8: 7654321987654322.000000, "7.65432198765432e+15", 0 +VarBstrFromR8: -7654321987654322.000000, "-7.65432198765432e+15", 0 +VarBstrFromR8: 87654321987654320.000000, "8.76543219876543e+16", 0 +VarBstrFromR8: -87654321987654320.000000, "-8.76543219876543e+16", 0 +VarBstrFromR8: 987654321987654270.000000, "9.87654321987654e+17", 0 +VarBstrFromR8: -987654321987654270.000000, "-9.87654321987654e+17", 0 +VarBstrFromR8: 1987654321987654100.000000, "1.98765432198765e+18", 0 +VarBstrFromR8: -1987654321987654100.000000, "-1.98765432198765e+18", 0 +VarBstrFromR8: 21987654321987654000.000000, "2.19876543219877e+19", 0 +VarBstrFromR8: -21987654321987654000.000000, "-2.19876543219877e+19", 0 +VarBstrFromR4: 1.000000, "1", 0 +VarBstrFromR4: -1.000000, "-1", 0 +VarBstrFromR4: 21.000000, "21", 0 +VarBstrFromR4: -21.000000, "-21", 0 +VarBstrFromR4: 321.000000, "321", 0 +VarBstrFromR4: -321.000000, "-321", 0 +VarBstrFromR4: 4321.000000, "4321", 0 +VarBstrFromR4: -4321.000000, "-4321", 0 +VarBstrFromR4: 54321.000000, "54321", 0 +VarBstrFromR4: -54321.000000, "-54321", 0 +VarBstrFromR4: 654321.000000, "654321", 0 +VarBstrFromR4: -654321.000000, "-654321", 0 +VarBstrFromR4: 7654321.000000, "7654321", 0 +VarBstrFromR4: -7654321.000000, "-7654321", 0 +VarBstrFromR4: 87654321.000000, "8.765432e+07", 0 +VarBstrFromR4: -87654321.000000, "-8.765432e+07", 0 +VarBstrFromR4: 987654321.000000, "9.876543e+08", 0 +VarBstrFromR4: -987654321.000000, "-9.876543e+08", 0 +VarBstrFromR4: 1987654321.000000, "1.987654e+09", 0 +VarBstrFromR4: -1987654321.000000, "-1.987654e+09", 0 +VarBstrFromR4: 1.000000, "1", 0 +VarBstrFromR4: 0.000000, "0", 0 +VarBstrFromR4: -1.000000, "-1", 0 +VarBstrFromR4: 1.200000, "1.2", 0 +VarBstrFromR4: 0.200000, "0.2", 0 +VarBstrFromR4: -1.200000, "-1.2", 0 +VarBstrFromR4: 1.230000, "1.23", 0 +VarBstrFromR4: 0.230000, "0.23", 0 +VarBstrFromR4: -1.230000, "-1.23", 0 +VarBstrFromR4: 1.234000, "1.234", 0 +VarBstrFromR4: 0.234000, "0.234", 0 +VarBstrFromR4: -1.234000, "-1.234", 0 +VarBstrFromR4: 1.234500, "1.2345", 0 +VarBstrFromR4: 0.234500, "0.2345", 0 +VarBstrFromR4: -1.234500, "-1.2345", 0 +VarBstrFromR4: 1.234560, "1.23456", 0 +VarBstrFromR4: 0.234560, "0.23456", 0 +VarBstrFromR4: -1.234560, "-1.23456", 0 +VarBstrFromR4: 1.234567, "1.234567", 0 +VarBstrFromR4: 0.234567, "0.234567", 0 +VarBstrFromR4: -1.234567, "-1.234567", 0 +VarBstrFromR4: 1.234568, "1.234568", 0 +VarBstrFromR4: 0.234568, "0.2345678", 0 +VarBstrFromR4: -1.234568, "-1.234568", 0 +VarBstrFromR4: 1.234568, "1.234568", 0 +VarBstrFromR4: 0.234568, "0.2345679", 0 +VarBstrFromR4: -1.234568, "-1.234568", 0 +VarBstrFromR4: 1.234568, "1.234568", 0 +VarBstrFromR4: 0.234568, "0.2345679", 0 +VarBstrFromR4: -1.234568, "-1.234568", 0 +VarBstrFromR4: 2.000000, "2", 0 +VarBstrFromR4: -2.000000, "-2", 0 +VarBstrFromR4: 22.200000, "22.2", 0 +VarBstrFromR4: -22.200000, "-22.2", 0 +VarBstrFromR4: 322.230000, "322.23", 0 +VarBstrFromR4: -322.230000, "-322.23", 0 +VarBstrFromR4: 4322.234000, "4322.234", 0 +VarBstrFromR4: -4322.234000, "-4322.234", 0 +VarBstrFromR4: 54322.234500, "54322.23", 0 +VarBstrFromR4: -54322.234500, "-54322.23", 0 +VarBstrFromR4: 654322.234560, "654322.3", 0 +VarBstrFromR4: -654322.234560, "-654322.3", 0 +VarBstrFromR4: 7654322.234567, "7654322", 0 +VarBstrFromR4: -7654322.234567, "-7654322", 0 +VarBstrFromR4: 87654322.234568, "8.765432e+07", 0 +VarBstrFromR4: -87654322.234568, "-8.765432e+07", 0 +VarBstrFromR4: 987654322.234568, "9.876543e+08", 0 +VarBstrFromR4: -987654322.234568, "-9.876543e+08", 0 +VarBstrFromR4: 1987654322.234568, "1.987654e+09", 0 +VarBstrFromR4: -1987654322.234568, "-1.987654e+09", 0 +VarBstrFromBool: 0x00, "False", 0 +VarBstrFromBool: 0xFF, "True", 0 +VarBstrFromDate: 0.0, "12:00:00 AM", 0 +VarBstrFromDate: 3.34, "1/2/1900 8:09:36 AM", 0 +VarBstrFromDate: 3339.34, "2/20/1909 8:09:36 AM", 0 +VarBstrFromDate: 365.00, "12/30/1900", 0 +VarBstrFromDate: 365.25, "12/30/1900 6:00:00 AM", 0 +VarBstrFromDate: 1461.00, "12/31/1903", 0 +VarBstrFromDate: 1461.5, "12/31/1903 12:00:00 PM", 0 +VarBstrFromBool: 0x00, "False", 0 +VarBstrFromBool: 0xFF, "True", 0 +VarBstrFromDate: 0.0, "12:00:00 AM", 0 +VarBstrFromDate: 3.34, "1/2/1900 8:09:36 AM", 0 + + +======== Testing Hi-Level Variant API ======== +Result is: 80020008 +VariantClear: 0 +VariantClear: 0 +VariantCopy: 0 +VariantClear: 0 +VariantClear: 0 +VariantCopy 4.123000 -> 4.123000: 0 +VariantCopyInd 31.123000: 0 +VariantCopy 1.123000 -> 1.123000: 0 +VariantCopy 123.123000 -> 123.123000: 0 +VariantCopyInd 111.200000 -> 111.200000: 0 +VariantChangeTypeEx 1211: 0 +VariantChangeTypeEx 4 -> "4": 0 +VariantChangeTypeEx 34465.332431 -> "5/11/94 7:58:42 AM": 0 +VariantChangeTypeEx "-0.49" -> -0.490000: 0 +VariantCopyInd: 80070057 +-------------- Testing different VARTYPES ---------------- +VariantCopyInd: 0 -> 0 +VariantCopyInd: 0 -> 80070057 +VariantChangeTypeEx: 0 -> 0 +VariantChangeTypeEx: VT_BYREF 0 -> 80020008 +VariantClear: 0 -> 80020008 +VariantCopyInd: 1 -> 0 +VariantCopyInd: 1 -> 80070057 +VariantChangeTypeEx: 1 -> 0 +VariantChangeTypeEx: VT_BYREF 1 -> 80020008 +VariantClear: 1 -> 80020008 +VariantCopyInd: 2 -> 0 +VariantCopyInd: 2 -> 0 +VariantChangeTypeEx: 2 -> 0 +VariantChangeTypeEx: VT_BYREF 2 -> 80020005 +VariantClear: 2 -> 80020008 +VariantCopyInd: 3 -> 0 +VariantCopyInd: 3 -> 0 +VariantChangeTypeEx: 3 -> 0 +VariantChangeTypeEx: VT_BYREF 3 -> 80020005 +VariantClear: 3 -> 80020008 +VariantCopyInd: 4 -> 0 +VariantCopyInd: 4 -> 0 +VariantChangeTypeEx: 4 -> 0 +VariantChangeTypeEx: VT_BYREF 4 -> 80020005 +VariantClear: 4 -> 80020008 +VariantCopyInd: 5 -> 0 +VariantCopyInd: 5 -> 0 +VariantChangeTypeEx: 5 -> 0 +VariantChangeTypeEx: VT_BYREF 5 -> 80020005 +VariantClear: 5 -> 80020008 +VariantCopyInd: 6 -> 0 +VariantCopyInd: 6 -> 0 +VariantChangeTypeEx: 6 -> 0 +VariantChangeTypeEx: VT_BYREF 6 -> 80020005 +VariantClear: 6 -> 80020008 +VariantCopyInd: 7 -> 0 +VariantCopyInd: 7 -> 0 +VariantChangeTypeEx: 7 -> 0 +VariantChangeTypeEx: VT_BYREF 7 -> 80020005 +VariantClear: 7 -> 80020008 +VariantCopyInd: 77 -> 80020008 +VariantCopyInd: 77 -> 80070057 +VariantChangeTypeEx: 77 -> 80020008 +VariantChangeTypeEx: VT_BYREF 77 -> 80020008 +VariantClear: 77 -> 80020008 +VariantCopyInd: 78 -> 80020008 +VariantCopyInd: 78 -> 80070057 +VariantChangeTypeEx: 78 -> 80020008 +VariantChangeTypeEx: VT_BYREF 78 -> 80020008 +VariantClear: 78 -> 80020008 +VariantCopyInd: 79 -> 80020008 +VariantCopyInd: 79 -> 80070057 +VariantChangeTypeEx: 79 -> 80020008 +VariantChangeTypeEx: VT_BYREF 79 -> 80020008 +VariantClear: 79 -> 80020008 +VariantCopyInd: 80 -> 80020008 +VariantCopyInd: 80 -> 80070057 +VariantChangeTypeEx: 80 -> 80020008 +VariantChangeTypeEx: VT_BYREF 80 -> 80020008 +VariantClear: 80 -> 80020008 +VariantCopyInd: 81 -> 80020008 +VariantCopyInd: 81 -> 80070057 +VariantChangeTypeEx: 81 -> 80020008 +VariantChangeTypeEx: VT_BYREF 81 -> 80020008 +VariantClear: 81 -> 80020008 +VariantCopyInd: 82 -> 80020008 +VariantCopyInd: 82 -> 80070057 +VariantChangeTypeEx: 82 -> 80020008 +VariantChangeTypeEx: VT_BYREF 82 -> 80020008 +VariantClear: 82 -> 80020008 +VariantCopyInd: 83 -> 80020008 +VariantCopyInd: 83 -> 80070057 +VariantChangeTypeEx: 83 -> 80020008 +VariantChangeTypeEx: VT_BYREF 83 -> 80020008 +VariantClear: 83 -> 80020008 +VariantCopyInd: 84 -> 80020008 +VariantCopyInd: 84 -> 80070057 +VariantChangeTypeEx: 84 -> 80020008 +VariantChangeTypeEx: VT_BYREF 84 -> 80020008 +VariantClear: 84 -> 80020008 +VariantCopyInd: 85 -> 80020008 +VariantCopyInd: 85 -> 80070057 +VariantChangeTypeEx: 85 -> 80020008 +VariantChangeTypeEx: VT_BYREF 85 -> 80020008 +VariantClear: 85 -> 80020008 +VariantCopyInd: 86 -> 80020008 +VariantCopyInd: 86 -> 80070057 +VariantChangeTypeEx: 86 -> 80020008 +VariantChangeTypeEx: VT_BYREF 86 -> 80020008 +VariantClear: 86 -> 80020008 +VariantCopyInd: 87 -> 80020008 +VariantCopyInd: 87 -> 80070057 +VariantChangeTypeEx: 87 -> 80020008 +VariantChangeTypeEx: VT_BYREF 87 -> 80020008 +VariantClear: 87 -> 80020008 +VariantCopyInd: 88 -> 80020008 +VariantCopyInd: 88 -> 80070057 +VariantChangeTypeEx: 88 -> 80020008 +VariantChangeTypeEx: VT_BYREF 88 -> 80020008 +VariantClear: 88 -> 80020008 +VariantCopyInd: 89 -> 80020008 +VariantCopyInd: 89 -> 80070057 +VariantChangeTypeEx: 89 -> 80020008 +VariantChangeTypeEx: VT_BYREF 89 -> 80020008 +VariantClear: 89 -> 80020008 +VariantCopyInd: 90 -> 80020008 +VariantCopyInd: 90 -> 80070057 +VariantChangeTypeEx: 90 -> 80020008 +VariantChangeTypeEx: VT_BYREF 90 -> 80020008 +VariantClear: 90 -> 80020008 +VariantCopyInd: 91 -> 80020008 +VariantCopyInd: 91 -> 80070057 +VariantChangeTypeEx: 91 -> 80020008 +VariantChangeTypeEx: VT_BYREF 91 -> 80020008 +VariantClear: 91 -> 80020008 +VariantCopyInd: 92 -> 80020008 +VariantCopyInd: 92 -> 80070057 +VariantChangeTypeEx: 92 -> 80020008 +VariantChangeTypeEx: VT_BYREF 92 -> 80020008 +VariantClear: 92 -> 80020008 +VariantCopyInd: 93 -> 80020008 +VariantCopyInd: 93 -> 80070057 +VariantChangeTypeEx: 93 -> 80020008 +VariantChangeTypeEx: VT_BYREF 93 -> 80020008 +VariantClear: 93 -> 80020008 +VariantCopyInd: 94 -> 80020008 +VariantCopyInd: 94 -> 80070057 +VariantChangeTypeEx: 94 -> 80020008 +VariantChangeTypeEx: VT_BYREF 94 -> 80020008 +VariantClear: 94 -> 80020008 +VariantCopyInd: 95 -> 80020008 +VariantCopyInd: 95 -> 80070057 +VariantChangeTypeEx: 95 -> 80020008 +VariantChangeTypeEx: VT_BYREF 95 -> 80020008 +VariantClear: 95 -> 80020008 +VariantCopyInd: 96 -> 80020008 +VariantCopyInd: 96 -> 80070057 +VariantChangeTypeEx: 96 -> 80020008 +VariantChangeTypeEx: VT_BYREF 96 -> 80020008 +VariantClear: 96 -> 80020008 +VariantCopyInd: 97 -> 80020008 +VariantCopyInd: 97 -> 80070057 +VariantChangeTypeEx: 97 -> 80020008 +VariantChangeTypeEx: VT_BYREF 97 -> 80020008 +VariantClear: 97 -> 80020008 +VariantCopyInd: 98 -> 80020008 +VariantCopyInd: 98 -> 80070057 +VariantChangeTypeEx: 98 -> 80020008 +VariantChangeTypeEx: VT_BYREF 98 -> 80020008 +VariantClear: 98 -> 80020008 +VariantCopyInd: 99 -> 80020008 +VariantCopyInd: 99 -> 80070057 +VariantChangeTypeEx: 99 -> 80020008 +VariantChangeTypeEx: VT_BYREF 99 -> 80020008 +VariantClear: 99 -> 80020008 +VariantClear: 80020008 +VariantClear: 0 +VariantClear: 0 +VariantClear: 0 +VariantClear: 0 diff --git a/libtest/vartest.c b/libtest/vartest.c new file mode 100644 index 00000000000..8506cf207cf --- /dev/null +++ b/libtest/vartest.c @@ -0,0 +1,1051 @@ +/* + * VARIANT test program + * + * Copyright 1998 Jean-Claude Cote + * + * The purpose of this program is validate the implementation + * of the APIs related to VARIANTs. The validation is done + * by comparing the results given by the Windows implementation + * versus the Wine implementation. + * + * This program tests the creation/coercion/destruction of VARIANTs. + * + * The program does not currently test any API that takes + * arguments of type: IDispatch, IUnknown, DECIMAL, CURRENCY. + * + * Since the purpose of this program is to compare the results + * from Windows and Wine it is written so that with a simple + * define it can be compiled either in Windows or Linux. + * + * + * NOTES + * - The Variant structure in Windows has a non-named union. This means + * the member of the union are accessible simply by doing pVariant->pfltVal. + * With gcc it is not possible to have non-named union so it has been named + * 'u'. So it's members are accessible using this name like so + * pVariant->u.pfltVal. So if this program is compiled in Windows + * the references to 'u' will need to be take out of this file. + * + * - Also the printf is a little different so the format specifiers may + * need to be tweaked if this file is compile in Windows. + * Printf is also different in that it continues printing numbers + * even after there is no more significative digits left to print. These + * number are garbage and in windows they are set to zero but not + * on Linux. + * + * - The VarDateFromStr is not implemented yet. + * + * - The date and floating point format may not be the exact same format has the one in + * windows depending on what the Internatinal setting are in windows. + * + */ + + + +#include +#include +#include +#include +#include + +#include + +#include +#include +#include + +#if WINDOWS +#include +#else +#include +#endif + + +#ifdef WINDOWS +#else +#include +extern LPWSTR HEAP_strdupAtoW( HANDLE32 heap, DWORD flags, LPCSTR str ); +#endif + + +static const int MAX_BUFFER = 1024; + + +#ifdef WINDOWS +char* WtoA( OLECHAR* p ) +{ + int i = 0; + char* pc = (char *)malloc( MAX_BUFFER*sizeof(char) ); + pc[0] = '\"'; + pc++; + i = wcstombs( pc, p, MAX_BUFFER ); + if( i < MAX_BUFFER-1 ) + { + pc[i] = '\"'; + pc[i+1] = '\0'; + } + pc--; + return pc; +} + +OLECHAR* AtoW( char* p ) +{ + int i = 0; + OLECHAR* pwc = (OLECHAR *)malloc( MAX_BUFFER*sizeof(OLECHAR) ); + i = mbstowcs( pwc, p, MAX_BUFFER ); + return pwc; +} +#else +char* WtoA( OLECHAR* p ) +{ + return debugstr_wn( p, MAX_BUFFER ); +} +OLECHAR* AtoW( char* p ) +{ + return HEAP_strdupAtoW( GetProcessHeap(), 0, p ); +} +#endif + + +int PASCAL WinMain (HANDLE inst, HANDLE prev, LPSTR cmdline, int show) +{ + VARIANTARG va; + VARIANTARG vb; + VARIANTARG vc; + VARIANTARG vd; + VARIANTARG ve; + + int theInt = 0; + int* pInt = &theInt; + VARIANT_BOOL b = 0; + VARIANT_BOOL* pBool = &b; + unsigned short uShort = 0; + unsigned short* pUShort = &uShort; + unsigned long uLong = 0; + unsigned long* pULong = &uLong; + CHAR theChar; + CHAR* pChar = &theChar; + BYTE byte; + BYTE* pByte = &byte; + short s = 0; + short* pShort = &s; + long Long = 0; + long* pLong = &Long; + float f = 0; + float* pFloat = &f; + double d = 0; + double* pDouble = &d; + + unsigned short i = 0; + HRESULT res = 0; + BSTR bstr = NULL; + int olePtrIndex = 0; + int nOlePtrs = 120; + OLECHAR* pOleChar[120]; + + pOleChar[0] = AtoW( "-2" ); + pOleChar[1] = AtoW( "-1" ); + pOleChar[2] = AtoW( "-0.51" ); + pOleChar[3] = AtoW( "-0.5" ); + pOleChar[4] = AtoW( "-0.49" ); + pOleChar[5] = AtoW( "-0.0" ); + pOleChar[6] = AtoW( "0.0" ); + pOleChar[7] = AtoW( "0.49" ); + pOleChar[8] = AtoW( "0.5" ); + pOleChar[9] = AtoW( "0.51" ); + pOleChar[10] = AtoW( "1" ); + pOleChar[11] = AtoW( "127" ); + pOleChar[12] = AtoW( "128" ); + pOleChar[13] = AtoW( "129" ); + pOleChar[14] = AtoW( "255" ); + pOleChar[15] = AtoW( "256" ); + pOleChar[16] = AtoW( "257" ); + pOleChar[17] = AtoW( "32767" ); + pOleChar[18] = AtoW( "32768" ); + pOleChar[19] = AtoW( "-32768" ); + pOleChar[20] = AtoW( "-32769" ); + pOleChar[21] = AtoW( "16777216" ); + pOleChar[22] = AtoW( "16777217" ); + pOleChar[23] = AtoW( "-16777216" ); + pOleChar[24] = AtoW( "16777217" ); + pOleChar[25] = AtoW( "2147483647" ); + pOleChar[26] = AtoW( "2147483648" ); + pOleChar[27] = AtoW( "-2147483647" ); + pOleChar[28] = AtoW( "-2147483648" ); + + pOleChar[29] = AtoW( "" ); + pOleChar[30] = AtoW( " " ); + pOleChar[31] = AtoW( "1F" ); + pOleChar[32] = AtoW( "1G" ); + pOleChar[33] = AtoW( " 1 " ); + pOleChar[34] = AtoW( " 1 2 " ); + pOleChar[35] = AtoW( "1,2,3" ); + pOleChar[36] = AtoW( "1 2 3" ); + pOleChar[37] = AtoW( "1,2, 3" ); + pOleChar[38] = AtoW( "1;2;3" ); + pOleChar[39] = AtoW( "1.2.3" ); + + pOleChar[40] = AtoW( "0." ); + pOleChar[41] = AtoW( ".0" ); + pOleChar[42] = AtoW( "0.1E12" ); + pOleChar[43] = AtoW( "2.4,E1" ); + pOleChar[44] = AtoW( " +3.2,E1" ); + pOleChar[45] = AtoW( "4E2.5" ); + pOleChar[46] = AtoW( " 2E+2" ); + pOleChar[47] = AtoW( "1 E+2" ); + pOleChar[48] = AtoW( "." ); + pOleChar[49] = AtoW( ".E2" ); + pOleChar[50] = AtoW( "1000000000000000000000000000000000000000000000000000000000000000" ); + pOleChar[51] = AtoW( "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001" ); + pOleChar[52] = AtoW( "00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001" ); + pOleChar[53] = AtoW( "100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001" ); + pOleChar[54] = AtoW( "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001" ); + pOleChar[55] = AtoW( "65535" ); + pOleChar[56] = AtoW( "65535.5" ); + pOleChar[57] = AtoW( "65536" ); + pOleChar[58] = AtoW( "4294967295" ); + pOleChar[59] = AtoW( "4294967296" ); + + pOleChar[60] = AtoW( "1 January 99" ); + pOleChar[61] = AtoW( "December 31, 2078" ); + pOleChar[62] = AtoW( "January 1, 1900" ); + pOleChar[63] = AtoW( "January 2 1900" ); + pOleChar[64] = AtoW( "11.11.1999" ); + pOleChar[65] = AtoW( "11/11/1999" ); + pOleChar[66] = AtoW( " 11 / 11 / 1999" ); + pOleChar[67] = AtoW( "11/11/1999:11:11:1134" ); + pOleChar[68] = AtoW( "11/11/1999 11:11:11:1" ); + pOleChar[69] = AtoW( "\t1999/\t11/21 11 :11:11am" ); + + pOleChar[70] = AtoW( "11/11/1999 11:11:11Am" ); + pOleChar[71] = AtoW( "11/11/1999 11:11:11PM" ); + pOleChar[72] = AtoW( "11/11/199911:11:11PM" ); + pOleChar[73] = AtoW( "11/11/1999 0:0:11am" ); + pOleChar[74] = AtoW( "11/11/1999 11,11:11am" ); + pOleChar[75] = AtoW( "11/11/1999 11:11:11am" ); + pOleChar[76] = AtoW( "11/11/1999 11/11:11am" ); + pOleChar[77] = AtoW( "11/11/1999 11:11AM" ); + pOleChar[78] = AtoW( "11/11/1999 1AM" ); + pOleChar[79] = AtoW( "11/11/1999 0AM" ); + + pOleChar[80] = AtoW( "11/11/1999 11:11:11" ); + pOleChar[81] = AtoW( "11/13/1999 0AM" ); + pOleChar[82] = AtoW( "13/13/1999 0AM" ); + pOleChar[83] = AtoW( "13/11/1999 0AM" ); + pOleChar[84] = AtoW( "11/33/1999 0AM" ); + pOleChar[85] = AtoW( "11/11/1999 AM" ); + pOleChar[86] = AtoW( "1/1/0 0AM" ); + pOleChar[87] = AtoW( "1/1/-1 0AM" ); + pOleChar[88] = AtoW( "1999 January 3 9AM" ); + pOleChar[89] = AtoW( "1 January 1999 11AM" ); + + pOleChar[90] = AtoW( "4AM 11/11/1999" ); + pOleChar[91] = AtoW( "4:22 11/11/1999 AM" ); + pOleChar[92] = AtoW( " 1 1 /11/1999" ); + pOleChar[93] = AtoW( "11-11/1999 11:11:11.12AM" ); + pOleChar[94] = AtoW( "1999 January 3, 9AM" ); + pOleChar[95] = AtoW( "December, 31, 2078" ); + pOleChar[96] = AtoW( "December, 31, 2078," ); + pOleChar[97] = AtoW( "December, 31 2078" ); + pOleChar[98] = AtoW( "11/99" ); + pOleChar[99] = AtoW( "11-1999" ); + + pOleChar[100] = AtoW( "true" ); + pOleChar[101] = AtoW( "True" ); + pOleChar[102] = AtoW( "TRue" ); + pOleChar[103] = AtoW( "TRUE" ); + pOleChar[104] = AtoW( " TRUE" ); + pOleChar[105] = AtoW( "FALSE " ); + pOleChar[106] = AtoW( "False" ); + pOleChar[107] = AtoW( "JustSomeText" ); + pOleChar[108] = AtoW( "Just Some Text" ); + pOleChar[109] = AtoW( "" ); + + pOleChar[110] = AtoW( "1.5" ); + pOleChar[111] = AtoW( "2.5" ); + pOleChar[112] = AtoW( "3.5" ); + pOleChar[113] = AtoW( "4.5" ); + pOleChar[114] = AtoW( "" ); + pOleChar[115] = AtoW( "" ); + pOleChar[116] = AtoW( "" ); + pOleChar[117] = AtoW( "" ); + pOleChar[118] = AtoW( "" ); + pOleChar[119] = AtoW( "" ); + + + /* Start testing the Low-Level API ( the coercions ) + */ + + + /* unsigned char from... + */ + printf( "\n\n======== Testing VarUI1FromXXX ========\n"); + + /* res = VarUI1FromI2( 0, NULL ); + */ + printf( "VarUI1FromI2: passing in NULL as return val makes it crash, %X\n", (unsigned int) res ); + + res = VarUI1FromStr( NULL, 0, 0, pByte ); + printf( "VarUI1FromStr: passing in NULL as param: %X\n", (unsigned int) res ); + + res = VarUI1FromI2( 0, pByte ); + printf( "VarUI1FromI2: 0, %X, %X\n", *pByte, (unsigned int) res ); + res = VarUI1FromI2( 69, pByte ); + printf( "VarUI1FromI2: 69, %X, %X\n", *pByte, (unsigned int) res ); + res = VarUI1FromI2( 70, pByte ); + printf( "VarUI1FromI2: 70, %X, %X\n", *pByte, (unsigned int) res ); + res = VarUI1FromI2( 128, pByte ); + printf( "VarUI1FromI2: 128, %X, %X\n", *pByte, (unsigned int) res ); + res = VarUI1FromI2( 255, pByte ); + printf( "VarUI1FromI2: 255, %X, %X\n", *pByte, (unsigned int) res ); + res = VarUI1FromI2( 256, pByte ); + printf( "VarUI1FromI2: 256, %X, %X\n", *pByte, (unsigned int) res ); + res = VarUI1FromI2( 257, pByte ); + printf( "VarUI1FromI2: 257, %X, %X\n", *pByte, (unsigned int) res ); + + res = VarUI1FromR8( 0.0, pByte ); + printf( "VarUI1FromR8: 0.0, %X, %X\n", *pByte, (unsigned int) res ); + res = VarUI1FromR8( 69.33, pByte ); + printf( "VarUI1FromR8: 69.33, %X, %X\n", *pByte, (unsigned int) res ); + res = VarUI1FromR8( 69.66, pByte ); + printf( "VarUI1FromR8: 69.66, %X, %X\n", *pByte, (unsigned int) res ); + res = VarUI1FromR8( -69.33, pByte ); + printf( "VarUI1FromR8: -69.33, %X, %X\n", *pByte, (unsigned int) res ); + res = VarUI1FromR8( -69.66, pByte ); + printf( "VarUI1FromR8: -69.66, %X, %X\n", *pByte, (unsigned int) res ); + + res = VarUI1FromR8( -0.5, pByte ); + printf( "VarUI1FromR8: -0.5, %X, %X\n", *pByte, (unsigned int) res ); + res = VarUI1FromR8( -0.51, pByte ); + printf( "VarUI1FromR8: -0.51, %X, %X\n", *pByte, (unsigned int) res ); + res = VarUI1FromR8( -0.49, pByte ); + printf( "VarUI1FromR8: -0.49, %X, %X\n", *pByte, (unsigned int) res ); + + res = VarUI1FromR8( 0.5, pByte ); + printf( "VarUI1FromR8: 0.5, %X, %X\n", *pByte, (unsigned int) res ); + res = VarUI1FromR8( 0.51, pByte ); + printf( "VarUI1FromR8: 0.51, %X, %X\n", *pByte, (unsigned int) res ); + res = VarUI1FromR8( 0.49, pByte ); + printf( "VarUI1FromR8: 0.49, %X, %X\n", *pByte, (unsigned int) res ); + + res = VarUI1FromDate( 0.0, pByte ); + printf( "VarUI1FromDate: 0.0, %X, %X\n", *pByte, (unsigned int) res ); + res = VarUI1FromDate( 69.33, pByte ); + printf( "VarUI1FromDate: 69.33, %X, %X\n", *pByte, (unsigned int) res ); + res = VarUI1FromDate( 69.66, pByte ); + printf( "VarUI1FromDate: 69.66, %X, %X\n", *pByte, (unsigned int) res ); + res = VarUI1FromDate( -69.33, pByte ); + printf( "VarUI1FromDate: -69.33, %X, %X\n", *pByte, (unsigned int) res ); + res = VarUI1FromDate( -69.66, pByte ); + printf( "VarUI1FromDate: -69.66, %X, %X\n", *pByte, (unsigned int) res ); + + res = VarUI1FromBool( VARIANT_TRUE, pByte ); + printf( "VarUI1FromBool: VARIANT_TRUE, %X, %X\n", *pByte, (unsigned int) res ); + res = VarUI1FromBool( VARIANT_FALSE, pByte ); + printf( "VarUI1FromBool: VARIANT_FALSE, %X, %X\n", *pByte, (unsigned int) res ); + + for( olePtrIndex = 0; olePtrIndex < nOlePtrs; olePtrIndex ++ ) + { + res = VarUI1FromStr( pOleChar[olePtrIndex], 0, 0, pByte ); + printf( "VarUI1FromStr: %s, %X, %X\n", WtoA(pOleChar[olePtrIndex]), *pByte, (unsigned int) res ); + } + + + /* unsigned short from ... + */ + printf( "\n\n======== Testing VarUI2FromXXX ========\n"); + + res = VarUI2FromI2( -1, &i ); + printf( "VarUI2FromI2: -1, %d, %X\n", i, (unsigned int) res ); + + /* res = VarUI2FromI2( 0, NULL ); + */ + printf( "VarUI2FromI2: passing in NULL as return val makes it crash, %X\n", (unsigned int) res ); + + res = VarUI2FromStr( NULL, 0, 0, pUShort ); + printf( "VarUI2FromStr: passing in NULL as param: %X\n", (unsigned int) res ); + + res = VarUI2FromI2( 0, pUShort ); + printf( "VarUI2FromI2: 0, %u, %X\n", *pUShort, (unsigned int) res ); + res = VarUI2FromI2( 69, pUShort ); + printf( "VarUI2FromI2: 69, %u, %X\n", *pUShort, (unsigned int) res ); + res = VarUI2FromI2( 70, pUShort ); + printf( "VarUI2FromI2: 70, %u, %X\n", *pUShort, (unsigned int) res ); + res = VarUI2FromI2( 128, pUShort ); + printf( "VarUI2FromI2: 128, %u, %X\n", *pUShort, (unsigned int) res ); + res = VarUI2FromI4( 65535, pUShort ); + printf( "VarUI2FromI4: 65535, %u, %X\n", *pUShort, (unsigned int) res ); + res = VarUI2FromI4( 65536, pUShort ); + printf( "VarUI2FromI4: 65536, %u, %X\n", *pUShort, (unsigned int) res ); + res = VarUI2FromI4( 65537, pUShort ); + printf( "VarUI2FromI4: 65537, %u, %X\n", *pUShort, (unsigned int) res ); + + res = VarUI2FromR8( 0.0, pUShort ); + printf( "VarUI2FromR8: 0.0, %u, %X\n", *pUShort, (unsigned int) res ); + res = VarUI2FromR8( 69.33, pUShort ); + printf( "VarUI2FromR8: 69.33, %u, %X\n", *pUShort, (unsigned int) res ); + res = VarUI2FromR8( 69.66, pUShort ); + printf( "VarUI2FromR8: 69.66, %u, %X\n", *pUShort, (unsigned int) res ); + res = VarUI2FromR8( -69.33, pUShort ); + printf( "VarUI2FromR8: -69.33, %u, %X\n", *pUShort, (unsigned int) res ); + res = VarUI2FromR8( -69.66, pUShort ); + printf( "VarUI2FromR8: -69.66, %u, %X\n", *pUShort, (unsigned int) res ); + + res = VarUI2FromR8( -0.5, pUShort ); + printf( "VarUI2FromR8: -0.5, %u, %X\n", *pUShort, (unsigned int) res ); + res = VarUI2FromR8( -0.51, pUShort ); + printf( "VarUI2FromR8: -0.51, %u, %X\n", *pUShort, (unsigned int) res ); + res = VarUI2FromR8( -0.49, pUShort ); + printf( "VarUI2FromR8: -0.49, %u, %X\n", *pUShort, (unsigned int) res ); + + res = VarUI2FromR8( 0.5, pUShort ); + printf( "VarUI2FromR8: 0.5, %u, %X\n", *pUShort, (unsigned int) res ); + res = VarUI2FromR8( 0.51, pUShort ); + printf( "VarUI2FromR8: 0.51, %u, %X\n", *pUShort, (unsigned int) res ); + res = VarUI2FromR8( 0.49, pUShort ); + printf( "VarUI2FromR8: 0.49, %u, %X\n", *pUShort, (unsigned int) res ); + + res = VarUI2FromDate( 0.0, pUShort ); + printf( "VarUI2FromDate: 0.0, %u, %X\n", *pUShort, (unsigned int) res ); + res = VarUI2FromDate( 69.33, pUShort ); + printf( "VarUI2FromDate: 69.33, %u, %X\n", *pUShort, (unsigned int) res ); + res = VarUI2FromDate( 69.66, pUShort ); + printf( "VarUI2FromDate: 69.66, %u, %X\n", *pUShort, (unsigned int) res ); + res = VarUI2FromDate( -69.33, pUShort ); + printf( "VarUI2FromDate: -69.33, %u, %X\n", *pUShort, (unsigned int) res ); + res = VarUI2FromDate( -69.66, pUShort ); + printf( "VarUI2FromDate: -69.66, %u, %X\n", *pUShort, (unsigned int) res ); + + res = VarUI2FromBool( VARIANT_TRUE, pUShort ); + printf( "VarUI2FromBool: VARIANT_TRUE, %u, %X\n", *pUShort, (unsigned int) res ); + res = VarUI2FromBool( VARIANT_FALSE, pUShort ); + printf( "VarUI2FromBool: VARIANT_FALSE, %u, %X\n", *pUShort, (unsigned int) res ); + + for( olePtrIndex = 0; olePtrIndex < nOlePtrs; olePtrIndex ++ ) + { + res = VarUI2FromStr( pOleChar[olePtrIndex], 0, 0, pUShort ); + printf( "VarUI2FromStr: %s, %u, %X\n", WtoA(pOleChar[olePtrIndex]), (int)*pUShort, (unsigned int) res ); + } + + /* unsigned long from ... + */ + printf( "\n\n======== Testing VarUI4FromXXX ========\n"); + + /*res = VarUI4FromI2( 0, NULL ); + */ + printf( "VarUI4FromI2: passing in NULL as return val makes it crash, %X\n", (unsigned int) res ); + + res = VarUI4FromStr( NULL, 0, 0, pULong ); + printf( "VarUI4FromStr: passing in NULL as param: %X\n", (unsigned int) res ); + + res = VarUI4FromI2( 0, pULong ); + printf( "VarUI4FromI2: 0, %lu, %X\n", *pULong, (unsigned int) res ); + res = VarUI4FromI2( 69, pULong ); + printf( "VarUI4FromI2: 69, %lu, %X\n", *pULong, (unsigned int) res ); + res = VarUI4FromI2( 70, pULong ); + printf( "VarUI4FromI2: 70, %lu, %X\n", *pULong, (unsigned int) res ); + res = VarUI4FromI2( 128, pULong ); + printf( "VarUI4FromI2: 128, %lu, %X\n", *pULong, (unsigned int) res ); + res = VarUI4FromI2( 255, pULong ); + printf( "VarUI4FromI2: 255, %lu, %X\n", *pULong, (unsigned int) res ); + res = VarUI4FromR8( 4294967295.0, pULong ); + printf( "VarUI4FromR8: 4294967295, %lu, %X\n", *pULong, (unsigned int) res ); + res = VarUI4FromR8( 4294967296.0, pULong ); + printf( "VarUI4FromR8: 4294967296, %lu, %X\n", *pULong, (unsigned int) res ); + + res = VarUI4FromR8( 0.0, pULong ); + printf( "VarUI4FromR8: 0.0, %lu, %X\n", *pULong, (unsigned int) res ); + res = VarUI4FromR8( 69.33, pULong ); + printf( "VarUI4FromR8: 69.33, %lu, %X\n", *pULong, (unsigned int) res ); + res = VarUI4FromR8( 69.66, pULong ); + printf( "VarUI4FromR8: 69.66, %lu, %X\n", *pULong, (unsigned int) res ); + res = VarUI4FromR8( -69.33, pULong ); + printf( "VarUI4FromR8: -69.33, %lu, %X\n", *pULong, (unsigned int) res ); + res = VarUI4FromR8( -69.66, pULong ); + printf( "VarUI4FromR8: -69.66, %lu, %X\n", *pULong, (unsigned int) res ); + + res = VarUI4FromR8( -0.5, pULong ); + printf( "VarUI4FromR8: -0.5, %lu, %X\n", *pULong, (unsigned int) res ); + res = VarUI4FromR8( -0.51, pULong ); + printf( "VarUI4FromR8: -0.51, %lu, %X\n", *pULong, (unsigned int) res ); + res = VarUI4FromR8( -0.49, pULong ); + printf( "VarUI4FromR8: -0.49, %lu, %X\n", *pULong, (unsigned int) res ); + + res = VarUI4FromR8( 0.5, pULong ); + printf( "VarUI4FromR8: 0.5, %lu, %X\n", *pULong, (unsigned int) res ); + res = VarUI4FromR8( 0.51, pULong ); + printf( "VarUI4FromR8: 0.51, %lu, %X\n", *pULong, (unsigned int) res ); + res = VarUI4FromR8( 0.49, pULong ); + printf( "VarUI4FromR8: 0.49, %lu, %X\n", *pULong, (unsigned int) res ); + + res = VarUI4FromDate( 0.0, pULong ); + printf( "VarUI4FromDate: 0.0, %lu, %X\n", *pULong, (unsigned int) res ); + res = VarUI4FromDate( 69.33, pULong ); + printf( "VarUI4FromDate: 69.33, %lu, %X\n", *pULong, (unsigned int) res ); + res = VarUI4FromDate( 69.66, pULong ); + printf( "VarUI4FromDate: 69.66, %lu, %X\n", *pULong, (unsigned int) res ); + res = VarUI4FromDate( -69.33, pULong ); + printf( "VarUI4FromDate: -69.33, %lu, %X\n", *pULong, (unsigned int) res ); + res = VarUI4FromDate( -69.66, pULong ); + printf( "VarUI4FromDate: -69.66, %lu, %X\n", *pULong, (unsigned int) res ); + + res = VarUI4FromBool( VARIANT_TRUE, pULong ); + printf( "VarUI4FromBool: VARIANT_TRUE, %lu, %X\n", *pULong, (unsigned int) res ); + res = VarUI4FromBool( VARIANT_FALSE, pULong ); + printf( "VarUI4FromBool: VARIANT_FALSE, %lu, %X\n", *pULong, (unsigned int) res ); + + for( olePtrIndex = 0; olePtrIndex < nOlePtrs; olePtrIndex ++ ) + { + res = VarUI4FromStr( pOleChar[olePtrIndex], 0, 0, pULong ); + printf( "VarUI4FromStr: %s, %lu, %X\n", WtoA(pOleChar[olePtrIndex]), *pULong, (unsigned int) res ); + } + + /* CHAR from ... + */ + printf( "\n\n======== Testing VarI1FromXXX ========\n"); + + res = VarI1FromBool( VARIANT_TRUE, pByte ); + printf( "VarI1FromBool: VARIANT_TRUE, %d, %X\n", *pByte, (unsigned int) res ); + + res = VarI1FromBool( VARIANT_TRUE, pChar ); + printf( "VarI1FromBool: VARIANT_TRUE, %d, %X\n", *pChar, (unsigned int) res ); + + res = VarI1FromBool( VARIANT_FALSE, pChar ); + printf( "VarI1FromBool: VARIANT_FALSE, %d, %X\n", *pChar, (unsigned int) res ); + + res = VarI1FromUI1( (unsigned char)32767, pChar ); + printf( "VarI1FromUI1: 32767, %d, %X\n", *pChar, (unsigned int) res ); + res = VarI1FromUI1( (unsigned char)65535, pChar ); + printf( "VarI1FromUI1: 65535, %d, %X\n", *pChar, (unsigned int) res ); + + res = VarI1FromI4( 32767, pChar ); + printf( "VarI1FromI4: 32767, %d, %X\n", *pChar, (unsigned int) res ); + res = VarI1FromI4( 32768, pChar ); + printf( "VarI1FromI4: 32768, %d, %X\n", *pChar, (unsigned int) res ); + res = VarI1FromI4( -32768, pChar ); + printf( "VarI1FromI4: -32768, %d, %X\n", *pChar, (unsigned int) res ); + res = VarI1FromI4( -32769, pChar ); + printf( "VarI1FromI4: -32769, %d, %X\n", *pChar, (unsigned int) res ); + + res = VarI1FromR8( 69.33, pChar ); + printf( "VarI1FromR8: 69.33, %d, %X\n", *pChar, (unsigned int) res ); + res = VarI1FromR8( 69.66, pChar ); + printf( "VarI1FromR8: 69.66, %d, %X\n", *pChar, (unsigned int) res ); + res = VarI1FromR8( -69.33, pChar ); + printf( "VarI1FromR8: -69.33, %d, %X\n", *pChar, (unsigned int) res ); + res = VarI1FromR8( -69.66, pChar ); + printf( "VarI1FromR8: -69.66, %d, %X\n", *pChar, (unsigned int) res ); + + res = VarI1FromDate( -69.66, pChar ); + printf( "VarI1FromDate: -69.66, %d, %X\n", *pChar, (unsigned int) res ); + + for( olePtrIndex = 0; olePtrIndex < nOlePtrs; olePtrIndex ++ ) + { + res = VarI1FromStr( pOleChar[olePtrIndex], 0, 0, pChar ); + printf( "VarI1FromStr: %s, %d, %X\n", WtoA(pOleChar[olePtrIndex]), *pChar, (unsigned int) res ); + } + + /* short from ... + */ + printf( "\n\n======== Testing VarI2FromXXX ========\n"); + + res = VarI2FromUI2( 32767, pShort ); + printf( "VarI2FromUI2: 32767, %d, %X\n", *pShort, (unsigned int) res ); + res = VarI2FromUI2( 65535, pShort ); + printf( "VarI2FromUI2: 65535, %d, %X\n", *pShort, (unsigned int) res ); + + res = VarI2FromI4( 32767, pShort ); + printf( "VarI2FromI4: 32767, %d, %X\n", *pShort, (unsigned int) res ); + res = VarI2FromI4( 32768, pShort ); + printf( "VarI2FromI4: 32768, %d, %X\n", *pShort, (unsigned int) res ); + res = VarI2FromI4( -32768, pShort ); + printf( "VarI2FromI4: -32768, %d, %X\n", *pShort, (unsigned int) res ); + res = VarI2FromI4( -32769, pShort ); + printf( "VarI2FromI4: -32769, %d, %X\n", *pShort, (unsigned int) res ); + + res = VarI2FromR8( 69.33, pShort ); + printf( "VarI2FromR8: 69.33, %d, %X\n", *pShort, (unsigned int) res ); + res = VarI2FromR8( 69.66, pShort ); + printf( "VarI2FromR8: 69.66, %d, %X\n", *pShort, (unsigned int) res ); + res = VarI2FromR8( -69.33, pShort ); + printf( "VarI2FromR8: -69.33, %d, %X\n", *pShort, (unsigned int) res ); + res = VarI2FromR8( -69.66, pShort ); + printf( "VarI2FromR8: -69.66, %d, %X\n", *pShort, (unsigned int) res ); + + res = VarI2FromDate( -69.66, pShort ); + printf( "VarI2FromDate: -69.66, %d, %X\n", *pShort, (unsigned int) res ); + + for( olePtrIndex = 0; olePtrIndex < nOlePtrs; olePtrIndex ++ ) + { + res = VarI2FromStr( pOleChar[olePtrIndex], 0, 0, pShort ); + printf( "VarI2FromStr: %s, %d, %X\n", WtoA(pOleChar[olePtrIndex]), *pShort, (unsigned int) res ); + } + + /* long from ... + */ + printf( "\n\n======== Testing VarI4FromXXX ========\n"); + + res = VarI4FromI2( 3, (long*)pInt ); + printf( "VarIntFromI2: 3, %d, %X\n", *pInt, (unsigned int) res ); + + res = VarI4FromR8( 69.33, pLong ); + printf( "VarI4FromR8: 69.33, %ld, %X\n", *pLong, (unsigned int) res ); + res = VarI4FromR8( 69.66, pLong ); + printf( "VarI4FromR8: 69.66, %ld, %X\n", *pLong, (unsigned int) res ); + res = VarI4FromR8( -69.33, pLong ); + printf( "VarI4FromR8: -69.33, %ld, %X\n", *pLong, (unsigned int) res ); + res = VarI4FromR8( -69.66, pLong ); + printf( "VarI4FromR8: -69.66, %ld, %X\n", *pLong, (unsigned int) res ); + + res = VarI4FromR8( 2147483647.0, pLong ); + printf( "VarI4FromR8: 2147483647.0, %ld, %X\n", *pLong, (unsigned int) res ); + res = VarI4FromR8( 2147483648.0, pLong ); + printf( "VarI4FromR8: 2147483648.0, %ld, %X\n", *pLong, (unsigned int) res ); + res = VarI4FromR8( -2147483647.0, pLong ); + printf( "VarI4FromR8: -2147483647.0, %ld, %X\n", *pLong, (unsigned int) res ); + res = VarI4FromR8( -2147483648.0, pLong ); + printf( "VarI4FromR8: -2147483648.0, %ld, %X\n", *pLong, (unsigned int) res ); + res = VarI4FromR8( -2147483649.0, pLong ); + printf( "VarI4FromR8: -2147483649.0, %ld, %X\n", *pLong, (unsigned int) res ); + + res = VarI4FromDate( -2147483649.0, pLong ); + printf( "VarI4FromDate: -2147483649.0, %ld, %X\n", *pLong, (unsigned int) res ); + + for( olePtrIndex = 0; olePtrIndex < nOlePtrs; olePtrIndex ++ ) + { + res = VarI4FromStr( pOleChar[olePtrIndex], 0, 0, pLong ); + printf( "VarI4FromStr: %s, %ld, %X\n", WtoA(pOleChar[olePtrIndex]), *pLong, (unsigned int) res ); + } + + /* float from ... + */ + printf( "\n\n======== Testing VarR4FromXXX ========\n"); + + res = VarR4FromI4( 16777216, pFloat ); + printf( "VarR4FromI4: 16777216, %f, %X\n", *pFloat, (unsigned int) res ); + res = VarR4FromI4( 16777217, pFloat ); + printf( "VarR4FromI4: 16777217, %f, %X\n", *pFloat, (unsigned int) res ); + res = VarR4FromI4( -16777216, pFloat ); + printf( "VarR4FromI4: -16777216, %f, %X\n", *pFloat, (unsigned int) res ); + res = VarR4FromI4( -16777217, pFloat ); + printf( "VarR4FromI4: -16777217, %f, %X\n", *pFloat, (unsigned int) res ); + + res = VarR4FromR8( 16777216.0, pFloat ); + printf( "VarR4FromR8: 16777216.0, %f, %X\n", *pFloat, (unsigned int) res ); + res = VarR4FromR8( 16777217.0, pFloat ); + printf( "VarR4FromR8: 16777217.0, %f, %X\n", *pFloat, (unsigned int) res ); + res = VarR4FromR8( -16777216.0, pFloat ); + printf( "VarR4FromR8: -16777216.0, %f, %X\n", *pFloat, (unsigned int) res ); + res = VarR4FromR8( -16777217.0, pFloat ); + printf( "VarR4FromR8: -16777217.0, %f, %X\n", *pFloat, (unsigned int) res ); + + res = VarR4FromR8( 16777218e31, pFloat ); + printf( "VarR4FromR8: 16777218e31, %f, %X\n", *pFloat, (unsigned int) res ); + res = VarR4FromR8( 16777218e32, pFloat ); + printf( "VarR4FromR8: 16777218e32, %f, %X\n", *pFloat, (unsigned int) res ); + + res = VarR4FromDate( 16777218e31, pFloat ); + printf( "VarR4FromDate: 16777218e31, %f, %X\n", *pFloat, (unsigned int) res ); + + for( olePtrIndex = 0; olePtrIndex < nOlePtrs; olePtrIndex ++ ) + { + res = VarR4FromStr( pOleChar[olePtrIndex], 0, 0, pFloat ); + printf( "VarR4FromStr: %s, %f, %X\n", WtoA(pOleChar[olePtrIndex]), *pFloat, (unsigned int) res ); + } + + /* double from ... + */ + printf( "\n\n======== Testing VarR8FromXXX ========\n"); + + res = VarR8FromDate( 900719925474099.0, pDouble ); + printf( "VarR8FromDate: 900719925474099.0, %f, %X\n", *pDouble, (unsigned int) res ); + + for( olePtrIndex = 0; olePtrIndex < nOlePtrs; olePtrIndex ++ ) + { + res = VarR8FromStr( pOleChar[olePtrIndex], 0, 0, pDouble ); + printf( "VarR8FromStr: %s, %f, %X\n", WtoA(pOleChar[olePtrIndex]), *pDouble, (unsigned int) res ); + } + + /* date from ... + */ + printf( "\n\n======== Testing VarDateFromXXX ========\n"); + + res = VarDateFromI4( 2958465, pDouble ); + printf( "VarDateFromI4: 2958465, %f, %X\n", *pDouble, (unsigned int) res ); + res = VarDateFromI4( 2958466, pDouble ); + printf( "VarDateFromI4: 2958466, %f, %X\n", *pDouble, (unsigned int) res ); + res = VarDateFromI4( -657434, pDouble ); + printf( "VarDateFromI4: -657434, %f, %X\n", *pDouble, (unsigned int) res ); + res = VarDateFromI4( -657435, pDouble ); + printf( "VarDateFromI4: -657435, %f, %X\n", *pDouble, (unsigned int) res ); + + res = VarDateFromR8( 2958465.9999, pDouble ); + printf( "VarDateFromR8: 2958465.9999, %f, %X\n", *pDouble, (unsigned int) res ); + res = VarDateFromR8( 2958466, pDouble ); + printf( "VarDateFromR8: 2958466, %f, %X\n", *pDouble, (unsigned int) res ); + res = VarDateFromR8( -657434.9999, pDouble ); + printf( "VarDateFromR8: -657434.9999, %f, %X\n", *pDouble, (unsigned int) res ); + res = VarDateFromR8( -657435, pDouble ); + printf( "VarDateFromR8: -657435, %f, %X\n", *pDouble, (unsigned int) res ); + + + res = VarDateFromR8( 0.0, pDouble ); + printf( "VarDateFromR8: 0.0, %f, %X\n", *pDouble, (unsigned int) res ); + res = VarDateFromR8( 1.0, pDouble ); + printf( "VarDateFromR8: 1.0, %f, %X\n", *pDouble, (unsigned int) res ); + res = VarDateFromR8( 2.25, pDouble ); + printf( "VarDateFromR8: 2.25, %f, %X\n", *pDouble, (unsigned int) res ); + res = VarDateFromR8( -2.0, pDouble ); + printf( "VarDateFromR8: -2.0, %f, %X\n", *pDouble, (unsigned int) res ); + + /* Need some parsing function in Linux to emulate this... + * Still in progess. + */ + for( olePtrIndex = 0; olePtrIndex < nOlePtrs; olePtrIndex ++ ) + { + res = VarDateFromStr( pOleChar[olePtrIndex], 0, 0, pDouble ); + printf( "VarDateFromStr: %s, %f, %X\n", WtoA(pOleChar[olePtrIndex]), *pDouble, (unsigned int) res ); + } + + /* bool from ... + */ + printf( "\n\n======== Testing VarBoolFromXXX ========\n"); + + res = VarBoolFromI4( 0, pBool ); + printf( "VarBoolFromI4: 0, %d, %X\n", *pBool, (unsigned int) res ); + res = VarBoolFromI4( 1, pBool ); + printf( "VarBoolFromI4: 1, %d, %X\n", *pBool, (unsigned int) res ); + res = VarBoolFromI4( -1, pBool ); + printf( "VarBoolFromI4: -1, %d, %X\n", *pBool, (unsigned int) res ); + res = VarBoolFromI4( 2, pBool ); + printf( "VarBoolFromI4: 2, %d, %X\n", *pBool, (unsigned int) res ); + + res = VarBoolFromUI1( ' ', pBool ); + printf( "VarBoolFromUI1: ' ', %d, %X\n", *pBool, (unsigned int) res ); + res = VarBoolFromUI1( '\0', pBool ); + printf( "VarBoolFromUI1: '\\0', %d, %X\n", *pBool, (unsigned int) res ); + res = VarBoolFromUI1( 0x0000, pBool ); + printf( "VarBoolFromUI1: 0x0000, %d, %X\n", *pBool, (unsigned int) res ); + res = VarBoolFromUI1( (unsigned char)0xFFF, pBool ); + printf( "VarBoolFromUI1: 0xFFF, %d, %X\n", *pBool, (unsigned int) res ); + res = VarBoolFromUI1( (unsigned char)0xFFFF, pBool ); + printf( "VarBoolFromUI1: 0xFFFF, %d, %X\n", *pBool, (unsigned int) res ); + + res = VarBoolFromR8( 0.0, pBool ); + printf( "VarBoolFromR8: 0.0, %d, %X\n", *pBool, (unsigned int) res ); + res = VarBoolFromR8( 1.1, pBool ); + printf( "VarBoolFromR8: 1.1, %d, %X\n", *pBool, (unsigned int) res ); + res = VarBoolFromR8( 0.5, pBool ); + printf( "VarBoolFromR8: 0.5, %d, %X\n", *pBool, (unsigned int) res ); + res = VarBoolFromR8( 0.49, pBool ); + printf( "VarBoolFromR8: 0.49, %d, %X\n", *pBool, (unsigned int) res ); + res = VarBoolFromR8( 0.51, pBool ); + printf( "VarBoolFromR8: 0.51, %d, %X\n", *pBool, (unsigned int) res ); + res = VarBoolFromR8( -0.5, pBool ); + printf( "VarBoolFromR8: -0.5, %d, %X\n", *pBool, (unsigned int) res ); + res = VarBoolFromR8( -0.49, pBool ); + printf( "VarBoolFromR8: -0.49, %d, %X\n", *pBool, (unsigned int) res ); + res = VarBoolFromR8( -0.51, pBool ); + printf( "VarBoolFromR8: -0.51, %d, %X\n", *pBool, (unsigned int) res ); + + + for( olePtrIndex = 0; olePtrIndex < nOlePtrs; olePtrIndex ++ ) + { + res = VarBoolFromStr( pOleChar[olePtrIndex], 0, 0, pBool ); + printf( "VarBoolFromStr: %s, %d, %X\n", WtoA(pOleChar[olePtrIndex]), *pBool, (unsigned int) res ); + } + + res = VarI1FromBool( VARIANT_TRUE, pByte ); + printf( "VarI1FromBool: VARIANT_TRUE, %d, %X\n", *pByte, (unsigned int) res ); + + res = VarUI2FromI2( -1, &i ); + printf( "VarUI2FromI2: -1, %d, %X\n", i, (unsigned int) res ); + + + /* BSTR from ... + */ + printf( "\n\n======== Testing VarBSTRFromXXX ========\n"); + + /* integers... + */ + res = VarBstrFromI1( -100, 0, 0, &bstr ); + printf( "VarBstrFromI1: -100, %s, %X\n", WtoA( bstr ), (unsigned int) res ); + + res = VarBstrFromUI1( 0x5A, 0, 0, &bstr ); + printf( "VarBstrFromUI1: 0x5A, %s, %X\n", WtoA( bstr ), (unsigned int) res ); + + res = VarBstrFromI4( 2958465, 0, 0, &bstr ); + printf( "VarBstrFromI4: 2958465, %s, %X\n", WtoA( bstr ), (unsigned int) res ); + + /* reals... + */ + d=0; + for( i=0; i<20; i++ ) + { + /* add an integer to the real number + */ + d += ((i%9)+1) * pow( 10, i ); + res = VarBstrFromR8( d, 0, 0, &bstr ); + printf( "VarBstrFromR8: %f, %s, %X\n", d, WtoA( bstr ), (unsigned int) res ); + res = VarBstrFromR8( -d, 0, 0, &bstr ); + printf( "VarBstrFromR8: %f, %s, %X\n", -d, WtoA( bstr ), (unsigned int) res ); + } + d=0; + for( i=0; i<20; i++ ) + { + /* add a decimal to the real number + */ + d += ((i%9)+1) * pow( 10, (i*-1) ); + res = VarBstrFromR8( d, 0, 0, &bstr ); + printf( "VarBstrFromR8: %f, %s, %X\n", d, WtoA( bstr ), (unsigned int) res ); + res = VarBstrFromR8( d-1, 0, 0, &bstr ); + printf( "VarBstrFromR8: %f, %s, %X\n", d-1, WtoA( bstr ), (unsigned int) res ); + res = VarBstrFromR8( -d, 0, 0, &bstr ); + printf( "VarBstrFromR8: %f, %s, %X\n", -d, WtoA( bstr ), (unsigned int) res ); + } + + d=0; + for( i=0; i<20; i++ ) + { + /* add an integer to the real number + */ + d += ((i%9)+1) * pow( 10, i ); + /* add a decimal to the real number + */ + d += ((i%9)+1) * pow( 10, (i*-1) ); + res = VarBstrFromR8( d, 0, 0, &bstr ); + printf( "VarBstrFromR8: %f, %s, %X\n", d, WtoA( bstr ), (unsigned int)res ); + res = VarBstrFromR8( -d, 0, 0, &bstr ); + printf( "VarBstrFromR8: %f, %s, %X\n", -d, WtoA( bstr ), (unsigned int) res ); + } + + + + d=0; + for( i=0; i<10; i++ ) + { + /* add an integer to the real number + */ + d += ((i%9)+1) * pow( 10, i ); + res = VarBstrFromR4( (float)d, 0, 0, &bstr ); + printf( "VarBstrFromR4: %f, %s, %X\n", d, WtoA( bstr ), (unsigned int) res ); + res = VarBstrFromR4( (float)-d, 0, 0, &bstr ); + printf( "VarBstrFromR4: %f, %s, %X\n", -d, WtoA( bstr ), (unsigned int) res ); + } + d=0; + for( i=0; i<10; i++ ) + { + /* add a decimal to the real number + */ + d += ((i%9)+1) * pow( 10, (i*-1) ); + res = VarBstrFromR4( (float)d, 0, 0, &bstr ); + printf( "VarBstrFromR4: %f, %s, %X\n", d, WtoA( bstr ), (unsigned int) res ); + res = VarBstrFromR4( (float)d-1, 0, 0, &bstr ); + printf( "VarBstrFromR4: %f, %s, %X\n", d-1, WtoA( bstr ), (unsigned int) res ); + res = VarBstrFromR4( (float)-d, 0, 0, &bstr ); + printf( "VarBstrFromR4: %f, %s, %X\n", -d, WtoA( bstr ), (unsigned int) res ); + } + + d=0; + for( i=0; i<10; i++ ) + { + /* add an integer to the real number + */ + d += ((i%9)+1) * pow( 10, i ); + /* add a decimal to the real number + */ + d += ((i%9)+1) * pow( 10, (i*-1) ); + res = VarBstrFromR4( (float)d, 0, 0, &bstr ); + printf( "VarBstrFromR4: %f, %s, %X\n", d, WtoA( bstr ), (unsigned int) res ); + res = VarBstrFromR4( (float)-d, 0, 0, &bstr ); + printf( "VarBstrFromR4: %f, %s, %X\n", -d, WtoA( bstr ), (unsigned int) res ); + } + + res = VarBstrFromBool( 0x00, 0, 0, &bstr ); + printf( "VarBstrFromBool: 0x00, %s, %X\n", WtoA( bstr ), (unsigned int) res ); + res = VarBstrFromBool( 0xFF, 0, 0, &bstr ); + printf( "VarBstrFromBool: 0xFF, %s, %X\n", WtoA( bstr ), (unsigned int) res ); + + res = VarBstrFromDate( 0.0, 0, 0, &bstr ); + printf( "VarBstrFromDate: 0.0, %s, %X\n", WtoA( bstr ), (unsigned int) res ); + res = VarBstrFromDate( 3.34, 0, 0, &bstr ); + printf( "VarBstrFromDate: 3.34, %s, %X\n", WtoA( bstr ), (unsigned int) res ); + res = VarBstrFromDate( 3339.34, 0, 0, &bstr ); + printf( "VarBstrFromDate: 3339.34, %s, %X\n", WtoA( bstr ), (unsigned int) res ); + res = VarBstrFromDate( 365.00, 0, 0, &bstr ); + printf( "VarBstrFromDate: 365.00, %s, %X\n", WtoA( bstr ), (unsigned int) res ); + res = VarBstrFromDate( 365.25, 0, 0, &bstr ); + printf( "VarBstrFromDate: 365.25, %s, %X\n", WtoA( bstr ), (unsigned int) res ); + res = VarBstrFromDate( 1461.0, 0, 0, &bstr ); + printf( "VarBstrFromDate: 1461.00, %s, %X\n", WtoA( bstr ), (unsigned int) res ); + res = VarBstrFromDate( 1461.5, 0, 0, &bstr ); + printf( "VarBstrFromDate: 1461.5, %s, %X\n", WtoA( bstr ), (unsigned int) res ); + + + res = VarBstrFromBool( 0x00, 0, 0, &bstr ); + printf( "VarBstrFromBool: 0x00, %s, %X\n", WtoA(bstr), (unsigned int) res ); + res = VarBstrFromBool( 0xFF, 0, 0, &bstr ); + printf( "VarBstrFromBool: 0xFF, %s, %X\n", WtoA(bstr), (unsigned int) res ); + + res = VarBstrFromDate( 0.0, 0, 0, &bstr ); + printf( "VarBstrFromDate: 0.0, %s, %X\n", WtoA(bstr), (unsigned int) res ); + res = VarBstrFromDate( 3.34, 0, 0, &bstr ); + printf( "VarBstrFromDate: 3.34, %s, %X\n", WtoA(bstr), (unsigned int) res ); + + /* Test variant API... + */ + printf( "\n\n======== Testing Hi-Level Variant API ========\n"); + + bstr = SysAllocString( pOleChar[4] ); + + res = VariantClear( &va ); + printf( "Result is: %x\n", (unsigned int)res ); + + VariantInit( &va ); + VariantInit( &vb ); + VariantInit( &vc ); + VariantInit( &vd ); + VariantInit( &ve ); + + va.vt = VT_BSTR; + va.u.bstrVal = bstr; + res = VariantClear( &va ); + printf( "VariantClear: %x\n", (unsigned int)res ); + printf( "VariantClear: %x\n", (unsigned int)res ); + SysFreeString( bstr ); + SysFreeString( bstr ); + + res = VariantCopy( &vb, &va ); + printf( "VariantCopy: %x\n", (unsigned int)res ); + res = VariantClear( &vb ); + printf( "VariantClear: %x\n", (unsigned int)res ); + res = VariantClear( &va ); + printf( "VariantClear: %x\n", (unsigned int)res ); + + + va.vt = VT_R8; + d = 4.123; + va.u.dblVal = d; + res = VariantCopy( &va, &va ); + printf( "VariantCopy %f -> %f: %x\n", V_R8(&va), V_R8(&va), (unsigned int)res ); + + va.vt = VT_R8 | VT_BYREF; + d = 31.123; + va.u.pdblVal = &d; + res = VariantCopyInd( &va, &va ); + printf( "VariantCopyInd %f: %x\n", V_R8(&va), (unsigned int)res ); + + va.vt = VT_R8; + d = 1.123; + va.u.dblVal = d; + res = VariantCopy( &vb, &va ); + printf( "VariantCopy %f -> %f: %x\n", V_R8(&va), V_R8(&vb), (unsigned int)res ); + + va.vt = VT_R8 | VT_BYREF; + d = 123.123; + va.u.pdblVal = &d; + res = VariantCopy( &vb, &va ); + printf( "VariantCopy %f -> %f: %x\n", *(V_R8REF(&va)), *(V_R8REF(&vb)), (unsigned int)res ); + + va.vt = VT_R8 | VT_BYREF; + d = 111.2; + va.u.pdblVal = &d; + res = VariantCopyInd( &vb, &va ); + printf( "VariantCopyInd %f -> %f: %x\n", *(V_R8REF(&va)), V_R8(&vb), (unsigned int)res ); + + va.vt = VT_R8 | VT_BYREF; + d = 1211.123453; + va.u.pdblVal = &d; + res = VariantChangeTypeEx( &va, &va, 0, 0, VT_I2 ); + printf( "VariantChangeTypeEx %d: %x\n", V_I2(&va), (unsigned int) res ); + + va.vt = VT_INT; + va.u.intVal = 4; + res = VariantChangeTypeEx(&vb, &va, 0, 0, VT_BSTR ); + printf( "VariantChangeTypeEx %d -> %s: %x\n", V_INT(&va), WtoA(V_BSTR(&vb)), (unsigned int)res ); + + va.vt = VT_DATE; + va.u.date = 34465.332431; + res = VariantChangeTypeEx(&vb, &va, 0, 0, VT_BSTR ); + printf( "VariantChangeTypeEx %f -> %s: %x\n", V_DATE(&va), WtoA(V_BSTR(&vb)), (unsigned int)res ); + + bstr = pOleChar[4]; + va.vt = VT_BSTR; + va.u.bstrVal = bstr; + res = VariantChangeTypeEx(&vb, &va, 0, 0, VT_R8 ); + printf( "VariantChangeTypeEx %s -> %f: %x\n", WtoA(V_BSTR(&va)), V_R8(&vb), (unsigned int)res ); + + + vc.vt = VT_BSTR | VT_BYREF; + vc.u.pbstrVal = &bstr; + vb.vt = VT_VARIANT | VT_BYREF; + vb.u.pvarVal = &vc; + va.vt = VT_VARIANT | VT_BYREF; + va.u.pvarVal = &vb; + res = VariantCopyInd( &vd, &va ); + printf( "VariantCopyInd: %x\n", (unsigned int)res ); + + /* test what happens when bad vartypes are passed in + */ + printf( "-------------- Testing different VARTYPES ----------------\n" ); + + for( i=0; i<100; i++ ) + { + /* Trying to use variants that are set to be BSTR but + * do not contain a valid pointer makes the program crash + * in Windows so we will skip those. We do not need them + * anyways to illustrate the behavior. + */ + if( i == VT_BSTR ) + i = 77; + + va.vt = i; + d = 4.123; + va.u.dblVal = d; + res = VariantCopyInd( &vb, &va ); + printf( "VariantCopyInd: %d -> %x\n", i, (unsigned int)res ); + + va.vt = i | VT_BYREF; + d = 4.123; + va.u.pdblVal = &d; + res = VariantCopyInd( &vb, &va ); + printf( "VariantCopyInd: %d -> %x\n", i, (unsigned int)res ); + + va.vt = VT_R8; + d = 4.123; + va.u.dblVal = d; + res = VariantChangeTypeEx( &vb, &va, 0, 0, i ); + printf( "VariantChangeTypeEx: %d -> %x\n", i, (unsigned int)res ); + + va.vt = VT_R8; + d = 4.123; + va.u.dblVal = d; + res = VariantChangeTypeEx( &vb, &va, 0, 0, i | VT_BYREF ); + printf( "VariantChangeTypeEx: VT_BYREF %d -> %x\n", i, (unsigned int)res ); + + va.vt = 99; + d = 4.123; + va.u.dblVal = d; + res = VariantClear( &va ); + printf( "VariantClear: %d -> %x\n", i, (unsigned int)res ); + + } + + res = VariantClear( &va ); + printf( "VariantClear: %x\n", (unsigned int)res ); + res = VariantClear( &vb ); + printf( "VariantClear: %x\n", (unsigned int)res ); + res = VariantClear( &vc ); + printf( "VariantClear: %x\n", (unsigned int)res ); + res = VariantClear( &vd ); + printf( "VariantClear: %x\n", (unsigned int)res ); + res = VariantClear( &ve ); + printf( "VariantClear: %x\n", (unsigned int)res ); + + + /* There is alot of memory leaks but this is simply a test program. + */ + + return 0; +} + diff --git a/libtest/vartest.readme b/libtest/vartest.readme new file mode 100644 index 00000000000..5d1c49520e8 --- /dev/null +++ b/libtest/vartest.readme @@ -0,0 +1,21 @@ +The purpose of this program is validate the implementation +of the APIs related to VARIANTs. The validation is done +by comparing the results given by the Windows implementation +versus the Wine implementation. + +This program tests the creation/coercion/destruction of VARIANTs. + +This program was built in both Windows and Wine and the purpose +of this program is to compare the output produced in both +environments. To facilitate that, the log of the output created +by the windows version of this program was added to CVS. + +If you modify this program, it might be wise to rebuild it in +Windows, regenerate that output file and resubmit it to CVS. + +The output of the programs differ slightly from the one generated +in Windows but most of the differences are caused by differences +in the way that printf interprets some escape sequences and the way +floating point numbers are printed. See the notes in vartest.c for +more information. + diff --git a/loader/dos/dosmod.c b/loader/dos/dosmod.c index 75ac48ff587..b53c8fad47c 100644 --- a/loader/dos/dosmod.c +++ b/loader/dos/dosmod.c @@ -56,6 +56,41 @@ static __inline__ int vm86plus( int func, struct vm86plus_struct *ptr ) return -1; } +int XREAD(int fd,void*buf,int size) { + int res; + + while (1) { + res = read(fd, buf, size); + if (res==size) + return res; + if (res==-1) { + if (errno==EINTR) + continue; + perror("dosmod read"); + return -1; + } + fprintf(stderr,"dosmod read only %d of %d bytes.\n",res,size); + return res; + } +} +int XWRITE(int fd,void*buf,int size) { + int res; + + while (1) { + res = write(fd, buf, size); + if (res==size) + return res; + if (res==-1) { + if (errno==EINTR) + continue; + perror("dosmod write"); + return -1; + } + fprintf(stderr,"dosmod write only %d of %d bytes.\n",res,size); + return res; + } +} + void set_timer(struct timeval*tim) { struct itimerval cur; @@ -65,7 +100,15 @@ void set_timer(struct timeval*tim) setitimer(ITIMER_REAL,&cur,NULL); } -volatile int sig_pend,sig_fatal=0; +void get_timer(struct timeval*tim) +{ + struct itimerval cur; + + getitimer(ITIMER_REAL,&cur); + *tim=cur.it_value; +} + +volatile int sig_pend,sig_fatal=0,sig_alrm=0; void*img; struct vm86plus_struct VM86; @@ -84,6 +127,12 @@ void bad_handler(int sig) signal(sig,bad_handler); } +void alarm_handler(int sig) +{ + sig_alrm++; + signal(sig,alarm_handler); +} + int main(int argc,char**argv) { int mfd=open(argv[0],O_RDWR); @@ -121,7 +170,7 @@ int main(int argc,char**argv) signal(SIGINT,sig_handler); signal(SIGUSR1,sig_handler); signal(SIGUSR2,sig_handler); - signal(SIGALRM,sig_handler); + signal(SIGALRM,alarm_handler); signal(SIGQUIT,bad_handler); signal(SIGILL,bad_handler); @@ -135,28 +184,33 @@ int main(int argc,char**argv) #endif /* report back to the main program that we're ready */ ret=1; /* dosmod protocol revision 1 */ - write(1,&ret,sizeof(ret)); + XWRITE(1,&ret,sizeof(ret)); /* context exchange loop */ do { - if (read(0,&func,sizeof(func))!=sizeof(func)) return 1; + if (XREAD(0,&func,sizeof(func))!=sizeof(func)) return 1; if (func<0) break; switch (func) { case DOSMOD_SET_TIMER: - if (read(0,&tim,sizeof(tim))!=sizeof(tim)) return 1; + if (XREAD(0,&tim,sizeof(tim))!=sizeof(tim)) return 1; set_timer(&tim); /* no response */ break; + case DOSMOD_GET_TIMER: + get_timer(&tim); + if (XWRITE(1,&tim,sizeof(tim))!=sizeof(tim)) return 1; + break; case DOSMOD_ENTER: default: - if (read(0,&VM86,sizeof(VM86))!=sizeof(VM86)) return 1; - if (sig_pend) ret=DOSMOD_SIGNAL; else + if (XREAD(0,&VM86,sizeof(VM86))!=sizeof(VM86)) return 1; + if (sig_pend||sig_alrm) ret=DOSMOD_SIGNAL; else ret=vm86plus(func,&VM86); - if (write(1,&ret,sizeof(ret))!=sizeof(ret)) return 1; - if (write(1,&VM86,sizeof(VM86))!=sizeof(VM86)) return 1; + if (XWRITE(1,&ret,sizeof(ret))!=sizeof(ret)) return 1; + if (XWRITE(1,&VM86,sizeof(VM86))!=sizeof(VM86)) return 1; switch (ret&0xff) { case DOSMOD_SIGNAL: ret=sig_pend; sig_pend=0; - if (write(1,&ret,sizeof(ret))!=sizeof(ret)) return 1; + if (!ret) { ret=SIGALRM; sig_alrm--; } + if (XWRITE(1,&ret,sizeof(ret))!=sizeof(ret)) return 1; if (sig_fatal) return 1; break; } diff --git a/loader/dos/dosmod.h b/loader/dos/dosmod.h index 65456206bd9..ee9d9f3c14b 100644 --- a/loader/dos/dosmod.h +++ b/loader/dos/dosmod.h @@ -3,6 +3,7 @@ #define DOSMOD_ENTER 0x01 /* VM86_ENTER */ #define DOSMOD_SET_TIMER 0x10 +#define DOSMOD_GET_TIMER 0x11 #define DOSMOD_SIGNAL 0x00 /* VM86_SIGNAL */ diff --git a/loader/dos/dosvm.c b/loader/dos/dosvm.c index 989b6a950ac..c4933637ced 100644 --- a/loader/dos/dosvm.c +++ b/loader/dos/dosvm.c @@ -295,6 +295,56 @@ int DOSVM_Enter( PCONTEXT context ) return 0; } +void DOSVM_SetTimer( unsigned ticks ) +{ + TDB *pTask = (TDB *)GlobalLock16( GetCurrentTask() ); + NE_MODULE *pModule = NE_GetPtr( pTask->hModule ); + int stat=DOSMOD_SET_TIMER; + struct timeval tim; + + GlobalUnlock16( GetCurrentTask() ); + if (pModule&&pModule->lpDosTask) { + /* the PC clocks ticks at 1193180 Hz */ + tim.tv_sec=0; + tim.tv_usec=((unsigned long long)ticks*1000000)/1193180; + /* sanity check */ + if (!tim.tv_usec) tim.tv_usec=1; + + if (write(pModule->lpDosTask->write_pipe,&stat,sizeof(stat))!=sizeof(stat)) { + ERR(module,"dosmod sync lost, errno=%d\n",errno); + return; + } + if (write(pModule->lpDosTask->write_pipe,&tim,sizeof(tim))!=sizeof(tim)) { + ERR(module,"dosmod sync lost, errno=%d\n",errno); + return; + } + /* there's no return */ + } +} + +unsigned DOSVM_GetTimer( void ) +{ + TDB *pTask = (TDB *)GlobalLock16( GetCurrentTask() ); + NE_MODULE *pModule = NE_GetPtr( pTask->hModule ); + int stat=DOSMOD_GET_TIMER; + struct timeval tim; + + GlobalUnlock16( GetCurrentTask() ); + if (pModule&&pModule->lpDosTask) { + if (write(pModule->lpDosTask->write_pipe,&stat,sizeof(stat))!=sizeof(stat)) { + ERR(module,"dosmod sync lost, errno=%d\n",errno); + return 0; + } + /* read response */ + if (read(pModule->lpDosTask->read_pipe,&tim,sizeof(tim))!=sizeof(tim)) { + ERR(module,"dosmod sync lost, errno=%d\n",errno); + return 0; + } + return ((unsigned long long)tim.tv_usec*1193180)/1000000; + } + return 0; +} + void MZ_Tick( WORD handle ) { /* find the DOS task that has the right system_timer handle... */ @@ -319,5 +369,7 @@ int DOSVM_Enter( PCONTEXT context ) } void MZ_Tick( WORD handle ) {} +void DOSVM_SetTimer( unsigned ticks ) {} +unsigned DOSVM_GetTimer( void ) { return 0; } #endif diff --git a/loader/dos/module.c b/loader/dos/module.c index 64feff45f7c..dc01307d232 100644 --- a/loader/dos/module.c +++ b/loader/dos/module.c @@ -45,8 +45,6 @@ #define SEG16(ptr,seg) ((LPVOID)((BYTE*)ptr+((DWORD)(seg)<<4))) #define SEGPTR16(ptr,segptr) ((LPVOID)((BYTE*)ptr+((DWORD)SELECTOROF(segptr)<<4)+OFFSETOF(segptr))) -extern WORD WINAPI SYSTEM_KillSystemTimer( WORD timer ); - static void MZ_InitPSP( LPVOID lpPSP, LPCSTR cmdline, WORD env ) { PDB*psp=lpPSP; @@ -494,7 +492,7 @@ void MZ_KillModule( LPDOSTASK lpDosTask ) #else /* !MZ_SUPPORTED */ -HINSTANCE16 MZ_CreateProcess( LPCSTR name, LPCSTR cmdline, LPCSTR env, +HINSTANCE16 MZ_CreateProcess( LPCSTR name, LPCSTR cmdline, LPCSTR env, BOOL32 inherit, LPSTARTUPINFO32A startup, LPPROCESS_INFORMATION info ) { WARN(module,"DOS executables not supported on this architecture\n"); diff --git a/loader/main.c b/loader/main.c index 0f48ae3850d..bbbadac37a3 100644 --- a/loader/main.c +++ b/loader/main.c @@ -43,6 +43,7 @@ #include "debug.h" #include "psdrv.h" #include "server.h" +#include "console.h" int __winelib = 1; /* Winelib run-time flag */ @@ -88,6 +89,9 @@ BOOL32 MAIN_MainInit(void) /* Set up text-mode stuff */ CONSOLE_ResizeScreen(80, 25); + /* Read DOS config.sys */ + if (!DOSCONF_ReadConfig()) return FALSE; + return TRUE; } diff --git a/loader/ne/convert.c b/loader/ne/convert.c index ec6975c0b59..0d201e6602f 100644 --- a/loader/ne/convert.c +++ b/loader/ne/convert.c @@ -376,6 +376,28 @@ WORD WINAPI GetMenu32Size( LPVOID menu32 ) } /********************************************************************** + * ConvertAccelerator32To16 + */ +VOID ConvertAccelerator32To16( LPVOID acc32, DWORD size, LPVOID acc16 ) +{ + int type; + + do + { + /* Copy type */ + type = *((BYTE *)acc16)++ = *((BYTE *)acc32)++; + /* Skip padding */ + ((BYTE *)acc32)++; + /* Copy event and IDval */ + *((WORD *)acc16)++ = *((WORD *)acc32)++; + *((WORD *)acc16)++ = *((WORD *)acc32)++; + /* Skip padding */ + ((WORD *)acc32)++; + + } while ( !( type & 0x80 ) ); +} + +/********************************************************************** * NE_LoadPEResource */ HGLOBAL16 NE_LoadPEResource( NE_MODULE *pModule, WORD type, LPVOID bits, DWORD size ) @@ -397,6 +419,10 @@ HGLOBAL16 NE_LoadPEResource( NE_MODULE *pModule, WORD type, LPVOID bits, DWORD s ConvertDialog32To16( bits, size, GlobalLock16( handle ) ); break; + case RT_ACCELERATOR16: + ConvertAccelerator32To16( bits, size, GlobalLock16( handle ) ); + break; + case RT_STRING16: FIXME( resource, "not yet implemented!\n" ); /* fall through */ diff --git a/loader/ne/segment.c b/loader/ne/segment.c index 854cbf347fb..a40ee191b20 100644 --- a/loader/ne/segment.c +++ b/loader/ne/segment.c @@ -148,7 +148,7 @@ BOOL32 NE_LoadSegment( NE_MODULE *pModule, WORD segnum ) */ char* buff = xmalloc(size); char* curr = buff; - ReadFile(hf, mem, size, &res, NULL); + ReadFile(hf, buff, size, &res, NULL); while(curr < buff + size) { unsigned int rept = *((short*) curr)++; unsigned int len = *((short*) curr)++; @@ -800,6 +800,17 @@ DWORD WINAPI NE_AllocateSegment( WORD wFlags, WORD wSize, WORD wElem ) { WORD size = wSize << wElem; HANDLE16 hMem = GlobalAlloc16( NE_Ne2MemFlags(wFlags), size); + + /* not data == code */ + if ( (wFlags & NE_SEGFLAGS_EXECUTEONLY) || + !(wFlags & NE_SEGFLAGS_DATA) + ) { + WORD hSel = GlobalHandleToSel(hMem); + WORD access = SelectorAccessRights(hSel,0,0); + + access |= 2<<2; /* SEGMENT_CODE */ + SelectorAccessRights(hSel,1,access); + } return MAKELONG( hMem, GlobalHandleToSel(hMem) ); } diff --git a/loader/task.c b/loader/task.c index b0aba02d5f6..3f742d2753b 100644 --- a/loader/task.c +++ b/loader/task.c @@ -251,7 +251,6 @@ static void TASK_CallToStart(void) if (pModule->heap_size) LocalInit( pTask->hInstance, 0, pModule->heap_size ); - InitApp( pTask->hModule ); MODULE_InitializeDLLs( PROCESS_Current(), 0, DLL_PROCESS_ATTACH, (LPVOID)-1 ); TRACE(relay, "(entryproc=%p)\n", entry ); diff --git a/memory/virtual.c b/memory/virtual.c index 0950942d911..a387b9b9137 100644 --- a/memory/virtual.c +++ b/memory/virtual.c @@ -1094,9 +1094,16 @@ HANDLE32 WINAPI CreateFileMapping32A( { if (obj->type == K32OBJ_MEM_MAPPED_FILE) { - SetLastError( ERROR_ALREADY_EXISTS ); + req.handle = -1; + CLIENT_SendRequest( REQ_CREATE_MAPPING, -1, 2, + &req, sizeof(req), + name, name ? strlen(name) + 1 : 0 ); + CLIENT_WaitSimpleReply( &reply, sizeof(reply), NULL ); + if (reply.handle == -1) return 0; + if (GetLastError() != ERROR_ALREADY_EXISTS) + return 0; /* not supposed to happen */ handle = HANDLE_Alloc( PROCESS_Current(), obj, - FILE_MAP_ALL_ACCESS /*FIXME*/, inherit, -1 ); + FILE_MAP_ALL_ACCESS /*FIXME*/, inherit, reply.handle ); } else { diff --git a/misc/main.c b/misc/main.c index f148a5b1c42..86a1307a007 100644 --- a/misc/main.c +++ b/misc/main.c @@ -122,7 +122,8 @@ static XrmOptionDescRec optionsTable[] = { "-winver", ".winver", XrmoptionSepArg, (caddr_t)NULL }, { "-config", ".config", XrmoptionSepArg, (caddr_t)NULL }, { "-nodga", ".nodga", XrmoptionNoArg, (caddr_t)"off"}, - { "-console", ".console", XrmoptionSepArg, (caddr_t)NULL } + { "-console", ".console", XrmoptionSepArg, (caddr_t)NULL }, + { "-dosver", ".dosver", XrmoptionSepArg, (caddr_t)NULL } }; #define NB_OPTIONS (sizeof(optionsTable) / sizeof(optionsTable[0])) @@ -154,7 +155,8 @@ static XrmOptionDescRec optionsTable[] = " -privatemap Use a private color map\n" \ " -synchronous Turn on synchronous display mode\n" \ " -version Display the Wine version\n" \ - " -winver Version to imitate (one of win31,win95,nt351,nt40)\n" + " -winver Windows version to imitate (one of win31,win95,nt351,nt40)\n" \ + " -dosver DOS version to imitate (x.xx, e.g. 6.22). Only valid with -winver win31\n" @@ -866,7 +868,20 @@ static void MAIN_ParseOptions( int *argc, char *argv[] ) { /* Hack: store option value in Options to be retrieved */ /* later on inside the emulator code. */ - if (!__winelib) Options.dllFlags = xstrdup((char *)value.addr); + if (!__winelib) + { + if (Options.dllFlags) + { + /* don't overwrite previous value. Should we + * automatically add the ',' between multiple DLLs ? + */ + MSG("Only one -dll flag is allowed. Use ',' between multiple DLLs\n"); + } + else + { + Options.dllFlags = xstrdup((char *)value.addr); + } + } else { MSG("-dll not supported in Winelib\n" ); @@ -875,7 +890,9 @@ static void MAIN_ParseOptions( int *argc, char *argv[] ) } if (MAIN_GetResource( db, ".winver", &value)) - VERSION_ParseVersion( (char*)value.addr ); + VERSION_ParseWinVersion( (char*)value.addr ); + if (MAIN_GetResource( db, ".dosver", &value)) + VERSION_ParseDosVersion( (char*)value.addr ); if (MAIN_GetResource( db, ".config", &value)) Options.configFileName = xstrdup((char *)value.addr); if (MAIN_GetResource( db, ".nodga", &value)) @@ -1041,6 +1058,7 @@ BOOL32 MAIN_WineInit( int *argc, char *argv[] ) /* We need this before calling any Xlib function */ InitializeCriticalSection( &X11DRV_CritSection ); + MakeCriticalSectionGlobal( &X11DRV_CritSection ); TSXrmInitialize(); diff --git a/misc/printdrv.c b/misc/printdrv.c index d53a5f6356e..5cfade5efd6 100644 --- a/misc/printdrv.c +++ b/misc/printdrv.c @@ -742,6 +742,25 @@ BOOL32 WINAPI GetPrinterDriver32W(HANDLE32 hPrinter, LPWSTR pEnvironment, Level,pDriverInfo,cbBuf, pcbNeeded); return FALSE; } +/***************************************************************************** + * AddPrinterDriver32A [WINSPOOL.120] + */ +BOOL32 WINAPI AddPrinterDriver32A(LPSTR printerName,DWORD level, + LPBYTE pDriverInfo) +{ + FIXME(print, "(%s,%ld,%p): stub\n",printerName,level,pDriverInfo); + return FALSE; +} +/***************************************************************************** + * AddPrinterDriver32W [WINSPOOL.121] + */ +BOOL32 WINAPI AddPrinterDriver32W(LPWSTR printerName,DWORD level, + LPBYTE pDriverInfo) +{ + FIXME(print, "(%s,%ld,%p): stub\n",debugstr_w(printerName), + level,pDriverInfo); + return FALSE; +} diff --git a/misc/registry.c b/misc/registry.c index 2f53228ca06..e8f22e26068 100644 --- a/misc/registry.c +++ b/misc/registry.c @@ -831,6 +831,12 @@ static char* _wine_read_USTRING( char *buf, LPWSTR *str ) *ws++=*((unsigned char*)s++); else { s++; + if (!*s) { + /* Dangling \ ... may only happen if a registry + * write was short. FIXME: What do to? + */ + break; + } if (*s=='\\') { *ws++='\\'; s++; diff --git a/misc/shell.c b/misc/shell.c index 530a9b489ea..4947eeb3d44 100644 --- a/misc/shell.c +++ b/misc/shell.c @@ -19,7 +19,6 @@ #include "dlgs.h" #include "win.h" #include "cursoricon.h" -#include "interfaces.h" #include "sysmetrics.h" #include "shlobj.h" #include "debug.h" diff --git a/misc/version.c b/misc/version.c index a865e4c3c99..92d1f15a48a 100644 --- a/misc/version.c +++ b/misc/version.c @@ -1,12 +1,14 @@ /* - * Windows version functions + * Windows and DOS version functions * * Copyright 1997 Alexandre Julliard * Copyright 1997 Marcus Meissner * Copyright 1998 Patrik Stridvall + * Copyright 1998 Andreas Mohr */ #include +#include #include "windows.h" #include "winbase.h" #include "process.h" @@ -24,7 +26,7 @@ typedef struct /* FIXME: compare values below with original and fix */ -static const VERSION_DATA VersionData[NB_WINDOWS_VERSIONS] = +static VERSION_DATA VersionData[NB_WINDOWS_VERSIONS] = { /* WIN31 */ { @@ -64,7 +66,7 @@ static const VERSION_DATA VersionData[NB_WINDOWS_VERSIONS] = } }; -static const char *VersionNames[NB_WINDOWS_VERSIONS] = +static const char *WinVersionNames[NB_WINDOWS_VERSIONS] = { "win31", "win95", @@ -74,20 +76,20 @@ static const char *VersionNames[NB_WINDOWS_VERSIONS] = /* the current version has not been autodetected but forced via cmdline */ static BOOL32 versionForced = FALSE; -static WINDOWS_VERSION defaultVersion = WIN31; +static WINDOWS_VERSION defaultWinVersion = WIN31; /********************************************************************** - * VERSION_ParseVersion + * VERSION_ParseWinVersion */ -void VERSION_ParseVersion( char *arg ) +void VERSION_ParseWinVersion( const char *arg ) { int i; for (i = 0; i < NB_WINDOWS_VERSIONS; i++) { - if (!strcmp( VersionNames[i], arg )) + if (!strcmp( WinVersionNames[i], arg )) { - defaultVersion = (WINDOWS_VERSION)i; + defaultWinVersion = (WINDOWS_VERSION)i; versionForced = TRUE; return; } @@ -95,12 +97,29 @@ void VERSION_ParseVersion( char *arg ) MSG("Invalid winver value '%s' specified.\n", arg ); MSG("Valid versions are:" ); for (i = 0; i < NB_WINDOWS_VERSIONS; i++) - MSG(" '%s'%c", VersionNames[i], + MSG(" '%s'%c", WinVersionNames[i], (i == NB_WINDOWS_VERSIONS - 1) ? '\n' : ',' ); } /********************************************************************** + * VERSION_ParseDosVersion + */ +void VERSION_ParseDosVersion( const char *arg ) +{ + int hi, lo; + if (sscanf( arg, "%d.%d", &hi, &lo ) == 2) + { + VersionData[WIN31].getVersion16 = + MAKELONG(LOWORD(VersionData[WIN31].getVersion16), + (hi<<8) + lo); + } + else + fprintf( stderr, "-dosver: Wrong version format. Use \"-dosver x.xx\"\n"); +} + + +/********************************************************************** * VERSION_GetVersion */ WINDOWS_VERSION VERSION_GetVersion(void) @@ -108,7 +127,7 @@ WINDOWS_VERSION VERSION_GetVersion(void) PIMAGE_NT_HEADERS peheader; if (versionForced) /* user has overridden any sensible checks */ - return defaultVersion; + return defaultWinVersion; if (!PROCESS_Current()->exe_modref) { /* HACK: if we have loaded a PE image into this address space, @@ -135,7 +154,7 @@ WINDOWS_VERSION VERSION_GetVersion(void) ERR(ver,"unknown subsystem version: %04x.%04x, please report.\n", peheader->OptionalHeader.MajorSubsystemVersion, peheader->OptionalHeader.MinorSubsystemVersion ); - return defaultVersion; + return defaultWinVersion; } @@ -348,14 +367,16 @@ UINT32 WINAPI OaBuildVersion() { WINDOWS_VERSION ver = VERSION_GetVersion(); + FIXME(ver, "Please report to a.mohr@mailto.de if you get version error messages !\n"); switch(VersionData[ver].getVersion32) { case 0x80000a03: /* Win 3.1 */ return 0x140fd1; /* from Win32s 1.1e */ case 0xc0000004: /* Win 95 */ - return 0x0a0bd3; + return 0x1e10a9; /* some older version: 0x0a0bd3 */ case 0x04213303: /* NT 3.51 */ - return 0x0; /* FIXME */ + FIXME(ver, "NT 3.51 version value unknown !\n"); + return 0x1e10a9; /* value borrowed from Win95 */ case 0x05650004: /* NT 4.0 */ return 0x141016; default: diff --git a/misc/winsock_dns.c b/misc/winsock_dns.c index 5408c952cc5..801e77c468e 100644 --- a/misc/winsock_dns.c +++ b/misc/winsock_dns.c @@ -30,7 +30,7 @@ #ifdef HAVE_SYS_FILIO_H # include #endif -#ifdef __svr4__ +#ifdef HAVE_SYS_FILE_H # include #endif diff --git a/msdos/Makefile.in b/msdos/Makefile.in index 06d1288f208..db4c25a0e85 100644 --- a/msdos/Makefile.in +++ b/msdos/Makefile.in @@ -7,6 +7,7 @@ MODULE = msdos C_SRCS = \ cdrom.c \ + dosconf.c \ dosmem.c \ dpmi.c \ xms.c \ diff --git a/msdos/cdrom.c b/msdos/cdrom.c index 1881c779e6d..817d430c5b6 100644 --- a/msdos/cdrom.c +++ b/msdos/cdrom.c @@ -24,7 +24,6 @@ #include "msdos.h" #include "miscemu.h" #include "module.h" -/* #define DEBUG_INT */ #include "debug.h" @@ -159,14 +158,18 @@ else io_stru[3]=io_stru[4]=0; io_stru[2]=1; /* supports audio channels (?? FIXME ??) */ io_stru[1]=16; /* data read and plays audio racks */ +#if defined(CDROM_DRIVE_STATUS) && defined(CDS_TRAY_OPEN) io_stru[1]|=(ioctl(fdcd,CDROM_DRIVE_STATUS,0)==CDS_TRAY_OPEN); +#endif TRACE(int," ----> DEVICE STATUS <0x%08lx>\n\n",(DWORD)io_stru[1]); break; case 9: /* media changed ? */ +#ifdef CDROM_MEDIA_CHANGED if (ioctl(fdcd,CDROM_MEDIA_CHANGED,0)) io_stru[1]=0xff; else +#endif io_stru[0]=0; /* FIXME? 1? */ break; diff --git a/msdos/dosconf.c b/msdos/dosconf.c new file mode 100644 index 00000000000..dd447ac4f49 --- /dev/null +++ b/msdos/dosconf.c @@ -0,0 +1,440 @@ +/* + * DOS CONFIG.SYS parser + * + * Copyright 1998 Andreas Mohr + * + */ + +#include +#include +#include +#include +#include +#include "windows.h" +#include "msdos.h" +#include "debug.h" +#include "options.h" +#include "file.h" + + +static int DOSCONF_Device(char **confline); +static int DOSCONF_Dos(char **confline); +static int DOSCONF_Fcbs(char **confline); +static int DOSCONF_Break(char **confline); +static int DOSCONF_Files(char **confline); +static int DOSCONF_Install(char **confline); +static int DOSCONF_Lastdrive(char **confline); +static int DOSCONF_Menu(char **confline); +static int DOSCONF_Include(char **confline); +static int DOSCONF_Country(char **confline); +static int DOSCONF_Numlock(char **confline); +static int DOSCONF_Switches(char **confline); +static int DOSCONF_Shell(char **confline); +static int DOSCONF_Stacks(char **confline); +static int DOSCONF_Buffers(char **confline); +static void DOSCONF_Parse(char *menuname); + +DOSCONF DOSCONF_config = +{ + 'E', /* lastdrive */ + 0, /* brk_flag */ + 8, /* files */ + 9, /* stacks_nr */ + 256, /* stacks_sz */ + 15, /* buf */ + 1, /* buf2 */ + 4, /* fcbs */ + 0, /* flags */ + NULL, /* shell */ + NULL /* country */ +}; + +typedef struct { + const char *tag_name; + int (*tag_handler)(char **p); + void *data; +} TAG_ENTRY; + + +/* + * see + * http://egeria.cm.cf.ac.uk/User/P.L.Poulain/project/internal/allinter.htm + * or + * http://www.csulb.edu/~murdock/dosindex.html + */ + +static const TAG_ENTRY tag_entries[] = +{ + { ";", NULL }, + { "REM ", NULL }, + { "DEVICE", DOSCONF_Device }, + { "[", DOSCONF_Menu }, + { "SUBMENU", NULL }, + { "MENUDEFAULT", DOSCONF_Menu }, + { "INCLUDE", DOSCONF_Include }, + + { "INSTALL", DOSCONF_Install }, + { "DOS", DOSCONF_Dos }, + { "FCBS", DOSCONF_Fcbs }, + { "BREAK", DOSCONF_Break }, + { "FILES", DOSCONF_Files }, + { "SHELL", DOSCONF_Shell }, + { "STACKS", DOSCONF_Stacks }, + { "BUFFERS", DOSCONF_Buffers }, + { "COUNTRY", DOSCONF_Country }, + { "NUMLOCK", DOSCONF_Numlock }, + { "SWITCHES", DOSCONF_Switches }, + { "LASTDRIVE", DOSCONF_Lastdrive } +}; + +static FILE *cfg_fd; + +static char *menu_default = NULL; +static int menu_in_listing = 0; /* we are in the [menu] section */ +static int menu_skip = 0; /* the current menu gets skipped */ + + +static void DOSCONF_skip(char **pconfline) +{ + char *p; + + p = *pconfline; + while ( (*p == ' ') || (*p == '\t') ) p++; + *pconfline = p; +} + +static int DOSCONF_JumpToEntry(char **pconfline, char separator) +{ + char *p; + + p = *pconfline; + while ( (*p != separator) && (*p != '\0') ) p++; + + if (*p != separator) + return 0; + else p++; + + while ( (*p == ' ') || (*p == '\t') ) p++; + *pconfline = p; + return 1; +} + +static int DOSCONF_Device(char **confline) +{ + int loadhigh = 0; + + *confline += 6; /* strlen("DEVICE") */ + if (!(strncasecmp(*confline, "HIGH", 4))) + { + loadhigh = 1; + *confline += 4; + /* FIXME: get DEVICEHIGH parameters if avail ? */ + } + if (!(DOSCONF_JumpToEntry(confline, '='))) return 0; + TRACE(profile, "Loading device '%s'\n", *confline); +#if 0 + DOSMOD_LoadDevice(*confline, loadhigh); +#endif + return 1; +} + +static int DOSCONF_Dos(char **confline) +{ + *confline += 3; /* strlen("DOS") */ + if (!(DOSCONF_JumpToEntry(confline, '='))) return 0; + while (**confline != '\0') + { + if (!(strncasecmp(*confline, "HIGH", 4))) + { + DOSCONF_config.flags |= DOSCONF_MEM_HIGH; + *confline += 4; + } + else + if (!(strncasecmp(*confline, "UMB", 3))) + { + DOSCONF_config.flags |= DOSCONF_MEM_UMB; + *confline += 3; + } + else (*confline)++; + DOSCONF_JumpToEntry(confline, ','); + } + TRACE(profile, "DOSCONF_Dos: HIGH is %d, UMB is %d\n", + (DOSCONF_config.flags & DOSCONF_MEM_HIGH) != 0, (DOSCONF_config.flags & DOSCONF_MEM_UMB) != 0); + return 1; +} + +static int DOSCONF_Fcbs(char **confline) +{ + *confline += 4; /* strlen("FCBS") */ + if (!(DOSCONF_JumpToEntry(confline, '='))) return 0; + DOSCONF_config.fcbs = atoi(*confline); + if (DOSCONF_config.fcbs > 255) + { + MSG("The FCBS value in the config.sys file is too high ! Setting to 255.\n"); + DOSCONF_config.fcbs = 255; + } + TRACE(profile, "DOSCONF_Fcbs returning %d\n", DOSCONF_config.fcbs); + return 1; +} + +static int DOSCONF_Break(char **confline) +{ + *confline += 5; /* strlen("BREAK") */ + if (!(DOSCONF_JumpToEntry(confline, '='))) return 0; + if (!(strcasecmp(*confline, "ON"))) + DOSCONF_config.brk_flag = 1; + TRACE(profile, "BREAK is %d\n", DOSCONF_config.brk_flag); + return 1; +} + +static int DOSCONF_Files(char **confline) +{ + *confline += 5; /* strlen("FILES") */ + if (!(DOSCONF_JumpToEntry(confline, '='))) return 0; + DOSCONF_config.files = atoi(*confline); + if (DOSCONF_config.files > 255) + { + MSG("The FILES value in the config.sys file is too high ! Setting to 255.\n"); + DOSCONF_config.files = 255; + } + if (DOSCONF_config.files < 8) + { + MSG("The FILES value in the config.sys file is too low ! Setting to 8.\n"); + DOSCONF_config.files = 8; + } + TRACE(profile, "DOSCONF_Files returning %d\n", DOSCONF_config.files); + return 1; +} + +static int DOSCONF_Install(char **confline) +{ + int loadhigh = 0; + + *confline += 7; /* strlen("INSTALL") */ + if (!(DOSCONF_JumpToEntry(confline, '='))) return 0; + TRACE(profile, "Installing '%s'\n", *confline); +#if 0 + DOSMOD_Install(*confline, loadhigh); +#endif + return 1; +} + +static int DOSCONF_Lastdrive(char **confline) +{ + *confline += 9; /* strlen("LASTDRIVE") */ + if (!(DOSCONF_JumpToEntry(confline, '='))) return 0; + DOSCONF_config.lastdrive = toupper(**confline); + TRACE(profile, "Lastdrive %c\n", DOSCONF_config.lastdrive); + return 1; +} + +static int DOSCONF_Country(char **confline) +{ + *confline += 7; /* strlen("COUNTRY") */ + if (!(DOSCONF_JumpToEntry(confline, '='))) return 0; + TRACE(profile, "Country '%s'\n", *confline); + if (DOSCONF_config.country == NULL) + DOSCONF_config.country = malloc(strlen(*confline) + 1); + strcpy(DOSCONF_config.country, *confline); + return 1; +} + +static int DOSCONF_Numlock(char **confline) +{ + *confline += 7; /* strlen("NUMLOCK") */ + if (!(DOSCONF_JumpToEntry(confline, '='))) return 0; + if (!(strcasecmp(*confline, "ON"))) + DOSCONF_config.flags |= DOSCONF_NUMLOCK; + TRACE(profile, "NUMLOCK is %d\n", (DOSCONF_config.flags & DOSCONF_NUMLOCK) != 0); + return 1; +} + +static int DOSCONF_Switches(char **confline) +{ + char *p; + + *confline += 8; /* strlen("SWITCHES") */ + if (!(DOSCONF_JumpToEntry(confline, '='))) return 0; + p = strtok(*confline, "/"); + do + { + if ( toupper(*p) == 'K') + DOSCONF_config.flags |= DOSCONF_KEYB_CONV; + } + while ((p = strtok(NULL, "/"))); + TRACE(profile, "'Force conventional keyboard' is %d\n", + (DOSCONF_config.flags & DOSCONF_KEYB_CONV) != 0); + return 1; +} + +static int DOSCONF_Shell(char **confline) +{ + *confline += 5; /* strlen("SHELL") */ + if (!(DOSCONF_JumpToEntry(confline, '='))) return 0; + TRACE(profile, "Shell '%s'\n", *confline); + if (DOSCONF_config.shell == NULL) + DOSCONF_config.shell = malloc(strlen(*confline) + 1); + strcpy(DOSCONF_config.shell, *confline); + return 1; +} + +static int DOSCONF_Stacks(char **confline) +{ + + *confline += 6; /* strlen("STACKS") */ + if (!(DOSCONF_JumpToEntry(confline, '='))) return 0; + DOSCONF_config.stacks_nr = atoi(strtok(*confline, ",")); + DOSCONF_config.stacks_sz = atoi((strtok(NULL, ","))); + TRACE(profile, "%d stacks of size %d\n", + DOSCONF_config.stacks_nr, DOSCONF_config.stacks_sz); + return 1; +} + +static int DOSCONF_Buffers(char **confline) +{ + char *p; + + *confline += 7; /* strlen("BUFFERS") */ + if (!(DOSCONF_JumpToEntry(confline, '='))) return 0; + p = strtok(*confline, ","); + DOSCONF_config.buf = atoi(p); + if ((p = strtok(NULL, ","))) + DOSCONF_config.buf2 = atoi(p); + TRACE(profile, "%d primary buffers, %d secondary buffers\n", + DOSCONF_config.buf, DOSCONF_config.buf2); + return 1; +} + +static int DOSCONF_Menu(char **confline) +{ + if (!(strncasecmp(*confline, "[MENU]", 6))) + menu_in_listing = 1; + else + if ((!(strncasecmp(*confline, "[COMMON]", 8))) + || (!(strncasecmp(*confline, "[WINE]", 6)))) + menu_skip = 0; + else + if (**confline == '[') + { + (*confline)++; + if ((menu_default) + && (!(strncasecmp(*confline, menu_default, strlen(menu_default))))) + { + free(menu_default); + menu_default = NULL; + menu_skip = 0; + } + else + menu_skip = 1; + menu_in_listing = 0; + } + else + if (!(strncasecmp(*confline, "menudefault", 11)) && (menu_in_listing)) + { + if (!(DOSCONF_JumpToEntry(confline, '='))) return 0; + *confline = strtok(*confline, ","); + menu_default = malloc(strlen(*confline) + 1); + strcpy(menu_default, *confline); + } + return 1; +} + +static int DOSCONF_Include(char **confline) +{ + fpos_t oldpos; + char *temp; + + *confline += 7; /* strlen("INCLUDE") */ + if (!(DOSCONF_JumpToEntry(confline, '='))) return 0; + fgetpos(cfg_fd, &oldpos); + fseek(cfg_fd, 0, SEEK_SET); + TRACE(profile, "Including menu '%s'\n", *confline); + temp = malloc(strlen(*confline) + 1); + strcpy(temp, *confline); + DOSCONF_Parse(temp); + free(temp); + fsetpos(cfg_fd, &oldpos); + return 1; +} + +static void DOSCONF_Parse(char *menuname) +{ + char confline[256]; + char *p, *trail; + int i; + + if (menuname != NULL) /* we need to jump to a certain sub menu */ + { + while (fgets(confline, 255, cfg_fd)) + { + p = confline; + DOSCONF_skip(&p); + if (*p == '[') + { + p++; + if (!(trail = strrchr(p, ']'))) + return; + if (!(strncasecmp(p, menuname, (int)trail - (int)p))) + break; + } + } + } + + while (fgets(confline, 255, cfg_fd)) + { + p = confline; + DOSCONF_skip(&p); + + if ((menuname) && (*p == '[')) + /* we were handling a specific sub menu, but now next menu begins */ + break; + + if ((trail = strrchr(confline, '\n'))) + *trail = '\0'; + if ((trail = strrchr(confline, '\r'))) + *trail = '\0'; + if (!(menu_skip)) + { + for (i = 0; i < sizeof(tag_entries) / sizeof(TAG_ENTRY); i++) + if (!(strncasecmp(p, tag_entries[i].tag_name, + strlen(tag_entries[i].tag_name)))) + { + TRACE(profile, "tag '%s'\n", tag_entries[i].tag_name); + if (tag_entries[i].tag_handler != NULL) + tag_entries[i].tag_handler(&p); + break; + } + } + else /* the current menu gets skipped */ + DOSCONF_Menu(&p); + } +} + +int DOSCONF_ReadConfig(void) +{ + char buffer[256]; + DOS_FULL_NAME fullname; + char *filename, *menuname; + int ret = 1; + + PROFILE_GetWineIniString( "wine", "config.sys", "", buffer, sizeof(buffer) ); + filename = strtok(buffer, ","); + menuname = strtok(NULL, ","); + if (!filename) return ret; + + DOSFS_GetFullName(filename, FALSE, &fullname); + if (menuname) menu_default = strdup(menuname); + if ((cfg_fd = fopen(fullname.long_name, "r"))) + { + DOSCONF_Parse(NULL); + fclose(cfg_fd); + } + else + { + MSG("Couldn't open config.sys file given as \"%s\" in" \ + " wine.conf or .winerc, section [wine] !\n", filename); + ret = 0; + } + if (menu_default) free(menu_default); + return ret; +} diff --git a/msdos/int10.c b/msdos/int10.c index c7ac5180450..23d3763e185 100644 --- a/msdos/int10.c +++ b/msdos/int10.c @@ -212,7 +212,7 @@ void WINAPI INT_Int10Handler( CONTEXT *context ) break; case 0x0f: /* GET CURRENT VIDEO MODE */ - TRACE(int10, "Get Current Video Mode (0x0%x)\n", AL_reg(context)); + TRACE(int10, "Get Current Video Mode\n"); /* Note: This should not be a constant value. */ AL_reg(context) = 0x07; /* 80x25 text mode */ AH_reg(context) = 80; /* 80 columns */ @@ -334,8 +334,10 @@ void WINAPI INT_Int10Handler( CONTEXT *context ) switch BL_reg(context) { case 0x10: /* GET EGA INFO */ TRACE(int10, "EGA Info Requested\n"); - BX_reg(context) = 0x0003; - CX_reg(context) = 0x0009; + BH_reg(context) = 0x00; /* Color screen */ + BL_reg(context) = 0x03; /* 256K EGA card */ + CH_reg(context) = 0x00; /* Switch settings?? */ + CL_reg(context) = 0x09; /* EGA+ card */ break; case 0x20: /* ALTERNATE PRTSC */ FIXME(int10, "Install Alternate Print Screen - Not Supported\n"); @@ -374,9 +376,9 @@ void WINAPI INT_Int10Handler( CONTEXT *context ) switch AL_reg(context) { case 0x00: /* GET DISPLAY COMBINATION CODE */ TRACE(int10, "Get Display Combination Code\n"); - /* Why are we saying this? */ - /* Do we need to check if we are in a windows or text app? */ - BX_reg(context) = 0x0008; /* VGA w/ color analog display */ + AL_reg(context) = 0x1a; + BH_reg(context) = 0x08; /* VGA w/ color analog display */ + BL_reg(context) = 0x00; /* No secondary hardware */ break; case 0x01: /* SET DISPLAY COMBINATION CODE */ FIXME(int10, "Set Display Combination Code - Not Supported\n"); diff --git a/msdos/int21.c b/msdos/int21.c index 6f7ca492f56..8315d74dfb9 100644 --- a/msdos/int21.c +++ b/msdos/int21.c @@ -6,7 +6,9 @@ #include #include #include -#include +#ifdef HAVE_SYS_FILE_H +# include +#endif #include #include #include @@ -1100,19 +1102,9 @@ void WINAPI DOS3Call( CONTEXT *context ) switch(AH_reg(context)) { - case 0x00: /* TERMINATE PROGRAM */ - TRACE(int21,"TERMINATE PROGRAM\n"); - ExitProcess( 0 ); - break; - - case 0x01: /* READ CHARACTER FROM STANDARD INPUT, WITH ECHO */ - _lread16(1, (BYTE *)&context->Eax, 1); - break; - case 0x03: /* READ CHARACTER FROM STDAUX */ case 0x04: /* WRITE CHARACTER TO STDAUX */ case 0x05: /* WRITE CHARACTER TO PRINTER */ - case 0x0b: /* GET STDIN STATUS */ case 0x0f: /* OPEN FILE USING FCB */ case 0x10: /* CLOSE FILE USING FCB */ case 0x14: /* SEQUENTIAL READ FROM FCB FILE */ @@ -1129,6 +1121,15 @@ void WINAPI DOS3Call( CONTEXT *context ) INT_BARF( context, 0x21 ); break; + case 0x00: /* TERMINATE PROGRAM */ + TRACE(int21,"TERMINATE PROGRAM\n"); + ExitProcess( 0 ); + break; + + case 0x01: /* READ CHARACTER FROM STANDARD INPUT, WITH ECHO */ + _lread16(1, (BYTE *)&context->Eax, 1); + break; + case 0x02: /* WRITE CHARACTER TO STANDARD OUTPUT */ TRACE(int21, "Write Character to Standard Output\n"); CONSOLE_Write(DL_reg(context), 0, 0, 0); @@ -1176,6 +1177,13 @@ void WINAPI DOS3Call( CONTEXT *context ) break; } + case 0x0b: /* GET STDIN STATUS */ + { + CHAR dummy; + + AL_reg(context) = CONSOLE_CheckForKeystroke(&dummy, &dummy); + } + break; case 0x2e: /* SET VERIFY FLAG */ TRACE(int21,"SET VERIFY FLAG ignored\n"); /* we cannot change the behaviour anyway, so just ignore it */ @@ -1319,17 +1327,28 @@ void WINAPI DOS3Call( CONTEXT *context ) switch (AL_reg(context)) { case 0x00: /* GET CURRENT EXTENDED BREAK STATE */ - TRACE(int21,"GET CURRENT EXTENDED BREAK STATE stub\n"); - DL_reg(context) = 0; + TRACE(int21,"GET CURRENT EXTENDED BREAK STATE\n"); + DL_reg(context) = DOSCONF_config.brk_flag; break; case 0x01: /* SET EXTENDED BREAK STATE */ - TRACE(int21,"SET CURRENT EXTENDED BREAK STATE stub\n"); + TRACE(int21,"SET CURRENT EXTENDED BREAK STATE\n"); + DOSCONF_config.brk_flag = (DL_reg(context) > 0); break; case 0x02: /* GET AND SET EXTENDED CONTROL-BREAK CHECKING STATE*/ - TRACE(int21,"GET AND SET EXTENDED CONTROL-BREAK CHECKING STATE stub\n"); - DL_reg(context) = 0; + TRACE(int21,"GET AND SET EXTENDED CONTROL-BREAK CHECKING STATE\n"); + /* ugly coding in order to stay reentrant */ + if (DL_reg(context)) + { + DL_reg(context) = DOSCONF_config.brk_flag; + DOSCONF_config.brk_flag = 1; + } + else + { + DL_reg(context) = DOSCONF_config.brk_flag; + DOSCONF_config.brk_flag = 0; + } break; case 0x05: /* GET BOOT DRIVE */ diff --git a/msdos/ioports.c b/msdos/ioports.c index 1154c3e8583..d6adf753b2f 100644 --- a/msdos/ioports.c +++ b/msdos/ioports.c @@ -2,6 +2,7 @@ * Emulation of processor ioports. * * Copyright 1995 Morten Welinder + * Copyright 1998 Andreas Mohr, Ove Kaaven */ /* Known problems: @@ -17,9 +18,18 @@ #include #include "windows.h" #include "vga.h" +#include "dosexe.h" #include "options.h" #include "debug.h" +static WORD tmr_8253_countmax[3] = {0xffff, 0x12, 1}; /* [2] needs to be 1 ! */ +/* if byte_toggle is TRUE, then hi byte has already been written */ +static BOOL16 tmr_8253_byte_toggle[3] = {FALSE, FALSE, FALSE}; +static BYTE tmr_8253_ctrlbyte_ch[4] = {0x06, 0x44, 0x86, 0}; +static int dummy_ctr = 0; + +static BYTE parport_8255[4] = {0x4f, 0x20, 0xff, 0xff}; + static BYTE cmosaddress; static BYTE cmosimage[64] = @@ -52,7 +62,7 @@ static char port_permissions[0x10000]; #endif /* DIRECT_IO_ACCESS */ -static void IO_FixCMOSCheckSum() +static void IO_FixCMOSCheckSum(void) { WORD sum = 0; int i; @@ -64,6 +74,26 @@ static void IO_FixCMOSCheckSum() TRACE(int, "calculated hi %02x, lo %02x\n", cmosimage[0x2e], cmosimage[0x2f]); } +static void set_timer_maxval(unsigned timer, unsigned maxval) +{ + switch (timer) { + case 0: /* System timer counter divisor */ + DOSVM_SetTimer(maxval); + break; + case 1: /* RAM refresh */ + FIXME(int, "RAM refresh counter handling not implemented !"); + break; + case 2: /* cassette & speaker */ + /* speaker on ? */ + if (((BYTE)parport_8255[1] & 3) == 3) + { + TRACE(int, "Beep (freq: %d) !\n", 1193180 / maxval ); + Beep(1193180 / maxval, 20); + } + break; + } +} + /********************************************************************** * IO_port_init */ @@ -206,62 +236,99 @@ void IO_port_init() /********************************************************************** * IO_inport + * + * Note: The size argument has to be handled correctly _externally_ + * (as we always return a DWORD) */ -DWORD IO_inport( int port, int count ) +DWORD IO_inport( int port, int size ) { DWORD res = 0; - BYTE b; #ifdef DIRECT_IO_ACCESS - if (do_direct_port_access) + if ((do_direct_port_access) + /* Make sure we have access to the port */ + && (port_permissions[port] & IO_READ)) { - /* Make sure we have access to the whole range */ - int i; - for (i = 0; i < count; i++) - if (!(port_permissions[port+i] & IO_READ)) break; - if (i == count) + iopl(3); + switch(size) { - iopl(3); - switch(count) - { - case 1: res = inb( port ); break; - case 2: res = inw( port ); break; - case 4: res = inl( port ); break; - default: - ERR(int, "invalid count %d\n", count); - } - iopl(0); - return res; + case 1: res = inb( port ); break; + case 2: res = inw( port ); break; + case 4: res = inl( port ); break; + default: + ERR(int, "invalid data size %d\n", size); } + iopl(0); + return res; } #endif - TRACE(int, "%d bytes from port 0x%02x\n", count, port ); + TRACE(int, "%d-byte value from port 0x%02x\n", size, port ); - while (count-- > 0) + switch (port) { - switch (port) + case 0x40: + case 0x41: + case 0x42: + { + BYTE chan = port & 3; + WORD tempval = 0; + + if (chan == 0) /* System timer counter divisor */ + tempval = (WORD)DOSVM_GetTimer(); + else + { /* FIXME: intelligent hardware timer emulation needed */ + dummy_ctr -= 10; + tempval = dummy_ctr; + } + switch (tmr_8253_ctrlbyte_ch[chan] & 0x30) { - case 0x70: - b = cmosaddress; - break; - case 0x71: - b = cmosimage[cmosaddress & 0x3f]; - break; - case 0x200: - case 0x201: - b = 0xff; /* no joystick */ - break; - case 0x3da: - b = VGA_ioport_in( port ); + case 0x00: + break; /* correct ? */ + case 0x10: /* read lo byte */ + res = (BYTE)tempval; break; - default: - WARN( int, "Direct I/O read attempted from port %x\n", port); - b = 0xff; + case 0x30: /* read lo byte, then hi byte */ + tmr_8253_byte_toggle[chan] ^= TRUE; /* toggle */ + if (tmr_8253_byte_toggle[chan] == TRUE) + { + res = (BYTE)tempval; + break; + } + /* else [fall through if read hi byte !] */ + case 0x20: /* read hi byte */ + res = (BYTE)tempval>>8; break; } - port++; - res = (res << 8) | b; + break; + } + case 0x60: + res = (DWORD)parport_8255[0]; + break; + case 0x61: + res = (DWORD)parport_8255[1]; + break; + case 0x62: + res = (DWORD)parport_8255[2]; + break; + case 0x70: + res = (DWORD)cmosaddress; + break; + case 0x71: + res = (DWORD)cmosimage[cmosaddress & 0x3f]; + break; + case 0x200: + case 0x201: + res = 0xffffffff; /* no joystick */ + break; + case 0x3ba: + case 0x3da: + res = (DWORD)VGA_ioport_in( port ); + break; + default: + WARN( int, "Direct I/O read attempted from port %x\n", port); + res = 0xffffffff; + break; } TRACE(int, " returning ( 0x%lx )\n", res ); return res; @@ -271,57 +338,107 @@ DWORD IO_inport( int port, int count ) /********************************************************************** * IO_outport */ -void IO_outport( int port, int count, DWORD value ) +void IO_outport( int port, int size, DWORD value ) { - BYTE b; - - TRACE(int, "IO: 0x%lx (%d bytes) to port 0x%02x\n", - value, count, port ); + TRACE(int, "IO: 0x%lx (%d-byte value) to port 0x%02x\n", + value, size, port ); #ifdef DIRECT_IO_ACCESS - if (do_direct_port_access) + if ((do_direct_port_access) + /* Make sure we have access to the port */ + && (port_permissions[port] & IO_WRITE)) { - /* Make sure we have access to the whole range */ - int i; - for (i = 0; i < count; i++) - if (!(port_permissions[port+i] & IO_WRITE)) break; - if (i == count) + iopl(3); + switch(size) { - iopl(3); - switch(count) - { - case 1: outb( LOBYTE(value), port ); break; - case 2: outw( LOWORD(value), port ); break; - case 4: outl( value, port ); break; - default: - WARN(int, "Invalid count %d\n", count); - } - iopl(0); - return; + case 1: outb( LOBYTE(value), port ); break; + case 2: outw( LOWORD(value), port ); break; + case 4: outl( value, port ); break; + default: + WARN(int, "Invalid data size %d\n", size); } + iopl(0); + return; } #endif - while (count-- > 0) + switch (port) + { + case 0x40: + case 0x41: + case 0x42: { - b = value & 0xff; - value >>= 8; - switch (port) + BYTE chan = port & 3; + WORD oldval = 0; + + if ( ((tmr_8253_ctrlbyte_ch[chan] & 0x30) != 0x30) || +/* we need to get the oldval before any lo/hi byte change has been made */ + (tmr_8253_byte_toggle[chan] == FALSE) ) + oldval = tmr_8253_countmax[chan]; + switch (tmr_8253_ctrlbyte_ch[chan] & 0x30) { - case 0x70: - cmosaddress = b & 0x7f; + case 0x00: + break; /* correct ? */ + case 0x10: /* write lo byte */ + tmr_8253_countmax[chan] = + (tmr_8253_countmax[chan] & 0xff00) | (BYTE)value; break; - case 0x71: - cmosimage[cmosaddress & 0x3f] = b; - break; - case 0x3c8: - case 0x3c9: - VGA_ioport_out( port, b ); - break; - default: - WARN(int, "Direct I/O write attempted to port %x\n", port ); + case 0x30: /* write lo byte, then hi byte */ + tmr_8253_byte_toggle[chan] ^= TRUE; /* toggle */ + if (tmr_8253_byte_toggle[chan] == TRUE) + { + tmr_8253_countmax[chan] = + (tmr_8253_countmax[chan] & 0xff00) | (BYTE)value; + break; + } + /* else [fall through if write hi byte !] */ + case 0x20: /* write hi byte */ + tmr_8253_countmax[chan] = + (tmr_8253_countmax[chan] & 0xff)|((BYTE)value << 8); break; } - port++; + if ( + /* programming finished ? */ + ( ((tmr_8253_ctrlbyte_ch[chan] & 0x30) != 0x30) || + (tmr_8253_byte_toggle[chan] == FALSE) ) + /* update to new value ? */ + && (tmr_8253_countmax[chan] != oldval) + ) + set_timer_maxval(chan, tmr_8253_countmax[chan]); + } + break; + case 0x43: + /* ctrl byte for specific timer channel */ + tmr_8253_ctrlbyte_ch[((BYTE)value & 0xc0) >> 6] = (BYTE)value; + if (((BYTE)value&0xc0)==0xc0) { + FIXME(int,"8254 timer readback not implemented yet\n"); + } else + if (((BYTE)value&3)==0) { + FIXME(int,"timer counter latch not implemented yet\n"); + } + if ((value & 0x30) == 0x30) /* write lo byte, then hi byte */ + tmr_8253_byte_toggle[((BYTE)value & 0xc0) >> 6] = FALSE; /* init */ + break; + case 0x61: + parport_8255[1] = (BYTE)value; + if ((((BYTE)parport_8255[1] & 3) == 3) && (tmr_8253_countmax[2] != 1)) + { + TRACE(int, "Beep (freq: %d) !\n", 1193180 / tmr_8253_countmax[2]); + Beep(1193180 / tmr_8253_countmax[2], 20); + } + break; + case 0x70: + cmosaddress = (BYTE)value & 0x7f; + break; + case 0x71: + cmosimage[cmosaddress & 0x3f] = (BYTE)value; + break; + case 0x3c8: + case 0x3c9: + VGA_ioport_out( port, (BYTE)value ); + break; + default: + WARN(int, "Direct I/O write attempted to port %x\n", port ); + break; } } diff --git a/multimedia/dplay.c b/multimedia/dplay.c index e3a22d7b429..f460f8ad43a 100644 --- a/multimedia/dplay.c +++ b/multimedia/dplay.c @@ -5,13 +5,11 @@ * * */ -#include "interfaces.h" #include "heap.h" #include "winerror.h" #include "debug.h" #include "winnt.h" #include "winreg.h" -#include "compobj.h" #include "dplay.h" #include "thread.h" diff --git a/multimedia/dsound.c b/multimedia/dsound.c index e37a5727937..54bfc818f69 100644 --- a/multimedia/dsound.c +++ b/multimedia/dsound.c @@ -41,9 +41,9 @@ #include /* Insomnia - pow() function */ #include "windows.h" #include "winerror.h" -#include "interfaces.h" #include "multimedia.h" #include "dsound.h" +#include "objbase.h" #include "thread.h" #include "debug.h" #include "xmalloc.h" @@ -2115,7 +2115,8 @@ HRESULT WINAPI DirectSoundCreate(LPGUID lpGUID,LPDIRECTSOUND *ppDS,IUnknown *pUn * DirectSound ClassFactory */ static HRESULT WINAPI -DSCF_QueryInterface(LPCLASSFACTORY this,REFIID riid,LPVOID *ppobj) { +DSCF_QueryInterface(LPUNKNOWN iface,REFIID riid,LPVOID *ppobj) { + ICOM_THIS(IClassFactory,iface); char buf[80]; if (HIWORD(riid)) @@ -2127,18 +2128,21 @@ DSCF_QueryInterface(LPCLASSFACTORY this,REFIID riid,LPVOID *ppobj) { } static ULONG WINAPI -DSCF_AddRef(LPCLASSFACTORY this) { +DSCF_AddRef(LPUNKNOWN iface) { + ICOM_THIS(IClassFactory,iface); return ++(this->ref); } -static ULONG WINAPI DSCF_Release(LPCLASSFACTORY this) { +static ULONG WINAPI DSCF_Release(LPUNKNOWN iface) { + ICOM_THIS(IClassFactory,iface); /* static class, won't be freed */ return --(this->ref); } static HRESULT WINAPI DSCF_CreateInstance( - LPCLASSFACTORY this,LPUNKNOWN pOuter,REFIID riid,LPVOID *ppobj + LPCLASSFACTORY iface,LPUNKNOWN pOuter,REFIID riid,LPVOID *ppobj ) { + ICOM_THIS(IClassFactory,iface); char buf[80]; WINE_StringFromCLSID(riid,buf); @@ -2150,19 +2154,22 @@ static HRESULT WINAPI DSCF_CreateInstance( return E_NOINTERFACE; } -static HRESULT WINAPI DSCF_LockServer(LPCLASSFACTORY this,BOOL32 dolock) { +static HRESULT WINAPI DSCF_LockServer(LPCLASSFACTORY iface,BOOL32 dolock) { + ICOM_THIS(IClassFactory,iface); FIXME(dsound,"(%p)->(%d),stub!\n",this,dolock); return S_OK; } -static IClassFactory_VTable DSCF_VTable = { +static ICOM_VTABLE(IClassFactory) DSCF_VTable = { + { DSCF_QueryInterface, DSCF_AddRef, - DSCF_Release, + DSCF_Release + }, DSCF_CreateInstance, DSCF_LockServer }; -static IClassFactory DSOUND_CF = {&DSCF_VTable, 1 }; +static _IClassFactory DSOUND_CF = {&DSCF_VTable, 1 }; /******************************************************************************* * DllGetClassObject [DSOUND.4] @@ -2197,7 +2204,7 @@ DWORD WINAPI DSOUND_DllGetClassObject(REFCLSID rclsid,REFIID riid,LPVOID *ppv) TRACE(dsound, "(%p,%p,%p)\n", xbuf, buf, ppv); if (!memcmp(riid,&IID_IClassFactory,sizeof(IID_IClassFactory))) { *ppv = (LPVOID)&DSOUND_CF; - DSOUND_CF.lpvtbl->fnAddRef(&DSOUND_CF); + IClassFactory_AddRef(&DSOUND_CF); return S_OK; } FIXME(dsound, "(%p,%p,%p): no interface found.\n", xbuf, buf, ppv); diff --git a/objects/dc.c b/objects/dc.c index 73b303c9127..981d5d3ae85 100644 --- a/objects/dc.c +++ b/objects/dc.c @@ -15,6 +15,7 @@ #include "font.h" #include "winerror.h" #include "x11drv.h" +#include "ts_xlib.h" /*********************************************************************** * DC_Init_DC_INFO diff --git a/objects/font.c b/objects/font.c index 01bc8ffd86a..e98ac8673a9 100644 --- a/objects/font.c +++ b/objects/font.c @@ -756,7 +756,7 @@ DWORD WINAPI GetTextExtent( HDC16 hdc, LPCSTR str, INT16 count ) * * FIXME: Should this have a bug for compatibility? * Original Windows versions of GetTextExtentPoint{A,W} have documented - * bugs. + * bugs (-> MSDN KB q147647.txt). */ BOOL16 WINAPI GetTextExtentPoint16( HDC16 hdc, LPCSTR str, INT16 count, LPSIZE16 size ) diff --git a/ole/compobj.c b/ole/compobj.c index d1264e714d8..a5349947d2e 100644 --- a/ole/compobj.c +++ b/ole/compobj.c @@ -5,50 +5,57 @@ * Copyright 1998 Justin Bradford */ -#define INITGUID - #include "config.h" #ifdef HAVE_UNISTD_H -#include +# include #endif #include #include #include #include -#include +#ifdef HAVE_SYS_FILE_H +# include +#endif #include #include #ifdef HAVE_SYS_SOCKIO_H -#include +# include #endif #ifdef HAVE_NET_IF_H -#include +# include #endif #ifdef HAVE_NETINET_IN_H -#include +# include #endif #include #include #include #include -#include "ole.h" -#include "ole2.h" +#include "windows.h" #include "winerror.h" +#include "ole2.h" #include "debug.h" #include "file.h" -#include "compobj.h" #include "heap.h" #include "ldt.h" -#include "interfaces.h" +#include "winreg.h" + +#define INITGUID + +/* FIXME: we include all the header files containing GUIDs + * so that the corresponding variables get defined. But they + * don't even all belong to the same DLL !!! + */ +#include "objbase.h" +#include "servprov.h" #include "shlobj.h" -#include "oleobj.h" #include "ddraw.h" -#include "dsound.h" -#include "dinput.h" #include "d3d.h" +#include "dinput.h" +#include "dsound.h" #include "dplay.h" -#include "windows.h" +#include "objbase.h" LPMALLOC16 currentMalloc16=NULL; LPMALLOC32 currentMalloc32=NULL; @@ -87,26 +94,59 @@ DWORD WINAPI CoBuildVersion(void) * Set the win16 IMalloc used for memory management */ HRESULT WINAPI CoInitialize16( - LPMALLOC16 lpReserved /* [in] pointer to win16 malloc interface */ + LPVOID lpReserved /* [in] pointer to win16 malloc interface */ ) { - currentMalloc16 = lpReserved; + currentMalloc16 = (LPMALLOC16)lpReserved; return S_OK; } /****************************************************************************** * CoInitialize32 [OLE32.26] + * * Set the win32 IMalloc used for memorymanagement + * + * RETURNS + * S_OK if successful, S_FALSE otherwise, RPC_E_CHANGED_MODE if a previous + * call to CoInitializeEx specified another threading model. + * + * BUGS + * Only the single threaded model is supported. As a result RPC_E_CHANGED_MODE + * is never returned. */ HRESULT WINAPI CoInitialize32( - LPMALLOC32 lpReserved /* [in] pointer to win32 malloc interface */ + LPVOID lpReserved /* [in] pointer to win32 malloc interface */ ) { /* FIXME: there really should be something here that incrememts a refcount * but I'm supposing that it is a real COM object, so I won't bother * creating one here. (Decrement done in CoUnitialize()) */ - currentMalloc32 = lpReserved; + currentMalloc32 = (LPMALLOC32)lpReserved; return S_OK; } +/****************************************************************************** + * CoInitializeEx32 [OLE32.163] + * + * Set the win32 IMalloc used for memory management + * + * RETURNS + * S_OK if successful, S_FALSE otherwise, RPC_E_CHANGED_MODE if a previous + * call to CoInitializeEx specified another threading model. + * + * BUGS + * Only the single threaded model is supported. As a result RPC_E_CHANGED_MODE + * is never returned. + */ +HRESULT WINAPI CoInitializeEx32( + LPVOID lpReserved, /* [in] pointer to win32 malloc interface */ + DWORD dwCoInit /* [in] A value from COINIT specifies the threading model */ +) { + if (dwCoInit!=COINIT_APARTMENTTHREADED) { + FIXME(ole, ":(%p,%x): unsupported flag %x\n", lpReserved, (int)dwCoInit, (int)dwCoInit); + /* Hope for the best and continue anyway */ + } + return CoInitialize32(lpReserved); +} + /*********************************************************************** * CoUnitialize [COMPOBJ.3] * Don't know what it does. @@ -153,7 +193,7 @@ HRESULT WINAPI CoGetMalloc32( /*********************************************************************** * CoCreateStandardMalloc16 [COMPOBJ.71] */ -OLESTATUS WINAPI CoCreateStandardMalloc16(DWORD dwMemContext, +HRESULT WINAPI CoCreateStandardMalloc16(DWORD dwMemContext, LPMALLOC16 *lpMalloc) { /* FIXME: docu says we shouldn't return the same allocator as in @@ -165,25 +205,43 @@ OLESTATUS WINAPI CoCreateStandardMalloc16(DWORD dwMemContext, /****************************************************************************** * CoDisconnectObject [COMPOBJ.15] */ -OLESTATUS WINAPI CoDisconnectObject( LPUNKNOWN lpUnk, DWORD reserved ) +HRESULT WINAPI CoDisconnectObject( LPUNKNOWN lpUnk, DWORD reserved ) { TRACE(ole,"%p %lx\n",lpUnk,reserved); return S_OK; } /*********************************************************************** - * IsEqualGUID [COMPOBJ.18] - * Compares two Unique Identifiers + * IsEqualGUID16 [COMPOBJ.18] + * + * Compares two Unique Identifiers. + * * RETURNS * TRUE if equal */ -BOOL16 WINAPI IsEqualGUID( +BOOL16 WINAPI IsEqualGUID16( GUID* g1, /* [in] unique id 1 */ - GUID* g2 /* [in] unique id 2 */ + GUID* g2 /**/ ) { return !memcmp( g1, g2, sizeof(GUID) ); } +/*********************************************************************** + * IsEqualGUID32 [OLE32.76] + * + * Compares two Unique Identifiers. + * + * RETURNS + * TRUE if equal + */ +BOOL32 WINAPI IsEqualGUID32( + REFGUID rguid1, /* [in] unique id 1 */ + REFGUID rguid2 /* [in] unique id 2 */ + ) +{ + return !memcmp(rguid1,rguid2,sizeof(GUID)); +} + /****************************************************************************** * CLSIDFromString16 [COMPOBJ.20] * Converts a unique identifier from it's string representation into @@ -194,7 +252,7 @@ BOOL16 WINAPI IsEqualGUID( * RETURNS * the converted GUID */ -OLESTATUS WINAPI CLSIDFromString16( +HRESULT WINAPI CLSIDFromString16( LPCOLESTR16 idstr, /* [in] string representation of guid */ CLSID *id /* [out] GUID converted from string */ ) { @@ -262,11 +320,19 @@ OLESTATUS WINAPI CLSIDFromString16( /****************************************************************************** * CoCreateGuid[OLE32.6] + * + * Creates a 128bit GUID. * Implemented according the DCE specification for UUID generation. * Code is based upon uuid library in e2fsprogs by Theodore Ts'o. * Copyright (C) 1996, 1997 Theodore Ts'o. + * + * RETURNS + * + * S_OK if successful. */ -int CoCreateGuid(GUID *pguid) { +HRESULT WINAPI CoCreateGuid( + GUID *pguid /* [out] points to the GUID to initialize */ +) { static char has_init = 0; unsigned char a[6]; static int adjustment = 0; @@ -458,7 +524,7 @@ sizeof((i).ifr_name)+(i).ifr_addr.sa_len) * RETURNS * the converted GUID */ -OLESTATUS WINAPI CLSIDFromString32( +HRESULT WINAPI CLSIDFromString32( LPCOLESTR32 idstr, /* [in] string representation of GUID */ CLSID *id /* [out] GUID represented by above string */ ) { @@ -474,12 +540,11 @@ OLESTATUS WINAPI CLSIDFromString32( * Converts a GUID into the respective string representation. * * NOTES - * Why is this WINAPI? * * RETURNS * the string representation and OLESTATUS */ -OLESTATUS WINAPI WINE_StringFromCLSID( +HRESULT WINE_StringFromCLSID( const CLSID *id, /* [in] GUID to be converted */ LPSTR idstr /* [out] pointer to buffer to contain converted guid */ ) { @@ -519,7 +584,7 @@ OLESTATUS WINAPI WINE_StringFromCLSID( * RETURNS * the string representation and OLESTATUS */ -OLESTATUS WINAPI StringFromCLSID16( +HRESULT WINAPI StringFromCLSID16( const CLSID *id, /* [in] the GUID to be converted */ LPOLESTR16 *idstr /* [out] a pointer to a to-be-allocated segmented pointer pointing to the resulting string */ @@ -538,7 +603,7 @@ OLESTATUS WINAPI StringFromCLSID16( * everything we need. */ if (!WOWCallback16Ex( - (FARPROC16)((LPMALLOC16_VTABLE)PTR_SEG_TO_LIN( + (FARPROC16)((ICOM_VTABLE(IMalloc16)*)PTR_SEG_TO_LIN( ((LPMALLOC16)PTR_SEG_TO_LIN(mllc))->lpvtbl) )->fnAlloc, WCB16_CDECL, @@ -559,7 +624,7 @@ OLESTATUS WINAPI StringFromCLSID16( * RETURNS * the string representation and OLESTATUS */ -OLESTATUS WINAPI StringFromCLSID32( +HRESULT WINAPI StringFromCLSID32( const CLSID *id, /* [in] the GUID to be converted */ LPOLESTR32 *idstr /* [out] a pointer to a to-be-allocated pointer pointing to the resulting string */ ) { @@ -607,7 +672,7 @@ StringFromGUID2(REFGUID id, LPOLESTR32 str, INT32 cmax) * RETURNS * riid associated with the progid */ -OLESTATUS WINAPI CLSIDFromProgID16( +HRESULT WINAPI CLSIDFromProgID16( LPCOLESTR16 progid, /* [in] program id as found in registry */ LPCLSID riid /* [out] associated CLSID */ ) { @@ -638,7 +703,7 @@ OLESTATUS WINAPI CLSIDFromProgID16( * RETURNS * riid associated with the progid */ -OLESTATUS WINAPI CLSIDFromProgID32( +HRESULT WINAPI CLSIDFromProgID32( LPCOLESTR32 progid, /* [in] program id as found in registry */ LPCLSID riid /* [out] associated CLSID */ ) { @@ -649,6 +714,7 @@ OLESTATUS WINAPI CLSIDFromProgID32( return ret; } +/* FIXME: this function is not declared in the WINELIB headers. But where should it go ? */ /*********************************************************************** * LookupETask (COMPOBJ.94) */ @@ -660,6 +726,7 @@ OLESTATUS WINAPI LookupETask(HTASK16 *hTask,LPVOID p) { return 0; } +/* FIXME: this function is not declared in the WINELIB headers. But where should it go ? */ /*********************************************************************** * SetETask (COMPOBJ.95) */ @@ -669,6 +736,7 @@ OLESTATUS WINAPI SetETask(HTASK16 hTask, LPVOID p) { return 0; } +/* FIXME: this function is not declared in the WINELIB headers. But where should it go ? */ /*********************************************************************** * CallObjectInWOW (COMPOBJ.201) */ @@ -682,11 +750,11 @@ OLESTATUS WINAPI CallObjectInWOW(LPVOID p1,LPVOID p2) { * * Don't know where it registers it ... */ -OLESTATUS WINAPI CoRegisterClassObject16( +HRESULT WINAPI CoRegisterClassObject16( REFCLSID rclsid, LPUNKNOWN pUnk, - DWORD dwClsContext, - DWORD flags, + DWORD dwClsContext, /* [in] CLSCTX flags indicating the context in which to run the executable */ + DWORD flags, /* [in] REGCLS flags indicating how connections are made */ LPDWORD lpdwRegister ) { char buf[80]; @@ -704,11 +772,11 @@ OLESTATUS WINAPI CoRegisterClassObject16( * * Don't know where it registers it ... */ -OLESTATUS WINAPI CoRegisterClassObject32( +HRESULT WINAPI CoRegisterClassObject32( REFCLSID rclsid, LPUNKNOWN pUnk, - DWORD dwClsContext, - DWORD flags, + DWORD dwClsContext, /* [in] CLSCTX flags indicating the context in which to run the executable */ + DWORD flags, /* [in] REGCLS flags indicating how connections are made */ LPDWORD lpdwRegister ) { char buf[80]; @@ -799,7 +867,7 @@ HRESULT WINAPI CoGetClassObject(REFCLSID rclsid, DWORD dwClsContext, /****************************************************************************** * CoRegisterMessageFilter16 [COMPOBJ.27] */ -OLESTATUS WINAPI CoRegisterMessageFilter16( +HRESULT WINAPI CoRegisterMessageFilter16( LPMESSAGEFILTER lpMessageFilter, LPMESSAGEFILTER *lplpMessageFilter ) { @@ -837,8 +905,8 @@ HRESULT WINAPI CoCreateInstance( hres = CoGetClassObject(rclsid, dwClsContext, NULL, (const REFIID) &IID_IClassFactory, (LPVOID)&lpclf); if (!SUCCEEDED(hres)) return hres; - hres = lpclf->lpvtbl->fnCreateInstance(lpclf, pUnkOuter, iid, ppv); - lpclf->lpvtbl->fnRelease(lpclf); + hres = IClassFactory_CreateInstance(lpclf, pUnkOuter, iid, ppv); + IClassFactory_Release(lpclf); return hres; #endif } @@ -968,7 +1036,7 @@ VOID WINAPI CoTaskMemFree( /*********************************************************************** * CoLoadLibrary (OLE32.30) */ -HINSTANCE32 WINAPI CoLoadLibrary(LPSTR lpszLibName, BOOL32 bAutoFree) +HINSTANCE32 WINAPI CoLoadLibrary(LPOLESTR16 lpszLibName, BOOL32 bAutoFree) { HINSTANCE32 hLibrary; OpenDll *ptr; diff --git a/ole/ifs.c b/ole/ifs.c index 9e8ebca6d0a..5fb80315181 100644 --- a/ole/ifs.c +++ b/ole/ifs.c @@ -9,24 +9,17 @@ #include #include #include "winerror.h" -#include "ole.h" -#include "ole2.h" #include "ldt.h" #include "heap.h" -#include "compobj.h" -#include "interfaces.h" -#include "shlobj.h" +#include "wine/obj_base.h" +#include "objbase.h" #include "local.h" #include "module.h" #include "debug.h" + /* --- IUnknown implementation */ -typedef struct _IUnknown { - /* IUnknown fields */ - ICOM_VTABLE(IUnknown)* lpvtbl; - DWORD ref; -} _IUnknown; /****************************************************************************** * IUnknown_AddRef [VTABLE:IUNKNOWN.1] @@ -86,30 +79,26 @@ IUnknown_Constructor() { return (LPUNKNOWN)unk; } -/* - * IMalloc - */ -/****************************************************************************** - * IMalloc16_AddRef [COMPOBJ.501] - */ -ULONG WINAPI IMalloc16_AddRef(LPMALLOC16 this) { - TRACE(relay,"(%p)->AddRef()\n",this); - return 1; /* cannot be freed */ -} +/* --- IMalloc16 implementation */ -/****************************************************************************** - * IMalloc16_Release [COMPOBJ.502] + +typedef struct _IMalloc16 { + /* IUnknown fields */ + ICOM_VTABLE(IMalloc16)* lpvtbl; + DWORD ref; + /* IMalloc16 fields */ + /* Gmm, I think one is not enough, we should probably manage a list of + * heaps */ -ULONG WINAPI IMalloc16_Release(LPMALLOC16 this) { - TRACE(relay,"(%p)->Release()\n",this); - return 1; /* cannot be freed */ -} + HGLOBAL16 heap; +} _IMalloc16; /****************************************************************************** * IMalloc16_QueryInterface [COMPOBJ.500] */ -HRESULT WINAPI IMalloc16_QueryInterface(LPMALLOC16 this,REFIID refiid,LPVOID *obj) { +HRESULT WINAPI IMalloc16_fnQueryInterface(LPUNKNOWN iface,REFIID refiid,LPVOID *obj) { + ICOM_THIS(IMalloc16,iface); char xrefiid[50]; WINE_StringFromCLSID((LPCLSID)refiid,xrefiid); @@ -124,9 +113,28 @@ HRESULT WINAPI IMalloc16_QueryInterface(LPMALLOC16 this,REFIID refiid,LPVOID *ob } /****************************************************************************** + * IMalloc16_AddRef [COMPOBJ.501] + */ +ULONG WINAPI IMalloc16_fnAddRef(LPUNKNOWN iface) { + ICOM_THIS(IMalloc16,iface); + TRACE(relay,"(%p)->AddRef()\n",this); + return 1; /* cannot be freed */ +} + +/****************************************************************************** + * IMalloc16_Release [COMPOBJ.502] + */ +ULONG WINAPI IMalloc16_fnRelease(LPUNKNOWN iface) { + ICOM_THIS(IMalloc16,iface); + TRACE(relay,"(%p)->Release()\n",this); + return 1; /* cannot be freed */ +} + +/****************************************************************************** * IMalloc16_Alloc [COMPOBJ.503] */ -LPVOID WINAPI IMalloc16_Alloc(LPMALLOC16 this,DWORD cb) { +LPVOID WINAPI IMalloc16_fnAlloc(IMalloc16* iface,DWORD cb) { + ICOM_THIS(IMalloc16,iface); TRACE(relay,"(%p)->Alloc(%ld)\n",this,cb); return (LPVOID)PTR_SEG_OFF_TO_SEGPTR(this->heap,LOCAL_Alloc(this->heap,0,cb)); } @@ -134,7 +142,8 @@ LPVOID WINAPI IMalloc16_Alloc(LPMALLOC16 this,DWORD cb) { /****************************************************************************** * IMalloc16_Realloc [COMPOBJ.504] */ -LPVOID WINAPI IMalloc16_Realloc(LPMALLOC16 this,LPVOID pv,DWORD cb) { +LPVOID WINAPI IMalloc16_fnRealloc(IMalloc16* iface,LPVOID pv,DWORD cb) { + ICOM_THIS(IMalloc16,iface); TRACE(relay,"(%p)->Realloc(%p,%ld)\n",this,pv,cb); return (LPVOID)PTR_SEG_OFF_TO_SEGPTR(this->heap,LOCAL_ReAlloc(this->heap,0,LOWORD(pv),cb)); } @@ -142,7 +151,8 @@ LPVOID WINAPI IMalloc16_Realloc(LPMALLOC16 this,LPVOID pv,DWORD cb) { /****************************************************************************** * IMalloc16_Free [COMPOBJ.505] */ -VOID WINAPI IMalloc16_Free(LPMALLOC16 this,LPVOID pv) { +VOID WINAPI IMalloc16_fnFree(IMalloc16* iface,LPVOID pv) { + ICOM_THIS(IMalloc16,iface); TRACE(relay,"(%p)->Free(%p)\n",this,pv); LOCAL_Free(this->heap,LOWORD(pv)); } @@ -150,7 +160,8 @@ VOID WINAPI IMalloc16_Free(LPMALLOC16 this,LPVOID pv) { /****************************************************************************** * IMalloc16_GetSize [COMPOBJ.506] */ -DWORD WINAPI IMalloc16_GetSize(LPMALLOC16 this,LPVOID pv) { +DWORD WINAPI IMalloc16_fnGetSize(const IMalloc16* iface,LPVOID pv) { + ICOM_CTHIS(IMalloc16,iface); TRACE(relay,"(%p)->GetSize(%p)\n",this,pv); return LOCAL_Size(this->heap,LOWORD(pv)); } @@ -158,7 +169,8 @@ DWORD WINAPI IMalloc16_GetSize(LPMALLOC16 this,LPVOID pv) { /****************************************************************************** * IMalloc16_DidAlloc [COMPOBJ.507] */ -INT16 WINAPI IMalloc16_DidAlloc(LPMALLOC16 this,LPVOID pv) { +INT16 WINAPI IMalloc16_fnDidAlloc(const IMalloc16* iface,LPVOID pv) { + ICOM_CTHIS(IMalloc16,iface); TRACE(relay,"(%p)->DidAlloc(%p)\n",this,pv); return (INT16)-1; } @@ -166,52 +178,40 @@ INT16 WINAPI IMalloc16_DidAlloc(LPMALLOC16 this,LPVOID pv) { /****************************************************************************** * IMalloc16_HeapMinimize [COMPOBJ.508] */ -LPVOID WINAPI IMalloc16_HeapMinimize(LPMALLOC16 this) { +LPVOID WINAPI IMalloc16_fnHeapMinimize(IMalloc16* iface) { + ICOM_THIS(IMalloc16,iface); TRACE(relay,"(%p)->HeapMinimize()\n",this); return NULL; } -#ifdef OLD_TABLE -/* FIXME: This is unused */ -static IMalloc16_VTable mvt16 = { - IMalloc16_QueryInterface, - IMalloc16_AddRef, - IMalloc16_Release, - IMalloc16_Alloc, - IMalloc16_Realloc, - IMalloc16_Free, - IMalloc16_GetSize, - IMalloc16_DidAlloc, - IMalloc16_HeapMinimize, -}; -#endif -static IMalloc16_VTable *msegvt16 = NULL; +static ICOM_VTABLE(IMalloc16)* msegvt16 = NULL; /****************************************************************************** * IMalloc16_Constructor [VTABLE] */ LPMALLOC16 IMalloc16_Constructor() { - LPMALLOC16 this; + _IMalloc16* this; HMODULE16 hcomp = GetModuleHandle16("COMPOBJ"); - this = (LPMALLOC16)SEGPTR_NEW(IMalloc16); + this = (_IMalloc16*)SEGPTR_NEW(_IMalloc16); if (!msegvt16) { - this->lpvtbl = msegvt16 = SEGPTR_NEW(IMalloc16_VTable); - -#define FN(x) this->lpvtbl->fn##x = (void*)WIN32_GetProcAddress16(hcomp,"IMalloc16_"#x);assert(this->lpvtbl->fn##x) - FN(QueryInterface); - FN(AddRef); - FN(Release); - FN(Alloc); - FN(Realloc); - FN(Free); - FN(GetSize); - FN(DidAlloc); - FN(HeapMinimize); - msegvt16 = (LPMALLOC16_VTABLE)SEGPTR_GET(msegvt16); -#undef FN - this->lpvtbl = msegvt16; + this->lpvtbl = msegvt16 = SEGPTR_NEW(ICOM_VTABLE(IMalloc16)); + +#define VTENT(x) msegvt16->bvt.fn##x = (void*)WIN32_GetProcAddress16(hcomp,"IMalloc16_"#x);assert(msegvt16->bvt.fn##x) + VTENT(QueryInterface); + VTENT(AddRef); + VTENT(Release); +#undef VTENT +#define VTENT(x) msegvt16->fn##x = (void*)WIN32_GetProcAddress16(hcomp,"IMalloc16_"#x);assert(msegvt16->fn##x) + VTENT(Alloc); + VTENT(Realloc); + VTENT(Free); + VTENT(GetSize); + VTENT(DidAlloc); + VTENT(HeapMinimize); + msegvt16 = (ICOM_VTABLE(IMalloc16)*)SEGPTR_GET(msegvt16); +#undef VTENT } this->ref = 1; /* FIXME: implement multiple heaps */ @@ -220,30 +220,20 @@ IMalloc16_Constructor() { return (LPMALLOC16)SEGPTR_GET(this); } -/* - * IMalloc32 - */ -/****************************************************************************** - * IMalloc32_AddRef [VTABLE] - */ -static ULONG WINAPI IMalloc32_AddRef(LPMALLOC32 this) { - TRACE(relay,"(%p)->AddRef()\n",this); - return 1; /* cannot be freed */ -} +/* --- IMalloc32 implementation */ -/****************************************************************************** - * IMalloc32_Release [VTABLE] - */ -static ULONG WINAPI IMalloc32_Release(LPMALLOC32 this) { - TRACE(relay,"(%p)->Release()\n",this); - return 1; /* cannot be freed */ -} +typedef struct _IMalloc32 { + /* IUnknown fields */ + ICOM_VTABLE(IMalloc32)* lpvtbl; + DWORD ref; +} _IMalloc32; /****************************************************************************** * IMalloc32_QueryInterface [VTABLE] */ -static HRESULT WINAPI IMalloc32_QueryInterface(LPMALLOC32 this,REFIID refiid,LPVOID *obj) { +static HRESULT WINAPI IMalloc32_fnQueryInterface(LPUNKNOWN iface,REFIID refiid,LPVOID *obj) { + ICOM_THIS(IMalloc32,iface); char xrefiid[50]; WINE_StringFromCLSID((LPCLSID)refiid,xrefiid); @@ -252,15 +242,34 @@ static HRESULT WINAPI IMalloc32_QueryInterface(LPMALLOC32 this,REFIID refiid,LPV !memcmp(&IID_IMalloc,refiid,sizeof(IID_IMalloc)) ) { *obj = this; - return 0; + return S_OK; } return OLE_E_ENUM_NOMORE; } /****************************************************************************** + * IMalloc32_AddRef [VTABLE] + */ +static ULONG WINAPI IMalloc32_fnAddRef(LPUNKNOWN iface) { + ICOM_THIS(IMalloc32,iface); + TRACE(relay,"(%p)->AddRef()\n",this); + return 1; /* cannot be freed */ +} + +/****************************************************************************** + * IMalloc32_Release [VTABLE] + */ +static ULONG WINAPI IMalloc32_fnRelease(LPUNKNOWN iface) { + ICOM_THIS(IMalloc32,iface); + TRACE(relay,"(%p)->Release()\n",this); + return 1; /* cannot be freed */ +} + +/****************************************************************************** * IMalloc32_Alloc [VTABLE] */ -static LPVOID WINAPI IMalloc32_Alloc(LPMALLOC32 this,DWORD cb) { +static LPVOID WINAPI IMalloc32_fnAlloc(LPMALLOC32 iface,DWORD cb) { + ICOM_THIS(IMalloc32,iface); TRACE(relay,"(%p)->Alloc(%ld)\n",this,cb); return HeapAlloc(GetProcessHeap(),0,cb); } @@ -268,7 +277,8 @@ static LPVOID WINAPI IMalloc32_Alloc(LPMALLOC32 this,DWORD cb) { /****************************************************************************** * IMalloc32_Realloc [VTABLE] */ -static LPVOID WINAPI IMalloc32_Realloc(LPMALLOC32 this,LPVOID pv,DWORD cb) { +static LPVOID WINAPI IMalloc32_fnRealloc(LPMALLOC32 iface,LPVOID pv,DWORD cb) { + ICOM_THIS(IMalloc32,iface); TRACE(relay,"(%p)->Realloc(%p,%ld)\n",this,pv,cb); return HeapReAlloc(GetProcessHeap(),0,pv,cb); } @@ -276,7 +286,8 @@ static LPVOID WINAPI IMalloc32_Realloc(LPMALLOC32 this,LPVOID pv,DWORD cb) { /****************************************************************************** * IMalloc32_Free [VTABLE] */ -static VOID WINAPI IMalloc32_Free(LPMALLOC32 this,LPVOID pv) { +static VOID WINAPI IMalloc32_fnFree(LPMALLOC32 iface,LPVOID pv) { + ICOM_THIS(IMalloc32,iface); TRACE(relay,"(%p)->Free(%p)\n",this,pv); HeapFree(GetProcessHeap(),0,pv); } @@ -284,7 +295,8 @@ static VOID WINAPI IMalloc32_Free(LPMALLOC32 this,LPVOID pv) { /****************************************************************************** * IMalloc32_GetSize [VTABLE] */ -static DWORD WINAPI IMalloc32_GetSize(LPMALLOC32 this,LPVOID pv) { +static DWORD WINAPI IMalloc32_fnGetSize(const IMalloc32* iface,LPVOID pv) { + ICOM_CTHIS(IMalloc32,iface); TRACE(relay,"(%p)->GetSize(%p)\n",this,pv); return HeapSize(GetProcessHeap(),0,pv); } @@ -292,7 +304,8 @@ static DWORD WINAPI IMalloc32_GetSize(LPMALLOC32 this,LPVOID pv) { /****************************************************************************** * IMalloc32_DidAlloc [VTABLE] */ -static INT32 WINAPI IMalloc32_DidAlloc(LPMALLOC32 this,LPVOID pv) { +static INT32 WINAPI IMalloc32_fnDidAlloc(const IMalloc32* iface,LPVOID pv) { + ICOM_CTHIS(IMalloc32,iface); TRACE(relay,"(%p)->DidAlloc(%p)\n",this,pv); return -1; } @@ -300,21 +313,24 @@ static INT32 WINAPI IMalloc32_DidAlloc(LPMALLOC32 this,LPVOID pv) { /****************************************************************************** * IMalloc32_HeapMinimize [VTABLE] */ -static LPVOID WINAPI IMalloc32_HeapMinimize(LPMALLOC32 this) { +static LPVOID WINAPI IMalloc32_fnHeapMinimize(LPMALLOC32 iface) { + ICOM_THIS(IMalloc32,iface); TRACE(relay,"(%p)->HeapMinimize()\n",this); return NULL; } -static IMalloc32_VTable VT_IMalloc32 = { - IMalloc32_QueryInterface, - IMalloc32_AddRef, - IMalloc32_Release, - IMalloc32_Alloc, - IMalloc32_Realloc, - IMalloc32_Free, - IMalloc32_GetSize, - IMalloc32_DidAlloc, - IMalloc32_HeapMinimize, +static ICOM_VTABLE(IMalloc32) VT_IMalloc32 = { + { + IMalloc32_fnQueryInterface, + IMalloc32_fnAddRef, + IMalloc32_fnRelease + }, + IMalloc32_fnAlloc, + IMalloc32_fnRealloc, + IMalloc32_fnFree, + IMalloc32_fnGetSize, + IMalloc32_fnDidAlloc, + IMalloc32_fnHeapMinimize }; /****************************************************************************** @@ -322,12 +338,12 @@ static IMalloc32_VTable VT_IMalloc32 = { */ LPMALLOC32 IMalloc32_Constructor() { - LPMALLOC32 this; + _IMalloc32* this; - this = (LPMALLOC32)HeapAlloc(GetProcessHeap(),0,sizeof(IMalloc32)); + this = (_IMalloc32*)HeapAlloc(GetProcessHeap(),0,sizeof(_IMalloc32)); this->lpvtbl = &VT_IMalloc32; this->ref = 1; - return this; + return (LPMALLOC32)this; } /**************************************************************************** diff --git a/ole/moniker.c b/ole/moniker.c index 7c1d88aa778..9bc2171e640 100644 --- a/ole/moniker.c +++ b/ole/moniker.c @@ -9,16 +9,9 @@ #include #include #include "winerror.h" -#include "ole.h" -#include "ole2.h" -#include "ldt.h" -#include "heap.h" -#include "compobj.h" -#include "interfaces.h" -#include "storage.h" -#include "shlobj.h" -#include "local.h" -#include "module.h" +#include "wine/obj_base.h" +#include "wine/obj_storage.h" +#include "wine/obj_moniker.h" #include "debug.h" /****************************************************************************** diff --git a/ole/ole2.c b/ole/ole2.c index d0a4706338d..b472ab34412 100644 --- a/ole/ole2.c +++ b/ole/ole2.c @@ -9,7 +9,10 @@ #include "ole2.h" #include "process.h" #include "debug.h" -#include "compobj.h" +#include "wine/obj_base.h" +#include "wine/obj_clientserver.h" +#include "wine/obj_storage.h" +#include "wine/obj_moniker.h" /****************************************************************************** * OleBuildVersion [OLE2.1] diff --git a/ole/ole2disp.c b/ole/ole2disp.c index 2582b4409a6..dea2df11272 100644 --- a/ole/ole2disp.c +++ b/ole/ole2disp.c @@ -9,7 +9,9 @@ #include "ole.h" #include "ole2.h" #include "oleauto.h" -#include "interfaces.h" +#include "wtypes.h" +#include "wine/obj_base.h" +#include "objbase.h" #include "heap.h" #include "ldt.h" #include "debug.h" diff --git a/ole/oledlg.c b/ole/oledlg.c index 8b010f2bcc1..8aef25b1c10 100644 --- a/ole/oledlg.c +++ b/ole/oledlg.c @@ -9,7 +9,7 @@ #include "winerror.h" #include "ole.h" #include "oledlg.h" -#include "compobj.h" +#include "wine/obj_base.h" #include "debug.h" /*********************************************************************** diff --git a/ole/oleobj.c b/ole/oleobj.c index b7802c7a940..cc4427d6641 100644 --- a/ole/oleobj.c +++ b/ole/oleobj.c @@ -8,10 +8,13 @@ #include "ole.h" #include "ole2.h" #include "winerror.h" -#include "interfaces.h" +#include "windows.h" +#include "wine/obj_base.h" +#include "wine/obj_storage.h" +#include "wine/obj_moniker.h" +#include "wine/obj_dataobject.h" #include "oleobj.h" #include "debug.h" -#include "windows.h" #define IsEqualGUID(rguid1, rguid2) (!memcmp(rguid1, rguid2, sizeof(GUID))) diff --git a/ole/storage.c b/ole/storage.c index 1e9de4c645a..736449ba3c3 100644 --- a/ole/storage.c +++ b/ole/storage.c @@ -14,15 +14,46 @@ #include "winerror.h" #include "file.h" #include "ole.h" -#include "ole2.h" -#include "compobj.h" -#include "interfaces.h" -#include "storage.h" +#include "wine/obj_base.h" +#include "wine/obj_storage.h" +#include "objbase.h" #include "heap.h" #include "module.h" #include "ldt.h" #include "debug.h" +struct storage_header { + BYTE magic[8]; /* 00: magic */ + BYTE unknown1[36]; /* 08: unknown */ + DWORD num_of_bbd_blocks;/* 2C: length of big datablocks */ + DWORD root_startblock;/* 30: root storage first big block */ + DWORD unknown2[2]; /* 34: unknown */ + DWORD sbd_startblock; /* 3C: small block depot first big block */ + DWORD unknown3[3]; /* 40: unknown */ + DWORD bbd_list[109]; /* 4C: big data block list (up to end of sector)*/ +}; +struct storage_pps_entry { + WCHAR pps_rawname[32];/* 00: \0 terminated widechar name */ + WORD pps_sizeofname; /* 40: namelength in bytes */ + BYTE pps_type; /* 42: flags, 1 storage/dir, 2 stream, 5 root */ + BYTE pps_unknown0; /* 43: unknown */ + DWORD pps_prev; /* 44: previous pps */ + DWORD pps_next; /* 48: next pps */ + DWORD pps_dir; /* 4C: directory pps */ + GUID pps_guid; /* 50: class ID */ + DWORD pps_unknown1; /* 60: unknown */ + FILETIME pps_ft1; /* 64: filetime1 */ + FILETIME pps_ft2; /* 70: filetime2 */ + DWORD pps_sb; /* 74: data startblock */ + DWORD pps_size; /* 78: datalength. (<0x1000)?small:big blocks*/ + DWORD pps_unknown2; /* 7C: unknown */ +}; + +#define STORAGE_CHAINENTRY_FAT 0xfffffffd +#define STORAGE_CHAINENTRY_ENDOFCHAIN 0xfffffffe +#define STORAGE_CHAINENTRY_FREE 0xffffffff + + static const BYTE STORAGE_magic[8] ={0xd0,0xcf,0x11,0xe0,0xa1,0xb1,0x1a,0xe1}; static const BYTE STORAGE_notmagic[8]={0x0e,0x11,0xfc,0x0d,0xd0,0xcf,0x11,0xe0}; static const BYTE STORAGE_oldmagic[8]={0xd0,0xcf,0x11,0xe0,0x0e,0x11,0xfc,0x0d}; @@ -732,14 +763,14 @@ HRESULT WINAPI IStream16_fnSeek( if (this->offset.LowPart>this->stde.pps_size) this->offset.LowPart=this->stde.pps_size; if (newpos) *newpos = this->offset; - return OLE_OK; + return S_OK; } /****************************************************************************** * IStream16_Read [STORAGE.521] */ HRESULT WINAPI IStream16_fnRead( - LPSTREAM16 iface,void *pv,ULONG cb,ULONG *pcbRead + LPSEQUENTIALSTREAM iface,void *pv,ULONG cb,ULONG *pcbRead ) { ICOM_THIS(IStream16,iface); BYTE block[BIGSIZE]; @@ -793,14 +824,14 @@ HRESULT WINAPI IStream16_fnRead( blocknr=STORAGE_get_next_big_blocknr(this->hf,blocknr); } } - return OLE_OK; + return S_OK; } /****************************************************************************** * IStream16_Write [STORAGE.522] */ HRESULT WINAPI IStream16_fnWrite( - LPSTREAM16 iface,const void *pv,ULONG cb,ULONG *pcbWrite + LPSEQUENTIALSTREAM iface,const void *pv,ULONG cb,ULONG *pcbWrite ) { ICOM_THIS(IStream16,iface); BYTE block[BIGSIZE]; @@ -1055,7 +1086,7 @@ HRESULT WINAPI IStream16_fnWrite( blocknr = STORAGE_get_next_big_blocknr(hf,blocknr); } } - return OLE_OK; + return S_OK; } /****************************************************************************** @@ -1064,50 +1095,54 @@ HRESULT WINAPI IStream16_fnWrite( static void _create_istream16(LPSTREAM16 *str) { _IStream16* lpst; - if (!strvt16.bvt.fnQueryInterface) { + if (!strvt16.bvt.bvt.fnQueryInterface) { HMODULE16 wp = GetModuleHandle16("STORAGE"); if (wp>=32) { /* FIXME: what is this WIN32_GetProcAddress16. Should the name be IStream16_QueryInterface of IStream16_fnQueryInterface */ -#define VTENT(xfn) strvt16.bvt.fn##xfn = (void*)WIN32_GetProcAddress16(wp,"IStream16_"#xfn); - VTENT(QueryInterface) - VTENT(AddRef) - VTENT(Release) +#define VTENT(xfn) strvt16.bvt.bvt.fn##xfn = (void*)WIN32_GetProcAddress16(wp,"IStream16_"#xfn);assert(strvt16.bvt.bvt.fn##xfn) + VTENT(QueryInterface); + VTENT(AddRef); + VTENT(Release); #undef VTENT -#define VTENT(xfn) strvt16.fn##xfn = (void*)WIN32_GetProcAddress16(wp,"IStream16_"#xfn); - VTENT(Read) - VTENT(Write) - VTENT(Seek) - VTENT(SetSize) - VTENT(CopyTo) - VTENT(Commit) - VTENT(Revert) - VTENT(LockRegion) - VTENT(UnlockRegion) - VTENT(Stat) - VTENT(Clone) +#define VTENT(xfn) strvt16.bvt.fn##xfn = (void*)WIN32_GetProcAddress16(wp,"IStream16_"#xfn);assert(strvt16.bvt.fn##xfn) + VTENT(Read); + VTENT(Write); +#undef VTENT +#define VTENT(xfn) strvt16.fn##xfn = (void*)WIN32_GetProcAddress16(wp,"IStream16_"#xfn);assert(strvt16.fn##xfn) + VTENT(Seek); + VTENT(SetSize); + VTENT(CopyTo); + VTENT(Commit); + VTENT(Revert); + VTENT(LockRegion); + VTENT(UnlockRegion); + VTENT(Stat); + VTENT(Clone); #undef VTENT segstrvt16 = SEGPTR_NEW(ICOM_VTABLE(IStream16)); memcpy(segstrvt16,&strvt16,sizeof(strvt16)); segstrvt16 = (ICOM_VTABLE(IStream16)*)SEGPTR_GET(segstrvt16); } else { +#define VTENT(xfn) strvt16.bvt.bvt.fn##xfn = IStream16_fn##xfn; + VTENT(QueryInterface); + VTENT(AddRef); + VTENT(Release); +#undef VTENT #define VTENT(xfn) strvt16.bvt.fn##xfn = IStream16_fn##xfn; - VTENT(QueryInterface) - VTENT(AddRef) - VTENT(Release) + VTENT(Read); + VTENT(Write); #undef VTENT #define VTENT(xfn) strvt16.fn##xfn = IStream16_fn##xfn; - VTENT(Read) - VTENT(Write) - VTENT(Seek) + VTENT(Seek); /* - VTENT(CopyTo) - VTENT(Commit) - VTENT(SetSize) - VTENT(Revert) - VTENT(LockRegion) - VTENT(UnlockRegion) - VTENT(Stat) - VTENT(Clone) + VTENT(CopyTo); + VTENT(Commit); + VTENT(SetSize); + VTENT(Revert); + VTENT(LockRegion); + VTENT(UnlockRegion); + VTENT(Stat); + VTENT(Clone); */ #undef VTENT segstrvt16 = &strvt16; @@ -1178,12 +1213,14 @@ ULONG WINAPI IStream32_fnRelease(LPUNKNOWN iface) { static ICOM_VTABLE(IStream32) strvt32 = { { + { IStream32_fnQueryInterface, IStream32_fnAddRef, IStream32_fnRelease }, (void*)0xdead0004, - (void*)0xdead0005, + (void*)0xdead0005 + }, (void*)0xdead0006, (void*)0xdead0007, (void*)0xdead0008, @@ -1266,7 +1303,7 @@ HRESULT WINAPI IStorage16_fnStat( pstatstg->clsid = this->stde.pps_guid; pstatstg->grfStateBits = 0; /* FIXME */ pstatstg->reserved = 0; - return OLE_OK; + return S_OK; } /****************************************************************************** @@ -1279,7 +1316,7 @@ HRESULT WINAPI IStorage16_fnCommit( FIXME(ole,"(%p)->(0x%08lx),STUB!\n", this,commitflags ); - return OLE_OK; + return S_OK; } /****************************************************************************** @@ -1296,7 +1333,7 @@ HRESULT WINAPI IStorage16_fnCopyTo(LPSTORAGE16 iface,DWORD ciidExclude,const IID FIXME(ole,"IStorage16(%p)->(0x%08lx,%s,%p,%p),stub!\n", this,ciidExclude,xguid,SNB16Exclude,pstgDest ); - return OLE_OK; + return S_OK; } @@ -1357,7 +1394,7 @@ HRESULT WINAPI IStorage16_fnCreateStorage( /* FIXME: timestamps? */ if (!STORAGE_put_pps_entry(lpstg->hf,ppsent,&(lpstg->stde))) return E_FAIL; - return OLE_OK; + return S_OK; } /****************************************************************************** @@ -1410,7 +1447,7 @@ HRESULT WINAPI IStorage16_fnCreateStream( /* FIXME: timestamps? */ if (!STORAGE_put_pps_entry(lpstr->hf,ppsent,&(lpstr->stde))) return E_FAIL; - return OLE_OK; + return S_OK; } /****************************************************************************** @@ -1445,7 +1482,7 @@ HRESULT WINAPI IStorage16_fnOpenStorage( return E_FAIL; } lpstg->ppsent = newpps; - return OLE_OK; + return S_OK; } /****************************************************************************** @@ -1482,7 +1519,7 @@ HRESULT WINAPI IStorage16_fnOpenStream( lpstr->offset.LowPart = 0; lpstr->offset.HighPart = 0; lpstr->ppsent = newpps; - return OLE_OK; + return S_OK; } /****************************************************************************** @@ -1620,7 +1657,7 @@ HRESULT WINAPI IStorage32_fnCreateStream( ((_IStream32*)(*ppstm))->lpvtbl= &strvt32; ((_IStream32*)(*ppstm))->ref = 1; - return OLE_OK; + return S_OK; } /****************************************************************************** @@ -1636,7 +1673,7 @@ HRESULT WINAPI IStorage32_fnOpenStream( *ppstm = (IStream32*)HeapAlloc(GetProcessHeap(),0,sizeof(IStream32)); ((_IStream32*)(*ppstm))->lpvtbl= &strvt32; ((_IStream32*)(*ppstm))->ref = 1; - return OLE_OK; + return S_OK; } static ICOM_VTABLE(IStorage32) stvt32 = { @@ -1669,7 +1706,7 @@ static ICOM_VTABLE(IStorage32) stvt32 = { /****************************************************************************** * StgCreateDocFile16 [STORAGE.1] */ -OLESTATUS WINAPI StgCreateDocFile16( +HRESULT WINAPI StgCreateDocFile16( LPCOLESTR16 pwcsName,DWORD grfMode,DWORD reserved,IStorage16 **ppstgOpen ) { HFILE32 hf; @@ -1707,13 +1744,13 @@ OLESTATUS WINAPI StgCreateDocFile16( IStorage16_fnRelease((IUnknown*)lpstg); /* will remove it */ return E_FAIL; } - return OLE_OK; + return S_OK; } /****************************************************************************** - * StgCreateDocFile32 [OLE32.144] + * StgCreateDocfile32 [OLE32.144] */ -OLESTATUS WINAPI StgCreateDocFile32( +HRESULT WINAPI StgCreateDocfile32( LPCOLESTR32 pwcsName,DWORD grfMode,DWORD reserved,IStorage32 **ppstgOpen ) { TRACE(ole,"(%p,0x%08lx,0x%08lx,%p)\n", @@ -1722,13 +1759,13 @@ OLESTATUS WINAPI StgCreateDocFile32( *ppstgOpen = (IStorage32*)HeapAlloc(GetProcessHeap(),0,sizeof(IStorage32)); ((_IStorage32*)(*ppstgOpen))->ref = 1; ((_IStorage32*)(*ppstgOpen))->lpvtbl = &stvt32; - return OLE_OK; + return S_OK; } /****************************************************************************** * StgIsStorageFile16 [STORAGE.5] */ -OLESTATUS WINAPI StgIsStorageFile16(LPCOLESTR16 fn) { +HRESULT WINAPI StgIsStorageFile16(LPCOLESTR16 fn) { HFILE32 hf; OFSTRUCT ofs; BYTE magic[24]; @@ -1765,7 +1802,7 @@ OLESTATUS WINAPI StgIsStorageFile16(LPCOLESTR16 fn) { /****************************************************************************** * StgIsStorageFile32 [OLE32.146] */ -OLESTATUS WINAPI +HRESULT WINAPI StgIsStorageFile32(LPCOLESTR32 fn) { LPOLESTR16 xfn = HEAP_strdupWtoA(GetProcessHeap(),0,fn); @@ -1779,7 +1816,7 @@ StgIsStorageFile32(LPCOLESTR32 fn) /****************************************************************************** * StgOpenStorage16 [STORAGE.3] */ -OLESTATUS WINAPI StgOpenStorage16( +HRESULT WINAPI StgOpenStorage16( const OLECHAR16 * pwcsName,IStorage16 *pstgPriority,DWORD grfMode, SNB16 snbExclude,DWORD reserved, IStorage16 **ppstgOpen ) { @@ -1813,14 +1850,14 @@ OLESTATUS WINAPI StgOpenStorage16( IStorage16_fnRelease((IUnknown*)lpstg); /* will remove it */ return E_FAIL; } - return OLE_OK; + return S_OK; } /****************************************************************************** * StgOpenStorage32 [OLE32.148] */ -OLESTATUS WINAPI StgOpenStorage32( +HRESULT WINAPI StgOpenStorage32( const OLECHAR32 * pwcsName,IStorage32 *pstgPriority,DWORD grfMode, SNB32 snbExclude,DWORD reserved, IStorage32 **ppstgOpen ) { @@ -1830,7 +1867,7 @@ OLESTATUS WINAPI StgOpenStorage32( *ppstgOpen = (IStorage32*)HeapAlloc(GetProcessHeap(),0,sizeof(IStorage32)); ((_IStorage32*)(*ppstgOpen))->ref = 1; ((_IStorage32*)(*ppstgOpen))->lpvtbl = &stvt32; - return OLE_OK; + return S_OK; } diff --git a/ole/typelib.c b/ole/typelib.c index 913a83965ae..98a3b048048 100644 --- a/ole/typelib.c +++ b/ole/typelib.c @@ -12,10 +12,9 @@ #include "windows.h" #include "winreg.h" #include "winerror.h" -#include "ole.h" -#include "ole2.h" #include "oleauto.h" -#include "compobj.h" +#include "wine/obj_base.h" +#include "objbase.h" #include "debug.h" #include "winversion.h" diff --git a/ole/variant.c b/ole/variant.c index 6729e193873..52a9e3efe22 100644 --- a/ole/variant.c +++ b/ole/variant.c @@ -333,17 +333,7 @@ static BOOL32 DateToTm( DATE dateIn, LCID lcid, struct tm* pTm ) double decimalPart = 0.0; double wholePart = 0.0; - pTm->tm_sec = 0; - pTm->tm_min = 0; - pTm->tm_hour = 0; - pTm->tm_mday = 0; - pTm->tm_mon = 0; - pTm->tm_year = 0; - pTm->tm_wday = 0; - pTm->tm_yday = 0; - pTm->tm_isdst = 0; - pTm->tm_gmtoff = 0; - pTm->tm_zone = 0; + memset(pTm,0,sizeof(*pTm)); /* Because of the nature of DATE format witch * associates 2.0 to January 1, 1900. We will diff --git a/programs/clock/language.c b/programs/clock/language.c index 7c4219147bb..3dbf11aebc2 100644 --- a/programs/clock/language.c +++ b/programs/clock/language.c @@ -187,7 +187,7 @@ VOID LANGUAGE_Init(VOID) if (Globals.lpszLanguage == "En") { PROFILE_GetWineIniString("programs", "language", "En", szBuffer, sizeof(szBuffer)); - Globals.lpszLanguage = LocalLock(LocalAlloc(LMEM_FIXED, lstrlen(szBuffer))); + Globals.lpszLanguage = LocalLock(LocalAlloc(LMEM_FIXED, lstrlen(szBuffer)+1)); /* hmemcpy(Globals.lpszLanguage, szBuffer, 1+lstrlen(szBuffer)); */ lstrcpyn(Globals.lpszLanguage, szBuffer, strlen(szBuffer)+1); diff --git a/programs/notepad/language.c b/programs/notepad/language.c index 8cd0983d005..68372d61620 100644 --- a/programs/notepad/language.c +++ b/programs/notepad/language.c @@ -147,7 +147,7 @@ VOID LANGUAGE_Init(VOID) PROFILE_GetWineIniString("programs", "language", "language", buffer, sizeof(buffer)); - Globals.lpszLanguage = p = LocalLock(LocalAlloc(LMEM_FIXED, lstrlen(buffer))); + Globals.lpszLanguage = p = LocalLock(LocalAlloc(LMEM_FIXED, lstrlen(buffer)+1)); strcpy(p, buffer); /* hmemcpy(p, buffer, 1 + lstrlen(buffer)); */ #endif diff --git a/programs/progman/main.c b/programs/progman/main.c index 6f0e985e5ae..4023c4628d3 100644 --- a/programs/progman/main.c +++ b/programs/progman/main.c @@ -64,13 +64,13 @@ int PASCAL WinMain (HANDLE hInstance, HANDLE prev, LPSTR cmdline, int show) /* Redirect `progman.ini' */ PROFILE_GetWineIniString("progman", "progman.ini", "progman.ini", buffer, sizeof(buffer)); - Globals.lpszIniFile = p = LocalLock(LocalAlloc(LMEM_FIXED, lstrlen(buffer))); + Globals.lpszIniFile = p = LocalLock(LocalAlloc(LMEM_FIXED, lstrlen(buffer)+1)); hmemcpy(p, buffer, 1 + lstrlen(buffer)); /* Redirect `progman.ico' */ PROFILE_GetWineIniString("progman", "progman.ico", "progman.ico", buffer, sizeof(buffer)); - Globals.lpszIcoFile = p = LocalLock(LocalAlloc(LMEM_FIXED, lstrlen(buffer))); + Globals.lpszIcoFile = p = LocalLock(LocalAlloc(LMEM_FIXED, lstrlen(buffer)+1)); hmemcpy(p, buffer, 1 + lstrlen(buffer)); } #endif diff --git a/relay32/builtin32.c b/relay32/builtin32.c index 55f3fcf9a63..c066e22399b 100644 --- a/relay32/builtin32.c +++ b/relay32/builtin32.c @@ -10,6 +10,7 @@ #include "peexe.h" #include "heap.h" #include "debug.h" +#include "main.h" typedef struct { diff --git a/relay32/comctl32.spec b/relay32/comctl32.spec index 3a2f96e8928..6eabd41bb51 100644 --- a/relay32/comctl32.spec +++ b/relay32/comctl32.spec @@ -23,7 +23,7 @@ init COMCTL32_LibMain 15 stub DrawInsert 16 stdcall CreateUpDownControl(long long long long long long long long long long long long) CreateUpDownControl 17 stdcall InitCommonControls() InitCommonControls - 18 stub CreatePropertySheetPage + 18 stdcall CreatePropertySheetPage(ptr) CreatePropertySheetPage32AW 19 stdcall CreatePropertySheetPageA(ptr) CreatePropertySheetPage32A 20 stdcall CreatePropertySheetPageW(ptr) CreatePropertySheetPage32W 21 stdcall CreateStatusWindow(long str long long) CreateStatusWindow32AW @@ -34,16 +34,16 @@ init COMCTL32_LibMain 26 stub DllInstall 27 stdcall DrawStatusText(long ptr ptr long) DrawStatusText32AW 28 stdcall DrawStatusTextW(long ptr wstr long) DrawStatusText32W - 29 stub FlatSB_EnableScrollBar - 30 stub FlatSB_GetScrollInfo - 31 stub FlatSB_GetScrollPos - 32 stub FlatSB_GetScrollProp - 33 stub FlatSB_GetScrollRange - 34 stub FlatSB_SetScrollInfo - 35 stub FlatSB_SetScrollPos - 36 stub FlatSB_SetScrollProp - 37 stub FlatSB_SetScrollRange - 38 stub FlatSB_ShowScrollBar + 29 stdcall FlatSB_EnableScrollBar (long long long) FlatSB_EnableScrollBar + 30 stdcall FlatSB_GetScrollInfo (long long ptr) FlatSB_GetScrollInfo + 31 stdcall FlatSB_GetScrollPos (long long) FlatSB_GetScrollPos + 32 stdcall FlatSB_GetScrollProp (long long ptr) FlatSB_GetScrollProp + 33 stdcall FlatSB_GetScrollRange (long long ptr ptr) FlatSB_GetScrollRange + 34 stdcall FlatSB_SetScrollInfo (long long ptr long) FlatSB_SetScrollInfo + 35 stdcall FlatSB_SetScrollPos (long long long long) FlatSB_SetScrollPos + 36 stdcall FlatSB_SetScrollProp (long long long long) FlatSB_SetScrollProp + 37 stdcall FlatSB_SetScrollRange (long long long long long) FlatSB_SetScrollRange + 38 stdcall FlatSB_ShowScrollBar (long long long) FlatSB_ShowScrollBar 39 stdcall ImageList_Add(ptr long long) ImageList_Add 40 stdcall ImageList_AddIcon(ptr long) ImageList_AddIcon 41 stdcall ImageList_AddMasked(ptr long long) ImageList_AddMasked @@ -87,11 +87,11 @@ init COMCTL32_LibMain 79 stdcall ImageList_SetOverlayImage(ptr long long) ImageList_SetOverlayImage 80 stdcall ImageList_Write(ptr ptr) ImageList_Write 81 stdcall InitCommonControlsEx(ptr) InitCommonControlsEx - 82 stub InitializeFlatSB - 83 stub PropertySheet + 82 stdcall InitializeFlatSB(long) InitializeFlatSB + 83 stdcall PropertySheet(ptr) PropertySheet32AW 84 stdcall PropertySheetA(ptr) PropertySheet32A 85 stdcall PropertySheetW(ptr) PropertySheet32W - 86 stub UninitializeFlatSB + 86 stdcall UninitializeFlatSB(long) UninitializeFlatSB 87 stub _TrackMouseEvent 151 stdcall CreateMRUListA(ptr) CreateMRUList32A diff --git a/relay32/ntdll.spec b/relay32/ntdll.spec index ccbae37deb9..c7b06819ed4 100644 --- a/relay32/ntdll.spec +++ b/relay32/ntdll.spec @@ -25,7 +25,7 @@ type win32 017 stub CsrSetPriorityClass 018 stub CsrpProcessCallbackRequest 019 stub DbgBreakPoint -020 stub DbgPrint +020 cdecl DbgPrint(str long) DbgPrint 021 stub DbgPrompt 022 stub DbgSsHandleKmApiMsg 023 stub DbgSsInitialize @@ -882,7 +882,7 @@ type win32 874 stub _strlwr 875 cdecl _strnicmp(str str long) CRTDLL__strnicmp 876 cdecl _strupr(str) CRTDLL__strupr -877 stub _ultoa +877 cdecl _ultoa(long ptr long) CRTDLL__ultoa 878 stub _vsnprintf 879 cdecl _wcsicmp(wstr wstr) CRTDLL__wcsicmp 880 cdecl _wcslwr(wstr) CRTDLL__wcslwr diff --git a/relay32/ole32.spec b/relay32/ole32.spec index 4a4ff32e626..0a836688976 100644 --- a/relay32/ole32.spec +++ b/relay32/ole32.spec @@ -26,7 +26,7 @@ type win32 23 stub CoGetStandardMarshal 24 stub CoGetState 25 stub CoGetTreatAsClass - 26 stdcall CoInitialize(long) CoInitialize32 + 26 stdcall CoInitialize(ptr) CoInitialize32 27 stdcall CoInitializeWOW(long long) CoInitializeWOW 28 stub CoIsHandlerConnected 29 stub CoIsOle1Class @@ -76,7 +76,7 @@ type win32 73 stdcall GetRunningObjectTable(long ptr) GetRunningObjectTable32 74 stub IIDFromString 75 stub IsAccelerator - 76 stub IsEqualGUID + 76 stdcall IsEqualGUID(ptr ptr) IsEqualGUID32 77 stub IsValidIid 78 stdcall IsValidInterface(ptr) IsValidInterface32 79 stub IsValidPtrIn @@ -144,7 +144,7 @@ type win32 141 stdcall RevokeDragDrop(long) RevokeDragDrop32 142 stub SetConvertStg 143 stub SetDocumentBitStg -144 stdcall StgCreateDocfile(wstr long long ptr) StgCreateDocFile32 +144 stdcall StgCreateDocfile(wstr long long ptr) StgCreateDocfile32 145 stub StgCreateDocfileOnILockBytes 146 stdcall StgIsStorageFile(wstr) StgIsStorageFile32 147 stub StgIsStorageILockBytes @@ -163,7 +163,7 @@ type win32 160 stub WriteFmtUserTypeStg 161 stub WriteOleStg 162 stub WriteStringStream -163 stub CoInitializeEx +163 stdcall CoInitializeEx(ptr long) CoInitializeEx32 164 stub CoInitializeSecurity 165 stub CoCreateInstanceEx 166 stub PropVariantClear diff --git a/relay32/relay386.c b/relay32/relay386.c index 52873ddadb7..082c3029cef 100644 --- a/relay32/relay386.c +++ b/relay32/relay386.c @@ -14,6 +14,7 @@ #include "selectors.h" #include "debugstr.h" #include "debug.h" +#include "main.h" char **debug_relay_excludelist = NULL, **debug_relay_includelist = NULL; diff --git a/relay32/winspool.spec b/relay32/winspool.spec index a99a998639c..35e0329730d 100644 --- a/relay32/winspool.spec +++ b/relay32/winspool.spec @@ -20,8 +20,8 @@ type win32 117 stdcall AddPrinterA(str long ptr) AddPrinter32A 118 stub AddPrinterConnectionA 119 stub AddPrinterConnectionW -120 stub AddPrinterDriverA -121 stub AddPrinterDriverW +120 stdcall AddPrinterDriverA(str long ptr) AddPrinterDriver32A +121 stdcall AddPrinterDriverW(wstr long ptr) AddPrinterDriver32W 122 stdcall AddPrinterW(wstr long ptr) AddPrinter32W 123 stub AdvancedDocumentPropertiesA 124 stub AdvancedDocumentPropertiesW diff --git a/scheduler/k32obj.c b/scheduler/k32obj.c index 3d67e95cefc..35f5be39d7d 100644 --- a/scheduler/k32obj.c +++ b/scheduler/k32obj.c @@ -9,6 +9,7 @@ #include "k32obj.h" #include "heap.h" #include "process.h" +#include "server.h" /* The declarations are here to avoid including a lot of unnecessary files */ diff --git a/scheduler/syslevel.c b/scheduler/syslevel.c index 3b4f0a6d5e5..8babea4b924 100644 --- a/scheduler/syslevel.c +++ b/scheduler/syslevel.c @@ -31,6 +31,7 @@ void SYSLEVEL_Init(void) segpWin16Mutex = SEGPTR_GET(w16Mutex); InitializeCriticalSection(&Win16Mutex); + MakeCriticalSectionGlobal(&Win16Mutex); } /************************************************************************ diff --git a/server/console.c b/server/console.c index b7cd57b30b9..d9cfae33eba 100644 --- a/server/console.c +++ b/server/console.c @@ -69,7 +69,7 @@ int create_console( int fd, struct object *obj[2] ) file_set_error(); return 0; } - if ((write_fd = (fd != -1) ? dup(fd) : dup(0)) == -1) + if ((write_fd = (fd != -1) ? dup(fd) : dup(1)) == -1) { file_set_error(); close( read_fd ); diff --git a/server/file.c b/server/file.c index 760902d70cf..c786807e861 100644 --- a/server/file.c +++ b/server/file.c @@ -304,18 +304,19 @@ static int file_get_info( struct object *obj, struct get_file_info_reply *reply static void file_destroy( struct object *obj ) { - struct file **pptr; struct file *file = (struct file *)obj; assert( obj->ops == &file_ops ); - /* remove it from the hashing list */ - pptr = &file_hash[get_name_hash( file->name )]; - while (*pptr && *pptr != file) pptr = &(*pptr)->next; - assert( *pptr ); - *pptr = (*pptr)->next; - + if (file->name) + { + /* remove it from the hashing list */ + struct file **pptr = &file_hash[get_name_hash( file->name )]; + while (*pptr && *pptr != file) pptr = &(*pptr)->next; + assert( *pptr ); + *pptr = (*pptr)->next; + free( file->name ); + } close( file->fd ); - free( file->name ); free( file ); } diff --git a/tools/wrc/CHANGES b/tools/wrc/CHANGES index 6f3bc3676c0..78482378570 100644 --- a/tools/wrc/CHANGES +++ b/tools/wrc/CHANGES @@ -1,4 +1,44 @@ --------------------------------------------------------------------------- +Version 1.0.8 (10-Jan-1999) + +Albert den Haan : +- Added TOOLBAR support. +- Buffer overflow fix in strncpyWtoA. +- Open embedded files in resource definitions through the include path from + the commandline. +- Support named icons in dialogs with unquoted names + +Bertho Stultiens +- Fixed a major bug in the language propagation in the parser. The parser + did not copy the current language while binding it to a resource structure + causing wrong sorting if multiple global languages were in use and was a + potential segfault because the pointer might not be valid. +- Added language/version/characteristics support for toolbar. +- Moved some defines from wrc.h to wrctypes.h to support in toolbars. +- Removed function stricmp from source and replaced with native function + strcasecmp. +- Allocate cursor and icon ordinals according to the language of the item to + decrease the amount of ordinals in use. This reduces the resource + directory size by reducing the tree size. +- Versions 1.0.5 through 1.0.7 were never commited to cvs but were available + for download from an alternate site for elf-dll test generation. + +--------------------------------------------------------------------------- +Version 1.0.7 (19-Dec-1998) +- Changed a couple of labels that are used by dllglue. Also reversed a patch + that made wrc's generated code dependent on dllglue's code. + +--------------------------------------------------------------------------- +Version 1.0.6 (12-Dec-1998) +- Fixed the _PEResTab table where incorrect RVA's were put in the table. + The dllglue should now be merged into wrc for correct labels and the least + number of loadtime fixups. + +--------------------------------------------------------------------------- +Version 1.0.5 (12-Dec-1998) +- Fixed an omited .globl statement for dllglue linking. + +--------------------------------------------------------------------------- Version 1.0.4 (10-Dec-1998) - Added a global label for elf-dll linking and a long with the resource size and a long with the directory size. diff --git a/tools/wrc/dumpres.c b/tools/wrc/dumpres.c index 6814a3b53e4..3a46bfe45d3 100644 --- a/tools/wrc/dumpres.c +++ b/tools/wrc/dumpres.c @@ -42,6 +42,7 @@ char *get_typename(resource_t* r) case res_usr: return "UserResource"; case res_msg: return "MESSAGETABLE"; case res_ver: return "VERSIONINFO"; + case res_toolbar: return "TOOLBAR"; default: return "Unknown"; } } @@ -64,7 +65,8 @@ char *get_typename(resource_t* r) char *strncpyWtoA(char *cs, short *ws, int maxlen) { char *cptr = cs; - while(*ws && maxlen-1) + short *wsMax = ws + maxlen; + while(ws < wsMax) { if(*ws < -128 || *ws > 127) printf("***Warning: Unicode string contains non-printable chars***"); @@ -821,6 +823,49 @@ void dump_versioninfo(versioninfo_t *ver) /* ***************************************************************************** + * Function : dump_toolbar_item + * Syntax : void dump_toolbar_item(toolbar_item_t *item) + * Input : + * Output : + * Description : + * Remarks : + ***************************************************************************** +*/ +void dump_toolbar_items(toolbar_item_t *items) +{ + while(items) + { + if(items->id) + printf(" BUTTON %d", items->id ); + else + printf(" SEPARATOR"); + + printf("\n"); + + items = items->next; + } +} + +/* + ***************************************************************************** + * Function : dump_toolbar + * Syntax : void dump_toolbar(dialogex_t *toolbar) + * Input : + * toolbar - Toolbar resource descriptor + * Output : + * Description : + * Remarks : + ***************************************************************************** +*/ +void dump_toolbar(toolbar_t *toolbar) +{ + dump_memopt(toolbar->memopt); + dump_lvc(&(toolbar->lvc)); + dump_toolbar_items(toolbar->items); +} + +/* + ***************************************************************************** * Function : * Syntax : * Input : @@ -899,6 +944,9 @@ void dump_resources(resource_t *top) case res_ver: dump_versioninfo(top->res.ver); break; + case res_toolbar: + dump_toolbar(top->res.tbt); + break; default: printf("Report this: Unknown resource type parsed %08x\n", top->type); } diff --git a/tools/wrc/genres.c b/tools/wrc/genres.c index 0f863d45d3c..abffb11ccc0 100644 --- a/tools/wrc/genres.c +++ b/tools/wrc/genres.c @@ -1425,6 +1425,72 @@ res_t *versioninfo2res(name_id_t *name, versioninfo_t *ver) /* ***************************************************************************** + * Function : toolbaritem2res + * Syntax : void toolbaritem2res(res_t *res, toolbar_item_t *tbitem) + * Input : + * Output : nop + * Description : + * Remarks : Self recursive + ***************************************************************************** +*/ +void toolbaritem2res(res_t *res, toolbar_item_t *tbitem) +{ + toolbar_item_t *itm = tbitem; + assert(win32 != 0); + while(itm) + { + put_word(res, itm->id); + itm = itm->next; + } + +} + +/* + ***************************************************************************** + * Function : toolbar2res + * Syntax : res_t *toolbar2res(name_id_t *name, toolbar_t *toolbar) + * Input : + * name - Name/ordinal of the resource + * toolbar - The toolbar descriptor + * Output : New .res format structure + * Description : + * Remarks : + ***************************************************************************** +*/ +res_t *toolbar2res(name_id_t *name, toolbar_t *toolbar) +{ + int restag; + res_t *res; + assert(name != NULL); + assert(toolbar != NULL); + + res = new_res(); + if(win32) + { + restag = put_res_header(res, WRC_RT_TOOLBAR, NULL, name, toolbar->memopt, &(toolbar->lvc)); + + put_word(res, 1); /* Menuheader: Version */ + put_word(res, toolbar->button_width); /* (in pixels?) */ + put_word(res, toolbar->button_height); /* (in pixels?) */ + put_word(res, toolbar->nitems); + put_pad(res); + toolbaritem2res(res, toolbar->items); + /* Set ResourceSize */ + SetResSize(res, restag); + put_pad(res); + } + else /* win16 */ + { + /* Do not generate anything in 16-bit mode */ + free(res->data); + free(res); + return NULL; + } + return res; +} + +/* + ***************************************************************************** * Function : prep_nid_for_label * Syntax : char *prep_nid_for_label(name_id_t *nid) * Input : @@ -1546,6 +1612,7 @@ char *get_c_typename(enum res_e type) case res_usr: return "Usr"; case res_msg: return "MsgTab"; case res_ver: return "VerInf"; + case res_toolbar: return "TlBr"; default: return "Oops"; } } @@ -1631,6 +1698,10 @@ void resources2res(resource_t *top) if(!top->binres) top->binres = versioninfo2res(top->name, top->res.ver); break; + case res_toolbar: + if(!top->binres) + top->binres = toolbar2res(top->name, top->res.tbt); + break; default: internal_error(__FILE__, __LINE__, "Unknown resource type encountered %d in binary res generation", top->type); } diff --git a/tools/wrc/newstruc.c b/tools/wrc/newstruc.c index 3fb9941b1fb..05d9ee066f4 100644 --- a/tools/wrc/newstruc.c +++ b/tools/wrc/newstruc.c @@ -37,6 +37,7 @@ __NEW_STRUCT_FUNC(raw_data) __NEW_STRUCT_FUNC(lvc) __NEW_STRUCT_FUNC(res_count) __NEW_STRUCT_FUNC(string) +__NEW_STRUCT_FUNC(toolbar_item) /* New instances for all types of structures */ /* Very inefficient (in size), but very functional :-] @@ -250,4 +251,12 @@ stringtable_t *new_stringtable(lvc_t *lvc) return stt; } - +toolbar_t *new_toolbar(int button_width, int button_height, toolbar_item_t *items, int nitems) +{ + toolbar_t *tb = (toolbar_t *)xmalloc(sizeof(toolbar_t)); + tb->button_width = button_width; + tb->button_height = button_height; + tb->nitems = nitems; + tb->items = items; + return tb; +} diff --git a/tools/wrc/newstruc.h b/tools/wrc/newstruc.h index 61d3907b6de..3e79a3a29d7 100644 --- a/tools/wrc/newstruc.h +++ b/tools/wrc/newstruc.h @@ -40,6 +40,7 @@ __NEW_STRUCT_PROTO(raw_data); __NEW_STRUCT_PROTO(lvc); __NEW_STRUCT_PROTO(res_count); __NEW_STRUCT_PROTO(string); +__NEW_STRUCT_PROTO(toolbar_item); resource_t *new_resource(enum res_e t, void *res, int memopt, language_t *lan); version_t *new_version(DWORD v); @@ -61,6 +62,7 @@ messagetable_t *new_messagetable(raw_data_t *rd); void copy_raw_data(raw_data_t *dst, raw_data_t *src, int offs, int len); int *new_int(int i); stringtable_t *new_stringtable(lvc_t *lvc); +toolbar_t *new_toolbar(int button_width, int button_Height, toolbar_item_t *items, int nitems); #endif diff --git a/tools/wrc/parser.l b/tools/wrc/parser.l index bc11b4e7558..9b132d6ca9c 100644 --- a/tools/wrc/parser.l +++ b/tools/wrc/parser.l @@ -261,6 +261,7 @@ static struct keyword keywords[] = { { "BEGIN", tBEGIN, 0, 0, 1}, { "BITMAP", tBITMAP, 0, 0, 0}, { "BLOCK", BLOCK, 0, 0, 1}, + { "BUTTON", BUTTON, 1, 0, 0}, { "CAPTION", CAPTION, 0, 0, 0}, { "CHARACTERISTICS", CHARACTERISTICS, 1, 0, 0}, { "CHECKBOX", CHECKBOX, 0, 0, 0}, @@ -321,6 +322,7 @@ static struct keyword keywords[] = { { "STRING", tSTRING, 0, 0, 0}, { "STRINGTABLE", STRINGTABLE, 0, 0, 1}, { "STYLE", STYLE, 0, 0, 0}, + { "TOOLBAR", TOOLBAR, 1, 0, 0}, { "typedef", tTYPEDEF, 0, 1, 1}, { "VALUE", VALUE, 0, 0, 0}, { "VERSION", VERSION, 1, 0, 0}, @@ -333,7 +335,7 @@ static struct keyword keywords[] = { int kw_cmp_func(const void *s1, const void *s2) { int ret; - ret = stricmp(KWP(s1)->keyword, KWP(s2)->keyword); + ret = strcasecmp(KWP(s1)->keyword, KWP(s2)->keyword); if(!ret && (KWP(s1)->needcase || KWP(s2)->needcase)) return strcmp(KWP(s1)->keyword, KWP(s2)->keyword); else @@ -804,10 +806,12 @@ L\" { #ifndef yywrap int yywrap(void) { -// if(bufferstackidx > 0) -// { -// return 0; -// } +#if 0 + if(bufferstackidx > 0) + { + return 0; + } +#endif return 1; } #endif diff --git a/tools/wrc/parser.y b/tools/wrc/parser.y index 7f5d87798ec..0d5baf1fe1a 100644 --- a/tools/wrc/parser.y +++ b/tools/wrc/parser.y @@ -3,6 +3,14 @@ * Copyright Martin von Loewis, 1994 * Copyright 1998 Bertho A. Stultiens (BS) * + * 29-Dec-1998 AdH - Grammar and function extensions. + * grammar: TOOLBAR resources, Named ICONs in + * DIALOGS + * functions: semantic actions for the grammar + * changes, resource files can now be anywhere + * on the include path instead of just in the + * current directory + * * 20-Jun-1998 BS - Fixed a bug in load_file() where the name was not * printed out correctly. * @@ -82,6 +90,7 @@ #include #include #include +#include #include #include "wrc.h" @@ -114,8 +123,8 @@ static version_t *tagstt_version; /* Prototypes of here defined functions */ void split_cursors(raw_data_t *rd, cursor_group_t *curg, int *ncur); void split_icons(raw_data_t *rd, icon_group_t *icog, int *nico); -int alloc_cursor_id(void); -int alloc_icon_id(void); +int alloc_cursor_id(language_t *); +int alloc_icon_id(language_t *); void ins_stt_entry(stt_entry_t *ste); int check_stt_entry(stringtable_t *tabs, stt_entry_t *ste); event_t *get_event_head(event_t *p); @@ -156,6 +165,8 @@ dialog_t *dialog_exstyle(int st, dialog_t *dlg); dialog_t *dialog_style(int st, dialog_t *dlg); resource_t *build_stt_resources(stringtable_t *stthead); stringtable_t *find_stringtable(lvc_t *lvc); +toolbar_item_t *ins_tlbr_button(toolbar_item_t *prev, toolbar_item_t *idrec); +toolbar_item_t *get_tlbr_buttons_head(toolbar_item_t *p, int *nitems); %} %union{ @@ -195,6 +206,8 @@ stringtable_t *find_stringtable(lvc_t *lvc); ver_value_t *val; ver_block_t *blk; ver_words_t *verw; + toolbar_t *tlbar; + toolbar_item_t *tlbarItems; } %token tIF tIFDEF tIFNDEF tELSE tELIF tENDIF tDEFINED tNL @@ -217,6 +230,7 @@ stringtable_t *find_stringtable(lvc_t *lvc); %token MENUBARBREAK MENUBREAK MENUITEM POPUP SEPARATOR %token HELP %token tSTRING IDENT RAWDATA +%token TOOLBAR BUTTON %token tBEGIN tEND %left LOGOR %left LOGAND @@ -267,6 +281,8 @@ stringtable_t *find_stringtable(lvc_t *lvc); %type expr xpr dummy %type e_expr %type pp_expr pp_constant +%type toolbar +%type toolbar_items %% @@ -432,14 +448,14 @@ nameid_s: nameid { $$ = $1; } /* get the value for a single resource*/ resource_definition : accelerators { $$ = new_resource(res_acc, $1, $1->memopt, $1->lvc.language); } - | bitmap { $$ = new_resource(res_bmp, $1, $1->memopt, currentlanguage); } + | bitmap { $$ = new_resource(res_bmp, $1, $1->memopt, dup_language(currentlanguage)); } | cursor { resource_t *rsc; cursor_t *cur; - $$ = rsc = new_resource(res_curg, $1, $1->memopt, currentlanguage); + $$ = rsc = new_resource(res_curg, $1, $1->memopt, dup_language(currentlanguage)); for(cur = $1->cursorlist; cur; cur = cur->next) { - rsc->prev = new_resource(res_cur, cur, $1->memopt, currentlanguage); + rsc->prev = new_resource(res_cur, cur, $1->memopt, dup_language(currentlanguage)); rsc->prev->next = rsc; rsc = rsc->prev; rsc->name = new_name_id(); @@ -454,14 +470,14 @@ resource_definition else $$ = NULL; } - | font { $$=new_resource(res_fnt, $1, $1->memopt, currentlanguage); } + | font { $$=new_resource(res_fnt, $1, $1->memopt, dup_language(currentlanguage)); } | icon { resource_t *rsc; icon_t *ico; - $$ = rsc = new_resource(res_icog, $1, $1->memopt, currentlanguage); + $$ = rsc = new_resource(res_icog, $1, $1->memopt, dup_language(currentlanguage)); for(ico = $1->iconlist; ico; ico = ico->next) { - rsc->prev = new_resource(res_ico, ico, $1->memopt, currentlanguage); + rsc->prev = new_resource(res_ico, ico, $1->memopt, dup_language(currentlanguage)); rsc->prev->next = rsc; rsc = rsc->prev; rsc->name = new_name_id(); @@ -476,10 +492,11 @@ resource_definition else $$ = NULL; } - | messagetable { $$ = new_resource(res_msg, $1, WRC_MO_MOVEABLE | WRC_MO_DISCARDABLE, currentlanguage); } + | messagetable { $$ = new_resource(res_msg, $1, WRC_MO_MOVEABLE | WRC_MO_DISCARDABLE, dup_language(currentlanguage)); } | rcdata { $$ = new_resource(res_rdt, $1, $1->memopt, $1->lvc.language); } - | userres { $$ = new_resource(res_usr, $1, $1->memopt, currentlanguage); } - | versioninfo { $$ = new_resource(res_ver, $1, WRC_MO_MOVEABLE | WRC_MO_DISCARDABLE, currentlanguage); } + | toolbar { $$ = new_resource(res_toolbar, $1, $1->memopt, $1->lvc.language); } + | userres { $$ = new_resource(res_usr, $1, $1->memopt, dup_language(currentlanguage)); } + | versioninfo { $$ = new_resource(res_ver, $1, WRC_MO_MOVEABLE | WRC_MO_DISCARDABLE, dup_language(currentlanguage)); } ; /* ------------------------------ Bitmap ------------------------------ */ @@ -673,8 +690,15 @@ ctrls : /* Empty */ { $$ = NULL; } | ctrls CTEXT lab_ctrl { $$=ins_ctrl(CT_STATIC, SS_CENTER, $3, $1); } | ctrls RTEXT lab_ctrl { $$=ins_ctrl(CT_STATIC, SS_RIGHT, $3, $1); } /* special treatment for icons, as the extent is optional */ - | ctrls ICON tSTRING ',' expr ',' expr ',' expr iconinfo { - $10->title = $3; + | ctrls ICON nameid_s ',' expr ',' expr ',' expr iconinfo { + if($3->type == name_str) + { + $10->title = $3->name.s_name; + } + else + { + $10->title = NULL; + } $10->id = $5; $10->x = $7; $10->y = $9; @@ -1380,6 +1404,46 @@ ver_words | ver_words ',' expr { $$ = add_ver_words($1, $3); } ; +/* ------------------------------ Toolbar ------------------------------ */ +toolbar: TOOLBAR loadmemopts expr ',' expr opt_lvc tBEGIN toolbar_items tEND { + int nitems; + toolbar_item_t *items = get_tlbr_buttons_head($8, &nitems); + $$ = new_toolbar($3, $5, items, nitems); + if($2) + { + $$->memopt = *($2); + free($2); + } + else + { + $$->memopt = WRC_MO_MOVEABLE | WRC_MO_PURE; + } + if($6) + { + $$->lvc = *($6); + free($6); + } + if(!$$->lvc.language) + { + $$->lvc.language = dup_language(currentlanguage); + } + } + ; + +toolbar_items + : /* Empty */ { $$ = NULL; } + | toolbar_items BUTTON expr { + toolbar_item_t *idrec = new_toolbar_item(); + idrec->id = $3; + $$ = ins_tlbr_button($1, idrec); + } + | toolbar_items SEPARATOR { + toolbar_item_t *idrec = new_toolbar_item(); + idrec->id = 0; + $$ = ins_tlbr_button($1, idrec); + } + ; + /* ------------------------------ Memory options ------------------------------ */ loadmemopts : /* Empty */ { $$ = NULL; } @@ -1714,17 +1778,17 @@ name_id_t *convert_ctlclass(name_id_t *cls) else cc = cls->name.s_name->str.cstr; - if(!stricmp("BUTTON", cc)) + if(!strcasecmp("BUTTON", cc)) iclass = CT_BUTTON; - else if(!stricmp("COMBOBOX", cc)) + else if(!strcasecmp("COMBOBOX", cc)) iclass = CT_COMBOBOX; - else if(!stricmp("LISTBOX", cc)) + else if(!strcasecmp("LISTBOX", cc)) iclass = CT_LISTBOX; - else if(!stricmp("EDIT", cc)) + else if(!strcasecmp("EDIT", cc)) iclass = CT_EDIT; - else if(!stricmp("STATIC", cc)) + else if(!strcasecmp("STATIC", cc)) iclass = CT_STATIC; - else if(!stricmp("SCROLLBAR", cc)) + else if(!strcasecmp("SCROLLBAR", cc)) iclass = CT_SCROLLBAR; else return cls; /* No default, return user controlclass */ @@ -1896,7 +1960,7 @@ raw_data_t *load_file(string_t *name) if(name->type != str_char) yyerror("Filename must be ASCII string"); - fp = fopen(name->str.cstr, "rb"); + fp = open_include(name->str.cstr, 1); if(!fp) yyerror("Cannot open file %s", name->str.cstr); rd = new_raw_data(); @@ -2028,7 +2092,7 @@ stringtable_t *find_stringtable(lvc_t *lvc) assert(lvc != NULL); if(!lvc->language) - lvc->language = currentlanguage; + lvc->language = dup_language(currentlanguage); for(stt = sttres; stt; stt = stt->next) { @@ -2162,16 +2226,54 @@ resource_t *build_stt_resources(stringtable_t *stthead) } /* Cursor and icon splitter functions */ -int alloc_icon_id(void) +typedef struct { + language_t lan; + int id; +} id_alloc_t; + +static int get_new_id(id_alloc_t **list, int *n, language_t *lan) { - static int icon_id = 1; - return icon_id++; + int i; + assert(lan != NULL); + assert(list != NULL); + assert(n != NULL); + + if(!*list) + { + *list = (id_alloc_t *)xmalloc(sizeof(id_alloc_t)); + *n = 1; + (*list)[0].lan = *lan; + (*list)[0].id = 1; + return 1; + } + + for(i = 0; i < *n; i++) + { + if((*list)[i].lan.id == lan->id && (*list)[i].lan.sub == lan->sub) + return ++((*list)[i].id); + } + + *list = (id_alloc_t *)xrealloc(*list, sizeof(id_alloc_t) * (*n+1)); + (*list)[*n].lan = *lan; + (*list)[*n].id = 1; + *n += 1; + return 1; } -int alloc_cursor_id(void) +int alloc_icon_id(language_t *lan) { - static int cursor_id = 1; - return cursor_id++; + static id_alloc_t *idlist = NULL; + static int nid = 0; + + return get_new_id(&idlist, &nid, lan); +} + +int alloc_cursor_id(language_t *lan) +{ + static id_alloc_t *idlist = NULL; + static int nid = 0; + + return get_new_id(&idlist, &nid, lan); } #define BPTR(base) ((char *)(rd->data + (base))) @@ -2193,7 +2295,7 @@ void split_icons(raw_data_t *rd, icon_group_t *icog, int *nico) for(i = 0; i < cnt; i++) { ico = new_icon(); - ico->id = alloc_icon_id(); + ico->id = alloc_icon_id(icog->lvc.language); ico->lvc.language = dup_language(icog->lvc.language); if(ide[i].offset > rd->size || ide[i].offset + ide[i].ressize > rd->size) @@ -2246,7 +2348,7 @@ void split_cursors(raw_data_t *rd, cursor_group_t *curg, int *ncur) for(i = 0; i < cnt; i++) { cur = new_cursor(); - cur->id = alloc_cursor_id(); + cur->id = alloc_cursor_id(curg->lvc.language); cur->lvc.language = dup_language(curg->lvc.language); if(cde[i].offset > rd->size || cde[i].offset + cde[i].ressize > rd->size) @@ -2283,3 +2385,31 @@ void split_cursors(raw_data_t *rd, cursor_group_t *curg, int *ncur) #undef DPTR +toolbar_item_t *ins_tlbr_button(toolbar_item_t *prev, toolbar_item_t *idrec) +{ + idrec->prev = prev; + if(prev) + prev->next = idrec; + + return idrec; +} + +toolbar_item_t *get_tlbr_buttons_head(toolbar_item_t *p, int *nitems) +{ + if(!p) + { + *nitems = 0; + return NULL; + } + + *nitems = 1; + + while(p->prev) + { + (*nitems)++; + p = p->prev; + } + + return p; +} + diff --git a/tools/wrc/readres.c b/tools/wrc/readres.c index c2fdc6d7120..8fcb3c739d8 100644 --- a/tools/wrc/readres.c +++ b/tools/wrc/readres.c @@ -108,6 +108,7 @@ enum res_e res_type_from_id(name_id_t *nid) case WRC_RT_GROUP_CURSOR: return res_curg; case WRC_RT_GROUP_ICON: return res_icog; case WRC_RT_VERSION: return res_ver; + case WRC_RT_TOOLBAR: return res_toolbar; default: case WRC_RT_DLGINCLUDE: diff --git a/tools/wrc/utils.c b/tools/wrc/utils.c index 7d1b67e5136..55ce0af29b0 100644 --- a/tools/wrc/utils.c +++ b/tools/wrc/utils.c @@ -137,7 +137,7 @@ char *dup_basename(const char *name, const char *ext) /* +4 for later extension and +1 for '\0' */ base = (char *)xmalloc(namelen +4 +1); strcpy(base, name); - if(!stricmp(name + namelen-extlen, ext)) + if(!strcasecmp(name + namelen-extlen, ext)) { base[namelen - extlen] = '\0'; } @@ -184,7 +184,7 @@ int string_compare(const string_t *s1, const string_t *s2) { if(s1->type == str_char && s2->type == str_char) { - return stricmp(s1->str.cstr, s2->str.cstr); + return strcasecmp(s1->str.cstr, s2->str.cstr); } else { @@ -213,7 +213,7 @@ int wstricmp(const short *s1, const short *s2) { char *cs1 = dupwstr2cstr(s1); char *cs2 = dupwstr2cstr(s2); - int retval = stricmp(cs1, cs2); + int retval = strcasecmp(cs1, cs2); free(cs1); free(cs2); warning("Comparing unicode strings without case -> converting to ascii"); @@ -248,15 +248,3 @@ char *dupwstr2cstr(const short *str) return cs; } -#ifndef HAVE_STRICMP -int stricmp(const char *s1, const char *s2) -{ - while(*s1 && *s2 && !(toupper(*s1) - toupper(*s2))) - { - s1++; - s2++; - } - return *s2 - *s1; -} -#endif - diff --git a/tools/wrc/utils.h b/tools/wrc/utils.h index e16613ac52c..6ddd10c035b 100644 --- a/tools/wrc/utils.h +++ b/tools/wrc/utils.h @@ -33,8 +33,4 @@ int wstricmp(const short *s1, const short *s2); char *dupwstr2cstr(const short *str); short *dupcstr2wstr(const char *str); -#ifndef HAVE_STRICMP -int stricmp(const char *s1, const char *s2); -#endif - #endif diff --git a/tools/wrc/wrc.h b/tools/wrc/wrc.h index 1201c6c7823..b634062f790 100644 --- a/tools/wrc/wrc.h +++ b/tools/wrc/wrc.h @@ -12,48 +12,13 @@ #include "wrctypes.h" #endif -#define WRC_VERSION "1.0.4" -#define WRC_RELEASEDATE "(10-Dec-1998)" +#define WRC_VERSION "1.0.8" +#define WRC_RELEASEDATE "(10-Jan-1999)" #define WRC_FULLVERSION WRC_VERSION " " WRC_RELEASEDATE /* Only used in heavy debugging sessions */ #define HEAPCHECK() -/* Memory/load flags */ -#define WRC_MO_MOVEABLE 0x0010 -#define WRC_MO_PURE 0x0020 -#define WRC_MO_PRELOAD 0x0040 -#define WRC_MO_DISCARDABLE 0x1000 - -/* Resource type IDs */ -#define WRC_RT_CURSOR (1) -#define WRC_RT_BITMAP (2) -#define WRC_RT_ICON (3) -#define WRC_RT_MENU (4) -#define WRC_RT_DIALOG (5) -#define WRC_RT_STRING (6) -#define WRC_RT_FONTDIR (7) -#define WRC_RT_FONT (8) -#define WRC_RT_ACCELERATOR (9) -#define WRC_RT_RCDATA (10) -#define WRC_RT_MESSAGETABLE (11) -#define WRC_RT_GROUP_CURSOR (12) -#define WRC_RT_GROUP_ICON (14) -#define WRC_RT_VERSION (16) -#define WRC_RT_DLGINCLUDE (17) -#define WRC_RT_PLUGPLAY (19) -#define WRC_RT_VXD (20) -#define WRC_RT_ANICURSOR (21) -#define WRC_RT_ANIICON (22) - -/* Default class type IDs */ -#define CT_BUTTON 0x80 -#define CT_EDIT 0x81 -#define CT_STATIC 0x82 -#define CT_LISTBOX 0x83 -#define CT_SCROLLBAR 0x84 -#define CT_COMBOBOX 0x85 - /* From wrc.c */ extern int debuglevel; #define DEBUGLEVEL_NONE 0x0000 diff --git a/tools/wrc/wrctypes.h b/tools/wrc/wrctypes.h index eebdb560645..1d81d947e48 100644 --- a/tools/wrc/wrctypes.h +++ b/tools/wrc/wrctypes.h @@ -21,6 +21,42 @@ #include "ver.h" #endif +/* Memory/load flags */ +#define WRC_MO_MOVEABLE 0x0010 +#define WRC_MO_PURE 0x0020 +#define WRC_MO_PRELOAD 0x0040 +#define WRC_MO_DISCARDABLE 0x1000 + +/* Resource type IDs */ +#define WRC_RT_CURSOR (1) +#define WRC_RT_BITMAP (2) +#define WRC_RT_ICON (3) +#define WRC_RT_MENU (4) +#define WRC_RT_DIALOG (5) +#define WRC_RT_STRING (6) +#define WRC_RT_FONTDIR (7) +#define WRC_RT_FONT (8) +#define WRC_RT_ACCELERATOR (9) +#define WRC_RT_RCDATA (10) +#define WRC_RT_MESSAGETABLE (11) +#define WRC_RT_GROUP_CURSOR (12) +#define WRC_RT_GROUP_ICON (14) +#define WRC_RT_VERSION (16) +#define WRC_RT_DLGINCLUDE (17) +#define WRC_RT_PLUGPLAY (19) +#define WRC_RT_VXD (20) +#define WRC_RT_ANICURSOR (21) +#define WRC_RT_ANIICON (22) +#define WRC_RT_TOOLBAR (241) + +/* Default class type IDs */ +#define CT_BUTTON 0x80 +#define CT_EDIT 0x81 +#define CT_STATIC 0x82 +#define CT_LISTBOX 0x83 +#define CT_SCROLLBAR 0x84 +#define CT_COMBOBOX 0x85 + /* Binary resource structure */ #define RES_BLOCKSIZE 512 @@ -112,6 +148,8 @@ enum res_e { res_anicur, /* Not implemented, no layout available */ res_aniico, /* Not implemented, no layout available */ + res_toolbar = WRC_RT_TOOLBAR, /* 241 */ + res_menex = 256 + 4, res_dlgex, res_usr, @@ -419,6 +457,22 @@ typedef struct accelerator { event_t *events; } accelerator_t; +/* Toolbar structures */ +typedef struct toolbar_item { + struct toolbar_item *next; + struct toolbar_item *prev; + int id; +} toolbar_item_t; + +typedef struct toolbar { + DWORD memopt; + lvc_t lvc; + int button_width; + int button_height; + int nitems; + toolbar_item_t *items; +} toolbar_t; + /* A top-level resource node */ typedef struct resource { struct resource *next; @@ -441,6 +495,7 @@ typedef struct resource { messagetable_t *msg; rcdata_t *rdt; stringtable_t *stt; + toolbar_t *tbt; user_t *usr; versioninfo_t *ver; void *overlay; /* To catch all types at once... */ diff --git a/tools/wrc/writeres.c b/tools/wrc/writeres.c index b87f46586d1..2e1714328a4 100644 --- a/tools/wrc/writeres.c +++ b/tools/wrc/writeres.c @@ -299,7 +299,7 @@ int compare_name_id(name_id_t *n1, name_id_t *n2) if(n1->name.s_name->type == str_char && n2->name.s_name->type == str_char) { - return stricmp(n1->name.s_name->str.cstr, n2->name.s_name->str.cstr); + return strcasecmp(n1->name.s_name->str.cstr, n2->name.s_name->str.cstr); } else if(n1->name.s_name->type == str_unicode && n2->name.s_name->type == str_unicode) @@ -571,6 +571,7 @@ void count_resources(resource_t *top) void write_pe_segment(FILE *fp, resource_t *top) { int i; + int direntries; fprintf(fp, "\t.align\t4\n"); fprintf(fp, "%s%s:\n", prefix, _PEResTab); @@ -704,6 +705,9 @@ void write_pe_segment(FILE *fp, resource_t *top) } /* Write the resource table itself */ + fprintf(fp, "%s_ResourceDirectory:\n", prefix); + fprintf(fp, "\t.globl\t%s_ResourceDirectory\n", prefix); + direntries = 0; for(i = 0; i < rccount; i++) { @@ -746,6 +750,8 @@ void write_pe_segment(FILE *fp, resource_t *top) fprintf(fp, "\t.long\t%ld\n", codepage); /* Reserved */ fprintf(fp, "\t.long\t0\n"); + + direntries++; } free(namelabel); } @@ -753,9 +759,9 @@ void write_pe_segment(FILE *fp, resource_t *top) } fprintf(fp, "\t.align\t4\n"); - fprintf(fp, "%s_ResourceDirectorySize:\n", Underscore); - fprintf(fp, "\t.globl\t%s_ResourceDirectorySize\n", Underscore); - fprintf(fp, "\t.long\t. - %s%s\n", prefix, _PEResTab); + fprintf(fp, "%s_NumberOfResources:\n", prefix); + fprintf(fp, "\t.globl\t%s_NumberOfResources\n", prefix); + fprintf(fp, "\t.long\t%d\n", direntries); } /* @@ -988,7 +994,8 @@ void write_s_file(char *outname, resource_t *top) if(create_dir) { /* Add the size of the entire resource section for elf-dlls */ - fprintf(fo, "%s_ResourceSectionSize:\n", Underscore); + fprintf(fo, "%s_ResourceSectionSize:\n", prefix); + fprintf(fo, "\t.globl\t%s_ResourceSectionSize\n", prefix); fprintf(fo, "\t.long\t. - %s%s\n", prefix, _PEResTab); } } diff --git a/win32/console.c b/win32/console.c index aa9a17f08f1..f82afc46f81 100644 --- a/win32/console.c +++ b/win32/console.c @@ -567,7 +567,7 @@ static int CONSOLE_openpty(CONSOLE *console, char *name, static BOOL32 CONSOLE_make_complex(HANDLE32 handle,CONSOLE *console) { struct termios term; - char buf[30]; + char buf[30],*title; char c = '\0'; int status = 0; int i,xpid; @@ -611,6 +611,12 @@ static BOOL32 CONSOLE_make_complex(HANDLE32 handle,CONSOLE *console) /* enable mouseclicks */ sprintf(buf,"%c[?1001s%c[?1000h",27,27); WriteFile(handle,buf,strlen(buf),&xlen,NULL); + if (console->title) { + title = HeapAlloc(GetProcessHeap(),0,strlen("\033]2;\a")+1+strlen(console->title)); + sprintf(title,"\033]2;%s\a",console->title); + WriteFile(handle,title,strlen(title),&xlen,NULL); + HeapFree(GetProcessHeap(),0,title); + } return TRUE; } @@ -966,9 +972,7 @@ BOOL32 WINAPI ReadConsole32A( HANDLE32 hConsoleInput, ); CONSOLE_get_input(hConsoleInput); - /* FIXME: should this drain everything from the input queue and just - * put the keypresses in the buffer? Needs further thought. - */ + /* FIXME: should we read at least 1 char? The SDK does not say */ for (i=0;(inrofirs)&&(charsreadirs[i].EventType != KEY_EVENT) continue; @@ -977,6 +981,7 @@ BOOL32 WINAPI ReadConsole32A( HANDLE32 hConsoleInput, *xbuf++ = console->irs[i].Event.KeyEvent.uChar.AsciiChar; charsread++; } + /* SDK says: Drains all other input events from queue. */ CONSOLE_drain_input(console,i); if (lpNumberOfCharsRead) *lpNumberOfCharsRead = charsread; @@ -1034,9 +1039,27 @@ BOOL32 WINAPI ReadConsoleInput32A(HANDLE32 hConsoleInput, if (!console) { FIXME(console, "(%d,%p,%ld,%p), No console handle!\n",hConsoleInput, lpBuffer, nLength, lpNumberOfEventsRead); + + /* Indicate that nothing was read */ + *lpNumberOfEventsRead = 0; + return FALSE; } CONSOLE_get_input(hConsoleInput); + /* SDK: return at least 1 input record */ + while (!console->nrofirs) { + DWORD res; + + res=WaitForSingleObject(hConsoleInput,0); + switch (res) { + case STATUS_TIMEOUT: continue; + case 0: break; /*ok*/ + case WAIT_FAILED: return 0;/*FIXME: SetLastError?*/ + default: break; /*hmm*/ + } + CONSOLE_get_input(hConsoleInput); + } + if (nLength>console->nrofirs) nLength = console->nrofirs; memcpy(lpBuffer,console->irs,sizeof(INPUT_RECORD)*nLength); @@ -1081,11 +1104,13 @@ BOOL32 WINAPI SetConsoleTitle32A(LPCSTR title) } sprintf(titlestring,titleformat,title); - /* FIXME: hmm, should use WriteFile probably... */ - /*CONSOLE_Write(&console->header,titlestring,strlen(titlestring),&written,NULL);*/ - WriteFile(GetStdHandle(STD_OUTPUT_HANDLE),titlestring,strlen(titlestring),&written,NULL); - if (written == strlen(titlestring)) - ret =TRUE; + /* only set title for complex console (own xterm) */ + if (console->pid != -1) { + WriteFile(GetStdHandle(STD_OUTPUT_HANDLE),titlestring,strlen(titlestring),&written,NULL); + if (written == strlen(titlestring)) + ret =TRUE; + } else + ret = TRUE; HeapFree( GetProcessHeap(), 0, titlestring ); K32OBJ_DecCount(&console->header); return ret; @@ -1215,6 +1240,10 @@ BOOL32 WINAPI PeekConsoleInput32A(HANDLE32 hConsoleInput, if (!console) { FIXME(console,"(%d,%p,%ld,%p), No console handle passed!\n",hConsoleInput, pirBuffer, cInRecords, lpcRead); + + /* Indicate that nothing was read */ + *lpcRead = 0; + return FALSE; } TRACE(console,"(%d,%p,%ld,%p)\n",hConsoleInput, pirBuffer, cInRecords, lpcRead); diff --git a/win32/device.c b/win32/device.c index dcfdb38a2dd..9a6b1df9522 100644 --- a/win32/device.c +++ b/win32/device.c @@ -348,7 +348,7 @@ BOOL32 WINAPI DeviceIoControl(HANDLE32 hDevice, DWORD dwIoControlCode, { /* FIXME: Set appropriate error */ FIXME( win32, "Unimplemented control %ld for VxD device %s\n", - dwIoControlCode, dev->info->name ); + dwIoControlCode, dev->info ? dev->info->name : "???" ); } } else diff --git a/windows/dialog.c b/windows/dialog.c index 1f765cac81e..9a1ed9c1042 100644 --- a/windows/dialog.c +++ b/windows/dialog.c @@ -869,6 +869,7 @@ INT32 DIALOG_DoDialogBox( HWND32 hwnd, HWND32 owner ) } retval = dlgInfo->idResult; EnableWindow32( owner, TRUE ); + dlgInfo->flags |= DF_ENDING; /* try to stop it being destroyed twice */ DestroyWindow32( hwnd ); return retval; } diff --git a/windows/dinput.c b/windows/dinput.c index 85b2246538c..7e504ff0eb6 100644 --- a/windows/dinput.c +++ b/windows/dinput.c @@ -27,13 +27,11 @@ #include "windows.h" #include "winerror.h" #include "shell.h" -#include "ole.h" -#include "compobj.h" -#include "interfaces.h" #include "gdi.h" #include "heap.h" #include "win.h" #include "dinput.h" +#include "objbase.h" #include "debug.h" #include "message.h" diff --git a/windows/hook.c b/windows/hook.c index e7b530248cd..5261b6b8ad7 100644 --- a/windows/hook.c +++ b/windows/hook.c @@ -860,7 +860,12 @@ static HANDLE16 HOOK_SetHook( INT16 id, LPVOID proc, INT32 type, { if ((id == WH_JOURNALRECORD) || (id == WH_JOURNALPLAYBACK) || (id == WH_SYSMSGFILTER)) return 0; /* System-only hooks */ - if (!(hQueue = GetTaskQueue( hTask ))) return 0; + if (!(hQueue = GetTaskQueue( hTask ))) + { + /* FIXME: shouldn't this be done somewhere else? */ + if (hTask != GetCurrentTask()) return 0; + if (!(hQueue = GetFastQueue())) return 0; + } } /* Create the hook structure */ diff --git a/windows/queue.c b/windows/queue.c index 2ef76e88fbd..f83647acb9e 100644 --- a/windows/queue.c +++ b/windows/queue.c @@ -828,6 +828,13 @@ BOOL32 WINAPI SetMessageQueue32( INT32 size ) HQUEUE16 WINAPI InitThreadInput( WORD unknown, WORD flags ) { HQUEUE16 hQueue = GetTaskQueue( 0 ); + if ( !hQueue ) + { + /* Create task message queue */ + int queueSize = GetProfileInt32A( "windows", "DefaultQueueSize", 8 ); + SetMessageQueue32( queueSize ); + return GetTaskQueue( 0 ); + } FIXME( msg, "(%04X,%04X): should create thread-local message queue!\n", unknown, flags ); diff --git a/windows/sysmetrics.c b/windows/sysmetrics.c index 6b626a6ecd9..eb97bda5db1 100644 --- a/windows/sysmetrics.c +++ b/windows/sysmetrics.c @@ -18,6 +18,18 @@ short sysMetrics[SM_CMETRICS+1]; * SYSMETRICS_Init * * Initialisation of the system metrics array. + * + * Differences in return values between 3.1 and 95 apps under Win95 (FIXME ?): + * SM_CXVSCROLL x+1 x + * SM_CYHSCROLL x+1 x + * SM_CXDLGFRAME x-1 x + * SM_CYDLGFRAME x-1 x + * SM_CYCAPTION x+1 x + * SM_CYMENU x-1 x + * SM_CYFULLSCREEN x-1 x + * + * (collides with TWEAK_WineLook sometimes, + * so changing anything might be difficult) */ void SYSMETRICS_Init(void) { diff --git a/windows/win.c b/windows/win.c index 10b1612369c..e34bd6e7d78 100644 --- a/windows/win.c +++ b/windows/win.c @@ -1702,9 +1702,15 @@ LONG WINAPI SetWindowLong32A( HWND32 hwnd, INT32 offset, LONG newval ) * Do not use GWL_HWNDPARENT to reset the window's parent, use * SetParent() instead. * + * Win95: + * When offset is GWL_STYLE and the calling app's ver is 4.0, + * it sends WM_STYLECHANGING before changing the settings + * and WM_STYLECHANGED afterwards. + * App ver 4.0 can't use SetWindowLong to change WS_EX_TOPMOST. + * * BUGS * - * GWL_STYLE does not dispatch WM_STYLE_... messages. + * GWL_STYLE does not dispatch WM_STYLE... messages. * * CONFORMANCE * diff --git a/windows/winpos.c b/windows/winpos.c index a5fba131c7d..2593483fb22 100644 --- a/windows/winpos.c +++ b/windows/winpos.c @@ -1273,6 +1273,9 @@ BOOL16 WINAPI GetWindowPlacement16( HWND16 hwnd, WINDOWPLACEMENT16 *wndpl ) /*********************************************************************** * GetWindowPlacement32 (USER32.307) + * + * Win95: + * Fails if wndpl->length of Win95 (!) apps is invalid. */ BOOL32 WINAPI GetWindowPlacement32( HWND32 hwnd, WINDOWPLACEMENT32 *pwpl32 ) { @@ -1355,6 +1358,9 @@ BOOL16 WINAPI SetWindowPlacement16(HWND16 hwnd, const WINDOWPLACEMENT16 *wndpl) /*********************************************************************** * SetWindowPlacement32 (USER32.519) + * + * Win95: + * Fails if wndpl->length of Win95 (!) apps is invalid. */ BOOL32 WINAPI SetWindowPlacement32( HWND32 hwnd, const WINDOWPLACEMENT32 *pwpl32 ) { diff --git a/windows/winproc.c b/windows/winproc.c index 8ab0f546fc7..59a2675abe4 100644 --- a/windows/winproc.c +++ b/windows/winproc.c @@ -15,6 +15,8 @@ #include "debug.h" #include "spy.h" #include "commctrl.h" +#include "task.h" +#include "thread.h" /* Window procedure 16-to-32-bit thunk, * see BuildSpec16Files() in tools/build.c */ @@ -1080,6 +1082,17 @@ INT32 WINPROC_MapMsg16To32A( UINT16 msg16, WPARAM16 wParam16, UINT32 *pmsg32, case WM_NOTIFY: *plparam = (LPARAM)PTR_SEG_TO_LIN(*plparam); return 1; + case WM_ACTIVATEAPP: + if (*plparam) + { /* We need this when SetActiveWindow sends a Sendmessage16() to + a 32bit window. Might be superflous with 32bit interprocess + message queues. + */ + HTASK16 htask = (HTASK16) *plparam; + DWORD idThread = THDB_TO_THREAD_ID(((TDB*)GlobalLock16(htask))->thdb); + *plparam = (LPARAM) idThread; + } + return 1; case WM_ASKCBFORMATNAME: case WM_DEVMODECHANGE: case WM_PAINTCLIPBOARD: @@ -1763,6 +1776,7 @@ INT32 WINPROC_MapMsg32ATo16( HWND32 hwnd, UINT32 msg32, WPARAM32 wParam32, } return 0; + case WM_ACTIVATEAPP: case WM_ASKCBFORMATNAME: case WM_DEVMODECHANGE: case WM_PAINTCLIPBOARD: -- 2.11.4.GIT