Index: /tags/CWMM-0.3.0_GA/HISTORY
===================================================================
--- /tags/CWMM-0.3.0_GA/HISTORY	(revision 213)
+++ /tags/CWMM-0.3.0_GA/HISTORY	(revision 213)
@@ -0,0 +1,186 @@
+0.3.0GA
+- Got CDDB working again
+- Save debug/trap logs to LOGFILES
+- Update Spanish, German and Russian tranlations
+- Get all mediafldr_xx.inf file to build completely
+- Change Freedb to CDDB.
+- Cleanup some help menus
+- Lxlite and add headers back to all executable files
+ 
+
+0.3.0RC4
+- Fixed file identify code so the internal audio player will play MIDI files
+- Added a midiplayer INI key (ab.exe fails to play midis) also added to help
+- Removed remaining code added to block using TimidityMCD
+- Fixed an issue with duplicate "About" dialogs in the TW version of the 
+  media folder dialogs
+- Removed Audio editor from MIDI Open as menu 
+
+
+0.3.0RC3
+- Fixed the help file build so country, codepage and language are all picked up correctly
+- Fixed failure of M3U list to save and close properly
+- Added M3U and Media player specific help to their respective help menus
+- Fixed the creation of the non-English mediafldr_xx.inf files
+
+0.3.0RC2
+- Removed the configuration program
+- Added all available translations and fixed some codepage definition issues
+- Changes so mov avi and jpeg file are all played by a modern video player found in the PATH.
+- The mplayer in winos2 is no longer found when searching the path for mplayer.
+- Mplayer vio window starts minimize and both Mplayer and ffplay close when video finishes.
+- Updated mediafldr.inf to include new and missing ini entries under hidden features. 
+- Fixed the MMOS2.ini updating
+
+0.3.0RC1
+- Everything is now built with VAC 3.08
+- Add commands to make files to build the RU media folder help
+- Prevent CD tracks from being droped on launchpad and M3U lists 
+  Netlabs Ticket 19 (from Lars Erdmann)
+- Fix 2 traps (from Lars Erdmann)
+- Include all the language files in the package
+- Add code to open modern video formats from MMOS2 using mplayer/smplayer or
+  ffmpeg
+- Added a program to configure the ini settings
+
+0.2.9pre4 (9/28/23)
+-Correctly fix memory leak in the mmfolder draw code (from Lars Erdmann) 
+ AN ticket 2756 NL ticket 22
+-Remove stray @ in some About dialogs. AN Ticket 2947
+-Update server in CDDB.ini to one the actually exists (from Dave Yeo) 
+ AN Ticket 3539
+-Add a candidate CWMMConfig.exe to make it easier to update CWMM
+ ini settings. AN Ticket 2944
+
+0.2.9pre3 (9/21/23) 
+-Get CD Digital Audio working. Thanks Lars NL ticket 2 AN ticket 1991
+-Support modern video formats (requires installing FFMPEG or Mplayer/SMplayer)
+-Fixed memory leak in the mmfolder draw code AN ticket 2756 NL ticket 22
+-Fixed time being appended to title instead of replacing the last line AN ticket 2696
+-Got TimidityMCD working with CWMM 
+
+0.2.9pre2: (11.08.05)
+-Close confirmation dialog of media folder will be dismissed automatically after 60s (use INI key to change)
+-MM-find: app opens audio files in editor now (used to open default view and the folder)
+-MM-find: video files are opened in player. No opening of the folder anymore
+-MM-find: app loads NLV strings from resource DLL
+-MM-find: query system for user added audio extensions for insertion into the search dialog
+-MM-find: improved handling of image extensions
+-MM-find: added to tasklist
+-MM-find: added play controls for audio files
+-MM-find: save last visited audio directory
+-Helper apps (converter etc.) create their INI file in the users home directory now
+-MMAudio class claimed to support *.wav extension while MMWAV should be the only one doing that (audioext.rx)
+-MMVideo: associate extensions added by third party IO procs with it automatically (videoext.rx) 
+-MMVideo: defined type "Digital video"
+-MMMPG: associate extensions added by OpenMPEG with it automatically (mpegext.rx) 
+-Improvements to the build process of the helper apps
+-createcd.exe takes the name of created CD-folders from the resource DLL
+-CWCDFolder: improved sorting (hope so, never saw problems on my system)
+-CWCDFolder: No more hic up at start of track
+-MM classes: fixed boot hangs because of endless loops in *.rx files under some circumstances
+
+0.2.9pre1:
+-Don't show a message box if resource DLL can't be found.
+-Changed DLL finding algorithm. Should be more robust, when classes are improperly registered.
+-New method cwmmRequestBmpDeletion() for WPS-wizard to trigger background BMP deletion.
+-Help for audio stream class.
+-Close confirmation dialog of media folder is now modal to the folder
+-Audio information for shadows in media folders wasn't shown when linked object wasn't touched first.
+-Mediafolder refresh triggers new time calculation.
+-Stop menu item of audio stream objects didn't work.
+
+0.2.8:
+-Icon view removed for media folders.
+-Icon view page removed for media folders. This removes it also from CD folders which never supported icon view anyway.
+-Compact view improved.
+-Track information in switch list and titles.
+-Opening of Media folder wasn't possible when settings already open.
+-Fixed a memory leak for image files.
+-Fixed deadlock when copying image files in light table folders.
+-Background bitmap deletion of image files to give memory back to the system.
+-English distribution included german help file for the classes.
+-Audio objects stopped playing after a second if not started from a folder.
+-Workaround for WPS crash with Timidity. No, It's still not working with the classes.
+-Fixed possible crash with abstract objects in light table folders.
+-Fixed CD querying for LVM systems (not for dynamically attached USB drives yet).
+-Audio file scanning now stops when folder is closed.
+-No scanning for CD tracks.
+-Video player didn't work at all.
+-ID3 info for artist was overwritten with the album name when using setup strings.
+-Trap when Quicktime for OS/2 was installed during scanning of MP3 files.
+-Marking image files as invalid for the WPS when caused a trap.
+-Only create thumbs when image is visible in container. Esp. useful when WPS-Wizard is installed.
+-When first creating ID3 tags the genre was always set to 'blues'.
+-CD objects are no longer created automatically. This will fix most lock ups people experienced.
+-Slide show program for displaying the contents of one or more directories
+
+0.2.7b:
+-New creatobj.cmd.
+
+0.2.7
+-Renamed method cwmmAddWaveInformationPage() to cwmmAddAudioInformationPage().
+-Added container handle to parameter list of methods cwmmPlayTrack() and cwmmPauseTrack()
+-If several audio files in a folder are started at once they will be played consecutively. 
+-Image information in popup menu 
+-Added audio information for midi files in details view.
+-Audioplayer playback always started with default volume setting (70%).
+-Master volume item added to sys menu of audio player.
+-Language now derived from LANG setting not the country code.
+-URL of audio stream objects was truncated to 4 chars when reopening the settings.
+-Audio-Stream objects lost their type after changing settings.
+-Bitrate display for MP3 files if MMIOMP3 0.4.2 or above is installed.
+-Bitrate display for OGG files if MMIOOGG 0.3.1 or above is installed.
+-ID3 tag handling completely rewritten. Track information may be 256 bytes long per entry.
+ ID3 tags are handled separately now. 
+-Volume for audio files adjustable now. Volume menu no longer starts master volume.
+-Modified settings page handling for audio objects on CD
+-Added INI key to disable audio file scanning for certain drives.
+-Added INI key to disable ID3 tag reading for certain drives. 
+
+0.2.6
+-Audio extensions added in the MM configuration notebook are recognized.
+-createcd compiled with VAC
+-helper progs statically linked.
+-No template for CWMMDataFile.
+-New FLAC class.
+-New EA MMNUMAUDIOBYTES containing the number of audio bytes of the file.
+-M3U playlist editor failed using M3U lists created by Rockbox.
+-Play menu for M3U objects.
+-Hilighting of play and pause buttons during device sharing corrected 
+-You can't start more than 3 audio files at a time now, preventing problems when a whole folder of audio objects was accidently selected.
+-Support for converting to OGG-Vorbis. Any future write enabled audio IO-Proc will be automatically supported now.
+-Default audio player replaced
+-Opening of folders with image files is faster now
+-Image spacing in lighttable folders improved
+-Image converter dialog had german resources in the english language version (obviously nobody cared...).
+-Preview in image converter
+-PNG files are recognized as image files. Automatic support of future image IO procs.
+-PNG image class
+-Only one INI file for MM class helpers.
+
+0.2.5
+Media folder:
+-Popup menu on time control for changing display
+-New playlist editor
+-Shadows for fly over help
+
+MMClasses:
+-DLLs needed by specified players or editors weren't found if not in LIBPATH.
+-You may specify a different mp3 player
+-Fixed wrong icon size for standard classes in details view of light table folders.
+-Added support for animated folder icons in lightable folder
+-Templates were not drawn in light table folders icon view
+-Pause function for audio files
+-Fixed asscociations for image files.
+-Fixed image conversion.
+-Renamed REXX functions. The old names are still working but shouldn't be used longer.
+-Added new REXX function cwmmQueryImageInfo()
+-Added method cwmmQueryImageInfo().
+-ID3 tags of MP3 files weren't set when using setup strings. Only EAs were updated.
+-No more garbled characters with some players when reading the ID3 tags.
+-Black and white images are properly drawn in lightable folders
+
+JPEG IO procedure:
+-Procedure now accepts 8 bit input images.
+
Index: /tags/CWMM-0.3.0_GA/JPGPROC/FILE_ID.DIZ
===================================================================
--- /tags/CWMM-0.3.0_GA/JPGPROC/FILE_ID.DIZ	(revision 213)
+++ /tags/CWMM-0.3.0_GA/JPGPROC/FILE_ID.DIZ	(revision 213)
@@ -0,0 +1,22 @@
+JPEG IO-procedure V0.1.0 (freeware)
+(C) Chris Wohlgemuth 2002
+
+http://www.geocities.com/SiliconValley/Sector/5785/
+http://www.os2world.com/cdwriting
+
+This IO-procedure is a drop in replacement for the
+image file loading/writing procedure coming with MMOS/2.
+It supports progressive JPEG files which are not
+loadable with the default DLL.
+Full source included.
+
+
+Prerequsites:
+Warp 4 and above (not tested with Warp 3 but will probably work)
+MMOS/2
+
+
+License:
+Freeware under a BSD-style license. See Readme.txt for
+more.
+
Index: /tags/CWMM-0.3.0_GA/JPGPROC/Readme.txt
===================================================================
--- /tags/CWMM-0.3.0_GA/JPGPROC/Readme.txt	(revision 213)
+++ /tags/CWMM-0.3.0_GA/JPGPROC/Readme.txt	(revision 213)
@@ -0,0 +1,111 @@
+JPEG-IO procedure V0.1.0, 13.07.2002
+------------------------------------
+
+This procedure is a drop in replacement for
+the JPEG procedure coming with MMOS/2. It supports
+base JPEG image files (as the IO procedure provided
+with MMOS/2) and also progressive ones. IO procedures
+are used to load and write different image files. For
+example the WPS uses IO procedures to load images for
+folder backgrounds or for display in the image viewer.
+
+The actual loading of the image file is done using
+gbm.dll a free image manipulation library. See credits
+for more information about it. The JPEG support is based
+on work of the Independent JPEG Group. See credits for
+more information.
+
+
+Installation
+------------
+
+Make a copy of the JPEGIO.DLL in MMOS2\DLL and copy
+JPEGIO.DLL, gbm.dll and JPEGIO.SYM to MMOS2\DLL. After
+reboot the new IO procedure will be used by the system.
+If the default DLL is locked you have to boot from a
+maintenance partition or floppy disks.
+
+
+How to compile
+--------------
+
+You need VAC++ V3.08 (or CSet/2). For your convenience the
+source of GBM is included. There's no need to rebuild GBM if
+you want to compile the IO procedure. See the documentation
+for instructions for building GBM.
+
+
+License
+-------
+
+/*
+ * Copyright (c) Chris Wohlgemuth 2002
+ * All rights reserved.
+ *
+ * http://www.geocities.com/SiliconValley/Sector/5785/
+ * http://www.os2world.com/cdwriting
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. The authors name may not be used to endorse or promote products
+ *    derived from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ *
+ */
+
+
+Author
+------
+
+This IO procedure is
+
+Copyright (c) Chris Wohlgemuth 2002
+
+   http://www.os2world.com/cdwriting
+   http://www.geocities.com/SiliconValley/Sector/5785/
+
+
+Credits
+-------
+
+-GBM
+
+GBM was written by Andy Key. 
+
+The GBM packages are best obtained via the links on the home page :- 
+
+     http://www.interalpha.net/customer/nyangau/
+
+For more information about GBM see the files gbm.htm and gbmsrc.htm in the gbmsrc
+directory.
+
+
+-JPEG support
+
+GBM is based in part on the work of the Independent JPEG Group. 
+
+The Independant JPEG Group have generously allowed others to use their source code to their JPEG handling library.
+The only condition of use is that the IJG must be credited for their work. Try looking for this library at :- 
+
+     ftp://sun2.urz.uni-heidelberg.de/pub/simtel/graphics/jpegsr6a.zip. 
+     ftp://ftp.simtel.net/pub/simtelnet/msdos/graphics/jpegsr6a.zip. 
+     http://sunsite.doc.ic.ac.uk/computing/systems/ibmpc/simtel/msdos/graphics/jpegsr6a.zip. 
+
+
Index: /tags/CWMM-0.3.0_GA/JPGPROC/source/def.tpl
===================================================================
--- /tags/CWMM-0.3.0_GA/JPGPROC/source/def.tpl	(revision 213)
+++ /tags/CWMM-0.3.0_GA/JPGPROC/source/def.tpl	(revision 213)
@@ -0,0 +1,26 @@
+# Note: lines starting with '#' are comments.
+
+[DESCRIPTION]
+JPEG MMOS2 Plugin
+
+[COPYRIGHT]
+(c) C. Wohlgemuth 2001-2005 Netlabs CWMM Team 2023
+
+[AUTHOR]
+Netlabs CWMM Team
+
+[NAME]
+# This is the NAME xxx WINDOWAPI|etc line in the def file.
+# Important: it specifies the internal name of the program. Don't leave out!
+LIBRARY JPEGIO INITINSTANCE TERMINSTANCE
+
+[BUILDMACHINE]
+Zobopeep
+
+[OTHER]
+# Add all the lines here you want to have at the end of the generated DEF file
+DATA MULTIPLE NONSHARED
+SEGMENTS
+   shardata CLASS 'DATA' SHARED
+EXPORTS
+   IOProc_Entry
Index: /tags/CWMM-0.3.0_GA/JPGPROC/source/gbm.h
===================================================================
--- /tags/CWMM-0.3.0_GA/JPGPROC/source/gbm.h	(revision 213)
+++ /tags/CWMM-0.3.0_GA/JPGPROC/source/gbm.h	(revision 213)
@@ -0,0 +1,191 @@
+/*
+
+gbm.h - Generalised Bitmap Module
+
+Data is stored as an array of lines.
+Lines are stored with bottom line first, moving upwards.
+Each line is an array of pixels, leftmost first.
+Lines are padded to be a multiple of a dword long.
+Palettised pixels are either a 1 bit, 4 bit, or 8 bit indexes.
+Alternately a B, G, R triple in that order is stored.
+This format exactly matches the format used by OS/2 and Windows bitmaps.
+
+One notable point: a 1 in a 1bpp image denotes colour 1, as found by
+looking at palette entry 1. Data is not inversed when passed to and from GBM.
+
+This interface file provides access to routines for reading and writing
+bitmaps in a variety of image file formats.
+
+Normally file I/O is done using lseek,read and write. Occasionally GBM
+needs to access additional files, and it uses open and close to do this.
+Sometimes it needs to create a new file, and GBM uses create and close
+for this. The 'create' function is an invokation of open with
+O_CREAT|O_TRUNC combined with the mode flags it is passed, and
+S_IREAD|S_IWRITE passed as the additional optional parameter.
+
+You can trick GBM into using your own versions of open, create, close,
+lseek, read and write routines, by calling gbm_io_setup.
+
+One example use of this is that the file descriptor could then be an index
+into a array of pointers to C++ iostreams, thus allowing GBM to read and
+write file data to and from memory.
+
+On some platforms, the GBM file I/O library may be provided in DLL form.
+Therefore it can have its own C run time library, and on some platforms
+file descriptors obtained by an executable do not make sense to the
+C run time which is a part of the DLL. Hence GBM will be unable to use
+the file descriptor. One solution is to use gbm_io_setup to get the GBM
+library to call back into the calling application and use its C run time.
+Another solution is to have the application use the GBM libraries C run
+time to open the file - this is made possible via the gbm_io_ routines.
+This is the easier solution, and is used by the sample GBM programs.
+The particular offending platform is Visual C++ on Windows NT, everything
+works fine for VisualAge C++ on OS/2.
+
+gbm_read_header shall seek to the start of the stream indentified by the
+file descriptor argument and then shall invoke the bitmap header reader
+routine identified by the format type variable.
+
+gbm_read_palette may only be legally invoked after an immediately
+preceeding gbm_read_header.
+
+gbm_read_data may only be legally invoked after an immediately preceeding
+gbm_read_palette. In the case of a 24bpp file (which therefore has no
+palette), gbm_read_data is additionally allowed to follow a gbm_read_header.
+
+*/
+
+#ifndef GBM_H
+#define	GBM_H
+
+#ifndef BOOLEAN_DEFINED
+#define	BOOLEAN_DEFINED
+typedef	int BOOLEAN;
+#define	TRUE  1
+#define	FALSE 0
+#endif
+
+#ifndef BASICTYPES_DEFINED
+#define	BASICTYPES_DEFINED
+typedef unsigned  char  byte;
+typedef unsigned short  word;
+typedef unsigned  long dword;
+#endif
+
+typedef int GBM_ERR;
+#define	GBM_ERR_OK		((GBM_ERR) 0)
+#define	GBM_ERR_MEM		((GBM_ERR) 1)
+#define	GBM_ERR_NOT_SUPP	((GBM_ERR) 2)
+#define	GBM_ERR_BAD_OPTION	((GBM_ERR) 3)
+#define	GBM_ERR_NOT_FOUND	((GBM_ERR) 4)
+#define	GBM_ERR_BAD_MAGIC	((GBM_ERR) 5)
+#define	GBM_ERR_BAD_SIZE	((GBM_ERR) 6)
+#define	GBM_ERR_READ		((GBM_ERR) 7)
+#define	GBM_ERR_WRITE		((GBM_ERR) 8)
+#define	GBM_ERR_BAD_ARG		((GBM_ERR) 9)
+
+#define	GBM_FT_R1		0x0001
+#define	GBM_FT_R4		0x0002
+#define	GBM_FT_R8		0x0004
+#define	GBM_FT_R24		0x0008
+#define	GBM_FT_W1		0x0010
+#define	GBM_FT_W4		0x0020
+#define	GBM_FT_W8		0x0040
+#define	GBM_FT_W24		0x0080
+
+typedef struct
+	{
+	char *short_name;		/* Eg: "Targa"                       */
+	char *long_name;		/* Eg: "Truevision Targa / Vista"    */
+	char *extensions;		/* Eg: "TGA VST"                     */
+	int flags;			/* What functionality exists         */
+	} GBMFT;
+
+typedef struct { byte r, g, b; } GBMRGB;
+
+#define	PRIV_SIZE 2000
+
+typedef struct
+	{
+	int w, h, bpp;			/* Bitmap dimensions                 */
+	byte priv[PRIV_SIZE];		/* Private internal buffer           */
+	} GBM;
+
+#ifndef _GBM_
+
+#if defined(OS2)
+#define	GBMEXPORT
+#define	GBMENTRY _Optlink
+#elif defined(WIN32)
+#define	GBMEXPORT __declspec(dllexport)
+#define	GBMENTRY __stdcall
+#elif defined(DOS32)
+#define	GBMEXPORT
+#define	GBMENTRY __export _cdecl
+#else
+#define	GBMEXPORT
+#define	GBMENTRY
+#endif
+
+GBMEXPORT GBM_ERR GBMENTRY gbm_init(void);
+GBMEXPORT GBM_ERR GBMENTRY gbm_deinit(void);
+
+GBMEXPORT GBM_ERR GBMENTRY gbm_io_setup(
+	int  (*open  )(const char *fn, int mode),
+	int  (*create)(const char *fn, int mode),
+	void (*close )(int fd),
+	long (*lseek )(int fd, long pos, int whence),
+	int  (*read  )(int fd, void *buf, int len),
+	int  (*write )(int fd, const void *buf, int len)
+	);
+
+GBMEXPORT int  GBMENTRY gbm_io_open  (const char *fn, int mode);
+GBMEXPORT int  GBMENTRY gbm_io_create(const char *fn, int mode);
+GBMEXPORT void GBMENTRY gbm_io_close (int fd);
+GBMEXPORT long GBMENTRY gbm_io_lseek (int fd, long pos, int whence);
+GBMEXPORT int  GBMENTRY gbm_io_read  (int fd, void *buf, int len);
+GBMEXPORT int  GBMENTRY gbm_io_write (int fd, const void *buf, int len);
+
+GBMEXPORT GBM_ERR GBMENTRY gbm_query_n_filetypes(int *n_ft);
+GBMEXPORT GBM_ERR GBMENTRY gbm_query_filetype(int ft, GBMFT *gbmft);
+GBMEXPORT GBM_ERR GBMENTRY gbm_guess_filetype(const char *fn, int *ft);
+
+GBMEXPORT GBM_ERR GBMENTRY gbm_read_header(const char *fn, int fd, int ft, GBM *gbm, const char *opt);
+GBMEXPORT GBM_ERR GBMENTRY gbm_read_palette(int fd, int ft, GBM *gbm, GBMRGB *gbmrgb);
+GBMEXPORT GBM_ERR GBMENTRY gbm_read_data(int fd, int ft, GBM *gbm, byte *data);
+GBMEXPORT GBM_ERR GBMENTRY gbm_write(const char *fn, int fd, int ft, const GBM *gbm, const GBMRGB *gbmrgb, const byte *data, const char *opt);
+
+GBMEXPORT const char * GBMENTRY gbm_err(GBM_ERR rc);
+
+GBMEXPORT int     GBMENTRY gbm_version(void);
+
+#ifdef OS2
+/*...s_System entrypoints:0:*/
+/* For GBM.DLL to be callable from IBM Smalltalk under OS/2, the entrypoints
+   must be of _System calling convention. These veneers help out here.
+   I can't just change the usual entrypoints because people depend on them.
+   For portability, avoid these entrypoints, use the gbm_ ones. */
+
+GBM_ERR _System Gbm_init(void);
+GBM_ERR _System Gbm_deinit(void);
+int     _System Gbm_io_open(const char *fn, int mode);
+int     _System Gbm_io_create(const char *fn, int mode);
+void    _System Gbm_io_close(int fd);
+long    _System Gbm_io_lseek(int fd, long pos, int whence);
+int     _System Gbm_io_read (int fd, void *buf, int len);
+int     _System Gbm_io_write(int fd, const void *buf, int len);
+GBM_ERR _System Gbm_query_n_filetypes(int *n_ft);
+GBM_ERR	_System Gbm_guess_filetype(const char *fn, int *ft);
+GBM_ERR _System Gbm_query_filetype(int ft, GBMFT *gbmft);
+GBM_ERR _System Gbm_read_header(const char *fn, int fd, int ft, GBM *gbm, const char *opt);
+GBM_ERR _System Gbm_read_palette(int fd, int ft, GBM *gbm, GBMRGB *gbmrgb);
+GBM_ERR _System Gbm_read_data(int fd, int ft, GBM *gbm, byte *data);
+GBM_ERR _System Gbm_write(const char *fn, int fd, int ft, const GBM *gbm, const GBMRGB *gbmrgb, const byte *data, const char *opt);
+const char * _System Gbm_err(GBM_ERR rc);
+int     _System Gbm_version(void);
+/*...e*/
+#endif
+
+#endif
+
+#endif
Index: /tags/CWMM-0.3.0_GA/JPGPROC/source/iotest.c
===================================================================
--- /tags/CWMM-0.3.0_GA/JPGPROC/source/iotest.c	(revision 213)
+++ /tags/CWMM-0.3.0_GA/JPGPROC/source/iotest.c	(revision 213)
@@ -0,0 +1,256 @@
+/*
+ * Copyright (c) Chris Wohlgemuth 2002 
+ * All rights reserved.
+ *
+ * http://www.geocities.com/SiliconValley/Sector/5785/
+ * http://www.os2world.com/cdwriting
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. The authors name may not be used to endorse or promote products
+ *    derived from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ *
+ */
+#define INCL_DOSERRORS
+#define INCL_DOSMODULEMGR
+#define INCL_DOSPROCESS
+#define INCL_DOSSEMAPHORES
+#define INCL_DOSMEMMGR
+#define INCL_GPI
+#define INCL_GPICONTROL
+#define INCL_GPILCIDS
+#define INCL_GPIMETAFILES
+#define INCL_GPIPRIMITIVES
+#define INCL_GPIREGIONS
+#define INCL_PM
+#define INCL_WIN
+#define INCL_WINDIALOGS
+#define INCL_WINERRORS
+#define INCL_WINFRAMEMGR
+#define INCL_WINHELP
+#define INCL_WINMENUS
+#define INCL_WINMESSAGEMGR
+#define INCL_WINMLE
+#define INCL_WINPOINTERS
+#define INCL_WINSTDDLGS
+#define INCL_WINSTDFILE
+#define INCL_WINSTDSLIDER
+#define INCL_WINSWITCHLIST
+#define INCL_WINSYS
+#define INCL_WINTIMER
+#define INCL_WINWINDOWMGR
+
+#include <os2.h>
+#include <stdio.h>
+#include <string.h>
+#include <malloc.h>
+#include "mmioos2.h"
+
+char pszFileName[]="";
+
+int main()
+{
+    HBITMAP       hbm;
+    MMIOINFO      mmioinfo;
+    MMFORMATINFO  mmFormatInfo;
+    HMMIO         hmmio;
+    ULONG         ulImageHeaderLength;
+    MMIMAGEHEADER mmImgHdr;
+    ULONG         ulBytesRead;
+    ULONG         dwNumRowBytes;
+    PBYTE         pRowBuffer;
+    ULONG         dwRowCount;
+    SIZEL         ImageSize;
+    ULONG         dwHeight, dwWidth;
+    SHORT          wBitCount;
+    FOURCC        fccStorageSystem;
+    ULONG         dwPadBytes;
+    ULONG         dwRowBits;
+    ULONG         ulReturnCode;
+    ULONG         dwReturnCode;
+    HBITMAP       hbReturnCode;
+    LONG          lReturnCode;
+    FOURCC        fccIOProc;
+
+#if 0
+    CHAR          szBuffer[ sizeof( FOURCC ) + MAX_FILENAME_SIZE + 4 ];
+    LONG          lNumIOProcs;
+    MMFORMATINFO  mmFormatInfo;
+    PMMFORMATINFO pmmFormatInfoArray;
+    PSZ           pszFourccString;
+    ULONG         ulReturnCode;
+    LONG          lFormatsRead;
+    LONG          index;
+    LONG          lBytesRead;
+#endif
+
+    printf("in Main\n");
+    ulReturnCode = mmioIdentifyFile ( pszFileName,
+                                      0L,
+                                      &mmFormatInfo,
+                                      &fccStorageSystem,
+                                      0L,
+                                      0L);
+
+    /*
+     *  If this file was NOT identified, then this function won't
+     *  work, so return an error by indicating an empty bitmap.
+     */
+
+    if ( ulReturnCode == MMIO_ERROR )
+    {
+      printf("Can't identify file...\n");
+         return (0L);
+    }
+
+    /*
+     *  If mmioIdentifyFile did not find a custom-written IO proc which
+     *  can understand the image file, then it will return the DOS IO Proc
+     *  info because the image file IS a DOS file.
+     */
+
+    if( mmFormatInfo.fccIOProc == FOURCC_DOS )
+    {
+
+      printf("Image file could not be interpreted by any permanently or temporarily installed IO procedures.\n");
+         return ( 0L );
+    }
+
+    /*
+     *  Ensure this is an IMAGE IOproc, and that it can read
+     *  translated data
+     */
+
+    if ( (mmFormatInfo.ulMediaType != MMIO_MEDIATYPE_IMAGE) ||
+         ((mmFormatInfo.ulFlags & MMIO_CANREADTRANSLATED) == 0) )
+    {
+      printf("No IMAGE IO Procedures exist which can translate the data in the image file specified.");
+         return (0L);
+    }
+    else
+    {
+         fccIOProc = mmFormatInfo.fccIOProc;
+    }
+
+    /* Clear out and initialize mminfo structure */
+    
+    memset ( &mmioinfo,
+             0L,
+             sizeof ( MMIOINFO ) );
+    
+    mmioinfo.fccIOProc = fccIOProc;
+    mmioinfo.ulTranslate = MMIO_TRANSLATEHEADER | MMIO_TRANSLATEDATA;
+    
+    hmmio = mmioOpen ( (PSZ) pszFileName,
+                       &mmioinfo,
+                       MMIO_READ | MMIO_DENYWRITE | MMIO_NOIDENTIFY );
+    
+    if ( ! hmmio )
+      {
+        /* If file could not be opened, return with error */
+        printf("File can't be opened!\n");
+        return (0L);
+    }
+
+    dwReturnCode = mmioQueryHeaderLength ( hmmio,
+                                         (PLONG)&ulImageHeaderLength,
+                                           0L,
+                                           0L);
+
+    if ( ulImageHeaderLength != sizeof ( MMIMAGEHEADER ) )
+    {
+         /* We have a problem.....possibly incompatible versions */
+      printf("Error in mmioQueryHeaderLength ()\n");
+         ulReturnCode = mmioClose (hmmio, 0L);
+         return (0L);
+    }
+
+    ulReturnCode = mmioGetHeader ( hmmio,
+                                   &mmImgHdr,
+                                   (LONG) sizeof ( MMIMAGEHEADER ),
+                                   (PLONG)&ulBytesRead,
+                                   0L,
+                                   0L);
+
+    if ( ulReturnCode != MMIO_SUCCESS )
+    {
+         /* Header unavailable */
+      printf("Can't get header!\n");
+         ulReturnCode = mmioClose (hmmio, 0L);
+
+         return (0L);
+    }
+
+    /*
+     *  Determine the number of bytes required, per row.
+     *      PLANES MUST ALWAYS BE = 1
+     */
+
+    dwHeight = mmImgHdr.mmXDIBHeader.BMPInfoHeader2.cy;
+    dwWidth = mmImgHdr.mmXDIBHeader.BMPInfoHeader2.cx;
+    wBitCount = mmImgHdr.mmXDIBHeader.BMPInfoHeader2.cBitCount;
+    dwRowBits = dwWidth * mmImgHdr.mmXDIBHeader.BMPInfoHeader2.cBitCount;
+    dwNumRowBytes = dwRowBits >> 3;
+
+    /*
+     *  Account for odd bits used in 1bpp or 4bpp images that are
+     *  NOT on byte boundaries.
+     */
+
+    if ( dwRowBits % 8 )
+    {
+         dwNumRowBytes++;
+    }
+
+    /*
+     *  Ensure the row length in bytes accounts for byte padding.
+     *  All bitmap data rows must are aligned on LONG/4-BYTE boundaries.
+     *  The data FROM an IOProc should always appear in this form.
+     */
+
+    dwPadBytes = ( dwNumRowBytes % 4 );
+
+    if ( dwPadBytes )
+    {
+         dwNumRowBytes += 4 - dwPadBytes;
+    }
+
+    /* Allocate space for ONE row of pels */
+
+    if ( DosAllocMem( (PPVOID)&pRowBuffer,
+                      (ULONG)dwNumRowBytes,
+                      fALLOC))
+    {
+         ulReturnCode = mmioClose (hmmio, 0L);
+
+         printf("No memory!!\n");
+         return(0L);
+    }
+
+
+  printf("Done\n");
+  return 0;
+}
+
+
+
+
+
Index: /tags/CWMM-0.3.0_GA/JPGPROC/source/jpgfunc.c
===================================================================
--- /tags/CWMM-0.3.0_GA/JPGPROC/source/jpgfunc.c	(revision 213)
+++ /tags/CWMM-0.3.0_GA/JPGPROC/source/jpgfunc.c	(revision 213)
@@ -0,0 +1,288 @@
+/*
+ * Copyright (c) Chris Wohlgemuth 2002
+ * All rights reserved.
+ *
+ * http://www.geocities.com/SiliconValley/Sector/5785/
+ * http://www.os2world.com/cdwriting
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. The authors name may not be used to endorse or promote products
+ *    derived from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ *
+ */
+
+/************************************************************************/
+/* Put all #defines here                                                */
+/************************************************************************/
+
+#define INCL_32                         /* force 32 bit compile */
+#define INCL_GPIBITMAPS
+#define INCL_DOSFILEMGR
+#define INCL_DOSRESOURCES
+#define INCL_DOSMODULEMGR
+#define INCL_WIN
+#define INCL_GPI
+#define INCL_PM
+
+/************************************************************************/
+/* Put all #includes here                                               */
+/************************************************************************/
+
+#include <limits.h>
+#include <os2.h>
+#include <string.h>
+#include <stdlib.h>
+#include <os2medef.h>
+#include <mmioos2.h>
+#include "jpgproc.h"
+
+
+
+/*************************************************************************************
+ * Routine is called on each DLL instantiation and termination.
+ * Caller assures that no two instances execute this code
+ * at the same time.
+ *************************************************************************************/
+/*************************************************************************************
+ * Variable holds DLL module handle.  Gets set at initialization.
+ * Data area is separate for each using process, so this value
+ * could be different (or same) per process.
+ *************************************************************************************/
+HMODULE hModuleHandle;
+
+
+ULONG APIENTRY _DLL_InitTerm(ULONG modhandle,ULONG flag);
+int _CRT_init(void);
+void _CRT_term(void);
+
+ULONG APIENTRY _DLL_InitTerm (ULONG hModHandle, ULONG fTerm)
+{
+   hModuleHandle = hModHandle;  /* Remember for NLS lookup */
+   if (!fTerm) {
+      if (_CRT_init())
+         return (0L);
+   } /* endif */
+   else {
+      _CRT_term();
+   }
+
+   return (1L);                 /* Success */
+} /* DLL_InitTerm */
+
+
+/**************************************************************************
+ *   GetFormatString                                                     **
+ **************************************************************************
+ *
+ * ARGUMENTS:
+ *
+ *     lSearchId         - Table search key
+ *     pszFormatString   - Address where to return string.
+ *                         If null, then string is not returned.
+ *     lBytes            - Number of bytes to copy.
+ *
+ * RETURN:
+ *
+ *     Returns 0 if string not found, or the number of characters (bytes)
+ *     copied to the callers buffer.
+ *     Note, returned string is not ASCII nul terminated
+ *
+ * DESCRIPTION:
+ *
+ *     This function will retrieve the format string for the specified
+ *     IOProc from the resource file that contains the strings.
+ *
+ ***************************************************************************/
+LONG GetFormatString (LONG lSearchId,
+                      PSZ  pszFormatString,   /* Null, or dest address     */
+                      LONG lBytes)            /* Caller provided maximum   */
+{
+   PVOID   pResourceData;
+   CHAR    *pTemp;
+   LONG    lStringLen;      /* Length of format string  */
+   LONG    lRetVal = 0;     /* Function return value    */
+   LONG    lSearchTemp;
+
+   if (DosGetResource(hModuleHandle,
+                      RT_RCDATA,
+                      MMOTION_IOPROC_NAME_TABLE,
+                      &pResourceData))
+      {
+      return (MMIO_ERROR);
+      }
+
+   /*
+    * The resource table is of the form : FOURCC String\0
+    * Loop until a match is found, then return the string.
+    * Copy up to the number of bytes specified.
+    */
+
+   lStringLen = 0;
+   pTemp = (CHAR *)pResourceData;
+
+   while (pTemp)
+      {
+      memmove(&lSearchTemp, pTemp, sizeof(LONG));
+
+      if (lSearchTemp == 0L)
+         {
+         break;  /* End of table, search item not found */
+         }
+
+      if (lSearchTemp == lSearchId)   /* Search item found?               */
+         {
+         pTemp += sizeof(LONG);       /* Bypass numeric search id         */
+         lStringLen = strlen(pTemp);  /* Determine length of found string */
+         if (lStringLen >= lBytes)    /* Truncate, if necessary           */
+            {
+            if (lBytes > 0)
+               lStringLen = lBytes;   /* Number of characters to return   */
+            else
+               {
+               /* Callers buffer has zero size.  Cannot return any data   */
+               lRetVal = 0;           /* Size of returned data            */
+               break;                 /* Done searching                   */
+               }
+            }
+         if (pszFormatString != NULL)
+            {
+            memcpy(pszFormatString, pTemp, lStringLen); /* Copy string to caller */
+            }
+         lRetVal = lStringLen;        /* Function return value            */
+         break;                       /* We're done searching             */
+         }
+
+      pTemp += sizeof(FOURCC);
+      pTemp += (strlen(pTemp) + 1);   /* Advance to next search key       */
+      }
+
+   DosFreeResource( pResourceData );
+
+   return (lRetVal);  /* Zero or strlen */
+}
+
+
+/**************************************************************************
+ *   GetFormatStringLength                                               **
+ **************************************************************************
+ *
+ * ARGUMENTS:
+ *
+ *     lSearchId         - Table search key
+ *     plNameLength      - Address where to return string length.
+ *
+ * RETURN:
+ *
+ *     Length of the format string not including the terminating '\0'.
+ *     That is, the same value as would be returned from strlen().
+ *
+ * DESCRIPTION:
+ *
+ *     This function will retrieve the length of the format string
+ *     for the specified IOProc from the resource file that contains
+ *     the strings.
+ *
+ ***************************************************************************/
+LONG GetFormatStringLength (LONG  lSearchId,
+                            PLONG plNameLength)
+{
+   LONG  lStringSize;
+   LONG  lRetVal;
+
+   lStringSize = GetFormatString (lSearchId, NULL, LONG_MAX);
+   if (lStringSize > 0)             /* String found?                      */
+      {
+      *plNameLength = lStringSize;  /* yes, return strlen                 */
+      lRetVal = 0;                  /* and indicate success to caller     */
+      }
+   else
+      {
+      *plNameLength = 0;            /* no, error.  Return zero for length */
+      lRetVal = lStringSize;        /* and error code from called routine */
+      }
+   return (lRetVal);
+}
+
+
+/**************************************************************************
+ *   GetNLSData                                                          **
+ **************************************************************************
+ *
+ * ARGUMENTS:
+ *
+ *     pulCodePage       - Address where to return the code page/country.
+ *     pulLanguage       - Address where to return the language/dialect.
+ *
+ * RETURN:
+ *
+ *     Error code or 0.
+ *
+ * DESCRIPTION:
+ *
+ *     This function will retrieve the NLS information for the IOProc
+ *     strings contained in the resource file.
+ *
+ ***************************************************************************/
+
+ULONG APIENTRY GetNLSData( PULONG pulCodePage,
+                           PULONG pulLanguage )
+{
+   PVOID   pResourceData;
+   CHAR    *pTemp;
+
+   if (DosGetResource( hModuleHandle,
+                       RT_RCDATA,
+                       MMOTION_NLS_CHARSET_INFO,
+                       &pResourceData ))
+      {
+      return (MMIO_ERROR);
+      }
+
+   /*
+    * The resource table is of the form :
+    *   usCodePage     Low
+    *   usCountryCode  High
+    *   usLanguage     Low
+    *   usDialect      High
+    */
+
+   pTemp = (CHAR *)pResourceData;
+
+   while (pTemp)
+      {
+      memmove( pulCodePage, pTemp, sizeof(ULONG) );
+      pTemp += sizeof(ULONG);
+
+      if (pTemp == NULL)
+         {
+         break;
+         }
+
+      memmove( pulLanguage, pTemp, sizeof(ULONG) );
+
+      break;
+      }
+
+   DosFreeResource( pResourceData );
+
+   return (MMIO_SUCCESS);
+}
Index: /tags/CWMM-0.3.0_GA/JPGPROC/source/jpgproc.c
===================================================================
--- /tags/CWMM-0.3.0_GA/JPGPROC/source/jpgproc.c	(revision 213)
+++ /tags/CWMM-0.3.0_GA/JPGPROC/source/jpgproc.c	(revision 213)
@@ -0,0 +1,1537 @@
+/*
+ * Copyright (c) Chris Wohlgemuth 2002 
+ * All rights reserved.
+ *
+ * http://www.geocities.com/SiliconValley/Sector/5785/
+ * http://www.os2world.com/cdwriting
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. The authors name may not be used to endorse or promote products
+ *    derived from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ *
+ */
+ 
+/************************************************************************/
+/* Put all #defines here                                                */
+/************************************************************************/
+
+#define INCL_32                         /* force 32 bit compile */
+#define INCL_GPIBITMAPS
+#define INCL_DOSFILEMGR
+#define INCL_WIN
+#define INCL_GPI
+#define INCL_PM                         
+
+#define MEMCHECK
+
+/************************************************************************/
+/* Put all #includes here                                               */
+/************************************************************************/
+
+#include <os2.h>
+#include <stdio.h>
+#include <string.h>
+#include <stdlib.h>
+#include <stdarg.h>
+#include <io.h>
+#include <fcntl.h>
+#include <sys\stat.h>
+#include <os2medef.h>
+#include <mmioos2.h>
+#include "jpgproc.h"
+
+//#define DEBUG
+
+#ifdef DEBUG
+void writeLog(const char* chrFormat, ...)
+{
+  char logNameLocal[CCHMAXPATH];
+  FILE *fHandle;
+
+  sprintf(logNameLocal,"d:\\jpgio.log");
+  fHandle=fopen(logNameLocal,"a");
+  if(fHandle) {
+    va_list arg_ptr;
+    void *tb;
+
+    va_start (arg_ptr, chrFormat);
+    vfprintf(fHandle, chrFormat, arg_ptr);
+    va_end (arg_ptr);
+    fclose(fHandle);
+  }
+}
+#endif
+
+ULONG readImageData( PJPGFILESTATUS pJPGInfo)
+{
+  GBM_ERR rcGBM;
+  /********************************************************
+   * Determine total bytes in image
+   ********************************************************/
+              
+  pJPGInfo->ulRGBTotalBytes =  ( ((pJPGInfo->gbm.w * pJPGInfo->gbm.bpp + 31)/32) * 4 )
+    * pJPGInfo->gbm.h;
+
+  pJPGInfo->ulImgTotalBytes = pJPGInfo->ulRGBTotalBytes;
+  
+  /********************************************************
+   * Get space for full image buffer.
+   * This will be retained until the file is closed.
+   ********************************************************/
+  if (DosAllocMem ((PPVOID) &(pJPGInfo->lpRGBBuf),
+                   pJPGInfo->ulRGBTotalBytes,
+                   fALLOC))
+    {
+#ifdef DEBUG
+      writeLog("readImagedata(): no memory for image data.\n");        
+#endif
+      return (MMIO_ERROR);
+    }
+  
+#ifdef DEBUG
+      writeLog("readImagedata(): allocated %d bytes for image data.\n", pJPGInfo->ulRGBTotalBytes);        
+#endif
+
+  if ( (rcGBM = gbm_read_data(pJPGInfo->fHandleGBM, pJPGInfo->ft,
+                              &pJPGInfo->gbm, pJPGInfo->lpRGBBuf)) != GBM_ERR_OK )
+    {
+      DosFreeMem ((PVOID) pJPGInfo->lpRGBBuf);
+#ifdef DEBUG
+      writeLog("readImagedata(): can't read image data.\n");        
+#endif
+      return (MMIO_ERROR);
+    }
+  
+  /********************************************************
+   * RGB Buffer now full, set position pointers to the
+   * beginning of the buffer.
+   ********************************************************/
+  pJPGInfo->lImgBytePos =  0;
+
+  return MMIO_SUCCESS;
+}
+
+static void expand_to_24bit(GBM *gbm, RGB2 *rgb2, byte **data)
+{
+  int stride = ((gbm->w * gbm->bpp + 31)/32) * 4;
+  int new_stride = ((gbm->w * 3 + 3) & ~3);
+  int bytes, y;
+  byte *new_data;
+  
+  if ( gbm->bpp == 24 )
+    return;
+
+  if(!rgb2)
+    return;
+  
+  bytes = new_stride * gbm->h;
+
+  if(NO_ERROR!=DosAllocMem ((PPVOID) &new_data,
+                            bytes,
+                            fALLOC))
+    return;
+
+  for ( y = 0; y < gbm->h; y++ )
+    {
+      byte	*src = *data + y * stride;
+      byte	*dest = new_data + y * new_stride;
+      int	x;
+      
+      switch ( gbm->bpp )
+        {
+        case 1:
+          {
+            byte	c;
+            
+            for ( x = 0; x < gbm->w; x++ )
+              {
+                if ( (x & 7) == 0 )
+                  c = *src++;
+                else
+                  c <<= 1;
+                
+                *dest++ = rgb2[c >> 7].bBlue;
+                *dest++ = rgb2[c >> 7].bGreen;
+                *dest++ = rgb2[c >> 7].bRed;
+              }
+          }
+          break;
+        case 4:
+          for ( x = 0; x + 1 < gbm->w; x += 2 )
+            {
+              byte	c = *src++;
+              
+              *dest++ = rgb2[c >> 4].bBlue;
+              *dest++ = rgb2[c >> 4].bGreen;
+              *dest++ = rgb2[c >> 4].bRed;
+              *dest++ = rgb2[c & 15].bBlue;
+              *dest++ = rgb2[c & 15].bGreen;
+              *dest++ = rgb2[c & 15].bRed;
+            }
+          
+          if ( x < gbm->w )
+            {
+              byte	c = *src;
+              
+              *dest++ = rgb2[c >> 4].bBlue;
+              *dest++ = rgb2[c >> 4].bGreen;
+              *dest++ = rgb2[c >> 4].bRed;
+            }
+          break;
+        case 8:
+          for ( x = 0; x < gbm->w; x++ )
+            {
+              byte	c = *src++;
+              *dest++ = rgb2[c].bBlue;
+              *dest++ = rgb2[c].bGreen;
+              *dest++ = rgb2[c].bRed;
+            }
+          break;
+        }
+    }
+  DosFreeMem(*data);
+  *data = new_data;
+#ifdef DEBUG
+  writeLog("Image data converted from %d bpp to 24 bpp.\n", gbm->bpp);
+#endif
+
+  gbm->bpp = 24;
+}
+
+/************************************************************************/
+/* JPEG IOProc                                                          */
+/*                                                                      */
+/* ARGUMENTS:                                                           */
+/*                                                                      */
+/*     PSZ pmmioStr - pointer to MMIOINFO block                         */
+/*     USHORT usMsg - MMIO message being sent                           */
+/*     LONG lParam1 - filename or other parameter depending on message  */
+/*     LONG lParam2 - used with some messages as values                 */
+/*                                                                      */
+/*                                                                      */
+/*  RETURN:                                                             */
+/*                                                                      */
+/*      MMIOM_OPEN                                                      */
+/*          Success           - MMIO_SUCCESS     (0)                    */
+/*          Failure           - MMIO_ERROR      (-1)                    */
+/*                                                                      */
+/*      MMIOM_READ                                                      */
+/*          Success           - Returns the number of bytes actually    */
+/*                              read.  Return 0L if no more bytes can   */
+/*                              be read.                                */
+/*          Failure           - MMIO_ERROR      (-1)                    */
+/*                                                                      */
+/*      MMIOM_WRITE                                                     */
+/*          Success           - Returns the number of bytes actually    */
+/*                              written.                                */
+/*          Failure           - MMIO_ERROR      (-1)                    */
+/*                                                                      */
+/*      MMIOM_SEEK                                                      */
+/*          Success           - Returns the new file position           */
+/*          Failure           - MMIO_ERROR      (-1)                    */
+/*                                                                      */
+/*      MMIOM_CLOSE                                                     */
+/*          Success           - MMIO_SUCCESS     (0)                    */
+/*          Failure           - MMIO_ERROR      (-1)                    */
+/*          Other             - MMIO_WARNING, file was closed but the   */
+/*                              IOProc expected additional data         */
+/*                                                                      */
+/*      MMIOM_GETFORMATNAME                                             */
+/*          Success           - Returns the number of bytes read into   */
+/*                              the buffer (size of format name)        */
+/*          Failure           - Return 0                                */
+/*                                                                      */
+/*      MMIOM_GETFORMATINFO                                             */
+/*          Success           - MMIO_SUCCESS     (0)                    */
+/*          Failure           - MMIO_ERROR      (-1)                    */
+/*                                                                      */
+/*      MMIOM_QUERYHEADERLENGTH                                         */
+/*          Success           - Returns the size of the header in bytes */
+/*          Failure           - Return 0                                */
+/*                                                                      */
+/*      MMIOM_IDENTIFYFILE                                              */
+/*          Success           - MMIO_SUCCESS     (0)                    */
+/*          Failure           - MMIO_ERROR      (-1)                    */
+/*                                                                      */
+/*      MMIOM_GETHEADER                                                 */
+/*          Success           - Returns number of bytes copied into     */
+/*                              the header structure.                   */
+/*          Failure           - Return 0                                */
+/*          Other             - If length passed in was not large       */
+/*                              enough to hold header then,             */
+/*                              MMIOERR_INVALID_BUFFER_LENGTH is set    */
+/*                              in ulErrorRet.                          */
+/*                            - If header is bad,                       */
+/*                              MMIOERR_INVALID_STRUCTURE is set in     */
+/*                              ulErrorRet                              */
+/*                                                                      */
+/*      MMIOM_SETHEADER                                                 */
+/*          Success           - Returns number of bytes written         */
+/*          Failure           - Return 0                                */
+/*          Other             - If header is bad,                       */
+/*                              MMIOERR_INVALID_STRUCTURE is set in     */
+/*                              ulErrorRet                              */
+/*                                                                      */
+/*  DESCRIPTION:                                                        */
+/*                                                                      */
+/*      This routine will translate JPEG image data into                */
+/*      OS/2 2.0 memory bitmap data and back again.                     */
+/*                                                                      */
+/*                                                                      */
+/*  GLOBAL VARS REFERENCED:                                             */
+/*                                                                      */
+/*      None                                                            */
+/*                                                                      */
+/*  GLOBAL VARS MODIFIED:                                               */
+/*                                                                      */
+/*      None                                                            */
+/*                                                                      */
+/*  NOTES:                                                              */
+/*                                                                      */
+/*      None                                                            */
+/*                                                                      */
+/*  SIDE EFFECTS:                                                       */
+/*                                                                      */
+/*      None                                                            */
+/*                                                                      */
+/************************************************************************/
+
+LONG EXPENTRY IOProc_Entry (PVOID  pmmioStr,
+                             USHORT usMsg,
+                             LONG   lParam1,
+                             LONG   lParam2)
+
+    {
+    PMMIOINFO   pmmioinfo;                      /* MMIOINFO block */
+
+    pmmioinfo = (PMMIOINFO) pmmioStr;
+
+#ifdef DEBUG
+    writeLog("MSG: %d %x\n", usMsg,usMsg);
+#endif
+
+    switch (usMsg)
+        {
+        /*#############################################################*
+         * When Closing the file, perform the following:
+         * 1) Setup Variables
+         * 2) Process the Image buffer
+         * 3) Compress the Image to appropriate format
+         *#############################################################*/
+        case MMIOM_CLOSE:
+            {
+            /************************************************************
+             * Declare local variables.
+             ************************************************************/
+            PJPGFILESTATUS   pJPGInfo;         /* MMotionIOProc instance data */
+
+            LONG            lRetCode;
+            USHORT          rc;
+
+#ifdef DEBUG
+            writeLog("MMIO_CLOSE\n");
+#endif
+
+            /***********************************************************
+             * Check for valid MMIOINFO block.
+             ***********************************************************/
+            if (!pmmioinfo)
+                return (MMIO_ERROR);
+
+            /***********************************************************
+             * Set up our working file status variable.
+             ***********************************************************/
+            pJPGInfo = (PJPGFILESTATUS)pmmioinfo->pExtraInfoStruct;
+            
+            /***********************************************************
+             * Assume success for the moment....
+             ***********************************************************/
+            lRetCode = MMIO_SUCCESS;
+            
+            /************************************************************
+             * see if we are in Write mode and have a buffer to write out.
+             *    We have no image buffer in UNTRANSLATED mode.
+             ************************************************************/
+            if ((pmmioinfo->ulFlags & MMIO_WRITE) && (pJPGInfo->lpRGBBuf))
+                {
+                  int n_ft, ft;
+                  BOOL bValidJPG;
+
+                  /* Write the buffer to disk */
+#ifdef DEBUG
+                  writeLog("MMIO_CLOSE: pJPGInfo->gbm.w: %d, pJPGInfo->gbm.h: %d, pJPGInfo->gbm.bpp; %d\n",
+                           pJPGInfo->gbm.w, pJPGInfo->gbm.h, pJPGInfo->gbm.bpp);
+                  writeLog("MMIO_CLOSE: pJPGInfo->fHandleGBM: %d, pJPGInfo->ft: %d\n",
+                           pJPGInfo->fHandleGBM, pJPGInfo->ft);
+
+#endif
+                  gbm_query_n_filetypes(&n_ft);
+                  
+                  for ( ft = 0; ft < n_ft; ft++ )
+                    {
+                      GBMFT gbmft;
+                      gbm_query_filetype(ft, &gbmft);
+                      if(!stricmp(gbmft.short_name, "JPEG")) {
+                        bValidJPG=TRUE;
+                        break;
+                      }
+                    }
+                  
+                  if(bValidJPG) {
+                    if(pJPGInfo->gbm.bpp!=24)
+                      expand_to_24bit(&pJPGInfo->gbm, pJPGInfo->mmImgHdr.bmiColors, &pJPGInfo->lpRGBBuf);
+
+                    if ( (rc = gbm_write("", pJPGInfo->fHandleGBM, ft, &pJPGInfo->gbm, 
+                                         NULL /*gbmrgb*/, pJPGInfo->lpRGBBuf, "")) != GBM_ERR_OK )
+                      {
+#ifdef DEBUG
+                        writeLog("MMIO_CLOSE: can't write image data.\n");
+#endif
+                      }
+                  }
+                }  /* end IF WRITE & IMAGE BUFFER block */
+
+            /***********************************************************
+             * Free the RGB buffer, if it exists, that was created
+             * for the translated READ operations.
+             ***********************************************************/
+            if (pJPGInfo->lpRGBBuf)
+              {
+                DosFreeMem ((PVOID) pJPGInfo->lpRGBBuf);
+              }
+
+            /***********************************************************
+             * Close the file 
+             ***********************************************************/
+            gbm_io_close(pJPGInfo->fHandleGBM);
+            
+            DosFreeMem ((PVOID) pJPGInfo);
+      
+            return (lRetCode);
+            }  /* end case of MMIOM_CLOSE */
+            
+        /*#############################################################*
+         * Get the NLS format Information.
+         *#############################################################*/
+        case MMIOM_GETFORMATINFO:
+            {
+            /***********************************************************
+             * Declare local variables.
+             ***********************************************************/
+            PMMFORMATINFO       pmmformatinfo;
+
+#ifdef DEBUG
+            writeLog("MMIO_GETFORMATINFO\n");
+#endif
+
+            /************************************************************
+             * Set pointer to MMFORMATINFO structure.
+             ************************************************************/
+            pmmformatinfo = (PMMFORMATINFO) lParam1;
+
+            /************************************************************
+             * Fill in the values for the MMFORMATINFO structure.
+             ************************************************************/
+            pmmformatinfo->ulStructLen  = sizeof (MMFORMATINFO);
+            pmmformatinfo->fccIOProc    = FOURCC_JPG;
+            pmmformatinfo->ulIOProcType = MMIO_IOPROC_FILEFORMAT;
+            pmmformatinfo->ulMediaType  = MMIO_MEDIATYPE_IMAGE;
+
+            pmmformatinfo->ulFlags      = MMIO_CANREADTRANSLATED |       
+              MMIO_CANSEEKTRANSLATED        |
+              MMIO_CANWRITETRANSLATED     
+              /* MMIO_CANREADUNTRANSLATED      |
+                 MMIO_CANWRITETRANSLATED       |
+                 MMIO_CANWRITEUNTRANSLATED     |
+                 MMIO_CANREADWRITEUNTRANSLATED |
+
+                 MMIO_CANSEEKUNTRANSLATED */;
+
+            strcpy ((PSZ) pmmformatinfo->szDefaultFormatExt, pszJPGExt);
+            if (GetNLSData( &pmmformatinfo->ulCodePage,
+                            &pmmformatinfo->ulLanguage ))
+               {
+               return( -1L );
+               }
+
+            if (GetFormatStringLength( FOURCC_JPG,
+                                       &(pmmformatinfo->lNameLength) ))
+               {
+               return( -1L );
+               }
+
+
+            /************************************************************
+             * Return success back to the application.
+             ************************************************************/
+            return (MMIO_SUCCESS);
+            } /* end case of MMIOM_GETFORMATINFO */
+
+        /*#############################################################*
+         * Get the NLS format name.
+         *#############################################################*/
+        case MMIOM_GETFORMATNAME:
+            {
+            LONG lBytesCopied;
+
+#ifdef DEBUG
+            writeLog("MMIO_GETFORMATNAME\n");
+#endif
+
+            /************************************************************
+             * Copy format string into buffer supplied by
+             * lParam1.  Only put in the amount of my string up to the
+             * allocated amount which is in lParam2.  Leave enough room
+             * for the NULL termination.
+             ************************************************************/
+            lBytesCopied = GetFormatString( FOURCC_JPG,
+                                            (char *)lParam1,
+                                            lParam2 );
+
+            return (lBytesCopied);
+            } /* end case of MMIOM_GETFORMATNAME */
+
+        /*#############################################################*
+         * Get the file header.
+         *#############################################################*/
+        case MMIOM_GETHEADER:
+            {
+            /************************************************************
+             * Declare local variables.
+             ************************************************************/
+              //  PMMFILESTATUS       pVidInfo;
+            PJPGFILESTATUS       pJPGInfo;
+#ifdef DEBUG
+            writeLog("MMIO_GETHEADER\n");
+#endif
+
+            /************************************************************
+             * Check for valid MMIOINFO block.
+             ************************************************************/
+            if (!pmmioinfo)
+                return (0);
+
+            /************************************************************
+             * Set up our working file status variable.
+             ************************************************************/
+            pJPGInfo = (PJPGFILESTATUS)pmmioinfo->pExtraInfoStruct;
+
+            /**************************************************
+             * Getheader only valid in READ or READ/WRITE mode.
+             * There is no header to get in WRITE mode.  We
+             * must also have a valid file handle to read from
+             **************************************************/
+            if ((pmmioinfo->ulFlags & MMIO_WRITE) ||
+                (!(pJPGInfo->fHandleGBM)))
+               return (0);
+
+            /************************************************************
+             * Check for Translation mode.
+             ************************************************************/
+            if (!(pmmioinfo->ulTranslate & MMIO_TRANSLATEHEADER))
+              {
+                /********************************************************
+                 * Translation is off.
+                 ********************************************************/
+                /* Unstranslatd headers are not supported !!! */
+                return 0;
+              }   /* end IF NOT TRANSLATED block */
+            
+            /******************
+             * TRANSLATION IS ON
+             ******************/
+            if (lParam2 < sizeof (MMIMAGEHEADER))
+              {
+                pmmioinfo->ulErrorRet = MMIOERR_INVALID_BUFFER_LENGTH;
+                return (0);
+                }
+
+            if (!lParam1)
+                {
+                pmmioinfo->ulErrorRet = MMIOERR_INVALID_STRUCTURE;
+                return (0);
+                }
+
+            memcpy ((PVOID)lParam1,
+                    (PVOID)&pJPGInfo->mmImgHdr,
+                    sizeof (MMIMAGEHEADER));
+
+            return (sizeof (MMIMAGEHEADER));
+            } /* end case of MMIOM_GETHEADER */
+
+        /*#############################################################*
+         * Identify whether this file can be processed.
+         *#############################################################*/
+        case MMIOM_IDENTIFYFILE:
+            {
+
+            /************************************************************
+             * Declare local variables.
+             ************************************************************/
+            GBMFT gbmft;
+            int ft, fd, n_ft;
+            BOOL bValidJPG= FALSE;
+
+            ULONG           ulTempFlags = MMIO_READ | MMIO_DENYWRITE |
+                                          MMIO_NOIDENTIFY;
+                                           /* flags used for temp open  */
+                                           /* and close                 */
+#ifdef DEBUG
+            writeLog("MMIO_IDENTIFYFILE\n");
+#endif
+
+            /************************************************************
+             * We need either a file name (lParam1) or file handle (lParam2)
+             ************************************************************/
+            if (!lParam1 && !lParam2)
+                return (MMIO_ERROR);
+
+            if ( gbm_init() != GBM_ERR_OK )
+              return MMIO_ERROR;
+
+            if ( (fd = gbm_io_open((PSZ) lParam1, O_RDONLY|O_BINARY)) == -1 )
+              {
+                gbm_deinit();
+                return (MMIO_ERROR);
+              }
+                        
+            gbm_query_n_filetypes(&n_ft);
+            
+            for ( ft = 0; ft < n_ft; ft++ )
+              {
+                GBM gbm;
+                
+                if ( gbm_read_header((PSZ) lParam1, fd, ft, &gbm, "") == GBM_ERR_OK )
+                  {
+                    gbm_query_filetype(ft, &gbmft);
+                    if(!stricmp(gbmft.short_name, "JPEG"))
+                      bValidJPG=TRUE;
+                  }
+              }
+            
+            gbm_io_close(fd);
+            gbm_deinit();
+
+            if(bValidJPG) {
+              return (MMIO_SUCCESS);
+            }
+
+            return (MMIO_ERROR);
+
+            } /* end case of MMIOM_IDENTIFYFILE */
+
+        /*#############################################################*/
+        /*#############################################################*/
+        case MMIOM_OPEN:
+            {
+
+            /************************************************************
+             * Declare local variables
+             ************************************************************/
+
+
+            PJPGFILESTATUS   pJPGInfo;   /* pointer to a JPG file       */
+                                        /* status structure that we will*/
+                                        /* use for this file instance   */
+
+            MMIMAGEHEADER   MMImgHdr;
+            ULONG           ulWidth = 0;
+            ULONG           ulHeight = 0;
+            PBYTE           lpRGBBufPtr;
+
+            PSZ pszFileName = (CHAR *)lParam1;  /* get the filename from    */
+                                                /* parameter                */
+
+            GBMFT gbmft;
+            int ft, fd, n_ft, stride, bytes;
+            BOOL bValidJPG= FALSE;
+            int fOpenFlags;
+            GBM_ERR	rc;
+
+#ifdef DEBUG
+            writeLog("MMIO_OPEN\n");
+#endif
+            /************************************************************
+             * Check for valid MMIOINFO block.
+             ************************************************************/
+            if (!pmmioinfo)
+                return (MMIO_ERROR);
+
+            /************************************************************
+             * If flags show read and write then send back an error.  We
+             * only support reading or writing but not both at the same
+             * time on the same file.
+             ************************************************************/
+            if ((pmmioinfo->ulFlags & MMIO_READWRITE) &&
+                ((pmmioinfo->ulTranslate & MMIO_TRANSLATEDATA) ||
+                 (pmmioinfo->ulTranslate & MMIO_TRANSLATEHEADER)))
+                {
+#ifdef DEBUG
+                writeLog("MMIO_OPEN, read/write not supported.\n");
+#endif      
+                return (MMIO_ERROR);
+                }
+
+            /* We can't read/write untranslated */
+            if ( ( !(pmmioinfo->ulTranslate & MMIO_TRANSLATEDATA) ||
+                   !(pmmioinfo->ulTranslate & MMIO_TRANSLATEHEADER) ) )
+              {
+#ifdef DEBUG
+                writeLog("MMIO_OPEN, untranslated not supported.\n");
+#endif      
+                return (MMIO_ERROR);
+              }
+            
+
+            /*!!!!!!!!!!!!!!!!!!!!!! FIXME !!!!!!!!!!!!!!!!!!!!!!!*/
+            /* To be honest we can almost nothing ;-) */
+            if (pmmioinfo->ulFlags & 
+                (MMIO_APPEND| 
+                 MMIO_ALLOCBUF|MMIO_BUFSHARED | MMIO_VERTBAR ))
+              {
+#ifdef DEBUG
+                writeLog("MMIO_OPEN, unsupported flag in %x\n", pmmioinfo->ulFlags);
+#endif
+                return (MMIO_ERROR);
+              }
+
+            /* Caller requested a delete */
+            if(pmmioinfo->ulFlags & MMIO_DELETE) {
+#ifdef DEBUG
+            writeLog("MMIO_OPEN: MMIO_DELETE set\n");
+#endif
+              if(remove((PSZ) lParam1)==-1)
+                return (MMIO_ERROR);
+            }
+            /************************************************************
+              Allocate our private data structure 
+             ************************************************************/
+            if(NO_ERROR!=DosAllocMem ((PPVOID) &pJPGInfo,
+                                  sizeof (JPGFILESTATUS),
+                                  fALLOC))
+              return  MMIO_ERROR;
+
+            memset((PVOID)pJPGInfo,0, sizeof(JPGFILESTATUS));
+
+            if ( gbm_init() != GBM_ERR_OK ) {
+              DosFreeMem(pJPGInfo);
+              return MMIO_ERROR;
+            }
+
+            /************************************************************
+             * Store pointer to our JPGFILESTATUS structure in
+             * pExtraInfoStruct field that is provided for our use.
+             ************************************************************/
+            pmmioinfo->pExtraInfoStruct = (PVOID)pJPGInfo;
+            
+            /************************************************************
+              MMIO_WRITE
+             ************************************************************/
+            if (pmmioinfo->ulFlags & MMIO_WRITE) {
+              /* It's a write so open the file */
+#ifdef DEBUG
+            writeLog("MMIO_OPEN: flag MMIO_WRITE set\n");
+#endif
+              
+              fOpenFlags=O_WRONLY|O_BINARY;
+              if(pmmioinfo->ulFlags & MMIO_CREATE) {
+                fOpenFlags|=O_CREAT|O_TRUNC;
+                if ( (fd = gbm_io_create((PSZ) lParam1, O_WRONLY|O_BINARY)) == -1 )
+                  {
+                    /* GBM can't create the file */
+#ifdef DEBUG
+                    writeLog("MMIO_OPEN: create failed, flags: %x, file %s\n",
+                             fOpenFlags, (PSZ) lParam1);
+                    writeLog("MMIO_OPEN: errno: 0x%x, \n",
+                             errno);
+#endif
+                    gbm_deinit();
+                    DosFreeMem(pJPGInfo);
+                    return (MMIO_ERROR);
+                  }
+              }
+              else {
+                if ( (fd = gbm_io_open((PSZ) lParam1, /*fOpenFlags*/ O_BINARY|O_WRONLY)) == -1 )
+                  {
+                    /* GBM can't open the file */
+#ifdef DEBUG
+                    writeLog("MMIO_OPEN: \n");
+                    writeLog("MMIO_OPEN: open failed, flags: %x, file %s\n",
+                             fOpenFlags, (PSZ) lParam1);
+                    writeLog("MMIO_OPEN: errno: 0x%x, \n",
+                             errno);                    
+#endif
+                    gbm_deinit();
+                    DosFreeMem(pJPGInfo);
+                    return (MMIO_ERROR);
+                  }
+              }/* else */
+
+              pJPGInfo->fHandleGBM=fd;
+              return (MMIO_SUCCESS);
+            }
+
+            /* Since we can't write and we are here, this is a read. The read flag isn't
+               necessarily set...
+               */
+
+            /*
+              First get some infos from GBM.
+              */
+            if(pmmioinfo->ulFlags & MMIO_WRITE)
+              fOpenFlags=O_WRONLY;
+            else if(pmmioinfo->ulFlags & MMIO_READWRITE)
+              fOpenFlags=O_RDWR;
+            else
+              fOpenFlags=O_RDONLY;
+
+            fOpenFlags|=O_BINARY;
+
+            if ( (fd = gbm_io_open((PSZ) lParam1, fOpenFlags)) == -1 )
+              {
+                gbm_deinit();
+                DosFreeMem(pJPGInfo);
+                return (MMIO_ERROR);
+              }
+
+            gbm_query_n_filetypes(&n_ft);
+            
+            for ( ft = 0; ft < n_ft; ft++ )
+              {
+                if ( gbm_read_header((PSZ) lParam1, fd, ft, &pJPGInfo->gbm, "") == GBM_ERR_OK )
+                  {
+                    gbm_query_filetype(ft, &gbmft);
+                    if(!stricmp(gbmft.short_name, "JPEG")) {
+                      bValidJPG=TRUE;
+                      pJPGInfo->ft=ft;
+#ifdef DEBUG
+              writeLog("MMIO_OPEN, JPEG proc found ft: %d\n", ft);
+#endif
+                      break;
+                    }
+                  }
+              }
+            
+            if(!bValidJPG) {
+#ifdef DEBUG
+              writeLog("MMIO_OPEN, file isn't a valid JPEG file\n");
+#endif
+              DosFreeMem(pJPGInfo);
+              gbm_io_close(fd);
+              gbm_deinit();
+              return (MMIO_ERROR);
+            }
+
+            pJPGInfo->fHandleGBM=fd;
+
+            if(pJPGInfo->gbm.bpp==8) {
+              GBMRGB gbmrgb[0x100];
+              RGB2 *rgb2;
+              int a;
+
+#ifdef DEBUG
+              writeLog("MMIO_OPEN, reading palette for 8bpp JPG.\n");
+#endif
+
+              /* Get palette for 8Bit JPGs (grey) */
+              if ( (rc = gbm_read_palette(fd, pJPGInfo->ft, &pJPGInfo->gbm, gbmrgb)) != GBM_ERR_OK )
+                {
+#ifdef DEBUG
+              writeLog("MMIO_OPEN, can't get palette for 8bpp JPG.\n");
+#endif
+                  DosFreeMem(pJPGInfo);
+                  gbm_io_close(fd);
+                  gbm_deinit();
+                  return (MMIO_ERROR);
+                }
+              rgb2=MMImgHdr.bmiColors;
+              for(a=0;a<256;a++){
+                rgb2[a].bBlue=gbmrgb[a].b;
+                rgb2[a].bGreen=gbmrgb[a].g;
+                rgb2[a].bRed=gbmrgb[a].r;
+              }
+
+
+            }
+            /************************************************************
+             * If the app intends to read in translation mode, we must
+             * allocate and set-up the buffer that will contain the RGB data
+             *
+             * We must also read in the data to insure that the first
+             * read, seek, or get-header operation will have data
+             * to use.  This is ONLY NECESSARY FOR TRANSLATED MODE
+             * operations, since we must process reads/writes pretending
+             * the image is stored from the Bottom-up.
+             *
+             ************************************************************
+             ************************************************************
+             * Fill out the MMIMAGEHEADER structure.
+             ************************************************************/
+#if 0
+               MMImgHdr.ulHeaderLength = sizeof (MMIMAGEHEADER);
+               MMImgHdr.ulContentType  = MMIO_IMAGE_PHOTO;
+               MMImgHdr.ulMediaType    = MMIO_MEDIATYPE_IMAGE;
+               MMImgHdr.mmXDIBHeader.BMPInfoHeader2.cbFix =
+                           sizeof (BITMAPINFOHEADER2);
+               MMImgHdr.mmXDIBHeader.BMPInfoHeader2.cx              = pJPGInfo->gbm.w;
+               MMImgHdr.mmXDIBHeader.BMPInfoHeader2.cy              = pJPGInfo->gbm.h;
+               MMImgHdr.mmXDIBHeader.BMPInfoHeader2.cPlanes         = 1;
+               MMImgHdr.mmXDIBHeader.BMPInfoHeader2.cBitCount       = pJPGInfo->gbm.bpp;
+               MMImgHdr.mmXDIBHeader.BMPInfoHeader2.ulCompression   =
+                   BCA_UNCOMP;
+               if(pJPGInfo->gbm.bpp==8) {
+                   MMImgHdr.mmXDIBHeader.BMPInfoHeader2.cbImage         =
+                     ulWidth * ulHeight;
+                   MMImgHdr.mmXDIBHeader.BMPInfoHeader2.cclrUsed        = 256L;
+                   MMImgHdr.mmXDIBHeader.BMPInfoHeader2.cclrImportant        = 256L;
+               }
+               else
+                 MMImgHdr.mmXDIBHeader.BMPInfoHeader2.cbImage         =
+                   ulWidth * ulHeight * 3;
+               MMImgHdr.mmXDIBHeader.BMPInfoHeader2.cxResolution    = 0L;
+               MMImgHdr.mmXDIBHeader.BMPInfoHeader2.cyResolution    = 0L;
+               MMImgHdr.mmXDIBHeader.BMPInfoHeader2.cclrUsed        = 0L;
+               MMImgHdr.mmXDIBHeader.BMPInfoHeader2.cclrImportant   = 0L;
+               MMImgHdr.mmXDIBHeader.BMPInfoHeader2.usUnits         = 0L;
+               MMImgHdr.mmXDIBHeader.BMPInfoHeader2.usReserved      = 0L;
+               MMImgHdr.mmXDIBHeader.BMPInfoHeader2.usRecording     =
+                   BRA_BOTTOMUP;
+               MMImgHdr.mmXDIBHeader.BMPInfoHeader2.usRendering     =
+                   BRH_NOTHALFTONED;
+               MMImgHdr.mmXDIBHeader.BMPInfoHeader2.cSize1          = 0L;
+               MMImgHdr.mmXDIBHeader.BMPInfoHeader2.cSize2          = 0L;
+               MMImgHdr.mmXDIBHeader.BMPInfoHeader2.ulColorEncoding = 0L;
+               MMImgHdr.mmXDIBHeader.BMPInfoHeader2.ulIdentifier    = 0L;
+#endif
+
+               MMImgHdr.ulHeaderLength = sizeof (MMIMAGEHEADER);
+               MMImgHdr.ulContentType  = 0;                         //MMIO_IMAGE_PHOTO;
+               MMImgHdr.ulMediaType    = MMIO_MEDIATYPE_IMAGE;
+               MMImgHdr.mmXDIBHeader.BMPInfoHeader2.cbFix =
+                           sizeof (BITMAPINFOHEADER2);
+               MMImgHdr.mmXDIBHeader.BMPInfoHeader2.cx              = pJPGInfo->gbm.w;
+               MMImgHdr.mmXDIBHeader.BMPInfoHeader2.cy              = pJPGInfo->gbm.h;
+               MMImgHdr.mmXDIBHeader.BMPInfoHeader2.cPlanes         = 1;
+               MMImgHdr.mmXDIBHeader.BMPInfoHeader2.cBitCount       = pJPGInfo->gbm.bpp;
+               MMImgHdr.mmXDIBHeader.BMPInfoHeader2.ulCompression   =
+                   BCA_UNCOMP;
+               if(pJPGInfo->gbm.bpp==8) {
+                   MMImgHdr.mmXDIBHeader.BMPInfoHeader2.cbImage         =
+                     ulWidth * ulHeight;
+                   MMImgHdr.mmXDIBHeader.BMPInfoHeader2.cclrUsed        = 256L;
+                   MMImgHdr.mmXDIBHeader.BMPInfoHeader2.cclrImportant   = 256L;
+               }
+               else
+                 MMImgHdr.mmXDIBHeader.BMPInfoHeader2.cbImage         =
+                   ulWidth * ulHeight * 3;
+               MMImgHdr.mmXDIBHeader.BMPInfoHeader2.cxResolution    = 0L;
+               MMImgHdr.mmXDIBHeader.BMPInfoHeader2.cyResolution    = 0L;
+               MMImgHdr.mmXDIBHeader.BMPInfoHeader2.cclrUsed        = 0L;
+               MMImgHdr.mmXDIBHeader.BMPInfoHeader2.cclrImportant   = 0L;
+               MMImgHdr.mmXDIBHeader.BMPInfoHeader2.usUnits         = 0L;
+               MMImgHdr.mmXDIBHeader.BMPInfoHeader2.usReserved      = 0L;
+               MMImgHdr.mmXDIBHeader.BMPInfoHeader2.usRecording     =
+                   BRA_BOTTOMUP;
+               MMImgHdr.mmXDIBHeader.BMPInfoHeader2.usRendering     =
+                   BRH_NOTHALFTONED;
+               MMImgHdr.mmXDIBHeader.BMPInfoHeader2.cSize1          = 0L;
+               MMImgHdr.mmXDIBHeader.BMPInfoHeader2.cSize2          = 0L;
+               MMImgHdr.mmXDIBHeader.BMPInfoHeader2.ulColorEncoding = 0L;
+               MMImgHdr.mmXDIBHeader.BMPInfoHeader2.ulIdentifier    = 0L;
+
+#ifdef DEBUG
+               writeLog("MMIO_OPEN, procname is: %s\n", gbmft.short_name);        
+               writeLog("MMIO_OPEN: pJPGInfo->gbm.w: %d, pJPGInfo->gbm.h: %d, pJPGInfo->gbm.bpp; %d\n",
+                        pJPGInfo->gbm.w, pJPGInfo->gbm.h, pJPGInfo->gbm.bpp);
+               writeLog("MMIO_OPEN: pJPGInfo->fHandleGBM: %d, pJPGInfo->ft: %d\n",
+                        pJPGInfo->fHandleGBM, pJPGInfo->ft);
+#endif
+               /********************************************************
+                * Determine total bytes in image
+                ********************************************************/
+
+               stride = ( ((pJPGInfo->gbm.w * pJPGInfo->gbm.bpp + 31)/32) * 4 );
+               bytes = stride * pJPGInfo->gbm.h;
+
+               pJPGInfo->ulRGBTotalBytes = bytes;
+               pJPGInfo->ulImgTotalBytes = pJPGInfo->ulRGBTotalBytes;
+
+               MMImgHdr.mmXDIBHeader.BMPInfoHeader2.cbImage=pJPGInfo->ulRGBTotalBytes;
+               //               MMImgHdr.mmXDIBHeader.XDIBHeaderPrefix.ulMemSize=pJPGInfo->ulRGBTotalBytes;
+               //               MMImgHdr.mmXDIBHeader.XDIBHeaderPrefix.ulPelFormat=mmioFOURCC('p','a','l','b');
+
+               /************************************************************
+                * Copy the image header into private area for later use.
+                * This will be returned on a mmioGetHeader () call
+                ************************************************************/
+               pJPGInfo->mmImgHdr = MMImgHdr;
+
+               return MMIO_SUCCESS;
+
+            } /* end case of MMIOM_OPEN */
+
+        /*#############################################################*/
+        /*#############################################################*/
+        case MMIOM_QUERYHEADERLENGTH:
+            {
+#ifdef DEBUG
+            writeLog("MMIO_QUERYHEADERLENGTH\n");
+#endif
+            /************************************************************
+             * If there is no MMIOINFO block then return an error.
+             ************************************************************/
+            if (!pmmioinfo)
+                return (0);
+
+            /************************************************************
+             * If header is in translated mode then return the media
+             * type specific structure size.
+             ************************************************************/
+            if (pmmioinfo->ulTranslate & MMIO_TRANSLATEHEADER)
+                return (sizeof (MMIMAGEHEADER));
+            else
+              /********************************************************
+               * Header is not in translated mode so return the size
+               * of the MMotion header.
+               ********************************************************/
+              /* Unstranslated headers not supported */
+              /*!!!!!!!!!!!!!! FIXME !!!!!!!!!!!!!!!*/
+              return 0;
+            } /* end case of MMIOM_QUERYHEADERLENGTH */
+
+        /*#############################################################*/
+        /*#############################################################*/
+        case MMIOM_READ:
+            {
+
+            /************************************************************
+             * Declare Local Variables
+             ************************************************************/
+            PJPGFILESTATUS   pJPGInfo;
+            LONG            rc;
+            LONG            lBytesToRead;
+            GBM_ERR	rcGBM;
+
+#ifdef DEBUG
+            writeLog("MMIO_READ\n");
+#endif
+
+            /************************************************************
+             * Check for valid MMIOINFO block.
+             ************************************************************/
+            if (!pmmioinfo)
+                return (MMIO_ERROR);
+
+            /************************************************************
+             * Set up our working file status variable.
+             ************************************************************/
+            pJPGInfo = (PJPGFILESTATUS)pmmioinfo->pExtraInfoStruct;
+            
+            /************************************************************
+             * Is Translate Data off?
+             ************************************************************/
+            if (!(pmmioinfo->ulTranslate & MMIO_TRANSLATEDATA))
+              {
+                int rc;
+                /********************************************************
+                 * Since no translation, provide exact number of bytes req
+                 ********************************************************/
+                if (!lParam1)
+                  return (MMIO_ERROR);
+
+                /* I don't know the header size of JPEG files so I can't skip
+                   to the image data in MMIO_SEEK. If I can't find the image data
+                   I can't read untranslated... */
+                return (MMIO_ERROR);
+#if 0
+                rc=gbm_io_read(pJPGInfo->fHandleGBM,(PVOID) lParam1, (ULONG) lParam2);
+
+                if(rc==-1)
+                  return (MMIO_ERROR);
+
+                return (rc);
+#endif
+              }
+
+            /************************************************************
+             * Otherwise, Translate Data is on...
+             ************************************************************/
+
+            /* Check if we already have read in the image data */
+            if(!pJPGInfo->lpRGBBuf) {
+              /* No, so read the image now */
+
+#ifdef DEBUG
+              writeLog("MMIO_READ: reading image data.\n");        
+#endif
+              if(readImageData(pJPGInfo)==MMIO_ERROR)
+                return MMIO_ERROR;
+            }
+
+            /************************************************************
+             * Ensure we do NOT write more data out than is remaining
+             *    in the buffer.  The length of read was requested in
+             *    image bytes, so confirm that there are that many of
+             *    virtual bytes remaining.
+             ************************************************************/
+            if ((ULONG)(pJPGInfo->lImgBytePos + lParam2) >
+                pJPGInfo->ulImgTotalBytes)
+              lBytesToRead =
+                   pJPGInfo->ulImgTotalBytes - pJPGInfo->lImgBytePos;
+            else
+               lBytesToRead = (ULONG)lParam2;
+
+            /************************************************************
+             * Perform this block on ALL reads.  The image data should
+             * be in the RGB buffer at this point, and can be handed
+             * to the application.
+             *
+             * Conveniently, the virtual image position is the same
+             *    as the RGB buffer position, since both are 24 bit-RGB
+             ************************************************************/
+            memcpy ((PVOID)lParam1,
+                    &(pJPGInfo->lpRGBBuf[pJPGInfo->lImgBytePos]),
+                    lBytesToRead);
+
+            /************************************************************
+             * Move RGB Buffer pointer forward by number of bytes read.
+             * The Img buffer pos is identical, since both are 24 bits
+             ************************************************************/
+            pJPGInfo->lImgBytePos += lBytesToRead;
+
+#ifdef DEBUG
+            writeLog("MMIO_READ: read %d bytes.\n", lBytesToRead);
+#endif
+
+            return (lBytesToRead);
+            }   /* end case  of MMIOM_READ */
+
+        /*#############################################################*/
+        /*#############################################################*/
+        case MMIOM_SEEK:
+            {
+
+            /************************************************************
+             * Set up locals.
+             ************************************************************/
+            PJPGFILESTATUS   pJPGInfo;
+            LONG            lNewFilePosition;
+            LONG            lPosDesired;
+            SHORT           sSeekMode;
+
+#ifdef DEBUG
+            writeLog("MMIO_SEEK\n");
+#endif
+
+            /************************************************************
+             * Check to make sure MMIOINFO block is valid.
+             ************************************************************/
+            if (!pmmioinfo)
+                return (MMIO_ERROR);
+
+            /************************************************************
+             * Set up our working file status variable.
+             ************************************************************/
+            pJPGInfo = (PJPGFILESTATUS)pmmioinfo->pExtraInfoStruct;
+
+            lPosDesired = lParam1;
+            sSeekMode = (SHORT)lParam2;
+
+            /************************************************************
+             * Is Translate Data on?
+             ************************************************************/
+            if (pmmioinfo->ulTranslate & MMIO_TRANSLATEDATA)
+                {
+                  /* Image data already read?? */
+                  if(!pJPGInfo->lpRGBBuf) {
+                    /* No, so read the image now */
+                    
+#ifdef DEBUG
+                    writeLog("MMIO_SEEK: reading image data.\n");        
+#endif
+
+                    if(readImageData(pJPGInfo)==MMIO_ERROR)
+                      return MMIO_ERROR;
+                  }
+
+                  /********************************************************
+                   * Attempt to move the Image buffer pointer to the
+                   *    desired location.  App sends SEEK requests in
+                   *    positions relative to the image planes & bits/pel
+                   * We must also convert this to RGB positions
+                   ********************************************************/
+                  switch (sSeekMode)
+                    {
+                    case SEEK_SET:
+                      {
+                        lNewFilePosition = lPosDesired;
+                        break;
+                      }
+                    case SEEK_CUR:
+                      {
+                        lNewFilePosition = pJPGInfo->lImgBytePos + lPosDesired;
+                        break;
+                      }
+                    case SEEK_END:
+                      {
+                        
+                        lNewFilePosition =
+                          pJPGInfo->ulImgTotalBytes += lPosDesired;
+                        break;
+                      }
+                    default :
+                      return (MMIO_ERROR);
+                    }
+
+                  /********************************************************
+                   * Make sure seek did not go before start of file.
+                   * If so, then don't change anything, just return an error
+                   ********************************************************/
+                  if (lNewFilePosition < 0)
+                    {
+                      return (MMIO_ERROR);
+                    }
+                  
+                  /********************************************************
+                   * Make sure seek did not go past the end of file.
+                   ********************************************************/
+                  if (lNewFilePosition > (LONG)pJPGInfo->ulImgTotalBytes)
+                    lNewFilePosition = pJPGInfo->ulImgTotalBytes;
+                  
+                  pJPGInfo->lImgBytePos = lNewFilePosition;
+                  
+                  return (pJPGInfo->lImgBytePos);
+                }
+
+            return (MMIO_ERROR);
+            }  /* end case of MMIOM_SEEK */
+
+        /*#############################################################*/
+        /*#############################################################*/
+        case MMIOM_SETHEADER:
+            {
+              /************************************************************
+               * Declare local variables.
+               ************************************************************/
+              PMMIMAGEHEADER          pMMImgHdr;
+              PJPGFILESTATUS           pJPGInfo;
+              USHORT                  usNumColors;
+              ULONG                   ulImgBitsPerLine;
+              ULONG                   ulImgBytesPerLine;
+              ULONG                   ulBytesWritten;
+              ULONG                   ulWidth;
+              ULONG                   ul4PelWidth;
+              ULONG                   ulHeight;
+              USHORT                  usPlanes;
+              USHORT                  usBitCount;
+              USHORT                  usPadBytes;
+              
+
+#ifdef DEBUG
+            writeLog("MMIO_SETHEADER\n");
+#endif
+
+            /************************************************************
+             * Check for valid MMIOINFO block.
+             ************************************************************/
+            if (!pmmioinfo)
+                return (MMIO_ERROR);
+
+            /************************************************************
+             * Set up our working variable MMFILESTATUS.
+             ************************************************************/
+            pJPGInfo = (PJPGFILESTATUS) pmmioinfo->pExtraInfoStruct;
+
+
+            /************************************************************
+             * Only allow this function if we are in WRITE mode
+             * And only if we have not already set the header
+             ************************************************************/
+            if ((!(pmmioinfo->ulFlags & MMIO_WRITE)) ||
+                (pJPGInfo->bSetHeader))
+              return (0);
+            
+            /********************************************************
+             * Make sure lParam1 is a valid pointer
+             ********************************************************/
+            if (!lParam1)
+              {
+                pmmioinfo->ulErrorRet = MMIOERR_INVALID_STRUCTURE;
+                return (0);
+              }
+            
+            /************************************************************
+             * Header is not in translated mode.
+             ************************************************************/
+            if (!(pmmioinfo->ulTranslate & MMIO_TRANSLATEHEADER))
+                {
+
+                  /* We don't do untranslated writes */
+                  return (0);   /* 0 indicates error */
+
+                }  /* end IF NOT TRANSLATED block */
+
+            /************************************************************
+             * Header is translated.
+             ************************************************************/
+
+            /************************************************************
+             * Create local pointer media specific structure.
+             ************************************************************/
+            pMMImgHdr = (PMMIMAGEHEADER) lParam1;
+
+            /************************************************************
+             * Check for validity of header contents supplied
+             ************************************************************
+             *  --  Length must be that of the standard header
+             *  --  NO Compression
+             *      1 plane
+             *      24, 8, 4 or 1 bpp
+             ************************************************************/
+            usBitCount = pMMImgHdr->mmXDIBHeader.BMPInfoHeader2.cBitCount;
+            if ((pMMImgHdr->mmXDIBHeader.BMPInfoHeader2.ulCompression !=
+                 BCA_UNCOMP) ||
+                (pMMImgHdr->mmXDIBHeader.BMPInfoHeader2.cPlanes != 1) ||
+                (! ((usBitCount == 24) || (usBitCount == 8) /*||
+                    (usBitCount == 4) || (usBitCount == 1)*/ )) /* JPEGs don't have 1 or 4 bpp */
+                )
+              {
+                pmmioinfo->ulErrorRet = MMIOERR_INVALID_STRUCTURE;
+                return (0);
+              }
+            
+            if (lParam2 != sizeof (MMIMAGEHEADER))
+              {
+                pmmioinfo->ulErrorRet = MMIOERR_INVALID_BUFFER_LENGTH;
+                return (0);
+              }
+            
+            ulWidth  = pMMImgHdr->mmXDIBHeader.BMPInfoHeader2.cx;
+            ulHeight = pMMImgHdr->mmXDIBHeader.BMPInfoHeader2.cy;
+
+            /************************************************************
+             * Complete GBM structure.
+             ************************************************************/
+            pJPGInfo->gbm.w=ulWidth;
+            pJPGInfo->gbm.h=ulHeight;
+            pJPGInfo->gbm.bpp=usBitCount;
+
+            /* Discard any image buffer already allocated. But..., where should it
+               come from?!?? */
+            if(pJPGInfo->lpRGBBuf) {
+              DosFreeMem(pJPGInfo->lpRGBBuf);
+              pJPGInfo->lpRGBBuf=NULLHANDLE;
+            }
+
+            pJPGInfo->ulRGBTotalBytes = ( ((pJPGInfo->gbm.w * pJPGInfo->gbm.bpp + 31)/32) * 4 ) 
+              * pJPGInfo->gbm.h;
+            pJPGInfo->ulImgTotalBytes = pJPGInfo->ulRGBTotalBytes;
+
+            /********************************************************
+             * Get space for full image buffer.
+             * This will be retained until the file is closed.
+             ********************************************************/
+            if (DosAllocMem ((PPVOID) &(pJPGInfo->lpRGBBuf),
+                             pJPGInfo->ulRGBTotalBytes,
+                             fALLOC))
+              {
+#ifdef DEBUG
+                writeLog("MMIO_SETHEADER: no memory for image data.\n");        
+#endif
+                return (MMIO_ERROR);
+              }
+
+            /************************************************************
+             * Flag that MMIOM_SETHEADER has been done.  It can only
+             *    be done ONCE for a file.  All future attempts will
+             *    be flagged as errors.
+             ************************************************************/
+            pJPGInfo->bSetHeader = TRUE;
+
+            /************************************************************
+             * Create copy of MMIMAGEHEADER for future use.
+             ************************************************************/
+            pJPGInfo->mmImgHdr = *pMMImgHdr;
+            
+            /********************************************************
+             * Set up initial pointer value within RGB buffer & image
+             ********************************************************/
+            pJPGInfo->lImgBytePos = 0;
+
+#ifdef DEBUG
+            writeLog("MMIO_SETHEADER done\n");
+#endif
+            
+            return (sizeof (MMIMAGEHEADER));
+            }  /* end case of MMIOM_SETHEADER */
+            
+            /*#############################################################*/
+            /*#############################################################*/
+        case MMIOM_WRITE:
+            {
+
+            /************************************************************
+             * Declare Local Variables.
+             ************************************************************/
+            PJPGFILESTATUS       pJPGInfo;
+            USHORT              usBitCount;
+            LONG                lBytesWritten;
+            ULONG               ulImgBytesToWrite;
+
+#ifdef DEBUG
+            writeLog("MMIO_WRITE\n");
+#endif
+
+            /************************************************************
+             * Check for valid MMIOINFO block.
+             ************************************************************/
+            if (!pmmioinfo)
+                return (MMIO_ERROR);
+
+            /************************************************************
+             * Set up our working variable JPGFILESTATUS.
+             ************************************************************/
+            pJPGInfo = (PJPGFILESTATUS) pmmioinfo->pExtraInfoStruct;
+
+            /************************************************************
+             * See if a SetHeader has been done on this file.
+             ************************************************************/
+            if ((!pJPGInfo) || (!pJPGInfo->bSetHeader))
+              {
+                return (MMIO_ERROR);
+              }
+
+            if (!(pmmioinfo->ulTranslate & MMIO_TRANSLATEDATA))
+              {
+                /********************************************************
+                 * Translation is off, take amount of bytes sent and
+                 * write to the file.
+                 ********************************************************
+                 * Ensure that there is a data buffer to write from
+                 ********************************************************/
+                if (!lParam1)
+                  return (MMIO_ERROR);
+      
+                /* We don't do untranslated writes. We shouldn't come here because
+                   the MMIO_OPEN call must fail because of the TRANSLATE flag */
+                return (MMIO_ERROR);
+#if 0
+                lBytesWritten = mmioWrite (pVidInfo->hmmioSS,
+                                           (PVOID) lParam1,
+                                           (ULONG) lParam2);
+                
+                return (lBytesWritten);
+#endif
+                }
+
+            /************************************************************
+             * Translation is on.
+             *************************************************************/
+
+#ifdef DEBUG
+            writeLog("MMIO_WRITE: pJPGInfo->lImgBytePos %d lParam2 %d pJPGInfo->ulImgTotalBytes: %d bytes\n",
+                     pJPGInfo->lImgBytePos, lParam2, pJPGInfo->ulImgTotalBytes);
+#endif
+
+            /************************************************************
+             * Ensure we do not attempt to write past the end of the
+             *    buffer...
+             ************************************************************/
+            if ((ULONG)(pJPGInfo->lImgBytePos + lParam2) >
+               pJPGInfo->ulImgTotalBytes)
+               ulImgBytesToWrite =
+                   pJPGInfo->ulImgTotalBytes - pJPGInfo->lImgBytePos;
+            else {
+               ulImgBytesToWrite = (ULONG)lParam2;
+            }
+
+#ifdef DEBUG
+            writeLog("MMIO_WRITE: ulImgBytesToWrite %d \n", ulImgBytesToWrite);
+#endif
+
+            /************************************************************
+             * Write the data into the image buffer.  It will be converted
+             *  when the file is closed.  This allows the
+             *   application to seek to arbitrary  positions within the
+             *   image in terms of the bits/pel, etc they are writing.
+             ************************************************************/
+            memcpy (&(pJPGInfo->lpRGBBuf[pJPGInfo->lImgBytePos]),
+                    (PVOID)lParam1,
+                    ulImgBytesToWrite);
+
+            /* Update current position in the image buffer */
+            pJPGInfo->lImgBytePos += ulImgBytesToWrite;
+#ifdef DEBUG
+            writeLog("MMIO_WRITE: written %d bytes\n", ulImgBytesToWrite);
+#endif            
+            return (ulImgBytesToWrite);
+            }   /* end case of MMIOM_WRITE */
+
+        /* 
+         * If the IOProc has a child IOProc, then pass the message on to the Child, otherwise 
+         * return Unsupported Message
+         */
+        default: 
+            {
+             /*
+              * Declare Local Variables.
+              */
+              //             PMMFILESTATUS       pVidInfo;
+             LONG                lRC;
+
+             /************************************************************
+              * Check for valid MMIOINFO block.
+              ************************************************************/
+             if (!pmmioinfo)
+                 return (MMIO_ERROR);
+
+             /* !!!!!!!!!!!! FIXME !!!!!!!!!!!!!*/ 
+             return (MMIOERR_UNSUPPORTED_MESSAGE);
+#if 0
+             /************************************************************
+              * Set up our working variable MMFILESTATUS.
+              ************************************************************/
+             pVidInfo = (PMMFILESTATUS) pmmioinfo->pExtraInfoStruct;
+
+             if (pVidInfo != NULL && pVidInfo->hmmioSS)
+                {
+                 lRC = mmioSendMessage (pVidInfo->hmmioSS,
+                                        usMsg,
+                                        lParam1,
+                                        lParam2);
+                 if (!lRC)
+                    pmmioinfo->ulErrorRet = mmioGetLastError (pVidInfo->hmmioSS);
+                 return (lRC);
+                }
+            else
+               {
+                if (pmmioinfo != NULL) 
+                   pmmioinfo->ulErrorRet = MMIOERR_UNSUPPORTED_MESSAGE;
+                return (MMIOERR_UNSUPPORTED_MESSAGE);
+               }
+#endif
+            }   /* end case of Default */
+
+        } /* end SWITCH statement for MMIO messages */
+
+    return (0);
+    }      /* end of window procedure */
Index: /tags/CWMM-0.3.0_GA/JPGPROC/source/jpgproc.h
===================================================================
--- /tags/CWMM-0.3.0_GA/JPGPROC/source/jpgproc.h	(revision 213)
+++ /tags/CWMM-0.3.0_GA/JPGPROC/source/jpgproc.h	(revision 213)
@@ -0,0 +1,106 @@
+/*
+ * Copyright (c) Chris Wohlgemuth 2002 
+ * All rights reserved.
+ *
+ * http://www.geocities.com/SiliconValley/Sector/5785/
+ * http://www.os2world.com/cdwriting
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. The authors name may not be used to endorse or promote products
+ *    derived from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ *
+ */
+
+/********************** START OF SPECIFICATIONS *************************/
+/*                                                                      */
+/* COPYRIGHT:                                                           */
+/*              Chris Wohlgemuth 2002                                   */
+/*                        All Rights Reserved                           */
+/*                                                                      */
+/* ABSTRACT: This file is the include/header file for use with the      */
+/*           JPG IOProc                                                 */
+/*                                                                      */
+/*********************** END OF SPECIFICATIONS **************************/
+#include "gbm.h"
+
+#pragma pack(2)
+
+static char     pszJPGExt  [] = "JPG";
+
+typedef RGB FAR *PRGB;  
+
+
+/****************************************
+ * IOProc information structure, used for every file opened
+ *    by this IOProc
+ ****************************************/
+typedef struct _JPGFILESTATUS
+{
+  GBM gbm;
+  int ft;  /* GBM index for the proc to use */
+  int fHandleGBM;
+
+  PBYTE   lpRGBBuf;               /* 24-bit RGB Buf for translated data */
+  ULONG   ulRGBTotalBytes;        /* Length of 24-bit RGBBuf       */
+
+  LONG    lImgBytePos;            /* Current pos in RGB buf        */
+
+  ULONG   ulImgTotalBytes;
+  BOOL    bSetHeader;             /* TRUE if header set in WRITE mode*/
+  
+  MMIMAGEHEADER   mmImgHdr;       /* Standard image header         */
+} JPGFILESTATUS;
+typedef JPGFILESTATUS FAR *PJPGFILESTATUS;
+
+#define     MMOTION_HEADER_SIZE         sizeof (MMOTIONHEADER)
+#define     ONE_BLOCK                   6L
+#define     FOURCC_JPG                 mmioFOURCC('J', 'P', 'E', 'G')
+
+/* RC file defines */
+
+#define     HEX_FOURCC_JPG               0x4745504aL
+
+#define     MMOTION_IOPROC_NAME_TABLE   7000
+#define     MMOTION_NLS_CHARSET_INFO    7500
+
+#ifndef BITT_NONE
+#define BITT_NONE 0
+#define BI_NONE   0
+#endif
+
+/**********************
+ * Function Declarations
+ **********************/
+LONG EXPENTRY IOProc_Entry (PVOID  pmmioStr, USHORT usMsg,
+                                   LONG   lParam1, LONG lParam2);
+
+
+LONG GetFormatString (LONG lSearchId,
+                      PSZ  pszFormatString,
+                      LONG lBytes);
+
+LONG GetFormatStringLength (LONG  lSearchId,
+                            PLONG plNameLength);
+
+ULONG APIENTRY GetNLSData (PULONG, PULONG);
+
+#pragma pack()
Index: /tags/CWMM-0.3.0_GA/JPGPROC/source/jpgproc.rc
===================================================================
--- /tags/CWMM-0.3.0_GA/JPGPROC/source/jpgproc.rc	(revision 213)
+++ /tags/CWMM-0.3.0_GA/JPGPROC/source/jpgproc.rc	(revision 213)
@@ -0,0 +1,47 @@
+;/*
+; * Copyright (c) Chris Wohlgemuth 2002 
+; * All rights reserved.
+; *
+; * http://www.geocities.com/SiliconValley/Sector/5785/
+; * http://www.os2world.com/cdwriting
+; *
+; * Redistribution and use in source and binary forms, with or without
+; * modification, are permitted provided that the following conditions
+; * are met:
+; * 1. Redistributions of source code must retain the above copyright
+; *    notice, this list of conditions and the following disclaimer.
+; * 2. Redistributions in binary form must reproduce the above copyright
+; *    notice, this list of conditions and the following disclaimer in the
+; *    documentation and/or other materials provided with the distribution.
+; * 3. The authors name may not be used to endorse or promote products
+; *    derived from this software without specific prior written permission.
+; *
+; * THIS SOFTWARE IS PROVIDED ``AS IS'' AND
+; * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+; * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+; * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+; * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+; * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+; * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+; * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+; * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+; * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+; * SUCH DAMAGE.
+; *
+; */
+#include <mmioos2.h>
+#include "jpgproc.h"
+
+RCDATA MMOTION_NLS_CHARSET_INFO
+BEGIN
+        MMIO_DEFAULT_CODE_PAGE,
+        MMIO_CC_USA,
+        MMIO_LC_US_ENGLISH,
+        MMIO_DC_US_ENGLISH
+END
+
+RCDATA MMOTION_IOPROC_NAME_TABLE
+BEGIN
+        HEX_FOURCC_JPG,     "JPG-IOProc\0",
+        0,                   "\0"
+END
Index: /tags/CWMM-0.3.0_GA/JPGPROC/source/makefile
===================================================================
--- /tags/CWMM-0.3.0_GA/JPGPROC/source/makefile	(revision 213)
+++ /tags/CWMM-0.3.0_GA/JPGPROC/source/makefile	(revision 213)
@@ -0,0 +1,103 @@
+#/*
+# * Copyright (c) Chris Wohlgemuth 2002
+# * All rights reserved.
+# *
+# * http://www.geocities.com/SiliconValley/Sector/5785/
+# * http://www.os2world.com/cdwriting
+# *
+# * Redistribution and use in source and binary forms, with or without
+# * modification, are permitted provided that the following conditions
+# * are met:
+# * 1. Redistributions of source code must retain the above copyright
+# *    notice, this list of conditions and the following disclaimer.
+# * 2. Redistributions in binary form must reproduce the above copyright
+# *    notice, this list of conditions and the following disclaimer in the
+# *    documentation and/or other materials provided with the distribution.
+# * 3. The authors name may not be used to endorse or promote products
+# *    derived from this software without specific prior written permission.
+# *
+# * THIS SOFTWARE IS PROVIDED ``AS IS'' AND
+# * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+# * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+# * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+# * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+# * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+# * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+# * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+# * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+# * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+# * SUCH DAMAGE.
+# *
+# */
+#################################################################################
+#
+# Makefile for JPG IOProc
+#
+#   Generates
+#         JPEGIO.dll       - JPG Image IOproc
+#
+# Copyright Chris Wohlgemuth 2002
+#
+# http://www.os2world.com/cdwriting
+# http://www.geocities.com/SiliconValley/Sector/5785/
+#
+# Use VAC++ V3.08 and gmake to compile
+#
+#################################################################################
+include ../../make.inc
+
+.SUFFIXES: .exe .obj .asm .inc .def .lrf .lst .sym .map .c .h .lib .dlg .txt .cod  \
+           .res .rc .l$(LANG) .dll
+
+
+#################################
+CC=icc
+CFLAGS       =   -Ge- /Gm+ -G4 /ss -Gl /O+ -Oc+ -Ol- /Q+ /C
+
+#################################
+# Definitions for linker
+# LIBRARIES:
+#  MMPM2  == MMPM2 Library
+#################################
+MAPSYM=mapsym
+LIBS=	MMPM2.LIB $(GBMLIBPATH)/GBM.LIB
+LDFLAGS =	-Ge- /Gm+ -G4 /ss -Gl /O+ -Oc+ -Ol-  /Q+ /B"/NOE"
+
+
+#################################
+# Object file lists
+#################################
+OBJS =	jpgproc.obj jpgfunc.obj
+
+#################################
+# Target Descriptions
+#################################
+all:	JPEGIO.DLL
+#iotest.exe
+
+
+iotest.exe:	iotest.c
+	icc iotest.c $(LIBS)
+
+JPEGIO.DLL:		$(OBJS)
+	cmd /C $(TOOLDIR)/create_def.cmd JPEGIO.def
+	$(CC) $(LDFLAGS)  /Fm$(basename $@) /Fe$@  $(OBJS) $(LIBS) JPEGIO.def
+	rc JPGproc.rc JPEGIO.dll
+	mapsym JPEGIO.map
+
+
+
+jpgproc.obj:	jpgproc.c
+	$(CC) $(CFLAGS) /Fo$@ $<
+
+jpgfunc.obj:	jpgfunc.c
+	$(CC) $(CFLAGS) /Fo$@ $<
+
+clean:
+	-rm *.obj
+	-rm *.dll
+	-rm *.RES
+	-rm *.*~
+	-rm *.map
+	-rm *.sym
+	-rm *.def
Index: /tags/CWMM-0.3.0_GA/LocalEnv.cmd.tpl
===================================================================
--- /tags/CWMM-0.3.0_GA/LocalEnv.cmd.tpl	(revision 213)
+++ /tags/CWMM-0.3.0_GA/LocalEnv.cmd.tpl	(revision 213)
@@ -0,0 +1,61 @@
+/*
+ * Local environment settings for Lucide (Template)
+ *
+ * This file is used to specify local paths to external tools and libraries
+ * and to perform other site-specific project environment setup.
+ *
+ * NOTES:
+ *
+ *   This file is a template! Copy it to a file named LocalEnv.cmd in
+ *   the same directory and modify the copy to fit your local environment.
+ *
+ *   All paths in this file are specified using back slashes unless specified
+ *   otherwise.
+ */
+
+/**
+ * Path to kBuild. Leave it empty if you already have kBuild in path.
+ */
+G.PATH_TOOL_KBUILD      = 'U:\Kbuild_workspace\trunk\kbuild'
+
+/**
+ * Path to the GCC 4.x.x environment script. Leave it empty if you already have
+ * already setup the GCC 4.x.x environment.
+ */
+G.PATH_TOOL_GCC4_ENV    = 'U:\gcc492.cmd'
+
+/**
+ * Path to SOM SDK. Leave it empty if you have OS/2 Toolkit 4.5 installed.
+ */
+G.PATH_SDK_SOM          = 'U:\Toolkit\som'
+
+/**
+ * Paths to the OS2 tollkit. Needed to find sw.h perhaps other multimedia headers.
+ */
+G.C_INCLUDE_PATH        = 'X:\usr\include;X:\usr\include\os2tk45;%C_INCLUDE_PATH%'
+
+/**
+ * Path where wic.exe and WPIRTL.DLL Leave it
+ * empty if you have them in paths.
+ */
+
+G.PATH_TOOL_WARPIN      = 'J:\sys\install\WARPIN'
+
+/**
+ * Path to the SOM environment script. Leave it empty if you already have
+ * setup the SOM environment.
+ */
+
+G.PATH_TOOL_SOM_ENV     = 'U:\Toolkit\SOM\bin\somenv.cmd'     
+
+/**
+ * Set MAKESHELL to either cmd.exe or 4os2.exe as sh chokes on backslashes
+ */
+
+G.MAKESHELL            = 'G:\4os2\4os2.exe'
+
+/**
+ * Set CWMMLICENCE to your build root/tools so create_def can find licence.txt
+ */
+
+G.CWMMLICENCE          =  'U:\CWMM_Workspace\trunk\tools'
Index: /tags/CWMM-0.3.0_GA/Misc-Information/add2FOURMEG.SCR
===================================================================
--- /tags/CWMM-0.3.0_GA/Misc-Information/add2FOURMEG.SCR	(revision 213)
+++ /tags/CWMM-0.3.0_GA/Misc-Information/add2FOURMEG.SCR	(revision 213)
@@ -0,0 +1,546 @@
+
+/*  The BASE.SCR change file for MMPM2.INI  */
+
+/* The basic syntax is KEYWORD = one of (STRING, NUMBER, ARRAY)      */
+/* All keywords are unique.                                          */
+
+/***
+    #define CO_FAILIFEXISTS       0
+    #define CO_REPLACEIFEXISTS    1
+    #define CO_UPDATEIFEXISTS     2
+***/
+
+/*
+
+---------------------------------------------------
+See comment for explanation of what's going on with
+these settings.
+---------------------------------------------------
+
+	Destination directories:
+
+$(DEST)1      :    \\MMOS2\\MMClass\\          <--- CWMM.DLL is in this directory
+$(DEST)2      :    \\MMOS2\\MediaFld\\bin\\    <--- MEDIAFLD.DLL is in this directory
+$(DEST)3      :    \\MMOS2\\FreeDB\\
+$(DEST)4      :    \\MMOS2\\FreeDB             <--- No trailing backslash for INI entry!!!
+
+The file tree must have the following format:
+
+ Verzeichnis von H:\MMOS2
+
+19.11.02  21.04      <DIR>           0  .
+19.11.02  21.04      <DIR>           0  ..
+19.11.02  22.29      <DIR>           0  MediaFld
+19.11.02  22.30      <DIR>         713  MMClass
+19.11.02  22.29      <DIR>           0  FreeDB              <--- Contains FreeDB client
+
+ Verzeichnis von H:\MMOS2\MediaFld
+
+19.11.02  22.29      <DIR>           0  .
+19.11.02  22.29      <DIR>           0  ..
+24.11.02   2.48      <DIR>         742  bin
+19.11.02  22.29      <DIR>           0  Doc
+
+ Verzeichnis von H:\MMOS2\MediaFld\bin
+
+19.11.02  22.29      <DIR>           0  .
+19.11.02  22.29      <DIR>           0  ..
+19.11.02  22.29       1233           0  createcd.exe
+19.11.02  22.29       1909          34  creatobj.cmd
+19.11.02  22.29      44211           0  media001.dll        <--- German NLV is: media049.dll
+19.11.02  22.29     126967          61  mediafld.dll
+19.11.02  22.29       2898           0  mediafld.hlp        <--- Use the right NLV
+19.11.02  22.29        504          35  setFolder.cmd
+19.11.02  22.29        891          35  setShadow.cmd
+19.11.02  22.29       2552          42  trknames.cmd
+
+
+ Verzeichnis von H:\MMOS2\MediaFld\Doc
+
+19.11.02  22.29      <DIR>           0  .
+19.11.02  22.29      <DIR>           0  ..
+19.11.02  22.29      19563           0  mediafldr.inf       <--- No need to create a program object. I think this doc is power user stuff.
+                                                                 So keep it hidden.
+         3 Datei(en)      19563 Byte belegt
+
+ Verzeichnis von H:\MMOS2\FreeDB            (Contains FreeDB client)
+
+19.11.02  22.29      <DIR>           0  .
+19.11.02  22.29      <DIR>           0  ..
+19.11.02  22.29      <DIR>           0  cddbdata
+19.11.02  22.29      <DIR>           0  logfiles
+19.11.02  22.29        444           0  cddb.ini
+19.11.02  22.29      14879          49  pmcddb.exe
+19.11.02  22.29       3019        3388  pmdb001.dll         <--- German NLV is pmdb049.dll
+
+ Verzeichnis von H:\MMOS2\FreeDB\cddbdata
+
+19.11.02  22.29      <DIR>           0  .
+19.11.02  22.29      <DIR>           0  ..
+
+ Verzeichnis von H:\MMOS2\FreeDB\logfiles
+
+19.11.02  22.29      <DIR>           0  .
+19.11.02  22.29      <DIR>           0  ..
+
+ Verzeichnis von H:\MMOS2\MMClass
+
+19.11.02  22.28      <DIR>           0  .
+19.11.02  22.28      <DIR>           0  ..
+19.11.02  22.28      <DIR>           0  bin
+19.11.02  22.28     216530           0  cwmm.dll            <--- Be sure to use the right NLV
+19.11.02  22.28       2982           0  cwmm.hlp            <--- Be sure to use the right NLV
+
+ Verzeichnis von H:\MMOS2\MMClass\bin
+
+19.11.02  22.28      <DIR>           0  .
+19.11.02  22.28      <DIR>           0  ..
+19.11.02  22.28       8066           0  audconv.exe         <--- Be sure to use the right NLV
+19.11.02  22.28        504           0  audfldr.cmd
+19.11.02  22.28       7758           0  imgconv.exe         <--- Be sure to use the right NLV
+19.11.02  22.28        504           0  imgfldr.cmd
+19.11.02  22.28       8409        4070  volume.exe          <--- Be sure to use the right NLV
+
+--------------
+
+The following files go into \MMOS2\DLL:
+
+19.11.02  22.28     186838           0  GBM.DLL
+19.11.02  22.28      17496           0  JPEGIO.DLL
+19.11.02  22.28       1540           0  JPEGIO.SYM
+
+--------------
+
+This DLL MUST be in the LIBPATH!!  (Preferably x:\OS2\DLL)
+
+19.11.02  22.29      33052           0  progfldr.dll
+
+*/
+
+/**************** Create volume object ****************/
+
+WPObject =
+   (
+   WPClassName   = "WPProgram"
+   WPTitle       = "Volume"
+   WPSetupString = ""EXENAME=$(DEST)1bin\\volume.exe;PROGTYPE=PM;OBJECTID=<MMPM2_MMVOLUME>"
+   WPLocation    = "<MMPM2_FOLDER>"
+   WPFlags       = 2L
+   )
+
+/**************** Create FreeDb configuration object ****************/
+
+WPObject =
+   (
+   WPClassName   = "WPProgram"
+   WPTitle       = "Configure CDDB Client"
+   WPSetupString = ""EXENAME=$(DEST)3PMCDDB.EXE;ICONRESOURCE=1,$(DEST)3pmdb001.dll;PARAMETERS=/C [Your email (user@host.xxx)];PROGTYPE=PM;PARAMETERS=;OBJECTID=<CWFREEDB_CLIENT_CONFIG>"
+   WPLocation    = "<MMPM2_FOLDER>"
+   WPFlags       = 2L
+   )
+
+
+
+/**************** Set audioconverter exe ****************************/
+ProfileString =
+   (
+   inis = "hini_user"
+   appnames = "CWMM"
+   keynames = "audioconverter"
+   datas = "$(DEST)1bin\\audconv.exe"
+   )
+
+/**************** Set imageconverter exe ****************************/
+ProfileString =
+   (
+   inis = "hini_user"
+   appnames = "CWMM"
+   keynames = "imageconverter"
+   datas = "$(DEST)1bin\\imgconv.exe"
+   )
+
+/**************** Set install directory of the FreeDB client ********/
+ProfileString =
+   (
+   inis = "hini_user"
+   appnames = "CWMM"
+   keynames = "freedbclient"
+   datas = "$(DEST)4"
+   )
+
+/**************** Set default E-Mail address for FreeDB (e.g. user@hostname.com) ****************************/
+ProfileString =
+   (
+   inis = "$(DEST)3cddb.ini"
+   appnames = "cddb"
+   keynames = "cddbuser"
+   datas = "eCS.User"
+   )
+
+ProfileString =
+   (
+   inis = "$(DEST)3cddb.ini"
+   appnames = "cddb"
+   keynames = "cddbuserhost"
+   datas = "hostname.com"
+   )
+
+
+
+
+/******* Install MM base classes ********/
+
+
+/* The progfldr.dll MUST be in libpath! Preferably in x:\os2\dll */
+
+WPClass =
+   (
+   WPClassNameNew = "CWProgFolder"
+   WPDllName = "PROGFLDR"
+   WPReplaceClass = ""
+   )
+
+
+/* The classes will automatically create their templates when
+   the templates folder is opened. The multimedia template folder
+   must exist with the usual object ID (<MMPM2_MMTEMPLATEFOLDER>)!
+
+   Templates are only created for MM files for which a write enabled
+   IO-procedure exists.
+   
+   Image:
+		JPG
+		TIF
+		Targa
+		PCX
+		DIB
+		VID
+		GIF
+		MID
+
+		The Bitmap template should be automatically created by the system.
+
+   Audio:
+		WAV
+		OGG
+
+   Misc:
+		M3U playlist
+		Media player
+		Lighttable folder
+
+   No video templates are created because a working video editor does
+   not exist so a template would be senseless.
+
+*/
+
+WPClass =
+   (
+   WPClassNameNew = "MMDataFile"
+   WPDllName = "$(DEST)1CWMM"
+   WPReplaceClass = ""
+   )
+
+WPClass =
+   (
+   WPClassNameNew = "MMImage"
+   WPDllName = "$(DEST)1CWMM"
+   WPReplaceClass = ""
+   )
+
+WPClass =
+   (
+   WPClassNameNew = "MMAudio"
+   WPDllName = "$(DEST)1CWMM"
+   WPReplaceClass = ""
+   )
+
+WPClass =
+   (
+   WPClassNameNew = "MMVideo"
+   WPDllName = "$(DEST)1CWMM"
+   WPReplaceClass = ""
+   )
+
+WPClass =
+   (
+   WPClassNameNew = "MMMIDI"
+   WPDllName = "$(DEST)1CWMM"
+   WPReplaceClass = ""
+   )
+
+WPClass =
+   (
+   WPClassNameNew = "MMTarga"
+   WPDllName = "$(DEST)1CWMM"
+   WPReplaceClass = ""
+   )
+
+WPClass =
+   (
+   WPClassNameNew = "MMTIFF"
+   WPDllName = "$(DEST)1CWMM"
+   WPReplaceClass = ""
+   )
+
+WPClass =
+   (
+   WPClassNameNew = "MMGIF"
+   WPDllName = "$(DEST)1CWMM"
+   WPReplaceClass = ""
+   )
+
+WPClass =
+   (
+   WPClassNameNew = "MMPCX"
+   WPDllName = "$(DEST)1CWMM"
+   WPReplaceClass = ""
+   )
+
+WPClass =
+   (
+   WPClassNameNew = "MMPhotoCD"
+   WPDllName = "$(DEST)1CWMM"
+   WPReplaceClass = ""
+   )
+
+WPClass =
+   (
+   WPClassNameNew = "MMJPG"
+   WPDllName = "$(DEST)1CWMM"
+   WPReplaceClass = ""
+   )
+
+WPClass =
+   (
+   WPClassNameNew = "MMDIB"
+   WPDllName = "$(DEST)1CWMM"
+   WPReplaceClass = ""
+   )
+
+WPClass =
+   (
+   WPClassNameNew = "MMAVC"
+   WPDllName = "$(DEST)1CWMM"
+   WPReplaceClass = ""
+   )
+
+WPClass =
+   (
+   WPClassNameNew = "MMMMotion"
+   WPDllName = "$(DEST)1CWMM"
+   WPReplaceClass = ""
+   )
+
+WPClass =
+   (
+   WPClassNameNew = "MMVOC"
+   WPDllName = "$(DEST)1CWMM"
+   WPReplaceClass = ""
+   )
+
+WPClass =
+   (
+   WPClassNameNew = "MM_AU"
+   WPDllName = "$(DEST)1CWMM"
+   WPReplaceClass = ""
+   )
+
+WPClass =
+   (
+   WPClassNameNew = "MMAIF"
+   WPDllName = "$(DEST)1CWMM"
+   WPReplaceClass = ""
+   )
+
+WPClass =
+   (
+   WPClassNameNew = "MMIFF"
+   WPDllName = "$(DEST)1CWMM"
+   WPReplaceClass = ""
+   )
+
+WPClass =
+   (
+   WPClassNameNew = "MMSNDF"
+   WPDllName = "$(DEST)1CWMM"
+   WPReplaceClass = ""
+   )
+
+WPClass =
+   (
+   WPClassNameNew = "MMWAV"
+   WPDllName = "$(DEST)1CWMM"
+   WPReplaceClass = ""
+   )
+
+WPClass =
+   (
+   WPClassNameNew = "MMMP3"
+   WPDllName = "$(DEST)1CWMM"
+   WPReplaceClass = ""
+   )
+
+WPClass =
+   (
+   WPClassNameNew = "MMOGG"
+   WPDllName = "$(DEST)1CWMM"
+   WPReplaceClass = ""
+   )
+
+WPClass =
+   (
+   WPClassNameNew = "MMAU"
+   WPDllName = "$(DEST)1CWMM"
+   WPReplaceClass = ""
+   )
+
+WPClass =
+   (
+   WPClassNameNew = "MMCDTrack"
+   WPDllName = "$(DEST)1CWMM"
+   WPReplaceClass = ""
+   )
+
+WPClass =
+   (
+   WPClassNameNew = "MMAudioStream"
+   WPDllName = "$(DEST)1CWMM"
+   WPReplaceClass = ""
+   )
+
+WPClass =
+   (
+   WPClassNameNew = "MMM3U"
+   WPDllName = "$(DEST)1CWMM"
+   WPReplaceClass = ""
+   )
+
+WPClass =
+   (
+   WPClassNameNew = "MMAVI"
+   WPDllName = "$(DEST)1CWMM"
+   WPReplaceClass = ""
+   )
+
+WPClass =
+   (
+   WPClassNameNew = "MMFLI"
+   WPDllName = "$(DEST)1CWMM"
+   WPReplaceClass = ""
+   )
+
+WPClass =
+   (
+   WPClassNameNew = "MMMPG"
+   WPDllName = "$(DEST)1CWMM"
+   WPReplaceClass = ""
+   )
+
+WPClass =
+   (
+   WPClassNameNew = "MMMOV"
+   WPDllName = "$(DEST)1CWMM"
+   WPReplaceClass = ""
+   )
+
+/* Light table folder */
+WPClass =
+   (
+   WPClassNameNew = "MMFolder"
+   WPDllName = "$(DEST)1CWMM"
+   WPReplaceClass = ""
+   )
+
+WPClass =
+   (
+   WPClassNameNew = "MMBitmap"
+   WPDllName = "$(DEST)1CWMM"
+   WPReplaceClass = "WPBitmap"
+   )
+
+WPClass =
+   (
+   WPClassNameNew = "CWMMDisk"
+   WPDllName = "$(DEST)1CWMM"
+   WPReplaceClass = "WPDisk"
+   )
+
+/* IBM MM shadow */
+WPClass =
+   (
+   WPClassNameNew = "MMShadow"
+   WPDllName = "MMSHD"
+   WPReplaceClass = "WPShadow"
+   )
+
+/************ Media folder and cd folder **********************/
+
+
+WPClass =
+   (
+   WPClassNameNew = "CWMediaFolder"
+   WPDllName = "$(DEST)2MEDIAFLD"
+   WPReplaceClass = ""
+   )
+
+WPClass =
+   (
+   WPClassNameNew = "CWAudioShadow"
+   WPDllName = "$(DEST)2MEDIAFLD"
+   WPReplaceClass = ""
+   )
+
+WPClass =
+   (
+   WPClassNameNew = "CWCDFolder"
+   WPDllName = "$(DEST)2MEDIAFLD"
+   WPReplaceClass = ""
+   )
+
+/* end of base.scr */
+
+
+
+
+
+
+
+/***************** The following classes are discarded *********
+
+WPClass =
+   (
+   WPClassNameNew = "MMDevice"
+   WPDllName = "$(DEST)1CWMM"
+   WPReplaceClass = ""
+   )
+
+WPClass =
+   (
+   WPClassNameNew = "MMCDDevice"
+   WPDllName = "$(DEST)1CWMM"
+   WPReplaceClass = ""
+   )
+
+WPClass =
+   (
+   WPClassNameNew = "MMLVDDevice"
+   WPDllName = "$(DEST)1CWMM"
+   WPReplaceClass = ""
+   )
+
+WPClass =
+   (
+   WPClassNameNew = "MMVolume"
+   WPDllName = "$(DEST)1CWMM"
+   WPReplaceClass = ""
+   )
+
+WPClass =
+   (
+   WPClassNameNew = "MMFinder"
+   WPDllName = "$(DEST)1CWMM"
+   WPReplaceClass = ""
+   )
+
+***********************/
Index: /tags/CWMM-0.3.0_GA/Misc-Information/create-hh-file.txt
===================================================================
--- /tags/CWMM-0.3.0_GA/Misc-Information/create-hh-file.txt	(revision 213)
+++ /tags/CWMM-0.3.0_GA/Misc-Information/create-hh-file.txt	(revision 213)
@@ -0,0 +1,1 @@
+sc -shh -S 64000  -m noqualifytypes wpdesk
Index: /tags/CWMM-0.3.0_GA/Misc-Information/cwmm_info.txt
===================================================================
--- /tags/CWMM-0.3.0_GA/Misc-Information/cwmm_info.txt	(revision 213)
+++ /tags/CWMM-0.3.0_GA/Misc-Information/cwmm_info.txt	(revision 213)
@@ -0,0 +1,22 @@
+Installation
+----------
+
+1. IBM classes must be deinstalled
+2. MMPARTS.DLL must be copied out of the libpath
+3. ab.exe and ib.exe must be copied into the MMPARTS.DLL directory.
+4. In user INI there must be pointers to the new location of these programs. Keys: CWMM->ab and CWMM->ib
+
+Programming
+------------
+1.
+During installation the MMPARTS.DLL is copied out of the LIBPATH. ab.exe and ib.exe are copied to the new
+location of MMPARTS.DLL. The new location of these programs is written to user-ini under the keys CWMM->ab
+and CWMM->ib.
+In the wpOpen() method of MMAudio and MMImage this new location is queried to start the respective programs
+(image and audio editor). When the editor apps finally are replaced this can be changed.
+
+2.
+Creating of *.hh files from IDL files:
+
+sc -shh -S 64000  -m noqualifytypes <filename_without_ext>
+
Index: /tags/CWMM-0.3.0_GA/Misc-Information/mmclass-methods.txt
===================================================================
--- /tags/CWMM-0.3.0_GA/Misc-Information/mmclass-methods.txt	(revision 213)
+++ /tags/CWMM-0.3.0_GA/Misc-Information/mmclass-methods.txt	(revision 213)
@@ -0,0 +1,2316 @@
+Objects:
+
+ID:		<MMPM_DAPLAYER1>
+Title:		Digital-Audio-
+Spieler
+Location:	<MMPM2_FOLDER>
+Path:		WEPM.EXE
+Parameter:	Waveaudio01
+Working dir:	J:\MMOS2\SOUNDS
+
+ID:		<MMPM_MIDIPLAYER1>
+Title:		MIDI-Spieler
+Location:	<MMPM2_FOLDER>
+Path:		MPPM.EXE
+Parameter:	Sequencer01
+Working dir:	J:\MMOS2\SOUNDS
+
+ID:		<MMPM2_SOFTWARE_MOTION_VIDEO1>
+Title:		Digital-Video-
+Spieler
+Location:	<MMPM2_FOLDER>
+Path:		MPPM.EXE
+Parameter:	Digitalvideo01
+Working dir:	J:\MMOS2\MOVIES
+
+ID:		<MMPM_CDPLAYER1>
+Title:		CD-Spieler
+Location:	<MMPM2_FOLDER>
+Path:		CDPM.EXE
+Parameter:	CDaudio01
+Working dir:	J:\MMOS2\SOUNDS
+
+------------------------------------------------
+
+Class:  WPImageFile             	00e682bc
+Metaclass:  M_WPImageFile       	00e690d8
+Parent:  CWDataFile              	00e6eba0
+
+Module:  D:\OS2\DLL\PMWP.DLL
+Load cause:  WPS registration
+
+Registered WPS class
+Title:  Bilddatei
+Storage class:  WPFileSystem
+
+Default View:  Running (0x04)
+Class Style:  0x90 (NeverTemplate NeverPrint)
+File Associations:
+  Name:  none
+  Type:  Bilddatei
+
+Instance Method & Data Summary
+Cnt	Size	Source
+  6	  0	WPImageFile
+  0	  0	CWDataFile
+ 14	  0	WPDataFile
+ 41	 52	WPFileSystem
+  0	  0	CWObject
+163	144	WPObject
+ 32	  0	SOMObject
+256	200	total
+
+Class Method & Data Summary
+Cnt	Size	Source
+  0	  4	M_WPImageFile
+  0	  0	M_CWDataFile
+  2	  0	M_WPDataFile
+  6	  0	M_WPFileSystem
+  0	  0	M_CWObject
+ 45	 20	M_WPObject
+ 75	380	SOMClass
+ 32	  0	SOMObject
+160	408	total
+
+WPImageFile - 6 New methods:
+
+250  wpQueryBitmapHandle     	1fd019b8
+251  wpQueryBitmapInfoHeader 	1fd019b4
+252  wpQueryBitmapData       	1fd019b0
+253  wpSetBitmapData         	1fd019ac
+254  wpReadImageFile         	1fd019a8
+255  wpWriteImageFile        	1fd019a4
+
+WPImageFile - Override methods:
+
+from WPDataFile:
+247  wpSetContentsFromHandle 	1fd019bc
+248  wpQueryHandleFromContents	1fd01cf8
+
+from WPObject:
+128  wpUnInitData            	1fc7020c
+
+from SOMObject:
+000  somDefaultInit          	1fcb1d78
+001  somDestruct             	1fcb0488
+
+M_WPImageFile - No New methods.
+
+M_WPImageFile - Override methods:
+
+from M_WPFileSystem:
+155  wpclsQueryInstanceType  	1fcbd980
+
+from M_WPObject:
+111  wpclsQueryDefaultHelp   	1fd0198c
+119  wpclsQueryStyle         	1fcb1d64
+120  wpclsQueryTitle         	1fcdd000
+
+--------------------------------------------
+
+Class:  MMImage                 	0125f334
+Metaclass:  M_MMImage           	012606b0
+Parent:  WPImageFile             	00e682bc
+
+Module:  D:\MMOS2\DLL\MMPARTS.DLL
+Load cause:  WPS registration
+
+Registered WPS class
+Title:  Digitales Bild
+Storage class:  WPFileSystem
+
+Default View:  User+22315 (0xbc2b)
+Class Style:  0x80 (NeverPrint)
+File Associations:
+  Name:  *.JPN
+  Type:  none
+
+Instance Method & Data Summary
+Cnt	Size	Source
+  2	 24	MMImage
+  6	  0	WPImageFile
+  0	  0	CWDataFile
+ 14	  0	WPDataFile
+ 41	 52	WPFileSystem
+  0	  0	CWObject
+163	144	WPObject
+ 32	  0	SOMObject
+258	224	total
+
+Class Method & Data Summary
+Cnt	Size	Source
+  4	  0	M_MMImage
+  0	  4	M_WPImageFile
+  0	  0	M_CWDataFile
+  2	  0	M_WPDataFile
+  6	  0	M_WPFileSystem
+  0	  0	M_CWObject
+ 45	 20	M_WPObject
+ 75	380	SOMClass
+ 32	  0	SOMObject
+164	408	total
+
+MMImage - 2 New methods:
+
+256  mmViewNotify            	1f11f5f0
+257  mmDetermineViewFor      	1f11fff0
+
+MMImage - Override methods:
+
+from WPImageFile:
+250  wpQueryBitmapHandle     	1f11fda1
+251  wpQueryBitmapInfoHeader 	1f11fd51
+252  wpQueryBitmapData       	1f11fd00
+253  wpSetBitmapData         	1f11fc30
+254  wpReadImageFile         	1f11fac1
+255  wpWriteImageFile        	1f11fa30
+
+from WPFileSystem:
+211  wpRefresh               	1f11fb50
+
+from WPObject:
+061  wpFilterPopupMenu       	1f11f640
+064  wpFormatDragItem        	1f11f3e3
+068  wpInitData              	1f11f421
+072  wpMenuItemHelpSelected  	1f11fea4
+073  wpMenuItemSelected      	1f1206f0
+074  wpModifyPopupMenu       	1f120547
+077  wpOpen                  	1f120750
+079  wpQueryConcurrentView   	1f11f510
+083  wpQueryDefaultView      	1f11f4d0
+125  wpSetTitle              	1f120413
+126  wpSetup                 	1f11ff20
+128  wpUnInitData            	1f11f460
+132  wpObjectReady           	1f11f084
+
+from SOMObject:
+000  somDefaultInit          	1f952430
+001  somDestruct             	1f952320
+
+M_MMImage - 4 New methods:
+
+160  mmclsDeleteFromTypeList 	1f11f360
+161  mmclsDeleteFromExtensionList	1f11f2d7
+162  mmclsInitTypesAndExtensions	1f120306
+163  mmclsSetDefaultView     	1f1200f0
+
+M_MMImage - Override methods:
+
+from M_WPFileSystem:
+155  wpclsQueryInstanceType  	1f120220
+156  wpclsQueryInstanceFilter	1f120238
+
+from M_WPObject:
+107  wpclsCreateDefaultTemplates	1f11eef2
+108  wpclsInitData           	1f120250
+111  wpclsQueryDefaultHelp   	1f11f1b0
+112  wpclsQueryDefaultView   	1f1200b0
+119  wpclsQueryStyle         	1f11eed0
+120  wpclsQueryTitle         	1f120130
+121  wpclsUnInitData         	1f11f1e0
+128  wpclsQueryIconData      	1f1204f5
+
+----------------------------------------------
+
+Class:  MMAVC                   	0124c644
+Metaclass:  M_MMAVC             	0124d620
+Parent:  MMImage                 	0125f334
+
+Module:  D:\MMOS2\DLL\MMPARTS.DLL
+Load cause:  WPS registration
+
+Registered WPS class
+Title:  AVCImage._IM
+Storage class:  WPFileSystem
+
+Default View:  User+22315 (0xbc2b)
+Class Style:  0x80 (NeverPrint)
+PM_Workplace:IplLoad:  yes
+File Associations:
+  Name:  *._IM
+  Type:  AVC Image
+
+Instance Method & Data Summary
+Cnt	Size	Source
+  0	  0	MMAVC
+  2	 24	MMImage
+  6	  0	WPImageFile
+  0	  0	CWDataFile
+ 14	  0	WPDataFile
+ 41	 52	WPFileSystem
+  0	  0	CWObject
+163	144	WPObject
+ 32	  0	SOMObject
+258	224	total
+
+Class Method & Data Summary
+Cnt	Size	Source
+  0	  0	M_MMAVC
+  4	  0	M_MMImage
+  0	  4	M_WPImageFile
+  0	  0	M_CWDataFile
+  2	  0	M_WPDataFile
+  6	  0	M_WPFileSystem
+  0	  0	M_CWObject
+ 45	 20	M_WPObject
+ 75	380	SOMClass
+ 32	  0	SOMObject
+164	408	total
+
+MMAVC - No New methods.
+
+MMAVC - Override methods:
+
+M_MMAVC - No New methods.
+
+M_MMAVC - Override methods:
+
+from M_WPFileSystem:
+155  wpclsQueryInstanceType  	1f123c80
+156  wpclsQueryInstanceFilter	1f123cb0
+
+from M_WPObject:
+107  wpclsCreateDefaultTemplates	1f123d15
+108  wpclsInitData           	1f123fd7
+111  wpclsQueryDefaultHelp   	1f123bf0
+119  wpclsQueryStyle         	1f123c40
+120  wpclsQueryTitle         	1f123e70
+121  wpclsUnInitData         	1f123ce0
+128  wpclsQueryIconData      	1f123f70
+
+----------------
+
+Class:  MMDIB                   	01248530
+Metaclass:  M_MMDIB             	0124950c
+Parent:  MMImage                 	0125f334
+
+Module:  D:\MMOS2\DLL\MMPARTS.DLL
+Load cause:  WPS registration
+
+Registered WPS class
+Title:  DIBImage.DIB
+Storage class:  WPFileSystem
+
+Default View:  User+22315 (0xbc2b)
+Class Style:  0x80 (NeverPrint)
+PM_Workplace:IplLoad:  yes
+File Associations:
+  Name:  *.DIB
+  Type:  DIB
+
+Instance Method & Data Summary
+Cnt	Size	Source
+  0	  0	MMDIB
+  2	 24	MMImage
+  6	  0	WPImageFile
+  0	  0	CWDataFile
+ 14	  0	WPDataFile
+ 41	 52	WPFileSystem
+  0	  0	CWObject
+163	144	WPObject
+ 32	  0	SOMObject
+258	224	total
+
+Class Method & Data Summary
+Cnt	Size	Source
+  0	  0	M_MMDIB
+  4	  0	M_MMImage
+  0	  4	M_WPImageFile
+  0	  0	M_CWDataFile
+  2	  0	M_WPDataFile
+  6	  0	M_WPFileSystem
+  0	  0	M_CWObject
+ 45	 20	M_WPObject
+ 75	380	SOMClass
+ 32	  0	SOMObject
+164	408	total
+
+MMDIB - No New methods.
+
+MMDIB - Override methods:
+
+M_MMDIB - No New methods.
+
+M_MMDIB - Override methods:
+
+from M_WPFileSystem:
+155  wpclsQueryInstanceType  	1f124580
+156  wpclsQueryInstanceFilter	1f1245b0
+
+from M_WPObject:
+107  wpclsCreateDefaultTemplates	1f124615
+108  wpclsInitData           	1f1248d7
+111  wpclsQueryDefaultHelp   	1f1244f0
+119  wpclsQueryStyle         	1f124540
+120  wpclsQueryTitle         	1f124770
+121  wpclsUnInitData         	1f1245e0
+128  wpclsQueryIconData      	1f124870
+
+-----------------
+
+Class:  MMGIF                   	0127a9d4
+Metaclass:  M_MMGIF             	0127b9b0
+Parent:  MMImage                 	0125f334
+
+Module:  D:\MMOS2\DLL\MMPARTS.DLL
+Load cause:  WPS registration
+
+Registered WPS class
+Title:  GIFImage.GIF
+Storage class:  WPFileSystem
+
+Default View:  User+22315 (0xbc2b)
+Class Style:  0x80 (NeverPrint)
+PM_Workplace:IplLoad:  yes
+File Associations:
+  Name:  *.GIF
+  Type:  GIF
+
+Instance Method & Data Summary
+Cnt	Size	Source
+  0	  0	MMGIF
+  2	 24	MMImage
+  6	  0	WPImageFile
+  0	  0	CWDataFile
+ 14	  0	WPDataFile
+ 41	 52	WPFileSystem
+  0	  0	CWObject
+163	144	WPObject
+ 32	  0	SOMObject
+258	224	total
+
+Class Method & Data Summary
+Cnt	Size	Source
+  0	  0	M_MMGIF
+  4	  0	M_MMImage
+  0	  4	M_WPImageFile
+  0	  0	M_CWDataFile
+  2	  0	M_WPDataFile
+  6	  0	M_WPFileSystem
+  0	  0	M_CWObject
+ 45	 20	M_WPObject
+ 75	380	SOMClass
+ 32	  0	SOMObject
+164	408	total
+
+MMGIF - No New methods.
+
+MMGIF - Override methods:
+
+M_MMGIF - No New methods.
+
+M_MMGIF - Override methods:
+
+from M_WPFileSystem:
+155  wpclsQueryInstanceType  	1f122f40
+156  wpclsQueryInstanceFilter	1f122f70
+
+from M_WPObject:
+107  wpclsCreateDefaultTemplates	1f122fd5
+108  wpclsInitData           	1f123297
+111  wpclsQueryDefaultHelp   	1f122eb0
+119  wpclsQueryStyle         	1f122f00
+120  wpclsQueryTitle         	1f123130
+121  wpclsUnInitData         	1f122fa0
+128  wpclsQueryIconData      	1f123230
+
+----------
+
+Class:  MMJPG                   	012464b4
+Metaclass:  M_MMJPG             	01247490
+Parent:  MMImage                 	0125f334
+
+Module:  D:\MMOS2\DLL\MMPARTS.DLL
+Load cause:  WPS registration
+
+Registered WPS class
+Title:  JPGImage.JPG
+Storage class:  WPFileSystem
+
+Default View:  User+22315 (0xbc2b)
+Class Style:  0x10080 (NeverPrint DontTemplate)
+PM_Workplace:IplLoad:  yes
+File Associations:
+  Name:  *.JPG
+  Type:  JPG
+
+Instance Method & Data Summary
+Cnt	Size	Source
+  0	  0	MMJPG
+  2	 24	MMImage
+  6	  0	WPImageFile
+  0	  0	CWDataFile
+ 14	  0	WPDataFile
+ 41	 52	WPFileSystem
+  0	  0	CWObject
+163	144	WPObject
+ 32	  0	SOMObject
+258	224	total
+
+Class Method & Data Summary
+Cnt	Size	Source
+  0	  0	M_MMJPG
+  4	  0	M_MMImage
+  0	  4	M_WPImageFile
+  0	  0	M_CWDataFile
+  2	  0	M_WPDataFile
+  6	  0	M_WPFileSystem
+  0	  0	M_CWObject
+ 45	 20	M_WPObject
+ 75	380	SOMClass
+ 32	  0	SOMObject
+164	408	total
+
+MMJPG - No New methods.
+
+MMJPG - Override methods:
+
+M_MMJPG - No New methods.
+
+M_MMJPG - Override methods:
+
+from M_WPFileSystem:
+155  wpclsQueryInstanceType  	1f12b290
+156  wpclsQueryInstanceFilter	1f12b2c0
+
+from M_WPObject:
+107  wpclsCreateDefaultTemplates	1f12b325
+108  wpclsInitData           	1f12b5e7
+111  wpclsQueryDefaultHelp   	1f12b200
+119  wpclsQueryStyle         	1f12b250
+120  wpclsQueryTitle         	1f12b480
+121  wpclsUnInitData         	1f12b2f0
+128  wpclsQueryIconData      	1f12b580
+
+----------
+
+Class:  MMMMotion               	0124a5c0
+Metaclass:  M_MMMMotion         	0124b5a0
+Parent:  MMImage                 	0125f334
+
+Module:  D:\MMOS2\DLL\MMPARTS.DLL
+Load cause:  WPS registration
+
+Registered WPS class
+Title:  VIDImage.VID
+Storage class:  WPFileSystem
+
+Default View:  User+22315 (0xbc2b)
+Class Style:  0x80 (NeverPrint)
+PM_Workplace:IplLoad:  yes
+File Associations:
+  Name:  *.VID
+  Type:  MMotion Image
+
+Instance Method & Data Summary
+Cnt	Size	Source
+  0	  0	MMMMotion
+  2	 24	MMImage
+  6	  0	WPImageFile
+  0	  0	CWDataFile
+ 14	  0	WPDataFile
+ 41	 52	WPFileSystem
+  0	  0	CWObject
+163	144	WPObject
+ 32	  0	SOMObject
+258	224	total
+
+Class Method & Data Summary
+Cnt	Size	Source
+  0	  0	M_MMMMotion
+  4	  0	M_MMImage
+  0	  4	M_WPImageFile
+  0	  0	M_CWDataFile
+  2	  0	M_WPDataFile
+  6	  0	M_WPFileSystem
+  0	  0	M_CWObject
+ 45	 20	M_WPObject
+ 75	380	SOMClass
+ 32	  0	SOMObject
+164	408	total
+
+MMMMotion - No New methods.
+
+MMMMotion - Override methods:
+
+M_MMMMotion - No New methods.
+
+M_MMMMotion - Override methods:
+
+from M_WPFileSystem:
+155  wpclsQueryInstanceType  	1f124100
+156  wpclsQueryInstanceFilter	1f124130
+
+from M_WPObject:
+107  wpclsCreateDefaultTemplates	1f124195
+108  wpclsInitData           	1f124457
+111  wpclsQueryDefaultHelp   	1f124070
+119  wpclsQueryStyle         	1f1240c0
+120  wpclsQueryTitle         	1f1242f0
+121  wpclsUnInitData         	1f124160
+128  wpclsQueryIconData      	1f1243f0
+
+--------
+
+Class:  MMPCX                   	0125072c
+Metaclass:  M_MMPCX             	012516e4
+Parent:  MMImage                 	0125f334
+
+Module:  D:\MMOS2\DLL\MMPARTS.DLL
+Load cause:  WPS registration
+
+Registered WPS class
+Title:  PCXImage.PCX
+Storage class:  WPFileSystem
+
+Default View:  User+22315 (0xbc2b)
+Class Style:  0x80 (NeverPrint)
+PM_Workplace:IplLoad:  yes
+File Associations:
+  Name:  *.PCX
+  Type:  PCX
+
+Instance Method & Data Summary
+Cnt	Size	Source
+  0	  0	MMPCX
+  2	 24	MMImage
+  6	  0	WPImageFile
+  0	  0	CWDataFile
+ 14	  0	WPDataFile
+ 41	 52	WPFileSystem
+  0	  0	CWObject
+163	144	WPObject
+ 32	  0	SOMObject
+258	224	total
+
+Class Method & Data Summary
+Cnt	Size	Source
+  0	  0	M_MMPCX
+  4	  0	M_MMImage
+  0	  4	M_WPImageFile
+  0	  0	M_CWDataFile
+  2	  0	M_WPDataFile
+  6	  0	M_WPFileSystem
+  0	  0	M_CWObject
+ 45	 20	M_WPObject
+ 75	380	SOMClass
+ 32	  0	SOMObject
+164	408	total
+
+MMPCX - No New methods.
+
+MMPCX - Override methods:
+
+M_MMPCX - No New methods.
+
+M_MMPCX - Override methods:
+
+from M_WPFileSystem:
+155  wpclsQueryInstanceType  	1f1233c0
+156  wpclsQueryInstanceFilter	1f1233f0
+
+from M_WPObject:
+107  wpclsCreateDefaultTemplates	1f123455
+108  wpclsInitData           	1f123717
+111  wpclsQueryDefaultHelp   	1f123330
+119  wpclsQueryStyle         	1f123380
+120  wpclsQueryTitle         	1f1235b0
+121  wpclsUnInitData         	1f123420
+128  wpclsQueryIconData      	1f1236b0
+
+-----------
+
+Class:  MMPhotoCD               	0124e6ac
+Metaclass:  M_MMPhotoCD         	0124f68c
+Parent:  MMImage                 	0125f334
+
+Module:  D:\MMOS2\DLL\MMPARTS.DLL
+Load cause:  WPS registration
+
+Registered WPS class
+Title:  PCDImage.PCD
+Storage class:  WPFileSystem
+
+Default View:  User+22315 (0xbc2b)
+Class Style:  0x10080 (NeverPrint DontTemplate)
+PM_Workplace:IplLoad:  yes
+File Associations:
+  Name:  *.PCD
+  Type:  Photo CD
+
+Instance Method & Data Summary
+Cnt	Size	Source
+  0	  0	MMPhotoCD
+  2	 24	MMImage
+  6	  0	WPImageFile
+  0	  0	CWDataFile
+ 14	  0	WPDataFile
+ 41	 52	WPFileSystem
+  0	  0	CWObject
+163	144	WPObject
+ 32	  0	SOMObject
+258	224	total
+
+Class Method & Data Summary
+Cnt	Size	Source
+  0	  0	M_MMPhotoCD
+  4	  0	M_MMImage
+  0	  4	M_WPImageFile
+  0	  0	M_CWDataFile
+  2	  0	M_WPDataFile
+  6	  0	M_WPFileSystem
+  0	  0	M_CWObject
+ 45	 20	M_WPObject
+ 75	380	SOMClass
+ 32	  0	SOMObject
+164	408	total
+
+MMPhotoCD - No New methods.
+
+MMPhotoCD - Override methods:
+
+M_MMPhotoCD - No New methods.
+
+M_MMPhotoCD - Override methods:
+
+from M_WPFileSystem:
+155  wpclsQueryInstanceType  	1f123840
+156  wpclsQueryInstanceFilter	1f123870
+
+from M_WPObject:
+108  wpclsInitData           	1f123b57
+111  wpclsQueryDefaultHelp   	1f1237b0
+119  wpclsQueryStyle         	1f123800
+120  wpclsQueryTitle         	1f1239f0
+121  wpclsUnInitData         	1f1238a0
+128  wpclsQueryIconData      	1f123af0
+
+--------------
+
+Class:  MMTIFF                  	0127ca54
+Metaclass:  M_MMTIFF            	01255e58
+Parent:  MMImage                 	0125f334
+
+Module:  D:\MMOS2\DLL\MMPARTS.DLL
+Load cause:  WPS registration
+
+Registered WPS class
+Title:  TIFImage.TIF
+Storage class:  WPFileSystem
+
+Default View:  User+22315 (0xbc2b)
+Class Style:  0x80 (NeverPrint)
+PM_Workplace:IplLoad:  yes
+File Associations:
+  Name:  *.TIF
+  Type:  TIFF
+
+Instance Method & Data Summary
+Cnt	Size	Source
+  0	  0	MMTIFF
+  2	 24	MMImage
+  6	  0	WPImageFile
+  0	  0	CWDataFile
+ 14	  0	WPDataFile
+ 41	 52	WPFileSystem
+  0	  0	CWObject
+163	144	WPObject
+ 32	  0	SOMObject
+258	224	total
+
+Class Method & Data Summary
+Cnt	Size	Source
+  0	  0	M_MMTIFF
+  4	  0	M_MMImage
+  0	  4	M_WPImageFile
+  0	  0	M_CWDataFile
+  2	  0	M_WPDataFile
+  6	  0	M_WPFileSystem
+  0	  0	M_CWObject
+ 45	 20	M_WPObject
+ 75	380	SOMClass
+ 32	  0	SOMObject
+164	408	total
+
+MMTIFF - No New methods.
+
+MMTIFF - Override methods:
+
+M_MMTIFF - No New methods.
+
+M_MMTIFF - Override methods:
+
+from M_WPFileSystem:
+155  wpclsQueryInstanceType  	1f122ac0
+156  wpclsQueryInstanceFilter	1f122af0
+
+from M_WPObject:
+107  wpclsCreateDefaultTemplates	1f122b55
+108  wpclsInitData           	1f122e17
+111  wpclsQueryDefaultHelp   	1f122a30
+119  wpclsQueryStyle         	1f122a80
+120  wpclsQueryTitle         	1f122cb0
+121  wpclsUnInitData         	1f122b20
+128  wpclsQueryIconData      	1f122db0
+
+-------------
+
+Class:  MMTarga                 	01256f00
+Metaclass:  M_MMTarga           	01257ee0
+Parent:  MMImage                 	0125f334
+
+Module:  D:\MMOS2\DLL\MMPARTS.DLL
+Load cause:  WPS registration
+
+Registered WPS class
+Title:  TargaImage.TGA
+Storage class:  WPFileSystem
+
+Default View:  User+22315 (0xbc2b)
+Class Style:  0x80 (NeverPrint)
+PM_Workplace:IplLoad:  yes
+File Associations:
+  Name:  *.TGA
+  Type:  Targa
+
+Instance Method & Data Summary
+Cnt	Size	Source
+  0	  0	MMTarga
+  2	 24	MMImage
+  6	  0	WPImageFile
+  0	  0	CWDataFile
+ 14	  0	WPDataFile
+ 41	 52	WPFileSystem
+  0	  0	CWObject
+163	144	WPObject
+ 32	  0	SOMObject
+258	224	total
+
+Class Method & Data Summary
+Cnt	Size	Source
+  0	  0	M_MMTarga
+  4	  0	M_MMImage
+  0	  4	M_WPImageFile
+  0	  0	M_CWDataFile
+  2	  0	M_WPDataFile
+  6	  0	M_WPFileSystem
+  0	  0	M_CWObject
+ 45	 20	M_WPObject
+ 75	380	SOMClass
+ 32	  0	SOMObject
+164	408	total
+
+MMTarga - No New methods.
+
+MMTarga - Override methods:
+
+M_MMTarga - No New methods.
+
+M_MMTarga - Override methods:
+
+from M_WPFileSystem:
+155  wpclsQueryInstanceType  	1f122640
+156  wpclsQueryInstanceFilter	1f122670
+
+from M_WPObject:
+107  wpclsCreateDefaultTemplates	1f1226d5
+108  wpclsInitData           	1f122997
+111  wpclsQueryDefaultHelp   	1f1225b0
+119  wpclsQueryStyle         	1f122600
+120  wpclsQueryTitle         	1f122830
+121  wpclsUnInitData         	1f1226a0
+128  wpclsQueryIconData      	1f122930
+
+----------------
+
+Class:  WPBitmap                	00e65e90
+Metaclass:  M_WPBitmap          	00e66d30
+Parent:  WPImageFile             	00e682bc
+
+Module:  D:\OS2\DLL\PMWP.DLL
+Load cause:  WPS registration
+
+Registered WPS class
+Title:  Bitmap
+Storage class:  WPFileSystem
+
+Default View:  Running (0x04)
+Class Style:  0 (none)
+File Associations:
+  Name:  *.BMP
+  Type:  Bitmap
+
+Instance Method & Data Summary
+Cnt	Size	Source
+  0	  8	WPBitmap
+  6	  0	WPImageFile
+  0	  0	CWDataFile
+ 14	  0	WPDataFile
+ 41	 52	WPFileSystem
+  0	  0	CWObject
+163	144	WPObject
+ 32	  0	SOMObject
+256	208	total
+
+Class Method & Data Summary
+Cnt	Size	Source
+  0	  4	M_WPBitmap
+  0	  4	M_WPImageFile
+  0	  0	M_CWDataFile
+  2	  0	M_WPDataFile
+  6	  0	M_WPFileSystem
+  0	  0	M_CWObject
+ 45	 20	M_WPObject
+ 75	380	SOMClass
+ 32	  0	SOMObject
+160	412	total
+
+WPBitmap - No New methods.
+
+WPBitmap - Override methods:
+
+from WPImageFile:
+250  wpQueryBitmapHandle     	1fcbbb08
+251  wpQueryBitmapInfoHeader 	1fcbbaa8
+252  wpQueryBitmapData       	1fcbba40
+253  wpSetBitmapData         	1fced1cc
+254  wpReadImageFile         	1fcbb0d8
+255  wpWriteImageFile        	1fced0e8
+
+from WPFileSystem:
+211  wpRefresh               	1fcecff4
+
+from WPObject:
+064  wpFormatDragItem        	1fced2a0
+068  wpInitData              	1fcb1c40
+120  wpSetupOnce             	1fced4e0
+128  wpUnInitData            	1fcafab8
+
+from SOMObject:
+000  somDefaultInit          	1fcb1c94
+001  somDestruct             	1fcafb20
+
+M_WPBitmap - No New methods.
+
+M_WPBitmap - Override methods:
+
+from M_WPFileSystem:
+155  wpclsQueryInstanceType  	1fcb1bd0
+156  wpclsQueryInstanceFilter	1fcc00e8
+
+from M_WPObject:
+108  wpclsInitData           	1fcc00f0
+111  wpclsQueryDefaultHelp   	1fcecfdc
+119  wpclsQueryStyle         	1fcb1bb4
+120  wpclsQueryTitle         	1fcb1bc8
+
+---------------
+
+Class:  MMBitmap                	00e63ce4
+Metaclass:  M_MMBitmap          	00e64d4c
+Parent:  WPBitmap                	00e65e90
+Replaces:  WPBitmap
+
+Module:  D:\MMOS2\DLL\MMBIT.DLL
+Load cause:  WPS registration
+
+Registered WPS class
+Title:  Bitmap
+Storage class:  WPFileSystem
+
+Default View:  User+22315 (0xbc2b)
+Class Style:  0 (none)
+File Associations:
+  Name:  *.BMP
+  Type:  Bitmap
+
+Instance Method & Data Summary
+Cnt	Size	Source
+  1	 12	MMBitmap
+  0	  8	WPBitmap
+  6	  0	WPImageFile
+  0	  0	CWDataFile
+ 14	  0	WPDataFile
+ 41	 52	WPFileSystem
+  0	  0	CWObject
+163	144	WPObject
+ 32	  0	SOMObject
+257	220	total
+
+Class Method & Data Summary
+Cnt	Size	Source
+  1	  0	M_MMBitmap
+  0	  4	M_WPBitmap
+  0	  4	M_WPImageFile
+  0	  0	M_CWDataFile
+  2	  0	M_WPDataFile
+  6	  0	M_WPFileSystem
+  0	  0	M_CWObject
+ 45	 20	M_WPObject
+ 75	380	SOMClass
+ 32	  0	SOMObject
+161	412	total
+
+MMBitmap - 1 New methods:
+
+256  mmDetermineViewFor      	1f128595
+
+MMBitmap - Override methods:
+
+from WPObject:
+061  wpFilterPopupMenu       	1f128270
+064  wpFormatDragItem        	1f127f45
+068  wpInitData              	1f128235
+072  wpMenuItemHelpSelected  	1f128d20
+073  wpMenuItemSelected      	1f128db2
+074  wpModifyPopupMenu       	1f128b40
+077  wpOpen                  	1f128815
+125  wpSetTitle              	1f128720
+126  wpSetup                 	1f1284b2
+128  wpUnInitData            	1f1281c0
+132  wpObjectReady           	1f128063
+
+from SOMObject:
+000  somDefaultInit          	1f952430
+001  somDestruct             	1f952320
+
+M_MMBitmap - 1 New methods:
+
+160  mmclsSetDefaultView     	1f1286c8
+
+M_MMBitmap - Override methods:
+
+from M_WPObject:
+112  wpclsQueryDefaultView   	1f128670
+128  wpclsQueryIconData      	1f128ad6
+
+-----------
+
+Class:  MMFolder                	01226c68
+Metaclass:  M_MMFolder          	01227b7c
+Parent:  CandyFolder             	00b42f84
+
+Module:  D:\MMOS2\DLL\MMPARTS.DLL
+Load cause:  WPS registration
+
+Registered WPS class
+Title:  Leuchttisch
+Storage class:  WPFileSystem
+
+Default View:  Contents (0x01)
+Class Style:  0x10080 (NeverPrint DontTemplate)
+
+Instance Method & Data Summary
+Cnt	Size	Source
+  5	  4	MMFolder
+  1	 32	CandyFolder
+  0	 12	CWFolder
+102	302	WPFolder
+ 41	 52	WPFileSystem
+  0	  0	CWObject
+163	144	WPObject
+ 32	  0	SOMObject
+344	552	total
+
+Class Method & Data Summary
+Cnt	Size	Source
+  0	  0	M_MMFolder
+  0	  0	M_CandyFolder
+  0	  0	M_CWFolder
+  6	  0	M_WPFolder
+  6	  0	M_WPFileSystem
+  0	  0	M_CWObject
+ 45	 20	M_WPObject
+ 75	380	SOMClass
+ 32	  0	SOMObject
+164	404	total
+
+MMFolder - 5 New methods:
+
+339  wpGetContentItem        	1f12f1b2
+340  wpAddContentItem        	1f12f0c0
+341  wpRemoveContentItem     	1f12ef40
+342  wpRemoveAllContent      	1f12ee64
+343  wpDetermineType         	1f12e6f1
+
+MMFolder - Override methods:
+
+from WPFolder:
+238  wpSetFldrFont           	1f12fe55
+270  wpAddToContent          	1f12fa28
+271  wpDeleteFromContent     	1f12f972
+
+from WPFileSystem:
+211  wpRefresh               	1f12fd27
+
+from WPObject:
+057  wpDragOver              	1f12fc07
+058  wpDrop                  	1f12fb10
+068  wpInitData              	1f130220
+077  wpOpen                  	1f130087
+096  wpRegisterView          	1f12ff80
+128  wpUnInitData            	1f130147
+
+M_MMFolder - No New methods.
+
+M_MMFolder - Override methods:
+
+from M_WPFolder:
+158  wpclsQueryIconDataN     	1f12f310
+
+from M_WPObject:
+107  wpclsCreateDefaultTemplates	1f12e652
+108  wpclsInitData           	1f12f868
+111  wpclsQueryDefaultHelp   	1f12f593
+112  wpclsQueryDefaultView   	1f12f4f4
+120  wpclsQueryTitle         	1f12f650
+121  wpclsUnInitData         	1f12f788
+128  wpclsQueryIconData      	1f12f426
+
+-------------
+
+Class:  MMDataFile              	01261934
+Metaclass:  M_MMDataFile        	01262c18
+Parent:  CWDataFile              	00e6eba0
+
+Module:  D:\MMOS2\DLL\MMPARTS.DLL
+Load cause:  WPS registration
+
+Registered WPS class
+Title:  Multimediadatei
+Storage class:  WPFileSystem
+
+Default View:  User+22255 (0xbbef)
+Class Style:  0x10000 (DontTemplate)
+
+Instance Method & Data Summary
+Cnt	Size	Source
+  3	 12	MMDataFile
+  0	  0	CWDataFile
+ 14	  0	WPDataFile
+ 41	 52	WPFileSystem
+  0	  0	CWObject
+163	144	WPObject
+ 32	  0	SOMObject
+253	212	total
+
+Class Method & Data Summary
+Cnt	Size	Source
+  4	  0	M_MMDataFile
+  0	  0	M_CWDataFile
+  2	  0	M_WPDataFile
+  6	  0	M_WPFileSystem
+  0	  0	M_CWObject
+ 45	 20	M_WPObject
+ 75	380	SOMClass
+ 32	  0	SOMObject
+164	404	total
+
+MMDataFile - 3 New methods:
+
+250  mmFilterPopupMenu       	1f11d651
+251  mmViewNotify            	1f11d607
+252  mmDetermineViewFor      	1f11dea0
+
+MMDataFile - Override methods:
+
+from WPObject:
+061  wpFilterPopupMenu       	1f11d810
+068  wpInitData              	1f11d7f0
+072  wpMenuItemHelpSelected  	1f11e781
+073  wpMenuItemSelected      	1f11e717
+074  wpModifyPopupMenu       	1f11e480
+077  wpOpen                  	1f11e951
+079  wpQueryConcurrentView   	1f11d710
+083  wpQueryDefaultView      	1f11e3f8
+125  wpSetTitle              	1f11e127
+126  wpSetup                 	1f11ddd3
+128  wpUnInitData            	1f11d6b6
+132  wpObjectReady           	1f11e205
+
+M_MMDataFile - 4 New methods:
+
+160  mmclsDeleteFromTypeList 	1f11d584
+161  mmclsDeleteFromExtensionList	1f11d4f1
+162  mmclsInitTypesAndExtensions	1f11d3d8
+163  mmclsSetDefaultView     	1f11dfa0
+
+M_MMDataFile - Override methods:
+
+from M_WPFileSystem:
+155  wpclsQueryInstanceType  	1f11e0d0
+156  wpclsQueryInstanceFilter	1f11e0e8
+
+from M_WPObject:
+107  wpclsCreateDefaultTemplates	1f11d3c0
+108  wpclsInitData           	1f11e100
+111  wpclsQueryDefaultHelp   	1f11d350
+112  wpclsQueryDefaultView   	1f11df60
+119  wpclsQueryStyle         	1f11d380
+120  wpclsQueryTitle         	1f11dfe0
+121  wpclsUnInitData         	1f11d3a2
+128  wpclsQueryIconData      	1f11e3a0
+
+-----------
+
+Class:  MMAudio                 	0125d160
+Metaclass:  M_MMAudio           	0125e074
+Parent:  MMDataFile              	01261934
+
+Module:  D:\MMOS2\DLL\MMPARTS.DLL
+Load cause:  WPS registration
+
+Registered WPS class
+Title:  Digital-Audio
+Storage class:  WPFileSystem
+
+Default View:  User+22255 (0xbbef)
+Class Style:  0x10000 (DontTemplate)
+PM_Workplace:IplLoad:  yes
+File Associations:
+  Name:  *.MP3,*.OGG
+  Type:  Digital Audio,OGGS,WAV,MP3
+
+Instance Method & Data Summary
+Cnt	Size	Source
+  0	  8	MMAudio
+  3	 12	MMDataFile
+  0	  0	CWDataFile
+ 14	  0	WPDataFile
+ 41	 52	WPFileSystem
+  0	  0	CWObject
+163	144	WPObject
+ 32	  0	SOMObject
+253	220	total
+
+Class Method & Data Summary
+Cnt	Size	Source
+  0	  0	M_MMAudio
+  4	  0	M_MMDataFile
+  0	  0	M_CWDataFile
+  2	  0	M_WPDataFile
+  6	  0	M_WPFileSystem
+  0	  0	M_CWObject
+ 45	 20	M_WPObject
+ 75	380	SOMClass
+ 32	  0	SOMObject
+164	404	total
+
+MMAudio - No New methods.
+
+MMAudio - Override methods:
+
+from MMDataFile:
+250  mmFilterPopupMenu       	1f121832
+251  mmViewNotify            	1f1217d1
+
+from WPObject:
+064  wpFormatDragItem        	1f121723
+073  wpMenuItemSelected      	1f121c80
+074  wpModifyPopupMenu       	1f121c00
+077  wpOpen                  	1f121cd0
+083  wpQueryDefaultView      	1f121780
+128  wpUnInitData            	1f121761
+
+M_MMAudio - No New methods.
+
+M_MMAudio - Override methods:
+
+from M_MMDataFile:
+160  mmclsDeleteFromTypeList 	1f1216a0
+161  mmclsDeleteFromExtensionList	1f121608
+162  mmclsInitTypesAndExtensions	1f121510
+
+from M_WPFileSystem:
+155  wpclsQueryInstanceType  	1f121b50
+156  wpclsQueryInstanceFilter	1f121b68
+
+from M_WPObject:
+108  wpclsInitData           	1f121b80
+111  wpclsQueryDefaultHelp   	1f1214c2
+120  wpclsQueryTitle         	1f121a64
+121  wpclsUnInitData         	1f1214f2
+128  wpclsQueryIconData      	1f121ba7
+
+---------
+
+Class:  MMAIF                   	0123c300
+Metaclass:  M_MMAIF             	0123d2d8
+Parent:  MMAudio                 	0125d160
+
+Module:  D:\MMOS2\DLL\MMPARTS.DLL
+Load cause:  WPS registration
+
+Registered WPS class
+Title:  AIFAudio.AIF
+Storage class:  WPFileSystem
+
+Default View:  User+22255 (0xbbef)
+Class Style:  0x10000 (DontTemplate)
+PM_Workplace:IplLoad:  yes
+File Associations:
+  Name:  *.AIF
+  Type:  AIF
+
+Instance Method & Data Summary
+Cnt	Size	Source
+  0	  0	MMAIF
+  0	  8	MMAudio
+  3	 12	MMDataFile
+  0	  0	CWDataFile
+ 14	  0	WPDataFile
+ 41	 52	WPFileSystem
+  0	  0	CWObject
+163	144	WPObject
+ 32	  0	SOMObject
+253	220	total
+
+Class Method & Data Summary
+Cnt	Size	Source
+  0	  0	M_MMAIF
+  0	  0	M_MMAudio
+  4	  0	M_MMDataFile
+  0	  0	M_CWDataFile
+  2	  0	M_WPDataFile
+  6	  0	M_WPFileSystem
+  0	  0	M_CWObject
+ 45	 20	M_WPObject
+ 75	380	SOMClass
+ 32	  0	SOMObject
+164	404	total
+
+MMAIF - No New methods.
+
+MMAIF - Override methods:
+
+M_MMAIF - No New methods.
+
+M_MMAIF - Override methods:
+
+from M_WPFileSystem:
+155  wpclsQueryInstanceType  	1f129638
+156  wpclsQueryInstanceFilter	1f129665
+
+from M_WPObject:
+108  wpclsInitData           	1f129927
+111  wpclsQueryDefaultHelp   	1f1295f0
+120  wpclsQueryTitle         	1f1297c0
+121  wpclsUnInitData         	1f129692
+128  wpclsQueryIconData      	1f1298c0
+
+------------
+
+Class:  MMAU                    	0123e33c
+Metaclass:  M_MMAU              	0123f314
+Parent:  MMAudio                 	0125d160
+
+Module:  D:\MMOS2\DLL\MMPARTS.DLL
+Load cause:  WPS registration
+
+Registered WPS class
+Title:  AUAudio.AU
+Storage class:  WPFileSystem
+
+Default View:  User+22255 (0xbbef)
+Class Style:  0x10000 (DontTemplate)
+PM_Workplace:IplLoad:  yes
+File Associations:
+  Name:  *.AU
+  Type:  AU
+
+Instance Method & Data Summary
+Cnt	Size	Source
+  0	  0	MMAU
+  0	  8	MMAudio
+  3	 12	MMDataFile
+  0	  0	CWDataFile
+ 14	  0	WPDataFile
+ 41	 52	WPFileSystem
+  0	  0	CWObject
+163	144	WPObject
+ 32	  0	SOMObject
+253	220	total
+
+Class Method & Data Summary
+Cnt	Size	Source
+  0	  0	M_MMAU
+  0	  0	M_MMAudio
+  4	  0	M_MMDataFile
+  0	  0	M_CWDataFile
+  2	  0	M_WPDataFile
+  6	  0	M_WPFileSystem
+  0	  0	M_CWObject
+ 45	 20	M_WPObject
+ 75	380	SOMClass
+ 32	  0	SOMObject
+164	404	total
+
+MMAU - No New methods.
+
+MMAU - Override methods:
+
+M_MMAU - No New methods.
+
+M_MMAU - Override methods:
+
+from M_WPFileSystem:
+155  wpclsQueryInstanceType  	1f129268
+156  wpclsQueryInstanceFilter	1f129295
+
+from M_WPObject:
+108  wpclsInitData           	1f129557
+111  wpclsQueryDefaultHelp   	1f129220
+120  wpclsQueryTitle         	1f1293f0
+121  wpclsUnInitData         	1f1292c2
+128  wpclsQueryIconData      	1f1294f0
+
+-----------
+
+Class:  MMIFF                   	0123a2c0
+Metaclass:  M_MMIFF             	0123b298
+Parent:  MMAudio                 	0125d160
+
+Module:  D:\MMOS2\DLL\MMPARTS.DLL
+Load cause:  WPS registration
+
+Registered WPS class
+Title:  IFFAudio.IFF
+Storage class:  WPFileSystem
+
+Default View:  User+22255 (0xbbef)
+Class Style:  0x10000 (DontTemplate)
+PM_Workplace:IplLoad:  yes
+File Associations:
+  Name:  *.IFF
+  Type:  IFF
+
+Instance Method & Data Summary
+Cnt	Size	Source
+  0	  0	MMIFF
+  0	  8	MMAudio
+  3	 12	MMDataFile
+  0	  0	CWDataFile
+ 14	  0	WPDataFile
+ 41	 52	WPFileSystem
+  0	  0	CWObject
+163	144	WPObject
+ 32	  0	SOMObject
+253	220	total
+
+Class Method & Data Summary
+Cnt	Size	Source
+  0	  0	M_MMIFF
+  0	  0	M_MMAudio
+  4	  0	M_MMDataFile
+  0	  0	M_CWDataFile
+  2	  0	M_WPDataFile
+  6	  0	M_WPFileSystem
+  0	  0	M_CWObject
+ 45	 20	M_WPObject
+ 75	380	SOMClass
+ 32	  0	SOMObject
+164	404	total
+
+MMIFF - No New methods.
+
+MMIFF - Override methods:
+
+M_MMIFF - No New methods.
+
+M_MMIFF - Override methods:
+
+from M_WPFileSystem:
+155  wpclsQueryInstanceType  	1f129e88
+156  wpclsQueryInstanceFilter	1f129eb5
+
+from M_WPObject:
+108  wpclsInitData           	1f12a177
+111  wpclsQueryDefaultHelp   	1f129e40
+120  wpclsQueryTitle         	1f12a010
+121  wpclsUnInitData         	1f129ee2
+128  wpclsQueryIconData      	1f12a110
+
+-------------------
+
+Class:  MMSNDF                  	0123827c
+Metaclass:  M_MMSNDF            	01239258
+Parent:  MMAudio                 	0125d160
+
+Module:  D:\MMOS2\DLL\MMPARTS.DLL
+Load cause:  WPS registration
+
+Registered WPS class
+Title:  SNDAudio.SND
+Storage class:  WPFileSystem
+
+Default View:  User+22255 (0xbbef)
+Class Style:  0x10000 (DontTemplate)
+PM_Workplace:IplLoad:  yes
+File Associations:
+  Name:  *.SND
+  Type:  SND
+
+Instance Method & Data Summary
+Cnt	Size	Source
+  0	  0	MMSNDF
+  0	  8	MMAudio
+  3	 12	MMDataFile
+  0	  0	CWDataFile
+ 14	  0	WPDataFile
+ 41	 52	WPFileSystem
+  0	  0	CWObject
+163	144	WPObject
+ 32	  0	SOMObject
+253	220	total
+
+Class Method & Data Summary
+Cnt	Size	Source
+  0	  0	M_MMSNDF
+  0	  0	M_MMAudio
+  4	  0	M_MMDataFile
+  0	  0	M_CWDataFile
+  2	  0	M_WPDataFile
+  6	  0	M_WPFileSystem
+  0	  0	M_CWObject
+ 45	 20	M_WPObject
+ 75	380	SOMClass
+ 32	  0	SOMObject
+164	404	total
+
+MMSNDF - No New methods.
+
+MMSNDF - Override methods:
+
+M_MMSNDF - No New methods.
+
+M_MMSNDF - Override methods:
+
+from M_WPFileSystem:
+155  wpclsQueryInstanceType  	1f12a258
+156  wpclsQueryInstanceFilter	1f12a285
+
+from M_WPObject:
+108  wpclsInitData           	1f12a547
+111  wpclsQueryDefaultHelp   	1f12a210
+120  wpclsQueryTitle         	1f12a3e0
+121  wpclsUnInitData         	1f12a2b2
+128  wpclsQueryIconData      	1f12a4e0
+
+------------------
+
+Class:  MMVOC                   	012423bc
+Metaclass:  M_MMVOC             	01243394
+Parent:  MMAudio                 	0125d160
+
+Module:  D:\MMOS2\DLL\MMPARTS.DLL
+Load cause:  WPS registration
+
+Registered WPS class
+Title:  VOCAudio.VOC
+Storage class:  WPFileSystem
+
+Default View:  User+22255 (0xbbef)
+Class Style:  0x10000 (DontTemplate)
+PM_Workplace:IplLoad:  yes
+File Associations:
+  Name:  *.VOC
+  Type:  VOC
+
+Instance Method & Data Summary
+Cnt	Size	Source
+  0	  0	MMVOC
+  0	  8	MMAudio
+  3	 12	MMDataFile
+  0	  0	CWDataFile
+ 14	  0	WPDataFile
+ 41	 52	WPFileSystem
+  0	  0	CWObject
+163	144	WPObject
+ 32	  0	SOMObject
+253	220	total
+
+Class Method & Data Summary
+Cnt	Size	Source
+  0	  0	M_MMVOC
+  0	  0	M_MMAudio
+  4	  0	M_MMDataFile
+  0	  0	M_CWDataFile
+  2	  0	M_WPDataFile
+  6	  0	M_WPFileSystem
+  0	  0	M_CWObject
+ 45	 20	M_WPObject
+ 75	380	SOMClass
+ 32	  0	SOMObject
+164	404	total
+
+MMVOC - No New methods.
+
+MMVOC - Override methods:
+
+M_MMVOC - No New methods.
+
+M_MMVOC - Override methods:
+
+from M_WPFileSystem:
+155  wpclsQueryInstanceType  	1f12b6c8
+156  wpclsQueryInstanceFilter	1f12b6f5
+
+from M_WPObject:
+108  wpclsInitData           	1f12b9b7
+111  wpclsQueryDefaultHelp   	1f12b680
+120  wpclsQueryTitle         	1f12b850
+121  wpclsUnInitData         	1f12b722
+128  wpclsQueryIconData      	1f12b950
+
+-----------------
+
+Class:  MMWAV                   	0124443c
+Metaclass:  M_MMWAV             	01245414
+Parent:  MMAudio                 	0125d160
+
+Module:  D:\MMOS2\DLL\MMPARTS.DLL
+Load cause:  WPS registration
+
+Registered WPS class
+Title:  WAVAudio.WAV
+Storage class:  WPFileSystem
+
+Default View:  User+22255 (0xbbef)
+Class Style:  0 (none)
+PM_Workplace:IplLoad:  yes
+File Associations:
+  Name:  *.WAV
+  Type:  WAV,Digital Audio
+
+Instance Method & Data Summary
+Cnt	Size	Source
+  0	  0	MMWAV
+  0	  8	MMAudio
+  3	 12	MMDataFile
+  0	  0	CWDataFile
+ 14	  0	WPDataFile
+ 41	 52	WPFileSystem
+  0	  0	CWObject
+163	144	WPObject
+ 32	  0	SOMObject
+253	220	total
+
+Class Method & Data Summary
+Cnt	Size	Source
+  0	  0	M_MMWAV
+  0	  0	M_MMAudio
+  4	  0	M_MMDataFile
+  0	  0	M_CWDataFile
+  2	  0	M_WPDataFile
+  6	  0	M_WPFileSystem
+  0	  0	M_CWObject
+ 45	 20	M_WPObject
+ 75	380	SOMClass
+ 32	  0	SOMObject
+164	404	total
+
+MMWAV - No New methods.
+
+MMWAV - Override methods:
+
+M_MMWAV - No New methods.
+
+M_MMWAV - Override methods:
+
+from M_WPFileSystem:
+155  wpclsQueryInstanceType  	1f129a50
+156  wpclsQueryInstanceFilter	1f129a80
+
+from M_WPObject:
+107  wpclsCreateDefaultTemplates	1f129ae5
+108  wpclsInitData           	1f129da7
+111  wpclsQueryDefaultHelp   	1f1299c0
+119  wpclsQueryStyle         	1f129a10
+120  wpclsQueryTitle         	1f129c40
+121  wpclsUnInitData         	1f129ab0
+128  wpclsQueryIconData      	1f129d40
+
+---------------------
+
+Class:  MM_AU                   	0124037c
+Metaclass:  M_MM_AU             	01241354
+Parent:  MMAudio                 	0125d160
+
+Module:  D:\MMOS2\DLL\MMPARTS.DLL
+Load cause:  WPS registration
+
+Registered WPS class
+Title:  _AUAudio._AU
+Storage class:  WPFileSystem
+
+Default View:  User+22255 (0xbbef)
+Class Style:  0x10000 (DontTemplate)
+PM_Workplace:IplLoad:  yes
+File Associations:
+  Name:  *._AU
+  Type:  _AU
+
+Instance Method & Data Summary
+Cnt	Size	Source
+  0	  0	MM_AU
+  0	  8	MMAudio
+  3	 12	MMDataFile
+  0	  0	CWDataFile
+ 14	  0	WPDataFile
+ 41	 52	WPFileSystem
+  0	  0	CWObject
+163	144	WPObject
+ 32	  0	SOMObject
+253	220	total
+
+Class Method & Data Summary
+Cnt	Size	Source
+  0	  0	M_MM_AU
+  0	  0	M_MMAudio
+  4	  0	M_MMDataFile
+  0	  0	M_CWDataFile
+  2	  0	M_WPDataFile
+  6	  0	M_WPFileSystem
+  0	  0	M_CWObject
+ 45	 20	M_WPObject
+ 75	380	SOMClass
+ 32	  0	SOMObject
+164	404	total
+
+MM_AU - No New methods.
+
+MM_AU - Override methods:
+
+M_MM_AU - No New methods.
+
+M_MM_AU - Override methods:
+
+from M_WPFileSystem:
+155  wpclsQueryInstanceType  	1f128e98
+156  wpclsQueryInstanceFilter	1f128ec5
+
+from M_WPObject:
+108  wpclsInitData           	1f129187
+111  wpclsQueryDefaultHelp   	1f128e50
+120  wpclsQueryTitle         	1f129020
+121  wpclsUnInitData         	1f128ef2
+128  wpclsQueryIconData      	1f129120
+
+-----------------
+
+Class:  MMMIDI                  	01258f10
+Metaclass:  M_MMMIDI            	01259e68
+Parent:  MMDataFile              	01261934
+
+Module:  D:\MMOS2\DLL\MMPARTS.DLL
+Load cause:  WPS registration
+
+Registered WPS class
+Title:  MIDI.MID
+Storage class:  WPFileSystem
+
+Default View:  User+22255 (0xbbef)
+Class Style:  0 (none)
+PM_Workplace:IplLoad:  yes
+File Associations:
+  Name:  *.MID
+  Type:  MIDI
+
+Instance Method & Data Summary
+Cnt	Size	Source
+  0	  8	MMMIDI
+  3	 12	MMDataFile
+  0	  0	CWDataFile
+ 14	  0	WPDataFile
+ 41	 52	WPFileSystem
+  0	  0	CWObject
+163	144	WPObject
+ 32	  0	SOMObject
+253	220	total
+
+Class Method & Data Summary
+Cnt	Size	Source
+  0	  0	M_MMMIDI
+  4	  0	M_MMDataFile
+  0	  0	M_CWDataFile
+  2	  0	M_WPDataFile
+  6	  0	M_WPFileSystem
+  0	  0	M_CWObject
+ 45	 20	M_WPObject
+ 75	380	SOMClass
+ 32	  0	SOMObject
+164	404	total
+
+MMMIDI - No New methods.
+
+MMMIDI - Override methods:
+
+from MMDataFile:
+251  mmViewNotify            	1f121fc0
+
+from WPObject:
+064  wpFormatDragItem        	1f121ef5
+068  wpInitData              	1f121fa1
+073  wpMenuItemSelected      	1f122400
+074  wpModifyPopupMenu       	1f122380
+077  wpOpen                  	1f122450
+083  wpQueryDefaultView      	1f121f50
+128  wpUnInitData            	1f121f33
+
+M_MMMIDI - No New methods.
+
+M_MMMIDI - Override methods:
+
+from M_WPFileSystem:
+155  wpclsQueryInstanceType  	1f121e82
+156  wpclsQueryInstanceFilter	1f121ea0
+
+from M_WPObject:
+107  wpclsCreateDefaultTemplates	1f121ee0
+108  wpclsInitData           	1f122300
+111  wpclsQueryDefaultHelp   	1f121e30
+119  wpclsQueryStyle         	1f121e60
+120  wpclsQueryTitle         	1f122217
+121  wpclsUnInitData         	1f121ec0
+128  wpclsQueryIconData      	1f122327
+
+---------------
+
+Class:  MMVideo                 	0125b0c0
+Metaclass:  M_MMVideo           	0125c018
+Parent:  MMDataFile              	01261934
+
+Module:  D:\MMOS2\DLL\MMPARTS.DLL
+Load cause:  WPS registration
+
+Registered WPS class
+Title:  Digital-Video
+Storage class:  WPFileSystem
+
+Default View:  User+22255 (0xbbef)
+Class Style:  0x10000 (DontTemplate)
+PM_Workplace:IplLoad:  yes
+File Associations:
+  Name:  *.DAT,*.M2P,*.CDI,*.M2T,*.M1T
+  Type:  Digital Video
+
+Instance Method & Data Summary
+Cnt	Size	Source
+  0	  8	MMVideo
+  3	 12	MMDataFile
+  0	  0	CWDataFile
+ 14	  0	WPDataFile
+ 41	 52	WPFileSystem
+  0	  0	CWObject
+163	144	WPObject
+ 32	  0	SOMObject
+253	220	total
+
+Class Method & Data Summary
+Cnt	Size	Source
+  0	  0	M_MMVideo
+  4	  0	M_MMDataFile
+  0	  0	M_CWDataFile
+  2	  0	M_WPDataFile
+  6	  0	M_WPFileSystem
+  0	  0	M_CWObject
+ 45	 20	M_WPObject
+ 75	380	SOMClass
+ 32	  0	SOMObject
+164	404	total
+
+MMVideo - No New methods.
+
+MMVideo - Override methods:
+
+from MMDataFile:
+251  mmViewNotify            	1f120e01
+
+from WPObject:
+064  wpFormatDragItem        	1f120d53
+073  wpMenuItemSelected      	1f121290
+074  wpModifyPopupMenu       	1f121210
+077  wpOpen                  	1f1212e0
+083  wpQueryDefaultView      	1f120db0
+128  wpUnInitData            	1f120d91
+
+M_MMVideo - No New methods.
+
+M_MMVideo - Override methods:
+
+from M_MMDataFile:
+160  mmclsDeleteFromTypeList 	1f120cd0
+161  mmclsDeleteFromExtensionList	1f120c48
+162  mmclsInitTypesAndExtensions	1f120b50
+
+from M_WPFileSystem:
+155  wpclsQueryInstanceType  	1f121160
+156  wpclsQueryInstanceFilter	1f121178
+
+from M_WPObject:
+108  wpclsInitData           	1f121190
+111  wpclsQueryDefaultHelp   	1f120ae2
+117  wpclsQueryIcon          	1f120b12
+120  wpclsQueryTitle         	1f121070
+121  wpclsUnInitData         	1f120b30
+128  wpclsQueryIconData      	1f1211b7
+
+---------------------
+
+Class:  MMAVI                   	01236238
+Metaclass:  M_MMAVI             	01237210
+Parent:  MMVideo                 	0125b0c0
+
+Module:  D:\MMOS2\DLL\MMPARTS.DLL
+Load cause:  WPS registration
+
+Registered WPS class
+Title:  AVIVideo.AVI
+Storage class:  WPFileSystem
+
+Default View:  User+22255 (0xbbef)
+Class Style:  0 (none)
+PM_Workplace:IplLoad:  yes
+File Associations:
+  Name:  *.AVI
+  Type:  AVI,Digital Video
+
+Instance Method & Data Summary
+Cnt	Size	Source
+  0	  0	MMAVI
+  0	  8	MMVideo
+  3	 12	MMDataFile
+  0	  0	CWDataFile
+ 14	  0	WPDataFile
+ 41	 52	WPFileSystem
+  0	  0	CWObject
+163	144	WPObject
+ 32	  0	SOMObject
+253	220	total
+
+Class Method & Data Summary
+Cnt	Size	Source
+  0	  0	M_MMAVI
+  0	  0	M_MMVideo
+  4	  0	M_MMDataFile
+  0	  0	M_CWDataFile
+  2	  0	M_WPDataFile
+  6	  0	M_WPFileSystem
+  0	  0	M_CWObject
+ 45	 20	M_WPObject
+ 75	380	SOMClass
+ 32	  0	SOMObject
+164	404	total
+
+MMAVI - No New methods.
+
+MMAVI - Override methods:
+
+M_MMAVI - No New methods.
+
+M_MMAVI - Override methods:
+
+from M_WPFileSystem:
+155  wpclsQueryInstanceType  	1f12a670
+156  wpclsQueryInstanceFilter	1f12a6a0
+
+from M_WPObject:
+107  wpclsCreateDefaultTemplates	1f12a705
+108  wpclsInitData           	1f12a9c7
+111  wpclsQueryDefaultHelp   	1f12a5e0
+119  wpclsQueryStyle         	1f12a630
+120  wpclsQueryTitle         	1f12a860
+121  wpclsUnInitData         	1f12a6d0
+128  wpclsQueryIconData      	1f12a960
+
+----------------
+
+Class:  MMFLI                   	01253e08
+Metaclass:  M_MMFLI             	01254de0
+Parent:  MMVideo                 	0125b0c0
+
+Module:  D:\MMOS2\DLL\MMPARTS.DLL
+Load cause:  WPS registration
+
+Registered WPS class
+Title:  FLIVideo.FLI
+Storage class:  WPFileSystem
+
+Default View:  User+22255 (0xbbef)
+Class Style:  0x10000 (DontTemplate)
+PM_Workplace:IplLoad:  yes
+File Associations:
+  Name:  *.FLI,*.FLC
+  Type:  FLC/FLI
+
+Instance Method & Data Summary
+Cnt	Size	Source
+  0	  0	MMFLI
+  0	  8	MMVideo
+  3	 12	MMDataFile
+  0	  0	CWDataFile
+ 14	  0	WPDataFile
+ 41	 52	WPFileSystem
+  0	  0	CWObject
+163	144	WPObject
+ 32	  0	SOMObject
+253	220	total
+
+Class Method & Data Summary
+Cnt	Size	Source
+  0	  0	M_MMFLI
+  0	  0	M_MMVideo
+  4	  0	M_MMDataFile
+  0	  0	M_CWDataFile
+  2	  0	M_WPDataFile
+  6	  0	M_WPFileSystem
+  0	  0	M_CWObject
+ 45	 20	M_WPObject
+ 75	380	SOMClass
+ 32	  0	SOMObject
+164	404	total
+
+MMFLI - No New methods.
+
+MMFLI - Override methods:
+
+M_MMFLI - No New methods.
+
+M_MMFLI - Override methods:
+
+from M_WPFileSystem:
+155  wpclsQueryInstanceType  	1f12aaa8
+156  wpclsQueryInstanceFilter	1f12aad5
+
+from M_WPObject:
+108  wpclsInitData           	1f12ad97
+111  wpclsQueryDefaultHelp   	1f12aa60
+120  wpclsQueryTitle         	1f12ac30
+121  wpclsUnInitData         	1f12ab02
+128  wpclsQueryIconData      	1f12ad30
+
+-----------------
+
+Class:  MMMOV                   	0122fa7c
+Metaclass:  M_MMMOV             	01230a54
+Parent:  MMVideo                 	0125b0c0
+
+Module:  D:\MMOS2\DLL\MMPARTS.DLL
+Load cause:  WPS registration
+
+Registered WPS class
+Title:  MOVVideo.MOV
+Storage class:  WPFileSystem
+
+Default View:  User+22255 (0xbbef)
+Class Style:  0x10000 (DontTemplate)
+PM_Workplace:IplLoad:  yes
+File Associations:
+  Name:  *.MOV,*.QT
+  Type:  QuickTime Movie
+
+Instance Method & Data Summary
+Cnt	Size	Source
+  0	  0	MMMOV
+  0	  8	MMVideo
+  3	 12	MMDataFile
+  0	  0	CWDataFile
+ 14	  0	WPDataFile
+ 41	 52	WPFileSystem
+  0	  0	CWObject
+163	144	WPObject
+ 32	  0	SOMObject
+253	220	total
+
+Class Method & Data Summary
+Cnt	Size	Source
+  0	  0	M_MMMOV
+  0	  0	M_MMVideo
+  4	  0	M_MMDataFile
+  0	  0	M_CWDataFile
+  2	  0	M_WPDataFile
+  6	  0	M_WPFileSystem
+  0	  0	M_CWObject
+ 45	 20	M_WPObject
+ 75	380	SOMClass
+ 32	  0	SOMObject
+164	404	total
+
+MMMOV - No New methods.
+
+MMMOV - Override methods:
+
+M_MMMOV - No New methods.
+
+M_MMMOV - Override methods:
+
+from M_WPFileSystem:
+155  wpclsQueryInstanceType  	1f132998
+156  wpclsQueryInstanceFilter	1f1329c5
+
+from M_WPObject:
+108  wpclsInitData           	1f132c87
+111  wpclsQueryDefaultHelp   	1f132950
+120  wpclsQueryTitle         	1f132b20
+121  wpclsUnInitData         	1f1329f2
+128  wpclsQueryIconData      	1f132c20
+
+-------------------
+
+Class:  MMMPG                   	01231af4
+Metaclass:  M_MMMPG             	01252d64
+Parent:  MMVideo                 	0125b0c0
+
+Module:  D:\MMOS2\DLL\MMPARTS.DLL
+Load cause:  WPS registration
+
+Registered WPS class
+Title:  MPGVideo.MPG
+Storage class:  WPFileSystem
+
+Default View:  User+22255 (0xbbef)
+Class Style:  0x10000 (DontTemplate)
+PM_Workplace:IplLoad:  yes
+File Associations:
+  Name:  *.MPG,*.VBS
+  Type:  MPEG
+
+Instance Method & Data Summary
+Cnt	Size	Source
+  0	  0	MMMPG
+  0	  8	MMVideo
+  3	 12	MMDataFile
+  0	  0	CWDataFile
+ 14	  0	WPDataFile
+ 41	 52	WPFileSystem
+  0	  0	CWObject
+163	144	WPObject
+ 32	  0	SOMObject
+253	220	total
+
+Class Method & Data Summary
+Cnt	Size	Source
+  0	  0	M_MMMPG
+  0	  0	M_MMVideo
+  4	  0	M_MMDataFile
+  0	  0	M_CWDataFile
+  2	  0	M_WPDataFile
+  6	  0	M_WPFileSystem
+  0	  0	M_CWObject
+ 45	 20	M_WPObject
+ 75	380	SOMClass
+ 32	  0	SOMObject
+164	404	total
+
+MMMPG - No New methods.
+
+MMMPG - Override methods:
+
+M_MMMPG - No New methods.
+
+M_MMMPG - Override methods:
+
+from M_WPFileSystem:
+155  wpclsQueryInstanceType  	1f12ae78
+156  wpclsQueryInstanceFilter	1f12aea5
+
+from M_WPObject:
+108  wpclsInitData           	1f12b167
+111  wpclsQueryDefaultHelp   	1f12ae30
+120  wpclsQueryTitle         	1f12b000
+121  wpclsUnInitData         	1f12aed2
+128  wpclsQueryIconData      	1f12b100
+
+---------------
+
+Class:  WPSound                 	018fd514
+Metaclass:  M_WPSound           	018fe1a8
+Parent:  WPAbstract              	00b567f0
+
+Module:  D:\OS2\DLL\WPCONFIG.DLL
+Load cause:  WPS registration
+
+Registered WPS class
+Title:  Ton
+Storage class:  WPAbstract
+
+Default View:  Settings (0x02)
+Class Style:  0xd8 (NeverCopy NeverTemplate NeverDelete NeverPrint)
+
+Instance Method & Data Summary
+Cnt	Size	Source
+  2	  0	WPSound
+  0	  4	WPAbstract
+  0	  0	CWObject
+163	144	WPObject
+ 32	  0	SOMObject
+197	152	total
+
+Class Method & Data Summary
+Cnt	Size	Source
+  0	  0	M_WPSound
+  5	  0	M_WPAbstract
+  0	  0	M_CWObject
+ 45	 20	M_WPObject
+ 75	380	SOMClass
+ 32	  0	SOMObject
+157	404	total
+
+WPSound - 2 New methods:
+
+195  wpAddSoundWarningBeepPage	1e738dc4
+196  wpAddSoundSchemePage    	1e738d18
+
+WPSound - Override methods:
+
+from WPObject:
+034  wpAddObjectWindowPage   	1e738494
+035  wpAddSettingsPages      	1e738cd0
+062  wpFilterMenu            	1e738ca0
+
+from SOMObject:
+000  somDefaultInit          	1e738c4c
+001  somDestruct             	1e738bdc
+
+M_WPSound - No New methods.
+
+M_WPSound - Override methods:
+
+from M_WPObject:
+111  wpclsQueryDefaultHelp   	1e73844c
+112  wpclsQueryDefaultView   	1e738444
+119  wpclsQueryStyle         	1e738bc8
+120  wpclsQueryTitle         	1e73848c
+128  wpclsQueryIconData      	1e738464
+
+-------------
+
+Class:  MMSound                 	018e9cd8
+Metaclass:  M_WPSound           	018fe1a8
+Parent:  WPSound                 	018fd514
+Replaces:  WPSound
+
+Module:  D:\MMOS2\DLL\MMSND.DLL
+Load cause:  WPS registration
+
+Registered WPS class
+Title:  Ton
+Storage class:  WPAbstract
+
+Default View:  Settings (0x02)
+Class Style:  0xd8 (NeverCopy NeverTemplate NeverDelete NeverPrint)
+
+Instance Method & Data Summary
+Cnt	Size	Source
+  1	  0	MMSound
+  2	  0	WPSound
+  0	  4	WPAbstract
+  0	  0	CWObject
+163	144	WPObject
+ 32	  0	SOMObject
+198	152	total
+
+Class Method & Data Summary
+Cnt	Size	Source
+  0	  0	M_WPSound
+  5	  0	M_WPAbstract
+  0	  0	M_CWObject
+ 45	 20	M_WPObject
+ 75	380	SOMClass
+ 32	  0	SOMObject
+157	404	total
+
+MMSound - 1 New methods:
+
+197  wpAddSoundFilePage      	1e6b32e0
+
+MMSound - Override methods:
+
+from WPObject:
+035  wpAddSettingsPages      	1e6b31a0
+068  wpInitData              	1e6b30d6
+
+from SOMObject:
+000  somDefaultInit          	1f952430
+001  somDestruct             	1f952320
+
+M_WPSound - No New methods.
+
+M_WPSound - Override methods:
+
+from M_WPObject:
+111  wpclsQueryDefaultHelp   	1e73844c
+112  wpclsQueryDefaultView   	1e738444
+119  wpclsQueryStyle         	1e738bc8
+120  wpclsQueryTitle         	1e73848c
+128  wpclsQueryIconData      	1e738464
+
+------------------
+
+Class:  MMShadow                	00e7722c
+Metaclass:  M_MMShadow          	00e77fa8
+Parent:  WPShadow                	00e57b58
+Replaces:  WPShadow
+
+Module:  D:\MMOS2\DLL\MMSHD.DLL
+Load cause:  WPS registration
+
+Registered WPS class
+Title:  Referenz
+Storage class:  WPAbstract
+
+Default View:  Unknown (-1)
+Class Style:  0x90 (NeverTemplate NeverPrint)
+
+Instance Method & Data Summary
+Cnt	Size	Source
+  1	528	MMShadow
+  4	 24	WPShadow
+  0	  4	WPAbstract
+  0	  0	CWObject
+163	144	WPObject
+ 32	  0	SOMObject
+200	704	total
+
+Class Method & Data Summary
+Cnt	Size	Source
+  0	  0	M_MMShadow
+  0	  0	M_WPShadow
+  5	  0	M_WPAbstract
+  0	  0	M_CWObject
+ 45	 20	M_WPObject
+ 75	380	SOMClass
+ 32	  0	SOMObject
+157	404	total
+
+MMShadow - 1 New methods:
+
+199  TestRemovableMediaLink  	1f130c10
+
+MMShadow - Override methods:
+
+from WPShadow:
+197  wpSetLinkToObject       	1f1309c2
+
+from WPObject:
+032  wpAddObjectGeneralPage  	1f1303b0
+061  wpFilterPopupMenu       	1f130880
+068  wpInitData              	1f130b80
+071  wpInsertSettingsPage    	1f130a10
+077  wpOpen                  	1f1308d4
+105  wpRestoreState          	1f130750
+111  wpSaveState             	1f1307f0
+128  wpUnInitData            	1f130464
+129  wpViewObject            	1f130420
+
+from SOMObject:
+000  somDefaultInit          	1f952430
+001  somDestruct             	1f952320
+
+M_MMShadow - No New methods.
+
+M_MMShadow - Override methods:
+
+-------------------
+
+
Index: /tags/CWMM-0.3.0_GA/Misc-Information/primgfix-mehods.txt
===================================================================
--- /tags/CWMM-0.3.0_GA/Misc-Information/primgfix-mehods.txt	(revision 213)
+++ /tags/CWMM-0.3.0_GA/Misc-Information/primgfix-mehods.txt	(revision 213)
@@ -0,0 +1,138 @@
+Class:  PracticeImage           	0164e160
+Metaclass:  M_PracticeImage     	0164f294
+Parent:  MMImage                 	016507b8
+Replaces:  MMImage
+
+Module:  D:\OS2\DLL\PRIMAGE.DLL
+Load cause:  WPS registration
+
+Registered WPS class
+Title:  Practice Image
+Storage class:  WPFileSystem
+
+Default View:  Running (0x04)
+Class Style:  0x80 (NeverPrint)
+
+Instance Method & Data Summary
+Cnt	Size	Source
+  0	  0	PracticeImage
+  2	 24	MMImage
+  6	  0	WPImageFile
+  0	  8	XFldDataFile
+  0	  0	CWDataFile
+ 14	  0	WPDataFile
+  1	 12	XWPFileSystem
+ 41	 52	WPFileSystem
+  1	264	CWObject
+ 19	 52	XFldObject
+163	144	WPObject
+ 32	  0	SOMObject
+279	560	total
+
+Class Method & Data Summary
+Cnt	Size	Source
+  0	  0	M_PracticeImage
+  4	  0	M_MMImage
+  0	  4	M_WPImageFile
+  0	  0	M_XFldDataFile
+  0	  0	M_CWDataFile
+  2	  0	M_WPDataFile
+  0	  0	M_XWPFileSystem
+  6	  0	M_WPFileSystem
+  0	  0	M_CWObject
+  1	  0	M_XFldObject
+ 45	 20	M_WPObject
+ 75	380	SOMClass
+ 32	  0	SOMObject
+165	408	total
+
+PracticeImage - No New methods.
+
+PracticeImage - Override methods:
+
+from WPDataFile:
+265  wpQueryAssociatedFileIcon	1eb102a8
+
+from WPObject:
+083  wpQueryDefaultView      	1eb102d2
+
+M_PracticeImage - No New methods.
+
+M_PracticeImage - Override methods:
+
+from M_WPObject:
+112  wpclsQueryDefaultView   	1eb10260
+120  wpclsQueryTitle         	1eb10230
+
+-------------------------------------------------
+
+Class:  PracticeBitmap          	01316904
+Metaclass:  M_PracticeBitmap    	01317af4
+Parent:  MMBitmap                	01318ea8
+
+Module:  D:\OS2\DLL\PRIMAGE.DLL
+Load cause:  WPS registration
+
+Registered WPS class
+Title:  Practice Bitmap
+Storage class:  WPFileSystem
+
+Default View:  Running (0x04)
+Class Style:  0 (none)
+File Associations:
+  Name:  *.BMP
+  Type:  Bitmap
+
+Instance Method & Data Summary
+Cnt	Size	Source
+  0	  0	PracticeBitmap
+  1	 12	MMBitmap
+  0	  8	WPBitmap
+  6	  0	WPImageFile
+  0	  8	XFldDataFile
+  0	  0	CWDataFile
+ 14	  0	WPDataFile
+  1	 12	XWPFileSystem
+ 41	 52	WPFileSystem
+  1	264	CWObject
+ 19	 52	XFldObject
+163	144	WPObject
+ 32	  0	SOMObject
+278	556	total
+
+Class Method & Data Summary
+Cnt	Size	Source
+  0	  0	M_PracticeBitmap
+  1	  0	M_MMBitmap
+  0	  4	M_WPBitmap
+  0	  4	M_WPImageFile
+  0	  0	M_XFldDataFile
+  0	  0	M_CWDataFile
+  2	  0	M_WPDataFile
+  0	  0	M_XWPFileSystem
+  6	  0	M_WPFileSystem
+  0	  0	M_CWObject
+  1	  0	M_XFldObject
+ 45	 20	M_WPObject
+ 75	380	SOMClass
+ 32	  0	SOMObject
+162	412	total
+
+PracticeBitmap - No New methods.
+
+PracticeBitmap - Override methods:
+
+from WPDataFile:
+265  wpQueryAssociatedFileIcon	1eb10078
+
+from WPObject:
+083  wpQueryDefaultView      	1eb100a2
+
+M_PracticeBitmap - No New methods.
+
+M_PracticeBitmap - Override methods:
+
+from M_WPObject:
+112  wpclsQueryDefaultView   	1eb10030
+120  wpclsQueryTitle         	1eb10000
+
Index: /tags/CWMM-0.3.0_GA/Misc-Information/tagged_as.txt
===================================================================
--- /tags/CWMM-0.3.0_GA/Misc-Information/tagged_as.txt	(revision 213)
+++ /tags/CWMM-0.3.0_GA/Misc-Information/tagged_as.txt	(revision 213)
@@ -0,0 +1,3 @@
+Release 0.2.7b is tagged as:
+
+cvs tag cwohl-mmext_0_2_7b
Index: /tags/CWMM-0.3.0_GA/WPSundoc/WPImage_info.txt
===================================================================
--- /tags/CWMM-0.3.0_GA/WPSundoc/WPImage_info.txt	(revision 213)
+++ /tags/CWMM-0.3.0_GA/WPSundoc/WPImage_info.txt	(revision 213)
@@ -0,0 +1,18 @@
+              // now we have the WPImageFile...
+                // in any case, LOCK it so it won't go dormant
+                // behind our butt
+                _wpLockObject(pobjImage);
+
+                // now we need to return a HBITMAP... unfortunately
+                // WPImageFile does NO reference counting whatsover
+                // when doing _wpQueryBitmapHandle, but will create
+                // a new HBITMAP for every call, which is just plain
+                // stupid. So that's what we need the image cache
+                // for: create only one HBITMAP for every image file,
+                // no matter how many times it is used...
+
+                // so check if we can find it in the cache
+                if (fLocked = LockImages())
+                {
+                    PLISTNODE pNode = lstQueryFirstNode(&G_llImages);
+                    while (pNode)
Index: /tags/CWMM-0.3.0_GA/WPSundoc/WinBuildPtrHandle.txt
===================================================================
--- /tags/CWMM-0.3.0_GA/WPSundoc/WinBuildPtrHandle.txt	(revision 213)
+++ /tags/CWMM-0.3.0_GA/WPSundoc/WinBuildPtrHandle.txt	(revision 213)
@@ -0,0 +1,5 @@
+
+/* This function is undocumented */
+#pragma import(WinBuildPtrHandle,,"PMMERGE", 5117)
+
+HPOINTER WinBuildPtrHandle(void* pIconData);
Index: /tags/CWMM-0.3.0_GA/WPSundoc/classinfo.txt
===================================================================
--- /tags/CWMM-0.3.0_GA/WPSundoc/classinfo.txt	(revision 213)
+++ /tags/CWMM-0.3.0_GA/WPSundoc/classinfo.txt	(revision 213)
@@ -0,0 +1,547 @@
+Warp 4 FP 10
+
+WPFolder instance data in the .CLASSINFO EA:
+
+
+---- Key 0x0b7a (2938 IDKEY_FDRGRIDINFO) ----
+
+Type:		0x0004 (binary)
+Size:		8
+ 
+Contains the grid spacing for folders. Apparently two ULONG. First is
+horizontal, second vertical spacing.
+
+Example:
+
+04 00 7A 0B 08 00 FF 00 00 00 80 00 00 00 
+^^^^^ ^^^^^ ^^^^^ ^^^^^^^^^^^ ^^^^^^^^^^^
+|     |     |     |           |
+|     |     |     |           Vertical spacing
+|     |     |     Horizontal spacing
+|     |     Size
+|     Key
+Binary
+
+
+---- Key 0x0b74 (2932 Sort class) ----
+
+FF D0 FF FF FF D0 FF FF FF 04 00 74 0B 10 00 08  ÿÐÿÿÿÐÿÿÿ..t....
+                           ^^^^^ ^^^^^ ^^^^^ ^^
+                           |     |     |     |
+                           |     |     |     Unknown
+                           |     |     Size, Init: 0x10, will be modified: already seen: 0x22     
+                           |     Key
+                           Binary     
+
+00 57 50 49 6D 61 67 65 46 69 6C 65 00 FF FF     .WPImageFile.ÿÿ.
+^^ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ^^^^^ 
+|  |                                   |
+|  Sort Class name with ending 0       unknown
+Unknown
+
+
+---- Key 0x0b71 (2929 Sort page) ----
+
+                                             04
+00 71 0B 18 00 FE FF FF FF 00 00 00 00 FE FF FF  .q...þÿÿÿ....þÿÿ
+   ^^^^^ ^^^^^ ^^^^^^^^^^  ^^
+   |     |     |           |
+   |     |     |           Always sort: 01=yes, 00=no
+   |     |     Init: FE FF FF FF, later standard sort e.g. 05 00 00 00
+   |      Size 0x18 (24)
+   Key
+
+FF 00 00 00 00 00 00 00 00 00 00 00 00 04 00 7A  ÿ..............z
+0B 08 00 00 00 00 00 00 00 00 00 02 00 7B 0B 04  .............{..
+00 00 00 00 00 09 00 48 00 57 50 4F 62 6A 65 63  .......H.WPObjec
+74 00 04 00 0B 00 20 00 01 00 00 00 00 00 00 00  t..... .........
+09 00 00 00 80 00 00 00 00 00 00 00 00 00 00 00  ...............
+03 00 00 00 02 00 00 00 04 00 0C 00 0E 00 02 00  ................
+32 31 37 33 36 34 40 32 30 00 FF FF 04 00 04 00  217364@20.ÿÿ....
+08 00 FF FF FF FF FF FF FF FF 00 00 00 00 00 00  ..ÿÿÿÿÿÿÿÿ......
+
+
+---- Key 0x0b73 (2931 IDKEY_FDRLONGARRAY) ----
+
+Type:		0x0004 (binary)
+Size:		0x54 (84)
+
+Example:
+
+00 00 04 00 73 0B 54 00 80 00 30 00 64 00 50 00  ....s.T..0.d.P.
+      ^^^^^ ^^^^^ ^^^^^ ^^          ^^    ^^
+      |     |     |     |           |     |
+      |     |     |     |           |     View (2. Tree): 0x50: with lines
+      |     |     |     |           |                     0x10: without lines
+      |     |     |     |           Tree Icon: 0x64: small
+      |     |     |     |                      0x44: normal
+      |     |     |     |                      0x41: invisible
+      |     |     |     |
+      |     |     |     View (first view page): 22h: Non flowed, single column, small icons  
+      |     |     |                             02h: Non flowed, single column, normal icons
+      |     |     |                             01h: Non flowed, single column, invisible icons
+      |     |     |                             32h: Non flowed, multiple columns, small icons
+      |     |     |                             12h: Non flowed, multiple columns, normal icons
+      |     |     |                             11h: Non flowed, multiple columns, invisible icons
+      |     |     Size (84 dec)                 04h: Flowed as placed normal icons
+      |     |                                   24h: Flowed as placed small icons 
+      |     Key                                 80h: Gridded 
+      Binary
+
+08 80 30 00 03 00 00 00 00 00 00 00 FF FF FF FF  .0.........ÿ
+            ^^
+            |
+            
+
+ÿÿÿ
+00 00 00 40 EF FF FF FF EF FF FF FF DD FF FF FF  ...@ïÿÿÿïÿÿÿÝÿÿÿ
+EF FF FF FF EF FF FF FF DD FF FF FF 00 00 00 40  ïÿÿÿïÿÿÿÝÿÿÿ...@
+00 00 00 40 00 00 00 40 00 00 00 00 02 00 00 00  ...@...@........
+D0 FF FF FF D0 FF FF FF D0 FF FF FF 04 00 74 0B  ÐÿÿÿÐÿÿÿÐÿÿÿ..t.
+                                 ^^
+                                  |
+                          Last byte
+
+
+----------------------
+Data structures:
+
+#define INSTANCEDATA_TYPE_LONG		0x0002
+#define INSTANCEDATA_TYPE_STRING	0x0003
+#define INSTANCEDATA_TYPE_BINARY	0x0004
+
+/* Every block of instance data starts with this struct.
+   The data follows directly after this header     */
+typedef struct _InstanceDataHead
+{
+USHORT	usType;				/* One of the INSTANCEDATA_TYPE_* constants */
+USHORT	usKey;				/* key used in wpSaveXXX() */
+USHORT	usLength;			/* size of data followingalue */
+}INSTANCEDATAHEAD;
+
+
+/* The following structs represent the different types
+   of instance data */
+typedef struct _wpInstanceDataLong
+{
+USHORT	usType;				/* 0x0002 */
+USHORT	usKey;				/* key used in wpSaveLong() */
+USHORT	usLength;			/* size of value, always 0x0004 */
+ULONG	ulValue;
+}INSTANCEDATALONG;
+
+
+typedef struct _wpInstanceDataString
+{
+USHORT	usType;				/* 0x0003 */
+USHORT	usKey;				/* key used in wpSaveString() */
+USHORT	usLength;			/* String length including terminating 0 */
+UCHAR	ucData[];			/* The string including a terminating 0 */
+}INSTANCEDATASTRING;
+
+
+typedef struct _wpInstanceDataBinary
+{
+USHORT	usType;				/* 0x0004 */
+USHORT	usKey;				/* key used in wpSaveData() */
+USHORT	usLength;			/* Size of data block */
+BYTE	data[];                         /* Data */
+}INSTANCEDATABINARY;
+
+-----------------
+
+/* Instance data block for a class. For every class in the chain of classes
+there may be one of these blocks. The current class is the first, the parent class
+instance data follows, then the grand parent class instance data etc. Last one is
+always WPObject. */
+typedef struct _InstanceDataBlockHead
+{
+USHORT	usClassNameLength;			/* Length of class name including terminating 0 */
+USHORT	usDataSize;				/* Size of data block starting after this structure */
+UCHAR	ucClassName[];				/* Array holding classname with terminating 0 */
+}DATABLOCKHEAD;
+						/* Data block with variable length is immediately following. 
+						   This data block consist of several INSTANCEDATALONG/STRING/BINARY */
+
+/* The above structure is documented in wpobject.idl as WPSRCLASSBLOCK: */
+
+      /* Notes: The class name immediately follows the control block. The
+       *        first instance variable control block immediately follows
+       *        this.
+       */
+      typedef struct _WPSRCLASSBLOCK
+      {
+        SHORT   ClassNameLength;       /* Length of class name, including the
+                                        * .. null terminator. This must be a
+                                        * .. SHORT and must be at the beginning
+                                        * .. of the structure.
+                                        */
+        USHORT  IVarLength;            /* Length of instance variable
+                                        * .. information, including the two-
+                                        * .. byte null terminator
+                                        */
+      } WPSRCLASSBLOCK;
+
+----------------
+
+struct CLASSINFO
+{
+const USHORT	usEAType;			/* Always EAT_BINARY: 0xFFFE */
+USHORT		usSize;				/* Size of data starting with usUnknown1 */
+USHORT		usUnknown1;
+USHORT		usUnknown2;
+USHORT		usDataSize;			/* Data size following the class name (starting with usOffset) */
+USHORT		usUnknown3;
+UCHAR		ucClassName[];			/* The class of this object including the terminating 0, e.g. WPDataFile */
+USHORT		usOffset;			/* Offset to WPObject instance data block starting at usOffset */
+USHORT		usUnknown4;                     /* Seems to be always 0x19c9 (c9 19)*/
+USHORT		usUnknown5;			/* Seems to be always 0x0010 */
+USHORT		usUnknown6;			/* Always the same as usUnknown4 0x19c9 */
+USHORT		usSizeInstanceData;		/* Size of all INSTANCEDATABLOCKs + sizeof(usSizeInstanceData2) + sizeof(usUnknown6)
+						   + sizeof(usUnknown7) + sizeof(usUnknown8) + sizeof(usSizeInstanceData) */
+USHORT		usUnknown7;			/* Always the same as usUnknown4 0x19c9 */
+USHORT		usSizeInstanceData2;		/* Size of all INSTANCEDATABLOCKs including 6 terminating zero bytes.
+						   Each INSTANCEDATABLOCK structure is followed by a data block of variable length. */
+USHORT		usUnknown8;			/* Seems to be alway 0x0000 (?) */
+INSTANCEDATABLOCK	instanceDataBlocks[];	/* One or more instance data blocks. At least the WPObject data block is present. */
+						/* The WPObject instance data block is always the last one. Attention: the instance
+						   data blocks may have different sizes! */
+const UCHAR		ucZero[6];		/* 6 terminating zero bytes */
+}
+
+Remark:
+All data is stored in INTEL byte order in the EA, this means lowByte-HighByte.
+See example.
+
+******************* Examples *************************************************
+
+FE FF  72 00  10 00 00 00 5F 00 00 00 57 50 44 61  þÿr....._...WPDa
+^^^^^  ^^^^^              ^^^^^       ^^^^^^^^^^^
+|      |                  |           |
+|      |                  |           Class
+|      |                  |
+|      |                  Total data size following starting after the class name and
+|      |                  including the 6 terminating 0 bytes.
+|      |
+|      |  
+|      Size of data following (here 114 dez). Total size of EA is this + 4 (FE FF + size-word)
+|
+|
+EAT_BINARY
+
+                      |----------------------------
+74 61 46 69 6C 65 00  |10 00   2F 15 10 00 2F 15 59  taFile.../.../.Y
+^^^^^^^^^^^^^^^^^^^^  |__________________________________________________Controllblock. Always 16 bytes
+                       ^^^^^               ^^^   ^^  
+                       |                   |     |  
+                       |                   |     Data size til end starting here * (???)
+                       |                   * <-----------------------------------|
+                       |
+                       Total data to Begin of WPObject data block (length word)
+
+--------------------|
+00 2F 15 4F 00 00 00|  09 00 3C 00 57 50 4F 62 6A  ./.O.....<.WPObj
+____________________|  ^^^^^ ^^^^^ ^^^^^^^^^^^^^^
+^^       ^^^^^         |     |     |
+         |             |     |     |
+         |             |     |     Class name in wpSave*() with terminating 0
+         |             |     |
+         |             |     Data in WPObject data block starting after the name (including 0).
+         |             |
+         |             WPObject starts here: Length of name including terminating 0.
+         |             In this example it's the first instance data block.
+         |
+         Size of following data beginning with first class instance data block including terminating 6 zero bytes
+
+
+65 63 74 00   04 00 0B 00 20 00 04 00 00 00 00 00  ect..... .......
+^^^^^^^^^^^   ^^^^^ ^^^^^ ^^^^^ ^^^^^^^^^^^^^^^^^
+                    |     |     |
+                    |     |     Value
+                    |     |
+                    |     Length
+                    |
+                    Key (4001 dez)
+
+00 00 09 00 00 00 10 00 00 00 00 00 00 00 00 00  ................
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+00 00 03 00 00 00 02 00 00 00   04 00 0C 00 02 00  ................
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^   ^^^^^ ^^^^^ ^^^^^
+Value cont.                     |     |     |
+                                |     |     Length
+                                |     |
+                                |     Key
+                                |
+                                Value is ??
+
+FF FF 04 00 04 00 08 00 FF FF FF FF FF FF FF FF  ÿÿ......ÿÿÿÿÿÿÿÿ
+^^^^^ ^^^^^ ^^^^^ ^^^^^ ^^^^^^^^^^^^^^^^^^^^^^^
+|     |     |     |     |
+|     |     |     |     Value
+|     |     |     |
+|     |     |     Length
+|     |     |
+|     |     Key
+|     |
+|     Value type
+|
+Value
+
+
+00 00 00 00 00 00                                ......          
+^^^^^^^^^^^^^^^^^
+|
+Terminating 6 zero bytes
+
+
+*********************************
+
+
+
+
+
+******************************************************
+
+Complex example:
+
+
+FE FF  FE 00  00 00 00 00 F0 00 00 00 43 57 4D 50  þÿþ.....ð...CWMP
+^^^^^  ^^^^^              ^^^^^       ^^^^^^^^^^^
+|      |                  |           |
+|      |                  |           Class
+|      |                  |
+|      |                  Total data size following starting after the class name and
+|      |                  including the 6 terminating 0 bytes.
+|      |
+|      |  
+|      Size of data following (here 254 dez). Total size is this + 4 (FE FF + size-word)
+|
+|
+EAT_BINARY
+
+
+33 00   A1 00 2D 15 10 00 2D 15 EA 00 2D 15 E0 00  3.¡.-...-.ê.-.à.
+^^^^^   ^^^^^                               ^^^^^
+|       |                                   |
+|       |                                   Size of all instance data blocks following including terminating zero bytes
+|       |
+|       161 Offset to WPObject starting from this word. See below for an explanation
+|
+Class(cont.)
+
+
+00 00 08 00 85 00 43 57 41 75 64 69 6F 00   02 00  ....
+.CWAudio...
+      ^^^^^ ^^^^^ ^^^^^^^^^^^^^^^^^^^^^^^   ^^^^^
+      |     |     |                         |
+      |     |     |                         Value is a LONG ->wpSaveLong()
+      |     |     |
+      |     |     Class name in wpSave*() with terminating 0
+      |     |
+      |     Total length of data for this name starting after the terminating 0
+      |
+      Length of Class name incl. terminating 0
+
+
+A1 0F 04 00 56 01 00 00    02 00 A3 0F 04 00 44 AC  ¡...V.....£...D¬
+^^^^^ ^^^^^ ^^^^^^^^^^^    ^^^^^ ^^^^^ ^^^^^ ^^^^^
+|     |     |              |     |     |     |
+|     |     |              |     |     |     Value
+|     |     |              |     |     |
+|     |     |              |     |     Length
+|     |     |              |     |
+|     |     |              |     Key
+|     |     |              |
+|     |     |              Value is a LONG
+|     |     |
+|     |     Value (here: 342dez)
+|     |
+|     Length
+|
+Key (4001 dez)
+
+
+00 00   02 00 A2 0F 04 00 02 00 00 00   02 00 A4 0F  ....¢.........€.
+^^^^^   ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^   ^^^^^^^^^^
+|       |                               |
+|       LONG value                      LONG value
+|
+Value cont.
+
+04 00 10 00 00 00   02 00 A5 0F 04 00 67 8A 62 00  ........¥...gb.
+^^^^^^^^^^^^^^^^^   ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+|                   |
+LONG value cont.    LONG value
+
+02 00 AC 0F 04 00 8B 3A 05 00   03 00 A6 0F 12 00  ..¬...:....Š...
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^   ^^^^^ ^^^^^ ^^^^^
+|                               |     |    |
+LONG value                      |     |    Length of String in wpSaveString() including terminating 0
+                                |     |
+                                |     Key for wpSaveString
+                                |
+                                Value is a string
+
+
+57 6F 75 6E 64 20 49 6E 20 4D 79 20 48 65 61 72  Wound In My Hear
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+|
+Value of wpSaveString() (+ terminating 0)
+
+74 00    03 00 A7 0F 0B 00 50 72 6F 70 61 67 61 6E  t...§...Propagan
+^^^^^    ^^^^^ ^^^^^ ^^^^^ ^^^^^^^^^^^^^^^^^^^^^^^
+         |     |     |          |
+         |     |     |          String value of wpSaveString()...
+         |     |     |
+         |     |     Length of string including 0
+         |     |
+         |     Key for wpSaveString (here: 4007dez)
+         |
+         Value is a string ->wpSaveString()
+
+
+64 61 00    03 00 A8 0F 05 00 31 32 33 34 00   03 00  da...š...1234...
+^^^^^^^^    ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^   ^^^^^
+            |                                  |
+            |                                  String value
+            |
+            String with length 5 (including 0)
+ 
+
+A9 0F 01 00 00   03 00 AA 0F 01 00 00   03 00 AB 0F  ©......ª......«.
+^^^^^ ^^^^^ ^^   ^^^^^^^^^^^^^^^^^^^^   ^^^^^^^^^^^
+|     |     |    |                      |
+|     |     |    Empty string           Empty string
+|     |     |
+|     |     |
+|     |     String (here: only terminating 0)
+|     |
+|     Length of string (here: 1 this means an empty string, only the terminating 0)
+|
+Key
+
+*************** Now following WPObject instance data ******************
+
+01 00 00   09 00 3C 00 57 50 4F 62 6A 65 63 74 00  .....<.WPObject.
+^^^^^^^^   ^^^^^ ^^^^^ ^^^^^^^^^^^^^^^^^^^^^^^^^^
+           |     |     |
+           |     |     Class name with terminating 0
+           |     |
+           |     Total length of this data block starting after the name
+           |
+           Length of Class name incl. terminating 0
+
+04 00 0B 00 20 00 EF BB 00 00 00 00 00 00 09 00  .... .ï»........
+^^^^^ ^^^^^ ^^^^^ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+|     |     |     |
+|     |     |     Value
+|     |     |
+|     |     Length
+|     |
+|     Key
+|
+
+00 00 00 00 00 00 00 00 00 00 00 00 00 00 03 00  ................
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+
+00 00 02 00 00 00   04 00 0C 00 02 00 FF FF   04 00  ............ÿÿ..
+^^^^^^^^^^^^^^^^^   ^^^^^ ^^^^^ ^^^^^ ^^^^^   ^^^^^
+|                   |     |     |     |       |
+Value               |     |     |     |       Value is a ??
+                    |     |     |     |       
+                    |     |     |     Value
+                    |     |     |
+                    |     |     Length (here 2)
+                    |     |
+                    |     Key
+                    |
+                    Value is a ??
+
+04 00 08 00 FF FF FF FF FF FF FF FF   00 00 00 00  ....ÿÿÿÿÿÿÿÿ....
+^^^^^ ^^^^^ ^^^^^^^^^^^^^^^^^^^^^^^   ^^^^^^^^^^^              
+|     |     |                         |
+|     |     Value                     ??? 6 terminating 0 bytes
+|     |
+|     Length
+|
+Key
+
+00 00                                            ..              
+^^^^^
+|
+???
+
+---------------------------------
+
+Example 1:
+
+FE FF E9 00 10 00 00 00 D3 00 00 00 57 50 43 6F  þÿé.....Ó...WPCo
+6D 6D 61 6E 64 46 69 6C 65 00
+                             --> 6E 00 2D 15 10 00  mmandFile.n.-...
+                                 ^^^^^
+                                 |
+                                 110 Offset to WPObject
+
+    2D 15 CD 00 2D 15 C3 00 00 00 0E 00 4C 00 57 50  -.Í.-.Ã.....L.WP
+    50 72 6F 67 72 61 6D 46 69 6C 65 00 04 00 0A 00  ProgramFile.....
+    14 00 00 00 00 00 02 00 00 00 00 00 00 00 10 00  ................
+    00 00 01 00 00 00 04 00 0B 00 02 00 FF FF 04 00  ............ÿÿ..
+    06 00 24 00 00 00 00 00 00 00 00 00 00 00 00 00  ..$.............
+    00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................
+    00 00 00 00 00 00 00 00 <--
+
+                            09 00 52 00 57 50 4F 62  ..........R.WPOb
+                            ^^^^^
+                            |
+                            WPObject class name length
+
+    6A 65 63 74 00 04 00 0B 00 20 00 04 00 00 00 00  ject..... ......
+
+
+00 00 00 0B 00 00 00 10 00 00 00 00 00 00 00 00  ................
+00 00 00 03 00 00 00 02 00 00 00 04 00 0C 00 18  ................
+00 02 00 32 30 37 30 39 34 40 32 30 2C 32 31 37  ...207094@20,217
+32 33 33 40 32 30 00 FF FF 04 00 04 00 08 00 FF  233@20.ÿÿ......ÿ
+FF FF FF FF FF FF FF 00 00 00 00 00 00           ÿÿÿÿÿÿÿ......   
+
+------------------
+
+Example 2:
+
+FE FF 7E 00 00 00 00 00 6B 00 00 00 57 50 44 61  þÿ~.....k...WPDa
+74 61 46 69 6C 65 00
+                    --> 10 00 BE 14 10 00 BE 14 65  taFile...Ÿ...Ÿ.e
+                        ^^^^^
+                        |
+                        16 Offset to WPObject starting from this word
+
+00 BE 14 5B 00 00 00 <--
+
+                        09 00 48 00 57 50 4F 62 6A  .Ÿ.[.....H.WPObj
+                        ^^^^^
+                        |
+                        WPObject class name length
+
+65 63 74 00 04 00 0B 00 20 00 00 10 00 00 00 00  ect..... .......
+00 00 09 00 00 00 00 00 00 00 00 00 00 00 00 00  ................
+00 00 03 00 00 00 02 00 00 00 04 00 0C 00 0E 00  ................
+02 00 32 30 39 31 32 37 40 32 30 00 FF FF 04 00  ..209127@20.ÿÿ..
+04 00 08 00 FF FF FF FF FF FF FF FF 00 00 00 00  ....ÿÿÿÿÿÿÿÿ....
+00 00                                            ..              
+
+
+------------------------------------------------------------------
+
+WPS bugs
+---------
+
+wpFreeMem(somSelf, pByte) doesn't check for pByte==NULL causing trap.
+
+wpAllocMem() may block if called from within a folder frame procedure. For example
+when owner drawing icons in lighttable folders a method in CW-Multimedia classes
+is called to get a bitmap handle. If that method uses wpAllocMem() internally to
+keep track of data a deadlock occurs. Replacing wpAllocMem() with malloc() solves the
+issue.
+
Index: /tags/CWMM-0.3.0_GA/WPSundoc/tempData.txt
===================================================================
--- /tags/CWMM-0.3.0_GA/WPSundoc/tempData.txt	(revision 213)
+++ /tags/CWMM-0.3.0_GA/WPSundoc/tempData.txt	(revision 213)
@@ -0,0 +1,169 @@
+
+typedef struct _wpInstanceDataLong
+{
+USHORT	usType;				/* 0x0002 */
+USHORT	usKey;				/* key used in wpSaveLong() */
+USHORT	usLength;			/* size of value, always 0x0004 */
+ULONG	ulValue;
+}INSTANCEDATALONG;
+
+
+typedef struct _wpInstanceDataString
+{
+USHORT	usType;				/* 0x0003 */
+USHORT	usKey;				/* key used in wpSaveString() */
+USHORT	usLength;			/* String length including terminating 0 */
+UCHAR	ucData[];			/* The string including a terminating 0 */
+}INSTANCEDATASTRING;
+
+
+typedef struct _wpInstanceDataBinary
+{
+USHORT	usType;				/* 0x0004 */
+USHORT	usKey;				/* key used in wpSaveData() */
+USHORT	usLength;			/* Size of data block */
+BYTE	data[];
+}INSTANCEDATABINARY;
+
+
+/* Instance data block for a class. For every class in the chain of classes
+there may be one of these blocks. The current class is the first, the parent class
+instance data follows, then the grand parent class instance data etc. */
+typedef struct _InstanceDataBlockHead
+{
+USHORT	usClassNameLength;			/* Length of class name including terminating 0 */
+USHORT	usDataSize;				/* Size of data block starting after this structure */
+UCHAR	ucClassName[];				/* Array holding classname with terminating 0 */
+}INSTANCEDATABLOCK;
+						/* Data block with variable length is immediately following. 
+						   This data block consist of several INSTANCEDATALONG/STRING/BINARY */
+
+struct CLASSINFO
+{
+const USHORT	usEAType;			/* EAT_BINARY: 0xFFFE */
+USHORT		usSize;				/* Size of data following starting with usUnknown1 */
+USHORT		usUnknown1;
+USHORT		usUnknown2;
+USHORT		usDataSize;			/* Data size following the class name (starting with usOffset) */
+USHORT		usUnknown3;
+UCHAR		ucClassName[];			/* The class of this object including the terminating 0, e.g. WPDataFile */
+USHORT		usOffset;			/* Offset to WPObject instance data block starting at usOffset */
+USHORT		usUnknown4;
+USHORT		usUnknown5;
+USHORT		usSizeInstanceData;		/* Size of all INSTANCEDATABLOCKs + sizeof(usSizeInstanceData2) + sizeof(usUnknown7)
+						   + sizeof(usUnknown6) + sizeof(usUnknown5) + sizeof(usSizeInstanceData) */
+USHORT		usUnknown6;
+USHORT		usSizeInstanceData2;		/* Size of all INSTANCEDATABLOCKs including 6 terminating zero bytes.
+						   Each INSTANCEDATABLOCK structure is followed by a data block of variable length. */
+USHORT		usUnknown7;
+INSTANCEDATABLOCK	instanceDataBlocks[];	/* One or more instance data blocks. At least the WPObject data block is present. */
+						/* The WPObject instance data block is always the last one. Attention: the instance
+						   data blocks may have different sizes! */
+const UCHAR		ucZero[6];		/* Terminating zero bytes */
+}
+
+------------------------------------
+
+
+1:
+
+FE FF E9 00 10 00 00 00 D3 00 00 00 57 50 43 6F  þÿé.....Ó...WPCo
+6D 6D 61 6E 64 46 69 6C 65 00
+                             --> 6E 00 2D 15 10 00  mmandFile.n.-...
+                                 ^^^^^
+                                 |
+                                 110 Offset to WPObject
+
+    2D 15 CD 00 2D 15 C3 00 00 00 0E 00 4C 00 57 50  -.Í.-.Ã.....L.WP
+    50 72 6F 67 72 61 6D 46 69 6C 65 00 04 00 0A 00  ProgramFile.....
+    14 00 00 00 00 00 02 00 00 00 00 00 00 00 10 00  ................
+    00 00 01 00 00 00 04 00 0B 00 02 00 FF FF 04 00  ............ÿÿ..
+    06 00 24 00 00 00 00 00 00 00 00 00 00 00 00 00  ..$.............
+    00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................
+    00 00 00 00 00 00 00 00 <--
+
+                            09 00 52 00 57 50 4F 62  ..........R.WPOb
+                            ^^^^^
+                            |
+                            WPObject class name length
+
+    6A 65 63 74 00 04 00 0B 00 20 00 04 00 00 00 00  ject..... ......
+
+
+00 00 00 0B 00 00 00 10 00 00 00 00 00 00 00 00  ................
+00 00 00 03 00 00 00 02 00 00 00 04 00 0C 00 18  ................
+00 02 00 32 30 37 30 39 34 40 32 30 2C 32 31 37  ...207094@20,217
+32 33 33 40 32 30 00 FF FF 04 00 04 00 08 00 FF  233@20.ÿÿ......ÿ
+FF FF FF FF FF FF FF 00 00 00 00 00 00           ÿÿÿÿÿÿÿ......   
+
+------------------
+
+2:
+
+FE FF 7E 00 00 00 00 00 6B 00 00 00 57 50 44 61  þÿ~.....k...WPDa
+74 61 46 69 6C 65 00
+                    --> 10 00 BE 14 10 00 BE 14 65  taFile...Ÿ...Ÿ.e
+                        ^^^^^
+                        |
+                        16 Offset to WPObject starting from this word
+
+00 BE 14 5B 00 00 00 <--
+
+                        09 00 48 00 57 50 4F 62 6A  .Ÿ.[.....H.WPObj
+                        ^^^^^
+                        |
+                        WPObject class name length
+
+65 63 74 00 04 00 0B 00 20 00 00 10 00 00 00 00  ect..... .......
+00 00 09 00 00 00 00 00 00 00 00 00 00 00 00 00  ................
+00 00 03 00 00 00 02 00 00 00 04 00 0C 00 0E 00  ................
+02 00 32 30 39 31 32 37 40 32 30 00 FF FF 04 00  ..209127@20.ÿÿ..
+04 00 08 00 FF FF FF FF FF FF FF FF 00 00 00 00  ....ÿÿÿÿÿÿÿÿ....
+00 00                                            ..              
+
+
+----------------------------------------
+
+
+E FF 8C 02 80 00 00 00 7B 02 00 00 57 50 46 6F  þÿ....{...WPFo
+6C 64 65 72 00 20 02 CB 19 10 00 CB 19 75 02 CB  lder. .Ë...Ë.u.Ë
+19 6B 02 00 00 0C 00 28 00 43 61 6E 64 79 46 6F  .k.....(.CandyFo
+6C 64 65 72 00 02 00 94 11 04 00 00 00 00 00 02  lder...........
+00 95 11 04 00 64 00 00 00 02 00 96 11 04 00 64  ....d........d
+00 00 00 02 00 97 11 04 00 64 00 00 00 09 00 32  ........d.....2
+00 43 57 46 6F 6C 64 65 72 00 02 00 E8 03 04 00  .CWFolder...è...
+00 00 00 00 02 00 E9 03 04 00 00 00 00 00 02 00  ......é.........
+EA 03 04 00 00 00 00 00 02 00 EB 03 04 00 96 00  ê.........ë....
+00 00 02 00 EC 03 04 00 03 00 00 00 08 00 1E 00  ....ì...........
+58 46 6F 6C 64 65 72 00 02 00 0B 00 04 00 FF 00  XFolder.......ÿ.
+00 00 02 00 0C 00 04 00 FF 00 00 00 02 00 0D 00  ........ÿ.......
+04 00 FF 00 00 00 09 00 62 01 57 50 46 6F 6C 64  ..ÿ.....b.WPFold
+65 72 00 04 00 6D 0B B6 00 43 4C 41 53 43 57 41  er...m.¶.CLASCWA
+75 64 69 6F 53 68 61 64 6F 77 00 43 4C 41 53 4D  udioShadow.CLASM
+4D 49 6D 61 67 65 00 43 4C 41 53 4D 4D 41 75 64  MImage.CLASMMAud
+69 6F 00 43 4C 41 53 58 57 50 46 6F 6E 74 4F 62  io.CLASXWPFontOb
+6A 65 63 74 00 43 4C 41 53 58 57 50 54 72 61 73  ject.CLASXWPTras
+68 4F 62 6A 65 63 74 00 43 4C 41 53 43 57 4D 61  hObject.CLASCWMa
+69 6C 46 69 6C 65 00 43 4C 41 53 57 50 46 74 70  ilFile.CLASWPFtp
+4F 62 6A 00 43 4C 41 53 57 50 55 72 6C 00 43 4C  Obj.CLASWPUrl.CL
+41 53 57 50 4F 62 6A 65 63 74 00 43 4C 41 53 57  ASWPObject.CLASW
+50 46 69 6C 65 53 79 73 74 65 6D 00 43 52 49 54  PFileSystem.CRIT
+BC F8 F7 13 00 00 00 00 00 00 00 00 08 00 00 00  Œø÷.............
+00 00 00 00 02 00 00 00 04 00 00 00 02 00 00 04  ................
+00 73 0B 54 00 04 00 30 00 64 00 50 00 28 80 30  .s.T...0.d.P.(0
+00 02 00 00 00 00 00 00 00 FF FF FF FF 00 00 00  .........ÿÿÿÿ...
+40 EF FF FF FF EF FF FF FF DD FF FF FF EF FF FF  @ïÿÿÿïÿÿÿÝÿÿÿïÿÿ
+FF EF FF FF FF DD FF FF FF 00 00 00 40 00 00 00  ÿïÿÿÿÝÿÿÿ...@...
+40 00 00 00 40 00 00 00 00 02 00 00 00 D0 FF FF  @...@........Ðÿÿ
+FF D0 FF FF FF D0 FF FF FF 04 00 74 0B 10 00 08  ÿÐÿÿÿÐÿÿÿ..t....
+00 57 50 49 6D 61 67 65 46 69 6C 65 00 FF FF 04  .WPImageFile.ÿÿ.
+00 71 0B 18 00 FE FF FF FF 00 00 00 00 FE FF FF  .q...þÿÿÿ....þÿÿ
+FF 00 00 00 00 00 00 00 00 00 00 00 00 04 00 7A  ÿ..............z
+0B 08 00 00 00 00 00 00 00 00 00 02 00 7B 0B 04  .............{..
+00 00 00 00 00 09 00 48 00 57 50 4F 62 6A 65 63  .......H.WPObjec
+74 00 04 00 0B 00 20 00 01 00 00 00 00 00 00 00  t..... .........
+09 00 00 00 80 00 00 00 00 00 00 00 00 00 00 00  ...............
+03 00 00 00 02 00 00 00 04 00 0C 00 0E 00 02 00  ................
+32 31 37 33 36 34 40 32 30 00 FF FF 04 00 04 00  217364@20.ÿÿ....
+08 00 FF FF FF FF FF FF FF FF 00 00 00 00 00 00  ..ÿÿÿÿÿÿÿÿ......
+
Index: /tags/CWMM-0.3.0_GA/WPSundoc/wpsundoc.ipf
===================================================================
--- /tags/CWMM-0.3.0_GA/WPSundoc/wpsundoc.ipf	(revision 213)
+++ /tags/CWMM-0.3.0_GA/WPSundoc/wpsundoc.ipf	(revision 213)
@@ -0,0 +1,562 @@
+:userdoc.
+
+:docprof.
+
+:title.WPS undocumented features
+
+:h1 res=100.Introduction
+:p.
+This document describes features and data structures of the WPS not documented in the official reference manuals. The
+information was gathered from usegroups, public source code or by means of reverse engineering.
+:p.
+
+
+:h1 res=3000
+x=left y=bottom..CLASSINFO
+:p.
+The .CLASSINFO extended attribute of filesystem objects contains all the settings of the specific object you
+may change using the settings notebook. This EA tells the WPS which folder class a folder is an instance of and it
+contains all the objects instance data saved using _wpSaveXXX().
+:nt.
+All data is stored in INTEL byte order in the EA, this means lowByte-HighByte.
+See examples.
+:ent.
+
+:h2 res=3100
+x=left width=100%
+group=2
+.General data structures
+
+:xmp.
+#define INSTANCEDATA_TYPE_LONG      0x0002
+#define INSTANCEDATA_TYPE_STRING    0x0003
+#define INSTANCEDATA_TYPE_BINARY    0x0004
+:exmp.
+
+:xmp.
+/* Every block of instance data starts with this struct.
+   The data follows directly after this header.          */
+typedef struct _InstanceDataHead
+{
+ USHORT usType;     /* One of the INSTANCEDATA_TYPE_* constants */
+ USHORT usKey;      /* key used in wpSaveXXX()                  */
+ USHORT usLength;   /* size of data following                   */
+}INSTANCEDATAHEAD;
+:exmp.
+
+:xmp.
+/* The following structs represent the different types
+   of instance data */
+typedef struct _wpInstanceDataLong
+{
+ USHORT usType;      /* 0x0002 */
+ USHORT usKey;       /* key used in wpSaveLong() */
+ USHORT usLength;    /* size of value, always 0x0004 */
+ LONG   lValue;      /* Data */
+}INSTANCEDATALONG;
+
+
+typedef struct _wpInstanceDataString
+{
+ USHORT usType;         /* 0x0003 */
+ USHORT usKey;          /* key used in wpSaveString() */
+ USHORT usLength;       /* String length including terminating 0 */
+ UCHAR  ucData[];       /* The string including a terminating 0 */
+}INSTANCEDATASTRING;
+
+
+typedef struct _wpInstanceDataBinary
+{
+ USHORT usType;         /* 0x0004 */
+ USHORT usKey;          /* key used in wpSaveData() */
+ USHORT usLength;       /* Size of data block */
+ BYTE   data[];         /* Data */
+}INSTANCEDATABINARY;
+:exmp.
+
+:xmp.
+/* Instance data block for a class. For every class in the chain of classes
+   there may be one of these blocks. The current class is the first, the parent class
+   instance data follows, then the grand parent class instance data etc. Last one is
+   always WPObject. Directly after this header the data follows. Each data entity consists 
+   of an INSTANCEDATAHEAD followed by the associated data as described above. */
+typedef struct _InstanceDataBlockHead
+{
+ USHORT usClassNameLength;  /* Length of class name including terminating 0 */
+ USHORT usDataSize;         /* Size of data block starting after this structure */
+ UCHAR  ucClassName[];      /* Array holding name with terminating 0 used during saving.
+                               Usually the classname but that's not enforced. */
+ 
+}IDATABLOCKHEAD;
+:exmp.
+
+:xmp.
+/* Structure of the .CLASSINFO attribute */
+struct CLASSINFO
+{
+ const  USHORT usEAType;      /* Always EAT_BINARY: 0xFFFE */
+ USHORT usSize;               /* Size of data starting with usUnknown1 */
+ USHORT usFlags1;             /* 0x0000: data files (?) */
+                              /* 0x0080: folder  (?)   */
+                              /* 0x0090: folder with custom icon (set using settings notebook) */
+                              /* 0x00C8: desktop folder (?) */
+                              /* 0x0BD2: WPVault            */
+ USHORT usFlags2;             /* 0x0000: ??   */
+                              /* 0x0001: ??   */
+ USHORT usDataSize;           /* Data size following the class name (starting with usOffset) */
+ USHORT usUnknown3;
+ UCHAR  ucClassName[];        /* The class of this object including the terminating 0, e.g. WPDataFile */
+ USHORT usOffset;             /* Offset to WPObject instance data block starting at usOffset */
+ USHORT usUnknown4;           /* */
+ USHORT usUnknown5;           /* */
+ USHORT usUnknown6;           /* Always the same as usUnknown4 */
+ USHORT usSizeInstanceData;   /* Size of all INSTANCEDATABLOCKs + sizeof(usSizeInstanceData2) + sizeof(usUnknown6)
+                                 + sizeof(usUnknown7) + sizeof(usUnknown8) + sizeof(usSizeInstanceData) */
+ USHORT usUnknown7;           /* Always the same as usUnknown4 */
+ USHORT usSizeInstanceData2;  /* Size of all INSTANCEDATABLOCKs including 6 terminating zero bytes.
+                                 Each INSTANCEDATABLOCK structure is followed by a data block of variable length. */
+ USHORT usUnknown8;           /* Seems to be alway 0x0000 (?) */
+INSTANCEDATABLOCK instanceDataBlocks[];  /* One or more instance data blocks. At least the WPObject data block
+                                 is present. */
+                              /* The WPObject instance data block is always the last one. Attention: the instance
+                                 data blocks may have different sizes! */
+ const UCHAR ucZero[6];       /* 6 terminating zero bytes */
+}
+:exmp.
+
+:h2 res=3200
+x=left width=100%
+group=2
+.Instance data
+:p.
+
+:h3 res=3300
+x=left width=100%
+group=2
+.Key 0x0b73 (2931), IDKEY_FDRLONGARRAY; WPFolder
+
+:xmp.
+Type    0x0004 (binary)
+Size    0x54 (84)
+:exmp.
+The data can be represented by the following structure (items with ??? are taken from the WPTool source by H. Kelder and are not checked):
+:xmp.
+typedef struct _WPFolderLongArray
+{
+ ULONG ulIconView;
+ ULONG ulTreeView;
+ ULONG ulDetailsView; (???)
+ ULONG ulFolderFlag;  (???)
+ ULONG ulUnknown1;
+ ULONG ulUnknown2;
+ BYTE  rgbTextBkgnd[4];
+ BYTE  Filler1[4];
+ BYTE  Filler2[4]; 
+ BYTE  rgbIconTextColor[4];
+ BYTE  Filler3[4];
+ BYTE  rgbTreeTextColor[4];
+ BYTE  rgbDetailsTextColor[4];
+ BYTE  Filler5[4];
+ BYTE  Filler6[4];
+ BYTE  Filler7[4];
+ BYTE  Filler8[4];
+ ULONG ulMenuFlag; (???)
+ BYTE  rgbIconShadowTextColor[4];
+ BYTE  rgbTreeShadowTextColor[4];
+ BYTE  rgbDetailsShadowTextColor[4];
+
+} WPFOLDLONGARRAY;
+:exmp.
+
+:xmp.
+Example:
+
+00 00 04 00 73 0B 54 00 80 00 30 00 64 00 50 00  
+      ^^^^^ ^^^^^ ^^^^^ ^^          ^^    ^^
+      |     |     |     |           |     |
+      |     |     |     |           |     View (2. Tree): 0x50: with lines
+      |     |     |     |           |                     0x10: without lines
+      |     |     |     |           Tree Icon: 0x64: small
+      |     |     |     |                      0x44: normal
+      |     |     |     |                      0x41: invisible
+      |     |     |     |
+      |     |     |     View (first view page): 22h: Non flowed, single column, small icons  
+      |     |     |                             02h: Non flowed, single column, normal icons
+      |     |     |                             01h: Non flowed, single column, invisible icons
+      |     |     |                             32h: Non flowed, multiple columns, small icons
+      |     |     |                             12h: Non flowed, multiple columns, normal icons
+      |     |     |                             11h: Non flowed, multiple columns, invisible icons
+      |     |     Size (84 dec)                 04h: Flowed as placed normal icons
+      |     |                                   24h: Flowed as placed small icons 
+      |     Key                                 80h: Gridded 
+      Binary
+
+08 80 30 00 03 00 00 00 00 00 00 00 FF FF FF FF
+
+55 55 80 40 EF FF FF FF EF FF FF FF DD FF FF FF <--- 0xFF if not changed
+^^ ^^ ^^ ^^                         ^^ ^^ ^^ ^^--> Icon text color
+|  |  |  |                          
+|  |  |  0x40 if color never set, after setting 0x00. If 0xff apparently use system default.
+|  |  R  |
+|  G  |  |
+B  |  |  |
+|  |  |  |
+------------> Text background for every view. If set to transparency: 0xFFFFFF01
+|
+01 if Transparent
+
+EF FF FF FF EF FF FF FF DD FF FF FF 00 00 00 40  
+            ^^ ^^ ^^ ^^ 
+            |_________|
+                      |
+                      Tree text color (init: 0xFFFFFFEF)
+
+00 00 00 40 00 00 00 40 00 00 00 00 02 00 00 00  
+
+
+D0 FF FF FF D0 FF FF FF D0 FF FF FF 04 00 74 0B  
+^^ ^^ ^^ ^^ ^^ ^^ ^^ ^^ ^^ ^^ ^^ ^^
+|  |  |  |  |  |  |  |  |_________|--Details shadow text color
+|  |  |  |  |  |  |  |            |
+|  |  |  |  |  |  |  |            Last byte
+|  |  |  |  |  |  |  |            
+|  |  |  |  |  |  |  0xFF if not changed
+|  |  |  |  |  |  R       
+|  |  |  |  |  G                  
+|  |  |  |  B                     
+|  |  |  |  |________|-- Tree shadow text color
+|  |  |  |                        
+|  |  |  |                        
+|  |  |  0xFF if not changed
+|  |  R          
+|  G                      
+B        |
+|________|-- Icon shadow text color
+:exmp.
+
+
+:h3 res=3600
+x=left width=100%
+group=2
+.Key 0x04 (4), WPObject
+:p.
+This key is always at the end of the .CLASSINFO data. It is followed by the 6 terminating zeros.
+:xmp.
+Type   0x0004
+Size   0x08
+struct _WPObjectKey04
+{
+ BYTE bytes[8]; /* Seems to be most of the time 0xFFFFFFFF FFFFFFFF
+                   but sometimes has indeed another value. */
+}
+:exmp.
+
+:h3 res=3400
+x=left width=100%
+group=2
+.Key 0x0b (11), WPObject data
+:p.
+This info is from the WPTOOL source by H. Kelder. Items with (??) are not checked for accuracy.
+:xmp.
+Type   0x0004
+Size   0x20 (32)
+
+struct _WPObjectData
+{
+LONG  lDefaultView;   /* As set in the settings notebook e.g 102: Details view (OPEN_DETAILS) */
+ULONG ulHelpPanel;    (??)
+ULONG ulUnknown3;     (??)
+ULONG ulObjectStyle;  /* Different OBJSTYLE_* ored together */
+ULONG ulMinWin;       (??)
+ULONG ulConcurrent;   (??)
+ULONG ulViewButton;   (??)
+ULONG ulMenuFlag;     /* Short menus: 0x00000000, normal (long): 0x00000001 */
+} WPOBJDATA;
+:exmp.
+
+:h3 res=3500
+x=left width=100%
+group=2
+.Key 0x0c (12), WPObject
+:p.
+Contains the ID if set and additional data, probably the object handle.
+:xmp.
+Type   0x0004
+Size   0x02 when empty, data is 0xFFFF
+       0xXX when data saved.
+
+struct _WPObjectDataKey0C_1
+{
+ USHORT usType;   /* 0x0001 */
+ UCHAR  ucID[];   /* ID with terminating 0 */
+}
+:exmp.
+:p.
+This structure may be followed (but isn't always) by another one. Or the second one is the only
+structure if the object doesn't has an ID but a handle. 
+:p.
+:xmp.
+struct _WPObjectDataKey0C_2
+{
+ USHORT usType;      /* 0x0002 */
+ UCHAR  ucHandle[];  /* Apparently handle(s) in decimal followed by an ID value,
+                        terminated with 0. e.g. 206526@10. Several handles with ID
+                        separated by ',' may be found. The handle is always the same
+                        (of course) but the ID different, e.g. 251239@10,251239@20.
+                        The ID probably specifies icon/details/tree view. I guess
+                        this is added when a folder position record is added to the INI.
+                        XXXXXX@YY is the key in the INI then. 
+                        @1010: tree view 
+                        @10:
+                        @20: */
+}
+:exmp.
+:p.
+The structure(s) are always followed by 0xFFFF. If the key is 'empty' only this
+value is stored. The 0xFFFF is included in the size.
+:p.
+:xmp.
+USHORT usPad[2];     /* Always 0xFFFF. Always appended. */
+:exmp.
+
+.********************** methods ************************
+:h1 res=4000
+x=left y=bottom width=100%.Methods
+
+
+:h2 res=4010
+x=left y=bottom width=100%.wpMakeDormant
+
+:xmp.
+This can fail if the object is locked by system for some reason e.g. running executables.
+
+BOOL wpDestroyObject();
+
+
+:exmp.
+:xmp.
+BOOL wpMakeDormant(in BOOL fSave)
+
+// finally, this calls wpMakeDormant, which destroys the SOM object
+                brc = _wpMakeDormant(somSelf, 0);
+
+/*
+ *@@sourcefile object.c
+ *      implementation code for XFldObject class.
+ *
+ *      This file is ALL new with V0.9.0.
+ *
+ *      This looks like a good place for general explanations
+ *      about how the WPS maintains Desktop objects as SOM objects
+ *      in memory.
+ *
+ *      The basic object life cycle is like this:
+ *
+ +        wpclsNew
+ +        wpCopyObject
+ +        wpCreateFromTemplate
+ +              ³
+ +              ³      ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿
+ +              ³      ³ awake object ³
+ +              ÀÄÄÄÄ> ³ (physical    ³ <ÄÄ wpclsMakeAwake ÄÄÄ¿
+ +                     ³ and memory)  ³                       ³
+ +                     ÀÄÄÄÄÄÂÄÂÄÄÄÄÄÄÙ                       ³
+ +                           ³ ³                              ³
+ +          \ /              ³ ³                   ÚÄÄÄÄÄÄÄÄÄÄÁÄÄÄÄÄ¿
+ +           X   <ÄÄ wpFree ÄÙ ÀÄ wpMakeDormant Ä> ³ dormant object ³
+ +          / \                                    ³ (physical only)³
+ +                                                 ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ
+ *
+ *      The basic rule is that there is the concept of a
+ *      "dormant object". This is an object that currently
+ *      exists only in storage, but not as a SOM object in
+ *      memory. "Storage" is disk for file-system objects
+ *      and OS2.INI for abstract objects.
+ *
+ *      By contrast, an object is said to be "awake" if it
+ *      also exists as a SOM object in memory. Per definition,
+ *      an awake object also has a physical representation.
+ *      Only WPTransients have no physical storage at all;
+ *      as a consequence, there is really no such thing as
+ *      a dormant transient object.
+ *
+ *      1)  Objects are most frequently made awake when a folder
+ *          is populated (mostly on folder open). Of course this
+ *          does not physically create objects... they are only
+ *          instantiated in memory then from their physical
+ *          storage.
+ *
+ *          There are many ways to awake objects. To awake a
+ *          single object, call M_WPObject&colon.&colon.wpclsMakeAwake.
+ *          This is a bit difficult to manage, so
+ *          WPFileSystem&colon.&colon.wpclsQueryObjectFromPath is easier
+ *          for waking up FS objects (which calls wpclsMakeAwake
+ *          internally). wpclsMakeAwake also gets called from
+ *          within WPFolder&colon.&colon.wpPopulate.
+ *
+ *      2)  Even though this isn't documented anywhere, the
+ *          WPS also supports the reverse concept of making
+ *          the object dormant again. This will destroy the
+ *          SOM object in memory, but not the physical representation.
+ *
+ *          I suspect this was not documented because you can
+ *          never know whether some code still needs the
+ *          SOM pointer to the object somehow. Anyway, the
+ *          WPS _does_ make objects dormant again, e.g. when
+ *          their folders are closed and they are not referenced
+ *          from anywhere else. You can prevent the WPS from doing
+ *          this by calling WPObject&colon.&colon.wpLock.
+ *
+ *          The interesting thing is that there is an undocumented
+ *          method for destroying the SOM object.
+ *          WPObject&colon.&colon.wpMakeDormant does exactly this.
+ *          Actually, this does a lot of things:
+ *
+ *          --  It removes the object from all containers,
+ *
+ *          --  closes all views (wpClose),
+ *
+ *          --  frees all associated memory allocated thru wpAllocMem.
+ *
+ *          --  In addition, if the object has called _wpSaveDeferred
+ *              and a _wpSaveImmediate is thus pending, _wpSaveImmediate
+ *              also gets called. (See XFldObject&colon.&colon.wpSaveDeferred
+ *              for more about this.)
+ *
+ *          --  Finally, wpMakeDormant calls wpUnInitData, which
+ *              should clean up the object.
+ *
+ *      3)  An object is physically created through either
+ *          M_WPObject&colon.&colon.wpclsNew or WPObject&colon.&colon.wpCopyObject or
+ *          WPObject&colon.&colon.wpCreateAnother or WPObject&colon.&colon.wpCreateFromTemplate.
+ *          These are the "object factories" of the WPS. Depending
+ *          on which class the method is invoked on, the new object
+ *          will be of that class.
+ *
+ *          Depending on the object's class, wpclsNew will create
+ *          a physical representation (e.g. file, folder) of the
+ *          object _and_ a SOM object. So calling, for example,
+ *          M_WPFolder&colon.&colon.wpclsNew will create a new folder on disk
+ *          and return a SOM object that represents it.
+ *
+ *      4)  Deleting an object can really be done in two ways:
+ *
+ *          --  WPObject&colon.&colon.wpDelete looks like the most natural
+ *              way. However this really only displays a
+ *              confirmation and then invokes WPObject&colon.&colon.wpFree.
+ *
+ *          --  WPObject&colon.&colon.wpFree is the most direct way to
+ *              delete an object. This does not display any
+ *              more confirmations (in theory), but deletes
+ *              the object right away.
+ *
+ *              Interestingly, wpFree in turn calls another
+ *              undocumented method -- WPObject&colon.&colon.wpDestroyObject.
+ *              From my testing this is responsible for destroying
+ *              the physical representation (file, folder, INI data).
+ *
+ *              After that, wpFree also calls wpMakeDormant
+ *              to free the SOM object.
+ *
+ *      wpDestroyObject is a bit obscure. I believe it is this
+ *      method which was supposed to do the object cleanup.
+ *      It is introduced by WPObject and overridden by the
+ *      following classes:
+ *
+ *      --  WPFileSystem&colon. apparently, this then does DosDelete.
+ *          Unfortunately, this one has a real nasty bug... it
+ *          displays a message box if deleting the object fails.
+ *          This is really annoying when calling wpFree in a loop
+ *          on a bunch of objects. That's why we override this
+ *          method in WPDataFile&colon.&colon.wpDestroyObject and similar
+ *          methods (V0.9.20).
+ *
+ *      --  WPAbstract&colon. this probably removes the INI entries
+ *          associated with the abstract object.
+ *
+ *      --  WPProgram.
+ *
+ *      --  WPProgramFile.
+ *
+ *      --  WPTransient.
+ *
+ *      If folder auto-refresh is replaced by XWP, we must override
+ *      wpFree in order to suppress calling this method. The message
+ *      box bug is not acceptable for file-system objects, so we have
+ *      introduced WPDataFile&colon.&colon.wpDestroyObject instead.
+ *
+ *      The destruction call sequence thus is&colon.&colon.
+ *
+ +          wpDelete (display confirmation, if applicable)
+ +             |
+ +             +-- wpFree (really delete the object now)
+ +                   |
+ +                   +-- wpDestroyObject (delete physical storage)
+ +                   |
+ +                   +-- wpMakeDormant (delete SOM object in memory)
+ +                         |
+ +                         +-- (lots of cleanup: wpClose, etc.)
+ +                         |
+ +                         +-- wpSaveImmediate (if "dirty")
+ +                         |
+ +                         +-- wpUnInitData
+ *
+ *      Function prefix for this file:
+ *      --  obj*
+ *
+ *@@added V0.9.0 [umoeller]
+ *@@header "filesys\object.h"
+ */
+:exmp.
+
+
+:h2 res=4020
+x=left y=bottom width=100%.wpRefresh
+:p.
+If the menu item "refresh" is selected, wpRefresh(ULONG ulView, PVOID pReserved) is called with
+ulView==0.
+:p.
+If any of the "change to" menu items is selected (details, contents...), ulView will be the selected view.
+
+
+.********************** Setup Strings ************************
+:h1 res=2000
+x=left y=bottom width=30%.Setup strings
+:p.
+The following setup strings are more or less undocumented. 
+:ul.
+:li.:link reftype=hd res=2010.SAVEALLICONPOS:elink.
+
+:eul.
+
+:h2 res=2010
+x=30% width=70%
+group=2
+.SAVEALLICONPOS
+:p.
+Force a folder to save the icon positions of all it's objects. Seems to work at least with the desktop. May
+also work with every other folder class.
+:xmp.
+   SysSetObjectData("<WP_DESKTOP>"," SAVEALLICONPOS=YES")
+:exmp.
+
+
+.********************** random stuff ************************
+:h1 res=5000
+x=left y=bottom width=100%.Other observations
+:p.
+:ul.
+:li.wpQueryDetailsData() is always called before wpObjectReady()
+:li.wpRestoreData() is called before wpQueryDetailsData()
+
+:eul.
+:euserdoc.
+
+
+
+
+
+
+
+
+
Index: /tags/CWMM-0.3.0_GA/build.CMD
===================================================================
--- /tags/CWMM-0.3.0_GA/build.CMD	(revision 213)
+++ /tags/CWMM-0.3.0_GA/build.CMD	(revision 213)
@@ -0,0 +1,23 @@
+/* */
+call RxFuncAdd 'SysLoadFuncs', 'RexxUtil', 'SysLoadFuncs'
+call SysLoadFuncs
+
+buildInclude="build.inc"
+DEF_LINE="BUILD_STRING = -Build "
+
+if stream(buildInclude, 'C','query exists')="" THEN
+'@echo 'DEF_LINE' 0 > 'buildInclude
+
+theLine=LINEIN(buildInclude)
+call stream buildInclude, 'C', 'close'
+buildNr=WORD(theLine, 4)
+IF buildNr="" THEN buildNr=0
+buildNr=buildNr+1
+
+SAY "New Build: "buildNr
+SAY VALUE("CWMMRELEASE", ,"OS2ENVIRONMENT")
+'@type NUL > 'buildInclude
+call LINEOUT buildInclude, DEF_LINE||buildNr||' '||DATE(E)
+call stream buildInclude, 'C', 'close'
+SAY 
+Exit(0)
Index: /tags/CWMM-0.3.0_GA/classes/REPLACE.CMD
===================================================================
--- /tags/CWMM-0.3.0_GA/classes/REPLACE.CMD	(revision 213)
+++ /tags/CWMM-0.3.0_GA/classes/REPLACE.CMD	(revision 213)
@@ -0,0 +1,55 @@
+/* rexx -  replace  DLL */
+
+'replace H:\cwmm\classes\cwmm.dll D:\MMOS2\MMCLASS\CWMM.DLL'
+'replace H:\cwmm\classes\Res\dll\mmres_DE.dll d:\MMOS2\MMCLASS\bin\mmres_DE.dll'
+'replace H:\cwmm\classes\Res\dll\mmres_EN.dll d:\MMOS2\MMCLASS\bin\mmres_EN.dll'
+'replace H:\cwmm\mediafolder\mediafolder.dll d:\MMOS2\MEDIAFLD\BIN\MEDIAFLD.DLL'
+'replace H:\cwmm\mediafolder\res\obj\mediafolder_de.dll d:\MMOS2\MEDIAFLD\BIN\MFLDR_DE.DLL'
+'del d:\MMOS2\MEDIAFLD\BIN\mediafld.hlp'
+'copy H:\cwmm\mediafolder\help\mediafldr049.hlp d:\MMOS2\MEDIAFLD\BIN\mediafld.hlp'
+
+
+'replace H:\cwmm\classes\cwmm.dll J:\MMOS2\CWMM\CWMM.DLL'
+'replace H:\cwmm\mediafolder\mediafolder.dll J:\MMOS2\MEDIAFLD\BIN\MEDIAFLD.DLL'
+'replace H:\cwmm\mediafolder\res\obj\mediafolder_de.dll J:\MMOS2\MEDIAFLD\BIN\MFLDR_DE.DLL'
+'replace H:\cwmm\mediafolder\res\obj\mediafolder_en.dll J:\MMOS2\MEDIAFLD\BIN\MFLDR_EN.DLL'
+'del J:\MMOS2\MEDIAFLD\BIN\mediafld.hlp'
+'copy H:\cwmm\mediafolder\help\mediafldr049.hlp J:\MMOS2\MEDIAFLD\BIN\mediafld.hlp'
+
+'replace H:\cwmm\classes\Res\dll\mmres_DE.dll J:\MMOS2\CWMM\bin\mmres_DE.dll'
+'replace H:\cwmm\classes\Res\dll\mmres_EN.dll J:\MMOS2\CWMM\bin\mmres_EN.dll'
+
+'del J:\MMOS2\MMCLASS\cwmm.hlp'
+'copy H:\cwmm\classes\help\de\cwmm049.hlp J:\MMOS2\CWMM\cwmm.hlp'
+
+'replace H:\cwmm\JPGPROC\source\JPEGIO.DLL j:\MMOS2\DLL\JPEGIO.DLL'
+
+EXIT
+
+'replace G:\Projects_working\Audio_cdcreator_050\source\res\001\cdfld001.dll E:\CD-BRENNER\ADC_048\cdfld001.dll'
+
+'replace g:\projects_working\Audio_cdcreator_050\source\res\001\ipf\audiofolder001.hlp  d:\os2\help\aucdfldr.hlp'
+
+'replace g:\projects_working\Audio_cdcreator_050\source\res\001\ipf\tutorial001.inf E:\CD-BRENNER\ADC_048\tutorial.inf'
+
+'replace G:\Projects_working\Audio_cdcreator_050\source\ProgFolder\progfolder.dll d:\OS2\dll\progfldr.DLL'
+
+EXIT
+
+'replace G:\Projects_working\Audio_cdcreator_048\source\creator\audiofolder.dll E:\CD-Brenner\Audiocdcreator_047\AUCDFLDR.DLL'
+
+'replace G:\Projects_working\Audio_cdcreator_048\source\res\001\cdfld001.dll E:\CD-Brenner\Audiocdcreator_047\CDFLD001.DLL'
+
+'replace g:\projects_working\Audio_cdcreator_048\source\res\001\ipf\audiofolder001.hlp  d:\os2\help\aucdfldr.hlp'
+
+'replace g:\projects_working\Audio_cdcreator_048\source\res\001\ipf\tutorial001.inf E:\CD-Brenner\Audiocdcreator_046\tutorial.inf'
+
+'replace G:\Projects_working\Audio_cdcreator_048\source\ProgFolder\progfolder.dll d:\OS2\dll\progfldr.DLL'
+
+/*'replace g:\projects_working\audiocpy\cwdisk.dll  d:\os2\dll\CWDSKTRK.DLL g:\projects_working\audiocpy\olddskdll'*/
+/*
+'replace g:\projects_working\audiocpy\cwmmaudio2.dll  d:\os2\dll\CWMMAUDI.DLL g:\projects_working\audiocpy\oldMMAdll'
+*/
+
+Exit;
+
Index: /tags/CWMM-0.3.0_GA/classes/bin/audFldr.CMD
===================================================================
--- /tags/CWMM-0.3.0_GA/classes/bin/audFldr.CMD	(revision 213)
+++ /tags/CWMM-0.3.0_GA/classes/bin/audFldr.CMD	(revision 213)
@@ -0,0 +1,22 @@
+/* rexx -  Change the details and sort class
+   of a folder to use CWAudio instead of WPFileSystem */
+
+call RxFuncAdd 'SysLoadFuncs', 'RexxUtil', 'SysLoadFuncs'
+call SysLoadFuncs
+
+theFolder=ARG(1)
+theFolder=STRIP(TRANSLATE(theFolder,' ','"'))
+SAY theFolder
+
+rc=SysSetObjectData(theFolder,'DETAILSCLASS=CWAudio;SORTCLASS=CWAudio')
+IF rc=0 THEN DO
+	SAY 'Cannot set the details and sort class.'
+	'@PAUSE'
+	EXIT
+END
+
+SAY 'Detailsclass and sort class for folder changed.'
+'@PAUSE'
+EXIT
+
+
Index: /tags/CWMM-0.3.0_GA/classes/bin/audioext.rx
===================================================================
--- /tags/CWMM-0.3.0_GA/classes/bin/audioext.rx	(revision 213)
+++ /tags/CWMM-0.3.0_GA/classes/bin/audioext.rx	(revision 213)
@@ -0,0 +1,108 @@
+/* rexx - Get the extension of audio types added using
+   the multimedia setup object. For example *.FLA.
+   This script is called by M_MMAudio and mmfind.exe.
+*/
+
+call RxFuncAdd 'SysLoadFuncs', 'RexxUtil', 'SysLoadFuncs'
+call SysLoadFuncs
+
+allExt=""
+waveaudio=""
+
+/* Get MMOS2 directory */
+mmos2Dir=STRIP(TRANSLATE(value("MMBASE",,"OS2ENVIRONMENT")," ",";"))
+if LEFT(mmos2Dir,1)='\' THEN
+	mmpm2Ini=mmos2Dir||'mmpm2.ini'
+else
+	mmpm2Ini=mmos2Dir||'\mmpm2.ini'
+
+if STREAM(mmpm2ini, "C", "Query exists")='' THEN DO
+	/* MMPM2.INI not found */
+	rc=""
+	exit ""
+END
+
+/* Read ini */
+a=0
+DO WHILE LINES(mmpm2ini)
+	a=a+1
+	mmini.a=STRIP(LINEIN(mmpm2ini))
+END
+mmini.0=a
+ret=STREAM(mmpm2ini, "C", "close")
+
+/* Find [DRIVERS] section */
+DO a=1 to mmini.0
+	if ABBREV(TRANSLATE(mmini.a), "[DRIVERS]")=1 THEN DO
+		call parseDrivers
+		LEAVE
+	END
+END
+
+if waveaudio="" THEN DO
+	rc=""
+	exit ""
+END
+/*Now we have the wave device(s) */
+
+/* Get extensions from all devices */
+tempext=""
+DO b=1 to WORDS(waveaudio)
+	/* We may have several waveaudio devices */
+	tempExt=tempExt||' '||parseWaveDevice(WORD(waveaudio, b))
+END
+
+/* Build string and remove known extensions */
+DO b=1 to WORDS(tempExt)
+	curExt=WORD(tempExt,b)
+	SELECT
+	WHEN TRANSLATE(curExt)="MP3" THEN NOP /* Already supported by a spezialized class */
+	WHEN TRANSLATE(curExt)="OGG" THEN NOP
+	WHEN TRANSLATE(curExt)="FLA" THEN NOP
+	WHEN TRANSLATE(curExt)="FLAC" THEN NOP
+	WHEN TRANSLATE(curExt)="WAV" THEN NOP
+
+	OTHERWISE
+		if allExt\='' THEN allExt=allExt||','
+		allExt=allExt||'*.'||STRIP(curExt)
+	END
+END
+return allExt
+EXIT
+
+/**************************************/
+
+parseDrivers:
+a=a+1
+DO WHILE LEFT(mmini.a,1)\='['
+	IF ABBREV(TRANSLATE(mmini.a),"WAVEAUDIO")=1 THEN DO
+		thePos=POS("=",mmini.a)
+		if thePos=0 then return
+		waveaudio=TRANSLATE(RIGHT(mmini.a, LENGTH(mmini.a)-thePos)," ",",")
+		return
+	END
+	a=a+1
+	IF a>mmini.0 THEN return
+END
+return
+
+parseWavedevice:
+
+theDevice='['ARG(1)']'
+DO a=1 to mmini.0
+	if ABBREV(TRANSLATE(mmini.a), TRANSLATE(theDevice))=1 THEN DO
+		/* Device section found */
+		a=a+1
+		DO WHILE LEFT(mmini.a,1)\='['
+			IF ABBREV(TRANSLATE(mmini.a),"EXTNAMES")=1 THEN DO
+				thePos=POS("=",mmini.a)
+				if thePos=0 then return
+				ext=SUBWORD(TRANSLATE(RIGHT(mmini.a, LENGTH(mmini.a)-thePos)," ",","),2)
+				return ext
+			END
+			a=a+1
+			IF a>mmini.0 THEN return ""
+		END
+	END
+END
+return ""
Index: /tags/CWMM-0.3.0_GA/classes/bin/chktimid.rx
===================================================================
--- /tags/CWMM-0.3.0_GA/classes/bin/chktimid.rx	(revision 213)
+++ /tags/CWMM-0.3.0_GA/classes/bin/chktimid.rx	(revision 213)
@@ -0,0 +1,67 @@
+/* Rexx - check if Timidity is used as the default
+   sequencer.
+   The WPS crashes when Timidity is used to play a Midi
+   song using the classes.
+
+   (C) Chris Wohlgemuth 2003. This file is part of the
+       CW-Multimedia classes.
+
+      http://www.os2world.com/cdwriting
+
+   This skript is called by M_MMAudio::wpclsInitData()
+*/
+
+call RxFuncAdd 'SysLoadFuncs', 'RexxUtil', 'SysLoadFuncs'
+call SysLoadFuncs
+
+rc=0
+
+/* Get MMOS2 directory */
+mmos2Dir=STRIP(TRANSLATE(value("MMBASE",,"OS2ENVIRONMENT")," ",";"))
+if LEFT(mmos2Dir,1)='\' THEN
+	mmpm2Ini=mmos2Dir||'mmpm2.ini'
+else
+	mmpm2Ini=mmos2Dir||'\mmpm2.ini'
+
+if STREAM(mmpm2ini, "C", "Query exists")='' THEN DO
+	/* MMPM2.INI not found */
+	exit "0"
+END
+
+/* Read ini */
+a=0
+DO WHILE LINES(mmpm2ini)
+	a=a+1
+	mmini.a=STRIP(LINEIN(mmpm2ini))
+END
+mmini.0=a
+ret=STREAM(mmpm2ini, "C", "close")
+
+/* Find [DEFAULTNAMES] section */
+DO a=1 to mmini.0
+	if ABBREV(STRIP(TRANSLATE(mmini.a)), "[DEFAULTNAMES]")=1 THEN DO
+		rc=parseDefaultnames()
+		LEAVE
+	END
+END
+SAY rc
+if rc=1 THEN return "1"
+return "0"
+EXIT
+
+/**************************************/
+
+parseDefaultnames:
+a=a+1
+DO WHILE LEFT(mmini.a,1)\='['
+	IF ABBREV(TRANSLATE(mmini.a),"SEQUENCER")=1 THEN DO
+		thePos=POS("TIMIDITY",TRANSLATE(mmini.a))
+		if thePos=0 then return 0
+		return 1
+	END
+	a=a+1
+	IF a>mmini.0 THEN return 0
+END
+return 0
+
+
Index: /tags/CWMM-0.3.0_GA/classes/bin/imageadd.rx
===================================================================
--- /tags/CWMM-0.3.0_GA/classes/bin/imageadd.rx	(revision 213)
+++ /tags/CWMM-0.3.0_GA/classes/bin/imageadd.rx	(revision 213)
@@ -0,0 +1,10 @@
+/* rexx - Return additional image extensions the MMImage class
+   should handle.
+   This script is called by M_MMImage and mmfind.exe.
+*/
+
+
+allExt="*.JPE,*.JPEG"
+return allExt
+EXIT
+
Index: /tags/CWMM-0.3.0_GA/classes/bin/imageext.rx
===================================================================
--- /tags/CWMM-0.3.0_GA/classes/bin/imageext.rx	(revision 213)
+++ /tags/CWMM-0.3.0_GA/classes/bin/imageext.rx	(revision 213)
@@ -0,0 +1,13 @@
+/* rexx - Return all image extensions we have a MM class for.   
+   This script is called by M_MMImage and mmfind.exe. After getting the extensions
+   M_MMImage checks if there're any additional extensions handled by
+   installed image IO procedures. If yes, these unhandled extensions
+   are associated with the MMImage class so lighttable folder and
+   image editor are working.
+*/
+
+
+allExt="*._IM,*.DIB,*.GIF,*.JPG,*.VID,*.PCX,*.PCD,*.TIF,*.TGA,*.BMP"
+return allExt
+EXIT
+
Index: /tags/CWMM-0.3.0_GA/classes/bin/imgFldr.CMD
===================================================================
--- /tags/CWMM-0.3.0_GA/classes/bin/imgFldr.CMD	(revision 213)
+++ /tags/CWMM-0.3.0_GA/classes/bin/imgFldr.CMD	(revision 213)
@@ -0,0 +1,22 @@
+/* rexx -  Change the details and sort class
+   of a folder to use CWImage instead of WPFileSystem */
+
+call RxFuncAdd 'SysLoadFuncs', 'RexxUtil', 'SysLoadFuncs'
+call SysLoadFuncs
+
+theFolder=ARG(1)
+theFolder=STRIP(TRANSLATE(theFolder,' ','"'))
+SAY theFolder
+
+rc=SysSetObjectData(theFolder,'DETAILSCLASS=CWImage;SORTCLASS=CWImage')
+IF rc=0 THEN DO
+	SAY 'Cannot set the details and sort class.'
+	'@PAUSE'
+	EXIT
+END
+
+SAY 'Detailsclass and sort class for folder changed.'
+'@PAUSE'
+EXIT
+
+
Index: /tags/CWMM-0.3.0_GA/classes/bin/mpegext.rx
===================================================================
--- /tags/CWMM-0.3.0_GA/classes/bin/mpegext.rx	(revision 213)
+++ /tags/CWMM-0.3.0_GA/classes/bin/mpegext.rx	(revision 213)
@@ -0,0 +1,112 @@
+/* rexx - Get the extension of MPEG types added using
+   the multimedia setup object. For example *.DAT.
+   This script is called by M_MMPG.
+*/
+
+call RxFuncAdd 'SysLoadFuncs', 'RexxUtil', 'SysLoadFuncs'
+call SysLoadFuncs
+
+allExt=""
+waveaudio=""
+
+/* Get MMOS2 directory */
+mmos2Dir=STRIP(TRANSLATE(value("MMBASE",,"OS2ENVIRONMENT")," ",";"))
+if LEFT(mmos2Dir,1)='\' THEN
+	mmpm2Ini=mmos2Dir||'mmpm2.ini'
+else
+	mmpm2Ini=mmos2Dir||'\mmpm2.ini'
+
+if STREAM(mmpm2ini, "C", "Query exists")='' THEN DO
+	/* MMPM2.INI not found */
+	rc=""
+	exit ""
+END
+
+/* Read ini */
+a=0
+DO WHILE LINES(mmpm2ini)
+	a=a+1
+	mmini.a=STRIP(LINEIN(mmpm2ini))
+END
+mmini.0=a
+ret=STREAM(mmpm2ini, "C", "close")
+
+/* Find [DRIVERS] section */
+DO a=1 to mmini.0
+	if ABBREV(TRANSLATE(mmini.a), "[DRIVERS]")=1 THEN DO
+		call parseDrivers
+		LEAVE
+	END
+END
+
+if waveaudio="" THEN DO
+	rc=""
+	exit ""
+END
+/*Now we have the wave device(s) */
+
+/* Get extensions from all devices */
+tempext=""
+DO b=1 to WORDS(waveaudio)
+	/* We may have several video devices */
+	/* We only want OpenMPEG by IBM */
+	IF POS("IBMMPEG", TRANSLATE(WORD(waveaudio, b))) >< 0  THEN
+		tempExt=tempExt||' '||parseWaveDevice(WORD(waveaudio, b))
+END
+
+/* Build string and remove known extensions */
+DO b=1 to WORDS(tempExt)
+	curExt=WORD(tempExt,b)
+	SELECT
+	WHEN TRANSLATE(curExt)="AVI" THEN NOP /* Already supported by a spezialized class */
+	WHEN TRANSLATE(curExt)="FLI" THEN NOP
+	WHEN TRANSLATE(curExt)="MOV" THEN NOP
+	WHEN TRANSLATE(curExt)="MPG" THEN NOP
+	WHEN TRANSLATE(curExt)="VBS" THEN NOP /* This one is also handled by MMMPG */
+
+
+	OTHERWISE
+		if allExt\='' THEN allExt=allExt||','
+		allExt=allExt||'*.'||STRIP(curExt)
+	END
+END
+
+return allExt
+EXIT
+
+/**************************************/
+
+parseDrivers:
+a=a+1
+DO WHILE LEFT(mmini.a,1)\='['
+	IF ABBREV(TRANSLATE(mmini.a),"DIGITALVIDEO")=1 THEN DO
+		thePos=POS("=",mmini.a)
+		if thePos=0 then return
+		waveaudio=TRANSLATE(RIGHT(mmini.a, LENGTH(mmini.a)-thePos)," ",",") /* There may be several entries */
+		return
+	END
+	a=a+1
+	IF a>mmini.0 THEN return
+END
+return
+
+parseWavedevice:
+
+theDevice='['ARG(1)']'
+DO a=1 to mmini.0
+	if ABBREV(TRANSLATE(mmini.a), TRANSLATE(theDevice))=1 THEN DO
+		/* Device section found */
+		a=a+1
+		DO WHILE LEFT(mmini.a,1)\='['
+			IF ABBREV(TRANSLATE(mmini.a),"EXTNAMES")=1 THEN DO
+				thePos=POS("=",mmini.a)
+				if thePos=0 then return
+				ext=SUBWORD(TRANSLATE(RIGHT(mmini.a, LENGTH(mmini.a)-thePos)," ",","),2)
+				return ext
+			END
+			a=a+1
+			IF a>mmini.0 THEN return ""
+		END
+	END
+END
+return ""
Index: /tags/CWMM-0.3.0_GA/classes/bin/removeEA.CMD
===================================================================
--- /tags/CWMM-0.3.0_GA/classes/bin/removeEA.CMD	(revision 213)
+++ /tags/CWMM-0.3.0_GA/classes/bin/removeEA.CMD	(revision 213)
@@ -0,0 +1,73 @@
+/*
+	rexx -  Remove  .CLASSINFO EA and set .TYPE EA
+*/
+
+call RxFuncAdd 'SysLoadFuncs', 'RexxUtil', 'SysLoadFuncs'
+call SysLoadFuncs
+
+theFolder=ARG(1)
+
+
+IF theFolder="" THEN DO
+call usage
+'PAUSE'
+EXIT
+END
+
+SAY
+SAY
+call usage2
+SAY
+SAY 'Type Control-C to abort.'
+'PAUSE'
+
+rc=SySFileTree(theFolder'\*.mp3', 'mp3s', 'FSO')
+
+theType='DFFF00000100FDFF'x||'0300'x||"MP3"
+DO a=1 to mp3s.0
+	/* Remove EA */
+	rc=SysPutEA(mp3s.a, ".CLASSINFO", '')
+	rc=SysPutEA(mp3s.a, ".TYPE", theType)
+END
+
+rc=SySFileTree(theFolder'\*.wav', 'mp3s', 'FSO')
+theType='DFFF00000100FDFF'x||'0300'x||"WAV"
+DO a=1 to mp3s.0
+	/* Remove EA */
+	rc=SysPutEA(mp3s.a, ".CLASSINFO", '')
+	rc=SysPutEA(mp3s.a, ".TYPE", theType)
+END
+
+rc=SySFileTree(theFolder'\*.ogg', 'mp3s', 'FSO')
+theType='DFFF00000100FDFF'x||'0300'x||"OGG"
+DO a=1 to mp3s.0
+	/* Remove EA */
+	rc=SysPutEA(mp3s.a, ".CLASSINFO", '')
+	rc=SysPutEA(mp3s.a, ".TYPE", theType)
+END
+
+SAY 'Done.'
+
+EXIT
+
+
+usage:
+parse SOURCE . . theName
+SAY
+SAY
+SAY 'Usage:'
+SAY theName' <folder>'
+return
+
+usage2:
+SAY 'This skript removes the .CLASSINFO extended attribute from'
+SAY 'the files inside the folder and all subfolders.'
+SAY ''
+SAY '[31;1;m****************************************[0;m'
+SAY ''
+SAY '  Track names of OGG and Wave files will be lost!'
+SAY ''
+SAY '[31;1;m****************************************[0;m'
+
+RETURN
+
Index: /tags/CWMM-0.3.0_GA/classes/bin/videoext.rx
===================================================================
--- /tags/CWMM-0.3.0_GA/classes/bin/videoext.rx	(revision 213)
+++ /tags/CWMM-0.3.0_GA/classes/bin/videoext.rx	(revision 213)
@@ -0,0 +1,110 @@
+/* rexx - Get the extension of video types added using
+   the multimedia setup object. For example *.QT.
+   This script is called by M_MMVideo.
+*/
+
+call RxFuncAdd 'SysLoadFuncs', 'RexxUtil', 'SysLoadFuncs'
+call SysLoadFuncs
+
+allExt=""
+waveaudio=""
+
+/* Get MMOS2 directory */
+mmos2Dir=STRIP(TRANSLATE(value("MMBASE",,"OS2ENVIRONMENT")," ",";"))
+if LEFT(mmos2Dir,1)='\' THEN
+	mmpm2Ini=mmos2Dir||'mmpm2.ini'
+else
+	mmpm2Ini=mmos2Dir||'\mmpm2.ini'
+
+if STREAM(mmpm2ini, "C", "Query exists")='' THEN DO
+	/* MMPM2.INI not found */
+	rc=""
+	exit ""
+END
+
+/* Read ini */
+a=0
+DO WHILE LINES(mmpm2ini)
+	a=a+1
+	mmini.a=STRIP(LINEIN(mmpm2ini))
+END
+mmini.0=a
+ret=STREAM(mmpm2ini, "C", "close")
+
+/* Find [DRIVERS] section */
+DO a=1 to mmini.0
+	if ABBREV(TRANSLATE(mmini.a), "[DRIVERS]")=1 THEN DO
+		call parseDrivers
+		LEAVE
+	END
+END
+
+if waveaudio="" THEN DO
+	rc=""
+	exit ""
+END
+/*Now we have the wave device(s) */
+
+/* Get extensions from all devices */
+tempext=""
+DO b=1 to WORDS(waveaudio)
+	/* We may have several video devices */
+	/* OpenMPEG by IBM is handled by it's own script called by M_MMPG */
+	IF POS("IBMMPEG", TRANSLATE(WORD(waveaudio, b))) = 0  THEN
+		tempExt=tempExt||' '||parseWaveDevice(WORD(waveaudio, b))
+END
+
+/* Build string and remove known extensions */
+DO b=1 to WORDS(tempExt)
+	curExt=WORD(tempExt,b)
+	SELECT
+	WHEN TRANSLATE(curExt)="AVI" THEN NOP /* Already supported by a spezialized class */
+	WHEN TRANSLATE(curExt)="FLI" THEN NOP
+	WHEN TRANSLATE(curExt)="MOV" THEN NOP
+	WHEN TRANSLATE(curExt)="MPG" THEN NOP
+
+	OTHERWISE
+		if allExt\='' THEN allExt=allExt||','
+		allExt=allExt||'*.'||STRIP(curExt)
+	END
+END
+return allExt
+EXIT
+
+/**************************************/
+
+parseDrivers:
+a=a+1
+DO WHILE LEFT(mmini.a,1)\='['
+	IF ABBREV(TRANSLATE(mmini.a),"DIGITALVIDEO")=1 THEN DO
+		thePos=POS("=",mmini.a)
+		if thePos=0 then return
+		waveaudio=TRANSLATE(RIGHT(mmini.a, LENGTH(mmini.a)-thePos)," ",",") /* There may be several entries */
+		return
+	END
+	a=a+1
+	IF a>mmini.0 THEN return
+END
+return
+
+parseWavedevice:
+
+theDevice='['ARG(1)']'
+DO a=1 to mmini.0
+	if ABBREV(TRANSLATE(mmini.a), TRANSLATE(theDevice))=1 THEN DO
+		/* Device section found */
+		a=a+1
+		DO WHILE LEFT(mmini.a,1)\='['
+			IF ABBREV(TRANSLATE(mmini.a),"EXTNAMES")=1 THEN DO
+				thePos=POS("=",mmini.a)
+				if thePos=0 then return
+				ext=SUBWORD(TRANSLATE(RIGHT(mmini.a, LENGTH(mmini.a)-thePos)," ",","),2)
+				return ext
+			END
+			a=a+1
+			IF a>mmini.0 THEN return ""
+		END
+	END
+END
+return ""
+
Index: /tags/CWMM-0.3.0_GA/classes/c/c_audio/convert.c
===================================================================
--- /tags/CWMM-0.3.0_GA/classes/c/c_audio/convert.c	(revision 213)
+++ /tags/CWMM-0.3.0_GA/classes/c/c_audio/convert.c	(revision 213)
@@ -0,0 +1,131 @@
+/*
+ * (C) Chris Wohlgemuth 2002-2003
+ *
+ */
+/*
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; see the file COPYING.  If not, write to
+ * the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
+ */          
+/*
+ * If you need another license for your project/product (commercial,
+ * noncommercial, whatever) contact me at
+ * 
+ * http://www.os2world.com/cdwriting
+ * http://www.geocities.com/SiliconValley/Sector/5785/
+ *
+ */
+
+#define INCL_DOS
+#define INCL_DOSERRORS
+#define INCL_DOSQUEUES   /* Queue values */
+#define INCL_OS2MM
+#define INCL_MMIOOS2
+
+#include <os2.h>
+#include <os2me.h>
+#include <sys/types.h>
+#include <sys/wait.h>
+#include <process.h>
+#include <stdio.h>
+#include <string.h>
+#include <stdlib.h>
+
+
+char buffer[500000]={0};
+
+int main(int argc, char * argv[])
+{
+  HMMIO hmmio, hmmioTarget;
+  MMIOINFO mmioinfo;
+  MMAUDIOHEADER mmAudioHeader,mmAudioHeaderTarget;
+  LONG lBytesRead=0;
+  LONG lBytesWritten=0;
+  char * tracks;
+  ULONG rc;
+  char target[CCHMAXPATH]="r:\\out.wav";
+
+  /* Set stdout to binary */
+  _fsetmode(stdout,"b");
+  fflush(stdout);
+
+  if(argc==1)
+    exit(0);
+
+  tracks=argv[1];
+ 
+  memset(&mmioinfo,0, sizeof(mmioinfo));
+  mmioinfo.ulTranslate = MMIO_TRANSLATEHEADER | MMIO_TRANSLATEDATA;
+  mmioinfo.ulFlags=MMIO_READ|MMIO_DENYNONE;
+  /* open source */
+  if((hmmio=mmioOpen(argv[1], &mmioinfo,MMIO_READ))==NULLHANDLE)
+    {
+      fprintf(stderr,"mmioOpen error with file %s\n", tracks[0]);
+      fprintf(stderr,"DONE");
+      exit(1);
+    }
+  memset(&mmAudioHeader,0,sizeof(MMAUDIOHEADER));
+  rc = mmioGetHeader(hmmio, &mmAudioHeader,sizeof(MMAUDIOHEADER),
+                     &lBytesRead, 0, 0);
+  if(rc!=MMIO_SUCCESS) {
+    mmioClose(hmmio, 0);
+    fprintf(stderr,"mmioGetHeader error!\n");
+    exit(1);
+  }
+  
+  /* open target */
+  memset(&mmioinfo,0, sizeof(mmioinfo));
+  mmioinfo.ulTranslate = MMIO_TRANSLATEHEADER | MMIO_TRANSLATEDATA;
+  //mmioinfo.aulInfo[3] = MMIO_MEDIATYPE_AUDIO;
+  mmioinfo.ulFlags=MMIO_WRITE|MMIO_CREATE;
+  mmioinfo.fccIOProc=mmioStringToFOURCC("WAVE", MMIO_TOUPPER);
+  if((hmmioTarget=mmioOpen(target, &mmioinfo, MMIO_WRITE|MMIO_CREATE))==NULLHANDLE)
+    {
+      char chrError[CCHMAXPATH];
+      rc=mmioGetLastError(hmmioTarget);
+      mciGetErrorString(mmioinfo.ulErrorRet ,chrError, sizeof(chrError));
+      fprintf(stderr,"mmioOpen error with file %s:\n%s\n%d", target, chrError,mmioinfo.ulErrorRet);
+      mmioClose(hmmio,0);
+      exit(1);
+    }
+#if 0
+  memset(&mmAudioHeader,0,sizeof(MMAUDIOHEADER));
+  rc = mmioGetHeader(hmmioTarget, &mmAudioHeaderTarget,sizeof(MMAUDIOHEADER),
+                     &lBytesRead, 0, 0);
+#endif
+  /* Set parameters */
+  rc = mmioSetHeader(hmmioTarget, &mmAudioHeader,sizeof(MMAUDIOHEADER),
+                     &lBytesWritten, 0, 0);
+
+  /* convert */
+  lBytesWritten=0;
+  do{
+    rc=mmioRead(hmmio, buffer, sizeof(buffer));
+    if(rc!=0 && rc!=MMIO_ERROR) {
+      mmioWrite(hmmioTarget, buffer, rc);
+      //      fwrite(buffer, sizeof(char), rc, stdout);
+      lBytesWritten+=rc;
+    }
+  }while(rc!=0 && rc!=MMIO_ERROR /*&& lBytesWritten <1000000*/);
+  if(rc==MMIO_ERROR) {
+    fprintf(stderr,"Error while reading audio data!\n");
+    fprintf(stderr,"DONE");
+  }
+
+  /* close source */
+  mmioClose(hmmio,0);
+  /* close target */
+  mmioClose(hmmioTarget,0);
+  exit(0);
+}
+
Index: /tags/CWMM-0.3.0_GA/classes/c/c_audio/cw_au.c
===================================================================
--- /tags/CWMM-0.3.0_GA/classes/c/c_audio/cw_au.c	(revision 213)
+++ /tags/CWMM-0.3.0_GA/classes/c/c_audio/cw_au.c	(revision 213)
@@ -0,0 +1,155 @@
+/*
+ * (C) Chris Wohlgemuth 2002-2004
+ *
+ */
+/*
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; see the file COPYING.  If not, write to
+ * the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+/*
+ * If you need another license for your project/product contact me at
+ * 
+ * http://www.os2world.com/cdwriting
+ * http://www.geocities.com/SiliconValley/Sector/5785/
+ */
+/*
+ *  This file was generated by the SOM Compiler and Emitter Framework.
+ *  Generated using: 
+ *      SOM Emitter emitctm: 2.42
+ */
+
+#ifndef SOM_Module_cw_au_Source
+#define SOM_Module_cw_au_Source
+#endif
+#define CW_AU_Class_Source
+#define M_CW_AU_Class_Source
+
+#include <os2.h>
+#include "helpid.h"
+#include "cw_au.ih"
+#include "cwaudioinc.h"
+
+extern char chrHelpLibrary[CCHMAXPATH];
+
+HMODULE queryResModuleHandle(void);
+HMODULE queryModuleHandle(void);
+BOOL getMessage(char* text,ULONG ulID, LONG lSizeText, HMODULE hResource,HWND hwnd);
+
+
+/*
+ * SOM_Scope PSZ  SOMLINK cw_auM_wpclsQueryInstanceType(M_CW_AU *somSelf)
+ */
+
+/*
+ * The prototype for cw_auM_wpclsQueryInstanceType was replaced by the following prototype:
+ */
+SOM_Scope PSZ  SOMLINK cw_auM_wpclsQueryInstanceType(M_MM_AU *somSelf)
+{
+    /* M_CW_AUData *somThis = M_CW_AUGetData(somSelf); */
+    M_MM_AUMethodDebug("M_MM_AU","cw_auM_wpclsQueryInstanceType");
+
+    return TYPE__AU;
+    //    return "_AU";
+}
+
+
+/*
+ * SOM_Scope PSZ  SOMLINK cw_auM_wpclsQueryInstanceFilter(M_CW_AU *somSelf)
+ */
+
+/*
+ * The prototype for cw_auM_wpclsQueryInstanceFilter was replaced by the following prototype:
+ */
+SOM_Scope PSZ  SOMLINK cw_auM_wpclsQueryInstanceFilter(M_MM_AU *somSelf)
+{
+    /* M_CW_AUData *somThis = M_CW_AUGetData(somSelf); */
+    M_MM_AUMethodDebug("M_MM_AU","cw_auM_wpclsQueryInstanceFilter");
+
+    return "*._AU";
+}
+
+
+/*
+ * SOM_Scope BOOL  SOMLINK cw_auM_wpclsQueryDefaultHelp(M_CW_AU *somSelf, 
+ *                                                      PULONG pHelpPanelId, 
+ *                                                      PSZ pszHelpLibrary)
+ */
+
+/*
+ * The prototype for cw_auM_wpclsQueryDefaultHelp was replaced by the following prototype:
+ */
+SOM_Scope BOOL  SOMLINK cw_auM_wpclsQueryDefaultHelp(M_MM_AU *somSelf, 
+                                                     PULONG pHelpPanelId, 
+                                                     PSZ pszHelpLibrary)
+{
+    /* M_CW_AUData *somThis = M_CW_AUGetData(somSelf); */
+    M_MM_AUMethodDebug("M_MM_AU","cw_auM_wpclsQueryDefaultHelp");
+
+    if(pHelpPanelId)
+      *pHelpPanelId=_AUFILE_HELP_PANEL;
+    if(pszHelpLibrary)
+      strncpy(pszHelpLibrary, chrHelpLibrary, CCHMAXPATH);
+    return TRUE; 
+}
+
+
+/*
+ * SOM_Scope PSZ  SOMLINK cw_auM_wpclsQueryTitle(M_CW_AU *somSelf)
+ */
+
+/*
+ * The prototype for cw_auM_wpclsQueryTitle was replaced by the following prototype:
+ */
+SOM_Scope PSZ  SOMLINK cw_auM_wpclsQueryTitle(M_MM_AU *somSelf)
+{
+  static char chrTitle[20]={0};
+    /* M_CW_AUData *somThis = M_CW_AUGetData(somSelf); */
+    M_MM_AUMethodDebug("M_MM_AU","cw_auM_wpclsQueryTitle");
+
+    if(chrTitle[0]==0)
+      if(!getMessage(chrTitle, IDSTR__AUTITLE, sizeof(chrTitle), queryResModuleHandle(), HWND_DESKTOP))
+        strcpy(chrTitle, CLSTITLE__AU);
+
+    return chrTitle;
+}
+
+
+/*
+ * SOM_Scope ULONG  SOMLINK cw_auM_wpclsQueryIconData(M_CW_AU *somSelf, 
+ *                                                    PICONINFO pIconInfo)
+ */
+
+/*
+ * The prototype for cw_auM_wpclsQueryIconData was replaced by the following prototype:
+ */
+SOM_Scope ULONG  SOMLINK cw_auM_wpclsQueryIconData(M_MM_AU *somSelf, 
+                                                   PICONINFO pIconInfo)
+{
+  HMODULE hmod;
+    /* M_CW_AUData *somThis = M_CW_AUGetData(somSelf); */
+    M_MM_AUMethodDebug("M_MM_AU","cw_auM_wpclsQueryIconData");
+
+    hmod=queryModuleHandle();
+    if(!hmod)
+      return M_MM_AU_parent_M_MMAudio_wpclsQueryIconData(somSelf, pIconInfo);
+
+	if (pIconInfo)   {
+      pIconInfo->fFormat = ICON_RESOURCE;
+      pIconInfo->hmod    = hmod;
+      pIconInfo->resid   = ID_ICON_AUFILE;
+	} /* endif */
+
+	return ( sizeof(ICONINFO) );
+}
+
Index: /tags/CWMM-0.3.0_GA/classes/c/c_audio/cwaif.c
===================================================================
--- /tags/CWMM-0.3.0_GA/classes/c/c_audio/cwaif.c	(revision 213)
+++ /tags/CWMM-0.3.0_GA/classes/c/c_audio/cwaif.c	(revision 213)
@@ -0,0 +1,161 @@
+/*
+ * (C) Chris Wohlgemuth 2002-2004
+ *
+ */
+/*
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; see the file COPYING.  If not, write to
+ * the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+/*
+ * If you need another license for your project/product (commercial,
+ * noncommercial, whatever) contact me at
+ * 
+ * http://www.os2world.com/cdwriting
+ * http://www.geocities.com/SiliconValley/Sector/5785/
+ *
+ */
+/*
+ *  This file was generated by the SOM Compiler and Emitter Framework.
+ *  Generated using: 
+ *      SOM Emitter emitctm: 2.42
+ */
+
+#ifndef SOM_Module_cwaif_Source
+#define SOM_Module_cwaif_Source
+#endif
+#define CWAIF_Class_Source
+#define M_CWAIF_Class_Source
+
+#include <os2.h>
+#include "helpid.h"
+#include "cwaif.ih"
+#include "cwaudioinc.h"
+
+extern char chrHelpLibrary[CCHMAXPATH];
+
+HMODULE queryModuleHandle(void);
+HMODULE queryResModuleHandle(void);
+BOOL getMessage(char* text,ULONG ulID, LONG lSizeText, HMODULE hResource,HWND hwnd);
+
+
+/*
+ * SOM_Scope PSZ  SOMLINK cwaifM_wpclsQueryInstanceType(M_CWAIF *somSelf)
+ */
+
+/*
+ * The prototype for cwaifM_wpclsQueryInstanceType was replaced by the following prototype:
+ */
+SOM_Scope PSZ  SOMLINK cwaifM_wpclsQueryInstanceType(M_MMAIF *somSelf)
+{
+    /* M_CWAIFData *somThis = M_CWAIFGetData(somSelf); */
+    M_MMAIFMethodDebug("M_MMAIF","cwaifM_wpclsQueryInstanceType");
+
+    return TYPE_AIF;
+    //    return "AIF";
+}
+
+
+/*
+ * SOM_Scope PSZ  SOMLINK cwaifM_wpclsQueryInstanceFilter(M_CWAIF *somSelf)
+ */
+
+/*
+ * The prototype for cwaifM_wpclsQueryInstanceFilter was replaced by the following prototype:
+ */
+SOM_Scope PSZ  SOMLINK cwaifM_wpclsQueryInstanceFilter(M_MMAIF *somSelf)
+{
+    /* M_CWAIFData *somThis = M_CWAIFGetData(somSelf); */
+    M_MMAIFMethodDebug("M_MMAIF","cwaifM_wpclsQueryInstanceFilter");
+
+    return "*.AIF";
+}
+
+
+/*
+ * SOM_Scope BOOL  SOMLINK cwaifM_wpclsQueryDefaultHelp(M_CWAIF *somSelf, 
+ *                                                      PULONG pHelpPanelId, 
+ *                                                      PSZ pszHelpLibrary)
+ */
+
+/*
+ * The prototype for cwaifM_wpclsQueryDefaultHelp was replaced by the following prototype:
+ */
+SOM_Scope BOOL  SOMLINK cwaifM_wpclsQueryDefaultHelp(M_MMAIF *somSelf, 
+                                                     PULONG pHelpPanelId, 
+                                                     PSZ pszHelpLibrary)
+{
+    /* M_CWAIFData *somThis = M_CWAIFGetData(somSelf); */
+    M_MMAIFMethodDebug("M_MMAIF","cwaifM_wpclsQueryDefaultHelp");
+
+    if(pHelpPanelId)
+      *pHelpPanelId=AIFFILE_HELP_PANEL;
+    if(pszHelpLibrary)
+      strncpy(pszHelpLibrary, chrHelpLibrary, CCHMAXPATH);
+    return TRUE; 
+
+    /*    return (M_CWAIF_parent_M_CWAudio_wpclsQueryDefaultHelp(somSelf, 
+                                                           pHelpPanelId, 
+                                                           pszHelpLibrary));*/
+}
+
+
+/*
+ * SOM_Scope PSZ  SOMLINK cwaifM_wpclsQueryTitle(M_CWAIF *somSelf)
+ */
+
+/*
+ * The prototype for cwaifM_wpclsQueryTitle was replaced by the following prototype:
+ */
+SOM_Scope PSZ  SOMLINK cwaifM_wpclsQueryTitle(M_MMAIF *somSelf)
+{
+  static char chrTitle[20]={0};
+    /* M_CWAIFData *somThis = M_CWAIFGetData(somSelf); */
+    M_MMAIFMethodDebug("M_MMAIF","cwaifM_wpclsQueryTitle");
+    if(chrTitle[0]==0)
+      if(!getMessage(chrTitle, IDSTR_AIFTITLE, sizeof(chrTitle), queryResModuleHandle(), HWND_DESKTOP))
+        strcpy(chrTitle, CLSTITLE_AIF);
+
+    return chrTitle;
+}
+
+
+/*
+ * SOM_Scope ULONG  SOMLINK cwaifM_wpclsQueryIconData(M_CWAIF *somSelf, 
+ *                                                    PICONINFO pIconInfo)
+ */
+
+/*
+ * The prototype for cwaifM_wpclsQueryIconData was replaced by the following prototype:
+ */
+SOM_Scope ULONG  SOMLINK cwaifM_wpclsQueryIconData(M_MMAIF *somSelf, 
+                                                   PICONINFO pIconInfo)
+{
+  HMODULE hmod;
+    /* M_CWAIFData *somThis = M_CWAIFGetData(somSelf); */
+    M_MMAIFMethodDebug("M_MMAIF","cwaifM_wpclsQueryIconData");
+
+    hmod=queryModuleHandle();
+    if(!hmod)
+      return M_MMAIF_parent_M_MMAudio_wpclsQueryIconData(somSelf, pIconInfo);
+
+	if (pIconInfo)   {
+      pIconInfo->fFormat = ICON_RESOURCE;
+      pIconInfo->hmod    = hmod;
+      pIconInfo->resid   = ID_ICONVOCFILE;
+	} /* endif */
+
+	return ( sizeof(ICONINFO) );
+
+}
+
Index: /tags/CWMM-0.3.0_GA/classes/c/c_audio/cwastream.c
===================================================================
--- /tags/CWMM-0.3.0_GA/classes/c/c_audio/cwastream.c	(revision 213)
+++ /tags/CWMM-0.3.0_GA/classes/c/c_audio/cwastream.c	(revision 213)
@@ -0,0 +1,598 @@
+/*
+ * (C) Chris Wohlgemuth 2002-2004
+ *
+ */
+/*
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; see the file COPYING.  If not, write to
+ * the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+/*
+ * If you need another license for your project/product (commercial,
+ * noncommercial, whatever) contact me at
+ * 
+ * http://www.os2world.com/cdwriting
+ * http://www.geocities.com/SiliconValley/Sector/5785/
+ *
+ */
+/*
+ *  This file was generated by the SOM Compiler and Emitter Framework.
+ *  Generated using: 
+ *      SOM Emitter emitctm: 2.42
+ */
+
+#ifndef SOM_Module_cwastream_Source
+#define SOM_Module_cwastream_Source
+#endif
+#define CWAudioStream_Class_Source
+#define M_CWAudioStream_Class_Source
+
+#define INCL_PM
+#define INCL_MCIOS2
+#include <os2.h>
+#include <stdio.h>
+#include <io.h>
+#include <fcntl.h>
+#include <sys\stat.h>
+#include "os2me.h"
+#include "cwastream.ih"
+#include "cwaudioinc.h"
+#include "helpid.h"
+
+#if 0
+#define  _PMPRINTF_
+#include "PMPRINTF.H"
+#endif
+
+HMODULE queryResModuleHandle(void);
+HMODULE queryModuleHandle(void);
+BOOL getMessage(char* text,ULONG ulID, LONG lSizeText, HMODULE hResource,HWND hwnd);
+void SysWriteToTrapLog(const char* chrFormat, ...);
+BOOL cwMoveNotebookButtonsWarp4(HWND hwndDlg, USHORT usID, USHORT usDelta);
+
+PSZ _queryMp3HelpLibraryName(void); /* Get help library name for introduced classes */
+
+static BOOL _getUrlFromFile(WPFileSystem * wpFS, char *chrBuf, ULONG ulBufSize)
+{
+  ULONG ulSize;
+  char* pChr;
+  FILE* fStream;
+
+  for(;;)
+    {
+      ulSize=ulBufSize;
+      if(!_wpQueryRealName(wpFS, chrBuf, &ulSize, TRUE))
+        break;
+      
+      if((fStream=fopen( chrBuf, "r"))==NULLHANDLE)
+        break;
+      
+      if(!fgets(chrBuf, ulBufSize, fStream)) {
+        // Fixme double deallocation is this missing a break;
+        //fclose(fStream);
+        sprintf(chrBuf, DEFAULT_AUDIOSTREAM_SERVER);
+      }
+      fclose(fStream);
+      if((pChr=strchr(chrBuf, '\n'))!=NULLHANDLE)
+        *pChr=0;
+      //      HlpWriteToTrapLog("%s\n", chrBuf);
+      return TRUE;
+    }
+  return FALSE;
+}
+
+static BOOL _saveUrlToFile(WPFileSystem * wpFS, char *chrUrl)
+{
+  ULONG ulSize;
+  int fHandle;
+  char chrPath[CCHMAXPATH];
+
+  for(;;)
+    {
+      ulSize=sizeof(chrPath);
+      if(!_wpQueryRealName(wpFS, chrPath, &ulSize, TRUE))
+        break;
+
+      if((fHandle=open(chrPath, O_TEXT | O_WRONLY, S_IWRITE)) == -1)
+        break;
+
+      _chsize(fHandle, 0);
+
+      if(-1 == write(fHandle , chrUrl,  strlen(chrUrl)))
+        break;
+
+      close(fHandle);
+      return TRUE;
+    }
+  close(fHandle);
+  return FALSE;
+}
+
+/************************************************************/
+/*                                                          */
+/*                                                          */
+/*                                                          */
+/************************************************************/
+MRESULT EXPENTRY playStreamProc(HWND hwnd, ULONG msg, MPARAM mp1, MPARAM mp2)
+{
+
+  switch (msg)
+    {
+    case WM_APPTERMINATENOTIFY:
+      {
+        MMAudio * thisPtr;
+        OPENPARAMS * pParams;
+
+        /* Depending on mp1 the parameter in mp2 is either a pointer
+           to OPENPARAMS (mp1==ACKEY_START) or the object pointer (mp1==ACK_STOP) */
+        if(ACKEY_START==LONGFROMMP(mp1)) {
+          pParams=PVOIDFROMMP(mp2);/* Get parameter block */
+          if(!pParams)
+            {
+              WinPostMsg(hwnd,WM_QUIT,0,0);
+              return MRFALSE;
+            }
+          WinSetWindowULong(hwnd, QWL_USER, (ULONG)pParams);        
+          thisPtr=pParams->wpObject;
+        }
+        else
+          thisPtr=(MMAudio*)PVOIDFROMMP(mp2);
+
+        if(somIsObj(thisPtr)) {
+          switch(LONGFROMMP(mp1))
+            {
+              case ACKEY_START:
+                {
+                  unsigned char chrCommand[CCHMAXPATH*2];
+                  unsigned char chrURL[CCHMAXPATH];
+                  char retMsg[20];
+                  APIRET rc;
+
+                  _cwmmSetRecordTitles(thisPtr, "Connecting to server...", TRUE);
+
+                  /* Read URL from file */
+                  if(!_getUrlFromFile(thisPtr, chrURL, sizeof(chrURL)))
+                    {
+                      WinPostMsg(hwnd,WM_QUIT,0,0);
+                      return MRFALSE;
+                    };
+
+                  /* Try to open stream. A usable storage proc is not yet available but maybe in the future... */
+                  sprintf(chrCommand,"open stream:%s type WAVEAUDIO alias wave%p SHAREABLE wait", chrURL, thisPtr);
+                  rc = mciSendString( chrCommand, retMsg, sizeof(retMsg), hwnd, 0);
+                  if((rc & 0x0000ffff)!=MCIERR_SUCCESS) {
+                    /* No success so try storage procedure from plugin pack. */
+                  
+                    sprintf(chrCommand,"open ipipe:%s type WAVEAUDIO alias wave%p SHAREABLE wait", chrURL, thisPtr);
+                    rc = mciSendString( chrCommand, retMsg, sizeof(retMsg), hwnd, 0);
+                    if((rc & 0x0000ffff)!=MCIERR_SUCCESS) {
+                      _cwmmSetRecordTitles(thisPtr, "Can't connect to server!", TRUE);
+                      WinStartTimer(WinQueryAnchorBlock(hwnd), hwnd, 2, 4000);
+                      return MRFALSE;
+                    }
+
+                  }
+
+                  /* Set time format */
+                  sprintf(chrCommand,"SET wave%p TIME FORMAT MILLISECONDS wait", thisPtr);
+                  rc = mciSendString(chrCommand, retMsg, sizeof(retMsg), 0, 0);
+                  if((rc & 0x0000ffff)!=MCIERR_SUCCESS) {
+                    WinPostMsg(hwnd, WM_APPTERMINATENOTIFY, MPFROMLONG(ACKEY_STOP), MPFROMP(thisPtr));
+                    return MRFALSE;
+                  }
+
+                  sprintf(chrCommand,"play wave%p ", thisPtr);
+                  rc = mciSendString(chrCommand, retMsg, sizeof(retMsg), 0, 0);
+                  if((rc & 0x0000ffff)!=MCIERR_SUCCESS) {
+                    WinPostMsg(hwnd, WM_APPTERMINATENOTIFY, MPFROMLONG(ACKEY_STOP), MPFROMP(thisPtr));
+                    return MRFALSE;
+                  }
+
+                  WinStartTimer(WinQueryAnchorBlock(hwnd), hwnd, 1, 1000);
+                  _cwmmSetRecordTitles(thisPtr, "00:00", TRUE);
+
+                  break;
+                }
+            case ACKEY_STOP:
+              {
+                /* Stop playing */
+                unsigned char chrCommand[CCHMAXPATH];
+                char retMsg[20];
+
+                WinStopTimer(WinQueryAnchorBlock(hwnd),hwnd,1 );
+
+                sprintf(chrCommand,"stop wave%p wait", thisPtr);
+                mciSendString(chrCommand, retMsg, sizeof(retMsg), 0, 0);
+                
+                sprintf(chrCommand,"close wave%p wait", thisPtr);
+                mciSendString(chrCommand, retMsg, sizeof(retMsg), 0, 0);
+                
+                WinPostMsg(hwnd,WM_QUIT,0,0);
+              }
+            default:
+              break;
+            }
+        }/* if(thisPtr) */
+        return MRFALSE;
+      }
+    case WM_TIMER:
+      switch(SHORT1FROMMP(mp1))
+        {
+        case 1:
+          {
+            MMAudio * thisPtr;
+            OPENPARAMS * pParams;
+
+
+            pParams=(OPENPARAMS*)WinQueryWindowULong(hwnd, QWL_USER);
+            thisPtr=pParams->wpObject;
+            
+            if(somIsObj(thisPtr)) {
+              char retMsg[20];
+              unsigned char chrCommand[CCHMAXPATH];
+              APIRET rc;
+              ULONG ulCur;
+              
+              /* Get current play position */
+              sprintf(chrCommand,"STATUS wave%p POSITION WAIT", thisPtr);
+              rc = mciSendString(chrCommand, retMsg, sizeof(retMsg), 0, 0);
+              if((rc & 0x0000ffff)!=MCIERR_SUCCESS) {
+                return MRFALSE;
+              }
+              
+              ulCur=atoi(retMsg)/1000;
+              sprintf(chrCommand, "%02d:%02d", ulCur/60, ulCur%60);
+              
+              /* Set new time in icon title */
+              _cwmmSetRecordTitles(thisPtr, chrCommand, TRUE);
+
+              sprintf(chrCommand,"STATUS wave%p MODE WAIT", thisPtr);
+              rc = mciSendString(chrCommand, retMsg, sizeof(retMsg), 0, 0);
+              if((rc & 0x0000ffff)!=MCIERR_SUCCESS) {
+                WinPostMsg(hwnd, WM_APPTERMINATENOTIFY, MPFROMLONG(ACKEY_STOP), MPFROMP(thisPtr));
+                return MRFALSE;
+              }
+              if(stricmp(retMsg, "playing")) {
+                /* Not playing anymore. Try to reconnect */
+                WinPostMsg(hwnd, WM_APPTERMINATENOTIFY, MPFROMLONG(ACKEY_STOP), MPFROMP(thisPtr));
+                WinPostMsg(hwnd, WM_APPTERMINATENOTIFY, MPFROMLONG(ACKEY_START), MPFROMP(thisPtr));
+              }
+              return MRFALSE;
+            }
+          }
+        case 2:
+          WinStopTimer(WinQueryAnchorBlock(hwnd),hwnd, 2);
+          WinPostMsg(hwnd,WM_QUIT,0,0);
+          return MRFALSE;
+        default:
+          break;
+        }
+      break;
+    default:
+      break;
+    }
+  return WinDefWindowProc( hwnd, msg, mp1, mp2);
+}
+
+
+MRESULT EXPENTRY streamUrlDlgProc(HWND hwnd, ULONG msg, MPARAM mp1, MPARAM mp2)
+{
+  MMAudioStream *cwAudioStream;
+
+  switch(msg) 
+    {
+    case WM_INITDLG :
+      {
+        char chrURL[CCHMAXPATH];
+        cwAudioStream=(MMAudio*)PVOIDFROMMP(mp2);
+        WinSetWindowULong(WinWindowFromID(hwnd,IDEF_URL),
+                          QWL_USER,(ULONG)cwAudioStream);//Save object ptr.
+
+        WinSendMsg(WinWindowFromID(hwnd,IDEF_URL),EM_SETTEXTLIMIT,MPFROMSHORT((SHORT)sizeof(chrURL)),0);
+
+        /* Move default buttons on Warp 4 */
+        cwMoveNotebookButtonsWarp4(hwnd, IDPB_STREAMHELP, 15);
+
+        if(somIsObj(cwAudioStream)) {
+       
+          /* CWAudioStreamData *somThis = CWAudioStreamGetData(cwAudioStream); */
+          
+          /* Move default buttons on Warp 4 */
+          // cwMoveNotebookButtonsWarp4(hwnd, IDPB_ID3HELP, 15);
+          
+          if(_getUrlFromFile(cwAudioStream, chrURL, sizeof(chrURL)))
+            {
+              WinSetWindowText(WinWindowFromID(hwnd,IDEF_URL),chrURL);
+            }
+          WinSendMsg(WinWindowFromID(hwnd,IDEF_URL),EM_SETTEXTLIMIT,MPFROMSHORT((SHORT)CCHMAXPATH),0);
+        }
+
+        WinSetWindowULong(WinQueryWindow(hwnd, QW_PARENT), QWL_HWNDFOCUSSAVE, hwnd);
+        return (MRESULT)TRUE;
+      }
+      /* This prevents switching the notebook page behind the open folder */
+    case WM_WINDOWPOSCHANGED:
+      {
+        MRESULT mr;
+        
+        if(WinQueryFocus(HWND_DESKTOP)!=
+           WinQueryWindow(WinQueryWindow(hwnd, QW_PARENT), QW_PARENT)) {
+          mp2=MPFROMLONG(LONGFROMMP(mp2)|0x80000);/*AWP_ACTIVATE 0x00080000L*/
+          mr=WinDefDlgProc(hwnd, msg, mp1, mp2);
+          return mr;  
+        }
+        break;
+      }
+    case WM_FOCUSCHANGE:
+      {
+        if(!SHORT1FROMMP(mp2)) {
+          if(HWNDFROMMP(mp1)==hwnd) {
+            MRESULT mr;
+
+            mr=WinDefDlgProc(hwnd, msg, mp1, mp2);
+            WinSendMsg(WinQueryWindow(WinQueryWindow(hwnd, QW_PARENT), QW_PARENT), WM_SETFOCUS, MPFROMHWND(hwnd),
+                       (MPARAM)TRUE);
+            return mr;
+          }
+        }
+        break;
+      }
+    case WM_DESTROY:
+      /* The notebook closes and gets destroyed */
+      cwAudioStream=(MMAudioStream*) WinQueryWindowULong(WinWindowFromID(hwnd, IDEF_URL), QWL_USER);
+      if(somIsObj(cwAudioStream)) {
+        char fName[CCHMAXPATH];
+
+        WinQueryWindowText(WinWindowFromID(hwnd,IDEF_URL), sizeof(fName), fName);
+        _saveUrlToFile(cwAudioStream, fName);
+      }
+
+      /* Set focus to desktop to prevent PM freeze */
+      WinSetFocus(HWND_DESKTOP, HWND_DESKTOP);
+      break;
+#if 0
+  case WM_COMMAND:
+    cwAudio=(CWAudio*) WinQueryWindowULong(WinWindowFromID(hwnd, IDEF_ID3NAME),QWL_USER);
+    if(somIsObj(cwAudio)) {
+      char fName[100];
+
+      switch(SHORT1FROMMP(mp1))
+        {
+        case IDPB_CANCEL:
+          break;
+        default:
+          break;
+        }
+    }
+    return (MRESULT) TRUE;
+#endif
+  default:
+    break;
+  }
+  return WinDefDlgProc(hwnd, msg, mp1, mp2);
+}
+
+/*
+ * The prototype for cwastream_cwmmAddURLPage was replaced by the following prototype:
+ */
+SOM_Scope ULONG  SOMLINK cwastream_cwmmAddURLPage(MMAudioStream *somSelf, 
+                                                  HWND hwndNotebook)
+{
+  PAGEINFO pageinfo;
+  char pageName[100];
+
+    /* CWAudioStreamData *somThis = CWAudioStreamGetData(somSelf); */
+    MMAudioStreamMethodDebug("MMAudioStream","cwastream_cwmmAddURLPage");
+
+  //Clear the pageinfo structure
+  memset((PCH)&pageinfo, 0, sizeof(PAGEINFO));
+  //Fill the pageinfo structure
+  pageinfo.cb = sizeof(PAGEINFO);
+  pageinfo.hwndPage = NULLHANDLE;
+  pageinfo.usPageStyleFlags = BKA_MAJOR | BKA_STATUSTEXTON;
+  pageinfo.usPageInsertFlags = BKA_FIRST;
+  //We want page numbers
+  pageinfo.usSettingsFlags = SETTINGS_PAGE_NUMBERS;
+  //The dialog procedure for this page
+  pageinfo.pfnwp = streamUrlDlgProc;
+  //The resource DLL
+  pageinfo.resid = queryResModuleHandle();
+  //The ID of the dialog template
+  pageinfo.dlgid = IDDLG_STREAMURLPAGE;
+  //We need a pointer to our WPS-object in the dialog procedure
+  //to call class functions
+  pageinfo.pCreateParams = somSelf;
+  //The ID of the help panel for this page
+  pageinfo.idDefaultHelpPanel = AUDIOSTREAM_SETTINGS_PANEL;
+  //Tell the WPS the help library name
+  pageinfo.pszHelpLibraryName = _queryMp3HelpLibraryName();
+  //We have a major tab so we need a name
+  if(!getMessage(pageName, IDSTR_STREAMURLPAGENAME, sizeof(pageName),  queryResModuleHandle(), hwndNotebook))
+    strcpy(pageName, "Stream ~URL");
+  pageinfo.pszName = pageName;
+  //Insert the page into the settings notebook
+
+  return _wpInsertSettingsPage(somSelf,hwndNotebook,&pageinfo);
+}
+
+
+SOM_Scope void  SOMLINK cwastream_wpCopiedFromTemplate(MMAudioStream *somSelf)
+{
+    /* MMAudioStreamData *somThis = MMAudioStreamGetData(somSelf); */
+    MMAudioStreamMethodDebug("MMAudioStream","cwastream_wpCopiedFromTemplate");
+
+    MMAudioStream_parent_MMAudio_wpCopiedFromTemplate(somSelf);
+
+    _wpViewObject(somSelf, NULLHANDLE, OPEN_SETTINGS,0);
+}
+
+/*
+ * The prototype for cwastream_wpModifyPopupMenu was replaced by the following prototype:
+ */
+SOM_Scope BOOL  SOMLINK cwastream_wpModifyPopupMenu(MMAudioStream *somSelf, 
+                                                    HWND hwndMenu, 
+                                                    HWND hwndCnr, 
+                                                    ULONG iPosition)
+{
+  BOOL bRC;
+    /* CWAudioStreamData *somThis = CWAudioStreamGetData(somSelf); */
+    MMAudioStreamMethodDebug("MMAudioStream","cwastream_wpModifyPopupMenu");
+
+    bRC=(MMAudioStream_parent_MMAudio_wpModifyPopupMenu(somSelf, 
+                                                        hwndMenu, 
+                                                        hwndCnr, 
+                                                        iPosition));
+    WinSendMsg(hwndMenu,MM_DELETEITEM,MPFROM2SHORT( ID_MENU_PLAYER, TRUE),
+               0L);
+    WinSendMsg(hwndMenu,MM_DELETEITEM,MPFROM2SHORT( ID_MENU_EDITOR, TRUE),
+               0L);
+    WinSendMsg(hwndMenu,MM_DELETEITEM,MPFROM2SHORT( ID_MENU_CONVERT, FALSE),
+               0L);
+
+    return bRC;
+}
+
+/*
+ * The prototype for cwastream_wpAddSettingsPages was replaced by the following prototype:
+ */
+SOM_Scope BOOL  SOMLINK cwastream_wpAddSettingsPages(MMAudioStream *somSelf, 
+                                                     HWND hwndNotebook)
+{
+  BOOL bRc;
+    /* CWAudioStreamData *somThis = CWAudioStreamGetData(somSelf); */
+    MMAudioStreamMethodDebug("MMAudioStream","cwastream_wpAddSettingsPages");
+
+    bRc=MMAudioStream_parent_MMAudio_wpAddSettingsPages(somSelf, 
+                                                              hwndNotebook);
+    _cwmmAddURLPage(somSelf,  hwndNotebook);
+    return bRc;
+}
+
+/*
+ * The prototype for cwastream_wpInitData was replaced by the following prototype:
+ */
+SOM_Scope void  SOMLINK cwastream_wpInitData(MMAudioStream *somSelf)
+{
+    /* CWAudioStreamData *somThis = CWAudioStreamGetData(somSelf); */
+    MMAudioStreamMethodDebug("MMAudioStream","cwastream_wpInitData");
+
+    MMAudioStream_parent_MMAudio_wpInitData(somSelf);
+    _cwmmSetObjWindowProc(somSelf, &playStreamProc);
+}
+
+SOM_Scope ULONG  SOMLINK cwastream_cwmmAddAudioInformationPage(MMAudioStream *somSelf, 
+                                                               HWND hwndNotebook)
+{
+    /* MMAudioStreamData *somThis = MMAudioStreamGetData(somSelf); */
+    MMAudioStreamMethodDebug("MMAudioStream","cwastream_cwmmAddAudioInformationPage");
+
+    return SETTINGS_PAGE_REMOVED;
+    //    return (MMAudioStream_parent_MMAudio_cwmmAddAudioInformationPage(somSelf, 
+    //                                                               hwndNotebook));
+}
+
+/*
+ * The prototype for cwastream_cwmmAddTrackNamePage was replaced by the following prototype:
+ */
+SOM_Scope ULONG  SOMLINK cwastream_cwmmAddTrackNamePage(MMAudioStream *somSelf, 
+                                                        HWND hwndNotebook)
+{
+    /* CWAudioStreamData *somThis = CWAudioStreamGetData(somSelf); */
+    MMAudioStreamMethodDebug("MMAudioStream","cwastream_cwmmAddTrackNamePage");
+
+    return SETTINGS_PAGE_REMOVED;
+}
+
+/*
+ * The prototype for cwastreamM_wpclsQueryInstanceType was replaced by the following prototype:
+ */
+SOM_Scope PSZ  SOMLINK cwastreamM_wpclsQueryInstanceType(M_MMAudioStream *somSelf)
+{
+  // static char chrTitle[20]={0};
+    /* M_CWAudioStreamData *somThis = M_CWAudioStreamGetData(somSelf); */
+    M_MMAudioStreamMethodDebug("M_MMAudioStream","cwastreamM_wpclsQueryInstanceType");
+#if 0
+    if(chrTitle[0]==0)
+      if(!getMessage(chrTitle, IDSTR_AUDIOSTREAMTITLE, sizeof(chrTitle), queryModuleHandle(), HWND_DESKTOP))
+        strcpy(chrTitle,"Audio-Stream");
+    return chrTitle;
+#endif
+    return TYPE_AUDIOSTREAM;
+}
+
+/*
+ * The prototype for cwastreamM_wpclsQueryDefaultHelp was replaced by the following prototype:
+ */
+SOM_Scope BOOL  SOMLINK cwastreamM_wpclsQueryDefaultHelp(M_MMAudioStream *somSelf, 
+                                                         PULONG pHelpPanelId, 
+                                                         PSZ pszHelpLibrary)
+{
+  PSZ pszHelpLibName;
+    /* M_CWAudioStreamData *somThis = M_CWAudioStreamGetData(somSelf); */
+    M_MMAudioStreamMethodDebug("M_MMAudioStream","cwastreamM_wpclsQueryDefaultHelp");
+
+    if((pszHelpLibName=_queryMp3HelpLibraryName())!=NULLHANDLE)
+      {
+        if(pHelpPanelId)
+          *pHelpPanelId=AUDIOSTREAM_HELP_PANEL;
+        if(pszHelpLibrary)
+          strncpy(pszHelpLibrary, pszHelpLibName, CCHMAXPATH);
+        return TRUE; 
+      }
+
+    return (M_MMAudioStream_parent_M_MMAudio_wpclsQueryDefaultHelp(somSelf, 
+                                                                   pHelpPanelId, 
+                                                                   pszHelpLibrary));
+}
+
+/*
+ * The prototype for cwastreamM_wpclsQueryTitle was replaced by the following prototype:
+ */
+SOM_Scope PSZ  SOMLINK cwastreamM_wpclsQueryTitle(M_MMAudioStream *somSelf)
+{
+  static char chrTitle[20]={0};
+
+    /* M_CWAudioStreamData *somThis = M_CWAudioStreamGetData(somSelf); */
+    M_MMAudioStreamMethodDebug("M_MMAudioStream","cwastreamM_wpclsQueryTitle");
+
+    if(chrTitle[0]==0)
+      if(!getMessage(chrTitle, IDSTR_AUDIOSTREAMTITLE, sizeof(chrTitle), queryResModuleHandle(), HWND_DESKTOP))
+        strcpy(chrTitle, CLSTITLE_AUDIOSTREAM);
+
+    return chrTitle;
+}
+
+/*
+ * The prototype for cwastreamM_wpclsQueryIconData was replaced by the following prototype:
+ */
+SOM_Scope ULONG  SOMLINK cwastreamM_wpclsQueryIconData(M_MMAudioStream *somSelf, 
+                                                       PICONINFO pIconInfo)
+{
+  HMODULE hmod;
+
+    /* M_CWAudioStreamData *somThis = M_CWAudioStreamGetData(somSelf); */
+    M_MMAudioStreamMethodDebug("M_MMAudioStream","cwastreamM_wpclsQueryIconData");
+
+    hmod=queryModuleHandle();
+    if(!hmod)
+      return M_MMAudioStream_parent_M_MMAudio_wpclsQueryIconData(somSelf, pIconInfo);
+
+	if (pIconInfo)   {
+      pIconInfo->fFormat = ICON_RESOURCE;
+      pIconInfo->hmod    = hmod;
+      pIconInfo->resid   = ID_ICONAUDIOSTREAM;
+	} /* endif */
+
+	return ( sizeof(ICONINFO) );
+}
+
Index: /tags/CWMM-0.3.0_GA/classes/c/c_audio/cwau.c
===================================================================
--- /tags/CWMM-0.3.0_GA/classes/c/c_audio/cwau.c	(revision 213)
+++ /tags/CWMM-0.3.0_GA/classes/c/c_audio/cwau.c	(revision 213)
@@ -0,0 +1,155 @@
+/*
+ * (C) Chris Wohlgemuth 2002-2004
+ *
+ */
+/*
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; see the file COPYING.  If not, write to
+ * the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+/*
+ * If you need another license for your project/product contact me at
+ * 
+ * http://www.os2world.com/cdwriting
+ * http://www.geocities.com/SiliconValley/Sector/5785/
+ */
+/*
+ *  This file was generated by the SOM Compiler and Emitter Framework.
+ *  Generated using: 
+ *      SOM Emitter emitctm: 2.42
+ */
+
+#ifndef SOM_Module_cwau_Source
+#define SOM_Module_cwau_Source
+#endif
+#define CWAU_Class_Source
+#define M_CWAU_Class_Source
+
+#include <os2.h>
+#include "helpid.h"
+#include "cwau.ih"
+#include "cwaudioinc.h"
+
+extern char chrHelpLibrary[CCHMAXPATH];
+
+HMODULE queryResModuleHandle(void);
+HMODULE queryModuleHandle(void);
+BOOL getMessage(char* text,ULONG ulID, LONG lSizeText, HMODULE hResource,HWND hwnd);
+
+
+/*
+ * SOM_Scope PSZ  SOMLINK cwauM_wpclsQueryInstanceType(M_CWAU *somSelf)
+ */
+
+/*
+ * The prototype for cwauM_wpclsQueryInstanceType was replaced by the following prototype:
+ */
+SOM_Scope PSZ  SOMLINK cwauM_wpclsQueryInstanceType(M_MMAU *somSelf)
+{
+    /* M_CWAUData *somThis = M_CWAUGetData(somSelf); */
+    M_MMAUMethodDebug("M_MMAU","cwauM_wpclsQueryInstanceType");
+
+    return TYPE_AU;
+    //    return "AU";
+}
+
+
+/*
+ * SOM_Scope PSZ  SOMLINK cwauM_wpclsQueryInstanceFilter(M_CWAU *somSelf)
+ */
+
+/*
+ * The prototype for cwauM_wpclsQueryInstanceFilter was replaced by the following prototype:
+ */
+SOM_Scope PSZ  SOMLINK cwauM_wpclsQueryInstanceFilter(M_MMAU *somSelf)
+{
+    /* M_CWAUData *somThis = M_CWAUGetData(somSelf); */
+    M_MMAUMethodDebug("M_MMAU","cwauM_wpclsQueryInstanceFilter");
+
+    return "*.AU";
+}
+
+
+/*
+ * SOM_Scope BOOL  SOMLINK cwauM_wpclsQueryDefaultHelp(M_CWAU *somSelf, 
+ *                                                     PULONG pHelpPanelId, 
+ *                                                     PSZ pszHelpLibrary)
+ */
+
+/*
+ * The prototype for cwauM_wpclsQueryDefaultHelp was replaced by the following prototype:
+ */
+SOM_Scope BOOL  SOMLINK cwauM_wpclsQueryDefaultHelp(M_MMAU *somSelf, 
+                                                    PULONG pHelpPanelId, 
+                                                    PSZ pszHelpLibrary)
+{
+    /* M_CWAUData *somThis = M_CWAUGetData(somSelf); */
+    M_MMAUMethodDebug("M_MMAU","cwauM_wpclsQueryDefaultHelp");
+
+    if(pHelpPanelId)
+      *pHelpPanelId=AUFILE_HELP_PANEL;
+    if(pszHelpLibrary)
+      strncpy(pszHelpLibrary, chrHelpLibrary, CCHMAXPATH);
+    return TRUE; 
+}
+
+
+/*
+ * SOM_Scope PSZ  SOMLINK cwauM_wpclsQueryTitle(M_CWAU *somSelf)
+ */
+
+/*
+ * The prototype for cwauM_wpclsQueryTitle was replaced by the following prototype:
+ */
+SOM_Scope PSZ  SOMLINK cwauM_wpclsQueryTitle(M_MMAU *somSelf)
+{
+  static char chrTitle[20]={0};
+    /* M_CWAUData *somThis = M_CWAUGetData(somSelf); */
+    M_MMAUMethodDebug("M_MMAU","cwauM_wpclsQueryTitle");
+
+    if(chrTitle[0]==0)
+      if(!getMessage(chrTitle, IDSTR_AUTITLE, sizeof(chrTitle), queryResModuleHandle(), HWND_DESKTOP))
+        strcpy(chrTitle, CLSTITLE_AU);
+
+    return chrTitle;
+}
+
+
+/*
+ * SOM_Scope ULONG  SOMLINK cwauM_wpclsQueryIconData(M_CWAU *somSelf, 
+ *                                                   PICONINFO pIconInfo)
+ */
+
+/*
+ * The prototype for cwauM_wpclsQueryIconData was replaced by the following prototype:
+ */
+SOM_Scope ULONG  SOMLINK cwauM_wpclsQueryIconData(M_MMAU *somSelf, 
+                                                  PICONINFO pIconInfo)
+{
+  HMODULE hmod;
+    /* M_CWAUData *somThis = M_CWAUGetData(somSelf); */
+    M_MMAUMethodDebug("M_MMAU","cwauM_wpclsQueryIconData");
+
+    hmod=queryModuleHandle();
+    if(!hmod)
+      return M_MMAU_parent_M_MMAudio_wpclsQueryIconData(somSelf, pIconInfo);
+
+	if (pIconInfo)   {
+      pIconInfo->fFormat = ICON_RESOURCE;
+      pIconInfo->hmod    = hmod;
+      pIconInfo->resid   = ID_ICONVOCFILE;
+	} /* endif */
+
+	return ( sizeof(ICONINFO) );
+}
+
Index: /tags/CWMM-0.3.0_GA/classes/c/c_audio/cwaudio.c
===================================================================
--- /tags/CWMM-0.3.0_GA/classes/c/c_audio/cwaudio.c	(revision 213)
+++ /tags/CWMM-0.3.0_GA/classes/c/c_audio/cwaudio.c	(revision 213)
@@ -0,0 +1,3998 @@
+
+/*
+ *  This file was generated by the SOM Compiler.
+ *  Generated using:
+ *     SOM incremental update: 2.47
+ */
+
+
+/*
+ * (C) Chris Wohlgemuth 2002-2004
+ *
+ */
+/*
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; see the file COPYING.  If not, write to
+ * the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+/*
+ * If you need another license for your project/product contact me at
+ * 
+ * http://www.os2world.com/cdwriting
+ * http://www.geocities.com/SiliconValley/Sector/5785/
+ */
+
+/*
+ *  This file was generated by the SOM Compiler and Emitter Framework.
+ *  Generated using: 
+ *      SOM Emitter emitctm: 2.42
+ */
+
+#ifndef SOM_Module_cwaudio_Source
+#define SOM_Module_cwaudio_Source
+#endif
+#define CWAudio_Class_Source
+#define M_CWAudio_Class_Source
+
+#define INCL_PM
+#define INCL_DOS
+#define INCL_WINWORKPLACE
+#define INCL_MMIOOS2
+#define INCL_DOSDEVIOCTL
+#define INCL_MCIOS2
+#define  INCL_ERRORS
+
+#include <os2.h>
+#include <stdio.h>
+#include "os2me.h"
+#include "cwmmdataf.h"
+#include "cwaudio.ih"
+#include "except.h"
+#include "cwaudioinc.h"
+#include "cwmp3inc.h" /* */
+#include "cwogginc.h" /* */
+#include <wpdisk.h>
+#include <wpfolder.h>
+
+#include "ea_funcs.h" /* Functions to read and write EA of file system objects */
+#include "som_wps_funcs.h"
+#include "sys_funcs.h"
+
+#if 0
+#define  _PMPRINTF_
+#include "PMPRINTF.H"
+#endif
+/* Redefine function names */
+#define cwGetStringFromEA EARestoreString
+#define cwSaveStringToEA EASaveString
+
+char classDLLPath[CCHMAXPATH]={0};
+char chrHelpLibrary[CCHMAXPATH]={0};
+char chrInstallDir[CCHMAXPATH]={0};
+char chrMMAudioExt[400]={0};/* Array holding the extensions for wpclsQueryInstanceFilter() */
+char resDLLPath[CCHMAXPATH]={0};
+
+static PSZ pszAudioColTitles[NUM_AUDIO_FIELDS]= {"Playtime", "Bitrate", "Samplerate", "Channels", "Bits per sample",
+"Track Name","Artist","Album","Year","Comment","Genre"};
+
+char chrPlayTime[SIZE_TITLE]="";
+char chrBitRate[SIZE_TITLE]=""; /* New with 0.2.7 */
+char chrSampleRate[SIZE_TITLE]="";
+char chrChannels[SIZE_TITLE]="";
+char chrBPS[SIZE_TITLE]="";
+char chrName[SIZE_TITLE]="";
+char chrArtist[SIZE_TITLE]="";
+char chrAlbum[SIZE_TITLE]="";
+char chrYear[SIZE_TITLE]="";
+char chrComment[SIZE_TITLE]="";
+char chrGenre[SIZE_TITLE]="";
+
+static CLASSFIELDINFO cfiFieldInfo[NUM_AUDIO_FIELDS];
+
+extern PMMFORMATINFO g_pmmFormatInfoArray; /* in cwimage.c */
+extern LONG          lNumIOProcs;/* Needed to know how many convert menus we have */
+int iRunningAudioFiles=0;        /* Used to check if there's already an audio file started */
+
+extern char *genreList[];
+extern int iGenreLast;
+
+/* Global var with HAB */
+extern HAB globalHab;
+
+extern ULONG globalClassVolume;
+
+HWND globalHwndObjectPlay;
+MMAudio* globalObjectPlay;
+
+//BOOL globalHaveTimidity=0;
+
+HMODULE queryModuleHandle(void);
+HMODULE queryResModuleHandle(void);
+PSZ queryModuleName(void);
+BOOL getMessage(char* text,ULONG ulID, LONG lSizeText, HMODULE hResource,HWND hwnd);
+ULONG messageBox( char* text, ULONG ulTextID , LONG lSizeText,
+                  char* title, ULONG ulTitleID, LONG lSizeTitle,
+                  HMODULE hResource, HWND hwnd, ULONG ulFlags);
+
+void HlpSendCommandToObject(char* chrObject, char* command);
+PSZ _queryMp3HelpLibraryName(void);
+BOOL cwMoveNotebookButtonsWarp4(HWND hwndDlg, USHORT usID, USHORT usDelta);
+BOOL cwObjectIsOnCD(WPObject * somSelf);
+BOOL cwObjectIsOnInvalidDrive(WPObject * somSelf);
+PSZ queryInstallDir(void);
+
+BOOL mmclsSetObjectType(WPFileSystem * somSelf);
+BOOL mmclsCreateTheDefaultTemplate(M_WPObject *somSelf, 
+                                   WPObject* Folder);
+ULONG launchPMProg(PSZ pszTitle, PSZ wrapperExe, PSZ parameters,  WPObject *thisPtr, ULONG ulView);
+BOOL getStringFromRexxScript(PSZ rexxFile, char* chrResult, ULONG ulSize);
+
+/* Max string length for the EA values e.g. the trackname. If this value is increased the
+   retstring length in the REXX function handler rxCallCWMMFunc() must also be increased! */
+#define MAX_EA_SIZE 256
+
+
+
+static PBYTE _readTrackInfoIntoMem(MMAudio *somSelf, char * chrEAName, PBYTE pByte, ULONG ulSize)
+{
+  if(cwGetStringFromEA(somSelf, chrEAName , pByte, ulSize))
+    {
+      PBYTE pEAValue;
+      ULONG ul, len;
+      
+      len=strlen(pByte);
+      if( (pEAValue=_wpAllocMem(somSelf, len+1, &ul))!=NULLHANDLE) {
+        strncpy(pEAValue, pByte, len);
+        pEAValue[len]=0;
+        return pEAValue;
+      }
+    }
+  return NULLHANDLE;
+}
+
+void _fillEntryfieldsWithCurrentTrackNames( MMAudio *cwAudio, HWND hwnd)
+{
+  MMAudioData *somThis = MMAudioGetData(cwAudio);
+
+  if(_pszName)
+    WinSetWindowText(WinWindowFromID(hwnd,IDEF_ID3NAME), _pszName);
+  else
+    WinSetWindowText(WinWindowFromID(hwnd,IDEF_ID3NAME), "");
+
+  if(_pszArtist)
+    WinSetWindowText(WinWindowFromID(hwnd, IDEF_ID3ARTIST), _pszArtist);
+  else
+    WinSetWindowText(WinWindowFromID(hwnd, IDEF_ID3ARTIST), "");
+
+  if(_pszAlbum)
+    WinSetWindowText(WinWindowFromID(hwnd,IDEF_ID3ALBUM), _pszAlbum);
+  else
+    WinSetWindowText(WinWindowFromID(hwnd,IDEF_ID3ALBUM), "");
+
+  if(_pszComment)
+    WinSetWindowText(WinWindowFromID(hwnd, IDEF_ID3COMMENT), _pszComment);
+  else
+    WinSetWindowText(WinWindowFromID(hwnd, IDEF_ID3COMMENT), "");
+
+  if(_pszYear)
+    WinSetWindowText(WinWindowFromID(hwnd,IDEF_ID3YEAR), _pszYear);
+  else
+    WinSetWindowText(WinWindowFromID(hwnd,IDEF_ID3YEAR), "");
+
+  if(_pszGenre)
+    WinSetWindowText(WinWindowFromID(hwnd,IDDD_ID3GENRE), _pszGenre);
+  else
+    WinSetWindowText(WinWindowFromID(hwnd,IDDD_ID3GENRE), "");
+
+#if 0
+  if(_cwmmQueryTrackInfo(cwAudio, &chr, sizeof(tempChar), IDINFO_NAME))
+    WinSetWindowText(WinWindowFromID(hwnd,IDEF_ID3NAME), chr);
+  if(_cwmmQueryTrackInfo(cwAudio, &chr, sizeof(tempChar), IDINFO_ARTIST))
+    WinSetWindowText(WinWindowFromID(hwnd, IDEF_ID3ARTIST),tempChar);
+  if(_cwmmQueryTrackInfo(cwAudio, &chr, sizeof(tempChar), IDINFO_ALBUM))
+    WinSetWindowText(WinWindowFromID(hwnd,IDEF_ID3ALBUM),tempChar);
+  if(_cwmmQueryTrackInfo(cwAudio, &chr, sizeof(tempChar), IDINFO_COMMENT))
+    WinSetWindowText(WinWindowFromID(hwnd, IDEF_ID3COMMENT),tempChar);
+  if(_cwmmQueryTrackInfo(cwAudio, &chr, sizeof(tempChar), IDINFO_YEAR))
+    WinSetWindowText(WinWindowFromID(hwnd,IDEF_ID3YEAR),tempChar);
+  if(_cwmmQueryTrackInfo(cwAudio, &chr, sizeof(tempChar), IDINFO_GENRE))
+    WinSetWindowText(WinWindowFromID(hwnd,IDDD_ID3GENRE),tempChar);
+#endif
+}
+
+/****************************************************************/
+/*                                                              */
+/*                                                              */
+/*                                                              */
+/*                                                              */
+/****************************************************************/
+static PBYTE _readTrackInfoFromTextFieldIntoMem(MMAudio *somSelf, PBYTE pByte, HWND hwnd)
+{
+  ULONG ulLen;
+  PBYTE pNewText;
+  ULONG  ul;
+
+  ulLen=WinQueryWindowTextLength(hwnd)+1;
+
+  /* Alloc mem for new string */
+  if( (pNewText=_wpAllocMem(somSelf, ulLen, &ul))!=NULLHANDLE) {
+    WinQueryWindowText(hwnd, ulLen, pNewText);
+    _wpFreeMem(somSelf, pByte);
+
+    return pNewText;
+  }
+
+  return pByte;
+}
+
+/****************************************************************/
+/*                                                              */
+/* WNDPROC: trackNameDlgProc()                                  */
+/*                                                              */
+/* Window procedure handling the track information settings     */
+/* page. The user may use the page to edit the information.     */
+/*                                                              */
+/****************************************************************/
+static MRESULT EXPENTRY trackNameDlgProc(HWND hwnd, ULONG msg, MPARAM mp1, MPARAM mp2)
+{
+  MMAudio *cwAudio;
+
+
+  switch(msg) {
+  case WM_INITDLG :
+    cwAudio=(MMAudio*)PVOIDFROMMP(mp2);
+
+    WinSetWindowULong(WinWindowFromID(hwnd,IDEF_ID3NAME),
+                      QWL_USER,(ULONG)cwAudio);//Save object ptr.
+
+    if(somIsObj(cwAudio)) {
+      int a;
+      HWND hwndTemp;
+      char name[50];
+      MMAudioData *somThis = MMAudioGetData(cwAudio);
+      /* Move default buttons on Warp 4 */
+      cwMoveNotebookButtonsWarp4(hwnd, IDPB_ID3HELP, 15);
+
+      /*if(!getMessage(name, IDSTR_TRACKNAME, sizeof(name),  queryResModuleHandle(), hwnd))
+        strcpy(name, "Track name");*/
+      WinSetWindowText(WinWindowFromID(hwnd,IDGB_ID3TAGS), "");
+
+      WinSendMsg(WinWindowFromID(hwnd,IDEF_ID3NAME),EM_SETTEXTLIMIT,MPFROMSHORT((SHORT)MAX_EA_SIZE-1),0);
+      WinSendMsg(WinWindowFromID(hwnd,IDEF_ID3ARTIST),EM_SETTEXTLIMIT,MPFROMSHORT((SHORT)MAX_EA_SIZE-1),0);
+      WinSendMsg(WinWindowFromID(hwnd,IDEF_ID3ALBUM),EM_SETTEXTLIMIT,MPFROMSHORT((SHORT)MAX_EA_SIZE-1),0);
+      WinSendMsg(WinWindowFromID(hwnd,IDEF_ID3COMMENT),EM_SETTEXTLIMIT,MPFROMSHORT((SHORT)MAX_EA_SIZE-1),0);
+      WinSendMsg(WinWindowFromID(hwnd,IDEF_ID3YEAR),EM_SETTEXTLIMIT,MPFROMSHORT((SHORT)MAX_EA_SIZE-1),0);
+      WinSendMsg(WinWindowFromID(hwnd,IDDD_ID3GENRE),EM_SETTEXTLIMIT,MPFROMSHORT((SHORT)MAX_EA_SIZE-1),0);
+      WinSendMsg(WinWindowFromID(hwnd,IDEF_ID3NAME),EM_SETTEXTLIMIT,MPFROMSHORT((SHORT)30),0);
+      WinSendMsg(WinWindowFromID(hwnd,IDEF_ID3ARTIST),EM_SETTEXTLIMIT,MPFROMSHORT((SHORT)30),0);
+      WinSendMsg(WinWindowFromID(hwnd,IDEF_ID3ALBUM),EM_SETTEXTLIMIT,MPFROMSHORT((SHORT)30),0);
+      WinSendMsg(WinWindowFromID(hwnd,IDEF_ID3COMMENT),EM_SETTEXTLIMIT,MPFROMSHORT((SHORT)30),0);
+      WinSendMsg(WinWindowFromID(hwnd,IDEF_ID3YEAR),EM_SETTEXTLIMIT,MPFROMSHORT((SHORT)4),0);
+      /* Fill drop downlist with knwon genres */
+      hwndTemp=WinWindowFromID(hwnd, IDDD_ID3GENRE);
+      for(a=0;a<=iGenreLast;a++)
+        WinSendMsg(hwndTemp, LM_INSERTITEM, MPFROMSHORT(LIT_SORTASCENDING),MPFROMP(genreList[a]));
+      _fillEntryfieldsWithCurrentTrackNames( cwAudio, hwnd);
+    }
+    WinSetWindowULong(WinQueryWindow(hwnd, QW_PARENT), QWL_HWNDFOCUSSAVE, hwnd);
+    return (MRESULT)TRUE;
+      /* This prevents switching the notebook page behind the open folder */
+    case WM_WINDOWPOSCHANGED:
+      {
+        MRESULT mr;
+
+        if(WinQueryFocus(HWND_DESKTOP)!=
+           WinQueryWindow(WinQueryWindow(hwnd, QW_PARENT), QW_PARENT)) {
+          mp2=MPFROMLONG(LONGFROMMP(mp2)|0x80000);/*AWP_ACTIVATE 0x00080000L*/
+          mr=WinDefDlgProc(hwnd, msg, mp1, mp2);
+          return mr;  
+        }
+        break;
+      }
+    case WM_FOCUSCHANGE:
+      {
+        if(!SHORT1FROMMP(mp2)) {
+          if(HWNDFROMMP(mp1)==hwnd) {
+            MRESULT mr;
+
+            mr=WinDefDlgProc(hwnd, msg, mp1, mp2);
+            WinSendMsg(WinQueryWindow(WinQueryWindow(hwnd, QW_PARENT), QW_PARENT), WM_SETFOCUS, MPFROMHWND(hwnd),
+                       (MPARAM)TRUE);
+            return mr;
+          }
+        }
+        break;
+      }
+    case WM_DESTROY:
+      /* The notebook closes and gets destroyed */
+      /* Set focus to desktop to prevent PM freeze */
+      WinSetFocus(HWND_DESKTOP, HWND_DESKTOP);
+      break;
+  case WM_COMMAND:
+    cwAudio=(MMAudio*) WinQueryWindowULong(WinWindowFromID(hwnd, IDEF_ID3NAME),QWL_USER);
+    if(somIsObj(cwAudio)) {
+      switch(SHORT1FROMMP(mp1))
+        {
+        case IDPB_CANCEL:
+          _fillEntryfieldsWithCurrentTrackNames( cwAudio, hwnd);
+          break;
+        case IDPB_ID3SAVE:
+          {
+            MMAudioData *somThis = MMAudioGetData(cwAudio);
+
+            _pszName=_readTrackInfoFromTextFieldIntoMem(cwAudio, _pszName, WinWindowFromID(hwnd, IDEF_ID3NAME));
+            _pszArtist=_readTrackInfoFromTextFieldIntoMem(cwAudio, _pszArtist, WinWindowFromID(hwnd, IDEF_ID3ARTIST));
+            _pszAlbum=_readTrackInfoFromTextFieldIntoMem(cwAudio, _pszAlbum, WinWindowFromID(hwnd, IDEF_ID3ALBUM));
+            _pszComment=_readTrackInfoFromTextFieldIntoMem(cwAudio, _pszComment, WinWindowFromID(hwnd, IDEF_ID3COMMENT));
+            _pszYear=_readTrackInfoFromTextFieldIntoMem(cwAudio, _pszYear, WinWindowFromID(hwnd, IDEF_ID3YEAR));
+            _pszGenre=_readTrackInfoFromTextFieldIntoMem(cwAudio, _pszGenre, WinWindowFromID(hwnd, IDDD_ID3GENRE));
+            _wpSaveDeferred(cwAudio);
+          }
+          break;
+        default:
+          break;
+        }
+    }
+    return (MRESULT) TRUE;
+  default:
+    break;
+  }
+  return WinDefDlgProc(hwnd, msg, mp1, mp2);
+}
+
+/****************************************************************/
+/*                                                              */
+/* METHOD: cwmmAddTrackNamePage()                               */
+/*                                                              */
+/* Insert new settings notebook page showing track information. */
+/* The user may use this page to edit the information           */
+/*                                                              */
+/****************************************************************/
+/*!*******************************************************/
+/*                                                       */
+/* @@DESC                                                */
+/*                                                       */
+/* This instance method is called to allow the object    */
+/* to add the track name page to its Settings notebook.  */
+/* :p.                                                   */
+/* This page can be used to change the track information */
+/* like title, album etc. which is stored in the EAs     */
+/* of the file.                                          */
+/*                                                       */
+/* @@USAGE                                               */
+/*                                                       */
+/* This method must only be called from within an        */
+/* override of wpAddSettingsPages().                     */
+/*                                                       */
+/* @@PARAM                                               */
+/*                                                       */
+/* MMAudio *somSelf input                                */
+/*                                                       */
+/* Pointer to the object on which the method is being    */
+/* invoked.                                              */
+/* :p.                                                   */
+/* Points to an object of class :hp2.MMAudio:ehp2..      */
+/*                                                       */
+/* @@PARAM                                               */
+/*                                                       */
+/* HWND hwndNotebook input                               */
+/*                                                       */
+/* Settings notebook handle.                             */
+/*                                                       */
+/* @@OVERRIDE                                            */
+/*                                                       */
+/* This method should always be overridden in order to   */
+/* remove or replace the image information page from     */
+/* the object's Settings notbook.                        */
+/* :p.                                                   */
+/* To remove the page from the Settings notebook, the    */
+/* override method should return                         */
+/* :hp1.SETTINGS_PAGE_REMOVED:ehp1. without calling the  */
+/* the parent method. To replace the page with another   */
+/* page, the override method should call the             */
+/* wpInsertSettingsPAge method without calling the       */
+/* parent method.                                        */
+/*                                                       */
+/* @@RETURNS                                             */
+/*                                                       */
+/* ULONG rc                                              */
+/*                                                       */
+/* :parml compact tsize=15 break=none.                   */
+/* :pt.0:pd.Error occurred                               */
+/* :pt.PageId :pd.Identifier for the inserted page.      */
+/* :eparml.                                              */
+/*                                                       */
+/*!!******************************************************/
+SOM_Scope ULONG  SOMLINK cwaudio_cwmmAddTrackNamePage(MMAudio* somSelf, 
+                                                      HWND hwndNotebook)
+{
+  PAGEINFO pageinfo;
+  char pageName[100];
+
+  /*    MMAudioData *somThis = MMAudioGetData(somSelf);*/
+    MMAudioMethodDebug("MMAudio","cwaudio_cwmmAddTrackNamePage");
+
+  //Clear the pageinfo structure
+  memset((PCH)&pageinfo, 0, sizeof(PAGEINFO));
+  //Fill the pageinfo structure
+  pageinfo.cb = sizeof(PAGEINFO);
+  pageinfo.hwndPage = NULLHANDLE;
+  pageinfo.usPageStyleFlags = BKA_MAJOR | BKA_STATUSTEXTON;
+  pageinfo.usPageInsertFlags = BKA_FIRST;
+  //We want page numbers
+  pageinfo.usSettingsFlags = SETTINGS_PAGE_NUMBERS;
+  //The dialog procedure for this page
+  pageinfo.pfnwp = trackNameDlgProc;
+  //The resource DLL
+  pageinfo.resid = queryResModuleHandle();
+  //pageinfo.resid = queryModuleHandle();
+  //The ID of the dialog template
+  pageinfo.dlgid = IDDLG_ID3TAGS;
+  //We need a pointer to our WPS-object in the dialog procedure
+  //to call class functions
+  pageinfo.pCreateParams = somSelf;
+  //The ID of the help panel for this page
+  pageinfo.idDefaultHelpPanel = TRACKNAME_SETTINGS_PANEL;
+  //Tell the WPS the help library name
+  pageinfo.pszHelpLibraryName = _queryMp3HelpLibraryName();
+  //We have a major tab so we need a name
+  if(!getMessage(pageName, ID_TRACKNAMEPAGENAME, sizeof(pageName), queryResModuleHandle(), hwndNotebook))
+    strcpy(pageName, "~Track meta data");
+  pageinfo.pszName = pageName;
+  //Insert the page into the settings notebook
+
+  return _wpInsertSettingsPage(somSelf,hwndNotebook,&pageinfo);
+}
+
+/* Remove all trailing spaces from a string. The string MUST be terminated by 0! */
+void _removeTrailingSpaces(char * chrString)
+{
+  char *ptr;
+
+  if((ptr=strrchr(chrString, 0))==NULLHANDLE)
+    return;
+
+  if(ptr==chrString)
+    return;
+
+  while(ptr>=chrString && (*ptr==0 || *ptr==' '))
+    ptr--;
+
+  *(++ptr)=0;
+}
+
+
+/****************************************************************/
+/*                                                              */
+/* WNDPROC: waveInfoDlgProc()                                   */
+/*                                                              */
+/* Window procedure handling the wave information settings      */
+/* page.                                                        */
+/*                                                              */
+/****************************************************************/
+MRESULT EXPENTRY waveInfoDlgProc(HWND hwnd, ULONG msg, MPARAM mp1, MPARAM mp2)
+{
+  MMAudio *cwAudio;
+
+  switch(msg) {
+  case WM_INITDLG :
+    cwAudio=(MMAudio*)LONGFROMMP(mp2);
+    if(somIsObj(cwAudio)) {
+      char fName[CCHMAXPATH];
+      MMAudioData *somThis = MMAudioGetData(cwAudio);
+      
+      sprintf(fName,"%d",_ulChannels);
+      WinSetWindowText(WinWindowFromID(hwnd, IDST_CHANNELS),fName);
+      
+      sprintf(fName,"%d",_ulSampleRate);
+      WinSetWindowText(WinWindowFromID(hwnd, IDST_SAMPLERATE),fName);
+      sprintf(fName,"%d",_ulBPS);
+      WinSetWindowText(WinWindowFromID(hwnd, IDST_BPS),fName);
+      sprintf(fName,"%d:%02d",_ulPlaySecs/60, _ulPlaySecs%60);
+      WinSetWindowText(WinWindowFromID(hwnd, IDST_PLAYTIME),fName);
+      WinSetWindowULong(WinQueryWindow(hwnd, QW_PARENT), QWL_HWNDFOCUSSAVE, hwnd);
+    }
+    return (MRESULT)TRUE;
+      /* This prevents switching the notebook page behind the open folder */
+    case WM_WINDOWPOSCHANGED:
+      {
+        MRESULT mr;
+
+        if(WinQueryFocus(HWND_DESKTOP)!=
+           WinQueryWindow(WinQueryWindow(hwnd, QW_PARENT), QW_PARENT)) {
+          mp2=MPFROMLONG(LONGFROMMP(mp2)|0x80000);/*AWP_ACTIVATE 0x00080000L*/
+          mr=WinDefDlgProc(hwnd, msg, mp1, mp2);
+          return mr;  
+        }
+        break;
+      }
+    case WM_FOCUSCHANGE:
+      {
+        if(!SHORT1FROMMP(mp2)) {
+          if(HWNDFROMMP(mp1)==hwnd) {
+            MRESULT mr;
+
+            mr=WinDefDlgProc(hwnd, msg, mp1, mp2);
+            WinSendMsg(WinQueryWindow(WinQueryWindow(hwnd, QW_PARENT), QW_PARENT), 
+                       WM_SETFOCUS, MPFROMHWND(hwnd), (MPARAM)TRUE);
+            return mr;
+          }
+        }
+        break;
+      }
+    case WM_DESTROY:
+      /* The notebook closes and gets destroyed */
+      /* Set focus to desktop to prevent PM freeze */
+      WinSetFocus(HWND_DESKTOP, HWND_DESKTOP);
+      break;
+  default:
+    break;
+  }
+  return WinDefDlgProc(hwnd, msg, mp1, mp2);
+}
+
+
+/****************************************************************/
+/*                                                              */
+/* METHOD: cwmmAddAudioInformationPage()                        */
+/*                                                              */
+/* Insert new settings notebook page showing audio information. */
+/*                                                              */
+/****************************************************************/
+/*!*******************************************************/
+/*                                                       */
+/* @@DESC                                                */
+/*                                                       */
+/* This instance method is called to allow the object    */
+/* to add the audio information page to its Settings     */
+/* notebook.                                             */
+/*                                                       */
+/* @@USAGE                                               */
+/*                                                       */
+/* This method must only be called from within an        */
+/* override of wpAddSettingsPages().                     */
+/*                                                       */
+/* @@PARAM                                               */
+/*                                                       */
+/* MMAudio *somSelf input                                */
+/*                                                       */
+/* Pointer to the object on which the method is being    */
+/* invoked.                                              */
+/* :p.                                                   */
+/* Points to an object of class :hp2.MMAudio:ehp2..      */
+/*                                                       */
+/* @@PARAM                                               */
+/*                                                       */
+/* HWND hwndNotebook input                               */
+/*                                                       */
+/* Settings notebook handle.                             */
+/*                                                       */
+/* @@OVERRIDE                                            */
+/*                                                       */
+/* This method should always be overridden in order to   */
+/* remove or replace the image information page from     */
+/* the object's Settings notbook.                        */
+/* :p.                                                   */
+/* To remove the page from the Settings notebook, the    */
+/* override method should return                         */
+/* :hp1.SETTINGS_PAGE_REMOVED:ehp1. without calling the  */
+/* the parent method. To replace the page with another   */
+/* page, the override method should call the             */
+/* wpInsertSettingsPAge method without calling the       */
+/* parent method.                                        */
+/*                                                       */
+/* @@RETURNS                                             */
+/*                                                       */
+/* ULONG rc                                              */
+/*                                                       */
+/* :parml compact tsize=15 break=none.                   */
+/* :pt.0:pd.Error occurred                               */
+/* :pt.PageId :pd.Identifier for the inserted page.      */
+/* :eparml.                                              */
+/*                                                       */
+/*!!******************************************************/
+SOM_Scope ULONG  SOMLINK cwaudio_cwmmAddAudioInformationPage(MMAudio* somSelf, 
+                                                            HWND hwndNotebook)
+{
+  PAGEINFO pageinfo;
+  char pageName[100];
+
+  MMAudioData *somThis = MMAudioGetData(somSelf);
+  MMAudioMethodDebug("MMAudio","cwaudio_cwmmAddWaveInformationPage");
+
+  if(_ulFileSize!=_wpQueryFileSize(somSelf)) {
+    /* The filesize changed, somebody altered the audio file so reread the info */
+    /* Get class object */
+    M_CWMMDataFile *m_cwmmDataFile=_CWMMDataFile;
+    
+    /* Send the object pointer to the audio worker thread to read the audio info in the background. */
+    WinPostMsg(__get_hwndAudioWorker(_CWMMDataFile), WM_APPTERMINATENOTIFY, somSelf, 0);
+
+#if 0
+    /* The following is only important for MP3 files because gathering the audio info
+       for MP3 files is currently very slow. Will improve with future releases of MMIOMP3*/
+    if(!cwObjectIsOnCD(somSelf)) {
+      /* Only get audio info when file isn't on CD. This speeds up opening of folders on CDs filled with
+         MP3s. Doesn't hurt because folders of CDs open in normal details view as default so the audio info
+         isn't necessary. When opening the settings notebook the info is reread anyway. */      
+      
+      /* Get class object */
+      M_CWMMDataFile *m_cwmmDataFile=_CWMMDataFile;
+      
+      /* Send the object pointer to the audio worker thread to read the audio info in the background. */
+      WinPostMsg(__get_hwndAudioWorker(_CWMMDataFile), WM_APPTERMINATENOTIFY, somSelf, 0);
+    }
+#endif
+  }
+
+
+  //Clear the pageinfo structure
+  memset((PCH)&pageinfo, 0, sizeof(PAGEINFO));
+  //Fill the pageinfo structure
+  pageinfo.cb = sizeof(PAGEINFO);
+  pageinfo.hwndPage = NULLHANDLE;
+  pageinfo.usPageStyleFlags = BKA_MAJOR | BKA_STATUSTEXTON;
+  pageinfo.usPageInsertFlags = BKA_FIRST;
+  //We want page numbers
+  pageinfo.usSettingsFlags = SETTINGS_PAGE_NUMBERS;
+  //The dialog procedure for this page
+  pageinfo.pfnwp = waveInfoDlgProc;
+  //The resource DLL
+  pageinfo.resid = queryResModuleHandle();
+  //pageinfo.resid = queryModuleHandle();
+  //The ID of the dialog template
+  pageinfo.dlgid = IDDLG_WAVEINFOPAGE;
+  //We need a pointer to our WPS-object in the dialog procedure
+  //to call class functions
+  pageinfo.pCreateParams = somSelf;
+  //The ID of the help panel for this page
+  //pageinfo.idDefaultHelpPanel = IDDLG_GENERAL2PAGE;
+  //Tell the WPS the help library name
+  pageinfo.pszHelpLibraryName = NULLHANDLE;
+  //We have a major tab so we need a name
+  if(!getMessage(pageName, ID_WAVEINFOPAGENAME, sizeof(pageName), queryResModuleHandle(), hwndNotebook))
+    strcpy(pageName, "~Audio information");
+  pageinfo.pszName = pageName;
+  //Insert the page into the settings notebook
+  return _wpInsertSettingsPage(somSelf,hwndNotebook,&pageinfo);
+}
+
+/*
+ * The prototype for cwaudio_cwmmSetTrackInfo was replaced by the following prototype:
+ */
+
+/*
+ * SOM_Scope BOOL  SOMLINK cwaudio_cwmmSetTrackInfo(MMAudio *somSelf, 
+ *                                                  char* chrString, 
+ *                                                  ULONG ulValue, 
+ *                                                  int iWhich)
+ */
+
+/*
+ * The prototype for cwaudio_cwmmSetTrackInfo was replaced by the following prototype:
+ */
+SOM_Scope BOOL  SOMLINK cwaudio_cwmmSetTrackInfo(MMAudio *somSelf, 
+                                                 char* chrString, 
+                                                 ULONG ulValue, 
+                                                 ULONG iWhich)
+{
+  ULONG ulError;
+    MMAudioData *somThis = MMAudioGetData(somSelf);
+    MMAudioMethodDebug("MMAudio","cwaudio_cwmmSetIdInfo");
+
+    if(iWhich<1||iWhich>IDINFO_LASTINFO)
+      return FALSE;
+
+    switch(iWhich)
+      {
+      case IDINFO_PLAYTIME:
+        _ulPlaySecs=ulValue;
+        sprintf(_chrPlayTime, "%02d:%02d",_ulPlaySecs/60, _ulPlaySecs%60);
+        break;
+
+      case IDINFO_BPS:
+        _ulBPS=ulValue;
+        sprintf(_chrBPS, "%d",_ulBPS);
+        break;
+      case IDINFO_CHANNELS:
+        _ulChannels=ulValue;
+        sprintf(_chrChannels, "%d",_ulChannels);
+        break;
+      case IDINFO_SAMPLERATE:
+        _ulSampleRate=ulValue;
+        sprintf(_chrSampleRate, "%d",_ulSampleRate);
+        break;
+
+      case IDINFO_NAME:
+        {
+          char chrEA[MAX_EA_SIZE];
+          /* Make sure string isn't longer than defined EA size */
+          my_strlcpy(chrEA, chrString, sizeof(chrEA));
+          _pszName=somReallocString(somSelf, _pszName, chrEA, &ulError);
+          //SysWriteToTrapLog("!! %s %d\n", __FUNCTION__, __LINE__);
+          break;
+        }
+      case IDINFO_ARTIST:
+        {
+          char chrEA[MAX_EA_SIZE];
+          my_strlcpy(chrEA, chrString, sizeof(chrEA));
+          _pszArtist=somReallocString(somSelf, _pszArtist, chrEA, &ulError);
+          break;
+        }
+      case IDINFO_ALBUM:
+        {
+          char chrEA[MAX_EA_SIZE];
+          /* Make sure string isn't longer than defined EA size */
+          my_strlcpy(chrEA, chrString, sizeof(chrEA));
+          _pszAlbum=somReallocString(somSelf, _pszAlbum, chrEA, &ulError);
+          break;
+        }
+      case IDINFO_YEAR:
+        {
+          char chrEA[MAX_EA_SIZE];
+          /* Make sure string isn't longer than defined EA size */
+          my_strlcpy(chrEA, chrString, sizeof(chrEA));
+          _pszYear=somReallocString(somSelf, _pszYear, chrEA, &ulError);
+          break;
+        }
+      case IDINFO_COMMENT:
+        {
+          char chrEA[MAX_EA_SIZE];
+          /* Make sure string isn't longer than defined EA size */
+          my_strlcpy(chrEA, chrString, sizeof(chrEA));
+          _pszComment=somReallocString(somSelf, _pszComment, chrEA, &ulError);
+          break;
+        }
+      case IDINFO_GENRE:
+        {
+          char chrEA[MAX_EA_SIZE];
+          /* Make sure string isn't longer than defined EA size */
+          my_strlcpy(chrEA, chrString, sizeof(chrEA));
+          _pszGenre=somReallocString(somSelf, _pszGenre, chrEA, &ulError);
+          break;
+        }
+
+#if 0
+      case IDINFO_NAME:
+        strncpy(_id3Name,chrString,sizeof(_id3Name));
+        _id3Name[sizeof(_id3Name)-1]=0;
+        _removeTrailingSpaces(_id3Name);
+        break;
+      case IDINFO_ARTIST:
+        strncpy(_id3Artist,chrString,sizeof(_id3Artist));
+        _id3Artist[sizeof(_id3Artist)-1]=0;
+        _removeTrailingSpaces(_id3Artist);
+        break;
+      case IDINFO_ALBUM:
+        strncpy(_id3Album, chrString, sizeof(_id3Album));
+        _id3Album[sizeof(_id3Album)-1]=0;
+        _removeTrailingSpaces(_id3Album);
+        break;
+      case IDINFO_YEAR:
+        strncpy(_id3Year, chrString, sizeof(_id3Year));
+        _id3Year[sizeof(_id3Year)-1]=0;
+        _removeTrailingSpaces(_id3Year);
+        break;
+      case IDINFO_COMMENT:
+        strncpy(_id3Comment,chrString, sizeof(_id3Comment));
+        _id3Comment[sizeof(_id3Comment)]=0;
+        _removeTrailingSpaces(_id3Comment);
+        break;
+      case IDINFO_GENRE:
+        strncpy(_id3Genre, chrString, sizeof(_id3Genre));
+        _id3Genre[sizeof(_id3Genre)-1]=0;
+        _removeTrailingSpaces(_id3Genre);
+        break;
+#endif
+
+      default:
+        return FALSE;
+      }
+
+    /* Return statement to be customized: */
+    return TRUE;
+}
+
+
+/*
+ * The prototype for cwaudio_cwmmQueryTrackInfo was replaced by the following prototype:
+ */
+
+/*
+ * SOM_Scope ULONG  SOMLINK cwaudio_cwmmQueryTrackInfo(MMAudio *somSelf, 
+ *                                                     char** chrString, 
+ *                                                     ULONG ulSize, 
+ *                                                     int iWhich)
+ */
+
+/*
+ * The prototype for cwaudio_cwmmQueryTrackInfo was replaced by the following prototype:
+ */
+/*!*******************************************************/
+/*                                                       */
+/* @@DESC                                                */
+/*                                                       */
+/* This instance method is called on an object when      */
+/* information about the track is needed.                */
+/*                                                       */
+/*                                                       */
+/* @@USAGE                                               */
+/*                                                       */
+/* This method can be called at any time in order to     */
+/* get information about an audio object.                */
+/* :p.                                                   */
+/* The parameters :hp2.chrString:ehp2. and               */
+/* :hp2.ulSize:ehp2. can be NULL if :hp2.iWhich:ehp2.    */
+/* is one of the following                               */
+/*                                                       */
+/* :ul compact.                                          */
+/* :li.IDINFO_PLAYTIME                                   */
+/* :li.IDINFO_BPS                                        */
+/* :li.IDINFO_CHANNELS                                   */
+/* :li.IDINFO_SAMPLERATE                                 */
+/* :li.IDINFO_BITRATE                                    */
+/* :eul.                                                 */ 
+/* :p.                                                   */
+/* A numeric value is returned, for example the play     */
+/* time.                                                 */
+/* :p.                                                   */
+/* For                                                   */
+/*                                                       */
+/* :ul compact.                                          */
+/* :li.IDINFO_NAME                                       */
+/* :li.IDINFO_ARTIST                                     */
+/* :li.IDINFO_ALBUM                                      */
+/* :li.IDINFO_COMMENT                                    */
+/* :li.IDINFO_YEAR                                       */
+/* :li.IDINFO_GENRE                                      */
+/* :eul.                                                 */ 
+/* :p.                                                   */
+/* A string is copied into the buffer pointed to by      */
+/* :hp2.chrString:ehp2.. At most ulSize-1 characters are */
+/* copied. The string is terminated by a trailing 0.     */
+/* :p.                                                   */
+/* If both :hp2.chrString:ehp2. and :hp2.ulSize:ehp2.    */
+/* are NULL the necessary buffersize for holding the     */
+/* complete string (including the trailing 0) is         */
+/* returned.                                             */
+/*                                                       */
+/* @@PARAM                                               */
+/*                                                       */
+/* MMAudio *somSelf input                                */
+/*                                                       */
+/* Pointer to the object on which the method is being    */
+/* invoked.                                              */
+/* :p.                                                   */
+/* Points to an object of class :hp2.MMAudio:ehp2..      */
+/*                                                       */
+/* @@PARAM                                               */
+/*                                                       */
+/* PSZ chrString in/out                                  */
+/*                                                       */
+/* Pointer to a buffer receiving the information.        */
+/* It is only used when querying a string. The returned  */
+/* string is always terminated with 0.                   */
+/*                                                       */
+/* @@PARAM                                               */
+/*                                                       */
+/* ULONG ulSize input                                    */
+/*                                                       */
+/* Size of the buffer :hp2.chrString:ehp2..              */
+/*                                                       */
+/* @@PARAM                                               */
+/*                                                       */
+/* int iWhich input                                      */
+/*                                                       */
+/* Parameter specifying which information is queried.    */
+/* :parml compact tsize=25 break=none.                   */
+/* :pt.IDINFO_PLAYTIME                                   */        
+/* :pd.The running time of the track in seconds.         */
+/* :pt.IDINFO_BPS                                        */
+/* :pd.Bits per sample.                                  */
+/* :pt.IDINFO_CHANNELS                                   */
+/* :pd.Number of channels. For MIDI files this is the    */
+/*  number of MIDI tracks.                               */
+/* :pt.IDINFO_SAMPLERATE                                 */
+/* :pd.Samplerate                                        */
+/* :pt.IDINFO_BITRATE                                    */
+/* :pd.Bitrate                                           */
+/* :pt.IDINFO_NAME                                       */
+/* :pd.                                                  */
+/* :pt.IDINFO_ARTIST                                     */
+/* :pd.                                                  */
+/* :pt.IDINFO_ALBUM                                      */
+/* :pd.                                                  */
+/* :pt.IDINFO_COMMENT                                    */
+/* :pd.                                                  */
+/* :pt.IDINFO_YEAR                                       */
+/* :pd.                                                  */
+/* :pt.IDINFO_GENRE                                      */
+/* :pd.                                                  */
+/* :eparml.                                              */
+/*                                                       */
+/* @@OVERRIDE                                            */
+/*                                                       */
+/* This method can be overriden by child classes if      */
+/* such a class adds other information.                  */
+/*                                                       */
+/* @@RETURNS                                             */
+/*                                                       */
+/* ULONG rc                                              */
+/*                                                       */
+/* A numeric value for                                   */
+/*                                                       */
+/* :ul compact.                                          */
+/* :li.IDINFO_PLAYTIME                                   */
+/* :li.IDINFO_BPS                                        */
+/* :li.IDINFO_CHANNELS                                   */
+/* :li.IDINFO_SAMPLERATE                                 */
+/* :li.IDINFO_BITRATE                                    */
+/* :eul.                                                 */ 
+/* :p.                                                   */
+/*  0 indicates the information isn't available.         */
+/* :p.                                                   */
+/* For                                                   */
+/*                                                       */
+/* :ul compact.                                          */
+/* :li.IDINFO_NAME                                       */
+/* :li.IDINFO_ARTIST                                     */
+/* :li.IDINFO_ALBUM                                      */
+/* :li.IDINFO_COMMENT                                    */
+/* :li.IDINFO_YEAR                                       */
+/* :li.IDINFO_GENRE                                      */
+/* :eul.                                                 */ 
+/* :p.                                                   */
+/* a return value of 0 indicates an error or the         */
+/* information isn't available. A value <> 0 indicates   */
+/* successful completion.                                */
+/*!!******************************************************/
+
+/*
+ * SOM_Scope ULONG  SOMLINK cwaudio_cwmmQueryTrackInfo(MMAudio *somSelf, 
+ *                                                     PSZ chrString, 
+ *                                                     ULONG ulSize, 
+ *                                                     int iWhich)
+ */
+
+/*
+ * The prototype for cwaudio_cwmmQueryTrackInfo was replaced by the following prototype:
+ */
+SOM_Scope ULONG  SOMLINK cwaudio_cwmmQueryTrackInfo(MMAudio *somSelf, 
+                                                    PSZ chrString, 
+                                                    ULONG ulSize, 
+                                                    ULONG iWhich)
+{
+  MMAudioData *somThis = MMAudioGetData(somSelf); 
+    MMAudioMethodDebug("MMAudio","cwaudio_cwmmQueryTrackInfo");
+
+    switch(iWhich)
+      {
+      case IDINFO_PLAYTIME:
+        return _ulPlaySecs;
+      case IDINFO_BPS:
+        return _ulBPS;
+      case IDINFO_CHANNELS:
+        return _ulChannels;
+      case IDINFO_SAMPLERATE:
+        return _ulSampleRate;
+      case IDINFO_BITRATE:
+        return _ulBitRate;
+
+      case IDINFO_NAME:
+        {
+          if(!_pszName) /* No information yet */
+            return FALSE;
+          /* Caller asks for buffer size */
+          if(!chrString && ulSize==0)
+            return strlen(_pszName)+1;
+          if(!chrString)
+            return 0;
+
+          if(ulSize>strlen(_pszName)) {
+            strcpy(chrString, _pszName);
+          }
+          else {
+            strncpy(chrString, _pszName, ulSize);
+            chrString[ulSize-1]=0;
+          }
+          if(chrString[0]==0)
+            return FALSE;
+          else
+            return TRUE;
+        }
+      case IDINFO_ARTIST:
+        {
+          //    char *chr=*chrString;
+          if(!_pszArtist)
+            return FALSE;
+          /* Caller asks for buffer size */
+          if(!chrString && ulSize==0)
+            return strlen(_pszArtist)+1;
+          if(!chrString)
+            return 0;
+
+          if(ulSize>strlen(_pszArtist)) {
+            strcpy(chrString, _pszArtist);
+          }
+          else {
+            strncpy(chrString, _pszArtist, ulSize);
+            chrString[ulSize-1]=0;
+          }
+          if(chrString[0]==0)
+            return FALSE;
+          else
+            return TRUE;
+        }
+      case IDINFO_ALBUM:
+        {
+          //          char *chr=*chrString;
+          if(!_pszAlbum)
+            return FALSE;
+          /* Caller asks for buffer size */
+          if(!chrString && ulSize==0)
+            return strlen(_pszAlbum)+1;
+          if(!chrString)
+            return 0;
+
+          if(ulSize>strlen(_pszAlbum)) {
+            strcpy(chrString, _pszAlbum);
+          }
+          else {
+            strncpy(chrString, _pszAlbum, ulSize);
+            chrString[ulSize-1]=0;
+          }
+          if(chrString[0]==0)
+            return FALSE;
+          else
+            return TRUE;
+        }
+      case IDINFO_COMMENT:
+        {
+          //          char *chr=*chrString;
+          if(!_pszComment)
+            return FALSE;
+          /* Caller asks for buffer size */
+          if(!chrString && ulSize==0)
+            return strlen(_pszComment)+1;
+          if(!chrString)
+            return 0;
+
+          if(ulSize>strlen(_pszComment)) {
+            strcpy(chrString, _pszComment);
+          }
+          else {
+            strncpy(chrString, _pszComment, ulSize);
+            chrString[ulSize-1]=0;
+          }
+          if(chrString[0]==0)
+            return FALSE;
+          else
+            return TRUE;
+        }
+      case IDINFO_YEAR:
+        {
+          //          char *chr=*chrString;
+          if(!_pszYear)
+            return FALSE;
+          /* Caller asks for buffer size */
+          if(!chrString && ulSize==0)
+            return strlen(_pszYear)+1;
+          if(!chrString)
+            return 0;
+
+          if(ulSize>strlen(_pszYear)) {
+            strcpy(chrString, _pszYear);
+          }
+          else {
+            strncpy(chrString, _pszYear, ulSize);
+            chrString[ulSize-1]=0;
+          }
+          if(chrString[0]==0)
+            return FALSE;
+          else
+            return TRUE;
+        }
+      case IDINFO_GENRE:
+        {
+          //  char *chr=*chrString;
+          if(!_pszGenre)
+            return FALSE;
+          /* Caller asks for buffer size */
+          if(!chrString && ulSize==0)
+            return strlen(_pszGenre)+1;
+          if(!chrString)
+            return 0;
+
+          if(ulSize>=strlen(_pszGenre)) {
+            strcpy(chrString, _pszGenre);
+          }
+          else {
+            strncpy(chrString, _pszGenre, ulSize);
+            chrString[ulSize-1]=0;
+          }
+          if(chrString[0]==0)
+            return FALSE;
+          else
+            return TRUE;
+        }
+
+#if 0
+      case IDINFO_NAME:
+        {
+          char *chr=*chrString;
+          if(ulSize>=sizeof(_id3Name)) {
+            strncpy(chr, _id3Name, sizeof(_id3Name));
+            chr[sizeof(_id3Name)-1]=0;
+          }
+          else {
+            strncpy(chr, _id3Name, ulSize);
+            chr[ulSize-1]=0;
+          }
+          if(chr[0]==0)
+            return FALSE;
+          else
+            return TRUE;
+        }
+      case IDINFO_ARTIST:
+        {
+          char *chr=*chrString;
+          if(ulSize>=sizeof(_id3Artist)) {
+            strncpy(chr, _id3Artist, sizeof(_id3Artist));
+            chr[sizeof(_id3Artist)-1]=0;
+          }
+          else {
+            strncpy(chr, _id3Artist, ulSize);
+            chr[ulSize-1]=0;
+          }
+          if(chr[0]==0)
+            return FALSE;
+          else
+            return TRUE;
+        }
+      case IDINFO_ALBUM:
+        {
+          char *chr=*chrString;
+          if(ulSize>=sizeof(_id3Album)) {
+            strncpy(chr, _id3Album, sizeof(_id3Album));
+            chr[sizeof(_id3Album)-1]=0;
+          }
+          else {
+            strncpy(chr, _id3Album, ulSize);
+            chr[ulSize-1]=0;
+          }
+          if(chr[0]==0)
+            return FALSE;
+          else
+            return TRUE;
+        }
+      case IDINFO_COMMENT:
+        {
+          char *chr=*chrString;
+          if(ulSize>=sizeof(_id3Comment)) {
+            strncpy(chr, _id3Comment, sizeof(_id3Comment));
+            chr[sizeof(_id3Comment)-1]=0;
+          }
+          else {
+            strncpy(chr, _id3Comment, ulSize);
+            chr[ulSize-1]=0;
+          }
+          if(chr[0]==0)
+            return FALSE;
+          else
+            return TRUE;
+        }
+      case IDINFO_YEAR:
+        {
+          char *chr=*chrString;
+          if(ulSize>=sizeof(_id3Year)) {
+            strncpy(chr, _id3Year, sizeof(_id3Year));
+            chr[sizeof(_id3Year)-1]=0;
+          }
+          else {
+            strncpy(chr, _id3Year, ulSize);
+            chr[ulSize-1]=0;
+          }
+          if(chr[0]==0)
+            return FALSE;
+          else
+            return TRUE;
+        }
+      case IDINFO_GENRE:
+        {
+          char *chr=*chrString;
+          if(ulSize>=sizeof(_id3Genre)) {
+            strncpy(chr, _id3Genre, sizeof(_id3Genre));
+            chr[sizeof(_id3Genre)-1]=0;
+          }
+          else {
+            strncpy(chr, _id3Genre, ulSize);
+            chr[ulSize-1]=0;
+          }
+          if(chr[0]==0)
+            return FALSE;
+          else
+            return TRUE;
+        }
+#endif
+
+      default:
+        break;
+      }
+
+    /* Return statement to be customized: */
+    return 0;
+}
+
+/************************************************************/
+/*                                                          */
+/*                                                          */
+/*                                                          */
+/************************************************************/
+MRESULT EXPENTRY playObjectProc(HWND hwnd, ULONG msg, MPARAM mp1, MPARAM mp2)
+{
+
+  switch (msg)
+    {
+    case WM_APPTERMINATENOTIFY:
+      {
+        if(LONGFROMMP(mp1)==ACKEY_START)
+          {
+            unsigned char chrCommand[CCHMAXPATH*2];
+            char chrDevice[20];
+            char name[CCHMAXPATH];
+            ULONG ulNameSize;
+            char retMsg[20];
+            APIRET rc;
+            int iTime;
+            OPENPARAMS * pParams;
+            MMAudio * thisPtr;
+            char *s;
+            
+            pParams=PVOIDFROMMP(mp2);/* Get parameter block */
+            if(!pParams)
+              {
+                WinPostMsg(hwnd,WM_QUIT,0,0);
+                return MRFALSE;
+              }
+            
+            WinSetWindowULong(hwnd, QWL_USER, (ULONG)pParams);
+
+            thisPtr=pParams->wpObject;
+            if(somIsObj(thisPtr)) {
+              SOMClass* mmMIDIClass=somGetSomClass("MMMIDI");
+              MMAudioData *somThis = MMAudioGetData(thisPtr);
+                   
+              ulNameSize=sizeof(name);
+              _wpQueryRealName(thisPtr, name, &ulNameSize, TRUE);
+
+	      if(_somIsA(thisPtr, mmMIDIClass)) {
+		strncpy(chrDevice,"sequencer", sizeof(chrDevice) - 1);
+		/* Start audio file */
+		sprintf(chrCommand,"open \"%s\" type %s alias wave%p shareable wait", name, chrDevice, thisPtr);
+		rc = mciSendString( chrCommand, retMsg, sizeof(retMsg), hwnd, 0);
+                if((rc & 0x0000ffff)!=MCIERR_SUCCESS) {
+		  WinPostMsg(hwnd,WM_QUIT,0,0);
+		  return MRFALSE;
+		}
+
+		/* Set time format */
+		sprintf(chrCommand,"SET wave%p TIME FORMAT MILLISECONDS wait", thisPtr);
+		rc = mciSendString(chrCommand, retMsg, sizeof(retMsg), 0, 0);
+		if((rc & 0x0000ffff)!=MCIERR_SUCCESS) {
+		  WinPostMsg(hwnd, WM_APPTERMINATENOTIFY, MPFROMLONG(ACKEY_STOP), MPFROMP(thisPtr));
+		  return MRFALSE;
+		}
+
+		sprintf(chrCommand,"STATUS wave%p LENGTH WAIT", thisPtr);
+		rc = mciSendString(chrCommand, retMsg, sizeof(retMsg), 0, 0);
+		if((rc & 0x0000ffff)!=MCIERR_SUCCESS) {
+		  WinPostMsg(hwnd, WM_APPTERMINATENOTIFY, MPFROMLONG(ACKEY_STOP), MPFROMP(thisPtr));
+		  return MRFALSE;
+                }
+
+                iTime=atoi(retMsg);
+		      
+		//   sprintf(chrCommand,"SETPOSITIONADVISE wave%p ON EVERY %d NOTIFY", thisPtr, 3000);
+		//   rc = mciSendString(chrCommand, retMsg, sizeof(retMsg), hwnd, 0);
+		      
+		if(iTime>1100)
+		  iTime-=700;
+		else
+		  iTime-=300;
+		      
+		if(iTime<=0)
+		  iTime=10;
+		      
+		sprintf(chrCommand,"SETCUEPOINT wave%p ON at %d WAIT", thisPtr, iTime);
+		rc = mciSendString(chrCommand, retMsg, sizeof(retMsg), hwnd, 0);
+		if((rc & 0x0000ffff)!=MCIERR_SUCCESS) {
+                  WinPostMsg(hwnd, WM_APPTERMINATENOTIFY, MPFROMLONG(ACKEY_STOP), MPFROMP(thisPtr));
+		  return MRFALSE;
+		}
+		  
+
+		/* Set volume */
+		sprintf(chrCommand,"SET wave%p AUDIO VOLUME %d wait", thisPtr, globalClassVolume);
+		rc = mciSendString(chrCommand, retMsg, sizeof(retMsg), 0, 0);
+		/* Not able to set the volume isn't that bad so don't quit in case of an error. */
+  #if 0
+		if((rc & 0x0000ffff)!=MCIERR_SUCCESS) {
+		  WinPostMsg(hwnd, WM_APPTERMINATENOTIFY, MPFROMLONG(ACKEY_STOP), MPFROMP(thisPtr));
+		  return MRFALSE;
+		}
+  #endif
+  
+		WinStartTimer(WinQueryAnchorBlock(hwnd), hwnd, 1, 100);
+
+		sprintf(chrCommand,"play wave%p", thisPtr);
+		rc = mciSendString(chrCommand, retMsg, sizeof(retMsg), 0, 0);
+		if((rc & 0x0000ffff)!=MCIERR_SUCCESS) {
+                  WinSendMsg(hwnd, WM_APPTERMINATENOTIFY, MPFROMLONG(ACKEY_STOP), MPFROMP(thisPtr));
+		  return MRFALSE;
+                }
+
+		/* Set Time in icon title to 00:00 */
+		strncpy(chrCommand, _wpQueryTitle(thisPtr), CCHMAXPATH);
+		if(_ulPlaySecs) {
+		  sprintf(retMsg, "%02d:%02d", _ulPlaySecs/60, _ulPlaySecs%60);                  
+		  strncat(chrCommand,"\n00:00 / ",sizeof(chrCommand)-1-strlen(chrCommand));
+		  strncat(chrCommand, retMsg,sizeof(chrCommand)-1-strlen(chrCommand));
+		 }
+		 else
+		   strncat(chrCommand,"\n00:00", sizeof(chrCommand)-1-strlen(chrCommand));
+   
+		 _cwmmSetRecordTitles(thisPtr, chrCommand, FALSE);
+		 WinStartTimer(WinQueryAnchorBlock(hwnd), hwnd, 1, 1000);
+		 __set_ulTrackStatus( thisPtr,TRACK_STATUS_PLAYING);
+
+	      }
+	      else {
+		strncpy(chrDevice,"WAVEAUDIO", sizeof(chrDevice) - 1);
+		/* Start audio file */
+		sprintf(chrCommand,"open \"%s\"  type %s alias wave%p SHAREABLE wait",name, chrDevice, thisPtr);
+		rc = mciSendString( chrCommand, retMsg, sizeof(retMsg), hwnd, 0);
+		if((rc & 0x0000ffff)!=MCIERR_SUCCESS) {
+		  WinPostMsg(hwnd,WM_QUIT,0,0);
+		  return MRFALSE;
+		}
+  
+		/* Set time format */
+		sprintf(chrCommand,"SET wave%p TIME FORMAT MILLISECONDS wait", thisPtr);
+		rc = mciSendString(chrCommand, retMsg, sizeof(retMsg), 0, 0);
+		if((rc & 0x0000ffff)!=MCIERR_SUCCESS) {
+		  WinPostMsg(hwnd, WM_APPTERMINATENOTIFY, MPFROMLONG(ACKEY_STOP), MPFROMP(thisPtr));
+		  return MRFALSE;
+		}
+		      
+		sprintf(chrCommand,"STATUS wave%p LENGTH WAIT", thisPtr);
+		rc = mciSendString(chrCommand, retMsg, sizeof(retMsg), 0, 0);
+		if((rc & 0x0000ffff)!=MCIERR_SUCCESS) {
+		  WinPostMsg(hwnd, WM_APPTERMINATENOTIFY, MPFROMLONG(ACKEY_STOP), MPFROMP(thisPtr));
+		  return MRFALSE;
+		}
+		      
+		iTime=atoi(retMsg);
+		      
+		//   sprintf(chrCommand,"SETPOSITIONADVISE wave%p ON EVERY %d NOTIFY", thisPtr, 3000);
+		//   rc = mciSendString(chrCommand, retMsg, sizeof(retMsg), hwnd, 0);
+		      
+		if(iTime>1100)
+		  iTime-=700;
+		else
+		  iTime-=300;
+		      
+		if(iTime<=0)
+		  iTime=100;
+		      
+		sprintf(chrCommand,"SETCUEPOINT wave%p ON at %d WAIT", thisPtr, iTime);
+		rc = mciSendString(chrCommand, retMsg, sizeof(retMsg), hwnd, 0);
+		if((rc & 0x0000ffff)!=MCIERR_SUCCESS) {
+		  WinPostMsg(hwnd, WM_APPTERMINATENOTIFY, MPFROMLONG(ACKEY_STOP), MPFROMP(thisPtr));
+		  return MRFALSE;
+		}
+		  
+		/* Set volume */
+		sprintf(chrCommand,"SET wave%p AUDIO VOLUME %d wait", thisPtr, globalClassVolume);
+		rc = mciSendString(chrCommand, retMsg, sizeof(retMsg), 0, 0);
+		/* Not able to set the volume isn't that bad so don't quit in case of an error. */
+  #if 0
+		if((rc & 0x0000ffff)!=MCIERR_SUCCESS) {
+		  WinPostMsg(hwnd, WM_APPTERMINATENOTIFY, MPFROMLONG(ACKEY_STOP), MPFROMP(thisPtr));
+		  return MRFALSE;
+		}
+  #endif
+  
+		WinStartTimer(WinQueryAnchorBlock(hwnd), hwnd, 1, 100);
+		      
+		sprintf(chrCommand,"play wave%p ", thisPtr);
+		rc = mciSendString(chrCommand, retMsg, sizeof(retMsg), 0, 0);
+		if((rc & 0x0000ffff)!=MCIERR_SUCCESS) {
+		  WinPostMsg(hwnd, WM_APPTERMINATENOTIFY, MPFROMLONG(ACKEY_STOP), MPFROMP(thisPtr));
+		  return MRFALSE;
+		}
+		      
+		/* Set Time in icon title to 00:00 */
+		strncpy(chrCommand, _wpQueryTitle(thisPtr), CCHMAXPATH);
+                s = strchr(chrCommand, '\n');
+                if (s)
+                  *s = 0;
+		if(_ulPlaySecs) {
+		  sprintf(retMsg, "%02d:%02d", _ulPlaySecs/60, _ulPlaySecs%60);                  
+		  strncat(chrCommand,"\n00:00 / ",sizeof(chrCommand)-1-strlen(chrCommand));
+		  strncat(chrCommand, retMsg,sizeof(chrCommand)-1-strlen(chrCommand));
+		}
+		else
+		  strncat(chrCommand,"\n00:00", sizeof(chrCommand)-1-strlen(chrCommand));
+  
+		_cwmmSetRecordTitles(thisPtr, chrCommand, FALSE);
+		WinStartTimer(WinQueryAnchorBlock(hwnd), hwnd, 1, 1000);
+		__set_ulTrackStatus( thisPtr,TRACK_STATUS_PLAYING);
+	      }
+	      break;
+            }/* somIsObj(thisPtr) */
+          }
+        else
+          {
+            MMAudio * thisPtr;
+
+            /* Don't use parameter block here (see AVKEY_PLAY handling). The param is
+             indeed somSelf. */
+            thisPtr=(MMAudio *)PVOIDFROMMP(mp2);/* Get object ptr */
+            if(somIsObj(thisPtr)) {
+              switch(LONGFROMMP(mp1))
+                {
+                case ACKEY_VOLUME:
+                  {
+                    HWND globalHwndObjectPlay;
+                    unsigned char chrCommand[CCHMAXPATH];
+                    char retMsg[20];
+
+                    /* Set volume */
+                    sprintf(chrCommand,"SET wave%p AUDIO VOLUME %d ", thisPtr, globalClassVolume);
+                    mciSendString(chrCommand, retMsg, sizeof(retMsg), 0, 0);
+                    /* Not able to set the volume isn't that bad so don't quit in case of an error. */
+                    break;
+                  }
+                case ACKEY_STOP:
+                  {
+                    /* Stop playing */
+                    unsigned char chrCommand[CCHMAXPATH];
+                    char retMsg[20];
+
+                    WinStopTimer(WinQueryAnchorBlock(hwnd),hwnd,1 );
+                    
+                    sprintf(chrCommand,"stop wave%p wait", thisPtr);
+                    mciSendString(chrCommand, retMsg, sizeof(retMsg), 0, 0);
+                    
+                    sprintf(chrCommand,"close wave%p wait", thisPtr);
+                    mciSendString(chrCommand, retMsg, sizeof(retMsg), 0, 0);
+                    
+                    __set_ulTrackStatus(thisPtr, TRACK_STATUS_STOPPED);
+                    WinPostMsg(hwnd,WM_QUIT,0,0);
+                    break;
+                  }
+                case ACKEY_PAUSE:
+                  {
+                    unsigned char chrCommand[CCHMAXPATH];
+                    char retMsg[20];
+                    APIRET rc;
+                    
+                    sprintf(chrCommand,"STATUS wave%p MODE WAIT", thisPtr);
+                    rc = mciSendString(chrCommand, retMsg, sizeof(retMsg), 0, 0);
+                    if((rc & 0x0000ffff)!=MCIERR_SUCCESS) {
+                      WinPostMsg(hwnd, WM_APPTERMINATENOTIFY, MPFROMLONG(ACKEY_STOP), MPFROMP(thisPtr));
+                      return MRFALSE;
+                    }
+                    
+                    if(!stricmp(retMsg, "playing"))
+                      {
+                        sprintf(chrCommand,"PAUSE wave%p wait", thisPtr);
+                        rc=mciSendString(chrCommand, retMsg, sizeof(retMsg), 0, 0);
+                        if((rc & 0x0000ffff)!=MCIERR_SUCCESS) {
+                          WinPostMsg(hwnd, WM_APPTERMINATENOTIFY, MPFROMLONG(ACKEY_STOP), MPFROMP(thisPtr));
+                          return MRFALSE;
+                        }
+                        __set_ulTrackStatus(thisPtr, TRACK_STATUS_PAUSED);
+                      }
+                    break;
+                  }
+                case ACKEY_RESUME:
+                  {
+                    unsigned char chrCommand[CCHMAXPATH];
+                    char retMsg[20];
+                    APIRET rc;
+                    
+                    sprintf(chrCommand,"STATUS wave%p MODE WAIT", thisPtr);
+                    rc = mciSendString(chrCommand, retMsg, sizeof(retMsg), 0, 0);
+                    if((rc & 0x0000ffff)!=MCIERR_SUCCESS) {
+                      WinPostMsg(hwnd, WM_APPTERMINATENOTIFY, MPFROMLONG(ACKEY_STOP), MPFROMP(thisPtr));
+                      return MRFALSE;
+                    }
+                                        
+                    if(!stricmp(retMsg, "paused"))
+                      {
+                        sprintf(chrCommand,"RESUME wave%p wait", thisPtr);
+                        rc=mciSendString(chrCommand, retMsg, sizeof(retMsg), 0, 0);
+                        if((rc & 0x0000ffff)!=MCIERR_SUCCESS) {
+                          WinPostMsg(hwnd, WM_APPTERMINATENOTIFY, MPFROMLONG(ACKEY_STOP), MPFROMP(thisPtr));
+                          return MRFALSE;
+                        }
+                        __set_ulTrackStatus(thisPtr, TRACK_STATUS_PLAYING);
+                      }
+                    break;
+                  }
+                default:
+                  break;
+                }
+            }/* if(thisPtr) */
+            return MRFALSE;
+          }
+      }
+      //case MM_MCIPOSITIONCHANGE:
+    case WM_TIMER:
+      if(SHORT1FROMMP(mp1)==1) {
+        MMAudio * thisPtr;
+        OPENPARAMS * pParams;
+
+        pParams=(OPENPARAMS*)WinQueryWindowULong(hwnd, QWL_USER);
+        thisPtr=pParams->wpObject;
+
+        if(somIsObj(thisPtr)) {
+          char retMsg[50] = {0};
+          unsigned char chrCommand[CCHMAXPATH+20] = {0};
+          APIRET rc;
+          ULONG ulCur;
+          MMAudioData *somThis = MMAudioGetData(thisPtr);
+          char *s;
+
+          /*@@CHANGE 0.2.8:
+
+            Added check for hwndCnr==NULL, audio objects stopped playing after a second if not started from a folder.
+            */
+          /* Check if folder closed. If yes stop playing */
+          if(pParams->hwndCnr && !WinIsWindow(globalHab, pParams->hwndCnr)) {
+            WinPostMsg(hwnd, WM_APPTERMINATENOTIFY, MPFROMLONG(ACKEY_STOP), MPFROMP(thisPtr));
+            return MRFALSE;
+          }
+          /* Get current play position */
+          sprintf(chrCommand,"STATUS wave%p POSITION WAIT", thisPtr);
+          rc = mciSendString(chrCommand, retMsg, sizeof(retMsg), 0, 0);
+          if((rc & 0x0000ffff)!=MCIERR_SUCCESS) {
+            return MRFALSE;
+          }
+
+          ulCur=atoi(retMsg);
+          if(ulCur) {
+           ulCur/=1000;
+           if(!ulCur)
+             ulCur=1;
+          }
+
+          strncpy(chrCommand, _wpQueryTitle(thisPtr), CCHMAXPATH);
+    	  s = strchr(chrCommand, '\n');
+	      if (s)
+	       *s = 0;
+	  strncat(chrCommand,"\n",sizeof(chrCommand)-1-strlen(chrCommand));
+          if(_ulPlaySecs) {
+            sprintf(retMsg, "%02d:%02d / %02d:%02d", ulCur/60, ulCur%60, _ulPlaySecs/60, _ulPlaySecs%60);
+            strncat(chrCommand, retMsg,sizeof(chrCommand)-1-strlen(chrCommand));
+          }
+          else
+            {
+            sprintf(retMsg, "%02d:%02d", ulCur/60, ulCur%60);
+            strncat(chrCommand, retMsg,sizeof(chrCommand)-1-strlen(chrCommand));
+            }
+          if(_cwmmQueryTrackStatus(thisPtr)==TRACK_STATUS_PAUSED) {
+            if(!getMessage(retMsg,  IDSTR_TRACKPAUSED, sizeof(retMsg), queryResModuleHandle(), HWND_DESKTOP))
+              strcpy(retMsg," (Paused)");
+            strncat(chrCommand, retMsg,sizeof(chrCommand)-1-strlen(chrCommand));
+          }
+          /* Set new time in icon title */
+          _cwmmSetRecordTitles(thisPtr, chrCommand, FALSE);
+        }
+        return MRFALSE;
+      }
+      break;
+    case MM_MCICUEPOINT:
+      {
+        /***********************************************/
+        /* The track is about to end                   */
+        /***********************************************/
+        MMAudio * thisPtr;
+        OPENPARAMS * pParams;
+        pParams=(OPENPARAMS*)WinQueryWindowULong(hwnd, QWL_USER);
+        thisPtr=pParams->wpObject;
+
+        if(somIsObj(thisPtr)) {
+          unsigned char chrCommand[CCHMAXPATH];
+          char retMsg[20];
+
+          sprintf(chrCommand,"STATUS wave%p MODE WAIT", thisPtr);
+          do {
+            APIRET rc;
+            retMsg[0]=0;
+            DosSleep(100);
+            rc = mciSendString(chrCommand, retMsg, sizeof(retMsg), 0, 0);
+            if((rc & 0x0000ffff)!=MCIERR_SUCCESS) {
+              WinPostMsg(hwnd, WM_APPTERMINATENOTIFY, MPFROMLONG(ACKEY_STOP), MPFROMP(thisPtr));
+
+              return MRFALSE;
+            }
+            //HlpWriteToTrapLog("%s\n", retMsg);
+          } while(!stricmp(retMsg, "playing"));
+          /* The track ended. Call 'Stop' so the object title is updated and everything is cleaned up. 
+             During handling of the 'Stop' message the WM_QUIT message will be posted to end the thread. */
+          WinPostMsg(hwnd, WM_APPTERMINATENOTIFY, MPFROMLONG(ACKEY_STOP), MPFROMP(thisPtr));
+        }
+        return MRFALSE;
+      }
+    default:
+      break;
+    }
+  return WinDefWindowProc( hwnd, msg, mp1, mp2);
+}
+
+/************************************************************/
+/*                                                          */
+/* This thread is used to handle the object in use emphasis.*/
+/* Playing starts on the object window proc.                */
+/*                                                          */
+/************************************************************/
+void _Optlink playThreadFunc (void *arg)
+{
+  HAB  hab;
+  HMQ  hmq;
+  QMSG qmsg;
+  OPENPARAMS * params;
+  CWMMDataFile *thisPtr;
+  BOOL bCntDecremented=FALSE; /* Flag telling if the play counter was decremented so another audio file may be started. */
+
+  params=(OPENPARAMS*)arg;
+  if(!params) {
+    iRunningAudioFiles--;
+    if(iRunningAudioFiles<0)
+      iRunningAudioFiles=0;/* Should never happen... */
+    return;
+  }
+
+  thisPtr=params->wpObject; 
+  if(!somIsObj(thisPtr)) {
+    iRunningAudioFiles--;
+    if(iRunningAudioFiles<0)
+      iRunningAudioFiles=0;/* Should never happen... */
+    _wpFreeMem(thisPtr, (PBYTE)params);
+    return;
+  }
+
+  /* Prevent starting of several audio files at the same time */
+  //if(iRunningAudioFiles<MAX_AUDIOFILE_STARTS+1) { 
+    hab=WinInitialize(0);
+    if(hab) {
+      hmq=WinCreateMsgQueue(hab,0);
+      if(hmq) {
+        HWND hwnd;
+        BOOL notFound;
+
+        if(somIsObj(thisPtr)) {
+          params->useItem.type=USAGE_OPENVIEW;
+          params->viewItem.handle=NULLHANDLE;
+          
+          /* Create an invisible object window */
+          hwnd=WinCreateWindow(HWND_OBJECT,WC_STATIC,"playObj", 0, 0, 0, 0, 0, 
+                               NULLHANDLE, HWND_BOTTOM,12343,NULL,NULL);
+          if(hwnd) {
+            /* Window created. */
+            /* Set in use emphasis for object */
+            _wpAddToObjUseList(thisPtr, &params->useItem);
+
+            /* Subclass the object window with the audio object private window proc.
+               Every audio pbject has to set this in order to manage start/stop/resume command.
+               It's usually done in MMAudio::wpInitData().  */
+            WinSubclassWindow(hwnd, _cwmmQueryObjWindowProc(thisPtr));
+            //SysWriteToTrapLog("WinSubclassWindow() returned: %x\n_cwmmQueryObjWindowProc() returns: %x\nplayObjectProc: %x\n",
+            //WinSubclassWindow(hwnd, _cwmmQueryObjWindowProc(thisPtr)), _cwmmQueryObjWindowProc(thisPtr),playObjectProc);
+
+            //  DosSetPriority(PRTYS_THREAD, PRTYC_FOREGROUNDSERVER, 0, 0);
+            
+            /* Tell the window proc to start the file */
+            WinPostMsg(hwnd, WM_APPTERMINATENOTIFY, MPFROMLONG(ACKEY_START), MPFROMP(params));
+
+            /* Save object window pointer in instance data */
+            __set_hwndObjectPlay(thisPtr, hwnd);
+            /* Needed for volume setting */
+            globalHwndObjectPlay=hwnd;
+            globalObjectPlay=thisPtr;
+
+            while(WinGetMsg(hab,&qmsg,(HWND)NULL,0,0))
+              WinDispatchMsg(hab,&qmsg);
+            WinDestroyWindow(hwnd);
+            _cwmmSetRecordTitles(thisPtr, NULLHANDLE, FALSE);
+          }
+          if(somIsObj(thisPtr)) {
+            /* Remove in use emphasis */
+            _wpDeleteFromObjUseList(thisPtr, &params->useItem);
+
+            __set_hwndObjectPlay(thisPtr, NULLHANDLE);
+
+            _wpSetDefaultView(thisPtr, __get_ulPreviousView(thisPtr));
+          }/* somIsObj() */
+
+          iRunningAudioFiles--;
+          if(iRunningAudioFiles<0)
+            iRunningAudioFiles=0;/* Should never happen... */
+          bCntDecremented=TRUE;
+
+          /* The track ended. Check if there're other tracks selected in
+             the container. If yes, start the next track. */
+          notFound=TRUE;
+          for(;;)
+            {
+              PMINIRECORDCORE pMrc, mrcTemp;
+              OPENPARAMS * pParams;
+              WPObject * contentObject;
+              SOMClass *cwAudioClass=somGetSomClass("MMAudio");
+        
+              pParams=params;
+        
+              /* Get MINIRECORDCORE */
+              if(!(pMrc=_wpQueryCoreRecord(thisPtr)))
+                break;
+
+              if(!WinIsWindow(WinQueryAnchorBlock(HWND_DESKTOP), pParams->hwndCnr))
+                break; /* Container isn't valid. Probably the folder was closed. */
+
+              /* Remove selected state if any */
+              WinSendMsg(pParams->hwndCnr, CM_SETRECORDEMPHASIS, MPFROMP(pMrc), MPFROM2SHORT(FALSE, CRA_SELECTED));
+
+              /* Get next selected audio file */
+              mrcTemp=(PMINIRECORDCORE)WinSendMsg(pParams->hwndCnr,CM_QUERYRECORDEMPHASIS, pMrc,
+                                                  MPFROMSHORT(CRA_SELECTED));
+              if((int)mrcTemp==-1) 
+                /* Wrong parameter -> user deleted the shadow. */
+                break;
+        
+              /* No selected files after the currently playing one. So start at the beginnning of the
+                 container. */
+              if(!mrcTemp)
+                mrcTemp=(PMINIRECORDCORE)WinSendMsg(pParams->hwndCnr,CM_QUERYRECORDEMPHASIS, (MPARAM)CMA_FIRST,
+                                                    MPFROMSHORT(CRA_SELECTED));
+
+              while(notFound && mrcTemp && (int)mrcTemp!=-1){
+                contentObject=(WPObject*)OBJECT_FROM_PREC(mrcTemp);//Get object
+                if(somIsObj(contentObject)) {
+                  /* Get file system object or NULL */
+                  if((contentObject=somGetFileSystemObject(contentObject))==NULLHANDLE) {
+                    mrcTemp=(PMINIRECORDCORE)WinSendMsg(pParams->hwndCnr,CM_QUERYRECORDEMPHASIS, mrcTemp,
+                                                        MPFROMSHORT(CRA_SELECTED));
+                    continue;
+                  }
+                }
+                else
+                  break;/* Error */
+          
+                if(_somIsA(contentObject, cwAudioClass)) {
+                  notFound=FALSE;
+                }
+                else
+                  {
+                    /* Try next object */
+                    mrcTemp=(PMINIRECORDCORE)WinSendMsg(pParams->hwndCnr,CM_QUERYRECORDEMPHASIS, mrcTemp,
+                                                        MPFROMSHORT(CRA_SELECTED));
+                  }
+              }; /* while */
+              if(notFound)
+                break;
+              /* Another audio file is selected. Start it. */
+              _wpViewObject(contentObject, params->hwndCnr, ID_MENU_START, NULLHANDLE);
+              break;
+            }; /* for() */
+          /* FIXME
+             Get thread sync right.
+
+             Set global handle to NULL if no more files to play. Doing it this way we prevent a race condition
+             with the newly started thread. Not really nice but simple. A mutex wouldn't help because we must
+             prevent that this ending thread overwrites the handle which may be set by the newly started thread. */
+          if(notFound) {
+            globalHwndObjectPlay=NULLHANDLE;
+            globalObjectPlay=NULLHANDLE;
+          }
+        }/* somIsObj() */
+        WinDestroyMsgQueue(hmq);
+      }
+      WinTerminate(hab);
+    }/* hab */
+    //  }/* iRunningAudioFiles */
+
+    if(!bCntDecremented) {
+      iRunningAudioFiles--;
+      if(iRunningAudioFiles<0)
+        iRunningAudioFiles=0;/* Should never happen... */
+    }
+  /* Free the parameter block */
+  _wpFreeMem(thisPtr, (PBYTE)params);
+}
+
+/****************************************************************/
+/*                                                              */
+/* New method which starts playing of the file. Playing is done */
+/* on a separate thread.                                        */
+/*                                                              */
+/****************************************************************/
+/*!*******************************************************/
+/*                                                       */
+/* @@DESC                                                */
+/*                                                       */
+/* This instance method is called to allow the object    */
+/* to start or stop audio playing.                       */
+/*                                                       */
+/*                                                       */
+/* @@USAGE                                               */
+/*                                                       */
+/* This method can be called at any time in order to     */
+/* start or stop playing.                                */
+/* :p.                                                   */
+/* The audio file is played on a separate thread. In use */
+/* emphasis is applied and the current playing time      */
+/* will be shown in the objects title.                   */
+/*                                                       */
+/* @@PARAM                                               */
+/*                                                       */
+/* MMAudio *somSelf input                                */
+/*                                                       */
+/* Pointer to the object on which the method is being    */
+/* invoked.                                              */
+/* :p.                                                   */
+/* Points to an object of class :hp2.MMAudio:ehp2..      */
+/*                                                       */
+/* @@PARAM                                               */
+/*                                                       */
+/* HWND hwndCnr input                                    */
+/*                                                       */
+/* Handle of the container which holds the object.       */
+/*                                                       */
+/* @@PARAM                                               */
+/*                                                       */
+/* BOOL bPlay input                                      */
+/*                                                       */
+/* Start/stop flag.                                      */
+/* :p.                                                   */
+/* If TRUE the object will start playing.                */
+/* :p.                                                   */
+/* If FALSE a playing object stops playing.              */
+/*                                                       */
+/* @@OVERRIDE                                            */
+/*                                                       */
+/* This method is usually not overriden.                 */
+/*                                                       */
+/* @@REMARKS                                             */
+/*                                                       */
+/* This method does not have a return value.             */
+/* The only way to check if the method succeeded is      */
+/* to use the method cwmmQueryTrackStatus().             */
+/* :p.                                                   */
+/* This is because control is given to a new thread      */
+/* and it's not clear at which time this new thread will */
+/* start execution.                                      */ 
+/*                                                       */
+/*!!******************************************************/
+SOM_Scope void  SOMLINK cwaudio_cwmmPlayTrack(MMAudio* somSelf, 
+                                              HWND hwndCnr, BOOL bPlay)
+{
+  ULONG ulError;
+  OPENPARAMS *pThreadParams;
+
+    MMAudioMethodDebug("MMAudio","cwaudio_cwmmPlayTrack");
+
+    if(bPlay) { /* Start playing */
+      /* Check if there's a valid object window for handling the play messages. */
+      if(!WinIsWindow(WinQueryAnchorBlock(HWND_DESKTOP),__get_hwndObjectPlay(somSelf))) {
+        /* Start playing only if there's not an object window yet. This is only
+           a sanity check. If there's already an object window the track already is
+           started.
+           */
+        pThreadParams=(OPENPARAMS*)_wpAllocMem(somSelf, sizeof(OPENPARAMS), &ulError);
+        if(pThreadParams) {
+          char chrTitle[CCHMAXPATH];
+          char chrText[100];
+
+          strncpy(chrTitle, _wpQueryTitle(somSelf), sizeof(chrTitle));
+          chrTitle[sizeof(chrTitle)-1]=0;
+	  if(!getMessage(chrText, IDSTR_STARTINGTRACK, sizeof(chrText), queryResModuleHandle(), HWND_DESKTOP)) {
+	    strcpy(chrText, "Starting Track...");
+          }
+          strncat(chrTitle,"\n", sizeof(chrTitle)-1-strlen(chrTitle));
+          strncat(chrTitle, chrText, sizeof(chrTitle)-1-strlen(chrTitle));
+
+          memset((void*)pThreadParams ,0, sizeof(OPENPARAMS));
+          pThreadParams->wpObject=somSelf;
+          pThreadParams->hwndCnr=hwndCnr;
+          pThreadParams->viewItem.view=ID_MENU_START;
+          if(_beginthread(playThreadFunc,NULL,8192*160,(void*)pThreadParams)) //Fehlerbehandlung fehlt
+            _cwmmSetRecordTitles(somSelf, chrTitle, FALSE);
+        }
+      }
+    }
+    else /* Stop playing. */
+      if(WinIsWindow(WinQueryAnchorBlock(HWND_DESKTOP),__get_hwndObjectPlay(somSelf)))
+        WinPostMsg(__get_hwndObjectPlay(somSelf), WM_APPTERMINATENOTIFY, MPFROMLONG(ACKEY_STOP), MPFROMP(somSelf));
+}
+
+
+
+/*
+  This method is called to pause a playing track from the context menu.
+*/
+/*
+ *    LONG  cwmmSetTrackVolume(in ULONG ulVolume);
+ *    LONG  cwmmQueryTrackVolume();
+ */
+
+/*
+ *    LONG  cwmmSetTrackVolume(in ULONG ulVolume);
+ *    LONG  cwmmQueryTrackVolume();
+ * Local filesize info to check if someone altered the file. Attribute because MMMP3 needs this info.
+ */
+/*!*******************************************************/
+/*                                                       */
+/* @@DESC                                                */
+/*                                                       */
+/* This instance method is called to allow the object    */
+/* to pause or resume audio playing.                     */
+/*                                                       */
+/*                                                       */
+/* @@USAGE                                               */
+/*                                                       */
+/* This method can be called at any time in order to     */
+/* control playing.                                      */
+/*                                                       */
+/* @@PARAM                                               */
+/*                                                       */
+/* MMAudio *somSelf input                                */
+/*                                                       */
+/* Pointer to the object on which the method is being    */
+/* invoked.                                              */
+/* :p.                                                   */
+/* Points to an object of class :hp2.MMAudio:ehp2..      */
+/*                                                       */
+/* @@PARAM                                               */
+/*                                                       */
+/* HWND hwndCnr input                                    */
+/*                                                       */
+/* Handle of the container which holds the object.       */
+/*                                                       */
+/* @@PARAM                                               */
+/*                                                       */
+/* ULONG ulAction input                                  */
+/*                                                       */
+/* Pause/resume.                                         */
+/* :parml compact tsize=25 break=none.                   */
+/* :pt.ACKEY_PAUSE:pd.The object will pause playing.     */
+/* :pt.ACKEY_RESUME:pd.A currently pausing object        */
+/* resumes playing.                                      */
+/* :eparml.                                              */
+/* @@OVERRIDE                                            */
+/*                                                       */
+/* This method is usually not overriden.                 */
+/*                                                       */
+/* @@REMARKS                                             */
+/*                                                       */
+/* This method does not have a return value.             */
+/* Use the method cwmmQueryTrackStatus() to check the    */ 
+/* current state of the audio object.                    */
+/*                                                       */
+/*                                                       */
+/*                                                       */
+/*!!******************************************************/
+SOM_Scope void  SOMLINK cwaudio_cwmmPauseTrack(MMAudio *somSelf, 
+                                               HWND hwndCnr, 
+                                               ULONG ulAction)
+{
+  /*    CWMMDataFileData *somThis = CWMMDataFileGetData(somSelf);*/
+    MMAudioMethodDebug("MMAudio","cwaudio_cwmmPauseTrack");
+    
+    if(_cwmmQueryTrackStatus(somSelf)==TRACK_STATUS_STOPPED)
+      return;
+
+    switch(ulAction)
+      {
+      case ACKEY_PAUSE:
+
+        /* Already paused? Shouldn't happen but I've seen it. */
+        if(_cwmmQueryTrackStatus(somSelf)==TRACK_STATUS_PAUSED)
+          return;
+
+        /* Post a message to the object window handling the commands. */
+        if(WinIsWindow(WinQueryAnchorBlock(HWND_DESKTOP),__get_hwndObjectPlay(somSelf)))
+          WinPostMsg(__get_hwndObjectPlay(somSelf), WM_APPTERMINATENOTIFY, MPFROMLONG(ulAction), MPFROMP(somSelf));
+
+        break;
+      case ACKEY_RESUME:
+
+        if(_cwmmQueryTrackStatus(somSelf)==TRACK_STATUS_PLAYING)
+          return;
+
+        if(WinIsWindow(WinQueryAnchorBlock(HWND_DESKTOP), __get_hwndObjectPlay(somSelf)))
+          WinPostMsg(__get_hwndObjectPlay(somSelf), WM_APPTERMINATENOTIFY, MPFROMLONG(ulAction), MPFROMP(somSelf));
+        break;
+      default:
+        break;
+      }
+}
+
+#if 0
+SOM_Scope long  SOMLINK cwaudio_cwmmSetTrackVolume(MMAudio *somSelf, 
+                                                   ULONG ulVolume)
+{
+    MMAudioData *somThis = MMAudioGetData(somSelf);
+    MMAudioMethodDebug("MMAudio","cwaudio_cwmmSetTrackVolume");
+
+    /* Return statement to be customized: */
+    return -1;
+}
+
+SOM_Scope long  SOMLINK cwaudio_cwmmQueryTrackVolume(MMAudio *somSelf)
+{
+    MMAudioData *somThis = MMAudioGetData(somSelf);
+    MMAudioMethodDebug("MMAudio","cwaudio_cwmmQueryTrackVolume");
+
+    /* Return statement to be customized: */
+    return -1;
+}
+#endif
+
+/****************************************************************/
+/*
+  Two new settings pages are added to every audio object:
+  
+  -Audio information showing playtime samplerate and so on.
+  -Track information for editing artist name, album name and so
+   on.
+  
+  */
+/****************************************************************/
+SOM_Scope BOOL  SOMLINK cwaudio_wpAddSettingsPages(MMAudio *somSelf, 
+                                                   HWND hwndNotebook)
+{
+  BOOL rc;
+
+  /*  MMAudioData *somThis = MMAudioGetData(somSelf);*/
+    MMAudioMethodDebug("MMAudio","cwaudio_wpAddSettingsPages");
+
+
+    rc= (MMAudio_parent_CWMMDataFile_wpAddSettingsPages(somSelf, hwndNotebook));
+
+    /* Only insert trackname page if object isn't on CD. CDs don't support EAs so this page
+       would be useless. */
+    if(!cwObjectIsOnCD(somSelf))
+      return rc | _cwmmAddAudioInformationPage(somSelf, hwndNotebook)|
+        _cwmmAddTrackNamePage(somSelf, hwndNotebook);
+    else
+      return rc | _cwmmAddAudioInformationPage(somSelf, hwndNotebook);
+
+}
+
+/*
+ * The prototype for cwaudio_wpQueryDetailsData was replaced by the following prototype:
+ */
+SOM_Scope ULONG  SOMLINK cwaudio_wpQueryDetailsData(MMAudio *somSelf, 
+                                                    PVOID* ppDetailsData, 
+                                                    PULONG pcp)
+{
+  BOOL rcParent;
+  PAUDIODETAILS pAudioDetails;
+    MMAudioData *somThis = MMAudioGetData(somSelf);
+    MMAudioMethodDebug("MMAudio","cwaudio_wpQueryDetailsData");
+
+    /* Call parent */
+    rcParent= (MMAudio_parent_CWMMDataFile_wpQueryDetailsData(somSelf, 
+                                                      ppDetailsData, 
+                                                      pcp));
+
+  /* The WPS asks for data to be displayed */
+  if(ppDetailsData)
+    {
+      /* Fill the structure with the info to be displayed */      
+      pAudioDetails=(PAUDIODETAILS)*ppDetailsData;  
+      pAudioDetails->pszPlayTime=_chrPlayTime;
+      pAudioDetails->pszBitRate=_chrBitRate;            /* New with 0.2.7 */
+      pAudioDetails->pszSampleRate=_chrSampleRate;
+      pAudioDetails->pszChannels=_chrChannels;
+      pAudioDetails->pszBPS=_chrBPS;
+
+      pAudioDetails->pszName=_pszName;
+      pAudioDetails->pszArtist=_pszArtist;
+      pAudioDetails->pszAlbum=_pszAlbum;
+      pAudioDetails->pszYear=_pszYear;
+      pAudioDetails->pszComment=_pszComment;
+      pAudioDetails->pszGenre=_pszGenre;
+
+#if 0
+      pAudioDetails->pszName=_id3Name;
+      pAudioDetails->pszArtist=_id3Artist;
+      pAudioDetails->pszAlbum=_id3Album;
+      pAudioDetails->pszYear=_id3Year;
+      pAudioDetails->pszComment=_id3Comment;
+      pAudioDetails->pszGenre=_id3Genre;
+#endif
+      *ppDetailsData=((PBYTE) (*ppDetailsData))+sizeof(*pAudioDetails);  
+    }
+  else
+    {
+      /* Buffer size is queried */
+      if(pcp)
+        *pcp+=sizeof(*pAudioDetails);
+    }
+    return rcParent;
+}
+
+
+/*
+ * The prototype for cwaudio_wpRestoreState was replaced by the following prototype:
+ */
+SOM_Scope BOOL  SOMLINK cwaudio_wpRestoreState(MMAudio *somSelf, 
+                                               ULONG ulReserved)
+{
+  BOOL bRc; 
+  char fName[CCHMAXPATH];
+  BOOL bReRead=FALSE;
+  ULONG ulError;
+  BOOL bIsMidi;
+  PBYTE pByte;
+
+   MMAudioData *somThis = MMAudioGetData(somSelf);
+    MMAudioMethodDebug("MMAudio","cwaudio_wpRestoreState");
+
+    bRc=(MMAudio_parent_CWMMDataFile_wpRestoreState(somSelf, ulReserved));
+
+    _bNeedSaving=FALSE;
+
+    /* Query the audio info */
+    if(!_wpRestoreLong(somSelf, "CWAudio", KEY_FILESIZE, &_ulFileSize))
+      bReRead=TRUE;
+    if(!_wpRestoreLong(somSelf, "CWAudio", KEY_TIME, &_ulPlaySecs))
+      bReRead=TRUE;
+    if(!_wpRestoreLong(somSelf, "CWAudio", KEY_CHANNELS, &_ulChannels))
+      bReRead=TRUE;
+    if(!_wpRestoreLong(somSelf, "CWAudio", KEY_SAMPLERATE, &_ulSampleRate))
+      bReRead=TRUE;
+    if(!_wpRestoreLong(somSelf, "CWAudio", KEY_BPS, &_ulBPS))
+      bReRead=TRUE;
+    if(!_wpRestoreLong(somSelf, "CWAudio", KEY_TIME_MS, &_ulPlayMsecs))
+      bReRead=TRUE;
+    if(!_wpRestoreLong(somSelf, "CWAudio", KEY_NUM_AUDIO_BYTES, &_ulNumAudioBytes))
+      bReRead=TRUE;
+
+    /* New with 0.2.7 */
+    if(EARestoreString(somSelf, "MMBITRATE", _chrBitRate, sizeof(_chrBitRate))) {
+      _ulBitRate=atol(_chrBitRate);
+    }
+    else {
+      //SysWriteToTrapLog("No EA for %s\n", _wpQueryTitle(somSelf));
+      bReRead=TRUE;
+    }
+    /* Get audiotrack info from EA */
+    if( (pByte=_wpAllocMem(somSelf, MAX_EA_SIZE, &ulError))!=NULLHANDLE)
+      {
+        _pszName=_readTrackInfoIntoMem(somSelf, "MMTRACKNAME" , pByte, MAX_EA_SIZE);
+        _pszArtist=_readTrackInfoIntoMem(somSelf, "MMARTIST" , pByte, MAX_EA_SIZE);
+        _pszAlbum=_readTrackInfoIntoMem(somSelf, "MMALBUM" , pByte, MAX_EA_SIZE);
+        _pszYear=_readTrackInfoIntoMem(somSelf, "MMYEAR" , pByte, MAX_EA_SIZE);
+        _pszComment=_readTrackInfoIntoMem(somSelf, "MMCOMMENT" , pByte, MAX_EA_SIZE);
+        _pszGenre=_readTrackInfoIntoMem(somSelf, "MMGENRE" , pByte, MAX_EA_SIZE);
+        _wpFreeMem(somSelf, pByte);
+      }
+
+#if 0
+    cwGetStringFromEA(somSelf, "MMTRACKNAME" , _id3Name, sizeof(_id3Name));
+    cwGetStringFromEA(somSelf, "MMARTIST" , _id3Artist, sizeof(_id3Artist));
+    cwGetStringFromEA(somSelf, "MMALBUM" , _id3Album, sizeof(_id3Album));
+    cwGetStringFromEA(somSelf, "MMYEAR" , _id3Year, sizeof(_id3Year));
+    cwGetStringFromEA(somSelf, "MMCOMMENT" , _id3Comment, sizeof(_id3Comment));
+    cwGetStringFromEA(somSelf, "MMGENRE" , _id3Genre, sizeof(_id3Genre));
+
+    sprintf(chrBuffer,"%d",_ulSampleRate);
+    cwSaveStringToEA(somSelf, "MMSAMPLERATE", chrBuffer);
+    sprintf(chrBuffer,"%d",_ulChannels);
+    cwSaveStringToEA(somSelf, "MMCHANNELS", chrBuffer);
+    sprintf(chrBuffer,"%d",_ulBPS);
+    cwSaveStringToEA(somSelf, "MMBPS", chrBuffer);
+    sprintf(chrBuffer,"%d",_ulPlaySecs);
+    cwSaveStringToEA(somSelf, "MMPLAYTIME", chrBuffer);
+    sprintf(chrBuffer,"%d",_ulPlayMsecs);
+    cwSaveStringToEA(somSelf, "MMPLAYTIMEMS", chrBuffer);
+#endif
+
+    if(_ulFileSize!=_wpQueryFileSize(somSelf))
+      bReRead=TRUE; /* The filesize changed, somebody altered the audio file so reread the info */
+
+    if(!_ulFileSize)
+      bReRead=FALSE;
+    /* If filesize=0 do nothing because the file was just created and there's no contents yet */
+ 
+    //if(cwObjectIsOnCD(somSelf) && bReRead) {
+    if(cwObjectIsOnInvalidDrive(somSelf)&& bReRead) {
+      /* Only get audio info when file isn't on CD. This speeds up opening of folders on CDs filled with
+         MP3s. Doesn't hurt because folders of CDs open in normal details view as default so the audio info
+         isn't necessary. When opening the settings notebook the info is reread anyway. */      
+      bReRead=FALSE;
+    }
+    bIsMidi=_somIsA(somSelf, somGetSomClass("MMMIDI"));
+    if(bReRead){
+      /* Some info changed or isn't present. Reread the audio information */
+
+      /* Send the object pointer to the audio worker thread to read the audio info in the background.
+         The audio worker thread was started during initialization of CWMMDataFile. 
+         */
+      //if((bIsMidi && !globalHaveTimidity) || !bIsMidi)
+        WinPostMsg(__get_hwndAudioWorker(_CWMMDataFile) , WM_APPTERMINATENOTIFY, somSelf, 0);
+
+      /* Set default values into instance vars */
+      if(bIsMidi)
+        {
+          /* MIDI files don't have this info. */
+          strncpy(_chrSampleRate, "---", sizeof(_chrSampleRate));      
+          strncpy(_chrBPS, "---", sizeof(_chrBPS));
+        }
+      else
+        {
+          strncpy(_chrSampleRate, "??", sizeof(_chrSampleRate));
+          strncpy(_chrBPS, "??", sizeof(_chrBPS));
+        }
+      strncpy(_chrBitRate, "---", sizeof(_chrBitRate));
+      strncpy(_chrChannels, "??", sizeof(_chrChannels));
+      strncpy(_chrPlayTime, "??:??", sizeof(_chrPlayTime));
+
+      _ulFileSize=0;
+      _ulPlaySecs=0;
+      _ulChannels=0;
+      _ulSampleRate=0;
+      _ulBitRate=0;
+      _ulBPS=0;
+      _ulPlayMsecs=0;
+      _ulNumAudioBytes=0;
+    }/* bReRead */
+    else {
+      /* No new reading necessary. Fill in the instance vars with the restored
+         data. */
+      sprintf(fName,"%d",_ulChannels);
+      strncpy(_chrChannels, fName, sizeof(_chrChannels));
+      
+      if(bIsMidi)
+        strncpy(_chrSampleRate, "---", sizeof(_chrSampleRate));      
+      else {
+        sprintf(fName,"%d", _ulSampleRate);
+        strncpy(_chrSampleRate, fName, sizeof(_chrSampleRate));      
+      }
+      
+      if(bIsMidi)
+        strncpy(_chrBPS, "---", sizeof(_chrBPS));
+      else {
+        sprintf(fName,"%d",_ulBPS);
+        strncpy(_chrBPS, fName, sizeof(_chrBPS));
+      }
+      /* Bitrate of MP3 files */
+      if(!_ulBitRate)
+        strncpy(_chrBitRate, "---", sizeof(_chrBitRate));
+      else {
+        sprintf(fName,"%d",_ulBitRate);
+        strncpy(_chrBitRate, fName, sizeof(_chrBitRate));
+      }
+
+      sprintf(fName,"%02d:%02d",_ulPlaySecs/60, _ulPlaySecs%60);
+      strncpy(_chrPlayTime, fName, sizeof(_chrPlayTime));
+    }
+    _chrChannels[sizeof(_chrChannels)-1]=0;
+    _chrSampleRate[sizeof(_chrSampleRate)-1]=0;
+    _chrBPS[sizeof(_chrBPS)-1]=0;
+    _chrPlayTime[sizeof(_chrPlayTime)-1]=0;
+
+    return bRc;
+}
+
+#if 0
+static void _printObjectInfo(WPObject * wpObject)
+{
+  char chrFileName[CCHMAXPATH];
+  ULONG       ulSize;
+  PSZ pszID;
+
+  ulSize=sizeof(chrFileName);
+  _wpQueryRealName(wpObject, chrFileName,&ulSize,TRUE);
+  SysWriteToTrapLog("Filename: %s \n", chrFileName);
+  SysWriteToTrapLog("Object is initialized: %d (TRUE/FALSE)\n", _wpIsObjectInitialized(wpObject));
+  SysWriteToTrapLog("Object style: %d 0x%x\n", _wpQueryStyle(wpObject), _wpQueryStyle(wpObject));
+  if((pszID=_wpQueryObjectID(wpObject))!=NULLHANDLE)
+    SysWriteToTrapLog("Object ID: %s\n\n", pszID);
+  else
+    SysWriteToTrapLog("Object ID: None\n\n");
+
+}
+#endif
+
+/*
+ * The prototype for cwaudio_wpSaveState was replaced by the following prototype:
+ */
+SOM_Scope BOOL  SOMLINK cwaudio_wpSaveState(MMAudio *somSelf)
+{
+  char chrBuffer[10];
+
+    MMAudioData *somThis = MMAudioGetData(somSelf);
+    MMAudioMethodDebug("MMAudio","cwaudio_wpSaveState");
+
+
+    if(_ulFileSize) {
+      _wpSaveLong(somSelf, "CWAudio", KEY_TIME,_ulPlaySecs);
+      _wpSaveLong(somSelf, "CWAudio", KEY_SAMPLERATE,_ulSampleRate);
+      _wpSaveLong(somSelf, "CWAudio", KEY_CHANNELS,_ulChannels);
+      _wpSaveLong(somSelf, "CWAudio", KEY_BPS,_ulBPS);
+      _wpSaveLong(somSelf, "CWAudio", KEY_FILESIZE,_ulFileSize);
+      _wpSaveLong(somSelf, "CWAudio", KEY_TIME_MS,_ulPlayMsecs);
+      _wpSaveLong(somSelf, "CWAudio", KEY_NUM_AUDIO_BYTES, _ulNumAudioBytes);
+    }
+
+#if 0
+    _printObjectInfo(somSelf);
+    cwSaveStringToEA(somSelf, "MMTRACKNAME", _pszName);
+  if(_wpQueryStyle(somSelf)!=0x10000) {
+    SysWriteToTrapLog("2 Template? %d \n", _wpQueryStyle(somSelf));
+#endif
+
+    /* Save audio info in EA for other programs */
+    cwSaveStringToEA(somSelf, "MMTRACKNAME", _pszName);
+    cwSaveStringToEA(somSelf, "MMARTIST", _pszArtist);
+    cwSaveStringToEA(somSelf, "MMALBUM", _pszAlbum);
+    cwSaveStringToEA(somSelf, "MMCOMMENT", _pszComment);
+    cwSaveStringToEA(somSelf, "MMYEAR", _pszYear);
+    cwSaveStringToEA(somSelf, "MMGENRE", _pszGenre);
+
+
+#if 0
+    cwSaveStringToEA(somSelf, "MMTRACKNAME", _id3Name);
+    cwSaveStringToEA(somSelf, "MMARTIST", _id3Artist);
+    cwSaveStringToEA(somSelf, "MMALBUM", _id3Album);
+    cwSaveStringToEA(somSelf, "MMCOMMENT", _id3Comment);
+    cwSaveStringToEA(somSelf, "MMYEAR", _id3Year);
+    cwSaveStringToEA(somSelf, "MMGENRE", _id3Genre);
+#endif
+
+    sprintf(chrBuffer,"%d",_ulSampleRate);
+    cwSaveStringToEA(somSelf, "MMSAMPLERATE", chrBuffer);
+    sprintf(chrBuffer,"%d",_ulChannels);
+    cwSaveStringToEA(somSelf, "MMCHANNELS", chrBuffer);
+    sprintf(chrBuffer,"%d",_ulBPS);
+    cwSaveStringToEA(somSelf, "MMBPS", chrBuffer);
+    sprintf(chrBuffer,"%d",_ulPlaySecs);
+    cwSaveStringToEA(somSelf, "MMPLAYTIME", chrBuffer);
+    sprintf(chrBuffer,"%d",_ulPlayMsecs);
+    cwSaveStringToEA(somSelf, "MMPLAYTIMEMS", chrBuffer);
+    sprintf(chrBuffer,"%d",_ulNumAudioBytes);
+    cwSaveStringToEA(somSelf, "MMNUMAUDIOBYTES", chrBuffer);
+
+    /* New with 0.2.7 */
+    sprintf(chrBuffer,"%d",_ulBitRate);
+    EASaveString(somSelf, "MMBITRATE", chrBuffer);
+#if 0
+  }
+#endif
+
+#if 0
+    cwGetStringFromEA(somSelf, "MMTRACKNAME" , chrBuf, sizeof(chrBuf));
+    HlpWriteToTrapLog("Value: %s\n", chrBuf);
+    cwGetStringFromEA(somSelf, "MMARTIST" , chrBuffer, sizeof(chrBuffer));
+    cwGetStringFromEA(somSelf, "MMALBUM" , chrBuffer, sizeof(chrBuffer));
+#endif
+
+#if 0
+    /* Set .TYPE EA so the editor and the player are happy. */
+    strncpy(chrBuf, _wpQueryType(somSelf), sizeof(chrBuf));
+    chrBuf[sizeof(chrBuf)-1]=0;
+
+    if(!strstr(chrBuf, TYPE_DIGITALAUDIO)) {
+      ulLength=strlen(chrBuf);
+      if(ulLength) {
+        if(ulLength+2+sizeof(TYPE_DIGITALAUDIO) < sizeof(chrBuf)) {
+          strcat(chrBuf, "\n");
+          strcat(chrBuf, TYPE_DIGITALAUDIO);
+        }
+      }
+      else
+        strcpy(chrBuf, TYPE_DIGITALAUDIO);      
+      /* Set .TYPE EA so the editor and the player are happy. */
+      _wpSetType(somSelf, chrBuf , NULL);
+    }
+#endif
+    //_wpSetType(somSelf, "Digital Audio" , NULL);
+    return (MMAudio_parent_CWMMDataFile_wpSaveState(somSelf));
+}
+
+/*
+  FIXME:
+
+  This function isn't thread safe because of one global memory area. It is supposed to be
+  called from the wpPopupMenu() method. This method can only be called once at
+  a time, so that's not a problem. It may become a problem if this function is also
+  called from somewhere else. The global mem pointer is used by the image class and the
+  audio class.
+
+  This function inserts only write enabled IO procedures into the menu.
+*/
+BOOL insertAudioIOProcMenuItems( HWND hwndMenu )
+{
+    CHAR          szBuffer[ sizeof( FOURCC ) + CCHMAXPATH + 4 ];
+    MMFORMATINFO  mmFormatInfo;
+    PMMFORMATINFO pmmFormatInfoArray;
+    ULONG         ulReturnCode;
+    LONG          lFormatsRead;
+    LONG          index;
+    LONG          lBytesRead;
+    HWND hwndSubMenu;
+    MENUITEM mi;
+    LONG          lNumIOProcs;
+
+    if(g_pmmFormatInfoArray)
+      free(g_pmmFormatInfoArray);
+    g_pmmFormatInfoArray=NULLHANDLE;
+
+    memset( &mmFormatInfo,
+            '\0',
+            sizeof(MMFORMATINFO) );
+    
+    mmFormatInfo.ulMediaType |= MMIO_MEDIATYPE_AUDIO;
+    mmFormatInfo.ulFlags|=MMIO_CANWRITETRANSLATED;/* FIXME: CANWRITEUNTRANSLATED???*/
+    ulReturnCode = mmioQueryFormatCount ( &mmFormatInfo,
+                                          &lNumIOProcs,
+                                          0,
+                                          0 );
+    
+    if( ulReturnCode != MMIO_SUCCESS )
+      {
+        /* Error - mmioQueryFormatCount failed. */
+        return FALSE;
+      }
+
+    /*
+     * Allocate enough memory for n number of FormatInfo blocks
+     */
+    g_pmmFormatInfoArray = malloc (lNumIOProcs * sizeof( MMFORMATINFO ) );
+    if( g_pmmFormatInfoArray == NULL )
+      {
+        /* Could not allocate enough memory for mmFormatInfo array. */
+        return FALSE;
+      }
+    
+    /*
+     * call mmioGetFormats to get info on the formats supported.
+     */
+    ulReturnCode = mmioGetFormats( &mmFormatInfo,
+                                   lNumIOProcs,
+                                   g_pmmFormatInfoArray,
+                                   &lFormatsRead,
+                                   0,
+                                   0 );
+    if( ulReturnCode != MMIO_SUCCESS )
+      {
+        /*
+         *  mmioGetFormats failed.
+         */
+        free(g_pmmFormatInfoArray);
+        g_pmmFormatInfoArray=NULLHANDLE;
+        return FALSE;
+      }
+    
+    if( lFormatsRead != lNumIOProcs )
+      {
+        /*
+         * Error in MMIO - number of formats read in by
+         * mmioGetFormats is not equal to number of formats
+         * found by mmioQueryFormatCount.
+         */
+        free(g_pmmFormatInfoArray);
+        g_pmmFormatInfoArray=NULLHANDLE;
+        return FALSE;
+      }
+
+    // Create Empty Submenu //
+    hwndSubMenu=WinCreateWindow(hwndMenu,WC_MENU,"",0,
+                                0,0,0,0,
+                                hwndMenu,//Owner. If set, this window 
+                                //is destroyed if owner is destroyed
+                                HWND_TOP,
+                                ID_MENU_CONVERT,//menuid
+                                NULL,NULL);
+
+    mi.iPosition=MIT_END;
+    mi.afStyle=MIS_TEXT;//|MIS_SUBMENU;
+    mi.id=ID_MENU_CONVERT;
+    mi.afAttribute=NULLHANDLE;    
+    mi.hwndSubMenu=NULLHANDLE;//hwndSubMenu;
+    mi.hItem=NULLHANDLE;
+    mi.hwndSubMenu=hwndSubMenu;
+
+    if(!getMessage(szBuffer, IDSTR_MENU_CONVERT, sizeof(szBuffer), queryResModuleHandle(), HWND_DESKTOP))
+       sprintf(szBuffer,"~Convert to");
+    WinSendMsg(hwndMenu,MM_INSERTITEM,(MPARAM)&mi,
+               (MPARAM)szBuffer);
+
+    pmmFormatInfoArray=g_pmmFormatInfoArray;
+    for ( index = 0; index <lNumIOProcs; index++ )
+      {
+	ulReturnCode = mmioGetFormatName(pmmFormatInfoArray, szBuffer, &lBytesRead, 0L, 0L);
+	if(ulReturnCode)
+	  {
+	  //SysWriteToTrapLog("IO-Proc 2: %s %u\n\n", szBuffer, ulReturnCode);
+	  continue;
+	  }
+        
+        /* Insert NULL string terminator */
+        *( szBuffer + lBytesRead ) = (CHAR)NULL;
+
+        /* Only write enabled IO procs are used in the convert menu.
+         */
+        if(pmmFormatInfoArray->ulFlags & MMIO_CANWRITETRANSLATED)
+          {
+            //  HlpWriteToTrapLog("IO-Proc 2: %s\n\n", szBuffer);
+            /* Add menu item */
+            /* Fill the MENUITEM structure */
+            mi.iPosition=MIT_END;
+            mi.afStyle=MIS_TEXT|MIS_SUBMENU;
+            mi.id=ID_ITEM_FIRSTCONVERT+index;/* Create menu id */
+            mi.afAttribute=NULLHANDLE;    
+            mi.hwndSubMenu=NULLHANDLE;//hwndSubMenu;
+            mi.hItem=NULLHANDLE;
+            WinSendMsg(hwndSubMenu, MM_INSERTITEM,(MPARAM)&mi,
+                       (MPARAM)szBuffer);
+          }
+        /*
+         *  advance to next entry in mmFormatInfo array
+         */
+        pmmFormatInfoArray++;
+      }
+    return TRUE;
+}
+
+
+/*
+ * The prototype for cwaudio_wpModifyPopupMenu was replaced by the following prototype:
+ */
+SOM_Scope BOOL  SOMLINK cwaudio_wpModifyPopupMenu(MMAudio *somSelf, 
+                                                  HWND hwndMenu, 
+                                                  HWND hwndCnr, 
+                                                  ULONG iPosition)
+{
+  BOOL rc;
+
+  MMAudioMethodDebug("MMAudio","cwaudio_wpModifyPopupMenu");
+
+    /* New Volume item */
+    _wpInsertPopupMenuItems(somSelf, hwndMenu, 1, queryResModuleHandle(), ID_MENU_VOLUME, 1);
+    /* Convert menu item */
+
+    /* Insert all known audio I/O procs */
+    TRY_LOUD(AUDIO_INSERTPOPUPMENU) {
+      insertAudioIOProcMenuItems( hwndMenu );
+    }/* TRY_LOUD */
+    CATCH(AUDIO_INSERTPOPUPMENU)
+      {
+        SysWriteToTrapLog("\nTrap occured in %s, file %s, near line %d.\n",
+                          __FUNCTION__, __FILE__, __LINE__);
+      } END_CATCH;
+
+      if(WinIsWindow(WinQueryAnchorBlock(HWND_DESKTOP),__get_hwndObjectPlay(somSelf))) {
+        if(_cwmmQueryTrackStatus(somSelf)==TRACK_STATUS_PAUSED)
+          _wpInsertPopupMenuItems(somSelf, hwndMenu, 1, queryResModuleHandle(), ID_MENU_RESUME, 1);
+        else
+          _wpInsertPopupMenuItems(somSelf, hwndMenu, 1, queryResModuleHandle(), ID_MENU_PAUSE, 1);
+        _wpInsertPopupMenuItems(somSelf, hwndMenu, 1, queryResModuleHandle(), ID_MENU_STOP, 1);
+      }
+    else
+      {
+        _wpInsertPopupMenuItems(somSelf, hwndMenu, 1, queryResModuleHandle(), ID_MENU_EDITOR, 1);
+        _wpInsertPopupMenuItems(somSelf, hwndMenu, 1, queryResModuleHandle(), ID_MENU_PLAYER, 1);
+        _wpInsertPopupMenuItems(somSelf, hwndMenu, 1, queryResModuleHandle(), ID_MENU_START, 1);
+      }
+    rc= (MMAudio_parent_CWMMDataFile_wpModifyPopupMenu(somSelf, 
+                                                       hwndMenu, 
+                                                       hwndCnr, 
+                                                       iPosition));
+    return rc;
+}
+
+
+/*
+ * The prototype for cwaudio_wpMenuItemSelected was replaced by the following prototype:
+ */
+SOM_Scope BOOL  SOMLINK cwaudio_wpMenuItemSelected(MMAudio *somSelf, 
+                                                   HWND hwndFrame, 
+                                                   ULONG ulMenuId)
+{
+  /*    MMAudioData *somThis = MMAudioGetData(somSelf);*/
+    MMAudioMethodDebug("MMAudio","cwaudio_wpMenuItemSelected");
+
+
+    if(ulMenuId>=ID_ITEM_FIRSTCONVERT && ulMenuId<=ID_ITEM_FIRSTCONVERT+lNumIOProcs-1)
+      {
+        char chrEditor[CCHMAXPATH]={0};
+        char chrParams[2*CCHMAXPATH]="\"";
+        char *chrPtr=chrParams;
+        ULONG ulSize;
+        ULONG ulRc;
+        
+        PrfQueryProfileString(HINI_USERPROFILE, "CWMM", "audioconverter", "", chrEditor,
+                              sizeof(chrEditor));
+        chrPtr++;
+        ulSize=sizeof(chrParams);
+        _wpQueryRealName(somSelf, chrPtr, &ulSize, TRUE);
+        strcat(chrPtr,"\" \"");
+        chrPtr=strrchr(chrPtr, 0);
+        if(mmioGetFormatName(&g_pmmFormatInfoArray[ulMenuId-ID_ITEM_FIRSTCONVERT], chrPtr,(LONG*) &ulSize, 0L, 0L))
+	  SysWriteToTrapLog("cwaudio_wpMenuItemSelected: %s\n\n", chrPtr);
+	else
+	  *( chrPtr + ulSize ) = (CHAR)NULL;
+        strcat(chrPtr,"\"");
+
+        if((ulRc=launchPMProg("", chrEditor, chrParams, somSelf, ulMenuId-ID_ITEM_FIRSTCONVERT))==NULLHANDLE) {
+          /* Error */
+          return TRUE;
+        }
+        return TRUE;
+      }
+
+    switch(ulMenuId)
+      {
+      case ID_MENU_VOLUME:
+      case ID_MENU_START:
+      case ID_MENU_STOP:
+      case ID_MENU_PAUSE:
+      case ID_MENU_RESUME:
+      case ID_MENU_PLAYER:
+      case ID_MENU_EDITOR:
+      case ID_ITEM_CONVERT:
+        _wpViewObject(somSelf, WinWindowFromID(hwndFrame, FID_CLIENT), ulMenuId,0);
+        return TRUE;
+      default:
+        break;
+      }
+    return (MMAudio_parent_CWMMDataFile_wpMenuItemSelected(somSelf, 
+                                                      hwndFrame, 
+                                                      ulMenuId));
+}
+
+/*
+ * The prototype for cwaudio_wpObjectReady was replaced by the following prototype:
+ */
+SOM_Scope void  SOMLINK cwaudio_wpObjectReady(MMAudio *somSelf, 
+                                              ULONG ulCode, WPObject* refObject)
+{
+ MMAudioData *somThis = MMAudioGetData(somSelf);
+  MMAudioMethodDebug("MMAudio","cwaudio_wpObjectReady");
+
+  MMAudio_parent_CWMMDataFile_wpObjectReady(somSelf, ulCode, refObject);
+
+  /* Set the type of this object to keep the MM player happy. */
+  mmclsSetObjectType(somSelf);
+
+  if(_bNeedSaving)
+    _wpSaveDeferred(somSelf);
+}
+
+
+/*
+ * The prototype for cwaudio_wpSetup was replaced by the following prototype:
+ */
+SOM_Scope BOOL  SOMLINK cwaudio_wpSetup(MMAudio *somSelf, PSZ pszSetupString)
+{
+  char buffer[MAX_EA_SIZE];
+  ULONG bufferSize;
+
+  MMAudioData *somThis = MMAudioGetData(somSelf);
+    MMAudioMethodDebug("MMAudio","cwaudio_wpSetup");
+
+    /* Setting volume while playing */
+    bufferSize=sizeof(buffer);
+    if(_wpScanSetupString(somSelf, pszSetupString, SETUP_MMAUDIOVOLUME, buffer, &bufferSize))
+      {
+        LONG l;
+
+        l=atol(buffer);
+        if(l>100)
+          l=100;
+        if(l<0)
+          l=0;
+
+        globalClassVolume=l;
+        /* Now tell the running file if any */
+        WinSendMsg(globalHwndObjectPlay, WM_APPTERMINATENOTIFY, MPFROMLONG(ACKEY_VOLUME), MPFROMP(globalObjectPlay));
+      }
+
+    /* These are the old setup strings. They will be removed in the future */
+    bufferSize=sizeof(buffer);
+    if(_wpScanSetupString(somSelf, pszSetupString, SETUP_AUDIOTRACKNAME, buffer, &bufferSize))
+      {
+        _cwmmSetTrackInfo(somSelf, buffer, 0, IDINFO_NAME);
+      }
+
+    bufferSize=sizeof(buffer); 
+    if(_wpScanSetupString(somSelf, pszSetupString, SETUP_AUDIOARTIST, buffer, &bufferSize))
+      {
+        _cwmmSetTrackInfo(somSelf, buffer, 0, IDINFO_ARTIST);
+      }
+
+    bufferSize=sizeof(buffer); 
+    if(_wpScanSetupString(somSelf, pszSetupString, SETUP_AUDIOALBUM, buffer, &bufferSize))
+      {
+        _cwmmSetTrackInfo(somSelf, buffer, 0, IDINFO_ALBUM);
+      }
+
+    bufferSize=sizeof(buffer); 
+    if(_wpScanSetupString(somSelf, pszSetupString, SETUP_AUDIOCOMMENT, buffer, &bufferSize))
+      {
+        _cwmmSetTrackInfo(somSelf, buffer, 0, IDINFO_COMMENT);
+      }
+
+    bufferSize=sizeof(buffer); 
+    if(_wpScanSetupString(somSelf, pszSetupString, SETUP_AUDIOGENRE, buffer, &bufferSize))
+      {
+        _cwmmSetTrackInfo(somSelf, buffer, 0, IDINFO_GENRE);
+      }
+
+    bufferSize=sizeof(buffer); 
+    if(_wpScanSetupString(somSelf, pszSetupString, SETUP_AUDIOYEAR, buffer, &bufferSize))
+      {
+        _cwmmSetTrackInfo(somSelf, buffer, 0, IDINFO_YEAR);
+      }
+
+    bufferSize=sizeof(buffer); 
+    if(_wpScanSetupString(somSelf, pszSetupString, SETUP_AUDIOPLAYTIME, buffer, &bufferSize))
+      {
+        int iPlaytime=atoi(buffer);
+        if(iPlaytime<0)
+          iPlaytime=0;
+        _cwmmSetTrackInfo(somSelf, buffer, iPlaytime, IDINFO_PLAYTIME);
+      }
+
+    /* Refresh */
+    bufferSize=sizeof(buffer); 
+    if(_wpScanSetupString(somSelf, pszSetupString, SETUP_REFRESH, buffer,&bufferSize))
+      {
+        _ulFileSize=1; /* Set filesize to 1 this will force a reread */
+        /* Make sure MMIOMP3 doesn't take the time from the EA */
+        cwSaveStringToEA(somSelf, "MMPLAYTIME", "");
+        cwSaveStringToEA(somSelf, "MMPLAYTIMEMS", "");
+        
+        /* The filesize changed, somebody altered the audio file so reread the info */
+        // if(!cwObjectIsOnCD(somSelf)) {
+        if(!cwObjectIsOnInvalidDrive(somSelf)) {
+          /* Only get audio info when file isn't on CD. This speeds up opening of folders on CDs filled with
+             MP3s. Doesn't hurt because folders of CDs open in normal details view as default so the audio info
+             isn't necessary. When opening the settings notebook the info is reread anyway. */      
+          
+          /* Send the object pointer to the audio worker thread to read the audio info in the background. */
+          WinPostMsg(__get_hwndAudioWorker(_CWMMDataFile) , WM_APPTERMINATENOTIFY, somSelf, 0);
+        }
+        _wpCnrRefreshDetails(somSelf);
+      }
+
+    bufferSize=sizeof(buffer); 
+    if(_wpScanSetupString(somSelf, pszSetupString, SETUP_COPYTAGTO, buffer, &bufferSize))
+      {
+        /* The caller requested to copy the tags from this audio file to another */
+        PBYTE pByte;
+        ULONG ul;
+
+        /* Length of instance var string can't be longer than MAX_EA_SIZE. See cwmmSetTrackInfo() */
+        if((pByte=_wpAllocMem(somSelf, MAX_EA_SIZE+100, &ul))!=NULLHANDLE)
+          {
+            sprintf(pByte,"%s=%s;",SETUP_AUDIOTRACKNAME, _pszName);
+            HlpSendCommandToObject( buffer, pByte);
+         
+            sprintf(pByte,"%s=%s",SETUP_AUDIOARTIST, _pszArtist);
+            HlpSendCommandToObject( buffer, pByte);
+
+            sprintf(pByte,"%s=%s",SETUP_AUDIOALBUM, _pszAlbum);
+            HlpSendCommandToObject( buffer, pByte);
+            
+            sprintf(pByte,"%s=%s",SETUP_AUDIOCOMMENT, _pszComment);
+            HlpSendCommandToObject( buffer, pByte);
+            
+            sprintf(pByte,"%s=%s",SETUP_AUDIOYEAR, _pszYear);
+            HlpSendCommandToObject( buffer, pByte);
+            
+            sprintf(pByte,"%s=%s",SETUP_AUDIOGENRE, _pszGenre);
+            HlpSendCommandToObject( buffer, pByte);
+          }
+      }
+
+#if 0
+    /* Old code using a static array. To be removed in V.0.2.8 */
+    bufferSize=sizeof(buffer); 
+    if(_wpScanSetupString(somSelf, pszSetupString, SETUP_COPYTAGTO, buffer, &bufferSize))
+      {
+        /* The caller requested to copy the tags from this audio file to another */
+        char chrCommand[200];
+
+        sprintf(chrCommand,"%s=%s;",SETUP_AUDIOTRACKNAME, _id3Name);
+        HlpSendCommandToObject( buffer, chrCommand);
+
+        sprintf(chrCommand,"%s=%s",SETUP_AUDIOARTIST, _id3Artist);
+        HlpSendCommandToObject( buffer, chrCommand);
+
+        sprintf(chrCommand,"%s=%s",SETUP_AUDIOALBUM, _id3Album);
+        HlpSendCommandToObject( buffer, chrCommand);
+
+        sprintf(chrCommand,"%s=%s",SETUP_AUDIOCOMMENT, _id3Comment);
+        HlpSendCommandToObject( buffer, chrCommand);
+
+        sprintf(chrCommand,"%s=%s",SETUP_AUDIOYEAR, _id3Year);
+        HlpSendCommandToObject( buffer, chrCommand);
+
+        sprintf(chrCommand,"%s=%s",SETUP_AUDIOGENRE, _id3Genre);
+        HlpSendCommandToObject( buffer, chrCommand);
+      }
+#endif
+
+    /* The new MM* setup strings. These have a better naming */
+    bufferSize=sizeof(buffer);
+    if(_wpScanSetupString(somSelf, pszSetupString, SETUP_MMAUDIOTRACKNAME, buffer, &bufferSize))
+      _cwmmSetTrackInfo(somSelf, buffer, 0, IDINFO_NAME);
+      
+    bufferSize=sizeof(buffer); 
+    if(_wpScanSetupString(somSelf, pszSetupString, SETUP_MMAUDIOARTIST, buffer, &bufferSize))
+      _cwmmSetTrackInfo(somSelf, buffer, 0, IDINFO_ARTIST);
+    
+    bufferSize=sizeof(buffer); 
+    if(_wpScanSetupString(somSelf, pszSetupString, SETUP_MMAUDIOALBUM, buffer, &bufferSize))
+      _cwmmSetTrackInfo(somSelf, buffer, 0, IDINFO_ALBUM);
+    
+    bufferSize=sizeof(buffer); 
+    if(_wpScanSetupString(somSelf, pszSetupString, SETUP_MMAUDIOCOMMENT, buffer, &bufferSize))
+      _cwmmSetTrackInfo(somSelf, buffer, 0, IDINFO_COMMENT);
+      
+    bufferSize=sizeof(buffer); 
+    if(_wpScanSetupString(somSelf, pszSetupString, SETUP_MMAUDIOGENRE, buffer, &bufferSize))
+      _cwmmSetTrackInfo(somSelf, buffer, 0, IDINFO_GENRE);
+      
+    bufferSize=sizeof(buffer); 
+    if(_wpScanSetupString(somSelf, pszSetupString, SETUP_MMAUDIOYEAR, buffer, &bufferSize))
+      _cwmmSetTrackInfo(somSelf, buffer, 0, IDINFO_YEAR);
+    
+    bufferSize=sizeof(buffer); 
+    if(_wpScanSetupString(somSelf, pszSetupString, SETUP_MMAUDIOPLAYTIME, buffer, &bufferSize))
+      {
+        int iPlaytime=atoi(buffer);
+        if(iPlaytime<0)
+          iPlaytime=0;
+        _cwmmSetTrackInfo(somSelf, buffer, iPlaytime, IDINFO_PLAYTIME);
+      }
+
+    /* Refresh */
+    bufferSize=sizeof(buffer); 
+    if(_wpScanSetupString(somSelf, pszSetupString, SETUP_MMREFRESH, buffer,&bufferSize))
+      {
+        _ulFileSize=1; /* Set filesize to 1 this will force a reread */
+        /* Make sure MMIOMP3 doesn't take the time from the EA */
+        cwSaveStringToEA(somSelf, "MMPLAYTIME", "");
+        cwSaveStringToEA(somSelf, "MMPLAYTIMEMS", "");
+
+        /* The filesize changed, somebody altered the audio file so reread the info */
+        //  if(!cwObjectIsOnCD(somSelf)) {
+        if(!cwObjectIsOnInvalidDrive(somSelf)) {
+          /* Only get audio info when file isn't on CD. This speeds up opening of folders on CDs filled with
+             MP3s. Doesn't hurt because folders of CDs open in normal details view as default so the audio info
+             isn't necessary. When opening the settings notebook the info is reread anyway. */      
+
+          /* Send the object pointer to the audio worker thread to read the audio info in the background. */
+          WinPostMsg(__get_hwndAudioWorker(_CWMMDataFile) , WM_APPTERMINATENOTIFY, somSelf, 0);
+        }
+        _wpCnrRefreshDetails(somSelf);
+      }
+
+    bufferSize=sizeof(buffer); 
+    if(_wpScanSetupString(somSelf, pszSetupString, SETUP_MMCOPYTAGTO, buffer, &bufferSize))
+      {
+        /* The caller requested to copy the tags from this audio file to another */
+        PBYTE pByte;
+        ULONG ul;
+        
+        /* Length of instance var string can't be longer than MAX_EA_SIZE. See cwmmSetTrackInfo() */
+        if((pByte=_wpAllocMem(somSelf, MAX_EA_SIZE+100, &ul))!=NULLHANDLE)
+          {
+            if(_pszName) { /* Prevent inserting of (null) into the EA. (null) will be inserted by sprintf() */
+              sprintf(pByte,"%s=%s;",SETUP_MMAUDIOTRACKNAME, _pszName);
+              HlpSendCommandToObject( buffer, pByte);
+            }
+            if(_pszArtist) { /* Prevent inserting of (null) into the EA. (null) will be inserted by sprintf() */
+              sprintf(pByte,"%s=%s",SETUP_MMAUDIOARTIST, _pszArtist);
+              HlpSendCommandToObject( buffer, pByte);
+            }
+            if(_pszAlbum) { /* Prevent inserting of (null) into the EA. (null) will be inserted by sprintf() */
+              sprintf(pByte,"%s=%s",SETUP_MMAUDIOALBUM, _pszAlbum);
+              HlpSendCommandToObject( buffer, pByte);
+            }
+            if(_pszComment) { /* Prevent inserting of (null) into the EA. (null) will be inserted by sprintf() */
+              sprintf(pByte,"%s=%s",SETUP_MMAUDIOCOMMENT, _pszComment);
+              HlpSendCommandToObject( buffer, pByte);
+            }
+            if(_pszYear) { /* Prevent inserting of (null) into the EA. (null) will be inserted by sprintf() */
+              sprintf(pByte,"%s=%s",SETUP_MMAUDIOYEAR, _pszYear);
+              HlpSendCommandToObject( buffer, pByte);
+            }
+            if(_pszGenre) { /* Prevent inserting of (null) into the EA. (null) will be inserted by sprintf() */
+              sprintf(pByte,"%s=%s",SETUP_MMAUDIOGENRE, _pszGenre);
+              HlpSendCommandToObject( buffer, pByte);
+            }
+          }
+      }
+    
+#if 0
+    /* Old code using a static array. To be removed in V0.2.8 */
+    bufferSize=sizeof(buffer); 
+    if(_wpScanSetupString(somSelf, pszSetupString, SETUP_MMCOPYTAGTO, buffer, &bufferSize))
+      {
+        /* The caller requested to copy the tags from this audio file to another */
+        char chrCommand[200];
+
+        sprintf(chrCommand,"%s=%s;",SETUP_MMAUDIOTRACKNAME, _id3Name);
+        HlpSendCommandToObject( buffer, chrCommand);
+
+        sprintf(chrCommand,"%s=%s",SETUP_MMAUDIOARTIST, _id3Artist);
+        HlpSendCommandToObject( buffer, chrCommand);
+
+        sprintf(chrCommand,"%s=%s",SETUP_MMAUDIOALBUM, _id3Album);
+        HlpSendCommandToObject( buffer, chrCommand);
+
+        sprintf(chrCommand,"%s=%s",SETUP_MMAUDIOCOMMENT, _id3Comment);
+        HlpSendCommandToObject( buffer, chrCommand);
+
+        sprintf(chrCommand,"%s=%s",SETUP_MMAUDIOYEAR, _id3Year);
+        HlpSendCommandToObject( buffer, chrCommand);
+
+        sprintf(chrCommand,"%s=%s",SETUP_MMAUDIOGENRE, _id3Genre);
+        HlpSendCommandToObject( buffer, chrCommand);
+      }
+#endif
+
+    return (MMAudio_parent_CWMMDataFile_wpSetup(somSelf, pszSetupString));
+}
+
+
+/*
+ *  wpSetTitle              : override;
+ *    wpQueryRealName         : override;
+ *    wpQueryTitle            : override;
+ *    wpRefresh               : override;
+ */
+
+SOM_Scope HWND  SOMLINK cwaudio_wpOpen(MMAudio *somSelf, HWND hwndCnr, 
+                                       ULONG ulView, ULONG param)
+{
+  ULONG ulRc;
+
+  /*    CWAudioData *somThis = CWAudioGetData(somSelf);*/
+  /*  CWMMDataFileData *somThis = CWMMDataFileGetData(somSelf); */
+    MMAudioMethodDebug("MMAudio","cwaudio_wpOpen");
+
+    switch(ulView)
+      {
+      case ID_MENU_START:
+        {
+          if(iRunningAudioFiles<MAX_AUDIOFILE_STARTS) {
+            
+            /* Another audio file running */
+            iRunningAudioFiles++;
+
+            __set_ulPreviousView(somSelf, _wpQueryDefaultView(somSelf));/* Save the view set by the user */
+            _cwmmPlayTrack(somSelf, hwndCnr, TRUE);      /* Start playing*/
+            _wpSetDefaultView(somSelf, ID_MENU_STOP);    /* Set new view so doubleclick stops the playing. */
+          }
+          return NULLHANDLE;
+        }
+      case ID_MENU_STOP:
+        {
+          _cwmmPlayTrack(somSelf, hwndCnr, FALSE);     /* Stop playing */
+          _wpSetDefaultView(somSelf, __get_ulPreviousView(somSelf)); /* Restore the user view                          */
+          return NULLHANDLE;
+        }
+      case ID_MENU_PAUSE:
+        {
+          _cwmmPauseTrack(somSelf, hwndCnr, ACKEY_PAUSE);
+          return NULLHANDLE;
+        }
+      case ID_MENU_RESUME:
+        {
+          _cwmmPauseTrack(somSelf, hwndCnr, ACKEY_RESUME);
+          return NULLHANDLE;
+        }
+      case ID_MENU_PLAYER:
+        /*case 0xbbe5:   Player */
+        {
+          char chrPlayer[CCHMAXPATH]={0};
+          char chrParams[CCHMAXPATH+2]="\"";
+          char chrTitle[50];
+          char *chrPtr=chrParams;
+          ULONG ulSize;
+
+          /* Build path for the audio player app */
+          sprintf(chrPlayer, "%s\\bin\\%s", chrInstallDir, "mmplayer.exe");
+
+          /* The user may override the audio player using a setting in the ini. Default is using the
+             provided one.
+             */
+	  if(!_somIsA(somSelf, somGetSomClass("MMMIDI")))
+	    PrfQueryProfileString(HINI_USERPROFILE, "CWMM", "audioplayer", chrPlayer, chrPlayer,sizeof(chrPlayer));
+          else
+             PrfQueryProfileString(HINI_USERPROFILE, "CWMM", "midiplayer", chrPlayer, chrPlayer,sizeof(chrPlayer));
+          chrPtr++;
+          ulSize=sizeof(chrParams)-2;
+          _wpQueryRealName(somSelf, chrPtr, &ulSize, TRUE); /* Add filename */
+          strcat(chrPtr,"\"");
+
+          /* Get the Title for the window list */
+          if(!getMessage(chrTitle, IDSTR_AUDPLAYERTITLE, sizeof(chrTitle), queryResModuleHandle(), HWND_DESKTOP))
+            strcpy(chrTitle, "Player");
+
+          if((ulRc=launchPMProg(chrTitle, chrPlayer, chrParams, somSelf, ulView))==NULLHANDLE) {
+            break;
+          }
+          return NULLHANDLE;
+        }
+      case ID_MENU_VOLUME:
+        {
+          char chrVolume[CCHMAXPATH]={0};
+          char chrTitle[100]={0};
+          char chrParam[CCHMAXPATH]="\"";
+          ULONG ulRc;
+
+          sprintf(chrVolume, "%s\\bin\\classvol.exe", queryInstallDir());
+          
+          ulRc=sizeof(chrParam);
+          _wpQueryRealName(somSelf,chrParam+1, &ulRc, TRUE);
+          strcat(chrParam,"\"");
+          /* Get the Title for the window list */
+          if(!getMessage(chrTitle, IDSTR_VOLUMETITLE, sizeof(chrTitle), queryResModuleHandle(), HWND_DESKTOP))
+            strcpy(chrTitle, "Volume");
+
+          if((ulRc=launchPMProg(chrTitle, chrVolume, chrParam, somSelf, ID_MENU_VOLUME))==0)
+           return NULLHANDLE;
+
+#if 0
+          HOBJECT hObject;
+          if((hObject=WinQueryObject("<MMPM2_MMVOLUME>"))!=NULLHANDLE)
+            WinOpenObject(hObject, OPEN_DEFAULT, TRUE);
+#endif
+          return NULLHANDLE;
+        }
+      case ID_MENU_EDITOR:
+        /* case 0xbc0d:  Editor */ 
+        {
+          char chrPlayer[CCHMAXPATH]={0};
+          char chrParams[CCHMAXPATH+10]="-e \"";
+          char chrTitle[50];
+          char *chrPtr=chrParams;
+          ULONG ulSize;
+
+          /*
+            Check if the user specified another audio editor. 
+            */
+          if(!PrfQueryProfileString(HINI_USERPROFILE, "CWMM", "audioeditor", NULLHANDLE, chrPlayer,sizeof(chrPlayer)))
+            /* No user setting. Use default ab.exe copied by the installation program to another location. IF this setting is missing
+             try the app from the path. */
+            PrfQueryProfileString(HINI_USERPROFILE, "CWMM", "ab", "ab.exe", chrPlayer,sizeof(chrPlayer));
+            
+          chrPtr+=4;
+          ulSize=sizeof(chrParams)-2;
+          _wpQueryRealName(somSelf, chrPtr, &ulSize, TRUE);
+          strcat(chrPtr,"\"");
+
+          if(!getMessage(chrTitle, IDSTR_AUDEDITORTITLE, sizeof(chrTitle), queryResModuleHandle(), HWND_DESKTOP))
+            strcpy(chrTitle, "Editor");
+
+          if((ulRc=launchPMProg( chrTitle, chrPlayer, chrParams, somSelf, ulView))==NULLHANDLE) {
+            break;
+          }
+
+          return NULLHANDLE;
+        }
+#if 0
+        /* 
+           FIXME:
+           Moved this to wpMenuItemSelected(). Should be moved back later.
+           */
+      case 0xb4dd: /* Convert */ 
+        {
+          char chrPlayer[CCHMAXPATH]={0};
+          char chrParams[CCHMAXPATH+2]="\"";
+          char *chrPtr=chrParams;
+          ULONG ulSize;
+
+          PrfQueryProfileString(HINI_USERPROFILE, "CWMM", "audioconverter", "", chrPlayer,sizeof(chrPlayer));
+          chrPtr++;
+          ulSize=sizeof(chrParams)-2;
+          _wpQueryRealName(somSelf, chrPtr, &ulSize, TRUE);
+          strcat(chrPtr,"\"");
+          if((ulRc=launchPMProg("Spieler", chrPlayer, chrParams, somSelf, ulView))==NULLHANDLE) {
+            break;
+          }
+          return NULLHANDLE;
+        }
+#endif
+      default:
+        break;
+      }
+    return (MMAudio_parent_CWMMDataFile_wpOpen(somSelf, hwndCnr, ulView, param));
+}
+
+
+SOM_Scope void  SOMLINK cwaudio_wpInitData(MMAudio *somSelf)
+{
+    MMAudioData *somThis = MMAudioGetData(somSelf);
+    MMAudioMethodDebug("MMAudio","cwaudio_wpInitData");
+
+    MMAudio_parent_CWMMDataFile_wpInitData(somSelf);
+    /* Flag to mark we haven't yet the audio size. The size will be read from the
+       EAs (to circumvent the IO proc file scanning) or by checking the file using
+       IO procs when the file was altered. */
+    _ulFileSize=1;
+
+    /* This proc handles the start/stop/resume commands for audio objects.
+       Playing takes place on a separate thread with an object window and this proc used
+       for communicating. */
+    _cwmmSetObjWindowProc(somSelf, &playObjectProc);
+}
+
+/*
+  This function checks all the installed audio IO procs if one of them can handle the
+  audio file with the given extension. Only write enabled IO procs are accepted because
+  we use this function to determine if we should create a template for the audio class. 
+ */
+static BOOL checkForWriteEnabledAudioIOProc(char * chrExt)
+{
+    CHAR          szBuffer[ sizeof( FOURCC ) + CCHMAXPATH + 4 ];
+    MMFORMATINFO  mmFormatInfo;
+    PMMFORMATINFO pmmFormatInfoArray;
+    void * memPtr;
+    ULONG         ulReturnCode;
+    LONG          lFormatsRead;
+    LONG          index;
+    LONG          lBytesRead;
+    LONG          lNumIOProcs;
+
+    memset( &mmFormatInfo,
+            '\0',
+            sizeof(MMFORMATINFO) );
+    
+    mmFormatInfo.ulMediaType |= MMIO_MEDIATYPE_AUDIO;
+    mmFormatInfo.ulFlags|=MMIO_CANWRITETRANSLATED;
+    ulReturnCode = mmioQueryFormatCount ( &mmFormatInfo,
+                                          &lNumIOProcs,
+                                          0,
+                                          0 );
+    
+    if( ulReturnCode != MMIO_SUCCESS )
+      {
+        /*
+         * Error - mmioQueryFormatCount failed.
+         */
+        return FALSE;
+      }
+
+    /*
+     * Allocate enough memory for n number of FormatInfo blocks
+     */
+    pmmFormatInfoArray = malloc (lNumIOProcs * sizeof( MMFORMATINFO ) );
+    memPtr=pmmFormatInfoArray;
+    if( pmmFormatInfoArray == NULL )
+      {
+        /*
+         * Could not allocate enough memory for mmFormatInfo array.
+         */
+        return FALSE;
+      }
+    
+    /*
+     * call mmioGetFormats to get info on the formats supported.
+     */
+    ulReturnCode = mmioGetFormats( &mmFormatInfo,
+                                   lNumIOProcs,
+                                   pmmFormatInfoArray,
+                                   &lFormatsRead,
+                                   0,
+                                   0 );
+    if( ulReturnCode != MMIO_SUCCESS )
+      {
+        /*
+         *  mmioGetFormats failed.
+         */
+        free(pmmFormatInfoArray);
+        return FALSE;
+      }
+    
+    if( lFormatsRead != lNumIOProcs )
+      {
+        /*
+         * Error in MMIO - number of formats read in by
+         * mmioGetFormats is not equal to number of formats
+         * found by mmioQueryFormatCount.
+         */
+        free(pmmFormatInfoArray);
+        return FALSE;
+      }
+
+    for ( index = 0; index <lNumIOProcs; index++ )
+      {
+        if(mmioGetFormatName(pmmFormatInfoArray, szBuffer, &lBytesRead, 0L, 0L))
+        {
+	  //SysWriteToTrapLog("checkForWriteEnabledAudioIOProc: %s\n\n", szBuffer);
+	  continue;
+	}
+
+        /* Insert NULL string terminator */
+        *( szBuffer + lBytesRead ) = (CHAR)NULL;
+
+        if(pmmFormatInfoArray->ulFlags & MMIO_CANWRITETRANSLATED)
+          {
+            //if(pmmFormatInfoArray->fccIOProc==mmioStringToFOURCC(chr, MMIO_TOUPPER))
+            //HlpWriteToTrapLog("%s --- %x %x %s\n",szBuffer, pmmFormatInfoArray->fccIOProc, mmioStringToFOURCC(chrType, MMIO_TOUPPER),
+            // pmmFormatInfoArray->szDefaultFormatExt);
+              if(strstr(chrExt, pmmFormatInfoArray->szDefaultFormatExt)) {
+                //   HlpWriteToTrapLog("******* Ext given: %s  IO-Proc: %s\n", chrExt, pmmFormatInfoArray->szDefaultFormatExt);
+                free(memPtr);
+                return TRUE;
+              }
+          }
+        /*
+         *  advance to next entry in mmFormatInfo array
+         */
+        pmmFormatInfoArray++;
+      }
+    free(memPtr);
+    return FALSE;
+}
+
+/*
+ *    wpCreateShadowObject    : override;
+ */
+
+SOM_Scope void  SOMLINK cwaudio_wpUnInitData(MMAudio *somSelf)
+{
+    MMAudioData *somThis = MMAudioGetData(somSelf);
+    MMAudioMethodDebug("MMAudio","cwaudio_wpUnInitData");
+
+    if(_pszName)
+      _wpFreeMem(somSelf, _pszName);
+        
+    if(_pszArtist)
+      _wpFreeMem(somSelf, _pszArtist);
+    
+    if(_pszAlbum)
+      _wpFreeMem(somSelf, _pszAlbum);
+
+    if(_pszComment)
+      _wpFreeMem(somSelf, _pszComment);
+
+    if(_pszYear)
+      _wpFreeMem(somSelf, _pszYear);
+
+    if(_pszGenre)
+      _wpFreeMem(somSelf, _pszGenre);
+
+    MMAudio_parent_CWMMDataFile_wpUnInitData(somSelf);
+}
+
+
+/*
+  Only templates for write enabled audio IO procs are created in this method. 
+ */
+SOM_Scope BOOL  SOMLINK cwaudioM_wpclsCreateDefaultTemplates(M_MMAudio *somSelf, 
+                                                             WPObject* Folder)
+{
+    M_MMAudioMethodDebug("M_MMAudio","cwaudioM_wpclsCreateDefaultTemplates");
+
+    //HlpWriteToTrapLog("Classtitle: %s, Type: %s\n",_wpclsQueryTitle(somSelf), _wpclsQueryInstanceType(somSelf));
+    if(checkForWriteEnabledAudioIOProc( _wpclsQueryInstanceFilter(somSelf))) {
+      /* A write enabled IO proc was found, create the template. */
+      mmclsCreateTheDefaultTemplate(somSelf, Folder);
+      return TRUE; /* Tell the WPS template created*/
+    }
+
+    return TRUE; /* We created the template or don't want to have one */
+}
+
+
+SOM_Scope PSZ  SOMLINK cwaudioM_wpclsQueryInstanceType(M_MMAudio *somSelf)
+{
+    /* M_MMAudioData *somThis = M_MMAudioGetData(somSelf); */
+    M_MMAudioMethodDebug("M_MMAudio","cwaudioM_wpclsQueryInstanceType");
+
+    return TYPE_DIGITALAUDIO;
+}
+
+SOM_Scope PSZ  SOMLINK cwaudioM_wpclsQueryInstanceFilter(M_MMAudio *somSelf)
+{
+    /* M_MMAudioData *somThis = M_MMAudioGetData(somSelf); */
+    M_MMAudioMethodDebug("M_MMAudio","cwaudioM_wpclsQueryInstanceFilter");
+
+    /* The list of additional extensions is built in wpclsInitData(). 
+
+       FIXME
+       This is a static list read in only once during startup.
+       Should probably be changed later on.
+       */
+    return chrMMAudioExt;
+    /*   return (M_MMAudio_parent_M_CWMMDataFile_wpclsQueryInstanceFilter(somSelf)); */
+}
+
+/*
+ * The prototype for cwaudioM_wpclsQueryDetailsInfo was replaced by the following prototype:
+ */
+SOM_Scope ULONG  SOMLINK cwaudioM_wpclsQueryDetailsInfo(M_MMAudio *somSelf, 
+                                                        PCLASSFIELDINFO* ppClassFieldInfo, 
+                                                        PULONG pSize)
+{
+  ULONG cParentColumns;
+  PCLASSFIELDINFO pCfi;
+  int i;
+
+    /* M_CWAudioData *somThis = M_CWAudioGetData(somSelf); */
+    M_MMAudioMethodDebug("M_MMAudio","cwaudioM_wpclsQueryDetailsInfo");
+
+    cParentColumns= (M_MMAudio_parent_M_CWMMDataFile_wpclsQueryDetailsInfo(somSelf, 
+                                                             ppClassFieldInfo, 
+                                                             pSize));
+  if(pSize)
+    *pSize+=sizeof(AUDIODETAILS);
+
+  if(ppClassFieldInfo)
+    {
+      if(*ppClassFieldInfo)
+        {
+          pCfi=*ppClassFieldInfo;
+          for(i=0; i<cParentColumns;i++)
+            pCfi=(pCfi->pNextFieldInfo ? pCfi->pNextFieldInfo: pCfi);
+
+          pCfi->pNextFieldInfo=cfiFieldInfo;
+        }
+      else
+        *ppClassFieldInfo=cfiFieldInfo;
+    }
+    return (cParentColumns+NUM_AUDIO_FIELDS);
+}
+
+
+/*
+ * The prototype for cwaudioM_wpclsQueryTitle was replaced by the following prototype:
+ */
+SOM_Scope PSZ  SOMLINK cwaudioM_wpclsQueryTitle(M_MMAudio *somSelf)
+{
+  static char chrTitle[30]={0};
+  
+  M_MMAudioMethodDebug("M_MMAudio","cwaudioM_wpclsQueryTitle");
+  
+  if(chrTitle[0]==0)
+    if(!getMessage(chrTitle, IDSTR_CWAUDIOTITLE, sizeof(chrTitle), queryResModuleHandle(), HWND_DESKTOP))
+      strcpy(chrTitle, CLSTITLE_DIGITALAUDIO);
+  
+  return chrTitle;
+}
+
+/*
+  Initialize the MMAudio class.
+ */
+SOM_Scope void  SOMLINK cwaudioM_wpclsInitData(M_MMAudio *somSelf)
+{
+  PCLASSFIELDINFO pCfi;
+  USHORT i;
+  static BOOL bGotAudioExt=FALSE;
+
+  /*    M_CWAudioData *somThis = M_CWAudioGetData(somSelf); */
+    M_MMAudioMethodDebug("M_MMAudio","cwaudioM_wpclsInitData");
+
+    /* 
+       Get extensions of additional audio procs. These extensions may be specified by
+       newly installed IO procs in MMPM2.INI or by using the Multimedia setup. For
+       example the MMIOMP3 procedure for reading MP3 files adds the MP3 extension this
+       way to the system. Extensions already handled by a specialized class will be
+       filtered in the called REXX script e.g. MP3 so only unknown extensions end up here.
+
+       Strangely enough wpclsQueryInstanceFilter() is called during wpclsInitData() so
+       we query the extensions here before calling the parent.
+
+       FIXME:
+       The check is only done once during initialization. This is a little annoyance for
+       the user because new extension specified in the settings will only be picked up
+       on next WPS start. 
+       */
+     if(!bGotAudioExt)
+      {
+        char chrTimidity[4];
+        getStringFromRexxScript("audioext.rx", chrMMAudioExt, sizeof(chrMMAudioExt));
+        bGotAudioExt=TRUE; 
+        /*getStringFromRexxScript("chktimid.rx", chrTimidity, sizeof(chrTimidity));
+        //      SysWriteToTrapLog("%s %d\n", chrTimidity, atol(chrTimidity));
+        globalHaveTimidity=atol(chrTimidity);*/
+      }
+
+    M_MMAudio_parent_M_CWMMDataFile_wpclsInitData(somSelf);
+
+    /* Get strings for details view titled from the ressource DLL */
+    if(getMessage(chrPlayTime, IDSTR_PLAYTIME, sizeof(chrPlayTime),  queryResModuleHandle(), HWND_DESKTOP))
+      pszAudioColTitles[0]=chrPlayTime;
+    /* New with 0.2.7 */
+    if(getMessage(chrSampleRate, IDSTR_BITRATE, sizeof(chrBitRate),  queryResModuleHandle(), HWND_DESKTOP))
+      pszAudioColTitles[1]=chrBitRate;
+
+    if(getMessage(chrSampleRate, IDSTR_SAMPLERATE, sizeof(chrSampleRate),  queryResModuleHandle(), HWND_DESKTOP))
+      pszAudioColTitles[2]=chrSampleRate;
+    if(getMessage(chrChannels, IDSTR_CHANNELS, sizeof(chrChannels),  queryResModuleHandle(), HWND_DESKTOP))
+      pszAudioColTitles[3]=chrChannels;
+    if(getMessage(chrBPS, IDSTR_BPS, sizeof(chrBPS),  queryResModuleHandle(), HWND_DESKTOP))
+      pszAudioColTitles[4]=chrBPS;
+
+    if(getMessage(chrName, IDSTR_TITLE, sizeof(chrName),  queryResModuleHandle(), HWND_DESKTOP))
+      pszAudioColTitles[5]=chrName;
+    if(getMessage(chrArtist, IDSTR_ARTIST, sizeof(chrArtist),  queryResModuleHandle(), HWND_DESKTOP))
+      pszAudioColTitles[6]=chrArtist;
+    if(getMessage(chrAlbum, IDSTR_ALBUM, sizeof(chrAlbum),  queryResModuleHandle(), HWND_DESKTOP))
+      pszAudioColTitles[7]=chrAlbum;
+    if(getMessage(chrYear, IDSTR_YEAR, sizeof(chrYear),  queryResModuleHandle(), HWND_DESKTOP))
+      pszAudioColTitles[8]=chrYear;
+    if(getMessage(chrComment, IDSTR_COMMENT, sizeof(chrComment),  queryResModuleHandle(), HWND_DESKTOP))
+      pszAudioColTitles[9]=chrComment;
+    if(getMessage(chrGenre, IDSTR_GENRE, sizeof(chrGenre),  queryResModuleHandle(), HWND_DESKTOP))
+      pszAudioColTitles[10]=chrGenre;
+
+
+  /* Setup the static data for the details view */
+  for(i=0,pCfi=cfiFieldInfo;i<NUM_AUDIO_FIELDS;i++,pCfi++)
+    {
+      memset((PCH)pCfi,0,sizeof(CLASSFIELDINFO));
+
+      pCfi->cb=sizeof(CLASSFIELDINFO);
+      pCfi->flData=CFA_LEFT|CFA_SEPARATOR|CFA_FIREADONLY;
+      pCfi->flTitle=CFA_CENTER|CFA_SEPARATOR|CFA_HORZSEPARATOR|CFA_STRING|CFA_FITITLEREADONLY;
+      pCfi->pNextFieldInfo=pCfi+1;
+      pCfi->pTitleData=(PVOID)pszAudioColTitles[i];
+      pCfi->flCompare=COMPARE_SUPPORTED|SORTBY_SUPPORTED;
+
+      switch(i)
+        {
+        case 0: /* play time */
+          pCfi->flData|=CFA_STRING;
+          pCfi->offFieldData=(ULONG)(FIELDOFFSETUL(AUDIODETAILS,pszPlayTime));
+          pCfi->ulLenFieldData=sizeof(PSZ);
+          pCfi->DefaultComparison=CMP_EQUAL;
+          break;
+        case 1: /* Bitrate */     /* New with 0.2.7 */
+          pCfi->flData|=CFA_STRING;
+          pCfi->offFieldData=(ULONG)(FIELDOFFSETUL(AUDIODETAILS,pszBitRate));
+          pCfi->ulLenFieldData=sizeof(PSZ);
+          pCfi->DefaultComparison=CMP_EQUAL;
+          break;
+        case 2: /* Sample rate */
+          pCfi->flData|=CFA_STRING;
+          pCfi->offFieldData=(ULONG)(FIELDOFFSETUL(AUDIODETAILS,pszSampleRate));
+          pCfi->ulLenFieldData=sizeof(PSZ);
+          pCfi->DefaultComparison=CMP_EQUAL;
+          break;
+        case 3: /* Channels */
+          pCfi->flData|=CFA_STRING;
+          pCfi->offFieldData=(ULONG)(FIELDOFFSETUL(AUDIODETAILS,pszChannels));
+          pCfi->ulLenFieldData=sizeof(PSZ);
+          pCfi->DefaultComparison=CMP_EQUAL;
+          break;
+        case 4: /* BPS */
+          pCfi->flData|=CFA_STRING;
+          pCfi->offFieldData=(ULONG)(FIELDOFFSETUL(AUDIODETAILS,pszBPS));
+          pCfi->ulLenFieldData=sizeof(PSZ);
+          pCfi->DefaultComparison=CMP_EQUAL;
+          break;
+
+        case 5: 
+          pCfi->flData|=CFA_STRING;
+          pCfi->offFieldData=(ULONG)(FIELDOFFSETUL(AUDIODETAILS,pszName));
+          pCfi->ulLenFieldData=sizeof(PSZ);
+          pCfi->DefaultComparison=CMP_EQUAL;
+          break;
+        case 6: 
+          pCfi->flData|=CFA_STRING;
+          pCfi->flData|=CFA_STRING;
+          pCfi->offFieldData=(ULONG)(FIELDOFFSETUL(AUDIODETAILS,pszArtist));
+          pCfi->ulLenFieldData=sizeof(PSZ);
+          pCfi->DefaultComparison=CMP_EQUAL;
+          break;
+        case 7: 
+          pCfi->flData|=CFA_STRING;
+          pCfi->offFieldData=(ULONG)(FIELDOFFSETUL(AUDIODETAILS,pszAlbum));
+          pCfi->ulLenFieldData=sizeof(PSZ);
+          pCfi->DefaultComparison=CMP_EQUAL;
+          break;
+        case 8: 
+          pCfi->flData|=CFA_STRING;
+          pCfi->offFieldData=(ULONG)(FIELDOFFSETUL(AUDIODETAILS,pszYear));
+          pCfi->ulLenFieldData=sizeof(PSZ);
+          pCfi->DefaultComparison=CMP_EQUAL;
+          break;
+        case 9: 
+          pCfi->flData|=CFA_STRING;
+          pCfi->offFieldData=(ULONG)(FIELDOFFSETUL(AUDIODETAILS,pszComment));
+          pCfi->ulLenFieldData=sizeof(PSZ);
+          pCfi->DefaultComparison=CMP_EQUAL;
+          break;
+        case 10: 
+          pCfi->flData|=CFA_STRING;
+          pCfi->offFieldData=(ULONG)(FIELDOFFSETUL(AUDIODETAILS,pszGenre));
+          pCfi->ulLenFieldData=sizeof(PSZ);
+          pCfi->DefaultComparison=CMP_EQUAL;
+          break;
+
+        }/* switch(i) */
+    }/* for() */
+  cfiFieldInfo[NUM_AUDIO_FIELDS].pNextFieldInfo=NULL;
+
+  /* Get name of help library from resource */
+  if(!getMessage(chrHelpLibrary, IDSTR_HELPLIBRARY, sizeof(chrHelpLibrary),
+                 queryResModuleHandle(), HWND_DESKTOP))
+        strcpy(chrHelpLibrary,"MMPARTS.HLP"); /* Fall back to default Warp hel library */
+}
+
+
+
+
+SOM_Scope void  SOMLINK cwaudioM_wpclsUnInitData(M_MMAudio *somSelf)
+{
+    /* M_MMAudioData *somThis = M_MMAudioGetData(somSelf); */
+    M_MMAudioMethodDebug("M_MMAudio","cwaudioM_wpclsUnInitData");
+
+    M_MMAudio_parent_M_CWMMDataFile_wpclsUnInitData(somSelf);
+}
+
+/*
+ * The prototype for cwaudioM_wpclsQueryDefaultView was replaced by the following prototype:
+ */
+SOM_Scope ULONG  SOMLINK cwaudioM_wpclsQueryDefaultView(M_MMAudio *somSelf)
+{
+    /* M_CWAudioData *somThis = M_CWAudioGetData(somSelf); */
+    M_MMAudioMethodDebug("M_MMAudio","cwaudioM_wpclsQueryDefaultView");
+
+    /* Default view for audio objects is 'Start' so on doubleclick the playing starts
+       immediately. */
+
+    return ID_MENU_START;
+}
+
+/*
+ * The prototype for cwaudioM_wpclsQueryIconData was replaced by the following prototype:
+ */
+SOM_Scope ULONG  SOMLINK cwaudioM_wpclsQueryIconData(M_MMAudio *somSelf, 
+                                                     PICONINFO pIconInfo)
+{
+  HMODULE hmod;
+    /* M_CWAudioData *somThis = M_CWAudioGetData(somSelf); */
+    M_MMAudioMethodDebug("M_MMAudio","cwaudioM_wpclsQueryIconData");
+    /*
+      We have our own icon.
+      */
+    hmod=queryModuleHandle();
+    if(!hmod)
+      return M_MMAudio_parent_M_CWMMDataFile_wpclsQueryIconData(somSelf, pIconInfo);
+
+	if (pIconInfo)   {
+      pIconInfo->fFormat = ICON_RESOURCE;
+      pIconInfo->hmod    = queryModuleHandle();
+      pIconInfo->resid   = ID_ICONCWAUDIOFILE;
+	} /* endif */
+
+	return ( sizeof(ICONINFO) );
+}
+
+
+
+MRESULT EXPENTRY audioWorkerProc(HWND hwnd, ULONG msg, MPARAM mp1, MPARAM mp2)
+{
+
+  switch (msg)
+    {
+    case WM_APPTERMINATENOTIFY:
+      {
+      ULONG ulSize;
+      char fName[CCHMAXPATH];
+      char text[CCHMAXPATH];
+      BOOL bContinue=FALSE;
+      MMAudio *somSelf=(MMAudio*)mp1;
+      WPObject    *pLinkObj=NULLHANDLE;
+      MMAudioData *somThis= MMAudioGetData(somSelf);
+      ULONG ulLoop;
+
+      TRY_LOUD(AUDIO_WORKER) {
+        for(;;) {
+          ULONG rc;
+          MMIOINFO mmio;
+          HMMIO hmmio;
+          MMAUDIOHEADER mmAudioHeader={0};
+          LONG lBytesRead=0;
+          char* pChar;
+          ULONG ulFSize;
+          BOOL bIsMidi=FALSE;
+          WPFolder *wpFolder;
+
+          mmclsSetObjectType(somSelf);
+
+          if(!somIsObj(somSelf))
+            break;
+
+          /* Don't check stream objects */
+          if(somObjectIsA(somSelf, "MMAudioStream"))
+            break;
+          /* Don't check CD-Track objects */
+          if(somObjectIsA(somSelf, "MMCDTrack"))
+            break;
+
+          /* Check if object is inserted into a container. If not the folder was
+             closed. */
+          // if(!somObjectIsInsertedInContainer(somSelf))
+          //  break;
+
+          ulFSize=_wpQueryFileSize(somSelf);
+          if(_ulFileSize==ulFSize)
+            break;    /* We already scanned this file */
+
+          /*
+            @@CHANGE 0.2.8
+
+            Check if parent folder is closed. If yes, don't start file scanning.
+
+            @@CHANGE 0.2.9
+
+            Check if we have a shadow in an open folder.
+
+            */
+
+          wpFolder=_wpQueryFolder(somSelf);
+          if(somIsObj(wpFolder)) {
+            if(!_wpFindViewItem(wpFolder , VIEW_ANY, NULLHANDLE)) {
+              PUSEITEM pUseItem;
+              BOOL fOpenView=FALSE;
+              /* Ok, our object isn't in an open folder, but we may have a shadow somewhere in an
+                 open folder. */
+              for(pUseItem=_wpFindUseItem(somSelf, USAGE_LINK, NULL);pUseItem;
+                  pUseItem=_wpFindUseItem(somSelf, USAGE_LINK, pUseItem))
+                {
+                  PLINKITEM pLI=(PLINKITEM)++pUseItem;
+                  pLinkObj=pLI->LinkObj; /* The awake shadow */
+
+                  if(somIsObj(pLinkObj)) {
+                    wpFolder=_wpQueryFolder(pLinkObj);
+                    if(somIsObj(wpFolder)) {
+                      if(_wpFindViewItem(wpFolder , VIEW_ANY, NULLHANDLE)) {
+                        fOpenView=TRUE;
+                        break;
+                      }
+                    }/* somIsObj(wpFolder) */
+                  }
+                }/* for() */
+              if(!fOpenView)
+                break;
+            }
+          }
+
+          /* Get file name */
+          ulSize=sizeof(fName);
+          if(!_wpQueryRealName(somSelf, fName, &ulSize, TRUE))
+            break; /* Error */
+
+          /* Show status window */
+          if((pChar=strrchr(fName, '\\'))!=NULLHANDLE) {
+            HPS hps;
+            ULONG ulWinTextLen;
+            POINTL aptlPoints[TXTBOX_COUNT];
+            SWP swp;
+            ULONG ulCy;
+            WPOINT pwpBorder;
+
+            HWND hwndClient=WinWindowFromID(__get_hwndStatus(_CWMMDataFile), FID_CLIENT);
+
+            sprintf(text,"%c:\\...%s",fName[0], pChar);
+          
+            WinSetWindowText(hwndClient, text);
+            ulWinTextLen=(ULONG)strlen(text); // Query text length
+
+            /* Calculate text size in pixel */
+            hps=WinBeginPaint(hwndClient,(HPS)NULL,(PRECTL)NULL);
+            GpiQueryTextBox(hps,ulWinTextLen,text,TXTBOX_COUNT,aptlPoints);
+            WinEndPaint(hps);
+
+            if(WinSendMsg(__get_hwndStatus(_CWMMDataFile) ,WM_QUERYBORDERSIZE, MPFROMP(&pwpBorder), 0L))
+              ulCy=pwpBorder.x*2;
+            else
+              ulCy=SV_CYBORDER*2; /* Safe default */
+
+            if(WinQueryWindowPos(WinWindowFromID(__get_hwndStatus(_CWMMDataFile), FID_TITLEBAR),&swp))
+              {
+                if(!swp.cy)
+                  if(!WinQueryWindowPos(WinWindowFromID(HWND_DESKTOP, FID_TITLEBAR), &swp))
+                    swp.cy=15;
+                ulCy+=swp.cy;
+              }
+            else
+              ulCy+=15;
+
+            WinSetWindowPos(__get_hwndStatus(_CWMMDataFile), HWND_TOP, 0,0,
+                            aptlPoints[TXTBOX_BOTTOMRIGHT].x-aptlPoints[TXTBOX_BOTTOMLEFT].x+18,
+                            aptlPoints[TXTBOX_TOPRIGHT].y-aptlPoints[TXTBOX_BOTTOMRIGHT].y+ulCy+4,
+                            SWP_SIZE|SWP_SHOW|SWP_ZORDER|SWP_DEACTIVATE);
+            WinPostMsg(__get_hwndStatus(_CWMMDataFile), WM_APPTERMINATENOTIFY, 0,MPFROMLONG(1L));
+          }
+
+          //#if 0
+          /* This part obsolete?? */
+          /* Get file name */
+          ulSize=sizeof(fName);
+          if(!_wpQueryRealName(somSelf, fName, &ulSize, TRUE))
+            break;
+          //#endif
+
+          if(!_somIsA(somSelf, somGetSomClass("MMMIDI")))
+            {
+              /* Check audio files */
+              MP3OPTIONS mp3Opt={0}; /* Struct holding MP3 additional info */
+              VORBISOPTIONS vorbisOpt={0};
+      
+              PMP3OPTIONS returnedMP3Opts;
+              PVORBISOPTIONS returnedVorbisOpts;
+
+              memset(&mmio,0, sizeof(mmio));
+              mmio.ulFlags=MMIO_READ;
+              mmio.ulTranslate=MMIO_TRANSLATEHEADER;
+
+              hmmio = mmioOpen(fName, &mmio, MMIO_READ);
+              if(!hmmio)
+                break;
+
+              /* The Quicktime IO-procs don't like any data in mmio.pExtraInfoStruct when calling
+                 mmioOpen(). But we need that if we want to have the bitrate of MP3 and Ogg. So the
+                 file is closed here and opened again with the FourCC set to MP3 or OGGS. So the Quicktime
+                 IO-procs will not be called.*/
+              if(somObjectIsA(somSelf, "MMOGG"))
+                {
+                  if(mmioFOURCC('O', 'G', 'G', 'S')==mmio.fccIOProc) { 
+                    mmioClose(hmmio, 0);
+                    
+                    memset(&mmio,0, sizeof(mmio));
+                    mmio.ulFlags=MMIO_READ;
+                    mmio.ulTranslate=MMIO_TRANSLATEHEADER;
+                    mmio.fccIOProc=mmioFOURCC('O', 'G', 'G', 'S');
+                    vorbisOpt.cookie = VORBIS_COOKIE;
+                    mmio.pExtraInfoStruct = &vorbisOpt;
+                    /*Now reopen */
+                    hmmio = mmioOpen(fName, &mmio, MMIO_READ);
+                    if(!hmmio)
+                      break;
+                  }
+                }
+              else if(somObjectIsA(somSelf, "MMMP3"))
+                {
+                  if(mmioFOURCC('M', 'P', '3', ' ')==mmio.fccIOProc) { 
+                    mmioClose(hmmio, 0);
+                    
+                    memset(&mmio,0, sizeof(mmio));
+                    mmio.ulFlags=MMIO_READ;
+                    mmio.ulTranslate=MMIO_TRANSLATEHEADER;
+                    mmio.fccIOProc=mmioFOURCC('M', 'P', '3', ' ');
+                    /* For bitrate query of MP3 */
+                    mp3Opt.cookie = MP3_COOKIE;
+                    mmio.pExtraInfoStruct = &mp3Opt;              
+                    /*Now reopen */
+                    hmmio = mmioOpen(fName, &mmio, MMIO_READ);
+                    if(!hmmio)
+                      break;
+
+                    //SysWriteToTrapLog("%s reopened. mp3Opt.bitrate: %d\n", fName, mp3Opt.bitrate);
+                  }
+                }
+              
+              memset(&mmAudioHeader,0,sizeof(MMAUDIOHEADER));
+              rc = mmioGetHeader(hmmio, &mmAudioHeader,sizeof(MMAUDIOHEADER),
+                                 &lBytesRead, 0, 0);
+              
+              if(rc!=MMIO_SUCCESS) {
+                mmioClose(hmmio, 0);
+                break;
+              }
+
+              mmioClose(hmmio, 0);
+
+              /* Check if the object is still living. */
+              if(!somIsObj(somSelf))
+                break;
+
+              _ulBitRate=0;
+              if(somObjectIsA(somSelf, "MMOGG")) {
+                returnedVorbisOpts = (PVORBISOPTIONS)mmAudioHeader.mmXWAVHeader.XWAVHeaderInfo.pAdditionalInformation;
+                if(0 != returnedVorbisOpts && VORBIS_COOKIE == returnedVorbisOpts->cookie && 0 != returnedVorbisOpts->nominal_bitrate)
+                  _ulBitRate=returnedVorbisOpts->nominal_bitrate;
+              }
+              else if(somObjectIsA(somSelf, "MMMP3")) {
+                returnedMP3Opts = (PMP3OPTIONS)mmAudioHeader.mmXWAVHeader.XWAVHeaderInfo.pAdditionalInformation;
+                if(0 != returnedMP3Opts && MP3_COOKIE == returnedMP3Opts->cookie && 0 != returnedMP3Opts->bitrate)
+                  _ulBitRate=returnedMP3Opts->bitrate;
+              }
+
+              _ulChannels=mmAudioHeader.mmXWAVHeader.WAVEHeader.usChannels;
+              _ulSampleRate=mmAudioHeader.mmXWAVHeader.WAVEHeader.ulSamplesPerSec;
+              _ulBPS=mmAudioHeader.mmXWAVHeader.WAVEHeader.usBitsPerSample;
+              _ulNumAudioBytes=mmAudioHeader.mmXWAVHeader.XWAVHeaderInfo.ulAudioLengthInBytes;
+              /*      sprintf(fName,"%02d:%02d",mmAudioHeader.mmXWAVHeader.XWAVHeaderInfo.ulAudioLengthInBytes/
+                      mmAudioHeader.mmXWAVHeader.WAVEHeader.ulAvgBytesPerSec/60,
+                      mmAudioHeader.mmXWAVHeader.XWAVHeaderInfo.ulAudioLengthInBytes/
+                      mmAudioHeader.mmXWAVHeader.WAVEHeader.ulAvgBytesPerSec%60);*/
+              if(mmAudioHeader.mmXWAVHeader.XWAVHeaderInfo.ulAudioLengthInMS/1000) {
+                _ulPlaySecs=mmAudioHeader.mmXWAVHeader.XWAVHeaderInfo.ulAudioLengthInMS/1000;
+                _ulPlayMsecs=mmAudioHeader.mmXWAVHeader.XWAVHeaderInfo.ulAudioLengthInMS;
+              }
+              else {
+                _ulPlaySecs=mmAudioHeader.mmXWAVHeader.XWAVHeaderInfo.ulAudioLengthInBytes/
+                  mmAudioHeader.mmXWAVHeader.WAVEHeader.ulAvgBytesPerSec;
+                _ulPlayMsecs=_ulPlaySecs*1000;
+              }
+            }/* _somIsA()*/
+          else
+            {
+              /* The file is a midi file. Get audio information using MCI commands. */
+              unsigned char chrCommand[CCHMAXPATH];
+              char retMsg[20];
+              APIRET rc;
+              ULONG ulTime;
+
+              bIsMidi=TRUE;
+
+              /* Prevent Timidity crash */
+              /*if(globalHaveTimidity)
+                break;*/
+
+              /* open the file */
+              sprintf(chrCommand,"open \"%s\"  type SEQUENCER alias wave%p SHAREABLE wait",fName,  somSelf);
+              rc = mciSendString( chrCommand, retMsg, sizeof(retMsg), NULLHANDLE, 0);
+              if((rc & 0x0000ffff)!=MCIERR_SUCCESS) {
+                break;
+              }
+
+              /* Set time format */
+              sprintf(chrCommand,"SET wave%p TIME FORMAT MILLISECONDS wait", somSelf);
+              rc = mciSendString(chrCommand, retMsg, sizeof(retMsg), 0, 0);
+              if((rc & 0x0000ffff)!=MCIERR_SUCCESS) {
+                /* close the file */
+                sprintf(chrCommand,"close wave%p wait", somSelf);
+                mciSendString(chrCommand, retMsg, sizeof(retMsg), 0, 0);
+                break;
+              }
+
+              /* Get midi info */
+              sprintf(chrCommand,"STATUS wave%p LENGTH WAIT", somSelf);
+              rc = mciSendString(chrCommand, retMsg, sizeof(retMsg), 0, 0);
+              if((rc & 0x0000ffff)!=MCIERR_SUCCESS) {
+                /* close the file */
+                sprintf(chrCommand,"close wave%p wait", somSelf);
+                mciSendString(chrCommand, retMsg, sizeof(retMsg), 0, 0);
+                break;
+              }
+              ulTime=atoi(retMsg);
+              //     HlpWriteToTrapLog("Midi-Time in ms: %d %s\n", ulTime, fName);
+
+              if(ulTime/1000) {
+                _ulPlaySecs=ulTime/1000;
+                _ulPlayMsecs=ulTime;
+              }
+              else {
+                _ulPlaySecs=1;
+                _ulPlayMsecs=_ulPlaySecs*1000;
+              }
+
+              //              HlpWriteToTrapLog("Midi-Time ulPlaySecs: %d\n", _ulPlaySecs);
+              sprintf(chrCommand,"STATUS wave%p NUMBER OF TRACKS WAIT", somSelf);
+              rc = mciSendString(chrCommand, retMsg, sizeof(retMsg), 0, 0);
+              if((rc & 0x0000ffff)==MCIERR_SUCCESS) {
+                _ulChannels=atoi(retMsg);
+                //     HlpWriteToTrapLog("Midi-Tracks: %d %s %s\n", _ulChannels, fName, retMsg);
+              }
+
+              /* close the file */
+              sprintf(chrCommand,"close wave%p wait", somSelf);
+              mciSendString(chrCommand, retMsg, sizeof(retMsg), 0, 0);
+            }/* else is MMMIDI */
+
+          _ulFileSize=_wpQueryFileSize(somSelf);
+          _bNeedSaving=TRUE;/* When the object is initialized the new instance data will be saved in wpObjectReady(). */
+
+          sprintf(fName,"%d",_ulChannels);
+          strncpy(_chrChannels, fName, sizeof(_chrChannels));
+          _chrChannels[sizeof(_chrChannels)-1]=0;
+
+          if(bIsMidi)
+            strncpy(_chrSampleRate, "---", sizeof(_chrSampleRate));      
+          else {
+          sprintf(fName,"%d", _ulSampleRate);
+          strncpy(_chrSampleRate, fName, sizeof(_chrSampleRate));          
+          }
+          _chrSampleRate[sizeof(_chrSampleRate)-1]=0;
+
+          if(!_ulBitRate)
+            strncpy(_chrBitRate, "---", sizeof(_chrBitRate));
+          else {
+            sprintf(fName,"%d",_ulBitRate);
+            strncpy(_chrBitRate, fName, sizeof(_chrBitRate));
+          }
+          _chrBitRate[sizeof(_chrBitRate)-1]=0;
+
+          if(bIsMidi)
+            strncpy(_chrBPS, "---", sizeof(_chrBPS));
+          else {
+            sprintf(fName,"%d",_ulBPS);
+            strncpy(_chrBPS, fName, sizeof(_chrBPS));
+          }
+          _chrBPS[sizeof(_chrBPS)-1]=0;
+          
+          sprintf(fName,"%02d:%02d",_ulPlaySecs/60, _ulPlaySecs%60);
+          strncpy(_chrPlayTime, fName, sizeof(_chrPlayTime));
+          _chrPlayTime[sizeof(_chrPlayTime)-1]=0;
+          
+          bContinue=TRUE;
+          break;
+        }/* for */
+      }
+      CATCH(AUDIO_WORKER)
+        {
+          SysWriteToTrapLog("\nTrap occured in %s, file %s, around line %d.\n",
+                            __FUNCTION__, __FILE__, __LINE__);
+          SysWriteToTrapLog("Audio file: %s\n\n",
+                            fName);
+        } END_CATCH;
+
+        /* Hide status window */
+        WinPostMsg(__get_hwndStatus(_CWMMDataFile), WM_APPTERMINATENOTIFY, 0, 0L);
+        
+        if(!bContinue)
+          return (MRESULT)FALSE;
+
+        /* This Message was posted from wpRestore(). It's not allowed to call
+         wpSaveDeferred() from there. The object must be initilized! This is important when 
+         creating objects from templates. So we wait for the object to be initialized.
+         If it isn't initialized within 2s we quit. */
+        ulLoop=0;
+        while(!_wpIsObjectInitialized(somSelf) && ulLoop<40) {
+          DosSleep(50);
+          ulLoop++;
+        }
+        if(ulLoop<20)
+          _wpSaveDeferred(somSelf);
+        /* Now we have the audio info */
+        _wpCnrRefreshDetails(somSelf);
+        /*
+          @@CHANGE 0.2.9
+
+          Also refresh shadows in containers. For now we only support one shadow but that doesn't is a problem
+          because after the first shadow the linked object has queried the audio data and every other shadow
+          that will be awaked can use that info without ending here. Only problem may be the user opens a lot
+          of folders with shadows and we are not fast enough but I don't care at the momen ;-).
+         */
+        if(pLinkObj!=NULLHANDLE && somIsObj(pLinkObj)) /* The check on NULLHANDLE is very fast while somIsObj() needs 
+                                                          quite some time. So we check for a valid object only if we
+                                                          can be quite sure we have an object (pointer!=NULLHANDLE). */
+          _wpCnrRefreshDetails(pLinkObj);
+        return (MRESULT) FALSE;
+      }
+    default:
+      break;
+    }
+
+  return WinDefWindowProc( hwnd, msg, mp1, mp2);
+}
+
Index: /tags/CWMM-0.3.0_GA/classes/c/c_audio/cwcdtrack.c
===================================================================
--- /tags/CWMM-0.3.0_GA/classes/c/c_audio/cwcdtrack.c	(revision 213)
+++ /tags/CWMM-0.3.0_GA/classes/c/c_audio/cwcdtrack.c	(revision 213)
@@ -0,0 +1,392 @@
+
+/*
+ *  This file was generated by the SOM Compiler.
+ *  Generated using:
+ *     SOM incremental update: 2.47
+ */
+
+
+/*
+ * (C) Chris Wohlgemuth 2002-2004
+ *
+ */
+/*
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; see the file COPYING.  If not, write to
+ * the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+/*
+ * If you need another license for your project/product contact me at
+ * 
+ * http://www.os2world.com/cdwriting
+ * http://www.geocities.com/SiliconValley/Sector/5785/
+ */
+
+/*
+ *  This file was generated by the SOM Compiler and Emitter Framework.
+ *  Generated using: 
+ *      SOM Emitter emitctm: 2.42
+ */
+
+#ifndef SOM_Module_cwcdtrack_Source
+#define SOM_Module_cwcdtrack_Source
+#endif
+#define CWCDTrack_Class_Source
+#define M_CWCDTrack_Class_Source
+
+#define INCL_PM
+#define INCL_DOS
+#define INCL_DOSERRORS
+
+#include "os2.h"
+#include <stdio.h>
+#include "cwaudio.h"
+#include "cwcdtrack.ih"
+#include "cwaudioinc.h"
+
+#define IDINFO_TRACKNUM  100
+#define SETUP_CDTRKTRACKNUM "CWCDTTRACKNUM"
+#define CDTRACK_HELP_PANEL   30
+
+PSZ _queryMp3HelpLibraryName(void);
+HMODULE queryModuleHandle(void);
+HMODULE queryResModuleHandle(void);
+BOOL getMessage(char* text,ULONG ulID, LONG lSizeText, HMODULE hResource,HWND hwnd);
+
+SOM_Scope BOOL  SOMLINK cwcdtrackM_wpclsCreateDefaultTemplates(M_MMCDTrack *somSelf, 
+                                                               WPObject* Folder)
+{
+    /* M_MMCDTrackData *somThis = M_MMCDTrackGetData(somSelf); */
+    M_MMCDTrackMethodDebug("M_MMCDTrack","cwcdtrackM_wpclsCreateDefaultTemplates");
+
+    /* We don't need a template */
+    return TRUE;
+
+    /*    return (M_MMCDTrack_parent_M_MMAudio_wpclsCreateDefaultTemplates(somSelf, 
+                                                                     Folder));*/
+}
+
+
+/*
+ * The prototype for cwcdtrack_wpQueryFileSize was replaced by the following prototype:
+ */
+SOM_Scope ULONG  SOMLINK cwcdtrack_wpQueryFileSize(MMCDTrack *somSelf)
+{
+
+  /*    MMAudioData *somThis = MMAudioGetData(somSelf);*/
+    /*    CWCDTrackData *somThis = CWCDTrackGetData(somSelf);*/
+    MMCDTrackMethodDebug("MMCDTrack","cwcdtrack_wpQueryFileSize");
+
+    return (_cwmmQueryTrackInfo(somSelf, NULLHANDLE, 0, IDINFO_PLAYTIME)*44100*4);
+    //    return (_ulPlaySecs*44100*4);
+}
+
+/*
+ * The prototype for cwcdtrack_wpSetupOnce was replaced by the following prototype:
+ */
+SOM_Scope BOOL  SOMLINK cwcdtrack_wpSetupOnce(MMCDTrack *somSelf, 
+                                              PSZ pszSetupString)
+{
+  BOOL rc;
+  char buffer[CCHMAXPATH];
+  ULONG bufferSize;
+
+    MMCDTrackMethodDebug("MMCDTrack","cwcdtrack_wpSetupOnce");
+
+
+#if 0
+    _ulPlaySecs=0;
+    sprintf(_chrPlayTime, "%02d:%02d",_ulPlaySecs/60, _ulPlaySecs%60);
+#endif
+
+    _cwmmSetTrackInfo(somSelf, NULLHANDLE, 16, IDINFO_BPS);
+    _cwmmSetTrackInfo(somSelf, NULLHANDLE, 2, IDINFO_CHANNELS);
+    _cwmmSetTrackInfo(somSelf, NULLHANDLE, 44100, IDINFO_SAMPLERATE);
+
+    bufferSize=sizeof(buffer); 
+    if(_wpScanSetupString(somSelf, pszSetupString, SETUP_CDTRKTRACKNUM, buffer, &bufferSize))
+      {
+        ULONG ulTrack=atoi(buffer);
+        MMCDTrackData *somThis = MMCDTrackGetData(somSelf);
+        if(ulTrack>0 && ulTrack<100) {
+          _ulTrackNum=ulTrack;
+          _wpCnrRefreshDetails(somSelf);
+        }
+      }
+    rc=(MMCDTrack_parent_MMAudio_wpSetupOnce(somSelf, pszSetupString));
+    //    _wpCnrRefreshDetails(somSelf);
+    _wpSetup(somSelf, "DEFAULTVIEW=SETTINGS");
+
+    return rc;
+}
+
+/*
+ * SOM_Scope BOOL  SOMLINK cwcdtrack_wpSetup(CWCDTrack *somSelf, 
+ *                                           PSZ pszSetupString)
+ */
+SOM_Scope BOOL  SOMLINK cwcdtrack_wpSetup(MMCDTrack *somSelf, 
+                                          PSZ pszSetupString)
+{
+BOOL rc;
+/*CWCDTrackData *somThis = CWCDTrackGetData(somSelf);*/
+    MMCDTrackMethodDebug("MMCDTrack","cwcdtrack_wpSetup");
+
+   rc=(MMCDTrack_parent_MMAudio_wpSetup(somSelf, pszSetupString));
+
+   return rc;
+}
+
+/*
+ * The prototype for cwcdtrack_wpAddFileMenuPage was replaced by the following prototype:
+ */
+SOM_Scope ULONG  SOMLINK cwcdtrack_wpAddFileMenuPage(MMCDTrack *somSelf, 
+                                                     HWND hwndNotebook)
+{
+    MMCDTrackMethodDebug("MMCDTrack","cwcdtrack_wpAddFileMenuPage");
+
+    return SETTINGS_PAGE_REMOVED;
+}
+
+/*
+ * The prototype for cwcdtrack_wpAddFile1Page was replaced by the following prototype:
+ */
+SOM_Scope ULONG  SOMLINK cwcdtrack_wpAddFile1Page(MMCDTrack *somSelf, 
+                                                  HWND hwndNotebook)
+{
+    MMCDTrackMethodDebug("MMCDTrack","cwcdtrack_wpAddFile1Page");
+
+    return SETTINGS_PAGE_REMOVED;
+}
+
+/*
+ * The prototype for cwcdtrack_wpAddFile2Page was replaced by the following prototype:
+ */
+SOM_Scope ULONG  SOMLINK cwcdtrack_wpAddFile2Page(MMCDTrack *somSelf, 
+                                                  HWND hwndNotebook)
+{
+    MMCDTrackMethodDebug("MMCDTrack","cwcdtrack_wpAddFile2Page");
+
+    return SETTINGS_PAGE_REMOVED;
+}
+
+/*
+ * The prototype for cwcdtrack_wpAddFile3Page was replaced by the following prototype:
+ */
+SOM_Scope ULONG  SOMLINK cwcdtrack_wpAddFile3Page(MMCDTrack *somSelf, 
+                                                  HWND hwndNotebook)
+{
+    MMCDTrackMethodDebug("MMCDTrack","cwcdtrack_wpAddFile3Page");
+
+    return SETTINGS_PAGE_REMOVED;
+}
+
+/*
+ * The prototype for cwcdtrack_wpAddFileTypePage was replaced by the following prototype:
+ */
+SOM_Scope ULONG  SOMLINK cwcdtrack_wpAddFileTypePage(MMCDTrack *somSelf, 
+                                                     HWND hwndNotebook)
+{
+    MMCDTrackMethodDebug("MMCDTrack","cwcdtrack_wpAddFileTypePage");
+
+    return SETTINGS_PAGE_REMOVED;
+}
+
+/*
+ * The prototype for cwcdtrack_wpFilterPopupMenu was replaced by the following prototype:
+ */
+SOM_Scope ULONG  SOMLINK cwcdtrack_wpFilterPopupMenu(MMCDTrack *somSelf, 
+                                                     ULONG ulFlags, 
+                                                     HWND hwndCnr, 
+                                                     BOOL fMultiSelect)
+{
+
+  /*    MMCDTrackData *somThis = MMCDTrackGetData(somSelf);*/
+    MMCDTrackMethodDebug("MMCDTrack","cwcdtrack_wpFilterPopupMenu");
+
+    return CTXT_SETTINGS | CTXT_HELP | CTXT_DELETE;
+
+    /* We don't want to have XFolder or WPS-Wizard menus here. These are useless
+       for tracks. */
+#if 0
+    rc=(MMCDTrack_parent_MMAudio_wpFilterPopupMenu(somSelf, 
+                                                   ulFlags, 
+                                                   hwndCnr, 
+                                                   fMultiSelect));
+
+    return (CTXT_SETTINGS | rc) & ~( CTXT_OPEN|CTXT_DELETE|CTXT_ARRANGE|CTXT_NEW|CTXT_PICKUP);
+#endif
+}
+
+
+/*
+ * The prototype for cwcdtrack_wpModifyPopupMenu was replaced by the following prototype:
+ */
+SOM_Scope BOOL  SOMLINK cwcdtrack_wpModifyPopupMenu(MMCDTrack *somSelf, 
+                                                    HWND hwndMenu, 
+                                                    HWND hwndCnr, 
+                                                    ULONG iPosition)
+{
+  /*    MMCDTrackData *somThis = MMCDTrackGetData(somSelf);*/
+    MMCDTrackMethodDebug("MMCDTrack","cwcdtrack_wpModifyPopupMenu");
+
+    return TRUE;
+    /* We don't want to have XFolder or WPS-Wizard menus here. These are useless
+       for tracks. */
+#if 0
+    rc= (MMCDTrack_parent_MMAudio_wpModifyPopupMenu(somSelf, 
+                                                    hwndMenu, 
+                                                    hwndCnr, 
+                                                    iPosition));
+    /*    WinSendMsg(hwndMenu, MM_REMOVEITEM, MPFROM2SHORT(0xBC0D, TRUE), 0);*/
+    return rc;
+#endif
+}
+
+/*
+ * The prototype for cwcdtrack_wpInsertPopupMenuItems was replaced by the following prototype:
+ */
+SOM_Scope BOOL  SOMLINK cwcdtrack_wpInsertPopupMenuItems(MMCDTrack *somSelf, 
+                                                         HWND hwndMenu, 
+                                                         ULONG iPosition, 
+                                                         HMODULE hmod, 
+                                                         ULONG MenuID, 
+                                                         ULONG SubMenuID)
+{
+  /*    MMCDTrackData *somThis = MMCDTrackGetData(somSelf);*/
+    MMCDTrackMethodDebug("MMCDTrack","cwcdtrack_wpInsertPopupMenuItems");
+
+    return (MMCDTrack_parent_MMAudio_wpInsertPopupMenuItems(somSelf, 
+                                                            hwndMenu, 
+                                                            iPosition, 
+                                                            hmod, 
+                                                            MenuID, 
+                                                            SubMenuID));
+}
+
+/*
+ * The prototype for cwcdtrack_cwmmQueryTrackInfo was replaced by the following prototype:
+ */
+
+/*
+ * SOM_Scope ULONG  SOMLINK cwcdtrack_cwmmQueryTrackInfo(MMCDTrack *somSelf, 
+ *                                                       char** chrString, 
+ *                                                       ULONG ulSize, 
+ *                                                       int iWhich)
+ */
+
+/*
+ * The prototype for cwcdtrack_cwmmQueryTrackInfo was replaced by the following prototype:
+ */
+
+/*
+ * SOM_Scope ULONG  SOMLINK cwcdtrack_cwmmQueryTrackInfo(MMCDTrack *somSelf, 
+ *                                                       PSZ chrString, 
+ *                                                       ULONG ulSize, 
+ *                                                       int iWhich)
+ */
+
+/*
+ * The prototype for cwcdtrack_cwmmQueryTrackInfo was replaced by the following prototype:
+ */
+SOM_Scope ULONG  SOMLINK cwcdtrack_cwmmQueryTrackInfo(MMCDTrack *somSelf, 
+                                                      PSZ chrString, 
+                                                      ULONG ulSize, 
+                                                      ULONG iWhich)
+{
+    MMCDTrackData *somThis = MMCDTrackGetData(somSelf);
+    MMCDTrackMethodDebug("MMCDTrack","cwcdtrack_cwmmQueryTrackInfo");
+
+    switch(iWhich)
+      {
+      case IDINFO_TRACKNUM:
+        {
+        return _ulTrackNum;
+        }
+      default:
+      break;
+      }
+    return (MMCDTrack_parent_MMAudio_cwmmQueryTrackInfo(somSelf, 
+                                                        chrString, 
+                                                        ulSize, 
+                                                        iWhich));
+}
+
+/*
+ * The prototype for cwcdtrackM_wpclsQueryStyle was replaced by the following prototype:
+ */
+SOM_Scope ULONG  SOMLINK cwcdtrackM_wpclsQueryStyle(M_MMCDTrack *somSelf)
+{
+    /* M_CWCDTrackData *somThis = M_CWCDTrackGetData(somSelf); */
+    M_MMCDTrackMethodDebug("M_MMCDTrack","cwcdtrackM_wpclsQueryStyle");
+
+    return (M_MMCDTrack_parent_M_MMAudio_wpclsQueryStyle(somSelf)
+            |CLSSTYLE_NEVERLINK|CLSSTYLE_NEVERCOPY|CLSSTYLE_NEVERMOVE|CLSSTYLE_NEVERPRINT|CLSSTYLE_DONTTEMPLATE);
+}
+
+/*
+ * The prototype for cwcdtrackM_wpclsQueryTitle was replaced by the following prototype:
+ */
+SOM_Scope PSZ  SOMLINK cwcdtrackM_wpclsQueryTitle(M_MMCDTrack *somSelf)
+{
+  static char chrTitle[20]={0};
+
+    /* M_CWCDTrackData *somThis = M_CWCDTrackGetData(somSelf); */
+    M_MMCDTrackMethodDebug("M_MMCDTrack","cwcdtrackM_wpclsQueryTitle");
+
+    if(chrTitle[0]==0)
+      if(!getMessage(chrTitle, IDSTR_CDTRACKTITLE, sizeof(chrTitle), queryResModuleHandle(), HWND_DESKTOP))
+        strcpy(chrTitle, CLSTITLE_CDTRACK);
+
+    return chrTitle;
+}
+
+/*
+ * The prototype for cwcdtrackM_wpclsQueryInstanceType was replaced by the following prototype:
+ */
+SOM_Scope PSZ  SOMLINK cwcdtrackM_wpclsQueryInstanceType(M_MMCDTrack *somSelf)
+{
+    /* M_CWCDTrackData *somThis = M_CWCDTrackGetData(somSelf); */
+    M_MMCDTrackMethodDebug("M_MMCDTrack","cwcdtrackM_wpclsQueryInstanceType");
+
+    return TYPE_CDTRACK;
+}
+
+/*
+ * The prototype for cwcdtrackM_wpclsQueryDefaultHelp was replaced by the following prototype:
+ */
+
+SOM_Scope BOOL  SOMLINK cwcdtrackM_wpclsQueryDefaultHelp(M_MMCDTrack *somSelf, 
+                                                         PULONG pHelpPanelId, 
+                                                         PSZ pszHelpLibrary)
+{
+  PSZ pszHelpLibName;
+    /* M_CWCDTrackData *somThis = M_CWCDTrackGetData(somSelf); */
+    M_MMCDTrackMethodDebug("M_MMCDTrack","cwcdtrackM_wpclsQueryDefaultHelp");
+
+    if((pszHelpLibName=_queryMp3HelpLibraryName())!=NULLHANDLE)
+      {
+        if(pHelpPanelId)
+          *pHelpPanelId=CDTRACK_HELP_PANEL;
+        if(pszHelpLibrary)
+          strncpy(pszHelpLibrary, pszHelpLibName, CCHMAXPATH);
+        return TRUE; 
+      }
+
+    return (M_MMCDTrack_parent_M_MMAudio_wpclsQueryDefaultHelp(somSelf, 
+                                                               pHelpPanelId, 
+                                                               pszHelpLibrary));
+}
+
+
+
+
Index: /tags/CWMM-0.3.0_GA/classes/c/c_audio/cwflac.c
===================================================================
--- /tags/CWMM-0.3.0_GA/classes/c/c_audio/cwflac.c	(revision 213)
+++ /tags/CWMM-0.3.0_GA/classes/c/c_audio/cwflac.c	(revision 213)
@@ -0,0 +1,108 @@
+/*
+ * (C) Chris Wohlgemuth 2002-2004
+ *
+ */
+/*
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; see the file COPYING.  If not, write to
+ * the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
+ */          
+/*
+ * If you need another license for your project/product (commercial,
+ * noncommercial, whatever) contact me at
+ * 
+ * http://www.os2world.com/cdwriting
+ * http://www.geocities.com/SiliconValley/Sector/5785/
+ *
+ */
+/*
+ *  This file was generated by the SOM Compiler and Emitter Framework.
+ *  Generated using: 
+ *      SOM Emitter emitctm: 2.42
+ */
+
+#ifndef SOM_Module_cwflac_Source
+#define SOM_Module_cwflac_Source
+#endif
+#define MMFLAC_Class_Source
+#define M_MMFLAC_Class_Source
+
+#include <os2.h>
+#include "cwflac.ih"
+#include "cwaudioinc.h"
+
+HMODULE queryResModuleHandle(void);
+HMODULE queryModuleHandle(void);
+BOOL getMessage(char* text,ULONG ulID, LONG lSizeText, HMODULE hResource,HWND hwnd);
+
+SOM_Scope PSZ  SOMLINK cwflacM_wpclsQueryInstanceType(M_MMFLAC *somSelf)
+{
+    /* M_MMFLACData *somThis = M_MMFLACGetData(somSelf); */
+    M_MMFLACMethodDebug("M_MMFLAC","cwflacM_wpclsQueryInstanceType");
+
+    return TYPE_FLAC;
+}
+
+SOM_Scope PSZ  SOMLINK cwflacM_wpclsQueryInstanceFilter(M_MMFLAC *somSelf)
+{
+    /* M_MMFLACData *somThis = M_MMFLACGetData(somSelf); */
+    M_MMFLACMethodDebug("M_MMFLAC","cwflacM_wpclsQueryInstanceFilter");
+
+    return "*.FLA,*.FLAC";
+}
+
+SOM_Scope BOOL  SOMLINK cwflacM_wpclsQueryDefaultHelp(M_MMFLAC *somSelf, 
+                                                      PULONG pHelpPanelId, 
+                                                      PSZ pszHelpLibrary)
+{
+    /* M_MMFLACData *somThis = M_MMFLACGetData(somSelf); */
+    M_MMFLACMethodDebug("M_MMFLAC","cwflacM_wpclsQueryDefaultHelp");
+
+    return (M_MMFLAC_parent_M_MMAudio_wpclsQueryDefaultHelp(somSelf, 
+                                                            pHelpPanelId, 
+                                                            pszHelpLibrary));
+}
+
+SOM_Scope PSZ  SOMLINK cwflacM_wpclsQueryTitle(M_MMFLAC *somSelf)
+{
+  static char chrTitle[20]={0};
+    /* M_MMFLACData *somThis = M_MMFLACGetData(somSelf); */
+    M_MMFLACMethodDebug("M_MMFLAC","cwflacM_wpclsQueryTitle");
+
+    if(chrTitle[0]==0)
+      if(!getMessage(chrTitle, IDSTR_FLACTITLE, sizeof(chrTitle), queryResModuleHandle(), HWND_DESKTOP))
+        strcpy(chrTitle, CLSTITLE_FLAC);
+
+    return chrTitle;
+}
+
+SOM_Scope ULONG  SOMLINK cwflacM_wpclsQueryIconData(M_MMFLAC *somSelf, 
+                                                    PICONINFO pIconInfo)
+{
+  HMODULE hmod;
+    /* M_MMFLACData *somThis = M_MMFLACGetData(somSelf); */
+    M_MMFLACMethodDebug("M_MMFLAC","cwflacM_wpclsQueryIconData");
+
+    hmod=queryModuleHandle();
+    if(!hmod)
+      return M_MMFLAC_parent_M_MMAudio_wpclsQueryIconData(somSelf, pIconInfo);
+
+	if (pIconInfo)   {
+      pIconInfo->fFormat = ICON_RESOURCE;
+      pIconInfo->hmod    = hmod;
+      pIconInfo->resid   = ID_ICONFLACFILE;
+	} /* endif */
+
+	return ( sizeof(ICONINFO) );
+}
+
Index: /tags/CWMM-0.3.0_GA/classes/c/c_audio/cwiff.c
===================================================================
--- /tags/CWMM-0.3.0_GA/classes/c/c_audio/cwiff.c	(revision 213)
+++ /tags/CWMM-0.3.0_GA/classes/c/c_audio/cwiff.c	(revision 213)
@@ -0,0 +1,148 @@
+/*
+ * (C) Chris Wohlgemuth 2002-2004
+ *
+ */
+/*
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; see the file COPYING.  If not, write to
+ * the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+/*
+ * If you need another license for your project/product contact me at
+ * 
+ * http://www.os2world.com/cdwriting
+ * http://www.geocities.com/SiliconValley/Sector/5785/
+ */
+/*
+ *  This file was generated by the SOM Compiler and Emitter Framework.
+ *  Generated using: 
+ *      SOM Emitter emitctm: 2.42
+ */
+
+#ifndef SOM_Module_cwiff_Source
+#define SOM_Module_cwiff_Source
+#endif
+#define CWIFF_Class_Source
+#define M_CWIFF_Class_Source
+
+#include <os2.h>
+#include "helpid.h"
+#include "cwiff.ih"
+#include "cwaudioinc.h"
+
+extern char chrHelpLibrary[CCHMAXPATH];
+
+HMODULE queryResModuleHandle(void);
+HMODULE queryModuleHandle(void);
+BOOL getMessage(char* text,ULONG ulID, LONG lSizeText, HMODULE hResource,HWND hwnd);
+
+
+/*
+ * The prototype for cwiffM_wpclsQueryInstanceType was replaced by the following prototype:
+ */
+SOM_Scope PSZ  SOMLINK cwiffM_wpclsQueryInstanceType(M_MMIFF *somSelf)
+{
+    /* M_CWIFFData *somThis = M_CWIFFGetData(somSelf); */
+    M_MMIFFMethodDebug("M_MMIFF","cwiffM_wpclsQueryInstanceType");
+
+    return TYPE_IFF;
+}
+
+
+/*
+ * The prototype for cwiffM_wpclsQueryInstanceFilter was replaced by the following prototype:
+ */
+SOM_Scope PSZ  SOMLINK cwiffM_wpclsQueryInstanceFilter(M_MMIFF *somSelf)
+{
+    /* M_CWIFFData *somThis = M_CWIFFGetData(somSelf); */
+    M_MMIFFMethodDebug("M_MMIFF","cwiffM_wpclsQueryInstanceFilter");
+
+    return "*.IFF";
+}
+
+
+/*
+ * SOM_Scope BOOL  SOMLINK cwiffM_wpclsQueryDefaultHelp(M_CWIFF *somSelf, 
+ *                                                      PULONG pHelpPanelId, 
+ *                                                      PSZ pszHelpLibrary)
+ */
+
+/*
+ * The prototype for cwiffM_wpclsQueryDefaultHelp was replaced by the following prototype:
+ */
+SOM_Scope BOOL  SOMLINK cwiffM_wpclsQueryDefaultHelp(M_MMIFF *somSelf, 
+                                                     PULONG pHelpPanelId, 
+                                                     PSZ pszHelpLibrary)
+{
+    /* M_CWIFFData *somThis = M_CWIFFGetData(somSelf); */
+    M_MMIFFMethodDebug("M_MMIFF","cwiffM_wpclsQueryDefaultHelp");
+
+
+    if(pHelpPanelId)
+      *pHelpPanelId=IFFFILE_HELP_PANEL;
+    if(pszHelpLibrary)
+      strncpy(pszHelpLibrary, chrHelpLibrary, CCHMAXPATH);
+    return TRUE; 
+}
+
+
+/*
+ * SOM_Scope PSZ  SOMLINK cwiffM_wpclsQueryTitle(M_CWIFF *somSelf)
+ */
+
+/*
+ * The prototype for cwiffM_wpclsQueryTitle was replaced by the following prototype:
+ */
+SOM_Scope PSZ  SOMLINK cwiffM_wpclsQueryTitle(M_MMIFF *somSelf)
+{
+  static char chrTitle[20]={0};
+    /* M_CWIFFData *somThis = M_CWIFFGetData(somSelf); */
+    M_MMIFFMethodDebug("M_MMIFF","cwiffM_wpclsQueryTitle");
+
+    if(chrTitle[0]==0)
+      if(!getMessage(chrTitle, IDSTR_IFFTITLE, sizeof(chrTitle), queryResModuleHandle(), HWND_DESKTOP))
+        strcpy(chrTitle, CLSTITLE_IFF);
+
+    return chrTitle;
+}
+
+
+/*
+ * SOM_Scope ULONG  SOMLINK cwiffM_wpclsQueryIconData(M_CWIFF *somSelf, 
+ *                                                    PICONINFO pIconInfo)
+ */
+
+/*
+ * The prototype for cwiffM_wpclsQueryIconData was replaced by the following prototype:
+ */
+SOM_Scope ULONG  SOMLINK cwiffM_wpclsQueryIconData(M_MMIFF *somSelf, 
+                                                   PICONINFO pIconInfo)
+{
+  HMODULE hmod;
+    /* M_CWIFFData *somThis = M_CWIFFGetData(somSelf); */
+    M_MMIFFMethodDebug("M_MMIFF","cwiffM_wpclsQueryIconData");
+
+    hmod=queryModuleHandle();
+    if(!hmod)
+      return M_MMIFF_parent_M_MMAudio_wpclsQueryIconData(somSelf, pIconInfo);
+
+	if (pIconInfo)   {
+      pIconInfo->fFormat = ICON_RESOURCE;
+      pIconInfo->hmod    = hmod;
+      pIconInfo->resid   = ID_ICONVOCFILE;
+	} /* endif */
+
+	return ( sizeof(ICONINFO) );
+
+}
+
Index: /tags/CWMM-0.3.0_GA/classes/c/c_audio/cwm3u.c
===================================================================
--- /tags/CWMM-0.3.0_GA/classes/c/c_audio/cwm3u.c	(revision 213)
+++ /tags/CWMM-0.3.0_GA/classes/c/c_audio/cwm3u.c	(revision 213)
@@ -0,0 +1,447 @@
+/*
+ * (C) Chris Wohlgemuth 2002-2004
+ *
+ */
+/*
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; see the file COPYING.  If not, write to
+ * the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
+ */          
+/*
+ * If you need another license for your project/product (commercial,
+ * noncommercial, whatever) contact me at
+ * 
+ * http://www.os2world.com/cdwriting
+ * http://www.geocities.com/SiliconValley/Sector/5785/
+ *
+ */
+/*
+ *  This file was generated by the SOM Compiler and Emitter Framework.
+ *  Generated using: 
+ *      SOM Emitter emitctm: 2.42
+ */
+
+#ifndef SOM_Module_cwm3u_Source
+#define SOM_Module_cwm3u_Source
+#endif
+#define MMM3U_Class_Source
+#define M_MMM3U_Class_Source
+
+#define INCL_PM
+
+#define INCL_DOS
+#define INCL_DOSERRORS
+
+#include <os2.h>
+#include <stdio.h>
+#include "cwm3u.ih"
+#include "cwaudioinc.h"
+//#include "cwmmres.h"
+#include "mmres.h"
+#include "except.h"
+#include "wpfolder.h"
+
+#include "som_wps_funcs.h"
+
+HMODULE queryResModuleHandle(void);
+HMODULE queryModuleHandle(void);
+BOOL getMessage(char* text,ULONG ulID, LONG lSizeText, HMODULE hResource,HWND hwnd);
+ULONG launchPMProg(PSZ pszTitle, PSZ wrapperExe, PSZ parameters,  WPObject *thisPtr, ULONG ulView);
+void HlpWriteToTrapLog(const char* chrFormat, ...);
+BOOL mmclsCreateTheDefaultTemplate(M_WPObject *somSelf, 
+                                   WPObject* Folder);
+PSZ _queryMp3HelpLibraryName(void);
+
+
+SOM_Scope BOOL  SOMLINK cwm3u_wpModifyPopupMenu(MMM3U *somSelf, 
+                                                HWND hwndMenu, 
+                                                HWND hwndCnr, 
+                                                ULONG iPosition)
+{
+    /* MMM3UData *somThis = MMM3UGetData(somSelf); */
+    MMM3UMethodDebug("MMM3U","cwm3u_wpModifyPopupMenu");
+
+    _wpInsertPopupMenuItems(somSelf, hwndMenu, 1, queryResModuleHandle(), ID_MENU_M3UPLAYER, 1);
+    _wpInsertPopupMenuItems(somSelf, hwndMenu, 1, queryResModuleHandle(), ID_MENU_M3UEDITOR, 1);
+    return (MMM3U_parent_CWMMDataFile_wpModifyPopupMenu(somSelf, 
+                                                      hwndMenu, 
+                                                      hwndCnr, 
+                                                      iPosition));
+}
+
+SOM_Scope BOOL  SOMLINK cwm3u_wpMenuItemSelected(MMM3U *somSelf, 
+                                                 HWND hwndFrame, 
+                                                 ULONG ulMenuId)
+{
+    /* MMM3UData *somThis = MMM3UGetData(somSelf); */
+    MMM3UMethodDebug("MMM3U","cwm3u_wpMenuItemSelected");
+    switch(ulMenuId)
+      {
+      case ID_MENU_M3UEDITOR:
+        _wpViewObject(somSelf, NULLHANDLE, ulMenuId, 0);
+        return TRUE;
+      case ID_MENU_M3UPLAYER:
+        _wpViewObject(somSelf, NULLHANDLE, ulMenuId, 0);
+        return TRUE;
+      default:
+        break;
+      }
+
+    return (MMM3U_parent_CWMMDataFile_wpMenuItemSelected(somSelf, 
+                                                       hwndFrame, 
+                                                       ulMenuId));
+}
+
+
+MRESULT EXPENTRY m3uFolderCloseHandlerProc(HWND hwnd, ULONG msg, MPARAM mp1, MPARAM mp2)
+{
+
+  switch (msg)
+    {
+    case WM_TIMER:
+      {
+        MMDATAFILEVIEW *pParams=(MMDATAFILEVIEW*)WinQueryWindowULong(hwnd, QWL_USER);
+        WPObject*somSelf;
+
+        WinStopTimer(WinQueryAnchorBlock(HWND_DESKTOP), hwnd, 1);        
+        somSelf=pParams->thisPtr;
+        /* Destroy folder */
+        _wpFree(pParams->wpObject);
+        _wpFreeMem(somSelf, (PBYTE)pParams);
+        WinDestroyWindow(hwnd);
+      }
+      return MRFALSE;
+    case WM_APPTERMINATENOTIFY:
+      {
+        MMDATAFILEVIEW *pParams=(MMDATAFILEVIEW*)WinQueryWindowULong(hwnd, QWL_USER);
+        WPObject*somSelf;
+        
+        somSelf=pParams->thisPtr;
+        _wpDeleteFromObjUseList(somSelf, &pParams->useItem);
+        WinStartTimer(WinQueryAnchorBlock(HWND_DESKTOP), hwnd, 1, 1000);
+        return MRFALSE;
+      }
+    default:
+      break;
+    }
+  return WinDefWindowProc( hwnd, msg, mp1, mp2);
+}
+
+
+SOM_Scope HWND  SOMLINK cwm3u_wpOpen(MMM3U *somSelf, HWND hwndCnr, 
+                                     ULONG ulView, ULONG param)
+{
+  ULONG ulRc;
+    /* MMM3UData *somThis = MMM3UGetData(somSelf); */
+    MMM3UMethodDebug("MMM3U","cwm3u_wpOpen");
+
+    switch(ulView)
+      {
+      case ID_MENU_M3UEDITOR:
+        /* case 0xbc2d:  Editor */ 
+        {
+          char chrPlayer[CCHMAXPATH]={0};
+          char chrParams[CCHMAXPATH+10]="\"";
+          char chrTitle[50];
+          char *chrPtr=chrParams;
+          ULONG ulSize;
+          WPObject* wpObject;
+          WPFolder *wpFolder;
+
+          if(!getMessage(chrTitle, IDSTR_M3UEDITORTITLE, sizeof(chrTitle), queryResModuleHandle(), HWND_DESKTOP))
+            strcpy(chrTitle, "Playlist editor");
+
+          chrPtr++;
+          ulSize=sizeof(chrParams)-2;
+          _wpQueryRealName(somSelf, chrPtr, &ulSize, TRUE);
+          strcat(chrPtr,"\"");
+
+          /* Check for user setting */
+          if(PrfQueryProfileString(HINI_USERPROFILE, "CWMM", "m3ueditor", NULLHANDLE, chrPlayer,sizeof(chrPlayer))) {
+            if((ulRc=launchPMProg( chrTitle, chrPlayer, chrParams, somSelf, ulView))==NULLHANDLE)
+              break; /* Use System default (E.EXE) */
+            return NULLHANDLE;
+          }
+
+          /* Create and open M3U folder */
+          wpFolder=_wpclsQueryFolder(_WPFolder, "<WP_NOWHERE>", FALSE);
+          if(somIsObj(wpFolder))
+            {
+              SOMClass* somClass;
+
+              ulSize=sizeof(chrPlayer);
+              /* Get name of M3U file */
+              _wpQueryRealName(somSelf, chrPlayer, &ulSize, FALSE);
+              somClass=somGetSomClass("CWM3UFolder");
+
+              if(!somIsObj(somClass))
+                somClass=somGetSomClass("CWM3UFolder");
+
+              if(somIsObj(somClass))
+                 wpObject=_wpclsNew(somClass, chrPlayer, "", 
+                                    wpFolder,FALSE);
+              else
+                break;
+
+              if(somIsObj(wpObject)) {
+                 HWND hwnd;
+                /* Send the handle of the M3U-File to the M3U folder. */
+                sprintf(chrPlayer, "M3UOBJECTHANDLE=%ld;", somSelf);
+                _wpSetup(wpObject, chrPlayer);
+
+                if((hwnd=_wpViewObject(wpObject, NULLHANDLE, OPEN_DEFAULT, 0))!=NULLHANDLE) {
+                  HWND hwndAppTerminateHandler;
+                  /* Folder opened. Add the object to inuse list. */
+                  ULONG ulError;
+                  MMDATAFILEVIEW *pParams=(MMDATAFILEVIEW*)_wpAllocMem(somSelf,sizeof(MMDATAFILEVIEW), &ulError);
+                  
+                  if(pParams) {
+                    /* Create an object window which will process the WM_APPTERMINATE message. While processing of this
+                       message the view item (see below) will be removed from the inuse list thus removing the inuse emphasis. */
+                    hwndAppTerminateHandler=WinCreateWindow(HWND_OBJECT,WC_STATIC,"CWMMAppTerminate",0,0,0,0,0,
+                                                            NULLHANDLE,HWND_BOTTOM,13344,NULL,NULL);
+                    if(hwndAppTerminateHandler) {
+                      WinSubclassWindow(hwndAppTerminateHandler,&m3uFolderCloseHandlerProc);
+                      sprintf(chrPlayer, "M3UOBJECTWINDOW=%ld;", 
+                              hwndAppTerminateHandler);
+                      _wpSetup(wpObject, chrPlayer);
+                    }
+                    /* We have memory */
+                    memset((void*)pParams ,0, sizeof(MMDATAFILEVIEW));
+                    pParams->pid=0;
+                    pParams->thisPtr=somSelf; /* The object */
+                    pParams->viewItem.view=ulView; /* The open view */
+                    pParams->useItem.type=USAGE_OPENVIEW; /* We add a view item to the inus list */
+                    pParams->viewItem.handle=hwnd; /* */
+                    pParams->wpObject=wpObject;
+                    _wpAddToObjUseList(somSelf, &pParams->useItem); /* add to inuse list */
+                    WinSetWindowULong(hwndAppTerminateHandler, QWL_USER,(ULONG)pParams);
+                    return hwnd;
+                  }/* pParams */
+                }/* wpViewObject() */
+                _wpFree(wpObject);
+              }/* somIsObj() */
+            }/* somIsObj(wpFolder) */
+          /* No M3U folder. Open E.EXE as fallback. */
+          launchPMProg( chrTitle, "e.exe", chrParams, somSelf, ulView);
+          break;
+        }
+      case ID_MENU_M3UPLAYER:
+        /* case 0xbc2d:  player */ 
+        {
+          char chrPlayer[CCHMAXPATH]={0};
+          char chrParams[CCHMAXPATH+10]="\"";
+          char chrTitle[50];
+          char *chrPtr=chrParams;
+          ULONG ulSize;
+          WPObject* wpObject;
+          WPFolder *wpFolder;
+
+          if(!getMessage(chrTitle, IDSTR_AUDPLAYERTITLE, sizeof(chrTitle), queryResModuleHandle(), HWND_DESKTOP))
+            strcpy(chrTitle, "Player");
+
+          chrPtr++;
+          ulSize=sizeof(chrParams)-2;
+          _wpQueryRealName(somSelf, chrPtr, &ulSize, TRUE);
+          strcat(chrPtr,"\"");
+
+          /* Check for user setting */
+          if(PrfQueryProfileString(HINI_USERPROFILE, "CWMM", "m3uplayer", NULLHANDLE, chrPlayer,sizeof(chrPlayer))) {
+            if((ulRc=launchPMProg( chrTitle, chrPlayer, chrParams, somSelf, ulView))==NULLHANDLE)
+              break; /* Use System default (E.EXE) */
+            return NULLHANDLE;
+          }
+
+          /* Create and open M3U folder */
+          wpFolder=_wpclsQueryFolder(_WPFolder, "<WP_NOWHERE>", FALSE);
+          if(somIsObj(wpFolder))
+            {
+              SOMClass* somClass;
+
+              ulSize=sizeof(chrPlayer);
+              /* Get name of M3U file */
+              _wpQueryRealName(somSelf, chrPlayer, &ulSize, FALSE);
+              somClass=somGetSomClass("CWMediaFolder");
+
+              if(!somIsObj(somClass))
+                somClass=somGetSomClass("CWMediaFolder");
+
+              if(somIsObj(somClass))
+                 wpObject=_wpclsNew(somClass, chrPlayer, "", 
+                                    wpFolder,FALSE);
+              else
+                break;
+
+              if(somIsObj(wpObject)) {
+                 HWND hwnd;
+                /* Send the handle of the M3U-File to the M3U folder. */
+                sprintf(chrPlayer, "M3UOBJECTHANDLE=%ld;", somSelf);
+                _wpSetup(wpObject, chrPlayer);
+
+                /* Open folder */
+                if((hwnd=_wpViewObject(wpObject, NULLHANDLE, OPEN_DEFAULT, 0))!=NULLHANDLE) {
+                  HWND hwndAppTerminateHandler;
+                  /* Folder opened. Add the object to inuse list. */
+                  ULONG ulError;
+                  MMDATAFILEVIEW *pParams=(MMDATAFILEVIEW*)_wpAllocMem(somSelf,sizeof(MMDATAFILEVIEW), &ulError);
+                  
+                  if(pParams) {
+                    /* Create an object window which will process the WM_APPTERMINATE message. While processing of this
+                       message the view item (see below) will be removed from the inuse list thus removing the inuse emphasis. */
+                    hwndAppTerminateHandler=WinCreateWindow(HWND_OBJECT,WC_STATIC,"CWMMAppTerminate",0,0,0,0,0,
+                                                            NULLHANDLE,HWND_BOTTOM,13344,NULL,NULL);
+                    if(hwndAppTerminateHandler) {
+                      WinSubclassWindow(hwndAppTerminateHandler,&m3uFolderCloseHandlerProc);
+                      sprintf(chrPlayer, "M3UOBJECTWINDOW=%ld;", 
+                              hwndAppTerminateHandler);
+                      _wpSetup(wpObject, chrPlayer);
+                    }
+                    /* We have memory */
+                    memset((void*)pParams ,0, sizeof(MMDATAFILEVIEW));
+                    pParams->pid=0;
+                    pParams->thisPtr=somSelf; /* The object */
+                    pParams->viewItem.view=ulView; /* The open view */
+                    pParams->useItem.type=USAGE_OPENVIEW; /* We add a view item to the inus list */
+                    pParams->viewItem.handle=hwnd; /* */
+                    pParams->wpObject=wpObject;
+                    _wpAddToObjUseList(somSelf, &pParams->useItem); /* add to inuse list */
+                    WinSetWindowULong(hwndAppTerminateHandler, QWL_USER,(ULONG)pParams);
+                    sprintf(chrPlayer, "INSERTTRACKS=1;");
+                    _wpSetup(wpObject, chrPlayer);
+                    return hwnd;
+                  }/* pParams */
+                }/* wpViewObject() */
+                _wpFree(wpObject);
+              }/* somIsObj() */
+            }/* somIsObj(wpFolder) */
+          /* No M3U folder. Open E.EXE as fallback. */
+          launchPMProg( chrTitle, "e.exe", chrParams, somSelf, ulView);
+          break;
+        }
+
+      default:
+        break;
+      }
+    return (MMM3U_parent_CWMMDataFile_wpOpen(somSelf, hwndCnr, 
+                                           ulView, param));
+}
+
+
+SOM_Scope void  SOMLINK cwm3u_wpCopiedFromTemplate(MMM3U *somSelf)
+{
+    /* MMM3UData *somThis = MMM3UGetData(somSelf); */
+    MMM3UMethodDebug("MMM3U","cwm3u_wpCopiedFromTemplate");
+
+    MMM3U_parent_CWMMDataFile_wpCopiedFromTemplate(somSelf);
+
+    _wpViewObject(somSelf, NULLHANDLE, OPEN_DEFAULT, 0);
+}
+
+
+/*
+ *    wpclsQueryInstanceFilter    : override;
+ */
+SOM_Scope PSZ  SOMLINK cwm3uM_wpclsQueryInstanceType(M_MMM3U *somSelf)
+{
+    /* M_MMM3UData *somThis = M_MMM3UGetData(somSelf); */
+    M_MMM3UMethodDebug("M_MMM3U","cwm3uM_wpclsQueryInstanceType");
+
+    //    return "M3U,Plain Text";
+    return TYPE_M3U;
+}
+
+SOM_Scope PSZ  SOMLINK cwm3uM_wpclsQueryInstanceFilter(M_MMM3U *somSelf)
+{
+    /* M_MMM3UData *somThis = M_MMM3UGetData(somSelf); */
+    M_MMM3UMethodDebug("M_MMM3U","cwm3uM_wpclsQueryInstanceFilter");
+
+    return "*.M3U";
+}
+
+SOM_Scope BOOL  SOMLINK cwm3uM_wpclsQueryDefaultHelp(M_MMM3U *somSelf, 
+                                                     PULONG pHelpPanelId, 
+                                                     PSZ pszHelpLibrary)
+{
+  PSZ pszHelpLibName;
+
+    /* M_MMM3UData *somThis = M_MMM3UGetData(somSelf); */
+    M_MMM3UMethodDebug("M_MMM3U","cwm3uM_wpclsQueryDefaultHelp");
+
+
+    if((pszHelpLibName=_queryMp3HelpLibraryName())!=NULLHANDLE)
+      {
+        if(pHelpPanelId)
+          *pHelpPanelId=M3UFILE_HELP_PANEL;
+        if(pszHelpLibrary)
+          strncpy(pszHelpLibrary, pszHelpLibName, CCHMAXPATH);
+        return TRUE; 
+      }
+
+    return (M_MMM3U_parent_M_CWMMDataFile_wpclsQueryDefaultHelp(somSelf, 
+                                                           pHelpPanelId, 
+                                                           pszHelpLibrary));
+}
+
+SOM_Scope PSZ  SOMLINK cwm3uM_wpclsQueryTitle(M_MMM3U *somSelf)
+{
+  static char chrTitle[20]={0};
+    /* M_MMM3UData *somThis = M_MMM3UGetData(somSelf); */
+    M_MMM3UMethodDebug("M_MMM3U","cwm3uM_wpclsQueryTitle");
+
+    if(chrTitle[0]==0)
+      if(!getMessage(chrTitle, IDSTR_M3UTITLE, sizeof(chrTitle), queryResModuleHandle(), HWND_DESKTOP))
+        strcpy(chrTitle, CLSTITLE_M3U);
+
+    return chrTitle;
+}
+
+SOM_Scope ULONG  SOMLINK cwm3uM_wpclsQueryIconData(M_MMM3U *somSelf, 
+                                                   PICONINFO pIconInfo)
+{
+  HMODULE hmod;
+    /* M_MMM3UData *somThis = M_MMM3UGetData(somSelf); */
+    M_MMM3UMethodDebug("M_MMM3U","cwm3uM_wpclsQueryIconData");
+
+    hmod=queryModuleHandle();
+    if(!hmod)
+      return M_MMM3U_parent_M_CWMMDataFile_wpclsQueryIconData(somSelf, pIconInfo);
+
+	if (pIconInfo)   {
+      pIconInfo->fFormat = ICON_RESOURCE;
+      pIconInfo->hmod    = hmod;
+      pIconInfo->resid   = ID_ICONM3UFILE;
+	} /* endif */
+
+	return ( sizeof(ICONINFO) );
+}
+
+
+SOM_Scope ULONG  SOMLINK cwm3uM_wpclsQueryDefaultView(M_MMM3U *somSelf)
+{
+    /* M_MMM3UData *somThis = M_MMM3UGetData(somSelf); */
+    M_MMM3UMethodDebug("M_MMM3U","cwm3uM_wpclsQueryDefaultView");
+
+    return ID_MENU_M3UEDITOR;
+}
+
+
+SOM_Scope BOOL  SOMLINK cwm3uM_wpclsCreateDefaultTemplates(M_MMM3U *somSelf, 
+                                                           WPObject* Folder)
+{
+    /* M_MMM3UData *somThis = M_MMM3UGetData(somSelf); */
+    M_MMM3UMethodDebug("M_MMM3U","cwm3uM_wpclsCreateDefaultTemplates");
+
+    mmclsCreateTheDefaultTemplate(somSelf, Folder);
+    return TRUE;
+}
+
Index: /tags/CWMM-0.3.0_GA/classes/c/c_audio/cwmidi.c
===================================================================
--- /tags/CWMM-0.3.0_GA/classes/c/c_audio/cwmidi.c	(revision 213)
+++ /tags/CWMM-0.3.0_GA/classes/c/c_audio/cwmidi.c	(revision 213)
@@ -0,0 +1,205 @@
+/*
+ * (C) Chris Wohlgemuth 2002-2004
+ *
+ */
+/*
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; see the file COPYING.  If not, write to
+ * the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+/*
+ * If you need another license for your project/product contact me at
+ * 
+ * http://www.os2world.com/cdwriting
+ * http://www.geocities.com/SiliconValley/Sector/5785/
+ */
+
+/*
+ *  This file was generated by the SOM Compiler and Emitter Framework.
+ *  Generated using: 
+ *      SOM Emitter emitctm: 2.42
+ */
+
+#ifndef SOM_Module_cwmidi_Source
+#define SOM_Module_cwmidi_Source
+#endif
+#define CWMIDI_Class_Source
+#define M_CWMIDI_Class_Source
+
+#define INCL_PM
+#include <os2.h>
+#include <stdio.h>
+#include "helpid.h"
+#include "cwmidi.ih"
+#include "cwaudioinc.h"
+#include "sys_funcs.h"
+
+extern char chrHelpLibrary[CCHMAXPATH];
+//extern BOOL globalHaveTimidity;
+
+HMODULE queryResModuleHandle(void);
+HMODULE queryModuleHandle(void);
+BOOL getMessage(char* text,ULONG ulID, LONG lSizeText, HMODULE hResource,HWND hwnd);
+BOOL mmclsCreateTheDefaultTemplate(M_WPObject *somSelf, 
+                                   WPObject* Folder);
+
+
+/*
+ * The prototype for cwmidi_wpModifyPopupMenu was replaced by the following prototype:
+ */
+SOM_Scope BOOL  SOMLINK cwmidi_wpModifyPopupMenu(MMMIDI *somSelf, 
+                                                 HWND hwndMenu, 
+                                                 HWND hwndCnr, 
+                                                 ULONG iPosition)
+{
+  BOOL bRC;
+    /* CWMIDIData *somThis = CWMIDIGetData(somSelf); */
+    MMMIDIMethodDebug("MMMIDI","cwmidi_wpModifyPopupMenu");
+ 
+    bRC=(MMMIDI_parent_MMAudio_wpModifyPopupMenu(somSelf, 
+                                                    hwndMenu, 
+                                                    hwndCnr, 
+                                                 iPosition));
+
+    WinSendMsg(hwndMenu,MM_DELETEITEM,MPFROM2SHORT( ID_MENU_EDITOR, TRUE), 0L);
+    WinSendMsg(hwndMenu, MM_DELETEITEM, MPFROM2SHORT( ID_MENU_CONVERT, FALSE), 0L);
+    return bRC;
+}
+
+
+SOM_Scope ULONG  SOMLINK cwmidi_cwmmAddAudioInformationPage(MMMIDI *somSelf, 
+                                                            HWND hwndNotebook)
+
+{
+    /* MMMIDIData *somThis = MMMIDIGetData(somSelf); */
+    MMMIDIMethodDebug("MMMIDI","cwmidi_cwmmAddAudioInformationPage");
+
+    // return (MMMIDI_parent_MMAudio_cwmmAddAudioInformationPage(somSelf, hwndNotebook)); 
+    return SETTINGS_PAGE_REMOVED;
+}
+
+
+/*
+ * SOM_Scope PSZ  SOMLINK cwmidiM_wpclsQueryInstanceType(M_CWMIDI *somSelf)
+ */
+
+/*
+ * The prototype for cwmidiM_wpclsQueryInstanceType was replaced by the following prototype:
+ */
+SOM_Scope PSZ  SOMLINK cwmidiM_wpclsQueryInstanceType(M_MMMIDI *somSelf)
+{
+    /* M_CWMIDIData *somThis = M_CWMIDIGetData(somSelf); */
+    M_MMMIDIMethodDebug("M_MMMIDI","cwmidiM_wpclsQueryInstanceType");
+
+    return TYPE_MIDI;
+    //    return "MIDI";
+}
+
+
+/*
+ * SOM_Scope PSZ  SOMLINK cwmidiM_wpclsQueryInstanceFilter(M_CWMIDI *somSelf)
+ */
+
+/*
+ * The prototype for cwmidiM_wpclsQueryInstanceFilter was replaced by the following prototype:
+ */
+SOM_Scope PSZ  SOMLINK cwmidiM_wpclsQueryInstanceFilter(M_MMMIDI *somSelf)
+{
+    /* M_CWMIDIData *somThis = M_CWMIDIGetData(somSelf); */
+    M_MMMIDIMethodDebug("M_MMMIDI","cwmidiM_wpclsQueryInstanceFilter");
+
+    return "*.mid";
+}
+
+
+/*
+ * SOM_Scope BOOL  SOMLINK cwmidiM_wpclsQueryDefaultHelp(M_CWMIDI *somSelf, 
+ *                                                       PULONG pHelpPanelId, 
+ *                                                       PSZ pszHelpLibrary)
+ */
+
+/*
+ * The prototype for cwmidiM_wpclsQueryDefaultHelp was replaced by the following prototype:
+ */
+SOM_Scope BOOL  SOMLINK cwmidiM_wpclsQueryDefaultHelp(M_MMMIDI *somSelf, 
+                                                      PULONG pHelpPanelId, 
+                                                      PSZ pszHelpLibrary)
+{
+    /* M_CWMIDIData *somThis = M_CWMIDIGetData(somSelf); */
+    M_MMMIDIMethodDebug("M_MMMIDI","cwmidiM_wpclsQueryDefaultHelp");
+
+    if(pHelpPanelId)
+      *pHelpPanelId=MIDIFILE_HELP_PANEL;
+    if(pszHelpLibrary)
+      strncpy(pszHelpLibrary, chrHelpLibrary, CCHMAXPATH);
+    return TRUE; 
+}
+
+
+/*
+ * SOM_Scope PSZ  SOMLINK cwmidiM_wpclsQueryTitle(M_CWMIDI *somSelf)
+ */
+
+/*
+ * The prototype for cwmidiM_wpclsQueryTitle was replaced by the following prototype:
+ */
+SOM_Scope PSZ  SOMLINK cwmidiM_wpclsQueryTitle(M_MMMIDI *somSelf)
+{
+  static char chrTitle[20]={0};
+    /* M_CWMIDIData *somThis = M_CWMIDIGetData(somSelf); */
+    M_MMMIDIMethodDebug("M_MMMIDI","cwmidiM_wpclsQueryTitle");
+    if(chrTitle[0]==0)
+      if(!getMessage(chrTitle, IDSTR_MIDITITLE, sizeof(chrTitle), queryResModuleHandle(), HWND_DESKTOP))
+        strcpy(chrTitle, CLSTITLE_MIDI);
+
+    return chrTitle;
+}
+
+/*
+ * The prototype for cwmidiM_wpclsQueryIconData was replaced by the following prototype:
+ */
+SOM_Scope ULONG  SOMLINK cwmidiM_wpclsQueryIconData(M_MMMIDI *somSelf, 
+                                                    PICONINFO pIconInfo)
+{
+  HMODULE hmod;
+    /* M_CWMIDIData *somThis = M_CWMIDIGetData(somSelf); */
+    M_MMMIDIMethodDebug("M_MMMIDI","cwmidiM_wpclsQueryIconData");
+
+    hmod=queryModuleHandle();
+    if(!hmod)
+      return M_MMMIDI_parent_M_MMAudio_wpclsQueryIconData(somSelf, pIconInfo);
+
+	if (pIconInfo)   {
+      pIconInfo->fFormat = ICON_RESOURCE;
+      pIconInfo->hmod    = hmod;
+      pIconInfo->resid   = ID_ICONMIDIFILE;
+	} /* endif */
+    
+	return ( sizeof(ICONINFO) );
+}
+
+
+SOM_Scope BOOL  SOMLINK cwmidiM_wpclsCreateDefaultTemplates(M_MMMIDI *somSelf, 
+                                                            WPObject* Folder)
+{
+    /* M_MMMIDIData *somThis = M_MMMIDIGetData(somSelf); */
+    M_MMMIDIMethodDebug("M_MMMIDI","cwmidiM_wpclsCreateDefaultTemplates");
+
+    /* Default installation contains a MIDI IO-Proc. I'm lazy here and
+     don't check if it's still installed but just create a default template. */
+    mmclsCreateTheDefaultTemplate(somSelf, Folder);
+    return TRUE;
+    return (M_MMMIDI_parent_M_MMAudio_wpclsCreateDefaultTemplates(somSelf, 
+                                                                  Folder));
+}
+
Index: /tags/CWMM-0.3.0_GA/classes/c/c_audio/cwmp3.c
===================================================================
--- /tags/CWMM-0.3.0_GA/classes/c/c_audio/cwmp3.c	(revision 213)
+++ /tags/CWMM-0.3.0_GA/classes/c/c_audio/cwmp3.c	(revision 213)
@@ -0,0 +1,1783 @@
+
+/*
+ *  This file was generated by the SOM Compiler.
+ *  Generated using:
+ *     SOM incremental update: 2.47
+ */
+
+
+/*
+ * (C) Chris Wohlgemuth 2002-2004
+ *
+ */
+/*
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; see the file COPYING.  If not, write to
+ * the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+/*
+ * If you need another license for your project/product contact me at
+ * 
+ * http://www.os2world.com/cdwriting
+ * http://www.geocities.com/SiliconValley/Sector/5785/
+ */
+
+/*
+ *  This file was generated by the SOM Compiler and Emitter Framework.
+ *  Generated using: 
+ *      SOM Emitter emitctm: 2.42
+ */
+
+#ifndef SOM_Module_cwmp3_Source
+#define SOM_Module_cwmp3_Source
+#endif
+#define CWMP3_Class_Source
+#define M_CWMP3_Class_Source
+
+
+#define INCL_PM
+#define INCL_DOS
+#define INCL_DOSERRORS
+
+#include "os2.h"
+#include <stdio.h>
+#include <wpdisk.h>
+#include "cwaudio.h"
+#include "cwaudio.h"
+#include "cwmp3.ih"
+
+#include "cwaudioinc.h"
+#include "sys_funcs.h"
+
+#define ID3TAGVALUE_BUFFER_SIZE 31
+
+extern char classDLLPath[CCHMAXPATH];
+
+int iGenreLast=191;
+char *genreList[]={
+	"Blues", "Classic Rock", "Country", "Dance", "Disco", "Funk",
+	"Grunge", "Hip-Hop", "Jazz", "Metal", "New Age", "Oldies",
+	"Other", "Pop", "R&B", "Rap", "Reggae", "Rock",
+	"Techno", "Industrial", "Alternative", "Ska", "Death Metal", "Pranks",
+	"Soundtrack", "Euro-Techno", "Ambient", "Trip-Hop", "Vocal", "Jazz+Funk",
+	"Fusion", "Trance", "Classical", "Instrumental", "Acid", "House",
+	"Game", "Sound Clip", "Gospel", "Noise", "AlternRock", "Bass",
+	"Soul", "Punk", "Space", "Meditative", "Instrumental Pop", "Instrumental Rock",
+	"Ethnic", "Gothic", "Darkwave", "Techno-Industrial", "Electronic", "Pop-Folk",
+	"Eurodance", "Dream", "Southern Rock", "Comedy", "Cult", "Gangsta",
+	"Top 40", "Christian Rap", "Pop/Funk", "Jungle", "Native American", "Cabaret",
+	"New Wave", "Psychadelic", "Rave", "Showtunes", "Trailer", "Lo-Fi",
+	"Tribal", "Acid Punk", "Acid Jazz", "Polka", "Retro", "Musical",
+	"Rock & Roll", "Hard Rock", "Folk", "Folk/Rock", "National Folk", "Swing",
+	"Fast-Fusion", "Bebob", "Latin", "Revival", "Celtic", "Bluegrass", "Avantgarde",
+	"Gothic Rock", "Progressive Rock", "Psychedelic Rock", "Symphonic Rock", "Slow Rock", "Big Band",
+	"Chorus", "Easy Listening", "Acoustic", "Humour", "Speech", "Chanson",
+	"Opera", "Chamber Music", "Sonata", "Symphony", "Booty Bass", "Primus",
+	"Porn Groove", "Satire", "Slow Jam", "Club", "Tango", "Samba",
+	"Folklore", "Ballad", "Power Ballad", "Rhythmic Soul", "Freestyle", "Duet",
+	"Punk Rock", "Drum Solo", "A capella", "Euro-House", "Dance Hall",
+	"Goa", "Drum & Bass", "Club House", "Hardcore", "Terror",
+	"Indie", "BritPop", "NegerPunk", "Polsk Punk", "Beat",
+	"Christian Gangsta", "Heavy Metal", "Black Metal", "Crossover", "Contemporary C",
+	"Christian Rock", "Merengue", "Salsa", "Thrash Metal", "Anime", "JPop",
+        "SynthPop", "Christmas", "Art rock", "Baroque",	"Bhangra", "Big beat", "Breakbeat",
+        "Chillout", "Downtempo", "Dub",	"EBM", "Eclectic", "Electro", "Electroclash", "Emo",
+        "Experimental",	"Garage", "Global", "IDM", "Illbient", "Industro-Goth",	"Jam Band",
+        "Krautrock", "Leftfield", "Lounge", "Math rock", "New romantic", "Nu-breakz", "Post-punk",
+        "Post-rock", "Psytrance", "Shoegaze", "Space rock", "Trop rock", "World music", "Neoclassical",
+        "Audiobook", "Audio theatre", "Neue Deutsche Welle", "Podcast", "Indie-rock", "G-Funk",
+        "Dubstep", "Garage rock", "Psybient"
+};
+
+HMODULE queryResModuleHandle(void);
+HMODULE queryModuleHandle(void);
+PSZ queryModuleName(void);
+BOOL getMessage(char* text,ULONG ulID, LONG lSizeText, HMODULE hResource,HWND hwnd);
+void _removeTrailingSpaces(char * chrString);
+
+/* In som_and_wps.c */
+BOOL cwObjectIsOnCD(WPObject * somSelf);
+BOOL cwObjectIsOnInvalidDrive(WPObject * somSelf);
+BOOL cwObjectIsOnInvalidID3Drive(WPObject * somSelf);
+
+ULONG cwQueryOSRelease(void);
+BOOL cwMoveNotebookButtonsWarp4(HWND hwndDlg, USHORT usID, USHORT usDelta);
+void SysWriteToTrapLog(const char* chrFormat, ...);
+ULONG launchPMProg(PSZ pszTitle, PSZ wrapperExe, PSZ parameters,  WPObject *thisPtr, ULONG ulView);
+MRESULT EXPENTRY waveInfoDlgProc(HWND hwnd, ULONG msg, MPARAM mp1, MPARAM mp2);
+
+PSZ _queryMp3HelpLibraryName(void)
+{
+  static char helpLibraryName[CCHMAXPATH];
+  BOOL bDone=FALSE;
+
+  if(!bDone) {
+    if(queryModuleHandle()) {
+      char  *ptr;
+      strncpy(helpLibraryName, classDLLPath, sizeof(helpLibraryName)-1);
+      if((ptr=strrchr(helpLibraryName, '\\'))!=NULLHANDLE) {
+        *(++ptr)=0;
+        if(strlen(helpLibraryName)+strlen(MP3FILE_HELP_LIBRARY)<sizeof(helpLibraryName)) {
+          strcat(helpLibraryName, MP3FILE_HELP_LIBRARY );
+          bDone=TRUE;
+          return helpLibraryName;
+        }
+      }
+    }
+    return NULLHANDLE;
+  }
+
+  return helpLibraryName;
+}
+
+void _fillEntryfieldsWithCurrentId3( MMMP3 *cwMp3, HWND hwnd)
+{
+  ID3TAG id3Tag;
+  char fName[31];
+
+  if(_cwmmQueryId3Tag(cwMp3, &id3Tag))
+    {
+      fName[0]=0;
+      strncat(fName,id3Tag.id3Name,30);
+      fName[30]=0;
+      _removeTrailingSpaces(fName);
+      WinSetWindowText(WinWindowFromID(hwnd, IDEF_ID3NAME),fName);
+      
+      fName[0]=0;
+      strncat(fName,id3Tag.id3Artist,30);
+      fName[30]=0;
+      _removeTrailingSpaces(fName);
+      WinSetWindowText(WinWindowFromID(hwnd, IDEF_ID3ARTIST),fName);
+
+      fName[0]=0;
+      strncat(fName,id3Tag.id3Album,30);
+      fName[30]=0;
+      _removeTrailingSpaces(fName);
+      WinSetWindowText(WinWindowFromID(hwnd, IDEF_ID3ALBUM),fName);
+
+      fName[0]=0;
+      strncat(fName,id3Tag.id3Year,4);
+      fName[4]=0;
+      _removeTrailingSpaces(fName);
+      WinSetWindowText(WinWindowFromID(hwnd, IDEF_ID3YEAR),fName);
+
+      fName[0]=0;
+      strncat(fName,id3Tag.id3Comment,30);
+      fName[30]=0;
+      _removeTrailingSpaces(fName);
+      WinSetWindowText(WinWindowFromID(hwnd, IDEF_ID3COMMENT),fName);
+
+      /* Genre */
+      if(id3Tag.id3Genre[0]>iGenreLast) {
+        fName[0]=0;
+        strncat(fName,"",30);
+        fName[30]=0;
+        _removeTrailingSpaces(fName);
+        WinSetWindowText(WinWindowFromID(hwnd, IDDD_ID3GENRE), fName);
+      }
+      else {
+        WinSetWindowText(WinWindowFromID(hwnd, IDDD_ID3GENRE),genreList[id3Tag.id3Genre[0]]);
+      }
+    }
+}
+
+MRESULT EXPENTRY id3TagDlgProc(HWND hwnd, ULONG msg, MPARAM mp1, MPARAM mp2)
+{
+  MMMP3 *cwMp3;
+
+  switch(msg) {
+  case WM_INITDLG :
+    cwMp3=(MMMP3*)PVOIDFROMMP(mp2);
+    WinSetWindowULong(WinWindowFromID(hwnd,IDEF_ID3NAME),
+                      QWL_USER,(ULONG)cwMp3);//Save object ptr.
+    if(somIsObj(cwMp3)) {
+      for(;;) {
+        int a;
+        HWND hwndTemp;
+        HWND hwndSave, hwndUndo;
+
+        if(cwObjectIsOnCD(cwMp3))
+          {
+            /* CDs are readonly so remove 'Save' and 'Undo' buttons */
+            WinDestroyWindow(WinWindowFromID(hwnd,IDPB_ID3SAVE));
+            WinDestroyWindow(hwndUndo=WinWindowFromID(hwnd,IDPB_CANCEL));
+            /* Make entry fields read only */
+            WinSendMsg(WinWindowFromID(hwnd,IDEF_ID3NAME),EM_SETREADONLY,MPFROMSHORT((SHORT)TRUE),0);
+            WinSendMsg(WinWindowFromID(hwnd,IDEF_ID3ARTIST),EM_SETREADONLY,MPFROMSHORT((SHORT)TRUE),0);
+            WinSendMsg(WinWindowFromID(hwnd,IDEF_ID3ALBUM),EM_SETREADONLY,MPFROMSHORT((SHORT)TRUE),0);
+            WinSendMsg(WinWindowFromID(hwnd,IDEF_ID3COMMENT),EM_SETREADONLY,MPFROMSHORT((SHORT)TRUE),0);
+            WinSendMsg(WinWindowFromID(hwnd,IDEF_ID3YEAR),EM_SETREADONLY,MPFROMSHORT((SHORT)TRUE),0);
+          }
+
+        /* Move default buttons on Warp 4 */
+        cwMoveNotebookButtonsWarp4(hwnd, IDPB_ID3HELP, 15);
+
+        WinSendMsg(WinWindowFromID(hwnd,IDEF_ID3NAME),EM_SETTEXTLIMIT,MPFROMSHORT((SHORT)30),0);
+        WinSendMsg(WinWindowFromID(hwnd,IDEF_ID3ARTIST),EM_SETTEXTLIMIT,MPFROMSHORT((SHORT)30),0);
+        WinSendMsg(WinWindowFromID(hwnd,IDEF_ID3ALBUM),EM_SETTEXTLIMIT,MPFROMSHORT((SHORT)30),0);
+        WinSendMsg(WinWindowFromID(hwnd,IDEF_ID3COMMENT),EM_SETTEXTLIMIT,MPFROMSHORT((SHORT)30),0);
+        WinSendMsg(WinWindowFromID(hwnd,IDEF_ID3YEAR),EM_SETTEXTLIMIT,MPFROMSHORT((SHORT)4),0);
+        /* Fill drop downlist */
+        hwndTemp=WinWindowFromID(hwnd, IDDD_ID3GENRE);
+        for(a=0;a<=iGenreLast;a++)
+          WinSendMsg(hwndTemp, LM_INSERTITEM, MPFROMSHORT(LIT_SORTASCENDING),MPFROMP(genreList[a]));
+
+        /* Get the ID3 tags from the file and insert them into the entry fields */
+        _fillEntryfieldsWithCurrentId3(cwMp3, hwnd);
+        break;
+      }
+    }
+    WinSetWindowULong(WinQueryWindow(hwnd, QW_PARENT), QWL_HWNDFOCUSSAVE, hwnd);
+    return (MRESULT)TRUE;
+      /* This prevents switching the notebook page behind the open folder */
+    case WM_WINDOWPOSCHANGED:
+      {
+        MRESULT mr;
+
+        if(WinQueryFocus(HWND_DESKTOP)!=
+           WinQueryWindow(WinQueryWindow(hwnd, QW_PARENT), QW_PARENT)) {
+          mp2=MPFROMLONG(LONGFROMMP(mp2)|0x80000);/*AWP_ACTIVATE 0x00080000L*/
+          mr=WinDefDlgProc(hwnd, msg, mp1, mp2);
+          return mr;  
+        }
+        break;
+      }
+    case WM_FOCUSCHANGE:
+      {
+        if(!SHORT1FROMMP(mp2)) {
+          if(HWNDFROMMP(mp1)==hwnd) {
+            MRESULT mr;
+
+            mr=WinDefDlgProc(hwnd, msg, mp1, mp2);
+            WinSendMsg(WinQueryWindow(WinQueryWindow(hwnd, QW_PARENT), QW_PARENT), WM_SETFOCUS, MPFROMHWND(hwnd), (MPARAM)TRUE);
+            return mr;
+          }
+        }
+        break;
+      }
+    case WM_DESTROY:
+      /* The notebook closes and gets destroyed */
+      /* Set focus to desktop to prevent PM freeze */
+      WinSetFocus(HWND_DESKTOP, HWND_DESKTOP);
+      break;
+  case WM_COMMAND:    
+    cwMp3=(MMMP3*) WinQueryWindowULong(WinWindowFromID(hwnd, IDEF_ID3NAME),QWL_USER);
+    if(somIsObj(cwMp3)) {
+      ID3TAG id3Tag;
+      char fName[31];
+
+      switch(SHORT1FROMMP(mp1))
+        {
+        case IDPB_CANCEL:
+          /* Get the ID3 tags from the file and insert them into the entry fields */
+          _fillEntryfieldsWithCurrentId3(cwMp3, hwnd);
+          break;
+        case IDPB_ID3SAVE:
+          {
+            int a;
+            
+            memset(&id3Tag,0,sizeof(id3Tag));
+            memcpy(id3Tag.id3Tag,"TAG",sizeof(id3Tag.id3Tag));
+            WinQueryWindowText(WinWindowFromID(hwnd, IDEF_ID3NAME), 31, fName);
+            memcpy(id3Tag.id3Name, fName,strlen(fName));
+            WinQueryWindowText(WinWindowFromID(hwnd, IDEF_ID3ARTIST), 31, fName);
+            memcpy(id3Tag.id3Artist, fName,strlen(fName));
+            WinQueryWindowText(WinWindowFromID(hwnd, IDEF_ID3ALBUM), 31, fName);
+            memcpy(id3Tag.id3Album, fName,strlen(fName));
+            WinQueryWindowText(WinWindowFromID(hwnd, IDEF_ID3COMMENT), 31, fName);
+            memcpy(id3Tag.id3Comment, fName,strlen(fName));
+            WinQueryWindowText(WinWindowFromID(hwnd, IDEF_ID3YEAR), 5, fName);
+            memcpy(id3Tag.id3Year, fName,strlen(fName));
+
+            /* Find genre */
+            WinQueryWindowText(WinWindowFromID(hwnd, IDDD_ID3GENRE), 31, fName);
+            for(a=0;a<=iGenreLast;a++)
+              if(!stricmp(fName, genreList[a]))
+                break;
+            if(a>iGenreLast)
+              id3Tag.id3Genre[0]=0xFF;/* No Genre inserted */
+            else
+              id3Tag.id3Genre[0]=a;
+            _cwmmSetId3Tag(cwMp3, &id3Tag);
+          }
+          break;
+        default:
+          break;
+        }
+    }
+    return (MRESULT) TRUE;
+  default:
+    break;
+  }
+  return WinDefDlgProc(hwnd, msg, mp1, mp2);
+}
+
+/*
+ * The prototype for cwmp3_cwmmAddId3TagPage was replaced by the following prototype:
+ */
+/*!*******************************************************/
+/*                                                       */
+/* @@DESC                                                */
+/*                                                       */
+/* This instance method is called to allow the object    */
+/* to add the ID3 tag page to its Settings notebook.     */
+/* :p.                                                   */
+/* This page can be used to change the ID3 tag of an     */
+/* MP3 file.                                             */
+/*                                                       */
+/* @@USAGE                                               */
+/*                                                       */
+/* This method must only be called from within an        */
+/* override of wpAddSettingsPages().                     */
+/*                                                       */
+/* @@PARAM                                               */
+/*                                                       */
+/* MMMP3 *somSelf input                                  */
+/*                                                       */
+/* Pointer to the object on which the method is being    */
+/* invoked.                                              */
+/* :p.                                                   */
+/* Points to an object of class :hp2.MMImage:ehp2..      */
+/*                                                       */
+/* @@PARAM                                               */
+/*                                                       */
+/* HWND hwndNotebook input                               */
+/*                                                       */
+/* Settings notebook handle.                             */
+/*                                                       */
+/* @@OVERRIDE                                            */
+/*                                                       */
+/* This method should always be overridden in order to   */
+/* remove or replace the image information page from     */
+/* the object's Settings notbook.                        */
+/* :p.                                                   */
+/* To remove the page from the Settings notebook, the    */
+/* override method should return                         */
+/* :hp1.SETTINGS_PAGE_REMOVED:ehp1. without calling the  */
+/* the parent method. To replace the page with another   */
+/* page, the override method should call the             */
+/* wpInsertSettingsPAge method without calling the       */
+/* parent method.                                        */
+/*                                                       */
+/* @@RETURNS                                             */
+/*                                                       */
+/* ULONG rc                                              */
+/*                                                       */
+/* :parml compact tsize=15 break=none.                   */
+/* :pt.0:pd.Error occurred                               */
+/* :pt.PageId :pd.Identifier for the inserted page.      */
+/* :eparml.                                              */
+/*                                                       */
+/*!!******************************************************/
+SOM_Scope ULONG  SOMLINK cwmp3_cwmmAddId3TagPage(MMMP3 *somSelf, 
+                                                 HWND hwndNotebook)
+{
+  PAGEINFO pageinfo;
+  char pageName[100];
+
+  /*    CWMP3Data *somThis = CWMP3GetData(somSelf);*/
+    MMMP3MethodDebug("MMMP3","cwmp3_cwmmAddId3TagPage");
+
+  //Clear the pageinfo structure
+  memset((PCH)&pageinfo, 0, sizeof(PAGEINFO));
+  //Fill the pageinfo structure
+  pageinfo.cb = sizeof(PAGEINFO);
+  pageinfo.hwndPage = NULLHANDLE;
+  pageinfo.usPageStyleFlags = BKA_MAJOR | BKA_STATUSTEXTON;
+  pageinfo.usPageInsertFlags = BKA_FIRST;
+  //We want page numbers
+  pageinfo.usSettingsFlags = SETTINGS_PAGE_NUMBERS;
+  //The dialog procedure for this page
+  pageinfo.pfnwp = id3TagDlgProc;
+  //The resource DLL
+  pageinfo.resid = queryResModuleHandle();
+  //pageinfo.resid = queryModuleHandle();
+  //The ID of the dialog template
+  pageinfo.dlgid = IDDLG_ID3TAGS;
+  //We need a pointer to our WPS-object in the dialog procedure
+  //to call class functions
+  pageinfo.pCreateParams = somSelf;
+  //The ID of the help panel for this page
+  if(cwObjectIsOnCD(somSelf))
+    pageinfo.idDefaultHelpPanel = MP3FILE_SETTINGS_PANEL_CD;
+  else
+    pageinfo.idDefaultHelpPanel = MP3FILE_SETTINGS_PANEL;
+  //Tell the WPS the help library name
+  pageinfo.pszHelpLibraryName = _queryMp3HelpLibraryName();
+  //We have a major tab so we need a name
+  if(!getMessage(pageName, ID_ID3TAGSPAGENAME, sizeof(pageName),  queryResModuleHandle(), hwndNotebook))
+    strcpy(pageName, "~ID3 tag");
+  pageinfo.pszName = pageName;
+  //Insert the page into the settings notebook
+
+  return _wpInsertSettingsPage(somSelf,hwndNotebook,&pageinfo);
+
+}
+
+static void convertID3CodePage(ID3TAG *id3Tag, ULONG ulFromCp, ULONG ulToCp)
+{
+  if(ulFromCp==0 || ulToCp==0)
+    return;
+  else {
+    char fName[32];
+    char fTransName[32];
+    ID3TAG  id3Temp;
+
+    HAB hab=WinQueryAnchorBlock(HWND_DESKTOP);
+
+    id3Temp=*id3Tag;
+    memset(&id3Temp,0,sizeof(id3Temp));
+    memcpy(id3Temp.id3Tag,"TAG",sizeof(id3Temp.id3Tag));
+
+    strncpy(fName, id3Tag->id3Name,30);
+    fName[30]=0;/* The ID3 spec allows 30 chars. */
+    if(!WinCpTranslateString(hab, ulFromCp, fName, ulToCp, 31, fTransName))
+      return;
+    fTransName[30]=0;
+    strncpy(id3Temp.id3Name, fTransName, 30);
+    
+    //    memset(fname,0,sizeof(fname));
+    strncpy(fName,id3Tag->id3Artist,30);
+    fName[30]=0;
+    if(!WinCpTranslateString(hab, ulFromCp, fName, ulToCp, 31, fTransName))
+      return;
+    fTransName[30]=0;
+    strncpy(id3Temp.id3Artist, fTransName, 30);    
+    
+    strncpy(fName,id3Tag->id3Album,30);
+    fName[30]=0;
+    if(!WinCpTranslateString(hab, ulFromCp, fName, ulToCp, 31, fTransName))
+      return;
+    fTransName[30]=0;
+    strncpy(id3Temp.id3Album, fTransName, 30);    
+    
+    strncpy(fName,id3Tag->id3Year,4);
+    fName[4]=0;
+    if(!WinCpTranslateString(hab, ulFromCp, fName, ulToCp, 31, fTransName))
+      return;
+    fTransName[30]=0;
+    strncpy(id3Temp.id3Year, fTransName, 4);    
+
+
+    if(id3Tag->id3Comment[28]==0 &&
+       id3Tag->id3Comment[29]!=0 ) {
+      strncpy(fName,id3Tag->id3Comment,28); /* Keep Track information of ID3 V1.1 */
+      fName[28]=0;
+      if(!WinCpTranslateString(hab, ulFromCp, fName, ulToCp, 31, fTransName))
+        return;
+      fTransName[28]=0;
+      strncpy(id3Temp.id3Comment, fTransName,strlen(fTransName));
+      id3Temp.id3Comment[28]=0;
+      id3Temp.id3Comment[29]=id3Tag->id3Comment[29];
+    }
+    else {
+      strncpy(fName,id3Tag->id3Comment,30);
+      fName[30]=0;
+      if(!WinCpTranslateString(hab, ulFromCp, fName, ulToCp, 31, fTransName))
+        return;
+      fTransName[30]=0;
+      strncpy(id3Temp.id3Comment, fTransName,strlen(fTransName));
+    }
+
+#if 0
+    fName[0]=0;
+    strncat(fName, id3Tag->id3Name,30);
+    fName[30]=0;/* The ID3 spec allows 30 chars. */
+    if(!WinCpTranslateString(hab, ulFromCp, fName, ulToCp, 31, fTransName))
+      return;
+    fTransName[30]=0;
+    memcpy(id3Temp.id3Name, fTransName, 30);
+    
+    //    memset(fname,0,sizeof(fname));
+    fName[0]=0;
+    strncat(fName,id3Tag->id3Artist,30);
+    fName[30]=0;
+    if(!WinCpTranslateString(hab, ulFromCp, fName, ulToCp, 31, fTransName))
+      return;
+    fTransName[30]=0;
+    memcpy(id3Temp.id3Artist, fTransName, 30);    
+    
+    fName[0]=0;
+    strncat(fName,id3Tag->id3Album,30);
+    fName[30]=0;
+    if(!WinCpTranslateString(hab, ulFromCp, fName, ulToCp, 31, fTransName))
+      return;
+    fTransName[30]=0;
+    memcpy(id3Temp.id3Album, fTransName, 30);    
+    
+    fName[0]=0;
+    strncat(fName,id3Tag->id3Year,4);
+    fName[4]=0;
+    if(!WinCpTranslateString(hab, ulFromCp, fName, ulToCp, 31, fTransName))
+      return;
+    fTransName[30]=0;
+    memcpy(id3Temp.id3Year, fTransName, 4);    
+
+
+    if(id3Tag->id3Comment[28]==0 &&
+       id3Tag->id3Comment[29]!=0 ) {
+      strncpy(fName,id3Tag->id3Comment,28); /* Keep Track information of ID3 V1.1 */
+      fName[28]==0;
+      if(!WinCpTranslateString(hab, ulFromCp, fName, ulToCp, 31, fTransName))
+        return;
+      fTransName[28]=0;
+    }
+    else {
+      strncpy(fName,id3Tag->id3Comment,30);
+      fName[30]==0;
+      if(!WinCpTranslateString(hab, ulFromCp, fName, ulToCp, 31, fTransName))
+        return;
+      fTransName[30]=0;
+    }
+
+#if 0
+    fName[0]=0;
+    strncat(fName,id3Tag->id3Comment,30);
+    fName[30]=0;
+    if(!WinCpTranslateString(hab, ulFromCp, fName, ulToCp, 31, fTransName))
+      return;
+    fTransName[30]=0;
+#endif
+    memcpy(id3Temp.id3Comment, fTransName,strlen(fTransName));
+#endif
+
+    id3Temp.id3Genre[0]=id3Tag->id3Genre[0];
+
+    *id3Tag=id3Temp;
+  }
+
+}
+
+/*
+ * This method gets the ID3 tags from the file, converts the codepage to
+ * the current system codepage and puts the information in the instance vars.
+ */
+SOM_Scope BOOL  SOMLINK cwmp3_cwmmQueryId3Tag(MMMP3 *somSelf, 
+                                              ID3TAG* id3Tag)
+{
+  FILE *file;
+  ULONG ulSize;
+  char fName[CCHMAXPATH];
+  M_MMMP3* m_cwMP3;
+  M_MMMP3Data *m_cwMP3Data;
+  
+  /* CWMP3Data *somThis = CWMP3GetData(somSelf); */
+  MMMP3MethodDebug("MMMP3","cwmp3_cwmmQueryId3Tag");
+  
+  /* Get ID3 tag */
+  ulSize=sizeof(fName);
+  if(!_wpQueryRealName(somSelf, fName, &ulSize, TRUE))
+    return FALSE;
+  
+  if((file=fopen(fName, "rb"))==NULL)
+    return FALSE;
+  
+  if(fseek(file, -128, SEEK_END)){
+    fclose(file);
+    return FALSE;
+  }
+  if(128!=fread(id3Tag, 1, 128, file)){
+    fclose(file);
+    return FALSE;
+  }
+  fclose(file);
+  
+  if(memicmp(id3Tag->id3Tag,"TAG",3))
+    return FALSE;/* No ID3 tag */
+
+  /* Convert the info to ISO 8859-1. Somewhere I've seen info the ID3 tag uses this charset.
+     Can't find this reference anymore :-(. Because the windows CP is nearly identical
+     we should convert the data anyway to see the right info if put into the tag on W*n systems.
+     It's a W*n world out there so it's likely this CP was used. The usual W*ndoze user does not
+     care about details but just clicks 'OK'. Do I hear I LOVE YOU? <eg> */
+  m_cwMP3=_MMMP3;
+  if(!somIsObj(m_cwMP3))
+    return TRUE;
+
+  m_cwMP3Data  = M_MMMP3GetData(m_cwMP3);
+  convertID3CodePage(id3Tag, m_cwMP3Data->ulIsoCodePage, m_cwMP3Data->ulCodePage);
+  return TRUE;
+}
+
+/*
+ * This method writes track information from the instance vars to the files ID3 tag.
+ * If the tag doesn't exist yet it will be created. The information is converted from
+ * the current codepage to the ISO8859-1 codepage used by ID3 tags.
+ */
+SOM_Scope BOOL  SOMLINK cwmp3_cwmmSetId3Tag(MMMP3 *somSelf, ID3TAG* id3Tag)
+{
+  ID3TAG id3TagQuery;
+  ULONG ulSize;
+  char fName[CCHMAXPATH];
+  BOOL   bHaveTag=FALSE;
+  HFILE hFile;
+  ULONG ulAction;
+  ULONG rc;
+  M_MMMP3* m_cwMP3;
+  M_MMMP3Data *m_cwMP3Data;
+
+    /* CWMP3Data *somThis = CWMP3GetData(somSelf); */
+    MMMP3MethodDebug("MMMP3","cwmp3_cwmmSetId3Tag");
+
+    if(!id3Tag)
+      return FALSE;
+
+    /* Ensure the tag has the signature */
+    memcpy(id3Tag, "TAG", 3);
+
+    /* Needed to access class instance variables */
+    m_cwMP3=_MMMP3;
+    if(!somIsObj(m_cwMP3))
+      return FALSE;
+    m_cwMP3Data  = M_MMMP3GetData(m_cwMP3);
+
+    /* Check if there's already a Tag */
+    if(_cwmmQueryId3Tag(somSelf, &id3TagQuery))
+      {
+        if(!memicmp(id3TagQuery.id3Tag,"TAG",3))
+          bHaveTag=TRUE; /* Make sure we have valid information to write. If not the old Tag is kept. */
+      }
+
+    /* Open the MP3 */
+    ulSize=sizeof(fName);
+    _wpQueryRealName(somSelf, fName, &ulSize, TRUE);
+    if((rc=DosOpen(fName, &hFile, &ulAction, 0, 0, OPEN_ACTION_FAIL_IF_NEW|OPEN_ACTION_OPEN_IF_EXISTS,
+                   OPEN_FLAGS_FAIL_ON_ERROR|OPEN_SHARE_DENYWRITE|OPEN_ACCESS_WRITEONLY,NULL))!=NULLHANDLE) {
+      return FALSE;
+    }
+
+    if(bHaveTag) {
+      /* There's a Tag so move fileptr to the beginning of it */
+      if(DosSetFilePtr(hFile, -128, FILE_END, &ulSize)){
+        DosClose(hFile);
+        return FALSE;
+      }
+    }
+    else
+      {
+        /* No Tag yet. Move fileptr to the end of the file */
+        if(DosSetFilePtr(hFile, 0, FILE_END, &ulSize)){
+          DosClose(hFile);
+          return FALSE;
+        }
+      }
+
+    /* Convert the data from current codepage to ISO 8859-1 which is used for ID3 */
+    convertID3CodePage(id3Tag, m_cwMP3Data->ulCodePage, m_cwMP3Data->ulIsoCodePage);
+
+    /* Save comment field */
+    fName[0]=id3Tag->id3Comment[28];
+    fName[1]=id3Tag->id3Comment[29];
+
+    /* Write Tag to the file */
+    if(bHaveTag) {
+      /* If there's an old tag, keep the track info of ID3 V1.1 */
+      if(id3TagQuery.id3Comment[28]==0 &&
+         id3TagQuery.id3Comment[29]!=0) {
+        /* Track number is the last byte of the comment field. */
+        id3Tag->id3Comment[28]=0;/* Terminate comment */
+        id3Tag->id3Comment[29]=id3TagQuery.id3Comment[29];/* Old track number */
+      }
+    }
+    if(DosWrite(hFile,id3Tag, 128, &ulSize)){
+      DosClose(hFile);
+      /* Convert back */
+      convertID3CodePage(id3Tag, m_cwMP3Data->ulIsoCodePage, m_cwMP3Data->ulCodePage);
+      return FALSE;
+    }
+    DosClose(hFile);
+
+    id3Tag->id3Comment[28]=fName[0];
+    id3Tag->id3Comment[29]=fName[1];
+
+    /* Convert back */
+    convertID3CodePage(id3Tag, m_cwMP3Data->ulIsoCodePage, m_cwMP3Data->ulCodePage);
+
+#if 0
+    /* Set new instance data. */
+    fName[0]=0;
+    strncat(fName,id3Tag->id3Name,30);
+    fName[30]=0;
+    _cwmmSetTrackInfo(somSelf, fName, 0, IDINFO_NAME);
+    
+    fName[0]=0;
+    strncat(fName,id3Tag->id3Artist,30);
+    fName[30]=0;
+    _cwmmSetTrackInfo(somSelf, fName, 0, IDINFO_ARTIST);
+    
+    fName[0]=0;
+    strncat(fName,id3Tag->id3Album,30);
+    fName[30]=0;
+    _cwmmSetTrackInfo(somSelf, fName, 0, IDINFO_ALBUM);
+    
+    fName[0]=0;
+    strncat(fName,id3Tag->id3Year,4);
+    fName[4]=0;
+    _cwmmSetTrackInfo(somSelf, fName, 0, IDINFO_YEAR);
+    
+    fName[0]=0;
+    strncat(fName,id3Tag->id3Comment,30);
+    fName[30]=0;
+    _cwmmSetTrackInfo(somSelf, fName, 0, IDINFO_COMMENT);
+    
+    if(id3Tag->id3Genre[0]>iGenreLast) {
+      fName[0]=0;
+      strncat(fName,"",30);
+      fName[30]=0;
+      _cwmmSetTrackInfo(somSelf, fName, 0, IDINFO_GENRE);
+    }
+    else {
+      _cwmmSetTrackInfo(somSelf, genreList[id3Tag->id3Genre[0]], 0, IDINFO_GENRE);
+    }
+#endif
+
+    return TRUE;
+}
+
+
+/*
+ * The prototype for cwmp3_cwmmQueryId3TagValue was replaced by the following prototype:
+ */
+SOM_Scope BOOL  SOMLINK cwmp3_cwmmQueryId3TagValue(MMMP3 *somSelf, 
+                                                   PSZ pszValue, 
+                                                   ULONG ulWhich)
+{
+  ID3TAG id3Tag;
+
+  /*  MMMP3Data *somThis = MMMP3GetData(somSelf);*/
+  MMMP3MethodDebug("MMMP3","cwmp3_cwmmQueryId3TagValue");
+
+  /* No ID3 tag yet */  
+  if(!_cwmmQueryId3Tag(somSelf, &id3Tag))
+    return FALSE;
+ 
+  memset(pszValue,0, ID3TAGVALUE_BUFFER_SIZE);
+
+  switch(ulWhich)
+    { 
+    case IDINFO_NAME:
+      if(id3Tag.id3Name[0]) {
+        memcpy(pszValue, id3Tag.id3Name, 30);
+        return TRUE;
+      }
+      break;
+    case IDINFO_ARTIST:
+      if(id3Tag.id3Artist[0]) {
+        memcpy(pszValue, id3Tag.id3Artist, 30);
+        return TRUE;
+      }
+      break;
+    case IDINFO_ALBUM:
+      if(id3Tag.id3Album[0]) {
+        memcpy(pszValue, id3Tag.id3Artist, 30);
+        return TRUE;
+      }
+      break;
+    case IDINFO_YEAR:
+      if(id3Tag.id3Year[0]) {
+        memcpy(pszValue, id3Tag.id3Year, 4);
+        return TRUE;
+      }
+      break;
+    case IDINFO_COMMENT:
+      if(id3Tag.id3Comment[0]) {
+        memcpy(pszValue, id3Tag.id3Comment, 30);
+        return TRUE;
+      }
+      break;
+    case IDINFO_GENRE:
+      if(id3Tag.id3Genre[0] != (char)0xFF) {
+        pszValue[0]=id3Tag.id3Genre[0];
+        return TRUE;
+      }
+      break;
+    default:
+      break;
+    }
+  
+  /* Return statement to be customized: */
+  return FALSE;
+}
+
+
+SOM_Scope BOOL  SOMLINK cwmp3_cwmmSetId3TagValue(MMMP3 *somSelf, 
+                                                 PSZ pszValue, 
+                                                 ULONG ulWhich)
+{
+  ID3TAG id3Tag;
+
+  /*  MMMP3Data *somThis = MMMP3GetData(somSelf);*/
+  MMMP3MethodDebug("MMMP3","cwmp3_cwmmSetId3TagValue");
+  
+  if(!pszValue || pszValue[0]==0)
+    return FALSE;
+
+  if(!_cwmmQueryId3Tag(somSelf, &id3Tag)) {
+    memset(&id3Tag, 0, sizeof(id3Tag)); /* No tag yet. Set it to empty. */
+    /* Default for genre is 0xff not 0 which equals 'blues' */
+    id3Tag.id3Genre[0]=0xFF;
+  }
+
+  switch(ulWhich)
+    { 
+    case IDINFO_NAME:
+      strncpy(id3Tag.id3Name, pszValue, 30);
+      break;
+    case IDINFO_ARTIST:
+        strncpy(id3Tag.id3Artist, pszValue, 30);
+      break;
+    case IDINFO_ALBUM:
+      strncpy(id3Tag.id3Album, pszValue, 30);
+      break;
+    case IDINFO_YEAR:
+        strncpy(id3Tag.id3Year, pszValue, 4);
+        break;
+    case IDINFO_COMMENT:
+      strncpy(id3Tag.id3Comment, pszValue, 30);
+      break;
+    case IDINFO_GENRE:
+      pszValue[0]=id3Tag.id3Genre[0]=pszValue[0];
+      break;
+    default:
+      return FALSE;
+    }
+  /* ID3 tag built now write it to the file */
+  _cwmmSetId3Tag(somSelf, &id3Tag);
+
+  return TRUE;
+}
+
+/*
+ *    cwmmAddTrackNamePage      : override;
+ */
+
+/*
+ * SOM_Scope ULONG  SOMLINK cwmp3_cwmmQueryTrackInfo(MMMP3 *somSelf, 
+ *                                                   PSZ chrString, 
+ *                                                   ULONG ulSize, 
+ *                                                   int iWhich)
+ */
+
+/*
+ * The prototype for cwmp3_cwmmQueryTrackInfo was replaced by the following prototype:
+ */
+SOM_Scope ULONG  SOMLINK cwmp3_cwmmQueryTrackInfo(MMMP3 *somSelf, 
+                                                  PSZ chrString, 
+                                                  ULONG ulSize, 
+                                                  ULONG iWhich)
+{
+  somId id;
+  ULONG rc;
+  /*   somTD_MMAudio_cwmmQueryTrackInfo methodPtr; */
+
+  /*  MMMP3Data *somThis = MMMP3GetData(somSelf);*/
+  /*    MMAudioData *somThis = MMAudioGetData(somSelf); */
+    MMMP3MethodDebug("MMMP3","cwmp3_cwmmQueryTrackInfo");
+
+
+    if(iWhich<1||iWhich>IDINFO_LASTINFO)
+      return FALSE;
+
+
+    switch(iWhich)
+      {
+      case IDINFO_BITRATE:
+        return (MMMP3_parent_MMAudio_cwmmQueryTrackInfo(somSelf, 
+                                                        chrString, 
+                                                        ulSize, iWhich));
+      default:
+        break;
+      }
+    //  SysWriteToTrapLog("%s %d\n", __FUNCTION__, __LINE__);
+    return (MMMP3_parent_MMAudio_cwmmQueryTrackInfo(somSelf, 
+                                                    chrString, 
+                                                    ulSize, iWhich));
+
+
+#if 0
+  if((mySomId=somIdFromString("cwmmQueryTrackInfo"))!=NULLHANDLE) {
+    rc=((somTD_M_WPObject_wpclsQueryStyle)
+          somParentNumResolve(__ClassObject->somGetPClsMtabs(),
+                              1,
+                              __ClassObject->
+                              somGetMethodToken(mySomId))
+        )(this);
+    SOMFree(mySomId);
+  }
+  
+  SysWriteToTrapLog("%s %d, %d, %x %x %x %d, Addr: %x\n", __FUNCTION__, __LINE__, iWhich, somSelf, chrString, ulSize, iWhich, cwmp3_cwmmQueryTrackInfo);
+  
+  /* Get method address */
+  if((id=somIdFromString("cwmmQueryTrackInfo"))!=NULLHANDLE) {
+    methodPtr= (somTD_MMAudio_cwmmQueryTrackInfo) _somFindSMethod(_somGetClass(_MMAudio), id);
+    methodPtr= (somTD_MMAudio_cwmmQueryTrackInfo) _somFindSMethod(_MMAudio, id);
+    if(methodPtr) {
+      SysWriteToTrapLog("%s %d, %d, %x %x %x %d, Addr: %x\n", __FUNCTION__, __LINE__, iWhich, somSelf, chrString, ulSize, iWhich, methodPtr);
+      methodPtr(somSelf, chrString, ulSize, iWhich);
+      /*( (somTD_MMAudio_cwmmQueryTrackInfo) MMMP3_parent_MMAudio_cwmmQueryTrackInfo_resolved)
+        (somSelf,chrString,ulSize,iWhich);
+        */     
+      SysWriteToTrapLog("%s %d, %d, %x %x %x %d, Addr: %x !!\n", __FUNCTION__, __LINE__, iWhich, somSelf, chrString, ulSize, iWhich, 
+                        MMMP3_parent_MMAudio_cwmmQueryTrackInfo_resolved);
+    }
+    SOMFree(id);
+  }/* somId */
+#endif
+}
+
+
+SOM_Scope ULONG  SOMLINK cwmp3_cwmmAddAudioInformationPage(MMMP3 *somSelf, 
+                                                           HWND hwndNotebook)
+{
+  PAGEINFO pageinfo;
+  char pageName[100];
+
+  /*  MMMP3Data *somThis = MMMP3GetData(somSelf); */
+    MMMP3MethodDebug("MMMP3","cwmp3_cwmmAddAudioInformationPage");
+
+
+  //Clear the pageinfo structure
+  memset((PCH)&pageinfo, 0, sizeof(PAGEINFO));
+  //Fill the pageinfo structure
+  pageinfo.cb = sizeof(PAGEINFO);
+  pageinfo.hwndPage = NULLHANDLE;
+  pageinfo.usPageStyleFlags = BKA_MAJOR | BKA_STATUSTEXTON;
+  pageinfo.usPageInsertFlags = BKA_FIRST;
+  //We want page numbers
+  pageinfo.usSettingsFlags = SETTINGS_PAGE_NUMBERS;
+  //The dialog procedure for this page
+  pageinfo.pfnwp = waveInfoDlgProc;
+  //The resource DLL
+  pageinfo.resid = queryResModuleHandle();
+  //pageinfo.resid = queryModuleHandle();
+  //The ID of the dialog template
+  pageinfo.dlgid = IDDLG_WAVEINFOPAGE;
+  //We need a pointer to our WPS-object in the dialog procedure
+  //to call class functions
+  pageinfo.pCreateParams = somSelf;
+  //The ID of the help panel for this page
+  //pageinfo.idDefaultHelpPanel = IDDLG_GENERAL2PAGE;
+  //Tell the WPS the help library name
+  pageinfo.pszHelpLibraryName = NULLHANDLE;
+  //We have a major tab so we need a name
+  if(!getMessage(pageName, ID_WAVEINFOPAGENAME, sizeof(pageName), queryResModuleHandle(), hwndNotebook))
+    strcpy(pageName, "~Audio information");
+  pageinfo.pszName = pageName;
+
+
+  /* The following is only important for MP3 files because gathering the audio info
+     for MP3 files is currently very slow. Will improve with future releases of MMIOMP3*/
+  if(__get_ulFileSize(somSelf)!=_wpQueryFileSize(somSelf)) {
+    /* The filesize changed, somebody altered the audio file so reread the info */
+    if(!cwObjectIsOnInvalidDrive(somSelf)) {
+      //    if(!cwObjectIsOnCD(somSelf)) {
+      /* Only get audio info when file isn't on CD. This speeds up opening of folders on CDs filled with
+         MP3s. Doesn't hurt because folders of CDs open in normal details view as default so the audio info
+         isn't necessary. When opening the settings notebook the info is reread anyway. */      
+      
+      /* Get class object */
+      M_CWMMDataFile *m_cwmmDataFile=_CWMMDataFile;
+      
+      /* Send the object pointer to the audio worker thread to read the audio info in the background. */
+      WinPostMsg(__get_hwndAudioWorker(_CWMMDataFile), WM_APPTERMINATENOTIFY, somSelf, 0);
+    }
+    else
+      return SETTINGS_PAGE_REMOVED; /* Don't show info page on CD because all info is zero anyway. */
+  }
+
+  //Insert the page into the settings notebook
+  return _wpInsertSettingsPage(somSelf,hwndNotebook,&pageinfo);
+
+  //  return (MMMP3_parent_MMAudio_cwmmAddAudioInformationPage(somSelf, 
+  //                                                       hwndNotebook));
+}
+
+SOM_Scope BOOL  SOMLINK cwmp3_wpAddSettingsPages(MMMP3 *somSelf, 
+                                                 HWND hwndNotebook)
+{
+  BOOL rc;
+    /* MMMP3Data *somThis = MMMP3GetData(somSelf); */
+    MMMP3MethodDebug("MMMP3","cwmp3_wpAddSettingsPages");
+
+    rc=(MMMP3_parent_MMAudio_wpAddSettingsPages(somSelf, 
+                                                    hwndNotebook));
+    _cwmmAddId3TagPage(somSelf,
+                       hwndNotebook);
+
+    return rc;
+}
+
+/*
+ * The prototype for cwmp3_wpRestoreState was replaced by the following prototype:
+ */
+SOM_Scope BOOL  SOMLINK cwmp3_wpRestoreState(MMMP3 *somSelf, 
+                                             ULONG ulReserved)
+{
+  BOOL bRc; 
+  ID3TAG id3Tag;
+  char fName[CCHMAXPATH];
+
+  /*    CWMP3Data *somThis = CWMP3GetData(somSelf); */
+    MMMP3MethodDebug("MMMP3","cwmp3_wpRestoreState");
+
+    /* Read info from EA in MMAudio(). This fills the instance vars with
+       e.g. the trackname, artist etc. ID3 tags are not read and the length of
+       that information is much greater than the length of ID3 tags. This
+       information is shown in the details view of folders. */
+    bRc= (MMMP3_parent_MMAudio_wpRestoreState(somSelf, ulReserved));
+
+    /* Don't read ID3 tags for files on CD because this takes ages on slow drives. */
+#if 0
+    if(cwObjectIsOnCD(somSelf))
+      return bRc;
+#endif
+
+    /* Don't read ID3 tags for files on user specified drives  because this may take ages on slow drives. */
+    /* The list of drives may be specified in USER ini                                                    */
+    if(cwObjectIsOnInvalidID3Drive(somSelf))
+      return bRc;
+
+    /* Get ID3 tag */
+    if(_cwmmQueryId3Tag(somSelf, &id3Tag))
+      {
+        char chrDummy[20];
+
+        fName[0]=0;
+        strncat(fName,id3Tag.id3Name,30);
+        fName[30]=0;/* The ID3 spec allows 30 chars. */
+        _removeTrailingSpaces(fName);
+        /* Set trackinfo of EA only if not already restored. By doing it this way longer info (see MAX_EA_SIZE)
+         isn't overwritten by the shorter ID3 tag info. */
+        if(!_cwmmQueryTrackInfo(somSelf, chrDummy, sizeof(chrDummy), IDINFO_NAME)) {
+          //SysWriteToTrapLog("!! %s %d\n", __FUNCTION__, __LINE__);
+          _cwmmSetTrackInfo(somSelf, fName, 0, IDINFO_NAME);
+        }
+
+        fName[0]=0;
+        strncat(fName,id3Tag.id3Artist,30);
+        fName[30]=0;
+        _removeTrailingSpaces(fName);
+        if(!_cwmmQueryTrackInfo(somSelf, chrDummy, sizeof(chrDummy), IDINFO_ARTIST))
+          _cwmmSetTrackInfo(somSelf, fName, 0, IDINFO_ARTIST);
+          
+        fName[0]=0;
+        strncat(fName,id3Tag.id3Album,30);
+        fName[30]=0;
+        _removeTrailingSpaces(fName);
+        if(!_cwmmQueryTrackInfo(somSelf, chrDummy, sizeof(chrDummy), IDINFO_ALBUM))
+          _cwmmSetTrackInfo(somSelf, fName, 0, IDINFO_ALBUM);
+
+        fName[0]=0;
+        strncat(fName,id3Tag.id3Year,4);
+        fName[4]=0;
+        //    SysWriteToTrapLog("%s %d: %s\n", __FUNCTION__, __LINE__, fName);
+        if(!_cwmmQueryTrackInfo(somSelf, chrDummy, sizeof(chrDummy), IDINFO_YEAR))
+          _cwmmSetTrackInfo(somSelf, fName, 0, IDINFO_YEAR);
+
+        fName[0]=0;
+        strncat(fName,id3Tag.id3Comment,30);
+        fName[30]=0;
+        _removeTrailingSpaces(fName);
+        //        SysWriteToTrapLog("%s %d: %s\n", __FUNCTION__, __LINE__, fName);
+        if(!_cwmmQueryTrackInfo(somSelf, chrDummy, sizeof(chrDummy), IDINFO_COMMENT))
+          _cwmmSetTrackInfo(somSelf, fName, 0, IDINFO_COMMENT);          
+
+        if(id3Tag.id3Genre[0]>iGenreLast) {
+          fName[0]=0;
+          strncat(fName,"",30);
+          fName[30]=0;/* ID3 encodes genre into one byte. */
+          if(!_cwmmQueryTrackInfo(somSelf, chrDummy, sizeof(chrDummy), IDINFO_GENRE))
+            _cwmmSetTrackInfo(somSelf, fName, 0, IDINFO_GENRE);
+        }
+        else {
+          if(!_cwmmQueryTrackInfo(somSelf, chrDummy, sizeof(chrDummy), IDINFO_GENRE))
+            _cwmmSetTrackInfo(somSelf, genreList[id3Tag.id3Genre[0]], 0, IDINFO_GENRE);
+        }
+      }
+    else {
+      /* No ID3 tag yet. Insert the info from the EAs */
+      //FIXME
+      /* Not implemented yet */
+    }
+
+    /* Get MP3 technical data */
+    return bRc;
+}
+
+
+/*
+ * The prototype for cwmp3_wpSetup was replaced by the following prototype:
+ */
+SOM_Scope BOOL  SOMLINK cwmp3_wpSetup(MMMP3 *somSelf, PSZ pszSetupString)
+{
+  char buffer[CCHMAXPATH];
+  ULONG bufferSize;
+  ID3TAG id3Tag;
+  int a;
+  BOOL bRc;
+
+    /* CWMP3Data *somThis = CWMP3GetData(somSelf); */
+    MMMP3MethodDebug("MMMP3","cwmp3_wpSetup");
+
+    /* Call parent. This will fill the instance vars for EAs with the tracknames etc. */
+    bRc=(MMMP3_parent_MMAudio_wpSetup(somSelf, pszSetupString));
+
+    /* New generic names */
+    bufferSize=sizeof(buffer);
+    if(_wpScanSetupString(somSelf, pszSetupString, SETUP_MMAUDIOTRACKNAME, buffer, &bufferSize))
+      {
+        char id3Value[ID3TAGVALUE_BUFFER_SIZE];
+
+        /* Save the ID3 tag into the file */
+        if(!_cwmmQueryId3TagValue(somSelf, id3Value, IDINFO_NAME))
+          /* This ID3 tag value not yet set. So add it to the file. The length will be automatically
+             truncated to the allowed length of the ID3 tag. */
+          _cwmmSetId3TagValue(somSelf, buffer, IDINFO_NAME);
+
+#if 0
+        if(!_cwmmQueryId3Tag(somSelf, &id3Tag)){ /* Get ID3 tag */
+          memset(&id3Tag, 0,sizeof(id3Tag));      /* No tag yet, clear struct. */
+          strncpy(id3Tag.id3Tag, "TAG", 3);
+          id3Tag.id3Genre[0]=0xFF;
+        }
+        memcpy(id3Tag.id3Name, buffer, 30);
+        _cwmmSetId3Tag(somSelf, &id3Tag); /* This sets also the instance data */
+#endif
+      }
+    bufferSize=sizeof(buffer); 
+    if(_wpScanSetupString(somSelf, pszSetupString, SETUP_MMAUDIOARTIST, buffer, &bufferSize))
+      {
+        char id3Value[ID3TAGVALUE_BUFFER_SIZE];
+
+        /* Save the ID3 tag into the file */
+        if(!_cwmmQueryId3TagValue(somSelf, id3Value, IDINFO_ARTIST))
+          /* This ID3 tag value not yet set. So add it to the file. The length will be automatically
+             truncated to the allowed length of the ID3 tag. */
+          _cwmmSetId3TagValue(somSelf, buffer, IDINFO_ARTIST);
+
+#if 0
+        /* Save the ID3 tag into the file */
+        if(!_cwmmQueryId3Tag(somSelf, &id3Tag)){ /* Get ID3 tag */
+          memset(&id3Tag, 0,sizeof(id3Tag));      /* No tag yet, clear struct. */
+          strncpy(id3Tag.id3Tag, "TAG", 3);
+          id3Tag.id3Genre[0]=0xFF;
+        }
+        //   if(bufferSize<30+1)
+        //   buffer[bufferSize-1]=' ';
+        memcpy(id3Tag.id3Artist, buffer, 30);
+        _cwmmSetId3Tag(somSelf, &id3Tag); /* This sets also the instance data */
+#endif
+      }
+    bufferSize=sizeof(buffer); 
+    if(_wpScanSetupString(somSelf, pszSetupString, SETUP_MMAUDIOALBUM, buffer, &bufferSize))
+      {
+        char id3Value[ID3TAGVALUE_BUFFER_SIZE];
+
+        /* Save the ID3 tag into the file */
+        if(!_cwmmQueryId3TagValue(somSelf, id3Value, IDINFO_ALBUM))
+          /* This ID3 tag value not yet set. So add it to the file. The length will be automatically
+             truncated to the allowed length of the ID3 tag. */
+          _cwmmSetId3TagValue(somSelf, buffer, IDINFO_ALBUM);
+#if 0
+        /* Save the ID3 tag into the file */
+        if(!_cwmmQueryId3Tag(somSelf, &id3Tag)){ /* Get ID3 tag */
+          memset(&id3Tag, 0,sizeof(id3Tag));      /* No tag yet, clear struct. */
+          strncpy(id3Tag.id3Tag, "TAG", 3);
+          id3Tag.id3Genre[0]=0xFF;
+        }
+        memcpy(id3Tag.id3Album, buffer, 30);
+        _cwmmSetId3Tag(somSelf, &id3Tag); /* This sets also the instance data */
+#endif
+      }
+    bufferSize=sizeof(buffer); 
+    if(_wpScanSetupString(somSelf, pszSetupString, SETUP_MMAUDIOCOMMENT, buffer, &bufferSize))
+      {
+        char id3Value[ID3TAGVALUE_BUFFER_SIZE];
+
+        /* Save the ID3 tag into the file */
+        if(!_cwmmQueryId3TagValue(somSelf, id3Value, IDINFO_COMMENT))
+          /* This ID3 tag value not yet set. So add it to the file. The length will be automatically
+             truncated to the allowed length of the ID3 tag. */
+          _cwmmSetId3TagValue(somSelf, buffer, IDINFO_COMMENT);
+#if 0
+        /* Save the ID3 tag into the file */
+        if(!_cwmmQueryId3Tag(somSelf, &id3Tag)){ /* Get ID3 tag */
+          memset(&id3Tag,0,sizeof(id3Tag));      /* No tag yet, clear struct. */
+          strncpy(id3Tag.id3Tag, "TAG", 3);
+          id3Tag.id3Genre[0]=0xFF;
+        }
+        memcpy(id3Tag.id3Comment, buffer, 30);
+        _cwmmSetId3Tag(somSelf, &id3Tag); /* This sets also the instance data */
+#endif
+      }
+    bufferSize=sizeof(buffer); 
+    if(_wpScanSetupString(somSelf, pszSetupString, SETUP_MMAUDIOYEAR, buffer, &bufferSize))
+      {
+        char id3Value[ID3TAGVALUE_BUFFER_SIZE];
+
+        /* Save the ID3 tag into the file */
+        if(!_cwmmQueryId3TagValue(somSelf, id3Value, IDINFO_YEAR) && bufferSize==4+1)
+          /* This ID3 tag value not yet set. So add it to the file. The length will be automatically
+             truncated to the allowed length of the ID3 tag. */
+          _cwmmSetId3TagValue(somSelf, buffer, IDINFO_YEAR);
+#if 0
+        /* Save the ID3 tag into the file */
+        if(!_cwmmQueryId3Tag(somSelf, &id3Tag)){ /* Get ID3 tag */
+          memset(&id3Tag, 0,sizeof(id3Tag));      /* No tag yet, clear struct. */
+          strncpy(id3Tag.id3Tag, "TAG", 3);
+          id3Tag.id3Genre[0]=0xFF;
+        }
+        if(bufferSize==4+1) {
+          memcpy(id3Tag.id3Year, buffer, 4);
+          _cwmmSetId3Tag(somSelf, &id3Tag); /* This sets also the instance data */
+        }
+#endif
+      }
+    bufferSize=sizeof(buffer); 
+    if(_wpScanSetupString(somSelf, pszSetupString, SETUP_MMAUDIOGENRE, buffer, &bufferSize))
+      {
+        char id3Value[ID3TAGVALUE_BUFFER_SIZE];
+
+        /* Save the ID3 tag into the file */
+        if(!_cwmmQueryId3TagValue(somSelf, id3Value, IDINFO_GENRE)) {
+          /* This ID3 tag value not yet set. So add it to the file. The length will be automatically
+             truncated to the allowed length of the ID3 tag. */
+          /* Find genre from string */
+          for(a=0;a<=iGenreLast;a++)
+            if(!stricmp(buffer, genreList[a]))
+              break;
+          if(a>iGenreLast)
+            id3Value[0]=0xFF;/* No Genre inserted */
+          else
+            id3Value[0]=a;
+          _cwmmSetId3TagValue(somSelf, id3Value, IDINFO_GENRE);
+        }
+#if 0
+        /* Save the ID3 tag into the file */
+        if(!_cwmmQueryId3Tag(somSelf, &id3Tag)){ /* Get ID3 tag */
+          memset(&id3Tag, 0,sizeof(id3Tag));      /* No tag yet, clear struct. */
+          strncpy(id3Tag.id3Tag, "TAG", 3);
+          id3Tag.id3Genre[0]=0xFF;
+        }
+        /* Find genre from string */
+        for(a=0;a<=iGenreLast;a++)
+          if(!stricmp(buffer, genreList[a]))
+            break;
+        if(a>iGenreLast)
+          id3Tag.id3Genre[0]=0xFF;/* No Genre inserted */
+        else
+          id3Tag.id3Genre[0]=a;
+        _cwmmSetId3Tag(somSelf, &id3Tag); /* This sets also the instance data */
+#endif
+      }
+
+
+
+    /* Old depracted names. Will vanish in the future. */
+    bufferSize=sizeof(buffer);
+    if(_wpScanSetupString(somSelf, pszSetupString, SETUP_ID3TRACKNAME, buffer, &bufferSize))
+      {
+        char id3Value[ID3TAGVALUE_BUFFER_SIZE];
+
+        /* Save the ID3 tag into the file */
+        if(!_cwmmQueryId3TagValue(somSelf, id3Value, IDINFO_NAME))
+          /* This ID3 tag value not yet set. So add it to the file. The length will be automatically
+             truncated to the allowed length of the ID3 tag. */
+          _cwmmSetId3TagValue(somSelf, buffer, IDINFO_NAME);
+#if 0
+        /* Save the ID3 tag into the file */
+        if(!_cwmmQueryId3Tag(somSelf, &id3Tag)){ /* Get ID3 tag */
+          memset(&id3Tag, 0,sizeof(id3Tag));      /* No tag yet, clear struct. */
+          strncpy(id3Tag.id3Tag, "TAG", 3);
+          id3Tag.id3Genre[0]=0xFF;
+        }
+        memcpy(id3Tag.id3Name, buffer, 30);
+        _cwmmSetId3Tag(somSelf, &id3Tag); /* This sets also the instance ID3 tag data */
+#endif
+      }
+    bufferSize=sizeof(buffer); 
+    if(_wpScanSetupString(somSelf, pszSetupString, SETUP_ID3ARTIST, buffer, &bufferSize))
+      {
+        char id3Value[ID3TAGVALUE_BUFFER_SIZE];
+
+        /* Save the ID3 tag into the file */
+        if(!_cwmmQueryId3TagValue(somSelf, id3Value, IDINFO_ARTIST))
+          /* This ID3 tag value not yet set. So add it to the file. The length will be automatically
+             truncated to the allowed length of the ID3 tag. */
+          _cwmmSetId3TagValue(somSelf, buffer, IDINFO_ARTIST);
+#if 0
+        /* Save the ID3 tag into the file */
+        if(!_cwmmQueryId3Tag(somSelf, &id3Tag)){ /* Get ID3 tag */
+          memset(&id3Tag, 0,sizeof(id3Tag));      /* No tag yet, clear struct. */
+          strncpy(id3Tag.id3Tag, "TAG", 3);
+          id3Tag.id3Genre[0]=0xFF;
+        }
+        memcpy(id3Tag.id3Artist, buffer, 30);
+        _cwmmSetId3Tag(somSelf, &id3Tag); /* This sets also the instance data */
+#endif
+      }
+    bufferSize=sizeof(buffer); 
+    if(_wpScanSetupString(somSelf, pszSetupString, SETUP_ID3ALBUM, buffer, &bufferSize))
+      {
+        char id3Value[ID3TAGVALUE_BUFFER_SIZE];
+
+        /* Save the ID3 tag into the file */
+        if(!_cwmmQueryId3TagValue(somSelf, id3Value, IDINFO_ALBUM))
+          /* This ID3 tag value not yet set. So add it to the file. The length will be automatically
+             truncated to the allowed length of the ID3 tag. */
+          _cwmmSetId3TagValue(somSelf, buffer, IDINFO_ALBUM);
+#if 0
+        /* Save the ID3 tag into the file */
+        if(!_cwmmQueryId3Tag(somSelf, &id3Tag)){ /* Get ID3 tag */
+          memset(&id3Tag, 0,sizeof(id3Tag));      /* No tag yet, clear struct. */
+          strncpy(id3Tag.id3Tag, "TAG", 3);
+          id3Tag.id3Genre[0]=0xFF;
+        }
+        memcpy(id3Tag.id3Album, buffer, 30);
+        _cwmmSetId3Tag(somSelf, &id3Tag); /* This sets also the instance data */
+#endif
+      }
+    bufferSize=sizeof(buffer); 
+    if(_wpScanSetupString(somSelf, pszSetupString, SETUP_ID3COMMENT, buffer, &bufferSize))
+      {
+        char id3Value[ID3TAGVALUE_BUFFER_SIZE];
+
+        /* Save the ID3 tag into the file */
+        if(!_cwmmQueryId3TagValue(somSelf, id3Value, IDINFO_COMMENT))
+          /* This ID3 tag value not yet set. So add it to the file. The length will be automatically
+             truncated to the allowed length of the ID3 tag. */
+          _cwmmSetId3TagValue(somSelf, buffer, IDINFO_COMMENT);
+#if 0
+        /* Save the ID3 tag into the file */
+        if(!_cwmmQueryId3Tag(somSelf, &id3Tag)){ /* Get ID3 tag */
+          memset(&id3Tag,0,sizeof(id3Tag));      /* No tag yet, clear struct. */
+          strncpy(id3Tag.id3Tag, "TAG", 3);
+          id3Tag.id3Genre[0]=0xFF;
+        }
+        memcpy(id3Tag.id3Comment, buffer, 30);
+        _cwmmSetId3Tag(somSelf, &id3Tag); /* This sets also the instance data */
+#endif
+      }
+    bufferSize=sizeof(buffer); 
+    if(_wpScanSetupString(somSelf, pszSetupString, SETUP_ID3YEAR, buffer, &bufferSize))
+      {
+        char id3Value[ID3TAGVALUE_BUFFER_SIZE];
+
+        /* Save the ID3 tag into the file */
+        if(!_cwmmQueryId3TagValue(somSelf, id3Value, IDINFO_YEAR) && bufferSize==4+1)
+          /* This ID3 tag value not yet set. So add it to the file. The length will be automatically
+             truncated to the allowed length of the ID3 tag. */
+          _cwmmSetId3TagValue(somSelf, buffer, IDINFO_YEAR);
+#if 0
+        /* Save the ID3 tag into the file */
+        if(!_cwmmQueryId3Tag(somSelf, &id3Tag)){ /* Get ID3 tag */
+          memset(&id3Tag, 0,sizeof(id3Tag));      /* No tag yet, clear struct. */
+          strncpy(id3Tag.id3Tag, "TAG", 3);
+          id3Tag.id3Genre[0]=0xFF;
+        }
+        if(bufferSize==4+1) {
+          memcpy(id3Tag.id3Year, buffer, 4);
+          _cwmmSetId3Tag(somSelf, &id3Tag); /* This sets also the instance data */
+        }
+#endif
+      }
+    bufferSize=sizeof(buffer); 
+    if(_wpScanSetupString(somSelf, pszSetupString, SETUP_ID3GENRE, buffer, &bufferSize))
+      {
+        char id3Value[ID3TAGVALUE_BUFFER_SIZE];
+        
+        /* Save the ID3 tag into the file */
+        if(!_cwmmQueryId3TagValue(somSelf, id3Value, IDINFO_GENRE)) {
+          /* This ID3 tag value not yet set. So add it to the file. The length will be automatically
+             truncated to the allowed length of the ID3 tag. */
+          /* Find genre from string */
+          for(a=0;a<=iGenreLast;a++)
+            if(!stricmp(buffer, genreList[a]))
+              break;
+          if(a>iGenreLast)
+            id3Value[0]=0xFF;/* No Genre inserted */
+          else
+            id3Value[0]=a;
+          _cwmmSetId3TagValue(somSelf, id3Value, IDINFO_GENRE);
+        }
+#if 0
+        /* Save the ID3 tag into the file */
+        if(!_cwmmQueryId3Tag(somSelf, &id3Tag)){ /* Get ID3 tag */
+          memset(&id3Tag, 0,sizeof(id3Tag));      /* No tag yet, clear struct. */
+          strncpy(id3Tag.id3Tag, "TAG", 3);
+          id3Tag.id3Genre[0]=0xFF;
+        }
+        /* Find genre from string */
+        for(a=0;a<=iGenreLast;a++)
+          if(!stricmp(buffer, genreList[a]))
+            break;
+        if(a>iGenreLast)
+          id3Tag.id3Genre[0]=0xFF;/* No Genre inserted */
+        else
+          id3Tag.id3Genre[0]=a;
+        _cwmmSetId3Tag(somSelf, &id3Tag); /* This sets also the instance data */
+#endif
+      }
+
+    return bRc;
+}
+
+
+/*
+ * The prototype for cwmp3_wpSaveState was replaced by the following prototype:
+ */
+SOM_Scope BOOL  SOMLINK cwmp3_wpSaveState(MMMP3 *somSelf)
+{
+  char chrBuf[256];
+  ULONG ulLength;
+  BOOL rc;
+
+    /* CWMP3Data *somThis = CWMP3GetData(somSelf); */
+    MMMP3MethodDebug("MMMP3","cwmp3_wpSaveState");
+
+    /* call parent first. By doing so, the MP3 type is written after the Digital Audio type.
+     This way the default class the WPS picks is MMMP3 and not MMAudio. */
+    rc=(MMMP3_parent_MMAudio_wpSaveState(somSelf));
+
+    /* Set .TYPE EA so the editor and the player are happy. */
+    strncpy(chrBuf, _wpQueryType(somSelf), sizeof(chrBuf));
+    chrBuf[sizeof(chrBuf)-1]=0;
+    //    if(!getMessage(chrTitle, IDSTR_MP3TITLE, sizeof(chrTitle), queryModuleHandle(), HWND_DESKTOP))
+    //    strcpy(chrTitle, CLSTYPE_MP3);
+
+    /* Look if type already set */
+    if(!strstr(chrBuf,TYPE_MP3)) {
+      ulLength=strlen(chrBuf);
+      if(ulLength) {
+        if(ulLength+2+sizeof(TYPE_MP3) < sizeof(chrBuf)) {
+          strcat(chrBuf, "\n");
+          strcat(chrBuf, TYPE_MP3);
+        }
+      }
+      else
+        strcpy(chrBuf, TYPE_MP3);
+    }
+    /* Set .TYPE EA so the editor and the player are happy. */
+    _wpSetType(somSelf, chrBuf , NULL);
+
+    return rc;
+}
+
+SOM_Scope HWND  SOMLINK cwmp3_wpOpen(MMMP3 *somSelf, HWND hwndCnr, 
+                                     ULONG ulView, ULONG param)
+{
+  ULONG ulRc;
+    /* MMMP3Data *somThis = MMMP3GetData(somSelf); */
+    MMMP3MethodDebug("MMMP3","cwmp3_wpOpen");
+
+    switch(ulView)
+      {
+      case ID_MENU_PLAYER:
+        /*case 0xbbe5:   Player */
+        {
+          char chrPlayer[CCHMAXPATH]={0};
+          char chrParams[CCHMAXPATH+2]="\"";
+          char chrTitle[50];
+          char *chrPtr=chrParams;
+          ULONG ulSize;
+
+          if(!PrfQueryProfileString(HINI_USERPROFILE, "CWMM", "mp3player", NULLHANDLE, chrPlayer,sizeof(chrPlayer)))
+            break; /* Fall back to MMAudio player */
+
+          chrPtr++;
+          ulSize=sizeof(chrParams)-2;
+          _wpQueryRealName(somSelf, chrPtr, &ulSize, TRUE);
+          strcat(chrPtr,"\"");
+
+          if(!getMessage(chrTitle, IDSTR_AUDPLAYERTITLE, sizeof(chrTitle), queryResModuleHandle(), HWND_DESKTOP))
+            strcpy(chrTitle, "Player");
+
+          if((ulRc=launchPMProg(chrTitle, chrPlayer, chrParams, somSelf, ulView))==NULLHANDLE) {
+            break;
+          }
+          return NULLHANDLE;
+        }
+      case ID_MENU_EDITOR:
+        /* case 0xbc0d:  Editor */ 
+        {
+          char chrPlayer[CCHMAXPATH]={0};
+          char chrParams[CCHMAXPATH+10]={0};
+          char chrTitle[50];
+          char *chrPtr=chrParams;
+          ULONG ulSize;
+
+          if(!PrfQueryProfileString(HINI_USERPROFILE, "CWMM", "mp3editor", NULLHANDLE, chrPlayer,sizeof(chrPlayer)))
+            break; /* Fall back to MMAudio editor */
+
+          chrPtr+=4;
+          ulSize=sizeof(chrParams)-2;
+          _wpQueryRealName(somSelf, chrPtr, &ulSize, TRUE);
+          strcat(chrPtr,"\"");
+
+          if(!getMessage(chrTitle, IDSTR_AUDEDITORTITLE, sizeof(chrTitle), queryResModuleHandle(), HWND_DESKTOP))
+            strcpy(chrTitle, "Editor");
+
+          if((ulRc=launchPMProg( chrTitle, chrPlayer, chrParams, somSelf, ulView))==NULLHANDLE) {
+            break;
+          }
+          return NULLHANDLE;
+        }
+      default:
+        break;
+      }
+
+    return (MMMP3_parent_MMAudio_wpOpen(somSelf, hwndCnr, ulView, 
+                                        param));
+}
+
+
+/*
+ * The prototype for cwmp3M_wpclsQueryTitle was replaced by the following prototype:
+ */
+SOM_Scope PSZ  SOMLINK cwmp3M_wpclsQueryTitle(M_MMMP3 *somSelf)
+{
+  static char chrTitle[20]={0};
+    /* M_CWMP3Data *somThis = M_CWMP3GetData(somSelf); */
+    M_MMMP3MethodDebug("M_MMMP3","cwmp3M_wpclsQueryTitle");
+
+    if(chrTitle[0]==0)
+      if(!getMessage(chrTitle, IDSTR_MP3TITLE, sizeof(chrTitle), queryResModuleHandle(), HWND_DESKTOP))
+        strcpy(chrTitle,"MP3Audio.MP3");
+
+    return chrTitle;
+}
+
+/*
+ * The prototype for cwmp3M_wpclsQueryInstanceType was replaced by the following prototype:
+ */
+SOM_Scope PSZ  SOMLINK cwmp3M_wpclsQueryInstanceType(M_MMMP3 *somSelf)
+{
+    /* M_CWMP3Data *somThis = M_CWMP3GetData(somSelf); */
+    M_MMMP3MethodDebug("M_MMMP3","cwmp3M_wpclsQueryInstanceType");
+
+    return TYPE_MP3;//"MP3";
+}
+
+#if 0
+char* _cwmmGetExtFromIni(M_MMMP3 *somSelf, const PSZ pszDefaultExt)
+{
+  char chrKey[10];
+  ULONG ulLength;
+  pByte pByte;
+
+  sprintf(chrKey, "%sExt", pszDefaultExt);
+
+  if(!PrfQueryProfileSize(HINI_USERPROFILE, "CWMM", chrKey, NULL, &ulLength))
+    return NULLHANDLE;
+
+  pByte=_ wpAllocMem
+  if(PrfQueryProfileString(HINI_USERPROFILE, "CWMM", chrKey, NULL, ))
+    {
+      /* Key  found */
+
+    }
+}
+#endif
+
+/*
+ * The prototype for cwmp3M_wpclsQueryInstanceFilter was replaced by the following prototype:
+ */
+SOM_Scope PSZ  SOMLINK cwmp3M_wpclsQueryInstanceFilter(M_MMMP3 *somSelf)
+{
+  //  static char* chrExt;
+    /* M_CWMP3Data *somThis = M_CWMP3GetData(somSelf); */
+    M_MMMP3MethodDebug("M_MMMP3","cwmp3M_wpclsQueryInstanceFilter");
+
+    return "*.MP3,*.*.MP3,*.*.*.MP3";
+
+}
+
+/*
+ * The prototype for cwmp3M_wpclsQueryIconData was replaced by the following prototype:
+ */
+SOM_Scope ULONG  SOMLINK cwmp3M_wpclsQueryIconData(M_MMMP3 *somSelf, 
+                                                   PICONINFO pIconInfo)
+{
+  HMODULE hmod;
+    /* M_CWMP3Data *somThis = M_CWMP3GetData(somSelf); */
+    M_MMMP3MethodDebug("M_MMMP3","cwmp3M_wpclsQueryIconData");
+
+    hmod=queryModuleHandle();
+    if(!hmod)
+      return M_MMMP3_parent_M_MMAudio_wpclsQueryIconData(somSelf, pIconInfo);
+
+	if (pIconInfo)   {
+      pIconInfo->fFormat = ICON_RESOURCE;
+      pIconInfo->hmod    = hmod;
+      pIconInfo->resid   = ID_ICONMP3FILE;
+	} /* endif */
+
+	return ( sizeof(ICONINFO) );
+}
+
+
+ULONG _getISOCp(void)
+{
+  ULONG ulData;
+  ULONG ulNumCp;
+
+  /* Get number of codepages */
+  if((ulNumCp=WinQueryCpList(WinQueryAnchorBlock(HWND_DESKTOP), 1, &ulData))!=0) {
+    ULONG *ulCpList;
+
+    /* Get memory for codepage list */ 
+    ulCpList=(ULONG*)malloc(ulNumCp*sizeof(ULONG));
+    if(ulCpList) {
+      int a;
+      /* Get codepage list */
+      if((ulNumCp=WinQueryCpList(WinQueryAnchorBlock(HWND_DESKTOP), ulNumCp, ulCpList))!=0) {
+        for(a=0;a<ulNumCp;a++)
+          {
+            if(ulCpList[a]==819) {
+              free(ulCpList);
+              return (ULONG) 819;/* The IBM ISO 8859-1 CP */
+            } 
+          }
+        /* ISO 8859-1 CP not found. Try to find 1004 (Windows extended) which is a quite good match */
+        for(a=0;a<ulNumCp;a++)
+          {
+            if(ulCpList[a]==1004) {
+              free(ulCpList);
+              return (ULONG) 1004;/* The IBM ISO 8859-1 CP */
+            } 
+          }
+      }
+      free(ulCpList);
+    }
+  }
+  /* No CP found or an error occured */
+  return 0;
+}
+
+/*
+ * The prototype for cwmp3M_wpclsInitData was replaced by the following prototype:
+ */
+SOM_Scope void  SOMLINK cwmp3M_wpclsInitData(M_MMMP3 *somSelf)
+{
+  ULONG ulCp[4];
+  ULONG ulInfoLen=0;
+
+  M_MMMP3Data *somThis = M_MMMP3GetData(somSelf);
+    M_MMMP3MethodDebug("M_MMMP3","cwmp3M_wpclsInitData");
+
+    M_MMMP3_parent_M_MMAudio_wpclsInitData(somSelf);
+
+    /* Get system codepage */
+    if(DosQueryCp(sizeof(ulCp), ulCp,&ulInfoLen)!=NO_ERROR) {
+      _ulCodePage=0;/* Indicate some error */
+    }
+    else 
+      _ulCodePage=ulCp[0];
+
+    /* Get ISO codepage */
+    _ulIsoCodePage=_getISOCp();
+
+
+#if 0
+    pszMp3ColTitles[0]=chrTrackName;
+    pszMp3ColTitles[1]=chrArtist;
+    pszMp3ColTitles[2]=chrAlbum;
+    pszMp3ColTitles[3]=chrYear;
+    pszMp3ColTitles[4]=chrComment;
+    pszMp3ColTitles[5]=chrGenre;
+
+  /* Setup the static data for the details view */
+  for(i=0,pCfi=cfiMp3FieldInfo;i<NUM_MP3_FIELDS;i++,pCfi++)
+    {
+      memset((PCH)pCfi,0,sizeof(CLASSFIELDINFO));
+
+      pCfi->cb=sizeof(CLASSFIELDINFO);
+      pCfi->flData=CFA_LEFT|CFA_SEPARATOR|CFA_FIREADONLY;
+      pCfi->flTitle=CFA_CENTER|CFA_SEPARATOR|CFA_HORZSEPARATOR|CFA_STRING|CFA_FITITLEREADONLY;
+      pCfi->pNextFieldInfo=pCfi+1;
+       pCfi->pTitleData=(PVOID)pszMp3ColTitles[i];
+      pCfi->flCompare=COMPARE_SUPPORTED|SORTBY_SUPPORTED;
+
+      switch(i)
+        {
+        case 0:
+          pCfi->flData|=CFA_STRING;
+          pCfi->offFieldData=(ULONG)(FIELDOFFSETUL(MP3DETAILS,pszTrackName));
+          pCfi->ulLenFieldData=sizeof(PSZ);
+          pCfi->DefaultComparison=CMP_EQUAL;
+          break;
+        case 1:
+          pCfi->flData|=CFA_STRING;
+          pCfi->offFieldData=(ULONG)(FIELDOFFSETUL(MP3DETAILS,pszArtist));
+          pCfi->ulLenFieldData=sizeof(PSZ);
+          pCfi->DefaultComparison=CMP_EQUAL;
+          //          WinMessageBox(HWND_DESKTOP, HWND_DESKTOP, pszMp3ColTitles[i], pCfi->pTitleData,1234, MB_MOVEABLE|MB_OK);
+          break;
+        case 2:
+          pCfi->flData|=CFA_STRING;
+          pCfi->offFieldData=(ULONG)(FIELDOFFSETUL(MP3DETAILS,pszAlbum));
+          pCfi->ulLenFieldData=sizeof(PSZ);
+          pCfi->DefaultComparison=CMP_EQUAL;
+          break;
+        case 3: /* CC */
+          pCfi->flData|=CFA_STRING;
+          pCfi->offFieldData=(ULONG)(FIELDOFFSETUL(MP3DETAILS,pszYear));
+          pCfi->ulLenFieldData=sizeof(PSZ);
+          pCfi->DefaultComparison=CMP_EQUAL;
+          break;
+        case 4:
+          pCfi->flData|=CFA_STRING;
+          pCfi->offFieldData=(ULONG)(FIELDOFFSETUL(MP3DETAILS,pszComment));
+          pCfi->ulLenFieldData=sizeof(PSZ);
+          pCfi->DefaultComparison=CMP_EQUAL;
+          break;
+        case 5:
+          pCfi->flData|=CFA_STRING;
+          pCfi->offFieldData=(ULONG)(FIELDOFFSETUL(MP3DETAILS,pszGenre));
+          pCfi->ulLenFieldData=sizeof(PSZ);
+          pCfi->DefaultComparison=CMP_EQUAL;
+          break;
+        }/* switch(i) */
+    }/* for() */
+  cfiMp3FieldInfo[NUM_MP3_FIELDS-1].pNextFieldInfo=NULL;
+#endif
+
+}
+
+/*
+ * The prototype for cwmp3M_wpclsQueryDefaultHelp was replaced by the following prototype:
+ */
+SOM_Scope BOOL  SOMLINK cwmp3M_wpclsQueryDefaultHelp(M_MMMP3 *somSelf, 
+                                                     PULONG pHelpPanelId, 
+                                                     PSZ pszHelpLibrary)
+{
+  PSZ pszHelpLibName;
+
+    /* M_CWMP3Data *somThis = M_CWMP3GetData(somSelf); */
+    M_MMMP3MethodDebug("M_MMMP3","cwmp3M_wpclsQueryDefaultHelp");
+
+    if((pszHelpLibName=_queryMp3HelpLibraryName())!=NULLHANDLE)
+      {
+        if(pHelpPanelId)
+          *pHelpPanelId=MP3FILE_HELP_PANEL;
+        if(pszHelpLibrary)
+          strncpy(pszHelpLibrary, pszHelpLibName, CCHMAXPATH);
+        return TRUE; 
+      }
+
+    return (M_MMMP3_parent_M_MMAudio_wpclsQueryDefaultHelp(somSelf, 
+                                                           pHelpPanelId, 
+                                                           pszHelpLibrary));
+}
+
+
Index: /tags/CWMM-0.3.0_GA/classes/c/c_audio/cwogg.c
===================================================================
--- /tags/CWMM-0.3.0_GA/classes/c/c_audio/cwogg.c	(revision 213)
+++ /tags/CWMM-0.3.0_GA/classes/c/c_audio/cwogg.c	(revision 213)
@@ -0,0 +1,259 @@
+
+/*
+ *  This file was generated by the SOM Compiler.
+ *  Generated using:
+ *     SOM incremental update: 2.47
+ */
+
+
+/*
+ * (C) Chris Wohlgemuth 2002-2004
+ *
+ */
+/*
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; see the file COPYING.  If not, write to
+ * the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+/*
+ * If you need another license for your project/product contact me at
+ * 
+ * http://www.os2world.com/cdwriting
+ * http://www.geocities.com/SiliconValley/Sector/5785/
+ */
+
+/*
+ *  This file was generated by the SOM Compiler and Emitter Framework.
+ *  Generated using: 
+ *      SOM Emitter emitctm: 2.42
+ */
+
+#ifndef SOM_Module_cwogg_Source
+#define SOM_Module_cwogg_Source
+#endif
+#define CWOGG_Class_Source
+#define M_CWOGG_Class_Source
+
+#include "os2.h"
+#include "cwogginc.h"
+#include "cwogg.ih"
+#include "cwaudio.h"
+//#include "cwmmres.h"
+#include "mmres.h"
+#include "cwaudioinc.h"
+
+#include "sys_funcs.h"
+
+extern char classDLLPath[CCHMAXPATH];
+
+HMODULE queryResModuleHandle(void);
+HMODULE queryModuleHandle(void);
+BOOL getMessage(char* text,ULONG ulID, LONG lSizeText, HMODULE hResource,HWND hwnd);
+
+static PSZ _queryHelpLibraryName(void)
+{
+  static char helpLibraryName[CCHMAXPATH];
+  BOOL bDone=FALSE;
+
+  if(!bDone) {
+    if(queryModuleHandle()) {
+      char  *ptr;
+      strncpy(helpLibraryName, classDLLPath, sizeof(helpLibraryName)-1);
+      if((ptr=strrchr(helpLibraryName, '\\'))!=NULLHANDLE) {
+        *(++ptr)=0;
+        if(strlen(helpLibraryName)+strlen(OGGFILE_HELP_LIBRARY)<sizeof(helpLibraryName)) {
+          strcat(helpLibraryName, OGGFILE_HELP_LIBRARY );
+          bDone=TRUE;
+          return helpLibraryName;
+        }
+      }
+    }
+    return NULLHANDLE;
+  }
+
+  return helpLibraryName;
+}
+
+
+/*
+ * SOM_Scope ULONG  SOMLINK cwogg_cwmmQueryTrackInfo(MMOGG *somSelf, 
+ *                                                   char** chrString, 
+ *                                                   ULONG ulSize, 
+ *                                                   int iWhich)
+ */
+
+/*
+ * The prototype for cwogg_cwmmQueryTrackInfo was replaced by the following prototype:
+ */
+
+/*
+ * SOM_Scope ULONG  SOMLINK cwogg_cwmmQueryTrackInfo(MMOGG *somSelf, 
+ *                                                   PSZ chrString, 
+ *                                                   ULONG ulSize, 
+ *                                                   int iWhich)
+ */
+
+/*
+ * The prototype for cwogg_cwmmQueryTrackInfo was replaced by the following prototype:
+ */
+SOM_Scope ULONG  SOMLINK cwogg_cwmmQueryTrackInfo(MMOGG *somSelf, 
+                                                  PSZ chrString, 
+                                                  ULONG ulSize, 
+                                                  ULONG iWhich)
+{
+  /*     MMOGGData *somThis = MMOGGGetData(somSelf); */
+  /*      MMAudioData *somThis = MMAudioGetData(somSelf); */
+    MMOGGMethodDebug("MMOGG","cwogg_cwmmQueryTrackInfo");
+
+    if(iWhich<1||iWhich>IDINFO_LASTINFO)
+      return FALSE;
+    /*
+    switch(iWhich)
+      {
+      case IDINFO_BITRATE:
+        return _ulBitRate;
+      default:
+        break;
+      }
+      */
+    return (MMOGG_parent_MMAudio_cwmmQueryTrackInfo(somSelf, 
+                                                    chrString, 
+                                                    ulSize, iWhich));
+}
+
+/*
+ * The prototype for cwogg_wpSaveState was replaced by the following prototype:
+ */
+SOM_Scope BOOL  SOMLINK cwogg_wpSaveState(MMOGG *somSelf)
+{
+  //  char chrBuf[256];
+  //  ULONG ulLength;
+  BOOL rc;
+
+  /*  MMAudioData *somThis = MMAudioGetData(somSelf);*/
+    MMOGGMethodDebug("MMOGG","cwogg_wpSaveState");
+
+    /* call parent first. By doing so, the MP3 type is written after the Digital Audio type.
+     This way the default class the WPS picks is MMOGG and not MMAudio. */
+    rc=(MMOGG_parent_MMAudio_wpSaveState(somSelf));
+
+    return rc;
+
+#if 0
+    strncpy(chrBuf, _wpQueryType(somSelf), sizeof(chrBuf));
+    chrBuf[sizeof(chrBuf)-1]=0;
+
+    if(!strstr(chrBuf, TYPE_OGG)) {
+      ulLength=strlen(chrBuf);
+      if(ulLength) {
+        if(ulLength+6 < sizeof(chrBuf)) {
+          strcat(chrBuf, "\n");
+          strcat(chrBuf, TYPE_OGG);
+        }
+      }
+      else
+        strcpy(chrBuf, TYPE_OGG);
+    }
+    return rc;
+#endif
+}
+
+/*
+ * The prototype for cwoggM_wpclsQueryTitle was replaced by the following prototype:
+ */
+SOM_Scope PSZ  SOMLINK cwoggM_wpclsQueryTitle(M_MMOGG *somSelf)
+{
+  static char chrTitle[20]={0};
+    /* M_CWOGGData *somThis = M_CWOGGGetData(somSelf); */
+    M_MMOGGMethodDebug("M_MMOGG","cwoggM_wpclsQueryTitle");
+
+    if(chrTitle[0]==0)
+      if(!getMessage(chrTitle, IDSTR_OGGTITLE, sizeof(chrTitle), queryResModuleHandle(), HWND_DESKTOP))
+        strcpy(chrTitle, CLSTITLE_OGG);
+
+    return chrTitle;
+}
+
+/*
+ * The prototype for cwoggM_wpclsQueryInstanceType was replaced by the following prototype:
+ */
+SOM_Scope PSZ  SOMLINK cwoggM_wpclsQueryInstanceType(M_MMOGG *somSelf)
+{
+    /* M_CWOGGData *somThis = M_CWOGGGetData(somSelf); */
+    M_MMOGGMethodDebug("M_MMOGG","cwoggM_wpclsQueryInstanceType");
+
+    return TYPE_OGG;
+    //    return "OGGS,Digital Audio";
+}
+
+/*
+ * The prototype for cwoggM_wpclsQueryInstanceFilter was replaced by the following prototype:
+ */
+SOM_Scope PSZ  SOMLINK cwoggM_wpclsQueryInstanceFilter(M_MMOGG *somSelf)
+{
+    /* M_CWOGGData *somThis = M_CWOGGGetData(somSelf); */
+    M_MMOGGMethodDebug("M_MMOGG","cwoggM_wpclsQueryInstanceFilter");
+
+    return "*.OGG";
+}
+
+/*
+ * The prototype for cwoggM_wpclsQueryIconData was replaced by the following prototype:
+ */
+SOM_Scope ULONG  SOMLINK cwoggM_wpclsQueryIconData(M_MMOGG *somSelf, 
+                                                   PICONINFO pIconInfo)
+{
+  HMODULE hmod;
+    /* M_CWOGGData *somThis = M_CWOGGGetData(somSelf); */
+    M_MMOGGMethodDebug("M_MMOGG","cwoggM_wpclsQueryIconData");
+
+    hmod=queryModuleHandle();
+    if(!hmod)
+      return M_MMOGG_parent_M_MMAudio_wpclsQueryIconData(somSelf, pIconInfo);
+
+	if (pIconInfo)   {
+      pIconInfo->fFormat = ICON_RESOURCE;
+      pIconInfo->hmod    = hmod;
+      pIconInfo->resid   = ID_ICONOGGFILE;
+	} /* endif */
+
+	return ( sizeof(ICONINFO) );
+}
+
+/*
+ * The prototype for cwoggM_wpclsQueryDefaultHelp was replaced by the following prototype:
+ */
+SOM_Scope BOOL  SOMLINK cwoggM_wpclsQueryDefaultHelp(M_MMOGG *somSelf, 
+                                                     PULONG pHelpPanelId, 
+                                                     PSZ pszHelpLibrary)
+{
+  PSZ pszHelpLibName;
+
+    /* M_CWOGGData *somThis = M_CWOGGGetData(somSelf); */
+    M_MMOGGMethodDebug("M_MMOGG","cwoggM_wpclsQueryDefaultHelp");
+
+    if((pszHelpLibName=_queryHelpLibraryName())!=NULLHANDLE)
+      {
+        if(pHelpPanelId)
+          *pHelpPanelId=OGGFILE_HELP_PANEL;
+        if(pszHelpLibrary)
+          strncpy(pszHelpLibrary, pszHelpLibName, CCHMAXPATH);
+        return TRUE; 
+      }
+
+    return (M_MMOGG_parent_M_MMAudio_wpclsQueryDefaultHelp(somSelf, 
+                                                           pHelpPanelId, 
+                                                           pszHelpLibrary));
+}
+
+
Index: /tags/CWMM-0.3.0_GA/classes/c/c_audio/cwsndf.c
===================================================================
--- /tags/CWMM-0.3.0_GA/classes/c/c_audio/cwsndf.c	(revision 213)
+++ /tags/CWMM-0.3.0_GA/classes/c/c_audio/cwsndf.c	(revision 213)
@@ -0,0 +1,156 @@
+/*
+ * (C) Chris Wohlgemuth 2002-2004
+ *
+ */
+/*
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; see the file COPYING.  If not, write to
+ * the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+/*
+ * If you need another license for your project/product contact me at
+ * 
+ * http://www.os2world.com/cdwriting
+ * http://www.geocities.com/SiliconValley/Sector/5785/
+ */
+/*
+ *  This file was generated by the SOM Compiler and Emitter Framework.
+ *  Generated using: 
+ *      SOM Emitter emitctm: 2.42
+ */
+
+#ifndef SOM_Module_cwsndf_Source
+#define SOM_Module_cwsndf_Source
+#endif
+#define CWSNDF_Class_Source
+#define M_CWSNDF_Class_Source
+
+#include <os2.h>
+#include "helpid.h"
+#include "cwsndf.ih"
+#include "cwaudioinc.h"
+
+extern char chrHelpLibrary[CCHMAXPATH];
+
+HMODULE queryResModuleHandle(void);
+HMODULE queryModuleHandle(void);
+BOOL getMessage(char* text,ULONG ulID, LONG lSizeText, HMODULE hResource,HWND hwnd);
+
+
+/*
+ * SOM_Scope PSZ  SOMLINK cwsndfM_wpclsQueryInstanceType(M_CWSNDF *somSelf)
+ */
+/*
+ * The prototype for cwsndfM_wpclsQueryInstanceType was replaced by the following prototype:
+ */
+SOM_Scope PSZ  SOMLINK cwsndfM_wpclsQueryInstanceType(M_MMSNDF *somSelf)
+{
+    /* M_CWSNDFData *somThis = M_CWSNDFGetData(somSelf); */
+    M_MMSNDFMethodDebug("M_MMSNDF","cwsndfM_wpclsQueryInstanceType");
+
+    return TYPE_SNDF;
+    //    return "SND";
+}
+
+
+/*
+ * SOM_Scope PSZ  SOMLINK cwsndfM_wpclsQueryInstanceFilter(M_CWSNDF *somSelf)
+ */
+
+/*
+ * The prototype for cwsndfM_wpclsQueryInstanceFilter was replaced by the following prototype:
+ */
+SOM_Scope PSZ  SOMLINK cwsndfM_wpclsQueryInstanceFilter(M_MMSNDF *somSelf)
+{
+    /* M_CWSNDFData *somThis = M_CWSNDFGetData(somSelf); */
+    M_MMSNDFMethodDebug("M_MMSNDF","cwsndfM_wpclsQueryInstanceFilter");
+
+    return "*.SND";
+}
+
+
+/*
+ * SOM_Scope BOOL  SOMLINK cwsndfM_wpclsQueryDefaultHelp(M_CWSNDF *somSelf, 
+ *                                                       PULONG pHelpPanelId, 
+ *                                                       PSZ pszHelpLibrary)
+ */
+
+/*
+ * The prototype for cwsndfM_wpclsQueryDefaultHelp was replaced by the following prototype:
+ */
+SOM_Scope BOOL  SOMLINK cwsndfM_wpclsQueryDefaultHelp(M_MMSNDF *somSelf, 
+                                                      PULONG pHelpPanelId, 
+                                                      PSZ pszHelpLibrary)
+{
+    /* M_CWSNDFData *somThis = M_CWSNDFGetData(somSelf); */
+    M_MMSNDFMethodDebug("M_MMSNDF","cwsndfM_wpclsQueryDefaultHelp");
+
+
+    if(pHelpPanelId)
+      *pHelpPanelId=SNDFFILE_HELP_PANEL;
+    if(pszHelpLibrary)
+      strncpy(pszHelpLibrary, chrHelpLibrary, CCHMAXPATH);
+    return TRUE; 
+}
+
+
+/*
+ * SOM_Scope PSZ  SOMLINK cwsndfM_wpclsQueryTitle(M_CWSNDF *somSelf)
+ */
+
+/*
+ * The prototype for cwsndfM_wpclsQueryTitle was replaced by the following prototype:
+ */
+SOM_Scope PSZ  SOMLINK cwsndfM_wpclsQueryTitle(M_MMSNDF *somSelf)
+{
+  static char chrTitle[20]={0};
+    /* M_CWSNDFData *somThis = M_CWSNDFGetData(somSelf); */
+    M_MMSNDFMethodDebug("M_MMSNDF","cwsndfM_wpclsQueryTitle");
+
+    if(chrTitle[0]==0)
+      if(!getMessage(chrTitle, IDSTR_SNDFTITLE, sizeof(chrTitle), queryResModuleHandle(), HWND_DESKTOP))
+        strcpy(chrTitle, CLSTITLE_SNDF);
+
+    return chrTitle;
+}
+
+
+/*
+ * SOM_Scope ULONG  SOMLINK cwsndfM_wpclsQueryIconData(M_CWSNDF *somSelf, 
+ *                                                     PICONINFO pIconInfo)
+ */
+
+/*
+ * The prototype for cwsndfM_wpclsQueryIconData was replaced by the following prototype:
+ */
+SOM_Scope ULONG  SOMLINK cwsndfM_wpclsQueryIconData(M_MMSNDF *somSelf, 
+                                                    PICONINFO pIconInfo)
+{
+  HMODULE hmod;
+
+    /* M_CWSNDFData *somThis = M_CWSNDFGetData(somSelf); */
+    M_MMSNDFMethodDebug("M_MMSNDF","cwsndfM_wpclsQueryIconData");
+
+    hmod=queryModuleHandle();
+    if(!hmod)
+      return M_MMSNDF_parent_M_MMAudio_wpclsQueryIconData(somSelf, pIconInfo);
+
+	if (pIconInfo)   {
+      pIconInfo->fFormat = ICON_RESOURCE;
+      pIconInfo->hmod    = hmod;
+      pIconInfo->resid   = ID_ICONVOCFILE;
+	} /* endif */
+
+	return ( sizeof(ICONINFO) );
+}
+
Index: /tags/CWMM-0.3.0_GA/classes/c/c_audio/cwvoc.c
===================================================================
--- /tags/CWMM-0.3.0_GA/classes/c/c_audio/cwvoc.c	(revision 213)
+++ /tags/CWMM-0.3.0_GA/classes/c/c_audio/cwvoc.c	(revision 213)
@@ -0,0 +1,156 @@
+/*
+ * (C) Chris Wohlgemuth 2002-2004
+ *
+ */
+/*
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; see the file COPYING.  If not, write to
+ * the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+/*
+ * If you need another license for your project/product contact me at
+ * 
+ * http://www.os2world.com/cdwriting
+ * http://www.geocities.com/SiliconValley/Sector/5785/
+ */
+/*
+ *  This file was generated by the SOM Compiler and Emitter Framework.
+ *  Generated using: 
+ *      SOM Emitter emitctm: 2.42
+ */
+
+#ifndef SOM_Module_cwvoc_Source
+#define SOM_Module_cwvoc_Source
+#endif
+#define CWVOC_Class_Source
+#define M_CWVOC_Class_Source
+
+#include <os2.h>
+#include "helpid.h"
+#include "cwvoc.ih"
+#include "cwaudioinc.h"
+
+extern char chrHelpLibrary[CCHMAXPATH];
+
+HMODULE queryResModuleHandle(void);
+HMODULE queryModuleHandle(void);
+BOOL getMessage(char* text,ULONG ulID, LONG lSizeText, HMODULE hResource,HWND hwnd);
+
+
+/*
+ * SOM_Scope PSZ  SOMLINK cwvocM_wpclsQueryInstanceType(M_CWVOC *somSelf)
+ */
+
+/*
+ * The prototype for cwvocM_wpclsQueryInstanceType was replaced by the following prototype:
+ */
+SOM_Scope PSZ  SOMLINK cwvocM_wpclsQueryInstanceType(M_MMVOC *somSelf)
+{
+    /* M_CWVOCData *somThis = M_CWVOCGetData(somSelf); */
+    M_MMVOCMethodDebug("M_MMVOC","cwvocM_wpclsQueryInstanceType");
+
+    return TYPE_VOC;
+    //    return "VOC";
+}
+
+
+/*
+ * SOM_Scope PSZ  SOMLINK cwvocM_wpclsQueryInstanceFilter(M_CWVOC *somSelf)
+ */
+
+/*
+ * The prototype for cwvocM_wpclsQueryInstanceFilter was replaced by the following prototype:
+ */
+SOM_Scope PSZ  SOMLINK cwvocM_wpclsQueryInstanceFilter(M_MMVOC *somSelf)
+{
+    /* M_CWVOCData *somThis = M_CWVOCGetData(somSelf); */
+    M_MMVOCMethodDebug("M_MMVOC","cwvocM_wpclsQueryInstanceFilter");
+
+    return "*.VOC";
+}
+
+
+/*
+ * SOM_Scope BOOL  SOMLINK cwvocM_wpclsQueryDefaultHelp(M_CWVOC *somSelf, 
+ *                                                      PULONG pHelpPanelId, 
+ *                                                      PSZ pszHelpLibrary)
+ */
+
+/*
+ * The prototype for cwvocM_wpclsQueryDefaultHelp was replaced by the following prototype:
+ */
+SOM_Scope BOOL  SOMLINK cwvocM_wpclsQueryDefaultHelp(M_MMVOC *somSelf, 
+                                                     PULONG pHelpPanelId, 
+                                                     PSZ pszHelpLibrary)
+{
+    /* M_CWVOCData *somThis = M_CWVOCGetData(somSelf); */
+    M_MMVOCMethodDebug("M_MMVOC","cwvocM_wpclsQueryDefaultHelp");
+
+
+    if(pHelpPanelId)
+      *pHelpPanelId=VOCFILE_HELP_PANEL;
+    if(pszHelpLibrary)
+      strncpy(pszHelpLibrary, chrHelpLibrary, CCHMAXPATH);
+    return TRUE; 
+}
+
+
+/*
+ * SOM_Scope PSZ  SOMLINK cwvocM_wpclsQueryTitle(M_CWVOC *somSelf)
+ */
+
+/*
+ * The prototype for cwvocM_wpclsQueryTitle was replaced by the following prototype:
+ */
+SOM_Scope PSZ  SOMLINK cwvocM_wpclsQueryTitle(M_MMVOC *somSelf)
+{
+  static char chrTitle[20]={0};
+    /* M_CWVOCData *somThis = M_CWVOCGetData(somSelf); */
+    M_MMVOCMethodDebug("M_MMVOC","cwvocM_wpclsQueryTitle");
+
+    if(chrTitle[0]==0)
+      if(!getMessage(chrTitle, IDSTR_VOCTITLE, sizeof(chrTitle), queryResModuleHandle(), HWND_DESKTOP))
+        strcpy(chrTitle, CLSTITLE_VOC);
+
+    return chrTitle;
+}
+
+
+/*
+ * SOM_Scope ULONG  SOMLINK cwvocM_wpclsQueryIconData(M_CWVOC *somSelf, 
+ *                                                    PICONINFO pIconInfo)
+ */
+
+/*
+ * The prototype for cwvocM_wpclsQueryIconData was replaced by the following prototype:
+ */
+SOM_Scope ULONG  SOMLINK cwvocM_wpclsQueryIconData(M_MMVOC *somSelf, 
+                                                   PICONINFO pIconInfo)
+{
+  HMODULE hmod;
+    /* M_CWVOCData *somThis = M_CWVOCGetData(somSelf); */
+    M_MMVOCMethodDebug("M_MMVOC","cwvocM_wpclsQueryIconData");
+
+    hmod=queryModuleHandle();
+    if(!hmod)
+      return M_MMVOC_parent_M_MMAudio_wpclsQueryIconData(somSelf, pIconInfo);
+
+	if (pIconInfo)   {
+      pIconInfo->fFormat = ICON_RESOURCE;
+      pIconInfo->hmod    = hmod;
+      pIconInfo->resid   = ID_ICONVOCFILE;
+	} /* endif */
+
+	return ( sizeof(ICONINFO) );
+}
+
Index: /tags/CWMM-0.3.0_GA/classes/c/c_audio/makefile
===================================================================
--- /tags/CWMM-0.3.0_GA/classes/c/c_audio/makefile	(revision 213)
+++ /tags/CWMM-0.3.0_GA/classes/c/c_audio/makefile	(revision 213)
@@ -0,0 +1,10 @@
+# Makefile
+
+OBJECTS	= 
+
+all:
+	cd ../. && make
+
+clean:
+	rm *.*~
+
Index: /tags/CWMM-0.3.0_GA/classes/c/c_audio/mmaudio.c
===================================================================
--- /tags/CWMM-0.3.0_GA/classes/c/c_audio/mmaudio.c	(revision 213)
+++ /tags/CWMM-0.3.0_GA/classes/c/c_audio/mmaudio.c	(revision 213)
@@ -0,0 +1,281 @@
+/*
+ * (C) Chris Wohlgemuth 2002-2003
+ *
+ */
+/*
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; see the file COPYING.  If not, write to
+ * the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
+ */          
+/*
+ * If you need another license for your project/product (commercial,
+ * noncommercial, whatever) contact me at
+ * 
+ * http://www.os2world.com/cdwriting
+ * http://www.geocities.com/SiliconValley/Sector/5785/
+ *
+ */
+/*
+ *  This file was generated by the SOM Compiler and Emitter Framework.
+ *  Generated using: 
+ *      SOM Emitter emitctm: 2.42
+ */
+
+#ifndef SOM_Module_mmaudio_Source
+#define SOM_Module_mmaudio_Source
+#endif
+#define MMAudio_Class_Source
+#define M_MMAudio_Class_Source
+
+#include "mmaudio.ih"
+
+
+SOM_Scope BOOL  SOMLINK mmaudio_wpModifyPopupMenu(MMAudio *somSelf, 
+                                                  HWND hwndMenu, 
+                                                  HWND hwndCnr, 
+                                                  ULONG iPosition)
+{
+    /* MMAudioData *somThis = MMAudioGetData(somSelf); */
+    MMAudioMethodDebug("MMAudio","mmaudio_wpModifyPopupMenu");
+
+    return (MMAudio_parent_MMDataFile_wpModifyPopupMenu(somSelf, 
+                                                        hwndMenu, 
+                                                        hwndCnr, 
+                                                        iPosition));
+}
+
+SOM_Scope ULONG  SOMLINK mmaudio_mmFilterPopupMenu(MMAudio *somSelf, 
+                                                   ULONG ulFlags, 
+                                                   HWND hwndcnr, 
+                                                   BOOL fMultiSelect)
+{
+    /* MMAudioData *somThis = MMAudioGetData(somSelf); */
+    MMAudioMethodDebug("MMAudio","mmaudio_mmFilterPopupMenu");
+
+    return (MMAudio_parent_MMDataFile_mmFilterPopupMenu(somSelf, 
+                                                        ulFlags, 
+                                                        hwndcnr, 
+                                                        fMultiSelect));
+}
+
+SOM_Scope ULONG  SOMLINK mmaudio_mmViewNotify(MMAudio *somSelf)
+{
+    /* MMAudioData *somThis = MMAudioGetData(somSelf); */
+    MMAudioMethodDebug("MMAudio","mmaudio_mmViewNotify");
+
+    return (MMAudio_parent_MMDataFile_mmViewNotify(somSelf));
+}
+
+SOM_Scope BOOL  SOMLINK mmaudio_wpFormatDragItem(MMAudio *somSelf, 
+                                                 PDRAGITEM pdrgItem)
+{
+    /* MMAudioData *somThis = MMAudioGetData(somSelf); */
+    MMAudioMethodDebug("MMAudio","mmaudio_wpFormatDragItem");
+
+    return (MMAudio_parent_MMDataFile_wpFormatDragItem(somSelf, 
+                                                       pdrgItem));
+}
+
+SOM_Scope BOOL  SOMLINK mmaudio_wpMenuItemSelected(MMAudio *somSelf, 
+                                                   HWND hwndFrame, 
+                                                   ULONG ulMenuId)
+{
+    /* MMAudioData *somThis = MMAudioGetData(somSelf); */
+    MMAudioMethodDebug("MMAudio","mmaudio_wpMenuItemSelected");
+
+    return (MMAudio_parent_MMDataFile_wpMenuItemSelected(somSelf, 
+                                                         hwndFrame, 
+                                                         ulMenuId));
+}
+
+SOM_Scope BOOL  SOMLINK mmaudio_wpSetup(MMAudio *somSelf, PSZ pszSetupString)
+{
+    /* MMAudioData *somThis = MMAudioGetData(somSelf); */
+    MMAudioMethodDebug("MMAudio","mmaudio_wpSetup");
+
+    return (MMAudio_parent_MMDataFile_wpSetup(somSelf, pszSetupString));
+}
+
+SOM_Scope MRESULT  SOMLINK mmaudio_wpDragOver(MMAudio *somSelf, 
+                                              HWND hwndCnr, PDRAGINFO pdrgInfo)
+{
+    /* MMAudioData *somThis = MMAudioGetData(somSelf); */
+    MMAudioMethodDebug("MMAudio","mmaudio_wpDragOver");
+
+    return (MMAudio_parent_MMDataFile_wpDragOver(somSelf, hwndCnr, 
+                                                 pdrgInfo));
+}
+
+SOM_Scope BOOL  SOMLINK mmaudio_wpRestoreState(MMAudio *somSelf, 
+                                               ULONG ulReserved)
+{
+    /* MMAudioData *somThis = MMAudioGetData(somSelf); */
+    MMAudioMethodDebug("MMAudio","mmaudio_wpRestoreState");
+
+    return (MMAudio_parent_MMDataFile_wpRestoreState(somSelf, 
+                                                     ulReserved));
+}
+
+SOM_Scope BOOL  SOMLINK mmaudio_wpSaveState(MMAudio *somSelf)
+{
+    /* MMAudioData *somThis = MMAudioGetData(somSelf); */
+    MMAudioMethodDebug("MMAudio","mmaudio_wpSaveState");
+
+    return (MMAudio_parent_MMDataFile_wpSaveState(somSelf));
+}
+
+SOM_Scope BOOL  SOMLINK mmaudio_wpSetRealName(MMAudio *somSelf, 
+                                              PSZ pszName)
+{
+    /* MMAudioData *somThis = MMAudioGetData(somSelf); */
+    MMAudioMethodDebug("MMAudio","mmaudio_wpSetRealName");
+
+    return (MMAudio_parent_MMDataFile_wpSetRealName(somSelf, 
+                                                    pszName));
+}
+
+SOM_Scope HWND  SOMLINK mmaudio_wpOpen(MMAudio *somSelf, HWND hwndCnr, 
+                                       ULONG ulView, ULONG param)
+{
+    /* MMAudioData *somThis = MMAudioGetData(somSelf); */
+    MMAudioMethodDebug("MMAudio","mmaudio_wpOpen");
+
+    return (MMAudio_parent_MMDataFile_wpOpen(somSelf, hwndCnr, 
+                                             ulView, param));
+}
+
+SOM_Scope HPOINTER  SOMLINK mmaudio_wpQueryIcon(MMAudio *somSelf)
+{
+    /* MMAudioData *somThis = MMAudioGetData(somSelf); */
+    MMAudioMethodDebug("MMAudio","mmaudio_wpQueryIcon");
+
+    return (MMAudio_parent_MMDataFile_wpQueryIcon(somSelf));
+}
+
+
+SOM_Scope ULONG  SOMLINK mmaudio_wpQueryDefaultView(MMAudio *somSelf)
+{
+    /* MMAudioData *somThis = MMAudioGetData(somSelf); */
+    MMAudioMethodDebug("MMAudio","mmaudio_wpQueryDefaultView");
+
+    return (MMAudio_parent_MMDataFile_wpQueryDefaultView(somSelf));
+}
+
+SOM_Scope void  SOMLINK mmaudio_wpUnInitData(MMAudio *somSelf)
+{
+    /* MMAudioData *somThis = MMAudioGetData(somSelf); */
+    MMAudioMethodDebug("MMAudio","mmaudio_wpUnInitData");
+
+    MMAudio_parent_MMDataFile_wpUnInitData(somSelf);
+}
+
+
+SOM_Scope BOOL  SOMLINK mmaudioM_mmclsDeleteFromTypeList(M_MMAudio *somSelf, 
+                                                         PSZ pszType)
+{
+    /* M_MMAudioData *somThis = M_MMAudioGetData(somSelf); */
+    M_MMAudioMethodDebug("M_MMAudio","mmaudioM_mmclsDeleteFromTypeList");
+
+    return (M_MMAudio_parent_M_MMDataFile_mmclsDeleteFromTypeList(somSelf, 
+                                                                  pszType));
+}
+
+SOM_Scope BOOL  SOMLINK mmaudioM_mmclsDeleteFromExtensionList(M_MMAudio *somSelf, 
+                                                              PSZ pszExt)
+{
+    /* M_MMAudioData *somThis = M_MMAudioGetData(somSelf); */
+    M_MMAudioMethodDebug("M_MMAudio","mmaudioM_mmclsDeleteFromExtensionList");
+
+    return (M_MMAudio_parent_M_MMDataFile_mmclsDeleteFromExtensionList(somSelf, 
+                                                                       pszExt));
+}
+
+SOM_Scope BOOL  SOMLINK mmaudioM_mmclsInitTypesAndExtensions(M_MMAudio *somSelf)
+{
+    /* M_MMAudioData *somThis = M_MMAudioGetData(somSelf); */
+    M_MMAudioMethodDebug("M_MMAudio","mmaudioM_mmclsInitTypesAndExtensions");
+
+    return (M_MMAudio_parent_M_MMDataFile_mmclsInitTypesAndExtensions(somSelf));
+}
+
+SOM_Scope PSZ  SOMLINK mmaudioM_wpclsQueryInstanceType(M_MMAudio *somSelf)
+{
+    /* M_MMAudioData *somThis = M_MMAudioGetData(somSelf); */
+    M_MMAudioMethodDebug("M_MMAudio","mmaudioM_wpclsQueryInstanceType");
+
+    return (M_MMAudio_parent_M_MMDataFile_wpclsQueryInstanceType(somSelf));
+}
+
+SOM_Scope PSZ  SOMLINK mmaudioM_wpclsQueryInstanceFilter(M_MMAudio *somSelf)
+{
+    /* M_MMAudioData *somThis = M_MMAudioGetData(somSelf); */
+    M_MMAudioMethodDebug("M_MMAudio","mmaudioM_wpclsQueryInstanceFilter");
+
+    return (M_MMAudio_parent_M_MMDataFile_wpclsQueryInstanceFilter(somSelf));
+}
+
+SOM_Scope void  SOMLINK mmaudioM_wpclsInitData(M_MMAudio *somSelf)
+{
+    /* M_MMAudioData *somThis = M_MMAudioGetData(somSelf); */
+    M_MMAudioMethodDebug("M_MMAudio","mmaudioM_wpclsInitData");
+
+    M_MMAudio_parent_M_MMDataFile_wpclsInitData(somSelf);
+}
+
+SOM_Scope BOOL  SOMLINK mmaudioM_wpclsQueryDefaultHelp(M_MMAudio *somSelf, 
+                                                       PULONG pHelpPanelId, 
+                                                       PSZ pszHelpLibrary)
+{
+    /* M_MMAudioData *somThis = M_MMAudioGetData(somSelf); */
+    M_MMAudioMethodDebug("M_MMAudio","mmaudioM_wpclsQueryDefaultHelp");
+
+    return (M_MMAudio_parent_M_MMDataFile_wpclsQueryDefaultHelp(somSelf, 
+                                                                pHelpPanelId, 
+                                                                pszHelpLibrary));
+}
+
+SOM_Scope PSZ  SOMLINK mmaudioM_wpclsQueryTitle(M_MMAudio *somSelf)
+{
+    /* M_MMAudioData *somThis = M_MMAudioGetData(somSelf); */
+    M_MMAudioMethodDebug("M_MMAudio","mmaudioM_wpclsQueryTitle");
+
+    return (M_MMAudio_parent_M_MMDataFile_wpclsQueryTitle(somSelf));
+}
+
+SOM_Scope ULONG  SOMLINK mmaudioM_wpclsQueryStyle(M_MMAudio *somSelf)
+{
+    /* M_MMAudioData *somThis = M_MMAudioGetData(somSelf); */
+    M_MMAudioMethodDebug("M_MMAudio","mmaudioM_wpclsQueryStyle");
+
+    return (M_MMAudio_parent_M_MMDataFile_wpclsQueryStyle(somSelf));
+}
+
+
+SOM_Scope void  SOMLINK mmaudioM_wpclsUnInitData(M_MMAudio *somSelf)
+{
+    /* M_MMAudioData *somThis = M_MMAudioGetData(somSelf); */
+    M_MMAudioMethodDebug("M_MMAudio","mmaudioM_wpclsUnInitData");
+
+    M_MMAudio_parent_M_MMDataFile_wpclsUnInitData(somSelf);
+}
+
+SOM_Scope ULONG  SOMLINK mmaudioM_wpclsQueryIconData(M_MMAudio *somSelf, 
+                                                     PICONINFO pIconInfo)
+{
+    /* M_MMAudioData *somThis = M_MMAudioGetData(somSelf); */
+    M_MMAudioMethodDebug("M_MMAudio","mmaudioM_wpclsQueryIconData");
+
+    return (M_MMAudio_parent_M_MMDataFile_wpclsQueryIconData(somSelf, 
+                                                             pIconInfo));
+}
+
Index: /tags/CWMM-0.3.0_GA/classes/c/c_audio/mmdataf.c
===================================================================
--- /tags/CWMM-0.3.0_GA/classes/c/c_audio/mmdataf.c	(revision 213)
+++ /tags/CWMM-0.3.0_GA/classes/c/c_audio/mmdataf.c	(revision 213)
@@ -0,0 +1,373 @@
+/*
+ * (C) Chris Wohlgemuth 2002-2003
+ *
+ */
+/*
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; see the file COPYING.  If not, write to
+ * the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
+ */          
+/*
+ * If you need another license for your project/product (commercial,
+ * noncommercial, whatever) contact me at
+ * 
+ * http://www.os2world.com/cdwriting
+ * http://www.geocities.com/SiliconValley/Sector/5785/
+ *
+ */
+/*
+ *  This file was generated by the SOM Compiler and Emitter Framework.
+ *  Generated using: 
+ *      SOM Emitter emitctm: 2.42
+ */
+
+#ifndef SOM_Module_mmdataf_Source
+#define SOM_Module_mmdataf_Source
+#endif
+#define MMDataFile_Class_Source
+#define M_MMDataFile_Class_Source
+
+#include "mmdataf.ih"
+
+
+SOM_Scope BOOL  SOMLINK mmdatafile_wpModifyPopupMenu(MMDataFile *somSelf, 
+                                                     HWND hwndMenu, 
+                                                     HWND hwndCnr, 
+                                                     ULONG iPosition)
+{
+    /* MMDataFileData *somThis = MMDataFileGetData(somSelf); */
+    MMDataFileMethodDebug("MMDataFile","mmdatafile_wpModifyPopupMenu");
+
+    return (MMDataFile_parent_WPDataFile_wpModifyPopupMenu(somSelf, 
+                                                           hwndMenu, 
+                                                           hwndCnr, 
+                                                           iPosition));
+}
+
+SOM_Scope ULONG  SOMLINK mmdatafile_mmFilterPopupMenu(MMDataFile *somSelf, 
+                                                      ULONG ulFlags, 
+                                                      HWND hwndcnr, 
+                                                      BOOL fMultiSelect)
+{
+    /* MMDataFileData *somThis = MMDataFileGetData(somSelf); */
+    MMDataFileMethodDebug("MMDataFile","mmdatafile_mmFilterPopupMenu");
+
+    /* Return statement to be customized: */
+    return;
+}
+
+SOM_Scope ULONG  SOMLINK mmdatafile_mmViewNotify(MMDataFile *somSelf)
+{
+    /* MMDataFileData *somThis = MMDataFileGetData(somSelf); */
+    MMDataFileMethodDebug("MMDataFile","mmdatafile_mmViewNotify");
+
+    /* Return statement to be customized: */
+    return;
+}
+
+SOM_Scope ULONG  SOMLINK mmdatafile_mmDetermineViewFor(MMDataFile *somSelf)
+{
+    /* MMDataFileData *somThis = MMDataFileGetData(somSelf); */
+    MMDataFileMethodDebug("MMDataFile","mmdatafile_mmDetermineViewFor");
+
+    /* Return statement to be customized: */
+    return;
+}
+
+SOM_Scope ULONG  SOMLINK mmdatafile_wpFilterPopupMenu(MMDataFile *somSelf, 
+                                                      ULONG ulFlags, 
+                                                      HWND hwndCnr, 
+                                                      BOOL fMultiSelect)
+{
+    /* MMDataFileData *somThis = MMDataFileGetData(somSelf); */
+    MMDataFileMethodDebug("MMDataFile","mmdatafile_wpFilterPopupMenu");
+
+    return (MMDataFile_parent_WPDataFile_wpFilterPopupMenu(somSelf, 
+                                                           ulFlags, 
+                                                           hwndCnr, 
+                                                           fMultiSelect));
+}
+
+SOM_Scope void  SOMLINK mmdatafile_wpInitData(MMDataFile *somSelf)
+{
+    /* MMDataFileData *somThis = MMDataFileGetData(somSelf); */
+    MMDataFileMethodDebug("MMDataFile","mmdatafile_wpInitData");
+
+    MMDataFile_parent_WPDataFile_wpInitData(somSelf);
+}
+
+SOM_Scope BOOL  SOMLINK mmdatafile_wpMenuItemHelpSelected(MMDataFile *somSelf, 
+                                                          ULONG MenuId)
+{
+    /* MMDataFileData *somThis = MMDataFileGetData(somSelf); */
+    MMDataFileMethodDebug("MMDataFile","mmdatafile_wpMenuItemHelpSelected");
+
+    return (MMDataFile_parent_WPDataFile_wpMenuItemHelpSelected(somSelf, 
+                                                                MenuId));
+}
+
+SOM_Scope BOOL  SOMLINK mmdatafile_wpMenuItemSelected(MMDataFile *somSelf, 
+                                                      HWND hwndFrame, 
+                                                      ULONG ulMenuId)
+{
+    /* MMDataFileData *somThis = MMDataFileGetData(somSelf); */
+    MMDataFileMethodDebug("MMDataFile","mmdatafile_wpMenuItemSelected");
+
+    return (MMDataFile_parent_WPDataFile_wpMenuItemSelected(somSelf, 
+                                                            hwndFrame, 
+                                                            ulMenuId));
+}
+
+SOM_Scope ULONG  SOMLINK mmdatafile_wpQueryConcurrentView(MMDataFile *somSelf)
+{
+    /* MMDataFileData *somThis = MMDataFileGetData(somSelf); */
+    MMDataFileMethodDebug("MMDataFile","mmdatafile_wpQueryConcurrentView");
+
+    return (MMDataFile_parent_WPDataFile_wpQueryConcurrentView(somSelf));
+}
+
+SOM_Scope ULONG  SOMLINK mmdatafile_wpQueryDefaultView(MMDataFile *somSelf)
+{
+    /* MMDataFileData *somThis = MMDataFileGetData(somSelf); */
+    MMDataFileMethodDebug("MMDataFile","mmdatafile_wpQueryDefaultView");
+
+    return (MMDataFile_parent_WPDataFile_wpQueryDefaultView(somSelf));
+}
+
+SOM_Scope BOOL  SOMLINK mmdatafile_wpSetTitle(MMDataFile *somSelf, 
+                                              PSZ pszNewTitle)
+{
+    /* MMDataFileData *somThis = MMDataFileGetData(somSelf); */
+    MMDataFileMethodDebug("MMDataFile","mmdatafile_wpSetTitle");
+
+    return (MMDataFile_parent_WPDataFile_wpSetTitle(somSelf, 
+                                                    pszNewTitle));
+}
+
+SOM_Scope BOOL  SOMLINK mmdatafile_wpSetup(MMDataFile *somSelf, 
+                                           PSZ pszSetupString)
+{
+    /* MMDataFileData *somThis = MMDataFileGetData(somSelf); */
+    MMDataFileMethodDebug("MMDataFile","mmdatafile_wpSetup");
+
+    return (MMDataFile_parent_WPDataFile_wpSetup(somSelf, pszSetupString));
+}
+
+SOM_Scope MRESULT  SOMLINK mmdatafile_wpDragOver(MMDataFile *somSelf, 
+                                                 HWND hwndCnr, 
+                                                 PDRAGINFO pdrgInfo)
+{
+    /* MMDataFileData *somThis = MMDataFileGetData(somSelf); */
+    MMDataFileMethodDebug("MMDataFile","mmdatafile_wpDragOver");
+
+    return (MMDataFile_parent_WPDataFile_wpDragOver(somSelf, 
+                                                    hwndCnr, 
+                                                    pdrgInfo));
+}
+
+SOM_Scope BOOL  SOMLINK mmdatafile_wpRestoreState(MMDataFile *somSelf, 
+                                                  ULONG ulReserved)
+{
+    /* MMDataFileData *somThis = MMDataFileGetData(somSelf); */
+    MMDataFileMethodDebug("MMDataFile","mmdatafile_wpRestoreState");
+
+    return (MMDataFile_parent_WPDataFile_wpRestoreState(somSelf, 
+                                                        ulReserved));
+}
+
+SOM_Scope BOOL  SOMLINK mmdatafile_wpSaveState(MMDataFile *somSelf)
+{
+    /* MMDataFileData *somThis = MMDataFileGetData(somSelf); */
+    MMDataFileMethodDebug("MMDataFile","mmdatafile_wpSaveState");
+
+    return (MMDataFile_parent_WPDataFile_wpSaveState(somSelf));
+}
+
+SOM_Scope BOOL  SOMLINK mmdatafile_wpSetRealName(MMDataFile *somSelf, 
+                                                 PSZ pszName)
+{
+    /* MMDataFileData *somThis = MMDataFileGetData(somSelf); */
+    MMDataFileMethodDebug("MMDataFile","mmdatafile_wpSetRealName");
+
+    return (MMDataFile_parent_WPDataFile_wpSetRealName(somSelf, 
+                                                       pszName));
+}
+
+SOM_Scope HWND  SOMLINK mmdatafile_wpOpen(MMDataFile *somSelf, 
+                                          HWND hwndCnr, ULONG ulView, 
+                                          ULONG param)
+{
+    /* MMDataFileData *somThis = MMDataFileGetData(somSelf); */
+    MMDataFileMethodDebug("MMDataFile","mmdatafile_wpOpen");
+
+    return (MMDataFile_parent_WPDataFile_wpOpen(somSelf, hwndCnr, 
+                                                ulView, param));
+}
+
+SOM_Scope HPOINTER  SOMLINK mmdatafile_wpQueryIcon(MMDataFile *somSelf)
+{
+    /* MMDataFileData *somThis = MMDataFileGetData(somSelf); */
+    MMDataFileMethodDebug("MMDataFile","mmdatafile_wpQueryIcon");
+
+    return (MMDataFile_parent_WPDataFile_wpQueryIcon(somSelf));
+}
+
+
+SOM_Scope void  SOMLINK mmdatafile_wpUnInitData(MMDataFile *somSelf)
+{
+    /* MMDataFileData *somThis = MMDataFileGetData(somSelf); */
+    MMDataFileMethodDebug("MMDataFile","mmdatafile_wpUnInitData");
+
+    MMDataFile_parent_WPDataFile_wpUnInitData(somSelf);
+}
+
+SOM_Scope void  SOMLINK mmdatafile_wpObjectReady(MMDataFile *somSelf, 
+                                                 ULONG ulCode, 
+                                                 WPObject* refObject)
+{
+    /* MMDataFileData *somThis = MMDataFileGetData(somSelf); */
+    MMDataFileMethodDebug("MMDataFile","mmdatafile_wpObjectReady");
+
+    MMDataFile_parent_WPDataFile_wpObjectReady(somSelf, ulCode, 
+                                               refObject);
+}
+
+
+SOM_Scope PSZ  SOMLINK mmdatafileM_wpclsQueryTitle(M_MMDataFile *somSelf)
+{
+    /* M_MMDataFileData *somThis = M_MMDataFileGetData(somSelf); */
+    M_MMDataFileMethodDebug("M_MMDataFile","mmdatafileM_wpclsQueryTitle");
+
+    return (M_MMDataFile_parent_M_WPDataFile_wpclsQueryTitle(somSelf));
+}
+
+SOM_Scope BOOL  SOMLINK mmdatafileM_mmclsDeleteFromTypeList(M_MMDataFile *somSelf, 
+                                                            PSZ pszType)
+{
+    /* M_MMDataFileData *somThis = M_MMDataFileGetData(somSelf); */
+    M_MMDataFileMethodDebug("M_MMDataFile","mmdatafileM_mmclsDeleteFromTypeList");
+
+    /* Return statement to be customized: */
+    return;
+}
+
+SOM_Scope BOOL  SOMLINK mmdatafileM_mmclsDeleteFromExtensionList(M_MMDataFile *somSelf, 
+                                                                 PSZ pszExt)
+{
+    /* M_MMDataFileData *somThis = M_MMDataFileGetData(somSelf); */
+    M_MMDataFileMethodDebug("M_MMDataFile","mmdatafileM_mmclsDeleteFromExtensionList");
+
+    /* Return statement to be customized: */
+    return;
+}
+
+SOM_Scope BOOL  SOMLINK mmdatafileM_mmclsInitTypesAndExtensions(M_MMDataFile *somSelf)
+{
+    /* M_MMDataFileData *somThis = M_MMDataFileGetData(somSelf); */
+    M_MMDataFileMethodDebug("M_MMDataFile","mmdatafileM_mmclsInitTypesAndExtensions");
+
+    /* Return statement to be customized: */
+    return;
+}
+
+SOM_Scope BOOL  SOMLINK mmdatafileM_mmclsSetDefaultView(M_MMDataFile *somSelf, 
+                                                        ULONG ulView)
+{
+    /* M_MMDataFileData *somThis = M_MMDataFileGetData(somSelf); */
+    M_MMDataFileMethodDebug("M_MMDataFile","mmdatafileM_mmclsSetDefaultView");
+
+    /* Return statement to be customized: */
+    return;
+}
+
+SOM_Scope PSZ  SOMLINK mmdatafileM_wpclsQueryInstanceType(M_MMDataFile *somSelf)
+{
+    /* M_MMDataFileData *somThis = M_MMDataFileGetData(somSelf); */
+    M_MMDataFileMethodDebug("M_MMDataFile","mmdatafileM_wpclsQueryInstanceType");
+
+    return (M_MMDataFile_parent_M_WPDataFile_wpclsQueryInstanceType(somSelf));
+}
+
+SOM_Scope PSZ  SOMLINK mmdatafileM_wpclsQueryInstanceFilter(M_MMDataFile *somSelf)
+{
+    /* M_MMDataFileData *somThis = M_MMDataFileGetData(somSelf); */
+    M_MMDataFileMethodDebug("M_MMDataFile","mmdatafileM_wpclsQueryInstanceFilter");
+
+    return (M_MMDataFile_parent_M_WPDataFile_wpclsQueryInstanceFilter(somSelf));
+}
+
+SOM_Scope BOOL  SOMLINK mmdatafileM_wpclsCreateDefaultTemplates(M_MMDataFile *somSelf, 
+                                                                WPObject* Folder)
+{
+    /* M_MMDataFileData *somThis = M_MMDataFileGetData(somSelf); */
+    M_MMDataFileMethodDebug("M_MMDataFile","mmdatafileM_wpclsCreateDefaultTemplates");
+
+    return (M_MMDataFile_parent_M_WPDataFile_wpclsCreateDefaultTemplates(somSelf, 
+                                                                         Folder));
+}
+
+SOM_Scope void  SOMLINK mmdatafileM_wpclsInitData(M_MMDataFile *somSelf)
+{
+    /* M_MMDataFileData *somThis = M_MMDataFileGetData(somSelf); */
+    M_MMDataFileMethodDebug("M_MMDataFile","mmdatafileM_wpclsInitData");
+
+    M_MMDataFile_parent_M_WPDataFile_wpclsInitData(somSelf);
+}
+
+SOM_Scope BOOL  SOMLINK mmdatafileM_wpclsQueryDefaultHelp(M_MMDataFile *somSelf, 
+                                                          PULONG pHelpPanelId, 
+                                                          PSZ pszHelpLibrary)
+{
+    /* M_MMDataFileData *somThis = M_MMDataFileGetData(somSelf); */
+    M_MMDataFileMethodDebug("M_MMDataFile","mmdatafileM_wpclsQueryDefaultHelp");
+
+    return (M_MMDataFile_parent_M_WPDataFile_wpclsQueryDefaultHelp(somSelf, 
+                                                                   pHelpPanelId, 
+                                                                   pszHelpLibrary));
+}
+
+SOM_Scope ULONG  SOMLINK mmdatafileM_wpclsQueryDefaultView(M_MMDataFile *somSelf)
+{
+    /* M_MMDataFileData *somThis = M_MMDataFileGetData(somSelf); */
+    M_MMDataFileMethodDebug("M_MMDataFile","mmdatafileM_wpclsQueryDefaultView");
+
+    return (M_MMDataFile_parent_M_WPDataFile_wpclsQueryDefaultView(somSelf));
+}
+
+SOM_Scope ULONG  SOMLINK mmdatafileM_wpclsQueryStyle(M_MMDataFile *somSelf)
+{
+    /* M_MMDataFileData *somThis = M_MMDataFileGetData(somSelf); */
+    M_MMDataFileMethodDebug("M_MMDataFile","mmdatafileM_wpclsQueryStyle");
+
+    return (M_MMDataFile_parent_M_WPDataFile_wpclsQueryStyle(somSelf));
+}
+
+
+SOM_Scope void  SOMLINK mmdatafileM_wpclsUnInitData(M_MMDataFile *somSelf)
+{
+    /* M_MMDataFileData *somThis = M_MMDataFileGetData(somSelf); */
+    M_MMDataFileMethodDebug("M_MMDataFile","mmdatafileM_wpclsUnInitData");
+
+    M_MMDataFile_parent_M_WPDataFile_wpclsUnInitData(somSelf);
+}
+
+SOM_Scope ULONG  SOMLINK mmdatafileM_wpclsQueryIconData(M_MMDataFile *somSelf, 
+                                                        PICONINFO pIconInfo)
+{
+    /* M_MMDataFileData *somThis = M_MMDataFileGetData(somSelf); */
+    M_MMDataFileMethodDebug("M_MMDataFile","mmdatafileM_wpclsQueryIconData");
+
+    return (M_MMDataFile_parent_M_WPDataFile_wpclsQueryIconData(somSelf, 
+                                                                pIconInfo));
+}
+
Index: /tags/CWMM-0.3.0_GA/classes/c/c_audio/mmwav.c
===================================================================
--- /tags/CWMM-0.3.0_GA/classes/c/c_audio/mmwav.c	(revision 213)
+++ /tags/CWMM-0.3.0_GA/classes/c/c_audio/mmwav.c	(revision 213)
@@ -0,0 +1,211 @@
+/*
+ * (C) Chris Wohlgemuth 2002-2004
+ *
+ */
+/*
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; see the file COPYING.  If not, write to
+ * the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
+ */          
+/*
+ * If you need another license for your project/product (commercial,
+ * noncommercial, whatever) contact me at
+ * 
+ * http://www.os2world.com/cdwriting
+ * http://www.geocities.com/SiliconValley/Sector/5785/
+ *
+ */
+/*
+ *  This file was generated by the SOM Compiler and Emitter Framework.
+ *  Generated using: 
+ *      SOM Emitter emitctm: 2.42
+ */
+
+#ifndef SOM_Module_mmwav_Source
+#define SOM_Module_mmwav_Source
+#endif
+#define MMWAV_Class_Source
+#define M_MMWAV_Class_Source
+
+#include <os2.h>
+#include "helpid.h"
+#include "mmwav.ih"
+#include "cwaudioinc.h"
+
+extern char chrHelpLibrary[CCHMAXPATH];
+
+HMODULE queryResModuleHandle(void);
+HMODULE queryModuleHandle(void);
+BOOL getMessage(char* text,ULONG ulID, LONG lSizeText, HMODULE hResource,HWND hwnd);
+void HlpWriteToTrapLog(const char* chrFormat, ...);
+
+/*
+ * SOM_Scope BOOL  SOMLINK mmwav_wpSaveState(CWWAV *somSelf)
+ */
+
+/*
+ * The prototype for mmwav_wpSaveState was replaced by the following prototype:
+ */
+SOM_Scope BOOL  SOMLINK mmwav_wpSaveState(MMWAV *somSelf)
+{
+  char chrBuf[256];
+  ULONG ulLength;
+  BOOL rc;
+
+    /* CWWAVData *somThis = CWWAVGetData(somSelf); */
+    MMWAVMethodDebug("MMWAV","mmwav_wpSaveState");
+
+    /* call parent first. By doing so, the MP3 type is written after the Digital Audio type.
+     This way the default class the WPS picks is MMWAV and not MMAudio. */
+    rc=(MMWAV_parent_MMAudio_wpSaveState(somSelf));
+    return rc;
+    /*!!!!!!!!!!!!!!!!!!!!!!!!!!!*/
+
+    /* Set .TYPE EA so the editor and the player are happy. */
+    strncpy(chrBuf, _wpQueryType(somSelf), sizeof(chrBuf));
+    chrBuf[sizeof(chrBuf)-1]=0;
+
+    //HlpWriteToTrapLog("%x %x %s\n",strstr(chrBuf, TYPE_WAV), chrBuf, chrBuf);
+    if(!strstr(chrBuf, TYPE_WAV) && strlen(chrBuf)) {
+      ulLength=strlen(chrBuf);
+      if(ulLength) {
+        if(ulLength+2+sizeof(TYPE_WAV) < sizeof(chrBuf)) {
+          strcat(chrBuf, "\n");
+          strcat(chrBuf, TYPE_WAV);
+        }
+      }
+      else
+        strcpy(chrBuf, TYPE_WAV);
+      /* Set .TYPE EA so the editor and the player are happy. */
+    }
+    /* Write it to the EA */
+    _wpSetType(somSelf, chrBuf , NULL);
+    return rc;
+}
+
+/*
+ * The prototype for mmwavM_wpclsQueryTitle was replaced by the following prototype:
+ */
+SOM_Scope PSZ  SOMLINK mmwavM_wpclsQueryTitle(M_MMWAV *somSelf)
+{
+  static char chrTitle[20]={0};
+    /* M_MMWAVData *somThis = M_MMWAVGetData(somSelf); */
+  /*    M_MMWAVMethodDebug("M_MMWAV","mmwavM_wpclsQueryTitle");*/
+    M_MMWAVMethodDebug("M_MMWAV","mmwavM_wpclsQueryTitle");
+
+    if(chrTitle[0]==0)
+      if(!getMessage(chrTitle, IDSTR_WAVTITLE, sizeof(chrTitle), queryResModuleHandle(), HWND_DESKTOP))
+        strcpy(chrTitle, CLSTITLE_WAV);
+
+    return chrTitle;
+}
+
+/*
+ * The prototype for mmwavM_wpclsQueryInstanceType was replaced by the following prototype:
+ */
+SOM_Scope PSZ  SOMLINK mmwavM_wpclsQueryInstanceType(M_MMWAV *somSelf)
+{
+    /* M_MMWAVData *somThis = M_MMWAVGetData(somSelf); */
+  /*    M_MMWAVMethodDebug("M_MMWAV","mmwavM_wpclsQueryInstanceType");*/
+    M_MMWAVMethodDebug("M_MMWAV","mmwavM_wpclsQueryInstanceType");
+
+    return TYPE_WAV;
+    //    return "WAV,Digital Audio";
+}
+
+/*
+ * The prototype for mmwavM_wpclsQueryInstanceFilter was replaced by the following prototype:
+ */
+SOM_Scope PSZ  SOMLINK mmwavM_wpclsQueryInstanceFilter(M_MMWAV *somSelf)
+{
+    /* M_MMWAVData *somThis = M_MMWAVGetData(somSelf); */
+    M_MMWAVMethodDebug("M_MMWAV","mmwavM_wpclsQueryInstanceFilter");
+    /*     M_MMWAVMethodDebug("M_MMWAV","mmwavM_wpclsQueryInstanceFilter");*/
+
+    return "*.WAV";
+}
+
+/*
+ * The prototype for mmwavM_wpclsQueryIconData was replaced by the following prototype:
+ */
+SOM_Scope ULONG  SOMLINK mmwavM_wpclsQueryIconData(M_MMWAV *somSelf, 
+                                                   PICONINFO pIconInfo)
+{
+  HMODULE hmod;
+    /* M_MMWAVData *somThis = M_MMWAVGetData(somSelf); */
+  /*    M_MMWAVMethodDebug("M_MMWAV","mmwavM_wpclsQueryIconData");*/
+    M_MMWAVMethodDebug("M_MMWAV","mmwavM_wpclsQueryIconData");
+
+    hmod=queryModuleHandle();
+    if(!hmod)
+      return M_MMWAV_parent_M_MMAudio_wpclsQueryIconData(somSelf, pIconInfo);
+
+	if (pIconInfo)   {
+      pIconInfo->fFormat = ICON_RESOURCE;
+      pIconInfo->hmod    = hmod;
+      pIconInfo->resid   = ID_ICONWAVFILE;
+	} /* endif */
+    
+	return ( sizeof(ICONINFO) );
+}
+
+/*
+ * The prototype for mmwavM_wpclsQueryDefaultHelp was replaced by the following prototype:
+ */
+SOM_Scope BOOL  SOMLINK mmwavM_wpclsQueryDefaultHelp(M_MMWAV *somSelf, 
+                                                     PULONG pHelpPanelId, 
+                                                     PSZ pszHelpLibrary)
+{
+    /* M_MMWAVData *somThis = M_MMWAVGetData(somSelf); */
+  /*    M_MMWAVMethodDebug("M_MMWAV","mmwavM_wpclsQueryDefaultHelp");*/
+    M_MMWAVMethodDebug("M_MMWAV","mmwavM_wpclsQueryDefaultHelp");
+
+    if(pHelpPanelId)
+      *pHelpPanelId=WAVFILE_HELP_PANEL;
+    if(pszHelpLibrary)
+      strncpy(pszHelpLibrary, chrHelpLibrary, CCHMAXPATH);
+    return TRUE; 
+}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Index: /tags/CWMM-0.3.0_GA/classes/c/c_common/cd.c
===================================================================
--- /tags/CWMM-0.3.0_GA/classes/c/c_common/cd.c	(revision 213)
+++ /tags/CWMM-0.3.0_GA/classes/c/c_common/cd.c	(revision 213)
@@ -0,0 +1,180 @@
+/*
+ * (C) Chris Wohlgemuth 2002-2003
+ *
+ */
+/*
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; see the file COPYING.  If not, write to
+ * the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+/*
+ * If you need another license for your project/product contact me at
+ * 
+ * http://www.os2world.com/cdwriting
+ * http://www.geocities.com/SiliconValley/Sector/5785/
+ */
+
+#define INCL_DOSDEVIOCTL
+#define INCL_DOS
+#include <os2.h>
+
+/**************************************************************/
+/*                                                            */
+/* This funktion returns the CD-Drives in the system          */
+/*                                                            */
+/* iNumCD (output): # of CD-Drives                            */
+/* iFirstDrive (output): first cd-Drive                       */
+/* returns TRUE: We have cd-drives                            */
+/*                                                            */
+/**************************************************************/
+BOOL cwQueryCDDrives(int *iNumCD, int * iFirstDrive)
+{
+  HFILE hfDevice;
+  ULONG ulAction;
+  ULONG ulLen;
+  static int iFirst=0;
+  static int iNumCDLocal=0;
+  static BOOL haveCD=FALSE;
+  static BOOL done=FALSE;         
+  struct
+  {
+    USHORT usCountCD;
+    USHORT usFirstCD;
+  } CDInfo;
+
+  if(!done){
+    ulLen = sizeof(CDInfo);
+    if(!DosOpen("\\DEV\\CD-ROM2$", &hfDevice, &ulAction, 0,
+                FILE_NORMAL, OPEN_ACTION_OPEN_IF_EXISTS,
+                OPEN_SHARE_DENYNONE | OPEN_ACCESS_READONLY, NULL))
+      {
+        if(!DosDevIOCtl(hfDevice, 0x82, 0x60, NULL, 0, NULL, &CDInfo, ulLen, &ulLen))
+          {
+            if(CDInfo.usCountCD) {
+              haveCD=TRUE;
+              iNumCDLocal=CDInfo.usCountCD;
+              iFirst=1+CDInfo.usFirstCD;
+            }                                        
+          }
+        DosClose(hfDevice);
+      }
+    done=TRUE;
+  }
+  *iNumCD=iNumCDLocal;
+  *iFirstDrive=iFirst;
+  return haveCD;              
+}
+
+/****************************************/
+/* Input: drive (e.g. o:)               */
+/****************************************/
+HFILE openDrive(char* drive)
+{
+	HFILE hfDrive = 0;
+	ULONG ulAction;
+	ULONG rc;
+
+	rc = DosOpen(drive, &hfDrive, &ulAction, 0,
+					 FILE_NORMAL, OPEN_ACTION_OPEN_IF_EXISTS,
+					 OPEN_SHARE_DENYNONE | OPEN_ACCESS_READONLY |
+					 OPEN_FLAGS_DASD|OPEN_FLAGS_FAIL_ON_ERROR, NULL);	
+
+	if(rc)
+		return NULLHANDLE;//Error
+
+	return hfDrive;
+}
+
+void closeDrive(HFILE hfDrive)
+{
+	DosClose(hfDrive);	
+}
+
+#pragma pack(1)
+
+typedef struct{
+	UCHAR   ucFirstTrack;
+	UCHAR 	ucLastTrack;
+	ULONG   ulLeadOut;
+}CDINFO;
+
+typedef struct
+{
+	UCHAR signature[4];
+	UCHAR  ucTrackNum;
+}TINFOPARAM;
+
+typedef struct
+{
+	ULONG ulTrackAddress;
+	UCHAR ucTCInfo;
+}CDTRACKINFO;
+
+#pragma pack()
+
+/******************************************/
+/* Result:  
+	 0:   Error
+	 -1: CD is Data Disk
+	 other: # Audio tracks */
+/******************************************/
+int CDQueryAudioCDTracks(HFILE hfDrive)
+{
+	ULONG ulParamLen;
+	ULONG ulDataLen;
+	ULONG rc;
+	CDINFO cdInfo;
+	TINFOPARAM tip;
+	CDTRACKINFO trackInfo;
+    //char text[100];	
+
+	ulDataLen=sizeof(cdInfo);
+	ulParamLen=4;
+		
+	if(!hfDrive)
+		return 0;
+	
+	rc = DosDevIOCtl(hfDrive, IOCTL_CDROMAUDIO, CDROMAUDIO_GETAUDIODISK,
+						  "CD01", 4, &ulParamLen, &cdInfo,
+						  sizeof(cdInfo), &ulDataLen);
+
+	if(rc) {
+		return 0;//Error
+	}
+
+	ulDataLen=sizeof(trackInfo);
+	ulParamLen=sizeof(TINFOPARAM);
+	tip.signature[0]='C';
+	tip.signature[1]='D';	
+	tip.signature[2]='0';
+	tip.signature[3]='1';
+	tip.ucTrackNum=1;
+	
+	/* We have a disc. Check if it's audio */
+	rc = DosDevIOCtl(hfDrive, IOCTL_CDROMAUDIO, CDROMAUDIO_GETAUDIOTRACK,
+						  &tip, sizeof(tip), &ulParamLen, &trackInfo,
+						  sizeof(trackInfo), &ulDataLen);
+
+	if(rc) {
+		return 0;//Error
+	}
+		
+	if(trackInfo.ucTCInfo & 0x40) {
+		return -1;//It's a data track
+	}
+    return cdInfo.ucLastTrack-cdInfo.ucFirstTrack+1;	
+}
+
+
+
+
Index: /tags/CWMM-0.3.0_GA/classes/c/c_common/except.c
===================================================================
--- /tags/CWMM-0.3.0_GA/classes/c/c_common/except.c	(revision 213)
+++ /tags/CWMM-0.3.0_GA/classes/c/c_common/except.c	(revision 213)
@@ -0,0 +1,2089 @@
+/**********************************************************************/
+/*                                                                    */
+/*  EXCEPTQ                                                           */
+/*                                                                    */
+/* DLL containing an exception handler for gathering trap information */
+/* This DLL dumps all important debugging Data and is accessible      */
+/* from both 16 bit and 32 bits programs                              */
+/**********************************************************************/
+/* Version: 2.2             |   Marc Fiammante (FIAMMANT at LGEPROFS) */
+/*                          |   La Gaude FRANCE                       */
+/*                          |   Internet: fiammante@vnet.ibm.com      */
+/* Version: 5.0             |   John Currier  (JCURRIER at CLTVM1)    */
+/*                          |   Internet: currier@vnet.ibm.com        */
+/* Version: 6.0             |   Kim Rasmussen (krasmus@ibm.net)       */
+/*                          |   Denmark                               */
+/* Version: 6.1             |   Anthony Cruise (CRUISE at YKTVMH)     */
+/*                          |   Watson Research                       */
+/* Version: 6.2             |   John Currier  (JCURRIER at CLTVM1)    */
+/*                          |   Internet: currier@vnet.ibm.com        */
+/* Version: 6.3             |   Kim Rasmussen (kr@belle.dk)           */
+/*                          |   Denmark                               */
+/*                          |   Marc Fiammante (FIAMMANT at LGEPROFS) */
+/*                          |   La Gaude FRANCE                       */
+/*                          |   Internet: fiammante@vnet.ibm.com      */
+/* Version: 6.4             |   Kim Rasmussen (kr@belle.dk)           */
+/*                          |   Denmark - http://www.belle.dk/kr/     */
+/**********************************************************************/
+/*                                                                    */
+/**********************************************************************/
+/* History:                                                           */
+/* --------                                                           */
+/*                                                                    */
+/* created: Marc Fiammante December 1992                              */
+/* changed: John Currier   August   1994                              */
+/* changed: Kim Rasmussen, May 1995                                   */
+/*    Dump of auto-variables added (32-bit only)                      */
+/* changed: Anthony Cruise, May 1995                                  */
+/*    Do not dump duplicate lines  (32-bit only)                      */
+/* fixed  : Marc Fiammante thanks to Bill Siddall                     */
+/*    Dump of auto-variables wrong values                             */
+/* fixed  : John Currier fix stack thunk on non fatal exceptions      */
+/*         fixed DosQueryMem Size test on return                      */
+/* fixed  : Marc Fiammante find stack bottom from top to bottom       */
+/*         avoid traps on disassemble.                                */
+/* changed: Support for VisualAge C added (new debug format)          */
+/*                                                                    */
+/**********************************************************************/
+/**********************************************************************/
+/*                                                                    */
+/* Modified by Chris Wohlgemuth 2002 for use with Audio/Data-CD-      */
+/* Creator.                                                           */
+/*                                                                    */
+/**********************************************************************/
+#define INCL_BASE
+#define INCL_TYPES
+#define INCL_DOSEXCEPTIONS
+#define INCL_DOSSEMAPHORES   /* Semaphore values */
+
+#include <os2.h>
+
+#include <ctype.h>
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+#include <time.h>
+#include "sym.h"
+#include "omf.h"
+
+#ifndef DWORD
+#define DWORD unsigned long
+#endif
+#ifndef WORD
+#define WORD  unsigned short
+#endif
+#pragma stack16(512)
+#define HF_STDERR 2
+CHAR *ProcessName = "DEBUGGEE.EXE";
+FILE   *hTrap;
+static BOOL   f32bit = TRUE;
+struct debug_buffer
+ {
+   ULONG   Pid;        /* Debuggee Process ID */
+   ULONG   Tid;        /* Debuggee Thread ID */
+   LONG    Cmd;        /* Command or Notification */
+   LONG    Value;      /* Generic Data Value */
+   ULONG   Addr;       /* Debuggee Address */
+   ULONG   Buffer;     /* Debugger Buffer Address */
+   ULONG   Len;        /* Length of Range */
+   ULONG   Index;      /* Generic Identifier Index */
+   ULONG   MTE;        /* Module Handle */
+   ULONG   EAX;        /* Register Set */
+   ULONG   ECX;
+   ULONG   EDX;
+   ULONG   EBX;
+   ULONG   ESP;
+   ULONG   EBP;
+   ULONG   ESI;
+   ULONG   EDI;
+   ULONG   EFlags;
+   ULONG   EIP;
+   ULONG   CSLim;      /* Byte Granular Limits */
+   ULONG   CSBase;     /* Byte Granular Base */
+   UCHAR   CSAcc;      /* Access Bytes */
+   UCHAR   CSAtr;      /* Attribute Bytes */
+   USHORT  CS;
+   ULONG   DSLim;
+   ULONG   DSBase;
+   UCHAR   DSAcc;
+   UCHAR   DSAtr;
+   USHORT  DS;
+   ULONG   ESLim;
+   ULONG   ESBase;
+   UCHAR   ESAcc;
+   UCHAR   ESAtr;
+   USHORT  ES;
+   ULONG   FSLim;
+   ULONG   FSBase;
+   UCHAR   FSAcc;
+   UCHAR   FSAtr;
+   USHORT  FS;
+   ULONG   GSLim;
+   ULONG   GSBase;
+   UCHAR   GSAcc;
+   UCHAR   GSAtr;
+   USHORT  GS;
+   ULONG   SSLim;
+   ULONG   SSBase;
+   UCHAR   SSAcc;
+   UCHAR   SSAtr;
+   USHORT  SS;
+} DbgBuf;
+
+/* CW
+#define DBG_O_OBJMTE       0x10000000L*/
+#define DBG_C_NumToAddr            13
+#define DBG_C_AddrToObject         28
+#define DBG_C_Connect              21
+#define DBG_L_386                   1
+RESULTCODES ReturnCodes;
+UCHAR   LoadError[40]; /*DosExecPGM buffer */
+USHORT Passes;
+UCHAR   Translate[17];
+UCHAR   OldStuff[16];
+
+#ifdef USE_DOSDEBUG
+void    GetObjects(struct debug_buffer * pDbgBuf,HMODULE hMte,PSZ pName);
+#endif
+
+VOID    ListModules(VOID);
+void    CheckMem(PVOID Ptr,PSZ MemoryName);
+/* Better New WalkStack From John Currier */
+static void WalkStack(PUSHORT StackBottom,PUSHORT StackTop,PUSHORT Ebp,PUSHORT ExceptionAddress);
+int    Read16CodeView(int fh,int TrapSeg,int TrapOff,CHAR * FileName);
+int    Read32PmDebug(int fh,int TrapSeg,int TrapOff,CHAR * FileName);
+APIRET GetLineNum(CHAR * FileName, ULONG Object,ULONG TrapOffset);
+void GetSymbol(CHAR * SymFileName, ULONG Object,ULONG TrapOffset);
+void print_vars(ULONG stackofs);
+
+ULONG func_ofs;
+ULONG pubfunc_ofs;
+char  func_name[128];
+ULONG var_ofs = 0;
+
+struct {
+   BYTE name[128];
+   ULONG stack_offset;
+   USHORT type_idx;
+} autovar_def[100];
+
+HMODULE hMod;
+ULONG   ObjNum;
+ULONG   Offset;
+
+/*-------------------------------------*/
+CHAR    Buffer[CCHMAXPATH];
+
+typedef ULONG     * _Seg16 PULONG16;
+APIRET16 APIENTRY16 DOS16SIZESEG( USHORT Seg , PULONG16 Size);
+typedef  APIRET16  (APIENTRY16  _PFN16)();
+ULONG  APIENTRY DosSelToFlat(ULONG);
+/*-------------------------------------*/
+
+/*- DosQProcStatus interface ----------*/
+APIRET16 APIENTRY16 DOSQPROCSTATUS(  ULONG * _Seg16 pBuf, USHORT cbBuf);
+#define CONVERT(fp,QSsel) MAKEP((QSsel),OFFSETOF(fp))
+#pragma pack(1)
+/*  Global Data Section */
+typedef struct qsGrec_s {
+    ULONG     cThrds;  /* number of threads in use */
+    ULONG     Reserved1;
+    ULONG     Reserved2;
+}qsGrec_t;
+
+#define PADSHORT        USHORT        pad_sh
+#define PADCHAR         UCHAR         pad_ch
+
+/* Thread Record structure *   Holds all per thread information. */
+typedef struct qsTrec_s {
+    ULONG     RecType;    /* Record Type */
+                          /* Thread rectype = 100 */
+    USHORT    tid;        /* thread ID */
+    USHORT    slot;       /* "unique" thread slot number */
+    ULONG     sleepid;    /* sleep id thread is sleeping on */
+    ULONG     priority;   /* thread priority */
+    ULONG     systime;    /* thread system time */
+    ULONG     usertime;   /* thread user time */
+    UCHAR     state;      /* thread state */
+    PADCHAR;
+    PADSHORT;
+} qsTrec_t;
+
+/* Process and Thread Data Section */
+typedef struct qsPrec_s {
+    ULONG           RecType;    /* type of record being processed */
+                          /* process rectype = 1       */
+    qsTrec_t *      pThrdRec;  /* ptr to 1st thread rec for this prc*/
+    USHORT          pid;       /* process ID */
+    USHORT          ppid;      /* parent process ID */
+    ULONG           type;      /* process type */
+    ULONG           stat;      /* process status */
+    ULONG           sgid;      /* process screen group */
+    USHORT          hMte;      /* program module handle for process */
+    USHORT          cTCB;      /* # of TCBs in use in process */
+    ULONG           Reserved1;
+    void   *        Reserved2;
+    USHORT          c16Sem;     /*# of 16 bit system sems in use by proc*/
+    USHORT          cLib;       /* number of runtime linked libraries */
+    USHORT          cShrMem;    /* number of shared memory handles */
+    USHORT          Reserved3;
+    USHORT *        p16SemRec;   /*ptr to head of 16 bit sem inf for proc*/
+    USHORT *        pLibRec;     /*ptr to list of runtime lib in use by */
+                                  /*process*/
+    USHORT *        pShrMemRec;  /*ptr to list of shared mem handles in */
+                                  /*use by process*/
+    USHORT *        Reserved4;
+} qsPrec_t;
+
+/* 16 Bit System Semaphore Section */
+typedef struct qsS16Headrec_s {
+    ULONG     RecType;   /* semaphore rectype = 3 */
+    ULONG     Reserved1;  /* overlays NextRec of 1st qsS16rec_t */
+    ULONG     Reserved2;
+    ULONG     S16TblOff;  /* index of first semaphore,SEE PSTAT OUTPUT*/
+                          /* System Semaphore Information Section     */
+} qsS16Headrec_t;
+/*  16 bit System Semaphore Header Record Structure */
+typedef struct qsS16rec_s {
+    ULONG      NextRec;          /* offset to next record in buffer */
+    UINT       s_SysSemOwner ;   /* thread owning this semaphore    */
+    UCHAR      s_SysSemFlag ;    /* system semaphore flag bit field */
+    UCHAR      s_SysSemRefCnt ;  /* number of references to this    */
+                                 /*  system semaphore               */
+    UCHAR      s_SysSemProcCnt ; /*number of requests by sem owner  */
+    UCHAR      Reserved1;
+    ULONG      Reserved2;
+    UINT       Reserved3;
+    CHAR       SemName[1];       /* start of semaphore name string */
+} qsS16rec_t;
+
+/*  Executable Module Section */
+typedef struct qsLrec_s {
+    void        * pNextRec;    /* pointer to next record in buffer */
+    USHORT        hmte;         /* handle for this mte */
+    USHORT        Reserved1;    /* Reserved */
+    ULONG         ctImpMod;     /* # of imported modules in table */
+    ULONG         Reserved2;    /* Reserved */
+/*  qsLObjrec_t * Reserved3;       Reserved */
+    ULONG       * Reserved3;    /* Reserved */
+    UCHAR       * pName;        /* ptr to name string following stru*/
+} qsLrec_t;
+
+/*  Shared Memory Segment Section */
+typedef struct qsMrec_s {
+    struct qsMrec_s *MemNextRec;    /* offset to next record in buffer */
+    USHORT    hmem;          /* handle for shared memory */
+    USHORT    sel;           /* shared memory selector */
+    USHORT    refcnt;        /* reference count */
+    CHAR      Memname[1];    /* start of shared memory name string */
+} qsMrec_t;
+
+/*  Pointer Record Section */
+typedef struct qsPtrRec_s {
+    qsGrec_t       *  pGlobalRec;        /* ptr to the global data section */
+    qsPrec_t       *  pProcRec;          /* ptr to process record section  */
+    qsS16Headrec_t *  p16SemRec;         /* ptr to 16 bit sem section      */
+    void           *  Reserved;          /* a reserved area                */
+    qsMrec_t       *  pShrMemRec;        /* ptr to shared mem section      */
+    qsLrec_t       *  pLibRec;           /*ptr to exe module record section*/
+} qsPtrRec_t;
+
+/*-------------------------*/
+ULONG * pBuf,*pTemp;
+USHORT  Selector;
+qsPtrRec_t * pRec;
+qsLrec_t   * pLib;
+qsMrec_t   * pShrMemRec;        /* ptr to shared mem section      */
+qsPrec_t   * pProc;
+qsTrec_t   * pThread;
+ULONG      ListedThreads=0;
+APIRET16 APIENTRY16 DOS16ALLOCSEG(
+        USHORT          cbSize,          /* number of bytes requested                   */
+        USHORT  * _Seg16 pSel,           /* sector allocated (returned)                 */
+        USHORT fsAlloc);                 /* sharing attributes of the allocated segment */
+
+typedef struct
+  {
+    short int      ilen;     /* Instruction length */
+    long           rref;     /* Value of any IP relative storage reference */
+    unsigned short sel;      /* Selector of any CS:eIP storage reference.   */
+    long           poff;     /* eIP value of any CS:eIP storage reference. */
+    char           longoper; /* YES/NO value. Is instr in 32 bit operand mode? **/
+    char           longaddr; /* YES/NO value. Is instr in 32 bit address mode? **/
+    char           buf[40];  /* String holding disassembled instruction **/
+  } * _Seg16 RETURN_FROM_DISASM;
+
+RETURN_FROM_DISASM CDECL16 DISASM( CHAR * _Seg16 Source, USHORT IPvalue,USHORT segsize );
+RETURN_FROM_DISASM AsmLine;
+
+char *SourceBuffer=0;
+static USHORT BigSeg;
+static ULONG  Version[2];
+
+BYTE *type_name[] = {
+   "8 bit signed                     ",
+   "16 bit signed                    ",
+   "32 bit signed                    ",
+   "Unknown (0x83)                   ",
+   "8 bit unsigned                   ",
+   "16 bit unsigned                  ",
+   "32 bit unsigned                  ",
+   "Unknown (0x87)                   ",
+   "32 bit real                      ",
+   "64 bit real                      ",
+   "80 bit real                      ",
+   "Unknown (0x8B)                   ",
+   "64 bit complex                   ",
+   "128 bit complex                  ",
+   "160 bit complex                  ",
+   "Unknown (0x8F)                   ",
+   "8 bit boolean                    ",
+   "16 bit boolean                   ",
+   "32 bit boolean                   ",
+   "Unknown (0x93)                   ",
+   "8 bit character                  ",
+   "16 bit characters                ",
+   "32 bit characters                ",
+   "void                             ",
+   "15 bit unsigned                  ",
+   "24 bit unsigned                  ",
+   "31 bit unsigned                  ",
+   "Unknown (0x9B)                   ",
+   "Unknown (0x9C)                   ",
+   "Unknown (0x9D)                   ",
+   "Unknown (0x9E)                   ",
+   "Unknown (0x9F)                   ",
+   "near pointer to 8 bit signed     ",
+   "near pointer to 16 bit signed    ",
+   "near pointer to 32 bit signed    ",
+   "Unknown (0xA3)                   ",
+   "near pointer to 8 bit unsigned   ",
+   "near pointer to 16 bit unsigned  ",
+   "near pointer to 32 bit unsigned  ",
+   "Unknown (0xA7)                   ",
+   "near pointer to 32 bit real      ",
+   "near pointer to 64 bit real      ",
+   "near pointer to 80 bit real      ",
+   "Unknown (0xAB)                   ",
+   "near pointer to 64 bit complex   ",
+   "near pointer to 128 bit complex  ",
+   "near pointer to 160 bit complex  ",
+   "Unknown (0xAF)                   ",
+   "near pointer to 8 bit boolean    ",
+   "near pointer to 16 bit boolean   ",
+   "near pointer to 32 bit boolean   ",
+   "Unknown (0xB3)                   ",
+   "near pointer to 8 bit character  ",
+   "near pointer to 16 bit characters",
+   "near pointer to 32 bit characters",
+   "near pointer to void             ",
+   "near pointer to 15 bit unsigned  ",
+   "near pointer to 24 bit unsigned  ",
+   "near pointer to 31 bit unsigned  ",
+   "Unknown (0xBB)                   ",
+   "Unknown (0xBC)                   ",
+   "Unknown (0xBD)                   ",
+   "Unknown (0xBE)                   ",
+   "Unknown (0xBF)                   ",
+   "far pointer to 8 bit signed      ",
+   "far pointer to 16 bit signed     ",
+   "far pointer to 32 bit signed     ",
+   "Unknown (0xC3)                   ",
+   "far pointer to 8 bit unsigned    ",
+   "far pointer to 16 bit unsigned   ",
+   "far pointer to 32 bit unsigned   ",
+   "Unknown (0xC7)                   ",
+   "far pointer to 32 bit real       ",
+   "far pointer to 64 bit real       ",
+   "far pointer to 80 bit real       ",
+   "Unknown (0xCB)                   ",
+   "far pointer to 64 bit complex    ",
+   "far pointer to 128 bit complex   ",
+   "far pointer to 160 bit complex   ",
+   "Unknown (0xCF)                   ",
+   "far pointer to 8 bit boolean     ",
+   "far pointer to 16 bit boolean    ",
+   "far pointer to 32 bit boolean    ",
+   "Unknown (0xD3)                   ",
+   "far pointer to 8 bit character   ",
+   "far pointer to 16 bit characters ",
+   "far pointer to 32 bit characters ",
+   "far pointer to void              ",
+   "far pointer to 15 bit unsigned   ",
+   "far pointer to 24 bit unsigned   ",
+   "far pointer to 31 bit unsigned   ",
+};
+
+/*--                                 --*/
+/*-------------------------------------*/
+
+typedef  _PFN16 * _Seg16 PFN16;
+/*--                                 --*/
+static BOOL InForceExit =FALSE;
+
+/*-------------------------------------*/
+ULONG APIENTRY HandleFatalException (PEXCEPTIONREPORTRECORD       pERepRec,
+                          PEXCEPTIONREGISTRATIONRECORD pERegRec,
+                          PCONTEXTRECORD               pCtxRec,
+                          PVOID                        p);
+
+// Thanks to John Currier :
+// Do not call 16 bit code in myHandler function to prevent call
+// to __EDCThunkProlog and problems is guard page exception handling
+// Also reduce the stack size to 1K for true 16 bit calls.
+// 16 bit calls thunk will now only occur on fatal exceptions
+#pragma stack16(1024)
+
+#include "except.h"
+
+static char _GetBootDriveLetter(void)
+{
+  ULONG ulSysValue;
+
+  if(!DosQuerySysInfo(QSV_BOOT_DRIVE, QSV_BOOT_DRIVE,&ulSysValue,sizeof(ulSysValue)))
+    return 'a'+ulSysValue-1;
+
+  return 'c';
+}
+
+ULONG _System excHandler(PEXCEPTIONREPORTRECORD pERepRec,
+                         PLOCALEXCEPTSTRUCT pRegRec2,
+                         //          PREGREC2 pRegRec2,
+                                     PCONTEXTRECORD pCtxRec,
+                                     PVOID pv)
+{
+  ULONG rc = XCPT_CONTINUE_SEARCH;
+#if 0
+  CHAR  TrapFile[CCHMAXPATH];
+  CHAR  *LogPath;
+#endif
+  if (pERepRec->fHandlerFlags & EH_EXIT_UNWIND)
+    return (XCPT_CONTINUE_SEARCH);
+  if (pERepRec->fHandlerFlags & EH_UNWINDING)
+    return (XCPT_CONTINUE_SEARCH);
+  if (pERepRec->fHandlerFlags & EH_NESTED_CALL)
+    return (XCPT_CONTINUE_SEARCH);
+
+#if 0
+  LogPath = getenv( "LOGFILES" );
+  if (!LogPath)
+      sprintf(TrapFile,"%c:\\%s",_GetBootDriveLetter(), EXCEPTION_LOGFILE_NAME);
+  else
+      sprintf(TrapFile,"%s\\%s",LogPath, EXCEPTION_LOGFILE_NAME);
+  hTrap=fopen(TrapFile,"a");
+  fprintf(hTrap,"fHandlerFlags: %x, ExceptionNum: %x\n",pERepRec->fHandlerFlags, pERepRec->ExceptionNum);
+  fclose(hTrap);
+#endif
+  if ((pERepRec->ExceptionNum & XCPT_SEVERITY_CODE) == XCPT_FATAL_EXCEPTION)
+    {
+      DosBeep(5000,30);
+      DosBeep(4000,30);
+      DosBeep(3000,30);
+      DosBeep(4000,30);
+      DosBeep(5000,30);
+
+      if (pERepRec->ExceptionNum != XCPT_PROCESS_TERMINATE &&
+          pERepRec->ExceptionNum != XCPT_UNWIND &&
+          pERepRec->ExceptionNum != XCPT_SIGNAL &&
+          pERepRec->ExceptionNum != XCPT_BREAKPOINT &&
+          pERepRec->ExceptionNum != XCPT_SINGLE_STEP &&
+          pERepRec->ExceptionNum != XCPT_ASYNC_PROCESS_TERMINATE)
+        {
+          // If any of the above conditionals fail then we have to handle
+          //    the fatal trap.
+          rc = HandleFatalException(pERepRec, (PEXCEPTIONREGISTRATIONRECORD) pRegRec2, pCtxRec, pv);
+          longjmp(pRegRec2->jmpThread, pERepRec->ExceptionNum);
+          //     longjmp(pERegRec->jmpThread, pERepRec->ExceptionNum);
+        }
+    }
+  return rc;
+}
+#if 0
+ULONG APIENTRY myHandler (PEXCEPTIONREPORTRECORD       pERepRec,
+                          PEXCEPTIONREGISTRATIONRECORD pERegRec,
+                          PCONTEXTRECORD               pCtxRec,
+                          PVOID                        p)
+{
+  ULONG rc = XCPT_CONTINUE_SEARCH;
+
+  if (pERepRec->fHandlerFlags & EH_EXIT_UNWIND)
+    return (XCPT_CONTINUE_SEARCH);
+  if (pERepRec->fHandlerFlags & EH_UNWINDING)
+    return (XCPT_CONTINUE_SEARCH);
+  if (pERepRec->fHandlerFlags & EH_NESTED_CALL)
+    return (XCPT_CONTINUE_SEARCH);
+
+  if ((pERepRec->ExceptionNum & XCPT_SEVERITY_CODE) == XCPT_FATAL_EXCEPTION)
+    {
+      if (pERepRec->ExceptionNum != XCPT_PROCESS_TERMINATE &&
+          pERepRec->ExceptionNum != XCPT_UNWIND &&
+          pERepRec->ExceptionNum != XCPT_SIGNAL &&
+          pERepRec->ExceptionNum != XCPT_BREAKPOINT &&
+          pERepRec->ExceptionNum != XCPT_SINGLE_STEP &&
+          pERepRec->ExceptionNum != XCPT_ASYNC_PROCESS_TERMINATE)
+        {
+          // If any of the above conditionals fail then we have to handle
+          //    the fatal trap.
+          rc = HandleFatalException(pERepRec, pERegRec, pCtxRec, p);
+          longjmp(pERegRec->jmpThread, pERepRec->ExceptionNum);
+        }
+    }
+  return rc;
+}
+#endif
+
+
+ULONG APIENTRY HandleFatalException (PEXCEPTIONREPORTRECORD       pERepRec,
+                          PEXCEPTIONREGISTRATIONRECORD pERegRec,
+                          PCONTEXTRECORD               pCtxRec,
+                          PVOID                        p)
+{
+  PCHAR   SegPtr;
+  PUSHORT StackPtr;
+  PUSHORT ValidStackBottom;
+  PUCHAR  TestStackBottom;
+  PUCHAR  cStackPtr;
+  ULONG Size,Flags,Attr,CSSize;
+  APIRET rc;
+  APIRET semrc;
+  APIRET16 rc16;
+  PTIB   ptib;
+  PPIB   ppib;
+  USHORT Count;
+  ULONG  Nest;
+  CHAR  TrapFile[CCHMAXPATH];
+  CHAR  *LogPath;
+  struct debug_buffer DbgBuf;
+  static CHAR Name[CCHMAXPATH];
+
+  /* Do not recurse into Trapper (John Currier) */
+  /* Not necessary anymore because nested calls are catched now CW */
+  static BOOL fAlreadyTrapped = FALSE;
+
+
+  if (InForceExit) {
+      return (XCPT_CONTINUE_SEARCH);
+  } /* endif */
+
+  if ((pERepRec->ExceptionNum&XCPT_SEVERITY_CODE)==XCPT_FATAL_EXCEPTION)
+  {
+
+    if ((pERepRec->ExceptionNum!=XCPT_PROCESS_TERMINATE)&&
+        (pERepRec->ExceptionNum!=XCPT_UNWIND)&&
+        (pERepRec->ExceptionNum!=XCPT_SIGNAL)&&
+        (pERepRec->ExceptionNum!=XCPT_ASYNC_PROCESS_TERMINATE)) {
+        DosEnterMustComplete(&Nest);
+
+        LogPath = getenv( "LOGFILES" );
+        if (!LogPath)
+            sprintf(TrapFile,"%c:\\%s",_GetBootDriveLetter(), EXCEPTION_LOGFILE_NAME);
+        else
+            sprintf(TrapFile,"%s\\%s",LogPath, EXCEPTION_LOGFILE_NAME);
+
+        hTrap=fopen(TrapFile,"a");
+        if (hTrap==NULL)
+           hTrap=stdout;
+
+        // rc=DosError(FERR_DISABLEEXCEPTION | FERR_DISABLEHARDERR );
+
+        setbuf( hTrap, NULL);/* Unbuffered stream */
+        /*        fprintf(hTrap,"A trap occurred in Audio/Data-CD-Creator\n");*/
+        fprintf(hTrap,"----------------------------------------\n\n");
+        fprintf(hTrap,"Exception %8.8lX Occurred",pERepRec->ExceptionNum);
+        fprintf(hTrap," at %s ",_strtime(Buffer));
+        fprintf(hTrap," %s\n\n",_strdate(Buffer));
+        if ( pERepRec->ExceptionNum     ==         XCPT_ACCESS_VIOLATION)
+          {
+            switch (pERepRec->ExceptionInfo[0]) {
+            case XCPT_READ_ACCESS:
+              fprintf(hTrap,"Invalid read address %8.8lX\n",pERepRec->ExceptionInfo[1]);
+              break;
+            case XCPT_WRITE_ACCESS:
+              fprintf(hTrap,"Invalid write address %8.8lX\n",pERepRec->ExceptionInfo[1]);
+              break;
+            case XCPT_SPACE_ACCESS:
+              /* Thanks to John Currier              */
+              /* It looks like this is off by one... */
+              fprintf(hTrap,"Invalid Selector: %8.8p",
+                      pERepRec->ExceptionInfo[1] ?
+                      pERepRec->ExceptionInfo[1] + 1 : 0);
+              break;
+            case XCPT_LIMIT_ACCESS:
+              fprintf(hTrap,"Limit access fault\n");
+              break;
+            case XCPT_UNKNOWN_ACCESS:
+              fprintf(hTrap,"Unknown access fault\n");
+              break;
+              break;
+            default:
+              fprintf(hTrap,"Other Unknown access fault\n");
+            } /* endswitch */
+          } /* endif XCPT_ACCESS_VIOLATION */
+        else if( pERepRec->ExceptionNum     ==         XCPT_INTEGER_DIVIDE_BY_ZERO)
+          {
+            fprintf(hTrap,"Division by zero.\n");
+          }
+        else if( pERepRec->ExceptionNum     ==         XCPT_ILLEGAL_INSTRUCTION)
+          {
+            fprintf(hTrap,"Illegal instruction.\n");
+          }
+        else if( pERepRec->ExceptionNum     ==         XCPT_PRIVILEGED_INSTRUCTION)
+          {
+            fprintf(hTrap,"Privileged instruction.\n");
+          }
+        else if( pERepRec->ExceptionNum     ==         XCPT_INTEGER_OVERFLOW)
+          {
+              fprintf(hTrap,"Integer overflow.\n");
+          }
+
+        /* John Currier's recursion prevention */
+        fprintf(hTrap,"\n\n");
+#if 0   /* Not necessary anymore because nested calls are catched now CW */
+        if (fAlreadyTrapped)
+          {
+            fprintf(hTrap, "Exception Handler Trapped...aborting evaluation!\n");
+            if (hTrap != stderr)
+              fclose(hTrap);
+            DosExitMustComplete(&Nest);
+
+            /*   DosUnsetExceptionHandler(pERegRec); */
+            return (XCPT_CONTINUE_SEARCH);
+          }
+#endif
+
+        fAlreadyTrapped = TRUE;
+        /* end  John Currier's recursion prevention */
+        rc = DosQuerySysInfo(QSV_VERSION_MAJOR,QSV_VERSION_MINOR,
+                             Version,sizeof(Version));
+        if ((rc==0)&&
+            (Version[0]>=20) &&
+            (Version[1]>=10) ) {
+          /* version must be over 2.1 for DosQueryModFromEIP */
+          fprintf(hTrap,"OS/2 Version %d.%d\n",Version[0]/10,Version[1]);
+          rc=DosQueryModFromEIP( &hMod, &ObjNum, CCHMAXPATH,
+                                 Name, &Offset, (ULONG) pERepRec->ExceptionAddress);
+            if (rc==0) {
+              fprintf(hTrap,"Failing code module internal name : %s\n",Name);
+              rc=DosQueryModuleName(hMod,CCHMAXPATH, Name);
+              fprintf(hTrap,"Failing code module file name : %s\n",Name);
+              fprintf(hTrap,"Failing code Object # %d at Offset %x \n",ObjNum+1,Offset);
+              if (strlen(Name)>3) {
+                 fprintf(hTrap,"      File     Line#  Public Symbol\n");
+                 fprintf(hTrap,"  ÄÄÄÄÄÄÄÄÄÄÄÄ ÄÄÄÄ-  ÄÄÄÄÄÄÄÄÄÄÄÄ-\n");
+                 rc =GetLineNum(Name,ObjNum,Offset);
+
+                 if (rc == 0)
+                    print_vars(pCtxRec->ctx_RegEbp);
+
+                 /* if no codeview try with symbol files */
+                 if (rc!=0) {
+                    strcpy(Name+strlen(Name)-3,"SYM"); /* Get Sym File name */
+                    GetSymbol(Name,ObjNum,Offset);
+                 } /* endif */
+              } /* endif */
+              fprintf(hTrap,"\n");
+            } else {
+               fprintf(hTrap,"Invalid execution address\n");
+            } /* endif */
+        } /* endif */
+        if ( (pCtxRec->ContextFlags) & CONTEXT_CONTROL  ) {
+             void * _Seg16 Ptr16;
+             BigSeg=((pCtxRec->ctx_RegEip)>0x00010000);
+             if (BigSeg) {
+                 /* Avoid traps in 16:16 Disasm DLL */
+                 if (DosAllocMem((PPVOID)&SourceBuffer,0x100,fALLOC)==0) {
+                    Size=0x100;
+                    rc=DosQueryMem((PVOID)pCtxRec->ctx_RegEip,&Size,&Attr);
+                    if (Attr&(PAG_READ|PAG_EXECUTE)) {
+                       memcpy(SourceBuffer,(PVOID)pCtxRec->ctx_RegEip,Size);
+#if 0 /*CW*/
+                       AsmLine= DISASM( SourceBuffer,
+                                  (USHORT)pCtxRec->ctx_RegEip, BigSeg );
+                       fprintf(hTrap,"\n Failing instruction at CS:EIP : %4.4X:%8.8X is  %s\n\n",
+                         pCtxRec->ctx_SegCs,
+                         pCtxRec->ctx_RegEip,AsmLine->buf);
+#endif
+                    } /* endif */
+                 }
+             } else {
+                 if (CSSize>pCtxRec->ctx_RegEip) {
+#if 0 /*CW*/
+                    AsmLine= DISASM(MAKE16P(pCtxRec->ctx_SegCs,
+                                            pCtxRec->ctx_RegEip),
+                                    (USHORT)pCtxRec->ctx_RegEip, BigSeg );
+                    fprintf(hTrap,"\n Failing instruction at CS:IP : %4.4X:%4.4X is   %s\n\n",
+                           pCtxRec->ctx_SegCs,
+                           pCtxRec->ctx_RegEip,AsmLine->buf);
+#endif
+                 } else {
+                     fprintf(hTrap,"Invalid execution address\n");
+                 } /* endif */
+             } /* endif */
+
+             rc=DosGetInfoBlocks(&ptib,&ppib);
+             if (rc==NO_ERROR) {
+                static CHAR Format[10];
+
+                fprintf(hTrap,"\nThread slot %lu , Id %lu , priority %p\n",
+                        ptib->tib_ordinal,
+                        ptib->tib_ptib2->tib2_ultid ,
+                        ptib->tib_ptib2->tib2_ulpri );
+                Ptr16=ptib->tib_pstack;
+                sprintf(Format,"%8.8lX",Ptr16);
+                fprintf(hTrap,"Stack Bottom : %8.8lX (%4.4s:%4.4s) ;", ptib->tib_pstack ,Format,Format+4);
+                Ptr16=ptib->tib_pstacklimit;
+                sprintf(Format,"%8.8lX",Ptr16);
+                fprintf(hTrap,"Stack Top    : %8.8lX (%4.4s:%4.4s) \n",ptib->tib_pstacklimit,Format,Format+4);
+                fprintf(hTrap,"Process Id : %lu ", ppib->pib_ulpid);
+                rc=DosQueryModuleName(ppib->pib_hmte,CCHMAXPATH, Name);
+                if (rc==NO_ERROR) {
+                   fprintf(hTrap,".EXE name : %s\n",Name);
+                } else {
+                   fprintf(hTrap,".EXE name : ??????\n");
+                } /* endif */
+               /* Better New WalkStack From John Currier */
+               WalkStack((PUSHORT)ptib->tib_pstack,
+                         (PUSHORT)ptib->tib_pstacklimit,
+                         (PUSHORT)pCtxRec->ctx_RegEbp,
+                         (PUSHORT)pERepRec->ExceptionAddress);
+                ListModules();
+                Count=0;
+             } /* endif */
+        } /* endif */
+
+        if (hTrap!=stdout) {
+           fclose(hTrap);
+        }
+        DosExitMustComplete(&Nest);
+
+        /*        rc=DosUnsetExceptionHandler(pERegRec); CW */
+     } /* endif */
+  } else {
+     /* printf("Other non fatal exception %8.8lx ",pERepRec->ExceptionNum); */
+     /* printf("At address                %8.8lx\n",pERepRec->ExceptionAddress); */
+  } /* endif */
+  return (XCPT_CONTINUE_SEARCH);
+}
+
+#if 0 /*CW */
+APIRET16 APIENTRY16 SETEXCEPT(PEXCEPTIONREGISTRATIONRECORD _Seg16 pxcpthand)
+ {
+   APIRET rc;
+
+   rc=DosError(FERR_DISABLEEXCEPTION | FERR_DISABLEHARDERR );
+   printf("Set error rc %ld\n",rc);
+   pxcpthand->prev_structure=0;
+   pxcpthand->ExceptionHandler=&myHandler;
+   rc=DosSetExceptionHandler(pxcpthand);
+   printf("Set except rc %ld\n",rc);
+   return rc;/* CW */
+}
+APIRET16 APIENTRY16 UNSETEXCEPT(PEXCEPTIONREGISTRATIONRECORD _Seg16 pxcpthand)
+ {
+   APIRET rc;
+   rc=DosUnsetExceptionHandler(pxcpthand);
+   printf("Unset except rc %ld\n",rc);
+   return rc;/* CW */
+}
+#endif
+
+VOID ListModules() {
+  APIRET   rc;
+  APIRET16 rc16;
+#ifdef USE_DOSDEBUG
+  /**----------------------------------***/
+#else
+#if MORE_INFO_WANTED
+  PVOID BaseAddress;
+  ULONG RegionSize;
+  ULONG AllocationFlags;
+  HMODULE LastModule;
+  static CHAR Name[CCHMAXPATH];
+  ULONG Size;
+  LastModule=0;
+  BaseAddress=(PVOID)0x10000;
+  RegionSize =0x3FFFFFFF;
+  fprintf(hTrap,"ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿\n");
+  fprintf(hTrap,"³ List of currently accessed modules (DLLs) object addresses              ³");
+  rc=DosQueryMem(BaseAddress,&RegionSize,&AllocationFlags);
+  while (rc==NO_ERROR) {
+     if ((AllocationFlags&PAG_EXECUTE)&&
+         (AllocationFlags&PAG_BASE)) {
+        rc=DosQueryModFromEIP( &hMod, &ObjNum, CCHMAXPATH,
+                              Name, &Offset, BaseAddress);
+        if (rc==0) {
+            if (hMod!=LastModule) {
+               rc=DosQueryModuleName(hMod,CCHMAXPATH, Name);
+               fprintf(hTrap,"\nÃÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄŽ\n");
+               fprintf(hTrap,"³ Module %-48.48s Handle %8.8d ³\n",Name,hMod);
+               fprintf(hTrap,"³ Object Number    Address    Length     Flags      Type                  ³");
+               LastModule=hMod;
+            } /* endif */
+            fprintf(hTrap,"\n³       % 6.6d    %8.8lX   %8.8lX   %8.8lX ",ObjNum,
+                      BaseAddress, RegionSize, AllocationFlags);
+            rc16 =DOS16SIZESEG( SELECTOROF(BaseAddress), &Size);
+            if (rc16==0) {
+               fprintf(hTrap," - 16:16  Selector %4.4hX ³",SELECTOROF((PVOID)BaseAddress));
+            } else {
+               fprintf(hTrap," - 32 Bits              ³");
+            } /* endif */
+        }
+     }
+     if (AllocationFlags&PAG_FREE) RegionSize =0x10000;
+     RegionSize +=0x0FFF;
+     RegionSize &=0xFFFFF000;
+     BaseAddress=(PVOID)(((PCHAR)BaseAddress)+RegionSize);
+     RegionSize=((PCHAR)0x3FFFFFFF)-(PCHAR)BaseAddress;
+     rc=DosQueryMem(BaseAddress,&RegionSize,&AllocationFlags);
+     while ((rc==ERROR_INVALID_ADDRESS)||
+            (rc==ERROR_NO_OBJECT)) {
+         BaseAddress=(PVOID)(((PCHAR)BaseAddress)+0x10000);
+         if (BaseAddress>(PVOID)0x3FFFFFFF) {
+            break;
+         } /* endif */
+         RegionSize=((PCHAR)0x3FFFFFFF)-(PCHAR)BaseAddress;
+         rc=DosQueryMem(BaseAddress,&RegionSize,&AllocationFlags);
+     } /* endwhile */
+     if (BaseAddress>(PVOID)0x3FFFFFFF) {
+        break;
+     } /* endif */
+  } /* endwhile */
+  fprintf(hTrap,"\nÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ\n");
+#endif
+#endif
+}
+
+
+void    CheckMem(PVOID Ptr,PSZ MemoryName) {
+   APIRET rc;
+   ULONG Size,Flags,Attr;
+   Size=1;
+   rc=DosQueryMem(Ptr,&Size,&Attr);
+   if (rc!=NO_ERROR) {
+      fprintf(hTrap,   "³ %3.3s does not point to valid memory ³\n",MemoryName);
+   } else {
+      if (Attr&PAG_FREE) {
+         fprintf(hTrap,   "³ %3.3s points to unallocated memory   ³\n",MemoryName);
+      } else {
+         if ((Attr&PAG_COMMIT)==0x0U) {
+            fprintf(hTrap,"³ %3.3s points to uncommited  memory   ³\n",MemoryName);
+         } /* endif */
+         if ((Attr&PAG_WRITE)==0x0U) {
+            fprintf(hTrap,"³ %3.3s points to unwritable  memory   ³\n",MemoryName);
+         } /* endif */
+         if ((Attr&PAG_READ)==0x0U) {
+            fprintf(hTrap,"³ %3.3s points to unreadable  memory   ³\n",MemoryName);
+         } /* endif */
+      } /* endif */
+   } /* endif */
+}
+
+PUSHORT Convert(USHORT * _Seg16 p16) {
+   return p16;
+}
+
+/* Better New WalkStack From John Currier */
+static void WalkStack(PUSHORT StackBottom, PUSHORT StackTop, PUSHORT Ebp,
+                      PUSHORT ExceptionAddress)
+{
+   PUSHORT  RetAddr;
+   PUSHORT  LastEbp;
+   APIRET   rc;
+   ULONG    Size,Attr;
+   USHORT   Cs,Ip,Bp,Sp;
+   static char Name[CCHMAXPATH];
+   HMODULE  hMod;
+   ULONG    ObjNum;
+   ULONG    Offset;
+   BOOL     fExceptionAddress = TRUE;  // Use Exception Addr 1st time thru
+
+   // Note: we can't handle stacks bigger than 64K for now...
+   Sp = (USHORT)(((ULONG)StackBottom) >> 16);
+   Bp = (USHORT)(ULONG)Ebp;
+
+   if (!f32bit)
+      Ebp = (PUSHORT)MAKEULONG(Bp, Sp);
+
+   fprintf(hTrap,"\nCall Stack:\n");
+   fprintf(hTrap,"                                        Source    Line      Nearest\n");
+   fprintf(hTrap,"   EBP      Address    Module  Obj#      File     Numbr  Public Symbol\n");
+   fprintf(hTrap," ÄÄÄÄÄÄÄÄ  ÄÄÄÄÄÄÄÄ-  ÄÄÄÄÄÄÄÄ ÄÄÄÄ  ÄÄÄÄÄÄÄÄÄÄÄÄ ÄÄÄÄ-  ÄÄÄÄÄÄÄÄÄÄÄÄ-\n");
+
+   do
+   {
+      Size = 10;
+      rc = DosQueryMem((PVOID)(Ebp+2), &Size, &Attr);
+      if (rc != NO_ERROR || !(Attr & PAG_COMMIT) ||  (Size<10) )
+      {
+         fprintf(hTrap,"Invalid EBP: %8.8p\n",Ebp);
+         break;
+      }
+
+      if (fExceptionAddress)
+         RetAddr = ExceptionAddress;
+      else
+         RetAddr = (PUSHORT)(*((PULONG)(Ebp+2)));
+
+      if (RetAddr == (PUSHORT)0x00000053)
+      {
+         // For some reason there's a "return address" of 0x53 following
+         // EBP on the stack and we have to adjust EBP by 44 bytes to get
+         // at the real return address.  This has something to do with
+         // thunking from 32bits to 16bits...
+         // Serious kludge, and it's probably dependent on versions of C(++)
+         // runtime or OS, but it works for now!
+         Ebp += 22;
+         RetAddr = (PUSHORT)(*((PULONG)(Ebp+2)));
+      }
+
+      // Get the (possibly) 16bit CS and IP
+      if (fExceptionAddress)
+      {
+         Cs = (USHORT)(((ULONG)ExceptionAddress) >> 16);
+         Ip = (USHORT)(ULONG)ExceptionAddress;
+      }
+      else
+      {
+         Cs = *(Ebp+2);
+         Ip = *(Ebp+1);
+      }
+
+      // if the return address points to the stack then it's really just
+      // a pointer to the return address (UGH!).
+      if ((USHORT)(((ULONG)RetAddr) >> 16) == Sp)
+         RetAddr = (PUSHORT)(*((PULONG)RetAddr));
+
+      if (Ip == 0 && *Ebp == 0)
+      {
+         // End of the stack so these are both shifted by 2 bytes:
+         Cs = *(Ebp+3);
+         Ip = *(Ebp+2);
+      }
+
+      // 16bit programs have on the stack:
+      //   BP:IP:CS
+      //   where CS may be thunked
+      //
+      //         in dump                 swapped
+      //    BP        IP   CS          BP   CS   IP
+      //   4677      53B5 F7D0        7746 D0F7 B553
+      //
+      // 32bit programs have:
+      //   EBP:EIP
+      // and you'd have something like this (with SP added) (not
+      // accurate values)
+      //
+      //         in dump               swapped
+      //      EBP       EIP         EBP       EIP
+      //   4677 2900 53B5 F7D0   0029 7746 D0F7 B553
+      //
+      // So the basic difference is that 32bit programs have a 32bit
+      // EBP and we can attempt to determine whether we have a 32bit
+      // EBP by checking to see if its 'selector' is the same as SP.
+      // Note that this technique limits us to checking stacks < 64K.
+      //
+      // Soooo, if IP (which maps into the same USHORT as the swapped
+      // stack page in EBP) doesn't point to the stack (i.e. it could
+      // be a 16bit IP) then see if CS is valid (as is or thunked).
+      //
+      // Note that there's the possibility of a 16bit return address
+      // that has an offset that's the same as SP so we'll think it's
+      // a 32bit return address and won't be able to successfully resolve
+      // its details.
+      if (Ip != Sp)
+      {
+         if (DOS16SIZESEG(Cs, &Size) == NO_ERROR)
+         {
+            RetAddr = (USHORT * _Seg16)MAKEULONG(Ip, Cs);
+            f32bit = FALSE;
+         }
+         else if (DOS16SIZESEG((Cs << 3) + 7, &Size) == NO_ERROR)
+         {
+            Cs = (Cs << 3) + 7;
+            RetAddr = (USHORT * _Seg16)MAKEULONG(Ip, Cs);
+            f32bit = FALSE;
+         }
+         else
+            f32bit = TRUE;
+      }
+      else
+         f32bit = TRUE;
+
+
+      if (fExceptionAddress)
+         fprintf(hTrap," Trap  ->");
+      else
+         fprintf(hTrap," %8.8p", Ebp);
+
+      if (f32bit)
+         fprintf(hTrap,"  :%8.8p", RetAddr);
+      else
+         fprintf(hTrap,"  %04.04X:%04.04X", Cs, Ip);
+
+      if (Version[0] >= 20 && Version[1] >= 10)
+      {
+         // Make a 'tick' sound to let the user know we're still alive
+         DosBeep(2000, 1);
+
+         Size = 10; /* Inserted by Kim Rasmussen 26/06 1996 to avoid error 87 when Size is 0 */
+
+         rc = DosQueryMem((PVOID)RetAddr, &Size, &Attr);
+         if (rc != NO_ERROR || !(Attr & PAG_COMMIT))
+         {
+            fprintf(hTrap,"Invalid RetAddr: %8.8p\n",RetAddr);
+            break; /* avoid infinite loops */
+         } else {
+            rc = DosQueryModFromEIP(&hMod, &ObjNum, sizeof(Name),
+                                    Name, &Offset, (ULONG) RetAddr);
+            if (rc == NO_ERROR && ObjNum != -1)
+            {
+               static char szJunk[_MAX_FNAME];
+               static char szName[_MAX_FNAME];
+               DosQueryModuleName(hMod, sizeof(Name), Name);
+               _splitpath(Name, szJunk, szJunk, szName, szJunk);
+               fprintf(hTrap,"  %-8s %04X", szName, ObjNum+1);
+
+               if (strlen(Name) > 3)
+               {
+                  rc = GetLineNum(Name, ObjNum, Offset);
+                  /* if no codeview try with symbol files */
+                  if (rc != NO_ERROR)
+                  {
+                     strcpy(Name+strlen(Name)-3,"SYM");
+                     GetSymbol(Name,ObjNum,Offset);
+                  }
+               }
+            }
+            else
+            {
+               fprintf(hTrap,"  *Unknown*");
+            }
+         }
+      }
+
+      fprintf(hTrap,"\n");
+
+      Bp = *Ebp;
+      if (Bp == 0 && (*Ebp+1) == 0)
+      {
+         fprintf(hTrap,"End of Call Stack\n");
+         break;
+      }
+
+      if (!fExceptionAddress)
+      {
+         LastEbp = Ebp;
+#if 0
+         Ebp = (PUSHORT)MAKEULONG(Bp, Sp);
+#else  /* Inserted by Kim Rasmussen 26/06 1996 to allow big stacks */
+         if (f32bit)
+            Ebp = (PUSHORT)*(PULONG)LastEbp;
+         else
+            Ebp = (PUSHORT)MAKEULONG(Bp, Sp);
+#endif
+         if (f32bit) {
+             print_vars((ULONG)Ebp);
+         } /* endif */
+
+         if (Ebp < LastEbp)
+         {
+            fprintf(hTrap,"Lost Stack chain - new EBP below previous\n");
+            break;
+         }
+      }
+      else
+         fExceptionAddress = FALSE;
+
+      Size = 4;
+      rc = DosQueryMem((PVOID)Ebp, &Size, &Attr);
+      if ((rc != NO_ERROR)||(Size<4))
+      {
+         fprintf(hTrap,"Lost Stack chain - invalid EBP: %8.8p\n", Ebp);
+         break;
+      }
+   } while (TRUE);
+
+   fprintf(hTrap,"\n");
+}
+
+void GetSymbol(CHAR * SymFileName, ULONG Object,ULONG TrapOffset)
+{
+   static FILE * SymFile;
+   static MAPDEF MapDef;
+   static SEGDEF   SegDef;
+   static SEGDEF *pSegDef;
+   static SYMDEF32 SymDef32;
+   static SYMDEF16 SymDef16;
+   static char    Buffer[256];
+   static int     SegNum,SymNum,LastVal;
+   static unsigned long int SegOffset,SymOffset,SymPtrOffset;
+   SymFile=fopen(SymFileName,"rb");
+   if (SymFile==0) {
+       /*fprintf(hTrap,"Could not open symbol file %s\n",SymFileName);*/
+       return;
+   } /* endif */
+   fread(&MapDef,sizeof(MAPDEF),1,SymFile);
+   SegOffset= SEGDEFOFFSET(MapDef);
+   for (SegNum=0;SegNum<MapDef.cSegs;SegNum++) {
+        /* printf("Scanning segment #%d Offset %4.4hX\n",SegNum+1,SegOffset); */
+        if (fseek(SymFile,SegOffset,SEEK_SET)) {
+           fprintf(hTrap,"Seek error ");
+           return;
+        }
+        fread(&SegDef,sizeof(SEGDEF),1,SymFile);
+        if (SegNum==Object) {
+           Buffer[0]=0x00;
+           LastVal=0;
+           for (SymNum=0;SymNum<SegDef.cSymbols;SymNum++) {
+              SymPtrOffset=SYMDEFOFFSET(SegOffset,SegDef,SymNum);
+              fseek(SymFile,SymPtrOffset,SEEK_SET);
+              fread(&SymOffset,sizeof(unsigned short int),1,SymFile);
+              fseek(SymFile,SymOffset+SegOffset,SEEK_SET);
+              if (SegDef.bFlags&0x01) {
+                 fread(&SymDef32,sizeof(SYMDEF32),1,SymFile);
+                 if (SymDef32.wSymVal>TrapOffset) {
+                    fprintf(hTrap,"between %s + %X ",Buffer,TrapOffset-LastVal);
+                 }
+                 LastVal=SymDef32.wSymVal;
+                 Buffer[0]= SymDef32.achSymName[0];
+                 fread(&Buffer[1],1,SymDef32.cbSymName,SymFile);
+                 Buffer[SymDef32.cbSymName]=0x00;
+                 if (SymDef32.wSymVal>TrapOffset) {
+                    fprintf(hTrap,"and %s - %X\n",Buffer,LastVal-TrapOffset);
+                    break;
+                 }
+                 /*printf("32 Bit Symbol <%s> Address %p\n",Buffer,SymDef32.wSymVal);*/
+              } else {
+                 fread(&SymDef16,sizeof(SYMDEF16),1,SymFile);
+                 if (SymDef16.wSymVal>TrapOffset) {
+                    fprintf(hTrap,"between %s + %X ",Buffer,TrapOffset-LastVal);
+                 }
+                 LastVal=SymDef16.wSymVal;
+                 Buffer[0]=SymDef16.achSymName[0];
+                 fread(&Buffer[1],1,SymDef16.cbSymName,SymFile);
+                 Buffer[SymDef16.cbSymName]=0x00;
+                 if (SymDef16.wSymVal>TrapOffset) {
+                    fprintf(hTrap,"and %s - %X\n",Buffer,LastVal-TrapOffset);
+                    break;
+                 }
+                 /*printf("16 Bit Symbol <%s> Address %p\n",Buffer,SymDef16.wSymVal);*/
+              } /* endif */
+           }
+           break;
+        } /* endif */
+        SegOffset=NEXTSEGDEFOFFSET(SegDef);
+   } /* endwhile */
+   fclose(SymFile);
+}
+
+#include <newexe.h>
+#define  FOR_EXEHDR  1  /* avoid define conflicts between newexe.h and exe386.h */
+#ifndef DWORD
+#define DWORD long int
+#endif
+#ifndef WORD
+#define WORD  short int
+#endif
+#include <exe386.h>
+#include <fcntl.h>
+#include <sys\stat.h>
+#include <share.h>
+#include <io.h>
+/* ------------------------------------------------------------------ */
+/* Last 8 bytes of 16:16 file when CODEVIEW debugging info is present */
+#pragma pack(1)
+ struct  _eodbug
+        {
+        unsigned short dbug;          /* 'NB' signature */
+        unsigned short ver;           /* version        */
+        unsigned long dfaBase;        /* size of codeview info */
+        } eodbug;
+
+#define         DBUGSIG         0x424E
+#define         SSTMODULES      0x0101
+#define         SSTPUBLICS      0x0102
+#define         SSTTYPES        0x0103
+#define         SSTSYMBOLS      0x0104
+#define         SSTSRCLINES     0x0105
+#define         SSTLIBRARIES    0x0106
+#define         SSTSRCLINES2    0x0109
+#define         SSTSRCLINES32   0x010B
+
+ struct  _base
+        {
+        unsigned short dbug;          /* 'NB' signature */
+        unsigned short ver;           /* version        */
+        unsigned long lfoDir;   /* file offset to dir entries */
+        } base;
+
+ struct  ssDir
+        {
+        unsigned short sst;           /* SubSection Type */
+        unsigned short modindex;      /* Module index number */
+        unsigned long lfoStart;       /* Start of section */
+        unsigned short cb;            /* Size of section */
+        } ;
+
+ struct  ssDir32
+        {
+        unsigned short sst;           /* SubSection Type */
+        unsigned short modindex;      /* Module index number */
+        unsigned long lfoStart;       /* Start of section */
+        unsigned long  cb;            /* Size of section */
+        } ;
+
+ struct  ssModule
+   {
+   unsigned short          csBase;             /* code segment base */
+   unsigned short          csOff;              /* code segment offset */
+   unsigned short          csLen;              /* code segment length */
+   unsigned short          ovrNum;             /* overlay number */
+   unsigned short          indxSS;             /* Index into sstLib or 0 */
+   unsigned short          reserved;
+   char              csize;              /* size of prefix string */
+   } ssmod;
+
+ struct  ssModule32
+   {
+   unsigned short          csBase;             /* code segment base */
+   unsigned long           csOff;              /* code segment offset */
+   unsigned long           csLen;              /* code segment length */
+   unsigned long           ovrNum;             /* overlay number */
+   unsigned short          indxSS;             /* Index into sstLib or 0 */
+   unsigned long           reserved;
+   char                    csize;              /* size of prefix string */
+   } ssmod32;
+
+ struct  ssPublic
+        {
+        unsigned short  offset;
+        unsigned short  segment;
+        unsigned short  type;
+        char      csize;
+        } sspub;
+
+ struct  ssPublic32
+        {
+        unsigned long   offset;
+        unsigned short  segment;
+        unsigned short  type;
+        char      csize;
+        } sspub32;
+
+typedef  struct _SSLINEENTRY32 {
+   unsigned short LineNum;
+   unsigned short FileNum;
+   unsigned long  Offset;
+} SSLINEENTRY32;
+typedef  struct _FIRSTLINEENTRY32 {
+   unsigned short LineNum;
+   unsigned char  entry_type;
+   unsigned char  reserved;
+   unsigned short numlines;
+   unsigned short segnum;
+} FIRSTLINEENTRY32;
+
+typedef  struct _SSFILENUM32 {
+    unsigned long first_displayable;  /* Not used */
+    unsigned long number_displayable; /* Not used */
+    unsigned long file_count;         /* number of source files */
+} SSFILENUM32;
+
+ struct  DbugRec {                       /* debug info struct ure used in linked * list */
+     struct  DbugRec /*far*/ *pnext;          /* next node *//* 013 */
+   char /*far*/          *SourceFile;               /* source file name *013 */
+   unsigned short          TypeOfProgram;       /* dll or exe *014* */
+   unsigned short          LineNumber;          /* line number in source file */
+   unsigned short          OffSet;              /* offset into loaded module */
+   unsigned short          Selector;            /* code segment 014 */
+   unsigned short          OpCode;              /* Opcode replaced with BreakPt */
+   unsigned long     Count;                     /* count over Break Point */
+};
+
+/*typedef  struct  DbugRec DBUG, far * DBUGPTR;  */   /* 013 */
+
+char szNrPub[128];
+char szNrLine[128];
+char szNrFile[128];
+ struct  new_seg *pseg;
+ struct  o32_obj *pobj;        /* Flat .EXE object table entry */
+ struct  ssDir *pDirTab;
+ struct  ssDir32 *pDirTab32;
+unsigned char *pEntTab;
+unsigned long lfaBase;
+#pragma pack()
+/* ------------------------------------------------------------------ */
+
+APIRET GetLineNum(CHAR * FileName, ULONG Object,ULONG TrapOffset) {
+   APIRET rc;
+   int ModuleFile;
+   static  struct  exe_hdr old;
+   static  struct  new_exe new1;
+   static  struct  e32_exe e32;
+   strcpy(szNrPub,"   N/A ");
+   strcpy(szNrLine,"   N/A  ");
+   strcpy(szNrFile,"             ");
+   ModuleFile =sopen(FileName,O_RDONLY|O_BINARY,SH_DENYNO);
+   if (ModuleFile!=-1) {
+      /* Read old Exe header */
+      if (read( ModuleFile ,(void *)&old,64)==-1L) {
+        fprintf(hTrap,"Could Not Read old exe header %d\n",errno);
+        close(ModuleFile);
+        return 2;
+      }
+      /* Seek to new Exe header */
+      if (lseek(ModuleFile,(long)E_LFANEW(old),SEEK_SET)==-1L) {
+        fprintf(hTrap,"Could Not seek to new exe header %d\n",errno);
+        close(ModuleFile);
+        return 3;
+      }
+      if (read( ModuleFile ,(void *)&new1,64)==-1L) {
+        fprintf(hTrap,"Could Not read new exe header %d\n",errno);
+        close(ModuleFile);
+        return 4;
+      }
+      /* Check EXE signature */
+      if (NE_MAGIC(new1)==E32MAGIC) {
+         /* Flat 32 executable */
+         rc=Read32PmDebug(ModuleFile,Object+1,TrapOffset,FileName);
+         if (rc==0) {
+             fprintf(hTrap,"%s",szNrFile);
+             fprintf(hTrap,"%s",szNrLine);
+             fprintf(hTrap,"%s",szNrPub);
+         } /* endif */
+         close(ModuleFile);
+         /* rc !=0 try with DBG file */
+         if (rc!=0) {
+            strcpy(FileName+strlen(FileName)-3,"DBG"); /* Build DBG File name */
+            ModuleFile =sopen(FileName,O_RDONLY|O_BINARY,SH_DENYNO);
+            if (ModuleFile!=-1) {
+               rc=Read32PmDebug(ModuleFile,Object+1,TrapOffset,FileName);
+               if (rc==0) {
+                  fprintf(hTrap,"%s",szNrFile);
+                  fprintf(hTrap,"%s",szNrLine);
+                  fprintf(hTrap,"%s",szNrPub);
+               } /* endif */
+               close(ModuleFile);
+            }
+         } /* endif */
+         return rc;
+      } else {
+         if (NE_MAGIC(new1)==NEMAGIC) {
+            /* 16:16 executable */
+            if ((pseg = ( struct  new_seg *) calloc(NE_CSEG(new1),sizeof( struct  new_seg)))==NULL) {
+               fprintf(hTrap,"Out of memory!");
+               close(ModuleFile);
+               return -1;
+            }
+            if (lseek(ModuleFile,E_LFANEW(old)+NE_SEGTAB(new1),SEEK_SET)==-1L) {
+               fprintf(hTrap,"Error %u seeking segment table in %s\n",errno,FileName);
+               free(pseg);
+               close(ModuleFile);
+               return 9;
+            }
+
+            if (read(ModuleFile,(void *)pseg,NE_CSEG(new1)*sizeof( struct  new_seg))==-1) {
+               fprintf(hTrap,"Error %u reading segment table from %s\n",errno,FileName);
+               free(pseg);
+               close(ModuleFile);
+               return 10;
+            }
+            rc=Read16CodeView(ModuleFile,Object+1,TrapOffset,FileName);
+            if (rc==0) {
+               fprintf(hTrap,"%s",szNrFile);
+               fprintf(hTrap,"%s",szNrLine);
+               fprintf(hTrap,"%s",szNrPub);
+            } /* endif */
+            free(pseg);
+            close(ModuleFile);
+            /* rc !=0 try with DBG file */
+            if (rc!=0) {
+               strcpy(FileName+strlen(FileName)-3,"DBG"); /* Build DBG File name */
+               ModuleFile =sopen(FileName,O_RDONLY|O_BINARY,SH_DENYNO);
+               if (ModuleFile!=-1) {
+                  rc=Read16CodeView(ModuleFile,Object+1,TrapOffset,FileName);
+                  if (rc==0) {
+                     fprintf(hTrap,"%s",szNrFile);
+                     fprintf(hTrap,"%s",szNrLine);
+                     fprintf(hTrap,"%s",szNrPub);
+                  } /* endif */
+                  close(ModuleFile);
+               }
+            } /* endif */
+            return rc;
+
+         } else {
+            /* Unknown executable */
+            fprintf(hTrap,"Could Not find exe signature");
+            close(ModuleFile);
+            return 11;
+         }
+      }
+      /* Read new Exe header */
+   } else {
+      fprintf(hTrap,"Could Not open Module File %d",errno);
+      return 1;
+   } /* endif */
+   return 0;
+}
+char fname[128],ModName[80];
+char ename[128],dummy[128];
+
+int Read16CodeView(int fh,int TrapSeg,int TrapOff,CHAR * FileName) {
+    static unsigned short int offset,NrPublic,NrLine,NrEntry,numdir,namelen,numlines,line;
+    static int ModIndex;
+    static int bytesread,i,j;
+    ModIndex=0;
+    /* See if any CODEVIEW info */
+    if (lseek(fh,-8L,SEEK_END)==-1) {
+        fprintf(hTrap,"Error %u seeking CodeView table in %s\n",errno,FileName);
+        return(18);
+    }
+
+    if (read(fh,(void *)&eodbug,8)==-1) {
+       fprintf(hTrap,"Error %u reading debug info from %s\n",errno,FileName);
+       return(19);
+    }
+    if (eodbug.dbug!=DBUGSIG) {
+       /* fprintf(hTrap,"\nNo CodeView information stored.\n"); */
+       return(100);
+    }
+
+    if ((lfaBase=lseek(fh,-eodbug.dfaBase,SEEK_END))==-1L) {
+       fprintf(hTrap,"Error %u seeking base codeview data in %s\n",errno,FileName);
+       return(20);
+    }
+
+    if (read(fh,(void *)&base,8)==-1) {
+       fprintf(hTrap,"Error %u reading base codeview data in %s\n",errno,FileName);
+       return(21);
+    }
+
+    if (lseek(fh,base.lfoDir-8,SEEK_CUR)==-1) {
+       fprintf(hTrap,"Error %u seeking dir codeview data in %s\n",errno,FileName);
+       return(22);
+    }
+
+    if (read(fh,(void *)&numdir,2)==-1) {
+       fprintf(hTrap,"Error %u reading dir codeview data in %s\n",errno,FileName);
+       return(23);
+    }
+
+    /* Read dir table into buffer */
+    if (( pDirTab = ( struct  ssDir *) calloc(numdir,sizeof( struct  ssDir)))==NULL) {
+       fprintf(hTrap,"Out of memory!");
+       return(-1);
+    }
+
+    if (read(fh,(void *)pDirTab,numdir*sizeof( struct  ssDir))==-1) {
+       fprintf(hTrap,"Error %u reading codeview dir table from %s\n",errno,FileName);
+       free(pDirTab);
+       return(24);
+    }
+
+    i=0;
+    while (i<numdir) {
+       if (pDirTab[i].sst!=SSTMODULES) {
+           i++;
+           continue;
+       }
+       NrPublic=0x0;
+       NrLine=0x0;
+       /* point to subsection */
+       lseek(fh, pDirTab[i].lfoStart + lfaBase, SEEK_SET);
+       read(fh,(void *)&ssmod.csBase,sizeof(ssmod));
+       read(fh,(void *)ModName,(unsigned)ssmod.csize);
+       ModIndex=pDirTab[i].modindex;
+       ModName[ssmod.csize]='\0';
+       i++;
+       while (pDirTab[i].modindex ==ModIndex && i<numdir) {
+          /* point to subsection */
+          lseek(fh, pDirTab[i].lfoStart + lfaBase, SEEK_SET);
+          switch(pDirTab[i].sst) {
+            case SSTPUBLICS:
+               bytesread=0;
+               while (bytesread < pDirTab[i].cb) {
+                   bytesread += read(fh,(void *)&sspub.offset,sizeof(sspub));
+                   bytesread += read(fh,(void *)ename,(unsigned)sspub.csize);
+                   ename[sspub.csize]='\0';
+                   if ((sspub.segment==TrapSeg) &&
+                       (sspub.offset<=TrapOff) &&
+                       (sspub.offset>=NrPublic)) {
+                       NrPublic=sspub.offset;
+                       sprintf(szNrPub,"%s %s (%s) %04hX:%04hX\n",
+                               (sspub.type==1) ? " Abs" : " ",ename,ModName,
+                               sspub.segment, sspub.offset
+                               );
+                   }
+               }
+               break;
+
+            case SSTSRCLINES2:
+            case SSTSRCLINES:
+               if (TrapSeg!=ssmod.csBase) break;
+               namelen=0;
+               read(fh,(void *)&namelen,1);
+               read(fh,(void *)ename,namelen);
+               ename[namelen]='\0';
+               /* skip 2 zero bytes */
+               if (pDirTab[i].sst==SSTSRCLINES2) read(fh,(void *)&numlines,2);
+               read(fh,(void *)&numlines,2);
+               for (j=0;j<numlines;j++) {
+                  read(fh,(void *)&line,2);
+                  read(fh,(void *)&offset,2);
+                  if (offset<=TrapOff && offset>=NrLine) {
+                     NrLine=offset;
+                     sprintf(szNrLine,"% 6hu", line);
+                     sprintf(szNrFile,"%  13.13s ", ename);
+                     /*sprintf(szNrLine,"%04hX:%04hX  line #%hu  (%s) (%s)\n",
+                             ssmod.csBase,offset,line,ModName,ename); */
+                  }
+               }
+               break;
+          } /* end switch */
+          i++;
+       } /* end while modindex */
+    } /* End While i < numdir */
+    free(pDirTab);
+    return(0);
+}
+
+#define MAX_USERDEFS 150
+#define MAX_POINTERS 150
+
+USHORT userdef_count;
+USHORT pointer_count;
+
+struct one_userdef_rec {
+   USHORT idx;
+   USHORT type_index;
+   BYTE   name[33];
+} one_userdef[MAX_USERDEFS];
+
+struct one_pointer_rec {
+   USHORT idx;
+   USHORT type_index;
+   BYTE   type_qual;
+   BYTE   name[33];
+} one_pointer[MAX_POINTERS];
+
+int Read32PmDebug(int fh,int TrapSeg,int TrapOff,CHAR * FileName) {
+    static unsigned int CurrSymSeg, NrSymbol,offset,NrPublic,NrFile,NrLine,NrEntry,numdir,namelen,numlines,line;
+    static int ModIndex;
+    static int bytesread,i,j;
+    static int pOffset;
+    static SSLINEENTRY32 LineEntry;
+    static SSFILENUM32 FileInfo;
+    static FIRSTLINEENTRY32 FirstLine;
+    static BYTE dump_vars = FALSE;
+    static USHORT idx;
+    static BOOL read_types;
+    static LONG lSize;
+    static BOOL is_new_debug;
+
+    ModIndex=0;
+    /* See if any CODEVIEW info */
+    if (lseek(fh,-8L,SEEK_END)==-1) {
+        fprintf(hTrap,"Error %u seeking CodeView table in %s\n",errno,FileName);
+        return(18);
+    }
+
+    if (read(fh,(void *)&eodbug,8)==-1) {
+       fprintf(hTrap,"Error %u reading debug info from %s\n",errno,FileName);
+       return(19);
+    }
+    if (eodbug.dbug!=DBUGSIG) {
+       /*fprintf(hTrap,"\nNo CodeView information stored.\n");*/
+       return(100);
+    }
+
+    if ((lfaBase=lseek(fh,-eodbug.dfaBase,SEEK_END))==-1L) {
+       fprintf(hTrap,"Error %u seeking base codeview data in %s\n",errno,FileName);
+       return(20);
+    }
+
+    if (read(fh,(void *)&base,8)==-1) {
+       fprintf(hTrap,"Error %u reading base codeview data in %s\n",errno,FileName);
+       return(21);
+    }
+
+    if (lseek(fh,base.lfoDir-8+4,SEEK_CUR)==-1) {
+       fprintf(hTrap,"Error %u seeking dir codeview data in %s\n",errno,FileName);
+       return(22);
+    }
+
+    if (read(fh,(void *)&numdir,4)==-1) {
+       fprintf(hTrap,"Error %u reading dir codeview data in %s\n",errno,FileName);
+       return(23);
+    }
+
+    /* Read dir table into buffer */
+    if (( pDirTab32 = ( struct  ssDir32 *) calloc(numdir,sizeof( struct  ssDir32)))==NULL) {
+       fprintf(hTrap,"Out of memory!");
+       return(-1);
+    }
+
+    if (read(fh,(void *)pDirTab32,numdir*sizeof( struct  ssDir32))==-1) {
+       fprintf(hTrap,"Error %u reading codeview dir table from %s\n",errno,FileName);
+       free(pDirTab32);
+       return(24);
+    }
+
+    i=0;
+    while (i<numdir) {
+       if ( pDirTab32[i].sst !=SSTMODULES) {
+           i++;
+           continue;
+       }
+       NrPublic=0x0;
+       NrSymbol=0;
+       NrLine=0x0;
+       NrFile=0x0;
+       CurrSymSeg = 0;
+       /* point to subsection */
+       lseek(fh, pDirTab32[i].lfoStart + lfaBase, SEEK_SET);
+       read(fh,(void *)&ssmod32.csBase,sizeof(ssmod32));
+       read(fh,(void *)ModName,(unsigned)ssmod32.csize);
+       ModIndex=pDirTab32[i].modindex;
+       ModName[ssmod32.csize]='\0';
+       i++;
+
+       read_types = FALSE;
+
+       while (pDirTab32[i].modindex ==ModIndex && i<numdir) {
+          /* point to subsection */
+          lseek(fh, pDirTab32[i].lfoStart + lfaBase, SEEK_SET);
+          switch(pDirTab32[i].sst) {
+            case SSTPUBLICS:
+               bytesread=0;
+               while (bytesread < pDirTab32[i].cb) {
+                   bytesread += read(fh,(void *)&sspub32.offset,sizeof(sspub32));
+                   bytesread += read(fh,(void *)ename,(unsigned)sspub32.csize);
+                   ename[sspub32.csize]='\0';
+                   if ((sspub32.segment==TrapSeg) &&
+                       (sspub32.offset<=TrapOff) &&
+                       (sspub32.offset>=NrPublic)) {
+                       NrPublic = pubfunc_ofs = sspub32.offset;
+                       read_types = TRUE;
+                       sprintf(szNrPub,"%s %s (%s) %04X:%08lu\n",
+                               (sspub32.type==1) ? " Abs" : " ",ename,ModName,
+                               sspub32.segment, sspub32.offset
+                               );
+                   }
+               }
+               break;
+
+            /* Read symbols, so we can dump the variables on the stack */
+            case SSTSYMBOLS:
+               if (TrapSeg!=ssmod32.csBase) break;
+
+               bytesread=0;
+               while (bytesread < pDirTab32[i].cb) {
+                  static USHORT usLength;
+                  static BYTE b1, b2;
+                  static BYTE bType, *ptr;
+                  static ULONG ofs;
+                  static ULONG last_addr = 0;
+                  static BYTE str[256];
+                  static struct symseg_rec       symseg;
+                  static struct symauto_rec      symauto;
+                  static struct symproc_rec      symproc;
+
+                  /* Read the length of this subentry */
+                  bytesread += read(fh, &b1, 1);
+                  if (b1 & 0x80) {
+                     bytesread += read(fh, &b2, 1);
+                     usLength = ((b1 & 0x7F) << 8) + b2;
+                  }
+                  else
+                     usLength = b1;
+
+                  ofs = tell(fh);
+
+                  bytesread += read(fh, &bType, 1);
+
+                  switch(bType) {
+                     case SYM_CHANGESEG:
+                        read(fh, &symseg, sizeof(symseg));
+                        CurrSymSeg = symseg.seg_no;
+                        break;
+
+                     case SYM_PROC:
+                     case SYM_CPPPROC:
+                        read(fh, &symproc, sizeof(symproc));
+                        read(fh, str, symproc.name_len);
+                           str[symproc.name_len] = 0;
+
+                        if ((CurrSymSeg == TrapSeg) &&
+                            (symproc.offset<=TrapOff) &&
+                            (symproc.offset>=NrSymbol)) {
+
+                           dump_vars = TRUE;
+                           var_ofs = 0;
+                           NrSymbol = symproc.offset;
+                           func_ofs = symproc.offset;
+
+                           strcpy(func_name, str);
+                        }
+                        else {
+                           dump_vars = FALSE;
+                        }
+                        break;
+
+                     case SYM_AUTO:
+                        if (!dump_vars)
+                           break;
+
+                        read(fh, &symauto, sizeof(symauto));
+                        read(fh, str, symauto.name_len);
+                        str[symauto.name_len] = 0;
+
+                        strcpy(autovar_def[var_ofs].name, str);
+                        autovar_def[var_ofs].stack_offset = symauto.stack_offset;
+                        autovar_def[var_ofs].type_idx = symauto.type_idx;
+                        var_ofs++;
+                        break;
+
+                  }
+
+                  bytesread += usLength;
+
+                  lseek(fh, ofs+usLength, SEEK_SET);
+               }
+               break;
+
+            case SSTTYPES:
+//               if (ModIndex != TrapSeg)
+               if (!read_types)
+                  break;
+
+               bytesread=0;
+               idx = 0x200;
+               userdef_count = 0;
+               pointer_count = 0;
+               while (bytesread < pDirTab32[i].cb) {
+                  static struct type_rec         type;
+                  static struct type_userdefrec  udef;
+                  static struct type_pointerrec  point;
+                  static struct type_funcrec     func;
+                  static struct type_structrec   struc;
+                  static struct type_list1       list1;
+                  static struct type_list2       list2;
+                  static struct type_list2_1     list2_1;
+                  static ULONG  ofs;
+                  static BYTE   str[256], b1, b2;
+                  static USHORT n;
+
+                  /* Read the length of this subentry */
+                  ofs = tell(fh);
+
+                  read(fh, &type, sizeof(type));
+                  bytesread += sizeof(type);
+
+                  switch(type.type) {
+                     case TYPE_USERDEF:
+                        if (userdef_count > MAX_USERDEFS)
+                           break;
+
+                        read(fh, &udef, sizeof(udef));
+                        read(fh, str, udef.name_len);
+                        str[udef.name_len] = 0;
+
+                        // Insert userdef in table
+                        one_userdef[userdef_count].idx = idx;
+                        one_userdef[userdef_count].type_index = udef.type_index;
+                        memcpy(one_userdef[userdef_count].name, str, min(udef.name_len+1, 32));
+                        one_userdef[userdef_count].name[32] = 0;
+                        userdef_count++;
+                        break;
+
+                     case TYPE_POINTER:
+                        if (pointer_count > MAX_POINTERS)
+                           break;
+
+                        read(fh, &point, sizeof(point));
+                        read(fh, str, point.name_len);
+                        str[point.name_len] = 0;
+
+                        // Insert userdef in table
+                        one_pointer[pointer_count].idx = idx;
+                        one_pointer[pointer_count].type_index = point.type_index;
+                        memcpy(one_pointer[pointer_count].name, str, min(point.name_len+1, 32));
+                        one_pointer[pointer_count].name[32] = 0;
+                        one_pointer[pointer_count].type_qual = type.type_qual;
+                        pointer_count++;
+                        break;
+                  }
+
+                  ++idx;
+
+                  bytesread += type.length;
+
+                  lseek(fh, ofs+type.length+2, SEEK_SET);
+               }
+               break;
+
+            case SSTSRCLINES32:
+               if (TrapSeg!=ssmod32.csBase) break;
+
+               /* read first line */
+               do {
+                  read(fh,(void *)&FirstLine,sizeof(FirstLine));
+
+                  if (FirstLine.LineNum!=0) {
+                     fprintf(hTrap,"Missing Line table information\n");
+                     break;
+                  } /* endif */
+                  numlines= FirstLine.numlines;
+                  /* Other type of data skip 4 more bytes */
+                  if (FirstLine.entry_type < 4) {
+                     read(fh, (void *)&lSize, 4);
+                     if (FirstLine.entry_type == 3)
+                        lseek(fh,lSize,SEEK_CUR);
+                  }
+               } while(FirstLine.entry_type == 3);
+
+               for (j=0;j<numlines;j++) {
+                  switch (FirstLine.entry_type) {
+                     case 0:
+                        read(fh,(void *)&LineEntry,sizeof(LineEntry));
+                        /* Changed by Kim Rasmussen 26/06 1996 to ignore linenumber 0 */
+         /*               if (LineEntry.Offset+ssmod32.csOff<=TrapOff && LineEntry.Offset+ssmod32.csOff>=NrLine) { */
+                        if (LineEntry.LineNum && LineEntry.Offset+ssmod32.csOff<=TrapOff && LineEntry.Offset+ssmod32.csOff>=NrLine) {
+                           NrLine=LineEntry.Offset;
+                           NrFile=LineEntry.FileNum;
+                           /*pOffset =sprintf(szNrLine,"%04X:%08X  line #%hu ",
+                                   ssmod32.csBase,LineEntry.Offset,
+                                   LineEntry.LineNum);*/
+                          sprintf(szNrLine,"% 6hu", LineEntry.LineNum);
+                        }
+                        break;
+
+                     case 1:
+                        lseek(fh, sizeof(struct linlist_rec), SEEK_CUR);
+                        break;
+
+                     case 2:
+                        lseek(fh, sizeof(struct linsourcelist_rec), SEEK_CUR);
+                        break;
+
+                     case 3:
+                        lseek(fh, sizeof(struct filenam_rec), SEEK_CUR);
+                        break;
+
+                     case 4:
+                        lseek(fh, sizeof(struct pathtab_rec), SEEK_CUR);
+                        break;
+
+                  }
+               }
+               if (NrFile!=0) {
+                  read(fh,(void *)&FileInfo,sizeof(FileInfo));
+                  namelen=0;
+                  for (j=1;j<=FileInfo.file_count;j++) {
+                     namelen=0;
+                     read(fh,(void *)&namelen,1);
+                     read(fh,(void *)ename,namelen);
+                     if (j==NrFile) break;
+                  }
+                  ename[namelen]='\0';
+                  /*  pOffset=sprintf(szNrLine+pOffset," (%s) (%s)\n",ename,ModName);*/
+                  sprintf(szNrFile,"%  13.13s ",ename);
+               } else {
+                  /* strcat(szNrLine,"\n"); avoid new line for empty name fill */
+                 strcpy(szNrFile,"             ");
+               } /* endif */
+               break;
+          } /* end switch */
+
+          i++;
+       } /* end while modindex */
+    } /* End While i < numdir */
+    free(pDirTab32);
+    return(0);
+}
+
+BYTE *var_value(void *varptr, BYTE type)
+{
+   static BYTE value[128];
+   APIRET rc;
+
+   strcpy(value, "Unknown");
+
+   if (type == 0)
+      sprintf(value, "%hhi", *(signed char *)varptr);
+   else if (type == 1)
+      sprintf(value, "%hd", *(signed short *)varptr);
+   else if (type == 2)
+      sprintf(value, "%ld", *(signed long *)varptr);
+   else if (type == 4)
+      sprintf(value, "%hu", *(BYTE *)varptr);
+   else if (type == 5)
+      sprintf(value, "%hu", *(USHORT *)varptr);
+   else if (type == 6)
+      sprintf(value, "%lu", *(ULONG *)varptr);
+   else if (type == 8)
+      sprintf(value, "%f", *(float *)varptr);
+   else if (type == 9)
+      sprintf(value, "%f", *(double *)varptr);
+   else if (type == 10)
+      sprintf(value, "%Lf", *(long double *)varptr);
+   else if (type == 16)
+      sprintf(value, "%s", *(char *)varptr ? "TRUE" : "FALSE");
+   else if (type == 17)
+      sprintf(value, "%s", *(short *)varptr ? "TRUE" : "FALSE");
+   else if (type == 18)
+      sprintf(value, "%s", *(long *)varptr ? "TRUE" : "FALSE");
+   else if (type == 20)
+      sprintf(value, "%c", *(char *)varptr);
+   else if (type == 21)
+      sprintf(value, "%hi", *(short *)varptr);
+   else if (type == 22)
+      sprintf(value, "%lc", *(long *)varptr);
+   else if (type == 23)
+      sprintf(value, "void");
+   else if (type >= 32) {
+      ULONG Size,Attr;
+      Size=1;
+      rc=DosQueryMem((void*)*(ULONG *)varptr,&Size,&Attr);
+      if (rc) {
+         sprintf(value, "0x%p invalid", *(ULONG *)varptr);
+      } else {
+         sprintf(value, "0x%p", *(ULONG *)varptr);
+         if (Attr&PAG_FREE) {
+            strcat(value," unallocated memory");
+         } else {
+            if ((Attr&PAG_COMMIT)==0x0U) {
+               strcat(value," uncommited");
+            } /* endif */
+            if ((Attr&PAG_WRITE)==0x0U) {
+               strcat(value," unwritable");
+            } /* endif */
+            if ((Attr&PAG_READ)==0x0U) {
+               strcat(value," unreadable");
+            } /* endif */
+         } /* endif */
+      } /* endif */
+   }
+
+   return value;
+}
+
+/* Search the table of userdef's - return TRUE if found */
+BOOL search_userdefs(ULONG stackofs, USHORT var_no)
+{
+   USHORT pos;
+
+   for(pos = 0; pos < userdef_count && one_userdef[pos].idx != autovar_def[var_no].type_idx; pos++);
+
+   if (pos < userdef_count) {
+      if (one_userdef[pos].type_index >= 0x80 && one_userdef[pos].type_index <= 0xDA) {
+         fprintf(hTrap, "%- 6d %- 20.20s %- 33.33s %s\n",
+                 autovar_def[var_no].stack_offset,
+                 autovar_def[var_no].name,
+                 one_userdef[pos].name,
+                 var_value((void *)(stackofs+autovar_def[var_no].stack_offset),
+                           one_userdef[pos].type_index-0x80));
+         return TRUE;
+      }
+      else /* If the result isn't a simple type, let's act as we didn't find it */
+         return FALSE;
+   }
+
+   return FALSE;
+}
+
+BOOL search_pointers(ULONG stackofs, USHORT var_no)
+{
+   USHORT pos, upos;
+   static BYTE str[35];
+   BYTE   type_index;
+
+   for(pos = 0; pos < pointer_count && one_pointer[pos].idx != autovar_def[var_no].type_idx; pos++);
+
+   if (pos < pointer_count) {
+      if (one_pointer[pos].type_index >= 0x80 && one_pointer[pos].type_index <= 0xDA) {
+         strcpy(str, type_name[one_pointer[pos].type_index-0x80]);
+         strcat(str, " *");
+         fprintf(hTrap, "%- 6d %- 20.20s %- 33.33s %s\n",
+                 autovar_def[var_no].stack_offset,
+                 autovar_def[var_no].name,
+                 str,
+                 var_value((void *)(stackofs+autovar_def[var_no].stack_offset), 32));
+         return TRUE;
+      }
+      else { /* If the result isn't a simple type, look for it in the other lists */
+         for(upos = 0; upos < userdef_count && one_userdef[upos].idx != one_pointer[pos].type_index; upos++);
+
+         if (upos < userdef_count) {
+            strcpy(str, one_userdef[upos].name);
+            strcat(str, " *");
+            fprintf(hTrap, "%- 6d %- 20.20s %- 33.33s %s\n",
+                    autovar_def[var_no].stack_offset,
+                    autovar_def[var_no].name,
+                    str,
+                    var_value((void *)(stackofs+autovar_def[var_no].stack_offset), 32));
+            return TRUE;
+         }
+         else { /* If it isn't a userdef, for now give up and just print as much as we know */
+            sprintf(str, "Pointer to type 0x%X", one_pointer[pos].type_index);
+
+            fprintf(hTrap, "%- 6d %- 20.20s %- 33.33s %s\n",
+                    autovar_def[var_no].stack_offset,
+                    autovar_def[var_no].name,
+                    str,
+                    var_value((void *)(stackofs+autovar_def[var_no].stack_offset), 32));
+
+            return TRUE;
+         }
+      }
+   }
+
+   return FALSE;
+}
+
+void print_vars(ULONG stackofs)
+{
+   USHORT n, pos;
+   BOOL   AutoVarsFound=FALSE;
+
+/*   stackofs += stack_ebp; */
+   if (1 || func_ofs == pubfunc_ofs) { //fixme GKY 1-22-24 why is this here since its always true
+      for(n = 0; n < var_ofs; n++) {
+         if (AutoVarsFound==FALSE) {
+             AutoVarsFound=TRUE;
+             fprintf(hTrap, "List of auto variables at EBP %p in %s:\n",stackofs, func_name);
+             fprintf(hTrap,"Offset Name                 Type                              Value            \n");
+             fprintf(hTrap,"ÄÄÄÄÄÄ ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ\n");
+         }
+
+         /* If it's one of the simple types */
+         if (autovar_def[n].type_idx >= 0x80 && autovar_def[n].type_idx <= 0xDA)
+         {
+            fprintf(hTrap, "%- 6d %- 20.20s %- 33.33s %s\n",
+                    autovar_def[n].stack_offset,
+                    autovar_def[n].name,
+                    type_name[autovar_def[n].type_idx-0x80],
+                    var_value((void *)(stackofs+autovar_def[n].stack_offset),
+                              autovar_def[n].type_idx-0x80));
+         }
+         else { /* Complex type, check if we know what it is */
+            if (!search_userdefs(stackofs, n)) {
+               if (!search_pointers(stackofs, n)) {
+                  fprintf(hTrap, "%- 6d %-20.20s 0x%X\n",
+                                 autovar_def[n].stack_offset,
+                                 autovar_def[n].name,
+                                 autovar_def[n].type_idx);
+               }
+            }
+         }
+      }
+      if (AutoVarsFound==FALSE) {
+          fprintf(hTrap, "  No auto variables found in %s.\n", func_name);
+      }
+      fprintf(hTrap, "\n");
+   }
+}
+
+
+
Index: /tags/CWMM-0.3.0_GA/classes/c/c_common/helper.c
===================================================================
--- /tags/CWMM-0.3.0_GA/classes/c/c_common/helper.c	(revision 213)
+++ /tags/CWMM-0.3.0_GA/classes/c/c_common/helper.c	(revision 213)
@@ -0,0 +1,421 @@
+/*
+ * This file is (C) Chris Wohlgemuth 2001-2005
+ */
+/*
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; see the file COPYING.  If not, write to
+ * the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+/*
+ * If you need another license for your prject/product contact me at
+ *
+ * http://www.os2world.com/cdwriting
+ * http://www.geocities.com/SiliconValley/Sector/5785/
+ */
+#define INCL_BASE
+#define INCL_WIN
+#define INCL_DOS
+#define INCL_DOSERRORS
+
+#include <os2.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+
+#include <stdio.h>
+#include <string.h>
+#include <stdarg.h>
+#include "except.h"
+#include "cwmmdataf.h"
+
+#include "cwaudioinc.h"
+#include "sys_funcs.h"
+
+#ifndef BS_NOTEBOOKBUTTON
+#define BS_NOTEBOOKBUTTON 8L   /* Warp 4 notebook style */
+#endif
+
+#define RESDLLNAME "\\bin\\mmres_%c%c.dll"
+#define DEFRESDLLNAME "\\mmres_en.dll" /* bin directory already appended when used */
+
+extern char classDLLPath[CCHMAXPATH];
+extern char chrInstallDir[CCHMAXPATH];
+extern char resDLLPath[CCHMAXPATH];
+
+HMODULE queryModuleHandle(void);
+void writeLog(const char* chrFormat, ...);
+
+MRESULT EXPENTRY appTerminateHandlerProc(HWND hwnd, ULONG msg, MPARAM mp1, MPARAM mp2);
+
+ULONG launchPMProg(PSZ pszTitle, PSZ wrapperExe, PSZ parameters,  WPObject *thisPtr, ULONG ulView)
+{
+  HWND         hwndNotify;
+  PROGDETAILS pDetails;
+  HAPP         happ;
+  HWND hwndAppTerminateHandler;
+  char startupDir[CCHMAXPATH] = {0};
+  char *chrPtr;
+
+
+  memset(&pDetails, 0, sizeof(pDetails));
+  pDetails.Length          = sizeof(PROGDETAILS);
+  pDetails.progt.progc     = PROG_DEFAULT;
+  pDetails.progt.fbVisible = SHE_VISIBLE;
+  pDetails.pszTitle        = pszTitle;
+  pDetails.pszParameters   = parameters;
+  /* Set the startup directory to the location of the executable */
+  strncpy(startupDir, wrapperExe, sizeof(startupDir) - 1);
+  //  SysWriteToTrapLog("1: %s %s\n", startupDir, wrapperExe);
+  if((chrPtr=strrchr(startupDir,'\\'))!=NULLHANDLE) {
+    *chrPtr=0;
+    pDetails.pszStartupDir   = startupDir;
+    //SysWriteToTrapLog(pDetails.pszStartupDir);
+  }
+  pDetails.pszExecutable   = wrapperExe;
+
+  pDetails.pszEnvironment  = NULLHANDLE;
+  pDetails.swpInitial.fl   = SWP_ACTIVATE|SWP_ZORDER; /* window positioning */
+  //  pDetails.swpInitial.cy   = 0;    /* width of window */
+  //  pDetails.swpInitial.cx   = 0;    /* height of window */
+  //  pDetails.swpInitial.y    = 0;    /* lower edge of window */
+  //  pDetails.swpInitial.x    = 0;    /* left edge of window */
+  pDetails.swpInitial.hwndInsertBehind = HWND_TOP;
+  //  pDetails.swpInitial.hwnd             = 0;
+  //  pDetails.swpInitial.ulReserved1      = 0;
+  //  pDetails.swpInitial.ulReserved2      = 0;
+
+  /* Create an object window which will process the WM_APPTERMINATE message. While processing of this
+   message the view item (see below) will be removed from the inuse list thus removing the inuse emphasis. */
+  hwndAppTerminateHandler=WinCreateWindow(HWND_OBJECT,WC_STATIC,"CWMMAppTerminate",0,0,0,0,0,NULLHANDLE,HWND_BOTTOM,13344,NULL,NULL);
+  if(hwndAppTerminateHandler) {
+    WinSubclassWindow(hwndAppTerminateHandler,&appTerminateHandlerProc);
+    WinSetWindowULong(hwndAppTerminateHandler, QWL_USER,(ULONG)thisPtr);
+  }
+  /* Start the application */
+  if(strstr(strlwr(parameters), "mplayer") /*|| strstr(strlwr(parameters), "ffplay")*/)
+    happ = WinStartApp( hwndAppTerminateHandler, &pDetails, NULL, NULL, SAF_INSTALLEDCMDLINE | SAF_MINIMIZED);
+  else
+    happ = WinStartApp( hwndAppTerminateHandler, &pDetails, NULL, NULL, SAF_INSTALLEDCMDLINE);
+  //happ = WinStartApp( hwndAppTerminateHandler, &pDetails, parameters, NULL, 0);
+  if(happ) {
+    /* Application started. Add the object to inuse list. */
+    ULONG ulError;
+    MMDATAFILEVIEW *pParams=(MMDATAFILEVIEW*)_wpAllocMem(thisPtr,sizeof(MMDATAFILEVIEW), &ulError);
+
+    if(pParams) {
+      /* We have memory */
+      memset((void*)pParams ,0, sizeof(MMDATAFILEVIEW));
+      pParams->pid=0;
+      pParams->thisPtr=thisPtr; /* The object */
+      pParams->viewItem.view=ulView; /* The open view */
+      pParams->useItem.type=USAGE_OPENVIEW; /* We add a view item to the inus list */
+      pParams->viewItem.handle=happ; /* a HAPP seems to work here */
+      if(somIsObj(thisPtr))
+        _wpAddToObjUseList(thisPtr, &pParams->useItem); /* add to inuse list */
+    }
+  }
+  return happ;
+}
+
+
+void writeLog(const char* chrFormat, ...)
+{
+  char logNameLocal[CCHMAXPATH];
+  FILE *fHandle;
+
+  sprintf(logNameLocal,"d:\\cwmm.log");
+  fHandle=fopen(logNameLocal,"a");
+  if(fHandle) {
+    va_list arg_ptr;
+    void *tb;
+
+    va_start (arg_ptr, chrFormat);
+    vfprintf(fHandle, chrFormat, arg_ptr);
+    va_end (arg_ptr);
+    //    fprintf(fHandle,logText);
+    fclose(fHandle);
+  }
+}
+
+/* Get the handle of our resource DLL */
+HMODULE queryResModuleHandle(void)
+{
+  static ULONG hModule=0;
+
+  if(!hModule)
+    {
+
+      if(queryModuleHandle())
+        {
+          char *chrPtr;
+          PSZ pszLang="";
+          char* found;
+          APIRET rc;
+
+          /* Got class dll */
+          /* Get install dir (base dir) */
+          strncpy(resDLLPath, chrInstallDir, sizeof(resDLLPath));
+          resDLLPath[sizeof(resDLLPath)-1]=0; /* Paranoia */
+
+          /* Now get language */
+          do
+            {
+              char buf[CCHMAXPATH];
+              /* Get Language var */
+              if(NO_ERROR!=DosScanEnv("LANG", &pszLang))
+                break;
+
+              /* Skip leading spaces */
+              chrPtr=pszLang;
+              while(*chrPtr==' ')
+                chrPtr++;
+
+              /* Check if value seems to be valid. The var must be something like xx_XX thus length is 5 */
+              if(strlen(chrPtr)<5)
+                break;
+
+              /* Extract the first two chars */
+              sprintf(buf, RESDLLNAME, chrPtr[0], chrPtr[1]);
+              strcat(resDLLPath,buf);
+              /* Insert message in Logfile */
+              //  HlpWriteToTrapLog("Using the following DLL path: ");
+              //  HlpWriteToTrapLog(resDLLPath);
+              //  HlpWriteToTrapLog("\n");
+
+              rc=DosLoadModule(buf,sizeof(buf), resDLLPath, &hModule);
+              if(rc==NO_ERROR)
+                break;
+
+              /* Insert message in Logfile */
+              //  writeLog("Ressource-DLL for the current countrycode not found. Trying to load default one (CDFLD001.DLL).\n");
+
+              /* NLS DLL not found. Try to load default */
+              found=strrchr(resDLLPath,'\\');
+              if(!found)
+                break;
+
+              *found=0;
+
+              strcat(resDLLPath, DEFRESDLLNAME);
+              // HlpWriteToTrapLog("Using the following DLL path: ");
+              //   HlpWriteToTrapLog(resDLLPath);
+              //   HlpWriteToTrapLog("\n");
+
+              rc=DosLoadModule(buf,sizeof(buf), resDLLPath, &hModule);
+              if(rc!=NO_ERROR) {
+                //        writeLog("Can't load DLL!\n");
+                hModule=NULLHANDLE;
+              }
+              else {
+                //writeLog("Ressource DLL loaded.\n");
+              }
+
+              break;
+            }while(TRUE);
+        }
+    }
+   return hModule;
+ }
+
+ /* Get the HMODULE of the MM class DLL */
+HMODULE queryModuleHandle(void)
+{
+  PSZ moduleName;
+  static ULONG hModule=0;
+  somId mySomId;
+
+  if(!hModule)
+    {
+      char *chrPtr;
+      ULONG ulObj, ulBufLen, ulOffset;
+      char thePath[CCHMAXPATH];
+
+      if(DosQueryModFromEIP( &hModule,
+                             &ulObj,
+                             CCHMAXPATH,
+                             thePath,
+                             &ulOffset,
+                             (ULONG)queryModuleHandle )!=NO_ERROR) {
+        SysWriteToTrapLog("Can't get module handle for CWMM class DLL!\n");
+        hModule=0;
+        return NULLHANDLE; /* Error */
+      }
+#if 0
+    /*
+      Sometimes the returned name isn't correct. To prevent loading a bunch of classes just
+      to get the module handle the following is replaced by the undocumented DosQueryModFromEIP()
+      call. Maybe this even fixes some deadlocks people had during WPS startup with the classes
+      because now the WPS isn't urged to load all classes at once.
+     */
+
+      mySomId=somIdFromString("M_MMImage");
+      moduleName=_somLocateClassFile(SOMClassMgrObject, mySomId, 1, 1);
+      /* The above function sometimes returns the class name instead of the dll name.
+         I suspect it's because with DTS there's no dllname modifier to tell SOM
+         the name. But why does it sometimes work??
+         To circumvent the problem not having a module handle we try this function for
+         the other classnames again hoping that one of the calls is succesful (until now
+         it is). */
+      SOMFree(mySomId);
+      if( DosQueryModuleHandle(moduleName, &hModule))
+        {
+          mySomId=somIdFromString("MMImage");
+          moduleName=_somLocateClassFile(SOMClassMgrObject, mySomId, 1, 1);
+          SOMFree(mySomId);
+          if( DosQueryModuleHandle(moduleName, &hModule))
+            {
+              mySomId=somIdFromString("M_MMAudio");
+              moduleName=_somLocateClassFile(SOMClassMgrObject, mySomId, 1, 1);
+              SOMFree(mySomId);
+              if( DosQueryModuleHandle(moduleName, &hModule))
+                {
+                  mySomId=somIdFromString("M_MMAVC");
+                  moduleName=_somLocateClassFile(SOMClassMgrObject, mySomId, 1, 1);
+                  SOMFree(mySomId);
+                  DosQueryModuleHandle(moduleName, &hModule);
+                }
+            }
+        }
+      strncpy(classDLLPath,moduleName, sizeof(classDLLPath));
+      classDLLPath[sizeof(classDLLPath)-1]=0;
+
+      /* Get install dir */
+      strncpy(chrInstallDir,moduleName, sizeof(chrInstallDir));
+      chrInstallDir[sizeof(chrInstallDir)-1]=0;
+      if((chrPtr=strrchr(chrInstallDir,'\\'))!=NULLHANDLE)
+        *chrPtr=0;
+#endif
+
+      /* Get module name. */
+      if(!DosQueryModuleName(hModule,sizeof(chrInstallDir),chrInstallDir)) {
+        strncpy(classDLLPath,chrInstallDir, sizeof(classDLLPath));
+        classDLLPath[sizeof(classDLLPath)-1]=0;
+
+        /* Get install dir */
+        if((chrPtr=strrchr(chrInstallDir,'\\'))!=NULLHANDLE)
+          *chrPtr=0;
+      }
+    }/* if(!hModule) */
+  return hModule;
+}
+
+
+PSZ queryModuleName(void)
+{
+  if(queryModuleHandle())
+    return classDLLPath;
+
+  return NULLHANDLE;
+}
+
+PSZ queryInstallDir(void)
+{
+  if(queryModuleHandle())
+    return chrInstallDir;
+
+  return NULLHANDLE;
+}
+
+/* MMCLS_INI_FILE_NAME = "\\cwmm.ini" See ...\common.h */
+PSZ _queryMMClassIniFile(void)
+{
+  static char iniName[CCHMAXPATH]= {0};
+
+  if(iniName[0]==0) {
+    /* Default is INI file in users home dir */
+    if(SysQueryHomeDir(iniName, sizeof(iniName))) {
+      strlcat(iniName, MMCLS_INI_FILE_NAME, sizeof(iniName)); /* MMCLS_INI_FILE_NAME = "\\CWMM.INI" */
+      return iniName;
+    }
+
+    sprintf(iniName, "%s\\bin%s", queryInstallDir(), MMCLS_INI_FILE_NAME);
+  }
+
+  return iniName;
+}
+
+BOOL cwMoveNotebookButtonsWarp4(HWND hwndDlg, USHORT usID, USHORT usDelta)
+{
+  if(SysQueryOSRelease()>=40) {
+    HENUM henum;
+    HWND hwnd;
+
+    /* Move the default notebook buttons */
+    if((henum=WinBeginEnumWindows(hwndDlg))!=NULLHANDLE) {
+      while((hwnd=WinGetNextWindow(henum))!=NULLHANDLE) {
+        if(WinQueryWindowUShort(hwnd,QWS_ID)<=usID)
+          WinSetWindowBits(hwnd, QWL_STYLE,
+                           BS_NOTEBOOKBUTTON, BS_NOTEBOOKBUTTON);
+        else {
+          SWP swp;
+          POINTL ptl= {0};
+          ptl.y=usDelta;
+
+          WinMapDlgPoints(hwndDlg, &ptl, 1, TRUE);
+          /* Move all other controls */
+          if(WinQueryWindowPos(hwnd, &swp))
+            WinSetWindowPos(hwnd, NULLHANDLE, swp.x, swp.y-ptl.y,0,0, SWP_MOVE);
+        }
+      }
+      WinEndEnumWindows(henum);
+    }
+  }
+  return TRUE;
+}
+
+void HlpSendCommandToObject(char* chrObject, char* command)
+{
+  HOBJECT hObject;
+
+  hObject=WinQueryObject(chrObject);
+  if(hObject!=NULLHANDLE) {
+    WinSetObjectData(hObject, command);
+  }
+}
+
+#if 0
+void HlpOpenWebPage(char* chrUrl)
+{
+  HOBJECT hObject;
+  char tempDir[CCHMAXPATH];
+  char setup[CCHMAXPATH*2];
+
+  if(HlpQueryTempDir(chrInstallDir, tempDir, sizeof(tempDir)))
+    {
+      snprintf(setup, sizeof(setup), "LOCATOR=%s;%s", chrUrl, "OPEN=DEFAULT");
+      WinCreateObject("WPUrl","tempUrl", setup, tempDir,
+                      CO_UPDATEIFEXISTS);
+        /* WinDestroyObject(hObject); Don't use it, blocks PM */
+    }
+}
+
+/* This function checks if the given file exists */
+ULONG checkFileSize(char* chrFileName)
+{
+  struct stat statBuf;
+
+  /* Check file path */
+  if(stat(chrFileName , &statBuf)==-1)
+    return 0;
+
+  return statBuf.st_size;
+}
+#endif
+
+
+
+
+
+
+
+
+
Index: /tags/CWMM-0.3.0_GA/classes/c/c_common/makefile
===================================================================
--- /tags/CWMM-0.3.0_GA/classes/c/c_common/makefile	(revision 213)
+++ /tags/CWMM-0.3.0_GA/classes/c/c_common/makefile	(revision 213)
@@ -0,0 +1,10 @@
+# Makefile
+
+OBJECTS	= 
+
+all:
+	cd ../. && make
+
+clean:
+	rm *.*~
+
Index: /tags/CWMM-0.3.0_GA/classes/c/c_common/message.c
===================================================================
--- /tags/CWMM-0.3.0_GA/classes/c/c_common/message.c	(revision 213)
+++ /tags/CWMM-0.3.0_GA/classes/c/c_common/message.c	(revision 213)
@@ -0,0 +1,58 @@
+/*
+ * (C) Chris Wohlgemuth 2001-2003
+ *
+ */
+/*
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; see the file COPYING.  If not, write to
+ * the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+/*
+ * If you need another license for your project/product contact me at
+ * 
+ * http://www.os2world.com/cdwriting
+ * http://www.geocities.com/SiliconValley/Sector/5785/
+ */
+#define INCL_PM
+
+#include <os2.h>
+#include <stdio.h>
+
+#include "message_funcs.h"
+
+/* Show a messagebox with the text ulIDText and title ulIDTitle loaded from
+   the resource DLL */
+ULONG showMsgBox(ULONG ulIDTitle, ULONG ulIDText, HMODULE hModule)
+{
+  char text[256];
+  char title[100];
+  
+  return messageBox(  text, ulIDText , sizeof(text),
+               title, ulIDTitle, sizeof(title),
+               hModule, HWND_DESKTOP, MB_OK | MB_MOVEABLE | MB_ERROR);
+};
+
+ULONG showMsgBox2(ULONG ulIDTitle, ULONG ulIDText, HMODULE hModule, ULONG ulFlag)
+{
+  char text[256];
+  char title[100];
+  
+  return messageBox(  text, ulIDText , sizeof(text),
+               title, ulIDTitle, sizeof(title),
+               hModule, HWND_DESKTOP, ulFlag);
+};
+
+
+
+
+
Index: /tags/CWMM-0.3.0_GA/classes/c/c_common/mmrexx.c
===================================================================
--- /tags/CWMM-0.3.0_GA/classes/c/c_common/mmrexx.c	(revision 213)
+++ /tags/CWMM-0.3.0_GA/classes/c/c_common/mmrexx.c	(revision 213)
@@ -0,0 +1,274 @@
+/*
+ * (C) Chris Wohlgemuth 2002-2003
+ *
+ */
+/*
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; see the file COPYING.  If not, write to
+ * the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+/*
+ * If you need another license for your project/product contact me at
+ * 
+ * http://www.os2world.com/cdwriting
+ * http://www.geocities.com/SiliconValley/Sector/5785/
+ */
+
+#define INCL_REXXSAA
+#define INCL_PM
+#define INCL_DOS
+
+#include <os2.h>
+#include <stdio.h>
+#include "except.h"
+#include <rexxsaa.h>                   /* needed for Rexx */
+#include "cwmmdataf.h"
+#include "cwaudioinc.h"
+#include "sys_funcs.h"
+
+PSZ queryInstallDir(void);
+
+typedef ULONG (APIENTRY   FNWPSFUNC)(WPObject* ,...);
+typedef FNWPSFUNC *PFNWPSFUNC;
+
+
+BOOL getStringFromRexxScript(PSZ rexxFile, char* chrResult, ULONG ulSize)
+{
+
+  RXSTRING arg[1];                       /* argument string for REXX  */
+  RXSTRING rexxretval;                /* return value from REXX    */
+  APIRET   rc;                        /* return code from REXX     */
+  SHORT    rexxrc = 0;                /* return code from function */
+  char theScript[CCHMAXPATH];  
+  /* By setting the strlength of the output RXSTRING to zero, we   */
+  /* force the interpreter to allocate memory and return it to us. */
+  /* We could provide a buffer for the interpreter to use instead. */
+  rexxretval.strlength = 0L;          /* initialize return to empty*/
+  
+  
+  sprintf(theScript, "%s\\bin\\%s", queryInstallDir(), rexxFile);
+
+  TRY_LOUD(RX_START) {
+    /* Here we call the interpreter.  We don't really need to use    */
+    /* all the casts in this call; they just help illustrate         */
+    /* the data types used.                                          */
+    rc=RexxStart((LONG)       0,             /* number of arguments   */
+                 (PRXSTRING)  &arg,          /* array of arguments    */
+                 (PSZ)        theScript,/* name of REXX file     */
+                 (PRXSTRING)  0,             /* No INSTORE used       */
+                 (PSZ)        "CWRXX",         /* Command env. name     */
+                 (LONG)       RXSUBROUTINE,  /* Code for how invoked  */
+                 (PRXSYSEXIT) 0,             /* No EXITs on this call */
+                 (PSHORT)     &rexxrc,       /* Rexx program output   */
+                 (PRXSTRING)  &rexxretval ); /* Rexx program output   */
+
+
+#if 0
+    if(rc) {
+      sprintf(text,"Error in the Rexx skript %s\n\n Get more information with 'help REX%04d'.\n", 
+              tPt->rexxSkript, rc*-1);
+      WinMessageBox(HWND_DESKTOP, HWND_DESKTOP, text, "", 1234, MB_OK|MB_MOVEABLE|MB_ERROR);
+    }
+#endif
+    if(!rc) {
+      if(ulSize>rexxretval.strlength) {
+        strncpy(chrResult, rexxretval.strptr, rexxretval.strlength);
+        chrResult[rexxretval.strlength]=0;
+      }
+      else
+        strncpy(chrResult, rexxretval.strptr, ulSize);
+      chrResult[ulSize-1]=0;
+    }
+    if(rexxretval.strptr)
+      DosFreeMem(rexxretval.strptr);          /* Release storage given to us by REXX.  */      
+  }
+  CATCH(RX_START)
+    {}END_CATCH;
+    return TRUE;
+}
+
+void parameterError(char *chrMethod, ULONG ulReq, ULONG ulActual)
+{
+  char text[200];
+  sprintf(text, "%s(): wrong count of parameters. Required: %d, actual: %d",
+          chrMethod, ulReq, ulActual);
+
+  WinMessageBox(HWND_DESKTOP, HWND_DESKTOP, text, "Method error",
+                1234, MB_OK|MB_MOVEABLE);
+  
+}
+
+void wpObjectError(char *chrMethod)
+{
+  char text[200];
+  sprintf(text, "%s(): object pointer is not valid.", chrMethod);
+
+  WinMessageBox(HWND_DESKTOP, HWND_DESKTOP, text, "Object error",
+                1234, MB_OK|MB_MOVEABLE);
+  
+}
+
+
+#define HASHSIZE 101
+ULONG calculateHash(char * theString)
+{
+  ULONG ulHash=0;
+
+  if(theString)
+    for(ulHash=0;*theString!='\0'; theString++)
+      ulHash=*theString+31*ulHash;
+  
+  return ulHash%HASHSIZE;
+}
+
+#define HASHSIZE2 123
+ULONG calculateHash2(char * theString)
+{
+  ULONG ulHash=0;
+
+  if(theString)
+    for(ulHash=0;*theString!='\0'; theString++)
+      ulHash=*theString+37*ulHash;
+  
+  return ulHash%HASHSIZE;
+}
+
+/*
+  This function will be registered in the wpclsInitData() of MMDataFile
+ */
+
+/* This function handles new WPS functions introduced by private classes */
+ULONG EXPENTRY rxCallCWMMFunc(PSZ name, LONG argc, RXSTRING argv[], PSZ queuename,PRXSTRING retstring)
+{
+  ULONG ulHash;
+  ULONG ulReturn;
+  WPObject* wpObject;
+
+  /* At least WPObject* and name of method */
+  if(argc<2)
+    return 40;
+
+  /*  TRY_LOUD(RX) {*/
+    /* Get a hash for the methodname for the switch() statement */
+    ulHash=calculateHash(argv[0].strptr)<<8;
+    ulHash+=calculateHash2(argv[0].strptr);
+    ulReturn=0;
+
+    wpObject=(WPObject*)atol(argv[1].strptr);
+    /* Check if it's a valid object */
+    if(somIsObj(wpObject)) {
+      PFNWPSFUNC procAddr;
+
+      /* Try to find the requested method */
+      if((procAddr=(PFNWPSFUNC) somResolveByName(wpObject, argv[0].strptr))==NULL) {
+        /* method not found */
+        sprintf(retstring->strptr, "ERROR_METHOD:");
+        retstring->strlength=strlen(retstring->strptr);
+      }
+      else {
+        switch(ulHash)
+          {
+            //          case 0x2e0e: /* mmQueryTrackInfo */ /* New generic name with V0.2.5 */
+          case 0x2a1b: /* cwmmQueryTrackInfo */
+            {
+              ULONG ulParam1;
+
+              if(argc<3) {
+                parameterError(argv[0].strptr, 3 , argc);
+                ulReturn=40;
+                break;
+              }
+
+              ulParam1=atol(argv[2].strptr);/* ulWhich */
+
+              switch(ulParam1)
+                {
+                case IDINFO_PLAYTIME:
+                case IDINFO_BPS:
+                case IDINFO_CHANNELS:
+                case IDINFO_SAMPLERATE:
+                case IDINFO_BITRATE:
+                  sprintf(retstring->strptr,"%d",procAddr(wpObject, NULLHANDLE, 0, ulParam1));
+                  break;
+                case IDINFO_NAME:
+                case IDINFO_ARTIST:
+                case IDINFO_GENRE:
+                case IDINFO_YEAR:
+                  /* Maximum length of the returned value is 256 bytes (default retstring length) */
+                  if(!procAddr(wpObject, retstring->strptr, retstring->strlength, ulParam1))
+                    sprintf(retstring->strptr,"ERROR:");
+                  break;
+                default:
+                  {
+                    if(!procAddr(wpObject, retstring->strptr, retstring->strlength, ulParam1))
+                      //if(!procAddr(wpObject, text, 100, ))
+                      sprintf(retstring->strptr,"ERROR:");
+                    }
+                }
+              retstring->strlength=strlen(retstring->strptr);
+              break;
+            }
+          case 0x220f: /* cwmmQueryImageInfo New with V0.2.5 */
+            //          case 0x0502: /* mmQueryImageInfo */ /* New with V0.2.5 */
+            {
+              ULONG ulParam1;
+                           
+              if(argc<3) {
+                parameterError(argv[0].strptr, 3 , argc);
+                ulReturn=40;
+                break;
+              }
+              
+              ulParam1=atol(argv[2].strptr);/* ulWhich */
+
+              switch(ulParam1)
+                {
+                case IDINFO_WIDTH:
+                case IDINFO_HEIGHT:
+                case IDINFO_BPP:
+                  sprintf(retstring->strptr,"%d",procAddr(wpObject, NULLHANDLE, 0, ulParam1));
+                  break;
+                default:
+                  if(!procAddr(wpObject, &retstring->strptr, retstring->strlength, ulParam1))
+                    sprintf(retstring->strptr,"ERROR:");
+                }
+              retstring->strlength=strlen(retstring->strptr);
+              break;
+            }
+          default:
+            ulReturn=40;        
+          }/* switch */
+      }/* else if((procAddr=(PFNWPSFUNC) somResolveByName(wpObject, argv[1].strptr))==NULL) */
+    }/* if(somIsObj(wpObject)) */
+    else {
+      /* wpObject is not valid */
+      wpObjectError(argv[0].strptr);
+
+      ulReturn=40;
+    }
+
+    /*  }
+        CATCH(RX)
+        {}END_CATCH;*/
+    return ulReturn;
+}
+
+
+/*
+
+0x2e0e:  mmQueryTrackInfo  New generic name with V0.2.5 
+0x2a1b:  cwmmQueryTrackInfo
+
+0x0502: mmQueryImageInfo New with V0.2.5 
+0x220f: cwmmQueryImageInfo New with V0.2.5 
+ */
Index: /tags/CWMM-0.3.0_GA/classes/c/c_common/som_and_wps.c
===================================================================
--- /tags/CWMM-0.3.0_GA/classes/c/c_common/som_and_wps.c	(revision 213)
+++ /tags/CWMM-0.3.0_GA/classes/c/c_common/som_and_wps.c	(revision 213)
@@ -0,0 +1,378 @@
+/*
+ * (C) Chris Wohlgemuth 2002-2003
+ *
+ */
+/*
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; see the file COPYING.  If not, write to
+ * the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
+ */          
+/*
+ * If you need another license for your project/product (commercial,
+ * noncommercial, whatever) contact me at
+ * 
+ * http://www.os2world.com/cdwriting
+ * http://www.geocities.com/SiliconValley/Sector/5785/
+ *
+ */
+
+#define INCL_GPIBITMAPS
+#define INCL_PM
+#define INCL_DOSDEVIOCTL
+#define INCL_DOS
+
+#include <os2.h>
+#include <stdio.h>
+/* Include file with definition for WPShadow class */
+#include "wpshadow.h"
+#include "wpdisk.h"
+#include "wpfsys.h" /* For _wpQueryDisk */
+#include "cwaudioinc.h"
+#include "sys_funcs.h"
+
+#define MM_INVALID_DRIVES      "mmClsDontCheckDrives"
+#define MM_INVALID_ID3DRIVES   "mmClsDontReadID3OnDrives"
+
+BOOL cwQueryCDDrives(int *iNumCD, int * iFirstDrive);
+HFILE openDrive(char* drive);
+void closeDrive(HFILE hfDrive);
+
+#if 0
+/* The following is also used by CWMMDisk so it can't be made static. */
+int iFirstCD;
+int iNumCD;
+BOOL bGotCD=FALSE;
+#endif
+
+/* List of drives to be skipped during audio scanning. */
+/* 1: skip, 0: scan.                                   */
+static char chrInvalidDrives[26]= {0};
+/* List of drives on which no ID3 tags should be read. */
+/* 1: skip, 0: read.                                   */
+static char chrInvalidID3Drives[26]= {0};
+/* List of CD drives in the system. */
+/* 0: other disk, 1: CD drive, 2: not yet queried */
+static char chrCDDrives[26]= {2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2};
+
+#if 0
+static BOOL _queryCDOnce(void)
+{
+  static BOOL bTriedCD=FALSE;
+
+  /* Only search for CDs once to speed up things */
+  if(!bTriedCD) {
+    bTriedCD=TRUE; /* Don't search for CDs again */ 
+    /* Get CD drives */
+    if(cwQueryCDDrives(&iNumCD, &iFirstCD)) {
+      int a;
+      bGotCD=TRUE;
+#if 0
+      /* Invalidate drive letter in chrValidDrives[] list */
+      for(a=iFirstCD;a<iFirstCD+iNumCD; a++) {
+        chrInvalidDrives[a-1]=1;
+        //SysWriteToTrapLog(" %d\n",a-1 );      
+      }
+#endif
+    }
+  }
+  return TRUE;
+}
+#endif
+
+void invalidateDriveInList(ULONG ulDriveNum)
+{
+  if(ulDriveNum<1 || ulDriveNum>26)
+    return;
+
+  chrCDDrives[ulDriveNum-1]=2;
+}
+
+/*****************************************************/
+/*                                                   */
+/* Check if the drive is a CD. Iinsert the           */
+/* result into the static var.                       */
+/*                                                   */
+/* ulDriveNum:  1: a:, 2: b: ...                     */
+/*                                                   */
+/*****************************************************/
+ULONG checkForCDDrive(ULONG ulDriveNum)
+{
+  //int a;
+
+  if(ulDriveNum<1 || ulDriveNum>26)
+    return 2;
+
+  //for(a=0;a<26; a++)
+  //SysWriteToTrapLog("%d ", chrCDDrives[a]);
+
+  // SysWriteToTrapLog("\n%s: %d\n", __FUNCTION__, chrCDDrives[ulDriveNum-1]);
+
+  if(chrCDDrives[ulDriveNum-1]!=2)
+    return chrCDDrives[ulDriveNum-1];
+
+  if(SysQueryDriveType(ulDriveNum)==QDT_REMOVABLE_DISK)
+    {
+      /* It's a removable disk (floppy, CD-Rom or other) */
+      char chrPlayerID[4];
+      ULONG rc;
+      HFILE hFile;
+  
+      sprintf(chrPlayerID, "%c:", 'A'+ulDriveNum-1);
+      /* Try to open the drive */
+      if((hFile=openDrive(chrPlayerID))!=NULLHANDLE) {
+        ULONG ulParamLen;
+        ULONG ulDataLen;
+        ULONG ulData;
+        
+        ulParamLen=4;
+        ulDataLen=sizeof(ulData);
+        rc = DosDevIOCtl(hFile, IOCTL_CDROMDISK, CDROMDISK_DEVICESTATUS,
+                         "CD01", 4, &ulParamLen, &ulData,
+                         sizeof(ulData), &ulDataLen);
+        if(!rc)
+          chrCDDrives[ulDriveNum-1]=1; /* It's a CD drive */
+        else
+          chrCDDrives[ulDriveNum-1]=0; /* Other drive */
+        closeDrive(hFile);
+      }
+      else
+        chrCDDrives[ulDriveNum-1]=2; /* Open failed, maybe no CD inserted yet.
+                                        Mark as undetermined */
+    }
+  else
+    chrCDDrives[ulDriveNum-1]=0; /* It's not a CD drive */
+
+  //SysWriteToTrapLog("Drive determined as: %d\n", chrCDDrives[ulDriveNum-1]);
+  return chrCDDrives[ulDriveNum-1];
+}
+
+/*****************************************************/
+/*                                                   */
+/* Mostly obsolete now because of function           */
+/* cwObjectIsOnInvalidDrive() which is more generic. */
+/*                                                   */
+/*****************************************************/
+BOOL cwObjectIsOnCD(WPObject * somSelf)
+{
+  WPDisk *wpDisk;
+  int iDiskNum;
+
+  //  SysWriteToTrapLog("In %s\n", __FUNCTION__);
+  
+  if((wpDisk=_wpQueryDisk(somSelf))!=NULLHANDLE) {
+    //SysWriteToTrapLog("Got disk object...\n");
+   if((iDiskNum=_wpQueryLogicalDrive(wpDisk))!=0) {
+     //SysWriteToTrapLog("Disk num: %d, status: %d\n", iDiskNum, chrCDDrives[iDiskNum-1]);
+      if(chrCDDrives[iDiskNum-1]==2)
+        checkForCDDrive(iDiskNum);
+      if(chrCDDrives[iDiskNum-1]==1) {
+        //SysWriteToTrapLog("Object is on CD\n\n");
+        return TRUE; /* The object is on a CD */
+      }
+    }
+  }
+  //  SysWriteToTrapLog("Leaving %s, object is not on CD\n", __FUNCTION__);
+  return FALSE; /* Object not on CD */
+}
+#if 0
+BOOL cwObjectIsOnCD(WPObject * somSelf)
+{
+  /* Get the CD drives in the system */ 
+  _queryCDOnce();
+
+  if(bGotCD) {
+    WPDisk *wpDisk;
+    int iDiskNum;
+    
+    if((wpDisk=_wpQueryDisk(somSelf))!=NULLHANDLE) {
+      if((iDiskNum=_wpQueryLogicalDrive(wpDisk))!=0) {
+        if((iDiskNum>=iFirstCD && iDiskNum<=iFirstCD+iNumCD)) {
+          return TRUE; /* The object is on a CD */
+        }
+      }
+    }
+  }
+  return FALSE; /* Object not on CD */
+}
+#endif
+
+/*****************************************************/
+/*                                                   */
+/* Check key in USER ini specifying which volumes    */
+/* should be skipped when querying ID3 tags.         */
+/*                                                   */
+/* Key is:                                           */
+/*                                                   */
+/* CWMM->mmClsDontCheckID3OnDrives-><drive list>     */
+/*                                                   */
+/* The drive list is a string containing the drive   */
+/* letters to ignore.                                */
+/*                                                   */
+/*****************************************************/
+static BOOL _queryInvalidID3Drives(void)
+{
+  static BOOL bQueriedID3Drives=FALSE;
+
+  if(!bQueriedID3Drives)
+    {
+      char chrProfileStr[30];
+      char * chrPtr;
+
+      /* Only query once */
+      bQueriedID3Drives=TRUE;
+      if(!PrfQueryProfileString(HINI_USERPROFILE, "CWMM", MM_INVALID_ID3DRIVES, NULLHANDLE, chrProfileStr, 
+                                sizeof(chrProfileStr)))
+        return FALSE; /* Key not set, use all drives */
+      strcpy(chrProfileStr,strlwr(chrProfileStr));
+      chrPtr=chrProfileStr;
+
+      while(*chrPtr!=0 && *chrPtr>='a' && *chrPtr<='z')
+        chrInvalidID3Drives[(*chrPtr++)-'a']=1;
+
+    }
+  return TRUE;
+}
+
+BOOL cwObjectIsOnInvalidID3Drive(WPObject * somSelf)
+{
+  WPDisk *wpDisk;
+  int iDiskNum;
+
+  /* Get invalid drives list */
+  _queryInvalidID3Drives();
+      
+  if((wpDisk=_wpQueryDisk(somSelf))!=NULLHANDLE) {
+    if((iDiskNum=_wpQueryLogicalDrive(wpDisk))!=0)
+      return chrInvalidID3Drives[iDiskNum-1]; 
+  }  
+  return FALSE; /* Object not on invalid drive */
+}
+
+/*****************************************************/
+/*                                                   */
+/* Check key in USER ini specifying which volumes    */
+/* should be skipped when querying audio info.       */
+/*                                                   */
+/* Key is:                                           */
+/*                                                   */
+/* CWMM->mmClsDontCheckDrives-><drive list>          */
+/*                                                   */
+/* The drive list is a string containing the drive   */
+/* letters to ignore.                                */
+/*                                                   */
+/*****************************************************/
+static BOOL _queryInvalidDrives(void)
+{
+  static BOOL bQueriedDrives=FALSE;
+
+  if(!bQueriedDrives)
+    {
+      char chrProfileStr[30];
+      char * chrPtr;
+
+      /* Only query once */
+      bQueriedDrives=TRUE;
+      if(!PrfQueryProfileString(HINI_USERPROFILE, "CWMM", MM_INVALID_DRIVES, NULLHANDLE, chrProfileStr, 
+                                sizeof(chrProfileStr)))
+        return FALSE; /* Key not set, use all drives */
+      strcpy(chrProfileStr,strlwr(chrProfileStr));
+      chrPtr=chrProfileStr;
+
+      while(*chrPtr!=0 && *chrPtr>='a' && *chrPtr<='z')
+        chrInvalidDrives[(*chrPtr++)-'a']=1;
+      //SysWriteToTrapLog("%c: -> %d\n",*chrPtr, (*chrPtr++)-'a' );      
+
+    }
+  return TRUE;
+}
+
+BOOL cwObjectIsOnInvalidDrive(WPObject * somSelf)
+{
+  WPDisk *wpDisk;
+  int iDiskNum;
+
+  /* Get invalid drives list */
+  _queryInvalidDrives();
+      
+  if((wpDisk=_wpQueryDisk(somSelf))!=NULLHANDLE) {
+    if((iDiskNum=_wpQueryLogicalDrive(wpDisk))!=0) {
+      return chrInvalidDrives[iDiskNum-1]; 
+    }
+  }
+  
+  return FALSE; /* Object not on invalid drive */
+}
+
+BOOL mmclsSetObjectType(WPFileSystem * somSelf)
+{
+  char chrBuf[256];
+  ULONG ulLength;
+
+  M_WPObject *m_wpObject=_somGetClass(somSelf);
+
+  /* Set type if not already done */
+  strncpy(chrBuf, _wpQueryType(somSelf), sizeof(chrBuf));
+  chrBuf[sizeof(chrBuf)-1]=0;
+  
+  if(!strstr(chrBuf, _wpclsQueryInstanceType(m_wpObject))) {
+    ulLength=strlen(chrBuf);
+    if(ulLength) {
+      if(ulLength+6 < sizeof(chrBuf)) {
+        strcat(chrBuf, "\n");
+        strcat(chrBuf, _wpclsQueryInstanceType(m_wpObject));
+      }
+      //  HlpWriteToTrapLog("1 %s\n", chrBuf);
+    }
+    else
+      strcpy(chrBuf, _wpclsQueryInstanceType(m_wpObject));
+    //   HlpWriteToTrapLog("2 %s\n", chrBuf);
+  }
+  _wpSetType(somSelf, chrBuf , NULL);
+  return TRUE;
+}
+
+BOOL mmclsCreateTheDefaultTemplate(M_WPObject *somSelf, 
+                                   WPObject* Folder)
+{
+  char chrSetup[120];
+  WPFolder* wpFolder;
+  //  char *chrPtr;
+
+  sprintf(chrSetup, "<MMPM2_MM%sTEMPLATE>", _wpclsQueryInstanceType(somSelf));
+
+#if 0
+  HlpWriteToTrapLog("%s\n", chrSetup);
+  chrPtr=chrSetup;
+  /* Remove spaces in id */
+  while(*chrPtr!=0)
+    {
+      if(*chrPtr==' ')
+        *chrPtr='_';
+      chrPtr++;
+    };
+#endif
+
+  if(WinQueryObject(chrSetup))
+    return TRUE; /* There's already a template */
+
+  sprintf(chrSetup, "TEMPLATE=YES;NODELETE=YES;OBJECTID=<MMPM2_MM%sTEMPLATE>;", _wpclsQueryInstanceType(somSelf));
+  wpFolder=_wpclsQueryFolder(somSelf, MMTEMPLATE_FOLDER_ID, FALSE);
+  _wpclsNew(somSelf, _wpclsQueryTitle(somSelf), chrSetup, wpFolder,FALSE);
+
+  return TRUE;
+}
+
+
+
+
+
Index: /tags/CWMM-0.3.0_GA/classes/c/c_image/bitmap.c
===================================================================
--- /tags/CWMM-0.3.0_GA/classes/c/c_image/bitmap.c	(revision 213)
+++ /tags/CWMM-0.3.0_GA/classes/c/c_image/bitmap.c	(revision 213)
@@ -0,0 +1,589 @@
+/*
+ * (C) Chris Wohlgemuth 2001-2003
+ *
+ */
+/*
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; see the file COPYING.  If not, write to
+ * the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
+ */          
+/*
+ * If you need another license for your project/product (commercial,
+ * noncommercial, whatever) contact me at
+ * 
+ * http://www.os2world.com/cdwriting
+ * http://www.geocities.com/SiliconValley/Sector/5785/
+ *
+ */
+#define INCL_DOS
+#define INCL_GPI
+#define INCL_PM
+#define INCL_MMIOOS2
+#include <os2.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include "mmioos2.h"
+#include "mmres.h"
+#include "sys_funcs.h"
+
+//#define DEBUG
+
+extern HAB globalHab;
+ULONG showMsgBox(ULONG ulIDTitle, ULONG ulIDText, HMODULE hModule);
+void writeLog(char* chrFormat, ...);
+HMODULE queryModuleHandle(void);
+void HlpWriteToTrapLog(const char* chrFormat, ...);
+ULONG _checkFileSize(char* chrFileName);
+
+BOOL getBmpInfoHeader(PBITMAPINFOHEADER2  bmpih2, PSZ pszFileName, char* procName, ULONG ulLength, BOOL *bNoIOProcAvailable)
+{
+    MMIOINFO      mmioinfo;
+    MMFORMATINFO  mmFormatInfo;
+    HMMIO         hmmio;
+    ULONG         ulImageHeaderLength;
+    MMIMAGEHEADER mmImgHdr;
+    FOURCC        fccStorageSystem;
+    FOURCC        fccIOProc;
+    ULONG         ulReturnCode;
+    ULONG ulBytesRead;
+    char *pName;
+    
+    procName[0]=0;
+
+#ifdef DEBUG
+    HlpWriteToTrapLog("In getBmpInfoHeader(), trying to identify file: %s\n",
+                      pszFileName);
+#endif
+
+    /* Check file size */
+    if(SysQueryFileSize(pszFileName)==0)
+      return FALSE; /* File is empty at the moment, so return without reading. */
+    
+    ulReturnCode = mmioIdentifyFile ( pszFileName,
+                                      0L,
+                                      &mmFormatInfo,
+                                      &fccStorageSystem,
+                                      0L,
+                                      0L);
+    /*
+     *  If this file was NOT identified, then this function won't
+     *  work, so return an error by indicating an empty bitmap.
+     */
+    if ( ulReturnCode == MMIO_ERROR )
+      {
+#ifdef DEBUG
+        HlpWriteToTrapLog("In getBmpInfoHeader(), mmioIdentifyFile failed, file: %s\n",
+                 pszFileName);
+#endif
+        /* Disabled, because when copying via WPS we end here before the image is available  */
+        //   showMsgBox(IDSTR_CWIMAGETITLE, IDSTR_NOIMGIOPROCERROR, queryModuleHandle());
+        //*bNoIOProcAvailable=TRUE;
+        return (0L);
+      }
+
+#ifdef DEBUG
+    HlpWriteToTrapLog("In getBmpInfoHeader(), file identified\n");
+#endif
+
+    /*
+     *  If mmioIdentifyFile did not find a custom-written IO proc which
+     *  can understand the image file, then it will return the DOS IO Proc
+     *  info because the image file IS a DOS file.
+     */
+    if( mmFormatInfo.fccIOProc == FOURCC_DOS )
+    {
+#ifdef DEBUG
+    HlpWriteToTrapLog("In getBmpInfoHeader(),  mmFormatInfo.fccIOProc == FOURCC_DOS, file: %s\n",
+             pszFileName);
+#endif
+
+    //    showMsgBox(IDSTR_CWIMAGETITLE, IDSTR_NOIMGIOPROCERROR, queryModuleHandle());
+    *bNoIOProcAvailable=TRUE;
+      return ( 0L );
+    }
+
+    /*
+     *  Ensure this is an IMAGE IOproc, and that it can read
+     *  translated data
+     */
+    if ( (mmFormatInfo.ulMediaType != MMIO_MEDIATYPE_IMAGE) ||
+         ((mmFormatInfo.ulFlags & MMIO_CANREADTRANSLATED) == 0) )
+    {
+#ifdef DEBUG
+    HlpWriteToTrapLog("In getBmpInfoHeader(),  mmFormatInfo check, file: %s\n",
+             pszFileName);
+#endif
+    /* Disabled, because it fails for templates */
+    //      showMsgBox(IDSTR_CWIMAGETITLE, IDSTR_NOIMGIOPROCERROR, queryModuleHandle());
+    *bNoIOProcAvailable=TRUE;
+      return (0L);
+    }
+    else
+    {
+         fccIOProc = mmFormatInfo.fccIOProc;
+    }
+
+#ifdef DEBUG
+    HlpWriteToTrapLog("In getBmpInfoHeader(), trying to get IO-Proc-Name...\n");
+#endif
+
+    if((pName=malloc(mmFormatInfo.lNameLength+1))!=NULLHANDLE)
+      {
+        LONG lBytesRead;
+        ulReturnCode = mmioGetFormatName(&mmFormatInfo, pName, &lBytesRead, 0,0);
+	if(ulReturnCode)
+	  {
+	  SysWriteToTrapLog("bitmap.c: %s %u\n\n", pName, ulReturnCode);
+          }
+        strncpy(procName, pName, ulLength-1);
+        free(pName);
+      }
+
+#ifdef DEBUG
+    HlpWriteToTrapLog("In getBmpInfoHeader(), trying to open the file...\n");
+#endif
+
+    /* Clear out and initialize mminfo structure */
+    memset ( &mmioinfo, 0L, sizeof ( MMIOINFO ) );
+    mmioinfo.fccIOProc = fccIOProc;
+    mmioinfo.ulTranslate = MMIO_TRANSLATEHEADER | MMIO_TRANSLATEDATA;
+    /*!!!!!!!!!!!!!!!!!!!!!!*/
+
+
+    hmmio = mmioOpen ( (PSZ) pszFileName,
+                       &mmioinfo,
+                       MMIO_READ | MMIO_DENYWRITE | MMIO_NOIDENTIFY );
+   
+    if ( ! hmmio )
+    {
+      // If file could not be opened, return with error
+      //      showMsgBox(IDSTR_CWIMAGETITLE, IDSTR_OPENFILEERROR, queryModuleHandle());
+      return (0L);
+    }
+
+#ifdef DEBUG
+    HlpWriteToTrapLog("In getBmpInfoHeader(), now querying header length...\n");
+#endif
+
+    ulReturnCode = mmioQueryHeaderLength ( hmmio,
+                                         (PLONG)&ulImageHeaderLength,
+                                           0L,
+                                           0L);
+    if ( ulImageHeaderLength != sizeof ( MMIMAGEHEADER ) )
+    {
+         /* We have a problem.....possibly incompatible versions */
+         ulReturnCode = mmioClose (hmmio, 0L);
+         //      showMsgBox(IDSTR_CWIMAGETITLE, IDSTR_NOIMGIOPROCERROR, queryModuleHandle());
+         return (0L);
+    }
+
+#ifdef DEBUG
+    HlpWriteToTrapLog("In getBmpInfoHeader(), now querying header...\n");
+#endif
+
+    ulReturnCode = mmioGetHeader ( hmmio,
+                                   &mmImgHdr,
+                                   (LONG) sizeof ( MMIMAGEHEADER ),
+                                   (PLONG)&ulBytesRead,
+                                   0L,
+                                   0L);
+
+    if ( ulReturnCode != MMIO_SUCCESS )
+    {
+      /* Header unavailable */
+      ulReturnCode = mmioClose (hmmio, 0L);
+      //   showMsgBox(IDSTR_CWIMAGETITLE, IDSTR_NOIMGIOPROCERROR, queryModuleHandle());
+      return (0L);
+    }
+
+    memcpy(bmpih2, &mmImgHdr.mmXDIBHeader.BMPInfoHeader2,
+           sizeof(BITMAPINFOHEADER2)+256*sizeof(RGB2) );
+    ulReturnCode = mmioClose (hmmio, 0L);
+    return TRUE;
+}
+
+
+
+HBITMAP loadBitmap ( PSZ pszFileName, PBITMAPINFOHEADER2 pBMPInfoHeader2)
+{
+    HBITMAP       hbm;
+    MMIOINFO      mmioinfo;
+        MMFORMATINFO  mmFormatInfo;
+    HMMIO         hmmio;
+    // ULONG         ulImageHeaderLength;
+        //        MMIMAGEHEADER mmImgHdr;
+    ULONG         ulBytesRead;
+    ULONG         dwNumRowBytes;
+    PBYTE         pRowBuffer;
+    ULONG         dwRowCount;
+    SIZEL         ImageSize;
+    ULONG         dwHeight, dwWidth;
+    SHORT          wBitCount;
+    FOURCC        fccStorageSystem;
+    ULONG         dwPadBytes;
+    ULONG         dwRowBits;
+    ULONG         ulReturnCode;
+    HBITMAP       hbReturnCode;
+    LONG          lReturnCode;
+    FOURCC        fccIOProc;
+    HDC           hdc;
+    HPS           hps;
+
+
+    ulReturnCode = mmioIdentifyFile ( pszFileName,
+                                      0L,
+                                      &mmFormatInfo,
+                                      &fccStorageSystem,
+                                      0L,
+                                      0L);
+    /*
+     *  If this file was NOT identified, then this function won't
+     *  work, so return an error by indicating an empty bitmap.
+     */
+    if ( ulReturnCode == MMIO_ERROR )
+    {
+      //      showMsgBox(IDSTR_CWIMAGETITLE, IDSTR_NOIMGIOPROCERROR, queryModuleHandle());
+      return (0L);
+    }
+    /*
+     *  If mmioIdentifyFile did not find a custom-written IO proc which
+     *  can understand the image file, then it will return the DOS IO Proc
+     *  info because the image file IS a DOS file.
+     */
+    if( mmFormatInfo.fccIOProc == FOURCC_DOS )
+    {
+      //      showMsgBox(IDSTR_CWIMAGETITLE, IDSTR_NOIMGIOPROCERROR, queryModuleHandle());
+      return ( 0L );
+    }
+    /*
+     *  Ensure this is an IMAGE IOproc, and that it can read
+     *  translated data
+     */
+    if ( (mmFormatInfo.ulMediaType != MMIO_MEDIATYPE_IMAGE) ||
+         ((mmFormatInfo.ulFlags & MMIO_CANREADTRANSLATED) == 0) )
+    {
+      //      showMsgBox(IDSTR_CWIMAGETITLE, IDSTR_NOIMGIOPROCERROR, queryModuleHandle());
+      return (0L);
+    }
+    else
+    {
+         fccIOProc = mmFormatInfo.fccIOProc;
+    }
+
+    /* Clear out and initialize mminfo structure */
+    memset ( &mmioinfo, 0L, sizeof ( MMIOINFO ) );
+    mmioinfo.fccIOProc = fccIOProc;
+    mmioinfo.ulTranslate = MMIO_TRANSLATEHEADER | MMIO_TRANSLATEDATA;
+    hmmio = mmioOpen ( (PSZ) pszFileName,
+                       &mmioinfo,
+                       MMIO_READ | MMIO_DENYWRITE | MMIO_NOIDENTIFY );
+    if ( ! hmmio )
+    {
+      // If file could not be opened, return with error
+      //    showMsgBox(IDSTR_CWIMAGETITLE, IDSTR_OPENFILEERROR, queryModuleHandle());
+      return (0L);
+    }
+
+#if 0
+    dwReturnCode = mmioQueryHeaderLength ( hmmio,
+                                         (PLONG)&ulImageHeaderLength,
+                                           0L,
+                                           0L);
+    if ( ulImageHeaderLength != sizeof ( MMIMAGEHEADER ) )
+    {
+      /* We have a problem.....possibly incompatible versions */
+      ulReturnCode = mmioClose (hmmio, 0L);
+      //      showMsgBox(IDSTR_CWIMAGETITLE, IDSTR_NOIMGIOPROCERROR);
+      return (0L);
+    }
+
+    ulReturnCode = mmioGetHeader ( hmmio,
+                                   &mmImgHdr,
+                                   (LONG) sizeof ( MMIMAGEHEADER ),
+                                   (PLONG)&ulBytesRead,
+                                   0L,
+                                   0L);
+
+    if ( ulReturnCode != MMIO_SUCCESS )
+    {
+      /* Header unavailable */
+      ulReturnCode = mmioClose (hmmio, 0L);
+      //      showMsgBox(IDSTR_CWIMAGETITLE, IDSTR_NOIMGIOPROCERROR);
+      return (0L);
+    }
+#endif
+    /*!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!*/
+#if 0
+    /*
+     *  Determine the number of bytes required, per row.
+     *      PLANES MUST ALWAYS BE = 1
+     */
+    dwHeight = mmImgHdr.mmXDIBHeader.BMPInfoHeader2.cy;
+    dwWidth = mmImgHdr.mmXDIBHeader.BMPInfoHeader2.cx;
+    wBitCount = mmImgHdr.mmXDIBHeader.BMPInfoHeader2.cBitCount;
+    dwRowBits = dwWidth * mmImgHdr.mmXDIBHeader.BMPInfoHeader2.cBitCount;
+    dwNumRowBytes = dwRowBits >> 3;
+#endif
+
+    /*
+     *  Determine the number of bytes required, per row.
+     *      PLANES MUST ALWAYS BE = 1
+     */
+    dwHeight = pBMPInfoHeader2->cy;
+    dwWidth = pBMPInfoHeader2->cx;
+    wBitCount = pBMPInfoHeader2->cBitCount;
+    dwRowBits = dwWidth * pBMPInfoHeader2->cBitCount;
+    dwNumRowBytes = dwRowBits >> 3;
+
+    /*
+     *  Account for odd bits used in 1bpp or 4bpp images that are
+     *  NOT on byte boundaries.
+     */
+    if ( dwRowBits % 8 )
+    {
+         dwNumRowBytes++;
+    }
+    /*
+     *  Ensure the row length in bytes accounts for byte padding.
+     *  All bitmap data rows must are aligned on LONG/4-BYTE boundaries.
+     *  The data FROM an IOProc should always appear in this form.
+     */
+    dwPadBytes = ( dwNumRowBytes % 4 );
+    if ( dwPadBytes )
+    {
+         dwNumRowBytes += 4 - dwPadBytes;
+    }
+
+    /* Allocate space for ONE row of pels */
+    if ( DosAllocMem( (PPVOID)&pRowBuffer,
+                      (ULONG)dwNumRowBytes,
+                      fALLOC))
+    {
+      ulReturnCode = mmioClose (hmmio, 0L);
+      //    showMsgBox(IDSTR_CWIMAGETITLE, IDSTR_NOMEMERROR, queryModuleHandle());
+      return(0L);
+    }
+
+    /* Create a device context */
+    hdc=DevOpenDC(globalHab, OD_MEMORY,"*",0L, NULL, NULLHANDLE);
+    if(hdc==NULLHANDLE)
+      {
+        DosFreeMem(pRowBuffer);
+        mmioClose (hmmio, 0L);
+        return(0L);
+      }
+    
+
+    // ***************************************************
+    // Create a memory presentation space that includes
+    // the memory device context obtained above.
+    // ***************************************************
+    
+    ImageSize.cx = dwWidth;
+    ImageSize.cy = dwHeight;
+
+    hps = GpiCreatePS ( globalHab,
+                        hdc,
+                        &ImageSize,
+                        PU_PELS | GPIT_NORMAL | GPIA_ASSOC );
+    //                        PU_PELS | GPIF_DEFAULT | GPIT_MICRO | GPIA_ASSOC );
+    if ( !hps )
+      {
+#ifdef DEBUG
+        WinMessageBox( HWND_DESKTOP, HWND_DESKTOP,
+                       "No HPS...",
+                       "Open Image File",
+                       (HMODULE) NULL,
+                       (ULONG) MB_OK | MB_MOVEABLE |
+                       MB_ERROR );
+#endif   
+        DevCloseDC(hdc);
+        DosFreeMem(pRowBuffer);
+        mmioClose (hmmio, 0L);
+        return(0L);
+      }
+
+    //    GpiSelectPalette(hps, NULLHANDLE);
+    // ***************************************************
+    // Create an uninitialized bitmap.  This is where we
+    // will put all of the bits once we read them in.
+    // ***************************************************
+    hbm = GpiCreateBitmap ( hps,
+                            pBMPInfoHeader2,
+                            0L,
+                            NULL,
+                            NULL);
+
+    if ( !hbm )
+    {
+#ifdef DEBUG
+      WinMessageBox( HWND_DESKTOP, HWND_DESKTOP,
+                     "No HBITMAP...",
+                     "Open Image File",
+                     (HMODULE) NULL,
+                     (ULONG) MB_OK | MB_MOVEABLE |
+                     MB_ERROR );
+#endif
+      GpiDestroyPS(hps);
+      DevCloseDC(hdc);
+      DosFreeMem(pRowBuffer);
+      ulReturnCode = mmioClose (hmmio, 0L);
+      return(0L);
+    }
+
+    // ***************************************************
+    // Select the bitmap into the memory device context.
+    // ***************************************************
+    hbReturnCode = GpiSetBitmap ( hps,
+                                  hbm );
+
+    //***************************************************************
+    //  LOAD THE BITMAP DATA FROM THE FILE
+    //      One line at a time, starting from the BOTTOM
+    //*************************************************************** */
+
+    for ( dwRowCount = 0; dwRowCount < dwHeight; dwRowCount++ )
+    {
+         ulBytesRead = (ULONG) mmioRead ( hmmio,
+                                          pRowBuffer,
+                                          dwNumRowBytes );
+         if ( !ulBytesRead )
+         {
+              break;
+         }
+         /*
+          *  Allow context switching while previewing.. Couldn't get
+          *  it to work. Perhaps will get to it when time is available...
+          */
+         lReturnCode = GpiSetBitmapBits ( hps,
+                                          (LONG) dwRowCount,
+                                          (LONG) 1,
+                                          (PBYTE) pRowBuffer,
+                                          (PBITMAPINFO2) pBMPInfoHeader2);
+    }
+
+    /* Clean up */
+    hbReturnCode = GpiSetBitmap ( hps,
+                                  NULLHANDLE );
+    ulReturnCode = mmioClose (hmmio, 0L);
+    DosFreeMem(pRowBuffer);
+    GpiDestroyPS(hps);
+    DevCloseDC(hdc);
+
+    return(hbm);
+}
+
+HBITMAP createNewBitmap ( HBITMAP hbm,
+                          PBITMAPINFOHEADER2 pBmpInfoHeader2,
+                          ULONG ulWidth, 
+                          ULONG ulHeight, 
+                          BOOL* pbQuitEarly)
+{
+  HBITMAP       hbmTarget;
+  SIZEL         ImageSize;
+  HBITMAP       hbReturnCode;
+  HDC           hdc;
+  HPS           hps;
+  BITMAPINFOHEADER2 bmpih2;
+  POINTL aptl[4];
+
+  if(!ulWidth || !ulHeight)
+    return 0L;
+
+    /* Create a device context */
+    hdc=DevOpenDC(globalHab, OD_MEMORY,"*",0L, NULL, NULLHANDLE);
+    if(hdc==NULLHANDLE)
+      {
+        return(0L);
+      }
+    
+    // ***************************************************
+    // Create a memory presentation space that includes
+    // the memory device context obtained above.
+    // ***************************************************
+    ImageSize.cx = ulWidth;
+    ImageSize.cy = ulHeight;
+    hps = GpiCreatePS ( globalHab,
+                        hdc,
+                        &ImageSize,
+                        PU_PELS | GPIT_NORMAL | GPIA_ASSOC );
+    if ( !hps )
+      {
+#ifdef DEBUG
+        WinMessageBox( HWND_DESKTOP, HWND_DESKTOP,
+                       "No HPS...",
+                       "Create new bitmap",
+                       (HMODULE) NULL,
+                       (ULONG) MB_OK | MB_MOVEABLE |
+                       MB_ERROR );
+#endif   
+        DevCloseDC(hdc);
+        return(0L);
+      }
+    //    GpiSelectPalette(hps, NULLHANDLE);
+
+    /* Now scale the bitmap */
+    memcpy(&bmpih2, pBmpInfoHeader2, sizeof(BITMAPINFOHEADER2));    
+
+    bmpih2.cx=ulWidth;
+    bmpih2.cy=ulHeight;
+    bmpih2.cbImage=(((ulWidth*(1<<bmpih2.cPlanes)*(1<<bmpih2.cBitCount))+31) /32)*ulHeight;
+    // ***************************************************
+    // Create an uninitialized bitmap.  This is where we
+    // ***************************************************
+
+    hbmTarget = GpiCreateBitmap ( hps,
+                                  &bmpih2,
+                                  0L,
+                                  NULL,
+                                  NULL);
+    if ( !hbmTarget )
+      {
+#ifdef DEBUG
+      WinMessageBox( HWND_DESKTOP, HWND_DESKTOP,
+                     "No target HBITMAP...",
+                     "Create new bitmap",
+                     (HMODULE) NULL,
+                     (ULONG) MB_OK | MB_MOVEABLE |
+                     MB_ERROR );
+#endif
+      GpiDestroyPS(hps);
+      DevCloseDC(hdc);
+      return(0L);
+    }
+
+    /* Blit it */
+    hbReturnCode = GpiSetBitmap ( hps,
+                                  hbmTarget );
+    
+    /*GpiBltBit*/
+    aptl[0].x=0;
+    aptl[0].y=0;
+    aptl[1].x=ulWidth;
+    aptl[1].y=ulHeight;
+    aptl[2].x=0;
+    aptl[2].y=0;
+    aptl[3].x=pBmpInfoHeader2->cx;
+    aptl[3].y=pBmpInfoHeader2->cy;
+
+    GpiWCBitBlt(hps, hbm,4L, aptl, ROP_SRCCOPY, BBO_IGNORE);
+
+    hbReturnCode = GpiSetBitmap( hps, NULLHANDLE );
+    GpiDestroyPS(hps);
+    DevCloseDC(hdc);
+    return(hbmTarget);
+}
+
+
+
Index: /tags/CWMM-0.3.0_GA/classes/c/c_image/cwavc.c
===================================================================
--- /tags/CWMM-0.3.0_GA/classes/c/c_image/cwavc.c	(revision 213)
+++ /tags/CWMM-0.3.0_GA/classes/c/c_image/cwavc.c	(revision 213)
@@ -0,0 +1,132 @@
+/*
+ * (C) Chris Wohlgemuth 2002-2004
+ *
+ */
+/*
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; see the file COPYING.  If not, write to
+ * the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
+ */          
+/*
+ * If you need another license for your project/product (commercial,
+ * noncommercial, whatever) contact me at
+ * 
+ * http://www.os2world.com/cdwriting
+ * http://www.geocities.com/SiliconValley/Sector/5785/
+ *
+ */
+
+/*
+ *  This file was generated by the SOM Compiler and Emitter Framework.
+ *  Generated using: 
+ *      SOM Emitter emitctm: 2.42
+ */
+
+#ifndef SOM_Module_cwavc_Source
+#define SOM_Module_cwavc_Source
+#endif
+#define CWAVC_Class_Source
+#define M_CWAVC_Class_Source
+
+#include <os2.h>
+#include "helpid.h"
+#include "cwavc.ih"
+
+extern char chrHelpLibrary[CCHMAXPATH];
+
+HMODULE queryResModuleHandle(void);
+HMODULE queryModuleHandle(void);
+BOOL getMessage(char* text,ULONG ulID, LONG lSizeText, HMODULE hResource,HWND hwnd);
+
+/*
+ * The prototype for cwavcM_wpclsQueryInstanceType was replaced by the following prototype:
+ */
+SOM_Scope PSZ  SOMLINK cwavcM_wpclsQueryInstanceType(M_MMAVC *somSelf)
+{
+    /* M_CWAVCData *somThis = M_CWAVCGetData(somSelf); */
+    M_MMAVCMethodDebug("M_MMAVC","cwavcM_wpclsQueryInstanceType");
+
+    return "AVC Image";
+}
+
+/*
+ * The prototype for cwavcM_wpclsQueryInstanceFilter was replaced by the following prototype:
+ */
+SOM_Scope PSZ  SOMLINK cwavcM_wpclsQueryInstanceFilter(M_MMAVC *somSelf)
+{
+    /* M_CWAVCData *somThis = M_CWAVCGetData(somSelf); */
+    M_MMAVCMethodDebug("M_MMAVC","cwavcM_wpclsQueryInstanceFilter");
+
+    return "*._IM";
+}
+
+/*
+ * The prototype for cwavcM_wpclsQueryDefaultHelp was replaced by the following prototype:
+ */
+SOM_Scope BOOL  SOMLINK cwavcM_wpclsQueryDefaultHelp(M_MMAVC *somSelf, 
+                                                     PULONG pHelpPanelId, 
+                                                     PSZ pszHelpLibrary)
+{
+    /* M_CWAVCData *somThis = M_CWAVCGetData(somSelf); */
+    M_MMAVCMethodDebug("M_MMAVC","cwavcM_wpclsQueryDefaultHelp");
+
+    if(pHelpPanelId)
+      *pHelpPanelId=AVCFILE_HELP_PANEL;
+    if(pszHelpLibrary)
+      strncpy(pszHelpLibrary, chrHelpLibrary, CCHMAXPATH);
+    return TRUE; 
+}
+
+
+/*
+ * The prototype for cwavcM_wpclsQueryTitle was replaced by the following prototype:
+ */
+SOM_Scope PSZ  SOMLINK cwavcM_wpclsQueryTitle(M_MMAVC *somSelf)
+{
+  static char chrTitle[20]={0};
+    /* M_CWAVCData *somThis = M_CWAVCGetData(somSelf); */
+    M_MMAVCMethodDebug("M_MMAVC","cwavcM_wpclsQueryTitle");
+
+    if(chrTitle[0]==0)
+      if(!getMessage(chrTitle, IDSTR_AVCTITLE, sizeof(chrTitle), queryResModuleHandle(), HWND_DESKTOP))
+        strcpy(chrTitle,"AVCImage.AVC");
+
+    return chrTitle;
+}
+
+/*
+ * The prototype for cwavcM_wpclsQueryIconData was replaced by the following prototype:
+ */
+SOM_Scope ULONG  SOMLINK cwavcM_wpclsQueryIconData(M_MMAVC *somSelf, 
+                                                   PICONINFO pIconInfo)
+{
+  HMODULE hmod;
+
+    /* M_CWAVCData *somThis = M_CWAVCGetData(somSelf); */
+    M_MMAVCMethodDebug("M_MMAVC","cwavcM_wpclsQueryIconData");
+
+    hmod=queryModuleHandle();
+    if(!hmod)
+      return M_MMAVC_parent_M_MMImage_wpclsQueryIconData(somSelf, pIconInfo);
+
+	if (pIconInfo)   {
+      pIconInfo->fFormat = ICON_RESOURCE;
+      pIconInfo->hmod    = hmod;
+      pIconInfo->resid   = ID_ICONAVCFILE;
+	} /* endif */
+
+	return ( sizeof(ICONINFO) );
+}
+
+
+
Index: /tags/CWMM-0.3.0_GA/classes/c/c_image/cwbmp.c
===================================================================
--- /tags/CWMM-0.3.0_GA/classes/c/c_image/cwbmp.c	(revision 213)
+++ /tags/CWMM-0.3.0_GA/classes/c/c_image/cwbmp.c	(revision 213)
@@ -0,0 +1,914 @@
+/*
+ * (C) Chris Wohlgemuth 2002-2004
+ *
+ */
+/*
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; see the file COPYING.  If not, write to
+ * the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+/*
+ * If you need another license for your project/product (commercial,
+ * noncommercial, whatever) contact me at
+ * 
+ * http://www.os2world.com/cdwriting
+ * http://www.geocities.com/SiliconValley/Sector/5785/
+ *
+ */
+/*
+ *  This file was generated by the SOM Compiler and Emitter Framework.
+ *  Generated using: 
+ *      SOM Emitter emitctm: 2.42
+ */
+
+#ifndef SOM_Module_cwbmp_Source
+#define SOM_Module_cwbmp_Source
+#endif
+#define CWBitmap_Class_Source
+#define M_CWBitmap_Class_Source
+
+#define INCL_DOS
+#define INCL_PM
+#define INCL_MMIOOS2
+#include <os2.h>
+#include <stdio.h>
+#include "mmioos2.h"
+
+#include "cwbmp.ih"
+#include "except.h"
+//#include "cwmmres.h"
+#include "mmres.h"
+#include "cwaudioinc.h"
+
+#include "sys_funcs.h"
+
+#define STR_BITMAPNAME   "Bitmap"
+
+extern PSZ pszImageColTitles[NUM_IMAGE_DETAILS_FIELDS];
+
+extern CLASSFIELDINFO cfiImageFieldInfo[NUM_IMAGE_DETAILS_FIELDS];
+
+extern LONG  lNumIOProcs;
+extern PMMFORMATINFO g_pmmFormatInfoArray;
+
+HMODULE queryResModuleHandle(void);
+HMODULE queryModuleHandle(void);
+BOOL insertIOProcMenuItems( HWND hwndMenu );
+ULONG launchPMProg(PSZ pszTitle, PSZ wrapperExe, PSZ parameters,  WPObject *thisPtr, ULONG ulView);
+BOOL getMessage(char* text,ULONG ulID, LONG lSizeText, HMODULE hResource,HWND hwnd);
+BOOL getBmpInfoHeader(PBITMAPINFOHEADER2  bmpih2, PSZ pszFileName, char* procName, ULONG ulLength, BOOL *bNoIOProcAvailable);
+HBITMAP loadBitmap ( PSZ pszFileName, PBITMAPINFOHEADER2 pBMPInfoHeader2);
+HBITMAP createNewBitmap ( HBITMAP hbm,
+                          PBITMAPINFOHEADER2 pBmpInfoHeader2,
+                          ULONG ulWidth, 
+                          ULONG ulHeight, 
+                          BOOL* pbQuitEarly);
+BOOL checkImageIOProc(char * chrExt);
+BOOL mmclsCreateTheDefaultTemplate(M_WPObject *somSelf, 
+                                   WPObject* Folder);
+MRESULT menuInsertMenuSeparator(HWND hwndMenu, HWND hwndSubMenu, SHORT sPosition );
+
+MRESULT EXPENTRY bmpInfoDlgProc(HWND hwnd, ULONG msg, MPARAM mp1, MPARAM mp2)
+{
+  MMBitmap *cwImage;
+
+  switch(msg) {
+  case WM_INITDLG :
+    cwImage=(MMBitmap*)LONGFROMMP(mp2);
+    if(somIsObj(cwImage)) {
+      //      CWBitmapData *somThis = CWBitmapGetData(cwImage);
+
+      PBITMAPINFOHEADER2 pbmpih2;
+
+      if((pbmpih2=(PBITMAPINFOHEADER2) _cwmmQueryBitmapInfoHeader(cwImage))!=NULLHANDLE)
+        {
+          char fName[CCHMAXPATH];
+          char chrTemplate[100];
+
+          if(pbmpih2->cbFix==sizeof(BITMAPINFOHEADER2)) {
+            if(!getMessage(chrTemplate, IDSTR_SPRINTFPIXEL, sizeof(chrTemplate), 
+                           queryResModuleHandle(), hwnd))
+              strcpy(chrTemplate, "%d Pixel");
+            sprintf(fName, chrTemplate,pbmpih2->cx);
+            WinSetWindowText(WinWindowFromID(hwnd, IDST_IMAGEWIDTH),fName);
+            
+            sprintf(fName, chrTemplate, pbmpih2->cy);
+            WinSetWindowText(WinWindowFromID(hwnd, IDST_IMAGEHEIGHT),fName);
+
+            if(!getMessage(chrTemplate, IDSTR_SPRINTFBIT, sizeof(chrTemplate), 
+                       queryResModuleHandle(), hwnd))
+              strcpy(chrTemplate, "%d Bit");
+            sprintf(fName, chrTemplate, pbmpih2->cBitCount);
+            WinSetWindowText(WinWindowFromID(hwnd, IDST_COLORDEPTH),fName);
+          }
+          else if(pbmpih2->cbFix==sizeof(BITMAPINFOHEADER)) {
+            /* We shouldn't get a BITMAPINFOHEADER here but who knows...*/
+            PBITMAPINFOHEADER pbmpih=(PBITMAPINFOHEADER)pbmpih2;
+            if(!getMessage(chrTemplate, IDSTR_SPRINTFPIXEL, sizeof(chrTemplate), 
+                       queryResModuleHandle(), hwnd))
+              strcpy(chrTemplate, "%d Pixel");
+            
+            sprintf(fName, chrTemplate,pbmpih->cx);
+            WinSetWindowText(WinWindowFromID(hwnd, IDST_IMAGEWIDTH),fName);
+            
+            sprintf(fName, chrTemplate, pbmpih->cy);
+            WinSetWindowText(WinWindowFromID(hwnd, IDST_IMAGEHEIGHT),fName);
+
+            if(!getMessage(chrTemplate, IDSTR_SPRINTFBIT, sizeof(chrTemplate), 
+                           queryResModuleHandle(), hwnd))
+              strcpy(chrTemplate, "%d Bit");
+            sprintf(fName, chrTemplate, pbmpih->cBitCount);
+            WinSetWindowText(WinWindowFromID(hwnd, IDST_COLORDEPTH),fName);
+          }
+          
+          WinSetWindowText(WinWindowFromID(hwnd, IDST_IMAGEFORMAT), STR_BITMAPNAME);
+        }
+    }/* somIsObj() */
+    return (MRESULT)TRUE;
+    /* This prevents switching the notebook page behind the open folder */
+    case WM_WINDOWPOSCHANGED:
+      {
+        MRESULT mr;
+
+        if(WinQueryFocus(HWND_DESKTOP)!=
+           WinQueryWindow(WinQueryWindow(hwnd, QW_PARENT), QW_PARENT)) {
+          mp2=MPFROMLONG(LONGFROMMP(mp2)|0x80000);/*AWP_ACTIVATE 0x00080000L*/
+          mr=WinDefDlgProc(hwnd, msg, mp1, mp2);
+          return mr;  
+        }
+        break;
+      }
+    case WM_FOCUSCHANGE:
+      {
+        if(!SHORT1FROMMP(mp2)) {
+          if(HWNDFROMMP(mp1)==hwnd) {
+            MRESULT mr;
+
+            mr=WinDefDlgProc(hwnd, msg, mp1, mp2);
+            WinSendMsg(WinQueryWindow(WinQueryWindow(hwnd, QW_PARENT), QW_PARENT), 
+                       WM_SETFOCUS, MPFROMHWND(hwnd), (MPARAM)TRUE);
+            return mr;
+          }
+        }
+        break;
+      }
+    case WM_DESTROY:
+      /* The notebook closes and gets destroyed */
+      /* Set focus to desktop to prevent PM freeze */
+      WinSetFocus(HWND_DESKTOP, HWND_DESKTOP);
+      break;
+  default:
+    break;
+  }
+  return WinDefDlgProc(hwnd, msg, mp1, mp2);
+}
+
+
+
+/*
+ * The prototype for cwbmp_cwmmAddImageInformationPage was replaced by the following prototype:
+ */
+SOM_Scope ULONG  SOMLINK cwbmp_cwmmAddImageInformationPage(MMBitmap *somSelf, 
+                                                           HWND hwndNotebook)
+{
+  PAGEINFO pageinfo;
+  char pageName[100];
+
+    /* CWBitmapData *somThis = CWBitmapGetData(somSelf); */
+    MMBitmapMethodDebug("MMBitmap","cwbmp_cwmmAddImageInformationPage");
+
+  //Clear the pageinfo structure
+  memset((PCH)&pageinfo, 0, sizeof(PAGEINFO));
+  //Fill the pageinfo structure
+  pageinfo.cb = sizeof(PAGEINFO);
+  pageinfo.hwndPage = NULLHANDLE;
+  pageinfo.usPageStyleFlags = BKA_MAJOR | BKA_STATUSTEXTON;
+  pageinfo.usPageInsertFlags = BKA_FIRST;
+  //We want page numbers
+  pageinfo.usSettingsFlags = SETTINGS_PAGE_NUMBERS;
+  //The dialog procedure for this page
+  pageinfo.pfnwp = bmpInfoDlgProc;
+  //The resource DLL
+  pageinfo.resid = queryResModuleHandle();
+  //pageinfo.resid = queryModuleHandle();
+  //The ID of the dialog template
+  pageinfo.dlgid = IDDLG_IMAGEINFOPAGE;
+  //pageinfo.dlgid = IDDLG_WAVEINFOPAGE;
+  //We need a pointer to our WPS-object in the dialog procedure
+  //to call class functions
+  pageinfo.pCreateParams = somSelf;
+  //The ID of the help panel for this page
+  //pageinfo.idDefaultHelpPanel = IDDLG_GENERAL2PAGE;
+
+  //Tell the WPS the help library name
+  pageinfo.pszHelpLibraryName = NULLHANDLE;
+  //We have a major tab so we need a name
+  /* pageName: "ISO filesystem" */
+  if(!getMessage(pageName, IDSTR_IMAGEINFOPAGENAME, sizeof(pageName),  queryResModuleHandle(), hwndNotebook))
+    strcpy(pageName, "~Image information");
+  pageinfo.pszName = pageName;
+  //Insert the page into the settings notebook
+  return _wpInsertSettingsPage(somSelf,hwndNotebook,&pageinfo);
+}
+
+/* This private function is for creating a small bitmap handle. It loads the bitmap
+   and creates the small bitmap but *does not* keep the original size bitmap.
+   If using _wpQueryBitmapHandle() the object would keep (the maybe huge) original
+   size bitmap in memory until going dormant. This would eat up all memory rather fast. */
+static HBITMAP  cwQueryBitmapHandle(MMBitmap *somSelf, 
+                                 ULONG ulWidth, 
+                                 ULONG ulHeight)
+{
+  ULONG ulSize;
+  char chrName[CCHMAXPATH];
+  BOOL bGotHeader=FALSE;
+  HBITMAP hbm=NULLHANDLE;
+  HBITMAP hbm2;
+  
+  MMBitmapData *somThis = MMBitmapGetData(somSelf); 
+  //   CWImageMethodDebug("CWBitmap","cwimg_wpQueryBitmapHandle");
+  
+  if(ulWidth==0 || ulHeight==0)
+    return NULLHANDLE;
+  
+  ulSize=sizeof(chrName);
+  if(!_wpQueryRealName(somSelf, chrName, &ulSize,TRUE))
+    return NULLHANDLE;
+
+    
+  TRY_LOUD(LOAD_BMP3) {
+    if(_cwmmQueryBitmapInfoHeader(somSelf))
+      bGotHeader=TRUE;
+  }
+  CATCH(LOAD_BMP3)
+    {
+#if 0
+      if(MBID_OK==showMsgBox2(IDSTR_CWIMAGETITLE, IDSTR_IMGIOPROCCRASH, queryModuleHandle(),
+                              MB_OK | MB_MOVEABLE | MB_WARNING))
+        exit(0);
+      exit(0);
+#endif
+    }END_CATCH;
+    
+    if(!bGotHeader)
+      return NULLHANDLE;
+
+    TRY_LOUD(LOAD_BMP4) {
+      hbm=loadBitmap ( chrName , (PBITMAPINFOHEADER2) _pBmpInfoHeader2);
+    }
+    CATCH(LOAD_BMP4)
+      {
+#if 0
+        if(MBID_OK==showMsgBox2(IDSTR_CWIMAGETITLE, IDSTR_IMGIOPROCCRASH, queryModuleHandle(),
+                                MB_OK | MB_MOVEABLE | MB_WARNING))
+          exit(0);
+        exit(0);
+#endif
+        hbm=NULLHANDLE;
+      } END_CATCH;
+      
+      if(!hbm)
+        return NULLHANDLE;
+      
+      
+    TRY_LOUD(QRY_HBM) {
+      hbm2=createNewBitmap ( hbm, (PBITMAPINFOHEADER2) _pBmpInfoHeader2, ulWidth, ulHeight , NULLHANDLE);
+    }
+    CATCH(QRY_HBM)
+      {
+        hbm2=NULLHANDLE;
+      } END_CATCH;
+      
+      GpiDeleteBitmap(hbm);
+      return hbm2;
+}
+
+/*
+ * The prototype for cwbmp_cwmmQuerySmallBitmapHandle was replaced by the following prototype:
+ */
+SOM_Scope HBITMAP  SOMLINK cwbmp_cwmmQuerySmallBitmapHandle(MMBitmap *somSelf, 
+                                                            ULONG ulSize)
+{
+  HBITMAP hbm;
+    MMBitmapData *somThis = MMBitmapGetData(somSelf);
+    MMBitmapMethodDebug("MMBitmap","cwbmp_cwmmQuerySmallBitmapHandle");
+
+    if(_bNoIOProcAvailable)
+      return NULLHANDLE; /* No IO-proc for this image format. Don't try again in the future. */
+
+    if(ulSize<MAX_SIZE_SMALLBITMAP)
+      ulSize=MAX_SIZE_SMALLBITMAP;
+
+    if(ulSize>_ulSizeSmallBitmap)
+      {
+        if(_hBitmapSmall) {
+          GpiDeleteBitmap(_hBitmapSmall);
+          _hBitmapSmall=NULLHANDLE;
+        }
+      }
+
+    if(!_hBitmapSmall) {
+      _ulSizeSmallBitmap=0;
+
+      /* Get a small bitmap without caching the big size bitmap */
+     if((hbm=cwQueryBitmapHandle(somSelf, 
+                                  ulSize, 
+                                  ulSize))!=NULLHANDLE) {
+
+        _hBitmapSmall=hbm;
+        _ulSizeSmallBitmap=ulSize;
+      }
+    }
+    /* Return statement to be customized: */
+    return _hBitmapSmall;
+}
+
+/*
+ * The prototype for cwbmp_cwmmFreeBitmaps was replaced by the following prototype:
+ */
+SOM_Scope void  SOMLINK cwbmp_cwmmFreeBitmaps(MMBitmap *somSelf)
+{
+  /*    MMBitmapData *somThis = MMBitmapGetData(somSelf);*/
+    MMBitmapMethodDebug("MMBitmap","cwbmp_cwmmFreeBitmaps");
+
+    _cwmmFreeSmallBitmap(somSelf);
+}
+
+/*
+ * The prototype for cwbmp_cwmmFreeSmallBitmap was replaced by the following prototype:
+ */
+SOM_Scope void  SOMLINK cwbmp_cwmmFreeSmallBitmap(MMBitmap *somSelf)
+{
+    MMBitmapData *somThis = MMBitmapGetData(somSelf);
+    MMBitmapMethodDebug("MMBitmap","cwbmp_cwmmFreeSmallBitmap");
+
+    if(_hBitmapSmall) {
+      GpiDeleteBitmap(_hBitmapSmall);
+      _hBitmapSmall=NULLHANDLE;
+      _ulSizeSmallBitmap=0;
+    }
+}
+
+/*
+ * The prototype for cwbmp_cwmmQueryBitmapInfoHeader was replaced by the following prototype:
+ */
+SOM_Scope PBYTE  SOMLINK cwbmp_cwmmQueryBitmapInfoHeader(MMBitmap *somSelf)
+{
+  ULONG ulSize;
+  char chrName[CCHMAXPATH];
+  PBYTE pByte;
+  BOOL bGotHeader=FALSE;
+
+    MMBitmapData *somThis = MMBitmapGetData(somSelf);
+    MMBitmapMethodDebug("MMBitmap","cwbmp_cwmmQueryBitmapInfoHeader");
+
+    if(_pBmpInfoHeader2)
+      return _pBmpInfoHeader2;
+
+    if(_bNoIOProcAvailable)
+      return NULL; /* No IO-proc for this image format. Don't try again in the future. */
+
+    ulSize=sizeof(chrName);
+    if(!_wpQueryRealName(somSelf, chrName, &ulSize,TRUE))
+      return NULL;
+
+    if((pByte=_wpAllocMem(somSelf, sizeof(BITMAPINFOHEADER2)+256*sizeof(RGB2), &ulSize))==NULLHANDLE)
+      return NULL;
+
+    TRY_LOUD(GET_CWBMPIH) {
+      bGotHeader=getBmpInfoHeader( (PBITMAPINFOHEADER2) pByte, chrName, _chrIOProcName, 
+                                   sizeof(_chrIOProcName), &_bNoIOProcAvailable);
+    }
+    CATCH(GET_CWBMPIH)
+      {
+#if 0
+        if(MBID_OK==showMsgBox2(IDSTR_CWIMAGETITLE, IDSTR_IMGIOPROCCRASH, queryModuleHandle(),
+                                    MB_OK | MB_MOVEABLE | MB_WARNING))
+          exit(0);
+        exit(0);
+#endif
+
+      } END_CATCH;
+
+    if(!bGotHeader) {
+      _wpFreeMem(somSelf,pByte);
+      _pBmpInfoHeader2=NULLHANDLE;
+      _chrIOProcName[0]=0;
+      return NULL;
+    }
+    _pBmpInfoHeader2=pByte;
+
+#if 0
+    /* Update instance data */
+    if(((PBITMAPINFOHEADER2)_pBmpInfoHeader2)->cbFix==sizeof(BITMAPINFOHEADER2)) {
+      _ulWidth=((PBITMAPINFOHEADER2)_pBmpInfoHeader2)->cx;
+      _ulHeight=((PBITMAPINFOHEADER2)_pBmpInfoHeader2)->cy;
+      _ulDepth=((PBITMAPINFOHEADER2)_pBmpInfoHeader2)->cBitCount;
+    }
+    else {
+      PBITMAPINFOHEADER pBmpInfoHdr=(PBITMAPINFOHEADER)_pBmpInfoHeader2;
+      _ulWidth=pBmpInfoHdr->cx;
+      _ulHeight=pBmpInfoHdr->cy;
+      _ulDepth=pBmpInfoHdr->cBitCount;
+    }
+#endif
+    return (PBYTE) _pBmpInfoHeader2;
+}
+
+SOM_Scope ULONG  SOMLINK cwbmp_cwmmQueryImageInfo(MMBitmap *somSelf, 
+                                                  char** chrString, 
+                                                  ULONG ulSize, 
+                                                  int iWhich)
+{
+  PBITMAPINFOHEADER2 pBmpInfoHdr2=NULLHANDLE;       
+  ULONG ulWidth, ulHeight, ulDepth;
+
+    MMBitmapData *somThis = MMBitmapGetData(somSelf);
+    MMBitmapMethodDebug("MMBitmap","cwbmp_cwmmQueryImageInfo");
+
+    pBmpInfoHdr2=(PBITMAPINFOHEADER2) _wpQueryBitmapInfoHeader(somSelf);
+
+    if(!pBmpInfoHdr2)
+      return 0;
+
+    if(pBmpInfoHdr2->cbFix==sizeof(BITMAPINFOHEADER2)) {
+      ulWidth=pBmpInfoHdr2->cx;
+      ulHeight=pBmpInfoHdr2->cy;
+      ulDepth=pBmpInfoHdr2->cBitCount;
+    }
+    else {
+      PBITMAPINFOHEADER pBmpInfoHdr=(PBITMAPINFOHEADER)pBmpInfoHdr2;
+          ulWidth=pBmpInfoHdr->cx;
+          ulHeight=pBmpInfoHdr->cy;
+          ulDepth=pBmpInfoHdr->cBitCount;
+    }
+    switch(iWhich)
+      {
+      case IDINFO_WIDTH:
+        return ulWidth;
+      case IDINFO_HEIGHT:
+        return ulHeight;
+      case IDINFO_BPP:
+        return ulDepth;
+      case IDINFO_FORMAT:
+        {
+          char *chr;
+          /* Image format */
+          if(!chrString)
+            return 0;
+
+          chr=*chrString;
+          strncpy(chr, _chrIOProcName, ulSize);
+          chr[ulSize-1]=0;
+          if(chr[0]==0)
+            return 0;
+          else
+            return 1;
+        }
+      default:
+        break;
+      }
+    return 0;
+}
+
+/*
+ * The prototype for cwbmp_wpModifyPopupMenu was replaced by the following prototype:
+ */
+SOM_Scope BOOL  SOMLINK cwbmp_wpModifyPopupMenu(MMBitmap *somSelf, 
+                                                HWND hwndMenu, 
+                                                HWND hwndCnr, 
+                                                ULONG iPosition)
+{
+  char text[120];
+  char menuText[200];
+  MENUITEM menuItem;
+      
+    /* CWBitmapData *somThis = CWBitmapGetData(somSelf); */
+    MMBitmapMethodDebug("MMBitmap","cwbmp_wpModifyPopupMenu");
+    _wpInsertPopupMenuItems(somSelf, hwndMenu, 1, queryResModuleHandle(), ID_MENU_IMGEDITOR, 1);
+
+    TRY_LOUD(IMAGE_INSERTPOPUPMENU) {
+      /* Insert image info */
+      if(!getMessage(text, IDSTR_MENU_IMAGEINFO, sizeof(text), queryResModuleHandle(), hwndMenu))
+        strcpy(text, "Image information: %d x %d x %d");
+      
+      sprintf(menuText, text, 
+              _cwmmQueryImageInfo(somSelf, NULLHANDLE, 0, IDINFO_WIDTH),
+              _cwmmQueryImageInfo(somSelf, NULLHANDLE, 0, IDINFO_HEIGHT),
+              _cwmmQueryImageInfo(somSelf, NULLHANDLE, 0, IDINFO_BPP));//create menuitem
+      
+      //insert size menuitem in popupmenu
+      
+      menuItem.iPosition=MIT_END;
+      menuItem.afStyle=MIS_TEXT|MIS_STATIC;
+      menuItem.afAttribute=0;
+      menuItem.id=ID_MENU_IMAGEINFO;
+      menuItem.hwndSubMenu=NULLHANDLE;
+      menuItem.hItem=0;
+      WinSendMsg(hwndMenu,MM_INSERTITEM,(MPARAM)&menuItem,(MPARAM)&menuText);
+      
+      /* Insert all known image I/O procs */
+      insertIOProcMenuItems( hwndMenu );
+      menuInsertMenuSeparator(hwndMenu, NULLHANDLE, MIT_END );
+      
+    }/* TRY_LOUD */
+    CATCH(IMAGE_INSERTPOPUPMENU)
+      {
+        SysWriteToTrapLog("\nTrap occured in %s, file %s, around line %d.\n",
+                          __FUNCTION__, __FILE__, __LINE__);
+      } END_CATCH;
+      
+      return (MMBitmap_parent_WPBitmap_wpModifyPopupMenu(somSelf, 
+                                                         hwndMenu, 
+                                                         hwndCnr, 
+                                                         iPosition));
+}
+
+/*
+ * The prototype for cwbmp_wpMenuItemSelected was replaced by the following prototype:
+ */
+SOM_Scope BOOL  SOMLINK cwbmp_wpMenuItemSelected(MMBitmap *somSelf, 
+                                                 HWND hwndFrame, 
+                                                 ULONG ulMenuId)
+{
+    /* CWBitmapData *somThis = CWBitmapGetData(somSelf); */
+    MMBitmapMethodDebug("MMBitmap","cwbmp_wpMenuItemSelected");
+
+    if(ulMenuId>=ID_ITEM_FIRSTCONVERT && ulMenuId<=ID_ITEM_FIRSTCONVERT+lNumIOProcs-1)
+      {
+        char chrEditor[CCHMAXPATH]={0};
+        char chrParams[2*CCHMAXPATH]="\"";
+        char *chrPtr=chrParams;
+        ULONG ulSize;
+        ULONG ulRc;
+        
+        PrfQueryProfileString(HINI_USERPROFILE, "CWMM", "imageconverter", "", chrEditor,
+                              sizeof(chrEditor));
+        chrPtr++;
+        ulSize=sizeof(chrParams);
+        _wpQueryRealName(somSelf, chrPtr, &ulSize, TRUE);
+        strcat(chrPtr,"\" \"");
+        chrPtr=strrchr(chrPtr, 0);
+
+        ulRc = mmioGetFormatName(&g_pmmFormatInfoArray[ulMenuId-ID_ITEM_FIRSTCONVERT], chrPtr,(LONG*) &ulSize, 0L, 0L);
+        if(ulRc)
+	  {
+	  SysWriteToTrapLog("cwbmp.c: %s %u\n\n", chrPtr, ulRc);
+	  }
+        *( chrPtr + ulSize ) = (CHAR)NULL;
+        strcat(chrPtr,"\"");
+
+        if((ulRc=launchPMProg("", chrEditor, chrParams, somSelf, ulMenuId-ID_ITEM_FIRSTCONVERT))==NULLHANDLE) {
+          /* Error */
+          return TRUE;
+        }
+        return TRUE;
+      }
+    switch(ulMenuId)
+      {
+      case ID_MENU_IMGEDITOR:
+        _wpViewObject(somSelf, NULLHANDLE, ulMenuId, 0);
+        return TRUE;
+      default:
+        break;
+      }
+
+    return (MMBitmap_parent_WPBitmap_wpMenuItemSelected(somSelf, 
+                                                        hwndFrame, 
+                                                        ulMenuId));
+}
+
+/*
+ * The prototype for cwbmp_wpOpen was replaced by the following prototype:
+ */
+SOM_Scope HWND  SOMLINK cwbmp_wpOpen(MMBitmap *somSelf, HWND hwndCnr, 
+                                     ULONG ulView, ULONG param)
+{
+    /* CWBitmapData *somThis = CWBitmapGetData(somSelf); */
+    MMBitmapMethodDebug("MMBitmap","cwbmp_wpOpen");
+
+   switch(ulView)
+     {
+     case ID_MENU_IMGEDITOR:
+        /*case 0xbc2b:   editor */
+        {
+          char chrEditor[CCHMAXPATH]={0};
+          char chrParams[CCHMAXPATH+2]="\"";
+          char chrTitle[50];
+          char *chrPtr=chrParams;
+          ULONG ulSize;
+          ULONG ulRc;
+
+          if(!PrfQueryProfileString(HINI_USERPROFILE, "CWMM", "imageeditor", NULLHANDLE, chrEditor,
+                                sizeof(chrEditor)))
+            PrfQueryProfileString(HINI_USERPROFILE, "CWMM", "ib", NULLHANDLE, chrEditor,
+                                  sizeof(chrEditor));
+
+          chrPtr++;
+          ulSize=sizeof(chrParams)-2;
+          _wpQueryRealName(somSelf, chrPtr, &ulSize, TRUE);
+          strcat(chrPtr,"\"");
+
+          if(!getMessage(chrTitle, IDSTR_IMGEDITORTITLE, sizeof(chrTitle), queryResModuleHandle(), HWND_DESKTOP))
+            strcpy(chrTitle, "Editor");
+
+          if((ulRc=launchPMProg( chrTitle, chrEditor, chrParams, somSelf, ulView))==NULLHANDLE) {
+            return NULLHANDLE;
+          }
+          return NULLHANDLE;
+        }
+     default:
+       break;
+     }
+
+    return (MMBitmap_parent_WPBitmap_wpOpen(somSelf, hwndCnr, 
+                                            ulView, param));
+}
+
+/*
+ * The prototype for cwbmp_wpAddSettingsPages was replaced by the following prototype:
+ */
+SOM_Scope BOOL  SOMLINK cwbmp_wpAddSettingsPages(MMBitmap *somSelf, 
+                                                 HWND hwndNotebook)
+{
+  BOOL rc;
+    /* CWBitmapData *somThis = CWBitmapGetData(somSelf); */
+    MMBitmapMethodDebug("MMBitmap","cwbmp_wpAddSettingsPages");
+
+
+    rc=(MMBitmap_parent_WPBitmap_wpAddSettingsPages(somSelf, 
+                                                        hwndNotebook));
+    return rc | (_cwmmAddImageInformationPage(somSelf, hwndNotebook));
+}
+
+/*
+ * The prototype for cwbmp_wpUnInitData was replaced by the following prototype:
+ */
+SOM_Scope void  SOMLINK cwbmp_wpUnInitData(MMBitmap *somSelf)
+{
+    MMBitmapData *somThis = MMBitmapGetData(somSelf);
+    MMBitmapMethodDebug("MMBitmap","cwbmp_wpUnInitData");
+
+    /* Free the private BITMAPINFOHEADER2 */
+    if(_pBmpInfoHeader2) {
+      _wpFreeMem(somSelf, _pBmpInfoHeader2);
+      _pBmpInfoHeader2=NULLHANDLE;
+    }
+
+    _cwmmFreeBitmaps(somSelf);
+
+    MMBitmap_parent_WPBitmap_wpUnInitData(somSelf);
+}
+
+
+/*
+ * The prototype for cwbmp_wpInitData was replaced by the following prototype:
+ */
+SOM_Scope void  SOMLINK cwbmp_wpInitData(MMBitmap *somSelf)
+{
+    MMBitmapData *somThis = MMBitmapGetData(somSelf);
+    MMBitmapMethodDebug("MMBitmap","cwbmp_wpInitData");
+
+    MMBitmap_parent_WPBitmap_wpInitData(somSelf);
+
+    _hBitmapSmall=NULLHANDLE;
+    _ulSizeSmallBitmap=0;
+    _pBmpInfoHeader2=NULL;
+    _chrIOProcName[0]=0;
+    _bNoIOProcAvailable=FALSE;
+}
+
+
+/*
+ * The prototype for cwbmp_wpQueryDetailsData was replaced by the following prototype:
+ */
+SOM_Scope ULONG  SOMLINK cwbmp_wpQueryDetailsData(MMBitmap *somSelf, 
+                                                  PVOID* ppDetailsData, 
+                                                  PULONG pcp)
+{
+    BOOL rcParent;
+    PIMAGEDETAILS pImageDetails;
+
+    MMBitmapData *somThis = MMBitmapGetData(somSelf);
+    MMBitmapMethodDebug("MMBitmap","cwbmp_wpQueryDetailsData");
+
+    rcParent= (MMBitmap_parent_WPBitmap_wpQueryDetailsData(somSelf, 
+                                                     ppDetailsData, 
+                                                     pcp));
+
+    /* The WPS asks for data to be displayed */
+    if(ppDetailsData)
+      {
+        ULONG ulWidth = 0, ulHeight = 0, ulDepth = 0;
+        PBITMAPINFOHEADER2 pBmpInfoHeader2;       
+        
+        pBmpInfoHeader2=(PBITMAPINFOHEADER2) _cwmmQueryBitmapInfoHeader(somSelf);
+        
+        if(pBmpInfoHeader2) {
+          if(pBmpInfoHeader2->cbFix==sizeof(BITMAPINFOHEADER2)) {
+            ulWidth=pBmpInfoHeader2->cx;
+            ulHeight=pBmpInfoHeader2->cy;
+            ulDepth=pBmpInfoHeader2->cBitCount;
+          }
+          else {
+            PBITMAPINFOHEADER pBmpInfoHeader=(PBITMAPINFOHEADER)pBmpInfoHeader2;
+            ulWidth=pBmpInfoHeader->cx;
+            ulHeight=pBmpInfoHeader->cy;
+            ulDepth=pBmpInfoHeader->cBitCount;
+          }
+        }
+        
+        /* Fill the structure with the info to be displayed */
+        // Fixme ulWidth and freinds are potentally uninitulized is the } above in the wrong place
+        pImageDetails=(PIMAGEDETAILS)*ppDetailsData;  
+        pImageDetails->ulWidth=ulWidth;
+        pImageDetails->ulHeight=ulHeight;
+        pImageDetails->ulDepth=ulDepth;
+        pImageDetails->pszFormat=STR_BITMAPNAME;
+        
+        *ppDetailsData=((PBYTE) (*ppDetailsData))+sizeof(*pImageDetails);          
+      }
+    else
+      {
+        /* Buffer size is queried */
+        if(pcp)
+          *pcp+=sizeof(*pImageDetails);
+      }    
+    return rcParent;
+}
+
+
+
+
+SOM_Scope BOOL  SOMLINK cwbmpM_wpclsCreateDefaultTemplates(M_MMBitmap *somSelf, 
+                                                           WPObject* Folder)
+{
+    /* M_MMBitmapData *somThis = M_MMBitmapGetData(somSelf); */
+    M_MMBitmapMethodDebug("M_MMBitmap","cwbmpM_wpclsCreateDefaultTemplates");
+
+    if(checkImageIOProc( _wpclsQueryInstanceFilter(somSelf))) {
+      WPFolder* wpFolder;
+      wpFolder=_wpclsQueryFolder(somSelf, "<MMPM2_MMTEMPLATEFOLDER>", FALSE);
+      // return M_MMAudio_parent_M_MMDataFile_wpclsCreateDefaultTemplates(somSelf, wpFolder);
+      //            HlpWriteToTrapLog("Create template for: %s\n", _wpclsQueryTitle(somSelf));
+      //HlpWriteToTrapLog("Create template for: %s\n", _somGetClassName(somSelf) );
+      mmclsCreateTheDefaultTemplate(somSelf, Folder);
+      return TRUE;
+    }
+
+    return TRUE;
+
+    //    return (M_MMBitmap_parent_M_WPBitmap_wpclsCreateDefaultTemplates(somSelf, 
+    //                                                               Folder));
+}
+
+/*
+ * The prototype for cwbmpM_wpclsQueryDefaultView was replaced by the following prototype:
+ */
+SOM_Scope ULONG  SOMLINK cwbmpM_wpclsQueryDefaultView(M_MMBitmap *somSelf)
+{
+    /* M_CWBitmapData *somThis = M_CWBitmapGetData(somSelf); */
+    M_MMBitmapMethodDebug("M_MMBitmap","cwbmpM_wpclsQueryDefaultView");
+
+    return ID_MENU_IMGEDITOR;
+}
+
+/*
+ * The prototype for cwbmpM_wpclsQueryIconData was replaced by the following prototype:
+ */
+SOM_Scope ULONG  SOMLINK cwbmpM_wpclsQueryIconData(M_MMBitmap *somSelf, 
+                                                   PICONINFO pIconInfo)
+{
+  HMODULE hmod;
+    /* M_CWBitmapData *somThis = M_CWBitmapGetData(somSelf); */
+    M_MMBitmapMethodDebug("M_MMBitmap","cwbmpM_wpclsQueryIconData");
+
+    hmod=queryModuleHandle();
+    if(!hmod)
+      return M_MMBitmap_parent_M_WPBitmap_wpclsQueryIconData(somSelf, pIconInfo);
+
+	if (pIconInfo)   {
+      pIconInfo->fFormat = ICON_RESOURCE;
+      pIconInfo->hmod    = hmod;
+      pIconInfo->resid   = ID_ICONBMPFILE;
+	} /* endif */
+
+	return ( sizeof(ICONINFO) );
+}
+
+/*
+ * The prototype for cwbmpM_wpclsQueryDetailsInfo was replaced by the following prototype:
+ */
+SOM_Scope ULONG  SOMLINK cwbmpM_wpclsQueryDetailsInfo(M_MMBitmap *somSelf, 
+                                                      PCLASSFIELDINFO* ppClassFieldInfo, 
+                                                      PULONG pSize)
+{
+  ULONG cParentColumns;
+  PCLASSFIELDINFO pCfi;
+  int i;
+
+    /* M_CWBitmapData *somThis = M_CWBitmapGetData(somSelf); */
+    M_MMBitmapMethodDebug("M_MMBitmap","cwbmpM_wpclsQueryDetailsInfo");
+
+    cParentColumns=(M_MMBitmap_parent_M_WPBitmap_wpclsQueryDetailsInfo(somSelf, 
+                                                                       ppClassFieldInfo, 
+                                                                       pSize));
+
+  if(pSize)
+    *pSize+=sizeof(IMAGEDETAILS);
+
+  if(ppClassFieldInfo)
+    {
+      if(*ppClassFieldInfo)
+        {
+          pCfi=*ppClassFieldInfo;
+          for(i=0; i<cParentColumns;i++)
+            pCfi=(pCfi->pNextFieldInfo ? pCfi->pNextFieldInfo: pCfi);
+
+          pCfi->pNextFieldInfo=cfiImageFieldInfo;
+        }
+      else
+        *ppClassFieldInfo=cfiImageFieldInfo;
+    }
+    return (cParentColumns+NUM_IMAGE_DETAILS_FIELDS);
+}
+
+/*
+ * The prototype for cwbmpM_wpclsInitData was replaced by the following prototype:
+ */
+SOM_Scope void  SOMLINK cwbmpM_wpclsInitData(M_MMBitmap *somSelf)
+{
+  PCLASSFIELDINFO pCfi;
+  USHORT i;
+
+    /* M_CWBitmapData *somThis = M_CWBitmapGetData(somSelf); */
+    M_MMBitmapMethodDebug("M_MMBitmap","cwbmpM_wpclsInitData");
+
+    M_MMBitmap_parent_M_WPBitmap_wpclsInitData(somSelf);
+
+    /* Load strings for details titles */
+    if(getMessage(chrWidth, IDSTR_IMAGEDETAIL_WIDTH, sizeof(chrWidth), queryResModuleHandle(), HWND_DESKTOP))
+      pszImageColTitles[0]=chrWidth;
+    if(getMessage(chrHeight, IDSTR_IMAGEDETAIL_HEIGHT, sizeof(chrHeight), queryResModuleHandle(), HWND_DESKTOP))
+      pszImageColTitles[1]=chrHeight;
+    if(getMessage(chrDepth, IDSTR_IMAGEDETAIL_DEPTH, sizeof(chrDepth), queryResModuleHandle(), HWND_DESKTOP))
+      pszImageColTitles[2]=chrDepth;
+    if(getMessage(chrFormat, IDSTR_IMAGEDETAIL_FORMAT, sizeof(chrFormat), queryResModuleHandle(), HWND_DESKTOP))
+      pszImageColTitles[3]=chrFormat;
+
+    /* Setup the static data for the details view */
+    for(i=0,pCfi=cfiImageFieldInfo;i<NUM_IMAGE_DETAILS_FIELDS;i++,pCfi++)
+      {
+        memset((PCH)pCfi,0,sizeof(CLASSFIELDINFO));
+        
+        pCfi->cb=sizeof(CLASSFIELDINFO);
+        pCfi->flData=CFA_LEFT|CFA_SEPARATOR|CFA_FIREADONLY;
+        pCfi->flTitle=CFA_CENTER|CFA_SEPARATOR|CFA_HORZSEPARATOR|CFA_STRING|CFA_FITITLEREADONLY;
+        pCfi->pNextFieldInfo=pCfi+1;
+        pCfi->pTitleData=(PVOID)pszImageColTitles[i];
+        pCfi->flCompare=COMPARE_SUPPORTED|SORTBY_SUPPORTED;
+        
+        switch(i)
+          {
+          case 0: /* Width */
+            pCfi->flData|=CFA_ULONG;
+            pCfi->offFieldData=(ULONG)(FIELDOFFSETUL(IMAGEDETAILS, ulWidth));
+            pCfi->ulLenFieldData=sizeof(ULONG);
+            pCfi->ulLenCompareValue=sizeof(ULONG);
+            pCfi->DefaultComparison=CMP_GREATER;
+            break;
+          case 1: /* Height */
+            pCfi->flData|=CFA_ULONG;
+            pCfi->offFieldData=(ULONG)(FIELDOFFSETUL(IMAGEDETAILS,ulHeight));
+            pCfi->ulLenFieldData=sizeof(ULONG);
+            pCfi->ulLenCompareValue=sizeof(ULONG);
+            pCfi->DefaultComparison=CMP_GREATER;
+            break;
+          case 2: /* Depth */
+            pCfi->flData|=CFA_ULONG;
+            pCfi->offFieldData=(ULONG)(FIELDOFFSETUL(IMAGEDETAILS,ulDepth));
+            pCfi->ulLenFieldData=sizeof(ULONG);
+            pCfi->ulLenCompareValue=sizeof(ULONG);
+            pCfi->DefaultComparison=CMP_GREATER;
+            break;
+          case 3: /* Format */
+            pCfi->flData|=CFA_STRING;
+            pCfi->offFieldData=(ULONG)(FIELDOFFSETUL(IMAGEDETAILS,pszFormat));
+            pCfi->ulLenFieldData=sizeof(PSZ);
+            pCfi->DefaultComparison=CMP_EQUAL;
+            break;
+          }/* switch(i) */
+      }/* for() */
+    cfiImageFieldInfo[NUM_IMAGE_DETAILS_FIELDS].pNextFieldInfo=NULL;
+}
+
Index: /tags/CWMM-0.3.0_GA/classes/c/c_image/cwdib.c
===================================================================
--- /tags/CWMM-0.3.0_GA/classes/c/c_image/cwdib.c	(revision 213)
+++ /tags/CWMM-0.3.0_GA/classes/c/c_image/cwdib.c	(revision 213)
@@ -0,0 +1,129 @@
+/*
+ * (C) Chris Wohlgemuth 2002-2004
+ *
+ */
+/*
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; see the file COPYING.  If not, write to
+ * the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
+ */          
+/*
+ * If you need another license for your project/product (commercial,
+ * noncommercial, whatever) contact me at
+ * 
+ * http://www.os2world.com/cdwriting
+ * http://www.geocities.com/SiliconValley/Sector/5785/
+ *
+ */
+/*
+ *  This file was generated by the SOM Compiler and Emitter Framework.
+ *  Generated using: 
+ *      SOM Emitter emitctm: 2.42
+ */
+
+#ifndef SOM_Module_cwdib_Source
+#define SOM_Module_cwdib_Source
+#endif
+#define CWDIB_Class_Source
+#define M_CWDIB_Class_Source
+
+#include <os2.h>
+#include "helpid.h"
+#include "cwdib.ih"
+
+extern char chrHelpLibrary[CCHMAXPATH];
+
+HMODULE queryResModuleHandle(void);
+HMODULE queryModuleHandle(void);
+BOOL getMessage(char* text,ULONG ulID, LONG lSizeText, HMODULE hResource,HWND hwnd);
+
+
+/*
+ * The prototype for cwdibM_wpclsQueryInstanceType was replaced by the following prototype:
+ */
+SOM_Scope PSZ  SOMLINK cwdibM_wpclsQueryInstanceType(M_MMDIB *somSelf)
+{
+    /* M_CWDIBData *somThis = M_CWDIBGetData(somSelf); */
+    M_MMDIBMethodDebug("M_MMDIB","cwdibM_wpclsQueryInstanceType");
+
+    return "DIB";
+}
+
+/*
+ * The prototype for cwdibM_wpclsQueryInstanceFilter was replaced by the following prototype:
+ */
+SOM_Scope PSZ  SOMLINK cwdibM_wpclsQueryInstanceFilter(M_MMDIB *somSelf)
+{
+    /* M_CWDIBData *somThis = M_CWDIBGetData(somSelf); */
+    M_MMDIBMethodDebug("M_MMDIB","cwdibM_wpclsQueryInstanceFilter");
+
+    return "*.DIB";
+}
+
+/*
+ * The prototype for cwdibM_wpclsQueryDefaultHelp was replaced by the following prototype:
+ */
+SOM_Scope BOOL  SOMLINK cwdibM_wpclsQueryDefaultHelp(M_MMDIB *somSelf, 
+                                                     PULONG pHelpPanelId, 
+                                                     PSZ pszHelpLibrary)
+{
+    /* M_CWDIBData *somThis = M_CWDIBGetData(somSelf); */
+    M_MMDIBMethodDebug("M_MMDIB","cwdibM_wpclsQueryDefaultHelp");
+
+    if(pHelpPanelId)
+      *pHelpPanelId=DIBFILE_HELP_PANEL;
+    if(pszHelpLibrary)
+      strncpy(pszHelpLibrary, chrHelpLibrary, CCHMAXPATH);
+    return TRUE; 
+}
+/*
+ * The prototype for cwdibM_wpclsQueryTitle was replaced by the following prototype:
+ */
+SOM_Scope PSZ  SOMLINK cwdibM_wpclsQueryTitle(M_MMDIB *somSelf)
+{
+  static char chrTitle[20]={0};
+    /* M_CWDIBData *somThis = M_CWDIBGetData(somSelf); */
+    M_MMDIBMethodDebug("M_MMDIB","cwdibM_wpclsQueryTitle");
+
+    if(chrTitle[0]==0)
+      if(!getMessage(chrTitle, IDSTR_DIBTITLE, sizeof(chrTitle), queryResModuleHandle(), HWND_DESKTOP))
+        strcpy(chrTitle,"DIBImage.DIB");
+
+    return chrTitle;
+}
+
+/*
+ * The prototype for cwdibM_wpclsQueryIconData was replaced by the following prototype:
+ */
+SOM_Scope ULONG  SOMLINK cwdibM_wpclsQueryIconData(M_MMDIB *somSelf, 
+                                                   PICONINFO pIconInfo)
+{
+  HMODULE hmod;
+
+    /* M_CWDIBData *somThis = M_CWDIBGetData(somSelf); */
+    M_MMDIBMethodDebug("M_MMDIB","cwdibM_wpclsQueryIconData");
+
+    hmod=queryModuleHandle();
+    if(!hmod)
+      return M_MMDIB_parent_M_MMImage_wpclsQueryIconData(somSelf, pIconInfo);
+
+	if (pIconInfo)   {
+      pIconInfo->fFormat = ICON_RESOURCE;
+      pIconInfo->hmod    = hmod;
+      pIconInfo->resid   = ID_ICONDIBFILE;
+	} /* endif */
+
+	return ( sizeof(ICONINFO) );
+}
+
+
Index: /tags/CWMM-0.3.0_GA/classes/c/c_image/cwgif.c
===================================================================
--- /tags/CWMM-0.3.0_GA/classes/c/c_image/cwgif.c	(revision 213)
+++ /tags/CWMM-0.3.0_GA/classes/c/c_image/cwgif.c	(revision 213)
@@ -0,0 +1,129 @@
+/*
+ * (C) Chris Wohlgemuth 2002-2004
+ *
+ */
+/*
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; see the file COPYING.  If not, write to
+ * the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
+ */          
+/*
+ * If you need another license for your project/product (commercial,
+ * noncommercial, whatever) contact me at
+ * 
+ * http://www.os2world.com/cdwriting
+ * http://www.geocities.com/SiliconValley/Sector/5785/
+ *
+ */
+/*
+ *  This file was generated by the SOM Compiler and Emitter Framework.
+ *  Generated using: 
+ *      SOM Emitter emitctm: 2.42
+ */
+
+#ifndef SOM_Module_cwgif_Source
+#define SOM_Module_cwgif_Source
+#endif
+#define CWGIF_Class_Source
+#define M_CWGIF_Class_Source
+
+#include <os2.h>
+#include "helpid.h"
+#include "cwgif.ih"
+
+extern char chrHelpLibrary[CCHMAXPATH];
+
+HMODULE queryResModuleHandle(void);
+HMODULE queryModuleHandle(void);
+BOOL getMessage(char* text,ULONG ulID, LONG lSizeText, HMODULE hResource,HWND hwnd);
+
+/*
+ * The prototype for cwgifM_wpclsQueryInstanceType was replaced by the following prototype:
+ */
+SOM_Scope PSZ  SOMLINK cwgifM_wpclsQueryInstanceType(M_MMGIF *somSelf)
+{
+    /* M_CWGIFData *somThis = M_CWGIFGetData(somSelf); */
+    M_MMGIFMethodDebug("M_MMGIF","cwgifM_wpclsQueryInstanceType");
+
+    return "GIF";
+}
+
+/*
+ * The prototype for cwgifM_wpclsQueryInstanceFilter was replaced by the following prototype:
+ */
+SOM_Scope PSZ  SOMLINK cwgifM_wpclsQueryInstanceFilter(M_MMGIF *somSelf)
+{
+    /* M_CWGIFData *somThis = M_CWGIFGetData(somSelf); */
+    M_MMGIFMethodDebug("M_MMGIF","cwgifM_wpclsQueryInstanceFilter");
+
+    return "*.GIF";
+}
+
+/*
+ * The prototype for cwgifM_wpclsQueryDefaultHelp was replaced by the following prototype:
+ */
+SOM_Scope BOOL  SOMLINK cwgifM_wpclsQueryDefaultHelp(M_MMGIF *somSelf, 
+                                                     PULONG pHelpPanelId, 
+                                                     PSZ pszHelpLibrary)
+{
+    /* M_CWGIFData *somThis = M_CWGIFGetData(somSelf); */
+    M_MMGIFMethodDebug("M_MMGIF","cwgifM_wpclsQueryDefaultHelp");
+
+    if(pHelpPanelId)
+      *pHelpPanelId=GIFFILE_HELP_PANEL;
+    if(pszHelpLibrary)
+      strncpy(pszHelpLibrary, chrHelpLibrary, CCHMAXPATH);
+    return TRUE; 
+}
+
+/*
+ * The prototype for cwgifM_wpclsQueryTitle was replaced by the following prototype:
+ */
+SOM_Scope PSZ  SOMLINK cwgifM_wpclsQueryTitle(M_MMGIF *somSelf)
+{
+  static char chrTitle[20]={0};
+    /* M_CWGIFData *somThis = M_CWGIFGetData(somSelf); */
+    M_MMGIFMethodDebug("M_MMGIF","cwgifM_wpclsQueryTitle");
+
+    if(chrTitle[0]==0)
+      if(!getMessage(chrTitle, IDSTR_GIFTITLE, sizeof(chrTitle), queryResModuleHandle(), HWND_DESKTOP))
+        strcpy(chrTitle,"GIFImage.GIF");
+
+    return chrTitle;
+}
+
+/*
+ * The prototype for cwgifM_wpclsQueryIconData was replaced by the following prototype:
+ */
+SOM_Scope ULONG  SOMLINK cwgifM_wpclsQueryIconData(M_MMGIF *somSelf, 
+                                                   PICONINFO pIconInfo)
+{
+  HMODULE hmod;
+
+    /* M_CWGIFData *somThis = M_CWGIFGetData(somSelf); */
+    M_MMGIFMethodDebug("M_MMGIF","cwgifM_wpclsQueryIconData");
+
+    hmod=queryModuleHandle();
+    if(!hmod)
+      return M_MMGIF_parent_M_MMImage_wpclsQueryIconData(somSelf, pIconInfo);
+
+	if (pIconInfo)   {
+      pIconInfo->fFormat = ICON_RESOURCE;
+      pIconInfo->hmod    = hmod;
+      pIconInfo->resid   = ID_ICONGIFFILE;
+	} /* endif */
+
+	return ( sizeof(ICONINFO) );
+}
+
+
Index: /tags/CWMM-0.3.0_GA/classes/c/c_image/cwimage.c
===================================================================
--- /tags/CWMM-0.3.0_GA/classes/c/c_image/cwimage.c	(revision 213)
+++ /tags/CWMM-0.3.0_GA/classes/c/c_image/cwimage.c	(revision 213)
@@ -0,0 +1,2479 @@
+
+/*
+ *  This file was generated by the SOM Compiler.
+ *  Generated using:
+ *     SOM incremental update: 2.47
+ */
+
+
+/*
+ * (C) Chris Wohlgemuth 2002-2004
+ *
+ */
+/*
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; see the file COPYING.  If not, write to
+ * the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+/*
+ * If you need another license for your project/product (commercial,
+ * noncommercial, whatever) contact me at
+ *
+ * http://www.os2world.com/cdwriting
+ * http://www.geocities.com/SiliconValley/Sector/5785/
+ *
+ */
+/*
+ *  This file was generated by the SOM Compiler and Emitter Framework.
+ *  Generated using:
+ *      SOM Emitter emitctm: 2.42
+ */
+
+#ifndef SOM_Module_cwimage_Source
+#define SOM_Module_cwimage_Source
+#endif
+#define CWImage_Class_Source
+#define M_CWImage_Class_Source
+
+#define INCL_DOS
+#define INCL_DOSSEMAPHORES
+#define INCL_DOSERRORS
+#define INCL_GPI
+#define INCL_PM
+#define INCL_MMIOOS2
+#include <os2.h>
+#include <stdio.h>
+#include "mmioos2.h"
+#include "cwimage.ih"
+#include "mmres.h"
+#include "except.h"
+#include "cwaudioinc.h"
+
+#include "sys_funcs.h"
+
+//#define DEBUG
+
+char notImplementedMsg[]= {"\nMethod not available while processing file %s: %s, file %s, around line %d.\n"};
+
+/* Set some default titles */
+PSZ pszImageColTitles[NUM_IMAGE_DETAILS_FIELDS]= {"Width", "Height", "Depth", "Format"};
+
+char chrWidth[SIZE_TITLE]="";
+char chrHeight[SIZE_TITLE]="";
+char chrDepth[SIZE_TITLE]="";
+char chrFormat[SIZE_TITLE]="";
+
+CLASSFIELDINFO cfiImageFieldInfo[NUM_IMAGE_DETAILS_FIELDS];
+
+/* Some methods are not yet implemented */
+#define NOT_IMPLEMENTED  DosBeep(1000, 100);\
+                         DosBeep(2000, 100);\
+                         DosBeep(3000, 100);\
+                         DosBeep(4000, 100);\
+                         DosBeep(3000, 100);\
+                         DosBeep(2000, 100);\
+                         DosBeep(1000, 100);\
+                         SysWriteToTrapLog(notImplementedMsg,\
+                                           _wpQueryTitle(somSelf), __FUNCTION__, __FILE__, __LINE__);
+
+
+extern HAB globalHab;
+HWND hwndCreateBMP; /* Object window for small bitmap creation */
+HWND g_hwndDeleteBMP; /* Object window for bitmap deletion */
+
+extern char classDLLPath[CCHMAXPATH];
+extern char chrHelpLibrary[CCHMAXPATH];
+PMMFORMATINFO g_pmmFormatInfoArray=NULLHANDLE;
+LONG          lNumIOProcs=0;/* Needed to know how many convert menus we have */
+
+char chrMMImageKnownExt[320]={0};/* Array holding the extensions we have a class for e.g. JPG. This
+                                    array will be filled using an external REXX script. Space for
+                                    80 ext should be enough for now (4 bytes per ext e.g.: "JPG "<- note the space) */
+char chrMMImageExt[200]={0};/* Array holding the extensions for wpclsQueryInstanceFilter(). Will be
+                               filled during processing of wpclsInitData() */
+
+
+ULONG launchPMProg(PSZ pszTitle, PSZ wrapperExe, PSZ parameters,  WPObject *thisPtr, ULONG ulView);
+
+BOOL getMessage(char* text,ULONG ulID, LONG lSizeText, HMODULE hResource,HWND hwnd);
+ULONG messageBox( char* text, ULONG ulTextID , LONG lSizeText,
+                  char* title, ULONG ulTitleID, LONG lSizeTitle,
+                  HMODULE hResource, HWND hwnd, ULONG ulFlags);
+
+void writeLog(char* chrFormat, ...);
+HMODULE queryResModuleHandle(void);
+HMODULE queryModuleHandle(void);
+PSZ queryModuleName(void);
+
+BOOL getBmpInfoHeader(PBITMAPINFOHEADER2  bmpih2, PSZ pszFileName, char* procName, ULONG ulLength, BOOL * bNoIOProcAvailable);
+HBITMAP loadBitmap ( PSZ pszFileName, PBITMAPINFOHEADER2 pBMPInfoHeader2);
+HBITMAP createNewBitmap ( HBITMAP hbm,
+                          PBITMAPINFOHEADER2 pBmpInfoHeader2,
+                          ULONG ulWidth,
+                          ULONG ulHeight,
+                          BOOL* pbQuitEarly);
+
+ULONG showMsgBox2(ULONG ulIDTitle, ULONG ulIDText, HMODULE hModule, ULONG ulFlag);
+ULONG showMsgBox(ULONG ulIDTitle, ULONG ulIDText, HMODULE hModule);
+BOOL cwObjectIsOnCD(WPObject * somSelf);
+BOOL getStringFromRexxScript(PSZ rexxFile, char* chrResult, ULONG ulSize);
+
+BOOL mmclsCreateTheDefaultTemplate(M_WPObject *somSelf,
+                                   WPObject* Folder);
+
+MRESULT menuInsertMenuSeparator(HWND hwndMenu, HWND hwndSubMenu, SHORT sPosition );
+
+/*
+   This Proc creates the small bitmaps for display on a separate thread.
+   It's used indirectly used by the lighttable folder when an attempt to
+   paint the bitmap is made. It will also generate bmps when WPS-wizard wants
+   to paint icons in the container.
+ */
+MRESULT EXPENTRY createBMPObjectProc(HWND hwnd, ULONG msg, MPARAM mp1, MPARAM mp2)
+{
+
+  switch (msg)
+    {
+    case WM_APPTERMINATENOTIFY:
+      {
+        switch(SHORT2FROMMP(mp2))
+          {
+          case ACKEY_CREATE_SMALLBITMAP:
+            {
+              BOOL bLoaded=FALSE;
+              HBITMAP hbm;
+              PCREATEBMPINFO pCreateBMP=PVOIDFROMMP(mp1);
+              MMImageData *somThis;
+              WPObject *wpObject;
+              PMINIRECORDCORE pmrcToRefresh;
+
+              if(!pCreateBMP)
+                return (MRESULT) FALSE;
+
+#ifdef DEBUG
+              SysWriteToTrapLog("In %s, line %d\n", __FUNCTION__, __LINE__);
+#endif
+
+              if(!somIsObj(pCreateBMP->wpObject))
+                return (MRESULT) FALSE;
+
+              /*
+                 V0.2.8, CW 2004/11/01
+
+                 It's possible that a lot of requests are issued to this thread while opening a folder.
+                 These are qeued and in the meanwhile the user may have closed the folder.
+                 */
+              if(!WinIsWindow(globalHab, pCreateBMP->hwndCnr))
+                return MRFALSE;
+
+
+              TRY_LOUD(BITMAP_OBJECT) {
+                somThis  = MMImageGetData(pCreateBMP->wpObject);
+                pmrcToRefresh=pCreateBMP->pmrcToRefresh;
+                for(;;) {
+                  RECTL rectl2;
+                  if(WinSendMsg(pCreateBMP->hwndCnr, CM_QUERYVIEWPORTRECT, MPFROMP(&rectl2), MPFROM2SHORT(CMA_WORKSPACE, FALSE))) {
+
+                    /*
+                      V0.2.8 CW 2004/11/01
+
+                      Only create small bitmaps for icons currently visible in the container. This is useful if the
+                      user scrolls a folder and not every small bitmap is yet created.
+                     */
+                    if(pmrcToRefresh->ptlIcon.y+40 < rectl2.yBottom || pmrcToRefresh->ptlIcon.y > rectl2.yTop)
+                      break;
+                    if(pmrcToRefresh->ptlIcon.x+40 < rectl2.xLeft || pmrcToRefresh->ptlIcon.x > rectl2.xRight)
+                      break;
+                  }/* WinSendMsg() */
+
+                  _wpLockObject(pCreateBMP->wpObject);
+
+                  /* Check if in the meantime the bitmap was created */
+                  if(!_hBitmapSmall) {
+                    /*
+                       FIXME:
+
+                       Not threadsafe!!!
+
+                       Use a private work alike for wpQueryBitmapHandle instead???
+                       
+                       Check if bitmap data already loaded. Keep the info so we don't discard the bitmap later on. Another
+                       function may have requested the bitmap before. During wpQueryBitmapHandle() a normal size bitmap
+                       is always created. We don't want to have memory wasted by the big one so it's discarded afterwards.
+                       Not perfect, but works at the moment. Will be revamped later with automatic bitmap deletion. */
+                    if(_hBitmap)
+                      bLoaded=TRUE;
+                    
+                    if(_wpQueryBitmapHandle(pCreateBMP->wpObject,
+                                            &hbm,
+                                            NULLHANDLE,
+                                            pCreateBMP->ulWidth,
+                                            pCreateBMP->ulHeight,
+                                            0, /* ulFlags*/
+                                            0,
+                                            NULLHANDLE)) {
+                      _hBitmapSmall=hbm;
+                      _ulSizeSmallBitmap=pCreateBMP->ulHeight;
+                      if(!bLoaded) {
+                      /* Discard the large bitmap now, we don't need it any more as we have
+                         the small one. */
+                      GpiDeleteBitmap(_hBitmap);
+                      _hBitmap=NULLHANDLE;
+                      }
+                    }/* _wpQueryBitmapHandle() */
+                  }
+                  if(WinIsWindow(globalHab, pCreateBMP->hwndCnr) && pmrcToRefresh)
+                    //    WinPostMsg(pCreateBMP->hwndCnr, CM_INVALIDATERECORD,MPFROMP(&pmrcToRefresh),MPFROM2SHORT(1,CMA_NOREPOSITION));
+                    WinSendMsg(pCreateBMP->hwndCnr, CM_INVALIDATERECORD,MPFROMP(&pmrcToRefresh),MPFROM2SHORT(1,CMA_NOREPOSITION));
+                  break;
+                }/* for */
+              }/* Try */
+              CATCH(BITMAP_OBJECT) {
+                  SysWriteToTrapLog("\nTrap occured in %s, file %s, around line %d.\n",
+                                    __FUNCTION__, __FILE__, __LINE__);
+              } END_CATCH;
+              _wpUnlockObject(pCreateBMP->wpObject);
+              //        WinSendMsg(pCreateBMP->hwndCnr, CM_INVALIDATERECORD,MPFROMP(&pmrcToRefresh),MPFROM2SHORT(1,CMA_NOREPOSITION));
+              //   _wp_FreeMem(wpObject, (PBYTE)pCreateBMP);
+              free((PBYTE)pCreateBMP);
+
+              return (MRESULT) FALSE;
+            }/* case ACKEY_CREATE_SMALLBITMAP */
+          case ACKEY_QUERY_BITMAPINFO:
+            {
+              PCREATEBMPINFO pCreateBMP=PVOIDFROMMP(mp1);
+              MMImageData *somThis;
+
+              if(!pCreateBMP)
+                return (MRESULT) FALSE;
+              if(!somIsObj(pCreateBMP->wpObject))
+                return (MRESULT) FALSE;
+
+              TRY_LOUD(BITMAPIH_OBJECT) {
+                somThis  = MMImageGetData(pCreateBMP->wpObject);
+
+                /* Check if in the meantime the bitmap was created */
+                if(!_pBmpInfoHeader2) {
+                  _pBmpInfoHeader2=_wpQueryBitmapInfoHeader(pCreateBMP->wpObject);
+                  /* Make sure the image size is cached in the EA */
+                  if(_pBmpInfoHeader2)
+                    _wpSaveDeferred(pCreateBMP->wpObject);
+                }
+              }/* Try */
+              CATCH(BITMAPIH_OBJECT)
+                {
+                  SysWriteToTrapLog("\nTrap occured in %s, file %s, around line %d while getting BMPINFOHEADER.\n",
+                                    __FUNCTION__, __FILE__, __LINE__);
+                } END_CATCH;
+              return (MRESULT) FALSE;
+            }
+          default:
+            break;
+          }/* switch(SHORT2FROMMP(mp2)) */
+        return (MRESULT) FALSE;
+      }/* case WM_APPTERMINATENOTIFY */
+    default:
+      break;
+    }
+  return WinDefWindowProc( hwnd, msg, mp1, mp2);
+}
+
+/*
+
+  This thread is started in cwimgM_wpclsInitData(M_MMImage *somSelf). It will create small bitmaps and reads
+  in the BITMAPINFOHEADER.
+
+*/
+void _Optlink createBMPThreadFunc (void *arg)
+{
+
+  HAB  hab;
+  HMQ  hmq;
+  QMSG qmsg;
+
+  hab=WinInitialize(0);
+  if(hab) {
+    hmq=WinCreateMsgQueue(hab, 50);
+    if(hmq) {
+      hwndCreateBMP=WinCreateWindow(HWND_OBJECT,WC_STATIC,"coverObj",0,0,0,0,0,NULLHANDLE,HWND_BOTTOM,13343,NULL,NULL);
+      if(hwndCreateBMP) {
+        WinSubclassWindow(hwndCreateBMP,&createBMPObjectProc);
+        /* Window created. */
+        while(WinGetMsg(hab,&qmsg,(HWND)NULL,0,0))
+          WinDispatchMsg(hab,&qmsg);
+        WinDestroyWindow(hwndCreateBMP);
+      }
+      WinDestroyMsgQueue(hmq);
+    }
+    WinTerminate(hab);
+  }
+}
+
+ULONG ulNumBMPDelete=0;
+#define IMGWM_DELETEBITMAP WM_USER+10
+
+MRESULT EXPENTRY deleteBMPObjectProc(HWND hwnd, ULONG msg, MPARAM mp1, MPARAM mp2)
+{
+
+  switch (msg)
+    {
+    case IMGWM_DELETEBITMAP:
+      {
+        MMImage* somSelf=PVOIDFROMMP(mp1);
+        if(somIsObj(somSelf)) {
+#if 0
+          if(!_wpFindUseItem(somSelf, USAGE_RECORD, NULLHANDLE)) {
+            _cwmmFreeBitmaps(somSelf);
+            //DosBeep(5000, 20);
+          }
+#endif
+          // DosBeep(5000, 10);
+          _cwmmFreeBitmaps(somSelf);
+          //SysWriteToTrapLog("Object is locked: %d\n", _wpIsLocked(somSelf));
+          /* Decrease delete request count */
+          ulNumBMPDelete--;
+          //    SysWriteToTrapLog("Num requests left: %d\n", ulNumBMPDelete);
+        }
+        return FALSE;
+
+      }
+    default:
+      break;
+    } /* msg */
+  return WinDefWindowProc( hwnd, msg, mp1, mp2);
+}
+
+#define BMP_QUEUE_SIZE 100
+#define BMP_DEL_UPPER  80 /* If number of delete request reaches this the thread is unlocked */
+#define BMP_DEL_LOWER  50 /* After reaching this number of requests the thread goes back to sleep until the timeout comes. */
+#define BMP_DEL_WAITTIME 10000 /* Default sleeptime of the thread thus checking for new delete requests with this interval */
+#define BMP_DEL_MINAGE   8000 /* Min age of message before bitmaps are actually destroyed in the background */
+
+HEV hevDeleteBMP;
+
+/*
+
+  This thread is started in cwimgM_wpclsInitData(M_MMImage *somSelf).
+
+  This is the poor man's bitmap deletion thread. It wakes up every BMP_DELWAITTIME ms and
+  deletes bitmaps which are at least BMP_DELMINAGE ms not used.
+
+  It will not reorder messages and will not remove duplicates (hence poor man's). So the
+  oldest delete request will be fullfilled even if in the meantime the bitmap was used and
+  a new request issued. Anyway bitmaps will NOT be destroyed, if the file is inserted into a
+  container! But overall it's way better than immediately delete BMPs after use because when
+  closing a folder maybe dozens of bitmaps must be removed at once.
+
+*/
+void _Optlink deleteBMPThreadFunc (void *arg)
+{
+
+  HAB  hab;
+  HMQ  hmq;
+  QMSG qmsg;
+  BOOL bSemCreated;
+  ULONG ulWaitTime=BMP_DEL_WAITTIME;
+
+  hab=WinInitialize(0);
+  if(hab) {
+    hmq=WinCreateMsgQueue(hab, BMP_QUEUE_SIZE);
+    if(hmq) {
+      g_hwndDeleteBMP=WinCreateWindow(HWND_OBJECT,WC_STATIC,"delBMPObj",0,0,0,0,0,NULLHANDLE,HWND_BOTTOM,13343,NULL,NULL);
+      if(g_hwndDeleteBMP) {
+        WinSubclassWindow(g_hwndDeleteBMP,&deleteBMPObjectProc);
+        /* Lower priority to idle -5. Memory clean up shouldn't disturb the user */
+        //    DosSetPriority(PRTYS_THREAD, PRTYC_IDLETIME, -5, 0);
+
+        /* Create event semaphore. This thread normally waits on this semaphore for several minutes. After the
+           timeout it fetches a pending msg and deletes the bitmap. If a lot of deletion request are sent, the
+           sending function posts the semaphore before the timeout and the oldest requests are handled immediately.
+
+           The semaphore is reset when created.
+           */
+        bSemCreated=!DosCreateEventSem(NULL, &hevDeleteBMP, 0, FALSE);
+        /* Window created. Wait for msg. */
+        while(WinGetMsg(hab,&qmsg,(HWND)NULL,0,0)) {
+          BOOL bQuit = FALSE;
+
+          //    SysWriteToTrapLog("\n\nGot first msg...\n");
+
+          /* First message is always dispatched no matter how old */
+          WinDispatchMsg(hab,&qmsg);
+
+          if(bSemCreated) {
+            ULONG ulPostCount;
+            BOOL bTimeError=FALSE;
+
+            //SysWriteToTrapLog("Waiting on semaphore...\n");
+
+            if(DosWaitEventSem(hevDeleteBMP, ulWaitTime)==ERROR_TIMEOUT) {
+              ULONG ulTime=WinGetCurrentTime(hab);
+
+              //SysWriteToTrapLog("Sem timeout\n");
+
+              //ulPostCount=0; /* only debug */
+              /* Check for pending messages */
+              while(WinPeekMsg(hab,&qmsg,(HWND)NULL,0,0, PM_NOREMOVE)) {
+
+                //ulPostCount++;
+                //SysWriteToTrapLog("  Have msg %d\n", ulPostCount);
+
+                /*
+                  Check for system msgs and dispatch them.
+                 */
+                if(qmsg.msg!=IMGWM_DELETEBITMAP) {
+                  /* Get the message and quit if it's WM_QUIT (shouldn't happen though) */
+                  if((bQuit=!WinGetMsg(hab,&qmsg,(HWND)NULL,0,0))==TRUE)
+                    break;
+                  /* else dispatch and continue loop */
+                  WinDispatchMsg(hab,&qmsg);
+                  continue;
+                }
+                bTimeError=FALSE;
+                if(ulTime-qmsg.time > BMP_DEL_MINAGE) {
+                  /* The message is old enough so get it and dispatch */
+                  //  SysWriteToTrapLog("  time > BMP_DEL_MINAGE\n");
+                  WinGetMsg(hab,&qmsg,(HWND)NULL,0,0);
+                  WinDispatchMsg(hab,&qmsg);
+                  //  SysWriteToTrapLog("Dispatched, next msg?\n");
+                  ulWaitTime=BMP_DEL_WAITTIME;
+                }
+                else {
+                  /* Message isn't old so wait until wait time is really over */
+                  //  SysWriteToTrapLog("  time to short!!!\n");
+                  ulWaitTime=BMP_DEL_WAITTIME-(ulTime-qmsg.time);
+                  bTimeError=TRUE;
+                  break;
+                }
+                //                SysWriteToTrapLog("Back to inner while...\n");
+              }/* while */
+              /*
+                FIXME:
+
+                Make ist right and robust!
+
+                Set counter to 0 if all messages are handled. This isn't correct, because it's not thread safe
+                but doesn't matter that much. In the worst case some messages are dispatched later but
+                it's not system critical at all. In wpUninitData() the bitmaps are deleted anyway.
+                */
+              if(!bTimeError)
+                ulNumBMPDelete=0; /* No messages in queue (but maybe another thread is just adding them...) */
+            } /* semaphore timeout */
+            else
+              {
+                /*
+                  queue is almost full. The semaphore was posted by the function so
+                  dispatch messages faster.
+                 */
+                int a=0;
+                //                SysWriteToTrapLog(" --Semaphore posted\n");
+                while((bQuit=!WinGetMsg(hab,&qmsg,(HWND)NULL,0,0))==FALSE
+                      && a < BMP_DEL_UPPER-BMP_DEL_LOWER) {
+                  //     SysWriteToTrapLog(" -- Got message, dispatching it...\n");
+                  if(qmsg.msg==IMGWM_DELETEBITMAP)
+                    a++;
+                  WinDispatchMsg(hab,&qmsg);
+                  //    SysWriteToTrapLog("--Dispatching msg %d\n", a);
+                }/* while */
+                ulWaitTime=BMP_DEL_WAITTIME;
+              }
+            //  if(WinQueryQueueInfo(hmq, &mqi, sizeof(MQINFO)))
+            //     SysWriteToTrapLog("WinQueryQueueInfo succeeded.\n");
+            //  if(!mqi.cmsgs)
+            //  ulNumBMPDelete=mqi.cmsgs;
+            //      SysWriteToTrapLog("Now resetting event semaphore\n");
+
+            DosResetEventSem(hevDeleteBMP, &ulPostCount);
+          }/* bSemCreated */
+          if(bQuit)
+            break;
+        }/* while() */
+
+        DosCloseEventSem(hevDeleteBMP);
+        WinDestroyWindow(g_hwndDeleteBMP);
+      }
+      WinDestroyMsgQueue(hmq);
+    }
+    WinTerminate(hab);
+  }
+}
+
+void sendDeleteBMPMsg(MMImage* somSelf)
+{
+  PUSEITEM pui;
+  /*
+    Unfortunately only bitmaps for real files are currently deleted. When using links in folders
+    the lock counter isn't touched so we don't get a notification.
+    _wpUnlockObject isn't called when links are going dormant (do they?) after closing the links folder.
+
+    BTW XWorkplace (V1.0.0) keeps every object locked
+    after first touching it and NEVER completely unlocks it!
+    */
+  //  SysWriteToTrapLog("Out side - %s %d\n", __FUNCTION__, ulNumBMPDelete);
+  if((pui=_wpFindUseItem(somSelf, USAGE_RECORD, NULLHANDLE))==NULLHANDLE) {
+    /* Check if queue is full. If yes post semaphore so the other thread cleans up. */
+    if(ulNumBMPDelete> BMP_DEL_UPPER) {
+      //        SysWriteToTrapLog("   ---> Posting semaphore...\n");
+      DosPostEventSem(hevDeleteBMP);
+      /* Yield cpu so the delete thread may run */
+      DosSleep(20);
+      /* Thread isn't fast enough so delete the bitmap directly */
+      if(ulNumBMPDelete>BMP_QUEUE_SIZE-7) {
+        _cwmmFreeBitmaps(somSelf);
+        return;
+      }
+    }
+    ulNumBMPDelete++;
+    //    SysWriteToTrapLog("%s %d\n", __FUNCTION__, ulNumBMPDelete);
+    WinPostMsg(g_hwndDeleteBMP, IMGWM_DELETEBITMAP, MPFROMP(somSelf), MPFROM2SHORT(0, ACKEY_CREATE_SMALLBITMAP));
+  }
+}
+
+MRESULT EXPENTRY imageInfoDlgProc(HWND hwnd, ULONG msg, MPARAM mp1, MPARAM mp2)
+{
+  MMImage *cwImage;
+
+  switch(msg) {
+  case WM_INITDLG :
+    cwImage=(MMImage*)LONGFROMMP(mp2);
+    if(somIsObj(cwImage)) {
+      MMImageData *somThis = MMImageGetData(cwImage);
+
+      PBITMAPINFOHEADER2 pbmpih2;
+
+      if((pbmpih2=(PBITMAPINFOHEADER2)_wpQueryBitmapInfoHeader(cwImage))!=NULLHANDLE)
+        {
+          char fName[CCHMAXPATH];
+          char chrTemplate[100];
+
+          if(pbmpih2->cbFix==sizeof(BITMAPINFOHEADER2)) {
+            if(!getMessage(chrTemplate, IDSTR_SPRINTFPIXEL, sizeof(chrTemplate),
+                       queryResModuleHandle(), hwnd))
+              strcpy(chrTemplate, "%d Pixel");
+            sprintf(fName, chrTemplate, pbmpih2->cx);
+            WinSetWindowText(WinWindowFromID(hwnd, IDST_IMAGEWIDTH),fName);
+
+            sprintf(fName, chrTemplate, pbmpih2->cy);
+            WinSetWindowText(WinWindowFromID(hwnd, IDST_IMAGEHEIGHT),fName);
+
+            if(!getMessage(chrTemplate, IDSTR_SPRINTFBIT, sizeof(chrTemplate),
+                           queryResModuleHandle(), hwnd))
+              strcpy(chrTemplate, "%d Bit");
+            sprintf(fName, chrTemplate, pbmpih2->cBitCount);
+            WinSetWindowText(WinWindowFromID(hwnd, IDST_COLORDEPTH),fName);
+          }
+          else if(pbmpih2->cbFix==sizeof(BITMAPINFOHEADER)) {
+            /* We shouldn't get a BITMAPINFOHEADER here but who knows...*/
+            PBITMAPINFOHEADER pbmpih=(PBITMAPINFOHEADER)pbmpih2;
+            if(!getMessage(chrTemplate, IDSTR_SPRINTFPIXEL, sizeof(chrTemplate),
+                           queryResModuleHandle(), hwnd))
+              strcpy(chrTemplate, "%d Pixel");
+            sprintf(fName, chrTemplate,pbmpih->cx);
+            WinSetWindowText(WinWindowFromID(hwnd, IDST_IMAGEWIDTH),fName);
+
+            sprintf(fName, chrTemplate, pbmpih->cy);
+            WinSetWindowText(WinWindowFromID(hwnd, IDST_IMAGEHEIGHT),fName);
+
+            if(!getMessage(chrTemplate, IDSTR_SPRINTFBIT, sizeof(chrTemplate),
+                           queryResModuleHandle(), hwnd))
+              strcpy(chrTemplate, "%d Bit");
+            sprintf(fName, chrTemplate, pbmpih->cBitCount);
+            WinSetWindowText(WinWindowFromID(hwnd, IDST_COLORDEPTH),fName);
+          }
+
+          WinSetWindowText(WinWindowFromID(hwnd, IDST_IMAGEFORMAT),_chrIOProcName);
+        }
+    }/* somIsObj() */
+    return (MRESULT)TRUE;
+    /* This prevents switching the notebook page behind the open folder */
+    case WM_WINDOWPOSCHANGED:
+      {
+        MRESULT mr;
+
+        if(WinQueryFocus(HWND_DESKTOP)!=
+           WinQueryWindow(WinQueryWindow(hwnd, QW_PARENT), QW_PARENT)) {
+          mp2=MPFROMLONG(LONGFROMMP(mp2)|0x80000);/*AWP_ACTIVATE 0x00080000L*/
+          mr=WinDefDlgProc(hwnd, msg, mp1, mp2);
+          return mr;
+        }
+        break;
+      }
+    case WM_FOCUSCHANGE:
+      {
+        if(!SHORT1FROMMP(mp2)) {
+          if(HWNDFROMMP(mp1)==hwnd) {
+            MRESULT mr;
+
+            mr=WinDefDlgProc(hwnd, msg, mp1, mp2);
+            WinSendMsg(WinQueryWindow(WinQueryWindow(hwnd, QW_PARENT), QW_PARENT),
+                       WM_SETFOCUS, MPFROMHWND(hwnd), (MPARAM)TRUE);
+            return mr;
+          }
+        }
+        break;
+      }
+    case WM_DESTROY:
+      /* The notebook closes and gets destroyed */
+      /* Set focus to desktop to prevent PM freeze */
+      WinSetFocus(HWND_DESKTOP, HWND_DESKTOP);
+      break;
+  default:
+    break;
+  }
+  return WinDefDlgProc(hwnd, msg, mp1, mp2);
+}
+
+/*!*******************************************************/
+/*                                                       */
+/* @@DESC                                                */
+/*                                                       */
+/* This instance method is called to allow the object    */
+/* to add the image information page to its Settings     */
+/* notebook.                                             */
+/*                                                       */
+/* @@USAGE                                               */
+/*                                                       */
+/* This method must only be called from within an        */
+/* override of wpAddSettingsPages().                     */
+/*                                                       */
+/* @@PARAM                                               */
+/*                                                       */
+/* MMImage *somSelf input                                */
+/*                                                       */
+/* Pointer to the object on which the method is being    */
+/* invoked.                                              */
+/* :p.                                                   */
+/* Points to an object of class :hp2.MMImage:ehp2..      */
+/*                                                       */
+/* @@PARAM                                               */
+/*                                                       */
+/* HWND hwndNotebook input                               */
+/*                                                       */
+/* Settings notebook handle.                             */
+/*                                                       */
+/* @@OVERRIDE                                            */
+/*                                                       */
+/* This method should always be overridden in order to   */
+/* remove or replace the image information page from     */
+/* the object's Settings notbook.                        */
+/* :p.                                                   */
+/* To remove the page from the Settings notebook, the    */
+/* override method should return                         */
+/* :hp1.SETTINGS_PAGE_REMOVED:ehp1. without calling the  */
+/* the parent method. To replace the page with another   */
+/* page, the override method should call the             */
+/* wpInsertSettingsPAge method without calling the       */
+/* parent method.                                        */
+/*                                                       */
+/* @@RETURNS                                             */
+/*                                                       */
+/* ULONG rc                                              */
+/*                                                       */
+/* :parml compact tsize=15 break=none.                   */
+/* :pt.0:pd.Error occurred                               */
+/* :pt.PageId :pd.Identifier for the inserted page.      */
+/* :eparml.                                              */
+/*                                                       */
+/*!!******************************************************/
+SOM_Scope ULONG  SOMLINK cwimg_cwmmAddImageInformationPage(MMImage *somSelf,
+                                                           HWND hwndNotebook)
+{
+  PAGEINFO pageinfo;
+  char pageName[100];
+
+  /*    MMImageData *somThis = MMImageGetData(somSelf);*/
+    MMImageMethodDebug("MMImage","cwimg_cwmmAddImageInformationPage");
+
+  //Clear the pageinfo structure
+  memset((PCH)&pageinfo, 0, sizeof(PAGEINFO));
+  //Fill the pageinfo structure
+  pageinfo.cb = sizeof(PAGEINFO);
+  pageinfo.hwndPage = NULLHANDLE;
+  pageinfo.usPageStyleFlags = BKA_MAJOR | BKA_STATUSTEXTON;
+  pageinfo.usPageInsertFlags = BKA_FIRST;
+  //We want page numbers
+  pageinfo.usSettingsFlags = SETTINGS_PAGE_NUMBERS;
+  //The dialog procedure for this page
+  pageinfo.pfnwp = imageInfoDlgProc;
+  //The resource DLL
+  pageinfo.resid = queryResModuleHandle();
+  //The ID of the dialog template
+  pageinfo.dlgid = IDDLG_IMAGEINFOPAGE;
+  //We need a pointer to our WPS-object in the dialog procedure
+  //to call class functions
+  pageinfo.pCreateParams = somSelf;
+  //The ID of the help panel for this page
+  //pageinfo.idDefaultHelpPanel = IDDLG_GENERAL2PAGE;
+
+  //Tell the WPS the help library name
+  pageinfo.pszHelpLibraryName = NULLHANDLE;
+  //We have a major tab so we need a name
+  /* pageName: "ISO filesystem" */
+  if(!getMessage(pageName, IDSTR_IMAGEINFOPAGENAME, sizeof(pageName),  queryResModuleHandle(), hwndNotebook))
+    strcpy(pageName, "~Image information");
+  pageinfo.pszName = pageName;
+  //Insert the page into the settings notebook
+  return _wpInsertSettingsPage(somSelf,hwndNotebook,&pageinfo);
+
+}
+
+/*!*******************************************************/
+/*                                                       */
+/* @@DESC                                                */
+/*                                                       */
+/* This instance method is called to get a small bitmap  */
+/* representing the image of this object.                */
+/*                                                       */
+/* @@USAGE                                               */
+/*                                                       */
+/* This method is called by a folder painting procedure  */
+/* when the objects image must be drawn as an icon in    */
+/* a folder. For example the lighttable folder uses this */
+/* to get the bitmaps of image files.                    */
+/* :p.                                                   */
+/* This method is specifically designed for the mentioned*/
+/* purpose. It is called with a pointer to the objects   */
+/* container record and the container handle. If the     */
+/* needed bitmap handle isn't already created, this      */
+/* will be done on a separate thread and afterwards the  */
+/* objects record will automatically updated with the    */
+/* new image. The caller doesn't has to wait for this and*/
+/* has not to repeat the call if a NULLHANDLE is         */
+/* returned.                                             */
+/*                                                       */
+/* @@PARAM                                               */
+/*                                                       */
+/* MMImage *somSelf input                                */
+/*                                                       */
+/* Pointer to the object on which the method is being    */
+/* invoked.                                              */
+/* :p.                                                   */
+/* Points to an object of class :hp2.MMImage:ehp2..      */
+/*                                                       */
+/* @@PARAM                                               */
+/*                                                       */
+/* ULONG ulSize      input                               */
+/*                                                       */
+/* Size of the bitmap.                                   */
+/*                                                       */
+/* @@PARAM                                               */
+/*                                                       */
+/* PMINIRECORDCORE pmrcToRefresh input                   */
+/*                                                       */
+/* The objects container record. This record will        */
+/* automatically be refreshed when the bitmap            */
+/* isn't already created.                                */
+/*                                                       */
+/* @@PARAM                                               */
+/*                                                       */
+/* HWND hwndCnr input                                    */
+/*                                                       */
+/* The container holding the object. After creating the  */
+/* bitmap the icon of the object in this container will  */
+/* be redrawn.                                           */
+/*                                                       */
+/* @@OVERRIDE                                            */
+/*                                                       */
+/* This method is generally not overridden.              */
+/*                                                       */
+/* @@RETURNS                                             */
+/*                                                       */
+/* HBITMAP hBitmap                                       */
+/*                                                       */
+/* A bitmap handle of a small bitmap usable to be drawn  */
+/* as an objects representation in a folder.             */
+/*                                                       */
+/*!!******************************************************/
+SOM_Scope HBITMAP  SOMLINK cwimg_cwmmQuerySmallBitmapHandle(MMImage *somSelf,
+                                                            ULONG ulSize,
+                                                            PMINIRECORDCORE pmrcToRefresh,
+                                                            HWND hwndCnr)
+{
+    MMImageData *somThis = MMImageGetData(somSelf);
+    MMImageMethodDebug("MMImage","cwimg_cwmmQuerySmallBitmap");
+
+    //      SysWriteToTrapLog("In %s, line %d. ulSize: %d\n", __FUNCTION__, __LINE__, ulSize);
+
+
+#ifdef DEBUG
+      SysWriteToTrapLog("In %s, line %d. somself: 0x%x, ulSize: 0x%x, mrc: 0x%x, hwndCnr: 0x%x.\n",
+                        __FUNCTION__, __LINE__, somSelf, ulSize, pmrcToRefresh, hwndCnr);
+
+
+      //SysWriteToTrapLog("In %s, line %d. ulSize: 0x%x, mrc: 0x%x, hwndCnr: 0x%x, _bNoIOProcAvailable: 0x%x, somSelf: 0x%x,  somThis: 0x%x.\n",
+      //                __FUNCTION__, __LINE__, ulSize, pmrcToRefresh, hwndCnr, _bNoIOProcAvailable, somSelf, somThis);
+#endif
+
+      if(_bNoIOProcAvailable)
+        return NULLHANDLE; /* No IO-proc for this image format. Don't try again in the future.
+                            This var is set if we trapped during reading. */
+
+      if(!_wpIsObjectInitialized(somSelf)) {
+#ifdef DEBUG
+      SysWriteToTrapLog("In %s, line %d Object is not initialized\n", __FUNCTION__, __LINE__);
+#endif
+      return NULLHANDLE;
+      }
+#ifdef DEBUG
+      SysWriteToTrapLog("In %s, line %d\n", __FUNCTION__, __LINE__);
+#endif
+
+    if(ulSize<MAX_SIZE_SMALLBITMAP)
+      ulSize=MAX_SIZE_SMALLBITMAP;
+
+    if(ulSize>_ulSizeSmallBitmap)
+      {
+        if(_hBitmapSmall) {
+          GpiDeleteBitmap(_hBitmapSmall);
+          _hBitmapSmall=NULLHANDLE;
+        }
+      }
+
+    /*
+       FIXME: use WinIsWindow() here??
+     */
+    if(!_hBitmapSmall && hwndCreateBMP) {
+      ULONG ulError;
+      PCREATEBMPINFO pCreateBMP;
+      _ulSizeSmallBitmap=0;
+
+      /* Allocate memory for small bitmap info for the thread */
+      //      if((pCreateBMP=(PCREATEBMPINFO)_wp_AllocMem(somSelf, sizeof(CREATEBMPINFO),&ulError))==NULLHANDLE)
+      if((pCreateBMP=(PCREATEBMPINFO)malloc( sizeof(CREATEBMPINFO)))==NULL)
+        return NULLHANDLE;
+
+      pCreateBMP->ulWidth=ulSize;
+      pCreateBMP->ulHeight=ulSize;
+      pCreateBMP->wpObject=somSelf;
+      pCreateBMP->pmrcToRefresh=pmrcToRefresh;
+      pCreateBMP->hwndCnr=hwndCnr;
+
+#ifdef DEBUG
+      SysWriteToTrapLog("In %s, line %d. Sending msg to create thread.\n", __FUNCTION__, __LINE__);
+#endif
+
+      WinPostMsg(hwndCreateBMP, WM_APPTERMINATENOTIFY,MPFROMP(pCreateBMP), MPFROM2SHORT(0, ACKEY_CREATE_SMALLBITMAP));
+      return NULLHANDLE;
+    }
+    /* Return statement to be customized: */
+    return _hBitmapSmall;
+}
+
+
+SOM_Scope void  SOMLINK cwimg_cwmmFreeBitmaps(MMImage *somSelf)
+{
+    MMImageData *somThis = MMImageGetData(somSelf);
+    MMImageMethodDebug("MMImage","cwimg_cwmmFreeBitmaps");
+
+
+    if(_pBmpInfoHeader2) {
+      free(_pBmpInfoHeader2);
+      //  _wp_FreeMem(somSelf, _pBmpInfoHeader2);
+      _pBmpInfoHeader2=NULLHANDLE;
+      _chrIOProcName[0]=0;
+    }
+
+    if(_hBitmap) {
+      GpiDeleteBitmap(_hBitmap);
+      _hBitmap=NULLHANDLE;
+    }
+
+    _cwmmFreeSmallBitmap(somSelf);
+}
+
+/*
+ * The prototype for cwimg_cwmmFreeSmallBitmap was replaced by the following prototype:
+ */
+SOM_Scope void  SOMLINK cwimg_cwmmFreeSmallBitmap(MMImage *somSelf)
+{
+    MMImageData *somThis = MMImageGetData(somSelf);
+    MMImageMethodDebug("MMImage","cwimg_cwmmFreeSmallBitmap");
+
+    /*
+      V0.2.8 CW 2004/11/01
+
+      Added serialization using the object semaphore
+
+
+    if(!_wpRequestObjectMutexSem(somSelf, 2000))
+      return;
+     */
+    if(_hBitmapSmall) {
+
+      GpiDeleteBitmap(_hBitmapSmall);
+      _hBitmapSmall=NULLHANDLE;
+      _ulSizeSmallBitmap=0;
+    }
+    //    _wpReleaseObjectMutexSem(somSelf);
+}
+
+/* New with V0.2.5, CW 2003/01/02 */
+
+/*
+ * SOM_Scope ULONG  SOMLINK cwimg_cwmmQueryImageInfo(MMImage *somSelf,
+ *                                                   char** chrString,
+ *                                                   ULONG ulSize,
+ *                                                   int iWhich)
+ */
+
+/*
+ * The prototype for cwimg_cwmmQueryImageInfo was replaced by the following prototype:
+ */
+SOM_Scope ULONG  SOMLINK cwimg_cwmmQueryImageInfo(MMImage *somSelf,
+                                                  char** chrString,
+                                                  ULONG ulSize,
+                                                  long iWhich)
+{
+  PBITMAPINFOHEADER2 pBmpInfoHdr2=NULLHANDLE;
+  ULONG ulWidth, ulHeight, ulDepth;
+    MMImageData *somThis = MMImageGetData(somSelf);
+    MMImageMethodDebug("MMImage","cwimg_cwmmQueryImageInfo");
+
+    pBmpInfoHdr2=(PBITMAPINFOHEADER2) _wpQueryBitmapInfoHeader(somSelf);
+
+    if(!pBmpInfoHdr2)
+      return 0;
+
+    if(pBmpInfoHdr2->cbFix==sizeof(BITMAPINFOHEADER2)) {
+      ulWidth=pBmpInfoHdr2->cx;
+      ulHeight=pBmpInfoHdr2->cy;
+      ulDepth=pBmpInfoHdr2->cBitCount;
+    }
+    else {
+      PBITMAPINFOHEADER pBmpInfoHdr=(PBITMAPINFOHEADER)pBmpInfoHdr2;
+          ulWidth=pBmpInfoHdr->cx;
+          ulHeight=pBmpInfoHdr->cy;
+          ulDepth=pBmpInfoHdr->cBitCount;
+    }
+    switch(iWhich)
+      {
+      case IDINFO_WIDTH:
+        return ulWidth;
+      case IDINFO_HEIGHT:
+        return ulHeight;
+      case IDINFO_BPP:
+        return ulDepth;
+      case IDINFO_FORMAT:
+        {
+          char *chr;
+          /* Image format */
+          if(!chrString)
+            return 0;
+          chr=*chrString;
+          strncpy(chr, _chrIOProcName, ulSize);
+          chr[ulSize-1]=0;
+          if(chr[0]==0)
+            return 0;
+          else
+            return 1;
+        }
+      default:
+        break;
+      }
+    return 0;
+}
+
+SOM_Scope void  SOMLINK cwimg_cwmmRequestBmpDeletion(MMImage *somSelf,
+                                                     ULONG ulFlags)
+{
+  PUSEITEM pui;
+  BOOL bDeleteBmp=FALSE;
+
+    MMImageData *somThis = MMImageGetData(somSelf);
+    MMImageMethodDebug("MMImage","cwimg_cwmmRequestBmpDeletion");
+
+
+  /*
+    Unfortunately only bitmaps for real files are currently deleted. When using links in folders
+    the lock counter isn't touched so we don't get a notification.
+    _wpUnlockObject isn't called when links are going dormant (do they?) after closing the links folder.
+
+    BTW XWorkplace (V1.0.0) keeps every object locked
+    after first touching it and NEVER completely unlocks it!
+   */
+    TRY_LOUD(BITMAP_DELETION) {
+      if((pui=_wpFindUseItem(somSelf, USAGE_RECORD, NULLHANDLE))==NULLHANDLE) {
+        bDeleteBmp=TRUE;
+      }
+      else {
+        /* There's at least one usage record. Check if the icon is visible */
+        RECTL rectl2;
+        PRECORDITEM pri=(PRECORDITEM)(++pui);
+
+        /*
+          V0.2.9 CW 2004/11/12
+
+          Check if small bitmaps for icons are currently visible in any container. This is useful if the
+          user scrolls a folder with a lot of pictures.
+          */
+        pui--;
+        bDeleteBmp=TRUE;
+        for(;pui ; pui=_wpFindUseItem(somSelf, USAGE_RECORD, pui)) {
+          pri=(PRECORDITEM)(++pui);
+          pui--;
+          if(WinSendMsg(pri->hwndCnr, CM_QUERYVIEWPORTRECT, MPFROMP(&rectl2), MPFROM2SHORT(CMA_WORKSPACE, FALSE))) {
+
+            if(pri->pRecord->ptlIcon.y >= rectl2.yBottom  && pri->pRecord->ptlIcon.y <= rectl2.yTop &&
+               pri->pRecord->ptlIcon.x >= rectl2.xLeft && pri->pRecord->ptlIcon.x < rectl2.xRight)
+              bDeleteBmp=FALSE;
+
+          }/* WinSendMsg() */
+        }
+      }/* else */
+    }/* Try */
+    CATCH(BITMAP_DELETION)
+      {
+        SysWriteToTrapLog("\nTrap occured in %s, file %s, around line %d.\n",
+                          __FUNCTION__, __FILE__, __LINE__);
+      } END_CATCH;
+
+    if(bDeleteBmp) {
+      /* Check if queue is full. If yes post semaphore so the other thread cleans up. */
+      if(ulNumBMPDelete> BMP_DEL_UPPER) {
+        DosPostEventSem(hevDeleteBMP);
+        /* Yield cpu so the delete thread may run */
+        DosSleep(20);
+        /* Thread isn't fast enough so delete the bitmap directly */
+        if(ulNumBMPDelete>BMP_QUEUE_SIZE-7) {
+          _cwmmFreeBitmaps(somSelf);
+          return;
+        }
+      }
+      ulNumBMPDelete++;
+      WinPostMsg(g_hwndDeleteBMP, IMGWM_DELETEBITMAP, MPFROMP(somSelf), MPFROM2SHORT(0, ACKEY_CREATE_SMALLBITMAP));
+    }
+}
+
+/*
+ * The prototype for cwimg_wpQueryBitmapHandle was replaced by the following prototype:
+ */
+SOM_Scope BOOL  SOMLINK cwimg_wpQueryBitmapHandle(MMImage *somSelf,
+                                                  HBITMAP* phBitmap,
+                                                  HPAL* phPalette,
+                                                  ULONG ulWidth,
+                                                  ULONG ulHeight,
+                                                  ULONG ulFlags,
+                                                  long lBackgroundColor,
+                                                  BOOL* pbQuitEarly)
+{
+  ULONG ulSize;
+  char chrName[CCHMAXPATH];
+
+    MMImageData *somThis = MMImageGetData(somSelf);
+    MMImageMethodDebug("MMImage","cwimg_wpQueryBitmapHandle");
+
+    /* Check parameter */
+    if(!phBitmap)
+      return FALSE;
+
+    if(!_wpReadImageFile(somSelf))
+      return FALSE;
+
+    *phBitmap=NULLHANDLE;
+    if(phPalette)
+      *phPalette=NULLHANDLE;
+
+    ulSize=sizeof(chrName);
+    if(!_wpQueryRealName(somSelf, chrName, &ulSize,TRUE))
+      return FALSE;
+
+
+    TRY_LOUD(QRY_HBM) {
+      /* Create a new (maybe smaller) bitmap from the normal size bitmap */
+      *phBitmap=createNewBitmap ( _hBitmap, (PBITMAPINFOHEADER2) _pBmpInfoHeader2,
+                                  ulWidth, ulHeight , pbQuitEarly);
+    }
+    CATCH(QRY_HBM)
+      {
+        *phBitmap=NULLHANDLE;
+
+        SysWriteToTrapLog("\nTrap occured in %s, file %s, around line %d while calling createNewBitmap().\n",
+                          __FUNCTION__, __FILE__, __LINE__);
+        SysWriteToTrapLog("Image file: %s\n\n",
+                          chrName);
+      } END_CATCH;
+
+      if(!*phBitmap)
+        return FALSE;
+
+    return TRUE;
+}
+
+/*
+ * The prototype for cwimg_wpQueryBitmapInfoHeader was replaced by the following prototype:
+ */
+SOM_Scope PBYTE  SOMLINK cwimg_wpQueryBitmapInfoHeader(MMImage *somSelf)
+{
+  ULONG ulSize;
+  char chrName[CCHMAXPATH];
+  PBYTE pByte=NULLHANDLE;
+  BOOL bGotHeader=FALSE;
+  BOOL bSem;
+
+  MMImageData *somThis = MMImageGetData(somSelf);
+    MMImageMethodDebug("MMImage","cwimg_wpQueryBitmapInfoHeader");
+
+#ifdef DEBUG
+      SysWriteToTrapLog("In _wpQueryBitmapInfoHeader(), line %d\n", __LINE__);
+#endif
+
+    /* This is necessary for newly created files. */
+    if(!_wpIsObjectInitialized(somSelf))
+      return NULLHANDLE;
+
+
+#ifdef DEBUG
+    ulSize=sizeof(chrName);
+    if(_wpQueryRealName(somSelf, chrName, &ulSize,TRUE))
+      SysWriteToTrapLog("In _wpQueryBitmapInfoHeader() for %s\n", chrName);
+    else
+      SysWriteToTrapLog("In _wpQueryBitmapInfoHeader(), filename unknown\n");
+#endif
+
+    if(_pBmpInfoHeader2)
+      return _pBmpInfoHeader2;
+
+    if(_bNoIOProcAvailable)
+      return NULL; /* No IO-proc for this image format. Don't try again in the future. */
+
+    /*
+      Don't request the object sem here. The call may block at least when a light table
+      folder tries to show the object.
+      Problem is that there's a race condition with the code in the light table frame proc trying
+      to get the bitmap header (now disabled if small bitmap can't be loaded) for newly inserted
+      objects. As soon as _wpAllocMem() is called in the code below the WPS blocks. Probably there's
+      a problem with inserting the USAGE_MEMORY item in the in use list while the folder is inserting
+      a USAGE_RECORD item. One would assume requesting the mutex solves this but no go... The call
+      to _wpRequestObjectMutexSem() just blocks for the specified timeout without returning the semaphor.
+      Probably that's exactly what's happening in _wpAllocMem().
+
+      bSem=_wpRequestObjectMutexSem(somSelf, 3000);//SEM_INDEFINITE_WAIT);
+
+      */
+
+#if 0
+    if(!_wpAssertObjectMutexSem(somSelf))
+      {
+        DosBeep(500, 130);
+#if 0
+        //        bSem=_wpRequestObjectMutexSem(somSelf, 3000);
+        if(bSem)
+          {
+            DosBeep(5000, 130);
+            _wpReleaseObjectMutexSem(somSelf);
+            //return NULLHANDLE;
+          }
+#endif
+      }
+#endif
+
+    TRY_LOUD(GET_BMPIH) {
+      for(;;)
+        {
+
+          ulSize=sizeof(chrName);
+          if(!_wpQueryRealName(somSelf, chrName, &ulSize,TRUE))
+            break;
+
+          //          if((pByte=_wp_AllocMem(somSelf, sizeof(BITMAPINFOHEADER2)+256*sizeof(RGB2), &ulSize))==NULLHANDLE)
+          if((pByte=malloc(sizeof(BITMAPINFOHEADER2)+256*sizeof(RGB2)))==NULLHANDLE)
+            break;
+
+          bGotHeader=getBmpInfoHeader( (PBITMAPINFOHEADER2) pByte, chrName, _chrIOProcName,
+                                       sizeof(_chrIOProcName), &_bNoIOProcAvailable);
+          break;
+        }
+    }
+    CATCH(GET_BMPIH)
+      {
+#if 0
+        if(MBID_YES==showMsgBoxFlag(IDSTR_CWIMAGETITLE, IDSTR_IMGIOPROCCRASH, queryModuleHandle(),
+                             MB_YESNO | MB_MOVEABLE | MB_WARNING))
+          exit(0);
+#endif
+        SysWriteToTrapLog("\nTrap occured in %s, file %s, around line %d while calling getBmpInfoHeader().\n",
+                          __FUNCTION__, __FILE__, __LINE__);
+        SysWriteToTrapLog("Image file: %s\n\n",
+                          chrName);
+      } END_CATCH;
+
+#if 0
+      if(bSem) {
+        //DosBeep(5000, 50);
+      _wpReleaseObjectMutexSem(somSelf);
+      }
+#endif
+
+#ifdef DEBUG
+      if(bGotHeader)
+        SysWriteToTrapLog("%s Got header...\n", __FUNCTION__);
+      else
+        SysWriteToTrapLog("Error with header...\n");
+#endif
+
+    if(!bGotHeader) {
+      if(pByte)
+        free(pByte);
+        //        _wp_FreeMem(somSelf, pByte);
+      _pBmpInfoHeader2=NULLHANDLE;
+      _chrIOProcName[0]=0;
+      return NULL;
+    }
+    _pBmpInfoHeader2=pByte;
+    /* Update instance data */
+    if(((PBITMAPINFOHEADER2)_pBmpInfoHeader2)->cbFix==sizeof(BITMAPINFOHEADER2)) {
+      _ulWidth=((PBITMAPINFOHEADER2)_pBmpInfoHeader2)->cx;
+      _ulHeight=((PBITMAPINFOHEADER2)_pBmpInfoHeader2)->cy;
+      _ulDepth=((PBITMAPINFOHEADER2)_pBmpInfoHeader2)->cBitCount;
+    }
+    else {
+      PBITMAPINFOHEADER pBmpInfoHdr=(PBITMAPINFOHEADER)_pBmpInfoHeader2;
+      _ulWidth=pBmpInfoHdr->cx;
+      _ulHeight=pBmpInfoHdr->cy;
+      _ulDepth=pBmpInfoHdr->cBitCount;
+    }
+
+    return (PBYTE) _pBmpInfoHeader2;
+}
+
+/*
+ * The prototype for cwimg_wpQueryBitmapData was replaced by the following prototype:
+ */
+SOM_Scope PBYTE  SOMLINK cwimg_wpQueryBitmapData(MMImage *somSelf,
+                                                 ULONG* pulSize)
+{
+    /* CWImageData *somThis = CWImageGetData(somSelf); */
+    MMImageMethodDebug("MMImage","cwimg_wpQueryBitmapData");
+
+    NOT_IMPLEMENTED
+
+    return (MMImage_parent_WPImageFile_wpQueryBitmapData(somSelf, pulSize));
+}
+
+/*
+ * The prototype for cwimg_wpSetBitmapData was replaced by the following prototype:
+ */
+SOM_Scope BOOL  SOMLINK cwimg_wpSetBitmapData(MMImage *somSelf,
+                                              PBYTE pBitmapData,
+                                              ULONG ulSize)
+{
+    /* CWImageData *somThis = CWImageGetData(somSelf); */
+    MMImageMethodDebug("MMImage","cwimg_wpSetBitmapData");
+
+    NOT_IMPLEMENTED
+
+#if 0
+    WinMessageBox(HWND_DESKTOP, HWND_DESKTOP,
+                  "This function is not available. Please tell the author the steps causing this message box so the function may be implemented.",
+                  "cwimg_wpSetBitmapData",
+                  0UL, MB_OK | MB_ICONEXCLAMATION|MB_MOVEABLE );
+#endif
+
+    return (MMImage_parent_WPImageFile_wpSetBitmapData(somSelf,
+                                                       pBitmapData,
+                                                       ulSize));
+}
+
+/*
+ * The prototype for cwimg_wpReadImageFile was replaced by the following prototype:
+ */
+SOM_Scope BOOL  SOMLINK cwimg_wpReadImageFile(MMImage *somSelf)
+{
+  char chrName[CCHMAXPATH];
+  ULONG ulSize;
+  BOOL bGotHeader=FALSE;
+
+  MMImageData *somThis = MMImageGetData(somSelf);
+    MMImageMethodDebug("MMImage","cwimg_wpReadImageFile");
+
+    if(!_wpIsObjectInitialized(somSelf))
+      return NULLHANDLE;
+
+    if(_hBitmap)
+      return TRUE;
+
+    ulSize=sizeof(chrName);
+    if(!_wpQueryRealName(somSelf, chrName, &ulSize,TRUE))
+      return FALSE;
+
+#ifdef DEBUG
+    SysWriteToTrapLog("In _wpReadImageFile(), file: %s \n",
+             chrName);
+#endif
+
+    TRY_LOUD(LOAD_BMP) {
+      if(_wpQueryBitmapInfoHeader(somSelf))
+        bGotHeader=TRUE;
+    }
+    CATCH(LOAD_BMP)
+      {
+        SysWriteToTrapLog("\nTrap occured in %s, file %s, around line %d while calling _wpQueryBitmapInfoHeader().\n",
+                          __FUNCTION__, __FILE__, __LINE__);
+        SysWriteToTrapLog("Image file: %s\n",
+                          chrName);
+      }END_CATCH;
+
+      if(!bGotHeader)
+        return FALSE;
+      _hBitmap=NULLHANDLE;
+
+      TRY_LOUD(LOAD_BMP2) {
+        _hBitmap=loadBitmap ( chrName , (PBITMAPINFOHEADER2) _pBmpInfoHeader2);
+      }
+      CATCH(LOAD_BMP2)
+        {
+          SysWriteToTrapLog("\nTrap occured in %s (LOAD_BMP2), file %s, around line %d while calling _wpQueryBitmapInfoHeader()\nwith image file %s.\n",
+                            __FUNCTION__, __FILE__, __LINE__, chrName);
+          SysWriteToTrapLog("Remembering file as invalid.\n");
+          /*
+            V0.2.8 CW 2004/11/01
+
+            Mark file which caused a trap as invalid.
+           */
+          _bNoIOProcAvailable=TRUE;
+        } END_CATCH;
+
+        if(!_hBitmap) {
+          return FALSE;
+        }
+
+        return TRUE;
+}
+
+
+SOM_Scope BOOL  SOMLINK cwimg_wpWriteImageFile(MMImage *somSelf)
+{
+    /* CWImageData *somThis = CWImageGetData(somSelf); */
+    MMImageMethodDebug("MMImage","cwimg_wpWriteImageFile");
+
+    NOT_IMPLEMENTED
+
+#if 0
+    WinMessageBox(HWND_DESKTOP, HWND_DESKTOP,
+                  "This function is not available. Please tell the author the steps causing this message box so the function may be implemented.",
+                  "cwimg_wpWriteImageFile",
+                  0UL, MB_OK | MB_ICONEXCLAMATION|MB_MOVEABLE );
+#endif
+
+    return (MMImage_parent_WPImageFile_wpWriteImageFile(somSelf));
+}
+
+/*
+ * wpInitData:   override; Not used. Default is instance var initializing to zero and that's what we need.
+ */
+
+
+SOM_Scope void  SOMLINK cwimg_wpUnInitData(MMImage *somSelf)
+{
+    MMImageData *somThis = MMImageGetData(somSelf);
+    MMImageMethodDebug("MMImage","cwimg_wpUnInitData");
+
+    if(_pBmpInfoHeader2) {
+      free(_pBmpInfoHeader2);
+      //  _wp_FreeMem(somSelf, _pBmpInfoHeader2);
+      _pBmpInfoHeader2=NULLHANDLE;
+    }
+    /* This frees all bitmaps. Small for icons and the normal size one */
+    _cwmmFreeBitmaps(somSelf);
+    MMImage_parent_WPImageFile_wpUnInitData(somSelf);
+}
+
+/*
+  FIXME:
+
+  This function isn't thread safe because of one global memory area. It is supposed to be
+  called from the wpPopupMenu() method. This method can only be called once at
+  a time, so that's not a problem. It may become a problem if this function is also
+  called from somewhere else. The global mem pointer is used by the image class and the
+  audio class.
+*/
+BOOL insertIOProcMenuItems( HWND hwndMenu )
+{
+    CHAR          szBuffer[ sizeof( FOURCC ) + CCHMAXPATH + 4 ];
+    MMFORMATINFO  mmFormatInfo;
+    PMMFORMATINFO pmmFormatInfoArray;
+    ULONG         ulReturnCode;
+    LONG          lFormatsRead;
+    LONG          index;
+    LONG          lBytesRead;
+    HWND hwndSubMenu;
+    MENUITEM mi;
+
+    if(g_pmmFormatInfoArray)
+      free(g_pmmFormatInfoArray);
+    g_pmmFormatInfoArray=NULLHANDLE;
+
+    memset( &mmFormatInfo,
+            '\0',
+            sizeof(MMFORMATINFO) );
+
+    mmFormatInfo.ulMediaType |= MMIO_MEDIATYPE_IMAGE;
+    mmFormatInfo.ulFlags|=MMIO_CANWRITETRANSLATED;
+    ulReturnCode = mmioQueryFormatCount ( &mmFormatInfo,
+                                          &lNumIOProcs,
+                                          0,
+                                          0 );
+
+    if( ulReturnCode != MMIO_SUCCESS )
+      {
+        /* Error - mmioQueryFormatCount failed. */
+        return FALSE;
+      }
+
+    /*
+     * Allocate enough memory for n number of FormatInfo blocks
+     */
+    g_pmmFormatInfoArray = malloc (lNumIOProcs * sizeof( MMFORMATINFO ) );
+    if( g_pmmFormatInfoArray == NULL )
+      {
+        /* Could not allocate enough memory for mmFormatInfo array. */
+        return FALSE;
+      }
+
+    /*
+     * call mmioGetFormats to get info on the formats supported.
+     */
+    ulReturnCode = mmioGetFormats( &mmFormatInfo,
+                                   lNumIOProcs,
+                                   g_pmmFormatInfoArray,
+                                   &lFormatsRead,
+                                   0,
+                                   0 );
+    if( ulReturnCode != MMIO_SUCCESS )
+      {
+        /*
+         *  mmioGetFormats failed.
+         */
+        free(g_pmmFormatInfoArray);
+        g_pmmFormatInfoArray=NULLHANDLE;
+        return FALSE;
+      }
+
+    if( lFormatsRead != lNumIOProcs )
+      {
+        /*
+         * Error in MMIO - number of formats read in by
+         * mmioGetFormats is not equal to number of formats
+         * found by mmioQueryFormatCount.
+         */
+        free(g_pmmFormatInfoArray);
+        g_pmmFormatInfoArray=NULLHANDLE;
+        return FALSE;
+      }
+
+    // Create Empty Submenu //
+    hwndSubMenu=WinCreateWindow(hwndMenu,WC_MENU,"",0,
+                                0,0,0,0,
+                                hwndMenu,//Owner. If set, this window
+                                //is destroyed if owner is destroyed
+                                HWND_TOP,
+                                ID_MENU_CONVERT,//menuid
+                                NULL,NULL);
+
+    mi.iPosition=MIT_END;
+    mi.afStyle=MIS_TEXT;//|MIS_SUBMENU;
+    mi.id=ID_MENU_CONVERT;
+    mi.afAttribute=NULLHANDLE;
+    mi.hwndSubMenu=NULLHANDLE;//hwndSubMenu;
+    mi.hItem=NULLHANDLE;
+    mi.hwndSubMenu=hwndSubMenu;
+
+    if(!getMessage(szBuffer, IDSTR_MENU_CONVERT, sizeof(szBuffer), queryResModuleHandle(), HWND_DESKTOP))
+       sprintf(szBuffer,"~Convert to");
+    WinSendMsg(hwndMenu,MM_INSERTITEM,(MPARAM)&mi,
+               (MPARAM)szBuffer);
+
+    pmmFormatInfoArray=g_pmmFormatInfoArray;
+    for ( index = 0; index <lNumIOProcs; index++ )
+      {
+        ulReturnCode = mmioGetFormatName(pmmFormatInfoArray, szBuffer, &lBytesRead, 0L, 0L);
+        if(ulReturnCode)
+	  {
+	  SysWriteToTrapLog("IO-Proc 2: %s %u\n\n", szBuffer, ulReturnCode);
+	  continue;
+          }        
+        /* Insert NULL string terminator */
+        *( szBuffer + lBytesRead ) = (CHAR)NULL;
+
+        /* Compressed TIF is not supported because the Warp 4 IO-Procs are
+           broken. */
+        //        HlpWriteToTrapLog("---------  IO-Proc: %s, Name: %s\n",  pmmFormatInfoArray->szDefaultFormatExt,
+        //                szBuffer);
+
+        if(pmmFormatInfoArray->fccIOProc!=mmioStringToFOURCC("TFMC",MMIO_TOUPPER) &&
+           pmmFormatInfoArray->fccIOProc!=mmioStringToFOURCC("TFIC",MMIO_TOUPPER) &&
+           (pmmFormatInfoArray->ulFlags & MMIO_CANWRITETRANSLATED))
+          {
+            /* Add menu item */
+            /* Fill the MENUITEM structure */
+            mi.iPosition=MIT_END;
+            mi.afStyle=MIS_TEXT|MIS_SUBMENU;
+            mi.id=ID_ITEM_FIRSTCONVERT+index;/* Create menu id */
+            mi.afAttribute=NULLHANDLE;
+            mi.hwndSubMenu=NULLHANDLE;//hwndSubMenu;
+            mi.hItem=NULLHANDLE;
+            WinSendMsg(hwndSubMenu, MM_INSERTITEM,(MPARAM)&mi,
+                       (MPARAM)szBuffer);
+          }
+        /*
+         *  advance to next entry in mmFormatInfo array
+         */
+        pmmFormatInfoArray++;
+      }
+    return TRUE;
+}
+
+
+
+/*
+ * wpInitData:   override; Not used. Default is instance var initializing to zero and that's what we need.
+ */
+
+SOM_Scope ULONG  SOMLINK cwimg_wpQueryDefaultView(MMImage *somSelf)
+{
+  ULONG ulReturn;
+
+  /*    MMImageData *somThis = MMImageGetData(somSelf);*/
+    MMImageMethodDebug("MMImage","cwimg_wpQueryDefaultView");
+
+    ulReturn=(MMImage_parent_WPImageFile_wpQueryDefaultView(somSelf));
+
+    if(ulReturn==OPEN_RUNNING)
+      {
+        ULONG ulHowMatched=1;
+        char chrID[100];
+        /* Check if associated program is still available */
+        if(!_wpQueryAssociatedProgram(somSelf, OPEN_RUNNING, &ulHowMatched,
+                                      chrID, sizeof(chrID),(PSZ)-1))
+          return ID_MENU_IMGEDITOR; /* The associated progarm is lost */
+      }
+    return ulReturn;
+}
+
+/*
+ * The prototype for cwimg_wpModifyPopupMenu was replaced by the following prototype:
+ */
+SOM_Scope BOOL  SOMLINK cwimg_wpModifyPopupMenu(MMImage *somSelf,
+                                                HWND hwndMenu,
+                                                HWND hwndCnr,
+                                                ULONG iPosition)
+{
+  MMImageData *somThis = MMImageGetData(somSelf);
+    MMImageMethodDebug("MMImage","cwimg_wpModifyPopupMenu");
+    _wpInsertPopupMenuItems(somSelf, hwndMenu, 1, queryResModuleHandle(), ID_MENU_IMGEDITOR, 1);
+
+    TRY_LOUD(IMAGE_INSERTPOPUPMENU) {
+      /* Insert image info */
+      if(_ulWidth!=0 && _ulHeight!=0 && _ulDepth!=0)
+        {
+          char text[120];
+          char menuText[200];
+          MENUITEM menuItem;
+
+          if(!getMessage(text, IDSTR_MENU_IMAGEINFO, sizeof(text), queryResModuleHandle(), hwndMenu))
+            strcpy(text, "Image information: %d x %d x %d");
+
+          sprintf(menuText, text, _ulWidth, _ulHeight, _ulDepth);//create menuitem
+
+          //insert size menuitem in popupmenu
+
+          menuItem.iPosition=MIT_END;
+          menuItem.afStyle=MIS_TEXT|MIS_STATIC;
+          menuItem.afAttribute=0;
+          menuItem.id=ID_MENU_IMAGEINFO;
+          menuItem.hwndSubMenu=NULLHANDLE;
+          menuItem.hItem=0;
+          WinSendMsg(hwndMenu,MM_INSERTITEM,(MPARAM)&menuItem,(MPARAM)&menuText);
+        }
+      /* Insert all known image I/O procs */
+      insertIOProcMenuItems( hwndMenu );
+      menuInsertMenuSeparator(hwndMenu, NULLHANDLE, MIT_END );
+
+    }/* TRY_LOUD */
+    CATCH(IMAGE_INSERTPOPUPMENU)
+      {
+        SysWriteToTrapLog("\nTrap occured in %s, file %s, around line %d.\n",
+                          __FUNCTION__, __FILE__, __LINE__);
+      } END_CATCH;
+
+    return (MMImage_parent_WPImageFile_wpModifyPopupMenu(somSelf,
+                                                         hwndMenu,
+                                                         hwndCnr,
+                                                         iPosition));
+}
+
+
+/*
+ * The prototype for cwimg_wpMenuItemSelected was replaced by the following prototype:
+ */
+SOM_Scope BOOL  SOMLINK cwimg_wpMenuItemSelected(MMImage *somSelf,
+                                                 HWND hwndFrame,
+                                                 ULONG ulMenuId)
+{
+  /*    MMImageData *somThis = MMImageGetData(somSelf);*/
+    MMImageMethodDebug("MMImage","cwimg_wpMenuItemSelected");
+
+    if(ulMenuId>=ID_ITEM_FIRSTCONVERT && ulMenuId<=ID_ITEM_FIRSTCONVERT+lNumIOProcs-1)
+      {
+        char chrEditor[CCHMAXPATH]={0};
+        char chrParams[2*CCHMAXPATH]="\"";
+        char *chrPtr=chrParams;
+        ULONG ulSize;
+        ULONG ulRc;
+
+        PrfQueryProfileString(HINI_USERPROFILE, "CWMM", "imageconverter", "", chrEditor,
+                              sizeof(chrEditor));
+        chrPtr++;
+        ulSize=sizeof(chrParams);
+        _wpQueryRealName(somSelf, chrPtr, &ulSize, TRUE);
+        strcat(chrPtr,"\" \"");
+        chrPtr=strrchr(chrPtr, 0);
+        ulRc = mmioGetFormatName(&g_pmmFormatInfoArray[ulMenuId-ID_ITEM_FIRSTCONVERT], chrPtr,(LONG*) &ulSize, 0L, 0L);
+        if(ulRc)
+	  {
+	  SysWriteToTrapLog("cwimg_wpMenuItemSelected: %s %u\n\n", chrPtr, ulRc);
+	  }
+        *( chrPtr + ulSize ) = (CHAR)NULL;
+        strcat(chrPtr,"\"");
+
+        if((ulRc=launchPMProg("", chrEditor, chrParams, somSelf, ulMenuId-ID_ITEM_FIRSTCONVERT))==NULLHANDLE) {
+          /* Error */
+          return TRUE;
+        }
+        return TRUE;
+      }
+
+    switch(ulMenuId)
+      {
+      case ID_MENU_IMGEDITOR:
+        _wpViewObject(somSelf, NULLHANDLE, ulMenuId, 0);
+        return TRUE;
+      default:
+        break;
+      }
+
+    return (MMImage_parent_WPImageFile_wpMenuItemSelected(somSelf,
+                                                          hwndFrame,
+                                                          ulMenuId));
+}
+
+/*
+ * The prototype for cwimg_wpOpen was replaced by the following prototype:
+ */
+SOM_Scope HWND  SOMLINK cwimg_wpOpen(MMImage *somSelf, HWND hwndCnr,
+                                     ULONG ulView, ULONG param)
+{
+  /*    CWImageData *somThis = CWImageGetData(somSelf); */
+    MMImageMethodDebug("MMImage","cwimg_wpOpen");
+
+   switch(ulView)
+     {
+     case ID_MENU_IMGEDITOR:
+        /*case 0xbc2b:   editor */
+        {
+          char chrEditor[CCHMAXPATH]={0};
+          char chrParams[CCHMAXPATH+2]="\"";
+          char chrTitle[50];
+          char *chrPtr=chrParams;
+          ULONG ulSize;
+          ULONG ulRc;
+
+          //          PrfQueryProfileString(HINI_USERPROFILE, "CWMM", "imageeditor", "ib.exe", chrEditor,
+          //                    sizeof(chrEditor)); /* Default is ib.exe */
+          if(!PrfQueryProfileString(HINI_USERPROFILE, "CWMM", "imageeditor", NULLHANDLE, chrEditor,
+                                    sizeof(chrEditor)))
+            /* No user setting. Use default ib.exe copied by the installation program to another location. IF this setting is missing
+               try the app from the path. */
+            PrfQueryProfileString(HINI_USERPROFILE, "CWMM", "ib", "ib.exe", chrEditor,
+                                  sizeof(chrEditor));
+
+
+          chrPtr++;
+          ulSize=sizeof(chrParams)-2;
+          _wpQueryRealName(somSelf, chrPtr, &ulSize, TRUE);
+          strcat(chrPtr,"\"");
+          if(!getMessage(chrTitle, IDSTR_IMGEDITORTITLE, sizeof(chrTitle), queryResModuleHandle(), HWND_DESKTOP))
+            strcpy(chrTitle, "Editor");
+
+          if((ulRc=launchPMProg( chrTitle, chrEditor, chrParams, somSelf, ulView))==NULLHANDLE) {
+            return NULLHANDLE;
+          }
+          return NULLHANDLE;
+        }
+     default:
+       break;
+     }
+
+    return (MMImage_parent_WPImageFile_wpOpen(somSelf, hwndCnr,
+                                              ulView, param));
+}
+
+
+/*
+ * The prototype for cwimg_wpAddSettingsPages was replaced by the following prototype:
+ */
+SOM_Scope BOOL  SOMLINK cwimg_wpAddSettingsPages(MMImage *somSelf,
+                                                 HWND hwndNotebook)
+{
+  BOOL rc;
+  /*    MMImageData *somThis = MMImageGetData(somSelf);*/
+    MMImageMethodDebug("MMImage","cwimg_wpAddSettingsPages");
+
+    rc=(MMImage_parent_WPImageFile_wpAddSettingsPages(somSelf,
+                                                          hwndNotebook));
+    return rc | (_cwmmAddImageInformationPage(somSelf, hwndNotebook));
+}
+
+
+/*
+ * The prototype for cwimg_wpQueryDetailsData was replaced by the following prototype:
+ */
+SOM_Scope ULONG  SOMLINK cwimg_wpQueryDetailsData(MMImage *somSelf,
+                                                  PVOID* ppDetailsData,
+                                                  PULONG pcp)
+{
+    BOOL rcParent;
+    PIMAGEDETAILS pImageDetails;
+
+    MMImageData *somThis = MMImageGetData(somSelf);
+    MMImageMethodDebug("MMImage","cwimg_wpQueryDetailsData");
+
+    /* Fill parent info */
+    rcParent=(MMImage_parent_WPImageFile_wpQueryDetailsData(somSelf,
+                                                          ppDetailsData,
+                                                          pcp));
+
+    /* The WPS asks for data to be displayed */
+    if(ppDetailsData)
+      {
+        ULONG ulWidth, ulHeight, ulDepth;
+
+        PBITMAPINFOHEADER2 pBmpInfoHeader2=NULLHANDLE;
+
+#if 0
+        if(_bUseNewClsFeatures) /* Read info from CD only if allowed. The check if the object
+                                   is on CD is done in wpRestore() */
+          pBmpInfoHeader2=(PBITMAPINFOHEADER2) _wpQueryBitmapInfoHeader(somSelf);
+#endif
+
+        pBmpInfoHeader2=(PBITMAPINFOHEADER2)_pBmpInfoHeader2;
+
+        if(pBmpInfoHeader2) {
+          //DosBeep(1500,200);
+          if(pBmpInfoHeader2->cbFix==sizeof(BITMAPINFOHEADER2)) {
+            ulWidth=pBmpInfoHeader2->cx;
+            ulHeight=pBmpInfoHeader2->cy;
+            ulDepth=pBmpInfoHeader2->cBitCount;
+          }
+          else {
+            PBITMAPINFOHEADER pBmpInfoHeader=(PBITMAPINFOHEADER)pBmpInfoHeader2;
+            ulWidth=pBmpInfoHeader->cx;
+            ulHeight=pBmpInfoHeader->cy;
+            ulDepth=pBmpInfoHeader->cBitCount;
+          }
+        }
+        else
+          {
+            ulWidth=_ulWidth;
+            ulHeight=_ulHeight;
+            ulDepth=_ulDepth;
+          }
+        /* Fill the structure with the info to be displayed */
+        pImageDetails=(PIMAGEDETAILS)*ppDetailsData;
+        pImageDetails->ulWidth=ulWidth;
+        pImageDetails->ulHeight=ulHeight;
+        pImageDetails->ulDepth=ulDepth;
+        pImageDetails->pszFormat=_chrIOProcName;
+
+        *ppDetailsData=((PBYTE) (*ppDetailsData))+sizeof(*pImageDetails);
+      }
+    else
+      {
+        /* Buffer size is queried */
+        if(pcp)
+          *pcp+=sizeof(*pImageDetails);
+      }
+    return rcParent;
+}
+
+/*
+ * The prototype for cwimg_wpRestoreState was replaced by the following prototype:
+ */
+SOM_Scope BOOL  SOMLINK cwimg_wpRestoreState(MMImage *somSelf,
+                                             ULONG ulReserved)
+{
+    BOOL bReRead=FALSE;
+
+    MMImageData *somThis = MMImageGetData(somSelf);
+    MMImageMethodDebug("MMImage","cwimg_wpRestoreState");
+
+    _bUseNewClsFeatures=TRUE;
+
+    if(cwObjectIsOnCD(somSelf)) {
+      /* The object is on CD. Check if we should use the new class features */
+      if(!PrfQueryProfileInt(HINI_USERPROFILE, "CWMM", IMAGECLS_FEATURES_ON_CD_KEY, 0))
+        _bUseNewClsFeatures=FALSE;
+    }
+
+    /* Use cached image size so the values are shown in details view on first opening of a folder. The problem is that
+       wpQueryDetailsData() is called before the object data is fully initialized. wpIsObjectInitialized() returns
+       TRUE but wpQueryRealName() fails at that early stage so it's impossible to read the image data from the file (because
+       the filename is unknown). Querying the image data in wpObjectReady() is to late because that method is called after
+       wpQueryDetailsData(). In wpObjectReady the image header will be read in. */
+
+    /* Query the image info */
+    if(!_wpRestoreLong(somSelf, "CWImage", KEY_FILESIZE, &_ulFileSize))
+      bReRead=TRUE;
+    if(!_wpRestoreLong(somSelf, "CWImage", KEY_WIDTH, &_ulWidth))
+      bReRead=TRUE;
+    if(!_wpRestoreLong(somSelf, "CWImage", KEY_HEIGHT, &_ulHeight))
+      bReRead=TRUE;
+    if(!_wpRestoreLong(somSelf, "CWImage", KEY_DEPTH, &_ulDepth))
+      bReRead=TRUE;
+    if(_ulWidth==0 || _ulHeight==0 || _ulDepth!=0)
+      bReRead=TRUE;
+    //    if(_bUseNewClsFeatures) /* Read info from CD only if allowed. The check if the object
+    //                         is on CD is done in wpRestore() */
+    //      _wpQueryBitmapInfoHeader(somSelf);
+
+    return (MMImage_parent_WPImageFile_wpRestoreState(somSelf,
+                                                      ulReserved));
+}
+
+void mmRefreshRecords(MMImage *somSelf)
+{
+  PUSEITEM pUse;
+
+    for(pUse=_wpFindUseItem(somSelf, USAGE_RECORD/*VIEW_CONTENTS|VIEW_DETAILS|VIEW_TREE*/, NULL );pUse;
+        pUse=_wpFindUseItem(somSelf, USAGE_RECORD/* VIEW_CONTENTS|VIEW_DETAILS|VIEW_TREE*/, pUse ))
+      {
+        PRECORDITEM pRecordItem=(PRECORDITEM)++pUse;
+        WinPostMsg(pRecordItem->hwndCnr, CM_INVALIDATERECORD,MPFROMP(&pRecordItem->pRecord),
+                   MPFROM2SHORT(1,CMA_NOREPOSITION));
+      }/* for() */
+}
+
+SOM_Scope BOOL  SOMLINK cwimg_wpSetup(MMImage *somSelf, PSZ pszSetupString)
+{
+  char buffer[CCHMAXPATH];
+  ULONG bufferSize;
+
+  /*    MMImageData *somThis = MMImageGetData(somSelf);*/
+    MMImageMethodDebug("MMImage","cwimg_wpSetup");
+
+
+    /* Refresh */
+    bufferSize=sizeof(buffer);
+    if(_wpScanSetupString(somSelf, pszSetupString, SETUP_MMREFRESH, buffer,&bufferSize))
+      {
+        _cwmmFreeBitmaps(somSelf);
+#if 0
+        _cwmmQuerySmallBitmapHandle(somSelf,
+                                    0,
+                                    NULLHANDLE,
+                                    0);
+#endif
+        mmRefreshRecords(somSelf);
+        //        _wpCnrRefreshDetails(somSelf);
+      }
+
+    return (MMImage_parent_WPImageFile_wpSetup(somSelf, pszSetupString));
+}
+
+
+SOM_Scope void  SOMLINK cwimg_wpObjectReady(MMImage *somSelf,
+                                            ULONG ulCode, WPObject* refObject)
+{
+  PCREATEBMPINFO pCreateBMP;
+  ULONG ulError;
+  MMImageData *somThis = MMImageGetData(somSelf);
+  MMImageMethodDebug("MMImage","cwimg_wpObjectReady");
+
+  MMImage_parent_WPImageFile_wpObjectReady(somSelf, ulCode,
+                                           refObject);
+  /* Get image info asynchronous to replace cached image size read in from EA  which
+     may not be accurate. */
+  /* Allocate memory for small bitmap info for the thread */
+#if 0
+  if(hwndCreateBMP && (pCreateBMP=(PCREATEBMPINFO)_wpAllocMem(somSelf, sizeof(CREATEBMPINFO),&ulError))!=NULLHANDLE)
+    {
+      /* Only the object pointer is used */
+      pCreateBMP->wpObject=somSelf;
+
+      //      WinPostMsg(hwndCreateBMP, WM_APPTERMINATENOTIFY,MPFROMP(pCreateBMP), MPFROM2SHORT(0, ACKEY_QUERY_BITMAPINFO));
+    }
+#endif
+    /* Refresh records in all views */
+    //mmRefreshRecords(somSelf);
+
+}
+
+static BOOL _getMissingExtFromImageIOProc(void)
+{
+    MMFORMATINFO  mmFormatInfo;
+    PMMFORMATINFO pmmFormatInfoArray;
+    void * memPtr;
+    ULONG         ulReturnCode;
+    LONG          lFormatsRead;
+    LONG          index;
+
+    memset( &mmFormatInfo,
+            '\0',
+            sizeof(MMFORMATINFO) );
+
+    mmFormatInfo.ulMediaType |= MMIO_MEDIATYPE_IMAGE;
+    mmFormatInfo.ulFlags|=MMIO_CANREADTRANSLATED;/* Read !!!*/
+    ulReturnCode = mmioQueryFormatCount ( &mmFormatInfo,
+                                          &lNumIOProcs,
+                                          0,
+                                          0 );
+
+    if( ulReturnCode != MMIO_SUCCESS )
+      {
+        /*
+         * Error - mmioQueryFormatCount failed.
+         */
+        return FALSE;
+      }
+
+    /*
+     * Allocate enough memory for n number of FormatInfo blocks
+     */
+    pmmFormatInfoArray = malloc (lNumIOProcs * sizeof( MMFORMATINFO ) );
+    memPtr=pmmFormatInfoArray;
+    if( pmmFormatInfoArray == NULL )
+      {
+        /*
+         * Could not allocate enough memory for mmFormatInfo array.
+         */
+        return FALSE;
+      }
+
+    /*
+     * call mmioGetFormats to get info on the formats supported.
+     */
+    ulReturnCode = mmioGetFormats( &mmFormatInfo,
+                                   lNumIOProcs,
+                                   pmmFormatInfoArray,
+                                   &lFormatsRead,
+                                   0,
+                                   0 );
+    if( ulReturnCode != MMIO_SUCCESS )
+      {
+        /*
+         *  mmioGetFormats failed.
+         */
+        free(pmmFormatInfoArray);
+        return FALSE;
+      }
+
+    if( lFormatsRead != lNumIOProcs )
+      {
+        /*
+         * Error in MMIO - number of formats read in by
+         * mmioGetFormats is not equal to number of formats
+         * found by mmioQueryFormatCount.
+         */
+        free(pmmFormatInfoArray);
+        return FALSE;
+      }
+
+
+    for ( index = 0; index <lNumIOProcs; index++ )
+      {
+        /* Now scan the whole image proc array */
+
+        if(!strstr(chrMMImageKnownExt, pmmFormatInfoArray->szDefaultFormatExt)) {
+          /* This extension is yet unknown */
+          if(chrMMImageExt[0]==0) {
+            /* It's the first one */
+            sprintf(chrMMImageExt,"*.%s", pmmFormatInfoArray->szDefaultFormatExt);
+          }
+          else {
+            /* Check if the extension is not already added (e.g. TIF has a lot of subformats) */
+            if(!strstr(chrMMImageExt, pmmFormatInfoArray->szDefaultFormatExt)) {
+              strncat(chrMMImageExt,",*.",sizeof(chrMMImageExt)-1-strlen(chrMMImageExt));
+              strncat(chrMMImageExt, pmmFormatInfoArray->szDefaultFormatExt, sizeof(chrMMImageExt)-1-strlen(chrMMImageExt));
+            }
+          }
+          //          HlpWriteToTrapLog("Known Extension: %s\n", chrMMImageKnownExt);
+          //          HlpWriteToTrapLog("Extension: %s\n", chrMMImageExt);
+        }
+        /*
+         *  advance to next entry in mmFormatInfo array
+         */
+        pmmFormatInfoArray++;
+      }
+    free(memPtr);
+
+    return FALSE;
+}
+
+/*
+ *    wpCnrRemoveObject          : override;
+ */
+
+/*
+ *    wpFormatDragItem           : override;
+ */
+
+SOM_Scope BOOL  SOMLINK cwimg_wpSaveState(MMImage *somSelf)
+{
+    MMImageData *somThis = MMImageGetData(somSelf);
+    MMImageMethodDebug("MMImage","cwimg_wpSaveState");
+
+    /* Cache the image size so the values are shown in details view on first opening of a folder. The problem is that
+     wpQueryDetailsData() is called before the object data is fully initialized. wpIsObjectInitialized() returns
+     TRUE but wpQueryRealName() fails at that early stage so it's impossible to read the image data from the file (because
+     the filename is unknown). Querying the image data in wpObjectReady() is to late because this method is called after
+     wpQueryDetailsData(). */
+    if(_pBmpInfoHeader2) {
+      if(((PBITMAPINFOHEADER2)_pBmpInfoHeader2)->cbFix==sizeof(BITMAPINFOHEADER2)) {
+        _wpSaveLong(somSelf, "CWImage", KEY_WIDTH, ((PBITMAPINFOHEADER2)_pBmpInfoHeader2)->cx);
+        _wpSaveLong(somSelf, "CWImage", KEY_HEIGHT, ((PBITMAPINFOHEADER2)_pBmpInfoHeader2)->cy);
+        _wpSaveLong(somSelf, "CWImage", KEY_DEPTH, ((PBITMAPINFOHEADER2)_pBmpInfoHeader2)->cBitCount);
+      }
+      else {
+        PBITMAPINFOHEADER pBmpInfoHeader=(PBITMAPINFOHEADER)_pBmpInfoHeader2;
+
+        _wpSaveLong(somSelf, "CWImage", KEY_WIDTH, pBmpInfoHeader->cx);
+        _wpSaveLong(somSelf, "CWImage", KEY_HEIGHT, pBmpInfoHeader->cy);
+        _wpSaveLong(somSelf, "CWImage", KEY_DEPTH, pBmpInfoHeader->cBitCount);
+      }
+    }
+    return (MMImage_parent_WPImageFile_wpSaveState(somSelf));
+}
+
+#if 0
+SOM_Scope BOOL  SOMLINK cwimg_wpFormatDragItem(MMImage *somSelf,
+                                               PDRAGITEM pdrgItem)
+{
+  BOOL rc;
+
+    MMImageData *somThis = MMImageGetData(somSelf);
+    MMImageMethodDebug("MMImage","cwimg_wpFormatDragItem");
+
+    rc= (MMImage_parent_WPImageFile_wpFormatDragItem(somSelf,
+                                                        pdrgItem));
+DosBeep(500,10);
+SysWriteToTrapLog("%d\n",pdrgItem->cxOffset);
+    pdrgItem->cxOffset+=60;
+    return rc;
+}
+#endif
+
+SOM_Scope BOOL  SOMLINK cwimg_wpUnlockObject(MMImage *somSelf)
+{
+    MMImageData *somThis = MMImageGetData(somSelf);
+    MMImageMethodDebug("MMImage","cwimg_wpUnlockObject");
+
+    /*
+      Call a function which checks if the bitmaps of this object may be deleted in the background.
+      The call is here because this method is called for every object in a folder whenever a folder
+      is closed.
+      If the folder is closed it's likely the bitmaps may be obsolete. A check for USAGE_RECORD items
+      will be done on another thread.
+
+      wpDeleteFromObjUseList() seems to be the more natural place to do this but the method is not called
+      when an object is removed from a container. Also wpCnrRemoveObject() doesn't work because the WPS seems
+      to use wpclsRemoveObjects() to remove all objects when closing folders.
+
+      XWP (at least up to 1.02) keeps every object locked, so we can't just check the lock state by
+      querying wpIsObjectLocked(). That's the reason we jump through loops here :-(.
+
+     */
+    if(_hBitmap || _hBitmapSmall)
+      sendDeleteBMPMsg(somSelf);
+
+    return (MMImage_parent_WPImageFile_wpUnlockObject(somSelf));
+}
+
+
+
+
+
+
+
+
+/*
+ * The prototype for cwimgM_wpclsInitData was replaced by the following prototype:
+ */
+SOM_Scope void  SOMLINK cwimgM_wpclsInitData(M_MMImage *somSelf)
+{
+  PCLASSFIELDINFO pCfi;
+  USHORT i;
+  static BOOL bGotImgExt=FALSE;
+
+    /* M_CWImageData *somThis = M_CWImageGetData(somSelf); */
+    M_MMImageMethodDebug("M_MMImage","cwimgM_wpclsInitData");
+
+    /* Get extensions of additional image procs not represented by a class.
+       Strangely enough wpclsQueryInstanceFilter() is called during wpclsInitData() so
+       we query the extensions here before calling the parent so we have the information. */
+    if(!bGotImgExt)
+      {
+        /* Get user supplied extensions e.g. *.JPE*/
+        getStringFromRexxScript("imageadd.rx", chrMMImageExt, sizeof(chrMMImageExt));
+
+        /* Get all already handled extensions */
+        getStringFromRexxScript("imageext.rx", chrMMImageKnownExt, sizeof(chrMMImageKnownExt));
+        /* Now check installed IO procs for other exts and add them to the filter list */
+        _getMissingExtFromImageIOProc();
+        bGotImgExt=TRUE;
+      }
+
+    M_MMImage_parent_M_WPImageFile_wpclsInitData(somSelf);
+
+    if(!globalHab)
+      globalHab=WinQueryAnchorBlock(HWND_DESKTOP);
+
+    if(!getMessage(chrHelpLibrary, IDSTR_HELPLIBRARY, sizeof(chrHelpLibrary),
+                   queryModuleHandle(), HWND_DESKTOP))
+      strcpy(chrHelpLibrary,"MMPARTS.HLP");
+
+    /* Load strings for details titles */
+    if(getMessage(chrWidth, IDSTR_IMAGEDETAIL_WIDTH, sizeof(chrWidth), queryResModuleHandle(), HWND_DESKTOP))
+      pszImageColTitles[0]=chrWidth;
+    if(getMessage(chrHeight, IDSTR_IMAGEDETAIL_HEIGHT, sizeof(chrHeight), queryResModuleHandle(), HWND_DESKTOP))
+      pszImageColTitles[1]=chrHeight;
+    if(getMessage(chrDepth, IDSTR_IMAGEDETAIL_DEPTH, sizeof(chrDepth), queryResModuleHandle(), HWND_DESKTOP))
+      pszImageColTitles[2]=chrDepth;
+    if(getMessage(chrFormat, IDSTR_IMAGEDETAIL_FORMAT, sizeof(chrFormat), queryResModuleHandle(), HWND_DESKTOP))
+      pszImageColTitles[3]=chrFormat;
+
+    /* Setup the static data for the details view */
+    for(i=0,pCfi=cfiImageFieldInfo;i<NUM_IMAGE_DETAILS_FIELDS;i++,pCfi++)
+      {
+        memset((PCH)pCfi,0,sizeof(CLASSFIELDINFO));
+
+        pCfi->cb=sizeof(CLASSFIELDINFO);
+        pCfi->flData=CFA_LEFT|CFA_SEPARATOR|CFA_FIREADONLY;
+        pCfi->flTitle=CFA_CENTER|CFA_SEPARATOR|CFA_HORZSEPARATOR|CFA_STRING|CFA_FITITLEREADONLY;
+        pCfi->pNextFieldInfo=pCfi+1;
+        pCfi->pTitleData=(PVOID)pszImageColTitles[i];
+        pCfi->flCompare=COMPARE_SUPPORTED|SORTBY_SUPPORTED;
+
+        switch(i)
+          {
+          case 0: /* Width */
+            pCfi->flData|=CFA_ULONG;
+            pCfi->offFieldData=(ULONG)(FIELDOFFSETUL(IMAGEDETAILS, ulWidth));
+            pCfi->ulLenFieldData=sizeof(ULONG);
+            pCfi->ulLenCompareValue=sizeof(ULONG);
+            pCfi->DefaultComparison=CMP_GREATER;
+            break;
+          case 1: /* Height */
+            pCfi->flData|=CFA_ULONG;
+            pCfi->offFieldData=(ULONG)(FIELDOFFSETUL(IMAGEDETAILS,ulHeight));
+            pCfi->ulLenFieldData=sizeof(ULONG);
+            pCfi->ulLenCompareValue=sizeof(ULONG);
+            pCfi->DefaultComparison=CMP_GREATER;
+            break;
+          case 2: /* Depth */
+            pCfi->flData|=CFA_ULONG;
+            pCfi->offFieldData=(ULONG)(FIELDOFFSETUL(IMAGEDETAILS,ulDepth));
+            pCfi->ulLenFieldData=sizeof(ULONG);
+            pCfi->ulLenCompareValue=sizeof(ULONG);
+            pCfi->DefaultComparison=CMP_GREATER;
+            break;
+          case 3: /* Format */
+            pCfi->flData|=CFA_STRING;
+            pCfi->offFieldData=(ULONG)(FIELDOFFSETUL(IMAGEDETAILS,pszFormat));
+            pCfi->ulLenFieldData=sizeof(PSZ);
+            pCfi->DefaultComparison=CMP_EQUAL;
+            break;
+          }/* switch(i) */
+      }/* for() */
+    cfiImageFieldInfo[NUM_IMAGE_DETAILS_FIELDS].pNextFieldInfo=NULL;
+    if(!hwndCreateBMP)
+      _beginthread(createBMPThreadFunc,NULL,8192*20, NULLHANDLE); //Fehlerbehandlung fehlt
+
+    if(!g_hwndDeleteBMP)
+      _beginthread(deleteBMPThreadFunc,NULL,8192*10, NULLHANDLE); //Fehlerbehandlung fehlt
+
+}
+
+
+/*
+ * The prototype for cwimgM_wpclsQueryDefaultView was replaced by the following prototype:
+ */
+SOM_Scope ULONG  SOMLINK cwimgM_wpclsQueryDefaultView(M_MMImage *somSelf)
+{
+#if 0
+  char chrID[120];
+  WPObject *wpObject;
+  HOBJECT hObject;
+#endif
+    /* M_CWImageData *somThis = M_CWImageGetData(somSelf); */
+    M_MMImageMethodDebug("M_MMImage","cwimgM_wpclsQueryDefaultView");
+
+    //    sprintf(chrID, "<MMPM2_MM%sTEMPLATE>", _wpclsQueryInstanceType(somSelf));
+    //HlpWriteToTrapLog("%s\n", chrID);
+#if 0
+    if((hObject=WinQueryObject(chrID))!=NULLHANDLE)
+      DosBeep(5000, 500);
+      //      _wpclsQueryObject(somSelf, hObject);
+    if((wpObject=_wpclsQueryObjectFromPath(somSelf, chrID))!=NULLHANDLE)
+      {
+        ULONG ulHowMatched=1;
+
+        DosBeep(5000, 1000);
+        /* Template found. Now query associated program */
+        if(_wpQueryAssociatedProgram(wpObject, VIEW_RUNNING, &ulHowMatched,
+                                  chrID, sizeof(chrID),(PSZ)-1))
+          DosBeep(500, 1000);
+      }
+#endif
+    /* Create default templates. We do it here because we need an object to query the associated
+       program (if any) when the system asks for the default view. */
+return OPEN_RUNNING;
+//    return ID_MENU_IMGEDITOR;
+}
+
+
+BOOL checkImageIOProc(char * chrExt)
+{
+    CHAR          szBuffer[ sizeof( FOURCC ) + CCHMAXPATH + 4 ];
+    MMFORMATINFO  mmFormatInfo;
+    PMMFORMATINFO pmmFormatInfoArray;
+    void * memPtr;
+    ULONG         ulReturnCode;
+    LONG          lFormatsRead;
+    LONG          index;
+    LONG          lBytesRead;
+
+    memset( &mmFormatInfo,
+            '\0',
+            sizeof(MMFORMATINFO) );
+
+    mmFormatInfo.ulMediaType |= MMIO_MEDIATYPE_IMAGE;
+    mmFormatInfo.ulFlags|=MMIO_CANWRITETRANSLATED;
+    ulReturnCode = mmioQueryFormatCount ( &mmFormatInfo,
+                                          &lNumIOProcs,
+                                          0,
+                                          0 );
+
+    if( ulReturnCode != MMIO_SUCCESS )
+      {
+        /*
+         * Error - mmioQueryFormatCount failed.
+         */
+        return FALSE;
+      }
+
+    /*
+     * Allocate enough memory for n number of FormatInfo blocks
+     */
+    pmmFormatInfoArray = malloc (lNumIOProcs * sizeof( MMFORMATINFO ) );
+    memPtr=pmmFormatInfoArray;
+    if( pmmFormatInfoArray == NULL )
+      {
+        /*
+         * Could not allocate enough memory for mmFormatInfo array.
+         */
+        return FALSE;
+      }
+
+    /*
+     * call mmioGetFormats to get info on the formats supported.
+     */
+    ulReturnCode = mmioGetFormats( &mmFormatInfo,
+                                   lNumIOProcs,
+                                   pmmFormatInfoArray,
+                                   &lFormatsRead,
+                                   0,
+                                   0 );
+    if( ulReturnCode != MMIO_SUCCESS )
+      {
+        /*
+         *  mmioGetFormats failed.
+         */
+        free(pmmFormatInfoArray);
+        return FALSE;
+      }
+
+    if( lFormatsRead != lNumIOProcs )
+      {
+        /*
+         * Error in MMIO - number of formats read in by
+         * mmioGetFormats is not equal to number of formats
+         * found by mmioQueryFormatCount.
+         */
+        free(pmmFormatInfoArray);
+        return FALSE;
+      }
+
+
+    for ( index = 0; index <lNumIOProcs; index++ )
+      {
+        ulReturnCode = mmioGetFormatName(pmmFormatInfoArray, szBuffer, &lBytesRead, 0L, 0L);
+        if(ulReturnCode)
+	  {
+	  SysWriteToTrapLog("checkImageIOProc: %s %u\n\n", szBuffer, ulReturnCode);
+	  continue;
+          }
+        SysWriteToTrapLog("IO-Proc 2: %s %u\n\n", szBuffer, lBytesRead);
+        /* Insert NULL string terminator */
+        *( szBuffer + lBytesRead ) = (CHAR)NULL;
+
+        /* Compressed TIF is not supported because the Warp 4 IO-Procs are
+           broken. */
+        //HlpWriteToTrapLog("---------  Ext: %s, IO-Proc: %s, Name: %s\n",
+        //chrExt,  pmmFormatInfoArray->szDefaultFormatExt,
+        //                szBuffer);
+
+        if(pmmFormatInfoArray->fccIOProc!=mmioStringToFOURCC("TFMC",MMIO_TOUPPER) &&
+           pmmFormatInfoArray->fccIOProc!=mmioStringToFOURCC("TFIC",MMIO_TOUPPER) &&
+           (pmmFormatInfoArray->ulFlags & MMIO_CANWRITETRANSLATED))
+          {
+            if(strstr(chrExt, pmmFormatInfoArray->szDefaultFormatExt)) {
+              //HlpWriteToTrapLog("******* Ext given: %s  IO-Proc: %s\n", chrExt, pmmFormatInfoArray->szDefaultFormatExt);
+              free(memPtr);
+              return TRUE;
+            }
+          }
+        /*
+         *  advance to next entry in mmFormatInfo array
+         */
+        pmmFormatInfoArray++;
+      }
+    free(memPtr);
+
+    return FALSE;
+}
+
+SOM_Scope BOOL  SOMLINK cwimgM_wpclsCreateDefaultTemplates(M_MMImage *somSelf,
+                                                           WPObject* Folder)
+{
+    /* M_MMImageData *somThis = M_MMImageGetData(somSelf); */
+    M_MMImageMethodDebug("M_MMImage","cwimgM_wpclsCreateDefaultTemplates");
+
+    //HlpWriteToTrapLog("Class title: %s\n", _wpclsQueryTitle(somSelf));
+
+    /* The FOURCC of the JPEG-IO proc is JPEG so we have to create that template
+       in the JPG class. */
+
+    if(checkImageIOProc( _wpclsQueryInstanceFilter(somSelf))) {
+      //   WPFolder* wpFolder;
+      //  wpFolder=_wpclsQueryFolder(somSelf, "<MMPM2_MMTEMPLATEFOLDER>", FALSE);
+      // return M_MMAudio_parent_M_MMDataFile_wpclsCreateDefaultTemplates(somSelf, wpFolder);
+      //            HlpWriteToTrapLog("Create template for: %s\n", _wpclsQueryTitle(somSelf));
+      //     HlpWriteToTrapLog("Create template for: %s\n", _somGetClassName(somSelf) );
+      mmclsCreateTheDefaultTemplate(somSelf, Folder);
+      return TRUE;
+    }
+
+    return TRUE;
+}
+
+SOM_Scope ULONG  SOMLINK cwimgM_wpclsQueryStyle(M_MMImage *somSelf)
+{
+    /* M_MMImageData *somThis = M_MMImageGetData(somSelf); */
+    M_MMImageMethodDebug("M_MMImage","cwimgM_wpclsQueryStyle");
+
+    return CLSSTYLE_NEVERPRINT;
+    //    return (M_MMImage_parent_M_WPImageFile_wpclsQueryStyle(somSelf));
+}
+
+/*
+ * The prototype for cwimgM_wpclsQueryTitle was replaced by the following prototype:
+ */
+SOM_Scope PSZ  SOMLINK cwimgM_wpclsQueryTitle(M_MMImage *somSelf)
+{
+  static char chrTitle[20]={0};
+    /* M_CWImageData *somThis = M_CWImageGetData(somSelf); */
+    M_MMImageMethodDebug("M_MMImage","cwimgM_wpclsQueryTitle");
+
+    if(chrTitle[0]==0)
+      if(!getMessage(chrTitle, IDSTR_CWIMAGETITLE, sizeof(chrTitle), queryResModuleHandle(), HWND_DESKTOP))
+        strcpy(chrTitle,"Digital Image");
+
+    return chrTitle;
+}
+
+/*
+ * The prototype for cwimgM_wpclsQueryIconData was replaced by the following prototype:
+ */
+/*
+ *    wpclsQueryDefaultHelp: override;
+ */
+
+SOM_Scope ULONG  SOMLINK cwimgM_wpclsQueryIconData(M_MMImage *somSelf,
+                                                   PICONINFO pIconInfo)
+{
+  HMODULE hmod;
+
+    /* M_CWImageData *somThis = M_CWImageGetData(somSelf); */
+    M_MMImageMethodDebug("M_MMImage","cwimgM_wpclsQueryIconData");
+
+    hmod=queryModuleHandle();
+    if(!hmod)
+      return M_MMImage_parent_M_WPImageFile_wpclsQueryIconData(somSelf, pIconInfo);
+
+	if (pIconInfo)   {
+      pIconInfo->fFormat = ICON_RESOURCE;
+      pIconInfo->hmod    = hmod;
+      pIconInfo->resid   = ID_ICONCWIMAGEFILE;
+	} /* endif */
+
+	return ( sizeof(ICONINFO) );
+}
+
+/*
+ * The prototype for cwimgM_wpclsQueryDetailsInfo was replaced by the following prototype:
+ */
+SOM_Scope ULONG  SOMLINK cwimgM_wpclsQueryDetailsInfo(M_MMImage *somSelf,
+                                                      PCLASSFIELDINFO* ppClassFieldInfo,
+                                                      PULONG pSize)
+{
+  ULONG cParentColumns;
+  PCLASSFIELDINFO pCfi;
+  int i;
+
+    /* M_CWImageData *somThis = M_CWImageGetData(somSelf); */
+    M_MMImageMethodDebug("M_MMImage","cwimgM_wpclsQueryDetailsInfo");
+
+    cParentColumns= (M_MMImage_parent_M_WPImageFile_wpclsQueryDetailsInfo(somSelf,
+                                                                 ppClassFieldInfo,
+                                                                 pSize));
+  if(pSize)
+    *pSize+=sizeof(IMAGEDETAILS);
+
+  if(ppClassFieldInfo)
+    {
+      if(*ppClassFieldInfo)
+        {
+          pCfi=*ppClassFieldInfo;
+          for(i=0; i<cParentColumns;i++)
+            pCfi=(pCfi->pNextFieldInfo ? pCfi->pNextFieldInfo: pCfi);
+
+          pCfi->pNextFieldInfo=cfiImageFieldInfo;
+        }
+      else
+        *ppClassFieldInfo=cfiImageFieldInfo;
+    }
+    return (cParentColumns+NUM_IMAGE_DETAILS_FIELDS);
+}
+
+
+
+SOM_Scope PSZ  SOMLINK cwimgM_wpclsQueryInstanceFilter(M_MMImage *somSelf)
+{
+    /* M_MMImageData *somThis = M_MMImageGetData(somSelf); */
+    M_MMImageMethodDebug("M_MMImage","cwimgM_wpclsQueryInstanceFilter");
+
+    //return "*.png,*.sdf,*.klj,*jpe,*.zui";
+    return chrMMImageExt;
+    /*    return (M_MMImage_parent_M_WPImageFile_wpclsQueryInstanceFilter(somSelf));*/
+}
+
Index: /tags/CWMM-0.3.0_GA/classes/c/c_image/cwjpg.c
===================================================================
--- /tags/CWMM-0.3.0_GA/classes/c/c_image/cwjpg.c	(revision 213)
+++ /tags/CWMM-0.3.0_GA/classes/c/c_image/cwjpg.c	(revision 213)
@@ -0,0 +1,162 @@
+/*
+ * (C) Chris Wohlgemuth 2002-2004
+ *
+ */
+/*
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; see the file COPYING.  If not, write to
+ * the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
+ */          
+/*
+ * If you need another license for your project/product (commercial,
+ * noncommercial, whatever) contact me at
+ * 
+ * http://www.os2world.com/cdwriting
+ * http://www.geocities.com/SiliconValley/Sector/5785/
+ *
+ */
+/*
+ *  This file was generated by the SOM Compiler and Emitter Framework.
+ *  Generated using: 
+ *      SOM Emitter emitctm: 2.42
+ */
+
+#ifndef SOM_Module_cwjpg_Source
+#define SOM_Module_cwjpg_Source
+#endif
+#define CWJPG_Class_Source
+#define M_CWJPG_Class_Source
+
+#include <os2.h>
+#include "helpid.h"
+#include "cwjpg.ih"
+#include "cwaudioinc.h"
+
+extern char chrHelpLibrary[CCHMAXPATH];
+
+HMODULE queryResModuleHandle(void);
+HMODULE queryModuleHandle(void);
+BOOL getMessage(char* text,ULONG ulID, LONG lSizeText, HMODULE hResource,HWND hwnd);
+BOOL checkImageIOProc(char * chrExt);
+BOOL mmclsCreateTheDefaultTemplate(M_WPObject *somSelf, 
+                                   WPObject* Folder);
+
+/*
+ * The prototype for cwjpgM_wpclsQueryInstanceType was replaced by the following prototype:
+ */
+SOM_Scope PSZ  SOMLINK cwjpgM_wpclsQueryInstanceType(M_MMJPG *somSelf)
+{
+    /* M_CWJPGData *somThis = M_CWJPGGetData(somSelf); */
+    M_MMJPGMethodDebug("M_MMJPG","cwjpgM_wpclsQueryInstanceType");
+
+    return "JPG";
+}
+
+/*
+ * The prototype for cwjpgM_wpclsQueryInstanceFilter was replaced by the following prototype:
+ */
+/*
+ *    wpclsCreateDefaultTemplates : override;
+ */
+
+SOM_Scope PSZ  SOMLINK cwjpgM_wpclsQueryInstanceFilter(M_MMJPG *somSelf)
+{
+    /* M_CWJPGData *somThis = M_CWJPGGetData(somSelf); */
+    M_MMJPGMethodDebug("M_MMJPG","cwjpgM_wpclsQueryInstanceFilter");
+
+    return "*.JPG";
+}
+
+#if 0
+SOM_Scope BOOL  SOMLINK cwjpgM_wpclsCreateDefaultTemplates(M_MMJPG *somSelf, 
+                                                           WPObject* Folder)
+{
+    /* M_MMJPGData *somThis = M_MMJPGGetData(somSelf); */
+    M_MMJPGMethodDebug("M_MMJPG","cwjpgM_wpclsCreateDefaultTemplates");
+
+    /* The FOURCC of the JPEG-IO proc is JPEG so we have to create the template
+       here. Templates for other image files are created in MMImage. */
+DosBeep(5000, 1000);
+    if(checkImageIOProc( "JPEG")) {
+DosBeep(500, 1000);
+      mmclsCreateTheDefaultTemplate(somSelf, Folder);
+      return TRUE;
+    }
+
+    return TRUE;
+}
+#endif
+/*
+ * The prototype for cwjpgM_wpclsQueryDefaultHelp was replaced by the following prototype:
+ */
+SOM_Scope BOOL  SOMLINK cwjpgM_wpclsQueryDefaultHelp(M_MMJPG *somSelf, 
+                                                     PULONG pHelpPanelId, 
+                                                     PSZ pszHelpLibrary)
+{
+    /* M_CWJPGData *somThis = M_CWJPGGetData(somSelf); */
+    M_MMJPGMethodDebug("M_MMJPG","cwjpgM_wpclsQueryDefaultHelp");
+
+    if(pHelpPanelId)
+      *pHelpPanelId=JPGFILE_HELP_PANEL;
+    if(pszHelpLibrary)
+      strncpy(pszHelpLibrary, chrHelpLibrary, CCHMAXPATH);
+    return TRUE; 
+}
+
+/*
+ * The prototype for cwjpgM_wpclsQueryTitle was replaced by the following prototype:
+ */
+SOM_Scope PSZ  SOMLINK cwjpgM_wpclsQueryTitle(M_MMJPG *somSelf)
+{
+  static char chrTitle[20]={0};
+    /* M_CWJPGData *somThis = M_CWJPGGetData(somSelf); */
+    M_MMJPGMethodDebug("M_MMJPG","cwjpgM_wpclsQueryTitle");
+
+    if(chrTitle[0]==0)
+      if(!getMessage(chrTitle, IDSTR_JPGTITLE, sizeof(chrTitle), queryResModuleHandle(), HWND_DESKTOP))
+        strcpy(chrTitle,"JPGImage.JPG");
+
+    return chrTitle;
+}
+
+/*
+ * The prototype for cwjpgM_wpclsQueryIconData was replaced by the following prototype:
+ */
+SOM_Scope ULONG  SOMLINK cwjpgM_wpclsQueryIconData(M_MMJPG *somSelf, 
+                                                   PICONINFO pIconInfo)
+{
+  HMODULE hmod;
+
+    /* M_CWJPGData *somThis = M_CWJPGGetData(somSelf); */
+    M_MMJPGMethodDebug("M_MMJPG","cwjpgM_wpclsQueryIconData");
+
+    hmod=queryModuleHandle();
+    if(!hmod)
+      return M_MMJPG_parent_M_MMImage_wpclsQueryIconData(somSelf, pIconInfo);
+
+	if (pIconInfo)   {
+      pIconInfo->fFormat = ICON_RESOURCE;
+      pIconInfo->hmod    = hmod;
+      pIconInfo->resid   = ID_ICONJPGFILE;
+	} /* endif */
+
+	return ( sizeof(ICONINFO) );
+}
+
+
+
+
+
+
+
+
Index: /tags/CWMM-0.3.0_GA/classes/c/c_image/cwmmotion.c
===================================================================
--- /tags/CWMM-0.3.0_GA/classes/c/c_image/cwmmotion.c	(revision 213)
+++ /tags/CWMM-0.3.0_GA/classes/c/c_image/cwmmotion.c	(revision 213)
@@ -0,0 +1,172 @@
+/*
+ * (C) Chris Wohlgemuth 2002-2004
+ *
+ */
+/*
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; see the file COPYING.  If not, write to
+ * the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
+ */          
+/*
+ * If you need another license for your project/product (commercial,
+ * noncommercial, whatever) contact me at
+ * 
+ * http://www.os2world.com/cdwriting
+ * http://www.geocities.com/SiliconValley/Sector/5785/
+ *
+ */
+/*
+ *  This file was generated by the SOM Compiler and Emitter Framework.
+ *  Generated using: 
+ *      SOM Emitter emitctm: 2.42
+ */
+
+#ifndef SOM_Module_cwmmotion_Source
+#define SOM_Module_cwmmotion_Source
+#endif
+#define CWMMotion_Class_Source
+#define M_CWMMotion_Class_Source
+
+#include <os2.h>
+#include "helpid.h"
+#include "cwmmotion.ih"
+
+extern char chrHelpLibrary[CCHMAXPATH];
+
+HMODULE queryResModuleHandle(void);
+HMODULE queryModuleHandle(void);
+BOOL getMessage(char* text,ULONG ulID, LONG lSizeText, HMODULE hResource,HWND hwnd);
+
+
+/*
+ * SOM_Scope PSZ  SOMLINK cwmmotionM_wpclsQueryInstanceType(M_CWMMotion *somSelf)
+ */
+
+/*
+ * The prototype for cwmmotionM_wpclsQueryInstanceType was replaced by the following prototype:
+ */
+SOM_Scope PSZ  SOMLINK cwmmotionM_wpclsQueryInstanceType(M_MMMMotion *somSelf)
+{
+    /* M_CWMMotionData *somThis = M_CWMMotionGetData(somSelf); */
+    M_MMMMotionMethodDebug("M_MMMMotion","cwmmotionM_wpclsQueryInstanceType");
+
+    return "MMotion Image";
+}
+
+
+/*
+ * SOM_Scope PSZ  SOMLINK cwmmotionM_wpclsQueryInstanceFilter(M_CWMMotion *somSelf)
+ */
+
+/*
+ * The prototype for cwmmotionM_wpclsQueryInstanceFilter was replaced by the following prototype:
+ */
+SOM_Scope PSZ  SOMLINK cwmmotionM_wpclsQueryInstanceFilter(M_MMMMotion *somSelf)
+{
+    /* M_CWMMotionData *somThis = M_CWMMotionGetData(somSelf); */
+    M_MMMMotionMethodDebug("M_MMMMotion","cwmmotionM_wpclsQueryInstanceFilter");
+
+    return "*.VID";
+}
+
+
+/*
+ * SOM_Scope BOOL  SOMLINK cwmmotionM_wpclsQueryDefaultHelp(M_CWMMotion *somSelf, 
+ *                                                          PULONG pHelpPanelId, 
+ *                                                          PSZ pszHelpLibrary)
+ */
+
+/*
+ * The prototype for cwmmotionM_wpclsQueryDefaultHelp was replaced by the following prototype:
+ */
+SOM_Scope BOOL  SOMLINK cwmmotionM_wpclsQueryDefaultHelp(M_MMMMotion *somSelf, 
+                                                         PULONG pHelpPanelId, 
+                                                         PSZ pszHelpLibrary)
+{
+    /* M_CWMMotionData *somThis = M_CWMMotionGetData(somSelf); */
+    M_MMMMotionMethodDebug("M_MMMMotion","cwmmotionM_wpclsQueryDefaultHelp");
+
+    if(pHelpPanelId)
+      *pHelpPanelId=MMOTIONFILE_HELP_PANEL;
+    if(pszHelpLibrary)
+      strncpy(pszHelpLibrary, chrHelpLibrary, CCHMAXPATH);
+    return TRUE; 
+}
+
+
+/*
+ * SOM_Scope ULONG  SOMLINK cwmmotionM_wpclsQueryStyle(M_CWMMotion *somSelf)
+ */
+
+/*
+ * The prototype for cwmmotionM_wpclsQueryStyle was replaced by the following prototype:
+ */
+SOM_Scope ULONG  SOMLINK cwmmotionM_wpclsQueryStyle(M_MMMMotion *somSelf)
+{
+    /* M_CWMMotionData *somThis = M_CWMMotionGetData(somSelf); */
+    M_MMMMotionMethodDebug("M_MMMMotion","cwmmotionM_wpclsQueryStyle");
+
+    return (M_MMMMotion_parent_M_MMImage_wpclsQueryStyle(somSelf));
+}
+
+
+/*
+ * SOM_Scope PSZ  SOMLINK cwmmotionM_wpclsQueryTitle(M_CWMMotion *somSelf)
+ */
+
+/*
+ * The prototype for cwmmotionM_wpclsQueryTitle was replaced by the following prototype:
+ */
+SOM_Scope PSZ  SOMLINK cwmmotionM_wpclsQueryTitle(M_MMMMotion *somSelf)
+{
+  static char chrTitle[20]={0};
+    /* M_CWMMotionData *somThis = M_CWMMotionGetData(somSelf); */
+    M_MMMMotionMethodDebug("M_MMMMotion","cwmmotionM_wpclsQueryTitle");
+
+    if(chrTitle[0]==0)
+      if(!getMessage(chrTitle, IDSTR_MMOTIONTITLE, sizeof(chrTitle), queryResModuleHandle(), HWND_DESKTOP))
+        strcpy(chrTitle,"VIDImage.VID");
+
+    return chrTitle;
+}
+
+
+/*
+ * SOM_Scope ULONG  SOMLINK cwmmotionM_wpclsQueryIconData(M_CWMMotion *somSelf, 
+ *                                                        PICONINFO pIconInfo)
+ */
+
+/*
+ * The prototype for cwmmotionM_wpclsQueryIconData was replaced by the following prototype:
+ */
+SOM_Scope ULONG  SOMLINK cwmmotionM_wpclsQueryIconData(M_MMMMotion *somSelf, 
+                                                       PICONINFO pIconInfo)
+{
+  HMODULE hmod;
+
+    /* M_CWMMotionData *somThis = M_CWMMotionGetData(somSelf); */
+    M_MMMMotionMethodDebug("M_MMMMotion","cwmmotionM_wpclsQueryIconData");
+
+    hmod=queryModuleHandle();
+    if(!hmod)
+      return M_MMMMotion_parent_M_MMImage_wpclsQueryIconData(somSelf, pIconInfo);
+
+	if (pIconInfo)   {
+      pIconInfo->fFormat = ICON_RESOURCE;
+      pIconInfo->hmod    = hmod;
+      pIconInfo->resid   = ID_ICON_IMFILE;
+	} /* endif */
+
+	return ( sizeof(ICONINFO) );
+}
+
Index: /tags/CWMM-0.3.0_GA/classes/c/c_image/cwpcd.c
===================================================================
--- /tags/CWMM-0.3.0_GA/classes/c/c_image/cwpcd.c	(revision 213)
+++ /tags/CWMM-0.3.0_GA/classes/c/c_image/cwpcd.c	(revision 213)
@@ -0,0 +1,132 @@
+/*
+ * (C) Chris Wohlgemuth 2002-2004
+ *
+ */
+/*
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; see the file COPYING.  If not, write to
+ * the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
+ */          
+/*
+ * If you need another license for your project/product (commercial,
+ * noncommercial, whatever) contact me at
+ * 
+ * http://www.os2world.com/cdwriting
+ * http://www.geocities.com/SiliconValley/Sector/5785/
+ *
+ */
+/*
+ *  This file was generated by the SOM Compiler and Emitter Framework.
+ *  Generated using: 
+ *      SOM Emitter emitctm: 2.42
+ */
+
+#ifndef SOM_Module_cwpcd_Source
+#define SOM_Module_cwpcd_Source
+#endif
+#define CWPhotoCD_Class_Source
+#define M_CWPhotoCD_Class_Source
+
+#include <os2.h>
+#include "helpid.h"
+#include "cwpcd.ih"
+
+extern char chrHelpLibrary[CCHMAXPATH];
+
+HMODULE queryResModuleHandle(void);
+HMODULE queryModuleHandle(void);
+BOOL getMessage(char* text,ULONG ulID, LONG lSizeText, HMODULE hResource,HWND hwnd);
+
+
+/*
+ * The prototype for cwpcdM_wpclsQueryInstanceType was replaced by the following prototype:
+ */
+SOM_Scope PSZ  SOMLINK cwpcdM_wpclsQueryInstanceType(M_MMPhotoCD *somSelf)
+{
+    /* M_CWPhotoCDData *somThis = M_CWPhotoCDGetData(somSelf); */
+    M_MMPhotoCDMethodDebug("M_MMPhotoCD","cwpcdM_wpclsQueryInstanceType");
+
+    return "Photo CD";
+}
+
+/*
+ * The prototype for cwpcdM_wpclsQueryInstanceFilter was replaced by the following prototype:
+ */
+SOM_Scope PSZ  SOMLINK cwpcdM_wpclsQueryInstanceFilter(M_MMPhotoCD *somSelf)
+{
+    /* M_CWPhotoCDData *somThis = M_CWPhotoCDGetData(somSelf); */
+    M_MMPhotoCDMethodDebug("M_MMPhotoCD","cwpcdM_wpclsQueryInstanceFilter");
+
+    return "*.PCD";
+}
+
+/*
+ * The prototype for cwpcdM_wpclsQueryDefaultHelp was replaced by the following prototype:
+ */
+SOM_Scope BOOL  SOMLINK cwpcdM_wpclsQueryDefaultHelp(M_MMPhotoCD *somSelf, 
+                                                     PULONG pHelpPanelId, 
+                                                     PSZ pszHelpLibrary)
+{
+    /* M_CWPhotoCDData *somThis = M_CWPhotoCDGetData(somSelf); */
+    M_MMPhotoCDMethodDebug("M_MMPhotoCD","cwpcdM_wpclsQueryDefaultHelp");
+
+    if(pHelpPanelId)
+      *pHelpPanelId=PCDFILE_HELP_PANEL;
+    if(pszHelpLibrary)
+      strncpy(pszHelpLibrary, chrHelpLibrary, CCHMAXPATH);
+    return TRUE; 
+}
+
+/*
+ * The prototype for cwpcdM_wpclsQueryTitle was replaced by the following prototype:
+ */
+SOM_Scope PSZ  SOMLINK cwpcdM_wpclsQueryTitle(M_MMPhotoCD *somSelf)
+{
+  static char chrTitle[20]={0};
+    /* M_CWPhotoCDData *somThis = M_CWPhotoCDGetData(somSelf); */
+    M_MMPhotoCDMethodDebug("M_MMPhotoCD","cwpcdM_wpclsQueryTitle");
+
+    if(chrTitle[0]==0)
+      if(!getMessage(chrTitle, IDSTR_PCDTITLE, sizeof(chrTitle), queryResModuleHandle(), HWND_DESKTOP))
+        strcpy(chrTitle,"PCDImage.PCD");
+
+    return chrTitle;
+
+}
+
+/*
+ * The prototype for cwpcdM_wpclsQueryIconData was replaced by the following prototype:
+ */
+SOM_Scope ULONG  SOMLINK cwpcdM_wpclsQueryIconData(M_MMPhotoCD *somSelf, 
+                                                   PICONINFO pIconInfo)
+{
+  HMODULE hmod;
+    /* M_CWPhotoCDData *somThis = M_CWPhotoCDGetData(somSelf); */
+    M_MMPhotoCDMethodDebug("M_MMPhotoCD","cwpcdM_wpclsQueryIconData");
+
+    hmod=queryModuleHandle();
+    if(!hmod)
+      return M_MMPhotoCD_parent_M_MMImage_wpclsQueryIconData(somSelf, pIconInfo);
+
+	if (pIconInfo)   {
+      pIconInfo->fFormat = ICON_RESOURCE;
+      pIconInfo->hmod    = hmod;
+      pIconInfo->resid   = ID_ICONPCDFILE;
+	} /* endif */
+
+	return ( sizeof(ICONINFO) );
+
+}
+
+
+
Index: /tags/CWMM-0.3.0_GA/classes/c/c_image/cwpcx.c
===================================================================
--- /tags/CWMM-0.3.0_GA/classes/c/c_image/cwpcx.c	(revision 213)
+++ /tags/CWMM-0.3.0_GA/classes/c/c_image/cwpcx.c	(revision 213)
@@ -0,0 +1,102 @@
+/*
+ *  This file was generated by the SOM Compiler and Emitter Framework.
+ *  Generated using: 
+ *      SOM Emitter emitctm: 2.42
+ */
+
+#ifndef SOM_Module_cwpcx_Source
+#define SOM_Module_cwpcx_Source
+#endif
+#define CWPCX_Class_Source
+#define M_CWPCX_Class_Source
+
+#include <os2.h>
+#include "helpid.h"
+#include "cwpcx.ih"
+
+extern char chrHelpLibrary[CCHMAXPATH];
+
+HMODULE queryResModuleHandle(void);
+HMODULE queryModuleHandle(void);
+BOOL getMessage(char* text,ULONG ulID, LONG lSizeText, HMODULE hResource,HWND hwnd);
+
+/*
+ * The prototype for cwpcxM_wpclsQueryInstanceType was replaced by the following prototype:
+ */
+SOM_Scope PSZ  SOMLINK cwpcxM_wpclsQueryInstanceType(M_MMPCX *somSelf)
+{
+    /* M_CWPCXData *somThis = M_CWPCXGetData(somSelf); */
+    M_MMPCXMethodDebug("M_MMPCX","cwpcxM_wpclsQueryInstanceType");
+
+    return "PCX";
+}
+
+/*
+ * The prototype for cwpcxM_wpclsQueryInstanceFilter was replaced by the following prototype:
+ */
+SOM_Scope PSZ  SOMLINK cwpcxM_wpclsQueryInstanceFilter(M_MMPCX *somSelf)
+{
+    /* M_CWPCXData *somThis = M_CWPCXGetData(somSelf); */
+    M_MMPCXMethodDebug("M_MMPCX","cwpcxM_wpclsQueryInstanceFilter");
+
+    return "*.PCX";
+}
+
+
+/*
+ * The prototype for cwpcxM_wpclsQueryDefaultHelp was replaced by the following prototype:
+ */
+SOM_Scope BOOL  SOMLINK cwpcxM_wpclsQueryDefaultHelp(M_MMPCX *somSelf, 
+                                                     PULONG pHelpPanelId, 
+                                                     PSZ pszHelpLibrary)
+{
+    /* M_CWPCXData *somThis = M_CWPCXGetData(somSelf); */
+    M_MMPCXMethodDebug("M_MMPCX","cwpcxM_wpclsQueryDefaultHelp");
+
+    if(pHelpPanelId)
+      *pHelpPanelId=PCXFILE_HELP_PANEL;
+    if(pszHelpLibrary)
+      strncpy(pszHelpLibrary, chrHelpLibrary, CCHMAXPATH);
+    return TRUE; 
+}
+
+/*
+ * The prototype for cwpcxM_wpclsQueryTitle was replaced by the following prototype:
+ */
+SOM_Scope PSZ  SOMLINK cwpcxM_wpclsQueryTitle(M_MMPCX *somSelf)
+{
+  static char chrTitle[20]={0};
+    /* M_CWPCXData *somThis = M_CWPCXGetData(somSelf); */
+    M_MMPCXMethodDebug("M_MMPCX","cwpcxM_wpclsQueryTitle");
+
+    if(chrTitle[0]==0)
+      if(!getMessage(chrTitle, IDSTR_PCXTITLE, sizeof(chrTitle), queryResModuleHandle(), HWND_DESKTOP))
+        strcpy(chrTitle,"PCXImage.PCX");
+
+    return chrTitle;
+}
+
+/*
+ * The prototype for cwpcxM_wpclsQueryIconData was replaced by the following prototype:
+ */
+SOM_Scope ULONG  SOMLINK cwpcxM_wpclsQueryIconData(M_MMPCX *somSelf, 
+                                                   PICONINFO pIconInfo)
+{
+  HMODULE hmod;
+    /* M_CWPCXData *somThis = M_CWPCXGetData(somSelf); */
+    M_MMPCXMethodDebug("M_MMPCX","cwpcxM_wpclsQueryIconData");
+
+    hmod=queryModuleHandle();
+    if(!hmod)
+      return M_MMPCX_parent_M_MMImage_wpclsQueryIconData(somSelf, pIconInfo);
+
+	if (pIconInfo)   {
+      pIconInfo->fFormat = ICON_RESOURCE;
+      pIconInfo->hmod    = hmod;
+      pIconInfo->resid   = ID_ICONPCXFILE;
+	} /* endif */
+
+	return ( sizeof(ICONINFO) );
+
+}
+
Index: /tags/CWMM-0.3.0_GA/classes/c/c_image/cwpng.c
===================================================================
--- /tags/CWMM-0.3.0_GA/classes/c/c_image/cwpng.c	(revision 213)
+++ /tags/CWMM-0.3.0_GA/classes/c/c_image/cwpng.c	(revision 213)
@@ -0,0 +1,108 @@
+/*
+ * (C) Chris Wohlgemuth 2002-2004
+ *
+ */
+/*
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; see the file COPYING.  If not, write to
+ * the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
+ */          
+/*
+ * If you need another license for your project/product (commercial,
+ * noncommercial, whatever) contact me at
+ * 
+ * http://www.os2world.com/cdwriting
+ * http://www.geocities.com/SiliconValley/Sector/5785/
+ *
+ */
+/*
+ *  This file was generated by the SOM Compiler and Emitter Framework.
+ *  Generated using: 
+ *      SOM Emitter emitctm: 2.42
+ */
+
+#ifndef SOM_Module_cwpng_Source
+#define SOM_Module_cwpng_Source
+#endif
+#define MMPNG_Class_Source
+#define M_MMPNG_Class_Source
+
+#include <os2.h>
+#include "helpid.h"
+#include "cwpng.ih"
+
+HMODULE queryResModuleHandle(void);
+HMODULE queryModuleHandle(void);
+BOOL getMessage(char* text,ULONG ulID, LONG lSizeText, HMODULE hResource,HWND hwnd);
+
+SOM_Scope PSZ  SOMLINK cwpngM_wpclsQueryInstanceType(M_MMPNG *somSelf)
+{
+    /* M_MMPNGData *somThis = M_MMPNGGetData(somSelf); */
+    M_MMPNGMethodDebug("M_MMPNG","cwpngM_wpclsQueryInstanceType");
+
+    return "PNG Image";
+}
+
+SOM_Scope PSZ  SOMLINK cwpngM_wpclsQueryInstanceFilter(M_MMPNG *somSelf)
+{
+    /* M_MMPNGData *somThis = M_MMPNGGetData(somSelf); */
+    M_MMPNGMethodDebug("M_MMPNG","cwpngM_wpclsQueryInstanceFilter");
+
+    return "*.PNG";
+}
+
+SOM_Scope BOOL  SOMLINK cwpngM_wpclsQueryDefaultHelp(M_MMPNG *somSelf, 
+                                                     PULONG pHelpPanelId, 
+                                                     PSZ pszHelpLibrary)
+{
+    /* M_MMPNGData *somThis = M_MMPNGGetData(somSelf); */
+    M_MMPNGMethodDebug("M_MMPNG","cwpngM_wpclsQueryDefaultHelp");
+
+    return (M_MMPNG_parent_M_MMImage_wpclsQueryDefaultHelp(somSelf, 
+                                                           pHelpPanelId, 
+                                                           pszHelpLibrary));
+}
+
+SOM_Scope PSZ  SOMLINK cwpngM_wpclsQueryTitle(M_MMPNG *somSelf)
+{
+  static char chrTitle[20]={0};
+    /* M_MMPNGData *somThis = M_MMPNGGetData(somSelf); */
+    M_MMPNGMethodDebug("M_MMPNG","cwpngM_wpclsQueryTitle");
+
+    if(chrTitle[0]==0)
+      if(!getMessage(chrTitle, IDSTR_PNGTITLE, sizeof(chrTitle), queryResModuleHandle(), HWND_DESKTOP))
+        strcpy(chrTitle,"PNGImage.PNG");
+
+    return chrTitle;
+}
+
+SOM_Scope ULONG  SOMLINK cwpngM_wpclsQueryIconData(M_MMPNG *somSelf, 
+                                                   PICONINFO pIconInfo)
+{
+  HMODULE hmod;
+    /* M_MMPNGData *somThis = M_MMPNGGetData(somSelf); */
+    M_MMPNGMethodDebug("M_MMPNG","cwpngM_wpclsQueryIconData");
+
+    hmod=queryModuleHandle();
+    if(!hmod)
+      return M_MMPNG_parent_M_MMImage_wpclsQueryIconData(somSelf, pIconInfo);
+
+    if (pIconInfo)   {
+      pIconInfo->fFormat = ICON_RESOURCE;
+      pIconInfo->hmod    = hmod;
+      pIconInfo->resid   = ID_ICONPNGFILE;
+	} /* endif */
+
+	return ( sizeof(ICONINFO) );
+}
+
Index: /tags/CWMM-0.3.0_GA/classes/c/c_image/cwtga.c
===================================================================
--- /tags/CWMM-0.3.0_GA/classes/c/c_image/cwtga.c	(revision 213)
+++ /tags/CWMM-0.3.0_GA/classes/c/c_image/cwtga.c	(revision 213)
@@ -0,0 +1,128 @@
+/*
+ * (C) Chris Wohlgemuth 2002-2004
+ *
+ */
+/*
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; see the file COPYING.  If not, write to
+ * the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
+ */          
+/*
+ * If you need another license for your project/product (commercial,
+ * noncommercial, whatever) contact me at
+ * 
+ * http://www.os2world.com/cdwriting
+ * http://www.geocities.com/SiliconValley/Sector/5785/
+ *
+ */
+/*
+ *  This file was generated by the SOM Compiler and Emitter Framework.
+ *  Generated using: 
+ *      SOM Emitter emitctm: 2.42
+ */
+
+#ifndef SOM_Module_cwtga_Source
+#define SOM_Module_cwtga_Source
+#endif
+#define CWTarga_Class_Source
+#define M_CWTarga_Class_Source
+
+#include <os2.h>
+#include "helpid.h"
+#include "cwtga.ih"
+
+extern char chrHelpLibrary[CCHMAXPATH];
+
+HMODULE queryResModuleHandle(void);
+HMODULE queryModuleHandle(void);
+BOOL getMessage(char* text,ULONG ulID, LONG lSizeText, HMODULE hResource,HWND hwnd);
+
+
+/*
+ * The prototype for cwtgaM_wpclsQueryInstanceType was replaced by the following prototype:
+ */
+SOM_Scope PSZ  SOMLINK cwtgaM_wpclsQueryInstanceType(M_MMTarga *somSelf)
+{
+    /* M_CWTargaData *somThis = M_CWTargaGetData(somSelf); */
+    M_MMTargaMethodDebug("M_MMTarga","cwtgaM_wpclsQueryInstanceType");
+
+    return "Targa";
+}
+
+/*
+ * The prototype for cwtgaM_wpclsQueryInstanceFilter was replaced by the following prototype:
+ */
+SOM_Scope PSZ  SOMLINK cwtgaM_wpclsQueryInstanceFilter(M_MMTarga *somSelf)
+{
+    /* M_CWTargaData *somThis = M_CWTargaGetData(somSelf); */
+    M_MMTargaMethodDebug("M_MMTarga","cwtgaM_wpclsQueryInstanceFilter");
+
+    return "*.TGA";
+}
+
+/*
+ * The prototype for cwtgaM_wpclsQueryDefaultHelp was replaced by the following prototype:
+ */
+SOM_Scope BOOL  SOMLINK cwtgaM_wpclsQueryDefaultHelp(M_MMTarga *somSelf, 
+                                                     PULONG pHelpPanelId, 
+                                                     PSZ pszHelpLibrary)
+{
+    /* M_CWTargaData *somThis = M_CWTargaGetData(somSelf); */
+    M_MMTargaMethodDebug("M_MMTarga","cwtgaM_wpclsQueryDefaultHelp");
+
+    if(pHelpPanelId)
+      *pHelpPanelId=TARGAFILE_HELP_PANEL;
+    if(pszHelpLibrary)
+      strncpy(pszHelpLibrary, chrHelpLibrary, CCHMAXPATH);
+    return TRUE; 
+}
+
+/*
+ * The prototype for cwtgaM_wpclsQueryTitle was replaced by the following prototype:
+ */
+SOM_Scope PSZ  SOMLINK cwtgaM_wpclsQueryTitle(M_MMTarga *somSelf)
+{
+  static char chrTitle[20]={0};
+    /* M_CWTargaData *somThis = M_CWTargaGetData(somSelf); */
+    M_MMTargaMethodDebug("M_MMTarga","cwtgaM_wpclsQueryTitle");
+
+    if(chrTitle[0]==0)
+      if(!getMessage(chrTitle, IDSTR_TGATITLE, sizeof(chrTitle), queryResModuleHandle(), HWND_DESKTOP))
+        strcpy(chrTitle,"TargaImage.TGA");
+
+    return chrTitle;
+}
+
+/*
+ * The prototype for cwtgaM_wpclsQueryIconData was replaced by the following prototype:
+ */
+SOM_Scope ULONG  SOMLINK cwtgaM_wpclsQueryIconData(M_MMTarga *somSelf, 
+                                                   PICONINFO pIconInfo)
+{
+  HMODULE hmod;
+    /* M_CWTargaData *somThis = M_CWTargaGetData(somSelf); */
+    M_MMTargaMethodDebug("M_MMTarga","cwtgaM_wpclsQueryIconData");
+
+    hmod=queryModuleHandle();
+    if(!hmod)
+      return M_MMTarga_parent_M_MMImage_wpclsQueryIconData(somSelf, pIconInfo);
+
+	if (pIconInfo)   {
+      pIconInfo->fFormat = ICON_RESOURCE;
+      pIconInfo->hmod    = hmod;
+      pIconInfo->resid   = ID_ICONTGAFILE;
+	} /* endif */
+
+	return ( sizeof(ICONINFO) );
+}
+
Index: /tags/CWMM-0.3.0_GA/classes/c/c_image/cwtiff.c
===================================================================
--- /tags/CWMM-0.3.0_GA/classes/c/c_image/cwtiff.c	(revision 213)
+++ /tags/CWMM-0.3.0_GA/classes/c/c_image/cwtiff.c	(revision 213)
@@ -0,0 +1,128 @@
+/*
+ * (C) Chris Wohlgemuth 2002-2004
+ *
+ */
+/*
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; see the file COPYING.  If not, write to
+ * the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
+ */          
+/*
+ * If you need another license for your project/product (commercial,
+ * noncommercial, whatever) contact me at
+ * 
+ * http://www.os2world.com/cdwriting
+ * http://www.geocities.com/SiliconValley/Sector/5785/
+ *
+ */
+/*
+ *  This file was generated by the SOM Compiler and Emitter Framework.
+ *  Generated using: 
+ *      SOM Emitter emitctm: 2.42
+ */
+
+#ifndef SOM_Module_cwtiff_Source
+#define SOM_Module_cwtiff_Source
+#endif
+#define CWTIFF_Class_Source
+#define M_CWTIFF_Class_Source
+
+#include <os2.h>
+#include "helpid.h"
+#include "cwtiff.ih"
+
+extern char chrHelpLibrary[CCHMAXPATH];
+
+HMODULE queryResModuleHandle(void);
+HMODULE queryModuleHandle(void);
+BOOL getMessage(char* text,ULONG ulID, LONG lSizeText, HMODULE hResource,HWND hwnd);
+
+/*
+ * The prototype for cwtiffM_wpclsQueryInstanceType was replaced by the following prototype:
+ */
+SOM_Scope PSZ  SOMLINK cwtiffM_wpclsQueryInstanceType(M_MMTIFF *somSelf)
+{
+    /* M_CWTIFFData *somThis = M_CWTIFFGetData(somSelf); */
+    M_MMTIFFMethodDebug("M_MMTIFF","cwtiffM_wpclsQueryInstanceType");
+
+    return "TIFF";
+}
+
+/*
+ * The prototype for cwtiffM_wpclsQueryInstanceFilter was replaced by the following prototype:
+ */
+SOM_Scope PSZ  SOMLINK cwtiffM_wpclsQueryInstanceFilter(M_MMTIFF *somSelf)
+{
+    /* M_CWTIFFData *somThis = M_CWTIFFGetData(somSelf); */
+    M_MMTIFFMethodDebug("M_MMTIFF","cwtiffM_wpclsQueryInstanceFilter");
+
+    return "*.TIF";
+}
+
+/*
+ * The prototype for cwtiffM_wpclsQueryDefaultHelp was replaced by the following prototype:
+ */
+SOM_Scope BOOL  SOMLINK cwtiffM_wpclsQueryDefaultHelp(M_MMTIFF *somSelf, 
+                                                      PULONG pHelpPanelId, 
+                                                      PSZ pszHelpLibrary)
+{
+    /* M_CWTIFFData *somThis = M_CWTIFFGetData(somSelf); */
+    M_MMTIFFMethodDebug("M_MMTIFF","cwtiffM_wpclsQueryDefaultHelp");
+
+    if(pHelpPanelId)
+      *pHelpPanelId=TIFFFILE_HELP_PANEL;
+    if(pszHelpLibrary)
+      strncpy(pszHelpLibrary, chrHelpLibrary, CCHMAXPATH);
+    return TRUE; 
+}
+
+/*
+ * The prototype for cwtiffM_wpclsQueryTitle was replaced by the following prototype:
+ */
+SOM_Scope PSZ  SOMLINK cwtiffM_wpclsQueryTitle(M_MMTIFF *somSelf)
+{
+  static char chrTitle[20]={0};
+    /* M_CWTIFFData *somThis = M_CWTIFFGetData(somSelf); */
+    M_MMTIFFMethodDebug("M_MMTIFF","cwtiffM_wpclsQueryTitle");
+
+    if(chrTitle[0]==0)
+      if(!getMessage(chrTitle, IDSTR_TIFTITLE, sizeof(chrTitle), queryResModuleHandle(), HWND_DESKTOP))
+        strcpy(chrTitle,"TIFImage.TIF");
+
+    return chrTitle;
+}
+
+/*
+ * The prototype for cwtiffM_wpclsQueryIconData was replaced by the following prototype:
+ */
+SOM_Scope ULONG  SOMLINK cwtiffM_wpclsQueryIconData(M_MMTIFF *somSelf, 
+                                                    PICONINFO pIconInfo)
+{
+  HMODULE hmod;
+
+    /* M_CWTIFFData *somThis = M_CWTIFFGetData(somSelf); */
+    M_MMTIFFMethodDebug("M_MMTIFF","cwtiffM_wpclsQueryIconData");
+
+    hmod=queryModuleHandle();
+    if(!hmod)
+      return M_MMTIFF_parent_M_MMImage_wpclsQueryIconData(somSelf, pIconInfo);
+
+	if (pIconInfo)   {
+      pIconInfo->fFormat = ICON_RESOURCE;
+      pIconInfo->hmod    = hmod;
+      pIconInfo->resid   = ID_ICONTIFFILE;
+	} /* endif */
+
+	return ( sizeof(ICONINFO) );
+}
+
Index: /tags/CWMM-0.3.0_GA/classes/c/c_image/image.c
===================================================================
--- /tags/CWMM-0.3.0_GA/classes/c/c_image/image.c	(revision 213)
+++ /tags/CWMM-0.3.0_GA/classes/c/c_image/image.c	(revision 213)
@@ -0,0 +1,411 @@
+#define INCL_GPI
+#define INCL_PM
+#define INCL_MMIOOS2
+#include <os2.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+//#include "os2me.h"
+#include "mmioos2.h"
+
+#include "pmdaytip.h"
+HAB hab;
+
+HBITMAP hBitmap;
+
+char text[200];
+
+HBITMAP loadBitmap ( PSZ pszFileName,
+                     ULONG ulWidth, 
+                     ULONG ulHeight, 
+                     BOOL* pbQuitEarly)
+{
+    HBITMAP       hbm;
+    MMIOINFO      mmioinfo;
+    MMFORMATINFO  mmFormatInfo;
+    HMMIO         hmmio;
+    ULONG         ulImageHeaderLength;
+    MMIMAGEHEADER mmImgHdr;
+    ULONG         ulBytesRead;
+    ULONG         dwNumRowBytes;
+    PBYTE         pRowBuffer;
+    ULONG         dwRowCount;
+    SIZEL         ImageSize;
+    ULONG         dwHeight, dwWidth;
+    SHORT          wBitCount;
+    FOURCC        fccStorageSystem;
+    ULONG         dwPadBytes;
+    ULONG         dwRowBits;
+    ULONG         ulReturnCode;
+    ULONG         dwReturnCode;
+    HBITMAP       hbReturnCode;
+    LONG          lReturnCode;
+    FOURCC        fccIOProc;
+    HDC           hdc;
+    HPS           hps;
+    HAB           hab=WinQueryAnchorBlock(HWND_DESKTOP);
+
+    ulReturnCode = mmioIdentifyFile ( pszFileName,
+                                      0L,
+                                      &mmFormatInfo,
+                                      &fccStorageSystem,
+                                      0L,
+                                      0L);
+    /*
+     *  If this file was NOT identified, then this function won't
+     *  work, so return an error by indicating an empty bitmap.
+     */
+    if ( ulReturnCode == MMIO_ERROR )
+    {
+         return (0L);
+    }
+    /*
+     *  If mmioIdentifyFile did not find a custom-written IO proc which
+     *  can understand the image file, then it will return the DOS IO Proc
+     *  info because the image file IS a DOS file.
+     */
+    if( mmFormatInfo.fccIOProc == FOURCC_DOS )
+    {
+         WinMessageBox( HWND_DESKTOP, HWND_DESKTOP,
+                        "Image file could not be interpreted by any permanently or temporarily installed IO procedures.",
+                        "Open Image File",
+                        (HMODULE) NULL,
+                        (ULONG) MB_OK | MB_MOVEABLE |
+                                MB_ERROR );
+         return ( 0L );
+    }
+    /*
+     *  Ensure this is an IMAGE IOproc, and that it can read
+     *  translated data
+     */
+    if ( (mmFormatInfo.ulMediaType != MMIO_MEDIATYPE_IMAGE) ||
+         ((mmFormatInfo.ulFlags & MMIO_CANREADTRANSLATED) == 0) )
+    {
+         WinMessageBox( HWND_DESKTOP, HWND_DESKTOP,
+                        "No IMAGE IO Procedures exist which can translate the data in the image file specified.",
+                        "Open Image File",
+                        (HMODULE) NULL,
+                        (ULONG) MB_OK | MB_MOVEABLE |
+                                MB_ERROR );
+         return (0L);
+    }
+    else
+    {
+         fccIOProc = mmFormatInfo.fccIOProc;
+    }
+
+    /* Clear out and initialize mminfo structure */
+    memset ( &mmioinfo, 0L, sizeof ( MMIOINFO ) );
+    mmioinfo.fccIOProc = fccIOProc;
+    mmioinfo.ulTranslate = MMIO_TRANSLATEHEADER | MMIO_TRANSLATEDATA;
+    hmmio = mmioOpen ( (PSZ) pszFileName,
+                       &mmioinfo,
+                       MMIO_READ | MMIO_DENYWRITE | MMIO_NOIDENTIFY );
+    if ( ! hmmio )
+    {
+         // If file could not be opened, return with error
+         return (0L);
+    }
+
+    dwReturnCode = mmioQueryHeaderLength ( hmmio,
+                                         (PLONG)&ulImageHeaderLength,
+                                           0L,
+                                           0L);
+    if ( ulImageHeaderLength != sizeof ( MMIMAGEHEADER ) )
+    {
+         /* We have a problem.....possibly incompatible versions */
+         ulReturnCode = mmioClose (hmmio, 0L);
+         return (0L);
+    }
+
+    ulReturnCode = mmioGetHeader ( hmmio,
+                                   &mmImgHdr,
+                                   (LONG) sizeof ( MMIMAGEHEADER ),
+                                   (PLONG)&ulBytesRead,
+                                   0L,
+                                   0L);
+
+    if ( ulReturnCode != MMIO_SUCCESS )
+    {
+         /* Header unavailable */
+         ulReturnCode = mmioClose (hmmio, 0L);
+         return (0L);
+    }
+
+    /*
+     *  Determine the number of bytes required, per row.
+     *      PLANES MUST ALWAYS BE = 1
+     */
+    dwHeight = mmImgHdr.mmXDIBHeader.BMPInfoHeader2.cy;
+    dwWidth = mmImgHdr.mmXDIBHeader.BMPInfoHeader2.cx;
+    wBitCount = mmImgHdr.mmXDIBHeader.BMPInfoHeader2.cBitCount;
+    dwRowBits = dwWidth * mmImgHdr.mmXDIBHeader.BMPInfoHeader2.cBitCount;
+    dwNumRowBytes = dwRowBits >> 3;
+
+    /*
+     *  Account for odd bits used in 1bpp or 4bpp images that are
+     *  NOT on byte boundaries.
+     */
+    if ( dwRowBits % 8 )
+    {
+         dwNumRowBytes++;
+    }
+    /*
+     *  Ensure the row length in bytes accounts for byte padding.
+     *  All bitmap data rows must are aligned on LONG/4-BYTE boundaries.
+     *  The data FROM an IOProc should always appear in this form.
+     */
+    dwPadBytes = ( dwNumRowBytes % 4 );
+    if ( dwPadBytes )
+    {
+         dwNumRowBytes += 4 - dwPadBytes;
+    }
+
+    /* Allocate space for ONE row of pels */
+    if ( DosAllocMem( (PPVOID)&pRowBuffer,
+                      (ULONG)dwNumRowBytes,
+                      fALLOC))
+    {
+         ulReturnCode = mmioClose (hmmio, 0L);
+         return(0L);
+    }
+
+    /* Create a device context */
+    hdc=DevOpenDC(hab, OD_MEMORY,"*",0L, NULL, NULLHANDLE);
+    if(hdc==NULLHANDLE)
+      {
+        DosFreeMem(pRowBuffer);
+        mmioClose (hmmio, 0L);
+        return(0L);
+      }
+    
+
+    // ***************************************************
+    // Create a memory presentation space that includes
+    // the memory device context obtained above.
+    // ***************************************************
+    ImageSize.cx = ulWidth;
+    ImageSize.cy = ulHeight;
+
+    //    ImageSize.cx = dwWidth;
+    //    ImageSize.cy = dwHeight;
+
+    hps = GpiCreatePS ( hab,
+                        hdc,
+                        &ImageSize,
+                        PU_PELS | GPIF_DEFAULT | GPIT_MICRO | GPIA_ASSOC );
+    if ( !hps )
+    {
+         WinMessageBox( HWND_DESKTOP, HWND_DESKTOP,
+                        "No HPS...",
+                        "Open Image File",
+                        (HMODULE) NULL,
+                        (ULONG) MB_OK | MB_MOVEABLE |
+                                MB_ERROR );
+      DosFreeMem(pRowBuffer);
+      mmioClose (hmmio, 0L);
+      return(0L);
+    }
+
+    // ***************************************************
+    // Create an uninitialized bitmap.  This is where we
+    // will put all of the bits once we read them in.
+    // ***************************************************
+
+    /*!!!!*/
+    //        mmImgHdr.mmXDIBHeader.BMPInfoHeader2.cxResolution=ulWidth;
+    //     mmImgHdr.mmXDIBHeader.BMPInfoHeader2.cyResolution=ulHeight;
+
+    mmImgHdr.mmXDIBHeader.BMPInfoHeader2.cx=ulWidth;
+    mmImgHdr.mmXDIBHeader.BMPInfoHeader2.cy=ulHeight;
+
+    /*!!!!*/
+    hbm = GpiCreateBitmap ( hps,
+                            &mmImgHdr.mmXDIBHeader.BMPInfoHeader2,
+                            0L,
+                            NULL,
+                            NULL);
+
+    if ( !hbm )
+    {
+      WinMessageBox( HWND_DESKTOP, HWND_DESKTOP,
+                     "No HBITMAP...",
+                     "Open Image File",
+                     (HMODULE) NULL,
+                     (ULONG) MB_OK | MB_MOVEABLE |
+                     MB_ERROR );
+
+      DosFreeMem(pRowBuffer);
+      ulReturnCode = mmioClose (hmmio, 0L);
+      return(0L);
+    }
+
+    mmImgHdr.mmXDIBHeader.BMPInfoHeader2.cx=dwWidth;
+    mmImgHdr.mmXDIBHeader.BMPInfoHeader2.cy=dwHeight;
+        mmImgHdr.mmXDIBHeader.BMPInfoHeader2.cxResolution=ulWidth;
+     mmImgHdr.mmXDIBHeader.BMPInfoHeader2.cyResolution=ulHeight;
+
+    sprintf(text, "%d %d", mmImgHdr.mmXDIBHeader.BMPInfoHeader2.cx,
+            mmImgHdr.mmXDIBHeader.BMPInfoHeader2.cy
+            );
+      WinMessageBox( HWND_DESKTOP, HWND_DESKTOP,
+text,
+                     "Open Image File",
+                     (HMODULE) NULL,
+                     (ULONG) MB_OK | MB_MOVEABLE |
+                     MB_ERROR );
+
+    // ***************************************************
+    // Select the bitmap into the memory device context.
+    // ***************************************************
+    hbReturnCode = GpiSetBitmap ( hps,
+                                  hbm );
+
+    //***************************************************************
+    //  LOAD THE BITMAP DATA FROM THE FILE
+    //      One line at a time, starting from the BOTTOM
+    //*************************************************************** */
+
+    for ( dwRowCount = 0; dwRowCount < dwHeight; dwRowCount++ )
+    {
+         ulBytesRead = (ULONG) mmioRead ( hmmio,
+                                          pRowBuffer,
+                                          dwNumRowBytes );
+         if ( !ulBytesRead )
+         {
+              break;
+         }
+         /*
+          *  Allow context switching while previewing.. Couldn't get
+          *  it to work. Perhaps will get to it when time is available...
+          */
+         lReturnCode = GpiSetBitmapBits ( hps,
+                                          (LONG) dwRowCount,
+                                          (LONG) 1,
+                                          (PBYTE) pRowBuffer,
+                                          (PBITMAPINFO2) &mmImgHdr.mmXDIBHeader.BMPInfoHeader2);
+    }
+
+
+    ulReturnCode = mmioClose (hmmio, 0L);
+    DosFreeMem(pRowBuffer);
+
+    return(hbm);
+}
+
+
+
+static MRESULT EXPENTRY transparencyExampleProc(HWND hwnd, ULONG msg, MPARAM mp1, MPARAM mp2) 
+{
+  RECTL rcl;
+  HPS hps;
+  HBITMAP hbm, hbmOld;
+  BITMAPINFOHEADER2 *ptr;
+  RGB2* rgb2;
+  int a, r,g,b,r2,g2,b2;
+  char *pvImage;
+  POINTL ptl= {0};
+  switch(msg)
+    {
+    case WM_PAINT:
+      hps=WinBeginPaint(hwnd, NULLHANDLE, NULL);
+
+      WinQueryWindowRect(hwnd, &rcl);
+      WinDrawBitmap(hps, hBitmap, NULL, (PPOINTL)&ptl, 0,0,DBM_NORMAL);
+#if 0  
+      if(pbmpInfo2 && pvImageData) {
+        hbm=GpiCreateBitmap(hps, (PBITMAPINFOHEADER2)pbmpInfo2, 0, NULLHANDLE, pbmpInfo2);
+        hbmOld=GpiSetBitmap(hps,hbm);
+        
+        ptr=malloc(sizeof(BITMAPINFOHEADER2)+sizeof(RGB2)*256);
+        if(ptr) {
+          memcpy(ptr, pbmpInfo2, sizeof(BITMAPINFOHEADER2)+sizeof(RGB2)*256);
+          
+          GpiDrawBits(hps, pvImageData, (PBITMAPINFO2) ptr, 4L, ptl, ROP_SRCCOPY, BBO_IGNORE);
+          free(ptr);
+        }/* if(ptr) */
+        GpiSetBitmap(hps, hbmOld);
+        GpiDeleteBitmap(hbm);
+      }/* End of if(pbmpInfo2 && pvImageData) */
+      else
+        WinFillRect(hps, &rcl, CLR_WHITE);
+#endif
+      //      WinFillRect(hps, &rcl, CLR_WHITE);
+      
+        WinEndPaint(hps);
+      return (MRESULT)0;
+    default:
+      break;
+    }
+  return WinDefWindowProc(hwnd, msg, mp1, mp2);
+}
+
+MRESULT EXPENTRY imageDialogProc(HWND hwnd, ULONG msg, MPARAM mp1, MPARAM mp2) 
+{
+  SHORT sLen, sPos;
+  MRESULT mr;
+  RECTL rcl;
+  HWND hwndPtr;
+  ULONG ulValue;
+
+    switch (msg)
+    {
+    case WM_INITDLG:
+      {
+        WinSubclassWindow(WinWindowFromID(hwnd, IDST_IMAGERECT),transparencyExampleProc);
+        break;
+      }
+    case WM_DESTROY:
+      break;
+    case WM_COMMAND:
+      switch(SHORT1FROMMP(mp1))
+      {
+      case DID_CANCEL:
+        return (MRESULT)0;
+      default:
+        break;
+      }
+    break;
+    case WM_CONTROL:
+      {
+        break;
+      }
+    default:
+      break;
+    }
+    return WinDefDlgProc(hwnd, msg, mp1, mp2);
+}
+
+
+int main (int argc, char *argv[])
+{
+  HMQ  hmq;
+  QMSG qmsg;
+  char text[CCHMAXPATH];
+  char title[CCHMAXPATH];
+  short a;
+  HWND hwndClient;
+  ULONG result;
+  ULONG rc;
+  HINI hIni;
+  char *chrPtr;
+
+  hab=WinInitialize(0);
+  if(hab) {
+    hmq=WinCreateMsgQueue(hab,0);
+    if(hmq) {  
+
+      if((hBitmap=loadBitmap("D:\\Arbeitsoberflaeche\\BIKES.nnn", 100, 100,NULL))!=NULLHANDLE) {
+        if( WinDlgBox( HWND_DESKTOP, NULLHANDLE, imageDialogProc, NULLHANDLE, 100, 0) == DID_ERROR )
+          {
+            WinDestroyMsgQueue( hmq );
+            WinTerminate( hab );
+            DosBeep(100,600);
+          }   
+      }
+    }
+    WinDestroyMsgQueue(hmq);
+    WinTerminate(hab);
+  }
+  return 0;
+}
Index: /tags/CWMM-0.3.0_GA/classes/c/c_image/makefile
===================================================================
--- /tags/CWMM-0.3.0_GA/classes/c/c_image/makefile	(revision 213)
+++ /tags/CWMM-0.3.0_GA/classes/c/c_image/makefile	(revision 213)
@@ -0,0 +1,10 @@
+# Makefile
+
+OBJECTS	= 
+
+all:
+	cd ../. && make
+
+clean:
+	rm *.*~
+
Index: /tags/CWMM-0.3.0_GA/classes/c/c_mm/cwmmdataf.c
===================================================================
--- /tags/CWMM-0.3.0_GA/classes/c/c_mm/cwmmdataf.c	(revision 213)
+++ /tags/CWMM-0.3.0_GA/classes/c/c_mm/cwmmdataf.c	(revision 213)
@@ -0,0 +1,749 @@
+/*
+ * (C) Chris Wohlgemuth 2002-2003
+ *
+ */
+/*
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; see the file COPYING.  If not, write to
+ * the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+/*
+ * If you need another license for your project/product contact me at
+ * 
+ * http://www.os2world.com/cdwriting
+ * http://www.geocities.com/SiliconValley/Sector/5785/
+ */
+/*
+ *  This file was generated by the SOM Compiler and Emitter Framework.
+ *  Generated using: 
+ *      SOM Emitter emitctm: 2.42
+ */
+
+#ifndef SOM_Module_cwmmdataf_Source
+#define SOM_Module_cwmmdataf_Source
+#endif
+#define CWMMDataFile_Class_Source
+#define M_CWMMDataFile_Class_Source
+
+#define INCL_PM
+#define INCL_DOS
+#define INCL_MMIOOS2
+#define INCL_MCIOS2
+#define INCL_REXXSAA
+
+#include <os2.h>
+#include <stdio.h>
+#include <rexxsaa.h>                   /* needed for Rexx */
+#include "os2me.h"
+#include "cwmmdataf.ih"
+#include "cwaudio.h"
+#include <wpfolder.h>
+//#include "cwmmres.h"
+#include "mmres.h"
+#include "cwaudioinc.h"
+
+#include "except.h"
+
+#include "som_wps_funcs.h"
+#include "sys_funcs.h"
+
+#if 0
+#define  _PMPRINTF_
+#include "PMPRINTF.H"
+#endif
+
+#define ID_STATUS_WINDOW   0x1000
+
+HAB globalHab=NULLHANDLE;
+/* Window which receives messages asking for scanning audio files. */
+static HWND globalHwndAudioWorker;
+/* Status window handle for message when scanning audio files. */
+static HWND globalHwndStatus;
+ULONG globalClassVolume;
+
+HMODULE queryResModuleHandle(void);
+BOOL getMessage(char* text,ULONG ulID, LONG lSizeText, HMODULE hResource,HWND hwnd);
+BOOL mmclsSetObjectType(WPFileSystem * somSelf);
+PSZ _queryMMClassIniFile(void);
+
+/* The REXX function handler */
+ULONG EXPENTRY rxCallCWMMFunc(PSZ name, LONG argc, RXSTRING argv[], PSZ queuename,PRXSTRING retstring);
+
+MRESULT EXPENTRY audioWorkerProc(HWND hwnd, ULONG msg, MPARAM mp1, MPARAM mp2);
+
+MRESULT EXPENTRY appTerminateHandlerProc(HWND hwnd, ULONG msg, MPARAM mp1, MPARAM mp2);
+
+
+
+
+/*
+  Audio files are started on a separate thread. An object window is used for communication.
+  Every audio object must provide a window procedure to handle the start/stop/resume commands
+  sent to the object window. By using such an object specific window proc it's possible
+  to alter the start/stop behaviour in child classes.
+ */
+/*!*******************************************************/
+/*                                                       */
+/* @@DESC                                                */
+/*                                                       */
+/* This instance method is called to set the object      */
+/* window procedure handling the play commands.          */
+/*                                                       */
+/*                                                       */
+/* @@USAGE                                               */
+/*                                                       */
+/* This method can be called at any time in order to     */
+/* set the window procedure handling play commands.      */
+/* :p.                                                   */
+/* When a track is started the playing is done on a      */
+/* separate thread. Communication with this thread is    */
+/* done using window messages sent to an object window.  */
+/* There's a default window procedure which starts or    */
+/* stops audio playing. If there must be special         */
+/* processing to play a particular type of file a        */
+/* subclass may set a custom procedure handling the      */
+/* audio commands.                                       */
+/*                                                       */
+/* @@PARAM                                               */
+/*                                                       */
+/* CWMMDataFile *somSelf input                           */
+/*                                                       */
+/* Pointer to the object on which the method is being    */
+/* invoked.                                              */
+/* :p.                                                   */
+/* Points to an object of class                          */
+/* :hp2.CWMMDatafile:ehp2..                              */
+/*                                                       */
+/* @@PARAM                                               */
+/*                                                       */
+/* PFNWP pObjectProc input                               */
+/*                                                       */
+/* Window procedure for audio command handling.          */
+/*                                                       */
+/*                                                       */
+/* @@OVERRIDE                                            */
+/*                                                       */
+/* This method is usually not overriden.                 */
+/*                                                       */
+/* @@RETURNS                                             */
+/*                                                       */
+/* PFNWP pOldProc                                        */
+/*                                                       */ 
+/* The previous window procedure handling the play       */
+/* commands.                                             */
+/*                                                       */
+/*                                                       */
+/*                                                       */
+/*                                                       */
+/*!!******************************************************/
+SOM_Scope PFNWP  SOMLINK cwmmdatafile_cwmmSetObjWindowProc(CWMMDataFile *somSelf, 
+                                                           PFNWP pObjectProc)
+{
+  PFNWP pTemp;
+    CWMMDataFileData *somThis = CWMMDataFileGetData(somSelf);
+    CWMMDataFileMethodDebug("CWMMDataFile","cwmmdatafile_cwmmSetObjWindowProc");
+
+    pTemp=_pfnwpObjectProc;
+    _pfnwpObjectProc=pObjectProc;
+
+    return pTemp;
+}
+
+
+/*
+  Method used to query the window procedure address for subclassing object windows.
+  Every audio object may have a customized window procedure.
+ */
+/*!*******************************************************/
+/*                                                       */
+/* @@DESC                                                */
+/*                                                       */
+/* This instance method is called to query the object    */
+/* window procedure currently used for handling the play */
+/* commands.                                             */
+/*                                                       */
+/*                                                       */
+/* @@USAGE                                               */
+/*                                                       */
+/* This method can be called at any time in order to     */
+/* query the current window procedure handling play      */
+/* commands.                                             */
+/* :p.                                                   */
+/* When a track is started the playing is done on a      */
+/* separate thread. Communication with this thread is    */
+/* done using window messages sent to an object window.  */
+/* There's a default window procedure which starts or    */
+/* stops audio playing. If there must be special         */
+/* processing to play a particular type of file a        */
+/* subclass may set a custom procedure handling the      */
+/* audio commands.                                       */
+/*                                                       */
+/* @@PARAM                                               */
+/*                                                       */
+/* CWMMDataFile *somSelf input                           */
+/*                                                       */
+/* Pointer to the object on which the method is being    */
+/* invoked.                                              */
+/* :p.                                                   */
+/* Points to an object of class                          */
+/* :hp2.CWMMDatafile:ehp2..                              */
+/*                                                       */
+/*                                                       */
+/* @@OVERRIDE                                            */
+/*                                                       */
+/* This method is usually not overriden.                 */
+/*                                                       */
+/* @@RETURNS                                             */
+/*                                                       */
+/* PFNWP pObjectProc                                     */
+/*                                                       */ 
+/* The current window procedure handling the play        */
+/* commands.                                             */
+/*                                                       */
+/*                                                       */
+/*                                                       */
+/*                                                       */
+/*!!******************************************************/
+SOM_Scope PFNWP  SOMLINK cwmmdatafile_cwmmQueryObjWindowProc(CWMMDataFile *somSelf)
+{
+    CWMMDataFileData *somThis = CWMMDataFileGetData(somSelf);
+    CWMMDataFileMethodDebug("CWMMDataFile","cwmmdatafile_cwmmQueryObjWindowProc");
+
+    return _pfnwpObjectProc;
+}
+
+
+/*
+ * The prototype for cwmmdatafile_cwmmSetRecordTitles was replaced by the following prototype:
+ */
+SOM_Scope BOOL  SOMLINK cwmmdatafile_cwmmSetRecordTitles(CWMMDataFile *somSelf, 
+                                                         PSZ pTitle, 
+                                                         BOOL bAddToTitle)
+{
+  PUSEITEM pUseItem;
+  PSZ pSZ;
+
+  M_CWMMDataFileData *m_mmDfData = M_CWMMDataFileGetData(_CWMMDataFile);
+    CWMMDataFileData *somThis = CWMMDataFileGetData(somSelf);
+    CWMMDataFileMethodDebug("CWMMDataFile","cwmmdatafile_cwmmSetRecordTitles");
+
+
+    if(m_mmDfData->bNoExtendedIconTitles)
+      return NULLHANDLE;
+
+    if(pTitle) {
+      if(!_pOrgTitle)
+        _pOrgTitle=_wpQueryTitle(somSelf);
+      if(bAddToTitle)
+        {
+          strncpy(_chrRecordTitle, _wpQueryTitle(somSelf), sizeof(_chrRecordTitle));
+          _chrRecordTitle[sizeof(_chrRecordTitle)-1]=0;
+          strncat(_chrRecordTitle,"\n", sizeof(_chrRecordTitle)-1-strlen(_chrRecordTitle));
+          strncat(_chrRecordTitle, pTitle, sizeof(_chrRecordTitle)-1-strlen(_chrRecordTitle));
+        }
+      else
+        strncpy(_chrRecordTitle, pTitle, sizeof(_chrRecordTitle));
+      _chrRecordTitle[sizeof(_chrRecordTitle)-1]=0;
+      pSZ=_chrRecordTitle;
+    }
+    else {
+      strncpy(_chrRecordTitle, _pOrgTitle, sizeof(_chrRecordTitle));
+      pSZ=_pOrgTitle;
+      _pOrgTitle=NULLHANDLE;
+    }
+    _chrRecordTitle[sizeof(_chrRecordTitle)-1]=0;
+
+    for(pUseItem=_wpFindUseItem(somSelf, USAGE_RECORD, NULLHANDLE); pUseItem;
+        pUseItem=_wpFindUseItem(somSelf, USAGE_RECORD, pUseItem))
+      {
+        PRECORDITEM pRecordItem=(PRECORDITEM)++pUseItem;
+        pUseItem--;
+
+        pRecordItem->pRecord->pszIcon=pSZ;
+        if(pRecordItem->hwndCnr)
+          WinSendMsg(pRecordItem->hwndCnr, CM_INVALIDATERECORD, MPFROMP(&(pRecordItem->pRecord)),
+                     MPFROM2SHORT(1,CMA_TEXTCHANGED));
+      }
+
+    for(pUseItem=_wpFindUseItem(somSelf, USAGE_LINK, NULLHANDLE); pUseItem;
+        pUseItem=_wpFindUseItem(somSelf, USAGE_LINK, pUseItem))
+      {
+        PLINKITEM pLinkItem=(PLINKITEM)++pUseItem;
+        pUseItem--;
+                        
+        if(somIsObj(pLinkItem->LinkObj))
+          {
+            PUSEITEM pUI;
+            
+            for(pUI=_wpFindUseItem(pLinkItem->LinkObj, USAGE_RECORD, NULLHANDLE); pUI;
+                pUI=_wpFindUseItem(pLinkItem->LinkObj, USAGE_RECORD, pUI))
+              {
+                PRECORDITEM pRecordItem=(PRECORDITEM)++pUI;
+                pUI--;
+
+                pRecordItem->pRecord->pszIcon=pSZ;
+                if(pRecordItem->hwndCnr)
+                  WinPostMsg(pRecordItem->hwndCnr,CM_INVALIDATERECORD,
+                             MPFROMP(&(pRecordItem->pRecord)),MPFROM2SHORT(1,CMA_TEXTCHANGED));
+              }
+          }
+      }
+
+    /* Return statement to be customized: */
+    return TRUE;
+}
+
+
+
+/*
+ * The prototype for cwmmdatafile_cwmmQueryTrackStatus was replaced by the following prototype:
+ */
+/*
+ * Object window handling the start/stop/pause/resume commands.
+ */
+/*!*******************************************************/
+/*                                                       */
+/* @@DESC                                                */
+/*                                                       */
+/* This instance method is called to query the current   */
+/* state of the multimedia object.g.                     */
+/*                                                       */
+/*                                                       */
+/* @@USAGE                                               */
+/*                                                       */
+/* This method can be called at any time in order to     */
+/* query the state of the object. This method can be used*/
+/* to check if an object is currently playing, paused    */
+/* etc.                                                  */
+/*                                                       */
+/*                                                       */
+/* @@PARAM                                               */
+/*                                                       */
+/* CWMMDataFile *somSelf input                           */
+/*                                                       */
+/* Pointer to the object on which the method is being    */
+/* invoked.                                              */
+/* :p.                                                   */
+/* Points to an object of class                          */
+/* :hp2.CWMMDatafile:ehp2..                              */
+/*                                                       */
+/* @@OVERRIDE                                            */
+/*                                                       */
+/* This method is usually not overriden.                 */
+/*                                                       */
+/* @@RETURNS                                             */
+/*                                                       */
+/* ULONG ulStatus                                        */
+/*                                                       */ 
+/* :parml compact tsize=35 break=none.                   */
+/* :pt.TRACK_STATUS_STOPPED                              */
+/* :pd.Track is not playing                              */
+/* :pt.TRACK_STATUS_PLAYING                              */
+/* :pd.Track is currently playing                        */
+/* :pt.TRACK_STATUS_PAUSED                               */
+/* :pd.Track is paused.                                  */
+/* :eparml.                                              */
+/*                                                       */
+/*                                                       */
+/*                                                       */
+/*                                                       */
+/*!!******************************************************/
+SOM_Scope ULONG  SOMLINK cwmmdatafile_cwmmQueryTrackStatus(CWMMDataFile *somSelf)
+{
+    CWMMDataFileData *somThis = CWMMDataFileGetData(somSelf);
+    //    CWMMDataFileMethodDebug("CWMMDataFile","cwmmdatafile_cwmmQueryTrackStatus");
+
+    /* Return statement to be customized: */
+    return _ulTrackStatus;
+}
+
+
+/*
+ * The prototype for cwmmdatafile_wpFilterPopupMenu was replaced by the following prototype:
+ */
+SOM_Scope ULONG  SOMLINK cwmmdatafile_wpFilterPopupMenu(CWMMDataFile *somSelf, 
+                                                        ULONG ulFlags, 
+                                                        HWND hwndCnr, 
+                                                        BOOL fMultiSelect)
+{
+  /*    CWMMDataFileData *somThis = CWMMDataFileGetData(somSelf);*/
+    CWMMDataFileMethodDebug("CWMMDataFile","cwmmdatafile_wpFilterPopupMenu");
+
+    /*fixme? This where you would remove copy create shadow and move for Alfredo's issue GKY 2-5-25
+    /* Remove the print menu item. */
+    return (CWMMDataFile_parent_WPDataFile_wpFilterPopupMenu(somSelf, 
+                                                             ulFlags, 
+                                                             hwndCnr, 
+                                                             fMultiSelect)& ~CTXT_PRINT);
+}
+
+
+/*
+
+ */
+SOM_Scope BOOL  SOMLINK cwmmdatafile_wpAddSettingsPages(CWMMDataFile *somSelf, 
+                                                        HWND hwndNotebook)
+{
+  BOOL bRc;
+    CWMMDataFileData *somThis = CWMMDataFileGetData(somSelf);
+    CWMMDataFileMethodDebug("CWMMDataFile","cwmmdatafile_wpAddSettingsPages");
+
+    bRc=(CWMMDataFile_parent_WPDataFile_wpAddSettingsPages(somSelf, 
+                                                              hwndNotebook));
+    /*
+      When the settings notebook is built the WPS resets the object title
+      (who knows why). If we have a custom title during playing this would
+      vanish. so check if we have a backup of the original title and if so
+      immediately set again the custom title.
+      */
+
+    if(_pOrgTitle)
+      _cwmmSetRecordTitles(somSelf, _chrRecordTitle, FALSE);
+    return bRc;
+}
+
+
+
+/*
+ * The prototype for cwmmdatafile_wpModifyPopupMenu was replaced by the following prototype:
+ */
+SOM_Scope BOOL  SOMLINK cwmmdatafile_wpModifyPopupMenu(CWMMDataFile *somSelf, 
+                                                       HWND hwndMenu, 
+                                                       HWND hwndCnr, 
+                                                       ULONG iPosition)
+{
+  BOOL bRc;
+
+    CWMMDataFileData *somThis = CWMMDataFileGetData(somSelf);
+    CWMMDataFileMethodDebug("CWMMDataFile","cwmmdatafile_wpModifyPopupMenu");
+
+    
+    bRc=(CWMMDataFile_parent_WPDataFile_wpModifyPopupMenu(somSelf, 
+                                                             hwndMenu, 
+                                                             hwndCnr, 
+                                                             iPosition));
+    /*
+      When the settings notebook is built the WPS resets the object title
+      (who knows why). If we have a custom title during playing this would
+      vanish. so check if we have a backup of the original title and if so
+      immediately set again the custom title.
+      */
+    if(_pOrgTitle)
+      _cwmmSetRecordTitles(somSelf, _chrRecordTitle, FALSE);
+
+    return bRc;
+}
+
+
+/*
+ * The prototype for cwmmdatafile_wpSetTitle was replaced by the following prototype:
+ */
+SOM_Scope BOOL  SOMLINK cwmmdatafile_wpSetTitle(CWMMDataFile *somSelf, 
+                                                PSZ pszNewTitle)
+{
+    CWMMDataFileData *somThis = CWMMDataFileGetData(somSelf);
+    CWMMDataFileMethodDebug("CWMMDataFile","cwmmdatafile_wpSetTitle");
+
+    _pOrgTitle=NULLHANDLE;
+
+    return (CWMMDataFile_parent_WPDataFile_wpSetTitle(somSelf, 
+                                                      pszNewTitle));
+}
+
+/*
+ * The prototype for cwmmdatafile_wpQueryTitle was replaced by the following prototype:
+ */
+SOM_Scope PSZ  SOMLINK cwmmdatafile_wpQueryTitle(CWMMDataFile *somSelf)
+{
+    CWMMDataFileData *somThis = CWMMDataFileGetData(somSelf);
+    CWMMDataFileMethodDebug("CWMMDataFile","cwmmdatafile_wpQueryTitle");
+
+    /*
+      Alway return the default title not the custom title (playtime display) 
+      which is only for display in containers.
+      */
+    if(_pOrgTitle)
+      return _pOrgTitle;
+    
+    return (CWMMDataFile_parent_WPDataFile_wpQueryTitle(somSelf));
+}
+
+
+SOM_Scope BOOL  SOMLINK cwmmdatafileM_wpclsCreateDefaultTemplates(M_CWMMDataFile *somSelf, 
+                                                                  WPObject* Folder)
+{
+  /*    M_CWMMDataFileData *somThis = M_CWMMDataFileGetData(somSelf);*/
+    M_CWMMDataFileMethodDebug("M_CWMMDataFile","cwmmdatafileM_wpclsCreateDefaultTemplates");
+
+    return TRUE; /* We don't want a template for this base class */
+}
+
+
+/*
+ * The prototype for cwmmdatafileM_wpclsQueryTitle was replaced by the following prototype:
+ */
+SOM_Scope PSZ  SOMLINK cwmmdatafileM_wpclsQueryTitle(M_CWMMDataFile *somSelf)
+{
+  static char chrTitle[20]={0};
+    /* M_CWMMDataFileData *somThis = M_CWMMDataFileGetData(somSelf); */
+    M_CWMMDataFileMethodDebug("M_CWMMDataFile","cwmmdatafileM_wpclsQueryTitle");
+
+    if(chrTitle[0]==0)
+      if(!getMessage(chrTitle, IDSTR_CWMMDATAFILETITLE, sizeof(chrTitle), queryResModuleHandle(), HWND_DESKTOP))
+        strcpy(chrTitle,"MMDatafile");
+
+    return chrTitle;
+}
+
+
+/*
+ * The prototype for cwmmdatafileM_wpclsQueryIconData was replaced by the following prototype:
+ */
+SOM_Scope ULONG  SOMLINK cwmmdatafileM_wpclsQueryIconData(M_CWMMDataFile *somSelf, 
+                                                          PICONINFO pIconInfo)
+{
+    /* M_CWMMDataFileData *somThis = M_CWMMDataFileGetData(somSelf); */
+    M_CWMMDataFileMethodDebug("M_CWMMDataFile","cwmmdatafileM_wpclsQueryIconData");
+
+    return (M_CWMMDataFile_parent_M_WPDataFile_wpclsQueryIconData(somSelf, 
+                                                                  pIconInfo));
+}
+
+/*
+  Window telling the user we are currently scanning the audio file. 
+ */
+MRESULT EXPENTRY statusWindowProc(HWND hwnd, ULONG msg, MPARAM mp1, MPARAM mp2)
+{
+  PFNWP proc;
+
+  switch (msg)
+    {
+    case WM_APPTERMINATENOTIFY:
+      {
+        switch (LONGFROMMP(mp2))
+          {
+          case 0:
+            WinStartTimer(WinQueryAnchorBlock(hwnd), hwnd, 1, 1000);
+            break;
+          case 1:
+            WinStopTimer(WinQueryAnchorBlock(hwnd), hwnd, 1);
+            break;
+          default:
+            break;
+          }
+        return (MRESULT) FALSE;
+      }
+    case WM_TIMER:
+      {
+        if(SHORT1FROMMP(mp1)==1) {
+          WinStopTimer(WinQueryAnchorBlock(hwnd), hwnd, 1);
+          /* Hide the status window */
+          WinSetWindowPos(hwnd, NULLHANDLE, 0, 0, 0, 0,SWP_SIZE);
+          return (MRESULT) FALSE;
+        }
+      }
+    default:
+      break;
+    }
+
+  proc=(PFNWP) WinQueryWindowULong(hwnd, QWL_USER);
+  if(proc)
+    return proc( hwnd, msg, mp1, mp2);
+
+  return WinDefWindowProc( hwnd, msg, mp1, mp2);
+}
+
+/*
+  The window proc is in file cwaudio.c
+
+  This thread scans the sudio files for gathering the audio information asynchronously.
+ */
+void _Optlink audioWorkerThread (void *arg)
+{
+
+  HAB  hab;
+  HMQ  hmq;
+  QMSG qmsg;
+  
+  M_CWMMDataFileData *somThis = (M_CWMMDataFileData*)arg;
+
+  DosSetPriority(PRTYS_THREAD, PRTYC_IDLETIME, 0, 0);
+  hab=WinInitialize(0);
+  if(hab) {
+    hmq=WinCreateMsgQueue(hab, 50);
+    if(hmq) {      
+      globalHwndAudioWorker=WinCreateWindow(HWND_OBJECT,WC_STATIC,"CWMMObj",0,0,0,0,0,NULLHANDLE,HWND_BOTTOM,13345,NULL,NULL);
+      //DosBeep(5000, 100);
+      if(globalHwndAudioWorker) {
+        WinSubclassWindow(globalHwndAudioWorker,&audioWorkerProc);
+        _hwndAudioWorker=globalHwndAudioWorker;
+        /* Window created. */
+        while(WinGetMsg(hab,&qmsg,(HWND)NULL,0,0))
+          WinDispatchMsg(hab,&qmsg);
+
+        WinDestroyWindow(globalHwndAudioWorker);
+      }
+      WinDestroyMsgQueue(hmq);
+    }
+    WinTerminate(hab);
+  }
+}
+
+
+/*********************************************************************************
+ *                                                                               *
+ * Every app started by a MM object is started using WinStartApp(). The          *
+ * notify window is this one. After starting a new view is added to the object.  *
+ * When terminating a WM_APPTERMINATENOTIFY message is sent to this window.      *
+ * We search the view item belonging to the app and remove it from the object    *
+ * inuse list.                                                                   *
+ *                                                                               *
+ *********************************************************************************/
+MRESULT EXPENTRY appTerminateHandlerProc(HWND hwnd, ULONG msg, MPARAM mp1, MPARAM mp2)
+{
+
+  switch (msg)
+    {
+    case WM_APPTERMINATENOTIFY:
+      {
+        for(;;) {
+          PUSEITEM pUseItem;
+          CWMMDataFile *somSelf= (CWMMDataFile *)WinQueryWindowULong(hwnd, QWL_USER);
+          if(!somIsObj(somSelf))
+            break;
+
+          for(pUseItem=_wpFindUseItem(somSelf, USAGE_OPENVIEW, NULLHANDLE); 
+              pUseItem;pUseItem=_wpFindUseItem(somSelf,USAGE_OPENVIEW, pUseItem))
+            {
+              PVIEWITEM pViewItem=(PVIEWITEM) ++pUseItem;
+              pUseItem--;
+              //  HlpWriteToTrapLog("ViewItem: %x\n",pViewItem);
+              if(pViewItem->handle==LONGFROMMP(mp1)) {
+                _wpDeleteFromObjUseList(somSelf,pUseItem);
+                _wpFreeMem(somSelf, (PBYTE)pUseItem);
+                WinDestroyWindow(hwnd);
+                //          WinPostMsg(hwnd, WM_DESTROY,0,0);
+                break;
+              }
+            }/* for() */
+          break;
+        };/* for() */
+        return (MRESULT) FALSE;
+      }
+    default:
+      break;
+    }
+  return WinDefWindowProc( hwnd, msg, mp1, mp2);
+}
+
+
+/*
+ * The prototype for cwmmdatafileM_wpclsInitData was replaced by the following prototype:
+ */
+SOM_Scope void  SOMLINK cwmmdatafileM_wpclsInitData(M_CWMMDataFile *somSelf)
+{
+  HINI hini;
+  static BOOL bInit=FALSE;
+
+    M_CWMMDataFileData *somThis = M_CWMMDataFileGetData(somSelf);
+    M_CWMMDataFileMethodDebug("M_CWMMDataFile","cwmmdatafileM_wpclsInitData");
+
+    M_CWMMDataFile_parent_M_WPDataFile_wpclsInitData(somSelf);
+
+    if(!globalHab)
+      globalHab=WinQueryAnchorBlock(HWND_DESKTOP);
+
+    /* Create a status window to show user we're scanning the audio file for info */
+    if(!globalHwndStatus)
+      {
+        HWND hwndClient;
+        PFNWP proc;
+        char chrText[100];
+
+        ULONG ulFL=FCF_BORDER | FCF_TITLEBAR;
+        globalHwndStatus=WinCreateStdWindow(HWND_DESKTOP,WS_VISIBLE|FS_BORDER,
+                                            &ulFL, WC_STATIC, "Audiofile scanning...",
+                                            WS_VISIBLE|SS_TEXT|DT_VCENTER|DT_CENTER, NULLHANDLE, ID_STATUS_WINDOW,
+                                            &hwndClient);
+        /* Set title */
+        if(getMessage(chrText, IDSTR_AUDIOSCANNING , sizeof(chrText), queryResModuleHandle(), globalHwndStatus))
+          WinSetWindowText(globalHwndStatus, chrText);
+        proc=WinSubclassWindow(globalHwndStatus,&statusWindowProc);
+        WinSetWindowULong(globalHwndStatus, QWL_USER,(ULONG)proc);
+        WinSetWindowPos(globalHwndStatus, HWND_TOP, 0, 0, 0, 0,SWP_MOVE|SWP_SIZE|SWP_ZORDER|SWP_DEACTIVATE);
+        /* Set window font to WarpSans */
+        WinSetPresParam(globalHwndStatus,
+                        PP_FONTNAMESIZE, (ULONG)sizeof(DEFAULT_DIALOG_FONT),
+                        DEFAULT_DIALOG_FONT );
+        WinSetPresParam(WinWindowFromID(globalHwndStatus, FID_CLIENT),
+                        PP_FONTNAMESIZE, (ULONG)sizeof(DEFAULT_DIALOG_FONT),
+                        DEFAULT_DIALOG_FONT );
+
+      }
+    _hwndStatus=globalHwndStatus;
+
+    /* Start audio worker thread */
+    if(!globalHwndAudioWorker)
+      _beginthread(audioWorkerThread, NULL, 8192*10, somThis);
+    else
+      _hwndAudioWorker=globalHwndAudioWorker;
+
+    if(!bInit) {    
+      /* Get special settings from the user INI file */
+      if(!PrfQueryProfileInt(HINI_USERPROFILE, "CWMM", MM_NO_EXTENDED_ICONTITLE, 0))
+        _bNoExtendedIconTitles=FALSE;
+      else
+        _bNoExtendedIconTitles=TRUE;
+      
+      /* Get additional settings from the MM class ini. */
+      if((hini=PrfOpenProfile(globalHab, _queryMMClassIniFile()))!=NULLHANDLE)
+        {
+          globalClassVolume=PrfQueryProfileInt(hini, CLASS_VOLUME_APP, CLASS_VOLUME_KEY,DEFVOLUME_AUDIO_FILE);
+          PrfCloseProfile(hini);
+        }
+      /* Register mmedia class REXX functions */
+      RexxRegisterFunctionExe("MMClsCallFunc", (PFN)rxCallCWMMFunc); /* This name is obsolete because it is hard
+                                                                        to tell if the function is used with objects
+                                                                        or with the class object. It's still here for 
+                                                                        backwards compatibility. */
+      RexxRegisterFunctionExe("MMCallFunc", (PFN)rxCallCWMMFunc);
+      /* Don't deregister the function in wpclsUninitData. If doing it the function
+         may be unavailable if the class object goes dormant. */
+      bInit=TRUE;
+    }/* bInit */
+}
+
+
+/*
+ * The prototype for cwmmdatafileM_wpclsUnInitData was replaced by the following prototype:
+ */
+SOM_Scope void  SOMLINK cwmmdatafileM_wpclsUnInitData(M_CWMMDataFile *somSelf)
+{
+    /* M_CWMMDataFileData *somThis = M_CWMMDataFileGetData(somSelf); */
+    M_CWMMDataFileMethodDebug("M_CWMMDataFile","cwmmdatafileM_wpclsUnInitData");
+
+    M_CWMMDataFile_parent_M_WPDataFile_wpclsUnInitData(somSelf);
+}
+
+
+/*
+ * The prototype for cwmmdatafileM_wpclsQueryStyle was replaced by the following prototype:
+ */
+SOM_Scope ULONG  SOMLINK cwmmdatafileM_wpclsQueryStyle(M_CWMMDataFile *somSelf)
+{
+  /*    M_CWMMDataFileData *somThis = M_CWMMDataFileGetData(somSelf);*/
+    M_CWMMDataFileMethodDebug("M_CWMMDataFile","cwmmdatafileM_wpclsQueryStyle");
+
+    return CLSSTYLE_DONTTEMPLATE;
+}
+
Index: /tags/CWMM-0.3.0_GA/classes/c/c_mm/cwmmdisk.c
===================================================================
--- /tags/CWMM-0.3.0_GA/classes/c/c_mm/cwmmdisk.c	(revision 213)
+++ /tags/CWMM-0.3.0_GA/classes/c/c_mm/cwmmdisk.c	(revision 213)
@@ -0,0 +1,283 @@
+
+/*
+ * (C) Chris Wohlgemuth 2002-2004
+ *
+ */
+/*
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; see the file COPYING.  If not, write to
+ * the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+/*
+ * If you need another license for your project/product contact me at
+ * 
+ * http://www.os2world.com/cdwriting
+ * http://www.geocities.com/SiliconValley/Sector/5785/
+ */
+
+/*
+ *  This file was generated by the SOM Compiler and Emitter Framework.
+ *  Generated using: 
+ *      SOM Emitter emitctm: 2.42
+ */
+
+#ifndef SOM_Module_cwmmdisk_Source
+#define SOM_Module_cwmmdisk_Source
+#endif
+#define CWMMDisk_Class_Source
+#define M_CWMMDisk_Class_Source
+
+#define INCL_PM
+#define INCL_DOS
+#define INCL_DOSERRORS
+#define INCL_WINWORKPLACE
+#define INCL_DOSDEVIOCTL
+
+#include "os2.h"
+#include <stdio.h>
+#include "cwmmdisk.ih"
+#include "wpobject.h"
+#include "wpfolder.h"
+
+#include "sys_funcs.h"
+
+HFILE openDrive(char* drive);
+void closeDrive(HFILE hfDrive);
+int CDQueryAudioCDTracks(HFILE hfDrive);
+
+ULONG checkForCDDrive(ULONG ulDriveNum);
+void invalidateDriveInList(ULONG ulDriveNum);
+
+//#define OPEN_MMDISK  0x6500+0x400
+
+/*
+ *    wpInitData : override;
+ *wpDelete : override;
+ */
+
+SOM_Scope HWND  SOMLINK cwmmdisk_wpViewObject(CWMMDisk *somSelf, 
+                                              HWND hwndCnr, ULONG ulView, 
+                                              ULONG param)
+{
+   /* CWMMDiskData *somThis = CWMMDiskGetData(somSelf); */
+    CWMMDiskMethodDebug("CWMMDisk","cwmmdisk_wpViewObject");
+
+    if(ulView == OPEN_DETAILS || ulView ==  OPEN_CONTENTS || ulView == OPEN_TREE || ulView == OPEN_DEFAULT) {
+        int iDiskNum;
+        
+        if((iDiskNum=_wpQueryLogicalDrive(somSelf))!=0) {
+          // if((iDiskNum>=iFirstCD && iDiskNum<=iFirstCD+iNumCD)) {
+          //       SysWriteToTrapLog("Drive: %d, CD: %d\n", iDiskNum, checkForCDDrive(iDiskNum));
+          if(checkForCDDrive(iDiskNum)==1) {
+            /* It's a CD drive */
+            HOBJECT hObject;
+            char chrPlayerID[100];
+            HFILE hFile;
+
+            /* Check if it's an audio CD */
+            sprintf(chrPlayerID, "%c:", 'A'+iDiskNum-1 );
+            if((hFile=openDrive(chrPlayerID))!=NULLHANDLE) {
+              int iNumTracks;
+
+              iNumTracks=CDQueryAudioCDTracks( hFile);
+              //         SysWriteToTrapLog("Drive %s opened. Num tracks: %d", chrPlayerID, iNumTracks);
+              closeDrive(hFile);
+              if(iNumTracks> 0) {
+                sprintf(chrPlayerID, "<CWMM_CDPLAYER_%c>", 'A'+iDiskNum-1);
+                if((hObject=WinQueryObject(chrPlayerID))!=NULLHANDLE) {
+                  WPObject *wpObject;
+                  HWND hwnd = 0;
+                  wpObject=_wpclsQueryObject( _CWMMDisk , hObject);
+                  if(somIsObj(wpObject)) {
+                    hwnd=_wpViewObject(wpObject, NULLHANDLE, OPEN_DEFAULT, 0);
+                    _wpUnlockObject(wpObject);
+                  }
+                  return hwnd;
+                }
+              }
+            }
+          }
+        }
+    }
+    return (CWMMDisk_parent_WPDisk_wpViewObject(somSelf, hwndCnr, 
+                                                ulView, param));
+}
+
+#if 0
+/*
+ *    wpInitData : override;
+ *wpDelete : override;
+ */
+
+SOM_Scope HWND  SOMLINK cwmmdisk_wpViewObject(CWMMDisk *somSelf, 
+                                              HWND hwndCnr, ULONG ulView, 
+                                              ULONG param)
+{
+   /* CWMMDiskData *somThis = CWMMDiskGetData(somSelf); */
+    CWMMDiskMethodDebug("CWMMDisk","cwmmdisk_wpViewObject");
+
+    if(ulView == OPEN_DETAILS || ulView ==  OPEN_CONTENTS || ulView == OPEN_TREE || ulView == OPEN_DEFAULT) {
+      if(bGotCD) {
+        int iDiskNum;
+        
+        if((iDiskNum=_wpQueryLogicalDrive(somSelf))!=0) {
+          if((iDiskNum>=iFirstCD && iDiskNum<=iFirstCD+iNumCD)) {
+            /* It's a CD drive */
+            HOBJECT hObject;
+            char chrPlayerID[100];
+            ULONG ulRC;
+            HFILE hFile;
+
+            /* Check if it's an audio CD */
+            sprintf(chrPlayerID, "%c:", 'A'+iDiskNum-1 );
+            if((hFile=openDrive(chrPlayerID))!=NULLHANDLE) {
+              int iNumTracks;
+              iNumTracks=CDQueryAudioCDTracks( hFile);
+              closeDrive(hFile);
+              if(iNumTracks> 0) {
+                sprintf(chrPlayerID, "<CWMM_CDPLAYER_%c>", 'A'+iDiskNum-1);
+                
+                if((hObject=WinQueryObject(chrPlayerID))!=NULLHANDLE) {
+                  if((ulRC=WinOpenObject(hObject, OPEN_DEFAULT, TRUE))!=NULLHANDLE) {
+                    return NULLHANDLE;}
+                }
+                /* For some strange reason WinOpenObject() returns 0 when the folder was already openend
+                   by the user. If it's reopened using WinOpenObject() from this method it returns 1!?
+                   We found the handle and tried to open it. Normally this succeeds so we just
+                   proceed as if everything is ok. The only thing we might loose if opening wasn't
+                   successful is the error box saying the CD isn't formatted properly (because it's an
+                   audio CD). Most users will even not notice this difference ;-) */ 
+                return NULLHANDLE;
+              }
+            }
+          }
+        }
+      }
+    }
+    return (CWMMDisk_parent_WPDisk_wpViewObject(somSelf, hwndCnr, 
+                                                ulView, param));
+}
+#endif
+
+#if 0
+BOOL isCD(ULONG ulDriveNum)
+{
+  /* This may be a remote drive */
+  char chrDev[8];
+  ULONG cbBuf;
+  ULONG rc;
+
+  BYTE buf[sizeof(FSQBUFFER2)+3*CCHMAXPATH];
+  PFSQBUFFER2 pBuf=(PFSQBUFFER2)buf;
+  
+  sprintf(chrDev, "%c:", 'a'+ulDriveNum-1);
+  cbBuf=sizeof(buf);
+  
+  /* Check if local or remote (or anything else) */
+  rc= DosQueryFSAttach(chrDev, 0, FSAIL_QUERYNAME,(PFSQBUFFER2) &buf, &cbBuf);
+  if(!rc) {
+    PSZ  pszFSDName;
+    PSZ prgFSAData;
+
+    pszFSDName=pBuf->szName+pBuf->cbName+1;
+    prgFSAData=pszFSDName+pBuf->cbFSDName+1;
+    SysWriteToTrapLog("  %s, %s\n", pBuf->szName, pszFSDName, prgFSAData);
+
+    //    if(pBuf->iType==FSAT_REMOTEDRV)
+    //     ulDisk=QDT_REMOTE_DRIVE;
+  }
+  return TRUE;
+}
+void isCD2(ULONG ulDriveNum) {
+  char chrPlayerID[100];
+  ULONG rc;
+  HFILE hFile;
+  
+  /* Check if it's an audio CD */
+  sprintf(chrPlayerID, "%c:", 'A'+ulDriveNum-1);
+  if((hFile=openDrive(chrPlayerID))!=NULLHANDLE) {
+    int iNumTracks;
+	ULONG ulParamLen;
+	ULONG ulDataLen;
+    ULONG ulData;
+
+	ulParamLen=4;
+	ulDataLen=sizeof(ulData);
+	rc = DosDevIOCtl(hFile, IOCTL_CDROMDISK, CDROMDISK_DEVICESTATUS,
+						  "CD01", 4, &ulParamLen, &ulData,
+						  sizeof(ulData), &ulDataLen);
+    if(!rc)
+      SysWriteToTrapLog("%d: NO_ERROR, ", ulDriveNum);
+    else
+      SysWriteToTrapLog("%d: ERROR, ", ulDriveNum);
+    closeDrive(hFile);
+    return;
+  }
+  SysWriteToTrapLog("%d: Open drive failed, ", ulDriveNum);
+}
+#endif
+
+SOM_Scope BOOL  SOMLINK cwmmdisk_wpFree(CWMMDisk *somSelf)
+{
+    /* CWMMDiskData *somThis = CWMMDiskGetData(somSelf); */
+    CWMMDiskMethodDebug("CWMMDisk","cwmmdisk_wpFree");
+
+    invalidateDriveInList(_wpQueryLogicalDrive(somSelf));
+    return (CWMMDisk_parent_WPDisk_wpFree(somSelf));
+}
+
+SOM_Scope void  SOMLINK cwmmdisk_wpObjectReady(CWMMDisk *somSelf, 
+                                               ULONG ulCode, 
+                                               WPObject* refObject)
+{
+  ULONG ulDrive;
+
+    /* CWMMDiskData *somThis = CWMMDiskGetData(somSelf); */
+    CWMMDiskMethodDebug("CWMMDisk","cwmmdisk_wpObjectReady");
+
+    //SysWriteToTrapLog("\nLogical drive created: %d, Type is: %x\n",
+    //                _wpQueryLogicalDrive(somSelf), SysQueryDriveType(_wpQueryLogicalDrive(somSelf)));
+
+    //   isCD2(_wpQueryLogicalDrive(somSelf));
+    //   isCD(_wpQueryLogicalDrive(somSelf));
+
+    CWMMDisk_parent_WPDisk_wpObjectReady(somSelf, ulCode, refObject);
+
+    /*
+      @@CHANGE 0.2.8
+      
+      Insert CD drives into a global list whenever a drive object is created.
+      Remove it on destruction. This was added to support LVM systems with
+      dynamically attached USB CD-ROM drives.
+      */
+    ulDrive=_wpQueryLogicalDrive(somSelf);
+    if(ulDrive>2) /* Don't check floppies */
+      checkForCDDrive(ulDrive); /* This call inserts CD drives into a global list so
+                                   the entry is cached. It will be removed during processing of wpFree(). */
+
+}
+
+
+SOM_Scope PSZ  SOMLINK cwmmdiskM_wpclsQueryTitle(M_CWMMDisk *somSelf)
+{
+    /* M_CWMMDiskData *somThis = M_CWMMDiskGetData(somSelf); */
+    M_CWMMDiskMethodDebug("M_CWMMDisk","cwmmdiskM_wpclsQueryTitle");
+
+    return "CWMMDisk";
+    /*    return (M_CWMMDisk_parent_M_WPDisk_wpclsQueryTitle(somSelf));*/
+}
+
+
+
+
+
Index: /tags/CWMM-0.3.0_GA/classes/c/c_mm/makefile
===================================================================
--- /tags/CWMM-0.3.0_GA/classes/c/c_mm/makefile	(revision 213)
+++ /tags/CWMM-0.3.0_GA/classes/c/c_mm/makefile	(revision 213)
@@ -0,0 +1,10 @@
+# Makefile
+
+OBJECTS	= 
+
+all:
+	cd ../. && make
+
+clean:
+	rm *.*~
+
Index: /tags/CWMM-0.3.0_GA/classes/c/c_mm/mmfolder.c
===================================================================
--- /tags/CWMM-0.3.0_GA/classes/c/c_mm/mmfolder.c	(revision 213)
+++ /tags/CWMM-0.3.0_GA/classes/c/c_mm/mmfolder.c	(revision 213)
@@ -0,0 +1,1277 @@
+/*
+ * (C) Chris Wohlgemuth 2002-2004
+ *
+ */
+/*
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; see the file COPYING.  If not, write to
+ * the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+/*
+ * If you need another license for your project/product (commercial,
+ * noncommercial, whatever) contact me at
+ *
+ * http://www.os2world.com/cdwriting
+ * http://www.geocities.com/SiliconValley/Sector/5785/
+ *
+ */
+/*
+ *  This file was generated by the SOM Compiler and Emitter Framework.
+ *  Generated using:
+ *      SOM Emitter emitctm: 2.42
+ */
+
+#ifndef SOM_Module_mmfolder_Source
+#define SOM_Module_mmfolder_Source
+#endif
+#define MMFolder_Class_Source
+#define M_MMFolder_Class_Source
+
+#define INCL_GPIBITMAPS
+#define INCL_PM
+#define INCL_DOSMODULEMGR
+#define INCL_WINPOINTERS
+#define INCL_DOS
+#include <os2.h>
+#include <stdio.h>
+#include "helpid.h"
+#include "mmfolder.ih"
+/* Include file with definition for WPShadow class */
+#include "wpshadow.h"
+#include "cwimage.h"
+//#include "cwmmres.h"
+#include "mmres.h"
+#include "cwbmp.h"
+#include "cwaudioinc.h"
+#include "mmfolderinc.h"
+#include "except.h"
+#include "som_wps_funcs.h"
+#include "sys_funcs.h"
+
+#define STOREWINDOWID 112233
+
+//#define DEBUG
+
+void writeLog(const char* chrFormat, ...);
+BOOL getMessage(char* text,ULONG ulID, LONG lSizeText, HMODULE hResource,HWND hwnd);
+HMODULE queryModuleHandle(void);
+HMODULE queryResModuleHandle(void);
+SHORT menuInsertMenuItem( HWND hwndMenu, HWND hwndSubMenu, SHORT sPosition, int iID, char * chrText);
+MRESULT menuInsertMenuSeparator(HWND hwndMenu, HWND hwndSubMenu, SHORT sPosition );
+
+WPObject* somGetFileSystemObject(WPObject* wpObject);
+void SysWriteToTrapLog(const char* chrFormat, ...);
+
+static SOMClass * queryWpFolderClass(void)
+{
+  somId mySomId;
+  static SOMClass * mWPFolderClass=NULLHANDLE;
+
+  if(!mWPFolderClass) {
+    if((mySomId=somIdFromString("WPFolder"))!=NULLHANDLE) {
+      mWPFolderClass=(SOMClass*)_somClassFromId(SOMClassMgrObject, mySomId);
+      SOMFree(mySomId);
+    }
+  }
+  return mWPFolderClass;
+}
+
+/* Now using IBM names as of V0.2.4 */
+static SOMClass* queryCWImageFileClass(void)
+{
+  somId mySomId;
+  static SOMClass *mWPImgClass=NULL;
+
+  if(!mWPImgClass) {
+    if((mySomId=somIdFromString("MMImage"))!=NULLHANDLE) {
+      mWPImgClass=(SOMClass*)_somClassFromId(SOMClassMgrObject, mySomId);
+      SOMFree(mySomId);
+    }
+  }
+  return mWPImgClass;
+}
+
+/* Bitmap class */
+static SOMClass* queryCWBitmapFileClass(void)
+{
+  somId mySomId;
+  static SOMClass *mWPImgClass=NULL;
+
+  if(!mWPImgClass) {
+    if((mySomId=somIdFromString("MMBitmap"))!=NULLHANDLE) {
+      mWPImgClass=(SOMClass*)_somClassFromId(SOMClassMgrObject, mySomId);
+      SOMFree(mySomId);
+    }
+  }
+  return mWPImgClass;
+}
+
+MRESULT EXPENTRY mmFolderContainerProc(HWND hwnd, ULONG msg, MPARAM mp1, MPARAM mp2)
+{
+  HWND hwndStore;
+  MMFolder *somSelf;
+
+
+  //writeLog("Msg: 0x%x, MPARM1: 0x%x, MPARM2: 0x%x\n", msg, mp1, mp2);
+  switch(msg)
+    {
+      //    case CM_QUERYDRAGIMAGE:
+      //      DosBeep(5000,150);
+      //      break;
+      //    return NULLHANDLE;
+    case CM_SETCNRINFO:
+      {
+        /* Make sure CNR stays ownerdrawn even when user changes view */
+        PCNRINFO pCnrInfo=(PCNRINFO)PVOIDFROMMP(mp1);
+
+        if(pCnrInfo) {
+          //      writeLog("flWindowAttr: 0x%x, Mask: 0x%x, cxTreeIndent: %d, cyLineSpacing: %d\n",
+          //       pCnrInfo->flWindowAttr, LONGFROMMP(mp2), pCnrInfo->cxTreeIndent, pCnrInfo->cyLineSpacing);
+
+          if(!(pCnrInfo->flWindowAttr & (CV_DETAIL|CV_TREE/*|CV_ICON|CV_NAME*/)) &&
+             (LONGFROMMP(mp2)&CMA_FLWINDOWATTR)) {
+            HWND hwndFrame=WinQueryWindow(hwnd, QW_PARENT);
+            //         writeLog("Accepted, flWindowAttr: 0x%x, Mask: 0x%x\n", pCnrInfo->flWindowAttr, LONGFROMMP(mp2));
+            if((hwndStore=WinWindowFromID(hwndFrame, STOREWINDOWID))!=NULLHANDLE)
+              {
+                somSelf=(MMFolder*) WinQueryWindowULong(hwndStore,QWL_USER);
+                if(somIsObj(somSelf)) {
+                  MMFolderData *somThis = MMFolderGetData(somSelf);
+
+                  pCnrInfo->flWindowAttr&=~CA_DRAWICON;
+                  pCnrInfo->flWindowAttr|=CA_DRAWBITMAP|CA_OWNERDRAW;
+                  pCnrInfo->slBitmapOrIcon.cx=_ulCurrentSize;
+                  pCnrInfo->slBitmapOrIcon.cy=_ulCurrentSize;
+
+                  mp2=MPFROMLONG(LONGFROMMP(mp2)|CMA_SLBITMAPORICON|CMA_FLWINDOWATTR);
+                }
+              }
+          }
+          else
+            {
+              if(pCnrInfo->flWindowAttr & (CV_DETAIL|CV_TREE)) {
+                //  writeLog("Accepted, flWindowAttr: 0x%x, Mask: 0x%x\n", pCnrInfo->flWindowAttr, LONGFROMMP(mp2));
+                pCnrInfo->flWindowAttr&=~(CA_OWNERDRAW|CA_DRAWBITMAP);
+                pCnrInfo->flWindowAttr|=CA_DRAWICON;
+                pCnrInfo->slBitmapOrIcon.cx=0;
+                pCnrInfo->slBitmapOrIcon.cy=0;
+
+                mp2=MPFROMLONG(LONGFROMMP(mp2)|CMA_SLBITMAPORICON);
+              }
+            }
+        }
+      break;
+      }
+    default:
+      break;
+    }
+  /* Any other message is handled by the folder container procedure */
+  if((hwndStore=WinQueryWindow(hwnd,QW_PARENT))!=NULLHANDLE)
+    {
+      if((hwndStore=WinWindowFromID(hwndStore, STOREWINDOWID))!=NULLHANDLE)
+        {
+          somSelf=(MMFolder*) WinQueryWindowULong(hwndStore,QWL_USER);
+          if(somIsObj(somSelf)) {
+            MMFolderData *somThis = MMFolderGetData(somSelf);
+            if(_oldContainerProc)
+              return _oldContainerProc(hwnd, msg, mp1, mp2);
+          }
+        }
+    }
+  return WinDefWindowProc(hwnd, msg, mp1, mp2);
+}
+
+
+/* This function draws a two coloured 1 pixel border. It's used to draw the outmost
+   line of any 3D element like buttons. */
+static BOOL cwDraw2ColorBorder(HPS hps, RECTL *rcl, ULONG color1, ULONG color2)
+{
+
+  POINTL ptl=*((PPOINTL)rcl);
+
+  GpiMove(hps, &ptl);
+  GpiSetColor(hps, color1);
+  ptl.x=rcl->xRight;
+  GpiLine(hps,&ptl);
+  ptl.y=rcl->yTop;
+  GpiLine(hps,&ptl);
+  ptl.x-=1;
+  GpiMove(hps, &ptl);
+  GpiSetColor(hps, color2);
+  ptl.x=rcl->xLeft;
+  GpiLine(hps,&ptl);
+  ptl.y=rcl->yBottom+1;
+  GpiLine(hps,&ptl);
+  return TRUE;
+}
+
+
+static void cwAdjustIconRECTL(RECTL * rcl, ULONG ulMaxIconWidth, ULONG ulWidthBMP, ULONG ulHeightBMP)
+{
+  if(!rcl)
+    return;
+
+  rcl->xLeft+=2;
+  if(ulMaxIconWidth>ulWidthBMP)
+    rcl->xLeft+=(ulMaxIconWidth-ulWidthBMP)/2;
+  rcl->xRight=rcl->xLeft+ulWidthBMP;
+  rcl->yBottom+=2;
+  if(ulMaxIconWidth>ulHeightBMP)
+    rcl->yBottom+=(ulMaxIconWidth-ulHeightBMP)/2;
+  rcl->yTop=rcl->yBottom+ulHeightBMP;///ulFact;
+}
+
+/*
+  This function draws the template (but not the icon) if the object is a template.
+ */
+static ULONG mfldrDrawTemplate(WPObject* wpObject, RECTL* rcl, HPS hps, ULONG flCnr)
+{
+  HPOINTER hptrTemplate;
+  HMODULE hmodTemplate;
+
+  if(!DosQueryModuleHandle("PMWP",&hmodTemplate))
+    {
+      ULONG ulIconSize;
+
+      hptrTemplate=WinLoadPointer(HWND_DESKTOP, hmodTemplate, 20);
+      WinDrawPointer(hps, rcl->xLeft, rcl->yBottom, hptrTemplate, (flCnr &  CV_MINI ? DP_MINI:DP_NORMAL));
+      WinDestroyPointer(hptrTemplate);
+      if((ulIconSize=WinQuerySysValue(HWND_DESKTOP,SV_CXICON))!=0)
+        {
+          ulIconSize=(rcl->xRight-rcl->xLeft-ulIconSize/2)/2;
+          rcl->xLeft+=ulIconSize/2;
+          rcl->yBottom+=ulIconSize;
+        }
+      return DP_MINI;
+    }
+
+  return DP_NORMAL;
+}
+
+
+MRESULT EXPENTRY mmFolderFrameProc(HWND hwnd, ULONG msg, MPARAM mp1, MPARAM mp2)
+{
+  HWND hwndStore;
+  MMFolder *somSelf;
+
+  switch(msg)
+    {
+      /************************************************/
+      /* Draw the icons                               */
+      /************************************************/
+    case WM_DRAWITEM:
+      {
+        POWNERITEM pOwnerItem=(POWNERITEM)PVOIDFROMMP(mp2);
+
+
+        /* We only draw icons not text */
+        if(pOwnerItem->idItem==CMA_ICON /*&& !bNot*/) {
+          PMINIRECORDCORE mrc=(PMINIRECORDCORE)((PCNRDRAWITEMINFO)pOwnerItem->hItem)->pRecord;
+          RECTL rclTemp=pOwnerItem->rclItem;
+          HWND hwndCnr=WinWindowFromID(hwnd, FID_CLIENT);
+          PCNRDRAWITEMINFO pCnrDrawItemInfo=(PCNRDRAWITEMINFO)pOwnerItem->hItem;
+          CNRINFO cnrInfo;
+          ULONG flCnr;
+
+          if(WinSendMsg(hwndCnr, CM_QUERYCNRINFO,MPFROMP(&cnrInfo), MPFROMLONG(sizeof(cnrInfo))))
+            flCnr=cnrInfo.flWindowAttr;
+
+          /*
+            Draw emphasis if any. Otherwise draw white background.
+           */
+          rclTemp.xLeft+=2;
+          rclTemp.xRight-=2;
+          rclTemp.yBottom+=2;
+          rclTemp.yTop-=2;
+          /* Check if record is selected and in use */
+          if((pCnrDrawItemInfo->pRecord->flRecordAttr & CRA_INUSE)
+             && (pCnrDrawItemInfo->pRecord->flRecordAttr & CRA_SELECTED)) {
+            POINTL pointl;
+
+            WinFillRect(pOwnerItem->hps, &rclTemp, CLR_WHITE);
+            GpiSetPattern(pOwnerItem->hps,PATSYM_DIAG2);
+            pointl.x = rclTemp.xLeft;
+            pointl.y = rclTemp.yBottom;
+            GpiMove(pOwnerItem->hps, &pointl);
+            pointl.x = rclTemp.xRight - 1;
+            pointl.y = rclTemp.yTop - 1;
+            GpiSetColor(pOwnerItem->hps, CLR_BLACK);
+            GpiBox(pOwnerItem->hps,DRO_FILL,&pointl,1,1);
+
+          }
+          /* Check if record is in use */
+          else if(pCnrDrawItemInfo->pRecord->flRecordAttr & CRA_INUSE) {
+            POINTL pointl;
+
+            WinFillRect(pOwnerItem->hps, &rclTemp, CLR_WHITE);
+            GpiSetPattern(pOwnerItem->hps,PATSYM_DIAG1);
+            pointl.x = rclTemp.xLeft;
+            pointl.y = rclTemp.yBottom;
+            GpiMove(pOwnerItem->hps, &pointl);
+            pointl.x = rclTemp.xRight - 1;
+            pointl.y = rclTemp.yTop - 1;
+            GpiSetColor(pOwnerItem->hps, CLR_BLACK);
+            GpiBox(pOwnerItem->hps,DRO_FILL,&pointl,1,1);
+          }
+          /* or is it only selected? */
+          else if(pCnrDrawItemInfo->pRecord->flRecordAttr & CRA_SELECTED)
+            WinFillRect(pOwnerItem->hps, &rclTemp, CLR_DARKGRAY);
+          /* Default is paint white background */
+          else
+            WinFillRect(pOwnerItem->hps, &rclTemp, CLR_WHITE);
+          /* Emphasis drawn */
+
+          /********************************************/
+          /*                                          */
+          /*               Draw the image             */
+          /*                                          */
+          /********************************************/
+          if(mrc){
+            WPObject *wpObject;
+            ULONG ulIconSize=150;/* Default if query fails */
+
+            wpObject=(WPObject*)OBJECT_FROM_PREC(mrc); // Get object
+            wpObject=somGetFileSystemObject(wpObject);  // Get Filesystem object
+
+            if(somIsObj(wpObject) && _wpIsObjectInitialized(wpObject)) {
+              SOMClass* cwBitmapClass=queryCWBitmapFileClass();
+              SOMClass* cwImageClass=queryCWImageFileClass();
+
+              /* Check if object is an image or bitmap class. If yes paint the bitmap as
+                 an icon. Only templates keep their normal icon. */
+              if((somIsObj(cwImageClass)||somIsObj(cwBitmapClass)) && !(_wpQueryStyle(wpObject) & OBJSTYLE_TEMPLATE)) {
+                HBITMAP hbm=NULLHANDLE;
+                PBITMAPINFOHEADER2 pBmpInfoHeader2=NULLHANDLE;
+#ifdef DEBUG
+                SysWriteToTrapLog("Object is an image. (%s line: %d)\n", __FUNCTION__, __LINE__);
+#endif
+                /* Get object pointer of lighttable folder */
+                if((hwndStore=WinWindowFromID(hwnd, STOREWINDOWID))!=NULLHANDLE)
+                  {
+                    somSelf=(MMFolder*) WinQueryWindowULong(hwndStore,QWL_USER);
+                    if(somIsObj(somSelf)) {
+                      MMFolderData *somThis = MMFolderGetData(somSelf);
+                      ulIconSize=_ulCurrentSize;
+                    }
+                  }
+
+                /* Get a small bitmap */
+                if(_somIsA(wpObject, cwImageClass)) {
+
+                  /*
+                    V0.2.8 (09.09.2003)
+
+                    Only try to get the bitmap header when we were able to get the handle (we don't need it
+                    without the handle anyway). Interestingly the  _wpQueryBitmapInfoHeader() call blocks
+                    when called without a loaded bitmap. It doesn't block on loading the image but when trying
+                    to alloc mem for the header using _wpAllocMem(). Probably there's a race condition while
+                    inserting the USAGE_MEMORY item while the folder tries to insert the USAGE_RECORD_ITEM.
+                    Requesting the object mutex semaphor doesn't work by the way. The object will just block.
+                    Maybe that's exactly happening with _wpAllocMem() here. Solution is not to use _wpAllocMem()
+                    at all in the image classes.
+
+                    Wondering what hidden problems/bugs will show upt in the future...
+                    */
+                  if((hbm=MMImage_cwmmQuerySmallBitmapHandle( (MMImage*) wpObject, ulIconSize, mrc, hwndCnr))!=NULLHANDLE)
+                    pBmpInfoHeader2=(PBITMAPINFOHEADER2)_wpQueryBitmapInfoHeader((MMImage*)wpObject);
+#ifdef DEBUG
+                  SysWriteToTrapLog("Queried HBITMAP: %x (line: %d)\n", hbm, __LINE__);
+#endif
+
+                } /* somIsA( , cwImageClass) */
+                else if(_somIsA(wpObject, cwBitmapClass)) {
+                  /* The default WPS bitmap class (WPBitmap) returns an PBITMAPHEADER. The CWBitmap class
+                     does return a PBITMAPHEADER2<-. */
+                  if((hbm=MMBitmap_cwmmQuerySmallBitmapHandle( (MMBitmap*) wpObject, ulIconSize))!=NULLHANDLE)
+                    pBmpInfoHeader2=(PBITMAPINFOHEADER2)_cwmmQueryBitmapInfoHeader((MMBitmap*)wpObject);
+                }
+
+                if(hbm)
+                  {
+                    /* We have the small bitmap */
+                    if(pBmpInfoHeader2) {
+                      ULONG ulWidth, ulHeight;
+                      ULONG ulIconWidth;
+                      ULONG ulFact;
+                      RECTL rcl=pOwnerItem->rclItem;
+
+                      if(pBmpInfoHeader2->cbFix==sizeof(BITMAPINFOHEADER2)) {
+                        ulWidth=pBmpInfoHeader2->cx;
+                        ulHeight=pBmpInfoHeader2->cy;
+                      }
+                      else {
+                        PBITMAPINFOHEADER pBmpInfoHeader=(PBITMAPINFOHEADER)pBmpInfoHeader2;
+                        ulWidth=pBmpInfoHeader->cx;
+                        ulHeight=pBmpInfoHeader->cy;
+                      }
+
+                      ulIconWidth=rcl.xRight-rcl.xLeft-4;
+                      ulFact=ulWidth>ulHeight ? ulWidth*1000/ulIconWidth : ulHeight*1000/ulIconWidth;
+                      ulWidth=ulWidth*1000/ulFact;
+                      ulHeight=ulHeight*1000/ulFact;
+                      cwAdjustIconRECTL(&rcl, ulIconWidth, ulWidth, ulHeight);
+                      /* And now draw the bitmap */
+#if 0
+                      if(pBmpInfoHeader2->cclrUsed==2) {
+                        WinDrawBitmap(pOwnerItem->hps, hbm, NULL, (PPOINTL)&rcl,//pOwnerItem->rclItem,
+                                      CLR_WHITE, CLR_BLACK, DBM_STRETCH /*| DBM_IMAGEATTRS*/);
+                      }
+                      else
+#endif
+                        WinDrawBitmap(pOwnerItem->hps, hbm, NULL, (PPOINTL)&rcl,//pOwnerItem->rclItem,
+                                      CLR_WHITE, CLR_BLACK, DBM_STRETCH /*| DBM_IMAGEATTRS*/);
+                    }
+
+                    /* Draw a small border around the image */
+                    cwDraw2ColorBorder(pOwnerItem->hps, &rclTemp, CLR_BLACK, CLR_DARKGRAY);
+                    /* Done */
+                    if(_somIsA(wpObject, cwImageClass)) {
+                       MMImage_cwmmFreeSmallBitmap((MMImage *)wpObject);
+                    }
+                    else {
+                       MMBitmap_cwmmFreeSmallBitmap((MMBitmap*)wpObject);
+                    }
+                    return (MRESULT) TRUE;
+                  }/* hbm */
+              }/* cwImageClass/cwBitmapClass */
+
+            /****************************************************/
+            /*** It's not an image class. Draw normal pointer ***/
+            /****************************************************/
+            if((ulIconSize=WinQuerySysValue(HWND_DESKTOP,SV_CXICON))!=0)
+              {
+                ULONG ulWidth=ulIconSize;
+                ULONG ulHeight=ulIconSize;
+                ULONG ulIconWidth;
+                RECTL rcl=pOwnerItem->rclItem;
+                ULONG ulMiniOrNormal=(flCnr & CV_MINI ? DP_MINI:DP_NORMAL);
+                BOOL fIsTemplate=_wpQueryStyle(wpObject) & OBJSTYLE_TEMPLATE;
+
+                ulIconWidth=rcl.xRight-rcl.xLeft-4;
+                /* Move the icon into the middle of the drawing area */
+                cwAdjustIconRECTL(&rcl, ulIconWidth, ulWidth, ulHeight);
+
+                /* Draw the template background if necessary */
+                if(fIsTemplate) {
+                  mfldrDrawTemplate(wpObject, &rcl, pOwnerItem->hps, flCnr);
+                  if(flCnr&CV_MINI)
+                    return (MRESULT) TRUE;
+                  ulMiniOrNormal=DP_MINI;
+                }
+
+                /* Check for folder because of animated icon */
+                if(pCnrDrawItemInfo->pRecord->flRecordAttr & CRA_INUSE)
+                  {
+                    SOMClass* wpFolderClass=queryWpFolderClass();
+
+                    if(somIsObj(wpFolderClass)) {
+                      if(_somIsA(wpObject, wpFolderClass)) {
+                        /* It's a folder */
+                        HPOINTER hptr;
+
+                        pOwnerItem->rclItem.xLeft=rcl.xLeft;
+                        pOwnerItem->rclItem.yBottom=rcl.yBottom;
+
+                        /* The following is only for Warp 4 but Warp 3 isn't supported anyway...*/
+                        hptr=_wpQueryIconN(wpObject,1);
+                        if(WinDrawPointer(pOwnerItem->hps, rcl.xLeft, rcl.yBottom, hptr, ulMiniOrNormal)) {
+                          cwDraw2ColorBorder(pOwnerItem->hps, &rclTemp, CLR_BLACK, CLR_DARKGRAY);
+                          return (MRESULT) TRUE;
+                        }
+
+                      }
+                    }/* if(somIsObj(wpFolderClass)) */
+                  }/* if(pCnrDrawItemInfo->pRecord->flRecordAttr & CRA_INUSE) */
+
+                if(WinDrawPointer(pOwnerItem->hps, rcl.xLeft, rcl.yBottom, mrc->hptrIcon, ulMiniOrNormal)) {
+                  cwDraw2ColorBorder(pOwnerItem->hps, &rclTemp, CLR_BLACK, CLR_DARKGRAY);
+                  return (MRESULT) TRUE;
+                }
+              }/* if((ulIconSize=WinQuerySysValue(HWND_DESKTOP,SV_CXICON))!=0) */
+
+            }/* somIsObj(wpObject)*/
+          }/* mrc */
+        }/* if(pOwnerItem->idItem==CMA_ICON) */
+        else if(pOwnerItem->idItem==0) {
+          /*************************/
+          /* It's the details view */
+          /*************************/
+          PCNRDRAWITEMINFO pCnrDrawItemInfo=(PCNRDRAWITEMINFO)pOwnerItem->hItem;
+
+          if(pCnrDrawItemInfo && pCnrDrawItemInfo->pFieldInfo->flData & CFA_BITMAPORICON) {
+            PMINIRECORDCORE mrc=(PMINIRECORDCORE)((PCNRDRAWITEMINFO)pOwnerItem->hItem)->pRecord;
+            if(mrc){
+              WPObject *wpObjToRefresh;
+              WPObject *wpObject;
+              ULONG ulIconSize=150;/* Default if query fails */
+              HWND hwndCnr=WinWindowFromID(hwnd, FID_CLIENT);
+              RECTL rclTemp=pOwnerItem->rclItem;
+
+              wpObjToRefresh=(WPObject*)OBJECT_FROM_PREC(mrc);//Get object
+              wpObject=somGetFileSystemObject(wpObjToRefresh);
+
+              /* Draw Background */
+              rclTemp.xLeft+=2;
+              rclTemp.xRight-=2;
+              rclTemp.yBottom+=2;
+              rclTemp.yTop-=2;
+
+              /* Check if record is selected and in use... */
+              if((pCnrDrawItemInfo->pRecord->flRecordAttr & CRA_INUSE)
+                 && (pCnrDrawItemInfo->pRecord->flRecordAttr & CRA_SELECTED)) {
+                POINTL pointl;
+
+                GpiSetPattern(pOwnerItem->hps,PATSYM_DIAG2);
+                pointl.x = rclTemp.xLeft;
+                pointl.y = rclTemp.yBottom;
+                GpiMove(pOwnerItem->hps, &pointl);
+                pointl.x = rclTemp.xRight - 1;
+                pointl.y = rclTemp.yTop - 1;
+                GpiSetColor(pOwnerItem->hps, CLR_BLACK);
+                GpiBox(pOwnerItem->hps,DRO_FILL,&pointl,1,1);
+
+              }
+              /* or only in use... */
+              else if(pCnrDrawItemInfo->pRecord->flRecordAttr & CRA_INUSE) {
+                POINTL pointl;
+
+                GpiSetPattern(pOwnerItem->hps,PATSYM_DIAG1);
+                pointl.x = rclTemp.xLeft;
+                pointl.y = rclTemp.yBottom;
+                GpiMove(pOwnerItem->hps, &pointl);
+                pointl.x = rclTemp.xRight - 1;
+                pointl.y = rclTemp.yTop - 1;
+                GpiSetColor(pOwnerItem->hps, CLR_BLACK);
+                GpiBox(pOwnerItem->hps,DRO_FILL,&pointl,1,1);
+              }
+              /* or only selected. */
+              else if(pCnrDrawItemInfo->pRecord->flRecordAttr & CRA_SELECTED)
+                WinFillRect(pOwnerItem->hps, &rclTemp, CLR_DARKGRAY);
+              else /* default is a white background */
+                WinFillRect(pOwnerItem->hps, &rclTemp, CLR_WHITE);
+
+              if(somIsObj(wpObject) && _wpIsObjectInitialized(wpObject)) {
+                SOMClass* cwBitmapClass=queryCWBitmapFileClass();
+                SOMClass* cwImageClass=queryCWImageFileClass();
+
+                if(somIsObj(cwImageClass)||somIsObj(cwBitmapClass)) {
+                  HBITMAP hbm=NULLHANDLE;
+                  PBITMAPINFOHEADER2 pBmpInfoHeader2;
+
+                  /* Query object pointer */
+                  if((hwndStore=WinWindowFromID(hwnd, STOREWINDOWID))!=NULLHANDLE)
+                    {
+                      somSelf=(MMFolder*) WinQueryWindowULong(hwndStore,QWL_USER);
+                      if(somIsObj(somSelf)) {
+                        MMFolderData *somThis = MMFolderGetData(somSelf);
+                        ulIconSize=_ulCurrentSize;
+                      }
+                    }
+                  /* Get the small bitmap from the object */
+                  if(_somIsA(wpObject, cwImageClass)) {
+                    hbm=MMImage_cwmmQuerySmallBitmapHandle( (MMImage*) wpObject, ulIconSize, mrc, hwndCnr);
+                    pBmpInfoHeader2=(PBITMAPINFOHEADER2)_wpQueryBitmapInfoHeader((MMImage*)wpObject);
+                  }
+                  else if(_somIsA(wpObject, cwBitmapClass)) {
+                    hbm=MMBitmap_cwmmQuerySmallBitmapHandle( (MMBitmap*) wpObject, ulIconSize);
+                    pBmpInfoHeader2=(PBITMAPINFOHEADER2)_cwmmQueryBitmapInfoHeader((MMBitmap*)wpObject);
+                  }
+                  if(hbm)
+                    {
+                      /* We got a small bitmap for display */
+                      if(pBmpInfoHeader2) {
+                        ULONG ulWidth, ulHeight;
+                        ULONG ulIconHeight, ulIconWidth; /* size of drawing area on screen */
+                        ULONG ulFact;
+                        RECTL rcl=pOwnerItem->rclItem;
+
+                        /* Get size of bitmap */
+                        if(pBmpInfoHeader2->cbFix==sizeof(BITMAPINFOHEADER2)) {
+                          ulWidth=pBmpInfoHeader2->cx;
+                          ulHeight=pBmpInfoHeader2->cy;
+                        }
+                        else {
+                          /* The default WPS bitmap class returned PBITMAPINFOHEADER */
+                          PBITMAPINFOHEADER pBmpInfoHeader=(PBITMAPINFOHEADER)pBmpInfoHeader2;
+                          ulWidth=pBmpInfoHeader->cx;
+                          ulHeight=pBmpInfoHeader->cy;
+                        }
+
+                        /* Calculate size of drawing area */
+                        ulIconHeight=rcl.yTop-rcl.yBottom;
+                        ulIconWidth=rcl.xRight-rcl.xLeft;
+                        /* Calculate scaling factor for bitmap so aspect ratio is kept */
+                        ulFact=ulWidth>ulHeight ? ulWidth*1000/ulIconHeight : ulHeight*1000/ulIconHeight;
+                        ulWidth=ulWidth*1000/ulFact;
+                        ulHeight=ulHeight*1000/ulFact;
+                        /* Adjust x pos. Cx is greater than cy in details view. */
+                        if(ulIconWidth>ulWidth)
+                          rcl.xLeft+=(ulIconWidth-ulWidth)/2;
+                        else {
+                          ulWidth=ulIconWidth-2;
+                          rcl.xLeft+=(ulIconWidth-ulWidth)/2;
+                        }
+                        rcl.xRight=rcl.xLeft+ulWidth;
+                        /* Adjust y pos */
+                        if(ulIconHeight>ulHeight)
+                          rcl.yBottom+=(ulIconHeight-ulHeight)/2;
+                        else {
+                          ulHeight=ulIconHeight-2;
+                          rcl.yBottom+=(ulIconHeight-ulHeight)/2;
+                        }
+                        rcl.yTop=rcl.yBottom+ulHeight;///ulFact;
+                        /* And now draw the bitmap */
+                        WinDrawBitmap(pOwnerItem->hps, hbm, NULL, (PPOINTL)&rcl,//pOwnerItem->rclItem,
+                                      CLR_WHITE, CLR_BLACK, DBM_STRETCH /*|DBM_IMAGEATTRS*/);
+                      }
+                      if(_somIsA(wpObject, cwImageClass)) {
+                         MMImage_cwmmFreeSmallBitmap((MMImage *)wpObject);
+                      }
+                      else {
+                         MMBitmap_cwmmFreeSmallBitmap((MMBitmap*)wpObject);
+                      }
+                      return (MRESULT) TRUE;
+                    }/* hbm */
+                }/* cwImageClass */
+              }/* wpObject*/
+              /* It's not an image class. Draw normal pointer */
+              break;
+            }/*  if(mrc) */
+          }/* if(pCnrDrawItemInfo && pCnrDrawItemInfo->pFieldInfo->flData & CFA_BITMAPORICON) */
+        }/* Details view */
+        break;
+      }
+#if 0
+    case WM_CONTROL:
+      if(SHORT2FROMMP(mp1)==CN_INITDRAG)
+        {
+          PCNRDRAGINIT pcnrInit=PVOIDFROMMP(mp2);
+          pcnrInit->cx=-20;
+          pcnrInit->cy=-20;
+          //          if( pcnrInit->pRecord->cb==sizeof(MINIRECORDCORE))
+          //          pcnrInit->cx+=75;
+          // pcnrInit->cy+=75;
+          //DosBeep(5000, 100);
+        }
+      break;
+
+    case WM_CONTROL:
+      if(SHORT2FROMMP(mp1)==CN_DRAGOVER)
+        {
+          PCNRDRAGINFO pcnrDragInfo=PVOIDFROMMP(mp2);
+
+          DrgSetDragInfo(pcnrDragInfo->pDragInfo, pdimage, 1, NULLHANDLE);
+          //          if( pcnrInit->pRecord->cb==sizeof(MINIRECORDCORE))
+          //          pcnrInit->cx+=75;
+          // pcnrInit->cy+=75;
+          DosBeep(5000, 20);
+        }
+      break;
+#endif
+    case WM_INITMENU:
+      if((hwndStore=WinWindowFromID(hwnd, STOREWINDOWID))!=NULLHANDLE)
+        {
+          somSelf=(MMFolder*) WinQueryWindowULong(hwndStore,QWL_USER);
+          if(somIsObj(somSelf)) {
+            MMFolderData *somThis = MMFolderGetData(somSelf);
+            switch(_usLastSelMenuItem)
+              {
+              case 0x2d1:/* view menu */
+                {
+                  char text[CCHMAXPATH];
+                  MENUITEM mi;
+                  HWND hwndMenu;
+                  CNRINFO cnrInfo;
+
+                  /* Insert size menu only in icon view */
+                  if(WinSendMsg(WinWindowFromID(hwnd, FID_CLIENT),CM_QUERYCNRINFO, MPFROMP(&cnrInfo),
+                                MPFROMSHORT(sizeof(cnrInfo)))) {
+
+                    if((cnrInfo.flWindowAttr & CV_ICON) && !(cnrInfo.flWindowAttr & CV_TREE)) {
+                      /* insert separator */
+                      menuInsertMenuSeparator( HWNDFROMMP(mp2), NULLHANDLE, MIT_END);
+
+                      /* Load the menu from the resource */
+                      hwndMenu=WinLoadMenu(hwnd,queryResModuleHandle(), ID_MENUICONSIZE);
+
+                      /* Fill the MENUITEM structure */
+                      mi.iPosition=MIT_END;
+                      mi.afStyle=MIS_TEXT|MIS_SUBMENU;
+                      mi.id=ID_MENUICONSIZE;
+                      mi.afAttribute=NULLHANDLE;
+                      mi.hwndSubMenu=hwndMenu;
+                      mi.hItem=NULLHANDLE;
+                      if(!getMessage(text, IDSTR_ICONSIZEMENU, sizeof(text), queryResModuleHandle(), hwnd))
+                        strcpy(text, "Icon ~size");;
+                      menuInsertMenuItem(HWNDFROMMP(mp2), hwndMenu, MIT_END, ID_MENUICONSIZE, text);
+
+                      /* check current menuitem */
+                      switch(_ulCurrentSize)
+                        {
+                        case 0:
+                          WinCheckMenuItem(hwndMenu, ID_NORMALICONSITEM, TRUE);
+                          break;
+                        case 50:
+                          WinCheckMenuItem(hwndMenu, ID_50X50ITEM, TRUE);
+                          break;
+                        case 100:
+                          WinCheckMenuItem(hwndMenu, ID_100X100ITEM, TRUE);
+                          break;
+                        case 150:
+                          WinCheckMenuItem(hwndMenu, ID_150X150ITEM, TRUE);
+                          break;
+                        case 200:
+                          WinCheckMenuItem(hwndMenu, ID_200X200ITEM, TRUE);
+                          break;
+                        case 250:
+                          WinCheckMenuItem(hwndMenu, ID_250X250ITEM, TRUE);
+                          break;
+                        default:
+                          break;
+                        }
+                    }
+                  }/* if() */
+                  break;
+                }/* case 0x2d1 */
+              default:
+                break;
+              }
+          }
+        }
+      break;
+    case WM_MENUSELECT:
+      if((hwndStore=WinWindowFromID(hwnd, STOREWINDOWID))!=NULLHANDLE)
+        {
+          somSelf=(MMFolder*) WinQueryWindowULong(hwndStore,QWL_USER);
+          if(somIsObj(somSelf)) {
+            MMFolderData *somThis = MMFolderGetData(somSelf);
+            _usLastSelMenuItem=SHORT1FROMMP(mp1);
+          }
+        }
+      break;
+    default:
+      break;
+    }
+  /* Any other message is handled by the folder container procedure */
+  if((hwndStore=WinWindowFromID(hwnd, STOREWINDOWID))!=NULLHANDLE)
+    {
+      somSelf=(MMFolder*) WinQueryWindowULong(hwndStore,QWL_USER);
+      if(somIsObj(somSelf)) {
+        MMFolderData *somThis = MMFolderGetData(somSelf);
+        if(_oldFrameProc)
+          return _oldFrameProc(hwnd, msg, mp1, mp2);
+      }
+    }
+
+  return WinDefWindowProc(hwnd, msg, mp1, mp2);
+}
+
+/*
+ *	wpSetupOnce :override;
+ */
+
+SOM_Scope HWND  SOMLINK mmfldr_wpOpen(MMFolder *somSelf, HWND hwndCnr,
+                                      ULONG ulView, ULONG param)
+{
+  HWND hwnd;
+
+  MMFolderData *somThis = MMFolderGetData(somSelf);
+    MMFolderMethodDebug("MMFolder","mmfldr_wpOpen");
+
+    hwnd=(MMFolder_parent_WPFolder_wpOpen(somSelf, hwndCnr,
+                                            ulView, param));
+
+    /* Only subclass folder frames, not settings notebooks */
+    if(ulView!=OPEN_SETTINGS){
+      HWND hwndStore;
+
+      if((hwndStore=WinCreateWindow(hwnd, WC_STATIC, "objectStore", 0, 0,0,0,0,
+                         hwnd, HWND_BOTTOM, STOREWINDOWID, NULLHANDLE, NULLHANDLE))!=NULLHANDLE)
+        {
+          HWND hwndContainer;
+
+          WinSetWindowULong(hwndStore, QWL_USER, (ULONG)somSelf);
+          _oldFrameProc=WinSubclassWindow(hwnd, mmFolderFrameProc);
+
+          if(hwnd)
+            {
+              CNRINFO cnrInfo;
+              HWND hwndContainer=WinWindowFromID(hwnd,FID_CLIENT);
+
+              /* Change the containerflags */
+              if(WinSendMsg(hwndContainer,CM_QUERYCNRINFO, MPFROMP(&cnrInfo),
+                            MPFROMSHORT(sizeof(cnrInfo))))
+                {
+                  if(cnrInfo.flWindowAttr & CV_ICON) {
+                    cnrInfo.slBitmapOrIcon.cx=_ulCurrentSize;
+                    cnrInfo.slBitmapOrIcon.cy=_ulCurrentSize;
+                    cnrInfo.flWindowAttr&=~CA_DRAWICON;
+                    cnrInfo.flWindowAttr|=CA_DRAWBITMAP|CA_OWNERDRAW;
+                    WinSendMsg(hwndContainer,CM_SETCNRINFO, MPFROMP(&cnrInfo),
+                               MPFROMLONG(CMA_SLBITMAPORICON|CMA_FLWINDOWATTR));
+                  }
+                }
+            }
+          /* Subclass container */
+          hwndContainer=WinWindowFromID(hwnd,FID_CLIENT);//Get container hwnd
+          if(hwndContainer) {
+            _oldContainerProc=WinSubclassWindow(hwndContainer, mmFolderContainerProc);
+          }
+        }
+    }
+    return hwnd;
+}
+
+#if 0
+SOM_Scope BOOL  SOMLINK mmfldr_wpSetupOnce(MMFolder *somSelf,
+                                           PSZ pszSetupString)
+{
+  BOOL rc;
+
+    MMFolderData *somThis = MMFolderGetData(somSelf);
+    MMFolderMethodDebug("MMFolder","mmfldr_wpSetupOnce");
+
+    rc=(MMFolder_parent_WPFolder_wpSetupOnce(somSelf, pszSetupString));
+
+    _ulCurrentSize=MMFLDR_DEFAULT_ICONSIZE;
+#if 0
+    if(_ulCurrentSize!=0 && _ulCurrentSize%50==0)
+      {
+        char setup[200];
+        sprintf(setup, "ICONGRIDSIZE=%d;", _ulCurrentSize+15);
+        _wpSetup(somSelf,setup);
+      }
+
+      _wpSetup(somSelf,"DETAILSCLASS=MMImage;ICONVIEW=GRIDDED;SORTCLASS=MMImage;");
+#endif
+    return rc;
+}
+#endif
+
+SOM_Scope BOOL  SOMLINK mmfldr_wpRestoreState(MMFolder *somSelf,
+                                              ULONG ulReserved)
+{
+    MMFolderData *somThis = MMFolderGetData(somSelf);
+    MMFolderMethodDebug("MMFolder","mmfldr_wpRestoreState");
+
+    /* Set default icon size */
+    if(!_wpRestoreLong(somSelf, "MMFolder", KEY_ICONSIZE, &_ulCurrentSize)) {
+      _ulCurrentSize=MMFLDR_DEFAULT_ICONSIZE;
+    }
+
+    return (MMFolder_parent_WPFolder_wpRestoreState(somSelf,
+                                                    ulReserved));
+}
+
+SOM_Scope BOOL  SOMLINK mmfldr_wpRestoreData(MMFolder *somSelf,
+                                             PSZ pszClass, ULONG ulKey,
+                                             PBYTE pValue, PULONG pcbValue)
+{
+  BOOL rc;
+    MMFolderData *somThis = MMFolderGetData(somSelf);
+    MMFolderMethodDebug("MMFolder","mmfldr_wpRestoreData");
+
+    rc= (MMFolder_parent_WPFolder_wpRestoreData(somSelf, pszClass,
+                                                   ulKey, pValue,
+                                                   pcbValue));
+    switch(ulKey)
+      {
+      case IDKEY_FDRGRIDINFO:  /* 2938 Warp 4 and above */
+        /* Get address in instance data for grid spacing */
+        {
+          if(!stricmp(pszClass, "WPFolder"))
+            {
+              if(!pcbValue || *pcbValue!=8L || !pValue) /* Sanity check */
+                break;
+              _pulGridSpacing=(ULONG*)pValue;
+            }
+          break;
+        }
+      case IDKEY_FDRLONGARRAY:     /* 2931 */
+        /* Get address in instance data for view */
+        {
+          if(!stricmp(pszClass, "WPFolder"))
+            {
+              if(!pcbValue || *pcbValue!=84L || !pValue) /* Sanity check */
+                break;
+              _pFldrLongArray=pValue;
+            }
+          break;
+        }
+      default:
+        break;
+      }
+    return rc;
+}
+
+SOM_Scope BOOL  SOMLINK mmfldr_wpSaveState(MMFolder *somSelf)
+{
+    MMFolderData *somThis = MMFolderGetData(somSelf);
+    MMFolderMethodDebug("MMFolder","mmfldr_wpSaveState");
+
+    _wpSaveLong( somSelf, "MMFolder", KEY_ICONSIZE, _ulCurrentSize);
+
+    return (MMFolder_parent_WPFolder_wpSaveState(somSelf));
+}
+
+
+SOM_Scope BOOL  SOMLINK mmfldr_wpSaveData(MMFolder *somSelf,
+                                          PSZ pszClass, ULONG ulKey,
+                                          PBYTE pValue, ULONG cbValue)
+{
+  PSZ psz;
+    MMFolderData *somThis = MMFolderGetData(somSelf);
+    MMFolderMethodDebug("MMFolder","mmfldr_wpSaveData");
+
+    /* When the template is created wpRestoreData() isn't called so we don't have
+       the address of the instance data containing grid spacing and view. So
+       we force the object to save the instance data and in wpSaveData we
+       finally get the right addresses to change the object view to gridded.
+       This change is done in wpObjectReady() where we called wpSaveImmediate(). */
+
+    /* If no ID result is NULL */
+    /*
+      @@CHANGE 0.2.8
+
+      Check ID for NULL to prevent crash in stricmp().
+     */
+    psz=_wpQueryObjectID(somSelf);
+    //  if(!stricmp(_wpQueryObjectID(somSelf), "<MMPM2_MMFOLDERTEMPLATE>"))
+    if(psz && !stricmp(psz, "<MMPM2_MMFOLDERTEMPLATE>"))
+      {
+        switch(ulKey)
+          {
+          case IDKEY_FDRGRIDINFO:  /* 2938 Warp 4 and above */
+            /* Get address in instance data for grid spacing */
+            {
+              if(!stricmp(pszClass, "WPFolder"))
+                {
+                  /* if address is already known do nothing */
+                  if(_pulGridSpacing || cbValue!=8L || !pValue) /* Sanity check */
+                    break;
+                  _pulGridSpacing=(ULONG*)pValue;
+                }
+              break;
+            }
+          case IDKEY_FDRLONGARRAY:     /* 2931 */
+            /* Get address in instance data for view */
+            {
+              if(!stricmp(pszClass, "WPFolder"))
+                {
+                  /* if address is already known do nothing */
+                  if(_pFldrLongArray || cbValue!=84L || !pValue) /* Sanity check */
+                    break;
+                  _pFldrLongArray=pValue;
+                  //DosBeep(500, 200);
+                }
+              break;
+            }
+          default:
+            break;
+          }
+      }
+
+    return (MMFolder_parent_WPFolder_wpSaveData(somSelf, pszClass,
+                                                ulKey, pValue,
+                                                cbValue));
+}
+
+SOM_Scope BOOL  SOMLINK mmfldr_wpMenuItemSelected(MMFolder *somSelf,
+                                                  HWND hwndFrame,
+                                                  ULONG ulMenuId)
+{
+  CNRINFO cnrInfo;
+
+    MMFolderData *somThis = MMFolderGetData(somSelf);
+    MMFolderMethodDebug("MMFolder","mmfldr_wpMenuItemSelected");
+
+    if(ulMenuId>=0xbc01 && ulMenuId <=0xbc06) {
+      HWND hwndContainer=WinWindowFromID(hwndFrame, FID_CLIENT);
+      /* Change the containerflags */
+      if(WinSendMsg(hwndContainer, CM_QUERYCNRINFO, MPFROMP(&cnrInfo),
+                    MPFROMSHORT(sizeof(cnrInfo))))
+        {
+          char text[200];
+          CNRINFO cnrInfo2=cnrInfo;
+
+          switch(ulMenuId)
+            {
+            case ID_50X50ITEM:
+              cnrInfo.slBitmapOrIcon.cx=50;
+              break;
+            case ID_100X100ITEM:
+              cnrInfo.slBitmapOrIcon.cx=100;
+              break;
+            case ID_150X150ITEM:
+              cnrInfo.slBitmapOrIcon.cx=150;
+              break;
+            case ID_200X200ITEM:
+              cnrInfo.slBitmapOrIcon.cx=200;
+              break;
+            case ID_250X250ITEM:
+              cnrInfo.slBitmapOrIcon.cx=250;
+              break;
+            default:
+              cnrInfo.slBitmapOrIcon.cx=0;
+              break;
+            }
+
+          _ulCurrentSize=cnrInfo.slBitmapOrIcon.cx;
+
+          sprintf(text, "ICONGRIDSIZE=%d",cnrInfo.slBitmapOrIcon.cx+20);
+          _wpSetup(somSelf, text);
+
+          cnrInfo.slBitmapOrIcon.cy=cnrInfo.slBitmapOrIcon.cx;
+          cnrInfo.flWindowAttr&=~CA_DRAWICON;
+          cnrInfo.flWindowAttr|=CA_DRAWBITMAP|CA_OWNERDRAW;
+
+          /* Prevent drawing in container */
+          WinEnableWindowUpdate(hwndContainer, FALSE);
+
+          cnrInfo2=cnrInfo;
+          cnrInfo2.flWindowAttr=CV_DETAIL;
+          WinSendMsg(hwndContainer,CM_SETCNRINFO, MPFROMP(&cnrInfo2),
+                     MPFROMLONG(CMA_FLWINDOWATTR));
+
+          WinSendMsg(hwndContainer,CM_SETCNRINFO, MPFROMP(&cnrInfo),
+                     MPFROMLONG(CMA_SLBITMAPORICON|CMA_FLWINDOWATTR));
+
+          /* Set gridsize. The address is gathered in wp_RestoreData */
+          if(_pulGridSpacing!=NULLHANDLE){
+            *(_pulGridSpacing++)=_ulCurrentSize+MMFLDR_SPACINGDELTA_X;
+            /* FIXME: Use fontsize */
+            *(_pulGridSpacing--)=_ulCurrentSize+MMFLDR_SPACINGDELTA_Y;
+          }
+
+          _wpSetup(somSelf, "MENUITEMSELECTED=716");/* Change to icon view */
+          _wpSetup(somSelf, "MENUITEMSELECTED=309");/* Arrange */
+
+          WinEnableWindowUpdate(hwndContainer, TRUE);
+          _wpSaveDeferred(somSelf);
+          return TRUE;
+        }
+    }/* if() */
+    return (MMFolder_parent_WPFolder_wpMenuItemSelected(somSelf,
+                                                        hwndFrame,
+                                                        ulMenuId));
+}
+
+
+/*
+ *wpSetup:override;
+ */
+SOM_Scope void  SOMLINK mmfldr_wpObjectReady(MMFolder *somSelf,
+                                             ULONG ulCode, WPObject* refObject)
+{
+    MMFolderData *somThis = MMFolderGetData(somSelf);
+    MMFolderMethodDebug("MMFolder","mmfldr_wpObjectReady");
+
+    MMFolder_parent_WPFolder_wpObjectReady(somSelf, ulCode, refObject);
+
+    switch(ulCode)
+      {
+      case OR_FROMTEMPLATE:
+      case OR_NEW:
+        {
+          PSZ psz;
+
+          /* Only after creation */
+#if 0
+          if(_ulCurrentSize!=0 && _ulCurrentSize%50==0)
+            {
+              char setup[200];
+              sprintf(setup, "ICONGRIDSIZE=%d;", _ulCurrentSize+15);
+              _wpSetup(somSelf,setup);
+            }
+#endif
+          /* Set default icon size */
+          if(!_ulCurrentSize || _ulCurrentSize%50!=0)
+            _ulCurrentSize=MMFLDR_DEFAULT_ICONSIZE;
+
+          /* If no ID result is NULL */
+          psz=_wpQueryObjectID(somSelf);
+          if(psz && !stricmp(psz, "<MMPM2_MMFOLDERTEMPLATE>")) {
+            /* When the template is created wpRestoreData() isn't called so we don't have
+               the address of the instance data containing grid spacing and view. So
+               we force the object to save the instance data and in wpSaveData we
+               finally get the right addresses to change the object view to gridded. */
+
+            _wpSaveImmediate(somSelf);
+            /* Set default view to gridded */
+
+            if(_pFldrLongArray!=NULLHANDLE) {
+              *_pFldrLongArray=0x80;
+              //DosBeep(100, 200);
+            }
+            /* Set gridsize. The address is gathered in wp_RestoreData */
+            if(_pulGridSpacing!=NULLHANDLE){
+              *(_pulGridSpacing++)=_ulCurrentSize+MMFLDR_SPACINGDELTA_X;
+              /* FIXME: Use fontsize */
+              *(_pulGridSpacing--)=_ulCurrentSize+MMFLDR_SPACINGDELTA_Y;
+            }
+
+          }
+          break;
+        }
+      default:
+        break;
+      }
+}
+
+SOM_Scope BOOL  SOMLINK mmfldr_wpSetup(MMFolder *somSelf, PSZ pszSetupString)
+{
+  char buffer[CCHMAXPATH];
+  ULONG bufferSize;
+
+    MMFolderData *somThis = MMFolderGetData(somSelf);
+    MMFolderMethodDebug("MMFolder","mmfldr_wpSetup");
+
+    bufferSize=sizeof(buffer);
+    if(_wpScanSetupString(somSelf, pszSetupString, SETUP_MMTHUMBSIZE, buffer, &bufferSize))
+      {
+        PVIEWITEM pViewItem;
+        int iSize=atoi(buffer);
+        ULONG ulMenuId;
+
+        switch(iSize)
+          {
+          case 0:
+            _ulCurrentSize=0;
+            ulMenuId=ID_NORMALICONSITEM;
+            break;
+          case 50:
+            _ulCurrentSize=50;
+            ulMenuId=ID_50X50ITEM;
+            break;
+          case 100:
+            _ulCurrentSize=100;
+            ulMenuId=ID_100X100ITEM;
+            break;
+          case 150:
+            _ulCurrentSize=150;
+            ulMenuId=ID_150X150ITEM;
+            break;
+          case 200:
+            _ulCurrentSize=200;
+            ulMenuId=ID_200X200ITEM;
+            break;
+          case 250:
+            _ulCurrentSize=250;
+            ulMenuId=ID_250X250ITEM;
+            break;
+          default:
+            break;
+          }
+        /* MENUITEMSELECTED=xxx would be easy but doesn't work to change the icons of the folder because there is no
+         hwndFrame in _wpMenuItemSelected() when sending it. So iterate over all views and call the menu
+         function. */
+        for(pViewItem=_wpFindViewItem(somSelf,VIEW_CONTENTS|VIEW_TREE|VIEW_DETAILS, NULLHANDLE);
+            pViewItem;
+            pViewItem=_wpFindViewItem(somSelf,VIEW_CONTENTS|VIEW_TREE|VIEW_DETAILS, pViewItem))
+          {
+            _wpMenuItemSelected(somSelf,
+                                pViewItem->handle,
+                                ulMenuId);
+          }
+      }
+    return (MMFolder_parent_WPFolder_wpSetup(somSelf, pszSetupString));
+}
+
+
+SOM_Scope BOOL  SOMLINK mmfldrM_wpclsCreateDefaultTemplates(M_MMFolder *somSelf,
+                                                            WPObject* Folder)
+{
+  char chrSetup[sizeof(MMFLDR_TEMPLATE_SETUP)+1];
+  WPFolder* wpFolder;
+
+
+  /* M_MMFolderData *somThis = M_MMFolderGetData(somSelf); */
+  M_MMFolderMethodDebug("M_MMFolder","mmfldrM_wpclsCreateDefaultTemplates");
+
+  if(WinQueryObject("<MMPM2_MMFOLDERTEMPLATE>"))
+    return TRUE; /* There's already a template */
+
+  sprintf(chrSetup, MMFLDR_TEMPLATE_SETUP);
+  wpFolder=_wpclsQueryFolder(somSelf, MMTEMPLATE_FOLDER_ID, FALSE);
+  _wpclsNew(somSelf, _wpclsQueryTitle(somSelf), chrSetup, wpFolder,FALSE);
+
+  return TRUE;
+}
+
+
+SOM_Scope PSZ  SOMLINK mmfldrM_wpclsQueryTitle(M_MMFolder *somSelf)
+{
+  static char chrTitle[20]={0};
+    /* M_MMFolderData *somThis = M_MMFolderGetData(somSelf); */
+    M_MMFolderMethodDebug("M_MMFolder","mmfldrM_wpclsQueryTitle");
+
+    if(chrTitle[0]==0)
+      if(!getMessage(chrTitle, IDSTR_LIGHTTABLETITLE, sizeof(chrTitle), queryResModuleHandle(), HWND_DESKTOP))
+        strcpy(chrTitle,"Light table");
+
+    return chrTitle;
+}
+
+
+SOM_Scope ULONG  SOMLINK mmfldrM_wpclsQueryIconData(M_MMFolder *somSelf,
+                                                    PICONINFO pIconInfo)
+{
+  HMODULE hmod;
+
+    /* M_MMFolderData *somThis = M_MMFolderGetData(somSelf); */
+    M_MMFolderMethodDebug("M_MMFolder","mmfldrM_wpclsQueryIconData");
+
+    hmod=queryModuleHandle();
+    if(!hmod)
+      return M_MMFolder_parent_M_WPFolder_wpclsQueryIconData(somSelf, pIconInfo);
+
+	if (pIconInfo)   {
+      pIconInfo->fFormat = ICON_RESOURCE;
+      pIconInfo->hmod    = hmod;
+      pIconInfo->resid   = ID_ICONLIGHTTABLE;
+	} /* endif */
+
+	return ( sizeof(ICONINFO) );
+}
+
+
+SOM_Scope ULONG  SOMLINK mmfldrM_wpclsQueryIconDataN(M_MMFolder *somSelf,
+                                                     ICONINFO* pIconInfo,
+                                                     ULONG ulIconIndex)
+{
+  HMODULE hmod;
+    /* M_MMFolderData *somThis = M_MMFolderGetData(somSelf); */
+    M_MMFolderMethodDebug("M_MMFolder","mmfldrM_wpclsQueryIconDataN");
+
+    hmod=queryModuleHandle();
+    if(!hmod)
+      return M_MMFolder_parent_M_WPFolder_wpclsQueryIconDataN(somSelf, pIconInfo, ulIconIndex);
+
+	if (pIconInfo)   {
+      pIconInfo->fFormat = ICON_RESOURCE;
+      pIconInfo->hmod    = hmod;
+      pIconInfo->resid   = ID_ICONLIGHTTABLE2;
+	} /* endif */
+
+	return ( sizeof(ICONINFO) );
+}
+
+
+SOM_Scope ULONG  SOMLINK mmfldrM_wpclsQueryDefaultView(M_MMFolder *somSelf)
+{
+    /* M_MMFolderData *somThis = M_MMFolderGetData(somSelf); */
+    M_MMFolderMethodDebug("M_MMFolder","mmfldrM_wpclsQueryDefaultView");
+
+    return VIEW_CONTENTS;
+}
+
Index: /tags/CWMM-0.3.0_GA/classes/c/c_video/cwavi.c
===================================================================
--- /tags/CWMM-0.3.0_GA/classes/c/c_video/cwavi.c	(revision 213)
+++ /tags/CWMM-0.3.0_GA/classes/c/c_video/cwavi.c	(revision 213)
@@ -0,0 +1,301 @@
+/*
+ * (C) Chris Wohlgemuth 2002-2004
+ *
+ */
+/*
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; see the file COPYING.  If not, write to
+ * the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+/*
+ * If you need another license for your project/product contact me at
+ * 
+ * http://www.os2world.com/cdwriting
+ * http://www.geocities.com/SiliconValley/Sector/5785/
+ */
+
+/*
+ *  This file was generated by the SOM Compiler and Emitter Framework.
+ *  Generated using: 
+ *      SOM Emitter emitctm: 2.42
+ */
+
+#ifndef SOM_Module_cwavi_Source
+#define SOM_Module_cwavi_Source
+#endif
+#define CWAVI_Class_Source
+#define M_CWAVI_Class_Source
+
+#define INCL_DOSFILEMGR
+#define INCL_DOSMISC
+#define INCL_PM
+#include <os2.h>
+#include <stdarg.h> 
+#include <stdio.h>
+#include "helpid.h"
+#include "cwavi.ih"
+
+extern char chrHelpLibrary[CCHMAXPATH];
+
+HMODULE queryResModuleHandle(void);
+HMODULE queryModuleHandle(void);
+BOOL getMessage(char* text,ULONG ulID, LONG lSizeText, HMODULE hResource,HWND hwnd);
+ULONG launchPMProg(PSZ pszTitle, PSZ wrapperExe, PSZ parameters,  CWMMDataFile *thisPtr, ULONG ulView);
+void writeLog(const char* chrFormat, ...);
+
+/*
+ * SOM_Scope HWND  SOMLINK cwavi_wpOpen(CWAVI *somSelf, HWND hwndCnr, 
+ *                                      ULONG ulView, ULONG param)
+ */
+
+/*
+ * The prototype for cwavi_wpOpen was replaced by the following prototype:
+ */
+SOM_Scope HWND  SOMLINK cwavi_wpOpen(MMAVI *somSelf, HWND hwndCnr, 
+                                     ULONG ulView, ULONG param)
+{
+    /* CWAVIData *somThis = CWAVIGetData(somSelf); */
+    MMAVIMethodDebug("MMAVI","cwavi_wpOpen");
+
+    switch(ulView)
+      {
+      case ID_MENU_START:
+      case ID_MENU_PLAYER:
+        /*case 0xbbe5:   Player */
+        {
+          char chrPlayer[CCHMAXPATH]={0};
+          char chrParams[(CCHMAXPATH*2)+2]="\"";
+          char chrTempParams[(CCHMAXPATH*2)+2]={0};
+          char chrTitle[50];
+	  char *chrPtr=chrParams;
+          ULONG ulSize;
+	  ULONG ulRc = 0;
+	  char szFullFilename[CCHMAXPATH]={0};
+	  BOOL ffplay=FALSE;
+	  BOOL found=FALSE;
+
+	  chrPtr++;
+          ulSize=sizeof(chrParams)-2;
+          _wpQueryRealName(somSelf, chrPtr, &ulSize, TRUE);
+          strcat(chrPtr,"\"");
+          strcpy(chrTempParams, chrParams);
+	  ulSize=PrfQueryProfileInt(HINI_USERPROFILE, "CWMM", "nomodvid", 0);
+	  if(ulSize && strstr(strlwr(chrTempParams), ".avi")) {
+            if(!PrfQueryProfileString(HINI_USERPROFILE, "CWMM", "aviplayer", NULLHANDLE, chrPlayer,
+				      sizeof(chrPlayer)))
+	      PrfQueryProfileString(HINI_USERPROFILE, "CWMM", "vb", "vb.exe", chrPlayer,
+				    sizeof(chrPlayer));
+	  }
+	  else {
+	    ULONG ulLength = PrfQueryProfileString(HINI_USERPROFILE, "CWMM", "mvidplayer", NULLHANDLE, chrPlayer,
+				  sizeof(chrPlayer));
+	    if((ulLength == 0) || (!strchr(chrPlayer, ":") && (!strstr(strlwr(chrPlayer), "smplayer") &&
+							       strstr(strlwr(chrPlayer), "mplayer")))) {
+	      char tempFilePath[CCHMAXPATH];
+	      char newPath[2048];
+	      char *path;
+
+	      //Prevent us from getting the mplayer.exe in the winos2 directory
+	      path=getenv("PATH");
+	      strcpy(newPath, path);
+	      chrPtr=strstr(strlwr(newPath), ":\\os2\\mdos\\winos2");
+	      if(chrPtr)
+		strcpy(chrPtr - 1, chrPtr + 18);
+	      path = strtok(newPath, ";");
+	      while(path != NULL) {
+		strcpy(tempFilePath, path);
+		strcat(tempFilePath, "\\mplayer.exe");
+		if(!DosQueryPathInfo(tempFilePath, FIL_STANDARD, (PVOID)szFullFilename, (ULONG)CCHMAXPATH-1)) {
+		  strcpy(chrPlayer, tempFilePath);
+		  found=TRUE;
+		  break;
+		}
+		path = strtok(NULL, ";");
+	      }
+	    }
+	    if(!ulLength && !found &&
+	       !DosSearchPath(SEARCH_IGNORENETERRS | SEARCH_ENVIRONMENT | SEARCH_CUR_DIRECTORY, "PATH",
+			      "smplayer.exe", (PBYTE) szFullFilename, CCHMAXPATH - 1)){
+	      found=TRUE;
+	      strcpy(chrPlayer, szFullFilename);
+	    }
+            if(!ulLength && !found &&
+               !DosSearchPath(SEARCH_IGNORENETERRS | SEARCH_ENVIRONMENT | SEARCH_CUR_DIRECTORY, "PATH",
+						     "ffplay.exe", (PBYTE) szFullFilename, CCHMAXPATH - 1)) {
+	      found=TRUE;
+	      strcpy(chrPlayer, szFullFilename);
+	    }
+	    if(!ulLength && !found)  {
+	      char text[300];
+	      sprintf(text, "No suitable video player could be found. Please install ffplay (part of ffmpeg)"\
+		      "or smplayer/mplayer somewhere in your path or in OS2.INI add the key mvidplayer"\
+		      "under CWMM application containing the full path to an appropriate video player");
+  
+	      WinMessageBox(HWND_DESKTOP, HWND_DESKTOP, text, "Missing video player",
+			    1234, MB_OK|MB_MOVEABLE);
+	      return NULLHANDLE;
+	   }
+	  }
+	  /* Eliminate the noise with mplayer and ffplay and get them to close gracefully*/
+	  if(strstr(strlwr(chrPlayer), "ffplay"))
+	    ffplay = TRUE;
+	  if((!strstr(strlwr(chrPlayer), "smplayer") && strstr(strlwr(chrPlayer), "mplayer")) || ffplay) {
+	    strcpy(chrTempParams, " /c \"");
+	    strcat(chrTempParams, chrPlayer);
+	    strcat(chrTempParams, " ");
+	    if(ffplay)
+	      strcat(chrTempParams, "-autoexit ");
+	    strcat(chrTempParams, chrParams);
+	    strcat(chrTempParams, "\"");
+	    strcpy(chrParams, chrTempParams);
+	    strcpy(chrPlayer, "CMD.EXE");
+	  }
+          /* Get the Title for the window list */
+          if(!getMessage(chrTitle, IDSTR_VIDPLAYERTITLE, sizeof(chrTitle), queryResModuleHandle(), HWND_DESKTOP))
+            strcpy(chrTitle, "Player");
+
+          if((ulRc=launchPMProg(chrTitle, chrPlayer, chrParams, somSelf, ulView))==NULLHANDLE) {
+	    break;
+          }
+	  return NULLHANDLE;
+        }
+      default:
+        break;
+      }
+    return (MMAVI_parent_MMVideo_wpOpen(somSelf, hwndCnr, ulView, param));
+}
+
+
+
+/*
+ * SOM_Scope PSZ  SOMLINK cwaviM_wpclsQueryTitle(M_CWAVI *somSelf)
+ */
+
+/*
+ * The prototype for cwaviM_wpclsQueryTitle was replaced by the following prototype:
+ */
+SOM_Scope PSZ  SOMLINK cwaviM_wpclsQueryTitle(M_MMAVI *somSelf)
+{
+  static char chrTitle[20]={0};
+    /* M_CWAVIData *somThis = M_CWAVIGetData(somSelf); */
+    M_MMAVIMethodDebug("M_MMAVI","cwaviM_wpclsQueryTitle");
+
+    if(chrTitle[0]==0)
+      if(!getMessage(chrTitle, IDSTR_AVITITLE, sizeof(chrTitle), queryResModuleHandle(), HWND_DESKTOP))
+        strcpy(chrTitle,"AVIVideo.AVI");
+    return chrTitle;
+}
+
+
+
+/*
+ * SOM_Scope PSZ  SOMLINK cwaviM_wpclsQueryInstanceType(M_CWAVI *somSelf)
+ */
+
+/*
+ * The prototype for cwaviM_wpclsQueryInstanceType was replaced by the following prototype:
+ */
+SOM_Scope PSZ  SOMLINK cwaviM_wpclsQueryInstanceType(M_MMAVI *somSelf)
+{
+    ULONG ulSize;
+
+    /* M_CWAVIData *somThis = M_CWAVIGetData(somSelf); */
+    M_MMAVIMethodDebug("M_MMAVI","cwaviM_wpclsQueryInstanceType");
+
+    ulSize = PrfQueryProfileInt(HINI_USERPROFILE, "CWMM", "nomodvid", 0);
+    if(ulSize)
+      return "AVI";
+    else
+    return "AVI/FLV/3GP/M4V/MKV/MOV/MP4/MPEG/MTS/VOB/WMV/WEBM";
+}
+
+
+/*
+ * SOM_Scope PSZ  SOMLINK cwaviM_wpclsQueryInstanceFilter(M_CWAVI *somSelf)
+ */
+
+/*
+ * The prototype for cwaviM_wpclsQueryInstanceFilter was replaced by the following prototype:
+ */
+SOM_Scope PSZ  SOMLINK cwaviM_wpclsQueryInstanceFilter(M_MMAVI *somSelf)
+{
+    ULONG ulSize;
+
+    /* M_CWAVIData *somThis = M_CWAVIGetData(somSelf); */
+    M_MMAVIMethodDebug("M_MMAVI","cwaviM_wpclsQueryInstanceFilter");
+
+    ulSize=PrfQueryProfileInt(HINI_USERPROFILE, "CWMM", "nomodvid", 0);
+    if(ulSize)
+      return "*.AVI";
+    else
+      return "*.AVI,*.FLI,*.FLC,*.FLV,*.3GP,*.M4V,*.MKV,*.MOV,*.MP4,*.MPEG,*.MTS,*.VOB,*.WMV,*.WEBM";
+}
+
+
+/*
+ * SOM_Scope ULONG  SOMLINK cwaviM_wpclsQueryIconData(M_CWAVI *somSelf, 
+ *                                                    PICONINFO pIconInfo)
+ */
+
+/*
+ * The prototype for cwaviM_wpclsQueryIconData was replaced by the following prototype:
+ */
+SOM_Scope ULONG  SOMLINK cwaviM_wpclsQueryIconData(M_MMAVI *somSelf, 
+                                                   PICONINFO pIconInfo)
+{
+  HMODULE hmod;
+    /* M_CWAVIData *somThis = M_CWAVIGetData(somSelf); */
+    M_MMAVIMethodDebug("M_MMAVI","cwaviM_wpclsQueryIconData");
+
+    hmod=queryModuleHandle();
+    if(!hmod)
+      return M_MMAVI_parent_M_MMVideo_wpclsQueryIconData(somSelf, pIconInfo);
+
+    if(pIconInfo)   {
+      ULONG ulSize=PrfQueryProfileInt(HINI_USERPROFILE, "CWMM", "nomodvid", 0);
+      pIconInfo->fFormat = ICON_RESOURCE;
+      pIconInfo->hmod    = hmod;
+      if(ulSize)
+	pIconInfo->resid   = ID_ICONAVIFILE;
+      else
+	pIconInfo->resid   = ID_ICONCWVIDEOFILE;
+    } /* endif */
+
+	return ( sizeof(ICONINFO) );
+}
+
+
+
+/*
+ * SOM_Scope BOOL  SOMLINK cwaviM_wpclsQueryDefaultHelp(M_CWAVI *somSelf, 
+ *                                                      PULONG pHelpPanelId, 
+ *                                                      PSZ pszHelpLibrary)
+ */
+
+/*
+ * The prototype for cwaviM_wpclsQueryDefaultHelp was replaced by the following prototype:
+ */
+SOM_Scope BOOL  SOMLINK cwaviM_wpclsQueryDefaultHelp(M_MMAVI *somSelf, 
+                                                     PULONG pHelpPanelId, 
+                                                     PSZ pszHelpLibrary)
+{
+    /* M_CWAVIData *somThis = M_CWAVIGetData(somSelf); */
+    M_MMAVIMethodDebug("M_MMAVI","cwaviM_wpclsQueryDefaultHelp");
+
+    if(pHelpPanelId)
+      *pHelpPanelId=AVIFILE_HELP_PANEL;
+    if(pszHelpLibrary)
+      strncpy(pszHelpLibrary, chrHelpLibrary, CCHMAXPATH);
+    return TRUE; 
+}
+
Index: /tags/CWMM-0.3.0_GA/classes/c/c_video/cwfli.c
===================================================================
--- /tags/CWMM-0.3.0_GA/classes/c/c_video/cwfli.c	(revision 213)
+++ /tags/CWMM-0.3.0_GA/classes/c/c_video/cwfli.c	(revision 213)
@@ -0,0 +1,154 @@
+/*
+ * (C) Chris Wohlgemuth 2002-2004
+ *
+ */
+/*
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; see the file COPYING.  If not, write to
+ * the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+/*
+ * If you need another license for your project/product contact me at
+ * 
+ * http://www.os2world.com/cdwriting
+ * http://www.geocities.com/SiliconValley/Sector/5785/
+ */
+
+/*
+ *  This file was generated by the SOM Compiler and Emitter Framework.
+ *  Generated using: 
+ *      SOM Emitter emitctm: 2.42
+ */
+
+#ifndef SOM_Module_cwfli_Source
+#define SOM_Module_cwfli_Source
+#endif
+#define CWFLI_Class_Source
+#define M_CWFLI_Class_Source
+
+#include <os2.h>
+#include "helpid.h"
+#include "cwfli.ih"
+
+extern char chrHelpLibrary[CCHMAXPATH];
+
+HMODULE queryResModuleHandle(void);
+HMODULE queryModuleHandle(void);
+BOOL getMessage(char* text,ULONG ulID, LONG lSizeText, HMODULE hResource,HWND hwnd);
+
+
+/*
+ * SOM_Scope PSZ  SOMLINK cwfliM_wpclsQueryTitle(M_CWFLI *somSelf)
+ */
+
+/*
+ * The prototype for cwfliM_wpclsQueryTitle was replaced by the following prototype:
+ */
+SOM_Scope PSZ  SOMLINK cwfliM_wpclsQueryTitle(M_MMFLI *somSelf)
+{
+  static char chrTitle[20]={0};
+    /* M_CWFLIData *somThis = M_CWFLIGetData(somSelf); */
+    M_MMFLIMethodDebug("M_MMFLI","cwfliM_wpclsQueryTitle");
+
+    if(chrTitle[0]==0)
+      if(!getMessage(chrTitle, IDSTR_FLITITLE, sizeof(chrTitle), queryResModuleHandle(), HWND_DESKTOP))
+        strcpy(chrTitle,"FLIVideo.FLI");
+    return chrTitle;
+}
+
+
+/*
+ * SOM_Scope PSZ  SOMLINK cwfliM_wpclsQueryInstanceType(M_CWFLI *somSelf)
+ */
+
+/*
+ * The prototype for cwfliM_wpclsQueryInstanceType was replaced by the following prototype:
+ */
+SOM_Scope PSZ  SOMLINK cwfliM_wpclsQueryInstanceType(M_MMFLI *somSelf)
+{
+    /* M_CWFLIData *somThis = M_CWFLIGetData(somSelf); */
+    M_MMFLIMethodDebug("M_MMFLI","cwfliM_wpclsQueryInstanceType");
+
+    return  "FLC/FLI";
+}
+
+
+/*
+ * SOM_Scope PSZ  SOMLINK cwfliM_wpclsQueryInstanceFilter(M_CWFLI *somSelf)
+ */
+
+/*
+ * The prototype for cwfliM_wpclsQueryInstanceFilter was replaced by the following prototype:
+ */
+SOM_Scope PSZ  SOMLINK cwfliM_wpclsQueryInstanceFilter(M_MMFLI *somSelf)
+{
+    /* M_CWFLIData *somThis = M_CWFLIGetData(somSelf); */
+    M_MMFLIMethodDebug("M_MMFLI","cwfliM_wpclsQueryInstanceFilter");
+
+    return "*.FLI,*.FLC"; /* FLI: MM-Config, to be removed!! */
+}
+
+
+/*
+ * SOM_Scope ULONG  SOMLINK cwfliM_wpclsQueryIconData(M_CWFLI *somSelf, 
+ *                                                    PICONINFO pIconInfo)
+ */
+
+/*
+ * The prototype for cwfliM_wpclsQueryIconData was replaced by the following prototype:
+ */
+SOM_Scope ULONG  SOMLINK cwfliM_wpclsQueryIconData(M_MMFLI *somSelf, 
+                                                   PICONINFO pIconInfo)
+{
+  HMODULE hmod;
+    /* M_CWFLIData *somThis = M_CWFLIGetData(somSelf); */
+    M_MMFLIMethodDebug("M_MMFLI","cwfliM_wpclsQueryIconData");
+
+    hmod=queryModuleHandle();
+    if(!hmod)
+      return M_MMFLI_parent_M_MMVideo_wpclsQueryIconData(somSelf, pIconInfo);
+
+	if (pIconInfo)   {
+      pIconInfo->fFormat = ICON_RESOURCE;
+      pIconInfo->hmod    = hmod;
+      pIconInfo->resid   = ID_ICONMOVFILE;
+	} /* endif */
+
+	return ( sizeof(ICONINFO) );
+}
+
+
+
+/*
+ * SOM_Scope BOOL  SOMLINK cwfliM_wpclsQueryDefaultHelp(M_CWFLI *somSelf, 
+ *                                                      PULONG pHelpPanelId, 
+ *                                                      PSZ pszHelpLibrary)
+ */
+
+/*
+ * The prototype for cwfliM_wpclsQueryDefaultHelp was replaced by the following prototype:
+ */
+SOM_Scope BOOL  SOMLINK cwfliM_wpclsQueryDefaultHelp(M_MMFLI *somSelf, 
+                                                     PULONG pHelpPanelId, 
+                                                     PSZ pszHelpLibrary)
+{
+    /* M_CWFLIData *somThis = M_CWFLIGetData(somSelf); */
+    M_MMFLIMethodDebug("M_MMFLI","cwfliM_wpclsQueryDefaultHelp");
+
+    if(pHelpPanelId)
+      *pHelpPanelId=FLIFILE_HELP_PANEL;
+    if(pszHelpLibrary)
+      strncpy(pszHelpLibrary, chrHelpLibrary, CCHMAXPATH);
+    return TRUE; 
+}
+
Index: /tags/CWMM-0.3.0_GA/classes/c/c_video/cwmov.c
===================================================================
--- /tags/CWMM-0.3.0_GA/classes/c/c_video/cwmov.c	(revision 213)
+++ /tags/CWMM-0.3.0_GA/classes/c/c_video/cwmov.c	(revision 213)
@@ -0,0 +1,158 @@
+/*
+ * (C) Chris Wohlgemuth 2002-2004
+ *
+ */
+/*
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; see the file COPYING.  If not, write to
+ * the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+/*
+ * If you need another license for your project/product contact me at
+ * 
+ * http://www.os2world.com/cdwriting
+ * http://www.geocities.com/SiliconValley/Sector/5785/
+ */
+
+/*
+ *  This file was generated by the SOM Compiler and Emitter Framework.
+ *  Generated using: 
+ *      SOM Emitter emitctm: 2.42
+ */
+
+#ifndef SOM_Module_cwmov_Source
+#define SOM_Module_cwmov_Source
+#endif
+#define CWMOV_Class_Source
+#define M_CWMOV_Class_Source
+
+#include <os2.h>
+#include "helpid.h"
+#include "cwmov.ih"
+
+extern char chrHelpLibrary[CCHMAXPATH];
+
+HMODULE queryResModuleHandle(void);
+HMODULE queryModuleHandle(void);
+BOOL getMessage(char* text,ULONG ulID, LONG lSizeText, HMODULE hResource,HWND hwnd);
+
+
+/*
+ * SOM_Scope PSZ  SOMLINK cwmovM_wpclsQueryTitle(M_CWMOV *somSelf)
+ */
+
+/*
+ * The prototype for cwmovM_wpclsQueryTitle was replaced by the following prototype:
+ */
+SOM_Scope PSZ  SOMLINK cwmovM_wpclsQueryTitle(M_MMMOV *somSelf)
+{
+  static char chrTitle[20]={0};
+    /* M_CWMOVData *somThis = M_CWMOVGetData(somSelf); */
+    M_MMMOVMethodDebug("M_MMMOV","cwmovM_wpclsQueryTitle");
+
+    if(chrTitle[0]==0)
+      if(!getMessage(chrTitle, IDSTR_MOVTITLE, sizeof(chrTitle), queryResModuleHandle(), HWND_DESKTOP))
+        strcpy(chrTitle,"MOVVideo.MOV");
+    return chrTitle;
+}
+
+
+/*
+ * SOM_Scope PSZ  SOMLINK cwmovM_wpclsQueryInstanceType(M_CWMOV *somSelf)
+ */
+
+/*
+ * The prototype for cwmovM_wpclsQueryInstanceType was replaced by the following prototype:
+ */
+SOM_Scope PSZ  SOMLINK cwmovM_wpclsQueryInstanceType(M_MMMOV *somSelf)
+{
+    /* M_CWMOVData *somThis = M_CWMOVGetData(somSelf); */
+    M_MMMOVMethodDebug("M_MMMOV","cwmovM_wpclsQueryInstanceType");
+
+    return "QuickTime Movie";
+}
+
+
+/*
+ * SOM_Scope PSZ  SOMLINK cwmovM_wpclsQueryInstanceFilter(M_CWMOV *somSelf)
+ */
+
+/*
+ * The prototype for cwmovM_wpclsQueryInstanceFilter was replaced by the following prototype:
+ */
+SOM_Scope PSZ  SOMLINK cwmovM_wpclsQueryInstanceFilter(M_MMMOV *somSelf)
+{
+    ULONG ulSize;
+    /* M_CWMOVData *somThis = M_CWMOVGetData(somSelf); */
+    M_MMMOVMethodDebug("M_MMMOV","cwmovM_wpclsQueryInstanceFilter");
+
+    ulSize = PrfQueryProfileInt(HINI_USERPROFILE, "CWMM", "nomodvid", 0);
+    if(ulSize)
+      return "*.MOV,*.QT";
+    else
+      return "*.QT";
+}
+
+
+/*
+ * SOM_Scope ULONG  SOMLINK cwmovM_wpclsQueryIconData(M_CWMOV *somSelf, 
+ *                                                    PICONINFO pIconInfo)
+ */
+
+/*
+ * The prototype for cwmovM_wpclsQueryIconData was replaced by the following prototype:
+ */
+SOM_Scope ULONG  SOMLINK cwmovM_wpclsQueryIconData(M_MMMOV *somSelf, 
+                                                   PICONINFO pIconInfo)
+{
+  HMODULE hmod;
+    /* M_CWMOVData *somThis = M_CWMOVGetData(somSelf); */
+    M_MMMOVMethodDebug("M_MMMOV","cwmovM_wpclsQueryIconData");
+
+    hmod=queryModuleHandle();
+    if(!hmod)
+      return M_MMMOV_parent_M_MMVideo_wpclsQueryIconData(somSelf, pIconInfo);
+
+	if (pIconInfo)   {
+      pIconInfo->fFormat = ICON_RESOURCE;
+      pIconInfo->hmod    = hmod;
+      pIconInfo->resid   = ID_ICONMOVFILE;
+	} /* endif */
+
+	return ( sizeof(ICONINFO) );
+}
+
+
+/*
+ * SOM_Scope BOOL  SOMLINK cwmovM_wpclsQueryDefaultHelp(M_CWMOV *somSelf, 
+ *                                                      PULONG pHelpPanelId, 
+ *                                                      PSZ pszHelpLibrary)
+ */
+
+/*
+ * The prototype for cwmovM_wpclsQueryDefaultHelp was replaced by the following prototype:
+ */
+SOM_Scope BOOL  SOMLINK cwmovM_wpclsQueryDefaultHelp(M_MMMOV *somSelf, 
+                                                     PULONG pHelpPanelId, 
+                                                     PSZ pszHelpLibrary)
+{
+    /* M_CWMOVData *somThis = M_CWMOVGetData(somSelf); */
+    M_MMMOVMethodDebug("M_MMMOV","cwmovM_wpclsQueryDefaultHelp");
+
+    if(pHelpPanelId)
+      *pHelpPanelId=MOVFILE_HELP_PANEL;
+    if(pszHelpLibrary)
+      strncpy(pszHelpLibrary, chrHelpLibrary, CCHMAXPATH);
+    return TRUE; 
+}
+
Index: /tags/CWMM-0.3.0_GA/classes/c/c_video/cwmpg.c
===================================================================
--- /tags/CWMM-0.3.0_GA/classes/c/c_video/cwmpg.c	(revision 213)
+++ /tags/CWMM-0.3.0_GA/classes/c/c_video/cwmpg.c	(revision 213)
@@ -0,0 +1,264 @@
+/*
+ * (C) Chris Wohlgemuth 2002-2005
+ *
+ */
+/*
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; see the file COPYING.  If not, write to
+ * the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+/*
+ * If you need another license for your project/product contact me at
+ * 
+ * http://www.os2world.com/cdwriting
+ * http://www.geocities.com/SiliconValley/Sector/5785/
+ */
+
+/*
+ *  This file was generated by the SOM Compiler and Emitter Framework.
+ *  Generated using: 
+ *      SOM Emitter emitctm: 2.42
+ */
+
+#ifndef SOM_Module_cwmpg_Source
+#define SOM_Module_cwmpg_Source
+#endif
+#define CWMPG_Class_Source
+#define M_CWMPG_Class_Source
+
+#define INCL_PM
+#include <os2.h>
+#include "helpid.h"
+#include "cwmpg.ih"
+#include "cwaudioinc.h" /* For REXX script name */
+#include "sys_funcs.h"
+
+extern char chrHelpLibrary[CCHMAXPATH];
+char chrMMMPGExt[400]={0};/* Array holding the extensions for wpclsQueryInstanceFilter() */
+
+HMODULE queryResModuleHandle(void);
+HMODULE queryModuleHandle(void);
+BOOL getMessage(char* text,ULONG ulID, LONG lSizeText, HMODULE hResource,HWND hwnd);
+ULONG launchPMProg(PSZ pszTitle, PSZ wrapperExe, PSZ parameters,  CWMMDataFile *thisPtr, ULONG ulView);
+BOOL getStringFromRexxScript(PSZ rexxFile, char* chrResult, ULONG ulSize);
+
+/*
+ * SOM_Scope HWND  SOMLINK cwmpg_wpOpen(CWMPG *somSelf, HWND hwndCnr, 
+ *                                      ULONG ulView, ULONG param)
+ */
+
+/*
+ * The prototype for cwmpg_wpOpen was replaced by the following prototype:
+ */
+SOM_Scope HWND  SOMLINK cwmpg_wpOpen(MMMPG *somSelf, HWND hwndCnr, 
+                                     ULONG ulView, ULONG param)
+{
+    /* CWMPGData *somThis = CWMPGGetData(somSelf); */
+    MMMPGMethodDebug("MMMPG","cwmpg_wpOpen");
+
+    switch(ulView)
+      {
+      case ID_MENU_START:
+      case ID_MENU_PLAYER:
+        /*case 0xbbe5:   Player */
+        {
+          char chrPlayer[CCHMAXPATH]={0};
+          char chrParams[CCHMAXPATH+2]="\"";
+          char chrTitle[50];
+          char *chrPtr=chrParams;
+          ULONG ulSize;
+          ULONG ulRc;
+          
+          if(!PrfQueryProfileString(HINI_USERPROFILE, "CWMM", "mpgplayer", NULLHANDLE, chrPlayer,
+                                    sizeof(chrPlayer)))
+            PrfQueryProfileString(HINI_USERPROFILE, "CWMM", "vb", "vb.exe", chrPlayer,
+                                  sizeof(chrPlayer));
+          
+          chrPtr++;
+          ulSize=sizeof(chrParams)-2;
+          _wpQueryRealName(somSelf, chrPtr, &ulSize, TRUE);
+          strcat(chrPtr,"\"");
+
+          /* Get the Title for the window list */
+          if(!getMessage(chrTitle, IDSTR_VIDPLAYERTITLE, sizeof(chrTitle), queryResModuleHandle(), HWND_DESKTOP))
+            strcpy(chrTitle, "Player");
+
+          if((ulRc=launchPMProg(chrTitle, chrPlayer, chrParams, somSelf, ulView))==NULLHANDLE) {
+            break;
+          }
+          return NULLHANDLE;
+        }
+      default:
+        break;
+      }
+
+    return (MMMPG_parent_MMVideo_wpOpen(somSelf, hwndCnr, ulView, 
+                                        param));
+}
+
+
+
+/*
+ * SOM_Scope PSZ  SOMLINK cwmpgM_wpclsQueryTitle(M_CWMPG *somSelf)
+ */
+
+/*
+ * The prototype for cwmpgM_wpclsQueryTitle was replaced by the following prototype:
+ */
+SOM_Scope PSZ  SOMLINK cwmpgM_wpclsQueryTitle(M_MMMPG *somSelf)
+{
+  static char chrTitle[20]={0};
+    /* M_CWMPGData *somThis = M_CWMPGGetData(somSelf); */
+    M_MMMPGMethodDebug("M_MMMPG","cwmpgM_wpclsQueryTitle");
+
+    if(chrTitle[0]==0)
+      if(!getMessage(chrTitle, IDSTR_MPGTITLE, sizeof(chrTitle), queryResModuleHandle(), HWND_DESKTOP))
+        strcpy(chrTitle,"MPGVideo.MPG");
+
+    return chrTitle;
+}
+
+
+/*
+ * SOM_Scope PSZ  SOMLINK cwmpgM_wpclsQueryInstanceType(M_CWMPG *somSelf)
+ */
+
+/*
+ * The prototype for cwmpgM_wpclsQueryInstanceType was replaced by the following prototype:
+ */
+SOM_Scope PSZ  SOMLINK cwmpgM_wpclsQueryInstanceType(M_MMMPG *somSelf)
+{
+    /* M_CWMPGData *somThis = M_CWMPGGetData(somSelf); */
+    M_MMMPGMethodDebug("M_MMMPG","cwmpgM_wpclsQueryInstanceType");
+
+    return "MPEG";
+}
+
+
+/*
+ * SOM_Scope PSZ  SOMLINK cwmpgM_wpclsQueryInstanceFilter(M_CWMPG *somSelf)
+ */
+
+/*
+ * The prototype for cwmpgM_wpclsQueryInstanceFilter was replaced by the following prototype:
+ */
+SOM_Scope PSZ  SOMLINK cwmpgM_wpclsQueryInstanceFilter(M_MMMPG *somSelf)
+{
+    /* M_CWMPGData *somThis = M_CWMPGGetData(somSelf); */
+    M_MMMPGMethodDebug("M_MMMPG","cwmpgM_wpclsQueryInstanceFilter");
+
+    /* This list is build in wpclsInitData() */
+    return chrMMMPGExt;
+}
+
+
+/*
+ * SOM_Scope ULONG  SOMLINK cwmpgM_wpclsQueryIconData(M_CWMPG *somSelf, 
+ *                                                    PICONINFO pIconInfo)
+ */
+
+/*
+ * The prototype for cwmpgM_wpclsQueryIconData was replaced by the following prototype:
+ */
+SOM_Scope ULONG  SOMLINK cwmpgM_wpclsQueryIconData(M_MMMPG *somSelf, 
+                                                   PICONINFO pIconInfo)
+{
+  HMODULE hmod;
+    /* M_CWMPGData *somThis = M_CWMPGGetData(somSelf); */
+    M_MMMPGMethodDebug("M_MMMPG","cwmpgM_wpclsQueryIconData");
+
+    hmod=queryModuleHandle();
+    if(!hmod)
+      return M_MMMPG_parent_M_MMVideo_wpclsQueryIconData(somSelf, pIconInfo);
+
+	if (pIconInfo)   {
+      pIconInfo->fFormat = ICON_RESOURCE;
+      pIconInfo->hmod    = hmod;
+      pIconInfo->resid   = ID_ICONMPGFILE;
+	} /* endif */
+
+	return ( sizeof(ICONINFO) );
+}
+
+
+
+SOM_Scope void  SOMLINK cwmpgM_wpclsInitData(M_MMMPG *somSelf)
+{
+  static BOOL bGotMPEGExt=FALSE;
+
+    /* M_MMMPGData *somThis = M_MMMPGGetData(somSelf); */
+    M_MMMPGMethodDebug("M_MMMPG","cwmpgM_wpclsInitData");
+
+    /* 
+       Taken from the audio classes. I suspect the same is true for the video classes.
+       Anyway it wont hurt having this here.
+
+       Get extensions of additional audio procs. These extensions may be specified by
+       newly installed IO procs in MMPM2.INI or by using the Multimedia setup. For
+       example the MMIOMP3 procedure for reading MP3 files adds the MP3 extension this
+       way to the system. Extensions already handled by a specialized class will be
+       filtered in the called REXX script e.g. MP3 so only unknown extensions end up here.
+
+       Strangely enough wpclsQueryInstanceFilter() is called during wpclsInitData() so
+       we query the extensions here before calling the parent.
+
+       FIXME:
+       The check is only done once during initialization. This is a little annoyance for
+       the user because new extension specified in the settings will only be picked up
+       on next WPS start. 
+       */
+     if(!bGotMPEGExt)
+      {
+        /* REXX script: "mpegext.rx" */
+        getStringFromRexxScript(MMMPG_GETEXT_RX, chrMMMPGExt, sizeof(chrMMMPGExt));
+        /* Add our default extension *.MPG */
+        if(chrMMMPGExt[0]==0)
+          /* It's the first one */
+          strcpy(chrMMMPGExt,"*.MPG,*.VBS");
+        else 
+          strlcat(chrMMMPGExt, ",*.MPG,*.VBS", sizeof(chrMMMPGExt));
+        bGotMPEGExt=TRUE; 
+      }
+
+    M_MMMPG_parent_M_MMVideo_wpclsInitData(somSelf);
+}
+
+/*
+ * SOM_Scope BOOL  SOMLINK cwmpgM_wpclsQueryDefaultHelp(M_CWMPG *somSelf, 
+ *                                                      PULONG pHelpPanelId, 
+ *                                                      PSZ pszHelpLibrary)
+ */
+
+/*
+ * The prototype for cwmpgM_wpclsQueryDefaultHelp was replaced by the following prototype:
+ */
+SOM_Scope BOOL  SOMLINK cwmpgM_wpclsQueryDefaultHelp(M_MMMPG *somSelf, 
+                                                     PULONG pHelpPanelId, 
+                                                     PSZ pszHelpLibrary)
+{
+    /* M_CWMPGData *somThis = M_CWMPGGetData(somSelf); */
+    M_MMMPGMethodDebug("M_MMMPG","cwmpgM_wpclsQueryDefaultHelp");
+
+    if(pHelpPanelId)
+      *pHelpPanelId=MPGFILE_HELP_PANEL;
+    if(pszHelpLibrary)
+      strncpy(pszHelpLibrary, chrHelpLibrary, CCHMAXPATH);
+    return TRUE; 
+}
+
+
+
+
+
+
+
Index: /tags/CWMM-0.3.0_GA/classes/c/c_video/cwvideo.c
===================================================================
--- /tags/CWMM-0.3.0_GA/classes/c/c_video/cwvideo.c	(revision 213)
+++ /tags/CWMM-0.3.0_GA/classes/c/c_video/cwvideo.c	(revision 213)
@@ -0,0 +1,323 @@
+/*
+ * (C) Chris Wohlgemuth 2002-2005
+ *
+ */
+/*
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; see the file COPYING.  If not, write to
+ * the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+/*
+ * If you need another license for your project/product contact me at
+ * 
+ * http://www.os2world.com/cdwriting
+ * http://www.geocities.com/SiliconValley/Sector/5785/
+ */
+/*
+ *  This file was generated by the SOM Compiler and Emitter Framework.
+ *  Generated using: 
+ *      SOM Emitter emitctm: 2.42
+ */
+
+#ifndef SOM_Module_cwvideo_Source
+#define SOM_Module_cwvideo_Source
+#endif
+#define CWVideo_Class_Source
+#define M_CWVideo_Class_Source
+
+#define INCL_PM
+#include <os2.h>
+#include "cwvideo.ih"
+#include "cwaudioinc.h" /* For REXX script name */
+//#include "cwmmres.h"
+//#include "mmres.h"
+
+HMODULE queryResModuleHandle(void);
+HMODULE queryModuleHandle(void);
+BOOL getMessage(char* text,ULONG ulID, LONG lSizeText, HMODULE hResource,HWND hwnd);
+ULONG launchPMProg(PSZ pszTitle, PSZ wrapperExe, PSZ parameters,  CWMMDataFile *thisPtr, ULONG ulView);
+BOOL getStringFromRexxScript(PSZ rexxFile, char* chrResult, ULONG ulSize);
+
+char chrMMVideoExt[400]={0};/* Array holding the extensions for wpclsQueryInstanceFilter() */
+
+/*
+ * SOM_Scope BOOL  SOMLINK cwvideo_wpModifyPopupMenu(CWVideo *somSelf, 
+ *                                                   HWND hwndMenu, 
+ *                                                   HWND hwndCnr, 
+ *                                                   ULONG iPosition)
+ */
+
+/*
+ * The prototype for cwvideo_wpModifyPopupMenu was replaced by the following prototype:
+ */
+SOM_Scope BOOL  SOMLINK cwvideo_wpModifyPopupMenu(MMVideo *somSelf, 
+                                                  HWND hwndMenu, 
+                                                  HWND hwndCnr, 
+                                                  ULONG iPosition)
+{
+    /* CWVideoData *somThis = CWVideoGetData(somSelf); */
+    MMVideoMethodDebug("MMVideo","cwvideo_wpModifyPopupMenu");
+    
+    _wpInsertPopupMenuItems(somSelf, hwndMenu, 1, queryResModuleHandle(), ID_MENU_PLAYER, 1);
+    _wpInsertPopupMenuItems(somSelf, hwndMenu, 1, queryResModuleHandle(), ID_MENU_START, 1);
+    return (MMVideo_parent_CWMMDataFile_wpModifyPopupMenu(somSelf, 
+                                                        hwndMenu, 
+                                                        hwndCnr, 
+                                                        iPosition));
+}
+
+
+/*
+ * SOM_Scope BOOL  SOMLINK cwvideo_wpMenuItemSelected(CWVideo *somSelf, 
+ *                                                    HWND hwndFrame, 
+ *                                                    ULONG ulMenuId)
+ */
+
+/*
+ * The prototype for cwvideo_wpMenuItemSelected was replaced by the following prototype:
+ */
+SOM_Scope BOOL  SOMLINK cwvideo_wpMenuItemSelected(MMVideo *somSelf, 
+                                                   HWND hwndFrame, 
+                                                   ULONG ulMenuId)
+{
+    /* CWVideoData *somThis = CWVideoGetData(somSelf); */
+    MMVideoMethodDebug("MMVideo","cwvideo_wpMenuItemSelected");
+
+    switch(ulMenuId)
+      {
+      case ID_MENU_PLAYER:
+      case ID_MENU_START:
+        //_wpViewObject(somSelf, NULLHANDLE, ID_MENU_PLAYER ,0);
+        _wpViewObject(somSelf, NULLHANDLE, ulMenuId,0);
+        return TRUE;
+      default:
+        break;
+      }
+
+    return (MMVideo_parent_CWMMDataFile_wpMenuItemSelected(somSelf, 
+                                                         hwndFrame, 
+                                                         ulMenuId));
+}
+
+
+
+/*
+ * SOM_Scope HWND  SOMLINK cwvideo_wpOpen(CWVideo *somSelf, HWND hwndCnr, 
+ *                                        ULONG ulView, ULONG param)
+ */
+
+/*
+ * The prototype for cwvideo_wpOpen was replaced by the following prototype:
+ */
+SOM_Scope HWND  SOMLINK cwvideo_wpOpen(MMVideo *somSelf, HWND hwndCnr, 
+                                       ULONG ulView, ULONG param)
+{
+    /* CWVideoData *somThis = CWVideoGetData(somSelf); */
+    MMVideoMethodDebug("MMVideo","cwvideo_wpOpen");
+
+    switch(ulView)
+      {
+      case ID_MENU_START:
+      case ID_MENU_PLAYER:
+        /*case 0xbbe5:   Player */
+        {
+          char chrPlayer[CCHMAXPATH]={0};
+          char chrParams[CCHMAXPATH+2]="\"";
+          char chrTitle[50];
+          char *chrPtr=chrParams;
+          ULONG ulSize;
+          ULONG ulRc;
+
+          if(!PrfQueryProfileString(HINI_USERPROFILE, "CWMM", "videoplayer", NULLHANDLE, chrPlayer,
+                                    sizeof(chrPlayer)))
+            PrfQueryProfileString(HINI_USERPROFILE, "CWMM", "vb", "vb.exe", chrPlayer,
+                                  sizeof(chrPlayer));
+          
+          chrPtr++;
+          ulSize=sizeof(chrParams)-2;
+          _wpQueryRealName(somSelf, chrPtr, &ulSize, TRUE);
+          strcat(chrPtr,"\"");
+          
+          /* Get the Title for the window list */
+          if(!getMessage(chrTitle, IDSTR_VIDPLAYERTITLE, sizeof(chrTitle), queryResModuleHandle(), HWND_DESKTOP))
+            strcpy(chrTitle, "Player");
+          
+          if((ulRc=launchPMProg(chrTitle, chrPlayer, chrParams, somSelf, ulView))==NULLHANDLE) {
+            break;
+          }
+          return NULLHANDLE;
+        }
+
+      default:
+        break;
+      }
+
+    return (MMVideo_parent_CWMMDataFile_wpOpen(somSelf, hwndCnr, 
+                                             ulView, param));
+}
+
+
+
+/*
+ * SOM_Scope BOOL  SOMLINK cwvideoM_wpclsCreateDefaultTemplates(M_CWVideo *somSelf, 
+ *                                                              WPObject* Folder)
+ */
+
+/*
+ * The prototype for cwvideoM_wpclsCreateDefaultTemplates was replaced by the following prototype:
+ */
+SOM_Scope BOOL  SOMLINK cwvideoM_wpclsCreateDefaultTemplates(M_MMVideo *somSelf, 
+                                                             WPObject* Folder)
+{
+    /* M_CWVideoData *somThis = M_CWVideoGetData(somSelf); */
+    M_MMVideoMethodDebug("M_MMVideo","cwvideoM_wpclsCreateDefaultTemplates");
+
+    return TRUE;
+}
+
+
+SOM_Scope PSZ  SOMLINK cwvideoM_wpclsQueryInstanceType(M_MMVideo *somSelf)
+{
+  /*   static char chrTitle[40]={0}; */
+    /* M_MMVideoData *somThis = M_MMVideoGetData(somSelf); */
+    M_MMVideoMethodDebug("M_MMVideo","cwvideoM_wpclsQueryInstanceType");
+
+#if 0
+    /* The type probably shouldn't be translated to make changing files between languages
+       easier.*/
+    if(chrTitle[0]==0)
+      if(!getMessage(chrTitle, IDSTR_CWVIDEOTITLE, sizeof(chrTitle), queryResModuleHandle(), HWND_DESKTOP))
+        strcpy(chrTitle,"Digital video");
+#endif
+    return TYPE_DIGITALVIDEO;
+    /*  return (M_MMVideo_parent_M_CWMMDataFile_wpclsQueryInstanceType(somSelf)); */
+}
+
+SOM_Scope PSZ  SOMLINK cwvideoM_wpclsQueryInstanceFilter(M_MMVideo *somSelf)
+{
+    /* M_MMVideoData *somThis = M_MMVideoGetData(somSelf); */
+    M_MMVideoMethodDebug("M_MMVideo","cwvideoM_wpclsQueryInstanceFilter");
+
+    /* The list of additional extensions is built in wpclsInitData(). 
+
+       FIXME
+       This is a static list read in only once during startup.
+       Should probably be changed later on.
+       */
+    return chrMMVideoExt;
+
+    /* return (M_MMVideo_parent_M_CWMMDataFile_wpclsQueryInstanceFilter(somSelf)); */
+}
+
+/*
+ * SOM_Scope PSZ  SOMLINK cwvideoM_wpclsQueryTitle(M_CWVideo *somSelf)
+ */
+
+/*
+ * The prototype for cwvideoM_wpclsQueryTitle was replaced by the following prototype:
+ */
+SOM_Scope PSZ  SOMLINK cwvideoM_wpclsQueryTitle(M_MMVideo *somSelf)
+{
+  static char chrTitle[20]={0};
+  /* M_CWVideoData *somThis = M_CWVideoGetData(somSelf); */
+  M_MMVideoMethodDebug("M_MMVideo","cwvideoM_wpclsQueryTitle");
+
+    if(chrTitle[0]==0)
+      if(!getMessage(chrTitle, IDSTR_CWVIDEOTITLE, sizeof(chrTitle), queryResModuleHandle(), HWND_DESKTOP))
+        strcpy(chrTitle,"Digital video");
+
+    return chrTitle;
+}
+
+
+SOM_Scope void  SOMLINK cwvideoM_wpclsInitData(M_MMVideo *somSelf)
+{
+  static BOOL bGotVideoExt=FALSE;
+
+    /* M_MMVideoData *somThis = M_MMVideoGetData(somSelf); */
+    M_MMVideoMethodDebug("M_MMVideo","cwvideoM_wpclsInitData");
+
+    /* 
+       Taken from the audio classes. I suspect the same is true for the video classes.
+       Anyway it wont hurt having this here.
+
+       Get extensions of additional audio procs. These extensions may be specified by
+       newly installed IO procs in MMPM2.INI or by using the Multimedia setup. For
+       example the MMIOMP3 procedure for reading MP3 files adds the MP3 extension this
+       way to the system. Extensions already handled by a specialized class will be
+       filtered in the called REXX script e.g. MP3 so only unknown extensions end up here.
+
+       Strangely enough wpclsQueryInstanceFilter() is called during wpclsInitData() so
+       we query the extensions here before calling the parent.
+
+       FIXME:
+       The check is only done once during initialization. This is a little annoyance for
+       the user because new extension specified in the settings will only be picked up
+       on next WPS start. 
+       */
+     if(!bGotVideoExt)
+      {
+        /* REXX script: "videoext.rx" */
+        getStringFromRexxScript(MMVIDEO_GETEXT_RX, chrMMVideoExt, sizeof(chrMMVideoExt));
+        bGotVideoExt=TRUE; 
+      }
+
+    M_MMVideo_parent_M_CWMMDataFile_wpclsInitData(somSelf);
+}
+
+/*
+ * SOM_Scope ULONG  SOMLINK cwvideoM_wpclsQueryDefaultView(M_CWVideo *somSelf)
+ */
+
+/*
+ * The prototype for cwvideoM_wpclsQueryDefaultView was replaced by the following prototype:
+ */
+SOM_Scope ULONG  SOMLINK cwvideoM_wpclsQueryDefaultView(M_MMVideo *somSelf)
+{
+    /* M_CWVideoData *somThis = M_CWVideoGetData(somSelf); */
+    M_MMVideoMethodDebug("M_MMVideo","cwvideoM_wpclsQueryDefaultView");
+
+    return ID_MENU_START;
+    /*    return (M_CWVideo_parent_M_CWMMDataFile_wpclsQueryDefaultView(somSelf));*/
+}
+
+
+/*
+ * SOM_Scope ULONG  SOMLINK cwvideoM_wpclsQueryIconData(M_CWVideo *somSelf, 
+ *                                                      PICONINFO pIconInfo)
+ */
+
+/*
+ * The prototype for cwvideoM_wpclsQueryIconData was replaced by the following prototype:
+ */
+SOM_Scope ULONG  SOMLINK cwvideoM_wpclsQueryIconData(M_MMVideo *somSelf, 
+                                                     PICONINFO pIconInfo)
+{
+  HMODULE hmod;
+
+    /* M_CWVideoData *somThis = M_CWVideoGetData(somSelf); */
+    M_MMVideoMethodDebug("M_MMVideo","cwvideoM_wpclsQueryIconData");
+
+    hmod=queryModuleHandle();
+    if(!hmod)
+      return M_MMVideo_parent_M_CWMMDataFile_wpclsQueryIconData(somSelf, pIconInfo);
+
+	if (pIconInfo)   {
+      pIconInfo->fFormat = ICON_RESOURCE;
+      pIconInfo->hmod    = hmod;
+      pIconInfo->resid   = ID_ICONCWVIDEOFILE;
+	} /* endif */
+
+	return ( sizeof(ICONINFO) );
+}
+
Index: /tags/CWMM-0.3.0_GA/classes/c/c_video/makefile
===================================================================
--- /tags/CWMM-0.3.0_GA/classes/c/c_video/makefile	(revision 213)
+++ /tags/CWMM-0.3.0_GA/classes/c/c_video/makefile	(revision 213)
@@ -0,0 +1,10 @@
+# Makefile
+
+OBJECTS	= 
+
+all:
+	cd ../. && make
+
+clean:
+	rm *.*~
+
Index: /tags/CWMM-0.3.0_GA/classes/c/makefile
===================================================================
--- /tags/CWMM-0.3.0_GA/classes/c/makefile	(revision 213)
+++ /tags/CWMM-0.3.0_GA/classes/c/makefile	(revision 213)
@@ -0,0 +1,15 @@
+# Makefile
+
+OBJECTS	= 
+
+all:
+	cd ../. && make
+
+clean:
+	-cd ./c_audio && make clean
+	-cd ./c_video && make clean
+	-cd ./c_image && make clean
+	-cd ./c_mm && make clean
+	-cd ./c_common && make clean
+
+
Index: /tags/CWMM-0.3.0_GA/classes/create_cwmm_def.CMD
===================================================================
--- /tags/CWMM-0.3.0_GA/classes/create_cwmm_def.CMD	(revision 213)
+++ /tags/CWMM-0.3.0_GA/classes/create_cwmm_def.CMD	(revision 213)
@@ -0,0 +1,53 @@
+/* */
+call RxFuncAdd 'SysLoadFuncs', 'RexxUtil', 'SysLoadFuncs'
+call SysLoadFuncs
+
+deffile=strip(ARG(1))
+if ARG(1)="" then deffile="tst.def"
+
+theVersion=VALUE("MMCLSVERSION", ,"OS2ENVIRONMENT")
+if theVersion="" THEN theVersion="0.0.0"
+
+/* File defining the DLL exports */
+exportsfile="EXPORTS.DEF"
+
+def="; CWMM.DEF: DEF-file for CWMM.dll"||'0d'x||'0a'x
+def=def||";"||'0d'x||'0a'x
+def=def||";                    (C) Chris Wohlgemuth 2002-2005 Netlabs CWMM Team 2023-"||WORD(DATE(), 3)  ||'0d'x||'0a'x
+def=def||";/*"||'0d'x||'0a'x
+def=def||"; * This program is free software; you can redistribute it and/or modify"||'0d'x||'0a'x
+def=def||"; * it under the terms of the GNU General Public License as published by"||'0d'x||'0a'x
+def=def||"; * the Free Software Foundation; either version 2, or (at your option)"||'0d'x||'0a'x
+def=def||"; * any later version."||'0d'x||'0a'x
+def=def||"; *"||'0d'x||'0a'x
+def=def||"; * This program is distributed in the hope that it will be useful,"||'0d'x||'0a'x
+def=def||"; * but WITHOUT ANY WARRANTY; without even the implied warranty of"||'0d'x||'0a'x
+def=def||"; * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the"||'0d'x||'0a'x
+def=def||"; * GNU General Public License for more details."||'0d'x||'0a'x
+def=def||"; *"||'0d'x||'0a'x
+def=def||"; * You should have received a copy of the GNU General Public License"||'0d'x||'0a'x
+def=def||"; * along with this program; see the file COPYING.  If not, write to"||'0d'x||'0a'x
+def=def||"; * the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA."||'0d'x||'0a'x
+def=def||"; */"||'0d'x||'0a'x
+
+def=def||'0d'x||'0a'x
+
+def=def||"LIBRARY CWMM INITINSTANCE TERMINSTANCE"||'0d'x||'0a'x
+def=def||"DESCRIPTION '$@# Netlabs CWMM Team"
+def=def||":"||theVersion||" #@##1## "||DATE("E")||" "||TIME("N")||"       Zobopeep ::::"||WORD(TRANSLATE(theVersion," ", "."),3)||"::@@CWMM classes (C) C. Wohlgemuth 2001-2005 Netlabs CWMM Team 2023-"||WORD(DATE(),3)||"'"||'0d'x||'0a'x
+
+
+
+'@type NUL > 'deffile
+/* Write header */
+call lineout deffile, def
+/* Write the exports */
+DO WHILE LINES(exportsfile)
+	call lineout deffile, LINEIN(exportsfile)
+END
+call stream exportsfile, "C", "close"
+call stream deffile, "C", "close"
+
+SAY "New CWMM.DEF created for V"||theVersion||"."
+exit
+
Index: /tags/CWMM-0.3.0_GA/classes/doc_and_inst/FILE_ID.DIZ
===================================================================
--- /tags/CWMM-0.3.0_GA/classes/doc_and_inst/FILE_ID.DIZ	(revision 213)
+++ /tags/CWMM-0.3.0_GA/classes/doc_and_inst/FILE_ID.DIZ	(revision 213)
@@ -0,0 +1,25 @@
+CW-multimedia classes V0.2.9
+(C) Chris Wohlgemuth 2001-2005
+http://www.geocities.com/SiliconValley/Sector/5785/
+http://www.os2world.com/cdwriting
+
+Replacement classes for the MMOS2 classes (image,
+video, audio).
+WPS classes for seemless integration of MP3, OGG and
+FLAC files into the WPS. Standard WPS audio menues like
+any other audio file. Information page in the settings
+notebook about audio characteristics.
+ID3 page for MP3 files for viewing and setting.
+Audio and ID3 information shown in details view.
+CDTrack class for use with media folder.
+Improved open function. PNG class. New JPG
+IO-procedure for reading progressive JPG images.
+
+Requires:	OS/2 Warp 4 or eCS, MMOS2 and EMX runtime. The classes don't work with Warp 3.
+
+cwmm-0_2_9-ger.zip - german version
+
+Licence:
+This package is provided 'as is' for free.
+
+
Index: /tags/CWMM-0.3.0_GA/classes/doc_and_inst/eng/License
===================================================================
--- /tags/CWMM-0.3.0_GA/classes/doc_and_inst/eng/License	(revision 213)
+++ /tags/CWMM-0.3.0_GA/classes/doc_and_inst/eng/License	(revision 213)
@@ -0,0 +1,26 @@
+CW-multimedia classes
+---------------------
+
+License
+--------
+
+Theses classes are free to use but copyrighted.
+Use them on your own risk. If they burn your house
+or destroy your data it's all your fault.
+
+ 
+Author
+------
+
+These classes are (C) 2001-2003 Chris Wohlgemuth.
+
+http://www.geocities.com/SiliconValley/Sector/5785/
+http://www.os2world.com/cdwriting
+
+
+Credits
+-------
+
+The Icons are (C) Klaus Staedtler-Przyborski.
+Also thanks for fearless beta testing.
+
Index: /tags/CWMM-0.3.0_GA/classes/doc_and_inst/eng/Readme.eng
===================================================================
--- /tags/CWMM-0.3.0_GA/classes/doc_and_inst/eng/Readme.eng	(revision 213)
+++ /tags/CWMM-0.3.0_GA/classes/doc_and_inst/eng/Readme.eng	(revision 213)
@@ -0,0 +1,102 @@
+CW-MM classes
+-------------
+This package is a complete replacement for the
+multimedia classes coming with MMOS2. The convert menu
+is enhanced and the image classes are more robust WRT
+broken image files or buggy IO-procs. The limitations
+of the JPG-IO proc are still there. This procedure crashes
+on some images and the only way to resolve is a restart of
+the WPS. To overcome this limitiation a new JPGIO-IO procedure
+is included.
+
+Two classes are for seemless integration of the
+MMIO procedures for MP3 and OGG files written by
+Russel O'Connor.
+Get these procedures from:
+
+http://www.math.berkeley.edu/~roconnor/
+
+After installation Ogg- and MP3 files are treated the
+same way by the WPS as the other audio files. They have
+their own Icons and the same menus as for example
+wave files. A doubleclick starts playback another one
+stops it. The convert menu item helps you decoding the
+file to wave without any other program. 
+
+The settings notebook of every audio file gets a new
+page added describing the audio characteristics like
+playtime or samplerate. This data is also shown in the
+details view of folders if set to class:CWAudio.
+
+There's also a new open-item for volume.
+You may view and change the ID3 tags of MP3 files
+using the settings notebook. These tags are also shown
+in the details view.
+
+
+Additional features
+-------------------
+With the following keys in OS2.ini you may specify
+the programs to use when opening audio files. These
+programs must be PM programs.
+
+CWMM->audioplayer-><Name of program>
+CWMM->audioeditor-><Name of program>
+
+The following keys specify the videoplayer to use for
+MPG and AVI files:
+
+CWMM->aviplayer-><Name of program>
+CWMM->mpgplayer-><Name of program>
+
+The following key specifies the image editor to use when
+selecting the apropriate menu:
+
+CWMM->imageeditor-><Name of program>
+
+Use this key to enable details for image files on CD. Use
+only with fast drives.
+
+CWMM->useNewImgClsFeaturesOnCD->1
+
+Note: The keynames are case sensitive.
+
+
+Installation:
+-------------
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+
+Make a backup of your INI files !
+
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+
+Follow the instructions in the Readme of the root directory of the distribution.
+
+
+Credits
+-------
+
+The Icons are (C) Klaus Staedtler-Przyborski. Thanks for fearless
+beta testing.
+
+
+License
+--------
+
+Theses classes are free to use but copyrighted. Use them on your own
+risk. If they burn your house or destroy your data it's all your
+fault.
+
+
+Author
+------
+
+These classes are
+
+(C) Chris Wohlgemuth 2001-2003
+
+http://www.geocities.com/SiliconValley/Sector/5785/
+http://www.os2world.com/cdwriting
+
+
+
Index: /tags/CWMM-0.3.0_GA/classes/doc_and_inst/eng/cwmm.ins
===================================================================
--- /tags/CWMM-0.3.0_GA/classes/doc_and_inst/eng/cwmm.ins	(revision 213)
+++ /tags/CWMM-0.3.0_GA/classes/doc_and_inst/eng/cwmm.ins	(revision 213)
@@ -0,0 +1,98 @@
+[APPLICATION]
+NAME CW-Multimedia Classes 0.2.8
+VERSION 0.2.8.0
+COPYRIGHT (C) Chris Wohlgemuth 2001-2004
+HOME http://www.os2world.com/cdwriting
+INTERNALNAME CWMM
+TOTALSIZE 735212
+INSTALLER 0.1.5.0
+DESCRIPTION Multimedia classes for replacing the classes coming with MMOS2. More robust operation and improved feature set. New classes to integrate MP3 and OGG files seemlessly into the WPS. After installation these files behave like any other audio file. For example a doubleclick starts playing. Information about the audio file (samplerate, playtime etc.) is shown in the details view of folders and in the settings notebook. The ID3 tags (V1.0) of MP3 files are changeable using a page of the settings notebook and also appear in the details view of folders.
+
+[DESCRIPTION]
+DESCRIPTION  Multimedia classes for replacing the classes coming with MMOS2. More robust operation and improved feature set. New classes to integrate MP3 and OGG files seemlessly into the WPS. After installation these files behave like any other audio file. For example a doubleclick starts playing. Information about the audio file (samplerate, playtime etc.) is shown in the details view of folders and in the settings notebook. The ID3 tags (V1.0) of MP3 files are changeable using a page of the settings notebook and also appear in the details view of folders.
+
+[FILES]
+cwmm.dll, %TARGET%\ ,  F,  235401
+cwmm.hlp, %TARGET%\ ,  F,  4615
+cwmm.ins, %TARGET%\ ,  F,  5265
+cwmm.sym, %TARGET%\ ,  F,  21700
+bin\audconv.exe, %TARGET%\ ,  F,  41765
+bin\audFldr.CMD, %TARGET%\ ,  F,  504
+bin\audioext.rx, %TARGET%\ ,  F,  2336
+bin\chktimid.rx, %TARGET%\ ,  F,  1374
+bin\classvol.exe, %TARGET%\ ,  F,  43832
+bin\imageadd.rx, %TARGET%\ ,  F,  181
+bin\imageext.rx, %TARGET%\ ,  F,  454
+bin\imgconv.exe, %TARGET%\ ,  F,  42573
+bin\imgFldr.CMD, %TARGET%\ ,  F,  504
+bin\mmfind.exe, %TARGET%\ ,  F,  76370
+bin\mmplayer.exe, %TARGET%\ ,  F,  66076
+bin\mmres_EN.dll, %TARGET%\ ,  F,  20038
+bin\removeEA.CMD, %TARGET%\ ,  F,  1408
+bin\volume.exe, %TARGET%\ ,  F,  42138
+DLL\GBM.DLL, %?%:\MMOS2\ ,  F,  186838
+DLL\JPEGIO.DLL, %?%:\MMOS2\ ,  F,  18044
+DLL\JPEGIO.SYM, %?%:\MMOS2\ ,  F,  1540
+
+[CLASSES]
+CWMMDataFile, %TARGET%\cwmm.dll, 
+MMAudio, %TARGET%\cwmm.dll, 
+MMMP3, %TARGET%\cwmm.dll, 
+MMOGG, %TARGET%\cwmm.dll, 
+MMWAV, %TARGET%\cwmm.dll, 
+MMAIF, %TARGET%\cwmm.dll, 
+MMAU, %TARGET%\cwmm.dll, 
+MM_AU, %TARGET%\cwmm.dll, 
+MMIFF, %TARGET%\cwmm.dll, 
+MMSNDF, %TARGET%\cwmm.dll, 
+MMVOC, %TARGET%\cwmm.dll, 
+MMCDTrack, %TARGET%\cwmm.dll, 
+MMMIDI, %TARGET%\cwmm.dll, 
+MMVideo, %TARGET%\cwmm.dll, 
+MMAVI, %TARGET%\cwmm.dll, 
+MMFLI, %TARGET%\cwmm.dll, 
+MMMOV, %TARGET%\cwmm.dll, 
+MMMPG, %TARGET%\cwmm.dll, 
+MMFLAC, %TARGET%\cwmm.dll, 
+MMImage, %TARGET%\cwmm.dll, 
+MMAVC, %TARGET%\cwmm.dll, 
+MMDIB, %TARGET%\cwmm.dll, 
+MMGIF, %TARGET%\cwmm.dll, 
+MMJPG, %TARGET%\cwmm.dll, 
+MMPhotoCD, %TARGET%\cwmm.dll, 
+MMPCX, %TARGET%\cwmm.dll, 
+MMTarga, %TARGET%\cwmm.dll, 
+MMTIFF, %TARGET%\cwmm.dll, 
+MMPNG, %TARGET%\cwmm.dll, 
+MMM3U, %TARGET%\cwmm.dll, 
+MMAudioStream, %TARGET%\cwmm.dll, 
+MMMMotion, %TARGET%\cwmm.dll, 
+MMBitmap, %TARGET%\cwmm.dll, WPBitmap
+CWMMDisk, %TARGET%\cwmm.dll, WPDisk
+MMFolder, %TARGET%\cwmm.dll, 
+
+[OBJECTS]
+Volumeõ,õ <MMPM2_MMVOLUME>õ,õ WPProgramõ,õ <MMPM2_FOLDER>õ,õ EXENAME=%TARGET%\bin\volume.exe;õ,õ update
+CD-Playerõ,õ <MMPM2_CDPLAYER>õ,õ WPProgramõ,õ <MMPM2_FOLDER>õ,õ EXENAME=cdpm.exeõ,õ update
+M3U-Playlistõ,õ <MMPM2_MMM3UTEMPLATE>õ,õ MMM3Uõ,õ <MMPM2_MMTEMPLATEFOLDER>õ,õ TEMPLATE=YES;õ,õ update
+Audio-Streamõ,õ <MMPM2_AUDISTREAMTEMPLATE>õ,õ MMAudioStreamõ,õ <MMPM2_MMTEMPLATEFOLDER>õ,õ TEMPLATE=YES;õ,õ update
+Find^Multimedia Filesõ,õ <MMPM2_MMFIND>õ,õ WPProgramõ,õ <MMPM2_FOLDER>õ,õ EXENAME=%TARGET%\bin\mmfind.exe;õ,õ update
+
+[SKRIPTS]
+BEFOREINST õ,õ /* Message for the user */;call RxFuncAdd 'SysLoadFuncs', 'RexxUtil', 'SysLoadFuncs';call SysLoadFuncs;;RC=0;;usrdata._mBTitle="Installation";usrData._mBCBTxt="";usrdata._mBTxt='Did you make a copy of JPEGIO.DLL in the directory MMOS2\DLL?';usrdata._mBTxt=usrdata._mBTxt||'0d'x||'0d'x||'NO will abort the installation.';usrData._mBType="YESNO";call beep 1000, 100;ret=ModalFor('usermsgBox');IF TRANSLATE(ret)='NO' THEN rc=1;IF rc=0 THEN DO;usrData._mBCBTxt="";usrdata._mBTxt='Did you run the skript RUNME1st.CMD and restarted the WPS afterwards? This MUST be done before installation!!';usrdata._mBTxt=usrdata._mBTxt||'0d'x||'0d'x||'NO will abort the installation.';usrData._mBType="YESNO";call beep 1000, 100;ret=ModalFor('usermsgBox');IF TRANSLATE(ret)='NO' THEN rc=1;END;
+AFTERCLASSES õ,õ /* Message for the user */;call RxFuncAdd 'SysLoadFuncs', 'RexxUtil', 'SysLoadFuncs';call SysLoadFuncs;;RC=0;;call RxMessageBox "MM classes installed. Remember to restart the WPS after installation is finished.", "Hinweis", "OK", "INFORMATION";
+
+
+[INSTALLPROFILES]
+CWMM õ,õ Install new multimedia classes for WPS õ,õ Install new multimedia classes for replacing the classes coming with MMOS2. More robust operation and improved feature set. New classes to integrate MP3 and OGG files seemlessly into the WPS. After installation these files behave like any other audio file. For example a doubleclick starts playing. Information about the audio file (samplerate, playtime etc.) is shown in the details view of folders and in the settings notebook. The ID3 tags (V1.0) of MP3 files are changeable using a page of the settings notebook and also appear in the details view of folders.
+
+[CWMM]
+CWMM, , ,S,[ ], cwmm.ins
+
+[DEFAULTTARGET]
+PATH %APPS%\CWMMOS2\CWMM
+
+[INI]
+USER õ,õ CWMM õ,õ audioconverter õ,õ %TARGET%\bin\audconv.exe õ,õ YES
+USER õ,õ CWMM õ,õ imageconverter õ,õ %TARGET%\bin\imgconv.exe õ,õ YES
+
Index: /tags/CWMM-0.3.0_GA/classes/doc_and_inst/ger/Lizenz
===================================================================
--- /tags/CWMM-0.3.0_GA/classes/doc_and_inst/ger/Lizenz	(revision 213)
+++ /tags/CWMM-0.3.0_GA/classes/doc_and_inst/ger/Lizenz	(revision 213)
@@ -0,0 +1,28 @@
+CW-Multimedia Klassen
+---------------------
+
+Lizenz
+------
+
+Diese Klassen drfen frei verwendet werden. Das Copyright verbleibt
+jedoch beim Author. Benutzung ausschlieálich auf eigene
+Gefahr. Es wird KEINE Verantwortung fr Datenverluste, Ehekrisen
+und sonstige unerfreuliche Ereignisse bernommen.
+
+ 
+Author
+------
+
+Diese Klassen sind (C) 2001-2003 Chris Wohlgemuth.
+
+http://www.geocities.com/SiliconValley/Sector/5785/
+http://www.os2world.com/cdwriting
+
+
+Credits
+-------
+
+Die Icons sind (C) Klaus Staedtler-Przyborski. Vielen Dank auch
+fr furchtloses Betatesten.
+
+
Index: /tags/CWMM-0.3.0_GA/classes/doc_and_inst/ger/Readme.ger
===================================================================
--- /tags/CWMM-0.3.0_GA/classes/doc_and_inst/ger/Readme.ger	(revision 213)
+++ /tags/CWMM-0.3.0_GA/classes/doc_and_inst/ger/Readme.ger	(revision 213)
@@ -0,0 +1,109 @@
+CW-Multimedia Klassen
+---------------------
+
+Dieses Paket ist ein kompletter Ersatz fr die
+Multimediaklassen von MMOS2. Sie sind robuster gegenber
+defekten Bilddateien oder fehlerhaften IO-Prozeduren.
+Das Konvertieren Men wurde erweitert.
+Die Beschrnkungen der JPEG IO-Prozedur, die mit Warp
+geliefert wird, bleiben weiterhin bestehen. Diese
+Prozedur strzt bei manchen JPG-Dateien ab und nur ein
+Neustart der WPS stabilisiert das System wieder. Es wird
+daher eine verbesserte neue JPEG IO-Prozedur mitgeliefert.
+
+Zwei neue Klassen sorgen fr eine nahtlose
+Integration der MMIO-Prozeduren von Russel O'Connor 
+fr MP3- und OGG-Dateien in die WPS. Download der
+DLLs unter:
+
+http://www.math.berkeley.edu/~roconnor/
+
+Nach Installation der Klassen verhalten sich Ogg- und
+MP3-Dateien auf der WPS wie alle anderen Audiodateien
+(z.B. Wavedateien). Sie haben ein eigenes Icon und die
+Mens der brigen Audiodateien. So startet z.B. ein
+Doppelklick die Wiedergabe ein weiterer stoppt sie.
+ber das 'Umsetzen'-Men knnen die Dateien einfach
+in Wavedateien umgesetzt werden.
+
+Zustzlich wird in die Eigenschaftendialoge aller
+Audiodateien eine Informationsseite ber die Datei
+eingefgt (Samplerate, Spieldauer etc.). Diese Daten
+erscheinen auch in der Detailansicht von Ordnern, wenn
+die Ansicht auf Klasse:CWAudio gesetzt wird.
+
+Im ffnen-Men ist zustzlich ein Eintrag fr Lautstrke.
+Bei MP3-Dateien lassen sich die ID3-Tags ber den
+Eigenschaftendialog anzeigen und verndern. Die ID3-Tags
+werden darberhinaus in der Detailansicht von Ordnern
+angezeigt.
+
+
+Weitere Mglichkeiten
+---------------------
+
+Mit den folgenden Schlsselwerten in 'OS2.ini' werden eigene
+Programme beim ffnen von Audiodateien verwendet. Diese
+Programme mssen PM-Programme sein.
+
+CWMM->audioplayer-><Programm zum Abspielen>
+CWMM->audioeditor-><Programm zum Editieren>
+
+Mit den folgenden Schlsseln werden die Programme zum
+Abspielen von MPG- und AVI-Filmen festgelegt.
+
+CWMM->aviplayer-><Name of program>
+CWMM->mpgplayer-><Name of program>
+
+Der folgende Schlssel gibt den Bildeditor fr Bilddateien
+an.
+
+CWMM->imageeditor-><Name of program>
+
+Mit dem folgenden Schlssel werden Detailangaben auch fr Bilder
+auf CD abgefragt. Nur bei schnellen Laufwerken verwenden.
+
+CWMM->useNewImgClsFeaturesOnCD->1
+
+
+Die Groá- und Kleinschreibung der Schlsselnamen wird unterschieden.
+ 
+
+Installation
+------------
+
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+
+ACHTUNG: vor der Installation eine Kopie der
+         INI-Dateien anfertigen.
+
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+
+Die Installationsanweisungen im Wurzel-Verzeichnis der Distribution befolgen.
+
+
+Credits
+-------
+
+Die Icons sind (C) Klaus Staedtler-Przyborski. Vielen Dank auch
+fr furchtloses Betatesten.
+
+
+Lizenz
+------
+
+Diese Klassen drfen frei verwendet werden. Das Copyright verbleibt
+jedoch beim Author. Benutzung ausschlieálich auf eigene
+Gefahr. Es wird KEINE Verantwortung fr Datenverluste, Ehekrisen
+und sonstige unerfreuliche Ereignisse bernommen.
+
+ 
+Author
+------
+
+Diese Klassen sind (C) 2001-2005 Chris Wohlgemuth.
+
+http://www.geocities.com/SiliconValley/Sector/5785/
+http://www.os2world.com/cdwriting
+
+
Index: /tags/CWMM-0.3.0_GA/classes/doc_and_inst/ger/cwmm.ins
===================================================================
--- /tags/CWMM-0.3.0_GA/classes/doc_and_inst/ger/cwmm.ins	(revision 213)
+++ /tags/CWMM-0.3.0_GA/classes/doc_and_inst/ger/cwmm.ins	(revision 213)
@@ -0,0 +1,97 @@
+[APPLICATION]
+NAME CW-Multimedia Classes 0.2.8
+VERSION 0.2.8.0
+COPYRIGHT (C) Chris Wohlgemuth 2001-2004
+HOME http://www.os2world.com/cdwriting
+INTERNALNAME CWMM
+TOTALSIZE 813607
+INSTALLER 0.1.5.0
+DESCRIPTION Ersatzmultimediaklassen fr MMOS2. Diese neuen Klassen sind robuster als die Standardklassen und haben einige erweiterte Eigenschaften. Zwei neue Klassen fr eine nahtlose Integration von MP3- und OGG-Dateien in die WPS sind vorhanden. Nach der Installation verhalten sich diese Audiodateien wie alle anderen. So startet ein Doppelklick die Wiedergabe und ein weiterer stoppt sie. Informationen ber die Datei wie Samplerate, Spielzeit usw. werden in der Detailansicht von Ordnern angezeigt und ebenso in den Einstellungen aller Audiodateien. Die ID3-Tags (V1.0) von MP3-Dateien lassen sich ber die Einstellungen ndern und erscheinen zustzlich in der Detailansicht.
+
+[DESCRIPTION]
+DESCRIPTION  Ersatzmultimediaklassen fr MMOS2. Diese neuen Klassen sind robuster als die Standardklassen und haben einige erweiterte Eigenschaften. Zwei neue Klassen fr eine nahtlose Integration von MP3- und OGG-Dateien in die WPS sind vorhanden. Nach der Installation verhalten sich diese Audiodateien wie alle anderen. So startet ein Doppelklick die Wiedergabe und ein weiterer stoppt sie. Informationen ber die Datei wie Samplerate, Spielzeit usw. werden in der Detailansicht von Ordnern angezeigt und ebenso in den Einstellungen aller Audiodateien. Die ID3-Tags (V1.0) von MP3-Dateien lassen sich ber die Einstellungen ndern und erscheinen zustzlich in der Detailansicht.
+
+[FILES]
+cwmm.dll, %TARGET%\ ,  F,  235401
+cwmm.hlp, %TARGET%\ ,  F,  4615
+cwmm.ins, %TARGET%\ ,  F,  5741
+cwmm.sym, %TARGET%\ ,  F,  21700
+bin\audconv.exe, %TARGET%\ ,  F,  41765
+bin\audFldr.CMD, %TARGET%\ ,  F,  504
+bin\audioext.rx, %TARGET%\ ,  F,  2336
+bin\chktimid.rx, %TARGET%\ ,  F,  1374
+bin\classvol.exe, %TARGET%\ ,  F,  43832
+bin\imageadd.rx, %TARGET%\ ,  F,  181
+bin\imageext.rx, %TARGET%\ ,  F,  454
+bin\imgconv.exe, %TARGET%\ ,  F,  42573
+bin\imgFldr.CMD, %TARGET%\ ,  F,  504
+bin\mmfind.exe, %TARGET%\ ,  F,  76370
+bin\mmplayer.exe, %TARGET%\ ,  F,  66076
+bin\mmres_DE.dll, %TARGET%\ ,  F,  20213
+bin\removeEA.CMD, %TARGET%\ ,  F,  1408
+bin\volume.exe, %TARGET%\ ,  F,  42138
+DLL\GBM.DLL, %?%:\MMOS2\ ,  F,  186838
+DLL\JPEGIO.DLL, %?%:\MMOS2\ ,  F,  18044
+DLL\JPEGIO.SYM, %?%:\MMOS2\ ,  F,  1540
+
+[CLASSES]
+CWMMDataFile, %TARGET%\cwmm.dll, 
+MMAudio, %TARGET%\cwmm.dll, 
+MMMP3, %TARGET%\cwmm.dll, 
+MMOGG, %TARGET%\cwmm.dll, 
+MMWAV, %TARGET%\cwmm.dll, 
+MMAIF, %TARGET%\cwmm.dll, 
+MMAU, %TARGET%\cwmm.dll, 
+MM_AU, %TARGET%\cwmm.dll, 
+MMIFF, %TARGET%\cwmm.dll, 
+MMSNDF, %TARGET%\cwmm.dll, 
+MMVOC, %TARGET%\cwmm.dll, 
+MMCDTrack, %TARGET%\cwmm.dll, 
+MMMIDI, %TARGET%\cwmm.dll, 
+MMVideo, %TARGET%\cwmm.dll, 
+MMAVI, %TARGET%\cwmm.dll, 
+MMFLI, %TARGET%\cwmm.dll, 
+MMMOV, %TARGET%\cwmm.dll, 
+MMMPG, %TARGET%\cwmm.dll, 
+MMFLAC, %TARGET%\cwmm.dll, 
+MMImage, %TARGET%\cwmm.dll, 
+MMAVC, %TARGET%\cwmm.dll, 
+MMDIB, %TARGET%\cwmm.dll, 
+MMGIF, %TARGET%\cwmm.dll, 
+MMJPG, %TARGET%\cwmm.dll, 
+MMPhotoCD, %TARGET%\cwmm.dll, 
+MMPCX, %TARGET%\cwmm.dll, 
+MMTarga, %TARGET%\cwmm.dll, 
+MMTIFF, %TARGET%\cwmm.dll, 
+MMPNG, %TARGET%\cwmm.dll, 
+MMM3U, %TARGET%\cwmm.dll, 
+MMAudioStream, %TARGET%\cwmm.dll, 
+MMMMotion, %TARGET%\cwmm.dll, 
+MMBitmap, %TARGET%\cwmm.dll, WPBitmap
+CWMMDisk, %TARGET%\cwmm.dll, WPDisk
+MMFolder, %TARGET%\cwmm.dll, 
+
+[OBJECTS]
+Volumeõ,õ <MMPM2_MMVOLUME>õ,õ WPProgramõ,õ <MMPM2_FOLDER>õ,õ EXENAME=%TARGET%\bin\volume.exe;õ,õ update
+CD-Playerõ,õ <MMPM2_CDPLAYER>õ,õ WPProgramõ,õ <MMPM2_FOLDER>õ,õ EXENAME=cdpm.exeõ,õ update
+M3U-Playlistõ,õ <MMPM2_MMM3UTEMPLATE>õ,õ MMM3Uõ,õ <MMPM2_MMTEMPLATEFOLDER>õ,õ TEMPLATE=YES;õ,õ update
+Audio-Streamõ,õ <MMPM2_AUDISTREAMTEMPLATE>õ,õ MMAudioStreamõ,õ <MMPM2_MMTEMPLATEFOLDER>õ,õ TEMPLATE=YES;õ,õ update
+Finde^Multimedia-Dateienõ,õ <MMPM2_MMFIND>õ,õ WPProgramõ,õ <MMPM2_FOLDER>õ,õ EXENAME=%TARGET%\bin\mmfind.exe;õ,õ update
+
+[SKRIPTS]
+BEFOREINST õ,õ /* Message for the user */;call RxFuncAdd 'SysLoadFuncs', 'RexxUtil', 'SysLoadFuncs';call SysLoadFuncs;;RC=0;;usrdata._mBTitle="Installation";usrData._mBCBTxt="";usrdata._mBTxt='Haben Sie eine Kopie der JPEGIO.DLL im Verzeichnis MMOS2\DLL angefertigt?';usrdata._mBTxt=usrdata._mBTxt||'0d'x||'0d'x||'Auswahl von NEIN bricht die Installation ab.';usrData._mBType="YESNO";call beep 1000, 100;ret=ModalFor('usermsgBox');IF TRANSLATE(ret)='NO' THEN rc=1;IF rc=0 THEN DO; usrdata._mBTxt='Haben Sie das Skript RUNME1ST.CMD gestartet und die WPS neu gestartet? Dieses ist erforderlich vor der Installation der Klassen!';usrdata._mBTxt=usrdata._mBTxt||'0d'x||'0d'x||'Auswahl von NEIN bricht die Installation ab.';usrData._mBType="YESNO";call beep 1000, 100;ret=ModalFor('usermsgBox');IF TRANSLATE(ret)='NO' THEN rc=1;END;
+AFTERCLASSES õ,õ /* Message for the user */;call RxFuncAdd 'SysLoadFuncs', 'RexxUtil', 'SysLoadFuncs';call SysLoadFuncs;;RC=0;;call RxMessageBox "MM-Klassen wurden installiert. Denken Sie daran, die WPS nach Abschluá der Installation neu zu starten.", "Hinweis", "OK", "INFORMATION";
+
+[INSTALLPROFILES]
+CWMM õ,õ Installation der WPS-Klassen õ,õ Installation der Ersatzmultimediaklassen fr MMOS2. Diese neuen Klassen sind robuster als die Standardklassen und haben einige erweiterte Eigenschaften. Zwei neue Klassen fr eine nahtlose Integration von MP3- und OGG-Dateien in die WPS sind vorhanden. Nach der Installation verhalten sich diese Audiodateien wie alle anderen. So startet ein Doppelklick die Wiedergabe und ein weiterer stoppt sie. Informationen ber die Datei wie Samplerate, Spielzeit usw. werden in der Detailansicht von Ordnern angezeigt und ebenso in den Einstellungen aller Audiodateien. Die ID3-Tags (V1.0) von MP3-Dateien lassen sich ber die Einstellungen ndern und erscheinen zustzlich in der Detailansicht.
+
+[CWMM]
+CWMM, , ,S,[ ], cwmm.ins
+
+[DEFAULTTARGET]
+PATH %APPS%\CWMMOS2\CWMM
+
+[INI]
+USER õ,õ CWMM õ,õ audioconverter õ,õ %TARGET%\bin\audconv.exe õ,õ YES
+USER õ,õ CWMM õ,õ imageconverter õ,õ %TARGET%\bin\imgconv.exe õ,õ YES
+
Index: /tags/CWMM-0.3.0_GA/classes/doc_and_inst/installmm.CMD
===================================================================
--- /tags/CWMM-0.3.0_GA/classes/doc_and_inst/installmm.CMD	(revision 213)
+++ /tags/CWMM-0.3.0_GA/classes/doc_and_inst/installmm.CMD	(revision 213)
@@ -0,0 +1,218 @@
+/* rexx - Install the CW-MM classes */
+
+deinstalling = '-R'
+
+
+call RxFuncAdd 'SysLoadFuncs', 'RexxUtil', 'SysLoadFuncs'
+call SysLoadFuncs
+
+
+curDir=DIRECTORY()
+
+
+call SysCls
+SAY ''
+SAY 'This skript will install the CW-MM classes.'
+SAY 'Do you want to continue?'
+SAY ''
+SAY 'Enter Y for yes and N for no.'
+SAY ''
+SAY '> '
+parse value SysCurPos() with aktzeile aktspalte
+newposition=SysCurPos(aktzeile-1,2)
+
+resp=LINEIN()
+IF TRANSLATE(resp)='N' THEN EXIT
+
+/* Load all the Rexx Util functions */
+call RxFuncAdd 'SysLoadFuncs', 'RexxUtil', 'SysLoadFuncs'
+call SysLoadFuncs
+call RxFuncAdd 'RxWinReplaceObjectClass', 'mmparts', 'RxWinReplaceObjectClass'
+
+/* First uninstall the standard MM-stuff */
+MMClasses.   = ''
+MMClasses.1  = 'MMDataFile'
+MMClasses.2  = 'MMImage'
+MMClasses.3  = 'MMAudio'
+MMClasses.4  = 'MMVideo'
+MMClasses.5  = 'MMMIDI'
+MMClasses.6  = 'MMTarga'
+MMClasses.7  = 'MMTIFF'
+MMClasses.8  = 'MMGIF'
+MMClasses.9  = 'MMPCX'
+MMClasses.10 = 'MMPhotoCD'
+MMClasses.11 = 'MMAVC'
+MMClasses.12 = 'MMMMotion'
+MMClasses.13 = 'MMDIB'
+MMClasses.14 = 'MMDevice'
+MMClasses.15 = 'MMCDDevice'
+MMClasses.16 = 'MMLVDDevice'
+MMClasses.17 = 'MMVolume'
+MMClasses.18 = 'MMVOC'
+MMClasses.19 = 'MM_AU'
+MMClasses.20 = 'MMAU'
+MMClasses.21 = 'MMAIF'
+MMClasses.22 = 'MMIFF'
+MMClasses.23 = 'MMSNDF'
+MMClasses.24 = 'MMAVI'
+MMClasses.25 = 'MMFLI'
+MMClasses.26 = 'MMMPG'
+MMClasses.27 = 'MMJPG'
+MMClasses.28 = 'MMWAV'
+MMClasses.29 = 'MMMOV'
+MMClasses.30 = 'MMFolder'
+MMClasses.31 = 'MMFinder'
+
+x = 1;
+
+do while MMClasses.x <> ''   /* loop until no more classes */
+   if deinstalling = '-R' then
+      if SysDeregisterObjectClass(MMClasses.x) then
+         say MMClasses.x 'class deregistration successful'
+      else
+         say MMClasses.x 'class deregistration failed'
+   else
+      if SysRegisterObjectClass(MMClasses.x, "mmparts") then
+         say MMClasses.x 'class registration successful'
+      else
+         say MMClasses.x 'class registration failed'
+   x = x + 1
+end
+
+
+/* Do MMBitmap Replacement Class */
+
+if deinstalling = '-R' then
+   do
+      if RxWinReplaceObjectClass('WPBitmap','MMBitmap', '0') then
+         say 'UnReplace MMBitmap successful'
+      else
+         say 'UnReplace MMBitmap failed'
+
+      if SysDeregisterObjectClass('MMBitmap') then
+         say 'MMBitmap class deregistration successful'
+      else
+         say 'MMBitmap class deregistration failed'
+
+   end
+else
+   do
+      if SysRegisterObjectClass('MMBitmap', 'MMBIT') then
+         say 'MMBitmap class registration successful'
+      else
+         say 'MMBitmap class registration failed'
+
+      res = SysIni(, 'PM_InstallClassReplacement', 'WPBitmap', 'MMBitmap'x2c('0') )
+      say 'Replacing WPBitmap with MMBitmap successful (res=' res ')'
+   end
+
+
+/* Now install the new MM classes */
+classDLL=DIRECTORY()||'\cwmm.dll'
+
+SAY 'Registering new multimedia classes...'
+
+deinstalling = ''
+
+MMClasses.   = ''
+MMClasses.1  = 'MMDataFile'
+MMClasses.2  = 'MMImage'
+MMClasses.3  = 'MMAudio'
+MMClasses.4  = 'MMVideo'
+MMClasses.5  = 'MMMIDI'
+MMClasses.6  = 'MMTarga'
+MMClasses.7  = 'MMTIFF'
+MMClasses.8  = 'MMGIF'
+MMClasses.9  = 'MMPCX'
+MMClasses.10 = 'MMPhotoCD'
+MMClasses.11 = 'MMAVC'
+MMClasses.12 = 'MMMMotion'
+MMClasses.13 = 'MMDIB'
+MMClasses.14 = 'MMMP3'
+MMClasses.15 = 'MMOGG'
+MMClasses.16 = 'MMAudioStream'
+MMClasses.17 = 'MMCDTrack'
+MMClasses.18 = 'MMVOC'
+MMClasses.19 = 'MM_AU'
+MMClasses.20 = 'MMAU'
+MMClasses.21 = 'MMAIF'
+MMClasses.22 = 'MMIFF'
+MMClasses.23 = 'MMSNDF'
+MMClasses.24 = 'MMAVI'
+MMClasses.25 = 'MMFLI'
+MMClasses.26 = 'MMMPG'
+MMClasses.27 = 'MMJPG'
+MMClasses.28 = 'MMWAV'
+MMClasses.29 = 'MMMOV'
+MMClasses.30 = 'MMM3U'
+MMClasses.31 = 'MMFolder'
+
+x = 1;
+
+do while MMClasses.x <> ''   /* loop until no more classes */
+   if deinstalling = '-R' then
+      if SysDeregisterObjectClass(MMClasses.x) then
+         say MMClasses.x 'class deregistration successful'
+      else
+         say MMClasses.x 'class deregistration failed'
+   else
+      if SysRegisterObjectClass(MMClasses.x, "mmparts") then
+         say MMClasses.x 'class registration successful'
+      else
+         say MMClasses.x 'class registration failed'
+   x = x + 1
+end
+
+
+/* Do MMBitmap Replacement Class */
+
+if deinstalling = '-R' then
+   do
+      if RxWinReplaceObjectClass('WPBitmap','MMBitmap', '0') then
+         say 'UnReplace MMBitmap successful'
+      else
+         say 'UnReplace MMBitmap failed'
+
+      if SysDeregisterObjectClass('MMBitmap') then
+         say 'MMBitmap class deregistration successful'
+      else
+         say 'MMBitmap class deregistration failed'
+
+   end
+else
+   do
+      if SysRegisterObjectClass('MMBitmap', 'MMBIT') then
+         say 'MMBitmap class registration successful'
+      else
+         say 'MMBitmap class registration failed'
+
+      res = SysIni(, 'PM_InstallClassReplacement', 'WPBitmap', 'MMBitmap'x2c('0') )
+      say 'Replacing WPBitmap with MMBitmap successful (res=' res ')'
+   end
+
+
+/* Do CWMMDisk Replacement Class */
+
+      if SysRegisterObjectClass('CWMMDisk', classDLL) then
+         say 'CWMMDisk class registration successful'
+      else
+         say 'CWMMDisk class registration failed'
+
+      res = SysIni(, 'PM_InstallClassReplacement', 'WPDisk', 'CWMMDisk'x2c('0') )
+      say 'Replacing WPDisk with CWMMDisk successful (res=' res ')'
+
+/* Adding INI entries */
+rc=SysIni('USER','CWMM','audioconverter', DIRECTORY()||'\bin\audconv.exe')
+rc=SysIni('USER','CWMM','imageconverter',DIRECTORY()||'\bin\imgconv.exe')
+
+/* Creating volume object */
+rc=SysDestroyObject('<MMPM2_MMVOLUME>')
+rc=SysCreateObject('WPProgram','Volume', "<MMPM2_FOLDER>","EXENAME="||DIRECTORY()||"\bin\volume.exe;OBJECTID=<MMPM2_MMVOLUME>;")
+
+
+SAY ''
+SAY 'You MUST restart the WPS now!'
+SAY ''
+'@PAUSE'
+EXIT
+
Index: /tags/CWMM-0.3.0_GA/classes/doc_and_inst/uninstmm.CMD
===================================================================
--- /tags/CWMM-0.3.0_GA/classes/doc_and_inst/uninstmm.CMD	(revision 213)
+++ /tags/CWMM-0.3.0_GA/classes/doc_and_inst/uninstmm.CMD	(revision 213)
@@ -0,0 +1,215 @@
+/* rexx -  Uninstall the CW-Audio classes */
+
+deinstalling = ''
+
+call RxFuncAdd 'SysLoadFuncs', 'RexxUtil', 'SysLoadFuncs'
+call SysLoadFuncs
+
+call SysCls
+SAY ''
+SAY 'This skript will remove the CWMM classes.'
+SAY 'Do you want to continue?'
+SAY ''
+SAY 'Enter Y for yes and N for no.'
+SAY ''
+SAY '> '
+parse value SysCurPos() with aktzeile aktspalte
+newposition=SysCurPos(aktzeile-1,2)
+
+resp=LINEIN()
+IF TRANSLATE(resp)='N' THEN EXIT
+
+/* Load all the Rexx Util functions */
+call RxFuncAdd 'SysLoadFuncs', 'RexxUtil', 'SysLoadFuncs'
+call SysLoadFuncs
+call RxFuncAdd 'RxWinReplaceObjectClass', 'mmparts', 'RxWinReplaceObjectClass'
+
+
+classDLL=DIRECTORY()||'\cwmm.dll'
+
+SAY 'Degistering new multimedia classes...'
+
+deinstalling = '-R'
+
+MMClasses.   = ''
+MMClasses.1  = 'MMDataFile'
+MMClasses.2  = 'MMImage'
+MMClasses.3  = 'MMAudio'
+MMClasses.4  = 'MMVideo'
+MMClasses.5  = 'MMMIDI'
+MMClasses.6  = 'MMTarga'
+MMClasses.7  = 'MMTIFF'
+MMClasses.8  = 'MMGIF'
+MMClasses.9  = 'MMPCX'
+MMClasses.10 = 'MMPhotoCD'
+MMClasses.11 = 'MMAVC'
+MMClasses.12 = 'MMMMotion'
+MMClasses.13 = 'MMDIB'
+MMClasses.14 = 'MMMP3'
+MMClasses.15 = 'MMOGG'
+MMClasses.16 = 'MMAudioStream'
+MMClasses.17 = 'MMCDTrack'
+MMClasses.18 = 'MMVOC'
+MMClasses.19 = 'MM_AU'
+MMClasses.20 = 'MMAU'
+MMClasses.21 = 'MMAIF'
+MMClasses.22 = 'MMIFF'
+MMClasses.23 = 'MMSNDF'
+MMClasses.24 = 'MMAVI'
+MMClasses.25 = 'MMFLI'
+MMClasses.26 = 'MMMPG'
+MMClasses.27 = 'MMJPG'
+MMClasses.28 = 'MMWAV'
+MMClasses.29 = 'MMMOV'
+MMClasses.30 = 'MMM3U'
+MMClasses.31 = 'MMFolder'
+
+x = 1;
+
+do while MMClasses.x <> ''   /* loop until no more classes */
+   if deinstalling = '-R' then
+      if SysDeregisterObjectClass(MMClasses.x) then
+         say MMClasses.x 'class deregistration successful'
+      else
+         say MMClasses.x 'class deregistration failed'
+   else
+      if SysRegisterObjectClass(MMClasses.x, "mmparts") then
+         say MMClasses.x 'class registration successful'
+      else
+         say MMClasses.x 'class registration failed'
+   x = x + 1
+end
+
+
+/* Do MMBitmap Replacement Class */
+
+if deinstalling = '-R' then
+   do
+      if RxWinReplaceObjectClass('WPBitmap','MMBitmap', '0') then
+         say 'UnReplace MMBitmap successful'
+      else
+         say 'UnReplace MMBitmap failed'
+
+      if SysDeregisterObjectClass('MMBitmap') then
+         say 'MMBitmap class deregistration successful'
+      else
+         say 'MMBitmap class deregistration failed'
+
+   end
+else
+   do
+      if SysRegisterObjectClass('MMBitmap', 'MMBIT') then
+         say 'MMBitmap class registration successful'
+      else
+         say 'MMBitmap class registration failed'
+
+      res = SysIni(, 'PM_InstallClassReplacement', 'WPBitmap', 'MMBitmap'x2c('0') )
+      say 'Replacing WPBitmap with MMBitmap successful (res=' res ')'
+   end
+
+
+/* Do CWMMDisk Replacement Class */
+     if RxWinReplaceObjectClass('WPDisk','CWMMDisk', '0') then
+         say 'UnReplace CWMMDisk successful'
+      else
+         say 'UnReplace CWMMDisk failed'
+
+      if SysDeregisterObjectClass('CWMMDisk') then
+         say 'CWMMDisk class deregistration successful'
+      else
+         say 'CWMMDisk class deregistration failed'
+
+/* Removing INI entries */
+rc=SysIni('USER','CWMM','audioconverter', 'DELETE:')
+rc=SysIni('USER','CWMM','imageconverter', 'DELETE:')
+
+rc=SysDestroyObject('<MMPM2_MMVOLUME>')
+
+/* Register the standard MM classes */
+
+MMClasses.   = ''
+MMClasses.1  = 'MMDataFile'
+MMClasses.2  = 'MMImage'
+MMClasses.3  = 'MMAudio'
+MMClasses.4  = 'MMVideo'
+MMClasses.5  = 'MMMIDI'
+MMClasses.6  = 'MMTarga'
+MMClasses.7  = 'MMTIFF'
+MMClasses.8  = 'MMGIF'
+MMClasses.9  = 'MMPCX'
+MMClasses.10 = 'MMPhotoCD'
+MMClasses.11 = 'MMAVC'
+MMClasses.12 = 'MMMMotion'
+MMClasses.13 = 'MMDIB'
+MMClasses.14 = 'MMDevice'
+MMClasses.15 = 'MMCDDevice'
+MMClasses.16 = 'MMLVDDevice'
+MMClasses.17 = 'MMVolume'
+MMClasses.18 = 'MMVOC'
+MMClasses.19 = 'MM_AU'
+MMClasses.20 = 'MMAU'
+MMClasses.21 = 'MMAIF'
+MMClasses.22 = 'MMIFF'
+MMClasses.23 = 'MMSNDF'
+MMClasses.24 = 'MMAVI'
+MMClasses.25 = 'MMFLI'
+MMClasses.26 = 'MMMPG'
+MMClasses.27 = 'MMJPG'
+MMClasses.28 = 'MMWAV'
+MMClasses.29 = 'MMMOV'
+MMClasses.30 = 'MMFolder'
+MMClasses.31 = 'MMFinder'
+
+deinstalling = ''
+
+x = 1;
+
+do while MMClasses.x <> ''   /* loop until no more classes */
+   if deinstalling = '-R' then
+      if SysDeregisterObjectClass(MMClasses.x) then
+         say MMClasses.x 'class deregistration successful'
+      else
+         say MMClasses.x 'class deregistration failed'
+   else
+      if SysRegisterObjectClass(MMClasses.x, "mmparts") then
+         say MMClasses.x 'class registration successful'
+      else
+         say MMClasses.x 'class registration failed'
+   x = x + 1
+end
+
+
+/* Do MMBitmap Replacement Class */
+
+if deinstalling = '-R' then
+   do
+      if RxWinReplaceObjectClass('WPBitmap','MMBitmap', '0') then
+         say 'UnReplace MMBitmap successful'
+      else
+         say 'UnReplace MMBitmap failed'
+
+      if SysDeregisterObjectClass('MMBitmap') then
+         say 'MMBitmap class deregistration successful'
+      else
+         say 'MMBitmap class deregistration failed'
+
+   end
+else
+   do
+      if SysRegisterObjectClass('MMBitmap', 'MMBIT') then
+         say 'MMBitmap class registration successful'
+      else
+         say 'MMBitmap class registration failed'
+
+      res = SysIni(, 'PM_InstallClassReplacement', 'WPBitmap', 'MMBitmap'x2c('0') )
+      say 'Replacing WPBitmap with MMBitmap successful (res=' res ')'
+   end
+
+
+SAY ''
+SAY 'You MUST restart the WPS now!'
+SAY ''
+
+'@PAUSE'
+Exit
+
Index: /tags/CWMM-0.3.0_GA/classes/exports.DEF
===================================================================
--- /tags/CWMM-0.3.0_GA/classes/exports.DEF	(revision 213)
+++ /tags/CWMM-0.3.0_GA/classes/exports.DEF	(revision 213)
@@ -0,0 +1,274 @@
+DATA MULTIPLE NONSHARED
+
+EXPORTS
+;Audio classes
+        M_MMAudioClassData
+        M_MMAudioCClassData
+        M_MMAudioNewClass
+        MMAudioClassData
+        MMAudioCClassData
+        MMAudioNewClass
+
+        M_MMMP3ClassData
+        M_MMMP3CClassData
+        M_MMMP3NewClass
+        MMMP3ClassData
+        MMMP3CClassData
+        MMMP3NewClass
+
+        M_MMOGGClassData
+        M_MMOGGCClassData
+        M_MMOGGNewClass
+        MMOGGClassData
+        MMOGGCClassData
+        MMOGGNewClass
+
+        M_MMCDTrackClassData
+        M_MMCDTrackCClassData
+        M_MMCDTrackNewClass
+        MMCDTrackClassData
+        MMCDTrackCClassData
+        MMCDTrackNewClass
+
+        M_CWMMDiskClassData
+        M_CWMMDiskCClassData
+        M_CWMMDiskNewClass
+        CWMMDiskClassData
+        CWMMDiskCClassData
+        CWMMDiskNewClass
+
+        M_MMWAVClassData
+        M_MMWAVCClassData
+        M_MMWAVNewClass
+        MMWAVClassData
+        MMWAVCClassData
+        MMWAVNewClass
+
+        M_MMAIFClassData
+        M_MMAIFCClassData
+        M_MMAIFNewClass
+        MMAIFClassData
+        MMAIFCClassData
+        MMAIFNewClass
+
+        M_MMAUClassData
+        M_MMAUCClassData
+        M_MMAUNewClass
+        MMAUClassData
+        MMAUCClassData
+        MMAUNewClass
+
+        M_MM_AUClassData
+        M_MM_AUCClassData
+        M_MM_AUNewClass
+        MM_AUClassData
+        MM_AUCClassData
+        MM_AUNewClass
+
+        M_MMIFFClassData
+        M_MMIFFCClassData
+        M_MMIFFNewClass
+        MMIFFClassData
+        MMIFFCClassData
+        MMIFFNewClass
+
+        M_MMSNDFClassData
+        M_MMSNDFCClassData
+        M_MMSNDFNewClass
+        MMSNDFClassData
+        MMSNDFCClassData
+        MMSNDFNewClass
+
+        M_MMVOCClassData
+        M_MMVOCCClassData
+        M_MMVOCNewClass
+        MMVOCClassData
+        MMVOCCClassData
+        MMVOCNewClass
+
+        M_MMMIDIClassData
+        M_MMMIDICClassData
+        M_MMMIDINewClass
+        MMMIDIClassData
+        MMMIDICClassData
+        MMMIDINewClass
+
+;Video classes
+        M_MMVideoClassData
+        M_MMVideoCClassData
+        M_MMVideoNewClass
+        MMVideoClassData
+        MMVideoCClassData
+        MMVideoNewClass
+
+        M_MMAVIClassData
+        M_MMAVICClassData
+        M_MMAVINewClass
+        MMAVIClassData
+        MMAVICClassData
+        MMAVINewClass
+
+        M_MMFLIClassData
+        M_MMFLICClassData
+        M_MMFLINewClass
+        MMFLIClassData
+        MMFLICClassData
+        MMFLINewClass
+
+        M_MMMOVClassData
+        M_MMMOVCClassData
+        M_MMMOVNewClass
+        MMMOVClassData
+        MMMOVCClassData
+        MMMOVNewClass
+
+        M_MMMPGClassData
+        M_MMMPGCClassData
+        M_MMMPGNewClass
+        MMMPGClassData
+        MMMPGCClassData
+        MMMPGNewClass
+
+;MM-Data file class
+        M_CWMMDataFileClassData
+        M_CWMMDataFileCClassData
+        M_CWMMDataFileNewClass
+        CWMMDataFileClassData
+        CWMMDataFileCClassData
+        CWMMDataFileNewClass
+
+;Image classes
+        M_MMImageClassData
+        M_MMImageCClassData
+        M_MMImageNewClass
+        MMImageClassData
+        MMImageCClassData
+        MMImageNewClass
+
+        M_MMAVCClassData
+        M_MMAVCCClassData
+        M_MMAVCNewClass
+        MMAVCClassData
+        MMAVCCClassData
+        MMAVCNewClass
+
+        M_MMDIBClassData
+        M_MMDIBCClassData
+        M_MMDIBNewClass
+        MMDIBClassData
+        MMDIBCClassData
+        MMDIBNewClass
+
+        M_MMGIFClassData
+        M_MMGIFCClassData
+        M_MMGIFNewClass
+        MMGIFClassData
+        MMGIFCClassData
+        MMGIFNewClass
+
+        M_MMJPGClassData
+        M_MMJPGCClassData
+        M_MMJPGNewClass
+        MMJPGClassData
+        MMJPGCClassData
+        MMJPGNewClass
+
+        M_MMPhotoCDClassData
+        M_MMPhotoCDCClassData
+        M_MMPhotoCDNewClass
+        MMPhotoCDClassData
+        MMPhotoCDCClassData
+        MMPhotoCDNewClass
+
+        M_MMPCXClassData
+        M_MMPCXCClassData
+        M_MMPCXNewClass
+        MMPCXClassData
+        MMPCXCClassData
+        MMPCXNewClass
+
+        M_MMTargaClassData
+        M_MMTargaCClassData
+        M_MMTargaNewClass
+        MMTargaClassData
+        MMTargaCClassData
+        MMTargaNewClass
+
+        M_MMTIFFClassData
+        M_MMTIFFCClassData
+        M_MMTIFFNewClass
+        MMTIFFClassData
+        MMTIFFCClassData
+        MMTIFFNewClass
+
+        M_MMMMotionClassData
+        M_MMMMotionCClassData
+        M_MMMMotionNewClass
+        MMMMotionClassData
+        MMMMotionCClassData
+        MMMMotionNewClass
+
+        M_MMBitmapClassData
+        M_MMBitmapCClassData
+        M_MMBitmapNewClass
+        MMBitmapClassData
+        MMBitmapCClassData
+        MMBitmapNewClass
+
+;Light table folder
+        M_MMFolderClassData
+        M_MMFolderCClassData
+        M_MMFolderNewClass
+        MMFolderClassData
+        MMFolderCClassData
+        MMFolderNewClass
+
+;Audio stream class
+        M_MMAudioStreamClassData
+        M_MMAudioStreamCClassData
+        M_MMAudioStreamNewClass
+        MMAudioStreamClassData
+        MMAudioStreamCClassData
+        MMAudioStreamNewClass
+
+;M3U playlist
+        M_MMM3UClassData
+        M_MMM3UCClassData
+        M_MMM3UNewClass
+        MMM3UClassData
+        MMM3UCClassData
+        MMM3UNewClass
+
+;MMPNG class
+        M_MMPNGClassData
+        M_MMPNGCClassData
+        M_MMPNGNewClass
+        MMPNGClassData
+        MMPNGCClassData
+        MMPNGNewClass
+
+;MMFLAC class
+        M_MMFLACClassData
+        M_MMFLACCClassData
+        M_MMFLACNewClass
+        MMFLACClassData
+        MMFLACCClassData
+        MMFLACNewClass
+
+IMPORTS
+	M_WPImageFileClassData=PMWP.495
+	M_WPImageFileCClassData=PMWP.494
+	M_WPImageFileNewClass=PMWP.496
+	WPImageFileClassData=PMWP.492
+	WPImageFileCClassData=PMWP.491
+	WPImageFileNewClass=PMWP.493
+
+;IMPORTS
+;	MMPARTS.M_MMAudioClassData
+;	MMPARTS.M_MMAudioCClassData
+;	MMPARTS.M_MMAudioNewClass
+;	MMPARTS.MMAudioClassData
+;	MMPARTS.MMAudioCClassData
+;	MMPARTS.MMAudioNewClass
+
+
Index: /tags/CWMM-0.3.0_GA/classes/help/de/cwmm049.ipf
===================================================================
--- /tags/CWMM-0.3.0_GA/classes/help/de/cwmm049.ipf	(revision 213)
+++ /tags/CWMM-0.3.0_GA/classes/help/de/cwmm049.ipf	(revision 213)
@@ -0,0 +1,329 @@
+:userdoc.
+
+:docprof.
+
+:title.Hilfe
+
+.* ----------------------------------------------------------------------------
+:h1 res=010.Hilfe fr MP3-Audiodatei
+:p.Bei dieser Datei handelt es sich um eine MP3-Audiodatei. Sie kann mit MMOS/2
+abgespielt werden, wenn ein geeigneter MP3-MMIOProc installiert wurde.
+
+:p.Das MP3-Format verwendet verlustbehaftete Komprimierung, um die Dateigráe
+des Quellmaterials zu verringern. Der Verlustgrad kann akzeptabel sein oder
+auch nicht. Normalerweise kann der Grad durch das Kodierungstool gesteuert
+werden. Nach der Kodierung ist es jedoch nicht mglich, die verlorenen Bits
+wiederherzustellen. Die Quelldatei muss mit einem geringeren Verlustgrad erneut
+kodiert werden.
+
+:p.Ein MP3 MMIOProc Paket ist im MMAudio Pak 2 enthalten, erhltlich bei&colon.
+
+:p.http&colon.//r6.ca/MMAudioPak/
+
+.* ----------------------------------------------------------------------------
+:h1 res=011.ID3-Tag
+:p.Verwenden Sie diese Seite, um ausgewhlte ID3-Tagfelder zu bearbeiten.
+
+:p.Ein ID3-Tag ist ein Metadatenelement, das mit einem bestimmten Titel
+verknpft ist und in der MP3-Datei gespeichert wird. ID3 ist ein :hp1.de
+facto:ehp1.-Standard, der von den meisten MP3-Playern erkannt wird.
+
+:p.Sind alle Eingabefelder leer, besitzt die Datei keinen ID3-Tag. Sind
+einzelne Felder leer, wurden diese Daten nicht zum Tag hinzugefgt.
+
+:p.Erst nach Drcken der Schaltflche :hp2.Speichern:ehp2. werden die neuen
+Angaben gespeichert.
+
+:p.Folgende Felder knnen eingegeben werden&colon.
+
+:hp2.
+:table rules=both frame=box cols='10 8 40'.
+:row.
+:c.Feld
+:c.Lnge
+:c.Beschreibung
+:row.
+:c.Name
+:c.30
+:c.Der Name des Tracks.
+:row.
+:c.Knstler
+:c.30
+:c.Der Name des Knstlers.
+:row.
+:c.Album
+:c.30
+:c.Das Album, das diesen Track enthlt.
+:row.
+:c.Kommentar
+:c.30
+:c.Ein beliebiger Kommentar.
+:row.
+:c.Jahr
+:c.4
+:c.Das vierstellige Jahr in dem das Album verffentlicht wurde.
+:row.
+:c.Genre
+:c.30
+:c.Das Genre zu dem der Track gehrt; Auswahl aus einem Auswahlfeld.
+:etable.
+:ehp2.
+
+.* ----------------------------------------------------------------------------
+.* ID3 Helppanel for objects on CD.
+:h1 res=013.ID3-Tag
+:p.Diese Seite zeigt die ID3-Informationen der MP3-Datei an.
+
+:p.Ein ID3-Tag ist ein Metadatenelement, das mit einem bestimmten Titel
+verknpft ist und in der MP3-Datei gespeichert wird. ID3 ist ein :hp1.de
+facto:ehp1.-Standard, der von den meisten MP3-Playern erkannt wird.
+
+:p.Wenn die Eingabefelder leer sind, so bedeutet dies, dass die MP3-Datei
+kein ID3-Tag enthlt.
+
+:p.Erst nach Drcken der Schaltflche :hp2.Speichern:ehp2. werden die neuen
+Angaben gespeichert.
+
+Folgenden Felder werden angezeigt&colon.
+
+:hp2.
+:table rules=both frame=box cols='10 8 40'.
+:row.
+:c.Feld
+:c.Lnge
+:c.Beschreibung
+:row.
+:c.Name
+:c.30
+:c.Der Name des Tracks.
+:row.
+:c.Knstler
+:c.30
+:c.Der Name des Knstlers.
+:row.
+:c.Album
+:c.30
+:c.Das Album, das diesen Track enthlt.
+:row.
+:c.Kommentar
+:c.30
+:c.Ein beliebiger Kommentar zu diesem Track.
+:row.
+:c.Jahr
+:c.4
+:c.Das vierstellige Jahr in dem das Album verffentlicht wurde.
+:row.
+:c.Genre
+:c.30
+:c.Das Genre zu dem der Track gehrt; Auswahl aus einem Auswahlfeld.
+:etable.
+:ehp2.
+
+.* ----------------------------------------------------------------------------
+:h1 res=012.Metadaten des Tracks
+:p.Auf dieser Seite knnen Sie Track-Informationen bearbeiten. Im Gegensatz zu
+einem ID3-Tag wird der Inhalt dieser Felder in den erweiterten Attributen der
+Datei gespeichert, wenn Sie die Schaltflche :hp2.Speichern:ehp2. drcken.
+
+:nt.
+Erweiterte Attribute werden nur von OS/2 und anderen Betriebssystemen
+untersttzt, die diese Datenstrukturen in ihren Dateisystemen verwenden (HPFS,
+JFS, XFS, ZFS und in begrenztem Umfang ext4). Darber hinaus werden diese
+Informationen nicht auf CD oder DVD geschrieben. Daher werden diese Daten nicht
+zusammen mit den zugehrigen Dateien auf einem System gespeichert oder
+bertragen, das erweiterte Attribute nicht erkennt. Dies fhrt dazu, dass diese
+Daten in solchen Kopien fehlen, selbst wenn sie in der Quelle vorhanden und
+intakt sind. Verwenden Sie diese Funktion mit Vorsicht.
+:ent.
+
+Die folgenden Felder knnen gendert werden. Jeder Eintrag kann maximal 256
+Zeichen lang sein&colon.
+
+:hp2.
+:table rules=both frame=box cols='10 40'.
+:row.
+:c.Feld
+:c.Beschreibung
+:row.
+:c.Name
+:c.Der Name des Tracks.
+:row.
+:c.Knstler
+:c.Der Name des Knstlers.
+:row.
+:c.Album
+:c.Das Album, das diesen Track enthlt.
+:row.
+:c.Kommentar
+:c.Ein beliebiger Kommentar zu diesem Track.
+:row.
+:c.Jahr
+:c.Das vierstellige Jahr in dem das Album verffentlicht wurde.
+:row.
+:c.Genre
+:c.Das Genre zu dem der Track gehrt; Auswahl aus einem Auswahlfeld.
+:etable.
+:ehp2.
+
+.* ----------------------------------------------------------------------------
+:h1 res=014.Audiodetails
+:p.Auf dieser Seite werden verschiedene technische Details zum ausgewhlten
+Audiotitel angezeigt.
+
+:p.Die folgenden schreibgeschtzten Informationen werden bereitgestellt&colon.
+
+:hp2.
+:table rules=both frame=box cols='20 40'.
+:row.
+:c.Detail
+:c.Beschreibung
+:row.
+:c.Spielzeit
+:c.Aufnahmezeit in mm&colon.ss.
+:row.
+:c.Abtastrate
+:c.Bei digitalem Audio bezieht sich dies auf die Anzahl der pro Sekunde
+entnommenen Samples. Im Allgemeinen gilt: Je hher die Abtastrate
+(Abtastfrequenz), desto hher die Qualitt des resultierenden Audiostreams.
+:row.
+:c.Bits pro Sample
+:c.Bittiefe pro Sample. Je hher die Bittiefe, desto hher die Qualitt des
+resultierenden Audiostreams. Audio in CD-Qualitt verwendet eine Bittiefe von
+16 Bit.
+:row.
+:c.Kanle
+:c.Anzahl der Audiokanle in der Datei. Mono-Audio enthlt einen einzigen
+Kanal, Stereo zwei usw.
+:etable.
+:ehp2.
+
+.* ----------------------------------------------------------------------------
+:h1 res=020.Hilfe fr Ogg-Audiodatei
+:p.Diese Datei ist eine Ogg-Audiodatei. Sie kann mit MMOS/2 abgespielt werden,
+wenn ein geeignetes Ogg MMIOProc installiert wurde. Ogg ist eigentlich ein
+Containerformat und kann aus Audio (Vorbis- oder Opus-Format fr verlustbehaftet
+komprimiertes Audio oder FLAC oder OggPCM fr verlustfrei komprimiertes Audio)
+oder Video (Theora-Format, das verlustbehaftet ist) bestehen.
+
+:p.Der Verlustgrad einer Vorbis- oder Opus-Audiodatei kann akzeptabel sein
+oder auch nicht. Normalerweise kann der Verlustgrad durch das Kodierungstool
+gesteuert werden. Nach der Kodierung ist es jedoch nicht mglich, die
+verlorenen Bits wiederherzustellen, ohne die Quelldatei mit einem geringeren
+Verlustgrad erneut zu kodieren.
+
+:p.Ogg MMIOProcs fr FLAC und Vorbis sind in ArcaOS 5.x und hher enthalten.
+Alternativ sind diese MMIOProcs im MMAudio Pak 2 fr OS/2 verfgbar&colon.
+
+:p.http&colon.//r6.ca/MMAudioPak/
+
+.* ----------------------------------------------------------------------------
+:h1 res=030.Hilfe fr CD-Track
+:p.Diese Datei ist ein CD-Audiotitel. Der Titelname und andere Informationen
+werden von einem CDDB-Server abgefragt, wenn eine Internetverbindung verfgbar
+ist. Die hier angezeigten Informationen sind schreibgeschtzt.
+
+:p.Die meisten CDDB-Server folgen der FreeDB-Praxis und verlangen fr den
+Zugriff eine gltige E-Mail-Adresse. Verwenden Sie das
+FreeDB-Client-Konfigurationsobjekt im Ordner "Multimedia", um dies festzulegen.
+
+:p.Die Benutzerinformationen werden in der Datei cddb.ini im
+Installationsverzeichnis gespeichert.
+
+.* ----------------------------------------------------------------------------
+:h1 res=040.Hilfe fr M3U-Spielliste
+:p.Diese Datei ist eine M3U-Wiedergabeliste (Moving Picture Experts Group Audio
+Layer 3 Uniform Resource Locator). M3U ist ein :hp1.de facto:ehp1.-Standard, der
+im Allgemeinen von den meisten Musikplayern erkannt wird.
+
+:p.Eine M3U-Wiedergabeliste ist eine Textdatei, die Pfade (URLs) zu den Titeln
+enthlt, auf die sie verweist.
+
+:p.Um eine Wiedergabeliste zu erstellen, ziehen Sie die
+M3U-Wiedergabelistenvorlage aus dem Ordner "Multimediavorlagen" an eine
+geeignete Stelle auf dem Desktop. Ziehen Sie Mediendateien per Drag &colon. Drop
+in den Wiedergabelistencontainer. Um die Reihenfolge zu ndern, stellen Sie
+sicher, dass die Option :hp1.Sortierreihenfolge immer beibehalten:ehp1. im
+Untermen :hp2.Sortieren:ehp2. deaktiviert ist, ebenso wie alle anderen
+Sortieroptionen, die die manuelle Sortierung beeinflussen knnten, und ziehen
+Sie die Titel per Drag &colon. Drop wie gewnscht. Speichern Sie die
+Wiedergabeliste, indem Sie im Men :hp2.Datei | Speichern:ehp2. auswhlen.
+
+.* ----------------------------------------------------------------------------
+:h1 res=050.Hilfe fr Audio-Stream
+:p.Mit diesem Objekt knnen Audio-Streams von Internet-Radiostationen gehrt
+werden. Die erforderliche URL kann im Einstellungen-Notizbuch eingetragen
+werden.
+
+:nt.
+Zur Zeit werden ausschlieálich Icecast-Server untersttzt. Server, die das
+Ampache-, SHOUTcast-, QuickTime Broadcaster-, Open Broadcast-, usw. -Protokoll
+verwenden, knnen nicht angehrt werden.
+:ent.
+
+.* ----------------------------------------------------------------------------
+:h1 res=060.Audiodatei konvertieren
+:p.Geben Sie den Ziel-Audiodateityp und -dateinamen an, einschlieálich des
+vollstndigen Pfads. Details zur Quell-Audiodatei werden oben im Dialogfeld
+angezeigt. Beachten Sie, dass einige Formate verlustbehafteter sein knnen als
+andere. Beim Konvertieren von einem verlustbehafteten Format in ein weniger
+verlustbehaftetes (oder verlustfreies) Format werden die ursprnglichen Bits
+nicht wiederhergestellt, da diese in der (verlustbehafteten) Quelldatei
+mglicherweise nicht mehr vorhanden sind. In einigen Fllen kann dies zu einer
+konvertierten Datei mit geringerer Qualitt als die verlustbehaftete Quelle
+fhren.
+
+:p.Das Auswahlfeld listet zur Verfgung stehende MMIOProcs (Codecs) zur
+Konvertierung auf.
+
+:p.Drcken sie die Schaltflche :hp2.Konvertieren:ehp2. um mit der
+Konvertierung zu beginnen, und :hp2.Abbrechen:ehp2. um die Konvertierung
+abzubrechen. Drcken sie :hp2.Schlieáen:ehp2. um den Dialog zu verlassen.
+
+.* ----------------------------------------------------------------------------
+:h1 res=200.Bilddetails
+:p.Auf dieser Seite werden verschiedene technische Details zum ausgewhlten Bild
+angezeigt.
+
+:p.Die folgenden schreibgeschtzten Informationen werden bereitgestellt&colon.
+
+:hp2.
+:table rules=both frame=box cols='20 40'.
+:row.
+:c.Detail
+:c.Beschreibung
+:row.
+:c.IOProc
+:c.Identifiziert, welcher MMIOProc zum Rendern des Bildes verwendet wird.
+:row.
+:c.Breite
+:c.Breite des Bildes in Pixeln.
+:row.
+:c.Hhe
+:c.Hhe des Bildes in Pixeln.
+:row.
+:c.Farbtiefe
+:c.Anzahl der Farben (Farbtiefe) des Bildes.
+:etable.
+:ehp2.
+
+.* ----------------------------------------------------------------------------
+:h1 res=210.Digitales Bild konvertieren
+:p.Geben Sie den Zielbilddateityp und den Dateinamen an, einschlieálich des
+vollstndigen Pfads. Oben im Dialogfeld wird eine Miniaturansicht der
+Quellbilddatei angezeigt. Beachten Sie, dass einige Formate verlustbehafteter
+sein knnen als andere. Beim Konvertieren von einem verlustbehafteten Format in
+ein weniger verlustbehaftetes (oder verlustfreies) Format werden die
+ursprnglichen Bits nicht wiederhergestellt, da diese in der (verlustbehafteten)
+Quelldatei mglicherweise nicht mehr vorhanden sind. In einigen Fllen kann dies
+zu einer konvertierten Datei mit geringerer Qualitt als die verlustbehaftete
+Quelle fhren.
+
+:p.In der Auswahl-Liste werden die verfgbaren MMIOProcs (Codecs) fr die
+Zieldatei aufgelistet.
+
+:p.Klicken Sie auf die Schaltflche :hp2.Konvertieren:ehp2., um den Vorgang zu
+starten und auf :hp2.Abbrechen:ehp2., um den Vorgang abzubrechen, sobald die
+Konvertierung begonnen hat. Klicken Sie auf :hp2.Schlieáen:ehp2., um den Dialog
+zu verlassen.
+
+:euserdoc.
Index: /tags/CWMM-0.3.0_GA/classes/help/de/makefile
===================================================================
--- /tags/CWMM-0.3.0_GA/classes/help/de/makefile	(revision 213)
+++ /tags/CWMM-0.3.0_GA/classes/help/de/makefile	(revision 213)
@@ -0,0 +1,67 @@
+# Makefile
+
+include ../../../make.inc
+
+LANGUAGE	= 049
+DISTNAME	=	cwaudio-classes-$(VERSION)
+CC           = icc
+
+LDFLAGS =	-Ge- /Gm+ -G4 /ss -Gl /O+ -Oc+ -Ol-  /Q+ 
+CFLAGS       =   -Ge- /Gm+ -G4 /ss -Gl /O+ -Oc+ -Ol- /Q+ /C
+
+LIBS		=	somtk.lib mmPM2.lib rexx.lib
+DEFS		= 
+
+
+
+OBJECTS	= 
+
+all: cwmm$(LANGUAGE).hlp
+
+cwmm$(LANGUAGE).hlp:	cwmm$(LANGUAGE).ipf
+	ipfc -C:850 -L:DEU -D:49 cwmm$(LANGUAGE).ipf cwmm$(LANGUAGE).hlp       
+
+
+clean:
+	-rm *.hlp
+
+cleaner:
+	-rm *.*~
+
+german:
+	-cd ..\. && mkdir CWAudio-$(VERSION)-ger
+	-cd ..\CWAudio-$(VERSION)-ger && rm -r *
+	-cd ..\CWAudio-$(VERSION)-ger && mkdir old_inst
+	-cp ./old_inst/* ..\CWAudio-$(VERSION)-ger/old_inst/
+	-cp ./cwmm.dll ../CWAudio-$(VERSION)-ger
+	-cp ./setFolder.cmd ../CWAudio-$(VERSION)-ger 	
+	-cp ./ger/Readme.ger ../CWAudio-$(VERSION)-ger
+	-cp ./FILE_ID.DIZ ../CWAudio-$(VERSION)-ger
+	-cp ./cwmm049.hlp ../CWAudio-$(VERSION)-ger/cwmm.hlp
+	-cp ./ger/cwaudio.ins ../CWAudio-$(VERSION)-ger
+	-cp ./ger/Lizenz ../CWAudio-$(VERSION)-ger
+	-rc ./cwaudio049.rc ../CWAudio-$(VERSION)-ger/cwmm.dll
+	-cd ..\CWAudio-$(VERSION)-ger && lxlite *
+#	-cd ../CWAudio-$(VERSION)-ger && zip -r $(DISTNAME)-ger.zip *
+
+english:
+	-cd ..\. && mkdir CWAudio-$(VERSION)-eng
+	-cd ..\CWAudio-$(VERSION)-eng && rm -r *
+	-cd ..\CWAudio-$(VERSION)-eng && mkdir old_inst
+	-cp ./old_inst/* ..\CWAudio-$(VERSION)-eng\old_inst
+	-cp ./cwmm.dll ../CWAudio-$(VERSION)-eng 	
+	-cp ./cwmm.hlp ../CWAudio-$(VERSION)-eng
+	-cp ./setFolder.cmd ../CWAudio-$(VERSION)-eng 	
+	-cp ./eng/Readme.eng ../CWAudio-$(VERSION)-eng 	
+	-cp ./FILE_ID.DIZ ../CWAudio-$(VERSION)-eng
+	-cp ./eng/cwaudio.ins ../CWAudio-$(VERSION)-eng
+	-cp ./eng/License ../CWAudio-$(VERSION)-eng
+	-cd ..\CWAudio-$(VERSION)-eng && lxlite *
+#	-cd ../CWAudio-$(VERSION)-eng && zip -r $(DISTNAME)-eng.zip *
+
+distribution:
+	make
+	-make german
+	make english
+
+
Index: /tags/CWMM-0.3.0_GA/classes/help/en/cwmm.ipf
===================================================================
--- /tags/CWMM-0.3.0_GA/classes/help/en/cwmm.ipf	(revision 213)
+++ /tags/CWMM-0.3.0_GA/classes/help/en/cwmm.ipf	(revision 213)
@@ -0,0 +1,306 @@
+:userdoc.
+:docprof.
+:title.CWMM Help
+
+.* ----------------------------------------------------------------------------
+:h1 res=010.MP3 audio file
+:p.This file is an MP3 audio file. It may be played using MMOS/2 when a suitable
+MP3 MMIOProc has been installed.
+
+:p.The MP3 format uses lossy compression to reduce the file size of the source
+material. The amount of loss may or may not be acceptable. Usually, the amount
+may be controlled by the encoding tool. Once encoded, however, it is not
+possible to restore the bits which have been discarded. The source file must be
+re-encoded again with a lower degree of loss.
+
+:p.An MP3 MMIOProc package is included in the MMAudio Pak 2, available from&colon.
+
+:p.http&colon.//r6.ca/MMAudioPak/
+
+.* ----------------------------------------------------------------------------
+:h1 res=011.ID3 tag
+:p.Use this page to edit selected ID3 tag fields.
+
+:p.An ID3 tag is metadata associated with a particular track, and is stored in
+the MP3 file. ID3 is a :hp1.de facto:ehp1. standard, generally recognized by
+most MP3 players.
+
+:p.If all entry fields are empty, the file does not have an ID3 tag. If some
+fields are empty, this data has not been added to the tag.
+
+:p.The new information is only saved after pressing the :hp2.Save:ehp2. button.
+
+:p.The following information may be specified:
+
+:hp2.
+:table rules=both frame=box cols='10 8 40'.
+:row.
+:c.Field
+:c.Length
+:c.Description
+:row.
+:c.Name
+:c.30
+:c.The name of the track.
+:row.
+:c.Artist
+:c.30
+:c.The name of the artist.
+:row.
+:c.Album
+:c.30
+:c.The album containing the track.
+:row.
+:c.Comment
+:c.30
+:c.An arbitrary comment about the track.
+:row.
+:c.Year
+:c.4
+:c.The 4-digit year in which the album was published.
+:row.
+:c.Genre
+:c.30
+:c.The genre of this track; select from dropdown.
+:etable.
+:ehp2.
+
+.* ----------------------------------------------------------------------------
+:h1 res=013.ID3 tag
+:p.This page displays selected fields of the ID3 tag attached to the MP3 file.
+
+:p.An ID3 tag is metadata associated with a particular track, and is stored in
+the MP3 file. ID3 is a :hp1.de facto:ehp1. standard, generally recognized by
+most MP3 players.
+
+:p.If all entry fields are empty, the file does not have an ID3 tag. If some
+fields are empty, this data has not been added to the tag.
+
+:p.The new information is only saved after pressing the :hp2.Save:ehp2. button.
+
+:p.The following information may be specified:
+
+:hp2.
+:table rules=both frame=box cols='10 8 40'.
+:row.
+:c.Field
+:c.Length
+:c.Description
+:row.
+:c.Name
+:c.30
+:c.The name of the track.
+:row.
+:c.Artist
+:c.30
+:c.The name of the artist.
+:row.
+:c.Album
+:c.30
+:c.The album containing the track.
+:row.
+:c.Comment
+:c.30
+:c.An arbitrary comment about the track.
+:row.
+:c.Year
+:c.4
+:c.The 4-digit year in which the album was published.
+:row.
+:c.Genre
+:c.30
+:c.The genre of this track; select from dropdown.
+:etable.
+:ehp2.
+
+.* ----------------------------------------------------------------------------
+:h1 res=012.Track meta data
+:p.Use this page to edit track information. Unlike an ID3 tag, the contents of
+these fields will be saved in the extended attributes of the file upon pressing
+the :hp2.Save:ehp2. button.
+
+:nt.
+Extended attributes are only supported by OS/2 and other operating systems which
+utilize these data structures in their filesystems (HPFS, JFS, XFS, ZFS, and to
+a limited extent, ext4). Further, this information is not written to CD or DVD.
+As a result, this data won't be saved or transferred along with its associated
+files to any system which does not recognize extended attributes, resulting in
+such copies lacking this data, even if it is present and intact in the source.
+Use this feature with care.
+:ent.
+
+:p.The following information may be specified. The length of each field is
+limited to 256 characters
+
+:hp2.
+:table rules=both frame=box cols='10 40'.
+:row.
+:c.Field
+:c.Description
+:row.
+:c.Name
+:c.The name of the track.
+:row.
+:c.Artist
+:c.The name of the artist.
+:row.
+:c.Album
+:c.The album containing the track.
+:row.
+:c.Comment
+:c.An arbitrary comment about the track.
+:row.
+:c.Year
+:c.The 4-digit year in which the album was published.
+:row.
+:c.Genre
+:c.The genre of this track; select from dropdown.
+:etable.
+:ehp2.
+
+.* ----------------------------------------------------------------------------
+:h1 res=014.Audio details
+:p.This page displays various technical details about the selected audio track.
+
+:p.The following read-only information is provided&colon.
+
+:hp2.
+:table rules=both frame=box cols='20 40'.
+:row.
+:c.Detail
+:c.Description
+:row.
+:c.Play time
+:c.Recording length in mm&colon.ss.
+:row.
+:c.Sample rate
+:c.For digital audio, this refers to the number of samples taken per second.
+Generally, the higher the sample rate (sample frequency), the higher the quality
+of the resulting audio stream.
+:row.
+:c.Bits per sample
+:c.Bit depth of each sample. The greater the bit depth, the higher the quality of
+the resulting audio stream. CD quality audio utilizes a 16-bit depth.
+:row.
+:c.Channels
+:c.Number of audio channels in the file. Monaural audio contains a single
+channel, stereo contains two, etc.
+:etable.
+:ehp2.
+
+.* ----------------------------------------------------------------------------
+:h1 res=020.Ogg audio file
+:p.This file is an Ogg audio file. It may be played using MMOS/2 when a suitable
+Ogg MMIOProc has been installed. Ogg is actually a container format, and may
+consist of audio (Vorbis or Opus format for lossy compressed audio, or FLAC or
+OggPCM for lossless compressed audio) or video (Theora format, which is lossy).
+
+:p.The amount of loss in a Vorbis or Opus audio file may or may not be
+acceptable. Usually, the amount may be controlled by the encoding tool. Once
+encoded, however, it is not possible to restore the bits which have been
+discarded without re-encoding the source file again with a lower degree of loss.
+
+:p.Ogg MMIOProcs for FLAC and Vorbis are included with ArcaOS 5.x and above.
+Alternatively, these MMIOProcs are available in the MMAudio Pak 2 for OS/2&colon.
+
+:p.http&colon.//r6.ca/MMAudioPak/
+
+.* ----------------------------------------------------------------------------
+:h1 res=030.CD audio track
+:p.This file is a CD audio track. The track name and other info is queried from
+a CDDB server if an internet connection is available. The information presented
+here is read-only.
+
+:p.Most CDDB servers follow the FreeDB practice of requiring a valid email
+address for access. Use the FreeDB Client configuration object in the Multimedia
+folder to set this.
+
+:p.The user information is stored in the cddb.ini file in the installation
+directory.
+
+.* ----------------------------------------------------------------------------
+:h1 res=040.M3U playlist
+:p.This file is an M3U (Moving Picture Experts Group Audio Layer 3 Uniform
+Resource Locator) playlist. M3U is a :hp1.de facto:ehp1. standard, generally
+recognized by most music players.
+
+:p.An M3U playlist is a text file which contains paths (URLs) to the tracks it
+references.
+
+:p.To create a playlist, drag the M3U playlist template from the Multimedia
+Templates folder to a suitable location on the desktop. Drag and drop media
+files in the playlist container. To reorder, ensure that :hp1.Always maintain
+sort order:ehp1. option on the :hp2.Sort:ehp2. submenu is deselected, as well
+as any other sort options which might affect manual ordering, and drag and drop
+the tracks as desired. Save the playlist by selecting :hp2.File | Save:ehp2.
+from the menu.
+
+.* ----------------------------------------------------------------------------
+:h1 res=050.Audio stream
+:p.This object points to a stream provided by a streaming server on the LAN or
+across the internet. The URL for the server is specified in the properties
+notebook for the stream.
+
+:nt.
+Only Icecast servers are supported. Servers using other protocols (Ampache,
+SHOUTcast, QuickTime Broadcaster, Open Broadcast System, etc.) will not work.
+:ent.
+
+.* ----------------------------------------------------------------------------
+:h1 res=060.Convert audio file
+:p.Specify the target audio file type and filename, including the full path.
+Source audio file details are displayed at the top of the dialog. Note that some
+formats may be more lossy than others, and converting from a lossy format to a
+less-lossy (or lossless) format will not restore original bits which may no
+longer be present in the (lossy) source file, and in some cases, may result in
+a converted file of lower quality than the lossy source.
+
+:p.The dropdown will list available MMIOProcs (codecs) for the target file.
+
+:p.Press the :hp2.Convert:ehp2. button to begin the process, and
+:hp2.Abort:ehp2. to cancel once conversion has begun. Press :hp2.Close:ehp2. to
+exit the dialog.
+
+
+.* ----------------------------------------------------------------------------
+:h1 res=200.Image details
+:p.This page displays various technical details about the selected image.
+
+:p.The following read-only information is provided&colon.
+
+:hp2.
+:table rules=both frame=box cols='20 40'.
+:row.
+:c.Detail
+:c.Description
+:row.
+:c.IOProc
+:c.Identifies which MMIOProc is being used to render the image.
+:row.
+:c.Width
+:c.Width in pixels of the image.
+:row.
+:c.Height
+:c.Height in pixels of the image.
+:row.
+:c.Depth
+:c.Number of colors (color depth) of the image.
+:etable.
+:ehp2.
+
+.* ----------------------------------------------------------------------------
+:h1 res=210.Convert digital image
+:p.Specify the target image file type and filename, including the full path.
+A thumbnail of the source image file is displayed at the top of the dialog. Note
+that some formats may be more lossy than others, and converting from a lossy
+format to a less-lossy (or lossless) format will not restore original bits which
+may no longer be present in the (lossy) source file, and in some cases, may
+result in a converted file of lower quality than the lossy source.
+
+:p.The dropdown will list available MMIOProcs (codecs) for the target file.
+
+:p.Press the :hp2.Convert:ehp2. button to begin the process, and
+:hp2.Abort:ehp2. to cancel once conversion has begun. Press :hp2.Close:ehp2. to
+exit the dialog.
+
+:euserdoc.
Index: /tags/CWMM-0.3.0_GA/classes/help/en/makefile
===================================================================
--- /tags/CWMM-0.3.0_GA/classes/help/en/makefile	(revision 213)
+++ /tags/CWMM-0.3.0_GA/classes/help/en/makefile	(revision 213)
@@ -0,0 +1,67 @@
+# Makefile
+
+include ../../../make.inc
+
+LANGUAGE	= 
+DISTNAME	=	cwaudio-classes-$(VERSION)
+CC           = icc
+
+LDFLAGS =	-Ge- /Gm+ -G4 /ss -Gl /O+ -Oc+ -Ol-  /Q+ 
+CFLAGS       =   -Ge- /Gm+ -G4 /ss -Gl /O+ -Oc+ -Ol- /Q+ /C
+
+LIBS		=	somtk.lib mmPM2.lib rexx.lib
+DEFS		= 
+
+
+
+OBJECTS	= 
+
+all: cwmm$(LANGUAGE).hlp
+
+cwmm$(LANGUAGE).hlp:	cwmm$(LANGUAGE).ipf
+	ipfc -C:850 -L:ENG cwmm$(LANGUAGE).ipf  cwmm$(LANGUAGE).hlp      
+
+
+clean:
+	-rm *.hlp
+
+cleaner:
+	-rm *.*~
+
+german:
+	-cd ..\. && mkdir CWAudio-$(VERSION)-ger
+	-cd ..\CWAudio-$(VERSION)-ger && rm -r *
+	-cd ..\CWAudio-$(VERSION)-ger && mkdir old_inst
+	-cp ./old_inst/* ..\CWAudio-$(VERSION)-ger/old_inst/
+	-cp ./cwmm.dll ../CWAudio-$(VERSION)-ger
+	-cp ./setFolder.cmd ../CWAudio-$(VERSION)-ger 	
+	-cp ./ger/Readme.ger ../CWAudio-$(VERSION)-ger
+	-cp ./FILE_ID.DIZ ../CWAudio-$(VERSION)-ger
+	-cp ./cwmm049.hlp ../CWAudio-$(VERSION)-ger/cwmm.hlp
+	-cp ./ger/cwaudio.ins ../CWAudio-$(VERSION)-ger
+	-cp ./ger/Lizenz ../CWAudio-$(VERSION)-ger
+	-rc ./cwaudio049.rc ../CWAudio-$(VERSION)-ger/cwmm.dll
+	-cd ..\CWAudio-$(VERSION)-ger && lxlite *
+#	-cd ../CWAudio-$(VERSION)-ger && zip -r $(DISTNAME)-ger.zip *
+
+english:
+	-cd ..\. && mkdir CWAudio-$(VERSION)-eng
+	-cd ..\CWAudio-$(VERSION)-eng && rm -r *
+	-cd ..\CWAudio-$(VERSION)-eng && mkdir old_inst
+	-cp ./old_inst/* ..\CWAudio-$(VERSION)-eng\old_inst
+	-cp ./cwmm.dll ../CWAudio-$(VERSION)-eng 	
+	-cp ./cwmm.hlp ../CWAudio-$(VERSION)-eng
+	-cp ./setFolder.cmd ../CWAudio-$(VERSION)-eng 	
+	-cp ./eng/Readme.eng ../CWAudio-$(VERSION)-eng 	
+	-cp ./FILE_ID.DIZ ../CWAudio-$(VERSION)-eng
+	-cp ./eng/cwaudio.ins ../CWAudio-$(VERSION)-eng
+	-cp ./eng/License ../CWAudio-$(VERSION)-eng
+	-cd ..\CWAudio-$(VERSION)-eng && lxlite *
+#	-cd ../CWAudio-$(VERSION)-eng && zip -r $(DISTNAME)-eng.zip *
+
+distribution:
+	make
+	-make german
+	make english
+
+
Index: /tags/CWMM-0.3.0_GA/classes/help/es/cwmm034.ipf
===================================================================
--- /tags/CWMM-0.3.0_GA/classes/help/es/cwmm034.ipf	(revision 213)
+++ /tags/CWMM-0.3.0_GA/classes/help/es/cwmm034.ipf	(revision 213)
@@ -0,0 +1,328 @@
+:userdoc.
+:docprof.
+:title.Ayuda de las clases multimedia CWMM
+
+.* ----------------------------------------------------------------------------
+:h1 res=010.Archivo de audio MP3
+:p.ste es un archivo de audio MP3. Se puede reproducir usando MMOS/2 si se ha
+instalado un procedimiento E/S multimedia (MMIOProc) para MP3 adecuado.
+
+:p.El formato MP3 utiliza compresi¢n con prdida para reducir el tama€o de
+archivo del material de origen. El nivel de prdida puede ser aceptable o no.
+Normalmente, la prdida puede controlarse en la herramienta de compresi¢n
+utilizada, pero una vez que el archivo de origen se comprime durante la
+codificaci¢n, no se pueden recuperar los datos descartados. Hay que volver a
+codificar el archivo de origen con un grado menor de prdida por compresi¢n.
+
+:p.MMAudio Pak 2 incluye un procedimiento E/S multimedia (MMIOProc) para MP3.
+Se encuentra disponible en:
+
+:p.http&colon.//r6.ca/MMAudioPak/
+
+.* ----------------------------------------------------------------------------
+:h1 res=011.Etiqueta ID3
+:p.Utilice esta p gina para editar los campos seleccionados de una etiqueta
+ID3.
+
+:p.Una etiqueta ID3 es un conjunto de metadatos asociados con cada pista de
+audio en particular, que se almacena en el archivo MP3. ID3 es un est ndar
+:hp1.de facto:ehp1., generalmente reconocido por la mayor¡a de reproductores
+MP3.
+
+:p.Si todos los campos de entrada est n vac¡os, el archivo no tiene una
+etiqueta ID3. Si algunos campos est n vac¡os, los datos no se han a€adido a la
+etiqueta.
+
+:p.S¢lo se guarda la nueva informaci¢n al pulsar el bot¢n :hp2.Guardar:ehp2..
+
+:p.Se puede especificar la siguiente informaci¢n:
+
+:hp2.
+:table rules=both frame=box cols='10 8 40'.
+:row.
+:c.Campo
+:c.Longitud
+:c.Descripci¢n
+:row.
+:c.Nombre
+:c.30
+:c.El nombre de la pista.
+:row.
+:c.Artista
+:c.30
+:c.El nombre del artista.
+:row.
+:c.µlbum
+:c.30
+:c.El  lbum que contiene la pista.
+:row.
+:c.Comentario
+:c.30
+:c.Un comentario arbitrario sobre la pista.
+:row.
+:c.A€o
+:c.4
+:c.El a€o (con cuatro cifras) en que se public¢ el  lbum.
+:row.
+:c.Gnero
+:c.30
+:c.El gnero al que pertenece la pista; selecci¢nelo de la lista.
+:etable.
+:ehp2.
+
+.* ----------------------------------------------------------------------------
+:h1 res=013.Etiqueta ID3
+:p.Esta p gina muestra los campos seleccionados de la etiqueta ID3 incluida en
+el archivo MP3.
+
+:p.Una etiqueta ID3 es un conjunto de metadatos asociados con cada pista de
+audio en particular, que se almacena en el archivo MP3. ID3 es un est ndar
+:hp1.de facto:ehp1., generalmente reconocido por la mayor¡a de reproductores
+MP3.
+
+:p.Si todos los campos de entrada est n vac¡os, el archivo no tiene una
+etiqueta ID3. Si algunos campos est n vac¡os, los datos no se han a€adido a la
+etiqueta.
+
+:p.S¢lo se guarda la nueva informaci¢n al pulsar el bot¢n :hp2.Guardar:ehp2..
+
+:p.Se puede especificar la siguiente informaci¢n:
+
+:hp2.
+:table rules=both frame=box cols='10 8 40'.
+:row.
+:c.Campo
+:c.Longitud
+:c.Descripci¢n
+:row.
+:c.Nombre
+:c.30
+:c.El nombre de la pista.
+:row.
+:c.Artista
+:c.30
+:c.El nombre del artista.
+:row.
+:c.µlbum
+:c.30
+:c.El  lbum que contiene la pista.
+:row.
+:c.Comentario
+:c.30
+:c.Un comentario arbitrario sobre la pista.
+:row.
+:c.A€o
+:c.4
+:c.El a€o (con cuatro cifras) en que se public¢ el  lbum.
+:row.
+:c.Gnero
+:c.30
+:c.El gnero al que pertenece la pista; selecci¢nelo de la lista.
+:etable.
+:ehp2.
+
+.* ----------------------------------------------------------------------------
+:h1 res=012.Metainformaci¢n
+:p.Use esta p gina para editar la metainformaci¢n sobre la pista. A diferencia
+de las etiquetas ID3, al pulsar el bot¢n :hp2.Guardar:ehp2. el contenido de
+estos campos se guardar  en los atributos extendidos del archivo.
+
+:nt.
+Los atributos extendidos s¢lo tienen soporte en OS/2 y otros sistemas
+operativos que utilicen estas estructuras de datos en sus sistemas de archivos
+(HPFS, JFS, XFS, ZFS y, hasta cierto punto, ext4). Adem s, esta informaci¢n no
+se almacena en CD ni DVD. Como resultado, estos datos no se guardar n en, ni se
+transferir n junto a sus archivos asociados a ning£n sistema que no reconozca
+los atributos extendidos, careciendo de ellos tales copias incluso aunque estn
+presentes e intactos en los archivos originales. Utilice esta funci¢n con
+cautela.
+:ent.
+
+:p.Se puede especificar la siguiente informaci¢n. La longitud de los campos
+est  limitada a 256 caracteres.
+
+:hp2.
+:table rules=both frame=box cols='10 40'.
+:row.
+:c.Campo
+:c.Descripci¢n
+:row.
+:c.Nombre
+:c.El nombre de la pista.
+:row.
+:c.Artista
+:c.El nombre del artista.
+:row.
+:c.µlbum
+:c.El  lbum que contiene la pista.
+:row.
+:c.Comentario
+:c.Un comentario arbitrario sobre la pista.
+:row.
+:c.A€o
+:c.El a€o (con cuatro cifras) en que se public¢ el  lbum.
+:row.
+:c.Gnero
+:c.El gnero al que pertenece la pista; selecci¢nelo de la lista.
+:etable.
+:ehp2.
+
+.* ----------------------------------------------------------------------------
+:h1 res=014.Detalles de audio
+:p.Esta p gina muestra diversos detalles tcnicos sobre la pista de audio
+seleccionada.
+
+:p.Se muestra la siguiente informaci¢n de s¢lo lectura&colon.
+
+:hp2.
+:table rules=both frame=box cols='22 40'.
+:row.
+:c.Detalle
+:c.Descripci¢n
+:row.
+:c.Duraci¢n
+:c.Longitud de la grabaci¢n en mm&colon.ss.
+:row.
+:c.Frecuencia de muestreo
+:c.Para el audio digital, esto se refiere al n£mero de muestras tomadas por
+segundo. En general, cuanto mayor sea la frecuencia de muestreo, mayor es la
+calidad de los datos de audio resultantes.
+:row.
+:c.Bits de audio
+:c.Los bits de profundidad de cada muestra. Cuantos m s bits de profundidad,
+mayor es la calidad de los datos de audio resultantes. El audio de calidad CD
+es de 16 bits de profundidad.
+:row.
+:c.Canales
+:c.El n£mero de canales de audio del archivo. El audio monaural tiene un solo
+canal, el estreo dos, etc.
+:etable.
+:ehp2.
+
+.* ----------------------------------------------------------------------------
+:h1 res=020.Archivo de audio Ogg
+:p.ste es un archivo de audio Ogg. Se puede reproducir usando MMOS/2 si se ha
+instalado un procedimiento E/S multimedia (MMIOProc) para Ogg adecuado. En
+realidad Ogg es un formato contenedor, y puede albergar audio (en formato
+Vorbis u Opus para audio comprimido con prdida, o FLAC u OggPCM para audio
+comprimido sin prdida) o v¡deo (en formato Theora, con prdida).
+
+:p.El nivel de prdida en un archivo de audio Vorbis u Opus puede ser aceptable
+o no. Normalmente, la prdida puede controlarse en la herramienta de compresi¢n
+utilizada, pero una vez que el archivo de origen se comprime durante la
+codificaci¢n, no se pueden recuperar los datos descartados; hay que volver a
+codificar el archivo de origen con un grado menor de prdida por compresi¢n.
+
+:p.Con ArcaOS 5.x o superior se incluyen procedimientos E/S para FLAC y Vorbis.
+Alternativamente, stos est n disponibles en el ®MMAudio Pak 2 for OS/2¯&colon.
+
+:p.http&colon.//r6.ca/MMAudioPak/
+
+.* ----------------------------------------------------------------------------
+:h1 res=030.Pista de CD de audio
+:p.Este objeto es una pista de un CD de audio. Si hay disponible una conexi¢n a
+Internet se consulta el nombre de la pista y otra informaci¢n en un servidor
+CDDB. La informaci¢n que aqu¡ se presenta es de s¢lo lectura.
+
+:p.La mayor¡a de servidores CDDB siguen la pr ctica de FreeDB de solicitar una
+direcci¢n de correo v lida para acceder. Utilice el objeto Configuraci¢n del
+cliente FreeDB en la carpeta Multimedia para establecer una.
+
+:p.La informaci¢n de usuario se almacena en el archivo cddb.ini del directorio
+de instalaci¢n.
+
+.* ----------------------------------------------------------------------------
+:h1 res=040.Lista de reproducci¢n M3U
+:p.Este archivo es una lista de reproducci¢n M3U (Moving Picture Experts Group
+Audio Layer 3 Uniform Resource Locator). M3U es un est ndar
+:hp1.de facto:ehp1., generalmente reconocido por la mayor¡a de reproductores de
+m£sica.
+
+:p.Una lista de reproducci¢n M3U es un archivo de texto que contiene v¡as de
+acceso (URLs) a las pistas que referencia.
+
+:p.Para crear una lista de reproducci¢n, arrastre el modelo de lista de
+reproducci¢n M3U de la carpeta Modelos de multimedia a un lugar adecuado del
+escritorio. Arrastre archivos de medios al contenedor de la lista de
+reproducci¢n. Para reordenarla, aseg£rese de desmarcar la opci¢n
+:hp1.Mantener siempre el orden:ehp1. del submen£ :hp2.Ordenar:ehp2., as¡ como
+cualesquiera otras opciones de clasificaci¢n que puedan afectar a la ordenaci¢n
+manual, y arrastre y suelte las pistas como desee. Guarde la lista de
+reproducci¢n seleccionando :hp2.Archivo &rarrow. Guardar:ehp2. en el men£.
+
+.* ----------------------------------------------------------------------------
+:h1 res=050.Emisi¢n de audio
+:p.Este objeto apunta al audio digital emitido por un servidor de la red local
+o Internet. El URL del servidor se especifica en el cuaderno de propiedades del
+objeto.
+
+:nt.
+S¢lo se da soporte a servidores Icecast. Los servidores que utilizan otros
+protocolos (Ampache, SHOUTcast, QuickTime Broadcaster, Open Broadcast System,
+etc.) no funcionar n.
+:ent.
+
+.* ----------------------------------------------------------------------------
+:h1 res=060.Convertir archivo de audio
+:p.Especifique el nombre de archivo y tipo del archivo de audio de destino, con
+la v¡a de acceso completa. Los detalles del archivo de audio original se
+muestran en la parte superior del di logo. Tenga en cuenta que algunos formatos
+pueden conllevar un nivel de prdida mayor que otros, y convertir de un formato
+con prdida a otro con prdida menor (o sin prdida) no recuperar  los datos
+que fueron descartados para crear el archivo original (con prdida) y, en
+muchos casos, puede dar como resultado un archivo de calidad m s pobre que el
+original con prdida.
+
+:p.La lista desplegable muestra los procedimientos E/S multimedia (MMIOProcs o
+c¢decs) disponibles para el archivo destino.
+
+:p.Pulse el bot¢n :hp2.Convertir:ehp2. para iniciar el proceso, o
+:hp2.Abortar:ehp2. para cancelarlo una vez que haya comenzado la conversi¢n.
+Pulse :hp2.Cerrar:ehp2. para salir del di logo.
+
+
+.* ----------------------------------------------------------------------------
+:h1 res=200.Detalles de la imagen
+:p.Esta p gina muestra diversos detalles tcnicos sobre la imagen seleccionada.
+
+:p.Se muestra la siguiente informaci¢n de s¢lo lectura&colon.
+
+:hp2.
+:table rules=both frame=box cols='20 40'.
+:row.
+:c.Detalle
+:c.Descripci¢n
+:row.
+:c.ProcE/S
+:c.Identifica el ProcE/S que se utiliza para mostrar la imagen.
+:row.
+:c.Anchura
+:c.Ancho de la imagen en p¡xeles.
+:row.
+:c.Altura
+:c.Alto de la imagen en p¡xeles.
+:row.
+:c.Profundidad
+:c.N£mero de colores (profundidad de color) de la imagen.
+:etable.
+:ehp2.
+
+.* ----------------------------------------------------------------------------
+:h1 res=210.Convertir imagen digital
+:p.Especifique el nombre de archivo y tipo del archivo de imagen de destino,
+con la v¡a de acceso completa. En la parte superior del di logo se mostrar  una
+miniatura de la imagen original. Tenga en cuenta que algunos formatos pueden
+conllevar un nivel de prdida mayor que otros, y convertir de un formato con
+prdida a otro con prdida menor (o sin prdida) no recuperar  los datos que
+fueron descartados para crear el archivo original (con prdida) y, en muchos
+casos, puede dar como resultado un archivo de calidad m s pobre que el original
+con prdida.
+
+:p.La lista desplegable muestra los procedimientos E/S multimedia (MMIOProcs o
+c¢decs) disponibles para el archivo destino.
+
+:p.Pulse el bot¢n :hp2.Convertir:ehp2. para iniciar el proceso, o
+:hp2.Abortar:ehp2. para cancelarlo una vez que haya comenzado la conversi¢n.
+Pulse :hp2.Cerrar:ehp2. para salir del di logo.
+
+:euserdoc.
Index: /tags/CWMM-0.3.0_GA/classes/help/es/makefile
===================================================================
--- /tags/CWMM-0.3.0_GA/classes/help/es/makefile	(revision 213)
+++ /tags/CWMM-0.3.0_GA/classes/help/es/makefile	(revision 213)
@@ -0,0 +1,83 @@
+# Makefile
+
+include ../../../make.inc
+
+LANGUAGE	= 034
+DISTNAME	=	cwaudio-classes-$(VERSION)
+CC           = icc
+
+LDFLAGS =	-Ge- /Gm+ -G4 /ss -Gl /O+ -Oc+ -Ol-  /Q+
+CFLAGS       =   -Ge- /Gm+ -G4 /ss -Gl /O+ -Oc+ -Ol- /Q+ /C
+
+LIBS		=	somtk.lib mmPM2.lib rexx.lib
+DEFS		=
+
+
+
+OBJECTS	=
+
+all: cwmm$(LANGUAGE).hlp
+
+cwmm$(LANGUAGE).hlp:	cwmm$(LANGUAGE).ipf
+	ipfc -C:850 -L:ESP -D:34 cwmm$(LANGUAGE).ipf cwmm$(LANGUAGE).hlp	
+
+
+clean:
+	-rm *.hlp
+
+cleaner:
+	-rm *.*~
+
+german:
+	-cd ..\. && mkdir CWAudio-$(VERSION)-ger
+	-cd ..\CWAudio-$(VERSION)-ger && rm -r *
+	-cd ..\CWAudio-$(VERSION)-ger && mkdir old_inst
+	-cp ./old_inst/* ..\CWAudio-$(VERSION)-ger/old_inst/
+	-cp ./cwmm.dll ../CWAudio-$(VERSION)-ger
+	-cp ./setFolder.cmd ../CWAudio-$(VERSION)-ger 	
+	-cp ./ger/Readme.ger ../CWAudio-$(VERSION)-ger
+	-cp ./FILE_ID.DIZ ../CWAudio-$(VERSION)-ger
+	-cp ./cwmm049.hlp ../CWAudio-$(VERSION)-ger/cwmm.hlp
+	-cp ./ger/cwaudio.ins ../CWAudio-$(VERSION)-ger
+	-cp ./ger/Lizenz ../CWAudio-$(VERSION)-ger
+	-rc ./cwaudio049.rc ../CWAudio-$(VERSION)-ger/cwmm.dll
+	-cd ..\CWAudio-$(VERSION)-ger && lxlite *
+#	-cd ../CWAudio-$(VERSION)-ger && zip -r $(DISTNAME)-ger.zip *
+
+english:
+	-cd ..\. && mkdir CWAudio-$(VERSION)-eng
+	-cd ..\CWAudio-$(VERSION)-eng && rm -r *
+	-cd ..\CWAudio-$(VERSION)-eng && mkdir old_inst
+	-cp ./old_inst/* ..\CWAudio-$(VERSION)-eng\old_inst
+	-cp ./cwmm.dll ../CWAudio-$(VERSION)-eng 	
+	-cp ./cwmm.hlp ../CWAudio-$(VERSION)-eng
+	-cp ./setFolder.cmd ../CWAudio-$(VERSION)-eng 	
+	-cp ./eng/Readme.eng ../CWAudio-$(VERSION)-eng 	
+	-cp ./FILE_ID.DIZ ../CWAudio-$(VERSION)-eng
+	-cp ./eng/cwaudio.ins ../CWAudio-$(VERSION)-eng
+	-cp ./eng/License ../CWAudio-$(VERSION)-eng
+	-cd ..\CWAudio-$(VERSION)-eng && lxlite *
+#	-cd ../CWAudio-$(VERSION)-eng && zip -r $(DISTNAME)-eng.zip *
+
+spanish:
+	-cd ..\. && mkdir CWAudio-$(VERSION)-esp
+	-cd ..\CWAudio-$(VERSION)-esp && rm -r *
+	-cd ..\CWAudio-$(VERSION)-esp && mkdir old_inst
+	-cp ./old_inst/* ..\CWAudio-$(VERSION)-esp\old_inst
+	-cp ./cwmm.dll ../CWAudio-$(VERSION)-esp
+	-cp ./cwmm.hlp ../CWAudio-$(VERSION)-esp
+	-cp ./setFolder.cmd ../CWAudio-$(VERSION)-esp
+	-cp ./eng/Readme.esp ../CWAudio-$(VERSION)-esp
+	-cp ./FILE_ID.DIZ ../CWAudio-$(VERSION)-esp
+	-cp ./esp/cwaudio.ins ../CWAudio-$(VERSION)-esp
+	-cp ./esp/License ../CWAudio-$(VERSION)-esp
+	-rc ./cwaudio033.rc ../CWAudio-$(VERSION)-esp/cwmm.dll
+	-cd ..\CWAudio-$(VERSION)-esp && lxlite *
+#	-cd ../CWAudio-$(VERSION)-esp && zip -r $(DISTNAME)-esp.zip *
+
+distribution:
+	make
+	-make german
+	-make english
+	-make spanish
+
Index: /tags/CWMM-0.3.0_GA/classes/help/fr/cwmm033.ipf
===================================================================
--- /tags/CWMM-0.3.0_GA/classes/help/fr/cwmm033.ipf	(revision 213)
+++ /tags/CWMM-0.3.0_GA/classes/help/fr/cwmm033.ipf	(revision 213)
@@ -0,0 +1,383 @@
+:userdoc.
+:docprof.
+:title.Aide de CWMM
+.* ----------------------------------------------------------------------------
+.* Product...............: CWMM - Help file
+.* Language..............: French
+.* Original file version.:
+.* French translation....: Guillaume Gay <guillaume[dot]gay[arobase]gmail[dot]com>
+.* Version...............: 2020-07-22
+.* ----------------------------------------------------------------------------
+
+.* ----------------------------------------------------------------------------
+:h1 res=010.Fichier audio MP3
+:p.Ce fichier est un fichier audio MP3. Il peut tre lu avec MMOS/2
+une fois la procdure d'Entre/Sortie multimdia ("multimedia IO
+procedure" ou "MMIOProc") approprie installe.
+
+:p.Le format MP3 utilise la compression avec perte pour rduire la
+taille du fichier source. La quantit de la perte peut tre acceptable
+ou non. En gnral, cette quantit de perte  peut tre contrle par
+l'outil d'encodage.
+Une fois cods, cependant, il n'est pas possible de restaurer les
+informations qui ont t rejetes, 
+ moins de recoder 
+ nouveau le
+fichier source avec un degr de perte moindre.
+
+:p.Un paquetage MMIOProc pour MP3 est inclus dans "MMAudio Pak 2",
+disponible sur &colon.
+:p.http&colon.//r6.ca/MMAudioPak/
+:p.
+
+.* ----------------------------------------------------------------------------
+:h1 res=011.Balises ID3
+:p.Utilisez cette page pour l'dition des balises ID3.
+
+:p.Une balise ID3 est une mtadonne associe 
+ une piste particulire
+et est stocke dans le fichier MP3. L'ID3 est un standard
+:hp1.de facto:ehp1.&comma. en gnral reconnu par la plupart des
+lecteurs MP3.
+
+:p.Si tous les champs d'entre sont vides, cela signifie que le fichier
+ne contient pas encore d'informations ID3. Si certains champs sont
+vides, ces donnes ne seront pas ajoute 
+ la balise.
+
+:p.Les nouvelles informations ne sont sauvegardes qu'aprs avoir appuy
+sur le bouton :hp2.Enregistrer:ehp2.&per.
+
+:p.Les informations suivantes peuvent tre renseignes &colon.
+:hp2.
+:table rules=both frame=box cols='15 8 40'.
+:row.
+:c.Champ
+:c.Longueur
+:c.Description
+:row.
+:c.Titre
+:c.30
+:c.Le titre de la piste.
+:row.
+:c.Artiste
+:c.30
+:c.Le nom de l'artiste.
+:row.
+:c.Album
+:c.30
+:c.Le titre de l'album contenant ce morceau.
+:row.
+:c.Commentaire
+:c.30
+:c.Un commentaire quelconque 
+ propos du morceau.
+:row.
+:c.Anne
+:c.4
+:c.L'anne sur 4 chiffres de publication de l'album.
+:row.
+:c.Genre
+:c.30
+:c.Le genre du morceau, 
+ slectionner dans la liste droulante.
+:etable.
+:ehp2.
+:p.
+
+.* ----------------------------------------------------------------------------
+:h1 res=013.Informations ID3
+:p.Cette page affiche une slection de champs des balises ID3 attaches
+au fichier MP3.
+
+:p.Une balise ID3 est une mtadonne associe 
+ une piste particulire
+et est stocke dans le fichier MP3. L'ID3 est un standard
+:hp1.de facto:ehp1.&comma. en gnral reconnu par la plupart des
+lecteurs MP3.
+
+:p.Si tous les champs d'entre sont vides, cela signifie que le fichier
+ne contient pas encore d'informations ID3. Si certains champs sont
+vides, ces donnes ne seront pas ajoute 
+ la balise.
+
+:p.Les nouvelles informations ne sont sauvegardes qu'aprs avoir appuy
+sur le bouton :hp2.Enregistrer:ehp2.&per.
+
+:p.Les informations suivantes peuvent tre renseignes &colon.
+:hp2.
+:table rules=both frame=box cols='15 8 40'.
+:row.
+:c.Champ
+:c.Longueur
+:c.Description
+:row.
+:c.Titre
+:c.30
+:c.Le titre de la piste.
+:row.
+:c.Artiste
+:c.30
+:c.Le nom de l'artiste.
+:row.
+:c.Album
+:c.30
+:c.Le titre de l'album contenant ce morceau.
+:row.
+:c.Commentaire
+:c.30
+:c.Un commentaire quelconque 
+ propos du morceau.
+:row.
+:c.Anne
+:c.4
+:c.L'anne sur 4 chiffres de publication de l'album.
+:row.
+:c.Genre
+:c.30
+:c.Le genre du morceau, 
+ slectionner dans la liste droulante.
+:etable.
+:ehp2.
+:p.
+
+.* ----------------------------------------------------------------------------
+:h1 res=012.Noms des pistes
+:p.Utilisez cette page pour l'dition des informations sur les pistes.
+Contrairement 
+ une balise ID3, les contenus de ces champs seront
+sauvegards dans les attributs tendus du fichier aprs avoir appuy sur
+le bouton :hp2.Enregistrer:ehp2.&per.
+
+:nt.
+les attributs tendus de fichiers ne sont pris en charge que par OS/2
+et par certains  autres systmes d'exploitation qui utilisent ces
+structures de donnes dans leurs systmes de fichiers (HPFS, JFS, XFS,
+ZFS, et dans une moindre mesure, ext4). De plus, ces informations ne
+sont pas stockes sur un CD ou un DVD. Par consquent, la sauvegarde de
+ces donnes et le transfert du fichier associ vers un systme qui ne
+reconnat pas les attributs tendus entranera la perte de ces attributs
+particuliers durant la copie (l'original demeurera cependant intact).
+Utilisez cette fonction avec prcaution.
+:ent.
+
+:p.Les informations suivantes peuvent tre renseigne, La longueur de
+chaque champ tant limite 
+ 256 caractres &colon.
+:hp2.
+:table rules=both frame=box cols='15 40'.
+:row.
+:c.Champ
+:c.Description
+:row.
+:c.Titre
+:c.Le titre de la piste.
+:row.
+:c.Artiste
+:c.Le nom de l'artiste.
+:row.
+:c.Album
+:c.Le titre de l'album contenant ce morceau.
+:row.
+:c.Commentaire
+:c.Un commentaire quelconque 
+ propos du morceau.
+:row.
+:c.Anne
+:c.L'anne sur 4 chiffres de publication de l'album.
+:row.
+:c.Genre
+:c.Le genre du morceau, 
+ slectionner dans la liste droulante.
+:etable.
+:ehp2.
+:p.
+
+.* ----------------------------------------------------------------------------
+:h1 res=014.Informations audio
+:p.Cette page affiche divers dtails techniques au sujet de la piste
+audio slectionne;
+
+:p.Les informations en lecture seule suivantes sont affiches &colon.
+:hp2.
+:table rules=both frame=box cols='20 40'.
+:row.
+:c.Dtail
+:c.Description
+:row.
+:c.Dure totale
+:c.Longueur de l'enregistrement en mm&colon.ss.
+:row.
+:c.chantillonnage
+:c.En audio numrique, cela fait rfrence au nombre d'chantillons
+prlevs par seconde. En rgle gnrale, plus la frquence
+d'chantillonnage est leve, meilleure est la qualit du flux audio
+rsultant.
+:row.
+:c.Bits/chantillon
+:c.Profondeur de bits de chaque chantillon. Plus la profondeur de bits
+est leve, meilleure est la qualit du flux audio rsultant. Un
+morceau audio de qualit CD, par exemple, utilise une profondeur de 16
+bits.
+:row.
+:c.Canaux
+:c.Nombre de canaux audio dans le fichier. Un morceau audio monaural
+contient un seul canal, un morceau binaural ("stro") en contient deux,
+etc.
+:etable.
+:ehp2.
+:p.
+
+.* ----------------------------------------------------------------------------
+:h1 res=020.Fichier audio Ogg
+:p.Ce fichier est un fichier audio Ogg. Il peut tre lu avec MMOS/2
+une fois la procdure d'Entre/Sortie multimdia ("multimedia IO
+procedure" ou "MMIOProc") approprie installe.
+Ogg est en fait un format de conteneur et peut tre compos d'audio
+(format "Vorbis" ou "Opus" pour de l'audio compresse avec perte, ou
+"FLAC" ou "OggPCM" pour de l'audio compresse sans perte) ou de vido
+(format "Theora", qui est un format de compression avec perte).
+
+:p.La quantit de la perte pour un fichier audio Vorbis ou Opus peut tre
+acceptable ou non. En gnral, cette quantit de perte peut tre
+contrle par l'outil d'encodage.
+Une fois cods, cependant, il n'est pas possible de restaurer les
+informations qui ont t rejetes, 
+ moins de recoder 
+ nouveau le
+fichier source avec un degr de perte moindre.
+
+:p.Les paquetages MMIOProc pour FLAC et Vorbis sont inclus dans
+ArcaOS 5.x et ultrieures. Sinon, ils sont inclus dans "MMAudio Pak 2",
+disponible sur &colon.
+
+:p.http&colon.//r6.ca/MMAudioPak/
+:p.
+
+.* ----------------------------------------------------------------------------
+:h1 res=030.Piste CD
+:p.Cet objet est une piste de CD Audio. Les informations sur le titre de
+chaque piste et autres sont rcupres sur un serveur CDDB, si une
+connexion 
+ Internet est disponible. Les informations prsentes ici
+sont en lecture seule.
+
+:p. La plupart des serveurs CDDB suivent la mme pratique que FreeDB qui
+consiste 
+ exiger une adresse de courriel valide pour l'accs. Utilisez
+l'objet de :hp2.configuration du client FreeDB:ehp2. dans le dossier
+:hp2.Multimdia:ehp2. pour paramtrer tout cela.
+
+:p.Les informations utilisateur sont stockes dans le fichier
+:hp2.cddb.ini:ehp2. plac dans le rpertoire d'installation.
+:p.
+
+.* ----------------------------------------------------------------------------
+:h1 res=040.Liste de lecture M3U
+:p.Ce fichier est une liste de lecture M3U (Moving Picture Experts Group
+Audio Layer 3 Uniform Resource Locator). Le M3U est un standard
+:hp1.de facto:ehp1.&comma. en gnral reconnu par la plupart des
+lecteurs MP3.
+
+:p.Une liste de lecture M3U est un fichier texte qui contient les
+chemins (URL) vers les pistes auxquelles il fait rfrence.
+
+:p.Pour crer une liste de lecture, glissez le modle de liste de
+lecture M3U depuis le dossier :hp2.Modles multimdia:ehp2.
+vers un emplacement souhait sur le bureau. Glissez et dposez les
+fichiers multimdias dans le conteneur de liste de lecture. Pour
+l'organisation de cette liste, assurez-vous que l'option
+:hp1.Toujours conserver l'ordre de tri:ehp1. du sous-menu
+:hp2.Trier:ehp2. est dslectionne, ainsi que toute autre option de
+tri qui pourrait affecter le tri manuel, puis glissez et dposez les
+pistes comme vous le souhaitez. Enregistrez la liste de lecture en
+slectionnant :hp2.Fichier|Enregistrer:ehp2. depuis le menu.
+:p.
+.* ----------------------------------------------------------------------------
+:h1 res=050.Flux audio
+:p.Cet objet est un flux fourni par un "serveur de streaming" sur le
+rseau local ou sur Internet. L'URL du serveur est indique dans le
+bloc-notes des paramtres du flux.
+
+:nt.
+seuls les serveurs Icecast sont pris en charge. Les serveurs qui
+emploient d'autres protocoles (Ampache, SHOUTcast, QuickTime
+Broadcaster, Open Broadcast System, etc.) ne fonctionneront pas.
+:ent.
+:p.
+
+.* ----------------------------------------------------------------------------
+:h1 res=060.Conversion de fichier audio
+:p.Indiquez le type et le nom du fichier audio cible, avec son chemin
+complet. Les dtails du fichier audio source sont affichs en haut de la
+bote de dialogue. Notez que certains formats peuvent tre issus
+d'encodages prsentant plus ou moins de pertes d'informations, et la
+conversion d'un format avec perte 
+ un format sans ou avec moins de
+perte ne restaurera pas les donnes d'origine qui peuvent ne plus tre
+prsentes dans le fichier source (avec perte). Dans certains cas, cela
+peut entraner alors un fichier converti de qualit infrieure 
+ la
+source avec perte.
+
+:p.La liste droulante prsente les MMIOProcs (codecs) disponibles pour
+le fichier cible.
+
+:p.Appuyez sur le bouton :hp2.Convertir:ehp2. pour lancer le processus,
+et :hp2.Annuler:ehp2. pour interrompre lorsque la conversion a
+commenc. Appuyez sur :hp2.Fermer:ehp2. pour quitter la bote de
+dialogue.
+:p.
+
+.* ----------------------------------------------------------------------------
+:h1 res=200.Informations sur l'image
+:p.Cette page affiche divers dtails techniques 
+ propos de l'image
+skectionne.
+
+:p.Les informations en lecture seule suivantes sont affiches &colon.
+:hp2.
+:table rules=both frame=box cols='20 40'.
+:row.
+:c.Dtail
+:c.Description
+:row.
+:c.IOProc
+:c.Identifie le MMIOProc utilis pour le rendu de l'image.
+:row.
+:c.Largeur
+:c.Largeur de l'image en pixels.
+:row.
+:c.Hauteur
+:c.Hauteur de l'image en pixels.
+:row.
+:c.Profondeur
+:c.Nombre le couleurs (profondeur de couleurs) de l'image.
+:etable.
+:ehp2.
+:p.
+
+.* ----------------------------------------------------------------------------
+:h1 res=210.Conversion d'une image numrique
+:p.Indiquez le type et le nom du fichier image cible, avec
+son chemin complet. Une vignette de l'image source est affiche en haut
+de la bote de dialogue. Notez que certains formats peuvent tre issus
+d'encodages prsentant plus ou moins de pertes d'informations, et la
+conversion d'un format avec perte 
+ un format sans ou avec moins de
+perte ne restaurera pas les donnes d'origine qui peuvent ne plus tre
+prsentes dans le fichier source (avec perte). Dans certains cas, cela
+peut entraner alors un fichier converti de qualit infrieure 
+ la
+source avec perte.
+
+:p.La liste droulante prsente les MMIOProcs (codecs) disponibles pour
+le fichier cible.
+
+:p.Appuyez sur le bouton :hp2.Convertir:ehp2. pour lancer le processus,
+et :hp2.Annuler:ehp2. pour interrompre lorsque la conversion a
+commenc. Appuyez sur :hp2.Fermer:ehp2. pour quitter la bote de
+dialogue.
+:p.
+
+:euserdoc.
Index: /tags/CWMM-0.3.0_GA/classes/help/fr/makefile
===================================================================
--- /tags/CWMM-0.3.0_GA/classes/help/fr/makefile	(revision 213)
+++ /tags/CWMM-0.3.0_GA/classes/help/fr/makefile	(revision 213)
@@ -0,0 +1,83 @@
+# Makefile
+
+include ../../../make.inc
+
+LANGUAGE	= 033
+DISTNAME	=	cwaudio-classes-$(VERSION)
+CC           = icc
+
+LDFLAGS =	-Ge- /Gm+ -G4 /ss -Gl /O+ -Oc+ -Ol-  /Q+
+CFLAGS       =   -Ge- /Gm+ -G4 /ss -Gl /O+ -Oc+ -Ol- /Q+ /C
+
+LIBS		=	somtk.lib mmPM2.lib rexx.lib
+DEFS		=
+
+
+
+OBJECTS	=
+
+all: cwmm$(LANGUAGE).hlp
+
+cwmm$(LANGUAGE).hlp:	cwmm$(LANGUAGE).ipf
+	ipfc -C:850 -L:FRA -D:33 cwmm$(LANGUAGE).ipf cwmm$(LANGUAGE).hlp	
+
+
+clean:
+	-rm *.hlp
+
+cleaner:
+	-rm *.*~
+
+german:
+	-cd ..\. && mkdir CWAudio-$(VERSION)-ger
+	-cd ..\CWAudio-$(VERSION)-ger && rm -r *
+	-cd ..\CWAudio-$(VERSION)-ger && mkdir old_inst
+	-cp ./old_inst/* ..\CWAudio-$(VERSION)-ger/old_inst/
+	-cp ./cwmm.dll ../CWAudio-$(VERSION)-ger
+	-cp ./setFolder.cmd ../CWAudio-$(VERSION)-ger 	
+	-cp ./ger/Readme.ger ../CWAudio-$(VERSION)-ger
+	-cp ./FILE_ID.DIZ ../CWAudio-$(VERSION)-ger
+	-cp ./cwmm049.hlp ../CWAudio-$(VERSION)-ger/cwmm.hlp
+	-cp ./ger/cwaudio.ins ../CWAudio-$(VERSION)-ger
+	-cp ./ger/Lizenz ../CWAudio-$(VERSION)-ger
+	-rc ./cwaudio049.rc ../CWAudio-$(VERSION)-ger/cwmm.dll
+	-cd ..\CWAudio-$(VERSION)-ger && lxlite *
+#	-cd ../CWAudio-$(VERSION)-ger && zip -r $(DISTNAME)-ger.zip *
+
+english:
+	-cd ..\. && mkdir CWAudio-$(VERSION)-eng
+	-cd ..\CWAudio-$(VERSION)-eng && rm -r *
+	-cd ..\CWAudio-$(VERSION)-eng && mkdir old_inst
+	-cp ./old_inst/* ..\CWAudio-$(VERSION)-eng\old_inst
+	-cp ./cwmm.dll ../CWAudio-$(VERSION)-eng 	
+	-cp ./cwmm.hlp ../CWAudio-$(VERSION)-eng
+	-cp ./setFolder.cmd ../CWAudio-$(VERSION)-eng 	
+	-cp ./eng/Readme.eng ../CWAudio-$(VERSION)-eng 	
+	-cp ./FILE_ID.DIZ ../CWAudio-$(VERSION)-eng
+	-cp ./eng/cwaudio.ins ../CWAudio-$(VERSION)-eng
+	-cp ./eng/License ../CWAudio-$(VERSION)-eng
+	-cd ..\CWAudio-$(VERSION)-eng && lxlite *
+#	-cd ../CWAudio-$(VERSION)-eng && zip -r $(DISTNAME)-eng.zip *
+
+french:
+	-cd ..\. && mkdir CWAudio-$(VERSION)-fra
+	-cd ..\CWAudio-$(VERSION)-fra && rm -r *
+	-cd ..\CWAudio-$(VERSION)-fra && mkdir old_inst
+	-cp ./old_inst/* ..\CWAudio-$(VERSION)-fra\old_inst
+	-cp ./cwmm.dll ../CWAudio-$(VERSION)-fra
+	-cp ./cwmm.hlp ../CWAudio-$(VERSION)-fra
+	-cp ./setFolder.cmd ../CWAudio-$(VERSION)-fra
+	-cp ./eng/Readme.fra ../CWAudio-$(VERSION)-fra
+	-cp ./FILE_ID.DIZ ../CWAudio-$(VERSION)-fra
+	-cp ./fra/cwaudio.ins ../CWAudio-$(VERSION)-fra
+	-cp ./fra/License ../CWAudio-$(VERSION)-fra
+	-rc ./cwaudio033.rc ../CWAudio-$(VERSION)-fra/cwmm.dll
+	-cd ..\CWAudio-$(VERSION)-fra && lxlite *
+#	-cd ../CWAudio-$(VERSION)-fra && zip -r $(DISTNAME)-fra.zip *
+
+distribution:
+	make
+	-make german
+	-make english
+	-make french
+
Index: /tags/CWMM-0.3.0_GA/classes/help/it/cwmm039.ipf
===================================================================
--- /tags/CWMM-0.3.0_GA/classes/help/it/cwmm039.ipf	(revision 213)
+++ /tags/CWMM-0.3.0_GA/classes/help/it/cwmm039.ipf	(revision 213)
@@ -0,0 +1,159 @@
+:userdoc.
+
+:docprof.
+
+:title.Aiuto
+
+:h1 res=010.File audio MP3
+:p.
+Questo  un file audio MP3. Per poterlo ascoltare con MMOS/2  necessario installare l'apposita
+procedura multimedia IO, MMIOMP3, disponibile gratuitamente all'indirizzo indicato sotto.
+I file MP3 contengono dati audio in formato compresso,
+il che comporta una perdita in qualit
+.
+:p.
+La procedura IO si pu scaricare liberamente all'indirizzo
+:p.
+:link reftype=launch
+object='netscape.exe'
+data='http://www.math.berkeley.edu/~roconnor/'.
+http&colon.//www.math.berkeley.edu/~roconnor/:elink.
+
+:h1 res=011.Tag ID3
+:p.
+Questa pagina permette di modificare i tag ID3.
+Campi di immissione vuoti indicano che nel file non sono ancora
+stati salvati tag.
+Le modifiche effettuate vengono salvate solo premendo il tasto
+:hp2.Salva:ehp2..
+
+:p.
+Si possono salvare le informazioni seguenti:
+:ul.
+:li.:hp2.Nome:ehp2.
+.br
+Il nome della traccia. La lunghezza massima del campo  30 caratteri.
+
+:li.:hp2.Artista:ehp2.
+.br
+Il nome dell'artista. La lunghezza massima del campo  30 caratteri.
+
+:li.:hp2.Album:ehp2.
+.br
+L'album da cui  tratta questa traccia. La lunghezza massima del campo  30 caratteri.
+
+:li.:hp2.Commento:ehp2.
+.br
+Spazio per eventuali commenti. La lunghezza massima del campo  30 caratteri.
+
+:li.:hp2.Anno:ehp2.
+.br
+L'anno di pubblicazione dell'album.
+
+:li.:hp2.Genere:ehp2.
+.br
+Il genere musicale cui appartiene la traccia.
+
+:eul.
+
+:h1 res=013.Tag ID3
+:p.
+Questa pagina mostra il contenuto dei tag ID3 nel file MP3. ID3  lo standard per aggiungere informazioni ad
+un file MP3, ad es. il titolo della traccia o l'autore.
+:p.
+Se i campi sono vuoti, significa che questo file ancora non ha tag.
+
+:p.
+:ul.
+:li.:hp2.Nome:ehp2.
+.br
+Il nome della traccia. La lunghezza massima del campo  30 caratteri.
+
+:li.:hp2.Artista:ehp2.
+.br
+Il nome dell'artista. La lunghezza massima del campo  30 caratteri.
+
+:li.:hp2.Album:ehp2.
+.br
+L'album da cui  tratta questa traccia. La lunghezza massima del campo  30 caratteri.
+
+:li.:hp2.Commento:ehp2.
+.br
+Spazio per eventuali commenti. La lunghezza massima del campo  30 caratteri.
+
+:li.:hp2.Anno:ehp2.
+.br
+L'anno di pubblicazione dell'album.
+
+:li.:hp2.Genere:ehp2.
+.br
+Il genere musicale cui appartiene la traccia.
+
+:eul.
+
+:h1 res=012.Nomi delle tracce
+:p.
+Questa pagina permette di modificare le informazioni relative alla traccia. Le informazioni inserite vengono
+salvate negli attributi estesi del file.
+Le modifiche effettuate vengono salvate solo premendo il tasto
+:hp2.Salva:ehp2..
+:nt.
+Gli attributi estesi sono supportati solo in OS/2 ed in ogni caso non possono essere salvati su CD. Copiando
+i file su CD o su di un diverso sistema operativo, essi andranno perduti.
+:ent.
+:p.
+Si possono specificare le informazioni seguenti: La lunghezza massima per ogni campo  256 caratteri.
+:ul.
+:li.:hp2.Nome&colon.:ehp2.
+:p.Il nome della traccia.
+
+:li.:hp2.Artista&colon.:ehp2.
+:p.Il nome dell'artista.
+
+:li.:hp2.Album&colon.:ehp2.
+:p.L'album da cui  tratta questa traccia.
+
+:li.:hp2.Commento&colon.:ehp2.
+:p.Spazio per eventuali commenti.
+
+:li.:hp2.Anno&colon.:ehp2.
+:p.L'anno di pubblicazione dell'album.
+
+:li.:hp2.Genre&colon.:ehp2.
+:p.Il genere musicale cui appartiene la traccia.
+
+:eul.
+
+:h1 res=020.Aiuto per file Ogg
+:p.
+Questo  un file audio Ogg. Per poterlo ascoltare con MMOS/2  necessario installare l'apposita
+procedura multimedia IO, MMIOVORB, disponibile gratuitamente all'indirizzo indicato sotto.
+I file Ogg contengono dati audio in formato compresso, in maniera analoga ai file MP3
+Tale compressione comporta una perdita in qualit
+.
+:p.
+La procedura si pu scaricare liberamente all'indirizzo
+:p.
+:link reftype=launch
+object='netscape.exe'
+data='http://www.math.berkeley.edu/~roconnor/'.
+http&colon.//www.math.berkeley.edu/~roconnor/:elink.
+
+
+:h1 res=030.Aiuto per le tracce CD
+:p.
+Questo oggetto  una traccia CD audio. I nomi delle tracce, come pure altre informazioni,
+possono essere recuperati da un server FreeDB purch si disponga di una connessione internet.
+Per poter connettersi al server FreeDB bisogna specificare il proprio indirizzo di posta
+elettronica. Si usi allo scopo l'oggetto configurazione apposito.
+:p.
+Le informazioni utente sono salvate nel file cddb.ini, nella cartella di installazione.
+
+
+:h1 res=040.Aiuto per playlist M3U
+:p.
+Questo oggetto  una playlist M3U. Una playlist M3U  un file di testo in cui sono elencati i percorsi
+delle diverse tracce da suonare. Queste playlist sono usate, per esempio, dai lettori portatili MP3.
+E' disponibile un editor che permette di modificare i file M3U comodamente, usando il mouse.
+
+:euserdoc.
Index: /tags/CWMM-0.3.0_GA/classes/help/it/makefile
===================================================================
--- /tags/CWMM-0.3.0_GA/classes/help/it/makefile	(revision 213)
+++ /tags/CWMM-0.3.0_GA/classes/help/it/makefile	(revision 213)
@@ -0,0 +1,83 @@
+# Makefile
+
+include ../../../make.inc
+
+LANGUAGE	= 039
+DISTNAME	=	cwaudio-classes-$(VERSION)
+CC           = icc
+
+LDFLAGS =	-Ge- /Gm+ -G4 /ss -Gl /O+ -Oc+ -Ol-  /Q+ 
+CFLAGS       =   -Ge- /Gm+ -G4 /ss -Gl /O+ -Oc+ -Ol- /Q+ /C
+
+LIBS		=	somtk.lib mmPM2.lib rexx.lib
+DEFS		= 
+
+
+
+OBJECTS	= 
+
+all: cwmm$(LANGUAGE).hlp
+
+cwmm$(LANGUAGE).hlp:	cwmm$(LANGUAGE).ipf
+	ipfc -C:850 -L:ITA -D:39 cwmm$(LANGUAGE).ipf cwmm$(LANGUAGE).hlp       
+
+
+clean:
+	-rm *.hlp
+
+cleaner:
+	-rm *.*~
+
+german:
+	-cd ..\. && mkdir CWAudio-$(VERSION)-ger
+	-cd ..\CWAudio-$(VERSION)-ger && rm -r *
+	-cd ..\CWAudio-$(VERSION)-ger && mkdir old_inst
+	-cp ./old_inst/* ..\CWAudio-$(VERSION)-ger/old_inst/
+	-cp ./cwmm.dll ../CWAudio-$(VERSION)-ger
+	-cp ./setFolder.cmd ../CWAudio-$(VERSION)-ger 	
+	-cp ./ger/Readme.ger ../CWAudio-$(VERSION)-ger
+	-cp ./FILE_ID.DIZ ../CWAudio-$(VERSION)-ger
+	-cp ./cwmm049.hlp ../CWAudio-$(VERSION)-ger/cwmm.hlp
+	-cp ./ger/cwaudio.ins ../CWAudio-$(VERSION)-ger
+	-cp ./ger/Lizenz ../CWAudio-$(VERSION)-ger
+	-rc ./cwaudio049.rc ../CWAudio-$(VERSION)-ger/cwmm.dll
+	-cd ..\CWAudio-$(VERSION)-ger && lxlite *
+#	-cd ../CWAudio-$(VERSION)-ger && zip -r $(DISTNAME)-ger.zip *
+
+english:
+	-cd ..\. && mkdir CWAudio-$(VERSION)-eng
+	-cd ..\CWAudio-$(VERSION)-eng && rm -r *
+	-cd ..\CWAudio-$(VERSION)-eng && mkdir old_inst
+	-cp ./old_inst/* ..\CWAudio-$(VERSION)-eng\old_inst
+	-cp ./cwmm.dll ../CWAudio-$(VERSION)-eng 	
+	-cp ./cwmm.hlp ../CWAudio-$(VERSION)-eng
+	-cp ./setFolder.cmd ../CWAudio-$(VERSION)-eng 	
+	-cp ./eng/Readme.eng ../CWAudio-$(VERSION)-eng 	
+	-cp ./FILE_ID.DIZ ../CWAudio-$(VERSION)-eng
+	-cp ./eng/cwaudio.ins ../CWAudio-$(VERSION)-eng
+	-cp ./eng/License ../CWAudio-$(VERSION)-eng
+	-cd ..\CWAudio-$(VERSION)-eng && lxlite *
+#	-cd ../CWAudio-$(VERSION)-eng && zip -r $(DISTNAME)-eng.zip *
+
+dutch:
+	-cd ..\. && mkdir CWAudio-$(VERSION)-dut
+	-cd ..\CWAudio-$(VERSION)-dut && rm -r *
+	-cd ..\CWAudio-$(VERSION)-dut && mkdir old_inst
+	-cp ./old_inst/* ..\CWAudio-$(VERSION)-dut\old_inst
+	-cp ./cwmm.dll ../CWAudio-$(VERSION)-dut 	
+	-cp ./cwmm.hlp ../CWAudio-$(VERSION)-dut
+	-cp ./setFolder.cmd ../CWAudio-$(VERSION)-dut 	
+	-cp ./eng/Readme.eng ../CWAudio-$(VERSION)-dut 	
+	-cp ./FILE_ID.DIZ ../CWAudio-$(VERSION)-dut
+	-cp ./eng/cwaudio.ins ../CWAudio-$(VERSION)-dut
+	-cp ./eng/License ../CWAudio-$(VERSION)-dut
+	-cd ..\CWAudio-$(VERSION)-dut && lxlite *
+#	-cd ../CWAudio-$(VERSION)-dut && zip -r $(DISTNAME)-dut.zip *
+
+distribution:
+	make
+	-make german
+	-make english
+	-make dutch
+
+
Index: /tags/CWMM-0.3.0_GA/classes/help/nl/cwmm031.ipf
===================================================================
--- /tags/CWMM-0.3.0_GA/classes/help/nl/cwmm031.ipf	(revision 213)
+++ /tags/CWMM-0.3.0_GA/classes/help/nl/cwmm031.ipf	(revision 213)
@@ -0,0 +1,169 @@
+:userdoc.
+
+:docprof.
+
+:title.Hulp
+
+:h1 res=010.MP3 geluidsbestand
+:p.
+Dit is een MP3 geluidsbestand. Hij kan worden afgespeeld onder MMOS/2
+nadat MMIOMP3 is genstalleerd, een gratis multimedia IO programma.
+MP3 bestanden bevatten gecomprimeerde geluidsgegevens.
+De compressie is niet verlies vrij.
+:p.
+Haal het IO programma van:
+p.
+:link reftype=launch
+object='netscape.exe'
+data='http://www.math.berkeley.edu/~roconnor/'.
+http&colon.//www.math.berkeley.edu/~roconnor/:elink.
+
+:h1 res=011.ID3 Tag
+:p.
+Gebruik deze pagina om de ID3 tags te bewerken.
+Als de invoervelden
+leeg zijn heeft het bestand op dit moment nog geen tags.
+De nieuwe informatie wordt alleen opgeslagen na het indrukken van de :hp2.Opslaan:ehp2.
+knop.
+
+:p.
+De volgende informatie kan worden opgegeven:
+:ul.
+:li.:hp2.Naam:ehp2.
+.br
+De naam van het spoor. De lengte is beperkt tot 30 tekens.
+
+:li.:hp2.Artiest:ehp2.
+.br
+De naam van de Artiest. De lengte is beperkt tot 30 tekens.
+
+:li.:hp2.Album:ehp2.
+.br
+Het album dat dit spoor bevat. De lengte is beperkt tot 30 tekens.
+
+:li.:hp2.Commentaar:ehp2.
+.br
+Een willekeurig commentaar. De lengte is beperkt tot 30 tekens.
+
+:li.:hp2.Jaar:ehp2.
+.br
+Het jaar waarin het album werd uitgegeven.
+
+:li.:hp2.Genre:ehp2.
+.br
+Het genre van dit spoor.
+
+:eul.
+
+:h1 res=013.ID3 Tag
+:p.
+Deze pagina toont de ID3 tags van het MP3 bestand. ID3 is een standaard om informatie toe te voegen
+aan een MP3 bestand zoals de titel van het spoor van de uitvoerende artiest van dit spoor.
+:p.
+Als de invoervelden leeg zijn bevat dit bestand nu nog geen enkele tag.
+
+:p.
+:ul.
+:li.:hp2.Naam:ehp2.
+.br
+De naam van het spoor. De lengte is beperkt tot 30 tekens.
+
+:li.:hp2.Artiest:ehp2.
+.br
+De naam van de artiest. De lengte is beperkt tot 30 tekens.
+
+:li.:hp2.Album:ehp2.
+.br
+Het album dat dit spoor bevat. De lengte is beperkt tot 30 tekens.
+
+:li.:hp2.Commentaar:ehp2.
+.br
+Een willekeurig commentaar. De lengte is beperkt tot 30 tekens.
+
+
+:li.:hp2.Jaar:ehp2.
+.br
+Het jaar waarin het album werd uitgegeven.
+<!-- The year the album was published. -->
+:li.:hp2.Genre:ehp2.
+.br
+Het genre van dit spoor.
+
+:eul.
+
+:h1 res=012.Namen van het spoor
+:p.
+Gebruik deze pagina om de spoor informatie te bewerken. De inhoud van de velden wordt opgeslagen
+in de uitgebreide kenmerken van het bestand.
+De nieuwe informatie wordt alleen opgeslagen na het drukken op de :hp2.Opslaan:ehp2.
+knop.
+:nt.
+Uitgebreide kenmerken worden alleen door OS/2 ondersteund en zij worden niet op de Cd opgeslagen. Dus
+als u de bestanden naar een Cd kopiert of naar een ander besturingssysteem gaan ze verloren.
+:ent.
+:p.
+De volgende informatie kan worden opgegeven. De lengte van elk veld is beperkt tot 256 tekens.
+:ul.
+:li.:hp2.Naam&colon.:ehp2.
+:p.De naam van het spoor
+
+:li.:hp2.Artiest&colon.:ehp2.
+:p.De naam van de artiest.
+
+:li.:hp2.Album&colon.:ehp2.
+:p.Het album dat dit spoor bevat.
+
+:li.:hp2.Commentaar&colon.:ehp2.
+:p.Een willekeurig commentaar.
+
+:li.:hp2.Jaar&colon.:ehp2.
+:p.Het jaar waarin het album werd uitgegeven.
+
+:li.:hp2.Genre&colon.:ehp2.
+:p.Het genre van dit spoor.
+
+:eul.
+
+:h1 res=020.Hulp voor een Ogg geluidsbestand
+:p.
+Dit bestand is een Ogg geluidsbestand. Hij kan worden afgespeeld met behulp van MMOS/2
+na het installeren van MMIOVORB, een gratis multimedia IO programma.
+Ogg bestanden bevatten gecomprimeerde geluidsgegevens overeenkomstig MP3 bestanden.
+De compressie is niet verlies vrij.
+:p.
+Haal het IO programma van:
+:p.
+:link reftype=launch
+object='netscape.exe'
+data='http://www.math.berkeley.edu/~roconnor/'.
+http&colon.//www.math.berkeley.edu/~roconnor/:elink.
+
+
+:h1 res=030.Hulp voor een Cd spoor
+:p.
+Dit object is een Cd geluidsspoor. De namen van de sporen en andere informatie wordt
+van een FreeDB server opgehaald als er een internet verbinding beschikbaar is.
+U moet uw email adres opgeven om FreeDB te kunnen gebruiken. Gebruik het configuratie
+object omdat te doen.
+:p.
+De gebruikers informatie wordt opgeslagen in het cddb.ini bestand in de installatie directory.
+
+
+:h1 res=040.Hulp voor een M3U afspeellijst
+:p.
+Dit object is een M3U afspeellijst. Een M3U afspeellijst is een tekst bestand dat de paden naar
+de sporen bevat die moeten worden afgespeeld. Deze afspeellijsten worden b.v gebruikt door
+draagbare MP3 spelers. Er is een bewerkingsprogramma beschikbaar om de M3U bestanden
+met behulp van de muis (slepen en laten vallen) aan te passen.
+
+:h1 res=050.Help for Audio stream
+:p.
+This object plays a stream from a streaming server on the internet.
+The URL for the server can be specified using the properties notebook.
+
+:nt.
+Only Icecast server are supported. Servers using the shoutcast protocol won't work.
+:ent.
+
+:euserdoc.
+
Index: /tags/CWMM-0.3.0_GA/classes/help/nl/makefile
===================================================================
--- /tags/CWMM-0.3.0_GA/classes/help/nl/makefile	(revision 213)
+++ /tags/CWMM-0.3.0_GA/classes/help/nl/makefile	(revision 213)
@@ -0,0 +1,83 @@
+# Makefile
+
+include ../../../make.inc
+
+LANGUAGE	= 031
+DISTNAME	=	cwaudio-classes-$(VERSION)
+CC           = icc
+
+LDFLAGS =	-Ge- /Gm+ -G4 /ss -Gl /O+ -Oc+ -Ol-  /Q+ 
+CFLAGS       =   -Ge- /Gm+ -G4 /ss -Gl /O+ -Oc+ -Ol- /Q+ /C
+
+LIBS		=	somtk.lib mmPM2.lib rexx.lib
+DEFS		= 
+
+
+
+OBJECTS	= 
+
+all: cwmm$(LANGUAGE).hlp
+
+cwmm$(LANGUAGE).hlp:	cwmm$(LANGUAGE).ipf
+	ipfc -C:850 -L:NLD -D:31 cwmm$(LANGUAGE).ipf  cwmm$(LANGUAGE).hlp
+
+
+clean:
+	-rm *.hlp
+
+cleaner:
+	-rm *.*~
+
+german:
+	-cd ..\. && mkdir CWAudio-$(VERSION)-ger
+	-cd ..\CWAudio-$(VERSION)-ger && rm -r *
+	-cd ..\CWAudio-$(VERSION)-ger && mkdir old_inst
+	-cp ./old_inst/* ..\CWAudio-$(VERSION)-ger/old_inst/
+	-cp ./cwmm.dll ../CWAudio-$(VERSION)-ger
+	-cp ./setFolder.cmd ../CWAudio-$(VERSION)-ger 	
+	-cp ./ger/Readme.ger ../CWAudio-$(VERSION)-ger
+	-cp ./FILE_ID.DIZ ../CWAudio-$(VERSION)-ger
+	-cp ./cwmm049.hlp ../CWAudio-$(VERSION)-ger/cwmm.hlp
+	-cp ./ger/cwaudio.ins ../CWAudio-$(VERSION)-ger
+	-cp ./ger/Lizenz ../CWAudio-$(VERSION)-ger
+	-rc ./cwaudio049.rc ../CWAudio-$(VERSION)-ger/cwmm.dll
+	-cd ..\CWAudio-$(VERSION)-ger && lxlite *
+#	-cd ../CWAudio-$(VERSION)-ger && zip -r $(DISTNAME)-ger.zip *
+
+english:
+	-cd ..\. && mkdir CWAudio-$(VERSION)-eng
+	-cd ..\CWAudio-$(VERSION)-eng && rm -r *
+	-cd ..\CWAudio-$(VERSION)-eng && mkdir old_inst
+	-cp ./old_inst/* ..\CWAudio-$(VERSION)-eng\old_inst
+	-cp ./cwmm.dll ../CWAudio-$(VERSION)-eng 	
+	-cp ./cwmm.hlp ../CWAudio-$(VERSION)-eng
+	-cp ./setFolder.cmd ../CWAudio-$(VERSION)-eng 	
+	-cp ./eng/Readme.eng ../CWAudio-$(VERSION)-eng 	
+	-cp ./FILE_ID.DIZ ../CWAudio-$(VERSION)-eng
+	-cp ./eng/cwaudio.ins ../CWAudio-$(VERSION)-eng
+	-cp ./eng/License ../CWAudio-$(VERSION)-eng
+	-cd ..\CWAudio-$(VERSION)-eng && lxlite *
+#	-cd ../CWAudio-$(VERSION)-eng && zip -r $(DISTNAME)-eng.zip *
+
+dutch:
+	-cd ..\. && mkdir CWAudio-$(VERSION)-dut
+	-cd ..\CWAudio-$(VERSION)-dut && rm -r *
+	-cd ..\CWAudio-$(VERSION)-dut && mkdir old_inst
+	-cp ./old_inst/* ..\CWAudio-$(VERSION)-dut\old_inst
+	-cp ./cwmm.dll ../CWAudio-$(VERSION)-dut 	
+	-cp ./cwmm.hlp ../CWAudio-$(VERSION)-dut
+	-cp ./setFolder.cmd ../CWAudio-$(VERSION)-dut 	
+	-cp ./eng/Readme.eng ../CWAudio-$(VERSION)-dut 	
+	-cp ./FILE_ID.DIZ ../CWAudio-$(VERSION)-dut
+	-cp ./eng/cwaudio.ins ../CWAudio-$(VERSION)-dut
+	-cp ./eng/License ../CWAudio-$(VERSION)-dut
+	-cd ..\CWAudio-$(VERSION)-dut && lxlite *
+#	-cd ../CWAudio-$(VERSION)-dut && zip -r $(DISTNAME)-dut.zip *
+
+distribution:
+	make
+	-make german
+	-make english
+	-make dutch
+
+
Index: /tags/CWMM-0.3.0_GA/classes/help/ru/cwmm007.ipf
===================================================================
--- /tags/CWMM-0.3.0_GA/classes/help/ru/cwmm007.ipf	(revision 213)
+++ /tags/CWMM-0.3.0_GA/classes/help/ru/cwmm007.ipf	(revision 213)
@@ -0,0 +1,321 @@
+:userdoc.
+:docprof.
+:title.¯à ¢ª  CWMM
+
+.* ----------------------------------------------------------------------------
+:h1 res=010.ã€š®ä ©« MP3
+:p. ©« ¯à¥€áâ ¢«ï¥â á®¡®©  ã€š®ä ©« ¢ ä®à¬ â¥ MP3. 
+£® ¬®Š­® ¢®á¯à®š§¢®€šâì á
+¯®¬®éìî MMOS/2, ¥á«š ãáâ ­®¢«¥­ ¯®€å®€ïéš© MP3 MMIOProc.
+
+:p.®à¬ â MP3 šá¯®«ì§ã¥â áŠ âš¥ á ¯®â¥àï¬š €«ï ã¬¥­ìè¥­šï à §¬¥à  ä ©« 
+šáå®€­®£® ¬ â¥àš « .  §¬¥à ¯®â¥àì ¬®Š¥â ¡ëâì ¯àš¥¬«¥¬ë¬,   ¬®Š¥â š
+­¥¯àš¥¬«¥¬ë¬. ¡ëç­® šå ª®«šç¥áâ¢® ¬®Š­® ª®­âà®«šà®¢ âì á ¯®¬®éìî š­áâàã¬¥­â 
+ª®€šà®¢ ­šï. €­ ª® ¯®á«¥ ª®€šà®¢ ­šï ­¥¢®§¬®Š­® ¢®ááâ ­®¢šâì ¯®â¥àï­­ë¥ ¡šâë
+¡¥§ ¯®¢â®à­®£® ª®€šà®¢ ­šï šáå®€­®£® ä ©«  á ¬¥­ìè¥© áâ¥¯¥­ìî ¯®â¥àì.
+
+:p. ª¥â MP3 MMIOProc ¢ª«îçñ­ ¢ MMAudio Pak 2, €®áâã¯­ë© ¯®  €à¥áã&colon.
+
+:p.http&colon.//r6.ca/MMAudioPak/
+
+.* ----------------------------------------------------------------------------
+:h1 res=011.¥£ ID3
+:p.á¯®«ì§ã©â¥ íâã áâà ­šæã €«ï à¥€ ªâšà®¢ ­šï ¢ë¡à ­­ëå ¯®«¥© â¥£  ID3.
+
+:p.¥£ ID3 - íâ® ¬¥â € ­­ë¥, á¢ï§ ­­ë¥ á ª®­ªà¥â­®© €®à®Šª®©, ª®â®àë¥ åà ­ïâáï
+¢ ä ©«¥ MP3. ID3 - íâ® áâ ­€ àâ :hp1.€¥-ä ªâ®:ehp1., ®¡é¥¯àš§­ ­­ë©
+¡®«ìèš­áâ¢®¬ MP3-¯«¥¥à®¢.
+
+:p.
+á«š ¢á¥ ¯®«ï ¢¢®€  ¯ãáâë, ä ©« ­¥ š¬¥¥â â¥£  ID3. 
+á«š ­¥ª®â®àë¥ ¯®«ï ¯ãáâë,
+íâš € ­­ë¥ ­¥ ¡ë«š €®¡ ¢«¥­ë ¢ â¥£.
+
+:p.®¢ ï š­ä®à¬ æšï á®åà ­ï¥âáï â®«ìª® ¯®á«¥ ­ Š âšï ª­®¯ªš :hp2.®åà ­šâì:ehp2..
+
+:p.€¥áì ¬®Š¥â ¡ëâì ãª § ­  á«¥€ãîé ï š­ä®à¬ æšï:
+
+:hp2.
+:table rules=both frame=box cols='10 8 40'.
+:row.
+:c.®«¥
+:c.«š­ 
+:c.¯šá ­š¥
+:row.
+:c.Name
+:c.30
+:c. §¢ ­š¥ âà¥ª .
+:row.
+:c.Artist
+:c.30
+:c.¬ï šá¯®«­šâ¥«ï.
+:row.
+:c.Album
+:c.30
+:c.«ì¡®¬, á®€¥àŠ éš© âà¥ª.
+:row.
+:c.Comment
+:c.30
+:c.à®š§¢®«ì­ë© ª®¬¬¥­â àš© ª âà¥ªã.
+:row.
+:c.Year
+:c.4
+:c.¥âëà¥å§­ ç­ë© £®€ ¢ë¯ãáª   «ì¡®¬ .
+:row.
+:c.Genre
+:c.30
+:c. ­à âà¥ª ; ¢ë¡¥àšâ¥ š§ à áªàë¢ îé¥£®áï á¯šáª .
+:etable.
+:ehp2.
+
+.* ----------------------------------------------------------------------------
+:h1 res=013.¥£ ID3
+:p.  íâ®© áâà ­šæ¥ ®â®¡à Š îâáï ¢ë¡à ­­ë¥ ¯®«ï â¥£  ID3, ¢å®€ïé¥£® ¢ ä ©« MP3.
+
+:p.¥£ ID3 - íâ® ¬¥â € ­­ë¥, á¢ï§ ­­ë¥ á ª®­ªà¥â­®© €®à®Šª®©, ª®â®àë¥ åà ­ïâáï
+¢ ä ©«¥ MP3. ID3 - íâ® áâ ­€ àâ :hp1.€¥-ä ªâ®:ehp1., ®¡é¥¯àš§­ ­­ë©
+¡®«ìèš­áâ¢®¬ MP3-¯«¥¥à®¢.
+
+:p.
+á«š ¢á¥ ¯®«ï ¢¢®€  ¯ãáâë, ä ©« ­¥ š¬¥¥â â¥£  ID3. 
+á«š ­¥ª®â®àë¥ ¯®«ï ¯ãáâë,
+íâš € ­­ë¥ ­¥ ¡ë«š €®¡ ¢«¥­ë ¢ â¥£.
+
+:p.®¢ ï š­ä®à¬ æšï á®åà ­ï¥âáï â®«ìª® ¯®á«¥ ­ Š âšï ª­®¯ªš :hp2.®åà ­šâì:ehp2..
+
+:p.€¥áì ¬®Š¥â ¡ëâì ãª § ­  á«¥€ãîé ï š­ä®à¬ æšï:
+
+:hp2.
+:table rules=both frame=box cols='10 8 40'.
+:row.
+:c.®«¥
+:c.«š­ 
+:c.¯šá ­š¥
+:row.
+:c.¬ï
+:c.30
+:c. §¢ ­š¥ âà¥ª .
+:row.
+:c.á¯®«­šâ¥«ì
+:c.30
+:c.¬ï šá¯®«­šâ¥«ï.
+:row.
+:c.«ì¡®¬
+:c.30
+:c.«ì¡®¬, á®€¥àŠ éš© âà¥ª.
+:row.
+:c.®¬¬¥­â àš©
+:c.30
+:c.à®š§¢®«ì­ë© ª®¬¬¥­â àš© ª âà¥ªã.
+:row.
+:c.®€
+:c.4
+:c.¥âëà¥å§­ ç­ë© £®€ ¢ë¯ãáª   «ì¡®¬ .
+:row.
+:c. ­à
+:c.30
+:c. ­à âà¥ª ; ¢ë¡¥àšâ¥ š§ à áªàë¢ îé¥£®áï á¯šáª .
+:etable.
+:ehp2.
+
+.* ----------------------------------------------------------------------------
+:h1 res=012.¥â € ­­ë¥ âà¥ª 
+:p.á¯®«ì§ã©â¥ íâã áâà ­šæã €«ï à¥€ ªâšà®¢ ­šï š­ä®à¬ æšš ® âà¥ª¥.  ®â«šçš¥ ®â
+â¥£  ID3, á®€¥àŠš¬®¥ íâšå ¯®«¥© ¡ã€¥â á®åà ­¥­® ¢ à áèšà¥­­ëå  âàš¡ãâ å ä ©« 
+¯®á«¥ ­ Š âšï ª­®¯ªš :hp2.®åà ­šâì:ehp2..
+
+:nt.
+ áèšà¥­­ë¥  âàš¡ãâë ¯®€€¥àŠš¢ îâáï â®«ìª® OS/2 š €àã£š¬š ®¯¥à æš®­­ë¬š
+ášáâ¥¬ ¬š, ª®â®àë¥ šá¯®«ì§ãîâ íâš áâàãªâãàë € ­­ëå ¢ á¢®šå ä ©«®¢ëå ášáâ¥¬ å
+(HPFS, JFS, XFS, ZFS š ¢ ®£à ­šç¥­­®© áâ¥¯¥­š ext4). à®¬¥ â®£®, íâ  š­ä®à¬ æšï
+­¥ § ¯šáë¢ ¥âáï ­  CD š«š DVD.  à¥§ã«ìâ â¥ íâš € ­­ë¥ ­¥ ¡ã€ãâ á®åà ­¥­ë š«š
+¯¥à¥€ ­ë ¢¬¥áâ¥ á á®®â¢¥âáâ¢ãîéš¬š ä ©« ¬š ¢ «î¡ãî ášáâ¥¬ã, ª®â®à ï ­¥
+à á¯®§­ ¥â à áèšà¥­­ë¥  âàš¡ãâë, ¢ à¥§ã«ìâ â¥ ç¥£® ¢ â ªšå ª®¯šïå ®âáãâáâ¢ãîâ
+íâš € ­­ë¥, € Š¥ ¥á«š ®­š ¯àšáãâáâ¢ãîâ š ­¥âà®­ãâë ¢ šáâ®ç­šª¥. á¯®«ì§ã©â¥
+íâã äã­ªæšî á ®áâ®à®Š­®áâìî.
+:ent.
+
+:p.€¥áì ¬®Š¥â ¡ëâì ãª § ­  á«¥€ãîé ï š­ä®à¬ æšï. «š­  ª Š€®£® ¯®«ï ®£à ­šç¥­ 
+256 áš¬¢®« ¬š.
+
+:hp2.
+:table rules=both frame=box cols='10 40'.
+:row.
+:c.®«¥
+:c.¯šá ­š¥
+:row.
+:c.¬ï
+:c. §¢ ­š¥ âà¥ª .
+:row.
+:c.á¯®«­šâ¥«ì
+:c.¬ï šá¯®«­šâ¥«ï.
+:row.
+:c.«ì¡®¬
+:c.«ì¡®¬, á®€¥àŠ éš© âà¥ª.
+:row.
+:c.®¬¬¥­â àš©
+:c.à®š§¢®«ì­ë© ª®¬¬¥­â àš© ª âà¥ªã.
+:row.
+:c.®€
+:c.¥âëà¥å§­ ç­ë© £®€ ¢ë¯ãáª   «ì¡®¬ .
+:row.
+:c. ­à
+:c. ­à âà¥ª ; ¢ë¡¥àšâ¥ š§ à áªàë¢ îé¥£®áï á¯šáª .
+:etable.
+:ehp2.
+
+.* ----------------------------------------------------------------------------
+:h1 res=014.¢¥€¥­šï ®¡  ã€š®
+:p.  íâ®© áâà ­šæ¥ ®â®¡à Š îâáï à §«šç­ë¥ â¥å­šç¥áªš¥ á¢¥€¥­šï ® ¢ë¡à ­­®©
+§¢ãª®¢®© €®à®Šª¥.
+
+:p.«¥€ãîé ï š­ä®à¬ æšï ¯à¥€®áâ ¢«ï¥âáï ¢ à¥Šš¬¥ â®«ìª® €«ï çâ¥­šï&colon.
+
+:hp2.
+:table rules=both frame=box cols='20 40'.
+:row.
+:c. à ¬¥âà
+:c.¯šá ­š¥
+:row.
+:c.à¥¬ï ¢®á¯à®š§¢¥€¥­šï
+:c.«š­  § ¯šáš ¢ ¬¬&colon.ss.
+:row.
+:c. áâ®â  €šáªà¥âš§ æšš
+:c.«ï æšäà®¢®£®  ã€š® íâ® ®â­®ášâáï ª ª®«šç¥áâ¢ã ¢ë¡®à®ª (á¥¬¯«®¢), ¢§ïâëå ¢
+á¥ªã­€ã.  ª ¯à ¢š«®, ç¥¬ ¢ëè¥ ç áâ®â  €šáªà¥âš§ æšš (ç áâ®â  á¥¬¯«šà®¢ ­šï),
+â¥¬ ¢ëè¥ ª ç¥áâ¢® à¥§ã«ìâšàãîé¥£®  ã€š®¯®â®ª .
+:row.
+:c.šâ ­  á¥¯¬«
+:c.šâ®¢ ï £«ã¡š­  ª Š€®£® á¥¬¯« . ¥¬ ¡®«ìè¥ ¡šâ®¢ ï £«ã¡š­ , â¥¬ ¢ëè¥ ª ç¥áâ¢®
+¯®«ãç ¥¬®£®  ã€š®¯®â®ª . ã€š® ª ç¥áâ¢  CD šá¯®«ì§ã¥â 16-¡šâ­ãî £«ã¡š­ã.
+:row.
+:c. ­ «ë
+:c.®«šç¥áâ¢®  ã€š®ª ­ «®¢ ¢ ä ©«¥. ®­®ä®­šç¥áªš© §¢ãª á®€¥àŠšâ ®€š­ ª ­ «,
+áâ¥à¥® - €¢  š â.€.
+:etable.
+:ehp2.
+
+.* ----------------------------------------------------------------------------
+:h1 res=020.ã€š®ä ©« Ogg
+:p. ©« ï¢«ï¥âáï  ã€š®ä ©«®¬ Ogg. ­ ¬®Š¥â ¢®á¯à®š§¢®€šâìáï á šá¯®«ì§®¢ ­š¥¬
+MMOS/2, ¥á«š ãáâ ­®¢«¥­ ¯®€å®€ïéš© Ogg MMIOProc. Ogg ­  á ¬®¬ €¥«¥ ï¢«ï¥âáï
+ª®­â¥©­¥à­ë¬ ä®à¬ â®¬ š ¬®Š¥â á®áâ®ïâì š§  ã€š® (ä®à¬ â Vorbis š«š Opus €«ï
+áŠ â®£®  ã€š® á ¯®â¥àï¬š, š«š FLAC š«š OggPCM €«ï áŠ â®£®  ã€š® ¡¥§ ¯®â¥àì)
+š«š ¢š€¥® (ä®à¬ â Theora á ¯®â¥àï¬š).
+
+:p. §¬¥à ¯®â¥àì ¢  ã€š®ä ©«¥ Vorbis š«š Opus ¬®Š¥â ¡ëâì ¯àš¥¬«¥¬ë¬,   ¬®Š¥â š
+­¥¯àš¥¬«¥¬ë¬. ¡ëç­® šå ª®«šç¥áâ¢® ¬®Š­® ª®­âà®«šà®¢ âì á ¯®¬®éìî š­áâàã¬¥­â 
+ª®€šà®¢ ­šï. €­ ª® ¯®á«¥ ª®€šà®¢ ­šï ­¥¢®§¬®Š­® ¢®ááâ ­®¢šâì ¯®â¥àï­­ë¥ ¡šâë
+¡¥§ ¯®¢â®à­®£® ª®€šà®¢ ­šï šáå®€­®£® ä ©«  á ¬¥­ìè¥© áâ¥¯¥­ìî ¯®â¥àì.
+
+:p.Ogg MMIOProcs €«ï FLAC š Vorbis ¢ª«îç¥­ë ¢ ¢¥àášî ArcaOS 5.x š ¢ëè¥.
+ ª ç¥áâ¢¥  «ìâ¥à­ âš¢ë íâš MMIOProcs €®áâã¯­ë ¢ MMAudio Pak 2 €«ï OS/2.&colon.
+
+:p.http&colon.//r6.ca/MMAudioPak/
+
+.* ----------------------------------------------------------------------------
+:h1 res=030.CD  ã€š®âà¥ª
+:p. ©« ¯à¥€áâ ¢«ï¥â á®¡®© §¢ãª®¢ãî €®à®Šªã ª®¬¯ ªâ-€šáª .  §¢ ­š¥ âà¥ª  š
+€àã£ ï š­ä®à¬ æšï § ¯à èš¢ ¥âáï á á¥à¢¥à  CDDB, ¥á«š €®áâã¯­® ¯®€ª«îç¥­š¥ ª
+á¥âš ­â¥à­¥â. ­ä®à¬ æšï ¯à¥€®áâ ¢«ï¥âáï ¢ à¥Šš¬¥ â®«ìª® €«ï çâ¥­šï.
+
+:p.®«ìèš­áâ¢® á¥à¢¥à®¢ CDDB á«¥€ãîâ ¯à ªâšª¥ FreeDB, âà¥¡ãîé¥© €«ï €®áâã¯ 
+€¥©áâ¢šâ¥«ì­ë©  €à¥á í«¥ªâà®­­®© ¯®çâë. á¯®«ì§ã©â¥ ®¡ê¥ªâ ª®­äš£ãà æšš
+FreeDB Client ¢ ¯ ¯ª¥ Multimedia, çâ®¡ë ãáâ ­®¢šâì ¥£®.
+
+:p.­ä®à¬ æšï ® ¯®«ì§®¢ â¥«¥ åà ­šâáï ¢ ä ©«¥ cddb.ini ¢ ª â «®£¥ ãáâ ­®¢ªš.
+
+.* ----------------------------------------------------------------------------
+:h1 res=040.«¥©«šáâ M3U
+:p.â®â ä ©« ¯à¥€áâ ¢«ï¥â á®¡®© ¯«¥©«šáâ M3U (Moving Picture Experts Group
+Audio Layer 3 Uniform Resource Locator). M3U - íâ® áâ ­€ àâ :hp1.€¥-ä ªâ®:ehp1.,
+®¡é¥¯àš§­ ­­ë© ¡®«ìèš­áâ¢®¬ ¬ã§ëª «ì­ëå ¯«¥¥à®¢.
+
+:p.¯šá®ª ¢®á¯à®š§¢¥€¥­šï (¯«¥©«šáâ) M3U - íâ® â¥ªáâ®¢ë© ä ©«, á®€¥àŠ éš© ¯ãâš
+(URL- €à¥á ) ª €®à®Šª ¬ (âà¥ª ¬), ­  ª®â®àë¥ ®­ ááë« ¥âáï.
+
+:p.â®¡ë á®§€ âì á¯šá®ª ¢®á¯à®š§¢¥€¥­šï, ¯¥à¥â éšâ¥ è ¡«®­ ¯«¥©«šáâ  M3U š§
+¯ ¯ªš " ¡«®­ë ¬ã«ìâš¬¥€š " ¢ ¯®€å®€ïé¥¥ ¬¥áâ® ­  à ¡®ç¥¬ áâ®«¥. ¥à¥â éšâ¥
+¬¥€š ä ©«ë ¢ ª®­â¥©­¥à á¯šáª  ¢®á¯à®š§¢¥€¥­šï. â®¡ë š§¬¥­šâì ¯®àï€®ª âà¥ª®¢,
+ã¡¥€šâ¥áì, çâ® ¯ à ¬¥âà :hp1.á¥£€  ¯®€€¥àŠš¢ âì ¯®àï€®ª á®àâšà®¢ªš:ehp1. ¢
+¯®€¬¥­î :hp2.®àâšà®¢ âì:ehp2. ­¥ ¢ë¡à ­, ª ª š «î¡ë¥ €àã£š¥ ¯ à ¬¥âàë
+á®àâšà®¢ªš, ª®â®àë¥ ¬®£ãâ ¯®¢«šïâì ­  ¯®àï€®ª á®àâšà®¢ªš ¢àãç­ãî,
+š à ááâ ¢ìâ¥ €®à®Šªš ¯® á¢®¥¬ã ãá¬®âà¥­šî. ®åà ­šâ¥ ¯«¥©«šáâ, ¢ë¡à ¢
+¢ ¬¥­î :hp2. ©« | ®åà ­šâì:ehp2..
+
+.* ----------------------------------------------------------------------------
+:h1 res=050.ã€š®¯®â®ª
+:p.â®â ®¡ê¥ªâ ãª §ë¢ ¥â ­  ¯®â®ª, ¯à¥€®áâ ¢«ï¥¬ë© ¯®â®ª®¢ë¬ á¥à¢¥à®¬ ¢
+«®ª «ì­®© á¥âš š«š ç¥à¥§ ­â¥à­¥â. URL- €à¥á á¥à¢¥à  ãª §ë¢ ¥âáï ¢ ¡«®ª­®â¥
+á¢®©áâ¢ ¯®â®ª .
+
+:nt.
+®€€¥àŠš¢ îâáï â®«ìª® á¥à¢¥àë Icecast. ¥à¢¥àë, šá¯®«ì§ãîéš¥ €àã£š¥ ¯à®â®ª®«ë
+(Ampache, SHOUTcast, QuickTime Broadcaster, Open Broadcast System š â.€.)
+à ¡®â âì ­¥ ¡ã€ãâ.
+:ent.
+
+.* ----------------------------------------------------------------------------
+:h1 res=060.®­¢¥àâšà®¢ âì  ã€š®ä ©«
+:p.ª Ššâ¥ æ¥«¥¢®© âš¯  ã€š®ä ©«  š š¬ï ä ©« , ¢ª«îç ï ¯®«­ë© ¯ãâì. ¢¥€¥­šï ®¡
+šáå®€­®¬  ã€š®ä ©«¥ ®â®¡à Š îâáï ¢ ¢¥àå­¥© ç áâš €š «®£®¢®£® ®ª­ . ¡à âšâ¥
+¢­š¬ ­š¥, çâ® ­¥ª®â®àë¥ ä®à¬ âë ¬®£ãâ € ¢ âì ¡®«ìè¥ ¯®â¥àì, ç¥¬ €àã£š¥, š
+¯à¥®¡à §®¢ ­š¥ š§ ä®à¬ â  á ¯®â¥àï¬š ¢ ä®à¬ â á ¬¥­ìèš¬š ¯®â¥àï¬š (š«š ¡¥§
+¯®â¥àì) ­¥ ¯àš¢¥€ñâ ª ¢®ááâ ­®¢«¥­šî šáå®€­ëå ¡šâ®¢, ª®â®àëå ¬®Š¥â ¡®«ìè¥ ­¥
+¡ëâì ¢ šáå®€­®¬ ä ©«¥ (á ¯®â¥àï¬š),   ¢ ­¥ª®â®àëå á«ãç ïå ¬®Š¥â ¯àš¢¥áâš ª
+¯à¥®¡à §®¢ ­šî ¢ ä ©« ¡®«¥¥ ­š§ª®£® ª ç¥áâ¢ , ç¥¬ šáå®€­ë© ä ©« á ¯®â¥àï¬š.
+
+:p. à áªàë¢ îé¥¬áï á¯šáª¥ ¡ã€ãâ ¯¥à¥çšá«¥­ë €®áâã¯­ë¥ MMIOProcs (ª®€¥ªš) €«ï
+æ¥«¥¢®£® ä ©« .
+
+:p. Š¬šâ¥ ª­®¯ªã :hp2.®­¢¥àâšà®¢ âì:ehp2., çâ®¡ë ­ ç âì ¯à®æ¥áá, š
+:hp2.à¥à¢ âì:ehp2., çâ®¡ë ®â¬¥­šâì ¥£® ¯®á«¥ ­ ç «  ¯à¥®¡à §®¢ ­šï.
+ Š¬šâ¥ :hp2. ªàëâì:ehp2., çâ®¡ë ¢ë©âš š§ €š «®£®¢®£® ®ª­ .
+
+
+.* ----------------------------------------------------------------------------
+:h1 res=200.¢¥€¥­šï ®¡ š§®¡à Š¥­šš
+:p.  íâ®© áâà ­šæ¥ ®â®¡à Š îâáï à §«šç­ë¥ â¥å­šç¥áªš¥ á¢¥€¥­šï ® ¢ë¡à ­­®¬
+š§®¡à Š¥­šš.
+
+:p.«¥€ãîé ï š­ä®à¬ æšï ¯à¥€®áâ ¢«ï¥âáï ¢ à¥Šš¬¥ â®«ìª® €«ï çâ¥­šï:&colon.
+
+:hp2.
+:table rules=both frame=box cols='20 40'.
+:row.
+:c. à ¬¥âà
+:c.¯šá ­š¥
+:row.
+:c.IOProc
+:c.š¯ MMIOProc šá¯®«ì§ã¥¬ë© €«ï ¢š§ã «š§ æšš š§®¡à Š¥­šï.
+:row.
+:c.šàš­ 
+:c.šàš­  š§®¡à Š¥­šï ¢ ¯šªá¥«ïå.
+:row.
+:c.ëá®â 
+:c.ëá®â  š§®¡à Š¥­šï ¢ ¯šªá¥«ïå.
+:row.
+:c.«ã¡š­ 
+:c.®«šç¥áâ¢® æ¢¥â®¢ (£«ã¡š­  æ¢¥â ) š§®¡à Š¥­šï.
+:etable.
+:ehp2.
+
+.* ----------------------------------------------------------------------------
+:h1 res=210.®­¢¥àâšà®¢ âì æšäà®¢®¥ š§®¡à Š¥­š¥
+:p.ª Ššâ¥ âš¯ ä ©«  æ¥«¥¢®£® š§®¡à Š¥­šï š š¬ï ä ©« , ¢ª«îç ï ¯®«­ë© ¯ãâì.
+ ¢¥àå­¥© ç áâš €š «®£®¢®£® ®ª­  ®â®¡à Š ¥âáï ¬š­š âîà  šáå®€­®£® ä ©« 
+š§®¡à Š¥­šï. ¡à âšâ¥ ¢­š¬ ­š¥, çâ® ­¥ª®â®àë¥ ä®à¬ âë ¬®£ãâ € ¢ âì ¡®«ìè¥
+¯®â¥àì, ç¥¬ €àã£š¥, š ¯à¥®¡à §®¢ ­š¥ š§ ä®à¬ â  á ¯®â¥àï¬š ¢ ä®à¬ â á ¬¥­ìèš¬š
+¯®â¥àï¬š (š«š ¡¥§ ¯®â¥àì) ­¥ ¯àš¢¥€ñâ ª ¢®ááâ ­®¢«¥­šî šáå®€­ëå ¡šâ®¢, ª®â®àëå
+¬®Š¥â ¡®«ìè¥ ­¥ ¡ëâì ¢ šáå®€­®¬ ä ©«¥ (á ¯®â¥àï¬š),   ¢ ­¥ª®â®àëå á«ãç ïå ¬®Š¥â
+¯àš¢¥áâš ª ¯à¥®¡à §®¢ ­šî ¢ ä ©« ¡®«¥¥ ­š§ª®£® ª ç¥áâ¢ , ç¥¬ šáå®€­ë© ä ©« á
+¯®â¥àï¬š.
+
+:p. à áªàë¢ îé¥¬áï á¯šáª¥ ¡ã€ãâ ¯¥à¥çšá«¥­ë €®áâã¯­ë¥ MMIOProcs (ª®€¥ªš) €«ï
+æ¥«¥¢®£® ä ©« .
+
+:p. Š¬šâ¥ ª­®¯ªã :hp2.®­¢¥àâšà®¢ âì:ehp2., çâ®¡ë ­ ç âì ¯à®æ¥áá, š
+:hp2.à¥à¢ âì:ehp2., çâ®¡ë ®â¬¥­šâì ¥£® ¯®á«¥ ­ ç «  ¯à¥®¡à §®¢ ­šï.
+ Š¬šâ¥ :hp2. ªàëâì:ehp2., çâ®¡ë ¢ë©âš š§ €š «®£®¢®£® ®ª­ .
+
+:euserdoc.
Index: /tags/CWMM-0.3.0_GA/classes/help/ru/makefile
===================================================================
--- /tags/CWMM-0.3.0_GA/classes/help/ru/makefile	(revision 213)
+++ /tags/CWMM-0.3.0_GA/classes/help/ru/makefile	(revision 213)
@@ -0,0 +1,83 @@
+# Makefile
+
+include ../../../make.inc
+
+LANGUAGE	= 007
+DISTNAME	=	cwaudio-classes-$(VERSION)
+CC           = icc
+
+LDFLAGS =	-Ge- /Gm+ -G4 /ss -Gl /O+ -Oc+ -Ol-  /Q+
+CFLAGS       =   -Ge- /Gm+ -G4 /ss -Gl /O+ -Oc+ -Ol- /Q+ /C
+
+LIBS		=	somtk.lib mmPM2.lib rexx.lib
+DEFS		=
+
+
+
+OBJECTS	=
+
+all: cwmm$(LANGUAGE).hlp
+
+cwmm$(LANGUAGE).hlp:	cwmm$(LANGUAGE).ipf
+	ipfc -C:866 -L:RUS -D:7 cwmm$(LANGUAGE).ipf cwmm$(LANGUAGE).hlp
+
+
+clean:
+	-rm *.hlp
+
+cleaner:
+	-rm *.*~
+
+german:
+	-cd ..\. && mkdir CWAudio-$(VERSION)-ger
+	-cd ..\CWAudio-$(VERSION)-ger && rm -r *
+	-cd ..\CWAudio-$(VERSION)-ger && mkdir old_inst
+	-cp ./old_inst/* ..\CWAudio-$(VERSION)-ger/old_inst/
+	-cp ./cwmm.dll ../CWAudio-$(VERSION)-ger
+	-cp ./setFolder.cmd ../CWAudio-$(VERSION)-ger 	
+	-cp ./ger/Readme.ger ../CWAudio-$(VERSION)-ger
+	-cp ./FILE_ID.DIZ ../CWAudio-$(VERSION)-ger
+	-cp ./cwmm049.hlp ../CWAudio-$(VERSION)-ger/cwmm.hlp
+	-cp ./ger/cwaudio.ins ../CWAudio-$(VERSION)-ger
+	-cp ./ger/Lizenz ../CWAudio-$(VERSION)-ger
+	-rc ./cwaudio049.rc ../CWAudio-$(VERSION)-ger/cwmm.dll
+	-cd ..\CWAudio-$(VERSION)-ger && lxlite *
+#	-cd ../CWAudio-$(VERSION)-ger && zip -r $(DISTNAME)-ger.zip *
+
+english:
+	-cd ..\. && mkdir CWAudio-$(VERSION)-eng
+	-cd ..\CWAudio-$(VERSION)-eng && rm -r *
+	-cd ..\CWAudio-$(VERSION)-eng && mkdir old_inst
+	-cp ./old_inst/* ..\CWAudio-$(VERSION)-eng\old_inst
+	-cp ./cwmm.dll ../CWAudio-$(VERSION)-eng 	
+	-cp ./cwmm.hlp ../CWAudio-$(VERSION)-eng
+	-cp ./setFolder.cmd ../CWAudio-$(VERSION)-eng 	
+	-cp ./eng/Readme.eng ../CWAudio-$(VERSION)-eng 	
+	-cp ./FILE_ID.DIZ ../CWAudio-$(VERSION)-eng
+	-cp ./eng/cwaudio.ins ../CWAudio-$(VERSION)-eng
+	-cp ./eng/License ../CWAudio-$(VERSION)-eng
+	-cd ..\CWAudio-$(VERSION)-eng && lxlite *
+#	-cd ../CWAudio-$(VERSION)-eng && zip -r $(DISTNAME)-eng.zip *
+
+russian:
+	-cd ..\. && mkdir CWAudio-$(VERSION)-rus
+	-cd ..\CWAudio-$(VERSION)-rus && rm -r *
+	-cd ..\CWAudio-$(VERSION)-rus && mkdir old_inst
+	-cp ./old_inst/* ..\CWAudio-$(VERSION)-rus\old_inst
+	-cp ./cwmm.dll ../CWAudio-$(VERSION)-rus
+	-cp ./cwmm.hlp ../CWAudio-$(VERSION)-rus
+	-cp ./setFolder.cmd ../CWAudio-$(VERSION)-rus
+	-cp ./eng/Readme.rus ../CWAudio-$(VERSION)-rus
+	-cp ./FILE_ID.DIZ ../CWAudio-$(VERSION)-rus
+	-cp ./rus/cwaudio.ins ../CWAudio-$(VERSION)-rus
+	-cp ./rus/License ../CWAudio-$(VERSION)-rus
+	-rc ./cwaudio033.rc ../CWAudio-$(VERSION)-rus/cwmm.dll
+	-cd ..\CWAudio-$(VERSION)-rus && lxlite *
+#	-cd ../CWAudio-$(VERSION)-rus && zip -r $(DISTNAME)-rus.zip *
+
+distribution:
+	make
+	-make german
+	-make english
+	-make russian
+
Index: /tags/CWMM-0.3.0_GA/classes/help/tw/cwmm088.ipf
===================================================================
--- /tags/CWMM-0.3.0_GA/classes/help/tw/cwmm088.ipf	(revision 213)
+++ /tags/CWMM-0.3.0_GA/classes/help/tw/cwmm088.ipf	(revision 213)
@@ -0,0 +1,136 @@
+:userdoc.
+
+:docprof.
+
+:title.žÑ»¡
+
+:h1 res=010.MP3 Án­µÀÉ®×
+:p.
+³o¬O€@­Ó MP3 Án­µÀÉ®×¡CŠbŠwžË§¹ MMIOMP3¡]§K¶OªºŠhŽCÅé IO ³B²zŸ¹¡^«áŽN¥i¥HšÏ¥Î MMOS/2 šÓŒœ©ñ¡CMP3 ÀÉ®×¥]§tÀ£ÁY¹Lªº­µ°Tžê®Æ¡A¥B¬OšãŠ³¯}Ãa©ÊªºÀ£ÁYªk¡C
+:p.
+€Užü IO ³B²zŸ¹¡G
+:p.
+:link reftype=launch
+object='netscape.exe'
+data='http://www.math.berkeley.edu/~roconnor/'.
+http&colon.//www.math.berkeley.edu/~roconnor/:elink.
+
+:h1 res=011.ID3 ŒÐÅÒ
+:p.
+§Q¥Î³o­Ó­¶­±šÓœs¿è ID3 ŒÐÅÒ¡C­Y¶µ¥ØÄæŠì¬OªÅªº¡Aªí¥Ü©|¥ŒŠ³ŒÐÅÒ¡C¥uŠ³«ö€U:hp2.ÀxŠs:ehp2. «ö¶s®É¡A·sžê°T€~·|³QÀxŠs¡C
+
+:p.
+¥i¥H«ü©w¥H€Uªºžê°T¡G
+:ul.
+:li.:hp2.Š±¥ØŠWºÙ¡Gehp2.:ehp2.
+.br
+Š±¥ØŠWºÙ¡CŠWºÙªø«×­­šî 30 ­ÓŠr€ž¡C
+
+:li.:hp2.ºt¥XªÌ¡Gehp2.:ehp2.
+.br
+ºt¥XªÌŠWºÙ¡CŠWºÙªø«×­­šî 30 ­ÓŠr€ž¡C
+
+:li.:hp2.±M¿è¡Gehp2.:ehp2.
+.br
+¥]§t³o­ÓŠ±¥Øªº±M¿è¡CŠWºÙªø«×­­šî 30 ­ÓŠr€ž¡C
+
+:li.:hp2.µùžÑ¡Gehp2.:ehp2.
+.br
+¥ô·NªºµùžÑ¡CŠWºÙªø«×­­šî 30 ­ÓŠr€ž¡C
+
+:li.:hp2.Š~¥÷¡Gehp2.:ehp2.
+.br
+±M¿èµoŠæªºŠ~¥÷¡C
+
+:li.:hp2.Ãþ«¬¡Gehp2.:ehp2.
+.br
+¥»Š±¥Øªº­·®æÃþ«¬¡C
+
+:eul.
+
+:h1 res=013.ID3 Tag
+:p.
+³o€@­¶·|Åã¥Ü MP3 ÀÉ®×ªº ID3 ŒÐÅÒ¡CID3 ¬O€@­Ó¥i¥H±Nžê°T¥[šì MP3 €€ªºŒÐ·Ç¡A¹³¬OŠ±¥ØªºŒÐÃD©Î¬OŠ±¥Øºt¥XªÌ¡C
+:p.
+­Y¶µ¥ØÄæŠì¬OªÅªº¡Aªí¥Ü©|¥ŒŠ³ŒÐÅÒ¡C
+
+:p.
+:ul.
+:li.:hp2.Š±¥ØŠWºÙ¡Gehp2.:ehp2.
+.br
+Š±¥ØŠWºÙ¡CŠWºÙªø«×­­šî 30 ­ÓŠr€ž¡C
+
+:li.:hp2.ºt¥XªÌ¡Gehp2.:ehp2.
+.br
+ºt¥XªÌŠWºÙ¡CŠWºÙªø«×­­šî 30 ­ÓŠr€ž¡C
+
+:li.:hp2.±M¿è¡Gehp2.:ehp2.
+.br
+¥]§t³o­ÓŠ±¥Øªº±M¿è¡CŠWºÙªø«×­­šî 30 ­ÓŠr€ž¡C
+
+:li.:hp2.µùžÑ¡Gehp2.:ehp2.
+.br
+¥ô·NªºµùžÑ¡CŠWºÙªø«×­­šî 30 ­ÓŠr€ž¡C
+
+:li.:hp2.Š~¥÷¡Gehp2.:ehp2.
+.br
+±M¿èµoŠæªºŠ~¥÷¡C
+
+:li.:hp2.Ãþ«¬¡Gehp2.:ehp2.
+.br
+¥»Š±¥Øªº­·®æÃþ«¬¡C
+
+:eul.
+
+:h1 res=012.Š±¥ØŠWºÙ
+:p.
+§Q¥Î³o€@­¶šÓœs¿èŠ±¥Øªºžê°T¡CÄæŠì€€ªº€º®e·|ÀxŠsŠbÀÉ®×ªº©µŠùÄÝ©Ê€€¡C³ošÇ·sªºžê°T¥uŠ³Šb«ö€U:hp2.ÀxŠs¡Gehp2.«ö¶s®É€~·|³QÀxŠs¡C:ehp2.
+:nt.
+©µŠùÄÝ©Ê¥u³Q OS/2 €äŽ©¡A¥BµLªk³QÀxŠsŠb¥úºÐ€€¡C­Y§A±NÀÉ®×œÆ»sšì¥úºÐ©Î¥t€@­Ó§@·~št²Î¡A³ošÇžê°T·|¿ò¥¢¡C
+:ent.
+:p.
+¥i¥H«ü©w¥H€Uªºžê°T¡AšC­ÓÄæŠìªºªø«×­­šî¬° 256 ­ÓŠr€ž¡C
+:ul.
+:li.:hp2.Š±¥ØŠWºÙ&colon.:ehp2.
+:p.Š±¥ØŠWºÙ¡C
+
+:li.:hp2.ºt¥XªÌ&colon.:ehp2.
+:p.ºt¥XªÌŠWºÙ¡C
+
+:li.:hp2.±M¿è&colon.:ehp2.
+:p.¥]§tŠ¹Š±¥Øªº±M¿è¡C
+
+:li.:hp2.µùžÑ&colon.:ehp2.
+:p.¥ô·NªºµùžÑ¡C
+
+:li.:hp2.Š~¥÷&colon.:ehp2.
+:p.±M¿èµoŠæªºŠ~¥÷¡C
+
+:li.:hp2.Ãþ«¬&colon.:ehp2.
+:p.¥»Š±¥Øªº­·®æÃþ«¬¡C
+
+:eul.
+
+:h1 res=020.Ogg ­µ°TÀÉ®×ªºžÑ»¡
+:p.
+³o¬O€@­Ó Ogg ­µ°TÀÉ®×¡CŠbŠwžË§¹ MMIOVORB¡]§K¶OªºŠhŽCÅé IO ³B²zŸ¹¡^«áŽN¥i¥HšÏ¥Î MMOS/2 šÓŒœ©ñ¡COgg ÀÉ®×¥]§tÃþŠü©ó MP3 ÀÉ®×ªºÀ£ÁY­µ°Tžê®Æ¡A¥B¬OšãŠ³¯}Ãa©ÊªºÀ£ÁYªk¡C
+:p.
+€Užü IO ³B²zŸ¹¡G
+:p.
+:link reftype=launch
+object='netscape.exe'
+data='http://www.math.berkeley.edu/~roconnor/'.
+http&colon.//www.math.berkeley.edu/~roconnor/:elink.
+
+
+:h1 res=030.CD Š±¥ØªºžÑ»¡
+:p.
+³o¬O€@­Ó CD Án­µŠ±¥Øªºª«¥ó¡C­Y¥i¥H³s€Wºôžô¡A«h¥i¥H±q FreeDB ŠøªAŸ¹¬džßŠ±¥ØŠWºÙ€Îšä¥Lªºžê°T¡C§A¥²¶·«ü©w e-mail Šì§}€~¯àšÏ¥Î FreeDB¡AŠA§Q¥Î³]©w²ÕºA¥óšÓ°µ³]©w¡C
+:p.
+šÏ¥ÎªÌ°T®§·|ÀxŠsŠbŠwžË¥Ø¿ýªº cddb.ini ÀÉ®×€€¡C
+
+:h1 res=040.M3U Œœ©ñ²M³æªºžÑ»¡
+:p.
+³o¬O€@­Ó M3U Œœ©ñ²M³æªºª«¥ó¡CM3U Œœ©ñ²M³æ¬O€@­Ó€åŠrÀÉ®×¡A¥]§t­nŒœ©ñŠ±¥Øªºžô®|¡C³ošÇŒœ©ñ²M³æ¥i¥H³Q¥i²ŸŽÓªº MP3 Œœ©ñŸ¹©ÒšÏ¥Î¡CŠ³€@­Óœs¿èŸ¹¥i¥H§Q¥Î·Æ¹«ªº©ì©ñšÓ­×§ï M3U ÀÉ®×¡C
+
+:euserdoc.
Index: /tags/CWMM-0.3.0_GA/classes/help/tw/makefile
===================================================================
--- /tags/CWMM-0.3.0_GA/classes/help/tw/makefile	(revision 213)
+++ /tags/CWMM-0.3.0_GA/classes/help/tw/makefile	(revision 213)
@@ -0,0 +1,67 @@
+# Makefile
+
+include ../../../make.inc
+
+LANGUAGE	= 088
+DISTNAME	=	cwaudio-classes-$(VERSION)
+CC           = icc
+
+LDFLAGS =	-Ge- /Gm+ -G4 /ss -Gl /O+ -Oc+ -Ol-  /Q+ 
+CFLAGS       =   -Ge- /Gm+ -G4 /ss -Gl /O+ -Oc+ -Ol- /Q+ /C
+
+LIBS		=	somtk.lib mmPM2.lib rexx.lib
+DEFS		= 
+
+
+
+OBJECTS	= 
+
+all: cwmm$(LANGUAGE).hlp
+
+cwmm$(LANGUAGE).hlp:	cwmm$(LANGUAGE).ipf
+	ipfc -C:950 -L:TWN -D:88 cwmm$(LANGUAGE).ipf cwmm$(LANGUAGE).hlp      
+
+
+clean:
+	-rm *.hlp
+
+cleaner:
+	-rm *.*~
+
+taiwan:
+	-cd ..\. && mkdir CWAudio-$(VERSION)-tw
+	-cd ..\CWAudio-$(VERSION)-tw && rm -r *
+	-cd ..\CWAudio-$(VERSION)-tw && mkdir old_inst
+	-cp ./old_inst/* ..\CWAudio-$(VERSION)-tw\old_inst
+	-cp ./cwmm.dll ../CWAudio-$(VERSION)-tw 	
+	-cp ./cwmm.hlp ../CWAudio-$(VERSION)-tw
+	-cp ./setFolder.cmd ../CWAudio-$(VERSION)-tw 	
+	-cp ./tw/Readme.tw ../CWAudio-$(VERSION)-tw 	
+	-cp ./FILE_ID.DIZ ../CWAudio-$(VERSION)-tw
+	-cp ./tw/cwaudio.ins ../CWAudio-$(VERSION)-tw
+	-cp ./tw/License ../CWAudio-$(VERSION)-tw
+	-cd ..\CWAudio-$(VERSION)-tw && lxlite *
+#	-cd ../CWAudio-$(VERSION)-tw && zip -r $(DISTNAME)-tw.zip *
+
+english:
+	-cd ..\. && mkdir CWAudio-$(VERSION)-eng
+	-cd ..\CWAudio-$(VERSION)-eng && rm -r *
+	-cd ..\CWAudio-$(VERSION)-eng && mkdir old_inst
+	-cp ./old_inst/* ..\CWAudio-$(VERSION)-eng\old_inst
+	-cp ./cwmm.dll ../CWAudio-$(VERSION)-eng 	
+	-cp ./cwmm.hlp ../CWAudio-$(VERSION)-eng
+	-cp ./setFolder.cmd ../CWAudio-$(VERSION)-eng 	
+	-cp ./eng/Readme.eng ../CWAudio-$(VERSION)-eng 	
+	-cp ./FILE_ID.DIZ ../CWAudio-$(VERSION)-eng
+	-cp ./eng/cwaudio.ins ../CWAudio-$(VERSION)-eng
+	-cp ./eng/License ../CWAudio-$(VERSION)-eng
+	-cd ..\CWAudio-$(VERSION)-eng && lxlite *
+#	-cd ../CWAudio-$(VERSION)-eng && zip -r $(DISTNAME)-eng.zip *
+
+
+distribution:
+	make
+	make taiwan
+	-make english
+
+
Index: /tags/CWMM-0.3.0_GA/classes/idl/idl_audio/create-cwaudio_hh.CMD
===================================================================
--- /tags/CWMM-0.3.0_GA/classes/idl/idl_audio/create-cwaudio_hh.CMD	(revision 213)
+++ /tags/CWMM-0.3.0_GA/classes/idl/idl_audio/create-cwaudio_hh.CMD	(revision 213)
@@ -0,0 +1,7 @@
+@echo off
+rem /* */
+rem call RxFuncAdd 'SysLoadFuncs', 'RexxUtil', 'SysLoadFuncs'
+rem call SysLoadFuncs
+
+sc -shh -S 64000  -I ../idl_mm -m noqualifytypes cwaudio.idl
+
Index: /tags/CWMM-0.3.0_GA/classes/idl/idl_audio/cw_au.idl
===================================================================
--- /tags/CWMM-0.3.0_GA/classes/idl/idl_audio/cw_au.idl	(revision 213)
+++ /tags/CWMM-0.3.0_GA/classes/idl/idl_audio/cw_au.idl	(revision 213)
@@ -0,0 +1,139 @@
+/*
+ * (C) Chris Wohlgemuth 2002-2003
+ *
+ */
+/*
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; see the file COPYING.  If not, write to
+ * the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
+ */          
+/*
+ * If you need another license for your project/product (commercial,
+ * noncommercial, whatever) contact me at
+ * 
+ * http://www.os2world.com/cdwriting
+ * http://www.geocities.com/SiliconValley/Sector/5785/
+ *
+ */
+
+/*
+ * cw_au.idl:
+ */
+
+#include <cwaudio.idl>
+
+
+/*
+   CLASS: 
+*/
+
+interface M_MM_AU; 
+
+interface MM_AU : MMAudio
+{
+
+    /*
+     * New instance methods
+     *
+     */
+
+
+#ifdef __SOMIDL__
+  implementation {
+
+    /*
+     * Class Modifiers:
+     *
+     */
+
+    externalprefix = cw_au_;
+    externalstem = cw_au;
+    majorversion = 1;
+    minorversion = 2;
+    filestem = cw_au;           //# specifies the filestem for sc-generated files
+    metaclass = M_MM_AU;
+    dllname = "CWMM.dll";
+    callstyle = oidl;
+
+
+    /*
+     * Internal instance variables
+     *
+     */
+
+
+    /*
+     * methods overridden 
+     *
+     */
+
+#ifdef __PRIVATE__
+
+#endif
+
+  }; // implementation
+#endif /* __SOMIDL__ */
+};
+
+
+interface M_MM_AU : M_MMAudio
+{
+
+    /*
+     * New class methods
+     *
+     */
+
+
+#ifdef __SOMIDL__
+  implementation {
+
+
+    /*
+     * Class Modifiers:
+     *
+     */
+
+    externalprefix = cw_auM_;
+    externalstem = cw_auM;
+    functionprefix = cw_auM_;
+    majorversion = 1;
+    minorversion = 2;
+    filestem = cw_au;           //# specifies the filestem for sc-generated files
+    dllname = "CWMM.dll";
+    callstyle = oidl;
+
+    /*
+     * Internal class variables
+     *
+     */
+
+    /*
+     * methods overridden 
+     *
+     */
+    wpclsQueryInstanceType  	: override;
+    wpclsQueryInstanceFilter    : override;   
+
+    wpclsQueryDefaultHelp       : override; 
+    wpclsQueryTitle   	        : override;   
+    wpclsQueryIconData          : override;
+  };
+
+#endif /* __SOMIDL__ */
+
+};
+
+
+
+
Index: /tags/CWMM-0.3.0_GA/classes/idl/idl_audio/cwaif.idl
===================================================================
--- /tags/CWMM-0.3.0_GA/classes/idl/idl_audio/cwaif.idl	(revision 213)
+++ /tags/CWMM-0.3.0_GA/classes/idl/idl_audio/cwaif.idl	(revision 213)
@@ -0,0 +1,139 @@
+/*
+ * (C) Chris Wohlgemuth 2002-2003
+ *
+ */
+/*
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; see the file COPYING.  If not, write to
+ * the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
+ */          
+/*
+ * If you need another license for your project/product (commercial,
+ * noncommercial, whatever) contact me at
+ * 
+ * http://www.os2world.com/cdwriting
+ * http://www.geocities.com/SiliconValley/Sector/5785/
+ *
+ */
+
+/*
+ * cwaif.idl:
+ */
+
+#include <cwaudio.idl>
+
+
+/*
+   CLASS: 
+*/
+
+interface M_MMAIF; 
+
+interface MMAIF : MMAudio
+{
+
+    /*
+     * New instance methods
+     *
+     */
+
+
+#ifdef __SOMIDL__
+  implementation {
+
+    /*
+     * Class Modifiers:
+     *
+     */
+
+    externalprefix = cwaif_;
+    externalstem = cwaif;
+    majorversion = 1;
+    minorversion = 2;
+    filestem = cwaif;           //# specifies the filestem for sc-generated files
+    metaclass = M_MMAIF;
+    dllname = "CWMM.dll";
+    callstyle = oidl;
+
+
+    /*
+     * Internal instance variables
+     *
+     */
+
+
+    /*
+     * methods overridden 
+     *
+     */
+
+#ifdef __PRIVATE__
+
+#endif
+
+  }; // implementation
+#endif /* __SOMIDL__ */
+};
+
+
+interface M_MMAIF : M_MMAudio
+{
+
+    /*
+     * New class methods
+     *
+     */
+
+
+#ifdef __SOMIDL__
+  implementation {
+
+
+    /*
+     * Class Modifiers:
+     *
+     */
+
+    externalprefix = cwaifM_;
+    externalstem = cwaifM;
+    functionprefix = cwaifM_;
+    majorversion = 1;
+    minorversion = 2;
+    filestem = cwaif;           //# specifies the filestem for sc-generated files
+    dllname = "CWMM.dll";
+    callstyle = oidl;
+
+    /*
+     * Internal class variables
+     *
+     */
+
+    /*
+     * methods overridden 
+     *
+     */
+    wpclsQueryInstanceType  	: override;
+    wpclsQueryInstanceFilter    : override;   
+
+    wpclsQueryDefaultHelp       : override; 
+    wpclsQueryTitle   	        : override;   
+    wpclsQueryIconData          : override;
+  };
+
+#endif /* __SOMIDL__ */
+
+};
+
+
+
+
Index: /tags/CWMM-0.3.0_GA/classes/idl/idl_audio/cwastream.idl
===================================================================
--- /tags/CWMM-0.3.0_GA/classes/idl/idl_audio/cwastream.idl	(revision 213)
+++ /tags/CWMM-0.3.0_GA/classes/idl/idl_audio/cwastream.idl	(revision 213)
@@ -0,0 +1,144 @@
+/*
+ * (C) Chris Wohlgemuth 2002-2003
+ *
+ */
+/*
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; see the file COPYING.  If not, write to
+ * the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
+ */          
+/*
+ * If you need another license for your project/product (commercial,
+ * noncommercial, whatever) contact me at
+ * 
+ * http://www.os2world.com/cdwriting
+ * http://www.geocities.com/SiliconValley/Sector/5785/
+ *
+ */
+
+/*
+ * cwaudiostream.idl:
+ */
+
+#include <cwaudio.idl>
+#include <wprootf.idl>
+
+/*
+   CLASS: 
+*/
+
+interface M_MMAudioStream; 
+
+interface MMAudioStream : MMAudio
+{
+
+    /*
+     * New instance methods
+     *
+     */
+	ULONG cwmmAddURLPage(in HWND hwndNotebook); 
+
+#ifdef __SOMIDL__
+  implementation {
+    releaseorder:
+        cwmmAddURLPage;
+    /*
+     * Class Modifiers:
+     *
+     */
+
+    externalprefix = cwastream_;
+    externalstem = cwastream;
+    majorversion = 1;
+    minorversion = 2;
+    filestem = cwastream;           //# specifies the filestem for sc-generated files
+    metaclass = M_MMAudioStream;
+    dllname = "CWMM.dll";
+    callstyle = oidl;
+
+
+    /*
+     * Internal instance variables
+     *
+     */
+
+
+    /*
+     * methods overridden 
+     *
+     */
+    wpCopiedFromTemplate       : override;
+    wpModifyPopupMenu          : override;
+    wpAddSettingsPages         : override;
+    wpInitData                 : override;
+    cwmmAddAudioInformationPage : override;
+    cwmmAddTrackNamePage       : override;
+
+#ifdef __PRIVATE__
+
+#endif
+
+  }; // implementation
+#endif /* __SOMIDL__ */
+};
+
+
+interface M_MMAudioStream : M_MMAudio
+{
+
+    /*
+     * New class methods
+     *
+     */
+
+
+#ifdef __SOMIDL__
+  implementation {
+
+
+    /*
+     * Class Modifiers:
+     *
+     */
+
+    externalprefix = cwastreamM_;
+    externalstem = cwastreamM;
+    functionprefix = cwastreamM_;
+    majorversion = 1;
+    minorversion = 2;
+    filestem = cwastream;           //# specifies the filestem for sc-generated files
+    dllname = "CWMM.dll";
+    callstyle = oidl;
+
+    /*
+     * Internal class variables
+     *
+     */
+
+    /*
+     * methods overridden 
+     *
+     */
+    wpclsQueryInstanceType  	: override;
+    wpclsQueryDefaultHelp       : override; 
+    wpclsQueryTitle   	        : override;   
+    wpclsQueryIconData          : override;
+  };
+
+#endif /* __SOMIDL__ */
+
+};
+
+
+
+
Index: /tags/CWMM-0.3.0_GA/classes/idl/idl_audio/cwau.idl
===================================================================
--- /tags/CWMM-0.3.0_GA/classes/idl/idl_audio/cwau.idl	(revision 213)
+++ /tags/CWMM-0.3.0_GA/classes/idl/idl_audio/cwau.idl	(revision 213)
@@ -0,0 +1,139 @@
+/*
+ * (C) Chris Wohlgemuth 2002-2003
+ *
+ */
+/*
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; see the file COPYING.  If not, write to
+ * the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
+ */          
+/*
+ * If you need another license for your project/product (commercial,
+ * noncommercial, whatever) contact me at
+ * 
+ * http://www.os2world.com/cdwriting
+ * http://www.geocities.com/SiliconValley/Sector/5785/
+ *
+ */
+
+/*
+ * cwau.idl:
+ */
+
+#include <cwaudio.idl>
+
+
+/*
+   CLASS: 
+*/
+
+interface M_MMAU; 
+
+interface MMAU : MMAudio
+{
+
+    /*
+     * New instance methods
+     *
+     */
+
+
+#ifdef __SOMIDL__
+  implementation {
+
+    /*
+     * Class Modifiers:
+     *
+     */
+
+    externalprefix = cwau_;
+    externalstem = cwau;
+    majorversion = 1;
+    minorversion = 2;
+    filestem = cwau;           //# specifies the filestem for sc-generated files
+    metaclass = M_MMAU;
+    dllname = "CWMM.dll";
+    callstyle = oidl;
+
+
+    /*
+     * Internal instance variables
+     *
+     */
+
+
+    /*
+     * methods overridden 
+     *
+     */
+
+#ifdef __PRIVATE__
+
+#endif
+
+  }; // implementation
+#endif /* __SOMIDL__ */
+};
+
+
+interface M_MMAU : M_MMAudio
+{
+
+    /*
+     * New class methods
+     *
+     */
+
+
+#ifdef __SOMIDL__
+  implementation {
+
+
+    /*
+     * Class Modifiers:
+     *
+     */
+
+    externalprefix = cwauM_;
+    externalstem = cwauM;
+    functionprefix = cwauM_;
+    majorversion = 1;
+    minorversion = 2;
+    filestem = cwau;           //# specifies the filestem for sc-generated files
+    dllname = "CWMM.dll";
+    callstyle = oidl;
+
+    /*
+     * Internal class variables
+     *
+     */
+
+    /*
+     * methods overridden 
+     *
+     */
+    wpclsQueryInstanceType  	: override;
+    wpclsQueryInstanceFilter    : override;   
+
+    wpclsQueryDefaultHelp       : override; 
+    wpclsQueryTitle   	        : override;   
+    wpclsQueryIconData          : override;
+  };
+
+#endif /* __SOMIDL__ */
+
+};
+
+
+
+
Index: /tags/CWMM-0.3.0_GA/classes/idl/idl_audio/cwaudio.idl
===================================================================
--- /tags/CWMM-0.3.0_GA/classes/idl/idl_audio/cwaudio.idl	(revision 213)
+++ /tags/CWMM-0.3.0_GA/classes/idl/idl_audio/cwaudio.idl	(revision 213)
@@ -0,0 +1,224 @@
+/*
+ * (C) Chris Wohlgemuth 2002-2003
+ *
+ */
+/*
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; see the file COPYING.  If not, write to
+ * the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+/*
+ * If you need another license for your project/product (commercial,
+ * noncommercial, whatever) contact me at
+ *
+ * http://www.os2world.com/cdwriting
+ * http://www.geocities.com/SiliconValley/Sector/5785/
+ *
+ */
+
+/*
+ * CWAudio.idl:
+ */
+
+#include <cwmmdataf.idl>
+
+#define SIZE_PLAYTIME    11
+#define SIZE_SAMPLERATE  7
+#define SIZE_BITRATE     7
+#define SIZE_CHANNELS    2
+#define SIZE_BPS         4
+
+/*
+   CLASS: CWMMDataFile
+*/
+
+interface M_MMAudio;
+
+
+interface M_MMAudio : M_CWMMDataFile
+{
+
+    /*
+     * New class methods
+     *
+     */
+
+
+#ifdef __SOMIDL__
+  implementation {
+
+
+    /*
+     * Class Modifiers:
+     *
+     */
+
+    externalprefix = cwaudioM_;
+    externalstem = cwaudioM;
+    functionprefix = cwaudioM_;
+    majorversion = 1;
+    minorversion = 2;
+    filestem = cwaudio;           //# specifies the filestem for sc-generated files
+    dllname = "CWMM.dll";
+    callstyle = oidl;
+
+    /*
+     * Internal class variables
+     *
+     */
+
+
+    /*
+     * methods overridden
+     *
+     */
+    wpclsCreateDefaultTemplates : override;
+    wpclsQueryInstanceType  	: override;
+    wpclsQueryInstanceFilter    : override;
+    wpclsQueryDetailsInfo   	: override;
+    wpclsQueryTitle         	: override;
+    wpclsInitData   	        : override;
+    wpclsUnInitData   	        : override;
+    wpclsQueryDefaultView  : override;
+    wpclsQueryIconData          : override;
+  };
+
+#endif /* __SOMIDL__ */
+
+};
+
+
+
+interface MMAudio : CWMMDataFile
+{
+
+    /*
+     * New instance methods
+     *
+     */
+	ULONG  cwmmAddAudioInformationPage(in HWND hwndNotebook);
+    BOOL   cwmmSetTrackInfo(in char* chrString, in ULONG ulValue, in ULONG iWhich);
+    ULONG  cwmmQueryTrackInfo(in PSZ chrString, in ULONG ulSize, in ULONG iWhich);
+    void   cwmmPlayTrack(in HWND hwndCnr, in BOOL bPlay);
+	ULONG  cwmmAddTrackNamePage(in HWND hwndNotebook);
+    void   cwmmPauseTrack(in HWND hwndCnr, in ULONG ulAction);
+/*    LONG  cwmmSetTrackVolume(in ULONG ulVolume);
+    LONG  cwmmQueryTrackVolume();  */
+
+/* Local filesize info to check if someone altered the file. Attribute because MMMP3 needs this info. */
+    readonly attribute ULONG  ulFileSize;
+
+#ifdef __SOMIDL__
+  implementation {
+    releaseorder:
+                cwmmAddAudioInformationPage,
+                cwmmSetTrackInfo,
+                cwmmQueryTrackInfo,
+                cwmmPlayTrack,
+                cwmmAddTrackNamePage,
+                cwmmPauseTrack,
+                _get_ulFileSize;
+
+/*                cwmmSetTrackVolume,
+                cwmmQueryTrackVolume; */
+    /*
+     * Class Modifiers:
+     *
+     */
+
+    externalprefix = cwaudio_;
+    externalstem = cwaudio;
+    majorversion = 1;
+    minorversion = 2;
+    filestem = cwaudio;           //# specifies the filestem for sc-generated files
+    metaclass = M_MMAudio;
+    dllname = "CWMM.dll";
+    callstyle = oidl;
+    passthru C_h_after =  ""
+    "#include \"mmres.h\""
+    "";
+
+    /*
+     * Internal instance variables
+     *
+     */
+    ULONG  ulPlayMsecs;
+    ULONG  ulPlaySecs;
+    ULONG  ulSampleRate;
+    ULONG  ulBitRate;
+    ULONG  ulChannels;
+    ULONG  ulBPS;
+    ULONG  ulNumAudioBytes;
+
+    BOOL bNeedSaving;
+    /* Strings shown in details view */
+    char chrPlayTime[SIZE_PLAYTIME];
+    char chrBitRate[SIZE_BITRATE];
+    char chrSampleRate[SIZE_SAMPLERATE];
+    char chrChannels[SIZE_CHANNELS];
+    char chrBPS[SIZE_BPS];
+
+/*    char id3Name[33+30+1]; */
+ /* 63 chars. ID3 allows 30 */
+/*    char id3Artist[33+30+1];
+    char id3Album[33+30+1];
+    char id3Year[4+1];
+    char id3Comment[30+1];
+    char id3Genre[30+1]; */
+/*    int  id3TrackNr;  */
+	/* Track number for ID3 V1.1 */
+
+    /* New with v0.2.7: Track information isn't restricted to
+       the size of ID3 for other audio files than MP3. */
+    PSZ pszName;
+    PSZ pszArtist;
+    PSZ pszAlbum;
+    PSZ pszComment;
+    PSZ pszYear;
+    PSZ pszGenre;
+    /*
+     * methods overridden
+     *
+     */
+
+    wpAddSettingsPages      : override;
+    wpQueryDetailsData      : override;
+    wpRestoreState          : override;
+    wpSaveState             : override;
+    wpModifyPopupMenu       : override;
+    wpMenuItemSelected      : override;
+    wpObjectReady           : override;
+    wpSetup                 : override;
+    wpOpen                  : override;
+
+/*  wpSetTitle              : override;
+    wpQueryRealName         : override;
+    wpQueryTitle            : override;
+    wpRefresh               : override;
+*/
+
+    wpInitData              : override;
+    wpUnInitData            : override;
+/*    wpCreateShadowObject    : override; */
+#ifdef __PRIVATE__
+
+#endif
+
+  }; // implementation
+#endif /* __SOMIDL__ */
+};
+
+
+
+
+
Index: /tags/CWMM-0.3.0_GA/classes/idl/idl_audio/cwcdtrack.idl
===================================================================
--- /tags/CWMM-0.3.0_GA/classes/idl/idl_audio/cwcdtrack.idl	(revision 213)
+++ /tags/CWMM-0.3.0_GA/classes/idl/idl_audio/cwcdtrack.idl	(revision 213)
@@ -0,0 +1,156 @@
+/*
+ * (C) Chris Wohlgemuth 2002-2003
+ *
+ */
+/*
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; see the file COPYING.  If not, write to
+ * the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
+ */          
+/*
+ * If you need another license for your project/product (commercial,
+ * noncommercial, whatever) contact me at
+ * 
+ * http://www.os2world.com/cdwriting
+ * http://www.geocities.com/SiliconValley/Sector/5785/
+ *
+ */
+
+/*
+ * CWCDTrack.idl:
+ */
+
+#include <cwaudio.idl>
+
+/*
+   CLASS: 
+*/
+
+interface M_MMCDTrack; 
+
+
+interface M_MMCDTrack : M_MMAudio
+{
+
+    /*
+     * New class methods
+     *
+     */
+
+
+#ifdef __SOMIDL__
+  implementation {
+
+
+    /*
+     * Class Modifiers:
+     *
+     */
+
+    externalprefix = cwcdtrackM_;
+    externalstem = cwcdtrackM;
+    functionprefix = cwcdtrackM_;
+    majorversion = 1;
+    minorversion = 2;
+    filestem = cwcdtrack;           //# specifies the filestem for sc-generated files
+    dllname = "CWMM.dll";
+    callstyle = oidl;
+
+    /*
+     * Internal class variables
+     *
+     */
+
+    /*
+     * methods overridden 
+     *
+     */
+    wpclsQueryStyle   	        : override; 
+    wpclsQueryTitle   	        : override;
+    wpclsQueryInstanceType  	: override;
+    wpclsQueryDefaultHelp       : override;
+    wpclsCreateDefaultTemplates : override;
+  };
+
+#endif /* __SOMIDL__ */
+
+};
+
+
+
+interface MMCDTrack : MMAudio
+{
+
+    /*
+     * New instance methods
+     *
+     */
+
+#ifdef __SOMIDL__
+  implementation {
+
+    /*
+     * Class Modifiers:
+     *
+     */
+
+    externalprefix = cwcdtrack_;
+    externalstem = cwcdtrack;
+    majorversion = 1;
+    minorversion = 2;
+    filestem = cwcdtrack;           //# specifies the filestem for sc-generated files
+    metaclass = M_MMCDTrack;
+    dllname = "CWMM.dll";
+    callstyle = oidl;
+/*    releaseorder:
+    passthru C_h_after =  ""
+    "";
+*/
+
+    /*
+     * Internal instance variables
+     *
+     */
+   
+    ULONG ulTrackNum;
+
+    /*
+     * methods overridden 
+     *
+     */
+/*    wpQueryDetailsData      : override;
+    wpRestoreState            : override;  
+    wpAddSettingsPages        : override;
+    wpObjectReady             : override; */
+    wpQueryFileSize           : override;
+    wpSetupOnce               : override;
+    wpSetup                   : override;
+    wpAddFileMenuPage         : override;
+    wpAddFile1Page            : override;
+    wpAddFile2Page            : override;
+    wpAddFile3Page            : override;
+    wpAddFileTypePage         : override;
+    wpFilterPopupMenu         : override;
+    wpModifyPopupMenu         : override;
+    wpInsertPopupMenuItems    : override;
+    cwmmQueryTrackInfo        : override;
+#ifdef __PRIVATE__
+
+#endif
+
+  }; // implementation
+#endif /* __SOMIDL__ */
+};
+
+
+
Index: /tags/CWMM-0.3.0_GA/classes/idl/idl_audio/cwflac.idl
===================================================================
--- /tags/CWMM-0.3.0_GA/classes/idl/idl_audio/cwflac.idl	(revision 213)
+++ /tags/CWMM-0.3.0_GA/classes/idl/idl_audio/cwflac.idl	(revision 213)
@@ -0,0 +1,139 @@
+/*
+ * (C) Chris Wohlgemuth 2002-2003
+ *
+ */
+/*
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; see the file COPYING.  If not, write to
+ * the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
+ */          
+/*
+ * If you need another license for your project/product (commercial,
+ * noncommercial, whatever) contact me at
+ * 
+ * http://www.os2world.com/cdwriting
+ * http://www.geocities.com/SiliconValley/Sector/5785/
+ *
+ */
+
+/*
+ * cwaif.idl:
+ */
+
+#include <cwaudio.idl>
+
+
+/*
+   CLASS: 
+*/
+
+interface M_MMFLAC; 
+
+interface MMFLAC : MMAudio
+{
+
+    /*
+     * New instance methods
+     *
+     */
+
+
+#ifdef __SOMIDL__
+  implementation {
+
+    /*
+     * Class Modifiers:
+     *
+     */
+
+    externalprefix = cwflac_;
+    externalstem = cwflac;
+    majorversion = 1;
+    minorversion = 2;
+    filestem = cwflac;           //# specifies the filestem for sc-generated files
+    metaclass = M_MMFLAC;
+    dllname = "CWMM.dll";
+    callstyle = oidl;
+
+
+    /*
+     * Internal instance variables
+     *
+     */
+
+
+    /*
+     * methods overridden 
+     *
+     */
+
+#ifdef __PRIVATE__
+
+#endif
+
+  }; // implementation
+#endif /* __SOMIDL__ */
+};
+
+
+interface M_MMFLAC : M_MMAudio
+{
+
+    /*
+     * New class methods
+     *
+     */
+
+
+#ifdef __SOMIDL__
+  implementation {
+
+
+    /*
+     * Class Modifiers:
+     *
+     */
+
+    externalprefix = cwflacM_;
+    externalstem = cwflacM;
+    functionprefix = cwflacM_;
+    majorversion = 1;
+    minorversion = 2;
+    filestem = cwflac;           //# specifies the filestem for sc-generated files
+    dllname = "CWMM.dll";
+    callstyle = oidl;
+
+    /*
+     * Internal class variables
+     *
+     */
+
+    /*
+     * methods overridden 
+     *
+     */
+    wpclsQueryInstanceType  	: override;
+    wpclsQueryInstanceFilter    : override;   
+
+    wpclsQueryDefaultHelp       : override; 
+    wpclsQueryTitle   	        : override;   
+    wpclsQueryIconData          : override;
+  };
+
+#endif /* __SOMIDL__ */
+
+};
+
+
+
+
Index: /tags/CWMM-0.3.0_GA/classes/idl/idl_audio/cwiff.idl
===================================================================
--- /tags/CWMM-0.3.0_GA/classes/idl/idl_audio/cwiff.idl	(revision 213)
+++ /tags/CWMM-0.3.0_GA/classes/idl/idl_audio/cwiff.idl	(revision 213)
@@ -0,0 +1,139 @@
+/*
+ * (C) Chris Wohlgemuth 2002-2003
+ *
+ */
+/*
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; see the file COPYING.  If not, write to
+ * the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
+ */          
+/*
+ * If you need another license for your project/product (commercial,
+ * noncommercial, whatever) contact me at
+ * 
+ * http://www.os2world.com/cdwriting
+ * http://www.geocities.com/SiliconValley/Sector/5785/
+ *
+ */
+
+/*
+ * cwiff.idl:
+ */
+
+#include <cwaudio.idl>
+
+
+/*
+   CLASS: 
+*/
+
+interface M_MMIFF; 
+
+interface MMIFF : MMAudio
+{
+
+    /*
+     * New instance methods
+     *
+     */
+
+
+#ifdef __SOMIDL__
+  implementation {
+
+    /*
+     * Class Modifiers:
+     *
+     */
+
+    externalprefix = cwiff_;
+    externalstem = cwiff;
+    majorversion = 1;
+    minorversion = 2;
+    filestem = cwiff;           //# specifies the filestem for sc-generated files
+    metaclass = M_MMIFF;
+    dllname = "CWMM.dll";
+    callstyle = oidl;
+
+
+    /*
+     * Internal instance variables
+     *
+     */
+
+
+    /*
+     * methods overridden 
+     *
+     */
+
+#ifdef __PRIVATE__
+
+#endif
+
+  }; // implementation
+#endif /* __SOMIDL__ */
+};
+
+
+interface M_MMIFF : M_MMAudio
+{
+
+    /*
+     * New class methods
+     *
+     */
+
+
+#ifdef __SOMIDL__
+  implementation {
+
+
+    /*
+     * Class Modifiers:
+     *
+     */
+
+    externalprefix = cwiffM_;
+    externalstem = cwiffM;
+    functionprefix = cwiffM_;
+    majorversion = 1;
+    minorversion = 2;
+    filestem = cwiff;           //# specifies the filestem for sc-generated files
+    dllname = "CWMM.dll";
+    callstyle = oidl;
+
+    /*
+     * Internal class variables
+     *
+     */
+
+    /*
+     * methods overridden 
+     *
+     */
+    wpclsQueryInstanceType  	: override;
+    wpclsQueryInstanceFilter    : override;   
+
+    wpclsQueryDefaultHelp       : override; 
+    wpclsQueryTitle   	        : override;   
+    wpclsQueryIconData          : override;
+  };
+
+#endif /* __SOMIDL__ */
+
+};
+
+
+
+
Index: /tags/CWMM-0.3.0_GA/classes/idl/idl_audio/cwm3u.idl
===================================================================
--- /tags/CWMM-0.3.0_GA/classes/idl/idl_audio/cwm3u.idl	(revision 213)
+++ /tags/CWMM-0.3.0_GA/classes/idl/idl_audio/cwm3u.idl	(revision 213)
@@ -0,0 +1,144 @@
+/*
+ * (C) Chris Wohlgemuth 2002-2003
+ *
+ */
+/*
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; see the file COPYING.  If not, write to
+ * the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
+ */          
+/*
+ * If you need another license for your project/product (commercial,
+ * noncommercial, whatever) contact me at
+ * 
+ * http://www.os2world.com/cdwriting
+ * http://www.geocities.com/SiliconValley/Sector/5785/
+ *
+ */
+
+/*
+ * cwaudiostream.idl:
+ */
+
+#include <cwaudio.idl>
+#include <wprootf.idl>
+
+/*
+   CLASS: 
+*/
+
+interface M_MMM3U; 
+
+interface MMM3U : CWMMDataFile
+{
+
+    /*
+     * New instance methods
+     *
+     */
+
+#ifdef __SOMIDL__
+  implementation {
+    releaseorder:
+        cwmmAddURLPage;
+    /*
+     * Class Modifiers:
+     *
+     */
+
+    externalprefix = cwm3u_;
+    externalstem = cwm3u;
+    majorversion = 1;
+    minorversion = 2;
+    filestem = cwm3u;           //# specifies the filestem for sc-generated files
+    metaclass = M_MMM3U;
+    dllname = "CWMM.dll";
+    callstyle = oidl;
+
+
+    /*
+     * Internal instance variables
+     *
+     */
+
+
+    /*
+     * methods overridden 
+     *
+     */
+    wpModifyPopupMenu       : override;
+    wpMenuItemSelected      : override;
+    wpOpen                  : override;
+    wpCopiedFromTemplate    : override;
+
+#ifdef __PRIVATE__
+
+#endif
+
+  }; // implementation
+#endif /* __SOMIDL__ */
+};
+
+
+interface M_MMM3U : M_CWMMDataFile
+{
+
+    /*
+     * New class methods
+     *
+     */
+
+
+#ifdef __SOMIDL__
+  implementation {
+
+
+    /*
+     * Class Modifiers:
+     *
+     */
+
+    externalprefix = cwm3uM_;
+    externalstem = cwm3uM;
+    functionprefix = cwm3uM_;
+    majorversion = 1;
+    minorversion = 2;
+    filestem = cwm3u;           //# specifies the filestem for sc-generated files
+    dllname = "CWMM.dll";
+    callstyle = oidl;
+
+    /*
+     * Internal class variables
+     *
+     */
+
+    /*
+     * methods overridden 
+     *
+     */
+    wpclsQueryInstanceType  	: override;
+    wpclsQueryInstanceFilter    : override;
+    wpclsQueryDefaultHelp       : override; 
+    wpclsQueryTitle   	        : override;   
+    wpclsQueryIconData          : override;
+    wpclsQueryDefaultView       : override;   
+    wpclsCreateDefaultTemplates : override;
+  };
+
+#endif /* __SOMIDL__ */
+
+};
+
+
+
+
Index: /tags/CWMM-0.3.0_GA/classes/idl/idl_audio/cwmidi.idl
===================================================================
--- /tags/CWMM-0.3.0_GA/classes/idl/idl_audio/cwmidi.idl	(revision 213)
+++ /tags/CWMM-0.3.0_GA/classes/idl/idl_audio/cwmidi.idl	(revision 213)
@@ -0,0 +1,139 @@
+/*
+ * (C) Chris Wohlgemuth 2002-2003
+ *
+ */
+/*
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; see the file COPYING.  If not, write to
+ * the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
+ */          
+/*
+ * If you need another license for your project/product (commercial,
+ * noncommercial, whatever) contact me at
+ * 
+ * http://www.os2world.com/cdwriting
+ * http://www.geocities.com/SiliconValley/Sector/5785/
+ *
+ */
+/*
+ * cwmidi.idl:
+ */
+
+#include <cwaudio.idl>
+
+
+/*
+   CLASS: 
+*/
+
+interface M_MMMIDI; 
+
+interface MMMIDI : MMAudio
+{
+
+    /*
+     * New instance methods
+     *
+     */
+
+
+#ifdef __SOMIDL__
+  implementation {
+
+    /*
+     * Class Modifiers:
+     *
+     */
+
+    externalprefix = cwmidi_;
+    externalstem = cwmidi;
+    majorversion = 1;
+    minorversion = 2;
+    filestem = cwmidi;           //# specifies the filestem for sc-generated files
+    metaclass = M_MMMIDI;
+    dllname = "CWMM.dll";
+    callstyle = oidl;
+
+
+    /*
+     * Internal instance variables
+     *
+     */
+
+
+    /*
+     * methods overridden 
+     *
+     */
+    wpModifyPopupMenu       : override;
+	cwmmAddAudioInformationPage:override;
+#ifdef __PRIVATE__
+
+#endif
+
+  }; // implementation
+#endif /* __SOMIDL__ */
+};
+
+
+interface M_MMMIDI : M_MMAudio
+{
+
+    /*
+     * New class methods
+     *
+     */
+
+
+#ifdef __SOMIDL__
+  implementation {
+
+
+    /*
+     * Class Modifiers:
+     *
+     */
+
+    externalprefix = cwmidiM_;
+    externalstem = cwmidiM;
+    functionprefix = cwmidiM_;
+    majorversion = 1;
+    minorversion = 2;
+    filestem = cwmidi;           //# specifies the filestem for sc-generated files
+    dllname = "CWMM.dll";
+    callstyle = oidl;
+
+    /*
+     * Internal class variables
+     *
+     */
+
+    /*
+     * methods overridden 
+     *
+     */
+    wpclsQueryInstanceType  	: override;
+    wpclsQueryInstanceFilter    : override;   
+    wpclsQueryDefaultHelp       : override; 
+    wpclsQueryTitle   	        : override;   
+    wpclsQueryIconData          : override;
+    wpclsCreateDefaultTemplates : override;
+  };
+
+#endif /* __SOMIDL__ */
+
+};
+
+
+
+
Index: /tags/CWMM-0.3.0_GA/classes/idl/idl_audio/cwmp3.idl
===================================================================
--- /tags/CWMM-0.3.0_GA/classes/idl/idl_audio/cwmp3.idl	(revision 213)
+++ /tags/CWMM-0.3.0_GA/classes/idl/idl_audio/cwmp3.idl	(revision 213)
@@ -0,0 +1,186 @@
+/*
+ * (C) Chris Wohlgemuth 2002-2003
+ *
+ */
+/*
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; see the file COPYING.  If not, write to
+ * the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
+ */          
+/*
+ * If you need another license for your project/product (commercial,
+ * noncommercial, whatever) contact me at
+ * 
+ * http://www.os2world.com/cdwriting
+ * http://www.geocities.com/SiliconValley/Sector/5785/
+ *
+ */
+/*
+ * CWMp3.idl:
+ */
+
+#include <cwaudio.idl>
+
+/*
+#define SIZE_PLAYTIME    11
+#define SIZE_SAMPLERATE  7
+#define SIZE_CHANNELS    2
+#define SIZE_BPS         3
+*/
+
+typedef struct ID3TG
+{
+  char id3Tag[3];
+  char id3Name[30];
+  char id3Artist[30];
+  char id3Album[30];
+  char id3Year[4];
+  char id3Comment[30];
+  char id3Genre[1];
+
+}ID3TAG;
+
+/*
+   CLASS: 
+*/
+
+interface M_MMMP3; 
+
+interface MMMP3 : MMAudio
+{
+
+    /*
+     * New instance methods
+     *
+     */
+
+	ULONG cwmmAddId3TagPage(in HWND hwndNotebook);
+	BOOL cwmmQueryId3Tag(inout ID3TAG id3Tag);
+	BOOL cwmmSetId3Tag(in ID3TAG id3Tag);
+	BOOL cwmmQueryId3TagValue(in PSZ pszValue, in ULONG ulWhich);
+	BOOL cwmmSetId3TagValue(in PSZ pszValue, in ULONG ulWhich);
+
+#ifdef __SOMIDL__
+  implementation {
+
+    /*
+     * Class Modifiers:
+     *
+     */
+
+    externalprefix = cwmp3_;
+    externalstem = cwmp3;
+    majorversion = 1;
+    minorversion = 2;
+    filestem = cwmp3;           //# specifies the filestem for sc-generated files
+    metaclass = M_MMMP3;
+    dllname = "CWMM.dll";
+    callstyle = oidl;
+    releaseorder:
+            cwmmAddId3TagPage,
+            cwmmQueryId3Tag,
+            cwmmSetId3Tag,
+            cwmmQueryId3TagValue,
+            cwmmSetId3TagValue;
+    passthru C_h_after =  ""
+    "#include \"cwmp3inc.h\""
+    "#include \"mmres.h\""
+    "";
+
+    /*
+     * Internal instance variables
+     *
+     */
+/*    char id3Name[30+1];
+    char id3Artist[30+1];
+    char id3Album[30+1];
+    char id3Year[4+1];
+    char id3Comment[30+1];
+    char id3Genre[30+1];*/
+/*    int  id3TrackNr; 	 Track number for ID3 V1.1. Not used yet. */ 
+    /*
+     * methods overridden 
+     *
+     */
+
+
+    cwmmQueryTrackInfo           : override;
+    cwmmAddAudioInformationPage  : override;  
+    wpAddSettingsPages           : override;
+    wpRestoreState               : override;  
+    wpSetup                      : override;
+    wpSaveState                  : override;
+    wpOpen                       : override;  
+#ifdef __PRIVATE__
+
+#endif
+
+  }; // implementation
+#endif /* __SOMIDL__ */
+};
+
+
+interface M_MMMP3 : M_MMAudio
+{
+
+    /*
+     * New class methods
+     *
+     */
+
+
+#ifdef __SOMIDL__
+  implementation {
+
+
+    /*
+     * Class Modifiers:
+     *
+     */
+
+    externalprefix = cwmp3M_;
+    externalstem = cwmp3M;
+    functionprefix = cwmp3M_;
+    majorversion = 1;
+    minorversion = 2;
+    filestem = cwmp3;           //# specifies the filestem for sc-generated files
+    dllname = "CWMM.dll";
+    callstyle = oidl;
+
+    /*
+     * Internal class variables
+     *
+     */
+    ULONG ulCodePage;    /* System codepage */
+    ULONG ulIsoCodePage; /* ISO 8859-1 codepage for translation */
+
+    /*
+     * methods overridden 
+     *
+     */
+
+    wpclsQueryTitle   	        : override;   
+    wpclsQueryInstanceType  	: override;
+    wpclsQueryInstanceFilter    : override;   
+    wpclsQueryIconData          : override;
+    wpclsQueryDefaultHelp       : override; 
+    wpclsInitData               : override;
+  };
+
+#endif /* __SOMIDL__ */
+
+};
+
+
+
+
Index: /tags/CWMM-0.3.0_GA/classes/idl/idl_audio/cwogg.idl
===================================================================
--- /tags/CWMM-0.3.0_GA/classes/idl/idl_audio/cwogg.idl	(revision 213)
+++ /tags/CWMM-0.3.0_GA/classes/idl/idl_audio/cwogg.idl	(revision 213)
@@ -0,0 +1,146 @@
+/*
+ * (C) Chris Wohlgemuth 2002-2003
+ *
+ */
+/*
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; see the file COPYING.  If not, write to
+ * the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
+ */          
+/*
+ * If you need another license for your project/product (commercial,
+ * noncommercial, whatever) contact me at
+ * 
+ * http://www.os2world.com/cdwriting
+ * http://www.geocities.com/SiliconValley/Sector/5785/
+ *
+ */
+
+/*
+ * CWogg.idl:
+ */
+
+#include <cwaudio.idl>
+
+/*
+#define SIZE_PLAYTIME    11
+#define SIZE_SAMPLERATE  7
+#define SIZE_CHANNELS    2
+#define SIZE_BPS         3
+*/
+
+/*
+   CLASS: 
+*/
+
+interface M_MMOGG; 
+
+interface MMOGG : MMAudio
+{
+
+    /*
+     * New instance methods
+     *
+     */
+
+
+#ifdef __SOMIDL__
+  implementation {
+
+    /*
+     * Class Modifiers:
+     *
+     */
+
+    externalprefix = cwogg_;
+    externalstem = cwogg;
+    majorversion = 1;
+    minorversion = 2;
+    filestem = cwogg;           //# specifies the filestem for sc-generated files
+    metaclass = M_MMOGG;
+    dllname = "CWMM.dll";
+    callstyle = oidl;
+
+
+    /*
+     * Internal instance variables
+     *
+     */
+
+
+    /*
+     * methods overridden 
+     *
+     */
+    cwmmQueryTrackInfo        : override;
+    wpSaveState               : override;
+#ifdef __PRIVATE__
+
+#endif
+
+  }; // implementation
+#endif /* __SOMIDL__ */
+};
+
+
+interface M_MMOGG : M_MMAudio
+{
+
+    /*
+     * New class methods
+     *
+     */
+
+
+#ifdef __SOMIDL__
+  implementation {
+
+
+    /*
+     * Class Modifiers:
+     *
+     */
+
+    externalprefix = cwoggM_;
+    externalstem = cwoggM;
+    functionprefix = cwoggM_;
+    majorversion = 1;
+    minorversion = 2;
+    filestem = cwogg;           //# specifies the filestem for sc-generated files
+    dllname = "CWMM.dll";
+    callstyle = oidl;
+
+    /*
+     * Internal class variables
+     *
+     */
+
+    /*
+     * methods overridden 
+     *
+     */
+
+    wpclsQueryTitle   	        : override;   
+    wpclsQueryInstanceType  	: override;
+    wpclsQueryInstanceFilter    : override;   
+    wpclsQueryIconData          : override;
+    wpclsQueryDefaultHelp       : override; 
+  };
+
+#endif /* __SOMIDL__ */
+
+};
+
+
+
+
Index: /tags/CWMM-0.3.0_GA/classes/idl/idl_audio/cwsndf.idl
===================================================================
--- /tags/CWMM-0.3.0_GA/classes/idl/idl_audio/cwsndf.idl	(revision 213)
+++ /tags/CWMM-0.3.0_GA/classes/idl/idl_audio/cwsndf.idl	(revision 213)
@@ -0,0 +1,139 @@
+/*
+ * (C) Chris Wohlgemuth 2002-2003
+ *
+ */
+/*
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; see the file COPYING.  If not, write to
+ * the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
+ */          
+/*
+ * If you need another license for your project/product (commercial,
+ * noncommercial, whatever) contact me at
+ * 
+ * http://www.os2world.com/cdwriting
+ * http://www.geocities.com/SiliconValley/Sector/5785/
+ *
+ */
+
+/*
+ * cwsndf.idl:
+ */
+
+#include <cwaudio.idl>
+
+
+/*
+   CLASS: 
+*/
+
+interface M_MMSNDF; 
+
+interface MMSNDF : MMAudio
+{
+
+    /*
+     * New instance methods
+     *
+     */
+
+
+#ifdef __SOMIDL__
+  implementation {
+
+    /*
+     * Class Modifiers:
+     *
+     */
+
+    externalprefix = cwsndf_;
+    externalstem = cwsndf;
+    majorversion = 1;
+    minorversion = 2;
+    filestem = cwsndf;           //# specifies the filestem for sc-generated files
+    metaclass = M_MMSNDF;
+    dllname = "CWMM.dll";
+    callstyle = oidl;
+
+
+    /*
+     * Internal instance variables
+     *
+     */
+
+
+    /*
+     * methods overridden 
+     *
+     */
+
+#ifdef __PRIVATE__
+
+#endif
+
+  }; // implementation
+#endif /* __SOMIDL__ */
+};
+
+
+interface M_MMSNDF : M_MMAudio
+{
+
+    /*
+     * New class methods
+     *
+     */
+
+
+#ifdef __SOMIDL__
+  implementation {
+
+
+    /*
+     * Class Modifiers:
+     *
+     */
+
+    externalprefix = cwsndfM_;
+    externalstem = cwsndfM;
+    functionprefix = cwsndfM_;
+    majorversion = 1;
+    minorversion = 2;
+    filestem = cwsndf;           //# specifies the filestem for sc-generated files
+    dllname = "CWMM.dll";
+    callstyle = oidl;
+
+    /*
+     * Internal class variables
+     *
+     */
+
+    /*
+     * methods overridden 
+     *
+     */
+    wpclsQueryInstanceType  	: override;
+    wpclsQueryInstanceFilter    : override;   
+
+    wpclsQueryDefaultHelp       : override; 
+    wpclsQueryTitle   	        : override;   
+    wpclsQueryIconData          : override;
+  };
+
+#endif /* __SOMIDL__ */
+
+};
+
+
+
+
Index: /tags/CWMM-0.3.0_GA/classes/idl/idl_audio/cwvoc.idl
===================================================================
--- /tags/CWMM-0.3.0_GA/classes/idl/idl_audio/cwvoc.idl	(revision 213)
+++ /tags/CWMM-0.3.0_GA/classes/idl/idl_audio/cwvoc.idl	(revision 213)
@@ -0,0 +1,139 @@
+/*
+ * (C) Chris Wohlgemuth 2002-2003
+ *
+ */
+/*
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; see the file COPYING.  If not, write to
+ * the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
+ */          
+/*
+ * If you need another license for your project/product (commercial,
+ * noncommercial, whatever) contact me at
+ * 
+ * http://www.os2world.com/cdwriting
+ * http://www.geocities.com/SiliconValley/Sector/5785/
+ *
+ */
+
+/*
+ * cwvoc.idl:
+ */
+
+#include <cwaudio.idl>
+
+
+/*
+   CLASS: 
+*/
+
+interface M_MMVOC; 
+
+interface MMVOC : MMAudio
+{
+
+    /*
+     * New instance methods
+     *
+     */
+
+
+#ifdef __SOMIDL__
+  implementation {
+
+    /*
+     * Class Modifiers:
+     *
+     */
+
+    externalprefix = cwvoc_;
+    externalstem = cwvoc;
+    majorversion = 1;
+    minorversion = 2;
+    filestem = cwvoc;           //# specifies the filestem for sc-generated files
+    metaclass = M_MMVOC;
+    dllname = "CWMM.dll";
+    callstyle = oidl;
+
+
+    /*
+     * Internal instance variables
+     *
+     */
+
+
+    /*
+     * methods overridden 
+     *
+     */
+
+#ifdef __PRIVATE__
+
+#endif
+
+  }; // implementation
+#endif /* __SOMIDL__ */
+};
+
+
+interface M_MMVOC : M_MMAudio
+{
+
+    /*
+     * New class methods
+     *
+     */
+
+
+#ifdef __SOMIDL__
+  implementation {
+
+
+    /*
+     * Class Modifiers:
+     *
+     */
+
+    externalprefix = cwvocM_;
+    externalstem = cwvocM;
+    functionprefix = cwvocM_;
+    majorversion = 1;
+    minorversion = 2;
+    filestem = cwvoc;           //# specifies the filestem for sc-generated files
+    dllname = "CWMM.dll";
+    callstyle = oidl;
+
+    /*
+     * Internal class variables
+     *
+     */
+
+    /*
+     * methods overridden 
+     *
+     */
+    wpclsQueryInstanceType  	: override;
+    wpclsQueryInstanceFilter    : override;   
+
+    wpclsQueryDefaultHelp       : override; 
+    wpclsQueryTitle   	        : override;   
+    wpclsQueryIconData          : override;
+  };
+
+#endif /* __SOMIDL__ */
+
+};
+
+
+
+
Index: /tags/CWMM-0.3.0_GA/classes/idl/idl_audio/mmwav.idl
===================================================================
--- /tags/CWMM-0.3.0_GA/classes/idl/idl_audio/mmwav.idl	(revision 213)
+++ /tags/CWMM-0.3.0_GA/classes/idl/idl_audio/mmwav.idl	(revision 213)
@@ -0,0 +1,138 @@
+/*
+ * (C) Chris Wohlgemuth 2002-2003
+ *
+ */
+/*
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; see the file COPYING.  If not, write to
+ * the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
+ */          
+/*
+ * If you need another license for your project/product (commercial,
+ * noncommercial, whatever) contact me at
+ * 
+ * http://www.os2world.com/cdwriting
+ * http://www.geocities.com/SiliconValley/Sector/5785/
+ *
+ */
+
+/*
+ * MMWAV.idl:
+ */
+
+#include <cwaudio.idl>
+
+/*
+   CLASS: 
+*/
+
+interface M_MMWAV; 
+
+interface MMWAV : MMAudio
+{
+
+    /*
+     * New instance methods
+     *
+     */
+
+
+#ifdef __SOMIDL__
+  implementation {
+
+    /*
+     * Class Modifiers:
+     *
+     */
+
+    externalprefix = mmwav_;
+    externalstem = mmwav;
+    majorversion = 1;
+    minorversion = 2;
+    filestem = mmwav;           //# specifies the filestem for sc-generated files
+    metaclass = M_MMWAV;
+    dllname = "CWMM.dll";
+    callstyle = oidl;
+
+
+    /*
+     * Internal instance variables
+     *
+     */
+
+
+    /*
+     * methods overridden 
+     *
+     */
+    wpSaveState               : override;
+#ifdef __PRIVATE__
+
+#endif
+
+  }; // implementation
+#endif /* __SOMIDL__ */
+};
+
+
+interface M_MMWAV : M_MMAudio
+{
+
+    /*
+     * New class methods
+     *
+     */
+
+
+#ifdef __SOMIDL__
+  implementation {
+
+
+    /*
+     * Class Modifiers:
+     *
+     */
+
+    externalprefix = mmwavM_;
+    externalstem = mmwavM;
+    functionprefix = mmwavM_;
+    majorversion = 1;
+    minorversion = 2;
+    filestem = mmwav;           //# specifies the filestem for sc-generated files
+    dllname = "CWMM.dll";
+    callstyle = oidl;
+
+    /*
+     * Internal class variables
+     *
+     */
+
+    /*
+     * methods overridden 
+     *
+     */
+
+    wpclsQueryTitle   	        : override;   
+    wpclsQueryInstanceType  	: override;
+    wpclsQueryInstanceFilter    : override;   
+    wpclsQueryIconData          : override;
+    wpclsQueryDefaultHelp       : override; 
+  };
+
+#endif /* __SOMIDL__ */
+
+};
+
+
+
+
Index: /tags/CWMM-0.3.0_GA/classes/idl/idl_image/cwavc.idl
===================================================================
--- /tags/CWMM-0.3.0_GA/classes/idl/idl_image/cwavc.idl	(revision 213)
+++ /tags/CWMM-0.3.0_GA/classes/idl/idl_image/cwavc.idl	(revision 213)
@@ -0,0 +1,137 @@
+/*
+ * (C) Chris Wohlgemuth 2002-2003
+ *
+ */
+/*
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; see the file COPYING.  If not, write to
+ * the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
+ */          
+/*
+ * If you need another license for your project/product (commercial,
+ * noncommercial, whatever) contact me at
+ * 
+ * http://www.os2world.com/cdwriting
+ * http://www.geocities.com/SiliconValley/Sector/5785/
+ *
+ */
+
+/*
+ * CWavc.idl:
+ */
+
+#include <cwimage.idl>
+
+/*
+   CLASS: 
+*/
+
+interface M_MMAVC; 
+
+interface MMAVC : MMImage
+{
+
+    /*
+     * New instance methods
+     *
+     */
+
+
+#ifdef __SOMIDL__
+  implementation {
+
+    /*
+     * Class Modifiers:
+     *
+     */
+
+    externalprefix = cwavc_;
+    externalstem = cwavc;
+    majorversion = 1;
+    minorversion = 2;
+    filestem = cwavc;           //# specifies the filestem for sc-generated files
+    metaclass = M_MMAVC;
+    dllname = "cwmm.dll";
+    callstyle = oidl;
+
+
+    /*
+     * Internal instance variables
+     *
+     */
+
+
+    /*
+     * methods overridden 
+     *
+     */
+
+#ifdef __PRIVATE__
+
+#endif
+
+  }; // implementation
+#endif /* __SOMIDL__ */
+};
+
+
+interface M_MMAVC : M_MMImage
+{
+
+    /*
+     * New class methods
+     *
+     */
+
+
+#ifdef __SOMIDL__
+  implementation {
+
+
+    /*
+     * Class Modifiers:
+     *
+     */
+
+    externalprefix = cwavcM_;
+    externalstem = cwavcM;
+    functionprefix = cwavcM_;
+    majorversion = 1;
+    minorversion = 2;
+    filestem = cwavc;           //# specifies the filestem for sc-generated files
+    dllname = "cwmm.dll";
+    callstyle = oidl;
+
+    /*
+     * Internal class variables
+     *
+     */
+
+    /*
+     * methods overridden 
+     *
+     */
+    wpclsQueryInstanceType  	: override;
+    wpclsQueryInstanceFilter    : override;   
+    wpclsQueryDefaultHelp       : override; 
+    wpclsQueryTitle   	        : override;   
+    wpclsQueryIconData          : override;
+  };
+
+#endif /* __SOMIDL__ */
+
+};
+
+
+
+
Index: /tags/CWMM-0.3.0_GA/classes/idl/idl_image/cwbmp.idl
===================================================================
--- /tags/CWMM-0.3.0_GA/classes/idl/idl_image/cwbmp.idl	(revision 213)
+++ /tags/CWMM-0.3.0_GA/classes/idl/idl_image/cwbmp.idl	(revision 213)
@@ -0,0 +1,156 @@
+/*
+ * (C) Chris Wohlgemuth 2002-2003
+ *
+ */
+/*
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; see the file COPYING.  If not, write to
+ * the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
+ */          
+/*
+ * If you need another license for your project/product (commercial,
+ * noncommercial, whatever) contact me at
+ * 
+ * http://www.os2world.com/cdwriting
+ * http://www.geocities.com/SiliconValley/Sector/5785/
+ *
+ */
+
+/*
+ * CWBmp.idl:
+ */
+
+#include <wpbitmap.idl>
+
+/*
+   CLASS: 
+*/
+
+interface M_MMBitmap; 
+
+interface MMBitmap : WPBitmap
+{
+
+    /*
+     * New instance methods
+     *
+     */
+
+	ULONG cwmmAddImageInformationPage(in HWND hwndNotebook);
+    HBITMAP cwmmQuerySmallBitmapHandle(in ULONG ulSize);
+    void cwmmFreeBitmaps();  
+    void cwmmFreeSmallBitmap();
+    PBYTE cwmmQueryBitmapInfoHeader();
+	ULONG    cwmmQueryImageInfo(out char* chrString, in ULONG ulSize, in int iWhich); 
+
+#ifdef __SOMIDL__
+  implementation {
+    releaseorder:     	cwmmAddImageInformationPage,
+    cwmmQuerySmallBitmapHandle,
+    cwmmFreeBitmaps, cwmmFreeSmallBitmap, cwmmQueryBitmapInfoHeader,
+    cwmmQueryImageInfo;
+
+    /*
+     * Class Modifiers:
+     *
+     */
+
+    externalprefix = cwbmp_;
+    externalstem = cwbmp;
+    majorversion = 1;
+    minorversion = 2;
+    filestem = cwbmp;           //# specifies the filestem for sc-generated files
+    metaclass = M_MMBitmap;
+    dllname = "cwimage.dll";
+    callstyle = oidl;
+
+
+    /*
+     * Internal instance variables
+     *
+     */
+    HBITMAP hBitmapSmall;   /* (Lighttable)Icon size bitmap */
+    ULONG   ulSizeSmallBitmap;
+    PBYTE   pBmpInfoHeader2;
+    char    chrIOProcName[64];
+    BOOL bNoIOProcAvailable;
+    /*
+     * methods overridden 
+     *
+     */
+    wpModifyPopupMenu       : override;
+    wpMenuItemSelected      : override;
+    wpOpen                  : override;
+    wpAddSettingsPages      : override;
+    wpUnInitData:   override;
+    wpInitData:   override;
+    wpQueryDetailsData      : override; 
+#ifdef __PRIVATE__
+
+#endif
+
+  }; // implementation
+#endif /* __SOMIDL__ */
+};
+
+
+interface M_MMBitmap : M_WPBitmap
+{
+
+    /*
+     * New class methods
+     *
+     */
+
+
+#ifdef __SOMIDL__
+  implementation {
+
+
+    /*
+     * Class Modifiers:
+     *
+     */
+
+    externalprefix = cwbmpM_;
+    externalstem = cwbmpM;
+    functionprefix = cwbmpM_;
+    majorversion = 1;
+    minorversion = 2;
+    filestem = cwbmp;           //# specifies the filestem for sc-generated files
+    dllname = "cwimage.dll";
+    callstyle = oidl;
+
+    /*
+     * Internal class variables
+     *
+     */
+
+    /*
+     * methods overridden 
+     *
+     */
+    wpclsCreateDefaultTemplates :override;   
+    wpclsQueryDefaultView : override;
+    wpclsQueryIconData          : override;
+    wpclsQueryDetailsInfo   	: override;
+    wpclsInitData   : override;  
+  };
+
+#endif /* __SOMIDL__ */
+
+};
+
+
+
+
Index: /tags/CWMM-0.3.0_GA/classes/idl/idl_image/cwdib.idl
===================================================================
--- /tags/CWMM-0.3.0_GA/classes/idl/idl_image/cwdib.idl	(revision 213)
+++ /tags/CWMM-0.3.0_GA/classes/idl/idl_image/cwdib.idl	(revision 213)
@@ -0,0 +1,137 @@
+/*
+ * (C) Chris Wohlgemuth 2002-2003
+ *
+ */
+/*
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; see the file COPYING.  If not, write to
+ * the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
+ */          
+/*
+ * If you need another license for your project/product (commercial,
+ * noncommercial, whatever) contact me at
+ * 
+ * http://www.os2world.com/cdwriting
+ * http://www.geocities.com/SiliconValley/Sector/5785/
+ *
+ */
+
+/*
+ * CWgif.idl:
+ */
+
+#include <cwimage.idl>
+
+/*
+   CLASS: 
+*/
+
+interface M_MMDIB; 
+
+interface MMDIB : MMImage
+{
+
+    /*
+     * New instance methods
+     *
+     */
+
+
+#ifdef __SOMIDL__
+  implementation {
+
+    /*
+     * Class Modifiers:
+     *
+     */
+
+    externalprefix = cwdib_;
+    externalstem = cwdib;
+    majorversion = 1;
+    minorversion = 2;
+    filestem = cwdib;           //# specifies the filestem for sc-generated files
+    metaclass = M_MMDIB;
+    dllname = "cwmm.dll";
+    callstyle = oidl;
+
+
+    /*
+     * Internal instance variables
+     *
+     */
+
+
+    /*
+     * methods overridden 
+     *
+     */
+
+#ifdef __PRIVATE__
+
+#endif
+
+  }; // implementation
+#endif /* __SOMIDL__ */
+};
+
+
+interface M_MMDIB : M_MMImage
+{
+
+    /*
+     * New class methods
+     *
+     */
+
+
+#ifdef __SOMIDL__
+  implementation {
+
+
+    /*
+     * Class Modifiers:
+     *
+     */
+
+    externalprefix = cwdibM_;
+    externalstem = cwdibM;
+    functionprefix = cwdibM_;
+    majorversion = 1;
+    minorversion = 2;
+    filestem = cwdib;           //# specifies the filestem for sc-generated files
+    dllname = "cwmm.dll";
+    callstyle = oidl;
+
+    /*
+     * Internal class variables
+     *
+     */
+
+    /*
+     * methods overridden 
+     *
+     */
+    wpclsQueryInstanceType  	: override;
+    wpclsQueryInstanceFilter    : override;   
+    wpclsQueryDefaultHelp       : override; 
+    wpclsQueryTitle   	        : override;   
+    wpclsQueryIconData          : override;
+  };
+
+#endif /* __SOMIDL__ */
+
+};
+
+
+
+
Index: /tags/CWMM-0.3.0_GA/classes/idl/idl_image/cwgif.idl
===================================================================
--- /tags/CWMM-0.3.0_GA/classes/idl/idl_image/cwgif.idl	(revision 213)
+++ /tags/CWMM-0.3.0_GA/classes/idl/idl_image/cwgif.idl	(revision 213)
@@ -0,0 +1,137 @@
+/*
+ * (C) Chris Wohlgemuth 2002-2003
+ *
+ */
+/*
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; see the file COPYING.  If not, write to
+ * the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
+ */          
+/*
+ * If you need another license for your project/product (commercial,
+ * noncommercial, whatever) contact me at
+ * 
+ * http://www.os2world.com/cdwriting
+ * http://www.geocities.com/SiliconValley/Sector/5785/
+ *
+ */
+
+/*
+ * CWgif.idl:
+ */
+
+#include <cwimage.idl>
+
+/*
+   CLASS: 
+*/
+
+interface M_MMGIF; 
+
+interface MMGIF : MMImage
+{
+
+    /*
+     * New instance methods
+     *
+     */
+
+
+#ifdef __SOMIDL__
+  implementation {
+
+    /*
+     * Class Modifiers:
+     *
+     */
+
+    externalprefix = cwgif_;
+    externalstem = cwgif;
+    majorversion = 1;
+    minorversion = 2;
+    filestem = cwgif;           //# specifies the filestem for sc-generated files
+    metaclass = M_MMGIF;
+    dllname = "cwmm.dll";
+    callstyle = oidl;
+
+
+    /*
+     * Internal instance variables
+     *
+     */
+
+
+    /*
+     * methods overridden 
+     *
+     */
+
+#ifdef __PRIVATE__
+
+#endif
+
+  }; // implementation
+#endif /* __SOMIDL__ */
+};
+
+
+interface M_MMGIF : M_MMImage
+{
+
+    /*
+     * New class methods
+     *
+     */
+
+
+#ifdef __SOMIDL__
+  implementation {
+
+
+    /*
+     * Class Modifiers:
+     *
+     */
+
+    externalprefix = cwgifM_;
+    externalstem = cwgifM;
+    functionprefix = cwgifM_;
+    majorversion = 1;
+    minorversion = 2;
+    filestem = cwgif;           //# specifies the filestem for sc-generated files
+    dllname = "cwmm.dll";
+    callstyle = oidl;
+
+    /*
+     * Internal class variables
+     *
+     */
+
+    /*
+     * methods overridden 
+     *
+     */
+    wpclsQueryInstanceType  	: override;
+    wpclsQueryInstanceFilter    : override;   
+    wpclsQueryDefaultHelp       : override; 
+    wpclsQueryTitle   	        : override;   
+    wpclsQueryIconData          : override;
+  };
+
+#endif /* __SOMIDL__ */
+
+};
+
+
+
+
Index: /tags/CWMM-0.3.0_GA/classes/idl/idl_image/cwimage.idl
===================================================================
--- /tags/CWMM-0.3.0_GA/classes/idl/idl_image/cwimage.idl	(revision 213)
+++ /tags/CWMM-0.3.0_GA/classes/idl/idl_image/cwimage.idl	(revision 213)
@@ -0,0 +1,158 @@
+/*
+ * (C) Chris Wohlgemuth 2002-2003
+ *
+ */
+/*
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; see the file COPYING.  If not, write to
+ * the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
+ */          
+/*
+ * If you need another license for your project/product (commercial,
+ * noncommercial, whatever) contact me at
+ * 
+ * http://www.os2world.com/cdwriting
+ * http://www.geocities.com/SiliconValley/Sector/5785/
+ *
+ */
+
+//  Module Header
+//
+//  Module Name: CWImage
+//
+//  OS/2 Presentation Manager Workplace class definitions
+//
+//
+
+#ifndef cwimage_idl
+#define cwimage_idl
+
+#include <wpimage.idl>
+#include <somcls.idl>
+
+
+interface M_MMImage;
+
+interface MMImage : WPImageFile                                                
+
+{
+    /*
+     * New instance methods
+     *
+     */
+	ULONG    cwmmAddImageInformationPage(in HWND hwndNotebook);
+    HBITMAP  cwmmQuerySmallBitmapHandle(in ULONG ulSize, in PMINIRECORDCORE pmrcToRefresh , in HWND hwndCnr);
+    void     cwmmFreeBitmaps();  
+    void     cwmmFreeSmallBitmap();
+	ULONG    cwmmQueryImageInfo(out char* chrString, in ULONG ulSize, in LONG iWhich);
+    void     cwmmRequestBmpDeletion(in ULONG ulFlags);
+#ifdef __SOMIDL__
+  implementation {
+
+    releaseorder:     	cwmmAddImageInformationPage,
+    cwmmQuerySmallBitmapHandle,
+    cwmmFreeBitmaps, cwmmFreeSmallBitmap,
+    cwmmQueryImageInfo, cwmmRequestBmpDeletion;
+   
+/*wpQueryBitmapHandle, wpQueryBitmapInfoHeader,
+    wpQueryBitmapData, wpSetBitmapData, wpReadImageFile, wpWriteImageFile;
+*/
+    externalstem = cwimage;
+    local;
+    externalprefix = cwimg_;
+    majorversion = 1;
+    minorversion = 2;
+    filestem = cwimage;
+    metaclass = M_MMImage;
+    callstyle = oidl;
+    dllname = "cwmm.dll";               
+
+    passthru C_h_after =  ""
+    "#include \"mmres.h\""
+    "";
+
+    /*
+     * Internal instance variables
+     *
+     */
+
+    HBITMAP hBitmap;   /* Full size bitmap */
+    HBITMAP hBitmapSmall;   /* (Lighttable)Icon size bitmap */
+    ULONG   ulSizeSmallBitmap;
+    PBYTE   pBmpInfoHeader2;
+    char    chrIOProcName[64];
+    BOOL    bNoIOProcAvailable;
+    BOOL    bUseNewClsFeatures; /* Should we use the new features for this object? */
+    ULONG  ulFileSize; /* used to check if image size changed so rereading of data is done */
+    ULONG ulWidth;
+    ULONG ulHeight;
+    ULONG ulDepth;
+
+    wpQueryBitmapHandle        : override;            
+    wpQueryBitmapInfoHeader    : override;            
+    wpQueryBitmapData          : override;            
+    wpSetBitmapData            : override;            
+    wpReadImageFile            : override;            
+    wpWriteImageFile           : override;
+    wpUnInitData               : override;
+    wpQueryDefaultView         : override;
+    /* wpInitData:   override; Not used. Default is instance var initializing to zero and that's what we need. */
+    wpModifyPopupMenu          : override;
+    wpMenuItemSelected         : override;
+    wpOpen                     : override;
+    wpAddSettingsPages         : override;
+    wpQueryDetailsData         : override;    
+    wpRestoreState             : override;
+    wpSetup                    : override;
+    wpObjectReady              : override;
+    wpSaveState                : override;
+/*    wpFormatDragItem           : override;*/
+    wpUnlockObject     : override;
+
+  };
+#endif /* __SOMIDL__ */
+};
+
+interface M_MMImage : M_WPImageFile                                            
+{
+
+#ifdef __SOMIDL__
+  implementation {
+
+    externalstem = cwimage;
+    local;
+    externalprefix = cwimgM_;
+    majorversion = 1;
+    minorversion = 2;
+    filestem = cwimage;
+    callstyle = oidl;
+    dllname = "cwmm.dll";               
+
+
+    wpclsInitData   : override;
+    wpclsQueryDefaultView : override;
+    wpclsCreateDefaultTemplates : override;
+    wpclsQueryStyle: override;
+    wpclsQueryTitle: override;
+    wpclsQueryIconData: override;
+/*    wpclsQueryDefaultHelp: override;*/
+    wpclsQueryDetailsInfo   	: override;
+    wpclsQueryInstanceFilter    : override;
+
+  };
+#endif /* __SOMIDL__ */
+};
+
+#endif  /* cwimage_idl */
+
+
Index: /tags/CWMM-0.3.0_GA/classes/idl/idl_image/cwjpg.idl
===================================================================
--- /tags/CWMM-0.3.0_GA/classes/idl/idl_image/cwjpg.idl	(revision 213)
+++ /tags/CWMM-0.3.0_GA/classes/idl/idl_image/cwjpg.idl	(revision 213)
@@ -0,0 +1,138 @@
+/*
+ * (C) Chris Wohlgemuth 2002-2003
+ *
+ */
+/*
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; see the file COPYING.  If not, write to
+ * the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
+ */          
+/*
+ * If you need another license for your project/product (commercial,
+ * noncommercial, whatever) contact me at
+ * 
+ * http://www.os2world.com/cdwriting
+ * http://www.geocities.com/SiliconValley/Sector/5785/
+ *
+ */
+
+/*
+ * CWgif.idl:
+ */
+
+#include <cwimage.idl>
+
+/*
+   CLASS: 
+*/
+
+interface M_MMJPG; 
+
+interface MMJPG : MMImage
+{
+
+    /*
+     * New instance methods
+     *
+     */
+
+
+#ifdef __SOMIDL__
+  implementation {
+
+    /*
+     * Class Modifiers:
+     *
+     */
+
+    externalprefix = cwjpg_;
+    externalstem = cwjpg;
+    majorversion = 1;
+    minorversion = 2;
+    filestem = cwjpg;           //# specifies the filestem for sc-generated files
+    metaclass = M_MMJPG;
+    dllname = "cwmm.dll";
+    callstyle = oidl;
+
+
+    /*
+     * Internal instance variables
+     *
+     */
+
+
+    /*
+     * methods overridden 
+     *
+     */
+
+#ifdef __PRIVATE__
+
+#endif
+
+  }; // implementation
+#endif /* __SOMIDL__ */
+};
+
+
+interface M_MMJPG : M_MMImage
+{
+
+    /*
+     * New class methods
+     *
+     */
+
+
+#ifdef __SOMIDL__
+  implementation {
+
+
+    /*
+     * Class Modifiers:
+     *
+     */
+
+    externalprefix = cwjpgM_;
+    externalstem = cwjpgM;
+    functionprefix = cwjpgM_;
+    majorversion = 1;
+    minorversion = 2;
+    filestem = cwjpg;           //# specifies the filestem for sc-generated files
+    dllname = "cwmm.dll";
+    callstyle = oidl;
+
+    /*
+     * Internal class variables
+     *
+     */
+
+    /*
+     * methods overridden 
+     *
+     */
+    wpclsQueryInstanceType  	: override;
+    wpclsQueryInstanceFilter    : override;   
+/*    wpclsCreateDefaultTemplates : override;*/
+    wpclsQueryDefaultHelp       : override; 
+    wpclsQueryTitle   	        : override;   
+    wpclsQueryIconData          : override;
+  };
+
+#endif /* __SOMIDL__ */
+
+};
+
+
+
+
Index: /tags/CWMM-0.3.0_GA/classes/idl/idl_image/cwmmotion.idl
===================================================================
--- /tags/CWMM-0.3.0_GA/classes/idl/idl_image/cwmmotion.idl	(revision 213)
+++ /tags/CWMM-0.3.0_GA/classes/idl/idl_image/cwmmotion.idl	(revision 213)
@@ -0,0 +1,142 @@
+/*
+ * (C) Chris Wohlgemuth 2002-2003
+ *
+ */
+/*
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; see the file COPYING.  If not, write to
+ * the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
+ */          
+/*
+ * If you need another license for your project/product (commercial,
+ * noncommercial, whatever) contact me at
+ * 
+ * http://www.os2world.com/cdwriting
+ * http://www.geocities.com/SiliconValley/Sector/5785/
+ *
+ */
+
+/*
+ * CWmmotion.idl:
+ *
+ * Class for *._im files
+ * 
+ */
+
+#include <cwimage.idl>
+
+/*
+   CLASS: 
+*/
+
+interface M_MMMMotion; 
+
+interface MMMMotion : MMImage
+{
+
+    /*
+     * New instance methods
+     *
+     */
+
+
+#ifdef __SOMIDL__
+  implementation {
+
+    /*
+     * Class Modifiers:
+     *
+     */
+
+    externalprefix = cwmmotion_;
+    externalstem = cwmmotion;
+    majorversion = 1;
+    minorversion = 2;
+    filestem = cwmmotion;           //# specifies the filestem for sc-generated files
+    metaclass = M_MMMMotion;
+    dllname = "cwmm.dll";
+    callstyle = oidl;
+
+
+    /*
+     * Internal instance variables
+     *
+     */
+
+
+    /*
+     * methods overridden 
+     *
+     */
+
+#ifdef __PRIVATE__
+
+#endif
+
+  }; // implementation
+#endif /* __SOMIDL__ */
+};
+
+
+interface M_MMMMotion : M_MMImage
+{
+
+    /*
+     * New class methods
+     *
+     */
+
+
+#ifdef __SOMIDL__
+  implementation {
+
+
+    /*
+     * Class Modifiers:
+     *
+     */
+
+    externalprefix = cwmmotionM_;
+    externalstem = cwmmotionM;
+    functionprefix = cwmmotionM_;
+    majorversion = 1;
+    minorversion = 2;
+    filestem = cwmmotion;           //# specifies the filestem for sc-generated files
+    dllname = "cwmm.dll";
+    callstyle = oidl;
+
+    /*
+     * Internal class variables
+     *
+     */
+
+    /*
+     * methods overridden 
+     *
+     */
+    wpclsQueryInstanceType  	: override;
+    wpclsQueryInstanceFilter    : override;   
+
+    wpclsQueryDefaultHelp       : override; 
+    wpclsQueryStyle   	        : override;   
+    wpclsQueryTitle   	        : override;   
+    wpclsQueryIconData          : override;
+  };
+
+#endif /* __SOMIDL__ */
+
+};
+
+
+
+
Index: /tags/CWMM-0.3.0_GA/classes/idl/idl_image/cwpcd.idl
===================================================================
--- /tags/CWMM-0.3.0_GA/classes/idl/idl_image/cwpcd.idl	(revision 213)
+++ /tags/CWMM-0.3.0_GA/classes/idl/idl_image/cwpcd.idl	(revision 213)
@@ -0,0 +1,137 @@
+/*
+ * (C) Chris Wohlgemuth 2002-2003
+ *
+ */
+/*
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; see the file COPYING.  If not, write to
+ * the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
+ */          
+/*
+ * If you need another license for your project/product (commercial,
+ * noncommercial, whatever) contact me at
+ * 
+ * http://www.os2world.com/cdwriting
+ * http://www.geocities.com/SiliconValley/Sector/5785/
+ *
+ */
+
+/*
+ * CWgif.idl:
+ */
+
+#include <cwimage.idl>
+
+/*
+   CLASS: 
+*/
+
+interface M_MMPhotoCD; 
+
+interface MMPhotoCD : MMImage
+{
+
+    /*
+     * New instance methods
+     *
+     */
+
+
+#ifdef __SOMIDL__
+  implementation {
+
+    /*
+     * Class Modifiers:
+     *
+     */
+
+    externalprefix = cwpcd_;
+    externalstem = cwpcd;
+    majorversion = 1;
+    minorversion = 2;
+    filestem = cwpcd;           //# specifies the filestem for sc-generated files
+    metaclass = M_MMPhotoCD;
+    dllname = "cwmm.dll";
+    callstyle = oidl;
+
+
+    /*
+     * Internal instance variables
+     *
+     */
+
+
+    /*
+     * methods overridden 
+     *
+     */
+
+#ifdef __PRIVATE__
+
+#endif
+
+  }; // implementation
+#endif /* __SOMIDL__ */
+};
+
+
+interface M_MMPhotoCD : M_MMImage
+{
+
+    /*
+     * New class methods
+     *
+     */
+
+
+#ifdef __SOMIDL__
+  implementation {
+
+
+    /*
+     * Class Modifiers:
+     *
+     */
+
+    externalprefix = cwpcdM_;
+    externalstem = cwpcdM;
+    functionprefix = cwpcdM_;
+    majorversion = 1;
+    minorversion = 2;
+    filestem = cwpcd;           //# specifies the filestem for sc-generated files
+    dllname = "cwmm.dll";
+    callstyle = oidl;
+
+    /*
+     * Internal class variables
+     *
+     */
+
+    /*
+     * methods overridden 
+     *
+     */
+    wpclsQueryInstanceType  	: override;
+    wpclsQueryInstanceFilter    : override;   
+    wpclsQueryDefaultHelp       : override; 
+    wpclsQueryTitle   	        : override;   
+    wpclsQueryIconData          : override;
+  };
+
+#endif /* __SOMIDL__ */
+
+};
+
+
+
+
Index: /tags/CWMM-0.3.0_GA/classes/idl/idl_image/cwpcx.idl
===================================================================
--- /tags/CWMM-0.3.0_GA/classes/idl/idl_image/cwpcx.idl	(revision 213)
+++ /tags/CWMM-0.3.0_GA/classes/idl/idl_image/cwpcx.idl	(revision 213)
@@ -0,0 +1,137 @@
+/*
+ * (C) Chris Wohlgemuth 2002-2003
+ *
+ */
+/*
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; see the file COPYING.  If not, write to
+ * the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
+ */          
+/*
+ * If you need another license for your project/product (commercial,
+ * noncommercial, whatever) contact me at
+ * 
+ * http://www.os2world.com/cdwriting
+ * http://www.geocities.com/SiliconValley/Sector/5785/
+ *
+ */
+
+/*
+ * CWgif.idl:
+ */
+
+#include <cwimage.idl>
+
+/*
+   CLASS: 
+*/
+
+interface M_MMPCX; 
+
+interface MMPCX : MMImage
+{
+
+    /*
+     * New instance methods
+     *
+     */
+
+
+#ifdef __SOMIDL__
+  implementation {
+
+    /*
+     * Class Modifiers:
+     *
+     */
+
+    externalprefix = cwpcx_;
+    externalstem = cwpcx;
+    majorversion = 1;
+    minorversion = 2;
+    filestem = cwpcx;           //# specifies the filestem for sc-generated files
+    metaclass = M_MMPCX;
+    dllname = "cwmm.dll";
+    callstyle = oidl;
+
+
+    /*
+     * Internal instance variables
+     *
+     */
+
+
+    /*
+     * methods overridden 
+     *
+     */
+
+#ifdef __PRIVATE__
+
+#endif
+
+  }; // implementation
+#endif /* __SOMIDL__ */
+};
+
+
+interface M_MMPCX : M_MMImage
+{
+
+    /*
+     * New class methods
+     *
+     */
+
+
+#ifdef __SOMIDL__
+  implementation {
+
+
+    /*
+     * Class Modifiers:
+     *
+     */
+
+    externalprefix = cwpcxM_;
+    externalstem = cwpcxM;
+    functionprefix = cwpcxM_;
+    majorversion = 1;
+    minorversion = 2;
+    filestem = cwpcx;           //# specifies the filestem for sc-generated files
+    dllname = "cwmm.dll";
+    callstyle = oidl;
+
+    /*
+     * Internal class variables
+     *
+     */
+
+    /*
+     * methods overridden 
+     *
+     */
+    wpclsQueryInstanceType  	: override;
+    wpclsQueryInstanceFilter    : override;   
+    wpclsQueryDefaultHelp       : override; 
+    wpclsQueryTitle   	        : override;   
+    wpclsQueryIconData          : override;
+  };
+
+#endif /* __SOMIDL__ */
+
+};
+
+
+
+
Index: /tags/CWMM-0.3.0_GA/classes/idl/idl_image/cwpng.idl
===================================================================
--- /tags/CWMM-0.3.0_GA/classes/idl/idl_image/cwpng.idl	(revision 213)
+++ /tags/CWMM-0.3.0_GA/classes/idl/idl_image/cwpng.idl	(revision 213)
@@ -0,0 +1,137 @@
+/*
+ * (C) Chris Wohlgemuth 2002-2003
+ *
+ */
+/*
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; see the file COPYING.  If not, write to
+ * the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
+ */          
+/*
+ * If you need another license for your project/product (commercial,
+ * noncommercial, whatever) contact me at
+ * 
+ * http://www.os2world.com/cdwriting
+ * http://www.geocities.com/SiliconValley/Sector/5785/
+ *
+ */
+
+/*
+ * CWavc.idl:
+ */
+
+#include <cwimage.idl>
+
+/*
+   CLASS: 
+*/
+
+interface M_MMPNG; 
+
+interface MMPNG : MMImage
+{
+
+    /*
+     * New instance methods
+     *
+     */
+
+
+#ifdef __SOMIDL__
+  implementation {
+
+    /*
+     * Class Modifiers:
+     *
+     */
+
+    externalprefix = cwpng_;
+    externalstem = cwpng;
+    majorversion = 1;
+    minorversion = 2;
+    filestem = cwpng;           //# specifies the filestem for sc-generated files
+    metaclass = M_MMPNG;
+    dllname = "cwmm.dll";
+    callstyle = oidl;
+
+
+    /*
+     * Internal instance variables
+     *
+     */
+
+
+    /*
+     * methods overridden 
+     *
+     */
+
+#ifdef __PRIVATE__
+
+#endif
+
+  }; // implementation
+#endif /* __SOMIDL__ */
+};
+
+
+interface M_MMPNG : M_MMImage
+{
+
+    /*
+     * New class methods
+     *
+     */
+
+
+#ifdef __SOMIDL__
+  implementation {
+
+
+    /*
+     * Class Modifiers:
+     *
+     */
+
+    externalprefix = cwpngM_;
+    externalstem = cwpngM;
+    functionprefix = cwpngM_;
+    majorversion = 1;
+    minorversion = 2;
+    filestem = cwpng;           //# specifies the filestem for sc-generated files
+    dllname = "cwmm.dll";
+    callstyle = oidl;
+
+    /*
+     * Internal class variables
+     *
+     */
+
+    /*
+     * methods overridden 
+     *
+     */
+    wpclsQueryInstanceType  	: override;
+    wpclsQueryInstanceFilter    : override;   
+    wpclsQueryDefaultHelp       : override; 
+    wpclsQueryTitle   	        : override;   
+    wpclsQueryIconData          : override;
+  };
+
+#endif /* __SOMIDL__ */
+
+};
+
+
+
+
Index: /tags/CWMM-0.3.0_GA/classes/idl/idl_image/cwtga.idl
===================================================================
--- /tags/CWMM-0.3.0_GA/classes/idl/idl_image/cwtga.idl	(revision 213)
+++ /tags/CWMM-0.3.0_GA/classes/idl/idl_image/cwtga.idl	(revision 213)
@@ -0,0 +1,137 @@
+/*
+ * (C) Chris Wohlgemuth 2002-2003
+ *
+ */
+/*
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; see the file COPYING.  If not, write to
+ * the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
+ */          
+/*
+ * If you need another license for your project/product (commercial,
+ * noncommercial, whatever) contact me at
+ * 
+ * http://www.os2world.com/cdwriting
+ * http://www.geocities.com/SiliconValley/Sector/5785/
+ *
+ */
+
+/*
+ * CWgif.idl:
+ */
+
+#include <cwimage.idl>
+
+/*
+   CLASS: 
+*/
+
+interface M_MMTarga; 
+
+interface MMTarga : MMImage
+{
+
+    /*
+     * New instance methods
+     *
+     */
+
+
+#ifdef __SOMIDL__
+  implementation {
+
+    /*
+     * Class Modifiers:
+     *
+     */
+
+    externalprefix = cwtga_;
+    externalstem = cwtga;
+    majorversion = 1;
+    minorversion = 2;
+    filestem = cwtga;           //# specifies the filestem for sc-generated files
+    metaclass = M_MMTarga;
+    dllname = "cwmm.dll";
+    callstyle = oidl;
+
+
+    /*
+     * Internal instance variables
+     *
+     */
+
+
+    /*
+     * methods overridden 
+     *
+     */
+
+#ifdef __PRIVATE__
+
+#endif
+
+  }; // implementation
+#endif /* __SOMIDL__ */
+};
+
+
+interface M_MMTarga : M_MMImage
+{
+
+    /*
+     * New class methods
+     *
+     */
+
+
+#ifdef __SOMIDL__
+  implementation {
+
+
+    /*
+     * Class Modifiers:
+     *
+     */
+
+    externalprefix = cwtgaM_;
+    externalstem = cwtgaM;
+    functionprefix = cwtgaM_;
+    majorversion = 1;
+    minorversion = 2;
+    filestem = cwtga;           //# specifies the filestem for sc-generated files
+    dllname = "cwmm.dll";
+    callstyle = oidl;
+
+    /*
+     * Internal class variables
+     *
+     */
+
+    /*
+     * methods overridden 
+     *
+     */
+    wpclsQueryInstanceType  	: override;
+    wpclsQueryInstanceFilter    : override;   
+    wpclsQueryDefaultHelp       : override; 
+    wpclsQueryTitle   	        : override;   
+    wpclsQueryIconData          : override;
+  };
+
+#endif /* __SOMIDL__ */
+
+};
+
+
+
+
Index: /tags/CWMM-0.3.0_GA/classes/idl/idl_image/cwtiff.idl
===================================================================
--- /tags/CWMM-0.3.0_GA/classes/idl/idl_image/cwtiff.idl	(revision 213)
+++ /tags/CWMM-0.3.0_GA/classes/idl/idl_image/cwtiff.idl	(revision 213)
@@ -0,0 +1,137 @@
+/*
+ * (C) Chris Wohlgemuth 2002-2003
+ *
+ */
+/*
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; see the file COPYING.  If not, write to
+ * the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
+ */          
+/*
+ * If you need another license for your project/product (commercial,
+ * noncommercial, whatever) contact me at
+ * 
+ * http://www.os2world.com/cdwriting
+ * http://www.geocities.com/SiliconValley/Sector/5785/
+ *
+ */
+
+/*
+ * CWgif.idl:
+ */
+
+#include <cwimage.idl>
+
+/*
+   CLASS: 
+*/
+
+interface M_MMTIFF; 
+
+interface MMTIFF : MMImage
+{
+
+    /*
+     * New instance methods
+     *
+     */
+
+
+#ifdef __SOMIDL__
+  implementation {
+
+    /*
+     * Class Modifiers:
+     *
+     */
+
+    externalprefix = cwtiff_;
+    externalstem = cwtiff;
+    majorversion = 1;
+    minorversion = 2;
+    filestem = cwtiff;           //# specifies the filestem for sc-generated files
+    metaclass = M_MMTIFF;
+    dllname = "cwmm.dll";
+    callstyle = oidl;
+
+
+    /*
+     * Internal instance variables
+     *
+     */
+
+
+    /*
+     * methods overridden 
+     *
+     */
+
+#ifdef __PRIVATE__
+
+#endif
+
+  }; // implementation
+#endif /* __SOMIDL__ */
+};
+
+
+interface M_MMTIFF : M_MMImage
+{
+
+    /*
+     * New class methods
+     *
+     */
+
+
+#ifdef __SOMIDL__
+  implementation {
+
+
+    /*
+     * Class Modifiers:
+     *
+     */
+
+    externalprefix = cwtiffM_;
+    externalstem = cwtiffM;
+    functionprefix = cwtiffM_;
+    majorversion = 1;
+    minorversion = 2;
+    filestem = cwtiff;           //# specifies the filestem for sc-generated files
+    dllname = "cwmm.dll";
+    callstyle = oidl;
+
+    /*
+     * Internal class variables
+     *
+     */
+
+    /*
+     * methods overridden 
+     *
+     */
+    wpclsQueryInstanceType  	: override;
+    wpclsQueryInstanceFilter    : override;   
+    wpclsQueryDefaultHelp       : override; 
+    wpclsQueryTitle   	        : override;   
+    wpclsQueryIconData          : override;
+  };
+
+#endif /* __SOMIDL__ */
+
+};
+
+
+
+
Index: /tags/CWMM-0.3.0_GA/classes/idl/idl_image/wpimage.idl
===================================================================
--- /tags/CWMM-0.3.0_GA/classes/idl/idl_image/wpimage.idl	(revision 213)
+++ /tags/CWMM-0.3.0_GA/classes/idl/idl_image/wpimage.idl	(revision 213)
@@ -0,0 +1,117 @@
+/*
+ * (C) Chris Wohlgemuth 2002-2003
+ *
+ */
+/*
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; see the file COPYING.  If not, write to
+ * the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
+ */          
+/*
+ * If you need another license for your project/product (commercial,
+ * noncommercial, whatever) contact me at
+ * 
+ * http://www.os2world.com/cdwriting
+ * http://www.geocities.com/SiliconValley/Sector/5785/
+ *
+ */
+
+//  Module Header
+//
+//  Module Name: WPIMAGEFILE
+//
+//  OS/2 Presentation Manager Workplace class definitions
+//
+//
+
+#ifndef wpimagefile_idl
+#define wpimagefile_idl
+
+#include <wpdataf.idl>
+#include <somcls.idl>
+
+typedef HPAL *PHPAL;
+
+interface M_WPImageFile;
+
+interface WPImageFile : WPDataFile                                                
+
+{
+    /*
+     * New instance methods
+     *
+     */
+
+    BOOL wpQueryBitmapHandle(inout HBITMAP phBitmap, inout HPAL phPalette, 
+    in ULONG ulWidth, in ULONG ulHeight, in ULONG ulFlags, in LONG lBackgroundColor,
+    inout BOOL pbQuitEarly);
+    PBYTE wpQueryBitmapInfoHeader();
+    PBYTE wpQueryBitmapData(inout ULONG pulSize);
+    BOOL wpSetBitmapData(in PBYTE pBitmapData, in ULONG ulSize);
+    BOOL wpReadImageFile();
+    BOOL wpWriteImageFile();
+
+#ifdef __SOMIDL__
+  implementation {
+
+    releaseorder:     wpQueryBitmapHandle, wpQueryBitmapInfoHeader,
+    wpQueryBitmapData, wpSetBitmapData, wpReadImageFile, wpWriteImageFile;
+
+    externalstem = wpimagefile;
+    local;
+    externalprefix = wpimg_;
+    majorversion = 1;
+    minorversion = 2;
+    filestem = wpimage;
+    metaclass = M_WPImageFile;
+    callstyle = oidl;
+    dllname = "pmwp.dll";               
+
+
+
+/*    
+Warp4:
+wpSetContentsFromHandle 	
+  wpQueryHandleFromContents
+
+*/
+    wpUnInitData: override;            
+  };
+#endif /* __SOMIDL__ */
+};
+
+interface M_WPImageFile : M_WPDataFile                                            
+{
+
+#ifdef __SOMIDL__
+  implementation {
+
+    externalstem = wpimagefile;
+    local;
+    externalprefix = wpimgM_;
+    majorversion = 1;
+    minorversion = 2;
+    filestem = wpimage;
+    callstyle = oidl;
+    dllname = "pmwp.dll";               
+
+    wpclsQueryInstanceType: override;
+    wpclsQueryStyle: override;
+    wpclsQueryTitle: override;
+    wpclsQueryDefaultHelp: override;
+
+  };
+#endif /* __SOMIDL__ */
+};
+
+#endif  /* wpimagefile_idl */
Index: /tags/CWMM-0.3.0_GA/classes/idl/idl_mm/create-cwmmdataf_hh.CMD
===================================================================
--- /tags/CWMM-0.3.0_GA/classes/idl/idl_mm/create-cwmmdataf_hh.CMD	(revision 213)
+++ /tags/CWMM-0.3.0_GA/classes/idl/idl_mm/create-cwmmdataf_hh.CMD	(revision 213)
@@ -0,0 +1,7 @@
+@echo off
+rem /* */
+rem call RxFuncAdd 'SysLoadFuncs', 'RexxUtil', 'SysLoadFuncs'
+rem call SysLoadFuncs
+
+sc -shh -S 64000   -m noqualifytypes cwmmdataf.idl
+
Index: /tags/CWMM-0.3.0_GA/classes/idl/idl_mm/cwmmdataf.idl
===================================================================
--- /tags/CWMM-0.3.0_GA/classes/idl/idl_mm/cwmmdataf.idl	(revision 213)
+++ /tags/CWMM-0.3.0_GA/classes/idl/idl_mm/cwmmdataf.idl	(revision 213)
@@ -0,0 +1,181 @@
+/*
+ * (C) Chris Wohlgemuth 2002-2003
+ *
+ */
+/*
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; see the file COPYING.  If not, write to
+ * the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
+ */          
+/*
+ * If you need another license for your project/product (commercial,
+ * noncommercial, whatever) contact me at
+ * 
+ * http://www.os2world.com/cdwriting
+ * http://www.geocities.com/SiliconValley/Sector/5785/
+ *
+ */
+
+/*
+ * cwmmdataf.idl
+ */
+
+#include <wpdataf.idl>
+
+/*
+   CLASS: CWMMDataFile
+*/
+
+interface M_CWMMDataFile; 
+
+interface M_CWMMDataFile : M_WPDataFile
+{
+
+    /*
+     * New class methods
+     *
+     */
+
+    /* Window which receives messages asking for scanning audio files. */   
+    readonly attribute HWND hwndAudioWorker; 
+    /* Status window handle for message when scanning audio files. */
+	readonly attribute HWND hwndStatus;
+
+#ifdef __SOMIDL__
+  implementation {
+    /*
+     * Class Modifiers:
+     *
+     */
+    releaseorder:
+        _get_hwndAudioWorker,
+        _get_hwndStatus;
+
+    externalprefix = cwmmdatafileM_;
+    externalstem = cwmmdatafileM;
+    functionprefix = cwmmdatafileM_;
+    majorversion = 1;
+    minorversion = 2;
+    filestem = cwmmdataf;           //# specifies the filestem for sc-generated files
+    dllname = "cwmm.DLL";
+    callstyle = oidl;
+
+    /*
+     * Internal class variables
+     *
+     */
+    /* Window which receives messages asking for scanning audio files. */
+/*   HWND hwndAudioWorker;*/
+    /* Should we draw extended object titles in containers while playing? */
+    BOOL    bNoExtendedIconTitles;
+
+    /*
+     *  methods overridden 
+     *
+     */
+	wpclsCreateDefaultTemplates     : override;
+	wpclsQueryTitle         	: override;
+	wpclsQueryIconData      	: override;
+	wpclsInitData      	        : override;
+	wpclsUnInitData      	        : override;
+	wpclsQueryStyle                 : override;
+  };
+
+#endif /* __SOMIDL__ */
+
+};
+
+
+
+interface CWMMDataFile : WPDataFile
+{
+
+    /*
+     * New instance methods
+     *
+     */
+	PFNWP cwmmSetObjWindowProc(in PFNWP pObjectProc);
+	PFNWP cwmmQueryObjWindowProc();
+    BOOL  cwmmSetRecordTitles(in PSZ pTitle, in BOOL bAddToTitle);
+    ULONG cwmmQueryTrackStatus();
+
+    /* Object window handling the start/stop/pause/resume commands. */
+    attribute  HWND hwndObjectPlay;
+    /* Saved view while playing. */
+    attribute ULONG ulPreviousView;
+    /* This var holds the current status: stopped, playing, paused... */
+    attribute ULONG ulTrackStatus;
+
+#ifdef __SOMIDL__
+  implementation {
+
+	releaseorder:
+		cwmmSetObjWindowProc,
+		cwmmQueryObjWindowProc,
+        cwmmSetRecordTitles,
+        cwmmQueryTrackStatus,
+        _get_hwndObjectPlay,
+        _set_hwndObjectPlay,
+        _get_ulPreviousView,
+        _set_ulPreviousView,
+        _get_ulTrackStatus,
+        _set_ulTrackStatus;
+    /*
+     * Class Modifiers:
+     *
+     */
+
+    externalprefix = cwmmdatafile_;
+    externalstem = cwmmdatafile;
+    majorversion = 1;
+    minorversion = 2;
+    filestem = cwmmdataf;           //# specifies the filestem for sc-generated files
+    metaclass = M_CWMMDataFile;
+    dllname = "cwmm.dll";
+    callstyle = oidl;
+
+    /*
+     * Internal instance variables
+     *
+     */
+    /* This object window procedure handles the start/stop commands. It has to be set by a subclass. */
+    PFNWP pfnwpObjectProc;
+    /* The alternative object title to be drawn in a container when playing. */
+    char chrRecordTitle[CCHMAXPATH];
+    /* Saved title for restoring. */
+    PSZ pOrgTitle;
+
+    /*
+     *  methods overridden 
+     *
+     */
+    wpFilterPopupMenu	    : override;
+    wpAddSettingsPages      : override;
+    wpModifyPopupMenu       : override;
+    wpSetTitle              : override;
+    wpQueryTitle            : override;
+#ifdef __PRIVATE__
+
+#endif
+
+  }; // implementation
+#endif /* __SOMIDL__ */
+};
+
+
+
+
+
+
+
+
Index: /tags/CWMM-0.3.0_GA/classes/idl/idl_mm/cwmmdisk.idl
===================================================================
--- /tags/CWMM-0.3.0_GA/classes/idl/idl_mm/cwmmdisk.idl	(revision 213)
+++ /tags/CWMM-0.3.0_GA/classes/idl/idl_mm/cwmmdisk.idl	(revision 213)
@@ -0,0 +1,144 @@
+/*
+ * (C) Chris Wohlgemuth 2002-2003
+ *
+ */
+/*
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; see the file COPYING.  If not, write to
+ * the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
+ */          
+/*
+ * If you need another license for your project/product (commercial,
+ * noncommercial, whatever) contact me at
+ * 
+ * http://www.os2world.com/cdwriting
+ * http://www.geocities.com/SiliconValley/Sector/5785/
+ *
+ */
+
+/*
+ * CWdisk.idl:
+ *
+ *
+ */
+
+#include <wpdisk.idl>
+
+/*
+   CLASS: CWMMDisk
+
+   CLASS HIERARCHY:
+
+       SOMObject
+         ÀÄÄ WPObject
+               ÀÄÄ WPAbstract
+                     ÀÄÄ WPDisk
+                           ÀÄÄ CWMMDisk
+*/
+
+interface M_CWMMDisk;          
+
+interface CWMMDisk : WPDisk
+{
+
+    /*
+     * New instance methods for CWDisk:
+     *
+     */
+
+#ifdef __SOMIDL__
+  implementation {
+
+    /*
+     * Class Modifiers:
+     */
+
+    externalprefix = cwmmdisk_;
+    externalstem = cwmmdisk;
+    majorversion = 1;
+    minorversion = 2;
+    filestem = cwmmdisk;           //# specifies the filestem for sc-generated files
+    metaclass = M_CWMMDisk;
+    dllname = "CWMM.dll";
+    callstyle = oidl;
+
+    /*
+     * Internal instance variables for CWDisk:
+     *
+     */
+
+    /*
+     * WPDisk methods overridden by CWDisk:
+     *
+     */
+
+    wpViewObject     :override; 
+/*    wpInitData : override;
+wpDelete : override;*/
+wpFree : override;
+wpObjectReady : override;
+#ifdef __PRIVATE__
+
+#endif
+
+  }; // implementation
+#endif /* __SOMIDL__ */
+};
+
+
+interface M_CWMMDisk : M_WPDisk
+{
+
+    /*
+     * New class methods for M_CWDisk:
+     *
+     */
+
+
+#ifdef __SOMIDL__
+  implementation {
+
+
+    /*
+     * Class Modifiers:
+     *
+     */
+
+    externalprefix = cwmmdiskM_;
+    externalstem = cwmmdiskM;
+    functionprefix = cwmmdiskM_;
+    majorversion = 1;
+    minorversion = 2;
+    filestem = cwmmdisk;           //# specifies the filestem for sc-generated files
+    dllname = "CWMM.dll";
+    callstyle = oidl;
+
+    /*
+     * Internal class variables
+     *
+     */
+
+    /*
+     * M_WPDisk methods overridden by M_CWDisk:
+     *
+     */
+
+    wpclsQueryTitle: override;
+
+  };
+
+#endif /* __SOMIDL__ */
+
+};
+
+
Index: /tags/CWMM-0.3.0_GA/classes/idl/idl_mm/mmfolder.idl
===================================================================
--- /tags/CWMM-0.3.0_GA/classes/idl/idl_mm/mmfolder.idl	(revision 213)
+++ /tags/CWMM-0.3.0_GA/classes/idl/idl_mm/mmfolder.idl	(revision 213)
@@ -0,0 +1,130 @@
+           // this is SOM for WPDisk
+/*
+ * mmfolder.idl:
+ *
+ *
+ */
+
+#include <wpfolder.idl>
+
+/*
+
+   CLASS HIERARCHY:
+
+       SOMObject
+         ÀÄÄ WPObject
+*/
+
+interface M_MMFolder;
+
+interface MMFolder : WPFolder
+{
+
+    /*
+     * New instance methods:
+     *
+     */
+
+#ifdef __SOMIDL__
+  implementation {
+
+    /*
+     * Class Modifiers:
+     */
+
+    externalprefix = mmfldr_;
+    externalstem = mmfolder;
+    majorversion = 1;
+    minorversion = 2;
+    filestem = mmfolder;           //# specifies the filestem for sc-generated files
+    metaclass = M_MMFolder;
+    dllname = "CWMM.dll";
+    callstyle = oidl;
+
+    /*
+     * Internal instance variables for CWDisk:
+     *
+     */
+PFNWP	oldFrameProc;
+PFNWP	oldContainerProc;
+ULONG   ulCurrentSize;
+ULONG   usLastSelMenuItem;
+ULONG*  pulGridSpacing;
+PBYTE   pFldrLongArray;
+
+
+    /*
+     *
+     */
+
+	wpOpen :override;
+/*	wpSetupOnce :override;*/
+	wpRestoreState :override;
+	wpRestoreData :override;
+	wpSaveState   :override;
+	wpSaveData   :override;
+	wpMenuItemSelected :override;
+	wpObjectReady:override;
+	wpSetup:override;
+
+#ifdef __PRIVATE__
+
+#endif
+
+  }; // implementation
+#endif /* __SOMIDL__ */
+};
+
+
+interface M_MMFolder : M_WPFolder
+{
+
+    /*
+     * New class methods for M_CWDisk:
+     *
+     */
+
+
+#ifdef __SOMIDL__
+  implementation {
+
+
+    /*
+     * Class Modifiers:
+     *
+     */
+
+    externalprefix = mmfldrM_;
+    externalstem = mmfldrM;
+    functionprefix = mmfldrM_;
+    majorversion = 1;
+    minorversion = 2;
+    filestem = mmfolder;           //# specifies the filestem for sc-generated files
+    dllname = "CWMM.dll";
+    callstyle = oidl;
+
+    /*
+     * Internal class variables
+     *
+     */
+
+    /*
+     * M_WPFolder methods overridden:
+     *
+     */
+    wpclsCreateDefaultTemplates : override;
+    wpclsQueryTitle             : override;
+    wpclsQueryIconData          : override;
+    wpclsQueryIconDataN         : override;
+    wpclsQueryDefaultView       : override; 
+  };
+
+#endif /* __SOMIDL__ */
+
+};
+
+
+
+
+
+
Index: /tags/CWMM-0.3.0_GA/classes/idl/idl_video/cwavi.idl
===================================================================
--- /tags/CWMM-0.3.0_GA/classes/idl/idl_video/cwavi.idl	(revision 213)
+++ /tags/CWMM-0.3.0_GA/classes/idl/idl_video/cwavi.idl	(revision 213)
@@ -0,0 +1,139 @@
+/*
+ * (C) Chris Wohlgemuth 2002-2003
+ *
+ */
+/*
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; see the file COPYING.  If not, write to
+ * the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
+ */          
+/*
+ * If you need another license for your project/product (commercial,
+ * noncommercial, whatever) contact me at
+ * 
+ * http://www.os2world.com/cdwriting
+ * http://www.geocities.com/SiliconValley/Sector/5785/
+ *
+ */
+
+/*
+ * CWavi.idl:
+ */
+
+#include <cwvideo.idl>
+
+/*
+   CLASS: CWAVI  
+*/
+
+interface M_MMAVI; 
+
+interface MMAVI : MMVideo
+{
+
+    /*
+     * New instance methods
+     *
+     */
+
+#ifdef __SOMIDL__
+  implementation {
+
+    /*
+     * Class Modifiers:
+     *
+     */
+
+    externalprefix = cwavi_;
+    externalstem = cwavi;
+    majorversion = 1;
+    minorversion = 2;
+    filestem = cwavi;           //# specifies the filestem for sc-generated files
+    metaclass = M_MMAVI;
+    dllname = "CWMM.dll";
+    callstyle = oidl;
+    
+
+    passthru C_h_after =  ""
+    "#include \"mmres.h\""
+    "";
+
+    /*
+     * Internal instance variables
+     *
+     */
+
+    /*
+     * methods overridden 
+     *
+     */
+	wpOpen :override;
+
+#ifdef __PRIVATE__
+
+#endif
+
+  }; // implementation
+#endif /* __SOMIDL__ */
+};
+
+
+
+interface M_MMAVI : M_MMVideo
+{
+
+    /*
+     * New class methods
+     *
+     */
+
+
+#ifdef __SOMIDL__
+  implementation {
+
+
+    /*
+     * Class Modifiers:
+     *
+     */
+
+    externalprefix = cwaviM_;
+    externalstem = cwaviM;
+    functionprefix = cwaviM_;
+    majorversion = 1;
+    minorversion = 2;
+    filestem = cwavi;           //# specifies the filestem for sc-generated files
+    dllname = "CWMM.dll";
+    callstyle = oidl;
+
+    /*
+     * Internal class variables
+     *
+     */
+
+    /*
+     * methods overridden 
+     *
+     */
+    wpclsQueryTitle         	: override;
+    wpclsQueryInstanceType  	: override;
+    wpclsQueryInstanceFilter    : override;   
+    wpclsQueryIconData          : override;
+    wpclsQueryDefaultHelp       : override; 
+  };
+
+#endif /* __SOMIDL__ */
+
+};
+
+
Index: /tags/CWMM-0.3.0_GA/classes/idl/idl_video/cwfli.idl
===================================================================
--- /tags/CWMM-0.3.0_GA/classes/idl/idl_video/cwfli.idl	(revision 213)
+++ /tags/CWMM-0.3.0_GA/classes/idl/idl_video/cwfli.idl	(revision 213)
@@ -0,0 +1,139 @@
+/*
+ * (C) Chris Wohlgemuth 2002-2003
+ *
+ */
+/*
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; see the file COPYING.  If not, write to
+ * the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
+ */          
+/*
+ * If you need another license for your project/product (commercial,
+ * noncommercial, whatever) contact me at
+ * 
+ * http://www.os2world.com/cdwriting
+ * http://www.geocities.com/SiliconValley/Sector/5785/
+ *
+ */
+
+/*
+ * CWfli.idl:
+ */
+
+#include <cwvideo.idl>
+
+
+/*
+   CLASS: CWFLI  
+*/
+
+interface M_MMFLI; 
+
+interface MMFLI : MMVideo
+{
+
+    /*
+     * New instance methods
+     *
+     */
+
+#ifdef __SOMIDL__
+  implementation {
+
+    /*
+     * Class Modifiers:
+     *
+     */
+
+    externalprefix = cwfli_;
+    externalstem = cwfli;
+    majorversion = 1;
+    minorversion = 2;
+    filestem = cwfli;           //# specifies the filestem for sc-generated files
+    metaclass = M_MMFLI;
+    dllname = "CWMM.dll";
+    callstyle = oidl;
+    
+
+    passthru C_h_after =  ""
+    "#include \"mmres.h\""
+    "";
+
+    /*
+     * Internal instance variables
+     *
+     */
+
+    /*
+     * methods overridden 
+     *
+     */
+
+#ifdef __PRIVATE__
+
+#endif
+
+  }; // implementation
+#endif /* __SOMIDL__ */
+};
+
+
+
+interface M_MMFLI : M_MMVideo
+{
+
+    /*
+     * New class methods
+     *
+     */
+
+
+#ifdef __SOMIDL__
+  implementation {
+
+
+    /*
+     * Class Modifiers:
+     *
+     */
+
+    externalprefix = cwfliM_;
+    externalstem = cwfliM;
+    functionprefix = cwfliM_;
+    majorversion = 1;
+    minorversion = 2;
+    filestem = cwfli;           //# specifies the filestem for sc-generated files
+    dllname = "CWMM.dll";
+    callstyle = oidl;
+
+    /*
+     * Internal class variables
+     *
+     */
+
+    /*
+     * methods overridden 
+     *
+     */
+    wpclsQueryTitle         	: override;
+    wpclsQueryInstanceType  	: override;
+    wpclsQueryInstanceFilter    : override;   
+    wpclsQueryIconData          : override;
+    wpclsQueryDefaultHelp       : override; 
+  };
+
+#endif /* __SOMIDL__ */
+
+};
+
+
Index: /tags/CWMM-0.3.0_GA/classes/idl/idl_video/cwmov.idl
===================================================================
--- /tags/CWMM-0.3.0_GA/classes/idl/idl_video/cwmov.idl	(revision 213)
+++ /tags/CWMM-0.3.0_GA/classes/idl/idl_video/cwmov.idl	(revision 213)
@@ -0,0 +1,139 @@
+/*
+ * (C) Chris Wohlgemuth 2002-2003
+ *
+ */
+/*
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; see the file COPYING.  If not, write to
+ * the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
+ */          
+/*
+ * If you need another license for your project/product (commercial,
+ * noncommercial, whatever) contact me at
+ * 
+ * http://www.os2world.com/cdwriting
+ * http://www.geocities.com/SiliconValley/Sector/5785/
+ *
+ */
+
+/*
+ * CWmov.idl:
+ */
+
+#include <cwvideo.idl>
+
+
+/*
+   CLASS: CWMOV  
+*/
+
+interface M_MMMOV; 
+
+interface MMMOV : MMVideo
+{
+
+    /*
+     * New instance methods
+     *
+     */
+
+#ifdef __SOMIDL__
+  implementation {
+
+    /*
+     * Class Modifiers:
+     *
+     */
+
+    externalprefix = cwmov_;
+    externalstem = cwmov;
+    majorversion = 1;
+    minorversion = 2;
+    filestem = cwmov;           //# specifies the filestem for sc-generated files
+    metaclass = M_MMMOV;
+    dllname = "CWMM.dll";
+    callstyle = oidl;
+    
+
+    passthru C_h_after =  ""
+    "#include \"mmres.h\""
+    "";
+
+    /*
+     * Internal instance variables
+     *
+     */
+
+    /*
+     * methods overridden 
+     *
+     */
+
+#ifdef __PRIVATE__
+
+#endif
+
+  }; // implementation
+#endif /* __SOMIDL__ */
+};
+
+
+
+interface M_MMMOV : M_MMVideo
+{
+
+    /*
+     * New class methods
+     *
+     */
+
+
+#ifdef __SOMIDL__
+  implementation {
+
+
+    /*
+     * Class Modifiers:
+     *
+     */
+
+    externalprefix = cwmovM_;
+    externalstem = cwmovM;
+    functionprefix = cwmovM_;
+    majorversion = 1;
+    minorversion = 2;
+    filestem = cwmov;           //# specifies the filestem for sc-generated files
+    dllname = "CWMM.dll";
+    callstyle = oidl;
+
+    /*
+     * Internal class variables
+     *
+     */
+
+    /*
+     * methods overridden 
+     *
+     */
+    wpclsQueryTitle         	: override;
+    wpclsQueryInstanceType  	: override;
+    wpclsQueryInstanceFilter    : override;   
+    wpclsQueryIconData          : override;
+    wpclsQueryDefaultHelp       : override; 
+  };
+
+#endif /* __SOMIDL__ */
+
+};
+
+
Index: /tags/CWMM-0.3.0_GA/classes/idl/idl_video/cwmpg.idl
===================================================================
--- /tags/CWMM-0.3.0_GA/classes/idl/idl_video/cwmpg.idl	(revision 213)
+++ /tags/CWMM-0.3.0_GA/classes/idl/idl_video/cwmpg.idl	(revision 213)
@@ -0,0 +1,141 @@
+/*
+ * (C) Chris Wohlgemuth 2002-2003
+ *
+ */
+/*
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; see the file COPYING.  If not, write to
+ * the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
+ */          
+/*
+ * If you need another license for your project/product (commercial,
+ * noncommercial, whatever) contact me at
+ * 
+ * http://www.os2world.com/cdwriting
+ * http://www.geocities.com/SiliconValley/Sector/5785/
+ *
+ */
+
+/*
+ * CWmpg.idl:
+ */
+
+#include <cwvideo.idl>
+
+
+/*
+   CLASS: CWMPG  
+*/
+
+interface M_MMMPG; 
+
+interface MMMPG : MMVideo
+{
+
+    /*
+     * New instance methods
+     *
+     */
+
+#ifdef __SOMIDL__
+  implementation {
+
+    /*
+     * Class Modifiers:
+     *
+     */
+
+    externalprefix = cwmpg_;
+    externalstem = cwmpg;
+    majorversion = 1;
+    minorversion = 2;
+    filestem = cwmpg;           //# specifies the filestem for sc-generated files
+    metaclass = M_MMMPG;
+    dllname = "CWMM.dll";
+    callstyle = oidl;
+    
+
+    passthru C_h_after =  ""
+    "#include \"mmres.h\""
+    "";
+
+    /*
+     * Internal instance variables
+     *
+     */
+
+    /*
+     * methods overridden 
+     *
+     */
+	wpOpen :override;
+
+#ifdef __PRIVATE__
+
+#endif
+
+  }; // implementation
+#endif /* __SOMIDL__ */
+};
+
+
+
+interface M_MMMPG : M_MMVideo
+{
+
+    /*
+     * New class methods
+     *
+     */
+
+
+#ifdef __SOMIDL__
+  implementation {
+
+
+    /*
+     * Class Modifiers:
+     *
+     */
+
+    externalprefix = cwmpgM_;
+    externalstem = cwmpgM;
+    functionprefix = cwmpgM_;
+    majorversion = 1;
+    minorversion = 2;
+    filestem = cwmpg;           //# specifies the filestem for sc-generated files
+    dllname = "CWMM.dll";
+    callstyle = oidl;
+
+    /*
+     * Internal class variables
+     *
+     */
+
+    /*
+     * methods overridden 
+     *
+     */
+    wpclsQueryTitle         	: override;
+    wpclsQueryInstanceType  	: override;
+    wpclsQueryInstanceFilter    : override;   
+    wpclsQueryIconData          : override;
+    wpclsInitData   	        : override;
+    wpclsQueryDefaultHelp       : override; 
+  };
+
+#endif /* __SOMIDL__ */
+
+};
+
+
Index: /tags/CWMM-0.3.0_GA/classes/idl/idl_video/cwvideo.idl
===================================================================
--- /tags/CWMM-0.3.0_GA/classes/idl/idl_video/cwvideo.idl	(revision 213)
+++ /tags/CWMM-0.3.0_GA/classes/idl/idl_video/cwvideo.idl	(revision 213)
@@ -0,0 +1,144 @@
+/*
+ * (C) Chris Wohlgemuth 2002-2003
+ *
+ */
+/*
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; see the file COPYING.  If not, write to
+ * the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
+ */          
+/*
+ * If you need another license for your project/product (commercial,
+ * noncommercial, whatever) contact me at
+ * 
+ * http://www.os2world.com/cdwriting
+ * http://www.geocities.com/SiliconValley/Sector/5785/
+ *
+ */
+
+/*
+ * CWAudio.idl:
+ */
+
+#include "..\idl_mm\cwmmdataf.idl"
+
+
+/*
+   CLASS: CWVideo  
+*/
+
+interface M_MMVideo; 
+
+interface MMVideo : CWMMDataFile
+{
+
+    /*
+     * New instance methods
+     *
+     */
+
+#ifdef __SOMIDL__
+  implementation {
+
+    /*
+     * Class Modifiers:
+     *
+     */
+
+    externalprefix = cwvideo_;
+    externalstem = cwvideo;
+    majorversion = 1;
+    minorversion = 2;
+    filestem = cwvideo;           //# specifies the filestem for sc-generated files
+    metaclass = M_MMVideo;
+    dllname = "CWMM.dll";
+    callstyle = oidl;
+    
+
+    passthru C_h_after =  ""
+    "#include \"mmres.h\""
+    "";
+
+    /*
+     * Internal instance variables
+     *
+     */
+
+    /*
+     * methods overridden 
+     *
+     */
+
+    wpModifyPopupMenu       : override;
+    wpMenuItemSelected      : override;
+    wpOpen                  : override;
+#ifdef __PRIVATE__
+
+#endif
+
+  }; // implementation
+#endif /* __SOMIDL__ */
+};
+
+
+
+interface M_MMVideo : M_CWMMDataFile
+{
+
+    /*
+     * New class methods
+     *
+     */
+
+
+#ifdef __SOMIDL__
+  implementation {
+
+
+    /*
+     * Class Modifiers:
+     *
+     */
+
+    externalprefix = cwvideoM_;
+    externalstem = cwvideoM;
+    functionprefix = cwvideoM_;
+    majorversion = 1;
+    minorversion = 2;
+    filestem = cwvideo;           //# specifies the filestem for sc-generated files
+    dllname = "CWMM.dll";
+    callstyle = oidl;
+
+    /*
+     * Internal class variables
+     *
+     */
+
+    /*
+     * methods overridden 
+     *
+     */
+    wpclsCreateDefaultTemplates : override;
+    wpclsQueryInstanceType  	: override;
+    wpclsQueryInstanceFilter    : override;
+    wpclsQueryTitle         	: override;
+    wpclsInitData   	        : override;   
+    wpclsQueryDefaultView       : override;   
+    wpclsQueryIconData          : override;
+  };
+
+#endif /* __SOMIDL__ */
+
+};
+
+
Index: /tags/CWMM-0.3.0_GA/classes/idl/standardnames/cw_im.idl
===================================================================
--- /tags/CWMM-0.3.0_GA/classes/idl/standardnames/cw_im.idl	(revision 213)
+++ /tags/CWMM-0.3.0_GA/classes/idl/standardnames/cw_im.idl	(revision 213)
@@ -0,0 +1,113 @@
+
+/*
+ * CWgif.idl:
+ */
+
+#include <cwimage.idl>
+
+/*
+   CLASS: 
+*/
+
+interface M_CWMMotion; 
+
+interface CWMMotion : CWImage
+{
+
+    /*
+     * New instance methods
+     *
+     */
+
+
+#ifdef __SOMIDL__
+  implementation {
+
+    /*
+     * Class Modifiers:
+     *
+     */
+
+    externalprefix = cwmmotion_;
+    externalstem = cwmmotion;
+    majorversion = 1;
+    minorversion = 1;
+    filestem = cwmmotion;           //# specifies the filestem for sc-generated files
+    metaclass = M_CWMMotion;
+    dllname = "cwimage.dll";
+    callstyle = oidl;
+
+
+    /*
+     * Internal instance variables
+     *
+     */
+
+
+    /*
+     * methods overridden 
+     *
+     */
+
+#ifdef __PRIVATE__
+
+#endif
+
+  }; // implementation
+#endif /* __SOMIDL__ */
+};
+
+
+interface M_CWMMotion : M_CWImage
+{
+
+    /*
+     * New class methods
+     *
+     */
+
+
+#ifdef __SOMIDL__
+  implementation {
+
+
+    /*
+     * Class Modifiers:
+     *
+     */
+
+    externalprefix = cwmmotionM_;
+    externalstem = cwmmotionM;
+    functionprefix = cwmmotionM_;
+    majorversion = 1;
+    minorversion = 1;
+    filestem = cwmmotion;           //# specifies the filestem for sc-generated files
+    dllname = "cwimage.dll";
+    callstyle = oidl;
+
+    /*
+     * Internal class variables
+     *
+     */
+
+    /*
+     * methods overridden 
+     *
+     */
+    wpclsQueryInstanceType  	: override;
+    wpclsQueryInstanceFilter    : override;   
+
+    wpclsQueryDefaultHelp       : override; 
+    wpclsQueryStyle   	        : override;   
+    wpclsQueryTitle   	        : override;   
+    wpclsQueryIconData          : override;
+  };
+
+#endif /* __SOMIDL__ */
+
+};
+
+
+
+
+
Index: /tags/CWMM-0.3.0_GA/classes/idl/standardnames/cwavc.idl
===================================================================
--- /tags/CWMM-0.3.0_GA/classes/idl/standardnames/cwavc.idl	(revision 213)
+++ /tags/CWMM-0.3.0_GA/classes/idl/standardnames/cwavc.idl	(revision 213)
@@ -0,0 +1,113 @@
+
+/*
+ * CWavc.idl:
+ */
+
+#include <cwimage.idl>
+
+/*
+   CLASS: 
+*/
+
+interface M_MMAVC; 
+
+interface MMAVC : CWImage
+{
+
+    /*
+     * New instance methods
+     *
+     */
+
+
+#ifdef __SOMIDL__
+  implementation {
+
+    /*
+     * Class Modifiers:
+     *
+     */
+
+    externalprefix = cwavc_;
+    externalstem = cwavc;
+    majorversion = 1;
+    minorversion = 1;
+    filestem = cwavc;           //# specifies the filestem for sc-generated files
+    metaclass = M_MMAVC;
+    dllname = "cwimage.dll";
+    callstyle = oidl;
+
+
+    /*
+     * Internal instance variables
+     *
+     */
+
+
+    /*
+     * methods overridden 
+     *
+     */
+
+#ifdef __PRIVATE__
+
+#endif
+
+  }; // implementation
+#endif /* __SOMIDL__ */
+};
+
+
+interface M_MMAVC : M_CWImage
+{
+
+    /*
+     * New class methods
+     *
+     */
+
+
+#ifdef __SOMIDL__
+  implementation {
+
+
+    /*
+     * Class Modifiers:
+     *
+     */
+
+    externalprefix = cwavcM_;
+    externalstem = cwavcM;
+    functionprefix = cwavcM_;
+    majorversion = 1;
+    minorversion = 1;
+    filestem = cwavc;           //# specifies the filestem for sc-generated files
+    dllname = "cwimage.dll";
+    callstyle = oidl;
+
+    /*
+     * Internal class variables
+     *
+     */
+
+    /*
+     * methods overridden 
+     *
+     */
+    wpclsQueryInstanceType  	: override;
+    wpclsQueryInstanceFilter    : override;   
+
+    wpclsQueryDefaultHelp       : override; 
+    wpclsQueryStyle   	        : override;   
+    wpclsQueryTitle   	        : override;   
+    wpclsQueryIconData          : override;
+  };
+
+#endif /* __SOMIDL__ */
+
+};
+
+
+
+
+
Index: /tags/CWMM-0.3.0_GA/classes/idl/standardnames/cwdib.idl
===================================================================
--- /tags/CWMM-0.3.0_GA/classes/idl/standardnames/cwdib.idl	(revision 213)
+++ /tags/CWMM-0.3.0_GA/classes/idl/standardnames/cwdib.idl	(revision 213)
@@ -0,0 +1,113 @@
+
+/*
+ * MMgif.idl:
+ */
+
+#include <cwimage.idl>
+
+/*
+   CLASS: 
+*/
+
+interface M_MMDIB; 
+
+interface MMDIB : CWImage
+{
+
+    /*
+     * New instance methods
+     *
+     */
+
+
+#ifdef __SOMIDL__
+  implementation {
+
+    /*
+     * Class Modifiers:
+     *
+     */
+
+    externalprefix = cwdib_;
+    externalstem = cwdib;
+    majorversion = 1;
+    minorversion = 1;
+    filestem = cwdib;           //# specifies the filestem for sc-generated files
+    metaclass = M_MMDIB;
+    dllname = "cwimage.dll";
+    callstyle = oidl;
+
+
+    /*
+     * Internal instance variables
+     *
+     */
+
+
+    /*
+     * methods overridden 
+     *
+     */
+
+#ifdef __PRIVATE__
+
+#endif
+
+  }; // implementation
+#endif /* __SOMIDL__ */
+};
+
+
+interface M_MMDIB : M_CWImage
+{
+
+    /*
+     * New class methods
+     *
+     */
+
+
+#ifdef __SOMIDL__
+  implementation {
+
+
+    /*
+     * Class Modifiers:
+     *
+     */
+
+    externalprefix = cwdibM_;
+    externalstem = cwdibM;
+    functionprefix = cwdibM_;
+    majorversion = 1;
+    minorversion = 1;
+    filestem = cwdib;           //# specifies the filestem for sc-generated files
+    dllname = "cwimage.dll";
+    callstyle = oidl;
+
+    /*
+     * Internal class variables
+     *
+     */
+
+    /*
+     * methods overridden 
+     *
+     */
+    wpclsQueryInstanceType  	: override;
+    wpclsQueryInstanceFilter    : override;   
+
+    wpclsQueryDefaultHelp       : override; 
+    wpclsQueryStyle   	        : override;   
+    wpclsQueryTitle   	        : override;   
+    wpclsQueryIconData          : override;
+  };
+
+#endif /* __SOMIDL__ */
+
+};
+
+
+
+
+
Index: /tags/CWMM-0.3.0_GA/classes/idl/standardnames/cwgif.idl
===================================================================
--- /tags/CWMM-0.3.0_GA/classes/idl/standardnames/cwgif.idl	(revision 213)
+++ /tags/CWMM-0.3.0_GA/classes/idl/standardnames/cwgif.idl	(revision 213)
@@ -0,0 +1,113 @@
+
+/*
+ * MMgif.idl:
+ */
+
+#include <cwimage.idl>
+
+/*
+   CLASS: 
+*/
+
+interface M_MMGIF; 
+
+interface MMGIF : CWImage
+{
+
+    /*
+     * New instance methods
+     *
+     */
+
+
+#ifdef __SOMIDL__
+  implementation {
+
+    /*
+     * Class Modifiers:
+     *
+     */
+
+    externalprefix = cwgif_;
+    externalstem = cwgif;
+    majorversion = 1;
+    minorversion = 1;
+    filestem = cwgif;           //# specifies the filestem for sc-generated files
+    metaclass = M_MMGIF;
+    dllname = "cwimage.dll";
+    callstyle = oidl;
+
+
+    /*
+     * Internal instance variables
+     *
+     */
+
+
+    /*
+     * methods overridden 
+     *
+     */
+
+#ifdef __PRIVATE__
+
+#endif
+
+  }; // implementation
+#endif /* __SOMIDL__ */
+};
+
+
+interface M_MMGIF : M_CWImage
+{
+
+    /*
+     * New class methods
+     *
+     */
+
+
+#ifdef __SOMIDL__
+  implementation {
+
+
+    /*
+     * Class Modifiers:
+     *
+     */
+
+    externalprefix = cwgifM_;
+    externalstem = cwgifM;
+    functionprefix = cwgifM_;
+    majorversion = 1;
+    minorversion = 1;
+    filestem = cwgif;           //# specifies the filestem for sc-generated files
+    dllname = "cwimage.dll";
+    callstyle = oidl;
+
+    /*
+     * Internal class variables
+     *
+     */
+
+    /*
+     * methods overridden 
+     *
+     */
+    wpclsQueryInstanceType  	: override;
+    wpclsQueryInstanceFilter    : override;   
+
+    wpclsQueryDefaultHelp       : override; 
+    wpclsQueryStyle   	        : override;   
+    wpclsQueryTitle   	        : override;   
+    wpclsQueryIconData          : override;
+  };
+
+#endif /* __SOMIDL__ */
+
+};
+
+
+
+
+
Index: /tags/CWMM-0.3.0_GA/classes/idl/standardnames/cwimage.idl
===================================================================
--- /tags/CWMM-0.3.0_GA/classes/idl/standardnames/cwimage.idl	(revision 213)
+++ /tags/CWMM-0.3.0_GA/classes/idl/standardnames/cwimage.idl	(revision 213)
@@ -0,0 +1,99 @@
+
+//  Module Header
+//
+//  Module Name: CWImage
+//
+//  OS/2 Presentation Manager Workplace class definitions
+//
+//
+
+#ifndef cwimage_idl
+#define cwimage_idl
+
+#include <wpimage.idl>
+#include <somcls.idl>
+
+
+interface M_CWImage;
+
+interface CWImage : WPImageFile                                                
+
+{
+    /*
+     * New instance methods
+     *
+     */
+
+
+#ifdef __SOMIDL__
+  implementation {
+
+    releaseorder:     wpQueryBitmapHandle, wpQueryBitmapInfoHeader,
+    wpQueryBitmapData, wpSetBitmapData, wpReadImageFile, wpWriteImageFile;
+
+    externalstem = cwimage;
+    local;
+    externalprefix = cwimg_;
+    majorversion = 1;
+    minorversion = 2;
+    filestem = cwimage;
+    metaclass = M_CWImage;
+    callstyle = oidl;
+    dllname = "cwimage.dll";               
+
+    passthru C_h_after =  ""
+    "#include \"cwimageres.h\""
+    "";
+
+    /*
+     * Internal instance variables
+     *
+     */
+
+    HBITMAP hBitmap;
+    PBYTE   pBmpInfoHeader2;
+
+    wpQueryBitmapHandle : override;            
+    wpQueryBitmapInfoHeader    : override;            
+    wpQueryBitmapData: override;            
+    wpSetBitmapData: override;            
+    wpReadImageFile: override;            
+    wpWriteImageFile: override;
+    wpUnInitData:   override;
+    wpModifyPopupMenu       : override;
+    wpMenuItemSelected      : override;
+    wpOpen                  : override;
+
+  };
+#endif /* __SOMIDL__ */
+};
+
+interface M_CWImage : M_WPImageFile                                            
+{
+
+#ifdef __SOMIDL__
+  implementation {
+
+    externalstem = cwimage;
+    local;
+    externalprefix = cwimgM_;
+    majorversion = 1;
+    minorversion = 2;
+    filestem = cwimage;
+    callstyle = oidl;
+    dllname = "cwimage.dll";               
+
+    wpclsQueryInstanceType: override;
+    wpclsQueryInstanceFilter: override;   
+    wpclsInitData   : override;
+    wpclsQueryDefaultView : override;
+/*    wpclsQueryStyle: override; */
+    wpclsQueryTitle: override;
+    wpclsQueryIconData: override;
+/*    wpclsQueryDefaultHelp: override;*/
+
+  };
+#endif /* __SOMIDL__ */
+};
+
+#endif  /* cwimage_idl */
Index: /tags/CWMM-0.3.0_GA/classes/idl/standardnames/cwjpg.idl
===================================================================
--- /tags/CWMM-0.3.0_GA/classes/idl/standardnames/cwjpg.idl	(revision 213)
+++ /tags/CWMM-0.3.0_GA/classes/idl/standardnames/cwjpg.idl	(revision 213)
@@ -0,0 +1,113 @@
+
+/*
+ * MMgif.idl:
+ */
+
+#include <cwimage.idl>
+
+/*
+   CLASS: 
+*/
+
+interface M_MMJPG; 
+
+interface MMJPG : CWImage
+{
+
+    /*
+     * New instance methods
+     *
+     */
+
+
+#ifdef __SOMIDL__
+  implementation {
+
+    /*
+     * Class Modifiers:
+     *
+     */
+
+    externalprefix = cwjpg_;
+    externalstem = cwjpg;
+    majorversion = 1;
+    minorversion = 1;
+    filestem = cwjpg;           //# specifies the filestem for sc-generated files
+    metaclass = M_MMJPG;
+    dllname = "cwimage.dll";
+    callstyle = oidl;
+
+
+    /*
+     * Internal instance variables
+     *
+     */
+
+
+    /*
+     * methods overridden 
+     *
+     */
+
+#ifdef __PRIVATE__
+
+#endif
+
+  }; // implementation
+#endif /* __SOMIDL__ */
+};
+
+
+interface M_MMJPG : M_CWImage
+{
+
+    /*
+     * New class methods
+     *
+     */
+
+
+#ifdef __SOMIDL__
+  implementation {
+
+
+    /*
+     * Class Modifiers:
+     *
+     */
+
+    externalprefix = cwjpgM_;
+    externalstem = cwjpgM;
+    functionprefix = cwjpgM_;
+    majorversion = 1;
+    minorversion = 1;
+    filestem = cwjpg;           //# specifies the filestem for sc-generated files
+    dllname = "cwimage.dll";
+    callstyle = oidl;
+
+    /*
+     * Internal class variables
+     *
+     */
+
+    /*
+     * methods overridden 
+     *
+     */
+    wpclsQueryInstanceType  	: override;
+    wpclsQueryInstanceFilter    : override;   
+
+    wpclsQueryDefaultHelp       : override; 
+    wpclsQueryStyle   	        : override;   
+    wpclsQueryTitle   	        : override;   
+    wpclsQueryIconData          : override;
+  };
+
+#endif /* __SOMIDL__ */
+
+};
+
+
+
+
+
Index: /tags/CWMM-0.3.0_GA/classes/idl/standardnames/cwpcd.idl
===================================================================
--- /tags/CWMM-0.3.0_GA/classes/idl/standardnames/cwpcd.idl	(revision 213)
+++ /tags/CWMM-0.3.0_GA/classes/idl/standardnames/cwpcd.idl	(revision 213)
@@ -0,0 +1,113 @@
+
+/*
+ * gif.idl:
+ */
+
+#include <cwimage.idl>
+
+/*
+   CLASS: 
+*/
+
+interface M_MMPhotoCD; 
+
+interface MMPhotoCD : CWImage
+{
+
+    /*
+     * New instance methods
+     *
+     */
+
+
+#ifdef __SOMIDL__
+  implementation {
+
+    /*
+     * Class Modifiers:
+     *
+     */
+
+    externalprefix = cwpcd_;
+    externalstem = cwpcd;
+    majorversion = 1;
+    minorversion = 1;
+    filestem = cwpcd;           //# specifies the filestem for sc-generated files
+    metaclass = M_MMPhotoCD;
+    dllname = "cwimage.dll";
+    callstyle = oidl;
+
+
+    /*
+     * Internal instance variables
+     *
+     */
+
+
+    /*
+     * methods overridden 
+     *
+     */
+
+#ifdef __PRIVATE__
+
+#endif
+
+  }; // implementation
+#endif /* __SOMIDL__ */
+};
+
+
+interface M_MMPhotoCD : M_CWImage
+{
+
+    /*
+     * New class methods
+     *
+     */
+
+
+#ifdef __SOMIDL__
+  implementation {
+
+
+    /*
+     * Class Modifiers:
+     *
+     */
+
+    externalprefix = cwpcdM_;
+    externalstem = cwpcdM;
+    functionprefix = cwpcdM_;
+    majorversion = 1;
+    minorversion = 1;
+    filestem = cwpcd;           //# specifies the filestem for sc-generated files
+    dllname = "cwimage.dll";
+    callstyle = oidl;
+
+    /*
+     * Internal class variables
+     *
+     */
+
+    /*
+     * methods overridden 
+     *
+     */
+    wpclsQueryInstanceType  	: override;
+    wpclsQueryInstanceFilter    : override;   
+
+    wpclsQueryDefaultHelp       : override; 
+    wpclsQueryStyle   	        : override;   
+    wpclsQueryTitle   	        : override;   
+    wpclsQueryIconData          : override;
+  };
+
+#endif /* __SOMIDL__ */
+
+};
+
+
+
+
+
Index: /tags/CWMM-0.3.0_GA/classes/idl/standardnames/cwpcx.idl
===================================================================
--- /tags/CWMM-0.3.0_GA/classes/idl/standardnames/cwpcx.idl	(revision 213)
+++ /tags/CWMM-0.3.0_GA/classes/idl/standardnames/cwpcx.idl	(revision 213)
@@ -0,0 +1,113 @@
+
+/*
+ * MMgif.idl:
+ */
+
+#include <cwimage.idl>
+
+/*
+   CLASS: 
+*/
+
+interface M_MMPCX; 
+
+interface MMPCX : CWImage
+{
+
+    /*
+     * New instance methods
+     *
+     */
+
+
+#ifdef __SOMIDL__
+  implementation {
+
+    /*
+     * Class Modifiers:
+     *
+     */
+
+    externalprefix = cwpcx_;
+    externalstem = cwpcx;
+    majorversion = 1;
+    minorversion = 1;
+    filestem = cwpcx;           //# specifies the filestem for sc-generated files
+    metaclass = M_MMPCX;
+    dllname = "cwimage.dll";
+    callstyle = oidl;
+
+
+    /*
+     * Internal instance variables
+     *
+     */
+
+
+    /*
+     * methods overridden 
+     *
+     */
+
+#ifdef __PRIVATE__
+
+#endif
+
+  }; // implementation
+#endif /* __SOMIDL__ */
+};
+
+
+interface M_MMPCX : M_CWImage
+{
+
+    /*
+     * New class methods
+     *
+     */
+
+
+#ifdef __SOMIDL__
+  implementation {
+
+
+    /*
+     * Class Modifiers:
+     *
+     */
+
+    externalprefix = cwpcxM_;
+    externalstem = cwpcxM;
+    functionprefix = cwpcxM_;
+    majorversion = 1;
+    minorversion = 1;
+    filestem = cwpcx;           //# specifies the filestem for sc-generated files
+    dllname = "cwimage.dll";
+    callstyle = oidl;
+
+    /*
+     * Internal class variables
+     *
+     */
+
+    /*
+     * methods overridden 
+     *
+     */
+    wpclsQueryInstanceType  	: override;
+    wpclsQueryInstanceFilter    : override;   
+
+    wpclsQueryDefaultHelp       : override; 
+    wpclsQueryStyle   	        : override;   
+    wpclsQueryTitle   	        : override;   
+    wpclsQueryIconData          : override;
+  };
+
+#endif /* __SOMIDL__ */
+
+};
+
+
+
+
+
Index: /tags/CWMM-0.3.0_GA/classes/idl/standardnames/cwtga.idl
===================================================================
--- /tags/CWMM-0.3.0_GA/classes/idl/standardnames/cwtga.idl	(revision 213)
+++ /tags/CWMM-0.3.0_GA/classes/idl/standardnames/cwtga.idl	(revision 213)
@@ -0,0 +1,113 @@
+
+/*
+ * MMgif.idl:
+ */
+
+#include <cwimage.idl>
+
+/*
+   CLASS: 
+*/
+
+interface M_MMTarga; 
+
+interface MMTarga : CWImage
+{
+
+    /*
+     * New instance methods
+     *
+     */
+
+
+#ifdef __SOMIDL__
+  implementation {
+
+    /*
+     * Class Modifiers:
+     *
+     */
+
+    externalprefix = cwtga_;
+    externalstem = cwtga;
+    majorversion = 1;
+    minorversion = 1;
+    filestem = cwtga;           //# specifies the filestem for sc-generated files
+    metaclass = M_MMTarga;
+    dllname = "cwimage.dll";
+    callstyle = oidl;
+
+
+    /*
+     * Internal instance variables
+     *
+     */
+
+
+    /*
+     * methods overridden 
+     *
+     */
+
+#ifdef __PRIVATE__
+
+#endif
+
+  }; // implementation
+#endif /* __SOMIDL__ */
+};
+
+
+interface M_MMTarga : M_CWImage
+{
+
+    /*
+     * New class methods
+     *
+     */
+
+
+#ifdef __SOMIDL__
+  implementation {
+
+
+    /*
+     * Class Modifiers:
+     *
+     */
+
+    externalprefix = cwtgaM_;
+    externalstem = cwtgaM;
+    functionprefix = cwtgaM_;
+    majorversion = 1;
+    minorversion = 1;
+    filestem = cwtga;           //# specifies the filestem for sc-generated files
+    dllname = "cwimage.dll";
+    callstyle = oidl;
+
+    /*
+     * Internal class variables
+     *
+     */
+
+    /*
+     * methods overridden 
+     *
+     */
+    wpclsQueryInstanceType  	: override;
+    wpclsQueryInstanceFilter    : override;   
+
+    wpclsQueryDefaultHelp       : override; 
+    wpclsQueryStyle   	        : override;   
+    wpclsQueryTitle   	        : override;   
+    wpclsQueryIconData          : override;
+  };
+
+#endif /* __SOMIDL__ */
+
+};
+
+
+
+
+
Index: /tags/CWMM-0.3.0_GA/classes/idl/standardnames/cwtif.idl
===================================================================
--- /tags/CWMM-0.3.0_GA/classes/idl/standardnames/cwtif.idl	(revision 213)
+++ /tags/CWMM-0.3.0_GA/classes/idl/standardnames/cwtif.idl	(revision 213)
@@ -0,0 +1,113 @@
+
+/*
+ * MMgif.idl:
+ */
+
+#include <cwimage.idl>
+
+/*
+   CLASS: 
+*/
+
+interface M_MMTIFF; 
+
+interface MMTIFF : CWImage
+{
+
+    /*
+     * New instance methods
+     *
+     */
+
+
+#ifdef __SOMIDL__
+  implementation {
+
+    /*
+     * Class Modifiers:
+     *
+     */
+
+    externalprefix = cwtiff_;
+    externalstem = cwtiff;
+    majorversion = 1;
+    minorversion = 1;
+    filestem = cwtiff;           //# specifies the filestem for sc-generated files
+    metaclass = M_MMTIFF;
+    dllname = "cwimage.dll";
+    callstyle = oidl;
+
+
+    /*
+     * Internal instance variables
+     *
+     */
+
+
+    /*
+     * methods overridden 
+     *
+     */
+
+#ifdef __PRIVATE__
+
+#endif
+
+  }; // implementation
+#endif /* __SOMIDL__ */
+};
+
+
+interface M_MMTIFF : M_CWImage
+{
+
+    /*
+     * New class methods
+     *
+     */
+
+
+#ifdef __SOMIDL__
+  implementation {
+
+
+    /*
+     * Class Modifiers:
+     *
+     */
+
+    externalprefix = cwtiffM_;
+    externalstem = cwtiffM;
+    functionprefix = cwtiffM_;
+    majorversion = 1;
+    minorversion = 1;
+    filestem = cwtiff;           //# specifies the filestem for sc-generated files
+    dllname = "cwimage.dll";
+    callstyle = oidl;
+
+    /*
+     * Internal class variables
+     *
+     */
+
+    /*
+     * methods overridden 
+     *
+     */
+    wpclsQueryInstanceType  	: override;
+    wpclsQueryInstanceFilter    : override;   
+
+    wpclsQueryDefaultHelp       : override; 
+    wpclsQueryStyle   	        : override;   
+    wpclsQueryTitle   	        : override;   
+    wpclsQueryIconData          : override;
+  };
+
+#endif /* __SOMIDL__ */
+
+};
+
+
+
+
+
Index: /tags/CWMM-0.3.0_GA/classes/idl/standardnames/wpimage.idl
===================================================================
--- /tags/CWMM-0.3.0_GA/classes/idl/standardnames/wpimage.idl	(revision 213)
+++ /tags/CWMM-0.3.0_GA/classes/idl/standardnames/wpimage.idl	(revision 213)
@@ -0,0 +1,91 @@
+
+//  Module Header
+//
+//  Module Name: WPIMAGEFILE
+//
+//  OS/2 Presentation Manager Workplace class definitions
+//
+//
+
+#ifndef wpimagefile_idl
+#define wpimagefile_idl
+
+#include <wpdataf.idl>
+#include <somcls.idl>
+
+typedef LHANDLE   HPAL;        /* hpal */
+typedef HPAL *PHPAL;
+
+interface M_WPImageFile;
+
+interface WPImageFile : WPDataFile                                                
+
+{
+    /*
+     * New instance methods
+     *
+     */
+
+    BOOL wpQueryBitmapHandle(inout HBITMAP phBitmap, inout HPAL phPalette, 
+    in ULONG ulWidth, in ULONG ulHeight, in ULONG ulFlags, in LONG lBackgroundColor,
+    inout BOOL pbQuitEarly);
+    PBYTE wpQueryBitmapInfoHeader();
+    PBYTE wpQueryBitmapData(inout ULONG pulSize);
+    BOOL wpSetBitmapData(in PBYTE pBitmapData, in ULONG ulSize);
+    BOOL wpReadImageFile();
+    BOOL wpWriteImageFile();
+
+#ifdef __SOMIDL__
+  implementation {
+
+    releaseorder:     wpQueryBitmapHandle, wpQueryBitmapInfoHeader,
+    wpQueryBitmapData, wpSetBitmapData, wpReadImageFile, wpWriteImageFile;
+
+    externalstem = wpimagefile;
+    local;
+    externalprefix = wpimg_;
+    majorversion = 1;
+    minorversion = 2;
+    filestem = wpimage;
+    metaclass = M_WPImageFile;
+    callstyle = oidl;
+    dllname = "pmwp.dll";               
+
+
+
+/*    
+Warp4:
+wpSetContentsFromHandle 	
+  wpQueryHandleFromContents
+
+*/
+    wpUnInitData: override;            
+  };
+#endif /* __SOMIDL__ */
+};
+
+interface M_WPImageFile : M_WPDataFile                                            
+{
+
+#ifdef __SOMIDL__
+  implementation {
+
+    externalstem = wpimagefile;
+    local;
+    externalprefix = wpimgM_;
+    majorversion = 1;
+    minorversion = 2;
+    filestem = wpimage;
+    callstyle = oidl;
+    dllname = "pmwp.dll";               
+
+    wpclsQueryInstanceType: override;
+    wpclsQueryStyle: override;
+    wpclsQueryTitle: override;
+    wpclsQueryDefaultHelp: override;
+
+  };
+#endif /* __SOMIDL__ */
+};
+
+#endif  /* wpimagefile_idl */
Index: /tags/CWMM-0.3.0_GA/classes/inc/common.h
===================================================================
--- /tags/CWMM-0.3.0_GA/classes/inc/common.h	(revision 213)
+++ /tags/CWMM-0.3.0_GA/classes/inc/common.h	(revision 213)
@@ -0,0 +1,70 @@
+/*
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; see the file COPYING.  If not, write to
+ * the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
+ */          
+/*
+ * If you need another license for your project/product (commercial,
+ * noncommercial, whatever) contact me at
+ * 
+ * http://www.os2world.com/cdwriting
+ * http://www.geocities.com/SiliconValley/Sector/5785/
+ *
+ */
+
+#ifndef _COMMON_H_INCLUDED
+#define _COMMON_H_INCLUDED
+
+#define FIELDOFFSETUL(type, field)    ((ULONG)&(((type *)0)->field))
+
+/* ID tag defines and defines for info querying */
+#define IDINFO_NAME              1
+#define IDINFO_ARTIST            2
+#define IDINFO_ALBUM             3
+#define IDINFO_YEAR              4
+#define IDINFO_COMMENT           5
+#define IDINFO_GENRE             6
+
+#define IDINFO_PLAYTIME          7
+#define IDINFO_BPS               8
+#define IDINFO_SAMPLERATE        9
+#define IDINFO_CHANNELS          10
+#define IDINFO_BITRATE           11 /* New with 0.2.7 */
+
+#define IDINFO_LASTINFO          11
+
+#define IDINFO_WIDTH             1
+#define IDINFO_HEIGHT            2
+#define IDINFO_BPP               3
+#define IDINFO_FORMAT            4
+
+
+#define MRFALSE (MRESULT) FALSE
+#define MRTRUE (MRESULT) TRUE
+
+/* Fonts to use in dialogs */
+#define DEFAULT_DIALOG_FONT   "9.WarpSans"
+#define DEFAULT_DIALOG_FONT_WARP3   "8.Helv"
+
+/* Retore keys from Warp 4 */
+#ifndef IDKEY_FDRGRIDINFO
+#define IDKEY_FDRGRIDINFO 2938
+#endif
+
+#ifndef IDKEY_FDRLONGARRAY
+#define IDKEY_FDRLONGARRAY       2931
+#endif
+
+#define MMCLS_INI_FILE_NAME     "\\cwmm.ini"
+
+#endif
Index: /tags/CWMM-0.3.0_GA/classes/inc/cwaudioinc.h
===================================================================
--- /tags/CWMM-0.3.0_GA/classes/inc/cwaudioinc.h	(revision 213)
+++ /tags/CWMM-0.3.0_GA/classes/inc/cwaudioinc.h	(revision 213)
@@ -0,0 +1,257 @@
+/*
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; see the file COPYING.  If not, write to
+ * the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
+ */          
+/*
+ * If you need another license for your project/product (commercial,
+ * noncommercial, whatever) contact me at
+ * 
+ * http://www.os2world.com/cdwriting
+ * http://www.geocities.com/SiliconValley/Sector/5785/
+ *
+ */
+
+#ifndef _CWAUDIOINC_H_INCLUDED
+#define _CWAUDIOINC_H_INCLUDED
+
+#include "common.h"
+
+/* Target folder for MM class templates */
+#define MMTEMPLATE_FOLDER_ID      "<MMPM2_MMTEMPLATEFOLDER>"
+
+/* Default class titles if name can't be loaded from res dll */
+#define CLSTITLE_DIGITALAUDIO    "Digital Audio"
+#define CLSTITLE_MP3             "MP3Audio.MP3"
+#define CLSTITLE_WAV             "WAVAudio.WAV"
+#define CLSTITLE_OGG             "OGGAudio.OGG"
+#define CLSTITLE_AIF             "AIFAudio.AIF"
+#define CLSTITLE_AU              "AUAudio.AU"
+#define CLSTITLE_IFF             "IFFAudio.IFF"
+#define CLSTITLE_MIDI            "MIDI.MID"
+#define CLSTITLE_SNDF            "SNDAudio.SND"
+#define CLSTITLE_VOC             "VOCAudio.VOC"
+#define CLSTITLE__AU             "_AUAudio._AU"
+#define CLSTITLE_AUDIOSTREAM     "Audio-Stream"
+#define CLSTITLE_CDTRACK         "CD-Track"
+#define CLSTITLE_M3U             "M3U-Playlist"
+#define CLSTITLE_FLAC            "FLACAudio.FLA"
+
+/* TYPES returned by the classes */
+#define TYPE_DIGITALAUDIO    "Digital Audio"
+#define TYPE_MP3             "MP3"
+#define TYPE_OGG             "OGGS"
+#define TYPE_WAV             "WAV"
+#define TYPE_AIF             "AIF"
+#define TYPE_AU              "AU"
+#define TYPE_IFF             "IFF"
+#define TYPE_MIDI            "MIDI"
+#define TYPE_SNDF            "SND"
+#define TYPE_VOC             "VOC"
+#define TYPE__AU             "_AU"
+#define TYPE_AUDIOSTREAM     "Audio-Stream"
+#define TYPE_CDTRACK         "CD-Track"
+#define TYPE_M3U             "M3U"
+#define TYPE_FLAC            "FLAC"
+#define TYPE_DIGITALVIDEO    "Digital Video"
+
+/* Setup strings for MMAudio (was CWAudio). These strings will
+   be removed in the future. Use the MM* instead */
+#define SETUP_AUDIOTRACKNAME    "CWAUDIOTRACKNAME"
+#define SETUP_AUDIOARTIST       "CWAUDIOARTIST"
+#define SETUP_AUDIOALBUM        "CWAUDIOALBUM"
+#define SETUP_AUDIOCOMMENT      "CWAUDIOCOMMENT"
+#define SETUP_AUDIOYEAR         "CWAUDIOYEAR"
+#define SETUP_AUDIOGENRE        "CWAUDIOGENRE"
+#define SETUP_AUDIOPLAYTIME     "CWAUDIOPLAYTIME"
+#define SETUP_REFRESH           "CWAUDIOREFRESH"
+#define SETUP_COPYTAGTO         "CWAUDIOCOPYTAGTO"
+
+#define SETUP_MMAUDIOTRACKNAME    "MMAUDIOTRACKNAME"
+#define SETUP_MMAUDIOARTIST       "MMAUDIOARTIST"
+#define SETUP_MMAUDIOALBUM        "MMAUDIOALBUM"
+#define SETUP_MMAUDIOCOMMENT      "MMAUDIOCOMMENT"
+#define SETUP_MMAUDIOYEAR         "MMAUDIOYEAR"
+#define SETUP_MMAUDIOGENRE        "MMAUDIOGENRE"
+#define SETUP_MMAUDIOPLAYTIME     "MMAUDIOPLAYTIME"
+#define SETUP_MMREFRESH           "MMREFRESH"
+#define SETUP_MMCOPYTAGTO         "MMAUDIOCOPYTAGTO"
+/* For setting volume during playing */
+#define SETUP_MMAUDIOVOLUME         "MMAUDIOVOLUME"
+/* Lighttable */
+#define SETUP_MMTHUMBSIZE         "MMTHUMBSIZE"
+
+/* Restore keys for audio info from instance data */
+#define  KEY_TIME         4001
+#define  KEY_CHANNELS     4002
+#define  KEY_SAMPLERATE   4003
+#define  KEY_BPS          4004
+#define  KEY_FILESIZE     4005 /* also used for image files */
+/* #define  KEY_TRACKNAME    4006
+   #define  KEY_ARTIST       4007
+   #define  KEY_ALBUM        4008
+   #define  KEY_COMMENT      4009
+   #define  KEY_YEAR         4010
+   #define  KEY_GENRE        4011 */
+#define  KEY_TIME_MS      4012
+#define  KEY_NUM_AUDIO_BYTES  4013
+
+#define TRACKNAME_SETTINGS_PANEL 12
+
+/* Restore keys for image info from instance data */
+#define  KEY_WIDTH         4001
+#define  KEY_HEIGHT        4002
+#define  KEY_DEPTH         4003
+
+
+/* The max length of any new column title */
+#define SIZE_TITLE       30
+#define NUM_AUDIO_FIELDS 11 /* Num of additional details columns */
+
+typedef struct _AUDIODETAILS
+{
+  PSZ pszPlayTime;
+  PSZ pszBitRate;     /* New with 0.2.7 */
+  PSZ pszSampleRate;
+  PSZ pszChannels;
+  PSZ pszBPS;
+  PSZ pszName;
+  PSZ pszArtist;
+  PSZ pszAlbum;
+  PSZ pszYear;
+  PSZ pszComment;
+  PSZ pszGenre;
+}AUDIODETAILS;
+typedef AUDIODETAILS *PAUDIODETAILS;
+
+#define CWAUDIO_VIEW_PLAY ID_MENU_START
+
+/* Parameters for WM_APPTERMINATENOTIFY for controlling playing */
+#define ACKEY_START  1
+#define ACKEY_STOP   2
+#define ACKEY_PAUSE  3
+#define ACKEY_RESUME 4
+#define ACKEY_NEXT   5
+#define ACKEY_VOLUME 6
+
+/* returned by cwmmQueryTrackStatus()*/
+#define TRACK_STATUS_STOPPED 0
+#define TRACK_STATUS_PLAYING 1
+#define TRACK_STATUS_PAUSED  2
+
+
+
+/* MMImage */
+#define NUM_IMAGE_DETAILS_FIELDS 4 /* Num of additional details columns */
+
+char chrWidth[SIZE_TITLE];
+char chrHeight[SIZE_TITLE];
+char chrDepth[SIZE_TITLE];
+char chrFormat[SIZE_TITLE];
+
+typedef struct _IMAGEDETAILS
+{
+  ULONG ulWidth;
+  ULONG ulHeight;
+  ULONG ulDepth;
+  PSZ pszFormat;
+}IMAGEDETAILS;
+typedef IMAGEDETAILS *PIMAGEDETAILS;
+
+
+/* The maximum size of returned small bitmaps for lighttable folder. Used if someone tries to get
+   a wider BMP. */
+#define MAX_SIZE_SMALLBITMAP 250
+
+/* Thread parameters used when requesting a new small bitmap from the create bitmap thread. */
+typedef struct _CREATEBMPINFO
+{
+  WPObject * wpObject;
+  PMINIRECORDCORE pmrcToRefresh; /* Object record in container. Will be refreshed to show image instead of icon. */
+  HWND hwndCnr;                  /* Container containing the object. Will be refreshed to show image instead of icon. */
+  ULONG ulWidth;
+  ULONG ulHeight;
+}CREATEBMPINFO;
+typedef CREATEBMPINFO *PCREATEBMPINFO;
+
+/* Tell create bitmap thread to create a new small bitmap */
+#define ACKEY_CREATE_SMALLBITMAP  0
+/* Tell create bitmap thread to read in the image info so cached image size will be
+   updated. */
+#define ACKEY_QUERY_BITMAPINFO    1
+
+/*
+  Parameter block given to the play thread when audio objects are started using method
+  cwmmPlayTrack().
+  */
+typedef struct _OPENPARAMS
+{
+  WPObject* wpObject; /* Object being started. */
+  HWND hwndCnr;      /* Container from which the object is started. */
+  ULONG ulReserved1;
+  ULONG ulReserved2;
+  ULONG ulReserved3;
+  //PID pid;
+  //  SWCNTRL swCtrl;
+  USEITEM useItem;   /* Tell the WPS the object is in use when playing so inuse emphasis
+                        is drawn. An OPEN_VIEW item is added to the inuse list. The information
+                        is in the following VIEWITEM. These two structures are used together! */
+  VIEWITEM viewItem; /* Used to register the open view with the WPS. */
+}OPENPARAMS;
+
+typedef struct _MMDATAFILEVIEW
+{
+  USEITEM useItem;
+  VIEWITEM viewItem;
+  WPObject* thisPtr;
+  PID pid;
+  SWCNTRL swCtrl;
+  WPObject* wpObject;
+}MMDATAFILEVIEW;
+
+
+#define DEFAULT_AUDIOSTREAM_SERVER "Icecast-Server:port"
+
+/* Ini key for enabling new image class features on CD */
+#define IMAGECLS_FEATURES_ON_CD_KEY    "useNewImgClsFeaturesOnCD"
+/* Ini key to disable extended icon titles for audio files */
+#define MM_NO_EXTENDED_ICONTITLE    "mmClsNoExtendedIconTitles"
+
+/* Help panels */
+#define M3UFILE_HELP_PANEL  40
+
+/* Maximum # of startable audio files at the same time. This
+   prevents that a user starts a whole folder full of audio objects.
+   see CWAudio */
+#define MAX_AUDIOFILE_STARTS 1
+
+/* Default volume for audio file if no entry in INI file. Used only for double click
+   starting. */
+#define DEFVOLUME_AUDIO_FILE  70
+#define CLASS_VOLUME_APP   "classvolume"
+#define CLASS_VOLUME_KEY   "volume"
+
+#define MMVIDEO_GETEXT_RX  "videoext.rx"
+#define MMMPG_GETEXT_RX    "mpegext.rx"
+
+#endif
+
+
+
+
+
+
+
+
+
+
Index: /tags/CWMM-0.3.0_GA/classes/inc/cwmp3inc.h
===================================================================
--- /tags/CWMM-0.3.0_GA/classes/inc/cwmp3inc.h	(revision 213)
+++ /tags/CWMM-0.3.0_GA/classes/inc/cwmp3inc.h	(revision 213)
@@ -0,0 +1,79 @@
+/*
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; see the file COPYING.  If not, write to
+ * the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
+ */          
+/*
+ * If you need another license for your project/product (commercial,
+ * noncommercial, whatever) contact me at
+ * 
+ * http://www.os2world.com/cdwriting
+ * http://www.geocities.com/SiliconValley/Sector/5785/
+ *
+ */
+
+#ifndef _CWMP3INC_H_INCLUDED
+#define _CWMP3INC_H_INCLUDED
+
+#include "common.h"
+
+#define MP3FILE_HELP_PANEL  10
+#define MP3FILE_HELP_LIBRARY  "cwmm.hlp"
+#define MP3FILE_SETTINGS_PANEL 11
+#define MP3FILE_SETTINGS_PANEL_CD 13
+
+/* For getting the bitrate using MMIOMP3 0.4.2 or above */
+#define FOURCC_MP3 mmioFOURCC('M', 'P', '3', ' ')
+#define MP3_COOKIE 0x072D6337
+
+typedef struct _MP3OPTIONS {
+int cookie;
+long bitrate;
+} MP3OPTIONS;
+
+typedef MP3OPTIONS *PMP3OPTIONS;
+
+typedef struct _ID3TAG
+{
+  char id3Tag[3];
+  char id3Name[30];
+  char id3Artist[30];
+  char id3Album[30];
+  char id3Year[4];
+  char id3Comment[30];
+  char id3Genre[1];
+
+}ID3TAG;
+
+typedef ID3TAG *PID3TAG;
+
+/* Setup strings for setting the ID3 tags */
+#if 0
+#define SETUP_ID3TRACKNAME    "ID3TRACKNAME"
+#define SETUP_ID3ARTIST       "ID3ARTIST"
+#define SETUP_ID3ALBUM        "ID3ALBUM"
+#define SETUP_ID3COMMENT      "ID3COMMENT"
+#define SETUP_ID3YEAR         "ID3YEAR"
+#define SETUP_ID3GENRE        "ID3GENRE"
+#endif
+
+#define SETUP_ID3TRACKNAME    SETUP_AUDIOTRACKNAME
+#define SETUP_ID3ARTIST       SETUP_AUDIOARTIST
+#define SETUP_ID3ALBUM        SETUP_AUDIOALBUM
+#define SETUP_ID3COMMENT      SETUP_AUDIOCOMMENT
+#define SETUP_ID3YEAR         SETUP_AUDIOYEAR
+#define SETUP_ID3GENRE        SETUP_AUDIOGENRE
+
+
+#endif /* */
+
Index: /tags/CWMM-0.3.0_GA/classes/inc/cwogginc.h
===================================================================
--- /tags/CWMM-0.3.0_GA/classes/inc/cwogginc.h	(revision 213)
+++ /tags/CWMM-0.3.0_GA/classes/inc/cwogginc.h	(revision 213)
@@ -0,0 +1,46 @@
+/*
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; see the file COPYING.  If not, write to
+ * the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
+ */          
+/*
+ * If you need another license for your project/product (commercial,
+ * noncommercial, whatever) contact me at
+ * 
+ * http://www.os2world.com/cdwriting
+ * http://www.geocities.com/SiliconValley/Sector/5785/
+ *
+ */
+
+#ifndef _CWOGGINC_H_INCLUDED
+#define _CWOGGINC_H_INCLUDED
+
+#include "common.h"
+
+#define OGGFILE_HELP_PANEL  20
+#define OGGFILE_HELP_LIBRARY  "cwmm.hlp"
+
+/* For querying bitrate of OGG-files. */
+#define FOURCC_Vorbis mmioFOURCC('O', 'G', 'G', 'S')
+#define VORBIS_COOKIE 0x99E59D59
+
+typedef struct _VORBISOPTIONS {
+int cookie;
+long nominal_bitrate;
+long max_bitrate;
+long min_bitrate;
+} VORBISOPTIONS;
+
+typedef VORBISOPTIONS *PVORBISOPTIONS;
+
+#endif       /*  */
Index: /tags/CWMM-0.3.0_GA/classes/inc/except.h
===================================================================
--- /tags/CWMM-0.3.0_GA/classes/inc/except.h	(revision 213)
+++ /tags/CWMM-0.3.0_GA/classes/inc/except.h	(revision 213)
@@ -0,0 +1,80 @@
+
+#ifndef EXCEPT_H_INCLUDED
+#define EXCEPT_H_INCLUDED
+
+#include <setjmp.h>
+#include "excptLogName.h"
+
+typedef struct REGREC2_STRUCT {
+  PVOID     pNext;
+  PFN       pfnHandler;
+  jmp_buf   jmpThread;
+} REGREC2, *PREGREC2;
+
+typedef struct _LOCALEXCEPTSTRUCT {
+  //REGREC2               RegRec2;
+  EXCEPTIONREGISTRATIONRECORD  excptRegRecord;
+  ULONG                 ulExcpt;
+  APIRET                arc;
+  jmp_buf   jmpThread;
+} LOCALEXCEPTSTRUCT, *PLOCALEXCEPTSTRUCT;
+
+    /********************************************************************
+     *                                                                  *
+     *   Macros                                                         *
+     *                                                                  *
+     ********************************************************************/
+
+    /* See except.c for explanations how to use these. */
+
+    #define TRY_LOUD(localExceptStruct)                                   \
+               {  \ 
+                LOCALEXCEPTSTRUCT    localExceptStruct;                         \
+                localExceptStruct.excptRegRecord.ExceptionHandler = (ERR)excHandler;          \
+                localExceptStruct.arc = DosSetExceptionHandler(                  \
+                            (PEXCEPTIONREGISTRATIONRECORD)&(localExceptStruct.excptRegRecord)); \
+                if (localExceptStruct.arc)                                       \
+                    DosBeep(100, 1000);                                    \
+                localExceptStruct.ulExcpt = setjmp(localExceptStruct.jmpThread);               \
+                if (localExceptStruct.ulExcpt == 0)                              \
+                {   /* no exception occured: */
+
+    #define CATCH(localExceptStruct)                                       \
+                    DosUnsetExceptionHandler(                              \
+                            (PEXCEPTIONREGISTRATIONRECORD)&(localExceptStruct.excptRegRecord));   \
+                } /* end if (try_ulExcpt == 0) */                          \
+                else { /* exception occured: */                            \
+                    DosUnsetExceptionHandler(                              \
+                            (PEXCEPTIONREGISTRATIONRECORD)&(localExceptStruct.excptRegRecord));
+    #define END_CATCH                                                      \
+                } /* end else (excptstruct.ulExcpt == 0) */                \
+            } /* end variable scope block */
+
+
+    /*
+     * CRASH:
+     *      this macro is helpful for testing
+     *      the exception handlers.
+     *      This is not for general use. ;-)
+     */
+
+    #define CRASH {PSZ p = NULL; *p = 'a'; }
+
+    /********************************************************************
+     *                                                                  *
+     *   Prototypes                                                     *
+     *                                                                  *
+     ********************************************************************/
+
+ULONG _System excHandler(PEXCEPTIONREPORTRECORD pERepRec,
+                         PLOCALEXCEPTSTRUCT pRegRec2,
+                         //          PREGREC2 pRegRec2,
+                         PCONTEXTRECORD pCtxRec,
+                         PVOID pv);
+#if 0
+    ULONG _System excHandler(PEXCEPTIONREPORTRECORD pReportRec,
+                                         PREGREC2 pRegRec2,
+                                         PCONTEXTRECORD pContextRec,
+                                         PVOID pv);
+#endif
+#endif
Index: /tags/CWMM-0.3.0_GA/classes/inc/excptLogName.h
===================================================================
--- /tags/CWMM-0.3.0_GA/classes/inc/excptLogName.h	(revision 213)
+++ /tags/CWMM-0.3.0_GA/classes/inc/excptLogName.h	(revision 213)
@@ -0,0 +1,5 @@
+#ifndef  _EXCPT_LOGNAME_H
+  #define _EXCPT_LOGNAME_H
+  #define EXCEPTION_LOGFILE_NAME "CWMMCls.log"
+  #define EXCEPTIONTEXT_HEADER  "A trap occurred in the Multimedia classes\n"
+#endif
Index: /tags/CWMM-0.3.0_GA/classes/inc/helpid.h
===================================================================
--- /tags/CWMM-0.3.0_GA/classes/inc/helpid.h	(revision 213)
+++ /tags/CWMM-0.3.0_GA/classes/inc/helpid.h	(revision 213)
@@ -0,0 +1,54 @@
+/*
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; see the file COPYING.  If not, write to
+ * the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
+ */          
+/*
+ * If you need another license for your project/product (commercial,
+ * noncommercial, whatever) contact me at
+ * 
+ * http://www.os2world.com/cdwriting
+ * http://www.geocities.com/SiliconValley/Sector/5785/
+ *
+ */
+
+#define AIFFILE_HELP_PANEL   48020 /*0xbb94*/
+#define AUFILE_HELP_PANEL    48038 /*0xbba6*/
+#define IFFFILE_HELP_PANEL   48021 /*0xbb95*/
+#define SNDFFILE_HELP_PANEL  48022 /*0xbb96*/
+#define VOCFILE_HELP_PANEL   48017 /*0xbb91*/
+#define WAVFILE_HELP_PANEL   48032 /*0xbba0*/
+#define _AUFILE_HELP_PANEL   48019 /*0xbb93*/
+
+#define MIDIFILE_HELP_PANEL  48004 /*0xbb84*/
+
+#define AVCFILE_HELP_PANEL   48011 /*0xbb8b*/
+#define DIBFILE_HELP_PANEL   48013 /*0xbb8d*/
+#define GIFFILE_HELP_PANEL   48007 /*0xbb87*/
+#define JPGFILE_HELP_PANEL   48031 /*0xbb9f*/
+#define MMOTIONFILE_HELP_PANEL   48012 /*0xbb8c*/
+#define PCXFILE_HELP_PANEL   48008 /*0xbb88*/
+#define PCDFILE_HELP_PANEL   48009 /*0xbb89*/
+#define TARGAFILE_HELP_PANEL 48005 /*0xbb85*/
+#define TIFFFILE_HELP_PANEL  48006/*0xbb86*/
+
+#define AVIFILE_HELP_PANEL  48023 /*0xbb97*/
+#define FLIFILE_HELP_PANEL  48024 /*0xbb98*/
+#define MOVFILE_HELP_PANEL  48039 /*0xbba7*/
+#define MPGFILE_HELP_PANEL  48025 /*0xbb99*/
+
+
+#define AUDIOSTREAM_SETTINGS_PANEL  50
+#define AUDIOSTREAM_HELP_PANEL  50 /* Object help and settings help are the same ATM */
+
+
Index: /tags/CWMM-0.3.0_GA/classes/inc/mmfolderinc.h
===================================================================
--- /tags/CWMM-0.3.0_GA/classes/inc/mmfolderinc.h	(revision 213)
+++ /tags/CWMM-0.3.0_GA/classes/inc/mmfolderinc.h	(revision 213)
@@ -0,0 +1,41 @@
+/*
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; see the file COPYING.  If not, write to
+ * the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
+ */          
+/*
+ * If you need another license for your project/product (commercial,
+ * noncommercial, whatever) contact me at
+ * 
+ * http://www.os2world.com/cdwriting
+ * http://www.geocities.com/SiliconValley/Sector/5785/
+ *
+ */
+
+#ifndef _MMFOLDERINC_H_INCLUDED
+#define _MMFOLDERINC_H_INCLUDED
+
+/* The default settings for the MMFolder template */
+#define MMFLDR_TEMPLATE_SETUP "TEMPLATE=YES;NODELETE=YES;DETAILSCLASS=MMImage;ICONVIEW=GRIDDED;SORTCLASS=MMImage;DETAILSVIEW=NORMAL;DETAILSTODISPLAY=0,1,4,12,13,14,15;SORTBYATTR=6,24,25,26,27;OBJECTID=<MMPM2_MMFOLDERTEMPLATE>;" 
+
+/* Default iconsize */
+#define MMFLDR_DEFAULT_ICONSIZE   150
+/* Space between icons */
+#define MMFLDR_SPACINGDELTA_X     10
+#define MMFLDR_SPACINGDELTA_Y     25
+
+/* Restore keys for lighttable folder */
+#define KEY_ICONSIZE     4001
+
+
+#endif
Index: /tags/CWMM-0.3.0_GA/classes/inc/mmres.h
===================================================================
--- /tags/CWMM-0.3.0_GA/classes/inc/mmres.h	(revision 213)
+++ /tags/CWMM-0.3.0_GA/classes/inc/mmres.h	(revision 213)
@@ -0,0 +1,339 @@
+/*
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; see the file COPYING.  If not, write to
+ * the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
+ */          
+/*
+ * If you need another license for your project/product (commercial,
+ * noncommercial, whatever) contact me at
+ * 
+ * http://www.os2world.com/cdwriting
+ * http://www.geocities.com/SiliconValley/Sector/5785/
+ *
+ */
+
+#define ID_ICONVOLUME 1
+
+/* Audio icons */
+#define ID_ICONCWAUDIOFILE  2
+#define ID_ICONMP3FILE      3
+#define ID_ICONOGGFILE      4
+#define ID_ICONWAVFILE      5
+#define ID_ICONAIFFILE      6
+#define ID_ICONAUFILE       7
+#define ID_ICON_AUFILE      8
+#define ID_ICONIFFFILE      9
+#define ID_ICONSNDFFILE     10
+#define ID_ICONVOCFILE      11
+#define ID_ICONMIDIFILE     12
+#define ID_ICONFLACFILE     34
+
+/* Video icons */
+#define ID_ICONCWVIDEOFILE  13
+#define ID_ICONMPGFILE      14
+#define ID_ICONMOVFILE      15
+#define ID_ICONFLIFILE      16
+#define ID_ICONAVIFILE      17
+
+/* Image icons */
+#define ID_ICONCWIMAGEFILE 18
+#define ID_ICONAVCFILE     19
+#define ID_ICONDIBFILE     20
+#define ID_ICONGIFFILE     21
+#define ID_ICONJPGFILE     22
+#define ID_ICONPCDFILE     23
+#define ID_ICONPCXFILE     24
+#define ID_ICONTGAFILE     25
+#define ID_ICONTIFFILE     26
+#define ID_ICON_IMFILE     27
+#define ID_ICONBMPFILE     28
+#define ID_ICONPNGFILE     33
+/* Lighttable folder */
+#define ID_ICONLIGHTTABLE  29
+#define ID_ICONLIGHTTABLE2 30
+/* Audio stream icon */
+#define ID_ICONAUDIOSTREAM 31
+/* M3U icon*/
+#define ID_ICONM3UFILE     32
+/* Last icon id: 34 */
+
+
+
+#define IDSTR_CONVERTCHANNELS     1614
+#define IDSTR_CONVERTSAMPLERATE   1615
+#define IDSTR_CONVERTPLAYTIME     1616
+#define IDSTR_CONVERTDIALOGERROR  1617
+#define IDSTR_CONVERTNOSPACETITLE 1618
+#define IDSTR_CONVERTNOSPACETEXT  1619
+#define IDSTR_INSTALLERRORTITLE   1620
+#define IDSTR_AUDIOBROWSETITLE   1621
+#define IDSTR_IMAGEBROWSETITLE   1622
+
+
+
+/* Menu IDs */
+#define ID_MENU_VOLUME      0x6501
+#define ID_MENU_START       0xbbef
+#define ID_MENU_STOP        0xbbf9
+#define ID_MENU_PAUSE       0xbbfa /* Chosen by CW */
+#define ID_MENU_RESUME      0xbbfb /* Chosen by CW */
+#define ID_MENU_EDITOR      0xbc0d
+#define ID_MENU_PLAYER      0xbbe5
+#define ID_MENU_CONVERT     0xbc03
+#define ID_ITEM_CONVERT     0xb4dd
+#define ID_ITEM_FIRSTCONVERT     0xb4dd
+#define ID_MENU_IMGEDITOR   0xbc2b
+#define ID_MENU_M3UEDITOR   0xbc2c
+#define ID_MENU_M3UPLAYER   0xbc2d
+
+#define ID_MENUICONSIZE     0xbc00
+#define ID_NORMALICONSITEM  0xbc01
+#define ID_50X50ITEM        0xbc02
+#define ID_100X100ITEM      0xbc03
+#define ID_150X150ITEM      0xbc04
+#define ID_200X200ITEM      0xbc05
+#define ID_250X250ITEM      0xbc06
+/* Static menu item with image info for popup menu */
+#define ID_MENU_IMAGEINFO   0xbc10
+
+/* String IDs */
+#define ID_WAVEINFOPAGENAME 1
+#define IDSTR_TITLE         2
+#define IDSTR_ARTIST        3
+#define IDSTR_ALBUM         4
+#define IDSTR_YEAR          5
+#define IDSTR_COMMENT       6
+#define IDSTR_GENRE         7
+
+#define IDSTR_PLAYTIME      8
+#define IDSTR_SAMPLERATE    9
+#define IDSTR_CHANNELS      10
+#define IDSTR_BPS           11
+#define ID_ID3TAGSPAGENAME  12
+
+#define IDSTR_BITRATE       13
+#define IDSTR_VBR           14
+
+/* Titles audio classes */
+#define IDSTR_AIFTITLE       15
+#define IDSTR_AUTITLE        16
+#define IDSTR__AUTITLE       17
+#define IDSTR_IFFTITLE       18
+#define IDSTR_SNDFTITLE      19
+#define IDSTR_VOCTITLE       20
+#define IDSTR_WAVTITLE       21
+#define IDSTR_OGGTITLE       22
+#define IDSTR_MP3TITLE       23
+#define IDSTR_MIDITITLE      24
+#define IDSTR_FLACTITLE      72
+
+/* Titles video classes */
+#define IDSTR_CWVIDEOTITLE   25
+#define IDSTR_MPGTITLE       26
+#define IDSTR_MOVTITLE       27
+#define IDSTR_FLITITLE       28
+#define IDSTR_AVITITLE       29
+#define IDSTR_VIDPLAYERTITLE     75
+
+#define IDSTR_CWAUDIOTITLE   30
+#define IDSTR_CWMMDATAFILETITLE   31
+#define IDSTR_HELPLIBRARY    32
+
+/* Convert menu item string */
+#define IDSTR_MENU_CONVERT  33
+#define IDSTR_MENU_IMAGEINFO 73
+
+/* Titles image classes */
+#define IDSTR_AVCTITLE      34
+#define IDSTR_DIBTITLE      35
+#define IDSTR_GIFTITLE      36
+#define IDSTR_JPGTITLE      37
+#define IDSTR_PCDTITLE      38
+#define IDSTR_PCXTITLE      39
+#define IDSTR_TGATITLE      40
+#define IDSTR_TIFTITLE      41
+#define IDSTR_PNGTITLE      71
+#define IDSTR_MMOTIONTITLE  42
+#define IDSTR_CWIMAGETITLE  43
+
+#define IDSTR_IMAGEINFOPAGENAME 44
+#define IDSTR_SPRINTFPIXEL   45 /* Used with sprintf to build the 'xxx Pixel' string */	
+#define IDSTR_SPRINTFBIT     46 /* Used with sprintf to build the 'xx Bit' string */
+
+#define IDSTR_NOIMGIOPROCERROR   47
+#define IDSTR_OPENFILEERRORTITLE 48
+#define IDSTR_OPENFILEERROR      49
+#define IDSTR_NOMEMERROR         50
+#define IDSTR_IMGIOPROCCRASH     51
+
+#define IDSTR_LIGHTTABLETITLE    52 /* Ligthtable title */
+#define IDSTR_ICONSIZEMENU       53 /* Menu icon size */
+
+/* Column titles for image details view */
+#define IDSTR_IMAGEDETAIL_WIDTH  54
+#define IDSTR_IMAGEDETAIL_HEIGHT 55
+#define IDSTR_IMAGEDETAIL_DEPTH  56
+#define IDSTR_IMAGEDETAIL_FORMAT 57
+
+#define ID_TRACKNAMEPAGENAME     58 /* Page name for the track name settings */
+#define IDSTR_TRACKNAME          59 /* Name for the groupbox for the track name dialog */
+#define IDSTR_STARTINGTRACK      60 /* String to be shown with the title of an audio object
+                                     when started from the WPS. */
+#define IDSTR_AUDIOSCANNING      61 /* Audio scanning window title */
+#define IDSTR_AUDIOSTREAMTITLE   62 /* Class title for audio stream object */
+#define IDSTR_STREAMURLPAGENAME  63
+#define IDSTR_CDTRACKTITLE       64 /* Class title for CD tracks */
+#define IDSTR_M3UTITLE           65 /* Class title for M3U playlists */
+/* Titles used when starting player and editor applications */
+#define IDSTR_AUDPLAYERTITLE     66
+#define IDSTR_AUDEDITORTITLE     67
+#define IDSTR_M3UEDITORTITLE     68
+#define IDSTR_IMGEDITORTITLE     69
+#define IDSTR_VOLUMETITLE        74
+#define IDSTR_TRACKPAUSED        70
+/* Last used id: 75 */
+
+#define IDSTR_MASTERVOLUMEITEM    106
+
+/* Audio information page dialog */
+#define IDDLG_WAVEINFOPAGE 100
+#define IDGB_WAVEINFO      110
+#define IDST_SAMPLERATELABEL        101
+#define IDST_BPSLABEL               102
+#define IDST_PLAYTIMELABEL          103
+#define IDST_CHANNELSLABEL          104
+#define IDST_PLAYTIME               105
+#define IDST_SAMPLERATE             106
+#define IDST_BPS                    107
+#define IDST_CHANNELS               108
+
+/* ID3 tag dialog */
+#define IDDLG_ID3TAGS               200
+#define IDPB_ID3SAVE                201
+#define IDPB_CANCEL                 202
+#define IDPB_ID3HELP                203
+#define IDEF_ID3NAME                204
+#define IDEF_ID3ARTIST              205
+#define IDEF_ID3ALBUM               206
+#define IDEF_ID3COMMENT             207
+#define IDEF_ID3YEAR                208
+#define IDDD_ID3GENRE               209
+#define IDGB_ID3TAGS                216
+
+/* Image information dialog */
+#define IDDLG_IMAGEINFOPAGE         300
+#define IDGB_IMAGEINFO              301
+#define IDST_IMAGEWIDTHLABEL        302
+#define IDST_IMAGEHEIGHTLABEL       303
+#define IDST_COLORDEPTHLABEL        304
+#define IDST_IMAGEWIDTH             305
+#define IDST_IMAGEHEIGHT            306
+#define IDST_COLORDEPTH             307
+#define IDST_IMAGEFORMAT            308
+
+/* Dialog for audio stream class */
+#define IDDLG_STREAMURLPAGE         400
+#define IDPB_STREAMHELP                401
+#define IDGB_STREAMURL              411
+#define IDEF_URL                    412
+#define IDST_URLTEXT                413
+
+/* The main volume object */
+#define IDDLG_VOLUME                500
+#define IDCS_VOLUME                 501
+#define IDPB_MUTE                   502
+#define IDGB_VOLUME                 503
+/* Menu items for the system menu of the volume object */
+#define IDM_POPUP                   200
+#define IDM_ITEMTITLEBAR            201
+#define IDM_ITEMEXIT                202
+
+#define IDDLG_CONVERT               600
+#define IDGB_CONVERT                601
+#define IDST_CONVERTNAMELABEL       602
+#define IDST_CONVERTNAME            603
+#define IDST_CONVERTSAMPLERATE      604
+#define IDST_CONVERTCHANNELS        605
+#define IDST_CONVERTCDBITS          606
+#define IDST_CONVERTCDSAMPLELABEL   607
+#define IDST_CONVERTCDCHANNELSLABEL 608
+#define IDST_CONVERTPLAYTIME        609
+#define IDEF_CONVERTTARGETNAME      610
+#define IDPB_CONVERTBROWSE          611
+#define IDBAR_CONVERTPROGRESS       612
+#define IDPB_CONVERTOK              613
+#define IDPB_CONVERTABORT           614
+#define IDPB_CONVERTCLOSE           615
+#define IDDD_IOPROC                 616
+#define IDGB_CONVERT2               618
+
+/* The image converter app */
+#define IDDLG_IMGCONVERT               700
+#define IDGB_IMGCONVERT                701
+#define IDST_IMGCONVERTNAMELABEL       702
+#define IDST_IMGCONVERTNAME            703
+#define IDSR_BMP                    704
+#define IDEF_IMGCONVERTTARGETNAME      710
+#define IDPB_IMGCONVERTBROWSE          711
+#define IDBAR_IMGCONVERTPROGRESS       712
+#define IDPB_IMGCONVERTOK              713
+#define IDPB_IMGCONVERTABORT           714
+#define IDPB_IMGCONVERTCLOSE           715
+#define IDDD_IMGIOPROC                 716
+#define IDST_IMGCONVERTTO              717
+
+/* The MM files find application (mmfind.exe) */
+#define IDDLG_MMFIND                   800
+#define IDPB_NEWFILE                   801
+#define IDST_TYPE                      802
+#define IDCB_TYPEOFFILE                803
+#define IDGB_PREVIEW                   804
+#define IDSR_IMGPREVIEW                805
+#define IDST_NOPREVIEWAVAILABLE        806
+#define IDST_AUDIOINFO                 807
+#define IDGB_AUDIOINFO                 808
+#define IDSTR_TYPEAUDIO                820
+#define IDSTR_TYPEIMAGE                821
+#define IDSTR_TYPEVIDEO                822
+#define IDSTR_AUDIOINFOTEXT            823
+#define IDSTR_NOMMTEMPLATEFLDRTITLE    824
+#define IDSTR_NOMMTEMPLATEFLDR         825
+
+/* The following IDs are predefined for the OS/2 file dialog */
+
+/* Small volume app started from context menu */
+#define IDDLG_CLASSVOLUME          1000
+#define ID_CLASSVOLCLIENT           1001
+
+/* Audio player (mmplayer.exe) */
+#define IDDLG_MMPLAYER               2100
+#define ID_CLIENT                 2101
+#define IDPB_MMPLAYERPLAY                   2103
+#define IDPB_MMPLAYERPAUSE                  2104
+#define IDPB_MMPLAYERSTOP                   2105
+#define IDST_MMPLAYERPLAYTIME               2107
+#define IDSL_MMPLAYERVOLUMEARM              2108
+#define IDSL_MMPLAYERVOLUME                 2109
+#define IDPB_MMPLAYERPOSBAR                 2110
+#define IDPB_MMPLAYERSLIDERARM              2111
+#define IDSL_MMPLAYERPOSBAR                 2112
+
+#define ID_MENUTIMECONTEXT        1
+#define ID_MENUITEMELAPSED        2
+#define ID_MENUITEMREMAINING      3
+#define ID_MENUITEMID3            4
+#define ID_MENUITEMMASTERVOLUME 5
+
+#define IDPB_MMFINDSTOP             809
+#define IDPB_MMFINDPAUSE            810
+#define IDPB_MMFINDPLAY             811
Index: /tags/CWMM-0.3.0_GA/classes/inc/omf.h
===================================================================
--- /tags/CWMM-0.3.0_GA/classes/inc/omf.h	(revision 213)
+++ /tags/CWMM-0.3.0_GA/classes/inc/omf.h	(revision 213)
@@ -0,0 +1,428 @@
+/*
+**
+** OMF.H - Object Module Format structures
+**
+*/
+
+struct exehdr_rec {
+   BYTE     signature[2];              // Must be "MZ"
+   USHORT   image_len;                 // Image Length
+   USHORT   pages;                     // Pages
+   USHORT   reloc_items;               // Relocation table items
+   USHORT   min_paragraphs;            // Mininum 16-bytes paragraphs
+   USHORT   max_paragraphs;            // Maximum 16-bytes paragraphs
+   USHORT   stack_pos;                 // Stack position
+   USHORT   offset_in_sp;              // Offset in SP
+   USHORT   checksum;                  // Checksum
+   USHORT   offset_in_ip;              // Offset in IP
+   USHORT   code_pos;                  // Code segment pos.
+   USHORT   reloc_item_pos;            // Position of first relocation item
+   USHORT   overlay_number;            // Overlay number
+   BYTE     unused[8];                 // Unused bytes
+   USHORT   oem_id;                    // OEM Identifier
+   BYTE     oem_info[24];              // OEM Info
+   ULONG    lexe_offset;               // Offset to linear header
+};
+
+struct lexehdr_rec {
+   BYTE     signature[2];              // Must be "LX"
+   BYTE     b_ord;                     // Byte ordering
+   BYTE     w_ord;                     // Word ordering
+   ULONG    format_level;              // Format level
+   USHORT   cpu_type;                  // CPU Type
+   USHORT   os_type;                   // Operating system
+   ULONG    module_version;            // Module version
+   ULONG    mod_flags;                 // Module flags
+   ULONG    mod_pages;                 // Module pages
+   ULONG    EIP_object;                // EIP Object no.
+   ULONG    EIP;                       // EIP Value
+   ULONG    ESP_object;                // ESP Object no
+   ULONG    ESP;                       // ESP Value
+   ULONG    page_size;                 // Page size
+   ULONG    page_ofs_shift;            // Page offset shift
+   ULONG    fixup_sect_size;           // Fixup section size
+   ULONG    fixup_sect_checksum;       // Fixup section checksum
+   ULONG    loader_sect_size;          // Loader section size
+   ULONG    loader_sect_checksum;      // Loader section checksum
+   ULONG    obj_table_ofs;             // Object table offset
+   ULONG    obj_count;                 // Object count
+   ULONG    obj_page_tab_ofs;          // Object page table offset
+   ULONG    obj_iter_page_ofs;         // Object iteration pages offset
+   ULONG    res_tab_ofs;               // Resource table offset
+   ULONG    res_table_entries;         // Resource table entries
+   ULONG    res_name_tab_ofs;          // Resident name table offset;
+   ULONG    ent_tab_ofs;               // Entry table offset
+   ULONG    mod_dir_ofs;               // Module directives offset
+   ULONG    mod_dir_count;             // Number of module directives
+   ULONG    fixup_page_tab_ofs;        // Fixup page table offset
+   ULONG    fixup_rec_tab_ofs;         // Fixup record table offset
+   ULONG    imp_tab_ofs;               // Import module table offset
+   ULONG    imp_mod_entries;           // Import module entries
+   ULONG    imp_proc_tab_ofs;          // Import proc table offset
+   ULONG    per_page_check_ofs;        // Per page checksum offset
+   ULONG    data_page_offset;          // Data pages offset
+   ULONG    preload_page_count;        // Preload pages count
+   ULONG    nonres_tab_ofs;            // Nonresident name table offset
+   ULONG    nonres_tab_len;            // Nonresident name table len
+   ULONG    nonres_tab_check;          // Nonresident tables checksum
+   ULONG    auto_ds_objectno;          // Auto DS object number
+   ULONG    debug_info_ofs;            // Debug info offset
+   ULONG    debug_info_len;            // Debug info length
+   ULONG    inst_preload_count;        // Instance preload count
+   ULONG    inst_demand_count;         // Instance demand count
+   ULONG    heapsize;                  // Heap size
+   ULONG    stacksize;                 // Stack size
+};
+
+struct debug_head_rec {
+   BYTE signature[3];                  // Debug signature
+   BYTE type;                          // Debug info type
+};
+
+struct dir_inf_rec {
+   USHORT   dirstruct_size;            // Size of directory structure
+   USHORT   number_of_entries;         // Number of dnt_rec's in the array
+   USHORT   unknown;                   // Unknown data
+   // Followed by an array of dnt_rec structures
+};
+
+struct dnt_rec {
+   USHORT   subsect_type;              // sst Subsection type
+   USHORT   mod_index;                 // Module index (1-based)
+   ULONG    offset;                    // Offset of start of section
+   ULONG    size;                      // Size of section
+};
+
+// Modules subsection
+struct modules_rec {
+   USHORT   code_seg_base;             // Code segment base
+   ULONG    code_seg_offset;           // Code segment offset
+   ULONG    code_seg_len;              // Code segment length
+   USHORT   overlay_no;                // Overlay number
+   USHORT   lib_idx;                   // Index into library section or 0
+   BYTE     segments;                  // Number of segments
+   BYTE     reserved;
+   BYTE     debug_style[2];            // "HL" for HLL, "CV" or 0 for CodeView
+   BYTE     debug_version[2];          // 00 01 or 00 03 for HLL, 00 00 for CV
+   BYTE     name_len;                  // Length of name (which follows)
+};
+
+// Publics subsection
+struct publics_rec {
+   ULONG    offset;                    // Offset
+   USHORT   segment;                   // Segment
+   USHORT   type;                      // Type index
+   BYTE     name_len;                  // Length of name (wich follows)
+};
+
+#if 0
+// Linenumbers header
+struct linhead_rec {
+   BYTE     id;                        // 0x95 for flat mem, 32 bit progs
+   USHORT   length;                    // Record length
+   USHORT   base_group;                // Base group
+   USHORT   base_segment;              // Base segment
+};
+#endif
+
+// First linenumber record
+struct linfirst_rec {
+   USHORT   lineno;                    // Line number (0)
+   BYTE     entry_type;                // Entry type
+   BYTE     reserved;                  // Reserved
+   USHORT   entries_count;             // Number of table entries
+   USHORT   segment_no;                // Segment number
+   ULONG    filename_tabsize;          // File names table size
+};
+
+
+// Source line numbers
+struct linsource_rec {
+   USHORT   source_line;               // Source file line number
+   USHORT   source_idx;                // Source file index
+   ULONG    offset;                    // Offset into segment
+};
+
+
+// Listing statement numbers
+struct linlist_rec {
+   ULONG    list_line;                 // Listing file linenumber
+   ULONG    statement;                 // Listing file statement number
+   ULONG    offset;                    // Offset into segment
+};
+
+
+// Source and Listing statement numbers
+struct linsourcelist_rec {
+   USHORT   source_line;               // Source file line number
+   USHORT   source_idx;                // Source file index
+   ULONG    list_line;                 // Listing file linenumber
+   ULONG    statement;                 // Listing file statement number
+   ULONG    offset;                    // Offset into segment
+};
+
+
+// Path table
+struct pathtab_rec {
+   ULONG    offset;                    // Offset into segment
+   USHORT   path_code;                 // Path code
+   USHORT   source_idx;                // Source file index
+};
+
+
+// File names table
+struct filenam_rec {
+   ULONG    first_char;                // First displayable char in list file
+   ULONG    disp_chars;                // Number of displayable chars in list line
+   ULONG    filecount;                 // Number of source/listing files
+};
+
+
+// Symbol types
+#define SYM_BEGIN          0x00        // Begin block
+#define SYM_PROC           0x01        // Function
+#define SYM_END            0x02        // End block of function
+#define SYM_AUTO           0x04        // Auto variable
+#define SYM_STATIC         0x05        // Static variable
+#define SYM_LABEL          0x0B        // Label
+#define SYM_WITH           0x0C        // With start symbol (not used)
+#define SYM_REG            0x0D        // Register variable
+#define SYM_CONST          0x0E        // Constant
+#define SYM_ENTRY          0x0F        // Secondary entry (not in C)
+#define SYM_SKIP           0x10        // For incremental linking (not used)
+#define SYM_CHANGESEG      0x11        // Change segment (#pragma alloc_text)
+#define SYM_TYPEDEF        0x12        // Typedef variable
+#define SYM_PUBLIC         0x13        // Public reference
+#define SYM_MEMBER         0x14        // Member of minor or major structure
+#define SYM_BASED          0x15        // Based variable
+#define SYM_TAG            0x16        // Tag in struct, union, enum ...
+#define SYM_TABLE          0x17        // Table (used in RPG - not C)
+#define SYM_MAP            0x18        // Map variable (extern in C)
+#define SYM_CLASS          0x19        // Class symbol (C++)
+#define SYM_MEMFUNC        0x1A        // Member function
+#define SYM_AUTOSCOPE      0x1B        // Scoped auto for C++ (not used)
+#define SYM_STATICSCOPE    0x1C        // scoped static for C++ (not used)
+#define SYM_CPPPROC        0x1D        // C++ Proc
+#define SYM_CPPSTAT        0x1E        // C++ Static var
+#define SYM_COMP           0x40        // Compiler information
+
+
+// Symbolic begin record
+struct symbegin_rec {
+   ULONG    offset;                    // Segment offset
+   ULONG    length;                    // Length of block
+   BYTE     name_len;                  // Length of block name
+   // Block name follows
+};
+
+
+// Symbolic auto var record
+struct symauto_rec {
+   ULONG    stack_offset;              // Stack offset
+   USHORT   type_idx;                  // Type index
+   BYTE     name_len;                  // Length of name
+   // Var name follows
+};
+
+
+// Symbolic procedure record
+struct symproc_rec {
+   ULONG    offset;                    // Segment offset
+   USHORT   type_idx;                  // Type index
+   ULONG    length;                    // Length of procedure
+   USHORT   pro_len;                   // Length of prologue
+   ULONG    pro_bodylen;               // Length of prologue + body
+   USHORT   class_type;                // Class type
+   BYTE     near_far;                  // Near or far
+   BYTE     name_len;                  // Length of name
+   // Function name follows
+};
+
+
+// Symbolic static var record
+struct symstatic_rec {
+   ULONG    offset;                    // Segment offset
+   USHORT   segaddr;                   // Segment address
+   USHORT   type_idx;                  // Type index
+   BYTE     name_len;                  // Length of name
+   // Var name follows
+};
+
+
+// Symbolic label var record
+struct symlabel_rec {
+   ULONG    offset;                    // Segment offset
+   BYTE     near_far;                  // Near or far
+   BYTE     name_len;                  // Length of name
+   // Var name follows
+};
+
+// Symbolic register var record
+struct symreg_rec {
+   USHORT   type_idx;                  // Type index
+   BYTE     reg_no;                    // Register number
+   BYTE     name_len;                  // Length of name
+   // Var name follows
+};
+
+// Symbolic change-segment record
+struct symseg_rec {
+   USHORT   seg_no;                    // Segment number
+};
+
+// Symbolic typedef record
+struct symtypedef_rec {
+   USHORT   type_idx;                  // Type index
+   BYTE     name_len;                  // Length of name
+   // Name follows
+};
+
+// Symbolic public record
+struct sympublic_rec {
+   ULONG    offset;                    // Segment offset
+   USHORT   segaddr;                   // Segment address
+   USHORT   type_idx;                  // Type index
+   BYTE     name_len;                  // Length of name
+   // Name follows
+};
+
+// Symbolic member record
+struct symmember_rec {
+   ULONG    offset;                    // Offset to subrecord
+   BYTE     name_len;                  // Length of name
+   // Name follows
+};
+
+// Symbolic based record
+struct symbased_rec {
+   ULONG    offset;                    // Offset to subrecord
+   USHORT   type_idx;                  // Type index
+   BYTE     name_len;                  // Length of name
+   // Name follows
+};
+
+// Symbolic tag record
+struct symtag_rec {
+   USHORT   type_idx;                  // Type index
+   BYTE     name_len;                  // Length of name
+   // Name follows
+};
+
+
+// Symbolic table record
+struct symtable_rec {
+   ULONG    offset;                    // Segment offset
+   USHORT   segaddr;                   // Segment address
+   USHORT   type_idx;                  // Type index
+   ULONG    idx_ofs;                   // Index offset to subrecord
+   BYTE     name_len;                  // Length of name
+   // Name follows
+};
+
+
+// Type record
+struct type_rec {
+   USHORT   length;                    // Length of sub-record
+   BYTE     type;                      // Sub-record type
+   BYTE     type_qual;                 // Type qualifier
+};
+
+
+
+// Types
+#define TYPE_CLASS         0x40        // Class
+#define TYPE_BASECLASS     0x41        // Base class
+#define TYPE_FRIEND        0x42        // Friend
+#define TYPE_CLASSDEF      0x43        // Class definition
+#define TYPE_MEMBERFUNC    0x45        // Member function
+#define TYPE_CLASSMEMBER   0x46        // Class member
+#define TYPE_REF           0x48        // Reference
+#define TYPE_MEMBERPTR     0x49        // Member pointer
+#define TYPE_SCALARS       0x51        // Scalars
+#define TYPE_SET           0x52        // Set
+#define TYPE_ENTRY         0x53        // Entry
+#define TYPE_FUNCTION      0x54        // Function
+#define TYPE_AREA          0x55        // Area
+#define TYPE_LOGICAL       0x56        // Logical
+#define TYPE_STACK         0x57        // Stack
+#define TYPE_MACRO         0x59        // Macro
+#define TYPE_BITSTRING     0x5C        // Bit string
+#define TYPE_USERDEF       0x5D        // User defined
+#define TYPE_CHARSTR       0x60        // Character string
+#define TYPE_PICTURE       0x61        // Picture
+#define TYPE_GRAPHIC       0x62        // Graphic
+#define TYPE_FORMATLAB     0x65        // Format label
+#define TYPE_FILE          0x67        // File
+#define TYPE_SUBRANGE      0x6F        // Subrange
+#define TYPE_CODELABEL     0x72        // Code label
+#define TYPE_PROCEDURE     0x75        // Procedure
+#define TYPE_ARRAY         0x78        // Array
+#define TYPE_STRUCT        0x79        // Structure / Union / Record
+#define TYPE_POINTER       0x7A        // Pointer
+#define TYPE_ENUM          0x7B        // Enum
+#define TYPE_LIST          0x7F        // List
+
+
+// Type userdef
+struct type_userdefrec {
+   BYTE     FID_index;                 // Field ID
+   USHORT   type_index;                // Type index
+   BYTE     FID_string;                // String ID
+   BYTE     name_len;                  // Length of name which follows
+};
+
+
+// Type function
+struct type_funcrec {
+   USHORT   params;
+   USHORT   max_params;
+   BYTE     FID_index;                 // Field ID
+   USHORT   type_index;                // Type index of return value
+   BYTE     FID_index1;                // String ID
+   USHORT   typelist_index;            // Index of list of params
+};
+
+
+// Type struct
+struct type_structrec {
+   ULONG    size;                      // Size of structure
+   USHORT   field_count;               // Number of fields in structure
+   BYTE     FID_index;                 // Field ID
+   USHORT   type_list_idx;             // Index to type list
+   BYTE     FID_index1;                // Field ID
+   USHORT   type_name_idx;             // Index to names / offsets
+   BYTE     dont_know;                 // Haven't a clue, but it seems to be needed
+   BYTE     name_len;                  // Length of structure name which follows
+};
+
+// Type list, type qualifier 1: contains types for structures
+// This record is repeated for the number of items in the structure definition
+struct type_list1 {
+   BYTE     FID_index;                 // Field identifier for index
+   USHORT   type_index;                // Type index.
+};
+
+// Type list, type qualifier 2: contains names and offsets for structure items
+// This record is repeated for the number of items in the structure definition
+struct type_list2 {
+   BYTE     FID_string;                // String identifier
+   BYTE     name_len;                  // Length of name which follows
+};
+
+// Type list, subrecord to the above, contains offset of variable in the structure
+struct type_list2_1 {
+   BYTE     FID_span;                  // Defines what type of variable follows
+   union {
+      BYTE   b_len;
+      USHORT s_len;
+      ULONG  l_len;
+   } u;
+};
+
+// Type pointer
+struct type_pointerrec {
+   BYTE     FID_index;                 // Index identifier
+   USHORT   type_index;                // Type index
+   BYTE     FID_string;                // String identifier
+   BYTE     name_len;                  // Length of name which follows
+};
Index: /tags/CWMM-0.3.0_GA/classes/inc/sym.h
===================================================================
--- /tags/CWMM-0.3.0_GA/classes/inc/sym.h	(revision 213)
+++ /tags/CWMM-0.3.0_GA/classes/inc/sym.h	(revision 213)
@@ -0,0 +1,79 @@
+/* Pointer means offset from beginning of file or beginning of struct */
+#pragma pack(1)
+typedef struct {
+  unsigned short int ppNextMap;     /* paragraph pointer to next map         */
+  unsigned char      bFlags;        /* symbol types                          */
+  unsigned char      bReserved1;    /* reserved                              */
+  unsigned short int pSegEntry;     /* segment entry point value             */
+  unsigned short int cConsts;       /* count of constants in map             */
+  unsigned short int pConstDef;     /* pointer to constant chain             */
+  unsigned short int cSegs;         /* count of segments in map              */
+  unsigned short int ppSegDef;      /* paragraph pointer to first segment    */
+  unsigned char      cbMaxSym;      /* maximum symbol-name length            */
+  unsigned char      cbModName;     /* length of module name                 */
+  char               achModName[1]; /* cbModName Bytes of module-name member */
+} MAPDEF;
+
+typedef struct {
+  unsigned short int ppNextMap;     /* always zero                           */
+  unsigned char      release;       /* release number (minor version number) */
+  unsigned char      version;       /* major version number                  */
+} LAST_MAPDEF;
+
+typedef struct {
+  unsigned short int ppNextSeg;     /* paragraph pointer to next segment     */
+  unsigned short int cSymbols;      /* count of symbols in list              */
+  unsigned short int pSymDef;       /* offset of symbol chain                */
+  unsigned short int wReserved1;    /* reserved                              */
+  unsigned short int wReserved2;    /* reserved                              */
+  unsigned short int wReserved3;    /* reserved                              */
+  unsigned short int wReserved4;    /* reserved                              */
+  unsigned char      bFlags;        /* symbol types                          */
+  unsigned char      bReserved1;    /* reserved                              */
+  unsigned short int ppLineDef;     /* offset of line number record          */
+  unsigned char      bReserved2;    /* reserved                              */
+  unsigned char      bReserved3;    /* reserved                              */
+  unsigned char      cbSegName;     /* length of segment name                */
+  char               achSegName[1]; /* cbSegName Bytes of segment-name member*/
+} SEGDEF;
+
+typedef struct {
+  unsigned short int wSymVal;       /* symbol address or constant            */
+  unsigned char      cbSymName;     /* length of symbol name                 */
+  char               achSymName[1]; /* cbSymName Bytes of symbol-name member */
+} SYMDEF16;
+
+typedef struct {
+  unsigned       int wSymVal;       /* symbol address or constant            */
+  unsigned char      cbSymName;     /* length of symbol name                 */
+  char               achSymName[1]; /* cbSymName Bytes of symbol-name member */
+} SYMDEF32;
+
+typedef struct {
+  unsigned short int ppNextLine;    /* ptr to next linedef (0 if last)       */
+  unsigned short int wReserved1;    /* reserved                              */
+  unsigned short int pLines;        /* pointer to line numbers               */
+  unsigned short int cLines;        /* reserved                              */
+  unsigned char      cbFileName;    /* length of filename                    */
+  char               achFileName[1];/* cbFileName Bytes of filename          */
+} LINEDEF;
+
+typedef struct {
+  unsigned short int wCodeOffset;   /* executable offset                     */
+  unsigned short int dwFileOffset;  /* source offset                         */
+} LINEINF;
+
+#define SEGDEFOFFSET(MapDef)     (MapDef.ppSegDef*16)
+#define NEXTSEGDEFOFFSET(SegDef)  (SegDef.ppNextSeg*16)
+
+#define ASYMPTROFFSET(SegDefOffset,Segdef) (SegDefOffset+SegDef.pSymDef)
+#define SYMDEFOFFSET(SegDefOffset,SegDef,n) (ASYMPTROFFSET(SegDefOffset,SegDef)+(n)*(sizeof(unsigned short int)))
+
+#define ACONSTPTROFFSET(MapDef) (MapDef.ppConstDef)
+#define CONSTDEFOFFSET(MapDef,n) ((MapDef.ppConstDef)+(n)*(sizeof(unsigned short int)))
+
+#define LINEDEFOFFSET(SegDef) (SegDef.ppLineDef*16))
+#define NEXTLINEDEFOFFSET(LineDef) (LineDef.ppNextLine*16)
+#define LINESOFFSET(LinedefOffset,LineDef) ((LinedefOffset)+LineDef.pLines)
+
+
Index: /tags/CWMM-0.3.0_GA/classes/inc/wpbitmap.h
===================================================================
--- /tags/CWMM-0.3.0_GA/classes/inc/wpbitmap.h	(revision 213)
+++ /tags/CWMM-0.3.0_GA/classes/inc/wpbitmap.h	(revision 213)
@@ -0,0 +1,674 @@
+
+/*
+ * This file was generated by the SOM Compiler.
+ * FileName: E:\cwpsh\rel\os2c\include\base\os2\wpbitmap.h.
+ * Generated using:
+ *     SOM Precompiler somipc: 2.29.1.14
+ *     SOM Emitter emith: 2.43
+ */
+
+/*
+ *   Module Header
+ * 
+ *   Module Name: WPBITMAP
+ * 
+ *   OS/2 Presentation Manager Workplace class definitions
+ * 
+ *   Copyright (c) International Business Machines Corporation 1991, 1992
+ * 
+ */
+
+
+#ifndef SOM_WPBitmap_h
+#define SOM_WPBitmap_h
+
+
+#include <som.h>
+
+/*
+ * -- This emitter treats Method Tokens as Thunks by default.
+ * -- Use the sc modifier "nothunks" to change this default
+ */
+#undef somresolve_
+#define somresolve_(obj,mToken) ((somMethodProc*)((void)obj, mToken))
+
+/*
+ * Define the class name as an object type
+ */
+#ifndef WPBitmap
+#define WPBitmap SOMObject
+#endif
+#include <wpimage.h>
+
+/*
+ * Start of bindings for IDL types
+ */
+
+#ifndef SOMClass
+    #define SOMClass SOMObject
+#endif /* SOMClass */
+#ifndef WPFolder
+    #define WPFolder SOMObject
+#endif /* WPFolder */
+#ifndef M_WPObject
+    #define M_WPObject SOMObject
+#endif /* M_WPObject */
+#ifndef WPObject
+    #define WPObject SOMObject
+#endif /* WPObject */
+#ifndef WPImageFile
+    #define WPImageFile SOMObject
+#endif /* WPImageFile */
+#ifndef M_WPFileSystem
+    #define M_WPFileSystem SOMObject
+#endif /* M_WPFileSystem */
+#ifndef M_WPDataFile
+    #define M_WPDataFile SOMObject
+#endif /* M_WPDataFile */
+#ifndef M_WPImageFile
+    #define M_WPImageFile SOMObject
+#endif /* M_WPImageFile */
+#ifndef M_WPBitmap
+    #define M_WPBitmap SOMObject
+#endif /* M_WPBitmap */
+
+/*
+ * End of bindings for IDL types.
+ */
+
+#define WPBitmap_MajorVersion 1
+#define WPBitmap_MinorVersion 2
+
+/*
+ * External name shortening if required
+ */
+#ifdef SOM_USE_SHORT_EXTERNAL_NAMES
+#define WPBitmapNewClass wpbmpc
+#pragma linkage(wpbmpc, system)
+#define WPBitmapClassData wpbmpd
+#define WPBitmapCClassData wpbmpx
+#endif /* SOM_USE_SHORT_EXTERNAL_NAMES */
+
+/*
+ * Include the meta class file
+ */
+#include <wpbitmap.h>
+/*--------------Migration------------*/
+#define WPBitmap_classObj WPBitmapClassData.classObject
+#define _WPBitmap WPBitmap_classObj
+
+/*
+ * Declare the class creation procedure
+ */
+SOMEXTERN SOMClass * SOMLINK WPBitmapNewClass(integer4 somtmajorVersion,
+		integer4 somtminorVersion);
+#pragma linkage(WPBitmapNewClass, system)
+
+/*
+ * Declare the class data structure
+ */
+SOMEXTERN struct WPBitmapClassDataStructure {
+	SOMClass *classObject;
+} SOMDLINK WPBitmapClassData;
+
+/*
+ * Declare the C specific class data structure
+ */
+SOMEXTERN struct WPBitmapCClassDataStructure {
+	somMethodTabs parentMtab;
+	somDToken instanceDataToken;
+} SOMDLINK WPBitmapCClassData;
+
+/*
+ * New and Renew macros for WPBitmap
+ */
+#define WPBitmapNew() \
+   ( _WPBitmap ? \
+	_somNew(_WPBitmap) \
+	: ( WPBitmapNewClass(\
+		WPBitmap_MajorVersion, \
+		WPBitmap_MinorVersion),\
+	   _somNew(_WPBitmap)))
+#define WPBitmapRenew(buf) \
+   ( _WPBitmap ? \
+	_somRenew(_WPBitmap, buf) \
+	: ( WPBitmapNewClass(\
+		WPBitmap_MajorVersion, \
+		WPBitmap_MinorVersion),\
+	   _somRenew(_WPBitmap, buf)))
+
+/*
+ * Override method: wpSetupOnce
+ */
+#define WPBitmap_wpSetupOnce(somSelf,pszSetupString) \
+	WPObject_wpSetupOnce(somSelf,pszSetupString)
+
+/*
+ * Override method: wpFormatDragItem
+ */
+#define WPBitmap_wpFormatDragItem(somSelf,pdrgItem) \
+	WPObject_wpFormatDragItem(somSelf,pdrgItem)
+
+/*
+ * Override method: somDefaultInit
+ */
+#define WPBitmap_somDefaultInit(somSelf,ctrl) \
+	SOMObject_somDefaultInit(somSelf,ctrl)
+
+/*
+ * Override method: somDestruct
+ */
+#define WPBitmap_somDestruct(somSelf,doFree,ctrl) \
+	SOMObject_somDestruct(somSelf,doFree,ctrl)
+
+/*
+ * Override method: wpQueryBitmapHandle
+ */
+#define WPBitmap_wpQueryBitmapHandle(somSelf,phBitmap,phPalette,ulWidth,ulHeight,ulFlags,lBackgroundColor,pbQuitEarly) \
+	WPImageFile_wpQueryBitmapHandle(somSelf,phBitmap,phPalette,ulWidth,ulHeight,ulFlags,lBackgroundColor,pbQuitEarly)
+
+/*
+ * Override method: wpQueryBitmapInfoHeader
+ */
+#define WPBitmap_wpQueryBitmapInfoHeader(somSelf) \
+	WPImageFile_wpQueryBitmapInfoHeader(somSelf)
+
+/*
+ * Override method: wpQueryBitmapData
+ */
+#define WPBitmap_wpQueryBitmapData(somSelf,pulSize) \
+	WPImageFile_wpQueryBitmapData(somSelf,pulSize)
+
+/*
+ * Override method: wpSetBitmapData
+ */
+#define WPBitmap_wpSetBitmapData(somSelf,pBitmapData,ulSize) \
+	WPImageFile_wpSetBitmapData(somSelf,pBitmapData,ulSize)
+
+/*
+ * Override method: wpReadImageFile
+ */
+#define WPBitmap_wpReadImageFile(somSelf) \
+	WPImageFile_wpReadImageFile(somSelf)
+
+/*
+ * Override method: wpWriteImageFile
+ */
+#define WPBitmap_wpWriteImageFile(somSelf) \
+	WPImageFile_wpWriteImageFile(somSelf)
+
+/*
+ * Override method: wpInitData
+ */
+#define WPBitmap_wpInitData(somSelf) \
+	WPObject_wpInitData(somSelf)
+
+/*
+ * Override method: wpUnInitData
+ */
+#define WPBitmap_wpUnInitData(somSelf) \
+	WPObject_wpUnInitData(somSelf)
+
+/*
+ * Override method: wpRefresh
+ */
+#define WPBitmap_wpRefresh(somSelf,ulView,pReserved) \
+	WPFileSystem_wpRefresh(somSelf,ulView,pReserved)
+#ifndef SOM_DONT_USE_INHERITED_MACROS
+#define WPBitmap_wpQueryHandleFromContents WPDataFile_wpQueryHandleFromContents
+#define WPBitmap_wpSetContentsFromHandle WPDataFile_wpSetContentsFromHandle
+#define WPBitmap_wpAddBecomePage WPDataFile_wpAddBecomePage
+#define WPBitmap_wpAddFileTypePage WPDataFile_wpAddFileTypePage
+#define WPBitmap_wpPrintMetaFile WPDataFile_wpPrintMetaFile
+#define WPBitmap_wpPrintPifFile WPDataFile_wpPrintPifFile
+#define WPBitmap_wpPrintPrinterSpecificFile WPDataFile_wpPrintPrinterSpecificFile
+#define WPBitmap_wpPrintUnknownFile WPDataFile_wpPrintUnknownFile
+#define WPBitmap_wpQueryAssociatedProgram WPDataFile_wpQueryAssociatedProgram
+#define WPBitmap_wpSetAssociatedFileIcon WPDataFile_wpSetAssociatedFileIcon
+#define WPBitmap_wpQueryAssociatedFileIcon WPDataFile_wpQueryAssociatedFileIcon
+#define WPBitmap_wpSetContentsFromPointer WPDataFile_wpSetContentsFromPointer
+#define WPBitmap_wpQueryPointerFromContents WPDataFile_wpQueryPointerFromContents
+#define WPBitmap_wpRenderFromClipboard WPDataFile_wpRenderFromClipboard
+#define WPBitmap_SetUpdateIndicator WPDataFile_SetUpdateIndicator
+#define WPBitmap_QueryUpdateIndicator WPDataFile_QueryUpdateIndicator
+#define WPBitmap_SetNeedSave WPDataFile_SetNeedSave
+#define WPBitmap_QueryNeedSave WPDataFile_QueryNeedSave
+#define WPBitmap_wpSetDefaultBidiSettings WPDataFile_wpSetDefaultBidiSettings
+#define WPBitmap_wpQueryDefaultBidiSettings WPDataFile_wpQueryDefaultBidiSettings
+#define WPBitmap_wpSetBidiValues WPDataFile_wpSetBidiValues
+#define WPBitmap_wpQueryBidiValues WPDataFile_wpQueryBidiValues
+#define WPBitmap_wpInsertBidiPage WPDataFile_wpInsertBidiPage
+#define WPBitmap_wpSaveBidiState WPDataFile_wpSaveBidiState
+#define WPBitmap_wpRestoreBidiState WPDataFile_wpRestoreBidiState
+#define WPBitmap_wpInitBidiData WPDataFile_wpInitBidiData
+#define WPBitmap_wpBidiSetup WPDataFile_wpBidiSetup
+#define WPBitmap_wpSettingsNotebook WPDataFile_wpSettingsNotebook
+#define WPBitmap_wpDragOver WPObject_wpDragOver
+#define WPBitmap_wpRestoreState WPObject_wpRestoreState
+#define WPBitmap_wpSetDefaultView WPObject_wpSetDefaultView
+#define WPBitmap_wpSetRealName WPFileSystem_wpSetRealName
+#define WPBitmap_wpSetType WPFileSystem_wpSetType
+#define WPBitmap_wpAddSettingsPages WPObject_wpAddSettingsPages
+#define WPBitmap_wpAddObjectWindowPage WPObject_wpAddObjectWindowPage
+#define WPBitmap_wpOpen WPObject_wpOpen
+#define WPBitmap_wpPrintObject WPObject_wpPrintObject
+#define WPBitmap_wpModifyMenu WPObject_wpModifyMenu
+#define WPBitmap_wpMenuItemSelected WPObject_wpMenuItemSelected
+#define WPBitmap_wpMenuItemHelpSelected WPObject_wpMenuItemHelpSelected
+#define WPBitmap_wpQueryDefaultHelp WPObject_wpQueryDefaultHelp
+#define WPBitmap_wpConfirmRenameFileWithExt WPFileSystem_wpConfirmRenameFileWithExt
+#define WPBitmap_wpQueryIcon WPObject_wpQueryIcon
+#define WPBitmap_wpSaveState WPObject_wpSaveState
+#define WPBitmap_wpSetup WPObject_wpSetup
+#define WPBitmap_wpRender WPObject_wpRender
+#define WPBitmap_wpConfirmKeepAssoc WPFileSystem_wpConfirmKeepAssoc
+#define WPBitmap_wpQueryType WPFileSystem_wpQueryType
+#define WPBitmap_wpSetAttr WPFileSystem_wpSetAttr
+#define WPBitmap_wpQueryAttr WPFileSystem_wpQueryAttr
+#define WPBitmap_wpAddFile1Page WPFileSystem_wpAddFile1Page
+#define WPBitmap_wpAddFile2Page WPFileSystem_wpAddFile2Page
+#define WPBitmap_wpAddFile3Page WPFileSystem_wpAddFile3Page
+#define WPBitmap_wpAddFileMenuPage WPFileSystem_wpAddFileMenuPage
+#define WPBitmap_wpQueryCreation WPFileSystem_wpQueryCreation
+#define WPBitmap_wpQueryLastAccess WPFileSystem_wpQueryLastAccess
+#define WPBitmap_wpQueryLastWrite WPFileSystem_wpQueryLastWrite
+#define WPBitmap_wpQueryFileSize WPFileSystem_wpQueryFileSize
+#define WPBitmap_wpQueryEASize WPFileSystem_wpQueryEASize
+#define WPBitmap_wpSetDateInfo WPFileSystem_wpSetDateInfo
+#define WPBitmap_wpSetFileSizeInfo WPFileSystem_wpSetFileSizeInfo
+#define WPBitmap_wpQueryRefreshFlags WPFileSystem_wpQueryRefreshFlags
+#define WPBitmap_wpSetRefreshFlags WPFileSystem_wpSetRefreshFlags
+#define WPBitmap_wpPrintPlainTextFile WPFileSystem_wpPrintPlainTextFile
+#define WPBitmap_wpSetTitleAndRenameFile WPFileSystem_wpSetTitleAndRenameFile
+#define WPBitmap_wpVerifyUpdateAccess WPFileSystem_wpVerifyUpdateAccess
+#define WPBitmap_wpQueryEASupport WPFileSystem_wpQueryEASupport
+#define WPBitmap_wpAddUserItemsToPopupMenu WPFileSystem_wpAddUserItemsToPopupMenu
+#define WPBitmap_wpIsDiskSwapped WPFileSystem_wpIsDiskSwapped
+#define WPBitmap_wpQueryRealName WPFileSystem_wpQueryRealName
+#define WPBitmap_wpQueryFilename WPFileSystem_wpQueryFilename
+#define WPBitmap_wpQueryDisk WPFileSystem_wpQueryDisk
+#define WPBitmap_wpQueryDateInfo WPFileSystem_wpQueryDateInfo
+#define WPBitmap_wpQueryFileSizeL WPFileSystem_wpQueryFileSizeL
+#define WPBitmap_wpSetFileSizeL WPFileSystem_wpSetFileSizeL
+#define WPBitmap_wpQueryHandle WPObject_wpQueryHandle
+#define WPBitmap_wpSaveImmediate WPObject_wpSaveImmediate
+#define WPBitmap_wpSetTitle WPObject_wpSetTitle
+#define WPBitmap_wpViewObject WPObject_wpViewObject
+#define WPBitmap_wpSwitchTo WPObject_wpSwitchTo
+#define WPBitmap_wpCopyObject WPObject_wpCopyObject
+#define WPBitmap_wpCreateFromTemplate WPObject_wpCreateFromTemplate
+#define WPBitmap_wpMoveObject WPObject_wpMoveObject
+#define WPBitmap_wpQueryIconData WPObject_wpQueryIconData
+#define WPBitmap_wpSetIconData WPObject_wpSetIconData
+#define WPBitmap_wpQueryDetailsData WPObject_wpQueryDetailsData
+#define WPBitmap_wpDraggedOverObject WPObject_wpDraggedOverObject
+#define WPBitmap_wpDroppedOnObject WPObject_wpDroppedOnObject
+#define WPBitmap_wpQueryNameClashOptions WPObject_wpQueryNameClashOptions
+#define WPBitmap_wpAppendObject WPObject_wpAppendObject
+#define WPBitmap_wpReplaceObject WPObject_wpReplaceObject
+#define WPBitmap_wpQueryStyle WPObject_wpQueryStyle
+#define WPBitmap_wpFilterMenu WPObject_wpFilterMenu
+#define WPBitmap_wpDoesObjectMatch WPObject_wpDoesObjectMatch
+#define WPBitmap_wpIdentify WPObject_wpIdentify
+#define WPBitmap_wpIsDeleteable WPObject_wpIsDeleteable
+#define WPBitmap_wpAddObjectGeneralPage WPObject_wpAddObjectGeneralPage
+#define WPBitmap_wpAddObjectGeneralPage2 WPObject_wpAddObjectGeneralPage2
+#define WPBitmap_wpAddToObjUseList WPObject_wpAddToObjUseList
+#define WPBitmap_wpAllocMem WPObject_wpAllocMem
+#define WPBitmap_wpAssertObjectMutexSem WPObject_wpAssertObjectMutexSem
+#define WPBitmap_wpClose WPObject_wpClose
+#define WPBitmap_wpCnrInsertObject WPObject_wpCnrInsertObject
+#define WPBitmap_wpCnrRemoveObject WPObject_wpCnrRemoveObject
+#define WPBitmap_wpCnrSetEmphasis WPObject_wpCnrSetEmphasis
+#define WPBitmap_wpConfirmDelete WPObject_wpConfirmDelete
+#define WPBitmap_wpConfirmObjectTitle WPObject_wpConfirmObjectTitle
+#define WPBitmap_wpCopiedFromTemplate WPObject_wpCopiedFromTemplate
+#define WPBitmap_wpCreateAnother WPObject_wpCreateAnother
+#define WPBitmap_wpCreateShadowObject WPObject_wpCreateShadowObject
+#define WPBitmap_wpDelete WPObject_wpDelete
+#define WPBitmap_wpDeleteFromObjUseList WPObject_wpDeleteFromObjUseList
+#define WPBitmap_wpDisplayHelp WPObject_wpDisplayHelp
+#define WPBitmap_wpDisplayMenu WPObject_wpDisplayMenu
+#define WPBitmap_wpDrop WPObject_wpDrop
+#define WPBitmap_wpEndConversation WPObject_wpEndConversation
+#define WPBitmap_wpFilterPopupMenu WPObject_wpFilterPopupMenu
+#define WPBitmap_wpFindUseItem WPObject_wpFindUseItem
+#define WPBitmap_wpFree WPObject_wpFree
+#define WPBitmap_wpFreeMem WPObject_wpFreeMem
+#define WPBitmap_wpHide WPObject_wpHide
+#define WPBitmap_wpInsertPopupMenuItems WPObject_wpInsertPopupMenuItems
+#define WPBitmap_wpInsertMenuItems WPObject_wpInsertMenuItems
+#define WPBitmap_wpInsertSettingsPage WPObject_wpInsertSettingsPage
+#define WPBitmap_wpModifyPopupMenu WPObject_wpModifyPopupMenu
+#define WPBitmap_wpQueryConcurrentView WPObject_wpQueryConcurrentView
+#define WPBitmap_wpQueryButtonAppearance WPObject_wpQueryButtonAppearance
+#define WPBitmap_wpQueryConfirmations WPObject_wpQueryConfirmations
+#define WPBitmap_wpQueryDefaultView WPObject_wpQueryDefaultView
+#define WPBitmap_wpQueryError WPObject_wpQueryError
+#define WPBitmap_wpSetFolder WPObject_wpSetFolder
+#define WPBitmap_wpQueryFolder WPObject_wpQueryFolder
+#define WPBitmap_wpQueryMinWindow WPObject_wpQueryMinWindow
+#define WPBitmap_wpSetTaskRec WPObject_wpSetTaskRec
+#define WPBitmap_wpFindTaskRec WPObject_wpFindTaskRec
+#define WPBitmap_wpQueryTitle WPObject_wpQueryTitle
+#define WPBitmap_wpRegisterView WPObject_wpRegisterView
+#define WPBitmap_wpReleaseObjectMutexSem WPObject_wpReleaseObjectMutexSem
+#define WPBitmap_wpRenderComplete WPObject_wpRenderComplete
+#define WPBitmap_wpRequestObjectMutexSem WPObject_wpRequestObjectMutexSem
+#define WPBitmap_wpRestore WPObject_wpRestore
+#define WPBitmap_wpRestoreData WPObject_wpRestoreData
+#define WPBitmap_wpRestoreLong WPObject_wpRestoreLong
+#define WPBitmap_wpRestoreString WPObject_wpRestoreString
+#define WPBitmap_wpSaveData WPObject_wpSaveData
+#define WPBitmap_wpSaveDeferred WPObject_wpSaveDeferred
+#define WPBitmap_wpSaveLong WPObject_wpSaveLong
+#define WPBitmap_wpSaveString WPObject_wpSaveString
+#define WPBitmap_wpScanSetupString WPObject_wpScanSetupString
+#define WPBitmap_wpSetConcurrentView WPObject_wpSetConcurrentView
+#define WPBitmap_wpSetButtonAppearance WPObject_wpSetButtonAppearance
+#define WPBitmap_wpSetDefaultHelp WPObject_wpSetDefaultHelp
+#define WPBitmap_wpSetError WPObject_wpSetError
+#define WPBitmap_wpQueryScreenGroupID WPObject_wpQueryScreenGroupID
+#define WPBitmap_wpSetIcon WPObject_wpSetIcon
+#define WPBitmap_wpSetMinWindow WPObject_wpSetMinWindow
+#define WPBitmap_wpModifyStyle WPObject_wpModifyStyle
+#define WPBitmap_wpQueryTrueStyle WPObject_wpQueryTrueStyle
+#define WPBitmap_wpUnlockObject WPObject_wpUnlockObject
+#define WPBitmap_wpObjectReady WPObject_wpObjectReady
+#define WPBitmap_wpIsObjectInitialized WPObject_wpIsObjectInitialized
+#define WPBitmap_wpCreateShadowObjectExt WPObject_wpCreateShadowObjectExt
+#define WPBitmap_wpCnrDeleteUseItem WPObject_wpCnrDeleteUseItem
+#define WPBitmap_wpQueryCoreRecord WPObject_wpQueryCoreRecord
+#define WPBitmap_wpSetObjectID WPObject_wpSetObjectID
+#define WPBitmap_wpQueryObjectID WPObject_wpQueryObjectID
+#define WPBitmap_wpSetDefaultIconPos WPObject_wpSetDefaultIconPos
+#define WPBitmap_wpQueryDefaultIconPos WPObject_wpQueryDefaultIconPos
+#define WPBitmap_wpCnrRefreshDetails WPObject_wpCnrRefreshDetails
+#define WPBitmap_wpFindViewItem WPObject_wpFindViewItem
+#define WPBitmap_wpLockObject WPObject_wpLockObject
+#define WPBitmap_wpIsLocked WPObject_wpIsLocked
+#define WPBitmap_wpQueryContainerFlagPtr WPObject_wpQueryContainerFlagPtr
+#define WPBitmap_wpWaitForClose WPObject_wpWaitForClose
+#define WPBitmap_wpSetMenuStyle WPObject_wpSetMenuStyle
+#define WPBitmap_wpQueryMenuStyle WPObject_wpQueryMenuStyle
+#define WPBitmap_wpSetStyle WPObject_wpSetStyle
+#define WPBitmap_somInit SOMObject_somInit
+#define WPBitmap_somUninit SOMObject_somUninit
+#define WPBitmap_somDefaultCopyInit SOMObject_somDefaultCopyInit
+#define WPBitmap_somDefaultAssign SOMObject_somDefaultAssign
+#define WPBitmap_somDefaultConstCopyInit SOMObject_somDefaultConstCopyInit
+#define WPBitmap_somDefaultVCopyInit SOMObject_somDefaultVCopyInit
+#define WPBitmap_somDefaultConstVCopyInit SOMObject_somDefaultConstVCopyInit
+#define WPBitmap_somDefaultConstAssign SOMObject_somDefaultConstAssign
+#define WPBitmap_somDefaultVAssign SOMObject_somDefaultVAssign
+#define WPBitmap_somDefaultConstVAssign SOMObject_somDefaultConstVAssign
+#define WPBitmap_somFree SOMObject_somFree
+#define WPBitmap_somGetClass SOMObject_somGetClass
+#define WPBitmap_somGetClassName SOMObject_somGetClassName
+#define WPBitmap_somGetSize SOMObject_somGetSize
+#define WPBitmap_somIsA SOMObject_somIsA
+#define WPBitmap_somIsInstanceOf SOMObject_somIsInstanceOf
+#define WPBitmap_somRespondsTo SOMObject_somRespondsTo
+#define WPBitmap_somDispatch SOMObject_somDispatch
+#define WPBitmap_somClassDispatch SOMObject_somClassDispatch
+#define WPBitmap_somCastObj SOMObject_somCastObj
+#define WPBitmap_somResetObj SOMObject_somResetObj
+#define WPBitmap_somDispatchV SOMObject_somDispatchV
+#define WPBitmap_somDispatchL SOMObject_somDispatchL
+#define WPBitmap_somDispatchA SOMObject_somDispatchA
+#define WPBitmap_somDispatchD SOMObject_somDispatchD
+#define WPBitmap_somPrintSelf SOMObject_somPrintSelf
+#define WPBitmap_somDumpSelf SOMObject_somDumpSelf
+#define WPBitmap_somDumpSelfInt SOMObject_somDumpSelfInt
+#endif /* SOM_DONT_USE_INHERITED_MACROS */
+
+#endif       /* SOM_WPBitmap_h */
+
+#ifndef SOM_M_WPBitmap_h
+#define SOM_M_WPBitmap_h
+
+
+#include <som.h>
+
+/*
+ * -- This emitter treats Method Tokens as Thunks by default.
+ * -- Use the sc modifier "nothunks" to change this default
+ */
+#undef somresolve_
+#define somresolve_(obj,mToken) ((somMethodProc*)((void)obj, mToken))
+
+/*
+ * Define the class name as an object type
+ */
+#ifndef M_WPBitmap
+#define M_WPBitmap SOMObject
+#endif
+#include <wpimage.h>
+
+/*
+ * Start of bindings for IDL types
+ */
+
+
+/*
+ * End of bindings for IDL types.
+ */
+
+#define M_WPBitmap_MajorVersion 1
+#define M_WPBitmap_MinorVersion 2
+
+/*
+ * External name shortening if required
+ */
+#ifdef SOM_USE_SHORT_EXTERNAL_NAMES
+#define M_WPBitmapNewClass wpbmpc
+#pragma linkage(wpbmpc, system)
+#define M_WPBitmapClassData wpbmpd
+#define M_WPBitmapCClassData wpbmpx
+#endif /* SOM_USE_SHORT_EXTERNAL_NAMES */
+/*--------------Migration------------*/
+#define M_WPBitmap_classObj M_WPBitmapClassData.classObject
+#define _M_WPBitmap M_WPBitmap_classObj
+
+/*
+ * Declare the class creation procedure
+ */
+SOMEXTERN SOMClass * SOMLINK M_WPBitmapNewClass(integer4 somtmajorVersion,
+		integer4 somtminorVersion);
+#pragma linkage(M_WPBitmapNewClass, system)
+
+/*
+ * Declare the class data structure
+ */
+SOMEXTERN struct M_WPBitmapClassDataStructure {
+	SOMClass *classObject;
+} SOMDLINK M_WPBitmapClassData;
+
+/*
+ * Declare the C specific class data structure
+ */
+SOMEXTERN struct M_WPBitmapCClassDataStructure {
+	somMethodTabs parentMtab;
+	somDToken instanceDataToken;
+} SOMDLINK M_WPBitmapCClassData;
+
+/*
+ * New and Renew macros for M_WPBitmap
+ */
+#define M_WPBitmapNew() \
+   ( _M_WPBitmap ? \
+	_somNew(_M_WPBitmap) \
+	: ( M_WPBitmapNewClass(\
+		M_WPBitmap_MajorVersion, \
+		M_WPBitmap_MinorVersion),\
+	   _somNew(_M_WPBitmap)))
+#define M_WPBitmapRenew(buf) \
+   ( _M_WPBitmap ? \
+	_somRenew(_M_WPBitmap, buf) \
+	: ( M_WPBitmapNewClass(\
+		M_WPBitmap_MajorVersion, \
+		M_WPBitmap_MinorVersion),\
+	   _somRenew(_M_WPBitmap, buf)))
+
+/*
+ * Override method: wpclsQueryInstanceFilter
+ */
+#define M_WPBitmap_wpclsQueryInstanceFilter(somSelf) \
+	M_WPFileSystem_wpclsQueryInstanceFilter(somSelf)
+
+/*
+ * Override method: wpclsQueryInstanceType
+ */
+#define M_WPBitmap_wpclsQueryInstanceType(somSelf) \
+	M_WPFileSystem_wpclsQueryInstanceType(somSelf)
+
+/*
+ * Override method: wpclsInitData
+ */
+#define M_WPBitmap_wpclsInitData(somSelf) \
+	M_WPObject_wpclsInitData(somSelf)
+
+/*
+ * Override method: wpclsQueryStyle
+ */
+#define M_WPBitmap_wpclsQueryStyle(somSelf) \
+	M_WPObject_wpclsQueryStyle(somSelf)
+
+/*
+ * Override method: wpclsQueryTitle
+ */
+#define M_WPBitmap_wpclsQueryTitle(somSelf) \
+	M_WPObject_wpclsQueryTitle(somSelf)
+
+/*
+ * Override method: wpclsQueryDefaultHelp
+ */
+#define M_WPBitmap_wpclsQueryDefaultHelp(somSelf,pHelpPanelId,pszHelpLibrary) \
+	M_WPObject_wpclsQueryDefaultHelp(somSelf,pHelpPanelId,pszHelpLibrary)
+#ifndef SOM_DONT_USE_INHERITED_MACROS
+#define M_WPBitmap_wpclsAddClipboardAssoc M_WPDataFile_wpclsAddClipboardAssoc
+#define M_WPBitmap_wpclsEnumClipboardClasses M_WPDataFile_wpclsEnumClipboardClasses
+#define M_WPBitmap_wpclsQueryIconData M_WPObject_wpclsQueryIconData
+#define M_WPBitmap_wpclsQueryDefaultView M_WPObject_wpclsQueryDefaultView
+#define M_WPBitmap_wpclsUnInitData M_WPObject_wpclsUnInitData
+#define M_WPBitmap_wpclsQuerySettingsPageSize M_WPObject_wpclsQuerySettingsPageSize
+#define M_WPBitmap_wpclsQueryAwakeObject M_WPFileSystem_wpclsQueryAwakeObject
+#define M_WPBitmap_wpclsFileSysExists M_WPFileSystem_wpclsFileSysExists
+#define M_WPBitmap_wpclsQueryObjectFromPath M_WPFileSystem_wpclsQueryObjectFromPath
+#define M_WPBitmap_wpclsQueryInstanceClass M_WPFileSystem_wpclsQueryInstanceClass
+#define M_WPBitmap_wpclsQueryDetailsInfo M_WPObject_wpclsQueryDetailsInfo
+#define M_WPBitmap_wpclsQuerySearchInfo M_WPObject_wpclsQuerySearchInfo
+#define M_WPBitmap_wpclsQueryExtendedCriteria M_WPObject_wpclsQueryExtendedCriteria
+#define M_WPBitmap_wpclsNew M_WPObject_wpclsNew
+#define M_WPBitmap_wpclsObjectFromHandle M_WPObject_wpclsObjectFromHandle
+#define M_WPBitmap_wpclsCreateDefaultTemplates M_WPObject_wpclsCreateDefaultTemplates
+#define M_WPBitmap_wpclsMakeAwake M_WPObject_wpclsMakeAwake
+#define M_WPBitmap_wpclsQueryDetails M_WPObject_wpclsQueryDetails
+#define M_WPBitmap_wpclsQueryFolder M_WPObject_wpclsQueryFolder
+#define M_WPBitmap_wpclsQueryIcon M_WPObject_wpclsQueryIcon
+#define M_WPBitmap_wpclsFindObjectFirst M_WPObject_wpclsFindObjectFirst
+#define M_WPBitmap_wpclsFindObjectNext M_WPObject_wpclsFindObjectNext
+#define M_WPBitmap_wpclsFindObjectEnd M_WPObject_wpclsFindObjectEnd
+#define M_WPBitmap_wpclsSetError M_WPObject_wpclsSetError
+#define M_WPBitmap_wpclsQueryError M_WPObject_wpclsQueryError
+#define M_WPBitmap_wpclsQueryObject M_WPObject_wpclsQueryObject
+#define M_WPBitmap_wpclsQueryButtonAppearance M_WPObject_wpclsQueryButtonAppearance
+#define M_WPBitmap_wpclsDecUsage M_WPObject_wpclsDecUsage
+#define M_WPBitmap_wpclsIncUsage M_WPObject_wpclsIncUsage
+#define M_WPBitmap_wpclsInsertMultipleObjects M_WPObject_wpclsInsertMultipleObjects
+#define M_WPBitmap_wpclsFindOneObject M_WPObject_wpclsFindOneObject
+#define M_WPBitmap_wpclsSetSettingsPageSize M_WPObject_wpclsSetSettingsPageSize
+#define M_WPBitmap_wpclsSetIconData M_WPObject_wpclsSetIconData
+#define M_WPBitmap_wpclsSetIcon M_WPObject_wpclsSetIcon
+#define M_WPBitmap_wpclsRemoveObjects M_WPObject_wpclsRemoveObjects
+#define M_WPBitmap_somUninit SOMObject_somUninit
+#define M_WPBitmap_somClassReady SOMClass_somClassReady
+#define M_WPBitmap_somNew SOMClass_somNew
+#define M_WPBitmap_somRenew SOMClass_somRenew
+#define M_WPBitmap__get_somDataAlignment SOMClass__get_somDataAlignment
+#define M_WPBitmap__get_somInstanceDataOffsets SOMClass__get_somInstanceDataOffsets
+#define M_WPBitmap__get_somDirectInitClasses SOMClass__get_somDirectInitClasses
+#define M_WPBitmap__set_somDirectInitClasses SOMClass__set_somDirectInitClasses
+#define M_WPBitmap_somNewNoInit SOMClass_somNewNoInit
+#define M_WPBitmap_somRenewNoInit SOMClass_somRenewNoInit
+#define M_WPBitmap_somRenewNoZero SOMClass_somRenewNoZero
+#define M_WPBitmap_somRenewNoInitNoZero SOMClass_somRenewNoInitNoZero
+#define M_WPBitmap_somAllocate SOMClass_somAllocate
+#define M_WPBitmap_somDeallocate SOMClass_somDeallocate
+#define M_WPBitmap__get_somClassAllocate SOMClass__get_somClassAllocate
+#define M_WPBitmap__get_somClassDeallocate SOMClass__get_somClassDeallocate
+#define M_WPBitmap_somGetInstanceInitMask SOMClass_somGetInstanceInitMask
+#define M_WPBitmap_somGetInstanceDestructionMask SOMClass_somGetInstanceDestructionMask
+#define M_WPBitmap_somGetInstanceAssignmentMask SOMClass_somGetInstanceAssignmentMask
+#define M_WPBitmap_somInitClass SOMClass_somInitClass
+#define M_WPBitmap_somInitMIClass SOMClass_somInitMIClass
+#define M_WPBitmap_somAddStaticMethod SOMClass_somAddStaticMethod
+#define M_WPBitmap_somAddDynamicMethod SOMClass_somAddDynamicMethod
+#define M_WPBitmap_somOverrideSMethod SOMClass_somOverrideSMethod
+#define M_WPBitmap_somGetApplyStub SOMClass_somGetApplyStub
+#define M_WPBitmap_somGetClassData SOMClass_somGetClassData
+#define M_WPBitmap_somSetClassData SOMClass_somSetClassData
+#define M_WPBitmap_somGetClassMtab SOMClass_somGetClassMtab
+#define M_WPBitmap_somGetInstanceOffset SOMClass_somGetInstanceOffset
+#define M_WPBitmap_somGetInstancePartSize SOMClass_somGetInstancePartSize
+#define M_WPBitmap_somGetInstanceSize SOMClass_somGetInstanceSize
+#define M_WPBitmap_somGetInstanceToken SOMClass_somGetInstanceToken
+#define M_WPBitmap_somGetMemberToken SOMClass_somGetMemberToken
+#define M_WPBitmap_somGetMethodData SOMClass_somGetMethodData
+#define M_WPBitmap_somGetRdStub SOMClass_somGetRdStub
+#define M_WPBitmap_somGetMethodDescriptor SOMClass_somGetMethodDescriptor
+#define M_WPBitmap_somGetMethodIndex SOMClass_somGetMethodIndex
+#define M_WPBitmap_somGetMethodToken SOMClass_somGetMethodToken
+#define M_WPBitmap_somGetName SOMClass_somGetName
+#define M_WPBitmap_somGetNthMethodData SOMClass_somGetNthMethodData
+#define M_WPBitmap_somGetNthMethodInfo SOMClass_somGetNthMethodInfo
+#define M_WPBitmap_somGetNumMethods SOMClass_somGetNumMethods
+#define M_WPBitmap_somGetNumStaticMethods SOMClass_somGetNumStaticMethods
+#define M_WPBitmap_somGetParent SOMClass_somGetParent
+#define M_WPBitmap_somGetParents SOMClass_somGetParents
+#define M_WPBitmap_somGetPClsMtab SOMClass_somGetPClsMtab
+#define M_WPBitmap_somGetPClsMtabs SOMClass_somGetPClsMtabs
+#define M_WPBitmap_somGetVersionNumbers SOMClass_somGetVersionNumbers
+#define M_WPBitmap_somSetMethodDescriptor SOMClass_somSetMethodDescriptor
+#define M_WPBitmap_somFindMethod SOMClass_somFindMethod
+#define M_WPBitmap_somFindMethodOk SOMClass_somFindMethodOk
+#define M_WPBitmap_somFindSMethod SOMClass_somFindSMethod
+#define M_WPBitmap_somFindSMethodOk SOMClass_somFindSMethodOk
+#define M_WPBitmap_somLookupMethod SOMClass_somLookupMethod
+#define M_WPBitmap_somCheckVersion SOMClass_somCheckVersion
+#define M_WPBitmap_somDescendedFrom SOMClass_somDescendedFrom
+#define M_WPBitmap_somSupportsMethod SOMClass_somSupportsMethod
+#define M_WPBitmap_somDefinedMethod SOMClass_somDefinedMethod
+#define M_WPBitmap_somOverrideMtab SOMClass_somOverrideMtab
+#define M_WPBitmap_somDefaultInit SOMObject_somDefaultInit
+#define M_WPBitmap_somDestruct SOMObject_somDestruct
+#define M_WPBitmap_somDefaultCopyInit SOMObject_somDefaultCopyInit
+#define M_WPBitmap_somDefaultAssign SOMObject_somDefaultAssign
+#define M_WPBitmap_somDefaultConstCopyInit SOMObject_somDefaultConstCopyInit
+#define M_WPBitmap_somDefaultVCopyInit SOMObject_somDefaultVCopyInit
+#define M_WPBitmap_somDefaultConstVCopyInit SOMObject_somDefaultConstVCopyInit
+#define M_WPBitmap_somDefaultConstAssign SOMObject_somDefaultConstAssign
+#define M_WPBitmap_somDefaultVAssign SOMObject_somDefaultVAssign
+#define M_WPBitmap_somDefaultConstVAssign SOMObject_somDefaultConstVAssign
+#define M_WPBitmap_somInit SOMObject_somInit
+#define M_WPBitmap_somFree SOMObject_somFree
+#define M_WPBitmap_somGetClass SOMObject_somGetClass
+#define M_WPBitmap_somGetClassName SOMObject_somGetClassName
+#define M_WPBitmap_somGetSize SOMObject_somGetSize
+#define M_WPBitmap_somIsA SOMObject_somIsA
+#define M_WPBitmap_somIsInstanceOf SOMObject_somIsInstanceOf
+#define M_WPBitmap_somRespondsTo SOMObject_somRespondsTo
+#define M_WPBitmap_somDispatch SOMObject_somDispatch
+#define M_WPBitmap_somClassDispatch SOMObject_somClassDispatch
+#define M_WPBitmap_somCastObj SOMObject_somCastObj
+#define M_WPBitmap_somResetObj SOMObject_somResetObj
+#define M_WPBitmap_somDispatchV SOMObject_somDispatchV
+#define M_WPBitmap_somDispatchL SOMObject_somDispatchL
+#define M_WPBitmap_somDispatchA SOMObject_somDispatchA
+#define M_WPBitmap_somDispatchD SOMObject_somDispatchD
+#define M_WPBitmap_somPrintSelf SOMObject_somPrintSelf
+#define M_WPBitmap_somDumpSelf SOMObject_somDumpSelf
+#define M_WPBitmap_somDumpSelfInt SOMObject_somDumpSelfInt
+#endif /* SOM_DONT_USE_INHERITED_MACROS */
+
+#endif       /* SOM_M_WPBitmap_h */
Index: /tags/CWMM-0.3.0_GA/classes/inc/wpfolder.h
===================================================================
--- /tags/CWMM-0.3.0_GA/classes/inc/wpfolder.h	(revision 213)
+++ /tags/CWMM-0.3.0_GA/classes/inc/wpfolder.h	(revision 213)
@@ -0,0 +1,2252 @@
+
+/*
+ * This file was generated by the SOM Compiler.
+ * FileName: h:\include\wpfolder.h
+ * Generated using:
+ *     SOM Precompiler somipc: 2.29.1.17
+ *     SOM Emitter emith: 2.47
+ */
+
+/*
+ *   Module Header
+ * 
+ *   Module Name: WPOBJECT
+ * 
+ *   OS/2 Presentation Manager Workplace class definitions
+ * 
+ *   Copyright (c) International Business Machines Corporation 1991, 1992
+ * 
+ */
+
+
+#ifndef SOM_WPFolder_h
+#define SOM_WPFolder_h
+
+
+#include <som.h>
+
+/*
+ * -- This emitter treats Method Tokens as Thunks by default.
+ * -- Use the sc modifier "nothunks" to change this default
+ */
+#undef somresolve_
+#define somresolve_(obj,mToken) ((somMethodProc*)((void)obj, mToken))
+
+/*
+ * Define the class name as an object type
+ */
+#ifndef WPFolder
+#define WPFolder SOMObject
+#endif
+#include <wpfsys.h>
+
+/*
+ * Start of bindings for IDL types
+ */
+
+#ifndef SOMClass
+    #define SOMClass SOMObject
+#endif /* SOMClass */
+#ifndef WPFolder
+    #define WPFolder SOMObject
+#endif /* WPFolder */
+#ifndef M_WPObject
+    #define M_WPObject SOMObject
+#endif /* M_WPObject */
+#ifndef WPObject
+    #define WPObject SOMObject
+#endif /* WPObject */
+#ifndef WPImageFile
+    #define WPImageFile SOMObject
+#endif /* WPImageFile */
+#ifndef M_WPFileSystem
+    #define M_WPFileSystem SOMObject
+#endif /* M_WPFileSystem */
+#ifndef M_WPFolder
+    #define M_WPFolder SOMObject
+#endif /* M_WPFolder */
+
+/*
+ * End of bindings for IDL types.
+ */
+
+/*
+ * Passthru lines: File: "C.h", "after"
+ */
+
+      /* Folder flags */
+
+      #define FOI_POPULATEDWITHALL      0x0001
+      #define FOI_POPULATEDWITHFOLDERS  0x0002
+      #define FOI_WORKAREA              0x0004
+      #define FOI_CHANGEFONT            0x0008        /* anti-recursion flag */
+      #define FOI_WAMINIMIZED           0x0020
+      #define FOI_WASTARTONRESTORE      0x0040
+      #define FOI_NOREFRESHVIEWS        0x0080
+      #define FOI_ASYNCREFRESHONOPEN    0x0100
+      #define FOI_TREEPOPULATED         0x0200
+      #define FOI_POPULATEINPROGRESS    0x0400                          /*DORM*/
+      #define FOI_REFRESHINPROGRESS     0x0800
+      #define FOI_FIRSTPOPULATE         0x1000  /* folder has no iconposdata */ //LD62414
+      #define FOI_WAMCRINPROGRESS       0x2000  /* Minimize, close, restore in progress ihs67096 */
+      #define FOI_CNRBKGNDOLDFORMAT     0x4000  /* CnrBkgnd saved in old format   ihs77154 */
+      #define FOI_CHANGEICONBGNDCOLOR   0x8000  /* Icon Text Background Color changing ihs79998 */
+      #define FOI_CHANGEICONTEXTCOLOR   0x00010000 /* Icon Text Color changing    ihs89146 */
+      #define FOI_DELETEINPROGRESS      0x00020000 /* To prevent wpFree from repopulating */
+
+      /* Open views for the wpOpen() method */
+
+      #define OPEN_TREE          101
+      #define OPEN_DETAILS       102
+
+      /* Folder save-restore keys */
+
+      #define IDKEY_FDRCONTENTATTR     2900
+      #define IDKEY_FDRTREEATTR        2901
+      #define IDKEY_FDRCVLFONT         2902
+      #define IDKEY_FDRCVNFONT         2903
+      #define IDKEY_FDRCVIFONT         2904
+      #define IDKEY_FDRTVLFONT         2905
+      #define IDKEY_FDRTVNFONT         2906
+      #define IDKEY_FDRDETAILSATTR     2907
+      #define IDKEY_FDRDVFONT          2908
+      #define IDKEY_FDRDETAILSCLASS    2909
+      #define IDKEY_FDRICONPOS         2910
+      #define IDKEY_FDRINVISCOLUMNS    2914
+      #define IDKEY_FDRINCCLASS        2920
+      #define IDKEY_FDRINCNAME         2921
+      #define IDKEY_FDRFSYSSEARCHINFO  2922
+      #define IDKEY_FILTERCONTENT      2923
+      #define IDKEY_CNRBACKGROUND      2924
+      #define IDKEY_FDRINCCRITERIA     2925
+      #define IDKEY_FDRICONVIEWPOS     2926
+      #define IDKEY_FDRSORTCLASS       2927
+      #define IDKEY_FDRSORTATTRIBS     2928
+      #define IDKEY_FDRSORTINFO        2929
+      #define IDKEY_FDRSNEAKYCOUNT     2930                              /*SNK*/
+      #define IDKEY_FDRLONGARRAY       2931
+      #define IDKEY_FDRSTRARRAY        2932
+      #define IDKEY_FDRCNRBACKGROUND   2933  // This key was only used in
+                                             // internal drivers 8.117-8.139
+      #define IDKEY_FDRBKGNDIMAGEFILE  2934
+      #define IDKEY_FDRBACKGROUND      2935
+      #define IDKEY_FDRSELFCLOSE       2936
+
+      /* Miscellaneous */
+
+      #define PPFONTSTRSIZE 20
+
+      #define ICONPOSSIZE(pI) ( sizeof(ICONPOS) + strlen(pI->szIdentity) )
+      #define PARTIAL_FILLFOLDER_SEM_TIMEOUT 5   /* avoid wasteful       */     //LD62414
+                                                 /* SEM_INDEFEINTE_WAIT  */     //LD62414
+      #define GETATTR(View) (View == OPEN_CONTENTS ? _ContentAttr : \ 
+                             (View == OPEN_TREE ? _TreeAttr : _DetailsAttr))
+      #define FOLDER_DEFATTRS (CV_ICON | CA_OWNERPAINTBACKGROUND     |  \ 
+                               CA_MIXEDTARGETEMPH | CA_OWNERDRAW)
+      #define FOLDER_DEFTREEATTRS (CV_ICON | CA_OWNERPAINTBACKGROUND |  \ 
+                                   CV_TREE | CA_TREELINE | CA_OWNERDRAW)
+      #define FOLDER_DEFDETAILS (CV_DETAIL | CA_OWNERPAINTBACKGROUND |  \ 
+                       CV_MINI | CA_DETAILSVIEWTITLES | CA_MIXEDTARGETEMPH)
+      #define FOLDER_DEFSORT NULL
+
+      /* wpSearchFolder structures */
+       typedef struct _SEARCH_INFO {
+          M_WPObject *ClassToBeFound;
+          BOOL   fSkipExtendedSearchCriteria;
+          PVOID  pvoidExtendedCriteria;
+       } SEARCH_INFO;
+       typedef SEARCH_INFO *PSEARCH_INFO;
+
+
+
+#define WPFolder_MajorVersion 1
+#define WPFolder_MinorVersion 2
+
+/*
+ * External name shortening if required
+ */
+#ifdef SOM_USE_SHORT_EXTERNAL_NAMES
+#define WPFolderNewClass wpfdrc
+#pragma linkage(wpfdrc, system)
+#define WPFolderClassData wpfdrd
+#define WPFolderCClassData wpfdrx
+#endif /* SOM_USE_SHORT_EXTERNAL_NAMES */
+/*--------------Migration------------*/
+#define WPFolder_classObj WPFolderClassData.classObject
+#define _WPFolder WPFolder_classObj
+
+/*
+ * Declare the class creation procedure
+ */
+SOMEXTERN SOMClass * SOMLINK WPFolderNewClass(integer4 somtmajorVersion,
+		integer4 somtminorVersion);
+#pragma linkage(WPFolderNewClass, system)
+
+/*
+ * Declare the class data structure
+ */
+SOMEXTERN struct WPFolderClassDataStructure {
+	SOMClass *classObject;
+	somMToken wpSetFldrFlags;
+	somMToken wpQueryFldrFlags;
+	somMToken wpSetFldrFont;
+	somMToken wpQueryFldrFont;
+	somMToken wpSetNextIconPos;
+	somMToken wpQueryNextIconPos;
+	somMToken wpPopulate;
+	somMToken wpAddToContent;
+	somMToken wpQueryContent;
+	somMToken wpAddFolderView1Page;
+	somMToken wpAddFolderView2Page;
+	somMToken wpAddFolderView3Page;
+	somMToken wpAddFolderIncludePage;
+	somMToken wpAddFolderSortPage;
+	somMToken wpAddFolderBackgroundPage;
+	somMToken wpInitIconPosData;
+	somMToken wpFreeIconPosData;
+	somMToken wpQueryIconPosition;
+	somMToken wpStoreIconPosData;
+	somMToken wpDeleteFromContent;
+	somMToken wpSetFldrAttr;
+	somMToken wpQueryFldrAttr;
+	somMToken wpSetFldrSort;
+	somMToken wpQueryFldrSort;
+	somMToken wpRestoreFldrRunObjs;
+	somMToken wpStoreFldrRunObjs;
+	somMToken withdrawn30;
+	somMToken withdrawn31;
+	somMToken wpDeleteContents;
+	somMToken wpQueryOpenFolders;
+	somMToken wpSetNextOpenFldr;
+	somMToken wpSearchFolder;
+	somMToken wpSetFldrDetailsClass;
+	somMToken wpQueryFldrDetailsClass;
+	somMToken wpRefresh;
+	somMToken wpSetDetailsColumnVisibility;
+	somMToken wpIsDetailsColumnVisible;
+	somMToken wpQuerySortArray;
+	somMToken wpSetSortArray;
+	somMToken wpQuerySortInfo;
+	somMToken wpSetSortInfo;
+	somMToken wpSetFldrSortClass;
+	somMToken wpQueryFldrSortClass;
+	somMToken wpSetSortAttribAvailable;
+	somMToken wpIsSortAttribAvailable;
+	somMToken wpQueryFldrFilter;
+	somMToken wpContainsFolders;
+	somMToken wpQueryBkgnd;
+	somMToken wpQueryIconViewPos;
+	somMToken wpQueryDefaultView;
+	somMToken wpAddFirstChild;
+	somMToken _get_FirstObj;
+	somMToken wpHideFldrRunObjs;
+	somMToken wpFSNotifyFolder;
+	somMToken wpAddNotification;
+	somMToken wpDeleteNotification;
+	somMToken wpProcessNotification;
+	somMToken wpModifySneakyCount;
+	somMToken wpSneakySupported;
+	somMToken wpAssertFolderMutexSem;
+	somMToken wpReleaseFolderMutexSem;
+	somMToken wpRequestFolderMutexSem;
+	somMToken wpQueryContentHashTable;
+	somMToken wpQueryNextOpenFldr;
+	somMToken _get_hmtxOneFindAtATime;
+	somMToken wpRequestFindMutexSem;
+	somMToken wpReleaseFindMutexSem;
+	somMToken _get_hevFillFolder;
+	somMToken wpModifyFldrFlags;
+	somMToken wpQueryTrueFldrFont;
+	somMToken wpRemoveFldrFont;
+	somMToken wpRemoveAllFldrInstanceFonts;
+	somMToken wpRefreshNotebookPage;
+	somMToken wpQueryRWMonitorObject;
+	somMToken wpQueryIconTextBackgroundColor;
+	somMToken wpSetIconTextBackgroundColor;
+	somMToken wpRedrawFolderBackground;
+	somMToken wpMakeInstanceBackground;
+	somMToken wpUseDefaultBackground;
+	somMToken wpQueryIconTextColor;
+	somMToken wpSetIconTextColor;
+	somMToken wpQueryIconTextVisibility;
+	somMToken wpSetIconTextVisibility;
+	somMToken wpAddFolderSelfClosePage;
+	somMToken wpSetFldrSelfClose;
+	somMToken wpQueryFldrSelfClose;
+	somMToken _get_retaddrFindSemOwner;
+	somMToken wpIsOwnView;
+	somMToken wpSetIconDataN;
+	somMToken wpSetIconN;
+	somMToken wpQueryIconN;
+	somMToken wpSetFolderSelfClosePageID;
+	somMToken wpQueryFolderSelfClosePageID;
+	somMToken wpQueryIconDataN;
+	somMToken wpApplyIconPosData;
+	somMToken wpAddFolderMenu2Page;
+	somMToken wpSetMenuBarVisibility;
+	somMToken wpQueryMenuBarVisibility;
+	somMToken wpFolderPrivate43;
+	somMToken wpFolderPrivate44;
+	somMToken wpFolderPrivate45;
+	somMToken wpFlushNotifications;
+	somMToken wpSetShadowTextColor;
+	somMToken wpQueryShadowTextColor;
+	somMToken wpSetFldrBackground;
+	somMToken wpQueryFldrBackground;
+	somMToken wpSetFldrGrid;
+	somMToken wpQueryFldrGrid;
+	somMToken _get_LastObj;
+} SOMDLINK WPFolderClassData;
+
+/*
+ * Declare the C specific class data structure
+ */
+SOMEXTERN struct WPFolderCClassDataStructure {
+	somMethodTabs parentMtab;
+	somDToken instanceDataToken;
+} SOMDLINK WPFolderCClassData;
+
+/*
+ * New and Renew macros for WPFolder
+ */
+#define WPFolderNew() \
+   ( _WPFolder ? \
+	_somNew(_WPFolder) \
+	: ( WPFolderNewClass(\
+		WPFolder_MajorVersion, \
+		WPFolder_MinorVersion),\
+	   _somNew(_WPFolder)))
+#define WPFolderRenew(buf) \
+   ( _WPFolder ? \
+	_somRenew(_WPFolder, buf) \
+	: ( WPFolderNewClass(\
+		WPFolder_MajorVersion, \
+		WPFolder_MinorVersion),\
+	   _somRenew(_WPFolder, buf)))
+
+/*
+ * Override method: wpInitData
+ */
+#define WPFolder_wpInitData(somSelf) \
+	WPObject_wpInitData(somSelf)
+
+/*
+ * Override method: wpUnInitData
+ */
+#define WPFolder_wpUnInitData(somSelf) \
+	WPObject_wpUnInitData(somSelf)
+
+/*
+ * Override method: wpFree
+ */
+#define WPFolder_wpFree(somSelf) \
+	WPObject_wpFree(somSelf)
+
+/*
+ * Override method: wpDelete
+ */
+#define WPFolder_wpDelete(somSelf,fConfirmations) \
+	WPObject_wpDelete(somSelf,fConfirmations)
+
+/*
+ * Override method: wpConfirmDelete
+ */
+#define WPFolder_wpConfirmDelete(somSelf,fConfirmations) \
+	WPObject_wpConfirmDelete(somSelf,fConfirmations)
+
+/*
+ * Override method: wpSaveState
+ */
+#define WPFolder_wpSaveState(somSelf) \
+	WPObject_wpSaveState(somSelf)
+
+/*
+ * Override method: wpRestoreState
+ */
+#define WPFolder_wpRestoreState(somSelf,ulReserved) \
+	WPObject_wpRestoreState(somSelf,ulReserved)
+
+/*
+ * Override method: wpMenuItemSelected
+ */
+#define WPFolder_wpMenuItemSelected(somSelf,hwndFrame,ulMenuId) \
+	WPObject_wpMenuItemSelected(somSelf,hwndFrame,ulMenuId)
+
+/*
+ * Override method: wpAddSettingsPages
+ */
+#define WPFolder_wpAddSettingsPages(somSelf,hwndNotebook) \
+	WPObject_wpAddSettingsPages(somSelf,hwndNotebook)
+
+/*
+ * Override method: wpOpen
+ */
+#define WPFolder_wpOpen(somSelf,hwndCnr,ulView,param) \
+	WPObject_wpOpen(somSelf,hwndCnr,ulView,param)
+
+/*
+ * Override method: wpSetup
+ */
+#define WPFolder_wpSetup(somSelf,pszSetupString) \
+	WPObject_wpSetup(somSelf,pszSetupString)
+
+/*
+ * Override method: wpMoveObject
+ */
+#define WPFolder_wpMoveObject(somSelf,Folder) \
+	WPObject_wpMoveObject(somSelf,Folder)
+
+/*
+ * Override method: wpDrop
+ */
+#define WPFolder_wpDrop(somSelf,hwndCnr,pdrgInfo,pdrgItem) \
+	WPObject_wpDrop(somSelf,hwndCnr,pdrgInfo,pdrgItem)
+
+/*
+ * Override method: wpDragOver
+ */
+#define WPFolder_wpDragOver(somSelf,hwndCnr,pdrgInfo) \
+	WPObject_wpDragOver(somSelf,hwndCnr,pdrgInfo)
+
+/*
+ * Override method: wpMenuItemHelpSelected
+ */
+#define WPFolder_wpMenuItemHelpSelected(somSelf,MenuId) \
+	WPObject_wpMenuItemHelpSelected(somSelf,MenuId)
+
+/*
+ * Override method: wpAddFile3Page
+ */
+#define WPFolder_wpAddFile3Page(somSelf,hwndNotebook) \
+	WPFileSystem_wpAddFile3Page(somSelf,hwndNotebook)
+
+/*
+ * Override method: wpAddFile2Page
+ */
+#define WPFolder_wpAddFile2Page(somSelf,hwndNotebook) \
+	WPFileSystem_wpAddFile2Page(somSelf,hwndNotebook)
+
+/*
+ * Override method: wpFormatDragItem
+ */
+#define WPFolder_wpFormatDragItem(somSelf,pdrgItem) \
+	WPObject_wpFormatDragItem(somSelf,pdrgItem)
+
+/*
+ * Override method: wpRender
+ */
+#define WPFolder_wpRender(somSelf,pdxfer) \
+	WPObject_wpRender(somSelf,pdxfer)
+
+/*
+ * Override method: wpRefresh
+ */
+#define WPFolder_wpRefresh(somSelf,ulView,pReserved) \
+	WPFileSystem_wpRefresh(somSelf,ulView,pReserved)
+
+/*
+ * Override method: wpQueryDefaultView
+ */
+#define WPFolder_wpQueryDefaultView(somSelf) \
+	WPObject_wpQueryDefaultView(somSelf)
+
+/*
+ * Override method: wpRenderComplete
+ */
+#define WPFolder_wpRenderComplete(somSelf,pdxfer,ulResult) \
+	WPObject_wpRenderComplete(somSelf,pdxfer,ulResult)
+
+/*
+ * Override method: wpAddFileMenuPage
+ */
+#define WPFolder_wpAddFileMenuPage(somSelf,hwndNotebook) \
+	WPFileSystem_wpAddFileMenuPage(somSelf,hwndNotebook)
+
+/*
+ * Override method: wpQueryDefaultHelp
+ */
+#define WPFolder_wpQueryDefaultHelp(somSelf,pHelpPanelId,HelpLibrary) \
+	WPObject_wpQueryDefaultHelp(somSelf,pHelpPanelId,HelpLibrary)
+
+/*
+ * Override method: wpObjectReady
+ */
+#define WPFolder_wpObjectReady(somSelf,ulCode,refObject) \
+	WPObject_wpObjectReady(somSelf,ulCode,refObject)
+
+/*
+ * Override method: wpAddObjectWindowPage
+ */
+#define WPFolder_wpAddObjectWindowPage(somSelf,hwndNotebook) \
+	WPObject_wpAddObjectWindowPage(somSelf,hwndNotebook)
+
+/*
+ * Override method: wpModifyMenu
+ */
+#define WPFolder_wpModifyMenu(somSelf,hwndMenu,hwndCnr,iPosition,ulMenuType,ulView,ulReserved) \
+	WPObject_wpModifyMenu(somSelf,hwndMenu,hwndCnr,iPosition,ulMenuType,ulView,ulReserved)
+
+/*
+ * Override method: wpFilterMenu
+ */
+#define WPFolder_wpFilterMenu(somSelf,pFlags,hwndCnr,fMultiSelect,ulMenuType,ulView,ulReserved) \
+	WPObject_wpFilterMenu(somSelf,pFlags,hwndCnr,fMultiSelect,ulMenuType,ulView,ulReserved)
+
+/*
+ * Override method: wpDisplayMenu
+ */
+#define WPFolder_wpDisplayMenu(somSelf,hwndOwner,hwndClient,ptlPopupPt,ulMenuType,ulReserved) \
+	WPObject_wpDisplayMenu(somSelf,hwndOwner,hwndClient,ptlPopupPt,ulMenuType,ulReserved)
+
+/*
+ * Override method: somDefaultInit
+ */
+#define WPFolder_somDefaultInit(somSelf,ctrl) \
+	SOMObject_somDefaultInit(somSelf,ctrl)
+
+/*
+ * Override method: somDestruct
+ */
+#define WPFolder_somDestruct(somSelf,doFree,ctrl) \
+	SOMObject_somDestruct(somSelf,doFree,ctrl)
+
+/*
+ * Override method: wpSetIconData
+ */
+#define WPFolder_wpSetIconData(somSelf,pIconInfo) \
+	WPObject_wpSetIconData(somSelf,pIconInfo)
+
+/*
+ * New Method: wpSetFldrFlags
+ */
+typedef BOOL   SOMLINK somTP_WPFolder_wpSetFldrFlags(WPFolder *somSelf, 
+		ULONG ulFlags);
+#pragma linkage(somTP_WPFolder_wpSetFldrFlags, system)
+typedef somTP_WPFolder_wpSetFldrFlags *somTD_WPFolder_wpSetFldrFlags;
+#define somMD_WPFolder_wpSetFldrFlags "::WPFolder::wpSetFldrFlags"
+#define WPFolder_wpSetFldrFlags(somSelf,ulFlags) \
+    (SOM_Resolve(somSelf, WPFolder, wpSetFldrFlags) \
+	(somSelf,ulFlags))
+#ifndef SOMGD_wpSetFldrFlags
+    #if (defined(_wpSetFldrFlags) || defined(__wpSetFldrFlags))
+        #undef _wpSetFldrFlags
+        #undef __wpSetFldrFlags
+        #define SOMGD_wpSetFldrFlags 1
+    #else
+        #define _wpSetFldrFlags WPFolder_wpSetFldrFlags
+    #endif /* _wpSetFldrFlags */
+#endif /* SOMGD_wpSetFldrFlags */
+
+/*
+ * New Method: wpQueryFldrFlags
+ */
+typedef ULONG   SOMLINK somTP_WPFolder_wpQueryFldrFlags(WPFolder *somSelf);
+#pragma linkage(somTP_WPFolder_wpQueryFldrFlags, system)
+typedef somTP_WPFolder_wpQueryFldrFlags *somTD_WPFolder_wpQueryFldrFlags;
+#define somMD_WPFolder_wpQueryFldrFlags "::WPFolder::wpQueryFldrFlags"
+#define WPFolder_wpQueryFldrFlags(somSelf) \
+    (SOM_Resolve(somSelf, WPFolder, wpQueryFldrFlags) \
+	(somSelf))
+#ifndef SOMGD_wpQueryFldrFlags
+    #if (defined(_wpQueryFldrFlags) || defined(__wpQueryFldrFlags))
+        #undef _wpQueryFldrFlags
+        #undef __wpQueryFldrFlags
+        #define SOMGD_wpQueryFldrFlags 1
+    #else
+        #define _wpQueryFldrFlags WPFolder_wpQueryFldrFlags
+    #endif /* _wpQueryFldrFlags */
+#endif /* SOMGD_wpQueryFldrFlags */
+
+/*
+ * New Method: wpSetFldrFont
+ */
+typedef BOOL   SOMLINK somTP_WPFolder_wpSetFldrFont(WPFolder *somSelf, 
+		PSZ pszFont, 
+		ULONG ulView);
+#pragma linkage(somTP_WPFolder_wpSetFldrFont, system)
+typedef somTP_WPFolder_wpSetFldrFont *somTD_WPFolder_wpSetFldrFont;
+#define somMD_WPFolder_wpSetFldrFont "::WPFolder::wpSetFldrFont"
+#define WPFolder_wpSetFldrFont(somSelf,pszFont,ulView) \
+    (SOM_Resolve(somSelf, WPFolder, wpSetFldrFont) \
+	(somSelf,pszFont,ulView))
+#ifndef SOMGD_wpSetFldrFont
+    #if (defined(_wpSetFldrFont) || defined(__wpSetFldrFont))
+        #undef _wpSetFldrFont
+        #undef __wpSetFldrFont
+        #define SOMGD_wpSetFldrFont 1
+    #else
+        #define _wpSetFldrFont WPFolder_wpSetFldrFont
+    #endif /* _wpSetFldrFont */
+#endif /* SOMGD_wpSetFldrFont */
+
+/*
+ * New Method: wpQueryFldrFont
+ */
+typedef PSZ   SOMLINK somTP_WPFolder_wpQueryFldrFont(WPFolder *somSelf, 
+		ULONG ulView);
+#pragma linkage(somTP_WPFolder_wpQueryFldrFont, system)
+typedef somTP_WPFolder_wpQueryFldrFont *somTD_WPFolder_wpQueryFldrFont;
+#define somMD_WPFolder_wpQueryFldrFont "::WPFolder::wpQueryFldrFont"
+#define WPFolder_wpQueryFldrFont(somSelf,ulView) \
+    (SOM_Resolve(somSelf, WPFolder, wpQueryFldrFont) \
+	(somSelf,ulView))
+#ifndef SOMGD_wpQueryFldrFont
+    #if (defined(_wpQueryFldrFont) || defined(__wpQueryFldrFont))
+        #undef _wpQueryFldrFont
+        #undef __wpQueryFldrFont
+        #define SOMGD_wpQueryFldrFont 1
+    #else
+        #define _wpQueryFldrFont WPFolder_wpQueryFldrFont
+    #endif /* _wpQueryFldrFont */
+#endif /* SOMGD_wpQueryFldrFont */
+
+/*
+ * New Method: wpSetFldrAttr
+ */
+typedef BOOL   SOMLINK somTP_WPFolder_wpSetFldrAttr(WPFolder *somSelf, 
+		ULONG Attr, 
+		ULONG ulView);
+#pragma linkage(somTP_WPFolder_wpSetFldrAttr, system)
+typedef somTP_WPFolder_wpSetFldrAttr *somTD_WPFolder_wpSetFldrAttr;
+#define somMD_WPFolder_wpSetFldrAttr "::WPFolder::wpSetFldrAttr"
+#define WPFolder_wpSetFldrAttr(somSelf,Attr,ulView) \
+    (SOM_Resolve(somSelf, WPFolder, wpSetFldrAttr) \
+	(somSelf,Attr,ulView))
+#ifndef SOMGD_wpSetFldrAttr
+    #if (defined(_wpSetFldrAttr) || defined(__wpSetFldrAttr))
+        #undef _wpSetFldrAttr
+        #undef __wpSetFldrAttr
+        #define SOMGD_wpSetFldrAttr 1
+    #else
+        #define _wpSetFldrAttr WPFolder_wpSetFldrAttr
+    #endif /* _wpSetFldrAttr */
+#endif /* SOMGD_wpSetFldrAttr */
+
+/*
+ * New Method: wpQueryFldrAttr
+ */
+typedef ULONG   SOMLINK somTP_WPFolder_wpQueryFldrAttr(WPFolder *somSelf, 
+		ULONG ulView);
+#pragma linkage(somTP_WPFolder_wpQueryFldrAttr, system)
+typedef somTP_WPFolder_wpQueryFldrAttr *somTD_WPFolder_wpQueryFldrAttr;
+#define somMD_WPFolder_wpQueryFldrAttr "::WPFolder::wpQueryFldrAttr"
+#define WPFolder_wpQueryFldrAttr(somSelf,ulView) \
+    (SOM_Resolve(somSelf, WPFolder, wpQueryFldrAttr) \
+	(somSelf,ulView))
+#ifndef SOMGD_wpQueryFldrAttr
+    #if (defined(_wpQueryFldrAttr) || defined(__wpQueryFldrAttr))
+        #undef _wpQueryFldrAttr
+        #undef __wpQueryFldrAttr
+        #define SOMGD_wpQueryFldrAttr 1
+    #else
+        #define _wpQueryFldrAttr WPFolder_wpQueryFldrAttr
+    #endif /* _wpQueryFldrAttr */
+#endif /* SOMGD_wpQueryFldrAttr */
+
+/*
+ * New Method: wpSetNextIconPos
+ */
+typedef BOOL   SOMLINK somTP_WPFolder_wpSetNextIconPos(WPFolder *somSelf, 
+		PPOINTL pptl);
+#pragma linkage(somTP_WPFolder_wpSetNextIconPos, system)
+typedef somTP_WPFolder_wpSetNextIconPos *somTD_WPFolder_wpSetNextIconPos;
+#define somMD_WPFolder_wpSetNextIconPos "::WPFolder::wpSetNextIconPos"
+#define WPFolder_wpSetNextIconPos(somSelf,pptl) \
+    (SOM_Resolve(somSelf, WPFolder, wpSetNextIconPos) \
+	(somSelf,pptl))
+#ifndef SOMGD_wpSetNextIconPos
+    #if (defined(_wpSetNextIconPos) || defined(__wpSetNextIconPos))
+        #undef _wpSetNextIconPos
+        #undef __wpSetNextIconPos
+        #define SOMGD_wpSetNextIconPos 1
+    #else
+        #define _wpSetNextIconPos WPFolder_wpSetNextIconPos
+    #endif /* _wpSetNextIconPos */
+#endif /* SOMGD_wpSetNextIconPos */
+
+/*
+ * New Method: wpQueryNextIconPos
+ */
+typedef PPOINTL   SOMLINK somTP_WPFolder_wpQueryNextIconPos(WPFolder *somSelf);
+#pragma linkage(somTP_WPFolder_wpQueryNextIconPos, system)
+typedef somTP_WPFolder_wpQueryNextIconPos *somTD_WPFolder_wpQueryNextIconPos;
+#define somMD_WPFolder_wpQueryNextIconPos "::WPFolder::wpQueryNextIconPos"
+#define WPFolder_wpQueryNextIconPos(somSelf) \
+    (SOM_Resolve(somSelf, WPFolder, wpQueryNextIconPos) \
+	(somSelf))
+#ifndef SOMGD_wpQueryNextIconPos
+    #if (defined(_wpQueryNextIconPos) || defined(__wpQueryNextIconPos))
+        #undef _wpQueryNextIconPos
+        #undef __wpQueryNextIconPos
+        #define SOMGD_wpQueryNextIconPos 1
+    #else
+        #define _wpQueryNextIconPos WPFolder_wpQueryNextIconPos
+    #endif /* _wpQueryNextIconPos */
+#endif /* SOMGD_wpQueryNextIconPos */
+
+/*
+ * New Method: wpPopulate
+ */
+typedef BOOL   SOMLINK somTP_WPFolder_wpPopulate(WPFolder *somSelf, 
+		ULONG ulReserved, 
+		PSZ pszPath, 
+		BOOL fFoldersOnly);
+#pragma linkage(somTP_WPFolder_wpPopulate, system)
+typedef somTP_WPFolder_wpPopulate *somTD_WPFolder_wpPopulate;
+#define somMD_WPFolder_wpPopulate "::WPFolder::wpPopulate"
+#define WPFolder_wpPopulate(somSelf,ulReserved,pszPath,fFoldersOnly) \
+    (SOM_Resolve(somSelf, WPFolder, wpPopulate) \
+	(somSelf,ulReserved,pszPath,fFoldersOnly))
+#ifndef SOMGD_wpPopulate
+    #if (defined(_wpPopulate) || defined(__wpPopulate))
+        #undef _wpPopulate
+        #undef __wpPopulate
+        #define SOMGD_wpPopulate 1
+    #else
+        #define _wpPopulate WPFolder_wpPopulate
+    #endif /* _wpPopulate */
+#endif /* SOMGD_wpPopulate */
+
+/*
+ * New Method: wpQueryContent
+ */
+typedef WPObject*   SOMLINK somTP_WPFolder_wpQueryContent(WPFolder *somSelf, 
+		WPObject* Object, 
+		ULONG ulOption);
+#pragma linkage(somTP_WPFolder_wpQueryContent, system)
+typedef somTP_WPFolder_wpQueryContent *somTD_WPFolder_wpQueryContent;
+#define somMD_WPFolder_wpQueryContent "::WPFolder::wpQueryContent"
+#define WPFolder_wpQueryContent(somSelf,Object,ulOption) \
+    (SOM_Resolve(somSelf, WPFolder, wpQueryContent) \
+	(somSelf,Object,ulOption))
+#ifndef SOMGD_wpQueryContent
+    #if (defined(_wpQueryContent) || defined(__wpQueryContent))
+        #undef _wpQueryContent
+        #undef __wpQueryContent
+        #define SOMGD_wpQueryContent 1
+    #else
+        #define _wpQueryContent WPFolder_wpQueryContent
+    #endif /* _wpQueryContent */
+#endif /* SOMGD_wpQueryContent */
+
+/*
+ * New Method: wpAddFolderView1Page
+ */
+typedef ULONG   SOMLINK somTP_WPFolder_wpAddFolderView1Page(WPFolder *somSelf, 
+		HWND hwndNotebook);
+#pragma linkage(somTP_WPFolder_wpAddFolderView1Page, system)
+typedef somTP_WPFolder_wpAddFolderView1Page *somTD_WPFolder_wpAddFolderView1Page;
+#define somMD_WPFolder_wpAddFolderView1Page "::WPFolder::wpAddFolderView1Page"
+#define WPFolder_wpAddFolderView1Page(somSelf,hwndNotebook) \
+    (SOM_Resolve(somSelf, WPFolder, wpAddFolderView1Page) \
+	(somSelf,hwndNotebook))
+#ifndef SOMGD_wpAddFolderView1Page
+    #if (defined(_wpAddFolderView1Page) || defined(__wpAddFolderView1Page))
+        #undef _wpAddFolderView1Page
+        #undef __wpAddFolderView1Page
+        #define SOMGD_wpAddFolderView1Page 1
+    #else
+        #define _wpAddFolderView1Page WPFolder_wpAddFolderView1Page
+    #endif /* _wpAddFolderView1Page */
+#endif /* SOMGD_wpAddFolderView1Page */
+
+/*
+ * New Method: wpAddFolderView2Page
+ */
+typedef ULONG   SOMLINK somTP_WPFolder_wpAddFolderView2Page(WPFolder *somSelf, 
+		HWND hwndNotebook);
+#pragma linkage(somTP_WPFolder_wpAddFolderView2Page, system)
+typedef somTP_WPFolder_wpAddFolderView2Page *somTD_WPFolder_wpAddFolderView2Page;
+#define somMD_WPFolder_wpAddFolderView2Page "::WPFolder::wpAddFolderView2Page"
+#define WPFolder_wpAddFolderView2Page(somSelf,hwndNotebook) \
+    (SOM_Resolve(somSelf, WPFolder, wpAddFolderView2Page) \
+	(somSelf,hwndNotebook))
+#ifndef SOMGD_wpAddFolderView2Page
+    #if (defined(_wpAddFolderView2Page) || defined(__wpAddFolderView2Page))
+        #undef _wpAddFolderView2Page
+        #undef __wpAddFolderView2Page
+        #define SOMGD_wpAddFolderView2Page 1
+    #else
+        #define _wpAddFolderView2Page WPFolder_wpAddFolderView2Page
+    #endif /* _wpAddFolderView2Page */
+#endif /* SOMGD_wpAddFolderView2Page */
+
+/*
+ * New Method: wpAddFolderView3Page
+ */
+typedef ULONG   SOMLINK somTP_WPFolder_wpAddFolderView3Page(WPFolder *somSelf, 
+		HWND hwndNotebook);
+#pragma linkage(somTP_WPFolder_wpAddFolderView3Page, system)
+typedef somTP_WPFolder_wpAddFolderView3Page *somTD_WPFolder_wpAddFolderView3Page;
+#define somMD_WPFolder_wpAddFolderView3Page "::WPFolder::wpAddFolderView3Page"
+#define WPFolder_wpAddFolderView3Page(somSelf,hwndNotebook) \
+    (SOM_Resolve(somSelf, WPFolder, wpAddFolderView3Page) \
+	(somSelf,hwndNotebook))
+#ifndef SOMGD_wpAddFolderView3Page
+    #if (defined(_wpAddFolderView3Page) || defined(__wpAddFolderView3Page))
+        #undef _wpAddFolderView3Page
+        #undef __wpAddFolderView3Page
+        #define SOMGD_wpAddFolderView3Page 1
+    #else
+        #define _wpAddFolderView3Page WPFolder_wpAddFolderView3Page
+    #endif /* _wpAddFolderView3Page */
+#endif /* SOMGD_wpAddFolderView3Page */
+
+/*
+ * New Method: wpAddFolderIncludePage
+ */
+typedef ULONG   SOMLINK somTP_WPFolder_wpAddFolderIncludePage(WPFolder *somSelf, 
+		HWND hwndNotebook);
+#pragma linkage(somTP_WPFolder_wpAddFolderIncludePage, system)
+typedef somTP_WPFolder_wpAddFolderIncludePage *somTD_WPFolder_wpAddFolderIncludePage;
+#define somMD_WPFolder_wpAddFolderIncludePage "::WPFolder::wpAddFolderIncludePage"
+#define WPFolder_wpAddFolderIncludePage(somSelf,hwndNotebook) \
+    (SOM_Resolve(somSelf, WPFolder, wpAddFolderIncludePage) \
+	(somSelf,hwndNotebook))
+#ifndef SOMGD_wpAddFolderIncludePage
+    #if (defined(_wpAddFolderIncludePage) || defined(__wpAddFolderIncludePage))
+        #undef _wpAddFolderIncludePage
+        #undef __wpAddFolderIncludePage
+        #define SOMGD_wpAddFolderIncludePage 1
+    #else
+        #define _wpAddFolderIncludePage WPFolder_wpAddFolderIncludePage
+    #endif /* _wpAddFolderIncludePage */
+#endif /* SOMGD_wpAddFolderIncludePage */
+
+/*
+ * New Method: wpAddFolderSortPage
+ */
+typedef ULONG   SOMLINK somTP_WPFolder_wpAddFolderSortPage(WPFolder *somSelf, 
+		HWND hwndNotebook);
+#pragma linkage(somTP_WPFolder_wpAddFolderSortPage, system)
+typedef somTP_WPFolder_wpAddFolderSortPage *somTD_WPFolder_wpAddFolderSortPage;
+#define somMD_WPFolder_wpAddFolderSortPage "::WPFolder::wpAddFolderSortPage"
+#define WPFolder_wpAddFolderSortPage(somSelf,hwndNotebook) \
+    (SOM_Resolve(somSelf, WPFolder, wpAddFolderSortPage) \
+	(somSelf,hwndNotebook))
+#ifndef SOMGD_wpAddFolderSortPage
+    #if (defined(_wpAddFolderSortPage) || defined(__wpAddFolderSortPage))
+        #undef _wpAddFolderSortPage
+        #undef __wpAddFolderSortPage
+        #define SOMGD_wpAddFolderSortPage 1
+    #else
+        #define _wpAddFolderSortPage WPFolder_wpAddFolderSortPage
+    #endif /* _wpAddFolderSortPage */
+#endif /* SOMGD_wpAddFolderSortPage */
+
+/*
+ * New Method: wpAddFolderBackgroundPage
+ */
+typedef ULONG   SOMLINK somTP_WPFolder_wpAddFolderBackgroundPage(WPFolder *somSelf, 
+		HWND hwndNotebook);
+#pragma linkage(somTP_WPFolder_wpAddFolderBackgroundPage, system)
+typedef somTP_WPFolder_wpAddFolderBackgroundPage *somTD_WPFolder_wpAddFolderBackgroundPage;
+#define somMD_WPFolder_wpAddFolderBackgroundPage "::WPFolder::wpAddFolderBackgroundPage"
+#define WPFolder_wpAddFolderBackgroundPage(somSelf,hwndNotebook) \
+    (SOM_Resolve(somSelf, WPFolder, wpAddFolderBackgroundPage) \
+	(somSelf,hwndNotebook))
+#ifndef SOMGD_wpAddFolderBackgroundPage
+    #if (defined(_wpAddFolderBackgroundPage) || defined(__wpAddFolderBackgroundPage))
+        #undef _wpAddFolderBackgroundPage
+        #undef __wpAddFolderBackgroundPage
+        #define SOMGD_wpAddFolderBackgroundPage 1
+    #else
+        #define _wpAddFolderBackgroundPage WPFolder_wpAddFolderBackgroundPage
+    #endif /* _wpAddFolderBackgroundPage */
+#endif /* SOMGD_wpAddFolderBackgroundPage */
+
+/*
+ * New Method: wpAddFolderSelfClosePage
+ */
+typedef ULONG   SOMLINK somTP_WPFolder_wpAddFolderSelfClosePage(WPFolder *somSelf, 
+		HWND hwndNotebook);
+#pragma linkage(somTP_WPFolder_wpAddFolderSelfClosePage, system)
+typedef somTP_WPFolder_wpAddFolderSelfClosePage *somTD_WPFolder_wpAddFolderSelfClosePage;
+#define somMD_WPFolder_wpAddFolderSelfClosePage "::WPFolder::wpAddFolderSelfClosePage"
+#define WPFolder_wpAddFolderSelfClosePage(somSelf,hwndNotebook) \
+    (SOM_Resolve(somSelf, WPFolder, wpAddFolderSelfClosePage) \
+	(somSelf,hwndNotebook))
+#ifndef SOMGD_wpAddFolderSelfClosePage
+    #if (defined(_wpAddFolderSelfClosePage) || defined(__wpAddFolderSelfClosePage))
+        #undef _wpAddFolderSelfClosePage
+        #undef __wpAddFolderSelfClosePage
+        #define SOMGD_wpAddFolderSelfClosePage 1
+    #else
+        #define _wpAddFolderSelfClosePage WPFolder_wpAddFolderSelfClosePage
+    #endif /* _wpAddFolderSelfClosePage */
+#endif /* SOMGD_wpAddFolderSelfClosePage */
+
+/*
+ * New Method: wpInitIconPosData
+ */
+typedef BOOL   SOMLINK somTP_WPFolder_wpInitIconPosData(WPFolder *somSelf);
+#pragma linkage(somTP_WPFolder_wpInitIconPosData, system)
+typedef somTP_WPFolder_wpInitIconPosData *somTD_WPFolder_wpInitIconPosData;
+#define somMD_WPFolder_wpInitIconPosData "::WPFolder::wpInitIconPosData"
+#define WPFolder_wpInitIconPosData(somSelf) \
+    (SOM_Resolve(somSelf, WPFolder, wpInitIconPosData) \
+	(somSelf))
+#ifndef SOMGD_wpInitIconPosData
+    #if (defined(_wpInitIconPosData) || defined(__wpInitIconPosData))
+        #undef _wpInitIconPosData
+        #undef __wpInitIconPosData
+        #define SOMGD_wpInitIconPosData 1
+    #else
+        #define _wpInitIconPosData WPFolder_wpInitIconPosData
+    #endif /* _wpInitIconPosData */
+#endif /* SOMGD_wpInitIconPosData */
+
+/*
+ * New Method: wpFreeIconPosData
+ */
+typedef void   SOMLINK somTP_WPFolder_wpFreeIconPosData(WPFolder *somSelf);
+#pragma linkage(somTP_WPFolder_wpFreeIconPosData, system)
+typedef somTP_WPFolder_wpFreeIconPosData *somTD_WPFolder_wpFreeIconPosData;
+#define somMD_WPFolder_wpFreeIconPosData "::WPFolder::wpFreeIconPosData"
+#define WPFolder_wpFreeIconPosData(somSelf) \
+    (SOM_Resolve(somSelf, WPFolder, wpFreeIconPosData) \
+	(somSelf))
+#ifndef SOMGD_wpFreeIconPosData
+    #if (defined(_wpFreeIconPosData) || defined(__wpFreeIconPosData))
+        #undef _wpFreeIconPosData
+        #undef __wpFreeIconPosData
+        #define SOMGD_wpFreeIconPosData 1
+    #else
+        #define _wpFreeIconPosData WPFolder_wpFreeIconPosData
+    #endif /* _wpFreeIconPosData */
+#endif /* SOMGD_wpFreeIconPosData */
+
+/*
+ * New Method: wpStoreIconPosData
+ */
+typedef BOOL   SOMLINK somTP_WPFolder_wpStoreIconPosData(WPFolder *somSelf, 
+		PICONPOS pIconPos, 
+		ULONG cbSize);
+#pragma linkage(somTP_WPFolder_wpStoreIconPosData, system)
+typedef somTP_WPFolder_wpStoreIconPosData *somTD_WPFolder_wpStoreIconPosData;
+#define somMD_WPFolder_wpStoreIconPosData "::WPFolder::wpStoreIconPosData"
+#define WPFolder_wpStoreIconPosData(somSelf,pIconPos,cbSize) \
+    (SOM_Resolve(somSelf, WPFolder, wpStoreIconPosData) \
+	(somSelf,pIconPos,cbSize))
+#ifndef SOMGD_wpStoreIconPosData
+    #if (defined(_wpStoreIconPosData) || defined(__wpStoreIconPosData))
+        #undef _wpStoreIconPosData
+        #undef __wpStoreIconPosData
+        #define SOMGD_wpStoreIconPosData 1
+    #else
+        #define _wpStoreIconPosData WPFolder_wpStoreIconPosData
+    #endif /* _wpStoreIconPosData */
+#endif /* SOMGD_wpStoreIconPosData */
+
+/*
+ * New Method: wpQueryIconPosition
+ */
+typedef BOOL   SOMLINK somTP_WPFolder_wpQueryIconPosition(WPFolder *somSelf, 
+		PSZ pszIdentity, 
+		PPOINTL pptl, 
+		PULONG pIndex);
+#pragma linkage(somTP_WPFolder_wpQueryIconPosition, system)
+typedef somTP_WPFolder_wpQueryIconPosition *somTD_WPFolder_wpQueryIconPosition;
+#define somMD_WPFolder_wpQueryIconPosition "::WPFolder::wpQueryIconPosition"
+#define WPFolder_wpQueryIconPosition(somSelf,pszIdentity,pptl,pIndex) \
+    (SOM_Resolve(somSelf, WPFolder, wpQueryIconPosition) \
+	(somSelf,pszIdentity,pptl,pIndex))
+#ifndef SOMGD_wpQueryIconPosition
+    #if (defined(_wpQueryIconPosition) || defined(__wpQueryIconPosition))
+        #undef _wpQueryIconPosition
+        #undef __wpQueryIconPosition
+        #define SOMGD_wpQueryIconPosition 1
+    #else
+        #define _wpQueryIconPosition WPFolder_wpQueryIconPosition
+    #endif /* _wpQueryIconPosition */
+#endif /* SOMGD_wpQueryIconPosition */
+
+/*
+ * New Method: wpSetFldrSort
+ */
+typedef BOOL   SOMLINK somTP_WPFolder_wpSetFldrSort(WPFolder *somSelf, 
+		PVOID pSortRecord, 
+		ULONG ulView, 
+		ULONG ulType);
+#pragma linkage(somTP_WPFolder_wpSetFldrSort, system)
+typedef somTP_WPFolder_wpSetFldrSort *somTD_WPFolder_wpSetFldrSort;
+#define somMD_WPFolder_wpSetFldrSort "::WPFolder::wpSetFldrSort"
+#define WPFolder_wpSetFldrSort(somSelf,pSortRecord,ulView,ulType) \
+    (SOM_Resolve(somSelf, WPFolder, wpSetFldrSort) \
+	(somSelf,pSortRecord,ulView,ulType))
+#ifndef SOMGD_wpSetFldrSort
+    #if (defined(_wpSetFldrSort) || defined(__wpSetFldrSort))
+        #undef _wpSetFldrSort
+        #undef __wpSetFldrSort
+        #define SOMGD_wpSetFldrSort 1
+    #else
+        #define _wpSetFldrSort WPFolder_wpSetFldrSort
+    #endif /* _wpSetFldrSort */
+#endif /* SOMGD_wpSetFldrSort */
+
+/*
+ * New Method: wpQueryFldrSort
+ */
+typedef PVOID   SOMLINK somTP_WPFolder_wpQueryFldrSort(WPFolder *somSelf, 
+		ULONG ulView, 
+		ULONG ulType);
+#pragma linkage(somTP_WPFolder_wpQueryFldrSort, system)
+typedef somTP_WPFolder_wpQueryFldrSort *somTD_WPFolder_wpQueryFldrSort;
+#define somMD_WPFolder_wpQueryFldrSort "::WPFolder::wpQueryFldrSort"
+#define WPFolder_wpQueryFldrSort(somSelf,ulView,ulType) \
+    (SOM_Resolve(somSelf, WPFolder, wpQueryFldrSort) \
+	(somSelf,ulView,ulType))
+#ifndef SOMGD_wpQueryFldrSort
+    #if (defined(_wpQueryFldrSort) || defined(__wpQueryFldrSort))
+        #undef _wpQueryFldrSort
+        #undef __wpQueryFldrSort
+        #define SOMGD_wpQueryFldrSort 1
+    #else
+        #define _wpQueryFldrSort WPFolder_wpQueryFldrSort
+    #endif /* _wpQueryFldrSort */
+#endif /* SOMGD_wpQueryFldrSort */
+
+/*
+ * New Method: wpRestoreFldrRunObjs
+ */
+typedef BOOL   SOMLINK somTP_WPFolder_wpRestoreFldrRunObjs(WPFolder *somSelf);
+#pragma linkage(somTP_WPFolder_wpRestoreFldrRunObjs, system)
+typedef somTP_WPFolder_wpRestoreFldrRunObjs *somTD_WPFolder_wpRestoreFldrRunObjs;
+#define somMD_WPFolder_wpRestoreFldrRunObjs "::WPFolder::wpRestoreFldrRunObjs"
+#define WPFolder_wpRestoreFldrRunObjs(somSelf) \
+    (SOM_Resolve(somSelf, WPFolder, wpRestoreFldrRunObjs) \
+	(somSelf))
+#ifndef SOMGD_wpRestoreFldrRunObjs
+    #if (defined(_wpRestoreFldrRunObjs) || defined(__wpRestoreFldrRunObjs))
+        #undef _wpRestoreFldrRunObjs
+        #undef __wpRestoreFldrRunObjs
+        #define SOMGD_wpRestoreFldrRunObjs 1
+    #else
+        #define _wpRestoreFldrRunObjs WPFolder_wpRestoreFldrRunObjs
+    #endif /* _wpRestoreFldrRunObjs */
+#endif /* SOMGD_wpRestoreFldrRunObjs */
+
+/*
+ * New Method: wpStoreFldrRunObjs
+ */
+typedef BOOL   SOMLINK somTP_WPFolder_wpStoreFldrRunObjs(WPFolder *somSelf, 
+		ULONG ulType);
+#pragma linkage(somTP_WPFolder_wpStoreFldrRunObjs, system)
+typedef somTP_WPFolder_wpStoreFldrRunObjs *somTD_WPFolder_wpStoreFldrRunObjs;
+#define somMD_WPFolder_wpStoreFldrRunObjs "::WPFolder::wpStoreFldrRunObjs"
+#define WPFolder_wpStoreFldrRunObjs(somSelf,ulType) \
+    (SOM_Resolve(somSelf, WPFolder, wpStoreFldrRunObjs) \
+	(somSelf,ulType))
+#ifndef SOMGD_wpStoreFldrRunObjs
+    #if (defined(_wpStoreFldrRunObjs) || defined(__wpStoreFldrRunObjs))
+        #undef _wpStoreFldrRunObjs
+        #undef __wpStoreFldrRunObjs
+        #define SOMGD_wpStoreFldrRunObjs 1
+    #else
+        #define _wpStoreFldrRunObjs WPFolder_wpStoreFldrRunObjs
+    #endif /* _wpStoreFldrRunObjs */
+#endif /* SOMGD_wpStoreFldrRunObjs */
+
+/*
+ * New Method: wpHideFldrRunObjs
+ */
+typedef BOOL   SOMLINK somTP_WPFolder_wpHideFldrRunObjs(WPFolder *somSelf, 
+		BOOL fHide);
+#pragma linkage(somTP_WPFolder_wpHideFldrRunObjs, system)
+typedef somTP_WPFolder_wpHideFldrRunObjs *somTD_WPFolder_wpHideFldrRunObjs;
+#define somMD_WPFolder_wpHideFldrRunObjs "::WPFolder::wpHideFldrRunObjs"
+#define WPFolder_wpHideFldrRunObjs(somSelf,fHide) \
+    (SOM_Resolve(somSelf, WPFolder, wpHideFldrRunObjs) \
+	(somSelf,fHide))
+#ifndef SOMGD_wpHideFldrRunObjs
+    #if (defined(_wpHideFldrRunObjs) || defined(__wpHideFldrRunObjs))
+        #undef _wpHideFldrRunObjs
+        #undef __wpHideFldrRunObjs
+        #define SOMGD_wpHideFldrRunObjs 1
+    #else
+        #define _wpHideFldrRunObjs WPFolder_wpHideFldrRunObjs
+    #endif /* _wpHideFldrRunObjs */
+#endif /* SOMGD_wpHideFldrRunObjs */
+
+/*
+ * New Method: wpDeleteContents
+ */
+typedef ULONG   SOMLINK somTP_WPFolder_wpDeleteContents(WPFolder *somSelf, 
+		ULONG fConfirmations);
+#pragma linkage(somTP_WPFolder_wpDeleteContents, system)
+typedef somTP_WPFolder_wpDeleteContents *somTD_WPFolder_wpDeleteContents;
+#define somMD_WPFolder_wpDeleteContents "::WPFolder::wpDeleteContents"
+#define WPFolder_wpDeleteContents(somSelf,fConfirmations) \
+    (SOM_Resolve(somSelf, WPFolder, wpDeleteContents) \
+	(somSelf,fConfirmations))
+#ifndef SOMGD_wpDeleteContents
+    #if (defined(_wpDeleteContents) || defined(__wpDeleteContents))
+        #undef _wpDeleteContents
+        #undef __wpDeleteContents
+        #define SOMGD_wpDeleteContents 1
+    #else
+        #define _wpDeleteContents WPFolder_wpDeleteContents
+    #endif /* _wpDeleteContents */
+#endif /* SOMGD_wpDeleteContents */
+
+/*
+ * New Method: wpSetFldrDetailsClass
+ */
+typedef BOOL   SOMLINK somTP_WPFolder_wpSetFldrDetailsClass(WPFolder *somSelf, 
+		M_WPObject* Class);
+#pragma linkage(somTP_WPFolder_wpSetFldrDetailsClass, system)
+typedef somTP_WPFolder_wpSetFldrDetailsClass *somTD_WPFolder_wpSetFldrDetailsClass;
+#define somMD_WPFolder_wpSetFldrDetailsClass "::WPFolder::wpSetFldrDetailsClass"
+#define WPFolder_wpSetFldrDetailsClass(somSelf,Class) \
+    (SOM_Resolve(somSelf, WPFolder, wpSetFldrDetailsClass) \
+	(somSelf,Class))
+#ifndef SOMGD_wpSetFldrDetailsClass
+    #if (defined(_wpSetFldrDetailsClass) || defined(__wpSetFldrDetailsClass))
+        #undef _wpSetFldrDetailsClass
+        #undef __wpSetFldrDetailsClass
+        #define SOMGD_wpSetFldrDetailsClass 1
+    #else
+        #define _wpSetFldrDetailsClass WPFolder_wpSetFldrDetailsClass
+    #endif /* _wpSetFldrDetailsClass */
+#endif /* SOMGD_wpSetFldrDetailsClass */
+
+/*
+ * New Method: wpQueryFldrDetailsClass
+ */
+typedef M_WPObject*   SOMLINK somTP_WPFolder_wpQueryFldrDetailsClass(WPFolder *somSelf);
+#pragma linkage(somTP_WPFolder_wpQueryFldrDetailsClass, system)
+typedef somTP_WPFolder_wpQueryFldrDetailsClass *somTD_WPFolder_wpQueryFldrDetailsClass;
+#define somMD_WPFolder_wpQueryFldrDetailsClass "::WPFolder::wpQueryFldrDetailsClass"
+#define WPFolder_wpQueryFldrDetailsClass(somSelf) \
+    (SOM_Resolve(somSelf, WPFolder, wpQueryFldrDetailsClass) \
+	(somSelf))
+#ifndef SOMGD_wpQueryFldrDetailsClass
+    #if (defined(_wpQueryFldrDetailsClass) || defined(__wpQueryFldrDetailsClass))
+        #undef _wpQueryFldrDetailsClass
+        #undef __wpQueryFldrDetailsClass
+        #define SOMGD_wpQueryFldrDetailsClass 1
+    #else
+        #define _wpQueryFldrDetailsClass WPFolder_wpQueryFldrDetailsClass
+    #endif /* _wpQueryFldrDetailsClass */
+#endif /* SOMGD_wpQueryFldrDetailsClass */
+
+/*
+ * New Method: wpSearchFolder
+ */
+typedef BOOL   SOMLINK somTP_WPFolder_wpSearchFolder(WPFolder *somSelf, 
+		PSZ pszName, 
+		ULONG ulSearchType, 
+		ULONG ulLen, 
+		PSEARCH_INFO pInfo, 
+		WPFolder* ResultFolder);
+#pragma linkage(somTP_WPFolder_wpSearchFolder, system)
+typedef somTP_WPFolder_wpSearchFolder *somTD_WPFolder_wpSearchFolder;
+#define somMD_WPFolder_wpSearchFolder "::WPFolder::wpSearchFolder"
+#define WPFolder_wpSearchFolder(somSelf,pszName,ulSearchType,ulLen,pInfo,ResultFolder) \
+    (SOM_Resolve(somSelf, WPFolder, wpSearchFolder) \
+	(somSelf,pszName,ulSearchType,ulLen,pInfo,ResultFolder))
+#ifndef SOMGD_wpSearchFolder
+    #if (defined(_wpSearchFolder) || defined(__wpSearchFolder))
+        #undef _wpSearchFolder
+        #undef __wpSearchFolder
+        #define SOMGD_wpSearchFolder 1
+    #else
+        #define _wpSearchFolder WPFolder_wpSearchFolder
+    #endif /* _wpSearchFolder */
+#endif /* SOMGD_wpSearchFolder */
+
+/*
+ * New Method: wpContainsFolders
+ */
+typedef BOOL   SOMLINK somTP_WPFolder_wpContainsFolders(WPFolder *somSelf, 
+		BOOL* pfSubFolders);
+#pragma linkage(somTP_WPFolder_wpContainsFolders, system)
+typedef somTP_WPFolder_wpContainsFolders *somTD_WPFolder_wpContainsFolders;
+#define somMD_WPFolder_wpContainsFolders "::WPFolder::wpContainsFolders"
+#define WPFolder_wpContainsFolders(somSelf,pfSubFolders) \
+    (SOM_Resolve(somSelf, WPFolder, wpContainsFolders) \
+	(somSelf,pfSubFolders))
+#ifndef SOMGD_wpContainsFolders
+    #if (defined(_wpContainsFolders) || defined(__wpContainsFolders))
+        #undef _wpContainsFolders
+        #undef __wpContainsFolders
+        #define SOMGD_wpContainsFolders 1
+    #else
+        #define _wpContainsFolders WPFolder_wpContainsFolders
+    #endif /* _wpContainsFolders */
+#endif /* SOMGD_wpContainsFolders */
+
+/*
+ * New Method: wpQueryOpenFolders
+ */
+typedef WPObject*   SOMLINK somTP_WPFolder_wpQueryOpenFolders(WPFolder *somSelf, 
+		ULONG ulOption);
+#pragma linkage(somTP_WPFolder_wpQueryOpenFolders, system)
+typedef somTP_WPFolder_wpQueryOpenFolders *somTD_WPFolder_wpQueryOpenFolders;
+#define somMD_WPFolder_wpQueryOpenFolders "::WPFolder::wpQueryOpenFolders"
+#define WPFolder_wpQueryOpenFolders(somSelf,ulOption) \
+    (SOM_Resolve(somSelf, WPFolder, wpQueryOpenFolders) \
+	(somSelf,ulOption))
+#ifndef SOMGD_wpQueryOpenFolders
+    #if (defined(_wpQueryOpenFolders) || defined(__wpQueryOpenFolders))
+        #undef _wpQueryOpenFolders
+        #undef __wpQueryOpenFolders
+        #define SOMGD_wpQueryOpenFolders 1
+    #else
+        #define _wpQueryOpenFolders WPFolder_wpQueryOpenFolders
+    #endif /* _wpQueryOpenFolders */
+#endif /* SOMGD_wpQueryOpenFolders */
+
+/*
+ * New Method: wpModifyFldrFlags
+ */
+typedef BOOL   SOMLINK somTP_WPFolder_wpModifyFldrFlags(WPFolder *somSelf, 
+		ULONG ulFlags, 
+		ULONG ulFlagMask);
+#pragma linkage(somTP_WPFolder_wpModifyFldrFlags, system)
+typedef somTP_WPFolder_wpModifyFldrFlags *somTD_WPFolder_wpModifyFldrFlags;
+#define somMD_WPFolder_wpModifyFldrFlags "::WPFolder::wpModifyFldrFlags"
+#define WPFolder_wpModifyFldrFlags(somSelf,ulFlags,ulFlagMask) \
+    (SOM_Resolve(somSelf, WPFolder, wpModifyFldrFlags) \
+	(somSelf,ulFlags,ulFlagMask))
+#ifndef SOMGD_wpModifyFldrFlags
+    #if (defined(_wpModifyFldrFlags) || defined(__wpModifyFldrFlags))
+        #undef _wpModifyFldrFlags
+        #undef __wpModifyFldrFlags
+        #define SOMGD_wpModifyFldrFlags 1
+    #else
+        #define _wpModifyFldrFlags WPFolder_wpModifyFldrFlags
+    #endif /* _wpModifyFldrFlags */
+#endif /* SOMGD_wpModifyFldrFlags */
+
+/*
+ * New Method: wpAddToContent
+ */
+typedef BOOL   SOMLINK somTP_WPFolder_wpAddToContent(WPFolder *somSelf, 
+		WPObject* Object);
+#pragma linkage(somTP_WPFolder_wpAddToContent, system)
+typedef somTP_WPFolder_wpAddToContent *somTD_WPFolder_wpAddToContent;
+#define somMD_WPFolder_wpAddToContent "::WPFolder::wpAddToContent"
+#define WPFolder_wpAddToContent(somSelf,Object) \
+    (SOM_Resolve(somSelf, WPFolder, wpAddToContent) \
+	(somSelf,Object))
+#ifndef SOMGD_wpAddToContent
+    #if (defined(_wpAddToContent) || defined(__wpAddToContent))
+        #undef _wpAddToContent
+        #undef __wpAddToContent
+        #define SOMGD_wpAddToContent 1
+    #else
+        #define _wpAddToContent WPFolder_wpAddToContent
+    #endif /* _wpAddToContent */
+#endif /* SOMGD_wpAddToContent */
+
+/*
+ * New Method: wpDeleteFromContent
+ */
+typedef BOOL   SOMLINK somTP_WPFolder_wpDeleteFromContent(WPFolder *somSelf, 
+		WPObject* Object);
+#pragma linkage(somTP_WPFolder_wpDeleteFromContent, system)
+typedef somTP_WPFolder_wpDeleteFromContent *somTD_WPFolder_wpDeleteFromContent;
+#define somMD_WPFolder_wpDeleteFromContent "::WPFolder::wpDeleteFromContent"
+#define WPFolder_wpDeleteFromContent(somSelf,Object) \
+    (SOM_Resolve(somSelf, WPFolder, wpDeleteFromContent) \
+	(somSelf,Object))
+#ifndef SOMGD_wpDeleteFromContent
+    #if (defined(_wpDeleteFromContent) || defined(__wpDeleteFromContent))
+        #undef _wpDeleteFromContent
+        #undef __wpDeleteFromContent
+        #define SOMGD_wpDeleteFromContent 1
+    #else
+        #define _wpDeleteFromContent WPFolder_wpDeleteFromContent
+    #endif /* _wpDeleteFromContent */
+#endif /* SOMGD_wpDeleteFromContent */
+
+/*
+ * New Method: wpSetDetailsColumnVisibility
+ */
+typedef BOOL   SOMLINK somTP_WPFolder_wpSetDetailsColumnVisibility(WPFolder *somSelf, 
+		ULONG index, 
+		BOOL Visible);
+#pragma linkage(somTP_WPFolder_wpSetDetailsColumnVisibility, system)
+typedef somTP_WPFolder_wpSetDetailsColumnVisibility *somTD_WPFolder_wpSetDetailsColumnVisibility;
+#define somMD_WPFolder_wpSetDetailsColumnVisibility "::WPFolder::wpSetDetailsColumnVisibility"
+#define WPFolder_wpSetDetailsColumnVisibility(somSelf,index,Visible) \
+    (SOM_Resolve(somSelf, WPFolder, wpSetDetailsColumnVisibility) \
+	(somSelf,index,Visible))
+#ifndef SOMGD_wpSetDetailsColumnVisibility
+    #if (defined(_wpSetDetailsColumnVisibility) || defined(__wpSetDetailsColumnVisibility))
+        #undef _wpSetDetailsColumnVisibility
+        #undef __wpSetDetailsColumnVisibility
+        #define SOMGD_wpSetDetailsColumnVisibility 1
+    #else
+        #define _wpSetDetailsColumnVisibility WPFolder_wpSetDetailsColumnVisibility
+    #endif /* _wpSetDetailsColumnVisibility */
+#endif /* SOMGD_wpSetDetailsColumnVisibility */
+
+/*
+ * New Method: wpIsDetailsColumnVisible
+ */
+typedef BOOL   SOMLINK somTP_WPFolder_wpIsDetailsColumnVisible(WPFolder *somSelf, 
+		ULONG index);
+#pragma linkage(somTP_WPFolder_wpIsDetailsColumnVisible, system)
+typedef somTP_WPFolder_wpIsDetailsColumnVisible *somTD_WPFolder_wpIsDetailsColumnVisible;
+#define somMD_WPFolder_wpIsDetailsColumnVisible "::WPFolder::wpIsDetailsColumnVisible"
+#define WPFolder_wpIsDetailsColumnVisible(somSelf,index) \
+    (SOM_Resolve(somSelf, WPFolder, wpIsDetailsColumnVisible) \
+	(somSelf,index))
+#ifndef SOMGD_wpIsDetailsColumnVisible
+    #if (defined(_wpIsDetailsColumnVisible) || defined(__wpIsDetailsColumnVisible))
+        #undef _wpIsDetailsColumnVisible
+        #undef __wpIsDetailsColumnVisible
+        #define SOMGD_wpIsDetailsColumnVisible 1
+    #else
+        #define _wpIsDetailsColumnVisible WPFolder_wpIsDetailsColumnVisible
+    #endif /* _wpIsDetailsColumnVisible */
+#endif /* SOMGD_wpIsDetailsColumnVisible */
+
+/*
+ * New Method: wpSetFldrSortClass
+ */
+typedef BOOL   SOMLINK somTP_WPFolder_wpSetFldrSortClass(WPFolder *somSelf, 
+		M_WPObject* Class);
+#pragma linkage(somTP_WPFolder_wpSetFldrSortClass, system)
+typedef somTP_WPFolder_wpSetFldrSortClass *somTD_WPFolder_wpSetFldrSortClass;
+#define somMD_WPFolder_wpSetFldrSortClass "::WPFolder::wpSetFldrSortClass"
+#define WPFolder_wpSetFldrSortClass(somSelf,Class) \
+    (SOM_Resolve(somSelf, WPFolder, wpSetFldrSortClass) \
+	(somSelf,Class))
+#ifndef SOMGD_wpSetFldrSortClass
+    #if (defined(_wpSetFldrSortClass) || defined(__wpSetFldrSortClass))
+        #undef _wpSetFldrSortClass
+        #undef __wpSetFldrSortClass
+        #define SOMGD_wpSetFldrSortClass 1
+    #else
+        #define _wpSetFldrSortClass WPFolder_wpSetFldrSortClass
+    #endif /* _wpSetFldrSortClass */
+#endif /* SOMGD_wpSetFldrSortClass */
+
+/*
+ * New Method: wpQueryFldrSortClass
+ */
+typedef M_WPObject*   SOMLINK somTP_WPFolder_wpQueryFldrSortClass(WPFolder *somSelf);
+#pragma linkage(somTP_WPFolder_wpQueryFldrSortClass, system)
+typedef somTP_WPFolder_wpQueryFldrSortClass *somTD_WPFolder_wpQueryFldrSortClass;
+#define somMD_WPFolder_wpQueryFldrSortClass "::WPFolder::wpQueryFldrSortClass"
+#define WPFolder_wpQueryFldrSortClass(somSelf) \
+    (SOM_Resolve(somSelf, WPFolder, wpQueryFldrSortClass) \
+	(somSelf))
+#ifndef SOMGD_wpQueryFldrSortClass
+    #if (defined(_wpQueryFldrSortClass) || defined(__wpQueryFldrSortClass))
+        #undef _wpQueryFldrSortClass
+        #undef __wpQueryFldrSortClass
+        #define SOMGD_wpQueryFldrSortClass 1
+    #else
+        #define _wpQueryFldrSortClass WPFolder_wpQueryFldrSortClass
+    #endif /* _wpQueryFldrSortClass */
+#endif /* SOMGD_wpQueryFldrSortClass */
+
+/*
+ * New Method: wpSetSortAttribAvailable
+ */
+typedef BOOL   SOMLINK somTP_WPFolder_wpSetSortAttribAvailable(WPFolder *somSelf, 
+		ULONG index, 
+		BOOL Available);
+#pragma linkage(somTP_WPFolder_wpSetSortAttribAvailable, system)
+typedef somTP_WPFolder_wpSetSortAttribAvailable *somTD_WPFolder_wpSetSortAttribAvailable;
+#define somMD_WPFolder_wpSetSortAttribAvailable "::WPFolder::wpSetSortAttribAvailable"
+#define WPFolder_wpSetSortAttribAvailable(somSelf,index,Available) \
+    (SOM_Resolve(somSelf, WPFolder, wpSetSortAttribAvailable) \
+	(somSelf,index,Available))
+#ifndef SOMGD_wpSetSortAttribAvailable
+    #if (defined(_wpSetSortAttribAvailable) || defined(__wpSetSortAttribAvailable))
+        #undef _wpSetSortAttribAvailable
+        #undef __wpSetSortAttribAvailable
+        #define SOMGD_wpSetSortAttribAvailable 1
+    #else
+        #define _wpSetSortAttribAvailable WPFolder_wpSetSortAttribAvailable
+    #endif /* _wpSetSortAttribAvailable */
+#endif /* SOMGD_wpSetSortAttribAvailable */
+
+/*
+ * New Method: wpIsSortAttribAvailable
+ */
+typedef BOOL   SOMLINK somTP_WPFolder_wpIsSortAttribAvailable(WPFolder *somSelf, 
+		ULONG index);
+#pragma linkage(somTP_WPFolder_wpIsSortAttribAvailable, system)
+typedef somTP_WPFolder_wpIsSortAttribAvailable *somTD_WPFolder_wpIsSortAttribAvailable;
+#define somMD_WPFolder_wpIsSortAttribAvailable "::WPFolder::wpIsSortAttribAvailable"
+#define WPFolder_wpIsSortAttribAvailable(somSelf,index) \
+    (SOM_Resolve(somSelf, WPFolder, wpIsSortAttribAvailable) \
+	(somSelf,index))
+#ifndef SOMGD_wpIsSortAttribAvailable
+    #if (defined(_wpIsSortAttribAvailable) || defined(__wpIsSortAttribAvailable))
+        #undef _wpIsSortAttribAvailable
+        #undef __wpIsSortAttribAvailable
+        #define SOMGD_wpIsSortAttribAvailable 1
+    #else
+        #define _wpIsSortAttribAvailable WPFolder_wpIsSortAttribAvailable
+    #endif /* _wpIsSortAttribAvailable */
+#endif /* SOMGD_wpIsSortAttribAvailable */
+
+/*
+ * New Method: wpQueryIconViewPos
+ */
+typedef char*   SOMLINK somTP_WPFolder_wpQueryIconViewPos(WPFolder *somSelf);
+#pragma linkage(somTP_WPFolder_wpQueryIconViewPos, system)
+typedef somTP_WPFolder_wpQueryIconViewPos *somTD_WPFolder_wpQueryIconViewPos;
+#define somMD_WPFolder_wpQueryIconViewPos "::WPFolder::wpQueryIconViewPos"
+#define WPFolder_wpQueryIconViewPos(somSelf) \
+    (SOM_Resolve(somSelf, WPFolder, wpQueryIconViewPos) \
+	(somSelf))
+#ifndef SOMGD_wpQueryIconViewPos
+    #if (defined(_wpQueryIconViewPos) || defined(__wpQueryIconViewPos))
+        #undef _wpQueryIconViewPos
+        #undef __wpQueryIconViewPos
+        #define SOMGD_wpQueryIconViewPos 1
+    #else
+        #define _wpQueryIconViewPos WPFolder_wpQueryIconViewPos
+    #endif /* _wpQueryIconViewPos */
+#endif /* SOMGD_wpQueryIconViewPos */
+
+/*
+ * New Method: wpAddFirstChild
+ */
+typedef WPObject*   SOMLINK somTP_WPFolder_wpAddFirstChild(WPFolder *somSelf);
+#pragma linkage(somTP_WPFolder_wpAddFirstChild, system)
+typedef somTP_WPFolder_wpAddFirstChild *somTD_WPFolder_wpAddFirstChild;
+#define somMD_WPFolder_wpAddFirstChild "::WPFolder::wpAddFirstChild"
+#define WPFolder_wpAddFirstChild(somSelf) \
+    (SOM_Resolve(somSelf, WPFolder, wpAddFirstChild) \
+	(somSelf))
+#ifndef SOMGD_wpAddFirstChild
+    #if (defined(_wpAddFirstChild) || defined(__wpAddFirstChild))
+        #undef _wpAddFirstChild
+        #undef __wpAddFirstChild
+        #define SOMGD_wpAddFirstChild 1
+    #else
+        #define _wpAddFirstChild WPFolder_wpAddFirstChild
+    #endif /* _wpAddFirstChild */
+#endif /* SOMGD_wpAddFirstChild */
+
+/*
+ * New Method: wpQueryRWMonitorObject
+ */
+typedef PVOID   SOMLINK somTP_WPFolder_wpQueryRWMonitorObject(WPFolder *somSelf);
+#pragma linkage(somTP_WPFolder_wpQueryRWMonitorObject, system)
+typedef somTP_WPFolder_wpQueryRWMonitorObject *somTD_WPFolder_wpQueryRWMonitorObject;
+#define somMD_WPFolder_wpQueryRWMonitorObject "::WPFolder::wpQueryRWMonitorObject"
+#define WPFolder_wpQueryRWMonitorObject(somSelf) \
+    (SOM_Resolve(somSelf, WPFolder, wpQueryRWMonitorObject) \
+	(somSelf))
+#ifndef SOMGD_wpQueryRWMonitorObject
+    #if (defined(_wpQueryRWMonitorObject) || defined(__wpQueryRWMonitorObject))
+        #undef _wpQueryRWMonitorObject
+        #undef __wpQueryRWMonitorObject
+        #define SOMGD_wpQueryRWMonitorObject 1
+    #else
+        #define _wpQueryRWMonitorObject WPFolder_wpQueryRWMonitorObject
+    #endif /* _wpQueryRWMonitorObject */
+#endif /* SOMGD_wpQueryRWMonitorObject */
+
+/*
+ * New Method: wpQueryFldrFilter
+ */
+typedef WPObject*   SOMLINK somTP_WPFolder_wpQueryFldrFilter(WPFolder *somSelf);
+#pragma linkage(somTP_WPFolder_wpQueryFldrFilter, system)
+typedef somTP_WPFolder_wpQueryFldrFilter *somTD_WPFolder_wpQueryFldrFilter;
+#define somMD_WPFolder_wpQueryFldrFilter "::WPFolder::wpQueryFldrFilter"
+#define WPFolder_wpQueryFldrFilter(somSelf) \
+    (SOM_Resolve(somSelf, WPFolder, wpQueryFldrFilter) \
+	(somSelf))
+#ifndef SOMGD_wpQueryFldrFilter
+    #if (defined(_wpQueryFldrFilter) || defined(__wpQueryFldrFilter))
+        #undef _wpQueryFldrFilter
+        #undef __wpQueryFldrFilter
+        #define SOMGD_wpQueryFldrFilter 1
+    #else
+        #define _wpQueryFldrFilter WPFolder_wpQueryFldrFilter
+    #endif /* _wpQueryFldrFilter */
+#endif /* SOMGD_wpQueryFldrFilter */
+
+/*
+ * New Method: wpAssertFolderMutexSem
+ */
+typedef BOOL   SOMLINK somTP_WPFolder_wpAssertFolderMutexSem(WPFolder *somSelf);
+#pragma linkage(somTP_WPFolder_wpAssertFolderMutexSem, system)
+typedef somTP_WPFolder_wpAssertFolderMutexSem *somTD_WPFolder_wpAssertFolderMutexSem;
+#define somMD_WPFolder_wpAssertFolderMutexSem "::WPFolder::wpAssertFolderMutexSem"
+#define WPFolder_wpAssertFolderMutexSem(somSelf) \
+    (SOM_Resolve(somSelf, WPFolder, wpAssertFolderMutexSem) \
+	(somSelf))
+#ifndef SOMGD_wpAssertFolderMutexSem
+    #if (defined(_wpAssertFolderMutexSem) || defined(__wpAssertFolderMutexSem))
+        #undef _wpAssertFolderMutexSem
+        #undef __wpAssertFolderMutexSem
+        #define SOMGD_wpAssertFolderMutexSem 1
+    #else
+        #define _wpAssertFolderMutexSem WPFolder_wpAssertFolderMutexSem
+    #endif /* _wpAssertFolderMutexSem */
+#endif /* SOMGD_wpAssertFolderMutexSem */
+
+/*
+ * New Method: wpReleaseFolderMutexSem
+ */
+typedef ULONG   SOMLINK somTP_WPFolder_wpReleaseFolderMutexSem(WPFolder *somSelf);
+#pragma linkage(somTP_WPFolder_wpReleaseFolderMutexSem, system)
+typedef somTP_WPFolder_wpReleaseFolderMutexSem *somTD_WPFolder_wpReleaseFolderMutexSem;
+#define somMD_WPFolder_wpReleaseFolderMutexSem "::WPFolder::wpReleaseFolderMutexSem"
+#define WPFolder_wpReleaseFolderMutexSem(somSelf) \
+    (SOM_Resolve(somSelf, WPFolder, wpReleaseFolderMutexSem) \
+	(somSelf))
+#ifndef SOMGD_wpReleaseFolderMutexSem
+    #if (defined(_wpReleaseFolderMutexSem) || defined(__wpReleaseFolderMutexSem))
+        #undef _wpReleaseFolderMutexSem
+        #undef __wpReleaseFolderMutexSem
+        #define SOMGD_wpReleaseFolderMutexSem 1
+    #else
+        #define _wpReleaseFolderMutexSem WPFolder_wpReleaseFolderMutexSem
+    #endif /* _wpReleaseFolderMutexSem */
+#endif /* SOMGD_wpReleaseFolderMutexSem */
+
+/*
+ * New Method: wpRequestFolderMutexSem
+ */
+typedef ULONG   SOMLINK somTP_WPFolder_wpRequestFolderMutexSem(WPFolder *somSelf, 
+		ULONG ulTimeout);
+#pragma linkage(somTP_WPFolder_wpRequestFolderMutexSem, system)
+typedef somTP_WPFolder_wpRequestFolderMutexSem *somTD_WPFolder_wpRequestFolderMutexSem;
+#define somMD_WPFolder_wpRequestFolderMutexSem "::WPFolder::wpRequestFolderMutexSem"
+#define WPFolder_wpRequestFolderMutexSem(somSelf,ulTimeout) \
+    (SOM_Resolve(somSelf, WPFolder, wpRequestFolderMutexSem) \
+	(somSelf,ulTimeout))
+#ifndef SOMGD_wpRequestFolderMutexSem
+    #if (defined(_wpRequestFolderMutexSem) || defined(__wpRequestFolderMutexSem))
+        #undef _wpRequestFolderMutexSem
+        #undef __wpRequestFolderMutexSem
+        #define SOMGD_wpRequestFolderMutexSem 1
+    #else
+        #define _wpRequestFolderMutexSem WPFolder_wpRequestFolderMutexSem
+    #endif /* _wpRequestFolderMutexSem */
+#endif /* SOMGD_wpRequestFolderMutexSem */
+
+/*
+ * New Method: wpReleaseFindMutexSem
+ */
+typedef ULONG   SOMLINK somTP_WPFolder_wpReleaseFindMutexSem(WPFolder *somSelf);
+#pragma linkage(somTP_WPFolder_wpReleaseFindMutexSem, system)
+typedef somTP_WPFolder_wpReleaseFindMutexSem *somTD_WPFolder_wpReleaseFindMutexSem;
+#define somMD_WPFolder_wpReleaseFindMutexSem "::WPFolder::wpReleaseFindMutexSem"
+#define WPFolder_wpReleaseFindMutexSem(somSelf) \
+    (SOM_Resolve(somSelf, WPFolder, wpReleaseFindMutexSem) \
+	(somSelf))
+#ifndef SOMGD_wpReleaseFindMutexSem
+    #if (defined(_wpReleaseFindMutexSem) || defined(__wpReleaseFindMutexSem))
+        #undef _wpReleaseFindMutexSem
+        #undef __wpReleaseFindMutexSem
+        #define SOMGD_wpReleaseFindMutexSem 1
+    #else
+        #define _wpReleaseFindMutexSem WPFolder_wpReleaseFindMutexSem
+    #endif /* _wpReleaseFindMutexSem */
+#endif /* SOMGD_wpReleaseFindMutexSem */
+
+/*
+ * New Method: wpRequestFindMutexSem
+ */
+typedef ULONG   SOMLINK somTP_WPFolder_wpRequestFindMutexSem(WPFolder *somSelf, 
+		ULONG ulTimeout);
+#pragma linkage(somTP_WPFolder_wpRequestFindMutexSem, system)
+typedef somTP_WPFolder_wpRequestFindMutexSem *somTD_WPFolder_wpRequestFindMutexSem;
+#define somMD_WPFolder_wpRequestFindMutexSem "::WPFolder::wpRequestFindMutexSem"
+#define WPFolder_wpRequestFindMutexSem(somSelf,ulTimeout) \
+    (SOM_Resolve(somSelf, WPFolder, wpRequestFindMutexSem) \
+	(somSelf,ulTimeout))
+#ifndef SOMGD_wpRequestFindMutexSem
+    #if (defined(_wpRequestFindMutexSem) || defined(__wpRequestFindMutexSem))
+        #undef _wpRequestFindMutexSem
+        #undef __wpRequestFindMutexSem
+        #define SOMGD_wpRequestFindMutexSem 1
+    #else
+        #define _wpRequestFindMutexSem WPFolder_wpRequestFindMutexSem
+    #endif /* _wpRequestFindMutexSem */
+#endif /* SOMGD_wpRequestFindMutexSem */
+
+/*
+ * New Method: wpQueryIconN
+ */
+typedef HPOINTER   SOMLINK somTP_WPFolder_wpQueryIconN(WPFolder *somSelf, 
+		ULONG ulIndex);
+#pragma linkage(somTP_WPFolder_wpQueryIconN, system)
+typedef somTP_WPFolder_wpQueryIconN *somTD_WPFolder_wpQueryIconN;
+#define somMD_WPFolder_wpQueryIconN "::WPFolder::wpQueryIconN"
+#define WPFolder_wpQueryIconN(somSelf,ulIndex) \
+    (SOM_Resolve(somSelf, WPFolder, wpQueryIconN) \
+	(somSelf,ulIndex))
+#ifndef SOMGD_wpQueryIconN
+    #if (defined(_wpQueryIconN) || defined(__wpQueryIconN))
+        #undef _wpQueryIconN
+        #undef __wpQueryIconN
+        #define SOMGD_wpQueryIconN 1
+    #else
+        #define _wpQueryIconN WPFolder_wpQueryIconN
+    #endif /* _wpQueryIconN */
+#endif /* SOMGD_wpQueryIconN */
+
+/*
+ * New Method: wpQueryIconDataN
+ */
+typedef ULONG   SOMLINK somTP_WPFolder_wpQueryIconDataN(WPFolder *somSelf, 
+		PICONINFO pData, 
+		ULONG ulIndex);
+#pragma linkage(somTP_WPFolder_wpQueryIconDataN, system)
+typedef somTP_WPFolder_wpQueryIconDataN *somTD_WPFolder_wpQueryIconDataN;
+#define somMD_WPFolder_wpQueryIconDataN "::WPFolder::wpQueryIconDataN"
+#define WPFolder_wpQueryIconDataN(somSelf,pData,ulIndex) \
+    (SOM_Resolve(somSelf, WPFolder, wpQueryIconDataN) \
+	(somSelf,pData,ulIndex))
+#ifndef SOMGD_wpQueryIconDataN
+    #if (defined(_wpQueryIconDataN) || defined(__wpQueryIconDataN))
+        #undef _wpQueryIconDataN
+        #undef __wpQueryIconDataN
+        #define SOMGD_wpQueryIconDataN 1
+    #else
+        #define _wpQueryIconDataN WPFolder_wpQueryIconDataN
+    #endif /* _wpQueryIconDataN */
+#endif /* SOMGD_wpQueryIconDataN */
+
+/*
+ * New Method: wpSetIconDataN
+ */
+typedef BOOL   SOMLINK somTP_WPFolder_wpSetIconDataN(WPFolder *somSelf, 
+		PICONINFO pData, 
+		ULONG ulIndex);
+#pragma linkage(somTP_WPFolder_wpSetIconDataN, system)
+typedef somTP_WPFolder_wpSetIconDataN *somTD_WPFolder_wpSetIconDataN;
+#define somMD_WPFolder_wpSetIconDataN "::WPFolder::wpSetIconDataN"
+#define WPFolder_wpSetIconDataN(somSelf,pData,ulIndex) \
+    (SOM_Resolve(somSelf, WPFolder, wpSetIconDataN) \
+	(somSelf,pData,ulIndex))
+#ifndef SOMGD_wpSetIconDataN
+    #if (defined(_wpSetIconDataN) || defined(__wpSetIconDataN))
+        #undef _wpSetIconDataN
+        #undef __wpSetIconDataN
+        #define SOMGD_wpSetIconDataN 1
+    #else
+        #define _wpSetIconDataN WPFolder_wpSetIconDataN
+    #endif /* _wpSetIconDataN */
+#endif /* SOMGD_wpSetIconDataN */
+
+/*
+ * New Method: wpQueryBkgnd
+ */
+typedef PVOID   SOMLINK somTP_WPFolder_wpQueryBkgnd(WPFolder *somSelf);
+#pragma linkage(somTP_WPFolder_wpQueryBkgnd, system)
+typedef somTP_WPFolder_wpQueryBkgnd *somTD_WPFolder_wpQueryBkgnd;
+/*
+ *  returns an IBMFDRBKGND structure as declared in
+ *  include\filesys\folder.h
+ * 
+ *      * wpRedrawFolderBackground:
+ *      *      apparently gets called when folder background
+ *      *      data has changed and open folder views need
+ *      *      to redraw themselves.
+ */
+#define somMD_WPFolder_wpQueryBkgnd "::WPFolder::wpQueryBkgnd"
+#define WPFolder_wpQueryBkgnd(somSelf) \
+    (SOM_Resolve(somSelf, WPFolder, wpQueryBkgnd) \
+	(somSelf))
+#ifndef SOMGD_wpQueryBkgnd
+    #if (defined(_wpQueryBkgnd) || defined(__wpQueryBkgnd))
+        #undef _wpQueryBkgnd
+        #undef __wpQueryBkgnd
+        #define SOMGD_wpQueryBkgnd 1
+    #else
+        #define _wpQueryBkgnd WPFolder_wpQueryBkgnd
+    #endif /* _wpQueryBkgnd */
+#endif /* SOMGD_wpQueryBkgnd */
+
+/*
+ * New Method: wpRedrawFolderBackground
+ */
+typedef void   SOMLINK somTP_WPFolder_wpRedrawFolderBackground(WPFolder *somSelf);
+#pragma linkage(somTP_WPFolder_wpRedrawFolderBackground, system)
+typedef somTP_WPFolder_wpRedrawFolderBackground *somTD_WPFolder_wpRedrawFolderBackground;
+#define somMD_WPFolder_wpRedrawFolderBackground "::WPFolder::wpRedrawFolderBackground"
+#define WPFolder_wpRedrawFolderBackground(somSelf) \
+    (SOM_Resolve(somSelf, WPFolder, wpRedrawFolderBackground) \
+	(somSelf))
+#ifndef SOMGD_wpRedrawFolderBackground
+    #if (defined(_wpRedrawFolderBackground) || defined(__wpRedrawFolderBackground))
+        #undef _wpRedrawFolderBackground
+        #undef __wpRedrawFolderBackground
+        #define SOMGD_wpRedrawFolderBackground 1
+    #else
+        #define _wpRedrawFolderBackground WPFolder_wpRedrawFolderBackground
+    #endif /* _wpRedrawFolderBackground */
+#endif /* SOMGD_wpRedrawFolderBackground */
+
+/*
+ * New Method: _get_FirstObj
+ */
+typedef WPObject**   SOMLINK somTP_WPFolder__get_FirstObj(WPFolder *somSelf);
+#pragma linkage(somTP_WPFolder__get_FirstObj, system)
+typedef somTP_WPFolder__get_FirstObj *somTD_WPFolder__get_FirstObj;
+/*
+ * Method from the IDL attribute statement:
+ * "readonly attribute WPObject** FirstObj"
+ */
+#define somMD_WPFolder__get_FirstObj "::WPFolder::_get_FirstObj"
+#define WPFolder__get_FirstObj(somSelf) \
+    (SOM_Resolve(somSelf, WPFolder, _get_FirstObj) \
+	(somSelf))
+#ifndef SOMGD_get_FirstObj
+    #if (defined(_get_FirstObj) || defined(__get_FirstObj))
+        #undef _get_FirstObj
+        #undef __get_FirstObj
+        #define SOMGD_get_FirstObj 1
+    #else
+        #define __get_FirstObj WPFolder__get_FirstObj
+    #endif /* __get_FirstObj */
+#endif /* SOMGD_get_FirstObj */
+
+/*
+ * New Method: _get_LastObj
+ */
+typedef WPObject**   SOMLINK somTP_WPFolder__get_LastObj(WPFolder *somSelf);
+#pragma linkage(somTP_WPFolder__get_LastObj, system)
+typedef somTP_WPFolder__get_LastObj *somTD_WPFolder__get_LastObj;
+/*
+ * Method from the IDL attribute statement:
+ * "readonly attribute WPObject** LastObj"
+ */
+#define somMD_WPFolder__get_LastObj "::WPFolder::_get_LastObj"
+#define WPFolder__get_LastObj(somSelf) \
+    (SOM_Resolve(somSelf, WPFolder, _get_LastObj) \
+	(somSelf))
+#ifndef SOMGD_get_LastObj
+    #if (defined(_get_LastObj) || defined(__get_LastObj))
+        #undef _get_LastObj
+        #undef __get_LastObj
+        #define SOMGD_get_LastObj 1
+    #else
+        #define __get_LastObj WPFolder__get_LastObj
+    #endif /* __get_LastObj */
+#endif /* SOMGD_get_LastObj */
+#ifndef SOM_DONT_USE_INHERITED_MACROS
+#define WPFolder_wpSetRealName WPFileSystem_wpSetRealName
+#define WPFolder_wpSetType WPFileSystem_wpSetType
+#define WPFolder_wpQueryType WPFileSystem_wpQueryType
+#define WPFolder_wpSetAttr WPFileSystem_wpSetAttr
+#define WPFolder_wpQueryAttr WPFileSystem_wpQueryAttr
+#define WPFolder_wpAddFile1Page WPFileSystem_wpAddFile1Page
+#define WPFolder_wpQueryCreation WPFileSystem_wpQueryCreation
+#define WPFolder_wpQueryLastAccess WPFileSystem_wpQueryLastAccess
+#define WPFolder_wpQueryLastWrite WPFileSystem_wpQueryLastWrite
+#define WPFolder_wpQueryFileSize WPFileSystem_wpQueryFileSize
+#define WPFolder_wpQueryEASize WPFileSystem_wpQueryEASize
+#define WPFolder_wpSetDateInfo WPFileSystem_wpSetDateInfo
+#define WPFolder_wpSetFileSizeInfo WPFileSystem_wpSetFileSizeInfo
+#define WPFolder_wpQueryRefreshFlags WPFileSystem_wpQueryRefreshFlags
+#define WPFolder_wpSetRefreshFlags WPFileSystem_wpSetRefreshFlags
+#define WPFolder_wpPrintPlainTextFile WPFileSystem_wpPrintPlainTextFile
+#define WPFolder_wpSetTitleAndRenameFile WPFileSystem_wpSetTitleAndRenameFile
+#define WPFolder_wpConfirmRenameFileWithExt WPFileSystem_wpConfirmRenameFileWithExt
+#define WPFolder_wpVerifyUpdateAccess WPFileSystem_wpVerifyUpdateAccess
+#define WPFolder_wpAddUserItemsToPopupMenu WPFileSystem_wpAddUserItemsToPopupMenu
+#define WPFolder_wpIsDiskSwapped WPFileSystem_wpIsDiskSwapped
+#define WPFolder_wpQueryRealName WPFileSystem_wpQueryRealName
+#define WPFolder_wpQueryFilename WPFileSystem_wpQueryFilename
+#define WPFolder_wpQueryDisk WPFileSystem_wpQueryDisk
+#define WPFolder_wpQueryDateInfo WPFileSystem_wpQueryDateInfo
+#define WPFolder_wpConfirmKeepAssoc WPFileSystem_wpConfirmKeepAssoc
+#define WPFolder_wpRefreshFSInfo WPFileSystem_wpRefreshFSInfo
+#define WPFolder_wpQueryDriveData WPFileSystem_wpQueryDriveData
+#define WPFolder_wpSetNewRealName WPFileSystem_wpSetNewRealName
+#define WPFolder_wpAdoptNewRealName WPFileSystem_wpAdoptNewRealName
+#define WPFolder_wpQueryHandle WPObject_wpQueryHandle
+#define WPFolder_wpSaveImmediate WPObject_wpSaveImmediate
+#define WPFolder_wpFilterPopupMenu WPObject_wpFilterPopupMenu
+#define WPFolder_wpSetTitle WPObject_wpSetTitle
+#define WPFolder_wpViewObject WPObject_wpViewObject
+#define WPFolder_wpSwitchTo WPObject_wpSwitchTo
+#define WPFolder_wpCopyObject WPObject_wpCopyObject
+#define WPFolder_wpCreateFromTemplate WPObject_wpCreateFromTemplate
+#define WPFolder_wpQueryIcon WPObject_wpQueryIcon
+#define WPFolder_wpQueryIconData WPObject_wpQueryIconData
+#define WPFolder_wpQueryDetailsData WPObject_wpQueryDetailsData
+#define WPFolder_wpModifyPopupMenu WPObject_wpModifyPopupMenu
+#define WPFolder_wpDraggedOverObject WPObject_wpDraggedOverObject
+#define WPFolder_wpDroppedOnObject WPObject_wpDroppedOnObject
+#define WPFolder_wpQueryNameClashOptions WPObject_wpQueryNameClashOptions
+#define WPFolder_wpAppendObject WPObject_wpAppendObject
+#define WPFolder_wpReplaceObject WPObject_wpReplaceObject
+#define WPFolder_wpQueryStyle WPObject_wpQueryStyle
+#define WPFolder_wpSetStyle WPObject_wpSetStyle
+#define WPFolder_wpDoesObjectMatch WPObject_wpDoesObjectMatch
+#define WPFolder_wpAddObjectGeneralPage WPObject_wpAddObjectGeneralPage
+#define WPFolder_wpAddObjectGeneralPage2 WPObject_wpAddObjectGeneralPage2
+#define WPFolder_wpAddToObjUseList WPObject_wpAddToObjUseList
+#define WPFolder_wpAllocMem WPObject_wpAllocMem
+#define WPFolder_wpAssertObjectMutexSem WPObject_wpAssertObjectMutexSem
+#define WPFolder_wpClose WPObject_wpClose
+#define WPFolder_wpCnrInsertObject WPObject_wpCnrInsertObject
+#define WPFolder_wpCnrRemoveObject WPObject_wpCnrRemoveObject
+#define WPFolder_wpCnrSetEmphasis WPObject_wpCnrSetEmphasis
+#define WPFolder_wpConfirmObjectTitle WPObject_wpConfirmObjectTitle
+#define WPFolder_wpCopiedFromTemplate WPObject_wpCopiedFromTemplate
+#define WPFolder_wpCreateAnother WPObject_wpCreateAnother
+#define WPFolder_wpCreateShadowObject WPObject_wpCreateShadowObject
+#define WPFolder_wpDeleteFromObjUseList WPObject_wpDeleteFromObjUseList
+#define WPFolder_wpDisplayHelp WPObject_wpDisplayHelp
+#define WPFolder_wpEndConversation WPObject_wpEndConversation
+#define WPFolder_wpFindUseItem WPObject_wpFindUseItem
+#define WPFolder_wpFreeMem WPObject_wpFreeMem
+#define WPFolder_wpHide WPObject_wpHide
+#define WPFolder_wpInsertPopupMenuItems WPObject_wpInsertPopupMenuItems
+#define WPFolder_wpInsertSettingsPage WPObject_wpInsertSettingsPage
+#define WPFolder_wpPrintObject WPObject_wpPrintObject
+#define WPFolder_wpQueryConcurrentView WPObject_wpQueryConcurrentView
+#define WPFolder_wpQueryButtonAppearance WPObject_wpQueryButtonAppearance
+#define WPFolder_wpQueryConfirmations WPObject_wpQueryConfirmations
+#define WPFolder_wpQueryError WPObject_wpQueryError
+#define WPFolder_wpSetFolder WPObject_wpSetFolder
+#define WPFolder_wpQueryFolder WPObject_wpQueryFolder
+#define WPFolder_wpQueryMinWindow WPObject_wpQueryMinWindow
+#define WPFolder_wpSetTaskRec WPObject_wpSetTaskRec
+#define WPFolder_wpFindTaskRec WPObject_wpFindTaskRec
+#define WPFolder_wpQueryTitle WPObject_wpQueryTitle
+#define WPFolder_wpRegisterView WPObject_wpRegisterView
+#define WPFolder_wpReleaseObjectMutexSem WPObject_wpReleaseObjectMutexSem
+#define WPFolder_wpRequestObjectMutexSem WPObject_wpRequestObjectMutexSem
+#define WPFolder_wpRestore WPObject_wpRestore
+#define WPFolder_wpRestoreData WPObject_wpRestoreData
+#define WPFolder_wpRestoreLong WPObject_wpRestoreLong
+#define WPFolder_wpRestoreString WPObject_wpRestoreString
+#define WPFolder_wpSaveData WPObject_wpSaveData
+#define WPFolder_wpSaveDeferred WPObject_wpSaveDeferred
+#define WPFolder_wpSaveLong WPObject_wpSaveLong
+#define WPFolder_wpSaveString WPObject_wpSaveString
+#define WPFolder_wpScanSetupString WPObject_wpScanSetupString
+#define WPFolder_wpSetConcurrentView WPObject_wpSetConcurrentView
+#define WPFolder_wpSetButtonAppearance WPObject_wpSetButtonAppearance
+#define WPFolder_wpSetDefaultHelp WPObject_wpSetDefaultHelp
+#define WPFolder_wpSetDefaultView WPObject_wpSetDefaultView
+#define WPFolder_wpSetError WPObject_wpSetError
+#define WPFolder_wpSetIconHandle WPObject_wpSetIconHandle
+#define WPFolder_wpQueryScreenGroupID WPObject_wpQueryScreenGroupID
+#define WPFolder_wpSetupOnce WPObject_wpSetupOnce
+#define WPFolder_wpSetIcon WPObject_wpSetIcon
+#define WPFolder_wpSetMinWindow WPObject_wpSetMinWindow
+#define WPFolder_wpModifyStyle WPObject_wpModifyStyle
+#define WPFolder_wpQueryTrueStyle WPObject_wpQueryTrueStyle
+#define WPFolder_wpUnlockObject WPObject_wpUnlockObject
+#define WPFolder_wpIsObjectInitialized WPObject_wpIsObjectInitialized
+#define WPFolder_wpCreateShadowObjectExt WPObject_wpCreateShadowObjectExt
+#define WPFolder_wpCnrDeleteUseItem WPObject_wpCnrDeleteUseItem
+#define WPFolder_wpIsDeleteable WPObject_wpIsDeleteable
+#define WPFolder_wpQueryCoreRecord WPObject_wpQueryCoreRecord
+#define WPFolder_wpSetObjectID WPObject_wpSetObjectID
+#define WPFolder_wpQueryObjectID WPObject_wpQueryObjectID
+#define WPFolder_wpSetDefaultIconPos WPObject_wpSetDefaultIconPos
+#define WPFolder_wpQueryDefaultIconPos WPObject_wpQueryDefaultIconPos
+#define WPFolder_wpCnrRefreshDetails WPObject_wpCnrRefreshDetails
+#define WPFolder_wpFindViewItem WPObject_wpFindViewItem
+#define WPFolder_wpLockObject WPObject_wpLockObject
+#define WPFolder_wpIsLocked WPObject_wpIsLocked
+#define WPFolder_wpQueryContainerFlagPtr WPObject_wpQueryContainerFlagPtr
+#define WPFolder_wpWaitForClose WPObject_wpWaitForClose
+#define WPFolder_wpInsertMenuItems WPObject_wpInsertMenuItems
+#define WPFolder_wpSetMenuStyle WPObject_wpSetMenuStyle
+#define WPFolder_wpQueryMenuStyle WPObject_wpQueryMenuStyle
+#define WPFolder_wpSetNextObj WPObject_wpSetNextObj
+#define WPFolder_wpQueryNextObj WPObject_wpQueryNextObj
+#define WPFolder_wpMakeDormant WPObject_wpMakeDormant
+#define WPFolder_wpDestroyObject WPObject_wpDestroyObject
+#define WPFolder_wpDeleteWindowPosKeys WPObject_wpDeleteWindowPosKeys
+#define WPFolder_wpSetState WPObject_wpSetState
+#define WPFolder_wpQueryState WPObject_wpQueryState
+#define WPFolder_wpModifyState WPObject_wpModifyState
+#define WPFolder_wpIdentify WPObject_wpIdentify
+#define WPFolder__get_pobjNext WPObject__get_pobjNext
+#define WPFolder_somInit SOMObject_somInit
+#define WPFolder_somUninit SOMObject_somUninit
+#define WPFolder_somDefaultCopyInit SOMObject_somDefaultCopyInit
+#define WPFolder_somDefaultAssign SOMObject_somDefaultAssign
+#define WPFolder_somDefaultConstCopyInit SOMObject_somDefaultConstCopyInit
+#define WPFolder_somDefaultVCopyInit SOMObject_somDefaultVCopyInit
+#define WPFolder_somDefaultConstVCopyInit SOMObject_somDefaultConstVCopyInit
+#define WPFolder_somDefaultConstAssign SOMObject_somDefaultConstAssign
+#define WPFolder_somDefaultVAssign SOMObject_somDefaultVAssign
+#define WPFolder_somDefaultConstVAssign SOMObject_somDefaultConstVAssign
+#define WPFolder_somFree SOMObject_somFree
+#define WPFolder_somGetClass SOMObject_somGetClass
+#define WPFolder_somGetClassName SOMObject_somGetClassName
+#define WPFolder_somGetSize SOMObject_somGetSize
+#define WPFolder_somIsA SOMObject_somIsA
+#define WPFolder_somIsInstanceOf SOMObject_somIsInstanceOf
+#define WPFolder_somRespondsTo SOMObject_somRespondsTo
+#define WPFolder_somDispatch SOMObject_somDispatch
+#define WPFolder_somClassDispatch SOMObject_somClassDispatch
+#define WPFolder_somCastObj SOMObject_somCastObj
+#define WPFolder_somResetObj SOMObject_somResetObj
+#define WPFolder_somDispatchV SOMObject_somDispatchV
+#define WPFolder_somDispatchL SOMObject_somDispatchL
+#define WPFolder_somDispatchA SOMObject_somDispatchA
+#define WPFolder_somDispatchD SOMObject_somDispatchD
+#define WPFolder_somPrintSelf SOMObject_somPrintSelf
+#define WPFolder_somDumpSelf SOMObject_somDumpSelf
+#define WPFolder_somDumpSelfInt SOMObject_somDumpSelfInt
+#endif /* SOM_DONT_USE_INHERITED_MACROS */
+
+#endif       /* SOM_WPFolder_h */
+
+#ifndef SOM_M_WPFolder_h
+#define SOM_M_WPFolder_h
+
+
+#include <som.h>
+
+/*
+ * -- This emitter treats Method Tokens as Thunks by default.
+ * -- Use the sc modifier "nothunks" to change this default
+ */
+#undef somresolve_
+#define somresolve_(obj,mToken) ((somMethodProc*)((void)obj, mToken))
+
+/*
+ * Define the class name as an object type
+ */
+#ifndef M_WPFolder
+#define M_WPFolder SOMObject
+#endif
+#include <wpfsys.h>
+
+/*
+ * Start of bindings for IDL types
+ */
+
+
+/*
+ * End of bindings for IDL types.
+ */
+
+#define M_WPFolder_MajorVersion 1
+#define M_WPFolder_MinorVersion 2
+
+/*
+ * External name shortening if required
+ */
+#ifdef SOM_USE_SHORT_EXTERNAL_NAMES
+#define M_WPFolderNewClass wpfdrc
+#pragma linkage(wpfdrc, system)
+#define M_WPFolderClassData wpfdrd
+#define M_WPFolderCClassData wpfdrx
+#endif /* SOM_USE_SHORT_EXTERNAL_NAMES */
+/*--------------Migration------------*/
+#define M_WPFolder_classObj M_WPFolderClassData.classObject
+#define _M_WPFolder M_WPFolder_classObj
+
+/*
+ * Declare the class creation procedure
+ */
+SOMEXTERN SOMClass * SOMLINK M_WPFolderNewClass(integer4 somtmajorVersion,
+		integer4 somtminorVersion);
+#pragma linkage(M_WPFolderNewClass, system)
+
+/*
+ * Declare the class data structure
+ */
+SOMEXTERN struct M_WPFolderClassDataStructure {
+	SOMClass *classObject;
+	somMToken wpclsGetNotifySem;
+	somMToken wpclsReleaseNotifySem;
+	somMToken wpclsQueryOpenFolders;
+	somMToken wpclsQueryContainerFont;
+	somMToken wpclsQueryIconDataN;
+	somMToken wpclsQueryIconN;
+} SOMDLINK M_WPFolderClassData;
+
+/*
+ * Declare the C specific class data structure
+ */
+SOMEXTERN struct M_WPFolderCClassDataStructure {
+	somMethodTabs parentMtab;
+	somDToken instanceDataToken;
+} SOMDLINK M_WPFolderCClassData;
+
+/*
+ * New and Renew macros for M_WPFolder
+ */
+#define M_WPFolderNew() \
+   ( _M_WPFolder ? \
+	_somNew(_M_WPFolder) \
+	: ( M_WPFolderNewClass(\
+		M_WPFolder_MajorVersion, \
+		M_WPFolder_MinorVersion),\
+	   _somNew(_M_WPFolder)))
+#define M_WPFolderRenew(buf) \
+   ( _M_WPFolder ? \
+	_somRenew(_M_WPFolder, buf) \
+	: ( M_WPFolderNewClass(\
+		M_WPFolder_MajorVersion, \
+		M_WPFolder_MinorVersion),\
+	   _somRenew(_M_WPFolder, buf)))
+
+/*
+ * Override method: wpclsInitData
+ */
+#define M_WPFolder_wpclsInitData(somSelf) \
+	M_WPObject_wpclsInitData(somSelf)
+
+/*
+ * Override method: wpclsQueryDefaultView
+ */
+#define M_WPFolder_wpclsQueryDefaultView(somSelf) \
+	M_WPObject_wpclsQueryDefaultView(somSelf)
+
+/*
+ * Override method: wpclsQueryTitle
+ */
+#define M_WPFolder_wpclsQueryTitle(somSelf) \
+	M_WPObject_wpclsQueryTitle(somSelf)
+
+/*
+ * Override method: wpclsQueryIconData
+ */
+#define M_WPFolder_wpclsQueryIconData(somSelf,pIconInfo) \
+	M_WPObject_wpclsQueryIconData(somSelf,pIconInfo)
+
+/*
+ * Override method: wpclsQueryStyle
+ */
+#define M_WPFolder_wpclsQueryStyle(somSelf) \
+	M_WPObject_wpclsQueryStyle(somSelf)
+
+/*
+ * Override method: wpclsQueryDefaultHelp
+ */
+#define M_WPFolder_wpclsQueryDefaultHelp(somSelf,pHelpPanelId,pszHelpLibrary) \
+	M_WPObject_wpclsQueryDefaultHelp(somSelf,pHelpPanelId,pszHelpLibrary)
+
+/*
+ * New Method: wpclsQueryIconDataN
+ */
+typedef ULONG   SOMLINK somTP_M_WPFolder_wpclsQueryIconDataN(M_WPFolder *somSelf, 
+		ICONINFO* pIconInfo, 
+		ULONG ulIconIndex);
+#pragma linkage(somTP_M_WPFolder_wpclsQueryIconDataN, system)
+typedef somTP_M_WPFolder_wpclsQueryIconDataN *somTD_M_WPFolder_wpclsQueryIconDataN;
+#define somMD_M_WPFolder_wpclsQueryIconDataN "::M_WPFolder::wpclsQueryIconDataN"
+#define M_WPFolder_wpclsQueryIconDataN(somSelf,pIconInfo,ulIconIndex) \
+    (SOM_Resolve(somSelf, M_WPFolder, wpclsQueryIconDataN) \
+	(somSelf,pIconInfo,ulIconIndex))
+#ifndef SOMGD_wpclsQueryIconDataN
+    #if (defined(_wpclsQueryIconDataN) || defined(__wpclsQueryIconDataN))
+        #undef _wpclsQueryIconDataN
+        #undef __wpclsQueryIconDataN
+        #define SOMGD_wpclsQueryIconDataN 1
+    #else
+        #define _wpclsQueryIconDataN M_WPFolder_wpclsQueryIconDataN
+    #endif /* _wpclsQueryIconDataN */
+#endif /* SOMGD_wpclsQueryIconDataN */
+
+/*
+ * New Method: wpclsQueryIconN
+ */
+typedef HPOINTER   SOMLINK somTP_M_WPFolder_wpclsQueryIconN(M_WPFolder *somSelf, 
+		ULONG ulIconIndex);
+#pragma linkage(somTP_M_WPFolder_wpclsQueryIconN, system)
+typedef somTP_M_WPFolder_wpclsQueryIconN *somTD_M_WPFolder_wpclsQueryIconN;
+#define somMD_M_WPFolder_wpclsQueryIconN "::M_WPFolder::wpclsQueryIconN"
+#define M_WPFolder_wpclsQueryIconN(somSelf,ulIconIndex) \
+    (SOM_Resolve(somSelf, M_WPFolder, wpclsQueryIconN) \
+	(somSelf,ulIconIndex))
+#ifndef SOMGD_wpclsQueryIconN
+    #if (defined(_wpclsQueryIconN) || defined(__wpclsQueryIconN))
+        #undef _wpclsQueryIconN
+        #undef __wpclsQueryIconN
+        #define SOMGD_wpclsQueryIconN 1
+    #else
+        #define _wpclsQueryIconN M_WPFolder_wpclsQueryIconN
+    #endif /* _wpclsQueryIconN */
+#endif /* SOMGD_wpclsQueryIconN */
+
+/*
+ * New Method: wpclsQueryOpenFolders
+ */
+typedef WPFolder*   SOMLINK somTP_M_WPFolder_wpclsQueryOpenFolders(M_WPFolder *somSelf, 
+		WPFolder* Folder, 
+		ULONG ulOption, 
+		BOOL fLock);
+#pragma linkage(somTP_M_WPFolder_wpclsQueryOpenFolders, system)
+typedef somTP_M_WPFolder_wpclsQueryOpenFolders *somTD_M_WPFolder_wpclsQueryOpenFolders;
+#define somMD_M_WPFolder_wpclsQueryOpenFolders "::M_WPFolder::wpclsQueryOpenFolders"
+#define M_WPFolder_wpclsQueryOpenFolders(somSelf,Folder,ulOption,fLock) \
+    (SOM_Resolve(somSelf, M_WPFolder, wpclsQueryOpenFolders) \
+	(somSelf,Folder,ulOption,fLock))
+#ifndef SOMGD_wpclsQueryOpenFolders
+    #if (defined(_wpclsQueryOpenFolders) || defined(__wpclsQueryOpenFolders))
+        #undef _wpclsQueryOpenFolders
+        #undef __wpclsQueryOpenFolders
+        #define SOMGD_wpclsQueryOpenFolders 1
+    #else
+        #define _wpclsQueryOpenFolders M_WPFolder_wpclsQueryOpenFolders
+    #endif /* _wpclsQueryOpenFolders */
+#endif /* SOMGD_wpclsQueryOpenFolders */
+
+/*
+ * New Method: wpclsGetNotifySem
+ */
+typedef BOOL   SOMLINK somTP_M_WPFolder_wpclsGetNotifySem(M_WPFolder *somSelf, 
+		ULONG ulTimeout);
+#pragma linkage(somTP_M_WPFolder_wpclsGetNotifySem, system)
+typedef somTP_M_WPFolder_wpclsGetNotifySem *somTD_M_WPFolder_wpclsGetNotifySem;
+#define somMD_M_WPFolder_wpclsGetNotifySem "::M_WPFolder::wpclsGetNotifySem"
+#define M_WPFolder_wpclsGetNotifySem(somSelf,ulTimeout) \
+    (SOM_Resolve(somSelf, M_WPFolder, wpclsGetNotifySem) \
+	(somSelf,ulTimeout))
+#ifndef SOMGD_wpclsGetNotifySem
+    #if (defined(_wpclsGetNotifySem) || defined(__wpclsGetNotifySem))
+        #undef _wpclsGetNotifySem
+        #undef __wpclsGetNotifySem
+        #define SOMGD_wpclsGetNotifySem 1
+    #else
+        #define _wpclsGetNotifySem M_WPFolder_wpclsGetNotifySem
+    #endif /* _wpclsGetNotifySem */
+#endif /* SOMGD_wpclsGetNotifySem */
+
+/*
+ * New Method: wpclsReleaseNotifySem
+ */
+typedef void   SOMLINK somTP_M_WPFolder_wpclsReleaseNotifySem(M_WPFolder *somSelf);
+#pragma linkage(somTP_M_WPFolder_wpclsReleaseNotifySem, system)
+typedef somTP_M_WPFolder_wpclsReleaseNotifySem *somTD_M_WPFolder_wpclsReleaseNotifySem;
+#define somMD_M_WPFolder_wpclsReleaseNotifySem "::M_WPFolder::wpclsReleaseNotifySem"
+#define M_WPFolder_wpclsReleaseNotifySem(somSelf) \
+    (SOM_Resolve(somSelf, M_WPFolder, wpclsReleaseNotifySem) \
+	(somSelf))
+#ifndef SOMGD_wpclsReleaseNotifySem
+    #if (defined(_wpclsReleaseNotifySem) || defined(__wpclsReleaseNotifySem))
+        #undef _wpclsReleaseNotifySem
+        #undef __wpclsReleaseNotifySem
+        #define SOMGD_wpclsReleaseNotifySem 1
+    #else
+        #define _wpclsReleaseNotifySem M_WPFolder_wpclsReleaseNotifySem
+    #endif /* _wpclsReleaseNotifySem */
+#endif /* SOMGD_wpclsReleaseNotifySem */
+#ifndef SOM_DONT_USE_INHERITED_MACROS
+#define M_WPFolder_wpclsQueryAwakeObject M_WPFileSystem_wpclsQueryAwakeObject
+#define M_WPFolder_wpclsFileSysExists M_WPFileSystem_wpclsFileSysExists
+#define M_WPFolder_wpclsQueryObjectFromPath M_WPFileSystem_wpclsQueryObjectFromPath
+#define M_WPFolder_wpclsQueryInstanceType M_WPFileSystem_wpclsQueryInstanceType
+#define M_WPFolder_wpclsQueryInstanceFilter M_WPFileSystem_wpclsQueryInstanceFilter
+#define M_WPFolder_wpclsQueryDetailsInfo M_WPObject_wpclsQueryDetailsInfo
+#define M_WPFolder_wpclsQuerySearchInfo M_WPObject_wpclsQuerySearchInfo
+#define M_WPFolder_wpclsQueryExtendedCriteria M_WPObject_wpclsQueryExtendedCriteria
+#define M_WPFolder_wpclsNew M_WPObject_wpclsNew
+#define M_WPFolder_wpclsCreateDefaultTemplates M_WPObject_wpclsCreateDefaultTemplates
+#define M_WPFolder_wpclsMakeAwake M_WPObject_wpclsMakeAwake
+#define M_WPFolder_wpclsQueryDetails M_WPObject_wpclsQueryDetails
+#define M_WPFolder_wpclsQueryFolder M_WPObject_wpclsQueryFolder
+#define M_WPFolder_wpclsQueryIcon M_WPObject_wpclsQueryIcon
+#define M_WPFolder_wpclsUnInitData M_WPObject_wpclsUnInitData
+#define M_WPFolder_wpclsFindObjectFirst M_WPObject_wpclsFindObjectFirst
+#define M_WPFolder_wpclsFindObjectNext M_WPObject_wpclsFindObjectNext
+#define M_WPFolder_wpclsFindObjectEnd M_WPObject_wpclsFindObjectEnd
+#define M_WPFolder_wpclsSetError M_WPObject_wpclsSetError
+#define M_WPFolder_wpclsQueryError M_WPObject_wpclsQueryError
+#define M_WPFolder_wpclsQuerySettingsPageSize M_WPObject_wpclsQuerySettingsPageSize
+#define M_WPFolder_wpclsQueryObject M_WPObject_wpclsQueryObject
+#define M_WPFolder_wpclsQueryButtonAppearance M_WPObject_wpclsQueryButtonAppearance
+#define M_WPFolder_wpclsDecUsage M_WPObject_wpclsDecUsage
+#define M_WPFolder_wpclsIncUsage M_WPObject_wpclsIncUsage
+#define M_WPFolder_wpclsInsertMultipleObjects M_WPObject_wpclsInsertMultipleObjects
+#define M_WPFolder_wpclsFindOneObject M_WPObject_wpclsFindOneObject
+#define M_WPFolder_wpclsSetSettingsPageSize M_WPObject_wpclsSetSettingsPageSize
+#define M_WPFolder_wpclsSetIconData M_WPObject_wpclsSetIconData
+#define M_WPFolder_wpclsSetIcon M_WPObject_wpclsSetIcon
+#define M_WPFolder_wpclsObjectFromHandle M_WPObject_wpclsObjectFromHandle
+#define M_WPFolder_wpclsRemoveObjects M_WPObject_wpclsRemoveObjects
+#define M_WPFolder_wpclsQueryMaxAnimationIcons M_WPObject_wpclsQueryMaxAnimationIcons
+#define M_WPFolder_somUninit SOMObject_somUninit
+#define M_WPFolder_somClassReady SOMClass_somClassReady
+#define M_WPFolder_somNew SOMClass_somNew
+#define M_WPFolder_somRenew SOMClass_somRenew
+#define M_WPFolder__get_somDataAlignment SOMClass__get_somDataAlignment
+#define M_WPFolder__get_somInstanceDataOffsets SOMClass__get_somInstanceDataOffsets
+#define M_WPFolder__get_somDirectInitClasses SOMClass__get_somDirectInitClasses
+#define M_WPFolder_somNewNoInit SOMClass_somNewNoInit
+#define M_WPFolder_somRenewNoInit SOMClass_somRenewNoInit
+#define M_WPFolder_somRenewNoZero SOMClass_somRenewNoZero
+#define M_WPFolder_somRenewNoInitNoZero SOMClass_somRenewNoInitNoZero
+#define M_WPFolder_somAllocate SOMClass_somAllocate
+#define M_WPFolder_somDeallocate SOMClass_somDeallocate
+#define M_WPFolder_somInitClass SOMClass_somInitClass
+#define M_WPFolder_somInitMIClass SOMClass_somInitMIClass
+#define M_WPFolder_somAddStaticMethod SOMClass_somAddStaticMethod
+#define M_WPFolder_somAddDynamicMethod SOMClass_somAddDynamicMethod
+#define M_WPFolder_somOverrideSMethod SOMClass_somOverrideSMethod
+#define M_WPFolder_somGetApplyStub SOMClass_somGetApplyStub
+#define M_WPFolder_somGetClassData SOMClass_somGetClassData
+#define M_WPFolder_somSetClassData SOMClass_somSetClassData
+#define M_WPFolder_somGetClassMtab SOMClass_somGetClassMtab
+#define M_WPFolder_somGetInstanceOffset SOMClass_somGetInstanceOffset
+#define M_WPFolder_somGetInstancePartSize SOMClass_somGetInstancePartSize
+#define M_WPFolder_somGetInstanceSize SOMClass_somGetInstanceSize
+#define M_WPFolder_somGetInstanceToken SOMClass_somGetInstanceToken
+#define M_WPFolder_somGetMemberToken SOMClass_somGetMemberToken
+#define M_WPFolder_somGetMethodData SOMClass_somGetMethodData
+#define M_WPFolder_somGetRdStub SOMClass_somGetRdStub
+#define M_WPFolder_somGetMethodDescriptor SOMClass_somGetMethodDescriptor
+#define M_WPFolder_somGetMethodIndex SOMClass_somGetMethodIndex
+#define M_WPFolder_somGetMethodToken SOMClass_somGetMethodToken
+#define M_WPFolder_somGetName SOMClass_somGetName
+#define M_WPFolder_somGetNthMethodData SOMClass_somGetNthMethodData
+#define M_WPFolder_somGetNthMethodInfo SOMClass_somGetNthMethodInfo
+#define M_WPFolder_somGetNumMethods SOMClass_somGetNumMethods
+#define M_WPFolder_somGetNumStaticMethods SOMClass_somGetNumStaticMethods
+#define M_WPFolder_somGetParent SOMClass_somGetParent
+#define M_WPFolder_somGetParents SOMClass_somGetParents
+#define M_WPFolder_somGetVersionNumbers SOMClass_somGetVersionNumbers
+#define M_WPFolder_somFindMethod SOMClass_somFindMethod
+#define M_WPFolder_somFindMethodOk SOMClass_somFindMethodOk
+#define M_WPFolder_somFindSMethod SOMClass_somFindSMethod
+#define M_WPFolder_somFindSMethodOk SOMClass_somFindSMethodOk
+#define M_WPFolder_somLookupMethod SOMClass_somLookupMethod
+#define M_WPFolder_somCheckVersion SOMClass_somCheckVersion
+#define M_WPFolder_somDescendedFrom SOMClass_somDescendedFrom
+#define M_WPFolder_somSupportsMethod SOMClass_somSupportsMethod
+#define M_WPFolder_somDefinedMethod SOMClass_somDefinedMethod
+#define M_WPFolder_somOverrideMtab SOMClass_somOverrideMtab
+#define M_WPFolder_somDefaultInit SOMObject_somDefaultInit
+#define M_WPFolder_somDestruct SOMObject_somDestruct
+#define M_WPFolder_somDefaultCopyInit SOMObject_somDefaultCopyInit
+#define M_WPFolder_somDefaultAssign SOMObject_somDefaultAssign
+#define M_WPFolder_somDefaultConstCopyInit SOMObject_somDefaultConstCopyInit
+#define M_WPFolder_somDefaultVCopyInit SOMObject_somDefaultVCopyInit
+#define M_WPFolder_somDefaultConstVCopyInit SOMObject_somDefaultConstVCopyInit
+#define M_WPFolder_somDefaultConstAssign SOMObject_somDefaultConstAssign
+#define M_WPFolder_somDefaultVAssign SOMObject_somDefaultVAssign
+#define M_WPFolder_somDefaultConstVAssign SOMObject_somDefaultConstVAssign
+#define M_WPFolder_somInit SOMObject_somInit
+#define M_WPFolder_somFree SOMObject_somFree
+#define M_WPFolder_somGetClass SOMObject_somGetClass
+#define M_WPFolder_somGetClassName SOMObject_somGetClassName
+#define M_WPFolder_somGetSize SOMObject_somGetSize
+#define M_WPFolder_somIsA SOMObject_somIsA
+#define M_WPFolder_somIsInstanceOf SOMObject_somIsInstanceOf
+#define M_WPFolder_somRespondsTo SOMObject_somRespondsTo
+#define M_WPFolder_somDispatch SOMObject_somDispatch
+#define M_WPFolder_somClassDispatch SOMObject_somClassDispatch
+#define M_WPFolder_somCastObj SOMObject_somCastObj
+#define M_WPFolder_somResetObj SOMObject_somResetObj
+#define M_WPFolder_somDispatchV SOMObject_somDispatchV
+#define M_WPFolder_somDispatchL SOMObject_somDispatchL
+#define M_WPFolder_somDispatchA SOMObject_somDispatchA
+#define M_WPFolder_somDispatchD SOMObject_somDispatchD
+#define M_WPFolder_somPrintSelf SOMObject_somPrintSelf
+#define M_WPFolder_somDumpSelf SOMObject_somDumpSelf
+#define M_WPFolder_somDumpSelfInt SOMObject_somDumpSelfInt
+#endif /* SOM_DONT_USE_INHERITED_MACROS */
+
+#endif       /* SOM_M_WPFolder_h */
+
Index: /tags/CWMM-0.3.0_GA/classes/makefile
===================================================================
--- /tags/CWMM-0.3.0_GA/classes/makefile	(revision 213)
+++ /tags/CWMM-0.3.0_GA/classes/makefile	(revision 213)
@@ -0,0 +1,363 @@
+# Makefile
+
+include ../make.inc
+DISTNAME	=	cwaudio-classes-$(VERSION)
+CC           = icc
+
+LDFLAGS =	-Ge- /Gm+ -G4 /Ss -Gl /O+ -Oc+ -Ol-  /Q+
+#-Wcnd /Weff /Wini /Wpar /Wpro /Wuse /Wrea
+#CFLAGS       =    /Wuse /Wrea -Ge- /Gm+ -G4 /Ss -Gl /O+ -Oc+ -Ol- /Q+ /C
+CFLAGS       =    -Ge- /Gm+ -G4 /Ss -Gl /O+ -Oc+ -Ol- /Q+ /C
+
+LIBS		=	somtk.lib mmPM2.lib rexx.lib
+DEFS		=
+
+MOREINC	=	./include -I./inc -I../common_functions/include
+CDIR	=	./c
+IDLDIR	=	./idl
+OBJDIR	=	./obj
+
+# Object files of common functions (CW functions) are going here
+LIBDIR	=	./lib
+
+
+#######################################
+#
+# Define compile command
+#
+#######################################
+
+########### C compile #################
+COMPILE		=	$(CC) -I $(MOREINC) $(CFLAGS)  /Fo$@ $<
+
+########### SOM compile ###############
+#Audio classes
+AUD_SCCOMPILEC	=	sc -I $(IDLDIR)/idl_audio -I $(IDLDIR)/idl_mm -p -r -sc -d$(CDIR)/c_audio -maddstar -mnoint -S128000 -C128000  $<
+AUD_SCCOMPILEIH	=	sc -I $(IDLDIR)/idl_audio -I $(IDLDIR)/idl_mm -p -r -s"ih;h" -dinclude -maddstar -mnoint -S128000 -C128000  $<
+
+#Video
+VID_SCCOMPILEC	=	sc -I $(IDLDIR)/idl_video -p -r -sc -d$(CDIR)/c_video -maddstar -mnoint -S128000 -C128000  $<
+VID_SCCOMPILEIH	=	sc -I $(IDLDIR)/idl_video -p -r -s"ih;h" -dinclude -maddstar -mnoint -S128000 -C128000  $<
+
+#image
+IMG_SCCOMPILEC	=	sc -I $(IDLDIR)/idl_image -p -r -sc -d$(CDIR)/c_image -maddstar -mnoint -S128000 -C128000  $<
+IMG_SCCOMPILEIH	=	sc -I $(IDLDIR)/idl_image -p -r -s"ih;h" -dinclude -maddstar -mnoint -S128000 -C128000  $<
+
+#base classes
+MM_SCCOMPILEC	=	sc -I $(IDLDIR)/idl_mm -p -r -sc -d$(CDIR)/c_mm -maddstar -mnoint -S128000 -C128000  $<
+MM_SCCOMPILEIH	=	sc -I $(IDLDIR)/idl_mm -p -r -s"ih;h" -dinclude -maddstar -mnoint -S128000 -C128000  $<
+
+
+
+#######################################
+#
+# Define objects to build
+#
+#######################################
+
+# These are the object files containing general functions
+LIBOBJS	=	$(LIBDIR)/menu_funcs.obj \
+		$(LIBDIR)/message.obj \
+		$(LIBDIR)/ea_funcs.obj \
+		$(LIBDIR)/som_wps_funcs.obj \
+		$(LIBDIR)/sys_funcs.obj
+
+#Audio objects
+OBJECTS	=	$(OBJDIR)/cwmp3.obj \
+			$(OBJDIR)/cwogg.obj \
+			$(OBJDIR)/cwcdtrack.obj \
+			$(OBJDIR)/cwaudio.obj \
+			$(OBJDIR)/mmwav.obj \
+			$(OBJDIR)/cwaif.obj \
+			$(OBJDIR)/cwau.obj \
+			$(OBJDIR)/cw_au.obj \
+			$(OBJDIR)/cwiff.obj \
+			$(OBJDIR)/cwsndf.obj \
+			$(OBJDIR)/cwvoc.obj \
+			$(OBJDIR)/cwmidi.obj \
+			$(OBJDIR)/cwastream.obj \
+			$(OBJDIR)/cwm3u.obj \
+			$(OBJDIR)/cwflac.obj
+
+VID_OBJECTS	=	$(OBJDIR)/cwvideo.obj \
+			$(OBJDIR)/cwmpg.obj \
+			$(OBJDIR)/cwmov.obj \
+			$(OBJDIR)/cwfli.obj \
+			$(OBJDIR)/cwavi.obj
+
+IMG_OBJECTS	=	$(OBJDIR)/cwimage.obj \
+			$(OBJDIR)/cwavc.obj \
+			$(OBJDIR)/cwdib.obj \
+			$(OBJDIR)/cwgif.obj \
+			$(OBJDIR)/cwjpg.obj \
+			$(OBJDIR)/cwpcd.obj \
+			$(OBJDIR)/cwpcx.obj \
+			$(OBJDIR)/cwtga.obj \
+			$(OBJDIR)/cwtiff.obj \
+			$(OBJDIR)/cwmmotion.obj \
+			$(OBJDIR)/cwbmp.obj \
+			$(OBJDIR)/bitmap.obj \
+			$(OBJDIR)/cwpng.obj
+
+MM_OBJECTS	=	$(OBJDIR)/cwmmdataf.obj \
+			$(OBJDIR)/cwmmdisk.obj \
+			$(OBJDIR)/mmfolder.obj
+
+COMMON_OBJECTS	=	$(OBJDIR)/except.obj \
+				$(OBJDIR)/message.obj \
+				$(OBJDIR)/cd.obj \
+				$(OBJDIR)/mmrexx.obj \
+				$(OBJDIR)/helper.obj \
+				$(OBJDIR)/som_and_wps.obj
+
+ALL_OBJECTS	=	$(MM_OBJECTS) $(OBJECTS) $(VID_OBJECTS) $(IMG_OBJECTS) \
+			$(COMMON_OBJECTS) $(LIBOBJS)
+
+
+#######################################
+#
+# Define *.hlp files.
+#
+#######################################
+HLP_FILES	=	./Help/de/cwmm049.hlp \
+			./Help/en/cwmm.hlp \
+			./Help/es/cwmm034.hlp \
+			./Help/fr/cwmm033.hlp \
+			./Help/nl/cwmm031.hlp \
+			./Help/it/cwmm039.hlp \
+                        ./Help/ru/cwmm007.hlp \
+			./Help/tw/cwmm088.hlp
+
+
+#######################################
+#
+# Define *.ih files.
+#
+#######################################
+MM_IHFILES	=	./include/cwmmdataf.ih \
+			./include/cwmmdisk.ih \
+			./include/mmfolder.ih
+
+IHFILES		=	./include/cwmp3.ih \
+			./include/cwogg.ih \
+			./include/cwaudio.ih \
+			./include/cwcdtrack.ih  \
+			./include/mmwav.ih \
+			./include/cwaif.ih \
+			./include/cwau.ih \
+			./include/cw_au.ih \
+			./include/cwiff.ih \
+			./include/cwsndf.ih \
+			./include/cwvoc.ih \
+			./include/cwastream.ih \
+			./include/cwmidi.ih \
+			./include/cwm3u.ih \
+			./include/cwflac.ih
+
+VID_IHFILES	=	./include/cwvideo.ih \
+			./include/cwmpg.ih \
+			./include/cwmov.ih \
+			./include/cwfli.ih \
+			./include/cwavi.ih
+
+IMG_IHFILES	=	./include/wpimage.ih \
+			./include/cwimage.ih \
+			./include/cwavc.ih \
+			./include/cwdib.ih \
+			./include/cwgif.ih \
+			./include/cwjpg.ih \
+			./include/cwpcd.ih \
+			./include/cwpcx.ih \
+			./include/cwtga.ih \
+			./include/cwtiff.ih \
+			./include/cwmmotion.ih \
+			./include/cwbmp.ih \
+			./include/cwpng.ih
+
+#######################################
+#
+# Define targets to build
+#
+#######################################
+all: cwmm.dll $(HLP_FILES) nlv
+	cd ./mm-progs && make
+
+
+RESDLL	:
+
+cwmm.dll: $(MM_IHFILES) $(IHFILES) $(VID_IHFILES) $(IMG_IHFILES) \
+	$(ALL_OBJECTS)
+	@create_cwmm_def.CMD $(OBJDIR)/cwmm.def
+	$(CC) $(LDFLAGS) /L  /Fm$(basename $@)  /Fe$@ $(ALL_OBJECTS) $(LIBS) $(OBJDIR)/cwmm.def
+#Add icons to DLL (no NLV stuff)
+	cd ./res && make
+	rc ./res/common_res/cwaudio.res cwmm.dll
+	MAPSYM cwmm.map
+
+###################################
+#
+#  Rules for generating the NLV
+#  ressources.
+#
+###################################
+nlv:
+	cd ./res && make
+	
+
+###################################
+#
+#  Rules for generating online help
+#
+###################################
+# German
+./Help/de/cwmm049.hlp:	./Help/de/cwmm049.ipf
+	cd ./Help/de && make 	
+
+# English
+./Help/en/cwmm.hlp:	./Help/en/cwmm.ipf
+	cd ./Help/en && make
+
+# Spanish
+./Help/es/cwmm034.hlp:  ./Help/es/cwmm034.ipf
+	cd ./Help/es && make
+
+# French
+./Help/fr/cwmm033.hlp:	./Help/fr/cwmm033.ipf
+	cd ./Help/fr && make
+
+# Dutch
+./Help/nl/cwmm031.hlp:	./Help/nl/cwmm031.ipf
+	cd ./Help/nl && make
+
+# Italian
+./Help/it/cwmm039.hlp:	./Help/it/cwmm039.ipf
+	cd ./Help/it && make
+
+# Russian
+./Help/ru/cwmm007.hlp:	./Help/ru/cwmm007.ipf
+	cd ./Help/ru && make
+
+# Taiwan
+./Help/tw/cwmm088.hlp:  ./Help/tw/cwmm088.ipf
+	cd ./Help/tw && make
+
+###################################
+#
+#  Create all the *.ih files from the IDL files        #
+#
+###################################
+
+##### Create *.ih files for base MM classes ####
+./include/%.ih:	$(IDLDIR)/idl_mm/%.idl
+	$(MM_SCCOMPILEC)
+	$(MM_SCCOMPILEIH)
+
+#### Create *.ih files for audio classes ####
+./include/%.ih:	$(IDLDIR)/idl_audio/%.idl
+	$(AUD_SCCOMPILEC)
+	$(AUD_SCCOMPILEIH)
+
+#### Create *.ih files for video classes ####
+./include/%.ih:	$(IDLDIR)/idl_video/%.idl
+	$(VID_SCCOMPILEC)
+	$(VID_SCCOMPILEIH)
+
+#### Create *.ih files for image classes ####
+./include/wpimage.ih:	$(IDLDIR)/idl_image/wpimage.idl
+	$(IMG_SCCOMPILEIH)
+
+./include/cwimage.ih:	$(IDLDIR)/idl_image/cwimage.idl
+	$(IMG_SCCOMPILEIH)
+	$(IMG_SCCOMPILEC)
+	sc -shh -I $(IDLDIR)/idl_image -S128000 -dinclude -m noqualifytypes $<
+
+./include/%.ih:	$(IDLDIR)/idl_image/%.idl
+	$(IMG_SCCOMPILEC)
+	$(IMG_SCCOMPILEIH)
+
+###################################
+#
+#    Rules for compiling
+#
+###################################
+
+# Compile base MM classes
+$(OBJDIR)/%.obj:	$(CDIR)/c_mm/%.c ./include/%.ih
+	$(COMPILE)
+
+# Compile audio MM classes
+$(OBJDIR)/%.obj:	$(CDIR)/c_audio/%.c ./include/%.ih
+	$(COMPILE)
+
+# Compile video MM classes
+$(OBJDIR)/%.obj:	$(CDIR)/c_video/%.c ./include/%.ih
+	$(COMPILE)
+
+# Compile image MM classes
+$(OBJDIR)/%.obj:	$(CDIR)/c_image/%.c ./include/%.ih
+	$(COMPILE)
+
+$(OBJDIR)/bitmap.obj:	$(CDIR)/c_image/bitmap.c
+	$(COMPILE)
+
+# Compile common functions
+$(OBJDIR)/except.obj:	$(CDIR)/c_common/except.c ./inc/omf.h ./inc/sym.h
+	$(COMPILE)
+
+$(OBJDIR)/%.obj:	$(CDIR)/c_common/%.c
+	$(COMPILE)
+
+# Compile lib files containg generic function
+$(LIBDIR)/%.obj:	$(COMMONSRC)/%.c
+	$(COMPILE)
+
+###################################
+#
+#  Rules for cleaning the tree
+#
+###################################
+
+clean:
+	-cd $(OBJDIR) && rm *.obj
+	-cd ./include && rm *.ih
+	-cd ./include && rm *.h
+	-cd ./include && rm *.hh
+	-cd $(LIBDIR) && rm *.obj
+	-rm *.dll
+	-rm *.map
+	-rm *.sym
+	-cd ./Help/de && make clean
+	-cd ./Help/en && make clean
+	-cd ./Help/es && make clean
+	-cd ./Help/fr && make clean
+	-cd ./Help/nl && make clean
+	-cd ./Help/it && make clean
+	-cd ./Help/tw && make clean
+	-cd ./res && make clean
+	-cd ./mm-progs && make clean
+
+
+cleaner:
+	-cd ./c && make clean
+	-cd ./common_functions && make cleaner
+	-cd ./mm-progs && make cleaner
+	-cd ./Help/de && make cleaner
+	-cd ./Help/en && make cleaner
+	-cd ./Help/es && make cleaner
+	-cd ./Help/fr && make cleaner
+	-cd ./Help/nl && make cleaner
+	-cd ./Help/it && make cleaner
+	-cd ./Help/tw && make cleaner
+	-cd ./res && make cleaner
+	-cd ./mm-progs && make cleaner
+	-cd ./include && rm *.*~
+	-cd ./inc && rm *.*~
+	-cd $(IDLDIR)/idl_audio && rm *.*~
+	-cd $(IDLDIR)/idl_image && rm *.*~
+	-cd $(IDLDIR)/idl_mm && rm *.*~
+	-cd $(IDLDIR)/idl_video && rm *.*~
+
+distribution:
+	make
+
+
Index: /tags/CWMM-0.3.0_GA/classes/mm-progs/MMPlayer/customprocs.c
===================================================================
--- /tags/CWMM-0.3.0_GA/classes/mm-progs/MMPlayer/customprocs.c	(revision 213)
+++ /tags/CWMM-0.3.0_GA/classes/mm-progs/MMPlayer/customprocs.c	(revision 213)
@@ -0,0 +1,888 @@
+/*
+ * This file is (C) Chris Wohlgemuth 2002
+ * It is part of the MediaFolder package
+ */
+/*
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; see the file COPYING.  If not, write to
+ * the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+/*
+ * If you need another license for your project/product (commercial,
+ * noncommercial, whatever) contact me at
+ *
+ * http://www.os2world.com/cdwriting
+ * http://www.geocities.com/SiliconValley/Sector/5785/
+ *
+ */
+
+#define INCL_GPILCIDS
+#define INCL_GPIPRIMITIVES
+#define INCL_GPIBITMAPS
+#define INCL_GPILOGCOLORTABLE
+#define INCL_SW
+#define INCL_GPIREGIONS
+#define INCL_WIN
+
+#include <os2.h>
+
+#include "common.h"
+#include "mmplayerres.h"
+#include "mmres.h"
+#include "mmplayer.h"
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+
+/* Fonts to use in dialogs */
+#define DEFAULT_DIALOG_FONT   "9.WarpSans"
+
+/* Bitmap data */
+extern LOADEDBITMAP allBMPs[];
+extern CONTROLINFO ciControls[];
+
+/* Window procedures */
+extern PFNWP  oldPlayTimeProc;
+extern PFNWP orgBgProc; /* Org proc of background */
+extern PFNWP orgButtonProc;
+extern HPOINTER hptrArrowWE;
+
+MRESULT handleDrag0ver(PDRAGINFO pdi, HWND hwnd);
+MRESULT handleDrop(PDRAGINFO pdi, HWND hwnd);
+
+/* This custom button proc is only for DnD handling */
+MRESULT EXPENTRY buttonProc(HWND hwnd, ULONG msg, MPARAM mp1, MPARAM mp2)
+{
+  switch(msg)
+    {
+      /* Drag and drop of audio files */
+    case DM_DRAGOVER:
+      {
+        PDRAGINFO pdi=PVOIDFROMMP(mp1);
+
+        return handleDrag0ver( pdi, WinQueryWindow(hwnd, QW_PARENT));
+      }
+    case DM_DROP:
+      {
+        PDRAGINFO pdi=PVOIDFROMMP(mp1);
+
+        return handleDrop( pdi, WinQueryWindow(hwnd, QW_PARENT));
+      }
+    default:
+      break;
+    }
+  if(orgButtonProc)
+    return (*orgButtonProc)(hwnd, msg, mp1, mp2);
+  else
+    return WinDefWindowProc(hwnd, msg, mp1, mp2);
+}
+
+MRESULT EXPENTRY bgProc(HWND hwnd, ULONG msg, MPARAM mp1, MPARAM mp2)
+{
+  switch(msg)
+    {
+      /*****************************************************/
+      /* Paint the background                              */
+      /*****************************************************/
+    case WM_PAINT:
+      {
+        SWP swp;
+        RECTL rcl;
+        HPS hps;
+
+        WinQueryWindowPos(hwnd,&swp);
+        if(swp.fl & SWP_MINIMIZE)
+          break;
+
+        hps=WinBeginPaint(hwnd, NULLHANDLE, NULLHANDLE);
+        WinQueryWindowRect(hwnd, &rcl);
+        WinDrawBitmap(hps, allBMPs[MAIN_BMP_IDX].hbm,
+                      NULLHANDLE,
+                      (PPOINTL)&rcl,
+                      0, 0,
+                      DBM_IMAGEATTRS);
+        WinEndPaint(hps);
+        return MRFALSE;
+      }
+    default:
+      break;
+    }
+  if(orgBgProc)
+    return (*orgBgProc)(hwnd, msg, mp1, mp2);
+  else
+    return WinDefWindowProc(hwnd, msg, mp1, mp2);
+}
+
+/* This function paints all our controls with the provided bitmaps */
+/* It's called from the guiproc                                    */
+MRESULT paintControls(HWND hwnd, ULONG msg, MPARAM mp1, MPARAM mp2)
+{
+  USERBUTTON* ubPtr;
+  CONTROLINFO ci;
+  RECTL rcl;
+
+  ubPtr=(USERBUTTON*)PVOIDFROMMP(mp2);
+  switch(SHORT1FROMMP(mp1))
+    {
+    case IDPB_MMPLAYERPLAY:
+      if(ubPtr->fsState==BDS_DEFAULT||!ubPtr->fsState)
+        ci=ciControls[CTRLIDX_PLAYBUTTON];
+      else {
+        ci=ciControls[CTRLIDX_PLAYBUTTONSEL];
+      }
+      break;
+    case IDPB_MMPLAYERPAUSE:
+      if(ubPtr->fsState==BDS_DEFAULT||!ubPtr->fsState)
+        ci=ciControls[CTRLIDX_PAUSEBUTTON];
+      else {
+        ci=ciControls[CTRLIDX_PAUSEBUTTONSEL];
+      }
+      break;
+    case IDPB_MMPLAYERSTOP:
+      if(ubPtr->fsState==BDS_DEFAULT||!ubPtr->fsState)
+        ci=ciControls[CTRLIDX_STOPBUTTON];
+      else {
+        ci=ciControls[CTRLIDX_STOPBUTTONSEL];
+      }
+      break;
+#if 0
+    case IDPB_POSBAR:
+      ci=ciControls[CTRLIDX_POSSLIDER];//ciPosSlider;
+      break;
+    case IDPB_SLIDERARM:
+      DosBeep(5000, 30);
+      ci=ciControls[CTRLIDX_POSSLIDERARM];//ciPosSliderArm;
+      break;
+    case IDSL_VOLUME:
+      ci=ciControls[CTRLIDX_VOLSLIDER];//ciVolSlider;
+      break;
+    case IDSL_VOLUMEARM:
+      if(WinQueryCapture(HWND_DESKTOP==hwnd))
+        ci=ciControls[CTRLIDX_VOLSLIDERARMSEL];//ciVolSliderArm;
+      else
+        ci=ciControls[CTRLIDX_VOLSLIDERARM];//ciVolSliderArm;
+      break;
+#endif
+    default:
+      return (MRESULT)0;
+    }
+  rcl.yBottom=0;
+  rcl.xLeft=0;
+
+  //DosBeep(5000, 100);
+
+  WinDrawBitmap(ubPtr->hps, ci.hbmSource,
+                &ci.rclSource,
+                (PPOINTL)&rcl,
+                0, 0,
+                DBM_IMAGEATTRS);
+  if(ubPtr->fsStateOld!=ubPtr->fsState)
+    ubPtr->fsState =( ubPtr->fsStateOld==BDS_DEFAULT ? BDS_HILITED : BDS_DEFAULT);
+
+  return (MRESULT)0;
+}
+
+
+/* This function paints all our controls with the provided bitmaps. */
+BOOL paintHilitedControl(HWND hwnd, USHORT usControl, BOOL bHilite)
+{
+  //  static ULONG ulShowFeedback=0;
+
+#if 0
+  if(!ulShowFeedback) {
+    /* Query the INI setting*/
+    if(!PrfQueryProfileInt(HINI_USERPROFILE, APPKEY_CWMM, MFLDR_NO_VISUAL_FEEDBACK, 0))
+      ulShowFeedback=1; /* Flash play controls */
+    else
+      ulShowFeedback=2; /* Don't flash play controls while playing */
+  }
+
+
+  if(ulShowFeedback==2)
+    return 1;
+
+  switch(usControl)
+    {
+    case IDPB_PLAY:
+      if(!bHilite) {
+        ci=ciControls[CTRLIDX_PLAYBUTTON];
+    }
+      else {
+        ci=ciControls[CTRLIDX_PLAYBUTTONSEL];
+      }
+      break;
+    case IDPB_PAUSE:
+      if(!bHilite) {
+        ci=ciControls[CTRLIDX_PAUSEBUTTON];
+      }
+      else {
+        ci=ciControls[CTRLIDX_PAUSEBUTTONSEL];
+      }
+      break;
+    default:
+      return 0;
+    }
+  rcl.yBottom=0;
+  rcl.xLeft=0;
+  hps=WinGetPS(hwnd);
+  WinDrawBitmap(hps, ci.hbmSource,
+                &ci.rclSource,
+                (PPOINTL)&rcl,
+                0, 0,
+                DBM_IMAGEATTRS);
+  WinReleasePS(hps);
+#endif
+  return 1;
+}
+
+
+#define USERSLIDER 1 /* Set to 0 to let the proc paint the control. With set to 1
+                        a WM_DRAWITEM msg is sent to the parent. */
+BOOL userSlider=USERSLIDER;
+#define SLOFFSET 3 /* The offset of the active slider area to the window border */
+MRESULT EXPENTRY privateSliderProc(HWND hwnd, ULONG msg, MPARAM mp1, MPARAM mp2)
+{
+
+  switch (msg)
+    {
+#if 0
+      /* Drag and drop of audio files */
+    case DM_DRAGOVER:
+      {
+      PDRAGINFO pdi=PVOIDFROMMP(mp1);
+
+      return handleDrag0ver( pdi, WinQueryWindow(hwnd, QW_PARENT));
+      }
+    case DM_DROP:
+      {
+        PDRAGINFO pdi=PVOIDFROMMP(mp1);
+
+        return handleDrop( pdi, WinQueryWindow(hwnd, QW_PARENT));
+      }
+#endif
+    case WM_CREATE:
+      {
+        PCREATESTRUCT pCreate=(CREATESTRUCT*)PVOIDFROMMP(mp2);
+
+        /* Initialize the slider data */
+        WinSetWindowUShort(hwnd, SLIDERARMWIDTH,20);
+        WinSetWindowUShort(hwnd, SLIDERARMHEIGHT,10);
+        WinSetWindowUShort(hwnd, SLINCREMENTS,100);
+        /* Dimensions of slider. The slider active area is smaller than the window to
+           allow drawing of active state. */
+        WinSetWindowULong(hwnd, SLIDERCX,pCreate->cx-2*SLOFFSET);
+        WinSetWindowULong(hwnd, SLIDERCY,pCreate->cy-2*SLOFFSET);
+        WinSetWindowULong(hwnd, SLIDERX,SLOFFSET);
+        WinSetWindowULong(hwnd, SLIDERY,SLOFFSET);
+        WinSetWindowULong(hwnd, SLIDERARMPOS, 0);
+        WinSetWindowULong(hwnd, SLDRAGGING,FALSE);
+
+        return (MRESULT)0;
+      }
+    case SLM_SETSLIDERINFO:
+      switch(SHORT1FROMMP(mp1))
+        {
+          case SMA_SLIDERARMPOSITION:
+            /*  SMA_RANGEVALUE */
+            if(!WinQueryWindowULong(hwnd, SLDRAGGING)) {
+              if(SHORT2FROMMP(mp1)==SMA_RANGEVALUE) {
+                WinSetWindowULong(hwnd, SLIDERARMPOS, LONGFROMMP(mp2));
+                WinInvalidateRect(hwnd, NULLHANDLE,TRUE);
+                return (MRESULT)0;
+              }
+              else if(SHORT2FROMMP(mp1)==SMA_INCREMENTVALUE) {
+                LONG lInc=LONGFROMMP(mp2)*(WinQueryWindowULong(hwnd, SLIDERCX)-WinQueryWindowUShort(hwnd, SLIDERARMWIDTH));
+                lInc/=WinQueryWindowUShort(hwnd, SLINCREMENTS);
+                WinSetWindowULong(hwnd, SLIDERARMPOS, lInc);
+                WinInvalidateRect(hwnd, NULLHANDLE,TRUE);
+                return (MRESULT)0;
+              }
+            }
+            break;
+        case SMA_SLIDERARMDIMENSIONS:
+          WinSetWindowUShort(hwnd, SLIDERARMWIDTH, SHORT1FROMMP(mp2));
+          WinSetWindowUShort(hwnd, SLIDERARMHEIGHT, SHORT2FROMMP(mp2));
+          return (MRESULT)0;
+        default:
+          break;
+        }
+      break;
+    case WM_SIZE:
+      WinSetWindowULong(hwnd, SLIDERCX, SHORT1FROMMP(mp2)-2*SLOFFSET);
+      WinSetWindowULong(hwnd, SLIDERCY, SHORT2FROMMP(mp2)-2*SLOFFSET);
+      WinInvalidateRect(hwnd, NULLHANDLE,TRUE);
+      return (MRESULT)0;
+    case WM_BUTTON1DOWN:
+      {
+        SHORT x=SHORT1FROMMP( mp1);
+        SHORT y=SHORT2FROMMP( mp1);
+        LONG  lPos=WinQueryWindowULong(hwnd, SLIDERARMPOS);
+        USHORT usWidth=WinQueryWindowUShort(hwnd, SLIDERARMWIDTH);
+
+        if(x<=lPos+usWidth+SLOFFSET && x>=lPos+SLOFFSET &&
+           y<=WinQueryWindowUShort(hwnd, SLIDERY)+WinQueryWindowUShort(hwnd, SLIDERCY)
+           && y>=WinQueryWindowUShort(hwnd, SLIDERY)) {
+          WinSetWindowUShort(hwnd, PTRPOSINSLARM, x-lPos-SLOFFSET);
+        }
+        WinSetFocus(HWND_DESKTOP, hwnd);
+      break;
+      }
+    case WM_FOCUSCHANGE:
+      {
+        HPS hps;
+        RECTL rcl;
+        POINTL ptl;
+
+        if(SHORT1FROMMP(mp2)) {
+          hps=WinGetPS(hwnd);
+          WinQueryWindowRect(hwnd, &rcl);
+          GpiSetLineType(hps, LINETYPE_DOT);
+          ptl.x=rcl.xLeft;
+          ptl.y=rcl.yBottom;
+          GpiMove(hps,&ptl);
+          ptl.x=rcl.xRight-1;
+          GpiLine(hps,&ptl);
+          ptl.y=rcl.yTop-1;
+          GpiLine(hps,&ptl);
+          ptl.x=rcl.xLeft;
+          GpiLine(hps,&ptl);
+          ptl.y=rcl.yBottom;
+          GpiLine(hps,&ptl);
+          WinReleasePS(hps);
+        }
+        else
+          WinInvalidateRect(hwnd, NULLHANDLE,TRUE);
+
+        break;
+      }
+    case WM_CHAR:
+      if(WinQueryFocus(HWND_DESKTOP)==hwnd) {
+        if(SHORT2FROMMP(mp2)==VK_TAB && (SHORT1FROMMP(mp1) & KC_VIRTUALKEY))
+          if(SHORT1FROMMP(mp1) & (KC_KEYUP|KC_PREVDOWN))
+            return (MRESULT)TRUE;
+
+#if 0
+        /**/
+        if(SHORT2FROMMP(mp2)==VK_RIGHT && (SHORT1FROMMP(mp1) & KC_VIRTUALKEY))
+          /* if(SHORT1FROMMP(mp1) & (KC_KEYUP|KC_PREVDOWN))*/ {
+            DosBeep(5000, 100);
+            return (MRESULT)TRUE;
+          }
+        if(SHORT2FROMMP(mp2)==VK_LEFT && (SHORT1FROMMP(mp1) & KC_VIRTUALKEY))
+          if(SHORT1FROMMP(mp1) & (KC_KEYUP|KC_PREVDOWN)) {
+            DosBeep(500, 100);
+            return (MRESULT)TRUE;
+          }
+#endif
+
+        return WinDefWindowProc(hwnd, msg, mp1, mp2);
+      }
+
+#if 0
+      if(WinQueryFocus(HWND_DESKTOP)==hwnd) {
+        /* We have the focus */
+        if((SHORT1FROMMP(mp1) & (KC_VIRTUALKEY))==(KC_VIRTUALKEY)) {
+          LONG  lPos=WinQueryWindowULong(hwnd, SLIDERARMPOS);
+          USHORT usWidth=WinQueryWindowUShort(hwnd, SLIDERARMWIDTH);
+          ULONG ulCx=WinQueryWindowULong(hwnd, SLIDERCX);
+
+          switch(SHORT2FROMMP(mp2))
+            {
+            case VK_RIGHT:
+              if(SHORT1FROMMP(mp1) & (KC_KEYUP|KC_PREVDOWN)) {
+                lPos+=1;
+                if(lPos>ulCx-usWidth)
+                  lPos=ulCx-usWidth;
+                else {
+                  WinPostMsg( hwnd,
+                              SLM_SETSLIDERINFO,
+                              MPFROM2SHORT(SMA_SLIDERARMPOSITION, SMA_RANGEVALUE),
+                              MPFROMLONG( (LONG) lPos ));
+                  lPos=(lPos*100)/(WinQueryWindowULong(hwnd, SLIDERCX)-WinQueryWindowUShort(hwnd, SLIDERARMWIDTH));
+
+                  WinPostMsg( WinQueryWindow(hwnd, QW_PARENT),WM_CONTROL,
+                              MPFROM2SHORT(WinQueryWindowUShort(hwnd, QWS_ID), SLN_CHANGE),
+                              MPFROMLONG(lPos));
+
+                  if(SHORT1FROMMP(mp1) & KC_LONEKEY) {
+                    /* Post SLN_CHANGE notification */
+                    WinPostMsg( WinQueryWindow(hwnd, QW_PARENT),WM_CONTROL,
+                                MPFROM2SHORT(WinQueryWindowUShort(hwnd, QWS_ID), SLN_CHANGE),
+                                MPFROMLONG(lPos));
+                    WinSetWindowULong(hwnd, SLDRAGGING, FALSE);
+                  }
+                  else {
+                    WinSetWindowULong(hwnd, SLDRAGGING, TRUE);
+                    /* Post SLN_SLIDERTRACK notification */
+                    WinPostMsg(WinQueryWindow(hwnd, QW_PARENT),WM_CONTROL,
+                               MPFROM2SHORT(WinQueryWindowUShort(hwnd, QWS_ID), SLN_SLIDERTRACK),
+                               MPFROMLONG(lPos));
+                  }
+
+                }
+                WinSetWindowULong(hwnd, SLIDERARMPOS, lPos);
+              }
+              return (MRESULT)TRUE;
+            case VK_LEFT:
+              if(SHORT1FROMMP(mp1) & (KC_KEYUP|KC_PREVDOWN)) {
+                lPos-=1;
+                if(lPos<0) {
+                  lPos=0;
+                }
+                else {
+                  WinPostMsg( hwnd,
+                              SLM_SETSLIDERINFO,
+                              MPFROM2SHORT(SMA_SLIDERARMPOSITION, SMA_RANGEVALUE),
+                              MPFROMLONG( (LONG) lPos ));
+                  lPos=(lPos*100)/(WinQueryWindowULong(hwnd, SLIDERCX)-WinQueryWindowUShort(hwnd, SLIDERARMWIDTH));
+                  /* Post SLN_CHANGE notification */
+                  WinPostMsg( WinQueryWindow(hwnd, QW_PARENT),WM_CONTROL,
+                              MPFROM2SHORT(WinQueryWindowUShort(hwnd, QWS_ID), SLN_CHANGE),
+                              MPFROMLONG(lPos));
+
+                  if(SHORT1FROMMP(mp1) & KC_LONEKEY) {
+                    /* Post SLN_CHANGE notification */
+                    WinPostMsg( WinQueryWindow(hwnd, QW_PARENT),WM_CONTROL,
+                                MPFROM2SHORT(WinQueryWindowUShort(hwnd, QWS_ID), SLN_CHANGE),
+                                MPFROMLONG(lPos));
+                    WinSetWindowULong(hwnd, SLDRAGGING, FALSE);
+                  }
+                  else {
+                    WinSetWindowULong(hwnd, SLDRAGGING, TRUE);
+                    /* Post SLN_SLIDERTRACK notification */
+                    WinPostMsg(WinQueryWindow(hwnd, QW_PARENT),WM_CONTROL,
+                               MPFROM2SHORT(WinQueryWindowUShort(hwnd, QWS_ID), SLN_SLIDERTRACK),
+                               MPFROMLONG(lPos));
+                  }
+
+                }
+                WinSetWindowULong(hwnd, SLIDERARMPOS, lPos);
+
+              }
+              return (MRESULT)TRUE;
+            default:
+              break;
+            }
+        }
+
+      }
+#endif
+      break;
+    case WM_BUTTON1MOTIONSTART:
+      {
+        SHORT x=SHORT1FROMMP( mp1);
+        SHORT y=SHORT2FROMMP( mp1);
+        LONG  lPos=WinQueryWindowULong(hwnd, SLIDERARMPOS);
+        USHORT usWidth=WinQueryWindowUShort(hwnd, SLIDERARMWIDTH);
+
+        if(x<=lPos+usWidth+SLOFFSET && x>=lPos+SLOFFSET &&
+           y<=WinQueryWindowUShort(hwnd, SLIDERY)+WinQueryWindowUShort(hwnd, SLIDERCY)
+           && y>=WinQueryWindowUShort(hwnd, SLIDERY)){
+          //        if(x<=lPos+usWidth && y<=WinQueryWindowUShort(hwnd, SLIDERY)+WinQueryWindowUShort(hwnd, SLIDERCY)
+          //      && y>=WinQueryWindowUShort(hwnd, SLIDERY)) {
+          WinSetWindowULong(hwnd, SLDRAGGING, TRUE);
+          if(hptrArrowWE)
+            WinSetPointer(HWND_DESKTOP, hptrArrowWE);
+
+          WinSetCapture(HWND_DESKTOP, hwnd);
+        }
+        break;
+      }
+    case WM_BUTTON1MOTIONEND:
+      if(WinQueryWindowULong(hwnd, SLDRAGGING)) {
+        LONG lPos=WinQueryWindowULong(hwnd, SLIDERARMPOS);
+        WinSetWindowULong(hwnd, SLDRAGGING,FALSE);
+        WinSetCapture(HWND_DESKTOP, NULLHANDLE);
+          lPos=(lPos*100)/(WinQueryWindowULong(hwnd, SLIDERCX)-WinQueryWindowUShort(hwnd, SLIDERARMWIDTH));
+        /* Post SLN_CHANGE notification */
+        WinPostMsg(WinQueryWindow(hwnd, QW_PARENT),WM_CONTROL,
+                   MPFROM2SHORT(WinQueryWindowUShort(hwnd, QWS_ID), SLN_CHANGE),
+                   MPFROMLONG(lPos));
+      }
+      break;
+
+    case WM_MOUSEMOVE:
+      if(WinQueryWindowULong(hwnd, SLDRAGGING)) {
+
+        HPS hps;
+        RECTL rcl, rcl2, rcl3;
+        LONG lTemp;
+        SHORT x=SHORT1FROMMP(mp1);
+        LONG  lPos=WinQueryWindowULong(hwnd, SLIDERARMPOS);
+        USHORT usWidth=WinQueryWindowUShort(hwnd, SLIDERARMWIDTH);
+
+
+        lTemp=lPos;
+
+        rcl.xLeft=WinQueryWindowULong(hwnd, SLIDERX);
+        rcl.yBottom=WinQueryWindowULong(hwnd, SLIDERY);
+        rcl.xRight=rcl.xLeft+WinQueryWindowULong(hwnd, SLIDERCX);
+        rcl.yTop=rcl.yBottom+WinQueryWindowULong(hwnd, SLIDERCY);
+
+        rcl2=rcl3=rcl;
+        rcl.xLeft=x-WinQueryWindowUShort(hwnd, PTRPOSINSLARM);
+        if(rcl.xLeft<rcl2.xLeft)/* Make sure we stop at the left border */
+          rcl.xLeft=rcl2.xLeft;
+
+        rcl.xRight=rcl.xLeft+usWidth;
+        if(rcl.xRight>rcl2.xRight)
+          {/* Make sure we stop at the right border */
+            rcl.xRight=rcl2.xRight;
+            rcl.xLeft=rcl.xRight-usWidth;
+          }
+        lPos=rcl.xLeft-WinQueryWindowULong(hwnd, SLIDERX);/* Save position zero based */
+        WinSetWindowULong(hwnd, SLIDERARMPOS, lPos);
+        if(lPos!=lTemp) {
+          BOOL rc;
+
+          hps=WinGetPS(hwnd);
+          /* Paint Background not necessary here */
+
+          /* Shaft */
+          /* Left part */
+          rcl3.xRight=rcl.xLeft;
+
+          rc=FALSE;
+
+          if(userSlider) {
+            OWNERITEM oi={0};
+            oi.hwnd=hwnd;
+            oi.hps=hps;
+            oi.fsState=SLS_OWNERDRAW;/* More to come */
+            oi.rclItem=rcl3;
+            oi.idItem=SDA_SLIDERSHAFT;
+            rc=(BOOL)WinSendMsg(WinQueryWindow(hwnd, QW_PARENT), WM_DRAWITEM,
+                                MPFROMSHORT(WinQueryWindowUShort(hwnd, QWS_ID)),
+                                MPFROMP(&oi) );
+          }
+          if(!rc)
+            WinFillRect(hps, &rcl3, CLR_PALEGRAY);
+
+          /* Right part */
+          rcl3.xRight=rcl2.xRight;
+          rcl3.xLeft=rcl.xRight;
+          rc=FALSE;
+          if(userSlider) {
+            OWNERITEM oi={0};
+            oi.hwnd=hwnd;
+            oi.hps=hps;
+            oi.fsState=SLS_OWNERDRAW;/* More to come */
+            oi.rclItem=rcl3;
+            oi.idItem=SDA_SLIDERSHAFT;
+            rc=(BOOL)WinSendMsg(WinQueryWindow(hwnd, QW_PARENT), WM_DRAWITEM,
+                                MPFROMSHORT(WinQueryWindowUShort(hwnd, QWS_ID)),
+                                MPFROMP(&oi) );
+          }
+          if(!rc)
+            WinFillRect(hps, &rcl3, CLR_PALEGRAY);
+
+          /* Paint Slider */
+          rc=FALSE;
+          if(userSlider) {
+            OWNERITEM oi={0};
+            oi.hwnd=hwnd;
+            oi.hps=hps;
+            oi.fsState=SLS_OWNERDRAW;/* More to come */
+            oi.rclItem=rcl;
+            oi.idItem=SDA_SLIDERARM;
+            rc=(BOOL)WinSendMsg(WinQueryWindow(hwnd, QW_PARENT), WM_DRAWITEM,
+                                MPFROMSHORT(WinQueryWindowUShort(hwnd, QWS_ID)),
+                                MPFROMP(&oi) );
+
+          }
+          if(!rc)
+            {
+              WinFillRect(hps,&rcl, CLR_PALEGRAY);
+              WinDrawBorder(hps, &rcl, 2, 2, 0, 0 ,0x0400);
+            }
+
+          WinReleasePS(hps);
+          lPos=(lPos*100)/(WinQueryWindowULong(hwnd, SLIDERCX)-WinQueryWindowUShort(hwnd, SLIDERARMWIDTH));
+           /* Post SLN_SLIDERTRACK notification */
+          WinPostMsg(WinQueryWindow(hwnd, QW_PARENT),WM_CONTROL,
+                     MPFROM2SHORT(WinQueryWindowUShort(hwnd, QWS_ID), SLN_SLIDERTRACK),
+                     MPFROMLONG(lPos));
+        }
+        return MRTRUE;
+      }
+      else {
+        if(hptrArrowWE) {
+          /* Not dragging */
+          /* Change pointer to drag pointer when over the arm */
+          SHORT x=SHORT1FROMMP( mp1);
+          SHORT y=SHORT2FROMMP( mp1);
+          LONG  lPos=WinQueryWindowULong(hwnd, SLIDERARMPOS);
+          USHORT usWidth=WinQueryWindowUShort(hwnd, SLIDERARMWIDTH);
+          if(x<=lPos+usWidth+SLOFFSET && x>=lPos+SLOFFSET &&
+             y<=WinQueryWindowUShort(hwnd, SLIDERY)+WinQueryWindowUShort(hwnd, SLIDERCY)
+             && y>=WinQueryWindowUShort(hwnd, SLIDERY)) {
+            WinSetPointer(HWND_DESKTOP, hptrArrowWE);
+            //            WinSetPointer(HWND_DESKTOP, WinQuerySysPointer(HWND_DESKTOP, SPTR_SIZEWE, FALSE));
+            return MRTRUE;
+          }
+        }
+      }
+      break;
+    case WM_PAINT:
+      {
+
+        HPS hps, hps2;
+        RECTL rcl, rcl2, rcl3;
+        POINTL ptl;
+        LONG  lPos=WinQueryWindowULong(hwnd, SLIDERARMPOS);
+        USHORT usWidth=WinQueryWindowUShort(hwnd, SLIDERARMWIDTH);
+        BOOL rc;
+
+        WinQueryWindowRect(hwnd, &rcl);
+
+        /* Shaft */
+        rcl2.xLeft=WinQueryWindowULong(hwnd, SLIDERX);
+        rcl2.yBottom=WinQueryWindowULong(hwnd, SLIDERY);
+        rcl2.xRight=rcl2.xLeft+WinQueryWindowULong(hwnd, SLIDERCX)-1;
+        rcl2.yTop=rcl2.yBottom+WinQueryWindowULong(hwnd, SLIDERCY)-1;
+
+        /* Background */
+        hps2=WinGetPS(hwnd);
+        GpiExcludeClipRectangle(hps2,&rcl2);
+        rc=FALSE;
+        if(userSlider) {
+          OWNERITEM oi={0};
+          oi.hwnd=hwnd;
+          oi.hps=hps2;
+          oi.fsState=SLS_OWNERDRAW;/* More to come */
+          oi.rclItem=rcl;
+          oi.idItem=SDA_BACKGROUND;
+          rc=(BOOL)WinSendMsg(WinQueryWindow(hwnd, QW_PARENT), WM_DRAWITEM, MPFROMSHORT(WinQueryWindowUShort(hwnd, QWS_ID)),
+                    MPFROMP(&oi) );
+        }
+        if(!rc)
+          WinFillRect(hps2, &rcl, CLR_PALEGRAY);
+        /* Focus */
+        if(WinQueryFocus(HWND_DESKTOP)==hwnd) {
+          GpiSetLineType(hps2, LINETYPE_DOT);
+          ptl.x=rcl.xLeft;
+          ptl.y=rcl.yBottom;
+          GpiMove(hps2,&ptl);
+          ptl.x=rcl.xRight-1;
+          GpiLine(hps2,&ptl);
+          ptl.y=rcl.yTop-1;
+          GpiLine(hps2,&ptl);
+          ptl.x=rcl.xLeft;
+          GpiLine(hps2,&ptl);
+          ptl.y=rcl.yBottom;
+          GpiLine(hps2,&ptl);
+        }
+
+        WinReleasePS(hps2);
+        rcl2.yTop+=1;
+        rcl2.xRight+=1;
+        hps=WinBeginPaint(hwnd, NULLHANDLE, NULLHANDLE);
+        rcl3=rcl=rcl2;
+        /* Arm pos */
+        rcl2.xLeft+=lPos;
+        /* Arm size */
+        rcl2.xRight=rcl2.xLeft+usWidth;
+
+        /* Shaft */
+        /* Left part */
+        rcl3.xRight=rcl2.xLeft;
+        rc=FALSE;
+        if(userSlider) {
+          OWNERITEM oi={0};
+          oi.hwnd=hwnd;
+          oi.hps=hps;
+          oi.fsState=SLS_OWNERDRAW;/* More to come */
+          oi.rclItem=rcl3;
+          oi.idItem=SDA_SLIDERSHAFT;
+          rc=(BOOL)WinSendMsg(WinQueryWindow(hwnd, QW_PARENT), WM_DRAWITEM, MPFROMSHORT(WinQueryWindowUShort(hwnd, QWS_ID)),
+                    MPFROMP(&oi) );
+
+        }
+        if(!rc)
+          WinFillRect(hps, &rcl3, CLR_GREEN);
+
+        /* Right part */
+        rcl3.xRight=rcl.xRight;
+        rcl3.xLeft=rcl2.xRight;
+        rc=FALSE;
+        if(userSlider) {
+          OWNERITEM oi={0};
+          oi.hwnd=hwnd;
+          oi.hps=hps;
+          oi.fsState=SLS_OWNERDRAW;/* More to come */
+          oi.rclItem=rcl3;
+          oi.idItem=SDA_SLIDERSHAFT;
+          rc=(BOOL)WinSendMsg(WinQueryWindow(hwnd, QW_PARENT), WM_DRAWITEM, MPFROMSHORT(WinQueryWindowUShort(hwnd, QWS_ID)),
+                              MPFROMP(&oi) );
+        }
+        if(!rc)
+          WinFillRect(hps, &rcl3, CLR_PALEGRAY);
+
+        rc=FALSE;
+        if(userSlider) {
+          OWNERITEM oi={0};
+          oi.hwnd=hwnd;
+          oi.hps=hps;
+          oi.fsState=SLS_OWNERDRAW;/* More to come */
+          oi.rclItem=rcl2;
+          oi.idItem=SDA_SLIDERARM;
+          rc=(BOOL)WinSendMsg(WinQueryWindow(hwnd, QW_PARENT), WM_DRAWITEM, MPFROMSHORT(WinQueryWindowUShort(hwnd, QWS_ID)),
+                              MPFROMP(&oi) );
+        }
+        if(!rc)
+          {
+            WinFillRect(hps,&rcl2, CLR_PALEGRAY);
+            WinDrawBorder(hps, &rcl2, 2, 2, 0, 0 ,0x0400);
+          }
+
+        WinEndPaint(hps);
+        return (MRESULT)0;
+      }
+      break;
+    default:
+      break;
+    }
+  return WinDefWindowProc(hwnd, msg, mp1, mp2);
+}
+
+MRESULT drawSlider(HWND hwnd, ULONG msg, MPARAM mp1, MPARAM mp2, USHORT id)
+{
+  POWNERITEM poi;
+  CONTROLINFO ci, ciArm;
+
+  poi=(POWNERITEM)PVOIDFROMMP(mp2);
+
+  switch(id)
+    {
+    case IDSL_MMPLAYERPOSBAR:
+      ci=ciControls[CTRLIDX_POSSLIDER];
+      ciArm=ciControls[CTRLIDX_POSSLIDERARM];
+      break;
+    case IDSL_MMPLAYERVOLUME:
+      ci=ciControls[CTRLIDX_VOLSLIDER];//ciVolSlider;
+      //      if(WinQueryCapture(HWND_DESKTOP==hwnd))
+      ciArm=ciControls[CTRLIDX_VOLSLIDERARMSEL];//ciVolSliderArm;
+      // else
+      //  ciArm=ciControls[CTRLIDX_VOLSLIDERARM];//ciVolSliderArm;
+      break;
+    default:
+      return (MRESULT)FALSE;
+    }
+
+  switch(poi->idItem)
+    {
+    case SDA_SLIDERARM:
+      if(ciArm.hbmSource)
+        //DosBeep(5000, 50);
+      WinDrawBitmap(poi->hps, ciArm.hbmSource,
+                    &ciArm.rclSource,
+                    (PPOINTL)&poi->rclItem,
+                    0, 0,
+                    DBM_IMAGEATTRS);
+      //    WinFillRect(poi->hps,&poi->rclItem, CLR_RED);
+      return (MRESULT) TRUE;
+    case SDA_BACKGROUND:
+      {
+        WinDrawBitmap(poi->hps,
+                      ci.hbmSource,
+                      &ci.rclSource,
+                      (PPOINTL)&poi->rclItem,
+                      0, 0,
+                      DBM_IMAGEATTRS);
+        //    WinFillRect(poi->hps,&poi->rclItem, CLR_WHITE);
+        return (MRESULT) TRUE;
+      }
+    case SDA_SLIDERSHAFT:
+      {
+        RECTL rcl;
+
+        rcl=ci.rclSource;
+        rcl.xLeft+=poi->rclItem.xLeft;
+        rcl.xRight=rcl.xLeft+(poi->rclItem.xRight-poi->rclItem.xLeft);
+        rcl.yBottom+=SLOFFSET;
+        rcl.yTop-=SLOFFSET;
+
+        if(!WinDrawBitmap(poi->hps, ci.hbmSource,
+                          &rcl,
+                          //&ci.rclSource,
+                          (PPOINTL)&poi->rclItem,
+                          0, 0,
+                          DBM_IMAGEATTRS))
+          return (MRESULT)FALSE;
+        return (MRESULT)TRUE;
+      }
+    default:
+      return (MRESULT)TRUE;
+    }
+  /* Done */
+  return (MRESULT)TRUE;
+}
+
+
+MRESULT EXPENTRY playTimeTextProc(HWND hwnd, ULONG msg, MPARAM mp1, MPARAM mp2)
+{
+  switch(msg)
+    {
+      /* Drag and drop of audio files */
+    case DM_DRAGOVER:
+      {
+      PDRAGINFO pdi=PVOIDFROMMP(mp1);
+
+      return handleDrag0ver( pdi, WinQueryWindow(hwnd, QW_PARENT));
+      }
+    case DM_DROP:
+      {
+        PDRAGINFO pdi=PVOIDFROMMP(mp1);
+
+        return handleDrop( pdi, WinQueryWindow(hwnd, QW_PARENT));
+      }
+
+    case WM_BUTTON1CLICK:
+
+      WinSendMsg(WinQueryWindow(hwnd, QW_PARENT), WM_APPTERMINATENOTIFY,
+                 MPFROM2SHORT(NOTIFY_CLICK, WinQueryWindowUShort(hwnd, QWS_ID)) ,0L);
+      return (MRESULT)0;
+    case WM_CONTEXTMENU:
+      WinSendMsg(WinQueryWindow(hwnd, QW_PARENT), WM_APPTERMINATENOTIFY,
+                 MPFROM2SHORT(NOTIFY_CONTEXT, WinQueryWindowUShort(hwnd, QWS_ID)) ,0L);
+      return (MRESULT)0;
+    case WM_PAINT:
+      {
+        HPS hps;
+        RECTL rcl;
+        char text[100];
+        CONTROLINFO ci;
+
+        ci=ciControls[CTRLIDX_PLAYTIME];//ciVolSliderArm;
+
+        hps=WinBeginPaint(hwnd, NULLHANDLE, NULL);
+        if(WinQueryWindowText(hwnd, sizeof(text), text))
+          {
+            POINTL ptl= {0};
+            WinDrawBitmap(hps, ci.hbmSource,
+                          &ci.rclSource,
+                          &ptl,
+                          0, 0,
+                          DBM_IMAGEATTRS);
+            WinQueryWindowRect(hwnd,&rcl);
+            WinDrawText(hps, strlen(text),text, &rcl,0,0,DT_CENTER|DT_VCENTER|DT_TEXTATTRS);
+          }
+        WinEndPaint(hps);
+        return (MRESULT) 0;
+      }
+    default:
+      break;
+    }
+  return oldPlayTimeProc(hwnd, msg, mp1, mp2);
+}
Index: /tags/CWMM-0.3.0_GA/classes/mm-progs/MMPlayer/def.tpl
===================================================================
--- /tags/CWMM-0.3.0_GA/classes/mm-progs/MMPlayer/def.tpl	(revision 213)
+++ /tags/CWMM-0.3.0_GA/classes/mm-progs/MMPlayer/def.tpl	(revision 213)
@@ -0,0 +1,22 @@
+# Note: lines starting with '#' are comments.
+
+[DESCRIPTION]
+PM audio file player
+
+[COPYRIGHT]
+(c) C. Wohlgemuth 2003-2005 Netlabs CWMM Team 2023
+
+[AUTHOR]
+Netlabs CWMM Team
+
+[NAME]
+# This is the NAME xxx WINDOWAPI|etc line in the def file.
+# Important: it specifies the internal name of the program. Don't leave out!
+NAME MMPLAYER WINDOWAPI
+
+[BUILDMACHINE]
+Zobopeep
+
+[OTHER]
+# Add all the lines here you want to have at the end of the generated DEF file
+STACKSIZE    1638400
Index: /tags/CWMM-0.3.0_GA/classes/mm-progs/MMPlayer/display.c
===================================================================
--- /tags/CWMM-0.3.0_GA/classes/mm-progs/MMPlayer/display.c	(revision 213)
+++ /tags/CWMM-0.3.0_GA/classes/mm-progs/MMPlayer/display.c	(revision 213)
@@ -0,0 +1,193 @@
+/*
+ * This file is (C) Chris Wohlgemuth 2002
+ * It is part of the MediaFolder package
+ */
+/*
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; see the file COPYING.  If not, write to
+ * the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+/*
+ * If you need another license for your project/product (commercial,
+ * noncommercial, whatever) contact me at
+ *
+ * http://www.os2world.com/cdwriting
+ * http://www.geocities.com/SiliconValley/Sector/5785/
+ *
+ */
+
+#define INCL_GPILCIDS
+#define INCL_GPIPRIMITIVES
+#define INCL_GPIBITMAPS
+#define INCL_GPILOGCOLORTABLE
+#define INCL_SW
+#define INCL_GPIREGIONS
+#define INCL_WIN
+
+#include <os2.h>
+
+#include "common.h"
+#include "mmres.h"
+#include "mmplayer.h"
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+/* 0: time, 1: remaining, 2: filename */
+extern int iWhichDisplay;
+/* Display timer for changing between track info */
+extern ULONG ulDisplayTimer;
+extern ULONG ulTotalLength;
+/* Current time in track */
+extern ULONG ulPos;
+char * chrPtrName; /* Pointer to filename */
+
+void _resetDisplay(HWND hwndFrame)
+{
+  WinSetWindowText(WinWindowFromID(hwndFrame, IDST_MMPLAYERPLAYTIME), "0:00");
+  //WinSetWindowULong(WinWindowFromID(WinWindowFromID(hwndTop, IDDLG_TOPMIDDLE), IDST_PLAYTIME), QWL_USER, 0);
+  WinPostMsg( WinWindowFromID(hwndFrame, IDSL_MMPLAYERPOSBAR),
+              SLM_SETSLIDERINFO,
+              MPFROM2SHORT(SMA_SLIDERARMPOSITION,SMA_INCREMENTVALUE),
+              MPFROMLONG(0L));
+}
+
+
+
+/* Set the text in the playtime area to 'theText' */
+void setPlayTimeText2( HWND hwndDialog, char * theText)
+{
+     WinSetWindowText(WinWindowFromID(hwndDialog, IDST_MMPLAYERPLAYTIME), theText);
+}
+
+
+/* Toggle the visibility of the text in the playtime area. Useful for blinking. */
+void togglePlayTimeDisplayVisibility(HWND hwndFrame)
+{
+  if(WinIsWindowVisible(WinWindowFromID(hwndFrame, IDST_MMPLAYERPLAYTIME)))
+    WinShowWindow(WinWindowFromID(hwndFrame, IDST_MMPLAYERPLAYTIME), FALSE);
+  else
+    WinShowWindow(WinWindowFromID(hwndFrame, IDST_MMPLAYERPLAYTIME), TRUE);
+}
+
+
+/* Show/hide the text in the playtime area. Useful for blinking. */
+void showPlayTimeDisplay(HWND hwndFrame, BOOL bShow)
+{
+  WinShowWindow(WinWindowFromID(hwndFrame, IDST_MMPLAYERPLAYTIME), bShow);
+}
+
+
+/* This function sets the playtime display according to the user settings.
+   Supported are remaining time, elapsed time and ID3-tag display */
+void setPlayTimeText(HWND hwndFrame)
+{
+  char text[CCHMAXPATH];
+  ULONG ulTemp;
+
+  switch(iWhichDisplay)
+    {
+    case 1:
+      /* Remaining */
+      ulTemp=ulTotalLength/1000-ulPos;
+      sprintf(text,"-%d:%02d",
+              (int)ulTemp/60,
+              (int)ulTemp%60);
+      WinSetWindowText(WinWindowFromID(hwndFrame, IDST_MMPLAYERPLAYTIME), text);
+      break;
+
+    case 2:
+      {
+        ULONG ulTemp=ulDisplayTimer;
+
+        /* Show filename */
+        text[0]=0;
+
+        if(ulTemp>=3)
+          text[0]=0;
+        else if(ulTemp>=0)
+          strcpy(text, chrPtrName);
+
+#if 0
+        else
+          ulTemp=15; /* Show playtime for midi files */
+#endif
+
+        if(ulTemp>=3||!strlen(text)) {
+          /* Play time */
+          sprintf(text,"%d:%02d",
+                  (int)ulPos/60,
+                  (int)ulPos%60);
+        }
+        WinSetWindowText(WinWindowFromID(hwndFrame, IDST_MMPLAYERPLAYTIME), text);
+        ulTemp++;
+        if(ulTemp>=6)
+          ulTemp=0;
+        ulDisplayTimer=ulTemp;
+        break;
+
+#if 0
+        /* Show ID3 tag */
+        cwAudio=thisPtr->cwQueryCurrentlyPlayingObject();
+        if(somIsObj(cwAudio)) {
+          if(!methodPtr)
+            somhlpQueryCWAudioMethodPtr(thisPtr);
+          sprintf(text,"");
+          if(methodPtr && somIsObj(cwAudioClass) && cwAudio->somIsA(cwAudioClass) ){/* Query playtime in secs */
+            char* chrPtr=text;
+            text[0]=0;
+
+            if(ulTemp>=15)
+              text[0]=0;
+            else if(ulTemp>=12)
+              methodPtr(cwAudio, &chrPtr, sizeof(text), IDINFO_GENRE);
+            else if(ulTemp>=9)
+              methodPtr(cwAudio, &chrPtr, sizeof(text), IDINFO_COMMENT);
+            else if(ulTemp>=6)
+              methodPtr(cwAudio, &chrPtr, sizeof(text), IDINFO_ALBUM);
+            else if(ulTemp>=3)
+              methodPtr(cwAudio, &chrPtr, sizeof(text), IDINFO_NAME);
+            else if(ulTemp>=0)
+              methodPtr(cwAudio, &chrPtr, sizeof(text), IDINFO_ARTIST);
+          }
+          else
+            ulTemp=15; /* Show playtime for midi files */
+
+          if(ulTemp>=15||!strlen(text)) {
+            /* Play time */
+            sprintf(text,"%d:%02d",
+                    thisPtr->ulPos/60,
+                    thisPtr->ulPos%60);
+          }
+          WinSetWindowText(WinWindowFromID(thisPtr->hwndTopMiddle, IDST_PLAYTIME), text);
+          ulTemp++;
+          if(ulTemp>=18)
+            ulTemp=0;
+          ulDisplayTimer=ulTemp;
+          break;
+        }
+#endif
+      }
+      /* Fall through to playtime */
+    case 0:
+      /* Elapsed time */
+      sprintf(text,"%d:%02d",
+              (int)ulPos/60,
+              (int)ulPos%60);
+      WinSetWindowText(WinWindowFromID(hwndFrame, IDST_MMPLAYERPLAYTIME), text);
+      break;
+    default:
+      break;
+    }
+}
+
Index: /tags/CWMM-0.3.0_GA/classes/mm-progs/MMPlayer/makefile
===================================================================
--- /tags/CWMM-0.3.0_GA/classes/mm-progs/MMPlayer/makefile	(revision 213)
+++ /tags/CWMM-0.3.0_GA/classes/mm-progs/MMPlayer/makefile	(revision 213)
@@ -0,0 +1,41 @@
+# Makefile
+
+include ../../../make.inc
+include ../mmprog.inc
+
+OBJECTS	=	$(LIBDIR)/message.obj \
+		$(LIBDIR)/helper.obj \
+		$(LIBDIR)/menu_funcs.obj \
+		$(LIBDIR)/sys_funcs.obj
+OBJS2		=	 customprocs.obj playaudio.obj display.obj
+
+PMPRINTF = 0
+ifdef PMPRINTF
+LIBS           = mmpm2.lib pmprintf.lib
+else
+LIBS           = mmpm2.lib
+endif
+all:	mmplayer.exe
+
+
+mmplayer.exe:	mmplayer.c $(OBJECTS) $(OBJS2) makefile def.tpl
+	cmd /C $(TOOLDIR)\create_def.cmd mmplayer.def
+#Use this command to link dynamicaly
+	$(CC) $(CPPFLAGS) -I$(INC) mmplayer.c $(OBJECTS) $(OBJS2) $(LIBS) mmplayer.def
+	rc mmplayer.rc mmplayer.exe
+
+
+clean:
+	-rm *.exe
+	-rm *.dll
+	-rm *.obj
+	-rm *.RES
+	-rm *.ini
+	-rm *.def
+
+cleaner:
+	-rm *.*~
+	-rm *.flc
+
+distribution:
+	
Index: /tags/CWMM-0.3.0_GA/classes/mm-progs/MMPlayer/mmplayer.c
===================================================================
--- /tags/CWMM-0.3.0_GA/classes/mm-progs/MMPlayer/mmplayer.c	(revision 213)
+++ /tags/CWMM-0.3.0_GA/classes/mm-progs/MMPlayer/mmplayer.c	(revision 213)
@@ -0,0 +1,1237 @@
+/*
+ * mmplayer.c (C) Chris Wohlgemuth 2002-2003
+ *
+ */
+/*
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; see the file COPYING.  If not, write to
+ * the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+/*
+ * If you need another license for your project/product (commercial,
+ * noncommercial, whatever) contact me at
+ *
+ * http://www.os2world.com/cdwriting
+ * http://www.geocities.com/SiliconValley/Sector/5785/
+ *
+ */
+
+#define INCL_DOS
+#define INCL_DOSFILEMGR
+#define INCL_DOSERRORS
+#define INCL_WIN
+#define INCL_WINWORKPLACE
+#define INCL_OS2MM
+#define INCL_MMIOOS2
+#define INCL_MCIOS2
+#define INCL_GPI
+#define INCL_PM
+
+#include <os2.h>
+#include <sys\types.h>
+#include <sys\stat.h>
+#include <stdio.h>
+#include <string.h>
+#include <stdlib.h>
+#include "os2me.h"
+#include "common.h"
+#include "mmplayerres.h"
+#include "mmres.h"
+#include "mmplayer.h"
+#include "mmprogs_defaults.h"
+#include "sys_funcs.h"
+
+#if 0
+#define  _PMPRINTF_
+#include "PMPRINTF.H"
+#endif
+
+#ifndef OPEN_DEFAULT
+/*  Open views for the wpOpen() method */
+
+      #define OPEN_UNKNOWN      -1
+      #define OPEN_DEFAULT       0
+      #define OPEN_CONTENTS      1
+      #define OPEN_SETTINGS      2
+      #define OPEN_HELP          3
+      #define OPEN_RUNNING       4
+      #define OPEN_PROMPTDLG     5
+      #define OPEN_PALETTE       121                                   /*SPLIT*/
+      #define OPEN_USER          0x6500
+#endif
+
+LOADEDBITMAP allBMPs[NUM_CTRL_IDX];
+
+/* Format:
+   typedef struct
+   {
+   INT id;
+   RECTL rclSource;
+   HBITMAP hbmSource;
+   RECTL rclDest;
+   }CONTROLINFO;
+   */
+CONTROLINFO ciControls[NUM_CTRL_IDX]={
+  {0,{0,0,414,70}, NULLHANDLE,{0}}, /* main */
+  /* Achtung destination verwendet fuer position */
+
+  {IDPB_MMPLAYERPLAY, {0, 0, 36, 36},NULLHANDLE, { 108, 24, 144, 60} },/* Play */
+  {IDPB_MMPLAYERPLAY, {0, 0, 36,36},NULLHANDLE, { 108, 24, 144, 60} }, /* Playsel */
+  {IDPB_MMPLAYERSTOP, {0, 0, 36, 36},NULLHANDLE, { 24, 24, 60, 60} },/* Stop */
+  {IDPB_MMPLAYERSTOP, {0, 0, 36,36},NULLHANDLE, { 24, 24, 60, 60} }, /* Stop sel */
+  {IDPB_MMPLAYERPAUSE, {0, 0, 36, 36},NULLHANDLE, { 66, 24, 101, 60} },/* Pause */
+  {IDPB_MMPLAYERPAUSE, {0, 0, 36,36},NULLHANDLE, { 66, 24, 101, 60} }, /* Pause sel */
+  {IDSL_MMPLAYERPOSBAR,{191-5, 19-4, 389-5,32-4}, NULLHANDLE, { 191, 19, 389, 32} },  //NULLHANDLE, { 0, 0, 191,10} },
+  {IDPB_MMPLAYERSLIDERARM,{0,1,9,8},NULLHANDLE, {0,0,9,9} },
+  {IDST_MMPLAYERPLAYTIME, {191, 32, 391,54},NULLHANDLE, { 0, 0, 190, 25} },
+  {IDSL_MMPLAYERVOLUME,{15, 2,141,17},NULLHANDLE, {20, 6, 146, 21} }, //{0, 0, 126, 9} /* {10,18,93,13} */ },
+  {IDSL_MMPLAYERVOLUMEARM,{0,0,9,9},NULLHANDLE, {0,0,9,9}},
+  {IDSL_MMPLAYERVOLUMEARM,{0,0,9,9},NULLHANDLE, {0,0,9,9}},
+};
+
+
+#define NUMPARAMS  2
+
+/* argv[0]: progname
+ * argv[1]: audio file
+ * ( argv[2]: class )
+ */
+
+//#define DEBUG
+#ifdef DEBUG
+void HlpWriteToTrapLog(const char* chrFormat, ...);
+#endif
+
+BOOL IniSaveWindowPos(char * iniFile, char* chrApp, char *chrKey, HWND hwnd);
+BOOL IniRestoreWindowPos(char * iniFile, char* chrApp, char *chrKey, HWND hwnd);
+int IniRestoreInt(char * iniFile, char* chrApp, char *chrKey, int defaultInt);
+BOOL IniSaveInt(char * iniFile, char* chrApp, char *chrKey, int theInt);
+BOOL HlpBuildMMProgIniFileName(char* chrProgname, char * chrBuffer, ULONG ulBufferSize);
+void freeResHandle(void);
+HMODULE queryResModuleHandle(char *chrExePath);
+BOOL getMessage(char* text,ULONG ulID, LONG lSizeText, HMODULE hResource,HWND hwnd);
+//MRESULT menuInsertMenuSeparator(int iPosition, HWND hwndMenu, HWND hwndSubMenu);
+MRESULT menuInsertMenuSeparator(HWND hwndMenu, HWND hwndSubMenu, SHORT sPosition );
+//MRESULT menuInsertMenuItem(int iPosition, HWND hwndMenu, HWND hwndSubMenu, int iID, char * chrText);
+SHORT menuInsertMenuItem( HWND hwndMenu, HWND hwndSubMenu, SHORT sPosition, int iID, char * chrText);
+void pmUsage(void);
+ULONG messageBox( char* text, ULONG ulTextID , LONG lSizeText,
+                  char* title, ULONG ulTitleID, LONG lSizeTitle,
+                  HMODULE hResource, HWND hwnd, ULONG ulFlags);
+
+
+MRESULT EXPENTRY playTimeTextProc(HWND hwnd, ULONG msg, MPARAM mp1, MPARAM mp2);
+MRESULT drawSlider(HWND hwnd, ULONG msg, MPARAM mp1, MPARAM mp2, USHORT id);
+MRESULT EXPENTRY privateSliderProc(HWND hwnd, ULONG msg, MPARAM mp1, MPARAM mp2);
+BOOL paintHilitedControl(HWND hwnd, USHORT usControl, BOOL bHilite);
+MRESULT paintControls(HWND hwnd, ULONG msg, MPARAM mp1, MPARAM mp2);
+MRESULT EXPENTRY bgProc(HWND hwnd, ULONG msg, MPARAM mp1, MPARAM mp2);
+MRESULT EXPENTRY buttonProc(HWND hwnd, ULONG msg, MPARAM mp1, MPARAM mp2);
+
+/* Every folder has one running play thread to handle play commands */
+void playThreadFunc (void *arg);
+void controlPlaying(HWND hwndDialog, ULONG ulAction, ULONG ulReserved);
+BOOL stopAudioFile(HWND hwndFrame);
+BOOL seekAudioFile(LONG lPosSec);
+void showPlayTimeDisplay(HWND hwndFrame, BOOL bShow);
+void togglePlayTimeDisplayVisibility(HWND hwndFrame);
+void setPlayTimeText(HWND hwndFrame);
+
+BOOL writeVolumeToIni(char * iniFile, char* chrApp, char *chrKey, ULONG ulVoume);
+int readVolumeFromIni(char * iniFile, char* chrApp, char *chrKey, int iDefault);
+BOOL writeDisplayTypeToIni(char * iniFile, char* chrApp, char *chrKey, int iDisplay);
+int readDisplayTypeFromIni(char * iniFile, char* chrApp, char *chrKey, int iDefault);
+
+char logName[]="mmplayer.log";
+
+extern SWP swpWindow;
+BOOL bHaveWindowPos=FALSE;
+
+/* Track to play. Full path */
+char chrSourceName[CCHMAXPATH]={0};
+char * chrPtrName=NULLHANDLE; /* Pointer to filename */
+char chrClassName[100]= {0};
+
+char chrIniFile[CCHMAXPATH];
+
+int numArgs;
+char* params[NUMPARAMS];
+
+/* TRUE when track is playing */
+BOOL bIsPlaying=FALSE;
+/* TRUE when track is paused */
+BOOL bPaused=FALSE;
+/* TRUE when user drags the position slider */
+BOOL bPosDragging=FALSE;
+BOOL bIsMidi=FALSE;
+
+/* Which display to show */
+/* 0: time, 1: remaining, 2: filename */
+int iWhichDisplay=0;
+/* Display timer for changing between track info */
+ULONG ulDisplayTimer=0;
+
+ULONG ulVolume=75;
+
+PID ulPid;
+/* The play time of the track */
+ULONG ulTotalLength=0;
+/* Current time in track */
+ULONG ulPos=0;
+
+HMODULE RESSOURCEHANDLE=0;
+
+HMODULE BMP_RESSOURCEHANDLE=0;
+
+PFNWP  oldPlayTimeProc;
+PFNWP orgBgProc=NULLHANDLE; /* Org proc of background */
+PFNWP orgButtonProc=NULLHANDLE;
+
+HPOINTER hptrArrowWE=NULLHANDLE;
+
+void HlpContextMenu(HWND hwnd, USHORT usItem, BOOL fCheckItem)
+{
+  POINTL ptl;
+  HWND   hwndPopup;
+
+  //  hwndPopup = WinLoadMenu(hwnd, _queryResModuleHandle(), ID_MENUTIMECONTEXT) ;
+  hwndPopup = WinLoadMenu(hwnd, RESSOURCEHANDLE, ID_MENUTIMECONTEXT) ;
+  if (hwndPopup == NULLHANDLE) {
+    DosBeep(100,1000);
+    return;
+  }
+  if(fCheckItem)
+    WinSendMsg(hwndPopup,MM_SETITEMATTR,MPFROM2SHORT(usItem, TRUE), MPFROM2SHORT(MIA_CHECKED,MIA_CHECKED));
+
+  WinQueryPointerPos(HWND_DESKTOP, &ptl) ;
+  WinMapWindowPoints(HWND_DESKTOP,hwnd,&ptl,1);
+  WinPopupMenu(hwnd, hwnd, hwndPopup,
+               ptl.x, ptl.y, 0, PU_HCONSTRAIN | PU_VCONSTRAIN |
+               PU_KEYBOARD | PU_MOUSEBUTTON1 | PU_MOUSEBUTTON2 | PU_NONE  );
+
+}
+
+static void _loadBmps(void)
+{
+  HPS hps;
+  HMODULE hResource;
+
+  if(allBMPs[MAIN_BMP_IDX].hbm)
+    return;
+
+  hResource=BMP_RESSOURCEHANDLE; //_queryResModuleHandle();
+  hps=WinGetPS(HWND_DESKTOP);
+
+  /* The main BMP */
+  allBMPs[MAIN_BMP_IDX].hbm=GpiLoadBitmap(hps, hResource, IDBMP_TOPMIDDLE, 0, 0);
+  GpiQueryBitmapParameters(allBMPs[MAIN_BMP_IDX].hbm, &allBMPs[MAIN_BMP_IDX].bmpInfoHdr);
+
+  /* Stop */
+  allBMPs[CTRLIDX_STOPBUTTON].hbm=GpiLoadBitmap(hps, hResource, IDBMP_STOP, 0, 0);
+  GpiQueryBitmapParameters(allBMPs[CTRLIDX_STOPBUTTON].hbm, &allBMPs[CTRLIDX_STOPBUTTON].bmpInfoHdr);
+  ciControls[CTRLIDX_STOPBUTTON].hbmSource=allBMPs[CTRLIDX_STOPBUTTON].hbm;
+
+  /* Stop sel */
+  allBMPs[CTRLIDX_STOPBUTTONSEL].hbm=GpiLoadBitmap(hps, hResource, IDBMP_STOPSEL, 0, 0);
+  GpiQueryBitmapParameters(allBMPs[CTRLIDX_STOPBUTTONSEL].hbm, &allBMPs[CTRLIDX_STOPBUTTONSEL].bmpInfoHdr);
+  ciControls[CTRLIDX_STOPBUTTONSEL].hbmSource=allBMPs[CTRLIDX_STOPBUTTONSEL].hbm;
+
+  /* Pause */
+  allBMPs[CTRLIDX_PAUSEBUTTON].hbm=GpiLoadBitmap(hps, hResource, IDBMP_PAUSE, 0, 0);
+  GpiQueryBitmapParameters(allBMPs[CTRLIDX_PAUSEBUTTON].hbm, &allBMPs[CTRLIDX_PAUSEBUTTON].bmpInfoHdr);
+  ciControls[CTRLIDX_PAUSEBUTTON].hbmSource=allBMPs[CTRLIDX_PAUSEBUTTON].hbm;
+
+  /* Pause sel */
+  allBMPs[CTRLIDX_PAUSEBUTTONSEL].hbm=GpiLoadBitmap(hps, hResource, IDBMP_PAUSESEL, 0, 0);
+  GpiQueryBitmapParameters(allBMPs[CTRLIDX_PAUSEBUTTONSEL].hbm, &allBMPs[CTRLIDX_PAUSEBUTTONSEL].bmpInfoHdr);
+  ciControls[CTRLIDX_PAUSEBUTTONSEL].hbmSource=allBMPs[CTRLIDX_PAUSEBUTTONSEL].hbm;
+
+  /* Play */
+  allBMPs[CTRLIDX_PLAYBUTTON].hbm=GpiLoadBitmap(hps, hResource, IDBMP_PLAY, 0, 0);
+  GpiQueryBitmapParameters(allBMPs[CTRLIDX_PLAYBUTTON].hbm, &allBMPs[CTRLIDX_PLAYBUTTON].bmpInfoHdr);
+  ciControls[CTRLIDX_PLAYBUTTON].hbmSource=allBMPs[CTRLIDX_PLAYBUTTON].hbm;
+
+  /* Play sel */
+  allBMPs[CTRLIDX_PLAYBUTTONSEL].hbm=GpiLoadBitmap(hps, hResource, IDBMP_PLAYSEL, 0, 0);
+  GpiQueryBitmapParameters(allBMPs[CTRLIDX_PLAYBUTTONSEL].hbm, &allBMPs[CTRLIDX_PLAYBUTTONSEL].bmpInfoHdr);
+  ciControls[CTRLIDX_PLAYBUTTONSEL].hbmSource=allBMPs[CTRLIDX_PLAYBUTTONSEL].hbm;
+
+  /* Positionslider bg */
+  ciControls[CTRLIDX_POSSLIDER].hbmSource=allBMPs[MAIN_BMP_IDX].hbm;
+
+  /* Positionslider arm */
+  allBMPs[CTRLIDX_POSSLIDERARM].hbm=GpiLoadBitmap(hps, hResource, IDBMP_POSSLIDERARM, 0, 0);
+  GpiQueryBitmapParameters(allBMPs[CTRLIDX_POSSLIDERARM].hbm, &allBMPs[CTRLIDX_POSSLIDERARM].bmpInfoHdr);
+  ciControls[CTRLIDX_POSSLIDERARM].hbmSource=allBMPs[CTRLIDX_POSSLIDERARM].hbm;
+
+  /* Playtime text field */
+  ciControls[CTRLIDX_PLAYTIME].hbmSource=allBMPs[MAIN_BMP_IDX].hbm;
+
+  /* Volume slider background */
+  ciControls[CTRLIDX_VOLSLIDER].hbmSource=allBMPs[MAIN_BMP_IDX].hbm;
+
+  /* Volume slider arm */
+  allBMPs[CTRLIDX_VOLSLIDERARM].hbm=GpiLoadBitmap(hps, hResource, IDBMP_VOLSLIDERARM, 0, 0);
+  GpiQueryBitmapParameters(allBMPs[CTRLIDX_VOLSLIDERARM].hbm, &allBMPs[CTRLIDX_VOLSLIDERARM].bmpInfoHdr);
+  ciControls[CTRLIDX_VOLSLIDERARM].hbmSource=allBMPs[CTRLIDX_VOLSLIDERARM].hbm;
+
+  /* Volume slider arm selected*/
+  allBMPs[CTRLIDX_VOLSLIDERARMSEL].hbm=GpiLoadBitmap(hps, hResource, IDBMP_VOLSLIDERARMSEL, 0, 0);
+  GpiQueryBitmapParameters(allBMPs[CTRLIDX_VOLSLIDERARMSEL].hbm, &allBMPs[CTRLIDX_VOLSLIDERARMSEL].bmpInfoHdr);
+  ciControls[CTRLIDX_VOLSLIDERARMSEL].hbmSource=allBMPs[CTRLIDX_VOLSLIDERARMSEL].hbm;
+
+  WinReleasePS(hps);
+}
+
+
+/***********************************************************/
+/*                                                         */
+/* Move the controls to the position defined by the        */
+/* background bitmap.                                      */
+/*                                                         */
+/***********************************************************/
+void adjustDialogControlPos(HWND hwnd)
+{
+  CONTROLINFO ci;
+  ULONG ulStyle;
+
+  /* STOP button */
+  ci=ciControls[CTRLIDX_STOPBUTTON];
+  ulStyle=WinQueryWindowULong(WinWindowFromID(hwnd, ci.id),QWL_STYLE);
+  WinSetWindowULong(WinWindowFromID(hwnd, ci.id),QWL_STYLE,ulStyle|BS_USERBUTTON);
+  WinSetWindowPos(WinWindowFromID(hwnd, ci.id), HWND_TOP, ci.rclDest.xLeft , ci.rclDest.yBottom,
+                  ci.rclDest.xRight-ci.rclDest.xLeft,
+                  ci.rclDest.yTop-ci.rclDest.yBottom, SWP_MOVE|SWP_SIZE);
+  /* Pause button */
+  ci=ciControls[CTRLIDX_PAUSEBUTTON];
+  ulStyle=WinQueryWindowULong(WinWindowFromID(hwnd, ci.id),QWL_STYLE);
+  WinSetWindowULong(WinWindowFromID(hwnd, ci.id),QWL_STYLE,ulStyle|BS_USERBUTTON);
+  WinSetWindowPos(WinWindowFromID(hwnd, ci.id),HWND_TOP, ci.rclDest.xLeft , ci.rclDest.yBottom,
+                  ci.rclDest.xRight-ci.rclDest.xLeft,
+                  ci.rclDest.yTop-ci.rclDest.yBottom, SWP_MOVE|SWP_SIZE);
+  /* Play button */
+  ci=ciControls[CTRLIDX_PLAYBUTTON];
+  ulStyle=WinQueryWindowULong(WinWindowFromID(hwnd, ci.id),QWL_STYLE);
+  WinSetWindowULong(WinWindowFromID(hwnd, ci.id),QWL_STYLE,ulStyle|BS_USERBUTTON);
+  WinSetWindowPos(WinWindowFromID(hwnd, ci.id),HWND_TOP, ci.rclDest.xLeft , ci.rclDest.yBottom,
+                  ci.rclDest.xRight-ci.rclDest.xLeft,
+                  ci.rclDest.yTop-ci.rclDest.yBottom, SWP_MOVE|SWP_SIZE);
+
+  /* Playtime text */
+  ci=ciControls[CTRLIDX_PLAYTIME];
+  WinSetWindowPos(WinWindowFromID(hwnd, ci.id),HWND_TOP, ci.rclSource.xLeft,ci.rclSource.yBottom,
+                  ci.rclSource.xRight-ci.rclSource.xLeft,
+                  ci.rclSource.yTop-ci.rclSource.yBottom, SWP_MOVE|SWP_SIZE);
+  oldPlayTimeProc=WinSubclassWindow(WinWindowFromID(hwnd, IDST_MMPLAYERPLAYTIME), playTimeTextProc);
+
+  /* Pos slider */
+  ci=ciControls[CTRLIDX_POSSLIDER];//ciPosSlider;
+  WinCreateWindow(hwnd, SLIDER_CLASS, "", WS_VISIBLE | WS_TABSTOP, 0,0, 10, 10,
+                  hwnd, HWND_TOP, ci.id, NULLHANDLE, NULLHANDLE);
+  WinSetWindowPos(WinWindowFromID(hwnd, ci.id),HWND_TOP, ci.rclDest.xLeft, ci.rclDest.yBottom,
+                  ci.rclSource.xRight-ci.rclSource.xLeft,
+                  ci.rclSource.yTop-ci.rclSource.yBottom, SWP_MOVE | SWP_SIZE);
+
+  WinSendMsg(WinWindowFromID(hwnd, ci.id),SLM_SETSLIDERINFO,
+             MPFROM2SHORT(SMA_SLIDERARMDIMENSIONS,0),
+             MPFROM2SHORT( 9, 9));
+
+  /* Vol slider */
+  ci=ciControls[CTRLIDX_VOLSLIDER];//ciVolSlider;
+  WinCreateWindow(hwnd, SLIDER_CLASS, "", WS_VISIBLE | WS_TABSTOP, 0,0, 10, 10,
+                  hwnd, HWND_TOP, ci.id, NULLHANDLE, NULLHANDLE);
+  WinSetWindowPos(WinWindowFromID(hwnd, ci.id),HWND_TOP, ci.rclDest.xLeft, ci.rclDest.yBottom,
+                  ci.rclSource.xRight-ci.rclSource.xLeft,
+                  ci.rclSource.yTop-ci.rclSource.yBottom, SWP_MOVE | SWP_SIZE);
+  WinSendMsg(WinWindowFromID(hwnd, ci.id),SLM_SETSLIDERINFO,
+             MPFROM2SHORT(SMA_SLIDERARMDIMENSIONS,0),
+             MPFROM2SHORT( 9, 9));
+
+}
+
+
+void playTimeCallback(HWND hwndFrame, LONG lPosSec)
+{
+  char chrCommand[50];
+  char retMsg[20];
+  ULONG rc;
+  int iWavePriv;
+
+  iWavePriv=ulPid;
+
+  /* Timeout. Check if wave is still playing */
+  sprintf(chrCommand,"STATUS wave%d MODE WAIT", iWavePriv);
+  rc = mciSendString(chrCommand, retMsg, sizeof(retMsg), 0, 0);
+  if((rc & 0x0000ffff)!=MCIERR_SUCCESS) {
+    /* Problem with MCI. Clean up. The Timer will be stopped in the method */
+    stopAudioFile(hwndFrame);
+  }
+  else {
+    if(!stricmp(retMsg, "stopped")) {
+      /* Audio file played. */
+      stopAudioFile(hwndFrame);
+    }
+    showPlayTimeDisplay(hwndFrame, TRUE);/* Ensure display is visible */
+  }
+}
+
+USHORT DrgGetNumObjects(PDRAGINFO pDragInfo)
+{
+  if(DrgAccessDraginfo(pDragInfo))
+    {
+      USHORT usItems=DrgQueryDragitemCount(pDragInfo);
+
+
+      DrgFreeDraginfo(pDragInfo);
+      return usItems;
+    }
+
+  return 0;
+}
+
+BOOL DrgVerifyTypeCW(PDRAGITEM pDragItem, char * chrType)
+{
+  /* DrgVerifyType() seems not to work when several types are in the list??
+     Dokumentation says, it works... */
+  /* Only check for a single type for now */
+  char text[CCHMAXPATH];
+
+  DrgQueryStrName(pDragItem->hstrType,sizeof(text), text); /* May be MP3, WAV etc... */
+
+  if(strstr(text, chrType))
+    return TRUE;
+
+  return FALSE;
+}
+
+/* Check if we know the file type dragged */
+BOOL DrgCheckForKnownType(PDRAGINFO pDragInfo  , HWND hwnd )
+{
+  BOOL rc=FALSE;
+
+  if(DrgAccessDraginfo(pDragInfo))
+    {
+      PDRAGITEM pDragItem;
+      //      char text[100];
+
+      pDragItem=DrgQueryDragitemPtr(pDragInfo, 0);
+      //    DrgQueryStrName(pDragItem->hstrType,sizeof(text), text); /* May be MP3, WAV etc... */
+
+      //  WinSetWindowText(hwnd, text);
+      bIsMidi=FALSE;
+      if(DrgVerifyTypeCW(pDragItem, "Digital Audio")) /* This should work for audio files added using the MM configuration */
+        rc=TRUE;
+      else if(DrgVerifyTypeCW(pDragItem, "WAV"))
+        rc=TRUE;
+      else if(DrgVerifyTypeCW(pDragItem, "MP3"))
+        rc=TRUE;
+      else if(DrgVerifyTypeCW(pDragItem, "MIDI")) {
+        rc=TRUE;
+        bIsMidi=TRUE;
+      }
+      else if(DrgVerifyTypeCW(pDragItem, "OGGS"))
+        rc=TRUE;
+      else if(DrgVerifyTypeCW(pDragItem, "VOC"))
+        rc=TRUE;
+      else if(DrgVerifyTypeCW(pDragItem, "IFF"))
+        rc=TRUE;
+      else if(DrgVerifyTypeCW(pDragItem, "AIF"))
+        rc=TRUE;
+      else if(DrgVerifyTypeCW(pDragItem, "AU"))
+        rc=TRUE;
+      else if(DrgVerifyTypeCW(pDragItem, "SND"))
+        rc=TRUE;
+      else if(DrgVerifyTypeCW(pDragItem, "_AU"))
+        rc=TRUE;
+      else if(DrgVerifyTypeCW(pDragItem, "FLAC"))
+        rc=TRUE;
+      DrgFreeDraginfo(pDragInfo);
+    }
+
+  return rc;
+}
+
+#if 0
+#define HASHSIZE 101
+/* This is poor mans HASH function... */
+USHORT calculateHash(char * theString)
+{
+  ULONG ulHash=0;
+
+  if(theString)
+    for(ulHash=0;*theString!='\0'; theString++)
+      ulHash=*theString+37*ulHash;
+
+  return ulHash%HASHSIZE;
+}
+
+/*
+  Hashes:
+
+  AIF:  0x30
+  AU:   0x42
+  WAV:  0x5b
+  MP3:  0x33
+  MIDI: 0x4c
+  OGGS: 0x58
+  IFF:  0x52
+  SND:  0x1b
+  VOC:  0x1d
+  _AU:  0x20
+ */
+BOOL DrgCheckForKnownType(PDRAGINFO pDragInfo /* , HWND hwnd */)
+{
+  BOOL rc=FALSE;
+
+return FALSE;
+  if(DrgAccessDraginfo(pDragInfo))
+    {
+      PDRAGITEM pDragItem;
+      char text[100];
+      USHORT usHash;
+
+      pDragItem=DrgQueryDragitemPtr(pDragInfo, 0);
+      DrgQueryStrName(pDragItem->hstrType,sizeof(text), text); /* May be MP3, WAV etc... */
+
+      usHash=calculateHash(text);
+      //sprintf(text,"%s, %x", text, usHash);
+      //   WinSetWindowText(hwnd, text);
+      switch(usHash)
+        {
+        case  0x30:
+        case  0x42:
+        case  0x5b:
+        case  0x33:
+        case  0x4c:
+        case  0x58:
+        case  0x52:
+        case  0x1b:
+        case  0x1d:
+        case  0x21:
+          rc=TRUE;
+        default:
+          break;
+        }
+
+      /* FIXME: Ugly Hack for MP3 files.
+         Some versions of the MP3 IO proc scan the whole file during identifying.
+         This is bad during dragging. */
+      /* Check if type contains MP3 type. There may be different types in the string */
+      if(!rc)
+        if(strstr(strupr(text), "MP3"))
+          rc=TRUE;
+
+      DrgFreeDraginfo(pDragInfo);
+    }
+
+
+  return rc;
+}
+#endif
+
+
+MRESULT handleDrag0ver(PDRAGINFO pdi, HWND hwnd)
+{
+
+  /* Only accept one file */
+  if(DrgGetNumObjects(pdi)!=1) {
+    return MRFROM2SHORT(DOR_NODROP, DO_LINK);
+  }
+  /* Check if the file is a known type. that's way faster than using mmioIdentifyFile() to check */
+  if(DrgCheckForKnownType(pdi, hwnd))
+    return MRFROM2SHORT(DOR_DROP, DO_COPY);
+
+  return MRFROM2SHORT(DOR_NEVERDROP, DO_COPY);
+}
+
+MRESULT handleDrop(PDRAGINFO pdi, HWND hwnd)
+{
+
+  /* Stop current track (if any) */
+  paintHilitedControl(WinWindowFromID(hwnd, IDPB_MMPLAYERPLAY), IDPB_MMPLAYERPLAY, FALSE);
+  paintHilitedControl(WinWindowFromID(hwnd, IDPB_MMPLAYERPAUSE), IDPB_MMPLAYERPAUSE, FALSE);
+  controlPlaying(hwnd, STOP_TRACK, 0);
+  /* Get file name */
+  if(DrgAccessDraginfo(pdi))
+    {
+      char chrFile[CCHMAXPATH];
+      PDRAGITEM pDragItem;
+
+      pDragItem=DrgQueryDragitemPtr(pdi, 0);
+      DrgQueryStrName(pDragItem->hstrSourceName,sizeof(chrFile), chrFile);
+      DrgQueryStrName(pDragItem->hstrContainerName,sizeof(chrSourceName), chrSourceName);
+      strcat(chrSourceName, chrFile);
+
+      /* Start new file */
+      controlPlaying(hwnd, PLAY_FIRST, 0);
+      DrgFreeDraginfo(pdi);
+    }
+  return MRFALSE;
+}
+
+/****************************************************************
+ *  FixSysMenu procedure
+ *--------------------------------------------------------------
+ *
+ *  Name:    FixSysMenu(HWND hwndDlg)
+ *
+ *  Purpose: This routine removes the Restore, Size, Minimize, and
+ *           Maximize options from the system menu of a dialog.
+ *
+ *  Usage
+ *
+ *  Method:  Called during the WM_INITDLG of a dialog procedure.
+ *
+ *  Returns: VOID
+ *
+ ****************************************************************/
+VOID FixSysMenu(HWND hwndDlg)
+{
+  HWND hwndMenu;                      /* Handle to system menu */
+  MENUITEM mi={0};
+
+  hwndMenu = WinWindowFromID(hwndDlg, FID_SYSMENU);
+
+
+  WinSendMsg(hwndMenu,  /* Delete Restore from the system menu */
+             MM_DELETEITEM,
+             MPFROM2SHORT(SC_RESTORE, TRUE),
+             MPFROMP(NULL));
+
+  WinSendMsg(hwndMenu,  /* Delete Size from the system menu    */
+             MM_DELETEITEM,
+             MPFROM2SHORT(SC_SIZE, TRUE),
+             MPFROMP(NULL));
+
+  WinSendMsg(hwndMenu, /* Delete Minimize from the system menu */
+             MM_DELETEITEM,
+             MPFROM2SHORT(SC_MINIMIZE, TRUE),
+             MPFROMP(NULL));
+
+  WinSendMsg(hwndMenu, /* Delete Maximize from the system menu */
+             MM_DELETEITEM,
+             MPFROM2SHORT(SC_MAXIMIZE, TRUE),
+             MPFROMP(NULL));
+
+  WinSendMsg(hwndMenu, /* Delete Maximize from the system menu */
+             MM_DELETEITEM,
+             MPFROM2SHORT(SC_HIDE, TRUE),
+             MPFROMP(NULL));
+
+  if(WinSendMsg(hwndMenu, /* Get sys menu menuitem  */
+             MM_QUERYITEM,
+             MPFROM2SHORT(SC_SYSMENU, FALSE),
+             MPFROMP(&mi)))
+    {
+      char chrText[100];
+      menuInsertMenuSeparator( mi.hwndSubMenu, NULLHANDLE, MIT_END);
+      if(!getMessage(chrText,  IDSTR_MASTERVOLUMEITEM, sizeof(chrText), RESSOURCEHANDLE, hwndMenu))
+         strcpy(chrText, "Master ~Volume");
+      menuInsertMenuItem( mi.hwndSubMenu, NULLHANDLE, MIT_END, ID_MENUITEMMASTERVOLUME, chrText);
+    }
+  return;
+}
+
+
+/* This Proc handles the main dialog */
+MRESULT EXPENTRY decodeStatusDialogProc(HWND hwnd, ULONG msg, MPARAM mp1, MPARAM mp2)
+{
+  //  char text[CCHMAXPATH*4 +10];
+  //  char title[CCHMAXPATH*4];
+  SWCNTRL swctl;
+  PID pid;
+
+  switch (msg)
+    {
+    case DM_DRAGOVER:
+      {
+      PDRAGINFO pdi=PVOIDFROMMP(mp1);
+
+      return handleDrag0ver( pdi, hwnd);
+
+      break;
+      }
+    case DM_DROP:
+      {
+        PDRAGINFO pdi=PVOIDFROMMP(mp1);
+
+        return handleDrop( pdi, hwnd);
+      }
+    case WM_INITDLG:
+      {
+        IniRestoreWindowPos(chrIniFile, INI_MMPLAYER_APP, INI_WINDOWPOS_KEY, hwnd);
+
+        /* Add switch entry */
+        memset(&swctl,0,sizeof(swctl));
+        WinQueryWindowProcess(hwnd,&pid,NULL);
+        swctl.hwnd=hwnd;
+        swctl.uchVisibility=SWL_VISIBLE;
+        swctl.idProcess=pid;
+        swctl.bProgType=PROG_DEFAULT;
+        swctl.fbJump=SWL_JUMPABLE;
+        WinAddSwitchEntry(&swctl);
+
+        adjustDialogControlPos(hwnd);
+
+        /* Set volume slider*/
+        WinSendMsg( WinWindowFromID(hwnd, IDSL_MMPLAYERVOLUME),
+                    SLM_SETSLIDERINFO,
+                    MPFROM2SHORT(SMA_SLIDERARMPOSITION,SMA_INCREMENTVALUE),
+                    MPFROMLONG( ulVolume));
+
+        /* Subclass buttons for DnD */
+        orgButtonProc=WinSubclassWindow(WinWindowFromID(hwnd, IDPB_MMPLAYERPLAY), buttonProc);
+        WinSubclassWindow(WinWindowFromID(hwnd, IDPB_MMPLAYERPAUSE), buttonProc);
+        WinSubclassWindow(WinWindowFromID(hwnd, IDPB_MMPLAYERSTOP), buttonProc);
+
+        FixSysMenu(hwnd);
+
+        /* Size dialog */
+        if(allBMPs[MAIN_BMP_IDX].hbm) {
+          SWP swp;
+
+          WinQueryWindowPos(WinWindowFromID(hwnd, FID_TITLEBAR), &swp);
+          WinSetWindowPos(WinWindowFromID(hwnd, ID_CLIENT), NULLHANDLE,
+                          WinQuerySysValue(HWND_DESKTOP, SV_CXDLGFRAME),
+                          WinQuerySysValue(HWND_DESKTOP, SV_CYDLGFRAME),
+                          allBMPs[MAIN_BMP_IDX].bmpInfoHdr.cx,
+                          allBMPs[MAIN_BMP_IDX].bmpInfoHdr.cy,
+                          SWP_SIZE|SWP_MOVE);
+          orgBgProc=WinSubclassWindow(WinWindowFromID(hwnd, ID_CLIENT), bgProc);
+
+          WinSetWindowPos(hwnd, NULLHANDLE, 0, 0,
+                          allBMPs[MAIN_BMP_IDX].bmpInfoHdr.cx+WinQuerySysValue(HWND_DESKTOP, SV_CXDLGFRAME)*2,
+                          allBMPs[MAIN_BMP_IDX].bmpInfoHdr.cy+swp.cy+WinQuerySysValue(HWND_DESKTOP, SV_CXDLGFRAME)*2
+                          , SWP_SIZE);
+        }
+        /* Set dialog font to WarpSans for Warp 4 and above */
+        if(SysQueryOSRelease()>=40) {
+          WinSetPresParam(WinWindowFromID(hwnd, IDST_MMPLAYERPLAYTIME),
+                          PP_FONTNAMESIZE,(ULONG)sizeof(DEFAULT_DIALOG_FONT),
+                          DEFAULT_DIALOG_FONT );
+        }
+        WinSetFocus(HWND_DESKTOP, WinWindowFromID(hwnd, IDPB_MMPLAYERPLAY));
+        WinStartTimer(WinQueryAnchorBlock(HWND_DESKTOP), hwnd, IDTIMER_START_PLAYING, START_TIMEOUT);
+        return (MRESULT) TRUE;
+      }
+    case WM_CLOSE:
+      controlPlaying(hwnd, STOP_TRACK, 0);
+      IniSaveWindowPos(chrIniFile, INI_MMPLAYER_APP, INI_WINDOWPOS_KEY, hwnd);
+      writeVolumeToIni(chrIniFile, INI_MMPLAYER_APP, INI_VOLUME_KEY, ulVolume);
+      writeDisplayTypeToIni(chrIniFile, INI_MMPLAYER_APP, INI_DISPLAY_KEY, iWhichDisplay);
+      //      WinSendMsg(hwndPlayObject, WM_CLOSE, 0, 0);
+      break;
+      /*****************************************************/
+      /* Handle playtime display switching.                */
+      /* The messages are coming from the static text.     */
+      /*****************************************************/
+    case WM_APPTERMINATENOTIFY:
+
+      switch(SHORT1FROMMP(mp1))
+        {
+        case NOTIFY_CLICK:
+          /* Clicked on the playtime display */
+          iWhichDisplay++;
+          if(iWhichDisplay>2)
+            iWhichDisplay=0;
+          if(iWhichDisplay==2)
+            ulDisplayTimer=0;
+          setPlayTimeText(hwnd);
+          return MRFALSE;
+        case NOTIFY_CONTEXT:
+          /* Show context menu. */
+          HlpContextMenu(hwnd, iWhichDisplay+ID_MENUITEMELAPSED, TRUE);
+          return MRFALSE;
+        default:
+          break;
+        }
+      return MRFALSE;
+
+      /*****************************************************/
+      /* The following two messages are for device sharing */
+      /*****************************************************/
+    case WM_ACTIVATE:
+      if(SHORT1FROMMP(mp1)){
+        char chrCommand[100];
+        int iWavePriv;
+
+        iWavePriv=ulPid;
+
+        if(bIsPlaying) {
+          sprintf(chrCommand,"ACQUIRE wave%d QUEUE wait", iWavePriv);
+          mciSendString(chrCommand, NULL, 0, 0, 0);
+        }
+      }
+      break;
+
+    case MM_MCIPASSDEVICE:
+      {
+        switch(SHORT1FROMMP(mp2))
+          {
+          case MCI_GAINING_USE:
+            bPaused=FALSE;/* The time display will not be increased */
+            paintHilitedControl(WinWindowFromID(hwnd, IDPB_MMPLAYERPAUSE), IDPB_MMPLAYERPAUSE, FALSE);
+            return (MRESULT)0;
+          case MCI_LOSING_USE:
+            bPaused=TRUE;
+            paintHilitedControl(WinWindowFromID(hwnd, IDPB_MMPLAYERPLAY), IDPB_MMPLAYERPLAY, FALSE);
+            return (MRESULT)0;
+          default:
+            break;
+          }
+      }
+      break;
+      /*****************************************************/
+      /* Set the time in the palytime display.             */
+      /* SETPOSITIONADVICE does not work for some reason,  */
+      /* so a timer is used. Yes, it's quit cumbersome...  */
+      /*****************************************************/
+    case WM_TIMER:
+      if(SHORT1FROMMP(mp1)==IDTIMER_PLAY) {
+        if(!bPaused) {
+          /* Adjust position info */
+          ulPos++;
+          if(ulPos*1000>ulTotalLength)
+            ulPos=ulTotalLength/1000;/* Prevent wrong time if timer info isn't accurate.
+                                                          I know all this timing stuff is an ugly thing. */
+
+
+          if(!bPosDragging) {
+            ULONG ulInc=ulTotalLength/1000;
+            setPlayTimeText(hwnd); /* Set time display */
+            /* Catch potential division by zero trap */
+            if(ulInc)
+              ulInc=ulPos*100/ulInc;
+            else
+              ulInc=100;
+            /* Set slider position */
+
+            WinPostMsg( WinWindowFromID(hwnd, IDSL_MMPLAYERPOSBAR),
+                        SLM_SETSLIDERINFO,
+                        MPFROM2SHORT(SMA_SLIDERARMPOSITION,SMA_INCREMENTVALUE),
+                        MPFROMLONG(ulInc));
+
+          }
+
+          playTimeCallback(hwnd, ulPos);
+          /* Blink play control */
+          paintHilitedControl(WinWindowFromID(hwnd, IDPB_MMPLAYERPLAY), IDPB_MMPLAYERPLAY, ulPos%2);
+        }
+        else {
+          /* Currently pausing */
+          togglePlayTimeDisplayVisibility(hwnd);
+          paintHilitedControl(  WinWindowFromID(hwnd, IDPB_MMPLAYERPAUSE), IDPB_MMPLAYERPAUSE,
+                                WinIsWindowVisible(WinWindowFromID(hwnd, IDST_MMPLAYERPLAYTIME)));
+        }
+        return (MRESULT)0;
+      }
+      else if(SHORT1FROMMP(mp1)==IDTIMER_START_PLAYING)
+        {
+          WinStopTimer(WinQueryAnchorBlock(hwnd), hwnd, IDTIMER_START_PLAYING);
+          controlPlaying(hwnd, PLAY_FIRST, 0);
+          return (MRESULT)0;
+        }
+      break;
+
+      /* The play control handling for starting, stopping etc. */
+    case WM_COMMAND:
+      {
+        switch(SHORT1FROMMP(mp1))
+          {
+          case IDPB_MMPLAYERPLAY:
+            paintHilitedControl(WinWindowFromID(hwnd, IDPB_MMPLAYERPAUSE), IDPB_MMPLAYERPAUSE, FALSE);
+            controlPlaying(hwnd, PLAY_FIRST, 0);
+            break;
+          case IDPB_MMPLAYERSTOP:
+            paintHilitedControl(WinWindowFromID(hwnd, IDPB_MMPLAYERPLAY), IDPB_MMPLAYERPLAY, FALSE);
+            paintHilitedControl(WinWindowFromID(hwnd, IDPB_MMPLAYERPAUSE), IDPB_MMPLAYERPAUSE, FALSE);
+            controlPlaying(hwnd, STOP_TRACK, 0);
+            break;
+          case IDPB_MMPLAYERPAUSE:
+            paintHilitedControl(WinWindowFromID(hwnd, IDPB_MMPLAYERPLAY), IDPB_MMPLAYERPLAY, FALSE);
+            controlPlaying(hwnd, PAUSE_TRACK, 0);
+            break;
+            /* Popup menu over time control */
+          case ID_MENUITEMELAPSED:
+            iWhichDisplay=DISPLAY_TIMEELAPSED;
+            setPlayTimeText(hwnd);
+            break;
+          case ID_MENUITEMREMAINING:
+            iWhichDisplay=DISPLAY_TIMEREMAINING;
+            setPlayTimeText(hwnd);
+            break;
+          case ID_MENUITEMID3:
+            iWhichDisplay=DISPLAY_TIMEID3;
+            ulDisplayTimer=0;
+            setPlayTimeText(hwnd);
+            break;
+          case ID_MENUITEMMASTERVOLUME:
+            {
+              HOBJECT hObject;
+              /* User selected master volume item from sys menu */
+              if((hObject=WinQueryObject("<MMPM2_MMVOLUME>"))!=NULLHANDLE) {
+                WinOpenObject(hObject,OPEN_DEFAULT,TRUE);
+              }
+              break;
+            }
+          default:
+            break;
+          }/* switch() */
+
+      return (MRESULT)FALSE;
+      }/* case */
+
+      /*****************************************************/
+      /* Draw the sliders.                                 */
+      /*****************************************************/
+    case WM_DRAWITEM:
+      switch(SHORT1FROMMP(mp1))
+        {
+        case IDSL_MMPLAYERPOSBAR:
+        case IDSL_MMPLAYERVOLUME:
+          return drawSlider(hwnd, msg, mp1, mp2, SHORT1FROMMP(mp1));
+        default:
+          break;
+        }
+      break;
+
+      /*****************************************************/
+      /* Control messages                                  */
+      /*****************************************************/
+    case WM_CONTROL:
+      {
+        SWP swp;
+        char chrCommand[50];
+        char retMsg[20];
+
+        switch(SHORT2FROMMP(mp1))
+          {
+          case BN_PAINT:
+            /* Paint the custom controls (buttons, sliders ) */
+            WinQueryWindowPos(hwnd,&swp);
+            if(swp.fl & SWP_MINIMIZE)
+              break;
+            return paintControls(hwnd, msg, mp1, mp2);
+              /*****************************************************/
+              /* Handle position and volume changes.               */
+              /*****************************************************/
+            case SLN_SLIDERTRACK:
+              {
+                switch(SHORT1FROMMP(mp1))
+                  {
+                  case IDSL_MMPLAYERVOLUME:
+                    {
+                      ULONG ulValue;
+
+                      ulValue=LONGFROMMP(mp2);
+                      ulVolume=ulValue;
+                      sprintf(chrCommand,"SET wave%ld AUDIO VOLUME %ld WAIT", ulPid, ulVolume);
+                      mciSendString(chrCommand, retMsg, sizeof(retMsg), 0, 0);
+                      break;
+                    }
+                  case IDSL_MMPLAYERPOSBAR:
+                    {
+                      static long lLastPos=0;
+                      long lPos=LONGFROMMP(mp2);
+
+                      bPosDragging=TRUE;
+                      lPos*=ulTotalLength/100;
+                      if(lPos/1000!=lLastPos) {
+                        /* Prevent flickering */
+                        sprintf(chrCommand, "%li:%02li", lPos/1000/60, (lPos/1000)%60);
+                        WinSetWindowText(WinWindowFromID(hwnd, IDST_MMPLAYERPLAYTIME), chrCommand);
+                        lLastPos=lPos/1000;
+                      }
+                      break;
+                    }
+                  default:
+                    break;
+                  }/* switch */
+                return (MRESULT) 0;
+                break;
+              }
+            case SLN_CHANGE:
+              {
+                switch(SHORT1FROMMP(mp1))
+                  {
+                  case IDSL_MMPLAYERVOLUME:
+                    {
+                      ULONG ulValue;
+
+                      ulValue=LONGFROMMP(mp2);
+                      ulVolume=ulValue;
+                      sprintf(chrCommand,"SET wave%ld AUDIO VOLUME %ld WAIT", ulPid, ulVolume);
+                      mciSendString(chrCommand, retMsg, sizeof(retMsg), 0, 0);
+                      break;
+                    }
+                  case IDSL_MMPLAYERPOSBAR:
+                    {
+                      long lPos=LONGFROMMP(mp2);
+
+                      bPosDragging=FALSE;
+                      lPos*=1000;
+                      lPos*=ulTotalLength/100;
+                      lPos/=1000;// Use only full seconds
+
+                      /* Set time display first */
+                      seekAudioFile(lPos);
+                      /* restart timer */
+                      WinStartTimer(WinQueryAnchorBlock(hwnd), hwnd, IDTIMER_PLAY, PLAYTIMER_DELAY);
+                      ulPos=lPos/1000;
+                      break;
+                    }
+                  default:
+                    break;
+                  }/* switch */
+                return (MRESULT)TRUE;
+              }
+          default:
+            break;
+          }/* switch */
+        break;
+      }/* WM_CONTROL */
+    default:
+      break;
+    }/* switch */
+
+  return WinDefDlgProc( hwnd, msg, mp1, mp2);
+}
+
+BOOL cwGetStringFromEA( char * chrFileName, PSZ pKey, char * chrBuffer, ULONG ulBuffSize)
+{
+  LONG rc;                             /* Ret code                   */
+  UCHAR       geabuff[300];            /* buffer for GEA             */
+  PVOID       fealist;                 /* fealist buffer             */
+  EAOP2       eaop;                    /* eaop structure             */
+  PGEA2       pgea;                    /* pgea structure             */
+  PFEA2       pfea;                    /* pfea structure             */
+  HFILE       handle;                  /* file handle                */
+  ULONG       act;                     /* open action                */
+  ULONG ulSize;
+  USHORT     *ptrUs;
+
+  if((fealist=malloc(0x00010000L /* Add some space */
+                     ))==NULL)
+    return FALSE;
+
+  ulSize=sizeof(chrFileName);
+
+  if ((rc = DosOpen(chrFileName, &handle, &act,
+                    0L, 0, OPEN_ACTION_OPEN_IF_EXISTS,
+                    OPEN_ACCESS_READONLY + OPEN_SHARE_DENYREADWRITE +
+                    OPEN_FLAGS_FAIL_ON_ERROR + OPEN_FLAGS_WRITE_THROUGH,NULL))!=NO_ERROR) {
+    free(fealist);    /* Free the memory            */
+    return FALSE;
+  }                                    /* get the file status info   */
+
+                                       /* FEA and GEA lists          */
+  eaop.fpGEA2List = (PGEA2LIST)geabuff;
+  eaop.fpFEA2List = (PFEA2LIST)fealist;
+  eaop.oError = 0;                     /* no error occurred yet      */
+  pgea = &eaop.fpGEA2List->list[0];    /* point to first GEA         */
+  eaop.fpGEA2List->cbList = sizeof(ULONG) + sizeof(GEA2) +
+    strlen(pKey);
+  eaop.fpFEA2List->cbList = (ULONG)0xffff;
+
+                                       /* fill in the EA name length */
+  pgea->cbName = (BYTE)strlen(pKey);
+  strcpy(pgea->szName, pKey);          /* fill in the name           */
+  pgea->oNextEntryOffset = 0;          /* fill in the next offset    */
+                                       /* read the extended attribute*/
+  rc = DosQueryFileInfo(handle, 3, (PSZ)&eaop, sizeof(EAOP2));
+  DosClose(handle);                    /* close the file             */
+  if (eaop.fpFEA2List->cbList <= sizeof(ULONG))
+    rc = ERROR_EAS_NOT_SUPPORTED;      /* this is error also         */
+
+  if (rc) {                            /* failure?                   */
+    free(fealist);    /* Free the memory            */
+    return FALSE;
+  }
+
+  pfea = &(eaop.fpFEA2List->list[0]);  /* point to the first FEA     */
+
+  ptrUs=(USHORT*)((PSZ)pfea->szName+(pfea->cbName+1));
+  if(*ptrUs!=0xfffd) {
+    /* Not an ASCII EA */
+    free(fealist);    /* Free the memory            */
+    return FALSE;
+  }
+  ptrUs++; /* Move to length */
+  ulSize=(ULONG)*ptrUs;
+
+  ptrUs++; /* Move to value */
+  if(ulSize==0) {
+    /* Not an ASCII EA */
+    free(fealist);    /* Free the memory            */
+    return FALSE;
+  }
+
+  memset(chrBuffer,0,ulBuffSize);
+  memcpy(chrBuffer, (char*)ptrUs, (ulSize>=ulBuffSize ? ulBuffSize-1 : ulSize));
+  free(fealist);    /* Free the memory            */
+  return TRUE;
+}
+
+int readVolumeFromIni(char * iniFile, char* chrApp, char *chrKey, int iDefault)
+{
+  return IniRestoreInt(iniFile, chrApp, chrKey, iDefault);
+}
+
+BOOL writeVolumeToIni(char * iniFile, char* chrApp, char *chrKey, ULONG ulVolume)
+{
+
+  return IniSaveInt(iniFile, chrApp, chrKey, ulVolume);
+}
+
+int readDisplayTypeFromIni(char * iniFile, char* chrApp, char *chrKey, int iDefault)
+{
+  return IniRestoreInt(iniFile, chrApp, chrKey, iDefault);
+}
+
+BOOL writeDisplayTypeToIni(char * iniFile, char* chrApp, char *chrKey, int iDisplay)
+{
+  return IniSaveInt(iniFile, chrApp, chrKey, iDisplay);
+}
+
+ULONG mmIdentifyFile(char* chrFile)
+{
+  MMIOINFO mmioInfo = {0};
+  MMFORMATINFO mmFormatInfo = {0};
+  FOURCC fourCC;
+  INT rc;
+
+  rc=mmioIdentifyFile(chrFile, &mmioInfo, &mmFormatInfo, &fourCC, 0,0);
+  if(rc!=MMIO_SUCCESS)
+    {
+#ifdef _PMPRINTF_
+      DebugHereIAm();
+#endif
+      return 0;
+    }
+#ifdef _PMPRINTF_
+  Pmpf(("MediaType %u", mmFormatInfo.ulMediaType));
+#endif
+  if(mmFormatInfo.ulMediaType==MMIO_MEDIATYPE_MIDI)
+    return 1; /* Midi */
+
+  /* Any other audio file */
+  return 2;
+}
+
+int main (int argc, char *argv[])
+{
+  HAB  hab;
+  HMQ  hmq;
+  char text[CCHMAXPATH];
+  char title[CCHMAXPATH];
+  short a;
+  ULONG rc;
+
+  /* Create a copy of the args */
+  /* argv[0]: progname
+   * argv[1]: audio file
+   */
+
+  numArgs=argc;
+
+  strcpy(text,"");
+  for(a=0;a<argc;a++)
+    {
+      params[a]=argv[a];
+    }
+
+  hab=WinInitialize(0);
+  if(hab) {
+    hmq=WinCreateMsgQueue(hab,0);
+    if(hmq) {
+      /* Check if user started prog by hand */
+      if(argc!=NUMPARAMS) {/* Not the right num of params */
+        pmUsage();
+      }
+      else {
+        PTIB ptib;
+        PPIB ppib;
+
+        /* Save source name */
+        strcpy(chrSourceName, params[1]);
+        //strcpy(chrSourceName, "H:\\cwmm\\classes\\mm-progs\\MMPlayer\\01 Vicious Circle - Propaganda - 1234.WAV");
+        if((chrPtrName=strrchr(chrSourceName, '\\'))!=NULLHANDLE)
+          ++chrPtrName;
+
+	rc=mmIdentifyFile(chrSourceName);
+	if(rc==0)
+          {
+#ifdef _PMPRINTF_
+	    DebugHereIAm();
+#endif
+	    /* FIXME: Identify error !!!*/
+
+          };
+#ifdef _PMPRINTF_
+	Pmpf(("rc %u", rc));
+#endif
+        if(rc==1)
+	  {
+	    /* It's a MIDI file */
+            bIsMidi=TRUE;
+          }
+        else
+          bIsMidi=FALSE;
+
+        /* Class name. We need it to distinguish MIDI and audio files */
+        if(argc==3)
+          strcpy(chrClassName, params[1]);
+
+        /* Get our ressource dll */
+        //        RESSOURCEHANDLE=0;
+        RESSOURCEHANDLE=queryResModuleHandle(argv[0]);
+        /* Get data from INI file */
+        HlpBuildMMProgIniFileName(argv[0], chrIniFile, sizeof(chrIniFile));
+        ulVolume=readVolumeFromIni(chrIniFile, INI_MMPLAYER_APP, INI_VOLUME_KEY, DEFAULT_VOLUME);
+        iWhichDisplay=readDisplayTypeFromIni(chrIniFile, INI_MMPLAYER_APP, INI_DISPLAY_KEY, 0);
+
+        /* Load pointer for slider */
+        hptrArrowWE=WinLoadPointer(HWND_DESKTOP, BMP_RESSOURCEHANDLE /*_queryResModuleHandle()*/, IDPTR_ARROWWE);
+        /* Register the slider window class */
+        WinRegisterClass(WinQueryAnchorBlock(HWND_DESKTOP), SLIDER_CLASS, privateSliderProc,0, SLADDBYTES);
+
+        _loadBmps();
+        DosGetInfoBlocks(&ptib, &ppib);
+        ulPid=ppib->pib_ulpid;
+        _beginthread(playThreadFunc,NULL,8192*16, NULLHANDLE); //Fehlerbehandlung fehlt
+
+        if( WinDlgBox( HWND_DESKTOP, NULLHANDLE, decodeStatusDialogProc,
+                       RESSOURCEHANDLE, IDDLG_MMPLAYER, 0) == DID_ERROR )
+          {
+            /*
+              Text:
+              Title:  "Installation problem"
+              */
+            messageBox( text, IDSTR_CONVERTDIALOGERROR , sizeof(text),
+                        title, IDSTR_INSTALLERRORTITLE , sizeof(title),
+                        RESSOURCEHANDLE, HWND_DESKTOP, MB_OK | MB_ICONEXCLAMATION | MB_MOVEABLE);
+            freeResHandle();
+            WinDestroyMsgQueue( hmq );
+            WinTerminate( hab );
+            DosBeep(100,600);
+            return( 1 );
+          }
+      }
+      freeResHandle();
+      WinDestroyMsgQueue(hmq);
+    }
+    WinTerminate(hab);
+  }
+  return 0;
+}
+
Index: /tags/CWMM-0.3.0_GA/classes/mm-progs/MMPlayer/mmplayer.h
===================================================================
--- /tags/CWMM-0.3.0_GA/classes/mm-progs/MMPlayer/mmplayer.h	(revision 213)
+++ /tags/CWMM-0.3.0_GA/classes/mm-progs/MMPlayer/mmplayer.h	(revision 213)
@@ -0,0 +1,110 @@
+/*
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; see the file COPYING.  If not, write to
+ * the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+/*
+ * If you need another license for your project/product (commercial,
+ * noncommercial, whatever) contact me at
+ * 
+ * http://www.os2world.com/cdwriting
+ * http://www.geocities.com/SiliconValley/Sector/5785/
+ *
+ */
+
+
+/* Used for sending a click event from the time control to the play control */
+#define NOTIFY_CLICK       1 /* For WM_APPTERMINATENOTIFY */
+/* Same for context menu */
+#define NOTIFY_CONTEXT     2
+
+/* Which display to show */
+#define DISPLAY_TIMEELAPSED    0
+#define DISPLAY_TIMEREMAINING  1
+#define DISPLAY_TIMEID3        2
+
+/* Which track to start */
+#define PLAY_FIRST    1L
+#define PLAY_NEXT     2L
+#define PLAY_PREV     3L
+#define PAUSE_TRACK   4L
+#define STOP_TRACK    5L
+#define SEEK_TRACK    6L
+
+#define  MAIN_BMP_IDX              0
+#define  CTRLIDX_PLAYBUTTON        1
+#define  CTRLIDX_PLAYBUTTONSEL     2
+#define  CTRLIDX_STOPBUTTON        3
+#define  CTRLIDX_STOPBUTTONSEL     4
+#define  CTRLIDX_PAUSEBUTTON       5
+#define  CTRLIDX_PAUSEBUTTONSEL    6
+#define  CTRLIDX_POSSLIDER         7
+#define  CTRLIDX_POSSLIDERARM      8
+#define  CTRLIDX_PLAYTIME          9
+#define  CTRLIDX_VOLSLIDER         10
+#define  CTRLIDX_VOLSLIDERARM      11
+#define  CTRLIDX_VOLSLIDERARMSEL   12
+
+#if 0
+#define  CTRLIDX_TOPLEFT           7
+#define  CTRLIDX_TOPRIGHT          8
+#define  CTRLIDX_BOTTOM            19
+#define  CTRLIDX_CHECK             20
+#define  CTRLIDX_UNCHECK           21
+#define  CTRLIDX_CHECKSEL          22
+#define  CTRLIDX_UNCHECKSEL        23
+#define  CTRLIDX_RANDOMCHECK             24
+#define  CTRLIDX_RANDOMUNCHECK           25
+#define  CTRLIDX_RANDOMCHECKSEL          26
+#define  CTRLIDX_RANDOMUNCHECKSEL        27
+#endif
+
+#define  NUM_CTRL_IDX              13
+
+/* Slider window class name */
+#define SLIDER_CLASS     "CWSLIDER"
+
+/* New slider window class            */
+/* Data positions in the window words */
+#define SLIDERARMWIDTH    0  /* USHORT */
+#define SLIDERARMHEIGHT  2  /* USHORT */
+#define PTRPOSINSLARM    4  /* USHORT */
+#define SLINCREMENTS     6  /* USHORT */
+#define SLIDERCX         8  /* ULONG */
+#define SLIDERCY         12 /* ULONG */
+#define SLIDERX          16 /* ULONG */
+#define SLIDERY          20 /* ULONG */
+#define SLIDERARMPOS     24 /* LONG  */
+#define SLDRAGGING       28 /* BOOL  */
+#define SLADDBYTES       32 /* num additional window bytes for slider */
+
+typedef struct
+{
+  INT id;
+  RECTL rclSource;
+  HBITMAP hbmSource;
+  RECTL rclDest;
+}CONTROLINFO;
+
+typedef struct
+{
+  BITMAPINFOHEADER bmpInfoHdr;
+  HBITMAP hbm;
+}LOADEDBITMAP;
+
+/* The IDs for the playtime display */
+#define IDTIMER_PLAY  5L
+#define PLAYTIMER_DELAY 1000
+
+#define IDTIMER_START_PLAYING 6L
+#define START_TIMEOUT 500
Index: /tags/CWMM-0.3.0_GA/classes/mm-progs/MMPlayer/mmplayer.rc
===================================================================
--- /tags/CWMM-0.3.0_GA/classes/mm-progs/MMPlayer/mmplayer.rc	(revision 213)
+++ /tags/CWMM-0.3.0_GA/classes/mm-progs/MMPlayer/mmplayer.rc	(revision 213)
@@ -0,0 +1,30 @@
+#ifndef OS2_INCLUDED
+   #include <os2.h>
+#endif
+#include "mmplayerres.h"
+
+BITMAP IDBMP_TOPMIDDLE        "./res/bmp/mmplayer.bmp"
+
+BITMAP IDBMP_SKIPBACK         "./res/bmp/Wrwd2.bmp"   
+BITMAP IDBMP_SKIPBACKSEL      "./res/bmp/Brwd2.bmp"   
+
+BITMAP IDBMP_PLAY             "./res/bmp/WSTART2.bmp"
+BITMAP IDBMP_PLAYSEL          "./res/bmp/BSTART2.bmp"
+
+BITMAP IDBMP_PAUSE            "./res/bmp/wPause2.bmp"
+BITMAP IDBMP_PAUSESEL         "./res/bmp/BPause2.bmp"
+
+BITMAP IDBMP_STOP             "./res/bmp/Wstop2.bmp"
+BITMAP IDBMP_STOPSEL          "./res/bmp/Bstop2.bmp"
+
+BITMAP IDBMP_SKIPFORWARD      "./res/bmp/WFWD2.bmp"
+BITMAP IDBMP_SKIPFORWARDSEL   "./res/bmp/BFWD2.bmp" 
+
+BITMAP IDBMP_POSSLIDERARM     "./res/bmp/PosArm.bmp"
+
+BITMAP IDBMP_VOLSLIDERARM    "./res/bmp/WVOL.bmp"
+BITMAP IDBMP_VOLSLIDERARMSEL "./res/bmp/BVOL.bmp"
+
+POINTER IDPTR_ARROWWE        "./res/pointer/arrowwe.ptr"
+
+
Index: /tags/CWMM-0.3.0_GA/classes/mm-progs/MMPlayer/mmplayerres.h
===================================================================
--- /tags/CWMM-0.3.0_GA/classes/mm-progs/MMPlayer/mmplayerres.h	(revision 213)
+++ /tags/CWMM-0.3.0_GA/classes/mm-progs/MMPlayer/mmplayerres.h	(revision 213)
@@ -0,0 +1,27 @@
+
+
+#define IDBMP_SKIPBACK		       2102
+#define IDBMP_PLAY                 2103
+#define IDBMP_PAUSE                2104
+#define IDBMP_STOP                 2105
+#define IDBMP_SKIPFORWARD          2106
+#define IDBMP_BUTTONUP             2107
+#define IDBMP_BUTTONDOWN           2108
+#define IDBMP_TOPMIDDLE            2109
+#define IDBMP_POSSLIDERARM         2110
+#define IDBMP_VOLSLIDERARM         2111
+#define IDBMP_VOLSLIDERARMSEL      2112
+#define IDBMP_TOPLEFT              2113
+#define IDBMP_TOPRIGHT             2114
+#define IDBMP_PLAYSEL              2115
+#define IDBMP_SKIPFORWARDSEL       2116
+#define IDBMP_SKIPBACKSEL	       2117
+#define IDBMP_PAUSESEL             2118
+#define IDBMP_STOPSEL              2119
+#define IDBMP_BOTTOM               2120
+#define IDBMP_CHECK                2121
+#define IDBMP_UNCHECK              2122
+#define IDBMP_CHECKSEL             2123
+#define IDBMP_UNCHECKSEL           2124
+
+#define IDPTR_ARROWWE              2
Index: /tags/CWMM-0.3.0_GA/classes/mm-progs/MMPlayer/playaudio.c
===================================================================
--- /tags/CWMM-0.3.0_GA/classes/mm-progs/MMPlayer/playaudio.c	(revision 213)
+++ /tags/CWMM-0.3.0_GA/classes/mm-progs/MMPlayer/playaudio.c	(revision 213)
@@ -0,0 +1,299 @@
+/*
+ * mmplayer.c (C) Chris Wohlgemuth 2002-2003
+ *
+ */
+/*
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; see the file COPYING.  If not, write to
+ * the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+/*
+ * If you need another license for your project/product (commercial,
+ * noncommercial, whatever) contact me at
+ *
+ * http://www.os2world.com/cdwriting
+ * http://www.geocities.com/SiliconValley/Sector/5785/
+ *
+ */
+
+#define INCL_DOS
+#define INCL_DOSFILEMGR
+#define INCL_DOSERRORS
+#define INCL_WIN
+#define INCL_OS2MM
+#define INCL_MMIOOS2
+#define INCL_MCIOS2
+#define INCL_GPI
+#define INCL_PM
+
+#include <os2.h>
+
+#include <sys\types.h>
+#include <sys\stat.h>
+#include <stdio.h>
+#include <string.h>
+#include <stdlib.h>
+#include "os2me.h"
+#include "common.h"
+#include "mmplayerres.h"
+#include "mmplayer.h"
+
+#if 0
+#define  _PMPRINTF_
+#include "PMPRINTF.H"
+#endif
+
+/* The object window controling the trac playing */
+HWND hwndPlayObject;
+extern PID ulPid;
+/* TRUE when track is playing */
+extern BOOL bIsPlaying;
+/* TRUE when track is paused */
+extern BOOL bPaused;
+/* Current time in track */
+extern ULONG ulPos;
+extern ULONG ulTotalLength;
+extern BOOL bIsMidi;
+extern ULONG ulVolume;
+
+extern char chrSourceName[CCHMAXPATH];
+
+void showPlayTimeDisplay(HWND hwndFrame, BOOL bShow);
+void _resetDisplay(HWND hwndFrame);
+void setPlayTimeText2( HWND hwndDialog, char * theText);
+
+BOOL pauseAudioFile(HWND hwndFrame)
+{
+  int iWavePriv;
+  char chrCommand[50];
+  char retMsg[100];
+
+  iWavePriv=ulPid;
+
+  if(bPaused) {
+    sprintf(chrCommand,"RESUME wave%d wait", iWavePriv);
+    mciSendString(chrCommand, retMsg, sizeof(retMsg), 0, 0);
+    bPaused=FALSE;
+    showPlayTimeDisplay( hwndFrame, TRUE);
+  }
+  else {
+    sprintf(chrCommand,"PAUSE wave%d wait", iWavePriv);
+    mciSendString(chrCommand, retMsg, sizeof(retMsg), 0, 0);
+    bPaused=TRUE;
+  }
+  return TRUE;
+}
+
+BOOL stopAudioFile(HWND hwndFrame)
+{
+  int iWavePriv;
+  char chrCommand[50];
+  char retMsg[100];
+
+  iWavePriv=ulPid;
+
+  if(bIsPlaying) {
+    sprintf(chrCommand,"stop wave%d wait", iWavePriv);
+    mciSendString(chrCommand, retMsg, sizeof(retMsg), 0, 0);
+
+    sprintf(chrCommand,"close wave%d wait", iWavePriv);
+    mciSendString(chrCommand, retMsg, sizeof(retMsg), 0, 0);
+
+    _resetDisplay(hwndFrame);
+    showPlayTimeDisplay( hwndFrame, TRUE);
+    WinStopTimer(WinQueryAnchorBlock(hwndFrame), hwndFrame, IDTIMER_PLAY);
+    bIsPlaying=FALSE;
+    bPaused=FALSE;
+  }
+  return TRUE;
+}
+
+ULONG playAudioFile(HWND hwndFrame)
+{
+  char chrCommand[CCHMAXPATH*2];
+  char chrDevice[30] = {0};
+  char retMsg[20];
+  ULONG rc;
+  int iWavePriv;
+  int iTime2 = 0;
+  HWND hwndNotify;
+
+
+  if(bPaused)
+    {
+      pauseAudioFile(hwndFrame);
+      return 1;
+    }
+
+
+  iWavePriv=++ulPid;
+  ulPos=0;
+
+  stopAudioFile(hwndFrame);
+
+#if 0
+#endif
+
+#if 0
+  if(!getMessage(chrCommand, IDSTR_STARTINGTRACK, sizeof(chrCommand), queryResModuleHandle(),  hwndFrame))
+#endif
+    sprintf(chrCommand, "Starting track...");
+  setPlayTimeText2(hwndFrame, chrCommand);
+
+  if(bIsMidi)
+    strncpy(chrDevice,"sequencer", sizeof(chrDevice) - 1);
+  else
+    strncpy(chrDevice,"WAVEAUDIO", sizeof(chrDevice) - 1);
+
+  hwndNotify=hwndFrame;//WinWindowFromID(hwndTop, IDDLG_TOPMIDDLE);
+  /* Start audio file */
+  sprintf(chrCommand,"open \"%s\"  type %s alias wave%d shareable wait", chrSourceName, chrDevice, iWavePriv);
+  rc = mciSendString(chrCommand, retMsg, sizeof(retMsg), hwndNotify, 0);
+  if((rc & 0x0000ffff)!=MCIERR_SUCCESS) {
+    return 0;
+  }
+
+  /* Set time format */
+  sprintf(chrCommand,"SET wave%d TIME FORMAT MILLISECONDS wait", iWavePriv);
+  rc = mciSendString(chrCommand, retMsg, sizeof(retMsg), 0, 0);
+  if((rc & 0x0000ffff)!=MCIERR_SUCCESS) {
+    sprintf(chrCommand,"close wave%d wait",iWavePriv);
+    rc = mciSendString(chrCommand, retMsg, sizeof(retMsg), 0, 0);
+    return 0;
+  }
+
+#if 0
+  sprintf(chrCommand,"SETPOSITIONADVISE wave%d ON EVERY 1000 notify", iWavePriv);
+  rc = mciSendString(chrCommand, retMsg, sizeof(retMsg),hwndNotify, 0);
+  if((rc & 0x0000ffff)!=MCIERR_SUCCESS) {
+    sprintf(chrCommand,"close wave%d wait",iWavePriv);
+    rc = mciSendString(chrCommand, retMsg, sizeof(retMsg), 0, 0);
+    return 0;
+  }
+#endif
+
+  /* Get wave length in ms */
+  sprintf(chrCommand,"STATUS wave%d LENGTH WAIT", iWavePriv);
+  rc = mciSendString(chrCommand, retMsg, sizeof(retMsg), 0, 0);
+  if((rc & 0x0000ffff)==MCIERR_SUCCESS) {
+    iTime2=atoi(retMsg);
+    sprintf(chrCommand,"%d:%02d  %d:%02d  -%d:%02d",iTime2/1000/60,(iTime2/1000)%60,
+            0, 0,
+            iTime2/1000/60,(iTime2/1000)%60);
+  }
+  ulTotalLength=iTime2;
+
+
+  /* Set volume */
+  sprintf(chrCommand,"SET wave%d AUDIO VOLUME %ld wait", iWavePriv, ulVolume);
+  rc = mciSendString(chrCommand, retMsg, sizeof(retMsg), 0, 0);
+  if((rc & 0x0000ffff)!=MCIERR_SUCCESS) {
+    sprintf(chrCommand,"close wave%d",iWavePriv);
+    rc = mciSendString(chrCommand, retMsg, sizeof(retMsg), 0, 0);
+    return 0;
+  }
+
+  sprintf(chrCommand,"play wave%d FROM 0", iWavePriv);
+  rc = mciSendString(chrCommand, retMsg, sizeof(retMsg), 0, 0);
+  if((rc & 0x0000ffff)!=MCIERR_SUCCESS) {
+    sprintf(chrCommand,"close wave%d",iWavePriv);
+    rc = mciSendString(chrCommand, retMsg, sizeof(retMsg), 0, 0);
+    return 0;
+  }
+
+  WinStartTimer(WinQueryAnchorBlock(hwndFrame), hwndFrame, IDTIMER_PLAY, PLAYTIMER_DELAY);
+
+  bIsPlaying=TRUE;
+  return 1;
+}
+
+BOOL seekAudioFile(LONG lPosSec)
+{
+  char chrCommand[50];
+  char retMsg[20];
+
+  sprintf(chrCommand,"PLAY wave%ld from %ld", ulPid, lPosSec);
+  mciSendString(chrCommand, retMsg, sizeof(retMsg), 0, 0);
+  //  ulStartPosition=lPosSec;
+  bPaused=FALSE;
+
+  return TRUE;
+}
+
+void controlPlaying(HWND hwndDialog, ULONG ulAction, ULONG ulReserved)
+{
+  WinPostMsg(hwndPlayObject, WM_APPTERMINATENOTIFY, MPFROMP(hwndDialog), MPFROMLONG(ulAction));
+}
+
+MRESULT EXPENTRY playObjectProc(HWND hwnd, ULONG msg, MPARAM mp1, MPARAM mp2)
+{
+  switch (msg)
+    {
+    case WM_APPTERMINATENOTIFY:
+      {
+        HWND hwndFrame=HWNDFROMMP(mp1);
+
+
+        switch(LONGFROMMP(mp2))
+          {
+          case PLAY_FIRST:
+            playAudioFile(hwndFrame);
+            break;
+          case STOP_TRACK:
+            stopAudioFile(hwndFrame);
+            break;
+          case PAUSE_TRACK:
+            pauseAudioFile(hwndFrame);
+            break;
+          default:
+            break;
+          }
+        return (MRESULT)0;
+      }
+    case WM_CLOSE:
+
+      break;
+    default:
+      break;
+    }
+  return WinDefWindowProc( hwnd, msg, mp1, mp2);
+}
+
+/* Every folder has one running play thread to handle play commands */
+void playThreadFunc (void *arg)
+{
+  HAB  hab;
+  HMQ  hmq;
+  QMSG qmsg;
+
+  hab=WinInitialize(0);
+  if(hab) {
+    hmq=WinCreateMsgQueue(hab,0);
+    if(hmq) {
+
+      hwndPlayObject=WinCreateWindow(HWND_OBJECT,WC_STATIC,"MFObj",0,0,0,0,0,NULLHANDLE,HWND_BOTTOM,13343,NULL,NULL);
+      if(hwndPlayObject) {
+        WinSubclassWindow(hwndPlayObject,&playObjectProc);
+        /* Window created. */
+        while(WinGetMsg(hab,&qmsg,(HWND)NULL,0,0))
+          WinDispatchMsg(hab,&qmsg);
+
+        WinDestroyWindow(hwndPlayObject);
+      }
+      WinDestroyMsgQueue(hmq);
+    }
+    WinTerminate(hab);
+  }
+}
+
+
Index: /tags/CWMM-0.3.0_GA/classes/mm-progs/audioconverter/audconv.c
===================================================================
--- /tags/CWMM-0.3.0_GA/classes/mm-progs/audioconverter/audconv.c	(revision 213)
+++ /tags/CWMM-0.3.0_GA/classes/mm-progs/audioconverter/audconv.c	(revision 213)
@@ -0,0 +1,784 @@
+/*
+ * pmmp3dec.c (C) Chris Wohlgemuth 2002
+ *
+ * This helper decodes an MP3
+ */
+/*
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; see the file COPYING.  If not, write to
+ * the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+/*
+ * If you need another license for your project/product (commercial,
+ * noncommercial, whatever) contact me at
+ *
+ * http://www.os2world.com/cdwriting
+ * http://www.geocities.com/SiliconValley/Sector/5785/
+ *
+ */
+
+#define INCL_DOS
+#define INCL_DOSFILEMGR
+#define INCL_DOSERRORS
+#define INCL_WIN
+#define INCL_OS2MM
+#define INCL_MMIOOS2
+#define INCL_MCIOS2
+
+#include <os2.h>
+
+#include <sys\types.h>
+#include <sys\stat.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <ctype.h>
+#include "os2me.h"
+#include "common.h"
+#include "mmres.h"
+#include "mmprogs_defaults.h"
+
+#include "sys_funcs.h"
+
+#if 0
+#define  _PMPRINTF_
+#include "U:/PMPRINTF/PMPRINTF.H"
+#endif
+
+#define MSG_CONVERTDONE    1L
+#define MSG_CONVERTPERCENT 2L
+#define MSG_CONVERTERROR   3L
+
+#define ID_TIMER 1
+#define TIMER_DELAY        200
+
+#define CONVERTBUFFERSIZE  500000
+#define NUMPARAMS  3
+/* argv[0]: progname
+ * argv[1]: wavefile
+ * argv[2]: IO proc name
+ */
+
+//#define DEBUG
+
+//#define INI_NAME_APP        "audioconv"
+//#define INI_NAME_COLOR        "color"
+
+void HlpSendCommandToObject(PSZ chrObject, PSZ command);
+BOOL percentRegisterBarClass(void);
+BOOL IniSaveWindowPos(PSZ iniFile, PSZ chrApp, PSZ chrKey, HWND hwnd);
+BOOL IniRestoreWindowPos(PSZ iniFile, PSZ chrApp, PSZ chrKey, HWND hwnd);
+BOOL IniSaveWindowClrs(PSZ chrIniFile, PSZ chrApp , HWND hwnd);
+BOOL IniRestoreWindowClrs(PSZ chrIniFile, PSZ chrApp , HWND hwnd);
+BOOL HlpBuildMMProgIniFileName(PSZ chrProgname, PSZ chrBuffer, ULONG ulBufferSize);
+HMODULE queryResModuleHandle(PSZ chrExePath);
+void freeResHandle(void);
+BOOL getMessage(PSZ text,ULONG ulID, LONG lSizeText, HMODULE hResource,HWND hwnd);
+ULONG messageBox( PSZ text, ULONG ulTextID , LONG lSizeText,
+                  PSZ title, ULONG ulTitleID, LONG lSizeTitle,
+                  HMODULE hResource, HWND hwnd, ULONG ulFlags);
+
+
+char logName[]="convert.log";
+
+extern SWP swpWindow;
+BOOL bHaveWindowPos=FALSE;
+
+UCHAR chrTargetName[CCHMAXPATH]={0};
+UCHAR chrSourceName[CCHMAXPATH]={0};
+UCHAR chrProcName[CCHMAXPATH]={0};
+UCHAR chrIniFile[CCHMAXPATH];
+
+int numArgs;
+char* params[NUMPARAMS];
+
+#define NUMIOPROCS 1000
+int iIoProc;     /* Position of IO-Proc in global data area of MMOS2. 0 based */
+int iPrivIOProc[NUMIOPROCS]; /* Number of possible IO-Procs. I'm lazy here and use a static array.
+                                If there ever will be more than 1000 procs there'll be a problem... */
+
+
+int iSampleRate;
+int iBitsPerSample;
+SHORT sChannels;
+ULONG lSec;
+ULONG lAudioSize;
+
+TID tidThread=0;
+BOOL bBreak=FALSE;
+PMMFORMATINFO pMemFormatInfo=NULLHANDLE;
+HMODULE RESSOURCEHANDLE=0;
+BOOL bNoProcGiven=FALSE;
+
+void pmUsage(void);
+
+BOOL createTargetName(PSZ sourceName, PSZ chrExt)
+{
+  PCHAR textPtr=NULL;
+
+  strcpy((PCHAR)chrTargetName, (PCHAR)sourceName);
+  if((textPtr=strrchr((PCHAR)chrTargetName, '.'))!=NULL)
+    *textPtr=0;
+  else
+    textPtr=(PCHAR)chrTargetName;
+  strcat(textPtr,".");
+  strcat(textPtr, (PCHAR)chrExt);
+#if 0
+        WinMessageBox( HWND_DESKTOP, HWND_DESKTOP, textPtr,
+                       "",
+                       0UL, MB_OK | MB_ICONEXCLAMATION|MB_MOVEABLE );
+#endif
+  return TRUE;
+}
+
+BOOL insertIOProcItems( HWND hwndDrop )
+{
+  //    CHAR          szBuffer[ sizeof( FOURCC ) + CCHMAXPATH + 4 ];
+    MMFORMATINFO  mmFormatInfo;
+    PMMFORMATINFO pmmFormatInfoArray;
+    ULONG         ulReturnCode;
+    LONG          lFormatsRead;
+    LONG          index;
+    LONG          lBytesRead;
+
+
+    LONG lNumIOProcs;
+    int sIdx;
+    memset( &mmFormatInfo,
+            '\0',
+            sizeof(MMFORMATINFO) );
+
+    mmFormatInfo.ulMediaType |= MMIO_MEDIATYPE_AUDIO;
+    mmFormatInfo.ulFlags|=MMIO_CANWRITETRANSLATED;
+    ulReturnCode = mmioQueryFormatCount ( &mmFormatInfo,
+                                          &lNumIOProcs,
+                                          0,
+                                          0 );
+
+    if( ulReturnCode != MMIO_SUCCESS )
+      {
+        /*
+         * Error - mmioQueryFormatCount failed.
+         */
+        return FALSE;
+      }
+
+    /*
+     * Allocate enough memory for n number of FormatInfo blocks
+     */
+    pmmFormatInfoArray = (PMMFORMATINFO) malloc (lNumIOProcs * sizeof( MMFORMATINFO ) );
+    pMemFormatInfo=pmmFormatInfoArray;
+    if( pmmFormatInfoArray == NULL )
+      {
+        /*
+         * Could not allocate enough memory for mmFormatInfo array.
+         */
+        return FALSE;
+      }
+
+    /*
+     * call mmioGetFormats to get info on the formats supported.
+     */
+    ulReturnCode = mmioGetFormats( &mmFormatInfo,
+                                   lNumIOProcs,
+                                   pmmFormatInfoArray,
+                                   &lFormatsRead,
+                                   0,
+                                   0 );
+    if( ulReturnCode != MMIO_SUCCESS )
+      {
+        /*
+         *  mmioGetFormats failed.
+         */
+        free(pmmFormatInfoArray);
+        return FALSE;
+      }
+
+    if( lFormatsRead != lNumIOProcs )
+      {
+        /*
+         * Error in MMIO - number of formats read in by
+         * mmioGetFormats is not equal to number of formats
+         * found by mmioQueryFormatCount.
+         */
+        free(pmmFormatInfoArray);
+        return FALSE;
+      }
+
+
+    for ( index = 0, sIdx=0; index <lNumIOProcs; index++ )
+      {
+        UCHAR szName[CCHMAXPATH];
+
+        mmioGetFormatName(pmmFormatInfoArray, szName, &lBytesRead, 0L, 0L);
+        /* Insert NULL string terminator */
+        *( szName + lBytesRead ) = 0;
+
+#ifdef DEBUG
+        SysWriteToTrapLog("%d  IO-Proc: %s, %s\n", index,
+                          pmmFormatInfoArray->szDefaultFormatExt,
+                          szName);
+#endif
+
+        if(pmmFormatInfoArray->ulFlags & MMIO_CANWRITETRANSLATED)
+          {
+            /* Insert into list box */
+            WinSendMsg(hwndDrop, LM_INSERTITEM,(MPARAM)LIT_END,
+                       (MPARAM)szName);
+
+
+            iPrivIOProc[sIdx]=index;
+
+#ifdef DEBUG
+            SysWriteToTrapLog("-- %d  %d, sIdx: %d %s\n", index, iPrivIOProc[sIdx], sIdx,
+                              pmmFormatInfoArray->szDefaultFormatExt
+                              );
+#endif
+
+
+            /* Set text field */
+            if(bNoProcGiven) {
+              WinSetWindowText(hwndDrop, szName);
+              createTargetName(chrSourceName, (PSZ)pmmFormatInfoArray->szDefaultFormatExt);
+              iIoProc=iPrivIOProc[sIdx];
+              bNoProcGiven=FALSE;
+            }
+            else {
+              if(!stricmp((PCHAR)szName, (PCHAR)chrProcName)) {
+                WinSetWindowText(hwndDrop, szName);
+                /* Create target name */
+                createTargetName(chrSourceName, (PSZ)pmmFormatInfoArray->szDefaultFormatExt);
+                iIoProc=iPrivIOProc[sIdx];
+              }
+              sIdx++;
+            }
+          }
+
+        /*
+         *  advance to next entry in mmFormatInfo array
+         */
+        pmmFormatInfoArray++;
+      }
+    return TRUE;
+}
+
+BOOL queryAudioInfo(PSZ chrFile)
+{
+  HMMIO hmmio;
+  MMAUDIOHEADER mmAudioHeader;
+  MMIOINFO mmioinfo;
+  LONG lBytesRead=0;
+  APIRET rc;
+
+  memset(&mmioinfo,0, sizeof(mmioinfo));
+  mmioinfo.ulTranslate = MMIO_TRANSLATEHEADER;
+  mmioinfo.ulFlags=MMIO_READ|MMIO_DENYNONE;
+  /* open source file */
+  if((hmmio=mmioOpen(chrFile, &mmioinfo,MMIO_READ))==NULLHANDLE)
+    {
+      return FALSE;
+    }
+  memset(&mmAudioHeader,0,sizeof(MMAUDIOHEADER));
+  rc = mmioGetHeader(hmmio, &mmAudioHeader,sizeof(MMAUDIOHEADER),
+                     &lBytesRead, 0, 0);
+  if(rc!=MMIO_SUCCESS) {
+    mmioClose(hmmio, 0);
+    //    fprintf(stderr,"mmioGetHeader error!\n");
+    return FALSE;
+  }
+
+  iSampleRate=mmAudioHeader.mmXWAVHeader.WAVEHeader.ulSamplesPerSec;
+  sChannels=mmAudioHeader.mmXWAVHeader.WAVEHeader.usChannels;
+  iBitsPerSample=mmAudioHeader.mmXWAVHeader.WAVEHeader.usBitsPerSample;
+  lSec=mmAudioHeader.mmXWAVHeader.XWAVHeaderInfo.ulAudioLengthInBytes/
+    mmAudioHeader.mmXWAVHeader.WAVEHeader.ulAvgBytesPerSec;
+  lAudioSize=mmAudioHeader.mmXWAVHeader.XWAVHeaderInfo.ulAudioLengthInBytes;
+
+  /* close source */
+  mmioClose(hmmio,0);
+  return TRUE;
+}
+
+#if 0
+BOOL createTargetName(char *sourceName)
+{
+  char *textPtr;
+
+  strcpy(chrTargetName, sourceName);
+  if((textPtr=strrchr(chrTargetName, '.'))!=NULLHANDLE)
+    *textPtr=0;
+  else
+    textPtr=chrTargetName;
+  strcat(textPtr, ".wav");
+
+  return TRUE;
+}
+#endif
+
+void convertThreadFunc (void *arg)
+{
+  HAB  hab;
+  HMQ  hmq;
+  HWND hwnd=(HWND)arg;
+
+  hab=WinInitialize(0);
+  if(hab) {
+    hmq=WinCreateMsgQueue(hab,0);
+    if(hmq) {
+      HMMIO hmmio, hmmioTarget;
+      MMIOINFO mmioinfo;
+      MMAUDIOHEADER mmAudioHeader;
+      LONG lBytesRead=0;
+      LONG lBytesWritten=0;
+      ULONG rc;
+      PCHAR buffer=NULL;
+
+      do {
+        /*******************************/
+        /* Set up/open the SOURCE file */
+        /*******************************/
+        memset(&mmioinfo,0, sizeof(mmioinfo));
+        mmioinfo.ulTranslate = MMIO_TRANSLATEHEADER | MMIO_TRANSLATEDATA;
+        mmioinfo.ulFlags=MMIO_READ|MMIO_DENYNONE;
+
+        if((hmmio=mmioOpen(chrSourceName, &mmioinfo,MMIO_READ))==NULLHANDLE)
+          {
+            UCHAR text[500];
+            sprintf((PCHAR)text,/* sizeof(text)-1,*/"mmioOpen error with file %s\n", chrSourceName);
+            WinMessageBox(hwnd, hwnd, (PSZ)"",
+                          text,
+                          0UL, MB_OK | MB_ICONEXCLAMATION|MB_MOVEABLE );
+            break;
+          }
+        memset(&mmAudioHeader,0,sizeof(MMAUDIOHEADER));
+        rc = mmioGetHeader(hmmio, &mmAudioHeader,sizeof(MMAUDIOHEADER),
+                           &lBytesRead, 0, 0);
+        if(rc!=MMIO_SUCCESS) {
+          UCHAR text[500];
+          mmioClose(hmmio, 0);
+          sprintf((PCHAR)text, /*sizeof(text)-1,*/"mmioGetHeader error!");
+          WinMessageBox(hwnd, hwnd, (PSZ)"",
+                        text,
+                        0UL, MB_OK | MB_ICONEXCLAMATION|MB_MOVEABLE );
+          break;
+        }
+
+        /*******************************/
+        /* Set up/open the TARGET file */
+        /*******************************/
+        memset(&mmioinfo,0, sizeof(mmioinfo));
+        mmioinfo.ulTranslate = MMIO_TRANSLATEHEADER | MMIO_TRANSLATEDATA;
+        mmioinfo.ulFlags=MMIO_WRITE|MMIO_CREATE;
+
+        //  mmioinfo.fccIOProc=mmioStringToFOURCC("WAVE", MMIO_TOUPPER);
+        mmioinfo.fccIOProc=pMemFormatInfo[iIoProc].fccIOProc;
+        if((hmmioTarget=mmioOpen(chrTargetName, &mmioinfo, MMIO_WRITE|MMIO_CREATE))==NULLHANDLE)
+          {
+            UCHAR chrError[64];
+            UCHAR text[CCHMAXPATH*2];
+            rc=mmioGetLastError(hmmioTarget);
+            mciGetErrorString(mmioinfo.ulErrorRet ,chrError, sizeof(chrError)-1);
+            sprintf((PCHAR)text, /*sizeof(text)-1,*/"mmioOpen error with file %s:\n%s\n%lu", chrTargetName, chrError,mmioinfo.ulErrorRet);
+            mmioClose(hmmio,0);
+            WinMessageBox(hwnd, hwnd, (PSZ)"",
+                          text,
+                          0UL, MB_OK | MB_ICONEXCLAMATION|MB_MOVEABLE );
+            break;
+          }
+        /* Set parameters */
+        rc = mmioSetHeader(hmmioTarget, &mmAudioHeader,sizeof(MMAUDIOHEADER),
+                           &lBytesWritten, 0, 0);
+
+        /* Get buffer */
+        if((buffer=(PCHAR)malloc(CONVERTBUFFERSIZE))==NULLHANDLE) {
+          UCHAR text[500];
+          mmioClose(hmmio, 0);
+          mmioClose(hmmioTarget,0);
+          sprintf((PCHAR)text, /*sizeof(text)-1,*/"Can't get memory buffer!");
+          WinMessageBox(hwnd, hwnd, (PSZ)"",
+                        text,
+                        0UL, MB_OK | MB_ICONEXCLAMATION|MB_MOVEABLE );
+
+          break;
+        }
+
+        /* convert */
+        lBytesWritten=0;
+        do{
+          rc=mmioRead(hmmio, buffer, CONVERTBUFFERSIZE);
+          if(bBreak)
+            break;
+          if(rc!=0 && rc!=MMIO_ERROR ) {
+            mmioWrite(hmmioTarget, buffer, rc);
+            lBytesWritten+=rc;
+            WinSendMsg(hwnd, WM_APPTERMINATENOTIFY, MPFROMLONG(MSG_CONVERTPERCENT), MPFROMLONG((lBytesWritten)/(lAudioSize/100)));
+          }
+        }while(rc!=0 && rc!=MMIO_ERROR && !bBreak/*&& lBytesWritten <1000000*/);
+        if(rc==MMIO_ERROR) {
+          UCHAR text[500];
+          sprintf((PCHAR)text, /*sizeof(text)-1,*/"Error while reading audio data!");
+          WinMessageBox(hwnd, hwnd, (PSZ)"",
+                        text,
+                        0UL, MB_OK | MB_ICONEXCLAMATION|MB_MOVEABLE );
+        }
+        if(!bBreak) {
+          UCHAR chrCommand[CCHMAXPATH*2];
+          WinSendMsg(hwnd, WM_APPTERMINATENOTIFY, MPFROMLONG(MSG_CONVERTPERCENT), MPFROMLONG(100));
+          /* Refresh details view */
+          HlpSendCommandToObject(chrTargetName, (PSZ)"CWAUDIOREFRESH=1");
+          sprintf((PCHAR)chrCommand,"CWAUDIOCOPYTAGTO=%s;", chrTargetName);
+          HlpSendCommandToObject(chrSourceName, chrCommand);
+        }
+        free(buffer);
+        /* close source */
+        mmioClose(hmmio,0);
+        /* close target */
+        mmioClose(hmmioTarget,0);
+        break;
+      }
+      while(TRUE);
+      WinSendMsg(hwnd, WM_APPTERMINATENOTIFY, MPFROMLONG(MSG_CONVERTDONE), 0);
+      WinDestroyMsgQueue(hmq);
+    }
+    WinTerminate(hab);
+  }
+  tidThread=0;
+  bBreak=FALSE;
+}
+
+void convertAudioFile(HWND hwnd)
+{
+  tidThread=_beginthread(convertThreadFunc,NULL,  8192*16, (void*)hwnd); //Fehlerbehandlung fehlt
+  if(tidThread==-1) {
+    DosBeep(100, 500);
+    tidThread=0;
+  }
+}
+
+/* This Proc handles the on-the-fly data CD writing */
+MRESULT EXPENTRY decodeStatusDialogProc(HWND hwnd, ULONG msg, MPARAM mp1, MPARAM mp2)
+{
+  UCHAR text[CCHMAXPATH*4 +10];
+  UCHAR title[CCHMAXPATH*4];
+  SWCNTRL swctl;
+  PID pid;
+  int iPercent;
+
+  switch (msg)
+    {
+    case WM_INITDLG:
+
+      /* Add switch entry */
+      memset(&swctl,0,sizeof(swctl));
+      WinQueryWindowProcess(hwnd,&pid,NULL);
+      swctl.hwnd=hwnd;
+      swctl.uchVisibility=SWL_VISIBLE;
+      swctl.idProcess=pid;
+      swctl.bProgType=PROG_DEFAULT;
+      swctl.fbJump=SWL_JUMPABLE;
+      WinAddSwitchEntry(&swctl);
+
+#if 0
+      sprintf(text,"1: %s, 2: %s, 3: %s 4: %s 5: %s 6: %s",params[1],params[2],params[3],
+              params[4], params[4],params[4]);
+      WinMessageBox( HWND_DESKTOP, HWND_DESKTOP, text,
+                     params[4],
+                     0UL, MB_OK | MB_ICONEXCLAMATION|MB_MOVEABLE );
+#endif
+
+      WinSendMsg(WinWindowFromID(hwnd,IDST_CONVERTNAME),EM_SETTEXTLIMIT,MPFROMSHORT((SHORT)CCHMAXPATH),0);
+
+      WinSetWindowText(WinWindowFromID(hwnd,IDST_CONVERTCDBITS), (PSZ)"");
+
+      /* Filename */
+      WinSetWindowText(WinWindowFromID(hwnd,IDST_CONVERTNAME), chrSourceName);
+
+      /* Set dialog font to WarpSans for Warp 4 and above */
+      if(SysQueryOSRelease()>=40) {
+        WinSetPresParam(hwnd,
+                        PP_FONTNAMESIZE,(ULONG)sizeof(DEFAULT_DIALOG_FONT),
+                        DEFAULT_DIALOG_FONT );
+      }
+
+      /* Set percent bars to 0. */
+      WinSetWindowText(WinWindowFromID(hwnd,IDBAR_CONVERTPROGRESS),(PSZ)"0#0%");
+
+      WinSendMsg(WinWindowFromID(hwnd,IDEF_CONVERTTARGETNAME), EM_SETTEXTLIMIT,MPFROMSHORT((SHORT)CCHMAXPATH),0);
+      insertIOProcItems( WinWindowFromID(hwnd, IDDD_IOPROC) );
+      WinSetWindowText( WinWindowFromID(hwnd,IDEF_CONVERTTARGETNAME), chrTargetName );
+      WinEnableWindow( WinWindowFromID(hwnd,IDPB_CONVERTABORT), FALSE);
+
+      /* Channels */
+      getMessage(title, IDSTR_CONVERTCHANNELS, sizeof(title), RESSOURCEHANDLE, hwnd);
+      sprintf((PCHAR)text, (PCHAR)title, sChannels);
+      WinSetWindowText(WinWindowFromID(hwnd,IDST_CONVERTCHANNELS),text);
+
+      /* Samplerate */
+      getMessage(title, IDSTR_CONVERTSAMPLERATE, sizeof(title), RESSOURCEHANDLE, hwnd);	
+      sprintf((PCHAR)text, (PCHAR)title, iSampleRate);
+      WinSetWindowText(WinWindowFromID(hwnd,IDST_CONVERTSAMPLERATE),text);
+
+      /* Playtime */
+      getMessage(title, IDSTR_CONVERTPLAYTIME, sizeof(title), RESSOURCEHANDLE, hwnd);	
+      sprintf((PCHAR)text, (PCHAR)title, lSec/60, lSec%60);
+      WinSetWindowText(WinWindowFromID(hwnd,IDST_CONVERTPLAYTIME),text);
+
+      IniRestoreWindowPos(chrIniFile, INI_AUDIOCONV_APP, INI_WINDOWPOS_KEY, hwnd);
+      IniRestoreWindowClrs(chrIniFile, INI_AUDIOCONV_APP , hwnd);
+
+      WinSetFocus(HWND_DESKTOP, hwnd);
+      return (MRESULT) TRUE;
+
+      /* WM_APPTERMINATENOTIFY messages are sent from the helper programs e.g. format checker. */
+    case WM_APPTERMINATENOTIFY:
+      switch(LONGFROMMP(mp1))
+        {
+        case MSG_CONVERTERROR:
+        case MSG_CONVERTDONE:
+          WinEnableWindow( WinWindowFromID(hwnd,IDPB_CONVERTOK), TRUE);
+          WinEnableWindow( WinWindowFromID(hwnd,IDPB_CONVERTABORT), FALSE);
+          break;
+        case  MSG_CONVERTPERCENT:
+          iPercent=LONGFROMMP(mp2);
+          if(iPercent>100)
+            iPercent=100;
+          if(iPercent<0)
+            iPercent=0;
+
+          /* Update track percent bar value. The helper prog sends us the actual decoded %. */
+          sprintf(text,"%d#%d%%", iPercent, iPercent);
+          WinSetWindowText(WinWindowFromID(hwnd,IDBAR_CONVERTPROGRESS), text);
+          break;
+        default:
+          break;
+        }
+      return FALSE;
+
+    case WM_CLOSE:
+      if(tidThread) {
+        bBreak=TRUE;
+        if(!WinStartTimer(WinQueryAnchorBlock(hwnd), hwnd, ID_TIMER, TIMER_DELAY))
+          {
+            /* Save window position */
+            IniSaveWindowPos(chrIniFile, INI_AUDIOCONV_APP, INI_WINDOWPOS_KEY, hwnd);
+            IniSaveWindowClrs(chrIniFile, INI_AUDIOCONV_APP , hwnd);
+            WinDismissDlg(hwnd,0);
+          }
+        else
+          return FALSE;
+      }
+      /* Save window position */
+      IniSaveWindowPos(chrIniFile, INI_AUDIOCONV_APP, INI_WINDOWPOS_KEY, hwnd);
+      IniSaveWindowClrs(chrIniFile, INI_AUDIOCONV_APP , hwnd);
+      WinDismissDlg(hwnd,0);
+      return FALSE;
+    case WM_CONTROL:
+      if(SHORT1FROMMP(mp1)==IDDD_IOPROC)
+        {
+         if(SHORT2FROMMP(mp1)==EN_CHANGE) {
+           SHORT sIdx;
+           sIdx=SHORT1FROMMR(WinSendMsg(HWNDFROMMP(mp2),LM_QUERYSELECTION, MPFROMLONG(LIT_FIRST),0));
+           iIoProc=iPrivIOProc[sIdx];
+
+#ifdef DEBUG
+        SysWriteToTrapLog("sIdx: %d  IO-Proc Idx: %d %s\n", sIdx, iPrivIOProc[sIdx],
+                          pMemFormatInfo[iIoProc].szDefaultFormatExt
+                          );
+#endif
+
+           createTargetName(chrSourceName, pMemFormatInfo[iIoProc].szDefaultFormatExt);
+           WinSetWindowText( WinWindowFromID(hwnd,IDEF_CONVERTTARGETNAME), chrTargetName );
+         }
+        }
+      break;
+    case WM_TIMER:
+      if(SHORT1FROMMP(mp1)==ID_TIMER)
+        {
+          if(!tidThread) {
+            /* Convert thread ended. Quit. */
+            WinStopTimer(WinQueryAnchorBlock(hwnd), hwnd, ID_TIMER);
+            WinPostMsg(hwnd, WM_CLOSE, 0, 0);
+          }
+          return MRFALSE;
+        }
+      break;
+    case WM_COMMAND:
+      switch(SHORT1FROMMP(mp1))
+        {
+        case IDPB_CONVERTBROWSE:
+          {
+            UCHAR chrTitle[200];
+            FILEDLG fd = { 0 };
+            /* User pressed the browse button */
+            fd.cbSize = sizeof( fd );
+            /* It's an centered 'Open'-dialog */
+            fd.fl = FDS_OPEN_DIALOG|FDS_CENTER;
+            /* Set the title of the file dialog */
+            fd.pszTitle = chrTitle;
+            if(!getMessage(chrTitle, IDSTR_AUDIOBROWSETITLE, sizeof(chrTitle), RESSOURCEHANDLE, hwnd))
+              fd.pszTitle = "Wave name";
+            /* Only show * files */
+            //sprintf(fd.szFullFile,"%s","*");
+            strcpy(fd.szFullFile, chrTargetName);
+            if( WinFileDlg( HWND_DESKTOP, hwnd, &fd ) == NULLHANDLE )
+              {
+                /* WinFileDlg failed */
+                break;
+              }
+            if( fd.lReturn == DID_OK )
+              {
+                WinSetWindowText( WinWindowFromID(hwnd,IDEF_CONVERTTARGETNAME), fd.szFullFile );
+              }
+            break;
+          }
+        case IDPB_CONVERTCLOSE:
+          bBreak=TRUE;
+          if(!WinStartTimer(WinQueryAnchorBlock(hwnd), hwnd, ID_TIMER, TIMER_DELAY))
+            WinPostMsg(hwnd, WM_CLOSE, 0, 0);/* Timer error so do a hard quit */
+          break;
+        case IDPB_CONVERTABORT:
+          bBreak=TRUE;
+          WinEnableWindow( WinWindowFromID(hwnd,IDPB_CONVERTABORT), FALSE);
+          break;
+        case IDPB_CONVERTOK:
+          {
+            FSALLOCATE fsAlloc;
+            ULONG lFreeSpace; 
+            ULONG ulDiskNum;
+            char cLetter;
+            ULONG cUnitAvail;
+
+            WinQueryWindowText( WinWindowFromID(hwnd,IDEF_CONVERTTARGETNAME), sizeof(chrTargetName), chrTargetName );
+
+            /* Check if diskspace is sufficient. Only for *.wav */
+            if(!stricmp(pMemFormatInfo[iIoProc].szDefaultFormatExt, "WAV")) {
+              cLetter=tolower(chrTargetName[0]);
+              ulDiskNum=cLetter-'a'+1;
+              if(DosQueryFSInfo(ulDiskNum, FSIL_ALLOC,&fsAlloc,sizeof(fsAlloc)))
+                lFreeSpace=0;
+	      else{
+		cUnitAvail=0xFFFFFFFF/(fsAlloc.cbSector*fsAlloc.cSectorUnit);
+		if(fsAlloc.cUnitAvail > cUnitAvail)
+		  lFreeSpace=0xFFFFFFFF;
+		else
+		  lFreeSpace=fsAlloc.cUnitAvail*fsAlloc.cbSector*fsAlloc.cSectorUnit;
+              }
+            }
+            else
+              lFreeSpace=lAudioSize; /* Fake sufficient space */
+
+            if(lFreeSpace<lAudioSize) {
+              /*
+                Text:
+                Title:
+                */
+              getMessage(title, IDSTR_CONVERTNOSPACETEXT,sizeof(title), RESSOURCEHANDLE, hwnd);
+              sprintf(text,title,lAudioSize/1000000 );
+              getMessage(title, IDSTR_CONVERTNOSPACETITLE,sizeof(title), RESSOURCEHANDLE, hwnd);
+              WinMessageBox( HWND_DESKTOP, hwnd, text,
+                             title,
+                             1234UL, MB_OK | MB_ICONEXCLAMATION|MB_MOVEABLE );
+            }
+            else {
+              /* Start decoding an audio file */
+              WinEnableWindow( WinWindowFromID(hwnd,IDPB_CONVERTOK), FALSE);
+              WinEnableWindow( WinWindowFromID(hwnd,IDPB_CONVERTABORT), TRUE);
+              convertAudioFile(hwnd);
+            }
+
+            break;
+          }
+        default:
+          break;
+        }
+      return (MRESULT) FALSE;
+    default:
+      break;
+    }/* switch */
+
+  return WinDefDlgProc( hwnd, msg, mp1, mp2);
+}
+
+
+int main (int argc, char *argv[])
+{
+  HAB  hab;
+  HMQ  hmq;
+  char text[CCHMAXPATH];
+  char title[CCHMAXPATH];
+  short a;
+
+  /* Create a copy of the args */
+  /* argv[0]: progname
+   * argv[1]: wavefile
+   * argv[2]: IO proc name
+   */
+
+
+  numArgs=argc;
+
+  for(a=0;a<argc;a++)
+    {
+      params[a]=argv[a];
+    }
+
+
+  hab=WinInitialize(0);
+  if(hab) {
+    hmq=WinCreateMsgQueue(hab,0);
+    if(hmq) {
+      /* Check if user started prog by hand */
+      if(argc<NUMPARAMS-1) {/* Not the actual num of params */
+        pmUsage();
+      }
+      else {
+        /* Save source name */
+        strcpy(chrSourceName,params[1]);
+        if(argc==NUMPARAMS)
+          strcpy(chrProcName,params[2]);
+        else {
+          bNoProcGiven=TRUE;
+          strcpy(chrProcName, "");
+        }
+        /* Get our ressource dll */
+        //   RESSOURCEHANDLE=0;
+        RESSOURCEHANDLE=queryResModuleHandle(argv[0]);
+        HlpBuildMMProgIniFileName(argv[0], chrIniFile, sizeof(chrIniFile));
+        /* Register the percent bar window class */
+        percentRegisterBarClass();
+        /* Get audio file characteristics */
+        if(queryAudioInfo(chrSourceName)) {
+          if( WinDlgBox( HWND_DESKTOP, NULLHANDLE, decodeStatusDialogProc, RESSOURCEHANDLE, IDDLG_CONVERT, 0) == DID_ERROR )
+            {
+              /*
+                Text:
+                Title:  "Installation problem"
+                */
+              messageBox( text, IDSTR_CONVERTDIALOGERROR , sizeof(text),
+                          title, IDSTR_INSTALLERRORTITLE , sizeof(title),
+                          RESSOURCEHANDLE, HWND_DESKTOP, MB_OK | MB_ICONEXCLAMATION | MB_MOVEABLE);
+              freeResHandle();
+              WinDestroyMsgQueue( hmq );
+              WinTerminate( hab );
+              DosBeep(100,600);
+              return( 1 );
+            }
+        }
+      }
+      freeResHandle();
+      WinDestroyMsgQueue(hmq);
+    }
+    WinTerminate(hab);
+  }
+  return 0;
+}
Index: /tags/CWMM-0.3.0_GA/classes/mm-progs/audioconverter/def.tpl
===================================================================
--- /tags/CWMM-0.3.0_GA/classes/mm-progs/audioconverter/def.tpl	(revision 213)
+++ /tags/CWMM-0.3.0_GA/classes/mm-progs/audioconverter/def.tpl	(revision 213)
@@ -0,0 +1,22 @@
+# Note: lines starting with '#' are comments.
+
+[DESCRIPTION]
+PM Audio file converter
+
+[COPYRIGHT]
+(c) C. Wohlgemuth 2001-2005 Netlabs CWMM Team 2023
+
+[AUTHOR]
+Netlabs CWMM Team
+
+[NAME]
+# This is the NAME xxx WINDOWAPI|etc line in the def file.
+# Important: it specifies the internal name of the program. Don't leave out!
+NAME AUDCONV WINDOWAPI
+
+[BUILDMACHINE]
+Zobopeep
+
+[OTHER]
+# Add all the lines here you want to have at the end of the generated DEF file
+STACKSIZE    1638400
Index: /tags/CWMM-0.3.0_GA/classes/mm-progs/audioconverter/makefile
===================================================================
--- /tags/CWMM-0.3.0_GA/classes/mm-progs/audioconverter/makefile	(revision 213)
+++ /tags/CWMM-0.3.0_GA/classes/mm-progs/audioconverter/makefile	(revision 213)
@@ -0,0 +1,42 @@
+# Makefile
+
+include ../../../make.inc
+
+OBJECTS	=	$(LIBDIR)/message.obj \
+		$(LIBDIR)/helper.obj \
+		$(LIBDIR)/progbars.obj \
+		$(LIBDIR)/sys_funcs.obj
+		
+PMPRINTF = 0
+ifdef PMPRINTF
+LIBS           = mmpm2.lib u:/pmprintf/pmprintf.lib
+else
+LIBS           = mmpm2.lib
+endif		
+
+include ../mmprog.inc
+
+
+all:	audconv.exe
+
+
+audconv.exe:	audconv.c $(OBJECTS) makefile def.tpl
+	cmd /C $(TOOLDIR)/create_def.cmd audconv.def
+	$(CC) $(CPPFLAGS) -I$(INC) audconv.c $(OBJECTS) $(LIBS) audconv.def
+
+
+clean:
+	-rm *.exe
+	-rm *.dll
+	-rm *.obj
+	-rm *.RES
+	-rm *.ini
+	-rm *.def
+
+cleaner:
+	-rm *.*~
+	-rm *.flc
+
+
+distribution:
+	-cp *.exe ../../dist/bin
Index: /tags/CWMM-0.3.0_GA/classes/mm-progs/imageconverter/def.tpl
===================================================================
--- /tags/CWMM-0.3.0_GA/classes/mm-progs/imageconverter/def.tpl	(revision 213)
+++ /tags/CWMM-0.3.0_GA/classes/mm-progs/imageconverter/def.tpl	(revision 213)
@@ -0,0 +1,22 @@
+# Note: lines starting with '#' are comments.
+
+[DESCRIPTION]
+PM image file converter
+
+[COPYRIGHT]
+(c) C. Wohlgemuth 2002-2005 Netlabs CWMM Team 2023
+
+[AUTHOR]
+Netlabs CWMM Team
+
+[NAME]
+# This is the NAME xxx WINDOWAPI|etc line in the def file.
+# Important: it specifies the internal name of the program. Don't leave out!
+NAME IMGCONV WINDOWAPI
+
+[BUILDMACHINE]
+Zobopeep
+
+[OTHER]
+# Add all the lines here you want to have at the end of the generated DEF file
+STACKSIZE    1638400
Index: /tags/CWMM-0.3.0_GA/classes/mm-progs/imageconverter/imgconv.c
===================================================================
--- /tags/CWMM-0.3.0_GA/classes/mm-progs/imageconverter/imgconv.c	(revision 213)
+++ /tags/CWMM-0.3.0_GA/classes/mm-progs/imageconverter/imgconv.c	(revision 213)
@@ -0,0 +1,1336 @@
+/*
+ * imgconv.c (C) Chris Wohlgemuth 2002-2003
+ *
+ * This helper converts image files. It is called by the image classes
+ * when the 'convert' menu is chosen.
+ */
+/*
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; see the file COPYING.  If not, write to
+ * the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+/*
+ * If you need another license for your project/product (commercial,
+ * noncommercial, whatever) contact me at
+ *
+ * http://www.os2world.com/cdwriting
+ * http://www.geocities.com/SiliconValley/Sector/5785/
+ *
+ */
+#define INCL_DOS
+#define INCL_DOSFILEMGR
+#define INCL_DOSERRORS
+#define INCL_WIN
+#define INCL_OS2MM
+#define INCL_MMIOOS2
+#define INCL_GPI
+#define INCL_PM
+
+#define USE_OS2_TOOLKIT_HEADERS
+#include <os2.h>
+
+#include <sys\types.h>
+#include <sys\stat.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include "os2me.h"
+#include "mmioos2.h"
+#include <mmio.h>
+#include "common.h"
+#include "mmres.h"
+#include "mmprogs_defaults.h"
+
+#include "sys_funcs.h"
+
+#ifndef MMIOM_QUERYIMAGE
+   #define MMIOM_QUERYIMAGE         MMIOM_START + 39
+   #define MMIOM_QUERYIMAGECOUNT    MMIOM_START + 40
+   #define MMIOM_SETIMAGE           MMIOM_START + 41
+#endif
+
+#define MSG_CONVERTDONE    1L
+#define MSG_CONVERTPERCENT 2L
+#define MSG_CONVERTERROR   3L
+
+#define ID_TIMER 1
+#define TIMER_DELAY        200
+
+#define CONVERTBUFFERSIZE  500000
+#define NUMPARAMS  3
+
+/* argv[0]: progname
+ * argv[1]: imgfile
+ * argv[2]: IO proc name
+ */
+
+//#define DEBUG
+
+void HlpSendCommandToObject(char* chrObject, char* command);
+BOOL percentRegisterBarClass(void);
+BOOL IniSaveWindowPos(char * iniFile, char* chrApp, char *chrKey, HWND hwnd);
+BOOL IniRestoreWindowPos(char * iniFile, char* chrApp, char *chrKey, HWND hwnd);
+BOOL IniSaveWindowClrs(char * chrIniFile, char* chrApp , HWND hwnd);
+BOOL IniRestoreWindowClrs(char * chrIniFile, char* chrApp , HWND hwnd);
+BOOL HlpBuildMMProgIniFileName(char* chrProgname, char * chrBuffer, ULONG ulBufferSize);
+HMODULE queryResModuleHandle(char *chrExePath);
+void freeResHandle(void);
+BOOL getMessage(char* text,ULONG ulID, LONG lSizeText, HMODULE hResource,HWND hwnd);
+ULONG messageBox( char* text, ULONG ulTextID , LONG lSizeText,
+                  char* title, ULONG ulTitleID, LONG lSizeTitle,
+                  HMODULE hResource, HWND hwnd, ULONG ulFlags);
+
+char logName[]="convert.log";
+
+extern SWP swpWindow;
+BOOL bHaveWindowPos=FALSE;
+
+char chrTargetName[CCHMAXPATH]={0};
+char chrSourceName[CCHMAXPATH]={0};
+char chrProcName[CCHMAXPATH]={0};
+char chrIniFile[CCHMAXPATH];
+
+int numArgs;
+char* params[NUMPARAMS];
+
+#define NUMIOPROCS 1000
+int iIoProc;                  /* Position of IO-Proc in global data area of MMOS2. 0 based */
+int iPrivIOProc[NUMIOPROCS]; /* Number of possible IO-Procs. I'm lazy here and use a static array.
+                                If there ever will be more than 1000 procs there'll be a problem... */
+
+
+TID tidThread=0;
+BOOL bBreak=FALSE;
+PMMFORMATINFO pMemFormatInfo=NULLHANDLE;
+HMODULE RESSOURCEHANDLE=0;
+BOOL bNoProcGiven=FALSE;
+HAB globalHab;
+/* BMP info for preview */
+BITMAPINFOHEADER2 bmpInfoHeader2;
+HBITMAP hBitmap;
+
+void pmUsage(void);
+
+//#define DEBUG
+
+#ifdef DEBUG
+void HlpWriteToTrapLog(const char* chrFormat, ...);
+#endif
+
+/*
+  Load an image file using IO-Procs
+  */
+HBITMAP loadBitmap ( PSZ pszFileName, PBITMAPINFOHEADER2 pBMPInfoHeader2)
+{
+    HBITMAP       hbm;
+    MMIOINFO      mmioinfo;
+        MMFORMATINFO  mmFormatInfo;
+    HMMIO         hmmio;
+        ULONG         ulImageHeaderLength;
+        MMIMAGEHEADER mmImgHdr;
+    ULONG         ulBytesRead;
+    ULONG         dwNumRowBytes;
+    PBYTE         pRowBuffer;
+    ULONG         dwRowCount;
+    SIZEL         ImageSize;
+    ULONG         dwHeight, dwWidth;
+    FOURCC        fccStorageSystem;
+    ULONG         dwPadBytes;
+    ULONG         dwRowBits;
+    ULONG         ulReturnCode;
+    FOURCC        fccIOProc;
+    HDC           hdc;
+    HPS           hps;
+
+
+    ulReturnCode = mmioIdentifyFile ( pszFileName,
+                                      0L,
+                                      &mmFormatInfo,
+                                      &fccStorageSystem,
+                                      0L,
+                                      0L);
+    /*
+     *  If this file was NOT identified, then this function won't
+     *  work, so return an error by indicating an empty bitmap.
+     */
+    if ( ulReturnCode == MMIO_ERROR )
+    {
+      //      showMsgBox(IDSTR_CWIMAGETITLE, IDSTR_NOIMGIOPROCERROR, queryModuleHandle());
+      return (0L);
+    }
+
+    /*
+     *  If mmioIdentifyFile did not find a custom-written IO proc which
+     *  can understand the image file, then it will return the DOS IO Proc
+     *  info because the image file IS a DOS file.
+     */
+    if( mmFormatInfo.fccIOProc == FOURCC_DOS )
+    {
+      //      showMsgBox(IDSTR_CWIMAGETITLE, IDSTR_NOIMGIOPROCERROR, queryModuleHandle());
+      return ( 0L );
+    }
+    /*
+     *  Ensure this is an IMAGE IOproc, and that it can read
+     *  translated data
+     */
+    if ( (mmFormatInfo.ulMediaType != MMIO_MEDIATYPE_IMAGE) ||
+         ((mmFormatInfo.ulFlags & MMIO_CANREADTRANSLATED) == 0) )
+    {
+      //      showMsgBox(IDSTR_CWIMAGETITLE, IDSTR_NOIMGIOPROCERROR, queryModuleHandle());
+      return (0L);
+    }
+    else
+    {
+         fccIOProc = mmFormatInfo.fccIOProc;
+    }
+
+    /* Clear out and initialize mminfo structure */
+    memset ( &mmioinfo, 0L, sizeof ( MMIOINFO ) );
+    mmioinfo.fccIOProc = fccIOProc;
+    mmioinfo.ulTranslate = MMIO_TRANSLATEHEADER | MMIO_TRANSLATEDATA;
+    hmmio = mmioOpen ( (PSZ) pszFileName,
+                       &mmioinfo,
+                       MMIO_READ | MMIO_DENYWRITE | MMIO_NOIDENTIFY );
+    if ( ! hmmio )
+    {
+      // If file could not be opened, return with error
+      //    showMsgBox(IDSTR_CWIMAGETITLE, IDSTR_OPENFILEERROR, queryModuleHandle());
+      return (0L);
+    }
+
+
+    ulReturnCode = mmioQueryHeaderLength ( hmmio,
+                                         (PLONG)&ulImageHeaderLength,
+                                           0L,
+                                           0L);
+    if ( ulImageHeaderLength != sizeof ( MMIMAGEHEADER ) )
+    {
+      /* We have a problem.....possibly incompatible versions */
+      ulReturnCode = mmioClose (hmmio, 0L);
+      //      showMsgBox(IDSTR_CWIMAGETITLE, IDSTR_NOIMGIOPROCERROR);
+      return (0L);
+    }
+
+    ulReturnCode = mmioGetHeader ( hmmio,
+                                   &mmImgHdr,
+                                   (LONG) sizeof ( MMIMAGEHEADER ),
+                                   (PLONG)&ulBytesRead,
+                                   0L,
+                                   0L);
+
+    if ( ulReturnCode != MMIO_SUCCESS )
+    {
+      /* Header unavailable */
+      ulReturnCode = mmioClose (hmmio, 0L);
+      return (0L);
+    }
+
+    /*!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!*/
+    *pBMPInfoHeader2=mmImgHdr.mmXDIBHeader.BMPInfoHeader2;
+
+    /*
+     *  Determine the number of bytes required, per row.
+     *      PLANES MUST ALWAYS BE = 1
+     */
+    dwHeight = mmImgHdr.mmXDIBHeader.BMPInfoHeader2.cy;
+    dwWidth = mmImgHdr.mmXDIBHeader.BMPInfoHeader2.cx;
+    dwRowBits = dwWidth * mmImgHdr.mmXDIBHeader.BMPInfoHeader2.cBitCount;
+    dwNumRowBytes = dwRowBits >> 3;
+
+    /*
+     *  Account for odd bits used in 1bpp or 4bpp images that are
+     *  NOT on byte boundaries.
+     */
+    if ( dwRowBits % 8 )
+    {
+         dwNumRowBytes++;
+    }
+    /*
+     *  Ensure the row length in bytes accounts for byte padding.
+     *  All bitmap data rows must are aligned on LONG/4-BYTE boundaries.
+     *  The data FROM an IOProc should always appear in this form.
+     */
+    dwPadBytes = ( dwNumRowBytes % 4 );
+    if ( dwPadBytes )
+    {
+         dwNumRowBytes += 4 - dwPadBytes;
+    }
+
+    /* Allocate space for ONE row of pels */
+    if ( DosAllocMem( (PPVOID)&pRowBuffer,
+                      (ULONG)dwNumRowBytes,
+                      fALLOC))
+    {
+      ulReturnCode = mmioClose (hmmio, 0L);
+      //    showMsgBox(IDSTR_CWIMAGETITLE, IDSTR_NOMEMERROR, queryModuleHandle());
+      return(0L);
+    }
+
+    /* Create a device context */
+    hdc=DevOpenDC(globalHab, OD_MEMORY,"*",0L, NULL, NULLHANDLE);
+    if(hdc==NULLHANDLE)
+      {
+        DosFreeMem(pRowBuffer);
+        mmioClose (hmmio, 0L);
+        return(0L);
+      }
+
+
+    // ***************************************************
+    // Create a memory presentation space that includes
+    // the memory device context obtained above.
+    // ***************************************************
+
+    ImageSize.cx = dwWidth;
+    ImageSize.cy = dwHeight;
+
+    hps = GpiCreatePS ( globalHab,
+                        hdc,
+                        &ImageSize,
+                        PU_PELS | GPIT_NORMAL | GPIA_ASSOC );
+    //                        PU_PELS | GPIF_DEFAULT | GPIT_MICRO | GPIA_ASSOC );
+    if ( !hps )
+      {
+#ifdef DEBUG
+        WinMessageBox( HWND_DESKTOP, HWND_DESKTOP,
+                       "No HPS...",
+                       "Open Image File",
+                       (HMODULE) NULL,
+                       (ULONG) MB_OK | MB_MOVEABLE |
+                       MB_ERROR );
+#endif
+        DevCloseDC(hdc);
+        DosFreeMem(pRowBuffer);
+        mmioClose (hmmio, 0L);
+        return(0L);
+      }
+
+    //    GpiSelectPalette(hps, NULLHANDLE);
+    // ***************************************************
+    // Create an uninitialized bitmap.  This is where we
+    // will put all of the bits once we read them in.
+    // ***************************************************
+    hbm = GpiCreateBitmap ( hps,
+                            pBMPInfoHeader2,
+                            0L,
+                            NULL,
+                            NULL);
+
+    if ( !hbm )
+    {
+#ifdef DEBUG
+      WinMessageBox( HWND_DESKTOP, HWND_DESKTOP,
+                     "No HBITMAP...",
+                     "Open Image File",
+                     (HMODULE) NULL,
+                     (ULONG) MB_OK | MB_MOVEABLE |
+                     MB_ERROR );
+#endif
+      GpiDestroyPS(hps);
+      DevCloseDC(hdc);
+      DosFreeMem(pRowBuffer);
+      ulReturnCode = mmioClose (hmmio, 0L);
+      return(0L);
+    }
+
+    // ***************************************************
+    // Select the bitmap into the memory device context.
+    // ***************************************************
+    ulReturnCode = GpiSetBitmap ( hps,
+                                  hbm );
+
+    //***************************************************************
+    //  LOAD THE BITMAP DATA FROM THE FILE
+    //      One line at a time, starting from the BOTTOM
+    //*************************************************************** */
+
+    for ( dwRowCount = 0; dwRowCount < dwHeight; dwRowCount++ )
+    {
+         ulBytesRead = (ULONG) mmioRead ( hmmio,
+                                          pRowBuffer,
+                                          dwNumRowBytes );
+         if ( !ulBytesRead )
+         {
+              break;
+         }
+         /*
+          *  Allow context switching while previewing.. Couldn't get
+          *  it to work. Perhaps will get to it when time is available...
+          */
+         ulReturnCode = GpiSetBitmapBits ( hps,
+                                          (LONG) dwRowCount,
+                                          (LONG) 1,
+                                          (PBYTE) pRowBuffer,
+                                          (PBITMAPINFO2) pBMPInfoHeader2);
+    }
+
+    /* Clean up */
+    ulReturnCode = GpiSetBitmap ( hps,
+                                  NULLHANDLE );
+    ulReturnCode = mmioClose (hmmio, 0L);
+    DosFreeMem(pRowBuffer);
+    GpiDestroyPS(hps);
+    DevCloseDC(hdc);
+
+    return(hbm);
+}
+
+
+/*
+  Create a BMP of another size from an already loaded BMP.
+*/
+HBITMAP createNewBitmap ( HBITMAP hbm,
+                          PBITMAPINFOHEADER2 pBmpInfoHeader2,
+                          HWND hwnd)
+                          //                          ULONG ulWidth,
+                          //     ULONG ulHeight)
+{
+  HBITMAP       hbmTarget;
+  SIZEL         ImageSize;
+  HDC           hdc;
+  HPS           hps;
+  BITMAPINFOHEADER2 bmpih2;
+  POINTL aptl[4];
+  ULONG ulWidth, ulHeight;
+  SWP swp;
+
+  /*
+   *  Get position of image frame
+   */
+  WinQueryWindowPos ( hwnd, &swp);
+
+  /* Image size */
+
+  ulHeight = bmpInfoHeader2.cy;
+  ulWidth = bmpInfoHeader2.cx;
+
+  if(ulWidth <=swp.cx && ulHeight <= swp.cy)
+    {
+      aptl[0].x=0;
+      aptl[1].x=aptl[0].x+ulWidth;
+
+      aptl[0].y=0;
+      aptl[1].y=aptl[0].y+ulHeight;
+    }
+  else {
+    float fWidth, fHeight, fRes;
+
+    fWidth=(float)swp.cx/(float)ulWidth;
+    fHeight=(float)swp.cy/(float)ulHeight;
+    fRes=( fWidth>fHeight ? fHeight : fWidth);
+
+
+    aptl[0].x=0;
+    aptl[1].x=aptl[0].x+ulWidth*fRes;
+
+      aptl[0].y=0;
+      aptl[1].y=aptl[0].y+ulHeight*fRes;
+    }
+
+    aptl[2].x = 0;              // source lower left
+    aptl[2].y = 0;
+
+    aptl[3].x = ulWidth;   // source upper right
+    aptl[3].y = ulHeight;
+
+#if 0
+    sprintf(text, "BMP: %d %d, Window: %d %d , new: %d %d", ulWidth, ulHeight, swp.cx, swp.cy,
+            aptl[1].x-aptl[0].x, aptl[1].y-aptl[0].y);
+        WinMessageBox( HWND_DESKTOP, HWND_DESKTOP,
+                       text,
+                       "Create new bitmap",
+                       (HMODULE) NULL,
+                       (ULONG) MB_OK | MB_MOVEABLE |
+                       MB_ERROR );
+#endif
+
+    if(!ulWidth || !ulHeight)
+      return 0L;
+
+    /* Create a device context */
+    hdc=DevOpenDC(globalHab, OD_MEMORY,"*",0L, NULL, NULLHANDLE);
+    if(hdc==NULLHANDLE)
+      {
+        return(0L);
+      }
+
+    // ***************************************************
+    // Create a memory presentation space that includes
+    // the memory device context obtained above.
+    // ***************************************************
+    ImageSize.cx = ulWidth;
+    ImageSize.cy = ulHeight;
+    hps = GpiCreatePS ( globalHab,
+                        hdc,
+                        &ImageSize,
+                        PU_PELS | GPIT_NORMAL | GPIA_ASSOC );
+    if ( !hps )
+      {
+        DevCloseDC(hdc);
+        return(0L);
+      }
+
+    /* Now scale the bitmap */
+    memcpy(&bmpih2, pBmpInfoHeader2, sizeof(BITMAPINFOHEADER2));
+
+    bmpih2.cx=aptl[1].x-aptl[0].x;
+    bmpih2.cy=aptl[1].y-aptl[0].y;
+
+    bmpih2.cbImage=(((ulWidth*(1<<bmpih2.cPlanes)*(1<<bmpih2.cBitCount))+31) /32)*ulHeight;
+    // ***************************************************
+    // Create an uninitialized bitmap.  This is where we
+    // ***************************************************
+
+    hbmTarget = GpiCreateBitmap ( hps,
+                                  &bmpih2,
+                                  0L,
+                                  NULL,
+                                  NULL);
+    if ( !hbmTarget )
+      {
+      GpiDestroyPS(hps);
+      DevCloseDC(hdc);
+      return(0L);
+    }
+
+    /* Blit it */
+    GpiSetBitmap ( hps, hbmTarget );
+
+    GpiWCBitBlt(hps, hbm,4L, aptl, ROP_SRCCOPY, BBO_IGNORE);
+
+    GpiSetBitmap( hps, NULLHANDLE );
+    GpiDestroyPS(hps);
+    DevCloseDC(hdc);
+    pBmpInfoHeader2->cbFix=sizeof(BITMAPINFOHEADER2);
+    GpiQueryBitmapInfoHeader(hbmTarget, pBmpInfoHeader2);
+
+#if 0
+    sprintf(text, "BMP: %d %d, Window: %d %d , new: %d %d", ulWidth, ulHeight, swp.cx, swp.cy,
+            pBmpInfoHeader2->cx, pBmpInfoHeader2->cy);
+        WinMessageBox( HWND_DESKTOP, HWND_DESKTOP,
+                       text,
+                       "Create new bitmap",
+                       (HMODULE) NULL,
+                       (ULONG) MB_OK | MB_MOVEABLE |
+                       MB_ERROR );
+#endif
+    return(hbmTarget);
+}
+
+
+
+BOOL createTargetName(char *sourceName, char *chrExt)
+{
+  char *textPtr;
+
+  strcpy(chrTargetName, sourceName);
+  if((textPtr=strrchr(chrTargetName, '.'))!=NULLHANDLE)
+    *textPtr=0;
+  else
+    textPtr=chrTargetName;
+  strcat(textPtr,".");
+  strcat(textPtr, chrExt);
+
+  return TRUE;
+}
+
+
+BOOL insertIOProcItems( HWND hwndDrop )
+{
+  //    CHAR          szBuffer[ sizeof( FOURCC ) + CCHMAXPATH + 4 ];
+    MMFORMATINFO  mmFormatInfo;
+    PMMFORMATINFO pmmFormatInfoArray;
+    ULONG         ulReturnCode;
+    LONG          lFormatsRead;
+    LONG          index;
+    LONG          lBytesRead;
+    LONG lNumIOProcs;
+    int sIdx;
+    memset( &mmFormatInfo,
+            '\0',
+            sizeof(MMFORMATINFO) );
+
+    mmFormatInfo.ulMediaType |= MMIO_MEDIATYPE_IMAGE;
+    mmFormatInfo.ulFlags|=MMIO_CANWRITETRANSLATED;
+    ulReturnCode = mmioQueryFormatCount ( &mmFormatInfo,
+                                          &lNumIOProcs,
+                                          0,
+                                          0 );
+
+    if( ulReturnCode != MMIO_SUCCESS )
+      {
+        /*
+         * Error - mmioQueryFormatCount failed.
+         */
+        return FALSE;
+      }
+
+    /*
+     * Allocate enough memory for n number of FormatInfo blocks
+     */
+    pmmFormatInfoArray = (PMMFORMATINFO) malloc (lNumIOProcs * sizeof( MMFORMATINFO ) );
+    pMemFormatInfo=pmmFormatInfoArray;
+    if( pmmFormatInfoArray == NULL )
+      {
+        /*
+         * Could not allocate enough memory for mmFormatInfo array.
+         */
+        return FALSE;
+      }
+
+    /*
+     * call mmioGetFormats to get info on the formats supported.
+     */
+    ulReturnCode = mmioGetFormats( &mmFormatInfo,
+                                   lNumIOProcs,
+                                   pmmFormatInfoArray,
+                                   &lFormatsRead,
+                                   0,
+                                   0 );
+    if( ulReturnCode != MMIO_SUCCESS )
+      {
+        /*
+         *  mmioGetFormats failed.
+         */
+        free(pmmFormatInfoArray);
+        return FALSE;
+      }
+
+    if( lFormatsRead != lNumIOProcs )
+      {
+        /*
+         * Error in MMIO - number of formats read in by
+         * mmioGetFormats is not equal to number of formats
+         * found by mmioQueryFormatCount.
+         */
+        free(pmmFormatInfoArray);
+        return FALSE;
+      }
+
+
+    for ( index = 0, sIdx=0; index <lNumIOProcs; index++ )
+      {
+        char szName[CCHMAXPATH];
+
+        mmioGetFormatName(pmmFormatInfoArray, szName, &lBytesRead, 0L, 0L);
+        /* Insert NULL string terminator */
+        *( szName + lBytesRead ) = 0;
+
+
+        /* Compressed TIF is not supported because the Warp 4 IO-Procs are
+           broken. */
+        if(pmmFormatInfoArray->fccIOProc!=mmioStringToFOURCC("TFMC",MMIO_TOUPPER) &&
+           pmmFormatInfoArray->fccIOProc!=mmioStringToFOURCC("TFIC",MMIO_TOUPPER) &&
+           (pmmFormatInfoArray->ulFlags & MMIO_CANWRITETRANSLATED))
+          {
+            /* Insert into list box */
+            WinSendMsg(hwndDrop, LM_INSERTITEM,(MPARAM)LIT_END,
+                       (MPARAM)szName);
+
+#ifdef DEBUG
+        HlpWriteToTrapLog("------ %d private idx: %d, IO-Proc: %s %s\n", index, sIdx,
+                          pmmFormatInfoArray->szDefaultFormatExt,
+                          szName);
+#endif
+
+            iPrivIOProc[sIdx]=index;
+
+            /* Set text field */
+            if(bNoProcGiven) {
+              WinSetWindowText(hwndDrop, szName);
+              createTargetName(chrSourceName, pmmFormatInfoArray->szDefaultFormatExt);
+              iIoProc=iPrivIOProc[sIdx];
+              bNoProcGiven=FALSE;
+            }
+            else {
+              if(!stricmp(szName, chrProcName)) {
+                WinSetWindowText(hwndDrop, szName);
+                /* Create target name */
+                createTargetName(chrSourceName, pmmFormatInfoArray->szDefaultFormatExt);
+                iIoProc=iPrivIOProc[sIdx];
+              }
+            }
+            sIdx++;
+          }
+        /*
+         *  advance to next entry in mmFormatInfo array
+         */
+        pmmFormatInfoArray++;
+      }
+    return TRUE;
+}
+
+BOOL DoConvert(HWND hwnd,
+               PSZ    pszSource,          // Source file name
+               PSZ    pszTarget,
+               FOURCC fccTargetIOProc)    //
+{
+  MMIOINFO      mmioinfoSource;
+  MMIOINFO      mmioinfoTarget;
+  HMMIO         hmmioSource;
+  HMMIO         hmmioTarget;
+  ULONG         ulImageHeaderLength;
+  MMIMAGEHEADER mmImgHdr;
+  ULONG         ulBytesRead;
+  ULONG         dwNumRowBytes;
+  PBYTE         pRowBuffer;
+  ULONG         dwRowCount;
+  ULONG         dwWidth;
+  ULONG         dwHeight;
+  ULONG         dwPadBytes;
+  ULONG         dwRowBits;
+  LONG          rc;
+  LONG          rcSrcQueryCount = 0;
+  LONG          rcTrgQueryCount = 0;
+  LONG          rcTrgSetImage   = 0;
+  ULONG         iIndex, iCount, iCount2;
+
+  MMFORMATINFO  mmFormatInfo;
+  FOURCC fccSourceIOProc;
+  FOURCC        fccStorageSystem;
+
+  rc = mmioIdentifyFile ( pszSource,
+                          0L,
+                          &mmFormatInfo,
+                          &fccStorageSystem,
+                          0L,
+                          0L);
+
+    /*
+     *  If this file was NOT identified, then this function won't
+     *  work, so return an error by indicating an empty bitmap.
+     */
+
+    if ( rc == MMIO_ERROR )
+    {
+         return (0L);
+    }
+    fccSourceIOProc=mmFormatInfo.fccIOProc;
+
+  /*******************************/
+  /* Set up/open the SOURCE file */
+  /*******************************/
+  memset (&mmioinfoSource, 0L, sizeof (MMIOINFO));
+  mmioinfoSource.fccIOProc = fccSourceIOProc;
+  mmioinfoSource.ulTranslate = MMIO_TRANSLATEHEADER | MMIO_TRANSLATEDATA;
+
+  hmmioSource = mmioOpen ((PSZ)pszSource, &mmioinfoSource,
+                          MMIO_READ | MMIO_DENYWRITE
+                          | MMIO_NOIDENTIFY);
+
+  if (!hmmioSource)
+    return (FALSE);
+
+  /*******************************/
+  /* Set up/open the TARGET file */
+  /*******************************/
+
+  memset (&mmioinfoTarget, 0L, sizeof (MMIOINFO));
+  mmioinfoTarget.fccIOProc = fccTargetIOProc;
+  mmioinfoTarget.ulTranslate = MMIO_TRANSLATEHEADER | MMIO_TRANSLATEDATA;
+
+  hmmioTarget = mmioOpen ((PSZ)pszTarget,
+                          &mmioinfoTarget,
+                          MMIO_CREATE | MMIO_WRITE |
+                          MMIO_DENYWRITE | MMIO_NOIDENTIFY);
+
+  if (!hmmioTarget)
+    {
+      mmioClose (hmmioSource, 0L);
+      return (FALSE);
+    }
+
+#ifdef DEBUG
+        HlpWriteToTrapLog("Target opened.\n");
+#endif
+
+  // find out if source has multiple image support
+  rcSrcQueryCount = mmioSendMessage(hmmioSource, MMIOM_QUERYIMAGECOUNT, (LONG)&iCount, (LONG)0);
+  if (rcSrcQueryCount) iCount = 1;
+
+  // find out if the target has multiple image support
+  rcTrgQueryCount = mmioSendMessage(hmmioTarget, MMIOM_QUERYIMAGECOUNT, (LONG)&iCount2, (LONG)0);
+
+  for (iIndex=0; iIndex<iCount; iIndex++) { /* loop through known images */
+
+    if (!rcSrcQueryCount && !rcTrgQueryCount) {  /* if Both support images */
+
+      /* Determine if the target can write arrays, and if not */
+      /* then write the the default image from the source     */
+
+      if (rcTrgSetImage && iIndex > 0) break;  /* Target Can't Write array */
+
+      /* Now, determine if the target can write arrays */
+      rcTrgSetImage = mmioSendMessage (hmmioTarget, MMIOM_SETIMAGE, (LONG)iIndex, (LONG)0);
+
+      if (!rcTrgSetImage) mmioSendMessage (hmmioSource, MMIOM_SETIMAGE, (LONG)iIndex, (LONG)0);
+
+    } else if (!rcSrcQueryCount) {      /* Source does but target doesn't */
+      /* Use the default image from source to copy to target */
+      /* so do set the index of the first, let it default    */
+      /* get the base photo cd image (2 of 5)                */
+      if (iIndex > 0) break;
+    } else if (!rcTrgQueryCount) {      /* Target does but source doesn't */
+      /* Use the only image to do a default write to target */
+    } else {
+      /* neither do: just write one image from here to there */
+    }
+
+    /****************************/
+    /* Obtain the SOURCE HEADER */
+    /****************************/
+    mmioQueryHeaderLength (hmmioSource, (PLONG)&ulImageHeaderLength, 0L, 0L);
+    if (ulImageHeaderLength != sizeof (MMIMAGEHEADER))
+      /* We have a problem.....possibly incompatible versions */
+      {
+        mmioClose (hmmioSource, 0L);
+        mmioClose (hmmioTarget, 0L);
+        return (FALSE);
+      }
+
+    rc = (LONG)mmioGetHeader (hmmioSource, &mmImgHdr,
+                              (LONG)sizeof (MMIMAGEHEADER), (PLONG)&ulBytesRead,
+                              0L, 0L);
+
+    if (rc != MMIO_SUCCESS)
+      /* Header unavailable */
+      {
+        mmioClose (hmmioSource, 0L);
+        mmioClose (hmmioTarget, 0L);
+        return (FALSE);
+      }
+
+
+    /*************************/
+    /* Set the TARGET HEADER */
+    /*************************/
+    mmioQueryHeaderLength (hmmioTarget, (PLONG)&ulImageHeaderLength, 0L, 0L);
+    if (ulImageHeaderLength != sizeof (MMIMAGEHEADER))
+      {
+        /* We have a problem.....possibly incompatible versions */
+        mmioClose (hmmioSource, 0L);
+        mmioClose (hmmioTarget, 0L);
+        return (FALSE);
+      }
+
+
+    /* Use the SAME data as came from the SOURCE FILE.  It must be
+       compatible with the OS/2 bitmaps, etc.   */
+    rc = (LONG)mmioSetHeader (hmmioTarget, &mmImgHdr,
+                              (LONG)sizeof (MMIMAGEHEADER), (PLONG)&ulBytesRead,
+                              0L, 0L);
+
+    if (rc != MMIO_SUCCESS)
+      /* Header unavailable */
+      {
+        mmioClose (hmmioSource, 0L);
+        mmioClose (hmmioTarget, 0L);
+        return (FALSE);
+      }
+
+#ifdef DEBUG
+        HlpWriteToTrapLog("Target header set.\n");
+#endif
+
+    /* Determine the number of bytes required, per row */
+    /*      PLANES MUST ALWAYS BE = 1 */
+    dwHeight = mmImgHdr.mmXDIBHeader.BMPInfoHeader2.cy;
+    dwWidth  = mmImgHdr.mmXDIBHeader.BMPInfoHeader2.cx;
+    dwRowBits = dwWidth * mmImgHdr.mmXDIBHeader.BMPInfoHeader2.cBitCount;
+    dwNumRowBytes = dwRowBits >> 3;
+
+    /* Account for odd bits used in 1bpp or 4bpp images that are NOT on byte boundaries. */
+    if (dwRowBits % 8)
+      dwNumRowBytes++;
+
+    /* Ensure the row length in bytes accounts for byte padding.  All bitmap data rows
+       must are aligned on LONG/4-BYTE boundaries.   The data FROM an IOProc
+       should always appear in this form. */
+    dwPadBytes = (dwNumRowBytes % 4);
+    if (dwPadBytes)
+      dwNumRowBytes += 4 - dwPadBytes;
+
+    /* Allocate space for one row */
+    if (DosAllocMem((PVOID)&pRowBuffer, (ULONG)dwNumRowBytes, fALLOC))
+      {
+        mmioClose (hmmioSource, 0L);
+        mmioClose (hmmioTarget, 0L);
+        return(FALSE);
+      }
+
+    for (dwRowCount = 0;
+         dwRowCount < dwHeight;
+         dwRowCount++)
+      {
+        ulBytesRead = (ULONG)mmioRead (hmmioSource, pRowBuffer, dwNumRowBytes);
+
+        if (ulBytesRead) {
+          mmioWrite (hmmioTarget, pRowBuffer, (ULONG)ulBytesRead);
+#ifdef DEBUG
+        HlpWriteToTrapLog("ulBytesRead: %d, lWritten: %d.\n", ulBytesRead, lWritten);
+#endif
+
+        }
+        else
+          break;
+
+        if(dwHeight)
+          WinPostMsg(hwnd, WM_APPTERMINATENOTIFY, MPFROMLONG(MSG_CONVERTPERCENT), MPFROMLONG(dwRowCount*100/dwHeight));
+      }
+  }
+  WinPostMsg(hwnd, WM_APPTERMINATENOTIFY, MPFROMLONG(MSG_CONVERTPERCENT), MPFROMLONG(100));
+  mmioClose (hmmioTarget, 0L);
+  mmioClose (hmmioSource, 0L);
+  DosFreeMem(pRowBuffer);
+
+  return(TRUE);
+}
+
+void convertThreadFunc (void *arg)
+{
+  HAB  hab;
+  HMQ  hmq;
+  HWND hwnd=(HWND)arg;
+
+  hab=WinInitialize(0);
+  if(hab) {
+    hmq=WinCreateMsgQueue(hab,0);
+    if(hmq) {
+
+      DoConvert(hwnd,
+                chrSourceName,
+                chrTargetName,  pMemFormatInfo[iIoProc].fccIOProc);
+
+
+
+      WinPostMsg(hwnd, WM_APPTERMINATENOTIFY, MPFROMLONG(MSG_CONVERTDONE), 0);
+      DosSleep(1000);
+      WinDestroyMsgQueue(hmq);
+    }
+    WinTerminate(hab);
+  }
+  tidThread=0;
+  bBreak=FALSE;
+}
+
+/* Start the convert thread. hwnd is the HWND of our main dialog */
+void convertImageFile(HWND hwnd)
+{
+  tidThread=_beginthread(convertThreadFunc,NULL,  65535*32, (void*)hwnd); //Fehlerbehandlung fehlt
+  if(tidThread==-1) {
+    DosBeep(100, 500);
+    tidThread=0;
+  }
+}
+
+VOID DrawBitmap ( HWND hwnd )
+{
+    SWP    swp;
+    POINTL aptl[4];
+    HPS    hps;
+    ULONG  ulHeight;
+    ULONG  ulWidth;
+
+    hps = WinBeginPaint ( hwnd,
+                          0,
+                          NULL);
+    /*
+     *  Get position of image frame
+     */
+    WinQueryWindowPos ( hwnd, &swp);
+
+    /* Center image */
+    ulHeight = bmpInfoHeader2.cy;
+    ulWidth = bmpInfoHeader2.cx;
+    if(ulWidth <=swp.cx && ulHeight <= swp.cy)
+      {
+        aptl[0].x=(swp.cx-ulWidth)/2;
+        aptl[1].x=aptl[0].x+ulWidth;
+
+        aptl[0].y=(swp.cy-ulHeight)/2;
+        aptl[1].y=aptl[0].y+ulHeight;
+      }
+    else {
+      float fWidth, fHeight, fRes;
+
+      fWidth=(float)swp.cx/(float)ulWidth;
+      fHeight=(float)swp.cy/(float)ulHeight;
+      fRes=( fWidth>fHeight ? fHeight : fWidth);
+
+
+      aptl[0].x=(swp.cx-ulWidth*fRes)/2;
+      aptl[1].x=aptl[0].x+ulWidth*fRes;
+
+      aptl[0].y=(swp.cy-ulHeight*fRes)/2;
+      aptl[1].y=aptl[0].y+ulHeight*fRes;
+    }
+
+    aptl[2].x = 0;              // source lower left
+    aptl[2].y = 0;
+
+    aptl[3].x = ulWidth;   // source upper right
+    aptl[3].y = ulHeight;
+
+    /*
+     *  Call GpiBitBlt and supply 4 aptl structures.  This tells
+     *  it to stretch or compress the bitmap depending on what is
+     *  in the aptl structures.  See above lines for their current
+     *  settings.
+     */
+
+    WinDrawBitmap(hps, hBitmap, NULLHANDLE, (PPOINTL)aptl, 0, 0, DBM_NORMAL|DBM_STRETCH);
+
+#if 0
+    aptl[0].x=0;
+    aptl[0].y=0;
+    //aptl[1].x=100;
+    //aptl[1].y=100;
+    //       WinDrawBitmap(hps, hBitmap, NULLHANDLE, (PPOINTL)aptl, 0, 0, DBM_NORMAL/*|DBM_STRETCH*/);
+#endif
+    WinEndPaint (hps);
+}
+
+MRESULT EXPENTRY bmpPreviewProc(HWND hwnd, ULONG msg, MPARAM mp1, MPARAM mp2)
+{
+
+  switch (msg)
+    {
+    case WM_PAINT:
+      {
+        if (!WinIsWindowVisible(hwnd))
+          {
+            return((MRESULT)NULL);
+          }
+        DrawBitmap(hwnd);
+        return MRTRUE;
+      }
+    default:
+      break;
+    }
+  return WinDefWindowProc( hwnd, msg, mp1, mp2);
+}
+/* This Proc handles the on-the-fly data CD writing */
+MRESULT EXPENTRY decodeStatusDialogProc(HWND hwnd, ULONG msg, MPARAM mp1, MPARAM mp2)
+{
+  char text[CCHMAXPATH*4 +10];
+  //  char title[CCHMAXPATH*4];
+  SWCNTRL swctl;
+  PID pid;
+  int iPercent;
+
+  switch (msg)
+    {
+    case WM_INITDLG:
+#if 0
+      sprintf(text,"1: %s, 2: %s, 3: %s 4: %s 5: %s 6: %s",params[1],params[2],params[3],
+              params[4], params[4],params[4]);
+      WinMessageBox( HWND_DESKTOP, HWND_DESKTOP, text,
+                     params[4],
+                     0UL, MB_OK | MB_ICONEXCLAMATION|MB_MOVEABLE );
+#endif
+
+      WinSendMsg(WinWindowFromID(hwnd,IDST_IMGCONVERTNAME),EM_SETTEXTLIMIT,MPFROMSHORT((SHORT)CCHMAXPATH),0);
+
+      /* Filename */
+      WinSetWindowText(WinWindowFromID(hwnd,IDST_IMGCONVERTNAME), chrSourceName);
+
+      /* Set dialog font to WarpSans for Warp 4 and above */
+      if(SysQueryOSRelease()>=40) {
+        WinSetPresParam(hwnd,
+                        PP_FONTNAMESIZE,(ULONG)sizeof(DEFAULT_DIALOG_FONT),
+                        DEFAULT_DIALOG_FONT );
+      }
+
+      /* Subclass preview area */
+      WinSubclassWindow(WinWindowFromID(hwnd, IDSR_BMP), bmpPreviewProc);
+
+      /* Create a small BMP */
+      if(hBitmap) {
+        HBITMAP hBitmapTemp;
+
+        hBitmapTemp=createNewBitmap ( hBitmap, &bmpInfoHeader2, WinWindowFromID(hwnd, IDSR_BMP));
+        GpiDeleteBitmap(hBitmap);
+        hBitmap=hBitmapTemp;
+      }
+
+      /* Set percent bars to 0. */
+      WinSetWindowText(WinWindowFromID(hwnd,IDBAR_IMGCONVERTPROGRESS),"0#0%");
+      WinSendMsg(WinWindowFromID(hwnd,IDEF_IMGCONVERTTARGETNAME), EM_SETTEXTLIMIT,
+                 MPFROMSHORT((SHORT)CCHMAXPATH),0);
+      WinEnableWindow( WinWindowFromID(hwnd,IDPB_IMGCONVERTABORT), FALSE);
+
+      insertIOProcItems( WinWindowFromID(hwnd, IDDD_IMGIOPROC) );
+
+      WinSetWindowText( WinWindowFromID(hwnd,IDEF_IMGCONVERTTARGETNAME), chrTargetName );
+
+      IniRestoreWindowPos(chrIniFile, INI_IMGCONV_APP, INI_WINDOWPOS_KEY, hwnd);
+      IniRestoreWindowClrs(chrIniFile, INI_IMGCONV_APP , hwnd);
+
+      /* Add switch entry */
+      memset(&swctl,0,sizeof(swctl));
+      WinQueryWindowProcess(hwnd,&pid,NULL);
+      swctl.hwnd=hwnd;
+      swctl.uchVisibility=SWL_VISIBLE;
+      swctl.idProcess=pid;
+      swctl.bProgType=PROG_DEFAULT;
+      swctl.fbJump=SWL_JUMPABLE;
+      WinAddSwitchEntry(&swctl);
+
+      WinSetFocus(HWND_DESKTOP, hwnd);
+
+      return (MRESULT) TRUE;
+      /* WM_APPTERMINATENOTIFY messages are sent from the helper programs e.g. format checker. */
+    case WM_APPTERMINATENOTIFY:
+      switch(LONGFROMMP(mp1))
+        {
+        case MSG_CONVERTERROR:
+        case MSG_CONVERTDONE:
+          WinEnableWindow( WinWindowFromID(hwnd,IDPB_IMGCONVERTOK), TRUE);
+          WinEnableWindow( WinWindowFromID(hwnd,IDPB_IMGCONVERTABORT), FALSE);
+          break;
+        case MSG_CONVERTPERCENT:
+          iPercent=LONGFROMMP(mp2);
+          if(iPercent>100)
+            iPercent=100;
+          if(iPercent<0)
+            iPercent=0;
+
+          /* Update track percent bar value. The helper prog sends us the actual decoded %. */
+          sprintf(text,"%d#%d%%", iPercent, iPercent);
+          WinSetWindowText(WinWindowFromID(hwnd,IDBAR_IMGCONVERTPROGRESS), text);
+          break;
+        default:
+          break;
+        }
+      return FALSE;
+    case WM_CLOSE:
+      if(tidThread) {
+        bBreak=TRUE;
+        if(!WinStartTimer(WinQueryAnchorBlock(hwnd), hwnd, ID_TIMER, TIMER_DELAY))
+          {
+            /* Save window position */
+            IniSaveWindowPos(chrIniFile, INI_IMGCONV_APP, INI_WINDOWPOS_KEY, hwnd);
+            IniSaveWindowClrs(chrIniFile, INI_IMGCONV_APP , hwnd);
+            WinDismissDlg(hwnd,0);
+          }
+        else
+          return FALSE;
+      }
+      /* Save window position */
+      IniSaveWindowPos(chrIniFile, INI_IMGCONV_APP, INI_WINDOWPOS_KEY, hwnd);
+      IniSaveWindowClrs(chrIniFile, INI_IMGCONV_APP , hwnd);
+      WinDismissDlg(hwnd,0);
+      return FALSE;
+    case WM_CONTROL:
+      if(SHORT1FROMMP(mp1)==IDDD_IMGIOPROC)
+        {
+         if(SHORT2FROMMP(mp1)==EN_CHANGE) {
+           SHORT sIdx;
+
+           sIdx=SHORT1FROMMR(WinSendMsg(HWNDFROMMP(mp2),LM_QUERYSELECTION, MPFROMLONG(LIT_FIRST),0));
+
+           iIoProc=iPrivIOProc[sIdx];
+
+           createTargetName(chrSourceName, pMemFormatInfo[iIoProc].szDefaultFormatExt);
+           WinSetWindowText( WinWindowFromID(hwnd,IDEF_IMGCONVERTTARGETNAME), chrTargetName );
+         }
+        }
+      break;
+    case WM_TIMER:
+      if(SHORT1FROMMP(mp1)==ID_TIMER)
+        {
+          if(!tidThread) {
+            /* Convert thread ended. Quit. */
+            WinStopTimer(WinQueryAnchorBlock(hwnd), hwnd, ID_TIMER);
+            WinPostMsg(hwnd, WM_CLOSE, 0, 0);
+          }
+          return MRFALSE;
+        }
+      break;
+    case WM_COMMAND:
+      switch(SHORT1FROMMP(mp1))
+        {
+        case IDPB_IMGCONVERTBROWSE:
+          {
+            char chrTitle[200];
+            FILEDLG fd = { 0 };
+            /* User pressed the browse button */
+            fd.cbSize = sizeof( fd );
+            /* It's an centered 'Open'-dialog */
+            fd.fl = FDS_OPEN_DIALOG|FDS_CENTER;
+            /* Title: "Search CDRecord/2" */
+            //     getMessage(text,IDSTR_FDLGSEARCHCDR2TITLE,sizeof(text), hSettingsResource,hwnd);
+            /* Set the title of the file dialog */
+            fd.pszTitle = chrTitle;
+            if(!getMessage(chrTitle, IDSTR_IMAGEBROWSETITLE, sizeof(chrTitle), RESSOURCEHANDLE, hwnd))
+              fd.pszTitle = "Image name";
+            /* Only show * files */
+            //sprintf(fd.szFullFile,"%s","*");
+            strcpy(fd.szFullFile, chrTargetName);
+            if( WinFileDlg( HWND_DESKTOP, hwnd, &fd ) == NULLHANDLE )
+              {
+                /* WinFileDlg failed */
+                break;
+              }
+            if( fd.lReturn == DID_OK )
+              {
+                WinSetWindowText( WinWindowFromID(hwnd,IDEF_IMGCONVERTTARGETNAME), fd.szFullFile );
+              }
+            break;
+          }
+        case IDPB_IMGCONVERTCLOSE:
+          bBreak=TRUE;
+          if(!WinStartTimer(WinQueryAnchorBlock(hwnd), hwnd, ID_TIMER, TIMER_DELAY))
+            WinPostMsg(hwnd, WM_CLOSE, 0, 0);/* Timer error so do a hard quit */
+          break;
+        case IDPB_IMGCONVERTABORT:
+          bBreak=TRUE;
+          WinEnableWindow( WinWindowFromID(hwnd,IDPB_IMGCONVERTABORT), FALSE);
+          break;
+        case IDPB_IMGCONVERTOK:
+          {
+            // FSALLOCATE fsAlloc;
+            // long long lFreeSpace;
+            // ULONG ulDiskNum;
+            // char cLetter;
+
+            /* Get target name */
+            WinQueryWindowText( WinWindowFromID(hwnd,IDEF_IMGCONVERTTARGETNAME),
+                                sizeof(chrTargetName), chrTargetName );
+#if 0
+            /* Check if diskspace is sufficient */
+            cLetter=tolower(chrTargetName[0]);
+            ulDiskNum=cLetter-'a'+1;
+            if(DosQueryFSInfo(ulDiskNum, FSIL_ALLOC,&fsAlloc,sizeof(fsAlloc)))
+              lFreeSpace=0;
+            else
+              lFreeSpace=fsAlloc.cUnitAvail*fsAlloc.cbSector*fsAlloc.cSectorUnit;
+
+             if(lFreeSpace<lAudioSize) {
+               /*
+                 Text:
+                 Title:
+                 */
+               getMessage(title, IDSTR_CONVERTNOSPACETEXT,sizeof(title), RESSOURCEHANDLE, hwnd);
+               sprintf(text,title,lAudioSize/1000000 );
+               getMessage(title, IDSTR_CONVERTNOSPACETITLE,sizeof(title), RESSOURCEHANDLE, hwnd);
+               WinMessageBox( HWND_DESKTOP, hwnd, text,
+                              title,
+                              1234UL, MB_OK | MB_ICONEXCLAMATION|MB_MOVEABLE );
+             }
+             else {
+               /* Start decoding an audio file */
+               WinEnableWindow( WinWindowFromID(hwnd,IDPB_CONVERTOK), FALSE);
+               WinEnableWindow( WinWindowFromID(hwnd,IDPB_CONVERTABORT), TRUE);
+               convertAudioFile(hwnd);
+             }
+#endif
+             /* Start converting image file */
+             WinPostMsg(hwnd, WM_APPTERMINATENOTIFY, MPFROMLONG(MSG_CONVERTPERCENT), MPFROMLONG(0));
+             WinEnableWindow( WinWindowFromID(hwnd,IDPB_IMGCONVERTOK), FALSE);
+             WinEnableWindow( WinWindowFromID(hwnd,IDPB_IMGCONVERTABORT), TRUE);
+             convertImageFile(hwnd);
+             break;
+          }
+        default:
+          break;
+        }
+      return (MRESULT) FALSE;
+    default:
+      break;
+    }/* switch */
+
+  return WinDefDlgProc( hwnd, msg, mp1, mp2);
+}
+
+int main (int argc, char *argv[])
+{
+  HAB  hab;
+  HMQ  hmq;
+  short a;
+
+  /* Create a copy of the args */
+  /* argv[0]: progname
+   * argv[1]: imgfile
+   * argv[2]: IO proc name
+   */
+
+  numArgs=argc;
+
+  //  sprintf(text,"");
+  for(a=0;a<argc;a++)
+    {
+      params[a]=argv[a];
+    }
+
+  hab=WinInitialize(0);
+  if(hab) {
+    hmq=WinCreateMsgQueue(hab,0);
+    if(hmq) {
+      /* Check if user started prog by hand */
+      if(argc<NUMPARAMS-1) {/* Not the right num of params */
+        pmUsage();
+      }
+      else {
+        /* Save source name */
+        strcpy(chrSourceName,params[1]);
+        if(argc==NUMPARAMS)
+          strcpy(chrProcName,params[2]);
+        else {
+          bNoProcGiven=TRUE;
+          strcpy(chrProcName, "");
+        }
+        /* Get our ressource dll */
+        //   RESSOURCEHANDLE=0;
+        RESSOURCEHANDLE=queryResModuleHandle(argv[0]);
+
+        HlpBuildMMProgIniFileName(argv[0], chrIniFile, sizeof(chrIniFile));
+        /* Register the percent bar window class */
+        percentRegisterBarClass();
+
+        globalHab=WinQueryAnchorBlock(HWND_DESKTOP);
+        hBitmap=loadBitmap ( chrSourceName, &bmpInfoHeader2);
+
+        if( WinDlgBox( HWND_DESKTOP, NULLHANDLE, decodeStatusDialogProc,
+                       RESSOURCEHANDLE, IDDLG_IMGCONVERT, 0) == DID_ERROR )
+          {
+            char text[CCHMAXPATH];
+            char title[CCHMAXPATH];
+            /*
+              Text:
+              Title:  "Installation problem"
+              */
+            messageBox( text, IDSTR_CONVERTDIALOGERROR , sizeof(text),
+                        title, IDSTR_INSTALLERRORTITLE , sizeof(title),
+                        RESSOURCEHANDLE, HWND_DESKTOP, MB_OK | MB_ICONEXCLAMATION | MB_MOVEABLE);
+
+            if(hBitmap)
+              GpiDeleteBitmap(hBitmap);
+            freeResHandle();
+            WinDestroyMsgQueue( hmq );
+            WinTerminate( hab );
+            DosBeep(100,600);
+            return( 1 );
+          }
+        if(pMemFormatInfo)
+          free(pMemFormatInfo);
+        if(hBitmap)
+          GpiDeleteBitmap(hBitmap);
+      }
+      freeResHandle();
+      WinDestroyMsgQueue(hmq);
+    }
+    WinTerminate(hab);
+  }
+  return 0;
+}
Index: /tags/CWMM-0.3.0_GA/classes/mm-progs/imageconverter/makefile
===================================================================
--- /tags/CWMM-0.3.0_GA/classes/mm-progs/imageconverter/makefile	(revision 213)
+++ /tags/CWMM-0.3.0_GA/classes/mm-progs/imageconverter/makefile	(revision 213)
@@ -0,0 +1,32 @@
+# Makefile
+
+include ../../../make.inc
+include ../mmprog.inc
+
+OBJECTS	=	$(LIBDIR)/message.obj \
+		$(LIBDIR)/helper.obj \
+		$(LIBDIR)/progbars.obj \
+		$(LIBDIR)/sys_funcs.obj
+
+all:	imgconv.exe
+
+
+imgconv.exe:	imgconv.c $(OBJECTS)
+	cmd /C $(TOOLDIR)\create_def.cmd imgconv.def
+#Use this command to link dynamicaly
+	$(CC) $(CPPFLAGS) -I$(INC) imgconv.c $(OBJECTS) mmpm2.lib imgconv.def
+
+clean:
+	-rm *.exe
+	-rm *.dll
+	-rm *.obj
+	-rm *.RES
+	-rm *.ini
+	-rm *.def
+
+cleaner:
+	-rm *.*~
+	-rm *.flc
+
+
+distribution:
Index: /tags/CWMM-0.3.0_GA/classes/mm-progs/include/mmprogs_defaults.h
===================================================================
--- /tags/CWMM-0.3.0_GA/classes/mm-progs/include/mmprogs_defaults.h	(revision 213)
+++ /tags/CWMM-0.3.0_GA/classes/mm-progs/include/mmprogs_defaults.h	(revision 213)
@@ -0,0 +1,53 @@
+/*
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; see the file COPYING.  If not, write to
+ * the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+/*
+ * If you need another license for your project/product (commercial,
+ * noncommercial, whatever) contact me at
+ *
+ * http://www.os2world.com/cdwriting
+ * http://www.geocities.com/SiliconValley/Sector/5785/
+ *
+ */
+
+/************************************/
+/*                                  */
+/*            Ini file              */
+/*                                  */
+/************************************/
+/* General */
+#define MMCLS_INI_FILE_NAME     "\\cwmm.ini"
+#define INI_WINDOWPOS_KEY "windowpos"    /* Key for storing window position */
+
+/* Audio player */
+#define DEFAULT_VOLUME    75      /* Default volume for audio player (not volume object) */
+#define INI_MMPLAYER_APP      (PSZ)"mmplayer"     /* App name to use                       */
+#define INI_DISPLAY_KEY       (PSZ)"displaytype"  /* Key for storing which display to show */
+#define INI_VOLUME_KEY        (PSZ)"volume"       /* Key for storing the volume            */
+
+/* Image converter */
+#define INI_IMGCONV_APP       (PSZ)"imageconv"
+
+/* Audio converter */
+#define INI_AUDIOCONV_APP     (PSZ)"audioconv"
+
+/* Master volume */
+#define INI_VOLUME_APP        (PSZ)"volume"
+
+/* Volume for classes */
+#define INI_CLASSVOLUME_APP   (PSZ)"classvolume"
+
+/* For setting volume */
+#define SETUP_MMAUDIOVOLUME   (PSZ)"MMAUDIOVOLUME"
Index: /tags/CWMM-0.3.0_GA/classes/mm-progs/makefile
===================================================================
--- /tags/CWMM-0.3.0_GA/classes/mm-progs/makefile	(revision 213)
+++ /tags/CWMM-0.3.0_GA/classes/mm-progs/makefile	(revision 213)
@@ -0,0 +1,52 @@
+# Makefile
+
+include ../../make.inc
+
+.SUFFIXES:	.obj .c
+.PHONY:		clean cleaner
+
+CC           = icc
+CPPFLAGS     = /Ge+ /Gm+ /G5 /Ss /Gl /O+ /Oc+ /Ol- /Q+ /Ti /Sp4 /B"/pmtype:pm /ma /de"
+INC		=	./include -I ../../classes/inc -I ../../common_functions/include
+DEFS         =
+PROGS        =
+ODIR		= .
+CPPDIR	= .
+LIBDIR	=	./lib
+#export COMMONSRC	=	../common_functions
+LIBOBJS	=	$(LIBDIR)/message.obj $(LIBDIR)/helper.obj $(LIBDIR)/progbars.obj $(LIBDIR)/menu_funcs.obj \
+			$(LIBDIR)/sys_funcs.obj
+
+
+$(LIBDIR)/%.obj:	$(COMMONSRC)/%.c
+#	gcc -c -Wno-pointer-sign -Wall -o$@ -Zomf -I$(INC) $<  		
+	$(CC) $(CPPFLAGS) /C+ -I$(INC) /Fo$@ $<
+	
+all:	$(LIBOBJS)
+	cd ./master_volume && make
+	cd ./audioconverter && make
+	cd ./imageconverter && make
+	cd ./mmplayer && make
+	cd ./volume && make
+	cd ./mmfind && make
+
+clean:
+	-cd ./lib && rm *.obj
+	-cd ./volume && make clean
+	-cd ./audioconverter && make clean
+	-cd ./imageconverter && make clean
+	-cd ./mmplayer && make clean
+	-cd ./master_volume && make clean
+	-cd ./mmfind && make clean
+
+
+cleaner:
+	-cd ./volume && make cleaner
+	-cd ./audioconverter && make cleaner
+	-cd ./imageconverter && make cleaner
+	-cd ./mmplayer && make cleaner
+	-cd ./master_volume && make cleaner
+	-rm ./include/*.*~
+
+	
+
Index: /tags/CWMM-0.3.0_GA/classes/mm-progs/master_volume/def.tpl
===================================================================
--- /tags/CWMM-0.3.0_GA/classes/mm-progs/master_volume/def.tpl	(revision 213)
+++ /tags/CWMM-0.3.0_GA/classes/mm-progs/master_volume/def.tpl	(revision 213)
@@ -0,0 +1,22 @@
+# Note: lines starting with '#' are comments.
+
+[DESCRIPTION]
+Master volume applet
+
+[COPYRIGHT]
+(c) C. Wohlgemuth 2001-2005 Netlabs CWMM Team 2023
+
+[AUTHOR]
+Netlabs CWMM Team
+
+[NAME]
+# This is the NAME xxx WINDOWAPI|etc line in the def file.
+# Important: it specifies the internal name of the program. Don't leave out!
+NAME VOLUME WINDOWAPI
+
+[BUILDMACHINE]
+Zobopeep
+
+[OTHER]
+# Add all the lines here you want to have at the end of the generated DEF file
+STACKSIZE    1638400
Index: /tags/CWMM-0.3.0_GA/classes/mm-progs/master_volume/makefile
===================================================================
--- /tags/CWMM-0.3.0_GA/classes/mm-progs/master_volume/makefile	(revision 213)
+++ /tags/CWMM-0.3.0_GA/classes/mm-progs/master_volume/makefile	(revision 213)
@@ -0,0 +1,35 @@
+# Makefile
+
+include ../../../make.inc
+include ../mmprog.inc
+
+ICONDIR =	..\res\Icons
+OBJECTS	=	$(LIBDIR)/message.obj \
+		$(LIBDIR)/helper.obj \
+		$(LIBDIR)/progbars.obj \
+		$(LIBDIR)/sys_funcs.obj
+#OBJECTS	=	$(OBJDIR)/message.obj $(OBJDIR)/helper.obj $(OBJDIR)/progbars.obj \
+			$(OBJDIR)/sys_funcs.obj
+
+all:	volume.exe
+
+
+volume.exe:	volume.c $(OBJECTS) makefile def.tpl
+	cmd /C $(TOOLDIR)\create_def.cmd volume.def
+	$(CC) $(CPPFLAGS) -I$(INC) volume.c $(OBJECTS) mmpm2.lib volume.def
+	rc -I $(INC) volume.rc volume.exe
+
+clean:
+	-rm *.exe
+	-rm *.obj
+	-rm *.RES
+	-rm *.ini
+	-rm *.def
+
+cleaner:
+	-rm *.*~
+	-rm *.flc
+
+
+distribution:
+
Index: /tags/CWMM-0.3.0_GA/classes/mm-progs/master_volume/volume.c
===================================================================
--- /tags/CWMM-0.3.0_GA/classes/mm-progs/master_volume/volume.c	(revision 213)
+++ /tags/CWMM-0.3.0_GA/classes/mm-progs/master_volume/volume.c	(revision 213)
@@ -0,0 +1,658 @@
+/*
+ * Volume.exe (C) Chris Wohlgemuth 2003
+ *
+ */
+/*
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; see the file COPYING.  If not, write to
+ * the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+/*
+ * If you need another license for your project/product (commercial,
+ * noncommercial, whatever) contact me at
+ *
+ * http://www.os2world.com/cdwriting
+ * http://www.geocities.com/SiliconValley/Sector/5785/
+ *
+ */
+
+#define INCL_DOS
+#define INCL_GPI
+#define INCL_DOSFILEMGR
+#define INCL_DOSERRORS
+#define INCL_WIN
+#define INCL_OS2MM
+#define INCL_MMIOOS2
+#define INCL_MCIOS2
+#define INCL_SECONDARYWINDOW
+#define INCL_GRAPHICBUTTON
+#include <os2.h>
+#include <sw.h>
+#include <sys\types.h>
+#include <sys\stat.h>
+#include <stdio.h>
+#include <string.h>
+#include <stdlib.h>
+#include "os2me.h"
+#include "common.h"
+#include "mmres.h"
+#include "mmprogs_defaults.h"
+
+#include "sys_funcs.h"
+
+#define ACTION_SETVOLUME     1L
+#define ACTION_QUERYVOLUME   2L
+
+//#define INI_NAME_APP        "volume"
+
+#define INI_TBVISIBLE_KEY   "tbVisible"
+#define INI_NAME_COLOR        "color"
+#define INI_BTNBGCLR_KEY       "btnbg"
+#define INI_BTNFGCLR_KEY       "btnfg"
+
+#if 0
+#define INI_BGCLR_KEY       "bg"
+#define INI_FGCLR_KEY       "fg"
+#define INI_ACTIVETBBGCLR_KEY       "activetbbg"
+#define INI_INACTIVETBBGCLR_KEY       "inactivetbbg"
+#define INI_ACTIVETBFGCLR_KEY       "activetbfg"
+#define INI_INACTIVETBFGCLR_KEY       "inactivetbfg"
+#endif
+char logName[]="volume.log";
+
+BOOL bHaveWindowPos=FALSE;
+
+BOOL bMute=FALSE;
+HMODULE RESSOURCEHANDLE=0;
+int bTBVisible=0;
+ULONG ulTBCy;
+
+HWND hwndThread;
+
+char* params[5];
+char chrIniFile[CCHMAXPATH];
+
+//ULONG cwQueryOSRelease();
+void pmUsage();
+BOOL IniSaveWindowPos(char * iniFile, char* chrApp, char *chrKey, HWND hwnd);
+BOOL IniRestoreWindowPos(char * iniFile, char* chrApp, char *chrKey, HWND hwnd);
+BOOL IniSaveInt(char * iniFile, char* chrApp, char *chrKey, int theInt);
+int IniRestoreInt(char * iniFile, char* chrApp, char *chrKey, int defaultInt);
+BOOL IniSaveData(char * iniFile, char* chrApp, char *chrKey, void* theData, ULONG ulSize);
+BOOL IniRestoreData(char * iniFile, char* chrApp, char *chrKey, void * theData, ULONG* ulMaxSize);
+BOOL IniSaveWindowClrs(char * chrIniFile, char* chrApp , HWND hwnd);
+BOOL IniRestoreWindowClrs(char * chrIniFile, char* chrApp , HWND hwnd);
+BOOL HlpBuildMMProgIniFileName(char* chrProgname, char * chrBuffer, ULONG ulBufferSize);
+HMODULE queryResModuleHandle(char *chrExePath);
+void freeResHandle(void);
+
+ULONG queryMasterVolume(void)
+{
+  char chrCommand[50];
+  char retMsg[20];
+  ULONG rc;
+
+  strcpy(chrCommand, "MASTERAUDIO QUERY VOLUME WAIT");
+  rc = mciSendString(chrCommand, retMsg, sizeof(retMsg), 0, 0);
+  if((rc & 0x0000ffff)!=MCIERR_SUCCESS) {
+    /* Problem with MCI. */
+    return 75;
+  }
+  else
+    return atoi(retMsg);
+}
+
+void setMasterVolume(HWND hwnd, SHORT sVolumeLevel)
+{
+  char chrCommand[500];
+  char retMsg[20];
+  ULONG rc;
+
+  WinPostMsg(hwndThread, WM_APPTERMINATENOTIFY, MPFROMLONG(ACTION_SETVOLUME), MPFROMSHORT(sVolumeLevel));
+  return;
+
+  sprintf(chrCommand, "MASTERAUDIO volume %d wait ", sVolumeLevel);
+  rc = mciSendString(chrCommand, retMsg, sizeof(retMsg), hwnd, 2);
+  if((rc & 0x0000ffff)!=MCIERR_SUCCESS) {
+    /* Problem with MCI. */
+    mciGetErrorString(rc, chrCommand,sizeof(chrCommand));
+    WinMessageBox(HWND_DESKTOP, HWND_DESKTOP, chrCommand, "", 1234, MB_MOVEABLE);
+    //DosBeep(100, 30);
+    return ;
+  }
+}
+
+/* Masteraudio does not support NOTIFY so use a thread to prevent PM freeze */
+MRESULT EXPENTRY volumeObjectProc(HWND hwnd, ULONG msg, MPARAM mp1, MPARAM mp2)
+{
+  switch(msg)
+    {
+    case WM_APPTERMINATENOTIFY:
+      {
+        char chrCommand[500];
+        char retMsg[20];
+        ULONG rc;
+
+        /* This queue is blocked until the query is over. This is the reason we've chosen an object window. */
+        switch(LONGFROMMP(mp1))
+          {
+          case ACTION_SETVOLUME:
+            {
+
+#if 0
+              ULONG mastervolume;              /* Set to master volumepercentage
+                                                  percentage by this example      */
+
+              USHORT usDeviceID=0;
+              MCI_MASTERAUDIO_PARMS masteraudioparms;
+              MCI_OPEN_PARMS   openParms;
+
+
+              memset(&openParms,0, sizeof(openParms));
+              openParms.pszDeviceType="Masteraudio";
+
+              rc=mciSendCommand(0,       /* Device                          */
+                             MCI_OPEN,                /* Master audio message            */
+                             MCI_WAIT ,
+                             /* Flags for this message          */
+                             (PVOID) &openParms,      /* Data structure                  */
+                             0);                             /* User parm                       */
+
+              mciGetErrorString(rc,chrCommand, sizeof(chrCommand));
+              //sprintf(chrCommand, "%x", rc);
+              WinMessageBox(HWND_DESKTOP, HWND_DESKTOP, chrCommand, "", 1234, MB_MOVEABLE);
+              DosBeep(5000, 10);
+              usDeviceID=openParms.usDeviceID;
+              memset(&masteraudioparms,0, sizeof(masteraudioparms));
+              masteraudioparms.ulMasterVolume=32;
+              /* Get current system master
+                 volume setting                  */
+
+              mciSendCommand(usDeviceID,       /* Device                          */
+                             MCI_MASTERAUDIO,                /* Master audio message            */
+                             MCI_WAIT |  MCI_MASTERVOL,
+                             /* Flags for this message          */
+                             (PVOID) &masteraudioparms,      /* Data structure                  */
+                             0);                             /* User parm                       */
+
+              /* Get current system master
+                 volume setting                  */
+
+              mciSendCommand(usDeviceID,       /* Device                          */
+                             MCI_MASTERAUDIO,                /* Master audio message            */
+                             MCI_WAIT | MCI_QUERYCURRENTSETTING | MCI_MASTERVOL,
+                             /* Flags for this message          */
+                             (PVOID) &masteraudioparms,      /* Data structure                  */
+                             0);                             /* User parm                       */
+
+              mastervolume = masteraudioparms.ulReturn;
+                          DosBeep(500, 10);
+#endif
+
+            sprintf(chrCommand, "MASTERAUDIO VOLUME %d WAIT", SHORT1FROMMP(mp2));
+            //            sprintf(chrCommand, "MASTERAUDIO VOLUME 39", SHORT1FROMMP(mp2));
+            rc = mciSendString(chrCommand, retMsg, sizeof(retMsg), 0, 0);
+            //DosBeep(5000, 20);
+
+            if((rc & 0x0000ffff)!=MCIERR_SUCCESS) {
+              /* Problem with MCI. */
+              //    DosBeep(1000, 10);
+              break;
+            }
+
+            break;
+            }
+          case ACTION_QUERYVOLUME:
+            break;
+          default:
+            break;
+          }
+        return FALSE;
+      }
+    case WM_CLOSE:
+      WinPostMsg(hwnd,WM_QUIT,(MPARAM)0,(MPARAM)0);
+    default:
+      break;
+    }
+  return WinDefWindowProc( hwnd, msg, mp1, mp2);
+}
+
+void volumeThreadFunc (void *arg)
+{
+  HAB  hab;
+  HMQ  hmq;
+  QMSG qmsg;
+
+  hab=WinInitialize(0);
+  if(hab) {
+    hmq=WinCreateMsgQueue(hab,0);
+    if(hmq) {
+
+      if((hwndThread=WinCreateWindow(HWND_OBJECT, WC_STATIC, "", 0,0,0,0,0, NULLHANDLE,
+                                     HWND_BOTTOM, 1, NULLHANDLE, NULLHANDLE))==NULLHANDLE) {
+        WinMessageBox(HWND_DESKTOP, HWND_DESKTOP, "Can't start thread. Aborting...", "", 1234, MB_MOVEABLE);
+        exit(1);
+      }
+      WinSubclassWindow(hwndThread,&volumeObjectProc);
+      /* Window created. */
+
+      while(WinGetMsg(hab,&qmsg,(HWND)NULL,0,0))
+        WinDispatchMsg(hab,&qmsg);
+      WinDestroyWindow(hwndThread);
+
+      WinDestroyMsgQueue(hmq);
+    }
+    WinTerminate(hab);
+  }
+
+}
+
+static void contextMenu(HWND hwnd)
+{
+  POINTL ptl;
+  HWND   hwndPopup;
+  HWND hwndTitleBar;
+  BOOL bVisible;
+
+  if((hwndTitleBar=WinWindowFromID(hwnd, FID_TITLEBAR))==NULLHANDLE)
+    return;
+
+  hwndPopup = WinLoadMenu(hwnd, RESSOURCEHANDLE, IDM_POPUP);
+  if (hwndPopup == NULLHANDLE)
+    return;
+
+  bVisible=WinIsWindowVisible(hwndTitleBar);
+
+  if(!bVisible)
+    WinSendMsg(hwndPopup,MM_SETITEMATTR,MPFROM2SHORT(IDM_ITEMTITLEBAR,FALSE),
+               MPFROM2SHORT(MIA_CHECKED,MIA_CHECKED));
+
+  WinQueryPointerPos(HWND_DESKTOP, &ptl) ;
+  WinMapWindowPoints(HWND_DESKTOP,hwnd,&ptl,1);
+  WinPopupMenu(hwnd, hwnd, hwndPopup,
+               ptl.x, ptl.y, IDM_ITEMEXIT, PU_HCONSTRAIN | PU_VCONSTRAIN |
+               PU_KEYBOARD | PU_MOUSEBUTTON1 | PU_MOUSEBUTTON2 | PU_NONE  );
+}
+
+
+static BOOL toggleTitleBar(HWND hwnd)
+{
+  HWND hwndTitleBar;
+
+  if((hwndTitleBar=WinWindowFromID(hwnd, FID_TITLEBAR))!=NULLHANDLE)
+    {
+      SWP swp, swpFrame;
+
+      if(!WinQueryWindowPos(hwndTitleBar,&swp))
+        return FALSE;
+
+      if(!WinQueryWindowPos(hwnd,&swpFrame))
+        return FALSE;
+
+      /* Shrink or expand the frame */
+      if(!bTBVisible) {
+        WinSetWindowPos(hwnd, NULLHANDLE, swpFrame.x, swpFrame.y,//-swp.cy,
+                        swpFrame.cx, swpFrame.cy+swp.cy, SWP_SIZE|SWP_MOVE);
+        bTBVisible=TRUE;
+      }
+      else
+        {
+          WinSetWindowPos(hwnd, NULLHANDLE, swpFrame.x, swpFrame.y,//+swp.cy,
+                          swpFrame.cx, swpFrame.cy-swp.cy, SWP_SIZE|SWP_MOVE);
+          bTBVisible=FALSE;
+        }
+    }
+  WinSendMsg(hwnd,WM_UPDATEFRAME,0,0);
+  return TRUE;
+}
+
+
+/* This Proc handles the on-the-fly data CD writing */
+MRESULT EXPENTRY volumeDialogProc(HWND hwnd, ULONG msg, MPARAM mp1, MPARAM mp2)
+{
+  //char text[CCHMAXPATH*4 +10];
+  //char title[CCHMAXPATH*4];
+  HPOINTER          hpProgramIcon;           /* handle to program's icon     */
+
+  switch (msg)
+    {
+    case WM_INITDLG:
+      {
+        RGB rgb;
+        ULONG ulSize;
+        SWP swp;
+        HWND hwndTB;
+        ULONG cy;
+
+        /*
+         * The slider control cannot be completely set from the dialog
+         * template so some aspects must be set here.  We will set the
+         * volume range to 0-100, increment to 1-10, and the initial
+         * volume level to 75.
+         */
+        WinSendMsg( WinWindowFromID(hwnd, IDCS_VOLUME),
+                    CSM_SETRANGE,
+                    (MPARAM) 0L,
+                    (MPARAM) 100L);
+
+        WinSendMsg( WinWindowFromID(hwnd, IDCS_VOLUME),
+                    CSM_SETINCREMENT,
+                    (MPARAM) 10L,
+                    (MPARAM) 1L);
+
+
+        WinSendMsg( WinWindowFromID(hwnd, IDCS_VOLUME),
+                    CSM_SETVALUE,
+                    (MPARAM) queryMasterVolume(),
+                    (MPARAM) NULL);
+
+
+        // getMessage(title, IDSTR_CONVERTCHANNELS, sizeof(title), RESSOURCEHANDLE, hwnd);
+        /* Set dialog font to WarpSans for Warp 4 and above */
+        if(SysQueryOSRelease()>=40) {
+          WinSetPresParam(hwnd,
+                          PP_FONTNAMESIZE,(ULONG)sizeof(DEFAULT_DIALOG_FONT),
+                          DEFAULT_DIALOG_FONT );
+        }
+
+        hpProgramIcon =
+          WinLoadPointer(
+                         HWND_DESKTOP,
+                         (HMODULE) NULL,              /* Resource is kept in .Exe file. */
+                         ID_ICONVOLUME );                   /* Which icon to use.             */
+
+        WinSendMsg(
+                   hwnd,                    /* Dialog window handle.                 */
+                   WM_SETICON,              /* Message to the dialog.  Set it's icon.*/
+                   (MPARAM) hpProgramIcon,
+                   (MPARAM) 0 );            /* mp2 no value.                         */
+#if 0
+        WinDefSecondaryWindowProc(
+                                  hwnd,                    /* Dialog window handle.                 */
+                                  WM_SETICON,              /* Message to the dialog.  Set it's icon.*/
+                                  (MPARAM) hpProgramIcon,
+                                  (MPARAM) 0 );            /* mp2 no value.                         */
+#endif
+
+        bTBVisible=IniRestoreInt(chrIniFile, INI_VOLUME_APP, INI_TBVISIBLE_KEY, 1);
+        //      sprintf(text, ": %d", bTBVisible);
+        //   WinMessageBox(HWND_DESKTOP, HWND_DESKTOP, text, "", 1234, MB_MOVEABLE);
+
+        IniRestoreWindowPos(chrIniFile, INI_VOLUME_APP, INI_WINDOWPOS_KEY, hwnd);
+        IniRestoreWindowClrs(chrIniFile, INI_VOLUME_APP , hwnd);
+
+        ulSize=sizeof(RGB);
+        if(IniRestoreData(chrIniFile, INI_VOLUME_APP, INI_BTNBGCLR_KEY, &rgb, &ulSize))
+          {
+            // Set the background colour
+            WinSetPresParam(WinWindowFromID(hwnd, IDPB_MUTE),
+                            PP_BACKGROUNDCOLOR,(ULONG)sizeof(rgb), &rgb);
+          }
+        ulSize=sizeof(RGB);
+        if(IniRestoreData(chrIniFile, INI_VOLUME_APP, INI_BTNFGCLR_KEY, &rgb, &ulSize))
+          {
+            // Set the foreground colour
+            WinSetPresParam(WinWindowFromID(hwnd, IDPB_MUTE),
+                            PP_FOREGROUNDCOLOR,(ULONG)sizeof(rgb), &rgb);
+          }
+        //#if 0
+        if(!bTBVisible)
+          {
+            /* Reduce size of dialog */
+            hwndTB=WinWindowFromID(hwnd, FID_TITLEBAR);
+
+            WinQueryWindowPos(hwndTB, &swp);
+            cy=swp.cy;
+            WinQueryWindowPos(hwnd, &swp);
+            WinSetWindowPos(hwnd, NULLHANDLE, 0, 0, swp.cx, swp.cy-cy, SWP_SIZE  );
+          }
+        //#endif
+
+        WinShowWindow( hwnd, TRUE );
+        _beginthread(volumeThreadFunc,NULL,8192*16, NULLHANDLE); //Fehlerbehandlung fehlt
+        return (MRESULT) FALSE;
+      }
+
+    case WM_FORMATFRAME:
+      {
+        /* Remove top frame controls if titlebar is hidden */
+        SHORT countSwp;
+
+        countSwp = (int) WinDefDlgProc(hwnd, msg, mp1, mp2);
+        if(countSwp) {
+          if(bTBVisible==0) {
+            /* Hide frame controls */
+            /* countSWP:  number of standard framecontrols
+               pswp:      Array of SWP describing the framecontrols.
+               */
+            int a;
+            PSWP pswpTB=NULLHANDLE;
+            PSWP pswp=(PSWP)mp1;
+            int y;
+
+            for (a = 0; a < countSwp; a++)
+              {
+                /* Find the titlebar window */
+                if ( WinQueryWindowUShort( pswp[a].hwnd, QWS_ID ) == FID_TITLEBAR )
+                  {
+                    pswpTB=&pswp[a];
+                    y=pswp[a].y;
+                    //    DosBeep(500,600);
+                    break;
+                  }
+              }
+
+            if(pswpTB) {
+              /* Hide all frame controls at the top */
+              for (a = 0; a < countSwp; a++)
+                {
+                  if ( pswp[a].y == y )
+                    {
+                      pswp[a].fl|=SWP_HIDE;
+                      pswp[a].fl&=~SWP_SHOW;
+                    }
+                }/* for() */
+              /* Reduce size of dialog */
+              //    WinQueryWindowPos(hwnd, &swp);
+              /*WinSetWindowPos(hwnd, NULLHANDLE, 0, 0, swp.cx, swp.cy-cy, SWP_SIZE  );*/
+              //      DosBeep(5000,600);
+            }
+          }
+        }
+        return MRFROMSHORT(countSwp);
+      }
+    case WM_CONTEXTMENU:
+      contextMenu(hwnd);
+      return (MRESULT) FALSE;
+    case WM_BUTTON1DBLCLK:
+      {
+        /* Remove frame controls (titlebar) when double clicking MB 1 */
+        toggleTitleBar(hwnd);
+        return (MRESULT) FALSE;
+      }
+    case WM_BUTTON2MOTIONSTART:
+    case WM_BUTTON1MOTIONSTART:
+      /* Drag the window without titlebar */
+      WinSendMsg(hwnd, WM_TRACKFRAME,
+                 MPFROMSHORT(TF_MOVE   /*| TF_SETPOINTERPOS */), NULL) ;
+      return (MRESULT) 0 ;
+      case WM_CONTROL:
+         if (SHORT1FROMMP(mp1)==IDCS_VOLUME)
+         {
+            if ((SHORT2FROMMP(mp1)==CSN_CHANGED) ||    /* change volume?   */
+                (SHORT2FROMMP(mp1)==CSN_TRACKING))     /* tracking volume? */
+            {
+              SHORT sVolumeLevel;
+
+               sVolumeLevel = SHORT1FROMMP (mp2);
+               if(!bMute)
+                 setMasterVolume(hwnd, sVolumeLevel);
+            }
+         }
+         else if (SHORT1FROMMP(mp1)==IDPB_MUTE)
+           {
+             if (SHORT2FROMMP(mp1)==GBN_BUTTONDOWN) {
+               bMute=TRUE;
+               setMasterVolume(hwnd, 0);
+             }
+             else if (SHORT2FROMMP(mp1)==GBN_BUTTONUP) {
+               SHORT sValue;
+
+               bMute=FALSE;
+               WinSendMsg(WinWindowFromID(hwnd, IDCS_VOLUME),CSM_QUERYVALUE ,MPFROMP(&sValue) ,0);
+               setMasterVolume(hwnd, sValue);
+             }
+           }
+         return( (MRESULT) 0);
+    case WM_CLOSE:
+      {
+        MCI_MASTERAUDIO_PARMS masteraudioparms;
+        ULONG  attrFound;
+        RGB rgb;
+
+        memset(&masteraudioparms,0, sizeof(masteraudioparms));
+        /* Save master audio level */
+        mciSendCommand( 0,
+                       MCI_MASTERAUDIO,                /* Master audio message            */
+                       MCI_WAIT |  MCI_MASTERVOL | MCI_SAVESETTING,
+                       /* Flags for this message          */
+                       (PVOID) &masteraudioparms,
+                       0);
+
+        WinPostMsg(hwndThread, WM_CLOSE, 0, 0);
+        /* Save window position */
+        IniSaveWindowPos(chrIniFile, INI_VOLUME_APP, INI_WINDOWPOS_KEY, hwnd);
+        /* Save titlebar state */
+        bTBVisible=WinIsWindowVisible(WinWindowFromID(hwnd, FID_TITLEBAR));
+        IniSaveInt(chrIniFile, INI_VOLUME_APP, INI_TBVISIBLE_KEY, bTBVisible);
+        /* Save colors */
+        // Query the current button background colour
+        if(WinQueryPresParam(WinWindowFromID(hwnd, IDPB_MUTE),
+                             PP_BACKGROUNDCOLOR,0,&attrFound,sizeof(rgb),
+                             &rgb,QPF_NOINHERIT))
+          {
+            IniSaveData(chrIniFile, INI_VOLUME_APP, INI_BTNBGCLR_KEY, &rgb, sizeof(RGB));
+          }
+        // Query the current button foreground colour
+        if(WinQueryPresParam(WinWindowFromID(hwnd, IDPB_MUTE),
+                             PP_FOREGROUNDCOLOR,0,&attrFound,sizeof(rgb),
+                             &rgb,QPF_NOINHERIT))
+          {
+            IniSaveData(chrIniFile, INI_VOLUME_APP, INI_BTNFGCLR_KEY, &rgb, sizeof(RGB));
+          }
+        IniSaveWindowClrs(chrIniFile, INI_VOLUME_APP , hwnd);
+        WinPostMsg(hwnd, WM_QUIT, 0, 0);
+        return (MRESULT )FALSE;
+      }
+    case WM_COMMAND:
+      switch(SHORT1FROMMP(mp1))
+        {
+        case IDM_ITEMTITLEBAR:
+          toggleTitleBar(hwnd);
+          break;
+        case IDM_ITEMEXIT:
+          WinPostMsg(hwnd, WM_CLOSE, 0, 0);/* Timer error so do a hard quit */
+          break;
+        default:
+          break;
+        }
+      return (MRESULT) FALSE;
+    default:
+      break;
+    }/* switch */
+  //return (MRESULT) WinDefSecondaryWindowProc( hwnd, msg, mp1, mp2 ) ;
+  return WinDefDlgProc( hwnd, msg, mp1, mp2);
+}
+
+
+int main (int argc, char *argv[])
+{
+  HAB  hab;
+  HMQ  hmq;
+  //char text[CCHMAXPATH];
+  //char title[CCHMAXPATH];
+
+  hab=WinInitialize(0);
+  if(hab) {
+    hmq=WinCreateMsgQueue(hab,0);
+    if(hmq) {
+
+      RESSOURCEHANDLE=queryResModuleHandle(argv[0]);
+
+      HlpBuildMMProgIniFileName(argv[0], chrIniFile, sizeof(chrIniFile));
+      bTBVisible=IniRestoreInt(chrIniFile, INI_VOLUME_APP, INI_TBVISIBLE_KEY, 1);
+
+      if( WinDlgBox( HWND_DESKTOP, NULLHANDLE,
+                     volumeDialogProc, RESSOURCEHANDLE, IDDLG_VOLUME, 0) == DID_ERROR )
+        {
+          /*
+            Text:
+            Title:  "Installation problem"
+            */
+#if 0
+          messageBox( text, IDSTR_CONVERTDIALOGERROR , sizeof(text),
+                      title, IDSTR_INSTALLERRORTITLE , sizeof(title),
+                      RESSOURCEHANDLE, HWND_DESKTOP, MB_OK | MB_ICONEXCLAMATION | MB_MOVEABLE);
+#endif
+          WinDestroyMsgQueue( hmq );
+          WinTerminate( hab );
+          DosBeep(100,600);
+          freeResHandle();
+          return( 1 );
+        }
+#if 0
+      hwndFrame=WinLoadSecondaryWindow(
+                                       HWND_DESKTOP,           /* Parent of the dialog box.     */
+                                       HWND_DESKTOP,           /* Owner of the dialog box.      */
+                                       (PFNWP) volumeDialogProc,   /* */
+                                       (HMODULE) RESSOURCEHANDLE,         /* */
+                                       IDDLG_VOLUME,            /* Dialog ID.                   */
+                                       (PVOID) NULL);          /* Creation      */
+      hwndMainDialogBox = WinQuerySecondaryHWND(hwndFrame, QS_DIALOG);
+      WinShowWindow( hwndFrame, TRUE );
+      hpProgramIcon =
+        WinLoadPointer(
+                       HWND_DESKTOP,
+                       (HMODULE) NULL,              /* Resource is kept in .Exe file. */
+                       ID_ICONVOLUME );                   /* Which icon to use.             */
+      WinSendMsg(
+                 hwndFrame,                    /* Dialog window handle.                 */
+                 WM_SETICON,              /* Message to the dialog.  Set it's icon.*/
+                 (MPARAM) hpProgramIcon,
+                 (MPARAM) 0 );            /* mp2 no value.                         */
+      WinPostMsg( WinWindowFromID(hwndFrame, IDCS_VOLUME),
+                  CSM_SETVALUE,
+                  (MPARAM) queryMasterVolume(),
+                  (MPARAM) NULL);
+      while ( WinGetMsg( hab, (PQMSG) &qmsg, (HWND) NULL, 0, 0) )
+        WinDispatchMsg( hab, (PQMSG) &qmsg );
+#endif
+      freeResHandle();
+      WinDestroyMsgQueue(hmq);
+    }
+    WinTerminate(hab);
+  }
+  return 0;
+}
+
+
+
+
+
+
+
+
+
+
+
+
Index: /tags/CWMM-0.3.0_GA/classes/mm-progs/master_volume/volume.h
===================================================================
--- /tags/CWMM-0.3.0_GA/classes/mm-progs/master_volume/volume.h	(revision 213)
+++ /tags/CWMM-0.3.0_GA/classes/mm-progs/master_volume/volume.h	(revision 213)
@@ -0,0 +1,24 @@
+#define IDSTR_CONVERTCHANNELS     1614
+#define IDSTR_CONVERTSAMPLERATE   1615
+#define IDSTR_CONVERTPLAYTIME     1616
+#define IDSTR_CONVERTDIALOGERROR  1617
+#define IDSTR_CONVERTNOSPACETITLE 1618
+#define IDSTR_CONVERTNOSPACETEXT  1619
+#define IDSTR_INSTALLERRORTITLE   1620
+
+#define IDDLG_CONVERT               300
+#define IDGB_CONVERT                301
+#define IDST_CONVERTNAMELABEL       302
+#define IDST_CONVERTNAME            303
+#define IDST_CONVERTSAMPLERATE      304
+#define IDST_CONVERTCHANNELS        305
+#define IDST_CONVERTCDBITS          306
+#define IDST_CONVERTCDSAMPLELABEL   307
+#define IDST_CONVERTCDCHANNELSLABEL 308
+#define IDST_CONVERTPLAYTIME        309
+#define IDEF_CONVERTTARGETNAME      310
+#define IDPB_CONVERTBROWSE          311
+#define IDBAR_CONVERTPROGRESS       312
+#define IDPB_CONVERTOK              313
+#define IDPB_CONVERTABORT           314
+#define IDPB_CONVERTCLOSE           315
Index: /tags/CWMM-0.3.0_GA/classes/mm-progs/master_volume/volume.rc
===================================================================
--- /tags/CWMM-0.3.0_GA/classes/mm-progs/master_volume/volume.rc	(revision 213)
+++ /tags/CWMM-0.3.0_GA/classes/mm-progs/master_volume/volume.rc	(revision 213)
@@ -0,0 +1,8 @@
+#ifndef OS2_INCLUDED
+   #include <os2.h>
+#endif
+#include "mmres.h"
+
+ICON ID_ICONVOLUME   "volume.ico"
+
+
Index: /tags/CWMM-0.3.0_GA/classes/mm-progs/master_volume/volumeres.h
===================================================================
--- /tags/CWMM-0.3.0_GA/classes/mm-progs/master_volume/volumeres.h	(revision 213)
+++ /tags/CWMM-0.3.0_GA/classes/mm-progs/master_volume/volumeres.h	(revision 213)
@@ -0,0 +1,3 @@
+#define ID_ICONVOLUME 1
+
+
Index: /tags/CWMM-0.3.0_GA/classes/mm-progs/mmfind/def.tpl
===================================================================
--- /tags/CWMM-0.3.0_GA/classes/mm-progs/mmfind/def.tpl	(revision 213)
+++ /tags/CWMM-0.3.0_GA/classes/mm-progs/mmfind/def.tpl	(revision 213)
@@ -0,0 +1,22 @@
+# Note: lines starting with '#' are comments.
+
+[DESCRIPTION]
+PM-Program for MM file searching
+
+[COPYRIGHT]
+(c) C. Wohlgemuth 2004-2005 Netlabs CWMM Team 2023
+
+[AUTHOR]
+Netlabs CWMM Team
+
+[NAME]
+# This is the NAME xxx WINDOWAPI|etc line in the def file.
+# Important: it specifies the internal name of the program. Don't leave out!
+NAME MMFIND WINDOWAPI
+
+[BUILDMACHINE]
+Zobopeep
+
+[OTHER]
+# Add all the lines here you want to have at the end of the generated DEF file
+STACKSIZE    1638400
Index: /tags/CWMM-0.3.0_GA/classes/mm-progs/mmfind/image.c
===================================================================
--- /tags/CWMM-0.3.0_GA/classes/mm-progs/mmfind/image.c	(revision 213)
+++ /tags/CWMM-0.3.0_GA/classes/mm-progs/mmfind/image.c	(revision 213)
@@ -0,0 +1,377 @@
+
+#define INCL_OS2MM
+#define INCL_MMIOOS2
+#define INCL_GPI
+
+#include <os2.h>
+#include "os2me.h"
+#include "common.h"
+#include "mmres.h"
+
+extern HAB globalHab;
+extern BITMAPINFOHEADER2 bmpInfoHeader2;
+extern HBITMAP hBitmap;
+
+void showImageControls(HWND hwnd, BOOL bShow)
+{
+  /* Preview area */
+  WinShowWindow(WinWindowFromID(hwnd, IDSR_IMGPREVIEW), bShow);
+  /* Group box */
+  WinShowWindow(WinWindowFromID(hwnd, IDGB_PREVIEW), bShow);
+}
+
+VOID DrawBitmap ( HWND hwnd )
+{
+    SWP    swp;
+    POINTL aptl[4];
+    HPS    hps;
+    ULONG  ulHeight;
+    ULONG  ulWidth;
+    RECTL rectl;
+
+    hps = WinBeginPaint ( hwnd,
+                          0,
+                          NULL);
+    /*
+     *  Get position of image frame
+     */
+    WinQueryWindowPos ( hwnd, &swp);
+
+    WinQueryWindowRect(hwnd, &rectl);
+    WinFillRect(hps, &rectl, CLR_WHITE);
+    /* Center image */
+    ulHeight = bmpInfoHeader2.cy;
+    ulWidth = bmpInfoHeader2.cx;
+    if(ulWidth <=swp.cx && ulHeight <= swp.cy)
+      {
+        aptl[0].x=(swp.cx-ulWidth)/2;
+        aptl[1].x=aptl[0].x+ulWidth;
+
+        aptl[0].y=(swp.cy-ulHeight)/2;
+        aptl[1].y=aptl[0].y+ulHeight;
+      }
+    else {
+      float fWidth, fHeight, fRes;
+
+      fWidth=(float)swp.cx/(float)ulWidth;
+      fHeight=(float)swp.cy/(float)ulHeight;
+      fRes=( fWidth>fHeight ? fHeight : fWidth);
+
+
+      aptl[0].x=(swp.cx-ulWidth*fRes)/2;
+      aptl[1].x=aptl[0].x+ulWidth*fRes;
+
+      aptl[0].y=(swp.cy-ulHeight*fRes)/2;
+      aptl[1].y=aptl[0].y+ulHeight*fRes;
+    }
+
+    aptl[2].x = 0;              // source lower left
+    aptl[2].y = 0;
+
+    aptl[3].x = ulWidth;   // source upper right
+    aptl[3].y = ulHeight;
+
+    /*
+     *  Call GpiBitBlt and supply 4 aptl structures.  This tells
+     *  it to stretch or compress the bitmap depending on what is
+     *  in the aptl structures.  See above lines for their current
+     *  settings.
+     */
+
+    WinDrawBitmap(hps, hBitmap, NULLHANDLE, (PPOINTL)aptl, 0, 0, DBM_NORMAL|DBM_STRETCH);
+
+#if 0
+    aptl[0].x=0;
+    aptl[0].y=0;
+    //aptl[1].x=100;
+    //aptl[1].y=100;
+    //       WinDrawBitmap(hps, hBitmap, NULLHANDLE, (PPOINTL)aptl, 0, 0, DBM_NORMAL/*|DBM_STRETCH*/);
+#endif
+    WinEndPaint (hps);
+}
+
+MRESULT EXPENTRY bmpPreviewProc(HWND hwnd, ULONG msg, MPARAM mp1, MPARAM mp2)
+{
+
+  switch (msg)
+    {
+    case WM_PAINT:
+      {
+        if (!WinIsWindowVisible(hwnd))
+          {
+            return((MRESULT)NULL);
+          }
+        DrawBitmap(hwnd);
+        return MRTRUE;
+      }
+    default:
+      break;
+    }
+  return WinDefWindowProc( hwnd, msg, mp1, mp2);
+}
+
+
+#if 0
+/*
+  Load an image file using IO-Procs
+  */
+HBITMAP loadBitmap ( PSZ pszFileName, PBITMAPINFOHEADER2 pBMPInfoHeader2)
+{
+    HBITMAP       hbm;
+    MMIOINFO      mmioinfo;
+        MMFORMATINFO  mmFormatInfo;
+    HMMIO         hmmio;
+        ULONG         ulImageHeaderLength;
+        MMIMAGEHEADER mmImgHdr;
+    ULONG         ulBytesRead;
+    ULONG         dwNumRowBytes;
+    PBYTE         pRowBuffer;
+    ULONG         dwRowCount;
+    SIZEL         ImageSize;
+    ULONG         dwHeight, dwWidth;
+    SHORT          wBitCount;
+    FOURCC        fccStorageSystem;
+    ULONG         dwPadBytes;
+    ULONG         dwRowBits;
+    ULONG         ulReturnCode;
+    ULONG         dwReturnCode;
+    HBITMAP       hbReturnCode;
+    LONG          lReturnCode;
+    FOURCC        fccIOProc;
+    HDC           hdc;
+    HPS           hps;
+
+
+    ulReturnCode = mmioIdentifyFile ( pszFileName,
+                                      0L,
+                                      &mmFormatInfo,
+                                      &fccStorageSystem,
+                                      0L,
+                                      0L);
+    /*
+     *  If this file was NOT identified, then this function won't
+     *  work, so return an error by indicating an empty bitmap.
+     */
+    if ( ulReturnCode == MMIO_ERROR )
+    {
+      //      showMsgBox(IDSTR_CWIMAGETITLE, IDSTR_NOIMGIOPROCERROR, queryModuleHandle());
+      return (0L);
+    }
+
+    /*
+     *  If mmioIdentifyFile did not find a custom-written IO proc which
+     *  can understand the image file, then it will return the DOS IO Proc
+     *  info because the image file IS a DOS file.
+     */
+    if( mmFormatInfo.fccIOProc == FOURCC_DOS )
+    {
+      //      showMsgBox(IDSTR_CWIMAGETITLE, IDSTR_NOIMGIOPROCERROR, queryModuleHandle());
+      return ( 0L );
+    }
+    /*
+     *  Ensure this is an IMAGE IOproc, and that it can read
+     *  translated data
+     */
+    if ( (mmFormatInfo.ulMediaType != MMIO_MEDIATYPE_IMAGE) ||
+         ((mmFormatInfo.ulFlags & MMIO_CANREADTRANSLATED) == 0) )
+    {
+      //      showMsgBox(IDSTR_CWIMAGETITLE, IDSTR_NOIMGIOPROCERROR, queryModuleHandle());
+      return (0L);
+    }
+    else
+    {
+         fccIOProc = mmFormatInfo.fccIOProc;
+    }
+
+    /* Clear out and initialize mminfo structure */
+    memset ( &mmioinfo, 0L, sizeof ( MMIOINFO ) );
+    mmioinfo.fccIOProc = fccIOProc;
+    mmioinfo.ulTranslate = MMIO_TRANSLATEHEADER | MMIO_TRANSLATEDATA;
+    hmmio = mmioOpen ( (PSZ) pszFileName,
+                       &mmioinfo,
+                       MMIO_READ | MMIO_DENYWRITE | MMIO_NOIDENTIFY );
+    if ( ! hmmio )
+    {
+      // If file could not be opened, return with error
+      //    showMsgBox(IDSTR_CWIMAGETITLE, IDSTR_OPENFILEERROR, queryModuleHandle());
+      return (0L);
+    }
+
+
+    dwReturnCode = mmioQueryHeaderLength ( hmmio,
+                                         (PLONG)&ulImageHeaderLength,
+                                           0L,
+                                           0L);
+    if ( ulImageHeaderLength != sizeof ( MMIMAGEHEADER ) )
+    {
+      /* We have a problem.....possibly incompatible versions */
+      ulReturnCode = mmioClose (hmmio, 0L);
+      //      showMsgBox(IDSTR_CWIMAGETITLE, IDSTR_NOIMGIOPROCERROR);
+      return (0L);
+    }
+
+    ulReturnCode = mmioGetHeader ( hmmio,
+                                   &mmImgHdr,
+                                   (LONG) sizeof ( MMIMAGEHEADER ),
+                                   (PLONG)&ulBytesRead,
+                                   0L,
+                                   0L);
+
+    if ( ulReturnCode != MMIO_SUCCESS )
+    {
+      /* Header unavailable */
+      ulReturnCode = mmioClose (hmmio, 0L);
+      return (0L);
+    }
+
+    /*!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!*/
+    *pBMPInfoHeader2=mmImgHdr.mmXDIBHeader.BMPInfoHeader2;
+
+    /*
+     *  Determine the number of bytes required, per row.
+     *      PLANES MUST ALWAYS BE = 1
+     */
+    dwHeight = mmImgHdr.mmXDIBHeader.BMPInfoHeader2.cy;
+    dwWidth = mmImgHdr.mmXDIBHeader.BMPInfoHeader2.cx;
+    wBitCount = mmImgHdr.mmXDIBHeader.BMPInfoHeader2.cBitCount;
+    dwRowBits = dwWidth * mmImgHdr.mmXDIBHeader.BMPInfoHeader2.cBitCount;
+    dwNumRowBytes = dwRowBits >> 3;
+
+    /*
+     *  Account for odd bits used in 1bpp or 4bpp images that are
+     *  NOT on byte boundaries.
+     */
+    if ( dwRowBits % 8 )
+    {
+         dwNumRowBytes++;
+    }
+    /*
+     *  Ensure the row length in bytes accounts for byte padding.
+     *  All bitmap data rows must are aligned on LONG/4-BYTE boundaries.
+     *  The data FROM an IOProc should always appear in this form.
+     */
+    dwPadBytes = ( dwNumRowBytes % 4 );
+    if ( dwPadBytes )
+    {
+         dwNumRowBytes += 4 - dwPadBytes;
+    }
+
+    /* Allocate space for ONE row of pels */
+    if ( DosAllocMem( (PPVOID)&pRowBuffer,
+                      (ULONG)dwNumRowBytes,
+                      fALLOC))
+    {
+      ulReturnCode = mmioClose (hmmio, 0L);
+      //    showMsgBox(IDSTR_CWIMAGETITLE, IDSTR_NOMEMERROR, queryModuleHandle());
+      return(0L);
+    }
+
+    /* Create a device context */
+    hdc=DevOpenDC(globalHab, OD_MEMORY,"*",0L, NULL, NULLHANDLE);
+    if(hdc==NULLHANDLE)
+      {
+        DosFreeMem(pRowBuffer);
+        mmioClose (hmmio, 0L);
+        return(0L);
+      }
+
+
+    // ***************************************************
+    // Create a memory presentation space that includes
+    // the memory device context obtained above.
+    // ***************************************************
+
+    ImageSize.cx = dwWidth;
+    ImageSize.cy = dwHeight;
+
+    hps = GpiCreatePS ( globalHab,
+                        hdc,
+                        &ImageSize,
+                        PU_PELS | GPIT_NORMAL | GPIA_ASSOC );
+    //                        PU_PELS | GPIF_DEFAULT | GPIT_MICRO | GPIA_ASSOC );
+    if ( !hps )
+      {
+#ifdef DEBUG
+        WinMessageBox( HWND_DESKTOP, HWND_DESKTOP,
+                       "No HPS...",
+                       "Open Image File",
+                       (HMODULE) NULL,
+                       (ULONG) MB_OK | MB_MOVEABLE |
+                       MB_ERROR );
+#endif
+        DevCloseDC(hdc);
+        DosFreeMem(pRowBuffer);
+        mmioClose (hmmio, 0L);
+        return(0L);
+      }
+
+    //    GpiSelectPalette(hps, NULLHANDLE);
+    // ***************************************************
+    // Create an uninitialized bitmap.  This is where we
+    // will put all of the bits once we read them in.
+    // ***************************************************
+    hbm = GpiCreateBitmap ( hps,
+                            pBMPInfoHeader2,
+                            0L,
+                            NULL,
+                            NULL);
+
+    if ( !hbm )
+    {
+#ifdef DEBUG
+      WinMessageBox( HWND_DESKTOP, HWND_DESKTOP,
+                     "No HBITMAP...",
+                     "Open Image File",
+                     (HMODULE) NULL,
+                     (ULONG) MB_OK | MB_MOVEABLE |
+                     MB_ERROR );
+#endif
+      GpiDestroyPS(hps);
+      DevCloseDC(hdc);
+      DosFreeMem(pRowBuffer);
+      ulReturnCode = mmioClose (hmmio, 0L);
+      return(0L);
+    }
+
+    // ***************************************************
+    // Select the bitmap into the memory device context.
+    // ***************************************************
+    hbReturnCode = GpiSetBitmap ( hps,
+                                  hbm );
+
+    //***************************************************************
+    //  LOAD THE BITMAP DATA FROM THE FILE
+    //      One line at a time, starting from the BOTTOM
+    //*************************************************************** */
+
+    for ( dwRowCount = 0; dwRowCount < dwHeight; dwRowCount++ )
+    {
+         ulBytesRead = (ULONG) mmioRead ( hmmio,
+                                          pRowBuffer,
+                                          dwNumRowBytes );
+         if ( !ulBytesRead )
+         {
+              break;
+         }
+         /*
+          *  Allow context switching while previewing.. Couldn't get
+          *  it to work. Perhaps will get to it when time is available...
+          */
+         lReturnCode = GpiSetBitmapBits ( hps,
+                                          (LONG) dwRowCount,
+                                          (LONG) 1,
+                                          (PBYTE) pRowBuffer,
+                                          (PBITMAPINFO2) pBMPInfoHeader2);
+    }
+
+    /* Clean up */
+    hbReturnCode = GpiSetBitmap ( hps,
+                                  NULLHANDLE );
+    ulReturnCode = mmioClose (hmmio, 0L);
+    DosFreeMem(pRowBuffer);
+    GpiDestroyPS(hps);
+    DevCloseDC(hdc);
+
+    return(hbm);
+}
+#endif
Index: /tags/CWMM-0.3.0_GA/classes/mm-progs/mmfind/makefile
===================================================================
--- /tags/CWMM-0.3.0_GA/classes/mm-progs/mmfind/makefile	(revision 213)
+++ /tags/CWMM-0.3.0_GA/classes/mm-progs/mmfind/makefile	(revision 213)
@@ -0,0 +1,38 @@
+# Makefile
+
+include ../../../make.inc
+include ../mmprog.inc
+
+LIBOBJECTS	=	$(LIBDIR)/helper.obj \
+			$(LIBDIR)/message.obj \
+			$(LIBDIR)/sys_funcs.obj \
+			$(LIBDIR)/window_funcs.obj \
+			$(LIBDIR)/img_funcs.obj \
+			$(LIBDIR)/ini_funcs.obj
+
+
+OBJECTS		=	image.obj	
+
+
+all:	mmfind.exe
+
+mmfind.exe:	mmfind.c $(LIBOBJECTS) $(OBJECTS) makefile mmfind.rc def.tpl
+#Use this command to link dynamicaly
+	cmd /C $(TOOLDIR)\create_def.cmd mmfind.def
+	icc $(CPPFLAGS) -I$(INC) mmfind.c $(LIBOBJECTS) $(OBJECTS) mmpm2.lib rexx.lib mmfind.def
+	rc mmfind.rc mmfind.exe
+
+clean:
+	-rm *.exe
+	-rm *.dll
+	-rm *.obj
+	-rm *.RES
+	-rm *.ini
+	-rm *.def
+
+cleaner:
+	-rm *.*~
+	-rm *.flc
+
+
+distribution:
Index: /tags/CWMM-0.3.0_GA/classes/mm-progs/mmfind/mmfind.c
===================================================================
--- /tags/CWMM-0.3.0_GA/classes/mm-progs/mmfind/mmfind.c	(revision 213)
+++ /tags/CWMM-0.3.0_GA/classes/mm-progs/mmfind/mmfind.c	(revision 213)
@@ -0,0 +1,1096 @@
+/*
+ * mmfind.c (C) Chris Wohlgemuth 2004-2005
+ *
+ */
+/*
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; see the file COPYING.  If not, write to
+ * the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+/*
+ * If you need another license for your project/product (commercial,
+ * noncommercial, whatever) contact me at
+ *
+ * http://www.os2world.com/cdwriting
+ * http://www.geocities.com/SiliconValley/Sector/5785/
+ *
+ */
+
+#define INCL_DOS
+#define INCL_DOSFILEMGR
+#define INCL_DOSERRORS
+#define INCL_WIN
+#define INCL_WINWORKPLACE
+#define INCL_OS2MM
+#define INCL_MMIOOS2
+#define INCL_MCIOS2
+#define INCL_GPI
+#define INCL_PM
+#define INCL_REXXSAA
+
+/* OS/2 and compiler includes */
+#include <os2.h>
+#include <sys\types.h>
+#include <sys\stat.h>
+#include <stdio.h>
+#include <string.h>
+#include <stdlib.h>
+#include <rexxsaa.h> 
+#include "os2me.h"
+/* CW toolkit includes */
+#include "sys_funcs.h"
+#include "message_funcs.h"
+#include "window_funcs.h"
+#include "img_funcs.h"
+#include "ini_funcs.h"
+/* Program includes */
+#include "common.h"
+#include "mmres.h"                 /* Ressource IDs */
+#include "mmprogs_defaults.h"
+//#define DEBUG
+#include "mmfind.h"                /* mmfind specific defines */
+
+char logName[]="mmfind.log"; /* To keep some (unused) helpers in helper.c happy */
+
+char chrIniFile[CCHMAXPATH];
+char chrInstallDir[CCHMAXPATH];
+
+char chrLastAudioDir[CCHMAXPATH];
+char chrLastVideoDir[CCHMAXPATH];
+char chrLastImageDir[CCHMAXPATH];
+
+/***** For previewing audio tracks *****/
+char chrSourceName[CCHMAXPATH]; /* The audio file to be played */
+BOOL bIsMidi=FALSE;             /* No MIDI support atm */
+BOOL bIsPlaying=FALSE;          /* TRUE if currently playing */
+BOOL bPaused=FALSE;
+ULONG ulPos;
+ULONG ulTotalLength;
+HWND hwndPlayer;                /* HWND of the player object window used for async coommunication */
+
+/***************************************/
+
+#define NUMPARAMS  1
+/*
+  argv[0]: progname
+ */
+int numArgs;
+char* params[NUMPARAMS];
+
+HMODULE RESSOURCEHANDLE=0;
+
+char chrMediaFileTypes[NUMMEDIATYPES][100];
+
+char chrMediaFileExt[NUMMEDIATYPES][EXT_STRING_LENGTH]= {"*.AIF;*.AU;*.FLA;*.FLAC;*.IFF;*.MID;*.MP3;*.OGG;*.SND;*.VOC;*.WAV;*._AU",
+                                          /* The image extensions are queried using the imageext.rx and imageadd.rx scripts */
+                                          "*.BMP;*.DIB;*.GIF;*.JPG;*.PCX;*.PNG;*.PCD;*.TIF;*.TGA;*.VID;*._IM",
+                                          "*.AVI;*.MPG;*.FLI;*.FLC;*.MOV;*.QT;*.VBS"};
+/* Additional audio extensions to be queried during runtime */
+char chrAdditionalExt[200];
+/* This holds the template used when building the audio information text */
+char audioText[255];
+
+int iMediaType=MT_AUDIO;
+static void _loadButtonBmps(void);
+
+/* BMP stuff for preview */
+BITMAPINFOHEADER2 bmpInfoHeader2;
+HBITMAP hBitmap;
+
+/* HBITMAP for the play control buttons */
+HBITMAP hbmPlay;
+HBITMAP hbmStop;
+
+FILEDLG fd = { 0 };
+
+static void _loadButtonBmps()
+{
+  HPS hps;
+  HMODULE hResource;
+
+  hResource=NULLHANDLE;
+  hps=WinGetPS(HWND_DESKTOP);
+
+  /* Play */
+  hbmPlay=GpiLoadBitmap(hps, hResource, IDBMP_PLAY, 0, 0);
+
+  /* Stop */
+  hbmStop=GpiLoadBitmap(hps, hResource, IDBMP_STOP, 0, 0);
+
+  WinReleasePS(hps);
+}
+
+static void changeButtons(HWND hwnd)
+{
+  HWND hwndTemp;
+  BTNCDATA btCtrl;
+  WNDPARAMS wndParams;
+  ULONG ulStyle;
+
+  if(hbmPlay) {
+    hwndTemp=WinWindowFromID(hwnd, IDPB_MMFINDPLAY);
+
+    /* Change Style to bitmap */
+    ulStyle=WinQueryWindowULong(hwndTemp,QWL_STYLE);
+    ulStyle|=(BS_BITMAP);
+    ulStyle&=~BS_TEXT;
+
+    if(WinSetWindowULong(hwndTemp, QWL_STYLE, ulStyle)) {
+      memset(&btCtrl, 0, sizeof(btCtrl));
+      btCtrl.cb=sizeof(btCtrl);
+      btCtrl.hImage=hbmPlay;
+      memset(&wndParams, 0, sizeof(wndParams));
+      wndParams.fsStatus=WPM_CTLDATA;
+      wndParams.cbCtlData=btCtrl.cb;
+      wndParams.pCtlData=&btCtrl;
+      WinSendMsg(hwndTemp,WM_SETWINDOWPARAMS,
+                 MPFROMP(&wndParams),0);
+    }
+  }
+
+  if(hbmStop) {
+    hwndTemp=WinWindowFromID(hwnd, IDPB_MMFINDSTOP);
+    /* Change Style to bitmap */
+    ulStyle=WinQueryWindowULong(hwndTemp,QWL_STYLE);
+    ulStyle|=(BS_BITMAP);
+    ulStyle&=~BS_TEXT;
+
+    if(WinSetWindowULong(hwndTemp, QWL_STYLE, ulStyle)) {
+      memset(&btCtrl, 0, sizeof(btCtrl));
+      btCtrl.cb=sizeof(btCtrl);
+      btCtrl.hImage=hbmStop;
+      memset(&wndParams, 0, sizeof(wndParams));
+      wndParams.fsStatus=WPM_CTLDATA;
+      wndParams.cbCtlData=btCtrl.cb;
+      wndParams.pCtlData=&btCtrl;
+      WinSendMsg(hwndTemp,WM_SETWINDOWPARAMS,
+                 MPFROMP(&wndParams),0);
+    }
+  }
+}
+
+static char* translateChars(char * chrString, char chrFrom, char chrTo)
+{
+  char *chr=chrString;
+
+  if(chrTo == '\0' || chrFrom=='\0'|| chrString==NULLHANDLE)
+    return NULLHANDLE;
+
+  while(*chr)
+    {
+      if(*chr==chrFrom)
+        *chr=chrTo;
+
+      chr++;
+    }
+  return chrString;
+}
+
+static void loadStringsFromResourceDLL(HMODULE hResMod)
+{
+  if(!MsgGetMessage(audioText, IDSTR_AUDIOINFOTEXT, sizeof(audioText), hResMod,HWND_DESKTOP))
+    strcpy(audioText, TEXT_INFOTEXT);
+  if(!MsgGetMessage(chrMediaFileTypes[MT_AUDIO], IDSTR_TYPEAUDIO,
+                 sizeof(chrMediaFileTypes[MT_AUDIO]), hResMod, HWND_DESKTOP))
+    strcpy(chrMediaFileTypes[MT_AUDIO], TEXT_TYPEAUDIO);
+  if(!MsgGetMessage(chrMediaFileTypes[MT_IMAGE], IDSTR_TYPEIMAGE,
+                 sizeof(chrMediaFileTypes[MT_IMAGE]), hResMod, HWND_DESKTOP))
+    strcpy(chrMediaFileTypes[MT_AUDIO], TEXT_TYPEIMAGE);
+  if(!MsgGetMessage(chrMediaFileTypes[MT_VIDEO], IDSTR_TYPEVIDEO,
+                 sizeof(chrMediaFileTypes[MT_VIDEO]), hResMod, HWND_DESKTOP))
+    strcpy(chrMediaFileTypes[MT_VIDEO], TEXT_TYPEVIDEO);
+}
+
+static void showVideoControls(HWND hwnd, BOOL bShow)
+{
+  /* Preview area */
+  WinShowWindow(WinWindowFromID(hwnd, IDST_NOPREVIEWAVAILABLE), bShow);
+  /* Group box */
+  WinShowWindow(WinWindowFromID(hwnd, IDGB_PREVIEW), bShow);
+}
+
+
+static void enableAudioPlayControls(HWND hwnd, BOOL bEnable)
+{
+    WinEnableWindow(WinWindowFromID(hwnd, IDPB_MMFINDPAUSE), bEnable);
+    WinEnableWindow(WinWindowFromID(hwnd, IDPB_MMFINDPLAY), bEnable);
+    WinEnableWindow(WinWindowFromID(hwnd, IDPB_MMFINDSTOP), bEnable);
+}
+
+void showAudioControls(HWND hwnd, BOOL bShow)
+{
+  /* Preview area */
+  WinShowWindow(WinWindowFromID(hwnd, IDST_AUDIOINFO), bShow);
+  /* Group box */
+  WinShowWindow(WinWindowFromID(hwnd, IDGB_AUDIOINFO), bShow);
+  /* Playcontrols */
+  WinShowWindow(WinWindowFromID(hwnd, IDPB_MMFINDPLAY), bShow);
+  WinShowWindow(WinWindowFromID(hwnd, IDPB_MMFINDSTOP), bShow);
+  WinShowWindow(WinWindowFromID(hwnd, IDPB_MMFINDPAUSE), bShow);
+  if(bShow) {
+    WinSetWindowToTop(WinWindowFromID(hwnd, IDPB_MMFINDPAUSE));
+    WinSetWindowToTop(WinWindowFromID(hwnd, IDPB_MMFINDPLAY));
+    WinSetWindowToTop(WinWindowFromID(hwnd, IDPB_MMFINDSTOP));
+    enableAudioPlayControls(hwnd, FALSE);
+  }
+}
+
+BOOL pauseAudioFile(HWND hwndNotify)
+{
+#if 0
+  char chrCommand[50];
+  char retMsg[100];
+  ULONG rc;
+
+  iWavePriv=ulPid;
+
+  if(bPaused) {
+    sprintf(chrCommand,"RESUME wave%d wait", hwndNotify);
+    rc = mciSendString(chrCommand, retMsg, sizeof(retMsg), 0, 0);
+    bPaused=FALSE;
+    showPlayTimeDisplay( hwndFrame, TRUE);
+  }
+  else {
+    sprintf(chrCommand,"PAUSE wave%d wait", iWavePriv);
+    rc = mciSendString(chrCommand, retMsg, sizeof(retMsg), 0, 0);
+    bPaused=TRUE;
+  }
+#endif
+  return TRUE;
+}
+
+BOOL stopAudioFile(HWND hwndNotify)
+{
+  char chrCommand[50];
+  char retMsg[100];
+
+  if(bIsPlaying) {
+    sprintf(chrCommand,"stop wave%ld wait", hwndNotify);
+    mciSendString(chrCommand, retMsg, sizeof(retMsg), 0, 0);
+
+    sprintf(chrCommand,"close wave%ld wait", hwndNotify);
+    mciSendString(chrCommand, retMsg, sizeof(retMsg), 0, 0);
+
+#if 0
+    _resetDisplay(hwndFrame);
+    showPlayTimeDisplay( hwndFrame, TRUE);
+    WinStopTimer(WinQueryAnchorBlock(hwndFrame), hwndFrame, IDTIMER_PLAY);
+#endif
+    bIsPlaying=FALSE;
+    bPaused=FALSE;
+  }
+
+  return TRUE;
+}
+
+ULONG playAudioFile(HWND hwndFrame)
+{
+  char chrCommand[CCHMAXPATH*2];
+  char chrDevice[30];
+  char retMsg[20];
+  ULONG rc;
+  int iTime2;
+  HWND hwndNotify;
+
+  hwndNotify=hwndFrame;//WinWindowFromID(hwndTop, IDDLG_TOPMIDDLE);
+
+  if(bPaused)
+    {
+      pauseAudioFile(hwndFrame);
+      return 1;
+    }
+
+  ulPos=0;
+
+  stopAudioFile(hwndFrame);
+
+  if(bIsMidi)
+    strncpy(chrDevice,"SEQUENCER", sizeof(chrDevice) - 1);
+  else
+    strncpy(chrDevice,"WAVEAUDIO", sizeof(chrDevice) - 1);
+
+  /* Start audio file */
+  sprintf(chrCommand,"open \"%s\"  type %s alias wave%ld SHAREABLE wait", chrSourceName, chrDevice, hwndNotify);
+
+
+  rc = mciSendString(chrCommand, retMsg, sizeof(retMsg), hwndNotify, 0);
+  if((rc & 0x0000ffff)!=MCIERR_SUCCESS)
+    return 0;
+
+  /* Set time format */
+  sprintf(chrCommand,"SET wave%ld TIME FORMAT MILLISECONDS wait", hwndNotify);
+  rc = mciSendString(chrCommand, retMsg, sizeof(retMsg), 0, 0);
+  if((rc & 0x0000ffff)!=MCIERR_SUCCESS) {
+    sprintf(chrCommand,"close wave%ld wait", hwndNotify);
+    rc = mciSendString(chrCommand, retMsg, sizeof(retMsg), 0, 0);
+    return 0;
+  }
+
+#if 0
+  sprintf(chrCommand,"SETPOSITIONADVISE wave%d ON EVERY 1000 notify", iWavePriv);
+  rc = mciSendString(chrCommand, retMsg, sizeof(retMsg),hwndNotify, 0);
+  if((rc & 0x0000ffff)!=MCIERR_SUCCESS) {
+    sprintf(chrCommand,"close wave%d wait",iWavePriv);
+    rc = mciSendString(chrCommand, retMsg, sizeof(retMsg), 0, 0);
+    return 0;
+  }
+#endif
+
+  /* Get wave length in ms */
+  iTime2=0;
+  sprintf(chrCommand,"STATUS wave%ld LENGTH WAIT", hwndNotify);
+  rc = mciSendString(chrCommand, retMsg, sizeof(retMsg), 0, 0);
+  if((rc & 0x0000ffff)==MCIERR_SUCCESS) {
+    iTime2=atoi(retMsg);
+    sprintf(chrCommand,"%d:%02d  %d:%02d  -%d:%02d",iTime2/1000/60,(iTime2/1000)%60,
+            0, 0,
+            iTime2/1000/60,(iTime2/1000)%60);
+  }
+  ulTotalLength=iTime2;
+
+#if 0
+  /* Set volume */
+  sprintf(chrCommand,"SET wave%ld AUDIO VOLUME %ld wait", hwndFrame, ulVolume);
+  rc = mciSendString(chrCommand, retMsg, sizeof(retMsg), 0, 0);
+  if((rc & 0x0000ffff)!=MCIERR_SUCCESS) {
+    sprintf(chrCommand,"close wave%d",iWavePriv);
+    rc = mciSendString(chrCommand, retMsg, sizeof(retMsg), 0, 0);
+    return 0;
+  }
+#endif
+
+  sprintf(chrCommand,"play wave%ld FROM 0", hwndNotify);
+  rc = mciSendString(chrCommand, retMsg, sizeof(retMsg), 0, 0);
+  if((rc & 0x0000ffff)!=MCIERR_SUCCESS) {
+    sprintf(chrCommand,"close wave%ld", hwndNotify);
+    rc = mciSendString(chrCommand, retMsg, sizeof(retMsg), 0, 0);
+    return 0;
+  }
+
+#if 0
+  WinStartTimer(WinQueryAnchorBlock(hwndFrame), hwndFrame, IDTIMER_PLAY, PLAYTIMER_DELAY);
+#endif
+
+  bIsPlaying=TRUE;
+
+  return 1;
+}
+
+static MRESULT EXPENTRY playObjectProc(HWND hwnd, ULONG msg, MPARAM mp1, MPARAM mp2)
+{
+  switch (msg)
+    {
+    case WM_APPTERMINATENOTIFY:
+      {
+
+        HWND hwndFrame=HWNDFROMMP(mp2);
+        switch(LONGFROMMP(mp1))
+          {
+          case PLAY_FILE:
+            playAudioFile(hwndFrame);
+            break;
+          case STOP_TRACK:
+            stopAudioFile(hwndFrame);
+            break;
+          case PAUSE_TRACK:
+            pauseAudioFile(hwndFrame);
+            break;
+          default:
+            break;
+          }
+        return (MRESULT)0;
+      }
+    case WM_CLOSE:
+
+      break;
+    default:
+      break;
+    }
+  return WinDefWindowProc( hwnd, msg, mp1, mp2);
+}
+
+/* Every folder has one running play thread to handle play commands */
+void playThreadFunc (void *arg)
+{
+  HAB  hab;
+  HMQ  hmq;
+  QMSG qmsg;
+  HWND hwndNotify=(HWND)arg;
+
+  hab=WinInitialize(0);
+  if(hab) {
+    hmq=WinCreateMsgQueue(hab,0);
+    if(hmq) {
+      HWND hwndPlayObject;
+      hwndPlayObject=WinCreateWindow(HWND_OBJECT,WC_STATIC,"MMAudioPlayObj",
+                                     0,0,0,0,0,NULLHANDLE,HWND_BOTTOM,13343,NULL,NULL);
+      if(hwndPlayObject) {
+        WinSubclassWindow(hwndPlayObject,&playObjectProc);
+        /* Window created. */
+        WinPostMsg(hwndNotify, WM_APPTERMINATENOTIFY, MPFROMSHORT(MMAUDIO_PLAYER_CREATED),
+                   MPFROMHWND(hwndPlayObject));
+        while(WinGetMsg(hab,&qmsg,(HWND)NULL,0,0))
+          WinDispatchMsg(hab,&qmsg);
+
+        WinDestroyWindow(hwndPlayObject);
+      }
+      WinDestroyMsgQueue(hmq);
+    }
+    WinTerminate(hab);
+  }
+}
+
+
+void MMAudioPlayFile(HWND hwndPlayer, HWND hwndNotify, char* chrFile)
+{
+  WinPostMsg(hwndPlayer, WM_APPTERMINATENOTIFY, MPFROMSHORT(PLAY_FILE), MPFROMHWND(hwndNotify));
+}
+
+void MMAudioStop(HWND hwndPlayer, HWND hwndNotify)
+{
+  WinPostMsg(hwndPlayer, WM_APPTERMINATENOTIFY, MPFROMSHORT(STOP_TRACK), MPFROMHWND(hwndNotify));
+}
+
+void MMAudioPause(HWND hwndPlayer, HWND hwndNotify)
+{
+  WinPostMsg(hwndPlayer, WM_APPTERMINATENOTIFY, MPFROMSHORT(PAUSE_TRACK), MPFROMHWND(hwndNotify));
+}
+
+BOOL MMAudioOpenPlayer(HWND hwndNotify)
+{
+  if(-1==_beginthread(playThreadFunc,NULL,8192*16, (void*)hwndNotify))
+    return FALSE; /* Error occured */
+
+  return TRUE;
+}
+
+void MMAudioClosePlayer(HWND hwndPlayer)
+{
+  WinSendMsg(hwndPlayer, WM_QUIT, 0, 0);
+  return;
+}
+
+static ULONG mmIdentifyFile(char* chrFile)
+{
+  MMIOINFO mmioInfo={0};
+  MMFORMATINFO mmFormatInfo={0};
+  FOURCC fourCC;
+
+  if(MMIO_SUCCESS!=mmioIdentifyFile(chrFile, &mmioInfo, &mmFormatInfo, &fourCC, 0,0))
+    {
+      return MT_UNKNOWN;
+    }
+
+  switch(mmFormatInfo.ulMediaType)
+    {
+    case MMIO_MEDIATYPE_MIDI:  /* Midi */
+    case MMIO_MEDIATYPE_AUDIO: /* Any other audio file */
+      return MT_AUDIO;
+    case MMIO_MEDIATYPE_IMAGE:
+      return MT_IMAGE;
+    case MMIO_MEDIATYPE_DIGITALVIDEO:
+    case MMIO_MEDIATYPE_MOVIE:
+      return MT_VIDEO;
+    default:
+      return MT_UNKNOWN;
+    }
+
+  return 0;
+}
+
+static PSZ queryExeDir(const char *chrEXE)
+{
+  if(chrInstallDir[0]==0)
+    {
+      char * chr;
+      strlcpy(chrInstallDir, chrEXE, sizeof(chrInstallDir));
+      if((chr=strrchr(chrInstallDir, '\\'))!=NULLHANDLE)
+        *chr='\0';
+    }
+  return chrInstallDir;
+}
+
+
+MRESULT EXPENTRY findFileDlgProc(HWND hwnd, ULONG  msg, MPARAM mp1, MPARAM mp2)
+{
+
+  switch(msg)
+    {
+    case WM_INITDLG:
+      {
+        int a;
+        SWCNTRL swctl;
+        PID pid;
+
+        /* Set dialog font */
+        if(SysQueryOSRelease()>=40) {
+          WinSetPresParam(hwnd,
+                          PP_FONTNAMESIZE,(ULONG)sizeof(DEFAULT_DIALOG_FONT),
+                          DEFAULT_DIALOG_FONT );
+        }
+        /* Fill combo box with media types (audio, image, video) */
+        for(a=0;a<NUMMEDIATYPES;a++)
+          WinSendMsg(WinWindowFromID(hwnd, IDCB_TYPEOFFILE), LM_INSERTITEM, MRFROMSHORT(LIT_SORTASCENDING),
+                     MPFROMP(chrMediaFileTypes[a]));
+        WinSetWindowText(WinWindowFromID(hwnd, IDCB_TYPEOFFILE), chrMediaFileTypes[0]);
+
+        /* Subclass preview area */
+        WinSubclassWindow(WinWindowFromID(hwnd, IDSR_IMGPREVIEW), bmpPreviewProc);
+
+        /* Add switch entry */
+        memset(&swctl,0,sizeof(swctl));
+        WinQueryWindowProcess(hwnd,&pid,NULL);
+        swctl.hwnd=hwnd;
+        swctl.uchVisibility=SWL_VISIBLE;
+        swctl.idProcess=pid;
+        swctl.bProgType=PROG_DEFAULT;
+        swctl.fbJump=SWL_JUMPABLE;
+        WinAddSwitchEntry(&swctl);
+
+        /* Add bitmap to play control buttons */
+        changeButtons(hwnd);
+
+        /* Start an audio player thread */
+        MMAudioOpenPlayer(hwnd);
+        break;
+      }
+    case WM_APPTERMINATENOTIFY:
+      {
+        /* Posted from player object window */
+        switch(SHORT1FROMMP(mp1))
+          {
+          case MMAUDIO_PLAYER_CREATED:
+            /* Player object window */
+            hwndPlayer=HWNDFROMMP(mp2);
+            break;
+          default:
+            break;
+          }
+        return MRFALSE;
+      }
+    case WM_CONTROL:
+      {
+        switch(SHORT1FROMMP(mp1))
+          {
+          case IDCB_TYPEOFFILE:
+            {
+              if(SHORT2FROMMP(mp1)==CBN_EFCHANGE) {
+                char chrText[100];
+                int a;
+                WinQueryWindowText(HWNDFROMMP(mp2), sizeof(chrText), chrText);
+                /* Find Index */
+                for(a=0; a<NUMMEDIATYPES;a++) {
+                  if(!stricmp(chrMediaFileTypes[a], chrText))
+                    break;
+                }
+                /* Error!??!*/
+                switch(a)
+                  {
+                  case 0: /* Audio */
+                    {
+                      showVideoControls(hwnd, FALSE);
+                      showImageControls(hwnd, FALSE);
+                      showAudioControls(hwnd, TRUE);
+                      iMediaType=MT_AUDIO;
+                      break;
+                    }
+                  case 1: /* Image */
+                    showAudioControls(hwnd, FALSE);
+                    showVideoControls(hwnd, FALSE);
+                    showImageControls(hwnd, TRUE);
+                    iMediaType=MT_IMAGE;
+                    break;
+                  case 2:
+                    showAudioControls(hwnd, FALSE);
+                    showImageControls(hwnd, FALSE);
+                    showVideoControls(hwnd, TRUE);
+                    iMediaType=MT_VIDEO;
+                    break;
+                  default:
+                    return WinDefFileDlgProc(hwnd, msg, mp1, mp2);
+                  }
+                WinSetWindowText(WinWindowFromID(hwnd, 258), chrMediaFileExt[a]);
+                WinSetFocus(HWND_DESKTOP, WinWindowFromID(hwnd, 258));
+                WinSendMsg(WinWindowFromID(hwnd, 258), WM_CHAR,
+                           MPFROM2SHORT(KC_VIRTUALKEY , 0), MPFROM2SHORT(0, VK_NEWLINE));
+              }
+            break;
+            }
+          case 258:
+            {
+              if(SHORT2FROMMP(mp1)==EN_CHANGE)
+                WinStartTimer(WinQueryAnchorBlock(HWND_DESKTOP), hwnd, TIMERID_SELECTION, 100);
+              break;
+            }
+          default:
+            break;
+          }
+        break;
+      }
+    case WM_TIMER:
+      switch(SHORT1FROMMP(mp1))
+        {
+        case TIMERID_SELECTION:
+          {
+            char chrName[CCHMAXPATH];
+            char chrFullName[CCHMAXPATH*2];
+
+            WinStopTimer(WinQueryAnchorBlock(HWND_DESKTOP), hwnd, TIMERID_SELECTION);
+            WinQueryWindowText(WinWindowFromID(hwnd, 258), sizeof(chrName), chrName);
+            strcpy(chrFullName, fd.szFullFile);
+            switch(iMediaType)
+              {
+              case MT_AUDIO:
+                strlcpy(chrLastAudioDir, fd.szFullFile, sizeof(chrLastAudioDir));
+                break;
+              case MT_IMAGE:
+                strlcpy(chrLastImageDir, fd.szFullFile, sizeof(chrLastImageDir));
+                break;
+              case MT_VIDEO:
+                strlcpy(chrLastImageDir, fd.szFullFile, sizeof(chrLastImageDir));
+                break;
+              default:
+                break;
+              }
+            strcat(chrFullName, chrName);
+            strlcpy(chrSourceName, chrFullName, sizeof(chrSourceName));
+            switch(iMediaType)
+              {
+              case MT_AUDIO:
+                {
+                  char text[500];
+                  MMIOINFO mmio;
+                  HMMIO hmmio;
+                  MMAUDIOHEADER mmAudioHeader={0};
+                  LONG lBytesRead=0;
+                  ULONG rc;
+                  ULONG ulPlaySecs;
+
+                  MMAudioStop(hwndPlayer, hwnd);
+
+                  memset(&mmio,0, sizeof(mmio));
+                  mmio.ulFlags=MMIO_READ;
+                  mmio.ulTranslate=MMIO_TRANSLATEHEADER;
+
+                  hmmio = mmioOpen(chrFullName, &mmio, MMIO_READ);
+                  if(!hmmio)
+                    break;
+
+                  memset(&mmAudioHeader,0,sizeof(MMAUDIOHEADER));
+                  rc = mmioGetHeader(hmmio, &mmAudioHeader,sizeof(MMAUDIOHEADER),
+                                     &lBytesRead, 0, 0);
+
+                  mmioClose(hmmio, 0);
+                  if(rc!=MMIO_SUCCESS) {
+                    WinSetWindowText(WinWindowFromID(hwnd, IDST_AUDIOINFO), "");
+                    enableAudioPlayControls(hwnd, FALSE);
+                    break;
+                  }
+
+                  ulPlaySecs=mmAudioHeader.mmXWAVHeader.XWAVHeaderInfo.ulAudioLengthInMS/1000;
+                  sprintf(text, audioText,  ulPlaySecs/60, ulPlaySecs%60,
+                          mmAudioHeader.mmXWAVHeader.WAVEHeader.ulSamplesPerSec,
+                          mmAudioHeader.mmXWAVHeader.WAVEHeader.usBitsPerSample,
+                          mmAudioHeader.mmXWAVHeader.WAVEHeader.usChannels);
+                  WinSetWindowText(WinWindowFromID(hwnd, IDST_AUDIOINFO), text);
+                  enableAudioPlayControls(hwnd, TRUE);
+                  break;
+                }
+              case MT_IMAGE:
+                if(hBitmap) {
+                  HBITMAP hBitmapTemp;
+                  //                  hBitmapTemp=loadBitmap (chrFullName, &bmpInfoHeader2);
+                  hBitmapTemp=ImgLoadImageFileAndHeader(chrFullName, &bmpInfoHeader2);
+                  GpiDeleteBitmap(hBitmap);
+                  hBitmap=hBitmapTemp;
+                }
+                else
+                  hBitmap=ImgLoadImageFileAndHeader(chrFullName, &bmpInfoHeader2);
+                  //                  hBitmap=loadBitmap (chrFullName, &bmpInfoHeader2);
+                /* Force redraw of preview area */
+                WinInvalidateRect(WinWindowFromID(hwnd, IDSR_IMGPREVIEW), NULLHANDLE, FALSE);
+                break;
+              case MT_VIDEO:
+                break;
+              default:
+                break;
+              }
+            return MRFALSE;
+          }
+        default:
+          break;
+        }
+    case WM_COMMAND:
+      switch(SHORT1FROMMP(mp1))
+        {
+        case IDPB_MMFINDPLAY:
+          {
+          MMAudioPlayFile(hwndPlayer, hwnd, NULLHANDLE);
+          return MRFALSE;
+          }
+        case IDPB_MMFINDSTOP:
+          {
+          MMAudioStop(hwndPlayer, hwnd);
+          return MRFALSE;
+          }
+        case IDPB_MMFINDPAUSE:
+          {
+          MMAudioPause(hwndPlayer, hwnd);
+          return MRFALSE;
+          }
+        case IDPB_NEWFILE: /* New */
+          {
+            HOBJECT hObject;
+
+            MMAudioStop(hwndPlayer, hwnd);
+            MMAudioClosePlayer(hwndPlayer);
+
+            /* Open the MM templates folder */
+            if((hObject=WinQueryObject("<MMPM2_MMTEMPLATEFOLDER>"))!=NULLHANDLE) {
+              WinOpenObject(hObject, OPEN_DEFAULT, TRUE);
+              WinDismissDlg(hwnd, DID_CANCEL);
+            }
+            else
+              MsgShowMessageBox(hwnd, IDSTR_NOMMTEMPLATEFLDRTITLE, IDSTR_NOMMTEMPLATEFLDR,
+                                RESSOURCEHANDLE, MB_MOVEABLE|MB_OK);
+            return MRFALSE;
+          }
+        default:
+          //          MMAudioStop(hwndPlayer, hwnd);
+          stopAudioFile(hwnd);
+          MMAudioClosePlayer(hwndPlayer);
+          // DosSleep(1000);
+          break;
+        }
+    default:
+      break;
+    }
+  return WinDefFileDlgProc(hwnd, msg, mp1, mp2);
+}
+
+BOOL getStringFromRexxScript(PSZ pszBinDir, PSZ rexxFile, char* chrResult, ULONG ulSize)
+{
+
+  RXSTRING arg[1];                    /* argument string for REXX  */
+  RXSTRING rexxretval;                /* return value from REXX    */
+  APIRET   rc;                        /* return code from REXX     */
+  SHORT    rexxrc = 0;                /* return code from function */
+  char theScript[CCHMAXPATH];
+  /* By setting the strlength of the output RXSTRING to zero, we   */
+  /* force the interpreter to allocate memory and return it to us. */
+  /* We could provide a buffer for the interpreter to use instead. */
+  rexxretval.strlength = 0L;          /* initialize return to empty*/
+
+  sprintf(theScript, "%s\\%s", pszBinDir, rexxFile);
+
+  /* Here we call the interpreter.  We don't really need to use    */
+  /* all the casts in this call; they just help illustrate         */
+  /* the data types used.                                          */
+  rc=RexxStart((LONG)       0,             /* number of arguments   */
+               (PRXSTRING)  &arg,          /* array of arguments    */
+               (PSZ)        theScript,     /* name of REXX file     */
+               (PRXSTRING)  0,             /* No INSTORE used       */
+               (PSZ)        "CWRXX",       /* Command env. name     */
+               (LONG)       RXSUBROUTINE,  /* Code for how invoked  */
+               (PRXSYSEXIT) 0,             /* No EXITs on this call */
+               (PSHORT)     &rexxrc,       /* Rexx program output   */
+               (PRXSTRING)  &rexxretval ); /* Rexx program output   */
+#if 0
+  if(rc) {
+    sprintf(text,"Error in the Rexx skript %s\n\n Get more information with 'help REX%04d'.\n",
+            tPt->rexxSkript, rc*-1);
+    WinMessageBox(HWND_DESKTOP, HWND_DESKTOP, text, "", 1234, MB_OK|MB_MOVEABLE|MB_ERROR);
+  }
+#endif
+  if(!rc) {
+    if(ulSize>rexxretval.strlength) {
+      strncpy(chrResult, rexxretval.strptr, rexxretval.strlength);
+      chrResult[rexxretval.strlength]=0;
+    }
+    else
+      strncpy(chrResult, rexxretval.strptr, ulSize);
+    chrResult[ulSize-1]=0;
+  }
+  if(rexxretval.strptr)
+    DosFreeMem(rexxretval.strptr);          /* Release storage given to us by REXX.  */
+  if(!rc)
+    return TRUE;
+  else
+    return FALSE;
+}
+/*
+  This function checks the installed image IO procs and adds extensions which are not yet handled
+  to the list of known extensions.
+ */
+static BOOL getMissingExtFromImageIOProc(char *chrMMImageKnownExt, ULONG ulSize)
+{
+    MMFORMATINFO  mmFormatInfo;
+    PMMFORMATINFO pmmFormatInfoArray;
+    void * memPtr;
+    ULONG         ulReturnCode;
+    LONG          lFormatsRead;
+    LONG          index;
+    LONG lNumIOProcs;
+
+    memset( &mmFormatInfo,
+            '\0',
+            sizeof(MMFORMATINFO) );
+
+    mmFormatInfo.ulMediaType |= MMIO_MEDIATYPE_IMAGE;
+    mmFormatInfo.ulFlags|=MMIO_CANREADTRANSLATED;/* Read !!!*/
+    ulReturnCode = mmioQueryFormatCount ( &mmFormatInfo,
+                                          &lNumIOProcs,
+                                          0,
+                                          0 );
+
+    if( ulReturnCode != MMIO_SUCCESS )
+      {
+        /*
+         * Error - mmioQueryFormatCount failed.
+         */
+        return FALSE;
+      }
+
+    /*
+     * Allocate enough memory for n number of FormatInfo blocks
+     */
+    pmmFormatInfoArray = malloc (lNumIOProcs * sizeof( MMFORMATINFO ) );
+    memPtr=pmmFormatInfoArray;
+    if( pmmFormatInfoArray == NULL )
+      {
+        /*
+         * Could not allocate enough memory for mmFormatInfo array.
+         */
+        return FALSE;
+      }
+
+    /*
+     * call mmioGetFormats to get info on the formats supported.
+     */
+    ulReturnCode = mmioGetFormats( &mmFormatInfo,
+                                   lNumIOProcs,
+                                   pmmFormatInfoArray,
+                                   &lFormatsRead,
+                                   0,
+                                   0 );
+    if( ulReturnCode != MMIO_SUCCESS )
+      {
+        /*
+         *  mmioGetFormats failed.
+         */
+        free(pmmFormatInfoArray);
+        return FALSE;
+      }
+
+    if( lFormatsRead != lNumIOProcs )
+      {
+        /*
+         * Error in MMIO - number of formats read in by
+         * mmioGetFormats is not equal to number of formats
+         * found by mmioQueryFormatCount.
+         */
+        free(pmmFormatInfoArray);
+        return FALSE;
+      }
+
+    for ( index = 0; index <lNumIOProcs; index++ )
+      {
+        /* Now scan the whole image proc array */
+        if(!strstr(chrMMImageKnownExt, pmmFormatInfoArray->szDefaultFormatExt)) {
+          /* This extension is yet unknown */
+          if(chrMMImageKnownExt[0]==0) {
+            /* It's the first one */
+            sprintf(chrMMImageKnownExt,"*.%s", pmmFormatInfoArray->szDefaultFormatExt);
+          }
+          else {
+            /* Check if the extension is not already added (e.g. TIF has a lot of subformats) */
+            if(!strstr(chrMMImageKnownExt, pmmFormatInfoArray->szDefaultFormatExt)) {
+              strlcat(chrMMImageKnownExt,";*.", ulSize);
+              strlcat(chrMMImageKnownExt, pmmFormatInfoArray->szDefaultFormatExt, ulSize);
+            }
+          }
+        }
+        /*
+         *  advance to next entry in mmFormatInfo array
+         */
+        pmmFormatInfoArray++;
+      }
+    free(memPtr);
+    return FALSE;
+}
+
+
+int main (int argc, char *argv[])
+{
+  HAB  hab;
+  HMQ  hmq;
+  char text[CCHMAXPATH];
+  short a;
+
+  /* Create a copy of the args */
+  /* argv[0]: progname
+   */
+
+  numArgs=argc;
+
+  strcpy(text,"");
+  for(a=0;a<argc;a++)
+    {
+      params[a]=argv[a];
+    }
+
+  hab=WinInitialize(0);
+  if(hab) {
+    hmq=WinCreateMsgQueue(hab,0);
+    if(hmq) {
+      /* Check if user started prog by hand */
+      if(argc!=NUMPARAMS) {/* Not the right num of params */
+        pmUsage();
+      }
+      else {
+        HWND hwndDlg;
+
+        /* Get our ressource dll */
+        RESSOURCEHANDLE=queryResModuleHandle(argv[0]);
+        /* Load NLV strings */
+        loadStringsFromResourceDLL(RESSOURCEHANDLE);
+
+        /* Get data from INI file */
+        HlpBuildMMProgIniFileName(argv[0], chrIniFile, sizeof(chrIniFile));
+
+        /* Get additional audio extensions from mmpm2.ini */
+        getStringFromRexxScript(queryExeDir(argv[0]), "audioext.rx",
+                                chrAdditionalExt, sizeof(chrAdditionalExt));
+        if(strlen(chrAdditionalExt)!=0) {
+          translateChars(chrAdditionalExt, ',', ';');
+          strlcat(chrMediaFileExt[MT_AUDIO], ";", sizeof(chrMediaFileExt[MT_AUDIO]));
+          strlcat(chrMediaFileExt[MT_AUDIO], chrAdditionalExt, sizeof(chrMediaFileExt[MT_AUDIO]));
+        }
+
+        /* Get image extensions */
+        getStringFromRexxScript(queryExeDir(argv[0]), "imageext.rx",
+                                chrMediaFileExt[MT_IMAGE], sizeof(chrMediaFileExt[MT_IMAGE]));
+        if(strlen(chrMediaFileExt[MT_IMAGE])!=0)
+          translateChars(chrMediaFileExt[MT_IMAGE], ',', ';');
+        /* Get additional image extensions supplied by the user in imageadd.rx */
+        chrAdditionalExt[0]=0;
+        getStringFromRexxScript(queryExeDir(argv[0]), "imageadd.rx",
+                                chrAdditionalExt, sizeof(chrAdditionalExt));
+        if(strlen(chrAdditionalExt)!=0) {
+          translateChars(chrAdditionalExt, ',', ';');
+          strlcat(chrMediaFileExt[MT_IMAGE], ";", sizeof(chrMediaFileExt[MT_IMAGE]));
+          strlcat(chrMediaFileExt[MT_IMAGE], chrAdditionalExt, sizeof(chrMediaFileExt[MT_IMAGE]));
+        }
+        /* Get extensions handled by installed IO procs */
+        getMissingExtFromImageIOProc(chrMediaFileExt[MT_IMAGE], sizeof(chrMediaFileExt[MT_IMAGE]));
+
+#if 0
+        sprintf(chrInstallDir, "%d!%s!", strlen(chrMediaFileExt[MT_IMAGE]), chrMediaFileExt[MT_IMAGE]);
+        WinMessageBox(HWND_DESKTOP, HWND_DESKTOP, chrInstallDir, chrMediaFileExt[MT_IMAGE], 1234, MB_OK);
+#endif
+
+        /* Restore recent visited directories */
+        PrfQueryString(NULLHANDLE, chrIniFile, "mmfind", "lastaudiodir", "", chrLastAudioDir, sizeof(chrLastAudioDir));
+        PrfQueryString(NULLHANDLE, chrIniFile, "mmfind", "lastvideodir", "", chrLastVideoDir, sizeof(chrLastVideoDir));
+        PrfQueryString(NULLHANDLE, chrIniFile, "mmfind", "lastimagedir", "", chrLastImageDir, sizeof(chrLastImageDir));
+
+        _loadButtonBmps();
+        fd.cbSize = sizeof( fd );
+        /* It's an centered 'Open'-dialog */
+        fd.fl = FDS_OPEN_DIALOG|FDS_CENTER | FDS_CUSTOM;
+        fd.hMod=RESSOURCEHANDLE;
+        fd.usDlgId=IDDLG_MMFIND;
+        fd.pfnDlgProc=findFileDlgProc;
+
+
+        switch(iMediaType)
+          {
+          case MT_AUDIO:
+            strlcpy(fd.szFullFile, chrLastAudioDir, sizeof(fd.szFullFile));
+            break;
+          case MT_IMAGE:
+            strlcpy(fd.szFullFile, chrLastImageDir, sizeof(fd.szFullFile));
+            break;
+          case MT_VIDEO:
+            strlcpy(fd.szFullFile, chrLastVideoDir, sizeof(fd.szFullFile));
+            break;
+          default:
+            break;
+          }
+
+        if( (hwndDlg=WinFileDlg( HWND_DESKTOP, HWND_DESKTOP, &fd )) != NULLHANDLE )
+          {
+            if(hBitmap)
+              GpiDeleteBitmap(hBitmap);
+            if( fd.lReturn == DID_OK )
+              {
+                switch(mmIdentifyFile(fd.szFullFile))
+                  {
+                  case MT_IMAGE:
+                    {
+                      HOBJECT hObject;
+                      if((hObject=WinQueryObject(fd.szFullFile))!=NULLHANDLE)
+                        WinOpenObject(hObject, OPEN_DEFAULT, TRUE);
+                      break;
+                    }
+                  case MT_AUDIO:
+                    {
+                      HOBJECT hObject;
+
+                      /* Open the audio file in the editor */
+                      if((hObject=WinQueryObject(fd.szFullFile))!=NULLHANDLE)
+                        WinOpenObject(hObject, ID_MENU_EDITOR, TRUE);
+                      // WinOpenObject(hObject, OPEN_DEFAULT, TRUE);
+                      break;
+                    }
+                  case MT_VIDEO:
+                    {
+                      HOBJECT hObject;
+                      if((hObject=WinQueryObject(fd.szFullFile))!=NULLHANDLE)
+                        WinOpenObject(hObject, ID_MENU_PLAYER /* OPEN_DEFAULT */, TRUE);
+#if 0
+                      /* Open folder */
+                      if(strrchr(fd.szFullFile, '\\')!=NULLHANDLE) {
+                        if((hObject=WinQueryObject(fd.szFullFile))!=NULLHANDLE)
+                          WinOpenObject(hObject, OPEN_CONTENTS, TRUE);
+                      }
+#endif
+                      break;
+                    }
+                  default:
+                    {
+                      HOBJECT hObject;
+                      char *chr;
+                      if((chr=strrchr(fd.szFullFile, '\\'))!=NULLHANDLE) {
+                        *chr=0;
+                        if((hObject=WinQueryObject(fd.szFullFile))!=NULLHANDLE)
+                          WinOpenObject(hObject, OPEN_CONTENTS, TRUE);
+                      }
+                      break;
+                    }
+                  }/* switch()*/
+              }/* DID_OK */
+            /* Save the last visited directories */
+            PrfWriteString(NULLHANDLE, chrIniFile, "mmfind", "lastaudiodir", chrLastAudioDir);
+            PrfWriteString(NULLHANDLE, chrIniFile, "mmfind", "lastvideodir", chrLastVideoDir);
+            PrfWriteString(NULLHANDLE, chrIniFile, "mmfind", "lastimagedir", chrLastImageDir);
+          }
+        freeResHandle();
+      }
+      WinDestroyMsgQueue(hmq);
+    }
+    WinTerminate(hab);
+  }
+  return 0;
+}
+
Index: /tags/CWMM-0.3.0_GA/classes/mm-progs/mmfind/mmfind.h
===================================================================
--- /tags/CWMM-0.3.0_GA/classes/mm-progs/mmfind/mmfind.h	(revision 213)
+++ /tags/CWMM-0.3.0_GA/classes/mm-progs/mmfind/mmfind.h	(revision 213)
@@ -0,0 +1,60 @@
+/* Bitmap IDs for the play controls */
+#define IDBMP_PLAY 1
+#define IDBMP_STOP 2
+
+/* Fallbacks if strings can't be loaded */
+#define TEXT_TYPEAUDIO "Audio"
+#define TEXT_TYPEIMAGE "Image"
+#define TEXT_TYPEVIDEO "Video"
+#define TEXT_INFOTEXT  "Play time:\t%02d:%02d\n\nSamplerate:\t%d\n\nBits per sample:\t%d\n\nChannels:\t%d"
+/* Max. length of the string holding all our extensions */
+#define EXT_STRING_LENGTH 300
+
+/* Media types we support for searching */
+#define NUMMEDIATYPES 3
+#define MT_AUDIO 0
+#define MT_IMAGE 1
+#define MT_VIDEO 2
+#define MT_UNKNOWN 100
+
+#define MMAUDIO_PLAYER_CREATED 0x0001
+#define PLAY_FILE   0x0001
+#define STOP_TRACK   0x0002
+#define PAUSE_TRACK   0x0003
+
+#ifndef OPEN_DEFAULT 
+/*  Open views for the wpOpen() method */
+      #define OPEN_UNKNOWN      -1
+      #define OPEN_DEFAULT       0
+      #define OPEN_CONTENTS      1
+      #define OPEN_SETTINGS      2
+      #define OPEN_HELP          3
+      #define OPEN_RUNNING       4
+      #define OPEN_PROMPTDLG     5
+      #define OPEN_PALETTE       121                                   /*SPLIT*/
+      #define OPEN_USER          0x6500
+#endif
+
+/* Timer IDs */
+#define TIMERID_SELECTION 1
+#define IDTIMER_PLAY      2
+
+/* Defines used for audio playing */
+#define MMAUDIO_PLAYER_CREATED 0x0001
+#define PLAY_FILE   0x0001
+#define STOP_TRACK   0x0002
+#define PAUSE_TRACK   0x0003
+
+/* Function prototypes */
+#ifdef DEBUG
+void HlpWriteToTrapLog(const char* chrFormat, ...);
+#endif
+
+BOOL HlpBuildMMProgIniFileName(char* chrProgname, char * chrBuffer, ULONG ulBufferSize);
+void freeResHandle(void);
+HMODULE queryResModuleHandle(char *chrExePath);
+void pmUsage(void);
+VOID DrawBitmap ( HWND hwnd );
+void showImageControls(HWND hwnd, BOOL bShow);
+
+MRESULT EXPENTRY bmpPreviewProc(HWND hwnd, ULONG msg, MPARAM mp1, MPARAM mp2);
Index: /tags/CWMM-0.3.0_GA/classes/mm-progs/mmfind/mmfind.rc
===================================================================
--- /tags/CWMM-0.3.0_GA/classes/mm-progs/mmfind/mmfind.rc	(revision 213)
+++ /tags/CWMM-0.3.0_GA/classes/mm-progs/mmfind/mmfind.rc	(revision 213)
@@ -0,0 +1,7 @@
+#ifndef OS2_INCLUDED
+   #include <os2.h>
+#endif
+#include "mmfind.h"
+
+BITMAP IDBMP_PLAY  "./bmp/play.bmp"
+BITMAP IDBMP_STOP  "./bmp/stop.bmp"
Index: /tags/CWMM-0.3.0_GA/classes/mm-progs/mmprog.inc
===================================================================
--- /tags/CWMM-0.3.0_GA/classes/mm-progs/mmprog.inc	(revision 213)
+++ /tags/CWMM-0.3.0_GA/classes/mm-progs/mmprog.inc	(revision 213)
@@ -0,0 +1,29 @@
+# MM-prog specific makefile include
+
+CC           	=	 icc
+#CPPFLAGS     	=	 -O -Wno-pointer-sign -Wall -Zomf -Zmt -s
+#CPPFLAGS     	= -O -Zomf -Zcrtdll -Zmtd -s
+#CPPFLAGS     	=  -Ge+ /Gm+ -G5 /Ss -Gl /O+ -Oc+ -Ol- /Q+ 
+CPPFLAGS        = /Ge+ /Gm+ /G5 /Ss /Gl /O+ /Oc+ /Ol- /Q+ /Ti /Sp4 /B"/pmtype:pm /ma /de"
+
+
+INC		= ../include -I ../../../classes/inc -I $(COMMONSRC)/include
+# Fixme GKY 4-15-23
+LIB_DIR      	= $d:/emx/lib
+#TOOLDIR		=	 .\..
+LIBDIR		=	 ../lib
+DEFS         	=
+PROGS        	=
+ODIR		=
+CPPDIR		=
+
+$(LIBDIR)/%.obj:	$(COMMONSRC)/%.c
+#	$(CC) -c -Wno-pointer-sign -Wall -o$@ -Zomf -I$(INC) $<
+	$(CC) $(CPPFLAGS) /C+ -I$(INC) /Fo$@ $<
+%.obj:	%.c
+#	$(CC) -c -Wno-pointer-sign -Wall -o$@ -Zomf -I$(INC) $<
+	$(CC) $(CPPFLAGS) /C -I$(INC) /Fo$@ $<
+
+
+#distribution:
+	
Index: /tags/CWMM-0.3.0_GA/classes/mm-progs/videoplayer/customprocs.c
===================================================================
--- /tags/CWMM-0.3.0_GA/classes/mm-progs/videoplayer/customprocs.c	(revision 213)
+++ /tags/CWMM-0.3.0_GA/classes/mm-progs/videoplayer/customprocs.c	(revision 213)
@@ -0,0 +1,887 @@
+/*
+ * This file is (C) Chris Wohlgemuth 2002
+ * It is part of the MediaFolder package
+ */
+/*
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; see the file COPYING.  If not, write to
+ * the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+/*
+ * If you need another license for your project/product (commercial,
+ * noncommercial, whatever) contact me at
+ * 
+ * http://www.os2world.com/cdwriting
+ * http://www.geocities.com/SiliconValley/Sector/5785/
+ *
+ */
+
+#define INCL_GPILCIDS
+#define INCL_GPIPRIMITIVES
+#define INCL_GPIBITMAPS
+#define INCL_GPILOGCOLORTABLE
+#define INCL_SW
+#define INCL_GPIREGIONS
+#define INCL_WIN
+
+#include <os2.h>
+
+#include "common.h"
+#include "mmplayerres.h"
+#include "mmres.h"
+#include "mmplayer.h"
+#include <stdio.h>
+#include <stdlib.h>
+
+
+/* Fonts to use in dialogs */
+#define DEFAULT_DIALOG_FONT   "9.WarpSans"
+
+/* Bitmap data */
+extern LOADEDBITMAP allBMPs[];
+extern CONTROLINFO ciControls[];
+
+/* Window procedures */
+extern PFNWP  oldPlayTimeProc;
+extern PFNWP orgBgProc; /* Org proc of background */
+extern PFNWP orgButtonProc;
+extern HPOINTER hptrArrowWE;
+
+MRESULT handleDrag0ver(PDRAGINFO pdi, HWND hwnd);
+MRESULT handleDrop(PDRAGINFO pdi, HWND hwnd);
+
+/* This custom button proc is only for DnD handling */
+MRESULT EXPENTRY buttonProc(HWND hwnd, ULONG msg, MPARAM mp1, MPARAM mp2)
+{
+  switch(msg)
+    {
+      /* Drag and drop of audio files */
+    case DM_DRAGOVER:
+      {
+        PDRAGINFO pdi=PVOIDFROMMP(mp1);
+        
+        return handleDrag0ver( pdi, WinQueryWindow(hwnd, QW_PARENT));
+      }
+    case DM_DROP:
+      {
+        PDRAGINFO pdi=PVOIDFROMMP(mp1);
+        
+        return handleDrop( pdi, WinQueryWindow(hwnd, QW_PARENT));
+      }
+    default:
+      break;
+    }
+  if(orgButtonProc)
+    return (*orgButtonProc)(hwnd, msg, mp1, mp2);
+  else
+    return WinDefWindowProc(hwnd, msg, mp1, mp2);
+}
+
+MRESULT EXPENTRY bgProc(HWND hwnd, ULONG msg, MPARAM mp1, MPARAM mp2)
+{
+  switch(msg)
+    {
+      /*****************************************************/
+      /* Paint the background                              */
+      /*****************************************************/
+    case WM_PAINT:
+      {
+        SWP swp;
+        RECTL rcl;
+        HPS hps;
+
+        WinQueryWindowPos(hwnd,&swp);
+        if(swp.fl & SWP_MINIMIZE)
+          break;
+  
+        hps=WinBeginPaint(hwnd, NULLHANDLE, NULLHANDLE);
+        WinQueryWindowRect(hwnd, &rcl);
+        WinDrawBitmap(hps, allBMPs[MAIN_BMP_IDX].hbm,
+                      NULLHANDLE, 
+                      (PPOINTL)&rcl,
+                      0, 0,
+                      DBM_IMAGEATTRS);    
+        WinEndPaint(hps);
+        return MRFALSE;
+      }
+    default:
+      break;
+    }
+  if(orgBgProc)
+    return (*orgBgProc)(hwnd, msg, mp1, mp2);
+  else
+    return WinDefWindowProc(hwnd, msg, mp1, mp2);
+}
+
+/* This function paints all our controls with the provided bitmaps */
+/* It's called from the guiproc                                    */
+MRESULT paintControls(HWND hwnd, ULONG msg, MPARAM mp1, MPARAM mp2)
+{
+  USERBUTTON* ubPtr;
+  CONTROLINFO ci;
+  RECTL rcl;
+
+  ubPtr=(USERBUTTON*)PVOIDFROMMP(mp2);
+  switch(SHORT1FROMMP(mp1))
+    {
+    case IDPB_MMPLAYERPLAY:
+      if(ubPtr->fsState==BDS_DEFAULT||!ubPtr->fsState)
+        ci=ciControls[CTRLIDX_PLAYBUTTON];
+      else {
+        ci=ciControls[CTRLIDX_PLAYBUTTONSEL];
+      }
+      break;
+    case IDPB_MMPLAYERPAUSE:
+      if(ubPtr->fsState==BDS_DEFAULT||!ubPtr->fsState)
+        ci=ciControls[CTRLIDX_PAUSEBUTTON];
+      else {
+        ci=ciControls[CTRLIDX_PAUSEBUTTONSEL];
+      }
+      break;
+    case IDPB_MMPLAYERSTOP:
+      if(ubPtr->fsState==BDS_DEFAULT||!ubPtr->fsState)
+        ci=ciControls[CTRLIDX_STOPBUTTON];
+      else {
+        ci=ciControls[CTRLIDX_STOPBUTTONSEL];
+      }
+      break;
+#if 0
+    case IDPB_POSBAR:
+      ci=ciControls[CTRLIDX_POSSLIDER];//ciPosSlider;
+      break;
+    case IDPB_SLIDERARM:
+      DosBeep(5000, 30);
+      ci=ciControls[CTRLIDX_POSSLIDERARM];//ciPosSliderArm;
+      break;
+    case IDSL_VOLUME:
+      ci=ciControls[CTRLIDX_VOLSLIDER];//ciVolSlider;
+      break;
+    case IDSL_VOLUMEARM:
+      if(WinQueryCapture(HWND_DESKTOP==hwnd))
+        ci=ciControls[CTRLIDX_VOLSLIDERARMSEL];//ciVolSliderArm;
+      else
+        ci=ciControls[CTRLIDX_VOLSLIDERARM];//ciVolSliderArm;
+      break;
+#endif
+    default:
+      return (MRESULT)0;
+    }
+  rcl.yBottom=0;
+  rcl.xLeft=0;
+
+  //DosBeep(5000, 100);
+
+  WinDrawBitmap(ubPtr->hps, ci.hbmSource,
+                &ci.rclSource, 
+                (PPOINTL)&rcl,
+                0, 0,
+                DBM_IMAGEATTRS);
+  if(ubPtr->fsStateOld!=ubPtr->fsState)
+    ubPtr->fsState =( ubPtr->fsStateOld==BDS_DEFAULT ? BDS_HILITED : BDS_DEFAULT);
+
+  return (MRESULT)0;
+}
+
+
+/* This function paints all our controls with the provided bitmaps. */
+BOOL paintHilitedControl(HWND hwnd, USHORT usControl, BOOL bHilite)
+{
+  //  static ULONG ulShowFeedback=0;
+
+#if 0
+  if(!ulShowFeedback) {
+    /* Query the INI setting*/
+    if(!PrfQueryProfileInt(HINI_USERPROFILE, APPKEY_CWMM, MFLDR_NO_VISUAL_FEEDBACK, 0))
+      ulShowFeedback=1; /* Flash play controls */
+    else
+      ulShowFeedback=2; /* Don't flash play controls while playing */
+  }
+
+
+  if(ulShowFeedback==2)
+    return 1;
+  
+  switch(usControl)
+    {
+    case IDPB_PLAY:
+      if(!bHilite) {
+        ci=ciControls[CTRLIDX_PLAYBUTTON];
+    }
+      else {
+        ci=ciControls[CTRLIDX_PLAYBUTTONSEL];
+      }
+      break;
+    case IDPB_PAUSE:
+      if(!bHilite) {
+        ci=ciControls[CTRLIDX_PAUSEBUTTON];
+      }
+      else {
+        ci=ciControls[CTRLIDX_PAUSEBUTTONSEL];
+      }
+      break;
+    default:
+      return 0;
+    }
+  rcl.yBottom=0;
+  rcl.xLeft=0;
+  hps=WinGetPS(hwnd);
+  WinDrawBitmap(hps, ci.hbmSource,
+                &ci.rclSource, 
+                (PPOINTL)&rcl,
+                0, 0,
+                DBM_IMAGEATTRS);
+  WinReleasePS(hps);
+#endif
+  return 1;
+}
+
+
+#define USERSLIDER 1 /* Set to 0 to let the proc paint the control. With set to 1
+                        a WM_DRAWITEM msg is sent to the parent. */
+BOOL userSlider=USERSLIDER;
+#define SLOFFSET 3 /* The offset of the active slider area to the window border */
+MRESULT EXPENTRY privateSliderProc(HWND hwnd, ULONG msg, MPARAM mp1, MPARAM mp2)
+{
+
+  switch (msg)
+    {      
+#if 0
+      /* Drag and drop of audio files */
+    case DM_DRAGOVER:
+      {
+      PDRAGINFO pdi=PVOIDFROMMP(mp1);
+
+      return handleDrag0ver( pdi, WinQueryWindow(hwnd, QW_PARENT));
+      }
+    case DM_DROP:
+      {
+        PDRAGINFO pdi=PVOIDFROMMP(mp1);
+
+        return handleDrop( pdi, WinQueryWindow(hwnd, QW_PARENT));
+      }
+#endif
+    case WM_CREATE:
+      {
+        PCREATESTRUCT pCreate=(CREATESTRUCT*)PVOIDFROMMP(mp2);
+
+        /* Initialize the slider data */
+        WinSetWindowUShort(hwnd, SLIDERARMWIDTH,20);
+        WinSetWindowUShort(hwnd, SLIDERARMHEIGHT,10);
+        WinSetWindowUShort(hwnd, SLINCREMENTS,100);
+        /* Dimensions of slider. The slider active area is smaller than the window to
+           allow drawing of active state. */
+        WinSetWindowULong(hwnd, SLIDERCX,pCreate->cx-2*SLOFFSET);
+        WinSetWindowULong(hwnd, SLIDERCY,pCreate->cy-2*SLOFFSET);
+        WinSetWindowULong(hwnd, SLIDERX,SLOFFSET);
+        WinSetWindowULong(hwnd, SLIDERY,SLOFFSET);
+        WinSetWindowULong(hwnd, SLIDERARMPOS, 0);
+        WinSetWindowULong(hwnd, SLDRAGGING,FALSE);
+
+        return (MRESULT)0;
+      }
+    case SLM_SETSLIDERINFO:
+      switch(SHORT1FROMMP(mp1))
+        {
+          case SMA_SLIDERARMPOSITION:
+            /*  SMA_RANGEVALUE */
+            if(!WinQueryWindowULong(hwnd, SLDRAGGING)) {
+              if(SHORT2FROMMP(mp1)==SMA_RANGEVALUE) {
+                WinSetWindowULong(hwnd, SLIDERARMPOS, LONGFROMMP(mp2));
+                WinInvalidateRect(hwnd, NULLHANDLE,TRUE);
+                return (MRESULT)0;
+              }
+              else if(SHORT2FROMMP(mp1)==SMA_INCREMENTVALUE) {
+                LONG lInc=LONGFROMMP(mp2)*(WinQueryWindowULong(hwnd, SLIDERCX)-WinQueryWindowUShort(hwnd, SLIDERARMWIDTH));
+                lInc/=WinQueryWindowUShort(hwnd, SLINCREMENTS);
+                WinSetWindowULong(hwnd, SLIDERARMPOS, lInc);
+                WinInvalidateRect(hwnd, NULLHANDLE,TRUE);
+                return (MRESULT)0;
+              }
+            }
+            break;
+        case SMA_SLIDERARMDIMENSIONS:
+          WinSetWindowUShort(hwnd, SLIDERARMWIDTH, SHORT1FROMMP(mp2));
+          WinSetWindowUShort(hwnd, SLIDERARMHEIGHT, SHORT2FROMMP(mp2));
+          return (MRESULT)0;
+        default:
+          break;
+        }
+      break;
+    case WM_SIZE:
+      WinSetWindowULong(hwnd, SLIDERCX, SHORT1FROMMP(mp2)-2*SLOFFSET);
+      WinSetWindowULong(hwnd, SLIDERCY, SHORT2FROMMP(mp2)-2*SLOFFSET);
+      WinInvalidateRect(hwnd, NULLHANDLE,TRUE);
+      return (MRESULT)0;
+    case WM_BUTTON1DOWN:
+      {
+        SHORT x=SHORT1FROMMP( mp1);
+        SHORT y=SHORT2FROMMP( mp1);
+        LONG  lPos=WinQueryWindowULong(hwnd, SLIDERARMPOS);
+        USHORT usWidth=WinQueryWindowUShort(hwnd, SLIDERARMWIDTH);
+
+        if(x<=lPos+usWidth+SLOFFSET && x>=lPos+SLOFFSET && 
+           y<=WinQueryWindowUShort(hwnd, SLIDERY)+WinQueryWindowUShort(hwnd, SLIDERCY)
+           && y>=WinQueryWindowUShort(hwnd, SLIDERY)) {
+          WinSetWindowUShort(hwnd, PTRPOSINSLARM, x-lPos-SLOFFSET);
+        }
+        WinSetFocus(HWND_DESKTOP, hwnd);
+      break;
+      }
+    case WM_FOCUSCHANGE:
+      {
+        HPS hps;
+        RECTL rcl;
+        POINTL ptl;
+
+        if(SHORT1FROMMP(mp2)) {
+          hps=WinGetPS(hwnd);
+          WinQueryWindowRect(hwnd, &rcl);        
+          GpiSetLineType(hps, LINETYPE_DOT);
+          ptl.x=rcl.xLeft;
+          ptl.y=rcl.yBottom;
+          GpiMove(hps,&ptl);
+          ptl.x=rcl.xRight-1;
+          GpiLine(hps,&ptl);
+          ptl.y=rcl.yTop-1;
+          GpiLine(hps,&ptl);
+          ptl.x=rcl.xLeft;
+          GpiLine(hps,&ptl);
+          ptl.y=rcl.yBottom;
+          GpiLine(hps,&ptl);
+          WinReleasePS(hps);
+        }
+        else
+          WinInvalidateRect(hwnd, NULLHANDLE,TRUE);
+
+        break;
+      }
+    case WM_CHAR:
+      if(WinQueryFocus(HWND_DESKTOP)==hwnd) {
+        if(SHORT2FROMMP(mp2)==VK_TAB && (SHORT1FROMMP(mp1) & KC_VIRTUALKEY))
+          if(SHORT1FROMMP(mp1) & (KC_KEYUP|KC_PREVDOWN)) 
+            return (MRESULT)TRUE;
+
+#if 0
+        /**/
+        if(SHORT2FROMMP(mp2)==VK_RIGHT && (SHORT1FROMMP(mp1) & KC_VIRTUALKEY))
+          /* if(SHORT1FROMMP(mp1) & (KC_KEYUP|KC_PREVDOWN))*/ {
+            DosBeep(5000, 100);
+            return (MRESULT)TRUE;
+          }
+        if(SHORT2FROMMP(mp2)==VK_LEFT && (SHORT1FROMMP(mp1) & KC_VIRTUALKEY))
+          if(SHORT1FROMMP(mp1) & (KC_KEYUP|KC_PREVDOWN)) {
+            DosBeep(500, 100);
+            return (MRESULT)TRUE;
+          }
+#endif
+
+        return WinDefWindowProc(hwnd, msg, mp1, mp2);
+      }
+
+#if 0
+      if(WinQueryFocus(HWND_DESKTOP)==hwnd) {
+        /* We have the focus */
+        if((SHORT1FROMMP(mp1) & (KC_VIRTUALKEY))==(KC_VIRTUALKEY)) {
+          LONG  lPos=WinQueryWindowULong(hwnd, SLIDERARMPOS);
+          USHORT usWidth=WinQueryWindowUShort(hwnd, SLIDERARMWIDTH);
+          ULONG ulCx=WinQueryWindowULong(hwnd, SLIDERCX);
+
+          switch(SHORT2FROMMP(mp2))
+            {
+            case VK_RIGHT:
+              if(SHORT1FROMMP(mp1) & (KC_KEYUP|KC_PREVDOWN)) {
+                lPos+=1;
+                if(lPos>ulCx-usWidth)
+                  lPos=ulCx-usWidth;
+                else {
+                  WinPostMsg( hwnd,
+                              SLM_SETSLIDERINFO,
+                              MPFROM2SHORT(SMA_SLIDERARMPOSITION, SMA_RANGEVALUE),
+                              MPFROMLONG( (LONG) lPos ));
+                  lPos=(lPos*100)/(WinQueryWindowULong(hwnd, SLIDERCX)-WinQueryWindowUShort(hwnd, SLIDERARMWIDTH));
+
+                  WinPostMsg( WinQueryWindow(hwnd, QW_PARENT),WM_CONTROL,
+                              MPFROM2SHORT(WinQueryWindowUShort(hwnd, QWS_ID), SLN_CHANGE),
+                              MPFROMLONG(lPos));
+
+                  if(SHORT1FROMMP(mp1) & KC_LONEKEY) {
+                    /* Post SLN_CHANGE notification */
+                    WinPostMsg( WinQueryWindow(hwnd, QW_PARENT),WM_CONTROL,
+                                MPFROM2SHORT(WinQueryWindowUShort(hwnd, QWS_ID), SLN_CHANGE),
+                                MPFROMLONG(lPos));
+                    WinSetWindowULong(hwnd, SLDRAGGING, FALSE);
+                  }
+                  else {
+                    WinSetWindowULong(hwnd, SLDRAGGING, TRUE);
+                    /* Post SLN_SLIDERTRACK notification */
+                    WinPostMsg(WinQueryWindow(hwnd, QW_PARENT),WM_CONTROL,
+                               MPFROM2SHORT(WinQueryWindowUShort(hwnd, QWS_ID), SLN_SLIDERTRACK),
+                               MPFROMLONG(lPos));
+                  }
+
+                }
+                WinSetWindowULong(hwnd, SLIDERARMPOS, lPos);
+              }
+              return (MRESULT)TRUE;
+            case VK_LEFT:
+              if(SHORT1FROMMP(mp1) & (KC_KEYUP|KC_PREVDOWN)) {
+                lPos-=1;
+                if(lPos<0) {
+                  lPos=0;
+                }
+                else {
+                  WinPostMsg( hwnd,
+                              SLM_SETSLIDERINFO,
+                              MPFROM2SHORT(SMA_SLIDERARMPOSITION, SMA_RANGEVALUE),
+                              MPFROMLONG( (LONG) lPos ));
+                  lPos=(lPos*100)/(WinQueryWindowULong(hwnd, SLIDERCX)-WinQueryWindowUShort(hwnd, SLIDERARMWIDTH));
+                  /* Post SLN_CHANGE notification */
+                  WinPostMsg( WinQueryWindow(hwnd, QW_PARENT),WM_CONTROL,
+                              MPFROM2SHORT(WinQueryWindowUShort(hwnd, QWS_ID), SLN_CHANGE),
+                              MPFROMLONG(lPos));
+
+                  if(SHORT1FROMMP(mp1) & KC_LONEKEY) {
+                    /* Post SLN_CHANGE notification */
+                    WinPostMsg( WinQueryWindow(hwnd, QW_PARENT),WM_CONTROL,
+                                MPFROM2SHORT(WinQueryWindowUShort(hwnd, QWS_ID), SLN_CHANGE),
+                                MPFROMLONG(lPos));
+                    WinSetWindowULong(hwnd, SLDRAGGING, FALSE);
+                  }
+                  else {
+                    WinSetWindowULong(hwnd, SLDRAGGING, TRUE);
+                    /* Post SLN_SLIDERTRACK notification */
+                    WinPostMsg(WinQueryWindow(hwnd, QW_PARENT),WM_CONTROL,
+                               MPFROM2SHORT(WinQueryWindowUShort(hwnd, QWS_ID), SLN_SLIDERTRACK),
+                               MPFROMLONG(lPos));
+                  }
+
+                }
+                WinSetWindowULong(hwnd, SLIDERARMPOS, lPos);
+
+              }
+              return (MRESULT)TRUE;
+            default:
+              break;
+            }
+        }
+
+      }
+#endif
+      break;
+    case WM_BUTTON1MOTIONSTART:
+      {
+        SHORT x=SHORT1FROMMP( mp1);
+        SHORT y=SHORT2FROMMP( mp1);
+        LONG  lPos=WinQueryWindowULong(hwnd, SLIDERARMPOS);
+        USHORT usWidth=WinQueryWindowUShort(hwnd, SLIDERARMWIDTH);
+
+        if(x<=lPos+usWidth+SLOFFSET && x>=lPos+SLOFFSET && 
+           y<=WinQueryWindowUShort(hwnd, SLIDERY)+WinQueryWindowUShort(hwnd, SLIDERCY)
+           && y>=WinQueryWindowUShort(hwnd, SLIDERY)){
+          //        if(x<=lPos+usWidth && y<=WinQueryWindowUShort(hwnd, SLIDERY)+WinQueryWindowUShort(hwnd, SLIDERCY)
+          //      && y>=WinQueryWindowUShort(hwnd, SLIDERY)) {
+          WinSetWindowULong(hwnd, SLDRAGGING, TRUE);
+          if(hptrArrowWE)
+            WinSetPointer(HWND_DESKTOP, hptrArrowWE);
+
+          WinSetCapture(HWND_DESKTOP, hwnd);
+        }
+        break;
+      }
+    case WM_BUTTON1MOTIONEND:
+      if(WinQueryWindowULong(hwnd, SLDRAGGING)) {
+        LONG lPos=WinQueryWindowULong(hwnd, SLIDERARMPOS);
+        WinSetWindowULong(hwnd, SLDRAGGING,FALSE);
+        WinSetCapture(HWND_DESKTOP, NULLHANDLE);
+          lPos=(lPos*100)/(WinQueryWindowULong(hwnd, SLIDERCX)-WinQueryWindowUShort(hwnd, SLIDERARMWIDTH));
+        /* Post SLN_CHANGE notification */
+        WinPostMsg(WinQueryWindow(hwnd, QW_PARENT),WM_CONTROL,
+                   MPFROM2SHORT(WinQueryWindowUShort(hwnd, QWS_ID), SLN_CHANGE),
+                   MPFROMLONG(lPos));
+      }
+      break;
+
+    case WM_MOUSEMOVE:
+      if(WinQueryWindowULong(hwnd, SLDRAGGING)) {
+
+        HPS hps;
+        RECTL rcl, rcl2, rcl3;
+        LONG lTemp;
+        SHORT x=SHORT1FROMMP(mp1);
+        LONG  lPos=WinQueryWindowULong(hwnd, SLIDERARMPOS);
+        USHORT usWidth=WinQueryWindowUShort(hwnd, SLIDERARMWIDTH);
+
+       
+        lTemp=lPos;
+     
+        rcl.xLeft=WinQueryWindowULong(hwnd, SLIDERX);
+        rcl.yBottom=WinQueryWindowULong(hwnd, SLIDERY);
+        rcl.xRight=rcl.xLeft+WinQueryWindowULong(hwnd, SLIDERCX);
+        rcl.yTop=rcl.yBottom+WinQueryWindowULong(hwnd, SLIDERCY);
+
+        rcl2=rcl3=rcl;
+        rcl.xLeft=x-WinQueryWindowUShort(hwnd, PTRPOSINSLARM);
+        if(rcl.xLeft<rcl2.xLeft)/* Make sure we stop at the left border */
+          rcl.xLeft=rcl2.xLeft;
+
+        rcl.xRight=rcl.xLeft+usWidth;
+        if(rcl.xRight>rcl2.xRight)
+          {/* Make sure we stop at the right border */
+            rcl.xRight=rcl2.xRight;
+            rcl.xLeft=rcl.xRight-usWidth;
+          }
+        lPos=rcl.xLeft-WinQueryWindowULong(hwnd, SLIDERX);/* Save position zero based */
+        WinSetWindowULong(hwnd, SLIDERARMPOS, lPos);
+        if(lPos!=lTemp) {
+          BOOL rc;
+
+          hps=WinGetPS(hwnd);
+          /* Paint Background not necessary here */
+
+          /* Shaft */
+          /* Left part */
+          rcl3.xRight=rcl.xLeft;
+
+          rc=FALSE;
+
+          if(userSlider) {
+            OWNERITEM oi={0};
+            oi.hwnd=hwnd;
+            oi.hps=hps;
+            oi.fsState=SLS_OWNERDRAW;/* More to come */
+            oi.rclItem=rcl3;
+            oi.idItem=SDA_SLIDERSHAFT;
+            rc=(BOOL)WinSendMsg(WinQueryWindow(hwnd, QW_PARENT), WM_DRAWITEM,
+                                MPFROMSHORT(WinQueryWindowUShort(hwnd, QWS_ID)),
+                                MPFROMP(&oi) );
+          }
+          if(!rc)
+            WinFillRect(hps, &rcl3, CLR_PALEGRAY);
+
+          /* Right part */
+          rcl3.xRight=rcl2.xRight;
+          rcl3.xLeft=rcl.xRight;
+          rc=FALSE;
+          if(userSlider) {
+            OWNERITEM oi={0};
+            oi.hwnd=hwnd;
+            oi.hps=hps;
+            oi.fsState=SLS_OWNERDRAW;/* More to come */
+            oi.rclItem=rcl3;
+            oi.idItem=SDA_SLIDERSHAFT;
+            rc=(BOOL)WinSendMsg(WinQueryWindow(hwnd, QW_PARENT), WM_DRAWITEM,
+                                MPFROMSHORT(WinQueryWindowUShort(hwnd, QWS_ID)),
+                                MPFROMP(&oi) );
+          }
+          if(!rc)
+            WinFillRect(hps, &rcl3, CLR_PALEGRAY);
+
+          /* Paint Slider */
+          rc=FALSE;
+          if(userSlider) {
+            OWNERITEM oi={0};
+            oi.hwnd=hwnd;
+            oi.hps=hps;
+            oi.fsState=SLS_OWNERDRAW;/* More to come */
+            oi.rclItem=rcl;
+            oi.idItem=SDA_SLIDERARM;
+            rc=(BOOL)WinSendMsg(WinQueryWindow(hwnd, QW_PARENT), WM_DRAWITEM,
+                                MPFROMSHORT(WinQueryWindowUShort(hwnd, QWS_ID)),
+                                MPFROMP(&oi) );
+
+          }
+          if(!rc)
+            {
+              WinFillRect(hps,&rcl, CLR_PALEGRAY);
+              WinDrawBorder(hps, &rcl, 2, 2, 0, 0 ,0x0400);
+            }
+
+          WinReleasePS(hps);
+          lPos=(lPos*100)/(WinQueryWindowULong(hwnd, SLIDERCX)-WinQueryWindowUShort(hwnd, SLIDERARMWIDTH));
+           /* Post SLN_SLIDERTRACK notification */
+          WinPostMsg(WinQueryWindow(hwnd, QW_PARENT),WM_CONTROL,
+                     MPFROM2SHORT(WinQueryWindowUShort(hwnd, QWS_ID), SLN_SLIDERTRACK),
+                     MPFROMLONG(lPos));
+        }
+        return MRTRUE;
+      }
+      else {
+        if(hptrArrowWE) {
+          /* Not dragging */
+          /* Change pointer to drag pointer when over the arm */
+          SHORT x=SHORT1FROMMP( mp1);
+          SHORT y=SHORT2FROMMP( mp1);
+          LONG  lPos=WinQueryWindowULong(hwnd, SLIDERARMPOS);
+          USHORT usWidth=WinQueryWindowUShort(hwnd, SLIDERARMWIDTH);
+          if(x<=lPos+usWidth+SLOFFSET && x>=lPos+SLOFFSET && 
+             y<=WinQueryWindowUShort(hwnd, SLIDERY)+WinQueryWindowUShort(hwnd, SLIDERCY)
+             && y>=WinQueryWindowUShort(hwnd, SLIDERY)) {
+            WinSetPointer(HWND_DESKTOP, hptrArrowWE);
+            //            WinSetPointer(HWND_DESKTOP, WinQuerySysPointer(HWND_DESKTOP, SPTR_SIZEWE, FALSE));
+            return MRTRUE;
+          }
+        }
+      }
+      break;
+    case WM_PAINT:
+      {
+
+        HPS hps, hps2;
+        RECTL rcl, rcl2, rcl3;
+        POINTL ptl;
+        LONG  lPos=WinQueryWindowULong(hwnd, SLIDERARMPOS);
+        USHORT usWidth=WinQueryWindowUShort(hwnd, SLIDERARMWIDTH);
+        BOOL rc;
+
+        WinQueryWindowRect(hwnd, &rcl);
+
+        /* Shaft */
+        rcl2.xLeft=WinQueryWindowULong(hwnd, SLIDERX);
+        rcl2.yBottom=WinQueryWindowULong(hwnd, SLIDERY);
+        rcl2.xRight=rcl2.xLeft+WinQueryWindowULong(hwnd, SLIDERCX)-1;
+        rcl2.yTop=rcl2.yBottom+WinQueryWindowULong(hwnd, SLIDERCY)-1;
+
+        /* Background */
+        hps2=WinGetPS(hwnd);
+        GpiExcludeClipRectangle(hps2,&rcl2);
+        rc=FALSE;
+        if(userSlider) {
+          OWNERITEM oi={0};
+          oi.hwnd=hwnd;
+          oi.hps=hps2;
+          oi.fsState=SLS_OWNERDRAW;/* More to come */
+          oi.rclItem=rcl;
+          oi.idItem=SDA_BACKGROUND;
+          rc=(BOOL)WinSendMsg(WinQueryWindow(hwnd, QW_PARENT), WM_DRAWITEM, MPFROMSHORT(WinQueryWindowUShort(hwnd, QWS_ID)),
+                    MPFROMP(&oi) );
+        }
+        if(!rc)
+          WinFillRect(hps2, &rcl, CLR_PALEGRAY);
+        /* Focus */
+        if(WinQueryFocus(HWND_DESKTOP)==hwnd) {
+          GpiSetLineType(hps2, LINETYPE_DOT);
+          ptl.x=rcl.xLeft;
+          ptl.y=rcl.yBottom;
+          GpiMove(hps2,&ptl);
+          ptl.x=rcl.xRight-1;
+          GpiLine(hps2,&ptl);
+          ptl.y=rcl.yTop-1;
+          GpiLine(hps2,&ptl);
+          ptl.x=rcl.xLeft;
+          GpiLine(hps2,&ptl);
+          ptl.y=rcl.yBottom;
+          GpiLine(hps2,&ptl);
+        }
+
+        WinReleasePS(hps2);
+        rcl2.yTop+=1;
+        rcl2.xRight+=1;
+        hps=WinBeginPaint(hwnd, NULLHANDLE, NULLHANDLE);
+        rcl3=rcl=rcl2;
+        /* Arm pos */        
+        rcl2.xLeft+=lPos;
+        /* Arm size */        
+        rcl2.xRight=rcl2.xLeft+usWidth;
+        
+        /* Shaft */
+        /* Left part */
+        rcl3.xRight=rcl2.xLeft;
+        rc=FALSE;
+        if(userSlider) {
+          OWNERITEM oi={0};
+          oi.hwnd=hwnd;
+          oi.hps=hps;
+          oi.fsState=SLS_OWNERDRAW;/* More to come */
+          oi.rclItem=rcl3;
+          oi.idItem=SDA_SLIDERSHAFT;
+          rc=(BOOL)WinSendMsg(WinQueryWindow(hwnd, QW_PARENT), WM_DRAWITEM, MPFROMSHORT(WinQueryWindowUShort(hwnd, QWS_ID)),
+                    MPFROMP(&oi) );
+
+        }
+        if(!rc)
+          WinFillRect(hps, &rcl3, CLR_GREEN);
+
+        /* Right part */
+        rcl3.xRight=rcl.xRight;
+        rcl3.xLeft=rcl2.xRight;
+        rc=FALSE;
+        if(userSlider) {
+          OWNERITEM oi={0};
+          oi.hwnd=hwnd;
+          oi.hps=hps;
+          oi.fsState=SLS_OWNERDRAW;/* More to come */
+          oi.rclItem=rcl3;
+          oi.idItem=SDA_SLIDERSHAFT;
+          rc=(BOOL)WinSendMsg(WinQueryWindow(hwnd, QW_PARENT), WM_DRAWITEM, MPFROMSHORT(WinQueryWindowUShort(hwnd, QWS_ID)),
+                              MPFROMP(&oi) );
+        }
+        if(!rc)
+          WinFillRect(hps, &rcl3, CLR_PALEGRAY);
+
+        rc=FALSE;
+        if(userSlider) {
+          OWNERITEM oi={0};
+          oi.hwnd=hwnd;
+          oi.hps=hps;
+          oi.fsState=SLS_OWNERDRAW;/* More to come */
+          oi.rclItem=rcl2;
+          oi.idItem=SDA_SLIDERARM;
+          rc=(BOOL)WinSendMsg(WinQueryWindow(hwnd, QW_PARENT), WM_DRAWITEM, MPFROMSHORT(WinQueryWindowUShort(hwnd, QWS_ID)),
+                              MPFROMP(&oi) );
+        }
+        if(!rc)
+          {
+            WinFillRect(hps,&rcl2, CLR_PALEGRAY);        
+            WinDrawBorder(hps, &rcl2, 2, 2, 0, 0 ,0x0400);
+          }
+
+        WinEndPaint(hps);
+        return (MRESULT)0;
+      }
+      break;
+    default:
+      break;
+    }
+  return WinDefWindowProc(hwnd, msg, mp1, mp2);
+}
+
+MRESULT drawSlider(HWND hwnd, ULONG msg, MPARAM mp1, MPARAM mp2, USHORT id)
+{
+  POWNERITEM poi;
+  CONTROLINFO ci, ciArm;
+
+  poi=(POWNERITEM)PVOIDFROMMP(mp2);
+
+  switch(id)
+    {
+    case IDSL_MMPLAYERPOSBAR:
+      ci=ciControls[CTRLIDX_POSSLIDER];
+      ciArm=ciControls[CTRLIDX_POSSLIDERARM];
+      break;
+    case IDSL_MMPLAYERVOLUME:
+      ci=ciControls[CTRLIDX_VOLSLIDER];//ciVolSlider;
+      //      if(WinQueryCapture(HWND_DESKTOP==hwnd))
+      ciArm=ciControls[CTRLIDX_VOLSLIDERARMSEL];//ciVolSliderArm;
+      // else
+      //  ciArm=ciControls[CTRLIDX_VOLSLIDERARM];//ciVolSliderArm;
+      break;
+    default:
+      return (MRESULT)FALSE;
+    }
+  
+  switch(poi->idItem)
+    {
+    case SDA_SLIDERARM:
+      if(ciArm.hbmSource)
+        //DosBeep(5000, 50);
+      WinDrawBitmap(poi->hps, ciArm.hbmSource,
+                    &ciArm.rclSource, 
+                    (PPOINTL)&poi->rclItem,
+                    0, 0,
+                    DBM_IMAGEATTRS);
+      //    WinFillRect(poi->hps,&poi->rclItem, CLR_RED);
+      return (MRESULT) TRUE;
+    case SDA_BACKGROUND:
+      {
+        WinDrawBitmap(poi->hps,
+                      ci.hbmSource,
+                      &ci.rclSource, 
+                      (PPOINTL)&poi->rclItem,
+                      0, 0,
+                      DBM_IMAGEATTRS);
+        //    WinFillRect(poi->hps,&poi->rclItem, CLR_WHITE);
+        return (MRESULT) TRUE;
+      }
+    case SDA_SLIDERSHAFT:
+      {
+        RECTL rcl;
+
+        rcl=ci.rclSource;
+        rcl.xLeft+=poi->rclItem.xLeft;
+        rcl.xRight=rcl.xLeft+(poi->rclItem.xRight-poi->rclItem.xLeft);
+        rcl.yBottom+=SLOFFSET;
+        rcl.yTop-=SLOFFSET;
+
+        if(!WinDrawBitmap(poi->hps, ci.hbmSource,
+                          &rcl,
+                          //&ci.rclSource, 
+                          (PPOINTL)&poi->rclItem,
+                          0, 0,
+                          DBM_IMAGEATTRS))
+          return (MRESULT)FALSE;
+        return (MRESULT)TRUE;
+      }
+    default:
+      return (MRESULT)TRUE;
+    }
+  /* Done */
+  return (MRESULT)TRUE;
+}
+
+
+MRESULT EXPENTRY playTimeTextProc(HWND hwnd, ULONG msg, MPARAM mp1, MPARAM mp2)
+{
+  switch(msg)
+    {
+      /* Drag and drop of audio files */
+    case DM_DRAGOVER:
+      {
+      PDRAGINFO pdi=PVOIDFROMMP(mp1);
+
+      return handleDrag0ver( pdi, WinQueryWindow(hwnd, QW_PARENT));
+      }
+    case DM_DROP:
+      {
+        PDRAGINFO pdi=PVOIDFROMMP(mp1);
+
+        return handleDrop( pdi, WinQueryWindow(hwnd, QW_PARENT));
+      }
+
+    case WM_BUTTON1CLICK:
+
+      WinSendMsg(WinQueryWindow(hwnd, QW_PARENT), WM_APPTERMINATENOTIFY,
+                 MPFROM2SHORT(NOTIFY_CLICK, WinQueryWindowUShort(hwnd, QWS_ID)) ,0L);
+      return (MRESULT)0;
+    case WM_CONTEXTMENU:
+      WinSendMsg(WinQueryWindow(hwnd, QW_PARENT), WM_APPTERMINATENOTIFY,
+                 MPFROM2SHORT(NOTIFY_CONTEXT, WinQueryWindowUShort(hwnd, QWS_ID)) ,0L);
+      return (MRESULT)0;
+    case WM_PAINT:
+      {
+        HPS hps;
+        RECTL rcl;
+        char text[100];
+        CONTROLINFO ci;
+        
+        ci=ciControls[CTRLIDX_PLAYTIME];//ciVolSliderArm;
+        
+        hps=WinBeginPaint(hwnd, NULLHANDLE, NULL);
+        if(WinQueryWindowText(hwnd, sizeof(text), text))
+          {
+            POINTL ptl= {0};
+            WinDrawBitmap(hps, ci.hbmSource,
+                          &ci.rclSource, 
+                          &ptl,
+                          0, 0,
+                          DBM_IMAGEATTRS);
+            WinQueryWindowRect(hwnd,&rcl);
+            WinDrawText(hps, strlen(text),text, &rcl,0,0,DT_CENTER|DT_VCENTER|DT_TEXTATTRS);
+          }
+        WinEndPaint(hps);
+        return (MRESULT) 0;
+      }
+    default:
+      break;
+    }
+  return oldPlayTimeProc(hwnd, msg, mp1, mp2);
+}
Index: /tags/CWMM-0.3.0_GA/classes/mm-progs/videoplayer/display.c
===================================================================
--- /tags/CWMM-0.3.0_GA/classes/mm-progs/videoplayer/display.c	(revision 213)
+++ /tags/CWMM-0.3.0_GA/classes/mm-progs/videoplayer/display.c	(revision 213)
@@ -0,0 +1,192 @@
+/*
+ * This file is (C) Chris Wohlgemuth 2002
+ * It is part of the MediaFolder package
+ */
+/*
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; see the file COPYING.  If not, write to
+ * the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+/*
+ * If you need another license for your project/product (commercial,
+ * noncommercial, whatever) contact me at
+ * 
+ * http://www.os2world.com/cdwriting
+ * http://www.geocities.com/SiliconValley/Sector/5785/
+ *
+ */
+
+#define INCL_GPILCIDS
+#define INCL_GPIPRIMITIVES
+#define INCL_GPIBITMAPS
+#define INCL_GPILOGCOLORTABLE
+#define INCL_SW
+#define INCL_GPIREGIONS
+#define INCL_WIN
+
+#include <os2.h>
+
+#include "common.h"
+#include "mmres.h"
+#include "mmplayer.h"
+#include <stdio.h>
+#include <stdlib.h>
+
+/* 0: time, 1: remaining, 2: filename */
+extern int iWhichDisplay;
+/* Display timer for changing between track info */
+extern ULONG ulDisplayTimer;
+extern ULONG ulTotalLength;
+/* Current time in track */
+extern ULONG ulPos;
+char * chrPtrName; /* Pointer to filename */
+
+void _resetDisplay(HWND hwndFrame)
+{
+  WinSetWindowText(WinWindowFromID(hwndFrame, IDST_MMPLAYERPLAYTIME), "0:00");
+  //WinSetWindowULong(WinWindowFromID(WinWindowFromID(hwndTop, IDDLG_TOPMIDDLE), IDST_PLAYTIME), QWL_USER, 0);
+  WinPostMsg( WinWindowFromID(hwndFrame, IDSL_MMPLAYERPOSBAR),
+              SLM_SETSLIDERINFO,
+              MPFROM2SHORT(SMA_SLIDERARMPOSITION,SMA_INCREMENTVALUE),
+              MPFROMLONG(0L));
+}
+
+
+
+/* Set the text in the playtime area to 'theText' */
+void setPlayTimeText2( HWND hwndDialog, char * theText)
+{
+     WinSetWindowText(WinWindowFromID(hwndDialog, IDST_MMPLAYERPLAYTIME), theText);
+}
+
+
+/* Toggle the visibility of the text in the playtime area. Useful for blinking. */
+void togglePlayTimeDisplayVisibility(HWND hwndFrame)
+{
+  if(WinIsWindowVisible(WinWindowFromID(hwndFrame, IDST_MMPLAYERPLAYTIME)))
+    WinShowWindow(WinWindowFromID(hwndFrame, IDST_MMPLAYERPLAYTIME), FALSE);
+  else
+    WinShowWindow(WinWindowFromID(hwndFrame, IDST_MMPLAYERPLAYTIME), TRUE);
+}
+
+
+/* Show/hide the text in the playtime area. Useful for blinking. */
+void showPlayTimeDisplay(HWND hwndFrame, BOOL bShow)
+{
+  WinShowWindow(WinWindowFromID(hwndFrame, IDST_MMPLAYERPLAYTIME), bShow);
+}
+
+
+/* This funktion sets the playtime display according to the user settings.
+   Supported are remaining time, elapsed time and ID3-tag display */
+void setPlayTimeText(hwndFrame)
+{
+  char text[CCHMAXPATH];
+  ULONG ulTemp;
+
+  switch(iWhichDisplay)
+    {
+    case 1:
+      /* Remaining */
+      ulTemp=ulTotalLength/1000-ulPos;
+      sprintf(text,"-%d:%02d",
+              (int)ulTemp/60,
+              (int)ulTemp%60);
+      WinSetWindowText(WinWindowFromID(hwndFrame, IDST_MMPLAYERPLAYTIME), text);
+      break;
+
+    case 2:
+      {
+        ULONG ulTemp=ulDisplayTimer;
+
+        /* Show filename */
+        text[0]=0;
+        
+        if(ulTemp>=3)
+          text[0]=0;
+        else if(ulTemp>=0)
+          strcpy(text, chrPtrName);
+        
+#if 0
+        else
+          ulTemp=15; /* Show playtime for midi files */
+#endif
+     
+        if(ulTemp>=3||!strlen(text)) {
+          /* Play time */
+          sprintf(text,"%d:%02d",
+                  (int)ulPos/60,
+                  (int)ulPos%60);
+        }
+        WinSetWindowText(WinWindowFromID(hwndFrame, IDST_MMPLAYERPLAYTIME), text);
+        ulTemp++;
+        if(ulTemp>=6)
+          ulTemp=0;
+        ulDisplayTimer=ulTemp;
+        break;
+        
+#if 0
+        /* Show ID3 tag */
+        cwAudio=thisPtr->cwQueryCurrentlyPlayingObject();
+        if(somIsObj(cwAudio)) {
+          if(!methodPtr)
+            somhlpQueryCWAudioMethodPtr(thisPtr);
+          sprintf(text,"");
+          if(methodPtr && somIsObj(cwAudioClass) && cwAudio->somIsA(cwAudioClass) ){/* Query playtime in secs */
+            char* chrPtr=text;
+            text[0]=0;
+
+            if(ulTemp>=15)
+              text[0]=0;
+            else if(ulTemp>=12) 
+              methodPtr(cwAudio, &chrPtr, sizeof(text), IDINFO_GENRE);
+            else if(ulTemp>=9)
+              methodPtr(cwAudio, &chrPtr, sizeof(text), IDINFO_COMMENT);
+            else if(ulTemp>=6)
+              methodPtr(cwAudio, &chrPtr, sizeof(text), IDINFO_ALBUM);
+            else if(ulTemp>=3)
+              methodPtr(cwAudio, &chrPtr, sizeof(text), IDINFO_NAME);
+            else if(ulTemp>=0)
+              methodPtr(cwAudio, &chrPtr, sizeof(text), IDINFO_ARTIST);
+          }
+          else
+            ulTemp=15; /* Show playtime for midi files */
+          
+          if(ulTemp>=15||!strlen(text)) {
+            /* Play time */
+            sprintf(text,"%d:%02d",
+                    thisPtr->ulPos/60,
+                    thisPtr->ulPos%60);
+          }
+          WinSetWindowText(WinWindowFromID(thisPtr->hwndTopMiddle, IDST_PLAYTIME), text);
+          ulTemp++;
+          if(ulTemp>=18)
+            ulTemp=0;
+          ulDisplayTimer=ulTemp;
+          break;
+        }
+#endif
+      }
+      /* Fall through to playtime */
+    case 0:
+      /* Elapsed time */
+      sprintf(text,"%d:%02d",
+              (int)ulPos/60,
+              (int)ulPos%60);
+      WinSetWindowText(WinWindowFromID(hwndFrame, IDST_MMPLAYERPLAYTIME), text);
+      break;
+    default:
+      break;
+    }
+}
+
Index: /tags/CWMM-0.3.0_GA/classes/mm-progs/videoplayer/except_2.h
===================================================================
--- /tags/CWMM-0.3.0_GA/classes/mm-progs/videoplayer/except_2.h	(revision 213)
+++ /tags/CWMM-0.3.0_GA/classes/mm-progs/videoplayer/except_2.h	(revision 213)
@@ -0,0 +1,101 @@
+
+#ifndef EXCEPT_H_INCLUDED
+#define EXCEPT_H_INCLUDED
+
+#include <setjmp.h>
+#include "excptLogName.h"
+
+typedef struct REGREC2_STRUCT {
+  PVOID     pNext;
+  PFN       pfnHandler;
+  jmp_buf   jmpThread;
+} REGREC2, *PREGREC2;
+
+typedef struct _LOCALEXCEPTSTRUCT {
+  EXCEPTIONREGISTRATIONRECORD  excptRegRecord;
+  ULONG                 ulExcpt;
+  APIRET                arc;
+  jmp_buf   jmpThread;
+} LOCALEXCEPTSTRUCT, *PLOCALEXCEPTSTRUCT;
+
+    /********************************************************************
+     *                                                                  *
+     *   Macros                                                         *
+     *                                                                  *
+     ********************************************************************/
+
+    /* See except.c for explanations how to use these. */
+
+#define TRY_LOUD(localExceptStruct)                                   \
+{  \ 
+      LOCALEXCEPTSTRUCT    localExceptStruct;                         \
+         localExceptStruct.excptRegRecord.ExceptionHandler = (ERR)excHandler;          \
+                localExceptStruct.arc = DosSetExceptionHandler(                  \
+                            (PEXCEPTIONREGISTRATIONRECORD)&(localExceptStruct.excptRegRecord)); \
+                if (localExceptStruct.arc)                                       \
+                    DosBeep(100, 1000);                                    \
+                localExceptStruct.ulExcpt = setjmp(localExceptStruct.jmpThread);               \
+                if (localExceptStruct.ulExcpt == 0)                              \
+                {   /* no exception occured: */
+
+    #define CATCH(localExceptStruct)                                       \
+                    DosUnsetExceptionHandler(                              \
+                            (PEXCEPTIONREGISTRATIONRECORD)&(localExceptStruct.excptRegRecord));   \
+                } /* end if (try_ulExcpt == 0) */                          \
+                else { /* exception occured: */                            \
+                    DosUnsetExceptionHandler(                              \
+                            (PEXCEPTIONREGISTRATIONRECORD)&(localExceptStruct.excptRegRecord));
+    #define END_CATCH                                                      \
+                } /* end else (excptstruct.ulExcpt == 0) */                \
+            } /* end variable scope block */
+
+
+    /*
+     * CRASH:
+     *      this macro is helpful for testing
+     *      the exception handlers.
+     *      This is not for general use. ;-)
+     */
+
+    #define CRASH {PSZ p = NULL; *p = 'a'; }
+
+    /********************************************************************
+     *                                                                  *
+     *   Prototypes                                                     *
+     *                                                                  *
+     ********************************************************************/
+
+ULONG _System excHandler(PEXCEPTIONREPORTRECORD pERepRec,
+                         PLOCALEXCEPTSTRUCT pRegRec2,
+                         //          PREGREC2 pRegRec2,
+                         PCONTEXTRECORD pCtxRec,
+                         PVOID pv);
+
+
+
+#endif
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Index: /tags/CWMM-0.3.0_GA/classes/mm-progs/videoplayer/makefile
===================================================================
--- /tags/CWMM-0.3.0_GA/classes/mm-progs/videoplayer/makefile	(revision 213)
+++ /tags/CWMM-0.3.0_GA/classes/mm-progs/videoplayer/makefile	(revision 213)
@@ -0,0 +1,51 @@
+# Makefile
+
+include ../../../make.inc
+
+CC           = icc
+LIB_DIR      = $d:/emx/lib
+#CPPFLAGS     = -Ge- /Gm+ -G4 -Gl  /O+ -Oc+ -Ol
+#CPPFLAGS     = -O -Zomf -Zcrtdll -Zmtd -s
+#CPPFLAGS     = -O -Wall -Zomf -Zmt -s
+CPPFLAGS     	=  -Ge+ /Gm+ -G5 /Ss -Gl /O+ -Oc+ -Ol- /Q+
+INC		= ../include -I ../../../classes/inc -I ../../../common_functions/include
+DEFS         =
+PROGS        =
+ODIR		= .
+CPPDIR	= .
+LIBDIR	=	../lib
+OBJECTS	=	$(LIBDIR)/message.obj $(LIBDIR)/helper.obj $(LIBDIR)/menu_funcs.obj $(LIBDIR)/sys_funcs.obj
+OBJS2		=	 customprocs.obj playaudio.obj display.obj
+
+
+all:	mmplayer.exe vioplayer.exe
+
+$(LIBDIR)/%.obj:	$(COMMONSRC)/%.c 
+#	gcc -c -Wall -o$@ -Zomf -I$(INC) $<  
+	$(CC) $(CPPFLAGS) /C+ -I$(INC) /Fo$@ $<
+%.obj:	%.c
+#	gcc -c -Wall -o$@ -Zomf -I$(INC) $<  
+	$(CC) $(CPPFLAGS) /C -I$(INC) /Fo$@ $<
+mmplayer.exe:	mmplayer.c $(OBJECTS) $(OBJS2) makefile
+#Use this command to link dynamicaly
+	$(CC) $(CPPFLAGS) -I$(INC) mmplayer.c $(OBJECTS) $(OBJS2) mmpm2.lib mmplayer.def
+	rc mmplayer.rc mmplayer.exe
+
+vioplayer.exe:	vioplayer.c
+	$(CC) $(CPPFLAGS) -I$(INC) vioplayer.c $(LIBDIR)/sys_funcs.obj mmpm2.lib mmplayer.def
+
+clean:
+	-rm *.exe
+	-rm *.dll
+	-rm *.obj
+	-rm *.RES
+	-rm *.ini
+	-rm *.def
+
+cleaner:
+	-rm *.*~
+	-rm *.flc
+
+distribution:
+	
+
Index: /tags/CWMM-0.3.0_GA/classes/mm-progs/videoplayer/mmplayer.c
===================================================================
--- /tags/CWMM-0.3.0_GA/classes/mm-progs/videoplayer/mmplayer.c	(revision 213)
+++ /tags/CWMM-0.3.0_GA/classes/mm-progs/videoplayer/mmplayer.c	(revision 213)
@@ -0,0 +1,1217 @@
+/*
+ * mmplayer.c (C) Chris Wohlgemuth 2002-2003
+ *
+ */
+/*
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; see the file COPYING.  If not, write to
+ * the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+/*
+ * If you need another license for your project/product (commercial,
+ * noncommercial, whatever) contact me at
+ *
+ * http://www.os2world.com/cdwriting
+ * http://www.geocities.com/SiliconValley/Sector/5785/
+ *
+ */
+
+#define INCL_DOS
+#define INCL_DOSFILEMGR
+#define INCL_DOSERRORS
+#define INCL_WIN
+#define INCL_WINWORKPLACE
+#define INCL_OS2MM
+#define INCL_MMIOOS2
+#define INCL_MCIOS2
+#define INCL_GPI
+#define INCL_PM
+
+#ifdef __EMX__
+//#define USE_OS2_TOOLKIT_HEADERS
+#endif
+#include <os2.h>
+#include <sys\types.h>
+#include <sys\stat.h>
+#include <stdio.h>
+#include <string.h>
+#include <stdlib.h>
+#include <os2me.h>
+#include "common.h"
+#include "mmplayerres.h"
+#include "mmres.h"
+#include "mmplayer.h"
+#include "mmprogs_defaults.h"
+#include "sys_funcs.h"
+
+#ifndef OPEN_DEFAULT
+/*  Open views for the wpOpen() method */
+
+      #define OPEN_UNKNOWN      -1
+      #define OPEN_DEFAULT       0
+      #define OPEN_CONTENTS      1
+      #define OPEN_SETTINGS      2
+      #define OPEN_HELP          3
+      #define OPEN_RUNNING       4
+      #define OPEN_PROMPTDLG     5
+      #define OPEN_PALETTE       121                                   /*SPLIT*/
+      #define OPEN_USER          0x6500
+#endif
+
+LOADEDBITMAP allBMPs[NUM_CTRL_IDX];
+
+/* Format:
+   typedef struct
+   {
+   INT id;
+   RECTL rclSource;
+   HBITMAP hbmSource;
+   RECTL rclDest;
+   }CONTROLINFO;
+   */
+CONTROLINFO ciControls[NUM_CTRL_IDX]={
+  {0,{0,0,414,70}, NULLHANDLE,{0}}, /* main */
+  /* Achtung destination verwendet fuer position */
+
+  {IDPB_MMPLAYERPLAY, {0, 0, 36, 36},NULLHANDLE, { 108, 24, 144, 60} },/* Play */
+  {IDPB_MMPLAYERPLAY, {0, 0, 36,36},NULLHANDLE, { 108, 24, 144, 60} }, /* Playsel */
+  {IDPB_MMPLAYERSTOP, {0, 0, 36, 36},NULLHANDLE, { 24, 24, 60, 60} },/* Stop */
+  {IDPB_MMPLAYERSTOP, {0, 0, 36,36},NULLHANDLE, { 24, 24, 60, 60} }, /* Stop sel */
+  {IDPB_MMPLAYERPAUSE, {0, 0, 36, 36},NULLHANDLE, { 66, 24, 101, 60} },/* Pause */
+  {IDPB_MMPLAYERPAUSE, {0, 0, 36,36},NULLHANDLE, { 66, 24, 101, 60} }, /* Pause sel */
+  {IDSL_MMPLAYERPOSBAR,{191-5, 19-4, 389-5,32-4}, NULLHANDLE, { 191, 19, 389, 32} },  //NULLHANDLE, { 0, 0, 191,10} },
+  {IDPB_MMPLAYERSLIDERARM,{0,1,9,8},NULLHANDLE, {0,0,9,9} },
+  {IDST_MMPLAYERPLAYTIME, {191, 32, 391,54},NULLHANDLE, { 0, 0, 190, 25} },
+  {IDSL_MMPLAYERVOLUME,{15, 2,141,17},NULLHANDLE, {20, 6, 146, 21} }, //{0, 0, 126, 9} /* {10,18,93,13} */ },
+  {IDSL_MMPLAYERVOLUMEARM,{0,0,9,9},NULLHANDLE, {0,0,9,9}},
+  {IDSL_MMPLAYERVOLUMEARM,{0,0,9,9},NULLHANDLE, {0,0,9,9}},
+};
+
+
+HWND hwndVideo, hwndVideoClient;
+
+#define NUMPARAMS  2
+
+/* argv[0]: progname
+ * argv[1]: audio file
+ * ( argv[2]: class )
+ */
+
+//#define DEBUG
+#ifdef DEBUG
+void HlpWriteToTrapLog(const char* chrFormat, ...);
+#endif
+
+BOOL IniSaveWindowPos(char * iniFile, char* chrApp, char *chrKey, HWND hwnd);
+BOOL IniRestoreWindowPos(char * iniFile, char* chrApp, char *chrKey, HWND hwnd);
+int IniRestoreInt(char * iniFile, char* chrApp, char *chrKey, int defaultInt);
+BOOL IniSaveInt(char * iniFile, char* chrApp, char *chrKey, int theInt);
+BOOL HlpBuildMMProgIniFileName(char* chrProgname, char * chrBuffer, ULONG ulBufferSize);
+void freeResHandle(void);
+HMODULE queryResModuleHandle(char *chrExePath);
+BOOL getMessage(char* text,ULONG ulID, LONG lSizeText, HMODULE hResource,HWND hwnd);
+//MRESULT menuInsertMenuSeparator(int iPosition, HWND hwndMenu, HWND hwndSubMenu);
+MRESULT menuInsertMenuSeparator(HWND hwndMenu, HWND hwndSubMenu, SHORT sPosition );
+//MRESULT menuInsertMenuItem(int iPosition, HWND hwndMenu, HWND hwndSubMenu, int iID, char * chrText);
+SHORT menuInsertMenuItem( HWND hwndMenu, HWND hwndSubMenu, SHORT sPosition, int iID, char * chrText);
+void pmUsage(void);
+ULONG messageBox( char* text, ULONG ulTextID , LONG lSizeText,
+                  char* title, ULONG ulTitleID, LONG lSizeTitle,
+                  HMODULE hResource, HWND hwnd, ULONG ulFlags);
+
+
+MRESULT EXPENTRY playTimeTextProc(HWND hwnd, ULONG msg, MPARAM mp1, MPARAM mp2);
+MRESULT drawSlider(HWND hwnd, ULONG msg, MPARAM mp1, MPARAM mp2, USHORT id);
+MRESULT EXPENTRY privateSliderProc(HWND hwnd, ULONG msg, MPARAM mp1, MPARAM mp2);
+BOOL paintHilitedControl(HWND hwnd, USHORT usControl, BOOL bHilite);
+MRESULT paintControls(HWND hwnd, ULONG msg, MPARAM mp1, MPARAM mp2);
+MRESULT EXPENTRY bgProc(HWND hwnd, ULONG msg, MPARAM mp1, MPARAM mp2);
+MRESULT EXPENTRY buttonProc(HWND hwnd, ULONG msg, MPARAM mp1, MPARAM mp2);
+
+/* Every folder has one running play thread to handle play commands */
+void playThreadFunc (void *arg);
+void controlPlaying(HWND hwndDialog, ULONG ulAction, ULONG ulReserved);
+BOOL stopAudioFile(HWND hwndFrame);
+BOOL seekAudioFile(LONG lPosSec);
+void showPlayTimeDisplay(HWND hwndFrame, BOOL bShow);
+void togglePlayTimeDisplayVisibility(HWND hwndFrame);
+void setPlayTimeText(HWND hwndFrame);
+
+BOOL writeVolumeToIni(char * iniFile, char* chrApp, char *chrKey, ULONG ulVoume);
+int readVolumeFromIni(char * iniFile, char* chrApp, char *chrKey, int iDefault);
+BOOL writeDisplayTypeToIni(char * iniFile, char* chrApp, char *chrKey, int iDisplay);
+int readDisplayTypeFromIni(char * iniFile, char* chrApp, char *chrKey, int iDefault);
+
+char logName[]="mmplayer.log";
+
+extern SWP swpWindow;
+BOOL bHaveWindowPos=FALSE;
+
+/* Track to play. Full path */
+char chrSourceName[CCHMAXPATH + 1]={0};
+char * chrPtrName=NULLHANDLE; /* Pointer to filename */
+char chrClassName[100]= {0};
+
+char chrIniFile[CCHMAXPATH];
+
+int numArgs;
+char* params[NUMPARAMS];
+
+/* TRUE when track is playing */
+BOOL bIsPlaying=FALSE;
+/* TRUE when track is paused */
+BOOL bPaused=FALSE;
+/* TRUE when user drags the position slider */
+BOOL bPosDragging=FALSE;
+BOOL bIsMidi=FALSE;
+
+/* Which display to show */
+/* 0: time, 1: remaining, 2: filename */
+int iWhichDisplay=0;
+/* Display timer for changing between track info */
+ULONG ulDisplayTimer=0;
+
+ULONG ulVolume=75;
+
+PID ulPid;
+/* The play time of the track */
+ULONG ulTotalLength=0;
+/* Current time in track */
+ULONG ulPos=0;
+
+HMODULE RESSOURCEHANDLE=0;
+
+HMODULE BMP_RESSOURCEHANDLE=0;
+
+PFNWP  oldPlayTimeProc;
+PFNWP orgBgProc=NULLHANDLE; /* Org proc of background */
+PFNWP orgButtonProc=NULLHANDLE;
+
+HPOINTER hptrArrowWE=NULLHANDLE;
+
+void HlpContextMenu(HWND hwnd, USHORT usItem, BOOL fCheckItem)
+{
+  POINTL ptl;
+  HWND   hwndPopup;
+
+  //  hwndPopup = WinLoadMenu(hwnd, _queryResModuleHandle(), ID_MENUTIMECONTEXT) ;
+  hwndPopup = WinLoadMenu(hwnd, RESSOURCEHANDLE, ID_MENUTIMECONTEXT) ;
+  if (hwndPopup == NULLHANDLE) {
+    DosBeep(100,1000);
+    return;
+  }
+  if(fCheckItem)
+    WinSendMsg(hwndPopup,MM_SETITEMATTR,MPFROM2SHORT(usItem, TRUE), MPFROM2SHORT(MIA_CHECKED,MIA_CHECKED));
+
+  WinQueryPointerPos(HWND_DESKTOP, &ptl) ;
+  WinMapWindowPoints(HWND_DESKTOP,hwnd,&ptl,1);
+  WinPopupMenu(hwnd, hwnd, hwndPopup,
+               ptl.x, ptl.y, 0, PU_HCONSTRAIN | PU_VCONSTRAIN |
+               PU_KEYBOARD | PU_MOUSEBUTTON1 | PU_MOUSEBUTTON2 | PU_NONE  );
+
+}
+
+static void _loadBmps()
+{
+  HPS hps;
+  HMODULE hResource;
+
+  if(allBMPs[MAIN_BMP_IDX].hbm)
+    return;
+
+  hResource=BMP_RESSOURCEHANDLE; //_queryResModuleHandle();
+  hps=WinGetPS(HWND_DESKTOP);
+
+  /* The main BMP */
+  allBMPs[MAIN_BMP_IDX].hbm=GpiLoadBitmap(hps, hResource, IDBMP_TOPMIDDLE, 0, 0);
+  GpiQueryBitmapParameters(allBMPs[MAIN_BMP_IDX].hbm, &allBMPs[MAIN_BMP_IDX].bmpInfoHdr);
+
+  /* Stop */
+  allBMPs[CTRLIDX_STOPBUTTON].hbm=GpiLoadBitmap(hps, hResource, IDBMP_STOP, 0, 0);
+  GpiQueryBitmapParameters(allBMPs[CTRLIDX_STOPBUTTON].hbm, &allBMPs[CTRLIDX_STOPBUTTON].bmpInfoHdr);
+  ciControls[CTRLIDX_STOPBUTTON].hbmSource=allBMPs[CTRLIDX_STOPBUTTON].hbm;
+
+  /* Stop sel */
+  allBMPs[CTRLIDX_STOPBUTTONSEL].hbm=GpiLoadBitmap(hps, hResource, IDBMP_STOPSEL, 0, 0);
+  GpiQueryBitmapParameters(allBMPs[CTRLIDX_STOPBUTTONSEL].hbm, &allBMPs[CTRLIDX_STOPBUTTONSEL].bmpInfoHdr);
+  ciControls[CTRLIDX_STOPBUTTONSEL].hbmSource=allBMPs[CTRLIDX_STOPBUTTONSEL].hbm;
+
+  /* Pause */
+  allBMPs[CTRLIDX_PAUSEBUTTON].hbm=GpiLoadBitmap(hps, hResource, IDBMP_PAUSE, 0, 0);
+  GpiQueryBitmapParameters(allBMPs[CTRLIDX_PAUSEBUTTON].hbm, &allBMPs[CTRLIDX_PAUSEBUTTON].bmpInfoHdr);
+  ciControls[CTRLIDX_PAUSEBUTTON].hbmSource=allBMPs[CTRLIDX_PAUSEBUTTON].hbm;
+
+  /* Pause sel */
+  allBMPs[CTRLIDX_PAUSEBUTTONSEL].hbm=GpiLoadBitmap(hps, hResource, IDBMP_PAUSESEL, 0, 0);
+  GpiQueryBitmapParameters(allBMPs[CTRLIDX_PAUSEBUTTONSEL].hbm, &allBMPs[CTRLIDX_PAUSEBUTTONSEL].bmpInfoHdr);
+  ciControls[CTRLIDX_PAUSEBUTTONSEL].hbmSource=allBMPs[CTRLIDX_PAUSEBUTTONSEL].hbm;
+
+  /* Play */
+  allBMPs[CTRLIDX_PLAYBUTTON].hbm=GpiLoadBitmap(hps, hResource, IDBMP_PLAY, 0, 0);
+  GpiQueryBitmapParameters(allBMPs[CTRLIDX_PLAYBUTTON].hbm, &allBMPs[CTRLIDX_PLAYBUTTON].bmpInfoHdr);
+  ciControls[CTRLIDX_PLAYBUTTON].hbmSource=allBMPs[CTRLIDX_PLAYBUTTON].hbm;
+
+  /* Play sel */
+  allBMPs[CTRLIDX_PLAYBUTTONSEL].hbm=GpiLoadBitmap(hps, hResource, IDBMP_PLAYSEL, 0, 0);
+  GpiQueryBitmapParameters(allBMPs[CTRLIDX_PLAYBUTTONSEL].hbm, &allBMPs[CTRLIDX_PLAYBUTTONSEL].bmpInfoHdr);
+  ciControls[CTRLIDX_PLAYBUTTONSEL].hbmSource=allBMPs[CTRLIDX_PLAYBUTTONSEL].hbm;
+
+  /* Positionslider bg */
+  ciControls[CTRLIDX_POSSLIDER].hbmSource=allBMPs[MAIN_BMP_IDX].hbm;
+
+  /* Positionslider arm */
+  allBMPs[CTRLIDX_POSSLIDERARM].hbm=GpiLoadBitmap(hps, hResource, IDBMP_POSSLIDERARM, 0, 0);
+  GpiQueryBitmapParameters(allBMPs[CTRLIDX_POSSLIDERARM].hbm, &allBMPs[CTRLIDX_POSSLIDERARM].bmpInfoHdr);
+  ciControls[CTRLIDX_POSSLIDERARM].hbmSource=allBMPs[CTRLIDX_POSSLIDERARM].hbm;
+
+  /* Playtime text field */
+  ciControls[CTRLIDX_PLAYTIME].hbmSource=allBMPs[MAIN_BMP_IDX].hbm;
+
+  /* Volume slider background */
+  ciControls[CTRLIDX_VOLSLIDER].hbmSource=allBMPs[MAIN_BMP_IDX].hbm;
+
+  /* Volume slider arm */
+  allBMPs[CTRLIDX_VOLSLIDERARM].hbm=GpiLoadBitmap(hps, hResource, IDBMP_VOLSLIDERARM, 0, 0);
+  GpiQueryBitmapParameters(allBMPs[CTRLIDX_VOLSLIDERARM].hbm, &allBMPs[CTRLIDX_VOLSLIDERARM].bmpInfoHdr);
+  ciControls[CTRLIDX_VOLSLIDERARM].hbmSource=allBMPs[CTRLIDX_VOLSLIDERARM].hbm;
+
+  /* Volume slider arm selected*/
+  allBMPs[CTRLIDX_VOLSLIDERARMSEL].hbm=GpiLoadBitmap(hps, hResource, IDBMP_VOLSLIDERARMSEL, 0, 0);
+  GpiQueryBitmapParameters(allBMPs[CTRLIDX_VOLSLIDERARMSEL].hbm, &allBMPs[CTRLIDX_VOLSLIDERARMSEL].bmpInfoHdr);
+  ciControls[CTRLIDX_VOLSLIDERARMSEL].hbmSource=allBMPs[CTRLIDX_VOLSLIDERARMSEL].hbm;
+
+  WinReleasePS(hps);
+}
+
+
+/***********************************************************/
+/*                                                         */
+/* Move the controls to the position defined by the        */
+/* background bitmap.                                      */
+/*                                                         */
+/***********************************************************/
+void adjustDialogControlPos(HWND hwnd)
+{
+  CONTROLINFO ci;
+  ULONG ulStyle;
+
+  /* STOP button */
+  ci=ciControls[CTRLIDX_STOPBUTTON];
+  ulStyle=WinQueryWindowULong(WinWindowFromID(hwnd, ci.id),QWL_STYLE);
+  WinSetWindowULong(WinWindowFromID(hwnd, ci.id),QWL_STYLE,ulStyle|BS_USERBUTTON);
+  WinSetWindowPos(WinWindowFromID(hwnd, ci.id), HWND_TOP, ci.rclDest.xLeft , ci.rclDest.yBottom,
+                  ci.rclDest.xRight-ci.rclDest.xLeft,
+                  ci.rclDest.yTop-ci.rclDest.yBottom, SWP_MOVE|SWP_SIZE);
+  /* Pause button */
+  ci=ciControls[CTRLIDX_PAUSEBUTTON];
+  ulStyle=WinQueryWindowULong(WinWindowFromID(hwnd, ci.id),QWL_STYLE);
+  WinSetWindowULong(WinWindowFromID(hwnd, ci.id),QWL_STYLE,ulStyle|BS_USERBUTTON);
+  WinSetWindowPos(WinWindowFromID(hwnd, ci.id),HWND_TOP, ci.rclDest.xLeft , ci.rclDest.yBottom,
+                  ci.rclDest.xRight-ci.rclDest.xLeft,
+                  ci.rclDest.yTop-ci.rclDest.yBottom, SWP_MOVE|SWP_SIZE);
+  /* Play button */
+  ci=ciControls[CTRLIDX_PLAYBUTTON];
+  ulStyle=WinQueryWindowULong(WinWindowFromID(hwnd, ci.id),QWL_STYLE);
+  WinSetWindowULong(WinWindowFromID(hwnd, ci.id),QWL_STYLE,ulStyle|BS_USERBUTTON);
+  WinSetWindowPos(WinWindowFromID(hwnd, ci.id),HWND_TOP, ci.rclDest.xLeft , ci.rclDest.yBottom,
+                  ci.rclDest.xRight-ci.rclDest.xLeft,
+                  ci.rclDest.yTop-ci.rclDest.yBottom, SWP_MOVE|SWP_SIZE);
+
+  /* Playtime text */
+  ci=ciControls[CTRLIDX_PLAYTIME];
+  WinSetWindowPos(WinWindowFromID(hwnd, ci.id),HWND_TOP, ci.rclSource.xLeft,ci.rclSource.yBottom,
+                  ci.rclSource.xRight-ci.rclSource.xLeft,
+                  ci.rclSource.yTop-ci.rclSource.yBottom, SWP_MOVE|SWP_SIZE);
+  oldPlayTimeProc=WinSubclassWindow(WinWindowFromID(hwnd, IDST_MMPLAYERPLAYTIME), playTimeTextProc);
+
+  /* Pos slider */
+  ci=ciControls[CTRLIDX_POSSLIDER];//ciPosSlider;
+  WinCreateWindow(hwnd, SLIDER_CLASS, "", WS_VISIBLE | WS_TABSTOP, 0,0, 10, 10,
+                  hwnd, HWND_TOP, ci.id, NULLHANDLE, NULLHANDLE);
+  WinSetWindowPos(WinWindowFromID(hwnd, ci.id),HWND_TOP, ci.rclDest.xLeft, ci.rclDest.yBottom,
+                  ci.rclSource.xRight-ci.rclSource.xLeft,
+                  ci.rclSource.yTop-ci.rclSource.yBottom, SWP_MOVE | SWP_SIZE);
+
+  WinSendMsg(WinWindowFromID(hwnd, ci.id),SLM_SETSLIDERINFO,
+             MPFROM2SHORT(SMA_SLIDERARMDIMENSIONS,0),
+             MPFROM2SHORT( 9, 9));
+
+  /* Vol slider */
+  ci=ciControls[CTRLIDX_VOLSLIDER];//ciVolSlider;
+  WinCreateWindow(hwnd, SLIDER_CLASS, "", WS_VISIBLE | WS_TABSTOP, 0,0, 10, 10,
+                  hwnd, HWND_TOP, ci.id, NULLHANDLE, NULLHANDLE);
+  WinSetWindowPos(WinWindowFromID(hwnd, ci.id),HWND_TOP, ci.rclDest.xLeft, ci.rclDest.yBottom,
+                  ci.rclSource.xRight-ci.rclSource.xLeft,
+                  ci.rclSource.yTop-ci.rclSource.yBottom, SWP_MOVE | SWP_SIZE);
+  WinSendMsg(WinWindowFromID(hwnd, ci.id),SLM_SETSLIDERINFO,
+             MPFROM2SHORT(SMA_SLIDERARMDIMENSIONS,0),
+             MPFROM2SHORT( 9, 9));
+
+}
+
+
+void playTimeCallback(HWND hwndFrame, LONG lPosSec)
+{
+  char chrCommand[50];
+  char retMsg[20];
+  ULONG rc;
+  int iWavePriv;
+
+  iWavePriv=ulPid;
+
+  /* Timeout. Check if wave is still playing */
+  sprintf(chrCommand,"STATUS wave%d MODE WAIT", iWavePriv);
+  rc = mciSendString(chrCommand, retMsg, sizeof(retMsg), 0, 0);
+  if((rc & 0x0000ffff)!=MCIERR_SUCCESS) {
+    /* Problem with MCI. Clean up. The Timer will be stopped in the method */
+    stopAudioFile(hwndFrame);
+  }
+  else {
+    if(!stricmp(retMsg, "stopped")) {
+      /* Audio file played. */
+      stopAudioFile(hwndFrame);
+    }
+    showPlayTimeDisplay(hwndFrame, TRUE);/* Ensure display is visible */
+  }
+}
+
+USHORT DrgGetNumObjects(PDRAGINFO pDragInfo)
+{
+  if(DrgAccessDraginfo(pDragInfo))
+    {
+      USHORT usItems=DrgQueryDragitemCount(pDragInfo);
+
+
+      DrgFreeDraginfo(pDragInfo);
+      return usItems;
+    }
+
+  return 0;
+}
+
+BOOL DrgVerifyTypeCW(PDRAGITEM pDragItem, char * chrType)
+{
+  /* DrgVerifyType() seems not to work when several types are in the list??
+     Dokumentation says, it works... */
+  /* Only check for a single type for now */
+  char text[CCHMAXPATH];
+
+  DrgQueryStrName(pDragItem->hstrType,sizeof(text), text); /* May be MP3, WAV etc... */
+
+  if(strstr(text, chrType))
+    return TRUE;
+
+  return FALSE;
+}
+
+/* Check if we know the file type dragged */
+BOOL DrgCheckForKnownType(PDRAGINFO pDragInfo  , HWND hwnd )
+{
+  BOOL rc=FALSE;
+
+  if(DrgAccessDraginfo(pDragInfo))
+    {
+      PDRAGITEM pDragItem;
+      //      char text[100];
+
+      pDragItem=DrgQueryDragitemPtr(pDragInfo, 0);
+      //    DrgQueryStrName(pDragItem->hstrType,sizeof(text), text); /* May be MP3, WAV etc... */
+
+      //  WinSetWindowText(hwnd, text);
+      bIsMidi=FALSE;
+      if(DrgVerifyTypeCW(pDragItem, "Digital Audio")) /* This should work for audio files added using the MM configuration */
+        rc=TRUE;
+      else if(DrgVerifyTypeCW(pDragItem, "WAV"))
+        rc=TRUE;
+      else if(DrgVerifyTypeCW(pDragItem, "MP3"))
+        rc=TRUE;
+      else if(DrgVerifyTypeCW(pDragItem, "MIDI")) {
+        rc=TRUE;
+        bIsMidi=TRUE;
+      }
+      else if(DrgVerifyTypeCW(pDragItem, "OGGS"))
+        rc=TRUE;
+      else if(DrgVerifyTypeCW(pDragItem, "VOC"))
+        rc=TRUE;
+      else if(DrgVerifyTypeCW(pDragItem, "IFF"))
+        rc=TRUE;
+      else if(DrgVerifyTypeCW(pDragItem, "AIF"))
+        rc=TRUE;
+      else if(DrgVerifyTypeCW(pDragItem, "AU"))
+        rc=TRUE;
+      else if(DrgVerifyTypeCW(pDragItem, "SND"))
+        rc=TRUE;
+      else if(DrgVerifyTypeCW(pDragItem, "_AU"))
+        rc=TRUE;
+      else if(DrgVerifyTypeCW(pDragItem, "FLAC"))
+        rc=TRUE;
+      DrgFreeDraginfo(pDragInfo);
+    }
+
+  return rc;
+}
+
+#if 0
+#define HASHSIZE 101
+/* This is poor mans HASH function... */
+USHORT calculateHash(char * theString)
+{
+  ULONG ulHash=0;
+
+  if(theString)
+    for(ulHash=0;*theString!='\0'; theString++)
+      ulHash=*theString+37*ulHash;
+
+  return ulHash%HASHSIZE;
+}
+
+/*
+  Hashes:
+
+  AIF:  0x30
+  AU:   0x42
+  WAV:  0x5b
+  MP3:  0x33
+  MIDI: 0x4c
+  OGGS: 0x58
+  IFF:  0x52
+  SND:  0x1b
+  VOC:  0x1d
+  _AU:  0x20
+ */
+BOOL DrgCheckForKnownType(PDRAGINFO pDragInfo /* , HWND hwnd */)
+{
+  BOOL rc=FALSE;
+
+return FALSE;
+  if(DrgAccessDraginfo(pDragInfo))
+    {
+      PDRAGITEM pDragItem;
+      char text[100];
+      USHORT usHash;
+
+      pDragItem=DrgQueryDragitemPtr(pDragInfo, 0);
+      DrgQueryStrName(pDragItem->hstrType,sizeof(text), text); /* May be MP3, WAV etc... */
+
+      usHash=calculateHash(text);
+      //sprintf(text,"%s, %x", text, usHash);
+      //   WinSetWindowText(hwnd, text);
+      switch(usHash)
+        {
+        case  0x30:
+        case  0x42:
+        case  0x5b:
+        case  0x33:
+        case  0x4c:
+        case  0x58:
+        case  0x52:
+        case  0x1b:
+        case  0x1d:
+        case  0x21:
+          rc=TRUE;
+        default:
+          break;
+        }
+
+      /* FIXME: Ugly Hack for MP3 files.
+         Some versions of the MP3 IO proc scan the whole file during identifying.
+         This is bad during dragging. */
+      /* Check if type contains MP3 type. There may be different types in the string */
+      if(!rc)
+        if(strstr(strupr(text), "MP3"))
+          rc=TRUE;
+
+      DrgFreeDraginfo(pDragInfo);
+    }
+
+
+  return rc;
+}
+#endif
+
+
+MRESULT handleDrag0ver(PDRAGINFO pdi, HWND hwnd)
+{
+
+  /* Only accept one file */
+  if(DrgGetNumObjects(pdi)!=1) {
+    return MRFROM2SHORT(DOR_NODROP, DO_LINK);
+  }
+  /* Check if the file is a known type. that's way faster than using mmioIdentifyFile() to check */
+  if(DrgCheckForKnownType(pdi, hwnd))
+    return MRFROM2SHORT(DOR_DROP, DO_COPY);
+
+  return MRFROM2SHORT(DOR_NEVERDROP, DO_COPY);
+}
+
+MRESULT handleDrop(PDRAGINFO pdi, HWND hwnd)
+{
+
+  /* Stop current track (if any) */
+  paintHilitedControl(WinWindowFromID(hwnd, IDPB_MMPLAYERPLAY), IDPB_MMPLAYERPLAY, FALSE);
+  paintHilitedControl(WinWindowFromID(hwnd, IDPB_MMPLAYERPAUSE), IDPB_MMPLAYERPAUSE, FALSE);
+  controlPlaying(hwnd, STOP_TRACK, 0);
+  /* Get file name */
+  if(DrgAccessDraginfo(pdi))
+    {
+      char chrFile[CCHMAXPATH];
+      PDRAGITEM pDragItem;
+
+      pDragItem=DrgQueryDragitemPtr(pdi, 0);
+      DrgQueryStrName(pDragItem->hstrSourceName,sizeof(chrFile), chrFile);
+      DrgQueryStrName(pDragItem->hstrContainerName,sizeof(chrSourceName), chrSourceName);
+      strcat(chrSourceName, chrFile);
+
+      /* Start new file */
+      controlPlaying(hwnd, PLAY_FIRST, 0);
+      DrgFreeDraginfo(pdi);
+    }
+  return MRFALSE;
+}
+
+/****************************************************************
+ *  FixSysMenu procedure
+ *--------------------------------------------------------------
+ *
+ *  Name:    FixSysMenu(HWND hwndDlg)
+ *
+ *  Purpose: This routine removes the Restore, Size, Minimize, and
+ *           Maximize options from the system menu of a dialog.
+ *
+ *  Usage
+ *
+ *  Method:  Called during the WM_INITDLG of a dialog procedure.
+ *
+ *  Returns: VOID
+ *
+ ****************************************************************/
+VOID FixSysMenu(HWND hwndDlg)
+{
+  HWND hwndMenu;                      /* Handle to system menu */
+  MENUITEM mi={0};
+
+  hwndMenu = WinWindowFromID(hwndDlg, FID_SYSMENU);
+
+
+  WinSendMsg(hwndMenu,  /* Delete Restore from the system menu */
+             MM_DELETEITEM,
+             MPFROM2SHORT(SC_RESTORE, TRUE),
+             MPFROMP(NULL));
+
+  WinSendMsg(hwndMenu,  /* Delete Size from the system menu    */
+             MM_DELETEITEM,
+             MPFROM2SHORT(SC_SIZE, TRUE),
+             MPFROMP(NULL));
+
+  WinSendMsg(hwndMenu, /* Delete Minimize from the system menu */
+             MM_DELETEITEM,
+             MPFROM2SHORT(SC_MINIMIZE, TRUE),
+             MPFROMP(NULL));
+
+  WinSendMsg(hwndMenu, /* Delete Maximize from the system menu */
+             MM_DELETEITEM,
+             MPFROM2SHORT(SC_MAXIMIZE, TRUE),
+             MPFROMP(NULL));
+
+  WinSendMsg(hwndMenu, /* Delete Maximize from the system menu */
+             MM_DELETEITEM,
+             MPFROM2SHORT(SC_HIDE, TRUE),
+             MPFROMP(NULL));
+
+  if(WinSendMsg(hwndMenu, /* Get sys menu menuitem  */
+             MM_QUERYITEM,
+             MPFROM2SHORT(SC_SYSMENU, FALSE),
+             MPFROMP(&mi)))
+    {
+      char chrText[100];
+      menuInsertMenuSeparator( mi.hwndSubMenu, NULLHANDLE, MIT_END);
+      if(!getMessage(chrText,  IDSTR_MASTERVOLUMEITEM, sizeof(chrText), RESSOURCEHANDLE, hwndMenu))
+         strcpy(chrText, "Master ~Volume");
+      menuInsertMenuItem( mi.hwndSubMenu, NULLHANDLE, MIT_END, ID_MENUITEMMASTERVOLUME, chrText);
+    }
+  return;
+}
+
+
+/* This Proc handles the main dialog */
+MRESULT EXPENTRY decodeStatusDialogProc(HWND hwnd, ULONG msg, MPARAM mp1, MPARAM mp2)
+{
+  //  char text[CCHMAXPATH*4 +10];
+  //  char title[CCHMAXPATH*4];
+  SWCNTRL swctl;
+  PID pid;
+
+  switch (msg)
+    {
+    case DM_DRAGOVER:
+      {
+      PDRAGINFO pdi=PVOIDFROMMP(mp1);
+
+      return handleDrag0ver( pdi, hwnd);
+
+      break;
+      }
+    case DM_DROP:
+      {
+        PDRAGINFO pdi=PVOIDFROMMP(mp1);
+
+        return handleDrop( pdi, hwnd);
+      }
+    case WM_INITDLG:
+      {
+        ULONG createFlags;
+        IniRestoreWindowPos(chrIniFile, INI_MMPLAYER_APP, INI_WINDOWPOS_KEY, hwnd);
+
+        /* Add switch entry */
+        memset(&swctl,0,sizeof(swctl));
+        WinQueryWindowProcess(hwnd,&pid,NULL);
+        swctl.hwnd=hwnd;
+        swctl.uchVisibility=SWL_VISIBLE;
+        swctl.idProcess=pid;
+        swctl.bProgType=PROG_DEFAULT;
+        swctl.fbJump=SWL_JUMPABLE;
+        WinAddSwitchEntry(&swctl);
+
+        adjustDialogControlPos(hwnd);
+
+        /* Set volume slider*/
+        WinSendMsg( WinWindowFromID(hwnd, IDSL_MMPLAYERVOLUME),
+                    SLM_SETSLIDERINFO,
+                    MPFROM2SHORT(SMA_SLIDERARMPOSITION,SMA_INCREMENTVALUE),
+                    MPFROMLONG( ulVolume));
+
+        /* Subclass buttons for DnD */
+        orgButtonProc=WinSubclassWindow(WinWindowFromID(hwnd, IDPB_MMPLAYERPLAY), buttonProc);
+        WinSubclassWindow(WinWindowFromID(hwnd, IDPB_MMPLAYERPAUSE), buttonProc);
+        WinSubclassWindow(WinWindowFromID(hwnd, IDPB_MMPLAYERSTOP), buttonProc);
+
+        FixSysMenu(hwnd);
+
+        /* Size dialog */
+        if(allBMPs[MAIN_BMP_IDX].hbm) {
+          SWP swp;
+
+          WinQueryWindowPos(WinWindowFromID(hwnd, FID_TITLEBAR), &swp);
+          WinSetWindowPos(WinWindowFromID(hwnd, ID_CLIENT), NULLHANDLE,
+                          WinQuerySysValue(HWND_DESKTOP, SV_CXDLGFRAME),
+                          WinQuerySysValue(HWND_DESKTOP, SV_CYDLGFRAME),
+                          allBMPs[MAIN_BMP_IDX].bmpInfoHdr.cx,
+                          allBMPs[MAIN_BMP_IDX].bmpInfoHdr.cy,
+                          SWP_SIZE|SWP_MOVE);
+          orgBgProc=WinSubclassWindow(WinWindowFromID(hwnd, ID_CLIENT), bgProc);
+
+          WinSetWindowPos(hwnd, NULLHANDLE, 0, 0,
+                          allBMPs[MAIN_BMP_IDX].bmpInfoHdr.cx+WinQuerySysValue(HWND_DESKTOP, SV_CXDLGFRAME)*2,
+                          allBMPs[MAIN_BMP_IDX].bmpInfoHdr.cy+swp.cy+WinQuerySysValue(HWND_DESKTOP, SV_CXDLGFRAME)*2
+                          , SWP_SIZE);
+        }
+        /* Set dialog font to WarpSans for Warp 4 and above */
+        if(SysQueryOSRelease()>=40) {
+          WinSetPresParam(WinWindowFromID(hwnd, IDST_MMPLAYERPLAYTIME),
+                          PP_FONTNAMESIZE,(ULONG)sizeof(DEFAULT_DIALOG_FONT),
+                          DEFAULT_DIALOG_FONT );
+        }
+        WinSetFocus(HWND_DESKTOP, WinWindowFromID(hwnd, IDPB_MMPLAYERPLAY));
+        createFlags=FCF_TITLEBAR;
+        hwndVideo=WinCreateStdWindow(HWND_DESKTOP, WS_VISIBLE, &createFlags, WC_STATIC, "Video", 0, NULLHANDLE, 123, &hwndVideoClient);
+        WinSetWindowPos(hwndVideo, NULLHANDLE, 0, 0, 300, 200, SWP_SIZE|SWP_SHOW);
+        WinStartTimer(WinQueryAnchorBlock(HWND_DESKTOP), hwnd, IDTIMER_START_PLAYING, START_TIMEOUT);
+        return (MRESULT) TRUE;
+      }
+    case WM_CLOSE:
+      controlPlaying(hwnd, STOP_TRACK, 0);
+      IniSaveWindowPos(chrIniFile, INI_MMPLAYER_APP, INI_WINDOWPOS_KEY, hwnd);
+      writeVolumeToIni(chrIniFile, INI_MMPLAYER_APP, INI_VOLUME_KEY, ulVolume);
+      writeDisplayTypeToIni(chrIniFile, INI_MMPLAYER_APP, INI_DISPLAY_KEY, iWhichDisplay);
+      //      WinSendMsg(hwndPlayObject, WM_CLOSE, 0, 0);
+      break;
+      /*****************************************************/
+      /* Handle playtime display switching.                */
+      /* The messages are coming from the static text.     */
+      /*****************************************************/
+    case WM_APPTERMINATENOTIFY:
+
+      switch(SHORT1FROMMP(mp1))
+        {
+        case NOTIFY_CLICK:
+          /* Clicked on the playtime display */
+          iWhichDisplay++;
+          if(iWhichDisplay>2)
+            iWhichDisplay=0;
+          if(iWhichDisplay==2)
+            ulDisplayTimer=0;
+          setPlayTimeText(hwnd);
+          return MRFALSE;
+        case NOTIFY_CONTEXT:
+          /* Show context menu. */
+          HlpContextMenu(hwnd, iWhichDisplay+ID_MENUITEMELAPSED, TRUE);
+          return MRFALSE;
+        default:
+          break;
+        }
+      return MRFALSE;
+
+      /*****************************************************/
+      /* The following two messages are for device sharing */
+      /*****************************************************/
+    case WM_ACTIVATE:
+      if(SHORT1FROMMP(mp1)){
+        char chrCommand[100];
+        int iWavePriv;
+
+        iWavePriv=ulPid;
+
+        if(bIsPlaying) {
+          sprintf(chrCommand,"ACQUIRE wave%d QUEUE wait", iWavePriv);
+          mciSendString(chrCommand, NULL, 0, 0, 0);
+        }
+      }
+      break;
+
+    case MM_MCIPASSDEVICE:
+      {
+        switch(SHORT1FROMMP(mp2))
+          {
+          case MCI_GAINING_USE:
+            bPaused=FALSE;/* The time display will not be increased */
+            paintHilitedControl(WinWindowFromID(hwnd, IDPB_MMPLAYERPAUSE), IDPB_MMPLAYERPAUSE, FALSE);
+            return (MRESULT)0;
+          case MCI_LOSING_USE:
+            bPaused=TRUE;
+            paintHilitedControl(WinWindowFromID(hwnd, IDPB_MMPLAYERPLAY), IDPB_MMPLAYERPLAY, FALSE);
+            return (MRESULT)0;
+          default:
+            break;
+          }
+      }
+      break;
+      /*****************************************************/
+      /* Set the time in the palytime display.             */
+      /* SETPOSITIONADVICE does not work for some reason,  */
+      /* so a timer is used. Yes, it's quit cumbersome...  */
+      /*****************************************************/
+    case WM_TIMER:
+      if(SHORT1FROMMP(mp1)==IDTIMER_PLAY) {
+        if(!bPaused) {
+          /* Adjust position info */
+          ulPos++;
+          if(ulPos*1000>ulTotalLength)
+            ulPos=ulTotalLength/1000;/* Prevent wrong time if timer info isn't accurate.
+                                                          I know all this timing stuff is an ugly thing. */
+
+
+          if(!bPosDragging) {
+            ULONG ulInc=ulTotalLength/1000;
+            setPlayTimeText(hwnd); /* Set time display */
+            /* Catch potential division by zero trap */
+            if(ulInc)
+              ulInc=ulPos*100/ulInc;
+            else
+              ulInc=100;
+            /* Set slider position */
+
+            WinPostMsg( WinWindowFromID(hwnd, IDSL_MMPLAYERPOSBAR),
+                        SLM_SETSLIDERINFO,
+                        MPFROM2SHORT(SMA_SLIDERARMPOSITION,SMA_INCREMENTVALUE),
+                        MPFROMLONG(ulInc));
+
+          }
+
+          playTimeCallback(hwnd, ulPos);
+          /* Blink play control */
+          paintHilitedControl(WinWindowFromID(hwnd, IDPB_MMPLAYERPLAY), IDPB_MMPLAYERPLAY, ulPos%2);
+        }
+        else {
+          /* Currently pausing */
+          togglePlayTimeDisplayVisibility(hwnd);
+          paintHilitedControl(  WinWindowFromID(hwnd, IDPB_MMPLAYERPAUSE), IDPB_MMPLAYERPAUSE,
+                                WinIsWindowVisible(WinWindowFromID(hwnd, IDST_MMPLAYERPLAYTIME)));
+        }
+        return (MRESULT)0;
+      }
+      else if(SHORT1FROMMP(mp1)==IDTIMER_START_PLAYING)
+        {
+          WinStopTimer(WinQueryAnchorBlock(hwnd), hwnd, IDTIMER_START_PLAYING);
+          //playAudioFile(HWND_DESKTOP);
+          controlPlaying(hwnd, PLAY_FIRST, 0);
+          return (MRESULT)0;
+        }
+      break;
+
+      /* The play control handling for starting, stopping etc. */
+    case WM_COMMAND:
+      {
+        switch(SHORT1FROMMP(mp1))
+          {
+          case IDPB_MMPLAYERPLAY:
+            paintHilitedControl(WinWindowFromID(hwnd, IDPB_MMPLAYERPAUSE), IDPB_MMPLAYERPAUSE, FALSE);
+            controlPlaying(hwnd, PLAY_FIRST, 0);
+            break;
+          case IDPB_MMPLAYERSTOP:
+            paintHilitedControl(WinWindowFromID(hwnd, IDPB_MMPLAYERPLAY), IDPB_MMPLAYERPLAY, FALSE);
+            paintHilitedControl(WinWindowFromID(hwnd, IDPB_MMPLAYERPAUSE), IDPB_MMPLAYERPAUSE, FALSE);
+            controlPlaying(hwnd, STOP_TRACK, 0);
+            break;
+          case IDPB_MMPLAYERPAUSE:
+            paintHilitedControl(WinWindowFromID(hwnd, IDPB_MMPLAYERPLAY), IDPB_MMPLAYERPLAY, FALSE);
+            controlPlaying(hwnd, PAUSE_TRACK, 0);
+            break;
+            /* Popup menu over time control */
+          case ID_MENUITEMELAPSED:
+            iWhichDisplay=DISPLAY_TIMEELAPSED;
+            setPlayTimeText(hwnd);
+            break;
+          case ID_MENUITEMREMAINING:
+            iWhichDisplay=DISPLAY_TIMEREMAINING;
+            setPlayTimeText(hwnd);
+            break;
+          case ID_MENUITEMID3:
+            iWhichDisplay=DISPLAY_TIMEID3;
+            ulDisplayTimer=0;
+            setPlayTimeText(hwnd);
+            break;
+          case ID_MENUITEMMASTERVOLUME:
+            {
+              HOBJECT hObject;
+              /* User selected master volume item from sys menu */
+              if((hObject=WinQueryObject("<MMPM2_MMVOLUME>"))!=NULLHANDLE) {
+                WinOpenObject(hObject,OPEN_DEFAULT,TRUE);
+              }
+              break;
+            }
+          default:
+            break;
+          }/* switch() */
+
+      return (MRESULT)FALSE;
+      }/* case */
+
+      /*****************************************************/
+      /* Draw the sliders.                                 */
+      /*****************************************************/
+    case WM_DRAWITEM:
+      switch(SHORT1FROMMP(mp1))
+        {
+        case IDSL_MMPLAYERPOSBAR:
+        case IDSL_MMPLAYERVOLUME:
+          return drawSlider(hwnd, msg, mp1, mp2, SHORT1FROMMP(mp1));
+        default:
+          break;
+        }
+      break;
+
+      /*****************************************************/
+      /* Control messages                                  */
+      /*****************************************************/
+    case WM_CONTROL:
+      {
+        SWP swp;
+        char chrCommand[50];
+        char retMsg[20];
+
+        switch(SHORT2FROMMP(mp1))
+          {
+          case BN_PAINT:
+            /* Paint the custom controls (buttons, sliders ) */
+            WinQueryWindowPos(hwnd,&swp);
+            if(swp.fl & SWP_MINIMIZE)
+              break;
+            return paintControls(hwnd, msg, mp1, mp2);
+              /*****************************************************/
+              /* Handle position and volume changes.               */
+              /*****************************************************/
+            case SLN_SLIDERTRACK:
+              {
+                switch(SHORT1FROMMP(mp1))
+                  {
+                  case IDSL_MMPLAYERVOLUME:
+                    {
+                      ULONG ulValue;
+
+                      ulValue=LONGFROMMP(mp2);
+                      ulVolume=ulValue;
+                      sprintf(chrCommand,"SET wave%ld AUDIO VOLUME %ld WAIT", ulPid, ulVolume);
+                      mciSendString(chrCommand, retMsg, sizeof(retMsg), 0, 0);
+                      break;
+                    }
+                  case IDSL_MMPLAYERPOSBAR:
+                    {
+                      static long lLastPos=0;
+                      long lPos=LONGFROMMP(mp2);
+
+                      bPosDragging=TRUE;
+                      lPos*=ulTotalLength/100;
+                      if(lPos/1000!=lLastPos) {
+                        /* Prevent flickering */
+                        sprintf(chrCommand, "%li:%02li", lPos/1000/60, (lPos/1000)%60);
+                        WinSetWindowText(WinWindowFromID(hwnd, IDST_MMPLAYERPLAYTIME), chrCommand);
+                        lLastPos=lPos/1000;
+                      }
+                      break;
+                    }
+                  default:
+                    break;
+                  }/* switch */
+                return (MRESULT) 0;
+                break;
+              }
+            case SLN_CHANGE:
+              {
+                switch(SHORT1FROMMP(mp1))
+                  {
+                  case IDSL_MMPLAYERVOLUME:
+                    {
+                      ULONG ulValue;
+
+                      ulValue=LONGFROMMP(mp2);
+                      ulVolume=ulValue;
+                      sprintf(chrCommand,"SET wave%ld AUDIO VOLUME %ld WAIT", ulPid, ulVolume);
+                      mciSendString(chrCommand, retMsg, sizeof(retMsg), 0, 0);
+                      break;
+                    }
+                  case IDSL_MMPLAYERPOSBAR:
+                    {
+                      long lPos=LONGFROMMP(mp2);
+
+                      bPosDragging=FALSE;
+                      lPos*=1000;
+                      lPos*=ulTotalLength/100;
+                      lPos/=1000;// Use only full seconds
+
+                      /* Set time display first */
+                      seekAudioFile(lPos);
+                      /* restart timer */
+                      WinStartTimer(WinQueryAnchorBlock(hwnd), hwnd, IDTIMER_PLAY, PLAYTIMER_DELAY);
+                      ulPos=lPos/1000;
+                      break;
+                    }
+                  default:
+                    break;
+                  }/* switch */
+                return (MRESULT)TRUE;
+              }
+          default:
+            break;
+          }/* switch */
+        break;
+      }/* WM_CONTROL */
+    default:
+      break;
+    }/* switch */
+
+  return WinDefDlgProc( hwnd, msg, mp1, mp2);
+}
+
+BOOL cwGetStringFromEA( char * chrFileName, PSZ pKey, char * chrBuffer, ULONG ulBuffSize)
+{
+  LONG rc;                             /* Ret code                   */
+  UCHAR       geabuff[300];            /* buffer for GEA             */
+  PVOID       fealist;                 /* fealist buffer             */
+  EAOP2       eaop;                    /* eaop structure             */
+  PGEA2       pgea;                    /* pgea structure             */
+  PFEA2       pfea;                    /* pfea structure             */
+  HFILE       handle;                  /* file handle                */
+  ULONG       act;                     /* open action                */
+  ULONG ulSize;
+  USHORT     *ptrUs;
+
+  if((fealist=malloc(0x00010000L /* Add some space */
+                     ))==NULL)
+    return FALSE;
+
+  ulSize=sizeof(chrFileName);
+
+  if ((rc = DosOpen(chrFileName, &handle, &act,
+                    0L, 0, OPEN_ACTION_OPEN_IF_EXISTS,
+                    OPEN_ACCESS_READONLY + OPEN_SHARE_DENYREADWRITE +
+                    OPEN_FLAGS_FAIL_ON_ERROR + OPEN_FLAGS_WRITE_THROUGH,NULL))!=NO_ERROR) {
+    free(fealist);    /* Free the memory            */
+    return FALSE;
+  }                                    /* get the file status info   */
+
+                                       /* FEA and GEA lists          */
+  eaop.fpGEA2List = (PGEA2LIST)geabuff;
+  eaop.fpFEA2List = (PFEA2LIST)fealist;
+  eaop.oError = 0;                     /* no error occurred yet      */
+  pgea = &eaop.fpGEA2List->list[0];    /* point to first GEA         */
+  eaop.fpGEA2List->cbList = sizeof(ULONG) + sizeof(GEA2) +
+    strlen(pKey);
+  eaop.fpFEA2List->cbList = (ULONG)0xffff;
+
+                                       /* fill in the EA name length */
+  pgea->cbName = (BYTE)strlen(pKey);
+  strcpy(pgea->szName, pKey);          /* fill in the name           */
+  pgea->oNextEntryOffset = 0;          /* fill in the next offset    */
+                                       /* read the extended attribute*/
+  rc = DosQueryFileInfo(handle, 3, (PSZ)&eaop, sizeof(EAOP2));
+  DosClose(handle);                    /* close the file             */
+  if (eaop.fpFEA2List->cbList <= sizeof(ULONG))
+    rc = ERROR_EAS_NOT_SUPPORTED;      /* this is error also         */
+
+  if (rc) {                            /* failure?                   */
+    free(fealist);    /* Free the memory            */
+    return FALSE;
+  }
+
+  pfea = &(eaop.fpFEA2List->list[0]);  /* point to the first FEA     */
+
+  ptrUs=(USHORT*)((PSZ)pfea->szName+(pfea->cbName+1));
+  if(*ptrUs!=0xfffd) {
+    /* Not an ASCII EA */
+    free(fealist);    /* Free the memory            */
+    return FALSE;
+  }
+  ptrUs++; /* Move to length */
+  ulSize=(ULONG)*ptrUs;
+
+  ptrUs++; /* Move to value */
+  if(ulSize==0) {
+    /* Not an ASCII EA */
+    free(fealist);    /* Free the memory            */
+    return FALSE;
+  }
+
+  memset(chrBuffer,0,ulBuffSize);
+  memcpy(chrBuffer, (char*)ptrUs, (ulSize>=ulBuffSize ? ulBuffSize-1 : ulSize));
+  free(fealist);    /* Free the memory            */
+  return TRUE;
+}
+
+int readVolumeFromIni(char * iniFile, char* chrApp, char *chrKey, int iDefault)
+{
+  return IniRestoreInt(iniFile, chrApp, chrKey, iDefault);
+}
+
+BOOL writeVolumeToIni(char * iniFile, char* chrApp, char *chrKey, ULONG ulVolume)
+{
+
+  return IniSaveInt(iniFile, chrApp, chrKey, ulVolume);
+}
+
+int readDisplayTypeFromIni(char * iniFile, char* chrApp, char *chrKey, int iDefault)
+{
+  return IniRestoreInt(iniFile, chrApp, chrKey, iDefault);
+}
+
+BOOL writeDisplayTypeToIni(char * iniFile, char* chrApp, char *chrKey, int iDisplay)
+{
+  return IniSaveInt(iniFile, chrApp, chrKey, iDisplay);
+}
+
+
+int main (int argc, char *argv[])
+{
+  HAB  hab;
+  HMQ  hmq;
+  char text[CCHMAXPATH];
+  char title[CCHMAXPATH];
+  short a;
+  PTIB ptib;
+  PPIB ppib;
+
+  /* Create a copy of the args */
+  /* argv[0]: progname
+   * argv[1]: audio file
+   */
+
+  numArgs=argc;
+
+  strcpy(text,"");
+  for(a=0;a<argc;a++)
+    {
+      params[a]=argv[a];
+    }
+
+      /* Save source name */
+  strcpy(chrSourceName, argv[1]);
+  if(DosGetInfoBlocks(&ptib, &ppib)==NO_ERROR)
+    {
+      printf("Got info block...\n");
+      ulPid=ppib->pib_ulpid;
+      ppib->pib_ultype=3; /* Morph into PM */
+    }
+
+  hab=WinInitialize(0);
+  if(hab) {
+    hmq=WinCreateMsgQueue(hab,0);
+    if(hmq) {
+      /* Check if user started prog by hand */
+      if(argc!=NUMPARAMS) {/* Not the right num of params */
+        pmUsage();
+      }
+      else {
+
+        /* Save source name */
+        strcpy(chrSourceName, params[1]);
+        //strcpy(chrSourceName, "H:\\cwmm\\classes\\mm-progs\\MMPlayer\\01 Vicious Circle - Propaganda - 1234.WAV");
+        if((chrPtrName=strrchr(chrSourceName, '\\'))!=NULLHANDLE)
+          ++chrPtrName;
+
+          bIsMidi=FALSE;
+
+        /* Class name. We need it to distinguish MIDI and audio files */
+        if(argc==3)
+          strcpy(chrClassName, params[1]);
+
+        /* Get our ressource dll */
+        RESSOURCEHANDLE=queryResModuleHandle(argv[0]);
+        /* Get data from INI file */
+        HlpBuildMMProgIniFileName(argv[0], chrIniFile, sizeof(chrIniFile));
+        ulVolume=readVolumeFromIni(chrIniFile, INI_MMPLAYER_APP, INI_VOLUME_KEY, DEFAULT_VOLUME);
+        iWhichDisplay=readDisplayTypeFromIni(chrIniFile, INI_MMPLAYER_APP, INI_DISPLAY_KEY, 0);
+
+        /* Load pointer for slider */
+        hptrArrowWE=WinLoadPointer(HWND_DESKTOP, BMP_RESSOURCEHANDLE /*_queryResModuleHandle()*/, IDPTR_ARROWWE);
+        /* Register the slider window class */
+        WinRegisterClass(WinQueryAnchorBlock(HWND_DESKTOP), SLIDER_CLASS, privateSliderProc,0, SLADDBYTES);
+
+        _loadBmps();
+        DosGetInfoBlocks(&ptib, &ppib);
+        ulPid=ppib->pib_ulpid;
+        _beginthread(playThreadFunc,NULL,8192*16, NULLHANDLE); //Fehlerbehandlung fehlt
+        //  playAudioFile(HWND_DESKTOP);
+        //DosBeep(5000, 400);
+
+        if( WinDlgBox( HWND_DESKTOP, NULLHANDLE, decodeStatusDialogProc,
+                       RESSOURCEHANDLE, IDDLG_MMPLAYER, 0) == DID_ERROR )
+          {
+            /*
+              Text:
+              Title:  "Installation problem"
+              */
+            messageBox( text, IDSTR_CONVERTDIALOGERROR , sizeof(text),
+                        title, IDSTR_INSTALLERRORTITLE , sizeof(title),
+                        RESSOURCEHANDLE, HWND_DESKTOP, MB_OK | MB_ICONEXCLAMATION | MB_MOVEABLE);
+            freeResHandle();
+            WinDestroyMsgQueue( hmq );
+            WinTerminate( hab );
+            DosBeep(100,600);
+            return( 1 );
+          }
+      }
+      freeResHandle();
+      WinDestroyMsgQueue(hmq);
+    }
+    WinTerminate(hab);
+  }
+  if(DosGetInfoBlocks(&ptib, &ppib)==NO_ERROR)
+    {
+      printf("Got info block...\n");
+      ulPid=ppib->pib_ulpid;
+      ppib->pib_ultype=2; /* Morph into VIO */
+    }
+
+  exit(0);
+  return 0;
+}
+
Index: /tags/CWMM-0.3.0_GA/classes/mm-progs/videoplayer/mmplayer.h
===================================================================
--- /tags/CWMM-0.3.0_GA/classes/mm-progs/videoplayer/mmplayer.h	(revision 213)
+++ /tags/CWMM-0.3.0_GA/classes/mm-progs/videoplayer/mmplayer.h	(revision 213)
@@ -0,0 +1,110 @@
+/*
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; see the file COPYING.  If not, write to
+ * the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+/*
+ * If you need another license for your project/product (commercial,
+ * noncommercial, whatever) contact me at
+ * 
+ * http://www.os2world.com/cdwriting
+ * http://www.geocities.com/SiliconValley/Sector/5785/
+ *
+ */
+
+
+/* Used for sending a click event from the time control to the play control */
+#define NOTIFY_CLICK       1 /* For WM_APPTERMINATENOTIFY */
+/* Same for context menu */
+#define NOTIFY_CONTEXT     2
+
+/* Which display to show */
+#define DISPLAY_TIMEELAPSED    0
+#define DISPLAY_TIMEREMAINING  1
+#define DISPLAY_TIMEID3        2
+
+/* Which track to start */
+#define PLAY_FIRST    1L
+#define PLAY_NEXT     2L
+#define PLAY_PREV     3L
+#define PAUSE_TRACK   4L
+#define STOP_TRACK    5L
+#define SEEK_TRACK    6L
+
+#define  MAIN_BMP_IDX              0
+#define  CTRLIDX_PLAYBUTTON        1
+#define  CTRLIDX_PLAYBUTTONSEL     2
+#define  CTRLIDX_STOPBUTTON        3
+#define  CTRLIDX_STOPBUTTONSEL     4
+#define  CTRLIDX_PAUSEBUTTON       5
+#define  CTRLIDX_PAUSEBUTTONSEL    6
+#define  CTRLIDX_POSSLIDER         7
+#define  CTRLIDX_POSSLIDERARM      8
+#define  CTRLIDX_PLAYTIME          9
+#define  CTRLIDX_VOLSLIDER         10
+#define  CTRLIDX_VOLSLIDERARM      11
+#define  CTRLIDX_VOLSLIDERARMSEL   12
+
+#if 0
+#define  CTRLIDX_TOPLEFT           7
+#define  CTRLIDX_TOPRIGHT          8
+#define  CTRLIDX_BOTTOM            19
+#define  CTRLIDX_CHECK             20
+#define  CTRLIDX_UNCHECK           21
+#define  CTRLIDX_CHECKSEL          22
+#define  CTRLIDX_UNCHECKSEL        23
+#define  CTRLIDX_RANDOMCHECK             24
+#define  CTRLIDX_RANDOMUNCHECK           25
+#define  CTRLIDX_RANDOMCHECKSEL          26
+#define  CTRLIDX_RANDOMUNCHECKSEL        27
+#endif
+
+#define  NUM_CTRL_IDX              13
+
+/* Slider window class name */
+#define SLIDER_CLASS     "CWSLIDER"
+
+/* New slider window class            */
+/* Data positions in the window words */
+#define SLIDERARMWIDTH    0  /* USHORT */
+#define SLIDERARMHEIGHT  2  /* USHORT */
+#define PTRPOSINSLARM    4  /* USHORT */
+#define SLINCREMENTS     6  /* USHORT */
+#define SLIDERCX         8  /* ULONG */
+#define SLIDERCY         12 /* ULONG */
+#define SLIDERX          16 /* ULONG */
+#define SLIDERY          20 /* ULONG */
+#define SLIDERARMPOS     24 /* LONG  */
+#define SLDRAGGING       28 /* BOOL  */
+#define SLADDBYTES       32 /* num additional window bytes for slider */
+
+typedef struct
+{
+  INT id;
+  RECTL rclSource;
+  HBITMAP hbmSource;
+  RECTL rclDest;
+}CONTROLINFO;
+
+typedef struct
+{
+  BITMAPINFOHEADER bmpInfoHdr;
+  HBITMAP hbm;
+}LOADEDBITMAP;
+
+/* The IDs for the playtime display */
+#define IDTIMER_PLAY  5L
+#define PLAYTIMER_DELAY 1000
+
+#define IDTIMER_START_PLAYING 6L
+#define START_TIMEOUT 500
Index: /tags/CWMM-0.3.0_GA/classes/mm-progs/videoplayer/mmplayer.rc
===================================================================
--- /tags/CWMM-0.3.0_GA/classes/mm-progs/videoplayer/mmplayer.rc	(revision 213)
+++ /tags/CWMM-0.3.0_GA/classes/mm-progs/videoplayer/mmplayer.rc	(revision 213)
@@ -0,0 +1,30 @@
+#ifndef OS2_INCLUDED
+   #include <os2.h>
+#endif
+#include "mmplayerres.h"
+
+BITMAP IDBMP_TOPMIDDLE        "./res/bmp/mmplayer.bmp"
+
+BITMAP IDBMP_SKIPBACK         "./res/bmp/Wrwd2.bmp"   
+BITMAP IDBMP_SKIPBACKSEL      "./res/bmp/Brwd2.bmp"   
+
+BITMAP IDBMP_PLAY             "./res/bmp/WSTART2.bmp"
+BITMAP IDBMP_PLAYSEL          "./res/bmp/BSTART2.bmp"
+
+BITMAP IDBMP_PAUSE            "./res/bmp/wPause2.bmp"
+BITMAP IDBMP_PAUSESEL         "./res/bmp/BPause2.bmp"
+
+BITMAP IDBMP_STOP             "./res/bmp/Wstop2.bmp"
+BITMAP IDBMP_STOPSEL          "./res/bmp/Bstop2.bmp"
+
+BITMAP IDBMP_SKIPFORWARD      "./res/bmp/WFWD2.bmp"
+BITMAP IDBMP_SKIPFORWARDSEL   "./res/bmp/BFWD2.bmp" 
+
+BITMAP IDBMP_POSSLIDERARM     "./res/bmp/PosArm.bmp"
+
+BITMAP IDBMP_VOLSLIDERARM    "./res/bmp/WVOL.bmp"
+BITMAP IDBMP_VOLSLIDERARMSEL "./res/bmp/BVOL.bmp"
+
+POINTER IDPTR_ARROWWE        "./res/pointer/arrowwe.ptr"
+
+
Index: /tags/CWMM-0.3.0_GA/classes/mm-progs/videoplayer/mmplayerres.h
===================================================================
--- /tags/CWMM-0.3.0_GA/classes/mm-progs/videoplayer/mmplayerres.h	(revision 213)
+++ /tags/CWMM-0.3.0_GA/classes/mm-progs/videoplayer/mmplayerres.h	(revision 213)
@@ -0,0 +1,27 @@
+
+
+#define IDBMP_SKIPBACK		       2102
+#define IDBMP_PLAY                 2103
+#define IDBMP_PAUSE                2104
+#define IDBMP_STOP                 2105
+#define IDBMP_SKIPFORWARD          2106
+#define IDBMP_BUTTONUP             2107
+#define IDBMP_BUTTONDOWN           2108
+#define IDBMP_TOPMIDDLE            2109
+#define IDBMP_POSSLIDERARM         2110
+#define IDBMP_VOLSLIDERARM         2111
+#define IDBMP_VOLSLIDERARMSEL      2112
+#define IDBMP_TOPLEFT              2113
+#define IDBMP_TOPRIGHT             2114
+#define IDBMP_PLAYSEL              2115
+#define IDBMP_SKIPFORWARDSEL       2116
+#define IDBMP_SKIPBACKSEL	       2117
+#define IDBMP_PAUSESEL             2118
+#define IDBMP_STOPSEL              2119
+#define IDBMP_BOTTOM               2120
+#define IDBMP_CHECK                2121
+#define IDBMP_UNCHECK              2122
+#define IDBMP_CHECKSEL             2123
+#define IDBMP_UNCHECKSEL           2124
+
+#define IDPTR_ARROWWE              2
Index: /tags/CWMM-0.3.0_GA/classes/mm-progs/videoplayer/playaudio.c
===================================================================
--- /tags/CWMM-0.3.0_GA/classes/mm-progs/videoplayer/playaudio.c	(revision 213)
+++ /tags/CWMM-0.3.0_GA/classes/mm-progs/videoplayer/playaudio.c	(revision 213)
@@ -0,0 +1,368 @@
+/*
+ * mmplayer.c (C) Chris Wohlgemuth 2002-2003
+ *
+ */
+/*
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; see the file COPYING.  If not, write to
+ * the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+/*
+ * If you need another license for your project/product (commercial,
+ * noncommercial, whatever) contact me at
+ * 
+ * http://www.os2world.com/cdwriting
+ * http://www.geocities.com/SiliconValley/Sector/5785/
+ *
+ */
+
+#define INCL_DOS
+#define INCL_DOSFILEMGR
+#define INCL_DOSERRORS
+#define INCL_WIN
+#define INCL_OS2MM
+#define INCL_MMIOOS2
+#define INCL_MCIOS2
+#define INCL_GPI
+#define INCL_PM
+
+#include <os2.h>
+//#include "except_2.h"
+#include <sys\types.h>
+#include <sys\stat.h>
+#include <stdio.h>
+#include <string.h>
+#include <stdlib.h>
+#include "os2me.h"
+
+#include "common.h"
+
+#include "mmplayerres.h"
+#include "mmplayer.h"
+#include "sys_funcs.h"
+
+
+
+/* The object window controling the trac playing */
+HWND hwndPlayObject;
+extern PID ulPid;
+/* TRUE when track is playing */
+extern BOOL bIsPlaying;
+/* TRUE when track is paused */
+extern BOOL bPaused;
+/* Current time in track */
+extern ULONG ulPos;
+extern ULONG ulTotalLength;
+extern BOOL bIsMidi;
+extern ULONG ulVolume;
+
+extern char chrSourceName[CCHMAXPATH];
+
+extern HWND hwndVideo, hwndVideoClient;
+
+void showPlayTimeDisplay(HWND hwndFrame, BOOL bShow);
+void _resetDisplay(HWND hwndFrame);
+void setPlayTimeText2( HWND hwndDialog, char * theText);
+
+BOOL pauseAudioFile(HWND hwndFrame)
+{
+  int iWavePriv;
+  char chrCommand[50];
+  char retMsg[100];
+  ULONG rc;
+
+  iWavePriv=ulPid;
+
+  if(bPaused) {
+    sprintf(chrCommand,"RESUME wave%d wait", iWavePriv);
+    rc = mciSendString(chrCommand, retMsg, sizeof(retMsg), 0, 0);
+    bPaused=FALSE;
+    showPlayTimeDisplay( hwndFrame, TRUE);
+  }
+  else {
+    sprintf(chrCommand,"PAUSE wave%d wait", iWavePriv);
+    rc = mciSendString(chrCommand, retMsg, sizeof(retMsg), 0, 0);
+    bPaused=TRUE;
+  }
+  return TRUE;
+}
+
+BOOL stopAudioFile(HWND hwndFrame)
+{
+  int iWavePriv;
+  char chrCommand[50];
+  char retMsg[100];
+  ULONG rc;
+
+  iWavePriv=ulPid;
+  
+  if(bIsPlaying) {
+    sprintf(chrCommand,"stop wave%d wait", iWavePriv);
+    rc = mciSendString(chrCommand, retMsg, sizeof(retMsg), 0, 0);
+    
+    sprintf(chrCommand,"close wave%d wait", iWavePriv);
+    rc = mciSendString(chrCommand, retMsg, sizeof(retMsg), 0, 0);
+    
+    _resetDisplay(hwndFrame);
+    showPlayTimeDisplay( hwndFrame, TRUE);
+    WinStopTimer(WinQueryAnchorBlock(hwndFrame), hwndFrame, IDTIMER_PLAY);
+    bIsPlaying=FALSE;
+    bPaused=FALSE;  
+  }
+  return TRUE;
+}
+
+ULONG playAudioFile(HWND hwndFrame)
+{
+  char chrCommand[CCHMAXPATH*2];
+  char chrDevice[30];
+  char retMsg[20];
+  ULONG rc;
+  int iWavePriv;
+  int iTime2 = 0;
+  HWND hwndNotify;
+
+
+  if(bPaused)
+    {
+      pauseAudioFile(hwndFrame);
+      return 1;
+    }
+
+  iWavePriv=++ulPid;
+  ulPos=0;
+
+  stopAudioFile(hwndFrame);
+
+
+#if 0
+  if(!getMessage(chrCommand, IDSTR_STARTINGTRACK, sizeof(chrCommand), queryResModuleHandle(),  hwndFrame))
+#endif
+    sprintf(chrCommand, "Starting track...");
+  setPlayTimeText2(hwndFrame, chrCommand);
+
+#if 0
+  if(bIsMidi)
+    strncpy(chrDevice,"SEQUENCER", sizeof(chrDevice));
+  else
+    strncpy(chrDevice,"WAVEAUDIO", sizeof(chrDevice));
+#endif
+  strncpy(chrDevice,"DIGITALVIDEO02", sizeof(chrDevice) - 1);
+  //  strncpy(chrDevice,"xine", sizeof(chrDevice));
+  hwndNotify=hwndFrame;//WinWindowFromID(hwndTop, IDDLG_TOPMIDDLE);
+
+
+
+    /* Start audio file */
+    sprintf(chrCommand,"open \"%s\"  type %s PARENT %lx alias wave%d SHAREABLE wait",
+            chrSourceName, chrDevice, hwndVideo, iWavePriv);
+
+    sprintf(chrCommand,"open \"%s\"  type %s alias wave%d SHAREABLE wait",
+            chrSourceName, chrDevice, iWavePriv);
+
+    SysWriteToTrapLog("Here %s\n %s\n", chrSourceName, chrCommand);
+    
+    //  sprintf(chrCommand,"open digitalvideo01 alias vid  wait", chrSourceName, iWavePriv);
+    //  sprintf(chrCommand,"open \"%s\"  alias wave%d SHAREABLE wait", chrSourceName, iWavePriv);
+    rc = mciSendString(chrCommand, retMsg, sizeof(retMsg), hwndNotify, 0);
+
+  if((rc & 0x0000ffff)!=MCIERR_SUCCESS) {
+    SysWriteToTrapLog("Open error %d!\n", (rc & 0x0000ffff));
+    DosBeep(5000, 400);
+    return 0;
+  }  
+
+  printf("!!!!!!!!!!!!!!!!!!!!!!!!!!!\n");
+  
+#if 0
+  sprintf(chrCommand,"open %s alias wave%d SHAREABLE wait",
+          chrDevice, iWavePriv);
+  sprintf(chrCommand,"open %s alias wave%d SHAREABLE wait",
+          "digitalvideo", iWavePriv);
+  if((rc & 0x0000ffff)!=MCIERR_SUCCESS) {
+    SysWriteToTrapLog("Open error %d!\n", (rc & 0x0000ffff));
+    DosBeep(5000, 400);
+    return 0;
+  }
+
+  sprintf(chrCommand,"window %s HANDLE %ld wait",
+          chrDevice, hwndVideo);
+  if((rc & 0x0000ffff)!=MCIERR_SUCCESS) {
+    SysWriteToTrapLog("window error %d!\n", (rc & 0x0000ffff));
+    DosBeep(3000, 400);
+    return 0;
+  }
+  sprintf(chrCommand,"LOAD %s %s  wait",
+          chrDevice, chrSourceName);
+  if((rc & 0x0000ffff)!=MCIERR_SUCCESS) {
+    SysWriteToTrapLog("window error %d!\n", (rc & 0x0000ffff));
+    DosBeep(3000, 400);
+    return 0;
+  }
+#endif
+
+SysWriteToTrapLog("Here! %s\n", chrCommand);
+
+
+
+
+#if 0
+  /* Set time format */
+  sprintf(chrCommand,"SET wave%d TIME FORMAT MILLISECONDS wait", iWavePriv);
+  rc = mciSendString(chrCommand, retMsg, sizeof(retMsg), 0, 0);
+  if((rc & 0x0000ffff)!=MCIERR_SUCCESS) {
+    sprintf(chrCommand,"close wave%d wait",iWavePriv);
+    rc = mciSendString(chrCommand, retMsg, sizeof(retMsg), 0, 0);
+    return 0;
+  }      
+#endif
+
+#if 0
+  sprintf(chrCommand,"SETPOSITIONADVISE wave%d ON EVERY 1000 notify", iWavePriv);
+  rc = mciSendString(chrCommand, retMsg, sizeof(retMsg),hwndNotify, 0);
+  if((rc & 0x0000ffff)!=MCIERR_SUCCESS) {
+    sprintf(chrCommand,"close wave%d wait",iWavePriv);
+    rc = mciSendString(chrCommand, retMsg, sizeof(retMsg), 0, 0);
+    return 0;
+  }
+#endif
+
+  /* Get wave length in ms */
+  sprintf(chrCommand,"STATUS wave%d LENGTH WAIT", iWavePriv);
+  rc = mciSendString(chrCommand, retMsg, sizeof(retMsg), 0, 0);
+  if((rc & 0x0000ffff)==MCIERR_SUCCESS) {
+    iTime2=atoi(retMsg);
+    sprintf(chrCommand,"%d:%02d  %d:%02d  -%d:%02d",iTime2/1000/60,(iTime2/1000)%60,
+            0, 0,
+            iTime2/1000/60,(iTime2/1000)%60);
+  }
+  ulTotalLength=iTime2;
+
+#if 0
+  /* Set volume */
+  sprintf(chrCommand,"SET wave%d AUDIO VOLUME %ld wait", iWavePriv, ulVolume);
+  rc = mciSendString(chrCommand, retMsg, sizeof(retMsg), 0, 0);
+  if((rc & 0x0000ffff)!=MCIERR_SUCCESS) {
+    sprintf(chrCommand,"close wave%d",iWavePriv);
+    rc = mciSendString(chrCommand, retMsg, sizeof(retMsg), 0, 0);
+    return 0;
+  }
+#endif
+
+  sprintf(chrCommand,"play wave%d FROM 0", iWavePriv);
+  rc = mciSendString(chrCommand, retMsg, sizeof(retMsg), 0, 0);
+  if((rc & 0x0000ffff)!=MCIERR_SUCCESS) {
+    sprintf(chrCommand,"close wave%d",iWavePriv);
+    rc = mciSendString(chrCommand, retMsg, sizeof(retMsg), 0, 0);
+    return 0;
+  }
+
+  WinStartTimer(WinQueryAnchorBlock(hwndFrame), hwndFrame, IDTIMER_PLAY, PLAYTIMER_DELAY);
+
+  bIsPlaying=TRUE;
+  return 1;
+}
+
+BOOL seekAudioFile(LONG lPosSec)
+{
+  char chrCommand[50];
+  char retMsg[20];
+  APIRET rc;
+
+  sprintf(chrCommand,"PLAY wave%ld from %ld", ulPid, lPosSec);
+  rc=mciSendString(chrCommand, retMsg, sizeof(retMsg), 0, 0);
+  //  ulStartPosition=lPosSec;
+  bPaused=FALSE;
+
+  return TRUE;
+}
+
+void controlPlaying(HWND hwndDialog, ULONG ulAction, ULONG ulReserved)
+{
+  HWND hwndFrame=hwndDialog;
+  switch(ulAction)
+    {
+    case PLAY_FIRST:
+      playAudioFile(hwndFrame);
+      break;
+    case STOP_TRACK:
+      stopAudioFile(hwndFrame);
+      break;
+    case PAUSE_TRACK:
+      pauseAudioFile(hwndFrame);
+      break;
+    default:
+      break;
+    }
+  //  WinPostMsg(hwndPlayObject, WM_APPTERMINATENOTIFY, MPFROMP(hwndDialog), MPFROMLONG(ulAction));
+}
+
+MRESULT EXPENTRY playObjectProc(HWND hwnd, ULONG msg, MPARAM mp1, MPARAM mp2)
+{
+  switch (msg)
+    {
+    case WM_APPTERMINATENOTIFY:
+      {
+        HWND hwndFrame=HWNDFROMMP(mp1);
+
+        switch(LONGFROMMP(mp2))
+          {
+          case PLAY_FIRST:
+            playAudioFile(hwndFrame);
+            break;
+          case STOP_TRACK:
+            stopAudioFile(hwndFrame);
+            break;
+          case PAUSE_TRACK:
+            pauseAudioFile(hwndFrame);
+            break;
+          default:
+            break;
+          }
+        return (MRESULT)0;
+      }
+    case WM_CLOSE:
+
+      break;
+    default:
+      break;
+    }
+  return WinDefWindowProc( hwnd, msg, mp1, mp2);
+}
+
+/* Every folder has one running play thread to handle play commands */
+void _Optlink playThreadFunc (void *arg)
+{
+  HAB  hab;
+  HMQ  hmq;
+  QMSG qmsg;
+
+  hab=WinInitialize(0);
+  if(hab) {
+    hmq=WinCreateMsgQueue(hab,0);
+    if(hmq) {
+
+      hwndPlayObject=WinCreateWindow(HWND_OBJECT,WC_STATIC,"MFObj",0,0,0,100,100,NULLHANDLE,HWND_BOTTOM,13343,NULL,NULL);
+      if(hwndPlayObject) {
+        WinSubclassWindow(hwndPlayObject,&playObjectProc);
+        /* Window created. */
+        while(WinGetMsg(hab,&qmsg,(HWND)NULL,0,0))
+          WinDispatchMsg(hab,&qmsg);
+
+        WinDestroyWindow(hwndPlayObject);
+      }
+      WinDestroyMsgQueue(hmq);
+    }
+    WinTerminate(hab);
+  }
+}
Index: /tags/CWMM-0.3.0_GA/classes/mm-progs/videoplayer/vioplayer.c
===================================================================
--- /tags/CWMM-0.3.0_GA/classes/mm-progs/videoplayer/vioplayer.c	(revision 213)
+++ /tags/CWMM-0.3.0_GA/classes/mm-progs/videoplayer/vioplayer.c	(revision 213)
@@ -0,0 +1,265 @@
+#define INCL_DOS
+#define INCL_DOSFILEMGR
+#define INCL_DOSERRORS
+#define INCL_WIN
+#define INCL_WINWORKPLACE
+#define INCL_OS2MM
+#define INCL_MMIOOS2
+#define INCL_MCIOS2
+#define INCL_GPI
+#define INCL_PM
+
+#ifdef __EMX__
+//#define USE_OS2_TOOLKIT_HEADERS
+#endif
+#include <os2.h>
+#include <sys\types.h>
+#include <sys\stat.h>
+#include <stdio.h>
+#include <string.h>
+#include <stdlib.h>
+#include <os2me.h>
+#include "common.h"
+#include "mmplayerres.h"
+#include "mmres.h"
+#include "mmplayer.h"
+#include "mmprogs_defaults.h"
+#include "sys_funcs.h"
+
+
+/* Track to play. Full path */
+char chrSourceName[CCHMAXPATH]={0};
+
+BOOL bPaused=FALSE;
+ULONG ulPid;
+BOOL bIsPlaying=FALSE;
+ULONG ulPos=0;
+ULONG ulTotalLength;
+
+BOOL pauseAudioFile(HWND hwndFrame)
+{
+  int iWavePriv;
+  char chrCommand[50];
+  char retMsg[100];
+  ULONG rc;
+
+  iWavePriv=ulPid;
+
+  if(bPaused) {
+    sprintf(chrCommand,"RESUME wave%d wait", iWavePriv);
+    rc = mciSendString(chrCommand, retMsg, sizeof(retMsg), 0, 0);
+    bPaused=FALSE;
+    //    showPlayTimeDisplay( hwndFrame, TRUE);
+  }
+  else {
+    sprintf(chrCommand,"PAUSE wave%d wait", iWavePriv);
+    rc = mciSendString(chrCommand, retMsg, sizeof(retMsg), 0, 0);
+    bPaused=TRUE;
+  }
+  return TRUE;
+}
+
+BOOL stopAudioFile(HWND hwndFrame)
+{
+  int iWavePriv;
+  char chrCommand[50];
+  char retMsg[100];
+  ULONG rc;
+
+  iWavePriv=ulPid;
+  
+  if(bIsPlaying) {
+    sprintf(chrCommand,"stop wave%d wait", iWavePriv);
+    rc = mciSendString(chrCommand, retMsg, sizeof(retMsg), 0, 0);
+    
+    sprintf(chrCommand,"close wave%d wait", iWavePriv);
+    rc = mciSendString(chrCommand, retMsg, sizeof(retMsg), 0, 0);
+    
+    //    _resetDisplay(hwndFrame);
+    // showPlayTimeDisplay( hwndFrame, TRUE);
+    WinStopTimer(WinQueryAnchorBlock(hwndFrame), hwndFrame, IDTIMER_PLAY);
+    bIsPlaying=FALSE;
+    bPaused=FALSE;  
+  }
+  return TRUE;
+}
+
+ULONG playAudioFile(HWND hwndFrame)
+{
+  char chrCommand[CCHMAXPATH*2];
+  char chrDevice[30];
+  char retMsg[20];
+  ULONG rc;
+  int iWavePriv;
+  int iTime2=0;
+  HWND hwndNotify;
+
+
+  if(bPaused)
+    {
+      pauseAudioFile(hwndFrame);
+      return 1;
+    }
+
+  iWavePriv=++ulPid;
+  ulPos=0;
+
+  stopAudioFile(hwndFrame);
+
+
+#if 0
+  if(!getMessage(chrCommand, IDSTR_STARTINGTRACK, sizeof(chrCommand), queryResModuleHandle(),  hwndFrame))
+#endif
+    sprintf(chrCommand, "Starting track...");
+  //  setPlayTimeText2(hwndFrame, chrCommand);
+
+#if 0
+  if(bIsMidi)
+    strncpy(chrDevice,"SEQUENCER", sizeof(chrDevice));
+  else
+    strncpy(chrDevice,"WAVEAUDIO", sizeof(chrDevice));
+#endif
+  strncpy(chrDevice,"DIGITALVIDEO02", sizeof(chrDevice));
+  //  strncpy(chrDevice,"xine", sizeof(chrDevice));
+
+  hwndNotify=hwndFrame;//WinWindowFromID(hwndTop, IDDLG_TOPMIDDLE);
+
+
+
+    /* Start audio file */
+  //    sprintf(chrCommand,"open \"%s\"  type %s PARENT %lx alias wave%d SHAREABLE wait",
+  //        chrSourceName, chrDevice, hwndVideo, iWavePriv);
+    SysWriteToTrapLog("Here %s\n %s\n", chrSourceName, chrCommand);
+    
+    sprintf(chrCommand,"open digitalvideo01 alias wave%d  wait", iWavePriv);
+    //  sprintf(chrCommand,"open \"%s\"  alias wave%d SHAREABLE wait", chrSourceName, iWavePriv);
+    rc = mciSendString(chrCommand, retMsg, sizeof(retMsg), hwndNotify, 0);
+
+  if((rc & 0x0000ffff)!=MCIERR_SUCCESS) {
+    SysWriteToTrapLog("Open error %d!\n", (rc & 0x0000ffff));
+    DosBeep(5000, 400);
+    return 0;
+  }  
+
+  
+#if 0
+  sprintf(chrCommand,"open %s alias wave%d SHAREABLE wait",
+          chrDevice, iWavePriv);
+  sprintf(chrCommand,"open %s alias wave%d SHAREABLE wait",
+          "digitalvideo", iWavePriv);
+  if((rc & 0x0000ffff)!=MCIERR_SUCCESS) {
+    SysWriteToTrapLog("Open error %d!\n", (rc & 0x0000ffff));
+    DosBeep(5000, 400);
+    return 0;
+  }
+
+  sprintf(chrCommand,"window %s HANDLE %ld wait",
+          chrDevice, hwndVideo);
+  if((rc & 0x0000ffff)!=MCIERR_SUCCESS) {
+    SysWriteToTrapLog("window error %d!\n", (rc & 0x0000ffff));
+    DosBeep(3000, 400);
+    return 0;
+  }
+  sprintf(chrCommand,"LOAD %s %s  wait",
+          chrDevice, chrSourceName);
+  if((rc & 0x0000ffff)!=MCIERR_SUCCESS) {
+    SysWriteToTrapLog("window error %d!\n", (rc & 0x0000ffff));
+    DosBeep(3000, 400);
+    return 0;
+  }
+#endif
+
+  /* Set time format */
+  sprintf(chrCommand,"SET wave%d TIME FORMAT MILLISECONDS wait", iWavePriv);
+  rc = mciSendString(chrCommand, retMsg, sizeof(retMsg), 0, 0);
+  if((rc & 0x0000ffff)!=MCIERR_SUCCESS) {
+    sprintf(chrCommand,"close wave%d wait",iWavePriv);
+    rc = mciSendString(chrCommand, retMsg, sizeof(retMsg), 0, 0);
+    return 0;
+  }      
+
+#if 0
+  sprintf(chrCommand,"SETPOSITIONADVISE wave%d ON EVERY 1000 notify", iWavePriv);
+  rc = mciSendString(chrCommand, retMsg, sizeof(retMsg),hwndNotify, 0);
+  if((rc & 0x0000ffff)!=MCIERR_SUCCESS) {
+    sprintf(chrCommand,"close wave%d wait",iWavePriv);
+    rc = mciSendString(chrCommand, retMsg, sizeof(retMsg), 0, 0);
+    return 0;
+  }
+#endif
+
+  /* Get wave length in ms */
+  sprintf(chrCommand,"STATUS wave%d LENGTH WAIT", iWavePriv);
+  rc = mciSendString(chrCommand, retMsg, sizeof(retMsg), 0, 0);
+  if((rc & 0x0000ffff)==MCIERR_SUCCESS) {
+    iTime2=atoi(retMsg);
+    sprintf(chrCommand,"%d:%02d  %d:%02d  -%d:%02d",iTime2/1000/60,(iTime2/1000)%60,
+            0, 0,
+            iTime2/1000/60,(iTime2/1000)%60);
+  }
+  ulTotalLength=iTime2;
+
+#if 0
+  /* Set volume */
+  sprintf(chrCommand,"SET wave%d AUDIO VOLUME %ld wait", iWavePriv, 70);
+  rc = mciSendString(chrCommand, retMsg, sizeof(retMsg), 0, 0);
+  if((rc & 0x0000ffff)!=MCIERR_SUCCESS) {
+    sprintf(chrCommand,"close wave%d",iWavePriv);
+    rc = mciSendString(chrCommand, retMsg, sizeof(retMsg), 0, 0);
+    return 0;
+  }
+#endif
+
+  sprintf(chrCommand,"play wave%d FROM 0", iWavePriv);
+  rc = mciSendString(chrCommand, retMsg, sizeof(retMsg), 0, 0);
+  if((rc & 0x0000ffff)!=MCIERR_SUCCESS) {
+    sprintf(chrCommand,"close wave%d",iWavePriv);
+    rc = mciSendString(chrCommand, retMsg, sizeof(retMsg), 0, 0);
+    return 0;
+  }
+  WinStartTimer(WinQueryAnchorBlock(hwndFrame), hwndFrame, IDTIMER_PLAY, PLAYTIMER_DELAY);
+
+  bIsPlaying=TRUE;
+  return 1;
+}
+
+int main(int argc, char *argv[])
+{
+  PTIB ptib;
+  PPIB ppib;
+
+  /* Save source name */
+  if(argc==2)
+    strncpy(chrSourceName, argv[1], CCHMAXPATH);
+  printf("File: %s\n", chrSourceName);
+
+  if(DosGetInfoBlocks(&ptib, &ppib)==NO_ERROR)
+    {
+      HAB  hab;
+      HMQ  hmq;
+
+
+      printf("Got info block...\n");
+      ulPid=ppib->pib_ulpid;
+      ppib->pib_ultype=3; /* Morph into PM */
+      if((hab=WinInitialize(0))==NULLHANDLE)
+        {
+          printf("Can't get hab.\n");
+          return -1;
+        }
+      hmq=WinCreateMsgQueue(hab,0);
+      if(!hmq) {  
+        printf("Can't get hmq.\n");
+      }
+      /*  WinCreateWindow(HWND_DESKTOP, WC_BUTTON, "Test", WS_VISIBLE, 0, 0, 100, 100, 
+                      HWND_DESKTOP, HWND_TOP, 1234, NULLHANDLE, NULLHANDLE);*/
+
+      playAudioFile(HWND_DESKTOP);
+  printf("!!!!!!!!!!!!!!! Here! %s\n", "!!!!!!!!!!!!");  
+DosSleep(5000);
+      WinDestroyMsgQueue(hmq);
+      WinTerminate(hab);
+    }
+  return 0;
+
+}
Index: /tags/CWMM-0.3.0_GA/classes/mm-progs/volume/classvol.c
===================================================================
--- /tags/CWMM-0.3.0_GA/classes/mm-progs/volume/classvol.c	(revision 213)
+++ /tags/CWMM-0.3.0_GA/classes/mm-progs/volume/classvol.c	(revision 213)
@@ -0,0 +1,631 @@
+/*
+ * classvol.c (C) Chris Wohlgemuth 2002-2003
+ *
+ * Vokume applet for audio classes.
+ */
+/*
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; see the file COPYING.  If not, write to
+ * the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+/*
+ * If you need another license for your project/product (commercial,
+ * noncommercial, whatever) contact me at
+ *
+ * http://www.os2world.com/cdwriting
+ * http://www.geocities.com/SiliconValley/Sector/5785/
+ *
+ */
+
+#define INCL_DOS
+#define INCL_DOSFILEMGR
+#define INCL_DOSERRORS
+#define INCL_WIN
+#define INCL_WINWORKPLACE
+#define INCL_OS2MM
+#define INCL_MMIOOS2
+#define INCL_MCIOS2
+#define INCL_GPI
+#define INCL_PM
+
+#include <os2.h>
+#include <sys\types.h>
+#include <sys\stat.h>
+#include <stdio.h>
+#include <string.h>
+#include <stdlib.h>
+#include "os2me.h"
+#include "common.h"
+#include "classvolumeres.h"
+#include "mmres.h"
+#include "classvolume.h"
+#include "mmprogs_defaults.h"
+#include "sys_funcs.h"
+//#include "cwaudioinc.h"
+
+#ifndef OPEN_DEFAULT
+/*  Open views for the wpOpen() method */
+      #define OPEN_UNKNOWN      -1
+      #define OPEN_DEFAULT       0
+      #define OPEN_CONTENTS      1
+      #define OPEN_SETTINGS      2
+      #define OPEN_HELP          3
+      #define OPEN_RUNNING       4
+      #define OPEN_PROMPTDLG     5
+      #define OPEN_PALETTE       121                                   /*SPLIT*/
+      #define OPEN_USER          0x6500
+#endif
+
+LOADEDBITMAP allBMPs[NUM_CTRL_IDX];
+
+/* Format:
+   typedef struct
+   {
+   INT id;
+   RECTL rclSource;
+   HBITMAP hbmSource;
+   RECTL rclDest;
+   }CONTROLINFO;
+   */
+CONTROLINFO ciControls[NUM_CTRL_IDX]={
+  {0,{0,0,161,17}, NULLHANDLE,{0}}, /* main */
+  /* Achtung destination verwendet fuer position */
+  {IDSL_MMPLAYERVOLUME,{15, 2,141,17},NULLHANDLE, {20, 6, 146, 21} }, //{0, 0, 126, 9} /* {10,18,93,13} */ },
+  {IDSL_MMPLAYERVOLUMEARM,{0,0,9,9},NULLHANDLE, {0,0,9,9}},
+  {IDSL_MMPLAYERVOLUMEARM,{0,0,9,9},NULLHANDLE, {0,0,9,9}},
+};
+
+
+#define NUMPARAMS  2
+
+/* argv[0]: progname
+ * argv[1]: HWND object
+ */
+
+//#define DEBUG
+#ifdef DEBUG
+void HlpWriteToTrapLog(const char* chrFormat, ...);
+#endif
+
+int IniRestoreInt(char * iniFile, char* chrApp, char *chrKey, int defaultInt);
+BOOL IniSaveInt(char * iniFile, char* chrApp, char *chrKey, int theInt);
+BOOL HlpBuildMMProgIniFileName(char* chrProgname, char * chrBuffer, ULONG ulBufferSize);
+void freeResHandle(void);
+HMODULE queryResModuleHandle(char *chrExePath);
+BOOL getMessage(char* text,ULONG ulID, LONG lSizeText, HMODULE hResource,HWND hwnd);
+MRESULT menuInsertMenuSeparator(HWND hwndMenu, HWND hwndSubMenu, SHORT sPosition );
+SHORT menuInsertMenuItem( HWND hwndMenu, HWND hwndSubMenu, SHORT sPosition, int iID, char * chrText);
+
+void pmUsage(void);
+ULONG messageBox( char* text, ULONG ulTextID , LONG lSizeText,
+                  char* title, ULONG ulTitleID, LONG lSizeTitle,
+                  HMODULE hResource, HWND hwnd, ULONG ulFlags);
+
+MRESULT drawSlider(HWND hwnd, ULONG msg, MPARAM mp1, MPARAM mp2, USHORT id);
+MRESULT EXPENTRY privateSliderProc(HWND hwnd, ULONG msg, MPARAM mp1, MPARAM mp2);
+BOOL paintHilitedControl(HWND hwnd, USHORT usControl, BOOL bHilite);
+MRESULT paintControls(HWND hwnd, ULONG msg, MPARAM mp1, MPARAM mp2);
+MRESULT EXPENTRY bgProc(HWND hwnd, ULONG msg, MPARAM mp1, MPARAM mp2);
+MRESULT EXPENTRY buttonProc(HWND hwnd, ULONG msg, MPARAM mp1, MPARAM mp2);
+
+BOOL writeVolumeToIni(char * iniFile, ULONG ulVoume);
+int readVolumeFromIni(char * iniFile, int iDefault);
+void sendCommandToObject(char* chrObject, char* command);
+
+char logName[]="classvol.log";
+
+extern SWP swpWindow;
+BOOL bHaveWindowPos=FALSE;
+
+/* Track to play. Full path */
+char chrSourceName[CCHMAXPATH]={0};
+char * chrPtrName=NULLHANDLE; /* Pointer to filename */
+char chrClassName[100]= {0};
+
+char chrIniFile[CCHMAXPATH];
+
+int numArgs;
+char* params[NUMPARAMS];
+static void _loadBmps(void);
+
+ULONG ulVolume=75;
+
+HWND hwndObject;
+
+HMODULE RESSOURCEHANDLE=0;
+
+HMODULE BMP_RESSOURCEHANDLE=0;
+
+PFNWP  oldPlayTimeProc;
+PFNWP orgBgProc=NULLHANDLE; /* Org proc of background */
+PFNWP orgButtonProc=NULLHANDLE;
+
+HPOINTER hptrArrowWE=NULLHANDLE;
+
+static void _loadBmps()
+{
+  HPS hps;
+  HMODULE hResource;
+
+  if(allBMPs[MAIN_BMP_IDX].hbm)
+    return;
+
+  hResource=BMP_RESSOURCEHANDLE; //_queryResModuleHandle();
+  hps=WinGetPS(HWND_DESKTOP);
+
+  /* The main BMP */
+  allBMPs[MAIN_BMP_IDX].hbm=GpiLoadBitmap(hps, hResource, IDBMP_MAIN, 0, 0);
+  GpiQueryBitmapParameters(allBMPs[MAIN_BMP_IDX].hbm, &allBMPs[MAIN_BMP_IDX].bmpInfoHdr);
+
+#if 0
+  /* Stop */
+  allBMPs[CTRLIDX_STOPBUTTON].hbm=GpiLoadBitmap(hps, hResource, IDBMP_STOP, 0, 0);
+  GpiQueryBitmapParameters(allBMPs[CTRLIDX_STOPBUTTON].hbm, &allBMPs[CTRLIDX_STOPBUTTON].bmpInfoHdr);
+  ciControls[CTRLIDX_STOPBUTTON].hbmSource=allBMPs[CTRLIDX_STOPBUTTON].hbm;
+
+  /* Stop sel */
+  allBMPs[CTRLIDX_STOPBUTTONSEL].hbm=GpiLoadBitmap(hps, hResource, IDBMP_STOPSEL, 0, 0);
+  GpiQueryBitmapParameters(allBMPs[CTRLIDX_STOPBUTTONSEL].hbm, &allBMPs[CTRLIDX_STOPBUTTONSEL].bmpInfoHdr);
+  ciControls[CTRLIDX_STOPBUTTONSEL].hbmSource=allBMPs[CTRLIDX_STOPBUTTONSEL].hbm;
+
+  /* Pause */
+  allBMPs[CTRLIDX_PAUSEBUTTON].hbm=GpiLoadBitmap(hps, hResource, IDBMP_PAUSE, 0, 0);
+  GpiQueryBitmapParameters(allBMPs[CTRLIDX_PAUSEBUTTON].hbm, &allBMPs[CTRLIDX_PAUSEBUTTON].bmpInfoHdr);
+  ciControls[CTRLIDX_PAUSEBUTTON].hbmSource=allBMPs[CTRLIDX_PAUSEBUTTON].hbm;
+
+  /* Pause sel */
+  allBMPs[CTRLIDX_PAUSEBUTTONSEL].hbm=GpiLoadBitmap(hps, hResource, IDBMP_PAUSESEL, 0, 0);
+  GpiQueryBitmapParameters(allBMPs[CTRLIDX_PAUSEBUTTONSEL].hbm, &allBMPs[CTRLIDX_PAUSEBUTTONSEL].bmpInfoHdr);
+  ciControls[CTRLIDX_PAUSEBUTTONSEL].hbmSource=allBMPs[CTRLIDX_PAUSEBUTTONSEL].hbm;
+
+  /* Play */
+  allBMPs[CTRLIDX_PLAYBUTTON].hbm=GpiLoadBitmap(hps, hResource, IDBMP_PLAY, 0, 0);
+  GpiQueryBitmapParameters(allBMPs[CTRLIDX_PLAYBUTTON].hbm, &allBMPs[CTRLIDX_PLAYBUTTON].bmpInfoHdr);
+  ciControls[CTRLIDX_PLAYBUTTON].hbmSource=allBMPs[CTRLIDX_PLAYBUTTON].hbm;
+
+  /* Play sel */
+  allBMPs[CTRLIDX_PLAYBUTTONSEL].hbm=GpiLoadBitmap(hps, hResource, IDBMP_PLAYSEL, 0, 0);
+  GpiQueryBitmapParameters(allBMPs[CTRLIDX_PLAYBUTTONSEL].hbm, &allBMPs[CTRLIDX_PLAYBUTTONSEL].bmpInfoHdr);
+  ciControls[CTRLIDX_PLAYBUTTONSEL].hbmSource=allBMPs[CTRLIDX_PLAYBUTTONSEL].hbm;
+
+  /* Positionslider bg */
+  ciControls[CTRLIDX_POSSLIDER].hbmSource=allBMPs[MAIN_BMP_IDX].hbm;
+
+  /* Positionslider arm */
+  allBMPs[CTRLIDX_POSSLIDERARM].hbm=GpiLoadBitmap(hps, hResource, IDBMP_POSSLIDERARM, 0, 0);
+  GpiQueryBitmapParameters(allBMPs[CTRLIDX_POSSLIDERARM].hbm, &allBMPs[CTRLIDX_POSSLIDERARM].bmpInfoHdr);
+  ciControls[CTRLIDX_POSSLIDERARM].hbmSource=allBMPs[CTRLIDX_POSSLIDERARM].hbm;
+
+  /* Playtime text field */
+  ciControls[CTRLIDX_PLAYTIME].hbmSource=allBMPs[MAIN_BMP_IDX].hbm;
+#endif
+
+  /* Volume slider background */
+  ciControls[CTRLIDX_VOLSLIDER].hbmSource=allBMPs[MAIN_BMP_IDX].hbm;
+
+  /* Volume slider arm */
+  allBMPs[CTRLIDX_VOLSLIDERARM].hbm=GpiLoadBitmap(hps, hResource, IDBMP_VOLSLIDERARM, 0, 0);
+  GpiQueryBitmapParameters(allBMPs[CTRLIDX_VOLSLIDERARM].hbm, &allBMPs[CTRLIDX_VOLSLIDERARM].bmpInfoHdr);
+  ciControls[CTRLIDX_VOLSLIDERARM].hbmSource=allBMPs[CTRLIDX_VOLSLIDERARM].hbm;
+
+  /* Volume slider arm selected*/
+  allBMPs[CTRLIDX_VOLSLIDERARMSEL].hbm=GpiLoadBitmap(hps, hResource, IDBMP_VOLSLIDERARMSEL, 0, 0);
+  GpiQueryBitmapParameters(allBMPs[CTRLIDX_VOLSLIDERARMSEL].hbm, &allBMPs[CTRLIDX_VOLSLIDERARMSEL].bmpInfoHdr);
+  ciControls[CTRLIDX_VOLSLIDERARMSEL].hbmSource=allBMPs[CTRLIDX_VOLSLIDERARMSEL].hbm;
+
+  WinReleasePS(hps);
+}
+
+
+/***********************************************************/
+/*                                                         */
+/* Move the controls to the position defined by the        */
+/* background bitmap.                                      */
+/*                                                         */
+/***********************************************************/
+void adjustDialogControlPos(HWND hwnd)
+{
+  CONTROLINFO ci;
+
+#if 0
+  ULONG ulStyle;
+  /* STOP button */
+  ci=ciControls[CTRLIDX_STOPBUTTON];
+  ulStyle=WinQueryWindowULong(WinWindowFromID(hwnd, ci.id),QWL_STYLE);
+  WinSetWindowULong(WinWindowFromID(hwnd, ci.id),QWL_STYLE,ulStyle|BS_USERBUTTON);
+  WinSetWindowPos(WinWindowFromID(hwnd, ci.id), HWND_TOP, ci.rclDest.xLeft , ci.rclDest.yBottom,
+                  ci.rclDest.xRight-ci.rclDest.xLeft,
+                  ci.rclDest.yTop-ci.rclDest.yBottom, SWP_MOVE|SWP_SIZE);
+  /* Pause button */
+  ci=ciControls[CTRLIDX_PAUSEBUTTON];
+  ulStyle=WinQueryWindowULong(WinWindowFromID(hwnd, ci.id),QWL_STYLE);
+  WinSetWindowULong(WinWindowFromID(hwnd, ci.id),QWL_STYLE,ulStyle|BS_USERBUTTON);
+  WinSetWindowPos(WinWindowFromID(hwnd, ci.id),HWND_TOP, ci.rclDest.xLeft , ci.rclDest.yBottom,
+                  ci.rclDest.xRight-ci.rclDest.xLeft,
+                  ci.rclDest.yTop-ci.rclDest.yBottom, SWP_MOVE|SWP_SIZE);
+  /* Play button */
+  ci=ciControls[CTRLIDX_PLAYBUTTON];
+  ulStyle=WinQueryWindowULong(WinWindowFromID(hwnd, ci.id),QWL_STYLE);
+  WinSetWindowULong(WinWindowFromID(hwnd, ci.id),QWL_STYLE,ulStyle|BS_USERBUTTON);
+  WinSetWindowPos(WinWindowFromID(hwnd, ci.id),HWND_TOP, ci.rclDest.xLeft , ci.rclDest.yBottom,
+                  ci.rclDest.xRight-ci.rclDest.xLeft,
+                  ci.rclDest.yTop-ci.rclDest.yBottom, SWP_MOVE|SWP_SIZE);
+
+  /* Playtime text */
+  ci=ciControls[CTRLIDX_PLAYTIME];
+  WinSetWindowPos(WinWindowFromID(hwnd, ci.id),HWND_TOP, ci.rclSource.xLeft,ci.rclSource.yBottom,
+                  ci.rclSource.xRight-ci.rclSource.xLeft,
+                  ci.rclSource.yTop-ci.rclSource.yBottom, SWP_MOVE|SWP_SIZE);
+  oldPlayTimeProc=WinSubclassWindow(WinWindowFromID(hwnd, IDST_MMPLAYERPLAYTIME), playTimeTextProc);
+
+  /* Pos slider */
+  ci=ciControls[CTRLIDX_POSSLIDER];//ciPosSlider;
+  WinCreateWindow(hwnd, SLIDER_CLASS, "", WS_VISIBLE | WS_TABSTOP, 0,0, 10, 10,
+                  hwnd, HWND_TOP, ci.id, NULLHANDLE, NULLHANDLE);
+  WinSetWindowPos(WinWindowFromID(hwnd, ci.id),HWND_TOP, ci.rclDest.xLeft, ci.rclDest.yBottom,
+                  ci.rclSource.xRight-ci.rclSource.xLeft,
+                  ci.rclSource.yTop-ci.rclSource.yBottom, SWP_MOVE | SWP_SIZE);
+
+  WinSendMsg(WinWindowFromID(hwnd, ci.id),SLM_SETSLIDERINFO,
+             MPFROM2SHORT(SMA_SLIDERARMDIMENSIONS,0),
+             MPFROM2SHORT( 9, 9));
+#endif
+
+  /* Vol slider */
+  ci=ciControls[CTRLIDX_VOLSLIDER];//ciVolSlider;
+  WinCreateWindow(hwnd, SLIDER_CLASS, "", WS_VISIBLE | WS_TABSTOP, 0,0, 10, 10,
+                  hwnd, HWND_TOP, ci.id, NULLHANDLE, NULLHANDLE);
+  WinSetWindowPos(WinWindowFromID(hwnd, ci.id),HWND_TOP, ci.rclDest.xLeft, ci.rclDest.yBottom,
+                  ci.rclSource.xRight-ci.rclSource.xLeft,
+                  ci.rclSource.yTop-ci.rclSource.yBottom, SWP_MOVE | SWP_SIZE);
+  WinSendMsg(WinWindowFromID(hwnd, ci.id),SLM_SETSLIDERINFO,
+             MPFROM2SHORT(SMA_SLIDERARMDIMENSIONS,0),
+             MPFROM2SHORT( 9, 9));
+
+}
+
+
+/****************************************************************
+ *  FixSysMenu procedure
+ *--------------------------------------------------------------
+ *
+ *  Name:    FixSysMenu(HWND hwndDlg)
+ *
+ *  Purpose: This routine removes the Restore, Size, Minimize, and
+ *           Maximize options from the system menu of a dialog.
+ *
+ *  Usage
+ *
+ *  Method:  Called during the WM_INITDLG of a dialog procedure.
+ *
+ *  Returns: VOID
+ *
+ ****************************************************************/
+VOID FixSysMenu(HWND hwndDlg)
+{
+  HWND hwndMenu;                      /* Handle to system menu */
+  MENUITEM mi={0};
+
+  hwndMenu = WinWindowFromID(hwndDlg, FID_SYSMENU);
+
+
+  WinSendMsg(hwndMenu,  /* Delete Restore from the system menu */
+             MM_DELETEITEM,
+             MPFROM2SHORT(SC_RESTORE, TRUE),
+             MPFROMP(NULL));
+
+  WinSendMsg(hwndMenu,  /* Delete Size from the system menu    */
+             MM_DELETEITEM,
+             MPFROM2SHORT(SC_SIZE, TRUE),
+             MPFROMP(NULL));
+
+  WinSendMsg(hwndMenu, /* Delete Minimize from the system menu */
+             MM_DELETEITEM,
+             MPFROM2SHORT(SC_MINIMIZE, TRUE),
+             MPFROMP(NULL));
+
+  WinSendMsg(hwndMenu, /* Delete Maximize from the system menu */
+             MM_DELETEITEM,
+             MPFROM2SHORT(SC_MAXIMIZE, TRUE),
+             MPFROMP(NULL));
+
+  WinSendMsg(hwndMenu, /* Delete Maximize from the system menu */
+             MM_DELETEITEM,
+             MPFROM2SHORT(SC_HIDE, TRUE),
+             MPFROMP(NULL));
+
+  if(WinSendMsg(hwndMenu, /* Get sys menu menuitem  */
+             MM_QUERYITEM,
+             MPFROM2SHORT(SC_SYSMENU, FALSE),
+             MPFROMP(&mi)))
+    {
+      char chrText[100];
+      menuInsertMenuSeparator( mi.hwndSubMenu, NULLHANDLE, MIT_END);
+      if(!getMessage(chrText,  IDSTR_MASTERVOLUMEITEM, sizeof(chrText), RESSOURCEHANDLE, hwndMenu))
+         strcpy(chrText, "Master ~Volume");
+      menuInsertMenuItem( mi.hwndSubMenu, NULLHANDLE, MIT_END, ID_MENUITEMMASTERVOLUME, chrText);
+    }
+  return;
+}
+
+
+/* This Proc handles the main dialog */
+MRESULT EXPENTRY decodeStatusDialogProc(HWND hwnd, ULONG msg, MPARAM mp1, MPARAM mp2)
+{
+  //  char text[CCHMAXPATH*4 +10];
+  //  char title[CCHMAXPATH*4];
+  SWCNTRL swctl;
+  PID pid;
+
+  switch (msg)
+    {
+    case WM_INITDLG:
+      {
+
+        /* Add switch entry */
+        memset(&swctl,0,sizeof(swctl));
+        WinQueryWindowProcess(hwnd,&pid,NULL);
+        swctl.hwnd=hwnd;
+        swctl.uchVisibility=SWL_VISIBLE;
+        swctl.idProcess=pid;
+        swctl.bProgType=PROG_DEFAULT;
+        swctl.fbJump=SWL_JUMPABLE;
+        WinAddSwitchEntry(&swctl);
+
+        adjustDialogControlPos(hwnd);
+
+        /* Set volume slider*/
+        WinSendMsg( WinWindowFromID(hwnd, IDSL_MMPLAYERVOLUME),
+                    SLM_SETSLIDERINFO,
+                    MPFROM2SHORT(SMA_SLIDERARMPOSITION,SMA_INCREMENTVALUE),
+                    MPFROMLONG( ulVolume));
+
+        FixSysMenu(hwnd);
+
+        /* Size dialog */
+        if(allBMPs[MAIN_BMP_IDX].hbm) {
+          SWP swp;
+          POINTL ptl;
+
+          WinQueryWindowPos(WinWindowFromID(hwnd, FID_TITLEBAR), &swp);
+          WinSetWindowPos(WinWindowFromID(hwnd, ID_CLASSVOLCLIENT), NULLHANDLE,
+                          WinQuerySysValue(HWND_DESKTOP, SV_CXDLGFRAME),
+                          WinQuerySysValue(HWND_DESKTOP, SV_CYDLGFRAME),
+                          allBMPs[MAIN_BMP_IDX].bmpInfoHdr.cx,
+                          allBMPs[MAIN_BMP_IDX].bmpInfoHdr.cy,
+                          SWP_SIZE|SWP_MOVE);
+          orgBgProc=WinSubclassWindow(WinWindowFromID(hwnd, ID_CLASSVOLCLIENT), bgProc);
+
+          /* Get mouse position */
+          WinQueryPointerPos(HWND_DESKTOP, &ptl);
+          if(ptl.x+allBMPs[MAIN_BMP_IDX].bmpInfoHdr.cx > WinQuerySysValue(HWND_DESKTOP, SV_CXSCREEN))
+            ptl.x=WinQuerySysValue(HWND_DESKTOP, SV_CXSCREEN)-allBMPs[MAIN_BMP_IDX].bmpInfoHdr.cx-20;
+
+          WinSetWindowPos(hwnd, HWND_TOP, ptl.x/*-allBMPs[MAIN_BMP_IDX].bmpInfoHdr.cx/2*/,
+                          ptl.y-allBMPs[MAIN_BMP_IDX].bmpInfoHdr.cy ,
+                          allBMPs[MAIN_BMP_IDX].bmpInfoHdr.cx+WinQuerySysValue(HWND_DESKTOP, SV_CXDLGFRAME)*2,
+                          allBMPs[MAIN_BMP_IDX].bmpInfoHdr.cy+swp.cy+WinQuerySysValue(HWND_DESKTOP, SV_CXDLGFRAME)*2
+                          , SWP_SIZE|SWP_MOVE|SWP_ACTIVATE);
+        }
+        /* Set dialog font to WarpSans for Warp 4 and above */
+        if(SysQueryOSRelease()>=40) {
+          WinSetPresParam(WinWindowFromID(hwnd, IDST_MMPLAYERPLAYTIME),
+                          PP_FONTNAMESIZE,(ULONG)sizeof(DEFAULT_DIALOG_FONT),
+                          DEFAULT_DIALOG_FONT );
+        }
+        return (MRESULT) TRUE;
+      }
+    case WM_CLOSE:
+      writeVolumeToIni(chrIniFile,  ulVolume);
+      break;
+      /* The play control handling for starting, stopping etc. */
+    case WM_COMMAND:
+      {
+        switch(SHORT1FROMMP(mp1))
+          {
+          case ID_MENUITEMMASTERVOLUME:
+            {
+              HOBJECT hObject;
+              /* User selected master volume item from sys menu */
+              if((hObject=WinQueryObject("<MMPM2_MMVOLUME>"))!=NULLHANDLE) {
+                WinOpenObject(hObject,OPEN_DEFAULT,TRUE);
+              }
+              break;
+            }
+          default:
+            break;
+          }/* switch() */
+
+      return (MRESULT)FALSE;
+      }/* case */
+
+      /*****************************************************/
+      /* Draw the sliders.                                 */
+      /*****************************************************/
+    case WM_DRAWITEM:
+      switch(SHORT1FROMMP(mp1))
+        {
+        case IDSL_MMPLAYERVOLUME:
+          return drawSlider(hwnd, msg, mp1, mp2, SHORT1FROMMP(mp1));
+        default:
+          break;
+        }
+      break;
+
+      /*****************************************************/
+      /* Control messages                                  */
+      /*****************************************************/
+    case WM_CONTROL:
+      {
+        SWP swp;
+
+        switch(SHORT2FROMMP(mp1))
+          {
+          case BN_PAINT:
+            /* Paint the custom controls (buttons, sliders ) */
+            WinQueryWindowPos(hwnd,&swp);
+            if(swp.fl & SWP_MINIMIZE)
+              break;
+            return paintControls(hwnd, msg, mp1, mp2);
+              /*****************************************************/
+              /* Handle position and volume changes.               */
+              /*****************************************************/
+            case SLN_SLIDERTRACK:
+              {
+                switch(SHORT1FROMMP(mp1))
+                  {
+                  case IDSL_MMPLAYERVOLUME:
+                    {
+                      ULONG ulValue;
+                      char command[200];
+
+                      ulValue=LONGFROMMP(mp2);
+
+                      ulVolume=ulValue;
+                      sprintf(command,"MMAUDIOVOLUME=%lu", ulVolume);
+                      sendCommandToObject(chrSourceName, command);
+                      break;
+                    }
+                  default:
+                    break;
+                  }/* switch */
+                return (MRESULT) 0;
+                break;
+              }
+            case SLN_CHANGE:
+              {
+                switch(SHORT1FROMMP(mp1))
+                  {
+                  case IDSL_MMPLAYERVOLUME:
+                    {
+                      ULONG ulValue;
+
+                      ulValue=LONGFROMMP(mp2);
+                      ulVolume=ulValue;
+                      //     sprintf(chrCommand,"SET wave%ld AUDIO VOLUME %ld WAIT", ulPid, ulVolume);
+                      //     mciSendString(chrCommand, retMsg, sizeof(retMsg), 0, 0);
+                      break;
+                    }
+                  default:
+                    break;
+                  }/* switch */
+                return (MRESULT)TRUE;
+              }
+          default:
+            break;
+          }/* switch */
+        break;
+      }/* WM_CONTROL */
+    default:
+      break;
+    }/* switch */
+
+  return WinDefDlgProc( hwnd, msg, mp1, mp2);
+}
+
+
+int readVolumeFromIni(char * iniFile, int iDefault)
+{
+  return IniRestoreInt(iniFile, INI_CLASSVOLUME_APP, INI_VOLUME_KEY, iDefault);
+}
+
+BOOL writeVolumeToIni(char * iniFile,  ULONG ulVolume)
+{
+
+  return IniSaveInt(iniFile, INI_CLASSVOLUME_APP, INI_VOLUME_KEY, ulVolume);
+}
+
+void sendCommandToObject(char* chrObject, char* command)
+{
+  static HOBJECT hObject;
+
+  if(!hObject) {
+    hObject=WinQueryObject(chrObject);
+  }
+  if(hObject!=NULLHANDLE)
+    WinSetObjectData(hObject, command);
+}
+
+int main (int argc, char *argv[])
+{
+  HAB  hab;
+  HMQ  hmq;
+  char text[CCHMAXPATH];
+  char title[CCHMAXPATH];
+  short a;
+
+  /* Create a copy of the args */
+  /* argv[0]: progname
+   * argv[1]: HWND object
+   */
+
+  numArgs=argc;
+
+  strcpy(text,"");
+  for(a=0;a<argc;a++)
+    {
+      params[a]=argv[a];
+    }
+
+  hab=WinInitialize(0);
+  if(hab) {
+    hmq=WinCreateMsgQueue(hab,0);
+    if(hmq) {
+      /* Check if user started prog by hand */
+      if(argc!=NUMPARAMS ) {/* Not the right num of params */
+        pmUsage();
+      }
+      else {
+        /* Save source name */
+        strcpy(chrSourceName, params[1]);
+        //      if((chrPtrName=strrchr(chrSourceName, '\\'))!=NULLHANDLE)
+        //    ++chrPtrName;
+        //SysWriteToTrapLog("Name: %s\n", chrSourceName);
+        /* Get our ressource dll */
+        RESSOURCEHANDLE=queryResModuleHandle(argv[0]);
+        /* Get data from INI file */
+        HlpBuildMMProgIniFileName(argv[0], chrIniFile, sizeof(chrIniFile));
+        ulVolume=readVolumeFromIni(chrIniFile, DEFAULT_VOLUME);
+
+        /* Load pointer for slider */
+        hptrArrowWE=WinLoadPointer(HWND_DESKTOP, BMP_RESSOURCEHANDLE /*_queryResModuleHandle()*/, IDPTR_ARROWWE);
+        /* Register the slider window class */
+        WinRegisterClass(WinQueryAnchorBlock(HWND_DESKTOP), SLIDER_CLASS, privateSliderProc,0, SLADDBYTES);
+
+        _loadBmps();
+
+        if( WinDlgBox( HWND_DESKTOP, NULLHANDLE, decodeStatusDialogProc,
+                       RESSOURCEHANDLE, IDDLG_CLASSVOLUME, 0) == DID_ERROR )
+          {
+            /*
+              Text:
+              Title:  "Installation problem"
+              */
+            messageBox( text, IDSTR_CONVERTDIALOGERROR , sizeof(text),
+                        title, IDSTR_INSTALLERRORTITLE , sizeof(title),
+                        RESSOURCEHANDLE, HWND_DESKTOP, MB_OK | MB_ICONEXCLAMATION | MB_MOVEABLE);
+            freeResHandle();
+            WinDestroyMsgQueue( hmq );
+            WinTerminate( hab );
+            DosBeep(100,600);
+            return( 1 );
+          }
+      }
+      freeResHandle();
+      WinDestroyMsgQueue(hmq);
+    }
+    WinTerminate(hab);
+  }
+  return 0;
+}
+
Index: /tags/CWMM-0.3.0_GA/classes/mm-progs/volume/classvolume.h
===================================================================
--- /tags/CWMM-0.3.0_GA/classes/mm-progs/volume/classvolume.h	(revision 213)
+++ /tags/CWMM-0.3.0_GA/classes/mm-progs/volume/classvolume.h	(revision 213)
@@ -0,0 +1,68 @@
+/*
+ * (C) Chris Wohlgemuth 2002-2003
+ *
+ */
+/*
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; see the file COPYING.  If not, write to
+ * the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+/*
+ * If you need another license for your project/product (commercial,
+ * noncommercial, whatever) contact me at
+ * 
+ * http://www.os2world.com/cdwriting
+ * http://www.geocities.com/SiliconValley/Sector/5785/
+ *
+ */
+
+#define  MAIN_BMP_IDX                     0
+#define  CTRLIDX_VOLSLIDER                1
+#define  CTRLIDX_VOLSLIDERARM             2
+#define  CTRLIDX_VOLSLIDERARMSEL          3
+
+#define  NUM_CTRL_IDX              4
+
+/* Slider window class name */
+#define SLIDER_CLASS     "CWSLIDER"
+
+/* New slider window class            */
+/* Data positions in the window words */
+#define SLIDERARMWIDTH   0  /* USHORT */
+#define SLIDERARMHEIGHT  2  /* USHORT */
+#define PTRPOSINSLARM    4  /* USHORT */
+#define SLINCREMENTS     6  /* USHORT */
+#define SLIDERCX         8  /* ULONG */
+#define SLIDERCY         12 /* ULONG */
+#define SLIDERX          16 /* ULONG */
+#define SLIDERY          20 /* ULONG */
+#define SLIDERARMPOS     24 /* LONG  */
+#define SLDRAGGING       28 /* BOOL  */
+#define SLADDBYTES       32 /* num additional window bytes for slider */
+
+typedef struct
+{
+  INT id;
+  RECTL rclSource;
+  HBITMAP hbmSource;
+  RECTL rclDest;
+}CONTROLINFO;
+
+typedef struct
+{
+  BITMAPINFOHEADER bmpInfoHdr;
+  HBITMAP hbm;
+}LOADEDBITMAP;
+
+
+
Index: /tags/CWMM-0.3.0_GA/classes/mm-progs/volume/classvolume.rc
===================================================================
--- /tags/CWMM-0.3.0_GA/classes/mm-progs/volume/classvolume.rc	(revision 213)
+++ /tags/CWMM-0.3.0_GA/classes/mm-progs/volume/classvolume.rc	(revision 213)
@@ -0,0 +1,13 @@
+#ifndef OS2_INCLUDED
+   #include <os2.h>
+#endif
+#include "classvolumeres.h"
+
+BITMAP IDBMP_MAIN        "./res/bmp/volume.bmp"
+
+BITMAP IDBMP_VOLSLIDERARM    "./res/bmp/WVOL.bmp"
+BITMAP IDBMP_VOLSLIDERARMSEL "./res/bmp/BVOL.bmp"
+
+POINTER IDPTR_ARROWWE        "./res/pointer/arrowwe.ptr"
+
+
Index: /tags/CWMM-0.3.0_GA/classes/mm-progs/volume/classvolumeres.h
===================================================================
--- /tags/CWMM-0.3.0_GA/classes/mm-progs/volume/classvolumeres.h	(revision 213)
+++ /tags/CWMM-0.3.0_GA/classes/mm-progs/volume/classvolumeres.h	(revision 213)
@@ -0,0 +1,6 @@
+
+#define IDBMP_MAIN                       1100
+#define IDBMP_VOLSLIDERARM         1101
+#define IDBMP_VOLSLIDERARMSEL    1102
+
+#define IDPTR_ARROWWE              2
Index: /tags/CWMM-0.3.0_GA/classes/mm-progs/volume/customprocs.c
===================================================================
--- /tags/CWMM-0.3.0_GA/classes/mm-progs/volume/customprocs.c	(revision 213)
+++ /tags/CWMM-0.3.0_GA/classes/mm-progs/volume/customprocs.c	(revision 213)
@@ -0,0 +1,668 @@
+/*
+ * This file is (C) Chris Wohlgemuth 2002
+ * It is part of the MediaFolder package
+ */
+/*
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; see the file COPYING.  If not, write to
+ * the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+/*
+ * If you need another license for your project/product (commercial,
+ * noncommercial, whatever) contact me at
+ * 
+ * http://www.os2world.com/cdwriting
+ * http://www.geocities.com/SiliconValley/Sector/5785/
+ *
+ */
+#define INCL_GPILCIDS
+#define INCL_GPIPRIMITIVES
+#define INCL_GPIBITMAPS
+#define INCL_GPILOGCOLORTABLE
+#define INCL_SW
+#define INCL_GPIREGIONS
+#define INCL_WIN
+
+#include <os2.h>
+
+#include "common.h"
+#include "classvolumeres.h"
+#include "mmres.h"
+#include "classvolume.h"
+#include <stdio.h>
+#include <stdlib.h>
+
+
+/* Fonts to use in dialogs */
+#define DEFAULT_DIALOG_FONT   "9.WarpSans"
+
+/* Bitmap data */
+extern LOADEDBITMAP allBMPs[];
+extern CONTROLINFO ciControls[];
+
+/* Window procedures */
+extern PFNWP orgBgProc; /* Org proc of background */
+extern PFNWP orgButtonProc;
+extern HPOINTER hptrArrowWE;
+
+
+/* This custom button proc is only for DnD handling */
+MRESULT EXPENTRY buttonProc(HWND hwnd, ULONG msg, MPARAM mp1, MPARAM mp2)
+{
+  switch(msg)
+    {
+    default:
+      break;
+    }
+  if(orgButtonProc)
+    return (*orgButtonProc)(hwnd, msg, mp1, mp2);
+  else
+    return WinDefWindowProc(hwnd, msg, mp1, mp2);
+}
+
+MRESULT EXPENTRY bgProc(HWND hwnd, ULONG msg, MPARAM mp1, MPARAM mp2)
+{
+  switch(msg)
+    {
+      /*****************************************************/
+      /* Paint the background                              */
+      /*****************************************************/
+    case WM_PAINT:
+      {
+        SWP swp;
+        RECTL rcl;
+        HPS hps;
+
+        WinQueryWindowPos(hwnd,&swp);
+        if(swp.fl & SWP_MINIMIZE)
+          break;
+  
+        hps=WinBeginPaint(hwnd, NULLHANDLE, NULLHANDLE);
+        WinQueryWindowRect(hwnd, &rcl);
+        WinDrawBitmap(hps, allBMPs[MAIN_BMP_IDX].hbm,
+                      NULLHANDLE, 
+                      (PPOINTL)&rcl,
+                      0, 0,
+                      DBM_IMAGEATTRS);    
+        WinEndPaint(hps);
+        return MRFALSE;
+      }
+    default:
+      break;
+    }
+  if(orgBgProc)
+    return (*orgBgProc)(hwnd, msg, mp1, mp2);
+  else
+    return WinDefWindowProc(hwnd, msg, mp1, mp2);
+}
+
+/* This function paints all our controls with the provided bitmaps */
+/* It's called from the guiproc                                    */
+MRESULT paintControls(HWND hwnd, ULONG msg, MPARAM mp1, MPARAM mp2)
+{
+  USERBUTTON* ubPtr;
+  CONTROLINFO ci;
+  RECTL rcl;
+
+  ubPtr=(USERBUTTON*)PVOIDFROMMP(mp2);
+  switch(SHORT1FROMMP(mp1))
+    {
+#if 0
+    case IDPB_POSBAR:
+      ci=ciControls[CTRLIDX_POSSLIDER];//ciPosSlider;
+      break;
+    case IDPB_SLIDERARM:
+      DosBeep(5000, 30);
+      ci=ciControls[CTRLIDX_POSSLIDERARM];//ciPosSliderArm;
+      break;
+    case IDSL_VOLUME:
+      ci=ciControls[CTRLIDX_VOLSLIDER];//ciVolSlider;
+      break;
+    case IDSL_VOLUMEARM:
+      if(WinQueryCapture(HWND_DESKTOP==hwnd))
+        ci=ciControls[CTRLIDX_VOLSLIDERARMSEL];//ciVolSliderArm;
+      else
+        ci=ciControls[CTRLIDX_VOLSLIDERARM];//ciVolSliderArm;
+      break;
+#endif
+    default:
+      return (MRESULT)0;
+    }
+  rcl.yBottom=0;
+  rcl.xLeft=0;
+
+  WinDrawBitmap(ubPtr->hps, ci.hbmSource,
+                &ci.rclSource, 
+                (PPOINTL)&rcl,
+                0, 0,
+                DBM_IMAGEATTRS);
+  if(ubPtr->fsStateOld!=ubPtr->fsState)
+    ubPtr->fsState =( ubPtr->fsStateOld==BDS_DEFAULT ? BDS_HILITED : BDS_DEFAULT);
+
+  return (MRESULT)0;
+}
+
+
+/* This function paints all our controls with the provided bitmaps. */
+BOOL paintHilitedControl(HWND hwnd, USHORT usControl, BOOL bHilite)
+{
+  //  static ULONG ulShowFeedback=0;
+
+#if 0
+  if(!ulShowFeedback) {
+    /* Query the INI setting*/
+    if(!PrfQueryProfileInt(HINI_USERPROFILE, APPKEY_CWMM, MFLDR_NO_VISUAL_FEEDBACK, 0))
+      ulShowFeedback=1; /* Flash play controls */
+    else
+      ulShowFeedback=2; /* Don't flash play controls while playing */
+  }
+
+
+  if(ulShowFeedback==2)
+    return 1;
+  
+  switch(usControl)
+    {
+    case IDPB_PLAY:
+      if(!bHilite) {
+        ci=ciControls[CTRLIDX_PLAYBUTTON];
+    }
+      else {
+        ci=ciControls[CTRLIDX_PLAYBUTTONSEL];
+      }
+      break;
+    case IDPB_PAUSE:
+      if(!bHilite) {
+        ci=ciControls[CTRLIDX_PAUSEBUTTON];
+      }
+      else {
+        ci=ciControls[CTRLIDX_PAUSEBUTTONSEL];
+      }
+      break;
+    default:
+      return 0;
+    }
+  rcl.yBottom=0;
+  rcl.xLeft=0;
+  hps=WinGetPS(hwnd);
+  WinDrawBitmap(hps, ci.hbmSource,
+                &ci.rclSource, 
+                (PPOINTL)&rcl,
+                0, 0,
+                DBM_IMAGEATTRS);
+  WinReleasePS(hps);
+#endif
+  return 1;
+}
+
+
+#define USERSLIDER 1 /* Set to 0 to let the proc paint the control. With set to 1
+                        a WM_DRAWITEM msg is sent to the parent. */
+BOOL userSlider=USERSLIDER;
+#define SLOFFSET 3 /* The offset of the active slider area to the window border */
+MRESULT EXPENTRY privateSliderProc(HWND hwnd, ULONG msg, MPARAM mp1, MPARAM mp2)
+{
+
+  switch (msg)
+    {      
+    case WM_CREATE:
+      {
+        PCREATESTRUCT pCreate=(CREATESTRUCT*)PVOIDFROMMP(mp2);
+
+        /* Initialize the slider data */
+        WinSetWindowUShort(hwnd, SLIDERARMWIDTH,20);
+        WinSetWindowUShort(hwnd, SLIDERARMHEIGHT,10);
+        WinSetWindowUShort(hwnd, SLINCREMENTS,100);
+        /* Dimensions of slider. The slider active area is smaller than the window to
+           allow drawing of active state. */
+        WinSetWindowULong(hwnd, SLIDERCX,pCreate->cx-2*SLOFFSET);
+        WinSetWindowULong(hwnd, SLIDERCY,pCreate->cy-2*SLOFFSET);
+        WinSetWindowULong(hwnd, SLIDERX,SLOFFSET);
+        WinSetWindowULong(hwnd, SLIDERY,SLOFFSET);
+        WinSetWindowULong(hwnd, SLIDERARMPOS, 0);
+        WinSetWindowULong(hwnd, SLDRAGGING,FALSE);
+
+        return (MRESULT)0;
+      }
+    case SLM_SETSLIDERINFO:
+      switch(SHORT1FROMMP(mp1))
+        {
+          case SMA_SLIDERARMPOSITION:
+            /*  SMA_RANGEVALUE */
+            if(!WinQueryWindowULong(hwnd, SLDRAGGING)) {
+              if(SHORT2FROMMP(mp1)==SMA_RANGEVALUE) {
+                WinSetWindowULong(hwnd, SLIDERARMPOS, LONGFROMMP(mp2));
+                WinInvalidateRect(hwnd, NULLHANDLE,TRUE);
+                return (MRESULT)0;
+              }
+              else if(SHORT2FROMMP(mp1)==SMA_INCREMENTVALUE) {
+                LONG lInc=LONGFROMMP(mp2)*(WinQueryWindowULong(hwnd, SLIDERCX)-WinQueryWindowUShort(hwnd, SLIDERARMWIDTH));
+                lInc/=WinQueryWindowUShort(hwnd, SLINCREMENTS);
+                WinSetWindowULong(hwnd, SLIDERARMPOS, lInc);
+                WinInvalidateRect(hwnd, NULLHANDLE,TRUE);
+                return (MRESULT)0;
+              }
+            }
+            break;
+        case SMA_SLIDERARMDIMENSIONS:
+          WinSetWindowUShort(hwnd, SLIDERARMWIDTH, SHORT1FROMMP(mp2));
+          WinSetWindowUShort(hwnd, SLIDERARMHEIGHT, SHORT2FROMMP(mp2));
+          return (MRESULT)0;
+        default:
+          break;
+        }
+      break;
+    case WM_SIZE:
+      WinSetWindowULong(hwnd, SLIDERCX, SHORT1FROMMP(mp2)-2*SLOFFSET);
+      WinSetWindowULong(hwnd, SLIDERCY, SHORT2FROMMP(mp2)-2*SLOFFSET);
+      WinInvalidateRect(hwnd, NULLHANDLE,TRUE);
+      return (MRESULT)0;
+    case WM_BUTTON1DOWN:
+      {
+        SHORT x=SHORT1FROMMP( mp1);
+        SHORT y=SHORT2FROMMP( mp1);
+        LONG  lPos=WinQueryWindowULong(hwnd, SLIDERARMPOS);
+        USHORT usWidth=WinQueryWindowUShort(hwnd, SLIDERARMWIDTH);
+
+        if(x<=lPos+usWidth+SLOFFSET && x>=lPos+SLOFFSET && 
+           y<=WinQueryWindowUShort(hwnd, SLIDERY)+WinQueryWindowUShort(hwnd, SLIDERCY)
+           && y>=WinQueryWindowUShort(hwnd, SLIDERY)) {
+          WinSetWindowUShort(hwnd, PTRPOSINSLARM, x-lPos-SLOFFSET);
+        }
+        WinSetFocus(HWND_DESKTOP, hwnd);
+      break;
+      }
+    case WM_FOCUSCHANGE:
+      {
+        HPS hps;
+        RECTL rcl;
+        POINTL ptl;
+
+        if(SHORT1FROMMP(mp2)) {
+          hps=WinGetPS(hwnd);
+          WinQueryWindowRect(hwnd, &rcl);        
+          GpiSetLineType(hps, LINETYPE_DOT);
+          ptl.x=rcl.xLeft;
+          ptl.y=rcl.yBottom;
+          GpiMove(hps,&ptl);
+          ptl.x=rcl.xRight-1;
+          GpiLine(hps,&ptl);
+          ptl.y=rcl.yTop-1;
+          GpiLine(hps,&ptl);
+          ptl.x=rcl.xLeft;
+          GpiLine(hps,&ptl);
+          ptl.y=rcl.yBottom;
+          GpiLine(hps,&ptl);
+          WinReleasePS(hps);
+        }
+        else
+          WinInvalidateRect(hwnd, NULLHANDLE,TRUE);
+
+        break;
+      }
+    case WM_CHAR:
+      if(WinQueryFocus(HWND_DESKTOP)==hwnd) {
+        if(SHORT2FROMMP(mp2)==VK_TAB && (SHORT1FROMMP(mp1) & KC_VIRTUALKEY))
+          if(SHORT1FROMMP(mp1) & (KC_KEYUP|KC_PREVDOWN)) 
+            return (MRESULT)TRUE;
+        return WinDefWindowProc(hwnd, msg, mp1, mp2);
+      }
+      break;
+    case WM_BUTTON1MOTIONSTART:
+      {
+        SHORT x=SHORT1FROMMP( mp1);
+        SHORT y=SHORT2FROMMP( mp1);
+        LONG  lPos=WinQueryWindowULong(hwnd, SLIDERARMPOS);
+        USHORT usWidth=WinQueryWindowUShort(hwnd, SLIDERARMWIDTH);
+
+        if(x<=lPos+usWidth+SLOFFSET && x>=lPos+SLOFFSET && 
+           y<=WinQueryWindowUShort(hwnd, SLIDERY)+WinQueryWindowUShort(hwnd, SLIDERCY)
+           && y>=WinQueryWindowUShort(hwnd, SLIDERY)){
+          //        if(x<=lPos+usWidth && y<=WinQueryWindowUShort(hwnd, SLIDERY)+WinQueryWindowUShort(hwnd, SLIDERCY)
+          //      && y>=WinQueryWindowUShort(hwnd, SLIDERY)) {
+          WinSetWindowULong(hwnd, SLDRAGGING, TRUE);
+          if(hptrArrowWE)
+            WinSetPointer(HWND_DESKTOP, hptrArrowWE);
+
+          WinSetCapture(HWND_DESKTOP, hwnd);
+        }
+        break;
+      }
+    case WM_BUTTON1MOTIONEND:
+      if(WinQueryWindowULong(hwnd, SLDRAGGING)) {
+        LONG lPos=WinQueryWindowULong(hwnd, SLIDERARMPOS);
+        WinSetWindowULong(hwnd, SLDRAGGING,FALSE);
+        WinSetCapture(HWND_DESKTOP, NULLHANDLE);
+          lPos=(lPos*100)/(WinQueryWindowULong(hwnd, SLIDERCX)-WinQueryWindowUShort(hwnd, SLIDERARMWIDTH));
+        /* Post SLN_CHANGE notification */
+        WinPostMsg(WinQueryWindow(hwnd, QW_PARENT),WM_CONTROL,
+                   MPFROM2SHORT(WinQueryWindowUShort(hwnd, QWS_ID), SLN_CHANGE),
+                   MPFROMLONG(lPos));
+      }
+      break;
+
+    case WM_MOUSEMOVE:
+      if(WinQueryWindowULong(hwnd, SLDRAGGING)) {
+
+        HPS hps;
+        RECTL rcl, rcl2, rcl3;
+        LONG lTemp;
+        SHORT x=SHORT1FROMMP(mp1);
+        LONG  lPos=WinQueryWindowULong(hwnd, SLIDERARMPOS);
+        USHORT usWidth=WinQueryWindowUShort(hwnd, SLIDERARMWIDTH);
+
+       
+        lTemp=lPos;
+     
+        rcl.xLeft=WinQueryWindowULong(hwnd, SLIDERX);
+        rcl.yBottom=WinQueryWindowULong(hwnd, SLIDERY);
+        rcl.xRight=rcl.xLeft+WinQueryWindowULong(hwnd, SLIDERCX);
+        rcl.yTop=rcl.yBottom+WinQueryWindowULong(hwnd, SLIDERCY);
+
+        rcl2=rcl3=rcl;
+        rcl.xLeft=x-WinQueryWindowUShort(hwnd, PTRPOSINSLARM);
+        if(rcl.xLeft<rcl2.xLeft)/* Make sure we stop at the left border */
+          rcl.xLeft=rcl2.xLeft;
+
+        rcl.xRight=rcl.xLeft+usWidth;
+        if(rcl.xRight>rcl2.xRight)
+          {/* Make sure we stop at the right border */
+            rcl.xRight=rcl2.xRight;
+            rcl.xLeft=rcl.xRight-usWidth;
+          }
+        lPos=rcl.xLeft-WinQueryWindowULong(hwnd, SLIDERX);/* Save position zero based */
+        WinSetWindowULong(hwnd, SLIDERARMPOS, lPos);
+        if(lPos!=lTemp) {
+          BOOL rc;
+
+          hps=WinGetPS(hwnd);
+          /* Paint Background not necessary here */
+
+          /* Shaft */
+          /* Left part */
+          rcl3.xRight=rcl.xLeft;
+
+          rc=FALSE;
+
+          if(userSlider) {
+            OWNERITEM oi={0};
+            oi.hwnd=hwnd;
+            oi.hps=hps;
+            oi.fsState=SLS_OWNERDRAW;/* More to come */
+            oi.rclItem=rcl3;
+            oi.idItem=SDA_SLIDERSHAFT;
+            rc=(BOOL)WinSendMsg(WinQueryWindow(hwnd, QW_PARENT), WM_DRAWITEM,
+                                MPFROMSHORT(WinQueryWindowUShort(hwnd, QWS_ID)),
+                                MPFROMP(&oi) );
+          }
+          if(!rc)
+            WinFillRect(hps, &rcl3, CLR_PALEGRAY);
+
+          /* Right part */
+          rcl3.xRight=rcl2.xRight;
+          rcl3.xLeft=rcl.xRight;
+          rc=FALSE;
+          if(userSlider) {
+            OWNERITEM oi={0};
+            oi.hwnd=hwnd;
+            oi.hps=hps;
+            oi.fsState=SLS_OWNERDRAW;/* More to come */
+            oi.rclItem=rcl3;
+            oi.idItem=SDA_SLIDERSHAFT;
+            rc=(BOOL)WinSendMsg(WinQueryWindow(hwnd, QW_PARENT), WM_DRAWITEM,
+                                MPFROMSHORT(WinQueryWindowUShort(hwnd, QWS_ID)),
+                                MPFROMP(&oi) );
+          }
+          if(!rc)
+            WinFillRect(hps, &rcl3, CLR_PALEGRAY);
+
+          /* Paint Slider */
+          rc=FALSE;
+          if(userSlider) {
+            OWNERITEM oi={0};
+            oi.hwnd=hwnd;
+            oi.hps=hps;
+            oi.fsState=SLS_OWNERDRAW;/* More to come */
+            oi.rclItem=rcl;
+            oi.idItem=SDA_SLIDERARM;
+            rc=(BOOL)WinSendMsg(WinQueryWindow(hwnd, QW_PARENT), WM_DRAWITEM,
+                                MPFROMSHORT(WinQueryWindowUShort(hwnd, QWS_ID)),
+                                MPFROMP(&oi) );
+
+          }
+          if(!rc)
+            {
+              WinFillRect(hps,&rcl, CLR_PALEGRAY);
+              WinDrawBorder(hps, &rcl, 2, 2, 0, 0 ,0x0400);
+            }
+
+          WinReleasePS(hps);
+          lPos=(lPos*100)/(WinQueryWindowULong(hwnd, SLIDERCX)-WinQueryWindowUShort(hwnd, SLIDERARMWIDTH));
+           /* Post SLN_SLIDERTRACK notification */
+          WinPostMsg(WinQueryWindow(hwnd, QW_PARENT),WM_CONTROL,
+                     MPFROM2SHORT(WinQueryWindowUShort(hwnd, QWS_ID), SLN_SLIDERTRACK),
+                     MPFROMLONG(lPos));
+        }
+        return MRTRUE;
+      }
+      else {
+        if(hptrArrowWE) {
+          /* Not dragging */
+          /* Change pointer to drag pointer when over the arm */
+          SHORT x=SHORT1FROMMP( mp1);
+          SHORT y=SHORT2FROMMP( mp1);
+          LONG  lPos=WinQueryWindowULong(hwnd, SLIDERARMPOS);
+          USHORT usWidth=WinQueryWindowUShort(hwnd, SLIDERARMWIDTH);
+          if(x<=lPos+usWidth+SLOFFSET && x>=lPos+SLOFFSET && 
+             y<=WinQueryWindowUShort(hwnd, SLIDERY)+WinQueryWindowUShort(hwnd, SLIDERCY)
+             && y>=WinQueryWindowUShort(hwnd, SLIDERY)) {
+            WinSetPointer(HWND_DESKTOP, hptrArrowWE);
+            //            WinSetPointer(HWND_DESKTOP, WinQuerySysPointer(HWND_DESKTOP, SPTR_SIZEWE, FALSE));
+            return MRTRUE;
+          }
+        }
+      }
+      break;
+    case WM_PAINT:
+      {
+
+        HPS hps, hps2;
+        RECTL rcl, rcl2, rcl3;
+        POINTL ptl;
+        LONG  lPos=WinQueryWindowULong(hwnd, SLIDERARMPOS);
+        USHORT usWidth=WinQueryWindowUShort(hwnd, SLIDERARMWIDTH);
+        BOOL rc;
+
+        WinQueryWindowRect(hwnd, &rcl);
+
+        /* Shaft */
+        rcl2.xLeft=WinQueryWindowULong(hwnd, SLIDERX);
+        rcl2.yBottom=WinQueryWindowULong(hwnd, SLIDERY);
+        rcl2.xRight=rcl2.xLeft+WinQueryWindowULong(hwnd, SLIDERCX)-1;
+        rcl2.yTop=rcl2.yBottom+WinQueryWindowULong(hwnd, SLIDERCY)-1;
+
+        /* Background */
+        hps2=WinGetPS(hwnd);
+        GpiExcludeClipRectangle(hps2,&rcl2);
+        rc=FALSE;
+        if(userSlider) {
+          OWNERITEM oi={0};
+          oi.hwnd=hwnd;
+          oi.hps=hps2;
+          oi.fsState=SLS_OWNERDRAW;/* More to come */
+          oi.rclItem=rcl;
+          oi.idItem=SDA_BACKGROUND;
+          rc=(BOOL)WinSendMsg(WinQueryWindow(hwnd, QW_PARENT), WM_DRAWITEM, MPFROMSHORT(WinQueryWindowUShort(hwnd, QWS_ID)),
+                    MPFROMP(&oi) );
+        }
+        if(!rc)
+          WinFillRect(hps2, &rcl, CLR_PALEGRAY);
+        /* Focus */
+        if(WinQueryFocus(HWND_DESKTOP)==hwnd) {
+          GpiSetLineType(hps2, LINETYPE_DOT);
+          ptl.x=rcl.xLeft;
+          ptl.y=rcl.yBottom;
+          GpiMove(hps2,&ptl);
+          ptl.x=rcl.xRight-1;
+          GpiLine(hps2,&ptl);
+          ptl.y=rcl.yTop-1;
+          GpiLine(hps2,&ptl);
+          ptl.x=rcl.xLeft;
+          GpiLine(hps2,&ptl);
+          ptl.y=rcl.yBottom;
+          GpiLine(hps2,&ptl);
+        }
+
+        WinReleasePS(hps2);
+        rcl2.yTop+=1;
+        rcl2.xRight+=1;
+        hps=WinBeginPaint(hwnd, NULLHANDLE, NULLHANDLE);
+        rcl3=rcl=rcl2;
+        /* Arm pos */        
+        rcl2.xLeft+=lPos;
+        /* Arm size */        
+        rcl2.xRight=rcl2.xLeft+usWidth;
+        
+        /* Shaft */
+        /* Left part */
+        rcl3.xRight=rcl2.xLeft;
+        rc=FALSE;
+        if(userSlider) {
+          OWNERITEM oi={0};
+          oi.hwnd=hwnd;
+          oi.hps=hps;
+          oi.fsState=SLS_OWNERDRAW;/* More to come */
+          oi.rclItem=rcl3;
+          oi.idItem=SDA_SLIDERSHAFT;
+          rc=(BOOL)WinSendMsg(WinQueryWindow(hwnd, QW_PARENT), WM_DRAWITEM, MPFROMSHORT(WinQueryWindowUShort(hwnd, QWS_ID)),
+                    MPFROMP(&oi) );
+
+        }
+        if(!rc)
+          WinFillRect(hps, &rcl3, CLR_GREEN);
+
+        /* Right part */
+        rcl3.xRight=rcl.xRight;
+        rcl3.xLeft=rcl2.xRight;
+        rc=FALSE;
+        if(userSlider) {
+          OWNERITEM oi={0};
+          oi.hwnd=hwnd;
+          oi.hps=hps;
+          oi.fsState=SLS_OWNERDRAW;/* More to come */
+          oi.rclItem=rcl3;
+          oi.idItem=SDA_SLIDERSHAFT;
+          rc=(BOOL)WinSendMsg(WinQueryWindow(hwnd, QW_PARENT), WM_DRAWITEM, MPFROMSHORT(WinQueryWindowUShort(hwnd, QWS_ID)),
+                              MPFROMP(&oi) );
+        }
+        if(!rc)
+          WinFillRect(hps, &rcl3, CLR_PALEGRAY);
+
+        rc=FALSE;
+        if(userSlider) {
+          OWNERITEM oi={0};
+          oi.hwnd=hwnd;
+          oi.hps=hps;
+          oi.fsState=SLS_OWNERDRAW;/* More to come */
+          oi.rclItem=rcl2;
+          oi.idItem=SDA_SLIDERARM;
+          rc=(BOOL)WinSendMsg(WinQueryWindow(hwnd, QW_PARENT), WM_DRAWITEM, MPFROMSHORT(WinQueryWindowUShort(hwnd, QWS_ID)),
+                              MPFROMP(&oi) );
+        }
+        if(!rc)
+          {
+            WinFillRect(hps,&rcl2, CLR_PALEGRAY);        
+            WinDrawBorder(hps, &rcl2, 2, 2, 0, 0 ,0x0400);
+          }
+
+        WinEndPaint(hps);
+        return (MRESULT)0;
+      }
+      break;
+    default:
+      break;
+    }
+  return WinDefWindowProc(hwnd, msg, mp1, mp2);
+}
+
+MRESULT drawSlider(HWND hwnd, ULONG msg, MPARAM mp1, MPARAM mp2, USHORT id)
+{
+  POWNERITEM poi;
+  CONTROLINFO ci, ciArm;
+
+  poi=(POWNERITEM)PVOIDFROMMP(mp2);
+
+  switch(id)
+    {
+    case IDSL_MMPLAYERVOLUME:
+      ci=ciControls[CTRLIDX_VOLSLIDER];//ciVolSlider;
+      //      if(WinQueryCapture(HWND_DESKTOP==hwnd))
+      ciArm=ciControls[CTRLIDX_VOLSLIDERARMSEL];//ciVolSliderArm;
+      // else
+      //  ciArm=ciControls[CTRLIDX_VOLSLIDERARM];//ciVolSliderArm;
+      break;
+    default:
+      return (MRESULT)FALSE;
+    }
+  
+  switch(poi->idItem)
+    {
+    case SDA_SLIDERARM:
+      if(ciArm.hbmSource)
+        //DosBeep(5000, 50);
+      WinDrawBitmap(poi->hps, ciArm.hbmSource,
+                    &ciArm.rclSource, 
+                    (PPOINTL)&poi->rclItem,
+                    0, 0,
+                    DBM_IMAGEATTRS);
+      //    WinFillRect(poi->hps,&poi->rclItem, CLR_RED);
+      return (MRESULT) TRUE;
+    case SDA_BACKGROUND:
+      {
+        WinDrawBitmap(poi->hps,
+                      ci.hbmSource,
+                      &ci.rclSource, 
+                      (PPOINTL)&poi->rclItem,
+                      0, 0,
+                      DBM_IMAGEATTRS);
+        //    WinFillRect(poi->hps,&poi->rclItem, CLR_WHITE);
+        return (MRESULT) TRUE;
+      }
+    case SDA_SLIDERSHAFT:
+      {
+        RECTL rcl;
+
+        rcl=ci.rclSource;
+        rcl.xLeft+=poi->rclItem.xLeft;
+        rcl.xRight=rcl.xLeft+(poi->rclItem.xRight-poi->rclItem.xLeft);
+        rcl.yBottom+=SLOFFSET;
+        rcl.yTop-=SLOFFSET;
+
+        if(!WinDrawBitmap(poi->hps, ci.hbmSource,
+                          &rcl,
+                          //&ci.rclSource, 
+                          (PPOINTL)&poi->rclItem,
+                          0, 0,
+                          DBM_IMAGEATTRS))
+          return (MRESULT)FALSE;
+        return (MRESULT)TRUE;
+      }
+    default:
+      return (MRESULT)TRUE;
+    }
+  /* Done */
+  return (MRESULT)TRUE;
+}
+
+
+
Index: /tags/CWMM-0.3.0_GA/classes/mm-progs/volume/def.tpl
===================================================================
--- /tags/CWMM-0.3.0_GA/classes/mm-progs/volume/def.tpl	(revision 213)
+++ /tags/CWMM-0.3.0_GA/classes/mm-progs/volume/def.tpl	(revision 213)
@@ -0,0 +1,22 @@
+# Note: lines starting with '#' are comments.
+
+[DESCRIPTION]
+PM volume control
+
+[COPYRIGHT]
+(c) Chris Wohlgemuth 2003-2005 Netlabs CWMM Team 2023
+
+[AUTHOR]
+Netlabs CWMM Team
+
+[NAME]
+# This is the NAME xxx WINDOWAPI|etc line in the def file.
+# Important: it specifies the internal name of the program. Don't leave out!
+NAME CLASSVOL WINDOWAPI
+
+[BUILDMACHINE]
+Zobopeep
+
+[OTHER]
+# Add all the lines here you want to have at the end of the generated DEF file
+STACKSIZE    1638400
Index: /tags/CWMM-0.3.0_GA/classes/mm-progs/volume/display.c
===================================================================
--- /tags/CWMM-0.3.0_GA/classes/mm-progs/volume/display.c	(revision 213)
+++ /tags/CWMM-0.3.0_GA/classes/mm-progs/volume/display.c	(revision 213)
@@ -0,0 +1,192 @@
+/*
+ * This file is (C) Chris Wohlgemuth 2002
+ * It is part of the MediaFolder package
+ */
+/*
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; see the file COPYING.  If not, write to
+ * the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+/*
+ * If you need another license for your project/product (commercial,
+ * noncommercial, whatever) contact me at
+ * 
+ * http://www.os2world.com/cdwriting
+ * http://www.geocities.com/SiliconValley/Sector/5785/
+ *
+ */
+
+#define INCL_GPILCIDS
+#define INCL_GPIPRIMITIVES
+#define INCL_GPIBITMAPS
+#define INCL_GPILOGCOLORTABLE
+#define INCL_SW
+#define INCL_GPIREGIONS
+#define INCL_WIN
+
+#include <os2.h>
+
+#include "common.h"
+#include "mmres.h"
+#include "mmplayer.h"
+#include <stdio.h>
+#include <stdlib.h>
+
+/* 0: time, 1: remaining, 2: filename */
+extern int iWhichDisplay;
+/* Display timer for changing between track info */
+extern ULONG ulDisplayTimer;
+extern ULONG ulTotalLength;
+/* Current time in track */
+extern ULONG ulPos;
+char * chrPtrName; /* Pointer to filename */
+
+void _resetDisplay(HWND hwndFrame)
+{
+  WinSetWindowText(WinWindowFromID(hwndFrame, IDST_MMPLAYERPLAYTIME), "0:00");
+  //WinSetWindowULong(WinWindowFromID(WinWindowFromID(hwndTop, IDDLG_TOPMIDDLE), IDST_PLAYTIME), QWL_USER, 0);
+  WinPostMsg( WinWindowFromID(hwndFrame, IDSL_MMPLAYERPOSBAR),
+              SLM_SETSLIDERINFO,
+              MPFROM2SHORT(SMA_SLIDERARMPOSITION,SMA_INCREMENTVALUE),
+              MPFROMLONG(0L));
+}
+
+
+
+/* Set the text in the playtime area to 'theText' */
+void setPlayTimeText2( HWND hwndDialog, char * theText)
+{
+     WinSetWindowText(WinWindowFromID(hwndDialog, IDST_MMPLAYERPLAYTIME), theText);
+}
+
+
+/* Toggle the visibility of the text in the playtime area. Useful for blinking. */
+void togglePlayTimeDisplayVisibility(HWND hwndFrame)
+{
+  if(WinIsWindowVisible(WinWindowFromID(hwndFrame, IDST_MMPLAYERPLAYTIME)))
+    WinShowWindow(WinWindowFromID(hwndFrame, IDST_MMPLAYERPLAYTIME), FALSE);
+  else
+    WinShowWindow(WinWindowFromID(hwndFrame, IDST_MMPLAYERPLAYTIME), TRUE);
+}
+
+
+/* Show/hide the text in the playtime area. Useful for blinking. */
+void showPlayTimeDisplay(HWND hwndFrame, BOOL bShow)
+{
+  WinShowWindow(WinWindowFromID(hwndFrame, IDST_MMPLAYERPLAYTIME), bShow);
+}
+
+
+/* This funktion sets the playtime display according to the user settings.
+   Supported are remaining time, elapsed time and ID3-tag display */
+void setPlayTimeText(hwndFrame)
+{
+  char text[CCHMAXPATH];
+  ULONG ulTemp;
+
+  switch(iWhichDisplay)
+    {
+    case 1:
+      /* Remaining */
+      ulTemp=ulTotalLength/1000-ulPos;
+      sprintf(text,"-%d:%02d",
+              (int)ulTemp/60,
+              (int)ulTemp%60);
+      WinSetWindowText(WinWindowFromID(hwndFrame, IDST_MMPLAYERPLAYTIME), text);
+      break;
+
+    case 2:
+      {
+        ULONG ulTemp=ulDisplayTimer;
+
+        /* Show filename */
+        text[0]=0;
+        
+        if(ulTemp>=3)
+          text[0]=0;
+        else if(ulTemp>=0)
+          strcpy(text, chrPtrName);
+        
+#if 0
+        else
+          ulTemp=15; /* Show playtime for midi files */
+#endif
+     
+        if(ulTemp>=3||!strlen(text)) {
+          /* Play time */
+          sprintf(text,"%d:%02d",
+                  (int)ulPos/60,
+                  (int)ulPos%60);
+        }
+        WinSetWindowText(WinWindowFromID(hwndFrame, IDST_MMPLAYERPLAYTIME), text);
+        ulTemp++;
+        if(ulTemp>=6)
+          ulTemp=0;
+        ulDisplayTimer=ulTemp;
+        break;
+        
+#if 0
+        /* Show ID3 tag */
+        cwAudio=thisPtr->cwQueryCurrentlyPlayingObject();
+        if(somIsObj(cwAudio)) {
+          if(!methodPtr)
+            somhlpQueryCWAudioMethodPtr(thisPtr);
+          sprintf(text,"");
+          if(methodPtr && somIsObj(cwAudioClass) && cwAudio->somIsA(cwAudioClass) ){/* Query playtime in secs */
+            char* chrPtr=text;
+            text[0]=0;
+
+            if(ulTemp>=15)
+              text[0]=0;
+            else if(ulTemp>=12) 
+              methodPtr(cwAudio, &chrPtr, sizeof(text), IDINFO_GENRE);
+            else if(ulTemp>=9)
+              methodPtr(cwAudio, &chrPtr, sizeof(text), IDINFO_COMMENT);
+            else if(ulTemp>=6)
+              methodPtr(cwAudio, &chrPtr, sizeof(text), IDINFO_ALBUM);
+            else if(ulTemp>=3)
+              methodPtr(cwAudio, &chrPtr, sizeof(text), IDINFO_NAME);
+            else if(ulTemp>=0)
+              methodPtr(cwAudio, &chrPtr, sizeof(text), IDINFO_ARTIST);
+          }
+          else
+            ulTemp=15; /* Show playtime for midi files */
+          
+          if(ulTemp>=15||!strlen(text)) {
+            /* Play time */
+            sprintf(text,"%d:%02d",
+                    thisPtr->ulPos/60,
+                    thisPtr->ulPos%60);
+          }
+          WinSetWindowText(WinWindowFromID(thisPtr->hwndTopMiddle, IDST_PLAYTIME), text);
+          ulTemp++;
+          if(ulTemp>=18)
+            ulTemp=0;
+          ulDisplayTimer=ulTemp;
+          break;
+        }
+#endif
+      }
+      /* Fall through to playtime */
+    case 0:
+      /* Elapsed time */
+      sprintf(text,"%d:%02d",
+              (int)ulPos/60,
+              (int)ulPos%60);
+      WinSetWindowText(WinWindowFromID(hwndFrame, IDST_MMPLAYERPLAYTIME), text);
+      break;
+    default:
+      break;
+    }
+}
+
Index: /tags/CWMM-0.3.0_GA/classes/mm-progs/volume/makefile
===================================================================
--- /tags/CWMM-0.3.0_GA/classes/mm-progs/volume/makefile	(revision 213)
+++ /tags/CWMM-0.3.0_GA/classes/mm-progs/volume/makefile	(revision 213)
@@ -0,0 +1,38 @@
+# Makefile
+
+include ../../../make.inc
+
+# MM-progs specific makefile include
+include ../mmprog.inc
+
+OBJECTS		=	$(LIBDIR)/message.obj \
+			$(LIBDIR)/helper.obj \
+			$(LIBDIR)/menu_funcs.obj \
+			$(LIBDIR)/sys_funcs.obj
+OBJS2		=	customprocs.obj
+
+all:	classvol.exe
+
+classvol.exe:	classvol.c $(OBJECTS) $(OBJS2) makefile def.tpl
+	cmd /C $(TOOLDIR)\create_def.cmd classvolume.def
+#Use this command to link dynamicaly
+	$(CC) $(CPPFLAGS) -I$(INC) classvol.c $(OBJECTS) $(OBJS2) mmpm2.lib classvolume.def
+	rc classvolume.rc classvol.exe
+
+
+	
+clean:
+	-rm *.exe
+	-rm *.dll
+	-rm *.obj
+	-rm *.RES
+	-rm *.ini
+	-rm $(LIBDIR)/*.obj
+	-rm *.def
+
+cleaner:
+	-rm *.*~
+	-rm *.flc
+
+
+distribution:
Index: /tags/CWMM-0.3.0_GA/classes/res/common_res/Readme.txt
===================================================================
--- /tags/CWMM-0.3.0_GA/classes/res/common_res/Readme.txt	(revision 213)
+++ /tags/CWMM-0.3.0_GA/classes/res/common_res/Readme.txt	(revision 213)
@@ -0,0 +1,3 @@
+These ressources are bound to the class DLL. They
+contain the icons for the objects but no language
+dependend strings.
Index: /tags/CWMM-0.3.0_GA/classes/res/common_res/cwaudio.rc
===================================================================
--- /tags/CWMM-0.3.0_GA/classes/res/common_res/cwaudio.rc	(revision 213)
+++ /tags/CWMM-0.3.0_GA/classes/res/common_res/cwaudio.rc	(revision 213)
@@ -0,0 +1,55 @@
+#ifndef OS2_INCLUDED
+   #include <os2.h>
+#endif
+#include "mmres.h"
+#include "cwaudioinc.h"
+
+
+#ifdef ECS
+ICON ID_ICONCWAUDIOFILE  "../Icons/Icons_audio_ecs/cwaudio.ico"
+ICON ID_ICONMP3FILE      "../Icons/Icons_audio_ecs/MP3.ico"
+ICON ID_ICONOGGFILE      "../Icons/Icons_audio_ecs/OGG.ico"
+ICON ID_ICONWAVFILE      "../Icons/Icons_audio_ecs/WAV.ico"
+
+ICON ID_ICONAIFFILE      "../Icons/Icons_audio_ecs/AIF.ico"
+ICON ID_ICONAUFILE       "../Icons/Icons_audio_ecs/AU.ico"
+ICON ID_ICON_AUFILE      "../Icons/Icons_audio_ecs/_AU.ico"
+ICON ID_ICONIFFFILE      "../Icons/Icons_audio_ecs/IFF.ico"
+ICON ID_ICONSNDFFILE     "../Icons/Icons_audio_ecs/SNDF.ico"
+ICON ID_ICONVOCFILE      "../Icons/Icons_audio_ecs/VOC.ico"
+ICON ID_ICONMIDIFILE     "../Icons/Icons_audio_ecs/MIDI.ico"
+
+ICON ID_ICONLIGHTTABLE   "../Icons/Icons_mm_ecs/mmfolder.ico"
+ICON ID_ICONLIGHTTABLE2  "../Icons/Icons_mm_ecs/mmfolder2.ico"
+
+ICON ID_ICONAUDIOSTREAM  "../Icons/Icons_audio_ecs/audiostream.ico"
+ICON ID_ICONM3UFILE      "../Icons/Icons_audio_ecs/m3u.ico"
+ICON ID_ICONFLACFILE     "../Icons/Icons_audio_ecs/flac.ico"
+
+#else
+
+ICON ID_ICONCWAUDIOFILE  "../Icons/Icons_audio/cwaudio.ico"
+ICON ID_ICONMP3FILE      "../Icons/Icons_audio/MP3.ico"
+ICON ID_ICONOGGFILE      "../Icons/Icons_audio/OGG.ico"
+ICON ID_ICONWAVFILE      "../Icons/Icons_audio/WAV.ico"
+
+ICON ID_ICONAIFFILE      "../Icons/Icons_audio/AIF.ico"
+ICON ID_ICONAUFILE       "../Icons/Icons_audio/AU.ico"
+ICON ID_ICON_AUFILE      "../Icons/Icons_audio/_AU.ico"
+ICON ID_ICONIFFFILE      "../Icons/Icons_audio/IFF.ico"
+ICON ID_ICONSNDFFILE     "../Icons/Icons_audio/SNDF.ico"
+ICON ID_ICONVOCFILE      "../Icons/Icons_audio/VOC.ico"
+ICON ID_ICONMIDIFILE     "../Icons/Icons_audio/MIDI.ico"
+
+ICON ID_ICONLIGHTTABLE   "../Icons/Icons_mm/mmfolder.ico"
+ICON ID_ICONLIGHTTABLE2  "../Icons/Icons_mm/mmfolder2.ico"
+
+ICON ID_ICONAUDIOSTREAM  "../Icons/Icons_audio/audiostream.ico"
+ICON ID_ICONM3UFILE      "../Icons/Icons_audio/m3u.ico"
+ICON ID_ICONFLACFILE     "../Icons/Icons_audio/flac.ico"
+#endif
+
+
+rcinclude "cwvideo.rc"
+rcinclude "cwimage.rc"
+
Index: /tags/CWMM-0.3.0_GA/classes/res/common_res/cwimage.rc
===================================================================
--- /tags/CWMM-0.3.0_GA/classes/res/common_res/cwimage.rc	(revision 213)
+++ /tags/CWMM-0.3.0_GA/classes/res/common_res/cwimage.rc	(revision 213)
@@ -0,0 +1,33 @@
+#ifndef OS2_INCLUDED
+   #include <os2.h>
+#endif
+
+#ifdef ECS
+ICON ID_ICONCWIMAGEFILE "../Icons/Icons_image_ecs/cwimage.ico"
+ICON ID_ICONAVCFILE     "../Icons/Icons_image_ecs/AVC.ico"
+ICON ID_ICONDIBFILE     "../Icons/Icons_image_ecs/DIB.ico"
+ICON ID_ICONGIFFILE     "../Icons/Icons_image_ecs/GIF.ico"
+ICON ID_ICONJPGFILE     "../Icons/Icons_image_ecs/JPG.ico"
+ICON ID_ICONPCDFILE     "../Icons/Icons_image_ecs/PCD.ico"
+ICON ID_ICONPCXFILE     "../Icons/Icons_image_ecs/PCX.ico"
+ICON ID_ICONTGAFILE     "../Icons/Icons_image_ecs/TGA.ico"
+ICON ID_ICONTIFFILE     "../Icons/Icons_image_ecs/TIF.ico"
+ICON ID_ICON_IMFILE     "../Icons/Icons_image_ecs/_IM.ico"
+ICON ID_ICONBMPFILE     "../Icons/Icons_image_ecs/BMP.ico"
+ICON ID_ICONPNGFILE     "../Icons/Icons_image_ecs/png.ico"
+#else
+ICON ID_ICONCWIMAGEFILE "../Icons/Icons_image/cwimage.ico"
+ICON ID_ICONAVCFILE     "../Icons/Icons_image/AVC.ico"
+ICON ID_ICONDIBFILE     "../Icons/Icons_image/DIB.ico"
+ICON ID_ICONGIFFILE     "../Icons/Icons_image/GIF.ico"
+ICON ID_ICONJPGFILE     "../Icons/Icons_image/JPG.ico"
+ICON ID_ICONPCDFILE     "../Icons/Icons_image/PCD.ico"
+ICON ID_ICONPCXFILE     "../Icons/Icons_image/PCX.ico"
+ICON ID_ICONTGAFILE     "../Icons/Icons_image/TGA.ico"
+ICON ID_ICONTIFFILE     "../Icons/Icons_image/TIF.ico"
+ICON ID_ICON_IMFILE     "../Icons/Icons_image/_IM.ico"
+ICON ID_ICONBMPFILE     "../Icons/Icons_image/BMP.ico"
+ICON ID_ICONPNGFILE     "../Icons/Icons_image/png.ico"
+#endif
+
+
Index: /tags/CWMM-0.3.0_GA/classes/res/common_res/cwvideo.rc
===================================================================
--- /tags/CWMM-0.3.0_GA/classes/res/common_res/cwvideo.rc	(revision 213)
+++ /tags/CWMM-0.3.0_GA/classes/res/common_res/cwvideo.rc	(revision 213)
@@ -0,0 +1,14 @@
+#ifdef ECS
+ICON ID_ICONCWVIDEOFILE "../Icons/Icons_video_ecs/video.ico"
+ICON ID_ICONMPGFILE "../Icons/Icons_video_ecs/MPG.ico"
+ICON ID_ICONMOVFILE "../Icons/Icons_video_ecs/MOV.ico"
+ICON ID_ICONFLIFILE "../Icons/Icons_video_ecs/FLI.ico"
+ICON ID_ICONAVIFILE "../Icons/Icons_video_ecs/AVI.ico"
+#else
+ICON ID_ICONCWVIDEOFILE "../Icons/Icons_video/video.ico"
+ICON ID_ICONMPGFILE "../Icons/Icons_video/MPG.ico"
+ICON ID_ICONMOVFILE "../Icons/Icons_video/MOV.ico"
+ICON ID_ICONFLIFILE "../Icons/Icons_video/FLI.ico"
+ICON ID_ICONAVIFILE "../Icons/Icons_video/AVI.ico"
+#endif
+
Index: /tags/CWMM-0.3.0_GA/classes/res/common_res/makefile
===================================================================
--- /tags/CWMM-0.3.0_GA/classes/res/common_res/makefile	(revision 213)
+++ /tags/CWMM-0.3.0_GA/classes/res/common_res/makefile	(revision 213)
@@ -0,0 +1,20 @@
+# Makefile
+
+include ../../../make.inc
+
+INC		= 	..\..\inc
+
+all: cwaudio.res
+
+
+cwaudio.res:	cwaudio.rc cwimage.rc cwvideo.rc $(INC)\mmres.h
+	rc -r -n -D $(ECS) -I $(INC) cwaudio.rc
+
+clean:
+	-rm cwaudio.res
+
+cleaner:
+	-rm *.*~
+
+
+
Index: /tags/CWMM-0.3.0_GA/classes/res/de/audioconv_de.dlg
===================================================================
--- /tags/CWMM-0.3.0_GA/classes/res/de/audioconv_de.dlg	(revision 213)
+++ /tags/CWMM-0.3.0_GA/classes/res/de/audioconv_de.dlg	(revision 213)
@@ -0,0 +1,36 @@
+#ifndef OS2_INCLUDED
+   #include <os2.h>
+#endif
+
+DLGTEMPLATE IDDLG_CONVERT LOADONCALL MOVEABLE DISCARDABLE
+BEGIN
+    DIALOG  "Audiodatei konvertieren", IDDLG_CONVERT, 115, 36, 207, 174, 
+            WS_VISIBLE, FCF_SYSMENU | FCF_TITLEBAR
+    BEGIN
+        GROUPBOX        "Quelle", IDGB_CONVERT, 3, 105, 203, 69
+        LTEXT           "Name:", IDST_CONVERTNAMELABEL, 7, 156, 32, 8
+        RTEXT           "", IDST_CONVERTNAME, 45, 156, 156, 8
+        LTEXT           "Sample-Rate: ? Hz", IDST_CONVERTSAMPLERATE, 7, 131, 91, 8
+        LTEXT           "Kanle: ?", IDST_CONVERTCHANNELS, 7, 120, 91, 8
+        LTEXT           "Bits pro Sample: ?", IDST_CONVERTCDBITS, 103, 142, 98, 8
+        LTEXT           "(CD: 44100 Hz)", IDST_CONVERTCDSAMPLELABEL, 103, 
+                        131, 98, 8
+        LTEXT           "(CD: 2 Kanle)", IDST_CONVERTCDCHANNELSLABEL, 103, 
+                        120, 98, 8
+        LTEXT           "Spielzeit: ?", IDST_CONVERTPLAYTIME, 7, 109, 161, 8
+        GROUPBOX        "Ziel", IDGB_CONVERT2, 3, 19, 203, 85
+        LTEXT           "Konvertieren in:", 317, 7, 86, 86, 8
+        CONTROL         "", IDDD_IOPROC, 7, 28, 195, 54, WC_COMBOBOX, 
+                        CBS_DROPDOWNLIST | WS_GROUP | WS_TABSTOP | 
+                        WS_VISIBLE
+        LTEXT           "Zielname:", 2419, 7, 57, 64, 8
+        ENTRYFIELD      "", IDEF_CONVERTTARGETNAME, 9, 45, 139, 8, ES_MARGIN
+        
+        PUSHBUTTON      "~Suchen...", IDPB_CONVERTBROWSE, 153, 42, 47, 14
+        CONTROL         "", IDBAR_CONVERTPROGRESS, 6, 24, 194, 13, 
+                        "CW_PERCENTBAR", 5 | WS_GROUP | WS_VISIBLE
+        DEFPUSHBUTTON   "~Konvertieren", IDPB_CONVERTOK, 20, 2, 47, 14
+        PUSHBUTTON      "~Abbruch", IDPB_CONVERTABORT, 71, 2, 40, 14
+        PUSHBUTTON      "~Schlieáen", IDPB_CONVERTCLOSE, 135, 2, 40, 14
+    END
+END
Index: /tags/CWMM-0.3.0_GA/classes/res/de/audioconv_de.rc
===================================================================
--- /tags/CWMM-0.3.0_GA/classes/res/de/audioconv_de.rc	(revision 213)
+++ /tags/CWMM-0.3.0_GA/classes/res/de/audioconv_de.rc	(revision 213)
@@ -0,0 +1,17 @@
+#ifndef OS2_INCLUDED
+   #include <os2.h>
+#endif
+
+STRINGTABLE 
+BEGIN
+
+IDSTR_CONVERTCHANNELS    "Kanle: %d"
+IDSTR_CONVERTSAMPLERATE  "Abtastrate: %d Hz"
+IDSTR_CONVERTPLAYTIME    "%d:%02d min Spielzeit"
+IDSTR_CONVERTDIALOGERROR "Dialog kann nicht geladen werden! Bitte Installation prfen."
+IDSTR_CONVERTNOSPACETITLE   "In Wavedatei umsetzen"
+IDSTR_CONVERTNOSPACETEXT   "Nicht gengend Platz fr die Zieldatei. Einen anderen Speicherort mit mindestens %d MB freiem Speicher whlen."
+IDSTR_INSTALLERRORTITLE  "Installationsproblem"
+IDSTR_AUDIOBROWSETITLE   "Audio-Dateiname"
+
+END
Index: /tags/CWMM-0.3.0_GA/classes/res/de/audioplayer_de.dlg
===================================================================
--- /tags/CWMM-0.3.0_GA/classes/res/de/audioplayer_de.dlg	(revision 213)
+++ /tags/CWMM-0.3.0_GA/classes/res/de/audioplayer_de.dlg	(revision 213)
@@ -0,0 +1,27 @@
+#ifndef OS2_INCLUDED
+   #include <os2.h>
+#endif
+
+DLGTEMPLATE IDDLG_MMPLAYER LOADONCALL MOVEABLE DISCARDABLE
+BEGIN
+    DIALOG  "Audio-Spieler", IDDLG_MMPLAYER, 68, 78, 207, 124, 
+            WS_VISIBLE, FCF_SYSMENU | FCF_TITLEBAR
+    BEGIN
+        CONTROL         "", ID_CLIENT, 18, 0, 56, 67, WC_STATIC, SS_FGNDRECT | 
+                        WS_GROUP | WS_VISIBLE 
+        CONTROL         "~Stop", IDPB_MMPLAYERSTOP, 40, 25, 22, 14, WC_BUTTON, 
+                        BS_USERBUTTON | WS_VISIBLE| WS_TABSTOP
+        CONTROL         "~Pause", IDPB_MMPLAYERPAUSE, 61, 25, 20, 14, WC_BUTTON, 
+                        BS_USERBUTTON | WS_VISIBLE
+        CONTROL         "P~lay", IDPB_MMPLAYERPLAY, 79, 25, 20, 14, WC_BUTTON, 
+                        BS_USERBUTTON | WS_VISIBLE
+        CTEXT           "0:00", IDST_MMPLAYERPLAYTIME, 123, 14, 134, 13, DT_VCENTER
+                        PRESPARAMS PP_FONTNAMESIZE, "10.Helv"
+;        CONTROL         "VolumeArm", IDSL_MMPLAYERVOLUMEARM, 209, 5, 14, 14, 
+;                        WC_BUTTON, BS_USERBUTTON | WS_TABSTOP|BS_USERBUTTON
+;        PUSHBUTTON      "Volume", IDSL_MMPLAYERVOLUME, 19, 4, 69, 14, 
+;                        BS_NOPOINTERFOCUS | NOT WS_TABSTOP | NOT WS_VISIBLE |BS_USERBUTTON
+
+    END
+END
+
Index: /tags/CWMM-0.3.0_GA/classes/res/de/audioplayer_de.rc
===================================================================
--- /tags/CWMM-0.3.0_GA/classes/res/de/audioplayer_de.rc	(revision 213)
+++ /tags/CWMM-0.3.0_GA/classes/res/de/audioplayer_de.rc	(revision 213)
@@ -0,0 +1,16 @@
+#ifndef OS2_INCLUDED
+   #include <os2.h>
+#endif
+
+MENU  ID_MENUTIMECONTEXT
+BEGIN
+	MENUITEM "~Aktuelle Position"   ,        ID_MENUITEMELAPSED
+	MENUITEM "~Verbleibende Zeit" ,          ID_MENUITEMREMAINING
+	MENUITEM "~Track-Information" ,          ID_MENUITEMID3
+END
+
+STRINGTABLE
+BEGIN
+IDSTR_MASTERVOLUMEITEM "System-~Lautstrke"
+END
+
Index: /tags/CWMM-0.3.0_GA/classes/res/de/classvolume_de.dlg
===================================================================
--- /tags/CWMM-0.3.0_GA/classes/res/de/classvolume_de.dlg	(revision 213)
+++ /tags/CWMM-0.3.0_GA/classes/res/de/classvolume_de.dlg	(revision 213)
@@ -0,0 +1,15 @@
+#ifndef OS2_INCLUDED
+   #include <os2.h>
+#endif
+
+DLGTEMPLATE IDDLG_CLASSVOLUME LOADONCALL MOVEABLE DISCARDABLE
+BEGIN
+    DIALOG  "Lautstrke", IDDLG_CLASSVOLUME, 68, 78, 207, 124, 
+            WS_VISIBLE, FCF_SYSMENU | FCF_TITLEBAR
+    BEGIN
+        CONTROL         "", ID_CLASSVOLCLIENT, 18, 0, 56, 67, WC_STATIC, SS_FGNDRECT | 
+                        WS_GROUP | WS_VISIBLE 
+
+    END
+END
+
Index: /tags/CWMM-0.3.0_GA/classes/res/de/cwaudio_de.dlg
===================================================================
--- /tags/CWMM-0.3.0_GA/classes/res/de/cwaudio_de.dlg	(revision 213)
+++ /tags/CWMM-0.3.0_GA/classes/res/de/cwaudio_de.dlg	(revision 213)
@@ -0,0 +1,77 @@
+#ifndef OS2_INCLUDED
+   #include <os2.h>
+#endif
+
+DLGTEMPLATE IDDLG_ID3TAGS LOADONCALL MOVEABLE DISCARDABLE
+BEGIN
+    DIALOG  "", IDDLG_ID3TAGS, 92, 13, 209, 120, NOT FS_DLGBORDER | 
+            WS_VISIBLE
+    BEGIN
+        PUSHBUTTON      "~Sichern", IDPB_ID3SAVE, 44, 1, 40, 14
+        PUSHBUTTON      "~Widerrufen", IDPB_CANCEL, 87, 1, 40, 14
+        PUSHBUTTON      "~Hilfe", IDPB_ID3HELP, 130, 1, 40, 14, BS_HELP
+        GROUPBOX        "ID3 Tags", IDGB_ID3TAGS, 6, 17, 202, 97
+        LTEXT           "Titel:", 210, 9, 95, 57, 8
+        ENTRYFIELD      "", IDEF_ID3NAME, 73, 95, 127, 8, ES_MARGIN
+        LTEXT           "Knstler:", 211, 9, 82, 57, 8
+        ENTRYFIELD      "", IDEF_ID3ARTIST, 73, 82, 127, 8, ES_MARGIN
+        LTEXT           "Album:", 212, 9, 69, 57, 8
+        ENTRYFIELD      "", IDEF_ID3ALBUM, 73, 69, 127, 8, ES_MARGIN
+        LTEXT           "Kommentar:", 213, 9, 56, 57, 8
+        ENTRYFIELD      "", IDEF_ID3COMMENT, 73, 56, 127, 8, ES_MARGIN
+        LTEXT           "Jahr:", 214, 9, 44, 57, 8
+        ENTRYFIELD      "", IDEF_ID3YEAR, 73, 43, 40, 8, ES_MARGIN
+        LTEXT           "Genre:", 215, 9, 26, 57, 8
+        CONTROL         "", IDDD_ID3GENRE, 71, 5, 99, 31, WC_COMBOBOX, 
+                        CBS_DROPDOWN | WS_GROUP | WS_TABSTOP | WS_VISIBLE
+    END
+END
+
+DLGTEMPLATE IDDLG_WAVEINFOPAGE LOADONCALL MOVEABLE DISCARDABLE
+BEGIN
+    DIALOG  "", IDDLG_WAVEINFOPAGE, 91, 31, 169, 109, NOT FS_DLGBORDER | 
+            WS_VISIBLE
+    BEGIN
+        GROUPBOX        "Audio Info", IDGB_WAVEINFO, 6, 4, 154, 67, NOT 
+                        WS_GROUP
+        LTEXT           "Abtastrate:", IDST_SAMPLERATELABEL, 17, 35, 76, 8
+        LTEXT           "Bits pro Sample:", IDST_BPSLABEL, 17, 23, 76, 8
+        LTEXT           "Spielzeit:", IDST_PLAYTIMELABEL, 17, 47, 76, 8
+        LTEXT           "Kanle:", IDST_CHANNELSLABEL, 17, 12, 76, 8
+        LTEXT           "??:??", IDST_PLAYTIME, 108, 47, 39, 8
+        LTEXT           "??", IDST_SAMPLERATE, 108, 35, 39, 8
+        LTEXT           "??", IDST_BPS, 108, 23, 39, 8
+        LTEXT           "??", IDST_CHANNELS, 108, 12, 39, 8
+    END
+END
+
+DLGTEMPLATE IDDLG_IMAGEINFOPAGE LOADONCALL MOVEABLE DISCARDABLE
+BEGIN
+    DIALOG  "", IDDLG_IMAGEINFOPAGE, 91, 31, 169, 109, NOT FS_DLGBORDER | 
+            WS_VISIBLE
+    BEGIN
+        GROUPBOX        "Bild Information", IDGB_IMAGEINFO, 6, 4, 154, 78, 
+                        NOT WS_GROUP
+        LTEXT           "Breite:", IDST_IMAGEWIDTHLABEL, 17, 35, 76, 8
+        LTEXT           "Hhe:", IDST_IMAGEHEIGHTLABEL, 17, 23, 76, 8
+        LTEXT           "Farbtiefe:", IDST_COLORDEPTHLABEL, 17, 12, 76, 8
+        LTEXT           "??", IDST_IMAGEWIDTH, 108, 35, 39, 8
+        LTEXT           "??", IDST_IMAGEHEIGHT, 108, 23, 39, 8
+        LTEXT           "??", IDST_COLORDEPTH, 108, 12, 39, 8
+        LTEXT           "", IDST_IMAGEFORMAT, 17, 48, 135, 21, DT_WORDBREAK
+    END
+END
+
+DLGTEMPLATE IDDLG_STREAMURLPAGE LOADONCALL MOVEABLE DISCARDABLE
+BEGIN
+    DIALOG  "", IDDLG_STREAMURLPAGE, 91, 31, 169, 109, NOT FS_DLGBORDER | 
+            WS_VISIBLE
+    BEGIN
+       PUSHBUTTON      "~Hilfe", IDPB_STREAMHELP, 130, 1, 40, 14, BS_HELP
+        GROUPBOX        "URL", IDGB_STREAMURL, 6, 4, 154, 61, NOT WS_GROUP
+        ENTRYFIELD      "", IDEF_URL, 13, 23, 140, 8, ES_MARGIN
+        LTEXT           "URL fr Server eingeben:", IDST_URLTEXT, 12, 37, 
+                        143, 8
+    END
+END
+
Index: /tags/CWMM-0.3.0_GA/classes/res/de/cwaudio_de.rc
===================================================================
--- /tags/CWMM-0.3.0_GA/classes/res/de/cwaudio_de.rc	(revision 213)
+++ /tags/CWMM-0.3.0_GA/classes/res/de/cwaudio_de.rc	(revision 213)
@@ -0,0 +1,126 @@
+#ifndef OS2_INCLUDED
+   #include <os2.h>
+#endif
+
+MENU ID_MENU_VOLUME
+BEGIN
+        MENUITEM "~Lautstrke",ID_MENU_VOLUME       
+END
+
+MENU ID_MENU_START
+BEGIN
+        MENUITEM "~Start",ID_MENU_START       
+END
+
+MENU ID_MENU_STOP
+BEGIN
+        MENUITEM "~Stopp", ID_MENU_STOP       
+END
+
+MENU ID_MENU_PAUSE
+BEGIN
+        MENUITEM "~Pause", ID_MENU_PAUSE       
+END
+
+MENU ID_MENU_RESUME
+BEGIN
+        MENUITEM "~Fortsetzen", ID_MENU_RESUME       
+END
+
+MENU ID_MENU_EDITOR
+BEGIN
+        MENUITEM "~Audioeditor", ID_MENU_EDITOR       
+END
+
+MENU ID_MENU_PLAYER
+BEGIN
+        MENUITEM "S~pieler", ID_MENU_PLAYER
+END
+
+MENU ID_MENU_CONVERT
+BEGIN
+	SUBMENU  "~Konvertieren in",ID_MENU_CONVERT
+	BEGIN
+        MENUITEM "~WAV (RIFF WAVE Digital Audio)", ID_ITEM_CONVERT
+	END
+END
+
+MENU ID_MENUICONSIZE
+BEGIN
+   MENUITEM "Normale Symbole", ID_NORMALICONSITEM
+   MENUITEM  "50 * 50" , ID_50X50ITEM
+   MENUITEM  "100 * 100" , ID_100X100ITEM
+   MENUITEM  "150 * 150" , ID_150X150ITEM
+   MENUITEM  "200 * 200" , ID_200X200ITEM
+   MENUITEM  "250 * 250" , ID_250X250ITEM
+END
+
+MENU ID_MENU_M3UEDITOR
+BEGIN
+        MENUITEM "Playlist-~Editor", ID_MENU_M3UEDITOR       
+END
+
+MENU ID_MENU_M3UPLAYER
+BEGIN
+        MENUITEM "Liste ~spielen", ID_MENU_M3UPLAYER       
+END
+
+
+STRINGTABLE 
+BEGIN
+ID_WAVEINFOPAGENAME "~Audio-Information"
+ID_ID3TAGSPAGENAME  "~ID3-Tags"
+ID_TRACKNAMEPAGENAME "~Track Metadaten"
+IDSTR_TRACKNAME      "Trackname"
+
+IDSTR_PLAYTIME      "Spielzeit"
+IDSTR_SAMPLERATE    "Abtastrate"
+IDSTR_CHANNELS      "Kanle"
+IDSTR_BPS           "Bits pro Sample"
+
+;IDSTR_BITRATE       "Bitrate"
+;IDSTR_VBR           "VBR"
+
+IDSTR_TITLE         "Titel"
+IDSTR_ARTIST        "Knstler"
+IDSTR_ALBUM         "Album"
+IDSTR_YEAR          "Jahr"
+IDSTR_COMMENT       "Kommentar"
+IDSTR_GENRE         "Genre"
+
+IDSTR_HELPLIBRARY      "MMPARTS.HLP"
+IDSTR_CWMMDATAFILETITLE "MM-Datei"
+;Titles of audio classes
+IDSTR_CWAUDIOTITLE   "Digital Audio"
+IDSTR_AIFTITLE       "AIFAudio.AIF"
+IDSTR_AUTITLE        "AUAudio.AU"
+IDSTR__AUTITLE       "_AUAudio._AU"
+IDSTR_IFFTITLE       "IFFAudio.IFF"
+IDSTR_SNDFTITLE      "SNDAudio.SND"
+IDSTR_VOCTITLE       "VOCAudio.VOC"
+IDSTR_WAVTITLE       "WAVAudio.WAV"
+IDSTR_OGGTITLE       "OGGAudio.OGG"
+IDSTR_MP3TITLE       "MP3Audio.MP3"
+IDSTR_MIDITITLE       "MIDI.MID"
+IDSTR_FLACTITLE       "FLACAudio.FLA"
+
+
+IDSTR_LIGHTTABLETITLE "Leuchttisch"
+
+IDSTR_ICONSIZEMENU    "Symbol~gráe"
+;Used as an information when starting and audio file from the WPS
+IDSTR_STARTINGTRACK      "Starte Track..."
+IDSTR_AUDIOSCANNING     "berprfe Audiodatei..."
+IDSTR_AUDIOSTREAMTITLE  "Audio-Stream"
+IDSTR_STREAMURLPAGENAME "~URL-Angabe"
+IDSTR_CDTRACKTITLE      "CD-Track"
+IDSTR_M3UTITLE          "M3U-Playlist"
+;Titles used when starting player and editor applications
+IDSTR_AUDPLAYERTITLE       "Audio-Spieler"
+IDSTR_AUDEDITORTITLE       "Audio-Editor"
+IDSTR_M3UEDITORTITLE       "Playlist-Editor"
+IDSTR_TRACKPAUSED          " (pausiert)"
+;Used for window list
+IDSTR_VOLUMETITLE           "Lautstrke"
+
+END
Index: /tags/CWMM-0.3.0_GA/classes/res/de/cwimage_de.rc
===================================================================
--- /tags/CWMM-0.3.0_GA/classes/res/de/cwimage_de.rc	(revision 213)
+++ /tags/CWMM-0.3.0_GA/classes/res/de/cwimage_de.rc	(revision 213)
@@ -0,0 +1,47 @@
+#ifndef OS2_INCLUDED
+   #include <os2.h>
+#endif
+
+
+MENU ID_MENU_IMGEDITOR
+BEGIN
+        MENUITEM "Bild~editor", ID_MENU_IMGEDITOR       
+END
+
+
+STRINGTABLE 
+BEGIN
+IDSTR_MENU_CONVERT "~Konvertieren in"
+ 
+IDSTR_AVCTITLE      "AVCImage._IM"
+IDSTR_DIBTITLE      "DIBImage.DIB"
+IDSTR_GIFTITLE      "GIFImage.GIF"
+IDSTR_JPGTITLE      "JPGImage.JPG"
+IDSTR_PCDTITLE      "PCDImage.PCD"
+IDSTR_PCXTITLE      "PCXImage.PCX"
+IDSTR_TGATITLE      "TargaImage.TGA"
+IDSTR_TIFTITLE      "TIFImage.TIF"
+IDSTR_PNGTITLE      "PNGImage.PNG"
+IDSTR_MMOTIONTITLE  "VIDImage.VID"
+IDSTR_CWIMAGETITLE  "Digitales Bild"
+
+IDSTR_IMAGEINFOPAGENAME "~Bild-Information"
+IDSTR_SPRINTFPIXEL	"%d Pixel"
+IDSTR_SPRINTFBIT       "%d Bit"
+;Bitmpap load errors
+IDSTR_NOIMGIOPROCERROR   "Keine Ein/Ausgabeprozedur zum Laden des Bildes gefunden."
+IDSTR_OPENFILEERRORTITLE "Dateifehler"
+IDSTR_OPENFILEERROR      "Datei kann nicht geffnet werden."
+IDSTR_NOMEMERROR         "Nicht gengend Speicher verfgbar!"
+IDSTR_IMGIOPROCCRASH     "Ein interner Fehler trat beim ffnen des Bildes auf. Die Arbeitsoberflche MUSS neu gestartet werden, andernfalls kann es zu Stabilittsproblemen kommen! Alle laufenden Programme bleiben gestartet."
+
+IDSTR_IMAGEDETAIL_WIDTH   "Breite"
+IDSTR_IMAGEDETAIL_HEIGHT  "Hhe"
+IDSTR_IMAGEDETAIL_DEPTH   "Farbtiefe"
+IDSTR_IMAGEDETAIL_FORMAT  "Format"
+;Titles used when starting player and editor applications
+IDSTR_IMGEDITORTITLE       "Bildanzeige"
+IDSTR_MENU_IMAGEINFO        "Bild-Information: %d x %d x %d"
+
+;IDSTR_HELPLIBRARY   "MMPARTS.HLP"
+END
Index: /tags/CWMM-0.3.0_GA/classes/res/de/cwvideo_de.rc
===================================================================
--- /tags/CWMM-0.3.0_GA/classes/res/de/cwvideo_de.rc	(revision 213)
+++ /tags/CWMM-0.3.0_GA/classes/res/de/cwvideo_de.rc	(revision 213)
@@ -0,0 +1,13 @@
+
+STRINGTABLE 
+BEGIN
+;Titles of video classes
+IDSTR_CWVIDEOTITLE       "Digital Video"
+IDSTR_MPGTITLE       	 "MPGVideo.MPG"
+IDSTR_MOVTITLE       	 "MOVVideo.MOV"
+IDSTR_FLITITLE       	 "FLIVideo.FLI"
+IDSTR_AVITITLE       	 "AVIVideo.AVI"
+IDSTR_VIDPLAYERTITLE       "Video-Spieler"
+
+END
+
Index: /tags/CWMM-0.3.0_GA/classes/res/de/def.tpl
===================================================================
--- /tags/CWMM-0.3.0_GA/classes/res/de/def.tpl	(revision 213)
+++ /tags/CWMM-0.3.0_GA/classes/res/de/def.tpl	(revision 213)
@@ -0,0 +1,26 @@
+# Note: lines starting with '#' are comments.
+
+[DESCRIPTION]
+DE MM Resource-DLL
+
+[COPYRIGHT]
+(c) C. Wohlgemuth 2001-2005 Netlabs CWMM Team 2023
+
+[AUTHOR]
+Netlabs CWMM Team
+
+[NAME]
+# This is the NAME xxx WINDOWAPI|etc line in the def file.
+# Important: it specifies the internal name of the program. Don't leave out!
+LIBRARY MMRES_DE INITINSTANCE TERMINSTANCE
+
+[BUILDMACHINE]
+Zobopeep
+
+[OTHER]
+# Add all the lines here you want to have at the end of the generated DEF file
+PROTMODE
+CODE LOADONCALL DISCARDABLE
+DATA MULTIPLE NONSHARED
+EXPORTS
+        queryLanguage
Index: /tags/CWMM-0.3.0_GA/classes/res/de/imageconv_de.dlg
===================================================================
--- /tags/CWMM-0.3.0_GA/classes/res/de/imageconv_de.dlg	(revision 213)
+++ /tags/CWMM-0.3.0_GA/classes/res/de/imageconv_de.dlg	(revision 213)
@@ -0,0 +1,29 @@
+#ifndef OS2_INCLUDED
+   #include <os2.h>
+#endif
+
+DLGTEMPLATE IDDLG_IMGCONVERT LOADONCALL MOVEABLE DISCARDABLE
+BEGIN
+    DIALOG  "Bilddatei konvertieren", IDDLG_IMGCONVERT, 68, 78, 207, 191, 
+            WS_VISIBLE, FCF_SYSMENU | FCF_TITLEBAR
+    BEGIN
+        GROUPBOX        "", IDGB_IMGCONVERT, 2, 19, 203, 172
+        LTEXT           "Name:", IDST_IMGCONVERTNAMELABEL, 7, 173, 32, 8
+        LTEXT           "", IDST_IMGCONVERTNAME, 44, 173, 156, 8
+        CONTROL         "", IDSR_BMP, 12, 100, 185, 69, WC_STATIC, 
+                        SS_FGNDRECT | WS_GROUP | WS_VISIBLE
+        LTEXT           "Konvertieren zu", IDST_IMGCONVERTTO, 7, 88, 53, 8
+        CONTROL         "", IDDD_IMGIOPROC, 6, 6, 196, 78, WC_COMBOBOX, 
+                        CBS_DROPDOWNLIST | LS_HORZSCROLL | WS_GROUP | 
+                        WS_TABSTOP | WS_VISIBLE
+        LTEXT           "Zielname:", 2419, 7, 57, 64, 8
+        ENTRYFIELD      "", IDEF_IMGCONVERTTARGETNAME, 9, 45, 139, 8, ES_MARGIN
+        PUSHBUTTON      "~Suchen...", IDPB_IMGCONVERTBROWSE, 153, 42, 47, 14
+        CONTROL         "", IDBAR_IMGCONVERTPROGRESS, 6, 24, 194, 13, 
+                        "CW_PERCENTBAR", 5 | WS_GROUP | WS_VISIBLE
+        DEFPUSHBUTTON   "~Konvertieren", IDPB_IMGCONVERTOK, 20, 2, 47, 14
+        PUSHBUTTON      "~Abbruch", IDPB_IMGCONVERTABORT, 71, 2, 40, 14
+        PUSHBUTTON      "Sch~lieáen", IDPB_IMGCONVERTCLOSE, 135, 2, 40, 14
+    END
+END
+
Index: /tags/CWMM-0.3.0_GA/classes/res/de/imageconv_de.rc
===================================================================
--- /tags/CWMM-0.3.0_GA/classes/res/de/imageconv_de.rc	(revision 213)
+++ /tags/CWMM-0.3.0_GA/classes/res/de/imageconv_de.rc	(revision 213)
@@ -0,0 +1,8 @@
+#ifndef OS2_INCLUDED
+   #include <os2.h>
+#endif
+
+STRINGTABLE
+BEGIN
+IDSTR_IMAGEBROWSETITLE   "Bild-Dateiname"
+END
Index: /tags/CWMM-0.3.0_GA/classes/res/de/makefile
===================================================================
--- /tags/CWMM-0.3.0_GA/classes/res/de/makefile	(revision 213)
+++ /tags/CWMM-0.3.0_GA/classes/res/de/makefile	(revision 213)
@@ -0,0 +1,53 @@
+# Makefile for CWMM resource dll
+
+include ../../../make.inc
+include ../../../build.inc
+
+LANGUAGE	=	_de
+
+CC           = icc
+CPPFLAGS     = /Ge- /Gm+ /G4 /Gl  /O+ /Oc+ /Ol- /Q+ $(VACDEBUG)
+INC	=	../../inc
+DEFS         =
+#TOOLDIR =      $(BUILD_ROOT)\classes\mm-progs
+OBJDIR	=	../dll
+
+OBJECTS	= 	$(INC)\mmres.h mmres$(LANGUAGE).rc \
+			audioplayer$(LANGUAGE).dlg audioplayer$(LANGUAGE).rc \
+			audioconv$(LANGUAGE).dlg audioconv$(LANGUAGE).rc \
+			volume$(LANGUAGE).rc volume$(LANGUAGE).dlg \
+			imageconv$(LANGUAGE).dlg imageconv$(LANGUAGE).rc \
+			cwaudio$(LANGUAGE).rc cwaudio$(LANGUAGE).dlg \
+			cwimage$(LANGUAGE).rc cwvideo$(LANGUAGE).rc \
+			mmfind$(LANGUAGE).dlg mmfind$(LANGUAGE).rc
+
+
+all:	$(OBJDIR)/mmres$(LANGUAGE).dll
+
+$(OBJDIR)/mmres$(LANGUAGE).dll:	mmres$(LANGUAGE).c $(OBJECTS) 
+		cmd /C $(TOOLDIR)/create_def.cmd mmres$(LANGUAGE).def
+		icc $(CPPFLAGS) -I$(INC) /Fe$(OBJDIR)\$@ $< mmres$(LANGUAGE).def
+		rc -D $(ECS) -i $(INC) mmres$(LANGUAGE).rc $(OBJDIR)/mmres$(LANGUAGE).dll
+		rc -r -D $(ECS) -i $(INC) mmres$(LANGUAGE).rc $(OBJDIR)/mmres$(LANGUAGE).res
+#		rc  mmres$(LANGUAGE).res $(OBJDIR)/mmres$(LANGUAGE).dll
+
+#(OBJDIR)/mmres$(LANGUAGE).res:	mmres$(LANGUAGE).rc $(OBJECTS)
+#		rc -D $(ECS) -i $(INC) -r mmres$(LANGUAGE).rc
+
+
+restest:	
+	echo  $(deftext)> test.def
+
+                		
+clean:
+	-rm $(OBJDIR)/*.obj
+	-rm $(OBJDIR)/*.dll
+	-rm $(OBJDIR)/*.res
+	-rm *.*~
+	-rm *.flc
+	-rm *.RES
+	-rm *.obj
+	-rm *.def
+
+
+	
Index: /tags/CWMM-0.3.0_GA/classes/res/de/mmfind_de.dlg
===================================================================
--- /tags/CWMM-0.3.0_GA/classes/res/de/mmfind_de.dlg	(revision 213)
+++ /tags/CWMM-0.3.0_GA/classes/res/de/mmfind_de.dlg	(revision 213)
@@ -0,0 +1,55 @@
+#ifndef OS2_INCLUDED
+   #include <os2.h>
+#endif
+
+DLGTEMPLATE IDDLG_MMFIND LOADONCALL MOVEABLE DISCARDABLE
+BEGIN
+    DIALOG  "Multimedia-Datei finden", IDDLG_MMFIND, 12, 23, 338, 133, WS_VISIBLE | WS_SYNCPAINT, 
+            FCF_SYSMENU | FCF_TITLEBAR
+            PRESPARAMS PP_FONTNAMESIZE, "9.WarpSans"
+    BEGIN
+        LTEXT           "Dateiname", 257, 4, 120, 51, 9, DT_VCENTER | 
+                        NOT WS_GROUP
+        ENTRYFIELD      "*", 258, 55, 120, 239, 7, ES_MARGIN | WS_GROUP
+        LTEXT           "Laufwerk", 259, 4, 108, 51, 9, DT_VCENTER | NOT 
+                        WS_GROUP
+        CONTROL         "H:  [QUELLEN]", 260, 54, 18, 87, 99, WC_COMBOBOX, 
+                        CBS_DROPDOWNLIST | WS_TABSTOP | WS_VISIBLE
+        LTEXT           "Datei-Filter", 261, 174, 4, 46, 9, DT_VCENTER | 
+                        NOT WS_GROUP | NOT WS_VISIBLE
+        CONTROL         "<All Files>", 262, 209, 4, 29, 8, WC_COMBOBOX, 
+                        CBS_DROPDOWNLIST | WS_TABSTOP
+        LTEXT           "Verzeichnis", 263, 4, 97, 35, 7, NOT WS_GROUP
+        LTEXT           "", 270, 42, 98, 60, 6, NOT WS_GROUP | NOT 
+                        WS_VISIBLE
+        LTEXT           "Datei", 265, 131, 97, 17, 7, NOT WS_GROUP
+        AUTOCHECKBOX    "Read-Only", 269, 171, 97, 42, 8, NOT WS_TABSTOP | 
+                        NOT WS_VISIBLE
+        LISTBOX         264, 4, 17, 116, 76, LS_OWNERDRAW | LS_HORZSCROLL
+        LISTBOX         266, 125, 17, 116, 76, LS_HORZSCROLL
+        RTEXT           "Dateityp", IDST_TYPE, 146, 108, 58, 9, DT_VCENTER
+        CONTROL         "", IDCB_TYPEOFFILE, 208, 18, 87, 99, WC_COMBOBOX, 
+                        CBS_DROPDOWNLIST | WS_GROUP | WS_TABSTOP | 
+                        WS_VISIBLE
+        GROUPBOX        "Vorschau", IDGB_PREVIEW, 245, 16, 89, 80, NOT WS_VISIBLE
+        CONTROL         "", IDSR_IMGPREVIEW, 249, 20, 82, 68, WC_STATIC, SS_FGNDRECT | 
+                        WS_GROUP
+        CTEXT           "Keine Vorschau verfgbar", IDST_NOPREVIEWAVAILABLE, 251, 42, 78, 33, 
+                        DT_WORDBREAK | NOT WS_VISIBLE
+        LTEXT           "", IDST_AUDIOINFO, 253, 41, 75, 42, DT_WORDBREAK | NOT 
+                        WS_VISIBLE
+        GROUPBOX        "Audio-Information", IDGB_AUDIOINFO, 245, 17, 89, 79, NOT WS_VISIBLE
+        PUSHBUTTON      "Stop", IDPB_MMFINDSTOP, 267, 19, 21, 10, 
+                        BS_NOPOINTERFOCUS | NOT WS_TABSTOP
+        PUSHBUTTON      "Play", IDPB_MMFINDPLAY, 291, 19, 21, 10, 
+                        BS_NOPOINTERFOCUS | NOT WS_TABSTOP
+        DEFPUSHBUTTON   "~OK", DID_OK, 3, 2, 40, 12
+        PUSHBUTTON      "~Neu...", IDPB_NEWFILE, 46, 2, 40, 12
+        PUSHBUTTON      "Apply", 268, 293, 3, 40, 12, NOT WS_TABSTOP | NOT 
+                        WS_VISIBLE
+        PUSHBUTTON      "~Abbruch", DID_CANCEL, 95, 2, 40, 12, NOT WS_TABSTOP
+        PUSHBUTTON      "Hilfe", 267, 243, 2, 40, 12, BS_NOPOINTERFOCUS | NOT 
+                        WS_TABSTOP | NOT WS_VISIBLE
+        LISTBOX         3, 0, 0, 2, 1, NOT WS_TABSTOP | NOT WS_VISIBLE
+    END
+END
Index: /tags/CWMM-0.3.0_GA/classes/res/de/mmfind_de.rc
===================================================================
--- /tags/CWMM-0.3.0_GA/classes/res/de/mmfind_de.rc	(revision 213)
+++ /tags/CWMM-0.3.0_GA/classes/res/de/mmfind_de.rc	(revision 213)
@@ -0,0 +1,13 @@
+#ifndef OS2_INCLUDED
+   #include <os2.h>
+#endif
+
+STRINGTABLE
+BEGIN
+IDSTR_TYPEAUDIO       "Audiodatei"
+IDSTR_TYPEIMAGE       "Bilddatei"
+IDSTR_TYPEVIDEO       "Videodatei"
+IDSTR_AUDIOINFOTEXT   "Spielzeit:\t%02d:%02d\x0a\x0aAbtastrate:\t%d\x0a\x0aBits pro Sample:\t%d\x0a\x0aKanle:\t\t%d"
+IDSTR_NOMMTEMPLATEFLDRTITLE "Fehler bei Dateierstellung"
+IDSTR_NOMMTEMPLATEFLDR "Multimedia-Schablonenordner kann nicht gefunden werden. Mglicherweise ist die Objekt-ID <MMPM2_MMTEMPLATEFOLDER> verloren gegangen."
+END
Index: /tags/CWMM-0.3.0_GA/classes/res/de/mmres_de.c
===================================================================
--- /tags/CWMM-0.3.0_GA/classes/res/de/mmres_de.c	(revision 213)
+++ /tags/CWMM-0.3.0_GA/classes/res/de/mmres_de.c	(revision 213)
@@ -0,0 +1,26 @@
+/*
+ * This file is (C) Chris Wohlgemuth 2003
+ */
+/*
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; see the file COPYING.  If not, write to
+ * the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+
+#include <os2.h>
+
+PSZ queryLanguage()
+{
+  return "Deutsch";
+}
+
Index: /tags/CWMM-0.3.0_GA/classes/res/de/mmres_de.rc
===================================================================
--- /tags/CWMM-0.3.0_GA/classes/res/de/mmres_de.rc	(revision 213)
+++ /tags/CWMM-0.3.0_GA/classes/res/de/mmres_de.rc	(revision 213)
@@ -0,0 +1,38 @@
+#define  INCL_GRAPHICBUTTON   /* need this for the graphic buttons control */
+#define  INCL_BITMAP
+
+#ifndef OS2_INCLUDED
+   #include <os2.h>
+#endif
+#include <sw.h>
+
+#include "mmres.h"
+
+;#include "version.h"
+;#include "build.h"
+
+
+;Dialog Resources for volume.exe
+rcinclude "volume_de.rc"
+rcinclude "volume_de.dlg"
+
+rcinclude "audioconv_de.rc"
+rcinclude "audioconv_de.dlg"
+
+rcinclude "imageconv_de.rc"
+rcinclude "imageconv_de.dlg"
+
+rcinclude "audioplayer_de.rc"
+rcinclude "audioplayer_de.dlg"
+
+rcinclude "classvolume_de.dlg"
+
+rcinclude "cwaudio_de.rc"
+rcinclude "cwaudio_de.dlg"
+
+rcinclude "cwimage_de.rc"
+rcinclude "cwvideo_de.rc"
+
+rcinclude "mmfind_de.rc"
+rcinclude "mmfind_de.dlg"
+
Index: /tags/CWMM-0.3.0_GA/classes/res/de/volume_de.dlg
===================================================================
--- /tags/CWMM-0.3.0_GA/classes/res/de/volume_de.dlg	(revision 213)
+++ /tags/CWMM-0.3.0_GA/classes/res/de/volume_de.dlg	(revision 213)
@@ -0,0 +1,20 @@
+#ifndef OS2_INCLUDED
+   #include <os2.h>
+#endif
+#define INCL_GRAPHICBUTTON
+#include <sw.h>
+
+DLGTEMPLATE IDDLG_VOLUME LOADONCALL MOVEABLE DISCARDABLE
+BEGIN
+    DIALOG  "Lautstrke", IDDLG_VOLUME, 73, 148, 112, 56,  
+             WS_VISIBLE, FCF_SYSMENU | FCF_TITLEBAR |  FCF_TASKLIST |
+            FCF_MINBUTTON 
+    BEGIN
+        CONTROL         "~Lautstrke", IDCS_VOLUME, 3, 3, 63, 44, WC_CIRCULARSLIDER, 
+                        WS_GROUP | WS_VISIBLE | WS_TABSTOP
+        CONTROL         "~Stumm", IDPB_MUTE , 65, 17, 40, 14, WC_GRAPHICBUTTON,
+			 WS_VISIBLE | GBS_AUTOTWOSTATE | WS_TABSTOP
+        GROUPBOX        "", IDGB_VOLUME,  1, 2, 109, 53
+    END
+END
+
Index: /tags/CWMM-0.3.0_GA/classes/res/de/volume_de.rc
===================================================================
--- /tags/CWMM-0.3.0_GA/classes/res/de/volume_de.rc	(revision 213)
+++ /tags/CWMM-0.3.0_GA/classes/res/de/volume_de.rc	(revision 213)
@@ -0,0 +1,12 @@
+#ifndef OS2_INCLUDED
+   #include <os2.h>
+#endif
+
+MENU    IDM_POPUP
+BEGIN
+    MENUITEM    "Titelleiste ~verdecken",    IDM_ITEMTITLEBAR
+    MENUITEM    "",    0, MIS_SEPARATOR
+    MENUITEM    "~Beenden",    IDM_ITEMEXIT
+END
+
+
Index: /tags/CWMM-0.3.0_GA/classes/res/en/audioconv_en.dlg
===================================================================
--- /tags/CWMM-0.3.0_GA/classes/res/en/audioconv_en.dlg	(revision 213)
+++ /tags/CWMM-0.3.0_GA/classes/res/en/audioconv_en.dlg	(revision 213)
@@ -0,0 +1,37 @@
+#ifndef OS2_INCLUDED
+   #include <os2.h>
+#endif
+
+DLGTEMPLATE IDDLG_CONVERT LOADONCALL MOVEABLE DISCARDABLE
+BEGIN
+    DIALOG  "Convert audio file", IDDLG_CONVERT, 115, 36, 207, 174, WS_VISIBLE, 
+            FCF_SYSMENU | FCF_TITLEBAR
+    BEGIN
+        GROUPBOX        "Source", IDGB_CONVERT, 3, 105, 203, 69
+        LTEXT           "Name:", IDST_CONVERTNAMELABEL, 7, 156, 32, 8
+        RTEXT           "", IDST_CONVERTNAME, 45, 156, 156, 8
+        LTEXT           "Sample rate: ? Hz", IDST_CONVERTSAMPLERATE, 7, 131, 91, 8
+        LTEXT           "Channels: ?", IDST_CONVERTCHANNELS, 7, 120, 91, 8
+        LTEXT           "Bits per sample: ?", IDST_CONVERTCDBITS, 103, 142, 98, 8
+        LTEXT           "(CD: 44100 Hz)", IDST_CONVERTCDSAMPLELABEL, 103, 131, 
+                        98, 8
+        LTEXT           "(CD: 2 Channels)", IDST_CONVERTCDCHANNELSLABEL, 103, 
+                        120, 98, 8
+        LTEXT           "Play time: ?", IDST_CONVERTPLAYTIME, 7, 109, 161, 8
+        GROUPBOX        "Target", IDGB_CONVERT2, 3, 19, 203, 85
+        LTEXT           "Convert to:", 317, 7, 86, 86, 8
+        CONTROL         "", IDDD_IOPROC, 7, 28, 195, 54, WC_COMBOBOX, 
+                        CBS_DROPDOWNLIST | WS_GROUP | WS_TABSTOP | 
+                        WS_VISIBLE
+
+        LTEXT           "Target name:", 2419, 7, 57, 64, 8
+        ENTRYFIELD      "", IDEF_CONVERTTARGETNAME, 9, 45, 139, 8, ES_MARGIN
+
+        PUSHBUTTON      "~Browse...", IDPB_CONVERTBROWSE, 153, 42, 47, 14
+        CONTROL         "", IDBAR_CONVERTPROGRESS, 6, 24, 194, 13, 
+                        "CW_PERCENTBAR", 5 | WS_GROUP | WS_VISIBLE
+        DEFPUSHBUTTON   "~Convert", IDPB_CONVERTOK, 20, 2, 47, 14
+        PUSHBUTTON      "~Abort", IDPB_CONVERTABORT, 71, 2, 40, 14
+        PUSHBUTTON      "C~lose", IDPB_CONVERTCLOSE, 135, 2, 40, 14
+    END
+END
Index: /tags/CWMM-0.3.0_GA/classes/res/en/audioconv_en.rc
===================================================================
--- /tags/CWMM-0.3.0_GA/classes/res/en/audioconv_en.rc	(revision 213)
+++ /tags/CWMM-0.3.0_GA/classes/res/en/audioconv_en.rc	(revision 213)
@@ -0,0 +1,18 @@
+#ifndef OS2_INCLUDED
+   #include <os2.h>
+#endif
+
+
+STRINGTABLE 
+BEGIN
+
+IDSTR_CONVERTCHANNELS    "Channels: %d"
+IDSTR_CONVERTSAMPLERATE  "Sample rate: %d Hz"
+IDSTR_CONVERTPLAYTIME    "Play time: %d:%02d"
+IDSTR_CONVERTDIALOGERROR "Can't load dialog template! Please check your installation."
+IDSTR_CONVERTNOSPACETITLE   "Convert to wave"
+IDSTR_CONVERTNOSPACETEXT   "There isn't sufficient space for the decoded file. Choose another location with at least %d MB free disk space."
+IDSTR_INSTALLERRORTITLE  "Installation problem"
+IDSTR_AUDIOBROWSETITLE   "Audio file name"
+
+END
Index: /tags/CWMM-0.3.0_GA/classes/res/en/audioplayer_en.dlg
===================================================================
--- /tags/CWMM-0.3.0_GA/classes/res/en/audioplayer_en.dlg	(revision 213)
+++ /tags/CWMM-0.3.0_GA/classes/res/en/audioplayer_en.dlg	(revision 213)
@@ -0,0 +1,27 @@
+#ifndef OS2_INCLUDED
+   #include <os2.h>
+#endif
+
+DLGTEMPLATE IDDLG_MMPLAYER LOADONCALL MOVEABLE DISCARDABLE
+BEGIN
+    DIALOG  "Audio player", IDDLG_MMPLAYER, 68, 78, 207, 124, 
+            WS_VISIBLE, FCF_SYSMENU | FCF_TITLEBAR
+    BEGIN
+        CONTROL         "", ID_CLIENT, 18, 0, 56, 67, WC_STATIC, SS_FGNDRECT | 
+                        WS_GROUP | WS_VISIBLE 
+        CONTROL         "~Stop", IDPB_MMPLAYERSTOP, 40, 25, 22, 14, WC_BUTTON, 
+                        BS_USERBUTTON | WS_VISIBLE| WS_TABSTOP
+        CONTROL         "~Pause", IDPB_MMPLAYERPAUSE, 61, 25, 20, 14, WC_BUTTON, 
+                        BS_USERBUTTON | WS_VISIBLE
+        CONTROL         "P~lay", IDPB_MMPLAYERPLAY, 79, 25, 20, 14, WC_BUTTON, 
+                        BS_USERBUTTON | WS_VISIBLE
+        CTEXT           "0:00", IDST_MMPLAYERPLAYTIME, 123, 14, 134, 13, DT_VCENTER
+                        PRESPARAMS PP_FONTNAMESIZE, "10.Helv"
+;        CONTROL         "VolumeArm", IDSL_MMPLAYERVOLUMEARM, 209, 5, 14, 14, 
+;                        WC_BUTTON, BS_USERBUTTON | WS_TABSTOP|BS_USERBUTTON
+;        PUSHBUTTON      "Volume", IDSL_MMPLAYERVOLUME, 19, 4, 69, 14, 
+;                        BS_NOPOINTERFOCUS | NOT WS_TABSTOP | NOT WS_VISIBLE |BS_USERBUTTON
+
+    END
+END
+
Index: /tags/CWMM-0.3.0_GA/classes/res/en/audioplayer_en.rc
===================================================================
--- /tags/CWMM-0.3.0_GA/classes/res/en/audioplayer_en.rc	(revision 213)
+++ /tags/CWMM-0.3.0_GA/classes/res/en/audioplayer_en.rc	(revision 213)
@@ -0,0 +1,16 @@
+#ifndef OS2_INCLUDED
+   #include <os2.h>
+#endif
+
+MENU  ID_MENUTIMECONTEXT
+BEGIN
+	MENUITEM "~Elapsed time"   ,          ID_MENUITEMELAPSED
+	MENUITEM "~Remaining time" ,          ID_MENUITEMREMAINING
+	MENUITEM "~Track information" ,       ID_MENUITEMID3
+END
+
+STRINGTABLE
+BEGIN
+IDSTR_MASTERVOLUMEITEM "Master ~Volume"
+END
+
Index: /tags/CWMM-0.3.0_GA/classes/res/en/classvolume_en.dlg
===================================================================
--- /tags/CWMM-0.3.0_GA/classes/res/en/classvolume_en.dlg	(revision 213)
+++ /tags/CWMM-0.3.0_GA/classes/res/en/classvolume_en.dlg	(revision 213)
@@ -0,0 +1,15 @@
+#ifndef OS2_INCLUDED
+   #include <os2.h>
+#endif
+
+DLGTEMPLATE IDDLG_CLASSVOLUME LOADONCALL MOVEABLE DISCARDABLE
+BEGIN
+    DIALOG  "Volume", IDDLG_CLASSVOLUME, 68, 78, 207, 124, 
+            WS_VISIBLE, FCF_SYSMENU | FCF_TITLEBAR
+    BEGIN
+        CONTROL         "", ID_CLASSVOLCLIENT, 18, 0, 56, 67, WC_STATIC, SS_FGNDRECT | 
+                        WS_GROUP | WS_VISIBLE 
+
+    END
+END
+
Index: /tags/CWMM-0.3.0_GA/classes/res/en/cwaudio_en.dlg
===================================================================
--- /tags/CWMM-0.3.0_GA/classes/res/en/cwaudio_en.dlg	(revision 213)
+++ /tags/CWMM-0.3.0_GA/classes/res/en/cwaudio_en.dlg	(revision 213)
@@ -0,0 +1,76 @@
+#ifndef OS2_INCLUDED
+   #include <os2.h>
+#endif
+
+DLGTEMPLATE IDDLG_ID3TAGS LOADONCALL MOVEABLE DISCARDABLE
+BEGIN
+    DIALOG  "", IDDLG_ID3TAGS, 92, 13, 209, 120, NOT FS_DLGBORDER | 
+            WS_VISIBLE
+    BEGIN
+        PUSHBUTTON      "~Save", IDPB_ID3SAVE, 44, 1, 40, 14
+        PUSHBUTTON      "~Cancel", IDPB_CANCEL, 87, 1, 40, 14
+        PUSHBUTTON      "~Help", IDPB_ID3HELP, 130, 1, 40, 14, BS_HELP
+        GROUPBOX        "", IDGB_ID3TAGS, 6, 17, 202, 97
+        LTEXT           "Name:", 210, 9, 95, 57, 8
+        ENTRYFIELD      "", IDEF_ID3NAME, 73, 95, 127, 8, ES_MARGIN
+        LTEXT           "Artist:", 211, 9, 82, 57, 8
+        ENTRYFIELD      "", IDEF_ID3ARTIST, 73, 82, 127, 8, ES_MARGIN
+        LTEXT           "Album:", 212, 9, 69, 57, 8
+        ENTRYFIELD      "", IDEF_ID3ALBUM, 73, 69, 127, 8, ES_MARGIN
+        LTEXT           "Comment:", 213, 9, 56, 57, 8
+        ENTRYFIELD      "", IDEF_ID3COMMENT, 73, 56, 127, 8, ES_MARGIN
+        LTEXT           "Year:", 214, 9, 44, 57, 8
+        ENTRYFIELD      "", IDEF_ID3YEAR, 73, 43, 40, 8, ES_MARGIN
+        LTEXT           "Genre:", 215, 9, 26, 57, 8
+        CONTROL         "", IDDD_ID3GENRE, 71, 5, 99, 31, WC_COMBOBOX, 
+                        CBS_DROPDOWN | WS_GROUP | WS_TABSTOP | WS_VISIBLE
+    END
+END
+
+DLGTEMPLATE IDDLG_WAVEINFOPAGE LOADONCALL MOVEABLE DISCARDABLE
+BEGIN
+    DIALOG  "", IDDLG_WAVEINFOPAGE, 91, 31, 169, 109, NOT FS_DLGBORDER | 
+            WS_VISIBLE | NOT WS_SAVEBITS
+    BEGIN
+        GROUPBOX        "", IDGB_WAVEINFO, 6, 4, 154, 67, NOT 
+                        WS_GROUP
+        LTEXT           "Sample rate:", IDST_SAMPLERATELABEL, 17, 35, 76, 8
+        LTEXT           "Bits per sample:", IDST_BPSLABEL, 17, 23, 76, 8
+        LTEXT           "Play time:", IDST_PLAYTIMELABEL, 17, 47, 76, 8
+        LTEXT           "Channels:", IDST_CHANNELSLABEL, 17, 12, 76, 8
+        LTEXT           "??:??", IDST_PLAYTIME, 108, 47, 39, 8
+        LTEXT           "??", IDST_SAMPLERATE, 108, 35, 39, 8
+        LTEXT           "??", IDST_BPS, 108, 23, 39, 8
+        LTEXT           "??", IDST_CHANNELS, 108, 12, 39, 8
+    END
+END
+
+DLGTEMPLATE IDDLG_IMAGEINFOPAGE LOADONCALL MOVEABLE DISCARDABLE
+BEGIN
+    DIALOG  "", IDDLG_IMAGEINFOPAGE, 91, 31, 169, 109, NOT FS_DLGBORDER | 
+            WS_VISIBLE
+    BEGIN
+        GROUPBOX        "", IDGB_IMAGEINFO, 6, 4, 154, 78, 
+                        NOT WS_GROUP
+        LTEXT           "Width:", IDST_IMAGEWIDTHLABEL, 17, 35, 76, 8
+        LTEXT           "Height:", IDST_IMAGEHEIGHTLABEL, 17, 23, 76, 8
+        LTEXT           "Depth:", IDST_COLORDEPTHLABEL, 17, 12, 76, 8
+        LTEXT           "??", IDST_IMAGEWIDTH, 108, 35, 39, 8
+        LTEXT           "??", IDST_IMAGEHEIGHT, 108, 23, 39, 8
+        LTEXT           "??", IDST_COLORDEPTH, 108, 12, 39, 8
+        LTEXT           "", IDST_IMAGEFORMAT, 17, 48, 135, 21, DT_WORDBREAK
+    END
+END
+
+DLGTEMPLATE IDDLG_STREAMURLPAGE LOADONCALL MOVEABLE DISCARDABLE
+BEGIN
+    DIALOG  "", IDDLG_STREAMURLPAGE, 91, 31, 169, 109, NOT FS_DLGBORDER | 
+            WS_VISIBLE
+    BEGIN
+        PUSHBUTTON      "~Help", IDPB_STREAMHELP, 130, 1, 40, 14, BS_HELP
+        GROUPBOX        "URL", IDGB_STREAMURL, 6, 4, 154, 61, NOT WS_GROUP
+        ENTRYFIELD      "", IDEF_URL, 13, 23, 140, 8, ES_MARGIN
+        LTEXT           "Enter URL for streaming server:", IDST_URLTEXT, 12, 
+                        37, 143, 8
+    END
+END
Index: /tags/CWMM-0.3.0_GA/classes/res/en/cwaudio_en.rc
===================================================================
--- /tags/CWMM-0.3.0_GA/classes/res/en/cwaudio_en.rc	(revision 213)
+++ /tags/CWMM-0.3.0_GA/classes/res/en/cwaudio_en.rc	(revision 213)
@@ -0,0 +1,128 @@
+#ifndef OS2_INCLUDED
+   #include <os2.h>
+#endif
+
+
+MENU ID_MENU_VOLUME
+BEGIN
+        MENUITEM "~Volume",ID_MENU_VOLUME       
+END
+
+MENU ID_MENU_START
+BEGIN
+        MENUITEM "~Start",ID_MENU_START       
+END
+
+MENU ID_MENU_STOP
+BEGIN
+        MENUITEM "~Stop", ID_MENU_STOP       
+END
+
+MENU ID_MENU_PAUSE
+BEGIN
+        MENUITEM "~Pause", ID_MENU_PAUSE       
+END
+
+MENU ID_MENU_RESUME
+BEGIN
+        MENUITEM "~Resume", ID_MENU_RESUME       
+END
+
+MENU ID_MENU_EDITOR
+BEGIN
+        MENUITEM "~Audio editor", ID_MENU_EDITOR       
+END
+
+MENU ID_MENU_PLAYER
+BEGIN
+        MENUITEM "~Player", ID_MENU_PLAYER       
+END
+
+MENU ID_MENU_CONVERT
+BEGIN
+	SUBMENU  "~Convert to",ID_MENU_CONVERT
+	BEGIN
+        MENUITEM "~WAV (RIFF WAVE Digital Audio)", ID_ITEM_CONVERT
+	END
+END
+
+MENU ID_MENUICONSIZE
+BEGIN
+;   MENUITEM  "" , ID_MENUICONSIZE, MIS_SEPARATOR
+   MENUITEM "Normal icons", ID_NORMALICONSITEM
+   MENUITEM  "50 * 50" , ID_50X50ITEM
+   MENUITEM  "100 * 100" , ID_100X100ITEM
+   MENUITEM  "150 * 150" , ID_150X150ITEM
+   MENUITEM  "200 * 200" , ID_200X200ITEM
+   MENUITEM  "250 * 250" , ID_250X250ITEM
+END
+
+MENU ID_MENU_M3UEDITOR
+BEGIN
+        MENUITEM "Playlist ~editor", ID_MENU_M3UEDITOR       
+END
+
+MENU ID_MENU_M3UPLAYER
+BEGIN
+        MENUITEM "~Play this list", ID_MENU_M3UPLAYER       
+END
+
+
+STRINGTABLE 
+BEGIN
+ID_WAVEINFOPAGENAME "~Audio details"
+ID_ID3TAGSPAGENAME  "~ID3 Tags"
+ID_TRACKNAMEPAGENAME "~Track meta data"
+IDSTR_TRACKNAME      "Trackname"
+
+IDSTR_PLAYTIME      "Play time"
+IDSTR_SAMPLERATE    "Sample rate"
+IDSTR_CHANNELS      "Channels"
+IDSTR_BPS           "Bits per sample"
+
+;IDSTR_BITRATE       "Bitrate"
+;IDSTR_VBR           "VBR"
+
+IDSTR_TITLE         "Title"
+IDSTR_ARTIST        "Artist"
+IDSTR_ALBUM         "Album"
+IDSTR_YEAR          "Year"
+IDSTR_COMMENT       "Comment"
+IDSTR_GENRE         "Genre"
+
+IDSTR_HELPLIBRARY      "MMPARTS.HLP"
+IDSTR_CWMMDATAFILETITLE "MMData file"
+;Titles of audio classes
+IDSTR_CWAUDIOTITLE   "Digital Audio"
+IDSTR_AIFTITLE       "AIFAudio.AIF"
+IDSTR_AUTITLE        "AUAudio.AU"
+IDSTR__AUTITLE       "_AUAudio._AU"
+IDSTR_IFFTITLE       "IFFAudio.IFF"
+IDSTR_SNDFTITLE      "SNDAudio.SND"
+IDSTR_VOCTITLE       "VOCAudio.VOC"
+IDSTR_WAVTITLE       "WAVAudio.WAV"
+IDSTR_OGGTITLE       "OGGAudio.OGG"
+IDSTR_MP3TITLE       "MP3Audio.MP3"
+IDSTR_MIDITITLE       "MIDI.MID"
+IDSTR_FLACTITLE       "FLACAudio.FLA"
+
+
+IDSTR_LIGHTTABLETITLE "Light table"
+
+IDSTR_ICONSIZEMENU    "Icon ~size"
+;Used as an information when starting and audio file from the WPS
+IDSTR_STARTINGTRACK      "Starting track..."
+IDSTR_AUDIOSCANNING     "Scanning audio file..."
+IDSTR_AUDIOSTREAMTITLE  "Audio stream"
+IDSTR_STREAMURLPAGENAME "~URL"
+IDSTR_CDTRACKTITLE      "CD track"
+IDSTR_M3UTITLE          "M3U playlist"
+;Titles used when starting player and editor applications
+IDSTR_AUDPLAYERTITLE       "Audio player"
+IDSTR_AUDEDITORTITLE       "Audio editor"
+IDSTR_M3UEDITORTITLE       "Playlist editor"
+IDSTR_TRACKPAUSED          " (paused)"
+;Used for window list
+IDSTR_VOLUMETITLE       "Volume"
+
+END
Index: /tags/CWMM-0.3.0_GA/classes/res/en/cwimage_en.rc
===================================================================
--- /tags/CWMM-0.3.0_GA/classes/res/en/cwimage_en.rc	(revision 213)
+++ /tags/CWMM-0.3.0_GA/classes/res/en/cwimage_en.rc	(revision 213)
@@ -0,0 +1,48 @@
+#ifndef OS2_INCLUDED
+   #include <os2.h>
+#endif
+
+
+MENU ID_MENU_IMGEDITOR
+BEGIN
+        MENUITEM "Picture ~editor", ID_MENU_IMGEDITOR       
+END
+
+
+STRINGTABLE 
+BEGIN
+IDSTR_MENU_CONVERT "~Convert to"
+
+IDSTR_AVCTITLE      "AVCImage._IM"
+IDSTR_DIBTITLE      "DIBImage.DIB"
+IDSTR_GIFTITLE      "GIFImage.GIF"
+IDSTR_JPGTITLE      "JPGImage.JPG"
+IDSTR_PCDTITLE      "PCDImage.PCD"
+IDSTR_PCXTITLE      "PCXImage.PCX"
+IDSTR_TGATITLE      "TargaImage.TGA"
+IDSTR_TIFTITLE      "TIFImage.TIF"
+IDSTR_PNGTITLE      "PNGImage.PNG"
+IDSTR_MMOTIONTITLE  "VIDImage.VID"
+IDSTR_CWIMAGETITLE  "Digital image"
+
+IDSTR_IMAGEINFOPAGENAME "~Image details"
+IDSTR_SPRINTFPIXEL	"%d Pixels"
+IDSTR_SPRINTFBIT       "%d Bit"
+;Bitmpap load errors
+IDSTR_NOIMGIOPROCERROR   "No input/output procedure found for this image."
+IDSTR_OPENFILEERRORTITLE "File error"
+IDSTR_OPENFILEERROR      "Can't open the file."
+IDSTR_NOMEMERROR         "No memory available."
+IDSTR_IMGIOPROCCRASH     "Internal error during opening of the image. The desktop MUST be restarted or the system may get instable! All running applications will remain open."
+
+IDSTR_IMAGEDETAIL_WIDTH   "Width"
+IDSTR_IMAGEDETAIL_HEIGHT  "Height"
+IDSTR_IMAGEDETAIL_DEPTH   "Depth"
+IDSTR_IMAGEDETAIL_FORMAT  "Format"
+
+;Titles used when starting player and editor applications
+IDSTR_IMGEDITORTITLE       "Image viewer"
+IDSTR_MENU_IMAGEINFO        "Image information: %d x %d x %d"
+
+;IDSTR_HELPLIBRARY   "MMPARTS.HLP"
+END
Index: /tags/CWMM-0.3.0_GA/classes/res/en/cwvideo_en.rc
===================================================================
--- /tags/CWMM-0.3.0_GA/classes/res/en/cwvideo_en.rc	(revision 213)
+++ /tags/CWMM-0.3.0_GA/classes/res/en/cwvideo_en.rc	(revision 213)
@@ -0,0 +1,13 @@
+
+STRINGTABLE 
+BEGIN
+;Titles of video classes
+IDSTR_CWVIDEOTITLE       "Digital video"
+IDSTR_MPGTITLE       	 "MPGVideo.MPG"
+IDSTR_MOVTITLE       	 "MOVVideo.MOV"
+IDSTR_FLITITLE       	 "FLIVideo.FLI"
+IDSTR_AVITITLE       	 "AVIVideo.AVI"
+IDSTR_VIDPLAYERTITLE       "Video Player"
+
+END
+
Index: /tags/CWMM-0.3.0_GA/classes/res/en/def.tpl
===================================================================
--- /tags/CWMM-0.3.0_GA/classes/res/en/def.tpl	(revision 213)
+++ /tags/CWMM-0.3.0_GA/classes/res/en/def.tpl	(revision 213)
@@ -0,0 +1,26 @@
+# Note: lines starting with '#' are comments.
+
+[DESCRIPTION]
+EN MM Resource-DLL
+
+[COPYRIGHT]
+(c) C. Wohlgemuth 2001-2005 Netlabs CWMM Team 2023
+
+[AUTHOR]
+Netlabs CWMM Team
+
+[NAME]
+# This is the NAME xxx WINDOWAPI|etc line in the def file.
+# Important: it specifies the internal name of the program. Don't leave out!
+LIBRARY MMRES_EN INITINSTANCE TERMINSTANCE
+
+[BUILDMACHINE]
+Zobopeep
+
+[OTHER]
+# Add all the lines here you want to have at the end of the generated DEF file
+PROTMODE
+CODE LOADONCALL DISCARDABLE
+DATA MULTIPLE NONSHARED
+EXPORTS
+        queryLanguage
Index: /tags/CWMM-0.3.0_GA/classes/res/en/imageconv_en.dlg
===================================================================
--- /tags/CWMM-0.3.0_GA/classes/res/en/imageconv_en.dlg	(revision 213)
+++ /tags/CWMM-0.3.0_GA/classes/res/en/imageconv_en.dlg	(revision 213)
@@ -0,0 +1,28 @@
+#ifndef OS2_INCLUDED
+   #include <os2.h>
+#endif
+
+DLGTEMPLATE IDDLG_IMGCONVERT LOADONCALL MOVEABLE DISCARDABLE
+BEGIN
+    DIALOG  "Convert digital image", IDDLG_IMGCONVERT, 68, 78, 207, 191, 
+            WS_VISIBLE, FCF_SYSMENU | FCF_TITLEBAR
+    BEGIN
+        GROUPBOX        "", IDGB_IMGCONVERT, 2, 19, 203, 172
+        LTEXT           "Name:", IDST_IMGCONVERTNAMELABEL, 7, 173, 32, 8
+        LTEXT           "", IDST_IMGCONVERTNAME, 44, 173, 156, 8
+        CONTROL         "", IDSR_BMP, 12, 100, 185, 69, WC_STATIC, 
+                        SS_FGNDRECT | WS_GROUP | WS_VISIBLE
+        LTEXT           "Convert to:", IDST_IMGCONVERTTO, 7, 88, 53, 8
+        CONTROL         "", IDDD_IMGIOPROC, 6, 6, 196, 78, WC_COMBOBOX, 
+                        CBS_DROPDOWNLIST | LS_HORZSCROLL | WS_GROUP | 
+                        WS_TABSTOP | WS_VISIBLE
+        LTEXT           "Target name:", 2419, 7, 57, 64, 8
+        ENTRYFIELD      "", IDEF_IMGCONVERTTARGETNAME, 9, 45, 139, 8, ES_MARGIN
+        PUSHBUTTON      "~Browse...", IDPB_IMGCONVERTBROWSE, 153, 42, 47, 14
+        CONTROL         "", IDBAR_IMGCONVERTPROGRESS, 6, 24, 194, 13, 
+                        "CW_PERCENTBAR", 5 | WS_GROUP | WS_VISIBLE
+        DEFPUSHBUTTON   "~Convert", IDPB_IMGCONVERTOK, 20, 2, 47, 14
+        PUSHBUTTON      "~Abort", IDPB_IMGCONVERTABORT, 71, 2, 40, 14
+        PUSHBUTTON      "C~lose", IDPB_IMGCONVERTCLOSE, 135, 2, 40, 14
+    END
+END
Index: /tags/CWMM-0.3.0_GA/classes/res/en/imageconv_en.rc
===================================================================
--- /tags/CWMM-0.3.0_GA/classes/res/en/imageconv_en.rc	(revision 213)
+++ /tags/CWMM-0.3.0_GA/classes/res/en/imageconv_en.rc	(revision 213)
@@ -0,0 +1,10 @@
+#ifndef OS2_INCLUDED
+   #include <os2.h>
+#endif
+
+
+STRINGTABLE
+BEGIN
+IDSTR_IMAGEBROWSETITLE   "Image file name"
+END
+
Index: /tags/CWMM-0.3.0_GA/classes/res/en/makefile
===================================================================
--- /tags/CWMM-0.3.0_GA/classes/res/en/makefile	(revision 213)
+++ /tags/CWMM-0.3.0_GA/classes/res/en/makefile	(revision 213)
@@ -0,0 +1,48 @@
+# Makefile for CWMM resource dll
+
+include ../../../make.inc
+include ../../../build.inc
+
+LANGUAGE	=	_en
+
+CC           = icc
+CPPFLAGS     = /Ge- /Gm+ /G4 /Gl  /O+ /Oc+ /Ol- /Q+ $(VACDEBUG)
+INC	=	../../inc
+DEFS         =
+OBJDIR	=	../dll
+
+OBJECTS	= 	$(INC)\mmres.h mmres$(LANGUAGE).rc \
+			audioplayer$(LANGUAGE).dlg audioplayer$(LANGUAGE).rc \
+			audioconv$(LANGUAGE).dlg audioconv$(LANGUAGE).rc \
+			volume$(LANGUAGE).rc volume$(LANGUAGE).dlg \
+			imageconv$(LANGUAGE).dlg imageconv$(LANGUAGE).rc \
+			cwaudio$(LANGUAGE).rc cwaudio$(LANGUAGE).dlg \
+			cwimage$(LANGUAGE).rc cwvideo$(LANGUAGE).rc \
+			mmfind$(LANGUAGE).dlg mmfind$(LANGUAGE).rc
+
+
+all:	$(OBJDIR)/mmres$(LANGUAGE).dll
+
+$(OBJDIR)/mmres$(LANGUAGE).dll:	mmres$(LANGUAGE).c $(OBJECTS) 
+		cmd /C $(TOOLDIR)/create_def.cmd mmres$(LANGUAGE).def
+		icc $(CPPFLAGS) -I$(INC) /Fe$(OBJDIR)\$@ $< mmres$(LANGUAGE).def
+		rc -D $(ECS) -i $(INC) mmres$(LANGUAGE).rc $(OBJDIR)/mmres$(LANGUAGE).dll
+		rc -r -D $(ECS) -i $(INC) mmres$(LANGUAGE).rc $(OBJDIR)/mmres$(LANGUAGE).res
+
+
+restest:	
+	echo  $(deftext)> test.def
+
+                		
+clean:
+	-rm $(OBJDIR)/*.obj
+	-rm $(OBJDIR)/*.dll
+	-rm $(OBJDIR)/*.res
+	-rm *.*~
+	-rm *.flc
+	-rm *.RES
+	-rm *.obj
+	-rm *.def
+
+
+	
Index: /tags/CWMM-0.3.0_GA/classes/res/en/mmfind_en.dlg
===================================================================
--- /tags/CWMM-0.3.0_GA/classes/res/en/mmfind_en.dlg	(revision 213)
+++ /tags/CWMM-0.3.0_GA/classes/res/en/mmfind_en.dlg	(revision 213)
@@ -0,0 +1,55 @@
+#ifndef OS2_INCLUDED
+   #include <os2.h>
+#endif
+
+DLGTEMPLATE IDDLG_MMFIND LOADONCALL MOVEABLE DISCARDABLE
+BEGIN
+    DIALOG  "Find Multimedia File", IDDLG_MMFIND, 12, 23, 338, 133, WS_VISIBLE | WS_SYNCPAINT, 
+            FCF_SYSMENU | FCF_TITLEBAR
+            PRESPARAMS PP_FONTNAMESIZE, "9.WarpSans"
+    BEGIN
+        LTEXT           "Open filename", 257, 4, 120, 51, 9, DT_VCENTER | 
+                        NOT WS_GROUP
+        ENTRYFIELD      "*", 258, 55, 120, 239, 7, ES_MARGIN | WS_GROUP
+        LTEXT           "Drive", 259, 4, 108, 51, 9, DT_VCENTER | NOT 
+                        WS_GROUP
+        CONTROL         "H:  [SOURCES]", 260, 54, 18, 87, 99, WC_COMBOBOX, 
+                        CBS_DROPDOWNLIST | WS_TABSTOP | WS_VISIBLE
+        LTEXT           "Restrict files to", 261, 174, 4, 46, 9, DT_VCENTER | 
+                        NOT WS_GROUP | NOT WS_VISIBLE
+        CONTROL         "<All Files>", 262, 209, 4, 29, 8, WC_COMBOBOX, 
+                        CBS_DROPDOWNLIST | WS_TABSTOP
+        LTEXT           "Directory", 263, 4, 97, 35, 7, NOT WS_GROUP
+        LTEXT           "", 270, 42, 98, 60, 6, NOT WS_GROUP | NOT 
+                        WS_VISIBLE
+        LTEXT           "File", 265, 131, 97, 17, 7, NOT WS_GROUP
+        AUTOCHECKBOX    "Read-Only", 269, 171, 97, 42, 8, NOT WS_TABSTOP | 
+                        NOT WS_VISIBLE
+        LISTBOX         264, 4, 17, 116, 76, LS_OWNERDRAW | LS_HORZSCROLL
+        LISTBOX         266, 125, 17, 116, 76, LS_HORZSCROLL
+        RTEXT           "Type of file", IDST_TYPE, 146, 108, 58, 9, DT_VCENTER
+        CONTROL         "", IDCB_TYPEOFFILE, 208, 18, 87, 99, WC_COMBOBOX, 
+                        CBS_DROPDOWNLIST | WS_GROUP | WS_TABSTOP | 
+                        WS_VISIBLE
+        GROUPBOX        "Preview", IDGB_PREVIEW, 245, 16, 89, 80, NOT WS_VISIBLE
+        CONTROL         "", IDSR_IMGPREVIEW, 249, 20, 82, 68, WC_STATIC, SS_FGNDRECT | 
+                        WS_GROUP
+        CTEXT           "No preview available", IDST_NOPREVIEWAVAILABLE, 251, 42, 78, 33, 
+                        DT_WORDBREAK | NOT WS_VISIBLE
+        LTEXT           "", IDST_AUDIOINFO, 253, 41, 75, 42, DT_WORDBREAK | NOT 
+                        WS_VISIBLE
+        GROUPBOX        "Audio info", IDGB_AUDIOINFO, 245, 17, 89, 79, NOT WS_VISIBLE
+        PUSHBUTTON      "Stop", IDPB_MMFINDSTOP, 267, 19, 21, 10, 
+                        BS_NOPOINTERFOCUS | NOT WS_TABSTOP
+        PUSHBUTTON      "Play", IDPB_MMFINDPLAY, 291, 19, 21, 10, 
+                        BS_NOPOINTERFOCUS | NOT WS_TABSTOP
+        DEFPUSHBUTTON   "~OK", DID_OK, 3, 2, 40, 12
+        PUSHBUTTON      "~New...", IDPB_NEWFILE, 46, 2, 40, 12
+        PUSHBUTTON      "Apply", 268, 293, 3, 40, 12, NOT WS_TABSTOP | NOT 
+                        WS_VISIBLE
+        PUSHBUTTON      "~Cancel", DID_CANCEL, 95, 2, 40, 12, NOT WS_TABSTOP
+        PUSHBUTTON      "Help", 267, 243, 2, 40, 12, BS_NOPOINTERFOCUS | NOT 
+                        WS_TABSTOP | NOT WS_VISIBLE
+        LISTBOX         3, 0, 0, 2, 1, NOT WS_TABSTOP | NOT WS_VISIBLE
+    END
+END
Index: /tags/CWMM-0.3.0_GA/classes/res/en/mmfind_en.rc
===================================================================
--- /tags/CWMM-0.3.0_GA/classes/res/en/mmfind_en.rc	(revision 213)
+++ /tags/CWMM-0.3.0_GA/classes/res/en/mmfind_en.rc	(revision 213)
@@ -0,0 +1,13 @@
+#ifndef OS2_INCLUDED
+   #include <os2.h>
+#endif
+
+STRINGTABLE
+BEGIN
+IDSTR_TYPEAUDIO       "Audio"
+IDSTR_TYPEIMAGE       "Image"
+IDSTR_TYPEVIDEO       "Video"
+IDSTR_AUDIOINFOTEXT   "Play time:\t%02d:%02d\x0a\x0aSamplerate:\t%d\x0a\x0aBits per sample:\t%d\x0a\x0aChannels:\t%d"
+IDSTR_NOMMTEMPLATEFLDRTITLE "Error during file creation"
+IDSTR_NOMMTEMPLATEFLDR "Multimedia template folder can't be found. It may have lost the object ID <MMPM2_MMTEMPLATEFOLDER>."
+END
Index: /tags/CWMM-0.3.0_GA/classes/res/en/mmres_en.c
===================================================================
--- /tags/CWMM-0.3.0_GA/classes/res/en/mmres_en.c	(revision 213)
+++ /tags/CWMM-0.3.0_GA/classes/res/en/mmres_en.c	(revision 213)
@@ -0,0 +1,26 @@
+/*
+ * This file is (C) Chris Wohlgemuth 2003
+ */
+/*
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; see the file COPYING.  If not, write to
+ * the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+
+#include <os2.h>
+
+PSZ queryLanguage()
+{
+  return "English";
+}
+
Index: /tags/CWMM-0.3.0_GA/classes/res/en/mmres_en.rc
===================================================================
--- /tags/CWMM-0.3.0_GA/classes/res/en/mmres_en.rc	(revision 213)
+++ /tags/CWMM-0.3.0_GA/classes/res/en/mmres_en.rc	(revision 213)
@@ -0,0 +1,37 @@
+#define  INCL_GRAPHICBUTTON   /* need this for the graphic buttons control */
+#define  INCL_BITMAP
+
+#ifndef OS2_INCLUDED
+   #include <os2.h>
+#endif
+#include <sw.h>
+
+#include "mmres.h"
+;#include "version.h"
+;#include "build.h"
+
+
+;Dialog Resources for volume.exe
+rcinclude "volume_en.rc"
+rcinclude "volume_en.dlg"
+
+rcinclude "audioconv_en.rc"
+rcinclude "audioconv_en.dlg"
+
+rcinclude "imageconv_en.rc"
+rcinclude "imageconv_en.dlg"
+
+rcinclude "audioplayer_en.rc"
+rcinclude "audioplayer_en.dlg"
+
+rcinclude "classvolume_en.dlg"
+
+rcinclude "cwaudio_en.rc"
+rcinclude "cwaudio_en.dlg"
+
+rcinclude "cwimage_en.rc"
+rcinclude "cwvideo_en.rc"
+
+rcinclude "mmfind_en.rc"
+rcinclude "mmfind_en.dlg"
+
Index: /tags/CWMM-0.3.0_GA/classes/res/en/volume_en.dlg
===================================================================
--- /tags/CWMM-0.3.0_GA/classes/res/en/volume_en.dlg	(revision 213)
+++ /tags/CWMM-0.3.0_GA/classes/res/en/volume_en.dlg	(revision 213)
@@ -0,0 +1,21 @@
+#ifndef OS2_INCLUDED
+   #include <os2.h>
+#endif
+#define INCL_GRAPHICBUTTON
+#include <sw.h>
+
+
+DLGTEMPLATE IDDLG_VOLUME LOADONCALL MOVEABLE DISCARDABLE
+BEGIN
+    DIALOG  "Volume", IDDLG_VOLUME, 73, 148, 112, 56,  
+             WS_VISIBLE, FCF_SYSMENU | FCF_TITLEBAR |  FCF_TASKLIST |
+            FCF_MINBUTTON
+    BEGIN
+        CONTROL         "~Volume", IDCS_VOLUME, 3, 3, 63, 44, WC_CIRCULARSLIDER, 
+                        WS_GROUP | WS_VISIBLE | WS_TABSTOP
+        CONTROL         "~Mute", IDPB_MUTE ,  65, 17, 40, 14, WC_GRAPHICBUTTON,
+			 WS_VISIBLE | GBS_AUTOTWOSTATE | WS_TABSTOP
+        GROUPBOX        "", IDGB_VOLUME, 1, 2, 109, 53
+    END
+END
+
Index: /tags/CWMM-0.3.0_GA/classes/res/en/volume_en.rc
===================================================================
--- /tags/CWMM-0.3.0_GA/classes/res/en/volume_en.rc	(revision 213)
+++ /tags/CWMM-0.3.0_GA/classes/res/en/volume_en.rc	(revision 213)
@@ -0,0 +1,11 @@
+#ifndef OS2_INCLUDED
+   #include <os2.h>
+#endif
+
+MENU    IDM_POPUP
+BEGIN
+    MENUITEM    "~Hide titlebar",    IDM_ITEMTITLEBAR
+    MENUITEM    "",    0, MIS_SEPARATOR
+    MENUITEM    "E~xit",    IDM_ITEMEXIT
+END
+
Index: /tags/CWMM-0.3.0_GA/classes/res/es/audioconv_es.dlg
===================================================================
--- /tags/CWMM-0.3.0_GA/classes/res/es/audioconv_es.dlg	(revision 213)
+++ /tags/CWMM-0.3.0_GA/classes/res/es/audioconv_es.dlg	(revision 213)
@@ -0,0 +1,37 @@
+#ifndef OS2_INCLUDED
+   #include <os2.h>
+#endif
+
+DLGTEMPLATE IDDLG_CONVERT LOADONCALL MOVEABLE DISCARDABLE
+BEGIN
+    DIALOG  "Convertir archivo de audio", IDDLG_CONVERT, 115, 36, 207, 174, WS_VISIBLE, 
+            FCF_SYSMENU | FCF_TITLEBAR
+    BEGIN
+        GROUPBOX        "Origen", IDGB_CONVERT, 3, 105, 203, 69
+        LTEXT           "Nombre:", IDST_CONVERTNAMELABEL, 7, 156, 32, 8
+        RTEXT           "", IDST_CONVERTNAME, 45, 156, 156, 8
+        LTEXT           "Frecuencia de muestreo: ? Hz", IDST_CONVERTSAMPLERATE, 7, 131, 91, 8
+        LTEXT           "Canales: ?", IDST_CONVERTCHANNELS, 7, 120, 91, 8
+        LTEXT           "Bits de audio: ?", IDST_CONVERTCDBITS, 103, 142, 98, 8
+        LTEXT           "(CD: 44100 Hz)", IDST_CONVERTCDSAMPLELABEL, 103, 131, 
+                        98, 8
+        LTEXT           "(CD: 2 canales)", IDST_CONVERTCDCHANNELSLABEL, 103, 
+                        120, 98, 8
+        LTEXT           "Duraci¢n: ?", IDST_CONVERTPLAYTIME, 7, 109, 161, 8
+        GROUPBOX        "Destino", IDGB_CONVERT2, 3, 19, 203, 85
+        LTEXT           "Convertir a:", 317, 7, 86, 86, 8
+        CONTROL         "", IDDD_IOPROC, 7, 28, 195, 54, WC_COMBOBOX, 
+                        CBS_DROPDOWNLIST | WS_GROUP | WS_TABSTOP | 
+                        WS_VISIBLE
+
+        LTEXT           "Nombre de destino:", 2419, 7, 57, 64, 8
+        ENTRYFIELD      "", IDEF_CONVERTTARGETNAME, 9, 45, 139, 8, ES_MARGIN
+
+        PUSHBUTTON      "~Buscar...", IDPB_CONVERTBROWSE, 153, 42, 47, 14
+        CONTROL         "", IDBAR_CONVERTPROGRESS, 6, 24, 194, 13, 
+                        "CW_PERCENTBAR", 5 | WS_GROUP | WS_VISIBLE
+        DEFPUSHBUTTON   "~Convertir", IDPB_CONVERTOK, 20, 2, 47, 14
+        PUSHBUTTON      "~Abortar", IDPB_CONVERTABORT, 71, 2, 40, 14
+        PUSHBUTTON      "C~errar", IDPB_CONVERTCLOSE, 135, 2, 40, 14
+    END
+END
Index: /tags/CWMM-0.3.0_GA/classes/res/es/audioconv_es.rc
===================================================================
--- /tags/CWMM-0.3.0_GA/classes/res/es/audioconv_es.rc	(revision 213)
+++ /tags/CWMM-0.3.0_GA/classes/res/es/audioconv_es.rc	(revision 213)
@@ -0,0 +1,18 @@
+#ifndef OS2_INCLUDED
+   #include <os2.h>
+#endif
+
+
+STRINGTABLE
+BEGIN
+
+IDSTR_CONVERTCHANNELS    "Canales: %d"
+IDSTR_CONVERTSAMPLERATE  "Frecuencia de muestreo: %d Hz"
+IDSTR_CONVERTPLAYTIME    "Duraci¢n: %d:%02d"
+IDSTR_CONVERTDIALOGERROR "­Imposible cargar la plantilla de di logo! Por favor, compruebe la instalaci¢n."
+IDSTR_CONVERTNOSPACETITLE   "Convertir a ®wave¯"
+IDSTR_CONVERTNOSPACETEXT   "No hay suficiente espacio para el archivo decodificado. Elija otra ubicaci¢n con al menos %d MB de espacio libre."
+IDSTR_INSTALLERRORTITLE  "Problema con la instalaci¢n"
+IDSTR_AUDIOBROWSETITLE   "Nombre del archivo de audio"
+
+END
Index: /tags/CWMM-0.3.0_GA/classes/res/es/audioplayer_es.dlg
===================================================================
--- /tags/CWMM-0.3.0_GA/classes/res/es/audioplayer_es.dlg	(revision 213)
+++ /tags/CWMM-0.3.0_GA/classes/res/es/audioplayer_es.dlg	(revision 213)
@@ -0,0 +1,27 @@
+#ifndef OS2_INCLUDED
+   #include <os2.h>
+#endif
+
+DLGTEMPLATE IDDLG_MMPLAYER LOADONCALL MOVEABLE DISCARDABLE
+BEGIN
+    DIALOG  "Reproductor de audio", IDDLG_MMPLAYER, 68, 78, 207, 124, 
+            WS_VISIBLE, FCF_SYSMENU | FCF_TITLEBAR
+    BEGIN
+        CONTROL         "", ID_CLIENT, 18, 0, 56, 67, WC_STATIC, SS_FGNDRECT | 
+                        WS_GROUP | WS_VISIBLE 
+        CONTROL         "~Detener", IDPB_MMPLAYERSTOP, 40, 25, 22, 14, WC_BUTTON, 
+                        BS_USERBUTTON | WS_VISIBLE| WS_TABSTOP
+        CONTROL         "~Pausa", IDPB_MMPLAYERPAUSE, 61, 25, 20, 14, WC_BUTTON, 
+                        BS_USERBUTTON | WS_VISIBLE
+        CONTROL         "~Reproducir", IDPB_MMPLAYERPLAY, 79, 25, 20, 14, WC_BUTTON, 
+                        BS_USERBUTTON | WS_VISIBLE
+        CTEXT           "0:00", IDST_MMPLAYERPLAYTIME, 123, 14, 134, 13, DT_VCENTER
+                        PRESPARAMS PP_FONTNAMESIZE, "10.Helv"
+;        CONTROL         "VolumeArm", IDSL_MMPLAYERVOLUMEARM, 209, 5, 14, 14, 
+;                        WC_BUTTON, BS_USERBUTTON | WS_TABSTOP|BS_USERBUTTON
+;        PUSHBUTTON      "Volume", IDSL_MMPLAYERVOLUME, 19, 4, 69, 14, 
+;                        BS_NOPOINTERFOCUS | NOT WS_TABSTOP | NOT WS_VISIBLE |BS_USERBUTTON
+
+    END
+END
+
Index: /tags/CWMM-0.3.0_GA/classes/res/es/audioplayer_es.rc
===================================================================
--- /tags/CWMM-0.3.0_GA/classes/res/es/audioplayer_es.rc	(revision 213)
+++ /tags/CWMM-0.3.0_GA/classes/res/es/audioplayer_es.rc	(revision 213)
@@ -0,0 +1,16 @@
+#ifndef OS2_INCLUDED
+   #include <os2.h>
+#endif
+
+MENU  ID_MENUTIMECONTEXT
+BEGIN
+	MENUITEM "Tiempo ~transcurrido" ,     ID_MENUITEMELAPSED
+	MENUITEM "Tiempo ~restante" ,         ID_MENUITEMREMAINING
+	MENUITEM "Informaci¢n de la ~pista" , ID_MENUITEMID3
+END
+
+STRINGTABLE
+BEGIN
+IDSTR_MASTERVOLUMEITEM "~Volumen maestro"
+END
+
Index: /tags/CWMM-0.3.0_GA/classes/res/es/classvolume_es.dlg
===================================================================
--- /tags/CWMM-0.3.0_GA/classes/res/es/classvolume_es.dlg	(revision 213)
+++ /tags/CWMM-0.3.0_GA/classes/res/es/classvolume_es.dlg	(revision 213)
@@ -0,0 +1,15 @@
+#ifndef OS2_INCLUDED
+   #include <os2.h>
+#endif
+
+DLGTEMPLATE IDDLG_CLASSVOLUME LOADONCALL MOVEABLE DISCARDABLE
+BEGIN
+    DIALOG  "Volumen", IDDLG_CLASSVOLUME, 68, 78, 207, 124, 
+            WS_VISIBLE, FCF_SYSMENU | FCF_TITLEBAR
+    BEGIN
+        CONTROL         "", ID_CLASSVOLCLIENT, 18, 0, 56, 67, WC_STATIC, SS_FGNDRECT | 
+                        WS_GROUP | WS_VISIBLE 
+
+    END
+END
+
Index: /tags/CWMM-0.3.0_GA/classes/res/es/cwaudio_es.dlg
===================================================================
--- /tags/CWMM-0.3.0_GA/classes/res/es/cwaudio_es.dlg	(revision 213)
+++ /tags/CWMM-0.3.0_GA/classes/res/es/cwaudio_es.dlg	(revision 213)
@@ -0,0 +1,76 @@
+#ifndef OS2_INCLUDED
+   #include <os2.h>
+#endif
+
+DLGTEMPLATE IDDLG_ID3TAGS LOADONCALL MOVEABLE DISCARDABLE
+BEGIN
+    DIALOG  "", IDDLG_ID3TAGS, 92, 13, 209, 120, NOT FS_DLGBORDER | 
+            WS_VISIBLE
+    BEGIN
+        PUSHBUTTON      "~Guardar", IDPB_ID3SAVE, 44, 1, 40, 14
+        PUSHBUTTON      "~Cancelar", IDPB_CANCEL, 87, 1, 40, 14
+        PUSHBUTTON      "A~yuda", IDPB_ID3HELP, 130, 1, 40, 14, BS_HELP
+        GROUPBOX        "", IDGB_ID3TAGS, 6, 17, 202, 97
+        LTEXT           "Nombre:", 210, 9, 95, 57, 8
+        ENTRYFIELD      "", IDEF_ID3NAME, 73, 95, 127, 8, ES_MARGIN
+        LTEXT           "Artista:", 211, 9, 82, 57, 8
+        ENTRYFIELD      "", IDEF_ID3ARTIST, 73, 82, 127, 8, ES_MARGIN
+        LTEXT           "µlbum:", 212, 9, 69, 57, 8
+        ENTRYFIELD      "", IDEF_ID3ALBUM, 73, 69, 127, 8, ES_MARGIN
+        LTEXT           "Comentario:", 213, 9, 56, 57, 8
+        ENTRYFIELD      "", IDEF_ID3COMMENT, 73, 56, 127, 8, ES_MARGIN
+        LTEXT           "A€o:", 214, 9, 44, 57, 8
+        ENTRYFIELD      "", IDEF_ID3YEAR, 73, 43, 40, 8, ES_MARGIN
+        LTEXT           "Gnero:", 215, 9, 26, 57, 8
+        CONTROL         "", IDDD_ID3GENRE, 71, 5, 99, 31, WC_COMBOBOX, 
+                        CBS_DROPDOWN | WS_GROUP | WS_TABSTOP | WS_VISIBLE
+    END
+END
+
+DLGTEMPLATE IDDLG_WAVEINFOPAGE LOADONCALL MOVEABLE DISCARDABLE
+BEGIN
+    DIALOG  "", IDDLG_WAVEINFOPAGE, 91, 31, 169, 109, NOT FS_DLGBORDER | 
+            WS_VISIBLE | NOT WS_SAVEBITS
+    BEGIN
+        GROUPBOX        "", IDGB_WAVEINFO, 6, 4, 154, 67, NOT 
+                        WS_GROUP
+        LTEXT           "Frecuencia de muestreo:", IDST_SAMPLERATELABEL, 17, 35, 76, 8
+        LTEXT           "Bits de audio:", IDST_BPSLABEL, 17, 23, 76, 8
+        LTEXT           "Duraci¢n:", IDST_PLAYTIMELABEL, 17, 47, 76, 8
+        LTEXT           "Canales:", IDST_CHANNELSLABEL, 17, 12, 76, 8
+        LTEXT           "??:??", IDST_PLAYTIME, 108, 47, 39, 8
+        LTEXT           "??", IDST_SAMPLERATE, 108, 35, 39, 8
+        LTEXT           "??", IDST_BPS, 108, 23, 39, 8
+        LTEXT           "??", IDST_CHANNELS, 108, 12, 39, 8
+    END
+END
+
+DLGTEMPLATE IDDLG_IMAGEINFOPAGE LOADONCALL MOVEABLE DISCARDABLE
+BEGIN
+    DIALOG  "", IDDLG_IMAGEINFOPAGE, 91, 31, 169, 109, NOT FS_DLGBORDER | 
+            WS_VISIBLE
+    BEGIN
+        GROUPBOX        "", IDGB_IMAGEINFO, 6, 4, 154, 78, 
+                        NOT WS_GROUP
+        LTEXT           "Anchura:", IDST_IMAGEWIDTHLABEL, 17, 35, 76, 8
+        LTEXT           "Altura:", IDST_IMAGEHEIGHTLABEL, 17, 23, 76, 8
+        LTEXT           "Profundidad:", IDST_COLORDEPTHLABEL, 17, 12, 76, 8
+        LTEXT           "??", IDST_IMAGEWIDTH, 108, 35, 39, 8
+        LTEXT           "??", IDST_IMAGEHEIGHT, 108, 23, 39, 8
+        LTEXT           "??", IDST_COLORDEPTH, 108, 12, 39, 8
+        LTEXT           "", IDST_IMAGEFORMAT, 17, 48, 135, 21, DT_WORDBREAK
+    END
+END
+
+DLGTEMPLATE IDDLG_STREAMURLPAGE LOADONCALL MOVEABLE DISCARDABLE
+BEGIN
+    DIALOG  "", IDDLG_STREAMURLPAGE, 91, 31, 169, 109, NOT FS_DLGBORDER | 
+            WS_VISIBLE
+    BEGIN
+        PUSHBUTTON      "A~yuda", IDPB_STREAMHELP, 130, 1, 40, 14, BS_HELP
+        GROUPBOX        "URL", IDGB_STREAMURL, 6, 4, 154, 61, NOT WS_GROUP
+        ENTRYFIELD      "", IDEF_URL, 13, 23, 140, 8, ES_MARGIN
+        LTEXT           "URL del servidor emisor:", IDST_URLTEXT, 12, 
+                        37, 143, 8
+    END
+END
Index: /tags/CWMM-0.3.0_GA/classes/res/es/cwaudio_es.rc
===================================================================
--- /tags/CWMM-0.3.0_GA/classes/res/es/cwaudio_es.rc	(revision 213)
+++ /tags/CWMM-0.3.0_GA/classes/res/es/cwaudio_es.rc	(revision 213)
@@ -0,0 +1,128 @@
+#ifndef OS2_INCLUDED
+   #include <os2.h>
+#endif
+
+
+MENU ID_MENU_VOLUME
+BEGIN
+        MENUITEM "~Volumen",ID_MENU_VOLUME
+END
+
+MENU ID_MENU_START
+BEGIN
+        MENUITEM "~Iniciar",ID_MENU_START
+END
+
+MENU ID_MENU_STOP
+BEGIN
+        MENUITEM "~Detener", ID_MENU_STOP
+END
+
+MENU ID_MENU_PAUSE
+BEGIN
+        MENUITEM "~Pausa", ID_MENU_PAUSE
+END
+
+MENU ID_MENU_RESUME
+BEGIN
+        MENUITEM "~Reanudar", ID_MENU_RESUME
+END
+
+MENU ID_MENU_EDITOR
+BEGIN
+        MENUITEM "~Editor de audio", ID_MENU_EDITOR
+END
+
+MENU ID_MENU_PLAYER
+BEGIN
+        MENUITEM "~Reproductor", ID_MENU_PLAYER
+END
+
+MENU ID_MENU_CONVERT
+BEGIN
+	SUBMENU  "~Convertir a",ID_MENU_CONVERT
+	BEGIN
+        MENUITEM "~WAV (Audio digital RIFF WAVE)", ID_ITEM_CONVERT
+	END
+END
+
+MENU ID_MENUICONSIZE
+BEGIN
+;   MENUITEM  "" , ID_MENUICONSIZE, MIS_SEPARATOR
+   MENUITEM "Iconos normales", ID_NORMALICONSITEM
+   MENUITEM  "50  50" , ID_50X50ITEM
+   MENUITEM  "100  100" , ID_100X100ITEM
+   MENUITEM  "150  150" , ID_150X150ITEM
+   MENUITEM  "200  200" , ID_200X200ITEM
+   MENUITEM  "250  250" , ID_250X250ITEM
+END
+
+MENU ID_MENU_M3UEDITOR
+BEGIN
+        MENUITEM "~Editor de listas de reproducci¢n", ID_MENU_M3UEDITOR
+END
+
+MENU ID_MENU_M3UPLAYER
+BEGIN
+        MENUITEM "~Reproducir esta lista", ID_MENU_M3UPLAYER
+END
+
+
+STRINGTABLE
+BEGIN
+ID_WAVEINFOPAGENAME "Detalles de ~audio"
+ID_ID3TAGSPAGENAME  "Etiquetas ~ID3"
+ID_TRACKNAMEPAGENAME "~Metainformaci¢n"
+IDSTR_TRACKNAME      "Nombre de la pista"
+
+IDSTR_PLAYTIME      "Duraci¢n"
+IDSTR_SAMPLERATE    "Frecuencia de muestreo"
+IDSTR_CHANNELS      "Canales"
+IDSTR_BPS           "Bits de audio"
+
+;IDSTR_BITRATE       "Bits por segundo"
+;IDSTR_VBR           "VBR"
+
+IDSTR_TITLE         "T¡tulo"
+IDSTR_ARTIST        "Artista"
+IDSTR_ALBUM         "µlbum"
+IDSTR_YEAR          "A€o"
+IDSTR_COMMENT       "Comentario"
+IDSTR_GENRE         "Gnero"
+
+IDSTR_HELPLIBRARY      "MMPARTS.HLP"
+IDSTR_CWMMDATAFILETITLE "Archivo de datos mmedia"
+;Titles of audio classes
+IDSTR_CWAUDIOTITLE   "Audio digital"
+IDSTR_AIFTITLE       "AudioAIF.AIF"
+IDSTR_AUTITLE        "AudioAU.AU"
+IDSTR__AUTITLE       "Audio_AU._AU"
+IDSTR_IFFTITLE       "AudioIFF.IFF"
+IDSTR_SNDFTITLE      "AudioSND.SND"
+IDSTR_VOCTITLE       "AudioVOC.VOC"
+IDSTR_WAVTITLE       "AudioWAV.WAV"
+IDSTR_OGGTITLE       "AudioOGG.OGG"
+IDSTR_MP3TITLE       "AudioMP3.MP3"
+IDSTR_MIDITITLE       "MIDI.MID"
+IDSTR_FLACTITLE       "AudioFLAC.FLA"
+
+
+IDSTR_LIGHTTABLETITLE "Light table"
+
+IDSTR_ICONSIZEMENU    "~Tama€o de los iconos"
+;Used as an information when starting and audio file from the WPS
+IDSTR_STARTINGTRACK      "Iniciando pista..."
+IDSTR_AUDIOSCANNING     "Examinando archivo de audio..."
+IDSTR_AUDIOSTREAMTITLE  "Emisi¢n de audio"
+IDSTR_STREAMURLPAGENAME "~URL"
+IDSTR_CDTRACKTITLE      "Pista del CD"
+IDSTR_M3UTITLE          "Lista de reproducci¢n M3U"
+;Titles used when starting player and editor applications
+IDSTR_AUDPLAYERTITLE       "Reproductor de audio"
+IDSTR_AUDEDITORTITLE       "Editor de audio"
+IDSTR_M3UEDITORTITLE       "Editor de listas de reproducci¢n"
+IDSTR_TRACKPAUSED          " (en pausa)"
+;Used for window list
+IDSTR_VOLUMETITLE       "Volumen"
+
+END
Index: /tags/CWMM-0.3.0_GA/classes/res/es/cwimage_es.rc
===================================================================
--- /tags/CWMM-0.3.0_GA/classes/res/es/cwimage_es.rc	(revision 213)
+++ /tags/CWMM-0.3.0_GA/classes/res/es/cwimage_es.rc	(revision 213)
@@ -0,0 +1,48 @@
+#ifndef OS2_INCLUDED
+   #include <os2.h>
+#endif
+
+
+MENU ID_MENU_IMGEDITOR
+BEGIN
+        MENUITEM "~Editor de im genes", ID_MENU_IMGEDITOR
+END
+
+
+STRINGTABLE
+BEGIN
+IDSTR_MENU_CONVERT "~Convertir a"
+
+IDSTR_AVCTITLE      "ImagenAVC._IM"
+IDSTR_DIBTITLE      "ImagenDIB.DIB"
+IDSTR_GIFTITLE      "ImagenGIF.GIF"
+IDSTR_JPGTITLE      "ImagenJPG.JPG"
+IDSTR_PCDTITLE      "ImagenPCD.PCD"
+IDSTR_PCXTITLE      "ImagenPCX.PCX"
+IDSTR_TGATITLE      "ImagenTarga.TGA"
+IDSTR_TIFTITLE      "ImagenTIF.TIF"
+IDSTR_PNGTITLE      "ImagenPNG.PNG"
+IDSTR_MMOTIONTITLE  "ImagenVID.VID"
+IDSTR_CWIMAGETITLE  "Imagen digital"
+
+IDSTR_IMAGEINFOPAGENAME "Detalles de la ~imagen"
+IDSTR_SPRINTFPIXEL	"%d p¡xeles"
+IDSTR_SPRINTFBIT       "%d bit"
+;Bitmpap load errors
+IDSTR_NOIMGIOPROCERROR   "No se ha encontrado un procedimiento E/S para esta imagen."
+IDSTR_OPENFILEERRORTITLE "Error de archivo"
+IDSTR_OPENFILEERROR      "No se puede abrir el archivo."
+IDSTR_NOMEMERROR         "No hay memoria disponible."
+IDSTR_IMGIOPROCCRASH     "Error interno al abrir la imagen. ­El escritorio DEBE reiniciarse o el sistema puede volverse inestable! Seguir n abiertos todos los programas en ejecuci¢n."
+
+IDSTR_IMAGEDETAIL_WIDTH   "Anchura"
+IDSTR_IMAGEDETAIL_HEIGHT  "Altura"
+IDSTR_IMAGEDETAIL_DEPTH   "Profundidad"
+IDSTR_IMAGEDETAIL_FORMAT  "Formato"
+
+;Titles used when starting player and editor applications
+IDSTR_IMGEDITORTITLE       "Visor de im genes"
+IDSTR_MENU_IMAGEINFO        "Informaci¢n de la imagen: %d  %d  %d"
+
+;IDSTR_HELPLIBRARY   "MMPARTS.HLP"
+END
Index: /tags/CWMM-0.3.0_GA/classes/res/es/cwvideo_es.rc
===================================================================
--- /tags/CWMM-0.3.0_GA/classes/res/es/cwvideo_es.rc	(revision 213)
+++ /tags/CWMM-0.3.0_GA/classes/res/es/cwvideo_es.rc	(revision 213)
@@ -0,0 +1,13 @@
+
+STRINGTABLE
+BEGIN
+;Titles of video classes
+IDSTR_CWVIDEOTITLE       "V¡deo digital"
+IDSTR_MPGTITLE       	 "V¡deoMPG.MPG"
+IDSTR_MOVTITLE       	 "V¡deoMOV.MOV"
+IDSTR_FLITITLE       	 "V¡deoFLI.FLI"
+IDSTR_AVITITLE       	 "V¡deoAVI.AVI"
+IDSTR_VIDPLAYERTITLE       "Reproductor de v¡deo"
+
+END
+
Index: /tags/CWMM-0.3.0_GA/classes/res/es/def.tpl
===================================================================
--- /tags/CWMM-0.3.0_GA/classes/res/es/def.tpl	(revision 213)
+++ /tags/CWMM-0.3.0_GA/classes/res/es/def.tpl	(revision 213)
@@ -0,0 +1,26 @@
+# Note: lines starting with '#' are comments.
+
+[DESCRIPTION]
+ES MM Resource-DLL
+
+[COPYRIGHT]
+(c) C. Wohlgemuth 2001-2005 Netlabs CWMM Team 2023
+
+[AUTHOR]
+Netlabs CWMM Team
+
+[NAME]
+# This is the NAME xxx WINDOWAPI|etc line in the def file.
+# Important: it specifies the internal name of the program. Don't leave out!
+LIBRARY MMRES_ES INITINSTANCE TERMINSTANCE
+
+[BUILDMACHINE]
+Zobopeep
+
+[OTHER]
+# Add all the lines here you want to have at the end of the generated DEF file
+PROTMODE
+CODE LOADONCALL DISCARDABLE
+DATA MULTIPLE NONSHARED
+EXPORTS
+        queryLanguage
Index: /tags/CWMM-0.3.0_GA/classes/res/es/imageconv_es.dlg
===================================================================
--- /tags/CWMM-0.3.0_GA/classes/res/es/imageconv_es.dlg	(revision 213)
+++ /tags/CWMM-0.3.0_GA/classes/res/es/imageconv_es.dlg	(revision 213)
@@ -0,0 +1,28 @@
+#ifndef OS2_INCLUDED
+   #include <os2.h>
+#endif
+
+DLGTEMPLATE IDDLG_IMGCONVERT LOADONCALL MOVEABLE DISCARDABLE
+BEGIN
+    DIALOG  "Convertir imagen digital", IDDLG_IMGCONVERT, 68, 78, 207, 191, 
+            WS_VISIBLE, FCF_SYSMENU | FCF_TITLEBAR
+    BEGIN
+        GROUPBOX        "", IDGB_IMGCONVERT, 2, 19, 203, 172
+        LTEXT           "Nombre:", IDST_IMGCONVERTNAMELABEL, 7, 173, 32, 8
+        LTEXT           "", IDST_IMGCONVERTNAME, 44, 173, 156, 8
+        CONTROL         "", IDSR_BMP, 12, 100, 185, 69, WC_STATIC, 
+                        SS_FGNDRECT | WS_GROUP | WS_VISIBLE
+        LTEXT           "Convertir a:", IDST_IMGCONVERTTO, 7, 88, 53, 8
+        CONTROL         "", IDDD_IMGIOPROC, 6, 6, 196, 78, WC_COMBOBOX, 
+                        CBS_DROPDOWNLIST | LS_HORZSCROLL | WS_GROUP | 
+                        WS_TABSTOP | WS_VISIBLE
+        LTEXT           "Nombre destino:", 2419, 7, 57, 64, 8
+        ENTRYFIELD      "", IDEF_IMGCONVERTTARGETNAME, 9, 45, 139, 8, ES_MARGIN
+        PUSHBUTTON      "~Buscar...", IDPB_IMGCONVERTBROWSE, 153, 42, 47, 14
+        CONTROL         "", IDBAR_IMGCONVERTPROGRESS, 6, 24, 194, 13, 
+                        "CW_PERCENTBAR", 5 | WS_GROUP | WS_VISIBLE
+        DEFPUSHBUTTON   "~Convertir", IDPB_IMGCONVERTOK, 20, 2, 47, 14
+        PUSHBUTTON      "~Abortar", IDPB_IMGCONVERTABORT, 71, 2, 40, 14
+        PUSHBUTTON      "C~errar", IDPB_IMGCONVERTCLOSE, 135, 2, 40, 14
+    END
+END
Index: /tags/CWMM-0.3.0_GA/classes/res/es/imageconv_es.rc
===================================================================
--- /tags/CWMM-0.3.0_GA/classes/res/es/imageconv_es.rc	(revision 213)
+++ /tags/CWMM-0.3.0_GA/classes/res/es/imageconv_es.rc	(revision 213)
@@ -0,0 +1,10 @@
+#ifndef OS2_INCLUDED
+   #include <os2.h>
+#endif
+
+
+STRINGTABLE
+BEGIN
+IDSTR_IMAGEBROWSETITLE   "Nombre del archivo de imagen"
+END
+
Index: /tags/CWMM-0.3.0_GA/classes/res/es/makefile
===================================================================
--- /tags/CWMM-0.3.0_GA/classes/res/es/makefile	(revision 213)
+++ /tags/CWMM-0.3.0_GA/classes/res/es/makefile	(revision 213)
@@ -0,0 +1,54 @@
+# Makefile for CWMM resource dll
+
+include ../../../make.inc
+include ../../../build.inc
+
+LANGUAGE	=	_es
+
+CC           = icc
+CPPFLAGS     = /Ge- /Gm+ /G4 /Gl  /O+ /Oc+ /Ol- /Q+ $(VACDEBUG)
+INC	=	../../inc
+DEFS         =
+#TOOLDIR =      $(BUILD_ROOT)\classes\mm-progs
+OBJDIR	=	../dll
+
+OBJECTS	= 	$(INC)\mmres.h mmres$(LANGUAGE).rc \
+			audioplayer$(LANGUAGE).dlg audioplayer$(LANGUAGE).rc \
+			audioconv$(LANGUAGE).dlg audioconv$(LANGUAGE).rc \
+			volume$(LANGUAGE).rc volume$(LANGUAGE).dlg \
+			imageconv$(LANGUAGE).dlg imageconv$(LANGUAGE).rc \
+			cwaudio$(LANGUAGE).rc cwaudio$(LANGUAGE).dlg \
+			cwimage$(LANGUAGE).rc cwvideo$(LANGUAGE).rc \
+			mmfind$(LANGUAGE).dlg mmfind$(LANGUAGE).rc
+
+
+all:	$(OBJDIR)/mmres$(LANGUAGE).dll
+
+$(OBJDIR)/mmres$(LANGUAGE).dll:	mmres$(LANGUAGE).c $(OBJECTS) 
+		cmd /C $(TOOLDIR)/create_def.cmd mmres$(LANGUAGE).def
+		icc $(CPPFLAGS) -I$(INC) /Fe$(OBJDIR)\$@ $< mmres$(LANGUAGE).def
+		rc -D $(ECS) -i $(INC) mmres$(LANGUAGE).rc $(OBJDIR)/mmres$(LANGUAGE).dll
+		rc -r -D $(ECS) -i $(INC) mmres$(LANGUAGE).rc $(OBJDIR)/mmres$(LANGUAGE).res
+#		rc  mmres$(LANGUAGE).res $(OBJDIR)/mmres$(LANGUAGE).dll
+
+#(OBJDIR)/mmres$(LANGUAGE).res:	mmres$(LANGUAGE).rc $(OBJECTS)
+#		rc -D $(ECS) -i $(INC) -r mmres$(LANGUAGE).rc
+
+
+restest:	
+	echo  $(deftext)> test.def
+
+                		
+clean:
+	-rm $(OBJDIR)/*.obj
+	-rm $(OBJDIR)/*.dll
+	-rm $(OBJDIR)/*.res
+	-rm *.*~
+	-rm *.flc
+	-rm *.RES
+	-rm *.obj
+	-rm *.def
+
+
+	
+
Index: /tags/CWMM-0.3.0_GA/classes/res/es/mmfind_es.dlg
===================================================================
--- /tags/CWMM-0.3.0_GA/classes/res/es/mmfind_es.dlg	(revision 213)
+++ /tags/CWMM-0.3.0_GA/classes/res/es/mmfind_es.dlg	(revision 213)
@@ -0,0 +1,51 @@
+#ifndef OS2_INCLUDED
+   #include <os2.h>
+#endif
+
+DLGTEMPLATE IDDLG_MMFIND LOADONCALL MOVEABLE DISCARDABLE
+BEGIN
+    DIALOG  "Buscar archivo multimedia", IDDLG_MMFIND, 12, 23, 338, 133, WS_VISIBLE | WS_SYNCPAINT, 
+            FCF_SYSMENU | FCF_TITLEBAR
+            PRESPARAMS PP_FONTNAMESIZE, "9.WarpSans"
+    BEGIN
+        LTEXT           "Nombre de archivo que abrir", 257, 4, 120, 51, 9, DT_VCENTER | 
+                        NOT WS_GROUP
+        ENTRYFIELD      "*", 258, 55, 120, 239, 7, ES_MARGIN | WS_GROUP
+        LTEXT           "Unidad", 259, 4, 108, 51, 9, DT_VCENTER | NOT 
+                        WS_GROUP
+        CONTROL         "H:  [SOURCES]", 260, 54, 18, 87, 99, WC_COMBOBOX, 
+                        CBS_DROPDOWNLIST | WS_TABSTOP | WS_VISIBLE
+        LTEXT           "Restringir los archivos a", 261, 174, 4, 46, 9, DT_VCENTER | 
+                        NOT WS_GROUP | NOT WS_VISIBLE
+        CONTROL         "<Todos los archivos>", 262, 209, 4, 29, 8, WC_COMBOBOX, 
+                        CBS_DROPDOWNLIST | WS_TABSTOP
+        LTEXT           "Directorio", 263, 4, 97, 35, 7, NOT WS_GROUP
+        LTEXT           "", 270, 42, 98, 60, 6, NOT WS_GROUP | NOT 
+                        WS_VISIBLE
+        LTEXT           "Archivo", 265, 131, 97, 17, 7, NOT WS_GROUP
+        AUTOCHECKBOX    "S¢lo lectura", 269, 171, 97, 42, 8, NOT WS_TABSTOP | 
+                        NOT WS_VISIBLE
+        LISTBOX         264, 4, 17, 116, 76, LS_OWNERDRAW | LS_HORZSCROLL
+        LISTBOX         266, 125, 17, 116, 76, LS_HORZSCROLL
+        RTEXT           "Tipo de archivo", IDST_TYPE, 146, 108, 58, 9, DT_VCENTER
+        CONTROL         "", IDCB_TYPEOFFILE, 208, 18, 87, 99, WC_COMBOBOX, 
+                        CBS_DROPDOWNLIST | WS_GROUP | WS_TABSTOP | 
+                        WS_VISIBLE
+        GROUPBOX        "Vista previa", IDGB_PREVIEW, 245, 16, 89, 80, NOT WS_VISIBLE
+        CONTROL         "", IDSR_IMGPREVIEW, 249, 20, 82, 68, WC_STATIC, SS_FGNDRECT | 
+                        WS_GROUP
+        CTEXT           "Vista previa no disponible", IDST_NOPREVIEWAVAILABLE, 251, 42, 78, 33, 
+                        DT_WORDBREAK | NOT WS_VISIBLE
+        LTEXT           "", IDST_AUDIOINFO, 253, 21, 75, 62, DT_WORDBREAK | NOT 
+                        WS_VISIBLE
+        GROUPBOX        "Informaci¢n de audio", IDGB_AUDIOINFO, 245, 17, 89, 79, NOT WS_VISIBLE
+        DEFPUSHBUTTON   "~Bien", DID_OK, 3, 2, 40, 12
+        PUSHBUTTON      "~Nuevo...", IDPB_NEWFILE, 46, 2, 40, 12
+        PUSHBUTTON      "Aplicar", 268, 293, 3, 40, 12, NOT WS_TABSTOP | NOT 
+                        WS_VISIBLE
+        PUSHBUTTON      "~Cancelar", DID_CANCEL, 95, 2, 40, 12, NOT WS_TABSTOP
+        PUSHBUTTON      "Ayuda", 267, 243, 2, 40, 12, BS_NOPOINTERFOCUS | NOT 
+                        WS_TABSTOP | NOT WS_VISIBLE
+        LISTBOX         3, 0, 0, 2, 1, NOT WS_TABSTOP | NOT WS_VISIBLE
+    END
+END
Index: /tags/CWMM-0.3.0_GA/classes/res/es/mmfind_es.rc
===================================================================
--- /tags/CWMM-0.3.0_GA/classes/res/es/mmfind_es.rc	(revision 213)
+++ /tags/CWMM-0.3.0_GA/classes/res/es/mmfind_es.rc	(revision 213)
@@ -0,0 +1,13 @@
+#ifndef OS2_INCLUDED
+   #include <os2.h>
+#endif
+
+STRINGTABLE
+BEGIN
+IDSTR_TYPEAUDIO       "Audio"
+IDSTR_TYPEIMAGE       "Imagen"
+IDSTR_TYPEVIDEO       "V¡deo"
+IDSTR_AUDIOINFOTEXT   "Duraci¢n:\t%02d:%02d\n\nFrecuencia de muestreo:\t%d\n\nBits de audio:\t%d\n\nCanales:\t%d"
+IDSTR_NOMMTEMPLATEFLDRTITLE "Error al crear el archivo"
+IDSTR_NOMMTEMPLATEFLDR "No se encuentra la carpeta ®Modelos de multimedia¯. Puede haber perdido su ID de objeto <MMPM2_MMTEMPLATEFOLDER>."
+END
Index: /tags/CWMM-0.3.0_GA/classes/res/es/mmres_es.c
===================================================================
--- /tags/CWMM-0.3.0_GA/classes/res/es/mmres_es.c	(revision 213)
+++ /tags/CWMM-0.3.0_GA/classes/res/es/mmres_es.c	(revision 213)
@@ -0,0 +1,26 @@
+/*
+ * This file is (C) Chris Wohlgemuth 2003
+ */
+/*
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; see the file COPYING.  If not, write to
+ * the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+
+#include <os2.h>
+
+PSZ queryLanguage()
+{
+  return "Espa€ol";
+}
+
Index: /tags/CWMM-0.3.0_GA/classes/res/es/mmres_es.rc
===================================================================
--- /tags/CWMM-0.3.0_GA/classes/res/es/mmres_es.rc	(revision 213)
+++ /tags/CWMM-0.3.0_GA/classes/res/es/mmres_es.rc	(revision 213)
@@ -0,0 +1,37 @@
+#define  INCL_GRAPHICBUTTON   /* need this for the graphic buttons control */
+#define  INCL_BITMAP
+
+#ifndef OS2_INCLUDED
+   #include <os2.h>
+#endif
+#include <sw.h>
+
+#include "mmres.h"
+;#include "version.h"
+;#include "build.h"
+
+
+;Dialog Resources for volume.exe
+rcinclude "volume_es.rc"
+rcinclude "volume_es.dlg"
+
+rcinclude "audioconv_es.rc"
+rcinclude "audioconv_es.dlg"
+
+rcinclude "imageconv_es.rc"
+rcinclude "imageconv_es.dlg"
+
+rcinclude "audioplayer_es.rc"
+rcinclude "audioplayer_es.dlg"
+
+rcinclude "classvolume_es.dlg"
+
+rcinclude "cwaudio_es.rc"
+rcinclude "cwaudio_es.dlg"
+
+rcinclude "cwimage_es.rc"
+rcinclude "cwvideo_es.rc"
+
+rcinclude "mmfind_es.rc"
+rcinclude "mmfind_es.dlg"
+
Index: /tags/CWMM-0.3.0_GA/classes/res/es/volume_es.dlg
===================================================================
--- /tags/CWMM-0.3.0_GA/classes/res/es/volume_es.dlg	(revision 213)
+++ /tags/CWMM-0.3.0_GA/classes/res/es/volume_es.dlg	(revision 213)
@@ -0,0 +1,21 @@
+#ifndef OS2_INCLUDED
+   #include <os2.h>
+#endif
+#define INCL_GRAPHICBUTTON
+#include <sw.h>
+
+
+DLGTEMPLATE IDDLG_VOLUME LOADONCALL MOVEABLE DISCARDABLE
+BEGIN
+    DIALOG  "Volumen", IDDLG_VOLUME, 73, 148, 112, 56,  
+             WS_VISIBLE, FCF_SYSMENU | FCF_TITLEBAR |  FCF_TASKLIST |
+            FCF_MINBUTTON
+    BEGIN
+        CONTROL         "~Volumen", IDCS_VOLUME, 3, 3, 63, 44, WC_CIRCULARSLIDER, 
+                        WS_GROUP | WS_VISIBLE | WS_TABSTOP
+        CONTROL         "En~mudecer", IDPB_MUTE ,  65, 17, 40, 14, WC_GRAPHICBUTTON,
+			 WS_VISIBLE | GBS_AUTOTWOSTATE | WS_TABSTOP
+        GROUPBOX        "", IDGB_VOLUME, 1, 2, 109, 53
+    END
+END
+
Index: /tags/CWMM-0.3.0_GA/classes/res/es/volume_es.rc
===================================================================
--- /tags/CWMM-0.3.0_GA/classes/res/es/volume_es.rc	(revision 213)
+++ /tags/CWMM-0.3.0_GA/classes/res/es/volume_es.rc	(revision 213)
@@ -0,0 +1,11 @@
+#ifndef OS2_INCLUDED
+   #include <os2.h>
+#endif
+
+MENU    IDM_POPUP
+BEGIN
+    MENUITEM    "~Ocutar barra de t¡tulo",    IDM_ITEMTITLEBAR
+    MENUITEM    "",    0, MIS_SEPARATOR
+    MENUITEM    "~Salir",    IDM_ITEMEXIT
+END
+
Index: /tags/CWMM-0.3.0_GA/classes/res/fr/audioconv_fr.dlg
===================================================================
--- /tags/CWMM-0.3.0_GA/classes/res/fr/audioconv_fr.dlg	(revision 213)
+++ /tags/CWMM-0.3.0_GA/classes/res/fr/audioconv_fr.dlg	(revision 213)
@@ -0,0 +1,37 @@
+#ifndef OS2_INCLUDED
+   #include <os2.h>
+#endif
+
+DLGTEMPLATE IDDLG_CONVERT LOADONCALL MOVEABLE DISCARDABLE
+BEGIN
+    DIALOG  "Conversion de fichier audio", IDDLG_CONVERT, 115, 36, 207, 174, WS_VISIBLE,
+            FCF_SYSMENU | FCF_TITLEBAR
+    BEGIN
+        GROUPBOX        "Source", IDGB_CONVERT, 3, 105, 203, 69
+        LTEXT           "Nom :", IDST_CONVERTNAMELABEL, 7, 156, 32, 8
+        RTEXT           "", IDST_CONVERTNAME, 45, 156, 156, 8
+        LTEXT           "chantillonnage : ? Hz", IDST_CONVERTSAMPLERATE, 7, 131, 91, 8
+        LTEXT           "Canaux ?", IDST_CONVERTCHANNELS, 7, 120, 91, 8
+        LTEXT           "Bits par chantillon : ?", IDST_CONVERTCDBITS, 103, 142, 98, 8
+        LTEXT           "(CD : 44100 Hz)", IDST_CONVERTCDSAMPLELABEL, 103, 131,
+                        98, 8
+        LTEXT           "(CD : 2 canaux)", IDST_CONVERTCDCHANNELSLABEL, 103,
+                        120, 98, 8
+        LTEXT           "Dure : ?", IDST_CONVERTPLAYTIME, 7, 109, 161, 8
+        GROUPBOX        "Cible", IDGB_CONVERT2, 3, 19, 203, 85
+        LTEXT           "Convertir en :", 317, 7, 86, 86, 8
+        CONTROL         "", IDDD_IOPROC, 7, 28, 195, 54, WC_COMBOBOX,
+                        CBS_DROPDOWNLIST | WS_GROUP | WS_TABSTOP |
+                        WS_VISIBLE
+
+        LTEXT           "Nouveau nom :", 2419, 7, 57, 64, 8
+        ENTRYFIELD      "", IDEF_CONVERTTARGETNAME, 9, 45, 139, 8, ES_RIGHT |
+                        ES_MARGIN
+        PUSHBUTTON      "~Parcourir...", IDPB_CONVERTBROWSE, 153, 42, 47, 14
+        CONTROL         "", IDBAR_CONVERTPROGRESS, 6, 24, 194, 13,
+                        "CW_PERCENTBAR", 5 | WS_GROUP | WS_VISIBLE
+        DEFPUSHBUTTON   "~Convertir", IDPB_CONVERTOK, 20, 2, 47, 14
+        PUSHBUTTON      "~Annuler", IDPB_CONVERTABORT, 71, 2, 40, 14
+        PUSHBUTTON      "~Fermer", IDPB_CONVERTCLOSE, 135, 2, 40, 14
+    END
+END
Index: /tags/CWMM-0.3.0_GA/classes/res/fr/audioconv_fr.rc
===================================================================
--- /tags/CWMM-0.3.0_GA/classes/res/fr/audioconv_fr.rc	(revision 213)
+++ /tags/CWMM-0.3.0_GA/classes/res/fr/audioconv_fr.rc	(revision 213)
@@ -0,0 +1,19 @@
+#ifndef OS2_INCLUDED
+   #include <os2.h>
+#endif
+
+
+STRINGTABLE
+BEGIN
+
+IDSTR_CONVERTCHANNELS     "%d canaux"
+IDSTR_CONVERTSAMPLERATE   "chantillonnage : %d Hz"
+IDSTR_CONVERTPLAYTIME     "Dure totale : %d:%02d min"
+IDSTR_CONVERTDIALOGERROR  "Chargement impossible du modle de bote de dialogue ! Veuillez vrifier votre installation."
+IDSTR_CONVERTNOSPACETITLE "Conversion en fichier Wave"
+IDSTR_CONVERTNOSPACETEXT  "Espace insuffisant pour le fichier dcod. Choisissez un autre emplacement avec au moins %d Mo d'espace disque libre."
+IDSTR_INSTALLERRORTITLE   "Problme d'installation"
+IDSTR_AUDIOBROWSETITLE    "Nom du fichier audio"
+
+END
+
Index: /tags/CWMM-0.3.0_GA/classes/res/fr/audioplayer_fr.dlg
===================================================================
--- /tags/CWMM-0.3.0_GA/classes/res/fr/audioplayer_fr.dlg	(revision 213)
+++ /tags/CWMM-0.3.0_GA/classes/res/fr/audioplayer_fr.dlg	(revision 213)
@@ -0,0 +1,27 @@
+#ifndef OS2_INCLUDED
+   #include <os2.h>
+#endif
+
+DLGTEMPLATE IDDLG_MMPLAYER LOADONCALL MOVEABLE DISCARDABLE
+BEGIN
+    DIALOG  "Lecteur audio", IDDLG_MMPLAYER, 68, 78, 207, 124, 
+            WS_VISIBLE, FCF_SYSMENU | FCF_TITLEBAR
+    BEGIN
+        CONTROL         "", ID_CLIENT, 18, 0, 56, 67, WC_STATIC, SS_FGNDRECT | 
+                        WS_GROUP | WS_VISIBLE 
+        CONTROL         "~Arrt", IDPB_MMPLAYERSTOP, 40, 25, 22, 14, WC_BUTTON, 
+                        BS_USERBUTTON | WS_VISIBLE| WS_TABSTOP
+        CONTROL         "~Pause", IDPB_MMPLAYERPAUSE, 61, 25, 20, 14, WC_BUTTON, 
+                        BS_USERBUTTON | WS_VISIBLE
+        CONTROL         "~Lecture", IDPB_MMPLAYERPLAY, 79, 25, 20, 14, WC_BUTTON, 
+                        BS_USERBUTTON | WS_VISIBLE
+        CTEXT           "0:00", IDST_MMPLAYERPLAYTIME, 123, 14, 134, 13, DT_VCENTER
+                        PRESPARAMS PP_FONTNAMESIZE, "10.Helv"
+;        CONTROL         "VolumeArm", IDSL_MMPLAYERVOLUMEARM, 209, 5, 14, 14, 
+;                        WC_BUTTON, BS_USERBUTTON | WS_TABSTOP|BS_USERBUTTON
+;        PUSHBUTTON      "Volume", IDSL_MMPLAYERVOLUME, 19, 4, 69, 14, 
+;                        BS_NOPOINTERFOCUS | NOT WS_TABSTOP | NOT WS_VISIBLE |BS_USERBUTTON
+
+    END
+END
+
Index: /tags/CWMM-0.3.0_GA/classes/res/fr/audioplayer_fr.rc
===================================================================
--- /tags/CWMM-0.3.0_GA/classes/res/fr/audioplayer_fr.rc	(revision 213)
+++ /tags/CWMM-0.3.0_GA/classes/res/fr/audioplayer_fr.rc	(revision 213)
@@ -0,0 +1,16 @@
+#ifndef OS2_INCLUDED
+   #include <os2.h>
+#endif
+
+MENU  ID_MENUTIMECONTEXT
+BEGIN
+	MENUITEM "Temps ~coul" ,       ID_MENUITEMELAPSED
+	MENUITEM "Temps ~restant" ,      ID_MENUITEMREMAINING
+	MENUITEM "Info. sur la ~piste" , ID_MENUITEMID3
+END
+
+STRINGTABLE
+BEGIN
+IDSTR_MASTERVOLUMEITEM "~Volume gnral"
+END
+
Index: /tags/CWMM-0.3.0_GA/classes/res/fr/classvolume_fr.dlg
===================================================================
--- /tags/CWMM-0.3.0_GA/classes/res/fr/classvolume_fr.dlg	(revision 213)
+++ /tags/CWMM-0.3.0_GA/classes/res/fr/classvolume_fr.dlg	(revision 213)
@@ -0,0 +1,15 @@
+#ifndef OS2_INCLUDED
+   #include <os2.h>
+#endif
+
+DLGTEMPLATE IDDLG_CLASSVOLUME LOADONCALL MOVEABLE DISCARDABLE
+BEGIN
+    DIALOG  "Volume", IDDLG_CLASSVOLUME, 68, 78, 207, 124, 
+            WS_VISIBLE, FCF_SYSMENU | FCF_TITLEBAR
+    BEGIN
+        CONTROL         "", ID_CLASSVOLCLIENT, 18, 0, 56, 67, WC_STATIC, SS_FGNDRECT | 
+                        WS_GROUP | WS_VISIBLE 
+
+    END
+END
+
Index: /tags/CWMM-0.3.0_GA/classes/res/fr/cwaudio_fr.dlg
===================================================================
--- /tags/CWMM-0.3.0_GA/classes/res/fr/cwaudio_fr.dlg	(revision 213)
+++ /tags/CWMM-0.3.0_GA/classes/res/fr/cwaudio_fr.dlg	(revision 213)
@@ -0,0 +1,77 @@
+#ifndef OS2_INCLUDED
+   #include <os2.h>
+#endif
+
+DLGTEMPLATE IDDLG_ID3TAGS LOADONCALL MOVEABLE DISCARDABLE
+BEGIN
+    DIALOG  "", IDDLG_ID3TAGS, 92, 13, 209, 120, NOT FS_DLGBORDER |
+            WS_VISIBLE
+    BEGIN
+        PUSHBUTTON      "~Enregister", IDPB_ID3SAVE, 44, 1, 40, 14
+        PUSHBUTTON      "~Annuler", IDPB_CANCEL, 87, 1, 40, 14
+        PUSHBUTTON      "A~ide", IDPB_ID3HELP, 130, 1, 40, 14, BS_HELP
+        GROUPBOX        "Informations ID3", IDGB_ID3TAGS, 6, 17, 202, 97
+        LTEXT           "Nom :", 210, 9, 95, 57, 8
+        ENTRYFIELD      "", IDEF_ID3NAME, 73, 95, 127, 8, ES_MARGIN
+        LTEXT           "Artiste :", 211, 9, 82, 57, 8
+        ENTRYFIELD      "", IDEF_ID3ARTIST, 73, 82, 127, 8, ES_MARGIN
+        LTEXT           "Album :", 212, 9, 69, 57, 8
+        ENTRYFIELD      "", IDEF_ID3ALBUM, 73, 69, 127, 8, ES_MARGIN
+        LTEXT           "Commentaire :", 213, 9, 56, 57, 8
+        ENTRYFIELD      "", IDEF_ID3COMMENT, 73, 56, 127, 8, ES_MARGIN
+        LTEXT           "Anne :", 214, 9, 44, 57, 8
+        ENTRYFIELD      "", IDEF_ID3YEAR, 73, 43, 40, 8, ES_MARGIN
+        LTEXT           "Genre :", 215, 9, 26, 57, 8
+        CONTROL         "", IDDD_ID3GENRE, 71, 5, 99, 31, WC_COMBOBOX,
+                        CBS_DROPDOWN | WS_GROUP | WS_TABSTOP | WS_VISIBLE
+    END
+END
+
+DLGTEMPLATE IDDLG_WAVEINFOPAGE LOADONCALL MOVEABLE DISCARDABLE
+BEGIN
+    DIALOG  "", IDDLG_WAVEINFOPAGE, 91, 31, 169, 109, NOT FS_DLGBORDER |
+            WS_VISIBLE | NOT WS_SAVEBITS
+    BEGIN
+        GROUPBOX        "Info. audio", IDGB_WAVEINFO, 6, 4, 154, 67, NOT
+                        WS_GROUP
+        LTEXT           "Taux d'chantillonnage :", IDST_SAMPLERATELABEL, 17, 35, 76, 8
+        LTEXT           "Bits par chantillon :", IDST_BPSLABEL, 17, 23, 76, 8
+        LTEXT           "Dure totale :", IDST_PLAYTIMELABEL, 17, 47, 76, 8
+        LTEXT           "Canaux :", IDST_CHANNELSLABEL, 17, 12, 76, 8
+        LTEXT           "??:??", IDST_PLAYTIME, 108, 47, 39, 8
+        LTEXT           "??", IDST_SAMPLERATE, 108, 35, 39, 8
+        LTEXT           "??", IDST_BPS, 108, 23, 39, 8
+        LTEXT           "??", IDST_CHANNELS, 108, 12, 39, 8
+    END
+END
+
+DLGTEMPLATE IDDLG_IMAGEINFOPAGE LOADONCALL MOVEABLE DISCARDABLE
+BEGIN
+    DIALOG  "", IDDLG_IMAGEINFOPAGE, 91, 31, 169, 109, NOT FS_DLGBORDER |
+            WS_VISIBLE
+    BEGIN
+        GROUPBOX        "Info. sur l'image", IDGB_IMAGEINFO, 6, 4, 154, 78,
+                        NOT WS_GROUP
+        LTEXT           "Largeur :", IDST_IMAGEWIDTHLABEL, 17, 35, 76, 8
+        LTEXT           "Hauteur :", IDST_IMAGEHEIGHTLABEL, 17, 23, 76, 8
+        LTEXT           "Profondeur :", IDST_COLORDEPTHLABEL, 17, 12, 76, 8
+        LTEXT           "??", IDST_IMAGEWIDTH, 108, 35, 39, 8
+        LTEXT           "??", IDST_IMAGEHEIGHT, 108, 23, 39, 8
+        LTEXT           "??", IDST_COLORDEPTH, 108, 12, 39, 8
+        LTEXT           "", IDST_IMAGEFORMAT, 17, 48, 135, 21, DT_WORDBREAK
+    END
+END
+
+DLGTEMPLATE IDDLG_STREAMURLPAGE LOADONCALL MOVEABLE DISCARDABLE
+BEGIN
+    DIALOG  "", IDDLG_STREAMURLPAGE, 91, 31, 169, 109, NOT FS_DLGBORDER |
+            WS_VISIBLE
+    BEGIN
+        PUSHBUTTON      "A~ide", IDPB_STREAMHELP, 130, 1, 40, 14, BS_HELP
+        GROUPBOX        "URL", IDGB_STREAMURL, 6, 4, 154, 61, NOT WS_GROUP
+        ENTRYFIELD      "", IDEF_URL, 13, 23, 140, 8, ES_MARGIN
+        LTEXT           "Entrez l'URL du serveur de flux :", IDST_URLTEXT, 12,
+                        37, 143, 8
+    END
+END
+
Index: /tags/CWMM-0.3.0_GA/classes/res/fr/cwaudio_fr.rc
===================================================================
--- /tags/CWMM-0.3.0_GA/classes/res/fr/cwaudio_fr.rc	(revision 213)
+++ /tags/CWMM-0.3.0_GA/classes/res/fr/cwaudio_fr.rc	(revision 213)
@@ -0,0 +1,129 @@
+#ifndef OS2_INCLUDED
+   #include <os2.h>
+#endif
+
+
+MENU ID_MENU_VOLUME
+BEGIN
+        MENUITEM "~Volume",ID_MENU_VOLUME
+END
+
+MENU ID_MENU_START
+BEGIN
+        MENUITEM "~Lecture",ID_MENU_START
+END
+
+MENU ID_MENU_STOP
+BEGIN
+        MENUITEM "~Arrt", ID_MENU_STOP
+END
+
+MENU ID_MENU_PAUSE
+BEGIN
+        MENUITEM "~Pause", ID_MENU_PAUSE
+END
+
+MENU ID_MENU_RESUME
+BEGIN
+        MENUITEM "~Rembobiner", ID_MENU_RESUME
+END
+
+MENU ID_MENU_EDITOR
+BEGIN
+        MENUITEM "~diteur audio", ID_MENU_EDITOR
+END
+
+MENU ID_MENU_PLAYER
+BEGIN
+        MENUITEM "Lec~teur audio", ID_MENU_PLAYER
+END
+
+MENU ID_MENU_CONVERT
+BEGIN
+	SUBMENU  "~Convertir en",ID_MENU_CONVERT
+	BEGIN
+        MENUITEM "~WAV (Audio numrique RIFF WAVE)", ID_ITEM_CONVERT
+	END
+END
+
+MENU ID_MENUICONSIZE
+BEGIN
+;   MENUITEM  "" , ID_MENUICONSIZE, MIS_SEPARATOR
+   MENUITEM "Icnes normales", ID_NORMALICONSITEM
+   MENUITEM  "50 x 50" , ID_50X50ITEM
+   MENUITEM  "100 x 100" , ID_100X100ITEM
+   MENUITEM  "150 x 150" , ID_150X150ITEM
+   MENUITEM  "200 x 200" , ID_200X200ITEM
+   MENUITEM  "250 x 250" , ID_250X250ITEM
+END
+
+MENU ID_MENU_M3UEDITOR
+BEGIN
+        MENUITEM "~diteur de liste de lecture", ID_MENU_M3UEDITOR
+END
+
+MENU ID_MENU_M3UPLAYER
+BEGIN
+        MENUITEM "~Lire cette liste", ID_MENU_M3UPLAYER
+END
+
+
+STRINGTABLE
+BEGIN
+ID_WAVEINFOPAGENAME     "Info. ~audio"
+ID_ID3TAGSPAGENAME      "Info. ~ID3"
+ID_TRACKNAMEPAGENAME    "Nom du ~morceau"
+IDSTR_TRACKNAME         "Nom de piste"
+
+IDSTR_PLAYTIME          "Dure de lecture"
+IDSTR_SAMPLERATE        "Taux chant."
+IDSTR_CHANNELS          "Canaux"
+IDSTR_BPS               "Bits/chantillons"
+
+;IDSTR_BITRATE          "Bitrate"
+;IDSTR_VBR              "VBR"
+
+IDSTR_TITLE             "Titre"
+IDSTR_ARTIST            "Artiste"
+IDSTR_ALBUM             "Album"
+IDSTR_YEAR              "Anne"
+IDSTR_COMMENT           "Commentaire"
+IDSTR_GENRE             "Genre"
+
+IDSTR_HELPLIBRARY       "MMPARTS.HLP"
+IDSTR_CWMMDATAFILETITLE "Fichier MMData"
+;Titles of audio classes
+IDSTR_CWAUDIOTITLE      "Audio numrique"
+IDSTR_AIFTITLE          "AIFAudio.AIF"
+IDSTR_AUTITLE           "AUAudio.AU"
+IDSTR__AUTITLE          "_AUAudio._AU"
+IDSTR_IFFTITLE          "IFFAudio.IFF"
+IDSTR_SNDFTITLE         "SNDAudio.SND"
+IDSTR_VOCTITLE          "VOCAudio.VOC"
+IDSTR_WAVTITLE          "WAVAudio.WAV"
+IDSTR_OGGTITLE          "OGGAudio.OGG"
+IDSTR_MP3TITLE          "MP3Audio.MP3"
+IDSTR_MIDITITLE         "MIDI.MID"
+IDSTR_FLACTITLE         "FLACAudio.FLA"
+
+
+IDSTR_LIGHTTABLETITLE   "Table lumineuse"
+
+IDSTR_ICONSIZEMENU      "~Taille des icnes"
+;Used as an information when starting and audio file from the WPS
+IDSTR_STARTINGTRACK     "Lecture en cours de la piste..."
+IDSTR_AUDIOSCANNING     "Analyse en cours du fichier audio..."
+IDSTR_AUDIOSTREAMTITLE  "Flux audio"
+IDSTR_STREAMURLPAGENAME "~URL"
+IDSTR_CDTRACKTITLE      "Piste du CD"
+IDSTR_M3UTITLE          "Liste de lecture M3U"
+;Titles used when starting player and editor applications
+IDSTR_AUDPLAYERTITLE    "Lecteur audio"
+IDSTR_AUDEDITORTITLE    "diteur audio"
+IDSTR_M3UEDITORTITLE    "diteur de liste de lecture"
+IDSTR_TRACKPAUSED       " (suspendu)"
+;Used for window list
+IDSTR_VOLUMETITLE       "Volume sonore"
+
+END
+
Index: /tags/CWMM-0.3.0_GA/classes/res/fr/cwimage_fr.rc
===================================================================
--- /tags/CWMM-0.3.0_GA/classes/res/fr/cwimage_fr.rc	(revision 213)
+++ /tags/CWMM-0.3.0_GA/classes/res/fr/cwimage_fr.rc	(revision 213)
@@ -0,0 +1,51 @@
+#ifndef OS2_INCLUDED
+   #include <os2.h>
+#endif
+
+
+MENU ID_MENU_IMGEDITOR
+BEGIN
+        MENUITEM "~diteur d'image", ID_MENU_IMGEDITOR       
+END
+
+
+STRINGTABLE 
+BEGIN
+IDSTR_MENU_CONVERT "~Convertir en"
+
+IDSTR_AVCTITLE      "AVCImage._IM"
+IDSTR_DIBTITLE      "DIBImage.DIB"
+IDSTR_GIFTITLE      "GIFImage.GIF"
+IDSTR_JPGTITLE      "JPGImage.JPG"
+IDSTR_PCDTITLE      "PCDImage.PCD"
+IDSTR_PCXTITLE      "PCXImage.PCX"
+IDSTR_TGATITLE      "TargaImage.TGA"
+IDSTR_TIFTITLE      "TIFImage.TIF"
+IDSTR_PNGTITLE      "PNGImage.PNG"
+IDSTR_MMOTIONTITLE  "VIDImage.VID"
+IDSTR_CWIMAGETITLE  "Digital image"
+
+IDSTR_IMAGEINFOPAGENAME "Info. sur l'~image"
+IDSTR_SPRINTFPIXEL	"%d pixel"
+IDSTR_SPRINTFBIT       "%d bit"
+;Bitmpap load errors
+IDSTR_NOIMGIOPROCERROR   "Aucune procdure d'entre/sortie n'a t trouve pour cette image."
+IDSTR_OPENFILEERRORTITLE "Erreur fichier"
+IDSTR_OPENFILEERROR      "Ouverture impossible du fichier."
+IDSTR_NOMEMERROR         "Pas de mmoire disponible."
+IDSTR_IMGIOPROCCRASH     "Erreur interne 
+ l'ouvertrure de l'image. Le bureau DOIT tre relanc ou le systme pourrait devenir instable ! Toutes les applications en cours d'excution devraient cependant rester ouvertes."
+
+IDSTR_IMAGEDETAIL_WIDTH   "Largeur"
+IDSTR_IMAGEDETAIL_HEIGHT  "Hauteur"
+IDSTR_IMAGEDETAIL_DEPTH   "Profondeur"
+IDSTR_IMAGEDETAIL_FORMAT  "Format"
+
+;Titles used when starting player and editor applications
+IDSTR_IMGEDITORTITLE       "Afficheur d'images"
+IDSTR_MENU_IMAGEINFO        "Info. sur l'image : %d x %d x %d"
+
+;IDSTR_HELPLIBRARY   "MMPARTS.HLP"
+END
+
+
Index: /tags/CWMM-0.3.0_GA/classes/res/fr/cwvideo_fr.rc
===================================================================
--- /tags/CWMM-0.3.0_GA/classes/res/fr/cwvideo_fr.rc	(revision 213)
+++ /tags/CWMM-0.3.0_GA/classes/res/fr/cwvideo_fr.rc	(revision 213)
@@ -0,0 +1,13 @@
+
+STRINGTABLE 
+BEGIN
+;Titles of video classes
+IDSTR_CWVIDEOTITLE       "Video numrique"
+IDSTR_MPGTITLE           "MPGVideo.MPG"
+IDSTR_MOVTITLE           "MOVVideo.MOV"
+IDSTR_FLITITLE           "FLIVideo.FLI"
+IDSTR_AVITITLE           "AVIVideo.AVI"
+IDSTR_VIDPLAYERTITLE     "Lecteur video"
+
+END
+
Index: /tags/CWMM-0.3.0_GA/classes/res/fr/def.tpl
===================================================================
--- /tags/CWMM-0.3.0_GA/classes/res/fr/def.tpl	(revision 213)
+++ /tags/CWMM-0.3.0_GA/classes/res/fr/def.tpl	(revision 213)
@@ -0,0 +1,26 @@
+# Note: lines starting with '#' are comments.
+
+[DESCRIPTION]
+FR MM Resource-DLL
+
+[COPYRIGHT]
+(c) C. Wohlgemuth 2001-2005 Netlabs CWMM Team 2023
+
+[AUTHOR]
+Netlabs CWMM Team
+
+[NAME]
+# This is the NAME xxx WINDOWAPI|etc line in the def file.
+# Important: it specifies the internal name of the program. Don't leave out!
+LIBRARY MMRES_FR INITINSTANCE TERMINSTANCE
+
+[BUILDMACHINE]
+Zobopeep
+
+[OTHER]
+# Add all the lines here you want to have at the end of the generated DEF file
+PROTMODE
+CODE LOADONCALL DISCARDABLE
+DATA MULTIPLE NONSHARED
+EXPORTS
+        queryLanguage
Index: /tags/CWMM-0.3.0_GA/classes/res/fr/imageconv_fr.dlg
===================================================================
--- /tags/CWMM-0.3.0_GA/classes/res/fr/imageconv_fr.dlg	(revision 213)
+++ /tags/CWMM-0.3.0_GA/classes/res/fr/imageconv_fr.dlg	(revision 213)
@@ -0,0 +1,29 @@
+#ifndef OS2_INCLUDED
+   #include <os2.h>
+#endif
+
+DLGTEMPLATE IDDLG_IMGCONVERT LOADONCALL MOVEABLE DISCARDABLE
+BEGIN
+    DIALOG  "Conversion d'image numrique", IDDLG_IMGCONVERT, 68, 78, 207, 191, 
+            WS_VISIBLE, FCF_SYSMENU | FCF_TITLEBAR
+    BEGIN
+        GROUPBOX        "", IDGB_IMGCONVERT, 2, 19, 203, 172
+        LTEXT           "Nom :", IDST_IMGCONVERTNAMELABEL, 7, 173, 32, 8
+        LTEXT           "", IDST_IMGCONVERTNAME, 44, 173, 156, 8
+        CONTROL         "", IDSR_BMP, 12, 100, 185, 69, WC_STATIC, 
+                        SS_FGNDRECT | WS_GROUP | WS_VISIBLE
+        LTEXT           "Convertir en :", IDST_IMGCONVERTTO, 7, 88, 53, 8
+        CONTROL         "", IDDD_IMGIOPROC, 6, 6, 196, 78, WC_COMBOBOX, 
+                        CBS_DROPDOWNLIST | LS_HORZSCROLL | WS_GROUP | 
+                        WS_TABSTOP | WS_VISIBLE
+        LTEXT           "Nouveau nom :", 2419, 7, 57, 64, 8
+        ENTRYFIELD      "", IDEF_IMGCONVERTTARGETNAME, 9, 45, 139, 8, ES_MARGIN
+        PUSHBUTTON      "~Parcourir...", IDPB_IMGCONVERTBROWSE, 153, 42, 47, 14
+        CONTROL         "", IDBAR_IMGCONVERTPROGRESS, 6, 24, 194, 13, 
+                        "CW_PERCENTBAR", 5 | WS_GROUP | WS_VISIBLE
+        DEFPUSHBUTTON   "~Convertir", IDPB_IMGCONVERTOK, 20, 2, 47, 14
+        PUSHBUTTON      "~Annuler", IDPB_IMGCONVERTABORT, 71, 2, 40, 14
+        PUSHBUTTON      "~Fermer", IDPB_IMGCONVERTCLOSE, 135, 2, 40, 14
+    END
+END
+
Index: /tags/CWMM-0.3.0_GA/classes/res/fr/imageconv_fr.rc
===================================================================
--- /tags/CWMM-0.3.0_GA/classes/res/fr/imageconv_fr.rc	(revision 213)
+++ /tags/CWMM-0.3.0_GA/classes/res/fr/imageconv_fr.rc	(revision 213)
@@ -0,0 +1,10 @@
+#ifndef OS2_INCLUDED
+   #include <os2.h>
+#endif
+
+
+STRINGTABLE
+BEGIN
+IDSTR_IMAGEBROWSETITLE   "Nom du fichier d'image"
+END
+
Index: /tags/CWMM-0.3.0_GA/classes/res/fr/makefile
===================================================================
--- /tags/CWMM-0.3.0_GA/classes/res/fr/makefile	(revision 213)
+++ /tags/CWMM-0.3.0_GA/classes/res/fr/makefile	(revision 213)
@@ -0,0 +1,54 @@
+# Makefile for CWMM resource dll
+
+include ../../../make.inc
+include ../../../build.inc
+
+LANGUAGE	=	_fr
+
+CC           = icc
+CPPFLAGS     = /Ge- /Gm+ /G4 /Gl  /O+ /Oc+ /Ol- /Q+ $(VACDEBUG)
+INC	=	../../inc
+DEFS         =
+#TOOLDIR =      $(BUILD_ROOT)\classes\mm-progs
+OBJDIR	=	../dll
+
+OBJECTS	= 	$(INC)\mmres.h mmres$(LANGUAGE).rc \
+			audioplayer$(LANGUAGE).dlg audioplayer$(LANGUAGE).rc \
+			audioconv$(LANGUAGE).dlg audioconv$(LANGUAGE).rc \
+			volume$(LANGUAGE).rc volume$(LANGUAGE).dlg \
+			imageconv$(LANGUAGE).dlg imageconv$(LANGUAGE).rc \
+			cwaudio$(LANGUAGE).rc cwaudio$(LANGUAGE).dlg \
+			cwimage$(LANGUAGE).rc cwvideo$(LANGUAGE).rc \
+			mmfind$(LANGUAGE).dlg mmfind$(LANGUAGE).rc
+
+
+all:	$(OBJDIR)/mmres$(LANGUAGE).dll
+
+$(OBJDIR)/mmres$(LANGUAGE).dll:	mmres$(LANGUAGE).c $(OBJECTS) 
+		cmd /C $(TOOLDIR)/create_def.cmd mmres$(LANGUAGE).def
+		icc $(CPPFLAGS) -I$(INC) /Fe$(OBJDIR)\$@ $< mmres$(LANGUAGE).def
+		rc -D $(ECS) -i $(INC) mmres$(LANGUAGE).rc $(OBJDIR)/mmres$(LANGUAGE).dll
+		rc -r -D $(ECS) -i $(INC) mmres$(LANGUAGE).rc $(OBJDIR)/mmres$(LANGUAGE).res
+#		rc  mmres$(LANGUAGE).res $(OBJDIR)/mmres$(LANGUAGE).dll
+
+#(OBJDIR)/mmres$(LANGUAGE).res:	mmres$(LANGUAGE).rc $(OBJECTS)
+#		rc -D $(ECS) -i $(INC) -r mmres$(LANGUAGE).rc
+
+
+restest:	
+	echo  $(deftext)> test.def
+
+                		
+clean:
+	-rm $(OBJDIR)/*.obj
+	-rm $(OBJDIR)/*.dll
+	-rm $(OBJDIR)/*.res
+	-rm *.*~
+	-rm *.flc
+	-rm *.RES
+	-rm *.obj
+	-rm *.def
+
+
+	
+
Index: /tags/CWMM-0.3.0_GA/classes/res/fr/mmfind_fr.dlg
===================================================================
--- /tags/CWMM-0.3.0_GA/classes/res/fr/mmfind_fr.dlg	(revision 213)
+++ /tags/CWMM-0.3.0_GA/classes/res/fr/mmfind_fr.dlg	(revision 213)
@@ -0,0 +1,52 @@
+#ifndef OS2_INCLUDED
+   #include <os2.h>
+#endif
+
+DLGTEMPLATE IDDLG_MMFIND LOADONCALL MOVEABLE DISCARDABLE
+BEGIN
+    DIALOG  "Recherche de fichier multimdia", IDDLG_MMFIND, 12, 23, 338, 133, WS_VISIBLE | WS_SYNCPAINT,
+            FCF_SYSMENU | FCF_TITLEBAR
+            PRESPARAMS PP_FONTNAMESIZE, "9.WarpSans"
+    BEGIN
+        LTEXT           "Ouvrir le nom de fichier", 257, 4, 120, 51, 9, DT_VCENTER |
+                        NOT WS_GROUP
+        ENTRYFIELD      "*", 258, 55, 120, 239, 7, ES_MARGIN | WS_GROUP
+        LTEXT           "Unit", 259, 4, 108, 51, 9, DT_VCENTER | NOT
+                        WS_GROUP
+        CONTROL         "H:  [SOURCES]", 260, 54, 18, 87, 99, WC_COMBOBOX,
+                        CBS_DROPDOWNLIST | WS_TABSTOP | WS_VISIBLE
+        LTEXT           "Restreindre la recherche 
+", 261, 174, 4, 46, 9, DT_VCENTER |
+                        NOT WS_GROUP | NOT WS_VISIBLE
+        CONTROL         "<Tous les fichiers>", 262, 209, 4, 29, 8, WC_COMBOBOX,
+                        CBS_DROPDOWNLIST | WS_TABSTOP
+        LTEXT           "Rpertoire", 263, 4, 97, 35, 7, NOT WS_GROUP
+        LTEXT           "", 270, 42, 98, 60, 6, NOT WS_GROUP | NOT
+                        WS_VISIBLE
+        LTEXT           "Fichier", 265, 131, 97, 17, 7, NOT WS_GROUP
+        AUTOCHECKBOX    "Lecture seule", 269, 171, 97, 42, 8, NOT WS_TABSTOP |
+                        NOT WS_VISIBLE
+        LISTBOX         264, 4, 17, 116, 76, LS_OWNERDRAW | LS_HORZSCROLL
+        LISTBOX         266, 125, 17, 116, 76, LS_HORZSCROLL
+        RTEXT           "Type de fichier", IDST_TYPE, 146, 108, 58, 9, DT_VCENTER
+        CONTROL         "", IDCB_TYPEOFFILE, 208, 18, 87, 99, WC_COMBOBOX,
+                        CBS_DROPDOWNLIST | WS_GROUP | WS_TABSTOP |
+                        WS_VISIBLE
+        GROUPBOX        "Aperu", IDGB_PREVIEW, 245, 16, 89, 80, NOT WS_VISIBLE
+        CONTROL         "", IDSR_IMGPREVIEW, 249, 20, 82, 68, WC_STATIC, SS_FGNDRECT |
+                        WS_GROUP
+        CTEXT           "Aucun aperu disponible", IDST_NOPREVIEWAVAILABLE, 251, 42, 78, 33,
+                        DT_WORDBREAK | NOT WS_VISIBLE
+        LTEXT           "", IDST_AUDIOINFO, 253, 21, 75, 62, DT_WORDBREAK | NOT
+                        WS_VISIBLE
+        GROUPBOX        "Info. audio", IDGB_AUDIOINFO, 245, 17, 89, 79, NOT WS_VISIBLE
+        DEFPUSHBUTTON   "~OK", DID_OK, 3, 2, 40, 12
+        PUSHBUTTON      "~Nouveau...", IDPB_NEWFILE, 46, 2, 40, 12
+        PUSHBUTTON      "Appliquer", 268, 293, 3, 40, 12, NOT WS_TABSTOP | NOT
+                        WS_VISIBLE
+        PUSHBUTTON      "~Annuler", DID_CANCEL, 95, 2, 40, 12, NOT WS_TABSTOP
+        PUSHBUTTON      "A~ide", 267, 243, 2, 40, 12, BS_NOPOINTERFOCUS | NOT
+                        WS_TABSTOP | NOT WS_VISIBLE
+        LISTBOX         3, 0, 0, 2, 1, NOT WS_TABSTOP | NOT WS_VISIBLE
+    END
+END
Index: /tags/CWMM-0.3.0_GA/classes/res/fr/mmfind_fr.rc
===================================================================
--- /tags/CWMM-0.3.0_GA/classes/res/fr/mmfind_fr.rc	(revision 213)
+++ /tags/CWMM-0.3.0_GA/classes/res/fr/mmfind_fr.rc	(revision 213)
@@ -0,0 +1,14 @@
+#ifndef OS2_INCLUDED
+   #include <os2.h>
+#endif
+
+STRINGTABLE
+BEGIN
+IDSTR_TYPEAUDIO       "Audio"
+IDSTR_TYPEIMAGE       "Image"
+IDSTR_TYPEVIDEO       "Vido"
+IDSTR_AUDIOINFOTEXT   "Dure :\t%02d:%02d\n\nchantillonnage :\t%d\n\nBits par chantillon :\t%d\n\nCannaux :\t%d"
+IDSTR_NOMMTEMPLATEFLDRTITLE "Erreur 
+ la cration de fichier"
+IDSTR_NOMMTEMPLATEFLDR "Le dossier des modles multimdias n'a pas pu tre trouv. Il peut avoir perdu sont identifiant d'objet <MMPM2_MMTEMPLATEFOLDER>."
+END
Index: /tags/CWMM-0.3.0_GA/classes/res/fr/mmres_fr.c
===================================================================
--- /tags/CWMM-0.3.0_GA/classes/res/fr/mmres_fr.c	(revision 213)
+++ /tags/CWMM-0.3.0_GA/classes/res/fr/mmres_fr.c	(revision 213)
@@ -0,0 +1,30 @@
+/*
+ * This file is (C) Chris Wohlgemuth 2003
+ */
+/*
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; see the file COPYING.  If not, write to
+ * the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+/*
+ * French translation.: Guillaume Gay <guillaume[dot]gay[arobase]@gmail[dot]com>
+ * Version............: 2020-07-21
+ */
+
+
+#include <os2.h>
+
+PSZ queryLanguage()
+{
+  return "Franais";
+}
Index: /tags/CWMM-0.3.0_GA/classes/res/fr/mmres_fr.rc
===================================================================
--- /tags/CWMM-0.3.0_GA/classes/res/fr/mmres_fr.rc	(revision 213)
+++ /tags/CWMM-0.3.0_GA/classes/res/fr/mmres_fr.rc	(revision 213)
@@ -0,0 +1,36 @@
+#define  INCL_GRAPHICBUTTON   /* need this for the graphic buttons control */
+#define  INCL_BITMAP
+
+#ifndef OS2_INCLUDED
+   #include <os2.h>
+#endif
+#include <sw.h>
+
+#include "mmres.h"
+;#include "version.h"
+;#include "build.h"
+
+
+;Dialog Resources for volume.exe
+rcinclude "volume_fr.rc"
+rcinclude "volume_fr.dlg"
+
+rcinclude "audioconv_fr.rc"
+rcinclude "audioconv_fr.dlg"
+
+rcinclude "imageconv_fr.rc"
+rcinclude "imageconv_fr.dlg"
+
+rcinclude "audioplayer_fr.rc"
+rcinclude "audioplayer_fr.dlg"
+
+rcinclude "classvolume_fr.dlg"
+
+rcinclude "cwaudio_fr.rc"
+rcinclude "cwaudio_fr.dlg"
+
+rcinclude "cwimage_fr.rc"
+rcinclude "cwvideo_fr.rc"
+
+rcinclude "mmfind_fr.rc"
+rcinclude "mmfind_fr.dlg"
Index: /tags/CWMM-0.3.0_GA/classes/res/fr/volume_fr.dlg
===================================================================
--- /tags/CWMM-0.3.0_GA/classes/res/fr/volume_fr.dlg	(revision 213)
+++ /tags/CWMM-0.3.0_GA/classes/res/fr/volume_fr.dlg	(revision 213)
@@ -0,0 +1,21 @@
+#ifndef OS2_INCLUDED
+   #include <os2.h>
+#endif
+#define INCL_GRAPHICBUTTON
+#include <sw.h>
+
+
+DLGTEMPLATE IDDLG_VOLUME LOADONCALL MOVEABLE DISCARDABLE
+BEGIN
+    DIALOG  "Volume sonore", IDDLG_VOLUME, 73, 148, 112, 56,  
+             WS_VISIBLE, FCF_SYSMENU | FCF_TITLEBAR |  FCF_TASKLIST |
+            FCF_MINBUTTON
+    BEGIN
+        CONTROL         "~Volume", IDCS_VOLUME, 3, 3, 63, 44, WC_CIRCULARSLIDER, 
+                        WS_GROUP | WS_VISIBLE | WS_TABSTOP
+        CONTROL         "~Muet", IDPB_MUTE ,  65, 17, 40, 14, WC_GRAPHICBUTTON,
+			 WS_VISIBLE | GBS_AUTOTWOSTATE | WS_TABSTOP
+        GROUPBOX        "", IDGB_VOLUME, 1, 2, 109, 53
+    END
+END
+
Index: /tags/CWMM-0.3.0_GA/classes/res/fr/volume_fr.rc
===================================================================
--- /tags/CWMM-0.3.0_GA/classes/res/fr/volume_fr.rc	(revision 213)
+++ /tags/CWMM-0.3.0_GA/classes/res/fr/volume_fr.rc	(revision 213)
@@ -0,0 +1,11 @@
+#ifndef OS2_INCLUDED
+   #include <os2.h>
+#endif
+
+MENU    IDM_POPUP
+BEGIN
+    MENUITEM    "~Masquer la barre de titre",    IDM_ITEMTITLEBAR
+    MENUITEM    "",    0, MIS_SEPARATOR
+    MENUITEM    "~Quitter",    IDM_ITEMEXIT
+END
+
Index: /tags/CWMM-0.3.0_GA/classes/res/it/audioconv_it.dlg
===================================================================
--- /tags/CWMM-0.3.0_GA/classes/res/it/audioconv_it.dlg	(revision 213)
+++ /tags/CWMM-0.3.0_GA/classes/res/it/audioconv_it.dlg	(revision 213)
@@ -0,0 +1,37 @@
+#ifndef OS2_INCLUDED
+   #include <os2.h>
+#endif
+
+DLGTEMPLATE IDDLG_CONVERT LOADONCALL MOVEABLE DISCARDABLE
+BEGIN
+    DIALOG  "Converti file audio", IDDLG_CONVERT, 115, 36, 207, 174, WS_VISIBLE,
+            FCF_SYSMENU | FCF_TITLEBAR
+    BEGIN
+        GROUPBOX        "", IDGB_CONVERT, 3, 105, 203, 69
+        LTEXT           "Nome:", IDST_CONVERTNAMELABEL, 7, 156, 32, 8
+        RTEXT           "", IDST_CONVERTNAME, 45, 156, 156, 8
+        LTEXT           "? Hz", IDST_CONVERTSAMPLERATE, 7, 131, 91, 8
+        LTEXT           "? canali", IDST_CONVERTCHANNELS, 7, 120, 91, 8
+        LTEXT           "", IDST_CONVERTCDBITS, 103, 142, 98, 8
+        LTEXT           "(CD: 44100 Hz)", IDST_CONVERTCDSAMPLELABEL, 103, 131,
+                        98, 8
+        LTEXT           "(CD: 2 canali)", IDST_CONVERTCDCHANNELSLABEL, 103,
+                        120, 98, 8
+        LTEXT           "Durata: ?", IDST_CONVERTPLAYTIME, 7, 109, 161, 8
+        GROUPBOX        "", IDGB_CONVERT2, 3, 19, 203, 85
+        LTEXT           "Converti in:", 317, 7, 86, 86, 8
+        CONTROL         "", IDDD_IOPROC, 7, 28, 195, 54, WC_COMBOBOX,
+                        CBS_DROPDOWNLIST | WS_GROUP | WS_TABSTOP |
+                        WS_VISIBLE
+
+        LTEXT           "Nome destinazione:", 2419, 7, 57, 64, 8
+        ENTRYFIELD      "", IDEF_CONVERTTARGETNAME, 9, 45, 139, 8, ES_RIGHT |
+                        ES_MARGIN
+        PUSHBUTTON      "S~foglia", IDPB_CONVERTBROWSE, 153, 42, 47, 14
+        CONTROL         "", IDBAR_CONVERTPROGRESS, 6, 24, 194, 13,
+                        "CW_PERCENTBAR", 5 | WS_GROUP | WS_VISIBLE
+        DEFPUSHBUTTON   "~Converti", IDPB_CONVERTOK, 20, 2, 47, 14
+        PUSHBUTTON      "~Annulla", IDPB_CONVERTABORT, 71, 2, 40, 14
+        PUSHBUTTON      "C~hiudi", IDPB_CONVERTCLOSE, 135, 2, 40, 14
+    END
+END
Index: /tags/CWMM-0.3.0_GA/classes/res/it/audioconv_it.rc
===================================================================
--- /tags/CWMM-0.3.0_GA/classes/res/it/audioconv_it.rc	(revision 213)
+++ /tags/CWMM-0.3.0_GA/classes/res/it/audioconv_it.rc	(revision 213)
@@ -0,0 +1,19 @@
+#ifndef OS2_INCLUDED
+   #include <os2.h>
+#endif
+
+
+STRINGTABLE
+BEGIN
+
+IDSTR_CONVERTCHANNELS    "%d canali"
+IDSTR_CONVERTSAMPLERATE  "%d Hz"
+IDSTR_CONVERTPLAYTIME    "Durata: %d:%02d minuti"
+IDSTR_CONVERTDIALOGERROR "Impossibile trovare il modello dialogo! Verificare la corretta installazione della procedura."
+IDSTR_CONVERTNOSPACETITLE   "Converti in wave"
+IDSTR_CONVERTNOSPACETEXT   "Non c' spazio sufficiente per il file decodificato. Scegliere un percorso differente, con almeno %d MB di spazio disco libero."
+IDSTR_INSTALLERRORTITLE  "Problema di installazione"
+IDSTR_AUDIOBROWSETITLE   "Nome file audio"
+
+END
+
Index: /tags/CWMM-0.3.0_GA/classes/res/it/audioplayer_it.dlg
===================================================================
--- /tags/CWMM-0.3.0_GA/classes/res/it/audioplayer_it.dlg	(revision 213)
+++ /tags/CWMM-0.3.0_GA/classes/res/it/audioplayer_it.dlg	(revision 213)
@@ -0,0 +1,26 @@
+#ifndef OS2_INCLUDED
+   #include <os2.h>
+#endif
+
+DLGTEMPLATE IDDLG_MMPLAYER LOADONCALL MOVEABLE DISCARDABLE
+BEGIN
+    DIALOG  "Audio player", IDDLG_MMPLAYER, 68, 78, 207, 124,
+            WS_VISIBLE, FCF_SYSMENU | FCF_TITLEBAR
+    BEGIN
+        CONTROL         "", ID_CLIENT, 18, 0, 56, 67, WC_STATIC, SS_FGNDRECT |
+                        WS_GROUP | WS_VISIBLE
+        CONTROL         "~Stop", IDPB_MMPLAYERSTOP, 40, 25, 22, 14, WC_BUTTON,
+                        BS_USERBUTTON | WS_VISIBLE| WS_TABSTOP
+        CONTROL         "~Pause", IDPB_MMPLAYERPAUSE, 61, 25, 20, 14, WC_BUTTON,
+                        BS_USERBUTTON | WS_VISIBLE
+        CONTROL         "P~lay", IDPB_MMPLAYERPLAY, 79, 25, 20, 14, WC_BUTTON,
+                        BS_USERBUTTON | WS_VISIBLE
+        CTEXT           "0:00", IDST_MMPLAYERPLAYTIME, 123, 14, 134, 13, DT_VCENTER
+                        PRESPARAMS PP_FONTNAMESIZE, "10.Helv"
+;        CONTROL         "VolumeArm", IDSL_MMPLAYERVOLUMEARM, 209, 5, 14, 14,
+;                        WC_BUTTON, BS_USERBUTTON | WS_TABSTOP|BS_USERBUTTON
+;        PUSHBUTTON      "Volume", IDSL_MMPLAYERVOLUME, 19, 4, 69, 14,
+;                        BS_NOPOINTERFOCUS | NOT WS_TABSTOP | NOT WS_VISIBLE |BS_USERBUTTON
+
+    END
+END
Index: /tags/CWMM-0.3.0_GA/classes/res/it/audioplayer_it.rc
===================================================================
--- /tags/CWMM-0.3.0_GA/classes/res/it/audioplayer_it.rc	(revision 213)
+++ /tags/CWMM-0.3.0_GA/classes/res/it/audioplayer_it.rc	(revision 213)
@@ -0,0 +1,15 @@
+#ifndef OS2_INCLUDED
+   #include <os2.h>
+#endif
+
+MENU  ID_MENUTIMECONTEXT
+BEGIN
+	MENUITEM "Tempo ~trascorso"   ,       ID_MENUITEMELAPSED
+	MENUITEM "Tempo ~rimanente" ,         ID_MENUITEMREMAINING
+	MENUITEM "Informazioni ~traccia" ,    ID_MENUITEMID3
+END
+
+STRINGTABLE
+BEGIN
+IDSTR_MASTERVOLUMEITEM "~Volume generale"
+END
Index: /tags/CWMM-0.3.0_GA/classes/res/it/classvolume_it.dlg
===================================================================
--- /tags/CWMM-0.3.0_GA/classes/res/it/classvolume_it.dlg	(revision 213)
+++ /tags/CWMM-0.3.0_GA/classes/res/it/classvolume_it.dlg	(revision 213)
@@ -0,0 +1,15 @@
+#ifndef OS2_INCLUDED
+   #include <os2.h>
+#endif
+
+DLGTEMPLATE IDDLG_CLASSVOLUME LOADONCALL MOVEABLE DISCARDABLE
+BEGIN
+    DIALOG  "Volume", IDDLG_CLASSVOLUME, 68, 78, 207, 124, 
+            WS_VISIBLE, FCF_SYSMENU | FCF_TITLEBAR
+    BEGIN
+        CONTROL         "", ID_CLASSVOLCLIENT, 18, 0, 56, 67, WC_STATIC, SS_FGNDRECT | 
+                        WS_GROUP | WS_VISIBLE 
+
+    END
+END
+
Index: /tags/CWMM-0.3.0_GA/classes/res/it/cwaudio_it.dlg
===================================================================
--- /tags/CWMM-0.3.0_GA/classes/res/it/cwaudio_it.dlg	(revision 213)
+++ /tags/CWMM-0.3.0_GA/classes/res/it/cwaudio_it.dlg	(revision 213)
@@ -0,0 +1,76 @@
+#ifndef OS2_INCLUDED
+   #include <os2.h>
+#endif
+
+DLGTEMPLATE IDDLG_ID3TAGS LOADONCALL MOVEABLE DISCARDABLE
+BEGIN
+    DIALOG  "", IDDLG_ID3TAGS, 92, 13, 209, 120, NOT FS_DLGBORDER |
+            WS_VISIBLE
+    BEGIN
+        PUSHBUTTON      "~Salva", IDPB_ID3SAVE, 44, 1, 40, 14
+        PUSHBUTTON      "~Annulla", IDPB_CANCEL, 87, 1, 40, 14
+        PUSHBUTTON      "A~iuto", IDPB_ID3HELP, 130, 1, 40, 14, BS_HELP
+        GROUPBOX        "Tag ID3", IDGB_ID3TAGS, 6, 17, 202, 97
+        LTEXT           "Nome:", 210, 9, 95, 57, 8
+        ENTRYFIELD      "", IDEF_ID3NAME, 73, 95, 127, 8, ES_MARGIN
+        LTEXT           "Artista:", 211, 9, 82, 57, 8
+        ENTRYFIELD      "", IDEF_ID3ARTIST, 73, 82, 127, 8, ES_MARGIN
+        LTEXT           "Album:", 212, 9, 69, 57, 8
+        ENTRYFIELD      "", IDEF_ID3ALBUM, 73, 69, 127, 8, ES_MARGIN
+        LTEXT           "Commento:", 213, 9, 56, 57, 8
+        ENTRYFIELD      "", IDEF_ID3COMMENT, 73, 56, 127, 8, ES_MARGIN
+        LTEXT           "Anno:", 214, 9, 44, 57, 8
+        ENTRYFIELD      "", IDEF_ID3YEAR, 73, 43, 40, 8, ES_MARGIN
+        LTEXT           "Genere:", 215, 9, 26, 57, 8
+        CONTROL         "", IDDD_ID3GENRE, 71, 5, 99, 31, WC_COMBOBOX,
+                        CBS_DROPDOWN | WS_GROUP | WS_TABSTOP | WS_VISIBLE
+    END
+END
+
+DLGTEMPLATE IDDLG_WAVEINFOPAGE LOADONCALL MOVEABLE DISCARDABLE
+BEGIN
+    DIALOG  "", IDDLG_WAVEINFOPAGE, 91, 31, 169, 109, NOT FS_DLGBORDER |
+            WS_VISIBLE | NOT WS_SAVEBITS
+    BEGIN
+        GROUPBOX        "Informazioni audio", IDGB_WAVEINFO, 6, 4, 154, 67, NOT
+                        WS_GROUP
+        LTEXT           "Frequenza campionamento:", IDST_SAMPLERATELABEL, 17, 35, 76, 8
+        LTEXT           "Bit per campione:", IDST_BPSLABEL, 17, 23, 76, 8
+        LTEXT           "Durata:", IDST_PLAYTIMELABEL, 17, 47, 76, 8
+        LTEXT           "Canali:", IDST_CHANNELSLABEL, 17, 12, 76, 8
+        LTEXT           "??:??", IDST_PLAYTIME, 108, 47, 39, 8
+        LTEXT           "??", IDST_SAMPLERATE, 108, 35, 39, 8
+        LTEXT           "??", IDST_BPS, 108, 23, 39, 8
+        LTEXT           "??", IDST_CHANNELS, 108, 12, 39, 8
+    END
+END
+
+DLGTEMPLATE IDDLG_IMAGEINFOPAGE LOADONCALL MOVEABLE DISCARDABLE
+BEGIN
+    DIALOG  "", IDDLG_IMAGEINFOPAGE, 91, 31, 169, 109, NOT FS_DLGBORDER |
+            WS_VISIBLE
+    BEGIN
+        GROUPBOX        "Informazioni immagine", IDGB_IMAGEINFO, 6, 4, 154, 78,
+                        NOT WS_GROUP
+        LTEXT           "Larghezza:", IDST_IMAGEWIDTHLABEL, 17, 35, 76, 8
+        LTEXT           "Altezza:", IDST_IMAGEHEIGHTLABEL, 17, 23, 76, 8
+        LTEXT           "Profondit
+:", IDST_COLORDEPTHLABEL, 17, 12, 76, 8
+        LTEXT           "??", IDST_IMAGEWIDTH, 108, 35, 39, 8
+        LTEXT           "??", IDST_IMAGEHEIGHT, 108, 23, 39, 8
+        LTEXT           "??", IDST_COLORDEPTH, 108, 12, 39, 8
+        LTEXT           "", IDST_IMAGEFORMAT, 17, 48, 135, 21, DT_WORDBREAK
+    END
+END
+
+DLGTEMPLATE IDDLG_STREAMURLPAGE LOADONCALL MOVEABLE DISCARDABLE
+BEGIN
+    DIALOG  "", IDDLG_STREAMURLPAGE, 91, 31, 169, 109, NOT FS_DLGBORDER |
+            WS_VISIBLE
+    BEGIN
+        GROUPBOX        "URL", IDGB_STREAMURL, 6, 4, 154, 61, NOT WS_GROUP
+        ENTRYFIELD      "", IDEF_URL, 13, 23, 140, 8, ES_MARGIN
+        LTEXT           "Specificare l'URL del server streaming:", IDST_URLTEXT, 12,
+                        37, 143, 8
+    END
+END
Index: /tags/CWMM-0.3.0_GA/classes/res/it/cwaudio_it.rc
===================================================================
--- /tags/CWMM-0.3.0_GA/classes/res/it/cwaudio_it.rc	(revision 213)
+++ /tags/CWMM-0.3.0_GA/classes/res/it/cwaudio_it.rc	(revision 213)
@@ -0,0 +1,129 @@
+#ifndef OS2_INCLUDED
+   #include <os2.h>
+#endif
+
+
+MENU ID_MENU_VOLUME
+BEGIN
+        MENUITEM "V~olume",ID_MENU_VOLUME
+END
+
+MENU ID_MENU_START
+BEGIN
+        MENUITEM "A~vvia",ID_MENU_START
+END
+
+MENU ID_MENU_STOP
+BEGIN
+        MENUITEM "~Stop", ID_MENU_STOP
+END
+
+MENU ID_MENU_PAUSE
+BEGIN
+        MENUITEM "~Pausa", ID_MENU_PAUSE
+END
+
+MENU ID_MENU_RESUME
+BEGIN
+        MENUITEM "~Riprendi", ID_MENU_RESUME
+END
+
+MENU ID_MENU_EDITOR
+BEGIN
+        MENUITEM "Editor ~audio", ID_MENU_EDITOR
+END
+
+MENU ID_MENU_PLAYER
+BEGIN
+        MENUITEM "P~layer", ID_MENU_PLAYER
+END
+
+MENU ID_MENU_CONVERT
+BEGIN
+	SUBMENU  "~Converti in",ID_MENU_CONVERT
+	BEGIN
+        MENUITEM "~WAV (RIFF WAVE Digital Audio)", ID_ITEM_CONVERT
+	END
+END
+
+MENU ID_MENUICONSIZE
+BEGIN
+;   MENUITEM  "" , ID_MENUICONSIZE, MIS_SEPARATOR
+   MENUITEM "Icone normali", ID_NORMALICONSITEM
+   MENUITEM  "50 * 50" , ID_50X50ITEM
+   MENUITEM  "100 * 100" , ID_100X100ITEM
+   MENUITEM  "150 * 150" , ID_150X150ITEM
+   MENUITEM  "200 * 200" , ID_200X200ITEM
+   MENUITEM  "250 * 250" , ID_250X250ITEM
+END
+
+MENU ID_MENU_M3UEDITOR
+BEGIN
+        MENUITEM "~Editor playlist", ID_MENU_M3UEDITOR
+END
+
+MENU ID_MENU_M3UPLAYER
+BEGIN
+        MENUITEM "~Esegui playlist", ID_MENU_M3UPLAYER
+END
+
+
+STRINGTABLE
+BEGIN
+ID_WAVEINFOPAGENAME "Informazioni ~audio"
+ID_ID3TAGSPAGENAME  "Tag ~ID3"
+ID_TRACKNAMEPAGENAME "Nome ~traccia"
+IDSTR_TRACKNAME      "Nome traccia"
+
+IDSTR_PLAYTIME      "Durata"
+IDSTR_SAMPLERATE    "Frequenza campionamento"
+IDSTR_CHANNELS      "Canali"
+IDSTR_BPS           "Bit per campione"
+
+;IDSTR_BITRATE       "Bitrate"
+;IDSTR_VBR           "VBR"
+
+IDSTR_TITLE         "Titolo"
+IDSTR_ARTIST        "Artista"
+IDSTR_ALBUM         "Album"
+IDSTR_YEAR          "Anno"
+IDSTR_COMMENT       "Commento"
+IDSTR_GENRE         "Genere"
+
+IDSTR_HELPLIBRARY      "MMPARTS.HLP"
+IDSTR_CWMMDATAFILETITLE "MMData file"
+;Titles of audio classes
+IDSTR_CWAUDIOTITLE   "Digital Audio"
+IDSTR_AIFTITLE       "AIFAudio.AIF"
+IDSTR_AUTITLE        "AUAudio.AU"
+IDSTR__AUTITLE       "_AUAudio._AU"
+IDSTR_IFFTITLE       "IFFAudio.IFF"
+IDSTR_SNDFTITLE      "SNDAudio.SND"
+IDSTR_VOCTITLE       "VOCAudio.VOC"
+IDSTR_WAVTITLE       "WAVAudio.WAV"
+IDSTR_OGGTITLE       "OGGAudio.OGG"
+IDSTR_MP3TITLE       "MP3Audio.MP3"
+IDSTR_MIDITITLE       "MIDI.MID"
+IDSTR_FLACTITLE       "FLACAudio.FLA"
+
+
+IDSTR_LIGHTTABLETITLE "Light table"
+
+IDSTR_ICONSIZEMENU    "Dimen~sioni icona"
+;Used as an information when starting and audio file from the WPS
+IDSTR_STARTINGTRACK      "Avvio traccia..."
+IDSTR_AUDIOSCANNING     "Scansione file audio..."
+IDSTR_AUDIOSTREAMTITLE  "Flusso audio"
+IDSTR_STREAMURLPAGENAME "Impostazioni ~URL"
+IDSTR_CDTRACKTITLE      "Traccia CD"
+IDSTR_M3UTITLE          "Playlist M3U"
+;Titles used when starting player and editor applications
+IDSTR_AUDPLAYERTITLE       "Audio player"
+IDSTR_AUDEDITORTITLE       "Editor audio"
+IDSTR_M3UEDITORTITLE       "Editor playlist"
+IDSTR_TRACKPAUSED          " (in pausa)"
+;Used for window list
+IDSTR_VOLUMETITLE       "Volume"
+
+END
+
Index: /tags/CWMM-0.3.0_GA/classes/res/it/cwimage_it.rc
===================================================================
--- /tags/CWMM-0.3.0_GA/classes/res/it/cwimage_it.rc	(revision 213)
+++ /tags/CWMM-0.3.0_GA/classes/res/it/cwimage_it.rc	(revision 213)
@@ -0,0 +1,50 @@
+#ifndef OS2_INCLUDED
+   #include <os2.h>
+#endif
+
+
+MENU ID_MENU_IMGEDITOR
+BEGIN
+        MENUITEM "~Editor immagini", ID_MENU_IMGEDITOR
+END
+
+
+STRINGTABLE
+BEGIN
+IDSTR_MENU_CONVERT "~Converti in"
+
+IDSTR_AVCTITLE      "AVCImage._IM"
+IDSTR_DIBTITLE      "DIBImage.DIB"
+IDSTR_GIFTITLE      "GIFImage.GIF"
+IDSTR_JPGTITLE      "JPGImage.JPG"
+IDSTR_PCDTITLE      "PCDImage.PCD"
+IDSTR_PCXTITLE      "PCXImage.PCX"
+IDSTR_TGATITLE      "TargaImage.TGA"
+IDSTR_TIFTITLE      "TIFImage.TIF"
+IDSTR_PNGTITLE      "PNGImage.PNG"
+IDSTR_MMOTIONTITLE  "VIDImage.VID"
+IDSTR_CWIMAGETITLE  "Digital image"
+
+IDSTR_IMAGEINFOPAGENAME "Informazioni i~mmagine"
+IDSTR_SPRINTFPIXEL	"%d Pixel"
+IDSTR_SPRINTFBIT        "%d Bit"
+;Bitmpap load errors
+IDSTR_NOIMGIOPROCERROR   "Non  stata trovata la procedura I/O corretta per questo tipo di immagine."
+IDSTR_OPENFILEERRORTITLE "Errore file"
+IDSTR_OPENFILEERROR      "Impossibile aprire il file."
+IDSTR_NOMEMERROR         "Non vi  memoria disponibile."
+IDSTR_IMGIOPROCCRASH     "Si  verificato un errore interno durante l'apertura dell'immagine. RIAVVIARE LA SCRIVANIA per evitare che il sistema diventi instabile! Tutte le applicazioni in funzione resteranno aperte."
+
+IDSTR_IMAGEDETAIL_WIDTH   "Larghezza"
+IDSTR_IMAGEDETAIL_HEIGHT  "Altezza"
+IDSTR_IMAGEDETAIL_DEPTH   "Profondit
+"
+IDSTR_IMAGEDETAIL_FORMAT  "Formato"
+
+;Titles used when starting player and editor applications
+IDSTR_IMGEDITORTITLE       "Visualizzatore immagini"
+IDSTR_MENU_IMAGEINFO       "Informazioni immagine: %d x %d x %d"
+
+;IDSTR_HELPLIBRARY   "MMPARTS.HLP"
+END
+
Index: /tags/CWMM-0.3.0_GA/classes/res/it/cwvideo_it.rc
===================================================================
--- /tags/CWMM-0.3.0_GA/classes/res/it/cwvideo_it.rc	(revision 213)
+++ /tags/CWMM-0.3.0_GA/classes/res/it/cwvideo_it.rc	(revision 213)
@@ -0,0 +1,13 @@
+
+STRINGTABLE 
+BEGIN
+;Titles of video classes
+IDSTR_CWVIDEOTITLE       "Digital video"
+IDSTR_MPGTITLE       	 "MPGVideo.MPG"
+IDSTR_MOVTITLE       	 "MOVVideo.MOV"
+IDSTR_FLITITLE       	 "FLIVideo.FLI"
+IDSTR_AVITITLE       	 "AVIVideo.AVI"
+IDSTR_VIDPLAYERTITLE       "Video Player"
+
+END
+
Index: /tags/CWMM-0.3.0_GA/classes/res/it/def.tpl
===================================================================
--- /tags/CWMM-0.3.0_GA/classes/res/it/def.tpl	(revision 213)
+++ /tags/CWMM-0.3.0_GA/classes/res/it/def.tpl	(revision 213)
@@ -0,0 +1,26 @@
+# Note: lines starting with '#' are comments.
+
+[DESCRIPTION]
+IT MM Resource-DLL
+
+[COPYRIGHT]
+(c) C. Wohlgemuth 2001-2005 Netlabs CWMM Team 2023
+
+[AUTHOR]
+Netlabs CWMM Team
+
+[NAME]
+# This is the NAME xxx WINDOWAPI|etc line in the def file.
+# Important: it specifies the internal name of the program. Don't leave out!
+LIBRARY MMRES_IT INITINSTANCE TERMINSTANCE
+
+[BUILDMACHINE]
+Zobopeep
+
+[OTHER]
+# Add all the lines here you want to have at the end of the generated DEF file
+PROTMODE
+CODE LOADONCALL DISCARDABLE
+DATA MULTIPLE NONSHARED
+EXPORTS
+        queryLanguage
Index: /tags/CWMM-0.3.0_GA/classes/res/it/imageconv_it.dlg
===================================================================
--- /tags/CWMM-0.3.0_GA/classes/res/it/imageconv_it.dlg	(revision 213)
+++ /tags/CWMM-0.3.0_GA/classes/res/it/imageconv_it.dlg	(revision 213)
@@ -0,0 +1,28 @@
+#ifndef OS2_INCLUDED
+   #include <os2.h>
+#endif
+
+DLGTEMPLATE IDDLG_IMGCONVERT LOADONCALL MOVEABLE DISCARDABLE
+BEGIN
+    DIALOG  "Converti immagine digitale", IDDLG_IMGCONVERT, 68, 78, 207, 191,
+            WS_VISIBLE, FCF_SYSMENU | FCF_TITLEBAR
+    BEGIN
+        GROUPBOX        "", IDGB_IMGCONVERT, 2, 19, 203, 172
+        LTEXT           "Nome:", IDST_IMGCONVERTNAMELABEL, 7, 173, 32, 8
+        LTEXT           "", IDST_IMGCONVERTNAME, 44, 173, 156, 8
+        CONTROL         "", IDSR_BMP, 12, 100, 185, 69, WC_STATIC,
+                        SS_FGNDRECT | WS_GROUP | WS_VISIBLE
+        LTEXT           "Converti in", IDST_IMGCONVERTTO, 7, 88, 53, 8
+        CONTROL         "", IDDD_IMGIOPROC, 6, 6, 196, 78, WC_COMBOBOX,
+                        CBS_DROPDOWNLIST | LS_HORZSCROLL | WS_GROUP |
+                        WS_TABSTOP | WS_VISIBLE
+        LTEXT           "Nome destinazione:", 2419, 7, 57, 64, 8
+        ENTRYFIELD      "", IDEF_IMGCONVERTTARGETNAME, 9, 45, 139, 8, ES_MARGIN
+        PUSHBUTTON      "S~foglia", IDPB_IMGCONVERTBROWSE, 153, 42, 47, 14
+        CONTROL         "", IDBAR_IMGCONVERTPROGRESS, 6, 24, 194, 13,
+                        "CW_PERCENTBAR", 5 | WS_GROUP | WS_VISIBLE
+        DEFPUSHBUTTON   "~Converti", IDPB_IMGCONVERTOK, 20, 2, 47, 14
+        PUSHBUTTON      "~Annulla", IDPB_IMGCONVERTABORT, 71, 2, 40, 14
+        PUSHBUTTON      "C~hiudi", IDPB_IMGCONVERTCLOSE, 135, 2, 40, 14
+    END
+END
Index: /tags/CWMM-0.3.0_GA/classes/res/it/imageconv_it.rc
===================================================================
--- /tags/CWMM-0.3.0_GA/classes/res/it/imageconv_it.rc	(revision 213)
+++ /tags/CWMM-0.3.0_GA/classes/res/it/imageconv_it.rc	(revision 213)
@@ -0,0 +1,9 @@
+#ifndef OS2_INCLUDED
+   #include <os2.h>
+#endif
+
+
+STRINGTABLE
+BEGIN
+IDSTR_IMAGEBROWSETITLE   "Nome file immagine"
+END
Index: /tags/CWMM-0.3.0_GA/classes/res/it/makefile
===================================================================
--- /tags/CWMM-0.3.0_GA/classes/res/it/makefile	(revision 213)
+++ /tags/CWMM-0.3.0_GA/classes/res/it/makefile	(revision 213)
@@ -0,0 +1,54 @@
+# Makefile for CWMM resource dll
+
+include ../../../make.inc
+include ../../../build.inc
+
+LANGUAGE	=	_it
+
+CC           = icc
+CPPFLAGS     = /Ge- /Gm+ /G4 /Gl  /O+ /Oc+ /Ol- /Q+ $(VACDEBUG)
+INC	=	../../inc
+DEFS         =
+#TOOLDIR =      $(BUILD_ROOT)\classes\mm-progs
+OBJDIR	=	../dll
+
+OBJECTS	= 	$(INC)\mmres.h mmres$(LANGUAGE).rc \
+			audioplayer$(LANGUAGE).dlg audioplayer$(LANGUAGE).rc \
+			audioconv$(LANGUAGE).dlg audioconv$(LANGUAGE).rc \
+			volume$(LANGUAGE).rc volume$(LANGUAGE).dlg \
+			imageconv$(LANGUAGE).dlg imageconv$(LANGUAGE).rc \
+			cwaudio$(LANGUAGE).rc cwaudio$(LANGUAGE).dlg \
+			cwimage$(LANGUAGE).rc cwvideo$(LANGUAGE).rc \
+			mmfind$(LANGUAGE).dlg mmfind$(LANGUAGE).rc
+
+
+all:	$(OBJDIR)/mmres$(LANGUAGE).dll
+
+$(OBJDIR)/mmres$(LANGUAGE).dll:	mmres$(LANGUAGE).c $(OBJECTS) 
+		cmd /C $(TOOLDIR)/create_def.cmd mmres$(LANGUAGE).def
+		icc $(CPPFLAGS) -I$(INC) /Fe$(OBJDIR)\$@ $< mmres$(LANGUAGE).def
+		rc -D $(ECS) -i $(INC) mmres$(LANGUAGE).rc $(OBJDIR)/mmres$(LANGUAGE).dll
+		rc -r -D $(ECS) -i $(INC) mmres$(LANGUAGE).rc $(OBJDIR)/mmres$(LANGUAGE).res
+#		rc  mmres$(LANGUAGE).res $(OBJDIR)/mmres$(LANGUAGE).dll
+
+#(OBJDIR)/mmres$(LANGUAGE).res:	mmres$(LANGUAGE).rc $(OBJECTS)
+#		rc -D $(ECS) -i $(INC) -r mmres$(LANGUAGE).rc
+
+
+restest:	
+	echo  $(deftext)> test.def
+
+                		
+clean:
+	-rm $(OBJDIR)/*.obj
+	-rm $(OBJDIR)/*.dll
+	-rm $(OBJDIR)/*.res
+	-rm *.*~
+	-rm *.flc
+	-rm *.RES
+	-rm *.obj
+	-rm *.def
+
+
+	
+
Index: /tags/CWMM-0.3.0_GA/classes/res/it/mmfind_it.dlg
===================================================================
--- /tags/CWMM-0.3.0_GA/classes/res/it/mmfind_it.dlg	(revision 213)
+++ /tags/CWMM-0.3.0_GA/classes/res/it/mmfind_it.dlg	(revision 213)
@@ -0,0 +1,56 @@
+#ifndef OS2_INCLUDED
+   #include <os2.h>
+#endif
+
+DLGTEMPLATE IDDLG_MMFIND LOADONCALL MOVEABLE DISCARDABLE
+BEGIN
+    DIALOG  "Trova file multimedia", IDDLG_MMFIND, 12, 23, 338, 133, WS_VISIBLE | WS_SYNCPAINT,
+            FCF_SYSMENU | FCF_TITLEBAR
+            PRESPARAMS PP_FONTNAMESIZE, "9.WarpSans"
+    BEGIN
+        LTEXT           "Apri file", 257, 4, 120, 51, 9, DT_VCENTER |
+                        NOT WS_GROUP
+        ENTRYFIELD      "*", 258, 55, 120, 239, 7, ES_MARGIN | WS_GROUP
+        LTEXT           "Unit
+", 259, 4, 108, 51, 9, DT_VCENTER | NOT
+                        WS_GROUP
+        CONTROL         "H:  [SOURCES]", 260, 54, 18, 87, 99, WC_COMBOBOX,
+                        CBS_DROPDOWNLIST | WS_TABSTOP | WS_VISIBLE
+        LTEXT           "Limita ai file", 261, 174, 4, 46, 9, DT_VCENTER |
+                        NOT WS_GROUP | NOT WS_VISIBLE
+        CONTROL         "<Tutti i file>", 262, 209, 4, 29, 8, WC_COMBOBOX,
+                        CBS_DROPDOWNLIST | WS_TABSTOP
+        LTEXT           "Cartella", 263, 4, 97, 35, 7, NOT WS_GROUP
+        LTEXT           "", 270, 42, 98, 60, 6, NOT WS_GROUP | NOT
+                        WS_VISIBLE
+        LTEXT           "File", 265, 131, 97, 17, 7, NOT WS_GROUP
+        AUTOCHECKBOX    "Sola lettura", 269, 171, 97, 42, 8, NOT WS_TABSTOP |
+                        NOT WS_VISIBLE
+        LISTBOX         264, 4, 17, 116, 76, LS_OWNERDRAW | LS_HORZSCROLL
+        LISTBOX         266, 125, 17, 116, 76, LS_HORZSCROLL
+        RTEXT           "Tipo di file", IDST_TYPE, 146, 108, 58, 9, DT_VCENTER
+        CONTROL         "", IDCB_TYPEOFFILE, 208, 18, 87, 99, WC_COMBOBOX,
+                        CBS_DROPDOWNLIST | WS_GROUP | WS_TABSTOP |
+                        WS_VISIBLE
+        GROUPBOX        "Anteprima", IDGB_PREVIEW, 245, 16, 89, 80, NOT WS_VISIBLE
+        CONTROL         "", IDSR_IMGPREVIEW, 249, 20, 82, 68, WC_STATIC, SS_FGNDRECT |
+                        WS_GROUP
+        CTEXT           "Anteprima non disponibile", IDST_NOPREVIEWAVAILABLE, 251, 42, 78, 33,
+                        DT_WORDBREAK | NOT WS_VISIBLE
+        LTEXT           "", IDST_AUDIOINFO, 253, 41, 75, 42, DT_WORDBREAK | NOT
+                        WS_VISIBLE
+        GROUPBOX        "Informazioni audio", IDGB_AUDIOINFO, 245, 17, 89, 79, NOT WS_VISIBLE
+        PUSHBUTTON      "Stop", IDPB_MMFINDSTOP, 267, 19, 21, 10, 
+                        BS_NOPOINTERFOCUS | NOT WS_TABSTOP
+        PUSHBUTTON      "Play", IDPB_MMFINDPLAY, 291, 19, 21, 10, 
+                        BS_NOPOINTERFOCUS | NOT WS_TABSTOP
+        DEFPUSHBUTTON   "~OK", DID_OK, 3, 2, 40, 12
+        PUSHBUTTON      "~Nuovo", IDPB_NEWFILE, 46, 2, 40, 12
+        PUSHBUTTON      "A~pplica", 268, 293, 3, 40, 12, NOT WS_TABSTOP | NOT
+                        WS_VISIBLE
+        PUSHBUTTON      "~Annulla", DID_CANCEL, 95, 2, 40, 12, NOT WS_TABSTOP
+        PUSHBUTTON      "A~iuto", 267, 243, 2, 40, 12, BS_NOPOINTERFOCUS | NOT
+                        WS_TABSTOP | NOT WS_VISIBLE
+        LISTBOX         3, 0, 0, 2, 1, NOT WS_TABSTOP | NOT WS_VISIBLE
+    END
+END
Index: /tags/CWMM-0.3.0_GA/classes/res/it/mmfind_it.rc
===================================================================
--- /tags/CWMM-0.3.0_GA/classes/res/it/mmfind_it.rc	(revision 213)
+++ /tags/CWMM-0.3.0_GA/classes/res/it/mmfind_it.rc	(revision 213)
@@ -0,0 +1,13 @@
+#ifndef OS2_INCLUDED
+   #include <os2.h>
+#endif
+
+STRINGTABLE
+BEGIN
+IDSTR_TYPEAUDIO       "Audio"
+IDSTR_TYPEIMAGE       "Immagine"
+IDSTR_TYPEVIDEO       "Video"
+IDSTR_AUDIOINFOTEXT   "Tempo trascorso:\t%02d:%02d\x0a\x0aFrequenza campionamento:\t%d\x0a\x0aBit per campione:\t%d\x0a\x0aCanali:\t%d"
+IDSTR_NOMMTEMPLATEFLDRTITLE "Errore durante la creazione del file"
+IDSTR_NOMMTEMPLATEFLDR "Impossibile trovare il modello per la cartella multimedia. Potrebbe essersi persa la ID oggetto <MMPM2_MMTEMPLATEFOLDER>."
+END
Index: /tags/CWMM-0.3.0_GA/classes/res/it/mmres_it.c
===================================================================
--- /tags/CWMM-0.3.0_GA/classes/res/it/mmres_it.c	(revision 213)
+++ /tags/CWMM-0.3.0_GA/classes/res/it/mmres_it.c	(revision 213)
@@ -0,0 +1,25 @@
+/*
+ * This file is (C) Chris Wohlgemuth 2003
+ */
+/*
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; see the file COPYING.  If not, write to
+ * the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+
+#include <os2.h>
+
+PSZ queryLanguage()
+{
+  return "Italiano";
+}
Index: /tags/CWMM-0.3.0_GA/classes/res/it/mmres_it.rc
===================================================================
--- /tags/CWMM-0.3.0_GA/classes/res/it/mmres_it.rc	(revision 213)
+++ /tags/CWMM-0.3.0_GA/classes/res/it/mmres_it.rc	(revision 213)
@@ -0,0 +1,33 @@
+#define  INCL_GRAPHICBUTTON   /* need this for the graphic buttons control */
+#define  INCL_BITMAP
+
+#ifndef OS2_INCLUDED
+   #include <os2.h>
+#endif
+#include <sw.h>
+
+#include "mmres.h"
+;#include "version.h"
+;#include "build.h"
+
+
+;Dialog Resources for volume.exe
+rcinclude "volume_it.rc"
+rcinclude "volume_it.dlg"
+
+rcinclude "audioconv_it.rc"
+rcinclude "audioconv_it.dlg"
+
+rcinclude "imageconv_it.rc"
+rcinclude "imageconv_it.dlg"
+
+rcinclude "audioplayer_it.rc"
+rcinclude "audioplayer_it.dlg"
+
+rcinclude "classvolume_it.dlg"
+
+rcinclude "cwaudio_it.rc"
+rcinclude "cwaudio_it.dlg"
+
+rcinclude "cwimage_it.rc"
+rcinclude "cwvideo_it.rc"
Index: /tags/CWMM-0.3.0_GA/classes/res/it/volume_it.dlg
===================================================================
--- /tags/CWMM-0.3.0_GA/classes/res/it/volume_it.dlg	(revision 213)
+++ /tags/CWMM-0.3.0_GA/classes/res/it/volume_it.dlg	(revision 213)
@@ -0,0 +1,21 @@
+#ifndef OS2_INCLUDED
+   #include <os2.h>
+#endif
+#define INCL_GRAPHICBUTTON
+#include <sw.h>
+
+
+DLGTEMPLATE IDDLG_VOLUME LOADONCALL MOVEABLE DISCARDABLE
+BEGIN
+    DIALOG  "Volume", IDDLG_VOLUME, 73, 148, 112, 56,  
+             WS_VISIBLE, FCF_SYSMENU | FCF_TITLEBAR |  FCF_TASKLIST |
+            FCF_MINBUTTON
+    BEGIN
+        CONTROL         "~Volume", IDCS_VOLUME, 3, 3, 63, 44, WC_CIRCULARSLIDER, 
+                        WS_GROUP | WS_VISIBLE | WS_TABSTOP
+        CONTROL         "~Mute", IDPB_MUTE ,  65, 17, 40, 14, WC_GRAPHICBUTTON,
+			 WS_VISIBLE | GBS_AUTOTWOSTATE | WS_TABSTOP
+        GROUPBOX        "", IDGB_VOLUME, 1, 2, 109, 53
+    END
+END
+
Index: /tags/CWMM-0.3.0_GA/classes/res/it/volume_it.rc
===================================================================
--- /tags/CWMM-0.3.0_GA/classes/res/it/volume_it.rc	(revision 213)
+++ /tags/CWMM-0.3.0_GA/classes/res/it/volume_it.rc	(revision 213)
@@ -0,0 +1,10 @@
+#ifndef OS2_INCLUDED
+   #include <os2.h>
+#endif
+
+MENU    IDM_POPUP
+BEGIN
+    MENUITEM    "~Nascondi barra del titolo",    IDM_ITEMTITLEBAR
+    MENUITEM    "",    0, MIS_SEPARATOR
+    MENUITEM    "~Esci",    IDM_ITEMEXIT
+END
Index: /tags/CWMM-0.3.0_GA/classes/res/makefile
===================================================================
--- /tags/CWMM-0.3.0_GA/classes/res/makefile	(revision 213)
+++ /tags/CWMM-0.3.0_GA/classes/res/makefile	(revision 213)
@@ -0,0 +1,18 @@
+# Makefile
+
+include ../../make.inc
+
+.PHONY:		clean cleaner clean_nlv
+
+all:	nlv 
+	cd common_res && make
+
+nlv:
+	@echo Creating laguage resources
+	@for %i in ( $(LANGUAGES) ) do ( @echo Creating %i language resources && cd %i && make && cd .. ) 
+
+clean_nlv:
+	@for %i in ($(LANGUAGES)) do (cd %i && make clean && cd ..) 
+		
+clean:	clean_nlv
+	-cd common_res && make clean
Index: /tags/CWMM-0.3.0_GA/classes/res/nl/audioconv_nl.dlg
===================================================================
--- /tags/CWMM-0.3.0_GA/classes/res/nl/audioconv_nl.dlg	(revision 213)
+++ /tags/CWMM-0.3.0_GA/classes/res/nl/audioconv_nl.dlg	(revision 213)
@@ -0,0 +1,38 @@
+#ifndef OS2_INCLUDED
+   #include <os2.h>
+#endif
+
+DLGTEMPLATE IDDLG_CONVERT LOADONCALL MOVEABLE DISCARDABLE
+BEGIN
+    DIALOG  "Omzetten geluidsbestand", IDDLG_CONVERT, 115, 36, 207, 174, WS_VISIBLE, 
+            FCF_SYSMENU | FCF_TITLEBAR
+    BEGIN
+        GROUPBOX        "", IDGB_CONVERT, 3, 105, 203, 69
+        LTEXT           "Naam:", IDST_CONVERTNAMELABEL, 7, 156, 32, 8
+        RTEXT           "", IDST_CONVERTNAME, 45, 156, 156, 8
+        LTEXT           "? Hz", IDST_CONVERTSAMPLERATE, 7, 131, 91, 8
+        LTEXT           "? Kanalen", IDST_CONVERTCHANNELS, 7, 120, 91, 8
+        LTEXT           "", IDST_CONVERTCDBITS, 103, 142, 98, 8
+        LTEXT           "(Cd: 44100 Hz)", IDST_CONVERTCDSAMPLELABEL, 103, 131, 
+                        98, 8
+        LTEXT           "(Cd: 2 Kanalen)", IDST_CONVERTCDCHANNELSLABEL, 103, 
+                        120, 98, 8
+        LTEXT           "Speelduur: ?", IDST_CONVERTPLAYTIME, 7, 109, 161, 8
+        GROUPBOX        "", IDGB_CONVERT2, 3, 19, 203, 85
+        LTEXT           "Omzetten naar:", 317, 7, 86, 86, 8
+        CONTROL         "", IDDD_IOPROC, 7, 28, 195, 54, WC_COMBOBOX, 
+                        CBS_DROPDOWNLIST | WS_GROUP | WS_TABSTOP | 
+                        WS_VISIBLE
+
+        LTEXT           "Naam doel:", 2419, 7, 57, 64, 8
+        ENTRYFIELD      "", IDEF_CONVERTTARGETNAME, 9, 45, 139, 8, ES_RIGHT | 
+                        ES_MARGIN
+        PUSHBUTTON      "~Bladeren...", IDPB_CONVERTBROWSE, 153, 42, 47, 14
+        CONTROL         "", IDBAR_CONVERTPROGRESS, 6, 24, 194, 13, 
+                        "CW_PERCENTBAR", 5 | WS_GROUP | WS_VISIBLE
+        DEFPUSHBUTTON   "~Omzetten", IDPB_CONVERTOK, 20, 2, 47, 14
+        PUSHBUTTON      "~Annuleren", IDPB_CONVERTABORT, 71, 2, 40, 14
+        PUSHBUTTON      "S~luiten", IDPB_CONVERTCLOSE, 135, 2, 40, 14
+    END
+END
+
Index: /tags/CWMM-0.3.0_GA/classes/res/nl/audioconv_nl.rc
===================================================================
--- /tags/CWMM-0.3.0_GA/classes/res/nl/audioconv_nl.rc	(revision 213)
+++ /tags/CWMM-0.3.0_GA/classes/res/nl/audioconv_nl.rc	(revision 213)
@@ -0,0 +1,20 @@
+#ifndef OS2_INCLUDED
+   #include <os2.h>
+#endif
+
+
+STRINGTABLE 
+BEGIN
+
+IDSTR_CONVERTCHANNELS    "%d Kanalen"
+IDSTR_CONVERTSAMPLERATE  "%d Hz"
+IDSTR_CONVERTPLAYTIME    "%d:%02d min speelduur"
+IDSTR_CONVERTDIALOGERROR "Kan het dialoog sjabloon niet laden! Controleer a.u.b. uw installatie."
+IDSTR_CONVERTNOSPACETITLE   "Omzetten naar wave"
+IDSTR_CONVERTNOSPACETEXT   "Er is niet genoeg ruimte voor het gedecodeerde bestand. Kies een andere locatie met tenminste %d MB vrije schijfruimte."
+IDSTR_INSTALLERRORTITLE  "Installatie probleem"
+IDSTR_AUDIOBROWSETITLE   "Naam geluidsbestand"
+
+END
+
+
Index: /tags/CWMM-0.3.0_GA/classes/res/nl/audioplayer_nl.dlg
===================================================================
--- /tags/CWMM-0.3.0_GA/classes/res/nl/audioplayer_nl.dlg	(revision 213)
+++ /tags/CWMM-0.3.0_GA/classes/res/nl/audioplayer_nl.dlg	(revision 213)
@@ -0,0 +1,27 @@
+#ifndef OS2_INCLUDED
+   #include <os2.h>
+#endif
+
+DLGTEMPLATE IDDLG_MMPLAYER LOADONCALL MOVEABLE DISCARDABLE
+BEGIN
+    DIALOG  "Geluidsspeler", IDDLG_MMPLAYER, 68, 78, 207, 124, 
+            WS_VISIBLE, FCF_SYSMENU | FCF_TITLEBAR
+    BEGIN
+        CONTROL         "", ID_CLIENT, 18, 0, 56, 67, WC_STATIC, SS_FGNDRECT | 
+                        WS_GROUP | WS_VISIBLE 
+        CONTROL         "~Stop", IDPB_MMPLAYERSTOP, 40, 25, 22, 14, WC_BUTTON, 
+                        BS_USERBUTTON | WS_VISIBLE| WS_TABSTOP
+        CONTROL         "~Pauze", IDPB_MMPLAYERPAUSE, 61, 25, 20, 14, WC_BUTTON, 
+                        BS_USERBUTTON | WS_VISIBLE
+        CONTROL         "Afspe~len", IDPB_MMPLAYERPLAY, 79, 25, 20, 14, WC_BUTTON, 
+                        BS_USERBUTTON | WS_VISIBLE
+        CTEXT           "0:00", IDST_MMPLAYERPLAYTIME, 123, 14, 134, 13, DT_VCENTER
+                        PRESPARAMS PP_FONTNAMESIZE, "10.Helv"
+;        CONTROL         "VolumeArm", IDSL_MMPLAYERVOLUMEARM, 209, 5, 14, 14, 
+;                        WC_BUTTON, BS_USERBUTTON | WS_TABSTOP|BS_USERBUTTON
+;        PUSHBUTTON      "Volume", IDSL_MMPLAYERVOLUME, 19, 4, 69, 14, 
+;                        BS_NOPOINTERFOCUS | NOT WS_TABSTOP | NOT WS_VISIBLE |BS_USERBUTTON
+
+    END
+END
+
Index: /tags/CWMM-0.3.0_GA/classes/res/nl/audioplayer_nl.rc
===================================================================
--- /tags/CWMM-0.3.0_GA/classes/res/nl/audioplayer_nl.rc	(revision 213)
+++ /tags/CWMM-0.3.0_GA/classes/res/nl/audioplayer_nl.rc	(revision 213)
@@ -0,0 +1,16 @@
+#ifndef OS2_INCLUDED
+   #include <os2.h>
+#endif
+
+MENU  ID_MENUTIMECONTEXT
+BEGIN
+	MENUITEM "V~erstreken tijd"   ,          ID_MENUITEMELAPSED
+	MENUITEM "~Resterende tijd" ,          ID_MENUITEMREMAINING
+	MENUITEM "~Spoor informatie" ,         ID_MENUITEMID3
+END
+
+STRINGTABLE
+BEGIN
+IDSTR_MASTERVOLUMEITEM "Hoofd ~volume"
+END
+
Index: /tags/CWMM-0.3.0_GA/classes/res/nl/classvolume_nl.dlg
===================================================================
--- /tags/CWMM-0.3.0_GA/classes/res/nl/classvolume_nl.dlg	(revision 213)
+++ /tags/CWMM-0.3.0_GA/classes/res/nl/classvolume_nl.dlg	(revision 213)
@@ -0,0 +1,15 @@
+#ifndef OS2_INCLUDED
+   #include <os2.h>
+#endif
+
+DLGTEMPLATE IDDLG_CLASSVOLUME LOADONCALL MOVEABLE DISCARDABLE
+BEGIN
+    DIALOG  "Volume", IDDLG_CLASSVOLUME, 68, 78, 207, 124, 
+            WS_VISIBLE, FCF_SYSMENU | FCF_TITLEBAR
+    BEGIN
+        CONTROL         "", ID_CLASSVOLCLIENT, 18, 0, 56, 67, WC_STATIC, SS_FGNDRECT | 
+                        WS_GROUP | WS_VISIBLE 
+
+    END
+END
+
Index: /tags/CWMM-0.3.0_GA/classes/res/nl/cwaudio_nl.dlg
===================================================================
--- /tags/CWMM-0.3.0_GA/classes/res/nl/cwaudio_nl.dlg	(revision 213)
+++ /tags/CWMM-0.3.0_GA/classes/res/nl/cwaudio_nl.dlg	(revision 213)
@@ -0,0 +1,77 @@
+#ifndef OS2_INCLUDED
+   #include <os2.h>
+#endif
+
+DLGTEMPLATE IDDLG_ID3TAGS LOADONCALL MOVEABLE DISCARDABLE
+BEGIN
+    DIALOG  "", IDDLG_ID3TAGS, 92, 13, 209, 120, NOT FS_DLGBORDER | 
+            WS_VISIBLE
+    BEGIN
+        PUSHBUTTON      "Op~slaan", IDPB_ID3SAVE, 44, 1, 40, 14
+        PUSHBUTTON      "~Annuleren", IDPB_CANCEL, 87, 1, 40, 14
+        PUSHBUTTON      "~Hulp", IDPB_ID3HELP, 130, 1, 40, 14, BS_HELP
+        GROUPBOX        "ID3 Tags", IDGB_ID3TAGS, 6, 17, 202, 97
+        LTEXT           "Naam:", 210, 9, 95, 57, 8
+        ENTRYFIELD      "", IDEF_ID3NAME, 73, 95, 127, 8, ES_MARGIN
+        LTEXT           "Artiest:", 211, 9, 82, 57, 8
+        ENTRYFIELD      "", IDEF_ID3ARTIST, 73, 82, 127, 8, ES_MARGIN
+        LTEXT           "Album:", 212, 9, 69, 57, 8
+        ENTRYFIELD      "", IDEF_ID3ALBUM, 73, 69, 127, 8, ES_MARGIN
+        LTEXT           "Commentaar:", 213, 9, 56, 57, 8
+        ENTRYFIELD      "", IDEF_ID3COMMENT, 73, 56, 127, 8, ES_MARGIN
+        LTEXT           "Jaar:", 214, 9, 44, 57, 8
+        ENTRYFIELD      "", IDEF_ID3YEAR, 73, 43, 40, 8, ES_MARGIN
+        LTEXT           "Genre:", 215, 9, 26, 57, 8
+        CONTROL         "", IDDD_ID3GENRE, 71, 5, 99, 31, WC_COMBOBOX, 
+                        CBS_DROPDOWN | WS_GROUP | WS_TABSTOP | WS_VISIBLE
+    END
+END
+
+DLGTEMPLATE IDDLG_WAVEINFOPAGE LOADONCALL MOVEABLE DISCARDABLE
+BEGIN
+    DIALOG  "", IDDLG_WAVEINFOPAGE, 91, 31, 169, 109, NOT FS_DLGBORDER | 
+            WS_VISIBLE | NOT WS_SAVEBITS
+    BEGIN
+        GROUPBOX        "Geluidsinformatie", IDGB_WAVEINFO, 6, 4, 154, 67, NOT 
+                        WS_GROUP
+        LTEXT           "Samplesnelheid:", IDST_SAMPLERATELABEL, 17, 35, 76, 8
+        LTEXT           "Bits per sample:", IDST_BPSLABEL, 17, 23, 76, 8
+        LTEXT           "Speelduur:", IDST_PLAYTIMELABEL, 17, 47, 76, 8
+        LTEXT           "Kanalen:", IDST_CHANNELSLABEL, 17, 12, 76, 8
+        LTEXT           "??:??", IDST_PLAYTIME, 108, 47, 39, 8
+        LTEXT           "??", IDST_SAMPLERATE, 108, 35, 39, 8
+        LTEXT           "??", IDST_BPS, 108, 23, 39, 8
+        LTEXT           "??", IDST_CHANNELS, 108, 12, 39, 8
+    END
+END
+
+DLGTEMPLATE IDDLG_IMAGEINFOPAGE LOADONCALL MOVEABLE DISCARDABLE
+BEGIN
+    DIALOG  "", IDDLG_IMAGEINFOPAGE, 91, 31, 169, 109, NOT FS_DLGBORDER | 
+            WS_VISIBLE
+    BEGIN
+        GROUPBOX        "Beeld informatie", IDGB_IMAGEINFO, 6, 4, 154, 78, 
+                        NOT WS_GROUP
+        LTEXT           "Breedte:", IDST_IMAGEWIDTHLABEL, 17, 35, 76, 8
+        LTEXT           "Hoogte:", IDST_IMAGEHEIGHTLABEL, 17, 23, 76, 8
+        LTEXT           "Diepte:", IDST_COLORDEPTHLABEL, 17, 12, 76, 8
+        LTEXT           "??", IDST_IMAGEWIDTH, 108, 35, 39, 8
+        LTEXT           "??", IDST_IMAGEHEIGHT, 108, 23, 39, 8
+        LTEXT           "??", IDST_COLORDEPTH, 108, 12, 39, 8
+        LTEXT           "", IDST_IMAGEFORMAT, 17, 48, 135, 21, DT_WORDBREAK
+    END
+END
+
+DLGTEMPLATE IDDLG_STREAMURLPAGE LOADONCALL MOVEABLE DISCARDABLE
+BEGIN
+    DIALOG  "", IDDLG_STREAMURLPAGE, 91, 31, 169, 109, NOT FS_DLGBORDER | 
+            WS_VISIBLE
+    BEGIN
+        PUSHBUTTON      "~Hulp", IDPB_STREAMHELP, 130, 1, 40, 14, BS_HELP
+        GROUPBOX        "URL", IDGB_STREAMURL, 6, 4, 154, 61, NOT WS_GROUP
+        ENTRYFIELD      "", IDEF_URL, 13, 23, 140, 8, ES_MARGIN
+        LTEXT           "Voer URL voor streaming server in:", IDST_URLTEXT, 12, 
+                        37, 143, 8
+    END
+END
+
Index: /tags/CWMM-0.3.0_GA/classes/res/nl/cwaudio_nl.rc
===================================================================
--- /tags/CWMM-0.3.0_GA/classes/res/nl/cwaudio_nl.rc	(revision 213)
+++ /tags/CWMM-0.3.0_GA/classes/res/nl/cwaudio_nl.rc	(revision 213)
@@ -0,0 +1,130 @@
+#ifndef OS2_INCLUDED
+   #include <os2.h>
+#endif
+
+
+MENU ID_MENU_VOLUME
+BEGIN
+        MENUITEM "~Volume",ID_MENU_VOLUME       
+END
+
+MENU ID_MENU_START
+BEGIN
+        MENUITEM "~Start",ID_MENU_START       
+END
+
+MENU ID_MENU_STOP
+BEGIN
+        MENUITEM "~Stop", ID_MENU_STOP       
+END
+
+MENU ID_MENU_PAUSE
+BEGIN
+        MENUITEM "~Pauze", ID_MENU_PAUSE       
+END
+
+MENU ID_MENU_RESUME
+BEGIN
+        MENUITEM "Doo~rgaan", ID_MENU_RESUME       
+END
+
+MENU ID_MENU_EDITOR
+BEGIN
+        MENUITEM "~Geluidseditor", ID_MENU_EDITOR       
+END
+
+MENU ID_MENU_PLAYER
+BEGIN
+        MENUITEM "Afs~peler", ID_MENU_PLAYER       
+END
+
+MENU ID_MENU_CONVERT
+BEGIN
+	SUBMENU  "~Omzetten naar",ID_MENU_CONVERT
+	BEGIN
+        MENUITEM "~WAV (RIFF WAVE Digitaal Geluid)", ID_ITEM_CONVERT
+	END
+END
+
+MENU ID_MENUICONSIZE
+BEGIN
+;   MENUITEM  "" , ID_MENUICONSIZE, MIS_SEPARATOR
+   MENUITEM "Gewone pictogrammen", ID_NORMALICONSITEM
+   MENUITEM  "50 * 50" , ID_50X50ITEM
+   MENUITEM  "100 * 100" , ID_100X100ITEM
+   MENUITEM  "150 * 150" , ID_150X150ITEM
+   MENUITEM  "200 * 200" , ID_200X200ITEM
+   MENUITEM  "250 * 250" , ID_250X250ITEM
+END
+
+MENU ID_MENU_M3UEDITOR
+BEGIN
+        MENUITEM "Afspeellijst ~editor", ID_MENU_M3UEDITOR       
+END
+
+MENU ID_MENU_M3UPLAYER
+BEGIN
+        MENUITEM "S~peel deze lijst", ID_MENU_M3UPLAYER       
+END
+
+
+STRINGTABLE 
+BEGIN
+ID_WAVEINFOPAGENAME "~Geluidsinformatie"
+ID_ID3TAGSPAGENAME  "~ID3 Tags"
+ID_TRACKNAMEPAGENAME "~Spoor naam"
+IDSTR_TRACKNAME      "Spoornaam"
+
+IDSTR_PLAYTIME      "Speelduur"
+IDSTR_SAMPLERATE    "Samplesnelheid"
+IDSTR_CHANNELS      "Kanalen"
+IDSTR_BPS           "Bits per sample"
+
+;IDSTR_BITRATE       "Bitsnelheid"
+;IDSTR_VBR           "VBR"
+
+IDSTR_TITLE         "Titel"
+IDSTR_ARTIST        "Artiest"
+IDSTR_ALBUM         "Album"
+IDSTR_YEAR          "Jaar"
+IDSTR_COMMENT       "Commentaar"
+IDSTR_GENRE         "Genre"
+
+IDSTR_HELPLIBRARY      "MMPARTS.HLP"
+IDSTR_CWMMDATAFILETITLE "MMGegevens bestand"
+;Titles of audio classes
+IDSTR_CWAUDIOTITLE   "Digitaal Geluid"
+IDSTR_AIFTITLE       "AIFAudio.AIF"
+IDSTR_AUTITLE        "AUAudio.AU"
+IDSTR__AUTITLE       "_AUAudio._AU"
+IDSTR_IFFTITLE       "IFFAudio.IFF"
+IDSTR_SNDFTITLE      "SNDAudio.SND"
+IDSTR_VOCTITLE       "VOCAudio.VOC"
+IDSTR_WAVTITLE       "WAVAudio.WAV"
+IDSTR_OGGTITLE       "OGGAudio.OGG"
+IDSTR_MP3TITLE       "MP3Audio.MP3"
+IDSTR_MIDITITLE       "MIDI.MID"
+IDSTR_FLACTITLE       "FLACAudio.FLA"
+
+
+IDSTR_LIGHTTABLETITLE "Light table"
+
+IDSTR_ICONSIZEMENU    "Pictogram ~grootte"
+;Used as an information when starting and audio file from the WPS
+IDSTR_STARTINGTRACK      "Begin spoor..."
+IDSTR_AUDIOSCANNING     "Geluidsbestand scannen..."
+IDSTR_AUDIOSTREAMTITLE  "Geluidsstroom"
+IDSTR_STREAMURLPAGENAME "~URL-instelling"
+IDSTR_CDTRACKTITLE      "Cd-spoor"
+IDSTR_M3UTITLE          "M3U afspeellijst"
+;Titles used when starting player and editor applications
+IDSTR_AUDPLAYERTITLE       "Geluidsspeler"
+IDSTR_AUDEDITORTITLE       "Geluids editor"
+IDSTR_M3UEDITORTITLE       "Afspeellijst editor"
+IDSTR_TRACKPAUSED          " (onderbroken)"
+;Used for window list
+IDSTR_VOLUMETITLE       "Volume"
+
+END
+
+
Index: /tags/CWMM-0.3.0_GA/classes/res/nl/cwimage_nl.rc
===================================================================
--- /tags/CWMM-0.3.0_GA/classes/res/nl/cwimage_nl.rc	(revision 213)
+++ /tags/CWMM-0.3.0_GA/classes/res/nl/cwimage_nl.rc	(revision 213)
@@ -0,0 +1,50 @@
+#ifndef OS2_INCLUDED
+   #include <os2.h>
+#endif
+
+
+MENU ID_MENU_IMGEDITOR
+BEGIN
+        MENUITEM "Afbeelding ~editor", ID_MENU_IMGEDITOR       
+END
+
+
+STRINGTABLE 
+BEGIN
+IDSTR_MENU_CONVERT "~Omzetten naar"
+
+IDSTR_AVCTITLE      "AVCImage._IM"
+IDSTR_DIBTITLE      "DIBImage.DIB"
+IDSTR_GIFTITLE      "GIFImage.GIF"
+IDSTR_JPGTITLE      "JPGImage.JPG"
+IDSTR_PCDTITLE      "PCDImage.PCD"
+IDSTR_PCXTITLE      "PCXImage.PCX"
+IDSTR_TGATITLE      "TargaImage.TGA"
+IDSTR_TIFTITLE      "TIFImage.TIF"
+IDSTR_PNGTITLE      "PNGImage.PNG"
+IDSTR_MMOTIONTITLE  "VIDImage.VID"
+IDSTR_CWIMAGETITLE  "Digitaal beeld"
+
+IDSTR_IMAGEINFOPAGENAME "~Beeld informatie"
+IDSTR_SPRINTFPIXEL	"%d Pixel"
+IDSTR_SPRINTFBIT       "%d Bit"
+;Bitmpap load errors
+IDSTR_NOIMGIOPROCERROR   "Geen input/output programma gevonden voor dit beeld."
+IDSTR_OPENFILEERRORTITLE "Bestandsfout"
+IDSTR_OPENFILEERROR      "Kan het bestand niet openen."
+IDSTR_NOMEMERROR         "Geen geheugen beschikbaar."
+IDSTR_IMGIOPROCCRASH     "Interne fout tijdens het openen van het beeld. De werkplek MOET herstart worden anders kan het systeem instabiel worden! Alle draaiende programma's zullen actief blijven."
+
+IDSTR_IMAGEDETAIL_WIDTH   "Breedte"
+IDSTR_IMAGEDETAIL_HEIGHT  "Hoogte"
+IDSTR_IMAGEDETAIL_DEPTH   "Diepte"
+IDSTR_IMAGEDETAIL_FORMAT  "Formaat"
+
+;Titles used when starting player and editor applications
+IDSTR_IMGEDITORTITLE       "Beeld bekijker"
+IDSTR_MENU_IMAGEINFO        "Beeld informatie: %d x %d x %d"
+
+;IDSTR_HELPLIBRARY   "MMPARTS.HLP"
+END
+
+
Index: /tags/CWMM-0.3.0_GA/classes/res/nl/cwvideo_nl.rc
===================================================================
--- /tags/CWMM-0.3.0_GA/classes/res/nl/cwvideo_nl.rc	(revision 213)
+++ /tags/CWMM-0.3.0_GA/classes/res/nl/cwvideo_nl.rc	(revision 213)
@@ -0,0 +1,13 @@
+
+STRINGTABLE 
+BEGIN
+;Titles of video classes
+IDSTR_CWVIDEOTITLE       "Digitale video"
+IDSTR_MPGTITLE       	 "MPGVideo.MPG"
+IDSTR_MOVTITLE       	 "MOVVideo.MOV"
+IDSTR_FLITITLE       	 "FLIVideo.FLI"
+IDSTR_AVITITLE       	 "AVIVideo.AVI"
+IDSTR_VIDPLAYERTITLE       "Video Speler"
+
+END
+
Index: /tags/CWMM-0.3.0_GA/classes/res/nl/def.tpl
===================================================================
--- /tags/CWMM-0.3.0_GA/classes/res/nl/def.tpl	(revision 213)
+++ /tags/CWMM-0.3.0_GA/classes/res/nl/def.tpl	(revision 213)
@@ -0,0 +1,26 @@
+# Note: lines starting with '#' are comments.
+
+[DESCRIPTION]
+NL MM Resource-DLL
+
+[COPYRIGHT]
+(c) C. Wohlgemuth 2001_2005 Netlabs CWMM Team 2023
+
+[AUTHOR]
+Netlabs CWMM Team
+
+[NAME]
+# This is the NAME xxx WINDOWAPI|etc line in the def file.
+# Important: it specifies the internal name of the program. Don't leave out!
+LIBRARY MMRES_NL INITINSTANCE TERMINSTANCE
+
+[BUILDMACHINE]
+Zobopeep
+
+[OTHER]
+# Add all the lines here you want to have at the end of the generated DEF file
+PROTMODE
+CODE LOADONCALL DISCARDABLE
+DATA MULTIPLE NONSHARED
+EXPORTS
+        queryLanguage
Index: /tags/CWMM-0.3.0_GA/classes/res/nl/imageconv_nl.dlg
===================================================================
--- /tags/CWMM-0.3.0_GA/classes/res/nl/imageconv_nl.dlg	(revision 213)
+++ /tags/CWMM-0.3.0_GA/classes/res/nl/imageconv_nl.dlg	(revision 213)
@@ -0,0 +1,29 @@
+#ifndef OS2_INCLUDED
+   #include <os2.h>
+#endif
+
+DLGTEMPLATE IDDLG_IMGCONVERT LOADONCALL MOVEABLE DISCARDABLE
+BEGIN
+    DIALOG  "Omzetten digitaal beeld", IDDLG_IMGCONVERT, 68, 78, 207, 191, 
+            WS_VISIBLE, FCF_SYSMENU | FCF_TITLEBAR
+    BEGIN
+        GROUPBOX        "", IDGB_IMGCONVERT, 2, 19, 203, 172
+        LTEXT           "Naam:", IDST_IMGCONVERTNAMELABEL, 7, 173, 32, 8
+        LTEXT           "", IDST_IMGCONVERTNAME, 44, 173, 156, 8
+        CONTROL         "", IDSR_BMP, 12, 100, 185, 69, WC_STATIC, 
+                        SS_FGNDRECT | WS_GROUP | WS_VISIBLE
+        LTEXT           "Omzetten naar", IDST_IMGCONVERTTO, 7, 88, 53, 8
+        CONTROL         "", IDDD_IMGIOPROC, 6, 6, 196, 78, WC_COMBOBOX, 
+                        CBS_DROPDOWNLIST | LS_HORZSCROLL | WS_GROUP | 
+                        WS_TABSTOP | WS_VISIBLE
+        LTEXT           "Naam doel:", 2419, 7, 57, 64, 8
+        ENTRYFIELD      "", IDEF_IMGCONVERTTARGETNAME, 9, 45, 139, 8, ES_MARGIN
+        PUSHBUTTON      "~Bladeren...", IDPB_IMGCONVERTBROWSE, 153, 42, 47, 14
+        CONTROL         "", IDBAR_IMGCONVERTPROGRESS, 6, 24, 194, 13, 
+                        "CW_PERCENTBAR", 5 | WS_GROUP | WS_VISIBLE
+        DEFPUSHBUTTON   "~Omzetten", IDPB_IMGCONVERTOK, 20, 2, 47, 14
+        PUSHBUTTON      "~Annuleren", IDPB_IMGCONVERTABORT, 71, 2, 40, 14
+        PUSHBUTTON      "Afs~luiten", IDPB_IMGCONVERTCLOSE, 135, 2, 40, 14
+    END
+END
+
Index: /tags/CWMM-0.3.0_GA/classes/res/nl/imageconv_nl.rc
===================================================================
--- /tags/CWMM-0.3.0_GA/classes/res/nl/imageconv_nl.rc	(revision 213)
+++ /tags/CWMM-0.3.0_GA/classes/res/nl/imageconv_nl.rc	(revision 213)
@@ -0,0 +1,10 @@
+#ifndef OS2_INCLUDED
+   #include <os2.h>
+#endif
+
+
+STRINGTABLE
+BEGIN
+IDSTR_IMAGEBROWSETITLE   "Beeld bestandsnaam"
+END
+
Index: /tags/CWMM-0.3.0_GA/classes/res/nl/makefile
===================================================================
--- /tags/CWMM-0.3.0_GA/classes/res/nl/makefile	(revision 213)
+++ /tags/CWMM-0.3.0_GA/classes/res/nl/makefile	(revision 213)
@@ -0,0 +1,54 @@
+# Makefile for CWMM resource dll
+
+include ../../../make.inc
+include ../../../build.inc
+
+LANGUAGE	=	_nl
+
+CC           = icc
+CPPFLAGS     = /Ge- /Gm+ /G4 /Gl  /O+ /Oc+ /Ol- /Q+ $(VACDEBUG)
+INC	=	../../inc
+DEFS         =
+#TOOLDIR =      $(BUILD_ROOT)\classes\mm-progs
+OBJDIR	=	../dll
+
+OBJECTS	= 	$(INC)\mmres.h mmres$(LANGUAGE).rc \
+			audioplayer$(LANGUAGE).dlg audioplayer$(LANGUAGE).rc \
+			audioconv$(LANGUAGE).dlg audioconv$(LANGUAGE).rc \
+			volume$(LANGUAGE).rc volume$(LANGUAGE).dlg \
+			imageconv$(LANGUAGE).dlg imageconv$(LANGUAGE).rc \
+			cwaudio$(LANGUAGE).rc cwaudio$(LANGUAGE).dlg \
+			cwimage$(LANGUAGE).rc cwvideo$(LANGUAGE).rc \
+			mmfind$(LANGUAGE).dlg mmfind$(LANGUAGE).rc
+
+
+all:	$(OBJDIR)/mmres$(LANGUAGE).dll
+
+$(OBJDIR)/mmres$(LANGUAGE).dll:	mmres$(LANGUAGE).c $(OBJECTS) 
+		cmd /C $(TOOLDIR)/create_def.cmd mmres$(LANGUAGE).def
+		icc $(CPPFLAGS) -I$(INC) /Fe$(OBJDIR)\$@ $< mmres$(LANGUAGE).def
+		rc -D $(ECS) -i $(INC) mmres$(LANGUAGE).rc $(OBJDIR)/mmres$(LANGUAGE).dll
+		rc -r -D $(ECS) -i $(INC) mmres$(LANGUAGE).rc $(OBJDIR)/mmres$(LANGUAGE).res
+#		rc  mmres$(LANGUAGE).res $(OBJDIR)/mmres$(LANGUAGE).dll
+
+#(OBJDIR)/mmres$(LANGUAGE).res:	mmres$(LANGUAGE).rc $(OBJECTS)
+#		rc -D $(ECS) -i $(INC) -r mmres$(LANGUAGE).rc
+
+
+restest:	
+	echo  $(deftext)> test.def
+
+                		
+clean:
+	-rm $(OBJDIR)/*.obj
+	-rm $(OBJDIR)/*.dll
+	-rm $(OBJDIR)/*.res
+	-rm *.*~
+	-rm *.flc
+	-rm *.RES
+	-rm *.obj
+	-rm *.def
+
+
+	
+
Index: /tags/CWMM-0.3.0_GA/classes/res/nl/mmfind_nl.dlg
===================================================================
--- /tags/CWMM-0.3.0_GA/classes/res/nl/mmfind_nl.dlg	(revision 213)
+++ /tags/CWMM-0.3.0_GA/classes/res/nl/mmfind_nl.dlg	(revision 213)
@@ -0,0 +1,55 @@
+#ifndef OS2_INCLUDED
+   #include <os2.h>
+#endif
+
+DLGTEMPLATE IDDLG_MMFIND LOADONCALL MOVEABLE DISCARDABLE
+BEGIN
+    DIALOG  "Find Multimedia File", IDDLG_MMFIND, 12, 23, 338, 133, WS_VISIBLE | WS_SYNCPAINT, 
+            FCF_SYSMENU | FCF_TITLEBAR
+            PRESPARAMS PP_FONTNAMESIZE, "9.WarpSans"
+    BEGIN
+        LTEXT           "Open filename", 257, 4, 120, 51, 9, DT_VCENTER | 
+                        NOT WS_GROUP
+        ENTRYFIELD      "*", 258, 55, 120, 239, 7, ES_MARGIN | WS_GROUP
+        LTEXT           "Drive", 259, 4, 108, 51, 9, DT_VCENTER | NOT 
+                        WS_GROUP
+        CONTROL         "H:  [SOURCES]", 260, 54, 18, 87, 99, WC_COMBOBOX, 
+                        CBS_DROPDOWNLIST | WS_TABSTOP | WS_VISIBLE
+        LTEXT           "Restrict files to", 261, 174, 4, 46, 9, DT_VCENTER | 
+                        NOT WS_GROUP | NOT WS_VISIBLE
+        CONTROL         "<All Files>", 262, 209, 4, 29, 8, WC_COMBOBOX, 
+                        CBS_DROPDOWNLIST | WS_TABSTOP
+        LTEXT           "Directory", 263, 4, 97, 35, 7, NOT WS_GROUP
+        LTEXT           "", 270, 42, 98, 60, 6, NOT WS_GROUP | NOT 
+                        WS_VISIBLE
+        LTEXT           "File", 265, 131, 97, 17, 7, NOT WS_GROUP
+        AUTOCHECKBOX    "Read-Only", 269, 171, 97, 42, 8, NOT WS_TABSTOP | 
+                        NOT WS_VISIBLE
+        LISTBOX         264, 4, 17, 116, 76, LS_OWNERDRAW | LS_HORZSCROLL
+        LISTBOX         266, 125, 17, 116, 76, LS_HORZSCROLL
+        RTEXT           "Type of file", IDST_TYPE, 146, 108, 58, 9, DT_VCENTER
+        CONTROL         "", IDCB_TYPEOFFILE, 208, 18, 87, 99, WC_COMBOBOX, 
+                        CBS_DROPDOWNLIST | WS_GROUP | WS_TABSTOP | 
+                        WS_VISIBLE
+        GROUPBOX        "Preview", IDGB_PREVIEW, 245, 16, 89, 80, NOT WS_VISIBLE
+        CONTROL         "", IDSR_IMGPREVIEW, 249, 20, 82, 68, WC_STATIC, SS_FGNDRECT | 
+                        WS_GROUP
+        CTEXT           "No preview available", IDST_NOPREVIEWAVAILABLE, 251, 42, 78, 33, 
+                        DT_WORDBREAK | NOT WS_VISIBLE
+        LTEXT           "", IDST_AUDIOINFO, 253, 41, 75, 42, DT_WORDBREAK | NOT 
+                        WS_VISIBLE
+        GROUPBOX        "Audio info", IDGB_AUDIOINFO, 245, 17, 89, 79, NOT WS_VISIBLE
+        PUSHBUTTON      "Stop", IDPB_MMFINDSTOP, 267, 19, 21, 10, 
+                        BS_NOPOINTERFOCUS | NOT WS_TABSTOP
+        PUSHBUTTON      "Play", IDPB_MMFINDPLAY, 291, 19, 21, 10, 
+                        BS_NOPOINTERFOCUS | NOT WS_TABSTOP
+        DEFPUSHBUTTON   "~OK", DID_OK, 3, 2, 40, 12
+        PUSHBUTTON      "~New...", IDPB_NEWFILE, 46, 2, 40, 12
+        PUSHBUTTON      "Apply", 268, 293, 3, 40, 12, NOT WS_TABSTOP | NOT 
+                        WS_VISIBLE
+        PUSHBUTTON      "~Cancel", DID_CANCEL, 95, 2, 40, 12, NOT WS_TABSTOP
+        PUSHBUTTON      "Help", 267, 243, 2, 40, 12, BS_NOPOINTERFOCUS | NOT 
+                        WS_TABSTOP | NOT WS_VISIBLE
+        LISTBOX         3, 0, 0, 2, 1, NOT WS_TABSTOP | NOT WS_VISIBLE
+    END
+END
Index: /tags/CWMM-0.3.0_GA/classes/res/nl/mmfind_nl.rc
===================================================================
--- /tags/CWMM-0.3.0_GA/classes/res/nl/mmfind_nl.rc	(revision 213)
+++ /tags/CWMM-0.3.0_GA/classes/res/nl/mmfind_nl.rc	(revision 213)
@@ -0,0 +1,13 @@
+#ifndef OS2_INCLUDED
+   #include <os2.h>
+#endif
+
+STRINGTABLE
+BEGIN
+IDSTR_TYPEAUDIO       "Audio"
+IDSTR_TYPEIMAGE       "Image"
+IDSTR_TYPEVIDEO       "Video"
+IDSTR_AUDIOINFOTEXT   "Play time:\t%02d:%02d\x0a\x0aSamplerate:\t%d\x0a\x0aBits per sample:\t%d\x0a\x0aChannels:\t%d"
+IDSTR_NOMMTEMPLATEFLDRTITLE "Error during file creation"
+IDSTR_NOMMTEMPLATEFLDR "Multimedia template folder can't be found. It may has lost the object ID <MMPM2_MMTEMPLATEFOLDER>."
+END
Index: /tags/CWMM-0.3.0_GA/classes/res/nl/mmres_nl.c
===================================================================
--- /tags/CWMM-0.3.0_GA/classes/res/nl/mmres_nl.c	(revision 213)
+++ /tags/CWMM-0.3.0_GA/classes/res/nl/mmres_nl.c	(revision 213)
@@ -0,0 +1,26 @@
+/*
+ * This file is (C) Chris Wohlgemuth 2003
+ */
+/*
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; see the file COPYING.  If not, write to
+ * the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+
+#include <os2.h>
+
+PSZ queryLanguage()
+{
+  return "Nederlands";
+}
+
Index: /tags/CWMM-0.3.0_GA/classes/res/nl/mmres_nl.rc
===================================================================
--- /tags/CWMM-0.3.0_GA/classes/res/nl/mmres_nl.rc	(revision 213)
+++ /tags/CWMM-0.3.0_GA/classes/res/nl/mmres_nl.rc	(revision 213)
@@ -0,0 +1,38 @@
+#define  INCL_GRAPHICBUTTON   /* need this for the graphic buttons control */
+#define  INCL_BITMAP
+
+#ifndef OS2_INCLUDED
+   #include <os2.h>
+#endif
+#include <sw.h>
+
+#include "mmres.h"
+;#include "version.h"
+;#include "build.h"
+
+
+;Dialog Resources for volume.exe
+rcinclude "volume_nl.rc"
+rcinclude "volume_nl.dlg"
+
+rcinclude "audioconv_nl.rc"
+rcinclude "audioconv_nl.dlg"
+
+rcinclude "imageconv_nl.rc"
+rcinclude "imageconv_nl.dlg"
+
+rcinclude "audioplayer_nl.rc"
+rcinclude "audioplayer_nl.dlg"
+
+rcinclude "classvolume_nl.dlg"
+
+rcinclude "cwaudio_nl.rc"
+rcinclude "cwaudio_nl.dlg"
+
+rcinclude "cwimage_nl.rc"
+rcinclude "cwvideo_nl.rc"
+
+rcinclude "mmfind_nl.rc"
+rcinclude "mmfind_nl.dlg"
+
+
Index: /tags/CWMM-0.3.0_GA/classes/res/nl/volume_nl.dlg
===================================================================
--- /tags/CWMM-0.3.0_GA/classes/res/nl/volume_nl.dlg	(revision 213)
+++ /tags/CWMM-0.3.0_GA/classes/res/nl/volume_nl.dlg	(revision 213)
@@ -0,0 +1,21 @@
+#ifndef OS2_INCLUDED
+   #include <os2.h>
+#endif
+#define INCL_GRAPHICBUTTON
+#include <sw.h>
+
+
+DLGTEMPLATE IDDLG_VOLUME LOADONCALL MOVEABLE DISCARDABLE
+BEGIN
+    DIALOG  "Volume", IDDLG_VOLUME, 73, 148, 112, 56,  
+             WS_VISIBLE, FCF_SYSMENU | FCF_TITLEBAR |  FCF_TASKLIST |
+            FCF_MINBUTTON
+    BEGIN
+        CONTROL         "~Volume", IDCS_VOLUME, 3, 3, 63, 44, WC_CIRCULARSLIDER, 
+                        WS_GROUP | WS_VISIBLE | WS_TABSTOP
+        CONTROL         "~Stil", IDPB_MUTE ,  65, 17, 40, 14, WC_GRAPHICBUTTON,
+			 WS_VISIBLE | GBS_AUTOTWOSTATE | WS_TABSTOP
+        GROUPBOX        "", IDGB_VOLUME, 1, 2, 109, 53
+    END
+END
+
Index: /tags/CWMM-0.3.0_GA/classes/res/nl/volume_nl.rc
===================================================================
--- /tags/CWMM-0.3.0_GA/classes/res/nl/volume_nl.rc	(revision 213)
+++ /tags/CWMM-0.3.0_GA/classes/res/nl/volume_nl.rc	(revision 213)
@@ -0,0 +1,11 @@
+#ifndef OS2_INCLUDED
+   #include <os2.h>
+#endif
+
+MENU    IDM_POPUP
+BEGIN
+    MENUITEM    "~Verberg titelbalk",    IDM_ITEMTITLEBAR
+    MENUITEM    "",    0, MIS_SEPARATOR
+    MENUITEM    "~Afsluiten",    IDM_ITEMEXIT
+END
+
Index: /tags/CWMM-0.3.0_GA/classes/res/ru/audioconv_ru.dlg
===================================================================
--- /tags/CWMM-0.3.0_GA/classes/res/ru/audioconv_ru.dlg	(revision 213)
+++ /tags/CWMM-0.3.0_GA/classes/res/ru/audioconv_ru.dlg	(revision 213)
@@ -0,0 +1,37 @@
+#ifndef OS2_INCLUDED
+   #include <os2.h>
+#endif
+
+DLGTEMPLATE IDDLG_CONVERT LOADONCALL MOVEABLE DISCARDABLE
+BEGIN
+    DIALOG  "®­¢¥àâšà®¢ âì  ã€š®ä ©«", IDDLG_CONVERT, 115, 36, 207, 174, WS_VISIBLE, 
+            FCF_SYSMENU | FCF_TITLEBAR
+    BEGIN
+        GROUPBOX        "áå®€­ë©", IDGB_CONVERT, 3, 105, 203, 69
+        LTEXT           "¬ï:", IDST_CONVERTNAMELABEL, 7, 156, 32, 8
+        RTEXT           "", IDST_CONVERTNAME, 45, 156, 156, 8
+        LTEXT           " áâ®â  €šáªà¥âš§ æšš: ? æ", IDST_CONVERTSAMPLERATE, 7, 131, 91, 8
+        LTEXT           " ­ «ë: ?", IDST_CONVERTCHANNELS, 7, 120, 91, 8
+        LTEXT           "šâ ­  á¥¯¬«: ?", IDST_CONVERTCDBITS, 103, 142, 98, 8
+        LTEXT           "(CD: 44100 æ)", IDST_CONVERTCDSAMPLELABEL, 103, 131, 
+                        98, 8
+        LTEXT           "(CD: 2 ª ­ « )", IDST_CONVERTCDCHANNELSLABEL, 103, 
+                        120, 98, 8
+        LTEXT           "à¥¬ï ¢®á¯à®š§¢¥€¥­šï: ?", IDST_CONVERTPLAYTIME, 7, 109, 161, 8
+        GROUPBOX        "®­¥ç­ë©", IDGB_CONVERT2, 3, 19, 203, 85
+        LTEXT           "à¥®¡à §®¢ âì ¢:", 317, 7, 86, 86, 8
+        CONTROL         "", IDDD_IOPROC, 7, 28, 195, 54, WC_COMBOBOX, 
+                        CBS_DROPDOWNLIST | WS_GROUP | WS_TABSTOP | 
+                        WS_VISIBLE
+
+        LTEXT           "¬ï ª®­¥ç­®£® ä ©« :", 2419, 7, 57, 64, 8
+        ENTRYFIELD      "", IDEF_CONVERTTARGETNAME, 9, 45, 139, 8, ES_MARGIN
+
+        PUSHBUTTON      "~¡§®à...", IDPB_CONVERTBROWSE, 153, 42, 47, 14
+        CONTROL         "", IDBAR_CONVERTPROGRESS, 6, 24, 194, 13, 
+                        "CW_PERCENTBAR", 5 | WS_GROUP | WS_VISIBLE
+        DEFPUSHBUTTON   "~®­¢¥àâšà®¢ âì", IDPB_CONVERTOK, 20, 2, 47, 14
+        PUSHBUTTON      "~à¥à¢ âì", IDPB_CONVERTABORT, 71, 2, 40, 14
+        PUSHBUTTON      "~ ªàëâì", IDPB_CONVERTCLOSE, 135, 2, 40, 14
+    END
+END
Index: /tags/CWMM-0.3.0_GA/classes/res/ru/audioconv_ru.rc
===================================================================
--- /tags/CWMM-0.3.0_GA/classes/res/ru/audioconv_ru.rc	(revision 213)
+++ /tags/CWMM-0.3.0_GA/classes/res/ru/audioconv_ru.rc	(revision 213)
@@ -0,0 +1,18 @@
+#ifndef OS2_INCLUDED
+   #include <os2.h>
+#endif
+
+CODEPAGE 866
+STRINGTABLE 
+BEGIN
+
+IDSTR_CONVERTCHANNELS     " ­ «ë: %d"
+IDSTR_CONVERTSAMPLERATE   " áâ®â  €šáªà¥âš§ æšš: %d æ"
+IDSTR_CONVERTPLAYTIME     "à¥¬ï ¢®á¯à®š§¢¥€¥­šï: %d:%02d"
+IDSTR_CONVERTDIALOGERROR  "¥ ã€ ñâáï § £àã§šâì è ¡«®­ €š «®£®¢®£® ®ª­ ! ®Š «ã©áâ , ¯à®¢¥àìâ¥ á¢®î š­áâ ««ïæšî."
+IDSTR_CONVERTNOSPACETITLE "à¥®¡à §®¢ âì ¢ wav"
+IDSTR_CONVERTNOSPACETEXT  "¥€®áâ â®ç­® ¬¥áâ  €«ï €¥ª®€šà®¢ ­­®£® ä ©« . ë¡¥àšâ¥ €àã£®¥ ¬¥áâ® á® á¢®¡®€­ë¬ €šáª®¢ë¬ ¯à®áâà ­áâ¢®¬ ­¥ ¬¥­¥¥ %d ."
+IDSTR_INSTALLERRORTITLE   "à®¡«¥¬  á ãáâ ­®¢ª®©"
+IDSTR_AUDIOBROWSETITLE    "¬ï  ã€š®ä ©« "
+
+END
Index: /tags/CWMM-0.3.0_GA/classes/res/ru/audioplayer_ru.dlg
===================================================================
--- /tags/CWMM-0.3.0_GA/classes/res/ru/audioplayer_ru.dlg	(revision 213)
+++ /tags/CWMM-0.3.0_GA/classes/res/ru/audioplayer_ru.dlg	(revision 213)
@@ -0,0 +1,27 @@
+#ifndef OS2_INCLUDED
+   #include <os2.h>
+#endif
+
+DLGTEMPLATE IDDLG_MMPLAYER LOADONCALL MOVEABLE DISCARDABLE
+BEGIN
+    DIALOG  "ã€š®¯«¥¥à", IDDLG_MMPLAYER, 68, 78, 207, 124, 
+            WS_VISIBLE, FCF_SYSMENU | FCF_TITLEBAR
+    BEGIN
+        CONTROL         "", ID_CLIENT, 18, 0, 56, 67, WC_STATIC, SS_FGNDRECT | 
+                        WS_GROUP | WS_VISIBLE 
+        CONTROL         "~â®¯", IDPB_MMPLAYERSTOP, 40, 25, 22, 14, WC_BUTTON, 
+                        BS_USERBUTTON | WS_VISIBLE| WS_TABSTOP
+        CONTROL         "~ ã§ ", IDPB_MMPLAYERPAUSE, 61, 25, 20, 14, WC_BUTTON, 
+                        BS_USERBUTTON | WS_VISIBLE
+        CONTROL         "~®á¯à®š§¢¥áâš", IDPB_MMPLAYERPLAY, 79, 25, 20, 14, WC_BUTTON, 
+                        BS_USERBUTTON | WS_VISIBLE
+        CTEXT           "0:00", IDST_MMPLAYERPLAYTIME, 123, 14, 134, 13, DT_VCENTER
+                        PRESPARAMS PP_FONTNAMESIZE, "10.Helv"
+;        CONTROL         "VolumeArm", IDSL_MMPLAYERVOLUMEARM, 209, 5, 14, 14, 
+;                        WC_BUTTON, BS_USERBUTTON | WS_TABSTOP|BS_USERBUTTON
+;        PUSHBUTTON      "à®¬ª®áâì", IDSL_MMPLAYERVOLUME, 19, 4, 69, 14, 
+;                        BS_NOPOINTERFOCUS | NOT WS_TABSTOP | NOT WS_VISIBLE |BS_USERBUTTON
+
+    END
+END
+
Index: /tags/CWMM-0.3.0_GA/classes/res/ru/audioplayer_ru.rc
===================================================================
--- /tags/CWMM-0.3.0_GA/classes/res/ru/audioplayer_ru.rc	(revision 213)
+++ /tags/CWMM-0.3.0_GA/classes/res/ru/audioplayer_ru.rc	(revision 213)
@@ -0,0 +1,16 @@
+#ifndef OS2_INCLUDED
+   #include <os2.h>
+#endif
+CODEPAGE 866
+MENU  ID_MENUTIMECONTEXT
+BEGIN
+	MENUITEM "~à¥¬ï ¢®á¯à®š§¢¥€¥­šï" ,   ID_MENUITEMELAPSED
+	MENUITEM "~áâ ¢è¥¥áï ¢à¥¬ï" ,        ID_MENUITEMREMAINING
+	MENUITEM "~­ä®à¬ æšï ® âà¥ª¥" ,      ID_MENUITEMID3
+END
+
+STRINGTABLE
+BEGIN
+IDSTR_MASTERVOLUMEITEM "¡é ï ~à®¬ª®áâì"
+END
+
Index: /tags/CWMM-0.3.0_GA/classes/res/ru/classvolume_ru.dlg
===================================================================
--- /tags/CWMM-0.3.0_GA/classes/res/ru/classvolume_ru.dlg	(revision 213)
+++ /tags/CWMM-0.3.0_GA/classes/res/ru/classvolume_ru.dlg	(revision 213)
@@ -0,0 +1,15 @@
+#ifndef OS2_INCLUDED
+   #include <os2.h>
+#endif
+
+DLGTEMPLATE IDDLG_CLASSVOLUME LOADONCALL MOVEABLE DISCARDABLE
+BEGIN
+    DIALOG  "à®¬ª®áâì", IDDLG_CLASSVOLUME, 68, 78, 207, 124, 
+            WS_VISIBLE, FCF_SYSMENU | FCF_TITLEBAR
+    BEGIN
+        CONTROL         "", ID_CLASSVOLCLIENT, 18, 0, 56, 67, WC_STATIC, SS_FGNDRECT | 
+                        WS_GROUP | WS_VISIBLE 
+
+    END
+END
+
Index: /tags/CWMM-0.3.0_GA/classes/res/ru/cwaudio_ru.dlg
===================================================================
--- /tags/CWMM-0.3.0_GA/classes/res/ru/cwaudio_ru.dlg	(revision 213)
+++ /tags/CWMM-0.3.0_GA/classes/res/ru/cwaudio_ru.dlg	(revision 213)
@@ -0,0 +1,76 @@
+#ifndef OS2_INCLUDED
+   #include <os2.h>
+#endif
+
+DLGTEMPLATE IDDLG_ID3TAGS LOADONCALL MOVEABLE DISCARDABLE
+BEGIN
+    DIALOG  "", IDDLG_ID3TAGS, 92, 13, 209, 120, NOT FS_DLGBORDER | 
+            WS_VISIBLE
+    BEGIN
+        PUSHBUTTON      "~®åà ­šâì", IDPB_ID3SAVE, 44, 1, 40, 14
+        PUSHBUTTON      "~â¬¥­šâì", IDPB_CANCEL, 87, 1, 40, 14
+        PUSHBUTTON      "~¯à ¢ª ", IDPB_ID3HELP, 130, 1, 40, 14, BS_HELP
+        GROUPBOX        "", IDGB_ID3TAGS, 6, 17, 202, 97
+        LTEXT           "¬ï:", 210, 9, 95, 57, 8
+        ENTRYFIELD      "", IDEF_ID3NAME, 73, 95, 127, 8, ES_MARGIN
+        LTEXT           "á¯®«­šâ¥«ì:", 211, 9, 82, 57, 8
+        ENTRYFIELD      "", IDEF_ID3ARTIST, 73, 82, 127, 8, ES_MARGIN
+        LTEXT           "«ì¡®¬:", 212, 9, 69, 57, 8
+        ENTRYFIELD      "", IDEF_ID3ALBUM, 73, 69, 127, 8, ES_MARGIN
+        LTEXT           "®¬¬¥­â àš©:", 213, 9, 56, 57, 8
+        ENTRYFIELD      "", IDEF_ID3COMMENT, 73, 56, 127, 8, ES_MARGIN
+        LTEXT           "®€:", 214, 9, 44, 57, 8
+        ENTRYFIELD      "", IDEF_ID3YEAR, 73, 43, 40, 8, ES_MARGIN
+        LTEXT           " ­à:", 215, 9, 26, 57, 8
+        CONTROL         "", IDDD_ID3GENRE, 71, 5, 99, 31, WC_COMBOBOX, 
+                        CBS_DROPDOWN | WS_GROUP | WS_TABSTOP | WS_VISIBLE
+    END
+END
+
+DLGTEMPLATE IDDLG_WAVEINFOPAGE LOADONCALL MOVEABLE DISCARDABLE
+BEGIN
+    DIALOG  "", IDDLG_WAVEINFOPAGE, 91, 31, 169, 109, NOT FS_DLGBORDER | 
+            WS_VISIBLE | NOT WS_SAVEBITS
+    BEGIN
+        GROUPBOX        "", IDGB_WAVEINFO, 6, 4, 154, 67, NOT 
+                        WS_GROUP
+        LTEXT           " áâ®â  €šáªà¥âš§ æšš:", IDST_SAMPLERATELABEL, 17, 35, 76, 8
+        LTEXT           "šâ ­  á¥¯¬«:", IDST_BPSLABEL, 17, 23, 76, 8
+        LTEXT           "à¥¬ï ¢®á¯à®š§¢¥€¥­šï:", IDST_PLAYTIMELABEL, 17, 47, 76, 8
+        LTEXT           " ­ «ë:", IDST_CHANNELSLABEL, 17, 12, 76, 8
+        LTEXT           "??:??", IDST_PLAYTIME, 108, 47, 39, 8
+        LTEXT           "??", IDST_SAMPLERATE, 108, 35, 39, 8
+        LTEXT           "??", IDST_BPS, 108, 23, 39, 8
+        LTEXT           "??", IDST_CHANNELS, 108, 12, 39, 8
+    END
+END
+
+DLGTEMPLATE IDDLG_IMAGEINFOPAGE LOADONCALL MOVEABLE DISCARDABLE
+BEGIN
+    DIALOG  "", IDDLG_IMAGEINFOPAGE, 91, 31, 169, 109, NOT FS_DLGBORDER | 
+            WS_VISIBLE
+    BEGIN
+        GROUPBOX        "", IDGB_IMAGEINFO, 6, 4, 154, 78, 
+                        NOT WS_GROUP
+        LTEXT           "šàš­ :", IDST_IMAGEWIDTHLABEL, 17, 35, 76, 8
+        LTEXT           "ëá®â :", IDST_IMAGEHEIGHTLABEL, 17, 23, 76, 8
+        LTEXT           "«ã¡š­ :", IDST_COLORDEPTHLABEL, 17, 12, 76, 8
+        LTEXT           "??", IDST_IMAGEWIDTH, 108, 35, 39, 8
+        LTEXT           "??", IDST_IMAGEHEIGHT, 108, 23, 39, 8
+        LTEXT           "??", IDST_COLORDEPTH, 108, 12, 39, 8
+        LTEXT           "", IDST_IMAGEFORMAT, 17, 48, 135, 21, DT_WORDBREAK
+    END
+END
+
+DLGTEMPLATE IDDLG_STREAMURLPAGE LOADONCALL MOVEABLE DISCARDABLE
+BEGIN
+    DIALOG  "", IDDLG_STREAMURLPAGE, 91, 31, 169, 109, NOT FS_DLGBORDER | 
+            WS_VISIBLE
+    BEGIN
+        PUSHBUTTON      "~¯à ¢ª ", IDPB_STREAMHELP, 130, 1, 40, 14, BS_HELP
+        GROUPBOX        "URL", IDGB_STREAMURL, 6, 4, 154, 61, NOT WS_GROUP
+        ENTRYFIELD      "", IDEF_URL, 13, 23, 140, 8, ES_MARGIN
+        LTEXT           "¢¥€šâ¥ URL ¯®â®ª®¢®£® á¥à¢¥à :", IDST_URLTEXT, 12, 
+                        37, 143, 8
+    END
+END
Index: /tags/CWMM-0.3.0_GA/classes/res/ru/cwaudio_ru.rc
===================================================================
--- /tags/CWMM-0.3.0_GA/classes/res/ru/cwaudio_ru.rc	(revision 213)
+++ /tags/CWMM-0.3.0_GA/classes/res/ru/cwaudio_ru.rc	(revision 213)
@@ -0,0 +1,128 @@
+#ifndef OS2_INCLUDED
+   #include <os2.h>
+#endif
+CODEPAGE 866
+
+MENU ID_MENU_VOLUME
+BEGIN
+        MENUITEM "~à®¬ª®áâì",ID_MENU_VOLUME       
+END
+
+MENU ID_MENU_START
+BEGIN
+        MENUITEM "~â àâ",ID_MENU_START       
+END
+
+MENU ID_MENU_STOP
+BEGIN
+        MENUITEM "~â®¯", ID_MENU_STOP       
+END
+
+MENU ID_MENU_PAUSE
+BEGIN
+        MENUITEM "~ ã§ ", ID_MENU_PAUSE       
+END
+
+MENU ID_MENU_RESUME
+BEGIN
+        MENUITEM "~®§®¡­®¢šâì", ID_MENU_RESUME       
+END
+
+MENU ID_MENU_EDITOR
+BEGIN
+        MENUITEM "~¥€ ªâ®à  ã€š®", ID_MENU_EDITOR       
+END
+
+MENU ID_MENU_PLAYER
+BEGIN
+        MENUITEM "~«¥¥à", ID_MENU_PLAYER       
+END
+
+MENU ID_MENU_CONVERT
+BEGIN
+	SUBMENU  "~à¥®¡à §®¢ âì ¢",ID_MENU_CONVERT
+	BEGIN
+        MENUITEM "~WAV (šäà®¢®¥  ã€š® RIFF WAVE)", ID_ITEM_CONVERT
+	END
+END
+
+MENU ID_MENUICONSIZE
+BEGIN
+;   MENUITEM  "" , ID_MENUICONSIZE, MIS_SEPARATOR
+   MENUITEM  "¡ëç­ë¥ §­ çªš", ID_NORMALICONSITEM
+   MENUITEM  "50 * 50" , ID_50X50ITEM
+   MENUITEM  "100 * 100" , ID_100X100ITEM
+   MENUITEM  "150 * 150" , ID_150X150ITEM
+   MENUITEM  "200 * 200" , ID_200X200ITEM
+   MENUITEM  "250 * 250" , ID_250X250ITEM
+END
+
+MENU ID_MENU_M3UEDITOR
+BEGIN
+        MENUITEM "~¥€ ªâ®à ¯«¥©«šáâ ", ID_MENU_M3UEDITOR       
+END
+
+MENU ID_MENU_M3UPLAYER
+BEGIN
+        MENUITEM "~®á¯à®š§¢¥áâš íâ®â á¯šá®ª", ID_MENU_M3UPLAYER       
+END
+
+
+STRINGTABLE 
+BEGIN
+ID_WAVEINFOPAGENAME "~¢¥€¥­šï ®¡  ã€š®"
+ID_ID3TAGSPAGENAME  "¥£ ~ID3"
+ID_TRACKNAMEPAGENAME "~¥â € ­­ë¥ âà¥ª "
+IDSTR_TRACKNAME      ""
+
+IDSTR_PLAYTIME      "à¥¬ï ¢®á¯à®š§¢¥€¥­šï"
+IDSTR_SAMPLERATE    " áâ®â  €šáªà¥âš§ æšš"
+IDSTR_CHANNELS      " ­ «ë"
+IDSTR_BPS           "šâ ­  á¥¯¬«"
+
+;IDSTR_BITRATE       "šâà¥©â"
+;IDSTR_VBR           "VBR"
+
+IDSTR_TITLE         " §¢ ­š¥"
+IDSTR_ARTIST        "á¯®«­šâ¥«ì"
+IDSTR_ALBUM         "«ì¡®¬"
+IDSTR_YEAR          "®€"
+IDSTR_COMMENT       "®¬¬¥­â àš©"
+IDSTR_GENRE         " ­à"
+
+IDSTR_HELPLIBRARY      "MMPARTS.HLP"
+IDSTR_CWMMDATAFILETITLE " ©« MMData"
+;Titles of audio classes
+IDSTR_CWAUDIOTITLE   "šäà®¢®¥  ã€š®"
+IDSTR_AIFTITLE       "AIFAudio.AIF"
+IDSTR_AUTITLE        "AUAudio.AU"
+IDSTR__AUTITLE       "_AUAudio._AU"
+IDSTR_IFFTITLE       "IFFAudio.IFF"
+IDSTR_SNDFTITLE      "SNDAudio.SND"
+IDSTR_VOCTITLE       "VOCAudio.VOC"
+IDSTR_WAVTITLE       "WAVAudio.WAV"
+IDSTR_OGGTITLE       "OGGAudio.OGG"
+IDSTR_MP3TITLE       "MP3Audio.MP3"
+IDSTR_MIDITITLE       "MIDI.MID"
+IDSTR_FLACTITLE       "FLACAudio.FLA"
+
+
+IDSTR_LIGHTTABLETITLE "¢¥â®¢®© áâ®«"
+
+IDSTR_ICONSIZEMENU    " §¬¥à ~§­ çª "
+;Used as an information when starting and audio file from the WPS
+IDSTR_STARTINGTRACK      " ç «ì­ë© âà¥ª..."
+IDSTR_AUDIOSCANNING     "ª ­šà®¢ ­š¥  ã€š®ä ©« ..."
+IDSTR_AUDIOSTREAMTITLE  "ã€š®¯®â®ª"
+IDSTR_STREAMURLPAGENAME "~URL"
+IDSTR_CDTRACKTITLE      "CD âà¥ª"
+IDSTR_M3UTITLE          "«¥©«šáâ M3U"
+;Titles used when starting player and editor applications
+IDSTR_AUDPLAYERTITLE       "ã€š®¯«¥¥à"
+IDSTR_AUDEDITORTITLE       "¥€ ªâ®à  ã€š®"
+IDSTR_M3UEDITORTITLE       "¥€ ªâ®à ¯«¥©«šáâ "
+IDSTR_TRACKPAUSED          " (¯ ã§ )"
+;Used for window list
+IDSTR_VOLUMETITLE       "à®¬ª®áâì"
+
+END
Index: /tags/CWMM-0.3.0_GA/classes/res/ru/cwimage_ru.rc
===================================================================
--- /tags/CWMM-0.3.0_GA/classes/res/ru/cwimage_ru.rc	(revision 213)
+++ /tags/CWMM-0.3.0_GA/classes/res/ru/cwimage_ru.rc	(revision 213)
@@ -0,0 +1,49 @@
+#ifndef OS2_INCLUDED
+   #include <os2.h>
+#endif
+
+CODEPAGE 866
+MENU ID_MENU_IMGEDITOR
+BEGIN
+        MENUITEM "¥€ ªâ®à ~ª àâš­®ª", ID_MENU_IMGEDITOR       
+END
+
+
+STRINGTABLE 
+BEGIN
+IDSTR_MENU_CONVERT "~à¥®¡à §®¢ âì ¢"
+
+IDSTR_AVCTITLE      "AVCImage._IM"
+IDSTR_DIBTITLE      "DIBImage.DIB"
+IDSTR_GIFTITLE      "GIFImage.GIF"
+IDSTR_JPGTITLE      "JPGImage.JPG"
+IDSTR_PCDTITLE      "PCDImage.PCD"
+IDSTR_PCXTITLE      "PCXImage.PCX"
+IDSTR_TGATITLE      "TargaImage.TGA"
+IDSTR_TIFTITLE      "TIFImage.TIF"
+IDSTR_PNGTITLE      "PNGImage.PNG"
+IDSTR_MMOTIONTITLE  "VIDImage.VID"
+IDSTR_CWIMAGETITLE  "šäà®¢®¥ š§®¡à Š¥­š¥"
+
+IDSTR_IMAGEINFOPAGENAME "~¢¥€¥­šï ®¡ š§®¡à Š¥­šš"
+IDSTR_SPRINTFPIXEL	"%d ¯šªá¥«¥©"
+IDSTR_SPRINTFBIT       "%d ¡šâ"
+;Bitmpap load errors
+IDSTR_NOIMGIOPROCERROR   "«ï íâ®£® š§®¡à Š¥­šï ­¥ ­ ©€¥­® ­š ®€­®© ¯à®æ¥€ãàë ¢¢®€ /¢ë¢®€ ."
+IDSTR_OPENFILEERRORTITLE "èš¡ª  ä ©« "
+IDSTR_OPENFILEERROR      "¥ ã€ ñâáï ®âªàëâì ä ©«."
+IDSTR_NOMEMERROR         "¥â á¢®¡®€­®© ¯ ¬ïâš."
+IDSTR_IMGIOPROCCRASH     "­ãâà¥­­ïï ®èš¡ª  ¯àš ®âªàëâšš š§®¡à Š¥­šï.  ¡®çš© áâ®« 
+ ¯¥à¥§ ¯ãáâšâì, š­ ç¥ ášáâ¥¬  ¬®Š¥â à ¡®â âì ­¥áâ ¡š«ì­®! á¥ § ¯ãé¥­­ë¥ ¯àš«®Š¥­šï ®áâ ­ãâáï ®âªàëâë¬š."
+
+IDSTR_IMAGEDETAIL_WIDTH   "šàš­ "
+IDSTR_IMAGEDETAIL_HEIGHT  "ëá®â "
+IDSTR_IMAGEDETAIL_DEPTH   "«ã¡š­ "
+IDSTR_IMAGEDETAIL_FORMAT  "®à¬ â"
+
+;Titles used when starting player and editor applications
+IDSTR_IMGEDITORTITLE       "š§ã «š§ â®à š§®¡à Š¥­š©"
+IDSTR_MENU_IMAGEINFO        "­ä® š§®¡à Š¥­šï: %d x %d x %d"
+
+;IDSTR_HELPLIBRARY   "MMPARTS.HLP"
+END
Index: /tags/CWMM-0.3.0_GA/classes/res/ru/cwvideo_ru.rc
===================================================================
--- /tags/CWMM-0.3.0_GA/classes/res/ru/cwvideo_ru.rc	(revision 213)
+++ /tags/CWMM-0.3.0_GA/classes/res/ru/cwvideo_ru.rc	(revision 213)
@@ -0,0 +1,13 @@
+CODEPAGE 866
+STRINGTABLE 
+BEGIN
+;Titles of video classes
+IDSTR_CWVIDEOTITLE       "šäà®¢®¥ ¢š€¥®"
+IDSTR_MPGTITLE       	 "MPGVideo.MPG"
+IDSTR_MOVTITLE       	 "MOVVideo.MOV"
+IDSTR_FLITITLE       	 "FLIVideo.FLI"
+IDSTR_AVITITLE       	 "AVIVideo.AVI"
+IDSTR_VIDPLAYERTITLE     "š€¥®¯«¥¥à"
+
+END
+
Index: /tags/CWMM-0.3.0_GA/classes/res/ru/def.tpl
===================================================================
--- /tags/CWMM-0.3.0_GA/classes/res/ru/def.tpl	(revision 213)
+++ /tags/CWMM-0.3.0_GA/classes/res/ru/def.tpl	(revision 213)
@@ -0,0 +1,26 @@
+# Note: lines starting with '#' are comments.
+
+[DESCRIPTION]
+RU MM Resource-DLL
+
+[COPYRIGHT]
+(c) C. Wohlgemuth 2001-2005 Netlabs CWMM Team 2023
+
+[AUTHOR]
+Netlabs CWMM Team
+
+[NAME]
+# This is the NAME xxx WINDOWAPI|etc line in the def file.
+# Important: it specifies the internal name of the program. Don't leave out!
+LIBRARY MMRES_RU INITINSTANCE TERMINSTANCE
+
+[BUILDMACHINE]
+Zobopeep
+
+[OTHER]
+# Add all the lines here you want to have at the end of the generated DEF file
+PROTMODE
+CODE LOADONCALL DISCARDABLE
+DATA MULTIPLE NONSHARED
+EXPORTS
+        queryLanguage
Index: /tags/CWMM-0.3.0_GA/classes/res/ru/imageconv_ru.dlg
===================================================================
--- /tags/CWMM-0.3.0_GA/classes/res/ru/imageconv_ru.dlg	(revision 213)
+++ /tags/CWMM-0.3.0_GA/classes/res/ru/imageconv_ru.dlg	(revision 213)
@@ -0,0 +1,28 @@
+#ifndef OS2_INCLUDED
+   #include <os2.h>
+#endif
+
+DLGTEMPLATE IDDLG_IMGCONVERT LOADONCALL MOVEABLE DISCARDABLE
+BEGIN
+    DIALOG  "®­¢¥àâšà®¢ âì æšäà®¢®¥ š§®¡à Š¥­š¥", IDDLG_IMGCONVERT, 68, 78, 207, 191, 
+            WS_VISIBLE, FCF_SYSMENU | FCF_TITLEBAR
+    BEGIN
+        GROUPBOX        "", IDGB_IMGCONVERT, 2, 19, 203, 172
+        LTEXT           "¬ï:", IDST_IMGCONVERTNAMELABEL, 7, 173, 32, 8
+        LTEXT           "", IDST_IMGCONVERTNAME, 44, 173, 156, 8
+        CONTROL         "", IDSR_BMP, 12, 100, 185, 69, WC_STATIC, 
+                        SS_FGNDRECT | WS_GROUP | WS_VISIBLE
+        LTEXT           "à¥®¡à §®¢ âì ¢:", IDST_IMGCONVERTTO, 7, 88, 53, 8
+        CONTROL         "", IDDD_IMGIOPROC, 6, 6, 196, 78, WC_COMBOBOX, 
+                        CBS_DROPDOWNLIST | LS_HORZSCROLL | WS_GROUP | 
+                        WS_TABSTOP | WS_VISIBLE
+        LTEXT           "¬ï ª®­¥ç­®£® ä ©« :", 2419, 7, 57, 64, 8
+        ENTRYFIELD      "", IDEF_IMGCONVERTTARGETNAME, 9, 45, 139, 8, ES_MARGIN
+        PUSHBUTTON      "~¡§®à...", IDPB_IMGCONVERTBROWSE, 153, 42, 47, 14
+        CONTROL         "", IDBAR_IMGCONVERTPROGRESS, 6, 24, 194, 13, 
+                        "CW_PERCENTBAR", 5 | WS_GROUP | WS_VISIBLE
+        DEFPUSHBUTTON   "~®­¢¥àâšà®¢ âì", IDPB_IMGCONVERTOK, 20, 2, 47, 14
+        PUSHBUTTON      "~à¥à¢ âì", IDPB_IMGCONVERTABORT, 71, 2, 40, 14
+        PUSHBUTTON      "~ ªàëâì", IDPB_IMGCONVERTCLOSE, 135, 2, 40, 14
+    END
+END
Index: /tags/CWMM-0.3.0_GA/classes/res/ru/imageconv_ru.rc
===================================================================
--- /tags/CWMM-0.3.0_GA/classes/res/ru/imageconv_ru.rc	(revision 213)
+++ /tags/CWMM-0.3.0_GA/classes/res/ru/imageconv_ru.rc	(revision 213)
@@ -0,0 +1,10 @@
+#ifndef OS2_INCLUDED
+   #include <os2.h>
+#endif
+
+CODEPAGE 866
+STRINGTABLE
+BEGIN
+IDSTR_IMAGEBROWSETITLE   "¬ï ä ©«  š§®¡à Š¥­šï"
+END
+
Index: /tags/CWMM-0.3.0_GA/classes/res/ru/makefile
===================================================================
--- /tags/CWMM-0.3.0_GA/classes/res/ru/makefile	(revision 213)
+++ /tags/CWMM-0.3.0_GA/classes/res/ru/makefile	(revision 213)
@@ -0,0 +1,54 @@
+# Makefile for CWMM resource dll
+
+include ../../../make.inc
+include ../../../build.inc
+
+LANGUAGE	=	_ru
+
+CC           = icc
+CPPFLAGS     = /Ge- /Gm+ /G4 /Gl  /O+ /Oc+ /Ol- /Q+ $(VACDEBUG)
+INC	=	../../inc
+DEFS         =
+#TOOLDIR =      $(BUILD_ROOT)\classes\mm-progs
+OBJDIR	=	../dll
+
+OBJECTS	= 	$(INC)\mmres.h mmres$(LANGUAGE).rc \
+			audioplayer$(LANGUAGE).dlg audioplayer$(LANGUAGE).rc \
+			audioconv$(LANGUAGE).dlg audioconv$(LANGUAGE).rc \
+			volume$(LANGUAGE).rc volume$(LANGUAGE).dlg \
+			imageconv$(LANGUAGE).dlg imageconv$(LANGUAGE).rc \
+			cwaudio$(LANGUAGE).rc cwaudio$(LANGUAGE).dlg \
+			cwimage$(LANGUAGE).rc cwvideo$(LANGUAGE).rc \
+			mmfind$(LANGUAGE).dlg mmfind$(LANGUAGE).rc
+
+
+all:	$(OBJDIR)/mmres$(LANGUAGE).dll
+
+$(OBJDIR)/mmres$(LANGUAGE).dll:	mmres$(LANGUAGE).c $(OBJECTS) 
+		cmd /C $(TOOLDIR)/create_def.cmd mmres$(LANGUAGE).def
+		icc $(CPPFLAGS) -I$(INC) /Fe$(OBJDIR)\$@ $< mmres$(LANGUAGE).def
+		rc -cp 866 -D $(ECS) -i $(INC) mmres$(LANGUAGE).rc $(OBJDIR)/mmres$(LANGUAGE).dll
+		rc -cp 866 -r -D $(ECS) -i $(INC) mmres$(LANGUAGE).rc $(OBJDIR)/mmres$(LANGUAGE).res
+#		rc  mmres$(LANGUAGE).res $(OBJDIR)/mmres$(LANGUAGE).dll
+
+#(OBJDIR)/mmres$(LANGUAGE).res:	mmres$(LANGUAGE).rc $(OBJECTS)
+#		rc -D $(ECS) -i $(INC) -r mmres$(LANGUAGE).rc
+
+
+restest:	
+	echo  $(deftext)> test.def
+
+                		
+clean:
+	-rm $(OBJDIR)/*.obj
+	-rm $(OBJDIR)/*.dll
+	-rm $(OBJDIR)/*.res
+	-rm *.*~
+	-rm *.flc
+	-rm *.RES
+	-rm *.obj
+	-rm *.def
+
+
+	
+
Index: /tags/CWMM-0.3.0_GA/classes/res/ru/mmfind_ru.dlg
===================================================================
--- /tags/CWMM-0.3.0_GA/classes/res/ru/mmfind_ru.dlg	(revision 213)
+++ /tags/CWMM-0.3.0_GA/classes/res/ru/mmfind_ru.dlg	(revision 213)
@@ -0,0 +1,51 @@
+#ifndef OS2_INCLUDED
+   #include <os2.h>
+#endif
+
+DLGTEMPLATE IDDLG_MMFIND LOADONCALL MOVEABLE DISCARDABLE
+BEGIN
+    DIALOG  " ©âš ä ©« ¬ã«ìâš¬¥€š ", IDDLG_MMFIND, 12, 23, 338, 133, WS_VISIBLE | WS_SYNCPAINT, 
+            FCF_SYSMENU | FCF_TITLEBAR
+            PRESPARAMS PP_FONTNAMESIZE, "9.WarpSans"
+    BEGIN
+        LTEXT           "âªàëâì ä ©«", 257, 4, 120, 51, 9, DT_VCENTER | 
+                        NOT WS_GROUP
+        ENTRYFIELD      "*", 258, 55, 120, 239, 7, ES_MARGIN | WS_GROUP
+        LTEXT           "šáª", 259, 4, 108, 51, 9, DT_VCENTER | NOT 
+                        WS_GROUP
+        CONTROL         "H:  []", 260, 54, 18, 87, 99, WC_COMBOBOX, 
+                        CBS_DROPDOWNLIST | WS_TABSTOP | WS_VISIBLE
+        LTEXT           "£à ­šçšâì ¢ë¡®à ä ©«®¢", 261, 174, 4, 46, 9, DT_VCENTER | 
+                        NOT WS_GROUP | NOT WS_VISIBLE
+        CONTROL         "<á¥ ä ©«ë>", 262, 209, 4, 29, 8, WC_COMBOBOX, 
+                        CBS_DROPDOWNLIST | WS_TABSTOP
+        LTEXT           " â «®£", 263, 4, 97, 35, 7, NOT WS_GROUP
+        LTEXT           "", 270, 42, 98, 60, 6, NOT WS_GROUP | NOT 
+                        WS_VISIBLE
+        LTEXT           " ©«", 265, 131, 97, 17, 7, NOT WS_GROUP
+        AUTOCHECKBOX    "®«ìª® çâ¥­š¥", 269, 171, 97, 42, 8, NOT WS_TABSTOP | 
+                        NOT WS_VISIBLE
+        LISTBOX         264, 4, 17, 116, 76, LS_OWNERDRAW | LS_HORZSCROLL
+        LISTBOX         266, 125, 17, 116, 76, LS_HORZSCROLL
+        RTEXT           "š¯ ä ©« ", IDST_TYPE, 146, 108, 58, 9, DT_VCENTER
+        CONTROL         "", IDCB_TYPEOFFILE, 208, 18, 87, 99, WC_COMBOBOX, 
+                        CBS_DROPDOWNLIST | WS_GROUP | WS_TABSTOP | 
+                        WS_VISIBLE
+        GROUPBOX        "à¥€¯à®á¬®âà", IDGB_PREVIEW, 245, 16, 89, 80, NOT WS_VISIBLE
+        CONTROL         "", IDSR_IMGPREVIEW, 249, 20, 82, 68, WC_STATIC, SS_FGNDRECT | 
+                        WS_GROUP
+        CTEXT           "à¥€¯à®á¬®âà ­¥€®áâã¯¥­", IDST_NOPREVIEWAVAILABLE, 251, 42, 78, 33, 
+                        DT_WORDBREAK | NOT WS_VISIBLE
+        LTEXT           "", IDST_AUDIOINFO, 253, 21, 75, 62, DT_WORDBREAK | NOT 
+                        WS_VISIBLE
+        GROUPBOX        "ã€š® š­ä®", IDGB_AUDIOINFO, 245, 17, 89, 79, NOT WS_VISIBLE
+        DEFPUSHBUTTON   "~", DID_OK, 3, 2, 40, 12
+        PUSHBUTTON      "~®¢ë©...", IDPB_NEWFILE, 46, 2, 40, 12
+        PUSHBUTTON      "àš¬¥­šâì", 268, 293, 3, 40, 12, NOT WS_TABSTOP | NOT 
+                        WS_VISIBLE
+        PUSHBUTTON      "~â¬¥­šâì", DID_CANCEL, 95, 2, 40, 12, NOT WS_TABSTOP
+        PUSHBUTTON      "¯à ¢ª ", 267, 243, 2, 40, 12, BS_NOPOINTERFOCUS | NOT 
+                        WS_TABSTOP | NOT WS_VISIBLE
+        LISTBOX         3, 0, 0, 2, 1, NOT WS_TABSTOP | NOT WS_VISIBLE
+    END
+END
Index: /tags/CWMM-0.3.0_GA/classes/res/ru/mmfind_ru.rc
===================================================================
--- /tags/CWMM-0.3.0_GA/classes/res/ru/mmfind_ru.rc	(revision 213)
+++ /tags/CWMM-0.3.0_GA/classes/res/ru/mmfind_ru.rc	(revision 213)
@@ -0,0 +1,13 @@
+#ifndef OS2_INCLUDED
+   #include <os2.h>
+#endif
+CODEPAGE 866
+STRINGTABLE
+BEGIN
+IDSTR_TYPEAUDIO             "ã€š®"
+IDSTR_TYPEIMAGE             "§®¡à Š¥­š¥"
+IDSTR_TYPEVIDEO             "š€¥®"
+IDSTR_AUDIOINFOTEXT         "à¥¬ï ¢®á¯à®š§¢¥€¥­šï:\t%02d:%02d\n\n áâ®â  €šáªà¥âš§ æšš:\t%d\n\nšâ ­  á¥¯¬«:\t%d\n\n ­ «ë:\t%d"
+IDSTR_NOMMTEMPLATEFLDRTITLE "èš¡ª  ¯àš á®§€ ­šš ä ©« "
+IDSTR_NOMMTEMPLATEFLDR      " ¯ª  ¬ã«ìâš¬¥€š©­ëå è ¡«®­®¢ ­¥ ­ ©€¥­ . ®§¬®Š­®, ¯®â¥àï­ š€¥­âšäšª â®à ®¡ê¥ªâ  <MMPM2_MMTEMPLATEFOLDER>."
+END
Index: /tags/CWMM-0.3.0_GA/classes/res/ru/mmres_ru.c
===================================================================
--- /tags/CWMM-0.3.0_GA/classes/res/ru/mmres_ru.c	(revision 213)
+++ /tags/CWMM-0.3.0_GA/classes/res/ru/mmres_ru.c	(revision 213)
@@ -0,0 +1,26 @@
+/*
+ * This file is (C) Chris Wohlgemuth 2003
+ */
+/*
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; see the file COPYING.  If not, write to
+ * the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+
+#include <os2.h>
+
+PSZ queryLanguage()
+{
+  return "Russian";
+}
+
Index: /tags/CWMM-0.3.0_GA/classes/res/ru/mmres_ru.rc
===================================================================
--- /tags/CWMM-0.3.0_GA/classes/res/ru/mmres_ru.rc	(revision 213)
+++ /tags/CWMM-0.3.0_GA/classes/res/ru/mmres_ru.rc	(revision 213)
@@ -0,0 +1,37 @@
+#define  INCL_GRAPHICBUTTON   /* need this for the graphic buttons control */
+#define  INCL_BITMAP
+
+#ifndef OS2_INCLUDED
+   #include <os2.h>
+#endif
+#include <sw.h>
+
+#include "mmres.h"
+;#include "version.h"
+;#include "build.h"
+
+CODEPAGE 866
+;¥áãàáë €š «®£®¢ €«ï volume.exe
+rcinclude "volume_ru.rc"
+rcinclude "volume_ru.dlg"
+
+rcinclude "audioconv_ru.rc"
+rcinclude "audioconv_ru.dlg"
+
+rcinclude "imageconv_ru.rc"
+rcinclude "imageconv_ru.dlg"
+
+rcinclude "audioplayer_ru.rc"
+rcinclude "audioplayer_ru.dlg"
+
+rcinclude "classvolume_ru.dlg"
+
+rcinclude "cwaudio_ru.rc"
+rcinclude "cwaudio_ru.dlg"
+
+rcinclude "cwimage_ru.rc"
+rcinclude "cwvideo_ru.rc"
+
+rcinclude "mmfind_ru.rc"
+rcinclude "mmfind_ru.dlg"
+
Index: /tags/CWMM-0.3.0_GA/classes/res/ru/volume_ru.dlg
===================================================================
--- /tags/CWMM-0.3.0_GA/classes/res/ru/volume_ru.dlg	(revision 213)
+++ /tags/CWMM-0.3.0_GA/classes/res/ru/volume_ru.dlg	(revision 213)
@@ -0,0 +1,21 @@
+#ifndef OS2_INCLUDED
+   #include <os2.h>
+#endif
+#define INCL_GRAPHICBUTTON
+#include <sw.h>
+
+
+DLGTEMPLATE IDDLG_VOLUME LOADONCALL MOVEABLE DISCARDABLE
+BEGIN
+    DIALOG  "à®¬ª®áâì", IDDLG_VOLUME, 73, 148, 112, 56,  
+             WS_VISIBLE, FCF_SYSMENU | FCF_TITLEBAR |  FCF_TASKLIST |
+            FCF_MINBUTTON
+    BEGIN
+        CONTROL         "~à®¬ª®áâì", IDCS_VOLUME, 3, 3, 63, 44, WC_CIRCULARSLIDER, 
+                        WS_GROUP | WS_VISIBLE | WS_TABSTOP
+        CONTROL         "~¥§ §¢ãª ", IDPB_MUTE ,  65, 17, 40, 14, WC_GRAPHICBUTTON,
+			 WS_VISIBLE | GBS_AUTOTWOSTATE | WS_TABSTOP
+        GROUPBOX        "", IDGB_VOLUME, 1, 2, 109, 53
+    END
+END
+
Index: /tags/CWMM-0.3.0_GA/classes/res/ru/volume_ru.rc
===================================================================
--- /tags/CWMM-0.3.0_GA/classes/res/ru/volume_ru.rc	(revision 213)
+++ /tags/CWMM-0.3.0_GA/classes/res/ru/volume_ru.rc	(revision 213)
@@ -0,0 +1,11 @@
+#ifndef OS2_INCLUDED
+   #include <os2.h>
+#endif
+CODEPAGE 866
+MENU    IDM_POPUP
+BEGIN
+    MENUITEM    "~ªàëâì § £®«®¢®ª",    IDM_ITEMTITLEBAR
+    MENUITEM    "",    0, MIS_SEPARATOR
+    MENUITEM    "~ëå®€",    IDM_ITEMEXIT
+END
+
Index: /tags/CWMM-0.3.0_GA/classes/res/tw/audioconv_tw.dlg
===================================================================
--- /tags/CWMM-0.3.0_GA/classes/res/tw/audioconv_tw.dlg	(revision 213)
+++ /tags/CWMM-0.3.0_GA/classes/res/tw/audioconv_tw.dlg	(revision 213)
@@ -0,0 +1,38 @@
+#ifndef OS2_INCLUDED
+   #include <os2.h>
+#endif
+
+DLGTEMPLATE IDDLG_CONVERT LOADONCALL MOVEABLE DISCARDABLE
+BEGIN
+    DIALOG  "ÂàŽ«­µ°TÀÉ®×", IDDLG_CONVERT, 115, 36, 207, 174, WS_VISIBLE, 
+            FCF_SYSMENU | FCF_TITLEBAR
+    BEGIN
+        GROUPBOX        "", IDGB_CONVERT, 3, 105, 203, 69
+        LTEXT           "ÀÉŠW¡G", IDST_CONVERTNAMELABEL, 7, 156, 32, 8
+        RTEXT           "", IDST_CONVERTNAME, 45, 156, 156, 8
+        LTEXT           "? Hz", IDST_CONVERTSAMPLERATE, 7, 131, 91, 8
+        LTEXT           "¡H Án¹D", IDST_CONVERTCHANNELS, 7, 120, 91, 8
+        LTEXT           "", IDST_CONVERTCDBITS, 103, 142, 98, 8
+        LTEXT           "(CD: 44100 Hz)", IDST_CONVERTCDSAMPLELABEL, 103, 131, 
+                        98, 8
+        LTEXT           "(CD: 2 Án¹D)", IDST_CONVERTCDCHANNELSLABEL, 103, 
+                        120, 98, 8
+        LTEXT           "Œœ©ñ®É¶¡¡G¡H", IDST_CONVERTPLAYTIME, 7, 109, 161, 8
+        GROUPBOX        "", IDGB_CONVERT2, 3, 19, 203, 85
+        LTEXT           "ÂàŽ«Šš¡G", 317, 7, 86, 86, 8
+        CONTROL         "", IDDD_IOPROC, 7, 28, 195, 54, WC_COMBOBOX, 
+                        CBS_DROPDOWNLIST | WS_GROUP | WS_TABSTOP | 
+                        WS_VISIBLE
+
+        LTEXT           "¥ØŒÐÀÉŠW¡G", 2419, 7, 57, 64, 8
+        ENTRYFIELD      "", IDEF_CONVERTTARGETNAME, 9, 45, 139, 8, ES_RIGHT | 
+                        ES_MARGIN
+        PUSHBUTTON      "ÂsÄý(~B)...", IDPB_CONVERTBROWSE, 153, 42, 47, 14
+        CONTROL         "", IDBAR_CONVERTPROGRESS, 6, 24, 194, 13, 
+                        "CW_PERCENTBAR", 5 | WS_GROUP | WS_VISIBLE
+        DEFPUSHBUTTON   "ÂàŽ«(~C)", IDPB_CONVERTOK, 20, 2, 47, 14
+        PUSHBUTTON      "Ãö©ó(~A)", IDPB_CONVERTABORT, 71, 2, 40, 14
+        PUSHBUTTON      "Ãö³¬(~L)", IDPB_CONVERTCLOSE, 135, 2, 40, 14
+    END
+END
+
Index: /tags/CWMM-0.3.0_GA/classes/res/tw/audioconv_tw.rc
===================================================================
--- /tags/CWMM-0.3.0_GA/classes/res/tw/audioconv_tw.rc	(revision 213)
+++ /tags/CWMM-0.3.0_GA/classes/res/tw/audioconv_tw.rc	(revision 213)
@@ -0,0 +1,19 @@
+#ifndef OS2_INCLUDED
+   #include <os2.h>
+#endif
+
+CODEPAGE 950
+STRINGTABLE 
+BEGIN
+
+IDSTR_CONVERTCHANNELS    "%d Án¹D"
+IDSTR_CONVERTSAMPLERATE  "%d Hz"
+IDSTR_CONVERTPLAYTIME    "%d:%02d €ÀªºŒœ©ñ®É¶¡"
+IDSTR_CONVERTDIALOGERROR "µLªkÅªšú¹ïžÜ®ØŒÒª©¡IœÐÀË¬d§AªºŠwžË¡C"
+IDSTR_CONVERTNOSPACETITLE   "ÂàŽ«Šš wave"
+IDSTR_CONVERTNOSPACETEXT   "šSŠ³š¬°÷ªºªÅ¶¡šÓžÑœXÀÉ®×¡CœÐ¿ïŸÜŠÜ€ÖŠ³ %d MB ªº¥ŒšÏ¥ÎªÅ¶¡ºÏºÐ¡C"
+IDSTR_INSTALLERRORTITLE  "ŠwžË°ÝÃD"
+IDSTR_AUDIOBROWSETITLE   "­µ°TÀÉ®×ŠWºÙ"
+
+END
+
Index: /tags/CWMM-0.3.0_GA/classes/res/tw/audioplayer_tw.dlg
===================================================================
--- /tags/CWMM-0.3.0_GA/classes/res/tw/audioplayer_tw.dlg	(revision 213)
+++ /tags/CWMM-0.3.0_GA/classes/res/tw/audioplayer_tw.dlg	(revision 213)
@@ -0,0 +1,26 @@
+#ifndef OS2_INCLUDED
+   #include <os2.h>
+#endif
+
+DLGTEMPLATE IDDLG_MMPLAYER LOADONCALL MOVEABLE DISCARDABLE
+BEGIN
+    DIALOG  "­µ°TŒœ©ñŸ¹", IDDLG_MMPLAYER, 68, 78, 207, 124, 
+            WS_VISIBLE, FCF_SYSMENU | FCF_TITLEBAR
+    BEGIN
+        CONTROL         "", ID_CLIENT, 18, 0, 56, 67, WC_STATIC, SS_FGNDRECT | 
+                        WS_GROUP | WS_VISIBLE 
+        CONTROL         "°±€î(~S)", IDPB_MMPLAYERSTOP, 40, 25, 22, 14, WC_BUTTON, 
+                        BS_USERBUTTON | WS_VISIBLE| WS_TABSTOP
+        CONTROL         "ŒÈ°±(~P)", IDPB_MMPLAYERPAUSE, 61, 25, 20, 14, WC_BUTTON, 
+                        BS_USERBUTTON | WS_VISIBLE
+        CONTROL         "Œœ©ñ(~L)", IDPB_MMPLAYERPLAY, 79, 25, 20, 14, WC_BUTTON, 
+                        BS_USERBUTTON | WS_VISIBLE
+        CTEXT           "0:00", IDST_MMPLAYERPLAYTIME, 123, 14, 134, 13, DT_VCENTER
+                        PRESPARAMS PP_FONTNAMESIZE, "10.Helv"
+;        CONTROL         "­µ¶qºb", IDSL_MMPLAYERVOLUMEARM, 209, 5, 14, 14, 
+;                        WC_BUTTON, BS_USERBUTTON | WS_TABSTOP|BS_USERBUTTON
+;        PUSHBUTTON      "­µ¶q", IDSL_MMPLAYERVOLUME, 19, 4, 69, 14, 
+;                        BS_NOPOINTERFOCUS | NOT WS_TABSTOP | NOT WS_VISIBLE |BS_USERBUTTON
+
+    END
+END
Index: /tags/CWMM-0.3.0_GA/classes/res/tw/audioplayer_tw.rc
===================================================================
--- /tags/CWMM-0.3.0_GA/classes/res/tw/audioplayer_tw.rc	(revision 213)
+++ /tags/CWMM-0.3.0_GA/classes/res/tw/audioplayer_tw.rc	(revision 213)
@@ -0,0 +1,16 @@
+#ifndef OS2_INCLUDED
+   #include <os2.h>
+#endif
+CODEPAGE 950
+MENU  ID_MENUTIMECONTEXT
+BEGIN
+	MENUITEM "žg¹L®É¶¡(~E)"   ,          ID_MENUITEMELAPSED
+	MENUITEM "³ÑŸl®É¶¡(~R)" ,          ID_MENUITEMREMAINING
+	MENUITEM "Š±¥Øžê°T(~T)" ,       ID_MENUITEMID3
+END
+
+STRINGTABLE
+BEGIN
+IDSTR_MASTERVOLUMEITEM "¥D­µ¶q(~V)"
+END
+
Index: /tags/CWMM-0.3.0_GA/classes/res/tw/classvolume_tw.dlg
===================================================================
--- /tags/CWMM-0.3.0_GA/classes/res/tw/classvolume_tw.dlg	(revision 213)
+++ /tags/CWMM-0.3.0_GA/classes/res/tw/classvolume_tw.dlg	(revision 213)
@@ -0,0 +1,15 @@
+#ifndef OS2_INCLUDED
+   #include <os2.h>
+#endif
+
+DLGTEMPLATE IDDLG_CLASSVOLUME LOADONCALL MOVEABLE DISCARDABLE
+BEGIN
+    DIALOG  "­µ¶q", IDDLG_CLASSVOLUME, 68, 78, 207, 124, 
+            WS_VISIBLE, FCF_SYSMENU | FCF_TITLEBAR
+    BEGIN
+        CONTROL         "", ID_CLASSVOLCLIENT, 18, 0, 56, 67, WC_STATIC, SS_FGNDRECT | 
+                        WS_GROUP | WS_VISIBLE 
+
+    END
+END
+
Index: /tags/CWMM-0.3.0_GA/classes/res/tw/cwaudio_tw.dlg
===================================================================
--- /tags/CWMM-0.3.0_GA/classes/res/tw/cwaudio_tw.dlg	(revision 213)
+++ /tags/CWMM-0.3.0_GA/classes/res/tw/cwaudio_tw.dlg	(revision 213)
@@ -0,0 +1,76 @@
+#ifndef OS2_INCLUDED
+   #include <os2.h>
+#endif
+
+DLGTEMPLATE IDDLG_ID3TAGS LOADONCALL MOVEABLE DISCARDABLE
+BEGIN
+    DIALOG  "", IDDLG_ID3TAGS, 92, 13, 209, 120, NOT FS_DLGBORDER | 
+            WS_VISIBLE
+    BEGIN
+        PUSHBUTTON      "ÀxŠs(~S)", IDPB_ID3SAVE, 44, 1, 40, 14
+        PUSHBUTTON      "šú®ø(~C)", IDPB_CANCEL, 87, 1, 40, 14
+        PUSHBUTTON      "žÑ»¡(~H)", IDPB_ID3HELP, 130, 1, 40, 14, BS_HELP
+        GROUPBOX        "ID3 Tags", IDGB_ID3TAGS, 6, 17, 202, 97
+        LTEXT           "ŠWºÙ¡G", 210, 9, 95, 57, 8
+        ENTRYFIELD      "", IDEF_ID3NAME, 73, 95, 127, 8, ES_MARGIN
+        LTEXT           "ºt¥XªÌ¡G", 211, 9, 82, 57, 8
+        ENTRYFIELD      "", IDEF_ID3ARTIST, 73, 82, 127, 8, ES_MARGIN
+        LTEXT           "±M¿è¡G", 212, 9, 69, 57, 8
+        ENTRYFIELD      "", IDEF_ID3ALBUM, 73, 69, 127, 8, ES_MARGIN
+        LTEXT           "µùžÑ¡G", 213, 9, 56, 57, 8
+        ENTRYFIELD      "", IDEF_ID3COMMENT, 73, 56, 127, 8, ES_MARGIN
+        LTEXT           "Š~¥÷¡G", 214, 9, 44, 57, 8
+        ENTRYFIELD      "", IDEF_ID3YEAR, 73, 43, 40, 8, ES_MARGIN
+        LTEXT           "Ãþ«¬¡G", 215, 9, 26, 57, 8
+        CONTROL         "", IDDD_ID3GENRE, 71, 5, 99, 31, WC_COMBOBOX, 
+                        CBS_DROPDOWN | WS_GROUP | WS_TABSTOP | WS_VISIBLE
+    END
+END
+
+DLGTEMPLATE IDDLG_WAVEINFOPAGE LOADONCALL MOVEABLE DISCARDABLE
+BEGIN
+    DIALOG  "", IDDLG_WAVEINFOPAGE, 91, 31, 169, 109, NOT FS_DLGBORDER | 
+            WS_VISIBLE | NOT WS_SAVEBITS
+    BEGIN
+        GROUPBOX        "Án­µžê°T", IDGB_WAVEINFO, 6, 4, 154, 67, NOT 
+                        WS_GROUP
+        LTEXT           "šúŒË³t«×¡G", IDST_SAMPLERATELABEL, 17, 35, 76, 8
+        LTEXT           "šúŒË€j€p(Bits)¡G", IDST_BPSLABEL, 17, 23, 76, 8
+        LTEXT           "Œœ©ñ®É¶¡¡G", IDST_PLAYTIMELABEL, 17, 47, 76, 8
+        LTEXT           "Án¹D¡G", IDST_CHANNELSLABEL, 17, 12, 76, 8
+        LTEXT           "??:??", IDST_PLAYTIME, 108, 47, 39, 8
+        LTEXT           "??", IDST_SAMPLERATE, 108, 35, 39, 8
+        LTEXT           "??", IDST_BPS, 108, 23, 39, 8
+        LTEXT           "??", IDST_CHANNELS, 108, 12, 39, 8
+    END
+END
+
+DLGTEMPLATE IDDLG_IMAGEINFOPAGE LOADONCALL MOVEABLE DISCARDABLE
+BEGIN
+    DIALOG  "", IDDLG_IMAGEINFOPAGE, 91, 31, 169, 109, NOT FS_DLGBORDER | 
+            WS_VISIBLE
+    BEGIN
+        GROUPBOX        "Œv¹³žê°T", IDGB_IMAGEINFO, 6, 4, 154, 78, 
+                        NOT WS_GROUP
+        LTEXT           "Œe«×¡G", IDST_IMAGEWIDTHLABEL, 17, 35, 76, 8
+        LTEXT           "°ª«×¡G", IDST_IMAGEHEIGHTLABEL, 17, 23, 76, 8
+        LTEXT           "²`«×¡G", IDST_COLORDEPTHLABEL, 17, 12, 76, 8
+        LTEXT           "??", IDST_IMAGEWIDTH, 108, 35, 39, 8
+        LTEXT           "??", IDST_IMAGEHEIGHT, 108, 23, 39, 8
+        LTEXT           "??", IDST_COLORDEPTH, 108, 12, 39, 8
+        LTEXT           "", IDST_IMAGEFORMAT, 17, 48, 135, 21, DT_WORDBREAK
+    END
+END
+
+DLGTEMPLATE IDDLG_STREAMURLPAGE LOADONCALL MOVEABLE DISCARDABLE
+BEGIN
+    DIALOG  "", IDDLG_STREAMURLPAGE, 91, 31, 169, 109, NOT FS_DLGBORDER | 
+            WS_VISIBLE
+    BEGIN
+        GROUPBOX        "URL", IDGB_STREAMURL, 6, 4, 154, 61, NOT WS_GROUP
+        ENTRYFIELD      "", IDEF_URL, 13, 23, 140, 8, ES_MARGIN
+        LTEXT           "¿é€J URL ŠÜŠê¬yŠøªAŸ¹¡G", IDST_URLTEXT, 12, 
+                        37, 143, 8
+    END
+END
+
Index: /tags/CWMM-0.3.0_GA/classes/res/tw/cwaudio_tw.rc
===================================================================
--- /tags/CWMM-0.3.0_GA/classes/res/tw/cwaudio_tw.rc	(revision 213)
+++ /tags/CWMM-0.3.0_GA/classes/res/tw/cwaudio_tw.rc	(revision 213)
@@ -0,0 +1,129 @@
+#ifndef OS2_INCLUDED
+   #include <os2.h>
+#endif
+
+CODEPAGE 950
+MENU ID_MENU_VOLUME
+BEGIN
+        MENUITEM "­µ¶q(~V)",ID_MENU_VOLUME       
+END
+
+MENU ID_MENU_START
+BEGIN
+        MENUITEM "¶}©l(~S)",ID_MENU_START       
+END
+
+MENU ID_MENU_STOP
+BEGIN
+        MENUITEM "°±€î(~S)", ID_MENU_STOP       
+END
+
+MENU ID_MENU_PAUSE
+BEGIN
+        MENUITEM "ŒÈ°±(~P)", ID_MENU_PAUSE       
+END
+
+MENU ID_MENU_RESUME
+BEGIN
+        MENUITEM "Ä~Äò(~R)", ID_MENU_RESUME       
+END
+
+MENU ID_MENU_EDITOR
+BEGIN
+        MENUITEM "­µ°Tœs¿èŸ¹(~A)", ID_MENU_EDITOR       
+END
+
+MENU ID_MENU_PLAYER
+BEGIN
+        MENUITEM "Œœ©ñŸ¹(~P)", ID_MENU_PLAYER       
+END
+
+MENU ID_MENU_CONVERT
+BEGIN
+	SUBMENU  "ÂàŽ«Šš(~C)",ID_MENU_CONVERT
+	BEGIN
+        MENUITEM "~WAV (RIFF WAVE Digital Audio)", ID_ITEM_CONVERT
+	END
+END
+
+MENU ID_MENUICONSIZE
+BEGIN
+;   MENUITEM  "" , ID_MENUICONSIZE, MIS_SEPARATOR
+   MENUITEM "¥¿±`¹Ï°O", ID_NORMALICONSITEM
+   MENUITEM  "50 * 50" , ID_50X50ITEM
+   MENUITEM  "100 * 100" , ID_100X100ITEM
+   MENUITEM  "150 * 150" , ID_150X150ITEM
+   MENUITEM  "200 * 200" , ID_200X200ITEM
+   MENUITEM  "250 * 250" , ID_250X250ITEM
+END
+
+MENU ID_MENU_M3UEDITOR
+BEGIN
+        MENUITEM "Œœ©ñ²M³æœs¿èŸ¹(~E)", ID_MENU_M3UEDITOR       
+END
+
+MENU ID_MENU_M3UPLAYER
+BEGIN
+        MENUITEM "Œœ©ñŠ¹²MŸ¹(~P)", ID_MENU_M3UPLAYER       
+END
+
+
+STRINGTABLE 
+BEGIN
+ID_WAVEINFOPAGENAME "­µ°Tžê°T(~A)"
+ID_ID3TAGSPAGENAME  "~ID3 Tags"
+ID_TRACKNAMEPAGENAME "Š±¥ØŠWºÙ(~T)"
+IDSTR_TRACKNAME      "Š±¥ØŠWºÙ"
+
+IDSTR_PLAYTIME      "Œœ©ñ®É¶¡"
+IDSTR_SAMPLERATE    "šúŒË³t«×"
+IDSTR_CHANNELS      "Án¹D"
+IDSTR_BPS           "ŒË¥»€j€p(Bits"
+
+;IDSTR_BITRATE       "Bitrate"
+;IDSTR_VBR           "VBR"
+
+IDSTR_TITLE         "ŒÐÃD"
+IDSTR_ARTIST        "ºt¥XªÌ"
+IDSTR_ALBUM         "Âà¿è"
+IDSTR_YEAR          "Š~¥÷"
+IDSTR_COMMENT       "µùžÑ"
+IDSTR_GENRE         "Ãþ«¬"
+
+IDSTR_HELPLIBRARY      "MMPARTS.HLP"
+IDSTR_CWMMDATAFILETITLE "MMData file"
+;Titles of audio classes
+IDSTR_CWAUDIOTITLE   "Digital Audio"
+IDSTR_AIFTITLE       "AIFAudio.AIF"
+IDSTR_AUTITLE        "AUAudio.AU"
+IDSTR__AUTITLE       "_AUAudio._AU"
+IDSTR_IFFTITLE       "IFFAudio.IFF"
+IDSTR_SNDFTITLE      "SNDAudio.SND"
+IDSTR_VOCTITLE       "VOCAudio.VOC"
+IDSTR_WAVTITLE       "WAVAudio.WAV"
+IDSTR_OGGTITLE       "OGGAudio.OGG"
+IDSTR_MP3TITLE       "MP3Audio.MP3"
+IDSTR_MIDITITLE       "MIDI.MID"
+IDSTR_FLACTITLE       "FLACAudio.FLA"
+
+
+IDSTR_LIGHTTABLETITLE "Light table"
+
+IDSTR_ICONSIZEMENU    "Icon ~size"
+;Used as an information when starting and audio file from the WPS
+IDSTR_STARTINGTRACK      "Starting track..."
+IDSTR_AUDIOSCANNING     "Scanning Audiofile..."
+IDSTR_AUDIOSTREAMTITLE  "Audio-Stream"
+IDSTR_STREAMURLPAGENAME "~URL-Setting"
+IDSTR_CDTRACKTITLE      "CD-Track"
+IDSTR_M3UTITLE          "M3U playlist"
+;Titles used when starting player and editor applications
+IDSTR_AUDPLAYERTITLE       "Audio player"
+IDSTR_AUDEDITORTITLE       "Audio editor"
+IDSTR_M3UEDITORTITLE       "Playlist editor"
+IDSTR_TRACKPAUSED          " (paused)"
+;Used for window list
+IDSTR_VOLUMETITLE       "Volume"
+
+END
+
Index: /tags/CWMM-0.3.0_GA/classes/res/tw/cwimage_tw.rc
===================================================================
--- /tags/CWMM-0.3.0_GA/classes/res/tw/cwimage_tw.rc	(revision 213)
+++ /tags/CWMM-0.3.0_GA/classes/res/tw/cwimage_tw.rc	(revision 213)
@@ -0,0 +1,49 @@
+#ifndef OS2_INCLUDED
+   #include <os2.h>
+#endif
+CODEPAGE 950
+
+MENU ID_MENU_IMGEDITOR
+BEGIN
+        MENUITEM "¬Û€ùœs¿èŸ¹(~E)", ID_MENU_IMGEDITOR       
+END
+
+
+STRINGTABLE 
+BEGIN
+IDSTR_MENU_CONVERT "ÂàŽ«Šš(~C)"
+
+IDSTR_AVCTITLE      "AVCImage._IM"
+IDSTR_DIBTITLE      "DIBImage.DIB"
+IDSTR_GIFTITLE      "GIFImage.GIF"
+IDSTR_JPGTITLE      "JPGImage.JPG"
+IDSTR_PCDTITLE      "PCDImage.PCD"
+IDSTR_PCXTITLE      "PCXImage.PCX"
+IDSTR_TGATITLE      "TargaImage.TGA"
+IDSTR_TIFTITLE      "TIFImage.TIF"
+IDSTR_PNGTITLE      "PNGImage.PNG"
+IDSTR_MMOTIONTITLE  "VIDImage.VID"
+IDSTR_CWIMAGETITLE  "Digital image"
+
+IDSTR_IMAGEINFOPAGENAME "Œv¹³žê°T(~I)"
+IDSTR_SPRINTFPIXEL	"%d ¹³¯À"
+IDSTR_SPRINTFBIT       "%d Bit"
+;Bitmpap load errors
+IDSTR_NOIMGIOPROCERROR   "µLªk§äšìŠ¹Œv¹³ªº¿é€J¡þ¿é¥Xµ{§Ç¡C"
+IDSTR_OPENFILEERRORTITLE "ÀÉ®×¿ù»~"
+IDSTR_OPENFILEERROR      "µLªk¶}±ÒÀÉ®×¡C"
+IDSTR_NOMEMERROR         "µLªkšÏ¥Î°OŸÐÅé"
+IDSTR_IMGIOPROCCRASH     "¶}±ÒŒv¹³®Éµo¥Í€º³¡¿ù»~¡C¥²¶·­«·s±Ò°Ê®à­±©Îšt²Î¥i¯à€£Ã­©w¡I€£·|Ãö³¬¥¿Šb°õŠæªºÀ³¥Îµ{Š¡¡C"
+
+IDSTR_IMAGEDETAIL_WIDTH   "Œe«×"
+IDSTR_IMAGEDETAIL_HEIGHT  "°ª«×"
+IDSTR_IMAGEDETAIL_DEPTH   "²`«×"
+IDSTR_IMAGEDETAIL_FORMAT  "®æŠ¡"
+
+;Titles used when starting player and editor applications
+IDSTR_IMGEDITORTITLE       "Œv¹³ÀËµøŸ¹"
+IDSTR_MENU_IMAGEINFO        "Œv¹³žê°T¡G %d x %d x %d"
+
+;IDSTR_HELPLIBRARY   "MMPARTS.HLP"
+END
+
Index: /tags/CWMM-0.3.0_GA/classes/res/tw/cwvideo_tw.rc
===================================================================
--- /tags/CWMM-0.3.0_GA/classes/res/tw/cwvideo_tw.rc	(revision 213)
+++ /tags/CWMM-0.3.0_GA/classes/res/tw/cwvideo_tw.rc	(revision 213)
@@ -0,0 +1,11 @@
+CODEPAGE 950
+STRINGTABLE 
+BEGIN
+;Titles of video classes
+IDSTR_CWVIDEOTITLE       "ŒÆŠìµø°T"
+IDSTR_MPGTITLE       	 "MPGVideo.MPG"
+IDSTR_MOVTITLE       	 "MOVVideo.MOV"
+IDSTR_FLITITLE       	 "FLIVideo.FLI"
+IDSTR_AVITITLE       	 "AVIVideo.AVI"
+IDSTR_VIDPLAYERTITLE       "µø°TŒœ©ñŸ¹"
+END
Index: /tags/CWMM-0.3.0_GA/classes/res/tw/def.tpl
===================================================================
--- /tags/CWMM-0.3.0_GA/classes/res/tw/def.tpl	(revision 213)
+++ /tags/CWMM-0.3.0_GA/classes/res/tw/def.tpl	(revision 213)
@@ -0,0 +1,26 @@
+# Note: lines starting with '#' are comments.
+
+[DESCRIPTION]
+TW MM Resource-DLL
+
+[COPYRIGHT]
+(c) C. Wohlgemuth 2001-2005 Netlabs CWMM Team 2023
+
+[AUTHOR]
+Netlabs CWMM Team
+
+[NAME]
+# This is the NAME xxx WINDOWAPI|etc line in the def file.
+# Important: it specifies the internal name of the program. Don't leave out!
+LIBRARY MMRES_TW INITINSTANCE TERMINSTANCE
+
+[BUILDMACHINE]
+Zobopeep
+
+[OTHER]
+# Add all the lines here you want to have at the end of the generated DEF file
+PROTMODE
+CODE LOADONCALL DISCARDABLE
+DATA MULTIPLE NONSHARED
+EXPORTS
+        queryLanguage
Index: /tags/CWMM-0.3.0_GA/classes/res/tw/imageconv_tw.dlg
===================================================================
--- /tags/CWMM-0.3.0_GA/classes/res/tw/imageconv_tw.dlg	(revision 213)
+++ /tags/CWMM-0.3.0_GA/classes/res/tw/imageconv_tw.dlg	(revision 213)
@@ -0,0 +1,28 @@
+#ifndef OS2_INCLUDED
+   #include <os2.h>
+#endif
+
+DLGTEMPLATE IDDLG_IMGCONVERT LOADONCALL MOVEABLE DISCARDABLE
+BEGIN
+    DIALOG  "ÂàŽ«ŒÆŠìŒv¹³", IDDLG_IMGCONVERT, 68, 78, 207, 191, 
+            WS_VISIBLE, FCF_SYSMENU | FCF_TITLEBAR
+    BEGIN
+        GROUPBOX        "", IDGB_IMGCONVERT, 2, 19, 203, 172
+        LTEXT           "ÀÉŠW¡G", IDST_IMGCONVERTNAMELABEL, 7, 173, 32, 8
+        LTEXT           "", IDST_IMGCONVERTNAME, 44, 173, 156, 8
+        CONTROL         "", IDSR_BMP, 12, 100, 185, 69, WC_STATIC, 
+                        SS_FGNDRECT | WS_GROUP | WS_VISIBLE
+        LTEXT           "ÂàŽ«Šš", IDST_IMGCONVERTTO, 7, 88, 53, 8
+        CONTROL         "", IDDD_IMGIOPROC, 6, 6, 196, 78, WC_COMBOBOX, 
+                        CBS_DROPDOWNLIST | LS_HORZSCROLL | WS_GROUP | 
+                        WS_TABSTOP | WS_VISIBLE
+        LTEXT           "¥ØŒÐÀÉŠW¡G", 2419, 7, 57, 64, 8
+        ENTRYFIELD      "", IDEF_IMGCONVERTTARGETNAME, 9, 45, 139, 8, ES_MARGIN
+        PUSHBUTTON      "ø°Äý(~B)...", IDPB_IMGCONVERTBROWSE, 153, 42, 47, 14
+        CONTROL         "", IDBAR_IMGCONVERTPROGRESS, 6, 24, 194, 13, 
+                        "CW_PERCENTBAR", 5 | WS_GROUP | WS_VISIBLE
+        DEFPUSHBUTTON   "ÂàŽ«(~C)", IDPB_IMGCONVERTOK, 20, 2, 47, 14
+        PUSHBUTTON      "Ãö©ó(~A)", IDPB_IMGCONVERTABORT, 71, 2, 40, 14
+        PUSHBUTTON      "Ãö³¬(~L)", IDPB_IMGCONVERTCLOSE, 135, 2, 40, 14
+    END
+END
Index: /tags/CWMM-0.3.0_GA/classes/res/tw/imageconv_tw.rc
===================================================================
--- /tags/CWMM-0.3.0_GA/classes/res/tw/imageconv_tw.rc	(revision 213)
+++ /tags/CWMM-0.3.0_GA/classes/res/tw/imageconv_tw.rc	(revision 213)
@@ -0,0 +1,9 @@
+#ifndef OS2_INCLUDED
+   #include <os2.h>
+#endif
+CODEPAGE 950
+
+STRINGTABLE
+BEGIN
+IDSTR_IMAGEBROWSETITLE   "Œv¹³ÀÉŠWºÙ"
+END
Index: /tags/CWMM-0.3.0_GA/classes/res/tw/makefile
===================================================================
--- /tags/CWMM-0.3.0_GA/classes/res/tw/makefile	(revision 213)
+++ /tags/CWMM-0.3.0_GA/classes/res/tw/makefile	(revision 213)
@@ -0,0 +1,54 @@
+# Makefile for CWMM resource dll
+
+include ../../../make.inc
+include ../../../build.inc
+
+LANGUAGE	=	_tw
+
+CC           = icc
+CPPFLAGS     = /Ge- /Gm+ /G4 /Gl  /O+ /Oc+ /Ol- /Q+ $(VACDEBUG)
+INC	=	../../inc
+DEFS         =
+#TOOLDIR =      $(BUILD_ROOT)\classes\mm-progs
+OBJDIR	=	../dll
+
+OBJECTS	= 	$(INC)\mmres.h mmres$(LANGUAGE).rc \
+			audioplayer$(LANGUAGE).dlg audioplayer$(LANGUAGE).rc \
+			audioconv$(LANGUAGE).dlg audioconv$(LANGUAGE).rc \
+			volume$(LANGUAGE).rc volume$(LANGUAGE).dlg \
+			imageconv$(LANGUAGE).dlg imageconv$(LANGUAGE).rc \
+			cwaudio$(LANGUAGE).rc cwaudio$(LANGUAGE).dlg \
+			cwimage$(LANGUAGE).rc cwvideo$(LANGUAGE).rc \
+			mmfind$(LANGUAGE).dlg mmfind$(LANGUAGE).rc
+
+
+all:	$(OBJDIR)/mmres$(LANGUAGE).dll
+
+$(OBJDIR)/mmres$(LANGUAGE).dll:	mmres$(LANGUAGE).c $(OBJECTS) 
+		cmd /C $(TOOLDIR)/create_def.cmd mmres$(LANGUAGE).def
+		icc $(CPPFLAGS) -I$(INC) /Fe$(OBJDIR)\$@ $< mmres$(LANGUAGE).def
+		rc -cp 950 -D $(ECS) -i $(INC) mmres$(LANGUAGE).rc $(OBJDIR)/mmres$(LANGUAGE).dll
+		rc -cp 950 -r -D $(ECS) -i $(INC) mmres$(LANGUAGE).rc $(OBJDIR)/mmres$(LANGUAGE).res
+#		rc  mmres$(LANGUAGE).res $(OBJDIR)/mmres$(LANGUAGE).dll
+
+#(OBJDIR)/mmres$(LANGUAGE).res:	mmres$(LANGUAGE).rc $(OBJECTS)
+#		rc -D $(ECS) -i $(INC) -r mmres$(LANGUAGE).rc
+
+
+restest:	
+	echo  $(deftext)> test.def
+
+                		
+clean:
+	-rm $(OBJDIR)/*.obj
+	-rm $(OBJDIR)/*.dll
+	-rm $(OBJDIR)/*.res
+	-rm *.*~
+	-rm *.flc
+	-rm *.RES
+	-rm *.obj
+	-rm *.def
+
+
+	
+
Index: /tags/CWMM-0.3.0_GA/classes/res/tw/mmfind_tw.dlg
===================================================================
--- /tags/CWMM-0.3.0_GA/classes/res/tw/mmfind_tw.dlg	(revision 213)
+++ /tags/CWMM-0.3.0_GA/classes/res/tw/mmfind_tw.dlg	(revision 213)
@@ -0,0 +1,55 @@
+#ifndef OS2_INCLUDED
+   #include <os2.h>
+#endif
+
+DLGTEMPLATE IDDLG_MMFIND LOADONCALL MOVEABLE DISCARDABLE
+BEGIN
+    DIALOG  "Find Multimedia File", IDDLG_MMFIND, 12, 23, 338, 133, WS_VISIBLE | WS_SYNCPAINT, 
+            FCF_SYSMENU | FCF_TITLEBAR
+            PRESPARAMS PP_FONTNAMESIZE, "9.WarpSans"
+    BEGIN
+        LTEXT           "Open filename", 257, 4, 120, 51, 9, DT_VCENTER | 
+                        NOT WS_GROUP
+        ENTRYFIELD      "*", 258, 55, 120, 239, 7, ES_MARGIN | WS_GROUP
+        LTEXT           "Drive", 259, 4, 108, 51, 9, DT_VCENTER | NOT 
+                        WS_GROUP
+        CONTROL         "H:  [SOURCES]", 260, 54, 18, 87, 99, WC_COMBOBOX, 
+                        CBS_DROPDOWNLIST | WS_TABSTOP | WS_VISIBLE
+        LTEXT           "Restrict files to", 261, 174, 4, 46, 9, DT_VCENTER | 
+                        NOT WS_GROUP | NOT WS_VISIBLE
+        CONTROL         "<All Files>", 262, 209, 4, 29, 8, WC_COMBOBOX, 
+                        CBS_DROPDOWNLIST | WS_TABSTOP
+        LTEXT           "Directory", 263, 4, 97, 35, 7, NOT WS_GROUP
+        LTEXT           "", 270, 42, 98, 60, 6, NOT WS_GROUP | NOT 
+                        WS_VISIBLE
+        LTEXT           "File", 265, 131, 97, 17, 7, NOT WS_GROUP
+        AUTOCHECKBOX    "Read-Only", 269, 171, 97, 42, 8, NOT WS_TABSTOP | 
+                        NOT WS_VISIBLE
+        LISTBOX         264, 4, 17, 116, 76, LS_OWNERDRAW | LS_HORZSCROLL
+        LISTBOX         266, 125, 17, 116, 76, LS_HORZSCROLL
+        RTEXT           "Type of file", IDST_TYPE, 146, 108, 58, 9, DT_VCENTER
+        CONTROL         "", IDCB_TYPEOFFILE, 208, 18, 87, 99, WC_COMBOBOX, 
+                        CBS_DROPDOWNLIST | WS_GROUP | WS_TABSTOP | 
+                        WS_VISIBLE
+        GROUPBOX        "Preview", IDGB_PREVIEW, 245, 16, 89, 80, NOT WS_VISIBLE
+        CONTROL         "", IDSR_IMGPREVIEW, 249, 20, 82, 68, WC_STATIC, SS_FGNDRECT | 
+                        WS_GROUP
+        CTEXT           "No preview available", IDST_NOPREVIEWAVAILABLE, 251, 42, 78, 33, 
+                        DT_WORDBREAK | NOT WS_VISIBLE
+        LTEXT           "", IDST_AUDIOINFO, 253, 41, 75, 42, DT_WORDBREAK | NOT 
+                        WS_VISIBLE
+        GROUPBOX        "Audio info", IDGB_AUDIOINFO, 245, 17, 89, 79, NOT WS_VISIBLE
+        PUSHBUTTON      "Stop", IDPB_MMFINDSTOP, 267, 19, 21, 10, 
+                        BS_NOPOINTERFOCUS | NOT WS_TABSTOP
+        PUSHBUTTON      "Play", IDPB_MMFINDPLAY, 291, 19, 21, 10, 
+                        BS_NOPOINTERFOCUS | NOT WS_TABSTOP
+        DEFPUSHBUTTON   "~OK", DID_OK, 3, 2, 40, 12
+        PUSHBUTTON      "~New...", IDPB_NEWFILE, 46, 2, 40, 12
+        PUSHBUTTON      "Apply", 268, 293, 3, 40, 12, NOT WS_TABSTOP | NOT 
+                        WS_VISIBLE
+        PUSHBUTTON      "~Cancel", DID_CANCEL, 95, 2, 40, 12, NOT WS_TABSTOP
+        PUSHBUTTON      "Help", 267, 243, 2, 40, 12, BS_NOPOINTERFOCUS | NOT 
+                        WS_TABSTOP | NOT WS_VISIBLE
+        LISTBOX         3, 0, 0, 2, 1, NOT WS_TABSTOP | NOT WS_VISIBLE
+    END
+END
Index: /tags/CWMM-0.3.0_GA/classes/res/tw/mmfind_tw.rc
===================================================================
--- /tags/CWMM-0.3.0_GA/classes/res/tw/mmfind_tw.rc	(revision 213)
+++ /tags/CWMM-0.3.0_GA/classes/res/tw/mmfind_tw.rc	(revision 213)
@@ -0,0 +1,13 @@
+#ifndef OS2_INCLUDED
+   #include <os2.h>
+#endif
+CODEPAGE 950
+STRINGTABLE
+BEGIN
+IDSTR_TYPEAUDIO       "Audio"
+IDSTR_TYPEIMAGE       "Image"
+IDSTR_TYPEVIDEO       "Video"
+IDSTR_AUDIOINFOTEXT   "Play time:\t%02d:%02d\x0a\x0aSamplerate:\t%d\x0a\x0aBits per sample:\t%d\x0a\x0aChannels:\t%d"
+IDSTR_NOMMTEMPLATEFLDRTITLE "Error during file creation"
+IDSTR_NOMMTEMPLATEFLDR "Multimedia template folder can't be found. It may has lost the object ID <MMPM2_MMTEMPLATEFOLDER>."
+END
Index: /tags/CWMM-0.3.0_GA/classes/res/tw/mmres_tw.c
===================================================================
--- /tags/CWMM-0.3.0_GA/classes/res/tw/mmres_tw.c	(revision 213)
+++ /tags/CWMM-0.3.0_GA/classes/res/tw/mmres_tw.c	(revision 213)
@@ -0,0 +1,26 @@
+/*
+ * This file is (C) Chris Wohlgemuth 2003
+ */
+/*
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; see the file COPYING.  If not, write to
+ * the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+
+#include <os2.h>
+
+PSZ queryLanguage()
+{
+  return "Taiwan";
+}
+
Index: /tags/CWMM-0.3.0_GA/classes/res/tw/mmres_tw.rc
===================================================================
--- /tags/CWMM-0.3.0_GA/classes/res/tw/mmres_tw.rc	(revision 213)
+++ /tags/CWMM-0.3.0_GA/classes/res/tw/mmres_tw.rc	(revision 213)
@@ -0,0 +1,33 @@
+#define  INCL_GRAPHICBUTTON   /* need this for the graphic buttons control */
+#define  INCL_BITMAP
+
+#ifndef OS2_INCLUDED
+   #include <os2.h>
+#endif
+#include <sw.h>
+
+#include "mmres.h"
+;#include "version.h"
+;#include "build.h"
+CODEPAGE 950
+
+;Dialog Resources for volume.exe
+rcinclude "volume_tw.rc"
+rcinclude "volume_tw.dlg"
+
+rcinclude "audioconv_tw.rc"
+rcinclude "audioconv_tw.dlg"
+
+rcinclude "imageconv_tw.rc"
+rcinclude "imageconv_tw.dlg"
+
+rcinclude "audioplayer_tw.rc"
+rcinclude "audioplayer_tw.dlg"
+
+rcinclude "classvolume_tw.dlg"
+
+rcinclude "cwaudio_tw.rc"
+rcinclude "cwaudio_tw.dlg"
+
+rcinclude "cwimage_tw.rc"
+rcinclude "cwvideo_tw.rc"
Index: /tags/CWMM-0.3.0_GA/classes/res/tw/volume_tw.dlg
===================================================================
--- /tags/CWMM-0.3.0_GA/classes/res/tw/volume_tw.dlg	(revision 213)
+++ /tags/CWMM-0.3.0_GA/classes/res/tw/volume_tw.dlg	(revision 213)
@@ -0,0 +1,20 @@
+#ifndef OS2_INCLUDED
+   #include <os2.h>
+#endif
+#define INCL_GRAPHICBUTTON
+#include <sw.h>
+
+
+DLGTEMPLATE IDDLG_VOLUME LOADONCALL MOVEABLE DISCARDABLE
+BEGIN
+    DIALOG  "­µ¶q", IDDLG_VOLUME, 73, 148, 112, 56,  
+             WS_VISIBLE, FCF_SYSMENU | FCF_TITLEBAR |  FCF_TASKLIST |
+            FCF_MINBUTTON
+    BEGIN
+        CONTROL         "­µ¶q(~V)", IDCS_VOLUME, 3, 3, 63, 44, WC_CIRCULARSLIDER, 
+                        WS_GROUP | WS_VISIBLE | WS_TABSTOP
+        CONTROL         "ÀR­µ(~M)", IDPB_MUTE ,  65, 17, 40, 14, WC_GRAPHICBUTTON,
+			 WS_VISIBLE | GBS_AUTOTWOSTATE | WS_TABSTOP
+        GROUPBOX        "", IDGB_VOLUME, 1, 2, 109, 53
+    END
+END
Index: /tags/CWMM-0.3.0_GA/classes/res/tw/volume_tw.rc
===================================================================
--- /tags/CWMM-0.3.0_GA/classes/res/tw/volume_tw.rc	(revision 213)
+++ /tags/CWMM-0.3.0_GA/classes/res/tw/volume_tw.rc	(revision 213)
@@ -0,0 +1,10 @@
+#ifndef OS2_INCLUDED
+   #include <os2.h>
+#endif
+CODEPAGE 950
+MENU    IDM_POPUP
+BEGIN
+    MENUITEM    "ÁôÂÃŒÐÃDŠC(~H)",    IDM_ITEMTITLEBAR
+    MENUITEM    "",    0, MIS_SEPARATOR
+    MENUITEM    "žõ¥X(~X)",    IDM_ITEMEXIT
+END
Index: /tags/CWMM-0.3.0_GA/common_functions/ea_funcs.c
===================================================================
--- /tags/CWMM-0.3.0_GA/common_functions/ea_funcs.c	(revision 213)
+++ /tags/CWMM-0.3.0_GA/common_functions/ea_funcs.c	(revision 213)
@@ -0,0 +1,290 @@
+/*
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; see the file COPYING.  If not, write to
+ * the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+/*
+ * If you need another license for your project/product contact me at
+ * 
+ * http://www.os2world.com/cdwriting
+ * http://www.geocities.com/SiliconValley/Sector/5785/
+ */
+
+#define INCL_PM
+#define  INCL_ERRORS
+#include <os2.h>
+#include <wpfolder.h>
+#include "sys_funcs.h"
+
+/*!*************************************************************/
+/*                                                             */
+/* @@FUNC                                                      */
+/*        BOOL EASaveString(WPFileSystem * wpFSObject,         */
+/*                          PSZ pKey, PSZ pValue)              */
+/*                                                             */
+/*                                                             */
+/* @@DESC                                                      */
+/*        Save an ASCII value to the EA <pKey> of the          */
+/*        filesystem object <wpFSObject>.                      */
+/*                                                             */
+/* @@RETURNS                                                   */
+/*                                                             */
+/* BOOL rc                                                     */
+/*                                                             */
+/* TRUE if the string was saved in the extended attribute,     */
+/* FALSE otherwise.                                            */
+/*                                                             */
+/* @@PARAM                                                     */
+/*                                                             */
+/* WPFileSystem* wpFSObject input                              */
+/*                                                             */
+/* Pointer to a file system object.                            */
+/*                                                             */
+/* @@PARAM                                                     */
+/*                                                             */
+/* PSZ pKey input                                              */
+/*                                                             */
+/* Attribute name to be used.                                  */
+/*                                                             */
+/* @@PARAM                                                     */
+/*                                                             */
+/* PSZ pValue input                                            */
+/*                                                             */
+/* The null terminated string to be saved in the extended      */
+/* attribute :hp2.pKey:ehp2..                                  */
+/* :p.                                                         */
+/* If this is an empty string or NULL the attribute will       */
+/* be deleted from the file.                                   */
+/*                                                             */
+/* @@REMARKS                                                   */
+/*                                                             */
+/* Attribute names starting with a point (:hp2..:ehp2.) are    */
+/* reserved for the operating system.                          */
+/*                                                             */
+/*                                                             */
+/*                                                             */
+/*                                                             */
+/*!!************************************************************/
+BOOL EASaveString(WPFileSystem * wpFSObject,  PSZ pKey, PSZ pValue)
+{
+  LONG rc;                             /* Ret code                   */
+  PVOID       fealist;                 /* fealist buffer             */
+  EAOP2       eaop;                    /* eaop structure             */
+  PFEA2       pfea;                    /* pfea structure             */
+  HFILE       handle;                  /* file handle                */
+  ULONG       act;                     /* open action                */
+  ULONG       ulSize;
+  USHORT      usSizeEA;
+
+  char chrFileName[CCHMAXPATH];
+
+  //SysWriteToTrapLog("%s %s\n", pKey, pValue);
+
+  if(!somIsObj(wpFSObject) || !pKey || strlen(pKey)==0)
+    return FALSE;
+
+  if(pValue) {
+    if((fealist=_wpAllocMem(wpFSObject, strlen(pKey)+strlen(pValue)+sizeof(FEA2)+0x100 /* Add some space */,
+                            &ulSize))==NULLHANDLE)
+      return FALSE;
+  }
+  else {
+    if((fealist=_wpAllocMem(wpFSObject, strlen(pKey)+sizeof(FEA2)+0x100 /* Add some space */,
+                            &ulSize))==NULLHANDLE)
+      return FALSE;
+  }
+
+  ulSize=sizeof(chrFileName);
+  _wpQueryRealName(wpFSObject, chrFileName,&ulSize,TRUE);
+
+
+  if ((rc = DosOpen(chrFileName, &handle, &act,
+      0L, 0, OPEN_ACTION_OPEN_IF_EXISTS,
+      OPEN_ACCESS_READWRITE + OPEN_SHARE_DENYWRITE +
+      OPEN_FLAGS_FAIL_ON_ERROR + OPEN_FLAGS_WRITE_THROUGH, NULL))!=NO_ERROR) {
+    _wpFreeMem(wpFSObject,fealist);     /* Free the memory            */
+    return FALSE;
+  }
+
+  eaop.fpFEA2List = (PFEA2LIST)fealist;/* Set memory for the FEA        */
+  eaop.fpGEA2List = NULL;              /* GEA is unused                 */
+  pfea = &eaop.fpFEA2List->list[0];    /* point to first FEA            */
+  pfea->fEA = '\0';                    /* set the flags to non critical */
+                                       /* Size of FEA name field        */
+  pfea->cbName = (BYTE)strlen(pKey);
+  strcpy((PSZ)pfea->szName, pKey);     /* Set the name of this FEA      */
+
+
+  /* Size of Value for this one */
+  if(!pValue || strlen(pValue)==0) {
+    pfea->cbValue = 0;                 /* Delete EA if no Value given   */
+  }
+  else {
+    pfea->cbValue = (SHORT)strlen(pValue)+4; /* 4 bytes for marking as ASCII attribute */
+
+    /* Set the EA value after the FEA2 */
+    usSizeEA=0xFFFD;
+    memcpy((PSZ)pfea->szName+(pfea->cbName+1), &usSizeEA, 2);             /* It's an ASCII value    */
+    usSizeEA=strlen(pValue);
+    memcpy((PSZ)pfea->szName+(pfea->cbName+3), &usSizeEA, sizeof(USHORT));/* Length of ASCII value  */
+    
+    memcpy((PSZ)pfea->szName+(pfea->cbName+5), pValue, usSizeEA);         /* And now the value      */
+  }
+  pfea->oNextEntryOffset = 0;                                           /* no next entry          */
+  eaop.fpFEA2List->cbList =                                             /* Set the total size var */
+      sizeof(ULONG) + sizeof(FEA2) + pfea->cbName + pfea->cbValue;
+
+  /* set the file info          */
+  rc = DosSetFileInfo(handle, 2, (PSZ)&eaop, sizeof(EAOP2));
+  DosClose(handle);                                                     /* Close the File         */
+  _wpFreeMem(wpFSObject,fealist);                                       /* Free the memory        */
+  return TRUE;
+}
+
+/*!*************************************************************/
+/*                                                             */
+/* @@FUNC                                                      */
+/*        BOOL EARestoreString(WPFileSystem * wpFSObject,      */
+/*             PSZ pKey, char * chrBuffer, ULONG ulBuffSize)   */
+/*                                                             */
+/*                                                             */
+/* @@DESC                                                      */
+/*        Read an ASCII value from the EA <pKey> of the        */
+/*        filesystem object <wpFSObject>.                      */
+/*                                                             */
+/* @@RETURNS                                                   */
+/*                                                             */
+/* BOOL rc                                                     */
+/*                                                             */
+/* TRUE if the string was queried from the extended attribute, */
+/* FALSE in case of an error or if there's no attribute        */
+/* with the specified name.                                    */
+/*                                                             */
+/* @@PARAM                                                     */
+/*                                                             */
+/* WPFileSystem* wpFSObject input                              */
+/*                                                             */
+/* Pointer to a file system object.                            */
+/*                                                             */
+/* @@PARAM                                                     */
+/*                                                             */
+/* PSZ pKey input                                              */
+/*                                                             */
+/* Attribute name.                                             */
+/*                                                             */
+/* @@PARAM                                                     */
+/*                                                             */
+/* char* chrBuffer in/out                                      */
+/*                                                             */
+/* Buffer into which the string will be placed.                */
+/*                                                             */
+/* @@PARAM                                                     */
+/*                                                             */
+/* ULONG ulBuffSize input                                      */
+/*                                                             */
+/* Size of buffer :hp2.chrBuffer:ehp2..                        */
+/*                                                             */
+/* @@REMARKS                                                   */
+/*                                                             */
+/* The string is always null terminated. If the buffer isn't   */
+/* large enough at most ulBuffSize-1 characters will be read.  */
+/*                                                             */
+/*                                                             */
+/*!!************************************************************/
+BOOL EARestoreString(WPFileSystem * wpFSObject,  PSZ pKey, char * chrBuffer, ULONG ulBuffSize)
+{
+  LONG rc;                             /* Ret code                   */
+  UCHAR       geabuff[300];            /* buffer for GEA             */
+  PVOID       fealist;                 /* fealist buffer             */
+  EAOP2       eaop;                    /* eaop structure             */
+  PGEA2       pgea;                    /* pgea structure             */
+  PFEA2       pfea;                    /* pfea structure             */
+  HFILE       handle;                  /* file handle                */
+  ULONG       act;                     /* open action                */
+  ULONG ulSize;
+  USHORT     *ptrUs;
+
+  char chrFileName[CCHMAXPATH];
+
+  if((fealist=_wpAllocMem(wpFSObject, 0x00010000L /* Add some space */,
+                          &ulSize))==NULLHANDLE)
+    return FALSE;
+
+  ulSize=sizeof(chrFileName);
+  _wpQueryRealName(wpFSObject, chrFileName,&ulSize,TRUE);
+
+  if ((rc = DosOpen(chrFileName, &handle, &act,
+      0L, 0, OPEN_ACTION_OPEN_IF_EXISTS,
+      OPEN_ACCESS_READONLY + OPEN_SHARE_DENYREADWRITE +
+      OPEN_FLAGS_FAIL_ON_ERROR + OPEN_FLAGS_WRITE_THROUGH,NULL))!=NO_ERROR) {
+    _wpFreeMem(wpFSObject,fealist);    /* Free the memory            */
+    return FALSE;
+  }                                    /* get the file status info   */
+
+
+                                       /* FEA and GEA lists          */
+  eaop.fpGEA2List = (PGEA2LIST)geabuff;
+  eaop.fpFEA2List = (PFEA2LIST)fealist;
+  eaop.oError = 0;                     /* no error occurred yet      */
+  pgea = &eaop.fpGEA2List->list[0];    /* point to first GEA         */
+  eaop.fpGEA2List->cbList = sizeof(ULONG) + sizeof(GEA2) +
+    strlen(pKey);
+  eaop.fpFEA2List->cbList = (ULONG)0xffff;
+
+                                       /* fill in the EA name length */
+  pgea->cbName = (BYTE)strlen(pKey);
+  strcpy(pgea->szName, pKey);          /* fill in the name           */
+  pgea->oNextEntryOffset = 0;          /* fill in the next offset    */
+                                       /* read the extended attribute*/
+  rc = DosQueryFileInfo(handle, 3, (PSZ)&eaop, sizeof(EAOP2));
+  DosClose(handle);                    /* close the file             */
+  if (eaop.fpFEA2List->cbList <= sizeof(ULONG))
+    rc = ERROR_EAS_NOT_SUPPORTED;      /* this is error also         */
+
+  if (rc) {                            /* failure?                   */
+    _wpFreeMem(wpFSObject,fealist);    /* Free the memory            */
+    return FALSE;
+  }
+
+  pfea = &(eaop.fpFEA2List->list[0]);  /* point to the first FEA     */
+
+#if 0
+  ldp.shvb.shvname.strptr = ldp.varname;
+  ldp.shvb.shvname.strlength = ldp.stemlen;
+  ldp.shvb.shvnamelen = ldp.stemlen;
+  ldp.shvb.shvvalue.strptr = ((PSZ)pfea->szName+(pfea->cbName+1));
+  ldp.shvb.shvvalue.strlength = pfea->cbValue;
+  ldp.shvb.shvvaluelen = ldp.shvb.shvvalue.strlength;
+#endif
+
+  ptrUs=(USHORT*)((PSZ)pfea->szName+(pfea->cbName+1));
+  if(*ptrUs!=0xfffd) {
+    /* Not an ASCII EA */
+    _wpFreeMem(wpFSObject,fealist);    /* Free the memory            */
+    return FALSE;
+  }
+  ptrUs++; /* Move to length */
+  ulSize=(ULONG)*ptrUs;
+
+  ptrUs++; /* Move to value */
+  if(ulSize==0) {
+    /* Not an ASCII EA */
+    _wpFreeMem(wpFSObject,fealist);    /* Free the memory            */
+    return FALSE;
+  }
+  //  HlpWriteToTrapLog("Length: %x, Value: %s\n", ulSize, (char*)ptrUs);
+  memset(chrBuffer,0,ulBuffSize);
+  memcpy(chrBuffer, (char*)ptrUs, (ulSize>=ulBuffSize ? ulBuffSize-1 : ulSize));
+  _wpFreeMem(wpFSObject,fealist);    /* Free the memory            */
+  return TRUE;
+}
Index: /tags/CWMM-0.3.0_GA/common_functions/hash_funcs.c
===================================================================
--- /tags/CWMM-0.3.0_GA/common_functions/hash_funcs.c	(revision 213)
+++ /tags/CWMM-0.3.0_GA/common_functions/hash_funcs.c	(revision 213)
@@ -0,0 +1,29 @@
+#include <os2.h>
+
+#define HASHSIZE 101
+ULONG calculateHash(char * theString)
+{
+  ULONG ulHash=0;
+
+  if(theString)
+    for(ulHash=0;*theString!='\0'; theString++)
+      ulHash=*theString+31*ulHash;
+  
+  return ulHash%HASHSIZE;
+}
+//#define HASHSIZE2 123
+ULONG calculateHash2(char * theString)
+{
+  ULONG ulHash=0;
+
+  if(theString)
+    for(ulHash=0;*theString!='\0'; theString++)
+      ulHash=*theString+37*ulHash;
+  
+  return ulHash%HASHSIZE;
+}
+
+USHORT calculateTheHash(char *chrCommand)
+{
+  return ((calculateHash(chrCommand)<<8) + calculateHash2(chrCommand));
+}
Index: /tags/CWMM-0.3.0_GA/common_functions/helper.c
===================================================================
--- /tags/CWMM-0.3.0_GA/common_functions/helper.c	(revision 213)
+++ /tags/CWMM-0.3.0_GA/common_functions/helper.c	(revision 213)
@@ -0,0 +1,763 @@
+/*
+ * This file is (C) Chris Wohlgemuth 2001/2003
+ */
+/*
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; see the file COPYING.  If not, write to
+ * the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+/*
+ * If you need another license for your prject/product contact me at
+ *
+ * http://www.os2world.com/cdwriting
+ * http://www.geocities.com/SiliconValley/Sector/5785/
+ */
+#define INCL_WIN
+#define INCL_GPI
+#define INCL_DOS
+#define INCL_DOSERRORS
+
+#include <os2.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+
+#include <stdio.h>
+#include <string.h>
+#include <stdarg.h>
+#include "mmprogs_defaults.h"
+#include "sys_funcs.h"
+
+//#define INSTALLDIR 1
+
+#define INI_BGCLR_KEY            (PSZ)"bg"
+#define INI_FGCLR_KEY            (PSZ)"fg"
+#define INI_BTNBGCLR_KEY         (PSZ)"btnbg"
+#define INI_BTNFGCLR_KEY         (PSZ)"btnfg"
+#define INI_ACTIVETBBGCLR_KEY    (PSZ)"activetbbg"
+#define INI_INACTIVETBBGCLR_KEY  (PSZ)"inactivetbbg"
+#define INI_ACTIVETBFGCLR_KEY    (PSZ)"activetbfg"
+#define INI_INACTIVETBFGCLR_KEY  (PSZ)"inactivetbfg"
+
+/* The subdirectory in the installation directory where to put the log files */
+#define LOGFILE_SUBDIR "Logfiles"
+#define EXCEPTION_LOGFILE_NAME "CWMMCls.log"
+
+#define RESDLLNAME "\\mmres_%c%c.dll"
+#define DEFRESDLLNAME "\\mmres_en.dll"
+
+extern PSZ params[];
+extern HMODULE RESSOURCEHANDLE;
+extern char logName[];
+
+char chrInstallDir[CCHMAXPATH];
+
+SWP swpWindow;
+
+HMODULE _queryResModuleHandle2(char *installDir);
+BOOL IniSaveData(PSZ iniFile, PSZ chrApp, PSZ chrKey, PVOID theData, ULONG ulSize);
+BOOL IniRestoreData(PSZ iniFile, PSZ chrApp, PSZ chrKey, PVOID theData, PULONG ulMaxSize);
+void writeLog(PSZ logText);
+void HlpWriteToTrapLog(const char* chrFormat, ...);
+
+
+void removeLog(void)
+{
+  char logNameLocal[CCHMAXPATH];
+
+  sprintf(logNameLocal,"%s\\%s\\%s",params[1],LOGFILE_SUBDIR,logName);
+
+  remove(logNameLocal);
+}
+
+void removeLog2(char * installDir, char * logName)
+{
+  char logNameLocal[CCHMAXPATH];
+
+  sprintf(logNameLocal,"%s\\%s\\%s",installDir,LOGFILE_SUBDIR,logName);
+  remove(logNameLocal);
+}
+
+void writeLog(PSZ logText)
+{
+  char logNameLocal[CCHMAXPATH];
+  FILE *fHandle;
+
+  sprintf(logNameLocal,"%s\\%s\\%s",params[1],LOGFILE_SUBDIR,logName);
+  fHandle=fopen(logNameLocal,"a");
+  if(fHandle) {
+    fprintf(fHandle,logText);
+    fclose(fHandle);
+  }
+}
+
+BOOL buildLogName( char * outBuf, char * logName,ULONG ulSize)
+{
+  if(sprintf(outBuf, /*ulSize,*/"logfiles\\%s",logName)==EOF)
+    return FALSE;
+  return TRUE;
+}
+
+
+/* This function launches the wrapper <wrapperExe>         */
+/*  with the params given as a PM-session */
+/* in PSZ parameter. PSZ folderPath is the path to put the */
+/* write.log. HWND hwnd is the window waiting for the      */
+/* WM_APPTERMINATE message                                 */
+ULONG launchPMWrapper(PSZ chrInstallDir, PSZ parameter, PSZ folderPath, PSZ wrapperExe, PSZ pszTitle)
+{
+  STARTDATA startData={0};
+  PID pid;
+  ULONG ulSessionID=0;
+  UCHAR chrLoadError[CCHMAXPATH];
+  UCHAR startParams[CCHMAXPATH*4];
+  UCHAR exename[CCHMAXPATH]={0};
+  UCHAR chrFolderPath[CCHMAXPATH+10];
+
+  memset(&startData,0,sizeof(startData));
+  startData.Length=sizeof(startData);
+  startData.Related=SSF_RELATED_INDEPENDENT;
+  startData.FgBg=SSF_FGBG_FORE;
+  startData.TraceOpt=SSF_TRACEOPT_NONE;
+  startData.PgmTitle=pszTitle;
+
+  /*  sprintf(exename,"%s",buildWrapName(wrapperExe));*/
+  sprintf((PCHAR)exename,"%s\\bin\\%s",params[1],wrapperExe);
+  /*
+    if(!checkHelper(exename))
+    return -1;
+    */
+
+  startData.PgmName=exename;
+  startData.InheritOpt=SSF_INHERTOPT_SHELL;
+  startData.SessionType=SSF_TYPE_PM;
+  startData.PgmControl=0;
+  startData.InitXPos=30;
+  startData.InitYPos=30;
+  startData.InitXSize=500;
+  startData.InitYSize=400;
+  startData.ObjectBuffer=chrLoadError;
+  startData.ObjectBuffLen=(ULONG)sizeof(chrLoadError);
+
+  /* Put the exe-path between " " to make sure, spaces are handled correctly */
+  strcpy((PCHAR)chrFolderPath,(PCHAR)folderPath);
+  sprintf((PCHAR)startParams,"\"%s\" \"%s\" %s",
+          (PCHAR)chrInstallDir,(PCHAR)chrFolderPath, (PCHAR)parameter);
+  startData.PgmInputs=startParams;
+
+  DosStartSession(&startData,&ulSessionID,&pid);
+  return 0;
+}
+
+
+BOOL IniRestoreWindowPos(char * iniFile, PSZ chrApp, PSZ chrKey, HWND hwnd)
+{
+  HINI hini=0;
+  ULONG ulSize;
+  BOOL bError=FALSE;
+  SWP swp;
+
+  /* Open ini-file */
+  hini=PrfOpenProfile(WinQueryAnchorBlock(HWND_DESKTOP),(unsigned char *)iniFile);
+  do{
+    if(!hini) {
+#if 0
+      /* profileName: "Warning! Cannot open Ini-file!"
+         moduleName: "Data-CD-Creator"
+         */
+      messageBox( profileName, IDSTR_INIFILEOPENWARNING , sizeof(profileName),
+                  moduleName, IDSTRD_DATACDCREATOR, sizeof(moduleName),
+                  RESSOURCEHANDLE, HWND_DESKTOP, MB_OK | MB_ICONEXCLAMATION|MB_MOVEABLE);
+#endif
+      break;
+    }/* end of if(!hini) */
+
+    ulSize=sizeof(swp);
+    if(!PrfQueryProfileData(hini, chrApp, chrKey, &swp, &ulSize))
+      bError=TRUE;
+
+    if(hini)
+      PrfCloseProfile(hini);
+
+    if(bError)
+      break;
+    WinSetWindowPos(hwnd, NULLHANDLE, swp.x, swp.y, swp.cx, swp.cy, SWP_MOVE/*|SWP_SIZE*/);
+    return TRUE;
+  } while(TRUE);
+
+  return FALSE;
+}
+
+BOOL IniSaveWindowPos(PSZ iniFile, PSZ chrApp, PSZ chrKey, HWND hwnd)
+{
+  HINI hini=0;
+  BOOL bError=FALSE;
+  SWP swp;
+
+  /* Open ini-file */
+  hini=PrfOpenProfile(WinQueryAnchorBlock(HWND_DESKTOP),iniFile);
+  do{
+
+    if(!hini) {
+#if 0
+      /* profileName: "Warning! Cannot open Ini-file!"
+         moduleName: "Data-CD-Creator"
+         */
+      messageBox( profileName, IDSTR_INIFILEOPENWARNING , sizeof(profileName),
+                  moduleName, IDSTRD_DATACDCREATOR, sizeof(moduleName),
+                  RESSOURCEHANDLE, HWND_DESKTOP, MB_OK | MB_ICONEXCLAMATION|MB_MOVEABLE);
+#endif
+      break;
+    }/* end of if(!hini) */
+
+    WinQueryWindowPos(hwnd, &swp);
+    if(!PrfWriteProfileData(hini, chrApp, chrKey, &swp, sizeof(swp)))
+      bError=TRUE;
+
+    if(hini)
+      PrfCloseProfile(hini);
+
+    if(bError)
+      break;
+    return TRUE;
+  } while(TRUE);
+  return FALSE;
+}
+
+BOOL IniSaveWindowClrs(PSZ chrIniFile, PSZ chrApp , HWND hwnd)
+{
+  RGB rgb;
+  ULONG  attrFound;
+
+  // Query the current background colour
+  if(WinQueryPresParam(hwnd,
+                       PP_BACKGROUNDCOLOR,0,&attrFound,sizeof(rgb),
+                       &rgb,QPF_NOINHERIT))
+    {
+      IniSaveData(chrIniFile, chrApp, INI_BGCLR_KEY, &rgb, sizeof(RGB));
+    }
+  // Query the current foreground colour
+  if(WinQueryPresParam(hwnd,
+                       PP_FOREGROUNDCOLOR,0,&attrFound,sizeof(rgb),
+                       &rgb,QPF_NOINHERIT))
+    {
+      IniSaveData(chrIniFile, chrApp, INI_FGCLR_KEY, &rgb, sizeof(RGB));
+    }
+
+  if(WinQueryPresParam(WinWindowFromID(hwnd, FID_TITLEBAR),
+                       PP_ACTIVECOLOR,0,&attrFound,sizeof(rgb),
+                       &rgb,QPF_NOINHERIT))
+    {
+      IniSaveData(chrIniFile, chrApp, INI_ACTIVETBBGCLR_KEY, &rgb, sizeof(RGB));
+    }
+
+  if(WinQueryPresParam(WinWindowFromID(hwnd, FID_TITLEBAR),
+                       PP_INACTIVECOLOR,0,&attrFound,sizeof(rgb),
+                       &rgb,QPF_NOINHERIT))
+    {
+      IniSaveData(chrIniFile, chrApp, INI_INACTIVETBBGCLR_KEY, &rgb, sizeof(RGB));
+    }
+  if(WinQueryPresParam(WinWindowFromID(hwnd, FID_TITLEBAR),
+                       PP_ACTIVETEXTFGNDCOLOR,0,&attrFound,sizeof(rgb),
+                       &rgb,QPF_NOINHERIT))
+    {
+      IniSaveData(chrIniFile, chrApp, INI_ACTIVETBFGCLR_KEY, &rgb, sizeof(RGB));
+    }
+  if(WinQueryPresParam(WinWindowFromID(hwnd, FID_TITLEBAR),
+                       PP_INACTIVETEXTFGNDCOLOR,0,&attrFound,sizeof(rgb),
+                       &rgb,QPF_NOINHERIT))
+    {
+      IniSaveData(chrIniFile, chrApp, INI_INACTIVETBFGCLR_KEY, &rgb, sizeof(RGB));
+    }
+  return TRUE;
+}
+
+BOOL IniRestoreWindowClrs(PSZ chrIniFile, PSZ chrApp , HWND hwnd)
+{
+  RGB rgb;
+  ULONG ulSize;
+
+  ulSize=sizeof(RGB);
+  if(IniRestoreData(chrIniFile, chrApp, INI_BGCLR_KEY, &rgb, &ulSize))
+    {
+      // Set the background colour
+      WinSetPresParam(hwnd,
+                      PP_BACKGROUNDCOLOR,(ULONG)sizeof(rgb), &rgb);
+    }
+  ulSize=sizeof(RGB);
+  if(IniRestoreData(chrIniFile, chrApp, INI_FGCLR_KEY, &rgb, &ulSize))
+    {
+      // Set the foreground colour
+      WinSetPresParam(hwnd,
+                      PP_FOREGROUNDCOLOR,(ULONG)sizeof(rgb), &rgb);
+    }
+  /* Titlebar */
+  ulSize=sizeof(RGB);
+  if(IniRestoreData(chrIniFile, chrApp, INI_ACTIVETBBGCLR_KEY, &rgb, &ulSize))
+    {
+
+      WinSetPresParam(WinWindowFromID(hwnd, FID_TITLEBAR),
+                      PP_ACTIVECOLOR,(ULONG)sizeof(rgb), &rgb);
+      WinSetPresParam(WinWindowFromID(hwnd, FID_TITLEBAR),
+                      PP_ACTIVETEXTBGNDCOLOR,(ULONG)sizeof(rgb), &rgb);
+    }
+  ulSize=sizeof(RGB);
+  if(IniRestoreData(chrIniFile, chrApp, INI_INACTIVETBBGCLR_KEY, &rgb, &ulSize))
+    {
+      WinSetPresParam(WinWindowFromID(hwnd, FID_TITLEBAR),
+                      PP_INACTIVECOLOR,(ULONG)sizeof(rgb), &rgb);
+      WinSetPresParam(WinWindowFromID(hwnd, FID_TITLEBAR),
+                      PP_INACTIVETEXTBGNDCOLOR,(ULONG)sizeof(rgb), &rgb);
+    }
+
+  ulSize=sizeof(RGB);
+  if(IniRestoreData(chrIniFile, chrApp, INI_ACTIVETBFGCLR_KEY, &rgb, &ulSize))
+    {
+
+      //            WinSetPresParam(WinWindowFromID(hwnd, FID_TITLEBAR),
+      //              PP_ACTIVECOLOR,(ULONG)sizeof(rgb), &rgb);
+      WinSetPresParam(WinWindowFromID(hwnd, FID_TITLEBAR),
+                      PP_ACTIVETEXTFGNDCOLOR,(ULONG)sizeof(rgb), &rgb);
+    }
+  ulSize=sizeof(RGB);
+  if(IniRestoreData(chrIniFile, chrApp, INI_INACTIVETBFGCLR_KEY, &rgb, &ulSize))
+    {
+      //            WinSetPresParam(WinWindowFromID(hwnd, FID_TITLEBAR),
+      //              PP_INACTIVECOLOR,(ULONG)sizeof(rgb), &rgb);
+      WinSetPresParam(WinWindowFromID(hwnd, FID_TITLEBAR),
+                      PP_INACTIVETEXTFGNDCOLOR,(ULONG)sizeof(rgb), &rgb);
+    }
+  return TRUE;
+}
+
+BOOL IniSaveInt(PSZ iniFile, PSZ chrApp, PSZ chrKey, int theInt)
+{
+  HINI hini=0;
+  BOOL bError=FALSE;
+  UCHAR chrIntString[50];
+
+  /* Open ini-file */
+  hini=PrfOpenProfile(WinQueryAnchorBlock(HWND_DESKTOP),(unsigned char *)iniFile);
+  do{
+
+    if(!hini) {
+#if 0
+      /* profileName: "Warning! Cannot open Ini-file!"
+         moduleName: "Data-CD-Creator"
+         */
+      messageBox( profileName, IDSTR_INIFILEOPENWARNING , sizeof(profileName),
+                  moduleName, IDSTRD_DATACDCREATOR, sizeof(moduleName),
+                  RESSOURCEHANDLE, HWND_DESKTOP, MB_OK | MB_ICONEXCLAMATION|MB_MOVEABLE);
+#endif
+      break;
+    }/* end of if(!hini) */
+
+    sprintf((PCHAR)chrIntString, "%d", theInt);
+    if(!PrfWriteProfileString(hini, chrApp, chrKey, chrIntString))
+      bError=TRUE;
+
+    if(hini)
+      PrfCloseProfile(hini);
+
+    if(bError)
+      break;
+    return TRUE;
+  } while(TRUE);
+  return FALSE;
+}
+
+BOOL IniSaveData(PSZ iniFile, PSZ chrApp, PSZ chrKey, PVOID theData, ULONG ulSize)
+{
+  HINI hini=0;
+  BOOL bError=FALSE;
+
+  /* Open ini-file */
+  hini=PrfOpenProfile(WinQueryAnchorBlock(HWND_DESKTOP),iniFile);
+  do{
+
+    if(!hini) {
+#if 0
+      /* profileName: "Warning! Cannot open Ini-file!"
+         moduleName: "Data-CD-Creator"
+         */
+      messageBox( profileName, IDSTR_INIFILEOPENWARNING , sizeof(profileName),
+                  moduleName, IDSTRD_DATACDCREATOR, sizeof(moduleName),
+                  RESSOURCEHANDLE, HWND_DESKTOP, MB_OK | MB_ICONEXCLAMATION|MB_MOVEABLE);
+#endif
+      break;
+    }/* end of if(!hini) */
+
+    if(!PrfWriteProfileData(hini, chrApp, chrKey, theData, ulSize))
+      bError=TRUE;
+
+    if(hini)
+      PrfCloseProfile(hini);
+
+    if(bError)
+      break;
+    return TRUE;
+  } while(TRUE);
+  return FALSE;
+}
+
+BOOL IniRestoreData(PSZ iniFile, PSZ chrApp, PSZ chrKey, PVOID theData, PULONG ulMaxSize)
+{
+  HINI hini=0;
+  BOOL bError=FALSE;
+
+  /* Open ini-file */
+  hini=PrfOpenProfile(WinQueryAnchorBlock(HWND_DESKTOP),iniFile);
+  do{
+
+    if(!hini) {
+#if 0
+      /* profileName: "Warning! Cannot open Ini-file!"
+         moduleName: "Data-CD-Creator"
+         */
+      messageBox( profileName, IDSTR_INIFILEOPENWARNING , sizeof(profileName),
+                  moduleName, IDSTRD_DATACDCREATOR, sizeof(moduleName),
+                  RESSOURCEHANDLE, HWND_DESKTOP, MB_OK | MB_ICONEXCLAMATION|MB_MOVEABLE);
+#endif
+      break;
+    }/* end of if(!hini) */
+
+    bError=PrfQueryProfileData(hini, chrApp, chrKey, theData, ulMaxSize);
+
+    if(hini)
+      PrfCloseProfile(hini);
+
+    return bError;
+  } while(TRUE);
+  return FALSE;
+}
+
+
+int IniRestoreInt(PSZ iniFile, PSZ chrApp, PSZ chrKey, int defaultInt)
+{
+  HINI hini=0;
+  int theInt;
+
+  /* Open ini-file */
+  hini=PrfOpenProfile(WinQueryAnchorBlock(HWND_DESKTOP),iniFile);
+  do{
+
+    if(!hini) {
+#if 0
+      /* profileName: "Warning! Cannot open Ini-file!"
+         moduleName: "Data-CD-Creator"
+         */
+      messageBox( profileName, IDSTR_INIFILEOPENWARNING , sizeof(profileName),
+                  moduleName, IDSTRD_DATACDCREATOR, sizeof(moduleName),
+                  RESSOURCEHANDLE, HWND_DESKTOP, MB_OK | MB_ICONEXCLAMATION|MB_MOVEABLE);
+#endif
+      break;
+    }/* end of if(!hini) */
+
+    theInt=PrfQueryProfileInt(hini, chrApp, chrKey, defaultInt);
+
+    if(hini)
+      PrfCloseProfile(hini);
+
+    return theInt;
+  } while(TRUE);
+  return defaultInt;
+}
+
+
+BOOL readIni2(PSZ installDir)
+{
+#if 0
+  strncpy(chrInstallDir, installDir,sizeof(chrInstallDir));
+  /* Build full path for cdrecord.ini file */
+  sprintf(profileName,"%s\\cdrecord.ini", installDir);
+  /* Insert message in Logfile */
+  writeLog("Reading values from ");
+  writeLog(profileName);
+  writeLog("\n");
+
+  /* Open ini-file */
+  hini=PrfOpenProfile(WinQueryAnchorBlock(HWND_DESKTOP),profileName);
+  do{
+    if(!hini) {
+      /* profileName: "Warning! Cannot open Ini-file!"
+         moduleName: "Data-CD-Creator"
+         */
+      messageBox( profileName, IDSTR_INIFILEOPENWARNING , sizeof(profileName),
+                  moduleName, IDSTRD_DATACDCREATOR, sizeof(moduleName),
+                  RESSOURCEHANDLE, HWND_DESKTOP, MB_OK | MB_ICONEXCLAMATION|MB_MOVEABLE);
+      break;
+    }/* end of if(!hini) */
+
+    if(hini)
+      PrfCloseProfile(hini);
+
+    if(bError)
+      break;
+    return TRUE;
+  } while(TRUE);
+  writeLog("Error while reading cdrecord.ini\n");
+#endif
+  return FALSE;
+}
+
+BOOL readIni()
+{
+  return readIni2(params[1]);
+}
+#if 0
+static void _HlpBuildProfileName(char* chrBuffer, int iBufferSize)
+{
+  /* Build full path for cdrecord.ini file */
+  sprintf(chrBuffer, /*iBufferSize,*/ "%s\\cdrecord.ini", chrInstallDir);
+  chrBuffer[iBufferSize-1]=0; /* Always terminate with zero */
+}
+
+
+HINI HlpOpenIni()
+{
+  UCHAR profileName[CCHMAXPATH];
+
+  /* Build full path for cdrecord.ini file */
+  _HlpBuildProfileName(profileName, sizeof(profileName));
+
+  /* Open ini-file */
+  return PrfOpenProfile(WinQueryAnchorBlock(HWND_DESKTOP),profileName);
+}
+
+void HlpCloseIni(HINI hini)
+{
+    if(hini)
+      PrfCloseProfile(hini);
+}
+#endif
+#if 0
+if(SysQueryHomeDir(chrHomeDir, sizeof(chrHomeDir))) {
+    strcpy(chrPath, chrHomeDir);
+    strncat(chrPath, "\\WPSWIZZ.INI", size-strlen(chrPath)-1);/* Default is INI file in users home dir */
+    return;
+  }
+
+  strcpy(chrPath, queryHelpPath());
+  if((ptrChar=strrchr(chrPath, '\\'))!=NULLHANDLE) {
+    *ptrChar=0;
+    if((ptrChar=strrchr(chrPath, '\\'))!=NULLHANDLE)
+      *ptrChar=0;
+  }
+  strncat(chrPath, "\\WPSWIZZ.INI", size-strlen(chrPath)-1);
+  chrPath[size-1]=0;
+#endif
+
+/*
+  Query the path to the INI file used by the MM progs to store the private data.
+  If a home dir exists on the users system the INI file will be create there otherwise
+  in the directory where the calling EXE is located.
+ */
+BOOL HlpBuildMMProgIniFileName(char* chrProgname, char * chrBuffer, ULONG ulBufferSize)
+{
+  char * chrPtr;
+
+  /* Default is INI file in users home dir */
+  if(SysQueryHomeDir(chrBuffer, ulBufferSize)) {
+    strlcat(chrBuffer, MMCLS_INI_FILE_NAME, ulBufferSize); /* MMCLS_INI_FILE_NAME = "\\CWMM.INI" */
+    return TRUE;
+  }
+
+  /* No HOME dir for some reason */
+  strlcpy(chrBuffer, chrProgname, ulBufferSize);
+
+  if((chrPtr=strrchr(chrBuffer,'\\'))==NULLHANDLE)
+    return FALSE; // This shouldn't happen!
+
+  *chrPtr=0;
+  strlcat(chrBuffer, MMCLS_INI_FILE_NAME, ulBufferSize);
+
+  return TRUE;
+}
+
+
+#if 0
+/* This function returns the module handle of our ressource dll */
+HMODULE queryResModuleHandle(PSZ chrExePath)
+{
+  COUNTRYCODE country= {0};
+  COUNTRYINFO countryInfo= {0};
+  UCHAR path[CCHMAXPATH];
+  UCHAR buf[CCHMAXPATH];
+  PUCHAR found;
+  APIRET rc;
+  ULONG ulInfoLen;
+
+  if(!RESSOURCEHANDLE) {
+
+    //writeLog("Trying to load ressource DLL.\n");
+
+    /* Get the country code of our system and load the
+       resource DLL with the right language */
+    do {
+      rc=DosQueryCtryInfo(sizeof(countryInfo),&country,&countryInfo,&ulInfoLen);
+      if(rc!=NO_ERROR) {
+        /* Insert message in Logfile */
+        //  writeLog(__FUNCTION__);
+        //writeLog(": Can't get country info. Ressource-DLL will not be loaded.\n");
+        break;
+      }
+      sprintf(path,"%s", chrExePath);
+      if((found=strrchr(path, '\\'))!=NULLHANDLE)
+        *found=0;
+
+      sprintf(buf, RESDLLNAME ,countryInfo.country);
+      strcat(path,buf);
+      /* Insert message in Logfile */
+      //HlpWriteToTrapLog("Using the following DLL path: ");
+      //HlpWriteToTrapLog(path);
+      //HlpWriteToTrapLog("\n");
+
+      rc=DosLoadModule(buf,sizeof(buf),path, &RESSOURCEHANDLE);
+      if(rc==NO_ERROR)
+        break;
+
+      /* Insert message in Logfile */
+      //      writeLog("Ressource-DLL for the current countrycode not found. Trying to load default one (CDFLD001.DLL).\n");
+
+      /* NLS DLL not found. Try to load default */
+      found=strrchr(path,'\\');
+      if(!found)
+        break;
+
+      *found=0;
+      sprintf(buf, DEFRESDLLNAME);
+      strcat(path,buf);
+      //HlpWriteToTrapLog("Using the following DLL path: ");
+      //HlpWriteToTrapLog(path);
+      //HlpWriteToTrapLog("\n");
+
+
+      rc=DosLoadModule(buf,sizeof(buf),path, &RESSOURCEHANDLE);
+      if(rc!=NO_ERROR) {
+        //        writeLog("Can't load DLL!\n");
+        RESSOURCEHANDLE=NULLHANDLE;
+      }
+      else {
+        //writeLog("Ressource DLL loaded.\n");
+      }
+      break;
+    }while(TRUE);
+  }
+  return RESSOURCEHANDLE;
+}
+#endif
+
+/* This function returns the module handle of our ressource dll */
+HMODULE queryResModuleHandle(PSZ chrExePath)
+{
+  UCHAR path[CCHMAXPATH];
+  UCHAR buf[CCHMAXPATH];
+  PCHAR found;
+  APIRET rc;
+
+  if(!RESSOURCEHANDLE) {
+
+    //writeLog("Trying to load ressource DLL.\n");
+
+    /* Get the language code of our system and load the
+       resource DLL with the right language */
+    do
+      {
+        static UCHAR chrLang[]="en_EN";
+        PSZ pszLang=NULL;
+        PUCHAR chrPtr;
+
+        /* Get Language var */
+        if(NO_ERROR!=DosScanEnv((PSZ)"LANG", &pszLang)) {
+         pszLang=chrLang;
+        }
+        /* Skip leading spaces */
+        chrPtr=pszLang;
+        while(*chrPtr==' ')
+          chrPtr++;
+
+        /* Check if value seems to be valid. The var must be something like xx_XX thus length is 5 */
+        if(strlen((PCHAR)chrPtr)<5)
+          break;
+
+        sprintf((PCHAR)path,"%s", chrExePath);
+        //    SysWriteToTrapLog(path);
+        if((found=strrchr((PCHAR)path, '\\'))!=NULLHANDLE)
+          *found=0;
+
+        /* Extract the first two chars */
+        sprintf((PCHAR)buf, RESDLLNAME, chrPtr[0], chrPtr[1]);
+        strcat((PCHAR)path,(const PCHAR)buf);
+        /* Insert message in Logfile */
+        // SysWriteToTrapLog("Using the following DLL path: %s\n", path);
+
+        rc=DosLoadModule(buf,sizeof(buf),path, &RESSOURCEHANDLE);
+        if(rc==NO_ERROR)
+          break;
+
+        /* Insert message in Logfile */
+        SysWriteToTrapLog("Ressource-DLL for the current country not found. Trying to load default one.\n");
+
+        /* NLS DLL not found. Try to load default */
+        found=strrchr((PCHAR)path,(int)'\\');
+        if(!found)
+          break;
+
+        *found=0;
+        sprintf((PCHAR)buf, DEFRESDLLNAME);
+        strcat((PCHAR)path,(const PCHAR)buf);
+        //HlpWriteToTrapLog("Using the following DLL path: ");
+        //HlpWriteToTrapLog(path);
+        //HlpWriteToTrapLog("\n");
+
+
+        rc=DosLoadModule(buf,sizeof(buf),path, &RESSOURCEHANDLE);
+        if(rc!=NO_ERROR) {
+          //        writeLog("Can't load DLL!\n");
+          RESSOURCEHANDLE=NULLHANDLE;
+        }
+        else {
+          //writeLog("Ressource DLL loaded.\n");
+        }
+        break;
+      }while(TRUE);
+  }
+  return RESSOURCEHANDLE;
+}
+
+void freeResHandle(void)
+{
+  if(RESSOURCEHANDLE)
+    DosFreeModule(RESSOURCEHANDLE);
+}
+
+void HlpSendCommandToObject(PSZ chrObject, PSZ command)
+{
+  HOBJECT hObject;
+  UCHAR chrCommand[CCHMAXPATH];
+
+  hObject=WinQueryObject(chrObject);
+  sprintf((PCHAR)chrCommand,"Querying object pointer for: %s\n", chrObject);
+  writeLog(chrCommand);
+  if(hObject!=NULLHANDLE) {
+    strcpy((PCHAR)chrCommand,(const PCHAR)command);
+    WinSetObjectData(hObject,chrCommand);
+    writeLog((PSZ)"Sending command to object: ");
+    writeLog(command);
+    writeLog((PSZ)"\n");
+  }
+  else {
+    sprintf((PCHAR)chrCommand,"Can't query object pointer for: %s\n", chrObject);
+    writeLog(chrCommand);
+  }
+}
+
Index: /tags/CWMM-0.3.0_GA/common_functions/img_funcs.c
===================================================================
--- /tags/CWMM-0.3.0_GA/common_functions/img_funcs.c	(revision 213)
+++ /tags/CWMM-0.3.0_GA/common_functions/img_funcs.c	(revision 213)
@@ -0,0 +1,473 @@
+/*
+  This file conatins functions for loading image files.
+ */
+
+#define  INCL_PM
+#define INCL_OS2MM
+#define  INCL_MMIOOS2
+
+#include <os2.h>
+#include "os2me.h"
+#include <string.h> /* for memset() */
+#include <stdlib.h> /* for malloc() */
+#include "sys_funcs.h"
+
+
+/*!**************************************************/
+/*                                                  */
+/* @@DESC                                           */
+/*                                                  */
+/* This function loads a supported image file.      */
+/* Every format for which MMOS2 has an IO procedure */
+/* may be used here. In contrast to                 */
+/* ImgLoadImageFile() a provided BMPINFOHEADER2     */
+/* structure is filled with data.                   */
+/*                                                  */
+/*                                                  */
+/* @@RETURNS                                        */
+/*                                                  */
+/* HBITMAP hBitmap                                  */
+/*                                                  */
+/* Handle to the bitmap or NULL.                    */
+/*                                                  */
+/* @@PARAM                                          */
+/*                                                  */
+/* PSZ pszFileName input                            */
+/*                                                  */
+/* Name of the image file to load.                  */
+/*                                                  */
+/* @@PARAM                                          */
+/*                                                  */
+/* PBITMAPINFOHEADER2 pBMPInfoHeader2 in/out        */
+/*                                                  */
+/* Pointer to a BITMAPINFOHEADER2 structure.        */
+/*                                                  */
+/*                                                  */
+/* @@REMARKS                                        */
+/*                                                  */
+/* The caller must free the bitmap handle after     */
+/* use.                                             */
+/*                                                  */
+/*!!*************************************************/
+HBITMAP ImgLoadImageFileAndHeader( PSZ pszFileName, PBITMAPINFOHEADER2 pBMPInfoHeader2)
+{
+    HBITMAP       hbm;
+    MMIOINFO      mmioinfo;
+    MMFORMATINFO  mmFormatInfo;
+    HMMIO         hmmio;
+    ULONG         ulImageHeaderLength;
+    MMIMAGEHEADER mmImgHdr;
+    ULONG         ulBytesRead;
+    ULONG         dwNumRowBytes;
+    PBYTE         pRowBuffer;
+    ULONG         dwRowCount;
+    SIZEL         ImageSize;
+    ULONG         dwHeight, dwWidth;
+    FOURCC        fccStorageSystem;
+    ULONG         dwPadBytes;
+    ULONG         dwRowBits;
+    ULONG         ulReturnCode;
+    FOURCC        fccIOProc;
+    HDC           hdc;
+    HPS           hps;
+    HAB           hab;
+
+    hab=WinQueryAnchorBlock(HWND_DESKTOP);
+
+    ulReturnCode = mmioIdentifyFile ( pszFileName,
+                                      0L,
+                                      &mmFormatInfo,
+                                      &fccStorageSystem,
+                                      0L,
+                                      0L);
+    /*
+     *  If this file was NOT identified, then this function won't
+     *  work, so return an error by indicating an empty bitmap.
+     */
+    if ( ulReturnCode == MMIO_ERROR )
+    {
+            return (0L);
+    }
+    /*
+     *  If mmioIdentifyFile did not find a custom-written IO proc which
+     *  can understand the image file, then it will return the DOS IO Proc
+     *  info because the image file IS a DOS file.
+     */
+    if( mmFormatInfo.fccIOProc == FOURCC_DOS )
+    {
+            return ( 0L );
+    }
+    /*
+     *  Ensure this is an IMAGE IOproc, and that it can read
+     *  translated data
+     */
+    if ( (mmFormatInfo.ulMediaType != MMIO_MEDIATYPE_IMAGE) ||
+         ((mmFormatInfo.ulFlags & MMIO_CANREADTRANSLATED) == 0) )
+    {
+            return (0L);
+    }
+    else
+    {
+         fccIOProc = mmFormatInfo.fccIOProc;
+    }
+
+    /* Clear out and initialize mminfo structure */
+    memset ( &mmioinfo, 0L, sizeof ( MMIOINFO ) );
+    mmioinfo.fccIOProc = fccIOProc;
+    mmioinfo.ulTranslate = MMIO_TRANSLATEHEADER | MMIO_TRANSLATEDATA;
+    hmmio = mmioOpen ( (PSZ) pszFileName,
+                       &mmioinfo,
+                       MMIO_READ | MMIO_DENYWRITE | MMIO_NOIDENTIFY );
+    if ( ! hmmio )
+    {
+            return (0L);
+    }
+
+
+    ulReturnCode = mmioQueryHeaderLength ( hmmio,
+                                         (PLONG)&ulImageHeaderLength,
+                                           0L,
+                                           0L);
+    if ( ulImageHeaderLength != sizeof ( MMIMAGEHEADER ) )
+    {
+      /* We have a problem.....possibly incompatible versions */
+      ulReturnCode = mmioClose (hmmio, 0L);
+            return (0L);
+    }
+
+    ulReturnCode = mmioGetHeader ( hmmio,
+                                   &mmImgHdr,
+                                   (LONG) sizeof ( MMIMAGEHEADER ),
+                                   (PLONG)&ulBytesRead,
+                                   0L,
+                                   0L);
+
+    if ( ulReturnCode != MMIO_SUCCESS )
+    {
+      /* Header unavailable */
+      ulReturnCode = mmioClose (hmmio, 0L);
+            return (0L);
+    }
+
+    /*!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!*/
+    *pBMPInfoHeader2=mmImgHdr.mmXDIBHeader.BMPInfoHeader2;
+
+    /*
+     *  Determine the number of bytes required, per row.
+     *      PLANES MUST ALWAYS BE = 1
+     */
+    dwHeight = mmImgHdr.mmXDIBHeader.BMPInfoHeader2.cy;
+    dwWidth = mmImgHdr.mmXDIBHeader.BMPInfoHeader2.cx;
+    dwRowBits = dwWidth * mmImgHdr.mmXDIBHeader.BMPInfoHeader2.cBitCount;
+    dwNumRowBytes = dwRowBits >> 3;
+
+    /*
+     *  Account for odd bits used in 1bpp or 4bpp images that are
+     *  NOT on byte boundaries.
+     */
+    if ( dwRowBits % 8 )
+    {
+         dwNumRowBytes++;
+    }
+    /*
+     *  Ensure the row length in bytes accounts for byte padding.
+     *  All bitmap data rows must are aligned on LONG/4-BYTE boundaries.
+     *  The data FROM an IOProc should always appear in this form.
+     */
+    dwPadBytes = ( dwNumRowBytes % 4 );
+    if ( dwPadBytes )
+    {
+         dwNumRowBytes += 4 - dwPadBytes;
+    }
+
+    /* Allocate space for ONE row of pels */
+    if ( DosAllocMem( (PPVOID)&pRowBuffer,
+                      (ULONG)dwNumRowBytes,
+                      fALLOC))
+    {
+      ulReturnCode = mmioClose (hmmio, 0L);
+            return(0L);
+    }
+
+    /* Create a device context */
+    hdc=DevOpenDC(hab, OD_MEMORY,"*",0L, NULL, NULLHANDLE);
+    if(hdc==NULLHANDLE)
+      {
+        DosFreeMem(pRowBuffer);
+        mmioClose (hmmio, 0L);
+        return(0L);
+      }
+
+    /*
+    // ***************************************************
+    // Create a memory presentation space that includes
+    // the memory device context obtained above.
+    // ***************************************************
+    */
+    ImageSize.cx = dwWidth;
+    ImageSize.cy = dwHeight;
+
+    hps = GpiCreatePS ( hab,
+                        hdc,
+                        &ImageSize,
+                        PU_PELS | GPIT_NORMAL | GPIA_ASSOC );
+       if ( !hps )
+      {
+#ifdef DEBUG
+        WinMessageBox( HWND_DESKTOP, HWND_DESKTOP,
+                       "No HPS...",
+                       "Open Image File",
+                       (HMODULE) NULL,
+                       (ULONG) MB_OK | MB_MOVEABLE |
+                       MB_ERROR );
+#endif
+        DevCloseDC(hdc);
+        DosFreeMem(pRowBuffer);
+        mmioClose (hmmio, 0L);
+        return(0L);
+      }
+       /*
+    //    GpiSelectPalette(hps, NULLHANDLE);
+    // ***************************************************
+    // Create an uninitialized bitmap.  This is where we
+    // will put all of the bits once we read them in.
+    // ***************************************************
+    */
+
+    hbm = GpiCreateBitmap ( hps,
+                            &mmImgHdr.mmXDIBHeader.BMPInfoHeader2,
+                            0L,
+                            NULL,
+                            NULL);
+
+    if ( !hbm )
+    {
+#ifdef DEBUG
+      WinMessageBox( HWND_DESKTOP, HWND_DESKTOP,
+                     "No HBITMAP...",
+                     "Open Image File",
+                     (HMODULE) NULL,
+                     (ULONG) MB_OK | MB_MOVEABLE |
+                     MB_ERROR );
+#endif
+      GpiDestroyPS(hps);
+      DevCloseDC(hdc);
+      DosFreeMem(pRowBuffer);
+      ulReturnCode = mmioClose (hmmio, 0L);
+      return(0L);
+    }
+    /****************************************************
+      Select the bitmap into the memory device context.
+      ***************************************************/
+    ulReturnCode = GpiSetBitmap ( hps,
+                                  hbm );
+    /***************************************************************
+      LOAD THE BITMAP DATA FROM THE FILE
+      One line at a time, starting from the BOTTOM
+      ****************************************************************/
+
+    for ( dwRowCount = 0; dwRowCount < dwHeight; dwRowCount++ )
+    {
+         ulBytesRead = (ULONG) mmioRead ( hmmio,
+                                          pRowBuffer,
+                                          dwNumRowBytes );
+         if ( !ulBytesRead )
+         {
+              break;
+         }
+         /*
+          *  Allow context switching while previewing.. Couldn't get
+          *  it to work. Perhaps will get to it when time is available...
+          */
+         ulReturnCode = GpiSetBitmapBits ( hps,
+                                          (LONG) dwRowCount,
+                                          (LONG) 1,
+                                          (PBYTE) pRowBuffer,
+                                          (PBITMAPINFO2) &mmImgHdr.mmXDIBHeader.BMPInfoHeader2);
+    }
+
+    /* Clean up */
+    ulReturnCode = GpiSetBitmap ( hps,
+                                  NULLHANDLE );
+    ulReturnCode = mmioClose (hmmio, 0L);
+    DosFreeMem(pRowBuffer);
+    GpiDestroyPS(hps);
+    DevCloseDC(hdc);
+
+    return(hbm);
+}
+
+
+/*!**************************************************/
+/*                                                  */
+/* @@DESC                                           */
+/*                                                  */
+/* This function loads a supported image file.      */
+/* Every format for which MMOS2 has an IO procedure */
+/* may be used here.                                */
+/*                                                  */
+/* @@PARAM                                          */
+/*                                                  */
+/* PSZ pszFileName input                            */
+/*                                                  */
+/* Name of the image file to load.                  */
+/*                                                  */
+/* @@RETURNS                                        */
+/*                                                  */
+/* HBITMAP hBitmap                                  */
+/*                                                  */
+/* Handle to the bitmap of NULL.                    */
+/*                                                  */
+/*!!*************************************************/
+HBITMAP ImgLoadImageFile (  PSZ pszFileName )
+{
+  BITMAPINFOHEADER2  bmpih2;
+
+  return ImgLoadImageFileAndHeader ( pszFileName, &bmpih2 );
+}
+
+
+
+/*!**************************************************/
+/*                                                  */
+/* @@DESC                                           */
+/*                                                  */
+/* Build a BITMAPINFOHEADER2 for the given file.    */
+/*                                                  */
+/* @@PARAM                                          */
+/*                                                  */
+/* PSZ pszFileName input                            */
+/*                                                  */
+/* Name of the image file.                          */
+/*                                                  */
+/* @@PARAM                                          */
+/*                                                  */
+/* PBITMAPINFOHEADER2 pBMPInfoHeader2 in/out        */
+/*                                                  */
+/* Pointer to a BITMAPINFOHEADER2 structure.        */
+/*                                                  */
+/* @@RETURNS                                        */
+/*                                                  */
+/* TRUE on success, FALSE otherwise                 */
+/*                                                  */
+/*!!*************************************************/
+BOOL ImgGetBmpInfoHeader(PSZ pszFileName, PBITMAPINFOHEADER2  bmpih2)
+{
+    MMIOINFO      mmioinfo;
+    MMFORMATINFO  mmFormatInfo;
+    HMMIO         hmmio;
+    ULONG         ulImageHeaderLength;
+    MMIMAGEHEADER mmImgHdr;
+    FOURCC        fccStorageSystem;
+    FOURCC        fccIOProc;
+    ULONG         ulReturnCode;
+    ULONG ulBytesRead;
+
+    /* Check file size */
+    if(SysQueryFileSize(pszFileName)==0)
+      return FALSE; /* File is empty at the moment, so return without reading. */
+
+    ulReturnCode = mmioIdentifyFile ( pszFileName,
+                                      0L,
+                                      &mmFormatInfo,
+                                      &fccStorageSystem,
+                                      0L,
+                                      0L);
+    /*
+     *  If this file was NOT identified, then this function won't
+     *  work, so return an error by indicating an empty bitmap.
+     */
+    if ( ulReturnCode == MMIO_ERROR )
+      {
+        /* Disabled, because when copying via WPS we end here before the image is available  */
+        return (0L);
+      }
+
+    /*
+     *  If mmioIdentifyFile did not find a custom-written IO proc which
+     *  can understand the image file, then it will return the DOS IO Proc
+     *  info because the image file IS a DOS file.
+     */
+    if( mmFormatInfo.fccIOProc == FOURCC_DOS )
+    {
+      return ( 0L );
+    }
+
+    /*
+     *  Ensure this is an IMAGE IOproc, and that it can read
+     *  translated data
+     */
+    if ( (mmFormatInfo.ulMediaType != MMIO_MEDIATYPE_IMAGE) ||
+         ((mmFormatInfo.ulFlags & MMIO_CANREADTRANSLATED) == 0) )
+    {
+      /* Disabled, because it fails for templates */
+      return (0L);
+    }
+    else
+    {
+         fccIOProc = mmFormatInfo.fccIOProc;
+    }
+#if 0
+    if((pName=malloc(mmFormatInfo.lNameLength+1))!=NULLHANDLE)
+      {
+        LONG lBytesRead;
+        mmioGetFormatName(&mmFormatInfo, pName, &lBytesRead, 0,0);
+        if(procName && ulLength) {
+          strncpy(procName, pName, ulLength-1);
+          procName[ulLength-1]=0;
+        }
+        free(pName);
+      }
+#endif
+
+    /* Clear out and initialize mminfo structure */
+    memset ( &mmioinfo, 0L, sizeof ( MMIOINFO ) );
+    mmioinfo.fccIOProc = fccIOProc;
+    mmioinfo.ulTranslate = MMIO_TRANSLATEHEADER | MMIO_TRANSLATEDATA;
+    /*!!!!!!!!!!!!!!!!!!!!!!*/
+
+
+    hmmio = mmioOpen ( (PSZ) pszFileName,
+                       &mmioinfo,
+                       MMIO_READ | MMIO_DENYWRITE | MMIO_NOIDENTIFY );
+
+    if ( ! hmmio )
+    {
+      // If file could not be opened, return with error
+      return (0L);
+    }
+
+    ulReturnCode = mmioQueryHeaderLength ( hmmio,
+                                         (PLONG)&ulImageHeaderLength,
+                                           0L,
+                                           0L);
+    if ( ulImageHeaderLength != sizeof ( MMIMAGEHEADER ) )
+    {
+         /* We have a problem.....possibly incompatible versions */
+         ulReturnCode = mmioClose (hmmio, 0L);
+         return (0L);
+    }
+
+    ulReturnCode = mmioGetHeader ( hmmio,
+                                   &mmImgHdr,
+                                   (LONG) sizeof ( MMIMAGEHEADER ),
+                                   (PLONG)&ulBytesRead,
+                                   0L,
+                                   0L);
+
+    if ( ulReturnCode != MMIO_SUCCESS )
+    {
+      /* Header unavailable */
+      ulReturnCode = mmioClose (hmmio, 0L);
+      return (0L);
+    }
+
+    memcpy(bmpih2, &mmImgHdr.mmXDIBHeader.BMPInfoHeader2,
+           sizeof(BITMAPINFOHEADER2)+256*sizeof(RGB2) );
+    ulReturnCode = mmioClose (hmmio, 0L);
+    return TRUE;
+}
+
+
+
+
Index: /tags/CWMM-0.3.0_GA/common_functions/include/ea_funcs.h
===================================================================
--- /tags/CWMM-0.3.0_GA/common_functions/include/ea_funcs.h	(revision 213)
+++ /tags/CWMM-0.3.0_GA/common_functions/include/ea_funcs.h	(revision 213)
@@ -0,0 +1,7 @@
+#ifndef EA_FUNCS_H_INCLUDED
+#define EA_FUNCS_H_INCLUDED
+
+BOOL EARestoreString(WPFileSystem * wpFSObject,  PSZ pKey, char * chrBuffer, ULONG ulBuffSize);
+BOOL EASaveString(WPFileSystem * wpFSObject,  PSZ pKey, PSZ pValue);
+
+#endif
Index: /tags/CWMM-0.3.0_GA/common_functions/include/hash_funcs.h
===================================================================
--- /tags/CWMM-0.3.0_GA/common_functions/include/hash_funcs.h	(revision 213)
+++ /tags/CWMM-0.3.0_GA/common_functions/include/hash_funcs.h	(revision 213)
@@ -0,0 +1,16 @@
+#ifndef HASH_H_INCLUDED
+#define HASH_H_INCLUDED
+
+#if __cplusplus
+extern "C" {
+#endif
+
+ULONG calculateHash(char * theString);
+ULONG calculateHash2(char * theString);
+USHORT calculateTheHash(char *chrCommand);
+
+#if __cplusplus
+}
+#endif
+
+#endif
Index: /tags/CWMM-0.3.0_GA/common_functions/include/img_funcs.h
===================================================================
--- /tags/CWMM-0.3.0_GA/common_functions/include/img_funcs.h	(revision 213)
+++ /tags/CWMM-0.3.0_GA/common_functions/include/img_funcs.h	(revision 213)
@@ -0,0 +1,8 @@
+#ifndef IMG_FUNCS_H_INCLUDED
+#define IMG_FUNCS_H_INCLUDED
+
+HBITMAP ImgLoadImageFile (  PSZ pszFileName );
+HBITMAP ImgLoadImageFileAndHeader (  PSZ pszFileName, PBITMAPINFOHEADER2 pBMPInfoHeader2);
+BOOL ImgGetBmpInfoHeader(PSZ pszFileName, PBITMAPINFOHEADER2  bmpih2 /*, char* procName, ULONG ulLength*/);
+
+#endif
Index: /tags/CWMM-0.3.0_GA/common_functions/include/ini_funcs.h
===================================================================
--- /tags/CWMM-0.3.0_GA/common_functions/include/ini_funcs.h	(revision 213)
+++ /tags/CWMM-0.3.0_GA/common_functions/include/ini_funcs.h	(revision 213)
@@ -0,0 +1,18 @@
+#ifndef INI_H_INCLUDED
+#define INI_H_INCLUDED
+
+#if __cplusplus
+extern "C" {
+#endif
+
+BOOL PrfSaveWindowPos(HINI hini, char * iniFile, char* chrApp, char *chrKey, HWND hwnd);
+BOOL PrfRestoreWindowPos(HINI hini, char * iniFile, char* chrApp, char *chrKey, HWND hwnd, ULONG fSize);
+BOOL PrfWriteString(HINI hini, char * iniFile, char* chrApp, char *chrKey, char* chrString);
+BOOL PrfQueryString(HINI hini, char * iniFile, char* chrApp, char *chrKey, char* chrDefault, char* chrBuffer, ULONG ulSize);
+
+#if __cplusplus
+}
+#endif
+
+#endif
+
Index: /tags/CWMM-0.3.0_GA/common_functions/include/listbox_funcs.h
===================================================================
--- /tags/CWMM-0.3.0_GA/common_functions/include/listbox_funcs.h	(revision 213)
+++ /tags/CWMM-0.3.0_GA/common_functions/include/listbox_funcs.h	(revision 213)
@@ -0,0 +1,32 @@
+#ifndef LB_H_INCLUDED
+#define LB_H_INCLUDED
+
+
+#if __cplusplus
+extern "C" {
+#endif
+
+SHORT LBFindMatch(HWND hwndLB, char *chrMatchText);
+
+#if __cplusplus
+}
+#endif
+
+
+#define LBFindMatchInDialogLB(hwndDlg, id, chrMatchText) LBFindMatch(WinWindowFromID(hwndDlg, id), chrMatchText)
+
+#define LBSelectItem(hwndLB, sItem) WinSendMsg(hwndLB, LM_SELECTITEM, MPFROMSHORT(sItem), MPFROMLONG(TRUE))
+#define LBSelectItemInDialogLB(hwndDlg, id, sItem) \
+             WinSendMsg(WinWindowFromID(hwndDlg, id), LM_SELECTITEM, MPFROMSHORT(sItem), MPFROMLONG(TRUE))
+
+#define LBDeselectItem(hwndLB, sItem) WinSendMsg(hwndLB, LM_SELECTITEM, MPFROMSHORT(sItem), MPFROMLONG(FALSE))
+#define LBDeselectItemInDialogLB(hwndDlg, id, sItem) \
+             WinSendMsg(WinWindowFromID(hwndDlg, id), LM_SELECTITEM, MPFROMSHORT(sItem), MPFROMLONG(FALSE))
+
+#define LBQueryFirstSelectedItem(hwndLB) \
+             SHORT1FROMMR(WinSendMsg(hwndLB, LM_QUERYSELECTION, MPFROMSHORT(LIT_FIRST), 0L))
+
+#define LBInsertItemInDialogLB(hwndDlg, id, sIdx, chrText) \
+         SHORT1FROMMR(WinSendMsg(WinWindowFromID(hwndDlg, id), LM_INSERTITEM, MPFROMSHORT(sIdx), MPFROMP(chrText)))
+
+#endif /* LB_H_INCLUDED */
Index: /tags/CWMM-0.3.0_GA/common_functions/include/menu_funcs.h
===================================================================
--- /tags/CWMM-0.3.0_GA/common_functions/include/menu_funcs.h	(revision 213)
+++ /tags/CWMM-0.3.0_GA/common_functions/include/menu_funcs.h	(revision 213)
@@ -0,0 +1,17 @@
+#ifndef MENU_H_INCLUDED
+#define MENU_H_INCLUDED
+
+#if  __cplusplus
+extern "C" {
+#endif
+SHORT menuInsertMenuItem( HWND hwndMenu, HWND hwndSubMenu, SHORT sPosition, int iID, char * chrText);
+MRESULT menuInsertMenuSeparator(HWND hwndMenu, HWND hwndSubMenu, SHORT sPosition );
+SHORT menuQueryItemCount(HWND hwndMenu);
+MRESULT menuCheckItem(HWND hwndMenu, USHORT usID, BOOL fIncludeSubMenu, BOOL fCheck);
+MRESULT menuRemoveItem(HWND hwndMenu, USHORT usID, BOOL fIncludeSubMenu);
+MRESULT menuCheckForItem(HWND hwndMenu, USHORT usID, BOOL fIncludeSubMenu);
+#if  __cplusplus
+}
+#endif
+
+#endif
Index: /tags/CWMM-0.3.0_GA/common_functions/include/message_funcs.h
===================================================================
--- /tags/CWMM-0.3.0_GA/common_functions/include/message_funcs.h	(revision 213)
+++ /tags/CWMM-0.3.0_GA/common_functions/include/message_funcs.h	(revision 213)
@@ -0,0 +1,23 @@
+#ifndef MESSAGE_H_INCLUDED
+#define MESSAGE_H_INCLUDED
+
+#ifdef __CPLUSPLUS__
+extern "C" {
+#endif
+
+ULONG messageBox( char* text, ULONG ulTextID , LONG lSizeText,
+                  char* title, ULONG ulTitleID, LONG lSizeTitle,
+                  HMODULE hResource, HWND hwnd, ULONG ulFlags);
+ULONG MsgShowMessageBox(HWND hwnd, ULONG ulIDTitle, ULONG ulIDText, HMODULE hModule, ULONG ulFlag);
+BOOL getMessage(char* text,ULONG ulID, LONG lSizeText, HMODULE hResource,HWND hwnd);
+BOOL MsgGetMessage(char* text,ULONG ulID, LONG lSizeText, HMODULE hResource,HWND hwnd);
+
+#if 0
+ULONG showMessageBox2(HWND hwnd, ULONG ulIDTitle, ULONG ulIDText, HMODULE hModule, ULONG ulFlag);
+#endif
+
+#ifdef __CPLUSPLUS__
+}
+#endif
+
+#endif
Index: /tags/CWMM-0.3.0_GA/common_functions/include/mm_funcs.h
===================================================================
--- /tags/CWMM-0.3.0_GA/common_functions/include/mm_funcs.h	(revision 213)
+++ /tags/CWMM-0.3.0_GA/common_functions/include/mm_funcs.h	(revision 213)
@@ -0,0 +1,14 @@
+#ifndef MM_H_INCLUDED
+#define MM_H_INCLUDED
+
+#if __cplusplus
+extern "C" {
+#endif
+
+ULONG MMIdentifyFile(char* chrFile);
+
+#if __cplusplus
+}
+#endif
+
+#endif /* MM_H_INCLUDED */
Index: /tags/CWMM-0.3.0_GA/common_functions/include/rexx_funcs.h
===================================================================
--- /tags/CWMM-0.3.0_GA/common_functions/include/rexx_funcs.h	(revision 213)
+++ /tags/CWMM-0.3.0_GA/common_functions/include/rexx_funcs.h	(revision 213)
@@ -0,0 +1,19 @@
+#ifndef REXX_H_INCLUDED
+#define REXX_H_INCLUDED
+
+
+#if __cplusplus
+extern "C" {
+#endif
+
+LONG RxGetLongFromStemWithoutNumber(RXSTRING args, char * chrTail, ULONG* ulError);
+PSZ RxGetStringFromStemWithoutNumber(RXSTRING args, char *chrTail, ULONG* ulError);
+LONG RxGetLongFromVar(char * chrVar, ULONG* ulError);
+LONG RxSetLongInRexxVar(char* chrVar, ULONG ulVal);
+
+#if __cplusplus
+}
+#endif
+
+#endif
+
Index: /tags/CWMM-0.3.0_GA/common_functions/include/som_wps_funcs.h
===================================================================
--- /tags/CWMM-0.3.0_GA/common_functions/include/som_wps_funcs.h	(revision 213)
+++ /tags/CWMM-0.3.0_GA/common_functions/include/som_wps_funcs.h	(revision 213)
@@ -0,0 +1,22 @@
+#ifndef SOMWPS_FUNCS_H_INCLUDED
+#define SOMWPS_FUNCS_H_INCLUDED
+
+#if  __cplusplus
+extern "C" {
+
+#endif
+
+WPObject* somGetFileSystemObject(WPObject* wpObject);
+SOMClass* somGetSomClass(char* chrClassName);
+BOOL somObjectIsA(WPObject* wpObject, char * chrClassName);
+PBYTE somReallocString(WPObject* wpObject, PBYTE oldString, char* newString, PULONG pulError);
+BOOL wpsObjectIsInsertedInContainer(WPObject * wpObject);
+WPObject* somResolveShadow(WPObject* wpObject);
+ULONG wpsDrawTemplate(WPObject* wpObject, RECTL* rcl, HPS hps, ULONG flCnr);
+void wpsRefreshObjectRecords(WPObject *somSelf);
+
+#if  __cplusplus
+}
+#endif
+
+#endif
Index: /tags/CWMM-0.3.0_GA/common_functions/include/sys_funcs.h
===================================================================
--- /tags/CWMM-0.3.0_GA/common_functions/include/sys_funcs.h	(revision 213)
+++ /tags/CWMM-0.3.0_GA/common_functions/include/sys_funcs.h	(revision 213)
@@ -0,0 +1,41 @@
+#ifndef SYS_H_INCLUDED
+#define SYS_H_INCLUDED
+
+/* For checking drives */
+#define QDT_FIXED_DISK  0x01
+#define QDT_REMOTE_DRIVE 0x02
+#define QDT_DISKETTE_DRIVE 0x03
+#define QDT_NO_DRIVE     0x04
+#define QDT_CDROM_DRIVE   0x05
+#define QDT_REMOVABLE_DISK 0
+#define QDT_ERROR_DISK   0xF0
+
+#if __cplusplus
+extern "C" {
+#endif
+
+size_t
+strlcpy(char *dst, const char *src, size_t siz); /* From OpenBSD */
+size_t
+strlcat(char *dst, const char *src, size_t siz); /* From OpenBSD */
+
+char SysQueryBootDriveLetter(void);
+ULONG SysQueryOSRelease(void);
+void SysWriteToTrapLog(const char* chrFormat, ...);
+BOOL SysCheckFileExists(char* chrFileName);
+ULONG SysQueryCurrentTID(void);
+ULONG SysQueryFileSize(char* chrFileName);
+ULONG SysQueryDriveType(ULONG ulDriveNum);
+ULONG SysQueryFreeDriveSpace(ULONG ulDriveNum, ULONG *ulTotal, ULONG * ulFree, ULONG* ulBytesUnit);
+ULONG SysQueryDiskName(ULONG ulDriveNum, char *chrBuffer, ULONG ulSize);
+BOOL SysQueryHomeDir(char* chrBuf, ULONG ulSize);
+
+/* To be moved in clib */
+char* my_strlcpy(char* string1, char* string2, size_t count);
+
+#if __cplusplus
+}
+#endif
+
+#endif
+
Index: /tags/CWMM-0.3.0_GA/common_functions/include/uptime.h
===================================================================
--- /tags/CWMM-0.3.0_GA/common_functions/include/uptime.h	(revision 213)
+++ /tags/CWMM-0.3.0_GA/common_functions/include/uptime.h	(revision 213)
@@ -0,0 +1,16 @@
+#ifndef UPTIME_H_INCLUDED
+#define UPTIME_H_INCLUDED
+
+
+#if __cplusplus
+extern "C" {
+#endif
+
+ULONG SysGetUptimeSecs(BOOL fUseTimer);
+char* SysGetUptimeString(BOOL fUseTimer, char * chrBuffer, ULONG ulSize);
+#if __cplusplus
+}
+#endif
+
+#endif
+
Index: /tags/CWMM-0.3.0_GA/common_functions/include/window_funcs.h
===================================================================
--- /tags/CWMM-0.3.0_GA/common_functions/include/window_funcs.h	(revision 213)
+++ /tags/CWMM-0.3.0_GA/common_functions/include/window_funcs.h	(revision 213)
@@ -0,0 +1,14 @@
+#ifndef WINDOW_H_INCLUDED
+#define WINDOW_H_INCLUDED
+
+#if __cplusplus
+extern "C" {
+#endif
+
+BOOL WinSetWindowToTop(HWND hwnd);
+
+#if __cplusplus
+}
+#endif
+
+#endif /* WINDOW_H_INCLUDED */
Index: /tags/CWMM-0.3.0_GA/common_functions/ini_funcs.c
===================================================================
--- /tags/CWMM-0.3.0_GA/common_functions/ini_funcs.c	(revision 213)
+++ /tags/CWMM-0.3.0_GA/common_functions/ini_funcs.c	(revision 213)
@@ -0,0 +1,224 @@
+/*
+ * This file is (C) Chris Wohlgemuth 2001-2005
+ */
+#define INCL_WIN
+
+#include <os2.h>
+
+/*!**************************************************/
+/*                                                  */
+/* @@MODULE                                         */
+/*                                                  */
+/* Profile functions                                */
+/*                                                  */
+/* @@DESC                                           */
+/*                                                  */
+/* This funktion stores a window position in an INI */
+/* file.                                            */
+/*                                                  */
+/* @@REMARKS                                        */
+/*                                                  */
+/* If hini is NULL the given file name will be used */
+/* for opening the INI file. If hini is not NULL    */
+/* the file name is ignored.                        */
+/*                                                  */
+/* @@RETURNS                                        */
+/*                                                  */
+/* BOOL fSuccess                                    */
+/*                                                  */
+/* TRUE: Function succeeded.                        */
+/* FALSE: Error occurred                            */
+/*                                                  */
+/*!!*************************************************/
+BOOL PrfSaveWindowPos(HINI hini, char* iniFile, char* chrApp, char* chrKey, HWND hwnd)
+{
+  BOOL bError=FALSE;
+  SWP swp;
+  HINI hiniPriv=hini;
+
+  if(!hini && !iniFile)
+    return FALSE;
+
+  do{
+
+    if(!hiniPriv) {
+      /* Open ini-file */
+      if((hiniPriv=PrfOpenProfile(WinQueryAnchorBlock(HWND_DESKTOP),(unsigned char *)iniFile))
+         ==NULLHANDLE)
+        break;
+    }/* end of if(!hiniPriv) */
+
+    WinQueryWindowPos(hwnd, &swp);
+    if(!PrfWriteProfileData(hiniPriv, chrApp, chrKey, &swp, sizeof(swp)))
+      bError=TRUE;
+
+    if(hiniPriv && !hini)
+      PrfCloseProfile(hiniPriv);
+
+    if(bError)
+      break;
+    return TRUE;
+  } while(TRUE);
+  return FALSE;
+}
+
+/*!**************************************************/
+/*                                                  */
+/* @@MODULE                                         */
+/*                                                  */
+/* Profile functions                                */
+/*                                                  */
+/* @@DESC                                           */
+/*                                                  */
+/* This funktion gets a saved window position from  */
+/* an INI file and resizes and moves the window     */
+/* accordingly.                                     */
+/*                                                  */
+/* @@REMARKS                                        */
+/*                                                  */
+/* If hini is NULL the given file name will be used */
+/* for opening the INI file. If hini is not NULL    */
+/* the file name is ignored.                        */
+/*                                                  */
+/* @@RETURNS                                        */
+/*                                                  */
+/* BOOL fSuccess                                    */
+/*                                                  */
+/* TRUE: Function succeeded.                        */
+/* FALSE: Error occurred                            */
+/*                                                  */
+/*!!*************************************************/
+BOOL PrfRestoreWindowPos(HINI hini, char * iniFile, char* chrApp, char *chrKey, HWND hwnd, ULONG fSize)
+{
+  HINI hiniPriv=hini;
+  ULONG ulSize;
+  BOOL bError=FALSE;
+  SWP swp;
+
+  do{
+    if(!hiniPriv) {
+      if((hiniPriv=PrfOpenProfile(WinQueryAnchorBlock(HWND_DESKTOP),(unsigned char *)iniFile))
+         ==NULLHANDLE)
+        break;
+    }/* end of if(!hini) */
+
+    ulSize=sizeof(swp);
+    if(!PrfQueryProfileData(hiniPriv, chrApp, chrKey, &swp, &ulSize))
+      bError=TRUE;
+
+    if(hiniPriv && !hini)
+      PrfCloseProfile(hiniPriv);
+
+    if(bError)
+      break;
+    WinSetWindowPos(hwnd, NULLHANDLE, swp.x, swp.y, swp.cx, swp.cy, SWP_MOVE | fSize);
+    return TRUE;
+  } while(TRUE);
+
+  return FALSE;
+}
+
+/*!**************************************************/
+/*                                                  */
+/* @@MODULE                                         */
+/*                                                  */
+/* Profile functions                                */
+/*                                                  */
+/* @@DESC                                           */
+/*                                                  */
+/* Save a string in an INI file.                    */
+/*                                                  */
+/*            .                                     */
+/*                                                  */
+/* @@REMARKS                                        */
+/*                                                  */
+/* If hini is NULL the given file name will be used */
+/* for opening the INI file. If hini is not NULL    */
+/* the file name is ignored.                        */
+/*                                                  */
+/* @@RETURNS                                        */
+/*                                                  */
+/* BOOL fSuccess                                    */
+/*                                                  */
+/* TRUE: Function succeeded.                        */
+/* FALSE: Error occurred                            */
+/*                                                  */
+/*!!*************************************************/
+BOOL PrfWriteString(HINI hini, char * iniFile, char* chrApp, char *chrKey, char* chrString)
+{
+  BOOL bError=FALSE;
+  HINI hiniPriv=hini;
+
+  if(!hini && !iniFile)
+    return FALSE;
+
+  do {
+    if(!hiniPriv) {
+      /* Open ini-file */
+      if((hiniPriv=PrfOpenProfile(WinQueryAnchorBlock(HWND_DESKTOP),(unsigned char *)iniFile))
+         ==NULLHANDLE)
+        break;
+    }/* end of if(!hiniPriv) */
+
+    if(!PrfWriteProfileString(hiniPriv, chrApp, chrKey, chrString))
+      bError=TRUE;
+
+    if(hiniPriv && !hini)
+      PrfCloseProfile(hiniPriv);
+
+    if(bError)
+      break;
+    return TRUE;
+  } while(TRUE);
+  return FALSE;
+}
+
+/*!**************************************************/
+/*                                                  */
+/* @@MODULE                                         */
+/*                                                  */
+/* Profile functions                                */
+/*                                                  */
+/* @@DESC                                           */
+/*                                                  */
+/* Get a string from an INI file.                   */
+/*                                                  */
+/*            .                                     */
+/*                                                  */
+/* @@REMARKS                                        */
+/*                                                  */
+/* If hini is NULL the given file name will be used */
+/* for opening the INI file. If hini is not NULL    */
+/* the file name is ignored.                        */
+/*                                                  */
+/* @@RETURNS                                        */
+/*                                                  */
+/* ULONG ulLength                                   */
+/*                                                  */
+/* TRUE: Function succeeded.                        */
+/* FALSE: Error occurred                            */
+/*                                                  */
+/*!!*************************************************/
+BOOL PrfQueryString(HINI hini, char * iniFile, char* chrApp, char *chrKey, char* chrDefault, char* chrBuffer, ULONG ulSize)
+{
+  HINI hiniPriv=hini;
+  ULONG ulRC=0;
+
+  do{
+    if(!hiniPriv) {
+      if((hiniPriv=PrfOpenProfile(WinQueryAnchorBlock(HWND_DESKTOP),(unsigned char *)iniFile))
+         ==NULLHANDLE)
+        break;
+    }/* end of if(!hini) */
+
+    ulRC=PrfQueryProfileString(hiniPriv, chrApp, chrKey, chrDefault, chrBuffer, ulSize);
+
+    if(hiniPriv && !hini) {
+      PrfCloseProfile(hiniPriv);
+    }
+    break;
+  } while(TRUE);
+  return ulRC;
+}
+
+
Index: /tags/CWMM-0.3.0_GA/common_functions/listbox_funcs.c
===================================================================
--- /tags/CWMM-0.3.0_GA/common_functions/listbox_funcs.c	(revision 213)
+++ /tags/CWMM-0.3.0_GA/common_functions/listbox_funcs.c	(revision 213)
@@ -0,0 +1,59 @@
+#define INCL_WIN
+#define INCL_PM
+
+#ifdef __EMX__
+#include <os2emx.h>
+#else
+#include <os2.h>
+#endif
+#include <stdlib.h>
+#include <string.h>
+
+#if __cplusplus
+extern "C" {
+#endif
+
+/*!***********************************************************/
+/*                                                           */
+/* @@DESC                                                    */
+/*                                                           */
+/* To be written...                                          */
+/*                                                           */
+/*!!**********************************************************/
+SHORT LBFindMatch(HWND hwndLB, char *chrMatchText)
+{
+  SHORT sItem;
+  USHORT a;
+  ULONG ulMatchLen=strlen(chrMatchText);
+
+  if(ulMatchLen==0)
+    return (SHORT)LIT_NONE;
+
+  sItem=SHORT1FROMMR(WinSendMsg(hwndLB, LM_QUERYITEMCOUNT, 0L, 0L));
+  if(sItem==0)
+    return (SHORT)LIT_NONE;
+
+  for(a=0;a<sItem;a++)
+    {
+      SHORT sLength;
+      sLength=SHORT1FROMMR(WinSendMsg(hwndLB, LM_QUERYITEMTEXTLENGTH, MPFROMSHORT(a), MPFROMLONG(0L)));
+
+      if(sLength==ulMatchLen) {
+        char *chrItemText;
+        /* Same length so compare */
+        if((chrItemText=malloc(sLength+1))==NULLHANDLE)
+          return LIT_NONE;
+        WinSendMsg(hwndLB, LM_QUERYITEMTEXT, MPFROM2SHORT(a, sLength+1), MPFROMP(chrItemText));
+        if(!strcmp(chrMatchText, chrItemText)) {
+          free(chrItemText);
+          return a;
+        }
+        free(chrItemText);
+      }
+    }
+  return (SHORT)LIT_NONE;
+}
+
+#if __cplusplus
+}
+#endif
Index: /tags/CWMM-0.3.0_GA/common_functions/makefile
===================================================================
--- /tags/CWMM-0.3.0_GA/common_functions/makefile	(revision 213)
+++ /tags/CWMM-0.3.0_GA/common_functions/makefile	(revision 213)
@@ -0,0 +1,31 @@
+# Makefile for common functions
+
+#include ../make.inc
+
+CC           = icc
+LIB_DIR      = D:/usr/lib 
+CPPFLAGS     = -Ge- /Gm+ -G4 -Gl  /O+ -Oc+ -Ol
+#CPPFLAGS     = -O -Zomf -Zcrtdll -s
+INC		= ../include
+DEFS         =
+PROGS        =
+ODIR		= .
+CPPDIR	= .
+HELPERDIR	=	..\launch_helper
+RESDIR	=	..\res\$(LANGUAGE)
+OBJECTS	=	$(HELPERDIR)\message.obj $(HELPERDIR)\helper.obj
+
+.PHONY:	clean cleaner
+
+all:
+	cd ../. && make
+
+clean:
+
+cleaner:
+	-rm *.*~
+	-cd ./include && rm *.*~
+	-rm *.flc
+
+	
+
Index: /tags/CWMM-0.3.0_GA/common_functions/menu_funcs.c
===================================================================
--- /tags/CWMM-0.3.0_GA/common_functions/menu_funcs.c	(revision 213)
+++ /tags/CWMM-0.3.0_GA/common_functions/menu_funcs.c	(revision 213)
@@ -0,0 +1,135 @@
+#define INCL_WIN
+#define INCL_GPI
+#define INCL_DOS
+#define INCL_DOSERRORS
+
+#include <os2.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+
+#include <stdio.h>
+#include <string.h>
+#include <stdarg.h>
+
+#if  __cplusplus
+extern "C" {
+#endif
+
+
+/*!**************************************************/
+/*                                                  */
+/* @@DESC                                           */
+/*                                                  */
+/* This funktion inserts a separator into menu      */
+/* <hwndMenu> and submenu <hwndSubMenu> at          */
+/* position <iPosition>.                             */
+/*                                                  */
+/*                                                  */
+/*                                                  */
+/*                                                  */
+/*                                                  */
+/*!!*************************************************/
+MRESULT menuInsertMenuSeparator(HWND hwndMenu, HWND hwndSubMenu, SHORT sPosition )
+{
+  MENUITEM mi={0};
+
+  /* Fill the MENUITEM structure */
+  mi.iPosition=sPosition;
+  mi.afStyle=MIS_SEPARATOR;
+  if(hwndSubMenu)
+    mi.afStyle|=MIS_SUBMENU;
+  mi.id=0;
+  mi.afAttribute=NULLHANDLE;                
+  mi.hwndSubMenu=hwndSubMenu;
+  mi.hItem=NULLHANDLE;
+
+  return WinSendMsg(hwndMenu,MM_INSERTITEM,(MPARAM)&mi,
+                    (MPARAM)NULL);                 
+}
+
+
+/*!**************************************************/
+/*                                                  */
+/* @@DESC                                           */
+/*                                                  */
+/* This funktion inserts an item into menu          */
+/* <hwndMenu> and submenu <hwndSubMenu> at          */
+/* position <iPosition>.                            */
+/*                                                  */
+/*!!*************************************************/
+SHORT menuInsertMenuItem( HWND hwndMenu, HWND hwndSubMenu, SHORT sPosition, USHORT iID, char * chrText)
+{
+  MENUITEM mi={0};
+
+  /* Fill the MENUITEM structure */
+  mi.iPosition=sPosition;
+  mi.afStyle=MIS_TEXT;
+  if(hwndSubMenu)
+    mi.afStyle|=MIS_SUBMENU;
+  mi.id=iID;
+  mi.afAttribute=NULLHANDLE;                
+  mi.hwndSubMenu=hwndSubMenu;
+  mi.hItem=NULLHANDLE;
+ 
+  return SHORT1FROMMR(WinSendMsg(hwndMenu,MM_INSERTITEM,(MPARAM)&mi,
+                    (MPARAM)chrText));                 
+}
+
+/*!***********************************************************/
+/*                                                           */
+/* @@DESC                                                    */
+/*                                                           */
+/* To be written...                                          */
+/*                                                           */
+/*!!**********************************************************/
+SHORT menuQueryItemCount(HWND hwndMenu)
+{
+  return SHORT1FROMMR(WinSendMsg( hwndMenu, MM_QUERYITEMCOUNT, MPFROMLONG(0L),
+                     MPFROMLONG(0L))); 
+}
+
+/*!***********************************************************/
+/*                                                           */
+/* @@DESC                                                    */
+/*                                                           */
+/* To be written...                                          */
+/*                                                           */
+/*!!**********************************************************/
+MRESULT menuCheckItem(HWND hwndMenu, USHORT usID, BOOL fIncludeSubMenu, BOOL fCheck)
+{
+  return WinSendMsg( hwndMenu, MM_SETITEMATTR, MPFROM2SHORT(usID, fIncludeSubMenu),
+                     MPFROM2SHORT(MIA_CHECKED, (fCheck ? MIA_CHECKED : FALSE))); 
+}
+
+/*!***********************************************************/
+/*                                                           */
+/* @@DESC                                                    */
+/*                                                           */
+/* To be written...                                          */
+/*                                                           */
+/*!!**********************************************************/
+MRESULT menuRemoveItem(HWND hwndMenu, USHORT usID, BOOL fIncludeSubMenu)
+{
+  return WinSendMsg( hwndMenu, MM_SETITEMATTR, MPFROM2SHORT(usID, fIncludeSubMenu),
+                     MPFROMLONG(0L)); 
+}
+
+/*!***********************************************************/
+/*                                                           */
+/* @@DESC                                                    */
+/*                                                           */
+/* To be written...                                          */
+/*                                                           */
+/*!!**********************************************************/
+MRESULT menuCheckForItem(HWND hwndMenu, USHORT usID, BOOL fIncludeSubMenu)
+{
+  MENUITEM mi;
+  return WinSendMsg( hwndMenu, MM_QUERYITEM, MPFROM2SHORT(usID, fIncludeSubMenu),
+                     MPFROMP(&mi)); 
+}
+
+
+#if __cplusplus
+}
+#endif
+
Index: /tags/CWMM-0.3.0_GA/common_functions/message.c
===================================================================
--- /tags/CWMM-0.3.0_GA/common_functions/message.c	(revision 213)
+++ /tags/CWMM-0.3.0_GA/common_functions/message.c	(revision 213)
@@ -0,0 +1,268 @@
+
+#define INCL_WIN
+
+#include <os2.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+void errorResourceVerbose(void)
+{
+  WinMessageBox(HWND_DESKTOP,0,
+                "The resource DLL which contains all the dialogs, graphics and messages cannot be loaded. \
+                \nPlease check your installation.",
+                "Problem with class installation",12345,
+                MB_OK|MB_MOVEABLE|MB_ERROR);
+}
+
+void errorResource(void)
+{
+#if 0
+  /*
+    Don't show a message box because on WPS startup this may lead to a deadlock.
+    At least I suspect this happens on system where the MM classes don't work.
+    Instead there's a new function errorResourceVerbose() which may be called when we
+    know, the WPS is up and running.
+   */
+  WinMessageBox(HWND_DESKTOP,0,
+                "The resource DLL which contains all the dialogs, graphics and messages cannot be loaded. \
+Please check your installation.",
+"Problem with class installation",12345,
+                MB_OK|MB_MOVEABLE|MB_ERROR);
+#endif
+}
+
+
+/*!**************************************************/
+/*                                                  */
+/* @@DESC                                           */
+/*                                                  */
+/* Show a message box with text strings loaded from */
+/* the resource DLL or the EXE file.                */
+/*                                                  */
+/* @@RETURNS                                        */
+/*                                                  */
+/* ULONG ulResult                                   */
+/*                                                  */
+/* MBID_ERROR in case of an error.                  */
+/* :p.                                              */
+/* Result code from WinMessageBox().                */
+/*                                                  */
+/*                                                  */
+/*!!*************************************************/
+ULONG messageBox( PSZ text, ULONG ulTextID , LONG lSizeText,
+                  PSZ title, ULONG ulTitleID, LONG lSizeTitle,
+                  HMODULE hResource, HWND hwnd, ULONG ulFlags)
+{
+
+  if(!WinLoadString(WinQueryAnchorBlock(hwnd),hResource,ulTextID,lSizeText,text)) {
+    errorResource();
+    return MBID_ERROR;
+  }
+  if(!WinLoadString(WinQueryAnchorBlock(hwnd),hResource,ulTitleID,lSizeTitle,title)) {
+    errorResource();
+    return MBID_ERROR;
+  }
+  return WinMessageBox(  hwnd, hwnd, text, title, 0UL, ulFlags );
+}
+
+static ULONG mBox( PSZ text, ULONG ulTextID , LONG lSizeText,
+                   PSZ title, ULONG ulTitleID, LONG lSizeTitle,
+                   HMODULE hResource, HWND hwnd, ULONG ulFlags)
+{
+
+  if(!WinLoadString(WinQueryAnchorBlock(hwnd),hResource,ulTextID,lSizeText,text)) {
+    errorResource();
+    return MBID_ERROR;
+  }
+  if(!WinLoadString(WinQueryAnchorBlock(hwnd),hResource,ulTitleID,lSizeTitle,title)) {
+    errorResource();
+    return MBID_ERROR;
+  }
+  return WinMessageBox(  HWND_DESKTOP, hwnd, text, title, 0UL, ulFlags );
+}
+
+#if 0
+/*!**************************************************/
+/*                                                  */
+/* @@DESC                                           */
+/*                                                  */
+/* Show a message box with text strings loaded from */
+/* the resource DLL or the EXE file.                */
+/* Unlike messagebox no buffers must be given but   */
+/* only the string IDs. Max title length is 256,    */
+/* max text length 256.                             */
+/* :p.                                              */
+/*                                                  */
+/* This function is obsolete.                       */
+/* Use MsgShowMessageBox() instead.                 */
+/*                                                  */
+/* @@RETURNS                                        */
+/*                                                  */
+/* ULONG ulResult                                   */
+/*                                                  */
+/* MBID_ERROR in case of an error.                  */
+/* :p.                                              */
+/* Result code from WinMessageBox().                */
+/*                                                  */
+/* @@REMARKS                                        */
+/*                                                  */
+/* This function is obsolete.                       */
+/* Use MsgShowMessageBox() instead.                 */
+/*                                                  */
+/*!!*************************************************/
+ULONG showMessageBox2(HWND hwnd, ULONG ulIDTitle, ULONG ulIDText, HMODULE hModule, ULONG ulFlag)
+{
+  char text[256];
+  char title[256];
+
+  return mBox(  text, ulIDText , sizeof(text),
+               title, ulIDTitle, sizeof(title),
+               hModule, hwnd, ulFlag);
+};
+#endif
+
+/*!**************************************************/
+/*                                                  */
+/* @@DESC                                           */
+/*                                                  */
+/* Show a message box with text strings loaded from */
+/* the resource DLL or the EXE file.                */
+/* Unlike messagebox() no buffers must be given but */
+/* only the string IDs. Max title length is 256,    */
+/* max text length 256.                             */
+/*                                                  */
+/* @@PARAM                                          */
+/*                                                  */
+/* HWND hwnd input                                  */
+/*                                                  */
+/* Handle to a window. This will be the owner of    */
+/* the message box.                                 */
+/*                                                  */
+/* @@PARAM                                          */
+/*                                                  */
+/* ULONG ulIDTitle input                            */
+/*                                                  */
+/* ID of the string to be used as the title.        */
+/*                                                  */
+/* @@PARAM                                          */
+/*                                                  */
+/* ULONG ulIDText input                             */
+/*                                                  */
+/* ID of the string to be used as the text.         */
+/*                                                  */
+/* @@PARAM                                          */
+/*                                                  */
+/* HMODULE hModule input                            */
+/*                                                  */
+/* Handle to a ressource DLL or NULLHANDLE. If      */
+/* this parameter is null the strings will be       */
+/* taken from ressources bound to the executable.   */
+/*                                                  */
+/* @@PARAM                                          */
+/*                                                  */
+/* ULONG ulFlags input                              */
+/*                                                  */
+/* Flags specifying the appearance of the message   */
+/* box. See WinMessageBox() for more information.   */
+/*                                                  */
+/* @@RETURNS                                        */
+/*                                                  */
+/* ULONG ulResult                                   */
+/*                                                  */
+/* MBID_ERROR in case of an error. This may be      */
+/* for example if the ressources can't be found.    */
+/* :p.                                              */
+/* Result code from WinMessageBox().                */
+/*                                                  */
+/* @@REMARKS                                        */
+/*                                                  */
+/* The parent of the message box is HWND_DESKTOP.   */
+/*                                                  */
+/*!!*************************************************/
+ULONG MsgShowMessageBox(HWND hwnd, ULONG ulIDTitle, ULONG ulIDText, HMODULE hModule, ULONG ulFlag)
+{
+  PSZ pText;
+  PSZ pTitle;
+  ULONG rc;
+
+#define TLENGTH 256L
+
+  if(NULL==(pText=malloc(TLENGTH*2*sizeof(char))))
+    return MBID_ERROR;
+
+  pTitle=pText+TLENGTH*sizeof(char);
+
+  rc=mBox( pText, ulIDText , TLENGTH,
+           pTitle, ulIDTitle, TLENGTH,
+           hModule, hwnd, ulFlag);
+
+  free(pText);
+  return rc;
+};
+
+
+/*!**************************************************/
+/*                                                  */
+/* @@DESC                                           */
+/*                                                  */
+/* Load a message string from a resource DLL or the */
+/* EXE file.                                        */
+/*                                                  */
+/* @@RETURNS                                        */
+/*                                                  */
+/* BOOL rc                                          */
+/*                                                  */
+/* TRUE if string was found in the resource DLL or  */
+/* EXE file. FALSE otherwise.                       */
+/*                                                  */
+/* @@REMARKS                                        */
+/*                                                  */
+/* This function is obsolete.                       */
+/* Use MsgGetMessage() instead.                     */
+/*                                                  */
+/*!!*************************************************/
+BOOL getMessage(PSZ text,ULONG ulID, LONG lSizeText, HMODULE hResource,HWND hwnd)
+{
+  if(!WinLoadString(WinQueryAnchorBlock(hwnd),hResource,ulID,lSizeText,text)) {
+    strcpy((PCHAR)text,"");
+    return FALSE;
+  }
+  return TRUE;
+}
+
+/*!***********************************************************/
+/*                                                           */
+/* Load a message string from a resource DLL or the          */
+/* EXE file.                                                 */
+/*                                                           */
+/* @@RETURNS                                                 */
+/*                                                           */
+/* BOOL rc                                                   */
+/*                                                           */
+/* TRUE if string was found in the resource DLL or           */
+/* EXE file. FALSE otherwise.                                */
+/*                                                           */
+/* @@REMARKS                                                 */
+/*                                                           */
+/* If an error occurs an empty string is placed in the       */
+/* buffer.                                                   */
+/*                                                           */
+/*!!**********************************************************/
+BOOL MsgGetMessage(PSZ text,ULONG ulID, LONG lSizeText, HMODULE hResource,HWND hwnd)
+{
+  return getMessage( text, ulID, lSizeText, hResource, hwnd);
+}
+
+void pmUsage()
+{
+  WinMessageBox(HWND_DESKTOP,0,
+                "This helper shouldn't be started by hand. \
+                \nIt is called by the multimedia classes. \
+                \nIf you didn't launch the helper by hand you may have found a bug. \
+                \nPlease contact the author.",
+                "Problem with multimedia classes",12345,
+                MB_OK|MB_MOVEABLE|MB_ERROR);
+
+}
+
Index: /tags/CWMM-0.3.0_GA/common_functions/mm_funcs.c
===================================================================
--- /tags/CWMM-0.3.0_GA/common_functions/mm_funcs.c	(revision 213)
+++ /tags/CWMM-0.3.0_GA/common_functions/mm_funcs.c	(revision 213)
@@ -0,0 +1,57 @@
+#define INCL_OS2MM
+
+#include <os2.h>
+#include "os2me.h"
+
+#if  __cplusplus
+extern "C" {
+#endif
+
+/*!**************************************************/
+/*                                                  */
+/* @@DESC                                           */
+/*                                                  */
+/* This funktion returns the mediatype for the      */
+/* given file.                                      */
+/*                                                  */
+/* @@RETURNS                                        */
+/*                                                  */
+/* ULONG MMIO_MEDIATYPE_                            */
+/*                                                  */
+/* MMIO mediatype as identified by MMOS2.           */
+/*                                                  */
+/*!!*************************************************/
+ULONG MMIdentifyFile(char* chrFile)
+{
+  MMIOINFO mmioInfo={0};
+  MMFORMATINFO mmFormatInfo={0};
+  FOURCC fourCC;
+
+  if(MMIO_SUCCESS!=mmioIdentifyFile(chrFile, &mmioInfo, &mmFormatInfo, &fourCC, 0,0))
+    {
+      return MMIO_MEDIATYPE_UNKNOWN;
+    }
+
+  switch(mmFormatInfo.ulMediaType)
+    {
+    case MMIO_MEDIATYPE_MIDI:  /* Midi */
+      return MMIO_MEDIATYPE_MIDI;
+    case MMIO_MEDIATYPE_AUDIO: /* Any other audio file */
+      return MMIO_MEDIATYPE_AUDIO;
+    case MMIO_MEDIATYPE_IMAGE:
+      return MMIO_MEDIATYPE_IMAGE;
+    case MMIO_MEDIATYPE_DIGITALVIDEO:
+      return MMIO_MEDIATYPE_DIGITALVIDEO;
+    case MMIO_MEDIATYPE_MOVIE:
+      return MMIO_MEDIATYPE_MOVIE;
+    default:
+      return MMIO_MEDIATYPE_UNKNOWN;
+    }
+
+  return 0;
+}
+
+#if  __cplusplus
+}
+#endif
+
Index: /tags/CWMM-0.3.0_GA/common_functions/progbars.c
===================================================================
--- /tags/CWMM-0.3.0_GA/common_functions/progbars.c	(revision 213)
+++ /tags/CWMM-0.3.0_GA/common_functions/progbars.c	(revision 213)
@@ -0,0 +1,212 @@
+/*
+ * This file is (C) Chris Wohlgemuth 2001/2002
+ */
+/*
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; see the file COPYING.  If not, write to
+ * the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+
+#define INCL_WIN
+#define INCL_GPI
+#include <os2.h>
+#include <stdlib.h>
+#include <string.h>
+#include <stdio.h>
+
+/* Window ULONG for the percent bar */
+#define QWL_PERCENT 4 /* The location in the window words to store the percent value */
+#define QWL_TEXTPTR 8 /* The ptr to our percent bar text */
+
+/*
+ * Paint the percent bar and print the label if necessary.
+ */
+
+VOID paintPercent(int iPercent, HWND hwnd, HPS hps)
+{
+  POINTL   ptlText, aptlText[TXTBOX_COUNT];
+    RECTL   rcl, rcl2;
+    BOOL    bVertical=FALSE;
+    CHAR  * ptrChr=NULL;
+
+    WinQueryWindowRect(hwnd, &rcl);
+    /* Check if it's a vertical percent bar */
+    if(rcl.xRight<rcl.yTop)
+      bVertical=TRUE;
+    else
+      bVertical=FALSE;
+
+    GpiCreateLogColorTable(hps, 0, LCOLF_RGB, 0, 0, NULL);
+    
+    /* Draw the bar border */
+    WinDrawBorder(hps, &rcl, 1,1,0,0, 0x800);    
+    
+    rcl.xLeft = 1;
+    rcl.xRight -= 1;
+    rcl.yBottom = 1;
+    rcl.yTop -= 1;
+    
+    if((ptrChr=(char*)WinQueryWindowPtr(hwnd,QWL_TEXTPTR))!=NULLHANDLE)
+      {
+        /* Text size */
+        GpiQueryTextBox(hps, strlen(ptrChr), ptrChr,
+                        TXTBOX_COUNT, (PPOINTL)&aptlText);
+   
+        ptlText.x = rcl.xLeft+(((rcl.xRight-rcl.xLeft)
+                                 -(aptlText[TXTBOX_BOTTOMRIGHT].x-aptlText[TXTBOX_BOTTOMLEFT].x))/2);
+        ptlText.y = 3 + rcl.yBottom+(((rcl.yTop-rcl.yBottom)
+                                      -(aptlText[TXTBOX_TOPLEFT].y-aptlText[TXTBOX_BOTTOMLEFT].y))/2);
+      }
+
+    if(!bVertical) {
+      rcl2.xLeft = rcl.xLeft;
+      rcl2.xRight = (rcl.xRight-rcl.xLeft)*iPercent/100; 
+      rcl2.yBottom = rcl.yBottom;
+      rcl2.yTop = rcl.yTop-1;
+      rcl.xLeft=rcl2.xRight+1;
+    }
+    else {
+      rcl2.xLeft = rcl.xLeft;
+      rcl2.xRight = rcl.xRight-1;
+      rcl2.yBottom = rcl.yBottom;
+      rcl2.yTop = (rcl.yTop-rcl.yBottom)*iPercent/100; 
+      rcl.yBottom=rcl2.yTop+1;
+    }
+
+    /* Background */
+    WinFillRect(hps, &rcl,
+                WinQuerySysColor(HWND_DESKTOP, SYSCLR_DIALOGBACKGROUND, 0));
+
+    /* Percentbar */
+    if ((rcl2.xRight > rcl2.xLeft && !bVertical)||(rcl2.yTop > rcl2.yBottom && bVertical)) {
+      ULONG ulBG;
+
+      /* Find color. This color is the background color set within DrDialog */
+      if(!WinQueryPresParam(hwnd, PP_BACKGROUNDCOLOR, PP_BACKGROUNDCOLORINDEX, NULL, sizeof(ulBG),
+                        &ulBG, QPF_ID2COLORINDEX|QPF_NOINHERIT ))
+        ulBG=0x002020ff;
+      GpiSetColor(hps,ulBG );
+
+      rcl2.yBottom+=1;
+      rcl2.xLeft+=1;
+
+      WinFillRect(hps, &rcl2, ulBG);
+      WinDrawBorder(hps, &rcl2, 1,1,0,0, 0x400);
+    }
+
+    /* now print the percentage */
+    if(ptrChr!=NULLHANDLE)
+      {
+        ULONG ulFG; 
+       
+        /* Find color. This color is the foreground color set within DrDialog */
+        if(!WinQueryPresParam(hwnd, PP_FOREGROUNDCOLOR, PP_FOREGROUNDCOLORINDEX, NULL, sizeof(ulFG),
+                              &ulFG, QPF_ID2COLORINDEX|QPF_NOINHERIT ))
+          ulFG=WinQuerySysColor(HWND_DESKTOP, SYSCLR_BUTTONDEFAULT, 0);
+        GpiSetColor(hps,ulFG );
+        GpiMove(hps, &ptlText);
+        GpiCharString(hps, strlen(ptrChr), ptrChr);
+      }
+}
+
+
+/*
+ * This is the window proc for the percentbar control
+ */
+
+MRESULT EXPENTRY percentBarProc(HWND hwnd, ULONG msg, MPARAM mp1, MPARAM mp2)
+{
+  MRESULT mrc;
+  HPS hps;
+  PWNDPARAMS pwp;
+  int iPercent;
+
+  switch(msg) {
+
+  case WM_SETWINDOWPARAMS:
+    {
+      pwp=(PWNDPARAMS)mp1;
+
+      if(pwp->fsStatus==WPM_TEXT) {
+        /* The text changed */
+        char *ptr;
+        char *ptr2;
+
+        /* Get the current percent value for the control */
+        iPercent=atol(pwp->pszText);
+        if(iPercent>100)
+          iPercent=100;
+        if(iPercent<0)
+          iPercent=0;
+
+        /* Check if there is some text for the bar */
+        if((ptr=strchr(pwp->pszText, '#'))!=NULLHANDLE) {
+          /* Everything after the '#' is treated as the label */
+          if((ptr2=(char*)WinQueryWindowPtr(hwnd,QWL_TEXTPTR))!=NULLHANDLE)
+            free(ptr2); /* Free the old text */
+          WinSetWindowPtr(hwnd,QWL_TEXTPTR, NULLHANDLE);
+          if(*(ptr++)!=0) {
+            /* There's additional text to print */
+            if((ptr2=calloc(strlen(ptr)+1, sizeof(char)))!=NULLHANDLE) {
+              strcpy(ptr2,ptr);
+              WinSetWindowPtr(hwnd,QWL_TEXTPTR,ptr2);
+            }
+          }
+        }
+        mrc = WinDefWindowProc(hwnd, msg, mp1, mp2);
+        WinSetWindowULong(hwnd, QWL_PERCENT,iPercent);
+        WinInvalidateRect(hwnd, NULLHANDLE,TRUE);
+        return mrc;
+      }
+      break;
+    }
+  case WM_DESTROY:
+    {
+      char *ptrText;
+      /* Free the memory allocated for the text */
+      if((ptrText=(char*)WinQueryWindowPtr(hwnd,QWL_TEXTPTR))!=NULLHANDLE)
+        free(ptrText);
+      break;
+    }
+  case WM_PRESPARAMCHANGED:
+    /* The color or the font has changed  */
+    /* Force a repaint of the percent bar */
+    mrc = WinDefWindowProc(hwnd, msg, mp1, mp2);
+    if(LONGFROMMP(mp1)==PP_FOREGROUNDCOLOR)
+      WinInvalidateRect(hwnd, NULLHANDLE,TRUE);
+    else if(LONGFROMMP(mp1)==PP_BACKGROUNDCOLOR)
+      WinInvalidateRect(hwnd, NULLHANDLE,TRUE);
+    else if(LONGFROMMP(mp1)==PP_FONTNAMESIZE)
+      WinInvalidateRect(hwnd, NULLHANDLE,TRUE);
+    return mrc;
+  case WM_PAINT:
+    {
+      hps=WinBeginPaint(hwnd, NULLHANDLE, NULLHANDLE);
+      paintPercent(WinQueryWindowULong(hwnd,QWL_PERCENT), hwnd, hps);
+      WinEndPaint(hps);
+    return (MRESULT) FALSE;
+    }
+  
+  default:
+    break;
+  }
+
+  mrc = WinDefWindowProc(hwnd, msg, mp1, mp2);
+  return (mrc);
+}
+
+
+BOOL percentRegisterBarClass(void)
+{
+  return WinRegisterClass(WinQueryAnchorBlock(HWND_DESKTOP),"CW_PERCENTBAR", percentBarProc,0L,12);
+}
Index: /tags/CWMM-0.3.0_GA/common_functions/rexx_funcs.c
===================================================================
--- /tags/CWMM-0.3.0_GA/common_functions/rexx_funcs.c	(revision 213)
+++ /tags/CWMM-0.3.0_GA/common_functions/rexx_funcs.c	(revision 213)
@@ -0,0 +1,229 @@
+
+#define INCL_REXXSAA
+#ifdef __EMX__
+#include <os2emx.h>
+#else
+#include <os2.h>
+#include <rexxsaa.h>                   /* needed for RexxStart()     */
+#endif
+#include <string.h>
+#include <stdio.h>
+#include <stdlib.h>
+
+#if  __cplusplus
+extern "C" {
+#endif
+
+#define  INVALID_ROUTINE 40            /* Raise Rexx error           */
+#define  VALID_ROUTINE    0            /* Successful completion      */
+#define MAX_VAR_LEN  270
+typedef struct RxStemData {
+    SHVBLOCK shvb;                     /* Request block for RxVar    */
+    CHAR varname[MAX_VAR_LEN];         /* Buffer for the variable    */
+                                       /* name                       */
+    ULONG stemlen;                     /* Length of stem.            */
+ } RXSTEMDATA;
+
+/*!**************************************************/
+/*                                                  */
+/* @@DESC                                           */
+/*                                                  */
+/* To be written...                                 */
+/*                                                  */
+/*!!*************************************************/
+LONG RxGetLongFromStemWithoutNumber(RXSTRING args, char * chrTail, ULONG* ulError)
+{
+  char text[20];
+  RXSTEMDATA ldp={0};
+
+  *ulError=0;  
+                                       /* Initialize data area       */
+  strcpy(ldp.varname, args.strptr);
+  ldp.stemlen = args.strlength;
+  strupr(ldp.varname);                 /* uppercase the name         */
+
+  if (ldp.varname[ldp.stemlen-1] != '.')
+    ldp.varname[ldp.stemlen++] = '.';
+
+  /* Add tail  to stem */  
+  strncat(ldp.varname+ldp.stemlen, chrTail, sizeof(ldp.varname)-ldp.stemlen);
+  ldp.varname[sizeof(ldp.varname)-1]=0;
+
+  ldp.shvb.shvnext = NULL;                           /* Only one request block */
+  ldp.shvb.shvname.strptr = ldp.varname;             /* Var name               */
+  ldp.shvb.shvname.strlength = strlen(ldp.varname);  /* RxString length        */
+  ldp.shvb.shvnamelen = ldp.shvb.shvname.strlength;
+
+  ldp.shvb.shvcode = RXSHV_SYFET;                    /* Get a value            */
+  ldp.shvb.shvret = 0;
+
+  /* The value field of the request block is empty so REXX will allocate memory for us
+     which holds the value. */
+
+  /* Now get the value */
+  if (RexxVariablePool(&ldp.shvb) == RXSHV_BADN) {
+    *ulError=1;
+    return 0;      /* error on non-zero          */
+  }
+
+  if(sizeof(text) > ldp.shvb.shvvalue.strlength) {
+    strncpy(text, ldp.shvb.shvvalue.strptr, ldp.shvb.shvvalue.strlength);
+    text[ldp.shvb.shvvalue.strlength]=0;
+  }
+  else
+    strncpy(text, ldp.shvb.shvvalue.strptr, sizeof(text));
+  text[sizeof(text)-1]=0;
+
+  /* Free mem allocated for us by REXX */
+  DosFreeMem(ldp.shvb.shvvalue.strptr);
+
+  return atol(text);
+}
+
+/*!***********************************************************/
+/*                                                           */
+/* @@DESC                                                    */
+/*                                                           */
+/* This function returns a string from a stem. The caller    */
+/* must free the returned string with free()                 */
+/*                                                           */
+/*!!**********************************************************/
+PSZ RxGetStringFromStemWithoutNumber(RXSTRING args, char *chrTail, ULONG* ulError)
+{
+  RXSTEMDATA ldp={0};
+  char *pText;  
+  *ulError=0;
+  
+                                       /* Initialize data area       */
+  strcpy(ldp.varname, args.strptr);
+  ldp.stemlen = args.strlength;
+  strupr(ldp.varname);                 /* uppercase the name         */
+
+  if (ldp.varname[ldp.stemlen-1] != '.')
+    ldp.varname[ldp.stemlen++] = '.';
+
+  /* Add tail to stem */  
+  sprintf(ldp.varname+ldp.stemlen, "%s", chrTail);
+
+  ldp.shvb.shvnext = NULL;                           /* Only one request block */
+  ldp.shvb.shvname.strptr = ldp.varname;             /* Var name               */
+  ldp.shvb.shvname.strlength = strlen(ldp.varname);  /* RxString length        */
+  ldp.shvb.shvnamelen = ldp.shvb.shvname.strlength;
+
+  ldp.shvb.shvcode = RXSHV_SYFET;                    /* Get a value            */
+  ldp.shvb.shvret = 0;
+
+  /* The value field of the request block is empty so REXX will allocate memory for us
+     which holds the value. */
+
+  /* Now get the value */
+  if (RexxVariablePool(&ldp.shvb) == RXSHV_BADN) {
+    *ulError=1;
+    return 0;      /* error on non-zero          */
+  }
+
+  if((pText=(char*)malloc(ldp.shvb.shvvalue.strlength+1))!=NULLHANDLE)
+     {
+       strncpy(pText, ldp.shvb.shvvalue.strptr, ldp.shvb.shvvalue.strlength);
+       pText[ldp.shvb.shvvalue.strlength]=0;
+     }
+  /* Free mem allocated for us by REXX */
+  DosFreeMem(ldp.shvb.shvvalue.strptr);
+
+  return pText;
+}
+
+/*!***********************************************************/
+/*                                                           */
+/* @@DESC                                                    */
+/*                                                           */
+/* This function returns a long from a REXX var.             */
+/*                                                           */
+/*!!**********************************************************/
+LONG RxGetLongFromVar(char * chrVar, ULONG* ulError)
+{
+  char text[20];
+  RXSTEMDATA ldp={0};
+  
+  *ulError=0;  
+
+  /* Initialize data area       */
+  strcpy(ldp.varname, chrVar);
+  ldp.stemlen = strlen(chrVar);
+  strupr(ldp.varname);                 /* uppercase the name         */
+  
+  ldp.varname[sizeof(ldp.varname)-1]=0;
+
+  ldp.shvb.shvnext = NULL;                           /* Only one request block */
+  ldp.shvb.shvname.strptr = ldp.varname;             /* Var name               */
+  ldp.shvb.shvname.strlength = strlen(ldp.varname);  /* RxString length        */
+  ldp.shvb.shvnamelen = ldp.shvb.shvname.strlength;
+
+  ldp.shvb.shvcode = RXSHV_SYFET;                    /* Get a value            */
+  ldp.shvb.shvret = 0;
+
+  /* The value field of the request block is empty so REXX will allocate memory for us
+     which holds the value. */
+
+  /* Now get the value */
+  if (RexxVariablePool(&ldp.shvb) == RXSHV_BADN) {
+    *ulError=1;
+    return 0;      /* error on non-zero          */
+  }
+
+  if(sizeof(text) > ldp.shvb.shvvalue.strlength) {
+    strncpy(text, ldp.shvb.shvvalue.strptr, ldp.shvb.shvvalue.strlength);
+    text[ldp.shvb.shvvalue.strlength]=0;
+  }
+  else
+    strncpy(text, ldp.shvb.shvvalue.strptr, sizeof(text));
+  text[sizeof(text)-1]=0;
+
+  /* Free mem allocated for us by REXX */
+  DosFreeMem(ldp.shvb.shvvalue.strptr);
+
+  return atol(text);
+}
+
+/*!***********************************************************/
+/*                                                           */
+/* @@DESC                                                    */
+/*                                                           */
+/* To be written...                                          */
+/*                                                           */
+/*!!**********************************************************/
+LONG RxSetLongInRexxVar(char* chrVar, ULONG ulVal)
+{
+  RXSTEMDATA ldp;
+  char valString[34];
+
+  if(!chrVar || !strlen(chrVar))
+    return INVALID_ROUTINE;      /* error on non-zero          */
+
+  memset(&ldp, 0, sizeof(ldp));
+                                         /* Initialize data area       */
+  strcpy(ldp.varname, chrVar);
+  ldp.stemlen = strlen(chrVar);
+  strupr(ldp.varname);                 /* uppercase the name         */
+
+  ldp.shvb.shvnext = NULL;                           /* Only one request block */
+  ldp.shvb.shvname.strptr = ldp.varname;             /* Var name               */
+  ldp.shvb.shvname.strlength = strlen(ldp.varname);  /* RxString length        */
+  ldp.shvb.shvnamelen = ldp.shvb.shvname.strlength;
+  /* Set the value of the var */
+  ldp.shvb.shvvalue.strptr =   _ultoa(ulVal, valString, 10);  /* Make a string from the var */
+  ldp.shvb.shvvalue.strlength = strlen(valString);
+  ldp.shvb.shvvaluelen = ldp.shvb.shvvalue.strlength;
+  ldp.shvb.shvcode = RXSHV_SYSET;
+  ldp.shvb.shvret = 0;
+
+  if (RexxVariablePool(&ldp.shvb) == RXSHV_BADN)
+    return INVALID_ROUTINE;      /* error on non-zero          */
+
+  return VALID_ROUTINE;
+}
+
+#if  __cplusplus
+}
+#endif
+
Index: /tags/CWMM-0.3.0_GA/common_functions/som_wps_funcs.c
===================================================================
--- /tags/CWMM-0.3.0_GA/common_functions/som_wps_funcs.c	(revision 213)
+++ /tags/CWMM-0.3.0_GA/common_functions/som_wps_funcs.c	(revision 213)
@@ -0,0 +1,322 @@
+#define INCL_PM
+#define INCL_DOS
+#include <os2.h>
+#include <stdio.h>
+/* Include file with definition for WPShadow class */
+#include "wpshadow.h"
+#include "wpdisk.h"
+#include "wpfsys.h" /* For _wpQueryDisk */
+
+
+/*&************************************************/
+
+
+/*&&***********************************************/
+
+#if 0
+int iFirstCD;
+int iNumCD;
+BOOL bGotCD=FALSE;
+static BOOL _queryCDOnce(void)
+{
+  static BOOL bTriedCD=FALSE;
+
+  /* Only search for CDs once to speed up things */
+  if(!bTriedCD) {
+    bTriedCD=TRUE; /* Don't search for CDs again */ 
+    /* Get CD drives */
+    if(cwQueryCDDrives(&iNumCD, &iFirstCD))
+      bGotCD=TRUE;
+  }
+  return TRUE;
+}
+BOOL somObjectIsOnCD(WPObject * somSelf)
+{
+  /* Get the CD drives in the system */ 
+  _queryCDOnce();
+
+  if(bGotCD) {
+    WPDisk *wpDisk;
+    int iDiskNum;
+    
+    if((wpDisk=_wpQueryDisk(somSelf))!=NULLHANDLE) {
+      if((iDiskNum=_wpQueryLogicalDrive(wpDisk))!=0) {
+        if((iDiskNum>=iFirstCD && iDiskNum<=iFirstCD+iNumCD)) {
+          return TRUE; /* The object is on a CD */
+        }
+      }
+    }
+  }
+  return FALSE; /* Object not on CD */
+}
+#endif
+
+/*!************************************************************/
+/*                                                            */
+/* @@DESC                                                     */
+/* This function returns the pointer to a file system object  */
+/* or NULL.                                                   */
+/* It follows shadow objects and returns the object handle    */
+/* of the linked object if it's a file system object          */
+/*                                                            */
+/*!!***********************************************************/
+WPObject* somGetFileSystemObject(WPObject* wpObject)
+{
+  if(!somIsObj(wpObject))
+    return NULL;//No object given
+
+  /* Check if it's a shadow */
+  //if(somResolveByName(wpObject,"wpQueryShadowedObject")){ 
+  if(_somIsA(wpObject,_WPShadow)){ 
+    /* Yes, it's a shadow. Query the linked object. */
+    wpObject=_wpQueryShadowedObject((WPShadow*)wpObject, FALSE);
+    if(!somIsObj(wpObject))
+      return NULL;//The link is broken
+  }
+
+#if 0
+  while(somResolveByName(wpObject,"wpQueryShadowedObject")) {
+    /* Yes, it's a shadow. Query the linked object. */
+    wpObject=_wpQueryShadowedObject((WPShadow*)wpObject, FALSE);
+  }
+#endif
+  
+  /* Check if it's a file system object */
+  //  if(somResolveByName(wpObject, "wpQueryRealName")){
+  if(_somIsA(wpObject, _WPFileSystem)){
+    return wpObject;/* Yes */
+  }
+  else
+    return NULL;
+}
+
+/*!*******************************************************/
+/*                                                       */
+/* @@DESC                                                */
+/* Get the class object for the class <chrClassName>.    */
+/*                                                       */
+/*                                                       */
+/* @@REMARKS                                             */
+/*                                                       */
+/* If the class isn't already loaded by SOM this function*/
+/* will find it and load it into memory.                 */
+/*                                                       */
+/* @@PARAM                                               */
+/*                                                       */
+/* char* chrClassName input                              */
+/*                                                       */
+/* Class for which the class object will be returned.    */
+/*                                                       */
+/*                                                       */
+/* @@RETURNS                                             */
+/*                                                       */
+/* SOMClass somCls                                       */
+/* Pointer to the class object.                          */
+/* In case of an error NULL is returned.                 */
+/*                                                       */
+/*!!******************************************************/
+SOMClass* somGetSomClass(char* chrClassName)
+{
+  somId    mySomId;
+  SOMClass *somClass;
+
+  if((mySomId=somIdFromString(chrClassName))==NULLHANDLE)
+    return NULLHANDLE;
+
+  //  somClass=_somClassFromId(SOMClassMgrObject, mySomId);
+  /* somFindClass() loads the class if not already done */
+  somClass=_somFindClass(SOMClassMgrObject, mySomId, 1, 1);
+  SOMFree(mySomId);
+
+  return somClass;
+}
+
+#if  __cplusplus
+extern "C" {
+
+#endif
+
+/*!*******************************************************/
+/*                                                       */
+/* @@DESC                                                */
+/* Check if the object wpObject is an instance of the    */
+/* class <chrClassName>.                                 */
+/*                                                       */
+/* @@REMARKS                                             */
+/*                                                       */
+/* The object may be an instance of the specified class  */
+/* or of one of the subclasses when this function returns*/
+/* TRUE. For example if the object is an instance of     */
+/* MMMP3 and MMMP3 is a subclass of MMAudio a check      */
+/* for MMAudio would return TRUE.                        */
+/*                                                       */
+/* @@PARAM                                               */
+/*                                                       */
+/* WPObject* wpObject input                              */
+/* Object which should be tested.                        */
+/*                                                       */
+/* @@PARAM                                               */
+/*                                                       */
+/* char* chrClassName input                              */
+/*                                                       */
+/* Name of the class e.g. MMAudio.                       */
+/*                                                       */
+/* @@RETURNS                                             */
+/*                                                       */
+/* BOOL  rc                                              */
+/* TRUE if the object is an instance of the class        */
+/* <chrClassName>, or one of its subclasses,             */
+/* FALSE otherwise.                                      */
+/*                                                       */
+/*                                                       */
+/*!!******************************************************/
+BOOL somObjectIsA(WPObject* wpObject, char * chrClassName)
+{
+  return _somIsA(wpObject, somGetSomClass(chrClassName));
+}
+
+#if  __cplusplus
+}
+#endif
+
+
+WPObject* somResolveShadow(WPObject* wpObject)
+{
+  if(!somIsObj(wpObject))
+    return NULLHANDLE;
+  if(somObjectIsA(wpObject, "WPShadow"))
+    return _wpQueryShadowedObject((WPShadow*)wpObject, FALSE);
+
+  return wpObject;
+}
+
+/*!*******************************************************/
+/*                                                       */
+/* @@DESC                                                */
+/* Realloc memory for a new string. If an error occurs   */
+/* the old string is returned. In pulError the error     */
+/* code of wpAllocMem() is returned. The memory of the   */
+/* old string is freed if the function succeeds.         */
+/*                                                       */
+/* @@REMARKS                                             */
+/* The memory containing the old string must have been   */
+/* allocated using wpAllocMem(). Don't call this         */
+/* functions with strings located in memory allocated    */
+/* using DosAllocMem() or malloc(). pulError contains    */
+/* the error code as returned by wpAllocMem().           */
+/* If the string is no longer needed free the memory     */
+/* using wpFreeMem().                                    */
+/*                                                       */
+/* @@PARAM                                               */
+/*                                                       */
+/* WPObject* wpObject input                              */
+/* Object for which the wpAllocMem() method is called.   */
+/*                                                       */
+/*                                                       */
+/* @@PARAM                                               */
+/*                                                       */
+/* PBYTE oldString input                                 */
+/*                                                       */
+/* Ponter to the already allocated string memory. If     */
+/* this function succeeds, this memory will be freed.    */
+/*                                                       */
+/* @@PARAM                                               */
+/*                                                       */
+/* char* newString input                                 */
+/*                                                       */
+/* String which should be put into a new memory block    */
+/*                                                       */
+/* @@PARAM                                               */
+/*                                                       */
+/* PULONG pulError in/out                                */
+/*                                                       */
+/* Return code of wpAllocMem().                          */
+/*                                                       */
+/* @@RETURNS                                             */
+/*                                                       */
+/* PBYTE pByte                                           */
+/* Pointer to the memory containing the newString.       */
+/* If an error ocurred, the pointer to the old string    */
+/* is returned. The strings are always null terminated.  */
+/*                                                       */
+/*                                                       */
+/*!!******************************************************/
+PBYTE somReallocString(WPObject* wpObject, PBYTE oldString, char* newString, PULONG pulError)
+{
+  ULONG ulLen;
+  PBYTE pNewText;
+
+  if(!newString)
+    return oldString;
+
+  ulLen=strlen(newString);
+  /* Alloc mem for new string */
+  if( (pNewText=_wpAllocMem(wpObject, ulLen, pulError))!=NULLHANDLE) {
+    /* Copy string into memory */
+    strcpy(pNewText, newString);
+    if(oldString)
+      _wpFreeMem(wpObject, oldString);
+    return pNewText;
+  }
+
+  return oldString;;
+}
+
+
+BOOL wpsObjectIsInsertedInContainer(WPObject * wpObject)
+{
+
+  if(_wpFindUseItem(wpObject, USAGE_RECORD, NULLHANDLE))
+    return TRUE;
+
+  return FALSE;
+}
+
+/*
+  This function draws the template (but not the icon) if the object is a template.
+ */
+ULONG wpsDrawTemplate(WPObject* wpObject, RECTL* rcl, HPS hps, ULONG flCnr)
+{
+  HPOINTER hptrTemplate;
+  HMODULE hmodTemplate;
+  
+  if(!DosQueryModuleHandle("PMWP",&hmodTemplate))
+    {
+      ULONG ulIconSize;
+      
+      hptrTemplate=WinLoadPointer(HWND_DESKTOP, hmodTemplate, 20);
+      WinDrawPointer(hps, rcl->xLeft, rcl->yBottom, hptrTemplate, (flCnr &  CV_MINI ? DP_MINI:DP_NORMAL));
+      WinDestroyPointer(hptrTemplate);
+      if((ulIconSize=WinQuerySysValue(HWND_DESKTOP,SV_CXICON))!=0)
+        {
+          ulIconSize=(rcl->xRight-rcl->xLeft-ulIconSize/2)/2;
+          rcl->xLeft+=ulIconSize/2;
+          rcl->yBottom+=ulIconSize;
+        }
+      return DP_MINI;
+    }
+  
+  return DP_NORMAL;
+}
+
+
+//#include "sys_funcs.h"
+/*
+  This function redraws an object in all containers it is inserted in.
+  */
+void wpsRefreshObjectRecords(WPObject *somSelf)
+{
+  PUSEITEM pUse;
+  //    SysWriteToTrapLog("!!!  %s: %s\n", __FUNCTION__, _wpQueryTitle(somSelf));
+    for(pUse=_wpFindUseItem(somSelf, USAGE_RECORD, NULL );pUse;
+        pUse=_wpFindUseItem(somSelf, USAGE_RECORD, pUse ))
+      {
+        PRECORDITEM pRecordItem=(PRECORDITEM)++pUse;
+        WinPostMsg(pRecordItem->hwndCnr, CM_INVALIDATERECORD,MPFROMP(&pRecordItem->pRecord),
+                   MPFROM2SHORT(1,CMA_NOREPOSITION/* |CMA_ERASE*/));
+        //      SysWriteToTrapLog("!!!  %s: %s %x\n", __FUNCTION__, _wpQueryTitle(somSelf), pRecordItem->hwndCnr);
+      }/* for() */
+}
+
+
+
Index: /tags/CWMM-0.3.0_GA/common_functions/sys_funcs.c
===================================================================
--- /tags/CWMM-0.3.0_GA/common_functions/sys_funcs.c	(revision 213)
+++ /tags/CWMM-0.3.0_GA/common_functions/sys_funcs.c	(revision 213)
@@ -0,0 +1,642 @@
+#define INCL_WIN
+#define INCL_GPI
+#define INCL_DOS
+#define INCL_DOSPROCESS
+#define INCL_DOSERRORS
+#define INCL_DOSDEVIOCTL
+#define INCL_DOSDEVICES    // DosDevIOCtl
+
+#include <os2.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <stdio.h>
+#include <string.h> /* For strlcpy() */
+#include <stdarg.h>
+#include <stdlib.h> /* For getenv() */
+
+#include "sys_funcs.h"
+#include "excptLogName.h"
+
+#if  __cplusplus
+extern "C" {
+#endif
+  
+/*!**************************************************/
+/*                                                  */
+/* @@DESC                                           */
+/*                                                  */
+/* This funktion returns the drive letter of the    */
+/* boot partition.                                  */
+/*                                                  */
+/* @@RETURNS                                        */
+/*                                                  */
+/* char chrDrive                                    */
+/*                                                  */
+/* Drive from which the system was booted.          */
+/*                                                  */
+/*!!*************************************************/
+char SysQueryBootDriveLetter(void)
+{
+  ULONG ulSysValue;
+
+  if(!DosQuerySysInfo(QSV_BOOT_DRIVE, QSV_BOOT_DRIVE,&ulSysValue,sizeof(ulSysValue)))
+    return 'a'+ulSysValue-1;
+
+  return 'c';
+} 
+
+/*!**************************************************/
+/*                                                  */
+/* @@DESC                                           */
+/*                                                  */
+/* This funktion returns the running OS version.    */
+/*                                                  */
+/* @@RETURNS                                        */
+/*                                                  */
+/* ULONG ulVersion                                  */
+/*                                                  */
+/*                                                  */
+/* 30: Warp 3:p.                                    */
+/* 40: Warp 4                                       */
+/*                                                  */
+/*!!*************************************************/
+ULONG SysQueryOSRelease(void)
+{
+  static ULONG ulVersionMinor=0;
+
+  if(!ulVersionMinor)
+    if(DosQuerySysInfo(QSV_VERSION_MINOR, QSV_VERSION_MINOR, &ulVersionMinor, sizeof(ulVersionMinor)))
+      ulVersionMinor=30;/* Default Warp 3 */
+
+  return ulVersionMinor;
+
+}
+
+/*
+   Documentation script can't handle the const keyword yet!!!!
+*/
+/*--->!**************************************************/
+/*                                                  */
+/* @@DESC                                           */
+/*                                                  */
+/* This function may be used to write data into the */
+/* traplog file. The syntax is similar to printf(). */
+/*                                                  */
+/* @@REMARKS                                        */
+/*                                                  */
+/* The filename of the traplog is defined in the    */
+/* include file :hp2.excptLogName.h:ehp2.           */
+/*                                                  */
+/* !parsing is broken at the moment because of const and (...)              */
+/*                                                  */
+/*!!*************************************************/
+void SysWriteToTrapLog(const char* chrFormat, ...)
+{
+  char logNameLocal[CCHMAXPATH];
+  FILE *fHandle;
+  CHAR *LogPath;
+
+
+  LogPath = getenv( "LOGFILES" );
+  if (!LogPath)
+      sprintf(logNameLocal,"%c:\\%s",SysQueryBootDriveLetter(), EXCEPTION_LOGFILE_NAME);
+  else
+      sprintf(logNameLocal,"%s\\%s",LogPath, EXCEPTION_LOGFILE_NAME);
+  
+  fHandle=fopen(logNameLocal,"a");
+  if(fHandle) {
+    va_list arg_ptr;
+
+    va_start (arg_ptr, chrFormat);
+    vfprintf(fHandle, chrFormat, arg_ptr);
+    va_end (arg_ptr);
+    fclose(fHandle);
+  }
+}
+
+/*!**************************************************/
+/*                                                  */
+/* @@DESC                                           */
+/*                                                  */
+/* This function checks if the given file exists.   */
+/* thread.                                          */
+/*                                                  */
+/* @@RETURNS                                        */
+/*                                                  */
+/* BOOL fExists                                     */
+/*                                                  */
+/* TRUE: File exists, FALSE otherwise.              */
+/*                                                  */
+/*!!*************************************************/
+BOOL SysCheckFileExists(char* chrFileName)
+{
+  struct stat statBuf;
+
+  /* Check file path */
+  if(stat(chrFileName , &statBuf)==-1)
+    return FALSE;
+  else
+    return TRUE;
+}
+
+
+/*!**************************************************/
+/*                                                  */
+/* @@DESC                                           */
+/*                                                  */
+/* This function queries the size of a file.        */
+/*                                                  */
+/* @@RETURNS                                        */
+/*                                                  */
+/* ULONG ulSize                                     */
+/*                                                  */
+/* Size of the file.                                */
+/*                                                  */
+/* @@REMARKS                                        */
+/*                                                  */
+/* In case of a nonexistant file 0 is returned. So  */
+/* it's necessary to first check if the file exists.*/
+/*                                                  */
+/*!!*************************************************/ 
+ULONG SysQueryFileSize(char* chrFileName)
+{
+  struct stat statBuf;
+
+  /* Check file path */
+  if(stat(chrFileName , &statBuf)==-1)
+    return 0;
+ 
+  return statBuf.st_size;
+}
+
+/*!**************************************************/
+/*                                                  */
+/* @@DESC                                           */
+/*                                                  */
+/* This function returns the ID of the calling      */
+/* thread.                                          */
+/*                                                  */
+/* @@RETURNS                                        */
+/*                                                  */
+/* ULONG ulTID                                      */
+/*                                                  */
+/* ID of the current thread.                        */
+/*                                                  */
+/*!!*************************************************/
+ULONG SysQueryCurrentTID(void)
+{
+  PPIB ppib;
+  PTIB ptib;
+
+  DosGetInfoBlocks( &ptib, &ppib);
+
+  return ptib->tib_ptib2->tib2_ultid;
+}
+
+/*!**************************************************/
+/*                                                  */
+/* @@DESC                                           */
+/*                                                  */
+/* To be written...                                 */
+/*                                                  */
+/*!!*************************************************/
+ULONG SysQueryDriveType(ULONG ulDriveNum)
+{
+  ULONG ulDisk=0;
+  ULONG ulParamLen;
+  ULONG ulDataLen;
+  char chrParam[2]={0};
+  char chrData;
+  ULONG rc;
+
+  if(ulDriveNum>26 || ulDriveNum<1)
+    return QDT_ERROR_DISK;
+
+  //  SysWriteToTrapLog("Drive nr.: %d\n", ulDriveNum);
+
+  /*
+    Query fixed, removable and remote drives in the system.
+    */
+  ulDataLen=sizeof(chrData);
+  ulParamLen=sizeof(chrParam);
+  chrParam[1]=(BYTE)ulDriveNum-1;
+  chrParam[0]=0;
+  /* Check if drive is fixed or removable */
+  rc = DosDevIOCtl(-1, IOCTL_DISK, DSK_BLOCKREMOVABLE,
+                   chrParam, sizeof(chrParam), &ulParamLen, &chrData,
+                   sizeof(chrData), &ulDataLen);
+  
+  if(rc) {
+    //   SysWriteToTrapLog("Drive nr.: %d, rc for DSK_BLOCKREMOVABLE", ulDriveNum);
+    if(rc==ERROR_NOT_SUPPORTED) {
+      /* This may be a remote drive */
+      char chrDev[8];
+      ULONG cbBuf;
+      BYTE buf[sizeof(FSQBUFFER2)+3*CCHMAXPATH];
+      PFSQBUFFER2 pBuf=(PFSQBUFFER2)buf;
+      
+      //      SysWriteToTrapLog("Drive nr.: %d, rc for DSK_BLOCKREMOVABLE-> ERROR_NOT_SUPPORTED\n", ulDriveNum);
+      sprintf(chrDev, "%c:", 'a'+(char)(ulDriveNum-1));
+      cbBuf=sizeof(buf);
+      
+      /* Check if local or remote (or anything else) */
+      rc= DosQueryFSAttach(chrDev, 0, FSAIL_QUERYNAME,(PFSQBUFFER2) &buf, &cbBuf);
+      if(!rc) {
+        if(pBuf->iType==FSAT_REMOTEDRV)
+          ulDisk=QDT_REMOTE_DRIVE;
+      }
+    }/* ERROR_NOT_SUPPPORTED */
+    else
+      ulDisk=QDT_NO_DRIVE; /* Everything we don't understand is no disk */
+  }/* rc != NO_ERROR */
+  else {
+    /* We end here for HDs, floppies and CD-ROMS */
+    //   SysWriteToTrapLog("Drive nr.: %d, local ones\n", ulDriveNum);
+    if(chrData ) /* chrData is 1 if Fixed disk */
+      return QDT_FIXED_DISK;
+    else {
+      /* Check for floppy drives */
+      BYTE               abParm[2] = { 0, (BYTE)ulDriveNum-1 };
+      ULONG              ulParmLen = 2;
+      ULONG              ulDataLen = 0;
+      BIOSPARAMETERBLOCK bpb;
+      
+      //      SysWriteToTrapLog("Drive nr.: %d, not a fixed disk\n", ulDriveNum);
+
+      /* The disk is local. Look for floppy */
+      if (DosDevIOCtl ((HFILE)-1, IOCTL_DISK, DSK_GETDEVICEPARAMS, 
+                       (PVOID)&abParm[0], sizeof (abParm), &ulParmLen, (PVOID)&bpb, sizeof (bpb), &ulDataLen) == NO_ERROR) {
+        {
+          ULONG ulDevType;
+          BOOL fRemovable;
+          
+          if (ulDataLen < 36) 
+            return (QDT_NO_DRIVE); /* Error */
+          
+          ulDevType = bpb.bDeviceType;
+          fRemovable = (BOOL)((bpb.fsDeviceAttr & 0x01) ? FALSE : TRUE);
+          //    SysWriteToTrapLog("Drive nr.: %d, ulDevType: %d\n", ulDriveNum, ulDevType);
+
+          if ((ulDevType == 7) && fRemovable) {  
+            // Check if DEVTYPE_OTHER (7) could be a 1.44MB diskette (Just for the sake, check for a 720kB and 2.88MB while we're at it).
+            switch (bpb.usBytesPerSector * bpb.cSectors) {
+            case 512*1440:
+              return QDT_DISKETTE_DRIVE; //DEVTYPE_35INCH_1MB_DISKETTE;
+            case 512*2880:
+              return QDT_DISKETTE_DRIVE;//DEVTYPE_35INCH_2MB_DISKETTE;
+            case 512*5760:
+              return QDT_DISKETTE_DRIVE;//DEVTYPE_35INCH_2MB_DISKETTE;
+            }/* switch()*/
+          }else {
+            switch (ulDevType) {
+            case 0: /* 48TPI diskette */
+            case 1: /* 96TPI diskette */
+            case 2: /* 3.5 inch diskette */
+            case 3: /* 8inch single diskette */
+            case 4: /* 8inch double diskette */
+            case 9: /* 3.5 4MB (2.88 formatted) diskette */
+              return QDT_DISKETTE_DRIVE;
+            }/* switch() */
+          }/* else */
+          //          SysWriteToTrapLog("Drive nr.: %d, ????\n", ulDriveNum);
+          /* Assume CD-ROM here */
+          return (QDT_CDROM_DRIVE); /* For example tape */
+          return (QDT_NO_DRIVE); /* For example tape */
+        }
+      }/* DSK_GETDEVICEPARAMS */
+    }/* else */
+    ulDisk=QDT_REMOVABLE_DISK;
+  }
+  
+  return ulDisk;
+}
+
+#if 0
+ULONG SysQueryDriveType_(ULONG ulDriveNum)
+{
+  static char chrDisks[26]={0};
+  static BOOL bInit=FALSE;
+  int a;
+
+  if(ulDriveNum>26 || ulDriveNum<1)
+    return QDT_ERROR_DISK;
+
+  if(!bInit) {
+    /*
+      Query fixed, removable and remote drives in the system.
+      */
+    for(a=0; a<26; a++) {
+      ULONG ulParamLen;
+      ULONG ulDataLen;
+      char chrParam[2]={0};
+      char chrData;
+      ULONG rc;
+
+      ulDataLen=sizeof(chrData);
+      ulParamLen=sizeof(chrParam);
+      chrParam[1]=a;
+      chrParam[0]=0;
+      /* Check if drive is fixed or removable */
+      rc = DosDevIOCtl(-1, IOCTL_DISK, DSK_BLOCKREMOVABLE,
+                       chrParam, sizeof(chrParam), &ulParamLen, &chrData,
+                       sizeof(chrData), &ulDataLen);
+      
+      if(rc) {
+        if(rc==ERROR_NOT_SUPPORTED) {
+          /* This may be a remote drive */
+          char chrDev[8];
+          ULONG cbBuf;
+          BYTE buf[sizeof(FSQBUFFER2)+3*CCHMAXPATH];
+          PFSQBUFFER2 pBuf=(PFSQBUFFER2)buf;
+          
+          sprintf(chrDev, "%c:", 'a'+a);
+          cbBuf=sizeof(buf);
+          
+          /* Check if local or remote (or anything else) */
+          rc= DosQueryFSAttach(chrDev, 0, FSAIL_QUERYNAME,(PFSQBUFFER2) &buf, &cbBuf);
+          if(!rc) {
+            if(pBuf->iType==FSAT_REMOTEDRV)
+              chrDisks[a]=QDT_REMOTE_DRIVE;
+          }
+        }/* ERROR_NOT_SUPPPORTED */
+        else
+          chrDisks[a]=QDT_NO_DRIVE; /* Everything we don't understand is no disk */
+      }/* rc */
+      else
+        chrDisks[a]=(chrData & QDT_FIXED_DISK); /* chrData is 1 if Fixed disk */
+    }/* for */
+    bInit=TRUE;
+  }/* bInit */
+  return chrDisks[ulDriveNum-1];
+}
+#endif
+
+/*!**************************************************/
+/*                                                  */
+/* @@DESC                                           */
+/*                                                  */
+/* To be written...                                 */
+/*                                                  */
+/*!!*************************************************/
+ULONG SysQueryFreeDriveSpace(ULONG ulDriveNum, ULONG *ulTotal, ULONG * ulFree, ULONG* ulBytesUnit)
+{
+  FSALLOCATE fsa;
+  ULONG rc;
+
+  if(!ulTotal || !ulFree || !ulBytesUnit)
+    return 1;
+
+  if( ulDriveNum<1 || ulDriveNum > 26)
+    return ERROR_INVALID_DRIVE;
+
+  if((rc=DosQueryFSInfo(ulDriveNum, FSIL_ALLOC, &fsa, sizeof(FSALLOCATE)))!=NO_ERROR)
+    return rc;
+
+  *ulTotal=fsa.cUnit;
+  *ulFree=fsa.cUnitAvail;
+  *ulBytesUnit=fsa.cbSector*fsa.cSectorUnit;
+
+  return(NO_ERROR);
+}
+
+/*!**************************************************/
+/*                                                  */
+/* @@DESC                                           */
+/*                                                  */
+/* This function returns the home directory of the  */
+/* current user.                                    */
+/*                                                  */
+/* @@RETURNS                                        */
+/*                                                  */
+/* ULONG rc                                         */
+/*                                                  */
+/* NO_ERROR is returned if the function succeeds.   */
+/*                                                  */
+/* @@PARAM                                          */
+/*                                                  */
+/* ULONG ulDriveNum input                           */
+/*                                                  */
+/* The number of the drive to be queried (1-26).    */
+/*                                                  */
+/* @@PARAM                                          */
+/*                                                  */
+/* char* chrBuffer in/out                           */
+/*                                                  */
+/* Pointer to a buffer where the volume name will   */
+/* be placed.                                       */
+/*                                                  */
+/* @@PARAM                                          */
+/*                                                  */
+/* ULONG ulSize input                               */
+/*                                                  */
+/* Size of the name buffer.                         */
+/*                                                  */
+/* @@REMARKS                                        */
+/*                                                  */
+/* The returned name is always terminated by zero.  */
+/*                                                  */
+/*!!*************************************************/
+
+ULONG SysQueryDiskName(ULONG ulDriveNum, char *chrBuffer, ULONG ulSize)
+{
+  FSINFO fsIBuf;
+  ULONG rc;
+
+  if(!chrBuffer || !ulSize)
+    return 1;
+
+  if( ulDriveNum<1 || ulDriveNum > 26)
+    return ERROR_INVALID_DRIVE;
+
+  if((rc=DosQueryFSInfo(ulDriveNum, FSIL_VOLSER, &fsIBuf, sizeof(FSINFO)))!=NO_ERROR)
+    return rc;
+  strncpy(chrBuffer, fsIBuf.vol.szVolLabel, ulSize);
+  chrBuffer[ulSize-1]=0;
+
+  return(NO_ERROR);
+}
+
+/*!**************************************************/
+/*                                                  */
+/* @@DESC                                           */
+/*                                                  */
+/* This function returns the home directory of the  */
+/* current user.                                    */
+/*                                                  */
+/* @@RETURNS                                        */
+/*                                                  */
+/* BOOL fSuccess                                    */
+/*                                                  */
+/* TRUE if the home dir is specified and does exist */
+/*                                                  */
+/* @@PARAM                                          */
+/*                                                  */
+/* char* chrBuf in/out                              */
+/*                                                  */
+/* Pointer to a buffer where the home directory     */
+/* name will be placed.                             */
+/*                                                  */
+/* @@PARAM                                          */
+/*                                                  */
+/* ULONG ulSize input                               */
+/*                                                  */
+/* Size of the name buffer.                         */
+/*                                                  */
+/* @@REMARKS                                        */
+/*                                                  */
+/* The returned string is always terminated by zero.*/
+/* .p:                                              */
+/* If a directory is specified in the HOME          */
+/* environment variable but doesn't exist FALSE is  */
+/* returned and a message is written to the apps    */
+/* exception log.                                   */
+/*                                                  */
+/*!!*************************************************/
+BOOL SysQueryHomeDir(char* chrBuf, ULONG ulSize)
+{
+  char *chrHome=getenv("HOME");
+
+  if(!chrHome || !chrBuf)
+    return FALSE;
+
+  if(strlcpy(chrBuf, chrHome, ulSize)>=ulSize) {
+    chrBuf[0]=0; 
+    return FALSE;
+  }
+  if(SysCheckFileExists(chrHome))
+    return TRUE;
+
+  /* HOME dir specified but does not exist */
+  SysWriteToTrapLog("%s, %s: the in config.sys specified HOME directory '%s' does not exist.\n",
+                    __DATE__, __TIME__, chrHome);
+  return FALSE;
+}
+
+char* my_strlcpy(char* string1, char* string2, size_t count)
+{
+
+  if((strlen(string2))<count)
+    strcpy(string1, string2);
+  else {
+    strncpy(string1, string2, count);
+    string1[count-1]=0;
+  }
+  return string1;
+}
+
+/********************************************************************/
+/*	$OpenBSD: strlcpy.c,v 1.8 2003/06/17 21:56:24 millert Exp $	*/
+
+/*
+ * Copyright (c) 1998 Todd C. Miller <Todd.Miller@courtesan.com>
+ *
+ * Permission to use, copy, modify, and distribute this software for any
+ * purpose with or without fee is hereby granted, provided that the above
+ * copyright notice and this permission notice appear in all copies.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
+ * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
+ * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+ * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
+ * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
+ * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+ */
+
+
+/*
+ * Copy src to string dst of size siz.  At most siz-1 characters
+ * will be copied.  Always NUL terminates (unless siz == 0).
+ * Returns strlen(src); if retval >= siz, truncation occurred.
+ */
+size_t
+strlcpy(char *dst, const char *src, size_t siz)
+{
+	register char *d = dst;
+	register const char *s = src;
+	register size_t n = siz;
+
+	/* Copy as many bytes as will fit */
+	if (n != 0 && --n != 0) {
+		do {
+			if ((*d++ = *s++) == 0)
+				break;
+		} while (--n != 0);
+	}
+
+	/* Not enough room in dst, add NUL and traverse rest of src */
+	if (n == 0) {
+		if (siz != 0)
+			*d = '\0';		/* NUL-terminate dst */
+		while (*s++)
+			;
+	}
+
+	return(s - src - 1);	/* count does not include NUL */
+}
+
+
+/*	$OpenBSD: strlcat.c,v 1.11 2003/06/17 21:56:24 millert Exp $	*/
+
+/*
+ * Copyright (c) 1998 Todd C. Miller <Todd.Miller@courtesan.com>
+ *
+ * Permission to use, copy, modify, and distribute this software for any
+ * purpose with or without fee is hereby granted, provided that the above
+ * copyright notice and this permission notice appear in all copies.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
+ * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
+ * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+ * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
+ * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
+ * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+ */
+
+/*
+ * Appends src to string dst of size siz (unlike strncat, siz is the
+ * full size of dst, not space left).  At most siz-1 characters
+ * will be copied.  Always NUL terminates (unless siz <= strlen(dst)).
+ * Returns strlen(src) + MIN(siz, strlen(initial dst)).
+ * If retval >= siz, truncation occurred.
+ */
+size_t
+strlcat(char *dst, const char *src, size_t siz)
+{
+	register char *d = dst;
+	register const char *s = src;
+	register size_t n = siz;
+	size_t dlen;
+
+	/* Find the end of dst and adjust bytes left but don't go past end */
+	while (n-- != 0 && *d != '\0')
+		d++;
+	dlen = d - dst;
+	n = siz - dlen;
+
+	if (n == 0)
+		return(dlen + strlen(s));
+	while (*s != '\0') {
+		if (n != 1) {
+			*d++ = *s;
+			n--;
+		}
+		s++;
+	}
+	*d = '\0';
+
+	return(dlen + (s - src));	/* count does not include NUL */
+}
+
+/********************************************************************/
+#if  __cplusplus
+}
+#endif
+
+
+
+
+
+
+
Index: /tags/CWMM-0.3.0_GA/common_functions/uptime.c
===================================================================
--- /tags/CWMM-0.3.0_GA/common_functions/uptime.c	(revision 213)
+++ /tags/CWMM-0.3.0_GA/common_functions/uptime.c	(revision 213)
@@ -0,0 +1,352 @@
+/* Program:   XUPTIME OS/2 1.1
+   Platform:  OS/2
+   Compilers: Borland C, EMX GNU C, IBM C-Set
+   Compile:   $(CC) uptime.c
+   Purpose:   Print the uptime of the machine based on the creation date
+              of the swap file. In contrast too tools querying the uptime
+              timer of OS/2, this can also cover uptimes > ~ 50 days.
+   Author:    Tobias Ernst, tobi@bland.fido.de
+   License:   Public Domain
+*/
+
+#define INCL_DOSFILEMGR
+#define INCL_DOSMISC
+#define INCL_DOSDATETIME
+#define INCL_DOSERRORS
+#include <os2.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+/* get_boot_drive: get the drive letter of this OS/2 system's boot drive */
+#include <sys_funcs.h>
+
+#define eatwhite(cp) { while (*(cp) == ' ' || *(cp) == '\n' || *(cp) == '\t') { (cp)++; } }
+
+/* get_swap_file: get the name of the swap file of this OS/2 system by
+                  parsing it's config.sys file.  */
+
+#define buffersize 256+50
+static BOOL get_swap_file(char *chrSwapFile, ULONG ulSize)
+{
+  char configsys[] = "X:\\CONFIG.SYS";
+  char buffer[buffersize], *cp;
+  FILE *f;
+  int i;
+  
+  configsys[0] = SysQueryBootDriveLetter();//get_boot_drive();
+  if ((f = fopen(configsys, "r")) == NULL)
+    return FALSE;
+    
+  while ( (cp = fgets(buffer, buffersize, f)) != NULL)
+    {
+      eatwhite(cp);
+      if (!strnicmp(cp, "SWAPPATH", 8))
+        {
+          cp += 8;
+          eatwhite(cp);
+          if (*cp == '=')
+            {
+              cp++;
+              eatwhite(cp);
+              for (i = 0;
+                   cp[i] != ' ' && cp[i] != '\t'
+                     && cp[i] != '\n' && cp[i] != '\0';
+                   i++);
+              strncpy(chrSwapFile, cp, i);
+              if (chrSwapFile[i - 1] != '\\')
+                {
+                  chrSwapFile[i++] = '\\';
+                }
+              strcpy(chrSwapFile + i, "SWAPPER.DAT");
+              fclose(f);
+              return (TRUE);
+            }
+        }
+
+      /* eat rest of line if it was > 256 chars */
+      while (*buffer && buffer[strlen(buffer) - 1] != '\n')
+        {
+          if (fgets(buffer, buffersize, f) == NULL)
+            {
+              break;
+            }
+        }
+    }
+  //  fprintf (stderr, "%s does not contain a SWAPPATH statement.\n", configsys);
+  fclose(f);
+  return 0;
+}
+
+
+/* is_leap_year: tests if the specified year (4 digit) is a leap year */
+
+static int is_leap_year(unsigned year)
+{
+  if (!((year % 100) % 4))
+    {
+      if (!(year % 100))
+        {
+          if (!(year % 400))
+            {
+              return 1;
+            }
+          else
+            {
+              return 0;
+            }
+        }
+      else
+        {
+          return 1;
+        }
+    }
+  else
+    {
+      return 0;
+    }
+}
+
+
+/* n_days_in_month: returns the number of days in a certain month */
+
+static int n_days_in_month(unsigned month, unsigned year)
+{
+  switch (month)
+    {
+    case 1:
+    case 3:
+    case 5:
+    case 7:
+    case 8:
+    case 10:
+    case 12:
+      return 31;
+    case 4:
+    case 6:
+    case 9:
+    case 11:
+      return 30;
+    case 2:
+      return (is_leap_year(year)) ? 29 : 28;
+    }
+  return 0;
+}
+
+
+
+/* n_days_since_1900: returns the number of days that have passed since
+                      1/1/1900 */
+
+unsigned long n_days_since_1900(int dd, int md, int yd)
+{
+  int d=1,m,y;
+  unsigned long ds=0;
+
+  for (y = 1900; y<yd; y++)
+  {
+      ds += is_leap_year(y) ? 366 : 365;
+  }
+  for (m=1; m<md; m++)
+  {
+      ds += n_days_in_month(m, y);
+  }
+  ds += dd - d;
+  return ds;
+}
+
+
+/* get_uptime: returns the age of the swap file in seconds */
+
+unsigned long get_uptime_from_swapfile(void)
+{
+  static char chrSwapFile[CCHMAXPATH]={0};
+  FILEFINDBUF3 InfoBuf;
+  HDIR hDir = 0x0001;
+  ULONG cSearch = 1;
+  ULONG usAttrib;
+  APIRET rc;
+  DATETIME DateTime;
+  unsigned long uptime;
+
+  if(chrSwapFile[0]==0)
+    get_swap_file(chrSwapFile, sizeof(chrSwapFile));
+
+   
+  rc = DosFindFirst((UCHAR *)chrSwapFile,
+                    &hDir,
+                    FILE_SYSTEM | FILE_HIDDEN | FILE_READONLY,
+                    &InfoBuf,
+                    sizeof InfoBuf,
+                    &cSearch,
+                    FIL_STANDARD);
+
+  if (rc != NO_ERROR)
+    {
+      fprintf(stderr, "DosFindFirst returned %ld\n", rc);
+      return(0);
+    }
+
+  DosFindClose(hDir);
+
+  rc = DosGetDateTime(&DateTime);
+
+  if (rc != 0)
+    {
+      fprintf(stderr, "DosGetDateTime returned %ld\n", rc);
+      return(0);
+    }
+
+  uptime  = n_days_since_1900(DateTime.day, DateTime.month, DateTime.year);
+  uptime -= n_days_since_1900(InfoBuf.fdateCreation.day,
+                              InfoBuf.fdateCreation.month,
+                              InfoBuf.fdateCreation.year + 1980);
+  uptime *= (60L * 60L * 24L);
+
+  uptime +=   (ULONG)DateTime.hours * 60L * 60L
+    + (ULONG)DateTime.minutes * 60L
+    + (ULONG)DateTime.seconds;
+  uptime -=    (ULONG)InfoBuf.ftimeCreation.hours * 60L * 60L
+    + (ULONG)InfoBuf.ftimeCreation.minutes * 60L
+    + (ULONG)InfoBuf.ftimeCreation.twosecs * 2L;
+
+#if 0
+  if (verbose)
+    {
+      printf ("OS/2 swap file used:    %s\n", swapfile);
+      printf ("Swapfile creation date: %02d/%02d/%04d, %02d:%02d\n",
+              InfoBuf.fdateCreation.month, InfoBuf.fdateCreation.day,
+              InfoBuf.fdateCreation.year + 1980,
+              InfoBuf.ftimeCreation.hours, InfoBuf.ftimeCreation.minutes);
+      printf ("Last modification:      %02d/%02d/%04d, %02d:%02d\n",
+              InfoBuf.fdateLastWrite.month, InfoBuf.fdateLastWrite.day,
+              InfoBuf.fdateLastWrite.year + 1980,
+              InfoBuf.ftimeLastWrite.hours, InfoBuf.ftimeLastWrite.minutes);
+      printf ("Last read access:       %02d/%02d/%04d, %02d:%02d\n",
+              InfoBuf.fdateLastAccess.month, InfoBuf.fdateLastAccess.day,
+              InfoBuf.fdateLastAccess.year + 1980,
+              InfoBuf.ftimeLastAccess.hours, InfoBuf.ftimeLastAccess.minutes);
+      printf ("Current date is:        %02d/%02d/%04d, %02d:%02d\n",
+              DateTime.month, DateTime.day, DateTime.year,
+              DateTime.hours, DateTime.minutes);
+      printf ("-------------------------------------------------\n");
+    }
+#endif
+
+  return uptime;
+}
+
+/* get_uptime_from_os2_timer: get the "uptime" from QSV_MS_COUNT */
+unsigned long get_uptime_from_os2_timer(void)
+{
+  ULONG ms_count;
+  ULONG DataBufLen = 4;
+
+  if (DosQuerySysInfo(QSV_MS_COUNT, QSV_MS_COUNT, (UCHAR *)(&ms_count), DataBufLen) != NO_ERROR)
+    return(0);
+
+  return ms_count / (ULONG)1000; /* Return seconds */
+}
+
+
+void print_help(void)
+{
+    printf ("         -2   Query uptime from OS/2 system timer. This does only work if the\n");
+    printf ("              uptime is < 50 days. If you do NOT specify this parameter, the\n");
+    printf ("              uptime is calculated from the creation date of the swap file,\n");
+    printf ("              which will also work for uptimes >= 50 days.\n");
+}
+
+/*!***********************************************************/
+/*                                                           */
+/* @@DESC                                                    */
+/*                                                           */
+/* To be written...                                          */
+/*                                                           */
+/*!!**********************************************************/
+ULONG SysGetUptimeSecs(BOOL fUseTimer)
+{
+  if(fUseTimer)
+    return get_uptime_from_os2_timer();
+  else
+    return get_uptime_from_swapfile();
+}
+
+/*!***********************************************************/
+/*                                                           */
+/* @@DESC                                                    */
+/*                                                           */
+/* To be written...                                          */
+/*                                                           */
+/*!!**********************************************************/
+char* SysGetUptimeString(BOOL fUseTimer, char * chrBuffer, ULONG ulSize)
+{
+  unsigned long uptime, days, hours, minutes, seconds;
+  char chrTemp[30];
+
+  if(!ulSize)
+    return NULLHANDLE;
+
+  uptime=SysGetUptimeSecs(fUseTimer);
+
+  days    = uptime / (60L * 60L * 24L);
+  uptime  = uptime % (60L * 60L * 24L);
+  hours   = uptime / (60L * 60L);
+  uptime  = uptime % (60L * 60L);
+  minutes = uptime / (60L);
+  seconds = uptime % (60L);
+
+  sprintf (chrTemp, "%lu %02lu:%02lu:%02lu",
+           days, hours,
+          minutes, seconds);
+  strncpy(chrBuffer, chrTemp, ulSize);
+  chrBuffer[ulSize-1]=0;
+  return chrBuffer;
+}
+
+int main__(int argc, char **argv)
+{
+  int i, verbose = 0, use_os2_timer = 0;
+  char *s;
+  unsigned long uptime, days, hours, minutes, seconds;
+    
+  for (i = 1; i < argc; i++)
+    {
+      if (argv[i][0] == '-' || argv[i][0] == '/')
+        {
+          switch(argv[i][1])
+            {
+            case 'h':
+            case '?':
+              print_help();
+              return(0);
+            case 'v':
+                verbose = 1;
+                break;
+            case '2':
+                use_os2_timer = 1;
+                break;
+            }
+        }
+    }
+
+  if (use_os2_timer)
+    uptime = get_uptime_from_os2_timer();
+  else
+    uptime = get_uptime_from_swapfile();
+  
+  days    = uptime / (60L * 60L * 24L);
+  uptime  = uptime % (60L * 60L * 24L);
+  hours   = uptime / (60L * 60L);
+  uptime  = uptime % (60L * 60L);
+  minutes = uptime / (60L);
+  seconds = uptime % (60L);
+  
+#if 0
+  printf ("%s: uptime is %ld day%s, %02ld:%02ld hours and %02ld second%s\n",
+          hostname, days, "s" + (days == 1), hours,
+          minutes, seconds, "s" + (seconds == 1));
+#endif
+
+  return days;
+}
+
Index: /tags/CWMM-0.3.0_GA/common_functions/window_funcs.c
===================================================================
--- /tags/CWMM-0.3.0_GA/common_functions/window_funcs.c	(revision 213)
+++ /tags/CWMM-0.3.0_GA/common_functions/window_funcs.c	(revision 213)
@@ -0,0 +1,37 @@
+#define INCL_WIN
+#include <os2.h>
+
+#include "window_funcs.h"
+
+#if  __cplusplus
+extern "C" {
+#endif
+
+/*!**************************************************/
+/*                                                  */
+/* @@DESC                                           */
+/*                                                  */
+/* This funktion changes the z-order of the window  */
+/* <hwnd> so it's on the top.                       */
+/*                                                  */
+/* @@PARAM                                          */
+/*                                                  */
+/* HWND hwnd                                        */
+/*                                                  */
+/* Handle of the window.                            */
+/*                                                  */
+/* @@RETURNS                                        */
+/*                                                  */
+/* BOOL rc                                          */
+/*                                                  */
+/* TRUE on success, FALSE otherwise.                */
+/*                                                  */
+/*!!*************************************************/
+BOOL WinSetWindowToTop(HWND hwnd)
+{
+  return WinSetWindowPos(HWND_TOP, hwnd, 0, 0, 0, 0, SWP_ZORDER);
+}
+
+#if  __cplusplus
+}
+#endif
Index: /tags/CWMM-0.3.0_GA/count_lines.CMD
===================================================================
--- /tags/CWMM-0.3.0_GA/count_lines.CMD	(revision 213)
+++ /tags/CWMM-0.3.0_GA/count_lines.CMD	(revision 213)
@@ -0,0 +1,229 @@
+/* */
+ call RxFuncAdd 'SysLoadFuncs', 'RexxUtil', 'SysLoadFuncs'
+ call SysLoadFuncs
+
+theDir=ARG(1)
+IF theDir="" THEN theDir=DIRECTORY()
+
+SAY "Base directory: "theDir
+SAY
+
+SAY "Counting CPP files..."
+rc=SysFileTree(theDir"\*.cpp", "files.", "FSO")
+numLines=0
+DO a= 1 to files.0
+	/* Count lines in file */
+	DO WHILE LINES(files.a)
+		numLines=numLines+1
+		dummy=LINEIN(files.a)
+	END
+	call STREAM files.a, "C","close"
+END
+IF files.0\=0 THEN DO
+	result._CPP=files.0
+	result._CPPLines=numLines
+END
+else DO
+	result._CPP=0
+	result._CPPLines=0
+END
+
+SAY "Counting C files..."
+rc=SysFileTree(theDir"\*.c", "files.", "FSO")
+numLines=0
+DO a= 1 to files.0
+	/* Count lines in file */
+	DO WHILE LINES(files.a)
+		numLines=numLines+1
+		dummy=LINEIN(files.a)
+	END
+	call STREAM files.a, "C","close"
+END
+IF files.0\=0 THEN DO
+	result._C=files.0
+	result._CLines=numLines
+END
+ELSE DO
+	result._C=0
+	result._CLines=0
+END
+
+SAY "Counting H files..."
+rc=SysFileTree(theDir"\*.H", "files.", "FSO")
+numLines=0
+DO a= 1 to files.0
+	/* Count lines in file */
+	DO WHILE LINES(files.a)
+		numLines=numLines+1
+		dummy=LINEIN(files.a)
+	END
+	call STREAM files.a, "C","close"
+END
+IF files.0\=0 THEN DO
+	result._H=files.0
+	result._HLines=numLines
+END
+ELSE DO
+	result._H=0
+	result._HLines=0
+END
+
+SAY "Counting HH files..."
+rc=SysFileTree(theDir"\*.HH", "files.", "FSO")
+numLines=0
+DO a= 1 to files.0
+	/* Count lines in file */
+	DO WHILE LINES(files.a)
+		numLines=numLines+1
+		dummy=LINEIN(files.a)
+	END
+	call STREAM files.a, "C","close"
+END
+IF files.0\=0 THEN DO
+	result._HH=files.0
+	result._HHLines=numLines
+END
+ELSE DO
+	result._HH=0
+	result._HHLines=0
+END
+
+SAY "Counting IDL files..."
+rc=SysFileTree(theDir"\*.IDL", "files.", "FSO")
+numLines=0
+DO a= 1 to files.0
+	/* Count lines in file */
+	DO WHILE LINES(files.a)
+		numLines=numLines+1
+		dummy=LINEIN(files.a)
+	END
+	call STREAM files.a, "C","close"
+END
+IF files.0\=0 THEN DO
+	result._IDL=files.0
+	result._IDLLines=numLines
+END
+ELSE DO
+	result._IDL=0
+	result._IDLLines=0
+END
+
+SAY "Counting CMD files..."
+rc=SysFileTree(theDir"\*.cmd", "files.", "FSO")
+numLines=0
+DO a= 1 to files.0
+	/* Count lines in file */
+	DO WHILE LINES(files.a)
+		numLines=numLines+1
+		dummy=LINEIN(files.a)
+	END
+	call STREAM files.a, "C","close"
+END
+IF files.0\=0 THEN DO
+	result._cmd=files.0
+	result._cmdLines=numLines
+END
+ELSE DO
+	result._cmd=0
+	result._cmdLines=0
+END
+
+SAY "Counting DLG files..."
+rc=SysFileTree(theDir"\*.dlg", "files.", "FSO")
+numLines=0
+DO a= 1 to files.0
+	/* Count lines in file */
+	DO WHILE LINES(files.a)
+		numLines=numLines+1
+		dummy=LINEIN(files.a)
+	END
+	call STREAM files.a, "C","close"
+END
+IF files.0\=0 THEN DO
+	result._dlg=files.0
+	result._dlgLines=numLines
+END
+ELSE DO
+	result._dlg=0
+	result._dlgLines=0
+END
+
+SAY "Counting RC files..."
+rc=SysFileTree(theDir"\*.rc", "files.", "FSO")
+numLines=0
+DO a= 1 to files.0
+	/* Count lines in file */
+	DO WHILE LINES(files.a)
+		numLines=numLines+1
+		dummy=LINEIN(files.a)
+	END
+	call STREAM files.a, "C","close"
+END
+IF files.0\=0 THEN DO
+	result._rc=files.0
+	result._rcLines=numLines
+END
+ELSE DO
+	result._rc=0
+	result._rcLines=0
+END
+
+SAY "Counting INC files..."
+rc=SysFileTree(theDir"\*.inc", "files.", "FSO")
+numLines=0
+DO a= 1 to files.0
+	/* Count lines in file */
+	DO WHILE LINES(files.a)
+		numLines=numLines+1
+		dummy=LINEIN(files.a)
+	END
+	call STREAM files.a, "C","close"
+END
+IF files.0\=0 THEN DO
+	result._inc=files.0
+	result._incLines=numLines
+END
+ELSE DO
+	result._inc=0
+	result._incLines=0
+END
+
+SAY "Counting IPF files..."
+rc=SysFileTree(theDir"\*.ipf", "files.", "FSO")
+numLines=0
+DO a= 1 to files.0
+	/* Count lines in file */
+	DO WHILE LINES(files.a)
+		numLines=numLines+1
+		dummy=LINEIN(files.a)
+	END
+	call STREAM files.a, "C","close"
+END
+IF files.0\=0 THEN DO
+	result._ipf=files.0
+	result._ipfLines=numLines
+END
+ELSE DO
+	result._ipf=0
+	result._ipfLines=0
+END
+
+SAY ""
+SAY result._Cpplines||" lines in "||result._cpp||" CPP files"
+SAY result._Clines||" lines in "||result._c||" C files"
+SAY result._hlines||" lines in "||result._h||" H files"
+SAY result._hhlines||" lines in "||result._hh||" HH files"
+SAY result._idllines||" lines in "||result._idl||" IDL files"
+SAY result._cmdlines||" lines in "||result._cmd||" CMD files"
+SAY result._dlglines||" lines in "||result._dlg||" DLG files"
+SAY result._rclines||" lines in "||result._rc||" RC files"
+SAY result._inclines||" lines in "||result._inc||" INC files"
+SAY result._ipflines||" lines in "||result._ipf||" IPF files"
+
+numLines=result._ipflines+result._inclines+result._rclines+result._dlglines+result._cmdlines+result._hhlines+result._idllines+result._hlines+result._clines+result._cpplines
+
+numFiles=result._ipf+result._inc+result._rc+result._dlg+result._cmd+result._hh+result._h+result._idl+result._c+result._cpp
+SAY 
+SAY numLines||" lines in "||numFiles||" files"
+
+'pause'
Index: /tags/CWMM-0.3.0_GA/create_TK_docs.CMD
===================================================================
--- /tags/CWMM-0.3.0_GA/create_TK_docs.CMD	(revision 213)
+++ /tags/CWMM-0.3.0_GA/create_TK_docs.CMD	(revision 213)
@@ -0,0 +1,716 @@
+/* Create documentation for functions */
+ call RxFuncAdd 'SysLoadFuncs', 'RexxUtil', 'SysLoadFuncs'
+ call SysLoadFuncs
+
+/* Set this to '1' to get debug messages */
+DEBUG=0
+
+docInfo.=''
+
+theDir=ARG(1)
+
+IF theDir="" THEN theDir=STRIP(DIRECTORY())
+
+/* Where to place the generated IPF source */
+docdir="r:\temp"
+ipf=docdir||'\CWTKDoc.ipf'            /* The IPF file        */
+
+SAY "Base directory: "theDir
+SAY
+
+/*** Read all the C files and parse them ***/
+SAY "Checking C files..."
+rc=SysFileTree(theDir"\*.c", "files.", "FSO")
+
+IF DEBUG=1 THEN DO
+	SAY "Found the following C files:"
+	DO a= 1 to files.0
+		SAY " "||a||" "||files.a
+	END
+	SAY ""
+END
+
+numLines=0
+index=0 /* This index holds the number of found descriptions */
+DO a = 1 to files.0
+	/* The stem contents holds the lines of the C source file */
+	drop contents
+	contents.=''
+	numLines=0
+	/* Count and read in lines of file */
+	DO WHILE LINES(files.a)
+		numLines=numLines+1
+		contents.numlines=LINEIN(files.a)
+ 	END
+	contents.0=numLines
+	call STREAM files.a, "C","close"
+
+	/* Now parse each source file */
+	exposeList='files. theLine numLines index docinfo. contents.'
+	call parseFile a
+END
+
+
+IF files.0\=0 THEN DO
+	result._C=files.0
+	result._CLines=numLines
+END
+ELSE DO
+	result._C=0
+	result._CLines=0
+END
+
+
+SAY ""
+SAY result._Clines||" lines in "||result._c||" C files"
+
+IF DEBUG=1 THEN DO
+	/* Show the information we got */
+	DO a= 1 to index
+		SAY ''
+		SAY a||': '
+		SAY 'Function: 'docinfo.a.function
+		SAY 'Line: 'docinfo.a.line
+		SAY'Desc: 'docinfo.a.desc
+		SAY 'File: 'docinfo.a.file
+	END
+END
+
+/*create docs */
+res=200                             /* The initial res id */
+leftWidth="30%"
+syntaxres=1                      /* Res id for syntax table. To be added to base. E.G. 201 */
+remarksres=2
+returnsres=3
+exampleres=4
+overrideres=5
+usageres=6
+paramsres=10
+
+'@type NUL > 'ipf
+
+/* Write IPF header */
+call writeIpfHeader ipf
+
+/* Sort the function names in the array a. */
+a.=''
+DO b= 1 to index
+	a.b=STRIP(WORD(docinfo.b.function,2))
+END
+a.0=index
+call qqsort 1, index
+
+IF DEBUG=1 THEN DO
+	/* Show the sorted functions */
+	SAY 'Sorted functionarray:'
+	DO b= 1 to index
+		SAY b||': 'a.b
+	END
+END
+
+/* Build a stem with the right order of indexes so in the document the functions are ordered */
+indStem.=''
+DO b=1 to index
+	DO c=1 to index
+		if STRIP(WORD(docinfo.c.function,2))=a.b THEN DO
+		indStem.b=c
+		LEAVE
+		END
+	END
+END
+
+/* Write function reference */
+call writeIpfFunctionRef ipf
+
+/* Footer */
+call writeIpfFooter ipf
+
+call STREAM ipf, "C","close"
+
+/* Compile the document */
+'@ipfc -i 'ipf
+
+exit
+
+/**************** Procedures *********************************/
+
+writeIpfFunctionRef:
+
+	IF DEBUG=1 THEN SAY "DEBUG: Writing function reference..."
+	res=res+100
+	call lineout ipf, ":h1 res="||res||".Function reference"
+	call lineout ipf, ""
+
+	/* Write the function descriptions. The syntax pane is always written. The others only if
+	    sufficient information is available. */
+	DO b=1 to index
+		a=indStem.b
+		res=res+100
+		call writeIpfFunction                 /* Write header for this function desc panel */
+		call writeIpfFuncLinks               /* Add links to left pane (Syntax, remarks...) */
+		call writeIpfFuncSyntax             /* Write Syntax pane */
+		call writeIpfFuncReturns            /* Write return pane (lower right) */
+		call writeIpfFuncRemarks          /* Write remarks pane */
+		call writeIpfFuncParams            /* Write a pane for every known parameter */
+		call writeIpfFuncOverride           /* Write a panel for the override information */
+		call writeIpfFuncUsage              /* Write a panel for the Usage information */
+	END
+return
+
+/*********************/
+writeIpfFunction:
+		/* Write the header of the function panel */
+		call lineout ipf, ".*************** "||getFunctionName(docinfo.a.function)||"() *****************"
+		call lineout ipf, ":h2 res="||res
+		call lineout ipf, "width="leftWidth
+		call lineout ipf, "."||getFunctionName2(docinfo.a.function, docinfo.a.isSom)          /* Function name */
+		call lineout ipf, ":link reftype=hd res="res+syntaxres               /* Syntax will be opened initialy */
+		call lineout ipf, "auto dependent group=2."
+		call lineout ipf, ":p."
+return
+
+/*******************************************/
+/* Write the links in the left panel for   */
+/* this function.                                  */
+/*******************************************/
+writeIpfFuncLinks:
+		/* Syntax link is always written */
+		call lineout ipf, ":link reftype=hd res="||res+syntaxres||" dependent.Syntax:elink."
+		call lineout ipf, ".br"
+		if docinfo.a.numparams ><0 THEN DO
+			call lineout ipf, ":link reftype=hd res="||res+paramsres||" dependent.Parameters:elink."
+			call lineout ipf, ".br"
+		END
+		IF docinfo.a.returns >< "" THEN DO
+			call lineout ipf, ":link reftype=hd res="||res+returnsres||" dependent.Returns:elink."
+			call lineout ipf, ".br"
+		END 
+		IF docinfo.a.remarks >< "" THEN DO
+			call lineout ipf, ":link reftype=hd res="||res+remarksres||" dependent.Remarks:elink."
+			call lineout ipf, ".br"
+		END
+		IF docinfo.a.override><"" THEN DO
+			call lineout ipf, ":link reftype=hd res="||res+overrideres||" dependent.How to override:elink."
+			call lineout ipf, ".br"
+		END
+		IF docinfo.a.usage><"" THEN DO
+			call lineout ipf, ":link reftype=hd res="||res+usageres||" dependent.Usage:elink."
+			call lineout ipf, ".br"
+		END
+		IF docinfo.index.example >< "" THEN DO
+			call lineout ipf, ":link reftype=hd res="||res+exampleres||" dependent.Example:elink."
+			call lineout ipf, ".br"
+		END
+return
+
+/*********************************/
+/* Write the panel for the return value */
+/*********************************/
+writeIpfFuncReturns:
+	if docinfo.a.returns="" THEN return
+
+	call lineout ipf, ":h2 res="||res+returnsres
+	call lineout ipf, "x=30%"
+	call lineout ipf, "width=70% height=35%"
+	call lineout ipf, "group=3"
+	call lineout ipf, "hide"
+	call lineout ipf, "."||getFunctionName2(docinfo.a.function, docinfo.a.isSom)||" Return value - "||WORD(docinfo.a.returns, 2)
+	call lineout ipf, ":p."
+	call lineout ipf, ":hp2."||WORD(docinfo.a.returns, 2)||":ehp2. ("||WORD(docinfo.a.returns, 1)||") - returns"
+	call lineout ipf, ":p."
+	call lineout ipf, wrapString(SUBWORD(docinfo.a.returns, 3))
+return
+
+/*****************/
+writeIpfFuncOverride:
+	if docinfo.a.override="" THEN return
+
+	call lineout ipf, ":h2 res="||res+overrideres
+	call lineout ipf, "x=30%"
+	call lineout ipf, "width=70%"
+	call lineout ipf, "group=2"
+	call lineout ipf, "hide"
+	call lineout ipf, "."||getFunctionName2(docinfo.a.function, docinfo.a.isSom)||" - How to override"
+	call lineout ipf, ":p."
+	call lineout ipf, wrapString(docinfo.a.override)
+
+return
+
+/*****************/
+writeIpfFuncUsage:
+	if docinfo.a.usage="" THEN return
+
+	call lineout ipf, ":h2 res="||res+usageres
+	call lineout ipf, "x=30%"
+	call lineout ipf, "width=70%"
+	call lineout ipf, "group=2"
+	call lineout ipf, "hide"
+	call lineout ipf, "."||getFunctionName2(docinfo.a.function, docinfo.a.isSom)||" - Usage"
+	call lineout ipf, ":p."
+	call lineout ipf, wrapString(docinfo.a.usage)
+
+return
+
+/*****************/
+writeIpfFuncParams:
+	if docinfo.a.numparams=0 THEN return   /* No params given */
+
+	/* Write big parameter panel */
+	call lineout ipf, ":h2 res="||res+paramsres
+	call lineout ipf, "x=30%"
+	call lineout ipf, "width=70%"
+	call lineout ipf, "group=2"
+	call lineout ipf, "hide"
+	call lineout ipf, "."||getFunctionName2(docinfo.a.function, docinfo.a.isSom)||" - Parameters"
+	call lineout ipf, ":p."
+	DO parms = 1 to docinfo.a.numparams
+		pindex='param'||parms
+		call lineout ipf, ":hp2."||WORD(docinfo.a.pindex, 2)||":ehp2. ("||WORD(docinfo.a.pindex, 1)||") - "||WORD(docinfo.a.pindex, 3)
+		call lineout ipf, ":p."
+		call lineout ipf, ":lm margin=5."
+		call lineout ipf, wrapString(SUBWORD(docinfo.a.pindex, 4))
+		call lineout ipf, ":lm margin=1."
+		call lineout ipf, ":p."
+	END
+	call lineout ipf, ""          /* Space to make source readable */
+
+	/* Write small panel (lower right) for every parameter */
+	DO parms = 1 to docinfo.a.numparams
+		pindex='param'||parms
+		call lineout ipf, ":h2 res="||res+paramsres+parms
+		call lineout ipf, "x=30%"
+		call lineout ipf, "width=70% height=35%"
+		call lineout ipf, "group=3"
+		call lineout ipf, "hide"
+		call lineout ipf, "."||getFunctionName2(docinfo.a.function, docinfo.a.isSom)||" Parameter - "||WORD(docinfo.a.pindex, 2)
+		call lineout ipf, ":p."
+		call lineout ipf, ":hp2."||WORD(docinfo.a.pindex, 2)||":ehp2. ("||WORD(docinfo.a.pindex, 1)||") - "||WORD(docinfo.a.pindex, 3)
+		call lineout ipf, ":p."
+		call lineout ipf, wrapString(SUBWORD(docinfo.a.pindex, 4))
+	END
+return
+
+/*****************************/
+/* Write the Remarks panel          */
+/*****************************/
+writeIpfFuncRemarks:
+	if docinfo.a.remarks="" THEN return
+
+	call lineout ipf, ":h2 res="||res+remarksres
+	call lineout ipf, "x=30%"
+	call lineout ipf, "width=70%"
+	call lineout ipf, "group=2"
+	call lineout ipf, "hide"
+	call lineout ipf, "."||getFunctionName2(docinfo.a.function, docinfo.a.isSom)||" - Remarks"
+	call lineout ipf, ":p."
+	call lineout ipf, wrapString(docinfo.a.remarks)
+
+return
+
+/*****************/
+writeIpfFuncSyntax:
+		/* docinfo.a.function contains the full function header: e.g. 'BOOL theFunc(char theChar)' */
+		call lineout ipf, ""
+		call lineout ipf, ":h2 res="||res+syntaxres
+		call lineout ipf, "x=30%"
+		call lineout ipf, "width=70%"
+		call lineout ipf, "group=2"
+		call lineout ipf, "hide"
+		call lineout ipf, "."||getFunctionName2(docinfo.a.function, docinfo.a.isSom)||" - Syntax"
+		call lineout ipf, ":p."
+		call lineout ipf, wrapString(docinfo.a.desc)
+		call lineout ipf, ":nt."
+		call lineout ipf, "This function can be found in the source file :hp2."||FILESPEC("name", docinfo.a.file) ||":ehp2.."
+		call lineout ipf, ":ent."
+		call lineout ipf, ":xmp."
+		call lineout ipf, ""
+		call lineout ipf, ":parml compact tsize=25 break=none."
+	/* Check if parameters are given. If yes print them and provide a link in the syntax panel */
+		allParams=''
+		IF docinfo.a.numparams >< 0 THEN DO
+		DO parms = 1 to docinfo.a.numparams
+			pindex='param'||parms
+			allParams=allParams||":pt."||WORD(docinfo.a.pindex, 1)||":pd.:link reftype=hd res="||res+paramsres+parms||" dependent."WORD(docinfo.a.pindex, 2 )":elink.;"
+		END
+		END
+	/* Check if return info is given. If yes provide a link on syntax panel */
+		IF docinfo.a.returns >< "" THEN DO
+			allParams=allParams||":pt."||WORD(docinfo.a.returns, 1)||":pd.:link reftype=hd res="||res+returnsres||" dependent."WORD(docinfo.a.returns, 2 )":elink.;"
+			theString=WORD(docinfo.a.returns,2)||" = "||removeTypesFromFunc(SUBWORD(docinfo.a.function,2))||';'
+		END /* docinfo.a.returns */
+		ELSE
+			theString=removeTypesFromFunc(SUBWORD(docinfo.a.function,2))||';'
+		call lineout ipf, allParams
+		call lineout ipf, ":eparml."
+		thePos=1
+		tabPos=1
+	/* Split function in lines */
+		DO WHILE thePos >< 0
+			theString=STRIP(SUBSTR(theString, thePos))
+			thePos=POS(',' , theString)
+			if thePos >< 0 THEN DO
+				if tabPos=1 then DO
+					call lineout ipf, LEFT(theString, thePos)
+					tabPos=POS('(' , theString)
+				END
+				ELSE
+					call lineout ipf, COPIES(' ',tabPos)||LEFT(theString, thePos)
+				thePos=thePos+1
+			END
+			ELSE
+				call lineout ipf, COPIES(' ',tabPos)||theString
+		END
+		call lineout ipf, ":exmp."
+		call lineout ipf, ""
+return
+
+/***************************/
+writeIpfHeader: procedure expose res
+ipf=ARG(1)
+	IF DEBUG=1 THEN
+		 SAY "DEBUG: Writing IPF header..."
+	call lineout ipf, ":userdoc."
+	call lineout ipf, ""
+	call lineout ipf, ":docprof."
+	call lineout ipf, ""
+	call lineout ipf, ":title.Function reference"
+	call lineout ipf, ""
+	call lineout ipf, ":h1 res=100.Introduction"
+	call lineout ipf, ":p."
+	call lineout ipf, "Created "DATE()
+	call lineout ipf, ":p."
+	call lineout ipf, "To be written..."
+return
+
+/**************************/
+writeIpfFooter:
+	IF DEBUG=1 THEN
+		SAY "DEBUG: Writing IPF footer..."
+	/* Footer */
+	call lineout ARG(1), ":euserdoc."
+return
+
+
+/*************************************/
+/* This proc removes the types from  */
+/* the function definition but keeps */
+/* the var names.                    */
+/*************************************/
+removeTypesFromFunc: procedure
+	theString=SPACE(ARG(1))
+	/* Make sure there's always a space after '(' and ',' */
+	thePos=POS('(', theString)
+	theString=INSERT(' ', theString, thePos)
+	thePos2=POS(' ' , theString, thePos+3)
+	/* Remove '*' in front of somSelf if any (have to check if this is a hack...) */
+	IF thePos2 >< 0 THEN DO
+		tmpString=STRIP(subStr(theString, thePos2))
+		IF LEFT(tmpString, 1)='*' THEN
+			tmpString=RIGHT(tmpString, LENGTH(tmpString)-1)
+		theString=LEFT(theString, thePos)||STRIP(tmpString)
+	END
+	thePos=POS(',' , theString)
+	DO while thePos >< 0
+		theString=INSERT(' ', theString, thePos)
+		thePos2=POS(' ' , theString, thePos+3)
+/* 12.08.05 be sure a single '*' is removed from any type or var.
+   MAy not work with '**' */
+IF SUBSTR(theString, thePos2+1,1)='*' THEN DO
+	thePos2=thePos2+2
+END
+		theString=LEFT(theString, thePos)||STRIP(subStr(theString, thePos2))
+		thePos=POS(',', theString, thePos+1)
+	END
+return theString
+
+
+/*******************************/
+/* Strip the parameter list from the   */
+/* function and return only the name */
+/*                                                 */
+/* During file parsing the whole        */
+/* function declaration was read in   */
+/*******************************/
+getFunctionName: procedure
+	func=ARG(1)
+	thePos=POS('(', func)
+	func=LEFT(func,thePos-1)
+	
+return WORD(func,WORDS(func))
+
+/*******************************/
+/* Strip the parameter list from the   */
+/* function and return only the name */
+/*                                                 */
+/* During file parsing the whole        */
+/* function declaration was read in   */
+/*******************************/
+getFunctionName2: procedure
+	func=ARG(1)
+	thePos=POS('(', func)
+	func=LEFT(func,thePos-1)
+	func=WORD(func,WORDS(func))
+	IF ARG(2)="YES" THEN	
+		return RIGHT(func, LENGTH(func)-1)
+	ELSE
+		return func
+
+/***************************************************************/
+
+/*******************************/
+/* Parse the contents of the source  */
+/* file. This means finding comments  */
+/* containing function descriptions.    */
+/*******************************/
+parseFile: procedure expose (exposelist)
+
+a=ARG(1)
+	curline=0
+	DO while curline <= contents.0
+		curline=curline+1
+		tempLine=STRIP(contents.curline)
+		if LENGTH(templine)<5 then iterate
+
+		if LEFT(tempLine, 4)="/*!*" then do
+			/* Comment with function description found. Now parse it. */
+			call parseComment a
+		END
+	END
+return
+
+/*******************************/
+/* Parse the whole comment block   */
+/* with information                         */
+/*******************************/
+parseComment: 
+	index=index+1
+	docinfo.index.file=STRIP(files.a)
+	docinfo.index.remarks=""
+	docinfo.index.returns=""
+	docinfo.index.example=""
+	docinfo.index.numparams=0
+	docinfo.index.override=""
+	docinfo.index.usage=""
+	DO WHILE curline<=contents.0
+		curline=curline+1
+		theLine=STRIP(contents.curline)
+		IF POS("@@",theLine) ><0 THEN call parseEntry   /* Found a parameter */
+
+		IF LEFT(STRIP(theLine), 5)="/*!!*" THEN DO
+			/* End of comment. Get function name. */
+			docinfo.index.line=curline+1                    /* Line of function */
+			docinfo.index.function=getCompleteFunction()
+			return
+		END
+ 	END
+return
+
+/********************************/
+/* Read lines until a '{' is found.          */
+/* This means reading in a function    */
+/* declaration.                                 */
+/*                                                   */
+/*                                                   */
+/*                                                   */
+/********************************/
+
+getCompleteFunction:
+	theLine= ""		
+	DO WHILE curline<=contents.0
+		curLine=curLine+1
+		theLine=theLine||STRIP(contents.curline)
+		IF POS("{",theLine) ><0 THEN LEAVE
+ 	END
+	theLine=STRIP(TRANSLATE(theLine,' ','{'))
+	/* Ok, at this point we have the whole function declaration including the parameters */
+	/* Check if we have a SOM function */
+	IF POS("SOMLINK", theLine) >< 0 THEN DO
+		/* Mark as a SOM function */
+		docinfo.index.isSom="YES"
+		/* Strip SOMLINK and SOM_Scope and the prefix */
+		thePos=POS('_', SUBWORD(theLine, 4))
+		theLine=WORD(theLine, 2)||" "||substr(SUBWORD(theLine,4), thePos)
+		
+	END
+return theLine
+
+/*******************************/
+/* Parse entries starting with @@ in  */
+/* comment block.                          */
+/*******************************/
+parseEntry:
+	entry=stripCommentChars(theLine)
+	SELECT
+	WHEN entry="@@DESC" THEN DO
+		/* Description */
+		docinfo.index.desc=readEntryContents()
+	END
+	WHEN entry="@@REMARKS" THEN DO
+		/* Remarks */
+		docinfo.index.remarks=readEntryContents()
+	END
+	WHEN entry="@@RETURNS" THEN DO
+		/* Return value */
+		docinfo.index.returns=readEntryContents()
+	END
+	WHEN entry="@@EXAMPLE" THEN DO
+		/* Example */
+		docinfo.index.example=readEntryContents()
+	END
+	WHEN entry="@@OVERRIDE" THEN DO
+		/* Override of a SOM method */
+		docinfo.index.override=readEntryContents()
+	END
+	WHEN entry="@@USAGE" THEN DO
+		/* Usage of a SOM method */
+		docinfo.index.usage=readEntryContents()
+	END
+	WHEN LEFT(entry, 7)="@@PARAM" THEN DO
+		docinfo.index.numparams=docinfo.index.numparams+1
+		parm='param'||docinfo.index.numparams
+		docinfo.index.parm=readEntryContents()
+	END
+	WHEN entry="@@MODULE" THEN DO
+		/* Module specification */
+		docinfo.index.module=readEntryContents()
+	END
+	OTHERWISE
+		NOP
+	END
+return ""
+
+/************************************/
+/* Read the text associated with a known */
+/* entry.                                               */
+/* Reading takes place until another entry */
+/* is found or the comment ends.              */
+/************************************/
+readEntryContents:
+	theEntry=""
+	DO WHILE curline<=contents.0
+		curLine=curLine+1
+		theLine=STRIP(contents.curline)
+		IF POS("@@",theLine) ><0 THEN DO
+			curline=curline-1
+			return theEntry
+		END
+		IF LEFT(STRIP(theLine), 5)="/*!!*" THEN return theEntry
+					/* SAY '!!'||stripCommentChars(theLine)||'!!' */
+
+		if TRANSLATE(stripCommentChars(theLine))=":P." THEN DO
+			theEntry=theEntry||stripCommentChars(theLine)
+		END
+		ELSE DO
+			IF LENGTH(theEntry)>3 THEN DO
+				IF TRANSLATE(RIGHT(theEntry,3))=":P." THEN
+					theEntry=theEntry||stripCommentChars(theLine)
+				ELSE
+					theEntry=theEntry||' '||stripCommentChars(theLine)
+			END
+			ELSE DO
+				theEntry=theEntry||' '||stripCommentChars(theLine)
+			END
+
+		END
+		theEntry=STRIP(theEntry)
+/*SAY '%%'||theEntry||'%%'*/
+ 	END
+return theEntry
+
+/********************************/
+/* Remove starting and ending           */
+/* comment chars from arg.               */
+/********************************/
+stripCommentChars:
+	theString=STRIP(SUBSTR(ARG(1),3))
+return STRIP(LEFT(theString, LENGTH(theString)-2))
+
+
+/********************************/
+/* Wrap a string over several lines by  */
+/* inserting '0d'x'0a'x.                        */
+/********************************/
+wrapString:
+
+inString=ARG(1)
+numLines=TRUNC(LENGTH(inString)/80)
+DO widx = 1 to numlines
+	thePos=POS(' ',inString ,widx*80)
+	if thePos=0 THEN return inString
+	inString=INSERT('0d'x'0a'x, inString, thePos)
+END
+return inString 
+
+ 
+    
+
+
+
+  
+ /* ------------------------------------------------------------------ */
+/*  Author: Ruediger Wilke */
+ /* function: quick sort routine                                       */
+ /*                                                                    */
+ /* call:     QuickSort first_element, last_element                    */
+ /*                                                                    */
+ /* returns:  nothing                                                  */
+ /*                                                                    */
+ /* notes:    You must save the elements to sort in the stem "a."      */
+ /*           a.0 must contain the number of elements in the stem.     */
+ /*                                                                    */
+ /*                                                                    */
+ qqsort: procedure expose a.
+ 
+   arg lf, re
+ 
+   if re -lf < 9 then
+     do lf = lf to re -1
+ 
+       m = lf
+ 
+       do j = lf +1 to re
+         if TRANSLATE(a.j) << TRANSLATE(a.m) then                                   /* v2.80 */
+           m = j
+       end /* j = lf +1 to re */
+ 
+       t = a.m; a.m = a.lf; a.lf = t
+ 
+     end /* lf = lf to re -1 */
+     else
+     do
+       i = lf
+       j = re
+       k = (lf + re)%2
+       t = TRANSLATE(a.k)
+ 
+       do until i > j
+ 
+         do while TRANSLATE(a.i) << t                         /* v2.80 + CW */
+           i = i + 1
+         end /* while a.i << t */
+ 
+         do while TRANSLATE(a.j) >> t                         /* v2.80 + CW */
+           j = j - 1
+         end /* while a.j >> t */
+ 
+         if i <= j then
+         do
+           xchg = a.i
+           a.i = a.j
+           a.j = xchg
+           i = i + 1
+           j = j - 1
+         end /* if i <= j then */
+ 
+       end /* until i > j */
+ 
+       call qqsort lf, j
+       call qqsort i, re
+     end /* else */
+ 
+ return
+ 
+ 
+   
+
+
Index: /tags/CWMM-0.3.0_GA/create_docs.CMD
===================================================================
--- /tags/CWMM-0.3.0_GA/create_docs.CMD	(revision 213)
+++ /tags/CWMM-0.3.0_GA/create_docs.CMD	(revision 213)
@@ -0,0 +1,672 @@
+/* Create documentation for functions */
+ call RxFuncAdd 'SysLoadFuncs', 'RexxUtil', 'SysLoadFuncs'
+ call SysLoadFuncs
+
+docInfo.=''
+
+theDir=ARG(1)
+
+IF theDir="" THEN theDir=STRIP(DIRECTORY())
+
+docdir="r:\temp"
+
+SAY "Base directory: "theDir
+SAY
+
+
+SAY "Checking C files..."
+rc=SysFileTree(theDir"\*.c", "files.", "FSO")
+
+numLines=0
+index=0 /* This index holds the number of found descriptions */
+DO a= 1 to files.0
+	drop contents
+	contents.=''
+	/* Count and read in lines of file */
+	DO WHILE LINES(files.a)
+		numLines=numLines+1
+		contents.numlines=LINEIN(files.a)
+ 	END
+	contents.0=numLines
+	call STREAM files.a, "C","close"
+
+	/* Now parse each source file */
+	exposeList='files. theLine numLines index docinfo. contents.'
+	call parseFile a
+END
+
+
+IF files.0\=0 THEN DO
+	result._C=files.0
+	result._CLines=numLines
+END
+ELSE DO
+	result._C=0
+	result._CLines=0
+END
+
+
+
+SAY ""
+SAY result._Clines||" lines in "||result._c||" C files"
+
+/*
+DO a= 1 to index
+	SAY ''
+	SAY a||': '
+	SAY 'Function: 'docinfo.a.function
+	SAY 'Line: 'docinfo.a.line
+	SAY'Desc: 'docinfo.a.desc
+	SAY ''
+	SAY 'File: 'docinfo.a.file
+END
+*/
+
+/*create docs */
+ipf=docdir||'\doc.ipf'            /* The IPF file        */
+res=200                             /* The initial res id */
+leftWidth="30%"
+syntaxres=1                      /* Res id for syntax table. To be added to base. E.G. 201 */
+remarksres=2
+returnsres=3
+exampleres=4
+overrideres=5
+usageres=6
+paramsres=10
+
+'type NUL > 'ipf
+
+/* Write IPF header */
+call writeIpfHeader ipf
+
+/* Sort the function names in the array a. */
+a.=''
+DO b= 1 to index
+	a.b=STRIP(WORD(docinfo.b.function,2))
+END
+a.0=index
+call qqsort 1, index
+
+/* Build a stem with the right order of indexes so in the document the functions are ordered */
+indStem.=''
+DO b=1 to index
+	DO c=1 to index
+		if STRIP(WORD(docinfo.c.function,2))=a.b THEN DO
+		indStem.b=c
+		LEAVE
+		END
+	END
+END
+
+/* Write function reference */
+call writeIpfFunctionRef ipf
+
+/* Footer */
+call writeIpfFooter ipf
+
+call STREAM ipf, "C","close"
+
+/* Compile the document */
+'ipfc -i 'ipf
+
+exit
+
+/**************** Procedures *********************************/
+
+writeIpfFunctionRef:
+
+	res=res+100
+	call lineout ipf, ":h1 res="||res||".Function reference"
+	call lineout ipf, ""
+
+	/* Write the function descriptions. The syntax pane is always written. The others only if
+	    sufficient information is available. */
+	DO b=1 to index
+		a=indStem.b
+		res=res+100
+		call writeIpfFunction                 /* Write header for this function desc panel */
+		call writeIpfFuncLinks               /* Add links to left pane (Syntax, remarks...) */
+		call writeIpfFuncSyntax             /* Write Syntax pane */
+		call writeIpfFuncReturns            /* Write return pane (lower right) */
+		call writeIpfFuncRemarks          /* Write remarks pane */
+		call writeIpfFuncParams            /* Write a pane for every known parameter */
+		call writeIpfFuncOverride           /* Write a panel for the override information */
+		call writeIpfFuncUsage              /* Write a panel for the Usage information */
+	END
+return
+
+/*********************/
+writeIpfFunction:
+		/* Write the header of the function panel */
+		call lineout ipf, ".*************** "||getFunctionName(docinfo.a.function)||"() *****************"
+		call lineout ipf, ":h2 res="||res
+		call lineout ipf, "width="leftWidth
+		call lineout ipf, "."||getFunctionName2(docinfo.a.function, docinfo.a.isSom)          /* Function name */
+		call lineout ipf, ":link reftype=hd res="res+syntaxres               /* Syntax will be opened initialy */
+		call lineout ipf, "auto dependent group=2."
+		call lineout ipf, ":p."
+return
+
+/*********************************/
+/* Write the links in the left panel for   */
+/* this function.                                  */
+/*********************************/
+writeIpfFuncLinks:
+		call lineout ipf, ":link reftype=hd res="||res+syntaxres||" dependent.Syntax:elink."
+		call lineout ipf, ".br"
+		if docinfo.a.numparams ><0 THEN DO
+			call lineout ipf, ":link reftype=hd res="||res+paramsres||" dependent.Parameters:elink."
+			call lineout ipf, ".br"
+		END
+		IF docinfo.a.returns >< "" THEN DO
+			call lineout ipf, ":link reftype=hd res="||res+returnsres||" dependent.Returns:elink."
+			call lineout ipf, ".br"
+		END 
+		IF docinfo.a.remarks >< "" THEN DO
+			call lineout ipf, ":link reftype=hd res="||res+remarksres||" dependent.Remarks:elink."
+			call lineout ipf, ".br"
+		END
+		IF docinfo.a.override><"" THEN DO
+			call lineout ipf, ":link reftype=hd res="||res+overrideres||" dependent.How to override:elink."
+			call lineout ipf, ".br"
+		END
+		IF docinfo.a.usage><"" THEN DO
+			call lineout ipf, ":link reftype=hd res="||res+usageres||" dependent.Usage:elink."
+			call lineout ipf, ".br"
+		END
+		IF docinfo.index.example >< "" THEN DO
+			call lineout ipf, ":link reftype=hd res="||res+exampleres||" dependent.Example:elink."
+			call lineout ipf, ".br"
+		END
+return
+
+/*********************************/
+/* Write the panel for the return value */
+/*********************************/
+writeIpfFuncReturns:
+	if docinfo.a.returns="" THEN return
+
+	call lineout ipf, ":h2 res="||res+returnsres
+	call lineout ipf, "x=30%"
+	call lineout ipf, "width=70% height=35%"
+	call lineout ipf, "group=3"
+	call lineout ipf, "hide"
+	call lineout ipf, "."||getFunctionName2(docinfo.a.function, docinfo.a.isSom)||" Return value - "||WORD(docinfo.a.returns, 2)
+	call lineout ipf, ":p."
+	call lineout ipf, ":hp2."||WORD(docinfo.a.returns, 2)||":ehp2. ("||WORD(docinfo.a.returns, 1)||") - returns"
+	call lineout ipf, ":p."
+	call lineout ipf, wrapString(SUBWORD(docinfo.a.returns, 3))
+return
+
+/*****************/
+writeIpfFuncOverride:
+	if docinfo.a.override="" THEN return
+
+	call lineout ipf, ":h2 res="||res+overrideres
+	call lineout ipf, "x=30%"
+	call lineout ipf, "width=70%"
+	call lineout ipf, "group=2"
+	call lineout ipf, "hide"
+	call lineout ipf, "."||getFunctionName2(docinfo.a.function, docinfo.a.isSom)||" - How to override"
+	call lineout ipf, ":p."
+	call lineout ipf, wrapString(docinfo.a.override)
+
+return
+
+/*****************/
+writeIpfFuncUsage:
+	if docinfo.a.usage="" THEN return
+
+	call lineout ipf, ":h2 res="||res+usageres
+	call lineout ipf, "x=30%"
+	call lineout ipf, "width=70%"
+	call lineout ipf, "group=2"
+	call lineout ipf, "hide"
+	call lineout ipf, "."||getFunctionName2(docinfo.a.function, docinfo.a.isSom)||" - Usage"
+	call lineout ipf, ":p."
+	call lineout ipf, wrapString(docinfo.a.usage)
+
+return
+
+/*****************/
+writeIpfFuncParams:
+	if docinfo.a.numparams=0 THEN return   /* No params given */
+
+	/* Write big parameter panel */
+	call lineout ipf, ":h2 res="||res+paramsres
+	call lineout ipf, "x=30%"
+	call lineout ipf, "width=70%"
+	call lineout ipf, "group=2"
+	call lineout ipf, "hide"
+	call lineout ipf, "."||getFunctionName2(docinfo.a.function, docinfo.a.isSom)||" - Parameters"
+	call lineout ipf, ":p."
+	DO parms = 1 to docinfo.a.numparams
+		pindex='param'||parms
+		call lineout ipf, ":hp2."||WORD(docinfo.a.pindex, 2)||":ehp2. ("||WORD(docinfo.a.pindex, 1)||") - "||WORD(docinfo.a.pindex, 3)
+		call lineout ipf, ":p."
+		call lineout ipf, ":lm margin=5."
+		call lineout ipf, wrapString(SUBWORD(docinfo.a.pindex, 4))
+		call lineout ipf, ":lm margin=1."
+		call lineout ipf, ":p."
+	END
+	call lineout ipf, ""          /* Space to make source readable */
+
+	/* Write small panel (lower right) for every parameter */
+	DO parms = 1 to docinfo.a.numparams
+		pindex='param'||parms
+		call lineout ipf, ":h2 res="||res+paramsres+parms
+		call lineout ipf, "x=30%"
+		call lineout ipf, "width=70% height=35%"
+		call lineout ipf, "group=3"
+		call lineout ipf, "hide"
+		call lineout ipf, "."||getFunctionName2(docinfo.a.function, docinfo.a.isSom)||" Parameter - "||WORD(docinfo.a.pindex, 2)
+		call lineout ipf, ":p."
+		call lineout ipf, ":hp2."||WORD(docinfo.a.pindex, 2)||":ehp2. ("||WORD(docinfo.a.pindex, 1)||") - "||WORD(docinfo.a.pindex, 3)
+		call lineout ipf, ":p."
+		call lineout ipf, wrapString(SUBWORD(docinfo.a.pindex, 4))
+	END
+return
+
+/*****************************/
+/* Write the Remarks panel          */
+/*****************************/
+writeIpfFuncRemarks:
+	if docinfo.a.remarks="" THEN return
+
+	call lineout ipf, ":h2 res="||res+remarksres
+	call lineout ipf, "x=30%"
+	call lineout ipf, "width=70%"
+	call lineout ipf, "group=2"
+	call lineout ipf, "hide"
+	call lineout ipf, "."||getFunctionName2(docinfo.a.function, docinfo.a.isSom)||" - Remarks"
+	call lineout ipf, ":p."
+	call lineout ipf, wrapString(docinfo.a.remarks)
+
+return
+
+/*****************/
+writeIpfFuncSyntax:
+		call lineout ipf, ""
+		call lineout ipf, ":h2 res="||res+syntaxres
+		call lineout ipf, "x=30%"
+		call lineout ipf, "width=70%"
+		call lineout ipf, "group=2"
+		call lineout ipf, "hide"
+		call lineout ipf, "."||getFunctionName2(docinfo.a.function, docinfo.a.isSom)||" - Syntax"
+		call lineout ipf, ":p."
+		call lineout ipf, wrapString(docinfo.a.desc)
+		call lineout ipf, ":nt."
+		call lineout ipf, "This function can be found in the source file :hp2."||FILESPEC("name", docinfo.a.file) ||":ehp2.."
+		call lineout ipf, ":ent."
+		call lineout ipf, ":xmp."
+		call lineout ipf, ""
+		call lineout ipf, ":parml compact tsize=25 break=none."
+	/* Check if parameters are given. If yes print them and provide a link in the syntax panel */
+		allParams=''
+		IF docinfo.a.numparams >< 0 THEN DO
+		DO parms = 1 to docinfo.a.numparams
+			pindex='param'||parms
+			allParams=allParams||":pt."||WORD(docinfo.a.pindex, 1)||":pd.:link reftype=hd res="||res+paramsres+parms||" dependent."WORD(docinfo.a.pindex, 2 )":elink.;"
+		END
+		END
+	/* Check if return info is given. If yes provide a link on syntax panel */
+		IF docinfo.a.returns >< "" THEN DO
+			allParams=allParams||":pt."||WORD(docinfo.a.returns, 1)||":pd.:link reftype=hd res="||res+returnsres||" dependent."WORD(docinfo.a.returns, 2 )":elink.;"
+			theString=WORD(docinfo.a.returns,2)||" = "||removeTypesFromFunc(SUBWORD(docinfo.a.function,2))||';'
+		END /* docinfo.a.returns */
+		ELSE
+			theString=removeTypesFromFunc(SUBWORD(docinfo.a.function,2))||';'
+		call lineout ipf, allParams
+		call lineout ipf, ":eparml."
+		thePos=1
+		tabPos=1
+	/* Split function in lines */
+		DO WHILE thePos >< 0
+			theString=STRIP(SUBSTR(theString, thePos))
+			thePos=POS(',' , theString)
+			if thePos >< 0 THEN DO
+				if tabPos=1 then DO
+					call lineout ipf, LEFT(theString, thePos)
+					tabPos=POS('(' , theString)
+				END
+				ELSE
+					call lineout ipf, COPIES(' ',tabPos)||LEFT(theString, thePos)
+				thePos=thePos+1
+			END
+			ELSE
+				call lineout ipf, COPIES(' ',tabPos)||theString
+		END
+		call lineout ipf, ":exmp."
+		call lineout ipf, ""
+return
+
+/***************************/
+removeTypesFromFunc: procedure
+	theString=SPACE(ARG(1))
+
+	/* Make sure there's always a space after '(' and ',' */
+	thePos=POS('(', theString)
+	theString=INSERT(' ', theString, thePos)
+	thePos2=POS(' ' , theString, thePos+3)
+	/* Remove '*' in front of somSelf if any */
+	tmpString=STRIP(subStr(theString, thePos2))	
+	IF LEFT(tmpString, 1)='*' THEN
+		tmpString=RIGHT(tmpString, LENGTH(tmpString)-1)
+	theString=LEFT(theString, thePos)||STRIP(tmpString)
+	thePos=POS(',' , theString)
+	DO while thePos >< 0
+		theString=INSERT(' ', theString, thePos)
+		thePos2=POS(' ' , theString, thePos+3)
+		theString=LEFT(theString, thePos)||STRIP(subStr(theString, thePos2))
+		thePos=POS(',', theString, thePos+1)
+	END
+
+return theString
+
+/***************************/
+writeIpfHeader: procedure expose res
+ipf=ARG(1)
+	call lineout ipf, ":userdoc."
+	call lineout ipf, ""
+	call lineout ipf, ":docprof."
+	call lineout ipf, ""
+	call lineout ipf, ":title.Function reference"
+	call lineout ipf, ""
+	call lineout ipf, ":h1 res=100.Introduction"
+	call lineout ipf, ":p."
+	call lineout ipf, "To be written..."
+return
+
+writeIpfFooter:
+	/* Footer */
+	call lineout ARG(1), ":euserdoc."
+return
+
+/**************************/
+
+/*******************************/
+/* Strip the parameter list from the   */
+/* function and return only the name */
+/*                                                 */
+/* During file parsing the whole        */
+/* function declaration was read in   */
+/*******************************/
+getFunctionName: procedure
+	func=ARG(1)
+	thePos=POS('(', func)
+	func=LEFT(func,thePos-1)
+	
+return WORD(func,WORDS(func))
+
+/*******************************/
+/* Strip the parameter list from the   */
+/* function and return only the name */
+/*                                                 */
+/* During file parsing the whole        */
+/* function declaration was read in   */
+/*******************************/
+getFunctionName2: procedure
+	func=ARG(1)
+	thePos=POS('(', func)
+	func=LEFT(func,thePos-1)
+	func=WORD(func,WORDS(func))
+	IF ARG(2)="YES" THEN	
+		return RIGHT(func, LENGTH(func)-1)
+	ELSE
+		return func
+
+/***************************************************************/
+
+/*******************************/
+/* Parse the contents of the source  */
+/* file. This means finding comments  */
+/* containing function descriptions.    */
+/*******************************/
+parseFile: procedure expose (exposelist)
+
+a=ARG(1)
+	curline=0
+	DO while curline <= contents.0
+		curline=curline+1
+		tempLine=STRIP(contents.curline)
+		if LENGTH(templine)<5 then iterate
+
+		if LEFT(tempLine, 4)="/*!*" then do
+			/* Comment with function description found. Now parse it. */
+			call parseComment a
+		END
+	END
+return
+
+/*******************************/
+/* Parse the whole comment block   */
+/* with information                         */
+/*******************************/
+parseComment: 
+	index=index+1
+	docinfo.index.file=STRIP(files.a)
+	docinfo.index.remarks=""
+	docinfo.index.returns=""
+	docinfo.index.example=""
+	docinfo.index.numparams=0
+	docinfo.index.override=""
+	docinfo.index.usage=""
+	DO WHILE curline<=contents.0
+		curline=curline+1
+		theLine=STRIP(contents.curline)
+		IF POS("@@",theLine) ><0 THEN call parseEntry   /* Found a parameter */
+
+		IF LEFT(STRIP(theLine), 5)="/*!!*" THEN DO
+			/* End of comment. Get function name. */
+			docinfo.index.line=curline+1                    /* Line of function */
+			docinfo.index.function=getCompleteFunction()
+			return
+		END
+ 	END
+return
+
+/********************************/
+/* Read lines until a '{' is found.          */
+/* This means reading in a function    */
+/* declaration.                                 */
+/*                                                   */
+/*                                                   */
+/*                                                   */
+/********************************/
+
+getCompleteFunction:
+	theLine= ""		
+	DO WHILE curline<=contents.0
+		curLine=curLine+1
+		theLine=theLine||STRIP(contents.curline)
+		IF POS("{",theLine) ><0 THEN LEAVE
+ 	END
+	theLine=STRIP(TRANSLATE(theLine,' ','{'))
+	/* Ok, at this point we have the whole function declaration including the parameters */
+	/* Check if we have a SOM function */
+	IF POS("SOMLINK", theLine) >< 0 THEN DO
+		/* Mark as a SOM function */
+		docinfo.index.isSom="YES"
+		/* Strip SOMLINK and SOM_Scope and the prefix */
+		thePos=POS('_', SUBWORD(theLine, 4))
+		theLine=WORD(theLine, 2)||" "||substr(SUBWORD(theLine,4), thePos)
+		
+	END
+return theLine
+
+/*******************************/
+/* Parse entries starting with @@ in  */
+/* comment block.                          */
+/*******************************/
+parseEntry:
+	entry=stripCommentChars(theLine)
+	SELECT
+	WHEN entry="@@DESC" THEN DO
+		/* Description */
+		docinfo.index.desc=readEntryContents()
+	END
+	WHEN entry="@@REMARKS" THEN DO
+		/* Remarks */
+		docinfo.index.remarks=readEntryContents()
+	END
+	WHEN entry="@@RETURNS" THEN DO
+		/* Return value */
+		docinfo.index.returns=readEntryContents()
+	END
+	WHEN entry="@@EXAMPLE" THEN DO
+		/* Example */
+		docinfo.index.example=readEntryContents()
+	END
+	WHEN entry="@@OVERRIDE" THEN DO
+		/* Override of a SOM method */
+		docinfo.index.override=readEntryContents()
+	END
+	WHEN entry="@@USAGE" THEN DO
+		/* Usage of a SOM method */
+		docinfo.index.usage=readEntryContents()
+	END
+	WHEN LEFT(entry, 7)="@@PARAM" THEN DO
+		docinfo.index.numparams=docinfo.index.numparams+1
+		parm='param'||docinfo.index.numparams
+		docinfo.index.parm=readEntryContents()
+	END
+	OTHERWISE
+		NOP
+	END
+return ""
+
+/************************************/
+/* Read the text associated with a known */
+/* entry.                                               */
+/* Reading takes place until another entry */
+/* is found or the comment ends.              */
+/************************************/
+readEntryContents:
+	theEntry=""
+	DO WHILE curline<=contents.0
+		curLine=curLine+1
+		theLine=STRIP(contents.curline)
+		IF POS("@@",theLine) ><0 THEN DO
+			curline=curline-1
+			return theEntry
+		END
+		IF LEFT(STRIP(theLine), 5)="/*!!*" THEN return theEntry
+					/* SAY '!!'||stripCommentChars(theLine)||'!!' */
+
+		if TRANSLATE(stripCommentChars(theLine))=":P." THEN DO
+			theEntry=theEntry||stripCommentChars(theLine)
+		END
+		ELSE DO
+			IF LENGTH(theEntry)>3 THEN DO
+				IF TRANSLATE(RIGHT(theEntry,3))=":P." THEN
+					theEntry=theEntry||stripCommentChars(theLine)
+				ELSE
+					theEntry=theEntry||' '||stripCommentChars(theLine)
+			END
+			ELSE DO
+				theEntry=theEntry||' '||stripCommentChars(theLine)
+			END
+
+		END
+		theEntry=STRIP(theEntry)
+/*SAY '%%'||theEntry||'%%'*/
+ 	END
+return theEntry
+
+/********************************/
+/* Remove starting and ending           */
+/* comment chars from arg.               */
+/********************************/
+stripCommentChars:
+	theString=STRIP(SUBSTR(ARG(1),3))
+return STRIP(LEFT(theString, LENGTH(theString)-2))
+
+
+/********************************/
+/* Wrap a string over several lines by  */
+/* inserting '0d'x'0a'x.                        */
+/********************************/
+wrapString:
+
+inString=ARG(1)
+numLines=TRUNC(LENGTH(inString)/80)
+DO widx = 1 to numlines
+	thePos=POS(' ',inString ,widx*80)
+	if thePos=0 THEN return inString
+	inString=INSERT('0d'x'0a'x, inString, thePos)
+END
+return inString 
+
+ 
+    
+
+
+
+  
+ /* ------------------------------------------------------------------ */
+/*  Author: Ruediger Wilke */
+ /* function: quick sort routine                                       */
+ /*                                                                    */
+ /* call:     QuickSort first_element, last_element                    */
+ /*                                                                    */
+ /* returns:  nothing                                                  */
+ /*                                                                    */
+ /* notes:    You must save the elements to sort in the stem "a."      */
+ /*           a.0 must contain the number of elements in the stem.     */
+ /*                                                                    */
+ /*                                                                    */
+ qqsort: procedure expose a.
+ 
+   arg lf, re
+ 
+   if re -lf < 9 then
+     do lf = lf to re -1
+ 
+       m = lf
+ 
+       do j = lf +1 to re
+         if a.j << a.m then                                   /* v2.80 */
+           m = j
+       end /* j = lf +1 to re */
+ 
+       t = a.m; a.m = a.lf; a.lf = t
+ 
+     end /* lf = lf to re -1 */
+     else
+     do
+       i = lf
+       j = re
+       k = (lf + re)%2
+       t = a.k
+ 
+       do until i > j
+ 
+         do while a.i << t                                    /* v2.80 */
+           i = i + 1
+         end /* while a.i << t */
+ 
+         do while a.j >> t                                    /* v2.80 */
+           j = j - 1
+         end /* while a.j >> t */
+ 
+         if i <= j then
+         do
+           xchg = a.i
+           a.i = a.j
+           a.j = xchg
+           i = i + 1
+           j = j - 1
+         end /* if i <= j then */
+ 
+       end /* until i > j */
+ 
+       call qqsort lf, j
+       call qqsort i, re
+     end /* else */
+ 
+ return
+ 
+ 
+   
+
+
Index: /tags/CWMM-0.3.0_GA/env.cmd
===================================================================
--- /tags/CWMM-0.3.0_GA/env.cmd	(revision 213)
+++ /tags/CWMM-0.3.0_GA/env.cmd	(revision 213)
@@ -0,0 +1,240 @@
+/*
+ * Script to set up the build environment for CWMM
+ */
+
+'@echo off'
+trace off
+signal on error name OnError
+
+parse source . . ScriptFile
+
+parse arg aArgs
+
+rc = rxFuncAdd('SysLoadFuncs', 'REXXUTIL', 'SysLoadFuncs')
+rc = SysLoadFuncs()
+
+if (EnvGet('CWMM_ENV_CMD_DONE') == 1) then do
+    say
+    say 'CWMM build environment is already set up.'
+    exit 0
+end
+
+/* include LocalEnv.cmd */
+LocalEnv_cmd = filespec('D', ScriptFile)||filespec('P', ScriptFile)'LocalEnv.cmd'
+LocalEnv = charin(LocalEnv_cmd,, chars(LocalEnv_cmd))
+LocalEnv = translate(LocalEnv, ';;', '0D0A'x)
+interpret LocalEnv
+
+/* process arguments */
+if (arg(1) == 'debug') then do
+    call EnvSet 'BUILD_TYPE', 'debug'
+    aArgs = subword(aArgs, 2)
+end
+else if (arg(1) == 'release') then do
+    call EnvSet 'BUILD_TYPE', 'release'
+    aArgs = subword(aArgs, 2)
+end
+
+/* setup SOM*/
+if (symbol('G.PATH_TOOL_SOM_ENV') \== 'LIT' & G.PATH_TOOL_SOM_ENV \== '') then do
+   cmdline = 'call' G.PATH_TOOL_SOM_ENV
+   cmdline
+   drop cmdline
+end
+
+/* fix the outdated kBuild setting in GCC environment */
+if (EnvGet('BUILD_PLATFORM') == 'OS2') then
+    call EnvSet 'BUILD_PLATFORM', 'os2'
+
+/* setup variables for Config.kmk/kBuild */
+
+call EnvSet 'PATH_SDK_SOM', translate(G.PATH_SDK_SOM, '/', '\')
+call EnvSet 'C_INCLUDE_PATH', translate(G.C_INCLUDE_PATH, '/', '\')
+call EnvSet 'EMXOMFLD_TYPE','wlink'
+call EnvSet 'EMXOMFLD_LINKER', 'wl.exe'
+call EnvSet 'MAKESHELL', translate(G.MAKESHELL, '/', '\')
+call EnvSet 'GBMLIBPATH', translate(G.GBMLIBPATH, '/', '\')
+call EnvSet 'CWMMLICENCE', translate(G.CWMMLICENCE, '/', '\')
+
+/* set path amd beginlib path for building the wpi*/
+if (symbol('G.PATH_TOOL_WARPIN') \== 'LIT' & G.PATH_TOOL_WARPIN \== '') then do
+   call EnvAddFront 'BEGINLIBPATH', G.PATH_TOOL_WARPIN
+   call EnvAddFront 'PATH', G.PATH_TOOL_WARPIN
+end
+
+/* final mark */
+call EnvSet 'CWMM_ENV_CMD_DONE', 1
+
+if (aArgs \== '') then do
+    /* Start the program */
+    prg = translate(word(aArgs, 1))
+    isCmd = 0
+    realPrg = SysSearchPath(PATH, prg)
+    if (realPrg == '') then realPrg = SysSearchPath(PATH, prg'.EXE')
+    if (realPrg == '') then realPrg = SysSearchPath(PATH, prg'.COM')
+    if (realPrg == '') then realPrg = SysSearchPath(PATH, prg'.CMD')
+    if (realPrg \== '') then do
+        if (right(realPrg, 4) == '.CMD') then isCmd = 1
+    end
+    if (isCmd) then 'call' aArgs
+    else aArgs
+end
+else if (EnvGet('SE_CMD_RUNNING') == '') then do
+    /* Print some information about the environment */
+    say
+    say 'CWMM build environment is set up.'
+end
+exit
+
+/*----------------------------------------------------------------------------*/
+
+/**
+ * Add sToAdd in front of sEnvVar. sToAdd may be a list.
+ *
+ * See EnvAddFrontOrBack for details.
+ */
+EnvAddFront: procedure
+    parse arg sEnvVar, sToAdd, sSeparator
+    return EnvAddFrontOrBack(1, 0, sEnvVar, sToAdd, sSeparator);
+
+
+/**
+ * Add sToAdd to the end of sEnvVar. sToAdd may be a list.
+ *
+ * See EnvAddFrontOrBack for details.
+ */
+EnvAddEnd: procedure
+    parse arg sEnvVar, sToAdd, sSeparator
+    return EnvAddFrontOrBack(0, 0, sEnvVar, sToAdd, sSeparator);
+
+/**
+ * Remove all occurences of sToRemove from sEnvVar. sToRemove may be a list.
+ *
+ * See EnvAddFrontOrBack for details.
+ */
+EnvRemove: procedure
+    parse arg sEnvVar, sToRemove, sSeparator
+    return EnvAddFrontOrBack(0, 1, sEnvVar, sToRemove, sSeparator);
+
+/**
+ * Add sToAdd in front or at the end of sEnvVar. sToAdd may be a list.
+ *
+ * Note: This function will remove leading and trailing semicolons, as well
+ * as duplcate semicolons somewhere in the middle. See
+ *
+ *   http://gcc.gnu.org/onlinedocs/gcc-4.4.2/gcc/Environment-Variables.html
+ *
+ * (CPLUS_INCLUDE_PATH and friends) for the explaination why it is necessary to
+ * do. If you want to specifially mean the current working directory, use "."
+ * instead of an empty path element.
+ */
+EnvAddFrontOrBack: procedure
+    parse arg fFront, fRM, sEnvVar, sToAdd, sSeparator
+
+    /* sets default separator if not specified. */
+    if (sSeparator = '') then sSeparator = ';';
+
+    /* get rid of extra ';' */
+    sToAdd = strip(sToAdd,, sSeparator);
+    sToAddClean = ''
+    do i = 1 to length(sToAdd)
+        ch = substr(sToAdd, i, 1);
+        if (ch == sSeparator & right(sToAddClean, 1) == sSeparator) then
+            iterate
+        sToAddClean = sToAddClean||ch
+    end
+
+    /* Get original variable value */
+    sOrgEnvVar = EnvGet(sEnvVar);
+
+    /* loop thru sToAddClean */
+    rc = 0;
+    i = length(sToAddClean);
+    do while (i > 0 & rc = 0)
+        j = lastpos(sSeparator, sToAddClean, i);
+        sOne = substr(sToAddClean, j+1, i - j);
+        cbOne = length(sOne);
+        /* Remove previous sOne if exists. (Changing sOrgEnvVar). */
+        s1 = 1;
+        do while (s1 <= length(sOrgEnvVar))
+            s2 = pos(sSeparator, sOrgEnvVar, s1);
+            if (s2 == 0) then
+                s2 = length(sOrgEnvVar) + 1;
+            if (translate(substr(sOrgEnvVar, s1, s2 - s1)) == translate(sOne)) then do
+                sOrgEnvVar = delstr(sOrgEnvVar, s1, s2 - s1 + 1 /*+sep*/);
+                s1 = s1 + 1;
+            end
+            else do
+                s1 = s2 + 1;
+            end
+        end
+        sOrgEnvVar = strip(sOrgEnvVar,, sSeparator);
+
+        i = j - 1;
+    end
+
+    /* set environment */
+    if (fRM) then
+        return EnvSet(sEnvVar, sOrgEnvVar);
+
+    /* add sToAddClean in necessary mode */
+    if (fFront) then
+    do
+        if (sOrgEnvVar \== '' & left(sOrgEnvVar, 1) \== sSeparator) then
+            sOrgEnvVar = sSeparator||sOrgEnvVar;
+        sOrgEnvVar = sToAddClean||sOrgEnvVar;
+    end
+    else
+    do
+        if (sOrgEnvVar \== '' & right(sOrgEnvVar, 1) \== sSeparator) then
+            sOrgEnvVar = sOrgEnvVar||sSeparator;
+        sOrgEnvVar = sOrgEnvVar||sToAddClean;
+    end
+
+    return EnvSet(sEnvVar, sOrgEnvVar);
+
+
+/**
+ * Sets sEnvVar to sValue.
+ */
+EnvSet: procedure
+    parse arg sEnvVar, sValue
+
+    sEnvVar = translate(sEnvVar);
+
+    /*
+     * Begin/EndLibpath fix:
+     *      We'll have to set internal these using both commandline 'SET'
+     *      and internal VALUE in order to export it and to be able to
+     *      get it (with EnvGet) again.
+     */
+    if ((sEnvVar = 'BEGINLIBPATH') | (sEnvVar = 'ENDLIBPATH')) then
+    do
+        if (length(sValue) >= 1024) then
+            say 'Warning: 'sEnvVar' is too long,' length(sValue)' char.';
+        return SysSetExtLibPath(sValue, substr(sEnvVar, 1, 1));
+    end
+
+    if (length(sValue) >= 1024) then
+    do
+        say 'Warning: 'sEnvVar' is too long,' length(sValue)' char.';
+        say '    This may make CMD.EXE unstable after a SET operation to print the environment.';
+    end
+    sRc = VALUE(sEnvVar, sValue, 'OS2ENVIRONMENT');
+    return 0;
+
+/**
+ * Gets the value of sEnvVar.
+ */
+EnvGet: procedure
+    parse arg sEnvVar
+    if ((translate(sEnvVar) = 'BEGINLIBPATH') | (translate(sEnvVar) = 'ENDLIBPATH')) then
+        return SysQueryExtLibPath(substr(sEnvVar, 1, 1));
+    return value(sEnvVar,, 'OS2ENVIRONMENT');
+
+OnError:
+    if (rc \= 0 & symbol('cmdline') == 'VAR') then
+        say 'ERROR: Executing "'cmdline'" failed with code' rc'.'
+	exit rc
+
+
Index: /tags/CWMM-0.3.0_GA/hobbes.TEMPLATE
===================================================================
--- /tags/CWMM-0.3.0_GA/hobbes.TEMPLATE	(revision 213)
+++ /tags/CWMM-0.3.0_GA/hobbes.TEMPLATE	(revision 213)
@@ -0,0 +1,28 @@
+                          Upload Information Template for Hobbes.nmsu.edu
+                          ===============================================
+
+        Archive Filename: 
+       Short Description: Replacement multimedia classes for the ones coming with MMOS2. These new classes are more robust and have additional features. Media player, slide show program and new JPG IO procedure. German language version.
+        Long Description: Additional WPS classes for seamless integration of MP3 and OGG files into the WPS. Standard WPS audio menues like any other audio file. Information page in the settings notebook about audio characteristics. ID3 (V1.0) page for MP3 files for viewing and setting. Audio and ID3 information shown in details view. Media-Folder class to play any known audio file. Use it as your favorite MP3-player. CD player with FreeDB support. Slide show program. PNG class. New JPEG IO procedure with support for progressive JPEG images. Audio stream class for IceCast servers. German language version.
+
+      Proposed directory
+           for placement: /pub/os2/apps/mmedia/sound/players/
+
+               Your name: Chris Wohlgemuth 
+           Email address: 
+    Program contact name: (same)
+   Program contact email: (same)
+             Program URL: http://www.os2world.com/cdwriting
+			
+      Would you like the
+   contact email address
+    included in listings? yes
+
+Operating System/Version: Warp 4, eCS. This package doesn't work with Warp3.
+ Additional requirements: MMOS/2 must be installed. EMX runtime 0.9d Fix 4. REXX
+
+                Replaces: (none)
+
+
+
+
Index: /tags/CWMM-0.3.0_GA/install-global/FILE_ID.DIZ
===================================================================
--- /tags/CWMM-0.3.0_GA/install-global/FILE_ID.DIZ	(revision 213)
+++ /tags/CWMM-0.3.0_GA/install-global/FILE_ID.DIZ	(revision 213)
@@ -0,0 +1,35 @@
+CW-Multimedia classes V0.2.9
+(C) Chris Wohlgemuth 2001-2005
+http://www.geocities.com/SiliconValley/Sector/5785/
+http://www.os2world.com/cdwriting
+
+Replacement multimedia classes for the ones coming with
+MMOS2. These new classes are more robust and have additional
+features.
+
+Additional WPS classes for seamless integration of
+MP3, OGG and FLAC files into the WPS. Standard WPS
+audio menues like any other audio file.
+Information page in the settings notebook about audio
+characteristics.
+ID3 (V1.1) page for MP3 files for viewing and setting.
+Audio and ID3 information shown in details view.
+The classes were known as CW-audio-classes.
+
+Media-Folder class to play any known audio file.
+Use it as your favorite MP3-player.
+CD player with FreeDB support. Playlinst editor for
+*.m3u files.
+PNG image class. New JPG IO-procedure for reading
+progressive JPG images.
+
+Slide show program for displaying the contents of one
+ore more directories.
+
+Requires:	OS/2 Warp 4 or eCS, MMOS2 and EMX runtime 09d fix4
+
+cw-mmclasses-0_2_9-ger.zip - german version
+
+Licence:
+This package is provided 'as is' for free. See license.txt.
+
Index: /tags/CWMM-0.3.0_GA/install-global/InstIBM.CMD
===================================================================
--- /tags/CWMM-0.3.0_GA/install-global/InstIBM.CMD	(revision 213)
+++ /tags/CWMM-0.3.0_GA/install-global/InstIBM.CMD	(revision 213)
@@ -0,0 +1,198 @@
+/* */
+ call RxFuncAdd 'SysLoadFuncs', 'RexxUtil', 'SysLoadFuncs'
+ call SysLoadFuncs
+
+/* Delete INI keys */
+rc=SysIni("USER", "CWMM", "ib",'DELETE:')
+rc=SysIni("USER", "CWMM", "ab",'DELETE:')
+
+/* Copy backup of MMPARTS.DLL to MMOS2\DLL */
+curDir=DIRECTORY()
+targetDir=FILESPEC('drive',curdir)||FILESPEC('path', curdir)
+
+
+'@copy 'curDir||'\MMPARTS.DLL 'targetdir
+'@del 'targetdir'MMPARTS.cwm'
+
+'@'curdir||'\unlock 1>NUL 2>NUL'
+'@'curdir||'\unlock 'targetdir'JPEGIO.DLL'
+'@attrib -r -s 'targetdir'JPEGIO.DLL'
+'@del 'targetdir'JPEGIO.DLL'
+'@copy 'curDir||'\JPEGIO.DLL 'targetdir
+
+call RxFuncAdd 'RxWinReplaceObjectClass', 'mmparts', 'RxWinReplaceObjectClass'
+
+deinstalling=""
+
+MMClasses.   = ''
+MMClasses.1  = 'MMDataFile'
+MMClasses.2  = 'MMImage'
+MMClasses.3  = 'MMAudio'
+MMClasses.4  = 'MMVideo'
+MMClasses.5  = 'MMMIDI'
+MMClasses.6  = 'MMTarga'
+MMClasses.7  = 'MMTIFF'
+MMClasses.8  = 'MMGIF'
+MMClasses.9  = 'MMPCX'
+MMClasses.10 = 'MMPhotoCD'
+MMClasses.11 = 'MMAVC'
+MMClasses.12 = 'MMMMotion'
+MMClasses.13 = 'MMDIB'
+MMClasses.14 = 'MMDevice'
+MMClasses.15 = 'MMCDDevice'
+MMClasses.16 = 'MMLVDDevice'
+MMClasses.17 = 'MMVolume'
+MMClasses.18 = 'MMVOC'
+MMClasses.19 = 'MM_AU'
+MMClasses.20 = 'MMAU'
+MMClasses.21 = 'MMAIF'
+MMClasses.22 = 'MMIFF'
+MMClasses.23 = 'MMSNDF'
+MMClasses.24 = 'MMAVI'
+MMClasses.25 = 'MMFLI'
+MMClasses.26 = 'MMMPG'
+MMClasses.27 = 'MMJPG'
+MMClasses.28 = 'MMWAV'
+MMClasses.29 = 'MMMOV'
+MMClasses.30 = 'MMFolder'
+MMClasses.31 = 'MMFinder'
+
+x = 1;
+
+do while MMClasses.x <> ''   /* loop until no more classes */
+   if deinstalling = '-R' then
+      if SysDeregisterObjectClass(MMClasses.x) then
+         say MMClasses.x 'class deregistration successful'
+      else
+         say MMClasses.x 'class deregistration failed'
+   else
+      if SysRegisterObjectClass(MMClasses.x, "mmparts") then
+         say MMClasses.x 'class registration successful'
+      else
+         say MMClasses.x 'class registration failed'
+   x = x + 1
+end
+
+/* Register MMShadow class */
+      IF SysRegisterObjectClass("MMShadow", "MMSHD") then DO
+	say 'MMShadow class registration successful'
+	/* Do replacement */
+	res = SysIni(, 'PM_InstallClassReplacement', 'WPShadow', 'MMShadow'x2c('0') )
+     END
+/* Do MMBitmap Replacement Class */
+
+if deinstalling = '-R' then
+   do
+      if RxWinReplaceObjectClass('WPBitmap','MMBitmap', '0') then
+         say 'UnReplace MMBitmap successful'
+      else
+         say 'UnReplace MMBitmap failed'
+
+      if SysDeregisterObjectClass('MMBitmap') then
+         say 'MMBitmap class deregistration successful'
+      else
+         say 'MMBitmap class deregistration failed'
+
+   end
+else
+   do
+      if SysRegisterObjectClass('MMBitmap', 'MMBIT') then
+         say 'MMBitmap class registration successful'
+      else
+         say 'MMBitmap class registration failed'
+
+      res = SysIni(, 'PM_InstallClassReplacement', 'WPBitmap', 'MMBitmap'x2c('0') )
+      say 'Replacing WPBitmap with MMBitmap successful (res=' res ')'
+   end
+
+/* Do MMShadow Replacement Class */
+
+if deinstalling = '-R' then
+   do
+      if RxWinReplaceObjectClass('WPShadow','MMShadow', '0') then
+         say 'UnReplace MMShadow successful'
+      else
+         say 'UnReplace MMShadow failed'
+
+      if SysDeregisterObjectClass('MMShadow') then
+         say 'MMShadow class deregistration successful'
+      else
+         say 'MMShadow class deregistration failed'
+
+   end
+else
+   do
+      if SysRegisterObjectClass('MMShadow', 'MMSHD') then
+         say 'MMShadow class registration successful'
+      else
+         say 'MMShadow class registration failed'
+
+      res = SysIni(, 'PM_InstallClassReplacement', 'WPShadow', 'MMShadow'x2c('0') )
+      say 'Replacing WPShadow with MMShadow successful (res=' res ')'
+   end
+
+
+MMIpl.=''
+MMIpl.1 = 'MMAU'
+MMIpl.2 = 'MMAIF'
+MMIpl.3  = 'MMAudio'
+MMIpl.4 = 'MMAVC'
+MMIpl.5 = 'MMAVI'
+MMIpl.6 = 'MMDIB'
+MMIpl.7 = 'MMFLI'
+MMIpl.8  = 'MMGIF'
+MMIpl.9 = 'MMIFF'
+MMIpl.10 = 'MMJPG'
+MMIpl.11  = 'MMMIDI'
+MMIpl.12 = 'MMMMotion'
+MMIpl.13 = 'MMMOV'
+MMIpl.14 = 'MMMPG'
+MMIpl.15  = 'MMPCX'
+MMIpl.16 = 'MMPhotoCD'
+MMIpl.17 = 'MMSNDF'
+MMIpl.18  = 'MMTarga'
+MMIpl.19  = 'MMTIFF'
+MMIpl.20  = 'MMVideo'
+MMIpl.21 = 'MMVOC'
+MMIpl.22 = 'MMWAV'
+MMIpl.23 = 'MM_AU'
+
+MMIpl.0=23
+
+DO a=1 to MMIpl.0
+	rc= SysIni('USER', 'PM_Workplace:IplLoad', MMIpl.a , X2C(2000))
+END
+
+
+/* Find MMOS2 directory */
+thePath=VALUE("MMBASE", , "OS2ENVIRONMENT")
+	thePath=STRIP(thePath)
+	IF LENGTH(thePATH)\=0 THEN DO
+		if RIGHT(thePath, 1)=";" THEN thePath=LEFT(thePAth, LENGTH(thePath)-1)
+	END
+	IF LENGTH(thePATH)\=0 THEN DO
+		if RIGHT(thePath, 1)="\" THEN thePath=LEFT(thePAth, LENGTH(thePath)-1)
+	END
+
+/* Correct settings of some MM objects */
+/* Digital Audio Player */
+rc=SysSetObjectData("<MMPM_DAPLAYER1>", "EXENAME=WEPM.EXE;STARTUPDIR="||thePath||"\SOUNDS;")
+rc=SysSetObjectData("<MMPM_DAPLAYER2>", "EXENAME=WEPM.EXE;STARTUPDIR="||thePath||"\SOUNDS;")
+
+/* Midi Player */
+rc=SysSetObjectData("<MMPM_MIDIPLAYER1>", "EXENAME=MPPM.EXE;STARTUPDIR="||thePath||"\SOUNDS;")
+rc=SysSetObjectData("<MMPM_MIDIPLAYER2>", "EXENAME=MPPM.EXE;STARTUPDIR="||thePath||"\SOUNDS;")
+
+/* Video Player */
+rc=SysSetObjectData("<MMPM2_SOFTWARE_MOTION_VIDEO1>", "EXENAME=MPPM.EXE;STARTUPDIR="||thePath||"\MOVIES;")
+rc=SysSetObjectData("<MMPM2_SOFTWARE_MOTION_VIDEO2>", "EXENAME=MPPM.EXE;STARTUPDIR="||thePath||"\MOVIES;")
+
+/* CD Player */
+rc=SysSetObjectData("<MMPM_CDPLAYER1>", "EXENAME=CDPM.EXE;STARTUPDIR="||thePath||"\SOUNDS;")
+rc=SysSetObjectData("<MMPM_CDPLAYER2>", "EXENAME=CDPM.EXE;STARTUPDIR="||thePath||"\SOUNDS;")
+rc=SysSetObjectData("<MMPM_CDPLAYER3>", "EXENAME=CDPM.EXE;STARTUPDIR="||thePath||"\SOUNDS;")
+
+
+
+exit
+
Index: /tags/CWMM-0.3.0_GA/install-global/Runme1st.cmd
===================================================================
--- /tags/CWMM-0.3.0_GA/install-global/Runme1st.cmd	(revision 213)
+++ /tags/CWMM-0.3.0_GA/install-global/Runme1st.cmd	(revision 213)
@@ -0,0 +1,325 @@
+/* rexx - Install the CW-MM classes */
+
+/* Load all the Rexx Util functions */
+call RxFuncAdd 'SysLoadFuncs', 'RexxUtil', 'SysLoadFuncs'
+call SysLoadFuncs
+
+/*
+SAY RxFuncAdd( 'RxWinReplaceObjectClass', 'MMPARTS', 'RxWinReplaceObjectClass')
+SAY RxFuncQuery('RxWinReplaceObjectClass')
+*/
+
+'mode 80,50'
+
+curDir=DIRECTORY()
+/* call SysCls */
+SAY ""
+SAY ""
+
+deinstalling = '-R' /* We want to deinstall the classes */
+
+
+/* Get bootdrive */
+ bootdrv = translate(value('PATH', , 'os2environment'))
+ bootdrv2=bootdrv
+ parse var bootdrv bootdrv':\OS2;'rest
+ parse var bootdrv2 bootdrv2':\MMOS2;'rest
+ bootdrive = substr(bootdrv, length(bootdrv))
+ bootdrive2 = substr(bootdrv2, length(bootdrv2))
+ IF TRANSLATE(bootdrive2)=TRANSLATE(bootdrive) THEN
+	/* Get config.sys */
+	configsys = bootdrive':\config.sys'
+ ELSE DO
+	call Beep 1000, 100
+	SAY ""
+	SAY "[31;1;mCannot get boot drive![0;m"
+	SAY ""
+	SAY "Please specify your boot drive"
+	SAY ">"
+	parse value SysCurPos() with aktzeile aktspalte
+	newposition=SysCurPos(aktzeile-1,2)
+	resp=STRIP(LINEIN())
+	configsys = LEFT(resp,1)':\config.sys'
+ END
+
+/* Find MMOS2 directory */
+thePath=VALUE("MMBASE", , "OS2ENVIRONMENT")
+	thePath=STRIP(thePath)
+	IF LENGTH(thePATH)\=0 THEN DO
+		if RIGHT(thePath, 1)=";" THEN thePath=LEFT(thePAth, LENGTH(thePath)-1)
+	END
+	IF LENGTH(thePATH)\=0 THEN DO
+		if RIGHT(thePath, 1)="\" THEN thePath=LEFT(thePAth, LENGTH(thePath)-1)
+	END
+	/* Get IBM class dll */
+	mmDLL=thePath||"\DLL\MMPARTS.DLL"
+
+if STREAM(mmDLL, 'c', 'query exists')=mmDLL THEN DO
+	/* IBM class dll found */
+
+	if STREAM(thePath'\DLL\CWMMBack\MMPARTS.DLL', 'c', 'query exists')="" THEN DO
+		SAY ""
+		SAY "  Creating backup of MMPARTS.DLL in "||thePath'\DLL\CWMMBack\'
+		SAY ""
+		'@md 'thePath'\DLL\CWMMBack 2>NUL 1>NUL'
+		'@copy 'mmDLL' 'thePath'\DLL\CWMMBack 1>NUL'
+		IF rc\=0 THEN DO
+			SAY "[31;1;m"
+			SAY "Error while copying MMPARTS.DLL![0;m"
+			SAY "Continue anyway? (You should create a copy by hand!!!)"
+			SAY 'Type Y <return> to continue N <return> to abort.'
+			SAY ">"
+			parse value SysCurPos() with aktzeile aktspalte
+			newposition=SysCurPos(aktzeile-1,2)
+			resp=LINEIN()
+			IF TRANSLATE(resp)='N' THEN EXIT
+		END
+		'@copy '||thePath||'\ab.exe '||thePath||'\DLL\CWMMBack 1>NUL'
+		'@copy '||thePath||'\ib.exe '||thePath||'\DLL\CWMMBack 1>NUL'
+		'@copy '||thePath||'\MPPM.exe '||thePath||'\DLL\CWMMBack 1>NUL'
+		'@copy '||thePath||'\CDPM.exe '||thePath||'\DLL\CWMMBack 1>NUL'
+		'@copy '||thePath||'\WEPM.exe '||thePath||'\DLL\CWMMBack 1>NUL'
+		/* Put the new path into the ini so the classes may find it. */
+		rc=SysIni("USER", "CWMM", "ab", thePath||'\DLL\CWMMBack\ab.exe')
+		rc=SysIni("USER", "CWMM", "ib", thePath||'\DLL\CWMMBack\ib.exe')
+		SAY ""
+		SAY "  Creating backup of JPEGIO.DLL in "||thePath'\DLL\CWMMBack\'
+		'@copy 'thePAth'\DLL\JPEGIO.DLL 'thePath'\DLL\CWMMBack 1>NUL'
+		IF rc\=0 THEN DO
+			SAY "[31;1;m"
+			SAY "Error while copying JPEGIO.DLL![0;m"
+			SAY "Continue anyway?  (You should create a copy by hand!)"
+			SAY 'Type Y <return> to continue N <return> to abort.'
+			SAY ">"
+			parse value SysCurPos() with aktzeile aktspalte
+			newposition=SysCurPos(aktzeile-1,2)
+			resp=LINEIN()
+			IF TRANSLATE(resp)='N' THEN EXIT
+		END
+	END
+	ELSE DO
+		call beep 1000, 100
+		SAY ""
+		SAY "[31;1;mInformation:[0;m Backup files already saved in "||thePath'\DLL\CWMMBack\'
+		SAY ""
+		SAY "Uninstall any prior release of the MM classes. If you already did that rename"
+		SAY "the directory 'CWMMBack' and restart the installation."
+		SAY ""
+		'@pause'
+		Exit
+	END
+	'@'curDir||'\install\unlock.exe 1>NUL 2>NUL'
+	'@'curDir||'\install\unlock.exe 'thePath'\DLL\MMPARTS.DLL 1>NUL 2>NUL'
+	'@attrib -r -s -h 'thePath'\DLL\MMPARTS.DLL 1>NUL 2>NUL'
+	'@ren 'thePath'\DLL\MMPARTS.DLL MMPARTS.cwm'
+END
+
+/*
+if STREAM(mmDLL, 'c', 'query exists')=mmDLL THEN DO
+	SAY ""
+	SAY "Now patching the class names in the file MMPARTS.DLL."
+	SAY "This DLL contains the IBM multimedia classes. This patching prevents"
+	SAY "the loading of these old classes which may lead to serious problems."
+	SAY "A backup of this DLL was created in the directory "||thePath'\DLL\CWMMBack'
+	'@pause'
+	/* Unlock the MMPARTS.DLL */
+	unlck='@"'curDir||'\install\unlock.exe"'
+	ADDRESS CMD unlck' 'mmDLL' 2>NUL 1>NUL'
+	patchit='"'curDir||'\install\patchdll.exe"'
+	ADDRESS CMD patchit' 'mmDLL' '
+END
+*/
+
+SAY ""
+SAY "  Copying  uninstall skript to "||thePath'\DLL\CWMMBack\'
+'@copy 'curDir||'\install\instIBM.cmd 'thePath'\DLL\CWMMBack 1>NUL'
+'@copy 'curDir||'\install\unlock.exe 'thePath'\DLL\CWMMBack 1>NUL'
+SAY ""
+
+SAY ''
+SAY 'This skript will now uninstall the IBM-MM classes.'
+SAY ''
+SAY 'Type Y <return> to continue N <return> to abort.'
+SAY ">"
+parse value SysCurPos() with aktzeile aktspalte
+newposition=SysCurPos(aktzeile-1,2)
+resp=LINEIN()
+IF TRANSLATE(resp)='N' THEN EXIT
+
+
+/* Deregister the PracticeImage and PracticeBitmap class if present */
+SAY ''
+SAY 'Deregistering the PracticeBitmap and PracticeImage classes'
+SAY 'from the primgfix.zip package if present.'
+
+'@'curDir||'\install\repclass.exe MMBitmap PracticeBitmap u'
+'@'curDir||'\install\repclass.exe MMImage PracticeImage u'
+
+ret=SysDeregisterObjectClass('PracticeBitmap')
+ret=SysDeregisterObjectClass('PracticeImage')
+
+SAY ''
+SAY 'Removing old MM objects'
+
+MMObjects.=''
+MMObjects.1='<MMPM2_MMWAVETEMPLATE>'
+MMObjects.2='<MMPM2_MMMMOTIONTEMPLATE>'
+MMObjects.3='<MMPM2_MMTIFFTEMPLATE>'
+MMObjects.4='<MMPM2_MMTARGATEMPLATE>'
+MMObjects.5='<MMPM2_MMPCXTEMPLATE>'
+MMObjects.6='<MMPM2_MMMIDITEMPLATE>'
+MMObjects.7='<MMPM2_MMGIFTEMPLATE>'
+MMObjects.8='<MMPM2_MMDIBTEMPLATE>'
+MMObjects.9='<MMPM2_MMBITMAPTEMPLATE>'
+MMObjects.10='<MMPM2_MMAVITEMPLATE>'
+MMObjects.11='<MMPM2_MMAVCIMAGETEMPLATE>'
+MMObjects.12='<MMPM2_MMFOLDERTEMPLATE>'
+MMObjects.13='<MMPM2_MMLVDDEVICETEMPLATE>'
+MMObjects.14='<MMPM2_MMCDDEVICETEMPLATE>'
+
+MMObjects.15='<MMPM2_MMVOLUME>'
+MMObjects.16='<MMPM2_MMCDDEVICE01>'
+MMObjects.17='<MMPM2_MMCDDEVICE02>'
+MMObjects.18='<MMPM2_MMCDDEVICE03>'
+MMObjects.19='<MMPM2_MMCDDEVICE04>'
+MMObjects.20='<MMPM2_AUDIOFINDER>'
+MMObjects.21='<MMPM2_MIDIFINDER>'
+MMObjects.22='<MMPM2_IMAGEFINDER>'
+MMObjects.23='<MMPM2_VIDEOFINDER>'
+MMObjects.24='<MMPM2_SNDSHAD>'
+MMObjects.25='<MMPM2_MMMMotion ImageTEMPLATE>'
+MMObjects.26='<MMPM2_MMTargaTEMPLATE>'
+MMObjects.27='<MMPM2_MMBitmapTEMPLATE>'
+MMObjects.28='<MMPM2_MMBilddateiTEMPLATE>'
+
+MMObjects.0=28
+
+DO a=1 to MMObjects.0
+	rc=SysSetObjectData(MMObjects.a, "NODELETE=NO;TEMPLATE=NO;")
+END
+DO a=1 to MMObjects.0
+	rc=SysDestroyObject(MMObjects.a)
+END
+
+
+SAY ''
+SAY 'Deregistering the IBM multimedia classes if present.'
+
+/* Remove autoload entries */
+MMIpl.=''
+MMIpl.1 = 'MMAU'
+MMIpl.2 = 'MMAIF'
+MMIpl.3  = 'MMAudio'
+MMIpl.4 = 'MMAVC'
+MMIpl.5 = 'MMAVI'
+MMIpl.6 = 'MMDIB'
+MMIpl.7 = 'MMFLI'
+MMIpl.8  = 'MMGIF'
+MMIpl.9 = 'MMIFF'
+MMIpl.10 = 'MMJPG'
+MMIpl.11  = 'MMMIDI'
+MMIpl.12 = 'MMMMotion'
+MMIpl.13 = 'MMMOV'
+MMIpl.14 = 'MMMPG'
+MMIpl.15  = 'MMPCX'
+MMIpl.16 = 'MMPhotoCD'
+MMIpl.17 = 'MMSNDF'
+MMIpl.18  = 'MMTarga'
+MMIpl.19  = 'MMTIFF'
+MMIpl.20  = 'MMVideo'
+MMIpl.21 = 'MMVOC'
+MMIpl.22 = 'MMWAV'
+MMIpl.23 = 'MM_AU'
+
+MMIpl.0=23
+
+DO a=1 to MMIpl.0
+	    call SysIni 'USER', 'PM_Workplace:IplLoad', MMIpl.a, 'DELETE:'
+END
+
+/* First uninstall the standard MM-stuff */
+MMClasses.   = ''
+MMClasses.1  = 'MMDataFile'
+MMClasses.2  = 'MMImage'
+MMClasses.3  = 'MMAudio'
+MMClasses.4  = 'MMVideo'
+MMClasses.5  = 'MMMIDI'
+MMClasses.6  = 'MMTarga'
+MMClasses.7  = 'MMTIFF'
+MMClasses.8  = 'MMGIF'
+MMClasses.9  = 'MMPCX'
+MMClasses.10 = 'MMPhotoCD'
+MMClasses.11 = 'MMAVC'
+MMClasses.12 = 'MMMMotion'
+MMClasses.13 = 'MMDIB'
+MMClasses.14 = 'MMDevice'
+MMClasses.15 = 'MMCDDevice'
+MMClasses.16 = 'MMLVDDevice'
+MMClasses.17 = 'MMVolume'
+MMClasses.18 = 'MMVOC'
+MMClasses.19 = 'MM_AU'
+MMClasses.20 = 'MMAU'
+MMClasses.21 = 'MMAIF'
+MMClasses.22 = 'MMIFF'
+MMClasses.23 = 'MMSNDF'
+MMClasses.24 = 'MMAVI'
+MMClasses.25 = 'MMFLI'
+MMClasses.26 = 'MMMPG'
+MMClasses.27 = 'MMJPG'
+MMClasses.28 = 'MMWAV'
+MMClasses.29 = 'MMMOV'
+MMClasses.30 = 'MMFolder'
+MMClasses.31 = 'MMFinder'
+
+x = 1;
+
+do while MMClasses.x <> ''   /* loop until no more classes */
+      if SysDeregisterObjectClass(MMClasses.x) then
+         say MMClasses.x 'class deregistration successful'
+   x = x + 1
+end
+
+/* MMShadow class */
+/* MMSHD.DLL is a forwarder to MMPARTS.DLL */
+'@'curDir||'\install\repclass.exe WPShadow MMShadow u'
+      if SysDeregisterObjectClass('MMShadow') then
+         say 'MMSHadow class deregistration successful'
+
+
+/* Do MMBitmap Replacement Class */
+'@'curDir||'\install\repclass.exe WPBitmap MMBitmap u'
+      if SysDeregisterObjectClass('MMBitmap') then
+         say 'MMBitmap class deregistration successful'
+
+/* Correct settings of some MM objects */
+
+/* Digital Audio Player */
+rc=SysSetObjectData("<MMPM_DAPLAYER1>", "EXENAME="||thePath||"\DLL\CWMMBack\WEPM.EXE;STARTUPDIR="||thePath||"\DLL\CWMMBack;")
+rc=SysSetObjectData("<MMPM_DAPLAYER2>", "EXENAME="||thePath||"\DLL\CWMMBack\WEPM.EXE;STARTUPDIR="||thePath||"\DLL\CWMMBack;")
+
+/* Midi Player */
+rc=SysSetObjectData("<MMPM_MIDIPLAYER1>", "EXENAME="||thePath||"\DLL\CWMMBack\MPPM.EXE;STARTUPDIR="||thePath||"\DLL\CWMMBack;")
+rc=SysSetObjectData("<MMPM_MIDIPLAYER2>", "EXENAME="||thePath||"\DLL\CWMMBack\MPPM.EXE;STARTUPDIR="||thePath||"\DLL\CWMMBack;")
+
+/* Video Player */
+rc=SysSetObjectData("<MMPM2_SOFTWARE_MOTION_VIDEO1>", "EXENAME="||thePath||"\DLL\CWMMBack\MPPM.EXE;STARTUPDIR="||thePath||"\DLL\CWMMBack;")
+rc=SysSetObjectData("<MMPM2_SOFTWARE_MOTION_VIDEO2>", "EXENAME="||thePath||"\DLL\CWMMBack\MPPM.EXE;STARTUPDIR="||thePath||"\DLL\CWMMBack;")
+
+/* CD Player */
+rc=SysSetObjectData("<MMPM_CDPLAYER1>", "EXENAME="||thePath||"\DLL\CWMMBack\CDPM.EXE;STARTUPDIR="||thePath||"\DLL\CWMMBack;")
+rc=SysSetObjectData("<MMPM_CDPLAYER2>", "EXENAME="||thePath||"\DLL\CWMMBack\CDPM.EXE;STARTUPDIR="||thePath||"\DLL\CWMMBack;")
+rc=SysSetObjectData("<MMPM_CDPLAYER3>", "EXENAME="||thePath||"\DLL\CWMMBack\CDPM.EXE;STARTUPDIR="||thePath||"\DLL\CWMMBack;")
+
+
+'CLS'
+SAY 
+SAY
+SAY '[31;1;m***********************************************[0;m'
+SAY
+SAY '    You[31;1;m MUST[0;m restart the WPS now!!'
+SAY
+SAY '[31;1;m***********************************************[0;m'
+SAY ''
+'@Pause'
+EXIT
+
Index: /tags/CWMM-0.3.0_GA/install-global/cwinst2.in_
===================================================================
--- /tags/CWMM-0.3.0_GA/install-global/cwinst2.in_	(revision 213)
+++ /tags/CWMM-0.3.0_GA/install-global/cwinst2.in_	(revision 213)
@@ -0,0 +1,49 @@
+[APPLICATION]
+NAME Generic installer
+VERSION 0.1.7.0
+COPYRIGHT (c) C. Wohlgemuth
+HOME http://www.geocities.com/SiliconValley/Sector/5785/
+INTERNALNAME CWINST
+TOTALSIZE 377282
+INSTALLER 0.1.0.0
+DESCRIPTION This is a generic installer. It supports file copying, WPS classes, WPS objects, changes to the config.sys, INI file changes and complete deinstallation.
+
+[DESCRIPTION]
+DESCRIPTION  This is a generic installer. It supports file copying, WPS classes, WPS objects, changes to the config.sys, INI file changes and complete deinstallation.
+
+[LICENSE]
+FILE install\COPYING
+
+[FILES]
+cwinst2.in_, %TARGET%\ ,  F,  1856
+install.EXE, %TARGET%\ ,  F,  162706
+install\COPYING, %TARGET%\ ,  F,  1604
+install\cwinst.in_, %TARGET%\ ,  F,  835
+install\drive.BMP, %TARGET%\ ,  F,  782
+install\folder.BMP, %TARGET%\ ,  F,  786
+install\genin013.dll, %TARGET%\ ,  F,  27443
+install\INSTALL.ICO, %TARGET%\ ,  F,  3344
+install\INSTFLD2.ICO, %TARGET%\ ,  F,  3344
+install\INSTFOLD.ICO, %TARGET%\ ,  F,  3344
+install\repclass.exe, %TARGET%\ ,  F,  2641
+install\unlock.exe, %TARGET%\ ,  F,  2569
+
+[OBJECTS]
+Generic Installerõ,õ <CWINST_FOLDER>õ,õ WPFolderõ,õ <WP_DESKTOP>õ,õ õ,õ update
+Installation/Deinstallationõ,õ <CWINST_PROGRAM>õ,õ WPProgramõ,õ <CWINST_FOLDER>õ,õ EXENAME=%TARGET%\install.exe;ASSOCFILTER=*.insõ,õ update
+Installation/Deinstallationõ,õ <CWINST_PROGRAMSHADOW>õ,õ WPShadowõ,õ <WP_CONFIG>õ,õ SHADOWID=<CWINST_PROGRAM>õ,õ update
+
+[UPDATEOBJECTS]
+<CWINST_PROGRAM>õ,õ ICONFILE=%TARGET%\install\install.ico
+<CWINST_FOLDER>õ,õ ICONFILE=%TARGET%\install\instFOLD.ico
+<CWINST_FOLDER>õ,õ ICONNFILE=1,%TARGET%\install\instFLD2.ico
+
+[DEFAULTTARGET]
+PATH %APPS%\cwinst
+
+[INI]
+USER õ,õ cwinst õ,õ version õ,õ 0.1.7.0 õ,õ YES
+USER õ,õ cwinst õ,õ instdir õ,õ %TARGET% õ,õ YES
+USER õ,õ cwinst õ,õ status õ,õ minimal õ,õ YES
+
+
Index: /tags/CWMM-0.3.0_GA/install-global/eng/License
===================================================================
--- /tags/CWMM-0.3.0_GA/install-global/eng/License	(revision 213)
+++ /tags/CWMM-0.3.0_GA/install-global/eng/License	(revision 213)
@@ -0,0 +1,60 @@
+MMedia-classes
+--------------
+
+* * * * * I M P O R T A N T  N O T I C E  * * * * *
+
+In the past this package was constantly bashed and
+the author flamed and insulted far beyond what should
+be regarded acceptable between human beings.
+This is rather surprising because no user had to pay or
+do anything to get this product, it's free to use or - not to use.
+
+I want to clarify some points.
+
+1. This is a free time project. There's no obligation for
+    me to give support or do anything I don't want to do. 
+
+2. Everybody who thinks he will get a solution for a particular
+    problem by insulting me or others and yelling around should
+    work to improve his social skills.
+
+3. There're technical reasons why certain parts of this product
+    are implemented the way they are. If anybody doesn't like a
+    particular implementation feel free to present a better solution
+    but don't waste my time with useless discussions just to have
+    the last word.
+
+4. As for most people my day only consists of 24 hours.
+
+5. If the product doesn't work for you, just use the original classes
+    coming with OS/2. There's no obligation for anybody to use
+    this package at all!
+
+* * * * * I M P O R T A N T  N O T I C E  * * * * *
+
+License
+--------
+
+Theses classes are free to use but copyrighted. Use them
+on your own risk. If they burn your house or destroy your
+data it's all your fault.
+This software is a beta release and may contain severe
+bugs which may cause data loss. So be sure to backup
+important data prior to installation.
+
+ 
+Author
+------
+
+These classes are (C) 2001-2005 Chris Wohlgemuth.
+
+http://www.geocities.com/SiliconValley/Sector/5785/
+http://www.os2world.com/cdwriting
+
+
+Credits
+-------
+
+The graphics are (C) Klaus Staedtler-Przyborski. Thanks for
+fearless beta testing.
+
Index: /tags/CWMM-0.3.0_GA/install-global/eng/Readme.1st
===================================================================
--- /tags/CWMM-0.3.0_GA/install-global/eng/Readme.1st	(revision 213)
+++ /tags/CWMM-0.3.0_GA/install-global/eng/Readme.1st	(revision 213)
@@ -0,0 +1,384 @@
+1. CW-multimedia classes
+------------------------
+
+This package is a complete replacement for the
+multimedia classes coming with MMOS2. The convert menu
+is enhanced and the image classes are more robust WRT
+broken image files or buggy IO-procs. The limitations
+of the JPG-IO proc are still there. This procedure crashes
+on some images and the only way to resolve is a restart of
+the WPS. To overcome this limitiation a new JPGIO-IO procedure
+is included.
+
+New classes are for seemless integration of the
+MMIO procedures for MP3 and OGG files written by
+Russel O'Connor.
+Get these procedures from:
+
+http://www.math.berkeley.edu/~roconnor/
+
+After installation Ogg- and MP3 files are treated the
+same way by the WPS as the other audio files. They have
+their own Icons and the same menus as for example
+wave files. A doubleclick starts playback another one
+stops it. The convert menu item helps you decoding the
+file to wave without any other program. 
+
+The settings notebook of every audio file gets a new
+page added describing the audio characteristics like
+playtime or samplerate. This data is also shown in the
+details view of folders if set to class:CWAudio.
+
+There's also a new open-item for volume.
+
+You may view and change the ID3 tags of MP3 files
+using the settings notebook. These tags are also shown
+in the details view.
+
+A new JPEG IO procedure supports progressive JPEG images.
+
+
+2. Media folder and audio shadow
+--------------------------------
+
+The Media folder is a player for any
+audio file known by OS/2. The usual play
+controls are available and you may create
+playlists just by dropping files into the folder.
+
+Audio files will not be put into the folder directly
+but shadows are created.
+A new shadow class shows you details information
+for the linked audio files in the details view of a
+Media-Folder. A REXX interface is available if 
+WPS-wizard V0.2.0 or above is installed.
+
+A WPS enabled CD player with FreeDB support is included
+and a *.M3U playlist editor.
+
+
+3. Slide show
+-----------
+
+Starting with V0.2.8 the package contains a slide show program for
+displaying the contents of one or more directories.
+
+
+Installation
+------------
+Before you ask:
+
+YES THE MULTIMEDIA CLASSES WORK WITH XWP AS THEY
+ALWAYS DID.
+DON'T BOTHER ME WITH QUESTIONS ABOUT THAT.
+
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+
+MAKE A BACKUP OF YOUR INI FILES!
+
+MAKE A BACKUP OF YOUR INI FILES!
+
+MAKE A BACKUP OF YOUR INI FILES!
+
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+
+Note:
+If you've installed WordPerfect for OS/2 5.2(a) uninstall it first.
+Otherwise it'll be impossible to deregister the IBM multimedia classes
+and your system will most likely crash during install of the new
+classes. Be sure to clean the INI file using 'checkini /C' before
+you proceed. The cause of this problem is unknown at the moment.
+
+Make a copy of JPEGIO.DLL and MMPARTS.DLL in the directory
+MMOS2\DLL. These files will be overwritten during installation
+of the new multimedia classes. The install skript will create additional
+copies of the DLLs in the directory MMOS2\CWMMBack for reinstallation
+of the IBM classes
+
+Deinstall any old version of the media folder and the CWAudio
+classes. Restart the system. 
+
+
+1. Put the contents of the archive into a directory
+2. Start the Skript Runme1st.cmd
+3. Restart the WPS. DON'T SKIP THIS STEP!
+4. Clean the INI files with 'Checkini.exe /C' (wptool32.zip, http://hobbes.nmsu.edu)
+5. Restart the WPS. DON'T SKIP THIS STEP!
+6. Run install.exe.This will copy the files and register the
+   new classes.
+7. Restart the WPS so the new classes will be loaded.
+ 
+If the WPS doesn't start rename the installation directory from
+a command line. It may be helpful to move all objects from the desktop
+when start problems occur.
+
+Be sure to use the latest release of the MMIOMP3 IO-procedure
+(http://www.math.berkeley.edu/~roconnor/). It has a lot of improvements.
+
+
+Uninstallation
+--------------
+
+1. Use the uninstall feature of the generic installer
+2. Restart the WPS. DON'T SKIP THIS STEP!
+3. Clean the INI files with 'Checkini.exe /C' (wptool32.zip, http://hobbes.nmsu.edu)
+4. Run the script x:\MMOS2\CWMMBack\INSTIBM.CMD to install the IBM classes.
+   Replace x with your boot drive.
+
+Restart the WPS afterwards.
+
+
+Known problems
+--------------
+
+The playtime may be not correct for some VBR-MP3s. This is a problem
+of the MMIOMP3-Proc not the classes.
+
+MP3 files may not be recognized correctly. This happens if there was a
+previous installation of the classes. Drop the folder containing the MP3
+files on the skript \cwmm-x_x_x-lang\bin\RemoveEA.CMD to remove the
+attribute .CLASSINFO and to set the right .TYPE attribute. The folder must
+be closed when dropping!
+Wave and ogg files loose the track information entered in the settings so
+be sure to backup this information before using the skript.
+ 
+The audio stream class only supports IceCast servers. There's no support for
+Shoutcast.
+
+
+Bug reporting
+------------
+
+Use the 'Multimedia Extensions' section of http://xtracker.netlabs.org if you
+find a bug.
+
+
+Helpful utility
+------------
+
+Salvador Parra Camacho has written a program to change the hidden settings
+(see documentation) in a convenient way.
+Find the homepage at:
+
+http://www.geocities.com/escajarro/
+
+Direct download of the utility:
+
+http://www.geocities.com/escajarro/soft/ccfg010z.zip   (Zip)
+http://www.geocities.com/escajarro/soft/ccfg010w.zip  (Wpi)
+
+
+History
+-------
+
+V0.1.0
+
+First release of the new audio classes.
+
+V0.2.0
+
+-Type 'Digital Audio' returned in addition to MP3/OGGS for the audio classes.
+-Setting of .TYPE EA so Digital Audio player works with MP3/OGG files without further fiddling
+-Caching of MP3 technical data in EAs to speed up folder opening.
+-ID3 data shown with the right codepage.
+-Mnemonic for Volume menu item.
+
+-New classes CWMediaFolder and CWAudioShadow for playing of audio files.
+
+V0.2.1
+
+MMClasses:
+-A bunch of minor fixes.
+-No prereading of audio info for files on CD to speed up folder opening.
+
+Media folder:
+-Repeat function added
+-new (and improved) sliders
+-Keyboard control added (not for sliders yet)
+-Display for elapsed time, remaining time and ID3 tags (click to switch)
+-Change playtime font by DnD
+-Drag and drop handling rewritten.
+-Statusline added
+-REXX interface added
+-No audio info reading for files on CD to speed up CD opening. 
+
+V0.2.2 (29.03.2002)
+
+MMClasses:
+-New CD track class for FreeDB enabled CD player
+-Improved open function. See media folder documentation
+
+Media folder:
+-CD player object with FreeDB support added.
+-Some minor fixes.
+
+
+V0.2.3 (13.07.2002)
+
+MMClasses:
+-Added new replacement classes for audio, video and image files. The MMOS2 classes are
+ not used anymore.
+-Improved lighttable folder with selectable icon size.
+
+Media folder:
+-Added new replacement classes for audio, video and image files. The MMOS2 classes are
+ not used anymore.
+-Improved lighttable folder with selectable icon size.
+
+
+V0.2.4 (29.11.2002)
+
+Media folder:
+-Fixed PM-freeze with broken shadows.
+-Fixed problems when user deleted shadows during playing.
+-Repeat function was broken.
+-Device sharing didn't really work.
+-Random play added.
+-Launch area for objects.
+-Settings opening was only possible with closed folders 
+-Audio files are started on a separate thread.
+-Media folder will take over already playing files (very limited for now, only skip/stop).
+-CD-folder works for all drives not only default cd drive.
+
+MMClasses:
+-Added some more exception handlers.
+-Image details aren't read from CD unless key in INI file is set (see docs).
+-Titlebar of volume control may be hidden
+-Tabbing in volume control enabled
+-Save colors and position of volume control, audio- and image converter
+-Query audio information on a separate thread when awakening objects (speed boost for MP3)
+-Print menu removed for audio and video files.
+-Improved ID3 handling. ID3 V1.1 tracknumber is kept if present.
+-Elapsed time in icon titles when playing.
+-Changed names for classes to improve compatibility with the IBM classes.
+-Unified setup strings for MP3 and other audio files.
+-Lighttable folders: sometimes drawing of icons failed.
+
+V0.2.5 (16.02.2003)
+
+Media folder:
+-Popup menu on time control for changing display
+-New playlist editor
+-Shadows for fly over help
+
+MMClasses:
+-DLLs needed by specified players or editors weren't found if not in LIBPATH.
+-You may specify a different mp3 player
+-Fixed wrong icon size for standard classes in details view of light table folders.
+-Added support for animated folder icons in lightable folder
+-Templates were not drawn in light table folders icon view
+-Pause function for audio files
+-Fixed asscociations for image files.
+-Fixed image conversion.
+-Renamed REXX functions. The old names are still working but shouldn't be used longer.
+-Added new REXX function cwmmQueryImageInfo()
+-Added method cwmmQueryImageInfo().
+-ID3 tags of MP3 files weren't set when using setup strings. Only EAs were updated.
+-No more garbled characters with some players when reading the ID3 tags.
+-Black and white images are properly drawn in light table folder
+
+JPEG IO procedure:
+-Procedure now accepts 8 bit input images.
+
+
+V0.2.6 (02.07.2003)
+
+-Audio extensions added in the MM configuration notebook are recognized.
+-createcd compiled with VAC
+-helper progs statically linked.
+-No template for CWMMDataFile.
+-New FLAC class.
+-New EA MMNUMAUDIOBYTES containing the number of audio bytes of the file.
+-M3U playlist editor failed using M3U lists created by Rockbox.
+-Play menu for M3U objects.
+-Hilighting of play and pause buttons during device sharing corrected 
+-You can't start more than 3 audio files at a time now, preventing problems when a whole folder of audio objects was accidently selected.
+-Support for converting to OGG-Vorbis. Any future write enabled audio IO-Proc will be automatically supported now.
+-Default audio player replaced
+-Opening of folders with image files is faster now
+-Image spacing in lighttable folders improved
+-Image converter dialog had german resources in the english language version (obviously nobody cared...).
+-Preview in image converter
+-PNG image class
+-PNG files are recognized as image files. Automatic support of future image IO procs.
+-Only one INI file for MM class helpers.
+
+
+V0.2.7 (01.09.2003)
+
+-Renamed method cwmmAddWaveInformationPage() to cwmmAddAudioInformationPage().
+-Added container handle to parameter list of methods cwmmPlayTrack() and cwmmPauseTrack()
+-If several audio files in a folder are started at once they will be played consecutively. 
+-Image information in popup menu 
+-Added audio information for midi files in details view.
+-Audioplayer playback always started with default volume setting (70%).
+-Master volume item added to sys menu of audio player.
+-Language now derived from LANG setting not the country code.
+-URL of audio stream objects was truncated to 4 chars when reopening the settings.
+-Audio-Stream objects lost their type after changing settings.
+-Bitrate display for MP3 files if MMIOMP3 0.4.2 or above is installed.
+-Bitrate display for OGG files if MMIOOGG 0.3.1 or above is installed.
+-ID3 tag handling completely rewritten. Track information may be 256 bytes long per entry.
+ ID3 tags are handled separately now. 
+-Volume for audio files adjustable now. Volume menu no longer starts master volume.
+-Modified settings page handling for audio objects on CD
+-Added INI key to disable audio file scanning for certain drives.
+-Added INI key to disable ID3 tag reading for certain drives. 
+
+
+V0.2.7b (06.09.2003)
+
+-Skript creatobj.cmd for creation of CD players was broken.
+
+
+V0.2.8 (01.11.2004)
+
+-Icon view removed for media folders.
+-Icon view page removed for media folders. This removes it also from CD folders which never supported icon view anyway.
+-Compact view improved.
+-Track information in switch list and titles.
+-Opening of Media folder wasn't possible when settings already open.
+-Fixed a memory leak for image files.
+-Fixed deadlock when copying image files in light table folders.
+-Background bitmap deletion of image files to give memory back to the system.
+-English distribution included german help file for the classes.
+-Audio objects stopped playing after a second if not started from a folder.
+-Workaround for WPS crash with Timidity. No, It's still not working with the classes.
+-Fixed possible crash with abstract objects in light table folders.
+-Fixed CD querying for LVM systems (not for dynamically attached USB drives yet).
+-Audio file scanning now stops when folder is closed.
+-No scanning for CD tracks.
+-Video player didn't work at all.
+-ID3 info for artist was overwritten with the album name when using setup strings.
+-Trap when Quicktime for OS/2 was installed during scanning of MP3 files.
+-Marking image files as invalid for the WPS when caused a trap.
+-Only create thumbs when image is visible in container. Esp. useful when WPS-Wizard is installed.
+-When first creating ID3 tags the genre was always set to 'blues'.
+-CD objects are no longer created automatically. This will fix most lock ups people experienced.
+-Slide show program for displaying the contents of one or more directories
+
+
+Credits
+-------
+
+The Icons and graphics are (C) Klaus Staedtler-Przyborski. Thanks for
+fearless beta testing.
+
+The script for creation of a media folder tree is (c) Eirik Oeverby.
+
+
+License
+--------
+
+See license.txt
+
+ 
+Author
+------
+
+These classes are (C) 2001-2005 Chris Wohlgemuth.
+
+http://www.geocities.com/SiliconValley/Sector/5785/
+http://www.os2world.com/cdwriting
+
+
Index: /tags/CWMM-0.3.0_GA/install-global/eng/install.in_
===================================================================
--- /tags/CWMM-0.3.0_GA/install-global/eng/install.in_	(revision 213)
+++ /tags/CWMM-0.3.0_GA/install-global/eng/install.in_	(revision 213)
@@ -0,0 +1,42 @@
+[APPLICATION]
+NAME CW-Multimedia-Classes 0.2.9
+VERSION 0.2.9.0
+COPYRIGHT (C) Chris Wohlgemuth 2001-2005
+HOME http://www.os2world.com/cdwriting
+INTERNALNAME CWMMFULL
+TOTALSIZE 0
+INSTALLER 0.1.5.0
+DESCRIPTION New improved multimedia classes to replace the classes coming with MMOS2. New Classes to integrate MP3 and OGG files seemlessly into the WPS. After installation these files behave like any other audio file. For example a doubleclick starts playing. A Media-Folder class can be used as a MP3 player with the usual play controls and playlist support. CD player with FreeDB support.
+
+[DESCRIPTION]
+DESCRIPTION  New improved multimedia classes to replace the classes coming with MMOS2. New Classes to integrate MP3 and OGG files seemlessly into the WPS. After installation these files behave like any other audio file. For example a doubleclick starts playing. A Media-Folder class can be used as a MP3 player with the usual play controls and playlist support. CD player with FreeDB support.
+
+[LICENSE]
+FILE License
+
+[INSTALLPROFILES]
+CWMMFULL õ,õ Install Media-Folder AND multimedia classes õ,õ This option installs the new multimedia classes for WPS integration of MP3 and OGG files and the Media-Folder which serves as a player for any audio file known to OS/2. A CD player with FreeDB support is included.
+CWMM õ,õ Install new multimedia classes õ,õ Install new multimedia and classes to integrate MP3 and OGG files seemlessly into the WPS. After installation these files behave like any other audio file. For example a doubleclick starts playing. Information about the audio file (samplerate, playtime etc.) is shown in the details view of folders and in the settings notebook. The ID3 tags (V1.0) of MP3 files are changeable using a page of the settings notebook and also appear in the details view of folders.
+MEDIAFLD õ,õ Install Media-Folder (an audio player) õ,õ The Media-Folder class can be used as an MP3 or audio player. It has the usual play controls and playlist support. This player supports any audio file known to OS/2. Included is a CD player with FreeDB support.
+
+[CWMMFULL]
+CWMM, , ,S,[ ], CWMM-0_2_9-eng\CWmm.ins
+SLIDESHW, , ,S,[ ], Slide-Show\slideshoweng.ins
+MEDIAFLD, , ,S,[ ], CWMFldr-0_2_9-eng\mediafld.ins
+MFLDRSCR, , ,S,[ ], CWMFldr-0_2_9-eng\Skripte\mfldrscr.in_
+FREEDBCL, , ,S,[ ], CWMFldr-0_2_9-eng\freedb\freedb.ins
+[CWMM]
+CWMM, , ,S,[ ], CWMM-0_2_9-eng\CWmm.ins
+SLIDESHW, , ,S,[ ], Slide-Show\slideshoweng.ins
+[MEDIAFLD]
+MEDIAFLD, , ,S,[ ], CWMFldr-0_2_9-eng\mediafld.ins
+MFLDRSCR, , ,S,[ ], CWMFldr-0_2_9-eng\Skripte\mfldrscr.in_
+FREEDBCL, , ,S,[ ], CWMFldr-0_2_9-eng\freedb\freedb.ins
+
+[DEFAULTTARGET]
+PATH %APPS%\CWMMOS2
+
+[SKRIPTS]
+#This is a dummy entry so a message box appears at the very start
+#of the installation. The archive for Media-Folder contains a skript.
+
Index: /tags/CWMM-0.3.0_GA/install-global/ger/Liesmich.txt
===================================================================
--- /tags/CWMM-0.3.0_GA/install-global/ger/Liesmich.txt	(revision 213)
+++ /tags/CWMM-0.3.0_GA/install-global/ger/Liesmich.txt	(revision 213)
@@ -0,0 +1,405 @@
+1. CW-Multimedia-Klassen
+---------------------
+
+Dieses Paket ist ein kompletter Ersatz fr die
+Multimediaklassen von MMOS2. Sie sind robuster gegenber
+defekten Bilddateien oder fehlerhaften IO-Prozeduren.
+Das Konvertieren Men wurde erweitert.
+
+Neue Klassen sorgen fr eine nahtlose
+Integration der MMIO-Prozeduren von Russel O'Connor 
+fr MP3- und OGG-Dateien in die WPS. Download der
+DLLs unter:
+
+http://www.math.berkeley.edu/~roconnor/
+
+Nach Installation der Klassen verhalten sich Ogg- und
+MP3-Dateien auf der WPS wie alle anderen Audiodateien
+(z.B. Wavedateien). Sie haben ein eigenes Icon und die
+Mens der brigen Audiodateien. So startet z.B. ein
+Doppelklick die Wiedergabe ein weiterer stoppt sie.
+ber das 'Umsetzen'-Men knnen die Dateien einfach
+in Wavedateien umgesetzt werden.
+
+Zustzlich wird in die Eigenschaftendialoge aller
+Audiodateien eine Informationsseite ber die Datei
+eingefgt (Samplerate, Spieldauer etc.). Diese Daten
+erscheinen auch in der Detailansicht von Ordnern, wenn
+die Ansicht auf Klasse:CWAudio gesetzt wird.
+
+Im ffnen-Men ist zustzlich ein Eintrag fr Lautstrke.
+
+Bei MP3-Dateien lassen sich die ID3-Tags ber den
+Eigenschaftendialog anzeigen und verndern. Die ID3-Tags
+werden darberhinaus in der Detailansicht von Ordnern
+angezeigt.
+
+Eine neue JPEG-IO-Prozedur kann auch progressive JPEG-Bilder
+einlesen.
+
+
+2. Media-Folder und Audio-Referenzen
+------------------------------------
+
+Der Media-Folder ist ein Spieler fr alle OS/2
+bekannten Audiodateien. Die blichen Bedienelemente
+sind vorhanden und Playlisten knnen einfach durch
+Fallenlassen von Audiodateien auf den Ordner erstellt
+werden.
+
+Es werden dabei Audio-Referenzen erstellt, die sich wie
+normale Referenzen verhalten aber die Details der
+Audiodateien in der Detailansicht des Media-Folders
+anzeigen. Wenn WPS-Wizard V0.2.0 oder hher installiert ist,
+steht eine REXX-Untersttzung fr alle Funktionen zur
+Verfgung.
+
+Ebenfalls enthalten ist ein WPS integrierter CD Spieler
+mit FreeDB-Untersttzung.
+
+Neu mit V0.2.4 ist ein Skript (FldTree.cmd), daá aus
+einem Baum von Ordnern mit MP3-Dateien einen entsprechenden
+Baum mit Media-Ordnern erstellt, um die MP3-Dateien komfortabel
+abspielen zu knnen.
+Dieses Skript ist (c) Eirik Oeverby. Fr Kontaktinformationen
+siehe Kommentar im Skript.
+
+ACHTUNG: Vor der Benutzung ist der Pfad zum Desktop im Skript
+anzupassen!
+Danach einfach einen MP3-Baum auf das OBject im Multimedia-Ordner
+fallen lassen.
+
+
+3. Diaschau
+----------
+
+Mit V0.2.8 ist ein Diaschau-Programm enthalten, das den Inhalt eines oder
+mehrerer Ordner anzeigt.
+
+
+Installation
+------------
+
+Bevor Fragen und Gerchte auftauchen:
+
+JA, AUCH DIESE VERSION DER MULTIMEDIA-KLASSEN FUNKTIONIERT
+ZUSAMMEN MIT XWP, SO WIE JEDE ZUVOR AUCH!
+
+
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+
+Kopien der INI-Dateien anfertigen!!
+
+Kopien der INI-Dateien anfertigen!!
+
+Kopien der INI-Dateien anfertigen!!
+
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+
+
+Achtung:
+Falls WordPercekt fr OS/2 5.2(a) installiert ist, scheitert die Deregistrierung
+der IBM-Multimediaklassen und das System wird bei der Installation der neuen
+Klassen abstrzen. Daher zunchst dieses Programm deinstallieren und die
+INI-Dateien mit 'checkini /C' reinigen. Die Ursache fr dieses Problem ist
+unbekannt. 
+
+Die Dateien JPEGIO.DLL und MMPARTS.DLL im Verzeichnis MMOS2\DLL
+sichern, da diese whrend der Installation der Multimediaklassen
+berschrieben werden. Es werden zustzlich vom Installationsskript
+Kopien dieser DLLs fr eine automatische Reinstallation der originalen
+IBM-Klassen im Verzeichnis MMOS2\CWMMBack erstellt.
+
+ltere Versionen des Media-Ordners und der CWAudio-Klassen
+deinstallieren und das System anschlieáend neu starten.
+
+1. Das Archiv in einen Ordner entpacken
+2. Das Skript Runme1st.cmd starten.
+3. Die WPS neu starten. DIESEN SCHRITT NICHT AUSLASSEN!
+4. Die INI-Dateien mit 'Checkini.exe /C' (wptool32.zip auf http://hobbes.nmsu.edu) reinigen.
+5. Die WPS neu starten. DIESEN SCHRITT NICHT AUSLASSEN!
+6. install.exe starten. Das Programm kopiert die Dateien und installiert die Klassen.
+7. Nach einem WPS-Neustart stehen sie zur Verfgung.
+
+Sollte die WPS nicht starten, reicht es, das Installationsverzeichnis
+von einer Kommandozeile aus umzubenennen. Bei WPS-Startproblemen hat es
+sich als hilfreich erwiesen, zeitweise alle Objekte vom Desktop zu entfernen.
+
+Es wird empfohlen, die aktuelle Version der MMIOMP3 IO-Prozeduren
+(http://www.math.berkeley.edu/~roconnor/) zu verwenden. Die Behandlung
+von MP3-Dateien hat sich signifikant verbessert.
+ 
+
+Deinstallation
+--------------
+
+1. Die Klassen ber den Installer deinstallieren
+2. WPS neu starten. DIESEN SCHRITT NICHT AUSLASSEN!
+3. Die INI-Dateien mit 'Checkini.exe /C' (wptool32.zip auf http://hobbes.nmsu.edu) reinigen.
+4. Das Skript x:\MMOS2\CWMMBack\INSTIBM.CMD starten, um die IBM-Klassen
+ wieder zu installieren. x ist dabei das Bootlaufwerk.
+
+Nach einem Neustart der WPS stehen die Originalklassen wieder zur
+Verfgung.
+
+Mgliche Probleme
+-----------------
+
+Bei manchen VBR-MP3s wird die Spielzeit falsch angegeben. Dies
+ist ein Problem der MMIOMP3-Prozedur nicht der Klassen.
+
+MP3-Dateien werden mglicherweise nicht korrekt als solche erkannt.
+Dies tritt insbesondere auf, falls bereits eine Version der Klassen
+installiert war. In dem Fall den Ordner mit den MP3-Dateien auf
+das Skript \cwmm-x_x_x-lang\bin\RemoveEA.CMD fallen lassen. Der
+Ordner muá dabei geschlossen sein!
+Das Skript entfernt das .CLASSINFO-Attribut und setzt das korrekte
+.TYPE-Attribut.
+Bei Wave- und OGG-Dateien kommt es dabei zum Verlust eingetragener
+Track-Informationen. Diese Daten mssen daher gegebenenfalls gesichert
+werden.
+
+Die Audio-Stream-Klasse funktioniert ausschlieálich mit Icecast-Servern.
+Shoutcast wird nicht untersttzt.
+
+
+Programmfehler
+---------------
+
+Bugs knnen unter http://xtracker.netlabs.org unter 'Multimedia Extensions'
+gemeldet werden. 
+
+
+Weiteres
+--------
+
+Salvador Parra Camacho hat ein Programm geschrieben, um die versteckten
+Einstellungen (siehe Dokumentation) komfortabel verndern zu knnen. Die
+Homepage findet sich unter:
+
+http://www.geocities.com/escajarro/
+
+Direktes Herunterladen ist hier mglich:
+
+http://www.geocities.com/escajarro/soft/ccfg010z.zip   (Zip)
+http://www.geocities.com/escajarro/soft/ccfg010w.zip  (Wpi)
+
+
+Versionen
+---------
+
+V0.1.0
+
+First release of the new audio classes.
+
+V0.2.0
+
+-Type 'Digital Audio' returned in addition to MP3/OGGS for the audio classes.
+-Setting of .TYPE EA so Digital Audio player works with MP3/OGG files without further fiddling
+-Caching of MP3 technical data in EAs to speed up folder opening.
+-ID3 data shown with the right codepage.
+-Mnemonic for Volume menu item.
+
+-New classes CWMediaFolder and CWAudioShadow for playing of audio files.
+
+V0.2.1
+
+MMClasses:
+-A bunch of minor fixes.
+-No prereading of audio info for files on CD to speed up folder opening.
+
+Media folder:
+-Repeat function added
+-new (and improved) sliders
+-Keyboard control added (not for sliders yet)
+-Display for elapsed time, remaining time and ID3 tags (click to switch)
+-Change playtime font by DnD
+-Drag and drop handling rewritten.
+-Statusline added
+-REXX interface added
+-No audio info reading for files on CD to speed up CD opening. 
+
+V0.2.2 (29.03.2002)
+
+MMClasses:
+-New CD track class for FreeDB enabled CD player
+-Improved open function. See media folder documentation
+
+Media folder:
+-CD player object with FreeDB support added.
+-Some minor fixes.
+
+
+V0.2.3 (13.07.2002)
+
+MMClasses:
+-Added new replacement classes for audio, video and image files. The MMOS2 classes are
+ not used anymore.
+-Improved lighttable folder with selectable icon size.
+
+Media folder:
+-Added new replacement classes for audio, video and image files. The MMOS2 classes are
+ not used anymore.
+-Improved lighttable folder with selectable icon size.
+
+
+V0.2.4 (29.11.2002)
+
+Media folder:
+-Fixed PM-freeze with broken shadows.
+-Fixed problems when user deleted shadows during playing.
+-Repeat function was broken.
+-Device sharing didn't really work.
+-Random play added.
+-Launch area for objects.
+-Settings opening was only possible with closed folders 
+-Audio files are started on a separate thread.
+-Media folder will take over already playing files (very limited for now, only skip/stop).
+-CD-folder works for all drives not only default cd drive.
+
+MMClasses:
+-Added some more exception handlers.
+-Image details aren't read from CD unless key in INI file is set (see docs).
+-Titlebar of volume control may be hidden
+-Tabbing in volume control enabled
+-Save colors and position of volume control, audio- and image converter
+-Query audio information on a separate thread when awakening objects (speed boost for MP3)
+-Print menu removed for audio and video files.
+-Improved ID3 handling. ID3 V1.1 tracknumber is kept if present.
+-Elapsed time in icon titles when playing.
+-Changed names for classes to improve compatibility with the IBM classes.
+-Unified setup strings for MP3 and other audio files.
+-Lighttable folders: sometimes drawing of icons failed.
+
+
+V0.2.5 (16.02.2003)
+
+Media folder:
+-Popup menu on time control for changing display
+-New playlist editor
+-Shadows for fly over help
+
+MMClasses:
+-DLLs needed by specified players or editors weren't found if not in LIBPATH.
+-You may specify a different mp3 player
+-Fixed wrong icon size for standard classes in details view of light table folders.
+-Added support for animated folder icons in lightable folder
+-Templates were not drawn in light table folders icon view
+-Pause function for audio files
+-Fixed asscociations for image files.
+-Fixed image conversion.
+-Renamed REXX functions. The old names are still working but shouldn't be used longer.
+-Added new REXX function cwmmQueryImageInfo()
+-Added method cwmmQueryImageInfo().
+-ID3 tags of MP3 files weren't set when using setup strings. Only EAs were updated.
+-No more garbled characters with some players when reading the ID3 tags.
+-Black and white images are properly drawn in light table folder
+
+JPEG IO procedure:
+-Procedure now accepts 8 bit input images.
+
+
+V0.2.6 (02.07.2003)
+
+-Audio extensions added in the MM configuration notebook are recognized.
+-createcd compiled with VAC
+-helper progs statically linked.
+-No template for CWMMDataFile.
+-New FLAC class.
+-New EA MMNUMAUDIOBYTES containing the number of audio bytes of the file.
+-M3U playlist editor failed using M3U lists created by Rockbox.
+-Play menu for M3U objects.
+-Hilighting of play and pause buttons during device sharing corrected 
+-You can't start more than 3 audio files at a time now, preventing problems when a whole folder of audio objects was accidently selected.
+-Support for converting to OGG-Vorbis. Any future write enabled audio IO-Proc will be automatically supported now.
+-Default audio player replaced
+-Opening of folders with image files is faster now
+-Image spacing in lighttable folders improved
+-Image converter dialog had german resources in the english language version (obviously nobody cared...).
+-Preview in image converter
+-PNG image class
+-PNG files are recognized as image files. Automatic support of future image IO procs.
+-Only one INI file for MM class helpers.
+
+
+V0.2.7 (01.09.2003)
+
+-Renamed method cwmmAddWaveInformationPage() to cwmmAddAudioInformationPage().
+-Added container handle to parameter list of methods cwmmPlayTrack() and cwmmPauseTrack()
+-If several audio files in a folder are started at once they will be played consecutively. 
+-Image information in popup menu 
+-Added audio information for midi files in details view.
+-Audioplayer playback always started with default volume setting (70%).
+-Master volume item added to sys menu of audio player.
+-Language now derived from LANG setting not the country code.
+-URL of audio stream objects was truncated to 4 chars when reopening the settings.
+-Audio-Stream objects lost their type after changing settings.
+-Bitrate display for MP3 files if MMIOMP3 0.4.2 or above is installed.
+-Bitrate display for OGG files if MMIOOGG 0.3.1 or above is installed.
+-ID3 tag handling completely rewritten. Track information may be 256 bytes long per entry.
+ ID3 tags are handled separately now. 
+-Volume for audio files adjustable now. Volume menu no longer starts master volume.
+-Modified settings page handling for audio objects on CD
+-Added INI key to disable audio file scanning for certain drives.
+-Added INI key to disable ID3 tag reading for certain drives. 
+
+
+V0.2.7b (06.09.2003)
+
+-Skript creatobj.cmd for creation of CD players was broken.
+
+
+V0.2.8 (01.11.2004)
+
+-Icon view removed for media folders.
+-Icon view page removed for media folders. This removes it also from CD folders which never supported icon view anyway.
+-Compact view improved.
+-Track information in switch list and titles.
+-Opening of Media folder wasn't possible when settings already open.
+-Fixed a memory leak for image files.
+-Fixed deadlock when copying image files in light table folders.
+-Background bitmap deletion of image files to give memory back to the system.
+-English distribution included german help file for the classes.
+-Audio objects stopped playing after a second if not started from a folder.
+-Workaround for WPS crash with Timidity. No, It's still not working with the classes.
+-Fixed possible crash with abstract objects in light table folders.
+-Fixed CD querying for LVM systems (not for dynamically attached USB drives yet).
+-Audio file scanning now stops when folder is closed.
+-No scanning for CD tracks.
+-Video player didn't work at all.
+-ID3 info for artist was overwritten with the album name when using setup strings.
+-Trap when Quicktime for OS/2 was installed during scanning of MP3 files.
+-Marking image files as invalid for the WPS when caused a trap.
+-Only create thumbs when image is visible in container. Esp. useful when WPS-Wizard is installed.
+-When first creating ID3 tags the genre was always set to 'blues'.
+-CD objects are no longer created automatically. This will fix most lock ups people experienced.
+-Slide show program for displaying the contents of one or more directories
+
+
+Credits
+-------
+
+Die Icons und Graphiken sind (C) Klaus Staedtler-Przyborski. Vielen Dank auch
+fr furchtloses Betatesten.
+
+Das Skript zum Erstellen eines Media-Ordner-Baums ist
+(c) Eirik Oeverby.
+
+Lizenz
+------
+
+Diese Klassen drfen frei verwendet werden. Das Copyright verbleibt
+jedoch beim Author. Benutzung ausschlieálich auf eigene
+Gefahr. Es wird KEINE Verantwortung fr Datenverluste, Ehekrisen
+und sonstige unerfreuliche Ereignisse bernommen.
+
+ 
+Author
+------
+
+Diese Klassen sind (C) 2001-2005 Chris Wohlgemuth.
+
+http://www.geocities.com/SiliconValley/Sector/5785/
+http://www.os2world.com/cdwriting
+
+
Index: /tags/CWMM-0.3.0_GA/install-global/ger/Lizenz
===================================================================
--- /tags/CWMM-0.3.0_GA/install-global/ger/Lizenz	(revision 213)
+++ /tags/CWMM-0.3.0_GA/install-global/ger/Lizenz	(revision 213)
@@ -0,0 +1,67 @@
+Multimedia-Klassen
+---------------
+
+* * * * * A C H T U N G * * * * *
+
+In der Vergangenheit wurden die Klassen wiederholt
+und in z.T. extrem unsachlicher Art und Weise
+geschmht. Auch vor persnlichen Beleidigungen an
+mich als Author, die ich hier lieber nicht wiedergeben
+mchte, wurde dabei nicht zurck geschreckt,
+was angesichts eines kostenlosen Produkts schon
+erstaunt.
+
+Ich mchte an dieser Stelle daher ein paar Dinge klar stellen.
+
+1. Dies ist ein reines Freizeitprojekt und es besteht daher
+   kein Anspruch auf Untersttzung irgendwelcher Art, was
+   nicht heiát, daá es keine gibt.
+
+2. Wer glaubt, durch Beleidigungen und Schmhungen eine
+   Lsung fr seine Probleme zu bekommen, sollte mal
+   unter Menschen gehen, um zu lernen, was soziale
+   Kompetenz ist.
+
+3. Es gibt technische Grnde, warum einige Dinge so
+   implementiert sind, wie das der Fall ist.
+   Wem meine Lsungen nicht gefallen, soll einen besseren
+   Vorschlag machen, aber nicht meine Zeit mit akademischen
+   Diskussionen verschwenden, nur um das letzte Wort zu
+   behalten.
+
+4. Auch mein Tag hat nur 24 Stunden.
+
+5. Wenn das Paket nicht funktioniert, gibt es stets die
+   Mglichkeit, die originalen IBM-Klassen zu verwenden.
+   Niemand ist gezwungen diese Klassen zu verwenden!
+
+* * * * * A C H T U N G * * * * *
+
+
+Lizenz
+------
+
+Diese Klassen drfen frei verwendet werden. Das Copyright verbleibt
+jedoch beim Author. Benutzung ausschlieálich auf eigene
+Gefahr. Es wird KEINE Verantwortung fr Datenverluste, Ehekrisen
+und sonstige unerfreuliche Ereignisse bernommen. Das Paket
+ist als Beta-Version zu verstehen und kann Fehler beinhalten, die zu
+Datenverlusten fhren. Es ist dementsprechend vor der Installation durch
+Datensicherung Vorsorge zu treffen.
+
+
+Author
+------
+
+Diese Klassen sind (C) 2001-2005 Chris Wohlgemuth.
+
+http://www.geocities.com/SiliconValley/Sector/5785/
+http://www.os2world.com/cdwriting
+
+
+Credits
+-------
+
+Die Graphiken sind (C) Klaus Staedtler-Przyborski. Vielen Dank auch
+fr furchtloses Betatesten.
+
Index: /tags/CWMM-0.3.0_GA/install-global/ger/install.in_
===================================================================
--- /tags/CWMM-0.3.0_GA/install-global/ger/install.in_	(revision 213)
+++ /tags/CWMM-0.3.0_GA/install-global/ger/install.in_	(revision 213)
@@ -0,0 +1,44 @@
+[APPLICATION]
+NAME CW-Multimedia-Classes 0.2.9
+VERSION 0.2.9.0
+COPYRIGHT (C) Chris Wohlgemuth 2001-2005
+HOME http://www.os2world.com/cdwriting
+INTERNALNAME CWMM
+TOTALSIZE 0
+INSTALLER 0.1.5.0
+DESCRIPTION Neue Multimediaklassen als Ersatz fr die Standardklassen mit erweiterten Funktionen. Neue Multimediaklassen fr eine nahtlose Integration von MP3- und OGG-Dateien in die WPS. Nach der Installation verhalten sich diese Audiodateien wie alle anderen. So startet ein Doppelklick die Wiedergabe und ein weiterer stoppt sie. Informationen ber die Datei wie Samplerate, Spielzeit usw. werden in der Detailansicht von Ordnern angezeigt und ebenso in den Einstellungen aller Audiodateien. Die ID3-Tags (V1.0) von MP3-Dateien lassen sich ber die Einstellungen ndern und erscheinen zustzlich in der Detailansicht. Eine neue Media-Ordner Klasse erlaubt das Abspielen von Audiodateien. Es stehen die blichen Bedienelemente zur Verfgung. Playlisten werden dabei untersttzt. CD-Spieler mit FreeDB-Untersttzung .
+
+[DESCRIPTION]
+DESCRIPTION  Neue Multimediaklassen als Ersatz fr die Standardklassen mit erweiterten Funktionen. Neue Multimediaklassen fr eine nahtlose Integration von MP3- und OGG-Dateien in die WPS. Nach der Installation verhalten sich diese Audiodateien wie alle anderen. So startet ein Doppelklick die Wiedergabe und ein weiterer stoppt sie. Informationen ber die Datei wie Samplerate, Spielzeit usw. werden in der Detailansicht von Ordnern angezeigt und ebenso in den Einstellungen aller Audiodateien. Die ID3-Tags (V1.0) von MP3-Dateien lassen sich ber die Einstellungen ndern und erscheinen zustzlich in der Detailansicht. Eine neue Media-Ordner Klasse erlaubt das Abspielen von Audiodateien. Es stehen die blichen Bedienelemente zur Verfgung. Playlisten werden dabei untersttzt. CD-Spieler mit FreeDB-Untersttzung .
+
+[LICENSE]
+FILE Lizenz
+
+[INSTALLPROFILES]
+CWMMFULL õ,õ Komplettinstallation Media-Ordner UND MM-klassen õ,õ Diese Option installiert die Multimediaklassen und die neuen Audioklassen fr eine nahtlose Integration von MP3- und OGG-Dateien in die WPS sowie den Media-Ordner zum Abspielen von Audiodateien und einen CD-Spieler mit FreeDB-Untersttzung.
+CWMM õ,õ Multimediaklassen Installation õ,õ Erweiterte Multimediaklassen und neue Klassen fr eine nahtlose Integration von MP3- und OGG-Dateien in die WPS. Nach der Installation verhalten sich diese Audiodateien wie alle anderen. So startet ein Doppelklick die Wiedergabe und ein weiterer stoppt sie. Informationen ber die Datei wie Samplerate, Spielzeit usw. werden in der Detailansicht von Ordnern angezeigt und ebenso in den Einstellungen aller Audiodateien. Die ID3-Tags (V1.0) von MP3-Dateien lassen sich ber die Einstellungen ndern und erscheinen zustzlich in der Detailansicht.
+MEDIAFLD õ,õ Installation des Media-Ordners (ein Audiospieler) õ,õ Die Media-Folder Klasse kann u.a. als MP3-Spieler verwendet werden. Die blichen Bedienelemente sind vorhanden und Playlisten werden untersttzt. Diese Klasse untersttzt alle von OS/2 untersttzten Audiodateien. Zustzlich enthalten ist ein CD-Spieler mit FreeDB-Untersttzung.
+
+[CWMMFULL]
+CWMM, , ,S,[ ], cwmm-0_2_9-ger\CWmm.ins
+SLIDESHW, , ,S,[ ], Slide-Show\slideshowger.ins
+MEDIAFLD, , ,S,[ ], CWMFldr-0_2_9-ger\mfldrger.ins
+MFLDRSCR, , ,S,[ ], CWMFldr-0_2_9-ger\Skripte\mfldrscr.in_
+FREEDBCL, , ,S,[ ], CWMFldr-0_2_9-ger\freedb\freedbgr.ins
+
+[CWMM]
+CWMM, , ,S,[ ], cwmm-0_2_9-ger\CWmm.ins
+SLIDESHW, , ,S,[ ], Slide-Show\slideshowger.ins
+
+[MEDIAFLD]
+MEDIAFLD, , ,S,[ ], CWMFldr-0_2_9-ger\mfldrger.ins
+MFLDRSCR, , ,S,[ ], CWMFldr-0_2_9-ger\Skripte\mfldrscr.in_
+FREEDBCL, , ,S,[ ], CWMFldr-0_2_9-ger\freedb\freedbgr.ins
+
+[DEFAULTTARGET]
+PATH %APPS%\CWMMOS2
+
+[SKRIPTS]
+#This is a dummy entry so a message box appears at the very start
+#of the installation. The archive for Media-Folder contains a skript.
+
Index: /tags/CWMM-0.3.0_GA/install-global/install/COPYING
===================================================================
--- /tags/CWMM-0.3.0_GA/install-global/install/COPYING	(revision 213)
+++ /tags/CWMM-0.3.0_GA/install-global/install/COPYING	(revision 213)
@@ -0,0 +1,32 @@
+/*
+ * Copyright (c) Chris Wohlgemuth 2001 
+ * All rights reserved.
+ *
+ * http://www.geocities.com/SiliconValley/Sector/5785/
+ * http://www.os2world.com/cdwriting
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. The authors name may not be used to endorse or promote products
+ *    derived from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ *
+ */
+
Index: /tags/CWMM-0.3.0_GA/install-global/install/cwinst.in_
===================================================================
--- /tags/CWMM-0.3.0_GA/install-global/install/cwinst.in_	(revision 213)
+++ /tags/CWMM-0.3.0_GA/install-global/install/cwinst.in_	(revision 213)
@@ -0,0 +1,26 @@
+[APPLICATION]
+NAME Generic installer
+VERSION 0.1.7.0
+COPYRIGHT (c) C. Wohlgemuth
+HOME http://www.geocities.com/SiliconValley/Sector/5785/
+INTERNALNAME CWINST
+TOTALSIZE 377282
+INSTALLER 0.1.0.0
+DESCRIPTION This is the Generic installer V0.1.7. It supports file copying, WPS classes, WPS objects, changes to the config.sys, INI file changes and complete deinstallation.
+
+[DESCRIPTION]
+DESCRIPTION  This is the Generic installer V0.1.7. It supports file copying, WPS classes, WPS objects, changes to the config.sys, INI file changes and complete deinstallation.
+
+[LICENSE]
+FILE COPYING
+
+[INSTALLPROFILES]
+GENINSTALL õ,õ Generic installer V0.1.7 õ,õ This installer keeps track of your system changes and may deinstall apps later on.
+
+[GENINSTALL]
+CWINST, , ,S,[ ], cwinst2.in_
+
+[DEFAULTTARGET]
+PATH %APPS%\cwinst
+
+
Index: /tags/CWMM-0.3.0_GA/it_nlv/about_ecs_en.dlg
===================================================================
--- /tags/CWMM-0.3.0_GA/it_nlv/about_ecs_en.dlg	(revision 213)
+++ /tags/CWMM-0.3.0_GA/it_nlv/about_ecs_en.dlg	(revision 213)
@@ -0,0 +1,27 @@
+#define VER_STRING "Media-Ordner V" \
+MFLDR_VERSION \
+BUILD_STRING
+
+ICON IDICON_FOLDER1  "../icons_ecs/mediafolder1.ico"
+
+DLGTEMPLATE IDDLG_ABOUT LOADONCALL MOVEABLE DISCARDABLE
+BEGIN
+    DIALOG  "Produkt Information", IDDLG_ABOUT, 100, 120, 194, 67, 
+            WS_VISIBLE, FCF_TITLEBAR
+    BEGIN
+        ICON            IDICON_FOLDER1, IDICON_FOLDER1, 10, 39, 16, 15, WS_GROUP
+        LTEXT           "Multimedia integration for the desktop", 
+                        IDST_PRODNAME, 38, 50, 154, 10, DT_WORDBREAK | NOT 
+                        WS_GROUP
+                        PRESPARAMS PP_FONTNAMESIZE, "9.WarpSans Bold"
+        CONTROL         "", 607, 38, 43, 154, 7, "CW_SEPARATOR", WS_VISIBLE
+        LTEXT           "(C) 2002-2004 Chris Wohlgemuth", IDST_PRODCOPY, 38, 
+                        29, 154, 11, DT_VCENTER | DT_WORDBREAK | NOT 
+                        WS_GROUP
+                        PRESPARAMS PP_FONTNAMESIZE, "9.WarpSans"
+        LTEXT           "Licensed to Serenity Systems", 608, 38, 19, 154, 9
+                        PRESPARAMS PP_FONTNAMESIZE, "9.WarpSans"
+        DEFPUSHBUTTON   "~Ok", IDSTR_CLOSETEXT, 38, 2, 34, 13
+    END
+END
+
Index: /tags/CWMM-0.3.0_GA/it_nlv/about_en.dlg
===================================================================
--- /tags/CWMM-0.3.0_GA/it_nlv/about_en.dlg	(revision 213)
+++ /tags/CWMM-0.3.0_GA/it_nlv/about_en.dlg	(revision 213)
@@ -0,0 +1,30 @@
+#define VER_STRING "Media-Ordner V" \
+MFLDR_VERSION \
+BUILD_STRING
+
+DLGTEMPLATE IDDLG_ABOUT LOADONCALL MOVEABLE DISCARDABLE
+BEGIN
+    DIALOG  "Product Information", IDDLG_ABOUT, 115, 69, 208, 132, 
+            WS_VISIBLE, FCF_TITLEBAR
+    BEGIN
+        GROUPBOX        "", IDGB_ABOUT, 3, 21, 200, 108
+;        CTEXT           "Media-Folder V0.2.9", IDST_PRODNAME, 36, 107, 135, 
+        CTEXT           VER_STRING, IDST_PRODNAME, 10, 107, 187, 
+                        12, DT_VCENTER | NOT WS_GROUP
+        CTEXT           "(C) Chris Wohlgemuth 2002/2003", IDST_PRODCOPY, 10, 87, 
+                        186, 12, DT_VCENTER | NOT WS_GROUP
+        CTEXT           "Graphics by Klaus Staedtler-Przyborski", 
+                        IDST_PRODGRAPHICS, 10, 64, 186, 17, DT_WORDBREAK | 
+                        NOT WS_GROUP
+        CTEXT           "http://www.geocities.com/SiliconValley/Sector/5785/"
+                        "index.html", IDST_URL1, 10, 46, 186, 18, 
+                        DT_WORDBREAK | NOT WS_GROUP
+                        PRESPARAMS PP_FONTNAMESIZE, "8.Helv"
+        CTEXT           "http://www.os2world.com/cdwriting", IDST_URL2, 10, 
+                        30, 186, 16, DT_WORDBREAK
+                        PRESPARAMS PP_FONTNAMESIZE, "8.Helv"
+        DEFPUSHBUTTON   "~Ok", DID_OK, 83, 3, 40, 14
+    END
+END
+
+
Index: /tags/CWMM-0.3.0_GA/make.inc
===================================================================
--- /tags/CWMM-0.3.0_GA/make.inc	(revision 213)
+++ /tags/CWMM-0.3.0_GA/make.inc	(revision 213)
@@ -0,0 +1,46 @@
+# List of languages to be built.
+LANGUAGES	=	de en es fr nl it ru tw
+
+#define the next makro if compiling a release rather than a beta
+#This will remove the build string from the about dialog
+export CWMMRELEASE	=	YES
+
+#define the next makro if compiling eCS. Undef if normal compile!
+#That's used for createcd.exe until I find a decent documentation for make to do it better...
+#Also used for including the right icons
+ECS_COMPILE	=	YES
+
+ifdef    ECS_COMPILE
+#         Don't use an empty string here!
+ECS		= ECS
+else
+#         Don't use an empty string here!
+ECS		= NO_ECS
+endif
+
+VERSION		=	0_3_0_GA
+VERSION_STRING	=	0.3.0.GA
+AUTHOR_STRING	=	"(C) Chris Wohlgemuth 2002-2005 Netlabs 2023-2025"
+BUILD_ROOT      =       U:/CWMM_Workspace/Trunk
+TOOLDIR         =       $(BUILD_ROOT)/tools
+GBMLIBPATH      =       U:/usr/lib/GBM
+
+# Put version in environment for REXX skripts
+export	MMCLSVERSION	=	$(VERSION_STRING)
+
+ifdef    ECS_COMPILE
+PKGNAME	= ecs-cw-mmclasses
+else
+PKGNAME	= cw-mmclasses
+endif
+
+ECSBASE = add2mmos2
+ECSCLASSDIR = MMClass
+ECSMFLDRDIR = MediaFld
+
+#The base dir off the CW function toolkit
+export COMMONSRC	=	$(BUILD_ROOT)/common_functions
+
+export NLVBASE		=	$(BUILD_ROOT)/nlv
+export MMSRCBASE	=	$(BUILD_ROOT)
+
Index: /tags/CWMM-0.3.0_GA/makefile
===================================================================
--- /tags/CWMM-0.3.0_GA/makefile	(revision 213)
+++ /tags/CWMM-0.3.0_GA/makefile	(revision 213)
@@ -0,0 +1,275 @@
+# Makefile
+
+include	./make.inc
+
+LANG	=	ger
+
+CLASSESNAME	= cwmm
+#JPGIONAME	= jpg-io-procedure
+#JPGIOVERSION	= 0_1_0
+
+
+OBJECTS	= 
+
+all:
+	@echo ''
+	@echo '[32;1;m********** Compiling classes... ***********[0;m'
+	@echo ''
+	cd ./classes && make
+	@echo ''
+	@echo '[32;1;m***** Compiling JPEG IO procedure... ******[0;m'
+	@echo ''
+	cd ./JPGPROC/source && make
+	@echo ''
+	@echo '[32;1;m******** Compiling media folder... ********[0;m'
+	@echo ''
+	cd ./mediafolder && make
+
+nlv_tst:
+#this is a target used to test NLV building outside the source tree
+# Will eventually superseed nlv target.
+	cd ./nlv && make
+
+nlv:
+	cd ./classes && make nlv
+	cd ./mediafolder && make nlv
+	@echo ''
+	@echo '[32;1;m******** Copying NLV files to ./nlv... ********[0;m'
+	@echo ''
+#This is just for your convenience...
+	-cp ./classes/res/dll/mmres_en.dll ./nlv-files/
+	-cp ./classes/res/dll/mmres_de.dll ./nlv-files/
+	-cp ./classes/help/de/cwmm049.hlp ./nlv-files/
+	-cp ./classes/help/en/cwmm.hlp ./nlv-files/
+	-cp ./mediafolder/help/*.hlp ./nlv-files/
+	-cp ./mediafolder/res/obj/*.dll ./nlv-files/
+	-cp ./mediafolder/c/cddb/*.dll ./nlv-files/
+	-cp ./mediafolder/prog_tutorial/*.inf ./nlv-files/
+
+clean:
+	-cd ./classes && make clean
+	-cd ./JPGPROC/source && make clean
+	-cd ./nlv-files && rm *
+	cd ./mediafolder && make clean
+
+cleaner:
+	-cd ./classes && make cleaner
+	-cd ./JPGPROC/source && make cleaner
+	cd ./mediafolder && make cleaner
+
+german:
+	@echo ''
+	@echo '[32;1;m** Creating german release package... ***[0;m'
+	@echo ''
+# base packet
+	-cd ../. && mkdir $(PKGNAME)-$(VERSION)-ger
+	cp ./install-global/FILE_ID.DIZ ../$(PKGNAME)-$(VERSION)-ger/
+	cp ./install-global/ger/Liesmich.txt ../$(PKGNAME)-$(VERSION)-ger/
+	cp ./install-global/ger/Lizenz ../$(PKGNAME)-$(VERSION)-ger/
+	cp ./install-global/ger/install.in_ ../$(PKGNAME)-$(VERSION)-ger/
+	cp ./install-global/Runme1st.cmd ../$(PKGNAME)-$(VERSION)-ger/
+	cp -R ./install-global/install ../$(PKGNAME)-$(VERSION)-ger/
+	cp ./install-global/install.exe ../$(PKGNAME)-$(VERSION)-ger/
+	cp ./install-global/cwinst2.in_ ../$(PKGNAME)-$(VERSION)-ger/
+	cp ./install-global/InstIBM.CMD  ../$(PKGNAME)-$(VERSION)-ger/install/
+# CW-Multimedia classes
+	-cd ../$(PKGNAME)-$(VERSION)-ger && mkdir $(CLASSESNAME)-$(VERSION)-ger
+#	-cd ../$(PKGNAME)-$(VERSION)-ger/$(CLASSESNAME)-$(VERSION)-ger && rm -r *
+	-cd ../$(PKGNAME)-$(VERSION)-ger/$(CLASSESNAME)-$(VERSION)-ger && mkdir bin
+	-cd ../$(PKGNAME)-$(VERSION)-ger/$(CLASSESNAME)-$(VERSION)-ger && mkdir DLL
+	cp ./classes/cwmm.dll ../$(PKGNAME)-$(VERSION)-ger/$(CLASSESNAME)-$(VERSION)-ger/
+#	-cd ../$(PKGNAME)-$(VERSION)-ger/$(CLASSESNAME)-$(VERSION)-ger && lxlite *.dll
+	cp ./classes/cwmm.sym ../$(PKGNAME)-$(VERSION)-ger/$(CLASSESNAME)-$(VERSION)-ger/
+	cp ./classes/mm-progs/audioconverter/audconv.exe ../$(PKGNAME)-$(VERSION)-ger/$(CLASSESNAME)-$(VERSION)-ger/bin/
+	cp ./classes/mm-progs/master_volume/volume.exe  ../$(PKGNAME)-$(VERSION)-ger/$(CLASSESNAME)-$(VERSION)-ger/bin/
+	cp ./classes/mm-progs/volume/classvol.exe  ../$(PKGNAME)-$(VERSION)-ger/$(CLASSESNAME)-$(VERSION)-ger/bin/
+	cp ./classes/mm-progs/imageconverter/imgconv.exe  ../$(PKGNAME)-$(VERSION)-ger/$(CLASSESNAME)-$(VERSION)-ger/bin/
+	cp ./classes/mm-progs/mmplayer/mmplayer.exe  ../$(PKGNAME)-$(VERSION)-ger/$(CLASSESNAME)-$(VERSION)-ger/bin/
+	cp ./classes/mm-progs/mmfind/mmfind.exe  ../$(PKGNAME)-$(VERSION)-ger/$(CLASSESNAME)-$(VERSION)-ger/bin/
+	cp ./classes/res/dll/mmres_DE.dll ../$(PKGNAME)-$(VERSION)-ger/$(CLASSESNAME)-$(VERSION)-ger/bin/
+#	cd ../$(PKGNAME)-$(VERSION)-ger/$(CLASSESNAME)-$(VERSION)-ger/bin && lxlite *
+	cp ./classes/bin/*.CMD ../$(PKGNAME)-$(VERSION)-ger/$(CLASSESNAME)-$(VERSION)-ger/bin/
+	cp ./classes/bin/*.rx ../$(PKGNAME)-$(VERSION)-ger/$(CLASSESNAME)-$(VERSION)-ger/bin/
+	cp ./classes/help/de/cwmm049.hlp ../$(PKGNAME)-$(VERSION)-ger/$(CLASSESNAME)-$(VERSION)-ger/cwmm.hlp
+	cp ./classes/doc_and_inst/ger/cwmm.ins ../$(PKGNAME)-$(VERSION)-ger/$(CLASSESNAME)-$(VERSION)-ger/
+# JPEG IO-Proc
+	cp ./JPGPROC/source/JPEGIO.DLL ../$(PKGNAME)-$(VERSION)-ger/$(CLASSESNAME)-$(VERSION)-ger/DLL/
+	cp ./JPGPROC/source/JPEGIO.SYM ../$(PKGNAME)-$(VERSION)-ger/$(CLASSESNAME)-$(VERSION)-ger/DLL/
+	cp ./JPGPROC/DLL/GBM.DLL ../$(PKGNAME)-$(VERSION)-ger/$(CLASSESNAME)-$(VERSION)-ger/DLL/
+#	cd ../$(PKGNAME)-$(VERSION)-ger/$(CLASSESNAME)-$(VERSION)-ger/DLL && lxlite *.dll
+#Slide-show
+	cp -R ./Slide-Show ../$(PKGNAME)-$(VERSION)-ger/
+	rm ../$(PKGNAME)-$(VERSION)-ger/Slide-Show/slideshoweng.ins
+#Adding Media folder
+	@echo ''
+	@echo '[32;1;m*** Adding media folder to package... ***[0;m'
+	@echo ''
+	cd ./mediafolder && make german
+
+
+english:
+	@echo ''
+	@echo '[32;1;m** Creating english release package... ***[0;m'
+	@echo ''
+# base packet
+	-cd ../. && mkdir $(PKGNAME)-$(VERSION)-eng
+	cp ./install-global/FILE_ID.DIZ ../$(PKGNAME)-$(VERSION)-eng/
+	cp ./install-global/eng/Readme.1st ../$(PKGNAME)-$(VERSION)-eng/
+	cp ./install-global/eng/License ../$(PKGNAME)-$(VERSION)-eng/
+	cp ./install-global/eng/install.in_ ../$(PKGNAME)-$(VERSION)-eng/
+	cp ./install-global/Runme1st.cmd ../$(PKGNAME)-$(VERSION)-eng/
+	cp -R ./install-global/install ../$(PKGNAME)-$(VERSION)-eng/
+	cp ./install-global/install.exe ../$(PKGNAME)-$(VERSION)-eng/
+	cp ./install-global/cwinst2.in_ ../$(PKGNAME)-$(VERSION)-eng/
+	cp ./install-global/InstIBM.CMD  ../$(PKGNAME)-$(VERSION)-eng/install/
+# CW-Multimedia classes
+	-cd ../$(PKGNAME)-$(VERSION)-eng && mkdir $(CLASSESNAME)-$(VERSION)-eng
+#	-cd ../$(PKGNAME)-$(VERSION)-eng/$(CLASSESNAME)-$(VERSION)-eng && rm -r *
+	-cd ../$(PKGNAME)-$(VERSION)-eng/$(CLASSESNAME)-$(VERSION)-eng && mkdir bin
+	-cd ../$(PKGNAME)-$(VERSION)-eng/$(CLASSESNAME)-$(VERSION)-eng && mkdir DLL
+	cp ./classes/cwmm.dll ../$(PKGNAME)-$(VERSION)-eng/$(CLASSESNAME)-$(VERSION)-eng/
+	-cd ../$(PKGNAME)-$(VERSION)-eng/$(CLASSESNAME)-$(VERSION)-eng && lxlite *.dll
+	cp ./classes/cwmm.sym ../$(PKGNAME)-$(VERSION)-eng/$(CLASSESNAME)-$(VERSION)-eng/
+	cp ./classes/mm-progs/audioconverter/audconv.exe ../$(PKGNAME)-$(VERSION)-eng/$(CLASSESNAME)-$(VERSION)-eng/bin/
+	cp ./classes/mm-progs/master_volume/volume.exe  ../$(PKGNAME)-$(VERSION)-eng/$(CLASSESNAME)-$(VERSION)-eng/bin/
+	cp ./classes/mm-progs/volume/classvol.exe  ../$(PKGNAME)-$(VERSION)-eng/$(CLASSESNAME)-$(VERSION)-eng/bin/
+	cp ./classes/mm-progs/imageconverter/imgconv.exe  ../$(PKGNAME)-$(VERSION)-eng/$(CLASSESNAME)-$(VERSION)-eng/bin/
+	cp ./classes/mm-progs/mmplayer/mmplayer.exe  ../$(PKGNAME)-$(VERSION)-eng/$(CLASSESNAME)-$(VERSION)-eng/bin/
+	cp ./classes/mm-progs/mmfind/mmfind.exe  ../$(PKGNAME)-$(VERSION)-eng/$(CLASSESNAME)-$(VERSION)-eng/bin/
+	cp ./classes/res/dll/mmres_EN.dll ../$(PKGNAME)-$(VERSION)-eng/$(CLASSESNAME)-$(VERSION)-eng/bin/
+	cd ../$(PKGNAME)-$(VERSION)-eng/$(CLASSESNAME)-$(VERSION)-eng/bin && lxlite *
+	cp ./classes/bin/*.CMD ../$(PKGNAME)-$(VERSION)-eng/$(CLASSESNAME)-$(VERSION)-eng/bin/
+	cp ./classes/bin/*.rx ../$(PKGNAME)-$(VERSION)-eng/$(CLASSESNAME)-$(VERSION)-eng/bin/
+	cp ./classes/help/en/cwmm.hlp ../$(PKGNAME)-$(VERSION)-eng/$(CLASSESNAME)-$(VERSION)-eng/cwmm.hlp
+	cp ./classes/doc_and_inst/eng/cwmm.ins ../$(PKGNAME)-$(VERSION)-eng/$(CLASSESNAME)-$(VERSION)-eng/
+# JPEG IO-Proc
+	cp ./JPGPROC/source/JPEGIO.DLL ../$(PKGNAME)-$(VERSION)-eng/$(CLASSESNAME)-$(VERSION)-eng/DLL/
+	cp ./JPGPROC/source/JPEGIO.SYM ../$(PKGNAME)-$(VERSION)-eng/$(CLASSESNAME)-$(VERSION)-eng/DLL/
+	cp ./JPGPROC/DLL/GBM.DLL ../$(PKGNAME)-$(VERSION)-eng/$(CLASSESNAME)-$(VERSION)-eng/DLL/
+	cd ../$(PKGNAME)-$(VERSION)-eng/$(CLASSESNAME)-$(VERSION)-eng/DLL && lxlite *.dll
+#Slide-show
+	cp -R ./Slide-Show ../$(PKGNAME)-$(VERSION)-eng/
+	rm ../$(PKGNAME)-$(VERSION)-eng/Slide-Show/slideshowger.ins
+#Adding Media folder
+	@echo ''
+	@echo '[32;1;m*** Adding media folder to package... ***[0;m'
+	@echo ''
+	cd ./mediafolder && make english
+
+
+old_eng:
+	-cd ../. && mkdir $(PKGNAME)-$(VERSION)-eng
+	-cp ./install-global/FILE_ID.DIZ ../$(PKGNAME)-$(VERSION)-eng/
+	-cp ./install-global/eng/Readme.1st ../$(PKGNAME)-$(VERSION)-eng/
+	-cp ./install-global/eng/License ../$(PKGNAME)-$(VERSION)-eng/
+	-cp ./install-global/eng/install.in_ ../$(PKGNAME)-$(VERSION)-eng/
+	-cp ./install-global/Runme1st.cmd ../$(PKGNAME)-$(VERSION)-eng/
+	-cp ./install-global/install.exe ../$(PKGNAME)-$(VERSION)-eng/
+	-cp ./install-global/cwinst2.in_ ../$(PKGNAME)-$(VERSION)-eng/
+	-cp -R ./install-global/install ../$(PKGNAME)-$(VERSION)-eng/
+	-cp ./install-global/patchdll.exe ../$(PKGNAME)-$(VERSION)-eng/install/
+	-cp ./install-global/InstIBM.CMD  ../$(PKGNAME)-$(VERSION)-eng/install/
+# CW-Multimedia classes	
+	-cd ../$(PKGNAME)-$(VERSION)-eng && mkdir $(CLASSESNAME)-$(VERSION)-eng
+#	-cd ../$(PKGNAME)-$(VERSION)-eng/$(CLASSESNAME)-$(VERSION)-eng && rm -r *
+	-cd ../$(PKGNAME)-$(VERSION)-eng/$(CLASSESNAME)-$(VERSION)-eng && mkdir bin
+	-cd ../$(PKGNAME)-$(VERSION)-eng/$(CLASSESNAME)-$(VERSION)-eng && mkdir DLL
+	-cp ./classes/cwmm.dll ../$(PKGNAME)-$(VERSION)-eng/$(CLASSESNAME)-$(VERSION)-eng/
+	rc ./classes/res/001/cwaudio.res ../$(PKGNAME)-$(VERSION)-eng/$(CLASSESNAME)-$(VERSION)-eng/cwmm.dll
+	-cd ../$(PKGNAME)-$(VERSION)-eng/$(CLASSESNAME)-$(VERSION)-eng && lxlite *
+	-cp ./classes/cwmm.sym ../$(PKGNAME)-$(VERSION)-ger/$(CLASSESNAME)-$(VERSION)-eng/
+	-cp ./classes/mm-progs/audioconverter/audconv.exe ../$(PKGNAME)-$(VERSION)-eng/$(CLASSESNAME)-$(VERSION)-eng/bin/
+	rc ./classes/mm-progs/audioconverter/res/001/pmconv.res ../$(PKGNAME)-$(VERSION)-eng/$(CLASSESNAME)-$(VERSION)-eng/bin/audconv.exe
+	-cp ./classes/mm-progs/volume/volume.exe  ../$(PKGNAME)-$(VERSION)-eng/$(CLASSESNAME)-$(VERSION)-eng/bin/
+	rc ./classes/mm-progs/volume/res/001/volume.res ../$(PKGNAME)-$(VERSION)-eng/$(CLASSESNAME)-$(VERSION)-eng/bin/volume.exe
+	-cp ./classes/mm-progs/imageconverter/imgconv.exe  ../$(PKGNAME)-$(VERSION)-eng/$(CLASSESNAME)-$(VERSION)-eng/bin/
+	rc ./classes/mm-progs/imageconverter/res/001/pmconv.res ../$(PKGNAME)-$(VERSION)-eng/$(CLASSESNAME)-$(VERSION)-eng/bin/imgconv.exe
+	-cp ./classes/mm-progs/mmplayer/mmplayer.exe  ../$(PKGNAME)-$(VERSION)-eng/$(CLASSESNAME)-$(VERSION)-eng/bin/
+	rc ./classes/mm-progs/mmplayer/res/001/pmconv.res ../$(PKGNAME)-$(VERSION)-eng/$(CLASSESNAME)-$(VERSION)-eng/bin/mmplayer.exe
+	-cd ../$(PKGNAME)-$(VERSION)-eng/$(CLASSESNAME)-$(VERSION)-eng/bin && lxlite *
+	-cp ./classes/help/001/cwmm.hlp ../$(PKGNAME)-$(VERSION)-eng/$(CLASSESNAME)-$(VERSION)-eng/cwmm.hlp
+	-cp ./classes/doc_and_inst/eng/Readme.eng ../$(PKGNAME)-$(VERSION)-eng/$(CLASSESNAME)-$(VERSION)-eng/
+	-cp ./classes/doc_and_inst/eng/license ../$(PKGNAME)-$(VERSION)-eng/$(CLASSESNAME)-$(VERSION)-eng/
+	-cp ./classes/doc_and_inst/eng/cwmm.ins ../$(PKGNAME)-$(VERSION)-eng/$(CLASSESNAME)-$(VERSION)-eng/
+	-cp ./classes/doc_and_inst/FILE_ID.DIZ ../$(PKGNAME)-$(VERSION)-eng/$(CLASSESNAME)-$(VERSION)-eng/
+	-cp ./classes/doc_and_inst/installmm.cmd ../$(PKGNAME)-$(VERSION)-eng/$(CLASSESNAME)-$(VERSION)-eng/bin
+	-cp ./classes/doc_and_inst/uninstmm.cmd ../$(PKGNAME)-$(VERSION)-eng/$(CLASSESNAME)-$(VERSION)-eng/bin
+	-cp ./classes/bin/*.CMD ../$(PKGNAME)-$(VERSION)-eng/$(CLASSESNAME)-$(VERSION)-eng/bin/
+	-cp ./classes/bin/*.rx ../$(PKGNAME)-$(VERSION)-eng/$(CLASSESNAME)-$(VERSION)-eng/bin/
+# JPEG IO-Proc
+	-cp ./JPGPROC/source/JPEGIO.DLL ../$(PKGNAME)-$(VERSION)-eng/$(CLASSESNAME)-$(VERSION)-eng/DLL/
+	-cp ./JPGPROC/source/JPEGIO.SYM ../$(PKGNAME)-$(VERSION)-eng/$(CLASSESNAME)-$(VERSION)-eng/DLL/
+	-cp ./JPGPROC/DLL/GBM.DLL ../$(PKGNAME)-$(VERSION)-eng/$(CLASSESNAME)-$(VERSION)-eng/DLL/
+	-cd ../$(PKGNAME)-$(VERSION)-eng/$(CLASSESNAME)-$(VERSION)-eng/DLL && lxlite *.dll
+
+
+distribution:
+	make 
+	make  german
+	make  english
+#mediafolder
+	@echo ''
+	@echo '[32;1;m*** Adding media folder to packages... ***[0;m'
+	@echo ''
+	cd ./mediafolder && make distribution
+
+
+
+ecsenglish:
+	@echo '[32;1;m******* Packaging MM classes... *********[0;m'
+# base packet
+	-cd ../. && mkdir $(ECSBASE)-eng
+	-cd ../$(ECSBASE)-eng && mkdir DLL
+# CW-Multimedia classes	
+	-cd ../$(ECSBASE)-eng && mkdir $(ECSCLASSDIR)
+#	-cd ../$(PKGNAME)-$(VERSION)-eng/$(CLASSESNAME)-$(VERSION)-eng && rm -r *
+	-cd ../$(ECSBASE)-eng/$(ECSCLASSDIR) && mkdir bin
+	-cp ./classes/cwmm.dll ../$(ECSBASE)-eng/$(ECSCLASSDIR)/
+	rc ./classes/res/001/cwaudio.res ../$(ECSBASE)-eng/$(ECSCLASSDIR)/cwmm.dll
+	-cd ../$(ECSBASE)-eng/$(ECSCLASSDIR) && lxlite *
+	-cp ./classes/mm-progs/audioconverter/audconv.exe ../$(ECSBASE)-eng/$(ECSCLASSDIR)/bin/
+	rc ./classes/mm-progs/audioconverter/res/001/pmconv.res ../$(ECSBASE)-eng/$(ECSCLASSDIR)/bin/audconv.exe
+	-cp ./classes/mm-progs/volume/volume.exe  ../$(ECSBASE)-eng/$(ECSCLASSDIR)/bin/
+	rc ./classes/mm-progs/volume/res/001/volume.res ../$(ECSBASE)-eng/$(ECSCLASSDIR)/bin/volume.exe
+	-cp ./classes/mm-progs/imageconverter/imgconv.exe  ../$(ECSBASE)-eng/$(ECSCLASSDIR)/bin/
+	rc ./classes/mm-progs/imageconverter/res/001/pmconv.res ../$(ECSBASE)-eng/$(ECSCLASSDIR)/bin/imgconv.exe
+	-cd ../$(ECSBASE)-eng/$(ECSCLASSDIR)/bin && lxlite *
+	-cp ./classes/help/001/cwmm.hlp ../$(ECSBASE)-eng/$(ECSCLASSDIR)/cwmm.hlp
+	-cp ./classes/bin/*.CMD ../$(ECSBASE)-eng/$(ECSCLASSDIR)/bin/
+	-cp ./classes/bin/*.rx ../$(ECSBASE)-eng/$(ECSCLASSDIR)/bin/
+# JPEG IO-Proc
+	-cp ./JPGPROC/source/JPEGIO.DLL ../$(ECSBASE)-eng/DLL/
+	-cp ./JPGPROC/source/JPEGIO.SYM ../$(ECSBASE)-eng/DLL/
+	-cp ./JPGPROC/DLL/GBM.DLL ../$(ECSBASE)-eng/DLL/
+	-cd ../$(ECSBASE)-eng/DLL && lxlite *.dll
+
+
+
+ecsdistribution:
+	@echo ''
+	@echo '[36;1;m*****************************************[0;m'
+	@echo 'Creating eCS multimedia class package...'
+	@echo '[36;1;m*****************************************[0;m'
+	@echo ''
+	make -s
+	make -s ecsenglish
+#mediafolder
+	cd ./mediafolder && make -s ecsdistribution
+#Documentation for eCS
+	-cp ./add2FOURMEG.SCR ../$(ECSBASE)-eng/
+
+
+
+help:
+	@echo ''
+	@echo 'make:                    Compile english and german NLV.'
+	@echo ''
+	@echo 'make distribution:       create CW-Multimedia class package'
+	@echo '                         in english and german.'
+	@echo ''
+	@echo 'make ecsdistribution:    create eCS Multimedia class package'
+	@echo '                         to be added to eCS base system in'
+	@echo '                         english and german.'
+
+bld:
+	@build.cmd
Index: /tags/CWMM-0.3.0_GA/mediafolder/Help/makefile
===================================================================
--- /tags/CWMM-0.3.0_GA/mediafolder/Help/makefile	(revision 213)
+++ /tags/CWMM-0.3.0_GA/mediafolder/Help/makefile	(revision 213)
@@ -0,0 +1,40 @@
+# Makefile for Audio-CD-Creator Data-CD-Creator
+
+include ../../make.inc
+
+
+RESDIR	=	..\res\$(LANGUAGE)
+RESBASE2=	../res
+RESDIR2	=	../res/$(LANGUAGE)
+
+HELPSOURCE	=	$(RESDIR2)/ipf
+
+
+all:	mediafldr.hlp
+	
+mediafldr.hlp:	mediafldr.ipf mediafldr049.ipf mediafldr031.ipf mediafldr039.ipf \
+               mediafldr033.ipf mediafldr034.ipf \
+		mediafldr_ecs.ipf mediafldr049_ecs.ipf mediafldr031_ecs.ipf mediafldr039_ecs.ipf \
+               mediafldr033_ecs.ipf
+
+	ipfc -C:850 -L:ENG -D:1  mediafldr.ipf mediafldr.hlp
+	ipfc -C:866 -L:RUS -D:7  mediafldr007.ipf mediafldr007.hlp
+	ipfc -C:850 -L:DEU -D:49 mediafldr049.ipf mediafldr049.hlp
+	ipfc -C:850 -L:NLD -D:31 mediafldr031.ipf mediafldr031.hlp
+	ipfc -C:850 -L:ITA -D:39 mediafldr039.ipf mediafldr039.hlp
+	ipfc -C:950 -L:TWN -D:88 mediafldr088.ipf mediafldr088.hlp
+	ipfc -C:850 -L:FRA -D:33 mediafldr033.ipf mediafldr033.hlp
+	ipfc -C:850 -L:ESP -D:34 mediafldr034.ipf mediafldr034.hlp
+
+clean:
+	-rm *.hlp
+
+cleaner:
+	-rm *.*~
+	-rm *.flc
+
+distger:
+
+disteng:
+
+distribution:
Index: /tags/CWMM-0.3.0_GA/mediafolder/Help/mediafldr.ipf
===================================================================
--- /tags/CWMM-0.3.0_GA/mediafolder/Help/mediafldr.ipf	(revision 213)
+++ /tags/CWMM-0.3.0_GA/mediafolder/Help/mediafldr.ipf	(revision 213)
@@ -0,0 +1,231 @@
+:userdoc.
+
+:docprof toc=123456.
+
+:title.Help for Media Folder distribution
+
+.* ----------------------------------------------------------------------------
+:h1 res=100 name=mplayer
+    x=left y=bottom width=100% height=100%.Media player
+
+This object is a Media folder. Drag one or more audio files into it for
+playing. To reorder, ensure that View | Sort > Always maintain sort order option
+is deselected, as well as any other sort options which might affect manual
+ordering, and drag and drop tracks into the folder as desired.
+
+:p.Use the buttons or :link reftype=hd refid=mkeyboard.Keyboard:elink. to
+control playback. The Repeat checkbox will cause the currently selected track to
+continuously replay. The Random checkbox will select tracks arbitrarily, unless
+the Repeat checkbox has been set.
+
+:p.More information and updates&colon.
+
+:p.https&colon.//trac.netlabs.org/cwmmclasses/wiki
+
+:nt.
+A suitable MP3 MMIOProc is required in order to play MP3 files, as is a suitable
+MMIOProc for Ogg (Vorbis and FLAC) files. These are included in the MMAudio Pak
+2, available from&colon.
+
+:p.http&colon.//r6.ca/MMAudioPak/
+
+:p.(Ogg formats are supported by default in ArcaOS 5.x and above.)
+:ent.
+
+.* ----------------------------------------------------------------------------
+:h2 res=110 name=mview
+    x=left y=bottom width=100% height=100%.View options
+
+By default, Media folders are displayed in Details view, listing track-
+specific details for each file or object which has been added to the main
+folder.
+
+:p.To switch to Compact view, select View | Compact from the main menu. In this
+mode, the folder content is hidden, however,
+:link reftype=hd refid=mlaunchpad.Launchpad:elink. buttons will be visible.
+
+:note text='Tip:'.Select files to play contiguously, reordering folder content
+if necessary, click :hp2.Play:ehp2., and then change the view to Compact.
+
+.* ----------------------------------------------------------------------------
+:h2 res=120 name=mkeyboard
+    x=left y=bottom width=100% height=100%.Keyboard control
+
+Use the following keys to control the Media folder. The buttons in the upper
+part of the folder must have focus when using these keys. Use
+:hp2.&lt.Tab&gt.:ehp2. to switch the focus from the container to the buttons.
+
+:ul compact.
+:li.:hp2.B:ehp2.ack
+:li.:hp2.S:ehp2.top
+:li.:hp2.P:ehp2.ause
+:li.P:hp2.l:ehp2.ay
+:li.:hp2.N:ehp2.ext
+:li.:hp2.R:ehp2.epeat
+:li.R:hp2.a:ehp2.ndom
+:eul.
+
+.* ----------------------------------------------------------------------------
+:h2 res=130 name=mvolume
+    x=left y=bottom width=100% height=100%.Volume slider
+
+Below the player buttons is the Volume slider. This controls the volume level
+for playback, within the limits set by the Master volume control for the system.
+
+.* ----------------------------------------------------------------------------
+:h2 res=140 name=mtrackpos
+    x=left y=bottom width=100% height=100%.Track position slider
+
+To the right of the player buttons is the Track position slider. Drag the
+slider forward or back to reposition the playback point of the current file.
+
+.* ----------------------------------------------------------------------------
+:h2 res=150 name=mlaunchpad
+    x=left y=bottom width=100% height=100%.Launchpad
+
+Toward the lower left of the player folder is a square box. Drag and drop a
+media file on the Launchpad to add it to the palette. The filename is displayed
+in the button's tooltip. Drag and drop additional files in between existing
+items in the Launchpad or to the right of the last item. Click any one of these
+to begin playing it.
+
+:p.The Launchpad is common across all Media, CD player, and M3U playlist
+folders.
+
+:note.When play is started in this manner, the
+:link reftype=hd refid=mtrackpos.Track position slider:elink. does not reflect
+the current playback state, and the player buttons do not control playback. Use
+the button's context menu to control playback, instead.
+
+:warning.While it is possible to add MP3, Ogg, and other digital media files to
+the Launchpad, do not add CD tracks here. CD tracks will not be playable from
+the Launchpad.
+
+.* ----------------------------------------------------------------------------
+:h1 res=200 name=cplayer
+    x=left y=bottom width=100% height=100%.CD player
+
+This object is a CD player with CDDB support. Track titles and other metadata
+are queried from a configured FreeDB-compatible server if an internet connection
+is available.
+
+:p.More information and updates&colon.
+
+:p.https&colon.//trac.netlabs.org/cwmmclasses/wiki
+
+:nt.
+Most CDDB servers follow the FreeDB practice of requiring a valid email address
+for access. Use the CDDB Client configuration object in the Multimedia folder
+to set this.
+:ent.
+
+.* ----------------------------------------------------------------------------
+:h2 res=210 name=cview
+    x=left y=bottom width=100% height=100%.View options
+
+By default, the CD player is displayed in Details view, listing details for each
+track on the mounted disc.
+
+:p.To switch to Compact view, select View | Compact from the main menu. In this
+mode, the folder content is hidden, however,
+:link reftype=hd refid=claunchpad.Launchpad:elink. buttons will be visible.
+
+:note text='Tip:'.Select the first track to be played, click :hp2.Play:ehp2., and
+then change the view to Compact.
+
+.* ----------------------------------------------------------------------------
+:h2 res=220 name=ckeyboard
+    x=left y=bottom width=100% height=100%.Keyboard control
+
+Use the following keys to control the CD Player. The buttons in the upper
+part of the player must have focus when using these keys. Use
+:hp2.&lt.Tab&gt.:ehp2. to switch the focus from the container to the buttons.
+
+:ul compact.
+:li.:hp2.B:ehp2.ack
+:li.:hp2.S:ehp2.top
+:li.:hp2.P:ehp2.ause
+:li.P:hp2.l:ehp2.ay
+:li.:hp2.N:ehp2.ext
+:li.:hp2.R:ehp2.epeat
+:eul.
+
+.* ----------------------------------------------------------------------------
+:h2 res=230 name=cvolume
+    x=left y=bottom width=100% height=100%.Volume slider
+
+Below the player buttons is the Volume slider. This controls the volume level
+for playback, within the limits set by the Master volume control for the system.
+
+.* ----------------------------------------------------------------------------
+:h2 res=240 name=ctrackpos
+    x=left y=bottom width=100% height=100%.Track position slider
+
+To the right of the player buttons is the Track position slider. Drag the
+slider forward or back to reposition the playback point of the current track.
+
+.* ----------------------------------------------------------------------------
+:h2 res=250 name=claunchpad
+    x=left y=bottom width=100% height=100%.Launchpad
+
+Toward the lower left of the player folder is a square box. Drag and drop a
+media file on the Launchpad to add it to the palette. The filename is displayed
+in the button's tooltip. Drag and drop additional files in between existing
+items in the Launchpad or to the right of the last item. Click any one of these
+to begin playing it.
+
+:p.The Launchpad is common across all Media, CD player, and M3U playlist
+folders.
+
+:note.When play is started in this manner, the
+:link reftype=hd refid=mtrackpos.Track position slider:elink. does not reflect
+the current playback state, and the player buttons do not control playback. Use
+the button's context menu to control playback, instead.
+
+:warning.While it is possible to add MP3, Ogg, and other digital media files to
+the Launchpad, do not add CD tracks here. CD tracks will not be playable from
+the Launchpad.
+
+.* ----------------------------------------------------------------------------
+:h1 res=300 name=peditor
+    x=left y=bottom width=100% height=100%.Playlist editor
+
+Use the Playlist editor to modify M3U playlists. An M3U playlist is a text
+file which contains paths (URLs) to the tracks it references.
+
+:p.M3U (Moving Picture Experts Group Audio Layer 3 Uniform Resource Locator) is
+a :hp1.de facto:ehp1. standard, generally recognized by most MP3 players.
+
+:p.To add tracks, simply drag and drop them into the editor. To reorder, ensure
+that :hp1.Always maintain sort order:ehp1. option on the :hp2.Sort:ehp2. submenu
+is deselected, as well as any other sort options which might affect manual
+ordering, and drag and drop the tracks as desired. Save the playlist by
+selecting :hp2.File | Save:ehp2. from the menu.
+
+:p.To create a new playlist, drag the M3U playlist template from the Multimedia
+Templates folder to a suitable location on the desktop.
+
+:p.More information and updates&colon.
+
+:p.https&colon.//trac.netlabs.org/cwmmclasses/wiki
+
+.* ----------------------------------------------------------------------------
+:h2 res=350 name=plaunchpad
+    x=left y=bottom width=100% height=100%.Launchpad
+
+Toward the lower left of the M3U playlist editor is a square box. Drag and drop
+a media file on the Launchpad to add it to the palette. The filename is
+displayed in the button's tooltip. Drag and drop additional files in between
+existing items in the Launchpad or to the right of the last item. Click any one
+of these to begin playing it.
+
+:p.The Launchpad is common across all Media, CD player, and M3U playlist
+folders.
+
+:note.Use the button's context menu to control playback.
+
+:warning.While it is possible to add MP3, Ogg, and other digital media files to
+the Launchpad, do not add CD tracks here. CD tracks will not be playable from
+the Launchpad.
+
+:euserdoc.
Index: /tags/CWMM-0.3.0_GA/mediafolder/Help/mediafldr007.ipf
===================================================================
--- /tags/CWMM-0.3.0_GA/mediafolder/Help/mediafldr007.ipf	(revision 213)
+++ /tags/CWMM-0.3.0_GA/mediafolder/Help/mediafldr007.ipf	(revision 213)
@@ -0,0 +1,241 @@
+:userdoc.
+
+:docprof toc=123456.
+
+:title.¯à ¢ª  ¯® à ¡®â¥ á Media Folder
+
+.* ----------------------------------------------------------------------------
+:h1 res=100 name=mplayer
+    x=left y=bottom width=100% height=100%.¥€š ¯«¥¥à
+
+â® ®¡ê¥ªâ Media Folder. ¥à¥â éšâ¥ ¢ ­¥£® ®€š­ š«š ­¥áª®«ìª®  ã€š®ä ©«®¢ €«ï
+¢®á¯à®š§¢¥€¥­šï. â®¡ë š§¬¥­šâì ¯®àï€®ª, ã¡¥€šâ¥áì, çâ® ­¥ ¢ë¡à ­
+'š€' | '®àâšà®¢ âì' > 'á¥£€  ¯®€€¥àŠš¢ âì ¯®àï€®ª á®àâšà®¢ªš'   â ªŠ¥ «î¡ë¥
+€àã£š¥ ¯ à ¬¥âàë á®àâšà®¢ªš, ª®â®àë¥ ¬®£ãâ ¯®¢«šïâì ­  àãç­®¥ ã¯®àï€®ç¥­š¥ š
+¯¥à¥â éšâ¥ €®à®Šªš ¢ ¯ ¯ªã ¢ ­ãŠ­®¬  ¬ ¯®àï€ª¥.
+
+:p.á¯®«ì§ã©â¥ ª­®¯ªš š«š :link reftype=hd refid=mkeyboard.ª« ¢š âãàã:elink.
+€«ï ã¯à ¢«¥­šï ¢®á¯à®š§¢¥€¥­š¥¬. « Š®ª '®¢â®àšâì' § áâ ¢šâ â¥ªãéš© ¢ë¡à ­­ë©
+âà¥ª ­¥¯à¥àë¢­® ¢®á¯à®š§¢®€šâìáï. « Š®ª 'à®š§¢®«ì­®' ¡ã€¥â ¢ë¡šà âì €®à®Šªš
+¯à®š§¢®«ì­®, ¥á«š ­¥ ãáâ ­®¢«¥­ ä« Š®ª '®¢â®àšâì'.
+
+:p.®¯®«­šâ¥«ì­ ï š­ä®à¬ æšï š ®¡­®¢«¥­šï&colon.
+
+:p.https&colon.//trac.netlabs.org/cwmmclasses/wiki
+
+:nt.
+«ï ¢®á¯à®š§¢¥€¥­šï ä ©«®¢ MP3 âà¥¡ã¥âáï ¯®€å®€ïéš© MP3 MMIOProc,   â ªŠ¥
+¯®€å®€ïéš© MMIOProc €«ï ä ©«®¢ Ogg (Vorbis š FLAC). ­š ¢ª«îç¥­ë ¢
+MMAudio Pak 2, €®áâã¯­ë© ­ &colon.
+
+:p.http&colon.//r6.ca/MMAudioPak/
+
+:p.(®à¬ â Ogg ¯®€€¥àŠš¢ ¥âáï ¯® ã¬®«ç ­šî ¢ Archos 5.x š ¢ëè¥.)
+:ent.
+
+.* ----------------------------------------------------------------------------
+:h2 res=110 name=mview
+    x=left y=bottom width=100% height=100%. à ¬¥âàë ¢š€ 
+
+® ã¬®«ç ­šî Media Folder ®â®¡à Š ¥âáï ¢ ä®à¬¥ ¯à¥€áâ ¢«¥­šï '®€à®¡­®'
+á ¯¥à¥çšá«¥­š¥¬ á¢¥€¥­š© ® ª Š€®© €®à®Šª¥ €«ï ª Š€®£® ä ©«  š«š ®¡ê¥ªâ ,
+€®¡ ¢«¥­­®£® ¢ ®á­®¢­ãî ¯ ¯ªã.
+
+:p.â®¡ë ¯¥à¥ª«îçšâìáï ­  ª®¬¯ ªâ­ë© ¢š€, ¢ë¡¥àšâ¥ 'š€' | '®¬¯ ªâ­ë©' ¢
+£« ¢­®¬ ¬¥­î.  íâ®¬ à¥Šš¬¥ á®€¥àŠš¬®¥ ¯ ¯ªš áªàëâ®, ®€­ ª® ª­®¯ªš
+:link reftype=hd refid=mlaunchpad. ­¥«š § ¯ãáª :elink. ¡ã€ãâ ¢š€­ë.
+
+:note text='Tip:'.ë¡¥àšâ¥ ä ©«ë €«ï ¯®á«¥€®¢ â¥«ì­®£® ¢®á¯à®š§¢¥€¥­šï, ¯àš
+­¥®¡å®€š¬®áâš š§¬¥­š¢ ¯®àï€®ª á®€¥àŠš¬®£® ¯ ¯ªš, ­ Š¬šâ¥ :hp2.®á¯à®š§¢¥áâš:ehp2.
+  § â¥¬ š§¬¥­šâ¥ à¥Šš¬ ä®à¬ë ¯à¥€áâ ¢«¥­šï ­  '®¬¯ ªâ­ë©'.
+
+.* ----------------------------------------------------------------------------
+:h2 res=120 name=mkeyboard
+    x=left y=bottom width=100% height=100%.¯à ¢«¥­š¥ á ª« ¢š âãàë
+
+á¯®«ì§ã©â¥ á«¥€ãîéš¥ ª« ¢šèš €«ï ã¯à ¢«¥­šï Media Folder. ­®¯ªš ¢ ¢¥àå­¥©
+ç áâš ¯ ¯ªš €®«Š­ë š¬¥âì ä®ªãá ¯àš šá¯®«ì§®¢ ­šš íâšå ª« ¢šè. á¯®«ì§ã©â¥
+:hp2.&lt.Tab&gt.:ehp2. çâ®¡ë ¯¥à¥ª«îçšâì ä®ªãá á ª®­â¥©­¥à  ­  ª­®¯ªš.
+
+:ul compact.
+:li.:hp2.B:ehp2.ack
+:li.:hp2.S:ehp2.top
+:li.:hp2.P:ehp2.ause
+:li.P:hp2.l:ehp2.ay
+:li.:hp2.N:ehp2.ext
+:li.:hp2.R:ehp2.epeat
+:li.R:hp2.a:ehp2.ndom
+:eul.
+
+.* ----------------------------------------------------------------------------
+:h2 res=130 name=mvolume
+    x=left y=bottom width=100% height=100%.« ©€¥à £à®¬ª®áâš
+
+®€ ª­®¯ª ¬š ¯«¥¥à  ­ å®€šâáï ¯®«§ã­®ª £à®¬ª®áâš. ¥£ã«šàã¥â ãà®¢¥­ì £à®¬ª®áâš
+¢®á¯à®š§¢¥€¥­šï ¢ ¯à¥€¥« å, ãáâ ­®¢«¥­­ëå £« ¢­ë¬ à¥£ã«ïâ®à®¬ £à®¬ª®áâš ášáâ¥¬ë.
+
+.* ----------------------------------------------------------------------------
+:h2 res=140 name=mtrackpos
+    x=left y=bottom width=100% height=100%.« ©€¥à ¯®§šæšš ¢ âà¥ª¥
+
+¯à ¢  ®â ª­®¯®ª ¯«¥¥à  ­ å®€šâáï ¯®«§ã­®ª ¯®«®Š¥­šï ¢ âà¥ª¥. ¥à¥â éšâ¥
+¯®«§ã­®ª ¢¯¥àñ€ š«š ­ § €, çâ®¡ë ¯¥à¥¬¥áâšâì â®çªã ¢®á¯à®š§¢¥€¥­šï â¥ªãé¥£®
+ä ©« .
+
+.* ----------------------------------------------------------------------------
+:h2 res=150 name=mlaunchpad
+    x=left y=bottom width=100% height=100%. ­¥«ì § ¯ãáª 
+
+ «¥¢®¬ ­šŠ­¥¬ ã£«ã ¯ ¯ªš á ¯à®š£àë¢ â¥«¥¬ ­ å®€šâáï ª¢ €à â­ ï à ¬ª .
+¥à¥â éšâ¥ ¬¥€š ä ©« ­  ¯ ­¥«ì § ¯ãáª , çâ®¡ë €®¡ ¢šâì ¥£® ¢ ¯ «šâàã í«¥¬¥­â®¢
+¯ ­¥«š. ¬ï ä ©«  ®â®¡à Š ¥âáï ¢® ¢á¯«ë¢ îé¥© ¯®€áª §ª¥ ª­®¯ªš. ¥à¥â éšâ¥
+€®¯®«­šâ¥«ì­ë¥ ä ©«ë ¬¥Š€ã áãé¥áâ¢ãîéš¬š í«¥¬¥­â ¬š ¯ ­¥«š § ¯ãáª  š«š á¯à ¢ 
+®â ¯®á«¥€­¥£® í«¥¬¥­â . «šª­šâ¥ «î¡®© š§ ­šå, çâ®¡ë ­ ç âì ¢®á¯à®š§¢¥€¥­š¥.
+
+:p. ­¥«ì § ¯ãáª  ï¢«ï¥âáï ®¡é¥© €«ï ¢á¥å ®¡ê¥ªâ®¢ ã¯à ¢«¥­šï: Media Folder,
+CD-¯«¥¥à , š á¯šáª  ¢®á¯à®š§¢¥€¥­šï M3U.
+
+:note.®£€  ¢®á¯à®š§¢¥€¥­š¥ ­ çš­ ¥âáï â ªš¬ ®¡à §®¬,
+:link reftype=hd refid=mtrackpos.á« ©€¥à ¯®§šæšš ¢ âà¥ª¥:elink. ­¥ ®âà Š ¥â
+â¥ªãé¥¥ á®áâ®ï­š¥ ¢®á¯à®š§¢¥€¥­šï,   ª­®¯ªš ¯à®š£àë¢ â¥«ï ­¥ ã¯à ¢«ïîâ
+¢®á¯à®š§¢¥€¥­š¥¬. ¬¥áâ® íâ®£® šá¯®«ì§ã©â¥ ª®­â¥ªáâ­®¥ ¬¥­î ª­®¯ªš €«ï
+ã¯à ¢«¥­šï ¢®á¯à®š§¢¥€¥­š¥¬.
+
+:warning.®âï ­  ¯ ­¥«ì § ¯ãáª  ¬®Š­® €®¡ ¢«ïâì ä ©«ë MP3, Ogg š €àã£š¥
+æšäà®¢ë¥ ¬¥€š ä ©«ë, ­¥ €®¡ ¢«ï©â¥ áî€  €®à®Šªš ª®¬¯ ªâ-€šáª®¢. ®à®Šªš
+ª®¬¯ ªâ-€šáª  ­¥ ¡ã€ãâ ¢®á¯à®š§¢®€šâìáï á ¯ ­¥«š § ¯ãáª .
+
+.* ----------------------------------------------------------------------------
+:h1 res=200 name=cplayer
+    x=left y=bottom width=100% height=100%.CD-¯«¥¥à
+
+â®â ®¡ê¥ªâ ¯à¥€áâ ¢«ï¥â á®¡®© ¯à®š£àë¢ â¥«ì ª®¬¯ ªâ-€šáª®¢ á ¯®€€¥àŠª®© CDDB.
+ §¢ ­šï âà¥ª®¢ š €àã£š¥ ¬¥â € ­­ë¥ § ¯à èš¢ îâáï á ­ áâà®¥­­®£® á¥à¢¥à ,
+á®¢¬¥áâš¬®£® á FreeDB, ¥á«š €®áâã¯­® ¯®€ª«îç¥­š¥ ª ­â¥à­¥âã.
+
+:p.®¯®«­šâ¥«ì­ ï š­ä®à¬ æšï š ®¡­®¢«¥­šï&colon.
+
+:p.https&colon.//trac.netlabs.org/cwmmclasses/wiki
+
+:nt.
+®«ìèš­áâ¢® á¥à¢¥à®¢ CDDB á«¥€ãîâ ¯à ªâšª¥ FreeDB, âà¥¡ãï €«ï €®áâã¯ 
+€¥©áâ¢šâ¥«ì­ë©  €à¥á í«¥ªâà®­­®© ¯®çâë. á¯®«ì§ã©â¥ ®¡ê¥ªâ ª®­äš£ãà æšš ª«š¥­â 
+CDDB ¢ ¯ ¯ª¥ Multimedia, çâ®¡ë ­ áâà®šâì íâš ¯ à ¬¥âàë.
+:ent.
+
+.* ----------------------------------------------------------------------------
+:h2 res=210 name=cview
+    x=left y=bottom width=100% height=100%. à ¬¥âàë ¢š€ 
+
+® ã¬®«ç ­šî ¯à®š£àë¢ â¥«ì ª®¬¯ ªâ-€šáª®¢ ®â®¡à Š ¥âáï ¢ ä®à¬¥ ¯à¥€áâ ¢«¥­šï
+'®€à®¡­®' á® á¯šáª®¬ á¢¥€¥­š© €«ï ª Š€®© €®à®Šªš ­  á¬®­âšà®¢ ­­®¬ €šáª¥.
+
+:p.â®¡ë ¯¥à¥ª«îçšâìáï ­  ª®¬¯ ªâ­ë© ¢š€, ¢ë¡¥àšâ¥ 'š€' | '®¬¯ ªâ­ë©' ¢
+£« ¢­®¬ ¬¥­î.  íâ®¬ à¥Šš¬¥ á®€¥àŠš¬®¥ ¯ ¯ªš áªàëâ®, ®€­ ª® ª­®¯ªš
+:link reftype=hd refid=mlaunchpad. ­¥«š § ¯ãáª :elink. ¡ã€ãâ ¢š€­ë.
+
+:note text='Tip:'.ë¡¥àšâ¥ ä ©«ë €«ï ¯®á«¥€®¢ â¥«ì­®£® ¢®á¯à®š§¢¥€¥­šï, ¯àš
+­¥®¡å®€š¬®áâš š§¬¥­š¢ ¯®àï€®ª á®€¥àŠš¬®£® ¯ ¯ªš, ­ Š¬šâ¥ :hp2.®á¯à®š§¢¥áâš:ehp2.
+  § â¥¬ š§¬¥­šâ¥ à¥Šš¬ ä®à¬ë ¯à¥€áâ ¢«¥­šï ­  '®¬¯ ªâ­ë©'.
+
+.* ----------------------------------------------------------------------------
+:h2 res=220 name=ckeyboard
+    x=left y=bottom width=100% height=100%.¯à ¢«¥­š¥ á ª« ¢š âãàë
+
+á¯®«ì§ã©â¥ á«¥€ãîéš¥ ª« ¢šèš €«ï ã¯à ¢«¥­šï CD-¯«¥¥à®¬. ­®¯ªš ¢ ¢¥àå­¥©
+ç áâš ¯ ¯ªš €®«Š­ë š¬¥âì ä®ªãá ¯àš šá¯®«ì§®¢ ­šš íâšå ª« ¢šè. á¯®«ì§ã©â¥
+:hp2.&lt.Tab&gt.:ehp2. çâ®¡ë ¯¥à¥ª«îçšâì ä®ªãá á ª®­â¥©­¥à  ­  ª­®¯ªš.
+
+:ul compact.
+:li.:hp2.B:ehp2.ack
+:li.:hp2.S:ehp2.top
+:li.:hp2.P:ehp2.ause
+:li.P:hp2.l:ehp2.ay
+:li.:hp2.N:ehp2.ext
+:li.:hp2.R:ehp2.epeat
+:eul.
+
+.* ----------------------------------------------------------------------------
+:h2 res=230 name=cvolume
+    x=left y=bottom width=100% height=100%.« ©€¥à £à®¬ª®áâš
+
+®€ ª­®¯ª ¬š ¯«¥¥à  ­ å®€šâáï ¯®«§ã­®ª £à®¬ª®áâš. ¥£ã«šàã¥â ãà®¢¥­ì £à®¬ª®áâš
+¢®á¯à®š§¢¥€¥­šï ¢ ¯à¥€¥« å, ãáâ ­®¢«¥­­ëå £« ¢­ë¬ à¥£ã«ïâ®à®¬ £à®¬ª®áâš ášáâ¥¬ë.
+
+.* ----------------------------------------------------------------------------
+:h2 res=240 name=ctrackpos
+    x=left y=bottom width=100% height=100%.« ©€¥à ¯®§šæšš ¢ âà¥ª¥
+
+¯à ¢  ®â ª­®¯®ª ¯«¥¥à  ­ å®€šâáï ¯®«§ã­®ª ¯®«®Š¥­šï ¢ âà¥ª¥. ¥à¥â éšâ¥
+¯®«§ã­®ª ¢¯¥àñ€ š«š ­ § €, çâ®¡ë ¯¥à¥¬¥áâšâì â®çªã ¢®á¯à®š§¢¥€¥­šï â¥ªãé¥£®
+ä ©« .
+
+.* ----------------------------------------------------------------------------
+:h2 res=250 name=claunchpad
+    x=left y=bottom width=100% height=100%. ­¥«ì § ¯ãáª 
+
+ «¥¢®¬ ­šŠ­¥¬ ã£«ã ¯ ¯ªš á ¯à®š£àë¢ â¥«¥¬ ­ å®€šâáï ª¢ €à â­ ï à ¬ª .
+¥à¥â éšâ¥ ¬¥€š ä ©« ­  ¯ ­¥«ì § ¯ãáª , çâ®¡ë €®¡ ¢šâì ¥£® ¢ ¯ «šâàã í«¥¬¥­â®¢
+¯ ­¥«š. ¬ï ä ©«  ®â®¡à Š ¥âáï ¢® ¢á¯«ë¢ îé¥© ¯®€áª §ª¥ ª­®¯ªš. ¥à¥â éšâ¥
+€®¯®«­šâ¥«ì­ë¥ ä ©«ë ¬¥Š€ã áãé¥áâ¢ãîéš¬š í«¥¬¥­â ¬š ¯ ­¥«š § ¯ãáª  š«š á¯à ¢ 
+®â ¯®á«¥€­¥£® í«¥¬¥­â . «šª­šâ¥ «î¡®© š§ ­šå, çâ®¡ë ­ ç âì ¢®á¯à®š§¢¥€¥­š¥.
+
+:p. ­¥«ì § ¯ãáª  ï¢«ï¥âáï ®¡é¥© €«ï ¢á¥å ®¡ê¥ªâ®¢ ã¯à ¢«¥­šï: Media Folder,
+CD-¯«¥¥à , š á¯šáª  ¢®á¯à®š§¢¥€¥­šï M3U.
+
+:note.®£€  ¢®á¯à®š§¢¥€¥­š¥ ­ çš­ ¥âáï â ªš¬ ®¡à §®¬,
+:link reftype=hd refid=mtrackpos.á« ©€¥à ¯®§šæšš ¢ âà¥ª¥:elink. ­¥ ®âà Š ¥â
+â¥ªãé¥¥ á®áâ®ï­š¥ ¢®á¯à®š§¢¥€¥­šï,   ª­®¯ªš ¯à®š£àë¢ â¥«ï ­¥ ã¯à ¢«ïîâ
+¢®á¯à®š§¢¥€¥­š¥¬. ¬¥áâ® íâ®£® šá¯®«ì§ã©â¥ ª®­â¥ªáâ­®¥ ¬¥­î ª­®¯ªš €«ï
+ã¯à ¢«¥­šï ¢®á¯à®š§¢¥€¥­š¥¬.
+
+:warning.®âï ­  ¯ ­¥«ì § ¯ãáª  ¬®Š­® €®¡ ¢«ïâì ä ©«ë MP3, Ogg š €àã£š¥
+æšäà®¢ë¥ ¬¥€š ä ©«ë, ­¥ €®¡ ¢«ï©â¥ áî€  €®à®Šªš ª®¬¯ ªâ-€šáª®¢. ®à®Šªš
+ª®¬¯ ªâ-€šáª  ­¥ ¡ã€ãâ ¢®á¯à®š§¢®€šâìáï á ¯ ­¥«š § ¯ãáª .
+
+.* ----------------------------------------------------------------------------
+:h1 res=300 name=peditor
+    x=left y=bottom width=100% height=100%.¥€ ªâ®à ¯«¥©«šáâ 
+
+á¯®«ì§ã©â¥ à¥€ ªâ®à ¯«¥©«šáâ  €«ï š§¬¥­¥­šï á¯šáª®¢ ¢®á¯à®š§¢¥€¥­šï M3U.
+¯šá®ª ¢®á¯à®š§¢¥€¥­šï M3U ï¢«ï¥âáï â¥ªáâ®¢ë¬ ä ©«®¬, ª®â®àë© á®€¥àŠšâ ¯ãâš
+(URL) ª €®à®Šª ¬, ­  ª®â®àë¥ ®­ ááë« ¥âáï.
+
+:p.M3U (Moving Picture Experts Group Audio Layer 3 Uniform Resource Locator)
+ï¢«ï¥âáï áâ ­€ àâ®¬ €¥-ä ªâ®, ®¡é¥¯àš§­ ­­ë¬ €«ï ¡®«ìèš­áâ¢  MP3-¯«¥¥à®¢.
+
+:p.â®¡ë €®¡ ¢šâì âà¥ªš, ¯à®áâ® ¯¥à¥â éšâ¥ šå ¢ à¥€ ªâ®à.
+â®¡ë š§¬¥­šâì ¯®àï€®ª, ã¡¥€šâ¥áì, çâ® ­¥ ¢ë¡à ­ 'š€' | '®àâšà®¢ âì' >
+'á¥£€  ¯®€€¥àŠš¢ âì ¯®àï€®ª á®àâšà®¢ªš'   â ªŠ¥ «î¡ë¥ €àã£š¥ ¯ à ¬¥âàë
+á®àâšà®¢ªš, ª®â®àë¥ ¬®£ãâ ¯®¢«šïâì ­  àãç­®¥ ã¯®àï€®ç¥­š¥ š ¯¥à¥â éšâ¥ €®à®Šªš
+¢ ¯ ¯ªã ¢ ­ãŠ­®¬  ¬ ¯®àï€ª¥. ®åà ­šâ¥ á¯šá®ª ¢®á¯à®š§¢¥€¥­šï, ¢ë¡à ¢
+' ©«' | '®åà ­šâì' ¢ ¬¥­î.
+
+:p.â®¡ë á®§€ âì ­®¢ë© á¯šá®ª ¢®á¯à®š§¢¥€¥­šï, ¯¥à¥â éšâ¥ è ¡«®­ á¯šáª 
+¢®á¯à®š§¢¥€¥­šï M3U š§ ¯ ¯ªš ' ¡«®­ë ¬ã«ìâš¬¥€š ' ¢ ¯®€å®€ïé¥¥ ¬¥áâ® ­ 
+à ¡®ç¥¬ áâ®«¥.
+
+:p.®¯®«­šâ¥«ì­ ï š­ä®à¬ æšï š ®¡­®¢«¥­šï&colon.
+
+:p.https&colon.//trac.netlabs.org/cwmmclasses/wiki
+
+.* ----------------------------------------------------------------------------
+:h2 res=350 name=plaunchpad
+    x=left y=bottom width=100% height=100%. ­¥«ì § ¯ãáª 
+
+ «¥¢®¬ ­šŠ­¥¬ ã£«ã á¯šáª  ¢®á¯à®š§¢¥€¥­šï M3U ­ å®€šâáï ª¢ €à â­ ï à ¬ª .
+¥à¥â éšâ¥ ¬¥€š ä ©« ­  ¯ ­¥«ì § ¯ãáª , çâ®¡ë €®¡ ¢šâì ¥£® ¢ ¯ «šâàã í«¥¬¥­â®¢
+¯ ­¥«š. ¬ï ä ©«  ®â®¡à Š ¥âáï ¢® ¢á¯«ë¢ îé¥© ¯®€áª §ª¥ ª­®¯ªš. ¥à¥â éšâ¥
+€®¯®«­šâ¥«ì­ë¥ ä ©«ë ¬¥Š€ã áãé¥áâ¢ãîéš¬š í«¥¬¥­â ¬š ¯ ­¥«š § ¯ãáª  š«š á¯à ¢ 
+®â ¯®á«¥€­¥£® í«¥¬¥­â . «šª­šâ¥ «î¡®© š§ ­šå, çâ®¡ë ­ ç âì ¢®á¯à®š§¢¥€¥­š¥.
+
+:p. ­¥«ì § ¯ãáª  ï¢«ï¥âáï ®¡é¥© €«ï ¢á¥å ®¡ê¥ªâ®¢ ã¯à ¢«¥­šï: Media Folder,
+CD-¯«¥¥à , š á¯šáª  ¢®á¯à®š§¢¥€¥­šï M3U.
+
+:note.á¯®«ì§ã©â¥ ª®­â¥ªáâ­®¥ ¬¥­î ª­®¯ªš €«ï ã¯à ¢«¥­šï ¢®á¯à®š§¢¥€¥­š¥¬.
+
+:warning.®âï ­  ¯ ­¥«ì § ¯ãáª  ¬®Š­® €®¡ ¢«ïâì ä ©«ë MP3, Ogg š €àã£š¥
+æšäà®¢ë¥ ¬¥€š ä ©«ë, ­¥ €®¡ ¢«ï©â¥ áî€  €®à®Šªš ª®¬¯ ªâ-€šáª®¢. ®à®Šªš
+ª®¬¯ ªâ-€šáª  ­¥ ¡ã€ãâ ¢®á¯à®š§¢®€šâìáï á ¯ ­¥«š § ¯ãáª .
+
+:euserdoc.
Index: /tags/CWMM-0.3.0_GA/mediafolder/Help/mediafldr007_ecs.ipf
===================================================================
--- /tags/CWMM-0.3.0_GA/mediafolder/Help/mediafldr007_ecs.ipf	(revision 213)
+++ /tags/CWMM-0.3.0_GA/mediafolder/Help/mediafldr007_ecs.ipf	(revision 213)
@@ -0,0 +1,241 @@
+:userdoc.
+
+:docprof toc=123456.
+
+:title.¯à ¢ª  ¯® à ¡®â¥ á Media Folder
+
+.* ----------------------------------------------------------------------------
+:h1 res=100 name=mplayer
+    x=left y=bottom width=100% height=100%.¥€š ¯«¥¥à
+
+â® ®¡ê¥ªâ Media Folder. ¥à¥â éšâ¥ ¢ ­¥£® ®€š­ š«š ­¥áª®«ìª®  ã€š®ä ©«®¢ €«ï
+¢®á¯à®š§¢¥€¥­šï. â®¡ë š§¬¥­šâì ¯®àï€®ª, ã¡¥€šâ¥áì, çâ® ­¥ ¢ë¡à ­
+'š€' | '®àâšà®¢ âì' > 'á¥£€  ¯®€€¥àŠš¢ âì ¯®àï€®ª á®àâšà®¢ªš'   â ªŠ¥ «î¡ë¥
+€àã£š¥ ¯ à ¬¥âàë á®àâšà®¢ªš, ª®â®àë¥ ¬®£ãâ ¯®¢«šïâì ­  àãç­®¥ ã¯®àï€®ç¥­š¥ š
+¯¥à¥â éšâ¥ €®à®Šªš ¢ ¯ ¯ªã ¢ ­ãŠ­®¬  ¬ ¯®àï€ª¥.
+
+:p.á¯®«ì§ã©â¥ ª­®¯ªš š«š :link reftype=hd refid=mkeyboard.ª« ¢š âãàã:elink.
+€«ï ã¯à ¢«¥­šï ¢®á¯à®š§¢¥€¥­š¥¬. « Š®ª '®¢â®àšâì' § áâ ¢šâ â¥ªãéš© ¢ë¡à ­­ë©
+âà¥ª ­¥¯à¥àë¢­® ¢®á¯à®š§¢®€šâìáï. « Š®ª 'à®š§¢®«ì­®' ¡ã€¥â ¢ë¡šà âì €®à®Šªš
+¯à®š§¢®«ì­®, ¥á«š ­¥ ãáâ ­®¢«¥­ ä« Š®ª '®¢â®àšâì'.
+
+:p.®¯®«­šâ¥«ì­ ï š­ä®à¬ æšï š ®¡­®¢«¥­šï&colon.
+
+:p.https&colon.//trac.netlabs.org/cwmmclasses/wiki
+
+:nt.
+«ï ¢®á¯à®š§¢¥€¥­šï ä ©«®¢ MP3 âà¥¡ã¥âáï ¯®€å®€ïéš© MP3 MMIOProc,   â ªŠ¥
+¯®€å®€ïéš© MMIOProc €«ï ä ©«®¢ Ogg (Vorbis š FLAC). ­š ¢ª«îç¥­ë ¢
+MMAudio Pak 2, €®áâã¯­ë© ­ &colon.
+
+:p.http&colon.//r6.ca/MMAudioPak/
+
+:p.(®à¬ â Ogg ¯®€€¥àŠš¢ ¥âáï ¯® ã¬®«ç ­šî ¢ Archos 5.x š ¢ëè¥.)
+:ent.
+
+.* ----------------------------------------------------------------------------
+:h2 res=110 name=mview
+    x=left y=bottom width=100% height=100%. à ¬¥âàë ¢š€ 
+
+® ã¬®«ç ­šî Media Folder ®â®¡à Š ¥âáï ¢ ä®à¬¥ ¯à¥€áâ ¢«¥­šï '®€à®¡­®'
+á ¯¥à¥çšá«¥­š¥¬ á¢¥€¥­š© ® ª Š€®© €®à®Šª¥ €«ï ª Š€®£® ä ©«  š«š ®¡ê¥ªâ ,
+€®¡ ¢«¥­­®£® ¢ ®á­®¢­ãî ¯ ¯ªã.
+
+:p.â®¡ë ¯¥à¥ª«îçšâìáï ­  ª®¬¯ ªâ­ë© ¢š€, ¢ë¡¥àšâ¥ 'š€' | '®¬¯ ªâ­ë©' ¢
+£« ¢­®¬ ¬¥­î.  íâ®¬ à¥Šš¬¥ á®€¥àŠš¬®¥ ¯ ¯ªš áªàëâ®, ®€­ ª® ª­®¯ªš
+:link reftype=hd refid=mlaunchpad. ­¥«š § ¯ãáª :elink. ¡ã€ãâ ¢š€­ë.
+
+:note text='Tip:'.ë¡¥àšâ¥ ä ©«ë €«ï ¯®á«¥€®¢ â¥«ì­®£® ¢®á¯à®š§¢¥€¥­šï, ¯àš
+­¥®¡å®€š¬®áâš š§¬¥­š¢ ¯®àï€®ª á®€¥àŠš¬®£® ¯ ¯ªš, ­ Š¬šâ¥ :hp2.®á¯à®š§¢¥áâš:ehp2.
+  § â¥¬ š§¬¥­šâ¥ à¥Šš¬ ä®à¬ë ¯à¥€áâ ¢«¥­šï ­  '®¬¯ ªâ­ë©'.
+
+.* ----------------------------------------------------------------------------
+:h2 res=120 name=mkeyboard
+    x=left y=bottom width=100% height=100%.¯à ¢«¥­š¥ á ª« ¢š âãàë
+
+á¯®«ì§ã©â¥ á«¥€ãîéš¥ ª« ¢šèš €«ï ã¯à ¢«¥­šï Media Folder. ­®¯ªš ¢ ¢¥àå­¥©
+ç áâš ¯ ¯ªš €®«Š­ë š¬¥âì ä®ªãá ¯àš šá¯®«ì§®¢ ­šš íâšå ª« ¢šè. á¯®«ì§ã©â¥
+:hp2.&lt.Tab&gt.:ehp2. çâ®¡ë ¯¥à¥ª«îçšâì ä®ªãá á ª®­â¥©­¥à  ­  ª­®¯ªš.
+
+:ul compact.
+:li.:hp2.B:ehp2.ack
+:li.:hp2.S:ehp2.top
+:li.:hp2.P:ehp2.ause
+:li.P:hp2.l:ehp2.ay
+:li.:hp2.N:ehp2.ext
+:li.:hp2.R:ehp2.epeat
+:li.R:hp2.a:ehp2.ndom
+:eul.
+
+.* ----------------------------------------------------------------------------
+:h2 res=130 name=mvolume
+    x=left y=bottom width=100% height=100%.« ©€¥à £à®¬ª®áâš
+
+®€ ª­®¯ª ¬š ¯«¥¥à  ­ å®€šâáï ¯®«§ã­®ª £à®¬ª®áâš. ¥£ã«šàã¥â ãà®¢¥­ì £à®¬ª®áâš
+¢®á¯à®š§¢¥€¥­šï ¢ ¯à¥€¥« å, ãáâ ­®¢«¥­­ëå £« ¢­ë¬ à¥£ã«ïâ®à®¬ £à®¬ª®áâš ášáâ¥¬ë.
+
+.* ----------------------------------------------------------------------------
+:h2 res=140 name=mtrackpos
+    x=left y=bottom width=100% height=100%.« ©€¥à ¯®§šæšš ¢ âà¥ª¥
+
+¯à ¢  ®â ª­®¯®ª ¯«¥¥à  ­ å®€šâáï ¯®«§ã­®ª ¯®«®Š¥­šï ¢ âà¥ª¥. ¥à¥â éšâ¥
+¯®«§ã­®ª ¢¯¥àñ€ š«š ­ § €, çâ®¡ë ¯¥à¥¬¥áâšâì â®çªã ¢®á¯à®š§¢¥€¥­šï â¥ªãé¥£®
+ä ©« .
+
+.* ----------------------------------------------------------------------------
+:h2 res=150 name=mlaunchpad
+    x=left y=bottom width=100% height=100%. ­¥«ì § ¯ãáª 
+
+ «¥¢®¬ ­šŠ­¥¬ ã£«ã ¯ ¯ªš á ¯à®š£àë¢ â¥«¥¬ ­ å®€šâáï ª¢ €à â­ ï à ¬ª .
+¥à¥â éšâ¥ ¬¥€š ä ©« ­  ¯ ­¥«ì § ¯ãáª , çâ®¡ë €®¡ ¢šâì ¥£® ¢ ¯ «šâàã í«¥¬¥­â®¢
+¯ ­¥«š. ¬ï ä ©«  ®â®¡à Š ¥âáï ¢® ¢á¯«ë¢ îé¥© ¯®€áª §ª¥ ª­®¯ªš. ¥à¥â éšâ¥
+€®¯®«­šâ¥«ì­ë¥ ä ©«ë ¬¥Š€ã áãé¥áâ¢ãîéš¬š í«¥¬¥­â ¬š ¯ ­¥«š § ¯ãáª  š«š á¯à ¢ 
+®â ¯®á«¥€­¥£® í«¥¬¥­â . «šª­šâ¥ «î¡®© š§ ­šå, çâ®¡ë ­ ç âì ¢®á¯à®š§¢¥€¥­š¥.
+
+:p. ­¥«ì § ¯ãáª  ï¢«ï¥âáï ®¡é¥© €«ï ¢á¥å ®¡ê¥ªâ®¢ ã¯à ¢«¥­šï: Media Folder,
+CD-¯«¥¥à , š á¯šáª  ¢®á¯à®š§¢¥€¥­šï M3U.
+
+:note.®£€  ¢®á¯à®š§¢¥€¥­š¥ ­ çš­ ¥âáï â ªš¬ ®¡à §®¬,
+:link reftype=hd refid=mtrackpos.á« ©€¥à ¯®§šæšš ¢ âà¥ª¥:elink. ­¥ ®âà Š ¥â
+â¥ªãé¥¥ á®áâ®ï­š¥ ¢®á¯à®š§¢¥€¥­šï,   ª­®¯ªš ¯à®š£àë¢ â¥«ï ­¥ ã¯à ¢«ïîâ
+¢®á¯à®š§¢¥€¥­š¥¬. ¬¥áâ® íâ®£® šá¯®«ì§ã©â¥ ª®­â¥ªáâ­®¥ ¬¥­î ª­®¯ªš €«ï
+ã¯à ¢«¥­šï ¢®á¯à®š§¢¥€¥­š¥¬.
+
+:warning.®âï ­  ¯ ­¥«ì § ¯ãáª  ¬®Š­® €®¡ ¢«ïâì ä ©«ë MP3, Ogg š €àã£š¥
+æšäà®¢ë¥ ¬¥€š ä ©«ë, ­¥ €®¡ ¢«ï©â¥ áî€  €®à®Šªš ª®¬¯ ªâ-€šáª®¢. ®à®Šªš
+ª®¬¯ ªâ-€šáª  ­¥ ¡ã€ãâ ¢®á¯à®š§¢®€šâìáï á ¯ ­¥«š § ¯ãáª .
+
+.* ----------------------------------------------------------------------------
+:h1 res=200 name=cplayer
+    x=left y=bottom width=100% height=100%.CD-¯«¥¥à
+
+â®â ®¡ê¥ªâ ¯à¥€áâ ¢«ï¥â á®¡®© ¯à®š£àë¢ â¥«ì ª®¬¯ ªâ-€šáª®¢ á ¯®€€¥àŠª®© CDDB.
+ §¢ ­šï âà¥ª®¢ š €àã£š¥ ¬¥â € ­­ë¥ § ¯à èš¢ îâáï á ­ áâà®¥­­®£® á¥à¢¥à ,
+á®¢¬¥áâš¬®£® á FreeDB, ¥á«š €®áâã¯­® ¯®€ª«îç¥­š¥ ª ­â¥à­¥âã.
+
+:p.®¯®«­šâ¥«ì­ ï š­ä®à¬ æšï š ®¡­®¢«¥­šï&colon.
+
+:p.https&colon.//trac.netlabs.org/cwmmclasses/wiki
+
+:nt.
+®«ìèš­áâ¢® á¥à¢¥à®¢ CDDB á«¥€ãîâ ¯à ªâšª¥ FreeDB, âà¥¡ãï €«ï €®áâã¯ 
+€¥©áâ¢šâ¥«ì­ë©  €à¥á í«¥ªâà®­­®© ¯®çâë. á¯®«ì§ã©â¥ ®¡ê¥ªâ ª®­äš£ãà æšš ª«š¥­â 
+FreeDB ¢ ¯ ¯ª¥ Multimedia, çâ®¡ë ­ áâà®šâì íâš ¯ à ¬¥âàë.
+:ent.
+
+.* ----------------------------------------------------------------------------
+:h2 res=210 name=cview
+    x=left y=bottom width=100% height=100%. à ¬¥âàë ¢š€ 
+
+® ã¬®«ç ­šî ¯à®š£àë¢ â¥«ì ª®¬¯ ªâ-€šáª®¢ ®â®¡à Š ¥âáï ¢ ä®à¬¥ ¯à¥€áâ ¢«¥­šï
+'®€à®¡­®' á® á¯šáª®¬ á¢¥€¥­š© €«ï ª Š€®© €®à®Šªš ­  á¬®­âšà®¢ ­­®¬ €šáª¥.
+
+:p.â®¡ë ¯¥à¥ª«îçšâìáï ­  ª®¬¯ ªâ­ë© ¢š€, ¢ë¡¥àšâ¥ 'š€' | '®¬¯ ªâ­ë©' ¢
+£« ¢­®¬ ¬¥­î.  íâ®¬ à¥Šš¬¥ á®€¥àŠš¬®¥ ¯ ¯ªš áªàëâ®, ®€­ ª® ª­®¯ªš
+:link reftype=hd refid=mlaunchpad. ­¥«š § ¯ãáª :elink. ¡ã€ãâ ¢š€­ë.
+
+:note text='Tip:'.ë¡¥àšâ¥ ä ©«ë €«ï ¯®á«¥€®¢ â¥«ì­®£® ¢®á¯à®š§¢¥€¥­šï, ¯àš
+­¥®¡å®€š¬®áâš š§¬¥­š¢ ¯®àï€®ª á®€¥àŠš¬®£® ¯ ¯ªš, ­ Š¬šâ¥ :hp2.®á¯à®š§¢¥áâš:ehp2.
+  § â¥¬ š§¬¥­šâ¥ à¥Šš¬ ä®à¬ë ¯à¥€áâ ¢«¥­šï ­  '®¬¯ ªâ­ë©'.
+
+.* ----------------------------------------------------------------------------
+:h2 res=220 name=ckeyboard
+    x=left y=bottom width=100% height=100%.¯à ¢«¥­š¥ á ª« ¢š âãàë
+
+á¯®«ì§ã©â¥ á«¥€ãîéš¥ ª« ¢šèš €«ï ã¯à ¢«¥­šï CD-¯«¥¥à®¬. ­®¯ªš ¢ ¢¥àå­¥©
+ç áâš ¯ ¯ªš €®«Š­ë š¬¥âì ä®ªãá ¯àš šá¯®«ì§®¢ ­šš íâšå ª« ¢šè. á¯®«ì§ã©â¥
+:hp2.&lt.Tab&gt.:ehp2. çâ®¡ë ¯¥à¥ª«îçšâì ä®ªãá á ª®­â¥©­¥à  ­  ª­®¯ªš.
+
+:ul compact.
+:li.:hp2.B:ehp2.ack
+:li.:hp2.S:ehp2.top
+:li.:hp2.P:ehp2.ause
+:li.P:hp2.l:ehp2.ay
+:li.:hp2.N:ehp2.ext
+:li.:hp2.R:ehp2.epeat
+:eul.
+
+.* ----------------------------------------------------------------------------
+:h2 res=230 name=cvolume
+    x=left y=bottom width=100% height=100%.« ©€¥à £à®¬ª®áâš
+
+®€ ª­®¯ª ¬š ¯«¥¥à  ­ å®€šâáï ¯®«§ã­®ª £à®¬ª®áâš. ¥£ã«šàã¥â ãà®¢¥­ì £à®¬ª®áâš
+¢®á¯à®š§¢¥€¥­šï ¢ ¯à¥€¥« å, ãáâ ­®¢«¥­­ëå £« ¢­ë¬ à¥£ã«ïâ®à®¬ £à®¬ª®áâš ášáâ¥¬ë.
+
+.* ----------------------------------------------------------------------------
+:h2 res=240 name=ctrackpos
+    x=left y=bottom width=100% height=100%.« ©€¥à ¯®§šæšš ¢ âà¥ª¥
+
+¯à ¢  ®â ª­®¯®ª ¯«¥¥à  ­ å®€šâáï ¯®«§ã­®ª ¯®«®Š¥­šï ¢ âà¥ª¥. ¥à¥â éšâ¥
+¯®«§ã­®ª ¢¯¥àñ€ š«š ­ § €, çâ®¡ë ¯¥à¥¬¥áâšâì â®çªã ¢®á¯à®š§¢¥€¥­šï â¥ªãé¥£®
+ä ©« .
+
+.* ----------------------------------------------------------------------------
+:h2 res=250 name=claunchpad
+    x=left y=bottom width=100% height=100%. ­¥«ì § ¯ãáª 
+
+ «¥¢®¬ ­šŠ­¥¬ ã£«ã ¯ ¯ªš á ¯à®š£àë¢ â¥«¥¬ ­ å®€šâáï ª¢ €à â­ ï à ¬ª .
+¥à¥â éšâ¥ ¬¥€š ä ©« ­  ¯ ­¥«ì § ¯ãáª , çâ®¡ë €®¡ ¢šâì ¥£® ¢ ¯ «šâàã í«¥¬¥­â®¢
+¯ ­¥«š. ¬ï ä ©«  ®â®¡à Š ¥âáï ¢® ¢á¯«ë¢ îé¥© ¯®€áª §ª¥ ª­®¯ªš. ¥à¥â éšâ¥
+€®¯®«­šâ¥«ì­ë¥ ä ©«ë ¬¥Š€ã áãé¥áâ¢ãîéš¬š í«¥¬¥­â ¬š ¯ ­¥«š § ¯ãáª  š«š á¯à ¢ 
+®â ¯®á«¥€­¥£® í«¥¬¥­â . «šª­šâ¥ «î¡®© š§ ­šå, çâ®¡ë ­ ç âì ¢®á¯à®š§¢¥€¥­š¥.
+
+:p. ­¥«ì § ¯ãáª  ï¢«ï¥âáï ®¡é¥© €«ï ¢á¥å ®¡ê¥ªâ®¢ ã¯à ¢«¥­šï: Media Folder,
+CD-¯«¥¥à , š á¯šáª  ¢®á¯à®š§¢¥€¥­šï M3U.
+
+:note.®£€  ¢®á¯à®š§¢¥€¥­š¥ ­ çš­ ¥âáï â ªš¬ ®¡à §®¬,
+:link reftype=hd refid=mtrackpos.á« ©€¥à ¯®§šæšš ¢ âà¥ª¥:elink. ­¥ ®âà Š ¥â
+â¥ªãé¥¥ á®áâ®ï­š¥ ¢®á¯à®š§¢¥€¥­šï,   ª­®¯ªš ¯à®š£àë¢ â¥«ï ­¥ ã¯à ¢«ïîâ
+¢®á¯à®š§¢¥€¥­š¥¬. ¬¥áâ® íâ®£® šá¯®«ì§ã©â¥ ª®­â¥ªáâ­®¥ ¬¥­î ª­®¯ªš €«ï
+ã¯à ¢«¥­šï ¢®á¯à®š§¢¥€¥­š¥¬.
+
+:warning.®âï ­  ¯ ­¥«ì § ¯ãáª  ¬®Š­® €®¡ ¢«ïâì ä ©«ë MP3, Ogg š €àã£š¥
+æšäà®¢ë¥ ¬¥€š ä ©«ë, ­¥ €®¡ ¢«ï©â¥ áî€  €®à®Šªš ª®¬¯ ªâ-€šáª®¢. ®à®Šªš
+ª®¬¯ ªâ-€šáª  ­¥ ¡ã€ãâ ¢®á¯à®š§¢®€šâìáï á ¯ ­¥«š § ¯ãáª .
+
+.* ----------------------------------------------------------------------------
+:h1 res=300 name=peditor
+    x=left y=bottom width=100% height=100%.¥€ ªâ®à ¯«¥©«šáâ 
+
+á¯®«ì§ã©â¥ à¥€ ªâ®à ¯«¥©«šáâ  €«ï š§¬¥­¥­šï á¯šáª®¢ ¢®á¯à®š§¢¥€¥­šï M3U.
+¯šá®ª ¢®á¯à®š§¢¥€¥­šï M3U ï¢«ï¥âáï â¥ªáâ®¢ë¬ ä ©«®¬, ª®â®àë© á®€¥àŠšâ ¯ãâš
+(URL) ª €®à®Šª ¬, ­  ª®â®àë¥ ®­ ááë« ¥âáï.
+
+:p.M3U (Moving Picture Experts Group Audio Layer 3 Uniform Resource Locator)
+ï¢«ï¥âáï áâ ­€ àâ®¬ €¥-ä ªâ®, ®¡é¥¯àš§­ ­­ë¬ €«ï ¡®«ìèš­áâ¢  MP3-¯«¥¥à®¢.
+
+:p.â®¡ë €®¡ ¢šâì âà¥ªš, ¯à®áâ® ¯¥à¥â éšâ¥ šå ¢ à¥€ ªâ®à.
+â®¡ë š§¬¥­šâì ¯®àï€®ª, ã¡¥€šâ¥áì, çâ® ­¥ ¢ë¡à ­ 'š€' | '®àâšà®¢ âì' >
+'á¥£€  ¯®€€¥àŠš¢ âì ¯®àï€®ª á®àâšà®¢ªš'   â ªŠ¥ «î¡ë¥ €àã£š¥ ¯ à ¬¥âàë
+á®àâšà®¢ªš, ª®â®àë¥ ¬®£ãâ ¯®¢«šïâì ­  àãç­®¥ ã¯®àï€®ç¥­š¥ š ¯¥à¥â éšâ¥ €®à®Šªš
+¢ ¯ ¯ªã ¢ ­ãŠ­®¬  ¬ ¯®àï€ª¥. ®åà ­šâ¥ á¯šá®ª ¢®á¯à®š§¢¥€¥­šï, ¢ë¡à ¢
+' ©«' | '®åà ­šâì' ¢ ¬¥­î.
+
+:p.â®¡ë á®§€ âì ­®¢ë© á¯šá®ª ¢®á¯à®š§¢¥€¥­šï, ¯¥à¥â éšâ¥ è ¡«®­ á¯šáª 
+¢®á¯à®š§¢¥€¥­šï M3U š§ ¯ ¯ªš ' ¡«®­ë ¬ã«ìâš¬¥€š ' ¢ ¯®€å®€ïé¥¥ ¬¥áâ® ­ 
+à ¡®ç¥¬ áâ®«¥.
+
+:p.®¯®«­šâ¥«ì­ ï š­ä®à¬ æšï š ®¡­®¢«¥­šï&colon.
+
+:p.https&colon.//trac.netlabs.org/cwmmclasses/wiki
+
+.* ----------------------------------------------------------------------------
+:h2 res=350 name=plaunchpad
+    x=left y=bottom width=100% height=100%. ­¥«ì § ¯ãáª 
+
+ «¥¢®¬ ­šŠ­¥¬ ã£«ã á¯šáª  ¢®á¯à®š§¢¥€¥­šï M3U ­ å®€šâáï ª¢ €à â­ ï à ¬ª .
+¥à¥â éšâ¥ ¬¥€š ä ©« ­  ¯ ­¥«ì § ¯ãáª , çâ®¡ë €®¡ ¢šâì ¥£® ¢ ¯ «šâàã í«¥¬¥­â®¢
+¯ ­¥«š. ¬ï ä ©«  ®â®¡à Š ¥âáï ¢® ¢á¯«ë¢ îé¥© ¯®€áª §ª¥ ª­®¯ªš. ¥à¥â éšâ¥
+€®¯®«­šâ¥«ì­ë¥ ä ©«ë ¬¥Š€ã áãé¥áâ¢ãîéš¬š í«¥¬¥­â ¬š ¯ ­¥«š § ¯ãáª  š«š á¯à ¢ 
+®â ¯®á«¥€­¥£® í«¥¬¥­â . «šª­šâ¥ «î¡®© š§ ­šå, çâ®¡ë ­ ç âì ¢®á¯à®š§¢¥€¥­š¥.
+
+:p. ­¥«ì § ¯ãáª  ï¢«ï¥âáï ®¡é¥© €«ï ¢á¥å ®¡ê¥ªâ®¢ ã¯à ¢«¥­šï: Media Folder,
+CD-¯«¥¥à , š á¯šáª  ¢®á¯à®š§¢¥€¥­šï M3U.
+
+:note.á¯®«ì§ã©â¥ ª®­â¥ªáâ­®¥ ¬¥­î ª­®¯ªš €«ï ã¯à ¢«¥­šï ¢®á¯à®š§¢¥€¥­š¥¬.
+
+:warning.®âï ­  ¯ ­¥«ì § ¯ãáª  ¬®Š­® €®¡ ¢«ïâì ä ©«ë MP3, Ogg š €àã£š¥
+æšäà®¢ë¥ ¬¥€š ä ©«ë, ­¥ €®¡ ¢«ï©â¥ áî€  €®à®Šªš ª®¬¯ ªâ-€šáª®¢. ®à®Šªš
+ª®¬¯ ªâ-€šáª  ­¥ ¡ã€ãâ ¢®á¯à®š§¢®€šâìáï á ¯ ­¥«š § ¯ãáª .
+
+:euserdoc.
Index: /tags/CWMM-0.3.0_GA/mediafolder/Help/mediafldr031.ipf
===================================================================
--- /tags/CWMM-0.3.0_GA/mediafolder/Help/mediafldr031.ipf	(revision 213)
+++ /tags/CWMM-0.3.0_GA/mediafolder/Help/mediafldr031.ipf	(revision 213)
@@ -0,0 +1,116 @@
+:userdoc.
+
+:docprof.
+
+:title.Hulp bij de Media Map distributie
+
+:h1 res=100.Hulp bij de Media speler
+
+:p.
+Dit object is een Media-map. Plaats er ieder geluidsbestand in om het
+af te spelen. Geef de volgorde van de sporen op d.m.v. slepen en laten vallen.
+De gebruikelijke afspeelvoorzieningen zijn aanwezig zoals afspelen, stoppen en volume.
+
+:p.
+Voor meer informatie en aanpassingen:
+
+:p.
+:link reftype=launch
+object='netscape.exe'
+data='http://www.os2world.com/cdwriting'.
+http&colon.//www.os2world.com/cdwriting:elink.
+.br
+:link reftype=launch
+object='netscape.exe'
+data='http://www.geocities.com/SiliconValley/Sector/5785/'.
+http&colon.//www.geocities.com/SiliconValley/Sector/5785/:elink.
+:p.
+:nt.
+:p.
+Om MP3 bestanden af te spelen heeft u het MMIOMP3 programma nodig,
+geschreven door Russell O'Connor.
+
+:p.
+Haal het van:
+
+:p.
+:link reftype=launch
+object='netscape.exe'
+data='http://www.math.berkeley.edu/~roconnor/'.
+http&colon.//www.math.berkeley.edu/~roconnor/:elink.
+:ent.
+:p.
+:hp2.Toetsenbord beheer:ehp2.
+
+:p.
+Gebruik de volgende toetsen om de media map te beheren. De toetsen in het bovenste gedeelte van
+de map moeten aktief zijn als u de toetsen wilt gebruiken. Gebruik de :hp2.TAB:ehp2. om van
+activiteit te wisselen tussen de verzamelplaats en de toetsen.
+
+:p.
+:ul.
+:li.:hp8.T:ehp8.erug
+:li.:hp8.S:ehp8.toppen
+:li.:hp8.P:ehp8.auze
+:li.Afs:hp8.p:ehp8.elen
+:li.Volge:hp8.n:ehp8.de
+:li.He:hp8.r:ehp8.halen
+:eul.
+
+:h1 res=200.Hulp bij de Cd-speler
+:p.
+Dit object is een Cd speler met FreeDB ondersteuning. De titels van de sporen en andere informatie
+worden opgehaald van een FreeDB server als er een internet verbinding beschikbaar is.
+:p.
+Voor meer informatie en aanpassingen:
+:p.
+:link reftype=launch
+object='netscape.exe'
+data='http://www.os2world.com/cdwriting'.
+http&colon.//www.os2world.com/cdwriting:elink.
+.br
+:link reftype=launch
+object='netscape.exe'
+data='http://www.geocities.com/SiliconValley/Sector/5785/'.
+http&colon.//www.geocities.com/SiliconValley/Sector/5785/:elink.
+:p.
+:nt.
+Om FreeDB servers te gebruiken moet u het juiste pakket installeren en u
+moet een email adres opgeven. Gebruik het configuratie object om dat te doen.
+:ent.
+:p.
+:hp2.Toetsenbord beheer:ehp2.
+:p.
+Gebruik de volgende toetsen om de speler te beheren. De toetsen in het bovenste deel
+van het venster moeten aktief zijn als u de toetsen wilt gebruiken. Gebruik de :hp2.TAB:ehp2. om van
+activiteit te wisselen tussen de verzamelplaats en de toetsen.
+:p.
+:ul.
+:li.:hp8.T:ehp8.erug
+:li.:hp8.S:ehp8.toppen
+:li.:hp8.P:ehp8.auze
+:li.Afs:hp8.p:ehp8.elen
+:li.Volge:hp8.n:ehp8.de
+:li.He:hp8.r:ehp8.halen
+:eul.
+
+:h1 res=300.Hulp bij de afspeellijst editor
+:p.
+Gebruik de afspeellijst editor om een MP3 afspeellijst te maken of te wijzigen. Deze
+afspeellijsten worden b.v. gebruikt door draagbare MP3 spelers. Zo'n afspeellijst bestand
+is een tekst bestand dat de namen bevat van ieder spoor dat moet worden afgespeeld.
+:p.
+Voor meer informatie en aanpassingen:
+:p.
+:link reftype=launch
+object='netscape.exe'
+data='http://www.os2world.com/cdwriting'.
+http&colon.//www.os2world.com/cdwriting:elink.
+.br
+:link reftype=launch
+object='netscape.exe'
+data='http://www.geocities.com/SiliconValley/Sector/5785/'.
+http&colon.//www.geocities.com/SiliconValley/Sector/5785/:elink.
+
+
+:euserdoc.
Index: /tags/CWMM-0.3.0_GA/mediafolder/Help/mediafldr031_ecs.ipf
===================================================================
--- /tags/CWMM-0.3.0_GA/mediafolder/Help/mediafldr031_ecs.ipf	(revision 213)
+++ /tags/CWMM-0.3.0_GA/mediafolder/Help/mediafldr031_ecs.ipf	(revision 213)
@@ -0,0 +1,74 @@
+:userdoc.
+
+:docprof.
+
+:title.Hulp bij de Media Map distributie
+
+:h1 res=100.Hulp bij de Media Speler
+:p.
+Dit object is een Media-map. Plaats er ieder geluidsbestand in om hem
+af te spelen. Geef de volgorde van de sporen op d.m.v. slepen en laten vallen.
+De gebruikelijke afspeel voorzieningen zijn aanwezig zoals, afspelen, stoppen en volume.
+:p.
+:nt.
+:p.
+Om MP3 bestanden af te spelen heeft u het MMIOMP3 programma nodig, geschreven
+door Russell O'Connor.
+:p.
+Haal het van:
+:p.
+:link reftype=launch
+object='netscape.exe'
+data='http://www.math.berkeley.edu/~roconnor/'.
+http&colon.//www.math.berkeley.edu/~roconnor/:elink.
+:ent.
+:p.
+:hp2.Toetsenbord beheer:ehp2.
+:p.
+Gebruik de volgende toetsen om de media map te beheren. De toetsen in het bovenste deel
+van de map moeten aktief zijn als u de toetsen wilt gebruiken. Gebruik de :hp2.TAB:ehp2. om de activiteit
+te wisselen tussen de verzamelplaats en de toetsen.
+:p.
+:ul.
+:li.:hp8.T:ehp8.erug
+:li.:hp8.S:ehp8.toppen
+:li.:hp8.P:ehp8.auze
+:li.Afs:hp8.p:ehp8.elen
+:li.Volge:hp8.n:ehp8.de
+:li.He:hp8.r:ehp8.halen
+:eul.
+
+:h1 res=200.Hulp bij de Cd-speler
+:p.
+Dit object is een Cd speler met FreeDB ondersteuning. Titels van sporen en andere informatie
+worden opgehaald van een FreeDB server als een internet verbinding aanwezig is.
+:p.
+:nt.
+Om een FreeDB server te kunnen gebruiken moet u een email adres
+opgeven. Gebruik het configuratie object om dat te doen.
+:ent.
+:p.
+:hp2.Toetsenbord beheer:ehp2.
+:p.
+Gebruik de volgende toetsen om de media map te beheren. De toetsen in het bovenste deel
+van de map moeten aktief zijn als u de toetsen wilt gebruiken. Gebruik de :hp2.TAB:ehp2. om de activiteit
+te wisselen tussen de verzamelplaats en de toetsen.
+:p.
+:ul.
+:li.:hp8.T:ehp8.erug
+:li.:hp8.S:ehp8.toppen
+:li.:hp8.P:ehp8.auze
+:li.Afs:hp8.p:ehp8.elen
+:li.Volge:hp8.n:ehp8.de
+:li.He:hp8.r:ehp8.halen
+:eul.
+
+:h1 res=300.Hulp bij de afspeellijst editor
+:p.
+Gebruik de afspeellijst editor om een M3U afspeellijst te maken of te wijzigen. Deze afspeellijsten
+worden b.v. gebruikt door draagbare MP3 spelers. Zo'n afspeellijst bestand is een tekst bestand
+dat de bestandsnamen bevat van ieder spoor dat moet worden afgespeeld.
+:p.
+
+
+:euserdoc.
Index: /tags/CWMM-0.3.0_GA/mediafolder/Help/mediafldr033.ipf
===================================================================
--- /tags/CWMM-0.3.0_GA/mediafolder/Help/mediafldr033.ipf	(revision 213)
+++ /tags/CWMM-0.3.0_GA/mediafolder/Help/mediafldr033.ipf	(revision 213)
@@ -0,0 +1,321 @@
+:userdoc.
+:docprof.
+:title.Aide 
+ propos du dossier Multimdia
+.* ----------------------------------------------------------------------------
+.* Product...............: Media Folder - Help file
+.* Language..............: French
+.* Original file version.:
+.* French translation....: Guillaume Gay <guillaume[dot]gay[arobase]gmail[dot]com>
+.* Version...............: 2020-07-23
+
+.* ----------------------------------------------------------------------------
+.* mplayer
+.* ----------------------------------------------------------------------------
+:h1 res=100 name=mplayer
+    x=left y=bottom width=100% height=100%.Lecteur Multimdia
+
+:p.Cet objet est un dossier multimedia. Glissez-y vos fichiers audio
+pour les lire. Pour l'organisation de cette liste, assurez-vous que
+:hp2.Affichage:ehp2. | :hp2.Tri:ehp2. |
+:hp1.Toujours conserver l'ordre de tri:ehp1. est dslectionne, ainsi
+que toute autre option de tri qui pourrait affecter le tri manuel, puis
+glissez et dposez les pistes comme vous le souhaitez.
+
+:p.Utilisez les boutons ou le
+:link reftype=hd refid=mkeyboard.clavier:elink. pour le contrle de la
+lecture. La case 
+ cocher :hp2.Rpter:ehp2. entranera une lecture
+continue de la piste actuellement slectionne. La case 
+ cocher
+:hp2.Alatoire:ehp2. permettra une lecture des pistes de manire
+arbitraire, sauf si la case 
+ cocher :hp2.Rpter:ehp2. a t coche.
+
+:p.Pour plus d'informations et les mises 
+ jour rendez-vous sur &colon.
+:p.https&colon.//trac.netlabs.org/cwmmclasses/wiki
+
+:nt text='Remarque &colon.'.pour la lecture des fichiers MP3, comme
+pour les fichiers Ogg (Vorbis et FLAC), une procdure d'Entre/Sortie
+multimdia ("multimedia IO procedure" ou "MMIOProc") approprie est
+ncessaire.
+Les paquetages MMIOProc sont inclus dans dans "MMAudio Pak 2",
+disponible sur &colon.
+
+:p.http&colon.//r6.ca/MMAudioPak/
+
+:p.(Les formats Ogg sont pris en charge par dfaut dans in ArcaOS 5.x
+et ultrrieures.)
+:ent.
+:p.
+
+.* ----------------------------------------------------------------------------
+.* mview
+.* ----------------------------------------------------------------------------
+:h2 res=110 name=mview
+    x=left y=bottom width=100% height=100%.Options d'affichage
+:p.Par dfaut, les dossiers Multimdia sont affichs dans la vue
+dtaille, affichant les dtails spcifiques 
+ la piste pour chaque
+fichier ou objet ajout au dossier principal.
+
+:p.Pour basculer vers la vue compacte, slectionnez
+:hp2.Affichage:ehp2. | :hp2.Compact:ehp2. depuis le menu principal.
+Dans ce mode, le contenu du dossier est masqu, cependant, les
+boutons du :link reftype=hd refid=mlaunchpad.lanceur:elink. seront
+visibles.
+
+:note text='Astuce &colon.'.slectionnez les fichiers 
+ lire de
+manire continue, rorganisez le contenu du dossier si ncessaire,
+cliquez sur :hp2.Lecture:ehp2.&comma. puis changez la vue pour
+:hp2.Compact:ehp2.&per.
+:p.
+.* ----------------------------------------------------------------------------
+.* mkeyboard
+.* ----------------------------------------------------------------------------
+:h2 res=120 name=mkeyboard
+    x=left y=bottom width=100% height=100%.Contrles au clavier
+:p.Utilisez les touches suivantes pour contrler le dossier Mdia. Les
+boutons de la partie suprieure du dossier doivent avoir le focus lors
+de l'utilisation de ces touches. Utilisez :hp2.&lt.Tab&gt.:ehp2. pour
+basculer le focus du conteneur vers les boutons.
+
+:ul compact.
+:li.P:hp8.R:ehp8.cdent
+:li.:hp8.A:ehp8.rrt
+:li.:hp8.P:ehp8.ause
+:li.:hp8.L:ehp8.ecture
+:li.:hp8.S:ehp8.uivant
+:li.Rp:hp8.T:ehp8.er
+:li.Alat:hp8.O:ehp8.ire
+:eul.
+:p.
+
+.* ----------------------------------------------------------------------------
+.* mvolume
+.* ----------------------------------------------------------------------------
+:h2 res=130 name=mvolume
+    x=left y=bottom width=100% height=100%.Glissire de volume
+:p.Sous les boutons du lecteur se trouve le curseur de volume. Il
+contrle le niveau de volume pour la lecture, dans les limites dfinies
+par la commande de volume principale du systme.
+:p.
+
+.* ----------------------------------------------------------------------------
+.* mtrackpos
+.* ----------------------------------------------------------------------------
+:h2 res=140 name=mtrackpos
+    x=left y=bottom width=100% height=100%.Curseur de position de piste
+:p.· droite des boutons du lecteur se trouve le curseur de position de
+piste. Faites glisser le curseur vers l'avant ou vers l'arrire pour
+repositionner le point de lecture du fichier actuel.
+:p.
+
+.* ----------------------------------------------------------------------------
+.* mlaunchpad
+.* ----------------------------------------------------------------------------
+:h2 res=150 name=mlaunchpad
+    x=left y=bottom width=100% height=100%.Lanceur
+:p.En bas 
+ gauche du dossier de lecture se trouve une bote carre.
+Glissez et dposez un fichier multimdia sur ce lanceur pour l'ajouter 
+
+la palette. Le nom du fichier est affich dans l'info-bulle du bouton.
+Glissez et dposez des fichiers supplmentaires entre les lments
+existants dans le lanceur ou 
+ droite du dernier lment.
+Cliquez sur l'un de ces lments pour commencer sa lecture.
+
+:p.Le lanceur est commun aux dossiers de lecture multimdia, lecture de
+CD et de liste de lecture M3U.
+
+:note.lorsque la lecture est lance de cette manire, le
+:link reftype=hd refid=mtrackpos.curseur de position de piste:elink. ne
+reflte pas l'tat de lecture actuel et les boutons du lecteur ne
+contrlent pas la lecture. Utilisez plutt le menu contextuel du bouton
+pour contrler la lecture.
+
+:warning.Bien qu'il soit possible d'ajouter des fichiers MP3, Ogg et
+autres fichiers multimdias numriques au lanceur, n'ajoutez pas de
+pistes de CD ici. Les pistes de CD ne pourront pas tre lues depuis le
+Lanceur.
+:p.
+
+.* ----------------------------------------------------------------------------
+.* cplayer
+.* ----------------------------------------------------------------------------
+:h1 res=200 name=cplayer
+    x=left y=bottom width=100% height=100%.Lecteur CD
+:p.Cet objet est un lecteur CD avec prise en charge de FreeDB.
+Le titre de chaque piste et autres mtadonnes sont rcupres depuis un
+serveur compatible FreeDB, si une connexion 
+ Internet est disponible.
+
+:p.Pour plus d'informations et les mises 
+ jour rendez-vous sur &colon.
+
+:p.https&colon.//trac.netlabs.org/cwmmclasses/wiki
+
+:nt.la plupart des serveurs CDDB suivent la mme pratique que FreeDB qui
+consiste 
+ exiger une adresse de courriel valide pour l'accs. Utilisez
+l'objet de :hp2.configuration du client CDDB:ehp2. dans le dossier
+:hp2.Multimdia:ehp2. pour paramtrer tout cela.
+:ent.
+:p.
+
+.* ----------------------------------------------------------------------------
+.* cview
+.* ----------------------------------------------------------------------------
+:h2 res=210 name=cview
+    x=left y=bottom width=100% height=100%.Options d'affichage
+
+:p.Par dfaut, le lecteur CD est affich dans sa vue dtaille,
+affichant les dtails pour chaque piste du disque mont.
+
+:p.Pour basculer vers la vue compacte, slectionnez
+:hp2.Affichage:ehp2. | :hp2.Compact:ehp2. depuis le menu principal.
+Dans ce mode, le contenu du dossier est masqu, cependant, les
+boutons du :link reftype=hd refid=mlaunchpad.lanceur:elink. seront
+visibles.
+
+:note text='Astuce &colon.'.slectionnez le premier fichier 
+ lire,
+cliquez sur :hp2.Lecture:ehp2.&comma. puis changez la vue pour
+:hp2.Compact:ehp2.&per.
+:p.
+
+.* ----------------------------------------------------------------------------
+.* ckeyboard
+.* ----------------------------------------------------------------------------
+:h2 res=220 name=ckeyboard
+    x=left y=bottom width=100% height=100%.Contrles au clavier
+:p.Utilisez les touches suivantes pour contrler le lecteur CD. Les
+boutons de la partie suprieure du dossier doivent avoir le focus lors
+de l'utilisation de ces touches. Utilisez :hp2.&lt.Tab&gt.:ehp2. pour
+basculer le focus du conteneur vers les boutons.
+
+:ul compact.
+:li.P:hp8.R:ehp8.cdent
+:li.:hp8.A:ehp8.rrt
+:li.:hp8.P:ehp8.ause
+:li.:hp8.L:ehp8.ecture
+:li.:hp8.S:ehp8.uivant
+:li.Rp:hp8.T:ehp8.er
+:eul.
+:p.
+
+.* ----------------------------------------------------------------------------
+.* cvolume
+.* ----------------------------------------------------------------------------
+:h2 res=230 name=cvolume
+    x=left y=bottom width=100% height=100%.Glissire de volume
+:p.Sous les boutons du lecteur se trouve le curseur de volume. Il
+contrle le niveau de volume pour la lecture, dans les limites dfinies
+par la commande de volume principale du systme.
+:p.
+
+.* ----------------------------------------------------------------------------
+.* ctrackpos
+.* ----------------------------------------------------------------------------
+:h2 res=240 name=ctrackpos
+    x=left y=bottom width=100% height=100%.Curseur de position de piste
+:p.· droite des boutons du lecteur se trouve le curseur de position de
+piste. Faites glisser le curseur vers l'avant ou vers l'arrire pour
+repositionner le point de lecture de la piste actuelle.
+:p.
+
+.* ----------------------------------------------------------------------------
+.* claunchpad
+.* ----------------------------------------------------------------------------
+:h2 res=250 name=claunchpad
+    x=left y=bottom width=100% height=100%.Lanceur
+
+:p.En bas 
+ gauche du dossier de lecture se trouve une bote carre.
+Glissez et dposez un fichier multimdia sur le lanceur pour l'ajouter 
+
+la palette. Le nom du fichier est affich dans l'info-bulle du bouton.
+Glissez et dposez des fichiers supplmentaires entre les lments
+existants dans le lanceur ou 
+ droite du dernier lment.
+Cliquez sur l'un de ces lments pour commencer sa lecture.
+
+:p.Le lanceur est commun aux dossiers de lecture multimdia, lecture de
+CD et de liste de lecture M3U.
+
+:note.lorsque la lecture est lance de cette manire, le
+:link reftype=hd refid=ctrackpos.curseur de position de piste:elink. ne
+reflte pas l'tat de lecture actuel et les boutons du lecteur ne
+contrlent pas la lecture. Utilisez plutt le menu contextuel du bouton
+pour contrler la lecture.
+
+:warning.Bien qu'il soit possible d'ajouter des fichiers MP3, Ogg et
+autres fichiers multimdias numriques au lanceur, n'ajoutez pas de
+pistes de CD ici. Les pistes de CD ne pourront pas tre lues depuis le
+Lanceur.
+:p.
+
+.* ----------------------------------------------------------------------------
+.* peditor
+.* ----------------------------------------------------------------------------
+:h1 res=300 name=peditor
+    x=left y=bottom width=100% height=100%.diteur de liste de lecture
+:p.Utilisez l'diteur de liste de lecture pour crer ou modifier des
+listes de lecture M3U.
+Une liste de lecture M3U est un fichier texte qui contient les chemins
+(URL) vers les pistes auxquelles il fait rfrence.
+
+:p.Le M3U (Moving Picture Experts Group Audio Layer 3 Uniform Resource
+Locator). Le M3U est un standard :hp1.de facto:ehp1.&comma. en gnral
+reconnu par la plupart des lecteurs MP3.
+
+:p.Pour ajouter des pistes, glissez et dposez-les dans l'diteur.
+Pour l'organisation de cette liste, assurez-vous que l'option
+:hp1.Toujours conserver l'ordre de tri:ehp1. du sous-menu
+:hp2.Trier:ehp2. est dslectionne, ainsi que toute autre option de
+tri qui pourrait affecter le tri manuel, puis glissez et dposez les
+pistes comme vous le souhaitez. Enregistrez la liste de lecture en
+slectionnant :hp2.Fichier|Enregistrer:ehp2. depuis le menu.
+
+:p.Pour crer une nouvelle liste de lecture, glissez le modle de liste
+de lecture M3U depuis le dossier :hp2.Modles multimdia:ehp2.
+vers un emplacement souhait sur le bureau.
+
+:p.Pour plus d'informations et les mises 
+ jour rendez-vous sur &colon.
+
+:p.https&colon.//trac.netlabs.org/cwmmclasses/wiki
+:p.
+
+.* ----------------------------------------------------------------------------
+.* plaunchpad
+.* ----------------------------------------------------------------------------
+:h2 res=350 name=plaunchpad
+    x=left y=bottom width=100% height=100%.Lanceur
+
+:p.En bas 
+ gauche de l'diteur de liste de lecture M3U se trouve une
+bote carre.
+Glissez et dposez un fichier multimdia sur le lanceur pour l'ajouter 
+
+la palette. Le nom du fichier est affich dans l'info-bulle du bouton.
+Glissez et dposez des fichiers supplmentaires entre les lments
+existants dans le lanceur ou 
+ droite du dernier lment.
+Cliquez sur l'un de ces lments pour commencer sa lecture.
+
+:p.Le lanceur est commun aux dossiers de lecture multimdia, lecture de
+CD et de liste de lecture M3U.
+
+:note.utilisez le menu contextuel du bouton pour contrler la lecture.
+
+:warning.Bien qu'il soit possible d'ajouter des fichiers MP3, Ogg et
+autres fichiers multimdias numriques au lanceur, n'ajoutez pas de
+pistes de CD ici. Les pistes de CD ne pourront pas tre lues depuis le
+Lanceur.
+:p.
+
+:euserdoc.
Index: /tags/CWMM-0.3.0_GA/mediafolder/Help/mediafldr033_ecs.ipf
===================================================================
--- /tags/CWMM-0.3.0_GA/mediafolder/Help/mediafldr033_ecs.ipf	(revision 213)
+++ /tags/CWMM-0.3.0_GA/mediafolder/Help/mediafldr033_ecs.ipf	(revision 213)
@@ -0,0 +1,135 @@
+:userdoc.
+:docprof.
+:title.Aide 
+ propos du dossier Multimdia
+.* ----------------------------------------------------------------------------
+.* Product...............: Media Folder - eCS - Help file
+.* Language..............: French
+.* Original file version.:
+.* French translation....: Guillaume Gay <guillaume[dot]gay[arobase]gmail[dot]com>
+.* Version...............: 2020-07-23
+
+.* ----------------------------------------------------------------------------
+.* mplayer
+.* ----------------------------------------------------------------------------
+:h1 res=100 name=mplayer
+    x=left y=bottom width=100% height=100%.Aide pour le lecteur multimdia
+
+:p.Cet objet est un dossier multimedia. Glissez-y vos fichiers audio
+pour les lire. Pour l'organisation de cette liste, assurez-vous que
+:hp2.Affichage:ehp2. | :hp2.Tri:ehp2. |
+:hp1.Toujours conserver l'ordre de tri:ehp1. est dslectionne, ainsi
+que toute autre option de tri qui pourrait affecter le tri manuel, puis
+glissez et dposez les pistes comme vous le souhaitez.
+
+:p.Utilisez les boutons ou le clavier pour le contrle de la lecture.
+La case 
+ cocher :hp2.Rpter:ehp2. entranera une lecture continue de
+la piste actuellement slectionne. La case 
+ cocher
+:hp2.Alatoire:ehp2. permettra une lecture des pistes de manire
+arbitraire, sauf si la case 
+ cocher :hp2.Rpter:ehp2. a t coche.
+
+:p.Pour plus d'informations et les mises 
+ jour rendez-vous sur &colon.
+:p.https&colon.//trac.netlabs.org/cwmmclasses/wiki
+
+:nt text='Remarque &colon.'.pour la lecture des fichiers MP3, comme
+pour les fichiers Ogg (Vorbis et FLAC), une procdure d'Entre/Sortie
+multimdia ("multimedia IO procedure" ou "MMIOProc") approprie est
+ncessaire.
+Les paquetages MMIOProc sont inclus dans dans "MMAudio Pak 2",
+disponible sur &colon.
+
+:p.http&colon.//r6.ca/MMAudioPak/
+
+:p.:hp2.Contrles au clavier:ehp2.
+
+:p.Utilisez les touches suivantes pour contrler le dossier Mdia. Les
+boutons de la partie suprieure du dossier doivent avoir le focus lors
+de l'utilisation de ces touches. Utilisez :hp2.&lt.Tab&gt.:ehp2. pour
+basculer le focus du conteneur vers les boutons.
+
+:ul compact.
+:li.P:hp8.R:ehp8.cdent
+:li.:hp8.A:ehp8.rrt
+:li.:hp8.P:ehp8.ause
+:li.:hp8.L:ehp8.ecture
+:li.:hp8.S:ehp8.uivant
+:li.Rp:hp8.T:ehp8.er
+:li.Alat:hp8.O:ehp8.ire
+:eul.
+:p.
+
+.* ----------------------------------------------------------------------------
+.* cplayer
+.* ----------------------------------------------------------------------------
+:h1 res=200 name=cplayer
+    x=left y=bottom width=100% height=100%.Aide pour le lecteur CD
+:p.Cet objet est un lecteur CD avec prise en charge de FreeDB.
+Le titre de chaque piste et autres mtadonnes sont rcupres depuis un
+serveur compatible FreeDB, si une connexion 
+ Internet est disponible.
+
+:p.Pour plus d'informations et les mises 
+ jour rendez-vous sur &colon.
+
+:p.https&colon.//trac.netlabs.org/cwmmclasses/wiki
+
+:nt.la plupart des serveurs CDDB suivent la mme pratique que FreeDB qui
+consiste 
+ exiger une adresse de courriel valide pour l'accs. Utilisez
+l'objet de :hp2.configuration du client FreeDB:ehp2. dans le dossier
+:hp2.Multimdia:ehp2. pour paramtrer tout cela.
+:ent.
+
+:p.:hp2.Contrles au clavier:ehp2.
+
+:p.Utilisez les touches suivantes pour contrler le lecteur CD. Les
+boutons de la partie suprieure du dossier doivent avoir le focus lors
+de l'utilisation de ces touches. Utilisez :hp2.&lt.Tab&gt.:ehp2. pour
+basculer le focus du conteneur vers les boutons.
+
+:ul compact.
+:li.P:hp8.R:ehp8.cdent
+:li.:hp8.A:ehp8.rrt
+:li.:hp8.P:ehp8.ause
+:li.:hp8.L:ehp8.ecture
+:li.:hp8.S:ehp8.uivant
+:li.Rp:hp8.T:ehp8.er
+:eul.
+:p.
+
+.* ----------------------------------------------------------------------------
+.* peditor
+.* ----------------------------------------------------------------------------
+:h1 res=300 name=peditor
+    x=left y=bottom width=100% height=100%.Aide pour l'diteur de liste de lecture
+:p.Utilisez l'diteur de liste de lecture pour crer ou modifier des
+listes de lecture M3U.
+Une liste de lecture M3U est un fichier texte qui contient les chemins
+(URL) vers les pistes auxquelles il fait rfrence.
+
+:p.Le M3U (Moving Picture Experts Group Audio Layer 3 Uniform Resource
+Locator). Le M3U est un standard :hp1.de facto:ehp1.&comma. en gnral
+reconnu par la plupart des lecteurs MP3.
+
+:p.Pour ajouter des pistes, glissez et dposez-les dans l'diteur.
+Pour l'organisation de cette liste, assurez-vous que l'option
+:hp1.Toujours conserver l'ordre de tri:ehp1. du sous-menu
+:hp2.Trier:ehp2. est dslectionne, ainsi que toute autre option de
+tri qui pourrait affecter le tri manuel, puis glissez et dposez les
+pistes comme vous le souhaitez. Enregistrez la liste de lecture en
+slectionnant :hp2.Fichier|Enregistrer:ehp2. depuis le menu.
+
+:p.Pour crer une nouvelle liste de lecture, glissez le modle de liste
+de lecture M3U depuis le dossier :hp2.Modles multimdia:ehp2.
+vers un emplacement souhait sur le bureau.
+
+:p.Pour plus d'informations et les mises 
+ jour rendez-vous sur &colon.
+
+:p.https&colon.//trac.netlabs.org/cwmmclasses/wiki
+:p.
+:euserdoc.
Index: /tags/CWMM-0.3.0_GA/mediafolder/Help/mediafldr034.ipf
===================================================================
--- /tags/CWMM-0.3.0_GA/mediafolder/Help/mediafldr034.ipf	(revision 213)
+++ /tags/CWMM-0.3.0_GA/mediafolder/Help/mediafldr034.ipf	(revision 213)
@@ -0,0 +1,218 @@
+:userdoc.
+
+:docprof toc=123456.
+
+:title.Ayuda para Carpetas de medios
+
+.* ----------------------------------------------------------------------------
+:h1 res=100 name=mplayer.Reproductor de medios
+:p.Este objeto es una Carpeta de medios. Arrastre uno o m s archivos de audio
+hasta ella para reproducirlos. Para reordenarlos, aseg£rese de desmarcar la
+opci¢n :hp1.Mantener siempre el orden:ehp1. del submen£
+:hp2.Ver &rarrow. Ordenar:ehp2., as¡ como cualesquiera otras opciones de
+clasificaci¢n que puedan afectar a la ordenaci¢n manual, y arrastre y suelte
+las pistas como desee.
+
+:p.Use los botones o el :link reftype=hd refid=mkeyboard.teclado:elink. para
+controlar la reproducci¢n. La casilla ®Bucle¯ har  que la pista seleccionada
+actualmente se reproduzca de forma continua. La casilla ®Orden aleatorio¯
+seleccionar  las pistas al azar a no ser que se haya marcado ®Bucle¯.
+
+:p.M s informaci¢n y actualizaciones&colon.
+
+:p.https&colon.//trac.netlabs.org/cwmmclasses/wiki
+
+:nt.Es necesario instalar un procedimiento E/S multimedia (MMIOProc) para MP3
+adecuado para reproducir archivos MP3, como lo es otro procedimiento E/S para
+los archivos Ogg (Vorbis y FLAC). stos se incluyen en el MMAudio Pak 2,
+disponible en&colon.
+
+:p.http&colon.//r6.ca/MMAudioPak/
+
+:p.(Por omisi¢n, se incluye soporte para los formatos Ogg ArcaOS 5.x y
+superior.) :ent.
+
+.* ----------------------------------------------------------------------------
+:h2 res=110 name=mview.Opciones de vista
+:p.Por omisi¢n, las Carpetas de medios se abren en vista de detalles, listando
+los detalles espec¡ficos de cada pista por cada objeto o archivo que se haya
+a€adido a la carpeta principal.
+
+:p.Para cambiar a la vista compacta, seleccione Ver &rarrow. en el men£
+principal. En este modo el contenido de la carpeta no se muestra; no obstante
+los botones de la :link reftype=hd refid=mlaunchpad.lanzadera:elink. s¡ ser n
+visibles.
+
+:note text='Consejo:'.seleccione los archivos que quiera reproducir
+seguidos reordenando el contenido de la carpeta si es necesario, pulse
+:hp2.Reproducir:ehp2., y cambie a vista compacta.
+
+.* ----------------------------------------------------------------------------
+:h2 res=120 name=mkeyboard.Control mediante teclas
+:ul compact.
+:li.:hp2.A:ehp2.nterior
+:li.:hp2.D:ehp2.etener
+:li.:hp2.P:ehp2.ausa
+:li.:hp2.R:ehp2.eproducir
+:li.:hp2.S:ehp2.iguiente
+:li.:hp2.B:ehp2.ucle
+:li.:hp2.O:ehp2.rden aleatorio
+:eul.
+
+.* ----------------------------------------------------------------------------
+:h2 res=130 name=mvolume.Control de volumen
+:p.Bajo los botones del reproductor est  el control deslizante Volumen. ste
+controla el volumen de reproducci¢n dentro de los l¡mites establecidos por el
+control de volumen maestro del sistema.
+
+.* ----------------------------------------------------------------------------
+:h2 res=140 name=mtrackpos.Control de posici¢n de pistas
+:p.A la derecha de los botones del reproductor est  el control deslizante de
+posici¢n en pista. Deslice hacia adelante o atr s el control para reproducir el
+archivo actual desde una nueva posici¢n.
+
+.* ----------------------------------------------------------------------------
+:h2 res=150 name=mlaunchpad.Lanzadera
+:p.Hacia la esquina inferior izquierda de la carpeta de medios hay un cajet¡n
+cuadrado. Arrastre un archivo de medios hasta l para a€adirlo a la paleta. El
+nombre del archivo se mostrar  como texto emergente al colocar el rat¢n sobre
+el bot¢n. Arrastre m s archivos hasta los espacios entre los elementos a€adidos
+a la lanzadera, o a la derecha del £ltimo. Pulse sobre cualquiera de ellos para
+reproducirlo.
+
+:p.La Lanzadera es compartida (£nica y la misma) entre todas las Carpetas de
+medios, reproductor de CD y listas de reproducci¢n M3U.
+
+:note.Cuando se inicia la reproducci¢n de esta forma, el
+:link reftype=hd refid=mtrackpos.deslizador de posici¢n en pista:elink.
+no refleja el estado de reproducci¢n actual y los botones no controlan la
+reproducci¢n. En su lugar, utilice el men£ de contexto del bot¢n para controlar
+la reproducci¢n.
+
+:warning.aunque es posible a€adir archivos MP3, Ogg y otros archivos de medios
+digitales a la Lanzadera, no a€ada pistas de CD aqu¡. Las pistas de CD no se
+pueden reproducir desde la Lanzadera.:ewarning.
+
+.* ----------------------------------------------------------------------------
+:h1 res=200 name=cplayer.Reproductor de CD
+:p.Este objeto es un reproductor de CD con soporte de CDDB. Si hay disponible
+una conexi¢n a Internet se consulta los nombres de las pistas y otra
+informaci¢n en el servidor compatible con FreeDB que se configure.
+
+:p.M s informaci¢n y actualizaciones&colon.
+
+:p.https&colon.//trac.netlabs.org/cwmmclasses/wiki
+
+:nt.
+La mayor¡a de servidores CDDB siguen la pr ctica de FreeDB de solicitar una
+direcci¢n de correo v lida para acceder. Utilice el objeto Configuraci¢n del
+cliente CDDB en la carpeta Multimedia para establecer una.
+:ent.
+
+.* ----------------------------------------------------------------------------
+:h2 res=210 name=cview.Opciones de vista
+:p.Por omisi¢n, el reproductor de CD se abre en vista de detalles, listando los
+detalles de cada pista del disco introducido.
+
+:p.Para cambiar a la vista compacta, seleccione Ver &rarrow. Vista compacta en
+el men£ principal. En este modo el contenido de la carpeta no se muestra; no
+obstante los botones de la :link reftype=hd refid=mlaunchpad.lanzadera:elink.
+s¡ ser n visibles.
+
+:note text='Consejo:'.seleccione la primera pista que quiera escuchar, pulse
+:hp2.Reproducir:ehp2., y cambie a vista compacta.
+
+.* ----------------------------------------------------------------------------
+:h2 res=220 name=ckeyboard.Control mediante teclas
+:p.Use las siguientes teclas para controlar el reproductor de CD. El foco debe
+estar sobre los botones de la parte superior del reproductor para usar estas
+teclas. Use :hp2.&lt.Tab&gt.:ehp2. para pasar el foco del contenedor a los
+botones.
+
+:ul compact.
+:li.:hp2.A:ehp2.nterior
+:li.:hp2.D:ehp2.etener
+:li.:hp2.P:ehp2.ausa
+:li.:hp2.R:ehp2.eproducir
+:li.:hp2.S:ehp2.iguiente
+:li.:hp2.B:ehp2.ucle
+:eul.
+
+.* ----------------------------------------------------------------------------
+:h2 res=230 name=cvolume.Control de volumen
+:p.Bajo los botones del reproductor est  el control deslizante Volumen. ste
+controla el volumen de reproducci¢n dentro de los l¡mites establecidos por el
+control de volumen maestro del sistema.
+
+.* ----------------------------------------------------------------------------
+:h2 res=240 name=ctrackpos.Control de posici¢n de pistas
+:p.A la derecha de los botones del reproductor est  el control deslizante de
+posici¢n en pista. Deslice hacia adelante o atr s el control para reproducir la
+pista actual desde una nueva posici¢n.
+
+.* ----------------------------------------------------------------------------
+:h2 res=250 name=claunchpad.Lanzadera
+:p.Hacia la esquina inferior izquierda de la carpeta de medios hay un cajet¡n
+cuadrado. Arrastre un archivo de medios hasta l para a€adirlo a la paleta. El
+nombre del archivo se mostrar  como texto emergente al colocar el rat¢n sobre
+el bot¢n. Arrastre m s archivos hasta los espacios entre los elementos a€adidos
+a la lanzadera, o a la derecha del £ltimo. Pulse sobre cualquiera de ellos para
+reproducirlo.
+
+:p.La Lanzadera es compartida (£nica y la misma) entre todas las Carpetas de
+medios, reproductor de CD y listas de reproducci¢n M3U.
+
+:note.Cuando se inicia la reproducci¢n de esta forma, el
+:link reftype=hd refid=mtrackpos.deslizador de posici¢n en pista:elink.
+no refleja el estado de reproducci¢n actual y los botones no controlan la
+reproducci¢n. En su lugar, utilice el men£ de contexto del bot¢n para controlar
+la reproducci¢n.
+
+:warning.aunque es posible a€adir archivos MP3, Ogg y otros archivos de medios
+digitales a la Lanzadera, no a€ada pistas de CD aqu¡. Las pistas de CD no se
+pueden reproducir desde la Lanzadera.:ewarning.
+
+.* ----------------------------------------------------------------------------
+:h1 res=300 name=peditor.Editor de listas de reproducci¢n
+:p.Utilice el editor de listas de reproducci¢n para modificar las listas de
+reproducci¢n M3U. Una lista de reproducci¢n M3U es un archivo de texto que
+contiene v¡as de acceso (URLs) a las pistas que referencia.
+
+:p.M3U (Moving Picture Experts Group Audio Layer 3 Uniform Resource Locator).
+M3U es un est ndar :hp1.de facto:ehp1., generalmente reconocido por la mayor¡a
+de reproductores MP3.
+
+:p.Para a€adir pistas, arr strelas el editor. Para reordenar, aseg£rese de
+desmarcar la opci¢n :hp1.Mantener siempre el orden:ehp1. del submen£
+:hp2.Ordenar:ehp2., as¡ como cualesquiera otras opciones de clasificaci¢n que
+puedan afectar a la ordenaci¢n manual, y arrastre y suelte las pistas como
+desee. Guarde la lista de reproducci¢n seleccionando :hp2.Archivo &rarrow.
+Guardar:ehp2. en el men£.
+
+:p.Para crear una nueva lista de reproducci¢n, arrastre el modelo de lista de
+reproducci¢n M3U de la carpeta Modelos de multimedia a un lugar adecuado del
+escritorio.
+
+:p.M s informaci¢n y actualizaciones&colon.
+
+:p.https&colon.//trac.netlabs.org/cwmmclasses/wiki
+
+.* ----------------------------------------------------------------------------
+:h2 res=350 name=plaunchpad.Lanzadera
+:p.Hacia la esquina inferior izquierda del editor de listas de reproducci¢n M3U
+hay un cajet¡n cuadrado. Arrastre un archivo de medios hasta l para a€adirlo a
+la paleta. El nombre del archivo se mostrar  como texto emergente al colocar el
+rat¢n sobre el bot¢n. Arrastre m s archivos hasta los espacios entre los
+elementos a€adidos a la lanzadera, o a la derecha del £ltimo. Pulse sobre
+cualquiera de ellos para reproducirlo.
+
+:p.La Lanzadera es compartida (£nica y la misma) entre todas las Carpetas de
+medios, reproductor de CD y listas de reproducci¢n M3U.
+
+:note.Utilice el men£ de contexto del bot¢n para controlar la reproducci¢n.
+
+:warning.aunque es posible a€adir archivos MP3, Ogg y otros archivos de medios
+digitales a la Lanzadera, no a€ada pistas de CD aqu¡. Las pistas de CD no se
+pueden reproducir desde la Lanzadera.:ewarning.
+
+:euserdoc.
Index: /tags/CWMM-0.3.0_GA/mediafolder/Help/mediafldr034_ecs.ipf
===================================================================
--- /tags/CWMM-0.3.0_GA/mediafolder/Help/mediafldr034_ecs.ipf	(revision 213)
+++ /tags/CWMM-0.3.0_GA/mediafolder/Help/mediafldr034_ecs.ipf	(revision 213)
@@ -0,0 +1,253 @@
+:userdoc.
+
+:docprof toc=123456.
+
+:title.Ayuda para la distribuci¢n Carpeta de medios
+
+Help for Media Folder distribution 
+
+.* ----------------------------------------------------------------------------
+:h1 res=100 name=mplayer
+    x=left y=bottom width=100% height=100%.Reproductor de medios
+
+Este objeto es una Carpeta de medios. Arrastre uno o m s archivos de audio
+hasta ella para reproducirlos. Para reordenarlos, aseg£rese de deseleccionar la
+opci¢n :hp1.Mantener siempre el orden:ehp1. del submen£
+:hp2.Ver &rarrow. Clasificar:ehp2., as¡ como cualesquiera otras opciones de
+clasificaci¢n que puedan afectar a la ordenaci¢n manual, y arrastre y suelte
+las pistas como desee.
+
+:p.Use los botones o el :link reftype=hd refid=mkeyboard.teclado:elink. para
+controlar la reproducci¢n. La casilla ®Bucle¯ har  que la pista seleccionada
+actualmente se reproduzca de forma continua. La casilla ®Orden aleatorio¯
+seleccionar  las pistas al azar a no ser que se haya marcado ®Bucle¯.
+
+:p.M s informaci¢n y actualizaciones&colon.
+
+:p.https&colon.//trac.netlabs.org/cwmmclasses/wiki
+
+:nt.Es necesario instalar un procedimiento E/S multimedia (MMIOProc) para MP3
+adecuado para reproducir archivos MP3, como lo es otro procedimiento E/S para
+los archivos Ogg (Vorbis y FLAC). stos se incluyen en el MMAudio Pak 2,
+disponible en&colon.
+
+:p.http&colon.//r6.ca/MMAudioPak/
+
+:p.(Por omisi¢n, se incluye soporte para los formatos Ogg ArcaOS 5.x y
+superior.) :ent.
+
+.* ----------------------------------------------------------------------------
+:h2 res=110 name=mview
+    x=left y=bottom width=100% height=100%.Opciones de vista
+
+Por omisi¢n, las Carpetas de medios se abren en vista de detalles, listando los
+detalles espec¡ficos de cada pista por cada objeto o archivo que se haya
+a€adido a la carpeta principal.
+
+:p.Para cambiar a la vista compacta, seleccione Ver &rarrow. en el men£
+principal. En este modo el contenido de la carpeta no se muestra; no obstante
+los botones de la :link reftype=hd refid=mlaunchpad.lanzadera:elink. s¡ ser n
+visibles.
+
+:note text='Consejo:'.seleccione los archivos que quiera reproducir
+seguidos reordenando el contenido de la carpeta si es necesario, pulse 
+:hp2.Reproducir:ehp2., y cambie a vista compacta.
+
+.* ----------------------------------------------------------------------------
+:h2 res=120 name=mkeyboard
+    x=left y=bottom width=100% height=100%.Control mediante teclas
+
+
+:ul compact.
+:li.:hp2.A:ehp2.nterior
+:li.:hp2.D:ehp2.etener
+:li.:hp2.P:ehp2.ausa
+:li.:hp2.R:ehp2.eproducir
+:li.:hp2.S:ehp2.iguiente
+:li.:hp2.B:ehp2.ucle
+:li.:hp2.A:ehp2.leatorio
+:eul.
+
+.* ----------------------------------------------------------------------------
+:h2 res=130 name=mvolume
+    x=left y=bottom width=100% height=100%.Control de volumen
+
+Bajo los botones del reproductor est  el control deslizante Volumen. ste
+controla el volumen de reproducci¢n dentro de los l¡mites establecidos por el
+control de volumen maestro del sistema.
+
+.* ----------------------------------------------------------------------------
+:h2 res=140 name=mtrackpos
+    x=left y=bottom width=100% height=100%.Control de posici¢n de pistas
+
+A la derecha de los botones del reproductor est  el control deslizante de
+posici¢n en pista. Deslice hacia adelante o atr s el control para reproducir
+el archivo actual desde una nueva posici¢n.
+
+.* ----------------------------------------------------------------------------
+:h2 res=150 name=mlaunchpad
+    x=left y=bottom width=100% height=100%.Lanzadera
+
+Hacia la esquina inferior izquierda de la carpeta de medios hay un cajet¡n
+cuadrado. Arrastre un archivo de medios hasta l para a€adirlo a la paleta. El
+nombre del archivo se mostrar  como texto emergente al colocar el rat¢n sobre
+el bot¢n. Arrastre m s archivos hasta los espacios entre los elementos a€adidos
+a la lanzadera, o a la derecha del £ltimo. Pulse sobre cualquiera de ellos para
+reproducirlo.
+
+:p.La Lanzadera es compartida entre todas las Carpetas de medios, reproductor
+de CD y listas de reproducci¢n M3U.
+
+:note.Cuando se inicia la reproducci¢n de esta forma, el
+:link reftype=hd refid=mtrackpos.deslizador de posici¢n en pista:elink. no
+refleja el estado de reproducci¢n actual y los botones no controlan la
+reproducci¢n. En su lugar, utilice el men£ de contexto del bot¢n para
+controlar la reproducci¢n.
+
+:warning.aunque es posible a€adir archivos MP3, Ogg y otros medios digitales a
+la Lanzadera, no a€ada pistas de CD aqu¡. Las pistas de CD no se pueden
+reproducir desde la Lanzadera.:ewarning.
+
+.* ----------------------------------------------------------------------------
+:h1 res=200 name=cplayer
+    x=left y=bottom width=100% height=100%.Reproductor de CD
+
+Este objeto es un reproductor de CD con soporte de CDDB. Si hay disponible una
+conexi¢n a Internet se consulta los nombres de las pistas y otra informaci¢n en
+el servidor compatible con FreeDB que se configure.
+
+:p.M s informaci¢n y actualizaciones&colon.
+
+:p.https&colon.//trac.netlabs.org/cwmmclasses/wiki
+
+:nt.
+La mayor¡a de servidores CDDB siguen la pr ctica de FreeDB de solicitar una
+direcci¢n de correo v lida para acceder. Utilice el objeto Configuraci¢n del
+cliente FreeDB en la carpeta Multimedia para establecer una.
+:ent.
+
+.* ----------------------------------------------------------------------------
+:h2 res=210 name=cview
+    x=left y=bottom width=100% height=100%.Opciones de vista
+
+Por omisi¢n, el reproductor de CD se abre en vista de detalles, listando los
+detalles de cada pista del disco introducido.
+
+:p.Para cambiar a la vista compacta, seleccione Ver &rarrow. Vista compacta en
+el men£ principal. En este modo el contenido de la carpeta no se muestra; no
+obstante los botones de la :link reftype=hd refid=mlaunchpad.lanzadera:elink.
+s¡ ser n visibles.
+
+:note text='Consejo:'.seleccione la primera pista que quiera escuchar, pulse
+:hp2.Reproducir:ehp2., y cambie a vista compacta.
+
+.* ----------------------------------------------------------------------------
+:h2 res=220 name=ckeyboard
+    x=left y=bottom width=100% height=100%.Control mediante teclas
+
+Use las siguientes teclas para controlar el reproductor de CD. El foco debe
+estar sobre los botones de la parte superior del reproductor para usar estas
+teclas. Use :hp2.&lt.Tab&gt.:ehp2. para pasar el foco del contenedor a los
+botones.
+
+:ul compact.
+:li.:hp2.A:ehp2.nterior
+:li.:hp2.D:ehp2.etener
+:li.:hp2.P:ehp2.ausa
+:li.:hp2.R:ehp2.eproducir
+:li.:hp2.S:ehp2.iguiente
+:li.:hp2.B:ehp2.ucle
+:eul.
+
+.* ----------------------------------------------------------------------------
+:h2 res=230 name=cvolume
+    x=left y=bottom width=100% height=100%.Control de volumen
+
+Bajo los botones del reproductor est  el control deslizante Volumen. ste
+controla el volumen de reproducci¢n dentro de los l¡mites establecidos por el
+control de volumen maestro del sistema.
+
+.* ----------------------------------------------------------------------------
+:h2 res=240 name=ctrackpos
+    x=left y=bottom width=100% height=100%.Control de posici¢n de pistas
+
+A la derecha de los botones del reproductor est  el control deslizante de
+posici¢n en pista. Deslice hacia adelante o atr s el control para reproducir
+la pista actual desde una nueva posici¢n.
+
+.* ----------------------------------------------------------------------------
+:h2 res=250 name=claunchpad
+    x=left y=bottom width=100% height=100%.Lanzadera
+
+Hacia la esquina inferior izquierda de la carpeta de medios hay un cajet¡n
+cuadrado. Arrastre un archivo de medios hasta l para a€adirlo a la paleta. El
+nombre del archivo se mostrar  como texto emergente al colocar el rat¢n sobre
+el bot¢n. Arrastre m s archivos hasta los espacios entre los elementos a€adidos
+a la lanzadera, o a la derecha del £ltimo. Pulse sobre cualquiera de ellos para
+reproducirlo.
+
+:p.La Lanzadera es compartida entre todas las Carpetas de medios, reproductor
+de CD y listas de reproducci¢n M3U.
+
+:note.Cuando se inicia la reproducci¢n de esta forma, el
+:link reftype=hd refid=mtrackpos.deslizador de posici¢n en pista:elink. no
+refleja el estado de reproducci¢n actual y los botones no controlan la
+reproducci¢n. En su lugar, utilice el men£ de contexto del bot¢n para
+controlar la reproducci¢n.
+
+:warning.aunque es posible a€adir archivos MP3, Ogg y otros medios digitales a
+la Lanzadera, no a€ada pistas de CD aqu¡. Las pistas de CD no se pueden
+reproducir desde la Lanzadera.:ewarning.
+
+.* ----------------------------------------------------------------------------
+:h1 res=300 name=peditor
+    x=left y=bottom width=100% height=100%.Editor de listas de reproducci¢n
+
+Utilice el editor de listas de reproducci¢n para modificar las listas de
+reproducci¢n M3U. Una lista de reproducci¢n M3U es un archivo de texto que
+contiene v¡as de acceso (URLs) a las pistas que referencia.
+
+:p.M3U (Moving Picture Experts Group Audio Layer 3 Uniform Resource Locator).
+n est ndar :hp1.de facto:ehp1., generalmente reconocido por la mayor¡a de
+reproductores MP3.
+
+:p.Para a€adir pistas, arr strelas el editor. Para reordenar, aseg£rese de
+deseleccionar la opci¢n :hp1.Mantener siempre el orden:ehp1. del submen£
+:hp2.Clasificar:ehp2., as¡ como cualesquiera otras opciones de clasificaci¢n
+que puedan afectar a la ordenaci¢n manual, y arrastre y suelte las pistas como
+desee. Guarde la lista de reproducci¢n seleccionando :hp2.Archivo &rarrow.
+Guardar:ehp2. en el men£.
+
+:p.Para crear una nueva lista de reproducci¢n, arrastre el modelo de lista de
+reproducci¢n M3U de la carpeta Modelos de multimedia a un lugar adecuado del
+escritorio.
+
+:p.M s informaci¢n y actualizaciones&colon.
+
+:p.https&colon.//trac.netlabs.org/cwmmclasses/wiki
+
+.* ----------------------------------------------------------------------------
+:h2 res=350 name=plaunchpad
+    x=left y=bottom width=100% height=100%.Lanzadera
+
+Hacia la esquina inferior izquierda del editor de listas de reproducci¢n M3U
+hay un cajet¡n cuadrado. Arrastre un archivo de medios hasta l para a€adirlo a
+la paleta. El nombre del archivo se mostrar  como texto emergente al colocar el
+rat¢n sobre el bot¢n. Arrastre m s archivos hasta los espacios entre los
+elementos a€adidos a la lanzadera, o a la derecha del £ltimo. Pulse sobre
+cualquiera de ellos para reproducirlo.
+
+:p.La Lanzadera es compartida entre todas las Carpetas de medios, reproductor
+de CD y listas de reproducci¢n M3U.
+
+:note.Utilice el men£ de contexto del bot¢n para controlar la reproducci¢n.
+
+:warning.aunque es posible a€adir archivos MP3, Ogg y otros medios digitales a
+la Lanzadera, no a€ada pistas de CD aqu¡. Las pistas de CD no se pueden
+reproducir desde la Lanzadera.:ewarning.
+ú
+:warning.While it is possible to add MP3, Ogg, and other digital media files to
+the Launchpad, do not add CD tracks here. CD tracks will not be playable from
+the Launchpad.
+
+:euserdoc.
Index: /tags/CWMM-0.3.0_GA/mediafolder/Help/mediafldr039.ipf
===================================================================
--- /tags/CWMM-0.3.0_GA/mediafolder/Help/mediafldr039.ipf	(revision 213)
+++ /tags/CWMM-0.3.0_GA/mediafolder/Help/mediafldr039.ipf	(revision 213)
@@ -0,0 +1,110 @@
+:userdoc.
+
+:docprof.
+
+:title.Aiuto per Media Folder
+
+:h1 res=100.Aiuto per Media Player
+:p.
+Questo oggetto  una cartella multimediale. Copiandovi dentro dei file audio, li si
+possono riprodurre nell'ordine desiderato (usare il drag and drop per riordinarli).
+Sono disponibili i normali controlli per la riproduzione dei file audio (play, stop, volume).
+:p.
+Ulteriori informazioni ed aggiornamenti:
+:p.
+:link reftype=launch
+object='netscape.exe'
+data='http://www.os2world.com/cdwriting'.
+http&colon.//www.os2world.com/cdwriting:elink.
+.br
+:link reftype=launch
+object='netscape.exe'
+data='http://www.geocities.com/SiliconValley/Sector/5785/'.
+http&colon.//www.geocities.com/SiliconValley/Sector/5785/:elink.
+:p.
+:nt.
+:p.
+Per poter riprodurre i file MP3 bisogna disporre della procedura MMIOMP3 scritta
+da Russell O'Connor.
+:p.
+La si pu scaricare liberamente all'indirizzo
+:p.
+:link reftype=launch
+object='netscape.exe'
+data='http://www.math.berkeley.edu/~roconnor/'.
+http&colon.//www.math.berkeley.edu/~roconnor/:elink.
+:ent.
+:p.
+:hp2.Comandi tastiera:ehp2.
+:p.
+I tasti di seguito elencati permettono di controllare la cartella multimediale attraverso la tastiera; per
+poterli usare, i comandi nella parte superiore della cartella devono essere selezionati: si usi il tasto
+:hp2.Tab:ehp2. per selezionarli.
+:p.
+:ul.
+:li.:hp8.I:ehp8.ndietro
+:li.:hp8.S:ehp8.top
+:li.:hp8.P:ehp8.ausa
+:li.P:hp8.l:ehp8.ay
+:li.:hp8.A:ehp8.vanti
+:li.:hp8.R:ehp8.ipeti
+:eul.
+
+:h1 res=200.Aiuto per CD-Player
+:p.
+Questo oggetto  un CD player con supporto FreeDB. I titoli delle tracce e altre informazioni
+possono essere recuperati da un server FreeDB purch si disponga di una connessione internet.
+:p.
+Ulteriori informazioni ed aggiornamenti:
+:p.
+:link reftype=launch
+object='netscape.exe'
+data='http://www.os2world.com/cdwriting'.
+http&colon.//www.os2world.com/cdwriting:elink.
+.br
+:link reftype=launch
+object='netscape.exe'
+data='http://www.geocities.com/SiliconValley/Sector/5785/'.
+http&colon.//www.geocities.com/SiliconValley/Sector/5785/:elink.
+:p.
+:nt.
+Per poter connettersi al server FreeDB bisogna installare l'apposito pacchetto e
+indicare il proprio indirizzo di posta elettronica. Si usi allo scopo l'oggetto
+configurazione specifico.
+:ent.
+:p.
+:hp2.Comandi tastiera:ehp2.
+:p.
+I tasti di seguito elencati permettono di controllare il CD Player attraverso la tastiera; per
+poterli usare, i comandi nella parte superiore della cartella devono essere selezionati: si usi il tasto
+:hp2.Tab:ehp2. per selezionarli.
+:p.
+:ul.
+:li.:hp8.I:ehp8.ndietro
+:li.:hp8.S:ehp8.top
+:li.:hp8.P:ehp8.ausa
+:li.P:hp8.l:ehp8.ay
+:li.:hp8.A:ehp8.vanti
+:li.:hp8.R:ehp8.ipeti
+:eul.
+
+:h1 res=300.Aiuto per l'editor di playlist
+:p.
+L'editor di playlist permette di creare e modificare playlist M3U. Queste
+playlist sono usate, per esempio, dai lettori portatili MP3 e consistono di
+un file di testo contenente nome e percorso delle tracce da riprodurre.
+:p.
+Ulteriori informazioni ed aggiornamenti:
+:p.
+:link reftype=launch
+object='netscape.exe'
+data='http://www.os2world.com/cdwriting'.
+http&colon.//www.os2world.com/cdwriting:elink.
+.br
+:link reftype=launch
+object='netscape.exe'
+data='http://www.geocities.com/SiliconValley/Sector/5785/'.
+http&colon.//www.geocities.com/SiliconValley/Sector/5785/:elink.
+
+
+:euserdoc.
Index: /tags/CWMM-0.3.0_GA/mediafolder/Help/mediafldr039_ecs.ipf
===================================================================
--- /tags/CWMM-0.3.0_GA/mediafolder/Help/mediafldr039_ecs.ipf	(revision 213)
+++ /tags/CWMM-0.3.0_GA/mediafolder/Help/mediafldr039_ecs.ipf	(revision 213)
@@ -0,0 +1,75 @@
+:userdoc.
+
+:docprof.
+
+:title.Aiuto per Media Folder
+
+:h1 res=100.Aiuto per Media Player
+:p.
+Questo oggetto  una cartella multimediale. Copiandovi dentro dei file audio, li si
+possono riprodurre nell'ordine desiderato (usare il drag and drop per riordinarli).
+Sono disponibili i normali controlli per la riproduzione dei file audio (play, stop, volume).
+:p.
+:nt.
+:p.
+Per poter riprodurre i file MP3 bisogna disporre della procedura MMIOMP3 scritta
+da Russell O'Connor.
+:p.
+La si pu scaricare liberamente all'indirizzo
+:p.
+:link reftype=launch
+object='netscape.exe'
+data='http://www.math.berkeley.edu/~roconnor/'.
+http&colon.//www.math.berkeley.edu/~roconnor/:elink.
+:ent.
+:p.
+:hp2.Comandi tastiera:ehp2.
+:p.
+I tasti di seguito elencati permettono di controllare la cartella multimediale attraverso la tastiera; per
+poterli usare, i comandi nella parte superiore della cartella devono essere selezionati: si usi il tasto
+:hp2.Tab:ehp2. per selezionarli.
+:p.
+:ul.
+:li.:hp8.I:ehp8.ndietro
+:li.:hp8.S:ehp8.top
+:li.:hp8.P:ehp8.ausa
+:li.P:hp8.l:ehp8.ay
+:li.:hp8.A:ehp8.vanti
+:li.:hp8.R:ehp8.ipeti
+:eul.
+
+:h1 res=200.Aiuto per CD-Player
+:p.
+Questo oggetto  un CD player con supporto FreeDB. I titoli delle tracce e altre informazioni
+possono essere recuperati da un server FreeDB purch si disponga di una connessione internet.
+:p.
+:nt.
+Per poter connettersi ad un server FreeDB bisogna specificare
+il proprio indirizzo di posta elettronica. Si usi allo scopo l'apposito
+oggetto configurazione.
+:ent.
+:p.
+:hp2.Comandi tastiera:ehp2.
+:p.
+I tasti di seguito elencati permettono di controllare il CD Player attraverso la tastiera; per
+poterli usare, i comandi nella parte superiore della cartella devono essere selezionati: si usi il tasto
+:hp2.Tab:ehp2. per selezionarli.
+:p.
+:ul.
+:li.:hp8.I:ehp8.ndietro
+:li.:hp8.S:ehp8.top
+:li.:hp8.P:ehp8.ausa
+:li.P:hp8.l:ehp8.ay
+:li.:hp8.A:ehp8.vanti
+:li.:hp8.R:ehp8.ipeti
+:eul.
+
+:h1 res=300.Aiuto per l'editor di playlist
+:p.
+L'editor di playlist permette di creare e modificare playlist M3U. Queste
+playlist sono usate, per esempio, dai lettori portatili MP3 e consistono di
+un file di testo contenente nome e percorso delle tracce da riprodurre.
+:p.
+
+
+:euserdoc.
Index: /tags/CWMM-0.3.0_GA/mediafolder/Help/mediafldr049.ipf
===================================================================
--- /tags/CWMM-0.3.0_GA/mediafolder/Help/mediafldr049.ipf	(revision 213)
+++ /tags/CWMM-0.3.0_GA/mediafolder/Help/mediafldr049.ipf	(revision 213)
@@ -0,0 +1,253 @@
+:userdoc.
+
+:docprof.
+
+:title.Hilfe fr Media-Folder 
+
+.* ----------------------------------------------------------------------------
+:h1 res=100 name=mplayer
+    x=left y=bottom width=100% height=100%.Hilfe fr Media Spieler
+:p.Dieses Objekt ist ein Medienordner. Ziehen Sie eine oder mehrere Audiodateien
+zum Abspielen hinein. Um die Reihenfolge zu ndern, stellen Sie sicher, dass die
+Option Ansicht | Sortieren > Sortierreihenfolge immer beibehalten sowie alle
+anderen Sortieroptionen, die die manuelle Sortierung beeinflussen knnten,
+deaktiviert sind und ziehen Sie die Titel nach Wunsch per Drag &amp. Drop in den
+Ordner.
+
+:p.Verwenden Sie die Schaltflchen oder
+:link reftype=hd refid=mkeyboard.Keyboard:elink., um die Wiedergabe zu steuern.
+Das Kontrollkstchen "Wiederholen" bewirkt, dass der aktuell ausgewhlte Titel
+kontinuierlich wiederholt wird. Das Kontrollkstchen "Zufllig" whlt Titel
+willkrlich aus, sofern das Kontrollkstchen "Wiederholen" nicht aktiviert
+wurde.
+
+:p.Weitere Informationen und Updates&colon.
+
+:p.https&colon.//trac.netlabs.org/cwmmclasses/wiki
+
+:nt.
+Um MP3-Dateien abzuspielen, ist ein geeigneter MP3-MMIOProc erforderlich,
+ebenso wie ein geeigneter MMIOProc fr Ogg-Dateien (Vorbis und FLAC). Diese
+sind im MMAudio Pak 2 enthalten, erhltlich bei&colon.
+
+:p.http&colon.//r6.ca/MMAudioPak/
+
+:p.(Ogg-Formate werden standardmáig in ArcaOS 5.x und hher untersttzt.)
+:ent.
+
+.* ----------------------------------------------------------------------------
+:h2 res=110 name=mview
+    x=left y=bottom width=100% height=100%.Anzeigeoptionen
+
+Standardmáig werden Medienordner in der Detailansicht angezeigt, in der
+titelspezifische Details fr jede Datei oder jedes Objekt aufgelistet werden,
+das dem Hauptordner hinzugefgt wurde.
+
+:p.Um zur Kompaktansicht zu wechseln, whlen Sie im Hauptmen Ansicht | Kompakt.
+In diesem Modus ist der Ordnerinhalt ausgeblendet, die Schaltflchen
+:link reftype=hd refid=mlaunchpad.Launchpad:elink. sind jedoch sichtbar.
+
+:note text='Tipp:'.Whlen Sie Dateien zum fortlaufenden Abspielen aus und ordnen
+Sie den Ordnerinhalt bei Bedarf neu an. Klicken Sie auf :hp2.Play:ehp2. und
+ndern Sie dann die Ansicht auf "Kompakt".
+
+.* ----------------------------------------------------------------------------
+:h2 res=120 name=mkeyboard
+    x=left y=bottom width=100% height=100%.Tastaturbelegung
+
+Verwenden Sie die folgenden Tasten, um den Medienordner zu steuern. Bei
+Verwendung dieser Tasten mssen die Schaltflchen im oberen Teil des Ordners
+fokussiert sein. Verwenden Sie :hp2.&lt.Tab&gt.:ehp2., um den Fokus vom
+Container auf die Schaltflchen umzuschalten.
+
+:ul compact.
+:li.:hp2.Z:ehp2.urck
+:li.:hp2.S:ehp2.top
+:li.:hp2.P:ehp2.ause
+:li.S:hp2.t:ehp2.art
+:li.:hp2.V:ehp2.or
+:li.:hp2.W:ehp2.iederholen
+:li.Z:hp2.u:ehp2.fall
+:eul.
+
+.* ----------------------------------------------------------------------------
+:h2 res=130 name=mvolume
+    x=left y=bottom width=100% height=100%.Lautstrkeregler
+
+Unter den Playertasten befindet sich der Lautstrkeregler. Dieser regelt die
+Lautstrke fr die Wiedergabe innerhalb der Grenzen, die durch den
+Master-Lautstrkeregler fr das System festgelegt sind.
+
+.* ----------------------------------------------------------------------------
+:h2 res=140 name=mtrackpos
+    x=left y=bottom width=100% height=100%.Schieberegler fr din Track
+
+Rechts neben den Player-Schaltflchen befindet sich der Schieberegler fr die
+Track-Position. Ziehen Sie den Schieberegler nach vorne oder hinten, um den
+Wiedergabepunkt der aktuellen Datei neu zu positionieren.
+
+.* ----------------------------------------------------------------------------
+:h2 res=150 name=mlaunchpad
+    x=left y=bottom width=100% height=100%.Launchpad
+
+Unten links im Player-Ordner befindet sich ein quadratisches Kstchen. Ziehen
+Sie eine Mediendatei per Drag &amp. Drop auf das Launchpad, um sie der Palette
+hinzuzufgen. Der Dateiname wird im Tooltip der Schaltflche angezeigt. Ziehen
+Sie weitere Dateien per Drag &amp. Drop zwischen vorhandene Elemente im Launchpad
+oder rechts neben das letzte Element. Klicken Sie auf eines dieser Elemente, um
+die Wiedergabe zu starten.
+
+:p.Das Launchpad ist allen Medien-, CD-Player- und M3U-Wiedergabelistenordnern
+gemeinsam.
+
+:nt.Wenn die Wiedergabe auf diese Weise gestartet wird, spiegelt
+:link reftype=hd refid=mtrackpos.Track position slider:elink. nicht den
+aktuellen Wiedergabestatus wider und die Player-Schaltflchen steuern die
+Wiedergabe nicht. Verwenden Sie stattdessen das Kontextmen der Schaltflche, um
+die Wiedergabe zu steuern.
+:ent.
+
+:warning.Obwohl es mglich ist, MP3-, Ogg- und andere digitale Mediendateien zum
+Launchpad hinzuzufgen, fgen Sie hier keine CD-Titel hinzu. CD-Titel knnen vom
+Launchpad nicht abgespielt werden.
+
+.* ----------------------------------------------------------------------------
+:h1 res=200 name=cplayer
+    x=left y=bottom width=100% height=100%.CD-Spieler
+
+Bei diesem Objekt handelt es sich um einen CD-Player mit CDDB-Untersttzung.
+Titel und andere Metadaten werden bei vorhandener Internetverbindung von einem
+konfigurierten FreeDB-kompatiblen Server abgefragt.
+
+:p.Weitere Informationen und Updates&colon.
+
+:p.https&colon.//trac.netlabs.org/cwmmclasses/wiki
+
+:nt.
+Die meisten CDDB-Server folgen der FreeDB-Praxis und verlangen fr den Zugriff
+eine gltige E-Mail-Adresse. Verwenden Sie das CDDB-Client-Konfigurationsobjekt
+im Ordner "Multimedia", um dies festzulegen.
+:ent.
+
+.* ----------------------------------------------------------------------------
+:h2 res=210 name=cview
+    x=left y=bottom width=100% height=100%.Anzeigeoptionen
+
+Standardmáig wird der CD-Player in der Detailansicht angezeigt und listet
+Details zu jedem Titel auf der eingelegten Disc auf.
+
+:p.Um zur Kompaktansicht zu wechseln, whlen Sie im Hauptmen Ansicht | Kompakt.
+In diesem Modus ist der Ordnerinhalt ausgeblendet, die Schaltflchen
+:link reftype=hd refid=claunchpad.Launchpad:elink. sind jedoch sichtbar.
+
+:note text='Tipp:'.Whlen Sie den ersten abzuspielenden Titel aus, klicken Sie
+auf :hp2.Play:ehp2. und ndern Sie dann die Ansicht auf Kompakt.
+
+.* ----------------------------------------------------------------------------
+:h2 res=220 name=ckeyboard
+    x=left y=bottom width=100% height=100%.Tastaturbelegung
+
+Mit den folgenden Tasten knnen Sie den CD-Player steuern. Bei Verwendung dieser
+Tasten mssen die Schaltflchen im oberen Teil des Players im Fokus sein. Mit
+:hp2.&lt.Tab&gt.:ehp2. knnen Sie den Fokus vom Container auf die Schaltflchen
+verschieben.
+
+:ul compact.
+:li.:hp2.Z:ehp2.urck
+:li.:hp2.S:ehp2.top
+:li.:hp2.P:ehp2.ause
+:li.S:hp2.t:ehp2.art
+:li.:hp2.V:ehp2.or
+:li.:hp2.W:ehp2.iederholen
+:eul.
+
+.* ----------------------------------------------------------------------------
+:h2 res=230 name=cvolume
+    x=left y=bottom width=100% height=100%.Lautstrkenregler
+
+Unter den Playertasten befindet sich der Lautstrkeregler. Dieser regelt die
+Lautstrke fr die Wiedergabe innerhalb der Grenzen, die durch den
+Master-Lautstrkeregler fr das System festgelegt sind.
+
+.* ----------------------------------------------------------------------------
+:h2 res=240 name=ctrackpos
+    x=left y=bottom width=100% height=100%.Schieberegler fr die Track-Position
+
+Rechts neben den Player-Schaltflchen befindet sich der Schieberegler fr die
+Track-Position. Ziehen Sie den Schieberegler nach vorne oder hinten, um den
+Wiedergabepunkt des aktuellen Tracks neu zu positionieren.
+
+.* ----------------------------------------------------------------------------
+:h2 res=250 name=claunchpad
+    x=left y=bottom width=100% height=100%.Launchpad
+
+Unten links im Player-Ordner befindet sich ein quadratisches Kstchen. Ziehen
+Sie eine Mediendatei per Drag &amp. Drop auf das Launchpad, um sie der Palette
+hinzuzufgen. Der Dateiname wird im Tooltip der Schaltflche angezeigt. Ziehen
+Sie weitere Dateien per Drag &amp. Drop zwischen vorhandene Elemente im Launchpad
+oder rechts neben das letzte Element. Klicken Sie auf eines dieser Elemente, um
+die Wiedergabe zu starten.
+
+:p.Das Launchpad ist allen Medien-, CD-Player- und M3U-Wiedergabelistenordnern
+gemeinsam.
+
+:note.Wenn die Wiedergabe auf diese Weise gestartet wird, spiegelt
+:link reftype=hd refid=mtrackpos.Schieberegler fr die Track-Position:elink.
+nicht den aktuellen Wiedergabestatus wider und die Player-Schaltflchen steuern
+die Wiedergabe nicht. Verwenden Sie stattdessen das Kontextmen der
+Schaltflche, um die Wiedergabe zu steuern.
+
+:warning.Obwohl es mglich ist, MP3-, Ogg- und andere digitale Mediendateien zum
+Launchpad hinzuzufgen, fgen Sie hier keine CD-Titel hinzu. CD-Titel knnen vom
+Launchpad nicht abgespielt werden.
+
+.* ----------------------------------------------------------------------------
+:h1 res=300 name=peditor
+    x=left y=bottom width=100% height=100%.Playlist-Editor
+
+Verwenden Sie den Playlist-Editor, um M3U-Wiedergabelisten zu ndern. Eine
+M3U-Wiedergabeliste ist eine Textdatei, die Pfade (URLs) zu den Titeln enthlt,
+auf die sie verweist.
+
+:p.M3U (Moving Picture Experts Group Audio Layer 3 Uniform Resource Locator)
+ist ein :hp1.de facto:ehp1.-Standard, der im Allgemeinen von den meisten
+MP3-Playern erkannt wird.
+
+:p.Um Titel hinzuzufgen, ziehen Sie sie einfach per Drag &amp. Drop in den Editor.
+Um die Reihenfolge zu ndern, stellen Sie sicher, dass die Option
+:hp1.Sortierreihenfolge immer beibehalten:ehp1. im Untermen :hp2.Sortieren:ehp2.
+deaktiviert ist, ebenso wie alle anderen Sortieroptionen, die die manuelle
+Sortierung beeinflussen knnten, und ziehen Sie die Titel per Drag &amp. Drop wie
+gewnscht. Speichern Sie die Wiedergabeliste, indem Sie im Men :hp2.Datei |
+Speichern:ehp2. auswhlen.
+
+:p.Um eine neue Wiedergabeliste zu erstellen, ziehen Sie die
+M3U-Wiedergabelistenvorlage aus dem Ordner "Multimediavorlagen" an einen
+geeigneten Ort auf dem Desktop.
+
+:p.Weitere Informationen und Updates&colon.
+
+:p.https&colon.//trac.netlabs.org/cwmmclasses/wiki
+
+.* ----------------------------------------------------------------------------
+:h2 res=350 name=plaunchpad
+    x=left y=bottom width=100% height=100%.Launchpad
+
+Unten links im M3U-Wiedergabelisteneditor befindet sich ein quadratisches
+Kstchen. Ziehen Sie eine Mediendatei per Drag &amp. Drop auf das Launchpad, um sie
+der Palette hinzuzufgen. Der Dateiname wird im Tooltip der Schaltflche
+angezeigt. Ziehen Sie weitere Dateien per Drag &amp. Drop zwischen vorhandene
+Elemente im Launchpad oder rechts neben das letzte Element. Klicken Sie auf
+eines dieser Elemente, um die Wiedergabe zu starten.
+
+:p.Das Launchpad ist allen Medien-, CD-Player- und M3U-Wiedergabelistenordnern
+gemeinsam.
+
+:note.Verwenden Sie das Kontextmen der Schaltflche, um die Wiedergabe zu
+steuern.
+
+:warning.Obwohl es mglich ist, MP3-, Ogg- und andere digitale Mediendateien
+zum Launchpad hinzuzufgen, fgen Sie hier keine CD-Titel hinzu. CD-Titel knnen
+vom Launchpad nicht abgespielt werden.
+
+:euserdoc.
Index: /tags/CWMM-0.3.0_GA/mediafolder/Help/mediafldr049_ecs.ipf
===================================================================
--- /tags/CWMM-0.3.0_GA/mediafolder/Help/mediafldr049_ecs.ipf	(revision 213)
+++ /tags/CWMM-0.3.0_GA/mediafolder/Help/mediafldr049_ecs.ipf	(revision 213)
@@ -0,0 +1,78 @@
+:userdoc.
+
+:docprof.
+
+:title.Hilfe fr Media-Folder 
+
+:h1 res=100.Hilfe fr Media Spieler
+:p.
+Dieses Objekt ist ein Media-Ordner. Audio-Dateien, die enthalten
+sind, knnen abgespielt werden. Die blichen Bedienelemente wie
+Start, Stop und Skip sind am oberen Rand des Fensters verfgbar.
+:p.
+:nt.
+Fr das Abspielen von MP3-Dateien ist eine spezielle IO-Prozedur,
+geschrieben von Russell O'Connor, erforderlich.
+:p.
+Sie lát sich von folgender Adresse herunterladen:
+:p.
+:link reftype=launch
+object='netscape.exe'
+data='http://www.math.berkeley.edu/~roconnor/'.
+http&colon.//www.math.berkeley.edu/~roconnor/:elink.
+:ent.
+:p.
+:hp2.Tastaturbedienung:ehp2.
+:p.
+Mit den folgenden Tastaturkrzeln lát sich das Abspielen von Tracks steuern.
+Die Bedienelemente im oberen Teil des Ordners mssen aktiv sein, damit die
+Tastendrcke richtig zugeordnet werden. ber :hp2.TAB:ehp2. kann der Fokus vom Container
+auf die Bedienelemente gesetzt werden.
+:p.
+:ul.
+:li.:hp8.Z:ehp8.urck
+:li.:hp8.S:ehp8.top
+:li.:hp8.P:ehp8.ause
+:li.S:hp8.t:ehp8.art
+:li.:hp8.V:ehp8.or
+:li.:hp8.W:ehp8.iederholen
+:eul.
+
+:h1 res=200.Hilfe fr CD-Spieler
+:p.
+Dieses Objekt ist ein CD-Spieler mit FreeDB-Untersttzung. Das heiát, Titel und
+Interpret der eingelegten CD werden bei einer bestehenden Internetverbindung
+bei einem FreeDB-Server abgefragt.
+:p.
+:nt.
+Zur Nuztung der FreeDB-Abfrage muá eine Emailadresse angegeben werden. Zu diesem Zweck das Konfigurationsobject starten. 
+
+:ent.
+:p.
+:hp2.Tastaturbedienung:ehp2.
+:p.
+Mit den folgenden Tastaturkrzeln lát sich das Abspielen von Tracks steuern.
+Die Bedienelemente im oberen Teil des Fensters mssen aktiv sein, damit die
+Tastendrcke richtig zugeordnet werden. ber :hp2.TAB:ehp2. kann der Fokus vom Container
+auf die Bedienelemente gesetzt werden.
+:p.
+:ul.
+:li.:hp8.Z:ehp8.urck
+:li.:hp8.S:ehp8.top
+:li.:hp8.P:ehp8.ause
+:li.S:hp8.t:ehp8.art
+:li.:hp8.V:ehp8.or
+:li.:hp8.W:ehp8.iederholen
+:eul.
+
+:h1 res=300.Hilfe fr Playlist-Editor
+:p.
+Der Playlist-Editor kann verwendet werden, um M3U-Playlisten zu bearbeiten.
+Diese Spiellisten werden beispielsweise von portablen MP3-Spielern verwendet.
+Eine derartige Spielliste ist eine Textdatei, die die Pfade der zu spielenden
+Tracks enthlt.
+:p.
+
+:euserdoc.
+
+
Index: /tags/CWMM-0.3.0_GA/mediafolder/Help/mediafldr088.ipf
===================================================================
--- /tags/CWMM-0.3.0_GA/mediafolder/Help/mediafldr088.ipf	(revision 213)
+++ /tags/CWMM-0.3.0_GA/mediafolder/Help/mediafldr088.ipf	(revision 213)
@@ -0,0 +1,106 @@
+:userdoc.
+
+:docprof.
+
+:title.Media Folder µo§GªºžÑ»¡ÀÉ 
+
+:h1 res=100.ŽCÅéŒœ©ñŸ¹ªºžÑ»¡
+:p.
+³o­Óª«¥ó¬OŽCÅéžê®Æ§š¡A¥i¥H±N¥ôŠó€@­Ó­µ°TÀÉ®×©ñŠÜŠ¹žê®Æ§ššÓŒœ©ñ¡A€]¥i
+šÏ¥Î©ì©ñ€èŠ¡šÓ±ÆŠCŠ±¥Ø¡C€@¯ë±`¥ÎªºŒœ©ñ±±šî¹³¬OŒœ©ñ¡B°±€î©Î¬O­µ¶q³£¥išÏ¥Î¡C
+:p.
+§óŠhªºžê°T€Î§ó·s€Užü¥iŠÜ¡G
+:p.
+:link reftype=launch
+object='netscape.exe'
+data='http://www.os2world.com/cdwriting'.
+http&colon.//www.os2world.com/cdwriting:elink.
+.br
+:link reftype=launch
+object='netscape.exe'
+data='http://www.geocities.com/SiliconValley/Sector/5785/'.
+http&colon.//www.geocities.com/SiliconValley/Sector/5785/:elink.
+:p.
+:nt.
+:p.
+­nŒœ©ñ MP3 ÀÉ®×ªºžÜ¡A§A»Ý­n¥Ñ Russell O'Connor ©ÒŒgªº MMIOMP3 ³B²zŸ¹¡C
+:p.
+€UžüŠÛ
+:p.
+:link reftype=launch
+object='netscape.exe'
+data='http://www.math.berkeley.edu/~roconnor/'.
+http&colon.//www.math.berkeley.edu/~roconnor/:elink.
+:ent.
+:p.
+:hp2.ÁäœL±±šî:ehp2.
+:p.
+šÏ¥Î¥H€Uªº«öÁäšÓ±±šîŽCÅéžê®Æ§š¡CŠbžê®Æ§š€W­±³¡¥÷ªº«öÁä»Ý¥ý»EµJ€~¯àšÏ¥Î¡C¥i¥HšÏ
+¥Î :hp2.TAB:ehp2. ±NµJÂI±q®eŸ¹€ÁŽ«ŠÜ«öÁä¡C
+:p.
+:ul.
+:li.:hp8.B:ehp8.ack
+:li.:hp8.S:ehp8.top
+:li.:hp8.P:ehp8.ause
+:li.P:hp8.l:ehp8.ay
+:li.:hp8.N:ehp8.ext
+:li.:hp8.R:ehp8.epeat
+:eul.
+
+:h1 res=200.CD Œœ©ñŸ¹ªºžÑ»¡
+:p.
+³o­Óª«¥ó¬O€@­ÓšãŠ³ FreeDB €äŽ©ªº CD Œœ©ñŸ¹¡C­Y¥i¥H³s€WºôžôªºžÜ¡A«hŠ±¥ØŒÐÃD€Î
+šä¥Lªºžê°Tªº¥i¥H±q FreeDB ŠøªAŸ¹¬džß¡C
+:p.
+§óŠhªºžê°T€Î§ó·s€Užü¥iŠÜ¡G
+:p.
+:link reftype=launch
+object='netscape.exe'
+data='http://www.os2world.com/cdwriting'.
+http&colon.//www.os2world.com/cdwriting:elink.
+.br
+:link reftype=launch
+object='netscape.exe'
+data='http://www.geocities.com/SiliconValley/Sector/5785/'.
+http&colon.//www.geocities.com/SiliconValley/Sector/5785/:elink.
+:p.
+:nt.
+­nšÏ¥Î FreeDB ªA°ÈªºžÜ§A¥²¶·ŠwžËŸA·íªº®M¥ó¡A¥B­n«ü©w€@­Ó¹q€l¶l¥ó¡A³o¥i¥H§Q¥Î
+²ÕºAª«¥óšÓ°µ³o¥óšÆ¡C
+:ent.
+:p.
+:hp2.ÁäœL±±šî:ehp2.
+:p.
+šÏ¥Î¥H€Uªº«öÁäšÓ±±šîŽCÅéžê®Æ§š¡CŠbžê®Æ§š€W­±³¡¥÷ªº«öÁä»Ý¥ý»EµJ€~¯àšÏ¥Î¡C¥i¥HšÏ
+¥Î :hp2.TAB:ehp2. ±NµJÂI±q®eŸ¹€ÁŽ«ŠÜ«öÁä¡C
+:p.
+:ul.
+:li.:hp8.B:ehp8.ack
+:li.:hp8.S:ehp8.top
+:li.:hp8.P:ehp8.ause
+:li.P:hp8.l:ehp8.ay
+:li.:hp8.N:ehp8.ext
+:li.:hp8.R:ehp8.epeat
+:eul.
+
+:h1 res=300.Œœ©ñ²M³æœs¿èŸ¹ªºžÑ»¡
+:p.
+šÏ¥ÎŒœ©ñ²M³æœs¿èŸ¹šÓ«Ø¥ß©Î­×§ï M3U Œœ©ñ²M³æ¡C³ošÇŒœ©ñ²M³æ¥i¥H³Q¹³¬O¥i²ŸŽÓ
+ªº MP3 Œœ©ñŸ¹©ÒšÏ¥Î¡C³oŒËªºŒœ©ñ²M³æÀÉ®×¬O€åŠrÀÉ¡AžÌ­±¥]§t­nŒœ©ñŠ±¥ØªºÀÉ®×
+ŠWºÙ¡C
+:p.
+§óŠhªºžê°T€Î§ó·s€Užü¥iŠÜ¡G
+:p.
+:link reftype=launch
+object='netscape.exe'
+data='http://www.os2world.com/cdwriting'.
+http&colon.//www.os2world.com/cdwriting:elink.
+.br
+:link reftype=launch
+object='netscape.exe'
+data='http://www.geocities.com/SiliconValley/Sector/5785/'.
+http&colon.//www.geocities.com/SiliconValley/Sector/5785/:elink.
+
+
+:euserdoc.
+
Index: /tags/CWMM-0.3.0_GA/mediafolder/Help/mediafldr088_ecs.ipf
===================================================================
--- /tags/CWMM-0.3.0_GA/mediafolder/Help/mediafldr088_ecs.ipf	(revision 213)
+++ /tags/CWMM-0.3.0_GA/mediafolder/Help/mediafldr088_ecs.ipf	(revision 213)
@@ -0,0 +1,63 @@
+:userdoc.
+
+:docprof.
+
+:title.Media Folder µo§GªºžÑ»¡ÀÉ 
+
+:h1 res=100.Help for Media Player
+:p.
+³o­Óª«¥ó¬OŽCÅéžê®Æ§š¡A¥i¥H±N¥ôŠó€@­Ó­µ°TÀÉ®×©ñŠÜŠ¹žê®Æ§ššÓŒœ©ñ¡A€]¥išÏ¥Î©ì©ñ€èŠ¡šÓ±ÆŠCŠ±¥Ø¡C€@¯ë±`¥ÎªºŒœ©ñ±±šî¹³¬OŒœ©ñ¡B°±€î©Î¬O­µ¶q³£¥išÏ¥Î¡C
+:p.
+:nt.
+:p.
+­nŒœ©ñ MP3 ÀÉ®×ªºžÜ¡A§A»Ý­n¥Ñ Russell O'Connor ©ÒŒgªº MMIOMP3 ³B²zŸ¹¡C
+:p.
+€UžüŠÛ
+:p.
+:link reftype=launch
+object='netscape.exe'
+data='http://www.math.berkeley.edu/~roconnor/'.
+http&colon.//www.math.berkeley.edu/~roconnor/:elink.
+:ent.
+:p.
+:hp2.ÁäœL±±šî:ehp2.
+:p.
+šÏ¥Î¥H€Uªº«öÁäšÓ±±šîŽCÅéžê®Æ§š¡CŠbžê®Æ§š€W­±³¡¥÷ªº«öÁä»Ý¥ý»EµJ€~¯àšÏ¥Î¡C¥i¥HšÏ¥Î :hp2.TAB:ehp2. ±NµJÂI±q®eŸ¹€ÁŽ«ŠÜ«öÁä¡C
+:p.
+:ul.
+:li.:hp8.B:ehp8.ack
+:li.:hp8.S:ehp8.top
+:li.:hp8.P:ehp8.ause
+:li.P:hp8.l:ehp8.ay
+:li.:hp8.N:ehp8.ext
+:li.:hp8.R:ehp8.epeat
+:eul.
+
+:h1 res=200.CD Œœ©ñŸ¹ªºžÑ»¡
+:p.
+³o­Óª«¥ó¬O€@­ÓšãŠ³ FreeDB €äŽ©ªº CD Œœ©ñŸ¹¡C­Y¥i¥H³s€WºôžôªºžÜ¡A«hŠ±¥ØŒÐÃD€Îšä¥Lªºžê°Tªº¥i¥H±q FreeDB ŠøªAŸ¹¬džß¡C 
+:p.
+:nt.
+­nšÏ¥Î FreeDB ªA°ÈªºžÜ§A¥²¶·ŠwžËŸA·íªº®M¥ó¡A¥B­n«ü©w€@­Ó¹q€l¶l¥ó¡A³o¥i¥H§Q¥Î²ÕºAª«¥óšÓ°µ³o¥óšÆ¡C
+:ent.
+:p.
+:hp2.ÁäœL±±šî:ehp2.
+:p.
+šÏ¥Î¥H€Uªº«öÁäšÓ±±šîŽCÅéžê®Æ§š¡CŠbžê®Æ§š€W­±³¡¥÷ªº«öÁä»Ý¥ý»EµJ€~¯àšÏ¥Î¡C¥i¥HšÏ¥Î :hp2.TAB:ehp2. ±NµJÂI±q®eŸ¹€ÁŽ«ŠÜ«öÁä¡C
+:p.
+:ul.
+:li.:hp8.B:ehp8.ack
+:li.:hp8.S:ehp8.top
+:li.:hp8.P:ehp8.ause
+:li.P:hp8.l:ehp8.ay
+:li.:hp8.N:ehp8.ext
+:li.:hp8.R:ehp8.epeat
+:eul.
+
+:h1 res=300.Œœ©ñ²M³æœs¿èŸ¹ªºžÑ»¡
+:p.
+šÏ¥ÎŒœ©ñ²M³æœs¿èŸ¹šÓ«Ø¥ß©Î­×§ï M3U Œœ©ñ²M³æ¡C³ošÇŒœ©ñ²M³æ¥i¥H³Q¹³¬O¥i²ŸŽÓªº MP3 Œœ©ñŸ¹©ÒšÏ¥Î¡C³oŒËªºŒœ©ñ²M³æÀÉ®×¬O€åŠrÀÉ¡AžÌ­±¥]§t­nŒœ©ñŠ±¥ØªºÀÉ®×ŠWºÙ¡C
+:p.
+
+:euserdoc.
+
Index: /tags/CWMM-0.3.0_GA/mediafolder/Help/mediafldr_ecs.ipf
===================================================================
--- /tags/CWMM-0.3.0_GA/mediafolder/Help/mediafldr_ecs.ipf	(revision 213)
+++ /tags/CWMM-0.3.0_GA/mediafolder/Help/mediafldr_ecs.ipf	(revision 213)
@@ -0,0 +1,75 @@
+:userdoc.
+
+:docprof.
+
+:title.Help for Media Folder distribution 
+
+:h1 res=100.Help for Media Player
+:p.
+This object is a Media-Folder. Put any audio file into it
+for playing. Specify the order of the tracks using drag and drop.
+The usual play controls are available like play, stop or volume.
+:p.
+:nt.
+:p.
+For playing of MP3 files you need the MMIOMP3 procedure written
+by Russell O'Connor.
+:p.
+Get it from
+:p.
+:link reftype=launch
+object='netscape.exe'
+data='http://www.math.berkeley.edu/~roconnor/'.
+http&colon.//www.math.berkeley.edu/~roconnor/:elink.
+:ent.
+:p.
+:hp2.Keyboard control:ehp2.
+:p.
+Use the following keys to control the media folder. The buttons in the upper part
+of the folder must have the focus when using the keys. Use :hp2.TAB:ehp2. to switch
+the focus from the container to the buttons.
+:p.
+:ul.
+:li.:hp8.B:ehp8.ack
+:li.:hp8.S:ehp8.top
+:li.:hp8.P:ehp8.ause
+:li.P:hp8.l:ehp8.ay
+:li.:hp8.N:ehp8.ext
+:li.:hp8.R:ehp8.epeat
+:eul.
+
+:h1 res=200.Help for CD-Player
+:p.
+This object is a CD player with FreeDB support. Tracktitles and other information
+are queried from a FreeDB server if an internet connection is available. 
+:p.
+:nt.
+To use FreeDB servers you have to 
+specify an email address. Use the configuration object to do so.
+:ent.
+:p.
+:hp2.Keyboard control:ehp2.
+:p.
+Use the following keys to control the player. The buttons in the upper part
+of the window must have the focus when using the keys. Use :hp2.TAB:ehp2. to switch
+the focus from the container to the buttons.
+:p.
+:ul.
+:li.:hp8.B:ehp8.ack
+:li.:hp8.S:ehp8.top
+:li.:hp8.P:ehp8.ause
+:li.P:hp8.l:ehp8.ay
+:li.:hp8.N:ehp8.ext
+:li.:hp8.R:ehp8.epeat
+:eul.
+
+:h1 res=300.Help for playlist editor
+:p.
+Use the playlist editor to create or modify M3U playlists. These playlists
+are for example used by portable MP3 players. Such a playlist file is a text file
+containing the filenames of every track to be played.
+:p.
+
+
+:euserdoc.
+
Index: /tags/CWMM-0.3.0_GA/mediafolder/Install/MEDIAFLD.INS
===================================================================
--- /tags/CWMM-0.3.0_GA/mediafolder/Install/MEDIAFLD.INS	(revision 213)
+++ /tags/CWMM-0.3.0_GA/mediafolder/Install/MEDIAFLD.INS	(revision 213)
@@ -0,0 +1,61 @@
+[APPLICATION]
+NAME Media Player 0.2.8
+VERSION 0.2.8.0
+COPYRIGHT (C) Chris Wohlgemuth 2001-2004
+HOME http://www.os2world.com/cdwriting
+INTERNALNAME MEDIAFLD
+TOTALSIZE 261552
+INSTALLER 0.1.5.0
+DESCRIPTION The Media-Folder class can be used as an MP3 player. It has the usual play controls and playlist support. This player supports any audio file known to OS/2. A REXX interface is available if WPS-wizard is installed.
+
+[DESCRIPTION]
+DESCRIPTION  The Media-Folder class can be used as an MP3 player. It has the usual play controls and playlist support. This player supports any audio file known to OS/2. A REXX interface is available if WPS-wizard is installed.
+
+[FILES]
+MEDIAFLD.INS, %TARGET%\ ,  F,  3871
+bin\createcd.exe, %TARGET%\ ,  F,  1233
+bin\creatobj.cmd, %TARGET%\ ,  F,  1130
+bin\FLDTree.cmd, %TARGET%\ ,  F,  4136
+bin\insTrack.rx, %TARGET%\ ,  F,  1440
+bin\insTrk2.rx, %TARGET%\ ,  F,  1542
+bin\mediafld.dll, %TARGET%\ ,  F,  163070
+bin\mediafld.hlp, %TARGET%\ ,  F,  3548
+bin\mfldr_en.dll, %TARGET%\ ,  F,  18549
+bin\setFolder.cmd, %TARGET%\ ,  F,  696
+bin\setShadow.cmd, %TARGET%\ ,  F,  1046
+bin\trknames.cmd, %TARGET%\ ,  F,  2744
+DLL\progfldr.dll, %?%:\OS2\ ,  F,  33112
+Doc\mediafldr.inf, %TARGET%\ ,  F,  25435
+
+[CLASSES]
+CWProgFolder, %SYSDLL%\progfldr.dll, 
+CWAudioShadow, %TARGET%\bin\mediafld.dll, 
+CWMediaFolder, %TARGET%\bin\mediafld.dll, 
+CWCDFolder, %TARGET%\bin\mediafld.dll, 
+CWM3UFolder, %TARGET%\bin\mediafld.dll, 
+
+[OBJECTS]
+Playerõ,õ <CWMEDIA_FLDR>õ,õ CWMediaFolderõ,õ <MMPM2_FOLDER>õ,õ DEFAULTVIEW=DETAILS;DETAILSCLASS=CWAudioShadow;SORTCLASS=CWAudioShadow;DETAILSTODISPLAY=0,1,4,12,13,14,15,16,17,18,19,20,21;SORTBYATTR=6,24,25,26,27,28,29,30,31,32,33;MEDIAFLDRVOLUME=75;õ,õ update
+STARTUP.WAVõ,õ <SHW_STARTUP>õ,õ CWAudioShadowõ,õ <CWMEDIA_FLDR>õ,õ SHADOWID=%?%:\MMOS2\SOUNDS\STARTUP.WAVõ,õ update
+Media-Player^Programming tutorialõ,õ <MFLDR_PROGDOC>õ,õ WPProgramõ,õ <MMPM2_FOLDER>õ,õ EXENAME=view.exe;PARAMETERS=%TARGET%\Doc\mediafldr.infõ,õ update
+Create Media folder tree^(Drop folder here)õ,õ <MFLDR_FLDRTREE>õ,õ WPProgramõ,õ <MMPM2_FOLDER>õ,õ EXENAME=%TARGET%\bin\FLDTree.cmd;PARAMETERS="%*" "[Folder name (NO path)]"õ,õ update
+Create CD objectsõ,õ <MFLDR_CREATECDOBJ>õ,õ WPProgramõ,õ <MMPM2_FOLDER>õ,õ MINIMIZED=YES;EXENAME=%TARGET%\bin\creatobj.cmd;õ,õ update
+
+
+[UPDATEOBJECTS]
+<MMPM2_FOLDER>õ,õ OPEN=DEFAULT;
+
+[SKRIPTS]
+BEFOREINST õ,õ /* */call RxFuncAdd 'SysLoadFuncs', 'RexxUtil', 'SysLoadFuncs';call SysLoadFuncs;ret=SysQueryClassList('classes.');DO cls=1 to classes.0;theclass=WORD(classes.cls, 1);thePath=SUBWORD(classes.cls, 2);	IF TRANSLATE(theClass)='CWPROGFOLDER' THEN DO;		usrdata._mBTitle="Information";		usrData._mBCBTxt="";		usrdata._mBTxt='CWProgFolder class found. This class comes with ';		usrdata._mBTxt=usrdata._mBTxt||'Audio/Data-CD-Creator and is also used by the  ';		usrdata._mBTxt=usrdata._mBTxt||'Media-Folder. This package contains a bugfixed ';		usrdata._mBTxt=usrdata._mBTxt||'version of this DLL. If you use an Audio/Data-';		usrdata._mBTxt=usrdata._mBTxt||'CD-Creator release older than 0.51 answer YES ';		usrdata._mBTxt=usrdata._mBTxt||'when asked to replace the DLL <progfldr.dll>.  ';		usrData._mBType="OK";		call beep 1000, 100;		ret=ModalFor('usermsgBox');		LEAVE;	END;end;RC=0;
+AFTERCLASSES õ,õ /* Message for the user */;call RxFuncAdd 'SysLoadFuncs', 'RexxUtil', 'SysLoadFuncs';call SysLoadFuncs;;RC=0;;call RxMessageBox "Media folder installed. Remember to restart the WPS after installation is finished.", "Hinweis", "OK", "INFORMATION";
+
+[INSTALLPROFILES]
+MEDIAFLR õ,õ Media-Folder class for playing any audio file õ,õ The Media-Folder class can be used as an MP3 player. It has the usual play controls and playlist support. This player supports any audio file known to OS/2.
+
+[MEDIAFLR]
+MEDIAFLD, , ,S,[ ], MEDIAFLD.INS
+
+[DEFAULTTARGET]
+PATH %APPS%\CWMMOS2\MediaFld
+
+
Index: /tags/CWMM-0.3.0_GA/mediafolder/Install/MFLDRGER.INS
===================================================================
--- /tags/CWMM-0.3.0_GA/mediafolder/Install/MFLDRGER.INS	(revision 213)
+++ /tags/CWMM-0.3.0_GA/mediafolder/Install/MFLDRGER.INS	(revision 213)
@@ -0,0 +1,60 @@
+[APPLICATION]
+NAME Media Spieler 0.2.8
+VERSION 0.2.8.0
+COPYRIGHT (C) Chris Wohlgemuth 2001-2004
+HOME http://www.os2world.com/cdwriting
+INTERNALNAME MEDIAFLD
+TOTALSIZE 262417
+INSTALLER 0.1.5.0
+DESCRIPTION Die Media-Folder Klasse kann u.a. als MP3-Spieler verwendet werden. Die blichen Bedienelemente sind vorhanden und Playlisten werden untersttzt. Diese Klasse untersttzt alle von OS/2 untersttzten Audiodateien.
+
+[DESCRIPTION]
+DESCRIPTION  Die Media-Folder Klasse kann u.a. als MP3-Spieler verwendet werden. Die blichen Bedienelemente sind vorhanden und Playlisten werden untersttzt. Diese Klasse untersttzt alle von OS/2 untersttzten Audiodateien.
+
+[FILES]
+MFLDRGER.INS, %TARGET%\ ,  F,  4090
+bin\createcd.exe, %TARGET%\ ,  F,  1233
+bin\creatobj.cmd, %TARGET%\ ,  F,  1130
+bin\FLDTree.cmd, %TARGET%\ ,  F,  4136
+bin\insTrack.rx, %TARGET%\ ,  F,  1440
+bin\insTrk2.rx, %TARGET%\ ,  F,  1542
+bin\mediafld.dll, %TARGET%\ ,  F,  163070
+bin\mediafld.hlp, %TARGET%\ ,  F,  4139
+bin\mfldr_de.dll, %TARGET%\ ,  F,  18604
+bin\setFolder.cmd, %TARGET%\ ,  F,  696
+bin\setShadow.cmd, %TARGET%\ ,  F,  1046
+bin\trknames.cmd, %TARGET%\ ,  F,  2744
+DLL\progfldr.dll, %?%:\OS2\ ,  F,  33112
+Doc\mediafldr.inf, %TARGET%\ ,  F,  25435
+
+[CLASSES]
+CWProgFolder, %SYSDLL%\progfldr.dll, 
+CWAudioShadow, %TARGET%\bin\mediafld.dll, 
+CWMediaFolder, %TARGET%\bin\mediafld.dll, 
+CWCDFolder, %TARGET%\bin\mediafld.dll, 
+CWM3UFolder, %TARGET%\bin\mediafld.dll, 
+
+[OBJECTS]
+Spielerõ,õ <CWMEDIA_FLDR>õ,õ CWMediaFolderõ,õ <MMPM2_FOLDER>õ,õ DEFAULTVIEW=DETAILS;DETAILSCLASS=CWAudioShadow;SORTCLASS=CWAudioShadow;DETAILSTODISPLAY=0,1,4,12,13,14,15,16,17,18,19,20,21;SORTBYATTR=6,24,25,26,27,28,29,30,31,32,33;MEDIAFLDRVOLUME=75;õ,õ update
+STARTUP.WAVõ,õ <SHW_STARTUP>õ,õ CWAudioShadowõ,õ <CWMEDIA_FLDR>õ,õ SHADOWID=%?%:\MMOS2\SOUNDS\STARTUP.WAVõ,õ update
+Media-Spieler^Programmierungõ,õ <MFLDR_PROGDOC>õ,õ WPProgramõ,õ <MMPM2_FOLDER>õ,õ EXENAME=view.exe;PARAMETERS=%TARGET%\Doc\mediafldr.infõ,õ update
+Erstelle Media-Spieler-Baum^(Ordner hier fallen lassen)õ,õ <MFLDR_FLDRTREE>õ,õ WPProgramõ,õ <MMPM2_FOLDER>õ,õ EXENAME=%TARGET%\bin\FLDTree.cmd;PARAMETERS="%*" "[Ordnername (KEIN Pfad)]"õ,õ update
+Erstelle CD-Objekteõ,õ <MFLDR_CREATECDOBJ>õ,õ WPProgramõ,õ <MMPM2_FOLDER>õ,õ MINIMIZED=YES;EXENAME=%TARGET%\bin\creatobj.cmd;õ,õ update
+
+[UPDATEOBJECTS]
+<MMPM2_FOLDER>õ,õ OPEN=DEFAULT;
+
+[SKRIPTS]
+BEFOREINST õ,õ /* */call RxFuncAdd 'SysLoadFuncs', 'RexxUtil', 'SysLoadFuncs';call SysLoadFuncs;ret=SysQueryClassList('classes.');DO cls=1 to classes.0;theclass=WORD(classes.cls, 1);thePath=SUBWORD(classes.cls, 2);	IF TRANSLATE(theClass)='CWPROGFOLDER' THEN DO;		usrdata._mBTitle="Information";		usrData._mBCBTxt="";		usrdata._mBTxt='CWProgFolder Klasse gefunden. Diese Klasse ist Bestandteil ';		usrdata._mBTxt=usrdata._mBTxt||'von Audio/Data-CD-Creator und wird auch vom';		usrdata._mBTxt=usrdata._mBTxt||' Media-Folder benutzt. Dieses Archiv enthlt eine korrigierte ';		usrdata._mBTxt=usrdata._mBTxt||'Version dieser DLL. Wenn sie eine Version von Audio/Data-';		usrdata._mBTxt=usrdata._mBTxt||'CD-Creator verwenden, die lter als 0.51 ist, dann antworten Sie YES ';		usrdata._mBTxt=usrdata._mBTxt||'wenn gefragt wird, ob die DLL <progfldr.dll> ersetzt werden soll.';		usrData._mBType="OK";		call beep 1000, 100;		ret=ModalFor('usermsgBox');		LEAVE;	END;end;RC=0;
+AFTERCLASSES õ,õ /* Message for the user */;call RxFuncAdd 'SysLoadFuncs', 'RexxUtil', 'SysLoadFuncs';call SysLoadFuncs;;RC=0;;call RxMessageBox "Media-Spieler wurde installiert. Denken Sie daran, die WPS nach Abschluá der Installation neu zu starten.", "Hinweis", "OK", "INFORMATION";
+
+[INSTALLPROFILES]
+MEDIAFLR õ,õ Media-Folder Klasse zum Abspielen von Audiodateien õ,õ Die Media-Folder Klasse kann u.a. als MP3-Spieler verwendet werden. Die blichen Bedienelemente sind vorhanden und Playlisten werden untersttzt. Diese Klasse untersttzt alle von OS/2 untersttzten Audiodateien. Ein REXX-Interface kann genutzt werden, wenn WPS-Wizard V0.2.0 installiert ist.
+
+[MEDIAFLR]
+MEDIAFLD, , ,S,[ ], MFLDRGER.INS
+
+[DEFAULTTARGET]
+PATH %APPS%\CWMMOS2\MediaFld
+
+
Index: /tags/CWMM-0.3.0_GA/mediafolder/Install/freedb.ins
===================================================================
--- /tags/CWMM-0.3.0_GA/mediafolder/Install/freedb.ins	(revision 213)
+++ /tags/CWMM-0.3.0_GA/mediafolder/Install/freedb.ins	(revision 213)
@@ -0,0 +1,36 @@
+[APPLICATION]
+NAME FreeDB client 0.1.0
+VERSION 0.1.0.0
+COPYRIGHT (C) Chris Wohlgemuth 2001-2002
+HOME http://www.os2world.com/cdwriting
+INTERNALNAME FREEDBCL
+TOTALSIZE 17466
+INSTALLER 0.1.1.0
+DESCRIPTION CDDB client. This program is used by the CD player of the mediafolder package to get the titles of CDs from a FreeDB server. It may also be used from other programs or REXX scripts.
+
+[DESCRIPTION]
+DESCRIPTION  CDDB client. This program is used by the CD player of the mediafolder package to get the titles of CDs from a FreeDB server. It may also be used from other programs or REXX scripts.
+
+[FILES]
+cddb.ini, %TARGET%\ ,  F,  444
+pmcddb.exe, %TARGET%\ ,  F,  14844
+pmdb001.dll, %TARGET%\ ,  F,  2178
+cddbdata, %TARGET%\ ,  D,  0
+logfiles, %TARGET%\ ,  D,  0
+
+[OBJECTS]
+Configure CDDB Clientõ,õ <CWFREEDB_CLIENT_CONFIG>õ,õ WPProgramõ,õ <MMPM2_FOLDER>õ,õ ICONRESOURCE=1,%TARGET%\pmdb001.dll;EXENAME=%TARGET%\pmcddb.exe;PARAMETERS=/C [Your email (user@host.xxx)]õ,õ update
+
+[INSTALLPROFILES]
+FREEDBCL õ,õ CDDB client to get CD titles from FreeDB-compatible servers õ,õ CDDB client. This program is used by the CD player of the mediafolder package to get the titles of CDs from a FreeDB server. It may also be used from other programs or REXX scripts.
+
+[FREEDBCL]
+FREEDBCL, , ,S,[ ], freedb.ins
+
+[DEFAULTTARGET]
+PATH %APPS%\CWMMOS2\Freedb
+
+[INI]
+USER õ,õ CWMM õ,õ freedbclient õ,õ %TARGET% õ,õ YES
+
+
Index: /tags/CWMM-0.3.0_GA/mediafolder/Install/freedbgr.ins
===================================================================
--- /tags/CWMM-0.3.0_GA/mediafolder/Install/freedbgr.ins	(revision 213)
+++ /tags/CWMM-0.3.0_GA/mediafolder/Install/freedbgr.ins	(revision 213)
@@ -0,0 +1,36 @@
+[APPLICATION]
+NAME FreeDB Client 0.1.0
+VERSION 0.1.0.0
+COPYRIGHT (C) Chris Wohlgemuth 2001-2002
+HOME http://www.os2world.com/cdwriting
+INTERNALNAME FREEDBCL
+TOTALSIZE 17512
+INSTALLER 0.1.1.0
+DESCRIPTION FreeDB Client. Dieses Programm wird vom CD Spieler verwendet, der im Media-Ordner Paket enthalten ist, um die Titel der eingelegten CD von einem FreeDB-Server zu erfragen. Es kann ebenso von anderen Programmen oder REXX-Skripts genutzt werden.
+
+[DESCRIPTION]
+DESCRIPTION  FreeDB Client. Dieses Programm wird vom CD Spieler verwendet, der im Media-Ordner Paket enthalten ist, um die Titel der eingelegten CD von einem FreeDB-Server zu erfragen. Es kann ebenso von anderen Programmen oder REXX-Skripts genutzt werden.
+
+[FILES]
+cddb.ini, %TARGET%\ ,  F,  444
+pmcddb.exe, %TARGET%\ ,  F,  14844
+pmdb049.dll, %TARGET%\ ,  F,  2224
+cddbdata, %TARGET%\ ,  D,  0
+logfiles, %TARGET%\ ,  D,  0
+
+[OBJECTS]
+FreeDB Client Konfigurierenõ,õ <CWFREEDB_CLIENT_CONFIG>õ,õ WPProgramõ,õ <MMPM2_FOLDER>õ,õ ICONRESOURCE=1,%TARGET%\pmdb049.dll;EXENAME=%TARGET%\pmcddb.exe;PARAMETERS=/C [Email adresse (user@host.xxx)]õ,õ update
+
+[INSTALLPROFILES]
+FREEDBCL õ,õ FreeDB Client, um CD-Titel von FreeDB-Server zu erfragen õ,õ FreeDB Client. Dieses Programm wird vom CD Spieler verwendet, der im Media-Ordner Paket enthalten ist, um die Titel der eingelegten CD von einem FreeDB-Server zu erfragen. Es kann ebenso von anderen Programmen oder REXX-Skripts genutzt werden.
+
+[FREEDBCL]
+FREEDBCL, , ,S,[ ], freedbgr.ins
+
+[DEFAULTTARGET]
+PATH %APPS%\CWMMOS2\Freedb
+
+[INI]
+USER õ,õ CWMM õ,õ freedbclient õ,õ %TARGET% õ,õ YES
+
+
Index: /tags/CWMM-0.3.0_GA/mediafolder/MMconfigPage/cddbPage.def
===================================================================
--- /tags/CWMM-0.3.0_GA/mediafolder/MMconfigPage/cddbPage.def	(revision 213)
+++ /tags/CWMM-0.3.0_GA/mediafolder/MMconfigPage/cddbPage.def	(revision 213)
@@ -0,0 +1,6 @@
+LIBRARY cddbpage INITINSTANCE LONGNAMES
+DESCRIPTION 'CDDB Config page - (c) Copyright Chris Wohlgemuth 2002'
+DATA MULTIPLE NONSHARED
+EXPORTS
+     InsertCDDBConfigPage      @1
+
Index: /tags/CWMM-0.3.0_GA/mediafolder/MMconfigPage/cddbpage.c
===================================================================
--- /tags/CWMM-0.3.0_GA/mediafolder/MMconfigPage/cddbpage.c	(revision 213)
+++ /tags/CWMM-0.3.0_GA/mediafolder/MMconfigPage/cddbpage.c	(revision 213)
@@ -0,0 +1,179 @@
+#define INCL_PM
+#define INCL_OS2MM
+#define INCL_SW
+#define INCL_DOSMISC
+#define INCL_DOSMODULEMGR
+#include <os2.h>
+#include <os2me.h>
+#include <stdlib.h>
+#include <string.h>
+
+#if 0
+int main()
+{
+  exit();
+}
+#endif
+
+/*char chrMMDir[CCHMAXPATH];
+ */
+static void _getMMBase(char* chrMMDir, ULONG ulSize)
+{
+  PSZ pszMMBase="";
+
+  if(!DosScanEnv("MMBASE", &pszMMBase)) {
+    char * chrPtr;
+    strncpy(chrMMDir, pszMMBase, ulSize);
+    chrMMDir[ulSize-1]=0;
+    if((chrPtr=strchr(chrMMDir,';'))!=NULLHANDLE)
+      *chrPtr=0;
+  }
+} 
+
+static HMODULE _getDLLHMod(void)
+{
+  HMODULE hmod=0;
+  char chrPath[CCHMAXPATH];
+  _getMMBase( chrPath, sizeof(chrPath));
+  if(chrPath[strlen(chrPath)-1]=='\\')
+    chrPath[strlen(chrPath)-1]=0;
+  strcat(chrPath, "\\DLL\\cddbpage.dll");
+  /*WinMessageBox(HWND_DESKTOP, HWND_DESKTOP, chrPath, "", 1234, MB_MOVEABLE);
+  //DosBeep(500, 400);       */
+  if(!DosQueryModuleHandle(chrPath,&hmod)) {
+    return hmod;
+  }
+  else
+    return NULLHANDLE;
+}
+ 
+typedef struct {
+  HWND hwndHelpInstance;
+} MMPAGEINFO;
+typedef MMPAGEINFO * PMMPAGEINFO;
+
+
+
+/*******************************************************************/
+/*  Modeless secondary window procedure                            */
+/*******************************************************************/
+MRESULT EXPENTRY cddbPageDlgProc (HWND hwnd, ULONG msg,
+                                     MPARAM mp1, MPARAM mp2)
+{
+  PMMPAGEINFO pMMPageInfo = (PMMPAGEINFO)WinQueryWindowPtr (hwnd, QWL_USER);
+  
+  switch (msg) {
+  case WM_INITDLG:
+    /* Initialize The Page */
+    pMMPageInfo = (PMMPAGEINFO) malloc(sizeof(MMPAGEINFO));
+    WinSetWindowPtr (hwnd, QWL_USER, pMMPageInfo);
+    
+    /* Create a Help Instance */
+    /*    pMMPageInfo->hwndHelpInstance = WinCreateHelpInstance(...);*/
+    break;
+    
+  case WM_DESTROY:
+    /* Clean up page window resources */
+    /*    WinDestroyHelpInstance (pMMPageInfo->hwndHelpInstance); */
+    free (pMMPageInfo);
+    break;
+    
+  case WM_COMMAND:
+    /* Process All Commands */
+    return ((MRESULT) FALSE);
+    break;
+        
+  case WM_CLOSE:
+    return ((MRESULT) FALSE);
+    break;
+
+#if 0    
+  case WM_HELP:
+    if (pMMPageInfo->hwndHelpInstance) {
+      WinSendMsg(
+                 pMMPageInfo->hwndHelpInstance,
+                 HM_DISPLAY_HELP,
+                 (MPARAM) mp1,
+                 HM_RESOURCEID );
+    }
+    return ((MRESULT)TRUE);
+    break;
+    
+  case WM_TRANSLATEACCEL:
+    return (WinDefWindowProc (hwnd, msg, mp1, mp2));
+    break;
+    
+  case HM_QUERY_KEYS_HELP:
+    return((MRESULT) IDH_HELPFORKEYS);
+    break;
+#endif    
+  }
+  
+  return (WinDefSecondaryWindowProc(hwnd, msg, mp1, mp2));
+}
+
+HWND InsertCDDBConfigPage(PMCI_DEVICESETTINGS_PARMS pMCIDevSettings)     
+{
+
+  HWND  hwndPage=NULLHANDLE;               /* Page window handle    */
+  CHAR  szTabText[CCHMAXPATH];  /* Buffer for tab string */
+  ULONG ulPageId;               /* Page Identifier       */
+
+  if(pMCIDevSettings)
+    DosBeep(1000, 400);       
+  if(pMCIDevSettings->hwndCallback)
+    DosBeep(500, 400);       
+  /*******************************************************************/
+  /*   Load a modeless secondary window                              */
+  /*******************************************************************/
+
+  hwndPage    = WinLoadSecondaryWindow(
+                                       HWND_DESKTOP,
+                                       HWND_DESKTOP,
+                                       /*                                       pMCIDevSettings->hwndNotebook,
+                                       pMCIDevSettings->hwndNotebook,*/
+                                       &cddbPageDlgProc,
+                                       NULLHANDLE,
+                                       /*                            _getDLLHMod(),*/ /* hmod */
+                                       1234,
+                                       (PVOID)NULLHANDLE);
+  /*           (PVOID)pMCIDevSettings);*/
+
+  DosBeep(5000, 400);
+  if (!hwndPage) return (NULLHANDLE);
+       
+  ulPageId = (ULONG)WinSendMsg( pMCIDevSettings->hwndNotebook,
+                                BKM_INSERTPAGE,
+                                (ULONG)NULL,
+                                MPFROM2SHORT( BKA_AUTOPAGESIZE |
+                                              BKA_MINOR, BKA_LAST ) );
+  /*******************************************************************/
+  /*  Associate a secondary window with a notebook page.             */
+  /*******************************************************************/
+       
+  WinSendMsg(pMCIDevSettings->hwndNotebook, BKM_SETPAGEWINDOWHWND,
+             MPFROMP( ulPageId ), MPFROMLONG( hwndPage ) );
+       
+  /*******************************************************************/
+  /*  Get Tab Text from DLL                                          */
+  /*******************************************************************/
+
+#if 0       
+  WinLoadString(WinQueryAnchorBlock( HWND_DESKTOP ), ,
+                (USHORT)IDB_EXAMPLE, CCHMAXPATH, szTabText );
+#endif
+  
+  /*******************************************************************/
+  /*  Set Tab Text                                                   */
+  /*******************************************************************/
+       
+  WinSendMsg( pMCIDevSettings->hwndNotebook, BKM_SETTABTEXT,
+              MPFROMP( ulPageId ), szTabText );
+       
+  return( hwndPage );
+       
+}
+
+
+
+
Index: /tags/CWMM-0.3.0_GA/mediafolder/MMconfigPage/makefile
===================================================================
--- /tags/CWMM-0.3.0_GA/mediafolder/MMconfigPage/makefile	(revision 213)
+++ /tags/CWMM-0.3.0_GA/mediafolder/MMconfigPage/makefile	(revision 213)
@@ -0,0 +1,24 @@
+#
+# Compiled with VAC++ 3.08
+# (other compilers should do the job after minor tweaking)
+
+CC           = icc
+CPPFLAGS     = /Ge- /Gm+ /G4 /Gl  /O+ /Oc+ /Ol- /Q+ $(VACDEBUG)
+
+all:	cddbpage.dll
+
+cddbpage.dll:	cddbpage.obj  cddbpage.def
+#	ILINK /NOFREE cddbpage.obj,cddbpage.dll,,,cddbpage.def;
+
+cddbpage.obj:	cddbpage.c
+	icc $(CPPFLAGS) cddbpage.c mmPM2.lib cddbpage.def
+	
+clean:
+	-rm *.o
+	-rm *.obj
+
+cleaner:
+	-rm *.*~
+	-rm *.flc
+
+distribution:
Index: /tags/CWMM-0.3.0_GA/mediafolder/ProgFolder/def.tpl
===================================================================
--- /tags/CWMM-0.3.0_GA/mediafolder/ProgFolder/def.tpl	(revision 213)
+++ /tags/CWMM-0.3.0_GA/mediafolder/ProgFolder/def.tpl	(revision 213)
@@ -0,0 +1,30 @@
+# Note: lines starting with '#' are comments.
+
+[DESCRIPTION]
+Program Support class DLL
+
+[COPYRIGHT]
+(c) C. Wohlgemuth 2001-2005 Netlabs CWMM Team 2023
+
+[AUTHOR]
+Netlabs CWMM Team
+
+[NAME]
+# This is the NAME xxx WINDOWAPI|etc line in the def file.
+# Important: it specifies the internal name of the program. Don't leave out!
+LIBRARY PROGFLDR INITINSTANCE TERMINSTANCE
+
+[BUILDMACHINE]
+Zobopeep
+
+[OTHER]
+# Add all the lines here you want to have at the end of the generated DEF file
+DATA MULTIPLE NONSHARED
+EXPORTS
+        CWProgFolderClassData
+        CWProgFolderCClassData
+        CWProgFolderNewClass
+
+        M_CWProgFolderNewClass
+        M_CWProgFolderCClassData
+        M_CWProgFolderClassData
Index: /tags/CWMM-0.3.0_GA/mediafolder/ProgFolder/makefile
===================================================================
--- /tags/CWMM-0.3.0_GA/mediafolder/ProgFolder/makefile	(revision 213)
+++ /tags/CWMM-0.3.0_GA/mediafolder/ProgFolder/makefile	(revision 213)
@@ -0,0 +1,101 @@
+################################################
+#
+#                       Makefile for class CWProgFolder
+#
+#                          (C) Chris Wohlgenuth 1999-2001
+#
+#          E-mail:    christopher.wohlgemuth@bch.siemens.de
+#
+#          http://www.geocities.com/SiliconValley/Sector/5785/
+#
+#
+# This class is intended for programmers and provides functions for some
+# common tasks like:
+#                     - Adding dialogs as frame controls to WPS folders
+#                     - Showing 'About'-dialogs
+#                     - Checking of object pointers
+#                     - ...
+#
+# The DLL also includes some other functions like:
+#
+#                     - Query CD drives
+#                     - Query audio CD tracks
+#                     - Query audio CD track size
+#                     - ...
+#
+# Use IBM VAC++ V3.00 and Gnu-make 3.74.1 to compile
+#
+#
+#
+#
+################################################
+
+#/*
+# * This program is free software; you can redistribute it and/or modify
+# * it under the terms of the GNU General Public License as published by
+# * the Free Software Foundation; either version 2, or (at your option)
+# * any later version.
+# *
+# * This program is distributed in the hope that it will be useful,
+# * but WITHOUT ANY WARRANTY; without even the implied warranty of
+# * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# * GNU General Public License for more details.
+# *
+# * You should have received a copy of the GNU General Public License
+# * along with this program; see the file COPYING.  If not, write to
+# * the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
+# */
+
+include ../../make.inc
+
+
+CC           = icc
+LIB_DIR      = $d:/emx/lib
+CPPFLAGS     = /Ge- /Gm+ -G4 -Gl /O+ -Oc+ /C+ /Q+
+INC		= ../include
+INC2		= ..\include
+DEFS         =
+PROGS        =
+ODIR		= .
+CPPDIR	= .
+OBJECTS	= progfolder.obj pframeproc.obj storewindow.obj separatorwindow.obj
+DISTDIR	=	../../dist
+DLLDIR		=	../../dist/DLL
+
+all:	 progfldr.dll
+
+progfldr.dll:	$(OBJECTS)
+	cmd /C $(TOOLDIR)/create_def.cmd progfolder.def
+	icc -Ge- /Fe$@ /Fm$*.map $(OBJECTS) progfolder.def
+	rc -i $(INC2) progfolder.rc $@
+	mapsym $*.map
+	implib /NOLOGO progfldr.lib progfolder.def
+	mv $@ ..
+	mv $*.map ..
+	mv $*.sym ..
+		
+progfolder.obj:		progfolder.cpp $(INC)/progfolder.hh $(INC)/progfolder.h
+	icc $(CPPFLAGS) -I$(INC) $<
+
+pframeproc.obj:		pframeproc.cpp $(INC)/progfolder.hh $(INC)/progfolder.h
+	icc $(CPPFLAGS) -I$(INC) $<
+
+storewindow.obj:	storewindow.cpp $(INC)/progfolder.hh $(INC)/progfolder.h
+	icc $(CPPFLAGS) -I$(INC) $<
+
+separatorwindow.obj: separatorwindow.cpp $(INC)/progfolder.hh $(INC)/progfolder.h
+	icc $(CPPFLAGS) -I$(INC) $<
+
+clean:
+	-rm *.obj
+	-rm *.dll
+	-rm *.lib
+	-rm *.def
+
+cleaner:
+	-rm *.*~
+	-rm *.flc
+
+#distribution:
+#	-cp progfldr.dll $(DLLDIR)/progfldr.dll
+
Index: /tags/CWMM-0.3.0_GA/mediafolder/ProgFolder/pframeproc.cpp
===================================================================
--- /tags/CWMM-0.3.0_GA/mediafolder/ProgFolder/pframeproc.cpp	(revision 213)
+++ /tags/CWMM-0.3.0_GA/mediafolder/ProgFolder/pframeproc.cpp	(revision 213)
@@ -0,0 +1,227 @@
+/*
+ * pframeproc.cpp: window procedure for WPS folder which
+ *                 handles our private frame controls
+ *
+ *             (C) Chris Wohlgenuth 1999
+ */
+/*
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; see the file COPYING.  If not, write to
+ * the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+#include "progfolder.h"
+#include "progfolder.hh"
+#include <stdio.h>
+        
+/**************************************************************/
+/*                                                            */
+/* New frame window procedure which handles all the stuff     */
+/* related to our private frame controls.                     */
+/* It calls member functions of CWProgFolder to size and      */
+/* position our frame controls.                               */
+/*                                                            */
+/**************************************************************/
+MRESULT EXPENTRY folderFrameProcedure(HWND hwnd,ULONG msg, MPARAM mp1,MPARAM mp2)
+{
+  MRESULT mr;
+  PSWP  pswp, pswpClient=0, pswpFrame=0;
+  PFNWP orgFrameProc;
+  
+  switch(msg) 
+    {
+
+
+    case WM_CALCVALIDRECTS:
+      {
+        MRESULT mr;
+        PRECTL pRectl, pRectlNew;
+        PSWP pswp;
+        POINTL ptl;
+        HWND hwndClient;
+        FRAMECTRLDATA * fctrlData;
+        SWP swp;
+
+        pswp=(PSWP)mp2; 
+        if(pswp->fl&SWP_SIZE) {
+          pRectl=(PRECTL)mp1;        
+          pRectlNew=pRectl;
+          pRectlNew++;
+          
+          
+          if(WinSendMsg(hwnd,WM_QUERYBORDERSIZE,(MPARAM)&ptl,0)) {
+            pRectl->yBottom+=ptl.y;
+            pRectl->yTop-=ptl.y;
+            pRectl->xRight-=ptl.x;
+            pRectl->xLeft+=ptl.x;
+          }else {
+            /* Ok, then use some defaults. Better than nothing... */
+            pRectl->yBottom+=4;
+            pRectl->yTop-=4;
+            pRectl->xRight-=4;
+            pRectl->xLeft+=4;
+          }
+          *pRectlNew=*pRectl;
+          return (MRESULT)0;
+        }
+     
+      }   
+#if 0
+    case WM_CALCVALIDRECTS:
+      {
+        PRECTL pRectl, pRectlNew;
+        PSWP pswp;
+        POINTL ptl;
+        
+        pswp=(PSWP)mp2; 
+        if(pswp->fl&SWP_SIZE) {
+          pRectl=(PRECTL)mp1;        
+          pRectlNew=pRectl;
+          pRectlNew++;
+
+          if(pRectlNew->yBottom!=pRectl->yBottom) {
+            if(WinSendMsg(hwnd,WM_QUERYBORDERSIZE,(MPARAM)&ptl,0)) {
+              pRectlNew->xLeft+=ptl.x;
+              pRectl->xLeft+=ptl.x;
+              pRectlNew->xRight-=ptl.x;
+              pRectl->xRight-=ptl.x;
+              pRectl->yBottom+=ptl.y;
+            }else {
+              /* Ok, then use some defaults. Better than nothing... */
+              pRectlNew->xLeft+=4;
+              pRectl->xLeft+=4;
+              pRectlNew->xRight-=4;
+              pRectl->xRight-=4;
+              pRectl->yBottom+=4;
+            }
+            pRectlNew->yBottom=pRectl->yBottom;
+            return (MRESULT)0;
+          }
+#if 0
+          else if(pRectlNew->yTop!=pRectl->yTop) {
+              if(WinSendMsg(hwnd,WM_QUERYBORDERSIZE,(MPARAM)&ptl,0)) {
+                pRectl->yBottom+=ptl.y;
+                pRectl->yTop-=ptl.y;
+                pRectl->xRight-=ptl.x;
+                pRectl->xLeft+=ptl.x;
+              }else {
+                /* Ok, then use some defaults. Better than nothing... */
+                pRectl->yBottom+=4;
+                pRectl->yTop-=4;
+                pRectl->xRight-=4;
+                pRectl->xLeft+=4;
+              }
+              *pRectlNew=*pRectl;
+              return (MRESULT)0;
+          }
+        }
+#endif
+        else if(pRectlNew->xLeft!=pRectl->xLeft || pRectlNew->xRight!=pRectl->xRight) {
+          /* Make sure the border will be redrawn */
+          if(WinSendMsg(hwnd,WM_QUERYBORDERSIZE,(MPARAM)&ptl,0)) {
+            pRectl->yBottom+=ptl.y;
+            pRectl->yTop-=ptl.y;
+            pRectl->xRight-=ptl.x;
+            pRectl->xLeft+=ptl.x;
+          }else {
+            /* Ok, then use some defaults. Better than nothing... */
+            pRectl->yBottom+=4;
+            pRectl->yTop-=4;
+            pRectl->xRight-=4;
+            pRectl->xLeft+=4;
+          }
+          *pRectlNew=*pRectl;
+          return (MRESULT)0;
+        }
+        return (MRESULT)0;
+      }
+#endif
+
+    case WM_CALCFRAMERECT:
+    
+      /* Get the original frame procedure from the window words of the invisible child window */ 
+      orgFrameProc=(PFNWP)WinQueryWindowPtr(WinWindowFromID(hwnd, ID_FOLDERSTOREWINDOW),QWP_ORGFRAMEPROC);
+      if(!orgFrameProc)return WinDefWindowProc(hwnd,msg,mp1,mp2);/* Error occured! The original frame proc is lost */
+      
+      mr=(*orgFrameProc)(hwnd,msg,mp1,mp2);
+
+      //     mp2:
+      //
+      //     TRUE:  Frame rectangle provided, calculate client
+      //     FALSE: Client area rectangle provided, calculate frame
+      
+      /* Calculate new size.
+         This is done in a member function of our folder class.
+         We get the pointer to our folder object by querying the
+         window ptr. of the hidden child window. */ 
+      ((CWProgFolder*)WinQueryWindowPtr(WinWindowFromID(hwnd, ID_FOLDERSTOREWINDOW),0))
+        ->cwCalculateClient(hwnd, (PRECTL)mp1, SHORT1FROMMP( mp2));
+      
+      return mr;
+
+    case WM_FORMATFRAME:
+      SHORT countSwp;
+      SWP  *sav;
+    
+      orgFrameProc=(PFNWP)WinQueryWindowPtr(WinWindowFromID(hwnd, ID_FOLDERSTOREWINDOW),QWP_ORGFRAMEPROC);
+      if(!orgFrameProc)return WinDefWindowProc(hwnd,msg,mp1,mp2);/* Error occured */
+      /* Query the count of standard frame controls */
+      countSwp = (int) (*orgFrameProc)(hwnd, msg, mp1, mp2);
+
+      /*
+       * Reformat the frame to move the client
+       * over and make room for the framecontrols.
+       * Add the new controls to the array of
+       * frame controls.
+       * After doing so add our own framecontrols
+       * to the total number of framecontrols.
+       * This is done in the member function of the class.
+       */
+      return MRFROMSHORT(countSwp+((CWProgFolder*)WinQueryWindowPtr(WinWindowFromID(hwnd, ID_FOLDERSTOREWINDOW),
+                                                                    0))
+                         ->cwFormatFrame(hwnd, countSwp,(PSWP)mp1));//Our Frame(s) added
+    case WM_QUERYFRAMECTLCOUNT:
+      /* The system asks for the total count of framecontrols.
+         First we ask the old frame procedure for the number of standard
+         controls. After that we add our controls to the count. */
+      orgFrameProc=(PFNWP)WinQueryWindowPtr(WinWindowFromID(hwnd, ID_FOLDERSTOREWINDOW),QWP_ORGFRAMEPROC);
+      if(!orgFrameProc)return WinDefWindowProc(hwnd,msg,mp1,mp2);/* Error occured */
+      
+      return MRFROMSHORT((ULONG)((*orgFrameProc)(hwnd,msg,mp1,mp2))
+                         +((CWProgFolder*)WinQueryWindowPtr(WinWindowFromID(hwnd, ID_FOLDERSTOREWINDOW),0))
+                         ->cwNumAdditionalFrameControls(hwnd));//Our Frame(s) added
+
+    case WM_CLOSE:
+      orgFrameProc=(PFNWP)WinQueryWindowPtr(WinWindowFromID(hwnd, ID_FOLDERSTOREWINDOW),QWP_ORGFRAMEPROC);
+      if(!orgFrameProc)
+        return WinDefWindowProc(hwnd,msg,mp1,mp2);/* Error occured */
+      /* Call the cwClose() method */
+      if(((CWProgFolder*)WinQueryWindowPtr(WinWindowFromID(hwnd, ID_FOLDERSTOREWINDOW),0))
+         ->cwClose(hwnd))
+        return (MRESULT)(*orgFrameProc)(hwnd,msg,mp1,mp2);
+      return (MRESULT) 0;
+    default:
+      orgFrameProc=(PFNWP)WinQueryWindowPtr(WinWindowFromID(hwnd, ID_FOLDERSTOREWINDOW),QWP_ORGFRAMEPROC);
+      if(!orgFrameProc)return WinDefWindowProc(hwnd,msg,mp1,mp2);/* Error occured */
+      
+      return (*orgFrameProc)(hwnd,msg,mp1,mp2);
+    }
+  orgFrameProc=(PFNWP)WinQueryWindowPtr(WinWindowFromID(hwnd, ID_FOLDERSTOREWINDOW),QWP_ORGFRAMEPROC);
+  if(!orgFrameProc)return WinDefWindowProc(hwnd,msg,mp1,mp2);/* Error occured */
+  
+  return (*orgFrameProc)(hwnd,msg,mp1,mp2);
+  return WinDefWindowProc(hwnd,msg,mp1,mp2);/* Error occured */
+}
+
+
+
+
Index: /tags/CWMM-0.3.0_GA/mediafolder/ProgFolder/progfolder.cpp
===================================================================
--- /tags/CWMM-0.3.0_GA/mediafolder/ProgFolder/progfolder.cpp	(revision 213)
+++ /tags/CWMM-0.3.0_GA/mediafolder/ProgFolder/progfolder.cpp	(revision 213)
@@ -0,0 +1,1096 @@
+/*
+ *
+ * Main Source file for class CWProgFolder
+ *
+ *             (C) Chris Wohlgenuth 1999-2004
+ *
+ * This class is intended for programmers and provides functions for some
+ * common tasks like:
+ *                     - Adding dialogs as frame controls to WPS folders
+ *                     - Showing 'About'-dialogs
+ *                     - Checking of object pointers
+ *                     - ...
+ *
+ * Use IBM VAC++ V3.08 and Gnu-make 3.74.1 to compile
+ *
+ */
+
+/*
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; see the file COPYING.  If not, write to
+ * the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+#define INCL_DOSQUEUES
+#define  INCL_PM
+#include "progfolder.h"
+#include "progfolder.hh"
+#include "menufolder.hh"
+#include <stdlib.h>
+#include <stdio.h>
+
+
+#define DEFAULT_DIALOG_FONT   "9.WarpSans"
+
+typedef ULONG   SOMLINK somTP_CWMenuFolder_mfInsertMenuItems(CWMenuFolder *somSelf,
+		HWND hwndMenu,
+		ULONG iPosition,
+		ULONG ulLastMenuId);
+typedef somTP_CWMenuFolder_mfInsertMenuItems *somTD_CWMenuFolder_mfInsertMenuItems;
+
+typedef BOOL   SOMLINK somTP_CWMenuFolder_mfCheckMenuItems(CWMenuFolder *somSelf,
+		WPObject* wpObject,
+		ULONG ulMenuId);
+typedef somTP_CWMenuFolder_mfCheckMenuItems *somTD_CWMenuFolder_mfCheckMenuItems;
+
+MRESULT EXPENTRY folderFrameProcedure(HWND hwnd,ULONG msg, MPARAM mp1,MPARAM mp2);
+HWND createStoreWindow(HWND hwndCLF);
+HWND createLeechFrame(HWND hwndCLF);
+BOOL cwRegisterSeparatorWindowClass(void);
+
+HPOINTER hptrHand=NULLHANDLE;
+
+/****************************************************
+ *                                                  *
+ * This function returns the running OS version:    *
+ *                                                  *
+ * 30: Warp 3, 40 Warp 4 etc.                       *
+ *                                                  *
+ ****************************************************/
+static ULONG cwQueryOSRelease()
+{
+  static ULONG ulVersionMinor=0;
+
+  if(!ulVersionMinor)
+    if(DosQuerySysInfo(QSV_VERSION_MINOR, QSV_VERSION_MINOR, &ulVersionMinor, sizeof(ulVersionMinor)))
+      ulVersionMinor=30;/* Default Warp 3 */
+
+  return ulVersionMinor;
+
+}
+
+/**************************************************************/
+/*                                                            */
+/* This function returns the module handle of our class-dll   */
+/*                                                            */
+/**************************************************************/
+HMODULE queryModuleHandle(void)
+{
+  static HMODULE hmod=0;
+  
+  if(!hmod) {
+    PSZ pathname=SOMClassMgrObject  //Query Pathname of class file
+      ->somLocateClassFile(somIdFromString("CWProgFolder"),1,2);
+    DosQueryModuleHandle(pathname,&hmod);  //Query module handle
+  }
+  return hmod;
+}
+
+/****************************************************
+ *                                                  *
+ * This funktion inserts a separator into menu      *
+ * <hwndMenu> and submenu <hwndSubMenu> at          *
+ * position <iPosition>                             *
+ *                                                  *
+ ****************************************************/
+MRESULT cwInsertMenuSeparator(int iPosition, HWND hwndMenu, HWND hwndSubMenu)
+{
+  MENUITEM mi;
+
+  /* Fill the MENUITEM structure */
+  mi.iPosition=iPosition;
+  mi.afStyle=MIS_SEPARATOR;
+  if(hwndSubMenu)
+    mi.afStyle|=MIS_SUBMENU;
+  mi.id=0;
+  mi.afAttribute=NULL;                
+  mi.hwndSubMenu=hwndSubMenu;
+  mi.hItem=NULL;
+
+  return WinSendMsg(hwndMenu,MM_INSERTITEM,(MPARAM)&mi,
+                    (MPARAM)NULL);                 
+}
+
+/**************************************************************/
+/*                                                            */
+/* Overriden function: wpclsQueryStyle()                      */
+/*                                                            */
+/* This class doesn't need a template.                        */
+/*                                                            */
+/**************************************************************/
+ULONG M_CWProgFolder::wpclsQueryStyle()
+{
+  somId mySomId;
+  ULONG rc;
+
+  if((mySomId=somIdFromString("wpclsQueryStyle"))!=NULLHANDLE) {
+    rc=((somTD_M_WPObject_wpclsQueryStyle)
+          somParentNumResolve(__ClassObject->somGetPClsMtabs(),
+                              1,
+                              __ClassObject->
+                              somGetMethodToken(mySomId))
+          )(this)/*|CLSSTYLE_DONTTEMPLATE*/|CLSSTYLE_NEVERTEMPLATE;    
+    SOMFree(mySomId);
+  }
+  else
+    rc=M_WPFolder::wpclsQueryStyle()/*|CLSSTYLE_DONTTEMPLATE*/|CLSSTYLE_NEVERTEMPLATE;
+
+  return rc;
+
+#if 0
+  return ((somTD_M_WPObject_wpclsQueryStyle)
+          somParentNumResolve(__ClassObject->somGetPClsMtabs(),
+                              1,
+                              __ClassObject->
+                              somGetMethodToken(somIdFromString
+                                                ("wpclsQueryStyle")))
+          )(this)|CLSSTYLE_DONTTEMPLATE/*|CLSSTYLE_NEVERTEMPLATE*/;
+#endif
+
+}
+
+/**************************************************************/
+/*                                                            */
+/* Overriden function: wpclsQueryTitle()                      */
+/*                                                            */
+/* Returns our class name                                     */
+/*                                                            */
+/**************************************************************/
+PSZ M_CWProgFolder::wpclsQueryTitle()
+{
+  return "Support-Folder";
+}
+
+
+void M_CWProgFolder::wpclsInitData()
+{
+  somId mySomId;
+
+  /* call parent */
+  if((mySomId=somIdFromString("wpclsInitData"))!=NULLHANDLE) {
+    ((somTD_M_WPObject_wpclsInitData)
+     somParentNumResolve(__ClassObject->somGetPClsMtabs(),
+                         1,
+                         __ClassObject->
+                         somGetMethodToken(mySomId))
+     )(this);
+    SOMFree(mySomId);
+  }
+  else
+    M_WPFolder::wpclsInitData();
+
+  /* Register the separator window class */
+  cwRegisterSeparatorWindowClass();
+}
+
+/* This Funktion is called when the close button of the */
+/* frame is pressed or if the user chooses 'close' from */
+/* the menu. Apparently the wpClose() method isn't      */
+/* called when choosing close.                          */
+BOOL CWProgFolder::cwClose(HWND hwndFrame)
+{
+  return TRUE;
+}
+
+/**************************************************************/
+/*                                                            */
+/* Overriden function: wpOpen()                               */
+/*                                                            */
+/* This function subclasses the folder frame window and       */
+/* prepares it for the addition of frame controls.            */
+/*                                                            */
+/**************************************************************/
+HWND CWProgFolder::wpOpen(HWND hwndCnr,ULONG ulView,ULONG ulParam)
+{
+  HWND hwnd;
+  HWND hwndStore;
+  PFNWP orgFrameProc;
+  char * memPtr;
+  somId mySomId;
+
+  if((mySomId=somIdFromString("wpOpen"))!=NULLHANDLE) {
+    hwnd=((somTD_WPObject_wpOpen)
+          somParentNumResolve(__ClassObject->somGetPClsMtabs(),
+                              1,
+                              __ClassObject->
+                              somGetMethodToken(mySomId))                    
+          )(this,hwndCnr, ulView, ulParam);
+    SOMFree(mySomId);
+  }
+  else
+    hwnd=WPFolder::wpOpen(hwndCnr, ulView, ulParam);
+
+#if 0
+  //  hwnd=WPFolder::wpOpen(hwndCnr, ulView, ulParam);/* Call parent to build folder window */
+  hwnd=((somTD_WPObject_wpOpen)
+        somParentNumResolve(__ClassObject->somGetPClsMtabs(),
+                            1,
+                            __ClassObject->
+                            somGetMethodToken(somIdFromString
+                                              ("wpOpen")))                    
+        )(this,hwndCnr, ulView, ulParam);
+#endif
+
+  if(ulView==OPEN_SETTINGS)
+    /* We only build frame controls for folder frame windows */
+    return hwnd;
+  if(WinWindowFromID(hwnd,ID_FOLDERSTOREWINDOW))
+    return hwnd;/* Already subclassed */
+  
+  hwndStore=createStoreWindow(hwnd);/* This holds our object pointer */
+  if(hwndStore){
+    /* Save 'this' ptr. */
+    WinSetWindowPtr(hwndStore,0,this);
+    /* Subclass the folder frame window */
+    orgFrameProc=WinSubclassWindow(hwnd,&folderFrameProcedure);
+    /* Save the old window procedure in our store window */
+    WinSetWindowPtr(hwndStore,QWP_ORGFRAMEPROC,orgFrameProc);
+    /* Save a ptr. to private control data */
+    memPtr=(char*)malloc(sizeof(FRAMECTRLDATA));
+    if(memPtr)
+      memset(memPtr,0,sizeof(FRAMECTRLDATA));
+    WinSetWindowPtr(hwndStore,QWP_FCTRLDATA,memPtr);
+  }
+  
+  return hwnd;
+}
+
+/**************************************************************/
+/*                                                            */
+/* This member function returns the count of additional frame */
+/* controls we have added to the frame. This fuction is       */
+/* called from the frame window procedure                     */
+/*                                                            */
+/**************************************************************/
+ULONG CWProgFolder::cwNumAdditionalFrameControls(HWND hwndFolder)
+{
+  ULONG rc;
+  FRAMECTRLDATA * fctrlData;
+  
+  fctrlData=(FRAMECTRLDATA*)WinQueryWindowPtr(WinWindowFromID(hwndFolder, ID_FOLDERSTOREWINDOW),QWP_FCTRLDATA);
+  if(!fctrlData) return 0;
+  
+  rc=0;
+  
+  if(fctrlData->bLeft)rc++;
+  if(fctrlData->bRight)rc++;
+  if(fctrlData->bTop)rc++;
+  if(fctrlData->bBottom)rc++;
+
+  return rc;
+}
+
+/**************************************************************/
+/*                                                            */
+/* This function adjusts the size and position of the client. */
+/* It is called from the frame window procedure               */
+/*                                                            */
+/**************************************************************/
+BOOL CWProgFolder::cwCalculateClient(HWND hwndFolder, PRECTL pRectl, BOOL which)
+{
+  FRAMECTRLDATA * fctrlData;
+  
+  //  which:
+  //     TRUE:  Frame rectangle provided, calculate client
+  //     FALSE: Client area rectangle provided, calculate frame
+
+  /* Get our control data */
+  fctrlData=(FRAMECTRLDATA*)WinQueryWindowPtr(WinWindowFromID(hwndFolder, ID_FOLDERSTOREWINDOW),QWP_FCTRLDATA);
+  if(!fctrlData) return FALSE;
+
+
+  if (SHORT1FROMMP(which))
+    //     TRUE:  Frame rectangle provided, calculate client
+    //     FALSE: Client area rectangle provided, calculate frame
+    {
+      //  TRUE: calculate the rectl of the client;
+      //  call default window procedure to subtract child frame
+      //  controls from the rectangle's height
+      LONG lClientHeight;
+      LONG lNewControls;
+
+      lNewControls=0;
+      if(fctrlData->bTop)
+        lNewControls=fctrlData->sizelTopFrame.cy;
+      if(fctrlData->bBottom)
+        lNewControls+=fctrlData->sizelBottomFrame.cy;
+    
+      lClientHeight = pRectl->yTop - pRectl->yBottom;
+      if ( lNewControls  > lClientHeight  )
+        {
+          if(fctrlData->bBottom || fctrlData->bTop)
+            // extension is taller than client, so set client height to 0
+            pRectl->yTop = pRectl->yBottom;
+        }
+      else
+        {
+          //  set the origin of the client and shrink it based upon the
+          //  frame control's height
+          if(fctrlData->bBottom) {
+            pRectl->yBottom +=fctrlData->sizelBottomFrame.cy;
+            //pRectl->yTop -= fctrlData->sizelBottomFrame.cy;
+          }
+          if(fctrlData->bTop) {
+            pRectl->yTop -=fctrlData->sizelTopFrame.cy;
+            //pRectl->yBottom +=fctrlData->sizelTopFrame.cy;
+          }
+        }
+
+      lNewControls=0;
+      if(fctrlData->bLeft)
+        lNewControls=fctrlData->sizelLeftFrame.cx;
+      if(fctrlData->bRight)
+        lNewControls+=fctrlData->sizelRightFrame.cx;
+      
+      lClientHeight = pRectl->xRight - pRectl->xLeft;
+      if ( lNewControls  > lClientHeight  )
+        {
+          if(fctrlData->bRight || fctrlData->bLeft)
+            // extension is taller than client, so set client height to 0
+            pRectl->xRight = pRectl->xLeft;
+        }
+      else
+        {
+          if(fctrlData->bLeft) 
+            pRectl->xLeft+=fctrlData->sizelLeftFrame.cx;
+          if(fctrlData->bRight)
+            pRectl->xRight-=fctrlData->sizelRightFrame.cx;
+        }
+    }
+  else
+    {
+      //  FALSE: calculate the rectl of the frame;
+      //  call default window procedure to subtract child frame
+      //  controls from the rectangle's height;
+      //  set the origin of the frame and increase it based upon the
+      //  static text control's height
+
+      return TRUE;
+
+      if(fctrlData->bBottom) {
+        pRectl->yBottom +=fctrlData->sizelBottomFrame.cy;
+        // pRectl->yTop -= fctrlData->sizelBottomFrame.cy;
+      }
+      if(fctrlData->bTop)
+        pRectl->yTop -=fctrlData->sizelTopFrame.cy;
+
+      if(fctrlData->bLeft) {
+        pRectl->xLeft +=fctrlData->sizelLeftFrame.cx;
+        //    pRectl->yRight -= fctrlData->sizelLeftFrame.cx;
+      }
+      if(fctrlData->bRight)
+        pRectl->xRight -=fctrlData->sizelRightFrame.cx;
+
+    }
+  
+
+  return TRUE;/* Everything's ok */
+}
+
+
+
+/**************************************************************/
+/*                                                            */
+
+/*                                                            */
+/**************************************************************/
+ULONG CWProgFolder::cwFormatFrame(HWND hwndFolder, USHORT countSWP,PSWP pswp)
+{
+  /* countSWP:  number of standard framecontrols
+     pswp:      Array of SWP describing the framecontrols.
+                Since we added the number of our controls to the
+                standard controls in the framecontrol there is
+                space for the new controls.
+                */
+  ULONG rc;
+  PSWP pswpClient=0, pswpFrameCtl=0;
+  int iCount;
+  FRAMECTRLDATA * fctrlData;
+  int a;
+  CNRINFO     CnrInfo;
+  HWND hwndClient;
+
+  /* The data of our framecontrols is stored in a structure.
+     Get a pointer from the window words of the invisible child. */
+  fctrlData=(FRAMECTRLDATA*)WinQueryWindowPtr(WinWindowFromID(hwndFolder, ID_FOLDERSTOREWINDOW),QWP_FCTRLDATA);
+  if(!fctrlData) return 0;
+
+  iCount=0;
+  rc=0;
+    
+  for (a = 0; a < countSWP; a++)
+    {
+      /* Find the client window */
+      if ( WinQueryWindowUShort( pswp[a].hwnd, QWS_ID ) == 0x8008 ) // FID_CLIENT )
+        {
+          pswpClient=&pswp[a];
+          
+          /* Framecontrol at the top */                      
+          if(fctrlData->bTop){
+            pswpFrameCtl=&pswp[countSWP+iCount++];/* First free position */
+
+            /* Adjust client and insert the new control into the array of SWPs */ 
+             
+            /* Decrease the height of the client to have place for the new control */
+            pswp[a].cy -= fctrlData->sizelTopFrame.cy;
+
+            /* Insert the HWND of the new control into the structure */
+            pswpFrameCtl->hwnd=fctrlData->hwndCtlTop;
+            /* The x-position is the same as that of the client */
+            pswpFrameCtl->x  = pswpClient->x;
+            /* The control is placed above the client */
+            pswpFrameCtl->y  = pswpClient->y + pswpClient->cy;           
+            /* The control is as wide as the client */
+            pswpFrameCtl->cx = pswpClient->cx;
+            /* Insert the height of the control */ 
+            pswpFrameCtl->cy = fctrlData->sizelTopFrame.cy;
+            /* Place the control on top of all windows */
+            pswpFrameCtl->hwndInsertBehind = HWND_BOTTOM;
+            /* Insert necessary flags */
+            pswpFrameCtl->fl = SWP_MOVE | SWP_SIZE | SWP_NOADJUST | SWP_ZORDER | SWP_SHOW;
+
+            /* Adjust position if flags are set. It's possible to place
+               the control above the controls on the left and right or let these controls
+               cover the full height of the folder. */
+            if(fctrlData->bLeft){
+              /* There is a frame control on the left side */
+              if(!(fctrlData->ulFlagsLeft & FCTL_POSBELOW)) {
+                pswpFrameCtl->x  += fctrlData->sizelLeftFrame.cx;
+                pswpFrameCtl->cx -= fctrlData->sizelLeftFrame.cx; 
+              }
+            }
+            /* framecontrol on the right side */
+            if(!(fctrlData->ulFlagsRight & FCTL_POSBELOW) && fctrlData->bRight)
+              pswpFrameCtl->cx -= fctrlData->sizelRightFrame.cx;
+
+            if(!fctrlData->bCnrAdjusted) {
+              hwndClient=pswpClient->hwnd;
+              if(WinSendMsg(hwndClient,CM_QUERYCNRINFO,MPFROMP(&CnrInfo),MPFROMSHORT(sizeof(CnrInfo)))){
+                if(fctrlData->bBottom)
+                  CnrInfo.ptlOrigin.y-=fctrlData->sizelBottomFrame.cy;
+                if(fctrlData->bTop)
+                  CnrInfo.ptlOrigin.y-=fctrlData->sizelTopFrame.cy;
+                //CnrInfo.ptlOrigin.y+=0;
+                WinSendMsg(hwndClient,CM_SETCNRINFO,MPFROMP(&CnrInfo),MPFROMSHORT(CMA_PTLORIGIN));
+              }
+              fctrlData->bCnrAdjusted=TRUE;
+            }
+            /* One new control added */
+            rc++;
+          }/* end of if(fctrlData->bTop) */
+
+
+          /* Left frame control */
+          if(fctrlData->bLeft){
+            pswpFrameCtl=&pswp[countSWP+iCount++];/* First free position */
+            
+            pswpClient->cx -= fctrlData->sizelLeftFrame.cx;/* Size client */
+            pswpFrameCtl->hwnd=fctrlData->hwndCtlLeft;
+
+            pswpFrameCtl->x  =pswpClient->x;
+            pswpClient->x  += fctrlData->sizelLeftFrame.cx;/* Size client */
+            pswpFrameCtl->y  =pswpClient->y;
+
+            pswpFrameCtl->cx = fctrlData->sizelLeftFrame.cx;
+            pswpFrameCtl->cy =pswpClient->cy;
+                        
+            pswpFrameCtl->hwndInsertBehind = HWND_BOTTOM;
+            pswpFrameCtl->fl = SWP_MOVE | SWP_SIZE | SWP_NOADJUST | SWP_ZORDER | SWP_SHOW;
+                        
+            /* Position this frame control above bottom ctrl if requested */
+            if((fctrlData->ulFlagsLeft & FCTL_POSABOVE) && fctrlData->bBottom){
+              pswpFrameCtl->y  +=fctrlData->sizelBottomFrame.cy;
+              pswpFrameCtl->cy  -=fctrlData->sizelBottomFrame.cy;
+            }
+            /* Position this frame control below top ctrl if requested */
+            if(!(fctrlData->ulFlagsLeft & FCTL_POSBELOW) && fctrlData->bTop){
+              pswpFrameCtl->cy  +=fctrlData->sizelTopFrame.cy;
+            }
+            rc++;
+          }/* end of if(fctrlData->bLeft) */
+                    
+          /* Bottom frame control */
+          if(fctrlData->bBottom){
+            pswpFrameCtl=&pswp[countSWP+iCount++];/* First free position */
+                        
+            pswpClient->cy -= fctrlData->sizelBottomFrame.cy;    
+            pswpFrameCtl->hwnd=fctrlData->hwndCtlBottom;
+                        
+            pswpFrameCtl->x  = pswpClient->x;
+            pswpFrameCtl->y  = pswpClient->y;
+            pswpClient->y += fctrlData->sizelBottomFrame.cy;
+                        
+            pswpFrameCtl->cx = pswpClient->cx;
+            pswpFrameCtl->cy = fctrlData->sizelBottomFrame.cy;
+                        
+            pswpFrameCtl->hwndInsertBehind = HWND_BOTTOM;
+            pswpFrameCtl->fl = SWP_MOVE | SWP_SIZE | SWP_NOADJUST | SWP_ZORDER | SWP_SHOW;
+                                                
+            /* Adjust position if flags are set */
+            if(fctrlData->bLeft){
+              if((fctrlData->ulFlagsLeft & FCTL_POSABOVE)) {
+                pswpFrameCtl->cx +=fctrlData->sizelLeftFrame.cx;
+                pswpFrameCtl->x  -= fctrlData->sizelLeftFrame.cx;
+              }
+            }
+            if(!(fctrlData->ulFlagsRight & FCTL_POSABOVE)&& fctrlData->bRight) {
+              pswpFrameCtl->cx -= fctrlData->sizelRightFrame.cx; 
+            }
+            /* Adjust container view so items do not scroll out of view */
+            /*   hwndClient=pswpClient->hwnd;
+                 if(WinSendMsg(hwndClient,CM_QUERYCNRINFO,MPFROMP(&CnrInfo),MPFROMSHORT(sizeof(CnrInfo)))){
+                 CnrInfo.ptlOrigin.y-=pswpFrameCtl->cy;
+                 WinSendMsg(hwndClient,CM_SETCNRINFO,MPFROMP(&CnrInfo),MPFROMSHORT(CMA_PTLORIGIN));
+                 };*/
+
+            if(!fctrlData->bCnrAdjusted) {
+              hwndClient=pswpClient->hwnd;
+              if(WinSendMsg(hwndClient,CM_QUERYCNRINFO,MPFROMP(&CnrInfo),MPFROMSHORT(sizeof(CnrInfo)))){
+                if(fctrlData->bBottom)
+                  CnrInfo.ptlOrigin.y-=fctrlData->sizelBottomFrame.cy;
+                if(fctrlData->bTop)
+                  CnrInfo.ptlOrigin.y-=fctrlData->sizelTopFrame.cy;
+                //CnrInfo.ptlOrigin.y+=0;
+                WinSendMsg(hwndClient,CM_SETCNRINFO,MPFROMP(&CnrInfo),MPFROMSHORT(CMA_PTLORIGIN));
+              }
+              fctrlData->bCnrAdjusted=TRUE;
+            }
+          
+            rc++; 
+          }/* end of if(fctrlData->bBottom) */
+                    
+          /* Right frame control */
+          if(fctrlData->bRight){
+            pswpFrameCtl=&pswp[countSWP+iCount++];/* First free position */
+            
+            pswpClient->cx -= fctrlData->sizelRightFrame.cx;/* Size client */
+            pswpFrameCtl->hwnd=fctrlData->hwndCtlRight;
+
+            pswpFrameCtl->x  =pswpClient->x+pswpClient->cx;
+            pswpFrameCtl->y  =pswpClient->y;
+
+            pswpFrameCtl->cx = fctrlData->sizelRightFrame.cx;
+            pswpFrameCtl->cy =pswpClient->cy;
+                        
+            pswpFrameCtl->hwndInsertBehind = HWND_BOTTOM;
+            pswpFrameCtl->fl = SWP_MOVE | SWP_SIZE | SWP_NOADJUST | SWP_ZORDER | SWP_SHOW;
+
+            /* Position this frame control above bottom ctrl only if requested */
+            if(!(fctrlData->ulFlagsRight & FCTL_POSABOVE) && fctrlData->bBottom){
+              pswpFrameCtl->y  -=fctrlData->sizelBottomFrame.cy;
+              pswpFrameCtl->cy  +=fctrlData->sizelBottomFrame.cy;
+            }
+            /* Position this frame control below top ctrl only if requested */
+            if(!(fctrlData->ulFlagsRight & FCTL_POSBELOW) && fctrlData->bTop){
+              pswpFrameCtl->cy  +=fctrlData->sizelTopFrame.cy;
+            }
+            rc++;
+          }/* end of if(fctrlData->bRight) */
+          
+
+        }
+    }
+  return rc;/* Return additional controls */
+}
+
+
+/**************************************************************/
+/*                                                            */
+/* This function adds a frame control at the specified        */
+/* position.                                                  */
+/*                                                            */
+/**************************************************************/
+BOOL CWProgFolder::cwAddFrameCtl(HWND hwndFolder, HWND hwndNewCtl,SIZEL sizel, ULONG ulPos, ULONG ulFlags)
+{
+  FRAMECTRLDATA * fctrlData;
+  
+  /* Get the framecontrol datastructure from the invisible control window */
+  fctrlData=(FRAMECTRLDATA*)WinQueryWindowPtr(WinWindowFromID(hwndFolder, ID_FOLDERSTOREWINDOW),QWP_FCTRLDATA);
+  if(!fctrlData) return FALSE;
+  
+  /* Fill in the values into the structure */
+  /* This is the dialog at the left */
+  if(ulPos & FCTL_LEFT) {
+    /* The HWND of the dialog used as a framcontrol */
+    fctrlData->hwndCtlLeft=hwndNewCtl;
+    /* The size of the dialog. Actually only sizel.cx is used
+       since this is a dialog at the left which always has
+       got the height of the client. */ 
+    fctrlData->sizelLeftFrame=sizel;
+    /* A flag which determines the positioning of the dialog. 
+       If there is a dialog at the top you may tell the folder
+       to move it sizel.cx pixel to the right to allow the
+       control at the left to cover the full height of the folder.
+       The same is with the control at the bottom. This gives
+       you the ability to finetune the appearance of the
+       folder. Just try the flags FCTL_POSBELOW, FCTL_POSABOVE as
+       defined in progfolder.h in conjunction with framecontrols
+       at different positions of the folder.
+       */
+    fctrlData->ulFlagsLeft=ulFlags;
+    /* Tell the frame procedure that there's a framecontrol
+       at the left. */
+    fctrlData->bLeft=TRUE;
+    if(!fctrlData->hwndCtlLeft)
+      /* If this method is called with hwndNewCtl=NULL the framecontrol
+         is disabled. */
+      fctrlData->bLeft=FALSE;
+  }
+  /* This is the dialog at the right */
+  if(ulPos & FCTL_RIGHT){
+    fctrlData->hwndCtlRight=hwndNewCtl;
+    fctrlData->sizelRightFrame=sizel;
+    fctrlData->ulFlagsRight=ulFlags;
+    fctrlData->bRight=TRUE;
+    if(!fctrlData->hwndCtlRight) 
+      fctrlData->bRight=FALSE;
+  }
+  if(ulPos & FCTL_TOP){
+    fctrlData->hwndCtlTop=hwndNewCtl;
+    fctrlData->sizelTopFrame=sizel;
+    fctrlData->bTop=TRUE;
+    if(!fctrlData->hwndCtlTop) 
+      fctrlData->bTop=FALSE;
+  }
+  if(ulPos & FCTL_BOTTOM){
+    fctrlData->hwndCtlBottom=hwndNewCtl;
+    fctrlData->sizelBottomFrame=sizel;
+    fctrlData->bBottom=TRUE;
+    if(!fctrlData->hwndCtlBottom) 
+      fctrlData->bBottom=FALSE;
+  }
+  return TRUE;
+}
+
+
+/**************************************************************/
+/*                                                            */
+/* This function returns information about the specified      */
+/* private frame control.                                     */
+/*                                                            */
+/**************************************************************/
+HWND CWProgFolder::cwQueryFrameCtl(HWND hwndFolder, SIZEL* sizel, ULONG ulPos, ULONG * ulFlags)
+{
+  FRAMECTRLDATA * fctrlData;
+  
+  fctrlData=(FRAMECTRLDATA*)WinQueryWindowPtr(WinWindowFromID(hwndFolder, ID_FOLDERSTOREWINDOW),QWP_FCTRLDATA);
+  if(!fctrlData) return FALSE;
+  
+  
+  if(ulPos & FCTL_LEFT){
+    *sizel=fctrlData->sizelLeftFrame;
+    *ulFlags= fctrlData->ulFlagsLeft;
+    return fctrlData->hwndCtlLeft;
+  }
+  if(ulPos & FCTL_RIGHT){
+    *sizel=fctrlData->sizelRightFrame;
+    *ulFlags=fctrlData->ulFlagsRight;
+    return fctrlData->hwndCtlRight;
+  }
+  if(ulPos & FCTL_TOP){
+    *sizel=fctrlData->sizelTopFrame;
+    *ulFlags=0;
+    return  fctrlData->hwndCtlTop;
+  }
+  if(ulPos & FCTL_BOTTOM){
+    *sizel=fctrlData->sizelBottomFrame;
+    *ulFlags=0;
+    return fctrlData->hwndCtlBottom;
+  }
+  return NULL;
+}
+
+/**************************************************************/
+/*                                                            */
+/* This function requests an update of frame controls so      */
+/* added frame controls will become visible.                  */
+/* You must call this function after calling cwAddFrameCtl(). */
+/*                                                            */
+/**************************************************************/
+void CWProgFolder::cwUpdateFrame(HWND hwndFolder)
+{
+
+  WinSendMsg(hwndFolder,WM_UPDATEFRAME,0,0);
+
+}
+
+/**************************************************************/
+/*                                                            */
+/* This function returns the pointer to a file system object  */
+/* or NULL.                                                   */
+/* It follows shadow objects and returns the object handle    */
+/* of the linked object if it's a file system object          */
+/*                                                            */
+/**************************************************************/
+WPObject* CWProgFolder::cwGetFileSystemObject(WPObject* wpObject)
+{
+  if(!somIsObj(wpObject)) return NULL;//No object given
+  
+  /* Check if it's a shadow */
+  if(somResolveByName(wpObject,"wpQueryShadowedObject")){ 
+    /* Yes, it's a shadow. Query the linked object. */
+    wpObject=((WPShadow*)wpObject)->wpQueryShadowedObject(FALSE);
+  }
+  
+  if(!somIsObj(wpObject)) return NULL;//The link is broken
+  
+  /* Check if it's a file system object */
+  if(somResolveByName(wpObject, "wpQueryRealName")){
+    return wpObject;/* Yes */
+  }
+  else
+    return NULL;
+}
+
+void paintURL(HPS hps, HWND hwnd, LONG lColor)
+{
+  POINTL aptl[TXTBOX_COUNT];
+  POINTL ptl[2];
+  int iLen;
+  RECTL rectl;
+  char chrURL[500];
+  int a;
+  LONG lSaveY;
+  //  SIZEF fxSize;
+
+  WinQueryWindowText(hwnd, sizeof(chrURL),chrURL);  
+  iLen=strlen(chrURL);
+  GpiQueryTextBox(hps, iLen, chrURL, TXTBOX_COUNT, aptl);
+  WinQueryWindowRect(hwnd, &rectl);
+  // WinDrawText(hps, -1L, chrURL,  &rectl, CLR_BLUE, CLR_BACKGROUND, DT_LEFT|DT_UNDERSCORE);
+
+  if(aptl[TXTBOX_TOPRIGHT].x-aptl[TXTBOX_TOPLEFT].x <= rectl.xRight-rectl.xLeft)
+    WinDrawText(hps, -1L, chrURL,  &rectl, lColor, CLR_BACKGROUND, DT_CENTER|DT_UNDERSCORE);
+  else
+    {
+      /* Always draw the first 15 chars to speed up */
+      a=15;
+      ptl[0].x=0;
+      lSaveY=rectl.yTop-aptl[TXTBOX_TOPLEFT].y;
+      ptl[0].y=lSaveY;
+
+      GpiSetColor(hps, lColor);
+      GpiCharStringPosAt(hps, ptl,NULLHANDLE, CHS_UNDERSCORE, a, chrURL, 0);
+      //      GpiQueryCharBox(hps, &fxSize);
+
+
+      //      GpiQueryCharStringPos(hps, 0, 1, &chrURL[a], 0,ptl);
+      while(a < iLen) {/* While chars in string */ 
+        /* Get draw position of next char */
+        GpiQueryCharStringPos(hps, 0, 1,  &chrURL[a], 0, ptl);
+        if(ptl[1].x  > rectl.xRight) {/* ptl[1] is position of next char */ 
+          /* Center the next line ?? */
+          GpiQueryTextBox(hps, strlen(&chrURL[a]), &chrURL[a], TXTBOX_COUNT, aptl);
+          if(aptl[TXTBOX_TOPRIGHT].x-aptl[TXTBOX_TOPLEFT].x <= rectl.xRight-rectl.xLeft)
+            /* Yes */
+            ptl[0].x=(rectl.xRight-rectl.xLeft-(aptl[TXTBOX_TOPRIGHT].x-aptl[TXTBOX_TOPLEFT].x))/2;
+          else
+            ptl[0].x=0; /* No */
+          lSaveY-=aptl[TXTBOX_TOPLEFT].y+2;
+          ptl[0].y=lSaveY;
+          GpiMove(hps, ptl);
+        }
+        /* Draw char */
+        GpiCharStringPos(hps,NULLHANDLE,CHS_UNDERSCORE,1,&chrURL[a],0);
+        a++;
+        //        GpiQueryCharStringPos(hps, 0, 1,  &chrURL[a], 0, ptl);
+        //        a++;
+      };
+    } 
+}
+
+MRESULT EXPENTRY urlProc( HWND hwnd, ULONG msg, MPARAM mp1, MPARAM mp2 )
+{
+  PFNWP pfnwp;
+  char chrURL[500];
+  STARTDATA startData;
+  char chrLoadError[CCHMAXPATH];
+  ULONG ulSessionID;
+  PID pid;
+  ULONG attrValue[32];
+  APIRET rc;
+  HPS hps;
+  RECTL rectl;
+
+  switch( msg )
+    {
+    case WM_BUTTON1DOWN:
+      hps=WinGetPS(hwnd);
+      paintURL(hps, hwnd, CLR_RED);
+      WinReleasePS(hps);
+      return (MRESULT) FALSE;
+    case WM_BUTTON1UP:
+      hps=WinGetPS(hwnd);
+      paintURL(hps, hwnd, CLR_BLUE);
+      WinReleasePS(hps);
+      return (MRESULT) FALSE;
+    case WM_BUTTON1CLICK:
+      WinQueryWindowText(hwnd,sizeof(chrURL),chrURL);
+      memset(&startData,0,sizeof(startData));
+      startData.Length=sizeof(startData);
+      startData.Related=SSF_RELATED_INDEPENDENT;
+      startData.FgBg=SSF_FGBG_FORE;
+      startData.TraceOpt=SSF_TRACEOPT_NONE;
+      startData.PgmTitle="";
+      startData.PgmName="netscape.exe";
+      startData.InheritOpt=SSF_INHERTOPT_SHELL;
+      startData.SessionType=SSF_TYPE_DEFAULT;
+      startData.PgmControl=SSF_CONTROL_VISIBLE;
+      startData.InitXPos=30;
+      startData.InitYPos=30;
+      startData.InitXSize=500;
+      startData.InitYSize=400;
+      startData.ObjectBuffer=chrLoadError;
+      startData.ObjectBuffLen=(ULONG)sizeof(chrLoadError);
+      startData.PgmInputs=chrURL;
+      rc=DosStartSession(&startData,&ulSessionID,&pid);					     
+      return (MRESULT) FALSE;
+    case WM_PAINT:
+      hps=WinBeginPaint(hwnd, NULLHANDLE, NULLHANDLE);
+      paintURL(hps, hwnd, CLR_BLUE);
+      WinEndPaint(hps);
+      return (MRESULT) FALSE;
+    case WM_MOUSEMOVE:
+      if(hptrHand) {
+        WinSetPointer(HWND_DESKTOP,hptrHand);
+      }
+      return (MRESULT)FALSE;
+    default:
+      break;
+    }
+  pfnwp=(PFNWP)WinQueryWindowULong(hwnd,QWL_USER);
+  if(pfnwp)
+    return pfnwp( hwnd, msg, mp1, mp2 );
+
+  return WinDefWindowProc( hwnd, msg, mp1, mp2 );
+}
+
+
+/**************************************************************/
+/*                                                            */
+
+/*                                                            */
+/**************************************************************/
+MRESULT EXPENTRY aboutDlgProc( HWND hwnd, ULONG msg, MPARAM mp1, MPARAM mp2 )
+{
+  HENUM hEnum;
+  HWND hwndNext;
+  char chrText[400];
+  ULONG ulStyle;
+  char text[50];
+  PFNWP pfnwp;
+  HMODULE hModule;
+  SWP swp;
+
+  switch( msg )
+    {
+    case WM_INITDLG:
+      /* Find text controls with an URL */
+      hEnum=WinBeginEnumWindows(hwnd);
+      do {
+        hwndNext=WinGetNextWindow(hEnum);
+        if(hwndNext) {
+          WinQueryClassName(hwndNext,sizeof(chrText), chrText);
+          if(!strcmpi(chrText,"#5")) {
+            ulStyle=WinQueryWindowULong(hwndNext,QWL_STYLE);
+            
+            if((ulStyle & 0xf) == SS_TEXT) {
+              /* Static text control */
+              WinQueryWindowText(hwndNext,sizeof(chrText), chrText);          
+              if(!strnicmp(chrText,"http:",5)){
+                if(!hptrHand) {
+                  if(!DosQueryModuleHandle("PROGFLDR.DLL",&hModule))
+                    hptrHand=WinLoadPointer(HWND_DESKTOP,hModule,IDPT_HAND);
+                }
+                pfnwp=WinSubclassWindow(hwndNext, urlProc);
+                WinSetWindowULong(hwndNext,QWL_USER,(ULONG)pfnwp);
+              }
+            }/* end of if((ulStyle & 0xf) == SS_TEXT) */
+          }
+        }
+      }while(hwndNext);
+      WinEndEnumWindows(hEnum);
+      /* Set dialog font to WarpSans for Warp 4 and above */
+      if(cwQueryOSRelease()>=40) {
+        WinSetPresParam(hwnd,
+                        PP_FONTNAMESIZE,(ULONG)sizeof(DEFAULT_DIALOG_FONT),
+                        DEFAULT_DIALOG_FONT );
+      }
+
+      WinQueryWindowPos(hwnd, &swp);
+
+      WinSetWindowPos(hwnd,HWND_TOP,(WinQuerySysValue(HWND_DESKTOP, SV_CXSCREEN)-swp.cx)/2, (WinQuerySysValue(HWND_DESKTOP, SV_CYSCREEN)-swp.cy)/2,
+                      0,0, SWP_MOVE|SWP_ZORDER|SWP_ACTIVATE|SWP_SHOW);
+      return (MRESULT) TRUE;
+    case WM_DESTROY:
+      break;
+    case WM_CLOSE:
+      break;
+    case WM_COMMAND:
+      {
+    switch( SHORT1FROMMP( mp1 ) )
+      {
+      default:
+        break;
+      }
+      }
+      break;
+      return (MRESULT) TRUE;
+    }   
+  return( WinDefDlgProc( hwnd, msg, mp1, mp2 ) );   
+}
+
+/**************************************************************/
+/*                                                            */
+/* This method shows an about dialog.                         */
+/*                                                            */
+/**************************************************************/
+ULONG CWProgFolder::cwShowAboutDlg(HMODULE hModule, ULONG idDialog)
+{
+  HWND hwnd;
+
+  /*
+    New: 01.05.2004, MAke sure the about dialog is modal to the folder.
+   */
+  hwnd=WinQueryActiveWindow(HWND_DESKTOP);
+
+  return (WinDlgBox( HWND_DESKTOP, hwnd, aboutDlgProc, hModule,idDialog, 0));
+}
+
+/**************************************************************/
+/*                                                            */
+/* This funktion returns the CD-Drives in the system          */
+/*                                                            */
+/* iNumCD (output): # of CD-Drives                            */
+/* cFirstDrive (output): first cd-Drive letter                */
+/* returns TRUE: We have cd-drives                            */
+/*                                                            */
+/**************************************************************/
+BOOL CWProgFolder::cwQueryCDDrives(int *iNumCD, char * cFirstDrive)
+{
+  HFILE hfDevice;
+  ULONG ulAction;
+  ULONG ulLen;
+  static char cFirst=0;
+  static int iNumCDLocal=0;
+  static BOOL haveCD=FALSE;
+  static BOOL done=FALSE;         
+  struct
+  {
+    USHORT usCountCD;
+    USHORT usFirstCD;
+  } CDInfo;
+
+  if(!done){
+    ulLen = sizeof(CDInfo);
+    if(!DosOpen("\\DEV\\CD-ROM2$", &hfDevice, &ulAction, 0,
+                FILE_NORMAL, OPEN_ACTION_OPEN_IF_EXISTS,
+                OPEN_SHARE_DENYNONE | OPEN_ACCESS_READONLY, NULL))
+      {
+        if(!DosDevIOCtl(hfDevice, 0x82, 0x60, NULL, 0, NULL, &CDInfo, ulLen, &ulLen))
+          {
+            if(CDInfo.usCountCD) {
+              haveCD=TRUE;
+              iNumCDLocal=CDInfo.usCountCD;
+              cFirst='A'+ CDInfo.usFirstCD;
+            }                                        
+          }
+        DosClose(hfDevice);
+      }
+    done=TRUE;
+  }
+  *iNumCD=iNumCDLocal;
+  *cFirstDrive=cFirst;
+  return haveCD;              
+}
+
+
+/* Use this method to insert user menu items into a menu when WPSWizard is installed */
+BOOL CWProgFolder::cwInsertUserMenuItems(HWND hwndMenu, char* chrMenuFolder, ULONG ulFirstId, BOOL bLeadingSeparator)
+{
+  M_WPObject *m_wpObject;
+  CWMenuFolder * wpFolder;
+  HOBJECT hObject;
+  somId id;
+  somTD_CWMenuFolder_mfInsertMenuItems methodPtr;
+  ULONG ulRc=ulFirstId;
+
+  /* Insert the menu items from the user menu folder. WPS-Wizard must be installed for
+     this. */
+  if((hObject=WinQueryObject(chrMenuFolder))!=NULLHANDLE) {//is there a default menufolder?    
+    /* Yes */
+    m_wpObject=(M_WPObject*)this->somGetClass();
+    if(somIsObj(m_wpObject)) {
+      /* We have it */
+      /* Get method address */
+      if((id=somIdFromString("mfInsertMenuItems"))!=NULLHANDLE) {
+        wpFolder=(CWMenuFolder *)m_wpObject->wpclsQueryObject( hObject);
+        if(somIsObj(wpFolder)) {
+          methodPtr= (somTD_CWMenuFolder_mfInsertMenuItems) (wpFolder->somGetClass())->somFindSMethod(id);
+          if(methodPtr) {
+            SHORT sIndex;
+
+            if(bLeadingSeparator)
+              sIndex=SHORT1FROMMR(cwInsertMenuSeparator(MIT_END, hwndMenu, NULL));
+            ulRc=methodPtr(wpFolder, hwndMenu , MIT_END, ulFirstId);
+#if 0
+            if(ulRc==ulFirstId) {
+              /* No item inserted, remove the separator */
+              sIndex=SHORT1FROMMR(WinSendMsg(hwndMenu,MM_ITEMIDFROMPOSITION,MPFROMSHORT(sIndex),
+                                             (MPARAM)NULL));
+              if(sIndex!=MIT_ERROR)            
+                WinSendMsg(hwndMenu,MM_DELETEITEM,MPFROM2SHORT(sIndex, TRUE),
+                           (MPARAM)NULL);                 
+              
+            }
+#endif
+          }
+          /* ulCurrentID contains the last used menu id */
+          wpFolder->wpUnlockObject();//Object is locked because of wpclsQueryHandle()
+        }/* if(somIsObj(wpFolder)) */
+        SOMFree(id);
+      }/* somId */
+    }/* end of if(somIsObj(m_wpObject))  */
+  }/* USERMENU_FOLDER */
+  return ulRc;
+}
+
+BOOL CWProgFolder::cwCheckUserMenuItems( char* chrMenuFolder, USHORT usItemId)
+{
+  CWMenuFolder * wpFolder;
+  HOBJECT hObject;
+  somId id;
+  somTD_CWMenuFolder_mfCheckMenuItems methodPtr;
+  M_WPObject *m_wpObject;
+  BOOL bHandled=FALSE;
+
+  if((hObject=WinQueryObject(chrMenuFolder))!=NULLHANDLE) {//is there a default menufolder?    
+    /* Get class object */
+    m_wpObject=(M_WPObject*)this->somGetClass();
+    if(somIsObj(m_wpObject)) {
+      /* We have it */
+      if((id=somIdFromString("mfCheckMenuItems"))!=NULLHANDLE){
+        wpFolder=(CWMenuFolder *)m_wpObject->wpclsQueryObject( hObject);
+        if(somIsObj(wpFolder)) {
+          methodPtr= (somTD_CWMenuFolder_mfCheckMenuItems) (wpFolder->somGetClass())->somFindSMethod(id);
+          SOMFree(id);
+          if(methodPtr) {
+            /* Check for Items */
+            bHandled=methodPtr(wpFolder, this, usItemId);
+          }
+          wpFolder->wpUnlockObject();//Object is locked because of wpclsQueryHandle()
+        }
+      }/* somId */
+    }/* end of if(somIsObj(m_wpObject))  */
+  }
+  return bHandled;
+}
Index: /tags/CWMM-0.3.0_GA/mediafolder/ProgFolder/progfolder.h
===================================================================
--- /tags/CWMM-0.3.0_GA/mediafolder/ProgFolder/progfolder.h	(revision 213)
+++ /tags/CWMM-0.3.0_GA/mediafolder/ProgFolder/progfolder.h	(revision 213)
@@ -0,0 +1,47 @@
+/*
+ * progfolder.h: Definitions for class CWProgFolder
+ *
+ *             (C) Chris Wohlgenuth 1999
+ *
+ */
+/*
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; see the file COPYING.  If not, write to
+ * the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+#define NUM_STOREWINDOWBYTES 12
+#define QWP_ORGFRAMEPROC 4 /* address of the original frame proc */
+#define QWP_FCTRLDATA 8 /* ptr to the private framectrl data */
+/* 0: this-ptr.
+   4: original frame proc
+   8: ptr. to framectrl data */
+
+#define ID_FOLDERSTOREWINDOW         1200
+
+#define ID_FRAMELEFT         1000
+#define ID_FRAMERIGHT         1001
+#define ID_FRAMETOP         1002
+#define ID_FRAMEBOTTOM         1003
+
+#define FCTL_LEFT   1
+#define FCTL_RIGHT  2
+#define FCTL_TOP    4
+#define FCTL_BOTTOM 8
+
+#define FCTL_POSABOVE  1
+#define FCTL_POSBELOW  2
+
+#define ID_FOLDERCLASSNAME 100
+
+#define IDPT_HAND       6000
+
Index: /tags/CWMM-0.3.0_GA/mediafolder/ProgFolder/progfolder.rc
===================================================================
--- /tags/CWMM-0.3.0_GA/mediafolder/ProgFolder/progfolder.rc	(revision 213)
+++ /tags/CWMM-0.3.0_GA/mediafolder/ProgFolder/progfolder.rc	(revision 213)
@@ -0,0 +1,9 @@
+#include "progfolder.h"
+
+POINTER IDPT_HAND  hand.ptr
+
+STRINGTABLE 
+BEGIN
+ID_FOLDERCLASSNAME "Support-Folder"
+END
+
Index: /tags/CWMM-0.3.0_GA/mediafolder/ProgFolder/separatorwindow.cpp
===================================================================
--- /tags/CWMM-0.3.0_GA/mediafolder/ProgFolder/separatorwindow.cpp	(revision 213)
+++ /tags/CWMM-0.3.0_GA/mediafolder/ProgFolder/separatorwindow.cpp	(revision 213)
@@ -0,0 +1,63 @@
+#include <stdlib.h>
+#include "progfolder.h"
+#include "progfolder.hh"
+
+MRESULT EXPENTRY separatorProc(HWND hwnd, ULONG msg, MPARAM mp1, MPARAM mp2)
+{
+  switch(msg)
+    {
+    case WM_PAINT:
+      {
+        MRESULT mr;
+        HPS hps;
+        RECTL rcl;
+
+        WinQueryWindowRect(hwnd, &rcl);
+        if(rcl.yTop-rcl.yBottom<2)
+          break;
+
+        mr=WinDefWindowProc(hwnd, msg, mp1, mp2);
+        if((hps=WinGetPS(hwnd))!=NULLHANDLE) {
+          POINTL ptl;
+
+          ptl.y=(rcl.yTop-rcl.yBottom)/2;
+          ptl.x=0;
+          GpiMove(hps, &ptl);
+          ptl.x=rcl.xRight;
+          GpiSetColor(hps, CLR_DARKGRAY);
+          GpiLine(hps,&ptl);
+          GpiSetColor(hps, CLR_WHITE);
+          ptl.y-=1;
+          GpiMove(hps, &ptl);
+          ptl.x=0;
+          GpiLine(hps,&ptl);
+          WinReleasePS(hps);
+        }
+        return mr;
+        break;
+      }
+    default:
+      break;
+    }
+  return WinDefWindowProc(hwnd, msg, mp1, mp2);
+}
+
+
+
+BOOL cwRegisterSeparatorWindowClass(void)
+{
+  CLASSINFO ci;
+ 
+  if(WinQueryClassInfo(WinQueryAnchorBlock(HWND_DESKTOP),
+                       WC_STATIC,
+                       &ci))
+    {
+      if(WinRegisterClass(WinQueryAnchorBlock(HWND_DESKTOP),
+                          (PSZ)"CW_SEPARATOR",
+                          separatorProc,
+                          (ci.flClassStyle) &~(CS_PUBLIC | CS_PARENTCLIP),
+                          0))
+        return TRUE;
+    }
+  return FALSE;
+}
Index: /tags/CWMM-0.3.0_GA/mediafolder/ProgFolder/storewindow.cpp
===================================================================
--- /tags/CWMM-0.3.0_GA/mediafolder/ProgFolder/storewindow.cpp	(revision 213)
+++ /tags/CWMM-0.3.0_GA/mediafolder/ProgFolder/storewindow.cpp	(revision 213)
@@ -0,0 +1,53 @@
+/*
+ *    storewindow.cpp: creating of an invisible child window of
+ *                     the WPS folder which holds important data
+ *                     like the object handle and frame control
+ *                     information.
+ *
+ *             (C) Chris Wohlgenuth 1999
+ */
+/*
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; see the file COPYING.  If not, write to
+ * the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+#include <stdlib.h>
+#include "progfolder.h"
+#include "progfolder.hh"
+
+
+MRESULT EXPENTRY storeWindowProc (HWND hwnd,ULONG msg, MPARAM mp1,MPARAM mp2)
+{
+  if( msg==WM_DESTROY)
+    free(WinQueryWindowPtr(hwnd,QWP_FCTRLDATA));
+  return WinDefWindowProc(hwnd, msg, mp1, mp2);
+}
+
+HWND createStoreWindow(HWND hwndCLF)
+{
+  static BOOL bStoreWindowRegistered=FALSE;
+  
+  if(!bStoreWindowRegistered) {
+    if(WinRegisterClass(WinQueryAnchorBlock(HWND_DESKTOP),"FolderStoreWindow",&storeWindowProc,0,NUM_STOREWINDOWBYTES))
+      {
+        bStoreWindowRegistered=TRUE;
+      }else
+        return NULL;
+  }
+  return WinCreateWindow(hwndCLF,"FolderStoreWindow","",0,
+                         0,0,0,0,0,HWND_TOP,ID_FOLDERSTOREWINDOW,NULL,0);
+}
+
+
+
+
Index: /tags/CWMM-0.3.0_GA/mediafolder/Skripte_eng/Create ~M3U playlist
===================================================================
--- /tags/CWMM-0.3.0_GA/mediafolder/Skripte_eng/Create ~M3U playlist	(revision 213)
+++ /tags/CWMM-0.3.0_GA/mediafolder/Skripte_eng/Create ~M3U playlist	(revision 213)
@@ -0,0 +1,113 @@
+/* Create an *.m3u playlist from all selected tracks */
+
+/* Load Rexxutil functions */
+call RxFuncAdd 'SysLoadFuncs', 'RexxUtil', 'SysLoadFuncs'
+call SysLoadFuncs
+
+QC_FIRST=0
+QC_NEXT=1
+QC_LAST=2
+
+/* Check if we are executing */
+if ARG(1)\='/EXECUTE' THEN EXIT
+
+/* The media folder running this skript */
+mFldr=ARG(2)
+/* And the frame handle */
+frameHandle=ARG(3)
+
+/*Get the container handle */
+container=WPSWizCallWinFunc( "winQueryContainerHWND", frameHandle)
+
+if container=0 THEN DO
+    rc=RxMessageBox("Cannot get container handle!", "",'OK', "Information")
+     EXIT
+END
+
+pRec=WPSWizCallWinFunc( "winQueryContRecEmphasis", container, 16 , 1)
+
+a=0
+tracks.0=0
+DO WHILE (pRec\=0 & pRec\=-1)
+	/* Get object pointer */
+	obj=WPSWizCallWinFunc( "winObjectFromPRec", pRec)
+	/* Follow shadows to file system object */
+	obj=MFldrCallFunc( "cwGetFileSystemObject", mFldr, obj)
+	/* Check if it's an audio object */
+	IF MFldrCallFunc( "cwIsA", obj, "CWAudio")\=0 THEN DO
+	        a=a+1
+		tracks.a._obj=obj
+	END
+	pRec=WPSWizCallWinFunc( "winQueryContRecEmphasis", container, pRec , 1)
+	tracks.0=a
+END
+
+if tracks.0=0 THEN DO
+	rc=RxMessageBox("No audio tracks selected.", "Information",'OK')
+	EXIT
+END
+
+/* Try to find the desktop folder */
+
+/* Get the persistent object handle */
+hObject=WPSWizCallWinFunc( "winQueryObject" ,"<WP_DESKTOP>")
+
+if hObject\=0 THEN DO
+	/* Get the class object of the given object pointer */
+	classObject=WPSWizCallWPSFunc("somGetClass",mFldr)
+
+	/* Get the object pointer from the handle */
+	theObject=WPSWizCallWPSClsFunc("wpclsQueryObject", classObject, hObject)
+
+	/* Query the full path of the object */
+	desktop=WPSWizCallFunc("cwQueryRealName", theObject, 1)
+
+	/* The object was locked because of "wpclsQueryObject" */
+	rc=WPSWizCallWPSFunc("wpUnlockObject", theObject)
+END
+
+if desktop\='' THEN
+    desktop=desktop||'\new.m3u'
+
+filedlg:
+
+/* Get a name for the new folder from the user */
+theName=WPSWizCallWinFunc( "winFileDlg", 1, "Name for play list", desktop)
+
+/* No name, so quit */
+if thename="" THEN exit
+
+/* Check if an error occurred */
+if thename="ERROR:" THEN DO
+  rc=RxMessageBox("File dialog returned an error!", "Error",'OK', "ERROR")
+  EXIT
+END
+
+/* Check if file exists */
+IF STREAM(theName, 'C', 'query exists')=theName THEN DO
+
+  rc=RxMessageBox("The file already exists. Do you want to add the selected tracks to the contents?", "Create *.M3U playlist",'YESNO', "QUESTION")
+IF rc=7 then signal filedlg
+END
+
+/* Get the path */
+thePath=FILESPEC('drive', thename)||FILESPEC('path', thename)
+thePath=LEFT(thePath,LENGTH(thePath)-1)
+
+
+/* Now put names into the playlist file */
+DO a=1 to tracks.0
+	objName=MFldrCallFunc( "cwQueryRealName", tracks.a._obj, 1)
+call lineout thename, objname
+END
+
+call stream thename, 'C', 'close'
+
+/* Open the folder */
+rc=SysSetObjectData(theName, "OPEN=DEFAULT")
+
+rc=0
+
+exit
+
+
Index: /tags/CWMM-0.3.0_GA/mediafolder/Skripte_eng/mfldrscr.in_
===================================================================
--- /tags/CWMM-0.3.0_GA/mediafolder/Skripte_eng/mfldrscr.in_	(revision 213)
+++ /tags/CWMM-0.3.0_GA/mediafolder/Skripte_eng/mfldrscr.in_	(revision 213)
@@ -0,0 +1,45 @@
+[APPLICATION]
+NAME Media Player Scripts
+VERSION 0.1.2.0
+COPYRIGHT (C) Chris Wohlgemuth 2002
+HOME http://www.os2world.com/cdwriting
+INTERNALNAME MFLDRSCR
+TOTALSIZE 13564
+INSTALLER 0.1.1.0
+DESCRIPTION REXX scripts for the Media-Folder. Use these scripts to create audio-CDs from MP3 files or to create new playlists from selected tracks. WPS-Wizard V0.2.0 must be installed to use scripts.
+
+[DESCRIPTION]
+DESCRIPTION  REXX scripts for the Media-Folder. Use these scripts to create audio-CDs from MP3 files or to create new playlists from selected tracks. WPS-Wizard V0.2.0 must be installed to use scripts.
+
+[FILES]
+mfldrscr.in_, %TARGET%\Skripte\ ,  F,  1357
+~Burn audio CD, %TARGET%\Skripte\ ,  F,  3914
+~Create playlist, %TARGET%\Skripte\ ,  F,  3266
+~Play time, %TARGET%\Skripte\ ,  F,  1751
+Create ~M3U playlist, %TARGET%\Skripte\ , F, 3276
+
+[OBJECTS]
+Scripts for Media Folderõ,õ <SKRIPTS_CWMediaFolder>õ,õ CWMenuFolderõ,õ <WPSWIZ_CONFIG>õ,õ CLEARMENUCACHE=1;DEFAULTVIEW=ICON;SHOWALLINTREEVIEW=YES;ICONVIEW=NONFLOWED,MINI;HIDECLASSPAGE=1õ,õ update
+~Burn audio CDõ,õ <MFLDR_BURNAUD_SHW>õ,õ WPShadowõ,õ <SKRIPTS_CWMediaFolder>õ,õ SHADOWID=%TARGET%\Skripte\~Burn audio CDõ,õ update
+~Create playlistõ,õ <MFLDR_PLAYLST_SHW>õ,õ WPShadowõ,õ <SKRIPTS_CWMediaFolder>õ,õ SHADOWID=%TARGET%\Skripte\~Create playlistõ,õ update
+~Play timeõ,õ <MFLDR_PLAYTIME_SHW>õ,õ WPShadowõ,õ <SKRIPTS_CWMediaFolder>õ,õ SHADOWID=%TARGET%\Skripte\~Play timeõ,õ update
+Create ~M3U playlistõ,õ <MFLDR_PLAYLSTM3U_SHW>õ,õ WPShadowõ,õ<SKRIPTS_CWMediaFolder>õ,õ SHADOWID=%TARGET%\Skripte\Create ~M3U playlistõ,õ update
+User menu Media-Folderõ,õ <USERMENU_MEDIAFOLDER>õ,õ CWMenuFolderõ,õ <WPSWIZ_CONFIG>õ,õ CLEARMENUCACHE=1;DEFAULTVIEW=ICON;SHOWALLINTREEVIEW=YES;ICONVIEW=NONFLOWED,MINI;HIDECLASSPAGE=1õ,õ update
+Menu configurationõ,õ <MFLDR_MENUCONFIG_SHW>õ,õ WPShadowõ,õ <USERMENU_MEDIAFOLDER>õ,õ SHADOWID=<WPSWIZ_CONFIG>õ,õ update
+Scripts for M3U Playlistsõ,õ <SKRIPTS_CWM3UFolder>õ,õ CWMenuFolderõ,õ <WPSWIZ_CONFIG>õ,õ CLEARMENUCACHE=1;DEFAULTVIEW=ICON;SHOWALLINTREEVIEW=YES;ICONVIEW=NONFLOWED,MINI;HIDECLASSPAGE=1õ,õ update
+~Burn audio CDõ,õ <M3UFLDR_BURNAUD_SHW>õ,õ WPShadowõ,õ <SKRIPTS_CWM3UFolder>õ,õ SHADOWID=%TARGET%\Skripte\~Burn audio CDõ,õ update
+
+
+[SKRIPTS]
+BEFOREINST õ,õ /* Check for WPS-Wizard installation */;call RxFuncAdd 'SysLoadFuncs', 'RexxUtil', 'SysLoadFuncs';call SysLoadFuncs;ret=SysQueryClassList('classes.');found=0;DO cls=1 to classes.0;	theclass=WORD(classes.cls, 1);	thePath=SUBWORD(classes.cls, 2);	IF TRANSLATE(theClass)='CWMENUFOLDER' THEN DO;		found=1	;		LEAVE;	END;END;;RC=0;IF found=0 THEN DO;		usrdata._mBTitle="Script package installation";		usrData._mBCBTxt="";		usrdata._mBTxt='WPS-Wizard not found. ';		usrdata._mBTxt=usrdata._mBTxt||'You need this aplication (V0.2.0 or higher) if you ';		usrdata._mBTxt=usrdata._mBTxt||'want to use scripts.'||'0d'x;		usrdata._mBTxt=usrdata._mBTxt||'Get it at'||'0d'x||'0d'x;		usrdata._mBTxt=usrdata._mBTxt||'http://www.os2world.com/cdwriting/'||'0d'x||'0d'x;		usrdata._mBTxt=usrdata._mBTxt||'The script package will not be installed.'||'0d'x;		usrData._mBType="OK";		call beep 1000, 100;		ret=ModalFor('usermsgBox');		RC=1;END;;
+
+[INSTALLPROFILES]
+MFLDRSCR õ,õ Media-folder scripts installation õ,õ Installation of additional REXX scripts to make creation of audio-CDs and new playlists easier. The scripts will be inserted into the menu bar of each media folder. WPS-Wizard V0.2.0 must be installed to use this feature.
+
+[MFLDRSCR]
+MFLDRSCR, , ,S,[ ], mfldrscr.in_
+
+[DEFAULTTARGET]
+PATH %APPS%\CWMMOS2\MediaFld
+
+
Index: /tags/CWMM-0.3.0_GA/mediafolder/Skripte_eng/~Burn audio CD
===================================================================
--- /tags/CWMM-0.3.0_GA/mediafolder/Skripte_eng/~Burn audio CD	(revision 213)
+++ /tags/CWMM-0.3.0_GA/mediafolder/Skripte_eng/~Burn audio CD	(revision 213)
@@ -0,0 +1,140 @@
+/****************************************/
+/*                                      */
+/* Burn selected tracks as an audio CD. */
+/* Audio-CD-Creator must be installed.  */
+/*                                      */
+/* An audio folder will be created and  */
+/* the selected tracks inserted.        */
+/*                                      */
+/****************************************/
+/* Load Rexxutil functions */
+call RxFuncAdd 'SysLoadFuncs', 'RexxUtil', 'SysLoadFuncs'
+call SysLoadFuncs
+
+QC_FIRST=0
+QC_NEXT=1
+QC_LAST=2
+
+/* Check if we are executing */
+if ARG(1)\='/EXECUTE' THEN EXIT
+
+/* Check if Audio-CD-Creator is installed */
+
+list.0=0
+found=0
+rc=SysQueryClassList(list.)
+DO a=1 to list.0
+	if TRANSLATE(WORD(list.a,1))='CWAUDIOFOLDER' THEN DO
+		found=1
+		LEAVE
+	END
+END
+
+IF found=0 THEN DO
+	theString="Audio-CD-Creator is not installed. You need this package for burning."
+	theString=theString||'0d'X||'0d'X
+	theString=theString||'Get it from http://www.os2world.com/cdwriting'||'0d'X||'  '
+	rc=RxMessageBox(theString, "",'OK', "Information")
+	EXIT
+END
+
+/* The media folder running this skript */
+mFldr=ARG(2)
+/* And the frame handle */
+frameHandle=ARG(3)
+
+/*Get the container handle */
+container=WPSWizCallWinFunc( "winQueryContainerHWND", frameHandle)
+
+if container=0 THEN DO
+    rc=RxMessageBox("Cannot get container handle!", "",'OK', "Information")
+     EXIT
+END
+
+pRec=WPSWizCallWinFunc( "winQueryContRecEmphasis", container, 16 , 1)
+
+a=0
+tracks.0=0
+DO WHILE (pRec\=0 & pRec\=-1)
+	/* Get object pointer */
+	obj=WPSWizCallWinFunc( "winObjectFromPRec", pRec)
+	/* Follow shadows to file system object */
+	obj=MFldrCallFunc( "cwGetFileSystemObject", mFldr, obj)
+	/* Check if it's an audio object */
+	IF MFldrCallFunc( "cwIsA", obj, "CWAudio")\=0 THEN DO
+	        a=a+1
+		tracks.a._obj=obj
+	END
+	pRec=WPSWizCallWinFunc( "winQueryContRecEmphasis", container, pRec , 1)
+	tracks.0=a
+END
+
+if tracks.0=0 THEN DO
+	rc=RxMessageBox("No audio tracks selected.", "Information",'OK')
+	EXIT
+END
+
+/* Try to find the desktop folder */
+
+/* Get the persistent object handle */
+hObject=WPSWizCallWinFunc( "winQueryObject" ,"<WP_DESKTOP>")
+
+if hObject\=0 THEN DO
+	/* Get the class object of the given object pointer */
+	classObject=WPSWizCallWPSFunc("somGetClass",mFldr)
+
+	/* Get the object pointer from the handle */
+	theObject=WPSWizCallWPSClsFunc("wpclsQueryObject", classObject, hObject)
+
+	/* Query the full path of the object */
+	desktop=WPSWizCallFunc("cwQueryRealName", theObject, 1)
+
+	/* The object was locked because of "wpclsQueryObject" */
+	rc=WPSWizCallWPSFunc("wpUnlockObject", theObject)
+END
+
+if desktop\='' THEN
+    desktop=desktop||'\audioFolder'
+
+/* Get a name for the new folder */
+folderName=WPSWizCallWinFunc( "winFileDlg", 1, "Name for Audio-CD-Creator folder", desktop)
+
+/* No name, so quit */
+if foldername="" THEN exit
+
+/* Check if an error occurred */
+if foldername="ERROR:" THEN DO
+  rc=RxMessageBox("File dialog returned an error!", "Error",'OK', "ERROR")
+  EXIT
+END
+
+/* Get the path */
+thePath=FILESPEC('drive',foldername)||FILESPEC('path',foldername)
+thePath=LEFT(thePath,LENGTH(thePath)-1)
+
+/* Create a new audio folder to hold the selected tracks */
+setup=''
+setup='DETAILSCLASS=CWAudioShadow;SORTCLASS=CWAudioShadow;DETAILSTODISPLAY=0,1,4,12,13,14,15,16,17,18,19,20,21;SORTBYATTR=6,24,25,26,27,28,29,30,31,32,33'
+newFldr=SysCreateObject("CWAudioFolder", FILESPEC('name',foldername), thePath, setup , 'update')
+
+if newFldr=0 THEN DO
+	/* Folder creation failed */
+	rc=RxMessageBox("Cannot create audio-CD folder", "Audio-CD folder creation",'OK')
+	EXIT
+END
+
+
+/* Now create shadows of the selected tracks */
+DO a=tracks.0 to 1 by -1
+	objName=MFldrCallFunc( "cwQueryRealName", tracks.a._obj, 0)
+	/* When using a space as the object title the real name is used as the title. By doing it this
+           way we may have several shadows to the same track in the folder. */
+	rc=SysCreateObject("CWAudioShadow", " ", folderName, "SHADOWID="||MFldrCallFunc( "cwQueryRealName", tracks.a._obj,1),'update')
+END
+/* Open the folder */
+rc=SysSetObjectData(folderName, "OPEN=DEFAULT")
+rc=0
+
+exit
+
+
Index: /tags/CWMM-0.3.0_GA/mediafolder/Skripte_eng/~Create playlist
===================================================================
--- /tags/CWMM-0.3.0_GA/mediafolder/Skripte_eng/~Create playlist	(revision 213)
+++ /tags/CWMM-0.3.0_GA/mediafolder/Skripte_eng/~Create playlist	(revision 213)
@@ -0,0 +1,110 @@
+/* Create a playlist from all selected tracks */
+
+/* Load Rexxutil functions */
+call RxFuncAdd 'SysLoadFuncs', 'RexxUtil', 'SysLoadFuncs'
+call SysLoadFuncs
+
+QC_FIRST=0
+QC_NEXT=1
+QC_LAST=2
+
+/* Check if we are executing */
+if ARG(1)\='/EXECUTE' THEN EXIT
+
+/* The media folder running this skript */
+mFldr=ARG(2)
+/* And the frame handle */
+frameHandle=ARG(3)
+
+/*Get the container handle */
+container=WPSWizCallWinFunc( "winQueryContainerHWND", frameHandle)
+
+if container=0 THEN DO
+    rc=RxMessageBox("Cannot get container handle!", "",'OK', "Information")
+     EXIT
+END
+
+pRec=WPSWizCallWinFunc( "winQueryContRecEmphasis", container, 16 , 1)
+
+a=0
+tracks.0=0
+DO WHILE (pRec\=0 & pRec\=-1)
+	/* Get object pointer */
+	obj=WPSWizCallWinFunc( "winObjectFromPRec", pRec)
+	/* Follow shadows to file system object */
+	obj=MFldrCallFunc( "cwGetFileSystemObject", mFldr, obj)
+	/* Check if it's an audio object */
+	IF MFldrCallFunc( "cwIsA", obj, "CWAudio")\=0 THEN DO
+	        a=a+1
+		tracks.a._obj=obj
+	END
+	pRec=WPSWizCallWinFunc( "winQueryContRecEmphasis", container, pRec , 1)
+	tracks.0=a
+END
+
+if tracks.0=0 THEN DO
+	rc=RxMessageBox("No audio tracks selected.", "Information",'OK')
+	EXIT
+END
+
+/* Try to find the desktop folder */
+
+/* Get the persistent object handle */
+hObject=WPSWizCallWinFunc( "winQueryObject" ,"<WP_DESKTOP>")
+
+if hObject\=0 THEN DO
+	/* Get the class object of the given object pointer */
+	classObject=WPSWizCallWPSFunc("somGetClass",mFldr)
+
+	/* Get the object pointer from the handle */
+	theObject=WPSWizCallWPSClsFunc("wpclsQueryObject", classObject, hObject)
+
+	/* Query the full path of the object */
+	desktop=WPSWizCallFunc("cwQueryRealName", theObject, 1)
+
+	/* The object was locked because of "wpclsQueryObject" */
+	rc=WPSWizCallWPSFunc("wpUnlockObject", theObject)
+END
+
+if desktop\='' THEN
+    desktop=desktop||'\newFolder'
+
+/* Get a name for the new folder from the user */
+folderName=WPSWizCallWinFunc( "winFileDlg", 1, "New folder name for play list", desktop)
+
+/* No name, so quit */
+if foldername="" THEN exit
+
+/* Check if an error occurred */
+if foldername="ERROR:" THEN DO
+  rc=RxMessageBox("File dialog returned an error!", "Error",'OK', "ERROR")
+  EXIT
+END
+
+/* Get the path */
+thePath=FILESPEC('drive',foldername)||FILESPEC('path',foldername)
+thePath=LEFT(thePath,LENGTH(thePath)-1)
+
+/* Create a new media folder to hold the selected tracks */
+setup='DETAILSTODISPLAY=0,1,4,12,13,14,15,16,17,18,19,20,21;SORTBYATTR=6,24,25,26,27,28,29,30,31,32,33;DETAILSCLASS=CWAudioShadow;MEDIAFLDRVOLUME=70;SORTCLASS=CWAudioShadow;DEFAULTVIEW=DETAILS;'
+newFldr=SysCreateObject("CWMediaFolder", FILESPEC('name',foldername), thePath, setup , 'update')
+
+if newFldr=0 THEN DO
+	/* Folder creation failed */
+	rc=RxMessageBox("Cannot create media folder", "Media folder creation",'OK')
+	EXIT
+END
+
+
+/* Now create shadows of the selected tracks */
+DO a=tracks.0 to 1 by -1
+	objName=MFldrCallFunc( "cwQueryRealName", tracks.a._obj, 0)
+	rc=SysCreateObject("CWAudioShadow",objName, folderName, "SHADOWID="||MFldrCallFunc( "cwQueryRealName", tracks.a._obj,1),'update')
+END
+/* Open the folder */
+rc=SysSetObjectData(folderName, "OPEN=DEFAULT")
+rc=0
+
+exit
+
+
Index: /tags/CWMM-0.3.0_GA/mediafolder/Skripte_eng/~Play time
===================================================================
--- /tags/CWMM-0.3.0_GA/mediafolder/Skripte_eng/~Play time	(revision 213)
+++ /tags/CWMM-0.3.0_GA/mediafolder/Skripte_eng/~Play time	(revision 213)
@@ -0,0 +1,68 @@
+/* Calculate the playtime of all selected tracks */
+
+/* Load Rexxutil functions */
+call RxFuncAdd 'SysLoadFuncs', 'RexxUtil', 'SysLoadFuncs'
+call SysLoadFuncs
+
+QC_FIRST=0
+QC_NEXT=1
+QC_LAST=2
+
+/* Check if we are executing */
+if ARG(1)\='/EXECUTE' THEN EXIT
+
+/* The media folder running this skript */
+mFldr=ARG(2)
+/* And the frame handle */
+frameHandle=ARG(3)
+
+/*Get the container handle */
+container=WPSWizCallWinFunc( "winQueryContainerHWND", frameHandle)
+
+if container=0 THEN DO
+    rc=RxMessageBox("Cannot get container handle!", "",'OK', "Information")
+     EXIT
+END
+
+pRec=WPSWizCallWinFunc( "winQueryContRecEmphasis", container, 16 , 1)
+
+a=0
+tracks.0=0
+DO WHILE (pRec\=0 & pRec\=-1)
+	/* Get object pointer */
+	obj=WPSWizCallWinFunc( "winObjectFromPRec", pRec)
+	/* Follow shadows to file system object */
+	obj=MFldrCallFunc( "cwGetFileSystemObject", mFldr, obj)
+	/* Check if it's an audio object */
+	IF MFldrCallFunc( "cwIsA", obj, "CWAudio")\=0 THEN DO
+	        a=a+1
+		tracks.a._obj=obj
+	END
+	pRec=WPSWizCallWinFunc( "winQueryContRecEmphasis", container, pRec , 1)
+	tracks.0=a
+END
+
+if tracks.0=0 THEN DO
+	rc=RxMessageBox("No audio tracks selected.", "Information",'OK')
+	EXIT
+END
+
+playTime=0
+/* Now calculate play time */
+DO a=tracks.0 to 1 by -1
+tempTime=0
+	tempTime=MMClsCallFunc( "cwmmQueryTrackInfo", tracks.a._obj, 7)
+	if tempTime\= 'ERROR:' THEN DO
+		playTime=playTime+tempTime	
+	END
+END
+theString='Playtime of all selected tracks is:  '
+secs=RIGHT('00'||playTime//60 ,2)
+theString=theString||playTime%60||':'||secs||' min'||'0d'X||'0d'X
+theString=theString||'Number of selected tracks: '||tracks.0||'0d'X||'  '
+rc=RxMessageBox(theString, "Information",'OK')
+
+RC=0
+exit
+
+
Index: /tags/CWMM-0.3.0_GA/mediafolder/Skripte_ger/mfldrscr.in_
===================================================================
--- /tags/CWMM-0.3.0_GA/mediafolder/Skripte_ger/mfldrscr.in_	(revision 213)
+++ /tags/CWMM-0.3.0_GA/mediafolder/Skripte_ger/mfldrscr.in_	(revision 213)
@@ -0,0 +1,44 @@
+[APPLICATION]
+NAME Media Spieler Skripte
+VERSION 0.1.2.0
+COPYRIGHT (C) Chris Wohlgemuth 2002
+HOME http://www.os2world.com/cdwriting
+INTERNALNAME MFLDRSCR
+TOTALSIZE 13584
+INSTALLER 0.1.1.0
+DESCRIPTION REXX-Skripte fr den Media-Ordner. Diese Skripte ermglichen unter anderem das einfache Erstellen neuer Playlisten oder das Brennen von Audio-CDs. Die Skripte sind ber die Menleiste des Media-Ordners ereichbar. WPS-Wizard V0.2.0 muá installiert sein, um Skripte verwenden zu knnen.
+
+[DESCRIPTION]
+DESCRIPTION  REXX-Skripte fr den Media-Ordner. Diese Skripte ermglichen unter anderem das einfache Erstellen neuer Playlisten oder das Brennen von Audio-CDs. Die Skripte sind ber die Menleiste des Media-Ordners ereichbar. WPS-Wizard V0.2.0 muá installiert sein, um Skripte verwenden zu knnen.
+
+[FILES]
+mfldrscr.in_, %TARGET%\Skripte\ ,  F,  1489
+~Audio CD brennen, %TARGET%\Skripte\ ,  F,  4016
+~Playlist erstellen, %TARGET%\Skripte\ ,  F,  3312
+~Spielzeit ermitteln, %TARGET%\Skripte\ ,  F,  1781
+~M3U-Playlist erstellen, %TARGET%\Skripte\ ,  F, 2986 
+
+[OBJECTS]
+Skripte fr Media-Ordnerõ,õ <SKRIPTS_CWMediaFolder>õ,õ CWMenuFolderõ,õ <WPSWIZ_CONFIG>õ,õ CLEARMENUCACHE=1;DEFAULTVIEW=ICON;SHOWALLINTREEVIEW=YES;ICONVIEW=NONFLOWED,MINI;HIDECLASSPAGE=1õ,õ update
+~Audio CD brennenõ,õ <MFLDR_BURNAUD_SHW>õ,õ WPShadowõ,õ <SKRIPTS_CWMediaFolder>õ,õ SHADOWID=%TARGET%\Skripte\~Audio CD brennenõ,õ update
+~Playlist erstellenõ,õ <MFLDR_PLAYLST_SHW>õ,õ WPShadowõ,õ <SKRIPTS_CWMediaFolder>õ,õ SHADOWID=%TARGET%\Skripte\~Playlist erstellenõ,õ update
+~Spielzeit ermittelnõ,õ <MFLDR_PLAYTIME_SHW>õ,õ WPShadowõ,õ <SKRIPTS_CWMediaFolder>õ,õ SHADOWID=%TARGET%\Skripte\~Spielzeit ermittelnõ,õ update
+~M3U-Playlist erstellenõ,õ <MFLDR_PLAYLSTM3U_SHW>õ,õ WPShadowõ,õ<SKRIPTS_CWMediaFolder>õ,õ SHADOWID=%TARGET%\Skripte\~M3U-Playlist erstellenõ,õ update
+Benutzer Men Media-Ordnerõ,õ <USERMENU_MEDIAFOLDER>õ,õ CWMenuFolderõ,õ <WPSWIZ_CONFIG>õ,õ CLEARMENUCACHE=1;DEFAULTVIEW=ICON;SHOWALLINTREEVIEW=YES;ICONVIEW=NONFLOWED,MINI;HIDECLASSPAGE=1õ,õ update
+Men Konfigurationõ,õ <MFLDR_MENUCONFIG_SHW>õ,õ WPShadowõ,õ <USERMENU_MEDIAFOLDER>õ,õ SHADOWID=<WPSWIZ_CONFIG>õ,õ update
+Skripte fr M3U-Listenõ,õ <SKRIPTS_CWM3UFolder>õ,õ CWMenuFolderõ,õ <WPSWIZ_CONFIG>õ,õ CLEARMENUCACHE=1;DEFAULTVIEW=ICON;SHOWALLINTREEVIEW=YES;ICONVIEW=NONFLOWED,MINI;HIDECLASSPAGE=1õ,õ update
+~Audio CD brennenõ,õ <M3UFLDR_BURNAUD_SHW>õ,õ WPShadowõ,õ <SKRIPTS_CWM3UFolder>õ,õ SHADOWID=%TARGET%\Skripte\~Audio CD brennenõ,õ update
+
+[SKRIPTS]
+BEFOREINST õ,õ /* berprfung ob WPS-Wizard installiert ist */;call RxFuncAdd 'SysLoadFuncs', 'RexxUtil', 'SysLoadFuncs';call SysLoadFuncs;ret=SysQueryClassList('classes.');found=0;DO cls=1 to classes.0;	theclass=WORD(classes.cls, 1);	thePath=SUBWORD(classes.cls, 2);	IF TRANSLATE(theClass)='CWMENUFOLDER' THEN DO;		found=1	;		LEAVE;	END;END;;RC=0;IF found=0 THEN DO;		usrdata._mBTitle="Media Skripte Installation";		usrData._mBCBTxt="";		usrdata._mBTxt='WPS-Wizard ist nicht installiert. ';		usrdata._mBTxt=usrdata._mBTxt||'Dieses Paket in der Version V0.2.0 oder hher ist erforderlich, um Skripte ';		usrdata._mBTxt=usrdata._mBTxt||'ausfhren zu knnen.'||'0d'x;		usrdata._mBTxt=usrdata._mBTxt||'Es ist erhltlich unter'||'0d'x||'0d'x;		usrdata._mBTxt=usrdata._mBTxt||'http://www.os2world.com/cdwriting/'||'0d'x||'0d'x;		usrdata._mBTxt=usrdata._mBTxt||'Dieses Skripte-Paket kann nicht installiert werden.'||'0d'x;		usrData._mBType="OK";		call beep 1000, 100;		ret=ModalFor('usermsgBox');		RC=1;END;;
+
+[INSTALLPROFILES]
+MFLDRSCR õ,õ Media-Ordner REXX-Skripte õ,õ Installation zustzlicher Skripte, um die Erstellung von Playlisten und Audio-CDs zu erleichtern. Diese Skripte sind ber die Menleiste des Media-Ordners erreichbar. WPS-Wizard V0.2.0 muá fr die Nutzung dieses Paketes installiert sein.
+
+[MFLDRSCR]
+MFLDRSCR, , ,S,[ ], mfldrscr.in_
+
+[DEFAULTTARGET]
+PATH %APPS%\CWMMOS2\MediaFld
+
+
Index: /tags/CWMM-0.3.0_GA/mediafolder/Skripte_ger/~Audio CD brennen
===================================================================
--- /tags/CWMM-0.3.0_GA/mediafolder/Skripte_ger/~Audio CD brennen	(revision 213)
+++ /tags/CWMM-0.3.0_GA/mediafolder/Skripte_ger/~Audio CD brennen	(revision 213)
@@ -0,0 +1,141 @@
+/****************************************/
+/*                                      */
+/* Burn selected tracks as an audio CD. */
+/* Audio-CD-Creator must be installed.  */
+/*                                      */
+/* An audio folder will be created and  */
+/* the selected tracks inserted.        */
+/*                                      */
+/****************************************/
+/* Load Rexxutil functions */
+call RxFuncAdd 'SysLoadFuncs', 'RexxUtil', 'SysLoadFuncs'
+call SysLoadFuncs
+
+QC_FIRST=0
+QC_NEXT=1
+QC_LAST=2
+
+/* Check if we are executing */
+if ARG(1)\='/EXECUTE' THEN EXIT
+
+/* Check if Audio-CD-Creator is installed */
+
+list.0=0
+found=0
+rc=SysQueryClassList(list.)
+DO a=1 to list.0
+	if TRANSLATE(WORD(list.a,1))='CWAUDIOFOLDER' THEN DO
+		found=1
+		LEAVE
+	END
+END
+
+IF found=0 THEN DO
+	theString="Audio-CD-Creator ist nicht installiert. Das CD-Creator Paket ist Voraussetzung fr die Nutzung dieser Funktion."
+	theString=theString||'0d'X||'0d'X
+	theString=theString||'Es ist erhltlich unter http://www.os2world.com/cdwriting'||'0d'X||'  '
+	rc=RxMessageBox(theString, "",'OK', "Information")
+	EXIT
+END
+
+/* The media folder running this skript */
+mFldr=ARG(2)
+/* And the frame handle */
+frameHandle=ARG(3)
+
+/*Get the container handle */
+container=WPSWizCallWinFunc( "winQueryContainerHWND", frameHandle)
+
+if container=0 THEN DO
+    rc=RxMessageBox("Container-Handle kann nicht ermittlet werden!", "",'OK', "Information")
+     EXIT
+END
+
+pRec=WPSWizCallWinFunc( "winQueryContRecEmphasis", container, 16 , 1)
+
+a=0
+tracks.0=0
+DO WHILE (pRec\=0 & pRec\=-1)
+	/* Get object pointer */
+	obj=WPSWizCallWinFunc( "winObjectFromPRec", pRec)
+	/* Follow shadows to file system object */
+	obj=MFldrCallFunc( "cwGetFileSystemObject", mFldr, obj)
+	/* Check if it's an audio object */
+	IF MFldrCallFunc( "cwIsA", obj, "CWAudio")\=0 THEN DO
+	        a=a+1
+		tracks.a._obj=obj
+	END
+	pRec=WPSWizCallWinFunc( "winQueryContRecEmphasis", container, pRec , 1)
+	tracks.0=a
+END
+
+if tracks.0=0 THEN DO
+	rc=RxMessageBox("Keine Audio-Dateien ausgewhlt.", "Information",'OK')
+	EXIT
+END
+
+/* Try to find the desktop folder */
+
+/* Get the persistent object handle */
+hObject=WPSWizCallWinFunc( "winQueryObject" ,"<WP_DESKTOP>")
+
+if hObject\=0 THEN DO
+	/* Get the class object of the given object pointer */
+	classObject=WPSWizCallWPSFunc("somGetClass",mFldr)
+
+	/* Get the object pointer from the handle */
+	theObject=WPSWizCallWPSClsFunc("wpclsQueryObject", classObject, hObject)
+
+	/* Query the full path of the object */
+	desktop=WPSWizCallFunc("cwQueryRealName", theObject, 1)
+
+	/* The object was locked because of "wpclsQueryObject" */
+	rc=WPSWizCallWPSFunc("wpUnlockObject", theObject)
+END
+
+if desktop\='' THEN
+    desktop=desktop||'\audioFolder'
+
+/* Get a name for the new folder */
+folderName=WPSWizCallWinFunc( "winFileDlg", 1, "Name fr Audio-CD-Creator Ordner", desktop)
+
+/* No name, so quit */
+if foldername="" THEN exit
+
+/* Check if an error occurred */
+if foldername="ERROR:" THEN DO
+  rc=RxMessageBox("Der Dateidialog gab einen Fehler zurck!", "Error",'OK', "ERROR")
+  EXIT
+END
+
+/* Get the path */
+thePath=FILESPEC('drive',foldername)||FILESPEC('path',foldername)
+thePath=LEFT(thePath,LENGTH(thePath)-1)
+
+/* Create a new audio folder to hold the selected tracks */
+setup=''
+setup='DETAILSCLASS=CWAudioShadow;SORTCLASS=CWAudioShadow;DETAILSTODISPLAY=0,1,4,12,13,14,15,16,17,18,19,20,21;SORTBYATTR=6,24,25,26,27,28,29,30,31,32,33'
+
+newFldr=SysCreateObject("CWAudioFolder", FILESPEC('name',foldername), thePath, setup , 'update')
+
+if newFldr=0 THEN DO
+	/* Folder creation failed */
+	rc=RxMessageBox("Audio-CD Ordner konnte nicht erstellt werden!", "Erstellung Audio-Ordner",'OK')
+	EXIT
+END
+
+
+/* Now create shadows of the selected tracks */
+DO a=tracks.0 to 1 by -1
+	objName=MFldrCallFunc( "cwQueryRealName", tracks.a._obj, 0)
+	/* When using a space as the object title the real name is used as the title. By doing it this
+           way we may have several shadows to the same track in the folder. */
+	rc=SysCreateObject("CWAudioShadow", " ", folderName, "SHADOWID="||MFldrCallFunc( "cwQueryRealName", tracks.a._obj,1),'update')
+END
+/* Open the folder */
+rc=SysSetObjectData(folderName, "OPEN=DEFAULT")
+rc=0
+
+exit
+
+
Index: /tags/CWMM-0.3.0_GA/mediafolder/Skripte_ger/~M3U-Playlist erstellen
===================================================================
--- /tags/CWMM-0.3.0_GA/mediafolder/Skripte_ger/~M3U-Playlist erstellen	(revision 213)
+++ /tags/CWMM-0.3.0_GA/mediafolder/Skripte_ger/~M3U-Playlist erstellen	(revision 213)
@@ -0,0 +1,113 @@
+/* Create an *.m3u playlist from all selected tracks */
+
+/* Load Rexxutil functions */
+call RxFuncAdd 'SysLoadFuncs', 'RexxUtil', 'SysLoadFuncs'
+call SysLoadFuncs
+
+QC_FIRST=0
+QC_NEXT=1
+QC_LAST=2
+
+/* Check if we are executing */
+if ARG(1)\='/EXECUTE' THEN EXIT
+
+/* The media folder running this skript */
+mFldr=ARG(2)
+/* And the frame handle */
+frameHandle=ARG(3)
+
+/*Get the container handle */
+container=WPSWizCallWinFunc( "winQueryContainerHWND", frameHandle)
+
+if container=0 THEN DO
+    rc=RxMessageBox("Container-Handle kann nicht ermittlet werden!", "",'OK', "Information")
+     EXIT
+END
+
+pRec=WPSWizCallWinFunc( "winQueryContRecEmphasis", container, 16 , 1)
+
+a=0
+tracks.0=0
+DO WHILE (pRec\=0 & pRec\=-1)
+	/* Get object pointer */
+	obj=WPSWizCallWinFunc( "winObjectFromPRec", pRec)
+	/* Follow shadows to file system object */
+	obj=MFldrCallFunc( "cwGetFileSystemObject", mFldr, obj)
+	/* Check if it's an audio object */
+	IF MFldrCallFunc( "cwIsA", obj, "CWAudio")\=0 THEN DO
+	        a=a+1
+		tracks.a._obj=obj
+	END
+	pRec=WPSWizCallWinFunc( "winQueryContRecEmphasis", container, pRec , 1)
+	tracks.0=a
+END
+
+if tracks.0=0 THEN DO
+	rc=RxMessageBox("Keine Audio-Dateien ausgewhlt.", "Information",'OK')
+	EXIT
+END
+
+/* Try to find the desktop folder */
+
+/* Get the persistent object handle */
+hObject=WPSWizCallWinFunc( "winQueryObject" ,"<WP_DESKTOP>")
+
+if hObject\=0 THEN DO
+	/* Get the class object of the given object pointer */
+	classObject=WPSWizCallWPSFunc("somGetClass",mFldr)
+
+	/* Get the object pointer from the handle */
+	theObject=WPSWizCallWPSClsFunc("wpclsQueryObject", classObject, hObject)
+
+	/* Query the full path of the object */
+	desktop=WPSWizCallFunc("cwQueryRealName", theObject, 1)
+
+	/* The object was locked because of "wpclsQueryObject" */
+	rc=WPSWizCallWPSFunc("wpUnlockObject", theObject)
+END
+
+if desktop\='' THEN
+    desktop=desktop||'\new.m3u'
+
+filedlg:
+
+/* Get a name for the new folder from the user */
+theName=WPSWizCallWinFunc( "winFileDlg", 1, "Name for play list", desktop)
+
+/* No name, so quit */
+if thename="" THEN exit
+
+/* Check if an error occurred */
+if thename="ERROR:" THEN DO
+  rc=RxMessageBox("Der Dateidialog gab einen Fehler zurck!", "Error",'OK', "ERROR")
+  EXIT
+END
+
+/* Check if file exists */
+IF STREAM(theName, 'C', 'query exists')=theName THEN DO
+
+  rc=RxMessageBox("Di Playlist existiert bereits. Die ausgewhlten Stcke an den Inhalt anhngen?", "M3U-Playlist erstellen",'YESNO', "QUESTION")
+IF rc=7 then signal filedlg
+END
+
+/* Get the path */
+thePath=FILESPEC('drive', thename)||FILESPEC('path', thename)
+thePath=LEFT(thePath,LENGTH(thePath)-1)
+
+
+/* Now put names into the playlist file */
+DO a=1 to tracks.0
+	objName=MFldrCallFunc( "cwQueryRealName", tracks.a._obj, 1)
+call lineout thename, objname
+END
+
+call stream thename, 'C', 'close'
+
+/* Open the folder */
+rc=SysSetObjectData(theName, "OPEN=DEFAULT")
+
+rc=0
+
+exit
+
+
Index: /tags/CWMM-0.3.0_GA/mediafolder/Skripte_ger/~Playlist erstellen
===================================================================
--- /tags/CWMM-0.3.0_GA/mediafolder/Skripte_ger/~Playlist erstellen	(revision 213)
+++ /tags/CWMM-0.3.0_GA/mediafolder/Skripte_ger/~Playlist erstellen	(revision 213)
@@ -0,0 +1,110 @@
+/* Create a playlist from all selected tracks */
+
+/* Load Rexxutil functions */
+call RxFuncAdd 'SysLoadFuncs', 'RexxUtil', 'SysLoadFuncs'
+call SysLoadFuncs
+
+QC_FIRST=0
+QC_NEXT=1
+QC_LAST=2
+
+/* Check if we are executing */
+if ARG(1)\='/EXECUTE' THEN EXIT
+
+/* The media folder running this skript */
+mFldr=ARG(2)
+/* And the frame handle */
+frameHandle=ARG(3)
+
+/*Get the container handle */
+container=WPSWizCallWinFunc( "winQueryContainerHWND", frameHandle)
+
+if container=0 THEN DO
+    rc=RxMessageBox("Container-Handle kann nicht ermittlet werden!", "",'OK', "Information")
+     EXIT
+END
+
+pRec=WPSWizCallWinFunc( "winQueryContRecEmphasis", container, 16 , 1)
+
+a=0
+tracks.0=0
+DO WHILE (pRec\=0 & pRec\=-1)
+	/* Get object pointer */
+	obj=WPSWizCallWinFunc( "winObjectFromPRec", pRec)
+	/* Follow shadows to file system object */
+	obj=MFldrCallFunc( "cwGetFileSystemObject", mFldr, obj)
+	/* Check if it's an audio object */
+	IF MFldrCallFunc( "cwIsA", obj, "CWAudio")\=0 THEN DO
+	        a=a+1
+		tracks.a._obj=obj
+	END
+	pRec=WPSWizCallWinFunc( "winQueryContRecEmphasis", container, pRec , 1)
+	tracks.0=a
+END
+
+if tracks.0=0 THEN DO
+	rc=RxMessageBox("Keine Audio-Dateien ausgewhlt.", "Information",'OK')
+	EXIT
+END
+
+/* Try to find the desktop folder */
+
+/* Get the persistent object handle */
+hObject=WPSWizCallWinFunc( "winQueryObject" ,"<WP_DESKTOP>")
+
+if hObject\=0 THEN DO
+	/* Get the class object of the given object pointer */
+	classObject=WPSWizCallWPSFunc("somGetClass",mFldr)
+
+	/* Get the object pointer from the handle */
+	theObject=WPSWizCallWPSClsFunc("wpclsQueryObject", classObject, hObject)
+
+	/* Query the full path of the object */
+	desktop=WPSWizCallFunc("cwQueryRealName", theObject, 1)
+
+	/* The object was locked because of "wpclsQueryObject" */
+	rc=WPSWizCallWPSFunc("wpUnlockObject", theObject)
+END
+
+if desktop\='' THEN
+    desktop=desktop||'\newFolder'
+
+/* Get a name for the new folder from the user */
+folderName=WPSWizCallWinFunc( "winFileDlg", 1, "Name fr Playlist-Ordner", desktop)
+
+/* No name, so quit */
+if foldername="" THEN exit
+
+/* Check if an error occurred */
+if foldername="ERROR:" THEN DO
+  rc=RxMessageBox("Der Dateidialog gab einen Fehler zurck!", "Error",'OK', "ERROR")
+  EXIT
+END
+
+/* Get the path */
+thePath=FILESPEC('drive',foldername)||FILESPEC('path',foldername)
+thePath=LEFT(thePath,LENGTH(thePath)-1)
+
+/* Create a new media folder to hold the selected tracks */
+setup='DETAILSTODISPLAY=0,1,4,12,13,14,15,16,17,18,19,20,21;SORTBYATTR=6,24,25,26,27,28,29,30,31,32,33;DETAILSCLASS=CWAudioShadow;MEDIAFLDRVOLUME=70;SORTCLASS=CWAudioShadow;DEFAULTVIEW=DETAILS;'
+newFldr=SysCreateObject("CWMediaFolder", FILESPEC('name',foldername), thePath, setup , 'update')
+
+if newFldr=0 THEN DO
+	/* Folder creation failed */
+	rc=RxMessageBox("Media-Ordner konnte nicht erstellt werden!", "Erstellung Media-Ordner",'OK')
+	EXIT
+END
+
+
+/* Now create shadows of the selected tracks */
+DO a=tracks.0 to 1 by -1
+	objName=MFldrCallFunc( "cwQueryRealName", tracks.a._obj, 0)
+	rc=SysCreateObject("CWAudioShadow",objName, folderName, "SHADOWID="||MFldrCallFunc( "cwQueryRealName", tracks.a._obj,1),'update')
+END
+/* Open the folder */
+rc=SysSetObjectData(folderName, "OPEN=DEFAULT")
+rc=0
+
+exit
+
+
Index: /tags/CWMM-0.3.0_GA/mediafolder/Skripte_ger/~Spielzeit ermitteln
===================================================================
--- /tags/CWMM-0.3.0_GA/mediafolder/Skripte_ger/~Spielzeit ermitteln	(revision 213)
+++ /tags/CWMM-0.3.0_GA/mediafolder/Skripte_ger/~Spielzeit ermitteln	(revision 213)
@@ -0,0 +1,68 @@
+/* Calculate the playtime of all selected tracks */
+
+/* Load Rexxutil functions */
+call RxFuncAdd 'SysLoadFuncs', 'RexxUtil', 'SysLoadFuncs'
+call SysLoadFuncs
+
+QC_FIRST=0
+QC_NEXT=1
+QC_LAST=2
+
+/* Check if we are executing */
+if ARG(1)\='/EXECUTE' THEN EXIT
+
+/* The media folder running this skript */
+mFldr=ARG(2)
+/* And the frame handle */
+frameHandle=ARG(3)
+
+/*Get the container handle */
+container=WPSWizCallWinFunc( "winQueryContainerHWND", frameHandle)
+
+if container=0 THEN DO
+    rc=RxMessageBox("Container-Handle kann nicht ermittlet werden!", "",'OK', "Information")
+     EXIT
+END
+
+pRec=WPSWizCallWinFunc( "winQueryContRecEmphasis", container, 16 , 1)
+
+a=0
+tracks.0=0
+DO WHILE (pRec\=0 & pRec\=-1)
+	/* Get object pointer */
+	obj=WPSWizCallWinFunc( "winObjectFromPRec", pRec)
+	/* Follow shadows to file system object */
+	obj=MFldrCallFunc( "cwGetFileSystemObject", mFldr, obj)
+	/* Check if it's an audio object */
+	IF MFldrCallFunc( "cwIsA", obj, "CWAudio")\=0 THEN DO
+	        a=a+1
+		tracks.a._obj=obj
+	END
+	pRec=WPSWizCallWinFunc( "winQueryContRecEmphasis", container, pRec , 1)
+	tracks.0=a
+END
+
+if tracks.0=0 THEN DO
+	rc=RxMessageBox("Keine Audio-Dateien ausgewhlt.", "Information",'OK')
+	EXIT
+END
+
+playTime=0
+/* Now calculate play time */
+DO a=tracks.0 to 1 by -1
+tempTime=0
+	tempTime=MMClsCallFunc( "cwmmQueryTrackInfo", tracks.a._obj, 7)
+	if tempTime\= 'ERROR:' THEN DO
+		playTime=playTime+tempTime	
+	END
+END
+theString='Spielzeit aller ausgewhlten Dateien ist:  '
+secs=RIGHT('00'||playTime//60 ,2)
+theString=theString||playTime%60||':'||secs||' min'||'0d'X||'0d'X
+theString=theString||'Anzahl ausgewhlte Dateien: '||tracks.0||'0d'X||'  '
+rc=RxMessageBox(theString, "Information",'OK')
+
+RC=0
+exit
+
+
Index: /tags/CWMM-0.3.0_GA/mediafolder/beep.cmd
===================================================================
--- /tags/CWMM-0.3.0_GA/mediafolder/beep.cmd	(revision 213)
+++ /tags/CWMM-0.3.0_GA/mediafolder/beep.cmd	(revision 213)
@@ -0,0 +1,84 @@
+/* rexx -  Change the details and sort class
+   of a folder to use MMAudio instead of WPFileSystem */
+
+call RxFuncAdd 'SysLoadFuncs', 'RexxUtil', 'SysLoadFuncs'
+call SysLoadFuncs
+
+
+call beep 1000, 20
+call beep 2000, 20
+call beep 3000, 20
+
+EXIT "ert ";
+
+
+theString=ARG(1)||' !! '||ARG(2)||' !! '||ARG(3)||' !! '||ARG(4)
+
+/*call RxMessageBox ARG(3)*/
+
+SELECT
+
+WHEN ARG(1)="/FILTERPOPUP" THEN DO
+	PARSE VALUE ARG(3) WITH ulrc rest 
+	EXIT (ulrc)
+END
+WHEN ARG(1)="/MODIFYPOPUP" THEN DO
+	PARSE VALUE ARG(3) WITH ulrc rest 
+	EXIT (ulrc)
+END
+WHEN ARG(1)="/MENUITEMSELECTED" THEN DO
+	PARSE VALUE ARG(3) WITH hwndFrame ulMenuId 
+	/* Return 1 if you handle this menu item */
+	EXIT (0)
+END
+
+OTHERWISE
+	return 0
+END
+
+/*call RxMessageBox theString*/
+rc=12340
+EXIT 1234
+
+theFilepath=ARG(1)
+theFolderPath=ARG(2)
+
+a=0
+DO WHILE lines(theFilePath)
+	theLine=STRIP(LINEIN(theFilePath))
+	if checkTheLine()=1 THEN DO
+		a=a+1
+		theTracks.a._name=theLine
+	END
+END
+theTracks.0=a
+call stream thefilepath, 'C','close'
+
+DO a=theTracks.0 to 1 by -1
+	rc=SysCreateObject(CWAudioShadow, " ", theFolderPath,"SHADOWID="theTracks.a._name)
+END
+
+rc=0
+EXIT
+
+
+checkTheLine:
+
+if LENGTH(theLine)=0 then 
+	return 0; /* Empty line */
+
+if SUBSTR(theLine, 1, 1)='#' then 
+	return 0; /* Comment */
+
+if SUBSTR(theLine, 2, 1)\=':' THEN DO
+	/* relative path. Prepend path of M3U file */
+	if SUBSTR(theLine, 1, 1)\='\' THEN Do
+		theLine=FILESPEC('drive', theFilePath)||FILESPEC('path', theFilePath)||theLine
+	END
+	ELSE
+		theLine=FILESPEC('drive', theFilePath)||FILESPEC('path', theFilePath)||SUBSTR(theLine,2)
+
+END
+return 1;
+
+
Index: /tags/CWMM-0.3.0_GA/mediafolder/bin/FLDTree.cmd
===================================================================
--- /tags/CWMM-0.3.0_GA/mediafolder/bin/FLDTree.cmd	(revision 213)
+++ /tags/CWMM-0.3.0_GA/mediafolder/bin/FLDTree.cmd	(revision 213)
@@ -0,0 +1,114 @@
+/*
+Create folder tree with playlists for all MP3 and OGG
+files in a given directory and its subdirectories.
+
+Requires the MMClasses from Chris Wohlgemuth.
+
+Copyright (c) 2002 Eirik Oeverby (ltning@anduin.net)
+This software is provided AS IS without any warranties
+whatsoever. You are free to modify and distribute this
+software in any way, shape or form, as long as the
+author is given credit. If no significant parts of the
+original code remains after modification, credit needs
+not be given, but would be appreciated.
+********************************************************/
+/*
+
+Slightly modified by Chris Wohlgemuth so that folders without
+MP3s and OGGs are created as normal folders and folder names with
+spaces are accepted.
+
+*/
+
+call RxFuncAdd 'SysLoadFuncs', 'rexxutil', 'SysLoadFuncs'
+call SysLoadFuncs
+
+/* Handle filenames with spaces */
+IF POS('"', arg(1))=0 THEN
+	parse VALUE arg(1) WITH src_dir dest_dir
+ELSE
+	parse VALUE arg(1) WITH '"'src_dir'"' '"'dest_dir'"'
+
+/*!!!!!!! Set your desktop here !!!!!!!!!!!!!*/
+
+DESKTOP_DIR='D:\Arbeitsoberflaeche'
+
+/* Check parameters and print usage information */
+if src_dir='' | dest_dir='' then do
+PARSE source . . theFile
+say 'Usage:'
+say FILESPEC('name', theFile)' <source> <target>'
+say
+say 'Where:'
+say '<source> = Directory to scan for MP3/OGG files'
+say '<target> = Target folder in which to create the tree.'
+say
+say '<target> is a folder that will be created on your desktop. It will be created'
+say 'if it does not exist, and its default view will be a tree view.'
+say
+say 'If <source> or <target> contain spaces then BOTH filenames have to be put'
+say 'between quotation marks!'
+
+exit
+end
+
+/* Create target folder */
+dest_loc=DESKTOP_DIR
+      rc=SySFileTree(src_dir'\*.mp3', 'mp3s', 'FO')
+      rc=SySFileTree(src_dir'\*.ogg', 'OGGs', 'FO')
+      IF mp3s.0==0 & oggs.0==0 THEN
+	rc=SysCreateObject("WPFolder", dest_dir, "<WP_DESKTOP>", "OBJECTID=<PLST_"||dest_dir||">;DEFAULTVIEW=TREE", 'update')
+      ELSE
+	      rc=SysCreateObject("CWMediaFolder", dest_dir, "<WP_DESKTOP>", "OBJECTID=<PLST_"||dest_dir||"_"||i||">;DEFAULTVIEW=DETAILS;DETAILSCLASS=CWAudioShadow;SORTCLASS=CWAudioShadow;SORTBYATTR=6;DEFAULTSORT=-2;ALWAYSSORT=YES;", 'update')
+
+if rc<>1 then do
+      say "Object creation/update failed!"
+      exit
+end
+
+say "Searching for directories, please wait..."
+rc=SySFileTree(src_dir'\', 'dirs', 'DSO')
+
+say "Creating folder tree..."
+do i=1 to dirs.0
+loc=dirs.i
+loc=right(loc, length(loc)-length(src_dir)-1)
+if loc<>'' then do
+      loc=reverse(loc)
+      parse var loc rest'\'base
+      base=reverse(base)
+      rest=reverse(rest)
+      target=dest_loc||"\"||dest_dir||"\"||base
+      target=strip(target, 't', '\')
+      say "Creating media folder "||rest
+      /* Check if directory contains MP3 or OGG. If not create normal folder */
+      rc=SySFileTree(dirs.i'\*.mp3', 'mp3s', 'FO')
+      rc=SySFileTree(dirs.i'\*.ogg', 'OGGs', 'FO')
+      IF mp3s.0==0 & oggs.0==0 THEN
+	      rc=SysCreateObject("WPFolder", rest, target, "OBJECTID=<PLST_"||dest_dir||"_"||i||">;DEFAULTVIEW=DETAILS;DETAILSCLASS=CWAudioShadow;SORTCLASS=CWAudioShadow;SORTBYATTR=6;DEFAULTSORT=-2;ALWAYSSORT=YES;", 'update')
+      ELSE
+	      rc=SysCreateObject("CWMediaFolder", rest, target, "OBJECTID=<PLST_"||dest_dir||"_"||i||">;DEFAULTVIEW=DETAILS;DETAILSCLASS=CWAudioShadow;SORTCLASS=CWAudioShadow;SORTBYATTR=6;DEFAULTSORT=-2;ALWAYSSORT=YES;", 'update')
+end
+   /* fname=filespec('name', files_mp3.i) */
+end
+
+say "Searching for music files, please wait..."
+rc=SysFileTree(src_dir||'\*.mp3', 'files', 'FSO')
+call create_shadows
+rc=SysFileTree(src_dir||'\*.ogg', 'files', 'FSO')
+call create_shadows
+
+exit
+
+create_shadows:
+do i=1 to files.0
+     loc=files.i
+     loc=right(loc, length(loc)-length(src_dir)-1)
+     target=dest_loc||"\"||dest_dir||"\"||filespec('path', loc)
+     target=strip(target, 't', '\')
+     fname=filespec('name', loc)
+     say "Creating shadow for "||fname
+     rc=SysCreateObject("CWAudioShadow", fname, target, "SHADOWID="||files.i, 'update')
+end
+return
+
Index: /tags/CWMM-0.3.0_GA/mediafolder/bin/Readme.txt
===================================================================
--- /tags/CWMM-0.3.0_GA/mediafolder/bin/Readme.txt	(revision 213)
+++ /tags/CWMM-0.3.0_GA/mediafolder/bin/Readme.txt	(revision 213)
@@ -0,0 +1,3 @@
+cp is case sensitive. Be sure to have alway a *.cmd extension
+in lower cases.
+
Index: /tags/CWMM-0.3.0_GA/mediafolder/bin/creatobj.cmd
===================================================================
--- /tags/CWMM-0.3.0_GA/mediafolder/bin/creatobj.cmd	(revision 213)
+++ /tags/CWMM-0.3.0_GA/mediafolder/bin/creatobj.cmd	(revision 213)
@@ -0,0 +1,48 @@
+/* This script creates the CD player objects in the
+   multimedia folder.
+
+   This script is part of the media folder package.
+
+   (c) Chris Wohlgemuth 2002-2004
+
+   http://www.os2world.com/cdwriting
+   http://www.geocities.com/SiliconValley/Sector/5785/
+
+ */
+
+ call RxFuncAdd 'SysLoadFuncs', 'RexxUtil', 'SysLoadFuncs'
+ call SysLoadFuncs
+
+PARSE source . . thePath
+rc=SysSleep(2)
+
+ADDRESS CMD FILESPEC('drive', thePath)||FILESPEC('path', thePath)'createcd.exe'
+
+
+/* berprfung ob WPS-Wizard installiert ist und Ergnzung
+    fehlender Strings.
+ */
+
+ret=SysQueryClassList('classes.')
+found=0
+DO cls=1 to classes.0
+	theclass=WORD(classes.cls, 1)
+	thePath=SUBWORD(classes.cls, 2);
+	IF TRANSLATE(theClass)='CWMENUFOLDER' THEN DO;
+		found=1	;
+		LEAVE;
+	END;
+END;
+IF found=1 THEN DO
+	iniPath=FILESPEC( 'drive', thePath)||FILESPEC( 'path', thePath)||'help\OBJHINTS.INI'
+	if SysIni(iniPath, "nls", "convert")="ERROR:" THEN
+		SysIni(iniPath, "nls", "convert", "Convert...")
+	if SysIni(iniPath, "nls", "mvolume")="ERROR:" THEN
+		SysIni(iniPath, "nls", "mvolume", "Master volume...")
+
+END
+
+exit
+
+
+
Index: /tags/CWMM-0.3.0_GA/mediafolder/bin/insTrack.rx
===================================================================
--- /tags/CWMM-0.3.0_GA/mediafolder/bin/insTrack.rx	(revision 213)
+++ /tags/CWMM-0.3.0_GA/mediafolder/bin/insTrack.rx	(revision 213)
@@ -0,0 +1,62 @@
+/* rexx -  Parse the contents of an M3U file
+   and insert for every trackname a CWAudioShadow
+   in the given folder.
+
+   This script is part of the media folder package.
+
+   (c) Chris Wohlgemuth 2002-2003
+
+   http://www.os2world.com/cdwriting
+   http://www.geocities.com/SiliconValley/Sector/5785/
+
+ */
+
+call RxFuncAdd 'SysLoadFuncs', 'RexxUtil', 'SysLoadFuncs'
+call SysLoadFuncs
+
+
+theFilepath=ARG(1)
+theFolderPath=ARG(2)
+
+a=0
+DO WHILE lines(theFilePath)
+	theLine=STRIP(LINEIN(theFilePath))
+	if checkTheLine()=1 THEN DO
+		a=a+1
+		theTracks.a._name=theLine
+	END
+END
+theTracks.0=a
+call stream thefilepath, 'C','close'
+
+DO a=theTracks.0 to 1 by -1
+	rc=SysCreateObject(CWAudioShadow, " ", theFolderPath,"SHADOWID="theTracks.a._name)
+END
+
+rc=0
+EXIT
+
+
+checkTheLine:
+
+if LENGTH(theLine)=0 then 
+	return 0; /* Empty line */
+
+if SUBSTR(theLine, 1, 1)='#' then 
+	return 0; /* Comment */
+
+if SUBSTR(theLine, 2, 1)\=':' THEN DO
+	/* relative path. Prepend path of M3U file */
+	if SUBSTR(theLine, 1, 1)\='\' &  SUBSTR(theLine, 1, 1)\='/' THEN DO
+		theLine=FILESPEC('drive', theFilePath)||FILESPEC('path', theFilePath)||theLine
+	END
+	ELSE
+		theLine=FILESPEC('drive', theFilePath)||FILESPEC('path', theFilePath)||SUBSTR(theLine,2)
+
+END
+/* Rockbox for the ArchosJukebox uses '/' as path separators in M3U lists.
+   Change them to backslashes */
+theLine=TRANSLATE(theLine, '\', '/')
+return 1;
+
+
Index: /tags/CWMM-0.3.0_GA/mediafolder/bin/insTrk2.rx
===================================================================
--- /tags/CWMM-0.3.0_GA/mediafolder/bin/insTrk2.rx	(revision 213)
+++ /tags/CWMM-0.3.0_GA/mediafolder/bin/insTrk2.rx	(revision 213)
@@ -0,0 +1,64 @@
+/* rexx -  Parse the contents of an M3U file
+   and insert for every trackname a CWAudioShadow
+   in the given media folder. After doing that start
+   playing.
+
+   This script is part of the media folder package.
+
+   (c) Chris Wohlgemuth 2002-2003
+
+   http://www.os2world.com/cdwriting
+   http://www.geocities.com/SiliconValley/Sector/5785/
+
+ */
+
+call RxFuncAdd 'SysLoadFuncs', 'RexxUtil', 'SysLoadFuncs'
+call SysLoadFuncs
+
+
+theFilepath=ARG(1)
+theFolderPath=ARG(2)
+
+a=0
+DO WHILE lines(theFilePath)
+	theLine=STRIP(LINEIN(theFilePath))
+	if checkTheLine()=1 THEN DO
+		a=a+1
+		theTracks.a._name=theLine
+	END
+END
+theTracks.0=a
+call stream thefilepath, 'C','close'
+
+DO a=theTracks.0 to 1 by -1
+	rc=SysCreateObject(CWAudioShadow, " ", theFolderPath,"SHADOWID="theTracks.a._name)
+END
+	rc=SysSetObjectData(theFolderPath,"MEDIAFLDRPLAYFIRST=1")
+
+rc=0
+EXIT
+
+
+checkTheLine:
+
+if LENGTH(theLine)=0 then 
+	return 0; /* Empty line */
+
+if SUBSTR(theLine, 1, 1)='#' then 
+	return 0; /* Comment */
+
+if SUBSTR(theLine, 2, 1)\=':' THEN DO
+	/* relative path. Prepend path of M3U file */
+	if SUBSTR(theLine, 1, 1)\='\' &  SUBSTR(theLine, 1, 1)\='/' THEN DO
+		theLine=FILESPEC('drive', theFilePath)||FILESPEC('path', theFilePath)||theLine
+	END
+	ELSE
+		theLine=FILESPEC('drive', theFilePath)||FILESPEC('path', theFilePath)||SUBSTR(theLine,2)
+
+END
+/* Rockbox for the ArchosJukebox uses '/' as path separators in M3U lists.
+   Change them to backslashes */
+theLine=TRANSLATE(theLine, '\', '/')
+return 1;
+
+
Index: /tags/CWMM-0.3.0_GA/mediafolder/bin/setFolder.cmd
===================================================================
--- /tags/CWMM-0.3.0_GA/mediafolder/bin/setFolder.cmd	(revision 213)
+++ /tags/CWMM-0.3.0_GA/mediafolder/bin/setFolder.cmd	(revision 213)
@@ -0,0 +1,31 @@
+/* rexx -  Change the details and sort class
+   of a folder to use MMAudio instead of WPFileSystem
+
+   This script is part of the media folder package.
+
+   (c) Chris Wohlgemuth 2002-2003
+
+   http://www.os2world.com/cdwriting
+   http://www.geocities.com/SiliconValley/Sector/5785/
+
+ */
+
+call RxFuncAdd 'SysLoadFuncs', 'RexxUtil', 'SysLoadFuncs'
+call SysLoadFuncs
+
+theFolder=ARG(1)
+theFolder=STRIP(TRANSLATE(theFolder,' ','"'))
+SAY theFolder
+
+rc=SysSetObjectData(theFolder,'DETAILSCLASS=MMAudio;SORTCLASS=MMAudio')
+IF rc=0 THEN DO
+	SAY 'Cannot set the details and sort class.'
+	'@PAUSE'
+	EXIT
+END
+
+SAY 'Detailsclass and sort class for folder changed.'
+'@PAUSE'
+EXIT
+
+
Index: /tags/CWMM-0.3.0_GA/mediafolder/bin/setShadow.cmd
===================================================================
--- /tags/CWMM-0.3.0_GA/mediafolder/bin/setShadow.cmd	(revision 213)
+++ /tags/CWMM-0.3.0_GA/mediafolder/bin/setShadow.cmd	(revision 213)
@@ -0,0 +1,64 @@
+/* rexx
+
+   This script is part of the media folder package.
+
+   (c) Chris Wohlgemuth 2002-2003
+
+   http://www.os2world.com/cdwriting
+   http://www.geocities.com/SiliconValley/Sector/5785/
+
+*/
+
+call RxFuncAdd 'SysLoadFuncs', 'RexxUtil', 'SysLoadFuncs'
+call SysLoadFuncs
+
+IF ARG(1)='' THEN DO
+SAY ''
+SAY 'Dieses Skript setzt die Detailklasse auf CWAudioShadow'
+SAY 'Folder auf skript fallen lassen'
+SAY ''
+
+'@PAUSE'
+EXIT
+END
+
+
+/*rc=SysSetObjectData(ARG(1), 'DETAILSCLASS=CWAudioShadow;SORTCLASS=CWAudioShadow;DETAILSTODISPLAY=0,1,4,12,13,14,15,16,17,18,19,20,21;SORTBYATTR=6,24,25,26,27,28,29,30,31,32,33')*/
+
+rc=SysSetObjectData(ARG(1), 'DETAILSCLASS=CWAudioShadow;SORTCLASS=CWAudioShadow;')
+
+IF rc=0 THEN DO
+	SAY 'Fehler beim Erstellen!'
+	'@PAUSE'
+	Exit
+END
+
+'@PAUSE'
+EXIT
+END
+
+/*
+Sort:
+
+Gráe: 6
+
+Details:
+
+0:  Symbol
+1:  Title
+2:  Klasse
+3:  Echter Name
+4:  Gráe
+
+12: Playtime
+13: Samplerate
+14: Channels
+15: BPS
+16: Title
+17: Artist
+18: Album
+19: Year
+20: Comment
+21: Genre
+*/
+
Index: /tags/CWMM-0.3.0_GA/mediafolder/bin/trknames.cmd
===================================================================
--- /tags/CWMM-0.3.0_GA/mediafolder/bin/trknames.cmd	(revision 213)
+++ /tags/CWMM-0.3.0_GA/mediafolder/bin/trknames.cmd	(revision 213)
@@ -0,0 +1,120 @@
+/* rexx - This script is called by the FreeDB query program.
+   It sets the info of the CD tracks.
+
+   This script is part of the media folder package.
+
+   (c) Chris Wohlgemuth 2002-2003
+
+   http://www.os2world.com/cdwriting
+   http://www.geocities.com/SiliconValley/Sector/5785/
+
+ */
+
+call RxFuncAdd 'SysLoadFuncs', 'RexxUtil', 'SysLoadFuncs'
+call SysLoadFuncs
+
+/*
+#define SETUP_AUDIOTRACKNAME    "CWAUDIOTRACKNAME"
+#define SETUP_AUDIOARTIST       "CWAUDIOARTIST"
+#define SETUP_AUDIOALBUM        "CWAUDIOALBUM"
+#define SETUP_AUDIOCOMMENT      "CWAUDIOCOMMENT"
+#define SETUP_AUDIOYEAR         "CWAUDIOYEAR"
+#define SETUP_AUDIOGENRE        "CWAUDIOGENRE"
+#define SETUP_AUDIOPLAYTIME     "CWAUDIOPLAYTIME"
+*/
+
+SAY ''
+SAY ''
+SAY ARG(1)
+
+PARSE VALUE ARG(1) WITH drive cddbData theFolder 
+
+drive=STRIP(TRANSLATE(drive,'  ','":'))
+drive=TRANSLATE(drive)
+cddbData=STRIP(TRANSLATE(cddbData,' ','"'))
+theFolder=STRIP(TRANSLATE(theFolder,' ','"'))
+
+rc=checkCddbData(cddbData)
+if rc=0 then exit
+
+SAY 'cddb data found, now processing...'
+SAY ''
+
+/* Seems we have all we need. Start processing the cddb data */
+
+/* Read the cddb data into a stem */
+rc=readCddbData()
+
+disktitle=searchCddbValue("DTITLE=")
+/* Split title and artist */
+thePos=POS('/',disktitle)
+if thePos\=0 THEN DO
+	artist=STRIP(LEFT(disktitle,thePos-1))
+	disktitle=STRIP(substr(disktitle,thePos+1))
+END
+
+SAY 'Album: 'disktitle
+say 'Artist: 'artist
+
+basename='<CDTRACK_'||drive||'_'
+DO a=0 to 98 /* A CD has got 99 tracks max */
+	/* Put cddb info into stem */
+	tracktitle=searchCddbValue("TTITLE"||a)
+ 	if tracktitle='' THEN LEAVE
+	setupstring='CWAUDIOTRACKNAME='||tracktitle||';CWAUDIOARTIST='||artist||';CWAUDIOALBUM='||disktitle
+	rc=SysSetObjectData(basename||a+1||'>',setupstring)
+
+	setupstring='CWAUDIOREFRESH=1'
+	rc=SysSetObjectData(basename||a+1||'>',setupstring) 
+
+END
+
+exit
+
+
+
+/*******************************************************************/
+/* Procedures */
+/*******************************************************************/
+
+/* Search an entry in the cddb data file */
+searchCddbValue: PROCEDURE expose cddb.
+
+parse arg keyword
+
+found=0
+DO i=1 to cddb.0 while found=0
+  if POS(keyword,cddb.i)=1 then found=i
+END
+
+if found<>0 then return SUBSTR(cddb.found,POS('=',cddb.found)+1)
+
+return ''
+
+
+/* Read the cddb data into a compund var */
+readCddbData:
+
+/* Clear var */
+DROP cddb.
+cddb.=""
+cddb.0=0
+
+/* Read the file */
+DO i=cddb.0+1 while lines(cddbdata)<>0
+   cddb.i=LINEIN(cddbdata)
+END
+cddb.0=i-1
+return 0
+
+
+/************************/
+checkCddbData: PROCEDURE
+
+cddbData=ARG(1)
+
+rc=STREAM(cddbData ,'c','query exists')
+if rc\='' then return 1
+return 0
+
+
Index: /tags/CWMM-0.3.0_GA/mediafolder/c/audioshadow/audioshadowoverridenwpclsmethods.cpp
===================================================================
--- /tags/CWMM-0.3.0_GA/mediafolder/c/audioshadow/audioshadowoverridenwpclsmethods.cpp	(revision 213)
+++ /tags/CWMM-0.3.0_GA/mediafolder/c/audioshadow/audioshadowoverridenwpclsmethods.cpp	(revision 213)
@@ -0,0 +1,90 @@
+/*
+ * This file is (C) Chris Wohlgemuth 1999-2002
+ * 
+ * It's part of the Audio/Data-CD-Creator distribution
+ */
+/*
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; see the file COPYING.  If not, write to
+ * the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+
+#define INCL_DOSERRORS
+
+#include "audioshadow.hh"
+//#include "mediafolderres.h"
+
+
+extern HMODULE hResource;
+extern char chrInstallDir[];
+
+/* Overriden function which returns our class name */
+PSZ M_CWAudioShadow::wpclsQueryTitle()
+{
+  return "Audio-Referenz";
+}
+
+ULONG M_CWAudioShadow::wpclsQueryDetailsInfo( PCLASSFIELDINFO* ppClassFieldInfo, PULONG pSize)
+{
+  M_WPObject *mWPObject;// Class object
+  somId mySomId;
+  ULONG rc;
+
+  if((mySomId=somIdFromString(CWAUDIO_CLASS_NAME))!=NULLHANDLE) {
+    mWPObject=(M_WPObject*)SOMClassMgrObject->somClassFromId(mySomId);
+    SOMFree(mySomId);
+    if(somIsObj(mWPObject)) {
+      /* got the class object */
+      return mWPObject->wpclsQueryDetailsInfo(ppClassFieldInfo, pSize);
+    }
+  }
+
+  if((mySomId=somIdFromString("wpclsQueryDetailsInfo"))!=NULLHANDLE) {
+    rc=((somTD_M_WPObject_wpclsQueryDetailsInfo)
+        somParentNumResolve(__ClassObject->somGetPClsMtabs(),
+                            1,
+                            __ClassObject->    
+                            somGetMethodToken(mySomId))                    
+        )(this, ppClassFieldInfo, pSize);
+    SOMFree(mySomId);
+    return rc;
+  }
+  else 
+    return M_WPShadow::wpclsQueryDetailsInfo(ppClassFieldInfo, pSize);
+
+  return 0;
+}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Index: /tags/CWMM-0.3.0_GA/mediafolder/c/audioshadow/audioshadowoverridenwpmethods.cpp
===================================================================
--- /tags/CWMM-0.3.0_GA/mediafolder/c/audioshadow/audioshadowoverridenwpmethods.cpp	(revision 213)
+++ /tags/CWMM-0.3.0_GA/mediafolder/c/audioshadow/audioshadowoverridenwpmethods.cpp	(revision 213)
@@ -0,0 +1,99 @@
+/*
+ * This file is (C) Chris Wohlgemuth 2002-2003
+ * 
+ * It's part of the CW-Multimedia classes distribution
+ */
+/*
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; see the file COPYING.  If not, write to
+ * the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+
+#define INCL_DOSERRORS
+#define INCL_GPIBITMAPS
+
+#include "audioshadow.hh"
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include "mediafolderres.h"
+//#include "mediafolderinc.h"
+
+
+extern HMODULE hResource;
+
+void errorResource();
+ULONG messageBox( char* text, ULONG ulTextID , LONG lSizeText,
+                  char* title, ULONG ulTitleID, LONG lSizeTitle,
+                  HMODULE hResource, HWND hwnd, ULONG ulFlags);
+void getMessage(char* text,ULONG ulID, LONG lSizeText, HMODULE hResource,HWND hwnd);
+
+ULONG CWAudioShadow::wpQueryDetailsData(PVOID* ppDetailsData, PULONG pcp)
+{
+  WPObject *wpObject;
+  M_WPObject *mWPObject;
+  somId mySomId;
+  ULONG rc;
+
+  if((mySomId=somIdFromString(CWAUDIO_CLASS_NAME))!=NULLHANDLE) {
+    mWPObject=(M_WPObject*)SOMClassMgrObject->somClassFromId(mySomId);// Get CWAudio class object
+    SOMFree(mySomId);
+    wpObject=wpQueryShadowedObject(FALSE);//Get linked object
+#if 0
+    if(somIsObj(wpObject)) {
+      if(somResolveByName(wpObject,"wpQueryShadowedObject")){ 
+        /* Yes, it's a shadow. Query the linked object. */
+        DosBeep(5000, 200);
+        //      wpObject=((WPShadow*)wpObject)->wpQueryShadowedObject(FALSE);
+      }
+    }
+#endif
+    if(somIsObj(wpObject)) {
+      if(wpObject->somIsA(mWPObject)) {/* Check if the object is of class CWAudio or descendent */
+        return wpObject->wpQueryDetailsData( ppDetailsData, pcp);
+      }
+    }
+  }
+
+  if((mySomId=somIdFromString("wpQueryDetailsData"))!=NULLHANDLE) {
+    rc=((somTD_WPObject_wpQueryDetailsData)
+        somParentNumResolve(__ClassObject->somGetPClsMtabs(),
+                            1,
+                            __ClassObject->    
+                            somGetMethodToken(mySomId))                    
+        )(this, ppDetailsData, pcp);
+    SOMFree(mySomId);
+    return rc;
+  }
+  else 
+    return WPShadow::wpQueryDetailsData(ppDetailsData, pcp);
+
+}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Index: /tags/CWMM-0.3.0_GA/mediafolder/c/audioshadow/makefile
===================================================================
--- /tags/CWMM-0.3.0_GA/mediafolder/c/audioshadow/makefile	(revision 213)
+++ /tags/CWMM-0.3.0_GA/mediafolder/c/audioshadow/makefile	(revision 213)
@@ -0,0 +1,40 @@
+# Makefile for Audio-CD-Creator Data-CD-Creator
+
+#include ../../../make.inc
+
+
+CC           = icc
+#CPPFLAGS     = /Ge- /Gm+ /G4 /Gl  /O+ /Oc+ /Ol- /Q+ $(VACDEBUG)
+CPPFLAGS     = /G5 /Ge- /Gm+ /Gl- /Ga- /O+ /Oc+ /Ol- /Q+ $(VACDEBUG)
+LIBS	     =  mmPM2.lib rexx.lib
+INC	=	..\include
+HELPERDIR	=	.\helper
+DEFS         =
+PROGS        =
+ODIR		= ./obj
+CPPDIR	= .
+
+
+OBJECTS	=	audioshadowoverridenwpmethods.obj audioshadowoverridenwpclsmethods.obj
+
+all:	mediafld.dll
+
+mediafld.dll:	$(OBJECTS)
+		cd ../. && make
+
+audioshadowoverridenwpclsmethods.obj:	audioshadowoverridenwpclsmethods.cpp $(INC)\audioshadow.hh
+	icc $(CPPFLAGS) /C+ -I$(INC) /Fo$@ $<
+
+audioshadowoverridenwpmethods.obj:	audioshadowoverridenwpmethods.cpp $(INC)\audioshadow.hh
+	icc $(CPPFLAGS) /C+ -I$(INC) /Fo$@ $<
+
+
+
+clean:
+
+cleaner:
+	-rm *.*~
+	-rm *.flc
+
+distger:
+
Index: /tags/CWMM-0.3.0_GA/mediafolder/c/cddb/cd.c
===================================================================
--- /tags/CWMM-0.3.0_GA/mediafolder/c/cddb/cd.c	(revision 213)
+++ /tags/CWMM-0.3.0_GA/mediafolder/c/cddb/cd.c	(revision 213)
@@ -0,0 +1,608 @@
+/*
+ * This file is (C) Chris Wohlgemuth 1999
+ */
+/*
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; see the file COPYING.  If not, write to
+ * the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+
+#define INCL_DOS
+#define INCL_DOSDEVICES
+#define INCL_DOSDEVIOCTL
+#define INCL_DOSFILEMGR
+
+#include <os2.h>
+#include <stdio.h>
+#include <string.h>
+#include "cddb.h"
+
+
+#pragma pack(1)
+
+typedef struct{
+	UCHAR   ucFirstTrack;
+	UCHAR 	ucLastTrack;
+	ULONG   ulLeadOut;
+}CDINFO;
+
+typedef struct{
+	ULONG   ulLeadOut;
+	UCHAR   ucFirstTrack;
+	UCHAR 	ucLastTrack;
+}CDINFO2;
+
+typedef struct
+{
+	ULONG ulTrackAddress;
+	UCHAR ucTCInfo;
+}TRACKINFO;
+
+typedef struct
+{
+	UCHAR signature[4];
+	UCHAR  ucTrackNum;
+}TINFOPARAM;
+
+typedef struct
+{
+	UCHAR ucFrames;
+	UCHAR ucSeconds;
+	UCHAR ucMinutes;
+	UCHAR ucNotUsed;
+}MSF;
+
+typedef struct
+{
+  UCHAR signature[4];
+  UCHAR  ucAddressMode;
+  UCHAR ucStartSector[4];
+  UCHAR ucEndSector[4];
+}PLAYPARAM;
+
+#pragma pack()
+
+
+HFILE extern openDrive(char* drive);
+void extern closeDrive(HFILE hfDrive);
+LONG extern CDCalculateSize(MSF* msf1,MSF* msf2);
+/******************************************/
+/* Result:  
+	 0:   Error
+	 -1: CD is Data Disk
+	 other: # Audio tracks */
+/******************************************/
+int extern CDQueryAudioCDTracks(HFILE hfDrive);
+ULONG extern CDQueryUPC(UCHAR* ucUPC, char * drive);
+/* Returns the size in bytes of a track on drive 'drive' (e.g. O:) */
+LONG extern CDQueryTrackSize(ULONG numTrack, char * drive);
+BOOL CDPlayTrack(ULONG numTrack, char * drive);
+BOOL extern CDStop(char * drive);
+LONG extern queryFreeDriveSpace(ULONG diskNum) ;
+/**************************************************************/
+/* This funktion returns the CD-Drives in the system          */
+/*                                                            */
+/* iNumCD (output): # of CD-Drives                            */
+/* cFirstDrive (output): first cd-Drive letter                */
+/* returns TRUE: We have cd-drives                            */
+/**************************************************************/
+BOOL extern CDQueryCDDrives(int *iNumCD, char * cFirstDrive);
+/* Returns a CDDB disc-ID for quering the database */
+/* Returns 0 if error.                             */
+LONG extern CDDBDiscID(char * drive, CDDBINFO * cddbInfo); 
+
+
+LONG extern CDCalculateSize(MSF* msf1,MSF* msf2)
+{
+ 	return ((msf2->ucMinutes*60+msf2->ucSeconds)*75+msf2->ucFrames)*2352-
+		((msf1->ucMinutes*60+msf1->ucSeconds)*75+msf1->ucFrames)*2352;	
+}
+
+LONG extern CDCalculateSector2(MSF* msf1)
+{
+ 	return ((msf1->ucMinutes*60+msf1->ucSeconds));	
+}
+
+LONG extern CDCalculateSector(MSF* msf1)
+{
+ 	return ((msf1->ucMinutes*60+msf1->ucSeconds)*75+msf1->ucFrames);	
+}
+
+
+/****************************************/
+/* Input: drive (e.g. o:)               */
+/****************************************/
+HFILE extern openDrive(char* drive)
+{
+	HFILE hfDrive = 0;
+	ULONG ulAction;
+	ULONG rc;
+    //char text[100];	
+
+	rc = DosOpen(drive, &hfDrive, &ulAction, 0,
+					 FILE_NORMAL, OPEN_ACTION_OPEN_IF_EXISTS,
+					 OPEN_SHARE_DENYNONE | OPEN_ACCESS_READONLY |
+					 OPEN_FLAGS_DASD|OPEN_FLAGS_FAIL_ON_ERROR, NULL);	
+#if 0
+sprintf(text, "%s %d %d", drive, rc, hfDrive);
+WinMessageBox(HWND_DESKTOP, HWND_DESKTOP, text,"", 1234,MB_MOVEABLE);
+#endif
+	if(rc)
+		return NULLHANDLE;//Error
+
+	return hfDrive;
+}
+
+void extern closeDrive(HFILE hfDrive)
+{
+	DosClose(hfDrive);	
+}
+
+/******************************************/
+/* Result:  
+	 0:   Error
+	 -1: CD is Data Disk
+	 other: # Audio tracks */
+/******************************************/
+int extern  CDQueryAudioCDTracks(HFILE hfDrive)
+{
+	ULONG ulParamLen;
+	ULONG ulDataLen;
+	ULONG rc;
+	CDINFO cdInfo;
+	TINFOPARAM tip;
+	TRACKINFO trackInfo;
+    //char text[100];	
+
+	ulDataLen=sizeof(cdInfo);
+	ulParamLen=4;
+		
+	if(!hfDrive)
+		return 0;
+	
+	rc = DosDevIOCtl(hfDrive, IOCTL_CDROMAUDIO, CDROMAUDIO_GETAUDIODISK,
+						  "CD01", 4, &ulParamLen, &cdInfo,
+						  sizeof(cdInfo), &ulDataLen);
+#if 0
+DosBeep(100, 300);sprintf(text, "%d  %d",  rc, hfDrive);
+WinMessageBox(HWND_DESKTOP, HWND_DESKTOP, text,"", 1234,MB_MOVEABLE);
+#endif
+	if(rc) {
+		return 0;//Error
+	}
+
+	ulDataLen=sizeof(trackInfo);
+	ulParamLen=sizeof(TINFOPARAM);
+	tip.signature[0]='C';
+	tip.signature[1]='D';	
+	tip.signature[2]='0';
+	tip.signature[3]='1';
+	tip.ucTrackNum=1;
+	
+	/* We have a disc. Check if it's audio */
+	rc = DosDevIOCtl(hfDrive, IOCTL_CDROMAUDIO, CDROMAUDIO_GETAUDIOTRACK,
+						  &tip, sizeof(tip), &ulParamLen, &trackInfo,
+						  sizeof(trackInfo), &ulDataLen);
+
+	if(rc) {
+		return 0;//Error
+	}
+		
+	if(trackInfo.ucTCInfo & 0x40) {
+		return -1;//It's a data track
+	}
+		
+	return cdInfo.ucLastTrack-cdInfo.ucFirstTrack+1;
+	
+}
+
+/* Returns the UPC of CD in drive 'drive' (e.g. O:) */
+/* Size of ucUCP must be 10!                        */
+ULONG extern CDQueryUPC(UCHAR* ucUPC, char * drive)
+{
+  HFILE hfDrive;
+  ULONG ulParamLen;
+  ULONG ulDataLen;
+  ULONG rc;
+  char setup[100]; 
+ 
+  hfDrive=openDrive(drive);
+  if(!hfDrive) return -1;
+
+  do {
+    DosBeep(1000,200);
+    /* Get UPC info */
+    ulDataLen=10;
+    ulParamLen=4;
+    rc = DosDevIOCtl(hfDrive, IOCTL_CDROMDISK, CDROMDISK_GETUPC,
+                     "CD01", 4, &ulParamLen, ucUPC,
+                     10, &ulDataLen);
+    sprintf(setup,"rc is: %x",rc);
+
+    WinMessageBox(  HWND_DESKTOP,   HWND_DESKTOP,  
+                  setup, "GET_UPC", 0UL, MB_OK | MB_ICONEXCLAMATION|MB_MOVEABLE );
+
+    if(rc)
+      break;
+    DosBeep(2000,200);
+    closeDrive(hfDrive);
+    return 0;
+
+  }while(TRUE);
+
+  /* No error */
+  closeDrive(hfDrive);
+  return -1;
+}
+
+
+/* Returns the size in bytes of a track on drive 'drive' (e.g. O:) */
+/* The track num starts with 1 */
+LONG extern CDQueryTrackSize(ULONG numTrack, char * drive)
+{
+	HFILE hfDrive;
+	ULONG ulParamLen;
+	ULONG ulDataLen;
+	ULONG rc;
+	CDINFO cdInfo;
+	TINFOPARAM tip;
+	TRACKINFO trackInfo[2];
+
+	hfDrive=openDrive(drive);
+	if(!hfDrive) return 0;
+	
+	do {
+		/* Get cd info */
+		ulDataLen=sizeof(cdInfo);
+		ulParamLen=4;
+		rc = DosDevIOCtl(hfDrive, IOCTL_CDROMAUDIO, CDROMAUDIO_GETAUDIODISK,
+										 "CD01", 4, &ulParamLen, &cdInfo,
+										 sizeof(cdInfo), &ulDataLen);		
+		if(rc)
+			break;//Error
+		ulDataLen=sizeof(trackInfo);
+		ulParamLen=sizeof(TINFOPARAM);
+		tip.signature[0]='C';
+		tip.signature[1]='D';	
+		tip.signature[2]='0';
+		tip.signature[3]='1';
+		/* Get information about our track */
+		tip.ucTrackNum=numTrack;
+		rc = DosDevIOCtl(hfDrive, IOCTL_CDROMAUDIO, CDROMAUDIO_GETAUDIOTRACK,
+										 &tip, sizeof(tip), &ulParamLen, &trackInfo[0],
+										 sizeof(trackInfo[0]), &ulDataLen);
+		if(rc) 
+			break;//Error
+
+		/* Get information about next track */
+		tip.ucTrackNum=numTrack+1;
+		if(tip.ucTrackNum<=cdInfo.ucLastTrack) {
+			rc = DosDevIOCtl(hfDrive, IOCTL_CDROMAUDIO, CDROMAUDIO_GETAUDIOTRACK,
+											 &tip, sizeof(tip), &ulParamLen, &trackInfo[1],
+											 sizeof(trackInfo[1]), &ulDataLen);
+			if(rc) 
+				break;//Error
+		}
+		else {
+          trackInfo[1].ulTrackAddress=cdInfo.ulLeadOut;
+          /* #pragma pack(1) eingebaut */
+
+          /*BYTE *cdInfoBytes;
+            cdInfoBytes=(BYTE*)&cdInfo;
+            cdInfoBytes+=2;
+            trackInfo[1].ulTrackAddress=*((ULONG*)cdInfoBytes);*/
+        }
+        closeDrive(hfDrive);
+		return CDCalculateSize((MSF*)&trackInfo[0].ulTrackAddress, (MSF*)&trackInfo[1].ulTrackAddress);
+	}while(TRUE);
+	closeDrive(hfDrive);
+	return 0;
+}
+
+/* Returns the size in bytes of a track on drive 'drive' (e.g. O:) */
+/* The track num starts with 1 */
+LONG extern CDQueryTrackSecs(ULONG numTrack, char * drive)
+{
+  LONG lBytes;
+  if((lBytes=CDQueryTrackSize( numTrack, drive))!=0)
+    {
+      return lBytes/176400;
+    }
+  return 0;
+}
+
+/* Returns sector info of track #numTrack */
+/* Starting with track 0 */
+LONG extern CDQueryTrackStartSector(ULONG numTrack, HFILE hfDrive)
+{
+	
+	ULONG ulParamLen;
+	ULONG ulDataLen;
+	ULONG rc;
+	CDINFO cdInfo;
+	TINFOPARAM tip;
+	TRACKINFO trackInfo[2];
+
+	do {
+      /* Get cd info */
+      ulDataLen=sizeof(cdInfo);
+      ulParamLen=4;
+      rc = DosDevIOCtl(hfDrive, IOCTL_CDROMAUDIO, CDROMAUDIO_GETAUDIODISK,
+                       "CD01", 4, &ulParamLen, &cdInfo,
+                       sizeof(cdInfo), &ulDataLen);		
+      if(rc)
+        break;//Error
+      
+      ulDataLen=sizeof(trackInfo);
+		ulParamLen=sizeof(TINFOPARAM);
+		tip.signature[0]='C';
+		tip.signature[1]='D';	
+		tip.signature[2]='0';
+		tip.signature[3]='1';
+		/* Get information about our track */
+		tip.ucTrackNum=numTrack+1;
+		if(tip.ucTrackNum<=cdInfo.ucLastTrack) {
+          rc = DosDevIOCtl(hfDrive, IOCTL_CDROMAUDIO, CDROMAUDIO_GETAUDIOTRACK,
+                           &tip, sizeof(tip), &ulParamLen, &trackInfo[0],
+                           sizeof(trackInfo[0]), &ulDataLen);
+          if(rc) 
+            break;//Error
+          }else 
+            return CDCalculateSector((MSF*)&cdInfo.ulLeadOut);
+        
+
+        return CDCalculateSector((MSF*)&trackInfo[0].ulTrackAddress);
+
+	}while(TRUE);
+	
+    /* error */
+    printf("ERROR!!!!!!!!!\n");
+	return 0;
+}
+
+/*****************************************/
+/*                                       */
+/* Plays track #numTrack on              */
+/* CD-Drive 'drive'                      */
+/*                                       */
+/* Returns TRUE if successful            */
+/*                                       */
+/*****************************************/
+BOOL CDPlayTrack(ULONG numTrack, char * drive)
+{
+	HFILE hfDrive;
+	ULONG ulParamLen;
+	ULONG ulDataLen;
+	ULONG rc;
+	CDINFO cdInfo;
+	TINFOPARAM tip;
+	TRACKINFO trackInfo[2];
+    PLAYPARAM playParam;
+
+	hfDrive=openDrive(drive);
+	if(!hfDrive) return FALSE;
+    do {
+	/* Get cd info */
+		ulDataLen=sizeof(cdInfo);
+		ulParamLen=4;
+		rc = DosDevIOCtl(hfDrive, IOCTL_CDROMAUDIO, CDROMAUDIO_GETAUDIODISK,
+										 "CD01", 4, &ulParamLen, &cdInfo,
+										 sizeof(cdInfo), &ulDataLen);		
+		if(rc)
+			break;//Error
+		ulDataLen=sizeof(trackInfo);
+		ulParamLen=sizeof(TINFOPARAM);
+		tip.signature[0]='C';
+		tip.signature[1]='D';	
+		tip.signature[2]='0';
+		tip.signature[3]='1';
+		/* Get information about our track */
+		tip.ucTrackNum=numTrack;
+		rc = DosDevIOCtl(hfDrive, IOCTL_CDROMAUDIO, CDROMAUDIO_GETAUDIOTRACK,
+										 &tip, sizeof(tip), &ulParamLen, &trackInfo[0],
+										 sizeof(trackInfo[0]), &ulDataLen);
+		if(rc) 
+			break;//Error
+		/* Get information about next track */
+		tip.ucTrackNum=numTrack+1;
+		if(tip.ucTrackNum<=cdInfo.ucLastTrack) {
+			rc = DosDevIOCtl(hfDrive, IOCTL_CDROMAUDIO, CDROMAUDIO_GETAUDIOTRACK,
+											 &tip, sizeof(tip), &ulParamLen, &trackInfo[1],
+											 sizeof(trackInfo[1]), &ulDataLen);
+			if(rc) 
+				break;//Error
+		}
+		else {
+          /* The following does not work on my system. Compilerbug ? 
+             trackInfo[1].ulTrackAddress=cdInfo.ulLeadOut; */
+          BYTE *cdInfoBytes;
+          cdInfoBytes=(BYTE*)&cdInfo;
+          cdInfoBytes+=2;
+          trackInfo[1].ulTrackAddress=*((ULONG*)cdInfoBytes);
+        }
+
+              /* Play the Track... */
+        ulParamLen=sizeof(PLAYPARAM);
+		playParam.signature[0]='C';
+		playParam.signature[1]='D';	
+		playParam.signature[2]='0';
+		playParam.signature[3]='1';
+        playParam.ucAddressMode=01;
+        memcpy(&playParam.ucStartSector,&trackInfo[0].ulTrackAddress,4);
+        memcpy(&playParam.ucEndSector,&trackInfo[1].ulTrackAddress,4);
+        
+        rc = DosDevIOCtl(hfDrive, IOCTL_CDROMAUDIO, CDROMAUDIO_PLAYAUDIO,
+                         &playParam, sizeof(playParam), &ulParamLen,0,
+                         0, 0);
+        if(rc)
+          break;
+        closeDrive(hfDrive);
+        return TRUE;
+    }while(TRUE);
+	closeDrive(hfDrive);
+    return FALSE;
+}
+
+BOOL extern CDStop(char * drive)
+{
+	HFILE hfDrive;
+	ULONG ulParamLen;
+    ULONG rc;
+
+	hfDrive=openDrive(drive);
+	if(!hfDrive) return FALSE;
+    
+    do {
+      /* Stop CD */
+      ulParamLen=4;
+      rc = DosDevIOCtl(hfDrive, IOCTL_CDROMAUDIO, CDROMAUDIO_STOPAUDIO,
+                       "CD01", 4, &ulParamLen,0,
+                       0, 0);		
+      if(rc)
+        break;//Error
+      closeDrive(hfDrive);
+      return TRUE;
+    }while(TRUE);
+	closeDrive(hfDrive);
+    return FALSE;
+}
+
+LONG extern queryFreeDriveSpace(ULONG diskNum) 
+{
+	FSALLOCATE infoBuf;
+	
+	if(DosQueryFSInfo(diskNum,FSIL_ALLOC,&infoBuf,sizeof(infoBuf)))
+		return 0;
+	
+	return infoBuf.cUnitAvail*infoBuf.cbSector*infoBuf.cSectorUnit;
+}
+
+/**************************************************************/
+/*                                                            */
+/* This funktion returns the CD-Drives in the system          */
+/*                                                            */
+/* iNumCD (output): # of CD-Drives                            */
+/* cFirstDrive (output): first cd-Drive letter                */
+/* returns TRUE: We have cd-drives                            */
+/*                                                            */
+/**************************************************************/
+BOOL extern CDQueryCDDrives(int *iNumCD, char * cFirstDrive)
+{
+  HFILE hfDevice;
+  ULONG ulAction;
+  ULONG ulLen;
+  static char cFirst=0;
+  static int iNumCDLocal=0;
+  static BOOL haveCD=FALSE;
+  static BOOL done=FALSE;			
+  struct
+  {
+    USHORT usCountCD;
+    USHORT usFirstCD;
+  } CDInfo;
+  
+  if(!done){
+    ulLen = sizeof(CDInfo);
+    if(!DosOpen("\\DEV\\CD-ROM2$", &hfDevice, &ulAction, 0,
+                FILE_NORMAL, OPEN_ACTION_OPEN_IF_EXISTS,
+                OPEN_SHARE_DENYNONE | OPEN_ACCESS_READONLY, NULL))
+      {
+        if(!DosDevIOCtl(hfDevice, 0x82, 0x60, NULL, 0, NULL, &CDInfo, ulLen, &ulLen))
+          {
+            if(CDInfo.usCountCD) {
+              haveCD=TRUE;
+              iNumCDLocal=CDInfo.usCountCD;
+              cFirst='A'+ CDInfo.usFirstCD;
+            }										 
+          }
+        DosClose(hfDevice);
+      }
+    done=TRUE;
+  }
+  *iNumCD=iNumCDLocal;
+  *cFirstDrive=cFirst;
+  return haveCD;				
+}
+
+
+/*****************************************/
+/*                                       */
+/* Query if a CD is avaiable in          */
+/* CD-Drive 'drive'                      */
+/*                                       */
+/* Input: drive num (starting with 0)    */
+/* Returns TRUE if media is avaiable     */
+/*                                       */
+/*****************************************/
+BOOL CDQueryMedia(ULONG  driveNum)
+{
+  return FALSE;
+}
+
+
+int cddb_sum(int n)
+{
+  int ret;
+  //printf("n:  %d   ",n);
+  for (ret = 0; n > 0; n /= 10) {
+    ret += (n % 10);
+  }
+  //printf("ret:  %d   ",ret);
+  return ret;
+}
+
+/* Returns a CDDB disc-ID for quering the database */
+/* Returns 0 if error.                             */
+LONG extern CDDBDiscID(char * drive, CDDBINFO * cddbInfo)
+{
+  int numTracks,a;
+  HFILE hfDrive;
+  LONG sum;
+  int t;
+
+
+  do {
+    hfDrive=openDrive(drive);
+    if(!hfDrive)
+      return 0;
+
+    numTracks=CDQueryAudioCDTracks(hfDrive);
+    if(numTracks==0||numTracks==-1)
+      break;
+    cddbInfo->numTracks=numTracks;
+
+    sum=0;
+    /* Calculating the id */
+    for(a=0;a<numTracks;a++) {
+      sum+= cddb_sum(CDQueryTrackStartSector(a, hfDrive)/75 );
+      //printf("Track%d: %d\n",a,CDQueryTrackStartSector(a, hfDrive));
+      cddbInfo->startSector[a]=CDQueryTrackStartSector(a, hfDrive);
+    }
+    t=CDQueryTrackStartSector(a, hfDrive)/75-CDQueryTrackStartSector(0, hfDrive)/75;
+    /*printf("(a-1): %d  0: %d t:  %d\n",CDQueryTrackStartSector(a, hfDrive),
+           CDQueryTrackStartSector(0, hfDrive),t);*/
+    //printf("discid: %x\n",((sum % 0xff) << 24 | (t << 8) | numTracks));
+    //printf("Disclength: %d",(CDQueryTrackStartSector(a, hfDrive)-CDQueryTrackStartSector(0, hfDrive))/75);
+    cddbInfo->discLength=(CDQueryTrackStartSector(a, hfDrive)-CDQueryTrackStartSector(0, hfDrive))/75;
+    cddbInfo->discid=(sum % 0xff) << 24 | (t << 8) | numTracks;
+    closeDrive(hfDrive);
+    return cddbInfo->discid;
+  }while(TRUE);
+
+  /* error */
+  closeDrive(hfDrive);
+  return 0;
+}
+
+
+
Index: /tags/CWMM-0.3.0_GA/mediafolder/c/cddb/cddb.cpp
===================================================================
--- /tags/CWMM-0.3.0_GA/mediafolder/c/cddb/cddb.cpp	(revision 213)
+++ /tags/CWMM-0.3.0_GA/mediafolder/c/cddb/cddb.cpp	(revision 213)
@@ -0,0 +1,674 @@
+/*
+ * This file is (C) Chris Wohlgemuth 1999/2000
+ */
+/*
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; see the file COPYING.  If not, write to
+ * the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+
+#include <os2.h>
+#include <stdio.h> /* For stderr */
+#include <stdlib.h> /* For atoi() */
+#include <string.h>
+#include <io.h>
+#include <fcntl.h>
+//#include <sys/itypes.h>
+#include <types.h>
+#include <sys/socket.h>
+#include <netdb.h>
+#include <errno.h>
+#include <nerrno.h>
+#include <netinet/in.h>
+
+#include "cddb.h"
+#include "cddb.hh"
+
+#define CDDB_OK   0
+#define CDDB_MORE 1
+#define CDDB_ERROR -1
+
+#define verbose 2
+
+extern int h_errno;
+extern int errno;
+LONG extern CDDBDiscID(char * drive,CDDBINFO *cddbInfo);
+//unsigned short _Optlink _bswap(unsigned short s);
+extern int port;
+extern char host[100];
+extern char username[100];
+extern char hostname[100];
+extern char clientname[100];
+extern char version[100];
+
+void extern printError(char* errorString);
+void extern printErrorCR(char* errorString);
+void extern printData(char* outString);
+
+
+/*****************************************************/
+
+clsTrack::clsTrack(char * title,int trackNo)
+{
+  strncpy(trackname,title,sizeof(trackname));
+  iTrackNo=trackNo;
+  nextTrack=0;
+}
+/*****************************************************/
+
+
+/* If iFuz==0 then we have one exact match. If iFuz==1
+   we have one of n exact matches or a fuzzy match. */
+cddb::cddb(char * chrTitle,char *chrArtist, char *category, int iFuz=0)
+{
+  firstTrack=0;
+  nextCddb=0;
+  iFuzzy=iFuz;
+  strncpy(title,chrTitle,sizeof(title));
+  strncpy(artist,chrArtist,sizeof(artist));
+
+  return;
+}
+
+cddb::~cddb()
+{
+  clsTrack * tempTrack;
+
+  while(firstTrack) {
+    tempTrack=firstTrack;
+    firstTrack=firstTrack->nextTrack;
+    delete(tempTrack);
+  }
+
+  if(nextCddb)delete nextCddb;
+
+  return;
+}
+
+/* Method to link different matches together */
+void cddb::linkCddb(cddb * Cddb)
+{
+  /* The new cddb goes to the end of the list */
+  if(nextCddb){
+    nextCddb->linkCddb(Cddb);
+    return;
+  }
+  nextCddb=Cddb;
+  return;
+}
+
+int cddb::newTrack(char * trackTitle, int trackNo)
+{
+  clsTrack * tempTrack;
+
+  tempTrack=new clsTrack(trackTitle, trackNo);
+  if(!tempTrack)return 1;
+  addTrack(tempTrack);
+  return 0;
+}
+
+void cddb::addTrack(clsTrack * track)
+{
+  clsTrack * tempTrack;
+
+  if(!firstTrack) {
+    firstTrack=track;
+    return;
+  }
+
+  /* Check if this is another part of title information spawned over several lines */
+  tempTrack=cddbFindTrack(track->iTrackNo);
+  if(tempTrack) {
+    /* Yes, add  the rest of the title to that what we already have */
+    strncat(tempTrack->trackname, track->trackname, sizeof(tempTrack->trackname)-strlen(tempTrack->trackname)-1);
+    delete(track);
+    return;
+  }
+
+  tempTrack=firstTrack;
+  while(tempTrack->nextTrack) {
+    tempTrack=tempTrack->nextTrack;
+  }
+  tempTrack->nextTrack=track;
+  return;
+}
+
+/* This method finds the track with the specified num (starting with 0) */
+clsTrack* cddb::cddbFindTrack(int iTrack)
+{
+  clsTrack * tempTrack;
+
+  tempTrack=firstTrack;
+  while(tempTrack) {
+    if(tempTrack->iTrackNo==iTrack)
+      return tempTrack;
+
+    tempTrack=tempTrack->nextTrack;
+  }
+
+  return NULL;
+}
+
+clsTrack * cddb::cddbNextTrack(clsTrack * track)
+{
+  if(!track)return 0;
+  return track->nextTrack;
+}
+
+/**********************************************************/
+/* Some helper functions
+ */
+
+#if 0
+/* now defined in printHelper.cpp
+   or cddbhelper.cpp. By choosing the right module to link to, it's possible
+   to redirect the messages without changing this module. Used for different
+   output with querycddb.exe and pmcddb.exe. */
+void printError(char* errorString)
+{
+  fprintf(stderr,"%s",errorString);
+}
+
+void printErrorCR(char* errorString)
+{
+  fprintf(stderr,"%s\n",errorString);
+}
+
+
+void printData(char* outString)
+{
+  int fileHandle;
+  int rc;
+
+  fileHandle=open("cddb.out",O_APPEND|O_TEXT|O_WRONLY);
+  if(fileHandle==-1) {
+    printError((char *)"Cannot open cddb.out");
+    return;
+  }
+  rc= write(fileHandle,outString,strlen(outString));
+  // write(fileHandle,"\n",sizeof("\n"));
+  close(fileHandle);
+  return;
+}
+#endif
+
+/**********************************************************/
+/* CDDB Stuff */
+
+int readResponse(int s, char * buffer,int size)
+{
+  int a;
+  int rc;
+
+  rc=1;
+  for(a=0;a<size&&rc>0;a++) {
+    rc=read(s,&buffer[a],1);
+    if(buffer[a]=='\n') {
+      buffer[a]=0;
+      return CDDB_MORE;
+    }
+    if(rc==-1)
+      return CDDB_ERROR;
+  }
+
+  return CDDB_ERROR;
+}
+
+/* Returns the cddb code. */
+int get_cddb_code( char * chrResponse)
+{
+  return atoi(chrResponse);
+}
+
+/* Check error codes coming from the server*/
+int check_cddb_code(char * chrResponse)
+{
+  switch (chrResponse[0])
+    {
+    case '2': return CDDB_OK;
+    case '3': return CDDB_MORE;
+    case '4':
+      printError((char *)"CDDB server error");
+      return CDDB_ERROR;
+    case '5':
+      printError((char *)"CDDB client error");
+      return CDDB_ERROR;
+    default:
+      printError((char *)"Unknown error");
+      break;
+    }
+  return CDDB_ERROR;
+}
+
+/* Performing the handshake procedure with the CDDB server */
+/* s: socket handle */
+int cddb_handshaking(int s)
+{
+  char buffer[512*2];
+  int rc;
+
+  /* Handshaking */
+  if(verbose)
+    printError((char *)"Handshaking...    ");
+  sprintf(buffer,"cddb hello %s %s %s %s\n",username,hostname,clientname,version);
+  if(verbose==2)
+    printError(buffer);
+  rc=write(s,buffer,strlen(buffer));
+  if(rc==-1) {
+    printError((char *)"Handshaking: cannot write to CDDB server");
+    return -1;
+  }
+  if(verbose)
+    printError((char *)"done\n");
+  if(verbose==2)
+    printError((char *)"Response: ");
+
+  rc=readResponse(s,buffer,sizeof(buffer));
+  if(rc==CDDB_ERROR) {
+    printError((char *)"Handshaking: cannot get response");
+    return -1;
+  }
+  if(verbose==2)
+    printErrorCR(buffer);
+
+  if(check_cddb_code(buffer)==CDDB_ERROR)
+    return -1;
+
+  return 0;
+}
+
+/* s: socket handle */
+int cddb_setting_proto(int s)
+{
+  char buffer[512];
+  int rc;
+  int iProtLevel;
+
+  iProtLevel=4;/* Startlevel */
+  /* Setting protocol level */
+  do {
+    if(verbose)
+      printError((char *)"\nSetting protocol level...    ");
+    sprintf(buffer,"proto %d\n",iProtLevel);
+    printError(buffer);
+    rc=write(s,buffer,strlen(buffer));
+    if(rc==-1) {
+      printError((char *)"Protocol: cannot write to CDDB server");
+      return -1;
+    }
+    if(verbose)
+      printError((char *)"done\n");
+    if(verbose==2)
+      printError((char *)"Response: ");
+
+    rc=readResponse(s,buffer,sizeof(buffer));
+    if(rc==CDDB_ERROR) {
+      printError((char *)"Set protocol: cannot get response");
+      return -1;
+    }
+    if(verbose==2)
+      printErrorCR(buffer);
+
+    /* Check cddb code */
+    if(check_cddb_code(buffer)==CDDB_ERROR) {
+      if(get_cddb_code(buffer)!=501)
+        return -1;/* Unknown error */
+    }
+    else
+      break;
+    /* protocol not supported. Decrement level and try again. */
+    iProtLevel--;
+  }while(iProtLevel>0);
+
+  return 0;
+}
+
+/* This is called if the CDDB database has got several matches for our
+   discid. We take all matches and decide later, which to use. */
+cddb * query_get_all_matches(int s)
+{
+  cddb * root=0;
+  cddb * Cddb=0;
+  int rc;
+  char buffer[512];
+
+  do {
+    rc=readResponse(s,buffer,sizeof(buffer)); /* Get next line */
+
+    if(rc==CDDB_ERROR)
+      return root; /* return what we have so far */
+
+    if(buffer[0]=='.') /* End of data */
+      return root; /* return what we have */
+
+    /* A new cddb instance for every match */
+    Cddb=new cddb((char *)"",(char *)"",(char *)"",1); /* One fuzzy match or one of several matches */
+    /* Get the data for this match */
+    sscanf(buffer, " %20s %x %100[^/\r\n] / %100[^\r\n]", Cddb->category,&Cddb->discid,Cddb->artist,Cddb->title);
+    /* Link the cddb instance into the list */
+    if(!root)
+      root=Cddb;
+    else
+      root->linkCddb(Cddb);
+
+  }while(1);
+
+}
+
+/* Query some data */
+/* With the data given we later query the
+   tracknames */
+cddb * cddb_query(int s, CDDBINFO *cddbInfo)
+{
+  char buffer[512*2]={0};
+  char track[20]={0};
+  char title[100]={0};
+  char artist[100]={0};
+  char categ[20]={0};
+  int rc;
+  int code;
+  int a;
+  cddb * Cddb;
+  cddb * Cddb2;
+  char * chrPtr;
+
+  /* Sending query */
+  if(verbose)
+    printError((char *)"Sending query cmd...    ");
+  /* Build cmd-line */
+  sprintf(buffer,"cddb query %08x %d",cddbInfo->discid,cddbInfo->numTracks);
+  for(a=0;a<cddbInfo->numTracks;a++) {
+    rc=sprintf(track,/*sizeof(track),*/" %d",cddbInfo->startSector[a]);
+    if(rc==EOF||rc>=sizeof(track)) {
+      printError((char *)"Query: buffer overrun while formatting track offsets.\nPlease report this bug.\n");
+      return 0;
+    }
+    if(sizeof(buffer)-strlen(buffer) <= strlen(track)) {
+      printError((char *)"Query: buffer overrun while adding track offsets to command.\nPlease report this bug.\n");
+      return 0;
+    }
+    strncat(buffer,track, sizeof(buffer)-strlen(buffer));
+  }
+
+  rc=sprintf(track,/*sizeof(track),*/ " %d\n",cddbInfo->discLength);
+  if(rc==EOF||rc>=sizeof(track)) {
+    printError((char *)"Query: buffer overrun while formatting disclength.\nPlease report this bug.\n");
+    return 0;
+  }
+  if(sizeof(buffer)-strlen(buffer) <= strlen(track)) {
+    printError((char *)"Query: buffer overrun while adding disclength to command.\nPlease report this bug.\n");
+    return 0;
+  }
+  strncat(buffer,track, sizeof(buffer)-strlen(buffer));
+
+
+  if(verbose==2)
+    printErrorCR(buffer);
+  rc=write(s,buffer,strlen(buffer));
+  if(rc==-1) {
+    printError((char *)"Query: cannot write to CDDB server");
+    return 0;
+  }
+  if(verbose)
+    printError((char *)" done\n");
+  if(verbose==2)
+    printError((char *)"Response: ");
+
+  rc=readResponse(s,buffer,sizeof(buffer));
+  //rc=read(s,buffer,sizeof(buffer)-1);
+  if(rc==CDDB_ERROR) {
+    printError((char *)"Query: cannot get response");
+    return 0;
+  }
+  if(verbose==2) {
+    printErrorCR(buffer);
+  }
+  if(check_cddb_code(buffer)==CDDB_ERROR)
+    return 0;
+  code=get_cddb_code(buffer);
+
+  /* Check output */
+  switch(code)
+    {
+    case 200:  /* exact match */
+      Cddb=new cddb((char *)"",(char *)"",(char *)"");
+
+      sscanf(buffer+4, "%20s %x %100[^/\r\n] / %100[^\r\n]", Cddb->category,&Cddb->discid,Cddb->artist,Cddb->title);
+
+      return Cddb;
+      break;
+    case 210: /* several exact matches */
+    case 211: /* several inexact matches */
+      return query_get_all_matches(s); /* if there's an error this call returns 0 */
+      break;
+    case 202:
+    default:
+      /* We shouldn't reach this */
+      return 0;
+    }
+  /* We shouldn't reach this */
+  return 0;
+}
+
+/* Reads the CDDB banner from the server after connecting */
+/* We don't really need it so it is only shown on stderr */
+int cddb_banner(int s)
+{
+  char buffer[512];
+  int rc;
+
+  /* Get CDDB-Banner */
+  if(verbose)
+    printErrorCR("Querying CDDB-Banner...");
+  rc=readResponse(s,buffer,sizeof(buffer));
+  if(rc==CDDB_ERROR) {
+    printError((char *)"Cannot read CDDB-Banner");
+    return -1;
+  }
+  if(verbose==2)
+    printErrorCR(buffer);
+
+  if(check_cddb_code(buffer)==CDDB_ERROR)
+    return -1;
+  return 0;
+}
+
+/* Ask for the information about our CD. Parse it and
+   save it in the data file. */
+int read_and_parse(int s,cddb * Cddb)
+{
+  int rc;
+  char buffer[512]={0};
+  char key[20]={0};
+  char trackName[100]={0};
+  char fullTrackName[100]={0};
+  int iTrack=0;
+  int iTemp=0;
+
+  do{
+    rc=readResponse(s,buffer,sizeof(buffer));
+    if(rc==CDDB_ERROR) {
+      printError((char *)"Read request: cannot get response");
+      return CDDB_ERROR;
+    }
+    /* Print the data to the outfile. The terminating '.' isn't printed out so the datafile
+       is usable for a cddb commit. */
+    if(buffer[0]!='.')
+      printData(buffer);
+
+    if(buffer[0]=='#') /* This is a comment */
+      { }
+      // printf("Found Comment: %s\n",buffer);
+    else{
+      if(buffer[0]=='.') /* End of data */
+        return CDDB_OK; /* Done */
+
+      //printf("Found data: %s\n",buffer);
+      sscanf(buffer,"%20[^0-9=]",key);
+      /* We put track names into a linked list in the cddb instance */
+      if(!strcmp(strupr(key),"TTITLE")) {
+        iTrack=0;
+        /* We have a track title */
+        sscanf(buffer,"%20[^0-9]%d=%100[^\n\r]",key,&iTrack,trackName);
+        Cddb->newTrack(trackName,iTrack); /* New track entry in cddb instance */
+      }
+    }
+  }while(rc==CDDB_MORE);
+
+  return CDDB_OK;
+}
+
+int cddb_read(int s,cddb * Cddb)
+{
+  char buffer[512];
+  int rc;
+
+  /* Sending read */
+
+  /* Build cmd-line */
+  sprintf(buffer,"cddb read %s %08x\n",Cddb->category,Cddb->discid);
+  if(verbose)
+    printError((char *)"\nSending read cmd... ");
+  if(verbose==2)
+    printError(buffer);
+
+  rc=write(s,buffer,strlen(buffer));
+  if(rc==-1) {
+    printError((char *)"Read request: cannot write to CDDB server");
+    return -1;
+  }
+  if(verbose)
+    printError((char *)"done\n");
+  if(verbose==2)
+    printError((char *)"Response: ");
+
+  rc=readResponse(s,buffer,sizeof(buffer));
+  if(rc==CDDB_ERROR) {
+    printError((char *)"Read request: cannot get response");
+    return -1;
+  }
+  if(verbose==2)
+    printError(buffer);
+  if(check_cddb_code(buffer)==CDDB_ERROR)
+    return CDDB_ERROR;
+
+  /* Get the data */
+  read_and_parse(s,Cddb);
+  return CDDB_OK;
+}
+
+/****************************************************/
+
+
+int cddbConnectToHost(int * skt) {
+
+  struct hostent *he;
+  struct sockaddr_in sa_in;
+  char buffer[512];
+  int s;
+
+  /* Creating socket */
+  if(verbose)
+    printError((char *)"Creating socket...     ");
+  s=socket(AF_INET,SOCK_STREAM,0);
+  if(s==-1) {
+    printError((char *)"Cannot create socket!");
+    return -1;
+  }
+  *skt=s;
+  if(verbose)
+    printError((char *)"Socket created\n");
+
+  /* Querying host */
+  if(verbose)
+    printError((char *)"Querying host...     ");
+  he = gethostbyname(host);
+  if(he==NULL) {
+    printError((char *)"Cannot get host address.\ngethostbyname() returned error:  ");
+    switch (h_errno)
+      {
+      case HOST_NOT_FOUND:
+        printError((char *)"Host not found\n");
+        break;
+      case TRY_AGAIN:
+        printError((char *)"Temporary error. Try again later.\n");
+        break;
+      case NO_DATA:
+        printError((char *)"Name valid but name server has no associated address.\n");
+        break;
+      case NO_RECOVERY:
+        printError((char *)"Unrecoverable error.\n");
+        break;
+      default:
+        printError((char *)"Unknown error\n");
+      }
+    /* Close the socket */
+    close(s);
+    return -1;
+  }
+
+  if(verbose)
+    printError((char *)"Host found.\n");
+
+
+  /* Connecting to host */
+  if(verbose)
+    printError((char *)"Connecting to host...    ");
+  memset(&sa_in,0, sizeof(struct sockaddr_in));
+
+  sa_in.sin_family=AF_INET;
+  sa_in.sin_port=htons((unsigned short)port);
+  memcpy(&sa_in.sin_addr, he->h_addr, he->h_length);
+
+  if(connect(s,(struct sockaddr*)&sa_in,sizeof(struct sockaddr_in))==-1) {
+    sprintf(buffer,"errno: %d\n",errno);
+    printError(buffer);
+    switch (errno)
+      {
+      case EBADF:
+        printError((char *)"No valid socket descriptor");
+        break;
+      case EISCONN:
+        printError((char *)"The socket is already connected\n");
+        break;
+      case ETIMEDOUT:
+        printError((char *)"No connection. Timed out.\n");
+        break;
+      case ECONNREFUSED:
+        printError((char *)"Connection refused by  host.\n");
+        break;
+      case EADDRNOTAVAIL:
+        printError((char *)"Address not avaiable.\n");
+        break;
+
+      default:
+        printError((char *)"General failure: Cannot connect to host\n");
+      }
+    close(s);
+    return -1;
+  }
+  if(verbose)
+    printError((char *)"connected.\n");
+  return 0;
+}
+
+
+
+
+
+
+
+
+
+
+
Index: /tags/CWMM-0.3.0_GA/mediafolder/c/cddb/cddbcls.cpp
===================================================================
--- /tags/CWMM-0.3.0_GA/mediafolder/c/cddb/cddbcls.cpp	(revision 213)
+++ /tags/CWMM-0.3.0_GA/mediafolder/c/cddb/cddbcls.cpp	(revision 213)
@@ -0,0 +1,620 @@
+/*
+ * This file is (C) Chris Wohlgemuth 1999
+ */
+/*
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; see the file COPYING.  If not, write to
+ * the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+
+#include <os2.h>
+#include <stdio.h> /* For stderr */
+#include <string.h>
+#include <io.h>
+#include <fcntl.h>
+#include <sys/types.h>
+#include <sys/socket.h>
+#include <netdb.h>
+#include <errno.h>
+#include <netinet/in.h>
+
+#include "cddb.h"
+#include "cddb.hh"
+
+#define CDDB_OK   0
+#define CDDB_MORE 1
+#define CDDB_ERROR -1
+
+#define verbose 1
+
+extern int h_errno;
+extern int errno;
+LONG extern CDDBDiscID(char * drive,CDDBINFO *cddbInfo);
+
+extern int port;
+extern char host[100];
+extern char username[100];
+extern char hostname[100];
+extern char clientname[100];
+extern char version[100];
+
+/* You may set this in another module to a valid handle
+   and the error text is written to this window (WinSetWindowText())
+   This isn't threadsafe so be sure about what you're doing!! */
+
+HWND hwndError=NULL;
+
+/*****************************************************/
+
+clsTrack::clsTrack(char * title,int trackNo)
+{
+  strncpy(trackname,title,sizeof(trackname));
+  iTrackNo=trackNo;
+  nextTrack=0;
+}
+/*****************************************************/
+
+
+
+
+/* If iFuz==0 then we have one exact match. If iFuz==1
+   we have one of n exact matches or a fuzzy match. */
+cddb::cddb(char * chrTitle,char *chrArtist, char *category, int iFuz=0)
+{
+  firstTrack=0;
+  nextCddb=0;
+  iFuzzy=iFuz;
+  strncpy(title,chrTitle,sizeof(title));
+  strncpy(artist,chrArtist,sizeof(artist));
+
+  return;
+}
+
+cddb::~cddb()
+{
+  clsTrack * tempTrack;
+
+  while(!firstTrack) {
+    tempTrack=firstTrack;
+    firstTrack=firstTrack->nextTrack;
+    delete(tempTrack);
+  }
+  
+  if(nextCddb)delete nextCddb;
+
+  return;
+}
+
+/* Method to link different matches together */
+void cddb::linkCddb(cddb * Cddb)
+{
+  /* The new cddb goes to the end of the list */
+  if(nextCddb){
+    nextCddb->linkCddb(Cddb);
+    return;
+  }
+  nextCddb=Cddb;
+  return;
+}
+
+int cddb::newTrack(char * trackTitle, int trackNo)
+{
+  clsTrack * tempTrack;
+
+  tempTrack=new clsTrack(trackTitle, trackNo);
+  if(!tempTrack)return 1;
+  addTrack(tempTrack);
+  return 0;
+}
+
+void cddb::addTrack(clsTrack * track)
+{
+  clsTrack * tempTrack;
+
+  if(!firstTrack) {
+    firstTrack=track;
+    return;
+  }
+
+  tempTrack=firstTrack;
+  while(tempTrack->nextTrack) {
+    tempTrack=tempTrack->nextTrack;  
+  }
+  tempTrack->nextTrack=track;
+  return;  
+}
+
+clsTrack * cddb::cddbNextTrack(clsTrack * track)
+{
+  if(!track)return 0;
+  return track->nextTrack;
+}
+
+/**********************************************************/
+/* Some helper functions
+ */
+void printError(char* errorString)
+{
+    char buffer[CCHMAXPATH] = {0};
+  char *ptr;
+
+  strncpy(buffer, errorString, sizeof(buffer) - 1);
+  fprintf(stderr,"%s",errorString);
+  /* hwndError is global, so this isn't threadsafe */
+  if(hwndError) {
+    ptr=strchr(buffer,'\n');
+    if(ptr) {
+      *ptr=0;
+    }
+    WinSetWindowText(hwndError, buffer);
+  }
+}
+
+void printErrorCR(char* errorString)
+{
+  fprintf(stderr,"%s\n",errorString);
+}
+
+
+void printData(char* outString)
+{
+  int fileHandle;
+  int rc;
+
+  fileHandle=open("cddb.out",O_APPEND|O_TEXT|O_WRONLY);
+  if(fileHandle==-1) {
+    printError("Cannot open cddb.out");
+    return;
+  }
+  rc= write(fileHandle,outString,strlen(outString));
+  // write(fileHandle,"\n",sizeof("\n"));
+  close(fileHandle);
+  return;
+}
+
+
+/**********************************************************/
+/* CDDB Stuff */
+
+int readResponse(int s, char * buffer,int size)
+{ 
+  int a;
+  int rc;
+  
+  rc=1;
+  for(a=0;a<size&&rc>0;a++) {
+    rc=read(s,&buffer[a],1);
+    if(buffer[a]=='\n') {
+      buffer[a]=0;
+      return CDDB_MORE;
+    }
+    if(rc==-1)
+      return CDDB_ERROR;    
+  }
+   
+  return CDDB_ERROR;
+}
+
+/* Returns the cddb code. */
+int get_cddb_code( char * chrResponse)
+{
+  return atoi(chrResponse);
+}
+
+/* Check error codes coming from the server*/
+int check_cddb_code(char * chrResponse)
+{
+  switch (chrResponse[0])
+    {
+    case '2': return CDDB_OK;
+    case '3': return CDDB_MORE;
+    case '4':
+      printError("CDDB server error");
+      return CDDB_ERROR;
+    case '5':
+      printError("CDDB client error");
+      return CDDB_ERROR;
+    default:
+      printError("Unknown error");
+      break;
+    }
+  return CDDB_ERROR;
+}
+
+/* Performing the handshake procedure with the CDDB server */
+/* s: socket handle */
+int cddb_handshaking(int s)
+{
+  char buffer[512];
+  int rc;
+
+  /* Handshaking */
+  if(verbose)
+    printError("Handshaking...    ");
+  sprintf(buffer,"cddb hello %s %s %s %s\n",username,hostname,clientname,version);
+  rc=write(s,buffer,strlen(buffer));
+  if(rc==-1) {
+    printError("Handshaking: cannot write to CDDB server");
+    return -1;
+  }
+  if(verbose)
+    printError("done\n");
+  if(verbose==2)
+    printError("Response: ");
+  
+  rc=readResponse(s,buffer,sizeof(buffer));
+  if(rc==CDDB_ERROR) {
+    printError("Handshaking: cannot get response");
+    return -1;
+  }
+  if(verbose==2) 
+    printErrorCR(buffer);
+ 
+  if(check_cddb_code(buffer)==CDDB_ERROR)
+    return -1;
+
+  return 0;
+}
+
+/* s: socket handle */
+int cddb_setting_proto(int s)
+{
+  char buffer[512];
+  int rc;
+  int iProtLevel;
+
+  iProtLevel=4;/* Startlevel */
+  /* Setting protocol level */
+  do {
+    if(verbose)
+      printError("\nSetting protocol level...    ");
+    sprintf(buffer,"proto %d\n",iProtLevel);
+    printError(buffer);
+    rc=write(s,buffer,strlen(buffer));
+    if(rc==-1) {
+      printError("Protocol: cannot write to CDDB server");
+      return -1;
+    }
+    if(verbose)
+      printError("done\n");
+    if(verbose==2)
+      printError("Response: ");
+    
+    rc=readResponse(s,buffer,sizeof(buffer));
+    if(rc==CDDB_ERROR) {
+      printError("Set protocol: cannot get response");
+      return -1;
+    }
+    if(verbose==2)
+      printErrorCR(buffer);
+    
+    /* Check cddb code */
+    if(check_cddb_code(buffer)==CDDB_ERROR) {
+      if(get_cddb_code(buffer)!=501)
+        return -1;/* Unknown error */
+    }
+    else
+      break;
+    iProtLevel--;      
+  }while(iProtLevel>0);
+  
+  return 0;
+}
+
+/* This is called if the CDDB database has got several matches for our
+   discid. We take all matches and decide later, which to use. */
+cddb * query_get_all_matches(int s)
+{
+  cddb * root=0;
+  cddb * Cddb=0;
+  int rc;
+  char buffer[512];
+
+  do {
+    rc=readResponse(s,buffer,sizeof(buffer)); /* Get next line */
+    
+    if(rc==CDDB_ERROR)
+      return root; /* return what we have so far */
+
+    if(buffer[0]=='.') /* End of data */
+      return root; /* return what we have */
+
+    /* A new cddb instance for every match */
+    Cddb=new cddb("","","",1); /* One fuzzy match or one of several matches */
+    /* Get the data for this match */
+    sscanf(buffer, " %20s %x %100[^/\r\n] / %100[^\r\n]", Cddb->category,&Cddb->discid,Cddb->artist,Cddb->title);
+    /* Link the cddb instance into the list */
+    if(!root)
+      root=Cddb;
+    else
+      root->linkCddb(Cddb);
+    
+  }while(true);
+
+}
+
+/* Query some data */
+/* With the data given we later query the
+   tracknames */
+cddb * cddb_query(int s, CDDBINFO *cddbInfo)
+{
+  char buffer[512]={0};
+  char track[20];
+  char title[100];
+  char artist[100];
+  char categ[20];
+  int rc;
+  int code;
+  int a;
+  cddb * Cddb;
+  cddb * Cddb2;
+  char * chrPtr;
+
+  /* Sending query */
+  if(verbose)
+    printError("Sending query cmd...    ");
+  /* Build cmd-line */
+  sprintf(buffer,"cddb query %08x %d",cddbInfo->discid,cddbInfo->numTracks);
+  for(a=0;a<cddbInfo->numTracks;a++) {
+    sprintf(track," %d",cddbInfo->startSector[a]);
+    strcat(buffer,track);
+  }
+  sprintf(track," %d\n",cddbInfo->discLength);
+  strcat(buffer,track);
+  if(verbose==2)
+    printErrorCR(buffer);
+  rc=write(s,buffer,strlen(buffer));
+  if(rc==-1) {
+    printError("Query: cannot write to CDDB server");
+    return 0;
+  }
+  if(verbose)
+    printError(" done\n");
+  if(verbose==2)
+    printError("Response: ");
+  
+  rc=readResponse(s,buffer,sizeof(buffer));
+  //rc=read(s,buffer,sizeof(buffer)-1);
+  if(rc==CDDB_ERROR) {
+    printError("Query: cannot get response");
+    return 0;
+  }
+  if(verbose==2) {
+    printErrorCR(buffer);
+  }
+  if(check_cddb_code(buffer)==CDDB_ERROR)
+    return 0;
+  code=get_cddb_code(buffer);
+
+  /* Check output */
+  switch(code)
+    {
+    case 200:  /* exact match */
+      Cddb=new cddb("","","");
+      /*sscanf(buffer+4, "%20s %x %100[^ ] / %100[^\r\n]", Cddb->category,&Cddb->discid,Cddb->artist,Cddb->title);      
+       */ 
+      sscanf(buffer+4, "%20s %x %100[^/\r\n] / %100[^\r\n]", Cddb->category,&Cddb->discid,Cddb->artist,Cddb->title);
+      /* printData(buffer);
+         printData(buffer+4); */
+      return Cddb;
+      break;
+    case 210: /* several exact matches */
+    case 211: /* several inexact matches */
+      return query_get_all_matches(s); /* if there's an error this call returns 0 */
+      break;
+    case 202:
+    default:
+      /* We shouldn't reach this */
+      return 0;
+    }
+  /* We shouldn't reach this */
+  return 0;
+}  
+
+/* Reads the CDDB banner from the server after connecting */
+/* We don't really need it so it is only shown on stderr */
+int cddb_banner(int s)
+{
+  char buffer[512];
+  int rc;
+
+  /* Get CDDB-Banner */
+  if(verbose)
+    printErrorCR("Querying CDDB-Banner...");
+  rc=readResponse(s,buffer,sizeof(buffer));
+  if(rc==CDDB_ERROR) {
+    printError("Cannot read CDDB-Banner");
+    return -1;
+  }
+  if(verbose==2)
+    printErrorCR(buffer);
+
+  if(check_cddb_code(buffer)==CDDB_ERROR)
+    return -1;
+  return 0;
+}
+
+/* Ask for the information about our CD. Parse it and
+   save it in the data file. */
+int read_and_parse(int s,cddb * Cddb)
+{
+  int rc;
+  char buffer[512];
+  char key[21];
+  char trackName[101] = {0};
+  ULONG iTrack;
+  
+  do{
+    rc=readResponse(s,buffer,sizeof(buffer));
+    if(rc==CDDB_ERROR) {
+      printError("Read request: cannot get response");
+      return CDDB_ERROR;
+    }
+    /* Print the data to the outfile */
+    printData(buffer);
+    if(buffer[0]=='#') /* This is a comment */
+      { }
+      // printf("Found Comment: %s\n",buffer);
+    else{
+      if(buffer[0]=='.') /* End of data */
+        return CDDB_OK; /* Done */
+      //printf("Found data: %s\n",buffer);
+      sscanf(buffer,"%20[^0-9=]",key);
+      /* We put track names into a linked list in the cddb instance */
+      if(!strcmp(strupr(key),"TITLE")) {
+        iTrack=0;
+        /* We have a disc title */
+        sscanf(buffer,"%20[^0-9]%lu=%100[^\n\r]",key,iTrack,trackName);
+        Cddb->newTrack(trackName,iTrack); /* New track entry in cddb instance */
+      }
+    }
+  }while(rc==CDDB_MORE);
+
+}
+
+int cddb_read(int s,cddb * Cddb)
+{
+  char buffer[512];
+  int rc;
+
+  /* Sending read */
+
+  /* Build cmd-line */
+  sprintf(buffer,"cddb read %s %08x\n",Cddb->category,Cddb->discid);  
+  if(verbose) 
+    printError("\nSending read cmd... ");
+  if(verbose==2)
+    printError(buffer);
+  
+  rc=write(s,buffer,strlen(buffer));
+  if(rc==-1) {
+    printError("Read request: cannot write to CDDB server");
+    return -1;
+  }
+  if(verbose) 
+    printError("done\n");
+  if(verbose==2)
+    printError("Response: ");
+  
+  rc=readResponse(s,buffer,sizeof(buffer));
+  if(rc==CDDB_ERROR) {
+    printError("Read request: cannot get response");
+    return -1;
+  }
+  if(verbose==2) 
+    printError(buffer);
+  if(check_cddb_code(buffer)==CDDB_ERROR)
+    return CDDB_ERROR;
+
+  /* Get the data */  
+  read_and_parse(s,Cddb);
+  return CDDB_OK;  
+}
+
+/****************************************************/
+
+
+int cddbConnectToHost(int * skt) {
+
+  struct hostent *he;
+  struct sockaddr_in sa_in;
+  char buffer[512];
+  int s;
+
+  /* Creating socket */
+  if(verbose)
+    printError("Creating socket...     ");
+  s=socket(AF_INET,SOCK_STREAM,0);
+  if(s==-1) {
+    printError("Cannot create socket!");
+    return -1;
+  }
+  *skt=s;
+  if(verbose)
+    printError("Socket created\n");
+
+  /* Querying host */
+  if(verbose)
+    printError("Querying host...     ");
+  he = gethostbyname(host);
+  if(he==NULL) {
+    printError("Cannot get host address.\ngethostbyname() returned error:  ");
+    switch (h_errno)
+      {
+      case HOST_NOT_FOUND:
+        printError("Host not found\n");
+        break;
+      case TRY_AGAIN:
+        printError("Temporary error. Try again later.\n");
+        break;
+      case NO_DATA:
+        printError("Name valid but name server has no associated address.\n");
+        break;
+      case NO_RECOVERY:
+        printError("Unrecoverable error.\n");
+        break;
+      default:
+        printError("Unknown error\n");
+      }
+    /* Close the socket */
+    close(s);
+    return -1;
+  }   
+
+  if(verbose)
+    printError("Host found.\n");
+
+
+  /* Connecting to host */
+  if(verbose)
+    printError("Connecting to host...    ");
+  memset(&sa_in,0, sizeof(struct sockaddr_in));
+
+  sa_in.sin_family=AF_INET;
+  sa_in.sin_port=htons((unsigned short)port);
+  memcpy(&sa_in.sin_addr, he->h_addr, he->h_length);
+
+  if(connect(s,(struct sockaddr*)&sa_in,sizeof(struct sockaddr_in))==-1) {
+    sprintf(buffer,"errno: %d\n",errno);
+    printError(buffer);
+    switch (errno)
+      {
+      case EBADF:
+        printError("No valid socket descriptor");
+        break;
+      case EISCONN:
+        printError("The socket is already connected\n");
+        break;
+      case ETIMEDOUT:
+        printError("No connection. Timed out.\n");
+        break;
+      case ECONNREFUSED:
+        printError("Connection refused by  host.\n");
+        break;
+      case EADDRNOTAVAIL:
+        printError("Address not avaiable.\n");
+        break;
+
+      default:
+        printError("General failure: Cannot connect to host\n");
+      }
+    close(s);
+    return -1;
+  }
+  if(verbose)
+    printError("connected.\n");
+  return 0;
+}
+
+
+
Index: /tags/CWMM-0.3.0_GA/mediafolder/c/cddb/def.tpl
===================================================================
--- /tags/CWMM-0.3.0_GA/mediafolder/c/cddb/def.tpl	(revision 213)
+++ /tags/CWMM-0.3.0_GA/mediafolder/c/cddb/def.tpl	(revision 213)
@@ -0,0 +1,22 @@
+# Note: lines starting with '#' are comments.
+
+[DESCRIPTION]
+PM CD database config
+
+[COPYRIGHT]
+(c) C. Wohlgemuth 1999-2000 Netlabs CWMM Team 2023
+
+[AUTHOR]
+Netlabs CWMM Team
+
+[NAME]
+# This is the NAME xxx WINDOWAPI|etc line in the def file.
+# Important: it specifies the internal name of the program. Don't leave out!
+NAME PmCddb WINDOWAPI
+
+[BUILDMACHINE]
+Zobopeep
+
+[OTHER]
+# Add all the lines here you want to have at the end of the generated DEF file
+STACKSIZE    1638400
Index: /tags/CWMM-0.3.0_GA/mediafolder/c/cddb/helper.c
===================================================================
--- /tags/CWMM-0.3.0_GA/mediafolder/c/cddb/helper.c	(revision 213)
+++ /tags/CWMM-0.3.0_GA/mediafolder/c/cddb/helper.c	(revision 213)
@@ -0,0 +1,649 @@
+/*
+ * This file is (C) Chris Wohlgemuth 2001-2005
+ */
+/*
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; see the file COPYING.  If not, write to
+ * the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+#define INCL_WIN
+#define INCL_DOS
+#define INCL_DOSERRORS
+
+#include <os2.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+
+#include <stdio.h>
+#include <string.h>
+//#include "audiofolder.h"
+//#include "audiofolderres.h"
+
+#define INSTALLDIR 1
+
+/* The subdirectory in the installation directory where to put the log files */
+#define LOGFILE_SUBDIR "Logfiles"
+
+extern char* params[];
+extern HMODULE RESSOURCEHANDLE;
+extern char logName[];
+
+char chrInstallDir[CCHMAXPATH];
+char chrCDRecord[CCHMAXPATH];/* Path to cdrecord */
+char chrCDROptions[CCHMAXPATH];
+char chrAudioCDROptions[CCHMAXPATH];
+LONG  lCDROptions=0;
+
+char chrMkisofs[CCHMAXPATH];/* Path to mkisofs */
+char chrMkisofsOptions[CCHMAXPATH];
+LONG lMKOptions;
+
+char chrGrabberPath[CCHMAXPATH];
+char chrGrabberOptions[CCHMAXPATH];
+int bTrackNumbers;
+int iGrabberID;
+char chosenCD[3];
+
+char chrMpg123Path[CCHMAXPATH];
+BOOL bMpg123SwabBytes;
+int iMp3Decoder;
+
+char chrMntIsoFS[CCHMAXPATH];
+char chrUmntIso[CCHMAXPATH];
+
+char chrCdrdaoPath[CCHMAXPATH]={0};
+char chrCdrdaoDriver[100]={0};
+int iBus=0;
+int iTarget=0;
+int iLun=0;
+int iSpeed=1;
+int iFifo=4;
+
+BOOL bUseCDDB;
+BOOL bTipsEnabled;
+
+SWP swpWindow;
+
+HMODULE queryResModuleHandle2(char *installDir, char * chrBaseName);
+
+
+BOOL HlpQueryTempDir(char * chrInstallationDir, char * chrBuffer, int iBufferSize)
+{
+  int iLeft=iBufferSize;
+
+  strncpy(chrBuffer, chrInstallationDir, iBufferSize);
+  chrBuffer[iBufferSize-1]=0;
+  iLeft=iBufferSize-strlen(chrBuffer);
+  strncat(chrBuffer, "\\temp", iLeft);
+  chrBuffer[iBufferSize-1]=0;
+
+  return TRUE;
+}
+
+/****************************************************
+ *                                                  *
+ * This funktion returns the running OS version:    *
+ *                                                  *
+ * 30: Warp 3, 40 Warp 4                            *
+ *                                                  *
+ ****************************************************/
+ULONG cwQueryOSRelease()
+{
+  static ULONG ulVersionMinor=0;
+
+  if(!ulVersionMinor)
+    if(DosQuerySysInfo(QSV_VERSION_MINOR, QSV_VERSION_MINOR, &ulVersionMinor, sizeof(ulVersionMinor)))
+      ulVersionMinor=30;/* Default Warp 3 */
+
+  return ulVersionMinor;
+
+}
+void writeLog(char* logText);
+void removeLog(void)
+{
+  char logNameLocal[CCHMAXPATH];
+  
+  sprintf(logNameLocal,"%s\\%s\\%s",params[1],LOGFILE_SUBDIR,logName);
+  //WinMessageBox(HWND_DESKTOP,HWND_DESKTOP, logNameLocal,"",1234,MB_MOVEABLE|MB_OK);
+  //writeLog(logNameLocal);
+
+  remove(logNameLocal);
+  //DosBeep(500,100);
+}
+
+void removeLog2(char * installDir, char * logName)
+{
+  char logNameLocal[CCHMAXPATH];
+
+  sprintf(logNameLocal,"%s\\%s\\%s",installDir,LOGFILE_SUBDIR,logName);
+  remove(logNameLocal);
+}
+
+void writeLog(char* logText)
+{
+  char logNameLocal[CCHMAXPATH];
+  FILE *fHandle;
+
+  sprintf(logNameLocal,"%s\\%s\\%s",params[1],LOGFILE_SUBDIR,logName);
+  fHandle=fopen(logNameLocal,"a");
+  if(fHandle) {
+    fprintf(fHandle,logText);
+    fclose(fHandle);
+  }
+}
+
+void writeLog2(char * installDir, char * logName, char* logText)
+{
+  char logNameLocal[CCHMAXPATH];
+  FILE *fHandle;
+
+  sprintf(logNameLocal,"%s\\%s\\%s",installDir, LOGFILE_SUBDIR, logName);
+  fHandle=fopen(logNameLocal,"a");
+  if(fHandle) {
+    fprintf(fHandle,logText);
+    fclose(fHandle);
+  }
+}
+
+BOOL buildLogName( char * outBuf, char * logName,ULONG ulSize)
+{
+  if(sprintf(outBuf, /*ulSize,*/"logfiles\\%s",logName)==EOF)
+    return FALSE;
+  return TRUE;
+}
+
+
+/* This function launches the wrapper <wrapperExe>         */
+/*  with the params given as a PM-session */
+/* in PSZ parameter. PSZ folderPath is the path to put the */
+/* write.log. HWND hwnd is the window waiting for the      */
+/* WM_APPTERMINATE message                                 */
+ULONG launchPMWrapper(PSZ chrInstallDir, PSZ parameter, PSZ folderPath, PSZ wrapperExe, PSZ pszTitle)
+{
+  STARTDATA startData={0};
+  APIRET rc;
+  PID pid;
+  ULONG ulSessionID=0;
+  char chrLoadError[CCHMAXPATH];
+  char startParams[CCHMAXPATH*4];
+  char exename[CCHMAXPATH]={0};
+  char chrFolderPath[CCHMAXPATH+10];
+  
+  memset(&startData,0,sizeof(startData));
+  startData.Length=sizeof(startData);
+  startData.Related=SSF_RELATED_INDEPENDENT;
+  startData.FgBg=SSF_FGBG_FORE;
+  startData.TraceOpt=SSF_TRACEOPT_NONE;
+  startData.PgmTitle=pszTitle;
+    
+  /*  sprintf(exename,"%s",buildWrapName(wrapperExe));*/
+  sprintf(exename,"%s\\bin\\%s",params[1],wrapperExe);
+  /*
+    if(!checkHelper(exename))
+    return -1;
+    */
+
+  startData.PgmName=exename;
+  startData.InheritOpt=SSF_INHERTOPT_SHELL;
+  startData.SessionType=SSF_TYPE_PM;
+  startData.PgmControl=0;
+  startData.InitXPos=30;
+  startData.InitYPos=30;
+  startData.InitXSize=500;
+  startData.InitYSize=400;
+  startData.ObjectBuffer=chrLoadError;
+  startData.ObjectBuffLen=(ULONG)sizeof(chrLoadError);
+
+  /* Put the exe-path between " " to make sure, spaces are handled correctly */
+  strcpy(chrFolderPath,folderPath);
+  sprintf(startParams,"\"%s\" \"%s\" %s",
+          chrInstallDir,chrFolderPath, parameter);
+  startData.PgmInputs=startParams;
+
+  rc=DosStartSession(&startData,&ulSessionID,&pid);   
+  return 0;   
+}
+
+
+ULONG launchCmdExe( PSZ wrapperExe, PSZ parameter, PSZ folderPath, PSZ pszTitle)
+{
+  STARTDATA startData={0};
+  APIRET rc;
+  PID pid;
+  ULONG ulSessionID=0;
+  char chrLoadError[CCHMAXPATH];
+  char startParams[CCHMAXPATH*4];
+  char exename[CCHMAXPATH]={0};
+  char chrCDRexe[CCHMAXPATH+10];
+  struct stat statBuf;
+
+  strcpy(exename,wrapperExe);
+  
+  writeLog("\nStarting '");
+  writeLog(exename);
+  writeLog("' with the following parameters:\n");
+ 
+
+  memset(&startData,0,sizeof(startData));
+  startData.Length=sizeof(startData);
+  startData.Related=SSF_RELATED_INDEPENDENT;
+  startData.FgBg=SSF_FGBG_BACK;
+  startData.TraceOpt=SSF_TRACEOPT_NONE;
+  startData.PgmTitle=pszTitle;
+  startData.PgmName=exename;
+  startData.InheritOpt=SSF_INHERTOPT_SHELL;
+  startData.SessionType=SSF_TYPE_WINDOWABLEVIO;
+  startData.PgmControl=0;
+  //  if(lCDROptions&IDCDR_HIDEWINDOW)
+  startData.PgmControl|=SSF_CONTROL_INVISIBLE;//|SSF_CONTROL_MAXIMIZE|SSF_CONTROL_NOAUTOCLOSE;
+  //  if(!(lCDROptions&IDCDR_CLOSEWINDOW))
+  //startData.PgmControl|=SSF_CONTROL_NOAUTOCLOSE;
+  startData.InitXPos=30;
+  startData.InitYPos=30;
+  startData.InitXSize=500;
+  startData.InitYSize=400;
+  startData.ObjectBuffer=chrLoadError;
+  startData.ObjectBuffLen=(ULONG)sizeof(chrLoadError);
+
+  startData.PgmInputs=parameter;
+
+  writeLog("\n\n");
+ 
+  rc=DosStartSession(&startData,&ulSessionID,&pid);   
+  if(rc!=NO_ERROR) {
+    writeLog("Error while starting: ");
+    sprintf(chrLoadError,"%d\n",rc);
+    writeLog(chrLoadError);
+    return -1;
+  }
+  return 0;   
+}
+
+#if 0
+BOOL readWindowPosFromIni(char * installDir, char *chrKey)
+{
+  char profileName[CCHMAXPATH];
+  char moduleName[CCHMAXPATH];
+  HINI hini=0;
+  ULONG ulSize;
+  BOOL bError=FALSE;
+  HWND hwnd;
+
+  hwnd=HWND_DESKTOP;
+
+  strncpy(chrInstallDir, installDir,sizeof(chrInstallDir));
+  /* Build full path for cdrecord.ini file */
+  sprintf(profileName,"%s\\cdrecord.ini", installDir);       
+  /* Insert message in Logfile */
+  writeLog("Reading Window position from ");
+  writeLog(profileName);
+  writeLog("\n");
+
+  /* Open ini-file */
+  hini=PrfOpenProfile(WinQueryAnchorBlock(HWND_DESKTOP),(unsigned char *)profileName);
+  do{
+    if(!hini) {
+      /* profileName: "Warning! Cannot open Ini-file!"
+         moduleName: "Data-CD-Creator"
+         */
+      messageBox( profileName, IDSTR_INIFILEOPENWARNING , sizeof(profileName),
+                  moduleName, IDSTRD_DATACDCREATOR, sizeof(moduleName),
+                  RESSOURCEHANDLE, HWND_DESKTOP, MB_OK | MB_ICONEXCLAMATION|MB_MOVEABLE);
+      break;
+    }/* end of if(!hini) */
+
+    ulSize=sizeof(swpWindow); 
+    if(!PrfQueryProfileData(hini,"windowposition", chrKey, &swpWindow, &ulSize))
+      bError=TRUE;
+
+    if(hini)
+      PrfCloseProfile(hini);
+    
+    if(bError)
+      break;
+    return TRUE;
+  } while(TRUE);
+  writeLog("Error while reading cdrecord.ini\n");
+  return FALSE;
+}
+
+BOOL writeWindowPosToIni(char * installDir, char *chrKey)
+{
+  char profileName[CCHMAXPATH];
+  char moduleName[CCHMAXPATH];
+  HINI hini=0;
+  ULONG ulSize;
+  BOOL bError=FALSE;
+  HWND hwnd;
+
+  hwnd=HWND_DESKTOP;
+
+  strncpy(chrInstallDir, installDir,sizeof(chrInstallDir));
+  /* Build full path for cdrecord.ini file */
+  sprintf(profileName,"%s\\cdrecord.ini", installDir);       
+  /* Insert message in Logfile */
+  writeLog("Writing Window position to ");
+  writeLog(profileName);
+  writeLog("\n");
+
+  /* Open ini-file */
+  hini=PrfOpenProfile(WinQueryAnchorBlock(HWND_DESKTOP),(unsigned char *)profileName);
+  do{
+    if(!hini) {
+      /* profileName: "Warning! Cannot open Ini-file!"
+         moduleName: "Data-CD-Creator"
+         */
+      messageBox( profileName, IDSTR_INIFILEOPENWARNING , sizeof(profileName),
+                  moduleName, IDSTRD_DATACDCREATOR, sizeof(moduleName),
+                  RESSOURCEHANDLE, HWND_DESKTOP, MB_OK | MB_ICONEXCLAMATION|MB_MOVEABLE);
+      break;
+    }/* end of if(!hini) */
+
+    if(!PrfWriteProfileData(hini,"windowposition", chrKey, &swpWindow, sizeof(swpWindow)))
+      bError=TRUE;
+
+    if(hini)
+      PrfCloseProfile(hini);
+    
+    if(bError)
+      break;
+    return TRUE;
+  } while(TRUE);
+  writeLog("Error while writing cdrecord.ini\n");
+  return FALSE;
+}
+
+
+BOOL readIni2(char * installDir)
+{
+  ULONG keyLength;
+  char profileName[CCHMAXPATH];
+  char moduleName[CCHMAXPATH];
+  char *chrPtr;
+  char *chrPtr2;
+  HINI hini=0;
+  char    text[200];
+  ULONG ulSize;
+  int a;
+  char chrCD[4];
+  BOOL bError=FALSE;
+  HWND hwnd;
+
+  hwnd=HWND_DESKTOP;
+
+  strncpy(chrInstallDir, installDir,sizeof(chrInstallDir));
+  /* Build full path for cdrecord.ini file */
+  sprintf(profileName,"%s\\cdrecord.ini", installDir);       
+  /* Insert message in Logfile */
+  writeLog("Reading values from ");
+  writeLog(profileName);
+  writeLog("\n");
+
+  /* Open ini-file */
+  hini=PrfOpenProfile(WinQueryAnchorBlock(HWND_DESKTOP),(unsigned char *)profileName);
+  do{
+    if(!hini) {
+      /* profileName: "Warning! Cannot open Ini-file!"
+         moduleName: "Data-CD-Creator"
+         */
+      messageBox( profileName, IDSTR_INIFILEOPENWARNING , sizeof(profileName),
+                  moduleName, IDSTRD_DATACDCREATOR, sizeof(moduleName),
+                  RESSOURCEHANDLE, HWND_DESKTOP, MB_OK | MB_ICONEXCLAMATION|MB_MOVEABLE);
+      break;
+    }/* end of if(!hini) */
+
+    keyLength=PrfQueryProfileString(hini,"CDWriter","cdrecord","",chrCDRecord,sizeof(chrCDRecord));
+    if(keyLength==1){
+      /* Text: "No CDRecord/2 path in cdrecord.ini found!\n" */
+      getMessage(text, IDSTRLOG_NOCDRECORD, sizeof(text), RESSOURCEHANDLE , hwnd);      
+      writeLog(text);
+      writeLog("\n");
+      bError=TRUE;
+      //  break;/* First opening. We havn't got entries yet */
+    }
+
+    ulSize=sizeof(lCDROptions); 
+    PrfQueryProfileData(hini,"CDWriter","options",&lCDROptions,&ulSize);
+
+    PrfQueryProfileString(hini,"CDWriter","audiocdroptions","",chrAudioCDROptions,sizeof(chrAudioCDROptions));    
+    PrfQueryProfileString(hini,"CDWriter","cdroptions","",chrCDROptions,sizeof(chrCDROptions));    
+
+    ulSize=sizeof(lCDROptions); 
+    PrfQueryProfileData(hini,"CDWriter","options",&lCDROptions,&ulSize);
+    keyLength=PrfQueryProfileString(hini,"Mkisofs","mkisofs","",chrMkisofs,sizeof(chrMkisofs));
+    if(keyLength==1){
+      /* Text: "No mkisofs path in cdrecord.ini found!\n" */
+      getMessage(text, IDSTRLOG_NOMKISOFS, sizeof(text), RESSOURCEHANDLE , hwnd);      
+      writeLog(text);
+      writeLog("\n");
+      bError=TRUE;
+      //break;/* First opening. We havn't got entries yet */
+    }
+
+    PrfQueryProfileString(hini,"Mkisofs","mkisofsoptions","",chrMkisofsOptions,sizeof(chrMkisofsOptions));
+    //lMKOptions=PrfQueryProfileInt(hini,"Mkisofs","options",IDMK_HIDEWINDOW|IDMK_CLOSEWINDOW);
+    ulSize=sizeof(lMKOptions);
+    PrfQueryProfileData(hini,"Mkisofs","options",&lMKOptions,&ulSize);   
+
+    keyLength=PrfQueryProfileString(hini,"CDGrabber","grabber","",chrGrabberPath,sizeof(chrGrabberPath));
+    if(keyLength==1){
+      /* Text: "No grabber path in cdrecord.ini found!\n" */
+      getMessage(text, IDSTRLOG_NOGRABBER, sizeof(text), RESSOURCEHANDLE , hwnd);      
+      writeLog(text);
+      writeLog("\n");
+      bError=TRUE;
+      //break;/* We havn't got entries yet */
+    }
+    PrfQueryProfileString(hini,"CDGrabber","graboptions","",chrGrabberOptions,sizeof(chrGrabberOptions));
+    PrfQueryProfileString(hini,"CDGrabber","grabdrive","",chosenCD,sizeof(chosenCD));
+    bTrackNumbers=PrfQueryProfileInt(hini,"CDGrabber","tracknumbers",1);
+    iGrabberID=PrfQueryProfileInt(hini,"CDGrabber","ID", IDGRABBER_UNKNOWN);/* 99: unknown */
+
+    keyLength=PrfQueryProfileString(hini,"mpg123","path","",chrMpg123Path,sizeof(chrMpg123Path));
+    if(keyLength==1){
+      /* Text: "No mpg123 path in cdrecord.ini found!\n" */
+      getMessage(text, IDSTRLOG_NOMPG123, sizeof(text), RESSOURCEHANDLE , hwnd);      
+      writeLog(text);
+      writeLog("\n");
+      bError=TRUE;
+      //      break;/* We havn't got entries yet */
+    }
+    bMpg123SwabBytes=PrfQueryProfileInt(hini,"mpg123","swabbytes",1);
+    iMp3Decoder=PrfQueryProfileInt(hini,"mpg123","decoder",IDKEY_USEMPG123);/* Which decoder to use */
+
+    keyLength=PrfQueryProfileString(hini,"cdrdao","path","",chrCdrdaoPath,sizeof(chrCdrdaoPath));
+    if(keyLength==1){
+      /* Text: "No cdrdao/2 path in cdrecord.ini found!\n" */
+      getMessage(text, IDSTRLOG_NOCDRDAO, sizeof(text), RESSOURCEHANDLE , hwnd);      
+      writeLog(text);
+      writeLog("\n");
+      bError=TRUE;
+      //      break; /* We havn't got entries yet */
+    }
+
+    keyLength=PrfQueryProfileString(hini,"cdrdao","driver","",chrCdrdaoDriver,sizeof(chrCdrdaoDriver));
+    if(keyLength==1){
+      /* Text: "No driver for cdrdao/2 found in cdrecord.ini!\n" */
+      getMessage(text, IDSTRLOG_NOCDRDAODRIVER, sizeof(text), RESSOURCEHANDLE , hwnd);      
+      writeLog(text);
+      writeLog("\n");
+      bError=TRUE;
+     /* We havn't got entries yet */
+      //break;
+    }
+
+    PrfQueryProfileString(hini,"isofs","mountpath","",chrMntIsoFS,sizeof(chrMntIsoFS));
+    PrfQueryProfileString(hini,"isofs","unmountpath","",chrUmntIso, sizeof(chrUmntIso));
+    
+    iBus=PrfQueryProfileInt(hini,"device","bus",0);
+    iTarget=PrfQueryProfileInt(hini,"device","target",0);
+    iLun=PrfQueryProfileInt(hini,"device","lun",0);
+    iSpeed=PrfQueryProfileInt(hini,"device","speed",1);
+    iFifo=PrfQueryProfileInt(hini,"device","fifo",4);
+
+    bUseCDDB=PrfQueryProfileInt(hini,"cddb","usecddb",0);
+    bTipsEnabled=PrfQueryProfileInt(hini,"tips","enable",1);
+
+    if(hini)
+      PrfCloseProfile(hini);
+
+    if(bError)
+      break;
+    return TRUE;
+  } while(TRUE);
+  writeLog("Error while reading cdrecord.ini\n");
+  return FALSE;
+}
+
+
+static void _HlpBuildProfileName(char* chrBuffer, int iBufferSize)
+{
+  /* Build full path for cdrecord.ini file */
+  sprintf(chrBuffer, /*iBufferSize,*/ "%s\\cdrecord.ini", chrInstallDir);
+  chrBuffer[iBufferSize-1]=0; /* Always terminate with zero */
+}
+
+HINI HlpOpenIni()
+{
+  char profileName[CCHMAXPATH];
+
+  /* Build full path for cdrecord.ini file */
+  _HlpBuildProfileName(profileName, sizeof(profileName));
+
+  /* Open ini-file */
+  return PrfOpenProfile(WinQueryAnchorBlock(HWND_DESKTOP),(unsigned char *)profileName);
+}
+
+void HlpCloseIni(HINI hini)
+{
+    if(hini)
+      PrfCloseProfile(hini);
+}
+#endif
+
+/* This function returns the module handle of our ressource dll */
+HMODULE queryResModuleHandle2(char *installDir, char * chrBaseName)
+{
+  COUNTRYCODE country= {0};
+  COUNTRYINFO countryInfo= {0};
+  char path[CCHMAXPATH];  
+  char buf[CCHMAXPATH];
+  char* found;
+  APIRET rc;
+  ULONG ulInfoLen;
+    
+  if(!RESSOURCEHANDLE) {
+    writeLog("Trying to load ressource DLL.\n");
+
+    /* Get the country code of our system and load the  
+       resource DLL with the right language */
+    do {
+      rc=DosQueryCtryInfo(sizeof(countryInfo),&country,&countryInfo,&ulInfoLen);
+      if(rc!=NO_ERROR) {
+        /* Insert message in Logfile */
+        writeLog(__FUNCTION__);
+        writeLog(": Can't get country info. Ressource-DLL will not be loaded.\n");
+        break;
+      }
+      sprintf(path,"%s", installDir);
+      
+      sprintf(buf,"\\%s%03d.dll", chrBaseName, countryInfo.country);
+      strcat(path,buf);
+      /* Insert message in Logfile */
+      writeLog("Using the following DLL path: ");
+      writeLog(path);
+      writeLog("\n");
+
+      //WinMessageBox(  HWND_DESKTOP,0, path, "Search DLL...", 0UL, MB_YESNO | MB_ICONEXCLAMATION|MB_MOVEABLE );
+      rc=DosLoadModule(buf,sizeof(buf),path, &RESSOURCEHANDLE);
+      if(rc==NO_ERROR)
+        break;
+
+      /* Insert message in Logfile */
+      writeLog("Ressource-DLL for the current countrycode not found. Trying to load default one (nnnnn001.DLL).\n");
+      
+      /* NLS DLL not found. Try to load default */
+      found=strrchr(path,'\\');
+      if(!found)
+        break;
+
+      *found=0;
+      sprintf(buf,"\\%s001.dll", chrBaseName);
+      strcat(path,buf);
+      writeLog("Using the following DLL path: ");
+      writeLog(path);
+      writeLog("\n");
+
+      rc=DosLoadModule(buf,sizeof(buf),path, &RESSOURCEHANDLE);
+      if(rc!=NO_ERROR) {
+        writeLog("Can't load DLL!\n");
+        RESSOURCEHANDLE=NULLHANDLE;
+      }
+      else {
+        writeLog("Ressource DLL loaded.\n");
+      }
+      break;
+    }while(TRUE);
+  }
+  return RESSOURCEHANDLE;
+}
+
+void freeResHandle()
+{
+  if(RESSOURCEHANDLE)
+    DosFreeModule(RESSOURCEHANDLE);
+}
+
+#if 0
+void sendCommand(char* command)
+{
+  HOBJECT hObject;
+  char chrCommand[CCHMAXPATH];
+
+  hObject=WinQueryObject(params[2]);
+  sprintf(chrCommand,"Querying object pointer for: %s\n",params[2]);
+  writeLog(chrCommand);
+  if(hObject!=NULLHANDLE) {
+    strcpy(chrCommand,command);
+    WinSetObjectData(hObject,chrCommand);
+    writeLog("Sending command to folder: ");
+    writeLog(command);
+    writeLog("\n");
+  }
+  else {
+    sprintf(chrCommand,"Can't query object pointer for: %s\n",params[2]);
+    writeLog(chrCommand);
+  }
+}
+#endif
+
+void HlpSendCommandToObject(char* chrObject, char* command)
+{
+  HOBJECT hObject;
+  char chrCommand[CCHMAXPATH];
+
+  hObject=WinQueryObject(chrObject);
+  sprintf(chrCommand,"Querying object pointer for: %s\n", chrObject);
+  writeLog(chrCommand);
+  if(hObject!=NULLHANDLE) {
+    strcpy(chrCommand,command);
+    WinSetObjectData(hObject,chrCommand);
+    writeLog("Sending command to object: ");
+    writeLog(command);
+    writeLog("\n");
+  }
+  else {
+    sprintf(chrCommand,"Can't query object pointer for: %s\n", chrObject);
+    writeLog(chrCommand);
+  }
+}
Index: /tags/CWMM-0.3.0_GA/mediafolder/c/cddb/logfiles/Cddb.log
===================================================================
--- /tags/CWMM-0.3.0_GA/mediafolder/c/cddb/logfiles/Cddb.log	(revision 213)
+++ /tags/CWMM-0.3.0_GA/mediafolder/c/cddb/logfiles/Cddb.log	(revision 213)
@@ -0,0 +1,20 @@
+G:\Projects_working\mmclasses-0.3.0\source\cddb\pmcddb.exe started with the following parameters:
+
+G:\Projects_working\mmclasses-0.3.0\source\cddb\pmcddb.exe
+N:
+D:\OS2\APPS\CWMMOS2\MEDIAFLD\bin\trknames.cmd
+
+Trying to load ressource DLL.
+Using the following DLL path: G:\Projects_working\mmclasses-0.3.0\source\cddb\PMDB049.dll
+Ressource-DLL for the current countrycode not found. Trying to load default one (nnnnn001.DLL).
+Using the following DLL path: G:\Projects_working\mmclasses-0.3.0\source\cddb\PMDB001.dll
+Ressource DLL loaded.
+Reading values from cddb.ini
+
+Cache directory is: G:\Projects_working\mmclasses-0.3.0\source\cddb\cddbdata\
+
+CDDB datafile name is: G:\Projects_working\mmclasses-0.3.0\source\cddb\cddbdata\65091a09
+Found CDDB data in cache directory. DB query finished.
+Trying to start D:\OS2\APPS\CWMMOS2\MEDIAFLD\bin\trknames.cmd
+Reading values from cddb.ini
+INI file opened.
Index: /tags/CWMM-0.3.0_GA/mediafolder/c/cddb/makefile
===================================================================
--- /tags/CWMM-0.3.0_GA/mediafolder/c/cddb/makefile	(revision 213)
+++ /tags/CWMM-0.3.0_GA/mediafolder/c/cddb/makefile	(revision 213)
@@ -0,0 +1,110 @@
+# Makefile for Audio-CD copy
+
+include ../../../make.inc
+
+CC           = gcc
+CPPFLAGS     = -O -Zomf -Zcrtdll -s
+#CPPFLAGSSTATIC     = -O -Zomf -Zsys -Zmt -s
+
+CPPFLAGSVAC  = /Ge- /Gm+ /G4 /Gl  /O+ /Oc+ /Ol- /Q+
+INC		= ../../include
+MOREINC		= $(COMMONSRC)/include
+DEFS         = 
+PROGS        =  
+ODIR		= .
+CPPDIR	= .
+LIBDIR		=	./lib
+BINDIR		=	../../dist/bin
+HELPERDIR	=	..\helper
+OBJECTS		=	cddb.o \
+			cd.o \
+			helper.o \
+			cddbhelper.o \
+			message.o
+LIBOBJECTS	= $(LIBDIR)/sys_funcs.obj
+
+#printHelper.obj
+#all:	 querycddb.exe cddbcls.obj
+
+all:	 pmcddb.exe pmdb001.dll pmdb049.dll pmdb031.dll pmdb039.dll pmdb088.dll
+
+nlv:	pmdb001.dll pmdb049.dll pmdb031.dll pmdb039.dll pmdb088.dll 
+
+pmdb001.dll:	./res/pmcddb001.c ./res/pmcddb001.res
+		cd ./Res && make
+		-rm pmdb001.dll
+		cp ./res/pmcddb001.dll pmdb001.dll
+
+./res/pmcddb001.res:	./res/pmcddb001.rc ./res/pmcddb001.dlg $(INC)/pmcddbres.h 
+		cd ./Res && make
+
+pmdb049.dll:	./res/pmcddb049.c ./res/pmcddb049.res
+		-rm pmdb049.dll
+		cp ./res/pmcddb049.dll pmdb049.dll
+
+./res/pmcddb049.res:	./res/pmcddb049.rc ./res/pmcddb049.dlg $(INC)/pmcddbres.h 
+		cd ./Res && make
+
+pmdb031.dll:	./res/pmcddb031.c ./res/pmcddb031.res
+		-rm pmdb031.dll
+		cp ./res/pmcddb031.dll pmdb031.dll
+
+./res/pmcddb031.res:	./res/pmcddb031.rc ./res/pmcddb031.dlg $(INC)/pmcddbres.h 
+		cd ./Res && make
+
+pmdb039.dll:	./res/pmcddb039.c ./res/pmcddb039.res
+		-rm pmdb039.dll
+		cp ./res/pmcddb039.dll pmdb039.dll
+
+./res/pmcddb039.res:	./res/pmcddb039.rc ./res/pmcddb039.dlg $(INC)/pmcddbres.h 
+		cd ./Res && make
+
+
+
+pmdb088.dll:	./res/pmcddb088.c ./res/pmcddb088.res
+		-rm pmdb088.dll
+		cp ./res/pmcddb088.dll pmdb088.dll
+
+./res/pmcddb088.res:	./res/pmcddb088.rc ./res/pmcddb088.dlg $(INC)/pmcddbres.h 
+		cd ./Res && make
+
+
+$(LIBDIR)/%.obj:	$(COMMONSRC)/%.c 
+	$(CC) -c -Wall -o$@ -Zomf -I$(INC) -I$(MOREINC) $< 
+
+cd.o:	cd.c
+		gcc -c $< -I$(INC) -Zcrtdll -Zomf
+
+helper.o:	helper.c
+		gcc -c $< -I$(INC) -Zcrtdll -Zomf
+
+message.o:	message.c
+		gcc -c $< -I$(INC) -Zcrtdll -Zomf
+
+pmcddb.exe:	pmcddb.cpp $(OBJECTS) $(LIBOBJECTS) $(CDDBOBJ) $(INC)\cddb.h $(INC)\cddb.hh
+	$(CC) $< $(CPPFLAGS) -I$(INC) -I$(MOREINC) $(LIBOBJECTS) $(OBJECTS) $(CDDBOBJ)  -lsocket -lstdc++6_dll.lib pmcddb.def
+
+cddb.o:	cddb.cpp $(INC)\cddb.hh
+		gcc -c cddb.cpp -I$(INC) -Zcrtdll -Zomf
+
+cddbcls.o:	cddbcls.cpp $(INC)\cddb.hh $(INC)\cddb.h
+		cd ../pm_launchers && make
+
+
+printHelper.o:	printHelper.cpp
+		gcc -c printHelper.cpp -I$(INC) -Zcrtdll -Zomf
+
+cddbhelper.o:	$(HELPERDIR)\cddbhelper.cpp
+		gcc -c $< -I$(INC) -Zcrtdll -Zomf
+
+clean:
+	-rm *.o
+	-rm *.exe
+	-rm *.dll
+	-cd ./res && make clean
+
+cleaner:
+	-rm *.*~
+
+	
+
Index: /tags/CWMM-0.3.0_GA/mediafolder/c/cddb/message.c
===================================================================
--- /tags/CWMM-0.3.0_GA/mediafolder/c/cddb/message.c	(revision 213)
+++ /tags/CWMM-0.3.0_GA/mediafolder/c/cddb/message.c	(revision 213)
@@ -0,0 +1,54 @@
+#define INCL_WIN
+
+#include <os2.h>
+#include <stdio.h>
+
+void errorResource(void);
+
+void errorResource()
+{
+
+  WinMessageBox(HWND_DESKTOP,0,
+                "The resource DLL which contains all the dialogs, graphics and messages cannot be loaded. \
+Please check your installation. There must be a file CDFLDxxx.DLL in the installation directory of the \
+CD-Creator package. xxx is the country code of your system e.g. 049 for Germany. If there is no \
+support for your language there must be at least the file CDFLD001.DLL. The CD creation features \
+are not avaiable!",
+"Problem with Audio/Data-CD-Creator installation",12345,
+                MB_OK|MB_MOVEABLE|MB_ERROR);
+
+}
+
+ULONG messageBox( char* text, ULONG ulTextID , LONG lSizeText,
+                  char* title, ULONG ulTitleID, LONG lSizeTitle,
+                  HMODULE hResource, HWND hwnd, ULONG ulFlags)
+{
+
+  if(!WinLoadString(WinQueryAnchorBlock(hwnd),hResource,ulTextID,lSizeText,text)) {
+    errorResource();
+    return MBID_ERROR;
+  }
+  if(!WinLoadString(WinQueryAnchorBlock(hwnd),hResource,ulTitleID,lSizeTitle,title)) {
+    errorResource();
+    return MBID_ERROR;
+  }
+  return WinMessageBox(  hwnd, hwnd, text, title, 0UL, ulFlags );
+}
+
+void getMessage(char* text,ULONG ulID, LONG lSizeText, HMODULE hResource,HWND hwnd)
+{
+  if(!WinLoadString(WinQueryAnchorBlock(hwnd),hResource,ulID,lSizeText,text)) {
+    sprintf(text,"");
+  }
+}
+
+void pmUsage()
+{
+  WinMessageBox(HWND_DESKTOP,0,
+                "This helper shouldn't be started by hand. It is called by the CD-Creator classes. \
+If you didn't launch the helper by hand you may have found a bug. Please contact the author.",
+                "Problem with Audio/Data-CD-Creator",12345,
+                MB_OK|MB_MOVEABLE|MB_ERROR);
+
+}
+
Index: /tags/CWMM-0.3.0_GA/mediafolder/c/cddb/pmcddb.cpp
===================================================================
--- /tags/CWMM-0.3.0_GA/mediafolder/c/cddb/pmcddb.cpp	(revision 213)
+++ /tags/CWMM-0.3.0_GA/mediafolder/c/cddb/pmcddb.cpp	(revision 213)
@@ -0,0 +1,710 @@
+/*
+ * pmcddb.cc (C) Chris Wohlgemuth 1999-2002
+ *
+ * This helper queries the CDDB database 
+ */
+/*
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; see the file COPYING.  If not, write to
+ * the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
+ */          
+#define INCL_DOS
+#define INCL_DOSFILEMGR
+#define INCL_DOSERRORS
+#define INCL_WIN
+
+#include <os2.h>
+#include <types.h>
+#include <sys\stat.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <io.h>
+#include <string.h>
+#include "pmcddb.h"
+#include "pmcddbres.h"
+
+#include "cddb.h"
+#include "cddb.hh"
+
+#define CDDB_OK   0
+#define CDDB_MORE 1
+#define CDDB_ERROR -1
+
+/**********************************************************/
+/* CDDB Stuff */
+
+extern int readResponse(int s, char * buffer,int size);
+/* Returns the cddb code. */
+extern int get_cddb_code( char * chrResponse);
+/* Check error codes coming from the server*/
+extern int check_cddb_code(char * chrResponse);
+/* Performing the handshake procedure with the CDDB server */
+/* s: socket handle */
+extern int cddb_handshaking(int s);
+/* s: socket handle */
+extern int cddb_setting_proto(int s);
+/* This is called if the CDDB database has got several matches for our
+   discid. We take all matches and decide later, which to use. */
+extern cddb * query_get_all_matches(int s);
+/* Query some data */
+/* With the data given we later query the
+   tracknames */
+extern cddb * cddb_query(int s, CDDBINFO *cddbInfo);
+/* Reads the CDDB banner from the server after connecting */
+/* We don't really need it so it is only shown on stderr */
+extern int cddb_banner(int s);
+/* Ask for the information about our CD. Parse it and
+   save it in the data file. */
+extern int read_and_parse(int s,cddb * Cddb);
+extern int cddb_read(int s,cddb * Cddb);
+extern int cddbConnectToHost(int * skt);
+
+extern "C" LONG CDDBDiscID(char * drive,CDDBINFO *cddbInfo);
+void extern printError(char* errorString);
+void extern printErrorCR(char* errorString);
+void extern printData(char* outString);
+
+extern "C" void removeLog(void);
+extern "C" void writeLog(char* logText);
+extern  "C" ULONG messageBox( char* text, ULONG ulTextID , LONG lSizeText,
+                  char* title, ULONG ulTitleID, LONG lSizeTitle,
+                  HMODULE hResource, HWND hwnd, ULONG ulFlags);
+extern  "C" void getMessage(char* text,ULONG ulID, LONG lSizeText, HMODULE hResource,HWND hwnd);
+extern  "C" HMODULE queryResModuleHandle2(char *installDir, char * chrBaseName);
+extern  "C" void freeResHandle();
+extern  void pmUsage();
+extern  "C" void HlpSendCommandToObject(char* chrObject, char* command);
+extern "C" ULONG cwQueryOSRelease(void);
+void HlpSendCommandToObject(char* chrObject, char* command);
+
+MRESULT EXPENTRY cddbDialogProc(HWND hwnd, ULONG msg, MPARAM mp1, MPARAM mp2) ;
+
+//#define DEBUG
+
+char chrCDDBDir[CCHMAXPATH];
+char chrInstallDir[CCHMAXPATH];
+char chrBinDir[CCHMAXPATH];
+char chrCDDrive[3]="N:";
+char *chrRexxFile="";
+char *chrFolder="";
+
+int numArgs;
+char* params[4]={"","","",""};
+
+HMODULE RESSOURCEHANDLE=0;
+
+char logName[CCHMAXPATH]=PMCDDB_LOGFILENAME;
+char logNameFullPath[CCHMAXPATH];
+
+#define QUERYCDDB_VERSION "0.1"
+
+int port=8880;
+char host[1000]="gnudb.gnudb.org";
+char username[1000]={0};
+char hostname[1000]={0};
+char clientname[100]="Audio-CD-Creator";
+char version[100];
+int s; /* Socket */
+#define MAXSERVERS 10
+char cddbServer[MAXSERVERS][100];
+int NUMSERVERS= 3;
+
+cddb * Cddb;
+char cddbDataFile[CCHMAXPATH]="";
+
+HWND hwndError;
+HWND hwndDialog;
+HWND hwndNotify;
+
+ULONG launchRexx( char* pszTitle, char* rexxFile, char* parameters)
+{
+  STARTDATA startData={0};
+  APIRET rc;
+  PID pid;
+  ULONG ulSessionID=0;
+  char chrLoadError[CCHMAXPATH];
+  char startParams[CCHMAXPATH*4];
+  char tempText[CCHMAXPATH]= {0};
+  char *charPtr;
+  char trackname[CCHMAXPATH];
+    
+  memset(&startData,0,sizeof(startData));
+  startData.Length=sizeof(startData);
+  startData.Related=SSF_RELATED_INDEPENDENT;
+  startData.FgBg=SSF_FGBG_BACK;
+  startData.TraceOpt=SSF_TRACEOPT_NONE;
+  startData.PgmTitle=(PSZ)pszTitle;
+  
+  startData.PgmName=(PSZ)"cmd.exe";
+  startData.InheritOpt=SSF_INHERTOPT_SHELL;
+  startData.SessionType=SSF_TYPE_WINDOWABLEVIO;
+  startData.PgmControl|=SSF_CONTROL_INVISIBLE;//|SSF_CONTROL_MAXIMIZE|SSF_CONTROL_NOAUTOCLOSE;
+  startData.InitXPos=30;
+  startData.InitYPos=30;
+  startData.InitXSize=500;
+  startData.InitYSize=400;
+  startData.ObjectBuffer=(PSZ)chrLoadError;
+  startData.ObjectBuffLen=(ULONG)sizeof(chrLoadError);
+
+  sprintf(startParams," /C \" \"%s\" %s \"", rexxFile, parameters);
+  startData.PgmInputs=(PSZ)startParams;
+
+  writeLog("Trying to start ");
+  writeLog(rexxFile);
+  writeLog("\n");
+  rc=DosStartSession(&startData,&ulSessionID,&pid);   
+  return rc;   
+}
+
+BOOL readCDDBIni()
+{
+  ULONG keyLength;
+  char profileName[CCHMAXPATH];
+  char moduleName[CCHMAXPATH];
+  char *chrPtr;
+  char *chrPtr2;
+  HINI hini=0;
+  char    text[200];
+  ULONG ulSize;
+  int a;
+  char chrCD[4];
+  BOOL bError=FALSE;
+  HWND hwnd;
+
+  hwnd=HWND_DESKTOP;
+
+  /* Insert message in Logfile */
+  writeLog("Reading values from cddb.ini\n");
+
+  /* Build full path for cddb.ini file */
+  sprintf(profileName,"%s\\cddb.ini", chrInstallDir);       
+  /* Open ini-file */
+  hini=PrfOpenProfile(WinQueryAnchorBlock(HWND_DESKTOP),(PCSZ)profileName);
+  do{
+    if(!hini) {
+      writeLog("Can't open INI file.\n");
+      /* profileName: "Warning! Cannot open Ini-file!"
+         moduleName: "Data-CD-Creator"
+         */
+      messageBox( profileName, IDSTR_INIFILEOPENWARNING , sizeof(profileName),
+                  moduleName, IDSTR_PMCDDBTITLE, sizeof(moduleName),
+                  RESSOURCEHANDLE, HWND_DESKTOP, MB_OK | MB_ICONEXCLAMATION|MB_MOVEABLE);
+      break;
+    }/* end of if(!hini) */
+
+    NUMSERVERS=PrfQueryProfileInt(hini,(PCSZ)"cddb",(PCSZ)"numservers",0);
+    PrfQueryProfileString(hini,(PCSZ)"cddb",(PCSZ)"cddbuser",(PCSZ) "guest",username,sizeof(username));
+    PrfQueryProfileString(hini,(PCSZ)"cddb",(PCSZ)"cddbuserhost",(PCSZ) "",hostname,sizeof(hostname));
+
+    strncpy(version,QUERYCDDB_VERSION,sizeof(version));
+
+    if(NUMSERVERS==0) {
+      strncpy(cddbServer[0],"gnudb.gnudb.org:8880",sizeof(cddbServer[0]));
+      NUMSERVERS=1;
+    }
+    else {
+      if(NUMSERVERS>MAXSERVERS) 
+        NUMSERVERS=MAXSERVERS;
+      /* Read the servers from ini */
+      for(a=0;a<NUMSERVERS;a++) {
+        sprintf(text,"cddbserver%d",a+1);
+        PrfQueryProfileString(hini,(PCSZ)"cddb",(PCSZ)text,(PCSZ)"",cddbServer[a],sizeof(cddbServer[0]));
+      }
+    }
+    if(hini)
+      PrfCloseProfile(hini);
+
+    if(strlen(username)==0)
+      break;    
+    if(strlen(hostname)==0)
+      break;    
+    
+    return TRUE;
+  }while(TRUE);
+  writeLog("\nError while reading values from cddb.ini.\n");
+  writeLog("Make sure your username and your host are set.\n");
+
+  messageBox( profileName, IDSTR_SETUPERROR , sizeof(profileName),
+              moduleName, IDSTR_PMCDDBTITLE, sizeof(moduleName),
+              RESSOURCEHANDLE, HWND_DESKTOP, MB_OK | MB_ICONEXCLAMATION|MB_MOVEABLE);
+
+  HlpSendCommandToObject("<CWFREEDB_CLIENT_CONFIG>", "OPEN=DEFAULT;");
+  
+  return FALSE;
+}
+
+void printCddbList(cddb * Cddb)
+{
+  cddb * tmpCddb;
+  char text[400];
+  int iNum;
+
+  tmpCddb=Cddb;
+  iNum=0;
+
+  printError("\n-------------------\n");
+  printError("CDDB database returned the following match(es):\n");
+
+  while (tmpCddb) {/* Print data of every match */
+    /* Print our data */
+    iNum++;
+    /* Print it to log */
+    sprintf(text,"%d:   Title: %s   Artist: %s"
+            ,iNum,tmpCddb->title,tmpCddb->artist);
+    printError(text);
+    printError("\n");
+    /* Insert into Listbox */
+    WinSendMsg(WinWindowFromID(hwndDialog, IDLB_CDDBCHOOSE), LM_INSERTITEM,MPFROMSHORT(LIT_END),text);   
+    tmpCddb=tmpCddb->getNextCddb();
+  }/* while */
+  /* Preselect the first item */
+  WinSendMsg(WinWindowFromID(hwndDialog, IDLB_CDDBCHOOSE), LM_SELECTITEM,MPFROMSHORT(LIT_FIRST),MPFROMSHORT(TRUE));   
+
+  printError("-------------------\n");
+
+}
+
+/* Return the chosen cddb data set from the list of cddb data sets */
+cddb* choseCddb(cddb* Cddb, SHORT a)
+{
+  int iNum;
+  cddb * tmpCddb;
+  char buffer[10]={0};
+  char * rc;
+
+  iNum=0;
+  tmpCddb=Cddb;
+  /* Count the matches */
+  while (tmpCddb) {
+    iNum++;
+    tmpCddb=tmpCddb->getNextCddb();
+  }/* while */
+
+
+  iNum=1;
+  tmpCddb=Cddb;
+  /* Get the cddb */
+  while (iNum!=a) {
+    iNum++;
+    tmpCddb=tmpCddb->getNextCddb();
+  }/* while */
+
+  return tmpCddb;
+}
+
+int queryServer()
+{
+  CDDBINFO cddbInfo;
+  char text[100];
+  SHORT a;
+  int b;
+  char *chrPtr;
+  struct stat statBuf;
+
+  Cddb=NULL;
+
+  /* Get track data for CDDB query.
+     This function calculates the diskID and the
+     length of the tracks of the inserted CD.
+     We use the data to perform the database query. */
+
+  if(!CDDBDiscID(chrCDDrive, &cddbInfo)) {
+    printError("Cannot query track data for calculating diskID.\nMake sure an audio CD is inserted." );
+    writeLog("Cannot query track data for calculating diskID.\nMake sure an audio CD is inserted.\n");
+    /*    WinPostMsg(hwndNotify,WM_APPTERMINATENOTIFY,MPFROMLONG(ACKEY_CDDBQUERY),MPFROMLONG(0)); */
+    return -1;
+  }
+
+  /* Tell the caller, that we start a CDDB query. The caller may go on in the meantime */
+  /*WinPostMsg(hwndNotify, WM_APPTERMINATENOTIFY,MPFROMLONG(ACKEY_CDDBQUERY),MPFROMLONG(0));*/
+  sprintf(text,"%08x",cddbInfo.discid);
+  strcat(cddbDataFile,text);/* Build the name of the cddb data file */
+  writeLog("CDDB datafile name is: ");
+  writeLog(cddbDataFile);
+  writeLog("\n");
+  if(stat(cddbDataFile , &statBuf)!=-1) {
+    writeLog("Found CDDB data in cache directory. DB query finished.\n");
+    /*    WinPostMsg(hwndNotify,WM_APPTERMINATENOTIFY,MPFROMLONG(ACKEY_CDDBQUERY),MPFROMLONG(1)); */
+    return 0;/* We have already a cddb data file from a previous query, so we are ready. */
+  }
+
+  for(b=0;b<NUMSERVERS;b++) {/* Query the whole list of servers if necessary */
+    strncpy(host,cddbServer[b],sizeof(host) - 1);
+    chrPtr=strrchr(host,':');
+    if(chrPtr) {
+      *chrPtr=0;
+      chrPtr++;
+      port=atoi(chrPtr);
+    }
+    /* Report what we're doing */
+    sprintf(text,"SETSTATUSTEXT=Trying %s:%d...",host,port);
+    /* Set statusline of folder */
+    HlpSendCommandToObject(chrFolder, text);
+    sprintf(text,"\nTrying %s:%d...",host,port);
+    printErrorCR(text);
+
+    /* Connect to cddb-host */
+    if(!cddbConnectToHost(&s)) {    
+      /* Query the database */
+      do {
+        /* Getting CDDB banner */
+        if(cddb_banner(s))
+          break; /* Error */
+    
+        /* Setting protocol level */
+        if(cddb_setting_proto(s))
+          break;
+    
+        /* Handshaking */
+        if(cddb_handshaking(s))
+          break;
+    
+        /* Query disc */
+        /* If there're several matches this call returns 
+           a linked list of all matches. We let the user
+           decide later, which match to use. */ 
+        Cddb=cddb_query(s, &cddbInfo);
+
+        if(!Cddb)
+          break; /* no list, so break */
+
+        /* Let the user decide which match to use */
+        /* If the head of the list has iFuzzy set
+           to one we have to choose. */
+        if(Cddb->getFuzzyOrN()) {
+          /* Show the dialog with the list of matches */
+          a=(SHORT)WinDlgBox( HWND_DESKTOP, NULLHANDLE, cddbDialogProc, RESSOURCEHANDLE, IDDLG_CDDBCHOOSE , 0 );        
+          sprintf(text,"Selection: %d",a);
+          /* WinMessageBox(  HWND_DESKTOP,   HWND_DESKTOP, text, "Debug", 0UL, MB_OK | MB_ICONEXCLAMATION|MB_MOVEABLE ); */
+          if(a==LIT_NONE) {
+            /* User pressed cancel */
+            if(Cddb)
+              delete(Cddb);
+            write(s,"QUIT\r\n",6);
+            close(s);
+            return -1; 
+          }
+          Cddb=choseCddb(Cddb,a);
+        }    
+        
+        if(!Cddb)
+          break; /* no choice, so break */
+      
+        /* Query tracks of match 'Cddb' */
+        /* The track names are put into a linked
+           list in Cddb. */
+        if(cddb_read(s,Cddb)==CDDB_ERROR)
+          break;
+      
+        /* Print the queried data */
+        /* The data is already printed in cddb.cpp to the given datafile */
+        //    printQueriedData(Cddb, &cddbInfo);
+        
+
+        /* everything's ok */
+        write(s,"QUIT\r\n",6);
+        close(s);
+        delete(Cddb);
+        /*        WinPostMsg(hwndNotify,WM_APPTERMINATENOTIFY,MPFROMLONG(ACKEY_CDDBQUERY),MPFROMLONG(1)); */
+        sprintf(text,"SETSTATUSTEXT=CDDB data found.");
+        return 0;  
+      } while(TRUE);        
+      if(Cddb)
+        delete(Cddb);
+      /* Error */
+      write(s,"QUIT\r\n",6);
+      close(s);
+    }
+  }/* for */
+  /*  WinPostMsg(hwndNotify,WM_APPTERMINATENOTIFY,MPFROMLONG(ACKEY_CDDBQUERY),MPFROMLONG(1)); */
+  printError("Can't get data...");
+  HlpSendCommandToObject(chrFolder, "SETSTATUSTEXT=Can't get CDDB data...");
+  return -1;
+}
+
+MRESULT EXPENTRY cddbObjectProc(HWND hwnd, ULONG msg, MPARAM mp1, MPARAM mp2) 
+{
+  switch(msg)
+    {
+    case WM_APPTERMINATENOTIFY:
+      /* This queue is blocked until the query is over. This is the reason we've chosen an object window. */
+      if(!queryServer()) {
+        char rexxParams[CCHMAXPATH*3];
+        sprintf(rexxParams, /*sizeof(rexxParams),*/ "\"%s\" \"%s\" \"%s\"", chrCDDrive, cddbDataFile, params[3]);
+        launchRexx( "Set tracknames", chrRexxFile, rexxParams);      
+      }
+      WinPostMsg(hwnd,WM_QUIT,(MPARAM)0,(MPARAM)0);
+      return FALSE;
+    default:
+      break;
+    }
+  return WinDefWindowProc( hwnd, msg, mp1, mp2);
+}
+
+MRESULT EXPENTRY cddbDialogProc(HWND hwnd, ULONG msg, MPARAM mp1, MPARAM mp2) 
+{
+
+  char text[CCHMAXPATH];
+  char statusText[CCHMAXPATH];
+  short a;
+  ULONG rc;
+  SWCNTRL swctl;
+  PID pid;
+
+  switch(msg)
+    {
+    case WM_INITDLG:   
+
+#ifdef DEBUG
+      sprintf(text,"Params:\n");  
+      for(a=0;a<numArgs;a++) {
+        strcat(text,params[a]);
+        strcat(text,"\n");
+      }
+      WinMessageBox(  HWND_DESKTOP,   HWND_DESKTOP, text, "Debug", 0UL, MB_OK | MB_ICONEXCLAMATION|MB_MOVEABLE );
+#endif
+
+      /* Add switch entry */
+      memset(&swctl,0,sizeof(swctl));
+      WinQueryWindowProcess(hwnd,&pid,NULL);
+      swctl.hwnd=hwnd;
+      swctl.uchVisibility=SWL_VISIBLE;
+      swctl.idProcess=pid;
+      swctl.bProgType=PROG_DEFAULT;
+      swctl.fbJump=SWL_JUMPABLE;
+      WinAddSwitchEntry(&swctl);
+
+      hwndError=WinWindowFromID(hwnd,3102);
+      hwndDialog=hwnd;
+
+      /* Set dialog font to WarpSans for Warp 4 and above */
+      if(cwQueryOSRelease()>=40) {
+        WinSetPresParam(hwnd,
+                        PP_FONTNAMESIZE,(ULONG)sizeof(DEFAULT_DIALOG_FONT),
+                        (PVOID) DEFAULT_DIALOG_FONT );
+      }
+
+      /*      sprintf(text,"1.Eintrag");
+              WinSendMsg(WinWindowFromID(hwndDialog,3101), LM_INSERTITEM,MPFROMSHORT(LIT_END),text);   
+              sprintf(text,"2.Eintrag");
+              WinSendMsg(WinWindowFromID(hwndDialog,3101), LM_INSERTITEM,MPFROMSHORT(LIT_END),text);   
+              WinShowWindow(hwndDialog,TRUE);
+              for(a=0;a<4;a++) {
+              sprintf(text,cddbServer[a]);
+              WinSendMsg(WinWindowFromID(hwndDialog,3101), LM_INSERTITEM,MPFROMSHORT(LIT_END),text);       
+              }*/
+      printCddbList(Cddb);           
+      return (MRESULT) TRUE;
+    case WM_CLOSE:
+      WinPostMsg(hwnd,WM_QUIT,0,0);
+      return 0;
+    case WM_DESTROY:
+      /* The dialog closes and gets destroyed */     
+      break;    
+    case WM_COMMAND:    
+      switch(SHORT1FROMMP(mp1))
+        {
+        case IDPB_OK:        
+          /* Query selection */
+          a=SHORT1FROMMR(WinSendMsg(WinWindowFromID(hwnd, IDLB_CDDBCHOOSE),LM_QUERYSELECTION,MPFROMSHORT(LIT_FIRST),0));
+          if(a==LIT_NONE)
+            break;
+          WinDismissDlg(hwnd,a+1);
+          break;             
+        case IDPB_CANCEL:
+          WinDismissDlg(hwnd, (ULONG)LIT_NONE);
+          break;
+        default:
+          break;
+        }
+      return (MRESULT) TRUE;
+    default:
+      break;
+    }
+  return WinDefDlgProc(hwnd, msg, mp1, mp2);    
+}
+
+void config(char * theAddress)
+{
+  char *chrPtr;
+  char profileName[CCHMAXPATH];
+  HINI hini=0;
+
+  if((chrPtr=strchr(theAddress,'@'))==NULLHANDLE)
+    return;
+
+  *chrPtr=0;
+  chrPtr++;
+  strncpy(username, theAddress, sizeof(username)-1);
+  strncpy(hostname, chrPtr, sizeof(hostname)-1);
+  /* Save it to ini */
+
+  /* Insert message in Logfile */
+  writeLog("Reading values from cddb.ini\n");
+
+  /* Build full path for cddb.ini file */
+  sprintf(profileName,"%s\\cddb.ini", chrInstallDir);       
+  /* Open ini-file */
+  hini=PrfOpenProfile(WinQueryAnchorBlock(HWND_DESKTOP),(PCSZ)profileName);
+  if(hini) {
+    writeLog("INI file opened.\n");
+    PrfWriteProfileString(hini,(PCSZ)"cddb",(PCSZ)"cddbuserhost", (PCSZ)hostname);
+    PrfWriteProfileString(hini,(PCSZ)"cddb",(PCSZ)"cddbuser",(PCSZ) username);
+    PrfCloseProfile(hini);
+  }/* end of if(hini) */
+  else {
+    writeLog("Can't open INI file to save address.\n");
+  }
+}
+
+void usage(char * chrProgName)
+{
+  HAB  hab;
+  HMQ  hmq;
+  QMSG qmsg;
+
+  hab=WinInitialize(0);
+  if(hab) {
+    hmq=WinCreateMsgQueue(hab,0);
+    if(hmq) {
+      /* We need a message queue for dialog boxes */
+      char title[100];
+      char text[500];
+
+      RESSOURCEHANDLE=queryResModuleHandle2(chrInstallDir, RESDLL_BASENAME);
+
+      messageBox( text, IDSTR_USAGE , sizeof(text),
+                  title, IDSTR_PMCDDBTITLE, sizeof(title),
+                  RESSOURCEHANDLE, HWND_DESKTOP, MB_OK | MB_MOVEABLE);
+
+      freeResHandle();
+      
+      WinDestroyMsgQueue(hmq);
+    }
+    WinTerminate(hab);
+  }
+
+}
+
+int main (int argc, char *argv[])
+{
+  HAB  hab;
+  HMQ  hmq;
+  QMSG qmsg;
+  char *chrPtr;
+  short a;
+
+  ULONG fl;
+  HWND hwndClient;
+
+  /* Create a copy of the args */
+  /* argv[0]: progname
+   * argv[1]: cd drive or /C for configuring
+   * argv[2]: REXX file. This file is used to parse the queried data file and
+   *          set all the info of the CD track objects.
+   *          When configuring argv[2] is the email address.
+   * argv[3]: folder path
+   */
+
+  numArgs=argc;
+
+  for(a=0;a<argc;a++)
+    {
+      params[a]=argv[a];
+    }
+
+  strncpy(chrBinDir, argv[0], sizeof(chrBinDir)-1);
+  if((chrPtr=strrchr(chrBinDir, '\\'))!=NULLHANDLE)
+    *chrPtr=0;
+  strncpy(chrInstallDir, chrBinDir, sizeof(chrInstallDir)-1);
+
+  if(numArgs<3) {
+    usage(argv[0]);
+    exit(1);
+  }
+
+  /* Build the cache directory location */
+  strncpy(chrCDDBDir, chrInstallDir, sizeof(chrCDDBDir)-1);
+  sprintf(chrCDDBDir, "%s\\cddbdata",chrInstallDir);
+  sprintf(cddbDataFile, "%s\\",chrCDDBDir);
+
+  strncpy(chrCDDrive, argv[1],sizeof(chrCDDrive)-1);
+  params[1]=chrInstallDir; /* For writeLog */
+  if(!stricmp(argv[1],"/c")) /* Configure E-Mail address */
+    {
+      config(argv[2]);
+      exit(0);
+    }
+  chrRexxFile=argv[2];
+  chrFolder=argv[3];
+
+  hab=WinInitialize(0);
+  if(hab) {
+    hmq=WinCreateMsgQueue(hab,0);
+    if(hmq) {
+      removeLog();
+
+      /*WinMessageBox(HWND_DESKTOP, HWND_DESKTOP, chrInstallDir, "", 123, MB_MOVEABLE);*/
+      writeLog(argv[0]);
+      writeLog(" started with the following parameters:\n\n");
+      for(a=0;a<argc;a++)
+        {
+          writeLog(argv[a]);
+          writeLog("\n");
+        }
+      writeLog("\n");
+
+      /* Check if user started prog by hand */   
+      if(!(argc<5))
+        {/*pmUsage();*/
+        }
+      else {
+        /* The window we notify after getting the cddb data */
+        /*        hwndNotify=atol(params[3]);*/
+        /* Get our ressource dll */  
+        RESSOURCEHANDLE=queryResModuleHandle2(chrInstallDir, RESDLL_BASENAME);
+        /* Load options from cdrecord.ini */
+        if(readCDDBIni()) {
+          /*        sprintf(cddbDataFile,"%s\\cddbdata\\",params[1]); */
+          writeLog("\nCache directory is: ");
+          writeLog(cddbDataFile);
+          writeLog("\n\n");
+          /* Object window creation */
+          hwndClient=WinCreateWindow(HWND_OBJECT,WC_STATIC,(PCSZ)"cddbObject",0,0,0,0,0,NULL,HWND_BOTTOM,12343,NULL,NULL);
+          if(hwndClient) {
+            WinSubclassWindow(hwndClient,&cddbObjectProc);
+            /* Window created. */             
+            WinPostMsg(hwndClient,WM_APPTERMINATENOTIFY,NULL,NULL); /* Let's start */
+            while(WinGetMsg(hab,&qmsg,(HWND)NULL,0,0))
+              WinDispatchMsg(hab,&qmsg);
+            WinDestroyWindow(hwndClient);
+          }
+          freeResHandle();
+        }
+      }
+      WinDestroyMsgQueue(hmq);
+    }
+    WinTerminate(hab);
+  }
+  return 0;
+}
+
+
+
+
+
+
+
+
+
Index: /tags/CWMM-0.3.0_GA/mediafolder/c/cddb/printhelper.cpp
===================================================================
--- /tags/CWMM-0.3.0_GA/mediafolder/c/cddb/printhelper.cpp	(revision 213)
+++ /tags/CWMM-0.3.0_GA/mediafolder/c/cddb/printhelper.cpp	(revision 213)
@@ -0,0 +1,68 @@
+/*
+ * This file is (C) Chris Wohlgemuth 1999/2000
+ */
+/*
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; see the file COPYING.  If not, write to
+ * the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+
+#include <os2.h>
+#include <stdio.h> /* For stderr */
+#include <string.h>
+#include <io.h>
+#include <fcntl.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+
+/**********************************************************/
+/* Some helper functions
+ */
+
+void printError(char* errorString)
+{
+  fprintf(stderr,"%s",errorString);
+}
+
+void printErrorCR(char* errorString)
+{
+  fprintf(stderr,"%s\n",errorString);
+}
+
+
+void printData(char* outString)
+{
+  int fileHandle;
+  int rc;
+
+  fileHandle=open("cddb.out",O_APPEND|O_TEXT|O_WRONLY|O_CREAT,S_IWRITE);
+  if(fileHandle==-1) {
+    printError("Cannot open cddb.out");
+    return;
+  }
+  rc= write(fileHandle,outString,strlen(outString));
+  // write(fileHandle,"\n",sizeof("\n"));
+  close(fileHandle);
+  return;
+}
+
+
+
+
+
+
+
+
+
+
+
Index: /tags/CWMM-0.3.0_GA/mediafolder/c/cddb/res/def001.tpl
===================================================================
--- /tags/CWMM-0.3.0_GA/mediafolder/c/cddb/res/def001.tpl	(revision 213)
+++ /tags/CWMM-0.3.0_GA/mediafolder/c/cddb/res/def001.tpl	(revision 213)
@@ -0,0 +1,24 @@
+# Note: lines starting with '#' are comments.
+
+[DESCRIPTION]
+EN PMcddb Resource-DLL
+
+[COPYRIGHT]
+(c) C. Wohlgemuth 2002-2005 Netlabs CWMM Team 2023
+
+[AUTHOR]
+Netlabs CWMM Team
+
+[NAME]
+# This is the NAME xxx WINDOWAPI|etc line in the def file.
+# Important: it specifies the internal name of the program. Don't leave out!
+LIBRARY PMDB001 INITINSTANCE TERMINSTANCE
+
+[BUILDMACHINE]
+Zobopeep
+
+[OTHER]
+# Add all the lines here you want to have at the end of the generated DEF file
+DATA MULTIPLE NONSHARED
+EXPORTS
+      queryLanguage 
Index: /tags/CWMM-0.3.0_GA/mediafolder/c/cddb/res/def007.tpl
===================================================================
--- /tags/CWMM-0.3.0_GA/mediafolder/c/cddb/res/def007.tpl	(revision 213)
+++ /tags/CWMM-0.3.0_GA/mediafolder/c/cddb/res/def007.tpl	(revision 213)
@@ -0,0 +1,24 @@
+# Note: lines starting with '#' are comments.
+
+[DESCRIPTION]
+RU PMcddb Resource-DLL
+
+[COPYRIGHT]
+(c) C. Wohlgemuth 2002-2005 Netlabs CWMM Team 2023
+
+[AUTHOR]
+Netlabs CWMM Team
+
+[NAME]
+# This is the NAME xxx WINDOWAPI|etc line in the def file.
+# Important: it specifies the internal name of the program. Don't leave out!
+LIBRARY PMDB007 INITINSTANCE TERMINSTANCE
+
+[BUILDMACHINE]
+Zobopeep
+
+[OTHER]
+# Add all the lines here you want to have at the end of the generated DEF file
+DATA MULTIPLE NONSHARED
+EXPORTS
+      queryLanguage 
Index: /tags/CWMM-0.3.0_GA/mediafolder/c/cddb/res/def031.tpl
===================================================================
--- /tags/CWMM-0.3.0_GA/mediafolder/c/cddb/res/def031.tpl	(revision 213)
+++ /tags/CWMM-0.3.0_GA/mediafolder/c/cddb/res/def031.tpl	(revision 213)
@@ -0,0 +1,24 @@
+# Note: lines starting with '#' are comments.
+
+[DESCRIPTION]
+NL PMcddb Resource-DLL
+
+[COPYRIGHT]
+(c) C. Wohlgemuth 2002-2005 Netlabs CWMM Team 2023
+
+[AUTHOR]
+Netlabs CWMM Team
+
+[NAME]
+# This is the NAME xxx WINDOWAPI|etc line in the def file.
+# Important: it specifies the internal name of the program. Don't leave out!
+LIBRARY PMDB031 INITINSTANCE TERMINSTANCE
+
+[BUILDMACHINE]
+Zobopeep
+
+[OTHER]
+# Add all the lines here you want to have at the end of the generated DEF file
+DATA MULTIPLE NONSHARED
+EXPORTS
+      queryLanguage 
Index: /tags/CWMM-0.3.0_GA/mediafolder/c/cddb/res/def033.tpl
===================================================================
--- /tags/CWMM-0.3.0_GA/mediafolder/c/cddb/res/def033.tpl	(revision 213)
+++ /tags/CWMM-0.3.0_GA/mediafolder/c/cddb/res/def033.tpl	(revision 213)
@@ -0,0 +1,24 @@
+# Note: lines starting with '#' are comments.
+
+[DESCRIPTION]
+FR PMcddb Resource-DLL
+
+[COPYRIGHT]
+(c) C. Wohlgemuth 2002-2005 Netlabs CWMM Team 2023
+
+[AUTHOR]
+Netlabs CWMM Team
+
+[NAME]
+# This is the NAME xxx WINDOWAPI|etc line in the def file.
+# Important: it specifies the internal name of the program. Don't leave out!
+LIBRARY PMDB033 INITINSTANCE TERMINSTANCE
+
+[BUILDMACHINE]
+Zobopeep
+
+[OTHER]
+# Add all the lines here you want to have at the end of the generated DEF file
+DATA MULTIPLE NONSHARED
+EXPORTS
+      queryLanguage 
Index: /tags/CWMM-0.3.0_GA/mediafolder/c/cddb/res/def034.tpl
===================================================================
--- /tags/CWMM-0.3.0_GA/mediafolder/c/cddb/res/def034.tpl	(revision 213)
+++ /tags/CWMM-0.3.0_GA/mediafolder/c/cddb/res/def034.tpl	(revision 213)
@@ -0,0 +1,24 @@
+# Note: lines starting with '#' are comments.
+
+[DESCRIPTION]
+ES PMcddb Resource-DLL
+
+[COPYRIGHT]
+(c) C. Wohlgemuth 2002-2005 Netlabs CWMM Team 2023
+
+[AUTHOR]
+Netlabs CWMM Team
+
+[NAME]
+# This is the NAME xxx WINDOWAPI|etc line in the def file.
+# Important: it specifies the internal name of the program. Don't leave out!
+LIBRARY PMDB034 INITINSTANCE TERMINSTANCE
+
+[BUILDMACHINE]
+Zobopeep
+
+[OTHER]
+# Add all the lines here you want to have at the end of the generated DEF file
+DATA MULTIPLE NONSHARED
+EXPORTS
+      queryLanguage 
Index: /tags/CWMM-0.3.0_GA/mediafolder/c/cddb/res/def039.tpl
===================================================================
--- /tags/CWMM-0.3.0_GA/mediafolder/c/cddb/res/def039.tpl	(revision 213)
+++ /tags/CWMM-0.3.0_GA/mediafolder/c/cddb/res/def039.tpl	(revision 213)
@@ -0,0 +1,24 @@
+# Note: lines starting with '#' are comments.
+
+[DESCRIPTION]
+IT PMcddb Resource-DLL
+
+[COPYRIGHT]
+(c) C. Wohlgemuth 2002-2005 Netlabs CWMM Team 2023
+
+[AUTHOR]
+Netlabs CWMM Team
+
+[NAME]
+# This is the NAME xxx WINDOWAPI|etc line in the def file.
+# Important: it specifies the internal name of the program. Don't leave out!
+LIBRARY PMDB039 INITINSTANCE TERMINSTANCE
+
+[BUILDMACHINE]
+Zobopeep
+
+[OTHER]
+# Add all the lines here you want to have at the end of the generated DEF file
+DATA MULTIPLE NONSHARED
+EXPORTS
+      queryLanguage 
Index: /tags/CWMM-0.3.0_GA/mediafolder/c/cddb/res/def049.tpl
===================================================================
--- /tags/CWMM-0.3.0_GA/mediafolder/c/cddb/res/def049.tpl	(revision 213)
+++ /tags/CWMM-0.3.0_GA/mediafolder/c/cddb/res/def049.tpl	(revision 213)
@@ -0,0 +1,24 @@
+# Note: lines starting with '#' are comments.
+
+[DESCRIPTION]
+DE PMcddb Resource-DLL
+
+[COPYRIGHT]
+(c) C. Wohlgemuth 2002=2005 Netlabs CWMM Team 2023
+
+[AUTHOR]
+Netlabs CWMM Team
+
+[NAME]
+# This is the NAME xxx WINDOWAPI|etc line in the def file.
+# Important: it specifies the internal name of the program. Don't leave out!
+LIBRARY PMDB049 INITINSTANCE TERMINSTANCE
+
+[BUILDMACHINE]
+Zobopeep
+
+[OTHER]
+# Add all the lines here you want to have at the end of the generated DEF file
+DATA MULTIPLE NONSHARED
+EXPORTS
+      queryLanguage 
Index: /tags/CWMM-0.3.0_GA/mediafolder/c/cddb/res/def088.tpl
===================================================================
--- /tags/CWMM-0.3.0_GA/mediafolder/c/cddb/res/def088.tpl	(revision 213)
+++ /tags/CWMM-0.3.0_GA/mediafolder/c/cddb/res/def088.tpl	(revision 213)
@@ -0,0 +1,24 @@
+# Note: lines starting with '#' are comments.
+
+[DESCRIPTION]
+TW PMcddb Resource-DLL
+
+[COPYRIGHT]
+(c) C. Wohlgemuth 2002-2005 Netlabs CWMM Team 2023
+
+[AUTHOR]
+Netlabs CWMM Team
+
+[NAME]
+# This is the NAME xxx WINDOWAPI|etc line in the def file.
+# Important: it specifies the internal name of the program. Don't leave out!
+LIBRARY PMDB088 INITINSTANCE TERMINSTANCE
+
+[BUILDMACHINE]
+Zobopeep
+
+[OTHER]
+# Add all the lines here you want to have at the end of the generated DEF file
+DATA MULTIPLE NONSHARED
+EXPORTS
+      queryLanguage 
Index: /tags/CWMM-0.3.0_GA/mediafolder/c/cddb/res/makefile
===================================================================
--- /tags/CWMM-0.3.0_GA/mediafolder/c/cddb/res/makefile	(revision 213)
+++ /tags/CWMM-0.3.0_GA/mediafolder/c/cddb/res/makefile	(revision 213)
@@ -0,0 +1,91 @@
+# Makefile for Audio-CD copy
+include ../../../../make.inc
+
+CC           = icc
+CPPFLAGSVAC  = /Ge- /Gm+ /G4 /Gl  /O+ /Oc+ /Ol- /Q+
+CPPFLAGS  =  -Zdll -Zmt
+INC		= ../../../include
+DEFS         =
+PROGS        =
+ODIR		= .
+CPPDIR	= .
+BINDIR		=	../../dist/bin
+HELPERDIR	=	..\helper
+#TOOLDIR =      $(BUILD_ROOT)/classes/mm-progs
+CPPFILES	=
+all:	 pmcddb001.dll pmcddb007.dll pmcddb049.dll pmcddb031.dll pmcddb039.dll pmcddb088.dll pmcddb033.dll pmcddb034.dll
+
+
+
+pmcddb001.dll:	pmcddb001.c pmcddb001.res
+		cmd /C $(TOOLDIR)/create_def.cmd pmcddb001.def def001.tpl
+		$(CC) $(CPPFLAGSVAC) -I$(INC) pmcddb001.c pmcddb001.def
+		rc pmcddb001.res pmcddb001.dll
+
+pmcddb001.res:	pmcddb001.rc pmcddb001.dlg $(INC)\pmcddbres.h
+		rc  -i $(INC) -r pmcddb001.rc
+
+pmcddb007.dll:	pmcddb007.c pmcddb007.res
+		cmd /C $(TOOLDIR)/create_def.cmd pmcddb007.def def007.tpl
+		$(CC) $(CPPFLAGSVAC) -I$(INC) pmcddb007.c pmcddb007.def
+		rc pmcddb007.res pmcddb007.dll
+
+pmcddb007.res:	pmcddb007.rc pmcddb007.dlg $(INC)\pmcddbres.h
+		rc  -i $(INC) -r pmcddb007.rc
+		
+pmcddb049.dll:	pmcddb049.c pmcddb049.res
+		cmd /C $(TOOLDIR)/create_def.cmd pmcddb049.def def049.tpl
+		$(CC) $(CPPFLAGSVAC) -I$(INC) pmcddb049.c pmcddb049.def
+		rc pmcddb049.res pmcddb049.dll
+
+pmcddb049.res:	pmcddb049.rc pmcddb049.dlg $(INC)\pmcddbres.h
+		rc  -i $(INC) -r pmcddb049.rc
+
+pmcddb031.dll:	pmcddb031.c pmcddb031.res
+		cmd /C $(TOOLDIR)/create_def.cmd pmcddb031.def def031.tpl
+		$(CC) $(CPPFLAGSVAC) -I$(INC) pmcddb031.c pmcddb031.def
+		rc pmcddb031.res pmcddb031.dll
+
+pmcddb031.res:	pmcddb031.rc pmcddb031.dlg $(INC)\pmcddbres.h
+		rc  -i $(INC) -r pmcddb031.rc
+
+pmcddb039.dll:	pmcddb039.c pmcddb039.res
+		cmd /C $(TOOLDIR)/create_def.cmd pmcddb039.def def039.tpl
+		$(CC) $(CPPFLAGSVAC) -I$(INC) pmcddb039.c pmcddb039.def
+		rc pmcddb039.res pmcddb039.dll
+
+pmcddb039.res:	pmcddb039.rc pmcddb039.dlg $(INC)\pmcddbres.h
+		rc  -i $(INC) -r pmcddb039.rc
+
+pmcddb088.dll:	pmcddb088.c pmcddb088.res
+		cmd /C $(TOOLDIR)/create_def.cmd pmcddb088.def def088.tpl
+		$(CC) $(CPPFLAGSVAC) -I$(INC) pmcddb088.c pmcddb088.def
+		rc pmcddb088.res pmcddb088.dll
+
+pmcddb088.res:	pmcddb088.rc pmcddb039.dlg $(INC)\pmcddbres.h
+		rc  -i $(INC) -r pmcddb088.rc
+
+pmcddb033.dll:	pmcddb033.c pmcddb033.res
+		cmd /C $(TOOLDIR)/create_def.cmd pmcddb033.def def033.tpl
+		$(CC) $(CPPFLAGSVAC) -I$(INC) pmcddb033.c pmcddb033.def
+		rc pmcddb033.res pmcddb033.dll
+
+pmcddb033.res:	pmcddb033.rc pmcddb033.dlg $(INC)\pmcddbres.h
+		rc  -i $(INC) -r pmcddb033.rc
+
+pmcddb034.dll:	pmcddb034.c pmcddb034.res
+		cmd /C $(TOOLDIR)/create_def.cmd pmcddb034.def def034.tpl
+		$(CC) $(CPPFLAGSVAC) -I$(INC) pmcddb034.c pmcddb034.def
+		rc pmcddb034.res pmcddb034.dll
+
+pmcddb034.res:	pmcddb034.rc pmcddb034.dlg $(INC)\pmcddbres.h
+		rc  -i $(INC) -r pmcddb034.rc
+
+clean:
+	-rm *.obj
+	-rm *.dll
+	-rm *.RES
+	-rm *.def
+
+cleaner:
+	-rm *.*~
Index: /tags/CWMM-0.3.0_GA/mediafolder/c/cddb/res/pmcddb001.c
===================================================================
--- /tags/CWMM-0.3.0_GA/mediafolder/c/cddb/res/pmcddb001.c	(revision 213)
+++ /tags/CWMM-0.3.0_GA/mediafolder/c/cddb/res/pmcddb001.c	(revision 213)
@@ -0,0 +1,25 @@
+/*
+ * This file is (C) Chris Wohlgemuth 1999
+ */
+/*
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; see the file COPYING.  If not, write to
+ * the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+
+#include <os2.h>
+
+PSZ queryLanguage()
+{
+  return "English (001)";
+}
Index: /tags/CWMM-0.3.0_GA/mediafolder/c/cddb/res/pmcddb001.dlg
===================================================================
--- /tags/CWMM-0.3.0_GA/mediafolder/c/cddb/res/pmcddb001.dlg	(revision 213)
+++ /tags/CWMM-0.3.0_GA/mediafolder/c/cddb/res/pmcddb001.dlg	(revision 213)
@@ -0,0 +1,61 @@
+#ifndef OS2_INCLUDED
+   #include <os2.h>
+#endif
+
+DLGTEMPLATE IDDLG_CDDBSETUP2 LOADONCALL MOVEABLE DISCARDABLE
+BEGIN
+    DIALOG  "CDDB server setup", IDDLG_CDDBSETUP2, 37, 36, 208, 149, NOT 
+            FS_DLGBORDER | WS_VISIBLE
+    BEGIN
+        GROUPBOX        "CDDB server setup", IDGB_CDDBSERVERSETUP, 11, 29, 
+                        195, 116, NOT WS_GROUP
+        LTEXT           "Server:Port", IDST_SERVERPORT, 17, 123, 84, 8
+        LISTBOX         IDLB_CDDBSERVERS, 18, 63, 128, 56
+        PUSHBUTTON      "U~p", IDPB_SERVERUP, 155, 106, 40, 14, WS_GROUP
+        PUSHBUTTON      "D~own", IDPB_SERVERDOWN, 155, 88, 40, 14
+        PUSHBUTTON      "~Delete", IDPB_SERVERDELETE, 155, 63, 40, 14
+        LTEXT           "New server:", IDST_NEWSERVER, 17, 50, 84, 8
+        ENTRYFIELD      "", IDEF_NEWSERVER, 19, 38, 126, 8, ES_MARGIN
+        PUSHBUTTON      "~Add", IDPB_SERVERADD, 155, 35, 40, 14
+        PUSHBUTTON      "~Undo", IDPB_CDDB2UNDO, 16, 8, 40, 14, WS_GROUP
+        PUSHBUTTON      "~Help", IDPB_CDDB2HELP, 76, 8, 40, 14
+    END
+END
+
+DLGTEMPLATE IDDLG_CDDBSETUP LOADONCALL MOVEABLE DISCARDABLE
+BEGIN
+    DIALOG  "CDDB", IDDLG_CDDBSETUP, 25, 20, 226, 150, NOT FS_DLGBORDER | 
+            WS_VISIBLE
+    BEGIN
+        GROUPBOX        "CDDB user setup", IDGB_CDDBUSER, 9, 30, 142, 112, 
+                        NOT WS_GROUP
+        AUTOCHECKBOX    "Use ~CDDB", IDCB_USECDDB, 16, 119, 109, 10
+        LTEXT           "User name:", IDST_USERNAME, 17, 104, 119, 8, NOT 
+                        WS_GROUP
+        ENTRYFIELD      "", IDEF_CDDBUSER, 19, 92, 120, 8, ES_MARGIN
+        LTEXT           "User host:", IDST_USERHOST, 17, 77, 119, 8, NOT 
+                        WS_GROUP
+        ENTRYFIELD      "", IDEF_USERHOST, 19, 65, 120, 8, ES_MARGIN
+        LTEXT           "Specify the servers on the next page.", 
+                        IDST_SERVERNEXTPAGE, 17, 35, 124, 22, DT_WORDBREAK | 
+                        NOT WS_GROUP
+        PUSHBUTTON      "~Undo", IDPB_CDDBUNDO, 5, 9, 40, 14, WS_GROUP
+        PUSHBUTTON      "~Help", IDPB_CDDBHELP, 65, 9, 40, 14
+    END
+END
+
+DLGTEMPLATE IDDLG_CDDBCHOOSE LOADONCALL MOVEABLE DISCARDABLE
+BEGIN
+    DIALOG  "Query CDDB - Select match", IDDLG_CDDBCHOOSE, 29, 47, 258, 85, WS_VISIBLE, 
+            FCF_TITLEBAR
+    BEGIN
+        LISTBOX         IDLB_CDDBCHOOSE, 5, 25, 246, 40, LS_HORZSCROLL
+        LTEXT           "Select one of these matches:", IDST_CDDBCHOOSE, 6, 71, 246, 8
+        PUSHBUTTON      "~Ok", IDPB_OK, 5, 5, 40, 14
+        PUSHBUTTON      "~Cancel", IDPB_CANCEL, 55, 5, 40, 14
+    END
+END
+
+
+
+
Index: /tags/CWMM-0.3.0_GA/mediafolder/c/cddb/res/pmcddb001.rc
===================================================================
--- /tags/CWMM-0.3.0_GA/mediafolder/c/cddb/res/pmcddb001.rc	(revision 213)
+++ /tags/CWMM-0.3.0_GA/mediafolder/c/cddb/res/pmcddb001.rc	(revision 213)
@@ -0,0 +1,42 @@
+; .rc: Resource file 
+;
+;                    (C) Chris Wohlgemuth 1999-2002
+;/*
+; * This program is free software; you can redistribute it and/or modify
+; * it under the terms of the GNU General Public License as published by
+; * the Free Software Foundation; either version 2, or (at your option)
+; * any later version.
+; *
+; * This program is distributed in the hope that it will be useful,
+; * but WITHOUT ANY WARRANTY; without even the implied warranty of
+; * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+; * GNU General Public License for more details.
+; *
+; * You should have received a copy of the GNU General Public License
+; * along with this program; see the file COPYING.  If not, write to
+; * the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
+; */
+#ifndef OS2_INCLUDED
+   #include <os2.h>
+#endif
+#include "pmcddbres.h"
+
+ICON 1 "freedb.ico"
+
+
+STRINGTABLE
+BEGIN
+
+
+; ******* CDDB *****************************
+IDSTR_CDDBQUERYLOCALDB   "CDDB-ID: %X, Querying local database..."
+IDSTR_ERRORCDDBLOCALDB      "Warning! Cannot open CDDB.ini file!"
+
+IDSTR_INIFILEOPENWARNING  "Warning! Cannot open Ini-file (cddb.ini)!"
+IDSTR_PMCDDBTITLE         "Query CDDB"  
+
+IDSTR_USAGE               "Use the following option for setting your email:  /C <email address> "
+IDSTR_SETUPERROR         "Your username or your host are not correctly set. Start pmcddb.exe with the /C parameter to specify the email address."
+END
+
+RCINCLUDE "pmcddb001.dlg"
Index: /tags/CWMM-0.3.0_GA/mediafolder/c/cddb/res/pmcddb007.c
===================================================================
--- /tags/CWMM-0.3.0_GA/mediafolder/c/cddb/res/pmcddb007.c	(revision 213)
+++ /tags/CWMM-0.3.0_GA/mediafolder/c/cddb/res/pmcddb007.c	(revision 213)
@@ -0,0 +1,25 @@
+/*
+ * This file is (C) Chris Wohlgemuth 1999
+ */
+/*
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; see the file COPYING.  If not, write to
+ * the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+
+#include <os2.h>
+
+PSZ queryLanguage()
+{
+  return "Russian (007)";
+}
Index: /tags/CWMM-0.3.0_GA/mediafolder/c/cddb/res/pmcddb007.dlg
===================================================================
--- /tags/CWMM-0.3.0_GA/mediafolder/c/cddb/res/pmcddb007.dlg	(revision 213)
+++ /tags/CWMM-0.3.0_GA/mediafolder/c/cddb/res/pmcddb007.dlg	(revision 213)
@@ -0,0 +1,61 @@
+#ifndef OS2_INCLUDED
+   #include <os2.h>
+#endif
+
+DLGTEMPLATE IDDLG_CDDBSETUP2 LOADONCALL MOVEABLE DISCARDABLE
+BEGIN
+    DIALOG  " áâà®©ª  á¥à¢¥à  CDDB", IDDLG_CDDBSETUP2, 37, 36, 208, 149, NOT 
+            FS_DLGBORDER | WS_VISIBLE
+    BEGIN
+        GROUPBOX        " áâà®©ª  á¥à¢¥à  CDDB", IDGB_CDDBSERVERSETUP, 11, 29, 
+                        195, 116, NOT WS_GROUP
+        LTEXT           "¥à¢¥à:®àâ", IDST_SERVERPORT, 17, 123, 84, 8
+        LISTBOX         IDLB_CDDBSERVERS, 18, 63, 128, 56
+        PUSHBUTTON      "~¢¥àå", IDPB_SERVERUP, 155, 106, 40, 14, WS_GROUP
+        PUSHBUTTON      "~­š§", IDPB_SERVERDOWN, 155, 88, 40, 14
+        PUSHBUTTON      "~€ «šâì", IDPB_SERVERDELETE, 155, 63, 40, 14
+        LTEXT           "®¢ë© á¥à¢¥à:", IDST_NEWSERVER, 17, 50, 84, 8
+        ENTRYFIELD      "", IDEF_NEWSERVER, 19, 38, 126, 8, ES_MARGIN
+        PUSHBUTTON      "~®¡ ¢šâì", IDPB_SERVERADD, 155, 35, 40, 14
+        PUSHBUTTON      "~âª âšâì", IDPB_CDDB2UNDO, 16, 8, 40, 14, WS_GROUP
+        PUSHBUTTON      "~¯à ¢ª ", IDPB_CDDB2HELP, 76, 8, 40, 14
+    END
+END
+
+DLGTEMPLATE IDDLG_CDDBSETUP LOADONCALL MOVEABLE DISCARDABLE
+BEGIN
+    DIALOG  "CDDB", IDDLG_CDDBSETUP, 25, 20, 226, 150, NOT FS_DLGBORDER | 
+            WS_VISIBLE
+    BEGIN
+        GROUPBOX        " áâà®©ª  ¯®«ì§®¢ â¥«ï CDDB", IDGB_CDDBUSER, 9, 30, 142, 112, 
+                        NOT WS_GROUP
+        AUTOCHECKBOX    "á¯®«ì§®¢ âì ~CDDB", IDCB_USECDDB, 16, 119, 109, 10
+        LTEXT           "¬ï ¯®«ì§®¢ â¥«ï:", IDST_USERNAME, 17, 104, 119, 8, NOT 
+                        WS_GROUP
+        ENTRYFIELD      "", IDEF_CDDBUSER, 19, 92, 120, 8, ES_MARGIN
+        LTEXT           "®áâ ¯®«ì§®¢ â¥«ï:", IDST_USERHOST, 17, 77, 119, 8, NOT 
+                        WS_GROUP
+        ENTRYFIELD      "", IDEF_USERHOST, 19, 65, 120, 8, ES_MARGIN
+        LTEXT           "ª Ššâ¥ á¥à¢¥àë ­  á«¥€ãîé¥© áâà ­šæ¥.", 
+                        IDST_SERVERNEXTPAGE, 17, 35, 124, 22, DT_WORDBREAK | 
+                        NOT WS_GROUP
+        PUSHBUTTON      "~âª âšâì", IDPB_CDDBUNDO, 5, 9, 40, 14, WS_GROUP
+        PUSHBUTTON      "~¯à ¢ª ", IDPB_CDDBHELP, 65, 9, 40, 14
+    END
+END
+
+DLGTEMPLATE IDDLG_CDDBCHOOSE LOADONCALL MOVEABLE DISCARDABLE
+BEGIN
+    DIALOG  " ¯à®á CDDB - ë¡®à á®¢¯ €¥­š©", IDDLG_CDDBCHOOSE, 29, 47, 258, 85, WS_VISIBLE, 
+            FCF_TITLEBAR
+    BEGIN
+        LISTBOX         IDLB_CDDBCHOOSE, 5, 25, 246, 40, LS_HORZSCROLL
+        LTEXT           "ë¡¥àšâ¥ ®€­® š§ íâšå á®¢¯ €¥­š©:", IDST_CDDBCHOOSE, 6, 71, 246, 8
+        PUSHBUTTON      "~ª", IDPB_OK, 5, 5, 40, 14
+        PUSHBUTTON      "~â¬¥­šâì", IDPB_CANCEL, 55, 5, 40, 14
+    END
+END
+
+
+
+
Index: /tags/CWMM-0.3.0_GA/mediafolder/c/cddb/res/pmcddb007.rc
===================================================================
--- /tags/CWMM-0.3.0_GA/mediafolder/c/cddb/res/pmcddb007.rc	(revision 213)
+++ /tags/CWMM-0.3.0_GA/mediafolder/c/cddb/res/pmcddb007.rc	(revision 213)
@@ -0,0 +1,45 @@
+; .rc: Resource file
+;
+;                    (C) Chris Wohlgemuth 1999-2002
+;/*
+; * This program is free software; you can redistribute it and/or modify
+; * it under the terms of the GNU General Public License as published by
+; * the Free Software Foundation; either version 2, or (at your option)
+; * any later version.
+; *
+; * This program is distributed in the hope that it will be useful,
+; * but WITHOUT ANY WARRANTY; without even the implied warranty of
+; * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+; * GNU General Public License for more details.
+; *
+; * You should have received a copy of the GNU General Public License
+; * along with this program; see the file COPYING.  If not, write to
+; * the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
+; */
+
+#ifndef OS2_INCLUDED
+   #include <os2.h>
+#endif
+#include "pmcddbres.h"
+
+CODEPAGE 866
+ICON 1 "freedb.ico"
+
+
+STRINGTABLE
+BEGIN
+
+
+; ******* CDDB *****************************
+IDSTR_CDDBQUERYLOCALDB    "CDDB-ID: %X,  ¯à®á ª «®ª «ì­®© ¡ §¥ € ­­ëå..."
+IDSTR_ERRORCDDBLOCALDB    "à¥€ã¯à¥Š€¥­š¥! ¥ ã€ ñâáï ®âªàëâì ä ©« CDDB.ini!"
+
+IDSTR_INIFILEOPENWARNING  "à¥€ã¯à¥Š€¥­š¥! ¥ ã€ ñâáï ®âªàëâì INI-ä ©« (cddb.ini)!"
+IDSTR_PMCDDBTITLE         " ¯à®á CDDB"
+
+IDSTR_USAGE               "á¯®«ì§ã©â¥ á«¥€ãîéãî ®¯æšî €«ï ­ áâà®©ªš í«¥ªâà®­­®© ¯®çâë: /C <€à¥á E-mail>"
+IDSTR_SETUPERROR          " è¥ š¬ï ¯®«ì§®¢ â¥«ï š«š å®áâ ­ áâà®¥­ë ­¥¯à ¢š«ì­®.  ¯ãáâšâ¥ pmcddb.exe á ¯ à ¬¥âà®¬ /C, çâ®¡ë ãª § âì  €à¥á í«¥ªâà®­­®© ¯®çâë."
+END
+
+RCINCLUDE "pmcddb007.dlg"
+
Index: /tags/CWMM-0.3.0_GA/mediafolder/c/cddb/res/pmcddb031.c
===================================================================
--- /tags/CWMM-0.3.0_GA/mediafolder/c/cddb/res/pmcddb031.c	(revision 213)
+++ /tags/CWMM-0.3.0_GA/mediafolder/c/cddb/res/pmcddb031.c	(revision 213)
@@ -0,0 +1,25 @@
+/*
+ * This file is (C) Chris Wohlgemuth 1999
+ */
+/*
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; see the file COPYING.  If not, write to
+ * the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+
+#include <os2.h>
+
+PSZ queryLanguage()
+{
+  return "Nederlands (031)";
+}
Index: /tags/CWMM-0.3.0_GA/mediafolder/c/cddb/res/pmcddb031.dlg
===================================================================
--- /tags/CWMM-0.3.0_GA/mediafolder/c/cddb/res/pmcddb031.dlg	(revision 213)
+++ /tags/CWMM-0.3.0_GA/mediafolder/c/cddb/res/pmcddb031.dlg	(revision 213)
@@ -0,0 +1,61 @@
+#ifndef OS2_INCLUDED
+   #include <os2.h>
+#endif
+
+DLGTEMPLATE IDDLG_CDDBSETUP2 LOADONCALL MOVEABLE DISCARDABLE
+BEGIN
+    DIALOG  "CDDB server instellingen", IDDLG_CDDBSETUP2, 37, 36, 208, 149, NOT 
+            FS_DLGBORDER | WS_VISIBLE
+    BEGIN
+        GROUPBOX        "CDDB server instellingen", IDGB_CDDBSERVERSETUP, 11, 29, 
+                        195, 116, NOT WS_GROUP
+        LTEXT           "Server:Poort", IDST_SERVERPORT, 17, 123, 84, 8
+        LISTBOX         IDLB_CDDBSERVERS, 18, 63, 128, 56
+        PUSHBUTTON      "~Omhoog", IDPB_SERVERUP, 155, 106, 40, 14, WS_GROUP
+        PUSHBUTTON      "~Naar beneden", IDPB_SERVERDOWN, 155, 88, 40, 14
+        PUSHBUTTON      "Verwij~deren", IDPB_SERVERDELETE, 155, 63, 40, 14
+        LTEXT           "Nieuwe server:", IDST_NEWSERVER, 17, 50, 84, 8
+        ENTRYFIELD      "", IDEF_NEWSERVER, 19, 38, 126, 8, ES_MARGIN
+        PUSHBUTTON      "~Toevoegen", IDPB_SERVERADD, 155, 35, 40, 14
+        PUSHBUTTON      "~Startwaarde", IDPB_CDDB2UNDO, 16, 8, 40, 14, WS_GROUP
+        PUSHBUTTON      "~Hulp", IDPB_CDDB2HELP, 76, 8, 40, 14
+    END
+END
+
+DLGTEMPLATE IDDLG_CDDBSETUP LOADONCALL MOVEABLE DISCARDABLE
+BEGIN
+    DIALOG  "CDDB", IDDLG_CDDBSETUP, 25, 20, 226, 150, NOT FS_DLGBORDER | 
+            WS_VISIBLE
+    BEGIN
+        GROUPBOX        "CDDB gebruiker instellingen", IDGB_CDDBUSER, 9, 30, 142, 112, 
+                        NOT WS_GROUP
+        AUTOCHECKBOX    "Gebruik ~CDDB", IDCB_USECDDB, 16, 119, 109, 10
+        LTEXT           "Gebruikersnaam:", IDST_USERNAME, 17, 104, 119, 8, NOT 
+                        WS_GROUP
+        ENTRYFIELD      "", IDEF_CDDBUSER, 19, 92, 120, 8, ES_MARGIN
+        LTEXT           "Gebruikershost:", IDST_USERHOST, 17, 77, 119, 8, NOT 
+                        WS_GROUP
+        ENTRYFIELD      "", IDEF_USERHOST, 19, 65, 120, 8, ES_MARGIN
+        LTEXT           "Geef de servers op de volgende pagina op.", 
+                        IDST_SERVERNEXTPAGE, 17, 35, 124, 22, DT_WORDBREAK | 
+                        NOT WS_GROUP
+        PUSHBUTTON      "~Startwaarde", IDPB_CDDBUNDO, 5, 9, 40, 14, WS_GROUP
+        PUSHBUTTON      "~Hulp", IDPB_CDDBHELP, 65, 9, 40, 14
+    END
+END
+
+DLGTEMPLATE IDDLG_CDDBCHOOSE LOADONCALL MOVEABLE DISCARDABLE
+BEGIN
+    DIALOG  "Raadpleeg CDDB - Selecteer overeenkomst", IDDLG_CDDBCHOOSE, 29, 47, 258, 85, WS_VISIBLE, 
+            FCF_TITLEBAR
+    BEGIN
+        LISTBOX         IDLB_CDDBCHOOSE, 5, 25, 246, 40, LS_HORZSCROLL
+        LTEXT           "Selecteer n van deze overeenkomsten:", IDST_CDDBCHOOSE, 6, 71, 246, 8
+        PUSHBUTTON      "~Ok", IDPB_OK, 5, 5, 40, 14
+        PUSHBUTTON      "~Annuleren", IDPB_CANCEL, 55, 5, 40, 14
+    END
+END
+
+
+
+
Index: /tags/CWMM-0.3.0_GA/mediafolder/c/cddb/res/pmcddb031.rc
===================================================================
--- /tags/CWMM-0.3.0_GA/mediafolder/c/cddb/res/pmcddb031.rc	(revision 213)
+++ /tags/CWMM-0.3.0_GA/mediafolder/c/cddb/res/pmcddb031.rc	(revision 213)
@@ -0,0 +1,43 @@
+; .rc: Resource file 
+;
+;                    (C) Chris Wohlgemuth 1999-2002
+;/*
+; * This program is free software; you can redistribute it and/or modify
+; * it under the terms of the GNU General Public License as published by
+; * the Free Software Foundation; either version 2, or (at your option)
+; * any later version.
+; *
+; * This program is distributed in the hope that it will be useful,
+; * but WITHOUT ANY WARRANTY; without even the implied warranty of
+; * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+; * GNU General Public License for more details.
+; *
+; * You should have received a copy of the GNU General Public License
+; * along with this program; see the file COPYING.  If not, write to
+; * the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
+; */
+#ifndef OS2_INCLUDED
+   #include <os2.h>
+#endif
+#include "pmcddbres.h"
+
+ICON 1 "freedb.ico"
+
+
+STRINGTABLE
+BEGIN
+
+
+; ******* CDDB *****************************
+IDSTR_CDDBQUERYLOCALDB   "CDDB-ID: %X, raadplegen lokale database..."
+IDSTR_ERRORCDDBLOCALDB      "Waarschuwing! Kan het CDDB.ini bestand niet openen!"
+
+IDSTR_INIFILEOPENWARNING  "Waarschuwing! Kan het Ini-bestand niet openen (cddb.ini)!"
+IDSTR_PMCDDBTITLE         "Raadpleeg CDDB"  
+
+IDSTR_USAGE               "Gebruik de volgende optie om uw email in te stellen:  /C <email adres> "
+IDSTR_SETUPERROR         "Uw gebruikersnaam of host zijn niet goed ingesteld. Start pmcddb.exe met de /C parameter op om het email adres op te geven."
+END
+
+RCINCLUDE "pmcddb031.dlg"
+
Index: /tags/CWMM-0.3.0_GA/mediafolder/c/cddb/res/pmcddb033.c
===================================================================
--- /tags/CWMM-0.3.0_GA/mediafolder/c/cddb/res/pmcddb033.c	(revision 213)
+++ /tags/CWMM-0.3.0_GA/mediafolder/c/cddb/res/pmcddb033.c	(revision 213)
@@ -0,0 +1,29 @@
+/*
+ * This file is (C) Chris Wohlgemuth 1999
+ */
+/*
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; see the file COPYING.  If not, write to
+ * the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+/*
+ * French translation....: Guillaume Gay <guillaume[dot]gay[arobase]gmail[dot]com>
+ * Version...............: 2020-07-22
+ */
+
+#include <os2.h>
+
+PSZ queryLanguage()
+{
+  return "Franais (033)";
+}
Index: /tags/CWMM-0.3.0_GA/mediafolder/c/cddb/res/pmcddb033.dlg
===================================================================
--- /tags/CWMM-0.3.0_GA/mediafolder/c/cddb/res/pmcddb033.dlg	(revision 213)
+++ /tags/CWMM-0.3.0_GA/mediafolder/c/cddb/res/pmcddb033.dlg	(revision 213)
@@ -0,0 +1,59 @@
+#ifndef OS2_INCLUDED
+   #include <os2.h>
+#endif
+
+DLGTEMPLATE IDDLG_CDDBSETUP2 LOADONCALL MOVEABLE DISCARDABLE
+BEGIN
+    DIALOG  "Paramtres pour les serveurs CDDB", IDDLG_CDDBSETUP2, 37, 36, 208, 149, NOT
+            FS_DLGBORDER | WS_VISIBLE
+    BEGIN
+        GROUPBOX        "Paramtres des serveurs CDDB", IDGB_CDDBSERVERSETUP, 11, 29,
+                        195, 116, NOT WS_GROUP
+        LTEXT           "serveur:port", IDST_SERVERPORT, 17, 123, 84, 8
+        LISTBOX         IDLB_CDDBSERVERS, 18, 63, 128, 56
+        PUSHBUTTON      "~Haut", IDPB_SERVERUP, 155, 106, 40, 14, WS_GROUP
+        PUSHBUTTON      "~Bas", IDPB_SERVERDOWN, 155, 88, 40, 14
+        PUSHBUTTON      "~Supprimer", IDPB_SERVERDELETE, 155, 63, 40, 14
+        LTEXT           "Nouveau serveur :", IDST_NEWSERVER, 17, 50, 84, 8
+        ENTRYFIELD      "", IDEF_NEWSERVER, 19, 38, 126, 8, ES_MARGIN
+        PUSHBUTTON      "~Ajouter", IDPB_SERVERADD, 155, 35, 40, 14
+        PUSHBUTTON      "~Dfaire", IDPB_CDDB2UNDO, 16, 8, 40, 14, WS_GROUP
+        PUSHBUTTON      "A~ide", IDPB_CDDB2HELP, 76, 8, 40, 14
+    END
+END
+
+DLGTEMPLATE IDDLG_CDDBSETUP LOADONCALL MOVEABLE DISCARDABLE
+BEGIN
+    DIALOG  "CDDB", IDDLG_CDDBSETUP, 25, 20, 226, 150, NOT FS_DLGBORDER |
+            WS_VISIBLE
+    BEGIN
+        GROUPBOX        "Utilisateur CDDB", IDGB_CDDBUSER, 9, 30, 142, 112,
+                        NOT WS_GROUP
+        AUTOCHECKBOX    "Utiliser ~CDDB", IDCB_USECDDB, 16, 119, 109, 10
+        LTEXT           "Nom d'utilisateur :", IDST_USERNAME, 17, 104, 119, 8, NOT
+                        WS_GROUP
+        ENTRYFIELD      "", IDEF_CDDBUSER, 19, 92, 120, 8, ES_MARGIN
+        LTEXT           "Hte utilisateur :", IDST_USERHOST, 17, 77, 119, 8, NOT
+                        WS_GROUP
+        ENTRYFIELD      "", IDEF_USERHOST, 19, 65, 120, 8, ES_MARGIN
+        LTEXT           "Indiquez les serveurs 
+ utiliser sur la page suivante.",
+                        IDST_SERVERNEXTPAGE, 17, 35, 124, 22, DT_WORDBREAK |
+                        NOT WS_GROUP
+        PUSHBUTTON      "~Dfaire", IDPB_CDDBUNDO, 5, 9, 40, 14, WS_GROUP
+        PUSHBUTTON      "A~ide", IDPB_CDDBHELP, 65, 9, 40, 14
+    END
+END
+
+DLGTEMPLATE IDDLG_CDDBCHOOSE LOADONCALL MOVEABLE DISCARDABLE
+BEGIN
+    DIALOG  "Requte CDDB - Slection", IDDLG_CDDBCHOOSE, 29, 47, 258, 85, WS_VISIBLE,
+            FCF_TITLEBAR
+    BEGIN
+        LISTBOX         IDLB_CDDBCHOOSE, 5, 25, 246, 40, LS_HORZSCROLL
+        LTEXT           "Slectionnez l'un des albums trouvs :", IDST_CDDBCHOOSE, 6, 71, 246, 8
+        PUSHBUTTON      "~OK", IDPB_OK, 5, 5, 40, 14
+        PUSHBUTTON      "~Annuler", IDPB_CANCEL, 55, 5, 40, 14
+    END
+END
+
Index: /tags/CWMM-0.3.0_GA/mediafolder/c/cddb/res/pmcddb033.rc
===================================================================
--- /tags/CWMM-0.3.0_GA/mediafolder/c/cddb/res/pmcddb033.rc	(revision 213)
+++ /tags/CWMM-0.3.0_GA/mediafolder/c/cddb/res/pmcddb033.rc	(revision 213)
@@ -0,0 +1,46 @@
+; .rc: Resource file
+;
+;                    (C) Chris Wohlgemuth 1999-2002
+;/*
+; * This program is free software; you can redistribute it and/or modify
+; * it under the terms of the GNU General Public License as published by
+; * the Free Software Foundation; either version 2, or (at your option)
+; * any later version.
+; *
+; * This program is distributed in the hope that it will be useful,
+; * but WITHOUT ANY WARRANTY; without even the implied warranty of
+; * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+; * GNU General Public License for more details.
+; *
+; * You should have received a copy of the GNU General Public License
+; * along with this program; see the file COPYING.  If not, write to
+; * the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
+; */
+; /*
+;  * French translation....: Guillaume Gay <guillaume[dot]gay[arobase]gmail[dot]com>
+;  * Version...............: 2020-07-22
+;  */
+#ifndef OS2_INCLUDED
+   #include <os2.h>
+#endif
+#include "pmcddbres.h"
+
+ICON 1 "freedb.ico"
+
+
+STRINGTABLE
+BEGIN
+
+
+; ******* CDDB *****************************
+IDSTR_CDDBQUERYLOCALDB   "CDDB-ID : %X, interrogation de la base de donnes locale..."
+IDSTR_ERRORCDDBLOCALDB   "Avertissement ! Ouverture impossible du fichier CDDB.ini !"
+
+IDSTR_INIFILEOPENWARNING "Avertissement ! Ouverture impossible du fichier INI (cddb.ini) !"
+IDSTR_PMCDDBTITLE        "Interrogation de CDDB"
+
+IDSTR_USAGE              "Pour le paramtrage de votre adresse de courriel, utilisez l'option : /C <adresse_de_courriel>"
+IDSTR_SETUPERROR         "Votre nom d'utilisateur ou l'hte n'est pas correctement paramtr. Lancez pmcddb avec le paramtre /C pour indiquer l'adresse de courriel."
+END
+
+RCINCLUDE "pmcddb033.dlg"
Index: /tags/CWMM-0.3.0_GA/mediafolder/c/cddb/res/pmcddb034.c
===================================================================
--- /tags/CWMM-0.3.0_GA/mediafolder/c/cddb/res/pmcddb034.c	(revision 213)
+++ /tags/CWMM-0.3.0_GA/mediafolder/c/cddb/res/pmcddb034.c	(revision 213)
@@ -0,0 +1,25 @@
+/*
+ * This file is (C) Chris Wohlgemuth 1999
+ */
+/*
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; see the file COPYING.  If not, write to
+ * the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+
+#include <os2.h>
+
+PSZ queryLanguage()
+{
+  return "Espagnol (034)";
+}
Index: /tags/CWMM-0.3.0_GA/mediafolder/c/cddb/res/pmcddb034.dlg
===================================================================
--- /tags/CWMM-0.3.0_GA/mediafolder/c/cddb/res/pmcddb034.dlg	(revision 213)
+++ /tags/CWMM-0.3.0_GA/mediafolder/c/cddb/res/pmcddb034.dlg	(revision 213)
@@ -0,0 +1,61 @@
+#ifndef OS2_INCLUDED
+   #include <os2.h>
+#endif
+
+DLGTEMPLATE IDDLG_CDDBSETUP2 LOADONCALL MOVEABLE DISCARDABLE
+BEGIN
+    DIALOG  "Configuraci¢n del servidor CDDB", IDDLG_CDDBSETUP2, 37, 36, 208, 149, NOT 
+            FS_DLGBORDER | WS_VISIBLE
+    BEGIN
+        GROUPBOX        "Configuraci¢n del servidor CDDB", IDGB_CDDBSERVERSETUP, 11, 29, 
+                        195, 116, NOT WS_GROUP
+        LTEXT           "Servidor:puerto", IDST_SERVERPORT, 17, 123, 84, 8
+        LISTBOX         IDLB_CDDBSERVERS, 18, 63, 128, 56
+        PUSHBUTTON      "~Subir", IDPB_SERVERUP, 155, 106, 40, 14, WS_GROUP
+        PUSHBUTTON      "~Bajar", IDPB_SERVERDOWN, 155, 88, 40, 14
+        PUSHBUTTON      "~Eliminar", IDPB_SERVERDELETE, 155, 63, 40, 14
+        LTEXT           "Nuevo servidor:", IDST_NEWSERVER, 17, 50, 84, 8
+        ENTRYFIELD      "", IDEF_NEWSERVER, 19, 38, 126, 8, ES_MARGIN
+        PUSHBUTTON      "~A€adir", IDPB_SERVERADD, 155, 35, 40, 14
+        PUSHBUTTON      "~Deshacer", IDPB_CDDB2UNDO, 16, 8, 40, 14, WS_GROUP
+        PUSHBUTTON      "A~yuda", IDPB_CDDB2HELP, 76, 8, 40, 14
+    END
+END
+
+DLGTEMPLATE IDDLG_CDDBSETUP LOADONCALL MOVEABLE DISCARDABLE
+BEGIN
+    DIALOG  "CDDB", IDDLG_CDDBSETUP, 25, 20, 226, 150, NOT FS_DLGBORDER | 
+            WS_VISIBLE
+    BEGIN
+        GROUPBOX        "Configuraci¢n del usuario de CDDB", IDGB_CDDBUSER, 9, 30, 142, 112, 
+                        NOT WS_GROUP
+        AUTOCHECKBOX    "Utilizar ~CDDB", IDCB_USECDDB, 16, 119, 109, 10
+        LTEXT           "Nombre de usuario:", IDST_USERNAME, 17, 104, 119, 8, NOT 
+                        WS_GROUP
+        ENTRYFIELD      "", IDEF_CDDBUSER, 19, 92, 120, 8, ES_MARGIN
+        LTEXT           "Sistema remoto:", IDST_USERHOST, 17, 77, 119, 8, NOT 
+                        WS_GROUP
+        ENTRYFIELD      "", IDEF_USERHOST, 19, 65, 120, 8, ES_MARGIN
+        LTEXT           "Especifique los servidores en la p gina siguiente.", 
+                        IDST_SERVERNEXTPAGE, 17, 35, 124, 22, DT_WORDBREAK | 
+                        NOT WS_GROUP
+        PUSHBUTTON      "~Deshacer", IDPB_CDDBUNDO, 5, 9, 40, 14, WS_GROUP
+        PUSHBUTTON      "A~yuda", IDPB_CDDBHELP, 65, 9, 40, 14
+    END
+END
+
+DLGTEMPLATE IDDLG_CDDBCHOOSE LOADONCALL MOVEABLE DISCARDABLE
+BEGIN
+    DIALOG  "Consulta CDDB - Seleccionar resultado", IDDLG_CDDBCHOOSE, 29, 47, 258, 85, WS_VISIBLE, 
+            FCF_TITLEBAR
+    BEGIN
+        LISTBOX         IDLB_CDDBCHOOSE, 5, 25, 246, 40, LS_HORZSCROLL
+        LTEXT           "Seleccione uno de estos resultados:", IDST_CDDBCHOOSE, 6, 71, 246, 8
+        PUSHBUTTON      "~Bien", IDPB_OK, 5, 5, 40, 14
+        PUSHBUTTON      "~Cancelar", IDPB_CANCEL, 55, 5, 40, 14
+    END
+END
+
+
+
+
Index: /tags/CWMM-0.3.0_GA/mediafolder/c/cddb/res/pmcddb034.rc
===================================================================
--- /tags/CWMM-0.3.0_GA/mediafolder/c/cddb/res/pmcddb034.rc	(revision 213)
+++ /tags/CWMM-0.3.0_GA/mediafolder/c/cddb/res/pmcddb034.rc	(revision 213)
@@ -0,0 +1,43 @@
+; .rc: Resource file
+;
+;                    (C) Chris Wohlgemuth 1999-2002
+;/*
+; * This program is free software; you can redistribute it and/or modify
+; * it under the terms of the GNU General Public License as published by
+; * the Free Software Foundation; either version 2, or (at your option)
+; * any later version.
+; *
+; * This program is distributed in the hope that it will be useful,
+; * but WITHOUT ANY WARRANTY; without even the implied warranty of
+; * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+; * GNU General Public License for more details.
+; *
+; * You should have received a copy of the GNU General Public License
+; * along with this program; see the file COPYING.  If not, write to
+; * the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
+; */
+#ifndef OS2_INCLUDED
+   #include <os2.h>
+#endif
+#include "pmcddbres.h"
+
+ICON 1 "freedb.ico"
+
+
+STRINGTABLE
+BEGIN
+
+
+; ******* CDDB *****************************
+IDSTR_CDDBQUERYLOCALDB   "CDDB-ID: %X, consultando base de datos local..."
+IDSTR_ERRORCDDBLOCALDB      "­Atenci¢n! ­No se puede abrir el archivo CDDB.ini!"
+
+IDSTR_INIFILEOPENWARNING  "­Atenci¢n! ­No se puede abrir el archivo ini (cddb.ini)!"
+IDSTR_PMCDDBTITLE         "Consultar CDDB"
+
+IDSTR_USAGE               "Utilice la siguiente opci¢n para establecer su correo:  /C <direcci¢n de correo> "
+IDSTR_SETUPERROR         "El nombre del usuario o el servidor no se han establecido correctamente. Inicie pmcddb.exe con el par metro /C para especificar la direcci¢n de correo."
+END
+
+RCINCLUDE "pmcddb034.dlg"
+
Index: /tags/CWMM-0.3.0_GA/mediafolder/c/cddb/res/pmcddb039.c
===================================================================
--- /tags/CWMM-0.3.0_GA/mediafolder/c/cddb/res/pmcddb039.c	(revision 213)
+++ /tags/CWMM-0.3.0_GA/mediafolder/c/cddb/res/pmcddb039.c	(revision 213)
@@ -0,0 +1,25 @@
+/*
+ * This file is (C) Chris Wohlgemuth 1999
+ */
+/*
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; see the file COPYING.  If not, write to
+ * the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+
+#include <os2.h>
+
+PSZ queryLanguage()
+{
+  return "Italiano (039)";
+}
Index: /tags/CWMM-0.3.0_GA/mediafolder/c/cddb/res/pmcddb039.dlg
===================================================================
--- /tags/CWMM-0.3.0_GA/mediafolder/c/cddb/res/pmcddb039.dlg	(revision 213)
+++ /tags/CWMM-0.3.0_GA/mediafolder/c/cddb/res/pmcddb039.dlg	(revision 213)
@@ -0,0 +1,60 @@
+#ifndef OS2_INCLUDED
+   #include <os2.h>
+#endif
+
+DLGTEMPLATE IDDLG_CDDBSETUP2 LOADONCALL MOVEABLE DISCARDABLE
+BEGIN
+    DIALOG  "Impostazioni server CDDB", IDDLG_CDDBSETUP2, 37, 36, 208, 149, NOT
+            FS_DLGBORDER | WS_VISIBLE
+    BEGIN
+        GROUPBOX        "Impostazioni server CDDB", IDGB_CDDBSERVERSETUP, 11, 29,
+                        195, 116, NOT WS_GROUP
+        LTEXT           "Server:porta", IDST_SERVERPORT, 17, 123, 84, 8
+        LISTBOX         IDLB_CDDBSERVERS, 18, 63, 128, 56
+        PUSHBUTTON      "S~u", IDPB_SERVERUP, 155, 106, 40, 14, WS_GROUP
+        PUSHBUTTON      "G~i", IDPB_SERVERDOWN, 155, 88, 40, 14
+        PUSHBUTTON      "~Cancella", IDPB_SERVERDELETE, 155, 63, 40, 14
+        LTEXT           "Nuovo server:", IDST_NEWSERVER, 17, 50, 84, 8
+        ENTRYFIELD      "", IDEF_NEWSERVER, 19, 38, 126, 8, ES_MARGIN
+        PUSHBUTTON      "A~ggiungi", IDPB_SERVERADD, 155, 35, 40, 14
+        PUSHBUTTON      "~Regredire", IDPB_CDDB2UNDO, 16, 8, 40, 14, WS_GROUP
+        PUSHBUTTON      "A~iuto", IDPB_CDDB2HELP, 76, 8, 40, 14
+    END
+END
+
+DLGTEMPLATE IDDLG_CDDBSETUP LOADONCALL MOVEABLE DISCARDABLE
+BEGIN
+    DIALOG  "CDDB", IDDLG_CDDBSETUP, 25, 20, 226, 150, NOT FS_DLGBORDER |
+            WS_VISIBLE
+    BEGIN
+        GROUPBOX        "Impostazioni utente CDDB", IDGB_CDDBUSER, 9, 30, 142, 112,
+                        NOT WS_GROUP
+        AUTOCHECKBOX    "Usa ~CDDB", IDCB_USECDDB, 16, 119, 109, 10
+        LTEXT           "Nome utente:", IDST_USERNAME, 17, 104, 119, 8, NOT
+                        WS_GROUP
+        ENTRYFIELD      "", IDEF_CDDBUSER, 19, 92, 120, 8, ES_MARGIN
+        LTEXT           "Host utente:", IDST_USERHOST, 17, 77, 119, 8, NOT
+                        WS_GROUP
+        ENTRYFIELD      "", IDEF_USERHOST, 19, 65, 120, 8, ES_MARGIN
+        LTEXT           "Specificare i server nella pagina successiva.",
+                        IDST_SERVERNEXTPAGE, 17, 35, 124, 22, DT_WORDBREAK |
+                        NOT WS_GROUP
+        PUSHBUTTON      "~Regredire", IDPB_CDDBUNDO, 5, 9, 40, 14, WS_GROUP
+        PUSHBUTTON      "A~iuto", IDPB_CDDBHELP, 65, 9, 40, 14
+    END
+END
+
+DLGTEMPLATE IDDLG_CDDBCHOOSE LOADONCALL MOVEABLE DISCARDABLE
+BEGIN
+    DIALOG  "Consulta CDDB - Selezione scelta", IDDLG_CDDBCHOOSE, 29, 47, 258, 85, WS_VISIBLE,
+            FCF_TITLEBAR
+    BEGIN
+        LISTBOX         IDLB_CDDBCHOOSE, 5, 25, 246, 40, LS_HORZSCROLL
+        LTEXT           "Selezionare una di queste scelte:", IDST_CDDBCHOOSE, 6, 71, 246, 8
+        PUSHBUTTON      "~Ok", IDPB_OK, 5, 5, 40, 14
+        PUSHBUTTON      "~Annulla", IDPB_CANCEL, 55, 5, 40, 14
+    END
+END
+
+
+
Index: /tags/CWMM-0.3.0_GA/mediafolder/c/cddb/res/pmcddb039.rc
===================================================================
--- /tags/CWMM-0.3.0_GA/mediafolder/c/cddb/res/pmcddb039.rc	(revision 213)
+++ /tags/CWMM-0.3.0_GA/mediafolder/c/cddb/res/pmcddb039.rc	(revision 213)
@@ -0,0 +1,42 @@
+; .rc: Resource file
+;
+;                    (C) Chris Wohlgemuth 1999-2002
+;/*
+; * This program is free software; you can redistribute it and/or modify
+; * it under the terms of the GNU General Public License as published by
+; * the Free Software Foundation; either version 2, or (at your option)
+; * any later version.
+; *
+; * This program is distributed in the hope that it will be useful,
+; * but WITHOUT ANY WARRANTY; without even the implied warranty of
+; * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+; * GNU General Public License for more details.
+; *
+; * You should have received a copy of the GNU General Public License
+; * along with this program; see the file COPYING.  If not, write to
+; * the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
+; */
+#ifndef OS2_INCLUDED
+   #include <os2.h>
+#endif
+#include "pmcddbres.h"
+
+ICON 1 "freedb.ico"
+
+
+STRINGTABLE
+BEGIN
+
+
+; ******* CDDB *****************************
+IDSTR_CDDBQUERYLOCALDB   "CDDB-ID: %X, ricerca nel database locale..."
+IDSTR_ERRORCDDBLOCALDB      "Errore! Impossibile aprire il file CDDB.ini!"
+
+IDSTR_INIFILEOPENWARNING  "Attenzione! Impossibile aprire il file ini (cddb.ini)!"
+IDSTR_PMCDDBTITLE         "Richiesta CDDB"
+
+IDSTR_USAGE               "Usare l'opzione seguente per specificare l'indirizzo di posta elettronica:  /C <indirizzo di posta elettronica> "
+IDSTR_SETUPERROR         "Nome utente o host non correttamente impostati. Avviare pmcddb.exe con il parametro /C per specificare il proprio indirizzo di posta elettronica."
+END
+
+RCINCLUDE "pmcddb039.dlg"
Index: /tags/CWMM-0.3.0_GA/mediafolder/c/cddb/res/pmcddb049.c
===================================================================
--- /tags/CWMM-0.3.0_GA/mediafolder/c/cddb/res/pmcddb049.c	(revision 213)
+++ /tags/CWMM-0.3.0_GA/mediafolder/c/cddb/res/pmcddb049.c	(revision 213)
@@ -0,0 +1,25 @@
+/*
+ * This file is (C) Chris Wohlgemuth 1999
+ */
+/*
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; see the file COPYING.  If not, write to
+ * the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+
+#include <os2.h>
+
+PSZ queryLanguage()
+{
+  return "Deutsch (049)";
+}
Index: /tags/CWMM-0.3.0_GA/mediafolder/c/cddb/res/pmcddb049.dlg
===================================================================
--- /tags/CWMM-0.3.0_GA/mediafolder/c/cddb/res/pmcddb049.dlg	(revision 213)
+++ /tags/CWMM-0.3.0_GA/mediafolder/c/cddb/res/pmcddb049.dlg	(revision 213)
@@ -0,0 +1,61 @@
+#ifndef OS2_INCLUDED
+   #include <os2.h>
+#endif
+
+DLGTEMPLATE IDDLG_CDDBSETUP2 LOADONCALL MOVEABLE DISCARDABLE
+BEGIN
+    DIALOG  "CDDB server setup", IDDLG_CDDBSETUP2, 37, 36, 208, 149, NOT 
+            FS_DLGBORDER | WS_VISIBLE
+    BEGIN
+        GROUPBOX        "CDDB-Servereinrichtung", IDGB_CDDBSERVERSETUP, 11, 29, 
+                        195, 116, NOT WS_GROUP
+        LTEXT           "Server:Port", IDST_SERVERPORT, 17, 123, 84, 8
+        LISTBOX         IDLB_CDDBSERVERS, 18, 63, 128, 56
+        PUSHBUTTON      "A~uf", IDPB_SERVERUP, 155, 106, 40, 14, WS_GROUP
+        PUSHBUTTON      "A~b", IDPB_SERVERDOWN, 155, 88, 40, 14
+        PUSHBUTTON      "~Lschen", IDPB_SERVERDELETE, 155, 63, 40, 14
+        LTEXT           "Neuer Server:", IDST_NEWSERVER, 17, 50, 84, 8
+        ENTRYFIELD      "", IDEF_NEWSERVER, 19, 38, 126, 8, ES_MARGIN
+        PUSHBUTTON      "~Hinzu", IDPB_SERVERADD, 155, 35, 40, 14
+        PUSHBUTTON      "~Undo", IDPB_CDDB2UNDO, 16, 8, 40, 14, WS_GROUP
+        PUSHBUTTON      "~Hilfe", IDPB_CDDB2HELP, 76, 8, 40, 14
+    END
+END
+
+DLGTEMPLATE IDDLG_CDDBSETUP LOADONCALL MOVEABLE DISCARDABLE
+BEGIN
+    DIALOG  "CDDB", IDDLG_CDDBSETUP, 25, 20, 226, 150, NOT FS_DLGBORDER | 
+            WS_VISIBLE
+    BEGIN
+        GROUPBOX        "CDDB-Benutzereinrichtung", IDGB_CDDBUSER, 9, 30, 142, 112, 
+                        NOT WS_GROUP
+        AUTOCHECKBOX    "Benutze ~CDDB", IDCB_USECDDB, 16, 119, 109, 10
+        LTEXT           "Benutzername:", IDST_USERNAME, 17, 104, 119, 8, NOT 
+                        WS_GROUP
+        ENTRYFIELD      "", IDEF_CDDBUSER, 19, 92, 120, 8, ES_MARGIN
+        LTEXT           "Benutzerhost:", IDST_USERHOST, 17, 77, 119, 8, NOT 
+                        WS_GROUP
+        ENTRYFIELD      "", IDEF_USERHOST, 19, 65, 120, 8, ES_MARGIN
+        LTEXT           "Geben Sie die Server auf der nchsten Seite an.", 
+                        IDST_SERVERNEXTPAGE, 17, 35, 124, 22, DT_WORDBREAK | 
+                        NOT WS_GROUP
+        PUSHBUTTON      "~Undo", IDPB_CDDBUNDO, 5, 9, 40, 14, WS_GROUP
+        PUSHBUTTON      "~Hilfe", IDPB_CDDBHELP, 65, 9, 40, 14
+    END
+END
+
+DLGTEMPLATE IDDLG_CDDBCHOOSE LOADONCALL MOVEABLE DISCARDABLE
+BEGIN
+    DIALOG  "CDDB Abfrage - Trefferauswahl", IDDLG_CDDBCHOOSE, 29, 47, 258, 85, WS_VISIBLE, 
+            FCF_TITLEBAR
+    BEGIN
+        LISTBOX         IDLB_CDDBCHOOSE, 5, 25, 246, 40, LS_HORZSCROLL
+        LTEXT           "Bitte einen auswhlen:", IDST_CDDBCHOOSE, 6, 71, 246, 8
+        PUSHBUTTON      "~Ok", IDPB_OK, 5, 5, 40, 14
+        PUSHBUTTON      "~Abbruch", IDPB_CANCEL, 55, 5, 40, 14
+    END
+END
+
+
+
+
Index: /tags/CWMM-0.3.0_GA/mediafolder/c/cddb/res/pmcddb049.rc
===================================================================
--- /tags/CWMM-0.3.0_GA/mediafolder/c/cddb/res/pmcddb049.rc	(revision 213)
+++ /tags/CWMM-0.3.0_GA/mediafolder/c/cddb/res/pmcddb049.rc	(revision 213)
@@ -0,0 +1,41 @@
+; .rc: Resource file 
+;
+;                    (C) Chris Wohlgemuth 1999-2002
+;/*
+; * This program is free software; you can redistribute it and/or modify
+; * it under the terms of the GNU General Public License as published by
+; * the Free Software Foundation; either version 2, or (at your option)
+; * any later version.
+; *
+; * This program is distributed in the hope that it will be useful,
+; * but WITHOUT ANY WARRANTY; without even the implied warranty of
+; * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+; * GNU General Public License for more details.
+; *
+; * You should have received a copy of the GNU General Public License
+; * along with this program; see the file COPYING.  If not, write to
+; * the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
+; */
+#ifndef OS2_INCLUDED
+   #include <os2.h>
+#endif
+#include "pmcddbres.h"
+
+ICON 1 "freedb.ico"
+
+STRINGTABLE
+BEGIN
+
+
+; ******* CDDB *****************************
+IDSTR_CDDBQUERYLOCALDB   "CDDB-ID: %X, Suche im Cacheverzeichnis..."
+IDSTR_ERRORCDDBLOCALDB      "Warnung! Die Datei CDDB.ini kann nicht geffnet werden!"
+
+IDSTR_INIFILEOPENWARNING  "Warnung! Ini-Datei (cddb.ini) kann nicht geffnet werden!"
+IDSTR_PMCDDBTITLE         "CDDB Abfrage"  
+
+IDSTR_USAGE               "Email-Adresse mit folgender Option festlegen:  /C <Email-Adresse> "
+IDSTR_SETUPERROR         "Der Username oder der Host wurden nicht festgelegt. Pmcddb.exe mit Parameter /C starten, um die Adresse festzulegen."
+END
+
+RCINCLUDE "pmcddb049.dlg"
Index: /tags/CWMM-0.3.0_GA/mediafolder/c/cddb/res/pmcddb088.c
===================================================================
--- /tags/CWMM-0.3.0_GA/mediafolder/c/cddb/res/pmcddb088.c	(revision 213)
+++ /tags/CWMM-0.3.0_GA/mediafolder/c/cddb/res/pmcddb088.c	(revision 213)
@@ -0,0 +1,25 @@
+/*
+ * This file is (C) Chris Wohlgemuth 1999
+ */
+/*
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; see the file COPYING.  If not, write to
+ * the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+
+#include <os2.h>
+
+PSZ queryLanguage()
+{
+  return "Taiwan (088)";
+}
Index: /tags/CWMM-0.3.0_GA/mediafolder/c/cddb/res/pmcddb088.dlg
===================================================================
--- /tags/CWMM-0.3.0_GA/mediafolder/c/cddb/res/pmcddb088.dlg	(revision 213)
+++ /tags/CWMM-0.3.0_GA/mediafolder/c/cddb/res/pmcddb088.dlg	(revision 213)
@@ -0,0 +1,61 @@
+#ifndef OS2_INCLUDED
+   #include <os2.h>
+#endif
+
+DLGTEMPLATE IDDLG_CDDBSETUP2 LOADONCALL MOVEABLE DISCARDABLE
+BEGIN
+    DIALOG  "CDDB ŠøªAŸ¹³]©w", IDDLG_CDDBSETUP2, 37, 36, 208, 149, NOT 
+            FS_DLGBORDER | WS_VISIBLE
+    BEGIN
+        GROUPBOX        "CDDB ŠøªAŸ¹³]©w", IDGB_CDDBSERVERSETUP, 11, 29, 
+                        195, 116, NOT WS_GROUP
+        LTEXT           "ŠøªAŸ¹¡G°ð", IDST_SERVERPORT, 17, 123, 84, 8
+        LISTBOX         IDLB_CDDBSERVERS, 18, 63, 128, 56
+        PUSHBUTTON      "€W(~P)", IDPB_SERVERUP, 155, 106, 40, 14, WS_GROUP
+        PUSHBUTTON      "€U(~O)", IDPB_SERVERDOWN, 155, 88, 40, 14
+        PUSHBUTTON      "§R°£(~D)", IDPB_SERVERDELETE, 155, 63, 40, 14
+        LTEXT           "·sŠøªAŸ¹¡G", IDST_NEWSERVER, 17, 50, 84, 8
+        ENTRYFIELD      "", IDEF_NEWSERVER, 19, 38, 126, 8, ES_MARGIN
+        PUSHBUTTON      "ŒW¥[(~A)", IDPB_SERVERADD, 155, 35, 40, 14
+        PUSHBUTTON      "Š^Ž_(~U)", IDPB_CDDB2UNDO, 16, 8, 40, 14, WS_GROUP
+        PUSHBUTTON      "žÑ»¡(~H)", IDPB_CDDB2HELP, 76, 8, 40, 14
+    END
+END
+
+DLGTEMPLATE IDDLG_CDDBSETUP LOADONCALL MOVEABLE DISCARDABLE
+BEGIN
+    DIALOG  "CDDB", IDDLG_CDDBSETUP, 25, 20, 226, 150, NOT FS_DLGBORDER | 
+            WS_VISIBLE
+    BEGIN
+        GROUPBOX        "CDDB šÏ¥ÎªÌ³]©w", IDGB_CDDBUSER, 9, 30, 142, 112, 
+                        NOT WS_GROUP
+        AUTOCHECKBOX    "šÏ¥Î CDDB(~C)", IDCB_USECDDB, 16, 119, 109, 10
+        LTEXT           "šÏ¥ÎªÌŠWºÙ¡G", IDST_USERNAME, 17, 104, 119, 8, NOT 
+                        WS_GROUP
+        ENTRYFIELD      "", IDEF_CDDBUSER, 19, 92, 120, 8, ES_MARGIN
+        LTEXT           "šÏ¥ÎªÌ¥DŸ÷¡G", IDST_USERHOST, 17, 77, 119, 8, NOT 
+                        WS_GROUP
+        ENTRYFIELD      "", IDEF_USERHOST, 19, 65, 120, 8, ES_MARGIN
+        LTEXT           "Šb€U€@­¶«ü©wŠøªAŸ¹¡C", 
+                        IDST_SERVERNEXTPAGE, 17, 35, 124, 22, DT_WORDBREAK | 
+                        NOT WS_GROUP
+        PUSHBUTTON      "Š^Ž_(~U)", IDPB_CDDBUNDO, 5, 9, 40, 14, WS_GROUP
+        PUSHBUTTON      "žÑ»¡(~H)", IDPB_CDDBHELP, 65, 9, 40, 14
+    END
+END
+
+DLGTEMPLATE IDDLG_CDDBCHOOSE LOADONCALL MOVEABLE DISCARDABLE
+BEGIN
+    DIALOG  "¬džß CDDB - ¬Û²Å¿ïŸÜ", IDDLG_CDDBCHOOSE, 29, 47, 258, 85, WS_VISIBLE, 
+            FCF_TITLEBAR
+    BEGIN
+        LISTBOX         IDLB_CDDBCHOOSE, 5, 25, 246, 40, LS_HORZSCROLL
+        LTEXT           "¿ïšú¬Û²Åªº¬džß¡G", IDST_CDDBCHOOSE, 6, 71, 246, 8
+        PUSHBUTTON      "~Ok", IDPB_OK, 5, 5, 40, 14
+        PUSHBUTTON      "šú®ø(~C)", IDPB_CANCEL, 55, 5, 40, 14
+    END
+END
+
+
+
+
Index: /tags/CWMM-0.3.0_GA/mediafolder/c/cddb/res/pmcddb088.rc
===================================================================
--- /tags/CWMM-0.3.0_GA/mediafolder/c/cddb/res/pmcddb088.rc	(revision 213)
+++ /tags/CWMM-0.3.0_GA/mediafolder/c/cddb/res/pmcddb088.rc	(revision 213)
@@ -0,0 +1,44 @@
+; .rc: Resource file 
+;
+;                    (C) Chris Wohlgemuth 1999-2002
+;/*
+; * This program is free software; you can redistribute it and/or modify
+; * it under the terms of the GNU General Public License as published by
+; * the Free Software Foundation; either version 2, or (at your option)
+; * any later version.
+; *
+; * This program is distributed in the hope that it will be useful,
+; * but WITHOUT ANY WARRANTY; without even the implied warranty of
+; * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+; * GNU General Public License for more details.
+; *
+; * You should have received a copy of the GNU General Public License
+; * along with this program; see the file COPYING.  If not, write to
+; * the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
+; */
+#ifndef OS2_INCLUDED
+   #include <os2.h>
+#endif
+#include "pmcddbres.h"
+
+CODEPAGE 950
+ICON 1 "freedb.ico"
+
+
+STRINGTABLE
+BEGIN
+
+
+; ******* CDDB *****************************
+IDSTR_CDDBQUERYLOCALDB   "CDDB-ID: %X, ¥¿Šb¬džß¥»Ÿ÷ºÝªºžê®Æ®w..."
+IDSTR_ERRORCDDBLOCALDB      "Äµ§i¡IµLªk¶}±Ò CDDB.ini ÀÉ®×¡I"
+
+IDSTR_INIFILEOPENWARNING  "Äµ§i¡IµLªk¶}±Ò Ini ÀÉ®×¡]cddb.ini¡^¡I"
+IDSTR_PMCDDBTITLE         "¬džß CDDB"  
+
+IDSTR_USAGE               "šÏ¥Î¥H€Uªº¿ï¶µšÓ³]©w§Aªº email¡G /C <email address> "
+IDSTR_SETUPERROR         "µLªk¥¿œT³]©w§AªºšÏ¥ÎªÌŠWºÙ©Î¥DŸ÷¡CœÐ¥H /C °ÑŒÆ±Ò°Ê pmcddb.exe šÓ³]©w email¡C"
+END
+
+RCINCLUDE "pmcddb088.dlg"
+
Index: /tags/CWMM-0.3.0_GA/mediafolder/c/cdfldr/cdfldrdialogprocs.cpp
===================================================================
--- /tags/CWMM-0.3.0_GA/mediafolder/c/cdfldr/cdfldrdialogprocs.cpp	(revision 213)
+++ /tags/CWMM-0.3.0_GA/mediafolder/c/cdfldr/cdfldrdialogprocs.cpp	(revision 213)
@@ -0,0 +1,123 @@
+/*
+ * This file is (C) Chris Wohlgemuth 2002
+ * It is part of the MediaFolder package
+ */
+/*
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; see the file COPYING.  If not, write to
+ * the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+#define INCL_GPILCIDS
+#define INCL_GPIPRIMITIVES
+#define INCL_GPIBITMAPS
+#define INCL_SW
+
+#include "mediafolderres.h"
+
+
+#include <stdio.h>
+#include <stdlib.h>
+
+#include "cdfolder.hh"
+
+
+extern HMODULE hResource;
+extern PFNWP pfnwpGenericCDFrame;
+
+/* Extern */
+BOOL getMessage(char* text,ULONG ulID, LONG lSizeText, HMODULE hResource,HWND hwnd);
+MRESULT cwInsertMenuItem(int iPosition, HWND hwndMenu, HWND hwndSubMenu, int iID, char * chrText);
+MRESULT cwInsertMenuSeparator(int iPosition, HWND hwndMenu, HWND hwndSubMenu);
+
+void writeLogPrintf(char* logFile, char* format, ...);
+
+
+extern SOMClass* cwGetSomClass(char* chrClassName);
+
+/************************************************************
+ *                                                          *
+ * This frame proc handles the about menuitem of the        *
+ * Warp 4 menu bar and removes the Tree view item.          *
+ *                                                          *
+************************************************************/
+MRESULT EXPENTRY cdFrameProc(HWND hwnd, ULONG msg, MPARAM mp1, MPARAM mp2)
+{
+  CWCDFolder* thisPtr;
+  HWND hwndDialog;
+  MENUITEM mi;
+  char text[100];
+
+  switch (msg)
+    {
+    case WM_INITMENU:
+      if((hwndDialog=WinWindowFromID(hwnd,IDDLG_TOPFRAME))!=NULLHANDLE)
+        {
+          thisPtr=(CWCDFolder*) WinQueryWindowULong(hwndDialog,QWL_USER);
+          if(somIsObj(thisPtr)) {
+            switch(thisPtr->usLastSelMenuItem)
+              {
+              case 0x2d1: /* view menu */
+                /* Remove change to icon view from menubar menu */ 
+                WinSendMsg(HWNDFROMMP(mp2),MM_REMOVEITEM,MPFROM2SHORT(0x2cc,TRUE),0);
+                /* Remove sort from menubar. It's already disabled but anyway... */ 
+                WinSendMsg(HWNDFROMMP(mp2),MM_REMOVEITEM,MPFROM2SHORT( 5,TRUE),0);
+                /* Remove arrange from menubar. It's already disabled but anyway... */ 
+                WinSendMsg(HWNDFROMMP(mp2),MM_REMOVEITEM,MPFROM2SHORT( 0x135,TRUE),0);
+                WinSendMsg(HWNDFROMMP(mp2),MM_REMOVEITEM,MPFROM2SHORT( 0x136,TRUE),0);
+
+                break;
+              case 0x2d0: /* edit menu */
+                /* The following are for a content object */
+                /* Remove create from menubar */ 
+                WinSendMsg(HWNDFROMMP(mp2),MM_REMOVEITEM,MPFROM2SHORT(0x65,TRUE),0);
+                /* Remove move from menubar */ 
+                WinSendMsg(HWNDFROMMP(mp2),MM_REMOVEITEM,MPFROM2SHORT(0x6b,TRUE),0);
+                /* Remove copy from menubar */ 
+                WinSendMsg(HWNDFROMMP(mp2),MM_REMOVEITEM,MPFROM2SHORT(0x6c,TRUE),0);
+                /* Remove insert from menubar */ 
+                WinSendMsg(HWNDFROMMP(mp2),MM_REMOVEITEM,MPFROM2SHORT(0x2cb,TRUE),0);
+                /* Remove delete from menubar */ 
+                WinSendMsg(HWNDFROMMP(mp2),MM_REMOVEITEM,MPFROM2SHORT(0x6d,TRUE),0);
+                /* Remove create shadow from menubar */ 
+                WinSendMsg(HWNDFROMMP(mp2),MM_REMOVEITEM,MPFROM2SHORT(0x13c,TRUE),0);
+                break;
+              case 0x2cf: /* Folder menu */
+                /* Remove copy from menubar */ 
+                WinSendMsg(HWNDFROMMP(mp2),MM_REMOVEITEM,MPFROM2SHORT(0x6c,TRUE),0);
+                /* Remove create from menubar */ 
+                WinSendMsg(HWNDFROMMP(mp2),MM_REMOVEITEM,MPFROM2SHORT(0x65,TRUE),0);
+              default:
+                break;
+              }
+          }
+        }
+      break;
+    default:
+      break;
+    }
+  /* Any other message is handled by the folder frame procedure */
+  if((hwndDialog=WinWindowFromID(hwnd,IDDLG_TOPFRAME))!=NULLHANDLE)
+    {
+      thisPtr=(CWCDFolder*) WinQueryWindowULong(hwndDialog,QWL_USER);
+      if(somIsObj(thisPtr)) {
+        if(thisPtr->pfnwpCDFrame)
+          return thisPtr->pfnwpCDFrame(hwnd, msg, mp1, mp2);
+      }
+    }
+  return  pfnwpGenericCDFrame(hwnd, msg, mp1, mp2);
+
+}
+
+
+
+
Index: /tags/CWMM-0.3.0_GA/mediafolder/c/cdfldr/cdfolder.cpp
===================================================================
--- /tags/CWMM-0.3.0_GA/mediafolder/c/cdfldr/cdfolder.cpp	(revision 213)
+++ /tags/CWMM-0.3.0_GA/mediafolder/c/cdfldr/cdfolder.cpp	(revision 213)
@@ -0,0 +1,108 @@
+/*
+ * This file is (C) Chris Wohlgemuth 2002-2005
+ * 
+ * It's part of the Media-Folder distribution
+ */
+/*
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; see the file COPYING.  If not, write to
+ * the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+
+#define INCL_DOSERRORS
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include "mediafolderres.h"
+#include "cdfolder.hh"
+
+extern char chrInstallDir[CCHMAXPATH];
+
+extern HFILE  openDrive(char* drive);
+extern void   closeDrive(HFILE hfDrive);
+extern int    CDQueryAudioCDTracks(HFILE hfDrive);
+LONG extern   CDQueryTrackSecs(ULONG numTrack, char * drive);
+extern ULONG launchPMWrapper(PSZ pszTitle, PSZ wrapperExe, PSZ parameters);
+
+BOOL CWCDFolder::cwInsertAllTracks(char* chrCDDrive)
+{
+  HFILE hfDrive;
+  ULONG ulSize;
+  ULONG flWindowAttr;
+  HWND hwndCnr=NULLHANDLE;
+  WPObject *wpObject;
+
+  wpDeleteContents(NULL);
+
+  ulNumTracks=0;
+
+  if(WinIsWindow(WinQueryAnchorBlock(HWND_DESKTOP), hwndFrameCDFldr)) {
+    if((hwndCnr=WinWindowFromID(hwndFrameCDFldr, FID_CLIENT))!=NULLHANDLE) {
+      WinEnableWindowUpdate(hwndCnr, FALSE);
+    }
+  }
+
+  //  WinMessageBox(HWND_DESKTOP,HWND_DESKTOP, chrCDDrive, "", 12324, MB_MOVEABLE);
+  if((hfDrive=openDrive(chrCDDrive))!=NULLHANDLE)
+    {
+      char chrFreeDBClient[CCHMAXPATH]={0};
+      ulNumTracks=CDQueryAudioCDTracks(hfDrive);
+      closeDrive(hfDrive);
+      if(ulNumTracks>0) {
+        int a;
+        char chrTarget[CCHMAXPATH];
+        char chrTitle[CCHMAXPATH];
+        char chrSetup[CCHMAXPATH];
+        ulSize=sizeof(chrTarget);
+        wpQueryRealName(chrTarget, &ulSize, TRUE);
+        for(a=ulNumTracks;a>0;a--) {
+          LONG lSecs;
+          lSecs=CDQueryTrackSecs(a, chrCDDrive);
+          sprintf(chrSetup,"CWAUDIOPLAYTIME=%d;CWCDTTRACKNUM=%d;OBJECTID=<CDTRACK_%c_%d>", lSecs, a, chrDrive[0], a);
+          //sprintf(chrSetup,"CWAUDIOPLAYTIME=%d;CWCDTTRACKNUM=%d", lSecs, a);
+          //        if(a==1)
+          //        WinMessageBox(HWND_DESKTOP,HWND_DESKTOP, chrSetup, "", 12324, MB_MOVEABLE);
+          sprintf(chrTitle,"Track %02d",a);
+          WinCreateObject("MMCDTrack", chrTitle, chrSetup, chrTarget, CO_REPLACEIFEXISTS);
+        }
+
+        /* Query FreeDB */
+        if(PrfQueryProfileString(HINI_USERPROFILE, APPKEY_CWMM, KEY_FREEDBCLIENTROOT,"", 
+                                 chrFreeDBClient, sizeof(chrFreeDBClient)))
+          {
+            char chrParams[CCHMAXPATH+20];
+            strcat(chrFreeDBClient, FREEDB_CLIENT_NAME);
+            sprintf(chrParams, "%s \"%s%s\"", chrCDDrive, chrInstallDir, FREEDB_REXXSCRIPT);
+            launchPMWrapper("FreeDB", chrFreeDBClient, chrParams);
+          }
+      }
+      else
+        ulNumTracks=0;
+    }
+  if(hwndCnr) {
+    WinShowWindow(hwndCnr, TRUE);
+  }
+#if 0
+  /* Set emphasis of first track */
+  wpObject=wpQueryContent(NULLHANDLE, (ULONG)QC_LAST);
+  if(somIsObj(wpObject))
+    wpObject->wpCnrSetEmphasis(CRA_SELECTED, TRUE);
+#endif
+  return TRUE;
+}
+
+
+
+
+
+
Index: /tags/CWMM-0.3.0_GA/mediafolder/c/cdfldr/cdfolderoverriddenwpclsmethods.cpp
===================================================================
--- /tags/CWMM-0.3.0_GA/mediafolder/c/cdfldr/cdfolderoverriddenwpclsmethods.cpp	(revision 213)
+++ /tags/CWMM-0.3.0_GA/mediafolder/c/cdfldr/cdfolderoverriddenwpclsmethods.cpp	(revision 213)
@@ -0,0 +1,273 @@
+/*
+ * This file is (C) Chris Wohlgemuth 2002
+ * 
+ * It's part of the media folder distribution
+ */
+/*
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; see the file COPYING.  If not, write to
+ * the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+
+#include "cdfolder.hh"
+#include <stdio.h>
+#include <stdlib.h>
+ 
+//extern HMODULE hResource;
+extern char chrInstallDir[CCHMAXPATH];
+
+ULONG launchRexx(PSZ rexxFile);
+HMODULE queryModuleHandle(PSZ pszClassName);
+HMODULE queryResModuleHandle(void);
+BOOL _queryHelpLibrary(char * chrBuffer, int iSize);
+BOOL getMessage(char* text,ULONG ulID, LONG lSizeText, HMODULE hResource,HWND hwnd);
+BOOL extern CDQueryCDDrives(int *iNumCD, char * cFirstDrive);
+SOMClass* somhlpGetSomClass(char* chrClassName);
+HMODULE queryModuleHandle(PSZ pszClassName);
+
+/* Overriden function which returns our class name */
+PSZ M_CWCDFolder::wpclsQueryTitle()
+{
+  static char chrTitle[40];
+
+  if(getMessage(chrTitle, IDSTR_TITLECDFOLDER,sizeof(chrTitle), queryResModuleHandle(), HWND_DESKTOP))
+    return chrTitle;
+  /* Fall back in case of error */
+  return "CD-Player";
+}
+
+ULONG M_CWCDFolder::wpclsQueryStyle()
+{
+  return (M_CWMediaFolder::wpclsQueryStyle()|CLSSTYLE_NEVERTEMPLATE|CLSSTYLE_DONTTEMPLATE);
+}
+
+BOOL M_CWCDFolder::wpclsCreateDefaultTemplates(WPObject * wpObject)
+{
+  /* We don't wont any templates */
+  return TRUE;
+}
+
+/* Overriden function which returns the custom icon */
+ULONG M_CWCDFolder::wpclsQueryIconData(PICONINFO pIconInfo)
+{
+  //  HMODULE hResource=queryResModuleHandle();
+  HMODULE hResource=queryModuleHandle("M_CWCDFolder");
+
+  if(!hResource)
+    return M_CWMediaFolder::wpclsQueryIconData(pIconInfo);
+  
+  if (pIconInfo)   {
+    pIconInfo->fFormat = ICON_RESOURCE;
+    pIconInfo->hmod    = hResource;
+    pIconInfo->resid   = IDICON_CDFOLDER;
+  } /* endif */
+
+  return ( sizeof(ICONINFO) );
+}
+
+
+
+/* Overriden function which returns the custom icon */
+ULONG M_CWCDFolder::wpclsQueryIconDataN(PICONINFO pIconInfo, ULONG ulIconIndex)
+{
+  HMODULE hResource=queryResModuleHandle();
+
+  if(!hResource)
+    return M_CWMediaFolder::wpclsQueryIconData(pIconInfo);
+
+  if (pIconInfo)   {
+    pIconInfo->fFormat = ICON_RESOURCE;
+    pIconInfo->hmod    = hResource;
+    pIconInfo->resid   = IDICON_CDFOLDER;
+  } /* endif */
+
+  return ( sizeof(ICONINFO) );
+}
+
+#if 0
+MRESULT EXPENTRY cdCreateObjWindowProc(HWND hwnd, ULONG msg, MPARAM mp1, MPARAM mp2)
+{
+
+  switch (msg)
+    {
+    case WM_APPTERMINATENOTIFY:
+      {
+DosBeep(5000, 200);  
+        WinStartTimer(WinQueryAnchorBlock(hwnd), hwnd, 1, 2500);
+        break;
+      }
+    case WM_TIMER:
+      if(SHORT1FROMMP(mp1)==1) {
+        int iNumCD;
+        char cFirst;
+        
+        WinStopTimer(WinQueryAnchorBlock(hwnd), hwnd,1);
+        
+        if(CDQueryCDDrives(&iNumCD, &cFirst)) {
+          char name[100];
+          char setup[100];
+          char id[40];
+          int a;
+          
+          DosSleep(1000);
+          
+          while(!somhlpGetSomClass(CDFLDR_CLASSNAME))
+            DosSleep(100);
+          
+          for(a=0;a<iNumCD;a++) {
+            int b;
+            /* Build folder name */
+            sprintf(name, "CD-Audio^Drive %c:", cFirst+a);
+            /* Build object ID */
+            sprintf(id, CDFLDR_ID, cFirst+a);
+            /* Build setup string */
+            sprintf(setup, "%s=%c:;OBJECTID=%s;", CDFLDR_DRIVE, cFirst+a, id);
+            for(b=1;b<=5;b++) {
+              /* Wait to let WPS load the class if not yet done. Then retry */ 
+              if(!WinCreateObject(CDFLDR_CLASSNAME, name, setup,CDFLDR_LOCATION, CO_UPDATEIFEXISTS))
+                printf("Can't create %s\n", name);
+              else
+                break;
+              DosSleep(1000);
+            }
+          }
+        }
+        return (MRESULT)FALSE;
+      }
+      break;
+    default:
+      break;
+    }
+  return WinDefWindowProc( hwnd, msg, mp1, mp2);
+}
+
+void _Optlink createCDThreadFunc (void *arg)
+{
+  HAB  hab;
+  HMQ  hmq;
+  QMSG qmsg;
+
+  hab=WinInitialize(0);
+  if(hab) {
+    hmq=WinCreateMsgQueue(hab,0);
+    if(hmq) {
+      HWND hwnd;
+      int iNumCD;
+      char cFirst;
+    
+      if(CDQueryCDDrives(&iNumCD, &cFirst)) {
+        char name[100];
+        char setup[100];
+        char id[40];
+        int a;
+  
+        DosSleep(1000);
+
+        while(!somhlpGetSomClass(CDFLDR_CLASSNAME))
+          DosSleep(100);
+
+        for(a=0;a<iNumCD;a++) {
+          int b;
+          /* Build folder name */
+          sprintf(name, "CD-Audio^Drive %c:", cFirst+a);
+          /* Build object ID */
+          sprintf(id, CDFLDR_ID, cFirst+a);
+          /* Build setup string */
+          sprintf(setup, "%s=%c:;OBJECTID=%s;", CDFLDR_DRIVE, cFirst+a, id);
+          for(b=1;b<=5;b++) {
+            /* Wait to let WPS load the class if not yet done. Then retry */ 
+            if(!WinCreateObject(CDFLDR_CLASSNAME, name, setup,CDFLDR_LOCATION, CO_UPDATEIFEXISTS))
+              printf("Can't create %s\n", name);
+            else
+              break;
+            DosSleep(1000);
+          }
+        }
+      }
+      WinDestroyMsgQueue(hmq);
+    }
+    WinTerminate(hab);
+  }
+}
+#endif
+
+void _Optlink createCDThreadFunc (void *arg)
+{
+  HAB  hab;
+  HMQ  hmq;
+  QMSG qmsg;
+
+  hab=WinInitialize(0);
+  if(hab) {
+    hmq=WinCreateMsgQueue(hab,0);
+    if(hmq) {
+
+      launchRexx( SCRIPT_CREATEPLAYERS);
+      
+      WinDestroyMsgQueue(hmq);
+    }
+    WinTerminate(hab);
+  }
+}
+
+void M_CWCDFolder::wpclsInitData()
+{
+  static BOOL bObjectsCreated=FALSE;
+
+  /* Call parent */
+  M_CWMediaFolder::wpclsInitData();
+
+  /* Be sure we have our install dir */
+  queryModuleHandle("M_CWCDFolder");
+
+  /*
+    V0.2.8 CW 2004/11/01
+
+    Don't start a thread here for creating the cd objects. That will hang the
+    system in many cases.
+   */
+#if 0
+  /* Start skript to create cd objects */
+  _beginthread(createCDThreadFunc,NULL,8192*16, NULLHANDLE); //Fehlerbehandlung fehlt
+#endif
+
+#if 0
+  if(!bObjectsCreated) {
+    HWND hwnd;
+
+    // _beginthread(createCDThreadFunc,NULL,8192*16, NULLHANDLE); //Fehlerbehandlung fehlt
+    //    launchRexx( SCRIPT_CREATEPLAYERS);
+    hwnd=WinCreateWindow(HWND_OBJECT,WC_STATIC,"playObj", 0, 0, 0, 0, 0, 
+                         NULLHANDLE, HWND_BOTTOM,12343,NULL,NULL);
+    if(hwnd) {
+      /* Window created. */
+
+      if(WinSubclassWindow(hwnd,cdCreateObjWindowProc))
+        DosBeep(1000, 200);
+      WinPostMsg(hwnd, WM_APPTERMINATENOTIFY, 0, 0);
+    }
+  }
+  bObjectsCreated=TRUE;
+#endif
+}
+
+BOOL M_CWCDFolder::wpclsQueryDefaultHelp(PULONG HelpPanelId,PSZ HelpLibrary)
+{
+  if(HelpLibrary)
+    _queryHelpLibrary(HelpLibrary, CCHMAXPATH);
+
+  if(HelpPanelId)
+    *HelpPanelId= IDHLP_CDFOLDERMAIN;
+	
+  return TRUE;
+}
Index: /tags/CWMM-0.3.0_GA/mediafolder/c/cdfldr/cdfolderoverriddenwpmethods.cpp
===================================================================
--- /tags/CWMM-0.3.0_GA/mediafolder/c/cdfldr/cdfolderoverriddenwpmethods.cpp	(revision 213)
+++ /tags/CWMM-0.3.0_GA/mediafolder/c/cdfldr/cdfolderoverriddenwpmethods.cpp	(revision 213)
@@ -0,0 +1,706 @@
+/*
+ * This file is (C) Chris Wohlgemuth 2002-2005
+ * 
+ * It's part of the Media-Folder distribution
+ */
+/*
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; see the file COPYING.  If not, write to
+ * the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+
+#define INCL_DOSERRORS
+#include <stdio.h>
+#include <stdlib.h>
+#include <ctype.h>
+#include "cdfolder.hh"
+#include "mediafolderres.h"
+#include "cwcdtrack.hh"
+
+#include "sys_funcs.h"
+ 
+extern HMTX hmtxFileName;
+extern int  iWaveDev;
+PFNWP pfnwpGenericCDFrame;
+
+/* For calling the method in the MMAudio class. Linking to the DLL would require the
+   new audio classes. By dynamically querying the method the media folder works without
+   installing the audio classes. */  
+typedef ULONG   SOMLINK somTP_MMCDTrack_cwmmQueryTrackInfo(MMCDTrack *somSelf,
+		char** chrString,
+		ULONG ulSize,
+		int iWhich);
+typedef somTP_MMCDTrack_cwmmQueryTrackInfo *somTD_MMCDTrack_cwmmQueryTrackInfo;
+extern somTD_MMCDTrack_cwmmQueryTrackInfo methodPtrCDTrack;
+
+BOOL extern CDQueryCDDrives(int *iNumCD, char * cFirstDrive);
+
+BOOL getMessage(char* text,ULONG ulID, LONG lSizeText, HMODULE hResource,HWND hwnd);
+HMODULE queryResModuleHandle(void);
+
+ULONG cwRequestMutex(HMTX  hmtxBMP, ULONG ulTimeOut);
+ULONG cwReleaseMutex(HMTX  hmtxBMP);
+
+SOMClass* somhlpGetSomClass(char* chrClassName);
+extern BOOL somhlpQueryCWCDTrackMethodPtr(CWMediaFolder *thisPtr);
+MRESULT EXPENTRY cdFrameProc(HWND hwnd, ULONG msg, MPARAM mp1, MPARAM mp2);
+extern void showPlayTimeDisplay(CWMediaFolder *thisPtr, BOOL bShow);
+void setPlayTimeText2(CWMediaFolder *thisPtr, char * theText);
+
+/* Get the HWND of the play control dialog. This Dialog is on top of
+   the top frame control. */
+HWND playControlDialogFromFrameHWND(HWND hwndFrame);
+
+
+BOOL CWCDFolder::wpSetupOnce(PSZ pSetupString)
+{
+  /**************************************************
+   *                                                *
+   *                                                *
+   **************************************************/
+  BOOL rcParent=FALSE;
+  char buffer[CCHMAXPATH];
+  ULONG bufferSize;
+  int iIndex;
+
+  rcParent=CWMediaFolder::wpSetupOnce(pSetupString);
+
+  /* Doing our own setup here if not done by the user. */
+#if 0
+  /* This is already done in the media folder class */
+  bufferSize=sizeof(buffer);
+  if(!wpScanSetupString(pSetupString,"DEFAULTVIEW",buffer,&bufferSize))
+    wpSetup( "DEFAULTVIEW=DETAILS");/* Fill in defaults */
+
+  bufferSize=sizeof(buffer);
+  if(!wpScanSetupString(pSetupString,"ICONVIEW",buffer,&bufferSize))
+    wpSetup( "ICONVIEW=NONFLOWED,MINI");/* Fill in defaults */
+
+  /* Size and position of the folder window */
+  bufferSize=sizeof(buffer);
+  if(!wpScanSetupString(pSetupString,"ICONVIEWPOS",buffer,&bufferSize))
+    wpSetup( "ICONVIEWPOS=20,10,60,75");/* Fill in defaults */
+#endif
+
+  /* Set folder details- and sortclass to CWAudioShadow so track infos are shown */
+  bufferSize=sizeof(buffer);
+  if(!wpScanSetupString(pSetupString,"DETAILSCLASS",buffer,&bufferSize))
+    wpSetup("DETAILSCLASS=MMAudio");/* Fill in defaults */
+  
+  bufferSize=sizeof(buffer);
+  if(!wpScanSetupString(pSetupString,"SORTCLASS",buffer,&bufferSize))
+    wpSetup("SORTCLASS=MMCDTrack");/* Fill in defaults */
+  
+  /* This works only on Warp 4 and above */
+  bufferSize=sizeof(buffer);
+  if(!wpScanSetupString(pSetupString,"DETAILSTODISPLAY",buffer,&bufferSize))
+    /* This works only on Warp 4 and above */
+    wpSetup("DETAILSTODISPLAY=0,1,12,16,17,18");/* Fill in defaults */
+  
+  /* This works only on Warp 4 and above */
+  bufferSize=sizeof(buffer);
+  if(!wpScanSetupString(pSetupString,"SORTBYATTR",buffer,&bufferSize))
+    /* This works only on Warp 4 and above */
+    wpSetup("SORTBYATTR=6,24,28,29,30");/* Fill in defaults */
+  
+  return rcParent;
+}
+
+BOOL CWCDFolder::wpSetup(PSZ pSetupString)
+{
+  /**************************************************
+   *                                                *
+   *                                                *
+   **************************************************/
+  char buffer[3];
+  ULONG bufferSize;
+
+  /* Set drive letter */
+  bufferSize=sizeof(buffer);
+  if(wpScanSetupString(pSetupString, CDFLDR_DRIVE, buffer,&bufferSize))
+    {
+      if(buffer[1]==':' /*&& (buffer[0]>='A' && buffer[0]<='Z' )*/) {
+        buffer[2]=0;
+        strcpy(chrDrive, buffer);
+      }
+    }
+  return CWMediaFolder::wpSetup(pSetupString);
+}
+
+BOOL CWCDFolder::wpSaveState()
+{
+
+  wpSaveString("CWCDFolder", KEY_DRIVE, (PBYTE)&chrDrive);
+
+  return CWMediaFolder::wpSaveState();
+}
+
+BOOL CWCDFolder::wpRestoreState(ULONG ulReserved)
+{
+  ULONG dataSize;
+
+  chrDrive[0]=0;
+  dataSize=sizeof(chrDrive);
+  if(wpRestoreString("CWCDFolder",KEY_DRIVE,(PBYTE)&chrDrive,&dataSize))
+    chrDrive[2]=0;
+
+  return CWMediaFolder::wpRestoreState(ulReserved);
+}
+
+ULONG CWCDFolder::wpFilterPopupMenu(ULONG ulFlags, HWND hwndCnr, BOOL fMultiSelect)
+{
+  return CWMediaFolder::wpFilterPopupMenu(ulFlags, hwndCnr, fMultiSelect)&
+    ~(CTXT_SORT|CTXT_ARRANGE|CTXT_COPY|CTXT_ICON|CTXT_CHANGETOICON|CTXT_CHANGETOTREE|CTXT_CHANGETODETAILS);
+}
+
+ULONG CWCDFolder::wpAddObjectGeneralPage2(HWND hwndNotebook)
+{
+  return SETTINGS_PAGE_REMOVED;
+}
+
+ULONG CWCDFolder::wpAddFolderSortPage(HWND hwndNotebook)
+{
+  return SETTINGS_PAGE_REMOVED;
+}
+
+ULONG CWCDFolder::wpAddFolderIncludePage(HWND hwndNotebook)
+{
+  return SETTINGS_PAGE_REMOVED;
+}
+
+ULONG CWCDFolder::wpQueryConcurrentView()
+{
+  /* Only one view allowed */
+  return 2;//CCVIEW_OFF
+}
+
+MRESULT CWCDFolder::wpDragOver(HWND hwndCnr,PDRAGINFO pDragInfo)
+{
+  return MRFROM2SHORT( DOR_NEVERDROP, DO_MOVE);/* Dropping is not allowed */
+}
+
+BOOL CWCDFolder::wpRefresh(ULONG ulView, PVOID pReserved)
+{
+  //  SysWriteToTrapLog("%s: view: %d, %x, %x\n", 
+  //                __FUNCTION__, ulView, ulView, cwQueryMFldrFlags() );
+
+  /* User changes the view of the CD-Folder, don't reinsert the tracks when changing from/to
+     compact view. */
+  if(ulView==OPEN_DETAILS &&  !(cwQueryMFldrFlags() & MFLDR_VIEW_COMPACT))
+    cwInsertAllTracks(chrDrive);
+  /* Normal refresh */
+  if(ulView==0)
+    cwInsertAllTracks(chrDrive);
+  return CWMediaFolder::wpRefresh(ulView, pReserved);
+}
+
+
+HWND CWCDFolder::wpOpen(HWND hwndCnr,ULONG ulView,ULONG ulParam)
+{
+
+  if(ulView==OPEN_CONTENTS||ulView==OPEN_TREE||ulView==OPEN_DETAILS||ulView==OPEN_DEFAULT /*|| ulView==OPEN_MMDISK*/) {
+    /* OPEN_MMDISK is a private view to indicate the folder was opened from the CD drive */
+    cwInsertAllTracks(chrDrive);
+    hwndFrameCDFldr=CWMediaFolder::wpOpen(hwndCnr, ulView, ulParam);
+
+    if(hwndFrameCDFldr) {
+      /* We have the folder window */
+      char chrTemp[50];
+      HOBJECT hObject;
+
+      /* Add view to drives inuse list */
+      sprintf(chrTemp,"<WP_DRIVE_%c>",chrDrive[0]);
+      if((hObject=WinQueryObject(chrTemp))!=NULLHANDLE) {
+        WPObject *wpObject;
+
+        wpObject=((M_WPObject*)__ClassObject)->wpclsQueryObject( hObject);
+        if(somIsObj(wpObject)) {
+          diskUseItem.wpDiskObj=wpObject;
+          diskUseItem.useItem.type=USAGE_OPENVIEW;
+          memset(&diskUseItem.viewItem, 0, sizeof(VIEWITEM));
+          diskUseItem.viewItem.handle=hwndFrameCDFldr;
+          diskUseItem.viewItem.view=OPEN_DEFAULT;
+          wpObject->wpAddToObjUseList(&diskUseItem.useItem);
+        }/* somIsObj() */
+      }
+
+      /* Remove random checkbox for now... */
+      WinShowWindow( WinWindowFromID(playControlDialogFromFrameHWND(hwndFrameCDFldr), IDCB_RANDOM)
+                     , FALSE);
+      /* Subclass frame to remove items from menubar */
+      pfnwpCDFrame=WinSubclassWindow(hwndFrameCDFldr, cdFrameProc);
+      pfnwpGenericCDFrame=pfnwpFrame;
+    }/* if(hwnd) */
+    return hwndFrameCDFldr;
+  }
+  return CWMediaFolder::wpOpen(hwndCnr, ulView, ulParam);
+}
+
+BOOL CWCDFolder::cwClose(HWND hwndFrame)
+{
+  BOOL bRC;
+
+  bRC=CWMediaFolder::cwClose(hwndFrame);
+
+  if(bRC) {
+    /* User confirmed close */
+    if(somIsObj(diskUseItem.wpDiskObj)) {
+      diskUseItem.wpDiskObj->wpDeleteFromObjUseList(&diskUseItem.useItem);
+      /* The disk object is locked because of wpclQueryObject in wpOpen() */
+      diskUseItem.wpDiskObj->wpUnlockObject();
+      hwndFrameCDFldr=NULLHANDLE;
+    }
+  }
+  return bRC;
+}
+
+ULONG CWCDFolder::cwPlayAudioFile(HWND hwndFrame, ULONG ulWhich)
+{
+  HWND hwndContainer;
+  PMINIRECORDCORE mrc, mrcTemp;
+  WPObject * contentObject;
+  WPObject * tempObject;
+  SOMClass *mmCDTrackClass;
+  char chrCommand[CCHMAXPATH*2];
+  char chrDevice[30];
+  char retMsg[20];
+  ULONG rc;
+  int iWavePriv;
+  int iTime2;
+  int iPrevTrack=0;
+
+
+  hwndContainer=WinWindowFromID(hwndFrame, FID_CLIENT);
+  if(!WinIsWindow(WinQueryAnchorBlock(hwndFrame), hwndContainer))
+    return 0;
+
+  /* Get class object */
+  mmCDTrackClass=somhlpGetSomClass("MMCDTrack");
+  if(!mmCDTrackClass)
+    return 0;
+
+  /* Get new ID for wave device */
+  if(cwRequestMutex(hmtxFileName, 100000)==ERROR_TIMEOUT)
+    return FALSE;  
+  iWaveDev++;
+  if(iWaveDev==1000)
+    iWaveDev=1;
+  iWavePriv=iWaveDev;
+  cwReleaseMutex(hmtxFileName);
+
+  BOOL notFound;
+
+  switch(ulWhich) {
+  case PLAY_FIRST:
+    {
+
+      /* Get first selected container item of our folder */
+      mrc=(PMINIRECORDCORE)WinSendMsg(hwndContainer,CM_QUERYRECORDEMPHASIS, MPFROMSHORT(CMA_FIRST),
+                                      MPFROMSHORT(CRA_SELECTED));
+
+      if(iWave!=0 && mrc && (int)mrc!=-1) {
+
+        cwStopAudioFile(hwndFrame);
+        return cwPlayAudioFile(hwndFrame, PLAY_FIRST);
+      }
+      if(!mrc || (int)mrc==-1)
+        /* Get first container item of our folder */
+        mrc=(PMINIRECORDCORE)WinSendMsg(hwndContainer,CM_QUERYRECORD,NULL,
+                                        MPFROM2SHORT(CMA_FIRST,CMA_ITEMORDER));
+      
+      if(!mrc || (int)mrc==-1)
+        return 0;
+
+      notFound=TRUE;
+      do {
+        contentObject=(WPObject*)OBJECT_FROM_PREC(mrc);//Get object
+        if(somIsObj(contentObject)) {
+          /* Get file system object or NULL */
+          if((contentObject=cwGetFileSystemObject(contentObject))==NULLHANDLE)
+            continue;
+          tempObject=contentObject;
+        }
+        else
+          return 0;/* Error */
+        
+        if(contentObject->somIsA(mmCDTrackClass))
+          notFound=FALSE;
+        else
+            /* Try next object */
+            mrc=(PMINIRECORDCORE)WinSendMsg(hwndContainer,CM_QUERYRECORD, mrc,
+                                            MPFROM2SHORT(CMA_NEXT,CMA_ITEMORDER));
+      }while(notFound && mrc);
+      break;
+    }
+  case PLAY_NEXT:
+  case PLAY_NEXT_CDFLDR:
+    if(iWave==0)
+      return cwPlayAudioFile(hwndFrame, PLAY_FIRST);/* Not yet playing */
+
+    /* We are currently playing */
+    mrcTemp=mrcPlaying;
+
+    /* Get next container item of our folder */
+    mrc=(PMINIRECORDCORE)WinSendMsg(hwndContainer,CM_QUERYRECORD,mrcTemp,
+                                    MPFROM2SHORT(CMA_NEXT,CMA_ITEMORDER));
+
+    if(!mrc || (int)mrc==-1)
+      return 0;
+
+    notFound=TRUE;
+    while(notFound && mrc && (int)mrc!=-1){ 
+      contentObject=(WPObject*)OBJECT_FROM_PREC(mrc);//Get object
+      if(somIsObj(contentObject)) {
+        /* Get file system object or NULL */
+        if((contentObject=cwGetFileSystemObject(contentObject))==NULLHANDLE)
+          continue;
+        tempObject=contentObject;
+      }
+      else
+        return 0;/* Error */
+      
+      if(contentObject->somIsA(mmCDTrackClass))
+        notFound=FALSE;
+      else
+        /* Try next object */
+        mrc=(PMINIRECORDCORE)WinSendMsg(hwndContainer,CM_QUERYRECORD, mrc,
+                                        MPFROM2SHORT(CMA_NEXT,CMA_ITEMORDER));
+    };
+
+    /* Remove from inuse list */
+    if(myViewItem.bIsInUseList)
+      {
+        WPObject *wpObject=cwGetFileSystemObject(currentObject);
+        if(wpObject->wpDeleteFromObjUseList(&myViewItem.useItem))
+          myViewItem.bIsInUseList=FALSE;
+      };
+
+    /* Deselect the object */
+    if(WinIsWindow(WinQueryAnchorBlock(hwndFrame), hwndContainer))
+      WinSendMsg(hwndContainer,CM_SETRECORDEMPHASIS, MPFROMP(mrcPlaying),
+                 MPFROM2SHORT(FALSE, CRA_SELECTED));  
+    
+    if(!mrc) {
+      if(ulFlags & FLAG_REPEAT)
+        return cwPlayAudioFile(hwndFrame, PLAY_FIRST);
+      else {
+        cwStopAudioFile(hwndFrame);
+        return 0;
+      }
+    }
+
+    break;
+  case PLAY_PREV:
+
+    if(iWave==0)
+      return cwPlayAudioFile(hwndFrame, PLAY_FIRST);/* Not yet playing, so start the first one. */
+ 
+   /* We are currently playing */
+    mrcTemp=mrcPlaying;
+    /* Check the current time. If we are at the very beginning of the track skip to the previous track
+       otherwise skip to the beginning of the current track. */
+    if(ulPos<=2) {
+      /* Get previous container item of our folder */
+      mrc=(PMINIRECORDCORE)WinSendMsg(hwndContainer,CM_QUERYRECORD,mrcTemp,
+                                      MPFROM2SHORT(CMA_PREV,CMA_ITEMORDER));
+    }
+    else
+      mrc=NULLHANDLE;
+
+    cwStopAudioFile(hwndFrame);
+    if(!mrc)
+      mrc=mrcTemp;
+
+    /* Find an audio file */
+    notFound=TRUE;
+    while(notFound && mrc && (int)mrc!=-1){ 
+      contentObject=(WPObject*)OBJECT_FROM_PREC(mrc);//Get object
+      if(somIsObj(contentObject)) {
+        /* Get file system object or NULL */
+        if((contentObject=cwGetFileSystemObject(contentObject))==NULLHANDLE)
+          continue;
+        tempObject=contentObject;
+      }
+      else
+        return 0;/* Error!! */
+
+      /* Check if it's an audio file thus playable */
+      if(contentObject->somIsA(mmCDTrackClass))
+        notFound=FALSE;
+      else
+        /* Try next object */
+        mrc=(PMINIRECORDCORE)WinSendMsg(hwndContainer,CM_QUERYRECORD, mrc,
+                                        MPFROM2SHORT(CMA_PREV,CMA_ITEMORDER));
+    };
+    if(!mrc)
+      return 0;
+    
+    break;
+  default:
+    return 0;
+  }/* switch */
+
+  //  if(ulWhich!=PLAY_NEXT_CDFLDR) {
+    if(!getMessage(chrCommand, IDSTR_STARTINGTRACK, sizeof(chrCommand), queryResModuleHandle(),  hwndFrame))
+      sprintf(chrCommand, "Starting track...");
+    setPlayTimeText2(this, chrCommand);
+    // }
+
+  strncpy(chrDevice,"CDAUDIO", sizeof(chrDevice) - 1);
+
+  PSZ pszObjectID;
+  if((pszObjectID=wpQueryObjectID())!=NULLHANDLE) {
+   int iNumCD;
+   char chrFirstCD;
+
+   strncpy(chrCommand, pszObjectID,sizeof(chrCommand));
+   chrCommand[sizeof(chrCommand)-1]=0;
+   if(CDQueryCDDrives(&iNumCD, &chrFirstCD))
+     sprintf(chrDevice,"CDAUDIO%02d",  chrCommand[strlen(chrCommand)-2]-chrFirstCD+1);
+  }
+   
+  chrDevice[sizeof(chrDevice)-1]=0;
+
+  /* Get track num */
+  if(!methodPtrCDTrack)
+    somhlpQueryCWCDTrackMethodPtr(this);
+  if(methodPtrCDTrack)
+    iTime2=methodPtrCDTrack((MMCDTrack*)contentObject, NULLHANDLE, 0, IDINFO_TRACKNUM);
+  if(methodPtrCDTrack && currentObject)
+    iPrevTrack=methodPtrCDTrack((MMCDTrack*)currentObject, NULLHANDLE, 0, IDINFO_TRACKNUM);
+
+  //    HlpWriteToTrapLog("PrevTrack: %d new track: %d\n", iPrevTrack, iTime2);
+
+  if(iPrevTrack+1!=iTime2 || !mrcPlaying) {
+    iWave=iWavePriv;
+
+    /* Start audio file */
+    sprintf(chrCommand,"open \"%s\" alias wave%d SHAREABLE wait", chrDevice, iWavePriv);
+    rc = mciSendString(chrCommand, retMsg, sizeof(retMsg), playControlDialogFromFrameHWND(hwndFrame), 0);
+
+    if((rc & 0x0000ffff)!=MCIERR_SUCCESS)
+        return 0;
+
+    /* enable the "digital transfer" connector */
+    sprintf(chrCommand,"CONNECTOR wave%d ENABLE TYPE CD stream WAIT", iWavePriv);
+    rc = mciSendString(chrCommand, retMsg, sizeof(retMsg), playControlDialogFromFrameHWND(hwndFrame), 0);
+    if((rc & 0x0000ffff)!=MCIERR_SUCCESS)
+       return 0;
+
+    /* Set volume */
+    sprintf(chrCommand,"SET wave%d AUDIO VOLUME %d wait", iWavePriv, ulVolume);
+    rc = mciSendString(chrCommand, retMsg, sizeof(retMsg), 0, 0);
+    if((rc & 0x0000ffff)!=MCIERR_SUCCESS) {
+      sprintf(chrCommand,"close wave%d",iWavePriv);
+      rc = mciSendString(chrCommand, retMsg, sizeof(retMsg), 0, 0);
+      return 0;
+    }
+
+    sprintf(chrCommand,"SET wave%d TIME FORMAT TMSF wait", iWavePriv);
+    rc = mciSendString(chrCommand, retMsg, sizeof(retMsg), 0, 0);
+    if((rc & 0x0000ffff)!=MCIERR_SUCCESS) {
+      sprintf(chrCommand,"close wave%d wait",iWavePriv);
+      rc = mciSendString(chrCommand, retMsg, sizeof(retMsg), 0, 0);
+      return 0;
+    }
+
+    //sprintf(chrCommand,"play wave%d FROM %d TO %d", iWavePriv, iTime2, iTime2+1);
+    sprintf(chrCommand,"play wave%d FROM %d ", iWavePriv, iTime2);
+    //    HlpWriteToTrapLog(chrCommand);
+    //    HlpWriteToTrapLog("\niTime2: %d\n", iTime2);
+
+    rc = mciSendString(chrCommand, retMsg, sizeof(retMsg), 0, 0);
+    if((rc & 0x0000ffff)!=MCIERR_SUCCESS) {
+      sprintf(chrCommand,"close wave%d",iWavePriv);
+      rc = mciSendString(chrCommand, retMsg, sizeof(retMsg), 0, 0);
+      return 0;
+    }
+  }/*   if( ...|| !mrcPlaying) */
+
+  if(iPrevTrack+1==iTime2 && ulWhich!=PLAY_NEXT_CDFLDR) {
+    /* Previous track ended, now playing the next. Or user pressed 'Next' while playing */
+    if(ulPos*1000 < ulTotalLength) {
+      WinStopTimer(WinQueryAnchorBlock(hwndFrame), playControlDialogFromFrameHWND(hwndFrame), IDTIMER_PLAY);
+      sprintf(chrCommand,"SET wave%d TIME FORMAT TMSF wait", iWave);
+      rc = mciSendString(chrCommand, retMsg, sizeof(retMsg), 0, 0);
+      if((rc & 0x0000ffff)!=MCIERR_SUCCESS) {
+        sprintf(chrCommand,"close wave%d wait",iWave);
+        rc = mciSendString(chrCommand, retMsg, sizeof(retMsg), 0, 0);
+        return 0;
+      }
+
+      sprintf(chrCommand,"play wave%d FROM %d ", iWave, iTime2);
+      //      HlpWriteToTrapLog(chrCommand);
+      rc = mciSendString(chrCommand, retMsg, sizeof(retMsg), 0, 0);
+      if((rc & 0x0000ffff)!=MCIERR_SUCCESS) {
+        sprintf(chrCommand,"close wave%d",iWavePriv);
+        rc = mciSendString(chrCommand, retMsg, sizeof(retMsg), 0, 0);
+        return 0;
+      }
+    }
+  }
+
+  /* Get length in ms */
+  if(!methodPtrCDTrack)
+    somhlpQueryCWCDTrackMethodPtr(this);
+  if(methodPtrCDTrack){  /* Query playtime in secs */
+    iTime2=methodPtrCDTrack((MMCDTrack*)contentObject, NULLHANDLE, 0, IDINFO_PLAYTIME);
+  }
+
+  sprintf(chrCommand,"%d:%02d  %d:%02d  -%d:%02d", iTime2/60, iTime2%60,
+          0, 0,
+          iTime2/60, iTime2%60);
+
+  
+  //  WinSetWindowText(WinWindowFromID(hwndTop, IDST_PLAYTIME), chrCommand);
+  //    WinSetWindowText(playTimeControlFromFrameHWND(HWND hwndFrame), chrCommand);
+  ulTotalLength=iTime2*1000; /* convert to ms */
+  //  HlpWriteToTrapLog("ulTotalLength:  %d\n", ulTotalLength);
+
+  /* Set emphasis by adding the object to the inuse list */
+  memset(&myViewItem, 0,sizeof(myViewItem));
+  myViewItem.useItem.type=USAGE_OPENVIEW;
+  myViewItem.viewItem.view=OPEN_PLAYING;
+
+  // HlpWriteToTrapLog("Adding to inuse list\n");
+  WPObject* wpObject=cwGetFileSystemObject(tempObject);
+  // HlpWriteToTrapLog("wpObject: %x somIsObj(wpObject): %x \n", wpObject, somIsObj(wpObject));
+
+
+  if(!myViewItem.bIsInUseList) {
+    if(wpObject->wpAddToObjUseList(&myViewItem.useItem))
+      myViewItem.bIsInUseList=TRUE;
+  };
+
+  /* Select the object */
+  WinSendMsg(hwndContainer,CM_SETRECORDEMPHASIS, MPFROMP(mrc),
+             MPFROM2SHORT(TRUE, CRA_SELECTED));  
+
+  /* Start pos timer. SET MCIPOSITIONADVICE fails when seeking in the wave. 
+     Don't know why. */
+  WinStartTimer(WinQueryAnchorBlock(hwndFrame), playControlDialogFromFrameHWND(hwndFrame), 
+                IDTIMER_PLAY, PLAYTIMER_DELAY);
+
+  currentObject=wpObject;
+  mrcPlaying=mrc;
+  /* The start position of the play command */
+  ulStartPosition=0;
+  ulPos=0;
+  bPaused=FALSE;
+  return 0;
+}
+
+
+BOOL  CWCDFolder::cwSeekAudioFile(LONG lPosMSSec)
+{
+  char chrCommand[50];
+  char retMsg[20];
+  APIRET rc;
+  int iCurrentTrack;
+  ULONG ulPosTrack;
+
+  sprintf(chrCommand,"SET wave%d TIME FORMAT MS wait", iWave);
+  rc = mciSendString(chrCommand, retMsg, sizeof(retMsg), 0, 0);
+  if((rc & 0x0000ffff)!=MCIERR_SUCCESS) {
+    return 0;
+  }
+  
+  sprintf(chrCommand,"STATUS wave%d CURRENT TRACK WAIT", iWave);
+  rc = mciSendString(chrCommand, retMsg, sizeof(retMsg), 0, 0);
+  if((rc & 0x0000ffff)!=MCIERR_SUCCESS) {
+    return FALSE;
+  }
+  iCurrentTrack=atoi(retMsg);
+
+  sprintf(chrCommand,"STATUS wave%d POSITION TRACK %d WAIT", iWave, iCurrentTrack);
+  rc = mciSendString(chrCommand, retMsg, sizeof(retMsg), 0, 0);
+  if((rc & 0x0000ffff)!=MCIERR_SUCCESS) {
+    /* Problem with MCI. Clean up. The Timer will be stopped in the method */
+    return FALSE;
+  }
+  ulPosTrack=atoi(retMsg);
+
+  sprintf(chrCommand,"PLAY wave%d from %d ", iWave, lPosMSSec+ulPosTrack);
+  rc=mciSendString(chrCommand, retMsg, sizeof(retMsg), 0, 0);
+  ulStartPosition=lPosMSSec/1000;
+  bPaused=FALSE;
+
+#if 0
+  sprintf(chrCommand,"STATUS wave%d POSITION IN TRACK WAIT", iWave);
+  rc = mciSendString(chrCommand, retMsg, sizeof(retMsg), 0, 0);
+  if((rc & 0x0000ffff)==MCIERR_SUCCESS) {
+    /* Problem with MCI. Clean up. The Timer will be stopped in the method */
+    ulPos=atoi(retMsg)/1000;
+  }
+#endif 
+
+  ulPos=lPosMSSec/1000;
+
+  sprintf(chrCommand,"SET wave%d TIME FORMAT TMSF wait", iWave);
+  rc = mciSendString(chrCommand, retMsg, sizeof(retMsg), 0, 0);
+
+  return TRUE;
+}
+
+void CWCDFolder::cwPlayTimeCallback(HWND hwndFrame, LONG lPosSec)
+{
+  char chrCommand[50];
+  char retMsg[20];
+  ULONG rc;
+  int iPrevTrack;
+  int iCurrentTrack;
+
+  //SysWriteToTrapLog("\n%s:\n", __FUNCTION__);
+
+  sprintf(chrCommand,"STATUS wave%d MODE WAIT", iWave);
+  rc = mciSendString(chrCommand, retMsg, sizeof(retMsg), 0, 0);
+  if((rc & 0x0000ffff)!=MCIERR_SUCCESS) {
+    /* Problem with MCI. Clean up. The Timer will be stopped in the method */
+    cwStopAudioFile(hwndFrame); 
+    return;
+  }
+  else
+    if(!stricmp(retMsg, "stopped")) {
+      /* Audio file played. Start next */
+      cwPlayAudioFile(hwndFrame, PLAY_NEXT); 
+      showPlayTimeDisplay(this, TRUE);/* Ensure display is visible */
+      return;
+    }
+
+  /* Get track num */
+  if(!methodPtrCDTrack)
+    somhlpQueryCWCDTrackMethodPtr(this);
+  if(methodPtrCDTrack && currentObject)
+    iPrevTrack=methodPtrCDTrack((MMCDTrack*)currentObject, NULLHANDLE, 0, IDINFO_TRACKNUM);
+
+  sprintf(chrCommand,"STATUS wave%d CURRENT TRACK WAIT", iWave);
+  rc = mciSendString(chrCommand, retMsg, sizeof(retMsg), 0, 0);
+  //  HlpWriteToTrapLog("Track: %d, retmsg: %s\n", iPrevTrack, retMsg);
+  if((rc & 0x0000ffff)!=MCIERR_SUCCESS) {
+    /* Problem with MCI. Clean up. The Timer will be stopped in the method */
+    cwStopAudioFile(hwndFrame); 
+  }
+  else {
+    iCurrentTrack=atoi(retMsg);
+    //SysWriteToTrapLog(" iWave: %d. iPrevTrack: %d, iCurrentrack: %d\n", iWave, iPrevTrack, iCurrentTrack);
+    /* Timeout. Check if track is still playing */
+    if(iCurrentTrack==iPrevTrack+1) {
+      /* Audio file played. Start next */
+      //SysWriteToTrapLog(" iWave: %d. iPrevTrack: %d, iCurrentrack: %d, startinb next (%d)\n", iWave, iPrevTrack, iCurrentTrack, __LINE__);
+      cwPlayAudioFile(hwndFrame, PLAY_NEXT_CDFLDR); 
+    }
+  }
+}
+
+
+
Index: /tags/CWMM-0.3.0_GA/mediafolder/c/cdfldr/makefile
===================================================================
--- /tags/CWMM-0.3.0_GA/mediafolder/c/cdfldr/makefile	(revision 213)
+++ /tags/CWMM-0.3.0_GA/mediafolder/c/cdfldr/makefile	(revision 213)
@@ -0,0 +1,52 @@
+# Makefile for Audio-CD-Creator Data-CD-Creator
+
+include ../../../make.inc
+
+CC           = icc
+#CPPFLAGS     = /Ge- /Gm+ /G4 /Gl  /O+ /Oc+ /Ol- /Q+ $(VACDEBUG)
+CPPFLAGS     = /G5 /Ge- /Gm+ /Gl- /Ga- /O+ /Oc+ /Ol- /Q+ $(VACDEBUG)
+LIBS	     =  mmPM2.lib rexx.lib
+INC	=	..\include
+HELPERDIR	=	..\helper
+DEFS         =
+PROGS        =
+ODIR		= ./obj
+CPPDIR	= .
+
+
+OBJECTS	= cdfolder.obj cdfolderoverriddenwpmethods.obj cdfolderoverriddenwpclsmethods.obj \
+	..\helper\cd.obj cdfldrdialogprocs.obj
+
+all:	mediafld.dll
+
+
+.cpp.obj:
+	icc $(CPPFLAGS) /C+ -I$(INC) /Fo$@ $<
+
+mediafld.dll:
+		cd ../. && make
+
+cdfolder.obj:	cdfolder.cpp $(INC)\mediafolderres.h $(INC)\cdfolder.hh
+
+cdfolderoverriddenwpmethods.obj:	cdfolderoverriddenwpmethods.cpp $(INC)\mediafolderres.h $(INC)\cdfolder.hh
+
+cdfolderoverriddenwpclsmethods.obj:	cdfolderoverriddenwpclsmethods.cpp $(INC)\mediafolderres.h $(INC)\cdfolder.hh
+
+cdfldrdialogprocs.obj:	cdfldrdialogprocs.cpp
+
+..\helper\cd.obj:	..\helper\cd.cpp $(INC)\cddb.h
+	-cd ..\helper && make
+
+clean:
+
+cleaner:
+	-rm *.*~
+	-rm *.flc
+
+distger:
+
+disteng:
+
+distribution:
+
+
Index: /tags/CWMM-0.3.0_GA/mediafolder/c/createcd/createcd.c
===================================================================
--- /tags/CWMM-0.3.0_GA/mediafolder/c/createcd/createcd.c	(revision 213)
+++ /tags/CWMM-0.3.0_GA/mediafolder/c/createcd/createcd.c	(revision 213)
@@ -0,0 +1,451 @@
+/*
+ * This file is (C) Chris Wohlgemuth 1999-2005
+ */
+/*
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; see the file COPYING.  If not, write to
+ * the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+
+#define INCL_DOS
+#define INCL_DOSERRORS
+#define INCL_DOSDEVICES
+#define INCL_DOSDEVIOCTL
+#define INCL_DOSFILEMGR
+
+#include <os2.h>
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+#include "mediafolderinc.h"
+#include "mediafolderres.h"
+/* #include "sys_funcs.h" */
+
+#define  LVM_IS_HARDDISK  0  
+#define  LVM_IS_PRM       1
+#define  LVM_IS_CDROM     2
+#define  LVM_IS_NETWORK   3
+#define  LVM_IS_UNKNOWN   4
+
+/* Typedefs for LVM */
+typedef unsigned long      CARDINAL32;
+typedef unsigned long      DoubleWord; /* ULONG */
+typedef unsigned char      BOOLEAN;
+
+#define VOLUME_NAME_SIZE      20
+#define FILESYSTEM_NAME_SIZE  20
+
+#ifdef ADDRESS
+  #undef ADDRESS
+#endif
+typedef void*               ADDRESS;
+
+
+HMODULE hMod=NULLHANDLE;
+
+typedef struct _Volume_Control_Record {
+  DoubleWord  Volume_Serial_Number;
+  ADDRESS     Volume_Handle;
+  BOOLEAN     Compatibility_Volume;
+  BYTE        Device_Type;
+  BYTE        Reserved[2];   /* Padding */
+} Volume_Control_Record;
+
+typedef struct _Volume_Control_Array {
+  Volume_Control_Record*    Volume_Control_Data;
+  CARDINAL32                Count;
+} Volume_Control_Array;
+
+typedef struct _Volume_Information_Record {
+  CARDINAL32  Volume_Size;
+  CARDINAL32  Partition_Count;
+  CARDINAL32  Drive_Letter_Conflict;
+  BOOLEAN     Compatibility_Volume;
+  BOOLEAN     Bootable;
+  char        Drive_Letter_Preference;
+  char        Current_Drive_Letter;
+  char        Initial_Drive_Letter;
+  BOOLEAN     New_Volume;
+  BYTE        Status;
+  BYTE        Reserved_1;            /* PAdding */
+  char       Volume_Name[VOLUME_NAME_SIZE];
+  char       File_System_Name[FILESYSTEM_NAME_SIZE];
+} Volume_Information_Record;
+
+typedef Volume_Control_Array (_System _PFNVCA) ();
+typedef _PFNVCA *PFNVCA;
+
+typedef Volume_Information_Record (_System _PFNVIR) ();
+typedef _PFNVIR *PFNVIR;
+
+PFN pfnOpen_LVM_Engine=NULLHANDLE;
+PFN pfnClose_LVM_Engine=NULLHANDLE;
+PFNVCA pfnvcaGet_Volume_Control_Data=NULLHANDLE;
+PFNVIR pfnvirGet_Volume_Information=NULLHANDLE;
+
+size_t strlcpy(char *dst, const char *src, size_t siz);
+
+/*
+  FIXME:
+
+  Use the function from the \common_funcs directory instead. 
+ */
+static BOOL getMessage(char* text,ULONG ulID, LONG lSizeText, HMODULE hResource)
+{
+  char* pOffset = 0;
+  char* ptr = 0;
+  int id=0;
+
+  text[0]='\0';
+
+  // printf("resource: %x, %d %d\n", hResource, ulID, (ulID/16)+1, 
+  // DosGetResource(hResource, RT_STRING, (ulID/16)+1, (PVOID)&pOffset));
+
+  if(DosGetResource(hResource, RT_STRING, (ulID/16)+1, (PVOID)&pOffset)!=NO_ERROR)
+    return FALSE;
+
+  ptr=pOffset;
+
+  //printf("\ngot resource...\n");
+
+  /* Parsing... */
+  id=ulID%16;
+
+  //printf("id: %d\n", id);
+  pOffset+=sizeof(USHORT); /* Skip codepage */
+
+  for(;id > 0;id--)
+    {
+      //printf("id: %d, length: %d %s\n", id, *pOffset, pOffset+1);
+      pOffset+=*pOffset+1;
+    }
+  //printf("length: %d %s\n",  *pOffset, pOffset+1);
+  strlcpy(text, pOffset+1, lSizeText);
+
+  if(*pOffset!=1){
+    DosFreeResource(ptr);
+  return TRUE;
+  }  
+  DosFreeResource(ptr);
+/* Length=1 means dummy entry filled by system */
+  return FALSE;
+}
+
+#if 0
+#pragma import(DosQueryModFromEIP,,"DOSCALL1",360)
+ APIRET APIENTRY DosQueryModFromEIP ( HMODULE *phMod, ULONG *pObjNum, ULONG BuffLen, PCHAR pBuff, ULONG *pOffset, PVOID Address ) ; 
+#endif
+
+/* This function returns the module handle of our ressource dll */
+static HMODULE queryResModuleHandle(void)
+{
+  char path[CCHMAXPATH];  
+  char buf[CCHMAXPATH];
+  char* found;
+  APIRET rc;
+  HMODULE RESSOURCEHANDLE;
+  HMODULE hmod;
+  PTIB   ptib = NULL;
+  PPIB   ppib = NULL;
+  
+  
+  // printf("rc=%d\n",DosQueryModFromEIP( &hmod, &ul, sizeof(path), path, 
+  //                  &off, (PVOID)queryResModuleHandle ) ); 
+  if(NO_ERROR==DosGetInfoBlocks(&ptib, &ppib))
+    DosQueryModuleName (ppib->pib_hmte,         /* Module handle to query     */
+                        sizeof(path),           /* Maximum length of result   */
+                        path);
+  
+  //printf("%s %x\n",path, hmod);
+
+  /* Get the language code of our system and load the  
+     resource DLL with the right language */
+  do 
+    {
+      static char chrLang[]="en_EN";
+      PSZ pszLang="";
+      char *chrPtr;
+        
+      /* Get Language var */
+      if(NO_ERROR!=DosScanEnv("LANG", &pszLang)) {
+        pszLang=chrLang;
+      }        
+      /* Skip leading spaces */
+      chrPtr=pszLang;
+      while(*chrPtr==' ')
+        chrPtr++;
+        
+      /* Check if value seems to be valid. The var must be something like xx_XX thus length is 5 */
+      if(strlen(chrPtr)<5)
+        break;
+        
+      if((found=strrchr(path, '\\'))!=NULLHANDLE)
+        *found=0;
+
+      /* Extract the first two chars and build DLL name */                
+      sprintf(buf, RESDLLNAME, chrPtr[0], chrPtr[1]);
+      strcat(path,buf);
+        
+      rc=DosLoadModule(buf,sizeof(buf),path, &RESSOURCEHANDLE);
+      if(rc==NO_ERROR)
+        break;
+                
+      /* NLS DLL not found. Try to load default */
+      found=strrchr(path,'\\');
+      if(!found)
+        break;
+        
+      *found=0;
+      sprintf(buf, DEFRESDLLNAME);
+      strcat(path,buf);
+        
+      rc=DosLoadModule(buf,sizeof(buf),path, &RESSOURCEHANDLE);
+      if(rc!=NO_ERROR) {
+        RESSOURCEHANDLE=NULLHANDLE;
+      }
+      else {
+        //  printf("Ressource DLL loaded.\n");
+      }
+      break;
+    }while(TRUE);
+  
+  return RESSOURCEHANDLE;
+}
+
+ 
+static BOOL loadLVMFuncs(void)
+{
+  char chrErrorObject[CCHMAXPATH]={0};
+  ULONG ulCB;
+
+  /* Try to load LVM */
+  if(DosLoadModule(chrErrorObject, sizeof(chrErrorObject), "LVM.DLL", &hMod)!=NO_ERROR)
+    return FALSE;
+  //  printf("Got LVM.DLL\n");
+
+  for(;;) {
+    /* Get proc addresses */
+    if(DosQueryProcAddr(hMod, 0, "Open_LVM_Engine", &pfnOpen_LVM_Engine)!=NO_ERROR)
+      break;
+    //    printf("Got Open_LVM_Engine: %x\n", pfnOpen_LVM_Engine);
+
+    if(DosQueryProcAddr(hMod, 0, "Close_LVM_Engine", &pfnClose_LVM_Engine)!=NO_ERROR)
+      break;
+    //    printf("Got Close_LVM_Engine\n");
+
+    if(DosQueryProcAddr(hMod, 0, "Get_Volume_Control_Data", (PFN*)&pfnvcaGet_Volume_Control_Data)!=NO_ERROR)
+      break;
+    //   printf("Got Get_Volume_Control_Data: %x\n", pfnvcaGet_Volume_Control_Data);
+
+    if(DosQueryProcAddr(hMod, 0, "Get_Volume_Information", (PFN*)&pfnvirGet_Volume_Information)!=NO_ERROR)
+      break;
+    //  printf("Got Get_Volume_Information: %x\n", pfnvirGet_Volume_Information);
+
+    return TRUE;
+  }
+  DosFreeModule(hMod);
+  return FALSE;
+}
+
+/**************************************************************/
+/*                                                            */
+/* This funktion returns the CD-Drives in the system          */
+/*                                                            */
+/* iNumCD (output): # of CD-Drives                            */
+/* cFirstDrive (output): first cd-Drive letter                */
+/* returns TRUE: We have cd-drives                            */
+/*                                                            */
+/**************************************************************/
+BOOL CDQueryCDDrives(int *iNumCD, char * cFirstDrive)
+{
+  HFILE hfDevice;
+  ULONG ulAction;
+  ULONG ulLen;
+  static char cFirst=0;
+  static int iNumCDLocal=0;
+  static BOOL haveCD=FALSE;
+  static BOOL done=FALSE;			
+  struct
+  {
+    USHORT usCountCD;
+    USHORT usFirstCD;
+  } CDInfo;
+  
+  if(!done){
+    ulLen = sizeof(CDInfo);
+    if(!DosOpen("\\DEV\\CD-ROM2$", &hfDevice, &ulAction, 0,
+                FILE_NORMAL, OPEN_ACTION_OPEN_IF_EXISTS,
+                OPEN_SHARE_DENYNONE | OPEN_ACCESS_READONLY, NULL))
+      {
+        if(!DosDevIOCtl(hfDevice, 0x82, 0x60, NULL, 0, NULL, &CDInfo, ulLen, &ulLen))
+          {
+            if(CDInfo.usCountCD) {
+              haveCD=TRUE;
+              iNumCDLocal=CDInfo.usCountCD;
+              cFirst='A'+ CDInfo.usFirstCD;
+            }										 
+          }
+        DosClose(hfDevice);
+      }
+    done=TRUE;
+  }
+  *iNumCD=iNumCDLocal;
+  *cFirstDrive=cFirst;
+  return haveCD;				
+}
+
+int main(int argc, char** argv)
+{
+  CARDINAL32 error;
+  int iNumCD;
+  char cFirst;
+  char setup[512];
+  char name[256];
+  char id[100];
+  char nameTemplate[256];
+  int a;
+  HMODULE hmodRes=NULLHANDLE;
+
+  if(!CDQueryCDDrives(&iNumCD, &cFirst))
+    exit(1);
+
+  hmodRes=queryResModuleHandle();
+
+  if(!getMessage(nameTemplate, /* IDSTR_LAUNCHPADFLYOVER */ IDSTR_CDFOLDERNAME, sizeof(nameTemplate), hmodRes))
+    strncpy(nameTemplate, "CD-Audio player^Drive %c:", sizeof(nameTemplate) - 1);
+
+  if(!loadLVMFuncs()) {
+    for(a=0;a<iNumCD;a++) {
+      int b;
+      /* Build folder name */
+      sprintf(name, nameTemplate, cFirst+a);
+      /* Build object ID */
+      sprintf(id, CDFLDR_ID, cFirst+a);
+      /* Build setup string */
+      sprintf(setup, "%s=%c:;OBJECTID=%s;", CDFLDR_DRIVE, cFirst+a, id);
+      //   DosSleep(1500);
+      for(b=1;b<=5;b++) {
+        /* Wait to let WPS load the class if not yet done. Then retry */ 
+        if(WinCreateObject(CDFLDR_CLASSNAME, name, setup,CDFLDR_LOCATION, CO_UPDATEIFEXISTS))
+          /*printf("Can't create %s\n", name);*/
+          break;
+        DosSleep(5000);
+      }
+    }
+  }
+  else {
+    /* LVM system */
+    printf("This is a LVM system\n");
+
+    pfnOpen_LVM_Engine(TRUE, &error);
+    if(!error) {
+      Volume_Control_Array vca={0};
+      printf("LVM engine opened\n");
+      
+      vca= pfnvcaGet_Volume_Control_Data(&error);
+      if(!error) {
+        int a;
+
+        printf("Successfully got volume data\n");
+        for(a=0; a<vca.Count; a++) {
+          /* Now check all device types */
+          if(vca.Volume_Control_Data[a].Device_Type==LVM_IS_CDROM) {
+            Volume_Information_Record vir;
+            int b;
+
+            vir=pfnvirGet_Volume_Information(vca.Volume_Control_Data[a].Volume_Handle, &error);
+            if(!error) {
+              //printf("Device_type: %d, drive letter: %c:\n", 
+              //     vca.Volume_Control_Data[a].Device_Type, vir.Current_Drive_Letter);
+
+              /* Build folder name */
+              sprintf(name, nameTemplate, vir.Current_Drive_Letter);
+              /* Build object ID */
+              sprintf(id, CDFLDR_ID, vir.Current_Drive_Letter);
+              /* Build setup string */
+              sprintf(setup, "%s=%c:;OBJECTID=%s;", CDFLDR_DRIVE, vir.Current_Drive_Letter, id);
+
+              for(b=1;b<=5;b++) {
+                /* Wait to let WPS load the class if not yet done. Then retry */ 
+
+                if(WinCreateObject(CDFLDR_CLASSNAME, name, setup, CDFLDR_LOCATION, CO_UPDATEIFEXISTS))
+                  break;
+                //      printf("Found:  %s, %s\n", name, setup);
+                DosSleep(5000);
+              } /* for(b)*/
+            }
+          }
+        }/* for(a) */
+      }
+      /* Close engine */
+      pfnClose_LVM_Engine();
+    }
+    DosFreeModule(hMod);
+  } /* else */
+  if(hmodRes)
+    DosFreeModule(hmodRes);
+  return (0);
+}
+
+
+/********************************************************************/
+/*	$OpenBSD: strlcpy.c,v 1.8 2003/06/17 21:56:24 millert Exp $	*/
+
+/*
+ * Copyright (c) 1998 Todd C. Miller <Todd.Miller@courtesan.com>
+ *
+ * Permission to use, copy, modify, and distribute this software for any
+ * purpose with or without fee is hereby granted, provided that the above
+ * copyright notice and this permission notice appear in all copies.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
+ * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
+ * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+ * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
+ * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
+ * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+ */
+
+
+/*
+ * Copy src to string dst of size siz.  At most siz-1 characters
+ * will be copied.  Always NUL terminates (unless siz == 0).
+ * Returns strlen(src); if retval >= siz, truncation occurred.
+ */
+static size_t
+strlcpy(char *dst, const char *src, size_t siz)
+{
+	register char *d = dst;
+	register const char *s = src;
+	register size_t n = siz;
+
+	/* Copy as many bytes as will fit */
+	if (n != 0 && --n != 0) {
+		do {
+			if ((*d++ = *s++) == 0)
+				break;
+		} while (--n != 0);
+	}
+
+	/* Not enough room in dst, add NUL and traverse rest of src */
+	if (n == 0) {
+		if (siz != 0)
+			*d = '\0';		/* NUL-terminate dst */
+		while (*s++)
+			;
+	}
+
+	return(s - src - 1);	/* count does not include NUL */
+}
+
Index: /tags/CWMM-0.3.0_GA/mediafolder/c/createcd/makefile
===================================================================
--- /tags/CWMM-0.3.0_GA/mediafolder/c/createcd/makefile	(revision 213)
+++ /tags/CWMM-0.3.0_GA/mediafolder/c/createcd/makefile	(revision 213)
@@ -0,0 +1,38 @@
+# Makefile
+
+include ../../../make.inc
+
+CC           = icc
+LIB_DIR      = $d:/emx/lib
+CPPFLAGS     = -O -Zomf -Zcrtdll -s
+CPPFLAGSVAC  = /Ge /Gm+ /G4 /Gl- /O+ /Oc+ /Ol- /Q+ /Ss
+INC		= ../../include
+DEFS         =
+PROGS        =
+ODIR		= .
+CPPDIR	= .
+BINDIR		=	../../dist/bin
+HELPERDIR	=	..\helper
+
+
+all:	 creatcd.exe
+
+
+
+creatcd.exe:	createcd.c
+ifdef    ECS_COMPILE
+	 icc  $(CPPFLAGSVAC) -I$(INC) $<
+else
+	icc  $(CPPFLAGSVAC) -I$(INC) $<
+#	gcc  $(CPPFLAGS) -I$(INC) $< -Zlinker /PMTYPE:VIO
+endif
+
+clean:
+	-rm *.obj
+	-rm *.exe
+
+cleaner:
+	-rm *.*~
+
+	
+
Index: /tags/CWMM-0.3.0_GA/mediafolder/c/helper/cd.cpp
===================================================================
--- /tags/CWMM-0.3.0_GA/mediafolder/c/helper/cd.cpp	(revision 213)
+++ /tags/CWMM-0.3.0_GA/mediafolder/c/helper/cd.cpp	(revision 213)
@@ -0,0 +1,608 @@
+/*
+ * This file is (C) Chris Wohlgemuth 1999
+ */
+/*
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; see the file COPYING.  If not, write to
+ * the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+
+#define INCL_DOS
+#define INCL_DOSDEVICES
+#define INCL_DOSDEVIOCTL
+#define INCL_DOSFILEMGR
+
+#include <os2.h>
+#include <stdio.h>
+#include <string.h>
+#include "cddb.h"
+
+
+#pragma pack(1)
+
+typedef struct{
+	UCHAR   ucFirstTrack;
+	UCHAR 	ucLastTrack;
+	ULONG   ulLeadOut;
+}CDINFO;
+
+typedef struct{
+	ULONG   ulLeadOut;
+	UCHAR   ucFirstTrack;
+	UCHAR 	ucLastTrack;
+}CDINFO2;
+
+typedef struct
+{
+	ULONG ulTrackAddress;
+	UCHAR ucTCInfo;
+}TRACKINFO;
+
+typedef struct
+{
+	UCHAR signature[4];
+	UCHAR  ucTrackNum;
+}TINFOPARAM;
+
+typedef struct
+{
+	UCHAR ucFrames;
+	UCHAR ucSeconds;
+	UCHAR ucMinutes;
+	UCHAR ucNotUsed;
+}MSF;
+
+typedef struct
+{
+  UCHAR signature[4];
+  UCHAR  ucAddressMode;
+  UCHAR ucStartSector[4];
+  UCHAR ucEndSector[4];
+}PLAYPARAM;
+
+#pragma pack()
+
+
+HFILE extern openDrive(char* drive);
+void extern closeDrive(HFILE hfDrive);
+LONG extern CDCalculateSize(MSF* msf1,MSF* msf2);
+/******************************************/
+/* Result:  
+	 0:   Error
+	 -1: CD is Data Disk
+	 other: # Audio tracks */
+/******************************************/
+int extern CDQueryAudioCDTracks(HFILE hfDrive);
+ULONG extern CDQueryUPC(UCHAR* ucUPC, char * drive);
+/* Returns the size in bytes of a track on drive 'drive' (e.g. O:) */
+LONG extern CDQueryTrackSize(ULONG numTrack, char * drive);
+BOOL CDPlayTrack(ULONG numTrack, char * drive);
+BOOL extern CDStop(char * drive);
+LONG extern queryFreeDriveSpace(ULONG diskNum) ;
+/**************************************************************/
+/* This funktion returns the CD-Drives in the system          */
+/*                                                            */
+/* iNumCD (output): # of CD-Drives                            */
+/* cFirstDrive (output): first cd-Drive letter                */
+/* returns TRUE: We have cd-drives                            */
+/**************************************************************/
+BOOL extern CDQueryCDDrives(int *iNumCD, char * cFirstDrive);
+/* Returns a CDDB disc-ID for quering the database */
+/* Returns 0 if error.                             */
+LONG extern CDDBDiscID(char * drive, CDDBINFO * cddbInfo); 
+
+
+LONG extern CDCalculateSize(MSF* msf1,MSF* msf2)
+{
+ 	return ((msf2->ucMinutes*60+msf2->ucSeconds)*75+msf2->ucFrames)*2352-
+		((msf1->ucMinutes*60+msf1->ucSeconds)*75+msf1->ucFrames)*2352;	
+}
+
+LONG extern CDCalculateSector2(MSF* msf1)
+{
+ 	return ((msf1->ucMinutes*60+msf1->ucSeconds));	
+}
+
+LONG extern CDCalculateSector(MSF* msf1)
+{
+ 	return ((msf1->ucMinutes*60+msf1->ucSeconds)*75+msf1->ucFrames);	
+}
+
+
+/****************************************/
+/* Input: drive (e.g. o:)               */
+/****************************************/
+HFILE extern openDrive(char* drive)
+{
+	HFILE hfDrive = 0;
+	ULONG ulAction;
+	ULONG rc;
+    //char text[100];	
+
+	rc = DosOpen(drive, &hfDrive, &ulAction, 0,
+					 FILE_NORMAL, OPEN_ACTION_OPEN_IF_EXISTS,
+					 OPEN_SHARE_DENYNONE | OPEN_ACCESS_READONLY |
+					 OPEN_FLAGS_DASD|OPEN_FLAGS_FAIL_ON_ERROR, NULL);	
+#if 0
+sprintf(text, "%s %d %d", drive, rc, hfDrive);
+WinMessageBox(HWND_DESKTOP, HWND_DESKTOP, text,"", 1234,MB_MOVEABLE);
+#endif
+	if(rc)
+		return NULLHANDLE;//Error
+
+	return hfDrive;
+}
+
+void extern closeDrive(HFILE hfDrive)
+{
+	DosClose(hfDrive);	
+}
+
+/******************************************/
+/* Result:  
+	 0:   Error
+	 -1: CD is Data Disk
+	 other: # Audio tracks */
+/******************************************/
+int extern  CDQueryAudioCDTracks(HFILE hfDrive)
+{
+	ULONG ulParamLen;
+	ULONG ulDataLen;
+	ULONG rc;
+	CDINFO cdInfo;
+	TINFOPARAM tip;
+	TRACKINFO trackInfo;
+    //char text[100];	
+
+	ulDataLen=sizeof(cdInfo);
+	ulParamLen=4;
+		
+	if(!hfDrive)
+		return 0;
+	
+	rc = DosDevIOCtl(hfDrive, IOCTL_CDROMAUDIO, CDROMAUDIO_GETAUDIODISK,
+						  "CD01", 4, &ulParamLen, &cdInfo,
+						  sizeof(cdInfo), &ulDataLen);
+#if 0
+DosBeep(100, 300);sprintf(text, "%d  %d",  rc, hfDrive);
+WinMessageBox(HWND_DESKTOP, HWND_DESKTOP, text,"", 1234,MB_MOVEABLE);
+#endif
+	if(rc) {
+		return 0;//Error
+	}
+
+	ulDataLen=sizeof(trackInfo);
+	ulParamLen=sizeof(TINFOPARAM);
+	tip.signature[0]='C';
+	tip.signature[1]='D';	
+	tip.signature[2]='0';
+	tip.signature[3]='1';
+	tip.ucTrackNum=1;
+	
+	/* We have a disc. Check if it's audio */
+	rc = DosDevIOCtl(hfDrive, IOCTL_CDROMAUDIO, CDROMAUDIO_GETAUDIOTRACK,
+						  &tip, sizeof(tip), &ulParamLen, &trackInfo,
+						  sizeof(trackInfo), &ulDataLen);
+
+	if(rc) {
+		return 0;//Error
+	}
+		
+	if(trackInfo.ucTCInfo & 0x40) {
+		return -1;//It's a data track
+	}
+		
+	return cdInfo.ucLastTrack-cdInfo.ucFirstTrack+1;
+	
+}
+
+/* Returns the UPC of CD in drive 'drive' (e.g. O:) */
+/* Size of ucUCP must be 10!                        */
+ULONG extern CDQueryUPC(UCHAR* ucUPC, char * drive)
+{
+  HFILE hfDrive;
+  ULONG ulParamLen;
+  ULONG ulDataLen;
+  ULONG rc;
+  char setup[100]; 
+ 
+  hfDrive=openDrive(drive);
+  if(!hfDrive) return -1;
+
+  do {
+    DosBeep(1000,200);
+    /* Get UPC info */
+    ulDataLen=10;
+    ulParamLen=4;
+    rc = DosDevIOCtl(hfDrive, IOCTL_CDROMDISK, CDROMDISK_GETUPC,
+                     "CD01", 4, &ulParamLen, ucUPC,
+                     10, &ulDataLen);
+    sprintf(setup,"rc is: %x",rc);
+
+    WinMessageBox(  HWND_DESKTOP,   HWND_DESKTOP,  
+                  setup, "GET_UPC", 0UL, MB_OK | MB_ICONEXCLAMATION|MB_MOVEABLE );
+
+    if(rc)
+      break;
+    DosBeep(2000,200);
+    closeDrive(hfDrive);
+    return 0;
+
+  }while(TRUE);
+
+  /* No error */
+  closeDrive(hfDrive);
+  return -1;
+}
+
+
+/* Returns the size in bytes of a track on drive 'drive' (e.g. O:) */
+/* The track num starts with 1 */
+LONG extern CDQueryTrackSize(ULONG numTrack, char * drive)
+{
+	HFILE hfDrive;
+	ULONG ulParamLen;
+	ULONG ulDataLen;
+	ULONG rc;
+	CDINFO cdInfo;
+	TINFOPARAM tip;
+	TRACKINFO trackInfo[2];
+
+	hfDrive=openDrive(drive);
+	if(!hfDrive) return 0;
+	
+	do {
+		/* Get cd info */
+		ulDataLen=sizeof(cdInfo);
+		ulParamLen=4;
+		rc = DosDevIOCtl(hfDrive, IOCTL_CDROMAUDIO, CDROMAUDIO_GETAUDIODISK,
+										 "CD01", 4, &ulParamLen, &cdInfo,
+										 sizeof(cdInfo), &ulDataLen);		
+		if(rc)
+			break;//Error
+		ulDataLen=sizeof(trackInfo);
+		ulParamLen=sizeof(TINFOPARAM);
+		tip.signature[0]='C';
+		tip.signature[1]='D';	
+		tip.signature[2]='0';
+		tip.signature[3]='1';
+		/* Get information about our track */
+		tip.ucTrackNum=numTrack;
+		rc = DosDevIOCtl(hfDrive, IOCTL_CDROMAUDIO, CDROMAUDIO_GETAUDIOTRACK,
+										 &tip, sizeof(tip), &ulParamLen, &trackInfo[0],
+										 sizeof(trackInfo[0]), &ulDataLen);
+		if(rc) 
+			break;//Error
+
+		/* Get information about next track */
+		tip.ucTrackNum=numTrack+1;
+		if(tip.ucTrackNum<=cdInfo.ucLastTrack) {
+			rc = DosDevIOCtl(hfDrive, IOCTL_CDROMAUDIO, CDROMAUDIO_GETAUDIOTRACK,
+											 &tip, sizeof(tip), &ulParamLen, &trackInfo[1],
+											 sizeof(trackInfo[1]), &ulDataLen);
+			if(rc) 
+				break;//Error
+		}
+		else {
+          trackInfo[1].ulTrackAddress=cdInfo.ulLeadOut;
+          /* #pragma pack(1) eingebaut */
+
+          /*BYTE *cdInfoBytes;
+            cdInfoBytes=(BYTE*)&cdInfo;
+            cdInfoBytes+=2;
+            trackInfo[1].ulTrackAddress=*((ULONG*)cdInfoBytes);*/
+        }
+        closeDrive(hfDrive);
+		return CDCalculateSize((MSF*)&trackInfo[0].ulTrackAddress, (MSF*)&trackInfo[1].ulTrackAddress);
+	}while(TRUE);
+	closeDrive(hfDrive);
+	return 0;
+}
+
+/* Returns the size in bytes of a track on drive 'drive' (e.g. O:) */
+/* The track num starts with 1 */
+LONG extern CDQueryTrackSecs(ULONG numTrack, char * drive)
+{
+  LONG lBytes;
+  if((lBytes=CDQueryTrackSize( numTrack, drive))!=0)
+    {
+      return lBytes/176400;
+    }
+  return 0;
+}
+
+/* Returns sector info of track #numTrack */
+/* Starting with track 0 */
+LONG extern CDQueryTrackStartSector(ULONG numTrack, HFILE hfDrive)
+{
+	
+	ULONG ulParamLen;
+	ULONG ulDataLen;
+	ULONG rc;
+	CDINFO cdInfo;
+	TINFOPARAM tip;
+	TRACKINFO trackInfo[2];
+
+	do {
+      /* Get cd info */
+      ulDataLen=sizeof(cdInfo);
+      ulParamLen=4;
+      rc = DosDevIOCtl(hfDrive, IOCTL_CDROMAUDIO, CDROMAUDIO_GETAUDIODISK,
+                       "CD01", 4, &ulParamLen, &cdInfo,
+                       sizeof(cdInfo), &ulDataLen);		
+      if(rc)
+        break;//Error
+      
+      ulDataLen=sizeof(trackInfo);
+		ulParamLen=sizeof(TINFOPARAM);
+		tip.signature[0]='C';
+		tip.signature[1]='D';	
+		tip.signature[2]='0';
+		tip.signature[3]='1';
+		/* Get information about our track */
+		tip.ucTrackNum=numTrack+1;
+		if(tip.ucTrackNum<=cdInfo.ucLastTrack) {
+          rc = DosDevIOCtl(hfDrive, IOCTL_CDROMAUDIO, CDROMAUDIO_GETAUDIOTRACK,
+                           &tip, sizeof(tip), &ulParamLen, &trackInfo[0],
+                           sizeof(trackInfo[0]), &ulDataLen);
+          if(rc) 
+            break;//Error
+          }else 
+            return CDCalculateSector((MSF*)&cdInfo.ulLeadOut);
+        
+
+        return CDCalculateSector((MSF*)&trackInfo[0].ulTrackAddress);
+
+	}while(TRUE);
+	
+    /* error */
+    printf("ERROR!!!!!!!!!\n");
+	return 0;
+}
+
+/*****************************************/
+/*                                       */
+/* Plays track #numTrack on              */
+/* CD-Drive 'drive'                      */
+/*                                       */
+/* Returns TRUE if successful            */
+/*                                       */
+/*****************************************/
+BOOL CDPlayTrack(ULONG numTrack, char * drive)
+{
+	HFILE hfDrive;
+	ULONG ulParamLen;
+	ULONG ulDataLen;
+	ULONG rc;
+	CDINFO cdInfo;
+	TINFOPARAM tip;
+	TRACKINFO trackInfo[2];
+    PLAYPARAM playParam;
+
+	hfDrive=openDrive(drive);
+	if(!hfDrive) return FALSE;
+    do {
+	/* Get cd info */
+		ulDataLen=sizeof(cdInfo);
+		ulParamLen=4;
+		rc = DosDevIOCtl(hfDrive, IOCTL_CDROMAUDIO, CDROMAUDIO_GETAUDIODISK,
+										 "CD01", 4, &ulParamLen, &cdInfo,
+										 sizeof(cdInfo), &ulDataLen);		
+		if(rc)
+			break;//Error
+		ulDataLen=sizeof(trackInfo);
+		ulParamLen=sizeof(TINFOPARAM);
+		tip.signature[0]='C';
+		tip.signature[1]='D';	
+		tip.signature[2]='0';
+		tip.signature[3]='1';
+		/* Get information about our track */
+		tip.ucTrackNum=numTrack;
+		rc = DosDevIOCtl(hfDrive, IOCTL_CDROMAUDIO, CDROMAUDIO_GETAUDIOTRACK,
+										 &tip, sizeof(tip), &ulParamLen, &trackInfo[0],
+										 sizeof(trackInfo[0]), &ulDataLen);
+		if(rc) 
+			break;//Error
+		/* Get information about next track */
+		tip.ucTrackNum=numTrack+1;
+		if(tip.ucTrackNum<=cdInfo.ucLastTrack) {
+			rc = DosDevIOCtl(hfDrive, IOCTL_CDROMAUDIO, CDROMAUDIO_GETAUDIOTRACK,
+											 &tip, sizeof(tip), &ulParamLen, &trackInfo[1],
+											 sizeof(trackInfo[1]), &ulDataLen);
+			if(rc) 
+				break;//Error
+		}
+		else {
+          /* The following does not work on my system. Compilerbug ? 
+             trackInfo[1].ulTrackAddress=cdInfo.ulLeadOut; */
+          BYTE *cdInfoBytes;
+          cdInfoBytes=(BYTE*)&cdInfo;
+          cdInfoBytes+=2;
+          trackInfo[1].ulTrackAddress=*((ULONG*)cdInfoBytes);
+        }
+
+              /* Play the Track... */
+        ulParamLen=sizeof(PLAYPARAM);
+		playParam.signature[0]='C';
+		playParam.signature[1]='D';	
+		playParam.signature[2]='0';
+		playParam.signature[3]='1';
+        playParam.ucAddressMode=01;
+        memcpy(&playParam.ucStartSector,&trackInfo[0].ulTrackAddress,4);
+        memcpy(&playParam.ucEndSector,&trackInfo[1].ulTrackAddress,4);
+        
+        rc = DosDevIOCtl(hfDrive, IOCTL_CDROMAUDIO, CDROMAUDIO_PLAYAUDIO,
+                         &playParam, sizeof(playParam), &ulParamLen,0,
+                         0, 0);
+        if(rc)
+          break;
+        closeDrive(hfDrive);
+        return TRUE;
+    }while(TRUE);
+	closeDrive(hfDrive);
+    return FALSE;
+}
+
+BOOL extern CDStop(char * drive)
+{
+	HFILE hfDrive;
+	ULONG ulParamLen;
+    ULONG rc;
+
+	hfDrive=openDrive(drive);
+	if(!hfDrive) return FALSE;
+    
+    do {
+      /* Stop CD */
+      ulParamLen=4;
+      rc = DosDevIOCtl(hfDrive, IOCTL_CDROMAUDIO, CDROMAUDIO_STOPAUDIO,
+                       "CD01", 4, &ulParamLen,0,
+                       0, 0);		
+      if(rc)
+        break;//Error
+      closeDrive(hfDrive);
+      return TRUE;
+    }while(TRUE);
+	closeDrive(hfDrive);
+    return FALSE;
+}
+
+LONG extern queryFreeDriveSpace(ULONG diskNum) 
+{
+	FSALLOCATE infoBuf;
+	
+	if(DosQueryFSInfo(diskNum,FSIL_ALLOC,&infoBuf,sizeof(infoBuf)))
+		return 0;
+	
+	return infoBuf.cUnitAvail*infoBuf.cbSector*infoBuf.cSectorUnit;
+}
+
+/**************************************************************/
+/*                                                            */
+/* This funktion returns the CD-Drives in the system          */
+/*                                                            */
+/* iNumCD (output): # of CD-Drives                            */
+/* cFirstDrive (output): first cd-Drive letter                */
+/* returns TRUE: We have cd-drives                            */
+/*                                                            */
+/**************************************************************/
+BOOL extern CDQueryCDDrives(int *iNumCD, char * cFirstDrive)
+{
+  HFILE hfDevice;
+  ULONG ulAction;
+  ULONG ulLen;
+  static char cFirst=0;
+  static int iNumCDLocal=0;
+  static BOOL haveCD=FALSE;
+  static BOOL done=FALSE;			
+  struct
+  {
+    USHORT usCountCD;
+    USHORT usFirstCD;
+  } CDInfo;
+  
+  if(!done){
+    ulLen = sizeof(CDInfo);
+    if(!DosOpen("\\DEV\\CD-ROM2$", &hfDevice, &ulAction, 0,
+                FILE_NORMAL, OPEN_ACTION_OPEN_IF_EXISTS,
+                OPEN_SHARE_DENYNONE | OPEN_ACCESS_READONLY, NULL))
+      {
+        if(!DosDevIOCtl(hfDevice, 0x82, 0x60, NULL, 0, NULL, &CDInfo, ulLen, &ulLen))
+          {
+            if(CDInfo.usCountCD) {
+              haveCD=TRUE;
+              iNumCDLocal=CDInfo.usCountCD;
+              cFirst='A'+ CDInfo.usFirstCD;
+            }										 
+          }
+        DosClose(hfDevice);
+      }
+    done=TRUE;
+  }
+  *iNumCD=iNumCDLocal;
+  *cFirstDrive=cFirst;
+  return haveCD;				
+}
+
+
+/*****************************************/
+/*                                       */
+/* Query if a CD is avaiable in          */
+/* CD-Drive 'drive'                      */
+/*                                       */
+/* Input: drive num (starting with 0)    */
+/* Returns TRUE if media is avaiable     */
+/*                                       */
+/*****************************************/
+BOOL CDQueryMedia(ULONG  driveNum)
+{
+  return FALSE;
+}
+
+
+int cddb_sum(int n)
+{
+  int ret;
+  //printf("n:  %d   ",n);
+  for (ret = 0; n > 0; n /= 10) {
+    ret += (n % 10);
+  }
+  //printf("ret:  %d   ",ret);
+  return ret;
+}
+
+/* Returns a CDDB disc-ID for quering the database */
+/* Returns 0 if error.                             */
+LONG extern CDDBDiscID(char * drive, CDDBINFO * cddbInfo)
+{
+  int numTracks,a;
+  HFILE hfDrive;
+  LONG sum;
+  int t;
+
+
+  do {
+    hfDrive=openDrive(drive);
+    if(!hfDrive)
+      return 0;
+
+    numTracks=CDQueryAudioCDTracks(hfDrive);
+    if(numTracks==0||numTracks==-1)
+      break;
+    cddbInfo->numTracks=numTracks;
+
+    sum=0;
+    /* Calculating the id */
+    for(a=0;a<numTracks;a++) {
+      sum+= cddb_sum(CDQueryTrackStartSector(a, hfDrive)/75 );
+      //printf("Track%d: %d\n",a,CDQueryTrackStartSector(a, hfDrive));
+      cddbInfo->startSector[a]=CDQueryTrackStartSector(a, hfDrive);
+    }
+    t=CDQueryTrackStartSector(a, hfDrive)/75-CDQueryTrackStartSector(0, hfDrive)/75;
+    /*printf("(a-1): %d  0: %d t:  %d\n",CDQueryTrackStartSector(a, hfDrive),
+           CDQueryTrackStartSector(0, hfDrive),t);*/
+    //printf("discid: %x\n",((sum % 0xff) << 24 | (t << 8) | numTracks));
+    //printf("Disclength: %d",(CDQueryTrackStartSector(a, hfDrive)-CDQueryTrackStartSector(0, hfDrive))/75);
+    cddbInfo->discLength=(CDQueryTrackStartSector(a, hfDrive)-CDQueryTrackStartSector(0, hfDrive))/75;
+    cddbInfo->discid=(sum % 0xff) << 24 | (t << 8) | numTracks;
+    closeDrive(hfDrive);
+    return cddbInfo->discid;
+  }while(TRUE);
+
+  /* error */
+  closeDrive(hfDrive);
+  return 0;
+}
+
+
+
Index: /tags/CWMM-0.3.0_GA/mediafolder/c/helper/cddbhelper.cpp
===================================================================
--- /tags/CWMM-0.3.0_GA/mediafolder/c/helper/cddbhelper.cpp	(revision 213)
+++ /tags/CWMM-0.3.0_GA/mediafolder/c/helper/cddbhelper.cpp	(revision 213)
@@ -0,0 +1,92 @@
+/*
+ * This file is (C) Chris Wohlgemuth 1999/2000
+ */
+/* These functions are used by PMCDDB to output error messages and
+   CDDB data to the appropriate log and data files.
+   */
+/*
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; see the file COPYING.  If not, write to
+ * the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+
+#include <os2.h>
+#include <stdio.h> /* For stderr */
+#include <string.h>
+#include <io.h>
+#include <fcntl.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+
+extern HWND hwndError;
+extern char cddbDataFile[];
+
+extern "C"  void writeLog(char* logText);
+
+/**********************************************************/
+/* Some helper functions
+ */
+
+void printError(char* errorString)
+{
+    char buffer[CCHMAXPATH] = {0};
+  char *ptr;
+
+  fprintf(stderr,"%s",errorString);
+
+  writeLog(errorString);
+  if(hwndError) {
+    strncpy(buffer, errorString, sizeof(buffer) - 1);
+    ptr=strchr(buffer,'\n');
+    if(ptr) {
+      *ptr=0;
+    }
+  }
+}
+
+void printErrorCR(char* errorString)
+{
+  fprintf(stderr,"%s\n",errorString);
+  writeLog(errorString);
+  writeLog("\n");
+}
+
+
+void printData(char* outString)
+{
+  int fileHandle;
+  int rc;
+
+  /* The name cddbDataFile is defined in the main pmcddb.cpp file. It is
+     the discid (this is the native format of the data hold by a cddb server) */
+  fileHandle=open(cddbDataFile,O_APPEND|O_TEXT|O_WRONLY|O_CREAT,S_IWRITE);
+  if(fileHandle==-1) {
+    printError("Cannot open cddb outfile");/* Disk full? */
+    return;
+  }
+  rc= write(fileHandle,outString,strlen(outString));
+  // write(fileHandle,"\n",sizeof("\n"));
+  close(fileHandle);
+  return;
+}
+
+
+
+
+
+
+
+
+
+
+
Index: /tags/CWMM-0.3.0_GA/mediafolder/c/helper/customprocs.cpp
===================================================================
--- /tags/CWMM-0.3.0_GA/mediafolder/c/helper/customprocs.cpp	(revision 213)
+++ /tags/CWMM-0.3.0_GA/mediafolder/c/helper/customprocs.cpp	(revision 213)
@@ -0,0 +1,1160 @@
+/*
+ * This file is (C) Chris Wohlgemuth 2002
+ * It is part of the MediaFolder package
+ */
+/*
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; see the file COPYING.  If not, write to
+ * the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+#define INCL_GPILCIDS
+#define INCL_GPIPRIMITIVES
+#define INCL_GPIBITMAPS
+#define INCL_GPILOGCOLORTABLE
+#define INCL_SW
+#define INCL_GPIREGIONS
+
+#include "mediafolder.hh"
+#include "mediafolderres.h"
+#include <stdio.h>
+#include <stdlib.h>
+
+
+/* Fonts to use in dialogs */
+#define DEFAULT_DIALOG_FONT   "9.WarpSans"
+
+
+PFNWP  oldButtonProc2;  //place for original button-procedure
+HWND hwndBubbleWindow=NULLHANDLE;// The handle of the help window
+#define  WM_NEWBUBBLE   WM_USER+100 //Use ATOM later
+#define xVal  12      //x-distance of Bubble
+#define yVal  8      //y-distance of Bubble
+
+extern HMODULE hResource;
+
+extern CONTROLINFO ciControls[];
+extern LOADEDBITMAP allBMPs[];
+extern HPOINTER hptrArrowWE; /* Pointer for slider control */
+
+PFNWP  oldButtonProc;  //place for original button-procedure
+PFNWP  oldStaticTextProc;
+PFNWP  oldStaticProc;
+PFNWP  oldCheckBoxProc;
+PFNWP  oldSliderPaintProc;
+PFNWP  oldPlayTimeProc;
+
+/* Extern */
+ULONG cwQueryOSRelease();
+void sendConfig();
+ULONG messageBox( char* text, ULONG ulTextID , LONG lSizeText,
+                  char* title, ULONG ulTitleID, LONG lSizeTitle,
+                  HMODULE hResource, HWND hwnd, ULONG ulFlags);
+void getMessage(char* text,ULONG ulID, LONG lSizeText, HMODULE hResource,HWND hwnd);
+MRESULT cwInsertMenuItem(int iPosition, HWND hwndMenu, HWND hwndSubMenu, int iID, char * chrText);
+MRESULT cwInsertMenuSeparator(int iPosition, HWND hwndMenu, HWND hwndSubMenu);
+void handleWindowPosChanged(HWND hwnd, ULONG msg, MPARAM mp1, MPARAM mp2);/* In dataCddialogProcs.cpp */
+void writeLogPrintf(char* logFile, char* format, ...);
+
+/* Local */
+MRESULT EXPENTRY staticTextProc(HWND hwnd, ULONG msg, MPARAM mp1, MPARAM mp2)
+{
+  switch(msg)
+    {
+    case WM_SETWINDOWPARAMS:
+      {
+        MRESULT mr;
+        PWNDPARAMS pwp=(PWNDPARAMS)PVOIDFROMMP(mp1);
+        if(pwp->fsStatus==WPM_TEXT) {
+          /* The control text changes. Force repaint of background by frame. */
+          if(WinIsWindowVisible(hwnd)) {
+            WinShowWindow(hwnd, FALSE);
+            mr=oldStaticTextProc(hwnd, msg, mp1, mp2);/* Change text */
+            WinShowWindow(hwnd, TRUE);/* Force painting of text */
+            return mr;
+          }
+        }
+      }
+      break;
+    case WM_PAINT:
+      {
+        HPS hps;
+        char text[200];
+
+        hps=WinBeginPaint(hwnd, NULLHANDLE, NULL);
+        if(WinQueryWindowText(hwnd, sizeof(text), text))
+          {
+            RECTL rcl;
+
+            WinQueryWindowRect(hwnd, &rcl);
+            GpiCreateLogColorTable(hps, LCOL_PURECOLOR,LCOLF_RGB, 0, 0, NULLHANDLE);
+            rcl.xLeft+=1;
+                        
+            WinDrawText(hps, strlen(text), text, &rcl, 0x00eeeeef,0, /*DT_CENTER|*/DT_VCENTER|DT_MNEMONIC);
+            rcl.xLeft-=1;
+            rcl.yBottom+=1;
+            WinDrawText(hps, strlen(text),text, &rcl, 0x00333355,0,DT_VCENTER /*| DT_CENTER*//*|DT_TEXTATTRS*/);
+
+          }
+        WinEndPaint(hps);
+        return (MRESULT) 0;
+      }
+    default:
+      break;
+    }
+  return oldStaticTextProc(hwnd, msg, mp1, mp2);
+}
+
+MRESULT EXPENTRY playTimeTextProc(HWND hwnd, ULONG msg, MPARAM mp1, MPARAM mp2)
+{
+  switch(msg)
+    {
+    case WM_BUTTON1CLICK:
+      WinSendMsg(WinQueryWindow(hwnd, QW_PARENT), WM_APPTERMINATENOTIFY,
+                 MPFROM2SHORT(NOTIFY_CLICK, WinQueryWindowUShort(hwnd, QWS_ID)) ,0L);
+      return (MRESULT)0;
+    case WM_CONTEXTMENU:
+      WinSendMsg(WinQueryWindow(hwnd, QW_PARENT), WM_APPTERMINATENOTIFY,
+                 MPFROM2SHORT(NOTIFY_CONTEXT, WinQueryWindowUShort(hwnd, QWS_ID)) ,0L);
+      return (MRESULT)0;
+    case WM_PAINT:
+      {
+        HPS hps;
+        RECTL rcl;
+        char text[100];
+        CONTROLINFO ci;
+        
+        ci=ciControls[CTRLIDX_PLAYTIME];//ciVolSliderArm;
+        
+        hps=WinBeginPaint(hwnd, NULLHANDLE, NULL);
+        if(WinQueryWindowText(hwnd, sizeof(text), text))
+          {
+            POINTL ptl= {0};
+            WinDrawBitmap(hps, ci.hbmSource,
+                          &ci.rclSource, 
+                          &ptl,
+                          0, 0,
+                          DBM_IMAGEATTRS);
+            WinQueryWindowRect(hwnd,&rcl);
+            WinDrawText(hps, strlen(text),text, &rcl,0,0,DT_CENTER|DT_VCENTER|DT_TEXTATTRS);
+          }
+        WinEndPaint(hps);
+        return (MRESULT) 0;
+      }
+    default:
+      break;
+    }
+  return oldPlayTimeProc(hwnd, msg, mp1, mp2);
+}
+
+
+/* This function paints all our controls with the provided bitmaps */
+/* It's called from the guiproc                                    */
+MRESULT paintControls(HWND hwnd, ULONG msg, MPARAM mp1, MPARAM mp2)
+{
+  USERBUTTON* ubPtr;
+  CONTROLINFO ci;
+  RECTL rcl;
+  SWP swp;
+
+  ubPtr=(USERBUTTON*)PVOIDFROMMP(mp2);
+  switch(SHORT1FROMMP(mp1))
+    {
+    case IDPB_SKIPFORWARD:
+      if(ubPtr->fsState==BDS_DEFAULT||!ubPtr->fsState)
+        ci=ciControls[CTRLIDX_SKIPFWDBUTTON];
+      else {
+        ci=ciControls[CTRLIDX_SKIPFWDBUTTONSEL];
+      }
+      break;
+    case IDPB_SKIPBACK:
+      if(ubPtr->fsState==BDS_DEFAULT||!ubPtr->fsState)
+        ci=ciControls[CTRLIDX_SKIPBACKBUTTON];
+      else {
+        ci=ciControls[CTRLIDX_SKIPBACKBUTTONSEL];
+      }
+      break;
+    case IDPB_PLAY:
+      if(ubPtr->fsState==BDS_DEFAULT||!ubPtr->fsState)
+        ci=ciControls[CTRLIDX_PLAYBUTTON];
+      else {
+        ci=ciControls[CTRLIDX_PLAYBUTTONSEL];
+      }
+      break;
+    case IDPB_PAUSE:
+      if(ubPtr->fsState==BDS_DEFAULT||!ubPtr->fsState)
+        ci=ciControls[CTRLIDX_PAUSEBUTTON];
+      else {
+        ci=ciControls[CTRLIDX_PAUSEBUTTONSEL];
+      }
+      break;
+    case IDPB_STOP:
+      if(ubPtr->fsState==BDS_DEFAULT||!ubPtr->fsState)
+        ci=ciControls[CTRLIDX_STOPBUTTON];
+      else {
+        ci=ciControls[CTRLIDX_STOPBUTTONSEL];
+      }
+      break;
+    case IDPB_POSBAR:
+      ci=ciControls[CTRLIDX_POSSLIDER];//ciPosSlider;
+      break;
+    case IDPB_SLIDERARM:
+        ci=ciControls[CTRLIDX_POSSLIDERARM];//ciPosSliderArm;
+      break;
+    case IDSL_VOLUME:
+      ci=ciControls[CTRLIDX_VOLSLIDER];//ciVolSlider;
+      break;
+    case IDSL_VOLUMEARM:
+      if(WinQueryCapture(HWND_DESKTOP==hwnd))
+        ci=ciControls[CTRLIDX_VOLSLIDERARMSEL];//ciVolSliderArm;
+      else
+        ci=ciControls[CTRLIDX_VOLSLIDERARM];//ciVolSliderArm;
+      break;
+    default:
+      return (MRESULT)0;
+    }
+  rcl.yBottom=0;
+  rcl.xLeft=0;
+  WinDrawBitmap(ubPtr->hps, ci.hbmSource,
+                &ci.rclSource, 
+                (PPOINTL)&rcl,
+                0, 0,
+                DBM_IMAGEATTRS);
+  if(ubPtr->fsStateOld!=ubPtr->fsState)
+    ubPtr->fsState =( ubPtr->fsStateOld==BDS_DEFAULT ? BDS_HILITED : BDS_DEFAULT);
+  return (MRESULT)0;
+}
+
+/* This function paints all our controls with the provided bitmaps. */
+BOOL paintHilitedControl(HWND hwnd, USHORT usControl, BOOL bHilite)
+{
+  CONTROLINFO ci;
+  RECTL rcl;
+  SWP swp;
+  HPS hps;
+  static ULONG ulShowFeedback=0;
+
+  if(!ulShowFeedback) {
+    /* Query the INI setting*/
+    if(!PrfQueryProfileInt(HINI_USERPROFILE, APPKEY_CWMM, MFLDR_NO_VISUAL_FEEDBACK, 0))
+      ulShowFeedback=1; /* Flash play controls */
+    else
+      ulShowFeedback=2; /* Don't flash play controls while playing */
+  }
+
+  if(ulShowFeedback==2)
+    return 1;
+  
+  switch(usControl)
+    {
+    case IDPB_PLAY:
+      if(!bHilite) {
+        ci=ciControls[CTRLIDX_PLAYBUTTON];
+    }
+      else {
+        ci=ciControls[CTRLIDX_PLAYBUTTONSEL];
+      }
+      break;
+    case IDPB_PAUSE:
+      if(!bHilite) {
+        ci=ciControls[CTRLIDX_PAUSEBUTTON];
+      }
+      else {
+        ci=ciControls[CTRLIDX_PAUSEBUTTONSEL];
+      }
+      break;
+    default:
+      return 0;
+    }
+  rcl.yBottom=0;
+  rcl.xLeft=0;
+  hps=WinGetPS(hwnd);
+  WinDrawBitmap(hps, ci.hbmSource,
+                &ci.rclSource, 
+                (PPOINTL)&rcl,
+                0, 0,
+                DBM_IMAGEATTRS);
+  WinReleasePS(hps);
+  return 1;
+}
+
+/* This proc handles the custom painting for check boxes */
+MRESULT EXPENTRY checkBoxProc(HWND hwnd, ULONG msg, MPARAM mp1, MPARAM mp2)
+{
+ 
+  switch(msg)
+    {
+    case WM_DESTROY:
+      {
+        MFLDRCTRLDATA * mFldrCtrlData=(MFLDRCTRLDATA *) WinQueryWindowULong(hwnd,QWL_USER);;
+        
+        if(!mFldrCtrlData)
+          free(mFldrCtrlData);
+        break;
+      }
+    case WM_PAINT:
+      {
+        short       checkState;
+        BOOL bHighLite;
+        HPS hps;
+        RECTL rcl;
+        char text[100];
+        CONTROLINFO ci;
+        MFLDRCTRLDATA * mFldrCtrlData=(MFLDRCTRLDATA *) WinQueryWindowULong(hwnd,QWL_USER);
+
+        checkState = SHORT1FROMMR(WinSendMsg(hwnd,BM_QUERYCHECK,NULL,NULL));
+        bHighLite  = LONGFROMMR(WinSendMsg(hwnd,BM_QUERYHILITE,NULL,NULL));
+        if(checkState==0) {
+          /* unchecked */
+          if(mFldrCtrlData)
+            mFldrCtrlData->bPreviousCheckState=0;
+          if(bHighLite)
+            ci=ciControls[CTRLIDX_UNCHECKSEL];
+          else
+            ci=ciControls[CTRLIDX_UNCHECK];//ciVolSliderArm;
+        }
+        else if(checkState==1) {
+          /* checked */
+          if(mFldrCtrlData)
+            mFldrCtrlData->bPreviousCheckState=1;
+          if(bHighLite)
+            ci=ciControls[CTRLIDX_CHECKSEL];
+          else
+            ci=ciControls[CTRLIDX_CHECK];
+        }
+      
+        WinQueryWindowRect(hwnd, &rcl);
+        hps=WinBeginPaint(hwnd, NULLHANDLE, NULL);
+        if(WinQueryWindowText(hwnd, sizeof(text), text))
+          {
+            POINTL ptl= {0};
+            ULONG ulPos;
+            char text2[120];
+            ptl.y=(rcl.yTop-ci.rclSource.yTop)/2;
+
+            WinDrawBitmap(hps, ci.hbmSource,
+                          NULL,//&ci.rclSource, 
+                          &ptl,
+                          0, 0,
+                          DBM_IMAGEATTRS);
+            //            WinQueryWindowRect(hwnd,&rcl);
+            rcl.xLeft+=ci.rclSource.xRight+2;
+            GpiCreateLogColorTable(hps, LCOL_PURECOLOR,LCOLF_RGB, 0, 0, NULLHANDLE);
+            rcl.xLeft+=1;
+            /* Get mnemonic */
+            if(mFldrCtrlData && (ulPos=mFldrCtrlData->ulMnemonicPos) & 0x00010000){
+              ulPos&=0x0000FFFF;
+              strncpy(text2,text,ulPos);
+              text2[ulPos]=0;
+              strcat(text2,"~");
+              strcat(text2,&text[ulPos]);
+              WinDrawText(hps, strlen(text2), text2, &rcl, 0x00eeeeef,0, DT_VCENTER|DT_MNEMONIC);
+              rcl.xLeft-=1;
+              rcl.yBottom+=1;
+              WinDrawText(hps, strlen(text2), text2, &rcl, 0x00333355,0,/*DT_TEXTATTRS|*/DT_VCENTER|DT_MNEMONIC);
+            }
+            else {
+              WinDrawText(hps, strlen(text), text, &rcl, 0x00eeeeef,0, DT_VCENTER|DT_MNEMONIC);
+              rcl.xLeft-=1;
+              rcl.yBottom+=1;
+              WinDrawText(hps, strlen(text),text, &rcl, 0x00333355,0,DT_VCENTER/*|DT_TEXTATTRS*/);
+            }
+          }/* WinQueryWindowText() */
+        //        if(WinQueryFocus(HWND_DESKTOP)==hwnd)
+        //   WinSetFocus(HWND_DESKTOP, hwnd);
+        WinEndPaint(hps);
+        return (MRESULT) 0;
+      }
+    case BM_SETHILITE:
+    case BM_SETDEFAULT:
+    case BM_SETCHECK:
+      {
+        MRESULT mr;
+        WinEnableWindowUpdate(hwnd, FALSE);
+        mr=oldCheckBoxProc(hwnd, msg, mp1, mp2);
+        WinEnableWindowUpdate(hwnd, TRUE);
+        WinInvalidateRect(hwnd, NULL,TRUE);
+        return mr;
+      }
+    default:
+      break;
+    }
+  return oldCheckBoxProc(hwnd, msg, mp1, mp2);
+}
+MRESULT EXPENTRY sliderPaintProc(HWND hwnd, ULONG msg, MPARAM mp1, MPARAM mp2)
+{
+ 
+  switch(msg)
+    {
+    case WM_PAINT:
+      {
+        short       checkState;
+        HPS hps;
+        RECTL rcl, rcl2;
+        char text[100];
+        CONTROLINFO ci;
+        MRESULT mr;
+
+        hps=WinBeginPaint(hwnd, NULLHANDLE, NULL);
+        WinQueryWindowRect(hwnd, &rcl);
+        WinValidateRect(hwnd,&rcl,TRUE);
+
+        mr=oldSliderPaintProc(hwnd, msg, mp1, mp2);
+
+        rcl2=rcl;
+        hps=WinGetPS(hwnd);
+        rcl2.yBottom=rcl2.yTop-5;
+        WinFillRect(hps,&rcl2, CLR_BLUE);
+        rcl2=rcl;
+        rcl2.yTop=rcl2.yBottom+5;
+        WinFillRect(hps,&rcl2, CLR_BLUE);
+        WinEndPaint(hps);
+        return mr;
+      }
+   case WM_APPTERMINATENOTIFY:
+     {
+       HPS hps;
+       RECTL rcl,rcl2;
+
+       WinQueryWindowRect(hwnd, &rcl);
+       rcl2=rcl;
+       hps=WinGetPS(hwnd);
+       rcl2.yBottom=rcl2.yTop-5;
+       WinFillRect(hps,&rcl2, CLR_BLUE);
+       rcl2=rcl;
+       rcl2.yTop=rcl2.yBottom+5;
+       WinFillRect(hps,&rcl2, CLR_BLUE);
+
+       WinReleasePS(hps);
+       return (MRESULT) TRUE;
+     }
+    default:
+      break;
+    }
+  return oldSliderPaintProc(hwnd, msg, mp1, mp2);
+}
+
+
+#define USERSLIDER 1 /* Set to 0 to let the proc paint the control. With set to 1
+                        a WM_DRAWITEM msg is sent to the parent. */
+BOOL userSlider=USERSLIDER;
+#define SLOFFSET 3 /* The offset of the active slider area to the window border */
+MRESULT EXPENTRY privateSliderProc(HWND hwnd, ULONG msg, MPARAM mp1, MPARAM mp2)
+{
+
+  switch (msg)
+    {      
+    case WM_CREATE:
+      {
+        PCREATESTRUCT pCreate=(CREATESTRUCT*)PVOIDFROMMP(mp2);
+
+        /* Initialize the slider data */
+        WinSetWindowUShort(hwnd, SLIDERARMWIDTH,20);
+        WinSetWindowUShort(hwnd, SLIDERARMHEIGHT,10);
+        WinSetWindowUShort(hwnd, SLINCREMENTS,100);
+        /* Dimensions of slider. The slider active area is smaller than the window to
+           allow drawing of active state. */
+        WinSetWindowULong(hwnd, SLIDERCX,pCreate->cx-2*SLOFFSET);
+        WinSetWindowULong(hwnd, SLIDERCY,pCreate->cy-2*SLOFFSET);
+        WinSetWindowULong(hwnd, SLIDERX,SLOFFSET);
+        WinSetWindowULong(hwnd, SLIDERY,SLOFFSET);
+        WinSetWindowULong(hwnd, SLIDERARMPOS, 0);
+        WinSetWindowULong(hwnd, SLDRAGGING,FALSE);
+
+        return (MRESULT)0;
+      }
+    case SLM_SETSLIDERINFO:
+      switch(SHORT1FROMMP(mp1))
+        {
+          case SMA_SLIDERARMPOSITION:
+            /*  SMA_RANGEVALUE */
+            if(!WinQueryWindowULong(hwnd, SLDRAGGING)) {
+              if(SHORT2FROMMP(mp1)==SMA_RANGEVALUE) {
+                WinSetWindowULong(hwnd, SLIDERARMPOS, LONGFROMMP(mp2));
+                WinInvalidateRect(hwnd, NULLHANDLE,TRUE);
+                return (MRESULT)0;
+              }
+              else if(SHORT2FROMMP(mp1)==SMA_INCREMENTVALUE) {
+                LONG lInc=LONGFROMMP(mp2)*(WinQueryWindowULong(hwnd, SLIDERCX)-WinQueryWindowUShort(hwnd, SLIDERARMWIDTH));
+                lInc/=WinQueryWindowUShort(hwnd, SLINCREMENTS);
+                WinSetWindowULong(hwnd, SLIDERARMPOS, lInc);
+                WinInvalidateRect(hwnd, NULLHANDLE,TRUE);
+                return (MRESULT)0;
+              }
+            }
+            break;
+        case SMA_SLIDERARMDIMENSIONS:
+          WinSetWindowUShort(hwnd, SLIDERARMWIDTH, SHORT1FROMMP(mp2));
+          WinSetWindowUShort(hwnd, SLIDERARMHEIGHT, SHORT2FROMMP(mp2));
+          return (MRESULT)0;
+        default:
+          break;
+        }
+      break;
+    case WM_SIZE:
+      WinSetWindowULong(hwnd, SLIDERCX, SHORT1FROMMP(mp2)-2*SLOFFSET);
+      WinSetWindowULong(hwnd, SLIDERCY, SHORT2FROMMP(mp2)-2*SLOFFSET);
+      WinInvalidateRect(hwnd, NULLHANDLE,TRUE);
+      return (MRESULT)0;
+    case WM_BUTTON1DOWN:
+      {
+        SHORT x=SHORT1FROMMP( mp1);
+        SHORT y=SHORT2FROMMP( mp1);
+        LONG  lPos=WinQueryWindowULong(hwnd, SLIDERARMPOS);
+        USHORT usWidth=WinQueryWindowUShort(hwnd, SLIDERARMWIDTH);
+
+        if(x<=lPos+usWidth+SLOFFSET && x>=lPos+SLOFFSET && 
+           y<=WinQueryWindowUShort(hwnd, SLIDERY)+WinQueryWindowUShort(hwnd, SLIDERCY)
+           && y>=WinQueryWindowUShort(hwnd, SLIDERY)) {
+          WinSetWindowUShort(hwnd, PTRPOSINSLARM, x-lPos-SLOFFSET);
+        }
+        WinSetFocus(HWND_DESKTOP, hwnd);
+      break;
+      }
+
+    case WM_FOCUSCHANGE:
+      {
+        HPS hps;
+        RECTL rcl;
+        POINTL ptl;
+
+        if(SHORT1FROMMP(mp2)) {
+          hps=WinGetPS(hwnd);
+          WinQueryWindowRect(hwnd, &rcl);        
+          GpiSetLineType(hps, LINETYPE_DOT);
+          ptl.x=rcl.xLeft;
+          ptl.y=rcl.yBottom;
+          GpiMove(hps,&ptl);
+          ptl.x=rcl.xRight-1;
+          GpiLine(hps,&ptl);
+          ptl.y=rcl.yTop-1;
+          GpiLine(hps,&ptl);
+          ptl.x=rcl.xLeft;
+          GpiLine(hps,&ptl);
+          ptl.y=rcl.yBottom;
+          GpiLine(hps,&ptl);
+          WinReleasePS(hps);
+        }
+        else
+          WinInvalidateRect(hwnd, NULLHANDLE,TRUE);
+
+        break;
+      }
+    case WM_CHAR:
+      if(WinQueryFocus(HWND_DESKTOP)==hwnd) {
+        if(SHORT2FROMMP(mp2)==VK_TAB && (SHORT1FROMMP(mp1) & KC_VIRTUALKEY))
+          if(SHORT1FROMMP(mp1) & (KC_KEYUP|KC_PREVDOWN)) 
+            return (MRESULT)TRUE;
+
+#if 0
+        /**/
+        if(SHORT2FROMMP(mp2)==VK_RIGHT && (SHORT1FROMMP(mp1) & KC_VIRTUALKEY))
+          /* if(SHORT1FROMMP(mp1) & (KC_KEYUP|KC_PREVDOWN))*/ {
+            DosBeep(5000, 100);
+            return (MRESULT)TRUE;
+          }
+        if(SHORT2FROMMP(mp2)==VK_LEFT && (SHORT1FROMMP(mp1) & KC_VIRTUALKEY))
+          if(SHORT1FROMMP(mp1) & (KC_KEYUP|KC_PREVDOWN)) {
+            DosBeep(500, 100);
+            return (MRESULT)TRUE;
+          }
+#endif
+
+        return WinDefWindowProc(hwnd, msg, mp1, mp2);
+      }
+
+#if 0
+      if(WinQueryFocus(HWND_DESKTOP)==hwnd) {
+        /* We have the focus */
+        if((SHORT1FROMMP(mp1) & (KC_VIRTUALKEY))==(KC_VIRTUALKEY)) {
+          LONG  lPos=WinQueryWindowULong(hwnd, SLIDERARMPOS);
+          USHORT usWidth=WinQueryWindowUShort(hwnd, SLIDERARMWIDTH);
+          ULONG ulCx=WinQueryWindowULong(hwnd, SLIDERCX);
+
+          switch(SHORT2FROMMP(mp2))
+            {
+            case VK_RIGHT:
+              if(SHORT1FROMMP(mp1) & (KC_KEYUP|KC_PREVDOWN)) {
+                lPos+=1;
+                if(lPos>ulCx-usWidth)
+                  lPos=ulCx-usWidth;
+                else {
+                  WinPostMsg( hwnd,
+                              SLM_SETSLIDERINFO,
+                              MPFROM2SHORT(SMA_SLIDERARMPOSITION, SMA_RANGEVALUE),
+                              MPFROMLONG( (LONG) lPos ));
+                  lPos=(lPos*100)/(WinQueryWindowULong(hwnd, SLIDERCX)-WinQueryWindowUShort(hwnd, SLIDERARMWIDTH));
+
+                  WinPostMsg( WinQueryWindow(hwnd, QW_PARENT),WM_CONTROL,
+                              MPFROM2SHORT(WinQueryWindowUShort(hwnd, QWS_ID), SLN_CHANGE),
+                              MPFROMLONG(lPos));
+
+                  if(SHORT1FROMMP(mp1) & KC_LONEKEY) {
+                    /* Post SLN_CHANGE notification */
+                    WinPostMsg( WinQueryWindow(hwnd, QW_PARENT),WM_CONTROL,
+                                MPFROM2SHORT(WinQueryWindowUShort(hwnd, QWS_ID), SLN_CHANGE),
+                                MPFROMLONG(lPos));
+                    WinSetWindowULong(hwnd, SLDRAGGING, FALSE);
+                  }
+                  else {
+                    WinSetWindowULong(hwnd, SLDRAGGING, TRUE);
+                    /* Post SLN_SLIDERTRACK notification */
+                    WinPostMsg(WinQueryWindow(hwnd, QW_PARENT),WM_CONTROL,
+                               MPFROM2SHORT(WinQueryWindowUShort(hwnd, QWS_ID), SLN_SLIDERTRACK),
+                               MPFROMLONG(lPos));
+                  }
+
+                }
+                WinSetWindowULong(hwnd, SLIDERARMPOS, lPos);
+              }
+              return (MRESULT)TRUE;
+            case VK_LEFT:
+              if(SHORT1FROMMP(mp1) & (KC_KEYUP|KC_PREVDOWN)) {
+                lPos-=1;
+                if(lPos<0) {
+                  lPos=0;
+                }
+                else {
+                  WinPostMsg( hwnd,
+                              SLM_SETSLIDERINFO,
+                              MPFROM2SHORT(SMA_SLIDERARMPOSITION, SMA_RANGEVALUE),
+                              MPFROMLONG( (LONG) lPos ));
+                  lPos=(lPos*100)/(WinQueryWindowULong(hwnd, SLIDERCX)-WinQueryWindowUShort(hwnd, SLIDERARMWIDTH));
+                  /* Post SLN_CHANGE notification */
+                  WinPostMsg( WinQueryWindow(hwnd, QW_PARENT),WM_CONTROL,
+                              MPFROM2SHORT(WinQueryWindowUShort(hwnd, QWS_ID), SLN_CHANGE),
+                              MPFROMLONG(lPos));
+
+                  if(SHORT1FROMMP(mp1) & KC_LONEKEY) {
+                    /* Post SLN_CHANGE notification */
+                    WinPostMsg( WinQueryWindow(hwnd, QW_PARENT),WM_CONTROL,
+                                MPFROM2SHORT(WinQueryWindowUShort(hwnd, QWS_ID), SLN_CHANGE),
+                                MPFROMLONG(lPos));
+                    WinSetWindowULong(hwnd, SLDRAGGING, FALSE);
+                  }
+                  else {
+                    WinSetWindowULong(hwnd, SLDRAGGING, TRUE);
+                    /* Post SLN_SLIDERTRACK notification */
+                    WinPostMsg(WinQueryWindow(hwnd, QW_PARENT),WM_CONTROL,
+                               MPFROM2SHORT(WinQueryWindowUShort(hwnd, QWS_ID), SLN_SLIDERTRACK),
+                               MPFROMLONG(lPos));
+                  }
+
+                }
+                WinSetWindowULong(hwnd, SLIDERARMPOS, lPos);
+
+              }
+              return (MRESULT)TRUE;
+            default:
+              break;
+            }
+        }
+
+      }
+#endif
+      break;
+    case WM_BUTTON1MOTIONSTART:
+      {
+        SHORT x=SHORT1FROMMP( mp1);
+        SHORT y=SHORT2FROMMP( mp1);
+        LONG  lPos=WinQueryWindowULong(hwnd, SLIDERARMPOS);
+        USHORT usWidth=WinQueryWindowUShort(hwnd, SLIDERARMWIDTH);
+
+        if(x<=lPos+usWidth+SLOFFSET && x>=lPos+SLOFFSET && 
+           y<=WinQueryWindowUShort(hwnd, SLIDERY)+WinQueryWindowUShort(hwnd, SLIDERCY)
+           && y>=WinQueryWindowUShort(hwnd, SLIDERY)){
+          //        if(x<=lPos+usWidth && y<=WinQueryWindowUShort(hwnd, SLIDERY)+WinQueryWindowUShort(hwnd, SLIDERCY)
+          //      && y>=WinQueryWindowUShort(hwnd, SLIDERY)) {
+          WinSetWindowULong(hwnd, SLDRAGGING, TRUE);
+          if(hptrArrowWE)
+            WinSetPointer(HWND_DESKTOP, hptrArrowWE);
+
+          WinSetCapture(HWND_DESKTOP, hwnd);
+        }
+        break;
+      }
+    case WM_BUTTON1MOTIONEND:
+      if(WinQueryWindowULong(hwnd, SLDRAGGING)) {
+        LONG lPos=WinQueryWindowULong(hwnd, SLIDERARMPOS);
+        WinSetWindowULong(hwnd, SLDRAGGING,FALSE);
+        WinSetCapture(HWND_DESKTOP, NULLHANDLE);
+          lPos=(lPos*100)/(WinQueryWindowULong(hwnd, SLIDERCX)-WinQueryWindowUShort(hwnd, SLIDERARMWIDTH));
+        /* Post SLN_CHANGE notification */
+        WinPostMsg(WinQueryWindow(hwnd, QW_PARENT),WM_CONTROL, MPFROM2SHORT(WinQueryWindowUShort(hwnd, QWS_ID), SLN_CHANGE),
+                   MPFROMLONG(lPos));
+      }
+      break;
+
+    case WM_MOUSEMOVE:
+      if(WinQueryWindowULong(hwnd, SLDRAGGING)) {
+        HPS hps;
+        RECTL rcl, rcl2, rcl3;
+        LONG lTemp;
+        SHORT x=SHORT1FROMMP(mp1);
+        LONG  lPos=WinQueryWindowULong(hwnd, SLIDERARMPOS);
+        USHORT usWidth=WinQueryWindowUShort(hwnd, SLIDERARMWIDTH);
+       
+        lTemp=lPos;
+     
+        rcl.xLeft=WinQueryWindowULong(hwnd, SLIDERX);
+        rcl.yBottom=WinQueryWindowULong(hwnd, SLIDERY);
+        rcl.xRight=rcl.xLeft+WinQueryWindowULong(hwnd, SLIDERCX);
+        rcl.yTop=rcl.yBottom+WinQueryWindowULong(hwnd, SLIDERCY);
+
+        rcl2=rcl3=rcl;
+        rcl.xLeft=x-WinQueryWindowUShort(hwnd, PTRPOSINSLARM);
+        if(rcl.xLeft<rcl2.xLeft)/* Make sure we stop at the left border */
+          rcl.xLeft=rcl2.xLeft;
+
+        rcl.xRight=rcl.xLeft+usWidth;
+        if(rcl.xRight>rcl2.xRight)
+          {/* Make sure we stop at the right border */
+            rcl.xRight=rcl2.xRight;
+            rcl.xLeft=rcl.xRight-usWidth;
+          }
+        lPos=rcl.xLeft-WinQueryWindowULong(hwnd, SLIDERX);/* Save position zero based */
+        WinSetWindowULong(hwnd, SLIDERARMPOS, lPos);
+        if(lPos!=lTemp) {
+          BOOL rc;
+
+          hps=WinGetPS(hwnd);
+          /* Paint Background not necessary here */
+
+          /* Shaft */
+          /* Left part */
+          rcl3.xRight=rcl.xLeft;
+
+          rc=FALSE;
+
+          if(userSlider) {
+            OWNERITEM oi={0};
+            oi.hwnd=hwnd;
+            oi.hps=hps;
+            oi.fsState=SLS_OWNERDRAW;/* More to come */
+            oi.rclItem=rcl3;
+            oi.idItem=SDA_SLIDERSHAFT;
+            rc=(BOOL)WinSendMsg(WinQueryWindow(hwnd, QW_PARENT), WM_DRAWITEM, MPFROMSHORT(WinQueryWindowUShort(hwnd, QWS_ID)),
+                                MPFROMP(&oi) );
+          }
+          if(!rc)
+            WinFillRect(hps, &rcl3, CLR_GREEN);
+
+          /* Right part */
+          rcl3.xRight=rcl2.xRight;
+          rcl3.xLeft=rcl.xRight;
+          rc=FALSE;
+          if(userSlider) {
+            OWNERITEM oi={0};
+            oi.hwnd=hwnd;
+            oi.hps=hps;
+            oi.fsState=SLS_OWNERDRAW;/* More to come */
+            oi.rclItem=rcl3;
+            oi.idItem=SDA_SLIDERSHAFT;
+            rc=(BOOL)WinSendMsg(WinQueryWindow(hwnd, QW_PARENT), WM_DRAWITEM, MPFROMSHORT(WinQueryWindowUShort(hwnd, QWS_ID)),
+                                MPFROMP(&oi) );
+          }
+          if(!rc)
+            WinFillRect(hps, &rcl3, CLR_WHITE);
+
+          /* Paint Slider */
+          rc=FALSE;
+          if(userSlider) {
+            OWNERITEM oi={0};
+            oi.hwnd=hwnd;
+            oi.hps=hps;
+            oi.fsState=SLS_OWNERDRAW;/* More to come */
+            oi.rclItem=rcl;
+            oi.idItem=SDA_SLIDERARM;
+            rc=(BOOL)WinSendMsg(WinQueryWindow(hwnd, QW_PARENT), WM_DRAWITEM, MPFROMSHORT(WinQueryWindowUShort(hwnd, QWS_ID)),
+                                MPFROMP(&oi) );
+
+          }
+          if(!rc)
+            {
+              WinFillRect(hps,&rcl, CLR_BLUE);
+              WinDrawBorder(hps, &rcl, 2, 2, 0, 0 ,0x0400);
+            }
+
+          WinReleasePS(hps);
+          lPos=(lPos*100)/(WinQueryWindowULong(hwnd, SLIDERCX)-WinQueryWindowUShort(hwnd, SLIDERARMWIDTH));
+           /* Post SLN_SLIDERTRACK notification */
+          WinPostMsg(WinQueryWindow(hwnd, QW_PARENT),WM_CONTROL, 
+                     MPFROM2SHORT(WinQueryWindowUShort(hwnd, QWS_ID), SLN_SLIDERTRACK),
+                     MPFROMLONG(lPos));
+        }
+        return MRTRUE;
+      }
+      else {
+        if(hptrArrowWE) {
+          /* Not dragging */
+          /* Change pointer to drag pointer when over the arm */
+          SHORT x=SHORT1FROMMP( mp1);
+          SHORT y=SHORT2FROMMP( mp1);
+          LONG  lPos=WinQueryWindowULong(hwnd, SLIDERARMPOS);
+          USHORT usWidth=WinQueryWindowUShort(hwnd, SLIDERARMWIDTH);
+          if(x<=lPos+usWidth+SLOFFSET && x>=lPos+SLOFFSET && 
+             y<=WinQueryWindowUShort(hwnd, SLIDERY)+WinQueryWindowUShort(hwnd, SLIDERCY)
+             && y>=WinQueryWindowUShort(hwnd, SLIDERY)) {
+            WinSetPointer(HWND_DESKTOP, hptrArrowWE);
+            return MRTRUE;
+          }
+        }
+      }
+      break;
+    case WM_PAINT:
+      {
+
+        HPS hps, hps2;
+        RECTL rcl, rcl2, rcl3;
+        POINTL ptl;
+        LONG  lPos=WinQueryWindowULong(hwnd, SLIDERARMPOS);
+        USHORT usWidth=WinQueryWindowUShort(hwnd, SLIDERARMWIDTH);
+        BOOL rc;
+
+        WinQueryWindowRect(hwnd, &rcl);
+
+        /* Shaft */
+        rcl2.xLeft=WinQueryWindowULong(hwnd, SLIDERX);
+        rcl2.yBottom=WinQueryWindowULong(hwnd, SLIDERY);
+        rcl2.xRight=rcl2.xLeft+WinQueryWindowULong(hwnd, SLIDERCX)-1;
+        rcl2.yTop=rcl2.yBottom+WinQueryWindowULong(hwnd, SLIDERCY)-1;
+
+        /* Background */
+        hps2=WinGetPS(hwnd);
+        GpiExcludeClipRectangle(hps2,&rcl2);
+        rc=FALSE;
+        if(userSlider) {
+          OWNERITEM oi={0};
+          oi.hwnd=hwnd;
+          oi.hps=hps2;
+          oi.fsState=SLS_OWNERDRAW;/* More to come */
+          oi.rclItem=rcl;
+          oi.idItem=SDA_BACKGROUND;
+          rc=(BOOL)WinSendMsg(WinQueryWindow(hwnd, QW_PARENT), WM_DRAWITEM, MPFROMSHORT(WinQueryWindowUShort(hwnd, QWS_ID)),
+                    MPFROMP(&oi) );
+        }
+        if(!rc)
+          WinFillRect(hps2, &rcl, CLR_PALEGRAY);
+        /* Focus */
+        if(WinQueryFocus(HWND_DESKTOP)==hwnd) {
+          GpiSetLineType(hps2, LINETYPE_DOT);
+          ptl.x=rcl.xLeft;
+          ptl.y=rcl.yBottom;
+          GpiMove(hps2,&ptl);
+          ptl.x=rcl.xRight-1;
+          GpiLine(hps2,&ptl);
+          ptl.y=rcl.yTop-1;
+          GpiLine(hps2,&ptl);
+          ptl.x=rcl.xLeft;
+          GpiLine(hps2,&ptl);
+          ptl.y=rcl.yBottom;
+          GpiLine(hps2,&ptl);
+        }
+
+        WinReleasePS(hps2);
+        rcl2.yTop+=1;
+        rcl2.xRight+=1;
+        hps=WinBeginPaint(hwnd, NULLHANDLE, NULLHANDLE);
+        rcl3=rcl=rcl2;
+        /* Arm pos */        
+        rcl2.xLeft+=lPos;
+        /* Arm size */        
+        rcl2.xRight=rcl2.xLeft+usWidth;
+        
+        /* Shaft */
+        /* Left part */
+        rcl3.xRight=rcl2.xLeft;
+        rc=FALSE;
+        if(userSlider) {
+          OWNERITEM oi={0};
+          oi.hwnd=hwnd;
+          oi.hps=hps;
+          oi.fsState=SLS_OWNERDRAW;/* More to come */
+          oi.rclItem=rcl3;
+          oi.idItem=SDA_SLIDERSHAFT;
+          rc=(BOOL)WinSendMsg(WinQueryWindow(hwnd, QW_PARENT), WM_DRAWITEM, MPFROMSHORT(WinQueryWindowUShort(hwnd, QWS_ID)),
+                    MPFROMP(&oi) );
+
+        }
+        if(!rc)
+          WinFillRect(hps, &rcl3, CLR_GREEN);
+
+        /* Right part */
+        rcl3.xRight=rcl.xRight;
+        rcl3.xLeft=rcl2.xRight;
+        rc=FALSE;
+        if(userSlider) {
+          OWNERITEM oi={0};
+          oi.hwnd=hwnd;
+          oi.hps=hps;
+          oi.fsState=SLS_OWNERDRAW;/* More to come */
+          oi.rclItem=rcl3;
+          oi.idItem=SDA_SLIDERSHAFT;
+          rc=(BOOL)WinSendMsg(WinQueryWindow(hwnd, QW_PARENT), WM_DRAWITEM, MPFROMSHORT(WinQueryWindowUShort(hwnd, QWS_ID)),
+                              MPFROMP(&oi) );
+        }
+        if(!rc)
+          WinFillRect(hps, &rcl3, CLR_WHITE);
+
+        rc=FALSE;
+        if(userSlider) {
+          OWNERITEM oi={0};
+          oi.hwnd=hwnd;
+          oi.hps=hps;
+          oi.fsState=SLS_OWNERDRAW;/* More to come */
+          oi.rclItem=rcl2;
+          oi.idItem=SDA_SLIDERARM;
+          rc=(BOOL)WinSendMsg(WinQueryWindow(hwnd, QW_PARENT), WM_DRAWITEM, MPFROMSHORT(WinQueryWindowUShort(hwnd, QWS_ID)),
+                              MPFROMP(&oi) );
+        }
+        if(!rc)
+          {
+            WinFillRect(hps,&rcl2, CLR_BLUE);        
+            WinDrawBorder(hps, &rcl2, 2, 2, 0, 0 ,0x0400);
+          }
+
+        WinEndPaint(hps);
+        return (MRESULT)0;
+      }
+      break;
+    default:
+      break;
+    }
+  return WinDefWindowProc(hwnd, msg, mp1, mp2);
+}
+
+MRESULT drawSlider(HWND hwnd, ULONG msg, MPARAM mp1, MPARAM mp2, USHORT id)
+{
+  POWNERITEM poi;
+  CONTROLINFO ci, ciArm;
+  RECTL rcl;
+  POINTL ptl= {0};
+
+  poi=(POWNERITEM)PVOIDFROMMP(mp2);
+
+  switch(id)
+    {
+    case IDSL_POSBAR:
+      ci=ciControls[CTRLIDX_POSSLIDER];
+      ciArm=ciControls[CTRLIDX_POSSLIDERARM];
+      break;
+    case IDSL_VOLUME:
+      ci=ciControls[CTRLIDX_VOLSLIDER];//ciVolSlider;
+      //      if(WinQueryCapture(HWND_DESKTOP==hwnd))
+      ciArm=ciControls[CTRLIDX_VOLSLIDERARMSEL];//ciVolSliderArm;
+      // else
+      //  ciArm=ciControls[CTRLIDX_VOLSLIDERARM];//ciVolSliderArm;
+      break;
+    default:
+      return (MRESULT)FALSE;
+    }
+  
+  switch(poi->idItem)
+    {
+    case SDA_SLIDERARM:
+      WinDrawBitmap(poi->hps, ciArm.hbmSource,
+                    &ciArm.rclSource, 
+                    (PPOINTL)&poi->rclItem,
+                    0, 0,
+                    DBM_IMAGEATTRS);
+      return (MRESULT) TRUE;
+    case SDA_BACKGROUND:
+      {
+        WinDrawBitmap(poi->hps,
+                      ci.hbmSource,
+                      &ci.rclSource, 
+                      (PPOINTL)&poi->rclItem,
+                      0, 0,
+                      DBM_IMAGEATTRS);
+        //        WinFillRect(poi->hps,&poi->rclItem, CLR_WHITE);
+        return (MRESULT) TRUE;
+      }
+    case SDA_SLIDERSHAFT:
+      {
+        RECTL rcl;
+
+        rcl=ci.rclSource;
+        rcl.xLeft+=poi->rclItem.xLeft;
+        rcl.xRight=rcl.xLeft+(poi->rclItem.xRight-poi->rclItem.xLeft);
+        rcl.yBottom+=SLOFFSET;
+        rcl.yTop-=SLOFFSET;
+
+        if(!WinDrawBitmap(poi->hps, ci.hbmSource,
+                          &rcl,
+                          //&ci.rclSource, 
+                          (PPOINTL)&poi->rclItem,
+                          0, 0,
+                          DBM_IMAGEATTRS))
+          return (MRESULT)FALSE;
+        return (MRESULT)TRUE;
+      }
+    default:
+      return (MRESULT)TRUE;
+    }
+  /* Done */
+  return (MRESULT)TRUE;
+}
+
+/***********************************************************/
+/*                                                         */
+/* Move the controls to the position defined by the        */
+/* background bitmap.                                      */
+/*                                                         */
+/***********************************************************/
+void adjustDialogControlPos(HWND hwnd)
+{
+  CONTROLINFO ci;
+  ULONG ulStyle;
+  char text[CCHMAXPATH];
+  ULONG ulLen;
+  HWND hwndTemp;
+  POINTL ptl;
+  SWP swp;
+
+  /* Pos slider */
+  ci=ciControls[CTRLIDX_POSSLIDER];//ciPosSlider;
+  WinCreateWindow(hwnd, SLIDER_CLASS, "", WS_VISIBLE | WS_TABSTOP, 0,0, 10, 10, 
+                  hwnd, HWND_TOP, ci.id, NULLHANDLE, NULLHANDLE);
+  WinSetWindowPos(WinWindowFromID(hwnd, ci.id),HWND_TOP, ci.rclSource.xLeft, ci.rclSource.yBottom,
+                  ci.rclSource.xRight-ci.rclSource.xLeft,
+                  ci.rclSource.yTop-ci.rclSource.yBottom, SWP_MOVE | SWP_SIZE);
+  
+  WinSendMsg(WinWindowFromID(hwnd, ci.id),SLM_SETSLIDERINFO,
+             MPFROM2SHORT(SMA_SLIDERARMDIMENSIONS,0),
+             MPFROM2SHORT( 9, 9)); 
+    /* Vol slider */
+  ci=ciControls[CTRLIDX_VOLSLIDER];//ciVolSlider;
+  WinCreateWindow(hwnd, SLIDER_CLASS, "", WS_VISIBLE | WS_TABSTOP, 0,0, 10, 10, 
+                  hwnd, HWND_TOP, ci.id, NULLHANDLE, NULLHANDLE);
+  WinSetWindowPos(WinWindowFromID(hwnd, ci.id),HWND_TOP, ci.rclSource.xLeft, ci.rclSource.yBottom,
+                  ci.rclSource.xRight-ci.rclSource.xLeft,
+                  ci.rclSource.yTop-ci.rclSource.yBottom, SWP_MOVE | SWP_SIZE);
+  WinSendMsg(WinWindowFromID(hwnd, ci.id),SLM_SETSLIDERINFO,
+             MPFROM2SHORT(SMA_SLIDERARMDIMENSIONS,0),
+             MPFROM2SHORT( 9, 9)); 
+  /* Playtime text */
+  ci=ciControls[CTRLIDX_PLAYTIME];
+  WinSetWindowPos(WinWindowFromID(hwnd, ci.id),HWND_TOP, ci.rclSource.xLeft,ci.rclSource.yBottom,
+                  ci.rclSource.xRight-ci.rclSource.xLeft,
+                  ci.rclSource.yTop-ci.rclSource.yBottom, SWP_MOVE|SWP_SIZE); 
+  oldPlayTimeProc=WinSubclassWindow(WinWindowFromID(hwnd, IDST_PLAYTIME), playTimeTextProc);
+  /* Skip back button */
+  ci=ciControls[CTRLIDX_SKIPBACKBUTTON];
+  ulStyle=WinQueryWindowULong(WinWindowFromID(hwnd, ci.id),QWL_STYLE);
+  WinSetWindowULong(WinWindowFromID(hwnd, ci.id),QWL_STYLE,ulStyle|BS_USERBUTTON);
+  WinSetWindowPos(WinWindowFromID(hwnd, ci.id),HWND_TOP, ci.rclDest.xLeft , ci.rclDest.yBottom,
+                  ci.rclDest.xRight-ci.rclDest.xLeft,
+                  ci.rclDest.yTop-ci.rclDest.yBottom, SWP_MOVE|SWP_SIZE);
+  /* STOP button */
+  ci=ciControls[CTRLIDX_STOPBUTTON];
+  ulStyle=WinQueryWindowULong(WinWindowFromID(hwnd, ci.id),QWL_STYLE);
+  WinSetWindowULong(WinWindowFromID(hwnd, ci.id),QWL_STYLE,ulStyle|BS_USERBUTTON);
+  WinSetWindowPos(WinWindowFromID(hwnd, ci.id),HWND_TOP, ci.rclDest.xLeft , ci.rclDest.yBottom,
+                  ci.rclDest.xRight-ci.rclDest.xLeft,
+                  ci.rclDest.yTop-ci.rclDest.yBottom, SWP_MOVE|SWP_SIZE);
+  /* Pause button */
+  ci=ciControls[CTRLIDX_PAUSEBUTTON];
+  ulStyle=WinQueryWindowULong(WinWindowFromID(hwnd, ci.id),QWL_STYLE);
+  WinSetWindowULong(WinWindowFromID(hwnd, ci.id),QWL_STYLE,ulStyle|BS_USERBUTTON);
+  WinSetWindowPos(WinWindowFromID(hwnd, ci.id),HWND_TOP, ci.rclDest.xLeft , ci.rclDest.yBottom,
+                  ci.rclDest.xRight-ci.rclDest.xLeft,
+                  ci.rclDest.yTop-ci.rclDest.yBottom, SWP_MOVE|SWP_SIZE);
+  /* Play button */
+  ci=ciControls[CTRLIDX_PLAYBUTTON];
+  ulStyle=WinQueryWindowULong(WinWindowFromID(hwnd, ci.id),QWL_STYLE);
+  WinSetWindowULong(WinWindowFromID(hwnd, ci.id),QWL_STYLE,ulStyle|BS_USERBUTTON);
+  WinSetWindowPos(WinWindowFromID(hwnd, ci.id),HWND_TOP, ci.rclDest.xLeft , ci.rclDest.yBottom,
+                  ci.rclDest.xRight-ci.rclDest.xLeft,
+                  ci.rclDest.yTop-ci.rclDest.yBottom, SWP_MOVE|SWP_SIZE);
+  /* Skip forward button */
+  ci=ciControls[CTRLIDX_SKIPFWDBUTTON];
+  ulStyle=WinQueryWindowULong(WinWindowFromID(hwnd, ci.id),QWL_STYLE);
+  WinSetWindowULong(WinWindowFromID(hwnd, ci.id),QWL_STYLE,ulStyle|BS_USERBUTTON);
+  WinSetWindowPos(WinWindowFromID(hwnd, ci.id),HWND_TOP, ci.rclDest.xLeft , ci.rclDest.yBottom,
+                  ci.rclDest.xRight-ci.rclDest.xLeft,
+                  ci.rclDest.yTop-ci.rclDest.yBottom, SWP_MOVE|SWP_SIZE);
+  /* Repeat Checkbox */
+  ci=ciControls[CTRLIDX_CHECK];//ciPosSlider;
+#if 0
+  ptl.x=ci.rclDest.xLeft;
+  ptl.y=ci.rclDest.yBottom;
+  WinMapDlgPoints(hwnd, &ptl, 1, FALSE);
+
+  WinSetWindowPos(WinWindowFromID(hwnd, ci.id),HWND_TOP, ptl.x , ptl.y,
+                  0, 0, SWP_MOVE);
+#endif
+  WinQueryWindowPos(WinWindowFromID(hwnd, ci.id), &swp);
+  WinSetWindowPos(WinWindowFromID(hwnd, ci.id),HWND_TOP, ci.rclDest.xLeft , ci.rclDest.yBottom,
+                  131, swp.cy, SWP_MOVE);
+
+  /* Remove BS_USERBUTTON style otherwise BS_AUTOCHECKBOX doesn't work. BS_USERBUTTON is necessary because eStyler
+     from eCS only checks during creation of the button for this style... OS/2 does it always when painting a control. */
+  ulStyle=WinQueryWindowULong(WinWindowFromID(hwnd, ci.id),QWL_STYLE);
+  ulStyle&=~BS_USERBUTTON;
+  WinSetWindowULong(WinWindowFromID(hwnd, ci.id),QWL_STYLE,ulStyle | BS_AUTOCHECKBOX);
+  /* Subclass */
+  oldCheckBoxProc=WinSubclassWindow(WinWindowFromID(hwnd, ci.id),checkBoxProc);
+  /* Find mnemonic */
+  hwndTemp=WinWindowFromID(hwnd, ci.id);
+  if((ulLen=WinQueryWindowText( hwndTemp, sizeof(text), text))!=0) {
+    int a;
+    
+    text[CCHMAXPATH-1]=0;
+    for(a=0;a<ulLen;a++) {
+      if(WinSendMsg( hwndTemp, WM_MATCHMNEMONIC,MPFROMSHORT((USHORT)text[a]),0))
+        break;/* Ok, mnemonic found */
+    }
+    if(a<=ulLen) {
+      MFLDRCTRLDATA * mFldrCtrlData=(MFLDRCTRLDATA *)malloc(sizeof(MFLDRCTRLDATA));
+
+      if(mFldrCtrlData) {
+        mFldrCtrlData->ulMnemonicPos=0x00010000+a;
+        WinSetWindowULong(hwndTemp, QWL_USER, (ULONG)mFldrCtrlData);/* For mnemonic */
+      }
+    }
+  }
+
+  /* Random Checkbox */
+  ci=ciControls[CTRLIDX_RANDOMCHECK];
+  WinQueryWindowPos(WinWindowFromID(hwnd, ci.id), &swp);
+  WinSetWindowPos(WinWindowFromID(hwnd, ci.id),HWND_TOP, ci.rclDest.xLeft , ci.rclDest.yBottom,
+                  131, swp.cy, SWP_MOVE|SWP_SIZE);
+  /* Remove BS_USERBUTTON style otherwise BS_AUTOCHECKBOX doesn't work. BS_USERBUTTON is necessary because eStyler
+     from eCS only checks during creation of the button for this style... OS/2 does it always when painting a control. */
+  ulStyle=WinQueryWindowULong(WinWindowFromID(hwnd, ci.id),QWL_STYLE);
+  ulStyle&=~BS_USERBUTTON;
+  WinSetWindowULong(WinWindowFromID(hwnd, ci.id),QWL_STYLE,ulStyle | BS_AUTOCHECKBOX);
+  /* Subclass */
+  oldCheckBoxProc=WinSubclassWindow(WinWindowFromID(hwnd, ci.id),checkBoxProc);
+  /* Find mnemonic */
+  hwndTemp=WinWindowFromID(hwnd, ci.id);
+  if((ulLen=WinQueryWindowText( hwndTemp, sizeof(text), text))!=0) {
+    int a;
+    
+    text[CCHMAXPATH-1]=0;
+    for(a=0;a<ulLen;a++) {
+      if(WinSendMsg( hwndTemp, WM_MATCHMNEMONIC,MPFROMSHORT((USHORT)text[a]),0))
+        break;/* Ok, mnemonic found */
+    }
+    if(a<=ulLen) {
+      MFLDRCTRLDATA * mFldrCtrlData=(MFLDRCTRLDATA *)malloc(sizeof(MFLDRCTRLDATA));
+
+      if(mFldrCtrlData) {
+        mFldrCtrlData->ulMnemonicPos=0x00010000+a;
+        WinSetWindowULong(hwndTemp, QWL_USER, (ULONG)mFldrCtrlData);/* For mnemonic */
+      }
+    }
+  }
+
+}
+
+
Index: /tags/CWMM-0.3.0_GA/mediafolder/c/helper/except.cpp
===================================================================
--- /tags/CWMM-0.3.0_GA/mediafolder/c/helper/except.cpp	(revision 213)
+++ /tags/CWMM-0.3.0_GA/mediafolder/c/helper/except.cpp	(revision 213)
@@ -0,0 +1,2083 @@
+/**********************************************************************/
+/*                                                                    */
+/*  EXCEPTQ                                                           */
+/*                                                                    */
+/* DLL containing an exception handler for gathering trap information */
+/* This DLL dumps all important debugging Data and is accessible      */
+/* from both 16 bit and 32 bits programs                              */
+/**********************************************************************/
+/* Version: 2.2             |   Marc Fiammante (FIAMMANT at LGEPROFS) */
+/*                          |   La Gaude FRANCE                       */
+/*                          |   Internet: fiammante@vnet.ibm.com      */
+/* Version: 5.0             |   John Currier  (JCURRIER at CLTVM1)    */
+/*                          |   Internet: currier@vnet.ibm.com        */
+/* Version: 6.0             |   Kim Rasmussen (krasmus@ibm.net)       */
+/*                          |   Denmark                               */
+/* Version: 6.1             |   Anthony Cruise (CRUISE at YKTVMH)     */
+/*                          |   Watson Research                       */
+/* Version: 6.2             |   John Currier  (JCURRIER at CLTVM1)    */
+/*                          |   Internet: currier@vnet.ibm.com        */
+/* Version: 6.3             |   Kim Rasmussen (kr@belle.dk)           */
+/*                          |   Denmark                               */
+/*                          |   Marc Fiammante (FIAMMANT at LGEPROFS) */
+/*                          |   La Gaude FRANCE                       */
+/*                          |   Internet: fiammante@vnet.ibm.com      */
+/* Version: 6.4             |   Kim Rasmussen (kr@belle.dk)           */
+/*                          |   Denmark - http://www.belle.dk/kr/     */
+/**********************************************************************/
+/*                                                                    */
+/**********************************************************************/
+/* History:                                                           */
+/* --------                                                           */
+/*                                                                    */
+/* created: Marc Fiammante December 1992                              */
+/* changed: John Currier   August   1994                              */
+/* changed: Kim Rasmussen, May 1995                                   */
+/*    Dump of auto-variables added (32-bit only)                      */
+/* changed: Anthony Cruise, May 1995                                  */
+/*    Do not dump duplicate lines  (32-bit only)                      */
+/* fixed  : Marc Fiammante thanks to Bill Siddall                     */
+/*    Dump of auto-variables wrong values                             */
+/* fixed  : John Currier fix stack thunk on non fatal exceptions      */
+/*         fixed DosQueryMem Size test on return                      */
+/* fixed  : Marc Fiammante find stack bottom from top to bottom       */
+/*         avoid traps on disassemble.                                */
+/* changed: Support for VisualAge C added (new debug format)          */
+/*                                                                    */
+/**********************************************************************/
+/**********************************************************************/
+/*                                                                    */
+/* Modified by Chris Wohlgemuth 2002 for use with Audio/Data-CD-      */
+/* Creator.                                                           */
+/*                                                                    */
+/**********************************************************************/
+#define INCL_BASE
+#define INCL_DOSEXCEPTIONS
+#define INCL_DOSSEMAPHORES   /* Semaphore values */
+#include <os2.h>
+#include <ctype.h>
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+#include <time.h>
+#include "sym.h"
+#include "omf.h"
+
+#ifndef DWORD
+#define DWORD unsigned long
+#endif
+#ifndef WORD
+#define WORD  unsigned short
+#endif
+#pragma stack16(512)
+#define HF_STDERR 2
+CHAR *ProcessName = "DEBUGGEE.EXE";
+FILE   *hTrap;
+static BOOL   f32bit = TRUE;
+struct debug_buffer
+ {
+   ULONG   Pid;        /* Debuggee Process ID */
+   ULONG   Tid;        /* Debuggee Thread ID */
+   LONG    Cmd;        /* Command or Notification */
+   LONG    Value;      /* Generic Data Value */
+   ULONG   Addr;       /* Debuggee Address */
+   ULONG   Buffer;     /* Debugger Buffer Address */
+   ULONG   Len;        /* Length of Range */
+   ULONG   Index;      /* Generic Identifier Index */
+   ULONG   MTE;        /* Module Handle */
+   ULONG   EAX;        /* Register Set */
+   ULONG   ECX;
+   ULONG   EDX;
+   ULONG   EBX;
+   ULONG   ESP;
+   ULONG   EBP;
+   ULONG   ESI;
+   ULONG   EDI;
+   ULONG   EFlags;
+   ULONG   EIP;
+   ULONG   CSLim;      /* Byte Granular Limits */
+   ULONG   CSBase;     /* Byte Granular Base */
+   UCHAR   CSAcc;      /* Access Bytes */
+   UCHAR   CSAtr;      /* Attribute Bytes */
+   USHORT  CS;
+   ULONG   DSLim;
+   ULONG   DSBase;
+   UCHAR   DSAcc;
+   UCHAR   DSAtr;
+   USHORT  DS;
+   ULONG   ESLim;
+   ULONG   ESBase;
+   UCHAR   ESAcc;
+   UCHAR   ESAtr;
+   USHORT  ES;
+   ULONG   FSLim;
+   ULONG   FSBase;
+   UCHAR   FSAcc;
+   UCHAR   FSAtr;
+   USHORT  FS;
+   ULONG   GSLim;
+   ULONG   GSBase;
+   UCHAR   GSAcc;
+   UCHAR   GSAtr;
+   USHORT  GS;
+   ULONG   SSLim;
+   ULONG   SSBase;
+   UCHAR   SSAcc;
+   UCHAR   SSAtr;
+   USHORT  SS;
+} DbgBuf;
+/*-------------------------------------*/
+APIRET APIENTRY DOSQUERYMODFROMEIP( HMODULE *phMod,
+                                    ULONG *pObjNum,
+                                    ULONG BuffLen,
+                                    PCHAR pBuff,
+                                    ULONG *pOffset,
+                                    PVOID Address );
+/*APIRET APIENTRY DosQueryModFromEIP( HMODULE *phMod,
+                                    ULONG *pObjNum,
+                                    ULONG BuffLen,
+                                    PCHAR pBuff,
+                                    ULONG *pOffset,
+                                    PVOID Address );*/
+
+/*-------------------------------------*/
+/* CW
+#define DBG_O_OBJMTE       0x10000000L*/
+#define DBG_C_NumToAddr            13
+#define DBG_C_AddrToObject         28
+#define DBG_C_Connect              21
+#define DBG_L_386                   1
+RESULTCODES ReturnCodes;
+UCHAR   LoadError[40]; /*DosExecPGM buffer */
+USHORT Passes;
+UCHAR   Translate[17];
+UCHAR   OldStuff[16];
+
+#ifdef USE_DOSDEBUG
+void    GetObjects(struct debug_buffer * pDbgBuf,HMODULE hMte,PSZ pName);
+#endif
+
+VOID    ListModules(VOID);
+void    CheckMem(PVOID Ptr,PSZ MemoryName);
+/* Better New WalkStack From John Currier */
+static void WalkStack(PUSHORT StackBottom,PUSHORT StackTop,PUSHORT Ebp,PUSHORT ExceptionAddress);
+int    Read16CodeView(int fh,int TrapSeg,int TrapOff,CHAR * FileName);
+int    Read32PmDebug(int fh,int TrapSeg,int TrapOff,CHAR * FileName);
+APIRET GetLineNum(CHAR * FileName, ULONG Object,ULONG TrapOffset);
+void GetSymbol(CHAR * SymFileName, ULONG Object,ULONG TrapOffset);
+void print_vars(ULONG stackofs);
+
+ULONG func_ofs;
+ULONG pubfunc_ofs;
+char  func_name[128];
+ULONG var_ofs = 0;
+
+struct {
+   BYTE name[128];
+   ULONG stack_offset;
+   USHORT type_idx;
+} autovar_def[100];
+
+HMODULE hMod;
+ULONG   ObjNum;
+ULONG   Offset;
+
+/*-------------------------------------*/
+CHAR    Buffer[CCHMAXPATH];
+
+typedef ULONG     * _Seg16 PULONG16;
+APIRET16 APIENTRY16 DOS16SIZESEG( USHORT Seg , PULONG16 Size);
+typedef  APIRET16  (APIENTRY16  _PFN16)();
+ULONG  APIENTRY DosSelToFlat(ULONG);
+/*-------------------------------------*/
+
+/*- DosQProcStatus interface ----------*/
+APIRET16 APIENTRY16 DOSQPROCSTATUS(  ULONG * _Seg16 pBuf, USHORT cbBuf);
+#define CONVERT(fp,QSsel) MAKEP((QSsel),OFFSETOF(fp))
+#pragma pack(1)
+/*  Global Data Section */
+typedef struct qsGrec_s {
+    ULONG     cThrds;  /* number of threads in use */
+    ULONG     Reserved1;
+    ULONG     Reserved2;
+}qsGrec_t;
+
+#define PADSHORT        USHORT        pad_sh
+#define PADCHAR         UCHAR         pad_ch
+
+/* Thread Record structure *   Holds all per thread information. */
+typedef struct qsTrec_s {
+    ULONG     RecType;    /* Record Type */
+                          /* Thread rectype = 100 */
+    USHORT    tid;        /* thread ID */
+    USHORT    slot;       /* "unique" thread slot number */
+    ULONG     sleepid;    /* sleep id thread is sleeping on */
+    ULONG     priority;   /* thread priority */
+    ULONG     systime;    /* thread system time */
+    ULONG     usertime;   /* thread user time */
+    UCHAR     state;      /* thread state */
+    PADCHAR;
+   PADSHORT;
+} qsTrec_t;
+
+/* Process and Thread Data Section */
+typedef struct qsPrec_s {
+    ULONG           RecType;    /* type of record being processed */
+                          /* process rectype = 1       */
+    qsTrec_t *      pThrdRec;  /* ptr to 1st thread rec for this prc*/
+    USHORT          pid;       /* process ID */
+    USHORT          ppid;      /* parent process ID */
+    ULONG           type;      /* process type */
+    ULONG           stat;      /* process status */
+    ULONG           sgid;      /* process screen group */
+    USHORT          hMte;      /* program module handle for process */
+    USHORT          cTCB;      /* # of TCBs in use in process */
+    ULONG           Reserved1;
+    void   *        Reserved2;
+    USHORT          c16Sem;     /*# of 16 bit system sems in use by proc*/
+    USHORT          cLib;       /* number of runtime linked libraries */
+    USHORT          cShrMem;    /* number of shared memory handles */
+    USHORT          Reserved3;
+    USHORT *        p16SemRec;   /*ptr to head of 16 bit sem inf for proc*/
+    USHORT *        pLibRec;     /*ptr to list of runtime lib in use by */
+                                  /*process*/
+    USHORT *        pShrMemRec;  /*ptr to list of shared mem handles in */
+                                  /*use by process*/
+    USHORT *        Reserved4;
+} qsPrec_t;
+
+/* 16 Bit System Semaphore Section */
+typedef struct qsS16Headrec_s {
+    ULONG     RecType;   /* semaphore rectype = 3 */
+    ULONG     Reserved1;  /* overlays NextRec of 1st qsS16rec_t */
+    ULONG     Reserved2;
+    ULONG     S16TblOff;  /* index of first semaphore,SEE PSTAT OUTPUT*/
+                          /* System Semaphore Information Section     */
+} qsS16Headrec_t;
+/*  16 bit System Semaphore Header Record Structure */
+typedef struct qsS16rec_s {
+    ULONG      NextRec;          /* offset to next record in buffer */
+    UINT       s_SysSemOwner ;   /* thread owning this semaphore    */
+    UCHAR      s_SysSemFlag ;    /* system semaphore flag bit field */
+    UCHAR      s_SysSemRefCnt ;  /* number of references to this    */
+                                 /*  system semaphore               */
+    UCHAR      s_SysSemProcCnt ; /*number of requests by sem owner  */
+    UCHAR      Reserved1;
+    ULONG      Reserved2;
+    UINT       Reserved3;
+    CHAR       SemName[1];       /* start of semaphore name string */
+} qsS16rec_t;
+
+/*  Executable Module Section */
+typedef struct qsLrec_s {
+    void        * pNextRec;    /* pointer to next record in buffer */
+    USHORT        hmte;         /* handle for this mte */
+    USHORT        Reserved1;    /* Reserved */
+    ULONG         ctImpMod;     /* # of imported modules in table */
+    ULONG         Reserved2;    /* Reserved */
+/*  qsLObjrec_t * Reserved3;       Reserved */
+    ULONG       * Reserved3;    /* Reserved */
+    UCHAR       * pName;        /* ptr to name string following stru*/
+} qsLrec_t;
+
+/*  Shared Memory Segment Section */
+typedef struct qsMrec_s {
+    struct qsMrec_s *MemNextRec;    /* offset to next record in buffer */
+    USHORT    hmem;          /* handle for shared memory */
+    USHORT    sel;           /* shared memory selector */
+    USHORT    refcnt;        /* reference count */
+    CHAR      Memname[1];    /* start of shared memory name string */
+} qsMrec_t;
+
+/*  Pointer Record Section */
+typedef struct qsPtrRec_s {
+    qsGrec_t       *  pGlobalRec;        /* ptr to the global data section */
+    qsPrec_t       *  pProcRec;          /* ptr to process record section  */
+    qsS16Headrec_t *  p16SemRec;         /* ptr to 16 bit sem section      */
+    void           *  Reserved;          /* a reserved area                */
+    qsMrec_t       *  pShrMemRec;        /* ptr to shared mem section      */
+    qsLrec_t       *  pLibRec;           /*ptr to exe module record section*/
+} qsPtrRec_t;
+
+/*-------------------------*/
+ULONG * pBuf,*pTemp;
+USHORT  Selector;
+qsPtrRec_t * pRec;
+qsLrec_t   * pLib;
+qsMrec_t   * pShrMemRec;        /* ptr to shared mem section      */
+qsPrec_t   * pProc;
+qsTrec_t   * pThread;
+ULONG      ListedThreads=0;
+APIRET16 APIENTRY16 DOS16ALLOCSEG(
+        USHORT          cbSize,          /* number of bytes requested                   */
+        USHORT  * _Seg16 pSel,           /* sector allocated (returned)                 */
+        USHORT fsAlloc);                 /* sharing attributes of the allocated segment */
+
+typedef struct
+  {
+    short int      ilen;     /* Instruction length */
+    long           rref;     /* Value of any IP relative storage reference */
+    unsigned short sel;      /* Selector of any CS:eIP storage reference.   */
+    long           poff;     /* eIP value of any CS:eIP storage reference. */
+    char           longoper; /* YES/NO value. Is instr in 32 bit operand mode? **/
+    char           longaddr; /* YES/NO value. Is instr in 32 bit address mode? **/
+    char           buf[40];  /* String holding disassembled instruction **/
+  } * _Seg16 RETURN_FROM_DISASM;
+
+RETURN_FROM_DISASM CDECL16 DISASM( CHAR * _Seg16 Source, USHORT IPvalue,USHORT segsize );
+RETURN_FROM_DISASM AsmLine;
+
+char *SourceBuffer=0;
+static USHORT BigSeg;
+static ULONG  Version[2];
+
+BYTE *type_name[] = {
+   "8 bit signed                     ",
+   "16 bit signed                    ",
+   "32 bit signed                    ",
+   "Unknown (0x83)                   ",
+   "8 bit unsigned                   ",
+   "16 bit unsigned                  ",
+   "32 bit unsigned                  ",
+   "Unknown (0x87)                   ",
+   "32 bit real                      ",
+   "64 bit real                      ",
+   "80 bit real                      ",
+   "Unknown (0x8B)                   ",
+   "64 bit complex                   ",
+   "128 bit complex                  ",
+   "160 bit complex                  ",
+   "Unknown (0x8F)                   ",
+   "8 bit boolean                    ",
+   "16 bit boolean                   ",
+   "32 bit boolean                   ",
+   "Unknown (0x93)                   ",
+   "8 bit character                  ",
+   "16 bit characters                ",
+   "32 bit characters                ",
+   "void                             ",
+   "15 bit unsigned                  ",
+   "24 bit unsigned                  ",
+   "31 bit unsigned                  ",
+   "Unknown (0x9B)                   ",
+   "Unknown (0x9C)                   ",
+   "Unknown (0x9D)                   ",
+   "Unknown (0x9E)                   ",
+   "Unknown (0x9F)                   ",
+   "near pointer to 8 bit signed     ",
+   "near pointer to 16 bit signed    ",
+   "near pointer to 32 bit signed    ",
+   "Unknown (0xA3)                   ",
+   "near pointer to 8 bit unsigned   ",
+   "near pointer to 16 bit unsigned  ",
+   "near pointer to 32 bit unsigned  ",
+   "Unknown (0xA7)                   ",
+   "near pointer to 32 bit real      ",
+   "near pointer to 64 bit real      ",
+   "near pointer to 80 bit real      ",
+   "Unknown (0xAB)                   ",
+   "near pointer to 64 bit complex   ",
+   "near pointer to 128 bit complex  ",
+   "near pointer to 160 bit complex  ",
+   "Unknown (0xAF)                   ",
+   "near pointer to 8 bit boolean    ",
+   "near pointer to 16 bit boolean   ",
+   "near pointer to 32 bit boolean   ",
+   "Unknown (0xB3)                   ",
+   "near pointer to 8 bit character  ",
+   "near pointer to 16 bit characters",
+   "near pointer to 32 bit characters",
+   "near pointer to void             ",
+   "near pointer to 15 bit unsigned  ",
+   "near pointer to 24 bit unsigned  ",
+   "near pointer to 31 bit unsigned  ",
+   "Unknown (0xBB)                   ",
+   "Unknown (0xBC)                   ",
+   "Unknown (0xBD)                   ",
+   "Unknown (0xBE)                   ",
+   "Unknown (0xBF)                   ",
+   "far pointer to 8 bit signed      ",
+   "far pointer to 16 bit signed     ",
+   "far pointer to 32 bit signed     ",
+   "Unknown (0xC3)                   ",
+   "far pointer to 8 bit unsigned    ",
+   "far pointer to 16 bit unsigned   ",
+   "far pointer to 32 bit unsigned   ",
+   "Unknown (0xC7)                   ",
+   "far pointer to 32 bit real       ",
+   "far pointer to 64 bit real       ",
+   "far pointer to 80 bit real       ",
+   "Unknown (0xCB)                   ",
+   "far pointer to 64 bit complex    ",
+   "far pointer to 128 bit complex   ",
+   "far pointer to 160 bit complex   ",
+   "Unknown (0xCF)                   ",
+   "far pointer to 8 bit boolean     ",
+   "far pointer to 16 bit boolean    ",
+   "far pointer to 32 bit boolean    ",
+   "Unknown (0xD3)                   ",
+   "far pointer to 8 bit character   ",
+   "far pointer to 16 bit characters ",
+   "far pointer to 32 bit characters ",
+   "far pointer to void              ",
+   "far pointer to 15 bit unsigned   ",
+   "far pointer to 24 bit unsigned   ",
+   "far pointer to 31 bit unsigned   ",
+};
+
+/*--                                 --*/
+/*-------------------------------------*/
+
+typedef  _PFN16 * _Seg16 PFN16;
+/*--                                 --*/
+static BOOL InForceExit =FALSE;
+
+/*-------------------------------------*/
+ULONG APIENTRY HandleFatalException (PEXCEPTIONREPORTRECORD       pERepRec,
+                          PEXCEPTIONREGISTRATIONRECORD pERegRec,
+                          PCONTEXTRECORD               pCtxRec,
+                          PVOID                        p);
+
+// Thanks to John Currier :
+// Do not call 16 bit code in myHandler function to prevent call
+// to __EDCThunkProlog and problems is guard page exception handling
+// Also reduce the stack size to 1K for true 16 bit calls.
+// 16 bit calls thunk will now only occur on fatal exceptions
+#pragma stack16(1024)
+
+#include "except.h"
+
+ULONG _System excHandler(PEXCEPTIONREPORTRECORD pERepRec,
+                         PLOCALEXCEPTSTRUCT pRegRec2,
+                         //          PREGREC2 pRegRec2,
+                                     PCONTEXTRECORD pCtxRec,
+                                     PVOID pv)
+{
+  ULONG rc = XCPT_CONTINUE_SEARCH;
+
+  if (pERepRec->fHandlerFlags & EH_EXIT_UNWIND)
+    return (XCPT_CONTINUE_SEARCH);
+  if (pERepRec->fHandlerFlags & EH_UNWINDING)
+    return (XCPT_CONTINUE_SEARCH);
+  if (pERepRec->fHandlerFlags & EH_NESTED_CALL)
+    return (XCPT_CONTINUE_SEARCH);
+
+
+  if ((pERepRec->ExceptionNum & XCPT_SEVERITY_CODE) == XCPT_FATAL_EXCEPTION)
+    {
+      DosBeep(5000,30);
+      DosBeep(4000,30);
+      DosBeep(3000,30);
+      DosBeep(4000,30);
+      DosBeep(5000,30);
+
+      if (pERepRec->ExceptionNum != XCPT_PROCESS_TERMINATE &&
+          pERepRec->ExceptionNum != XCPT_UNWIND &&
+          pERepRec->ExceptionNum != XCPT_SIGNAL &&
+          pERepRec->ExceptionNum != XCPT_BREAKPOINT &&
+          pERepRec->ExceptionNum != XCPT_SINGLE_STEP &&
+          pERepRec->ExceptionNum != XCPT_ASYNC_PROCESS_TERMINATE)
+        {
+          // If any of the above conditionals fail then we have to handle
+          //    the fatal trap.
+          rc = HandleFatalException(pERepRec, (PEXCEPTIONREGISTRATIONRECORD) pRegRec2, pCtxRec, pv);
+          longjmp(pRegRec2->jmpThread, pERepRec->ExceptionNum);
+          //     longjmp(pERegRec->jmpThread, pERepRec->ExceptionNum);
+        }
+    }
+  return rc;
+}
+#if 0
+ULONG APIENTRY myHandler (PEXCEPTIONREPORTRECORD       pERepRec,
+                          PEXCEPTIONREGISTRATIONRECORD pERegRec,
+                          PCONTEXTRECORD               pCtxRec,
+                          PVOID                        p)
+{
+  ULONG rc = XCPT_CONTINUE_SEARCH;
+
+  if (pERepRec->fHandlerFlags & EH_EXIT_UNWIND)
+    return (XCPT_CONTINUE_SEARCH);
+  if (pERepRec->fHandlerFlags & EH_UNWINDING)
+    return (XCPT_CONTINUE_SEARCH);
+  if (pERepRec->fHandlerFlags & EH_NESTED_CALL)
+    return (XCPT_CONTINUE_SEARCH);
+
+  if ((pERepRec->ExceptionNum & XCPT_SEVERITY_CODE) == XCPT_FATAL_EXCEPTION)
+    {
+      if (pERepRec->ExceptionNum != XCPT_PROCESS_TERMINATE &&
+          pERepRec->ExceptionNum != XCPT_UNWIND &&
+          pERepRec->ExceptionNum != XCPT_SIGNAL &&
+          pERepRec->ExceptionNum != XCPT_BREAKPOINT &&
+          pERepRec->ExceptionNum != XCPT_SINGLE_STEP &&
+          pERepRec->ExceptionNum != XCPT_ASYNC_PROCESS_TERMINATE)
+        {
+          // If any of the above conditionals fail then we have to handle
+          //    the fatal trap.
+          rc = HandleFatalException(pERepRec, pERegRec, pCtxRec, p);
+          longjmp(pERegRec->jmpThread, pERepRec->ExceptionNum);
+        }
+    }
+  return rc;
+}
+#endif
+
+static char _GetBootDriveLetter(void)
+{
+  ULONG ulSysValue;
+
+  if(!DosQuerySysInfo(QSV_BOOT_DRIVE, QSV_BOOT_DRIVE,&ulSysValue,sizeof(ulSysValue)))
+    return 'a'+ulSysValue-1;
+
+  return 'c';
+}
+
+ULONG APIENTRY HandleFatalException (PEXCEPTIONREPORTRECORD       pERepRec,
+                          PEXCEPTIONREGISTRATIONRECORD pERegRec,
+                          PCONTEXTRECORD               pCtxRec,
+                          PVOID                        p)
+{
+  PCHAR   SegPtr;
+  PUSHORT StackPtr;
+  PUSHORT ValidStackBottom;
+  PUCHAR  TestStackBottom;
+  PUCHAR  cStackPtr;
+  ULONG Size,Flags,Attr,CSSize;
+  APIRET rc;
+  APIRET semrc;
+  APIRET16 rc16;
+  PTIB   ptib;
+  PPIB   ppib;
+  USHORT Count;
+  ULONG  Nest;
+  CHAR  TrapFile[20];
+  CHAR  *LogPath;
+  struct debug_buffer DbgBuf;
+  static CHAR Name[CCHMAXPATH];
+
+  /* Do not recurse into Trapper (John Currier) */
+  /* Not necessary anymore because nested calls are catched now CW */
+  static BOOL fAlreadyTrapped = FALSE;
+
+  if (InForceExit) {
+      return (XCPT_CONTINUE_SEARCH);
+  } /* endif */
+  if ((pERepRec->ExceptionNum&XCPT_SEVERITY_CODE)==XCPT_FATAL_EXCEPTION)
+  {
+    if ((pERepRec->ExceptionNum!=XCPT_PROCESS_TERMINATE)&&
+        (pERepRec->ExceptionNum!=XCPT_UNWIND)&&
+        (pERepRec->ExceptionNum!=XCPT_SIGNAL)&&
+        (pERepRec->ExceptionNum!=XCPT_ASYNC_PROCESS_TERMINATE)) {
+        DosEnterMustComplete(&Nest);
+
+        LogPath = getenv( "LOGFILES" );
+        if (!LogPath)
+            sprintf(TrapFile,"%c:\\%s",_GetBootDriveLetter(), EXCEPTION_LOGFILE_NAME);
+        else
+            sprintf(TrapFile,"%s\\%s",LogPath, EXCEPTION_LOGFILE_NAME);
+
+        hTrap=fopen(TrapFile,"a");
+        if (hTrap==NULL)
+           hTrap=stdout;
+
+        // rc=DosError(FERR_DISABLEEXCEPTION | FERR_DISABLEHARDERR );
+
+        setbuf( hTrap, NULL);/* Unbuffered stream */
+        //     fprintf(hTrap,"A trap occurred in Audio/Data-CD-Creator\n");
+        fprintf(hTrap,"----------------------------------------\n\n");
+        fprintf(hTrap,"Exception %8.8lX Occurred",pERepRec->ExceptionNum);
+        fprintf(hTrap," at %s ",_strtime(Buffer));
+        fprintf(hTrap," %s\n\n",_strdate(Buffer));
+        if ( pERepRec->ExceptionNum     ==         XCPT_ACCESS_VIOLATION)
+          {
+            switch (pERepRec->ExceptionInfo[0]) {
+            case XCPT_READ_ACCESS:
+              fprintf(hTrap,"Invalid read address %8.8lX\n",pERepRec->ExceptionInfo[1]);
+              break;
+            case XCPT_WRITE_ACCESS:
+              fprintf(hTrap,"Invalid write address %8.8lX\n",pERepRec->ExceptionInfo[1]);
+              break;
+            case XCPT_SPACE_ACCESS:
+              /* Thanks to John Currier              */
+              /* It looks like this is off by one... */
+              fprintf(hTrap,"Invalid Selector: %8.8p",
+                      pERepRec->ExceptionInfo[1] ?
+                      pERepRec->ExceptionInfo[1] + 1 : 0);
+              break;
+            case XCPT_LIMIT_ACCESS:
+              fprintf(hTrap,"Limit access fault\n");
+              break;
+            case XCPT_UNKNOWN_ACCESS:
+              fprintf(hTrap,"Unknown access fault\n");
+              break;
+              break;
+            default:
+              fprintf(hTrap,"Other Unknown access fault\n");
+            } /* endswitch */
+          } /* endif XCPT_ACCESS_VIOLATION */
+        else if( pERepRec->ExceptionNum     ==         XCPT_INTEGER_DIVIDE_BY_ZERO)
+          {
+            fprintf(hTrap,"Division by zero.\n");
+          }
+        else if( pERepRec->ExceptionNum     ==         XCPT_ILLEGAL_INSTRUCTION)
+          {
+            fprintf(hTrap,"Illegal instruction.\n");
+          }
+        else if( pERepRec->ExceptionNum     ==         XCPT_PRIVILEGED_INSTRUCTION)
+          {
+            fprintf(hTrap,"Privileged instruction.\n");
+          }
+        else if( pERepRec->ExceptionNum     ==         XCPT_INTEGER_OVERFLOW)
+          {
+              fprintf(hTrap,"Integer overflow.\n");
+          }
+
+        /* John Currier's recursion prevention */
+        fprintf(hTrap,"\n\n");
+#if 0   /* Not necessary anymore because nested calls are catched now CW */
+        if (fAlreadyTrapped)
+          {
+            fprintf(hTrap, "Exception Handler Trapped...aborting evaluation!\n");
+            if (hTrap != stderr)
+              fclose(hTrap);
+            DosExitMustComplete(&Nest);
+
+            /*   DosUnsetExceptionHandler(pERegRec); */
+            return (XCPT_CONTINUE_SEARCH);
+          }
+#endif
+
+        fAlreadyTrapped = TRUE;
+        /* end  John Currier's recursion prevention */
+        rc = DosQuerySysInfo(QSV_VERSION_MAJOR,QSV_VERSION_MINOR,
+                             Version,sizeof(Version));
+        if ((rc==0)&&
+            (Version[0]>=20) &&
+            (Version[1]>=10) ) {
+          /* version must be over 2.1 for DOSQUERYMODFROMEIP */
+          fprintf(hTrap,"OS/2 Version %d.%d\n",Version[0]/10,Version[1]);
+          rc=DOSQUERYMODFROMEIP( &hMod, &ObjNum, CCHMAXPATH,
+                                 Name, &Offset, pERepRec->ExceptionAddress);
+            if (rc==0) {
+              fprintf(hTrap,"Failing code module internal name : %s\n",Name);
+              rc=DosQueryModuleName(hMod,CCHMAXPATH, Name);
+              fprintf(hTrap,"Failing code module file name : %s\n",Name);
+              fprintf(hTrap,"Failing code Object # %d at Offset %x \n",ObjNum+1,Offset);
+              if (strlen(Name)>3) {
+                 fprintf(hTrap,"      File     Line#  Public Symbol\n");
+                 fprintf(hTrap,"  ÄÄÄÄÄÄÄÄÄÄÄÄ ÄÄÄÄ-  ÄÄÄÄÄÄÄÄÄÄÄÄ-\n");
+                 rc =GetLineNum(Name,ObjNum,Offset);
+
+                 if (rc == 0)
+                    print_vars(pCtxRec->ctx_RegEbp);
+
+                 /* if no codeview try with symbol files */
+                 if (rc!=0) {
+                    strcpy(Name+strlen(Name)-3,"SYM"); /* Get Sym File name */
+                    GetSymbol(Name,ObjNum,Offset);
+                 } /* endif */
+              } /* endif */
+              fprintf(hTrap,"\n");
+            } else {
+               fprintf(hTrap,"Invalid execution address\n");
+            } /* endif */
+        } /* endif */
+        if ( (pCtxRec->ContextFlags) & CONTEXT_CONTROL  ) {
+             void * _Seg16 Ptr16;
+             BigSeg=((pCtxRec->ctx_RegEip)>0x00010000);
+             if (BigSeg) {
+                 /* Avoid traps in 16:16 Disasm DLL */
+                 if (DosAllocMem((PPVOID)&SourceBuffer,0x100,fALLOC)==0) {
+                    Size=0x100;
+                    rc=DosQueryMem((PVOID)pCtxRec->ctx_RegEip,&Size,&Attr);
+                    if (Attr&(PAG_READ|PAG_EXECUTE)) {
+                       memcpy(SourceBuffer,(PVOID)pCtxRec->ctx_RegEip,Size);
+#if 0 /*CW*/
+                       AsmLine= DISASM( SourceBuffer,
+                                  (USHORT)pCtxRec->ctx_RegEip, BigSeg );
+                       fprintf(hTrap,"\n Failing instruction at CS:EIP : %4.4X:%8.8X is  %s\n\n",
+                         pCtxRec->ctx_SegCs,
+                         pCtxRec->ctx_RegEip,AsmLine->buf);
+#endif
+                    } /* endif */
+                 }
+             } else {
+                 if (CSSize>pCtxRec->ctx_RegEip) {
+#if 0 /*CW*/
+                    AsmLine= DISASM(MAKE16P(pCtxRec->ctx_SegCs,
+                                            pCtxRec->ctx_RegEip),
+                                    (USHORT)pCtxRec->ctx_RegEip, BigSeg );
+                    fprintf(hTrap,"\n Failing instruction at CS:IP : %4.4X:%4.4X is   %s\n\n",
+                           pCtxRec->ctx_SegCs,
+                           pCtxRec->ctx_RegEip,AsmLine->buf);
+#endif
+                 } else {
+                     fprintf(hTrap,"Invalid execution address\n");
+                 } /* endif */
+             } /* endif */
+
+             rc=DosGetInfoBlocks(&ptib,&ppib);
+             if (rc==NO_ERROR) {
+                static CHAR Format[10];
+
+                fprintf(hTrap,"\nThread slot %lu , Id %lu , priority %p\n",
+                        ptib->tib_ordinal,
+                        ptib->tib_ptib2->tib2_ultid ,
+                        ptib->tib_ptib2->tib2_ulpri );
+                Ptr16=ptib->tib_pstack;
+                sprintf(Format,"%8.8lX",Ptr16);
+                fprintf(hTrap,"Stack Bottom : %8.8lX (%4.4s:%4.4s) ;", ptib->tib_pstack ,Format,Format+4);
+                Ptr16=ptib->tib_pstacklimit;
+                sprintf(Format,"%8.8lX",Ptr16);
+                fprintf(hTrap,"Stack Top    : %8.8lX (%4.4s:%4.4s) \n",ptib->tib_pstacklimit,Format,Format+4);
+                fprintf(hTrap,"Process Id : %lu ", ppib->pib_ulpid);
+                rc=DosQueryModuleName(ppib->pib_hmte,CCHMAXPATH, Name);
+                if (rc==NO_ERROR) {
+                   fprintf(hTrap,".EXE name : %s\n",Name);
+                } else {
+                   fprintf(hTrap,".EXE name : ??????\n");
+                } /* endif */
+               /* Better New WalkStack From John Currier */
+               WalkStack((PUSHORT)ptib->tib_pstack,
+                         (PUSHORT)ptib->tib_pstacklimit,
+                         (PUSHORT)pCtxRec->ctx_RegEbp,
+                         (PUSHORT)pERepRec->ExceptionAddress);
+                ListModules();
+                Count=0;
+             } /* endif */
+        } /* endif */
+
+        if (hTrap!=stdout) {
+           fclose(hTrap);
+        }
+        DosExitMustComplete(&Nest);
+
+        /*        rc=DosUnsetExceptionHandler(pERegRec); CW */
+     } /* endif */
+  } else {
+     /* printf("Other non fatal exception %8.8lx ",pERepRec->ExceptionNum); */
+     /* printf("At address                %8.8lx\n",pERepRec->ExceptionAddress); */
+  } /* endif */
+  return (XCPT_CONTINUE_SEARCH);
+}
+
+#if 0 /*CW */
+APIRET16 APIENTRY16 SETEXCEPT(PEXCEPTIONREGISTRATIONRECORD _Seg16 pxcpthand)
+ {
+   APIRET rc;
+
+   rc=DosError(FERR_DISABLEEXCEPTION | FERR_DISABLEHARDERR );
+   printf("Set error rc %ld\n",rc);
+   pxcpthand->prev_structure=0;
+   pxcpthand->ExceptionHandler=&myHandler;
+   rc=DosSetExceptionHandler(pxcpthand);
+   printf("Set except rc %ld\n",rc);
+   return rc;/* CW */
+}
+APIRET16 APIENTRY16 UNSETEXCEPT(PEXCEPTIONREGISTRATIONRECORD _Seg16 pxcpthand)
+ {
+   APIRET rc;
+   rc=DosUnsetExceptionHandler(pxcpthand);
+   printf("Unset except rc %ld\n",rc);
+   return rc;/* CW */
+}
+#endif
+
+VOID ListModules() {
+  APIRET   rc;
+  APIRET16 rc16;
+#ifdef USE_DOSDEBUG
+  /**----------------------------------***/
+#else
+#if MORE_INFO_WANTED
+  PVOID BaseAddress;
+  ULONG RegionSize;
+  ULONG AllocationFlags;
+  HMODULE LastModule;
+  static CHAR Name[CCHMAXPATH];
+  ULONG Size;
+  LastModule=0;
+  BaseAddress=(PVOID)0x10000;
+  RegionSize =0x3FFFFFFF;
+  fprintf(hTrap,"ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿\n");
+  fprintf(hTrap,"³ List of currently accessed modules (DLLs) object addresses              ³");
+  rc=DosQueryMem(BaseAddress,&RegionSize,&AllocationFlags);
+  while (rc==NO_ERROR) {
+     if ((AllocationFlags&PAG_EXECUTE)&&
+         (AllocationFlags&PAG_BASE)) {
+        rc=DOSQUERYMODFROMEIP( &hMod, &ObjNum, CCHMAXPATH,
+                              Name, &Offset, BaseAddress);
+        if (rc==0) {
+            if (hMod!=LastModule) {
+               rc=DosQueryModuleName(hMod,CCHMAXPATH, Name);
+               fprintf(hTrap,"\nÃÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄŽ\n");
+               fprintf(hTrap,"³ Module %-48.48s Handle %8.8d ³\n",Name,hMod);
+               fprintf(hTrap,"³ Object Number    Address    Length     Flags      Type                  ³");
+               LastModule=hMod;
+            } /* endif */
+            fprintf(hTrap,"\n³       % 6.6d    %8.8lX   %8.8lX   %8.8lX ",ObjNum,
+                      BaseAddress, RegionSize, AllocationFlags);
+            rc16 =DOS16SIZESEG( SELECTOROF(BaseAddress), &Size);
+            if (rc16==0) {
+               fprintf(hTrap," - 16:16  Selector %4.4hX ³",SELECTOROF((PVOID)BaseAddress));
+            } else {
+               fprintf(hTrap," - 32 Bits              ³");
+            } /* endif */
+        }
+     }
+     if (AllocationFlags&PAG_FREE) RegionSize =0x10000;
+     RegionSize +=0x0FFF;
+     RegionSize &=0xFFFFF000;
+     BaseAddress=(PVOID)(((PCHAR)BaseAddress)+RegionSize);
+     RegionSize=((PCHAR)0x3FFFFFFF)-(PCHAR)BaseAddress;
+     rc=DosQueryMem(BaseAddress,&RegionSize,&AllocationFlags);
+     while ((rc==ERROR_INVALID_ADDRESS)||
+            (rc==ERROR_NO_OBJECT)) {
+         BaseAddress=(PVOID)(((PCHAR)BaseAddress)+0x10000);
+         if (BaseAddress>(PVOID)0x3FFFFFFF) {
+            break;
+         } /* endif */
+         RegionSize=((PCHAR)0x3FFFFFFF)-(PCHAR)BaseAddress;
+         rc=DosQueryMem(BaseAddress,&RegionSize,&AllocationFlags);
+     } /* endwhile */
+     if (BaseAddress>(PVOID)0x3FFFFFFF) {
+        break;
+     } /* endif */
+  } /* endwhile */
+  fprintf(hTrap,"\nÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ\n");
+#endif
+#endif
+}
+
+
+void    CheckMem(PVOID Ptr,PSZ MemoryName) {
+   APIRET rc;
+   ULONG Size,Flags,Attr;
+   Size=1;
+   rc=DosQueryMem(Ptr,&Size,&Attr);
+   if (rc!=NO_ERROR) {
+      fprintf(hTrap,   "³ %3.3s does not point to valid memory ³\n",MemoryName);
+   } else {
+      if (Attr&PAG_FREE) {
+         fprintf(hTrap,   "³ %3.3s points to unallocated memory   ³\n",MemoryName);
+      } else {
+         if ((Attr&PAG_COMMIT)==0x0U) {
+            fprintf(hTrap,"³ %3.3s points to uncommited  memory   ³\n",MemoryName);
+         } /* endif */
+         if ((Attr&PAG_WRITE)==0x0U) {
+            fprintf(hTrap,"³ %3.3s points to unwritable  memory   ³\n",MemoryName);
+         } /* endif */
+         if ((Attr&PAG_READ)==0x0U) {
+            fprintf(hTrap,"³ %3.3s points to unreadable  memory   ³\n",MemoryName);
+         } /* endif */
+      } /* endif */
+   } /* endif */
+}
+
+PUSHORT Convert(USHORT * _Seg16 p16) {
+   return p16;
+}
+
+/* Better New WalkStack From John Currier */
+static void WalkStack(PUSHORT StackBottom, PUSHORT StackTop, PUSHORT Ebp,
+                      PUSHORT ExceptionAddress)
+{
+   PUSHORT  RetAddr;
+   PUSHORT  LastEbp;
+   APIRET   rc;
+   ULONG    Size,Attr;
+   USHORT   Cs,Ip,Bp,Sp;
+   static char Name[CCHMAXPATH];
+   HMODULE  hMod;
+   ULONG    ObjNum;
+   ULONG    Offset;
+   BOOL     fExceptionAddress = TRUE;  // Use Exception Addr 1st time thru
+
+   // Note: we can't handle stacks bigger than 64K for now...
+   Sp = (USHORT)(((ULONG)StackBottom) >> 16);
+   Bp = (USHORT)(ULONG)Ebp;
+
+   if (!f32bit)
+      Ebp = (PUSHORT)MAKEULONG(Bp, Sp);
+
+   fprintf(hTrap,"\nCall Stack:\n");
+   fprintf(hTrap,"                                        Source    Line      Nearest\n");
+   fprintf(hTrap,"   EBP      Address    Module  Obj#      File     Numbr  Public Symbol\n");
+   fprintf(hTrap," ÄÄÄÄÄÄÄÄ  ÄÄÄÄÄÄÄÄ-  ÄÄÄÄÄÄÄÄ ÄÄÄÄ  ÄÄÄÄÄÄÄÄÄÄÄÄ ÄÄÄÄ-  ÄÄÄÄÄÄÄÄÄÄÄÄ-\n");
+
+   do
+   {
+      Size = 10;
+      rc = DosQueryMem((PVOID)(Ebp+2), &Size, &Attr);
+      if (rc != NO_ERROR || !(Attr & PAG_COMMIT) ||  (Size<10) )
+      {
+         fprintf(hTrap,"Invalid EBP: %8.8p\n",Ebp);
+         break;
+      }
+
+      if (fExceptionAddress)
+         RetAddr = ExceptionAddress;
+      else
+         RetAddr = (PUSHORT)(*((PULONG)(Ebp+2)));
+
+      if (RetAddr == (PUSHORT)0x00000053)
+      {
+         // For some reason there's a "return address" of 0x53 following
+         // EBP on the stack and we have to adjust EBP by 44 bytes to get
+         // at the real return address.  This has something to do with
+         // thunking from 32bits to 16bits...
+         // Serious kludge, and it's probably dependent on versions of C(++)
+         // runtime or OS, but it works for now!
+         Ebp += 22;
+         RetAddr = (PUSHORT)(*((PULONG)(Ebp+2)));
+      }
+
+      // Get the (possibly) 16bit CS and IP
+      if (fExceptionAddress)
+      {
+         Cs = (USHORT)(((ULONG)ExceptionAddress) >> 16);
+         Ip = (USHORT)(ULONG)ExceptionAddress;
+      }
+      else
+      {
+         Cs = *(Ebp+2);
+         Ip = *(Ebp+1);
+      }
+
+      // if the return address points to the stack then it's really just
+      // a pointer to the return address (UGH!).
+      if ((USHORT)(((ULONG)RetAddr) >> 16) == Sp)
+         RetAddr = (PUSHORT)(*((PULONG)RetAddr));
+
+      if (Ip == 0 && *Ebp == 0)
+      {
+         // End of the stack so these are both shifted by 2 bytes:
+         Cs = *(Ebp+3);
+         Ip = *(Ebp+2);
+      }
+
+      // 16bit programs have on the stack:
+      //   BP:IP:CS
+      //   where CS may be thunked
+      //
+      //         in dump                 swapped
+      //    BP        IP   CS          BP   CS   IP
+      //   4677      53B5 F7D0        7746 D0F7 B553
+      //
+      // 32bit programs have:
+      //   EBP:EIP
+      // and you'd have something like this (with SP added) (not
+      // accurate values)
+      //
+      //         in dump               swapped
+      //      EBP       EIP         EBP       EIP
+      //   4677 2900 53B5 F7D0   0029 7746 D0F7 B553
+      //
+      // So the basic difference is that 32bit programs have a 32bit
+      // EBP and we can attempt to determine whether we have a 32bit
+      // EBP by checking to see if its 'selector' is the same as SP.
+      // Note that this technique limits us to checking stacks < 64K.
+      //
+      // Soooo, if IP (which maps into the same USHORT as the swapped
+      // stack page in EBP) doesn't point to the stack (i.e. it could
+      // be a 16bit IP) then see if CS is valid (as is or thunked).
+      //
+      // Note that there's the possibility of a 16bit return address
+      // that has an offset that's the same as SP so we'll think it's
+      // a 32bit return address and won't be able to successfully resolve
+      // its details.
+      if (Ip != Sp)
+      {
+         if (DOS16SIZESEG(Cs, &Size) == NO_ERROR)
+         {
+            RetAddr = (USHORT * _Seg16)MAKEULONG(Ip, Cs);
+            f32bit = FALSE;
+         }
+         else if (DOS16SIZESEG((Cs << 3) + 7, &Size) == NO_ERROR)
+         {
+            Cs = (Cs << 3) + 7;
+            RetAddr = (USHORT * _Seg16)MAKEULONG(Ip, Cs);
+            f32bit = FALSE;
+         }
+         else
+            f32bit = TRUE;
+      }
+      else
+         f32bit = TRUE;
+
+
+      if (fExceptionAddress)
+         fprintf(hTrap," Trap  ->");
+      else
+         fprintf(hTrap," %8.8p", Ebp);
+
+      if (f32bit)
+         fprintf(hTrap,"  :%8.8p", RetAddr);
+      else
+         fprintf(hTrap,"  %04.04X:%04.04X", Cs, Ip);
+
+      if (Version[0] >= 20 && Version[1] >= 10)
+      {
+         // Make a 'tick' sound to let the user know we're still alive
+         DosBeep(2000, 1);
+
+         Size = 10; /* Inserted by Kim Rasmussen 26/06 1996 to avoid error 87 when Size is 0 */
+
+         rc = DosQueryMem((PVOID)RetAddr, &Size, &Attr);
+         if (rc != NO_ERROR || !(Attr & PAG_COMMIT))
+         {
+            fprintf(hTrap,"Invalid RetAddr: %8.8p\n",RetAddr);
+            break; /* avoid infinite loops */
+         } else {
+            rc = DOSQUERYMODFROMEIP(&hMod, &ObjNum, sizeof(Name),
+                                    Name, &Offset, (PVOID)RetAddr);
+            if (rc == NO_ERROR && ObjNum != -1)
+            {
+               static char szJunk[_MAX_FNAME];
+               static char szName[_MAX_FNAME];
+               DosQueryModuleName(hMod, sizeof(Name), Name);
+               _splitpath(Name, szJunk, szJunk, szName, szJunk);
+               fprintf(hTrap,"  %-8s %04X", szName, ObjNum+1);
+
+               if (strlen(Name) > 3)
+               {
+                  rc = GetLineNum(Name, ObjNum, Offset);
+                  /* if no codeview try with symbol files */
+                  if (rc != NO_ERROR)
+                  {
+                     strcpy(Name+strlen(Name)-3,"SYM");
+                     GetSymbol(Name,ObjNum,Offset);
+                  }
+               }
+            }
+            else
+            {
+               fprintf(hTrap,"  *Unknown*");
+            }
+         }
+      }
+
+      fprintf(hTrap,"\n");
+
+      Bp = *Ebp;
+      if (Bp == 0 && (*Ebp+1) == 0)
+      {
+         fprintf(hTrap,"End of Call Stack\n");
+         break;
+      }
+
+      if (!fExceptionAddress)
+      {
+         LastEbp = Ebp;
+#if 0
+         Ebp = (PUSHORT)MAKEULONG(Bp, Sp);
+#else  /* Inserted by Kim Rasmussen 26/06 1996 to allow big stacks */
+         if (f32bit)
+            Ebp = (PUSHORT)*(PULONG)LastEbp;
+         else
+            Ebp = (PUSHORT)MAKEULONG(Bp, Sp);
+#endif
+         if (f32bit) {
+             print_vars((ULONG)Ebp);
+         } /* endif */
+
+         if (Ebp < LastEbp)
+         {
+            fprintf(hTrap,"Lost Stack chain - new EBP below previous\n");
+            break;
+         }
+      }
+      else
+         fExceptionAddress = FALSE;
+
+      Size = 4;
+      rc = DosQueryMem((PVOID)Ebp, &Size, &Attr);
+      if ((rc != NO_ERROR)||(Size<4))
+      {
+         fprintf(hTrap,"Lost Stack chain - invalid EBP: %8.8p\n", Ebp);
+         break;
+      }
+   } while (TRUE);
+
+   fprintf(hTrap,"\n");
+}
+
+void GetSymbol(CHAR * SymFileName, ULONG Object,ULONG TrapOffset)
+{
+   static FILE * SymFile;
+   static MAPDEF MapDef;
+   static SEGDEF   SegDef;
+   static SEGDEF *pSegDef;
+   static SYMDEF32 SymDef32;
+   static SYMDEF16 SymDef16;
+   static char    Buffer[256];
+   static int     SegNum,SymNum,LastVal;
+   static unsigned long int SegOffset,SymOffset,SymPtrOffset;
+   SymFile=fopen(SymFileName,"rb");
+   if (SymFile==0) {
+       /*fprintf(hTrap,"Could not open symbol file %s\n",SymFileName);*/
+       return;
+   } /* endif */
+   fread(&MapDef,sizeof(MAPDEF),1,SymFile);
+   SegOffset= SEGDEFOFFSET(MapDef);
+   for (SegNum=0;SegNum<MapDef.cSegs;SegNum++) {
+        /* printf("Scanning segment #%d Offset %4.4hX\n",SegNum+1,SegOffset); */
+        if (fseek(SymFile,SegOffset,SEEK_SET)) {
+           fprintf(hTrap,"Seek error ");
+           return;
+        }
+        fread(&SegDef,sizeof(SEGDEF),1,SymFile);
+        if (SegNum==Object) {
+           Buffer[0]=0x00;
+           LastVal=0;
+           for (SymNum=0;SymNum<SegDef.cSymbols;SymNum++) {
+              SymPtrOffset=SYMDEFOFFSET(SegOffset,SegDef,SymNum);
+              fseek(SymFile,SymPtrOffset,SEEK_SET);
+              fread(&SymOffset,sizeof(unsigned short int),1,SymFile);
+              fseek(SymFile,SymOffset+SegOffset,SEEK_SET);
+              if (SegDef.bFlags&0x01) {
+                 fread(&SymDef32,sizeof(SYMDEF32),1,SymFile);
+                 if (SymDef32.wSymVal>TrapOffset) {
+                    fprintf(hTrap,"between %s + %X ",Buffer,TrapOffset-LastVal);
+                 }
+                 LastVal=SymDef32.wSymVal;
+                 Buffer[0]= SymDef32.achSymName[0];
+                 fread(&Buffer[1],1,SymDef32.cbSymName,SymFile);
+                 Buffer[SymDef32.cbSymName]=0x00;
+                 if (SymDef32.wSymVal>TrapOffset) {
+                    fprintf(hTrap,"and %s - %X\n",Buffer,LastVal-TrapOffset);
+                    break;
+                 }
+                 /*printf("32 Bit Symbol <%s> Address %p\n",Buffer,SymDef32.wSymVal);*/
+              } else {
+                 fread(&SymDef16,sizeof(SYMDEF16),1,SymFile);
+                 if (SymDef16.wSymVal>TrapOffset) {
+                    fprintf(hTrap,"between %s + %X ",Buffer,TrapOffset-LastVal);
+                 }
+                 LastVal=SymDef16.wSymVal;
+                 Buffer[0]=SymDef16.achSymName[0];
+                 fread(&Buffer[1],1,SymDef16.cbSymName,SymFile);
+                 Buffer[SymDef16.cbSymName]=0x00;
+                 if (SymDef16.wSymVal>TrapOffset) {
+                    fprintf(hTrap,"and %s - %X\n",Buffer,LastVal-TrapOffset);
+                    break;
+                 }
+                 /*printf("16 Bit Symbol <%s> Address %p\n",Buffer,SymDef16.wSymVal);*/
+              } /* endif */
+           }
+           break;
+        } /* endif */
+        SegOffset=NEXTSEGDEFOFFSET(SegDef);
+   } /* endwhile */
+   fclose(SymFile);
+}
+
+#include <newexe.h>
+#define  FOR_EXEHDR  1  /* avoid define conflicts between newexe.h and exe386.h */
+#ifndef DWORD
+#define DWORD long int
+#endif
+#ifndef WORD
+#define WORD  short int
+#endif
+#include <exe386.h>
+#include <fcntl.h>
+#include <sys\stat.h>
+#include <share.h>
+#include <io.h>
+/* ------------------------------------------------------------------ */
+/* Last 8 bytes of 16:16 file when CODEVIEW debugging info is present */
+#pragma pack(1)
+ struct  _eodbug
+        {
+        unsigned short dbug;          /* 'NB' signature */
+        unsigned short ver;           /* version        */
+        unsigned long dfaBase;        /* size of codeview info */
+        } eodbug;
+
+#define         DBUGSIG         0x424E
+#define         SSTMODULES      0x0101
+#define         SSTPUBLICS      0x0102
+#define         SSTTYPES        0x0103
+#define         SSTSYMBOLS      0x0104
+#define         SSTSRCLINES     0x0105
+#define         SSTLIBRARIES    0x0106
+#define         SSTSRCLINES2    0x0109
+#define         SSTSRCLINES32   0x010B
+
+ struct  _base
+        {
+        unsigned short dbug;          /* 'NB' signature */
+        unsigned short ver;           /* version        */
+        unsigned long lfoDir;   /* file offset to dir entries */
+        } base;
+
+ struct  ssDir
+        {
+        unsigned short sst;           /* SubSection Type */
+        unsigned short modindex;      /* Module index number */
+        unsigned long lfoStart;       /* Start of section */
+        unsigned short cb;            /* Size of section */
+        } ;
+
+ struct  ssDir32
+        {
+        unsigned short sst;           /* SubSection Type */
+        unsigned short modindex;      /* Module index number */
+        unsigned long lfoStart;       /* Start of section */
+        unsigned long  cb;            /* Size of section */
+        } ;
+
+ struct  ssModule
+   {
+   unsigned short          csBase;             /* code segment base */
+   unsigned short          csOff;              /* code segment offset */
+   unsigned short          csLen;              /* code segment length */
+   unsigned short          ovrNum;             /* overlay number */
+   unsigned short          indxSS;             /* Index into sstLib or 0 */
+   unsigned short          reserved;
+   char              csize;              /* size of prefix string */
+   } ssmod;
+
+ struct  ssModule32
+   {
+   unsigned short          csBase;             /* code segment base */
+   unsigned long           csOff;              /* code segment offset */
+   unsigned long           csLen;              /* code segment length */
+   unsigned long           ovrNum;             /* overlay number */
+   unsigned short          indxSS;             /* Index into sstLib or 0 */
+   unsigned long           reserved;
+   char                    csize;              /* size of prefix string */
+   } ssmod32;
+
+ struct  ssPublic
+        {
+        unsigned short  offset;
+        unsigned short  segment;
+        unsigned short  type;
+        char      csize;
+        } sspub;
+
+ struct  ssPublic32
+        {
+        unsigned long   offset;
+        unsigned short  segment;
+        unsigned short  type;
+        char      csize;
+        } sspub32;
+
+typedef  struct _SSLINEENTRY32 {
+   unsigned short LineNum;
+   unsigned short FileNum;
+   unsigned long  Offset;
+} SSLINEENTRY32;
+typedef  struct _FIRSTLINEENTRY32 {
+   unsigned short LineNum;
+   unsigned char  entry_type;
+   unsigned char  reserved;
+   unsigned short numlines;
+   unsigned short segnum;
+} FIRSTLINEENTRY32;
+
+typedef  struct _SSFILENUM32 {
+    unsigned long first_displayable;  /* Not used */
+    unsigned long number_displayable; /* Not used */
+    unsigned long file_count;         /* number of source files */
+} SSFILENUM32;
+
+ struct  DbugRec {                       /* debug info struct ure used in linked * list */
+    struct  DbugRec far *pnext;          /* next node *//* 013 */
+   char far          *SourceFile;               /* source file name *013 */
+   unsigned short          TypeOfProgram;       /* dll or exe *014* */
+   unsigned short          LineNumber;          /* line number in source file */
+   unsigned short          OffSet;              /* offset into loaded module */
+   unsigned short          Selector;            /* code segment 014 */
+   unsigned short          OpCode;              /* Opcode replaced with BreakPt */
+   unsigned long     Count;                     /* count over Break Point */
+};
+
+typedef  struct  DbugRec DBUG, far * DBUGPTR;     /* 013 */
+char szNrPub[128];
+char szNrLine[128];
+char szNrFile[128];
+ struct  new_seg *pseg;
+ struct  o32_obj *pobj;        /* Flat .EXE object table entry */
+ struct  ssDir *pDirTab;
+ struct  ssDir32 *pDirTab32;
+unsigned char *pEntTab;
+unsigned long lfaBase;
+#pragma pack()
+/* ------------------------------------------------------------------ */
+
+APIRET GetLineNum(CHAR * FileName, ULONG Object,ULONG TrapOffset) {
+   APIRET rc;
+   int ModuleFile;
+   static  struct  exe_hdr old;
+   static  struct  new_exe new1;
+   static  struct  e32_exe e32;
+   strcpy(szNrPub,"   N/A ");
+   strcpy(szNrLine,"   N/A  ");
+   strcpy(szNrFile,"             ");
+   ModuleFile =sopen(FileName,O_RDONLY|O_BINARY,SH_DENYNO);
+   if (ModuleFile!=-1) {
+      /* Read old Exe header */
+      if (read( ModuleFile ,(void *)&old,64)==-1L) {
+        fprintf(hTrap,"Could Not Read old exe header %d\n",errno);
+        close(ModuleFile);
+        return 2;
+      }
+      /* Seek to new Exe header */
+      if (lseek(ModuleFile,(long)E_LFANEW(old),SEEK_SET)==-1L) {
+        fprintf(hTrap,"Could Not seek to new exe header %d\n",errno);
+        close(ModuleFile);
+        return 3;
+      }
+      if (read( ModuleFile ,(void *)&new1,64)==-1L) {
+        fprintf(hTrap,"Could Not read new exe header %d\n",errno);
+        close(ModuleFile);
+        return 4;
+      }
+      /* Check EXE signature */
+      if (NE_MAGIC(new1)==E32MAGIC) {
+         /* Flat 32 executable */
+         rc=Read32PmDebug(ModuleFile,Object+1,TrapOffset,FileName);
+         if (rc==0) {
+             fprintf(hTrap,"%s",szNrFile);
+             fprintf(hTrap,"%s",szNrLine);
+             fprintf(hTrap,"%s",szNrPub);
+         } /* endif */
+         close(ModuleFile);
+         /* rc !=0 try with DBG file */
+         if (rc!=0) {
+            strcpy(FileName+strlen(FileName)-3,"DBG"); /* Build DBG File name */
+            ModuleFile =sopen(FileName,O_RDONLY|O_BINARY,SH_DENYNO);
+            if (ModuleFile!=-1) {
+               rc=Read32PmDebug(ModuleFile,Object+1,TrapOffset,FileName);
+               if (rc==0) {
+                  fprintf(hTrap,"%s",szNrFile);
+                  fprintf(hTrap,"%s",szNrLine);
+                  fprintf(hTrap,"%s",szNrPub);
+               } /* endif */
+               close(ModuleFile);
+            }
+         } /* endif */
+         return rc;
+      } else {
+         if (NE_MAGIC(new1)==NEMAGIC) {
+            /* 16:16 executable */
+            if ((pseg = ( struct  new_seg *) calloc(NE_CSEG(new1),sizeof( struct  new_seg)))==NULL) {
+               fprintf(hTrap,"Out of memory!");
+               close(ModuleFile);
+               return -1;
+            }
+            if (lseek(ModuleFile,E_LFANEW(old)+NE_SEGTAB(new1),SEEK_SET)==-1L) {
+               fprintf(hTrap,"Error %u seeking segment table in %s\n",errno,FileName);
+               free(pseg);
+               close(ModuleFile);
+               return 9;
+            }
+
+            if (read(ModuleFile,(void *)pseg,NE_CSEG(new1)*sizeof( struct  new_seg))==-1) {
+               fprintf(hTrap,"Error %u reading segment table from %s\n",errno,FileName);
+               free(pseg);
+               close(ModuleFile);
+               return 10;
+            }
+            rc=Read16CodeView(ModuleFile,Object+1,TrapOffset,FileName);
+            if (rc==0) {
+               fprintf(hTrap,"%s",szNrFile);
+               fprintf(hTrap,"%s",szNrLine);
+               fprintf(hTrap,"%s",szNrPub);
+            } /* endif */
+            free(pseg);
+            close(ModuleFile);
+            /* rc !=0 try with DBG file */
+            if (rc!=0) {
+               strcpy(FileName+strlen(FileName)-3,"DBG"); /* Build DBG File name */
+               ModuleFile =sopen(FileName,O_RDONLY|O_BINARY,SH_DENYNO);
+               if (ModuleFile!=-1) {
+                  rc=Read16CodeView(ModuleFile,Object+1,TrapOffset,FileName);
+                  if (rc==0) {
+                     fprintf(hTrap,"%s",szNrFile);
+                     fprintf(hTrap,"%s",szNrLine);
+                     fprintf(hTrap,"%s",szNrPub);
+                  } /* endif */
+                  close(ModuleFile);
+               }
+            } /* endif */
+            return rc;
+
+         } else {
+            /* Unknown executable */
+            fprintf(hTrap,"Could Not find exe signature");
+            close(ModuleFile);
+            return 11;
+         }
+      }
+      /* Read new Exe header */
+   } else {
+      fprintf(hTrap,"Could Not open Module File %d",errno);
+      return 1;
+   } /* endif */
+   return 0;
+}
+char fname[128],ModName[80];
+char ename[128],dummy[128];
+
+int Read16CodeView(int fh,int TrapSeg,int TrapOff,CHAR * FileName) {
+    static unsigned short int offset,NrPublic,NrLine,NrEntry,numdir,namelen,numlines,line;
+    static int ModIndex;
+    static int bytesread,i,j;
+    ModIndex=0;
+    /* See if any CODEVIEW info */
+    if (lseek(fh,-8L,SEEK_END)==-1) {
+        fprintf(hTrap,"Error %u seeking CodeView table in %s\n",errno,FileName);
+        return(18);
+    }
+
+    if (read(fh,(void *)&eodbug,8)==-1) {
+       fprintf(hTrap,"Error %u reading debug info from %s\n",errno,FileName);
+       return(19);
+    }
+    if (eodbug.dbug!=DBUGSIG) {
+       /* fprintf(hTrap,"\nNo CodeView information stored.\n"); */
+       return(100);
+    }
+
+    if ((lfaBase=lseek(fh,-eodbug.dfaBase,SEEK_END))==-1L) {
+       fprintf(hTrap,"Error %u seeking base codeview data in %s\n",errno,FileName);
+       return(20);
+    }
+
+    if (read(fh,(void *)&base,8)==-1) {
+       fprintf(hTrap,"Error %u reading base codeview data in %s\n",errno,FileName);
+       return(21);
+    }
+
+    if (lseek(fh,base.lfoDir-8,SEEK_CUR)==-1) {
+       fprintf(hTrap,"Error %u seeking dir codeview data in %s\n",errno,FileName);
+       return(22);
+    }
+
+    if (read(fh,(void *)&numdir,2)==-1) {
+       fprintf(hTrap,"Error %u reading dir codeview data in %s\n",errno,FileName);
+       return(23);
+    }
+
+    /* Read dir table into buffer */
+    if (( pDirTab = ( struct  ssDir *) calloc(numdir,sizeof( struct  ssDir)))==NULL) {
+       fprintf(hTrap,"Out of memory!");
+       return(-1);
+    }
+
+    if (read(fh,(void *)pDirTab,numdir*sizeof( struct  ssDir))==-1) {
+       fprintf(hTrap,"Error %u reading codeview dir table from %s\n",errno,FileName);
+       free(pDirTab);
+       return(24);
+    }
+
+    i=0;
+    while (i<numdir) {
+       if (pDirTab[i].sst!=SSTMODULES) {
+           i++;
+           continue;
+       }
+       NrPublic=0x0;
+       NrLine=0x0;
+       /* point to subsection */
+       lseek(fh, pDirTab[i].lfoStart + lfaBase, SEEK_SET);
+       read(fh,(void *)&ssmod.csBase,sizeof(ssmod));
+       read(fh,(void *)ModName,(unsigned)ssmod.csize);
+       ModIndex=pDirTab[i].modindex;
+       ModName[ssmod.csize]='\0';
+       i++;
+       while (pDirTab[i].modindex ==ModIndex && i<numdir) {
+          /* point to subsection */
+          lseek(fh, pDirTab[i].lfoStart + lfaBase, SEEK_SET);
+          switch(pDirTab[i].sst) {
+            case SSTPUBLICS:
+               bytesread=0;
+               while (bytesread < pDirTab[i].cb) {
+                   bytesread += read(fh,(void *)&sspub.offset,sizeof(sspub));
+                   bytesread += read(fh,(void *)ename,(unsigned)sspub.csize);
+                   ename[sspub.csize]='\0';
+                   if ((sspub.segment==TrapSeg) &&
+                       (sspub.offset<=TrapOff) &&
+                       (sspub.offset>=NrPublic)) {
+                       NrPublic=sspub.offset;
+                       sprintf(szNrPub,"%s %s (%s) %04hX:%04hX\n",
+                               (sspub.type==1) ? " Abs" : " ",ename,ModName,
+                               sspub.segment, sspub.offset
+                               );
+                   }
+               }
+               break;
+
+            case SSTSRCLINES2:
+            case SSTSRCLINES:
+               if (TrapSeg!=ssmod.csBase) break;
+               namelen=0;
+               read(fh,(void *)&namelen,1);
+               read(fh,(void *)ename,namelen);
+               ename[namelen]='\0';
+               /* skip 2 zero bytes */
+               if (pDirTab[i].sst==SSTSRCLINES2) read(fh,(void *)&numlines,2);
+               read(fh,(void *)&numlines,2);
+               for (j=0;j<numlines;j++) {
+                  read(fh,(void *)&line,2);
+                  read(fh,(void *)&offset,2);
+                  if (offset<=TrapOff && offset>=NrLine) {
+                     NrLine=offset;
+                     sprintf(szNrLine,"% 6hu", line);
+                     sprintf(szNrFile,"%  13.13s ", ename);
+                     /*sprintf(szNrLine,"%04hX:%04hX  line #%hu  (%s) (%s)\n",
+                             ssmod.csBase,offset,line,ModName,ename); */
+                  }
+               }
+               break;
+          } /* end switch */
+          i++;
+       } /* end while modindex */
+    } /* End While i < numdir */
+    free(pDirTab);
+    return(0);
+}
+
+#define MAX_USERDEFS 150
+#define MAX_POINTERS 150
+
+USHORT userdef_count;
+USHORT pointer_count;
+
+struct one_userdef_rec {
+   USHORT idx;
+   USHORT type_index;
+   BYTE   name[33];
+} one_userdef[MAX_USERDEFS];
+
+struct one_pointer_rec {
+   USHORT idx;
+   USHORT type_index;
+   BYTE   type_qual;
+   BYTE   name[33];
+} one_pointer[MAX_POINTERS];
+
+int Read32PmDebug(int fh,int TrapSeg,int TrapOff,CHAR * FileName) {
+    static unsigned int CurrSymSeg, NrSymbol,offset,NrPublic,NrFile,NrLine,NrEntry,numdir,namelen,numlines,line;
+    static int ModIndex;
+    static int bytesread,i,j;
+    static int pOffset;
+    static SSLINEENTRY32 LineEntry;
+    static SSFILENUM32 FileInfo;
+    static FIRSTLINEENTRY32 FirstLine;
+    static BYTE dump_vars = FALSE;
+    static USHORT idx;
+    static BOOL read_types;
+    static LONG lSize;
+    static BOOL is_new_debug;
+
+    ModIndex=0;
+    /* See if any CODEVIEW info */
+    if (lseek(fh,-8L,SEEK_END)==-1) {
+        fprintf(hTrap,"Error %u seeking CodeView table in %s\n",errno,FileName);
+        return(18);
+    }
+
+    if (read(fh,(void *)&eodbug,8)==-1) {
+       fprintf(hTrap,"Error %u reading debug info from %s\n",errno,FileName);
+       return(19);
+    }
+    if (eodbug.dbug!=DBUGSIG) {
+       /*fprintf(hTrap,"\nNo CodeView information stored.\n");*/
+       return(100);
+    }
+
+    if ((lfaBase=lseek(fh,-eodbug.dfaBase,SEEK_END))==-1L) {
+       fprintf(hTrap,"Error %u seeking base codeview data in %s\n",errno,FileName);
+       return(20);
+    }
+
+    if (read(fh,(void *)&base,8)==-1) {
+       fprintf(hTrap,"Error %u reading base codeview data in %s\n",errno,FileName);
+       return(21);
+    }
+
+    if (lseek(fh,base.lfoDir-8+4,SEEK_CUR)==-1) {
+       fprintf(hTrap,"Error %u seeking dir codeview data in %s\n",errno,FileName);
+       return(22);
+    }
+
+    if (read(fh,(void *)&numdir,4)==-1) {
+       fprintf(hTrap,"Error %u reading dir codeview data in %s\n",errno,FileName);
+       return(23);
+    }
+
+    /* Read dir table into buffer */
+    if (( pDirTab32 = ( struct  ssDir32 *) calloc(numdir,sizeof( struct  ssDir32)))==NULL) {
+       fprintf(hTrap,"Out of memory!");
+       return(-1);
+    }
+
+    if (read(fh,(void *)pDirTab32,numdir*sizeof( struct  ssDir32))==-1) {
+       fprintf(hTrap,"Error %u reading codeview dir table from %s\n",errno,FileName);
+       free(pDirTab32);
+       return(24);
+    }
+
+    i=0;
+    while (i<numdir) {
+       if ( pDirTab32[i].sst !=SSTMODULES) {
+           i++;
+           continue;
+       }
+       NrPublic=0x0;
+       NrSymbol=0;
+       NrLine=0x0;
+       NrFile=0x0;
+       CurrSymSeg = 0;
+       /* point to subsection */
+       lseek(fh, pDirTab32[i].lfoStart + lfaBase, SEEK_SET);
+       read(fh,(void *)&ssmod32.csBase,sizeof(ssmod32));
+       read(fh,(void *)ModName,(unsigned)ssmod32.csize);
+       ModIndex=pDirTab32[i].modindex;
+       ModName[ssmod32.csize]='\0';
+       i++;
+
+       read_types = FALSE;
+
+       while (pDirTab32[i].modindex ==ModIndex && i<numdir) {
+          /* point to subsection */
+          lseek(fh, pDirTab32[i].lfoStart + lfaBase, SEEK_SET);
+          switch(pDirTab32[i].sst) {
+            case SSTPUBLICS:
+               bytesread=0;
+               while (bytesread < pDirTab32[i].cb) {
+                   bytesread += read(fh,(void *)&sspub32.offset,sizeof(sspub32));
+                   bytesread += read(fh,(void *)ename,(unsigned)sspub32.csize);
+                   ename[sspub32.csize]='\0';
+                   if ((sspub32.segment==TrapSeg) &&
+                       (sspub32.offset<=TrapOff) &&
+                       (sspub32.offset>=NrPublic)) {
+                       NrPublic = pubfunc_ofs = sspub32.offset;
+                       read_types = TRUE;
+                       sprintf(szNrPub,"%s %s (%s) %04X:%08lu\n",
+                               (sspub32.type==1) ? " Abs" : " ",ename,ModName,
+                               sspub32.segment, sspub32.offset
+                               );
+                   }
+               }
+               break;
+
+            /* Read symbols, so we can dump the variables on the stack */
+            case SSTSYMBOLS:
+               if (TrapSeg!=ssmod32.csBase) break;
+
+               bytesread=0;
+               while (bytesread < pDirTab32[i].cb) {
+                  static USHORT usLength;
+                  static BYTE b1, b2;
+                  static BYTE bType, *ptr;
+                  static ULONG ofs;
+                  static ULONG last_addr = 0;
+                  static BYTE str[256];
+                  static struct symseg_rec       symseg;
+                  static struct symauto_rec      symauto;
+                  static struct symproc_rec      symproc;
+
+                  /* Read the length of this subentry */
+                  bytesread += read(fh, &b1, 1);
+                  if (b1 & 0x80) {
+                     bytesread += read(fh, &b2, 1);
+                     usLength = ((b1 & 0x7F) << 8) + b2;
+                  }
+                  else
+                     usLength = b1;
+
+                  ofs = tell(fh);
+
+                  bytesread += read(fh, &bType, 1);
+
+                  switch(bType) {
+                     case SYM_CHANGESEG:
+                        read(fh, &symseg, sizeof(symseg));
+                        CurrSymSeg = symseg.seg_no;
+                        break;
+
+                     case SYM_PROC:
+                     case SYM_CPPPROC:
+                        read(fh, &symproc, sizeof(symproc));
+                        read(fh, str, symproc.name_len);
+                           str[symproc.name_len] = 0;
+
+                        if ((CurrSymSeg == TrapSeg) &&
+                            (symproc.offset<=TrapOff) &&
+                            (symproc.offset>=NrSymbol)) {
+
+                           dump_vars = TRUE;
+                           var_ofs = 0;
+                           NrSymbol = symproc.offset;
+                           func_ofs = symproc.offset;
+
+                           strcpy(func_name, str);
+                        }
+                        else {
+                           dump_vars = FALSE;
+                        }
+                        break;
+
+                     case SYM_AUTO:
+                        if (!dump_vars)
+                           break;
+
+                        read(fh, &symauto, sizeof(symauto));
+                        read(fh, str, symauto.name_len);
+                        str[symauto.name_len] = 0;
+
+                        strcpy(autovar_def[var_ofs].name, str);
+                        autovar_def[var_ofs].stack_offset = symauto.stack_offset;
+                        autovar_def[var_ofs].type_idx = symauto.type_idx;
+                        var_ofs++;
+                        break;
+
+                  }
+
+                  bytesread += usLength;
+
+                  lseek(fh, ofs+usLength, SEEK_SET);
+               }
+               break;
+
+            case SSTTYPES:
+//               if (ModIndex != TrapSeg)
+               if (!read_types)
+                  break;
+
+               bytesread=0;
+               idx = 0x200;
+               userdef_count = 0;
+               pointer_count = 0;
+               while (bytesread < pDirTab32[i].cb) {
+                  static struct type_rec         type;
+                  static struct type_userdefrec  udef;
+                  static struct type_pointerrec  point;
+                  static struct type_funcrec     func;
+                  static struct type_structrec   struc;
+                  static struct type_list1       list1;
+                  static struct type_list2       list2;
+                  static struct type_list2_1     list2_1;
+                  static ULONG  ofs;
+                  static BYTE   str[256], b1, b2;
+                  static USHORT n;
+
+                  /* Read the length of this subentry */
+                  ofs = tell(fh);
+
+                  read(fh, &type, sizeof(type));
+                  bytesread += sizeof(type);
+
+                  switch(type.type) {
+                     case TYPE_USERDEF:
+                        if (userdef_count > MAX_USERDEFS)
+                           break;
+
+                        read(fh, &udef, sizeof(udef));
+                        read(fh, str, udef.name_len);
+                        str[udef.name_len] = 0;
+
+                        // Insert userdef in table
+                        one_userdef[userdef_count].idx = idx;
+                        one_userdef[userdef_count].type_index = udef.type_index;
+                        memcpy(one_userdef[userdef_count].name, str, min(udef.name_len+1, 32));
+                        one_userdef[userdef_count].name[32] = 0;
+                        userdef_count++;
+                        break;
+
+                     case TYPE_POINTER:
+                        if (pointer_count > MAX_POINTERS)
+                           break;
+
+                        read(fh, &point, sizeof(point));
+                        read(fh, str, point.name_len);
+                        str[point.name_len] = 0;
+
+                        // Insert userdef in table
+                        one_pointer[pointer_count].idx = idx;
+                        one_pointer[pointer_count].type_index = point.type_index;
+                        memcpy(one_pointer[pointer_count].name, str, min(point.name_len+1, 32));
+                        one_pointer[pointer_count].name[32] = 0;
+                        one_pointer[pointer_count].type_qual = type.type_qual;
+                        pointer_count++;
+                        break;
+                  }
+
+                  ++idx;
+
+                  bytesread += type.length;
+
+                  lseek(fh, ofs+type.length+2, SEEK_SET);
+               }
+               break;
+
+            case SSTSRCLINES32:
+               if (TrapSeg!=ssmod32.csBase) break;
+
+               /* read first line */
+               do {
+                  read(fh,(void *)&FirstLine,sizeof(FirstLine));
+
+                  if (FirstLine.LineNum!=0) {
+                     fprintf(hTrap,"Missing Line table information\n");
+                     break;
+                  } /* endif */
+                  numlines= FirstLine.numlines;
+                  /* Other type of data skip 4 more bytes */
+                  if (FirstLine.entry_type < 4) {
+                     read(fh, (void *)&lSize, 4);
+                     if (FirstLine.entry_type == 3)
+                        lseek(fh,lSize,SEEK_CUR);
+                  }
+               } while(FirstLine.entry_type == 3);
+
+               for (j=0;j<numlines;j++) {
+                  switch (FirstLine.entry_type) {
+                     case 0:
+                        read(fh,(void *)&LineEntry,sizeof(LineEntry));
+                        /* Changed by Kim Rasmussen 26/06 1996 to ignore linenumber 0 */
+         /*               if (LineEntry.Offset+ssmod32.csOff<=TrapOff && LineEntry.Offset+ssmod32.csOff>=NrLine) { */
+                        if (LineEntry.LineNum && LineEntry.Offset+ssmod32.csOff<=TrapOff && LineEntry.Offset+ssmod32.csOff>=NrLine) {
+                           NrLine=LineEntry.Offset;
+                           NrFile=LineEntry.FileNum;
+                           /*pOffset =sprintf(szNrLine,"%04X:%08X  line #%hu ",
+                                   ssmod32.csBase,LineEntry.Offset,
+                                   LineEntry.LineNum);*/
+                          sprintf(szNrLine,"% 6hu", LineEntry.LineNum);
+                        }
+                        break;
+
+                     case 1:
+                        lseek(fh, sizeof(struct linlist_rec), SEEK_CUR);
+                        break;
+
+                     case 2:
+                        lseek(fh, sizeof(struct linsourcelist_rec), SEEK_CUR);
+                        break;
+
+                     case 3:
+                        lseek(fh, sizeof(struct filenam_rec), SEEK_CUR);
+                        break;
+
+                     case 4:
+                        lseek(fh, sizeof(struct pathtab_rec), SEEK_CUR);
+                        break;
+
+                  }
+               }
+               if (NrFile!=0) {
+                  read(fh,(void *)&FileInfo,sizeof(FileInfo));
+                  namelen=0;
+                  for (j=1;j<=FileInfo.file_count;j++) {
+                     namelen=0;
+                     read(fh,(void *)&namelen,1);
+                     read(fh,(void *)ename,namelen);
+                     if (j==NrFile) break;
+                  }
+                  ename[namelen]='\0';
+                  /*  pOffset=sprintf(szNrLine+pOffset," (%s) (%s)\n",ename,ModName);*/
+                  sprintf(szNrFile,"%  13.13s ",ename);
+               } else {
+                  /* strcat(szNrLine,"\n"); avoid new line for empty name fill */
+                 strcpy(szNrFile,"             ");
+               } /* endif */
+               break;
+          } /* end switch */
+
+          i++;
+       } /* end while modindex */
+    } /* End While i < numdir */
+    free(pDirTab32);
+    return(0);
+}
+
+BYTE *var_value(void *varptr, BYTE type)
+{
+   static BYTE value[128];
+   APIRET rc;
+
+   strcpy(value, "Unknown");
+
+   if (type == 0)
+      sprintf(value, "%hhd", *(signed char *)varptr);
+   else if (type == 1)
+      sprintf(value, "%hd", *(signed short *)varptr);
+   else if (type == 2)
+      sprintf(value, "%ld", *(signed long *)varptr);
+   else if (type == 4)
+      sprintf(value, "%hu", *(BYTE *)varptr);
+   else if (type == 5)
+      sprintf(value, "%hu", *(USHORT *)varptr);
+   else if (type == 6)
+      sprintf(value, "%lu", *(ULONG *)varptr);
+   else if (type == 8)
+      sprintf(value, "%f", *(float *)varptr);
+   else if (type == 9)
+      sprintf(value, "%f", *(double *)varptr);
+   else if (type == 10)
+      sprintf(value, "%Lf", *(long double *)varptr);
+   else if (type == 16)
+      sprintf(value, "%s", *(char *)varptr ? "TRUE" : "FALSE");
+   else if (type == 17)
+      sprintf(value, "%s", *(short *)varptr ? "TRUE" : "FALSE");
+   else if (type == 18)
+      sprintf(value, "%s", *(long *)varptr ? "TRUE" : "FALSE");
+   else if (type == 20)
+      sprintf(value, "%c", *(char *)varptr);
+   else if (type == 21)
+      sprintf(value, "%hd", *(short *)varptr);
+   else if (type == 22)
+      sprintf(value, "%lc", *(long *)varptr);
+   else if (type == 23)
+      sprintf(value, "void");
+   else if (type >= 32) {
+      ULONG Size,Attr;
+      Size=1;
+      rc=DosQueryMem((void*)*(ULONG *)varptr,&Size,&Attr);
+      if (rc) {
+         sprintf(value, "0x%p invalid", *(ULONG *)varptr);
+      } else {
+         sprintf(value, "0x%p", *(ULONG *)varptr);
+         if (Attr&PAG_FREE) {
+            strcat(value," unallocated memory");
+         } else {
+            if ((Attr&PAG_COMMIT)==0x0U) {
+               strcat(value," uncommited");
+            } /* endif */
+            if ((Attr&PAG_WRITE)==0x0U) {
+               strcat(value," unwritable");
+            } /* endif */
+            if ((Attr&PAG_READ)==0x0U) {
+               strcat(value," unreadable");
+            } /* endif */
+         } /* endif */
+      } /* endif */
+   }
+
+   return value;
+}
+
+/* Search the table of userdef's - return TRUE if found */
+BOOL search_userdefs(ULONG stackofs, USHORT var_no)
+{
+   USHORT pos;
+
+   for(pos = 0; pos < userdef_count && one_userdef[pos].idx != autovar_def[var_no].type_idx; pos++);
+
+   if (pos < userdef_count) {
+      if (one_userdef[pos].type_index >= 0x80 && one_userdef[pos].type_index <= 0xDA) {
+         fprintf(hTrap, "%- 6d %- 20.20s %- 33.33s %s\n",
+                 autovar_def[var_no].stack_offset,
+                 autovar_def[var_no].name,
+                 one_userdef[pos].name,
+                 var_value((void *)(stackofs+autovar_def[var_no].stack_offset),
+                           one_userdef[pos].type_index-0x80));
+         return TRUE;
+      }
+      else /* If the result isn't a simple type, let's act as we didn't find it */
+         return FALSE;
+   }
+
+   return FALSE;
+}
+
+BOOL search_pointers(ULONG stackofs, USHORT var_no)
+{
+   USHORT pos, upos;
+   static BYTE str[35];
+   BYTE   type_index;
+
+   for(pos = 0; pos < pointer_count && one_pointer[pos].idx != autovar_def[var_no].type_idx; pos++);
+
+   if (pos < pointer_count) {
+      if (one_pointer[pos].type_index >= 0x80 && one_pointer[pos].type_index <= 0xDA) {
+         strcpy(str, type_name[one_pointer[pos].type_index-0x80]);
+         strcat(str, " *");
+         fprintf(hTrap, "%- 6d %- 20.20s %- 33.33s %s\n",
+                 autovar_def[var_no].stack_offset,
+                 autovar_def[var_no].name,
+                 str,
+                 var_value((void *)(stackofs+autovar_def[var_no].stack_offset), 32));
+         return TRUE;
+      }
+      else { /* If the result isn't a simple type, look for it in the other lists */
+         for(upos = 0; upos < userdef_count && one_userdef[upos].idx != one_pointer[pos].type_index; upos++);
+
+         if (upos < userdef_count) {
+            strcpy(str, one_userdef[upos].name);
+            strcat(str, " *");
+            fprintf(hTrap, "%- 6d %- 20.20s %- 33.33s %s\n",
+                    autovar_def[var_no].stack_offset,
+                    autovar_def[var_no].name,
+                    str,
+                    var_value((void *)(stackofs+autovar_def[var_no].stack_offset), 32));
+            return TRUE;
+         }
+         else { /* If it isn't a userdef, for now give up and just print as much as we know */
+            sprintf(str, "Pointer to type 0x%X", one_pointer[pos].type_index);
+
+            fprintf(hTrap, "%- 6d %- 20.20s %- 33.33s %s\n",
+                    autovar_def[var_no].stack_offset,
+                    autovar_def[var_no].name,
+                    str,
+                    var_value((void *)(stackofs+autovar_def[var_no].stack_offset), 32));
+
+            return TRUE;
+         }
+      }
+   }
+
+   return FALSE;
+}
+
+void print_vars(ULONG stackofs)
+{
+   USHORT n, pos;
+   BOOL   AutoVarsFound=FALSE;
+
+/*   stackofs += stack_ebp; */
+   if (1 || func_ofs == pubfunc_ofs) {
+      for(n = 0; n < var_ofs; n++) {
+         if (AutoVarsFound==FALSE) {
+             AutoVarsFound=TRUE;
+             fprintf(hTrap, "List of auto variables at EBP %p in %s:\n",stackofs, func_name);
+             fprintf(hTrap,"Offset Name                 Type                              Value            \n");
+             fprintf(hTrap,"ÄÄÄÄÄÄ ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ\n");
+         }
+
+         /* If it's one of the simple types */
+         if (autovar_def[n].type_idx >= 0x80 && autovar_def[n].type_idx <= 0xDA)
+         {
+            fprintf(hTrap, "%- 6d %- 20.20s %- 33.33s %s\n",
+                    autovar_def[n].stack_offset,
+                    autovar_def[n].name,
+                    type_name[autovar_def[n].type_idx-0x80],
+                    var_value((void *)(stackofs+autovar_def[n].stack_offset),
+                              autovar_def[n].type_idx-0x80));
+         }
+         else { /* Complex type, check if we know what it is */
+            if (!search_userdefs(stackofs, n)) {
+               if (!search_pointers(stackofs, n)) {
+                  fprintf(hTrap, "%- 6d %-20.20s 0x%X\n",
+                                 autovar_def[n].stack_offset,
+                                 autovar_def[n].name,
+                                 autovar_def[n].type_idx);
+               }
+            }
+         }
+      }
+      if (AutoVarsFound==FALSE) {
+          fprintf(hTrap, "  No auto variables found in %s.\n", func_name);
+      }
+      fprintf(hTrap, "\n");
+   }
+}
+
+
+
Index: /tags/CWMM-0.3.0_GA/mediafolder/c/helper/helper.cpp
===================================================================
--- /tags/CWMM-0.3.0_GA/mediafolder/c/helper/helper.cpp	(revision 213)
+++ /tags/CWMM-0.3.0_GA/mediafolder/c/helper/helper.cpp	(revision 213)
@@ -0,0 +1,224 @@
+/*
+ * This file is (C) Chris Wohlgemuth 1999-2004
+ */
+/*
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; see the file COPYING.  If not, write to
+ * the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+
+#define INCL_WIN
+#define INCL_DOS
+#define INCL_REXXSAA
+
+#include <os2.h>
+#include <rexxsaa.h>                   /* needed for RexxStart()     */
+#include "except.h"
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <stdio.h>
+#include <string.h>
+#include <stdarg.h>
+
+#include "sys_funcs.h"
+
+#ifndef BS_NOTEBOOKBUTTON
+#define BS_NOTEBOOKBUTTON 8L   /* Warp 4 notebook style */  
+#endif
+
+extern char chrInstallDir[];
+
+
+/* Mutex semaphores to protect filename generation */
+ULONG cwCreateMutex(HMTX * hmtxBMP) {
+
+  return DosCreateMutexSem( NULL, hmtxBMP, 0, FALSE);
+}
+
+ULONG cwCloseMutex(HMTX  hmtxBMP) {
+
+  return DosCloseMutexSem( hmtxBMP );
+}
+
+ULONG cwRequestMutex(HMTX  hmtxBMP, ULONG ulTimeOut) {
+
+  return DosRequestMutexSem( hmtxBMP, ulTimeOut );
+}
+
+ULONG cwReleaseMutex(HMTX  hmtxBMP) {
+
+  return DosReleaseMutexSem( hmtxBMP );
+}
+
+/****************************************************
+ *                                                  *
+ * This function moves the default buttons off      *
+ * notebook pages on Warp 4.                        *
+ * usDelta specifies the units all controls have    *
+ * to be moved down. usID is the ID of the last     *
+ * button that has to be moved on the main frame    *
+ * of the notebook. This value is a threshold.      *
+ *                                                  *
+ ****************************************************/
+BOOL cwMoveNotebookButtonsWarp4(HWND hwndDlg, USHORT usID, USHORT usDelta)
+{
+  if (SysQueryOSRelease()>=40) {
+    HENUM henum;
+    HWND hwnd;
+    
+    /* Move the default notebook buttons */
+    if((henum=WinBeginEnumWindows(hwndDlg))!=NULLHANDLE) {
+      while((hwnd=WinGetNextWindow(henum))!=NULLHANDLE) {
+        if(WinQueryWindowUShort(hwnd,QWS_ID)<=usID)
+          WinSetWindowBits(hwnd, QWL_STYLE,
+                           BS_NOTEBOOKBUTTON, BS_NOTEBOOKBUTTON);
+        else {
+          SWP swp;
+          POINTL ptl= {0};
+          ptl.y=usDelta;
+
+          WinMapDlgPoints(hwndDlg, &ptl, 1, TRUE);
+          /* Move all other controls */
+          if(WinQueryWindowPos(hwnd, &swp))
+            WinSetWindowPos(hwnd, NULLHANDLE, swp.x, swp.y-ptl.y,0,0, SWP_MOVE);
+        }
+      }
+      WinEndEnumWindows(henum);
+    }
+  }
+  return TRUE;
+}
+
+BOOL launchRexx(PSZ rexxFile)
+{
+  char text[1024];      
+  
+  RXSTRING arg[1];                       /* argument string for REXX  */
+  RXSTRING rexxretval;                /* return value from REXX    */
+  APIRET   rc;                        /* return code from REXX     */
+  SHORT    rexxrc = 0;                /* return code from function */
+  char theScript[CCHMAXPATH];  
+  /* By setting the strlength of the output RXSTRING to zero, we   */
+  /* force the interpreter to allocate memory and return it to us. */
+  /* We could provide a buffer for the interpreter to use instead. */
+  rexxretval.strlength = 0L;          /* initialize return to empty*/
+  
+  //  MAKERXSTRING(arg[0], chrRexxEnv, strlen(chrRexxEnv));/* create input argument     */
+  //  MAKERXSTRING(arg[1], chrThis, strlen(chrThis));/* create input argument     */              
+  //  MAKERXSTRING(arg[2], chrHwnd, strlen(chrHwnd));/* create input argument     */
+  
+  sprintf(theScript, "%s\\bin\\%s", chrInstallDir, rexxFile);
+
+  TRY_LOUD(RX_START) {
+    /* Here we call the interpreter.  We don't really need to use    */
+    /* all the casts in this call; they just help illustrate         */
+    /* the data types used.                                          */
+    rc=RexxStart((LONG)       0,             /* number of arguments   */
+                 (PRXSTRING)  &arg,          /* array of arguments    */
+                 (PSZ)        theScript,/* name of REXX file     */
+                 (PRXSTRING)  0,             /* No INSTORE used       */
+                 (PSZ)        "CWRXX",         /* Command env. name     */
+                 (LONG)       RXSUBROUTINE,  /* Code for how invoked  */
+                 (PRXSYSEXIT) 0,             /* No EXITs on this call */
+                 (PSHORT)     &rexxrc,       /* Rexx program output   */
+                 (PRXSTRING)  &rexxretval ); /* Rexx program output   */
+#if 0
+    if(rc) {
+      sprintf(text,"Error in the Rexx skript %s\n\n Get more information with 'help REX%04d'.\n", 
+              tPt->rexxSkript, rc*-1);
+      WinMessageBox(HWND_DESKTOP, HWND_DESKTOP, text, "", 1234, MB_OK|MB_MOVEABLE|MB_ERROR);
+    }
+#endif
+    DosFreeMem(rexxretval.strptr);          /* Release storage given to us by REXX.  */      
+  }
+  CATCH(RX_START)
+    {}END_CATCH;
+    return TRUE;
+}
+
+#if 0
+ULONG launchRexx( PSZ pszTitle, PSZ rexxFile, PSZ parameters)
+{
+  STARTDATA startData={0};
+  APIRET rc;
+  PID pid;
+  ULONG ulSessionID=0;
+  char chrLoadError[CCHMAXPATH];
+  char startParams[CCHMAXPATH*4];
+  char tempText[CCHMAXPATH]= {0};
+  char *charPtr;
+  char trackname[CCHMAXPATH];
+    
+  memset(&startData,0,sizeof(startData));
+  startData.Length=sizeof(startData);
+  startData.Related=SSF_RELATED_INDEPENDENT;
+  startData.FgBg=SSF_FGBG_BACK;
+  startData.TraceOpt=SSF_TRACEOPT_NONE;
+  startData.PgmTitle=pszTitle;
+  
+  startData.PgmName="cmd.exe";
+  startData.InheritOpt=SSF_INHERTOPT_SHELL;
+  startData.SessionType=SSF_TYPE_WINDOWABLEVIO;
+  startData.PgmControl|=SSF_CONTROL_INVISIBLE;//|SSF_CONTROL_MAXIMIZE|SSF_CONTROL_NOAUTOCLOSE;
+  startData.InitXPos=30;
+  startData.InitYPos=30;
+  startData.InitXSize=500;
+  startData.InitYSize=400;
+  startData.ObjectBuffer=chrLoadError;
+  startData.ObjectBuffLen=(ULONG)sizeof(chrLoadError);
+
+  sprintf(startParams," /C \"%s\\bin\\%s\"", chrInstallDir, rexxFile);
+  startData.PgmInputs=startParams;
+  
+  rc=DosStartSession(&startData,&ulSessionID,&pid);   
+  return rc;   
+}
+#endif
+
+/* This function launches the wrapper <wrapperExe>         */
+/*  with the params given as a PM-session */
+/* in PSZ parameter. PSZ folderPath is the path to put the */
+/* write.log. HWND hwnd is the window waiting for the      */
+/* WM_APPTERMINATE message                                 */
+ULONG launchPMWrapper(PSZ pszTitle, PSZ wrapperExe, PSZ parameters)
+{
+  STARTDATA startData={0};
+  APIRET rc;
+  PID pid;
+  ULONG ulSessionID=0;
+  char chrLoadError[CCHMAXPATH];
+  
+  memset(&startData,0,sizeof(startData));
+  startData.Length=sizeof(startData);
+  startData.Related=SSF_RELATED_INDEPENDENT;
+  startData.FgBg=SSF_FGBG_FORE;
+  startData.TraceOpt=SSF_TRACEOPT_NONE;
+  startData.PgmTitle=pszTitle;
+    
+  startData.PgmName=wrapperExe;
+  startData.InheritOpt=SSF_INHERTOPT_SHELL;
+  startData.SessionType=SSF_TYPE_PM;
+  startData.PgmControl=0;
+  startData.InitXPos=30;
+  startData.InitYPos=30;
+  startData.InitXSize=500;
+  startData.InitYSize=400;
+  startData.ObjectBuffer=chrLoadError;
+  startData.ObjectBuffLen=(ULONG)sizeof(chrLoadError);
+
+  startData.PgmInputs=parameters;
+
+  rc=DosStartSession(&startData,&ulSessionID,&pid);   
+  return 0;   
+}
+
Index: /tags/CWMM-0.3.0_GA/mediafolder/c/helper/launchpad.cpp
===================================================================
--- /tags/CWMM-0.3.0_GA/mediafolder/c/helper/launchpad.cpp	(revision 213)
+++ /tags/CWMM-0.3.0_GA/mediafolder/c/helper/launchpad.cpp	(revision 213)
@@ -0,0 +1,1221 @@
+/*
+ * This file is (C) Chris Wohlgemuth 2001
+ */
+/*
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; see the file COPYING.  If not, write to
+ * the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+
+#define INC_WIN
+#define INCL_PM
+#define INCL_GPI
+
+#include "mediafolder.hh"
+#include "launchpad.hh"
+#include "cwcdtrack.hh"
+
+#include <os2.h>
+#include "stdio.h"
+#include "stdlib.h"
+
+#include "sys_funcs.h"
+SOMClass* somhlpGetSomClass(char* chrClassName);
+
+extern HWND hwndShadow;// The handle of the help window
+extern PFNWP  oldProc;  //place for original button-procedure
+extern HWND hwndBubbleWindow;// The handle of the help window
+#define  WM_NEWBUBBLE   WM_USER+100 //Use ATOM later
+#define xVal  12      //x-distance of Bubble
+#define yVal  8      //y-distance of Bubble
+extern char chrTBFlyFontName[CCHMAXPATH];/* Font for toolbar fly over help */
+extern RGB rgbTBFlyForeground;
+extern RGB rgbTBFlyBackground;
+extern BOOL bTBFlyOverEnabled;
+extern int iTBFlyOverDelay;
+
+
+#define xButtonDelta 2
+#define xButtonOffset 6
+
+PFNWP pfnwpOldLPProc;
+LPList* lplAllLPads=NULL;
+
+extern PFNWP  oldButtonProc2;  //place for original button-procedure
+
+MRESULT EXPENTRY newButtonProc(HWND hwnd, ULONG msg,MPARAM mp1,MPARAM mp2 );
+MRESULT EXPENTRY shadowProc(HWND hwnd, ULONG msg,MPARAM mp1,MPARAM mp2 );
+
+
+BOOL APIENTRY myDrgDeleteDraginfoStrHandles(PDRAGINFO pDragInfo)
+{
+   /* a replacement for DrgDeleteDraginfoStrHandles */
+   /* because that routine will fail if any one hstr is invalid */
+
+   ULONG i,ulItems;
+   PDRAGITEM pDragItem;
+
+   ulItems = DrgQueryDragitemCount(pDragInfo);
+   for (i=0;i<ulItems;i++)
+   {
+      pDragItem = DrgQueryDragitemPtr(pDragInfo,i);
+      DrgDeleteStrHandle(pDragItem->hstrType);
+      DrgDeleteStrHandle(pDragItem->hstrRMF);
+      DrgDeleteStrHandle(pDragItem->hstrContainerName);
+      DrgDeleteStrHandle(pDragItem->hstrSourceName);
+      DrgDeleteStrHandle(pDragItem->hstrTargetName);
+   }
+   return TRUE;
+}
+
+
+/******************************************************************************/
+/*  New button procedure which handles the context menu stuff for the objects */
+/* The fly over help is managed by the standard button replacement proc.      */
+/******************************************************************************/
+static MRESULT EXPENTRY newLaunchPadButtonProc(HWND hwnd, ULONG msg,MPARAM mp1,MPARAM mp2 )
+{
+  POINTL ptl;
+  HWND hwndMenu;
+  WPObject * wpObject;
+  LPObject* lpo;
+  PDRAGINFO pDragInfo;
+  static BOOL bDrawn=FALSE;
+  static DRAGITEM DragItem;
+  static DRAGIMAGE DragImage;
+  static DRAGINFO *DragInfo;
+
+  switch (msg)
+    {
+    case WM_PAINT:
+      lpo=(LPObject*)WinQueryWindowULong(hwnd,QWL_USER);
+      if(lpo) {
+        BTNCDATA btCtrl={0};
+        WNDPARAMS wndParams={0};
+
+        // memset(&btCtrl,0,sizeof(btCtrl));
+        btCtrl.cb=sizeof(btCtrl);
+        if(somIsObj(lpo->wpObject)) {
+          btCtrl.hImage=lpo->wpObject->wpQueryIcon();
+          // memset(&wndParams,0,sizeof(wndParams));
+          wndParams.fsStatus=WPM_CTLDATA;
+          wndParams.cbCtlData=btCtrl.cb;
+          wndParams.pCtlData=&btCtrl;
+          WinSendMsg(hwnd,WM_SETWINDOWPARAMS,
+                     MPFROMP(&wndParams),0);
+        }
+      }
+      break;
+    case WM_CONTEXTMENU:
+      if(!SHORT2FROMMP(mp2)) {
+
+        lpo=(LPObject*)WinQueryWindowULong(hwnd,QWL_USER);
+        if(lpo) {
+          wpObject=lpo->wpObject;
+          if(somIsObj(wpObject)) {
+            ptl.y=0;
+            ptl.x=0;
+            hwndMenu=wpObject->wpDisplayMenu(hwnd,hwnd,&ptl,MENU_OBJECTPOPUP,0);
+          }
+          return (MRESULT) TRUE;
+        }
+
+      }/* end of if(!SHORT2FROMMP(mp2)) */
+      break;
+    case DM_DRAGOVER:
+      {
+        BOOL bReturn=FALSE;
+
+        TRY_LOUD(LP_DRAGOVER) {
+           lpo=(LPObject*)WinQueryWindowULong(hwnd,QWL_USER);
+           if(lpo) {
+             wpObject=lpo->wpObject;
+             if(somIsObj(wpObject)) {
+               char chrClassName[10];
+               LONG lLength;
+
+               pDragInfo=(PDRAGINFO) mp1;
+               hwndMenu=pDragInfo->hwndSource;
+               lLength=sizeof(chrClassName);
+               WinQueryClassName(hwndMenu, lLength, chrClassName);
+               if(strcmp(chrClassName,"#37"))
+                 hwndMenu=NULL;/* Source isn't a container */
+               if(!bDrawn) {
+                 HPS hps;
+                 RECTL rectl;
+                 SWP swp;
+
+                 /* Draw the rect */
+                 hps=DrgGetPS(hwnd);
+                 WinQueryWindowPos(hwnd,&swp);
+                 rectl.xLeft=1;
+                 rectl.yBottom=1;
+                 rectl.xRight=swp.cx-1;
+                 rectl.yTop=swp.cy-1;
+                 //WinDrawBorder(hps,&rectl, 3, 3, 0, 0, DB_STANDARD|DB_PATINVERT);
+                 DrgReleasePS(hps);
+                 //bDrawn=TRUE;
+               }
+               bReturn=TRUE;
+             }
+           }
+        }
+        CATCH(LP_DRAGOVER)
+        {
+        } END_CATCH;
+        if(bReturn)
+         return wpObject->wpDragOver(hwndMenu,(PDRAGINFO) mp1);
+        break;
+      }
+    case DM_DRAGLEAVE:
+      {
+        RECTL rectl;
+        SWP swp;
+        HPS hps;
+
+        /* Remove target emphasis here */
+        hps=DrgGetPS(hwnd);
+        WinQueryWindowPos(hwnd,&swp);
+        rectl.xLeft=1;
+        rectl.yBottom=1;
+        rectl.xRight=swp.cx-1;
+        rectl.yTop=swp.cy-1;
+        // WinDrawBorder(hps,&rectl,3, 3, 0, 0, DB_STANDARD|DB_PATINVERT);
+        bDrawn=FALSE;
+        DrgReleasePS(hps);
+        return (MRESULT) FALSE;
+      }
+    case DM_DROP:
+      {
+        BOOL bReturn=FALSE;
+        char chrClassName[10];
+        LONG lLength;
+        PDRAGITEM pDragItem;
+
+        TRY_LOUD(LP_DROP) {
+          /* A drop on a toolbar button */
+          lpo=(LPObject*)WinQueryWindowULong(hwnd,QWL_USER);
+          if(lpo) {
+            wpObject=lpo->wpObject;
+            if(somIsObj(wpObject)) {
+              pDragInfo=(PDRAGINFO) mp1;
+              pDragItem=DrgQueryDragitemPtr(pDragInfo, 0);
+              hwndMenu=pDragInfo->hwndSource;
+              lLength=sizeof(chrClassName);
+              WinQueryClassName(hwndMenu, lLength, chrClassName);
+              if(strcmp(chrClassName,"#37"))
+                hwndMenu=NULL;/* Source isn't a container */
+              bReturn=TRUE;
+            }
+          }
+        }
+        CATCH(LP_DROP)
+          {
+          } END_CATCH;
+          if(bReturn)
+            return wpObject->wpDrop(hwndMenu,(PDRAGINFO) mp1, pDragItem);
+          break;
+      }
+    case WM_COMMAND:
+      TRY_LOUD(LP_COMMAND) {
+      lpo=(LPObject*)WinQueryWindowULong(hwnd,QWL_USER);
+      if(lpo) {
+        wpObject=lpo->wpObject;
+        if(somIsObj(wpObject)) {
+          if((SHORT)0x6d==SHORT1FROMMP(mp1)) {
+            /* Delete menu item */
+            if(wpObject->wpDelete(CONFIRM_DELETE|CONFIRM_DELETEFOLDER ) == OK_DELETE)
+              lpo->lpParent->lpRemoveButton(lpo);
+          }
+          else
+            wpObject->wpMenuItemSelected(NULL, SHORT1FROMMP(mp1));
+        }/* end of if(somIsObj(wpObject)) */
+      }
+      }
+      CATCH(LP_COMMAND)
+        {
+        } END_CATCH;
+        return (MRESULT) FALSE;
+    default:
+      break;			
+    }
+  // call the standard flyover button procedure to handle the rest of the messages
+  return (newButtonProc)(hwnd,msg,mp1,mp2);	
+};
+
+static BOOL bDrawn=FALSE;
+static RECTL rclDrawn;
+static MRESULT handleDragOver(HWND hwnd, MPARAM mp1, MPARAM mp2)
+{
+  ULONG ulNumberOfObjects;
+  PDRAGINFO pDragInfo;
+  HPS hps;
+  RECTL rectl;
+  SWP swp;
+  USHORT usIndicator=DOR_NEVERDROP,usOp=0;
+  WPObject *wpObject = NULL;
+
+  /* Get access to the dragInfo */
+  pDragInfo=(PDRAGINFO)mp1;
+  if (DrgAccessDraginfo(pDragInfo)) {
+      PDRAGITEM pDragItem = NULL;
+      SOMClass *cdTrackClass = NULL;
+
+     	/* Get number of items */
+     	ulNumberOfObjects = DrgQueryDragitemCount( pDragInfo);
+
+     	if(ulNumberOfObjects>1) {
+         usIndicator = DOR_NODROP;
+         usOp = 0;
+         goto quit;
+     	}
+
+      /* check if a WPS object was dropped, we do not accept anything else */
+      pDragItem = DrgQueryDragitemPtr(pDragInfo,0);
+      if (!DrgVerifyRMF(pDragItem,"DRM_OBJECT","DRF_OBJECT")) {
+         usIndicator = DOR_NEVERDROP;
+         usOp = 0;
+         goto quit;
+      } /* endif */
+
+      /*
+         refuse drop if WPS object pointer is not valid or if the object is
+         a descendant of MMCDTrack class (see Netlabs ticket #19)
+      */
+      wpObject = (WPObject *)OBJECT_FROM_PREC(pDragItem->ulItemID);
+      cdTrackClass = somhlpGetSomClass("MMCDTrack");
+      if (!somIsObj(wpObject) || wpObject->somIsA(cdTrackClass)) {
+         usIndicator = DOR_NEVERDROP;
+         usOp = 0;
+         goto quit;
+      } /* endif */
+
+     	switch(pDragInfo->usOperation)
+       {
+       case DO_DEFAULT:
+       case DO_LINK:
+         if(!bDrawn) {
+           POINTL ptl;
+           launchPad * lp;
+
+           ptl.x=SHORT1FROMMP(mp2);
+           ptl.y=SHORT2FROMMP(mp2);
+           /* Pos in window coords */
+           WinMapWindowPoints(HWND_DESKTOP, hwnd, &ptl, 1);
+
+           hps=DrgGetPS(hwnd);
+           WinQueryWindowPos(hwnd,&swp);
+
+           rectl.xLeft=swp.cx;//-swp.cy;
+
+           lp=(launchPad*)WinQueryWindowULong(hwnd,QWL_USER);
+           if(lp) {
+             if(lp->lpQueryNumObjects()==0) {
+               rectl.xLeft=0;
+             }
+           }
+
+           rectl.yTop=swp.cy-1;
+           rectl.yBottom=1;
+           if(ptl.x<rectl.xLeft) {
+             int numB;
+
+             numB=(ptl.x-xButtonOffset)/(swp.cy+xButtonDelta);
+             rectl.xLeft=((ptl.x-numB*swp.cy) > swp.cy/2 ? numB+1: numB);
+             rectl.xLeft*=(swp.cy+xButtonDelta);
+             rectl.xLeft-=(xButtonDelta)-xButtonOffset+xButtonDelta;
+             rectl.xRight=rectl.xLeft+(xButtonDelta*2);
+           }
+           else {
+             rectl.xRight=swp.cx-1;
+           }
+           rclDrawn=rectl;
+           WinDrawBorder(hps,&rectl, 2, 2, 0, 0, DB_STANDARD|DB_PATINVERT);
+           bDrawn=TRUE;
+
+           DrgReleasePS(hps);
+         }
+         usIndicator = DOR_DROP;
+         usOp = DO_LINK;
+         break;
+      default:
+         usIndicator = DOR_NODROPOP;
+         usOp = DO_LINK;
+         break;
+       }
+quit:
+     /* Free the draginfo */
+     DrgFreeDraginfo(pDragInfo);
+  }
+  return MRFROM2SHORT(usIndicator,usOp);
+}
+
+
+static MRESULT handleDragLeave(HWND hwnd, MPARAM mp1, MPARAM mp2)
+{
+  RECTL rectl;
+  SWP swp;
+  HPS hps;
+
+  /* Remove target emphasis here */
+  hps=DrgGetPS(hwnd);
+  WinDrawBorder(hps,&rclDrawn, 2, 2, 0, 0, DB_STANDARD|DB_PATINVERT);
+  DrgReleasePS(hps);
+  bDrawn=FALSE;
+  return (MRESULT) FALSE;
+}
+
+
+static MRESULT EXPENTRY launchPadWindowProc(HWND hwnd, ULONG msg, MPARAM mp1, MPARAM mp2)
+{
+  WPFolder* thisPtr;
+  launchPad * lp;
+  LPObject *lpo;
+  static USHORT id=0;//Initialisation new in V1.00a
+
+  switch(msg)
+    {
+    case WM_PAINT:
+      {
+      RECTL rcl;
+      launchPad * lp;
+
+      HPS hps=WinBeginPaint(hwnd,NULLHANDLE, &rcl);
+      WinFillRect(hps, &rcl, SYSCLR_DIALOGBACKGROUND);
+      lp=(launchPad*)WinQueryWindowULong(hwnd,QWL_USER);
+      if(lp) {
+        if(lp->lpQueryNumObjects()==0) {
+          WinQueryWindowRect(hwnd,&rcl);
+          WinDrawBorder(hps,&rcl,1,1,SYSCLR_WINDOWFRAME,SYSCLR_DIALOGBACKGROUND, DB_STANDARD);
+        }
+      }
+      WinEndPaint(hps);
+      return (MRESULT) 0;
+      }
+    case DM_DRAGOVER:
+      return handleDragOver(hwnd, mp1, mp2);
+    case DM_DROP:
+      {
+        TRY_LOUD(LP_FRAMEDROP) {
+          /* A new object dropped on the launchpad */
+          PDRAGINFO pDragInfo=(PDRAGINFO)mp1;
+          if(DrgAccessDraginfo(pDragInfo)) {
+              lp=(launchPad*)WinQueryWindowULong(hwnd,QWL_USER);
+              if(lp) {
+                  PDRAGITEM pDragItem=DrgQueryDragitemPtr( pDragInfo, 0);
+                  WPObject *wpObject=(WPObject*)OBJECT_FROM_PREC(pDragItem->ulItemID);
+                  POINTL ptl;
+                  int numB;
+                  SWP swp;
+
+                  WinQueryWindowPos(hwnd,&swp);
+                  ptl.x=pDragInfo->xDrop;
+                  ptl.y=pDragInfo->yDrop;
+                  /* Pos in window coords */
+                  WinMapWindowPoints(HWND_DESKTOP, hwnd, &ptl, 1);
+                  numB=(ptl.x-xButtonOffset)/(swp.cy+xButtonDelta);
+                  numB=((ptl.x-numB*swp.cy) > swp.cy/2 ? numB+1: numB);
+
+                  /* Do a link */
+                  lp->lpAddButton(wpObject, numB);
+              }
+              myDrgDeleteDraginfoStrHandles(pDragInfo);
+              DrgFreeDraginfo(pDragInfo);
+          }
+          handleDragLeave(hwnd, mp1, mp2);
+        }
+        CATCH(LP_FRAMEDROP)
+          {
+          } END_CATCH;
+          return MRFROMLONG(0);
+      }
+    case DM_DRAGLEAVE:
+      return handleDragLeave(hwnd, mp1, mp2);
+      break;
+    case WM_COMMAND:
+      if(SHORT1FROMMP(mp2)==CMDSRC_PUSHBUTTON) {
+        /* It's a push button */
+        lpo=(LPObject*)WinQueryWindowULong(WinWindowFromID(hwnd,SHORT1FROMMP(mp1)),QWL_USER);
+        if(lpo) {
+          if(somIsObj(lpo->wpObject))
+            lpo->wpObject->wpViewObject(NULLHANDLE, OPEN_DEFAULT,0);
+        }
+      }
+      return (MRESULT)FALSE;
+      /***********************************************/
+      /* Stuff for fly over help                     */
+    case WM_MOUSEMOVE:
+      launchPad * lp;
+
+      lp=(launchPad*)WinQueryWindowULong(hwnd,QWL_USER);
+      if(lp) {
+        if(lp->lpQueryNumObjects()!=0) {
+          break;
+        }
+      }
+
+      if(!hwndBubbleWindow)
+        WinStartTimer(WinQueryAnchorBlock(hwnd), hwnd, 2,(ULONG)iTBFlyOverDelay); // New timer for delay	
+
+      break;
+    case WM_DESTROY:
+      WinStopTimer(WinQueryAnchorBlock(hwnd),hwnd,1);//Stop timer if running
+      if(hwndBubbleWindow)
+        WinDestroyWindow(hwndBubbleWindow);/*  close the bubblewindow  */
+      hwndBubbleWindow=0;
+      /* Stop delay timer if running */
+      WinStopTimer(WinQueryAnchorBlock(hwnd),hwnd, 2);			
+      break;
+
+    case WM_NEWBUBBLE:
+      ULONG bubbleEnabled;
+      HWND hwndStore;
+      POINTL ptl;
+      RECTL  rclWork;
+      LONG  ulWinTextLen;
+      POINTL aptlPoints[TXTBOX_COUNT];
+      LONG   deltaX,deltaY;
+      HPS  hps;
+      RECTL   rcl;
+
+      /*  we have to build a new information window  */
+      if(hwndBubbleWindow){// if(){...} new in V1.00a
+        WinDestroyWindow(hwndBubbleWindow);/*  close the bubblewindow  */
+        hwndBubbleWindow=NULL;
+      }
+      // Query the pointer position
+      WinQueryPointerPos(HWND_DESKTOP,&ptl);
+      WinMapWindowPoints(HWND_DESKTOP,hwnd,&ptl,1);
+      WinQueryWindowRect(hwnd,&rclWork);				
+      if(!hwndBubbleWindow
+         && WinPtInRect(WinQueryAnchorBlock(hwnd),&rclWork,&ptl)
+         && bTBFlyOverEnabled) {
+
+        static HWND hwndBubbleClient;
+        ULONG style=FCF_BORDER|FCF_NOBYTEALIGN;
+        char winText[255] = {0};
+
+        /* Get window text for size calculating */
+            lp=(launchPad*)WinQueryWindowULong(hwnd,QWL_USER);
+        if(lp) {
+          strncpy(winText, lp->lpQueryFlyOverText(), sizeof(winText));
+          winText[sizeof(winText)-1]=0;
+        }
+
+        ulWinTextLen=(LONG)strlen(winText); // Query text length
+
+        /* Delete 'Returns' in object title */
+        char *pBuchst;
+        char *pRest;
+        pRest=winText;
+        while((pBuchst=strchr(pRest,13))!=NULL) {
+          *pBuchst=' ';
+          pBuchst++;
+          if(*pBuchst==10)
+            *pBuchst=' ';
+          pRest=pBuchst;
+        }
+
+        /* Create help window */
+        hwndBubbleWindow=WinCreateStdWindow(HWND_DESKTOP,
+                                            0,
+                                            &style,
+                                            WC_STATIC,
+                                            "",
+                                            SS_TEXT|DT_CENTER|DT_VCENTER,
+                                            NULLHANDLE,
+                                            400,
+                                            &hwndBubbleClient);
+
+        hwndShadow=WinCreateWindow(HWND_DESKTOP,
+                                   WC_STATIC,
+                                   "",
+                                   SS_TEXT|DT_CENTER|DT_VCENTER,
+                                   0, 0,
+                                   0, 0,
+                                   hwndBubbleWindow,
+                                   hwndBubbleWindow,
+                                   401,
+                                   NULLHANDLE,
+                                   NULLHANDLE);
+        oldProc=WinSubclassWindow(hwndShadow, shadowProc);
+
+        // Set the font for the help
+        WinSetPresParam(hwndBubbleClient,PP_FONTNAMESIZE,
+                        sizeof(chrTBFlyFontName),
+                        chrTBFlyFontName);
+        /* Calculate text size in pixel */
+        hps=WinBeginPaint(hwndBubbleClient,(HPS)NULL,(PRECTL)NULL);
+        GpiQueryTextBox(hps,ulWinTextLen,winText,TXTBOX_COUNT,aptlPoints);
+        WinEndPaint(hps);
+
+        /* Set colors */
+        WinSetPresParam(hwndBubbleClient,
+                        PP_BACKGROUNDCOLOR,sizeof(rgbTBFlyBackground) ,
+                        &rgbTBFlyBackground );
+        WinSetPresParam(hwndBubbleClient,
+                        PP_FOREGROUNDCOLOR,sizeof(rgbTBFlyForeground) ,
+                        &rgbTBFlyForeground );
+
+        /* Calculate bubble positon and show bubble */
+        WinQueryPointerPos(HWND_DESKTOP,&ptl);//Query pointer position in the desktop window
+        WinQueryWindowRect(HWND_DESKTOP,&rcl);//Query desktop size
+        aptlPoints[TXTBOX_BOTTOMRIGHT].x-aptlPoints[TXTBOX_BOTTOMLEFT].x+7+xVal+ptl.x
+          > rcl.xRight
+          ? deltaX=-aptlPoints[TXTBOX_BOTTOMRIGHT].x-aptlPoints[TXTBOX_BOTTOMLEFT].x-xVal-xVal-7
+	      : deltaX=0 ;
+
+        aptlPoints[TXTBOX_TOPLEFT].y-aptlPoints[TXTBOX_BOTTOMLEFT].y+2+yVal+ptl.y
+          > rcl.yTop
+          ? deltaY=-aptlPoints[TXTBOX_TOPLEFT].y-aptlPoints[TXTBOX_BOTTOMLEFT].y-2*yVal-7
+	      : deltaY=0 ;		
+        WinSetWindowPos(hwndBubbleWindow,
+                        HWND_TOP,
+                        ptl.x+xVal+deltaX,ptl.y+yVal+deltaY,
+                        aptlPoints[TXTBOX_BOTTOMRIGHT].x-aptlPoints[TXTBOX_BOTTOMLEFT].x+8,
+                        aptlPoints[TXTBOX_TOPLEFT].y-aptlPoints[TXTBOX_BOTTOMLEFT].y+2,
+                        SWP_ZORDER|SWP_SIZE|SWP_MOVE|SWP_SHOW);
+
+        WinSetWindowPos(hwndShadow,
+                        hwndBubbleWindow,
+                        ptl.x+xVal+deltaX+5
+                        ,ptl.y+yVal+deltaY-5,
+                        aptlPoints[TXTBOX_BOTTOMRIGHT].x-aptlPoints[TXTBOX_BOTTOMLEFT].x+8,
+                        aptlPoints[TXTBOX_TOPLEFT].y-aptlPoints[TXTBOX_BOTTOMLEFT].y+2,
+                        SWP_ZORDER|SWP_SIZE|SWP_MOVE|SWP_SHOW);
+
+        /* Set bubble text */
+        WinSetWindowText(hwndBubbleClient,winText);
+        WinStartTimer(WinQueryAnchorBlock(hwnd),hwnd,1,35);
+      } // end if(!hwndBubbleWindow)
+      break;
+    case WM_TIMER:
+      switch (SHORT1FROMMP(mp1))
+        {
+        case 1: //Intervall timer
+          {
+            POINTL ptl;
+            RECTL  rclWork;
+
+            /* Test pointer position */
+            WinQueryPointerPos(HWND_DESKTOP, &ptl);
+            WinMapWindowPoints(HWND_DESKTOP, hwnd,&ptl, 1);
+            WinQueryWindowRect(hwnd, &rclWork);
+            if(!WinPtInRect(WinQueryAnchorBlock(hwnd),&rclWork,&ptl))
+              {	// Window has changed				
+                WinStopTimer(WinQueryAnchorBlock(hwnd), hwnd, 1);  // stop the running timer
+                if(hwndBubbleWindow)
+                  WinDestroyWindow(hwndBubbleWindow);/*  close the bubblewindow  */
+                hwndBubbleWindow=0;
+                id=0;
+              }			 			
+          break;
+          }
+        case 2:// delay over
+          {//our own timer.
+            POINTL ptl;
+            RECTL  rclWork;
+
+            WinStopTimer(WinQueryAnchorBlock(hwnd), hwnd, 2);//Stop the delay timer
+            /* Check the pointer position */
+            WinQueryPointerPos(HWND_DESKTOP,&ptl);
+            WinMapWindowPoints(HWND_DESKTOP,hwnd,&ptl,1);
+            WinQueryWindowRect(hwnd,&rclWork);
+            if(WinPtInRect(WinQueryAnchorBlock(hwnd),&rclWork,&ptl))
+              WinPostMsg(hwnd,WM_NEWBUBBLE,NULL,NULL);//Request a help window
+            return (MRESULT)FALSE;
+          }
+        default:
+          break;
+        }
+      break;
+    default:
+      break;
+    }
+  return pfnwpOldLPProc(hwnd, msg, mp1, mp2);
+}
+
+void LPList::lplRefreshAllPads()
+{
+
+}
+
+LPObject::LPObject(HPOINTER hptr)
+{
+  hPtr=hptr;
+}
+
+LPObject::~LPObject(void)
+{
+}
+
+launchPad::launchPad(HWND hwndParent,HWND hwndOwner, BOOL bVisible, WPFolder *wpParent, LPList** lpadList, HWND hwndPrev, ULONG ulFl)
+{
+  LPList *lplTemp;
+
+  wpParentFolder=wpParent;
+  hwndPrevious=hwndPrev;
+  fl=ulFl;
+  lpList=lpadList;
+
+  /* Reset text */
+  chrFlyOverText[0]=0;
+
+  if((hwndLaunchPad=WinCreateWindow(hwndParent ,WC_FRAME, "Toolbar", FS_BORDER| (bVisible ? WS_VISIBLE: 0),
+                                    0, 0, 0, 0, hwndOwner, HWND_TOP, 1234, NULLHANDLE, NULLHANDLE))!=NULLHANDLE) {
+    WinSetWindowULong(hwndLaunchPad, QWL_USER,(ULONG) this);//Save object ptr.	
+    pfnwpOldLPProc=WinSubclassWindow(hwndLaunchPad, launchPadWindowProc);
+  }
+
+  ulNumObjects=0;
+  lpoObjectList=NULL;
+
+  /* Add this pad to the list of pads */
+  if(!lplAllLPads) {
+    /* It's the first one */
+    if((lplAllLPads=new LPList)!=NULL) {
+      lplAllLPads->lpPad=this;
+      lplAllLPads->lplNext=NULL;
+    }
+  }
+  else {
+    if((lplTemp=new LPList)!=NULL) {
+      lplTemp->lpPad=this;
+      lplTemp->lplNext=lplAllLPads;
+      lplAllLPads=lplTemp;
+    }
+  }
+}
+
+launchPad::~launchPad()
+{
+  LPList *lplTemp, *lplTemp2;
+
+  lpSaveObjectList();
+  lpFreeObjectList();
+
+  if(hwndLaunchPad)
+    WinDestroyWindow(hwndLaunchPad);
+
+  /* Remove this pad from the list of pads */
+  lplTemp=lplAllLPads;
+
+  if(lplTemp->lpPad==this) {
+    lplAllLPads=lplTemp->lplNext;
+    delete(lplTemp);
+  }
+  else {
+    while(lplTemp->lplNext)
+      {
+        if(lplTemp->lplNext->lpPad==this) {
+          lplTemp2=lplTemp->lplNext;
+          lplTemp->lplNext=lplTemp->lplNext->lplNext;
+          delete(lplTemp2);
+          break;
+        }
+        lplTemp=lplTemp->lplNext;
+      }
+  }
+}
+
+BOOL launchPad::lpSetFlyOverText(char* chrText)
+{
+  strncpy(chrFlyOverText, chrText, sizeof(chrFlyOverText));
+  chrFlyOverText[sizeof(chrFlyOverText)-1]=0;
+
+  return TRUE;
+}
+
+PSZ  launchPad::lpQueryFlyOverText(void)
+{
+  return chrFlyOverText;
+}
+
+BOOL launchPad::lpSetLaunchPadPos(HWND hwndInsertBehind, LONG x, LONG y, LONG cx, LONG cy, ULONG fl)
+{
+  if(WinIsWindow(WinQueryAnchorBlock(hwndLaunchPad), hwndPrevious)) {
+    SWP swp;
+    WinQueryWindowPos(hwndPrevious,&swp);
+    return WinSetWindowPos(hwndLaunchPad, hwndInsertBehind, swp.x+swp.cx+x, y, cx, cy, fl);
+  }
+  else
+    return WinSetWindowPos(hwndLaunchPad, hwndInsertBehind, x, y, cx, cy, fl);
+}
+
+
+BOOL launchPad::lpSetConfiguration(char * chrTarget, char * chrConfigID_)
+{
+  HOBJECT hObject;
+  char chrSetup[CCHMAXPATH];
+
+  /* Destination of toolbar folder */
+  strncpy(chrConfigTarget, chrTarget,sizeof(chrConfigTarget));
+  chrConfigTarget[sizeof(chrConfigTarget)-1]=0;
+  /* The ID of the toolbar folder */
+  strncpy(chrConfigID, chrConfigID_,sizeof(chrConfigID));
+  chrConfigID[sizeof(chrConfigID)-1]=0;
+
+  /* First check the config folder */
+  if((hObject=WinQueryObject(chrConfigID))==NULLHANDLE)
+    {
+      /* Toolbar folder lost recreate it */
+      if(!SysCheckFileExists(chrConfigTarget))
+        return FALSE; /* No install dir defined */
+
+      if(fl & LP_USEOBJECTASPARAM) {
+        /* This isn't used yet */
+        sprintf(chrSetup, "HIDECLASSPAGE=1;OBJECTID=%s",chrConfigID);
+        if((hObject=WinCreateObject("CWMenuFolder", chrConfigID, chrSetup, chrConfigTarget,CO_FAILIFEXISTS))==NULLHANDLE)
+          return FALSE; /* Can't create new toolbar folder */
+      }
+      else {
+        sprintf(chrSetup, "OBJECTID=%s", chrConfigID);
+        if((hObject=WinCreateObject("WPFolder", chrConfigID, chrSetup, chrConfigTarget,CO_FAILIFEXISTS))==NULLHANDLE)
+          return FALSE; /* Can't create new toolbar folder */
+      }
+    }
+
+  lpBuildObjectList(chrConfigID);
+
+  return TRUE;
+}
+
+WPFolder* launchPad::lpQueryParentFolder()
+{
+  return wpParentFolder;
+}
+
+void launchPad::lpRefreshLaunchPad()
+{
+  /* Refresh all launchpads */
+  LPList *lplTemp;
+
+  //lplTemp=lplAllLPads;
+  lplTemp=*lpList;
+
+  while(lplTemp)
+    {
+      if(lplTemp->lpPad) {
+        lplTemp->lpPad->lpFreeObjectList();
+        lplTemp->lpPad->lpReBuildObjectList();
+        lplTemp->lpPad->lpFillPad();
+      }
+      lplTemp=lplTemp->lplNext;
+    }
+  return;
+}
+
+BOOL launchPad::lpRemoveButton(LPObject *lpObject)
+{
+  int a;
+  LPObject* lpoTemp, *lpoTemp2;
+
+  /* Find object in list */
+  lpoTemp=lpoObjectList;
+
+  if(lpoTemp==lpObject) {
+    lpoObjectList=lpoTemp->lpoNext;
+
+    delete(lpObject);
+    ulNumObjects--;
+  }
+  else {
+    while(lpoTemp->lpoNext)
+      {
+        if(lpoTemp->lpoNext==lpObject) {
+          lpoTemp->lpoNext=lpObject->lpoNext;
+
+          delete(lpObject);
+          ulNumObjects--;
+          break;
+        }
+        lpoTemp=lpoTemp->lpoNext;
+      }
+  }
+
+  lpSaveObjectList();
+  lpRefreshLaunchPad();
+
+  return TRUE;
+}
+
+
+BOOL launchPad::lpAddButton(WPObject* wpObject, int iPos)
+{
+  HOBJECT hObject;
+  SOMClass *folderClass;
+  char chrSetup[CCHMAXPATH];
+  WPObject *wpTempObject;
+  LPObject *lpoTemp, *lpoTemp2, *lpoTempNew;
+  int a;
+
+
+  /* First check the config folder */
+  if((hObject=WinQueryObject(chrConfigID))==NULLHANDLE)
+    {
+      /* Toolbar folder lost recreate it */
+      if(!SysCheckFileExists(chrConfigTarget))
+        return FALSE; /* No install dir defined */
+
+      if(fl & LP_USEOBJECTASPARAM) {
+        sprintf(chrSetup, "HIDECLASSPAGE=1;OBJECTID=%s", chrConfigID);
+        if((hObject=WinCreateObject("CWMenuFolder", chrConfigID, chrSetup, chrConfigTarget,CO_FAILIFEXISTS))==NULLHANDLE)
+          return FALSE; /* Can't create new toolbar folder */
+      }
+      else {
+        sprintf(chrSetup,  "OBJECTID=%s", chrConfigID);
+        if((hObject=WinCreateObject("WPFolder", chrConfigID, chrSetup, chrConfigTarget,CO_FAILIFEXISTS))==NULLHANDLE)
+          return FALSE; /* Can't create new toolbar folder */
+      }
+    }
+
+  if(somIsObj(wpObject) && somIsObj(wpParentFolder)) {
+    folderClass=wpParentFolder->somGetClass();
+    if(somIsObj(folderClass)) {
+      /* Create a shadow in our toolbar folder */
+      wpTempObject=wpObject->wpCreateShadowObject((WPFolder*)((M_WPFolder*)folderClass)->wpclsQueryFolder(chrConfigID, FALSE), FALSE);
+      if(somIsObj(wpTempObject)) {
+        /* Get the persistent object handle */
+        hObject=wpTempObject->wpQueryHandle();
+
+        /* Find the insertion point */
+        /* iPos is the button after which we insert the new one. The list of objects is in reverse order. */
+        lpoTemp2=lpoObjectList;
+        if(iPos<ulNumObjects) {
+          lpoTemp=lpoTemp2;
+          for(a=ulNumObjects;a>iPos && lpoTemp; a--)
+            {
+              lpoTemp=lpoTemp2;
+              lpoTemp2=lpoTemp2->lpoNext;
+            }
+        }
+        else
+          lpoTemp=NULLHANDLE;
+
+        /* lpoTemp contains object */
+        /* Alloc a struct for this object to insert it on the toolbar */
+
+        if((lpoTempNew=new LPObject(wpTempObject->wpQueryIcon()))!=NULL) {
+          ULONG ulRC;
+
+          lpoTempNew->wpObject=wpTempObject;
+          lpoTempNew->wpObject->wpLockObject();
+          lpoTempNew->hObject=hObject;
+          //  lpoTempNew->hPtr=wpTempObject->wpQueryIcon();
+
+          /* Title of the object */
+          strncpy(lpoTempNew->chrName, wpTempObject->wpQueryTitle(),sizeof(lpoTempNew->chrName));
+          lpoTempNew->lpParent=this;
+
+          if(lpoTemp) {
+            lpoTempNew->lpoNext=lpoTemp->lpoNext;
+            lpoTemp->lpoNext=lpoTempNew;
+          }
+          else {
+            lpoTempNew->lpoNext=lpoObjectList;
+            lpoObjectList=lpoTempNew;
+          }
+          ulNumObjects++;
+        }
+      }
+    }
+  }
+
+  lpSaveObjectList();
+  lpRefreshLaunchPad();
+
+  return TRUE;
+}
+
+
+BOOL launchPad::lpSaveObjectList()
+{
+  SOMClass *folderClass;
+  WPFolder *wpFolder;
+  char chrPath[CCHMAXPATH];
+  ULONG ulBufferSize;
+  HINI hIni;
+  char * memPtr;
+  HOBJECT *hObject;
+  HOBJECT hObject2;
+  int a;
+  LPObject *lpoTemp;
+
+  /* First check the config folder */
+  if((hObject2=WinQueryObject(chrConfigID))==NULLHANDLE)
+    {
+      /* Toolbar folder lost recreate it */
+      if(!SysCheckFileExists(chrConfigTarget))
+        return FALSE; /* No install dir defined */
+
+      sprintf(chrPath,"OBJECTID=%s",chrConfigID);
+      if((hObject2=WinCreateObject("WPFolder", chrConfigID, chrPath,chrConfigTarget,CO_FAILIFEXISTS))==NULLHANDLE)
+        return FALSE; /* Can't create new toolbar folder */
+    }
+
+  /* Get toolbar folder */
+  if(somIsObj(wpParentFolder)) {
+    folderClass=wpParentFolder->somGetClass();
+    if(somIsObj(folderClass))
+      wpFolder=(WPFolder*)((M_WPFolder*)folderClass)->wpclsQueryFolder(chrConfigID, FALSE);
+    if(!somIsObj(wpFolder))
+      return FALSE;
+  }
+  else
+    return FALSE;
+
+  // Fixme see line 1106
+  ulBufferSize=sizeof(chrPath);
+  wpFolder->wpQueryRealName(chrPath, &ulBufferSize, TRUE);
+  strcat(chrPath,"\\objects.ini");/* Ini-File containing the hobjects */
+
+  //  WinMessageBox(HWND_DESKTOP, HWND_DESKTOP, chrPath, "~launchPad", 123, MB_OK| MB_MOVEABLE);
+  do{
+    /* Open the ini-file */
+    if((hIni=PrfOpenProfile(WinQueryAnchorBlock(HWND_DESKTOP),chrPath))==NULLHANDLE)
+      break;
+
+    if((memPtr=(char*)malloc(ulNumObjects*sizeof(HOBJECT)))==NULL)
+      break;
+
+
+    hObject=(HOBJECT*)memPtr;
+
+    lpoTemp=lpoObjectList;
+    for(a=ulNumObjects;a>0 && lpoTemp; a--)
+      {
+        hObject[a-1]=lpoTemp->hObject;
+        lpoTemp=lpoTemp->lpoNext;
+      }
+
+    if(!PrfWriteProfileData(hIni,"objects","handles", hObject, ulNumObjects*sizeof(HOBJECT))) {
+      free(hObject);
+      break;
+    }
+
+    free(hObject);
+
+    PrfCloseProfile(hIni);
+    return TRUE;
+  }while(TRUE);
+
+  if(hIni)
+    PrfCloseProfile(hIni);
+  return FALSE;
+}
+
+BOOL launchPad::lpReBuildObjectList()
+{
+  return lpBuildObjectList( chrConfigID);
+}
+
+BOOL launchPad::lpBuildObjectList(char * chrFolderID)
+{
+  WPObject* wpObject;
+
+  char chrText[200];
+  ULONG ul;
+
+  SOMClass *folderClass;
+  WPFolder *wpFolder;
+  char chrPath[CCHMAXPATH];
+  ULONG ulBufferSize;
+  HINI hIni;
+  char * memPtr;
+  HOBJECT *hObjectArray;
+  int a;
+  LPObject *lpoTemp;
+  WPObject * wpTempObject;
+
+
+  /* Get toolbar folder */
+  if(somIsObj(wpParentFolder)) {
+    folderClass=wpParentFolder->somGetClass();
+    if(somIsObj(folderClass))
+      wpFolder=(WPFolder*)((M_WPFolder*)folderClass)->wpclsQueryFolder(chrFolderID, FALSE);
+    if(!somIsObj(wpFolder))
+      return FALSE;
+  }
+  else
+    return FALSE;
+  // Fixme wpFolder can be uninittailized if(somIsObj(wpParentFolder)) is false sould we return FALSE
+  /* Build ini name */
+  ulBufferSize=sizeof(chrPath);
+  wpFolder->wpQueryRealName(chrPath, &ulBufferSize, TRUE);
+  strcat(chrPath,"\\objects.ini");/* Ini-File containing the hobjects */
+
+  do{
+    /* Open the ini-file */
+    if((hIni=PrfOpenProfile(WinQueryAnchorBlock(HWND_DESKTOP),chrPath))==NULLHANDLE)
+      break;
+
+    if(!PrfQueryProfileSize(hIni,"objects","handles", &ulBufferSize))
+      break;
+
+    if(ulBufferSize==0)
+      break;/* No entries yet */
+
+    if((memPtr=(char*)malloc(ulBufferSize))==NULL)
+      break;
+
+    ulNumObjects=ulBufferSize/sizeof(HOBJECT);
+
+    if(!PrfQueryProfileData(hIni,"objects","handles", memPtr, &ulBufferSize)){
+      free(memPtr);
+      break;
+    }
+
+    hObjectArray=(HOBJECT*)memPtr;
+    ulBufferSize=ulNumObjects;
+    for(a=0;a<ulBufferSize && lpoTemp; a++)
+      {
+        wpTempObject=((M_WPObject*)folderClass)->wpclsQueryObject(hObjectArray[a]);
+        if(somIsObj(wpTempObject)) {
+          if((lpoTemp=new LPObject(wpTempObject->wpQueryIcon()))!=NULL) {
+            lpoTemp->wpObject=wpTempObject;
+            wpTempObject->wpLockObject();
+            lpoTemp->hObject=hObjectArray[a];
+            //            lpoTemp->hPtr=wpTempObject->wpQueryIcon();
+            /* Title of the object */
+            strncpy(lpoTemp->chrName, wpTempObject->wpQueryTitle(),sizeof(lpoTemp->chrName));
+            lpoTemp->lpParent=this;
+
+            lpoTemp->lpoNext=lpoObjectList;
+            lpoObjectList=lpoTemp;
+          }
+        }
+        else {
+          ulNumObjects--;
+        }
+      }/* for */
+
+    free(hObjectArray);
+
+    PrfCloseProfile(hIni);
+    return TRUE;
+  }while(TRUE);
+
+  if(hIni)
+    PrfCloseProfile(hIni);
+  return FALSE;
+
+}
+
+void launchPad::lpFreeObjectList()
+{
+  LPObject *lpoTemp, *lpoTemp2;
+
+  /* Free our object list */
+  lpoTemp=lpoObjectList;
+  while(lpoTemp) {
+    lpoTemp2=lpoTemp->lpoNext;
+    lpoTemp->wpObject->wpUnlockObject();
+    delete (lpoTemp);
+    lpoTemp=lpoTemp2;
+  }
+  lpoObjectList=NULL;
+}
+
+BOOL launchPad::lpClearPad()
+{
+  LPObject *lpoTemp, *lpoTemp2;
+  int a;
+  HENUM hEnum;
+  HWND hwnd;
+
+  /* Destroy all Buttons */
+  hEnum=WinBeginEnumWindows(hwndLaunchPad);
+  while((hwnd=WinGetNextWindow(hEnum))!=NULLHANDLE)
+        WinDestroyWindow(hwnd);
+  WinEndEnumWindows(hEnum);
+
+  return TRUE;
+}
+
+
+BOOL launchPad::lpFillPad()
+{
+  HOBJECT hObject;
+  char chrSetup[CCHMAXPATH];
+  WPFolder* wpFolder;
+  LPObject *lpoTemp;
+
+  SWP swp;
+  HWND hwndTemp;
+  BTNCDATA btCtrl;
+  WNDPARAMS wndParams;
+  ULONG ulStyle;
+  int a;
+  LONG lXSize;
+  HENUM hEnum;
+  HWND hwndClient;
+  LONG lCxSave;
+
+  /* Remove Buttons from pad */
+  lpClearPad();
+
+  /* Resize the pad for all objects */
+  if(!WinQueryWindowPos(hwndLaunchPad, &swp))
+    return FALSE;
+
+
+  lCxSave=swp.cx;
+
+  lXSize=(ulNumObjects == 0 ? swp.cy : (ulNumObjects) * (swp.cy+xButtonDelta) +2*xButtonOffset);
+  lpSetLaunchPadPos( NULLHANDLE,0,0, lXSize , swp.cy, SWP_SIZE);
+
+  /* Move all controls on the right */
+  /* Move all client windows so they keep their distance to the left border */
+  hEnum=WinBeginEnumWindows(WinQueryWindow(hwndLaunchPad,QW_PARENT));
+  while((hwndClient=WinGetNextWindow(hEnum))!=NULLHANDLE) {
+    SWP swpClient;
+
+    WinQueryWindowPos(hwndClient,&swpClient);
+    if(swpClient.x > swp.x)
+      WinSetWindowPos(hwndClient, NULLHANDLE, swpClient.x+(lXSize-lCxSave), swpClient.y, 0, 0, SWP_MOVE);
+  }/* while */
+  WinEndEnumWindows(hEnum);
+
+  lpoTemp=lpoObjectList;
+  for(a=ulNumObjects;a>0 && lpoTemp; a--)
+    {
+      /* Create Buttons */
+      if((hwndTemp=WinCreateWindow(hwndLaunchPad, WC_BUTTON, lpoTemp->chrName, WS_VISIBLE, xButtonOffset+(a-1)*(swp.cy+xButtonDelta), 1, swp.cy-2, swp.cy-2,
+                                   hwndLaunchPad, HWND_TOP, a*100,
+                                   NULLHANDLE, NULLHANDLE))!=NULLHANDLE)
+        {
+          /* Change Style to mini icon */
+          ulStyle=WinQueryWindowULong(hwndTemp,QWL_STYLE);
+          ulStyle|=(BS_MINIICON);
+          ulStyle&=~BS_TEXT;
+          if(WinSetWindowULong(hwndTemp,QWL_STYLE,ulStyle)) {
+            memset(&btCtrl,0,sizeof(btCtrl));
+            btCtrl.cb=sizeof(btCtrl);
+            btCtrl.hImage=lpoTemp->hPtr;
+            memset(&wndParams,0,sizeof(wndParams));
+            wndParams.fsStatus=WPM_CTLDATA;
+            wndParams.cbCtlData=btCtrl.cb;
+            wndParams.pCtlData=&btCtrl;
+            WinSendMsg(hwndTemp,WM_SETWINDOWPARAMS,
+                       MPFROMP(&wndParams),0);
+            /* Subclass button for flyover help */
+            oldButtonProc2=WinSubclassWindow(hwndTemp, newLaunchPadButtonProc);
+            /* Set the class pointer into the window words */
+            WinSetWindowULong(hwndTemp,QWL_USER,(ULONG)lpoTemp);//Save object ptr.
+          }
+        }
+      lpoTemp=lpoTemp->lpoNext;
+    }
+  return TRUE;
+}
+
Index: /tags/CWMM-0.3.0_GA/mediafolder/c/helper/makefile
===================================================================
--- /tags/CWMM-0.3.0_GA/mediafolder/c/helper/makefile	(revision 213)
+++ /tags/CWMM-0.3.0_GA/mediafolder/c/helper/makefile	(revision 213)
@@ -0,0 +1,65 @@
+# Makefile for Mediafolder
+
+#include ../../../make.inc
+
+CC           = icc
+CPPFLAGS     = /Ge- /Gm+ /G4 /Gl- /O+ /Oc+ /Ol- /Q+ $(VACDEBUG)
+
+INC	=	..\include
+DEFS         =
+PROGS        =
+ODIR		= ./obj
+CPPDIR	= .
+
+OBJECTS	= messagehelper.obj helper.obj customprocs.obj except.obj windowhelper.obj \
+	somAndWPSHelper.obj mediafldrrexx.obj cd.obj launchpad.obj
+
+all:
+	cd ../. && make	
+
+launchpad.obj:		launchpad.cpp
+	icc $(CPPFLAGS) /C+ -I$(INC) /Fo$@ $<
+	cd ../. && make
+
+messagehelper.obj:		messagehelper.cpp
+	icc $(CPPFLAGS) /C+ -I$(INC) /Fo$@ $<
+	cd ../. && make
+
+helper.obj:	helper.cpp
+	icc $(CPPFLAGS) /C+ -I$(INC) /Fo$@ $<
+	cd ../. && make
+
+cd.obj:		cd.cpp
+	icc $(CPPFLAGS) /C+ /Ss -I$(INC) /Fo$@ $<
+	cd ../. && make
+
+customprocs.obj:	customprocs.cpp $(INC)\mediafolderinc.h $(INC)\mediafolderres.h
+	icc $(CPPFLAGS) /C+ -I$(INC) /Fo$@ $<
+	cd ../. && make
+
+except.obj:	except.cpp
+	icc $(CPPFLAGS) /Sm /C+ -I$(INC) /Fo$@ $<
+	cd ../. && make
+
+windowhelper.obj:	windowhelper.cpp
+	icc $(CPPFLAGS) /Sm /C+ -I$(INC) /Fo$@ $<
+	cd ../. && make
+
+somAndWPSHelper.obj:	somAndWPSHelper.cpp
+	icc $(CPPFLAGS) /Sm /C+ -I$(INC) /Fo$@ $<
+	cd ../. && make
+
+mediafldrrexx.obj:	mediafldrrexx.cpp
+	icc $(CPPFLAGS) /Sm /C+ -I$(INC) /Fo$@ $<
+	cd ../. && make
+
+clean:
+
+cleaner:
+	-rm *.*~
+	-rm *.flc
+
+distribution:
+
+	
+
Index: /tags/CWMM-0.3.0_GA/mediafolder/c/helper/mediafldrrexx.cpp
===================================================================
--- /tags/CWMM-0.3.0_GA/mediafolder/c/helper/mediafldrrexx.cpp	(revision 213)
+++ /tags/CWMM-0.3.0_GA/mediafolder/c/helper/mediafldrrexx.cpp	(revision 213)
@@ -0,0 +1,336 @@
+/*
+ * This file is (C) Chris Wohlgemuth 2002
+ * It is part of the MediaFolder package
+ */
+/*
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; see the file COPYING.  If not, write to
+ * the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+#define INCL_GPILCIDS
+#define INCL_GPIPRIMITIVES
+#define INCL_GPIBITMAPS
+#define INCL_SW
+#define INCL_REXXSAA
+
+#include "mediafolder.hh"
+#include "mediafolderres.h"
+
+//#pragma SOMAsDefault(pop)
+#include <os2.h>
+#include <rexxsaa.h>                   /* needed for RexxStart()     */
+#include <stdio.h>
+#include <stdlib.h>
+//#pragma SOMAsDefault(on)
+
+
+
+typedef ULONG (APIENTRY *PFNWPSFUNC)(WPObject* ,...);
+
+extern ULONG calculateHash(char * theString);
+ULONG calculateHash2(char * theString);
+void parameterError(char *chrMethod);
+extern SOMClass* somhlpGetSomClass(char* chrClassName);
+
+
+void parameterError(char *chrMethod)
+{
+  char text[200];
+  sprintf(text, "%s(): wrong number of parameters.", chrMethod);
+
+  WinMessageBox(HWND_DESKTOP, HWND_DESKTOP, text, "Method error",
+                1234, MB_OK|MB_MOVEABLE);
+  
+}
+
+void wpObjectError(char *chrMethod)
+{
+  char text[200];
+  sprintf(text, "%s(): object pointer is not valid.", chrMethod);
+
+  WinMessageBox(HWND_DESKTOP, HWND_DESKTOP, text, "Object error",
+                1234, MB_OK|MB_MOVEABLE);
+  
+}
+
+
+#define HASHSIZE 101
+ULONG calculateHash(char * theString)
+{
+  ULONG ulHash=0;
+
+  if(theString)
+    for(ulHash=0;*theString!='\0'; theString++)
+      ulHash=*theString+31*ulHash;
+  
+  return ulHash%HASHSIZE;
+}
+
+#define HASHSIZE2 123
+ULONG calculateHash2(char * theString)
+{
+  ULONG ulHash=0;
+
+  if(theString)
+    for(ulHash=0;*theString!='\0'; theString++)
+      ulHash=*theString+37*ulHash;
+  
+  return ulHash%HASHSIZE;
+}
+
+/* This function handles new WPS functions introduced by private classes */
+ULONG EXPENTRY rxCallCWWPSFunc(PSZ name, LONG argc, RXSTRING argv[], PSZ queuename,PRXSTRING retstring)
+{
+  char text[200];
+  ULONG ulHash;
+  ULONG ulReturn;
+  WPObject* wpObject;
+  WPFileSystem* wpFSObject;
+
+  /* At least WPObject* and name of method */
+  if(argc<2)
+    return 40;
+
+  TRY_LOUD(RX) {
+
+    /* Get a hash for the methodname for the switch() statement */
+    ulHash=calculateHash(argv[0].strptr)<<8;
+    ulHash+=calculateHash2(argv[0].strptr);
+    ulReturn=0;
+
+    wpObject=(WPObject*)atol(argv[1].strptr);
+    /* Check if it's a valid object */
+    if(somIsObj(wpObject)) {
+      PFNWPSFUNC procAddr;
+
+      /* Try to find the requested method */
+      if((procAddr=(PFNWPSFUNC) somResolveByName(wpObject, argv[0].strptr))==NULL) {
+        /* method not found. Check if it's a wrapped one */
+        switch(ulHash)
+          {
+          case 0x1b2a:  /* cwIsA */
+            procAddr=(PFNWPSFUNC) somResolveByName(wpObject, "somIsA");
+            break;
+          case 0x2c21:  /* cwIsInstanceOf */
+            procAddr=(PFNWPSFUNC) somResolveByName(wpObject, "somIsInstanceOf");
+            break;
+          case 0x5226:  /* cwQueryRealName */ 
+            procAddr=(PFNWPSFUNC) somResolveByName(wpObject, "wpQueryRealName");
+            break;
+#if 0
+          case 0x24 : /* cwQueryFilename */
+            procAddr=(PFNWPSFUNC) somResolveByName(wpObject, "wpQueryFilename");
+            break;
+#endif
+          default:
+            break;
+          }
+      }
+
+      if(procAddr==NULL) {
+        /* method not found and no private one */
+        sprintf(retstring->strptr, "ERROR_METHOD:");
+        retstring->strlength=strlen(retstring->strptr);
+      }
+      else {
+        switch(ulHash)
+          {
+            /* WPS method without a parameter returning ULONG or WPObject* */
+          case 0x0f10: /* cwQueryCurrentlyPlayingObject */
+            {
+              sprintf(retstring->strptr,"%d",procAddr(wpObject));
+              retstring->strlength=strlen(retstring->strptr);
+              break;            
+            }
+            /* Functions with one (ULONG) param returning ULONG, BOOL or WPObject* */
+            /* WPObject */
+          case 0x3f5e: /* cwStopAudioFile       */ /* Obsolete with V0.2.5 */
+          case 0x303d: /* cwPauseAudioFile      */ /* Obsolete with V0.2.5 */
+          case 0x5954: /* cwGetFileSystemObject */
+          case 0x244a: /* mfldrStopAudioFile    */ /* new with V0.2.5      */
+          case 0x3601: /* mfldrPauseAudioFile   */ /* new with V0.2.5      */
+            {
+              ULONG ulParam1;
+
+              if(argc<3) {
+                parameterError(argv[0].strptr);
+                ulReturn=40;
+                break;
+              }
+
+              ulParam1=atol(argv[2].strptr);
+              sprintf(retstring->strptr,"%d",procAddr(wpObject, ulParam1));
+              retstring->strlength=strlen(retstring->strptr);
+              break;
+            }
+            /* Functions with one (ULONG) param returning a string: */
+          case 0x5226: /* cwQueryRealName */
+            {
+              ULONG ulParam1;
+             
+              if(argc<3) {
+                parameterError(argv[0].strptr);
+                ulReturn=40;
+                break;
+              }
+              ulParam1=atol(argv[2].strptr);/* BOOL fQualified */
+
+              if(!procAddr(wpObject, retstring->strptr, &retstring->strlength, ulParam1))
+                sprintf(retstring->strptr,"ERROR:");
+              /*
+                if(!procAddr(wpObject, &retstring->strptr, &retstring->strlength, ulParam1))*/
+              
+              retstring->strlength=strlen(retstring->strptr);
+              break;
+            }
+            /* Function with two ULONG (or alike) params returning ULONG */
+          case 0x2f58:  /* cwPlayAudioFile    */ /* Obsolete with V0.2.5 */
+          case 0x1423:  /* mfldrPlayAudioFile */ /* new with V0.2.5      */
+            {
+              ULONG ulParam1;
+              ULONG ulParam2;
+
+              if(argc<4) {
+                parameterError(argv[0].strptr);
+                ulReturn=40;
+                break;
+              }
+              ulParam1=atol(argv[2].strptr);
+              ulParam2=atol(argv[3].strptr);
+
+              sprintf(retstring->strptr,"%d", procAddr(wpObject, ulParam1, ulParam2));
+              retstring->strlength=strlen(retstring->strptr);
+              break;
+            }
+          case 0x631e: /* mfldrSetStatusLineText */ /* new with V0.2.5      */
+          case 0x5121: /* cwSetStatusLineText    */ /* Obsolete with V0.2.5 */
+            {
+              if(argc<3) {
+                parameterError(argv[0].strptr);
+                ulReturn=40;
+                break;
+              }
+              if(atoi(argv[2].strptr)==0 && strlen(argv[2].strptr)==1)
+                procAddr(wpObject, NULLHANDLE);
+              else
+                procAddr(wpObject, argv[2].strptr);
+              break;
+            }
+            /* Function with one param returning ULONG */
+          case 0x1b2a:  /* cwIsA */
+          case 0x2c21:  /* cwIsInstanceOf */
+            {
+              SOMClass *somClass;
+
+              if(argc<3) {
+                parameterError(argv[0].strptr);
+                ulReturn=40;
+                break;
+              }
+
+              somClass=somhlpGetSomClass(argv[2].strptr);
+              if(!somIsObj(somClass)) {
+                sprintf(retstring->strptr,"ERROR_CLASS:");/* Return error */
+                retstring->strlength=strlen(retstring->strptr);
+                break;
+              }
+
+              sprintf(retstring->strptr,"%d", procAddr(wpObject, somClass));
+              retstring->strlength=strlen(retstring->strptr);
+              break;
+            }
+          default:
+            ulReturn=40;        
+          }/* switch */
+      }/* else if((procAddr=(PFNWPSFUNC) somResolveByName(wpObject, argv[1].strptr))==NULL) */
+    }/* if(somIsObj(wpObject)) */
+    else {
+      /* wpObject is not valid */
+      wpObjectError(argv[0].strptr);
+
+      ulReturn=40;
+    }
+    /*
+      sprintf(text, "%s HAsh: %x, Hash2: %x",argv[0].strptr, ulHash, calculateHash2(argv[0].strptr));
+      WinMessageBox(HWND_DESKTOP, HWND_DESKTOP, text, "",
+      1234, MB_OK|MB_MOVEABLE);
+      */
+  }
+  CATCH(RX)
+    {}END_CATCH;
+
+  return ulReturn;
+}
+/*
+
+Functions without params returning a string:
+
+
+Functions with one (ULONG) param returning ULONG, BOOL or WPObject*:
+
+0x3f: cwStopAudioFile             0x5e   obsolete with V0.2.5
+0x30: cwPauseAudioFile            0x3d   obsolete with V0.2.5
+0x59: cwGetFileSystemObject       0x54
+0x1b: cwIsA                       0x2a
+0x244a: mfldrStopAudioFile               new with V0.2.5
+0x3601: mfldrPauseAudioFile              new with V0.2.5
+
+Functions with one (ULONG) param returning a string:
+0x52:  cwQueryRealName            0x26
+ 0x24 : cwQueryFilename 
+
+Function with two ULONG (or alike) params:
+0x2f:   cwPlayAudioFile            0x58   obsolete with V0.2.5
+0x1423: mfldrPlayAudioFile                new with V0.2.5
+
+0x2c:  cwIsInstanceOf                 0x21
+0x51: cwSetStatusLineText             0x21
+0x631e: mfldrSetStatusLineText
+
+( 0x2e: cwGetVersionNumbers       hash2: 0x58)
+
+0xf:  cwQueryCurrentlyPlayingObject   0x10
+
+ */
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Index: /tags/CWMM-0.3.0_GA/mediafolder/c/helper/messagehelper.cpp
===================================================================
--- /tags/CWMM-0.3.0_GA/mediafolder/c/helper/messagehelper.cpp	(revision 213)
+++ /tags/CWMM-0.3.0_GA/mediafolder/c/helper/messagehelper.cpp	(revision 213)
@@ -0,0 +1,105 @@
+/*
+ * This file is (C) Chris Wohlgemuth 1999-2004
+ */
+/*
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; see the file COPYING.  If not, write to
+ * the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+
+#define INCL_WIN
+
+#include <os2.h>
+#include <stdio.h>
+#include <string.h>
+
+#define DEBUG
+
+void errorResource2(char * chrTitle);
+
+
+void errorResource()
+{
+  /*
+    Don't show a message box because on WPS startup this may lead to a deadlock.
+    At least I suspect this happens on system where the MM classes don't work.
+    Instead there's a new function errorResourceVerbose() which may be called when we
+    know, the WPS is up and running. 
+   */
+
+  errorResource2("Problem with Media-Folder installation");
+
+}
+
+void errorResource2(char * chrTitle)
+{
+  /*
+    Don't show a message box because on WPS startup this may lead to a deadlock.
+    At least I suspect this happens on system where the MM classes don't work.
+    Instead there's a new function errorResourceVerbose() which may be called when we
+    know, the WPS is up and running. 
+   */
+}
+
+void errorResourceVerbose(char * chrTitle)
+{
+#ifdef ECS
+  WinMessageBox(HWND_DESKTOP,0,
+                "The resource DLL which contains all the dialogs, graphics and messages cannot be loaded. \
+Please check your installation. There must be a file MFLDR_xx.DLL in the .\\MMOS2\\MEDIAFLD\\BIN directory of the \
+Media-Player package. xx is the language code of your system e.g. DE for Germany. This code is taken from the \
+SET LANG=xx_XX environment variable in your config.sys. If there is no \
+support for your language there must be at least the file MFLDR_EN.DLL. The Media-Player features \
+are not available!",
+                chrTitle,12345,
+                MB_OK|MB_MOVEABLE|MB_ERROR);
+#else
+  WinMessageBox(HWND_DESKTOP,0,
+                "The resource DLL which contains all the dialogs, graphics and messages cannot be loaded. \
+Please check your installation. There must be a file MFLDR_xx.DLL in the BIN directory of the \
+Media-Player package. xx is the language code of your system e.g. DE for Germany. This code is taken from the \
+SET LANG=xx_XX environment variable in your config.sys. If there is no \
+support for your language there must be at least the file MFLDR_EN.DLL. The Media-Player features \
+are not available!",
+                chrTitle,12345,
+                MB_OK|MB_MOVEABLE|MB_ERROR);
+#endif
+}
+
+ULONG messageBox( char* text, ULONG ulTextID , LONG lSizeText,
+                  char* title, ULONG ulTitleID, LONG lSizeTitle,
+                  HMODULE hResource, HWND hwnd, ULONG ulFlags)
+{
+
+  if(!WinLoadString(WinQueryAnchorBlock(hwnd),hResource,ulTextID,lSizeText,text)) {
+    errorResource();
+    return MBID_ERROR;
+  }
+  if(!WinLoadString(WinQueryAnchorBlock(hwnd),hResource,ulTitleID,lSizeTitle,title)) {
+    errorResource();
+    return MBID_ERROR;
+  }
+  return WinMessageBox(  HWND_DESKTOP, hwnd, text, title, 0UL, ulFlags );
+}
+
+BOOL getMessage(char* text,ULONG ulID, LONG lSizeText, HMODULE hResource,HWND hwnd)
+{
+  if(!WinLoadString(WinQueryAnchorBlock(hwnd),hResource,ulID,lSizeText,text)) {
+    sprintf(text,"");
+    return FALSE;
+  }
+  return TRUE;
+}
+
+
+
Index: /tags/CWMM-0.3.0_GA/mediafolder/c/helper/somandwpshelper.cpp
===================================================================
--- /tags/CWMM-0.3.0_GA/mediafolder/c/helper/somandwpshelper.cpp	(revision 213)
+++ /tags/CWMM-0.3.0_GA/mediafolder/c/helper/somandwpshelper.cpp	(revision 213)
@@ -0,0 +1,156 @@
+/*
+ * This file is (C) Chris Wohlgemuth 2002
+ * 
+ * It's part of the Media-Folder distribution
+ */
+/*
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; see the file COPYING.  If not, write to
+ * the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+
+#define INCL_DOSERRORS
+#define INCL_DOSERRORS
+#define INCL_GPIBITMAPS
+
+#include "mediafolder.hh"
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include "mediafolderres.h"
+#include "menufolder.hh"
+#include "cwcdtrack.hh"
+
+/* typedef for somTP_MMAudio_cwmmQueryTrackInfo */
+/* For calling the method in the CWAudio class. Linking to the DLL would require the
+   new audio classes. By dynamically querying the method the media folder works without
+   installing the audio classes. */  
+#include "cwmmquerytrackinfo.h"
+
+somTD_MMAudio_cwmmQueryTrackInfo methodPtr=NULL;
+
+/* For calling the method in the CWCDTrack class. Linking to the DLL would require the
+   new audio classes. By dynamically querying the method the media folder works without
+   installing the audio classes. */  
+typedef ULONG   SOMLINK somTP_MMCDTrack_cwmmQueryTrackInfo(MMCDTrack *somSelf,
+		PSZ chrString,
+		ULONG ulSize,
+		int iWhich);
+typedef somTP_MMCDTrack_cwmmQueryTrackInfo *somTD_MMCDTrack_cwmmQueryTrackInfo;
+
+somTD_MMCDTrack_cwmmQueryTrackInfo methodPtrCDTrack=NULL;
+
+
+SOMClass* somhlpGetSomClass(char* chrClassName)
+{
+  somId    mySomId;
+  SOMClass *somClass;
+
+  if((mySomId=somIdFromString(chrClassName))==NULLHANDLE)
+    return NULLHANDLE;
+
+  //  somClass=SOMClassMgrObject->somClassFromId(mySomId);
+  somClass=SOMClassMgrObject->somFindClass(mySomId, 1, 1);
+  SOMFree(mySomId);
+
+  return somClass;
+}
+
+BOOL somhlpQueryCWAudioMethodPtr(CWMediaFolder *thisPtr)
+{
+  somId    mySomId;
+  SOMClass *mmAudioClass;
+
+  if(!methodPtr) {
+    /* If we don't have the method pointer yet, get it. */
+    mmAudioClass=somhlpGetSomClass("MMAudio");
+    if(mmAudioClass) {
+      /* We have the class object */
+      mySomId=somIdFromString("cwmmQueryTrackInfo");/* A new method in MMAudio (replacement for MMAudio) */ 
+      methodPtr=(somTD_MMAudio_cwmmQueryTrackInfo) mmAudioClass->somFindSMethod(mySomId);
+      SOMFree(mySomId);
+      return TRUE;
+    }
+    return FALSE;
+  }
+  else
+    return TRUE;
+#if 0
+  if(!methodPtr) {
+    /* If we don't have the method pointer yet, get it. */
+    /* Get class object of MMAudio. */
+    if((mySomId=somIdFromString("MMAudio"))==NULLHANDLE)
+      return FALSE;
+    mmAudioClass=SOMClassMgrObject->somClassFromId(mySomId);
+    SOMFree(mySomId);
+    if(mmAudioClass) {
+      /* We have the class object */
+      mySomId=somIdFromString("cwmmQueryTrackInfo");/* A new method in MMAudio (replacement for MMAudio) */ 
+      methodPtr=(somTD_MMAudio_cwmmQueryTrackInfo) mmAudioClass->somFindSMethod(mySomId);
+      SOMFree(mySomId);
+      return TRUE;
+    }
+    return FALSE;
+  }
+  else
+    return TRUE;
+#endif
+}
+
+BOOL somhlpQueryCWCDTrackMethodPtr(CWMediaFolder *thisPtr)
+{
+  somId    mySomId;
+  SOMClass *mmCDTrackClass;
+
+  if(!methodPtrCDTrack) {
+    /* If we don't have the method pointer yet, get it. */
+    /* Get class object of CWCDTrack. */
+    mmCDTrackClass=somhlpGetSomClass("MMCDTrack");
+    if(mmCDTrackClass) {
+      /* We have the class object */
+      mySomId=somIdFromString("cwmmQueryTrackInfo");/* A new method in CWAudio/CWCDTrack (replacement for MMAudio) */ 
+      methodPtrCDTrack=(somTD_MMCDTrack_cwmmQueryTrackInfo) mmCDTrackClass->somFindSMethod(mySomId);
+      SOMFree(mySomId);
+      return TRUE;
+    }
+    return FALSE;
+  }
+  else
+    return TRUE;
+}
+
+SOMClass* somhlpQueryMMAudioClass(void)
+{
+  somId mySomId;
+  static SOMClass *mAudioClass=NULL;
+
+
+  if(!mAudioClass)
+    mAudioClass=somhlpGetSomClass("MMAudio");
+  
+  return mAudioClass;
+
+#if 0
+  if(!mAudioClass) {
+    if((mySomId=somIdFromString("MMAudio"))!=NULLHANDLE) {
+      mAudioClass=(SOMClass*)SOMClassMgrObject->somClassFromId(mySomId);
+      SOMFree(mySomId);
+    }
+  }
+  return mAudioClass;
+#endif
+}
+
+
+
+
Index: /tags/CWMM-0.3.0_GA/mediafolder/c/helper/windowhelper.cpp
===================================================================
--- /tags/CWMM-0.3.0_GA/mediafolder/c/helper/windowhelper.cpp	(revision 213)
+++ /tags/CWMM-0.3.0_GA/mediafolder/c/helper/windowhelper.cpp	(revision 213)
@@ -0,0 +1,339 @@
+#define INCL_DOSERRORS
+#include "mediafolder.hh"
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include "mediafolderres.h"
+#include <sys_funcs.h>
+
+/* typedef for somTP_MMAudio_cwmmQueryTrackInfo */
+/* For calling the method in the CWAudio class. Linking to the DLL would require the
+   new audio classes. By dynamically querying the method the media folder works without
+   installing the audio classes. */  
+#include "cwmmquerytrackinfo.h"
+
+#define IDINFO_NAME              1
+#define IDINFO_ARTIST            2
+#define IDINFO_ALBUM             3
+#define IDINFO_YEAR              4
+#define IDINFO_COMMENT           5
+#define IDINFO_GENRE             6
+
+#define IDINFO_PLAYTIME          7
+
+/* Pointer into window words */
+extern ULONG ulQWP_CONTAINERPROC;
+extern ULONG ulQWP_THISPTR;
+extern ULONG ulQWL_TOPCTRLHWND;
+extern ULONG ulQWL_BOTTOMCTRLHWND;
+extern ULONG ulQWL_RIGHTCTRLHWND;
+extern ULONG ulQWL_LEFTCTRLHWND;
+
+extern BOOL somhlpQueryCWAudioMethodPtr(CWMediaFolder *thisPtr);
+extern SOMClass* somhlpGetSomClass(char* chrClassName);
+
+extern HMODULE queryResModuleHandle(void);
+
+/*
+
+  Functions to get the frame controls from the folder frame HWND.
+  If anytime the window hierarchy changes only these functions must be
+  changed but not dozens of places all over the source.
+
+  The HWNDs of the controls are saved in the window words of the reregistered frame for
+  easy access. Strivtly spoken no need to have the HWND in the instance data. Only the
+  frame hwnd must be available.
+
+ */
+
+/* Get the HWND of the frame control at the top. That's not the control
+   with the buttons and the time display. The play controls are located on
+   another frame (use playControlDialogFromFrameHWND() to get it). */
+HWND topControlFromFrameHWND(HWND hwndFrame)
+{
+  return WinQueryWindowULong(hwndFrame, ulQWL_TOPCTRLHWND);
+}
+
+/* Get the HWND of the frame control at the bottom (status bar) */
+HWND bottomControlFromFrameHWND(HWND hwndFrame)
+{
+  return WinQueryWindowULong(hwndFrame, ulQWL_BOTTOMCTRLHWND);
+}
+
+/* Get the HWND of the play control dialog. This Dialog is on top of
+   the top frame control. */
+HWND playControlDialogFromFrameHWND(HWND hwndFrame)
+{
+  return WinWindowFromID(topControlFromFrameHWND(hwndFrame), IDDLG_TOPMIDDLE);
+}
+
+/* Get the HWND of the time display static text control. */
+HWND playTimeControlFromFrameHWND(HWND hwndFrame)
+{
+  return WinWindowFromID(playControlDialogFromFrameHWND(hwndFrame), IDST_PLAYTIME);
+}
+
+
+/* Show/hide the text in the playtime area. Useful for blinking. */
+void showPlayTimeDisplay(CWMediaFolder *thisPtr, BOOL bShow)
+{
+  WinShowWindow(playTimeControlFromFrameHWND(thisPtr->hwndMFldrFrame), bShow);
+}
+
+/* Toggle the visibility of the text in the playtime area. Useful for blinking. */
+void togglePlayTimeDisplayVisibility(CWMediaFolder *thisPtr)
+{
+  if(WinIsWindowVisible(playTimeControlFromFrameHWND(thisPtr->hwndMFldrFrame)))
+    WinShowWindow(playTimeControlFromFrameHWND(thisPtr->hwndMFldrFrame), FALSE);
+  else
+    WinShowWindow(playTimeControlFromFrameHWND(thisPtr->hwndMFldrFrame), TRUE);
+}
+
+static HWND _findOpenMediaFldrView(CWMediaFolder *thisPtr)
+{
+  PVIEWITEM pViewItem;
+
+  pViewItem=thisPtr->wpFindViewItem(VIEW_DETAILS|VIEW_CONTENTS, NULLHANDLE);
+  if(pViewItem)
+    return pViewItem->handle;
+
+  return NULLHANDLE;
+}
+
+/*
+
+  V0.2.8 (08.09.2003)
+  This function sets the window list entry text, the folder frame title and the playtime text.
+
+  */
+static void setAllTitles(CWMediaFolder *thisPtr, char * chrText)
+{
+  HSWITCH hSwitch;
+  char chrBuff[100]={0};
+  SWP swp;
+
+  my_strlcpy(chrBuff, thisPtr->wpQueryTitle(), sizeof(chrBuff));
+  if(chrText && *chrText)
+    {
+      strncat(chrBuff," - ", sizeof(chrBuff)-1-strlen(chrBuff));
+      strncat(chrBuff, chrText, sizeof(chrBuff)-1-strlen(chrBuff));
+    }
+  
+  /* Set folder playtimer control */
+  WinSetWindowText(playTimeControlFromFrameHWND(thisPtr->hwndMFldrFrame), chrText);
+  /* 
+     Register as a view so the 'Details view' in folder titles is changed to
+     the given text.
+     Changing the window title is not sufficient because the WPS only displays the number
+     of characters in the switch list the object title had during first registering of a view.
+     If the window title (or the object title) is changed later it will be truncated and the
+     view is appended to the then truncated title. This is even true if the switch list title
+     is directly changed using WinChangeSwitchEntry(). Probably the window list window is
+     subclassed by the WPS to append the current view.
+     */
+  thisPtr->wpRegisterView(thisPtr->hwndMFldrFrame, chrText);
+
+  /*
+    If the window is minimized change also the window text so the info is shown
+    in the minimized view. This will not change the length of the title in the window list entry.
+    The string to be shown is built starting with the object title (as the WPS does) so it
+    doesn't matter the switch list entry length is limited.
+    */
+  WinQueryWindowPos(thisPtr->hwndMFldrFrame, &swp);
+  if(swp.fl & SWP_MINIMIZE)
+    WinSetWindowText(thisPtr->hwndMFldrFrame, chrBuff);
+ 
+  /* The switch list must also be changed because wpRegisterView()
+     only changes the window list text once. */
+  if((hSwitch=WinQuerySwitchHandle(thisPtr->hwndMFldrFrame,0))!=NULLHANDLE)
+    {
+      SWCNTRL swCtrl;
+
+      if(!WinQuerySwitchEntry(hSwitch, &swCtrl))
+        {
+          strncpy(swCtrl.szSwtitle, chrBuff, MAXNAMEL+4);
+          swCtrl.szSwtitle[MAXNAMEL+3]=0;
+          WinChangeSwitchEntry( hSwitch, &swCtrl);
+        }
+    }
+}
+
+#if 0
+static void setAllTitles(CWMediaFolder *thisPtr, const char * chrText)
+{
+  char chrBuff[100]={0};
+  HSWITCH hSwitch;
+
+  my_strlcpy(chrBuff,thisPtr->wpQueryTitle(), sizeof(chrBuff));
+  strncat(chrBuff," - ", sizeof(chrBuff)-1-strlen(chrBuff));
+  strncat(chrBuff, chrText, sizeof(chrBuff)-1-strlen(chrBuff));
+
+  WinSetWindowText(playTimeControlFromFrameHWND(thisPtr->hwndMFldrFrame), chrText);
+  //  WinSetWindowText(thisPtr->hwndMFldrFrame, chrBuff);
+  thisPtr->wpRegisterView(thisPtr->hwndMFldrFrame, chrBuff);
+  if((hSwitch=WinQuerySwitchHandle(thisPtr->hwndMFldrFrame,0))!=NULLHANDLE)
+    {
+      SWCNTRL swCtrl;
+      if(!WinQuerySwitchEntry(hSwitch, &swCtrl))
+        {                    
+          strncpy(swCtrl.szSwtitle, chrBuff, MAXNAMEL+4);
+          swCtrl.szSwtitle[MAXNAMEL+3]=0;
+          WinChangeSwitchEntry( hSwitch, &swCtrl);
+        }
+    }
+
+}
+#endif
+
+/* Set the text in the playtime area to 'theText' */
+void setPlayTimeText2(CWMediaFolder *thisPtr, char * theText)
+{
+  setAllTitles(thisPtr, theText);
+  //     WinSetWindowText(playControlDialogFromFrameHWND(thisPtr->hwndMFldrFrame), theText);
+}
+
+/* This funktion sets the playtime display according to the user settings.
+   Supported are remaining time, elapsed time and ID3-tag display */
+void setPlayTimeText(CWMediaFolder *thisPtr)
+{
+  char text[100];
+  ULONG ulTemp;
+  MMAudio* cwAudio;
+
+  switch(thisPtr->usWhichDisplay)
+    {
+    case 1:
+      /* Remaining */
+      ulTemp=thisPtr->ulTotalLength/1000-thisPtr->ulPos;
+      sprintf(text,"-%d:%02d",
+              ulTemp/60,
+              ulTemp%60);
+      //      WinSetWindowText(WinWindowFromID(thisPtr->hwndTopMiddle, IDST_PLAYTIME), text);
+
+      setAllTitles(thisPtr, text);
+
+      break;
+    case 2:
+      {
+        ULONG ulTemp=WinQueryWindowULong(WinWindowFromID(thisPtr->hwndTopMiddle, IDST_PLAYTIME), QWL_USER);
+        SOMClass *cwAudioClass=somhlpGetSomClass("MMAudio");
+
+        /* Show ID3 tag */
+        cwAudio=thisPtr->cwQueryCurrentlyPlayingObject();
+        if(somIsObj(cwAudio)) {
+          if(!methodPtr)
+            somhlpQueryCWAudioMethodPtr(thisPtr);
+          sprintf(text,"");
+          if(methodPtr && somIsObj(cwAudioClass) && cwAudio->somIsA(cwAudioClass) ){/* Query playtime in secs */
+            char* chrPtr=text;
+            text[0]=0;
+
+            if(ulTemp>=15)
+              text[0]=0;
+            else if(ulTemp>=12) 
+              methodPtr(cwAudio, chrPtr, sizeof(text), IDINFO_GENRE);
+            else if(ulTemp>=9)
+              methodPtr(cwAudio, chrPtr, sizeof(text), IDINFO_COMMENT);
+            else if(ulTemp>=6)
+              methodPtr(cwAudio, chrPtr, sizeof(text), IDINFO_ALBUM);
+            else if(ulTemp>=3)
+              methodPtr(cwAudio, chrPtr, sizeof(text), IDINFO_NAME);
+            else if(ulTemp>=0)
+              methodPtr(cwAudio, chrPtr, sizeof(text), IDINFO_ARTIST);
+          }
+          else
+            ulTemp=15; /* Show playtime for midi files */
+          
+          if(ulTemp>=15||!strlen(text)) {
+            /* Play time */
+            sprintf(text,"%d:%02d",
+                    thisPtr->ulPos/60,
+                    thisPtr->ulPos%60);
+          }
+#if 0
+          else
+            if(!(ulTemp%3)) {
+              /* Switch display every 3 secs */
+            }
+#endif
+
+          setAllTitles(thisPtr, text);
+
+          //   WinSetWindowText(WinWindowFromID(thisPtr->hwndTopMiddle, IDST_PLAYTIME), text);
+          // WinSetWindowText(WinQueryWindow(WinQueryWindow(thisPtr->hwndTopMiddle, QW_PARENT), QW_PARENT), "12345\n6789");
+
+          ulTemp++;
+          if(ulTemp==18)
+            ulTemp=0;
+          WinSetWindowULong(WinWindowFromID(thisPtr->hwndTopMiddle, IDST_PLAYTIME), QWL_USER, ulTemp);
+          break;
+        }
+      }
+      /* Fall through to playtime */
+    case 0:
+      /* Elapsed time */
+      sprintf(text,"%d:%02d",
+              thisPtr->ulPos/60,
+              thisPtr->ulPos%60);
+
+      setAllTitles(thisPtr, text);
+      //  WinSetWindowText(WinWindowFromID(thisPtr->hwndTopMiddle, IDST_PLAYTIME), text);
+      break;
+    default:
+      break;
+    }
+}
+
+void _resetDisplay(CWMediaFolder *thisPtr)
+{
+  setAllTitles(thisPtr, "");
+  WinSetWindowText(playTimeControlFromFrameHWND(thisPtr->hwndMFldrFrame), "0:00");
+  WinSetWindowULong(playTimeControlFromFrameHWND(thisPtr->hwndMFldrFrame), QWL_USER, 0);
+  WinPostMsg( WinWindowFromID(playTimeControlFromFrameHWND(thisPtr->hwndMFldrFrame), IDSL_POSBAR),
+              SLM_SETSLIDERINFO,
+              MPFROM2SHORT(SMA_SLIDERARMPOSITION,SMA_INCREMENTVALUE),
+              MPFROMLONG(0L));
+  //  thisPtr->wpRegisterView(thisPtr->hwndMFldrFrame, "");
+}
+
+/* This function sets the repeat button checkstate */
+void winCheckRepeatButton(CWMediaFolder *thisPtr)
+{
+  if(thisPtr->ulFlags & FLAG_REPEAT)
+    WinCheckButton(playControlDialogFromFrameHWND(thisPtr->hwndMFldrFrame), IDCB_REPEAT, 1);
+  else
+    WinCheckButton(playControlDialogFromFrameHWND(thisPtr->hwndMFldrFrame), IDCB_REPEAT, 0);
+}
+
+/* This function sets the position of the volume slider */
+void winSetVolumeSlider(CWMediaFolder *thisPtr)
+{
+  WinSendMsg( WinWindowFromID(playControlDialogFromFrameHWND(thisPtr->hwndMFldrFrame), IDSL_VOLUME),
+              SLM_SETSLIDERINFO,
+              MPFROM2SHORT(SMA_SLIDERARMPOSITION,SMA_INCREMENTVALUE),
+              MPFROMLONG( thisPtr->ulVolume));
+}
+
+
+void contextMenu(HWND hwnd, USHORT usItem, BOOL fCheckItem)
+{
+  POINTL ptl;
+  HWND   hwndPopup;
+
+  hwndPopup = WinLoadMenu(hwnd, queryResModuleHandle(), ID_MENUTIMECONTEXT) ;
+  if (hwndPopup == NULLHANDLE) {
+    DosBeep(100,1000);
+    return;
+  }
+  if(fCheckItem)
+    WinSendMsg(hwndPopup,MM_SETITEMATTR,MPFROM2SHORT(usItem, TRUE), MPFROM2SHORT(MIA_CHECKED,MIA_CHECKED));
+
+  WinQueryPointerPos(HWND_DESKTOP, &ptl) ;
+  WinMapWindowPoints(HWND_DESKTOP,hwnd,&ptl,1);
+  WinPopupMenu(hwnd, hwnd, hwndPopup, 
+               ptl.x, ptl.y, 0, PU_HCONSTRAIN | PU_VCONSTRAIN |
+               PU_KEYBOARD | PU_MOUSEBUTTON1 | PU_MOUSEBUTTON2 | PU_NONE  ); 
+  
+}
+
+
Index: /tags/CWMM-0.3.0_GA/mediafolder/c/m3ufolder/m3ufolderoverriddenwpclsmethods.cpp
===================================================================
--- /tags/CWMM-0.3.0_GA/mediafolder/c/m3ufolder/m3ufolderoverriddenwpclsmethods.cpp	(revision 213)
+++ /tags/CWMM-0.3.0_GA/mediafolder/c/m3ufolder/m3ufolderoverriddenwpclsmethods.cpp	(revision 213)
@@ -0,0 +1,93 @@
+/*
+ * This file is (C) Chris Wohlgemuth 2002
+ * 
+ * It's part of the media folder distribution
+ */
+
+#include "m3ufolder.hh"
+
+extern char chrInstallDir[CCHMAXPATH];
+
+ULONG launchRexx( PSZ pszTitle, PSZ rexxFile, PSZ parameters);
+HMODULE queryModuleHandle(PSZ pszClassName);
+HMODULE queryResModuleHandle(void);
+BOOL _queryHelpLibrary(char * chrBuffer, int iSize);
+BOOL getMessage(char* text,ULONG ulID, LONG lSizeText, HMODULE hResource,HWND hwnd);
+HMODULE queryModuleHandle(PSZ pszClassName);
+
+/* Overriden function which returns our class name */
+PSZ M_CWM3UFolder::wpclsQueryTitle()
+{
+  static char chrTitle[40];
+  if(getMessage(chrTitle, IDSTR_TITLEM3UFOLDER,sizeof(chrTitle), queryResModuleHandle(), HWND_DESKTOP))
+    return chrTitle;
+  /* Fall back in case of error */
+  return "M3U editor";
+}
+
+ULONG M_CWM3UFolder::wpclsQueryStyle()
+{
+  return (M_CWMediaFolder::wpclsQueryStyle()|CLSSTYLE_NEVERTEMPLATE|CLSSTYLE_DONTTEMPLATE);
+}
+
+BOOL M_CWM3UFolder::wpclsCreateDefaultTemplates(WPObject * wpObject)
+{
+  return TRUE;
+}
+
+void M_CWM3UFolder::wpclsInitData()
+{
+  static BOOL bObjectsCreated=FALSE;
+
+  /* Call parent */
+  M_CWMediaFolder::wpclsInitData();
+  
+  /* Be sure we have our install dir */
+  queryModuleHandle("M_CWM3UFolder");
+}
+
+BOOL M_CWM3UFolder::wpclsQueryDefaultHelp(PULONG HelpPanelId,PSZ HelpLibrary)
+{
+  if(HelpLibrary)
+    _queryHelpLibrary(HelpLibrary, CCHMAXPATH);
+
+  if(HelpPanelId)
+    *HelpPanelId= IDHLP_M3UFOLDERMAIN;
+	
+  return TRUE;
+}
+
+/* Overriden function which returns the custom icon */
+ULONG M_CWM3UFolder::wpclsQueryIconData(PICONINFO pIconInfo)
+{
+  //  HMODULE hResource=queryResModuleHandle();
+  HMODULE hResource=queryModuleHandle("M_CWM3UFolder");
+
+  if(!hResource)
+    return M_CWProgFolder::wpclsQueryIconData(pIconInfo);
+
+  if (pIconInfo)   {
+    pIconInfo->fFormat = ICON_RESOURCE;
+    pIconInfo->hmod    = hResource;
+    pIconInfo->resid   = IDICON_M3UFILE;
+  } /* endif */
+
+  return ( sizeof(ICONINFO) );
+}
+
+ULONG M_CWM3UFolder::wpclsQueryIconDataN(PICONINFO pIconInfo, ULONG ulIconIndex)
+{
+  //HMODULE hResource=queryResModuleHandle();
+  HMODULE hResource=queryModuleHandle("M_CWM3UFolder");
+
+  if(!hResource)
+    return M_CWProgFolder::wpclsQueryIconDataN(pIconInfo, ulIconIndex);
+
+  if (pIconInfo)   {
+    pIconInfo->fFormat = ICON_RESOURCE;
+    pIconInfo->hmod    = hResource;
+    pIconInfo->resid   = IDICON_M3UFILE;
+  } /* endif */
+  return ( sizeof(ICONINFO) );
+}
+
Index: /tags/CWMM-0.3.0_GA/mediafolder/c/m3ufolder/m3ufolderoverriddenwpmethods.cpp
===================================================================
--- /tags/CWMM-0.3.0_GA/mediafolder/c/m3ufolder/m3ufolderoverriddenwpmethods.cpp	(revision 213)
+++ /tags/CWMM-0.3.0_GA/mediafolder/c/m3ufolder/m3ufolderoverriddenwpmethods.cpp	(revision 213)
@@ -0,0 +1,919 @@
+/*
+ * This file is (C) Chris Wohlgemuth 2002-2003
+ *
+ * It's part of the Media-Folder distribution
+ */
+
+#define INCL_DOSERRORS
+
+#define INCL_REXXSAA
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <ctype.h>
+#include "m3ufolder.hh"
+#include "except.h"
+#include <rexxsaa.h>                   /* needed for RexxStart()     */
+
+#include "mediafolderres.h"
+#include "cwcdtrack.hh"
+
+#include "sys_funcs.h"
+#include "menu_funcs.h"
+
+#if 0
+#define  _PMPRINTF_
+#include "PMPRINTF.H"
+#endif
+
+extern BOOL g_fRegisteredWindowClass;
+extern ULONG g_ulFrameDataOffset;
+
+/* The following offsets are calclated in wpOpen() of media folder */
+extern ULONG ulQWP_CONTAINERPROC;
+extern ULONG ulQWP_THISPTR;
+extern ULONG ulQWL_TOPCTRLHWND;
+extern ULONG ulQWL_BOTTOMCTRLHWND;
+extern ULONG ulQWL_RIGHTCTRLHWND;
+extern ULONG ulQWL_LEFTCTRLHWND;
+
+extern LOADEDBITMAP allBMPs[];
+extern PFNWP pfnwpGenericFrame;
+extern char chrInstallDir[];
+
+BOOL getMessage(char* text,ULONG ulID, LONG lSizeText, HMODULE hResource,HWND hwnd);
+ULONG messageBox( char* text, ULONG ulTextID , LONG lSizeText,
+                  char* title, ULONG ulTitleID, LONG lSizeTitle,
+                  HMODULE hResource, HWND hwnd, ULONG ulFlags);
+HMODULE queryResModuleHandle(void);
+void errorResource();
+
+MRESULT EXPENTRY topCtrlDialogProc(HWND hwnd, ULONG msg, MPARAM mp1, MPARAM mp2) ;
+MRESULT EXPENTRY rightCtrlDialogProc(HWND hwnd, ULONG msg, MPARAM mp1, MPARAM mp2) ;
+MRESULT EXPENTRY leftCtrlDialogProc(HWND hwnd, ULONG msg, MPARAM mp1, MPARAM mp2) ;
+MRESULT EXPENTRY bottomCtrlDialogProc(HWND hwnd, ULONG msg, MPARAM mp1, MPARAM mp2) ;
+MRESULT EXPENTRY mediaFrameProc(HWND hwnd, ULONG msg, MPARAM mp1, MPARAM mp2) ;
+MRESULT EXPENTRY mediaFldrContainerProc(HWND hwnd, ULONG msg, MPARAM mp1, MPARAM mp2) ;
+
+
+void _Optlink rexxThreadFunc (void *arg);
+
+SOMClass* somhlpGetSomClass(char* chrClassName);
+
+//void HlpWriteToTrapLog(const char* chrFormat, ...);
+
+void writeLog(const char* chrFormat, ...)
+{
+  char logNameLocal[CCHMAXPATH];
+  FILE *fHandle;
+
+  sprintf(logNameLocal,"d:\\cwmm.log");
+  fHandle=fopen(logNameLocal,"a");
+  if(fHandle) {
+    va_list arg_ptr;
+    void *tb;
+
+    va_start (arg_ptr, chrFormat);
+    vfprintf(fHandle, chrFormat, arg_ptr);
+    va_end (arg_ptr);
+    //    fprintf(fHandle,logText);
+    fclose(fHandle);
+  }
+}
+
+/*****************************************************/
+/*                                                   */
+/* New container procedure so tabbing to the play    */
+/* control dialog works.                             */
+/*                                                   */
+/*****************************************************/
+MRESULT EXPENTRY m3uFldrContainerProc(HWND hwnd, ULONG msg, MPARAM mp1, MPARAM mp2)
+{
+  CWMediaFolder* thisPtr;
+  HWND hwndDialog;
+  PFNWP pfnwpContainer;
+
+  switch(msg)
+    {
+    case WM_CONTROL:
+      if(SHORT2FROMMP(mp1)==CN_DROP) {
+        /* Get frame handle */
+        if((hwndDialog=WinQueryWindow(hwnd,QW_PARENT))!=NULLHANDLE)
+          {
+            CWM3UFolder *thisPtr;
+            thisPtr=(CWM3UFolder*) WinQueryWindowULong(hwndDialog,ulQWP_THISPTR);
+            if(somIsObj(thisPtr))
+              thisPtr->fContentsChanged=TRUE;
+          }
+      }
+      break;
+    default:
+      break;
+    }
+
+  /* Any other message is handled by the folder container procedure */
+  if((hwndDialog=WinQueryWindow(hwnd,QW_PARENT))!=NULLHANDLE) {
+    pfnwpContainer=(PFNWP)WinQueryWindowULong( hwndDialog, ulQWP_CONTAINERPROC);
+    if(pfnwpContainer)
+      return pfnwpContainer(hwnd, msg, mp1, mp2);
+  }
+#if 0
+  if((hwndDialog=WinQueryWindow(hwnd,QW_PARENT))!=NULLHANDLE)
+    {
+      if((hwndDialog=WinWindowFromID(hwndDialog,IDDLG_TOPFRAME))!=NULLHANDLE)
+        {
+          thisPtr=(CWMediaFolder*) WinQueryWindowULong(hwndDialog,QWL_USER);
+          if(somIsObj(thisPtr))
+            if(thisPtr->pfnwpContainer)
+              return thisPtr->pfnwpContainer(hwnd, msg, mp1, mp2);
+        }
+    }
+#endif
+
+  return WinDefWindowProc(hwnd, msg, mp1, mp2);
+}
+
+BOOL CWM3UFolder::cwInsertAllTracks(char* chrM3UFile)
+{
+  INSERTTRACKPARMS * threadParms;
+  ULONG ulError;
+
+  if((threadParms=(INSERTTRACKPARMS*)wpAllocMem(sizeof(INSERTTRACKPARMS), &ulError))==NULLHANDLE)
+    return FALSE;
+  threadParms->thisPtr=this;
+  sprintf(threadParms->chrRexxScript,"%s%s",  chrInstallDir, RX_INSERT_PLAYLISTTRACKS);
+
+  _beginthread(rexxThreadFunc,NULL,8192*16,(void*)threadParms); //Fehlerbehandlung fehlt
+  return TRUE;
+}
+
+
+
+/****************************************************************************/
+/*                                                                          */
+/* This procedure handles the frame extension of the folder at the top      */
+/*                                                                          */
+/* The playcontrol dialog is a child of this 'background' dialog.           */
+/*                                                                          */
+/****************************************************************************/
+MRESULT EXPENTRY m3uTopCtrlDialogProc(HWND hwnd, ULONG msg, MPARAM mp1, MPARAM mp2)
+{
+
+  switch(msg)
+    {
+      /*****************************************************/
+      /* Init the dialog                                   */
+      /*****************************************************/
+    case WM_INITDLG :
+      {
+        ULONG ulStyle;
+        SWP swp;
+
+        WinSetWindowULong(hwnd,QWL_USER,(ULONG)PVOIDFROMMP(mp2));//Save object ptr.
+        WinQueryWindowPos(WinQueryWindow(hwnd,QW_PARENT),&swp);
+        /* Set dialog font to WarpSans for Warp 4 and above */
+        if(SysQueryOSRelease()>=40) {
+          WinSetPresParam(hwnd,
+                          PP_FONTNAMESIZE,(ULONG)sizeof(DEFAULT_DIALOG_FONT),
+                          DEFAULT_DIALOG_FONT );
+        }
+        return (MRESULT)FALSE;
+      }
+    case WM_CHAR:
+      // Set focus to container so the key will be processed as usual
+      WinSetFocus(HWND_DESKTOP, WinWindowFromID(WinQueryWindow(hwnd,QW_PARENT),FID_CLIENT));
+      return WinSendMsg(WinWindowFromID(WinQueryWindow(hwnd,QW_PARENT),FID_CLIENT),msg,mp1,mp2);
+
+      /*****************************************************/
+      /* Paint the background.                             */
+      /*****************************************************/
+    case WM_PAINT:
+      {
+        HPS hps;
+        RECTL rcl, rclSave, rclSource;
+        SWP swp;
+
+        if(allBMPs[CTRLIDX_BOTTOM].hbm) {
+          POINTL ptl;
+          LONG lTemp;
+
+          hps=WinBeginPaint(hwnd, NULL, &rcl);
+          rclSource.xLeft=0;
+          rclSource.yBottom=0;
+          rclSource.yTop=allBMPs[CTRLIDX_BOTTOM].bmpInfoHdr.cy;
+          rclSource.xRight=allBMPs[CTRLIDX_BOTTOM].bmpInfoHdr.cx;
+          lTemp=rcl.xLeft/rclSource.xRight;
+          ptl.x=lTemp*rclSource.xRight;
+          lTemp=rcl.yBottom/rclSource.yTop;
+          lTemp*=rclSource.yTop;
+          while(ptl.x<rcl.xRight) {
+            ptl.y=lTemp;
+            while(ptl.y<rcl.yTop) {/* y direction */
+              WinDrawBitmap(hps, allBMPs[CTRLIDX_BOTTOM].hbm,
+                            &rclSource,
+                            (PPOINTL)&ptl,
+                            0, 0,
+                            DBM_IMAGEATTRS);
+              ptl.y+=allBMPs[CTRLIDX_BOTTOM].bmpInfoHdr.cy;
+            };
+            ptl.x+=allBMPs[CTRLIDX_BOTTOM].bmpInfoHdr.cx;
+          };
+          WinEndPaint(hps);
+          return (MRESULT)0;
+        }
+#if 0
+        hps=WinBeginPaint(hwnd, NULLHANDLE,NULL);
+        /* Get Window size */
+        WinQueryWindowRect(hwnd, &rcl);
+        rclSave=rcl;
+        /* Get size and pos of control area */
+        WinQueryWindowPos(WinWindowFromID(hwnd, IDDLG_TOPMIDDLE),&swp);
+        /* Left area */
+        rcl.xRight=swp.x;
+        rclSource.xLeft=0;
+        rclSource.yBottom=0;
+        rclSource.yTop=allBMPs[CTRLIDX_TOPLEFT].bmpInfoHdr.cy;
+        rclSource.xRight=allBMPs[CTRLIDX_TOPLEFT].bmpInfoHdr.cx;
+        WinDrawBitmap(hps, allBMPs[CTRLIDX_TOPLEFT].hbm,
+                      &rclSource,
+                      (PPOINTL)&rclSave,
+                      0, 0,
+                      DBM_IMAGEATTRS | DBM_STRETCH);
+        //SysWriteToTrapLog("hbm: %x , yTop: %d xRight; %d\n", allBMPs[CTRLIDX_TOPLEFT].hbm, rclSource.yTop,rclSource.xRight);
+        //  WinFillRect(hps, &rclSave, CLR_RED);
+        /* Right area */
+        rclSave.xLeft=swp.x+swp.cx;
+        rclSource.xLeft=0;
+        rclSource.yBottom=0;
+        rclSource.yTop=allBMPs[CTRLIDX_TOPRIGHT].bmpInfoHdr.cy;
+        rclSource.xRight=allBMPs[CTRLIDX_TOPRIGHT].bmpInfoHdr.cx;
+        WinDrawBitmap(hps, allBMPs[CTRLIDX_TOPRIGHT].hbm,
+                      &rclSource,
+                      (PPOINTL)&rclSave,
+                      0, 0,
+                      DBM_IMAGEATTRS | DBM_STRETCH);
+                WinFillRect(hps, &rclSave, CLR_BLUE);
+        WinEndPaint(hps);
+        return (MRESULT) 0;
+#endif
+        break;
+      }
+    default:
+      break;
+    }
+  return WinDefDlgProc(hwnd, msg, mp1, mp2);
+}
+
+/************************************************************
+ *                                                          *
+ * This frame proc handles the about menuitem of the        *
+ * Warp 4 menu bar and removes some menu items.             *
+ *                                                          *
+************************************************************/
+MRESULT EXPENTRY m3uFrameProc(HWND hwnd, ULONG msg, MPARAM mp1, MPARAM mp2)
+{
+  CWM3UFolder* thisPtr;
+  HWND hwndDialog;
+  MENUITEM mi;
+  char text[100];
+
+  switch (msg)
+    {
+    case WM_INITMENU:
+      if((hwndDialog=WinWindowFromID(hwnd,IDDLG_TOPFRAME))!=NULLHANDLE)
+        {
+          thisPtr=(CWM3UFolder*) WinQueryWindowULong(hwndDialog,QWL_USER);
+          if(somIsObj(thisPtr)) {
+
+            HMODULE hResource=queryResModuleHandle();
+            switch(thisPtr->usLastSelMenuItem)
+              {
+//#ifndef ECS
+              case 0x2d3:/* Help menu */
+                {
+                  if(hResource) {
+                    /* insert separator */
+                    getMessage(text, IDSTR_M3ULISTHELP ,sizeof(text), hResource, hwnd);
+                    menuInsertMenuItem(HWNDFROMMP(mp2), NULL, 0, ID_M3ULISTHELP, text);
+                    menuInsertMenuSeparator(HWNDFROMMP(mp2), NULL, 1);
+                    menuInsertMenuSeparator(HWNDFROMMP(mp2), NULL, MIT_END);
+                    /* Insert 'About' item */
+                    getMessage(text, IDSTR_MENUABOUT ,sizeof(text), hResource, hwnd);
+                    menuInsertMenuItem(HWNDFROMMP(mp2), NULL, MIT_END, ID_ABOUTITEM, text);
+                    break;
+                  }
+                  break;
+                }
+//#endif
+              case 0x2d1: /* View menu */
+                /* Remove change to Tree from menubar menu */
+                WinSendMsg(HWNDFROMMP(mp2),MM_REMOVEITEM,MPFROM2SHORT(717,TRUE),0);
+                /* Icon view */
+                WinSendMsg(HWNDFROMMP(mp2),MM_REMOVEITEM,MPFROM2SHORT(0x2cc,TRUE),0);
+                /* Arrange */
+                WinSendMsg(HWNDFROMMP(mp2),MM_REMOVEITEM,MPFROM2SHORT(0x135,TRUE),0);
+                WinSendMsg(HWNDFROMMP(mp2),MM_REMOVEITEM,MPFROM2SHORT(0x136,TRUE),0);
+                //     WinSendMsg(HWNDFROMMP(mp2),MM_REMOVEITEM,MPFROM2SHORT(0x,TRUE),0);
+
+                break;
+              case 0x2d0: /* Edit menu */
+                /* Move */
+                WinSendMsg(HWNDFROMMP(mp2),MM_REMOVEITEM,MPFROM2SHORT(0x6b,TRUE),0);
+                /* Insert */
+                WinSendMsg(HWNDFROMMP(mp2),MM_REMOVEITEM,MPFROM2SHORT(0x2cb,TRUE),0);
+                /* Create shadow */
+                WinSendMsg(HWNDFROMMP(mp2),MM_REMOVEITEM,MPFROM2SHORT(0x13c,TRUE),0);
+                /* Create */
+                WinSendMsg(HWNDFROMMP(mp2),MM_REMOVEITEM,MPFROM2SHORT(0x65,TRUE),0);
+                break;
+              default:
+                break;
+              }
+          }
+        }
+      break;
+      /* Prevent title changing by XWP */
+    case WM_SETWINDOWPARAMS:
+      {
+        PWNDPARAMS pwp=(PWNDPARAMS)PVOIDFROMMP(mp1);
+        if(!pwp)
+          break;
+        if(pwp->fsStatus!=WPM_TEXT)
+          break;
+
+        return MRFALSE;
+      }
+    case WM_COMMAND:
+      if(SHORT1FROMMP(mp2)==CMDSRC_MENU) {
+        switch(SHORT1FROMMP(mp1))
+          {
+          case ID_MENUITEMEXIT:
+            WinPostMsg(hwnd, WM_CLOSE, 0, 0);
+            return MRFALSE;
+          case ID_MENUITEMSAVE:
+            {
+              if((hwndDialog=WinWindowFromID(hwnd,IDDLG_TOPFRAME))!=NULLHANDLE)
+                {
+                  thisPtr=(CWM3UFolder*) WinQueryWindowULong(hwndDialog,QWL_USER);
+                  if(somIsObj(thisPtr)) {
+                    thisPtr->cwSavePlaylist(NULLHANDLE, FALSE);
+                  }
+                }
+              return MRFALSE;
+            }
+          default:
+            if(SHORT1FROMMP(mp1)>=FIRSTUSERITEM) {
+              BOOL bHandled=FALSE;
+
+              TRY_LOUD(AF_MENU) {
+#if 0
+                if((hwndDialog=WinWindowFromID(hwnd,IDDLG_TOPFRAME))!=NULLHANDLE)
+                  {
+                    thisPtr=(CWMediaFolder*) WinQueryWindowULong(hwndDialog,QWL_USER);
+                    if(somIsObj(thisPtr)) {
+
+                      CWMenuFolder * wpFolder;	
+                      HOBJECT hObject;
+                      somId id;
+                      somTD_CWMenuFolder_mfCheckSkriptMenuItems methodPtr;
+                      M_WPObject *m_wpObject;
+
+                      if(!bHandled)
+                        bHandled=thisPtr->cwCheckUserMenuItems(USERMENUFOLDER_MEDIAFOLDER , SHORT1FROMMP(mp1));
+                    }/* if(somIsObj(thisPtr)) */
+                  }/* Dialog window */
+#endif
+              }
+              CATCH(AF_MENU)
+                {
+                } END_CATCH;
+                if(bHandled)
+                  return (MRESULT) 0;
+            }
+            break;
+          }/* switch() */
+      }
+      break;
+    case WM_MENUSELECT:
+      if((hwndDialog=WinWindowFromID(hwnd,IDDLG_TOPFRAME))!=NULLHANDLE)
+        {
+          thisPtr=(CWM3UFolder*) WinQueryWindowULong(hwndDialog,QWL_USER);
+          if(somIsObj(thisPtr)) {
+            thisPtr->usLastSelMenuItem=SHORT1FROMMP(mp1);
+          }
+        }
+      break;
+    case WM_CONTROL:
+      if(SHORT2FROMMP(mp1)==CN_DROP) {
+        if((hwndDialog=WinWindowFromID(hwnd,IDDLG_TOPFRAME))!=NULLHANDLE)
+          {
+            thisPtr=(CWM3UFolder*) WinQueryWindowULong(hwndDialog,QWL_USER);
+            if(somIsObj(thisPtr)) {
+              thisPtr->fContentsChanged=TRUE;
+            }
+          }
+      }
+      break;
+    default:
+      break;
+    }
+  /* Any other message is handled by the folder frame procedure */
+  if((hwndDialog=WinWindowFromID(hwnd,IDDLG_TOPFRAME))!=NULLHANDLE)
+    {
+      thisPtr=(CWM3UFolder*) WinQueryWindowULong(hwndDialog,QWL_USER);
+      if(somIsObj(thisPtr)) {
+        if(thisPtr->pfnwpFrame)
+          return thisPtr->pfnwpFrame(hwnd, msg, mp1, mp2);
+      }
+    }
+  return  pfnwpGenericFrame(hwnd, msg, mp1, mp2);
+}
+
+
+HWND CWM3UFolder::wpOpen(HWND hwndCnr,ULONG ulView,ULONG ulParam)
+{
+  HWND hwnd;
+  HMODULE hResource=queryResModuleHandle();
+  SIZEL sizel={0};
+  HWND myFrameCtrlHWND;
+  RECTL rectl;
+  MENUITEM mi={0};
+  HWND hwndMenu;
+  int iItemCount=0;
+  char text[200];
+  SWP swp;
+
+  /* Reregister wpFolder window class on first opening */
+  /* We need this private code to have some private
+     window words */
+  if(!g_fRegisteredWindowClass)
+    {
+      CLASSINFO ci;
+
+      if(WinQueryClassInfo(WinQueryAnchorBlock(HWND_DESKTOP),
+                           (PSZ)"wpFolder window",
+                           &ci))
+        {
+          g_ulFrameDataOffset=ci.cbWindowData;
+          //g_pfnwpOrgFrameProc=ci.pfnWindowProc;
+          if (WinRegisterClass(WinQueryAnchorBlock(HWND_DESKTOP),
+                               (PSZ)"wpFolder window",
+                               ci.pfnWindowProc,
+                               ci.flClassStyle,
+                               ci.cbWindowData + MFLDR_WINDOWBYTES))
+            {
+              /* */
+              ulQWP_CONTAINERPROC+=g_ulFrameDataOffset;
+              ulQWP_THISPTR+=g_ulFrameDataOffset;
+              ulQWL_TOPCTRLHWND+=g_ulFrameDataOffset;
+              ulQWL_BOTTOMCTRLHWND+=g_ulFrameDataOffset;
+              ulQWL_LEFTCTRLHWND+=g_ulFrameDataOffset;
+              ulQWL_RIGHTCTRLHWND+=g_ulFrameDataOffset;
+              g_fRegisteredWindowClass=TRUE;
+            }
+        }
+    }
+
+  /* Skip media folder. Because of this skip we had to register the window words here (see above).
+     It's not asured a Mediafolder was already opended. Normaly the window words are added in
+     wpOpen() of the Mediafolder.
+     FIXME: This only works if CWProgFolder->CWMediaFolder->CWM3UFolder is the class hierarchy */
+  hwnd=CWProgFolder::wpOpen(hwndCnr, ulView, ulParam);
+
+  /* Only subclass folder frames, not settings notebooks */
+  if(ulView!=OPEN_SETTINGS){
+    if(!hResource) {
+      errorResource();
+      return hwnd;
+    }
+
+    TRY_LOUD(M3UFLDR_OPEN) {
+      THREADPARAMS*  pTp;
+      ULONG ulErr;
+
+	  if (somIsObj(wpObjM3UFile)) {
+         /* Remove the title added by XWP */
+         WinSetWindowText(hwnd, wpObjM3UFile->wpQueryTitle());
+      }
+      if(!getMessage(text, IDSTR_PLAYLISTVIEWTITLE, sizeof(text), queryResModuleHandle(), HWND_DESKTOP))
+        sprintf(text, "Playlist Editor");
+      /* Set view title. By doing this the frame title isn't 'Details' anymore */
+      wpRegisterView(hwnd, text);
+
+      if(!(ulFlags & FLAG_ALREADYSIZED)) {
+        /* Make sure on first open the container is visible */
+        SWP swp;
+        WinQueryWindowPos(hwnd, &swp);
+        WinSetWindowPos(hwnd, NULLHANDLE, swp.x, swp.y-100, swp.cx, swp.cy+100, SWP_SIZE|SWP_MOVE);
+        ulFlags|=FLAG_ALREADYSIZED;
+      }
+
+      /* Build new menu entries. */
+      myFrameCtrlHWND=WinWindowFromID(hwnd,FID_MENU);//Get menu hwnd
+      if(WinIsWindow(WinQueryAnchorBlock(hwnd), myFrameCtrlHWND)) {
+        /* Menu bar found */
+
+        /* Remove folder item from menubar menu */
+        WinSendMsg( myFrameCtrlHWND, MM_REMOVEITEM, MPFROM2SHORT(0x2cf,TRUE),0);
+
+        /* Insert file menu for the folder */
+        hwndMenu=WinLoadMenu(myFrameCtrlHWND, hResource, ID_MENUFILE);
+        /* Fill the MENUITEM structure */
+        mi.iPosition=0;
+        mi.afStyle=MIS_TEXT|MIS_SUBMENU;
+        mi.id=ID_MENUFILE;
+        mi.afAttribute=NULL;
+        mi.hwndSubMenu=hwndMenu;
+        mi.hItem=NULL;
+        /* Add the item to the folder menubar */
+        /* Text: "~File" */
+        getMessage(text, IDSTR_MENUFILE,sizeof(text), hResource, hwnd);
+        WinSendMsg(myFrameCtrlHWND,MM_INSERTITEM,MPFROMP(&mi),
+                   (MPARAM)text);
+
+        /* Insert skript and user menu item if necessary */
+        if(WinSendMsg(myFrameCtrlHWND,MM_QUERYITEM,MPFROM2SHORT(ID_MBMENUSKRIPTS,FALSE),MPFROMP(&mi))) {
+          /* Script menu is inserted so WPS-Wizard is installed */
+          hwndMenu=mi.hwndSubMenu;
+          if(hwndMenu){
+            /* The class specific skript menu is inserted in class CWFolder */
+            /* Query the number of items in the menubar */
+            iItemCount=(int)WinSendMsg(hwndMenu,MM_QUERYITEMCOUNT,(MPARAM)0,
+                                       (MPARAM)0);
+            if(iItemCount)
+              cwInsertUserMenuItems(hwndMenu, USERMENUFOLDER_M3UFOLDER, FIRSTUSERITEM, TRUE);
+            else
+              cwInsertUserMenuItems(hwndMenu, USERMENUFOLDER_M3UFOLDER, FIRSTUSERITEM, FALSE);
+          }
+        }
+#if 0
+        else {
+          /* Load the user menu from the resource if WPS-Wizard is not installed. If installed the menu item
+             is added by WPS-Wizzard. */
+          hwndMenu=WinLoadMenu(myFrameCtrlHWND,hResource, ID_MBMENUSKRIPTS);
+          if(hwndMenu){
+            /* Query the number of items in the menu */
+            iItemCount=(int)WinSendMsg(hwndMenu,MM_QUERYITEMCOUNT,(MPARAM)0,
+                                       (MPARAM)0);
+
+            if(iItemCount)
+              cwInsertUserMenuItems(hwndMenu, USERMENUFOLDER_M3UFOLDER, FIRSTUSERITEM, TRUE);
+            else
+              cwInsertUserMenuItems(hwndMenu, USERMENUFOLDER_M3UFOLDER, FIRSTUSERITEM, FALSE);
+
+            /* Query the number of items in the menubar */
+            iItemCount=(int)WinSendMsg(myFrameCtrlHWND,MM_QUERYITEMCOUNT,(MPARAM)0,
+                                       (MPARAM)0);
+
+            /* Fill the MENUITEM structure */
+            mi.iPosition=iItemCount-1;
+            mi.afStyle=MIS_TEXT|MIS_SUBMENU;
+            mi.id=ID_MBMENUSKRIPTS;
+            mi.afAttribute=NULL;
+            mi.hwndSubMenu=hwndMenu;
+            mi.hItem=NULL;
+            /* Add the Misc-tools item to the folder menubar */
+            /* Text: "Skripts and tools" */
+            getMessage(text, IDSTR_MENUSKRIPTS,sizeof(text), hResource, hwnd);
+            WinSendMsg(myFrameCtrlHWND,MM_INSERTITEM,MPFROMP(&mi),
+                       (MPARAM)text);
+          }/* end of if(hwndMenu) */
+        }
+#endif
+      }
+
+      /* Now add the framecontrols */
+
+      /* This is the Top-frameCtrl. */
+      /* Load the dialog from the resource. The object pointer of this
+         folder is given to the dialog procedure (this). In WM_INITDLG
+         the procedure saves this pointer for later use. */
+      myFrameCtrlHWND=WinLoadDlg(hwnd,hwnd, m3uTopCtrlDialogProc,hResource,IDDLG_TOPFRAME ,this);
+      /* Save the HWND in the instance data */
+      //      hwndTop=myFrameCtrlHWND;
+      /* Save the HWND in the Window words */
+      WinSetWindowULong( hwnd, ulQWL_TOPCTRLHWND, myFrameCtrlHWND);
+
+      if(myFrameCtrlHWND){
+        /* Query the size of the dialog */
+        WinQueryWindowRect(myFrameCtrlHWND,&rectl);
+        /* It's the top dialog so we need the height but not the width. The width
+           is always the width of the folder. */
+        //        sizel.cy=rectl.yTop-rectl.yBottom;
+        sizel.cy=12;
+        /* Call a method of CWProgFolder to add the dialog as a framecontrol.
+           FCTL_TOP means put it at the top of the folder.
+           After calling cwUpdateFrame(hwnd) it will be visible */
+        cwAddFrameCtl(hwnd, myFrameCtrlHWND, sizel, FCTL_TOP,0);
+      }
+
+      /* Load the dialog from the resource. The object pointer of this
+         folder is given to the dialog procedure (this). In WM_INITDLG
+         the procedure saves this pointer for later use. */
+      myFrameCtrlHWND=WinLoadDlg(hwnd,hwnd,leftCtrlDialogProc,hResource,IDDLG_LEFTFRAME ,this);
+      /* Save the HWND in the instance data */
+      //    hwndLeft=myFrameCtrlHWND;
+      /* Save the HWND in the Window words */
+      WinSetWindowULong( hwnd, ulQWL_LEFTCTRLHWND, myFrameCtrlHWND);
+
+
+      if(myFrameCtrlHWND){
+        /* Query the size of the dialog */
+        WinQueryWindowRect(myFrameCtrlHWND, &rectl);
+        /* It's the right dialog so we need the width but not the height. */
+        sizel.cx=allBMPs[CTRLIDX_TOPRIGHT].bmpInfoHdr.cx-1-7-2;//rectl.xRight-rectl.xLeft;
+        //  sizel.cx=rectl.xRight-rectl.xLeft;
+        /* Call a method of CWProgFolder to add the dialog as a framecontrol.
+           FCTL_RIGHT means put it at the RIGHT of the folder.
+           After calling cwUpdateFrame(hwnd) it will be visible */
+        cwAddFrameCtl(hwnd, myFrameCtrlHWND, sizel, FCTL_LEFT, FCTL_POSABOVE|FCTL_POSBELOW);
+      }
+
+      /* Load the dialog from the resource. The object pointer of this
+         folder is given to the dialog procedure (this). In WM_INITDLG
+         the procedure saves this pointer for later use. */
+      myFrameCtrlHWND=WinLoadDlg(hwnd,hwnd,rightCtrlDialogProc,hResource,IDDLG_FRAMERIGHT ,this);
+      /* Save the HWND in the instance data */
+      //      hwndRight=myFrameCtrlHWND;
+      /* Save the HWND in the Window words */
+      WinSetWindowULong( hwnd, ulQWL_RIGHTCTRLHWND, myFrameCtrlHWND);
+
+      if(myFrameCtrlHWND){
+        CNRINFO cnrInfo;
+        HWND hwndContainer;
+        PVIEWITEM pView;
+
+        /* Query the size of the dialog */
+        WinQueryWindowRect(myFrameCtrlHWND, &rectl);
+        /* It's the right dialog so we need the width but not the height. */
+        sizel.cx=allBMPs[CTRLIDX_TOPRIGHT].bmpInfoHdr.cx-1-7-2;// rectl.xRight-rectl.xLeft;
+        /* Call a method of CWProgFolder to add the dialog as a framecontrol.
+           FCTL_RIGHT means put it at the RIGHT of the folder.
+           After calling cwUpdateFrame(hwnd) it will be visible */
+        cwAddFrameCtl(hwnd, myFrameCtrlHWND, sizel, FCTL_RIGHT, FCTL_POSABOVE|FCTL_POSBELOW);
+
+        //        hwndContainer=WinWindowFromID(myFrameCtrlHWND, IDCNR_PLAYLIST);
+        //  WinSendMsg(hwndContainer,CM_QUERYCNRINFO, MPFROMP(&cnrInfo),
+        //         MPFROMLONG(sizeof(cnrInfo)));
+      }/* if(hwndRight) */
+
+      /* Load the dialog from the resource. The object pointer of this
+         folder is given to the dialog procedure (this). In WM_INITDLG
+         the procedure saves this pointer for later use. */
+      myFrameCtrlHWND=WinLoadDlg(hwnd,hwnd,bottomCtrlDialogProc,hResource,IDDLG_BOTTOMFRAME ,this);
+      /* Save the HWND in the instance data */
+      hwndBottom=myFrameCtrlHWND;
+      /* Save the HWND in the Window words */
+      WinSetWindowULong( hwnd, ulQWL_BOTTOMCTRLHWND, myFrameCtrlHWND);
+
+      if(hwndBottom){
+        /* Query the size of the dialog */
+        WinQueryWindowRect(hwndBottom,&rectl);
+        //sizel.cy=20;
+        sizel.cy=rectl.yTop-rectl.yBottom-2;
+        //    sizel.cy=allBMPs[MAIN_BMP_IDX].bmpInfoHdr.cy;
+        /* Call a method of CWProgFolder to add the dialog as a framecontrol.
+           FCTL_TOP means put it at the top of the folder.
+           After calling cwUpdateFrame(hwnd) it will be visible */
+        cwAddFrameCtl(hwnd, hwndBottom, sizel, FCTL_BOTTOM,0);
+      }
+
+      /* Refresh frame to show the new framecontrols */
+      cwUpdateFrame(hwnd);
+
+      /* Subclass frame */
+      pfnwpFrame=WinSubclassWindow(hwnd, m3uFrameProc);
+      pfnwpGenericFrame=pfnwpFrame;
+
+      /* Subclass container */
+      myFrameCtrlHWND=WinWindowFromID(hwnd,FID_CLIENT);//Get container hwnd
+      if(myFrameCtrlHWND){
+        PFNWP pfnwpContainer;
+        pfnwpContainer=WinSubclassWindow(myFrameCtrlHWND, m3uFldrContainerProc);
+        /* Save container proc in frame window words */
+        WinSetWindowULong( hwnd, ulQWP_CONTAINERPROC, (ULONG)pfnwpContainer);
+      }
+      cwInsertAllTracks(NULLHANDLE);
+    }
+    CATCH(M3UFLDR_OPEN)
+      {
+        SysWriteToTrapLog("\nTrap occured in %s, file: %s above line %d.\n",
+                          __FUNCTION__, __FILE__, __LINE__);
+
+      } END_CATCH;
+
+      /* Make sure on open the container is visible */
+      WinQueryWindowPos(hwnd, &swp);
+      WinSetWindowPos(hwnd, NULLHANDLE, swp.x, swp.y-200, swp.cx, swp.cy+200, SWP_SIZE|SWP_MOVE);
+  }
+
+  return hwnd;
+}
+
+BOOL CWM3UFolder::wpDeleteFromContent(WPObject* Object)
+{
+  fContentsChanged=TRUE;
+  return CWMediaFolder::wpDeleteFromContent(Object);
+}
+
+void _Optlink saveThreadFunc (void *arg)
+{
+  HAB  hab;
+  HMQ  hmq;
+  QMSG qmsg;
+  CWM3UFolder *thisPtr;
+  HWND hwnd;
+  char chrFileName[CCHMAXPATH];
+  ULONG ulSize;
+  M3UTHREADPARMS *parms=(M3UTHREADPARMS*)arg;
+
+  writeLog("Thread");
+  if(!parms) {
+    writeLog("!parms");
+    return;
+  }
+
+  thisPtr=(CWM3UFolder*)parms->thisPtr;
+  if(!somIsObj(thisPtr)) {
+    writeLog("!thisPtr");
+    return;
+  }
+
+  if(!somIsObj(thisPtr->wpObjM3UFile)){
+    writeLog("!thisPtr->wpObjM3UFile");
+    return;
+  }
+
+  ulSize=sizeof(chrFileName);
+  if(!((WPFileSystem*)thisPtr->wpObjM3UFile)->wpQueryRealName(chrFileName, &ulSize, TRUE)) {
+    writeLog("!chrFileName");
+    return;
+  }
+  writeLog("chrFileName %s", chrFileName);
+  hab=WinInitialize(0);
+  if(hab) {
+    hmq=WinCreateMsgQueue(hab,0);
+    if(hmq) {
+      FILE* fStream;
+
+      if(WinIsWindow(WinQueryAnchorBlock(HWND_DESKTOP), parms->hwndCnr))
+        {
+          /* Container handle is valid */
+          if((fStream=fopen(chrFileName, "w"))!=NULLHANDLE) /* Open the playlist file */
+            {
+              HWND hwndContainer=parms->hwndCnr;
+
+              for(;;)
+                {
+                  PMINIRECORDCORE mrc;
+                  WPObject * contentObject;
+                  /* Get first container item of our folder */
+                  mrc=(PMINIRECORDCORE)WinSendMsg(hwndContainer,CM_QUERYRECORD, MPFROMSHORT(CMA_FIRST),
+                                                  MPFROM2SHORT(CMA_FIRST,CMA_ITEMORDER));
+		  if(!mrc || (int)mrc==-1) {
+		    writeLog("No mrc");
+#ifdef _PMPRINTF_
+		    Pmpf(("No mrc"));
+#endif
+		    break;
+		  }
+
+                  do {
+                    contentObject=(WPObject*)OBJECT_FROM_PREC(mrc);//Get object
+                    if(somIsObj(contentObject)) {
+                      /* Get file system object or NULL */
+                      if((contentObject=thisPtr->cwGetFileSystemObject(contentObject))==NULLHANDLE) {
+                        /* Try next object */
+                        mrc=(PMINIRECORDCORE)WinSendMsg(hwndContainer,CM_QUERYRECORD, mrc,
+                                                        MPFROM2SHORT(CMA_NEXT,CMA_ITEMORDER));
+                        continue;
+                      }
+                    }
+		    else {
+		      writeLog("No contentobj");
+#ifdef _PMPRINTF_
+		      Pmpf(("No contentobj"));
+#endif
+		      break;/* Error */
+		    }
+
+                    /* Get the name of the audio file */
+                    ulSize=sizeof(chrFileName);
+                    ((WPFileSystem*)contentObject)->wpQueryRealName(chrFileName,&ulSize,TRUE);
+		    /* Try next object */
+		    writeLog("chrFileName %s", chrFileName);
+#ifdef _PMPRINTF_
+		    Pmpf(("chrFileName %s", chrFileName));
+#endif
+                    fputs(chrFileName,fStream);
+                    fputs("\n",fStream);
+                    mrc=(PMINIRECORDCORE)WinSendMsg(hwndContainer,CM_QUERYRECORD, mrc,
+                                                    MPFROM2SHORT(CMA_NEXT,CMA_ITEMORDER));
+                  }while(mrc && (int)mrc!=-1);
+                  break;
+                }/* for() */
+            }/* fopen() */
+          fclose(fStream);
+        }
+      WinDestroyMsgQueue(hmq);
+    }
+    WinTerminate(hab);
+  }
+  /* Mark as saved */
+  thisPtr->fContentsChanged=FALSE;
+  if(!parms->fSaveOnly) {
+    writeLog("Not Saveonly");
+#ifdef _PMPRINTF_
+    Pmpf(("Not Saveonly "));
+#endif
+    /* Close and destroy the folder if requested */
+    WinPostMsg(parms->hwndFrame, WM_CLOSE, 0, 0);
+    if(WinIsWindow(WinQueryAnchorBlock(HWND_DESKTOP), thisPtr->hwndObject))
+      WinPostMsg(thisPtr->hwndObject, WM_APPTERMINATENOTIFY, 0, 0);
+  }
+  thisPtr->wpFreeMem((PBYTE)parms);
+}
+
+BOOL CWM3UFolder::cwSavePlaylist(char* chrM3UFile, BOOL fClose)
+{
+  M3UTHREADPARMS* parms;
+  ULONG ulError;
+
+  if((parms=(M3UTHREADPARMS*)wpAllocMem(sizeof(M3UTHREADPARMS),&ulError))!=NULLHANDLE)
+    {
+      HWND hwnd;
+
+      memset(parms,0, sizeof(M3UTHREADPARMS));
+      parms->thisPtr=this;
+      if((hwnd=WinQueryWindow(hwndBottom,QW_PARENT))!=NULLHANDLE)
+        {
+          parms->hwndFrame=hwnd;
+          parms->hwndCnr=WinWindowFromID(hwnd, FID_CLIENT);
+        }
+      if(fClose)
+        fClosing=TRUE;
+      else
+        parms->fSaveOnly=TRUE;
+
+      _beginthread(saveThreadFunc,NULL,8192*16,(void*)parms); //Fehlerbehandlung fehlt
+    }
+  else {
+    /* FIXME: Error handling!*/
+  }
+  return TRUE;
+}
+
+BOOL CWM3UFolder::cwClose(HWND hwndFrame)
+{
+  SWP swp;
+
+  if(fClosing)
+    return TRUE;
+
+  if(fContentsChanged)
+    {
+      char text[200];
+      char title[50];
+      ULONG ulRc;
+      if((ulRc=messageBox( text, IDSTR_M3UCLOSETEXT, sizeof(text),
+                           title, IDSTR_CLOSETITLE, sizeof(title),
+                           queryResModuleHandle(),
+                           HWND_DESKTOP,
+                           MB_YESNOCANCEL|MB_MOVEABLE|MB_ICONQUESTION))==MBID_CANCEL)
+      return FALSE;
+      if(ulRc==MBID_YES) {
+        cwSavePlaylist(NULLHANDLE, TRUE);
+        return FALSE;
+      }
+    }
+  fClosing=TRUE;
+
+  if(WinIsWindow(WinQueryAnchorBlock(HWND_DESKTOP), hwndObject)) {
+    WinPostMsg(hwndObject, WM_APPTERMINATENOTIFY, 0, 0);
+  }
+  return TRUE;
+}
+
+ULONG CWM3UFolder::wpFilterPopupMenu(ULONG ulFlags, HWND hwndCnr, BOOL fMultiSelect)
+{
+
+  return CTXT_HELP|CTXT_SORT|CTXT_SETTINGS|CTXT_REFRESH|CTXT_FIND;
+#if 0
+  return CWMediaFolder::wpFilterPopupMenu(ulFlags, hwndCnr, fMultiSelect)&
+    ~(CTXT_COPY|CTXT_ICON|CTXT_CHANGETOICON|CTXT_CHANGETOTREE|CTXT_CHANGETODETAILS);
+#endif
+}
+
+BOOL CWM3UFolder::wpModifyPopupMenu(HWND hwndMenu, HWND hwndCnr, ULONG ulPosition)
+{
+  WinSendMsg( hwndMenu, MM_REMOVEITEM, MPFROM2SHORT(0x2ca, TRUE),0);
+  return TRUE;
+}
+
+
+
+
+
+
+
+
Index: /tags/CWMM-0.3.0_GA/mediafolder/c/m3ufolder/makefile
===================================================================
--- /tags/CWMM-0.3.0_GA/mediafolder/c/m3ufolder/makefile	(revision 213)
+++ /tags/CWMM-0.3.0_GA/mediafolder/c/m3ufolder/makefile	(revision 213)
@@ -0,0 +1,38 @@
+# Makefile for Audio-CD-Creator Data-CD-Creator
+
+include ../../../make.inc
+
+CC           = icc
+#CPPFLAGS     = /Ge- /Gm+ /G4 /Gl  /O+ /Oc+ /Ol- /Q+ $(VACDEBUG)
+CPPFLAGS     = /G5 /Ge- /Gm+ /Gl- /Ga- /O+ /Oc+ /Ol- /Q+ /D$(ECS) $(VACDEBUG)
+LIBS	     =  mmPM2.lib rexx.lib
+INC	=	..\include
+HELPERDIR	=	..\helper
+DEFS         =
+PROGS        =
+ODIR		= ./obj
+CPPDIR	= .
+
+
+all:	mediafld.dll
+
+.cpp.obj:
+	icc $(CPPFLAGS) /C+ -I$(INC) /Fo$@ $<
+
+mediafld.dll:
+		cd ../. && make
+
+
+clean:
+
+cleaner:
+	-rm *.*~
+	-rm *.flc
+
+distger:
+
+disteng:
+
+distribution:
+
+
Index: /tags/CWMM-0.3.0_GA/mediafolder/c/makefile
===================================================================
--- /tags/CWMM-0.3.0_GA/mediafolder/c/makefile	(revision 213)
+++ /tags/CWMM-0.3.0_GA/mediafolder/c/makefile	(revision 213)
@@ -0,0 +1,28 @@
+# Makefile for mediafolder
+
+include ../../make.inc
+
+
+all:
+	cd ../. && make
+
+mediafld.dll:
+
+clean:
+	-cd ./createcd && make clean && -cd ..
+	-cd ./cddb && make clean
+
+cleaner:
+	-cd ./mediafldr && make cleaner && -cd ..
+	-cd ./m3ufolder && make cleaner && -cd ..
+	-cd ./cdfldr && make cleaner && -cd ..
+	-cd ./audioshadow && make cleaner && -cd ..
+	-cd ./helper && make cleaner && -cd ..
+	-cd ./createcd && make cleaner && -cd ..
+	-cd ./cddb && make cleaner
+
+distger:
+
+disteng:
+
+distribution:
Index: /tags/CWMM-0.3.0_GA/mediafolder/c/mediafldr/makefile
===================================================================
--- /tags/CWMM-0.3.0_GA/mediafolder/c/mediafldr/makefile	(revision 213)
+++ /tags/CWMM-0.3.0_GA/mediafolder/c/mediafldr/makefile	(revision 213)
@@ -0,0 +1,56 @@
+# Makefile for Audio-CD-Creator Data-CD-Creator
+
+include ../../../make.inc
+
+CC           = icc
+#CPPFLAGS     = /Ge- /Gm+ /G4 /Gl  /O+ /Oc+ /Ol- /Q+ $(VACDEBUG)
+CPPFLAGS     = /G5 /Ge- /Gm+ /Gl- /Ga- /O+ /Oc+ /Ol- /Q+ /D$(ECS) $(VACDEBUG)
+LIBS	     =  mmPM2.lib rexx.lib
+INC	=	..\include
+HELPERDIR	=	..\helper
+DEFS         =
+PROGS        =
+ODIR		= ./obj
+CPPDIR	= .
+
+RESDIR	=	..\res\$(LANGUAGE)
+RESBASE2=	../res
+RESDIR2	=	../res/$(LANGUAGE)
+
+HELPSOURCE	=	$(RESDIR2)/ipf
+
+OBJECTS	=	mediafolder.obj mediadialogprocs.obj \
+			mediafolderoverridenwpmethods.obj mediafolderoverridenwpclsmethods.obj \
+
+all:
+	cd ../. && make
+
+mediafld.dll:
+#$(OBJECTS)
+		cd ../. && make
+
+mediafolder.obj:	mediafolder.cpp $(INC)\mediafolderres.h $(INC)\mediafolder.hh
+	icc $(CPPFLAGS) /C+ -I$(INC) /Fo$@ $<
+
+mediadialogprocs.obj:	mediadialogprocs.cpp $(INC)\mediafolder.hh $(INC)\mediafolderres.h
+	icc $(CPPFLAGS) /C+ -I$(INC) /Fo$@ $<
+
+mediafolderoverridenwpclsmethods.obj:	mediafolderoverridenwpclsmethods.cpp $(INC)\mediafolder.hh $(INC)\mediafolderres.h
+	icc $(CPPFLAGS) /C+ -I$(INC) /Fo$@ $<
+
+mediafolderoverridenwpmethods.obj:	mediafolderoverridenwpmethods.cpp $(INC)\mediafolder.hh $(INC)\mediafolderres.h
+	icc $(CPPFLAGS) /C+ -I$(INC) /Fo$@ $<
+
+
+clean:
+
+cleaner:
+	-rm *.*~
+	-rm *.flc
+
+distger:
+
+disteng:
+
+distribution:
+
Index: /tags/CWMM-0.3.0_GA/mediafolder/c/mediafldr/mediadialogprocs.cpp
===================================================================
--- /tags/CWMM-0.3.0_GA/mediafolder/c/mediafldr/mediadialogprocs.cpp	(revision 213)
+++ /tags/CWMM-0.3.0_GA/mediafolder/c/mediafldr/mediadialogprocs.cpp	(revision 213)
@@ -0,0 +1,2381 @@
+/*
+ * This file is (C) Chris Wohlgemuth 2002-2004
+ * It is part of the MediaFolder package
+ */
+/*
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; see the file COPYING.  If not, write to
+ * the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+#define INCL_GPI
+#define INCL_GPILCIDS
+#define INCL_GPIPRIMITIVES
+#define INCL_GPIBITMAPS
+#define INCL_SW
+#define INCL_REXXSAA
+
+#include "mediafolder.hh"
+#include "mediafolderres.h"
+
+#include "sys_funcs.h"
+#include "menu_funcs.h"
+
+#include "launchpad.hh"
+
+//#pragma SOMAsDefault(pop)
+#include <rexxsaa.h>                   /* needed for RexxStart()     */
+
+#include <stdio.h>
+#include <stdlib.h>
+//#pragma SOMAsDefault(on)
+
+#include "menufolder.hh"
+
+typedef BOOL   SOMLINK somTP_CWMenuFolder_mfCheckMenuItems(CWMenuFolder *somSelf,
+		WPObject* wpObject,
+		ULONG ulMenuId);
+typedef somTP_CWMenuFolder_mfCheckMenuItems *somTD_CWMenuFolder_mfCheckMenuItems;
+
+typedef BOOL   SOMLINK somTP_CWMenuFolder_mfCheckSkriptMenuItems(CWMenuFolder *somSelf,
+		WPObject* wpObject,
+		ULONG ulMenuId,
+        HWND hwndFrame);
+typedef somTP_CWMenuFolder_mfCheckSkriptMenuItems *somTD_CWMenuFolder_mfCheckSkriptMenuItems;
+
+
+PFNWP  oldProc; //Old proc from subclassed shadow
+HWND hwndShadow;// The handle of the help window
+extern PFNWP  oldButtonProc2;  //place for original button-procedure
+extern HWND hwndBubbleWindow;// The handle of the help window
+#define  WM_NEWBUBBLE   WM_USER+100 //Use ATOM later
+#define xVal  12      //x-distance of Bubble
+#define yVal  8      //y-distance of Bubble
+char chrTBFlyFontName[CCHMAXPATH]="9.WarpSans";/* Font for toolbar fly over help */
+RGB rgbTBFlyForeground={0};
+RGB rgbTBFlyBackground={180,255,255};
+BOOL bTBFlyOverEnabled=TRUE;
+int iTBFlyOverDelay=250;
+
+/* Pointer into window words */
+extern ULONG ulQWP_CONTAINERPROC;
+extern ULONG ulQWP_THISPTR;
+extern ULONG ulQWL_TOPCTRLHWND;
+extern ULONG ulQWL_BOTTOMCTRLHWND;
+extern ULONG ulQWL_RIGHTCTRLHWND;
+extern ULONG ulQWL_LEFTCTRLHWND;
+
+extern char chrInstallDir[CCHMAXPATH];
+extern CONTROLINFO ciControls[];
+extern LOADEDBITMAP allBMPs[];
+extern PFNWP pfnwpGenericFrame;
+extern PFNWP  oldStaticTextProc;
+extern LPList* lplAllLPads;
+
+/* Extern */
+//extern ULONG cwQueryOSRelease();
+extern BOOL cwMoveNotebookButtonsWarp4(HWND hwndDlg, USHORT usID, USHORT usDelta);
+void sendConfig();
+ULONG messageBox( char* text, ULONG ulTextID , LONG lSizeText,
+                  char* title, ULONG ulTitleID, LONG lSizeTitle,
+                  HMODULE hResource, HWND hwnd, ULONG ulFlags);
+BOOL getMessage(char* text,ULONG ulID, LONG lSizeText, HMODULE hResource,HWND hwnd);
+
+void handleWindowPosChanged(HWND hwnd, ULONG msg, MPARAM mp1, MPARAM mp2);/* In dataCddialogProcs.cpp */
+void writeLogPrintf(char* logFile, char* format, ...);
+void HlpWriteToTrapLog(const char* chrFormat, ...);
+HMODULE queryResModuleHandle(void);
+void callMediaFolderMethod(CWMediaFolder *thisPtr, ULONG ulAction, ULONG ulData);
+
+MRESULT paintControls(HWND hwnd, ULONG msg, MPARAM mp1, MPARAM mp2);
+BOOL paintHilitedControl(HWND hwnd, USHORT usControl, BOOL bHilite);
+void adjustDialogControlPos(HWND hwnd);
+MRESULT drawSlider(HWND hwnd, ULONG msg, MPARAM mp1, MPARAM mp2, USHORT id);
+void setPlayTimeText(CWMediaFolder *thisPtr);
+void togglePlayTimeDisplayVisibility(CWMediaFolder *thisPtr);
+winSetVolumeSlider(CWMediaFolder *thisPtr);
+winCheckRepeatButton(CWMediaFolder *thisPtr);
+void contextMenu(HWND hwnd, USHORT usItem, BOOL fCheckItem);
+
+MRESULT EXPENTRY staticTextProc(HWND hwnd, ULONG msg, MPARAM mp1, MPARAM mp2);
+extern void _Optlink openThreadFunc (void *arg);
+
+extern SOMClass* cwGetSomClass(char* chrClassName);
+
+/* Local */
+MRESULT EXPENTRY topCtrlDialogProc(HWND hwnd, ULONG msg, MPARAM mp1, MPARAM mp2) ;
+
+/*****************************************************/
+/*                                                   */
+/* New container procedure so tabbing to the play    */
+/* control dialog works.                             */
+/*                                                   */
+/*****************************************************/
+MRESULT EXPENTRY mediaFldrContainerProc(HWND hwnd, ULONG msg, MPARAM mp1, MPARAM mp2) 
+{
+  CWMediaFolder* thisPtr;
+  HWND hwndDialog;
+  PFNWP pfnwpContainer;
+
+  switch(msg)
+    {
+    case WM_CHAR:
+      /* handle TAB keys so user may tab from the container to the frame controls */
+      if(SHORT1FROMMP(mp1) & KC_VIRTUALKEY)
+        {
+          if(SHORT2FROMMP(mp2)==VK_TAB && !(SHORT1FROMMP(mp1) & KC_KEYUP)) {
+            /* Always forward tab to the top middle framecontrol */
+            if((hwndDialog=WinQueryWindow(hwnd,QW_PARENT))!=NULLHANDLE)/* The frame */
+              {
+                /* Get HWND of top middle dialog */
+                if((hwndDialog=WinWindowFromID(WinWindowFromID(hwndDialog,IDDLG_TOPFRAME),IDDLG_TOPMIDDLE))!=NULLHANDLE)
+                  {
+                    if((hwndDialog=WinWindowFromID(hwndDialog,IDPB_SKIPBACK))!=NULLHANDLE)
+                      if(WinSetFocus(HWND_DESKTOP,hwndDialog))
+                        return (MRESULT)TRUE;
+                  }
+              }
+            break;/* error: fall to the window proc */
+          }
+          else if(SHORT2FROMMP(mp2)==VK_BACKTAB && !(SHORT1FROMMP(mp1) & KC_KEYUP) )
+            {
+              /* Check for key down to make sure the focus doesn't switch immediately to the next
+                 frame control when just coming from another control. Only if the user hits tab 
+                 again in the container the focus switches. */
+              if((hwndDialog=WinQueryWindow(hwnd,QW_PARENT))!=NULLHANDLE)
+                {
+                /* Get HWND of top middle dialog */
+                if((hwndDialog=WinWindowFromID(WinWindowFromID(hwndDialog,IDDLG_TOPFRAME),IDDLG_TOPMIDDLE))!=NULLHANDLE)
+                  {
+                    if((hwndDialog=WinWindowFromID(hwndDialog,IDSL_POSBAR))!=NULLHANDLE)
+                      if(WinSetFocus(HWND_DESKTOP,hwndDialog))
+                        return (MRESULT)TRUE;
+                  }
+                }
+            }
+          break;/* error: fall to the window proc */
+        }
+      break;
+
+      /*****************************************************/
+      /* Show a busy dialog if necessary.                  */
+      /*****************************************************/
+    case WM_MOUSEMOVE:
+      /* Get frame handle */
+      if((hwndDialog=WinQueryWindow(hwnd,QW_PARENT))!=NULLHANDLE)
+        {
+          thisPtr=(CWMediaFolder*) WinQueryWindowULong(hwndDialog,ulQWP_THISPTR);
+          if(somIsObj(thisPtr))
+            if(thisPtr->mfData)
+              /* A thread for calculating the size is running so show the wait ptr. */
+              if(thisPtr->mfData->bProcessing==TRUE) {
+                HPOINTER hptr=WinQuerySysPointer(HWND_DESKTOP, SPTR_WAIT, FALSE);
+                if(hptr) {
+                  WinSetPointer(HWND_DESKTOP, hptr);
+                  return MRTRUE;
+                }
+              }
+
+#if 0
+          if((hwndDialog=WinWindowFromID(hwndDialog,IDDLG_TOPFRAME))!=NULLHANDLE)
+            {
+              thisPtr=(CWMediaFolder*) WinQueryWindowULong(hwndDialog,QWL_USER);
+              if(somIsObj(thisPtr))
+                if(thisPtr->mfData)
+                  /* A thread for calculating the size is running so show the wait ptr. */
+                  if(thisPtr->mfData->bProcessing==TRUE) {
+                    HPOINTER hptr=WinQuerySysPointer(HWND_DESKTOP, SPTR_WAIT, FALSE);
+                    if(hptr) {
+                      WinSetPointer(HWND_DESKTOP, hptr);
+                      return MRTRUE;
+                    }
+                  }
+            }
+#endif
+        }
+      break;
+    default:
+      break;
+    }
+  if((hwndDialog=WinQueryWindow(hwnd,QW_PARENT))!=NULLHANDLE) {
+    pfnwpContainer=(PFNWP)WinQueryWindowULong( hwndDialog, ulQWP_CONTAINERPROC);
+    if(pfnwpContainer)
+      return pfnwpContainer(hwnd, msg, mp1, mp2);
+  }
+
+#if 0
+  /* Any other message is handled by the folder container procedure */
+  if((hwndDialog=WinQueryWindow(hwnd,QW_PARENT))!=NULLHANDLE)
+    {
+      if((hwndDialog=WinWindowFromID(hwndDialog,IDDLG_TOPFRAME))!=NULLHANDLE)
+        {
+          thisPtr=(CWMediaFolder*) WinQueryWindowULong(hwndDialog,QWL_USER);
+          if(somIsObj(thisPtr))
+            if(thisPtr->pfnwpContainer)
+              return thisPtr->pfnwpContainer(hwnd, msg, mp1, mp2);
+        }
+    }
+#endif
+  return WinDefWindowProc(hwnd, msg, mp1, mp2);
+}
+
+/************************************************************
+ *                                                          *
+ * This frame proc handles the about menuitem of the        *
+ * Warp 4 menu bar and removes the Tree view item.          *
+ *                                                          *
+************************************************************/
+MRESULT EXPENTRY mediaFrameProc(HWND hwnd, ULONG msg, MPARAM mp1, MPARAM mp2) 
+{
+  CWMediaFolder* thisPtr;
+  HWND hwndDialog;
+  MENUITEM mi;
+  char text[100];
+
+  switch (msg)
+    {
+    case WM_INITMENU:
+      thisPtr=(CWMediaFolder*) WinQueryWindowULong(hwnd,ulQWP_THISPTR);
+      if(somIsObj(thisPtr)) {
+        HMODULE hResource=queryResModuleHandle();
+        switch(thisPtr->usLastSelMenuItem)
+          {
+            //#ifndef ECS
+            /* The eCS version doesn't have an 'About menu' */
+          case 0x2d3:/* Help menu */
+            {
+              if(hResource) {
+                /* insert separator */
+                /* Insert 'About' item */
+                getMessage(text, IDSTR_MEDIAFLDHELP ,sizeof(text), hResource, hwnd);
+                //menuInsertMenuItem(HWNDFROMMP(mp2), NULL, 0, ID_MEDIAFLDHELP, text);
+                //menuInsertMenuSeparator(HWNDFROMMP(mp2), NULL, 1);
+                menuInsertMenuSeparator(HWNDFROMMP(mp2), NULL, MIT_END);
+                /* Insert 'About' item */
+                getMessage(text, IDSTR_MENUABOUT ,sizeof(text), hResource, hwnd);
+                menuInsertMenuItem(HWNDFROMMP(mp2), NULL, MIT_END, ID_ABOUTITEM, text);
+                break;
+              }
+              break;
+            }
+            //#endif
+
+          case 0x68:
+            /* Remove change to Tree from menubar menu */ 
+            WinSendMsg(HWNDFROMMP(mp2),MM_REMOVEITEM,MPFROM2SHORT(717,TRUE),0);
+            /* V0.2.8 (07.09.2003):
+               Removed icon view item from menu. Icon view is no longer supported by
+               the media folder.*/
+
+            /* Remove change to Icon view from menubar menu */ 
+            WinSendMsg(HWNDFROMMP(mp2),MM_REMOVEITEM,MPFROM2SHORT(0x2cc,TRUE),0);
+
+            break;
+
+          case 0x2d1:
+            /* Remove change to Tree from menubar menu */ 
+            WinSendMsg(HWNDFROMMP(mp2),MM_REMOVEITEM,MPFROM2SHORT(717,TRUE),0);
+            /* V0.2.8 (07.09.2003):
+               Removed icon view item from menu. Icon view is no longer supported by
+               the media folder.*/
+            /* Remove change to Icon view from menubar menu */ 
+            WinSendMsg(HWNDFROMMP(mp2),MM_REMOVEITEM,MPFROM2SHORT(0x2cc,TRUE),0);
+
+            /* Insert the new 'compact' view item */
+            if(hResource) {
+              SHORT sItem;
+              /* Insert 'Compact' item */
+              getMessage(text, IDSTR_MENUCOMPACT ,sizeof(text), hResource, hwnd);
+              sItem=menuInsertMenuItem( HWNDFROMMP(mp2), NULL, 1, ID_MENUVIEWCOMPACT, text);
+              if(sItem!=MIT_MEMERROR && sItem!=MIT_ERROR)
+                {
+                  /* Disable menu if already in compact view */
+                  if(thisPtr->cwQueryMFldrFlags() & MFLDR_VIEW_COMPACT) {
+                    WinEnableMenuItem(HWNDFROMMP(mp2), ID_MENUVIEWCOMPACT, FALSE);
+                    /* Enable details view item */
+                    WinEnableMenuItem(HWNDFROMMP(mp2), 0x2ce, TRUE);
+                  }
+                }
+            }
+            break;
+          default:
+            break;
+          }
+
+      }
+#if 0
+      if((hwndDialog=WinWindowFromID(hwnd,IDDLG_TOPFRAME))!=NULLHANDLE)
+        {
+          thisPtr=(CWMediaFolder*) WinQueryWindowULong(hwndDialog,QWL_USER);
+          if(somIsObj(thisPtr)) {
+            HMODULE hResource=queryResModuleHandle();
+            switch(thisPtr->usLastSelMenuItem)
+              {
+              case 0x2d3:/* Help menu */
+                {
+                  if(hResource) {
+                    /* insert separator */
+                    cwInsertMenuSeparator(MIT_END, HWNDFROMMP(mp2), NULL);
+                    /* Insert 'About' item */
+                    getMessage(text, IDSTR_MENUABOUT ,sizeof(text), hResource, hwnd);
+                    cwInsertMenuItem(MIT_END, HWNDFROMMP(mp2), NULL, ID_ABOUTITEM, text);
+                    break;
+                  }
+                  break;
+                }
+              case 0x2d1:
+                /* Remove change to Tree from menubar menu */ 
+                WinSendMsg(HWNDFROMMP(mp2),MM_REMOVEITEM,MPFROM2SHORT(717,TRUE),0);
+                /* Insert the new 'compact' view item */
+                if(hResource) {
+                  /* Insert 'Compact' item */
+                  getMessage(text, IDSTR_MENUCOMPACT ,sizeof(text), hResource, hwnd);
+                  cwInsertMenuItem( 1, HWNDFROMMP(mp2), NULL, ID_MENUVIEWCOMPACT, text);
+                }
+                break;
+              default:
+                break;
+              }
+          }
+        }
+#endif
+      break;
+    case WM_COMMAND:
+      if(SHORT1FROMMP(mp2)==CMDSRC_MENU) {
+        if(SHORT1FROMMP(mp1)>=FIRSTUSERITEM) { 
+          BOOL bHandled=FALSE;
+
+          TRY_LOUD(AF_MENU) {
+            thisPtr=(CWMediaFolder*) WinQueryWindowULong(hwnd,ulQWP_THISPTR);
+            if(somIsObj(thisPtr)) {
+              CWMenuFolder * wpFolder;	
+              HOBJECT hObject;
+              somId id;
+
+              somTD_CWMenuFolder_mfCheckSkriptMenuItems methodPtr;
+              M_WPObject *m_wpObject;
+              
+              //     bHandled=thisPtr->cwCheckUserMenuItems(SKRIPTFOLDER_MEDIAFOLDER, SHORT1FROMMP(mp1));
+              if(!bHandled)
+                bHandled=thisPtr->cwCheckUserMenuItems(USERMENUFOLDER_MEDIAFOLDER , SHORT1FROMMP(mp1));
+            }/* if(somIsObj(thisPtr)) */
+          }
+          CATCH(AF_MENU)
+            {
+            } END_CATCH;
+            
+#if 0
+          TRY_LOUD(AF_MENU) {
+            if((hwndDialog=WinWindowFromID(hwnd,IDDLG_TOPFRAME))!=NULLHANDLE)
+              {
+                thisPtr=(CWMediaFolder*) WinQueryWindowULong(hwndDialog,QWL_USER);
+                if(somIsObj(thisPtr)) {
+
+                  CWMenuFolder * wpFolder;	
+                  HOBJECT hObject;
+                  somId id;
+                  somTD_CWMenuFolder_mfCheckSkriptMenuItems methodPtr;
+                  M_WPObject *m_wpObject;
+                  
+                  //     bHandled=thisPtr->cwCheckUserMenuItems(SKRIPTFOLDER_MEDIAFOLDER, SHORT1FROMMP(mp1));
+                  if(!bHandled)
+                    bHandled=thisPtr->cwCheckUserMenuItems(USERMENUFOLDER_MEDIAFOLDER , SHORT1FROMMP(mp1));
+                }/* if(somIsObj(thisPtr)) */
+              }/* Dialog window */
+          }
+          CATCH(AF_MENU)
+            {
+            } END_CATCH;
+#endif
+
+            if(bHandled)
+              return (MRESULT) 0;
+        }
+      }
+      break;
+
+    case WM_MENUSELECT:
+      thisPtr=(CWMediaFolder*) WinQueryWindowULong(hwnd,ulQWP_THISPTR);
+      if(somIsObj(thisPtr))
+        thisPtr->usLastSelMenuItem=SHORT1FROMMP(mp1);
+      break;
+    case WM_TIMER:
+      /* The user didn't click any button on the message box asking for closing the
+         folder. Now the system forces the closing so automatic shutdown may finally
+         succeed. */
+      if(SHORT1FROMMP(mp1)==MFLDR_MBOX_TIMER_ID) {
+        WinStopTimer(WinQueryAnchorBlock(HWND_DESKTOP), hwnd, MFLDR_MBOX_TIMER_ID);
+        WinPostMsg(hwnd, WM_CLOSE, 0, 0);
+      }
+      return MRFALSE;
+    default:
+      break;
+    }
+  /* Any other message is handled by the folder frame procedure */
+  thisPtr=(CWMediaFolder*) WinQueryWindowULong(hwnd,ulQWP_THISPTR);
+  if(somIsObj(thisPtr))
+    if(thisPtr->pfnwpFrame)
+      return thisPtr->pfnwpFrame(hwnd, msg, mp1, mp2);
+  
+  return  pfnwpGenericFrame(hwnd, msg, mp1, mp2);
+}
+
+/************************************************************
+ *                                                          *
+ * This dialog proc handles the playcontrol area at the     *
+ * top.                                                     *
+ *                                                          *
+ ************************************************************/
+MRESULT EXPENTRY playControlDialogProc(HWND hwnd, ULONG msg, MPARAM mp1, MPARAM mp2) 
+{
+  CWMediaFolder *thisPtr;
+  static BOOL bPosDragging=FALSE;
+  
+  switch(msg)
+    {
+      /*****************************************************/
+      /* Init the dialog                                   */
+      /*****************************************************/
+    case WM_INITDLG :
+      
+      WinDefDlgProc(hwnd, msg, mp1, mp2);
+      
+      WinSetWindowULong(hwnd,QWL_USER,(ULONG)PVOIDFROMMP(mp2));//Save object ptr.
+      thisPtr=(CWMediaFolder*) PVOIDFROMMP(mp2);
+      adjustDialogControlPos(hwnd);
+
+      if(SysQueryOSRelease()>=40) {
+        WinSetPresParam(hwnd,
+                        PP_FONTNAMESIZE,(ULONG)sizeof(DEFAULT_DIALOG_FONT),
+                        DEFAULT_DIALOG_FONT );
+      }
+
+      if(somIsObj(thisPtr)) {
+        WinSendMsg( WinWindowFromID(hwnd, IDSL_VOLUME),
+                    SLM_SETSLIDERINFO,
+                    MPFROM2SHORT(SMA_SLIDERARMPOSITION,SMA_INCREMENTVALUE),
+                    MPFROMLONG( thisPtr->ulVolume));
+        /* Set position slider */
+        WinSendMsg( WinWindowFromID(hwnd, IDPB_POSBAR),
+                    SLM_SETSLIDERINFO,
+                    MPFROM2SHORT(SMA_SLIDERARMPOSITION,SMA_INCREMENTVALUE),
+                    MPFROMLONG(0));
+
+        /* Set repeat check button if necessary */
+#if 0
+        /* This Does not work... Probably because hwndTopMiddle isn't set in the
+         instance data yet. Left in here so it isn't forgotten... */
+        winCheckRepeatButton(thisPtr);
+        winSetVolumeSlider(thisPtr);
+#endif
+
+        if(thisPtr->ulFlags&FLAG_REPEAT)
+          WinCheckButton(hwnd, IDCB_REPEAT,1);
+        if(thisPtr->ulFlags&FLAG_RANDOM)
+          WinCheckButton(hwnd, IDCB_RANDOM,1);
+
+
+        if(thisPtr->mfData)
+          WinSetPresParam(WinWindowFromID(hwnd, IDST_PLAYTIME),
+                          PP_FONTNAMESIZE,(ULONG)sizeof(thisPtr->mfData->chrPlayTimeFont),
+                          thisPtr->mfData->chrPlayTimeFont);
+      }
+      return (MRESULT)FALSE;
+      /*****************************************************/
+      /* The dialog is about to be destroyed               */
+      /*****************************************************/
+    case WM_DESTROY:
+      {
+        ULONG  attrFound;
+
+        thisPtr=(CWMediaFolder*) WinQueryWindowULong(hwnd,QWL_USER);
+        if(somIsObj(thisPtr)) {
+          if(thisPtr->mfData)
+            // Query the playtime font
+            WinQueryPresParam(WinWindowFromID(hwnd, IDST_PLAYTIME),
+                              PP_FONTNAMESIZE,0, &attrFound,sizeof(thisPtr->mfData->chrPlayTimeFont),
+                              thisPtr->mfData->chrPlayTimeFont, QPF_NOINHERIT);
+        }
+        break;
+      }
+      /*****************************************************/
+      /* Paint the background                              */
+      /*****************************************************/
+    case WM_PAINT:
+      {
+        SWP swp;
+        RECTL rcl;
+        HPS hps;
+
+        WinQueryWindowPos(hwnd,&swp);
+        if(swp.fl & SWP_MINIMIZE)
+          break;      
+        hps = WinBeginPaint( hwnd, NULLHANDLE, &rcl );
+        WinDrawBitmap(hps, allBMPs[MAIN_BMP_IDX].hbm,
+                      &rcl, 
+                      (PPOINTL)&rcl,
+                      0, 0,
+                      DBM_IMAGEATTRS);    
+        WinQueryWindowRect(hwnd, &rcl);
+        WinEndPaint( hps );        
+        return FALSE;
+      }
+      /*****************************************************/
+      /* The following two messages are for device sharing */
+      /*****************************************************/
+    case WM_ACTIVATE:
+      if(SHORT1FROMMP(mp1)){
+        thisPtr=(CWMediaFolder*) WinQueryWindowULong(hwnd,QWL_USER);
+        if(somIsObj(thisPtr)){
+          char chrCommand[100];
+
+          if(thisPtr->mrcPlaying) {
+            sprintf(chrCommand,"ACQUIRE wave%d QUEUE wait", thisPtr->iWave);
+            mciSendString(chrCommand, NULL, 0, 0, 0);
+          }
+        }
+      }
+      break;
+    case MM_MCIPASSDEVICE:
+      thisPtr=(CWMediaFolder*) WinQueryWindowULong(hwnd,QWL_USER);
+      if(somIsObj(thisPtr)){
+        HWND hwndFrame=WinQueryWindow(WinQueryWindow(hwnd,QW_PARENT),QW_PARENT);
+        switch(SHORT1FROMMP(mp2))
+          {
+          case MCI_GAINING_USE:
+              thisPtr->bPaused=FALSE;/* The time display will not be increased */
+               paintHilitedControl(WinWindowFromID(hwnd, IDPB_PAUSE), IDPB_PAUSE, FALSE);
+             return (MRESULT)0;
+          case MCI_LOSING_USE:
+              thisPtr->bPaused=TRUE;
+              paintHilitedControl(WinWindowFromID(hwnd, IDPB_PLAY), IDPB_PLAY, FALSE);
+              return (MRESULT)0;
+          default:
+            break;
+          }
+      }
+      break;
+      /*****************************************************/
+      /* Set the time in the palytime display.             */
+      /* SETPOSITIONADVICE does not work for some reason,  */
+      /* so a timer is used. Yes, it's quit cumbersome...  */
+      /*****************************************************/  
+    case WM_TIMER:
+      if(SHORT1FROMMP(mp1)==IDTIMER_PLAY) {
+        thisPtr=(CWMediaFolder*) WinQueryWindowULong(hwnd,QWL_USER);
+        if(somIsObj(thisPtr)){
+          char chrCommand[50];
+          char retMsg[20];
+          ULONG rc;
+          
+          if(!thisPtr->bPaused) {
+            /* Adjust position info if not paused. */
+            thisPtr->ulPos++;
+            if(thisPtr->ulPos*1000>thisPtr->ulTotalLength)
+              thisPtr->ulPos=thisPtr->ulTotalLength/1000;/* Prevent wrong time if timer info isn't accurate.
+                                                            I know all this timing stuff is an ugly thing. */
+
+            if(!bPosDragging) {
+              ULONG ulInc=thisPtr->ulTotalLength/1000;
+              setPlayTimeText(thisPtr); /* Set time display */
+              /* Catch potential division by zero trap */
+              if(ulInc)
+                ulInc=thisPtr->ulPos*100/ulInc;
+              else
+                ulInc=100;
+              /* Set slider position */
+              WinPostMsg( WinWindowFromID(hwnd, IDSL_POSBAR), 
+                          SLM_SETSLIDERINFO,
+                          MPFROM2SHORT(SMA_SLIDERARMPOSITION,SMA_INCREMENTVALUE),
+                          MPFROMLONG(ulInc));
+            }
+            thisPtr->cwPlayTimeCallback(WinQueryWindow(WinQueryWindow(hwnd,QW_PARENT),QW_PARENT), thisPtr->ulPos);
+            /* Blink play control */
+            paintHilitedControl(WinWindowFromID(hwnd, IDPB_PLAY), IDPB_PLAY, thisPtr->ulPos%2);
+          }
+          else {
+            /* Currently pausing */
+            togglePlayTimeDisplayVisibility(thisPtr);
+            paintHilitedControl(  WinWindowFromID(hwnd, IDPB_PAUSE), IDPB_PAUSE,
+                                 WinIsWindowVisible(WinWindowFromID(thisPtr->hwndTopMiddle, IDST_PLAYTIME)));
+          }
+        }
+        return (MRESULT)0;
+      }
+      break;
+      /*****************************************************/
+      /* Draw the sliders.                                 */
+      /*****************************************************/
+    case WM_DRAWITEM:
+      switch(SHORT1FROMMP(mp1))
+        {
+        case IDSL_POSBAR:
+        case IDSL_VOLUME:
+          return drawSlider(hwnd, msg, mp1, mp2, SHORT1FROMMP(mp1));
+        default:
+          break;
+        }              
+      break;
+      /*****************************************************/
+      /* Control messages                                  */
+      /*****************************************************/
+    case WM_CONTROL:
+      {
+        SWP swp;
+        char chrCommand[50];
+        char retMsg[20];
+        
+        thisPtr=(CWMediaFolder*) WinQueryWindowULong(hwnd,QWL_USER);
+        if(somIsObj(thisPtr)){
+          switch(SHORT1FROMMP(mp1))
+            {
+            case IDCB_REPEAT:
+              if(SHORT2FROMMP(mp1)== BN_CLICKED) {
+                if(WinQueryButtonCheckstate(hwnd,IDCB_REPEAT) & 1) {
+                  thisPtr->ulFlags|=FLAG_REPEAT;
+                }
+                else {
+                  thisPtr->ulFlags&=~FLAG_REPEAT;
+                }
+              }
+              return (MRESULT) FALSE;
+              break;
+            case IDCB_RANDOM:
+              if(SHORT2FROMMP(mp1)== BN_CLICKED) {
+                if(WinQueryButtonCheckstate(hwnd,IDCB_RANDOM) & 1) {
+                  thisPtr->ulFlags|=FLAG_RANDOM;
+                }
+                else {
+                  thisPtr->ulFlags&=~FLAG_RANDOM;
+                }
+              }
+              return (MRESULT) FALSE;
+              break;
+            default:
+              break;
+            }              
+          switch(SHORT2FROMMP(mp1))
+            {
+            case BN_PAINT:
+              /* Paint the custom controls (buttons, sliders ) */
+              WinQueryWindowPos(hwnd,&swp);
+              if(swp.fl & SWP_MINIMIZE)
+                break;
+              return paintControls(hwnd, msg, mp1, mp2);
+              /*****************************************************/
+              /* Handle position and volume changes.               */
+              /*****************************************************/
+            case SLN_SLIDERTRACK:
+              {
+                switch(SHORT1FROMMP(mp1))
+                  {
+                  case IDSL_VOLUME:
+                    {
+                      ULONG ulValue;
+                      
+                      ulValue=LONGFROMMP(mp2);
+                      thisPtr->ulVolume=ulValue;
+                      sprintf(chrCommand,"SET wave%d AUDIO VOLUME %d WAIT", thisPtr->iWave, thisPtr->ulVolume);
+                      mciSendString(chrCommand, retMsg, sizeof(retMsg), 0, 0);
+                      break;
+                    }
+                  case IDSL_POSBAR:
+                    {
+                      static lLastPos=0;
+                      long lPos=LONGFROMMP(mp2);
+              
+                      bPosDragging=TRUE;
+                      lPos*=thisPtr->ulTotalLength/100;
+                      if(lPos/1000!=lLastPos) {
+                        /* Prevent flickering */
+                        sprintf(chrCommand, "%ld:%02ld", lPos/1000/60, (lPos/1000)%60);
+                        WinSetWindowText(WinWindowFromID(hwnd, IDST_PLAYTIME), chrCommand);
+                        lLastPos=lPos/1000;
+                      }
+                      break;
+                    }
+                  default:
+                    break;
+                  }/* switch */
+                return (MRESULT) 0;
+                break;
+              }
+            case SLN_CHANGE:
+              {
+                switch(SHORT1FROMMP(mp1))
+                  {
+                  case IDSL_VOLUME:
+                    ULONG ulValue;
+                    
+                    ulValue=LONGFROMMP(mp2);
+                    thisPtr->ulVolume=ulValue;
+                    sprintf(chrCommand,"SET wave%d AUDIO VOLUME %d WAIT", thisPtr->iWave, thisPtr->ulVolume);
+                    mciSendString(chrCommand, retMsg, sizeof(retMsg), 0, 0);
+                    thisPtr->wpSaveDeferred();
+                    break;
+                  case IDSL_POSBAR:
+                    {
+                      ULONG rc;
+                      long lPos=LONGFROMMP(mp2);
+
+                      bPosDragging=FALSE;
+                      lPos*=1000;                      
+                      lPos*=thisPtr->ulTotalLength/100;
+                      lPos/=1000;// Use only full seconds
+
+                      /* Set time display first */
+
+                      thisPtr->cwSeekAudioFile(lPos);
+                      /* restart timer */
+                      WinStartTimer(WinQueryAnchorBlock(hwnd), hwnd, IDTIMER_PLAY, PLAYTIMER_DELAY);  
+                      thisPtr->ulPos=lPos/1000;
+                      break;
+                    }
+                  default:
+                    break;
+                  }/* switch */
+                return (MRESULT)TRUE;
+              }
+            default:
+              break;
+            }/* switch */
+          break;
+        }
+      }/* WM_CONTROL */
+
+      /*****************************************************/
+      /* Handle push button messages.                      */
+      /*****************************************************/
+    case WM_COMMAND:    
+      /* The play control handling for starting, stopping etc. */
+      thisPtr=(CWMediaFolder*) WinQueryWindowULong(hwnd,QWL_USER);
+      if(somIsObj(thisPtr)){
+        HWND hwndFrame=WinQueryWindow(WinQueryWindow(hwnd,QW_PARENT),QW_PARENT);
+        switch(SHORT1FROMMP(mp1))
+          {
+          case IDPB_PLAY:
+            paintHilitedControl(WinWindowFromID(hwnd, IDPB_PAUSE), IDPB_PAUSE, FALSE);
+            callMediaFolderMethod(thisPtr, PLAY_FIRST, 0);
+            break;
+          case IDPB_STOP:
+            paintHilitedControl(WinWindowFromID(hwnd, IDPB_PLAY), IDPB_PLAY, FALSE);
+            paintHilitedControl(WinWindowFromID(hwnd, IDPB_PAUSE), IDPB_PAUSE, FALSE);
+            callMediaFolderMethod(thisPtr, STOP_TRACK, 0);
+            break;
+          case IDPB_SKIPFORWARD:
+            paintHilitedControl(WinWindowFromID(hwnd, IDPB_PLAY), IDPB_PLAY, FALSE);
+            paintHilitedControl(WinWindowFromID(hwnd, IDPB_PAUSE), IDPB_PAUSE, FALSE);
+            callMediaFolderMethod(thisPtr, PLAY_NEXT, 0);
+            break;
+          case IDPB_SKIPBACK:
+            paintHilitedControl(WinWindowFromID(hwnd, IDPB_PLAY), IDPB_PLAY, FALSE);
+            paintHilitedControl(WinWindowFromID(hwnd, IDPB_PAUSE), IDPB_PAUSE, FALSE);
+            callMediaFolderMethod(thisPtr, PLAY_PREV, 0);
+            break;
+          case IDPB_PAUSE:
+            paintHilitedControl(WinWindowFromID(hwnd, IDPB_PLAY), IDPB_PLAY, FALSE);
+            callMediaFolderMethod(thisPtr, PAUSE_TRACK, 0);
+            break;
+            /* Popup menu over time control */
+          case ID_MENUITEMELAPSED:
+            thisPtr->usWhichDisplay=DISPLAY_TIMEELAPSED;
+            setPlayTimeText(thisPtr);
+            break;
+          case ID_MENUITEMREMAINING:
+            thisPtr->usWhichDisplay=DISPLAY_TIMEREMAINING;
+            setPlayTimeText(thisPtr);
+            break;
+          case ID_MENUITEMID3:
+            thisPtr->usWhichDisplay=DISPLAY_TIMEID3;
+            WinSetWindowULong(WinWindowFromID(thisPtr->hwndTopMiddle, IDST_PLAYTIME), QWL_USER, 0);
+            setPlayTimeText(thisPtr);
+            break;
+          default:
+            break;
+          }/* switch() */
+      }/* somIsObj()*/
+      return (MRESULT)FALSE;
+
+      /*****************************************************/
+      /* Make sure tabbing works.                          */
+      /*****************************************************/
+    case WM_CHAR:
+      if(SHORT1FROMMP(mp1) & KC_ALT) {  // Send keys with ALT modifier to the folder
+        HWND hwndTemp;
+        // Save control with focus
+        hwndTemp=WinQueryFocus(HWND_DESKTOP);
+        // Set focus to container so the key will be processed as usual
+        WinSetFocus(HWND_DESKTOP, WinWindowFromID(WinQueryWindow(WinQueryWindow(hwnd,QW_PARENT),QW_PARENT),FID_CLIENT));
+        // Set saved control as old focus owner so it will get the focus back when necessary, not the container
+        WinSetWindowULong(WinQueryWindow(WinQueryWindow(hwnd,QW_PARENT),QW_PARENT),QWL_HWNDFOCUSSAVE,hwndTemp);
+        return WinSendMsg(WinWindowFromID(WinQueryWindow(WinQueryWindow(hwnd,QW_PARENT),QW_PARENT),FID_CLIENT),msg,mp1,mp2);
+      }
+      else if((SHORT1FROMMP(mp1) & KC_VIRTUALKEY)== KC_VIRTUALKEY)
+        {
+          if(SHORT2FROMMP(mp2)==VK_TAB ) {
+            if(WinQueryFocus(HWND_DESKTOP)==WinWindowFromID(hwnd,IDSL_POSBAR)) {
+              // Set focus to container
+              WinSetFocus(HWND_DESKTOP, WinWindowFromID(WinQueryWindow(WinQueryWindow(hwnd,QW_PARENT),QW_PARENT),
+                                                        FID_CLIENT));
+              return (MRESULT)TRUE;
+            }
+          }/* if(SHORT2FROMMP(mp2)==VK_TAB ) */
+          else if(SHORT2FROMMP(mp2)==VK_BACKTAB )
+            {
+              if(WinQueryFocus(HWND_DESKTOP)==WinWindowFromID(hwnd,IDPB_SKIPBACK)) {
+                // Set focus to container
+                WinSetFocus(HWND_DESKTOP, WinWindowFromID(WinQueryWindow(WinQueryWindow(hwnd,QW_PARENT),QW_PARENT),
+                                                          FID_CLIENT));
+                return (MRESULT)TRUE;
+              }
+            }
+        }/* else if(SHORT1FROMMP(mp1) & KC_VIRTUALKEY) */
+      break;
+#if 0
+    case WM_CONTEXTMENU:
+      thisPtr=(CWMediaFolder*) WinQueryWindowULong(hwnd,QWL_USER);
+      if(somIsObj(thisPtr)){
+        POINTL ptl;
+        HWND hwndClient=WinWindowFromID(WinQueryWindow(WinQueryWindow(hwnd,QW_PARENT),QW_PARENT),FID_CLIENT);
+        WinQueryPointerPos(HWND_DESKTOP, &ptl) ;
+        WinMapWindowPoints(HWND_DESKTOP, hwndClient, &ptl, 1);
+
+        thisPtr->wpDisplayMenu(hwndClient, NULLHANDLE, &ptl,MENU_OBJECTPOPUP,NULL);
+      }
+      return MRFALSE;
+#endif
+      /*****************************************************/
+      /* Handle playtime display switching.                */
+      /* The messages are coming from the static text.     */
+      /*****************************************************/
+    case WM_APPTERMINATENOTIFY:
+      thisPtr=(CWMediaFolder*) WinQueryWindowULong(hwnd,QWL_USER);
+      if(somIsObj(thisPtr)){
+        switch(SHORT1FROMMP(mp1))
+          {
+          case NOTIFY_CLICK:
+            /* Clicked on the playtime display */
+            thisPtr->usWhichDisplay++;
+            if(thisPtr->usWhichDisplay>2)
+              thisPtr->usWhichDisplay=0;
+            if(thisPtr->usWhichDisplay==2)
+              WinSetWindowULong(WinWindowFromID(thisPtr->hwndTopMiddle, IDST_PLAYTIME), QWL_USER, 0);
+            setPlayTimeText(thisPtr);
+            return MRFALSE;
+          case NOTIFY_CONTEXT:
+            /* Show context menu. */            
+            contextMenu(hwnd, thisPtr->usWhichDisplay+ID_MENUITEMELAPSED, TRUE);
+            return MRFALSE;
+          default:
+            break;
+          }
+      }
+      return MRFALSE;
+
+#if 0
+    case MM_MCIPOSITIONCHANGE:
+      thisPtr=(CWMediaFolder*) WinQueryWindowULong(hwnd,QWL_USER);
+      if(somIsObj(thisPtr)){
+        char chrCommand[50];
+        char retMsg[20];
+        char retMsg2[20];
+        int iTime;
+        ULONG rc;
+        /* Restart check timer */
+        WinStartTimer(WinQueryAnchorBlock(hwnd), hwnd, IDTIMER_PLAY, PLAYTIMER_DELAY);  
+        sprintf(chrCommand,"STATUS wave%d POSITION WAIT", thisPtr->iWave);
+        rc = mciSendString(chrCommand, retMsg, sizeof(retMsg), 0, 0);
+        if((rc & 0x0000ffff)==MCIERR_SUCCESS) {
+          iTime=atoi(retMsg);
+          /* Set time display */
+          sprintf(chrCommand,"%d:%02d  %d:%02d  -%d:%02d",thisPtr->ulTotalLength/1000/60,(thisPtr->ulTotalLength/1000)%60,
+                  (iTime+thisPtr->ulStartPosition)/1000/60,((iTime+thisPtr->ulStartPosition)/1000)%60,
+                  (thisPtr->ulTotalLength-(iTime+thisPtr->ulStartPosition))/1000/60,
+                  ((thisPtr->ulTotalLength-(iTime+thisPtr->ulStartPosition))/1000)%60);
+          WinSetWindowText(WinWindowFromID(hwnd, IDST_PLAYTIME), chrCommand);
+          WinPostMsg( WinWindowFromID(hwnd, IDPB_POSBAR),
+                      SLM_SETSLIDERINFO,
+                      MPFROM2SHORT(SMA_SLIDERARMPOSITION,SMA_INCREMENTVALUE),
+                      MPFROMLONG( (LONG)((iTime/10)/(thisPtr->ulTotalLength/1000))));
+        }
+        else {
+          char retError[1024];
+          mciGetErrorString(rc, retError, 1024);
+          sprintf(chrCommand,"%s",  retMsg);
+          WinSetWindowText(WinWindowFromID(hwnd, IDST_PLAYTIME), chrCommand);
+        }
+      }
+      break;
+#endif
+    default:
+      break;
+    }
+  return WinDefDlgProc(hwnd, msg, mp1, mp2);
+}
+
+/************************************************************
+ *                                                          *
+ * This procedure calculates the positions for the custom   *
+ * frame controls.                                          *
+ * PM uses the pos to calculate the area which needs        *
+ * repainting and the pos of each control. Using this code  *
+ * prevents flickering.                                     *
+ *                                                          *
+ ************************************************************/
+MRESULT handleCalcValidRects(HWND hwnd, ULONG msg, MPARAM mp1, MPARAM mp2)
+{
+  PRECTL pRectl, pRectlNew;
+  PSWP pswp;
+  POINTL ptl;
+  
+  pswp=(PSWP)mp2; 
+  if(pswp->fl&SWP_SIZE) {
+    pRectl=(PRECTL)mp1;        
+    pRectlNew=pRectl;
+    pRectlNew++;
+
+    if(pRectlNew->xRight!=pRectl->xRight) { 
+      if(WinSendMsg(hwnd,WM_QUERYBORDERSIZE,(MPARAM)&ptl,0)) {
+        pRectl->xRight-=ptl.x;
+      }else {
+        /* Ok, then use some defaults. Better than nothing... */
+        pRectl->xRight-=4;
+      }
+      pRectlNew->xRight=pRectl->xRight;
+      return (MRESULT)0;
+    }
+    else if(pRectlNew->xLeft<pRectl->xLeft) {
+      if(WinSendMsg(hwnd,WM_QUERYBORDERSIZE,(MPARAM)&ptl,0)) {
+        pRectl->xLeft+=ptl.x;
+      }else {
+        /* Ok, then use some defaults. Better than nothing... */
+        pRectl->xLeft+=4;
+      }
+      pRectlNew->xLeft=pRectl->xLeft;
+      return (MRESULT)0;
+    }
+    else if(pRectlNew->xLeft<pRectl->xLeft) {
+      pRectlNew->xLeft=pRectl->xLeft;
+            
+      return (MRESULT)0;
+    } else if(pRectlNew->yBottom!=pRectl->yBottom || pRectlNew->yTop!=pRectl->yTop) {            
+      pRectlNew->yTop=pRectl->yTop;
+      pRectlNew->yBottom=pRectl->yBottom;
+      return (MRESULT)0;
+    }
+  }
+  return (MRESULT)0;
+}
+
+
+/************************************************************
+ *                                                          *
+ * When sizing and moving the folder the custom frame       *
+ * controls must be moved too so they  keep their visual    *
+ * position with respect to the left border of the folder.  *
+ *                                                          *
+ ************************************************************/
+void handleWindowPosChanged(HWND hwnd, ULONG msg, MPARAM mp1, MPARAM mp2)
+{
+  PSWP pswp=(PSWP)mp1;
+
+  if((pswp->fl & SWP_SIZE)&&!(pswp->fl & SWP_SHOW)) {
+    SWP swp;
+    HENUM hEnum;
+    HWND hwndClient;
+    PSWP pswpOld;
+    int xPos, yPos;
+    ULONG ulStyle;
+
+    pswpOld=pswp;
+    pswpOld++;
+
+    ulStyle=WinQueryWindowULong(WinQueryWindow(hwnd,QW_PARENT),QWL_STYLE);
+    if(!(ulStyle & WS_MINIMIZED) && !(ulStyle & WS_MAXIMIZED)  ) {
+      
+      if(pswpOld->x != pswp->x || 1) {
+        if((pswpOld->cx!=0)) {
+          xPos=(pswpOld->x > pswp->x ? pswpOld->x-pswp->x : 0);
+          //  yPos=(pswpOld->y > pswp->y  ? pswpOld->y-pswp->y : 0);
+        }
+        else {
+          xPos=0;
+        }
+        if(pswp->cx<=allBMPs[MAIN_BMP_IDX].bmpInfoHdr.cx)
+          WinSetWindowPos(WinWindowFromID(hwnd, IDDLG_TOPMIDDLE), NULLHANDLE, 0, 0, 0, 0, SWP_MOVE);
+        else
+          WinSetWindowPos(WinWindowFromID(hwnd, IDDLG_TOPMIDDLE), NULLHANDLE, (pswp->cx-allBMPs[MAIN_BMP_IDX].bmpInfoHdr.cx)/2, 
+                          0, 0, 0, SWP_MOVE);
+#if 0
+        /* Move all client windows so they keep their distance to the left border */
+        hEnum=WinBeginEnumWindows(hwnd);
+        while((hwndClient=WinGetNextWindow(hEnum))!=NULLHANDLE) {
+          if(WinQueryWindowULong())
+          WinQueryWindowPos(hwndClient,&swp);
+          WinSetWindowPos(hwndClient, NULLHANDLE, swp.x-xPos, (pswp->cy-swp.cy)/2/*swp.y-yPos*/, 0, 0, SWP_MOVE);
+        }/* while */
+        WinEndEnumWindows(hEnum);
+#endif
+      }
+    }
+  }
+}
+
+
+/****************************************************************************/
+/*                                                                          */
+/* This procedure handles the frame extension of the folder at the top      */
+/*                                                                          */
+/* The playcontrol dialog is a child of this 'background' dialog.           */
+/*                                                                          */
+/****************************************************************************/
+MRESULT EXPENTRY topCtrlDialogProc(HWND hwnd, ULONG msg, MPARAM mp1, MPARAM mp2) 
+{
+  CWMediaFolder *thisPtr;
+  char name[CCHMAXPATH];
+  ULONG ulNameSize;
+  SIZEL sizel;
+  ULONG ulFlags;
+  HWND hwndTemp;
+  POINTL ptl;
+  SHORT a,b;
+  HOBJECT hObject;
+    
+  switch(msg)
+    {
+      /*****************************************************/
+      /* Init the dialog                                   */
+      /*****************************************************/
+    case WM_INITDLG :
+      {
+        ULONG ulStyle;
+        SWP swp;
+        
+        WinSetWindowULong(hwnd,QWL_USER,(ULONG)PVOIDFROMMP(mp2));//Save object ptr.
+        thisPtr=(CWMediaFolder*) PVOIDFROMMP(mp2);
+        
+        hwndTemp=WinLoadDlg(hwnd, hwnd, playControlDialogProc, queryResModuleHandle(),
+                            IDDLG_TOPMIDDLE ,thisPtr);
+        WinQueryWindowPos(WinQueryWindow(hwnd,QW_PARENT),&swp);
+        /**!!!!!!!!!!    BORDERSIZE    !!!!!!!!!! **/
+        WinSetWindowPos(hwndTemp, NULL, (swp.cx-allBMPs[MAIN_BMP_IDX].bmpInfoHdr.cx)/2, 0, 
+                        allBMPs[MAIN_BMP_IDX].bmpInfoHdr.cx, allBMPs[MAIN_BMP_IDX].bmpInfoHdr.cy, SWP_SIZE|SWP_MOVE|SWP_SHOW);
+        thisPtr->hwndTopMiddle=hwndTemp;
+        /* Set dialog font to WarpSans for Warp 4 and above */
+        if(SysQueryOSRelease()>=40) {
+          WinSetPresParam(hwnd,
+                          PP_FONTNAMESIZE,(ULONG)sizeof(DEFAULT_DIALOG_FONT),
+                          DEFAULT_DIALOG_FONT );
+        }
+        return (MRESULT)FALSE;
+      }
+    case WM_CALCVALIDRECTS:
+      {
+        if(WinIsWindowVisible(hwnd))
+          return handleCalcValidRects(hwnd,  msg,  mp1,  mp2);
+        break;
+      }
+    case WM_WINDOWPOSCHANGED:
+      {
+        /* Move the clients of the framecontrol so they keep their distance to the left */
+        handleWindowPosChanged(hwnd, msg, mp1, mp2);
+        break;
+      }
+    case WM_CHAR:
+      // Set focus to container so the key will be processed as usual
+      WinSetFocus(HWND_DESKTOP, WinWindowFromID(WinQueryWindow(hwnd,QW_PARENT),FID_CLIENT));
+      return WinSendMsg(WinWindowFromID(WinQueryWindow(hwnd,QW_PARENT),FID_CLIENT),msg,mp1,mp2);
+
+      /*****************************************************/
+      /* Paint the background.                             */
+      /*****************************************************/
+    case WM_PAINT:
+      HPS hps;
+      RECTL rcl, rclSave, rclSource;
+      SWP swp;
+
+      hps=WinBeginPaint(hwnd, NULLHANDLE,NULL);
+      /* Get Window size */
+      WinQueryWindowRect(hwnd, &rcl);
+      rclSave=rcl;
+      /* Get size and pos of control area */
+      WinQueryWindowPos(WinWindowFromID(hwnd, IDDLG_TOPMIDDLE),&swp);
+      /* Left area */
+      rcl.xRight=swp.x;
+      rclSource.xLeft=0;
+      rclSource.yBottom=0;
+      rclSource.yTop=allBMPs[CTRLIDX_TOPLEFT].bmpInfoHdr.cy;
+      rclSource.xRight=allBMPs[CTRLIDX_TOPLEFT].bmpInfoHdr.cx;
+      WinDrawBitmap(hps, allBMPs[CTRLIDX_TOPLEFT].hbm,
+                    &rclSource, 
+                    (PPOINTL)&rclSave,
+                    0, 0,
+                    DBM_IMAGEATTRS | DBM_STRETCH);
+
+      /* Right area */
+      rclSave.xLeft=swp.x+swp.cx;
+      rclSource.xLeft=0;
+      rclSource.yBottom=0;
+      rclSource.yTop=allBMPs[CTRLIDX_TOPRIGHT].bmpInfoHdr.cy;
+      rclSource.xRight=allBMPs[CTRLIDX_TOPRIGHT].bmpInfoHdr.cx;
+      WinDrawBitmap(hps, allBMPs[CTRLIDX_TOPRIGHT].hbm,
+                    &rclSource, 
+                    (PPOINTL)&rclSave,
+                    0, 0,
+                    DBM_IMAGEATTRS | DBM_STRETCH);
+
+      WinEndPaint(hps);
+      return (MRESULT) 0;
+    case WM_COMMAND:    
+      thisPtr=(CWMediaFolder*) WinQueryWindowULong(hwnd,QWL_USER);
+      if(somIsObj(thisPtr)){
+        switch(SHORT1FROMMP(mp1))
+          {
+          case IDPB_PAUSE:
+            {
+#if 0
+              CNRINFO cnrInfo;
+              HWND hwndContainer; 
+              FIELDINFO fi;
+              PFIELDINFO pfi, pfiFirst;
+              char text[200];
+              int numLeft=0;
+              int numRight=0;
+              int numVisLeft=0;
+              int numVisRight=0;
+              int a=0;
+              LONG lWidth[100];
+              HPS hps;
+              FONTMETRICS fm={0};
+              RECTL rcl2;
+              ULONG  attrFound;
+              char chrFontName[50];
+              char *chrPtr;
+
+              THREADPARAMS* pTp;
+              ULONG ulErr;
+
+              return (MRESULT)0;
+
+              pTp=(THREADPARAMS*)thisPtr->wpAllocMem(sizeof(THREADPARAMS), &ulErr);
+              pTp->thisPtr=thisPtr;
+              pTp->hwndFrame=WinQueryWindow(hwnd, QW_PARENT);
+
+              //  _beginthread(rexxThreadFunc,NULL,8192*16,(void*)pTp); //Fehlerbehandlung fehlt
+              hwndContainer=WinWindowFromID(WinQueryWindow(hwnd,QW_PARENT), FID_CLIENT);
+              return (MRESULT)0;
+              WinSendMsg(hwndContainer,CM_QUERYCNRINFO, MPFROMP(&cnrInfo),
+                                              MPFROMLONG(sizeof(cnrInfo)));
+
+              pfi=(PFIELDINFO)WinSendMsg(hwndContainer,CM_QUERYDETAILFIELDINFO, NULLHANDLE,
+                                              MPFROMSHORT(CMA_FIRST));
+              if(!pfi)
+                return (MRESULT)0;
+              lWidth[a]=(LONG)WinSendMsg(hwndContainer,CM_QUERYDETAILFIELDINFO, MPFROMP(pfi),
+                                              MPFROMLONG(0x200));
+              pfiFirst=pfi;
+              numRight++;
+              a++;
+              if(!(pfi->flData & CFA_INVISIBLE))
+                numVisRight++;
+              while(pfi){
+                if(pfi==cnrInfo.pFieldInfoLast) {
+                  numLeft=numRight;
+                  numRight=0;
+                  numVisLeft=numVisRight;
+                  numVisRight=0;
+                }
+                pfi=(PFIELDINFO)WinSendMsg(hwndContainer,CM_QUERYDETAILFIELDINFO, MPFROMP(pfi),
+                                           MPFROMSHORT(CMA_NEXT));
+                if(pfi) {
+                  lWidth[a]=(LONG)WinSendMsg(hwndContainer,CM_QUERYDETAILFIELDINFO, MPFROMP(pfi),
+                                       MPFROMLONG(0x200));
+                  a++;
+                  numRight++;
+                  if(!(pfi->flData & CFA_INVISIBLE))
+                    numVisRight++;
+                }
+              }
+
+              pfi=pfiFirst;
+              // Query the current font
+              WinQueryPresParam(hwndContainer,
+                                PP_FONTNAMESIZE,0,&attrFound,sizeof(chrFontName),
+                                chrFontName,QPF_NOINHERIT);
+              /* 0 means error */
+              fm.lEmHeight=atol(chrFontName);
+              if((chrPtr=strchr(chrFontName, '.'))!=NULLHANDLE)
+                chrPtr++;
+
+              hps=WinGetPS(hwndContainer);
+              strcpy(fm.szFacename, chrPtr);
+
+              GpiQueryFontMetrics(hps,sizeof(fm),&fm);
+
+              WinReleasePS(hps);
+              sprintf(text,"%s num: %d CFA_OWNER: %s numLeft: %d numRight: %d numVisLeft: %d numVisRight: %d",
+                      pfi->pTitleData,
+                      cnrInfo.cFields, 
+                      (pfi->flData & CFA_OWNER ? "Yes": "No"), 
+                      numLeft, numRight,numVisLeft, numVisRight);
+              WinMessageBox(HWND_DESKTOP, HWND_DESKTOP, text, "", 1234, MB_OK|MB_MOVEABLE);
+
+              WinSendMsg(hwndContainer, CM_QUERYVIEWPORTRECT, MPFROMP(&rcl) , MPFROM2SHORT(CMA_WORKSPACE, FALSE));
+              WinSendMsg(hwndContainer, CM_QUERYVIEWPORTRECT, MPFROMP(&rcl2) , MPFROM2SHORT(CMA_WINDOW, FALSE));
+
+              sprintf(text,"%d %d %d %d %d %d %d average: %d average*3 %d rcl.xLeft: %d rcl.xRight %d %d rcl2.xLeft: %d rcl2.xRight %d %d", 
+                      lWidth[0], lWidth[1], lWidth[2], lWidth[3], lWidth[4], 
+                      lWidth[5], lWidth[6],
+                      fm.lAveCharWidth, fm.lAveCharWidth*3 , rcl.xLeft,rcl.xRight, rcl.xRight-rcl.xLeft
+                      , rcl2.xLeft,rcl2.xRight, rcl2.xRight-rcl2.xLeft);
+
+              WinMessageBox(HWND_DESKTOP, HWND_DESKTOP, text, "", 1234, MB_OK|MB_MOVEABLE);
+              //  DosBeep(5000,300);
+              return (MRESULT)0;
+
+              // WinMessageBox(HWND_DESKTOP, HWND_DESKTOP, "Noch nicht implementiert..", "", 1234, MB_OK|MB_MOVEABLE);
+              char chrCommand[200];
+              PUSEITEM pUseItem;
+              PVIEWITEM pViewItem;
+              PVIEWITEM pView;
+              WPObject *wpObj;
+              WPObject *wpObject;
+
+              PMINIRECORDCORE mrc;
+              M_WPObject *mWPObject;
+
+              hwndContainer=WinWindowFromID(WinQueryWindow(hwnd,QW_PARENT), FID_CLIENT);
+              mWPObject=thisPtr->wpQueryFldrDetailsClass();
+
+              /* Selected object */
+              /* Get first selected container item of our folder */
+              mrc=(PMINIRECORDCORE)WinSendMsg(hwndContainer,CM_QUERYRECORDEMPHASIS, MPFROMSHORT(CMA_FIRST),
+                                              MPFROMSHORT(CRA_SELECTED));
+
+              while(mrc) {
+                wpObj=(WPObject*)OBJECT_FROM_PREC(mrc);//Get object
+                wpObject=thisPtr->cwGetFileSystemObject(wpObj);
+                if(wpObject!=wpObj && wpObject) {
+                  if(somIsObj(wpObject)) {
+                    if(wpObject->somIsA(mWPObject)) {
+                      ULONG ulFieldSize=0;
+                      /* Fieldinfosize */
+                      ULONG ulCols=mWPObject->wpclsQueryDetailsInfo(NULL, &ulFieldSize);
+                      ULONG ulDataSize=0;
+                      PBYTE memFieldPtr, memFieldPtrSave;
+                      static PBYTE memPtr, memPtrSave;
+                      ULONG ulRC;
+                      PCLASSFIELDINFO pcfi;
+                      PFIELDINFO pfi;
+                      int a;
+                      PSZ *theStrings;
+                      PBYTE  bPtr;
+                      
+                      /* Detailsdata size */
+                      wpObject->wpQueryDetailsData(NULL, &ulDataSize);
+                      
+                      /* For now some safety */
+                      ulDataSize*=4;
+                      
+                      if((memFieldPtr=thisPtr->wpAllocMem(ulFieldSize, &ulRC))!=NULLHANDLE) {
+                        memFieldPtrSave=memFieldPtr;
+                        mWPObject->wpclsQueryDetailsInfo( (PCLASSFIELDINFO*)&memFieldPtr, &ulFieldSize);
+                        if((memPtr=thisPtr->wpAllocMem(ulDataSize, &ulRC))!=NULLHANDLE) {
+                          memPtrSave=memPtr;
+                          memset(memPtr, 0, ulDataSize);
+                          
+                          /* Query details data */
+                          wpObject->wpQueryDetailsData( (PPVOID)&memPtr, &ulDataSize);
+                          pcfi=(PCLASSFIELDINFO)memFieldPtr;
+                          pcfi=pcfi->pNextFieldInfo;
+                          
+                          /* Get first fieldinfo */
+                          pfi=(PFIELDINFO)WinSendMsg(hwndContainer,CM_QUERYDETAILFIELDINFO, MPFROMLONG(0L),
+                                                     MPFROMSHORT(CMA_FIRST));
+                          memPtr=memPtrSave;
+                          PSZ* ptr;
+                          PSZ* mrcPtr;
+                          for(a=1, pcfi=(PCLASSFIELDINFO)memFieldPtr,ptr=(PSZ*)memPtr; 
+                              a<=ulCols && pcfi && pfi; 
+                              pfi=pfi->pNextFieldInfo, pcfi=pcfi->pNextFieldInfo,a++)
+                            {
+                              PFIELDINFO pfi2=NULL;
+                              PBYTE temp;
+                              PBYTE temp2;
+                              temp=(PBYTE)mrc;
+                              temp2=temp;
+                              temp+=pfi->offStruct;
+                              mrcPtr=(PSZ*)temp;
+
+                              if(pfi->offStruct >= mrc->cb) {
+                                /* do something here */
+                                if(a==7) {
+                                  *mrcPtr=*ptr;
+                                  //  pfi->flData&=~(CFA_OWNER|CFA_IGNORE);
+                                  //  pfi->flData&=~(CFA_OWNER);
+                                }                                
+                                mrcPtr++;
+                                ptr++;
+                              }/* offStruct*/
+                            }/* for pcfi */
+                          DosBeep(5000, 50);
+                          thisPtr->wpFreeMem(memPtrSave);
+                        }
+                        thisPtr->wpFreeMem(memFieldPtrSave);
+                      }
+                    }/* somIsA */
+                  }/* somIsObj */
+                }
+                /* Get next container item of our folder */
+                mrc=(PMINIRECORDCORE)WinSendMsg(hwndContainer,CM_QUERYRECORD,mrc,
+                                                MPFROM2SHORT(CMA_NEXT,CMA_ITEMORDER));
+              };/* mrc */
+
+
+              WinSendMsg(hwndContainer,CM_INVALIDATERECORD, NULL,
+                         MPFROM2SHORT(0, CMA_TEXTCHANGED));
+              DosBeep(500,300);
+
+#if 0
+              sprintf(chrCommand, "a: %d: Title: %s ptr: %lx *ptr: %lx ,*bPtr: %lx, offset: %x cb: %x", 
+                      a, pcfi->pTitleData, ptr, *ptr, *ptrMrc , pfi->offStruct, mrc->cb  
+                      );
+              WinMessageBox(HWND_DESKTOP, HWND_DESKTOP, chrCommand, "", 1234, MB_OK|MB_MOVEABLE);
+
+              if(a==6) {                                
+                sprintf(chrCommand,
+                        "a: %d: Title: %s ptr: %lx *ptr: %lx ,*bPtr: %lx, %s offset: %x flData: %x %x", 
+                        a, pcfi->pTitleData, ptr, *ptr, *ptrMrc , *ptr, pfi->offStruct  
+                        ,pfi->flData ,mrc->cb);
+                //WinMessageBox(HWND_DESKTOP, HWND_DESKTOP, chrCommand, "6", 1234, MB_OK|MB_MOVEABLE);
+                //  *ptrMrc="00:00";
+                /* Make column visible */
+                //                                  pfi->flData |=(CFA_STRING | CFA_FIREADONLY);
+              }/* a */
+              if(a==26) {
+                PSZ* ptr;
+                PSZ* ptrMrc;
+
+                DosBeep(500, 20);
+                bPtr=(BYTE*) mrc;
+                bPtr+=pfi->offStruct;
+                ptr=(PSZ*)memPtr;
+                ptrMrc=(PSZ*)bPtr;
+                *ptrMrc=*ptr;
+                *ptrMrc="00:00";
+              }/* a */
+#endif
+#if 0
+              /* Get first selected container item of our folder */
+              mrc=(PMINIRECORDCORE)WinSendMsg(hwndContainer,CM_QUERYRECORDEMPHASIS, MPFROMSHORT(CMA_FIRST),
+                                              MPFROMSHORT(CRA_SELECTED));
+              if(mrc) {
+                wpObject=(WPObject*)OBJECT_FROM_PREC(mrc);//Get object
+                if(somIsObj(wpObject)) {
+                  DosBeep(5000,300);
+                  for(pView=wpObject->wpFindViewItem( 0xFFFFFFFF, NULL );pView;
+                      pView=NULLHANDLE/*wpObject->wpFindViewItem( 0xFFFFFFFF, pView )*/)
+                    {
+
+                    }
+                  DosBeep(500,300);
+                }
+              }
+#endif
+              break;
+#endif
+            }
+      default:
+        break;
+      }
+    }
+  return (MRESULT) TRUE;
+default:
+  break;
+}
+return WinDefDlgProc(hwnd, msg, mp1, mp2);
+}
+
+
+MRESULT EXPENTRY leftCtrlDialogProc(HWND hwnd, ULONG msg, MPARAM mp1, MPARAM mp2) 
+{
+  CWMediaFolder *thisPtr;
+  
+  char name[CCHMAXPATH];
+  ULONG ulNameSize;
+  SIZEL sizel;
+  ULONG ulFlags;
+  HWND hwndTemp;
+  POINTL ptl;
+  SHORT a,b;
+  HOBJECT hObject;
+  static  PMINIRECORDCORE pmrcInserted=NULL;
+    
+  switch(msg)
+    {
+    case WM_INITDLG :   
+      WinSetWindowULong(hwnd,QWL_USER,(ULONG)PVOIDFROMMP(mp2));//Save object ptr.
+      thisPtr=(CWMediaFolder*) PVOIDFROMMP(mp2);
+      if(somIsObj(thisPtr)) {
+        WinSendMsg( WinWindowFromID(hwnd, IDSL_VOLUME),
+                    SLM_SETSLIDERINFO,
+                    MPFROM2SHORT(SMA_SLIDERARMPOSITION,SMA_INCREMENTVALUE),
+                    MPFROMLONG( thisPtr->ulVolume));
+      }
+      /* Set dialog font to WarpSans for Warp 4 and above */
+      if(SysQueryOSRelease()>=40) {
+        WinSetPresParam(hwnd,
+                        PP_FONTNAMESIZE,(ULONG)sizeof(DEFAULT_DIALOG_FONT),
+                        DEFAULT_DIALOG_FONT );
+      }      
+      return (MRESULT)FALSE;
+    case WM_CHAR:
+      // Set focus to container so the key will be processed as usual
+      WinSetFocus(HWND_DESKTOP, WinWindowFromID(WinQueryWindow(hwnd,QW_PARENT),FID_CLIENT));
+      return WinSendMsg(WinWindowFromID(WinQueryWindow(hwnd,QW_PARENT),FID_CLIENT),msg,mp1,mp2);
+
+    case WM_PAINT:
+      {
+        HPS hps;
+        RECTL rcl, rclSource;
+        POINTL ptl;
+        LONG lTemp;
+
+        if(allBMPs[CTRLIDX_TOPLEFT].hbm) {
+          hps=WinBeginPaint(hwnd, NULL, &rcl);
+          rclSource.xLeft=0;
+          rclSource.yBottom=0;
+          rclSource.yTop=allBMPs[CTRLIDX_TOPLEFT].bmpInfoHdr.cy;
+          rclSource.xRight=allBMPs[CTRLIDX_TOPLEFT].bmpInfoHdr.cx;
+          lTemp=rcl.xLeft/rclSource.xRight;
+          ptl.x=lTemp*rclSource.xRight;
+          lTemp=rcl.yBottom/rclSource.yTop;
+          lTemp*=rclSource.yTop;   
+          //WinFillRect(hps, &rcl, CLR_RED);
+          while(ptl.x<rcl.xRight) {
+            ptl.y=lTemp;
+            while(ptl.y<rcl.yTop) {/* y direction */
+              //DosBeep(5000,100);
+              WinDrawBitmap(hps, allBMPs[CTRLIDX_TOPLEFT].hbm,
+                            &rclSource, 
+                            (PPOINTL)&ptl,
+                            0, 0,
+                            DBM_IMAGEATTRS);
+              ptl.y+=allBMPs[CTRLIDX_TOPLEFT].bmpInfoHdr.cy;
+              //DosSleep(200);
+            };
+            ptl.x+=allBMPs[CTRLIDX_TOPLEFT].bmpInfoHdr.cx; 
+          };
+          WinEndPaint(hps);
+          return (MRESULT)0;
+        }
+        break;
+      }
+    case WM_CONTROL:
+      switch(SHORT1FROMMP(mp1))
+        {
+          return (MRESULT)0;
+        default:
+          break;
+        }
+      break;
+    case WM_COMMAND:
+      thisPtr=(CWMediaFolder*) WinQueryWindowULong(hwnd,QWL_USER);
+      if(somIsObj(thisPtr)){
+        switch(SHORT1FROMMP(mp1))
+          {
+          case IDPB_ADD:
+            {
+              HWND hwndContainer;
+              HWND hwndInsert;
+              PMINIRECORDCORE mrc;
+
+              WPObject *wpObject;
+
+              hwndContainer=WinWindowFromID(WinQueryWindow(hwnd,QW_PARENT), FID_CLIENT);
+              /* Get first selected container item of our folder */
+              mrc=(PMINIRECORDCORE)WinSendMsg(hwndContainer,CM_QUERYRECORDEMPHASIS, MPFROMSHORT(CMA_FIRST),
+                                              MPFROMSHORT(CRA_SELECTED));
+              if(mrc)
+                {
+                  DosBeep(5000, 500);
+                  wpObject=(WPObject*)OBJECT_FROM_PREC(mrc);//Get object
+                  if(somIsObj(wpObject)) {
+                    POINTL ptl= {40,40};
+
+                    DosBeep(500, 500);
+                    hwndInsert=WinWindowFromID(hwnd, IDCNR_PLAYLIST);
+                    if(!pmrcInserted)
+                      DosBeep(5000, 500);
+                      pmrcInserted=wpObject->wpCnrInsertObject(hwndInsert, &ptl,NULL, NULL );                 
+                  }
+                }
+            break;
+            }
+          case IDPB_REMOVE:
+            {
+              HWND hwndInserted;
+              WPObject *wpObject;
+
+              hwndInserted=WinWindowFromID(hwnd, IDCNR_PLAYLIST);
+              if(pmrcInserted) {
+                DosBeep(5000, 500);
+                wpObject=(WPObject*)OBJECT_FROM_PREC(pmrcInserted);//Get object
+                if(wpObject->wpCnrRemoveObject(hwndInserted))
+                  pmrcInserted=NULL;
+              }
+              break;
+            }
+          default:
+            break;
+          }
+      }
+      return (MRESULT) TRUE;
+    default:
+      break;
+    }
+  return WinDefDlgProc(hwnd, msg, mp1, mp2);
+}
+
+ULONG modulo(ULONG start,ULONG* delta, ULONG max)
+{   
+  while(start>max) {/* Probably slow for small bitmaps and wide screens. Anyone volunteering to write better code? */
+    start-=max;
+  };
+  *delta=max-start;
+  return start;
+}
+
+/****************************************************************************/
+/*                                                                          */
+/* This procedure handles the frame extension of the folder on the right    */
+/*                                                                          */
+/****************************************************************************/
+MRESULT EXPENTRY rightCtrlDialogProc(HWND hwnd, ULONG msg, MPARAM mp1, MPARAM mp2) 
+{
+  CWMediaFolder *thisPtr;
+
+  switch(msg)
+    {
+    case WM_INITDLG :   
+      WinSetWindowULong(hwnd,QWL_USER,(ULONG)PVOIDFROMMP(mp2));//Save object ptr.
+      thisPtr=(CWMediaFolder*) PVOIDFROMMP(mp2);
+      if(somIsObj(thisPtr)) {
+        WinSendMsg( WinWindowFromID(hwnd, IDSL_VOLUME),
+                    SLM_SETSLIDERINFO,
+                    MPFROM2SHORT(SMA_SLIDERARMPOSITION,SMA_INCREMENTVALUE),
+                    MPFROMLONG( thisPtr->ulVolume));
+      }
+      /* Set dialog font to WarpSans for Warp 4 and above */
+      if(SysQueryOSRelease()>=40) {
+        WinSetPresParam(hwnd,
+                        PP_FONTNAMESIZE,(ULONG)sizeof(DEFAULT_DIALOG_FONT),
+                        DEFAULT_DIALOG_FONT );
+      }
+
+      return (MRESULT)FALSE;
+    case WM_CHAR:
+      // Set focus to container so the key will be processed as usual
+      WinSetFocus(HWND_DESKTOP, WinWindowFromID(WinQueryWindow(hwnd,QW_PARENT),FID_CLIENT));
+      return WinSendMsg(WinWindowFromID(WinQueryWindow(hwnd,QW_PARENT),FID_CLIENT),msg,mp1,mp2);
+    case WM_PAINT:
+      {
+        HPS hps;
+        RECTL rcl, rclSource;
+        POINTL ptl;
+        LONG lTemp;
+
+        if(allBMPs[CTRLIDX_TOPRIGHT].hbm) {
+          hps=WinBeginPaint(hwnd, NULL, &rcl);
+          rclSource.xLeft=0;
+          rclSource.yBottom=0;
+          rclSource.yTop=allBMPs[CTRLIDX_TOPRIGHT].bmpInfoHdr.cy;
+          rclSource.xRight=allBMPs[CTRLIDX_TOPRIGHT].bmpInfoHdr.cx;
+          lTemp=rcl.xLeft/rclSource.xRight;
+          ptl.x=lTemp*rclSource.xRight;
+          lTemp=rcl.yBottom/rclSource.yTop;
+          lTemp*=rclSource.yTop;   
+          //WinFillRect(hps, &rcl, CLR_RED);
+          while(ptl.x<rcl.xRight) {
+            ptl.y=lTemp;
+            while(ptl.y<rcl.yTop) {/* y direction */
+              //DosBeep(5000,100);
+              WinDrawBitmap(hps, allBMPs[CTRLIDX_TOPRIGHT].hbm,
+                            &rclSource, 
+                            (PPOINTL)&ptl,
+                            0, 0,
+                            DBM_IMAGEATTRS);
+              ptl.y+=allBMPs[CTRLIDX_TOPRIGHT].bmpInfoHdr.cy;
+              //DosSleep(200);
+            };
+            ptl.x+=allBMPs[CTRLIDX_TOPRIGHT].bmpInfoHdr.cx; 
+          };
+          WinEndPaint(hps);
+          return (MRESULT)0;
+        }
+        break;
+      }
+    case WM_CONTROL:
+      switch(SHORT1FROMMP(mp1))
+        {
+
+          return (MRESULT)0;
+        default:
+          break;
+        }
+      break;
+    case WM_COMMAND:    
+      thisPtr=(CWMediaFolder*) WinQueryWindowULong(hwnd,QWL_USER);
+      if(somIsObj(thisPtr)){
+        switch(SHORT1FROMMP(mp1))
+          {
+          default:
+            break;
+          }
+      }
+      return (MRESULT) TRUE;
+    default:
+      break;
+    }
+  return WinDefDlgProc(hwnd, msg, mp1, mp2);
+}
+
+/****************************************************************************/
+/*                                                                          */
+/* This procedure is used to position the controls on the bottom frame ctrl */
+/* when the folder is sized or a new item is added to the launchpad.        */
+/*                                                                          */
+/****************************************************************************/
+static void _setBottomCtrlClientsPos(HWND hwnd)
+{
+  HWND hwndClient;
+  SWP swp, swp2;
+  
+  WinQueryWindowPos(hwnd, &swp2);
+  hwndClient=WinWindowFromID(hwnd, 1234);
+  WinQueryWindowPos(hwndClient,&swp);
+  WinSetWindowPos(hwndClient,NULLHANDLE,  20, 0,0,0,SWP_MOVE);
+  
+  hwndClient=WinWindowFromID(hwnd, IDST_STATUSTEXT);
+  WinSetWindowPos(hwndClient,NULLHANDLE,  swp.cx+20+20, 0,  swp2.cx-4,
+                  swp2.cy-2, SWP_MOVE|SWP_SIZE|SWP_SHOW);
+}
+
+/****************************************************************************/
+/*                                                                          */
+/* This procedure handles the frame extension of the folder at the bottom   */
+/*                                                                          */
+/****************************************************************************/
+MRESULT EXPENTRY bottomCtrlDialogProc(HWND hwnd, ULONG msg, MPARAM mp1, MPARAM mp2) 
+{
+  CWMediaFolder *thisPtr;
+
+  switch(msg)
+    {
+    case WM_INITDLG :
+      {
+        WinSetWindowULong(hwnd,QWL_USER,(ULONG)PVOIDFROMMP(mp2));//Save object ptr.
+        thisPtr=(CWMediaFolder*) PVOIDFROMMP(mp2);
+        /* Set dialog font to WarpSans for Warp 4 and above */
+        if(SysQueryOSRelease()>=40) {
+          WinSetPresParam(hwnd,
+                          PP_FONTNAMESIZE,(ULONG)sizeof(DEFAULT_DIALOG_FONT),
+                          DEFAULT_DIALOG_FONT );
+        }
+        oldStaticTextProc=WinSubclassWindow(WinWindowFromID(hwnd, IDST_STATUSTEXT), staticTextProc);
+
+        /* Build launchpad control */
+        if(somIsObj(thisPtr)) {
+          SWP swp, swp2;
+          char text[200];          
+          thisPtr->lPad=new launchPad(hwnd, hwnd, TRUE, (WPFolder*) PVOIDFROMMP(mp2), &lplAllLPads, NULLHANDLE, 0);
+          WinQueryWindowPos(hwnd,&swp);
+          if(thisPtr->lPad) {
+            thisPtr->lPad->lpSetConfiguration(chrInstallDir, MEDIAFLDR_TBID);
+            thisPtr->lPad->lpSetLaunchPadPos(NULLHANDLE,  20, 0,
+                                             30 , swp.cy-2, SWP_SIZE | SWP_MOVE);
+            thisPtr->lPad->lpFillPad();
+            if(!getMessage(text, IDSTR_LAUNCHPADFLYOVER, sizeof(text), queryResModuleHandle(), hwnd))
+              strncpy(text, "Launchpad: Drop objects here", sizeof(text));
+            text[sizeof(text)-1]=0;
+            thisPtr->lPad->lpSetFlyOverText(text);
+          }
+        }
+        /* 
+           FIXME:
+           Start timer which triggers time calculation. The timer is rather long so the objects may
+           awake first. This is not yet bullet proof, because if there're a lot of objects in the folder
+           the time will be too short. */
+        WinStartTimer(WinQueryAnchorBlock(hwnd),hwnd, IDTIMER_STATUS, 5000);
+        return (MRESULT)FALSE;
+      }
+    case WM_TIMER:
+      if(SHORT1FROMMP(mp1)==IDTIMER_STATUS) {
+        thisPtr=(CWMediaFolder*) WinQueryWindowULong(hwnd,QWL_USER);
+        if(somIsObj(thisPtr)){
+          THREADPARAMS* pTp;
+          ULONG ulErr;
+          SWP swp;
+          char text[100];
+
+          _setBottomCtrlClientsPos(hwnd);
+          getMessage(text, IDSTR_STATUSCOLLECTING, sizeof(text), queryResModuleHandle(),hwnd);
+          WinSetWindowText(WinWindowFromID(hwnd, IDST_STATUSTEXT), text);
+          if(!(thisPtr->wpQueryFldrFlags() & FOI_POPULATEDWITHALL)) {
+            WinStartTimer(WinQueryAnchorBlock(hwnd),hwnd, IDTIMER_STATUS, 300);
+            return MRFALSE;
+          }
+          pTp=(THREADPARAMS*)thisPtr->wpAllocMem(sizeof(THREADPARAMS), &ulErr);
+          pTp->thisPtr=thisPtr;
+          pTp->hwndFrame=WinQueryWindow(hwnd, QW_PARENT);
+          _beginthread(openThreadFunc,NULL,8192*16,(void*)pTp); //Fehlerbehandlung fehlt
+        };
+        WinStopTimer(WinQueryAnchorBlock(hwnd), hwnd, IDTIMER_STATUS);
+        return MRFALSE;
+      }
+      break;
+    case WM_CHAR:
+      // Set focus to container so the key will be processed as usual
+      WinSetFocus(HWND_DESKTOP, WinWindowFromID(WinQueryWindow(hwnd,QW_PARENT),FID_CLIENT));
+      return WinSendMsg(WinWindowFromID(WinQueryWindow(hwnd,QW_PARENT),FID_CLIENT),msg,mp1,mp2);
+    case WM_CALCVALIDRECTS:
+      {
+        if(WinIsWindowVisible(hwnd))
+          return handleCalcValidRects(hwnd,  msg,  mp1,  mp2);
+        break;
+      }
+    case WM_WINDOWPOSCHANGED:
+      {
+        /* Move the clients of the framecontrol so they keep their distance to the left */
+        PSWP pswp=(PSWP)mp1;
+        if((pswp->fl & SWP_SIZE)&&!(pswp->fl & SWP_SHOW)) {
+          PSWP pswpOld;
+          ULONG ulStyle;
+          
+          pswpOld=pswp;
+          pswpOld++;
+
+          if(!(ulStyle & WS_MINIMIZED) && !(ulStyle & WS_MAXIMIZED) ) {
+            HWND hwndClient;
+            SWP swp, swp2;
+            
+            hwndClient=WinWindowFromID(hwnd, 1234);
+            WinQueryWindowPos(hwndClient,&swp);
+            WinSetWindowPos(hwndClient,NULLHANDLE,  20, 0,0,0,SWP_MOVE);
+            
+            hwndClient=WinWindowFromID(hwnd, IDST_STATUSTEXT);
+            WinSetWindowPos(hwndClient,NULLHANDLE,  swp.cx+20+20, 0, pswp->cx-4-20-swp.cx,
+                            pswp->cy-2, SWP_MOVE|SWP_SIZE);
+          }
+        }
+        break;
+      }
+    case WM_APPTERMINATENOTIFY:
+      if(SHORT1FROMMP(mp1)==NOTIFY_STARTSTATUSTIMER)
+        {
+          WinStartTimer(WinQueryAnchorBlock(hwnd),hwnd, IDTIMER_STATUS, 300);
+          return MRFALSE;
+        }
+      break;
+    case WM_PAINT:
+      {
+        HPS hps;
+        RECTL rcl, rclSource;
+        POINTL ptl;
+        LONG lTemp;
+
+        if(allBMPs[CTRLIDX_BOTTOM].hbm) {
+          hps=WinBeginPaint(hwnd, NULL, &rcl);
+          rclSource.xLeft=0;
+          rclSource.yBottom=0;
+          rclSource.yTop=allBMPs[CTRLIDX_BOTTOM].bmpInfoHdr.cy;
+          rclSource.xRight=allBMPs[CTRLIDX_BOTTOM].bmpInfoHdr.cx;
+          lTemp=rcl.xLeft/rclSource.xRight;
+          ptl.x=lTemp*rclSource.xRight;
+          lTemp=rcl.yBottom/rclSource.yTop;
+          lTemp*=rclSource.yTop;   
+          while(ptl.x<rcl.xRight) {
+            ptl.y=lTemp;
+            while(ptl.y<rcl.yTop) {/* y direction */
+              WinDrawBitmap(hps, allBMPs[CTRLIDX_BOTTOM].hbm,
+                            &rclSource, 
+                            (PPOINTL)&ptl,
+                            0, 0,
+                            DBM_IMAGEATTRS);
+              ptl.y+=allBMPs[CTRLIDX_BOTTOM].bmpInfoHdr.cy;
+            };
+            ptl.x+=allBMPs[CTRLIDX_BOTTOM].bmpInfoHdr.cx; 
+          };
+          WinEndPaint(hps);
+          return (MRESULT)0;
+        }
+        break;
+      }
+    default:
+      break;
+    }
+  return WinDefDlgProc(hwnd, msg, mp1, mp2);
+}
+
+/*************************************************************/
+/* This dialog procedure handles the toolbar page            */
+/*************************************************************/			
+MRESULT EXPENTRY settingsToolbarOptionDlgProc(HWND hwnd, ULONG msg, MPARAM mp1, MPARAM mp2) {
+  HINI hini;
+  HOBJECT  hObject;
+  ULONG  attrFound;
+  ULONG  len;
+  char text[250];
+  char title[250];
+  CWMediaFolder* thisPtr;
+
+  switch(msg) {
+#if 0
+  case WM_INITDLG :	
+    WinSetWindowULong(hwnd,QWL_USER,LONGFROMMP(mp2));
+    thisPtr=(CWMediaFolder*)LONGFROMMP(mp2);
+    /* We have to initialize the dialog controls with the approbiate values */
+    
+    if(somIsObj(thisPtr)) {
+      // Set the focus on the demo area
+      WinSetFocus(HWND_DESKTOP, WinWindowFromID(hwnd, IDST_TEXTDEMOFIELD));
+      
+      // Set the background colour of the demo area
+      WinSetPresParam(WinWindowFromID(hwnd, IDST_TEXTDEMOFIELD),
+                      PP_BACKGROUNDCOLOR,(ULONG)sizeof(RGB), &(thisPtr->rgbTBFlyBackground) );
+      // Set the foreground colour of the demo area
+      WinSetPresParam(WinWindowFromID(hwnd, IDST_TEXTDEMOFIELD),
+                      PP_FOREGROUNDCOLOR,(ULONG)sizeof(RGB), &(thisPtr->rgbTBFlyForeground) );
+      
+      // Set the font of the demo area
+      WinSetPresParam(WinWindowFromID(hwnd, IDST_TEXTDEMOFIELD),
+                      PP_FONTNAMESIZE,(ULONG)sizeof(thisPtr->chrTBFlyFontName),
+                      thisPtr->chrTBFlyFontName );
+      
+      if(thisPtr->bTBFlyOverEnabled) {
+        WinCheckButton(hwnd, IDCB_ENABLETBFLYOVER, 1);
+        WinEnableWindow(WinWindowFromID(hwnd, IDSB_TBFLYOVERDELAY),TRUE);
+      }
+      else {
+        WinCheckButton(hwnd, IDCB_ENABLETBFLYOVER, 0);
+        WinEnableWindow(WinWindowFromID(hwnd, IDSB_TBFLYOVERDELAY),FALSE);
+      }
+      
+      // Set the linits for the delay spin button
+      WinSendMsg(WinWindowFromID(hwnd, IDSB_TBFLYOVERDELAY),
+                 SPBM_SETLIMITS,(MPARAM)MAXDELAY,(MPARAM)0);
+      // Set the current value for delay
+      WinSendMsg(WinWindowFromID(hwnd, IDSB_TBFLYOVERDELAY),
+                 SPBM_SETCURRENTVALUE,
+                 (MPARAM)thisPtr->iTBFlyOverDelay,
+                 (MPARAM)NULL);
+    }
+    /* Move default buttons on Warp 4 */
+    cwMoveNotebookButtonsWarp4(hwnd, IDPB_COLORHELP, 20);
+    WinSetWindowULong(WinQueryWindow(hwnd, QW_PARENT), QWL_HWNDFOCUSSAVE, hwnd);
+    return (MRESULT) TRUE;
+  case WM_DESTROY:
+    WinSetFocus(WinQueryWindow(hwnd, QW_PARENT), TRUE);
+    thisPtr=(CWMediaFolder*) WinQueryWindowULong(hwnd , QWL_USER);    
+    if(somIsObj(thisPtr)){
+
+      /* The notebook closes and gets destroyed */
+      // Query the current background colour
+      len=WinQueryPresParam(WinWindowFromID(hwnd, IDST_TEXTDEMOFIELD),
+                            PP_BACKGROUNDCOLOR,0,&attrFound,sizeof(thisPtr->rgbTBFlyBackground),
+                            &(thisPtr->rgbTBFlyBackground),QPF_NOINHERIT);
+      // Query the current font
+      len=WinQueryPresParam(WinWindowFromID(hwnd, IDST_TEXTDEMOFIELD),
+                            PP_FONTNAMESIZE,0,&attrFound,sizeof(thisPtr->chrTBFlyFontName),
+                            thisPtr->chrTBFlyFontName,QPF_NOINHERIT);
+      // Query the current foreground colour
+      len=WinQueryPresParam(WinWindowFromID(hwnd, IDST_TEXTDEMOFIELD),
+                            PP_FOREGROUNDCOLOR,0,&attrFound,sizeof(thisPtr->rgbTBFlyForeground),
+                            &(thisPtr->rgbTBFlyForeground),QPF_NOINHERIT);
+      // Query the enable state
+      if(WinQueryButtonCheckstate(hwnd,IDCB_ENABLETBFLYOVER) & 1)
+        thisPtr->bTBFlyOverEnabled=1;
+      else
+        thisPtr->bTBFlyOverEnabled=0;
+      
+      // Query delay value
+      WinSendMsg(WinWindowFromID(hwnd, IDSB_TBFLYOVERDELAY),
+                 SPBM_QUERYVALUE,(MPARAM)&(thisPtr->iTBFlyOverDelay),
+                 MPFROM2SHORT(0,SPBQ_ALWAYSUPDATE));				
+      
+      // Save data
+      thisPtr->wpSaveImmediate();
+    }
+    break;
+#if 0
+  case WM_CONTROL:
+    /* The window controls send WM_CONTROL messages */
+    switch(SHORT1FROMMP(mp1))
+      {
+      case IDCB_ENABLETBFLYOVER:
+        if(WinQueryButtonCheckstate(hwnd,IDCB_ENABLETBFLYOVER) & 1)
+          WinEnableWindow(WinWindowFromID(hwnd, IDSB_TBFLYOVERDELAY),1);
+        else
+          WinEnableWindow(WinWindowFromID(hwnd, IDSB_TBFLYOVERDELAY),0);
+        break;
+      default:
+        break;
+      } // end switch(SHORT1FROMMP(mp1))
+    return (MRESULT)0;
+    break;
+#endif	
+  case WM_COMMAND :
+    switch (SHORT1FROMMP(mp1)) {
+      // Process commands here //
+    case IDPB_COLORUNDO:
+      thisPtr=(CWMediaFolder*) WinQueryWindowULong(hwnd , QWL_USER);    
+      if(somIsObj(thisPtr)){
+        /* The undo button was clicked */
+        // Set the background colour of the demo area
+        WinSetPresParam(WinWindowFromID(hwnd, IDST_TEXTDEMOFIELD),
+                        PP_BACKGROUNDCOLOR,(ULONG)sizeof(thisPtr->rgbTBFlyBackground), &(thisPtr->rgbTBFlyBackground) );
+        // Set the foreground colour of the demo area
+        WinSetPresParam(WinWindowFromID(hwnd, IDST_TEXTDEMOFIELD),
+                        PP_FOREGROUNDCOLOR,(ULONG)sizeof(thisPtr->rgbTBFlyForeground), &(thisPtr->rgbTBFlyForeground) );
+        
+        // Set the font of the demo area
+        WinSetPresParam(WinWindowFromID(hwnd, IDST_TEXTDEMOFIELD),
+                        PP_FONTNAMESIZE,(ULONG)sizeof(thisPtr->chrTBFlyFontName),
+                        thisPtr->chrTBFlyFontName );
+        
+        if(thisPtr->bTBFlyOverEnabled) {
+          WinCheckButton(hwnd, IDCB_ENABLETBFLYOVER, 1);
+          WinEnableWindow(WinWindowFromID(hwnd, IDSB_TBFLYOVERDELAY),TRUE);
+        }
+        else {
+          WinCheckButton(hwnd, IDCB_ENABLETBFLYOVER, 0);
+          WinEnableWindow(WinWindowFromID(hwnd, IDSB_TBFLYOVERDELAY),FALSE);
+        }
+        
+        // Set the current value for delay
+        WinSendMsg(WinWindowFromID(hwnd, IDSB_TBFLYOVERDELAY),
+                   SPBM_SETCURRENTVALUE,
+                   (MPARAM)thisPtr->iTBFlyOverDelay,
+                   (MPARAM)NULL);
+      }
+      break;
+    case IDPB_COLORSTANDARD:
+      thisPtr=(CWMediaFolder*) WinQueryWindowULong(hwnd , QWL_USER);    
+      if(somIsObj(thisPtr)){
+        /* The default button was clicked */
+        thisPtr->rgbTBFlyBackground.bBlue=180;  // Set the default colours
+        thisPtr->rgbTBFlyBackground.bGreen=255; 
+        thisPtr->rgbTBFlyBackground.bRed=255;
+        thisPtr->rgbTBFlyForeground.bBlue=0;
+        thisPtr->rgbTBFlyForeground.bGreen=0;			
+        thisPtr->rgbTBFlyForeground.bRed=0;
+        // Set the default font
+        if(cwQueryOSRelease()>=40)
+          strcpy((thisPtr->chrTBFlyFontName), DEFAULT_DIALOG_FONT);
+        else
+          strcpy((thisPtr->chrTBFlyFontName), DEFAULT_DIALOG_FONT_WARP3);
+        
+        // Set the background colour of the demo area
+        WinSetPresParam(WinWindowFromID(hwnd, IDST_TEXTDEMOFIELD),
+                        PP_BACKGROUNDCOLOR,(ULONG)sizeof(RGB), &thisPtr->rgbTBFlyBackground );
+        // Set the foreground colour of the demo area
+        WinSetPresParam(WinWindowFromID(hwnd, IDST_TEXTDEMOFIELD),
+                        PP_FOREGROUNDCOLOR,(ULONG)sizeof(RGB), &thisPtr->rgbTBFlyForeground );
+        // Set the font of the demo area
+        WinSetPresParam(WinWindowFromID(hwnd, IDST_TEXTDEMOFIELD),
+                        PP_FONTNAMESIZE,(ULONG)sizeof(thisPtr->chrTBFlyFontName),
+                        thisPtr->chrTBFlyFontName );
+        
+        WinCheckButton(hwnd, IDCB_ENABLETBFLYOVER, 1);
+        WinEnableWindow(WinWindowFromID(hwnd, IDSB_TBFLYOVERDELAY),TRUE);
+        
+        // Set the value for delay
+        WinSendMsg(WinWindowFromID(hwnd, IDSB_TBFLYOVERDELAY),
+                   SPBM_SETCURRENTVALUE,
+                   (MPARAM)DEFAULTDELAY,
+                   (MPARAM)NULL);
+      }
+      break;
+    case IDPB_COLORPALETTE:
+      /* Colour... button was clicked */
+      // Open the colorpalette 
+      if((hObject=WinQueryObject("<WP_HIRESCLRPAL>"))!=NULL) {
+        WinOpenObject(hObject,OPEN_DEFAULT,TRUE);
+      }
+      else {//Error, can't open the palette
+        /*  Show an error msg.						   */
+        /*
+          Text:   "Can't open the color palette. It may have lost it's ID. Check your INI files."
+          Title: "CD-Creator settings"                       
+          */             
+        messageBox( text, IDSTRS_NOCOLORPALETTE , sizeof(text),
+                    title, IDSTRS_MEDIAFLDRSETTINGS , sizeof(title),
+                    queryResModuleHandle(), hwnd, MB_OK | MB_ICONEXCLAMATION | MB_MOVEABLE);
+    
+      }
+      break;
+    case IDPB_FONTPALETTE:
+      /* Font... button was clicked */
+      // Open the fontpalette 
+      if((hObject=WinQueryObject("<WP_FNTPAL>"))!=NULL) {
+        WinOpenObject(hObject,OPEN_DEFAULT,TRUE);
+      }
+      else {//Error, can't open the palette
+        /*  Show an error msg.						   */
+        /*
+          Text:   "Can't open the font palette. It may have lost it's ID. Check your INI files."
+          Title: "CD-Creator settings"                       
+          */             
+        messageBox( text, IDSTRS_NOFONTPALETTE , sizeof(text),
+                    title, IDSTRS_MEDIAFLDRSETTINGS , sizeof(title),
+                    queryResModuleHandle(), hwnd, MB_OK | MB_ICONEXCLAMATION | MB_MOVEABLE);
+      }
+      break;
+    default:
+      break;
+    }
+    /* Don't call WinDefDlgProc here, or the dialog gets closed */
+    return (MRESULT) TRUE;
+#endif
+  default:
+    break;
+  }
+  // The WinDefDlgProc() handles the rest of the messages
+  return WinDefDlgProc(hwnd, msg, mp1, mp2);
+}
+
+
+MRESULT EXPENTRY shadowProc(HWND hwnd, ULONG msg,MPARAM mp1,MPARAM mp2 )
+{
+  switch (msg)
+    {
+    case WM_PAINT:
+      {
+        HPS hps;
+        HPS hpsMem;
+        BITMAPINFOHEADER2 bmpIH2;
+        PBITMAPINFO2 pbmp2;
+        char * chrBuff;
+        PBYTE ptr;
+        HDC hdcMem;
+        HBITMAP hbm;
+        ULONG ulCx, ulCy;
+        SWP swp;
+
+        hps=WinBeginPaint(hwnd, NULLHANDLE, NULLHANDLE/*&rectl*/);
+
+        GpiCreateLogColorTable(hps, 0, LCOLF_RGB, 0, 0, NULL);
+        WinQueryWindowPos(hwnd, &swp);
+
+        ulCx=swp.cx;
+        ulCy=swp.cy;
+
+        bmpIH2.cbFix=sizeof(BITMAPINFOHEADER2);
+        bmpIH2.cx=ulCx;
+        bmpIH2.cy=ulCy;
+        bmpIH2.cPlanes=1;
+        bmpIH2.cBitCount=8;
+        bmpIH2.cbImage=(((ulCx*(1<<bmpIH2.cPlanes)*(1<<bmpIH2.cBitCount))+31)/32)*bmpIH2.cy;
+
+        chrBuff=(char*)malloc(bmpIH2.cbImage+sizeof(BITMAPINFO2)+256*sizeof(RGB2));
+        pbmp2=(PBITMAPINFO2)chrBuff;
+        memset(pbmp2, 0, sizeof(BITMAPINFO2)+256*sizeof(RGB2));
+        ptr=chrBuff+sizeof(BITMAPINFO2)+256*sizeof(RGB2);
+
+        pbmp2->cbFix=sizeof(BITMAPINFO2);
+        pbmp2->cx=ulCx;
+        pbmp2->cy=ulCy;
+        pbmp2->cPlanes=1;
+        pbmp2->cBitCount=8;
+        pbmp2->cbImage=((pbmp2->cx+31)/32)*pbmp2->cy;
+        pbmp2->ulCompression=BCA_UNCOMP;
+        pbmp2->ulColorEncoding=BCE_RGB;
+
+        hdcMem=DevOpenDC(WinQueryAnchorBlock(hwnd),OD_MEMORY,"*", 0L/*4L*/, (PDEVOPENDATA)NULLHANDLE/*pszData*/, NULLHANDLE);
+        if(hdcMem) {
+          SIZEL sizel= {0,0};
+
+          hpsMem=GpiCreatePS(WinQueryAnchorBlock(hwnd), hdcMem, &sizel, PU_PELS|GPIT_MICRO|GPIA_ASSOC);
+          if(hpsMem)
+            {                 
+              hbm=GpiCreateBitmap(hpsMem, &bmpIH2, FALSE, NULL, pbmp2);
+              if(hbm) {
+                HPS hpsDesktop;
+                POINTL ptl[3]={0};
+                RGB2 *prgb2;
+                int a, r,g,b;
+ 
+                hpsDesktop=WinGetScreenPS(HWND_DESKTOP);
+                GpiSetBitmap(hpsMem, hbm);
+
+                ptl[0].x=0;
+                ptl[0].y=0;
+                ptl[1].x=0+ulCx;
+                ptl[1].y=0+ulCy;
+
+                ptl[2].x=swp.x;
+                ptl[2].y=swp.y;
+
+                if(GpiBitBlt(hpsMem, hpsDesktop, 3, ptl , ROP_SRCCOPY, BBO_IGNORE)==GPI_ERROR)
+                  {
+                  }
+
+                WinReleasePS(hpsDesktop);
+
+                if(GpiQueryBitmapBits(hpsMem, 0, ulCy, ptr, pbmp2)==GPI_ALTERROR)
+                  {
+                    //   DosBeep(500,300);
+                  }
+
+                prgb2=(RGB2*)(++pbmp2);
+                for(a=0;a<256; a++, prgb2++) {
+                  r=-50;
+                  g=-50;
+                  b=-50;
+                  
+                  b+=prgb2->bBlue;
+                  g+=prgb2->bGreen;
+                  r+=prgb2->bRed;
+                  if(r>255)
+                    r=255;
+                  if(r<0)
+                    r=0;
+                  prgb2->bRed=r;
+
+                  if(g>255)
+                    g=255;
+                  if(g<0)
+                    g=0;
+                  prgb2->bGreen=g;
+
+                  if(b>255)
+                    b=255;
+                  if(b<0)
+                    b=0;
+                  prgb2->bBlue=b;        
+                }
+
+                if(GpiSetBitmapBits(hpsMem, 0, ulCy, ptr, --pbmp2)!=GPI_ALTERROR)
+                  {
+                    ptl[0].x=0;
+                    ptl[0].y=0;
+                    ptl[1].x=ulCx;
+                    ptl[1].y=ulCy;
+                    ptl[2].x=0;
+                    ptl[2].y=0;
+                    
+                    GpiBitBlt(hps, hpsMem, 3, ptl , ROP_SRCCOPY, BBO_IGNORE);
+                  }
+                GpiSetBitmap(hpsMem, NULLHANDLE);
+                GpiDeleteBitmap(hbm);
+              }/* hbm */
+              GpiDestroyPS(hpsMem);
+            }/* hpsMem */
+          DevCloseDC(hdcMem);
+        }/* if(hdcMem) */
+        WinEndPaint(hps);
+        free(chrBuff);
+        return MRFALSE;
+      }
+    default:
+      break;
+    }
+  return (*oldProc)(hwnd,msg,mp1,mp2);	
+}
+
+
+/*****************************************************************************/
+/*  New button procedure with fly over help	                                 */
+/*****************************************************************************/
+MRESULT EXPENTRY newButtonProc(HWND hwnd, ULONG msg,MPARAM mp1,MPARAM mp2 )
+{
+  static BOOL bBubbleOn=TRUE;
+  POINTL ptl;
+  HPS  hps;
+  FONTMETRICS   fm;
+  LONG  ulWinTextLen;
+  POINTL aptlPoints[TXTBOX_COUNT];
+  RECTL   rcl;
+  LONG   deltaX,deltaY;
+  RGB    rgb= {200,200,0};
+  static USHORT id=0;//Initialisation new in V1.00a 
+  RECTL  rclWork;
+  HWND hwndStore;
+  WPObject * wpObject;
+
+  switch (msg)
+    {
+    case WM_DESTROY:
+      WinStopTimer(WinQueryAnchorBlock(hwnd),hwnd,1);//Stop timer if running
+      if(hwndBubbleWindow) WinDestroyWindow(hwndBubbleWindow);/*  close the bubblewindow  */
+      hwndBubbleWindow=0;
+      /* Stop delay timer if running */
+      WinStopTimer(WinQueryAnchorBlock(hwnd),hwnd,WinQueryWindowUShort(hwnd,QWS_ID));			
+      break;
+    case WM_NEWBUBBLE:
+      ULONG bubbleEnabled;
+      HWND hwndStore;
+      /*  we have to build a new information window  */
+      if(hwndBubbleWindow){// if(){...} new in V1.00a 
+        WinDestroyWindow(hwndBubbleWindow);/*  close the bubblewindow  */
+        hwndBubbleWindow=NULL;
+      }
+      // Query the pointer position
+      WinQueryPointerPos(HWND_DESKTOP,&ptl);
+      WinMapWindowPoints(HWND_DESKTOP,hwnd,&ptl,1);
+      WinQueryWindowRect(hwnd,&rclWork);				
+      if(!hwndBubbleWindow 
+         && WinPtInRect(WinQueryAnchorBlock(hwnd),&rclWork,&ptl)
+         && bTBFlyOverEnabled) {
+
+        static HWND hwndBubbleClient;
+	ULONG style=FCF_BORDER|FCF_NOBYTEALIGN;
+	char winText[255];
+	
+	/* Get window text (It's the object title) for size calculating */
+	WinQueryWindowText(hwnd,sizeof(winText),winText);
+	ulWinTextLen=(LONG)strlen(winText); // Query text length
+	
+	/* Delete 'Returns' in object title */
+	char *pBuchst;
+    char *pRest;
+    pRest=winText;
+    while((pBuchst=strchr(pRest,13))!=NULL) {
+      *pBuchst=' ';
+      pBuchst++;
+      if(*pBuchst==10)
+        *pBuchst=' ';
+      pRest=pBuchst;
+    }
+
+	/* Create help window */
+	hwndBubbleWindow=WinCreateStdWindow(HWND_DESKTOP,
+					    0,
+					    &style,
+					    WC_STATIC,
+					    "",
+                        SS_TEXT|DT_CENTER|DT_VCENTER,
+					    NULLHANDLE,
+					    400,
+					    &hwndBubbleClient);
+    hwndShadow=WinCreateWindow(HWND_DESKTOP,
+                               WC_STATIC,
+                               "",
+                               SS_TEXT|DT_CENTER|DT_VCENTER,
+                               0, 0,
+                               0, 0,
+                               hwndBubbleWindow,
+                               hwndBubbleWindow,
+                               401,
+                               NULLHANDLE,
+                               NULLHANDLE);
+    oldProc=WinSubclassWindow(hwndShadow, shadowProc);
+
+	// Set the font for the help
+	WinSetPresParam(hwndBubbleClient,PP_FONTNAMESIZE,
+                    sizeof(chrTBFlyFontName),
+                    chrTBFlyFontName);
+	/* Calculate text size in pixel */
+	hps=WinBeginPaint(hwndBubbleClient,(HPS)NULL,(PRECTL)NULL);
+	GpiQueryTextBox(hps,ulWinTextLen,winText,TXTBOX_COUNT,aptlPoints);
+	WinEndPaint(hps);
+	
+	/* Set colors */
+    WinSetPresParam(hwndBubbleClient,
+                    PP_BACKGROUNDCOLOR,sizeof(rgbTBFlyBackground) ,
+                    &rgbTBFlyBackground );
+	WinSetPresParam(hwndBubbleClient,
+                    PP_FOREGROUNDCOLOR,sizeof(rgbTBFlyForeground) ,
+                    &rgbTBFlyForeground );
+
+	/* Calculate bubble positon and show bubble */
+	WinQueryPointerPos(HWND_DESKTOP,&ptl);//Query pointer position in the desktop window
+	WinQueryWindowRect(HWND_DESKTOP,&rcl);//Query desktop size
+	aptlPoints[TXTBOX_BOTTOMRIGHT].x-aptlPoints[TXTBOX_BOTTOMLEFT].x+7+xVal+ptl.x 
+	  > rcl.xRight 
+	    ? deltaX=-aptlPoints[TXTBOX_BOTTOMRIGHT].x-aptlPoints[TXTBOX_BOTTOMLEFT].x-xVal-xVal-7 
+	      : deltaX=0 ;
+
+	aptlPoints[TXTBOX_TOPLEFT].y-aptlPoints[TXTBOX_BOTTOMLEFT].y+2+yVal+ptl.y 
+	  > rcl.yTop 
+	    ? deltaY=-aptlPoints[TXTBOX_TOPLEFT].y-aptlPoints[TXTBOX_BOTTOMLEFT].y-2*yVal-7
+	      : deltaY=0 ;		
+	WinSetWindowPos(hwndBubbleWindow,
+			HWND_TOP,
+			ptl.x+xVal+deltaX,ptl.y+yVal+deltaY,  
+			aptlPoints[TXTBOX_BOTTOMRIGHT].x-aptlPoints[TXTBOX_BOTTOMLEFT].x+8,
+			aptlPoints[TXTBOX_TOPLEFT].y-aptlPoints[TXTBOX_BOTTOMLEFT].y+2,
+			SWP_ZORDER|SWP_SIZE|SWP_MOVE|SWP_SHOW);
+
+    WinSetWindowPos(hwndShadow,
+                    hwndBubbleWindow,
+                    ptl.x+xVal+deltaX+5
+                    ,ptl.y+yVal+deltaY-5,  
+                    aptlPoints[TXTBOX_BOTTOMRIGHT].x-aptlPoints[TXTBOX_BOTTOMLEFT].x+8,
+                    aptlPoints[TXTBOX_TOPLEFT].y-aptlPoints[TXTBOX_BOTTOMLEFT].y+2,
+                    SWP_ZORDER|SWP_SIZE|SWP_MOVE|SWP_SHOW);
+
+	/* Set bubble text */
+	WinSetWindowText(hwndBubbleClient,winText);
+	WinStartTimer(WinQueryAnchorBlock(hwnd),hwnd,1,35); 
+      } // end if(!hwndBubbleWindow)
+      break;
+    case WM_MOUSEMOVE:
+      USHORT  tempID;
+      ULONG delayValue;
+      delayValue=250;
+   
+      tempID=WinQueryWindowUShort(hwnd,QWS_ID);/*  get the id of the window under the pointer  */  			
+      if(id!=tempID) {	// New Button?	
+        WinStartTimer(WinQueryAnchorBlock(hwnd),hwnd,tempID,(ULONG)iTBFlyOverDelay); // New timer for delay
+        id=tempID;  // Save ID 
+      }
+      else {
+        if(!hwndBubbleWindow)WinStartTimer(WinQueryAnchorBlock(hwnd),hwnd,tempID,(ULONG)iTBFlyOverDelay); // New timer for delay	
+      }			
+      break;
+    case WM_TIMER:			
+      switch (SHORT1FROMMP(mp1))
+        {
+        case 1: //Intervall timer
+          /* Test pointer position */
+          WinQueryPointerPos(HWND_DESKTOP,&ptl);
+          WinMapWindowPoints(HWND_DESKTOP,hwnd,&ptl,1);
+          WinQueryWindowRect(hwnd,&rclWork);
+          if(!WinPtInRect(WinQueryAnchorBlock(hwnd),&rclWork,&ptl))
+            {	// Button has changed				 
+              WinStopTimer(WinQueryAnchorBlock(hwnd),hwnd,1);  // stop the running timer
+              if(hwndBubbleWindow) WinDestroyWindow(hwndBubbleWindow);/*  close the bubblewindow  */
+              hwndBubbleWindow=0;
+              id=0;
+            }			 			
+          break;
+        default:// delay over
+          if (SHORT1FROMMP(mp1)==WinQueryWindowUShort(hwnd,QWS_ID)) {//our own timer. It has got the window id
+            WinStopTimer(WinQueryAnchorBlock(hwnd),hwnd,SHORT1FROMMP(mp1));//Stop the delay timer
+            /* Check the pointer position */
+            WinQueryPointerPos(HWND_DESKTOP,&ptl);
+            WinMapWindowPoints(HWND_DESKTOP,hwnd,&ptl,1);
+            WinQueryWindowRect(hwnd,&rclWork);
+            if(WinPtInRect(WinQueryAnchorBlock(hwnd),&rclWork,&ptl))
+              WinPostMsg(hwnd,WM_NEWBUBBLE,NULL,NULL);//Request a help window
+            return (MRESULT)FALSE;
+          }
+          break;
+        }
+      break;
+
+    }
+  // call the original button procedure to handle the rest of the messages
+  return (*oldButtonProc2)(hwnd,msg,mp1,mp2);	
+};
+
Index: /tags/CWMM-0.3.0_GA/mediafolder/c/mediafldr/mediafolder.cpp
===================================================================
--- /tags/CWMM-0.3.0_GA/mediafolder/c/mediafldr/mediafolder.cpp	(revision 213)
+++ /tags/CWMM-0.3.0_GA/mediafolder/c/mediafldr/mediafolder.cpp	(revision 213)
@@ -0,0 +1,1336 @@
+/*
+ * This file is (C) Chris Wohlgemuth 2002
+ *
+ * It's part of the Media-Folder distribution
+ */
+/*
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; see the file COPYING.  If not, write to
+ * the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+
+#define INCL_DOSERRORS
+#define INCL_REXXSAA
+
+#include "mediafolder.hh"
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include "except.h"
+#include <rexxsaa.h>                   /* needed for RexxStart()     */
+#include "mediafolderres.h"
+
+#include "sys_funcs.h"
+/* typedef for somTP_MMAudio_cwmmQueryTrackInfo */
+#include "cwmmquerytrackinfo.h"
+
+int  iWaveDev=0;
+
+extern HMTX hmtxFileName;
+extern char chrInstallDir[];
+
+HMODULE queryResModuleHandle(void);
+BOOL getMessage(char* text,ULONG ulID, LONG lSizeText, HMODULE hResource,HWND hwnd);
+
+ULONG cwRequestMutex(HMTX  hmtxBMP, ULONG ulTimeOut);
+ULONG cwReleaseMutex(HMTX  hmtxBMP);
+
+MRESULT EXPENTRY settingsToolbarOptionDlgProc(HWND hwnd, ULONG msg, MPARAM mp1, MPARAM mp2);
+extern void showPlayTimeDisplay(CWMediaFolder *thisPtr, BOOL bShow);
+void setPlayTimeText2(CWMediaFolder *thisPtr, char * theText);
+void setPlayTimeText(CWMediaFolder *thisPtr);
+extern void _resetDisplay(CWMediaFolder *thisPtr);
+
+extern BOOL cwmmQueryCWAudioMethodPtr(CWMediaFolder *thisPtr);
+extern SOMClass* queryMMAudioClass(void);
+SOMClass* somhlpGetSomClass(char* chrClassName);
+/* Get the HWND of the play control dialog. This Dialog is on top of
+   the top frame control. */
+HWND playControlDialogFromFrameHWND(HWND hwndFrame);
+/* Get the HWND of the frame control at the top */
+HWND topControlFromFrameHWND(HWND hwndFrame);
+/* Get the HWND of the time display static text control. */
+HWND playTimeControlFromFrameHWND(HWND hwndFrame);
+
+/* This procedure is called for example from the play dialog. It's used to keep
+   the code tidier. */
+void callMediaFolderMethod(CWMediaFolder *thisPtr, ULONG ulAction, ULONG ulData)
+{
+  switch(ulAction)
+    {
+    case PLAY_FIRST:
+      /* Send a message to the object window created by the folder play thread */
+      WinPostMsg(thisPtr->mfData->hwndPlayObject,WM_APPTERMINATENOTIFY, 0,MPFROMLONG(PLAY_FIRST));
+      break;
+    case STOP_TRACK:
+      WinPostMsg(thisPtr->mfData->hwndPlayObject,WM_APPTERMINATENOTIFY, 0,MPFROMLONG(STOP_TRACK));
+      break;
+    case PLAY_NEXT:
+      WinPostMsg(thisPtr->mfData->hwndPlayObject,WM_APPTERMINATENOTIFY, 0,MPFROMLONG(PLAY_NEXT));
+      break;
+    case PLAY_PREV:
+      WinPostMsg(thisPtr->mfData->hwndPlayObject,WM_APPTERMINATENOTIFY, 0,MPFROMLONG(PLAY_PREV));
+      break;
+    case PAUSE_TRACK:
+      WinPostMsg(thisPtr->mfData->hwndPlayObject,WM_APPTERMINATENOTIFY, 0,MPFROMLONG(PAUSE_TRACK));
+      break;
+    case SEEK_TRACK:
+      WinPostMsg(thisPtr->mfData->hwndPlayObject,WM_APPTERMINATENOTIFY, MPFROMLONG(ulData), MPFROMLONG(SEEK_TRACK));
+      break;
+    default:
+    break;
+    }
+  return;
+}
+
+MRESULT EXPENTRY playObjectProc(HWND hwnd, ULONG msg, MPARAM mp1, MPARAM mp2)
+{
+  switch (msg)
+    {
+    case WM_APPTERMINATENOTIFY:
+      {
+        THREADPARAMS* tPt=(THREADPARAMS*)WinQueryWindowULong(hwnd, QWL_USER);
+        HWND hwndFrame=tPt->hwndFrame;
+        CWMediaFolder *thisPtr=tPt->thisPtr;
+
+        switch(LONGFROMMP(mp2))
+          {
+          case PLAY_FIRST:
+            TRY_LOUD(OBJECTPROC_FIRST) {
+              thisPtr->cwPlayAudioFile(hwndFrame, PLAY_FIRST);
+            }/* Try */
+            CATCH(OBJECTPROC_FIRST)
+              {
+                SysWriteToTrapLog("\nTrap occured in %s, file: %s, near line %d.\n",
+                                  __FUNCTION__, __FILE__, __LINE__);
+              } END_CATCH;
+            break;
+          case STOP_TRACK:
+            thisPtr->cwStopAudioFile(hwndFrame);
+            break;
+          case PLAY_NEXT:
+            TRY_LOUD(OBJECTPROC_NEXT) {
+              thisPtr->cwPlayAudioFile(hwndFrame, PLAY_NEXT);
+            }/* Try */
+            CATCH(OBJECTPROC_NEXT)
+              {
+                SysWriteToTrapLog("\nTrap occured in %s, file: %s, near line %d.\n",
+                                  __FUNCTION__, __FILE__, __LINE__);
+              } END_CATCH;
+            break;
+          case PLAY_PREV:
+            TRY_LOUD(OBJECTPROC_PREV) {
+              thisPtr->cwPlayAudioFile(hwndFrame, PLAY_PREV);
+            }/* Try */
+            CATCH(OBJECTPROC_PREV)
+              {
+                SysWriteToTrapLog("\nTrap occured in %s, file: %s, near line %d.\n",
+                                  __FUNCTION__, __FILE__, __LINE__);
+              } END_CATCH;
+            break;
+          case PAUSE_TRACK:
+            thisPtr->cwPauseAudioFile(hwndFrame);
+            break;
+          case SEEK_TRACK:
+            TRY_LOUD(OBJECTPROC_SEEK) {
+              thisPtr->cwSeekAudioFile(LONGFROMMP(mp1));
+              /* restart timer */
+              //    WinStartTimer(WinQueryAnchorBlock(hwnd), WinWindowFromID(hwndFrame), IDTIMER_PLAY, PLAYTIMER_DELAY);
+              thisPtr->ulPos=LONGFROMMP(mp1)/1000;
+            }
+            CATCH(OBJECTPROC_SEEK)
+              {
+                SysWriteToTrapLog("\nTrap occured in %s, file: %s, near line %d.\n",
+                                  __FUNCTION__, __FILE__, __LINE__);
+              } END_CATCH;
+              break;
+          default:
+            break;
+          }/* switch() */
+        return (MRESULT)0;
+      }
+    default:
+      break;
+    }
+  return WinDefWindowProc( hwnd, msg, mp1, mp2);
+}
+
+/* Every folder has one running play thread to handle play commands */
+void _Optlink playThreadFunc (void *arg)
+{
+  HAB  hab;
+  HMQ  hmq;
+  QMSG qmsg;
+  THREADPARAMS* tPt;
+  CWMediaFolder *thisPtr;
+
+
+  tPt=(THREADPARAMS*) arg;
+  if(!tPt)
+    return;
+  thisPtr=(CWMediaFolder*)tPt->thisPtr;    //Pointer auf CWMediaFolder-Object
+  if(!somIsObj(thisPtr))
+    return;
+
+  hab=WinInitialize(0);
+  if(hab) {
+    hmq=WinCreateMsgQueue(hab,0);
+    if(hmq) {
+      HWND hwnd;
+
+      hwnd=WinCreateWindow(HWND_OBJECT,WC_STATIC,"MFObj",0,0,0,0,0,NULLHANDLE,HWND_BOTTOM,13343,NULL,NULL);
+      if(hwnd) {
+        thisPtr->mfData->hwndPlayObject=hwnd;
+        WinSetWindowULong(hwnd, QWL_USER,(ULONG)tPt);
+        WinSubclassWindow(hwnd,&playObjectProc);
+        /* Window created. */
+        while(WinGetMsg(hab,&qmsg,(HWND)NULL,0,0))
+          WinDispatchMsg(hab,&qmsg);
+
+        WinDestroyWindow(hwnd);
+      }
+      WinDestroyMsgQueue(hmq);
+    }
+    WinTerminate(hab);
+  }
+  thisPtr->wpFreeMem((PBYTE)tPt);
+  thisPtr->mfData->hwndPlayObject=NULLHANDLE;
+}
+
+void _Optlink rexxThreadFunc (void *arg)
+{
+  HAB  hab;
+  HMQ  hmq;
+  QMSG qmsg;
+  CWMediaFolder *thisPtr;
+  HWND hwnd;
+  char *chrFileName;
+  char *chrFolderName;
+  char *chrRexxScript;
+  ULONG ulSize;
+  INSERTTRACKPARMS * threadParms;
+
+  threadParms=(INSERTTRACKPARMS *)arg;
+  if(!threadParms)
+    return;
+
+  thisPtr=(CWMediaFolder*)threadParms->thisPtr;
+
+  if(!somIsObj(thisPtr))
+    return;
+
+  if(!somIsObj(thisPtr->wpObjM3UFile)) {
+    thisPtr->wpFreeMem((PBYTE)threadParms);
+    return;
+  }
+
+  chrFileName=thisPtr->wpAllocMem( CCHMAXPATH*3+10 , &ulSize);
+  if(!chrFileName) {
+    thisPtr->wpFreeMem((PBYTE)threadParms);
+    return;
+  }
+  chrFolderName=chrFileName+CCHMAXPATH+1;
+  chrRexxScript=chrFolderName+CCHMAXPATH+1;
+
+  /* Get name of M3U file */
+  ulSize=CCHMAXPATH;
+  if(!((WPFileSystem*)thisPtr->wpObjM3UFile)->wpQueryRealName(chrFileName, &ulSize, TRUE))
+    return;
+
+  /* Get name of folder */
+  ulSize=CCHMAXPATH;
+  if(!thisPtr->wpQueryRealName(chrFolderName, &ulSize, TRUE))
+    return;
+
+  hab=WinInitialize(0);
+  if(hab) {
+    hmq=WinCreateMsgQueue(hab,0);
+    if(hmq) {
+      RXSTRING arg[2];                    /* argument string for REXX  */
+      RXSTRING rexxretval;                /* return value from REXX    */
+      APIRET   rc;                        /* return code from REXX     */
+      SHORT    rexxrc = 0;                /* return code from function */
+
+      /* By setting the strlength of the output RXSTRING to zero, we   */
+      /* force the interpreter to allocate memory and return it to us. */
+      /* We could provide a buffer for the interpreter to use instead. */
+      rexxretval.strlength = 0L;          /* initialize return to empty*/
+
+      MAKERXSTRING(arg[0], chrFileName, strlen(chrFileName));/* create input argument     */
+      MAKERXSTRING(arg[1], chrFolderName, strlen(chrFolderName));/* create input argument     */
+
+      TRY_LOUD(RX_START) {
+        /* Here we call the interpreter.  We don't really need to use    */
+        /* all the casts in this call; they just help illustrate         */
+        /* the data types used.                                          */
+        rc=RexxStart((LONG)       2,             /* number of arguments   */
+                     (PRXSTRING)  &arg,          /* array of arguments    */
+                     //(PSZ)        chrRexxScript,/* name of REXX file     */
+                     (PSZ) threadParms->chrRexxScript,
+                     //   (PSZ)        "H:\\cwmm\\mediafolder\\beep.cmd",/* name of REXX file     */
+                     (PRXSTRING)  0,             /* No INSTORE used       */
+                     (PSZ)        "CWRXX",         /* Command env. name     */
+                     (LONG)       RXSUBROUTINE,  /* Code for how invoked  */
+                     (PRXSYSEXIT) 0,             /* No EXITs on this call */
+                     (PSHORT)     &rexxrc,       /* Rexx program output   */
+                     (PRXSTRING)  &rexxretval ); /* Rexx program output   */
+
+        if(rc) {
+          sprintf(chrFileName,"Error in the Rexx skript %s\n\n Get more information with 'help REX%04d'.\n",
+                  "", rc*-1);
+          WinMessageBox(HWND_DESKTOP, HWND_DESKTOP, chrFileName, "", 1234, MB_OK|MB_MOVEABLE|MB_ERROR);
+        }
+        DosFreeMem(rexxretval.strptr);          /* Release storage given to us by REXX.  */
+      }
+      CATCH(RX_START)
+        {}END_CATCH;
+
+        WinDestroyMsgQueue(hmq);
+    }
+    WinTerminate(hab);
+  }
+  //  thisPtr->fContentsChanged=FALSE;
+  thisPtr->wpFreeMem((PBYTE)chrFileName);
+  thisPtr->wpFreeMem((PBYTE)threadParms);
+}
+
+ULONG CWMediaFolder::cwQueryMFldrFlags(void)
+{
+  return ulPrivFlags;
+}
+
+BOOL CWMediaFolder::cwUnshrinkFolder(HWND hwndFrame)
+{
+  HWND hwndCnr;
+  if((hwndCnr=WinWindowFromID(hwndFrame, FID_CLIENT))!=NULLHANDLE)
+    {
+      SWP swp, swp2, swp3;
+      POINTL ptl;
+
+      /* Get container size */
+      WinQueryWindowPos(hwndCnr, &swp);
+      if(swp.cy==0) {
+        /* Container is shrinked so unshrink it */
+        WinSetWindowULong(hwndFrame, QWL_STYLE, (WinQueryWindowULong(hwndFrame, QWL_STYLE) & ~FS_DLGBORDER)|FS_SIZEBORDER);
+        WinSetWindowPos(hwndFrame, NULLHANDLE, swpUnshrink.x, swpUnshrink.y, swpUnshrink.cx,swpUnshrink.cy,SWP_SIZE|SWP_MOVE);
+        return TRUE;
+      }
+    }
+  return FALSE;
+}
+
+
+/**************************************************************/
+/*                                                            */
+/* Shrink the folder so only the play control is visible.     */
+/*                                                            */
+/**************************************************************/
+BOOL CWMediaFolder::cwShrinkFolderToCompact(HWND hwndFrame)
+{
+  HWND hwndCnr;
+  if((hwndCnr=WinWindowFromID(hwndFrame, FID_CLIENT))!=NULLHANDLE)
+    {
+      SWP swp, swp2, swp3;
+      POINTL ptl;
+      char chrText[20];
+      WinQueryWindowPos(hwndFrame, &swp2);
+      /* Save size for unshrinking */
+      swpUnshrink=swp2;
+      /* Get container size */
+      WinQueryWindowPos(hwndCnr, &swp);
+      if(swp.cy>0) {
+        /* Shrink folder to hide container */
+        swp2.y+=swp.cy;
+        swp2.cy-=swp.cy;
+        /* Get size of statusline */
+        // WinQueryWindowPos(bottomControlFromFrameHWND(hwndFrame), &swp);
+        // WinSetWindowPos(bottomControlFromFrameHWND(hwndFrame), NULLHANDLE, 0,0,swp.cx, 0, SWP_SIZE);
+        /* Shrink folder to hide status line */
+        //swp2.y+=swp.cy;
+        //swp2.cy-=swp.cy;
+        /* Get size of control area at the top */
+        WinQueryWindowPos(topControlFromFrameHWND(hwndFrame), &swp);
+        /* Get size of the play control area */
+        WinQueryWindowPos(playControlDialogFromFrameHWND(hwndFrame), &swp3);
+        swp2.cx-=(swp.cx-swp3.cx)+10;
+
+        /* DLGBORDER is smaller than a size border */
+        WinSendMsg(hwndFrame, WM_QUERYBORDERSIZE, &ptl, 0L);
+        swp2.y+=2*(ptl.y-WinQuerySysValue(HWND_DESKTOP, SV_CYDLGFRAME))+2;
+        swp2.cy-=2*(ptl.y-WinQuerySysValue(HWND_DESKTOP, SV_CYDLGFRAME))+2;
+        WinSetWindowULong(hwndFrame, QWL_STYLE, (WinQueryWindowULong(hwndFrame, QWL_STYLE) & ~FS_SIZEBORDER)|FS_DLGBORDER);
+
+        WinSetWindowPos(hwndFrame, NULLHANDLE, swp2.x, swp2.y, swp2.cx,swp2.cy,SWP_SIZE|SWP_MOVE);
+        /*
+           By changing the to contents view we trick the WPS to show the 'Details view' menu item in
+           the view menu of the folders system menu. In that sub menu the WPS always inserts all known
+           views a user may switch to. Tree and contents view are removed in the
+           frame proc. Compact view will not be inserted if already in compact view (see wpModifyPopupMenu()).
+           The system knows nothing about the 'compact view' and all the handling is done by us.
+           As a side effect the folder position information for the details
+           view isn't changed when the folder is closed in 'Compact view'.
+           */
+        wpMenuItemSelected(hwndFrame, 0x2cc);
+
+        /* Change the view name shown in the title */
+        getMessage(chrText, IDSTR_VIEWCOMPACT, sizeof(chrText), queryResModuleHandle(),hwndFrame);
+        wpRegisterView(hwndFrame, chrText);
+      }
+      return TRUE;
+    }
+  return FALSE;
+}
+
+BOOL CWMediaFolder::cwInsertAllTracks(char* chrM3UFile)
+{
+  INSERTTRACKPARMS * threadParms;
+  ULONG ulError;
+
+  if((threadParms=(INSERTTRACKPARMS*)wpAllocMem(sizeof(INSERTTRACKPARMS), &ulError))==NULLHANDLE)
+    return FALSE;
+  threadParms->thisPtr=this;
+  sprintf(threadParms->chrRexxScript,"%s%s",  chrInstallDir, RX_INSERT_MEDIAFLDRTRACKS);
+
+  _beginthread(rexxThreadFunc,NULL,8192*16,(void*)threadParms); //Fehlerbehandlung fehlt
+  return TRUE;
+}
+
+void CWMediaFolder::cwSetStatusLineText(char * chrText)
+{
+
+  if(!chrText) {
+    char text[100]="";
+    char text2[100]="";
+    char time[50];
+    char chrBuf[2];
+
+    if(mfData) {
+      PrfQueryProfileString(HINI_USER, "PM_Default_National", "sThousand",
+                            ",", chrBuf, sizeof(chrBuf));
+      chrBuf[sizeof(chrBuf)-1]=0;
+
+      if(mfData->ulTotalTime<=3600) {
+        getMessage( text, IDSTR_STATUSTIME1, sizeof(text), queryResModuleHandle(), HWND_DESKTOP);
+        sprintf(time, text, mfData->ulTotalTime/60, mfData->ulTotalTime%60);
+      }
+      else if(mfData->ulTotalTime<=3600*24) {
+        getMessage( text, IDSTR_STATUSTIME2, sizeof(text), queryResModuleHandle(),HWND_DESKTOP);
+        sprintf(time, text, mfData->ulTotalTime/3600,  (mfData->ulTotalTime%3600)/60, mfData->ulTotalTime%60);
+      }
+      else {
+        getMessage( text, IDSTR_STATUSTIME3, sizeof(text), queryResModuleHandle(),HWND_DESKTOP);
+        sprintf(time, text, mfData->ulTotalTime/(3600*24),
+                (mfData->ulTotalTime%(3600*24))/3600,  (mfData->ulTotalTime%3600)/60, mfData->ulTotalTime%60);
+      }
+      if(mfData->ulSize<=0xffffffff) {
+        getMessage( text2, IDSTR_STATUSTIME4, sizeof(text2), queryResModuleHandle(),HWND_DESKTOP);
+        sprintf(text, text2,
+                mfData->ulNumTracks, mfData->ulSize/1000000 ,chrBuf, (mfData->ulSize%1000000)/1000,
+                chrBuf,  mfData->ulSize%1000,
+                time);
+      }
+      else {
+        getMessage( text2, IDSTR_STATUSTIME5, sizeof(text2), queryResModuleHandle(),HWND_DESKTOP);
+        sprintf(text, text2, mfData->ulNumTracks);
+      }
+    }
+    WinSetWindowText(WinWindowFromID(hwndBottom, IDST_STATUSTEXT),text);
+  }
+  else
+    WinSetWindowText(WinWindowFromID(hwndBottom, IDST_STATUSTEXT),chrText);
+}
+
+MMAudio* CWMediaFolder::cwQueryCurrentlyPlayingObject(void)
+{
+  return (MMAudio*)currentObject;
+}
+
+BOOL CWMediaFolder::cwAddToolbarOptionPage(HWND hwndNotebook)
+{
+  PAGEINFO pageinfo;
+    char pageName[100];
+
+  //Clear the pageinfo structure
+  memset((PCH)&pageinfo, 0, sizeof(PAGEINFO));
+  //Fill the pageinfo structure
+  pageinfo.cb = sizeof(PAGEINFO);
+  pageinfo.hwndPage = NULLHANDLE;
+  pageinfo.usPageStyleFlags = BKA_MAJOR | BKA_STATUSTEXTON;
+  pageinfo.usPageInsertFlags = BKA_FIRST;
+  //We want page numbers
+  pageinfo.usSettingsFlags = SETTINGS_PAGE_NUMBERS;
+  //The dialog procedure for this page
+  pageinfo.pfnwp = settingsToolbarOptionDlgProc;
+  //The resource DLL
+  pageinfo.resid = queryResModuleHandle();
+  //pageinfo.resid = queryModuleHandle();
+  //The ID of the dialog template
+  pageinfo.dlgid = IDDLG_TOOLBARSETTINGS;
+  //We need a pointer to our WPS-object in the dialog procedure
+  //to call class functions
+  pageinfo.pCreateParams = this;
+  //The ID of the help panel for this page
+  //pageinfo.idDefaultHelpPanel = 2000;
+  //Tell the WPS the help library name
+  //pageinfo.pszHelpLibraryName = AFHELPLIBRARY;
+  //We have a major tab so we need a name
+  /* pageName: "General" */
+  getMessage(pageName, IDSTRSETTING_TOOLBAR, sizeof(pageName), queryResModuleHandle(), hwndNotebook);
+  pageinfo.pszName = pageName;
+
+  //Insert the page into the settings notebook
+  return wpInsertSettingsPage(hwndNotebook,&pageinfo);
+}
+
+BOOL mmGetOtherPlayingAudioFile( CWMediaFolder * mediaFolder, HWND hwndContainer, WPObject** wpObject,   PMINIRECORDCORE* pmrc)
+{
+  PMINIRECORDCORE mrc;
+  WPObject * contentObject;
+
+  /* See if we have an audio file played with doubleclick */
+  mrc=(PMINIRECORDCORE)WinSendMsg(hwndContainer,CM_QUERYRECORDEMPHASIS,MPFROMLONG(CMA_FIRST),
+                                  MPFROMSHORT(CRA_INUSE));
+  if(mrc) {
+    SOMClass *cwAudioClass=somhlpGetSomClass("MMAudio");
+    contentObject=(WPObject*)OBJECT_FROM_PREC(mrc);//Get object
+    if(somIsObj(contentObject) && somIsObj(cwAudioClass)) {
+      if((contentObject=mediaFolder->cwGetFileSystemObject(contentObject))!=NULLHANDLE) {
+        /* Check if it's an audio file thus playable */
+        if(contentObject->somIsA(cwAudioClass)) {
+          if(((MMAudio*)contentObject)->wpQueryDefaultView()==0xbbf9){
+            /* If stop menu is default, this means the track is playing. */
+            *wpObject=contentObject;
+            *pmrc=mrc;
+            return TRUE;
+          };
+        }
+      }
+    }/* somIsObj() */
+  }
+  return FALSE;
+}
+
+ULONG CWMediaFolder::cwPlayAudioFile(HWND hwndFrame, ULONG ulWhich)
+{
+  HWND hwndContainer;
+  PMINIRECORDCORE mrc, mrcTemp;
+  WPObject * contentObject;
+  SOMClass *mmMIDIClass;
+  SOMClass *cwAudioClass=somhlpGetSomClass("MMAudio");
+
+  char name[CCHMAXPATH];
+  ULONG ulNameSize;
+  char chrCommand[CCHMAXPATH*2];
+  char chrDevice[30];
+  char retMsg[20];
+  ULONG rc;
+  int iWavePriv;
+  int iTime2;
+  HWND hwndNotify;
+
+  if(ulFlags&FLAG_RANDOM)
+    return cwPlayRandomAudioFile( hwndFrame);
+
+  hwndContainer=WinWindowFromID(hwndFrame, FID_CLIENT);
+  if(!WinIsWindow(WinQueryAnchorBlock(hwndFrame), hwndContainer))
+    return 0;
+
+  /* Get class object */
+  mmMIDIClass=somhlpGetSomClass("MMMIDI");
+
+  /* Get new ID for wave device */
+  if(cwRequestMutex(hmtxFileName, 100000)==ERROR_TIMEOUT)
+    return FALSE;
+
+  iWaveDev++;
+  if(iWaveDev==1000)
+    iWaveDev=1;
+  iWavePriv=iWaveDev;
+  cwReleaseMutex(hmtxFileName);
+  BOOL notFound;
+
+  switch(ulWhich) {
+  case PLAY_FIRST:
+    {
+      WPObject *wpObject;
+      PMINIRECORDCORE pmrc;
+
+#if 0
+      /* There's already a file playing using doubleclick */
+      if(mmGetOtherPlayingAudioFile( this, hwndContainer, &wpObject, &pmrc))
+        return 0;
+#endif
+
+      /* Get first selected container item of our folder */
+      mrc=(PMINIRECORDCORE)WinSendMsg(hwndContainer,CM_QUERYRECORDEMPHASIS, MPFROMSHORT(CMA_FIRST),
+                                      MPFROMSHORT(CRA_SELECTED));
+
+      if(iWave!=0 && mrc && (int)mrc!=-1) {
+        cwStopAudioFile(hwndFrame);
+        return cwPlayAudioFile(hwndFrame, PLAY_FIRST);
+      }
+
+      if(!mrc || (int)mrc==-1)
+        /* Get first container item of our folder */
+        mrc=(PMINIRECORDCORE)WinSendMsg(hwndContainer,CM_QUERYRECORD,NULL,
+                                        MPFROM2SHORT(CMA_FIRST,CMA_ITEMORDER));
+
+      if(!mrc || (int)mrc==-1)
+        return 0;
+
+      notFound=TRUE;
+      do {
+        contentObject=(WPObject*)OBJECT_FROM_PREC(mrc);//Get object
+        if(somIsObj(contentObject)) {
+          /* Get file system object or NULL */
+          if((contentObject=cwGetFileSystemObject(contentObject))==NULLHANDLE) {
+            //       HlpWriteToTrapLog("Tried to resolve shadow, no success, continue...\n");
+            /* Try next object */
+            mrc=(PMINIRECORDCORE)WinSendMsg(hwndContainer,CM_QUERYRECORD, mrc,
+                                            MPFROM2SHORT(CMA_NEXT,CMA_ITEMORDER));
+            //            HlpWriteToTrapLog("New mrc: %x\n", mrc);
+            continue;
+          }
+        }
+        else
+          return 0;/* Error */
+
+        if( contentObject->somIsA(cwAudioClass) ||
+           /*contentObject->somIsA(mmAudioClass) ||*/
+           contentObject->somIsA(mmMIDIClass)) {
+          notFound=FALSE;
+          /* Get the name of the audio file */
+          ulNameSize=sizeof(name);
+          ((WPFileSystem*)contentObject)->wpQueryRealName(name,&ulNameSize,TRUE);
+        }
+        else
+          {
+            /* Try next object */
+            mrc=(PMINIRECORDCORE)WinSendMsg(hwndContainer,CM_QUERYRECORD, mrc,
+                                            MPFROM2SHORT(CMA_NEXT,CMA_ITEMORDER));
+          }
+      }while(notFound && mrc && (int)mrc!=-1);
+      //      HlpWriteToTrapLog("Left loop...\n");
+      break;
+    }
+  case PLAY_NEXT:
+
+    mrcTemp=mrcPlaying;
+
+    if(iWave==0) {
+      WPObject *wpObject;
+      PMINIRECORDCORE pmrc;
+
+      if(mmGetOtherPlayingAudioFile( this, hwndContainer, &wpObject, &pmrc)) {
+        mrcTemp=pmrc;
+      }
+      else
+        return cwPlayAudioFile(hwndFrame, PLAY_FIRST);/* Not yet playing */
+    }
+
+    /* Get next container item of our folder */
+    mrc=(PMINIRECORDCORE)WinSendMsg(hwndContainer,CM_QUERYRECORD,mrcTemp,
+                                    MPFROM2SHORT(CMA_NEXT,CMA_ITEMORDER));
+
+    if((int)mrc==-1) {
+      /* Wrong parameter -> user deleted the shadow. */
+      /* Stop wave, remove in use emphasis. */
+      cwStopAudioFile(hwndFrame);
+      return 0;
+    }
+    //  HlpWriteToTrapLog("Next mrc is %x\n", mrc);
+
+    notFound=TRUE;
+    while(notFound && mrc && (int)mrc!=-1){
+      contentObject=(WPObject*)OBJECT_FROM_PREC(mrc);//Get object
+      if(somIsObj(contentObject)) {
+        /* Get file system object or NULL */
+        if((contentObject=cwGetFileSystemObject(contentObject))==NULLHANDLE) {
+            mrc=(PMINIRECORDCORE)WinSendMsg(hwndContainer,CM_QUERYRECORD, mrc,
+                                            MPFROM2SHORT(CMA_NEXT,CMA_ITEMORDER));
+          continue;
+        }
+      }
+      else
+        return 0;/* Error */
+
+      if(contentObject->somIsA(cwAudioClass) ||
+         /* contentObject->somIsA(mmAudioClass) || */
+         contentObject->somIsA(mmMIDIClass)) {
+        notFound=FALSE;
+        ulNameSize=sizeof(name);
+        ((WPFileSystem*)contentObject)->wpQueryRealName(name,&ulNameSize,TRUE);
+      }
+      else
+        {
+          /* Try next object */
+          mrc=(PMINIRECORDCORE)WinSendMsg(hwndContainer,CM_QUERYRECORD, mrc,
+                                          MPFROM2SHORT(CMA_NEXT,CMA_ITEMORDER));
+        }
+    };
+    cwStopAudioFile(hwndFrame);
+    if(!mrc) {
+      if(ulFlags & FLAG_REPEAT)
+        return cwPlayAudioFile(hwndFrame, PLAY_FIRST);
+      else
+        return 0;
+    }
+    break;
+  case PLAY_PREV:
+
+    mrcTemp=mrcPlaying;
+    /* We are currently playing? */
+    if(iWave==0) {
+#if 0
+      WPObject *wpObject;
+      PMINIRECORDCORE pmrc;
+      /* Check if there's a playing file started by the user */
+      if(mmGetOtherPlayingAudioFile( this, hwndContainer, &wpObject, &pmrc)) {
+        mrcTemp=pmrc;
+        cwStopAudioFile(hwndFrame);
+        /* Select the object */
+        WinSendMsg(hwndContainer,CM_SETRECORDEMPHASIS, MPFROMP(pmrc),
+                   MPFROM2SHORT(TRUE, CRA_SELECTED));
+
+        return cwPlayAudioFile(hwndFrame, PLAY_FIRST);/* Not yet playing, so start the first one. */
+      }
+      else
+#endif
+        return cwPlayAudioFile(hwndFrame, PLAY_FIRST);/* Not yet playing, so start the first one. */
+    }
+
+    /* Check the current time. If we are at the very beginning of the track skip to the previous track
+       otherwise skip to the beginning of the current track. */
+    if(ulPos<=2) {
+      /* Get previous container item of our folder */
+      mrc=(PMINIRECORDCORE)WinSendMsg(hwndContainer,CM_QUERYRECORD,mrcTemp,
+                                      MPFROM2SHORT(CMA_PREV,CMA_ITEMORDER));
+    }
+    else
+      mrc=NULLHANDLE;
+
+    cwStopAudioFile(hwndFrame);
+
+    if(!mrc)
+      mrc=mrcTemp;
+
+    /* Find an audio file */
+    notFound=TRUE;
+    while(notFound && mrc && (int)mrc!=-1){
+      contentObject=(WPObject*)OBJECT_FROM_PREC(mrc);//Get object
+      if(somIsObj(contentObject)) {
+        /* Get file system object or NULL */
+        if((contentObject=cwGetFileSystemObject(contentObject))==NULLHANDLE) {
+          mrc=(PMINIRECORDCORE)WinSendMsg(hwndContainer,CM_QUERYRECORD, mrc,
+                                          MPFROM2SHORT(CMA_PREV,CMA_ITEMORDER));
+          continue;
+        }
+      }
+      else
+        return 0;/* Error!! */
+
+      /* Check if it's an audio file thus playable */
+      if(contentObject->somIsA(cwAudioClass) ||
+         /*   contentObject->somIsA(mmAudioClass) || */
+         contentObject->somIsA(mmMIDIClass)) {
+        notFound=FALSE;
+        ulNameSize=sizeof(name);
+        ((WPFileSystem*)contentObject)->wpQueryRealName(name,&ulNameSize,TRUE);
+      }
+      else
+        /* Try next object */
+        mrc=(PMINIRECORDCORE)WinSendMsg(hwndContainer,CM_QUERYRECORD, mrc,
+                                        MPFROM2SHORT(CMA_PREV,CMA_ITEMORDER));
+    };
+    if(!mrc)
+      return 0;
+
+    break;
+  default:
+    return 0;
+  }
+
+  /* Found a valid object. Now play it. */
+
+  if(!getMessage(chrCommand, IDSTR_STARTINGTRACK, sizeof(chrCommand), queryResModuleHandle(),  hwndFrame))
+    sprintf(chrCommand, "Starting track...");
+  setPlayTimeText2(this, chrCommand);
+
+  if(contentObject->somIsA(mmMIDIClass))
+    strncpy(chrDevice,"SEQUENCER", sizeof(chrDevice) - 1);
+  else /*if(contentObject->somIsA(cwAudioClass) || contentObject->somIsA(mmAudioClass))*/
+    strncpy(chrDevice,"WAVEAUDIO", sizeof(chrDevice));
+
+  chrDevice[sizeof(chrDevice)-1]=0;
+
+  hwndNotify=playControlDialogFromFrameHWND(hwndFrame);//WinWindowFromID(hwndTop, IDDLG_TOPMIDDLE);
+
+  /* Start audio file */
+  sprintf(chrCommand,"open \"%s\"  type %s alias wave%d SHAREABLE wait",name, chrDevice, iWavePriv);
+  rc = mciSendString(chrCommand, retMsg, sizeof(retMsg), hwndNotify, 0);
+  if((rc & 0x0000ffff)!=MCIERR_SUCCESS)
+    return 0;
+
+  /* Set time format */
+  sprintf(chrCommand,"SET wave%d TIME FORMAT MILLISECONDS wait", iWavePriv);
+  rc = mciSendString(chrCommand, retMsg, sizeof(retMsg), 0, 0);
+  if((rc & 0x0000ffff)!=MCIERR_SUCCESS) {
+    sprintf(chrCommand,"close wave%d wait",iWavePriv);
+    rc = mciSendString(chrCommand, retMsg, sizeof(retMsg), 0, 0);
+    return 0;
+  }
+
+  sprintf(chrCommand,"SETPOSITIONADVISE wave%d ON EVERY 1000 notify", iWavePriv);
+  rc = mciSendString(chrCommand, retMsg, sizeof(retMsg),hwndNotify, 0);
+  if((rc & 0x0000ffff)!=MCIERR_SUCCESS) {
+    sprintf(chrCommand,"close wave%d wait",iWavePriv);
+    rc = mciSendString(chrCommand, retMsg, sizeof(retMsg), 0, 0);
+    return 0;
+  }
+
+  /* Get wave length in ms */
+  sprintf(chrCommand,"STATUS wave%d LENGTH WAIT", iWavePriv);
+  rc = mciSendString(chrCommand, retMsg, sizeof(retMsg), 0, 0);
+  if((rc & 0x0000ffff)==MCIERR_SUCCESS) {
+    iTime2=atoi(retMsg);
+    sprintf(chrCommand,"%d:%02d  %d:%02d  -%d:%02d",iTime2/1000/60,(iTime2/1000)%60,
+            0, 0,
+            iTime2/1000/60,(iTime2/1000)%60);
+    //    WinSetWindowText(WinWindowFromID(hwndTop, IDST_PLAYTIME), chrCommand);
+    //    WinSetWindowText(playTimeControlFromFrameHWND(hwndFrame), chrCommand);
+  }
+  ulTotalLength=iTime2;
+
+  /* Set volume */
+  sprintf(chrCommand,"SET wave%d AUDIO VOLUME %d wait", iWavePriv, ulVolume);
+  rc = mciSendString(chrCommand, retMsg, sizeof(retMsg), 0, 0);
+  if((rc & 0x0000ffff)!=MCIERR_SUCCESS) {
+    sprintf(chrCommand,"close wave%d",iWavePriv);
+    rc = mciSendString(chrCommand, retMsg, sizeof(retMsg), 0, 0);
+    return 0;
+  }
+
+  sprintf(chrCommand,"play wave%d FROM 0", iWavePriv);
+  rc = mciSendString(chrCommand, retMsg, sizeof(retMsg), 0, 0);
+  if((rc & 0x0000ffff)!=MCIERR_SUCCESS) {
+    sprintf(chrCommand,"close wave%d",iWavePriv);
+    rc = mciSendString(chrCommand, retMsg, sizeof(retMsg), 0, 0);
+    return 0;
+  }
+
+  /* Start pos timer. SET MCIPOSITIONADVICE fails when seeking in the wave.
+     Don't know why. */
+
+  //WinStartTimer(WinQueryAnchorBlock(hwndFrame), WinWindowFromID(hwndTop, IDDLG_TOPMIDDLE), IDTIMER_PLAY, PLAYTIMER_DELAY);
+  WinStartTimer(WinQueryAnchorBlock(hwndFrame), playControlDialogFromFrameHWND(hwndFrame), IDTIMER_PLAY, PLAYTIMER_DELAY);
+
+  /* Set emphasis by adding the object to the inuse list */
+  memset(&myViewItem, 0,sizeof(myViewItem));
+  myViewItem.useItem.type=USAGE_OPENVIEW;
+  myViewItem.viewItem.view=OPEN_PLAYING;
+
+  //WPObject* wpObject=cwGetFileSystemObject(tempObject);
+  WPObject* wpObject=contentObject;
+
+  if(wpObject->wpAddToObjUseList(&myViewItem.useItem))
+    {
+      myViewItem.bIsInUseList=TRUE;
+    };
+  /* Select the object */
+  WinSendMsg(hwndContainer,CM_SETRECORDEMPHASIS, MPFROMP(mrc),
+             MPFROM2SHORT(TRUE, CRA_SELECTED));
+
+  iWave=iWavePriv;
+  currentObject=wpObject;
+  mrcPlaying=mrc;
+  /* The start position of the play command */
+  ulStartPosition=0;
+  ulPos=0;
+  bPaused=FALSE;
+  /* Set time display */
+  setPlayTimeText(this);
+  return 0;
+}
+
+//#define RANDOM_DEBUG
+
+static int _getRandomTrack(  MEDIAFLDRDATA* mfData)
+{
+  int zufall = 0;
+  DATETIME DT;
+  INT  seed, start,  iCheck=0;
+  BOOL bFound=FALSE;
+
+  /** Get a random number in the appropriate range                    */
+  DosGetDateTime((PDATETIME)&DT);      /* Get the time               */
+  seed = DT.hours*60 + DT.minutes;     /* convert to hundreths       */
+  seed = seed*60 + DT.seconds;
+  seed = seed*100 + DT.hundredths;
+  srand((INT)seed);                    /* Set random number seed     */
+  start=zufall;
+
+  while(!bFound) {
+    zufall=rand()%mfData->iNumToPlay;    /* Range is 0...iNumToPlay-1  */
+    iCheck++;
+
+#ifdef RANDOM_DEBUG
+    HlpWriteToTrapLog("\n     Zufall: %d       %d\n", zufall, mfData->pRandomArray[zufall]);
+#endif
+    /* Get a random number in the appropriate range */
+    if(mfData->pRandomArray[zufall]==0) {
+      mfData->pRandomArray[zufall]=1;
+#ifdef RANDOM_DEBUG
+      HlpWriteToTrapLog("2     Zufall: %d       %d\n", zufall, mfData->pRandomArray[zufall]);
+#endif
+      return zufall;
+    }
+
+    /* Already played number. Find another */
+#if 0
+    if (zufall == start && !bFound) {
+#ifdef RANDOM_DEBUG
+      HlpWriteToTrapLog("Error     Zufall: %d       %d\n", zufall, mfData->pRandomArray[zufall]);
+#endif
+      return -1;
+    }
+#endif
+
+    if(iCheck>MAX_RANDOM_OBJECTS)
+      break; /* Emergency exit... */
+  };
+  return -1; /* Error */
+}
+
+ULONG CWMediaFolder::cwPlayRandomAudioFile(HWND hwndFrame)
+{
+  HWND hwndContainer;
+  PMINIRECORDCORE mrc, mrcTemp;
+  WPObject * contentObject;
+  /* SOMClass *mmAudioClass; */
+  SOMClass *mmMIDIClass;
+  SOMClass *cwAudioClass=somhlpGetSomClass("MMAudio");
+
+  char name[CCHMAXPATH];
+  ULONG ulNameSize;
+  char chrCommand[CCHMAXPATH*2];
+  char chrDevice[30];
+  char retMsg[20];
+  ULONG rc;
+  int iWavePriv;
+  int iTime2 = 0;
+  HWND hwndNotify;
+  BOOL notFound;
+  int iTrack,a;
+
+#ifdef RANDOM_DEBUG
+  HlpWriteToTrapLog("Entering %s\n", __FUNCTION__);
+#endif
+
+#ifdef RANDOM_DEBUG_2
+  HlpWriteToTrapLog("%s  mfData: %x\n", __FUNCTION__, mfData);
+  HlpWriteToTrapLog("%s  random array: %x\n", __FUNCTION__, mfData->pRandomArray);
+#endif
+
+  /* Check if we currently play the last track. */
+  if((mfData->iNumPlayed>=mfData->iNumToPlay) && mfData->pRandomArray) {
+    cwStopAudioFile(hwndFrame);/* Reset playing vars and remove in use emphasis */
+    if(!(ulFlags&FLAG_REPEAT))
+      return 0;
+  }
+
+  hwndContainer=WinWindowFromID(hwndFrame, FID_CLIENT);
+  if(!WinIsWindow(WinQueryAnchorBlock(hwndFrame), hwndContainer))
+    return 0;
+
+  /* Get class object */
+  //  mmAudioClass=queryMMAudioClass();
+  mmMIDIClass=somhlpGetSomClass("MMMIDI");
+
+  /* Get new ID for wave device */
+  if(cwRequestMutex(hmtxFileName, 100000)==ERROR_TIMEOUT)
+    return FALSE;
+  iWaveDev++;
+  if(iWaveDev==1000)
+    iWaveDev=1;
+  iWavePriv=iWaveDev;
+  cwReleaseMutex(hmtxFileName);
+
+#ifdef RANDOM_DEBUG
+  //  HlpWriteToTrapLog("%s  mfData: %x\n", __FUNCTION__, mfData);
+  HlpWriteToTrapLog("%s  random array: %x\n", __FUNCTION__, mfData->pRandomArray);
+#endif
+  if(!mfData->pRandomArray) {
+    /* Not yet playing */
+    CNRINFO cnrInfo;
+    ULONG ulError;
+
+#ifdef RANDOM_DEBUG
+  HlpWriteToTrapLog("%s line: %d - No random Array yet\n", __FUNCTION__, __LINE__);
+#endif
+
+    WinSendMsg(hwndContainer,CM_QUERYCNRINFO, MPFROMP(&cnrInfo),
+               MPFROMLONG(sizeof(cnrInfo)));
+    /* No objects?? */
+    if(cnrInfo.cRecords==0)
+      return 0;
+    if((mfData->pRandomArray=wpAllocMem(MAX_RANDOM_OBJECTS , &ulError))==NULLHANDLE)
+      return 0;
+
+#ifdef RANDOM_DEBUG
+  HlpWriteToTrapLog("%s: alloced random array\n", __FUNCTION__);
+#endif
+
+    memset(mfData->pRandomArray, 0, MAX_RANDOM_OBJECTS);
+
+#ifdef RANDOM_DEBUG
+  HlpWriteToTrapLog("%s: set array to 0\n", __FUNCTION__);
+#endif
+
+    mfData->iNumToPlay=cnrInfo.cRecords; /* # tracks to be played */
+    mfData->iNumPlayed=0;
+    if(mfData->iNumToPlay>MAX_RANDOM_OBJECTS)
+      mfData->iNumToPlay=MAX_RANDOM_OBJECTS;
+  }
+
+#ifdef RANDOM_DEBUG
+  HlpWriteToTrapLog("%s: Now searchin audio file...\n", __FUNCTION__);
+#endif
+
+  /* Find an audio file */
+  notFound=TRUE;
+  while(notFound){
+    /* Find track to play */
+    if((iTrack=_getRandomTrack(mfData))==-1) {
+#ifdef RANDOM_DEBUG
+  HlpWriteToTrapLog("%s: _getRandomTrack returned an error! Quitting.\n", __FUNCTION__);
+#endif
+      cwStopAudioFile(hwndFrame);
+      return 0;
+    }
+
+#ifdef RANDOM_DEBUG
+  HlpWriteToTrapLog("%s: _getRandomTrack returned: %d.\n", __FUNCTION__, iTrack);
+#endif
+
+    for(a=0,mrc=(PMINIRECORDCORE)WinSendMsg(hwndContainer,CM_QUERYRECORD,NULL,
+                                            MPFROM2SHORT(CMA_FIRST,CMA_ITEMORDER));
+        a<iTrack &&  mrc && (int)mrc!=-1;
+        a++)
+      {
+        mrc=(PMINIRECORDCORE)WinSendMsg(hwndContainer,CM_QUERYRECORD, mrc,
+                                        MPFROM2SHORT(CMA_NEXT,CMA_ITEMORDER));
+#ifdef RANDOM_DEBUG
+        HlpWriteToTrapLog("a: %d, %x\n", a, mrc);
+#endif
+      };
+
+#ifdef RANDOM_DEBUG
+        HlpWriteToTrapLog(" a: %d, %x\n", a, mrc);
+#endif
+
+    if(!mrc)
+      {
+#ifdef RANDOM_DEBUG
+  HlpWriteToTrapLog("%s: No mrc. Quitting.\n", __FUNCTION__);
+#endif
+        cwStopAudioFile(hwndFrame);/* Clean up */
+        return 0;
+      }
+
+    contentObject=(WPObject*)OBJECT_FROM_PREC(mrc);//Get object
+    if((contentObject=cwGetFileSystemObject(contentObject))==NULLHANDLE)
+      continue;
+
+    /* Check if it's an audio file thus playable */
+    if(contentObject->somIsA(cwAudioClass) ||
+       /*       contentObject->somIsA(mmAudioClass) ||*/
+       contentObject->somIsA(mmMIDIClass)) {
+      notFound=FALSE;
+      ulNameSize=sizeof(name);
+      ((WPFileSystem*)contentObject)->wpQueryRealName(name,&ulNameSize,TRUE);
+    }
+  };/* while */
+
+#ifdef RANDOM_DEBUG
+  HlpWriteToTrapLog("%s: Got an object. Trying to start it...\n", __FUNCTION__);
+#endif
+
+  /* Now start it */
+  PBYTE pByte=mfData->pRandomArray;
+  /* Prevent stop method from deleting our vars */
+  mfData->pRandomArray=NULLHANDLE;
+
+  cwStopAudioFile(hwndFrame);/* Reset playing vars and remove in use emphasis */
+
+  if(!getMessage(chrCommand, IDSTR_STARTINGTRACK, sizeof(chrCommand), queryResModuleHandle(),  hwndFrame))
+    sprintf(chrCommand, "Starting track...");
+  setPlayTimeText2(this, chrCommand);
+
+  mfData->pRandomArray=pByte;
+
+  if(contentObject->somIsA(mmMIDIClass))
+    strncpy(chrDevice,"SEQUENCER", sizeof(chrDevice) - 1);
+  else /*if(contentObject->somIsA(cwAudioClass) || contentObject->somIsA(mmAudioClass))*/
+    strncpy(chrDevice,"WAVEAUDIO", sizeof(chrDevice));
+
+  chrDevice[sizeof(chrDevice)-1]=0;
+
+  hwndNotify=playControlDialogFromFrameHWND(hwndFrame);//WinWindowFromID(hwndTop, IDDLG_TOPMIDDLE);
+
+  /* Start audio file */
+  sprintf(chrCommand,"open \"%s\"  type %s alias wave%d SHAREABLE wait",name, chrDevice, iWavePriv);
+  rc = mciSendString(chrCommand, retMsg, sizeof(retMsg), hwndNotify, 0);
+  if((rc & 0x0000ffff)!=MCIERR_SUCCESS)
+    return 0;
+  /* Set time format */
+  sprintf(chrCommand,"SET wave%d TIME FORMAT MILLISECONDS wait", iWavePriv);
+  rc = mciSendString(chrCommand, retMsg, sizeof(retMsg), 0, 0);
+  if((rc & 0x0000ffff)!=MCIERR_SUCCESS) {
+    sprintf(chrCommand,"close wave%d wait",iWavePriv);
+    rc = mciSendString(chrCommand, retMsg, sizeof(retMsg), 0, 0);
+    return 0;
+  }
+
+  sprintf(chrCommand,"SETPOSITIONADVISE wave%d ON EVERY 1000 notify", iWavePriv);
+  rc = mciSendString(chrCommand, retMsg, sizeof(retMsg),hwndNotify, 0);
+  if((rc & 0x0000ffff)!=MCIERR_SUCCESS) {
+    sprintf(chrCommand,"close wave%d wait",iWavePriv);
+    rc = mciSendString(chrCommand, retMsg, sizeof(retMsg), 0, 0);
+    return 0;
+  }
+
+  /* Get wave length in ms */
+  sprintf(chrCommand,"STATUS wave%d LENGTH WAIT", iWavePriv);
+  rc = mciSendString(chrCommand, retMsg, sizeof(retMsg), 0, 0);
+  if((rc & 0x0000ffff)==MCIERR_SUCCESS) {
+    iTime2=atoi(retMsg);
+    sprintf(chrCommand,"%d:%02d  %d:%02d  -%d:%02d",iTime2/1000/60,(iTime2/1000)%60,
+            0, 0,
+            iTime2/1000/60,(iTime2/1000)%60);
+    //    WinSetWindowText(WinWindowFromID(hwndTop, IDST_PLAYTIME), chrCommand);
+    //    WinSetWindowText(WinWindowFromID(playControlDialogFromFrameHWND(hwndFrame), IDST_PLAYTIME), chrCommand);
+    //    WinSetWindowText(playTimeControlFromFrameHWND(hwndFrame), chrCommand);
+  }
+  ulTotalLength=iTime2;
+
+  /* Set volume */
+  sprintf(chrCommand,"SET wave%d AUDIO VOLUME %d wait", iWavePriv, ulVolume);
+  rc = mciSendString(chrCommand, retMsg, sizeof(retMsg), 0, 0);
+  if((rc & 0x0000ffff)!=MCIERR_SUCCESS) {
+    sprintf(chrCommand,"close wave%d",iWavePriv);
+    rc = mciSendString(chrCommand, retMsg, sizeof(retMsg), 0, 0);
+    return 0;
+  }
+
+  sprintf(chrCommand,"play wave%d FROM 0", iWavePriv);
+  rc = mciSendString(chrCommand, retMsg, sizeof(retMsg), 0, 0);
+  if((rc & 0x0000ffff)!=MCIERR_SUCCESS) {
+    sprintf(chrCommand,"close wave%d",iWavePriv);
+    rc = mciSendString(chrCommand, retMsg, sizeof(retMsg), 0, 0);
+    return 0;
+  }
+  /* Start pos timer. SET MCIPOSITIONADVICE fails when seeking in the wave.
+     Don't know why. */
+  //  WinStartTimer(WinQueryAnchorBlock(hwndFrame), WinWindowFromID(hwndTop, IDDLG_TOPMIDDLE), IDTIMER_PLAY, PLAYTIMER_DELAY);
+  WinStartTimer(WinQueryAnchorBlock(hwndFrame), playControlDialogFromFrameHWND(hwndFrame), IDTIMER_PLAY, PLAYTIMER_DELAY);
+
+  /* Set emphasis by adding the object to the inuse list */
+  memset(&myViewItem, 0,sizeof(myViewItem));
+  myViewItem.useItem.type=USAGE_OPENVIEW;
+  myViewItem.viewItem.view=OPEN_PLAYING;
+
+  WPObject* wpObject=contentObject;
+
+  if(wpObject->wpAddToObjUseList(&myViewItem.useItem))
+    {
+      myViewItem.bIsInUseList=TRUE;
+    };
+  /* Select the object */
+  WinSendMsg(hwndContainer,CM_SETRECORDEMPHASIS, MPFROMP(mrc),
+             MPFROM2SHORT(TRUE, CRA_SELECTED));
+
+  iWave=iWavePriv;
+  currentObject=wpObject;
+  mrcPlaying=mrc;
+  /* The start position of the play command */
+  ulStartPosition=0;
+  ulPos=0;
+  bPaused=FALSE;
+  mfData->iNumPlayed++;
+
+  return 0;
+}
+
+BOOL CWMediaFolder::cwStopAudioFile(HWND hwndFrame)
+{
+  char chrCommand[50];
+  char retMsg[100];
+  ULONG rc;
+  HWND hwndContainer=WinWindowFromID(hwndFrame, FID_CLIENT);
+
+  TRY_LOUD(MEDIAFLDR_STOP_AUDIO) {
+    if(iWave) {
+      if(mfData->pRandomArray) {
+        wpFreeMem(mfData->pRandomArray);
+        mfData->pRandomArray=NULLHANDLE;
+        mfData->iNumToPlay=0; /* # tracks to be played */
+        mfData->iNumPlayed=0;
+      }
+
+      sprintf(chrCommand,"stop wave%d wait", iWave);
+      rc = mciSendString(chrCommand, retMsg, sizeof(retMsg), 0, 0);
+
+      sprintf(chrCommand,"close wave%d wait", iWave);
+      rc = mciSendString(chrCommand, retMsg, sizeof(retMsg), 0, 0);
+
+      _resetDisplay(this);
+        //_resetDisplay(topControlFromFrameHWND(hwndFrame));
+      //      WinStopTimer(WinQueryAnchorBlock(hwndFrame), WinWindowFromID(hwndTop, IDDLG_TOPMIDDLE), IDTIMER_PLAY);
+      WinStopTimer(WinQueryAnchorBlock(hwndFrame), playControlDialogFromFrameHWND(hwndFrame), IDTIMER_PLAY);
+
+      /* Remove from inuse list */
+      if(myViewItem.bIsInUseList && somIsObj(currentObject))
+        {
+          WPObject *wpObject=cwGetFileSystemObject(currentObject);
+          if(somIsObj(wpObject))
+            if(wpObject->wpDeleteFromObjUseList(&myViewItem.useItem))
+              myViewItem.bIsInUseList=FALSE;
+        };
+
+      //HlpWriteToTrapLog("\n1 line %d.\n");
+
+      /* Deselect the object */
+      if(WinIsWindow(WinQueryAnchorBlock(hwndFrame), hwndContainer))
+        WinSendMsg(hwndContainer,CM_SETRECORDEMPHASIS, MPFROMP(mrcPlaying),
+                   MPFROM2SHORT(FALSE, CRA_SELECTED));
+
+      iWave=0;
+      currentObject=NULLHANDLE;
+      mrcPlaying=NULLHANDLE;
+      ulPos=0;
+    }
+    else
+      {
+        PMINIRECORDCORE mrc;
+        WPObject * contentObject;
+
+        if(mmGetOtherPlayingAudioFile( this, hwndContainer, &contentObject,  &mrc)) {
+          ((MMAudio*)contentObject)->wpViewObject( NULLHANDLE,0xbbf9, NULLHANDLE);
+#if 0
+          iWave=0;
+          currentObject=NULLHANDLE;
+          mrcPlaying=NULLHANDLE;
+          ulPos=0;
+#endif
+          WinSendMsg(hwndContainer,CM_SETRECORDEMPHASIS, MPFROMP(mrc),
+                     MPFROM2SHORT(FALSE, CRA_SELECTED));
+        }
+#if 0
+        PMINIRECORDCORE mrc;
+        WPObject * contentObject;
+
+        /* See if we have an audio file played with doubleclick */
+        mrc=(PMINIRECORDCORE)WinSendMsg(hwndContainer,CM_QUERYRECORDEMPHASIS,MPFROMLONG(CMA_FIRST),
+                                        MPFROMSHORT(CRA_INUSE));
+        if(mrc) {
+          SOMClass *cwAudioClass=cwGetSomClass("MMAudio");
+          contentObject=(WPObject*)OBJECT_FROM_PREC(mrc);//Get object
+          if(somIsObj(contentObject) && somIsObj(cwAudioClass)) {
+            if((contentObject=cwGetFileSystemObject(contentObject))!=NULLHANDLE) {
+              /* Check if it's an audio file thus playable */
+              if(contentObject->somIsA(cwAudioClass)) {
+                if(((MMAudio*)contentObject)->wpQueryDefaultView()==0xbbf9){
+                  /* If stop menu is default, this means the track is playing. */
+                  ((MMAudio*)contentObject)->wpViewObject( NULLHANDLE,0xbbf9, NULLHANDLE);
+                  iWave=0;
+                  currentObject=NULLHANDLE;
+                  mrcPlaying=NULLHANDLE;
+                  ulPos=0;
+                  WinSendMsg(hwndContainer,CM_SETRECORDEMPHASIS, MPFROMP(mrc),
+                             MPFROM2SHORT(FALSE, CRA_SELECTED));
+
+                };
+              }
+            }
+          }/* somIsObj() */
+        }
+#endif
+      }
+  }/* Try */
+  CATCH(MEDIAFLDR_STOP_AUDIO)
+    {
+      SysWriteToTrapLog("\nTrap occured in %s, file: %s, near line %d.\n",
+                        __FUNCTION__, __FILE__, __LINE__);
+    } END_CATCH;
+
+    return TRUE;
+}
+
+BOOL CWMediaFolder::cwPauseAudioFile(HWND hwndFrame)
+{
+  char chrCommand[50];
+  char retMsg[100];
+  ULONG rc;
+
+  if(!bPaused) {
+    sprintf(chrCommand,"PAUSE wave%d wait", iWave);
+    rc = mciSendString(chrCommand, retMsg, sizeof(retMsg), 0, 0);
+    bPaused=TRUE;
+  }else
+    {
+      sprintf(chrCommand,"RESUME wave%d wait", iWave);
+      rc = mciSendString(chrCommand, retMsg, sizeof(retMsg), 0, 0);
+      bPaused=FALSE;
+      showPlayTimeDisplay(this, TRUE);
+    }
+
+  return TRUE;
+}
+
+BOOL  CWMediaFolder::cwSeekAudioFile(LONG lPosSec)
+{
+  char chrCommand[50];
+  char retMsg[20];
+  APIRET rc;
+
+  sprintf(chrCommand,"PLAY wave%d from %d", iWave, lPosSec);
+  rc=mciSendString(chrCommand, retMsg, sizeof(retMsg), 0, 0);
+  ulStartPosition=lPosSec;
+  bPaused=FALSE;
+
+  return TRUE;
+}
+
+void CWMediaFolder::cwPlayTimeCallback(HWND hwndFrame, LONG lPosSec)
+{
+  char chrCommand[50];
+  char retMsg[20];
+  ULONG rc;
+
+  /* Timeout. Check if wave is still playing */
+  sprintf(chrCommand,"STATUS wave%d MODE WAIT", iWave);
+  rc = mciSendString(chrCommand, retMsg, sizeof(retMsg), 0, 0);
+  if((rc & 0x0000ffff)!=MCIERR_SUCCESS) {
+    /* Problem with MCI. Clean up. The Timer will be stopped in the method */
+    cwStopAudioFile(hwndFrame);
+  }
+  else {
+    if(!stricmp(retMsg, "stopped")) {
+      /* Audio file played. Start next */
+      cwPlayAudioFile(hwndFrame, PLAY_NEXT);
+    }
+    showPlayTimeDisplay(this, TRUE);/* Ensure display is visible */
+  }
+}
+
+
Index: /tags/CWMM-0.3.0_GA/mediafolder/c/mediafldr/mediafolderoverridenwpclsmethods.cpp
===================================================================
--- /tags/CWMM-0.3.0_GA/mediafolder/c/mediafldr/mediafolderoverridenwpclsmethods.cpp	(revision 213)
+++ /tags/CWMM-0.3.0_GA/mediafolder/c/mediafldr/mediafolderoverridenwpclsmethods.cpp	(revision 213)
@@ -0,0 +1,816 @@
+/*
+ * This file is (C) Chris Wohlgemuth 1999-2003
+ *
+ * It's part of the Audio/Data-CD-Creator distribution
+ */
+/*
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; see the file COPYING.  If not, write to
+ * the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+
+#define INCL_DOSERRORS
+#define INCL_DOSERRORS
+#define INCL_GPIBITMAPS
+#define INCL_REXXSAA
+
+#include "mediafolder.hh"
+#include "mediafolderres.h"
+
+#pragma SOMAsDefault(pop)
+#include <rexxsaa.h>                   /* needed for RexxStart()     */
+#include <wpclsmgr.hh> /* For wpModuleForClass() */
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include "sys_funcs.h"
+
+#pragma SOMAsDefault(on)
+
+
+ULONG EXPENTRY rxCallPMFunc(PSZ name, LONG argc, RXSTRING argv[], PSZ queuename,PRXSTRING retstring);
+ULONG EXPENTRY rxCallWPSFunc(PSZ name, LONG argc, RXSTRING argv[], PSZ queuename,PRXSTRING retstring);
+ULONG EXPENTRY rxCallCWWPSFunc(PSZ name, LONG argc, RXSTRING argv[], PSZ queuename,PRXSTRING retstring);
+
+HMODULE queryModuleHandle(PSZ pszClassName);
+
+char chrInstallDir[CCHMAXPATH];
+HPOINTER hptrArrowWE=NULLHANDLE; /* Pointer for slider control */
+
+HMTX hmtxFileName;
+
+LOADEDBITMAP allBMPs[NUM_CTRL_IDX];
+
+/* Format:
+   typedef struct
+   {
+   INT id;
+   RECTL rclSource;
+   HBITMAP hbmSource;
+   RECTL rclDest;
+   }CONTROLINFO;
+   */
+
+CONTROLINFO ciControls[NUM_CTRL_IDX]={
+  {0,{0,0,590,70}, NULLHANDLE,{0}},/* main */
+  //  {IDPB_POSBAR,{356, 17, 548,25},NULLHANDLE, { 0, 0, 191,10}},
+  {IDSL_POSBAR,{353, 15, 551,28},NULLHANDLE, { 0, 0, 191,10}},
+   {IDPB_SLIDERARM,{0,1,9,8},NULLHANDLE, {0,0,9,9} },
+  //  {IDSL_VOLUME,{33, 5,158,14},NULLHANDLE, {0, 0, 126, 9} /* {10,18,93,13} */ },
+  {IDSL_VOLUME,{32, 2,158,17},NULLHANDLE, {0, 0, 126, 9} /* {10,18,93,13} */ },
+  {IDSL_VOLUMEARM,{0,0,9,9},NULLHANDLE, {0,0,9,9}},
+  {IDSL_VOLUMEARM,{0,0,9,9},NULLHANDLE, {0,0,9,9}},
+  //  {IDST_PLAYTIME, {351, 25, 551,52},NULLHANDLE, { 0, 0, 190, 27} },
+  {IDST_PLAYTIME, {351, 29, 551,52},NULLHANDLE, { 0, 0, 190, 25} },
+  {0,{0,0,20,72}, NULLHANDLE,{0}},/* Top left */
+  {0,{0,0,20,72}, NULLHANDLE,{0}},/* Top right */
+  /* Achtung destination verwendet fuer position */
+  {IDPB_PLAY, {0, 0, 36, 36},NULLHANDLE, { 114, 18, 150, 54} },/* Play */
+  {IDPB_PLAY, {0, 0, 36,36},NULLHANDLE, { 114, 18, 150, 54} }, /* Playsel */
+
+  {IDPB_STOP, {0, 0, 36, 36},NULLHANDLE, { 40, 18, 76, 54} },/* Stop */
+  {IDPB_STOP, {0, 0, 36,36},NULLHANDLE, { 40, 18, 76, 54} }, /* Stop sel */
+  {IDPB_PAUSE, {0, 0, 36, 36},NULLHANDLE, { 77, 18, 112, 54} },/* Pause */
+  {IDPB_PAUSE, {0, 0, 36,36},NULLHANDLE, { 77, 18, 112, 54} }, /* Pause sel */
+  {IDPB_SKIPBACK, {0, 0, 36, 36},NULLHANDLE, { 3, 18, 39, 54} },/* Skip back */
+  {IDPB_SKIPBACK, {0, 0, 36,36},NULLHANDLE, { 3, 18, 39, 54} }, /* Skip back sel */
+  {IDPB_SKIPFORWARD, {0, 0, 36, 36},NULLHANDLE, { 151, 18, 187, 54} },/* Skip fwd */
+  {IDPB_SKIPFORWARD, {0, 0, 36,36},NULLHANDLE, { 151, 18, 187, 54} }, /* Skip fwd sel */
+  {0,{0,0,300,20}, NULLHANDLE,{0}},/* Bottom */
+
+  //   {IDCB_REPEAT, {0, 0, 13,13},NULLHANDLE, { 197, 24, 233, 60} }, /* Placeholder for checkbutton */
+
+  {IDCB_REPEAT, {0, 0, 13,13},NULLHANDLE, { 197, 36, 233, 60} }, /* Placeholder for checkbutton */
+  {IDCB_REPEAT, {0, 0, 13,13},NULLHANDLE, { 197, 36, 233, 60} }, /* Placeholder for checkbutton */
+  {IDCB_REPEAT, {0, 0, 13,13},NULLHANDLE, { 197, 36, 233, 60} }, /* Placeholder for checkbutton selected */
+  {IDCB_REPEAT, {0, 0, 13,13},NULLHANDLE, { 197, 36, 233, 60} }, /* Placeholder for checkbutton selected */
+
+  {IDCB_RANDOM, {0, 0, 13,13},NULLHANDLE, { 197, 10, 233, 60} }, /* Placeholder for checkbutton */
+  {IDCB_RANDOM, {0, 0, 13,13},NULLHANDLE, { 197, 10, 233, 60} }, /* Placeholder for checkbutton */
+  {IDCB_RANDOM, {0, 0, 13,13},NULLHANDLE, { 197, 10, 233, 60} }, /* Placeholder for checkbutton selected */
+  {IDCB_RANDOM, {0, 0, 13,13},NULLHANDLE, { 197, 10, 233, 60} } /* Placeholder for checkbutton selected */
+
+};
+
+
+void errorResource();
+ULONG messageBox( char* text, ULONG ulTextID , LONG lSizeText,
+                  char* title, ULONG ulTitleID, LONG lSizeTitle,
+                  HMODULE hResource, HWND hwnd, ULONG ulFlags);
+BOOL getMessage(char* text,ULONG ulID, LONG lSizeText, HMODULE hResource,HWND hwnd);
+ULONG cwRequestMutex(HMTX  hmtxBMP, ULONG ulTimeOut);
+ULONG cwReleaseMutex(HMTX  hmtxBMP);
+ULONG cwCreateMutex(HMTX * hmtxBMP);
+ULONG cwCloseMutex(HMTX  hmtxBMP);
+
+MRESULT EXPENTRY topCtrlDialogProc(HWND hwnd, ULONG msg, MPARAM mp1, MPARAM mp2) ;
+MRESULT EXPENTRY rightCtrlDialogProc(HWND hwnd, ULONG msg, MPARAM mp1, MPARAM mp2) ;
+MRESULT EXPENTRY privateSliderProc(HWND hwnd, ULONG msg, MPARAM mp1, MPARAM mp2);
+HMODULE queryResModuleHandle(void);
+
+static void _loadBmps()
+{
+  HPS hps;
+  BITMAPINFOHEADER bmpInfoHdr;
+  HMODULE hResource;
+
+  if(allBMPs[MAIN_BMP_IDX].hbm)
+    return;
+
+  // hResource=queryResModuleHandle();
+  hResource=queryModuleHandle("M_CWMediaFolder");
+
+  hps=WinGetPS(HWND_DESKTOP);
+
+  /* The main BMP */
+  allBMPs[MAIN_BMP_IDX].hbm=GpiLoadBitmap(hps, hResource, IDBMP_TOPMIDDLE, 0, 0);
+  GpiQueryBitmapParameters(allBMPs[MAIN_BMP_IDX].hbm, &allBMPs[MAIN_BMP_IDX].bmpInfoHdr);
+
+  /* Top right bmp */
+  allBMPs[CTRLIDX_TOPRIGHT].hbm=GpiLoadBitmap(hps, hResource, IDBMP_TOPRIGHT, 0, 0);
+  GpiQueryBitmapParameters(allBMPs[CTRLIDX_TOPRIGHT].hbm, &allBMPs[CTRLIDX_TOPRIGHT].bmpInfoHdr);
+
+  /* Top left bmp */
+  allBMPs[CTRLIDX_TOPLEFT].hbm=GpiLoadBitmap(hps, hResource, IDBMP_TOPLEFT, 0, 0);
+  GpiQueryBitmapParameters(allBMPs[CTRLIDX_TOPLEFT].hbm, &allBMPs[CTRLIDX_TOPLEFT].bmpInfoHdr);
+
+  /* Bottom bmp */
+  allBMPs[CTRLIDX_BOTTOM].hbm=GpiLoadBitmap(hps, hResource, IDBMP_BOTTOM, 0, 0);
+  GpiQueryBitmapParameters(allBMPs[CTRLIDX_BOTTOM].hbm, &allBMPs[CTRLIDX_BOTTOM].bmpInfoHdr);
+
+  /* Positionslider bg */
+  ciControls[CTRLIDX_POSSLIDER].hbmSource=allBMPs[MAIN_BMP_IDX].hbm;
+
+  /* Positionslider arm */
+  allBMPs[CTRLIDX_POSSLIDERARM].hbm=GpiLoadBitmap(hps, hResource, IDBMP_POSSLIDERARM, 0, 0);
+  GpiQueryBitmapParameters(allBMPs[CTRLIDX_POSSLIDERARM].hbm, &allBMPs[CTRLIDX_POSSLIDERARM].bmpInfoHdr);
+  ciControls[CTRLIDX_POSSLIDERARM].hbmSource=allBMPs[CTRLIDX_POSSLIDERARM].hbm;
+
+  /* Volume slider background */
+  ciControls[CTRLIDX_VOLSLIDER].hbmSource=allBMPs[MAIN_BMP_IDX].hbm;
+
+  /* Volume slider arm */
+  allBMPs[CTRLIDX_VOLSLIDERARM].hbm=GpiLoadBitmap(hps, hResource, IDBMP_VOLSLIDERARM, 0, 0);
+  GpiQueryBitmapParameters(allBMPs[CTRLIDX_VOLSLIDERARM].hbm, &allBMPs[CTRLIDX_VOLSLIDERARM].bmpInfoHdr);
+  ciControls[CTRLIDX_VOLSLIDERARM].hbmSource=allBMPs[CTRLIDX_VOLSLIDERARM].hbm;
+
+  /* Volume slider arm selected*/
+  allBMPs[CTRLIDX_VOLSLIDERARMSEL].hbm=GpiLoadBitmap(hps, hResource, IDBMP_VOLSLIDERARMSEL, 0, 0);
+  GpiQueryBitmapParameters(allBMPs[CTRLIDX_VOLSLIDERARMSEL].hbm, &allBMPs[CTRLIDX_VOLSLIDERARMSEL].bmpInfoHdr);
+  ciControls[CTRLIDX_VOLSLIDERARMSEL].hbmSource=allBMPs[CTRLIDX_VOLSLIDERARMSEL].hbm;
+
+  /* Playtime text field */
+  ciControls[CTRLIDX_PLAYTIME].hbmSource=allBMPs[MAIN_BMP_IDX].hbm;
+
+  /* Skip back */
+  allBMPs[CTRLIDX_SKIPBACKBUTTON].hbm=GpiLoadBitmap(hps, hResource, IDBMP_SKIPBACK, 0, 0);
+  GpiQueryBitmapParameters(allBMPs[CTRLIDX_SKIPBACKBUTTON].hbm, &allBMPs[CTRLIDX_SKIPBACKBUTTON].bmpInfoHdr);
+  ciControls[CTRLIDX_SKIPBACKBUTTON].hbmSource=allBMPs[CTRLIDX_SKIPBACKBUTTON].hbm;
+
+  /* Skip back sel */
+  allBMPs[CTRLIDX_SKIPBACKBUTTONSEL].hbm=GpiLoadBitmap(hps, hResource, IDBMP_SKIPBACKSEL, 0, 0);
+  GpiQueryBitmapParameters(allBMPs[CTRLIDX_SKIPBACKBUTTONSEL].hbm, &allBMPs[CTRLIDX_SKIPBACKBUTTONSEL].bmpInfoHdr);
+  ciControls[CTRLIDX_SKIPBACKBUTTONSEL].hbmSource=allBMPs[CTRLIDX_SKIPBACKBUTTONSEL].hbm;
+
+  /* Stop */
+  allBMPs[CTRLIDX_STOPBUTTON].hbm=GpiLoadBitmap(hps, hResource, IDBMP_STOP, 0, 0);
+  GpiQueryBitmapParameters(allBMPs[CTRLIDX_STOPBUTTON].hbm, &allBMPs[CTRLIDX_STOPBUTTON].bmpInfoHdr);
+  ciControls[CTRLIDX_STOPBUTTON].hbmSource=allBMPs[CTRLIDX_STOPBUTTON].hbm;
+
+  /* Stop sel */
+  allBMPs[CTRLIDX_STOPBUTTONSEL].hbm=GpiLoadBitmap(hps, hResource, IDBMP_STOPSEL, 0, 0);
+  GpiQueryBitmapParameters(allBMPs[CTRLIDX_STOPBUTTONSEL].hbm, &allBMPs[CTRLIDX_STOPBUTTONSEL].bmpInfoHdr);
+  ciControls[CTRLIDX_STOPBUTTONSEL].hbmSource=allBMPs[CTRLIDX_STOPBUTTONSEL].hbm;
+
+  /* Pause */
+  allBMPs[CTRLIDX_PAUSEBUTTON].hbm=GpiLoadBitmap(hps, hResource, IDBMP_PAUSE, 0, 0);
+  GpiQueryBitmapParameters(allBMPs[CTRLIDX_PAUSEBUTTON].hbm, &allBMPs[CTRLIDX_PAUSEBUTTON].bmpInfoHdr);
+  ciControls[CTRLIDX_PAUSEBUTTON].hbmSource=allBMPs[CTRLIDX_PAUSEBUTTON].hbm;
+
+  /* Pause sel */
+  allBMPs[CTRLIDX_PAUSEBUTTONSEL].hbm=GpiLoadBitmap(hps, hResource, IDBMP_PAUSESEL, 0, 0);
+  GpiQueryBitmapParameters(allBMPs[CTRLIDX_PAUSEBUTTONSEL].hbm, &allBMPs[CTRLIDX_PAUSEBUTTONSEL].bmpInfoHdr);
+  ciControls[CTRLIDX_PAUSEBUTTONSEL].hbmSource=allBMPs[CTRLIDX_PAUSEBUTTONSEL].hbm;
+
+  /* Play */
+  allBMPs[CTRLIDX_PLAYBUTTON].hbm=GpiLoadBitmap(hps, hResource, IDBMP_PLAY, 0, 0);
+  GpiQueryBitmapParameters(allBMPs[CTRLIDX_PLAYBUTTON].hbm, &allBMPs[CTRLIDX_PLAYBUTTON].bmpInfoHdr);
+  ciControls[CTRLIDX_PLAYBUTTON].hbmSource=allBMPs[CTRLIDX_PLAYBUTTON].hbm;
+
+  /* Play sel */
+  allBMPs[CTRLIDX_PLAYBUTTONSEL].hbm=GpiLoadBitmap(hps, hResource, IDBMP_PLAYSEL, 0, 0);
+  GpiQueryBitmapParameters(allBMPs[CTRLIDX_PLAYBUTTONSEL].hbm, &allBMPs[CTRLIDX_PLAYBUTTONSEL].bmpInfoHdr);
+  ciControls[CTRLIDX_PLAYBUTTONSEL].hbmSource=allBMPs[CTRLIDX_PLAYBUTTONSEL].hbm;
+
+  /* Skip forward */
+  allBMPs[CTRLIDX_SKIPFWDBUTTON].hbm=GpiLoadBitmap(hps, hResource, IDBMP_SKIPFORWARD, 0, 0);
+  GpiQueryBitmapParameters(allBMPs[CTRLIDX_SKIPFWDBUTTON].hbm, &allBMPs[CTRLIDX_SKIPFWDBUTTON].bmpInfoHdr);
+  ciControls[CTRLIDX_SKIPFWDBUTTON].hbmSource=allBMPs[CTRLIDX_SKIPFWDBUTTON].hbm;
+
+  /* Skip forward sel */
+  allBMPs[CTRLIDX_SKIPFWDBUTTONSEL].hbm=GpiLoadBitmap(hps, hResource, IDBMP_SKIPFORWARDSEL, 0, 0);
+  GpiQueryBitmapParameters(allBMPs[CTRLIDX_SKIPFWDBUTTONSEL].hbm, &allBMPs[CTRLIDX_SKIPFWDBUTTONSEL].bmpInfoHdr);
+  ciControls[CTRLIDX_SKIPFWDBUTTONSEL].hbmSource=allBMPs[CTRLIDX_SKIPFWDBUTTONSEL].hbm;
+
+  /* Checkbutton checked */
+  allBMPs[CTRLIDX_CHECK].hbm=GpiLoadBitmap(hps, hResource, IDBMP_CHECK, 0, 0);
+  GpiQueryBitmapParameters(allBMPs[CTRLIDX_CHECK].hbm, &allBMPs[CTRLIDX_CHECK].bmpInfoHdr);
+  ciControls[CTRLIDX_CHECK].hbmSource=allBMPs[CTRLIDX_CHECK].hbm;
+  /* Adjust source pos */
+  ciControls[CTRLIDX_CHECK].rclSource.yBottom=0;
+  ciControls[CTRLIDX_CHECK].rclSource.yTop=allBMPs[CTRLIDX_CHECK].bmpInfoHdr.cy;
+  ciControls[CTRLIDX_CHECK].rclSource.xLeft=0;
+  ciControls[CTRLIDX_CHECK].rclSource.xRight=allBMPs[CTRLIDX_CHECK].bmpInfoHdr.cx;
+
+  /* Checkbutton unchecked */
+  allBMPs[CTRLIDX_UNCHECK].hbm=GpiLoadBitmap(hps, hResource, IDBMP_UNCHECK, 0, 0);
+  GpiQueryBitmapParameters(allBMPs[CTRLIDX_UNCHECK].hbm, &allBMPs[CTRLIDX_UNCHECK].bmpInfoHdr);
+  ciControls[CTRLIDX_UNCHECK].hbmSource=allBMPs[CTRLIDX_UNCHECK].hbm;
+  ciControls[CTRLIDX_UNCHECK].rclSource.yBottom=0;
+  ciControls[CTRLIDX_UNCHECK].rclSource.yTop=allBMPs[CTRLIDX_UNCHECK].bmpInfoHdr.cy;
+  ciControls[CTRLIDX_UNCHECK].rclSource.xLeft=0;
+  ciControls[CTRLIDX_UNCHECK].rclSource.xRight=allBMPs[CTRLIDX_UNCHECK].bmpInfoHdr.cx;
+
+  /* Checkbutton checked selected */
+  allBMPs[CTRLIDX_CHECKSEL].hbm=GpiLoadBitmap(hps, hResource, IDBMP_CHECKSEL, 0, 0);
+  GpiQueryBitmapParameters(allBMPs[CTRLIDX_CHECKSEL].hbm, &allBMPs[CTRLIDX_CHECKSEL].bmpInfoHdr);
+  ciControls[CTRLIDX_CHECKSEL].hbmSource=allBMPs[CTRLIDX_CHECKSEL].hbm;
+  /* Adjust source pos */
+  ciControls[CTRLIDX_CHECKSEL].rclSource.yBottom=0;
+  ciControls[CTRLIDX_CHECKSEL].rclSource.yTop=allBMPs[CTRLIDX_CHECKSEL].bmpInfoHdr.cy;
+  ciControls[CTRLIDX_CHECKSEL].rclSource.xLeft=0;
+  ciControls[CTRLIDX_CHECKSEL].rclSource.xRight=allBMPs[CTRLIDX_CHECKSEL].bmpInfoHdr.cx;
+
+  /* Checkbutton unchecked selected */
+  allBMPs[CTRLIDX_UNCHECKSEL].hbm=GpiLoadBitmap(hps, hResource, IDBMP_UNCHECKSEL, 0, 0);
+  GpiQueryBitmapParameters(allBMPs[CTRLIDX_UNCHECKSEL].hbm, &allBMPs[CTRLIDX_UNCHECKSEL].bmpInfoHdr);
+  ciControls[CTRLIDX_UNCHECKSEL].hbmSource=allBMPs[CTRLIDX_UNCHECKSEL].hbm;
+  ciControls[CTRLIDX_UNCHECKSEL].rclSource.yBottom=0;
+  ciControls[CTRLIDX_UNCHECKSEL].rclSource.yTop=allBMPs[CTRLIDX_UNCHECKSEL].bmpInfoHdr.cy;
+  ciControls[CTRLIDX_UNCHECKSEL].rclSource.xLeft=0;
+  ciControls[CTRLIDX_UNCHECKSEL].rclSource.xRight=allBMPs[CTRLIDX_UNCHECK].bmpInfoHdr.cx;
+  /*********************/
+
+  /* Checkbutton checked */
+  //  allBMPs[CTRLIDX_CHECK].hbm=GpiLoadBitmap(hps, hResource, IDBMP_CHECK, 0, 0);
+  //  GpiQueryBitmapParameters(allBMPs[CTRLIDX_CHECK].hbm, &allBMPs[CTRLIDX_CHECK].bmpInfoHdr);
+  ciControls[CTRLIDX_RANDOMCHECK].hbmSource=allBMPs[CTRLIDX_CHECK].hbm;
+  /* Adjust source pos */
+  ciControls[CTRLIDX_RANDOMCHECK].rclSource.yBottom=0;
+  ciControls[CTRLIDX_RANDOMCHECK].rclSource.yTop=allBMPs[CTRLIDX_CHECK].bmpInfoHdr.cy;
+  ciControls[CTRLIDX_RANDOMCHECK].rclSource.xLeft=0;
+  ciControls[CTRLIDX_RANDOMCHECK].rclSource.xRight=allBMPs[CTRLIDX_CHECK].bmpInfoHdr.cx;
+
+  /* Checkbutton unchecked */
+  // allBMPs[CTRLIDX_UNCHECK].hbm=GpiLoadBitmap(hps, hResource, IDBMP_UNCHECK, 0, 0);
+  //  GpiQueryBitmapParameters(allBMPs[CTRLIDX_UNCHECK].hbm, &allBMPs[CTRLIDX_UNCHECK].bmpInfoHdr);
+  ciControls[CTRLIDX_RANDOMUNCHECK].hbmSource=allBMPs[CTRLIDX_UNCHECK].hbm;
+  ciControls[CTRLIDX_RANDOMUNCHECK].rclSource.yBottom=0;
+  ciControls[CTRLIDX_RANDOMUNCHECK].rclSource.yTop=allBMPs[CTRLIDX_UNCHECK].bmpInfoHdr.cy;
+  ciControls[CTRLIDX_RANDOMUNCHECK].rclSource.xLeft=0;
+  ciControls[CTRLIDX_RANDOMUNCHECK].rclSource.xRight=allBMPs[CTRLIDX_UNCHECK].bmpInfoHdr.cx;
+
+  /* Checkbutton checked selected */
+  //  allBMPs[CTRLIDX_RANDOMCHECKSEL].hbm=allBMPs[CTRLIDX_CHECKSEL].hbm;
+  //  GpiQueryBitmapParameters(allBMPs[CTRLIDX_CHECKSEL].hbm, &allBMPs[CTRLIDX_RANDOMCHECKSEL].bmpInfoHdr);
+  ciControls[CTRLIDX_RANDOMCHECKSEL].hbmSource=allBMPs[CTRLIDX_CHECKSEL].hbm;
+  /* Adjust source pos */
+  ciControls[CTRLIDX_RANDOMCHECKSEL].rclSource.yBottom=0;
+  ciControls[CTRLIDX_RANDOMCHECKSEL].rclSource.yTop=allBMPs[CTRLIDX_CHECKSEL].bmpInfoHdr.cy;
+  ciControls[CTRLIDX_RANDOMCHECKSEL].rclSource.xLeft=0;
+  ciControls[CTRLIDX_RANDOMCHECKSEL].rclSource.xRight=allBMPs[CTRLIDX_CHECKSEL].bmpInfoHdr.cx;
+
+
+  /* Random checkbutton unchecked selected */
+  //  allBMPs[CTRLIDX_RANDOMUNCHECKSEL].hbm=allBMPs[CTRLIDX_UNCHECKSEL].hbm;
+  //  GpiQueryBitmapParameters(allBMPs[CTRLIDX_UNCHECKSEL].hbm, &allBMPs[CTRLIDX_RANDOMUNCHECKSEL].bmpInfoHdr);
+  ciControls[CTRLIDX_RANDOMUNCHECKSEL].hbmSource=allBMPs[CTRLIDX_UNCHECKSEL].hbm;
+  ciControls[CTRLIDX_RANDOMUNCHECKSEL].rclSource.yBottom=0;
+  ciControls[CTRLIDX_RANDOMUNCHECKSEL].rclSource.yTop=allBMPs[CTRLIDX_UNCHECKSEL].bmpInfoHdr.cy;
+  ciControls[CTRLIDX_RANDOMUNCHECKSEL].rclSource.xLeft=0;
+  ciControls[CTRLIDX_RANDOMUNCHECK].rclSource.xRight=allBMPs[CTRLIDX_UNCHECK].bmpInfoHdr.cx;
+
+
+  WinReleasePS(hps);
+}
+/*APIRET APIENTRY DosQueryModFromEIP( HMODULE *phMod,
+                                    ULONG *pObjNum,
+                                    ULONG BuffLen,
+                                    PCHAR pBuff,
+                                    ULONG *pOffset,
+                                    PVOID Address );*/
+
+/* This function returns the module handle of our class-dll */
+HMODULE queryModuleHandle(PSZ pszClassName)
+{
+  static HMODULE hmod=0;
+
+  if(!hmod) {
+    //  PSZ pathname;
+    ULONG ulObj, ulBufLen, ulOffset;
+    char thePath[CCHMAXPATH];
+
+    if(DosQueryModFromEIP( &hmod,
+                           &ulObj,
+                           CCHMAXPATH,
+                           thePath,
+                           &ulOffset,
+                           (ULONG) queryModuleHandle )!=NO_ERROR) {
+      SysWriteToTrapLog("Can't get module handle for class DLL!\n");
+      hmod=0;
+      return NULLHANDLE; /* Error */
+    }
+
+#if 0
+    /*
+      Sometimes the returned name isn't correct. To prevent loading a bunch of classes just
+      to get the module handle the following is replaced by the undocumented DosQueryModFromEIP()
+      call. Maybe this even fixes some deadlocks people had during WPS startup with the classes
+      because now the WPS isn't urged to load all classes at once.
+     */
+    pathname=((WPClassManager*)SOMClassMgrObject)  //Query Pathname of class file
+      ->wpModuleForClass(pszClassName);
+    if(DosQueryModuleHandle(pathname,&hmod)) {
+      pathname=((WPClassManager*)SOMClassMgrObject)  //Query Pathname of class file
+        ->wpModuleForClass("M_CWMediaFolder");
+      if(DosQueryModuleHandle(pathname,&hmod)) {
+        pathname=((WPClassManager*)SOMClassMgrObject)  //Query Pathname of class file
+          ->wpModuleForClass("CWMediaFolder");
+        if(DosQueryModuleHandle(pathname,&hmod)) {
+          pathname=((WPClassManager*)SOMClassMgrObject)  //Query Pathname of class file
+            ->wpModuleForClass("M_CWAudioShadow");
+          if(DosQueryModuleHandle(pathname,&hmod)) {
+            pathname=((WPClassManager*)SOMClassMgrObject)  //Query Pathname of class file
+              ->wpModuleForClass("CWAudioShadow");
+            if(DosQueryModuleHandle(pathname,&hmod)) {
+              pathname=((WPClassManager*)SOMClassMgrObject)  //Query Pathname of class file
+                ->wpModuleForClass("M_CWCDFolder");
+              if(DosQueryModuleHandle(pathname,&hmod)) {
+                pathname=((WPClassManager*)SOMClassMgrObject)  //Query Pathname of class file
+                  ->wpModuleForClass("CWCDFolder");
+                if(DosQueryModuleHandle(pathname,&hmod)) {
+                  hmod=0;
+                  return NULLHANDLE; /* Error */
+                }
+              }
+            }
+          }
+        }
+      }
+    }
+#endif
+
+    /* Get install dir. */
+    if(!DosQueryModuleName(hmod,sizeof(chrInstallDir),chrInstallDir)) {
+      char *found;
+      if((found=strrchr(chrInstallDir,'\\'))!=NULLHANDLE) {
+        *found=0;
+        if((found=strrchr(chrInstallDir,'\\'))!=NULLHANDLE)
+          *found=0;
+
+        /* Save the dir for config files. */
+        //strcpy( chrConfigDir, chrInstallDir);
+      }
+    }
+  }/* end of if(!hmod) */
+  return hmod;
+}
+
+/* This function returns the module handle of our ressource DLL */
+HMODULE queryResModuleHandle(void)
+{
+  static HMODULE hmod=0;
+
+  if(!hmod) {
+    char path[CCHMAXPATH];
+    char buf[CCHMAXPATH];
+    char* found;
+    APIRET rc;
+
+    /* Get the language code of our system and load the
+       resource DLL with the right language */
+    do {
+      static char chrLang[]="en_EN";
+      PCSZ pszLang=chrLang;
+      char *chrPtr;
+
+      /* Get Language var */
+      if(NO_ERROR!=DosScanEnv("LANG", &pszLang))
+        {
+          /* No language var set */
+          pszLang=chrLang; /* Be safe. I don't know if a failing DosScanEnv()
+                              may change the contents of the pointer. */
+        }
+
+      // SysWriteToTrapLog("LANG: %s\n", pszLang);
+
+      /* Skip leading spaces */
+      chrPtr=(char*)pszLang;
+      while(*chrPtr==' ')
+        chrPtr++;
+
+      /* Check if value seems to be valid. The var must be something like xx_XX thus length is 5 */
+      if(strlen(chrPtr)<5)
+        break;
+
+      if(DosQueryModuleName(queryModuleHandle("M_CWMediaFolder"),sizeof(path),path)!=NO_ERROR)
+        break;
+
+      found=strrchr(path,'\\');
+      if(!found)
+        break;
+      *found=0;
+
+      /* Extract the first two chars */
+      sprintf(buf, RESDLLNAME, chrPtr[0], chrPtr[1]);
+      strcat(path,buf);
+
+      if(DosLoadModule(buf,sizeof(buf),path, &hmod)==NO_ERROR)
+        break;
+
+      /* NLS DLL not found. Try to load default */
+      found=strrchr(path,'\\');
+      if(!found)
+        break;
+
+      *found=0;
+      sprintf(buf, DEFRESDLLNAME);
+      strcat(path,buf);
+
+      rc=DosLoadModule(buf,sizeof(buf),path, &hmod);
+      if(rc==NO_ERROR)
+        break;
+      hmod=NULLHANDLE;
+    }while(FALSE);
+  }
+  return hmod;
+}
+
+
+BOOL _queryHelpLibrary(char * chrBuffer, int iSize)
+{
+  char chrBuf[CCHMAXPATH];
+      CHAR *lang = getenv("LANG");
+      PSZ  pszh = "mediafldr";
+      if (lang) {
+          if (!strnicmp(lang, "es", 2)) {
+              pszh = "mediafldr034";
+          }
+          else if (!strnicmp(lang, "tw", 2)) {
+              pszh = "mediafldr088";
+          }
+          else if (!strnicmp(lang, "de", 2)) {
+              pszh = "mediafldr049";
+          }
+          else if (!strnicmp(lang, "ru", 2)) {
+              pszh = "mediafldr007";
+          }
+          else if (!strnicmp(lang, "it", 2)) {
+              pszh = "mediafldr039";
+          }
+          else if (!strnicmp(lang, "fr", 2)) {
+              pszh = "mediafldr033";
+          }
+          else if (!strnicmp(lang, "nl", 2)) {
+              pszh = "mediafldr031";
+          }
+      }
+  queryModuleHandle("M_CWMediaFolder");
+  sprintf(chrBuf,"%s\\bin\\%s.hlp",chrInstallDir, pszh);
+  strncpy(chrBuffer, chrBuf, iSize);
+  chrBuffer[iSize-1]=0;
+  return TRUE;
+}
+
+
+BOOL M_CWMediaFolder::wpclsQueryDefaultHelp(PULONG HelpPanelId, PSZ HelpLibrary)
+{
+  if(HelpLibrary)
+    _queryHelpLibrary(HelpLibrary, CCHMAXPATH);
+
+  //SysWriteToTrapLog("%s\n", HelpLibrary);
+  if(HelpPanelId)
+    *HelpPanelId= IDHLP_MEDIAFOLDERMAIN;
+	
+  return TRUE;
+}
+
+/* Overriden function which returns our class name */
+PSZ M_CWMediaFolder::wpclsQueryTitle()
+{
+  static char chrTitle[40];
+
+  if(getMessage(chrTitle, IDSTR_TITLEMEDIAFOLDER,sizeof(chrTitle), queryResModuleHandle(), HWND_DESKTOP))
+    return chrTitle;
+  /* Fall back in case of error */
+  return "Media-Player";
+}
+
+/* Overriden function which returns the custom icon */
+ULONG M_CWMediaFolder::wpclsQueryIconData(PICONINFO pIconInfo)
+{
+  //  HMODULE hResource=queryResModuleHandle();
+  /* The icon is bound to the class DLL not the language DLL */
+  HMODULE hResource=queryModuleHandle("M_CWMediaFolder");
+
+  if(!hResource)
+    return M_CWProgFolder::wpclsQueryIconData(pIconInfo);
+
+  if (pIconInfo)   {
+    pIconInfo->fFormat = ICON_RESOURCE;
+    pIconInfo->hmod    = hResource;
+    pIconInfo->resid   = IDICON_FOLDER1;
+  } /* endif */
+
+  return ( sizeof(ICONINFO) );
+}
+
+ULONG M_CWMediaFolder::wpclsQueryIconDataN(PICONINFO pIconInfo, ULONG ulIconIndex)
+{
+  //HMODULE hResource=queryResModuleHandle();
+  /* The icon is bound to the class DLL not the language DLL */
+  HMODULE hResource=queryModuleHandle("M_CWMediaFolder");
+  if(!hResource)
+    return M_CWProgFolder::wpclsQueryIconDataN(pIconInfo, ulIconIndex);
+
+  if (pIconInfo)   {
+    pIconInfo->fFormat = ICON_RESOURCE;
+    pIconInfo->hmod    = hResource;
+    pIconInfo->resid   = IDICON_FOLDER2;
+  } /* endif */
+  return ( sizeof(ICONINFO) );
+}
+
+void M_CWMediaFolder::wpclsInitData()
+{
+  COUNTRYCODE country= {0};
+  COUNTRYINFO countryInfo= {0};
+  ULONG ulInfoLen=0;
+  APIRET rc;
+  char path[CCHMAXPATH];
+  char* found;
+  char buf[CCHMAXPATH];
+  HATOMTBL hatSystem;
+
+  cwCreateMutex(&hmtxFileName);
+
+  /* Call parent */
+  M_CWProgFolder::wpclsInitData();
+
+  /* Get slider cursor */
+  if(!hptrArrowWE)
+    hptrArrowWE=WinLoadPointer(HWND_DESKTOP,  queryModuleHandle("M_CWMediaFolder"), IDPTR_ARROWWE);
+  /* Register the slider window class */
+  WinRegisterClass(WinQueryAnchorBlock(HWND_DESKTOP), SLIDER_CLASS, privateSliderProc,0, SLADDBYTES);
+
+  /* Register media folder REXX functions */
+  RexxRegisterFunctionExe("MFldrCallFunc", (PFN)rxCallCWWPSFunc);
+
+  _loadBmps();
+
+}
+
+void M_CWMediaFolder::wpclsUnInitData()
+{
+  /* Don't deregister the function here. If doing it the function
+     may be unavailable if the class object goes dormant. */
+  /* RexxDeregisterFunction("MFldrCallFunc"); */
+
+  cwCloseMutex( hmtxFileName);
+  M_CWProgFolder::wpclsUnInitData();
+}
+
+
+ULONG M_CWMediaFolder::wpclsQueryStyle()
+{
+  /* CWProgFolder returns *_NEVERTEMPLATE but we want a template */
+
+  /* We don't want an automatic template because we create it during
+     installation because we need one with an ID so we can create a shadow
+     without problems. So we return CLSSTYLE_DONTTEMPLATE.
+     Another way would be an override of wpclsCreateDefaultTemplate()
+     but this works, too, and we have to override this method anyway. We must
+     disable CLSSTYLE_NEVERTEMPLATE or 'Create another' and the template checkbox
+     will be lost. */
+  return (M_CWProgFolder::wpclsQueryStyle()&~CLSSTYLE_NEVERTEMPLATE)|CLSSTYLE_DONTTEMPLATE;
+}
+
+void writeLog(char* logFile, char* logText);
+
+static void createMediaFolderShadow(M_WPObject * m_wpObject)
+{
+  char chrSetup[CCHMAXPATH];
+
+  /* Get special settings from the INI file */
+  if(PrfQueryProfileInt(HINI_USERPROFILE, APPKEY_CWMM, MFLDR_NO_TEMPLATE_SHADOW, 0))
+    return;
+
+  if(!WinQueryObject(ID_MEDIALDRTMPL_SHADOW))
+    {
+      sprintf(chrSetup,"SHADOWID=%s;OBJECTID=%s;", ID_MEDIAFLDRTEMPLATE,ID_MEDIALDRTMPL_SHADOW);
+      WinCreateObject("WPShadow", m_wpObject->wpclsQueryTitle(), chrSetup, ID_MMFOLDER, CO_UPDATEIFEXISTS);
+    }
+};
+
+BOOL M_CWMediaFolder::wpclsCreateDefaultTemplates(WPObject * wpObject)
+{
+  HOBJECT hObject;
+  WPObject * wpTemplate;
+  char chrSetup[CCHMAXPATH*2];
+  BOOL  rc;
+
+#ifdef WRITE_TEMPLATE_LOG
+  writeLog( "template.log", "In wpclsCreateDefaultTemplates()\n");
+  rc=FALSE;
+  TRY_LOUD(TEMPLATE) {
+    do {
+
+      if((hObject=WinQueryObject(ID_MEDIAFLDRTEMPLATE))!=NULLHANDLE) {
+        writeLog( "template.log", "1 WinQueryObject() gibt hObject zurck. Template bereits vorhanden.\n");
+        /* There's an object with the ID. Check if it's the right template */
+        if((wpTemplate=wpclsQueryObject(hObject))==NULLHANDLE) {
+          /* A handle but no object?! Shouldn't happen, fall back to default. */
+          writeLog( "template.log", "2 wpTemplate zu hObject kann nicht gefunden werden!!! -> break\n");
+          break;
+        }
+
+        if(somIsObj(wpTemplate)) {
+          writeLog( "template.log", "3 wpTemplate ist ein SOMObject. Test, ob ein CWAudio-Objekt...\n");
+          if(wpTemplate->somIsInstanceOf(this)) {
+            ULONG ulStyle;
+
+            writeLog( "template.log", "4 wpTemplate ist ein CWAudio-Objekt.\n");
+
+            /* It's an instance of our class. Make sure it's a template. */
+            ulStyle=wpTemplate->wpQueryStyle();
+            writeLog( "template.log", "5 ulStyle=wpTemplate->wpQueryStyle(); done\n");
+            wpTemplate->wpSetStyle(ulStyle|OBJSTYLE_TEMPLATE);
+            writeLog( "template.log", "6 wpTemplate->wpSetStyle(ulStyle|OBJSTYLE_TEMPLATE); done\n");
+            rc=TRUE;
+            break;
+            /* Ok we have a template */
+          }
+          else
+            writeLog( "template.log", "7 Nein, kein CWAudio-Objekt. Entfernen...\n");
+          /* The object isn't our template. Probably left over from previous installation
+             so remove it. */
+          ((WPFileSystem*)wpTemplate)->wpSetAttr(FILE_NORMAL); /* Remove system, readonly, hidden flags */
+          writeLog( "template.log", "8 ((WPFileSystem*)wpTemplate)->wpSetAttr(FILE_NORMAL); done\n");
+          wpTemplate->wpSetStyle(0);/* Remove styles so deleting is possible */
+          writeLog( "template.log", "9 wpTemplate->wpSetStyle(0); done\n");
+          wpTemplate->wpDelete(NULL);
+          writeLog( "template.log", "10 wpTemplate->wpDelete(NULL); done\n");
+        }/* somIsObj() */
+        else
+          writeLog( "template.log", "11 wpTemplate ist kein SOMObject!!?\n");
+      }/* if((hObject=WinQueryObject(ID_AUDIOTEMPLATE))!=NULLHANDLE) */
+      else
+        writeLog( "template.log", "12 WinQueryObject() gibt NULLHANDLE zurck. Kein Template vorhanden.\n");
+
+      wpTemplate=wpObject;
+      /* Create a new template */
+      /* Get Multimedia template folder */
+      writeLog( "template.log", "13 Neues Template erstellen...\n");
+      if((hObject=WinQueryObject(ID_MMTEMPLATEFOLDER))!=NULLHANDLE) {
+        writeLog( "template.log", "14 Multimediaordner gefunden...\n");
+        /* There's an object with the ID. */
+        if((wpTemplate=wpclsQueryObject(hObject))==NULLHANDLE) {
+          writeLog( "template.log", "15 Objekt-Ptr. zu Multimediaordner nicht gefunden!!\n");
+          /* A handle but no object?! Shouldn't happen, fall back to default. */
+          wpTemplate=wpObject;
+        }
+        writeLog( "template.log", "15b Objekt-Ptr. zu Multimediaordner gefunden!!\n");
+      }
+      else
+        writeLog( "template.log", "16 Multimediaordner nicht gefunden. Benutze Schablonen-Ordner\n");
+
+      sprintf(chrSetup,
+              "TEMPLATE=YES;OBJECTID=%s", ID_MEDIAFLDRTEMPLATE);
+      writeLog( "template.log", "16b erstelle Template...\n");
+      if((wpTemplate=wpclsNew(MEDIAFLDR_TEMPLATE_NAME, chrSetup, (WPFolder*)wpTemplate, FALSE))!=NULLHANDLE) {
+        writeLog( "template.log", "17 wpTemplate=wpclsNew() war erfogreich.\n");
+        sprintf(chrSetup,
+                //                "DEFAULTVIEW=DETAILS;DETAILSCLASS=CWAudioShadow;SORTCLASS=CWAudioShadow;");
+                "DEFAULTVIEW=DETAILS;DETAILSCLASS=CWAudioShadow;SORTCLASS=CWAudioShadow;DETAILSTODISPLAY=0,1,4,12,13,14,15,16,17,18,19,20,21;SORTBYATTR=6,24,25,26,27,28,29,30,31,32,33");
+        if(somIsObj(wpTemplate)) {
+          writeLog( "template.log", "18 wpTemplate ist ein SOMObject.\n");
+          wpTemplate->wpSetup(chrSetup);
+          writeLog( "template.log", "19 wpTemplate->wpSetup(chrSetup); done\n");
+        }
+        rc=TRUE;
+      }
+      writeLog( "template.log", "20 Verlasse while()\n");
+    }while(FALSE);
+  }
+  CATCH(TEMPLATE)
+    {
+    } END_CATCH;
+    if(rc)
+      writeLog( "template.log", "21 Verlasse wpclsCreateDefaultTemplates() mit rc=TRUE\n\n");
+    else
+      writeLog( "template.log", "21 Verlasse wpclsCreateDefaultTemplates() mit rc=FALSE\n\n");
+    return rc;
+    /* Above is for debugging only */
+#else
+
+  rc=FALSE;
+  TRY_LOUD(TEMPLATE) {
+    do {
+      if((hObject=WinQueryObject(ID_MEDIAFLDRTEMPLATE))!=NULLHANDLE) {
+        /* There's an object with the ID. Check if it's the right template */
+        if((wpTemplate=wpclsQueryObject(hObject))==NULLHANDLE) {
+          /* A handle but no object?! Shouldn't happen, fall back to default. */
+          break;
+        }
+
+        if(somIsObj(wpTemplate)) {
+          if(wpTemplate->somIsInstanceOf(this)) {
+            ULONG ulStyle;
+
+            /* It's an instance of our class. Make sure it's a template. */
+            ulStyle=wpTemplate->wpQueryStyle();
+            wpTemplate->wpSetStyle(ulStyle|OBJSTYLE_TEMPLATE);
+            rc=TRUE;
+            /* Now create a shadow in the MM folder. */
+            createMediaFolderShadow(this);
+#if 0
+            if(!WinQueryObject(ID_MEDIALDRTMPL_SHADOW))
+              {
+                sprintf(chrSetup,"SHADOWID=%s;OBJECTID=%s;", ID_MEDIAFLDRTEMPLATE,ID_MEDIALDRTMPL_SHADOW);
+                WinCreateObject("WPShadow", wpclsQueryTitle(), chrSetup, ID_MMFOLDER, CO_UPDATEIFEXISTS);
+              }
+#endif
+            break;
+            /* Ok we have a template */
+          }
+
+          /* The object isn't our template. Probably left over from previous installation
+             so remove it. */
+          ((WPFileSystem*)wpTemplate)->wpSetAttr(FILE_NORMAL); /* Remove system, readonly, hidden flags */
+          wpTemplate->wpSetStyle(0);/* Remove styles so deleting is possible */
+          wpTemplate->wpDelete(NULL);
+        }/* somIsObj() */
+      }/* if((hObject=WinQueryObject(ID_AUDIOTEMPLATE))!=NULLHANDLE) */
+
+      wpTemplate=wpObject;
+      /* Create a new template */
+      /* Get Multimedia template folder */
+      if((hObject=WinQueryObject(ID_MMTEMPLATEFOLDER))!=NULLHANDLE) {
+        /* There's an object with the ID. */
+        if((wpTemplate=wpclsQueryObject(hObject))==NULLHANDLE) {
+          /* A handle but no object?! Shouldn't happen, fall back to default. */
+          wpTemplate=wpObject;
+        }
+      }
+
+      sprintf(chrSetup,
+              "TEMPLATE=YES;OBJECTID=%s", ID_MEDIAFLDRTEMPLATE);
+      // if((wpTemplate=wpclsNew(MEDIAFLDR_TEMPLATE_NAME, chrSetup, (WPFolder*)wpTemplate, FALSE))!=NULLHANDLE) {
+      if((wpTemplate=wpclsNew(wpclsQueryTitle(), chrSetup, (WPFolder*)wpTemplate, FALSE))!=NULLHANDLE) {
+        sprintf(chrSetup,
+                //                "DEFAULTVIEW=DETAILS;DETAILSCLASS=CWAudioShadow;SORTCLASS=CWAudioShadow;");
+                "DEFAULTVIEW=DETAILS;DETAILSCLASS=CWAudioShadow;SORTCLASS=CWAudioShadow;DETAILSTODISPLAY=0,1,4,12,13,14,15,16,17,18,19,20,21;SORTBYATTR=6,24,25,26,27,28,29,30,31,32,33");
+        if(somIsObj(wpTemplate)) {
+          wpTemplate->wpSetup(chrSetup);
+          /* Now create a shadow in the MM folder. */
+          createMediaFolderShadow(this);
+#if 0
+          if(!WinQueryObject(ID_MEDIALDRTMPL_SHADOW))
+            {
+              sprintf(chrSetup,"SHADOWID=%s;OBJECTID=%s;", ID_MEDIAFLDRTEMPLATE,ID_MEDIALDRTMPL_SHADOW);
+              WinCreateObject("WPShadow", wpclsQueryTitle(), chrSetup, ID_MMFOLDER, CO_UPDATEIFEXISTS);
+            }
+#endif
+        }
+        rc=TRUE;
+      }
+    }while(FALSE);
+  }
+  CATCH(TEMPLATE)
+    {
+    } END_CATCH;
+
+    return rc;
+#endif
+
+}
+
+
+
+
+
+
+
+
+
+
Index: /tags/CWMM-0.3.0_GA/mediafolder/c/mediafldr/mediafolderoverridenwpmethods.cpp
===================================================================
--- /tags/CWMM-0.3.0_GA/mediafolder/c/mediafldr/mediafolderoverridenwpmethods.cpp	(revision 213)
+++ /tags/CWMM-0.3.0_GA/mediafolder/c/mediafldr/mediafolderoverridenwpmethods.cpp	(revision 213)
@@ -0,0 +1,1472 @@
+/*
+ * This file is (C) Chris Wohlgemuth 2002
+ *
+ * It's part of the Media-Folder distribution
+ */
+/*
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; see the file COPYING.  If not, write to
+ * the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+
+#define INCL_DOSERRORS
+#define INCL_DOSERRORS
+#define INCL_GPIBITMAPS
+
+#include "mediafolder.hh"
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include "mediafolderres.h"
+#include "menufolder.hh"
+
+#include "sys_funcs.h"
+
+/* typedef for somTP_MMAudio_cwmmQueryTrackInfo */
+/* For calling the method in the CWAudio class. Linking to the DLL would require the
+   new audio classes. By dynamically querying the method the media folder works without
+   installing the audio classes. */
+#include "cwmmquerytrackinfo.h"
+
+extern LOADEDBITMAP allBMPs[];
+extern somTD_MMAudio_cwmmQueryTrackInfo methodPtr;
+
+BOOL g_fRegisteredWindowClass=FALSE;
+ULONG g_ulFrameDataOffset=0;
+
+/* The following offsets will be calclated in wpOpen() */
+ULONG ulQWP_CONTAINERPROC=0;
+ULONG ulQWP_THISPTR=4;
+ULONG ulQWL_TOPCTRLHWND=8;
+ULONG ulQWL_BOTTOMCTRLHWND=12;
+ULONG ulQWL_RIGHTCTRLHWND=16;
+ULONG ulQWL_LEFTCTRLHWND=20;
+
+PFNWP pfnwpGenericFrame;
+HWND  hwndHelp;
+HELPINIT hini;
+
+void errorResource();
+ULONG messageBox( char* text, ULONG ulTextID , LONG lSizeText,
+                  char* title, ULONG ulTitleID, LONG lSizeTitle,
+                  HMODULE hResource, HWND hwnd, ULONG ulFlags);
+void getMessage(char* text,ULONG ulID, LONG lSizeText, HMODULE hResource,HWND hwnd);
+void sendCommand(char *chrObject, char* command);
+HMODULE queryResModuleHandle(void);
+
+MRESULT EXPENTRY topCtrlDialogProc(HWND hwnd, ULONG msg, MPARAM mp1, MPARAM mp2) ;
+MRESULT EXPENTRY rightCtrlDialogProc(HWND hwnd, ULONG msg, MPARAM mp1, MPARAM mp2) ;
+MRESULT EXPENTRY leftCtrlDialogProc(HWND hwnd, ULONG msg, MPARAM mp1, MPARAM mp2) ;
+MRESULT EXPENTRY bottomCtrlDialogProc(HWND hwnd, ULONG msg, MPARAM mp1, MPARAM mp2) ;
+MRESULT EXPENTRY mediaFrameProc(HWND hwnd, ULONG msg, MPARAM mp1, MPARAM mp2) ;
+MRESULT EXPENTRY mediaFldrContainerProc(HWND hwnd, ULONG msg, MPARAM mp1, MPARAM mp2) ;
+/* This function sets the repeat button checkstate */
+void winCheckRepeatButton(CWMediaFolder *thisPtr);
+/* This function sets the position of the volume slider */
+void winSetVolumeSlider(CWMediaFolder *thisPtr);
+HWND playTimeControlFromFrameHWND(HWND hwndFrame);
+HWND bottomControlFromFrameHWND(HWND hwndFrame);
+HWND playControlDialogFromFrameHWND(HWND hwndFrame);
+HWND topControlFromFrameHWND(HWND hwndFrame);
+
+extern void _Optlink playThreadFunc (void *arg);/* Every folder has one running play thread to handle play commands */
+
+MRESULT cwInsertMenuSeparator(int iPosition, HWND hwndMenu, HWND hwndSubMenu);
+
+SOMClass* somhlpQueryMMAudioClass(void);
+SOMClass* somhlpGetSomClass(char* chrClassName);
+BOOL somhlpQueryCWAudioMethodPtr(CWMediaFolder *thisPtr);
+
+/* ID tag defines */
+#define IDINFO_NAME              1
+#define IDINFO_ARTIST            2
+#define IDINFO_ALBUM             3
+#define IDINFO_YEAR              4
+#define IDINFO_COMMENT           5
+#define IDINFO_GENRE             6
+
+#define IDINFO_PLAYTIME          7
+#define IDINFO_BPS               8
+#define IDINFO_SAMPLERATE        9
+#define IDINFO_CHANNELS          10
+
+#define IDINFO_LASTINFO          10
+
+/***************************************************************/
+/*                                                             */
+/* This thread calculates the size of the audio files in this  */
+/* folder. It is started by the status line dialog after the    */
+/* folder is opened.                                           */
+/*                                                             */
+/***************************************************************/
+void _Optlink openThreadFunc (void *arg)
+{
+  HAB  hab;
+  HMQ  hmq;
+  QMSG qmsg;
+  THREADPARAMS* tPt;
+  CWMediaFolder *thisPtr;
+  MMAudio* cwAudio;
+
+  tPt=(THREADPARAMS*) arg;
+  if(!tPt)
+    return;
+  thisPtr=(CWMediaFolder*)tPt->thisPtr;    //Pointer auf CWMediaFolder-Object
+  if(!somIsObj(thisPtr))
+    return;
+
+  hab=WinInitialize(0);
+  if(hab) {
+    hmq=WinCreateMsgQueue(hab,0);
+    if(hmq) {
+      WPObject *wpObject;
+      WPObject *fsObject;
+      HWND hwndContainer;
+      CNRINFO cnrInfo;
+      char text[100];
+      char time[50];
+      int iNum=0;
+      somId    mySomId;
+      SOMClass *cwAudioClass=somhlpGetSomClass("MMAudio");
+      ULONG ulSize=0;
+      ULONG ulSecs=0;
+
+      TRY_LOUD(MEDIAFLDR_OPEN_THREAD) {
+        /* Wait until folder is populated */
+        while(!(thisPtr->wpQueryFldrFlags() & FOI_POPULATEDWITHALL))
+          DosSleep(300);
+
+        hwndContainer=WinWindowFromID(tPt->hwndFrame, FID_CLIENT);
+        WinSendMsg(hwndContainer,CM_QUERYCNRINFO, MPFROMP(&cnrInfo),
+                   MPFROMLONG(sizeof(cnrInfo)));
+
+        /* Get class object of MMAudio. We need it so we can check if a file is an audio file. */
+        if(somIsObj(cwAudioClass)) {
+          /* We have the class object */
+          char chrBuf[2];
+          /* Get first object in the container */
+          wpObject=thisPtr->wpQueryContent(NULLHANDLE, QC_FIRST);
+          /* Works only for size < 4Gb up to now */
+          while(wpObject)
+            {
+              /* Follow shadows to the filesystem object (if any) */
+              if((fsObject=thisPtr->cwGetFileSystemObject(wpObject))!=NULLHANDLE){/* Filesystem object or NULL */
+                /* Check if the file is an audio file */
+                if(fsObject->somIsA(cwAudioClass)) {
+                  /* It's an audio file */
+                  if(!methodPtr)
+                    somhlpQueryCWAudioMethodPtr(thisPtr);
+                  ulSize+=((WPFileSystem*)fsObject)->wpQueryFileSize();
+                  iNum++;
+                  if(methodPtr)/* Query playtime in secs */
+                    ulSecs+=methodPtr((MMAudio*)fsObject, NULLHANDLE, 0, IDINFO_PLAYTIME);
+                }
+              }
+              wpObject=thisPtr->wpQueryContent(wpObject, QC_NEXT);
+            };/* while(wpObject) */
+
+          if(thisPtr->mfData) {
+            thisPtr->mfData->ulTotalTime=ulSecs;
+            thisPtr->mfData->ulNumTracks=iNum;
+            thisPtr->mfData->ulSize=ulSize;
+            thisPtr->mfData->bOpened=TRUE;
+          }
+          /* Set status line text */
+          thisPtr->cwSetStatusLineText(NULLHANDLE);
+        }/* if(somIsObj(cwAudioClass)) */
+      else
+        {
+          /* Error */
+          /* !!!!!!!!!!! Insert messagebox here. !!!!!!!!!!!!!!!*/
+        }
+      }
+      CATCH(MEDIAFLDR_OPEN_THREAD)
+        {
+          SysWriteToTrapLog("\nTrap occured in %s, file: %s, near line %d.\n",
+                            __FUNCTION__, __FILE__, __LINE__);
+        } END_CATCH;
+
+      WinDestroyMsgQueue(hmq);
+    }
+    WinTerminate(hab);
+  }
+
+  thisPtr->wpFreeMem((PBYTE)tPt);
+}
+
+
+BOOL CWMediaFolder::wpAddToContent(WPObject* Object)
+{
+  WPFileSystem *fsObject;
+  char time[200];
+  ULONG ulSecs;
+  BOOL rc;
+  static int iCounter=0;
+
+  rc=CWProgFolder::wpAddToContent(Object);
+
+  if(mfData)
+    if(mfData->bOpened)/* Only post notification if the folder was already populated. On first
+                          opening a separate thread calculates the contents. */
+      WinPostMsg(hwndBottom, WM_APPTERMINATENOTIFY,MPFROMSHORT(NOTIFY_STARTSTATUSTIMER), 0L);
+
+  iCounter++;
+  if(iCounter==10) {
+    DosSleep(30);/* Yield processor to another thread to prevent WPS blocking */
+    iCounter=0;
+  }
+  return rc;
+  /* On first opening a separate thread calculates the playtime. Doing it this way we don't
+     update the statusbar for every single object. */
+}
+
+BOOL CWMediaFolder::wpDeleteFromContent(WPObject* Object)
+{
+  WPFileSystem *fsObject;
+  char time[200];
+  ULONG ulSecs;
+
+  if(!methodPtr)
+    somhlpQueryCWAudioMethodPtr(this);
+
+  if(methodPtr){
+    if((fsObject=(WPFileSystem*)cwGetFileSystemObject(Object))!=NULLHANDLE){/* Filesystem object or NULL */
+      if(mfData) {
+        /* Query playtime in secs */
+        mfData->ulTotalTime-=methodPtr((MMAudio*)fsObject, NULLHANDLE, 0, IDINFO_PLAYTIME);
+        mfData->ulNumTracks-=1;
+        mfData->ulSize-=fsObject->wpQueryFileSize();
+        cwSetStatusLineText(NULLHANDLE);
+      }
+    }
+  }
+  return CWProgFolder::wpDeleteFromContent(Object);
+}
+
+HWND CWMediaFolder::wpOpen(HWND hwndCnr,ULONG ulView,ULONG ulParam)
+{
+  HWND hwnd;
+  SIZEL sizel={0};
+  HWND myFrameCtrlHWND;
+  RECTL rectl;
+  MENUITEM mi={0};
+  HWND hwndMenu;
+  int iItemCount=0;
+  char text[200];
+  HMODULE hResource=queryResModuleHandle();
+
+  /* Reregister wpFolder window class on first opening */
+  /* We need this private code to have some private
+     window words */
+  if(!g_fRegisteredWindowClass)
+    {
+      CLASSINFO ci;
+
+      if(WinQueryClassInfo(WinQueryAnchorBlock(HWND_DESKTOP),
+                           (PSZ)"wpFolder window",
+                           &ci))
+        {
+          g_ulFrameDataOffset=ci.cbWindowData;
+          //g_pfnwpOrgFrameProc=ci.pfnWindowProc;
+          if (WinRegisterClass(WinQueryAnchorBlock(HWND_DESKTOP),
+                               (PSZ)"wpFolder window",
+                               ci.pfnWindowProc,
+                               ci.flClassStyle,
+                               ci.cbWindowData + MFLDR_WINDOWBYTES))
+            {
+              /* */
+              ulQWP_CONTAINERPROC+=g_ulFrameDataOffset;
+              ulQWP_THISPTR+=g_ulFrameDataOffset;
+              ulQWL_TOPCTRLHWND+=g_ulFrameDataOffset;
+              ulQWL_BOTTOMCTRLHWND+=g_ulFrameDataOffset;
+              ulQWL_LEFTCTRLHWND+=g_ulFrameDataOffset;
+              ulQWL_RIGHTCTRLHWND+=g_ulFrameDataOffset;
+              g_fRegisteredWindowClass=TRUE;
+            }
+        }
+    }
+
+  /* Prevent opening in tree view */
+  if(ulView==OPEN_TREE || ulView==OPEN_CONTENTS)
+    return NULLHANDLE;
+
+#if 0
+  for(pViewItem=wpFindViewItem(VIEW_ANY, NULLHANDLE); pViewItem; pViewItem=wpFindViewItem(VIEW_ANY, pViewItem))
+    iItemCount+=1;
+#endif
+
+  /* Only one open window for now */
+  if(hwndMFldrFrame && ulView!=OPEN_SETTINGS)
+    return NULLHANDLE;
+
+  /* Call parent to build folder window */
+  hwnd=CWProgFolder::wpOpen(hwndCnr, ulView, ulParam);
+
+  /* Only subclass folder frames, not settings notebooks */
+  if(ulView!=OPEN_SETTINGS){
+    if(!hResource) {
+      errorResource();
+      return hwnd;
+    }
+
+    /* Save this ptr */
+    WinSetWindowULong( hwnd, ulQWP_THISPTR, (ULONG)this); /* Moved from outside the if clause */
+
+    hwndMFldrFrame=hwnd;
+
+    TRY_LOUD(MEDIAFLDR_OPEN) {
+      THREADPARAMS*  pTp;
+      ULONG ulErr;
+      BOOL bDisabled=FALSE;
+
+      if(!(ulFlags & FLAG_ALREADYSIZED)) {
+        /* Make sure on first open the container is visible */
+        SWP swp;
+        /* Prevent window flickering while resizing */
+        WinEnableWindowUpdate(hwnd, FALSE);
+        bDisabled=TRUE;
+        WinQueryWindowPos(hwnd, &swp);
+        WinSetWindowPos(hwnd, NULLHANDLE, swp.x, swp.y-100, swp.cx, swp.cy+100, SWP_SIZE|SWP_MOVE);
+        ulFlags|=FLAG_ALREADYSIZED;
+      }
+
+      /* Build new menu entries. */
+      myFrameCtrlHWND=WinWindowFromID(hwnd,FID_MENU);//Get menu hwnd
+      if(WinIsWindow(WinQueryAnchorBlock(hwnd), myFrameCtrlHWND)) {
+        /* Menu bar found */
+        if(WinSendMsg(myFrameCtrlHWND,MM_QUERYITEM,MPFROM2SHORT(ID_MBMENUSKRIPTS,FALSE),MPFROMP(&mi))) {
+          /* Script menu is inserted so WPS-Wizard is installed */
+          hwndMenu=mi.hwndSubMenu;
+          if(hwndMenu){
+            //          ULONG ulItemId;
+            //   ulItemId=cwInsertUserMenuItems(hwndMenu, SKRIPTFOLDER_MEDIAFOLDER, FIRSTUSERITEM, FALSE);
+            /*          sprintf(text, " %x",ulItemId);
+                        WinMessageBox(HWND_DESKTOP, HWND_DESKTOP, text, "",
+                        1234, MB_OK|MB_MOVEABLE);
+                        */
+
+            /* The class specific skript menu is inserted in class CWFolder */
+            /* Query the number of items in the menubar */
+            iItemCount=(int)WinSendMsg(hwndMenu,MM_QUERYITEMCOUNT,(MPARAM)0,
+                                       (MPARAM)0);
+            if(iItemCount)
+              cwInsertUserMenuItems(hwndMenu, USERMENUFOLDER_MEDIAFOLDER, FIRSTUSERITEM, TRUE);
+            else
+              cwInsertUserMenuItems(hwndMenu, USERMENUFOLDER_MEDIAFOLDER, FIRSTUSERITEM, FALSE);
+          }
+        }
+#ifndef ECS
+        else {
+          /* Load the user menu from the resource if WPS-Wizard is not installed. If installed the menu item
+             is added by WPS-Wizzard. */
+          hwndMenu=WinLoadMenu(myFrameCtrlHWND,hResource, ID_MBMENUSKRIPTS);
+          if(hwndMenu){
+            //          ULONG ulItemId;
+            //   ulItemId=cwInsertUserMenuItems(hwndMenu, SKRIPTFOLDER_MEDIAFOLDER, FIRSTUSERITEM, FALSE);
+            /*          sprintf(text, " %x",ulItemId);
+                        WinMessageBox(HWND_DESKTOP, HWND_DESKTOP, text, "",
+                        1234, MB_OK|MB_MOVEABLE);
+                        */
+            /* Query the number of items in the menu */
+            iItemCount=(int)WinSendMsg(hwndMenu,MM_QUERYITEMCOUNT,(MPARAM)0,
+                                       (MPARAM)0);
+
+            if(iItemCount)
+              cwInsertUserMenuItems(hwndMenu, USERMENUFOLDER_MEDIAFOLDER, FIRSTUSERITEM, TRUE);
+            else
+              cwInsertUserMenuItems(hwndMenu, USERMENUFOLDER_MEDIAFOLDER, FIRSTUSERITEM, FALSE);
+
+            /* Query the number of items in the menubar */
+            iItemCount=(int)WinSendMsg(myFrameCtrlHWND,MM_QUERYITEMCOUNT,(MPARAM)0,
+                                       (MPARAM)0);
+
+            /* Fill the MENUITEM structure */
+            mi.iPosition=iItemCount-1;
+            mi.afStyle=MIS_TEXT|MIS_SUBMENU;
+            mi.id=ID_MBMENUSKRIPTS;
+            mi.afAttribute=NULL;
+            mi.hwndSubMenu=hwndMenu;
+            mi.hItem=NULL;
+            /* Add the Misc-tools item to the folder menubar */
+            /* Text: "Skripts and tools" */
+            getMessage(text, IDSTR_MENUSKRIPTS,sizeof(text), hResource, hwnd);
+            WinSendMsg(myFrameCtrlHWND,MM_INSERTITEM,MPFROMP(&mi),
+                       (MPARAM)text);
+          }/* end of if(hwndMenu) */
+        }
+#endif
+      }/* menu hwnd */
+
+      /* Subclass container for tabbing */
+      myFrameCtrlHWND=WinWindowFromID(hwnd,FID_CLIENT);//Get container hwnd
+      if(myFrameCtrlHWND){
+        PFNWP pfnwpContainer;
+        pfnwpContainer=WinSubclassWindow(myFrameCtrlHWND, mediaFldrContainerProc);
+        /* Save container proc in frame window words */
+        WinSetWindowULong( hwnd, ulQWP_CONTAINERPROC, (ULONG)pfnwpContainer);
+      }
+
+      /* Now add the framecontrols */
+
+      /* This is the Top-frameCtrl. */
+      /* Load the dialog from the resource. The object pointer of this
+         folder is given to the dialog procedure (this). In WM_INITDLG
+         the procedure saves this pointer for later use. */
+      myFrameCtrlHWND=WinLoadDlg(hwnd,hwnd,topCtrlDialogProc,hResource,IDDLG_TOPFRAME ,this);
+      /* Save the HWND in the Window words */
+      WinSetWindowULong( hwnd, ulQWL_TOPCTRLHWND, myFrameCtrlHWND);
+
+      if(myFrameCtrlHWND){
+        /* Query the size of the dialog */
+        WinQueryWindowRect(myFrameCtrlHWND, &rectl);
+        /* It's the top dialog so we need the height but not the width. The width
+           is always the width of the folder. */
+        sizel.cy=allBMPs[MAIN_BMP_IDX].bmpInfoHdr.cy;
+        /* Call a method of CWProgFolder to add the dialog as a framecontrol.
+           FCTL_TOP means put it at the top of the folder.
+           After calling cwUpdateFrame(hwnd) it will be visible */
+        cwAddFrameCtl(hwnd, myFrameCtrlHWND, sizel, FCTL_TOP,0);
+      }
+
+
+      /* Load the dialog from the resource. The object pointer of this
+         folder is given to the dialog procedure (this). In WM_INITDLG
+         the procedure saves this pointer for later use. */
+      myFrameCtrlHWND=WinLoadDlg(hwnd,hwnd,leftCtrlDialogProc,hResource,IDDLG_LEFTFRAME ,this);
+      /* Save the HWND in the Window words */
+      WinSetWindowULong( hwnd, ulQWL_LEFTCTRLHWND, myFrameCtrlHWND);
+
+      if(myFrameCtrlHWND){
+        /* Query the size of the dialog */
+        WinQueryWindowRect(myFrameCtrlHWND, &rectl);
+        /* It's the right dialog so we need the width but not the height. */
+        sizel.cx=allBMPs[CTRLIDX_TOPRIGHT].bmpInfoHdr.cx-1-7-2;//rectl.xRight-rectl.xLeft;
+        /* Call a method of CWProgFolder to add the dialog as a framecontrol.
+           FCTL_RIGHT means put it at the RIGHT of the folder.
+           After calling cwUpdateFrame(hwnd) it will be visible */
+        cwAddFrameCtl(hwnd, myFrameCtrlHWND, sizel, FCTL_LEFT, FCTL_POSABOVE|FCTL_POSBELOW);
+      }
+
+      /* Load the dialog from the resource. The object pointer of this
+         folder is given to the dialog procedure (this). In WM_INITDLG
+         the procedure saves this pointer for later use. */
+      myFrameCtrlHWND=WinLoadDlg(hwnd,hwnd,rightCtrlDialogProc,hResource,IDDLG_FRAMERIGHT ,this);
+      /* Save the HWND in the Window words */
+      WinSetWindowULong( hwnd, ulQWL_RIGHTCTRLHWND, myFrameCtrlHWND);
+
+      if(myFrameCtrlHWND){
+        CNRINFO cnrInfo;
+        HWND hwndContainer;
+        PVIEWITEM pView;
+
+        /* Query the size of the dialog */
+        WinQueryWindowRect(myFrameCtrlHWND, &rectl);
+        /* It's the right dialog so we need the width but not the height. */
+        sizel.cx=allBMPs[CTRLIDX_TOPRIGHT].bmpInfoHdr.cx-1-7-2;// rectl.xRight-rectl.xLeft;
+        /* Call a method of CWProgFolder to add the dialog as a framecontrol.
+           FCTL_RIGHT means put it at the RIGHT of the folder.
+           After calling cwUpdateFrame(hwnd) it will be visible */
+        cwAddFrameCtl(hwnd, myFrameCtrlHWND, sizel, FCTL_RIGHT, FCTL_POSABOVE|FCTL_POSBELOW);
+
+        hwndContainer=WinWindowFromID(myFrameCtrlHWND, IDCNR_PLAYLIST);
+        WinSendMsg(hwndContainer,CM_QUERYCNRINFO, MPFROMP(&cnrInfo),
+                   MPFROMLONG(sizeof(cnrInfo)));
+      }/* if(hwndRight) */
+
+
+      /* Load the dialog from the resource. The object pointer of this
+         folder is given to the dialog procedure (this). In WM_INITDLG
+         the procedure saves this pointer for later use. */
+      myFrameCtrlHWND=WinLoadDlg(hwnd,hwnd,bottomCtrlDialogProc,hResource,IDDLG_BOTTOMFRAME ,this);
+      /* Save the HWND in the instance data */
+      hwndBottom=myFrameCtrlHWND;
+      /* Save the HWND in the Window words */
+      WinSetWindowULong( hwnd, ulQWL_BOTTOMCTRLHWND, myFrameCtrlHWND);
+
+      if(hwndBottom){
+        /* Query the size of the dialog */
+        WinQueryWindowRect(hwndBottom,&rectl);
+        //sizel.cy=20;
+        sizel.cy=rectl.yTop-rectl.yBottom-2;
+        //    sizel.cy=allBMPs[MAIN_BMP_IDX].bmpInfoHdr.cy;
+        /* Call a method of CWProgFolder to add the dialog as a framecontrol.
+           FCTL_TOP means put it at the top of the folder.
+           After calling cwUpdateFrame(hwnd) it will be visible */
+        cwAddFrameCtl(hwnd, hwndBottom, sizel, FCTL_BOTTOM,0);
+      }
+
+      if(bDisabled) {
+        WinEnableWindowUpdate(hwnd, TRUE);
+      }
+
+      /* Refresh frame to show the new framecontrols */
+      cwUpdateFrame(hwnd);
+
+      pfnwpFrame=WinSubclassWindow(hwnd, mediaFrameProc);
+      pfnwpGenericFrame=pfnwpFrame;
+
+      /* Start play thread handling user input */
+      pTp=(THREADPARAMS*)this->wpAllocMem(sizeof(THREADPARAMS), &ulErr);
+      if(pTp) {
+        pTp->thisPtr=this;
+        pTp->hwndFrame=hwnd;
+        _beginthread(playThreadFunc,NULL,8192*16,(void*)pTp); //Fehlerbehandlung fehlt
+      }
+    }
+    CATCH(MEDIAFLDR_OPEN)
+      {
+        SysWriteToTrapLog("\nTrap occured in %s, file: %s above line %d.\n",
+                          __FUNCTION__, __FILE__, __LINE__);
+
+      } END_CATCH;
+  }
+  return hwnd;
+}
+
+/**************************************************************/
+/*                                                            */
+/* This thread handles the about dialog.                      */
+/*                                                            */
+/**************************************************************/
+void _Optlink aboutThreadFunc (void *arg)
+{
+  HAB  hab;
+  HMQ  hmq;
+  QMSG qmsg;
+  CWMediaFolder *thisPtr;
+
+  thisPtr=(CWMediaFolder*)arg;    //Pointer auf CWMediaFolder-Object
+  hab=WinInitialize(0);
+  if(hab) {
+    hmq=WinCreateMsgQueue(hab,0);
+    if(hmq) {
+      /* Call the method from CWProgFolder */
+      thisPtr->cwShowAboutDlg(queryResModuleHandle(), IDDLG_ABOUT);
+      WinDestroyMsgQueue(hmq);
+    }
+    WinTerminate(hab);
+  }
+}
+
+/**************************************************************/
+/*                                                            */
+/* Override method:                                           */
+/*                                                            */
+/**************************************************************/
+BOOL CWMediaFolder::wpSetupOnce(PSZ pSetupString)
+{
+  BOOL rcParent=FALSE;
+  char buffer[CCHMAXPATH];
+  ULONG bufferSize;
+  int iIndex;
+
+  rcParent=CWProgFolder::wpSetupOnce(pSetupString);
+
+  /* Doing our own setup here if not done by the user. */
+  /* Set volume */
+  bufferSize=sizeof(buffer);
+  if(!wpScanSetupString(pSetupString, MEDIAFLDR_VOLUME, buffer,&bufferSize))
+    {
+      ulVolume=70;
+      /* Set position of slider bar */
+      winSetVolumeSlider(this);
+    }
+
+  bufferSize=sizeof(buffer);
+  if(!wpScanSetupString(pSetupString,"DEFAULTVIEW",buffer,&bufferSize))
+    wpSetup( "DEFAULTVIEW=DETAILS");/* Fill in defaults */
+
+  bufferSize=sizeof(buffer);
+  if(!wpScanSetupString(pSetupString,"ICONVIEW",buffer,&bufferSize))
+    wpSetup( "ICONVIEW=NONFLOWED,MINI");/* Fill in defaults */
+
+  /* Size and position of the folder window */
+  bufferSize=sizeof(buffer);
+  if(!wpScanSetupString(pSetupString,"ICONVIEWPOS",buffer,&bufferSize))
+    wpSetup( "ICONVIEWPOS=20,10,60,75");/* Fill in defaults */
+
+  /* Set folder details- and sortclass to CWAudioShadow so track infos are shown */
+  bufferSize=sizeof(buffer);
+  if(!wpScanSetupString(pSetupString,"DETAILSCLASS",buffer,&bufferSize))
+    wpSetup("DETAILSCLASS=CWAudioShadow");/* Fill in defaults */
+
+  bufferSize=sizeof(buffer);
+  if(!wpScanSetupString(pSetupString,"SORTCLASS",buffer,&bufferSize))
+    wpSetup("SORTCLASS=CWAudioShadow");/* Fill in defaults */
+
+  /* This works only on Warp 4 and above */
+  bufferSize=sizeof(buffer);
+  if(!wpScanSetupString(pSetupString,"DETAILSTODISPLAY",buffer,&bufferSize))
+    /* This works only on Warp 4 and above */
+    wpSetup("DETAILSTODISPLAY=0,1,4,12,13,14,15,16,17,18,19,20,21");/* Fill in defaults */
+
+  /* This works only on Warp 4 and above */
+  bufferSize=sizeof(buffer);
+  if(!wpScanSetupString(pSetupString,"SORTBYATTR",buffer,&bufferSize))
+    /* This works only on Warp 4 and above */
+    wpSetup("SORTBYATTR=6,24,25,26,27,28,29,30,31,32,33");/* Fill in defaults */
+
+  return rcParent;
+}
+
+static HWND _findOpenMediaFldrViewHWND(CWMediaFolder *thisPtr)
+{
+  PVIEWITEM pViewItem;
+
+  /* Check if we close a settings view or a folder view. */
+  pViewItem=thisPtr->wpFindViewItem(VIEW_DETAILS|VIEW_CONTENTS, NULLHANDLE);
+  if(pViewItem)
+    return pViewItem->handle;
+
+  return NULLHANDLE;
+}
+
+/**************************************************************/
+/*                                                            */
+/* Override method:                                           */
+/*                                                            */
+/**************************************************************/
+BOOL CWMediaFolder::wpSetup(PSZ pSetupString)
+{
+  char buffer[CCHMAXPATH];
+  ULONG bufferSize;
+  int tid;
+
+  bufferSize=sizeof(buffer);
+  if(wpScanSetupString(pSetupString, MEDIAFLDR_PLAY_FIRST, buffer,&bufferSize))
+    {
+      HWND hwndFrame=_findOpenMediaFldrViewHWND(this);
+      if(WinIsWindow(WinQueryAnchorBlock(HWND_DESKTOP), hwndFrame)) {
+        HWND hwndCnr=WinWindowFromID(hwndFrame, FID_CLIENT);
+        if(WinIsWindow(WinQueryAnchorBlock(HWND_DESKTOP), hwndCnr)) {
+          PRECORDCORE prc;
+          prc=(PRECORDCORE)WinSendMsg(hwndCnr, CM_QUERYRECORD, 0L, MPFROM2SHORT(CMA_FIRST, CMA_ITEMORDER));
+          WinSendMsg(hwndCnr, CM_SETRECORDEMPHASIS, MPFROMP(prc), MPFROM2SHORT(TRUE, CRA_SELECTED));
+        }
+        cwPlayAudioFile( hwndFrame, PLAY_FIRST);
+      }
+    }
+  bufferSize=sizeof(buffer);
+  if(wpScanSetupString(pSetupString, MEDIAFLDR_PLAY, buffer,&bufferSize))
+    {
+      HWND hwndFrame=_findOpenMediaFldrViewHWND(this);
+      if(WinIsWindow(WinQueryAnchorBlock(HWND_DESKTOP), hwndFrame))
+        cwPlayAudioFile( hwndFrame, PLAY_FIRST);
+    }
+  bufferSize=sizeof(buffer);
+  if(wpScanSetupString(pSetupString, MEDIAFLDR_STOP, buffer,&bufferSize))
+    {
+      HWND hwndFrame=_findOpenMediaFldrViewHWND(this);
+      if(WinIsWindow(WinQueryAnchorBlock(HWND_DESKTOP), hwndFrame))
+        cwStopAudioFile( hwndFrame);
+    }
+  bufferSize=sizeof(buffer);
+  if(wpScanSetupString(pSetupString, MEDIAFLDR_NEXT, buffer,&bufferSize))
+    {
+      HWND hwndFrame=_findOpenMediaFldrViewHWND(this);
+      if(WinIsWindow(WinQueryAnchorBlock(HWND_DESKTOP), hwndFrame))
+        cwPlayAudioFile( hwndFrame, PLAY_NEXT);
+    }
+  bufferSize=sizeof(buffer);
+  if(wpScanSetupString(pSetupString, MEDIAFLDR_PREV, buffer,&bufferSize))
+    {
+      HWND hwndFrame=_findOpenMediaFldrViewHWND(this);
+      if(WinIsWindow(WinQueryAnchorBlock(HWND_DESKTOP), hwndFrame))
+        cwPlayAudioFile( hwndFrame, PLAY_PREV);
+    }
+
+  /* Set volume */
+  bufferSize=sizeof(buffer);
+  if(wpScanSetupString(pSetupString, MEDIAFLDR_VOLUME, buffer,&bufferSize))
+    {
+      ulVolume=atol(buffer);
+      if(ulVolume<0)
+        ulVolume=0;
+      else if(ulVolume>100)
+        ulVolume=100;
+      /* Set position of slider bar */
+      winSetVolumeSlider(this);
+    }
+  /* Set repeat */
+  bufferSize=sizeof(buffer);
+  if(wpScanSetupString(pSetupString, MEDIAFLDR_REPEAT, buffer,&bufferSize))
+    {
+      switch(atol(buffer))
+        {
+        case 0:
+          ulFlags&=~FLAG_REPEAT;
+          winCheckRepeatButton(this);
+          break;
+        case 1:
+          ulFlags|=FLAG_REPEAT;
+          winCheckRepeatButton(this);
+          break;
+        }
+      ulVolume=atol(buffer);
+    }
+
+  /* Set object window HWND */
+  bufferSize=sizeof(buffer);
+  if(wpScanSetupString(pSetupString, "M3UOBJECTWINDOW", buffer,&bufferSize))
+    {
+      hwndObject=atol(buffer);
+    }
+
+  /* Set object pointer to M3U-File */
+  bufferSize=sizeof(buffer);
+  if(wpScanSetupString(pSetupString, "M3UOBJECTHANDLE", buffer,&bufferSize))
+    {
+      WPObject *wpObject;
+
+      wpObjM3UFile=NULLHANDLE;
+      wpObject=(WPObject*)atol(buffer);
+      if(somIsObj(wpObject))
+        wpObjM3UFile=wpObject;
+    }
+
+  /* Insert tracks */
+  bufferSize=sizeof(buffer);
+  if(wpScanSetupString(pSetupString, "INSERTTRACKS", buffer,&bufferSize))
+    {
+      cwInsertAllTracks(NULLHANDLE);
+    }
+
+  /* FIXME: Use immediate parent here !!!! */
+  return CWProgFolder::wpSetup(pSetupString);
+}
+
+
+/**************************************************************/
+/*                                                            */
+/* Added with V0.2.8 (07.09.2003)                             */
+/*                                                            */
+/* This method is only overriden to set a flag in the instance*/
+/* data so the wpInsertSettingsPage() method knows when       */
+/* the details page is inserted.                              */
+/*                                                            */
+/* This is done because the details page needs a major tab    */
+/* when the icon page is removed. The necessary style bit     */
+/* is set in wpInsertSettingsPage().                          */
+/*                                                            */
+/**************************************************************/
+ULONG CWMediaFolder::wpAddFolderView3Page(HWND hwndNotebook)
+{
+  ULONG rc;
+
+  /* Mark in the instance data from where we're coming */
+  ulPrivFlags|=MFLDR_CURACTION_ADDFOLDERVIEW3;
+
+  rc=CWProgFolder::wpAddFolderView3Page(hwndNotebook);
+
+  ulPrivFlags&= ~MFLDR_CURACTION_ADDFOLDERVIEW3;
+  return rc;
+}
+
+/**************************************************************/
+/*                                                            */
+/* Override method: Remove the Icon view settings page.       */
+/*                                                            */
+/* Added with V0.2.8 (07.09.2003)                             */
+/**************************************************************/
+ULONG CWMediaFolder::wpAddFolderView1Page(HWND hwndNotebook)
+{
+  /*
+     Removing this page also means removing the XWorkplace
+     view page. It would be possible to call the XWP method
+     directly to insert it's page but unfortunately XWP is a moving
+     target without frozen interfaces/methods so every new
+     XWP release is likely to break any code relying on certain
+     XWP features so nothing is done to keep the XWP pages.
+     */
+  return SETTINGS_PAGE_REMOVED;
+}
+
+/**************************************************************/
+/*                                                            */
+/* Override method: Remove the tree view settings page.       */
+/*                                                            */
+/**************************************************************/
+ULONG CWMediaFolder::wpAddFolderView2Page(HWND hwndNotebook)
+{
+  return SETTINGS_PAGE_REMOVED;
+}
+
+/**************************************************************/
+/*                                                            */
+/* Added with V0.2.8 (07.09.2003)                             */
+/*                                                            */
+/* Overriden to give the details view page a major tab        */
+/* because the icon view page is removed.                     */
+/*                                                            */
+/*                                                            */
+/**************************************************************/
+ULONG CWMediaFolder::wpInsertSettingsPage(HWND hwndNotebook, PPAGEINFO ppageinfo)
+{
+  somId mySomId;
+
+  /* V0.2.8 (07.09.2003):
+
+     Removing the icon page isn't that easy because if doing so we lose the major tab
+     and the details page will become a second background page.
+     So in wpAddFolderView3Page() we set a flag in the instance data telling us here
+     from where we are coming. The BKA_MAJOR style bit is switched on so
+     a tab is displayed.
+     This is only part of the solution because normaly there's no name for
+     the details view page. So a string must be loaded and inserted into the
+     ppageinfo.
+
+   */
+  if(ulPrivFlags & MFLDR_CURACTION_ADDFOLDERVIEW3) /* Check if called from wpAddFolderView3Page() */
+    {
+      char chr[50]="~View";
+
+      /* Get title for the page */
+      getMessage(chr, IDSTR_VIEWPAGENAME, sizeof(chr), queryResModuleHandle(), hwndNotebook);
+
+      ppageinfo->usPageStyleFlags|=BKA_MAJOR;  /* Switch on major tab                         */
+      ppageinfo->pszName=chr;
+    }
+  /*
+
+    Climb up the list of parents to make sure we call the right
+    method if the parent was replaced. Otherwise we may skip a replacement class
+    and call CWProgFolder directly.
+
+    */
+  if((mySomId=somIdFromString("wpInsertSettingsPage"))!=NULLHANDLE) {
+	ULONG rc;
+    rc=((somTD_WPObject_wpInsertSettingsPage)
+        somParentNumResolve(__ClassObject->somGetPClsMtabs(),
+                            1,
+                            __ClassObject->
+                            somGetMethodToken(mySomId))
+        )(this, hwndNotebook, ppageinfo);
+    SOMFree(mySomId);
+    return rc;
+  }
+  else
+    return CWProgFolder::wpInsertSettingsPage(hwndNotebook, ppageinfo);
+}
+
+/**************************************************************/
+/* Override function: Add the 'About' and the 'Compact' menu  */
+/*                     items.                                 */
+/**************************************************************/
+BOOL CWMediaFolder::wpMenuItemSelected(HWND hwndFrame,ULONG ulMenuId)
+{
+  BOOL rcParent;
+  int tid;
+
+  switch(ulMenuId)
+    {
+      //#ifndef ECS
+    case ID_ABOUTITEM:
+      tid=_beginthread(aboutThreadFunc,NULL,8192*8,this); //Fehlerbehandlung fehlt
+      return TRUE;
+      //#endif
+    case ID_MEDIAFLDHELP: {
+      STARTDATA SData;
+      ULONG ulSessID;
+      PID pid;
+      CHAR chrBuffer[CCHMAXPATH];
+      CHAR PgmInputs[500];
+      CHAR chrTitle[40];
+      M_CWMediaFolder*  MedFldr = new M_CWMediaFolder;
+
+      getMessage(chrTitle, IDSTR_TITLEMEDIAFOLDER,sizeof(chrTitle), queryResModuleHandle(), HWND_DESKTOP);
+      MedFldr->wpclsQueryDefaultHelp(0, chrBuffer);
+      strcpy(PgmInputs, chrBuffer);
+      strcat(PgmInputs, " \"");
+      strcat(PgmInputs, chrTitle);
+      strcat(PgmInputs, "\"");
+      memset(&SData, 0, sizeof(SData));
+      SData.Length = sizeof(SData);
+      SData.Related = SSF_RELATED_INDEPENDENT;
+      SData.FgBg = SSF_FGBG_FORE;
+      SData.TraceOpt = SSF_TRACEOPT_NONE;
+      SData.InheritOpt = SSF_INHERTOPT_SHELL;
+      SData.PgmControl = SSF_CONTROL_VISIBLE;
+      SData.SessionType = SSF_TYPE_DEFAULT;
+      SData.PgmInputs = PgmInputs;
+      SData.PgmName = "view.exe";
+
+      DosStartSession(&SData, &ulSessID, &pid);
+      delete MedFldr;
+      return TRUE;
+    }
+    case ID_M3ULISTHELP: {
+      STARTDATA SData;
+      ULONG ulSessID;
+      PID pid;
+      CHAR chrBuffer[CCHMAXPATH];
+      CHAR PgmInputs[500];
+      CHAR chrTitle[40];
+      M_CWMediaFolder*  MedFldr = new M_CWMediaFolder;
+
+      getMessage(chrTitle, IDSTR_PLAYLISTVIEWTITLE,sizeof(chrTitle), queryResModuleHandle(), HWND_DESKTOP);
+      MedFldr->wpclsQueryDefaultHelp(0, chrBuffer);
+      strcpy(PgmInputs, chrBuffer);
+      strcat(PgmInputs, " \"");
+      strcat(PgmInputs, chrTitle);
+      strcat(PgmInputs, "\"");
+      memset(&SData, 0, sizeof(SData));
+      SData.Length = sizeof(SData);
+      SData.Related = SSF_RELATED_INDEPENDENT;
+      SData.FgBg = SSF_FGBG_FORE;
+      SData.TraceOpt = SSF_TRACEOPT_NONE;
+      SData.InheritOpt = SSF_INHERTOPT_SHELL;
+      SData.PgmControl = SSF_CONTROL_VISIBLE;
+      SData.SessionType = SSF_TYPE_DEFAULT;
+      SData.PgmInputs = PgmInputs;
+      SData.PgmName = "view.exe";
+
+      DosStartSession(&SData, &ulSessID, &pid);
+      delete MedFldr;
+      return TRUE;
+    }
+    case 0x2ce: /* Detail view */
+      /* Call parent */
+#if 0
+      if(cwUnshrinkFolder(hwndFrame))
+        ulPrivFlags&=MFLDR_CHANGING_VIEW; /* Mark that we are changing views.
+                                             This flag is checked in CWCDFldr::wpRefresh() to know if it's
+                                             necessary to reinsert the tracks */
+#endif
+      rcParent=CWProgFolder::wpMenuItemSelected(hwndFrame, ulMenuId);
+      cwUnshrinkFolder(hwndFrame);
+      ulPrivFlags&= ~MFLDR_VIEW_COMPACT;
+      return rcParent;
+    case ID_MENUVIEWCOMPACT: /* Compact view */
+      if(cwShrinkFolderToCompact(hwndFrame)) {
+        /* Mark that we are in compact view. May be removed later when 'Compact'
+           is an 'official' view?
+           */
+        ulPrivFlags|=MFLDR_VIEW_COMPACT;
+      }
+      return TRUE;
+    default:
+      break;
+    }
+
+  /* Call parent */
+  rcParent=CWProgFolder::wpMenuItemSelected(hwndFrame, ulMenuId);
+  return rcParent;
+}
+
+/************************************************/
+/* Override function: Add the 'About' and the   */
+/*                    'Compact' menu items.     */
+/************************************************/
+BOOL CWMediaFolder::wpModifyPopupMenu(HWND hwndMenu, HWND hwndCnr, ULONG ulPosition)
+{
+  HMODULE hResource=queryResModuleHandle();
+
+  if(hResource) {
+    //#ifndef ECS
+    /* Insert the 'About'-Item */
+     wpInsertPopupMenuItems(hwndMenu,-1,hResource,ID_MENUABOUT,WPMENUID_HELP);
+     //#endif
+
+     /* Insert the new 'Compact' view item but only if folder not already in compact view.
+        By doing that the 'compact' menu item doesn't show in the Sysmenu of the folder when
+        folder is shrinked.
+        */
+     if(!(cwQueryMFldrFlags() & MFLDR_VIEW_COMPACT))
+       wpInsertPopupMenuItems(hwndMenu,1,hResource, ID_MENUVIEWCOMPACT, MENUID_VIEW);
+  }
+  return CWProgFolder::wpModifyPopupMenu( hwndMenu, hwndCnr, ulPosition);
+}
+
+/************************************************/
+/* Override function: Remove the tree view open */
+/*                    item from the menu.       */
+/************************************************/
+ULONG CWMediaFolder::wpFilterPopupMenu(ULONG ulFlags, HWND hwndCnr, BOOL fMultiSelect)
+{
+  somId mySomId;
+
+  /* V0.2.8 (07.09.2003):
+     Removed icon view item form menu. Icon view is no longer supported by
+     the media folder.
+
+     Changed to climb up the list of parents to make sure we call the right
+     method if the parent was replaced. Otherwise we may skip a replacement class
+     and call CWProgFolder directly.
+
+     */
+  if((mySomId=somIdFromString("wpFilterPopupMenu"))!=NULLHANDLE) {
+	ULONG rc;
+    rc=((somTD_WPObject_wpFilterPopupMenu)
+        somParentNumResolve(__ClassObject->somGetPClsMtabs(),
+                            1,
+                            __ClassObject->
+                            somGetMethodToken(mySomId))
+        )(this, ulFlags, hwndCnr, fMultiSelect);
+    SOMFree(mySomId);
+    return rc & ~( CTXT_TREE | CTXT_ICON);
+  }
+  else
+    return CWProgFolder::wpFilterPopupMenu( ulFlags, hwndCnr, fMultiSelect) & ~( CTXT_TREE | CTXT_ICON);
+}
+
+//#if 0
+BOOL CWMediaFolder::wpRefresh(ULONG ulView, PVOID pReserved)
+{
+  somId mySomId;
+  ULONG rc;
+
+    if((mySomId=somIdFromString("wpRefresh"))!=NULLHANDLE) {
+      rc=((somTD_WPFileSystem_wpRefresh)
+          somParentNumResolve(__ClassObject->somGetPClsMtabs(),
+                              1,
+                              __ClassObject->
+                              somGetMethodToken(mySomId))
+          )(this, ulView,pReserved);
+      SOMFree(mySomId);
+    }
+    else
+      rc=CWProgFolder::wpRefresh(ulView, pReserved);
+
+    /* Start timer which triggers time calculation */
+    WinStartTimer(WinQueryAnchorBlock(hwndBottom),hwndBottom, IDTIMER_STATUS, 300);
+    return rc;
+}
+//#endif
+
+BOOL CWMediaFolder::wpAddSettingsPages(HWND hwndNotebook)
+{
+	ULONG rc;
+    somId mySomId;
+
+    if((mySomId=somIdFromString("wpAddSettingsPages"))!=NULLHANDLE) {
+      rc=((somTD_WPObject_wpAddSettingsPages)
+          somParentNumResolve(__ClassObject->somGetPClsMtabs(),
+                              1,
+                              __ClassObject->
+                              somGetMethodToken(mySomId))
+          )(this,hwndNotebook);
+      SOMFree(mySomId);
+    }
+    else
+      rc=CWProgFolder::wpAddSettingsPages(hwndNotebook);
+
+    if(!queryResModuleHandle()) {
+      errorResource();
+      return rc;
+    }
+    return(rc/* && cwAddToolbarOptionPage(hwndNotebook)*/);
+}
+
+
+MRESULT CWMediaFolder::wpDragOver(HWND hwndCnr,PDRAGINFO pDragInfo)
+{
+  WPObject *wpObject;
+  USHORT usIndicator=DOR_DROP,usOp=DO_LINK;
+  SOMClass *mmAudioClass = somhlpGetSomClass("MMAudio");
+  SOMClass *cdTrackClass = somhlpGetSomClass("MMCDTrack");
+
+  if (DrgAccessDraginfo(pDragInfo)) {
+     ULONG ulNum=DrgQueryDragitemCount(pDragInfo);/* Num items */
+     ULONG a=0;
+
+     for(a=0;a<ulNum; a++)
+       {
+         PDRAGITEM pDragItem = DrgQueryDragitemPtr(pDragInfo,a);
+         if (!DrgVerifyRMF(pDragItem,"DRM_OBJECT","DRF_OBJECT")) {
+            usIndicator = DOR_NEVERDROP;
+            usOp = 0;
+            goto quit;
+         } /* endif */
+         /* Check every object dragged */
+         wpObject=(WPObject*)OBJECT_FROM_PREC(pDragItem->ulItemID);
+         if (!somIsObj(wpObject) || !wpObject->somIsA(mmAudioClass) || wpObject->somIsA(cdTrackClass)) {
+            usIndicator = DOR_NEVERDROP;
+            usOp = 0;
+            goto quit;
+         } /* endif */
+#if 0
+         if (somIsObj(wpObject) && this->wpQueryFolder() == wpObject->wpQueryFolder()) {
+            usIndicator = DOR_DROP;
+            usOp = DO_LINK;
+         } /* endif */
+#endif
+       }
+     /* Do not create shadows if the source is the current container */
+     if(hwndCnr==pDragInfo->hwndSource) {
+        usIndicator = DOR_DROP;
+        usOp = DO_MOVE;
+     }
+
+quit:
+     DrgFreeDraginfo(pDragInfo);
+  } /* endif */
+
+  return MRFROM2SHORT(usIndicator,usOp);
+}
+
+void _Optlink dropThreadFunc (void *arg)
+{
+  HAB  hab;
+  HMQ  hmq;
+  QMSG qmsg;
+  PDROPTHREADPARAMS threadParams;
+  CWMediaFolder *thisPtr;
+  MMAudio* cwAudio;
+  HWND hwndCnr;
+
+  threadParams=(PDROPTHREADPARAMS) arg;
+  if(!threadParams)
+    return;
+  thisPtr=(CWMediaFolder*)threadParams->thisPtr;    //Pointer auf CWMediaFolder-Object
+
+  if(!somIsObj(thisPtr))
+    return;
+
+  if(thisPtr->mfData)
+    thisPtr->mfData->bProcessing=TRUE;
+
+  hab=WinInitialize(0);
+  if(hab) {
+    hmq=WinCreateMsgQueue(hab,0);
+    if(hmq) {
+      WPObject *wpObject;
+      somId mySomId;
+      M_WPObject *mAudioObject;
+      SOMClass*  scCWShadowClass;
+      ULONG ulCount;
+      ULONG ulNumObjects;
+      /* Needed for specifying the drop point */
+      POINTL ptl;
+      PMINIRECORDCORE pmrc;
+      CNRINFO cnrInfo;
+      int ID;
+      HWND hwndSource;
+
+      hwndCnr=threadParams->hwndCnr;
+
+      /* The objects are already checked by the wpDragOver() method. */
+
+      TRY_LOUD(MEDIAFLDR_DROP_THREAD) {
+        hwndSource=threadParams->hwndSource;
+        ulNumObjects=threadParams->ulNumObjects;
+
+        if((mySomId=somIdFromString(SHADOW_CLASS_NAME))!=NULLHANDLE) {
+          WPFileSystem *wpFSObject;
+          /* Get the CWAudioShadow class object */
+          scCWShadowClass=(SOMClass*)SOMClassMgrObject->somClassFromId(mySomId);
+          SOMFree(mySomId);
+          /* Check shadow class */
+          if(somIsObj(scCWShadowClass)) {
+            if(hwndSource!=hwndCnr){/* Dropped on white space of an open folder */
+              QUERYRECFROMRECT qRecRcl;
+              ptl.x=threadParams->ptl.x;
+              ptl.y=threadParams->ptl.y;
+
+              /* Map to CNR */
+              WinMapWindowPoints(HWND_DESKTOP, hwndCnr,&ptl, 1);
+              ptl.y+=10;
+              /* Window below the mouse ptr. We need it to check if we are over the column title area. */
+              ID=WinQueryWindowUShort(WinWindowFromPoint(hwndCnr,&ptl, TRUE),QWS_ID);
+              ptl.y-=10;
+
+              /* Find the record near the drop point */
+              qRecRcl.cb=sizeof(qRecRcl);
+              qRecRcl.rect.yBottom=ptl.y-10;
+              qRecRcl.rect.yTop=ptl.y;
+              qRecRcl.rect.xLeft=ptl.x;
+              qRecRcl.rect.xRight=ptl.x+10;
+              qRecRcl.fsSearch=CMA_PARTIAL|CMA_ITEMORDER;
+              pmrc=(PMINIRECORDCORE)WinSendMsg(hwndCnr, CM_QUERYRECORDFROMRECT,MPFROMLONG(CMA_FIRST),
+                                               MPFROMP(&qRecRcl));
+              WinSendMsg(hwndCnr, CM_QUERYCNRINFO, MPFROMP(&cnrInfo), MPFROMSHORT(sizeof(cnrInfo)));
+            }/*if(hwndSource!=hwndCnr)*/
+
+            /* For all dropped objects */
+            for(ulCount=0; ulCount<ulNumObjects; ulCount++) {
+              if(ulCount%10)/* Redraw window every 10 objects */
+                WinEnableWindowUpdate(hwndCnr, FALSE);
+              else
+                WinEnableWindowUpdate(hwndCnr, TRUE);
+
+              wpObject=(WPObject*) threadParams->wpObject[ulCount];
+              /* Get the filesystem object in case it's a shadow */
+              wpFSObject=(WPFileSystem*)thisPtr->cwGetFileSystemObject(wpObject);
+              if(somIsObj(wpFSObject)){
+                if(hwndSource==hwndCnr)/* The folder is closed or dropped on the folder icon. */
+                  wpFSObject->wpCreateShadowObjectExt(thisPtr, FALSE, "", (M_WPObject*)scCWShadowClass);
+                else {
+                  /* Dropped on white space of the folder */
+                  WPObject *wpo;
+                  if(cnrInfo.flWindowAttr& CV_DETAIL)
+                    {
+                      /* Detailsview */
+                      RECORDINSERT recInsert;
+
+                      recInsert.cb=sizeof(recInsert);
+                      recInsert.pRecordParent=NULL;
+                      recInsert.fInvalidateRecord=TRUE;
+                      recInsert.zOrder=CMA_TOP;
+                      recInsert.cRecordsInsert=1;
+
+                      //     WinEnableWindowUpdate(hwndCnr, FALSE);
+                      /* Create the shadow */
+                      //   wpo=
+                      //wpFSObject->wpCreateShadowObject(thisPtr, FALSE);
+                      wpo=wpFSObject->wpCreateShadowObjectExt(thisPtr, FALSE, "",
+                                                              (M_WPObject*) scCWShadowClass);
+                      /* Move the record to the right position in the details view */
+                      if(somIsObj(wpo)) {
+                        wpo->wpCnrRemoveObject(hwndCnr);
+                        //  WinEnableWindowUpdate(hwndCnr, TRUE);
+                        if(pmrc && ((int)pmrc)!=-1) {
+                          recInsert.pRecordOrder=(PRECORDCORE)pmrc;
+                          /* Insert at the right place. For some reason wpSetNextIconPos() does not work!? */
+                          wpo->wpCnrInsertObject(hwndCnr, &ptl, NULL, &recInsert);
+                        }
+                        else {
+                          /* No record found check if we are at the top or the bottom */
+                          if(ID!=0x7ff0 && ID!=0x7ff1)
+                            recInsert.pRecordOrder=(PRECORDCORE)CMA_END;
+                          else
+                            recInsert.pRecordOrder=(PRECORDCORE)CMA_FIRST;
+                          /* Insert at the right place. For some reason wpSetNextIconPos() does not work!? */
+                          wpo->wpCnrInsertObject(hwndCnr, &ptl, NULL, &recInsert);
+                        }
+                      }/* if(somIsObj(wpo)) */
+                      //          WinEnableWindowUpdate(hwndCnr, TRUE);
+                    }/* if(cnrInfo.flWindowAttr& CV_DETAIL) */
+                  else
+                    /* Icon view */
+                    wpo=wpFSObject->wpCreateShadowObjectExt(thisPtr, FALSE, "", (M_WPObject*) scCWShadowClass);
+                  if(somIsObj(wpo))
+                    wpo->wpCnrRefreshDetails();
+                }/* else(hwndSource==hwndCnr) */
+              }/* if(somIsObj(wpFSObject)) */
+            }/* for(ulCount=0;ulCount<ulNumObjects ; ulCount++) */
+            WinEnableWindowUpdate(hwndCnr, TRUE);
+          }/* if(somIsObj(scCWShadowClass)) */
+        }/* if((mySomId=somIdFromString(SHADOW_CLASS_NAME))!=NULLHANDLE)*/
+      }/* Try */
+      CATCH(MEDIAFLDR_DROP_THREAD)
+        {
+          SysWriteToTrapLog("\nTrap occured in %s, file: %s, line %d.\n",
+                            __FUNCTION__, __FILE__, __LINE__);
+        } END_CATCH;
+
+        WinDestroyMsgQueue(hmq);
+    }
+    WinTerminate(hab);
+  }
+  if(thisPtr->mfData)
+    thisPtr->mfData->bProcessing=FALSE;
+
+  thisPtr->wpFreeMem((PBYTE)threadParams);
+}
+
+
+
+MRESULT CWMediaFolder::wpDrop(HWND hwndCnr,PDRAGINFO pDragInfo,PDRAGITEM pDragItem)
+{
+  if (DrgAccessDraginfo(pDragInfo)) {
+    /* The objects are already checked by the wpDragOver() method. */
+    TRY_LOUD(MEDIAFLDR_DROP) {
+       PDROPTHREADPARAMS pThreadParams;
+       ULONG ulErr;
+       ULONG ulCount;
+       ULONG ulNumObjects=DrgQueryDragitemCount(pDragInfo);
+
+       /* DROPTHREADPARAMS already contains one WPObject var so only memory for ulNumObjects-1 must be added to the end */
+       pThreadParams=(PDROPTHREADPARAMS)wpAllocMem(sizeof(DROPTHREADPARAMS)+(ulNumObjects-1)*sizeof(WPObject*), &ulErr);
+       pThreadParams->hwndCnr=hwndCnr;
+       pThreadParams->hwndSource=pDragInfo->hwndSource;
+       pThreadParams->ulNumObjects=ulNumObjects;
+       pThreadParams->thisPtr=this;
+       pThreadParams->ptl.x=pDragInfo->xDrop;
+       pThreadParams->ptl.y=pDragInfo->yDrop;
+
+       /* For all dropped objects */
+       for(ulCount=0;ulCount<ulNumObjects ; ulCount++) {
+         pThreadParams->wpObject[ulCount]=(WPObject*)OBJECT_FROM_PREC(DrgQueryDragitemPtr( pDragInfo, ulCount)->ulItemID);
+       }
+       _beginthread(dropThreadFunc,NULL,8192*16,(void*)pThreadParams); //Fehlerbehandlung fehlt
+    }
+    CATCH(MEDIAFLDR_DROP)
+    {
+       SysWriteToTrapLog("\nTrap occured in %s, file: %s, around line %d.\n",
+                         __FUNCTION__, __FILE__, __LINE__);
+    } END_CATCH;
+    DrgFreeDraginfo(pDragInfo);
+  }
+  return MRFROMLONG(RC_DROP_DROPCOMPLETE);
+}
+
+
+BOOL CWMediaFolder::wpSaveState()
+{
+
+  wpSaveLong("CWMediaFolder", KEY_VOLUME, ulVolume);
+  //  wpSaveData("CWMediaFolder", KEY_FLYBACKGROUND, (PBYTE)&rgbTBFlyBackground, sizeof(RGB));
+  //  wpSaveData("CWMediaFolder", KEY_FLYFOREGROUND, (PBYTE)&rgbTBFlyForeground,sizeof(RGB));
+  //  wpSaveString("CWMediaFolder", KEY_FLYFONT, (PBYTE)&chrTBFlyFontName);
+  //  wpSaveLong("CWMediaFolder", KEY_FLYENABLED,bTBFlyOverEnabled);
+  //  wpSaveLong("CWMediaFolder", KEY_FLYDELAY,iTBFlyOverDelay);
+  wpSaveLong("CWMediaFolder", KEY_FLAGS, ulFlags);
+  wpSaveLong("CWMediaFolder", KEY_DISPLAYTYPE, (LONG)usWhichDisplay);
+  if(mfData)
+    wpSaveString("CWMediaFolder", KEY_PLAYTIMEFONT, (PBYTE)&mfData->chrPlayTimeFont);
+  return CWProgFolder::wpSaveState();
+}
+
+BOOL CWMediaFolder::wpRestoreState(ULONG ulReserved)
+{
+  ULONG dataSize;
+  ULONG ulActionButtons;
+
+
+  if(!wpRestoreLong("CWMediaFolder", KEY_VOLUME, &ulVolume))
+    ulVolume=75;
+#if 0
+  if(!wpRestoreLong("CWMediaFolder", KEY_FLYENABLED,&bTBFlyOverEnabled))
+    bTBFlyOverEnabled=1;
+  if(!wpRestoreLong("CWMediaFolder", KEY_FLYDELAY,(PULONG)&iTBFlyOverDelay))
+    iTBFlyOverDelay=250;
+#endif
+  if(!wpRestoreLong("CWMediaFolder", KEY_FLAGS,(PULONG)&ulFlags))
+    ulFlags=0;
+  if(!wpRestoreLong("CWMediaFolder", KEY_DISPLAYTYPE,(PULONG)&dataSize))
+    usWhichDisplay=0;
+  else
+    usWhichDisplay=(USHORT)dataSize;
+
+#if 0
+  dataSize=sizeof(RGB);
+  if(!wpRestoreData("CWMediaFolder", KEY_FLYBACKGROUND,(PBYTE)&rgbTBFlyBackground,&dataSize)) {
+    rgbTBFlyBackground.bBlue=180;
+    rgbTBFlyBackground.bGreen=255;
+    rgbTBFlyBackground.bRed=255;
+  }
+
+  dataSize=sizeof(RGB);
+  if(!wpRestoreData("CWMediaFolder",KEY_FLYFOREGROUND,(PBYTE)&rgbTBFlyForeground,&dataSize)) {
+    rgbTBFlyForeground.bRed=0;
+    rgbTBFlyForeground.bGreen=0;
+    rgbTBFlyForeground.bBlue=0;
+  }
+
+  memset(chrTBFlyFontName,0,sizeof(chrTBFlyFontName));	
+  dataSize=sizeof(chrTBFlyFontName);
+  if(!wpRestoreString("CWMediaFolder",KEY_FLYFONT,(PBYTE)&chrTBFlyFontName,&dataSize))
+    memcpy(&chrTBFlyFontName,"8.Helv",sizeof("8.Helv"));
+#endif
+
+  if(mfData)
+    {
+      dataSize=sizeof(mfData->chrPlayTimeFont);
+      wpRestoreString("CWMediaFolder", KEY_PLAYTIMEFONT,(PBYTE)&mfData->chrPlayTimeFont, &dataSize);
+    }
+
+  return CWProgFolder::wpRestoreState(ulReserved);
+}
+
+
+BOOL CWMediaFolder::cwClose(HWND hwndFrame)
+{
+  char text[200];
+  char title[50];
+  HWND hwndOwner=HWND_DESKTOP;
+
+  /* Check if we currently play a song */
+  if(iWave && !(ulPrivFlags & MFLDR_SHOWING_MBOX)) {
+    LONG lDelay;
+
+#if 0
+    PVIEWITEM pViewItem;
+    int a=0;
+    /* Check if we close a settings view or a folder view. */
+    for(pViewItem=wpFindViewItem(VIEW_ANY, NULLHANDLE); pViewItem; pViewItem=wpFindViewItem(VIEW_ANY, pViewItem))
+      a+=1;
+    if(a!=1)
+      return TRUE;
+#endif
+
+    if(hwndFrame!=hwndMFldrFrame)
+      return TRUE;
+
+    if(WinIsWindow(WinQueryAnchorBlock(HWND_DESKTOP), hwndFrame))
+      hwndOwner=hwndFrame;
+
+    /* Start a timer which will cause the folder to close automatically after some time even
+       if the user doesn't click any button. Get the timeout from the INI file if available. */
+    if((lDelay=PrfQueryProfileInt(HINI_USERPROFILE, "CWMM", MFLDR_TIMER_DELAY_KEY, MFLDR_MBOX_TIMER_DELAY))
+       < MFLDR_MBOX_MIN_TIMER_DELAY)
+      lDelay=MFLDR_MBOX_MIN_TIMER_DELAY;
+
+    WinStartTimer(WinQueryAnchorBlock(HWND_DESKTOP), hwndFrame, MFLDR_MBOX_TIMER_ID, lDelay);
+    ulPrivFlags|= MFLDR_SHOWING_MBOX;
+    /* Ask user if he really wants to stop playing and close the folder */
+    if(messageBox( text, IDSTR_CLOSETEXT, sizeof(text),
+                   title, IDSTR_CLOSETITLE, sizeof(title),
+                   queryResModuleHandle(), hwndOwner, MB_YESNO|MB_MOVEABLE|MB_ICONQUESTION)==MBID_NO) {
+      WinStopTimer(WinQueryAnchorBlock(HWND_DESKTOP), hwndFrame, MFLDR_MBOX_TIMER_ID);
+      ulPrivFlags&= ~MFLDR_SHOWING_MBOX;
+      return FALSE;
+    }
+  }
+  cwStopAudioFile(hwndFrame);
+  /* Stop the playing thread */
+  WinPostMsg(mfData->hwndPlayObject, WM_QUIT, 0, 0);
+
+  /* We were opened by an M3U file. Notify it that we're closing */
+  if(WinIsWindow(WinQueryAnchorBlock(HWND_DESKTOP), hwndObject)) {
+    WinPostMsg(hwndObject, WM_APPTERMINATENOTIFY, 0, 0);
+  }
+
+  ulPrivFlags&= ~(MFLDR_VIEW_COMPACT|MFLDR_SHOWING_MBOX);
+  hwndMFldrFrame=NULL;
+  wpSaveDeferred();
+  return TRUE;
+}
+
+void CWMediaFolder::wpInitData()
+{
+  ULONG ulErr;
+  /*
+    FIXME:
+    This init call of the parent should be changed to allow replacement of
+    CWProgFolder.
+    */
+  CWProgFolder::wpInitData();
+  /* Get storage for private data. */
+  if((mfData=(PMEDIAFLDRDATA)wpAllocMem(sizeof(MEDIAFLDRDATA), &ulErr))!=NULLHANDLE)
+    memset((void*)mfData, 0, sizeof(MEDIAFLDRDATA));
+
+  ulPrivFlags=0;
+}
+
+void  CWMediaFolder::wpUnInitData()
+{
+  if(mfData)
+    wpFreeMem((PBYTE)mfData);
+
+  /*
+    FIXME:
+    This uninit call of the parent should be changed to allow replacement of
+    CWProgFolder.
+    */
+  CWProgFolder::wpUnInitData();
+}
+
+
+
+
+
Index: /tags/CWMM-0.3.0_GA/mediafolder/create_mfldr_def.CMD
===================================================================
--- /tags/CWMM-0.3.0_GA/mediafolder/create_mfldr_def.CMD	(revision 213)
+++ /tags/CWMM-0.3.0_GA/mediafolder/create_mfldr_def.CMD	(revision 213)
@@ -0,0 +1,74 @@
+/* */
+call RxFuncAdd 'SysLoadFuncs', 'RexxUtil', 'SysLoadFuncs'
+call SysLoadFuncs
+
+deffile=strip(ARG(1))
+if ARG(1)="" then deffile="tst.def"
+
+theVersion=VALUE("MMCLSVERSION", ,"OS2ENVIRONMENT")
+if theVersion="" THEN theVersion=0.0.0
+
+def="; mediafolder.def: DEF-file for mediafld.dll"||'0d'x||'0a'x
+def=def||";"||'0d'x||'0a'x
+def=def||";                    (C) Chris Wohlgemuth 2002-205 Netlabs CWMM Team 2023-"||WORD(DATE(), 3)  ||'0d'x||'0a'x
+def=def||";/*"||'0d'x||'0a'x
+def=def||"; * This program is free software; you can redistribute it and/or modify"||'0d'x||'0a'x
+def=def||"; * it under the terms of the GNU General Public License as published by"||'0d'x||'0a'x
+def=def||"; * the Free Software Foundation; either version 2, or (at your option)"||'0d'x||'0a'x
+def=def||"; * any later version."||'0d'x||'0a'x
+def=def||"; *"||'0d'x||'0a'x
+def=def||"; * This program is distributed in the hope that it will be useful,"||'0d'x||'0a'x
+def=def||"; * but WITHOUT ANY WARRANTY; without even the implied warranty of"||'0d'x||'0a'x
+def=def||"; * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the"||'0d'x||'0a'x
+def=def||"; * GNU General Public License for more details."||'0d'x||'0a'x
+def=def||"; *"||'0d'x||'0a'x
+def=def||"; * You should have received a copy of the GNU General Public License"||'0d'x||'0a'x
+def=def||"; * along with this program; see the file COPYING.  If not, write to"||'0d'x||'0a'x
+def=def||"; * the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA."||'0d'x||'0a'x
+def=def||"; */"||'0d'x||'0a'x
+def=def||";/*"||'0d'x||'0a'x
+
+def=def||'0d'x||'0a'x
+
+def=def||"LIBRARY MEDIAFLD INITINSTANCE TERMINSTANCE"||'0d'x||'0a'x
+def=def||"DESCRIPTION '$@# Netlabs CWMM Team"
+def=def||":"||theVersion||" #@##1## "||DATE("E")||" "||TIME("N")||"       Zobopeep ::::"||WORD(TRANSLATE(theVersion," ", "."),3)||"::@@Media-Folder (C) C. Wohlgemuth 2001-2005 Netlabs CWMM Team 2023-"||WORD(DATE(),3)||"'"||'0d'x||'0a'x
+def=def||"DATA MULTIPLE NONSHARED"||'0d'x||'0a'x
+def=def||"EXPORTS  "||'0d'x||'0a'x
+def=def||"        CWMediaFolderClassData"||'0d'x||'0a'x
+def=def||"        CWMediaFolderCClassData"||'0d'x||'0a'x
+def=def||"        CWMediaFolderNewClass"||'0d'x||'0a'x
+def=def||""||'0d'x||'0a'x
+def=def||"        M_CWMediaFolderClassData"||'0d'x||'0a'x
+def=def||"        M_CWMediaFolderCClassData"||'0d'x||'0a'x
+def=def||"        M_CWMediaFolderNewClass"||'0d'x||'0a'x
+def=def||""||'0d'x||'0a'x
+def=def||"        CWAudioShadowClassData"||'0d'x||'0a'x
+def=def||"        CWAudioShadowCClassData"||'0d'x||'0a'x
+def=def||"        CWAudioShadowNewClass"||'0d'x||'0a'x
+def=def||""||'0d'x||'0a'x
+def=def||"        M_CWAudioShadowClassData"||'0d'x||'0a'x
+def=def||"        M_CWAudioShadowCClassData"||'0d'x||'0a'x
+def=def||"        M_CWAudioShadowNewClass"||'0d'x||'0a'x
+def=def||""||'0d'x||'0a'x
+def=def||"        CWCDFolderClassData"||'0d'x||'0a'x
+def=def||"        CWCDFolderCClassData"||'0d'x||'0a'x
+def=def||"        CWCDFolderNewClass"||'0d'x||'0a'x
+def=def||""||'0d'x||'0a'x
+def=def||"        M_CWCDFolderClassData"||'0d'x||'0a'x
+def=def||"        M_CWCDFolderCClassData"||'0d'x||'0a'x
+def=def||"        M_CWCDFolderNewClass"||'0d'x||'0a'x
+def=def||""||'0d'x||'0a'x
+def=def||"        CWM3UFolderClassData"||'0d'x||'0a'x
+def=def||"        CWM3UFolderCClassData"||'0d'x||'0a'x
+def=def||"        CWM3UFolderNewClass"||'0d'x||'0a'x
+def=def||""||'0d'x||'0a'x
+def=def||"        M_CWM3UFolderClassData"||'0d'x||'0a'x
+def=def||"        M_CWM3UFolderCClassData"||'0d'x||'0a'x
+def=def||"        M_CWM3UFolderNewClass"||'0d'x||'0a'x
+
+'@type NUL > 'deffile
+call lineout deffile,def
+call stream deffile, "C", "close"
+exit
+
Index: /tags/CWMM-0.3.0_GA/mediafolder/doc/FILE_ID.DIZ
===================================================================
--- /tags/CWMM-0.3.0_GA/mediafolder/doc/FILE_ID.DIZ	(revision 213)
+++ /tags/CWMM-0.3.0_GA/mediafolder/doc/FILE_ID.DIZ	(revision 213)
@@ -0,0 +1,17 @@
+Media-Folder V0.2.5
+(C) Chris Wohlgemuth 2002-2003
+http://www.geocities.com/SiliconValley/Sector/5785/
+http://www.os2world.com/cdwriting
+
+Media-Folder. Class to play any known audio file.
+Use shadows to create a playlist. ID3 display.
+Use it as your favorite MP3-player.
+CD player with FreeDB support.
+Playlist editor.
+
+Requires:	OS/2 Warp 4 or eCS, MMOS2 and EMX runtime
+
+Licence:
+This package is provided 'as is' for free.
+
+
Index: /tags/CWMM-0.3.0_GA/mediafolder/doc/FILE_ID.DIZ.full
===================================================================
--- /tags/CWMM-0.3.0_GA/mediafolder/doc/FILE_ID.DIZ.full	(revision 213)
+++ /tags/CWMM-0.3.0_GA/mediafolder/doc/FILE_ID.DIZ.full	(revision 213)
@@ -0,0 +1,27 @@
+CW-Multimedia classes V0.2.4
+(C) Chris Wohlgemuth 2001-2002
+http://www.geocities.com/SiliconValley/Sector/5785/
+http://www.os2world.com/cdwriting
+
+WPS classes for seamless integration of MP3 and OGG
+files into the WPS. Standard WPS audio menues like
+any other audio file.
+Information page in the settings notebook about audio
+characteristics.
+ID3 page for MP3 files for viewing and setting.
+Audio and ID3 information shown in details view.
+The classes were known as CW-audio-classes.
+
+Media-Folder class to play any known audio file.
+Use it as your favorite MP3-player.
+CD player with FreeDB support
+
+Requires:	OS/2 Warp 4 or eCS, MMOS2 and EMX runtime 09d fix4
+
+cw-mmclasses-0_2_2-ger.zip - german version
+cw-mmclasses-0_2_2-eng.zip - english version
+
+Licence:
+This package is provided 'as is' for free.
+
+
Index: /tags/CWMM-0.3.0_GA/mediafolder/doc/License
===================================================================
--- /tags/CWMM-0.3.0_GA/mediafolder/doc/License	(revision 213)
+++ /tags/CWMM-0.3.0_GA/mediafolder/doc/License	(revision 213)
@@ -0,0 +1,27 @@
+MMedia-classes 12.05.02
+-----------------------
+
+License
+--------
+
+Theses classes are free to use but
+copyrighted. Use them on your own
+risk. If they burn your house or
+destroy your data it's all your fault.
+
+ 
+Author
+------
+
+These classes are (C) 2001-2002 Chris Wohlgemuth.
+
+http://www.geocities.com/SiliconValley/Sector/5785/
+http://www.os2world.com/cdwriting
+
+
+Credits
+-------
+
+The graphics are (C) Klaus Staedtler-Przyborski. Thanks for
+fearless beta testing.
+
Index: /tags/CWMM-0.3.0_GA/mediafolder/doc/Liesmich.txt.full
===================================================================
--- /tags/CWMM-0.3.0_GA/mediafolder/doc/Liesmich.txt.full	(revision 213)
+++ /tags/CWMM-0.3.0_GA/mediafolder/doc/Liesmich.txt.full	(revision 213)
@@ -0,0 +1,144 @@
+1. MP3/Ogg Multimedia Audio-Klassen 12.05.02
+--------------------------------------------
+
+Diese Klassen sorgen fr eine nahtlose
+Integration der MMIO-Prozeduren von Russel O'Connor 
+fr MP3- und OGG-Dateien in die WPS. Download der
+DLLs unter:
+
+http://www.math.berkeley.edu/~roconnor/
+
+Nach Installation der Klassen verhalten sich Ogg- und
+MP3-Dateien auf der WPS wie alle anderen Audiodateien
+(z.B. Wavedateien). Sie haben ein eigenes Icon und die
+Mens der brigen Audiodateien. So startet z.B. ein
+Doppelklick die Wiedergabe ein weiterer stoppt sie.
+ber das 'Umsetzen'-Men knnen die Dateien einfach
+in Wavedateien umgesetzt werden.
+
+Zustzlich wird in die Eigenschaftendialoge aller
+Audiodateien eine Informationsseite ber die Datei
+eingefgt (Samplerate, Spieldauer etc.). Diese Daten
+erscheinen auch in der Detailansicht von Ordnern, wenn
+die Ansicht auf Klasse:CWAudio gesetzt wird.
+
+Im ffnen-Men ist zustzlich ein Eintrag fr Lautstrke.
+
+Bei MP3-Dateien lassen sich die ID3-Tags ber den
+Eigenschaftendialog anzeigen und verndern. Die ID3-Tags
+werden darberhinaus in der Detailansicht von Ordnern
+angezeigt.
+
+
+2. Media-Folder und Audio-Referenzen 12.05.02
+---------------------------------------------
+
+Der Media-Folder ist ein Spieler fr alle OS/2
+bekannten Audiodateien. Die blichen Bedienelemente
+sind vorhanden und Playlisten knnen einfach durch
+Fallenlassen von Audiodateien auf den Ordner erstellt
+werden.
+
+Es werden dabei Audio-Referenzen erstellt, die sich wie
+normale Referenzen verhalten aber die Details der
+Audiodateien in der Detailansicht des Media-Folders
+anzeigen.
+
+Ebenfalls enthalten ist ein WPS integrierter CD Spieler
+mit FreeDB-Untersttzung.
+
+
+Installation
+------------
+
+Das Archiv in einen Ordner entpacken und anschlieáend
+install.exe starten. Das Programm installiert die Klassen und
+nach einem WPS-Neustart stehen sie zur Verfgung.
+
+NICHT DIE DATEI install.INS FFNEN! ANDERNFALLS KNNTE
+EINE LTERE VERSION DES INSTALLERS VERWENDET WERDEN, FALLS
+DIESE INSTALLIERT IST.
+
+Evtl kann es erforderlich sein, unter Multimedia-
+Konfiguration Typen MP3 und OGG Digital Audio zuzuordnen
+und gleiches mit den Erweiterungen *MP3 und *.OGG zu tun,
+falls die Mens von Audiodateien nicht arbeiten, wie gewnscht.
+
+Das Skript setFolder.cmd setzt die Detailanzeige und das
+Sortierkriterium auf CWAudio, so daá die neuen Informationen
+in der Detailansicht und im Sortierenmen erscheinen. Einfach
+den jeweiligen Ordner auf das Skrip fallen lassen. 
+
+Das Skript setShadow.cmd setzt die Detailanzeige und das
+Sortierkriterium auf CWAudioShadow, so daá die neuen Informationen
+in der Detailansicht und im Sortierenmen auch bei Verwendung
+der neuen Referenzen erscheinen. Einfach den jeweiligen Ordner
+auf das Skrip fallen lassen. 
+
+Probleme
+--------
+
+Bei manchen VBR-MP3s wird die Spielzeit falsch angegeben. Dies
+ist ein Problem der MMIOMP3-Proc nicht der Klassen.
+
+
+Versionen
+---------
+
+0.1.0:
+
+-Erste ffentliche Version der Audioklassen.
+
+0.2.0
+
+-Mnemonic fr Lautstrke-Menpunkt ergnzt.
+-Die Audioklassen geben zustzlich den Typ 'Digital Audio' zurck.
+-Setzen des .TYPE EA, so daá der Digital Audio Spieler ohne weitere Maánahmen mit MP3/OGG Dateien funktioniert.
+-MP3-Daten werden in den EA gecached, damit das ffnen von Ordnern schneller geht.
+-ID3 Tags werden mit der richtigen Codepage angezeigt.
+
+-Neue Klassen CWMediaFolder und CWAudioShadow fr das Abspielen v on Audiodateien.
+
+V0.2.1
+
+-Repeat function added
+-new (and improved) sliders
+-Keyboard control added (not for sliders yet)
+-Display for elapsed time, remaining time and ID3 tags (click to switch)
+-Change playtime font by DnD
+-Drag and drop handling rewritten.
+-Statusline added
+-REXX interface added
+-No audio info reading for files on CD to speed up CD opening. 
+
+V0.2.2
+
+-CD player object with FreeDB support added.
+-Some minor fixes.
+
+
+Credits
+-------
+
+Die Icons und Graphiken sind (C) Klaus Staedtler-Przyborski. Vielen Dank auch
+fr furchtloses Betatesten.
+
+
+Lizenz
+------
+
+Diese Klassen drfen frei verwendet werden. Das Copyright verbleibt
+jedoch beim Author. Benutzung ausschlieálich auf eigene
+Gefahr. Es wird KEINE Verantwortung fr Datenverluste, Ehekrisen
+und sonstige unerfreuliche Ereignisse bernommen.
+
+ 
+Author
+------
+
+Diese Klassen sind (C) 2001-2002 Chris Wohlgemuth.
+
+http://www.geocities.com/SiliconValley/Sector/5785/
+http://www.os2world.com/cdwriting
+
+
Index: /tags/CWMM-0.3.0_GA/mediafolder/doc/Lizenz
===================================================================
--- /tags/CWMM-0.3.0_GA/mediafolder/doc/Lizenz	(revision 213)
+++ /tags/CWMM-0.3.0_GA/mediafolder/doc/Lizenz	(revision 213)
@@ -0,0 +1,27 @@
+Multimedia-Klassen 12.05.02
+----------------------------
+
+Lizenz
+------
+
+Diese Klassen drfen frei verwendet werden. Das Copyright verbleibt
+jedoch beim Author. Benutzung ausschlieálich auf eigene
+Gefahr. Es wird KEINE Verantwortung fr Datenverluste, Ehekrisen
+und sonstige unerfreuliche Ereignisse bernommen.
+
+ 
+Author
+------
+
+Diese Klassen sind (C) 2001 Chris Wohlgemuth.
+
+http://www.geocities.com/SiliconValley/Sector/5785/
+http://www.os2world.com/cdwriting
+
+
+Credits
+-------
+
+Die Graphiken sind (C) Klaus Staedtler-Przyborski. Vielen Dank auch
+fr furchtloses Betatesten.
+
Index: /tags/CWMM-0.3.0_GA/mediafolder/doc/Readme.eng
===================================================================
--- /tags/CWMM-0.3.0_GA/mediafolder/doc/Readme.eng	(revision 213)
+++ /tags/CWMM-0.3.0_GA/mediafolder/doc/Readme.eng	(revision 213)
@@ -0,0 +1,118 @@
+Media-Folder and Audio-Shadow 13.03.02
+--------------------------------------
+
+The Media-Folder serves as a player for any
+audio file known by OS/2. The usual play
+controls are available and you may create
+playlists just by dropping files into the folder.
+
+Audio files will not be put into the folder directly
+but shadows are created.
+A new shadow class shows you details information
+for the linked audio files in the details view of a
+Media-Folder.
+
+A WPS enabled CD player with FreeDB support is included.
+
+Installation
+------------
+
+Run the installation file MEDIAFLD.INS. This will start
+the Generic installer which must be installed on your system.
+
+The Generic Installer comes with Audio/Data-CD-Creator
+the CW-Multimedia classes and may be downloaded from
+
+http://www.os2world.com/cdwriting
+http://www.geocities.com/SiliconValley/Sector/5785/
+
+
+You have to restart the WPS so the changes can take effect.
+
+The command file setFolder.cmd sets the details and sort class of
+a folder to CWAudio so the new information is shown in the details
+view and the sort menu contains the new items. Just drop the folder
+in question on the script.
+
+The command file setShadow.cmd sets the details and sort class of
+a folder to CWAudioShadow so the new information is shown in the details
+view and the sort menu contains the new items when using the new
+Audio-shadows automatically created when dropping audio files on a
+Media-Folder. Just drop the folder in question on the script.
+
+Setup strings
+-------------
+
+The following setup strings are currently supported.
+
+MEDIAFLDRPLAY=1        start playing
+MEDIAFLDRSTOP=1        stop playing
+MEDIAFLDRNEXT=1        skip to next song
+MEDIAFLDRPREV=1        skip to previous song
+MEDIAFLDRVOLUME=xx     set volume to 0...100
+
+The object MUST be open when using these strings!
+
+
+Uninstallation
+--------------
+
+If you installed the classes using the Generic installer
+then use the installer to remove the classes.
+
+
+Known problems
+--------------
+
+The volume and position bars are a little bit flaky.
+The playtime may be not correct for some VBR-MP3s. This is a problem
+of the MMIOMP3-Proc not the classes.
+
+
+History
+-------
+
+V0.2.0 First public release
+
+-New classes CWMediaFolder and CWAudioShadow for playing of audio files.
+
+V0.2.1
+
+-Repeat function added
+-new (and improved) sliders
+-Keyboard control added (not for sliders yet)
+-Display for elapsed time, remaining time and ID3 tags (click to switch)
+-Change playtime font by DnD
+-Drag and drop handling rewritten.
+-Statusline added
+-REXX interface added
+
+V0.2.2
+
+-CD player object with FreeDB support added.
+-Some minor fixes.
+
+Credits
+-------
+
+The graphics are (C) Klaus Staedtler-Przyborski. Thanks for
+fearless beta testing.
+
+
+License
+--------
+
+Theses classes are free to use but copyrighted. Use them on your own
+risk. If they burn your house or destroy your data it's all your
+fault.
+
+ 
+Author
+------
+
+These classes are (C) 2001-2002 Chris Wohlgemuth.
+
+http://www.geocities.com/SiliconValley/Sector/5785/
+http://www.os2world.com/cdwriting
+
+
Index: /tags/CWMM-0.3.0_GA/mediafolder/doc/Readme.eng.full
===================================================================
--- /tags/CWMM-0.3.0_GA/mediafolder/doc/Readme.eng.full	(revision 213)
+++ /tags/CWMM-0.3.0_GA/mediafolder/doc/Readme.eng.full	(revision 213)
@@ -0,0 +1,141 @@
+1. MP3/Ogg multimedia audio-classes 12.05.02
+--------------------------------------------
+
+These classes are for seemless integration of the
+MMIO procedures for MP3 and OGG files written by
+Russel O'Connor.
+Get these procedures from:
+
+http://www.math.berkeley.edu/~roconnor/
+
+After installation Ogg- and MP3 files are treated the
+same way by the WPS as the other audio files. They have
+their own Icons and the same menus as for example
+wave files. A doubleclick starts playback another one
+stops it. The convert menu item helps you decoding the
+file to wave without any other program. 
+
+The settings notebook of every audio file gets a new
+page added describing the audio characteristics like
+playtime or samplerate. This data is also shown in the
+details view of folders if set to class:CWAudio.
+
+There's also a new open-item for volume.
+
+You may view and change the ID3 tags of MP3 files
+using the settings notebook. These tags are also shown
+in the details view.
+
+
+2. Media-Folder and Audio-Shadow 13.03.02
+-----------------------------------------
+
+The Media-Folder serves as a player for any
+audio file known by OS/2. The usual play
+controls are available and you may create
+playlists just by dropping files into the folder.
+
+Audio files will not be put into the folder directly
+but shadows are created.
+A new shadow class shows you details information
+for the linked audio files in the details view of a
+Media-Folder. A REXX interface is available if 
+WPS-wizard V0.2.0 or above is installed.
+
+A WPS enabled CD player with FreeDB support is included.
+
+Installation
+------------
+
+Put the contents of the archive into a directory and run
+install.exe which will copy the files and register the
+new classes.
+
+DON'T START *install.INS* TO MAKE SURE THE RIGHT INSTALLER
+IS USED IN CASE YOU HAVE AN OLDER VERSION ALREADY INSTALLED!
+
+You have to restart the WPS so the changes can take effect.
+
+Open the multimedia settings notebook and add the types MP3
+and OGGS to digital audio if the menus do not work as expected.
+It may be necessary to also add associations to *.MP3 and
+*.OGG files.
+
+The command file setFolder.cmd sets the details and sort class of
+a folder to CWAudio so the new information is shown in the details
+view and the sort menu contains the new items. Just drop the folder
+in question on the script.
+
+The command file setShadow.cmd sets the details and sort class of
+a folder to CWAudioShadow so the new information is shown in the details
+view and the sort menu contains the new items when using the new
+Audio-shadows automatically created when dropping audio files on a
+Media-Folder. Just drop the folder in question on the script.
+
+
+Uninstallation
+--------------
+
+Use the uninstall feature of the generic installer.
+
+Known problems
+--------------
+
+The playtime may be not correct for some VBR-MP3s. This is a problem
+of the MMIOMP3-Proc not the classes.
+
+
+History
+-------
+
+V0.1.0
+
+First release of the new audio classes.
+
+V0.2.0
+
+-Type 'Digital Audio' returned in addition to MP3/OGGS for the audio classes.
+-Setting of .TYPE EA so Digital Audio player works with MP3/OGG files without further fiddling
+-Caching of MP3 technical data in EAs to speed up folder opening.
+-ID3 data shown with the right codepage.
+-Mnemonic for Volume menu item.
+
+-New classes CWMediaFolder and CWAudioShadow for playing of audio files.
+
+V0.2.1
+
+-Repeat function added
+-new (and improved) sliders
+-Keyboard control added (not for sliders yet)
+-Display for elapsed time, remaining time and ID3 tags (click to switch)
+-Change playtime font by DnD
+-Drag and drop handling rewritten.
+-Statusline added
+-REXX interface added
+-No audio info reading for files on CD to speed up CD opening. 
+
+
+Credits
+-------
+
+The Icons and graphics are (C) Klaus Staedtler-Przyborski. Thanks for
+fearless beta testing.
+
+
+License
+--------
+
+Theses classes are free to use but copyrighted. Use them on your own
+risk. If they burn your house or destroy your data it's all your
+fault.
+
+ 
+Author
+------
+
+These classes are (C) 2001-2002 Chris Wohlgemuth.
+
+http://www.geocities.com/SiliconValley/Sector/5785/
+http://www.os2world.com/cdwriting
+
+
Index: /tags/CWMM-0.3.0_GA/mediafolder/doc/Readme.ger
===================================================================
--- /tags/CWMM-0.3.0_GA/mediafolder/doc/Readme.ger	(revision 213)
+++ /tags/CWMM-0.3.0_GA/mediafolder/doc/Readme.ger	(revision 213)
@@ -0,0 +1,116 @@
+Media-Folder und Audio-Referenzen 12.05.02
+------------------------------------------
+
+Der Media-Folder ist ein Spieler fr alle OS/2
+bekannten Audiodateien. Die blichen Bedienelemente
+sind vorhanden und Playlisten knnen einfach durch
+Fallenlassen von Audiodateien auf den Ordner erstellt
+werden.
+
+Es werden dabei Audio-Referenzen erstellt, die sich wie
+normale Referenzen verhalten aber die Details der
+Audiodateien in der Detailansicht des Media-Folders
+anzeigen.
+
+Ebenfalls enthalten ist ein WPS integrierter CD Spieler
+mit FreeDB-Untersttzung.
+
+Installation
+------------
+
+Die Datei MEDIAFLD.INS ffnen, die dadurch den
+Generic Installer startet.
+
+Dieser Installer kommt z.B. mit Audio/Data-CD-Creator
+und den CW-Multimedia Klassen. Er ist darberhinaus
+erhltlich unter
+
+http://www.os2world.com/cdwriting
+http://www.geocities.com/SiliconValley/Sector/5785/
+
+Die WPS muá nach der Installation neu gestartet werden.
+
+
+Das Skript setFolder.cmd setzt die Detailanzeige und das
+Sortierkriterium auf CWAudio, so daá die neuen Informationen
+in der Detailansicht und im Sortierenmen erscheinen. Einfach
+den jeweiligen Ordner auf das Skrip fallen lassen. 
+
+Das Skript setShadow.cmd setzt die Detailanzeige und das
+Sortierkriterium auf CWAudioShadow, so daá die neuen Informationen
+in der Detailansicht und im Sortierenmen auch bei Verwendung
+der neuen Referenzen erscheinen. Einfach den jeweiligen Ordner
+auf das Skrip fallen lassen. 
+
+
+Setupstrings
+-------------
+
+Die folgenden Setupstrings werden untersttzt.
+
+MEDIAFLDRPLAY=1        Wiedergabe starten
+MEDIAFLDRSTOP=1        Wiedergave stoppen
+MEDIAFLDRNEXT=1        Nchstes Stck
+MEDIAFLDRPREV=1        Vorheriges Stck
+MEDIAFLDRVOLUME=xx     Lautstrke (0...100)
+
+Der Media Player muá geffnet sein bei Benutzung dieser
+Strings!
+
+
+Probleme
+--------
+
+Der Lautstrke- und der Positionsregler sind noch nicht perfekt.
+Bei manchen VBR-MP3s wird die Spielzeit falsch angegeben. Dies
+ist ein Problem der MMIOMP3-Proc nicht der Klassen.
+
+
+Versionen
+---------
+
+0.2.0 Erste ffentliche Version
+
+-Neue Klassen CWMediaFolder und CWAudioShadow fr das Abspielen von Audiodateien.
+
+V0.2.1
+
+-Repeat function added
+-new (and improved) sliders
+-Keyboard control added (not for sliders yet)
+-Display for elapsed time, remaining time and ID3 tags (click to switch)
+-Change playtime font by DnD
+-Drag and drop handling rewritten.
+-Statusline added
+-REXX interface added
+
+V0.2.2
+
+-CD player object with FreeDB support added.
+-Some minor fixes.
+
+Credits
+-------
+
+Die Graphiken sind (C) Klaus Staedtler-Przyborski. Vielen Dank auch
+fr furchtloses Betatesten.
+
+
+Lizenz
+------
+
+Diese Klassen drfen frei verwendet werden. Das Copyright verbleibt
+jedoch beim Author. Benutzung ausschlieálich auf eigene
+Gefahr. Es wird KEINE Verantwortung fr Datenverluste, Ehekrisen
+und sonstige unerfreuliche Ereignisse bernommen.
+
+ 
+Author
+------
+
+Diese Klassen sind (C) 2001-2003 Chris Wohlgemuth.
+
+http://www.geocities.com/SiliconValley/Sector/5785/
+http://www.os2world.com/cdwriting
+
+
Index: /tags/CWMM-0.3.0_GA/mediafolder/include/SOMCLS.HH
===================================================================
--- /tags/CWMM-0.3.0_GA/mediafolder/include/SOMCLS.HH	(revision 213)
+++ /tags/CWMM-0.3.0_GA/mediafolder/include/SOMCLS.HH	(revision 213)
@@ -0,0 +1,543 @@
+#ifndef _DTS_HH_INCLUDED_somcls
+#define _DTS_HH_INCLUDED_somcls
+/* Start Class SOMClass */
+
+// This file was generated by the IBM "DirectToSOM" emitter for C++ (V1.77)
+// Generated at 05/01/95 01:53:19 EDT
+// This is class: SOMClass
+// Mangled class name: SOMClass
+// SE: May 19/94
+
+#include <som.hh>
+
+     #pragma SOMAsDefault(on)
+class SOMClass;
+     #pragma SOMAsDefault(pop)
+     #pragma SOMAsDefault(on)
+class SOMObject;
+     #pragma SOMAsDefault(pop)
+#include <somobj.hh>
+#pragma SOMNonDTS(on)
+
+#pragma SOMAsDefault(on)
+class SOMClass : public SOMObject {
+
+//
+//  This is the SOM metaclass.  That is, the instances of this class
+//  are class objects.  When the SOM environment is created an instance
+//  of SOMClass is created and a pointer to it is placed in the external
+//  data location (SOMClassClassData.classObject). Bindings provide the
+//  macro _SOMClass for this expression. _SOMClass is unique in that it
+//  is its own class object. I.e., _SOMClass == _somGetClass(_SOMClass).
+//  SOMClass can be subclassed just like any SOM class. The subclasses
+//  of SOMClass are new metaclasses and can generate class objects with
+//  different implementations than those produced by _SOMClass.
+//
+//  An important rule for metaclass programming is that no methods
+//  introduced by SOMClass should ever be overridden. While this
+//  limits the utility of metaclass programming in SOM, it guarantees
+//  that SOM will operate correctly. Special class frameworks may be
+//  available from IBM to alleviate this restriction.
+//
+
+	#pragma SOMClassName(*, "SOMClass")
+	#pragma SOMNoMangling(*)
+	#pragma SOMNonDTS(*)
+
+     #pragma SOMClassVersion (SOMClass, 1, 4)
+     #pragma SOMCallstyle (oidl)
+     #pragma SOMAsDefault(off)
+  public :
+     typedef struct {
+        unsigned long _maximum;
+	unsigned long _length;
+	somToken *_buffer;
+     } _IDL_SEQUENCE_somToken;
+     typedef /* seq<         0> */ _IDL_SEQUENCE_somToken somTokenSequence;
+     typedef struct {
+        unsigned long _maximum;
+	unsigned long _length;
+	SOMClass **_buffer;
+     } _IDL_SEQUENCE_SOMClass;
+     typedef /* seq<         0> */ _IDL_SEQUENCE_SOMClass SOMClassSequence;
+     
+     // a structure to describe a class-related offset
+     typedef struct somOffsetInfo {
+	      SOMClass* cls;
+	      long offset;
+     } somOffsetInfo;
+     typedef struct {
+        unsigned long _maximum;
+	unsigned long _length;
+	somOffsetInfo *_buffer;
+     } _IDL_SEQUENCE_somOffsetInfo;
+     typedef /* seq<         0> */ _IDL_SEQUENCE_somOffsetInfo somOffsets;
+     typedef struct {
+        unsigned long _maximum;
+	unsigned long _length;
+	somId *_buffer;
+     } _IDL_SEQUENCE_somId;
+     typedef /* seq<         0> */ _IDL_SEQUENCE_somId somIdSequence;
+     somOffsets somInstanceDataOffsets;
+
+     #pragma SOMAttribute(somInstanceDataOffsets, readonly, virtualaccessors, nodata)
+     #pragma SOMAsDefault(pop)
+     
+     // Uses SOMMalloc to allocate storage for a new instance of the
+     // receiving class, and then calls somRenewNoInitNoZero to load the
+     // new object's method table pointer. Then somDefaultInit is called to
+     // initialize the new object.  Note: If the instance is a class object,
+     // somInitMIClass must then be invoked to declare parents and
+     // initialize the class's instance method table. Upon failure, NULL
+     // is returned.
+     virtual SOMObject* somNew();
+     
+     // Equivalent to somNew except that somDefaultInit is not called.
+     virtual SOMObject* somNewNoInit();
+     
+     // Equivalent to somNew except that storage is not allocated.
+     // <obj> is taken as the address of the new object.
+     virtual SOMObject* somRenew(void* obj);
+     
+     // Equivalent to somRenew except that somDefaultInit is not called.
+     virtual SOMObject* somRenewNoInit(void* obj);
+     
+     // Equivalent to somRenew except that memory is not zeroed out.
+     virtual SOMObject* somRenewNoZero(void* obj);
+     
+     // The purpose of this method is to load an object's method table.
+     // The SOM API requires that somRenewNoInitNoZero always be
+     // called when creating a new object whose metaclass is not SOMClass.
+     // This is because metaclasses must be guaranteed that they can use
+     // somRenewNoInitNoZero to track object creation if this is desired.
+     virtual SOMObject* somRenewNoInitNoZero(void* obj);
+
+     string somAllocate(long size);
+     
+     // Allocates memory to hold an object and returns a pointer to this memory.
+     // This is a nonstatic method, and cannot be overridden. The default
+     // implementation calls SOMMalloc, but a class designer can specify a
+     // different implementation using the somallocate modifier in IDL. The
+     // allocator takes the same parameters as this method.
+
+     void somDeallocate(string memptr);
+     
+     // Zeros out the method table pointer stored in the word pointed to by
+     // memptr, and then deallocates the block of memory pointed to by memptr.
+     // This is a nonstatic method and cannot be overridden. The default
+     // deallocator called is SOMFree, but a class designer can specify a
+     // different deallocator using the somdeallocate modifier in IDL. The
+     // deallocator takes the same parameters as this method.
+     
+     // Loads a structure used to control calls to initializers.
+     // Computed when first requested (using the somDirectedInitClasses
+     // attribute) and then cached.
+     virtual somBooleanVector somGetInstanceInitMask(somInitCtrl* ctrl);
+     
+     // Loads a structure used to control calls to somDestruct.
+     // Computed at the same time as somInstanceConstructionMask
+     virtual somBooleanVector somGetInstanceDestructionMask(somDestructCtrl* ctrl);
+     
+     // Loads a structure used to control calls to assignment ops.
+     // Computed at the same time as somInstanceConstructionMask
+     virtual somBooleanVector somGetInstanceAssignmentMask(somAssignCtrl* ctrl);
+     
+     // somInitClass is obsolete, and should no longer be used. The SOM 2.0
+     // kernel provides special handling for redispatch stubs in the case
+     // of SOM 1.0 classes, and use of this method is what tells the kernel
+     // that old-style redispatch stubs will be registered.
+     virtual void somInitClass(string className, SOMClass* parentClass, 
+                               long dataSize, long maxStaticMethods, 
+                               long majorVersion, long minorVersion);
+     
+     // somInitMIClass implements the second phase of dynamic class creation:
+     // inheritance of interface and possibly implementation (instance
+     // variables) by suitable initialization of <self> (a class object).
+     //
+     // For somInitMIClass, the inherit_vars argument controls whether abstract
+     // or implementation inheritance is used. Inherit_vars is a 32 bit
+     // bit-vector. Implementation is inherited from parent i iff the bit
+     // 1<<i is on, or i>=32.
+     // On a class-by-class basis, for each class ancestor, implementation
+     // inheritance always takes precidence over abstract inheritance. This is
+     // necessary to guarantee that procedures supporting parent method calls
+     // (available on non-abstract parents) are always supported by parent
+     // instance variables.
+     //
+     // <className> is a string containing the class name. A copy is made, so
+     // the string may be freed upon return to the caller if this is desired.
+     //
+     // <parentClasses> is a SOMClassSequence containing pointers to the
+     // parent classes. somInitMIClass makes a copy of this, so it may
+     // be freed upon return to the caller if this is desired.
+     //
+     // <dataSize> is the space needed for the instance variables
+     // introduced by this class.
+     //
+     // <dataAlignment> specifies the desired byte alignment for instance
+     // data introduced by this class. A value of 0 selects a system-wide default;
+     // any other argument is taken as the desired byte alignment multiple. Thus,
+     // for example, even if a byte multiple of 8 is needed for double precision
+     // values on a given system (so 8 is the default), a class whose instance data
+     // doesn't require this can indicate otherwise. If A is the next memory
+     // address available for holding instance data, the address that will be
+     // used is A + (A mod byte-alignment).
+     //
+     // <maxStaticMethods> is the maximum number of static methods that will be
+     // added to the initialized class using addStaticMethod.
+     //
+     // <majorVersion> indicates the major version number for this
+     // implementation of the class definition, and <minorVersion>
+     // indicates the minor version number.
+     virtual void somInitMIClass(long inherit_vars, string className, 
+                                 SOMClassSequence* parentClasses, 
+                                 long dataSize, long dataAlignment, 
+                                 long maxStaticMethods, long majorVersion, 
+                                 long minorVersion);
+     
+     // Adds the indicated method, creating and returning a new method token.
+     //
+     // <methodDescriptor> is the somId for an identifier that can be used
+     // to access signature information about the method from an interface
+     // repository.
+     //
+     // <method> is the actual method procedure for this method
+     //
+     // <redispatchStub> is a procedure with the same calling sequence as
+     // <method> that invokes somDispatch for the method.
+     //
+     // <applyStub> is a procedure used to support somApply.
+     virtual somMToken somAddStaticMethod(somId methodId, somId methodDescriptor, 
+                                          somMethodPtr method, 
+                                          somMethodPtr redispatchStub, 
+                                          somMethodPtr applyStub);
+     
+     // Adds the indicated method to the class's name lookup list.
+     // If this happens to override a static method then this operation is
+     // equivalent to <somOverrideSMethod> and the <methodDescriptor> and
+     // <applyStub> arguments are ignored (the overridden method's values
+     // will be used).
+     //
+     // <methodDescriptor> is the somId of a string describing the calling
+     // sequence to this method as described in <somcGetNthMethodInfo>
+     // defined in the SOMObject class definition.
+     //
+     // <method> is the actual method procedure for this method
+     //
+     // <applyStub> is a procedure that takes a standard variable argument
+     // list data structure applies it to its target object by calling
+     // <method> with arguments derived from the data structure.  Its
+     // calling sequence is the same as the calling sequence of the
+     // dispatch methods defined in SOMObject.  This stub is used in the
+     // support of the dispatch methods used in some classes.  In classes
+     // where the dispatch functions do not need such a function this
+     // parameter may be null.
+     virtual void somAddDynamicMethod(somId methodId, somId methodDescriptor, 
+                                      somMethodPtr method, somMethodPtr applyStub);
+     
+     // This method can be used instead of <somAddStaticMethod> or
+     // <somAddDynamicMethod> when it is known that the class' parent
+     // class already supports this method.  This call does not require the
+     // method descriptor and stub methods that the others do.
+     virtual void somOverrideSMethod(somId methodId, somMethodPtr method);
+     
+     // This method is invoked when all of the static initialization for
+     // the class has been finished.  The default implementation simply
+     // registers the newly constructed class with the SOMClassMgr.
+     virtual void somClassReady();
+     
+     // Returns the apply stub associated with the specified method,
+     // if one exists; otherwise NULL is returned. This method is obsolete,
+     // and retained for binary compatability. In SOMr2, users never access
+     // apply stubs directly; The function somApply is used to invoke apply
+     // stubs. See somApply documentation for further information on apply
+     // stubs, and see somAddStaticMethod documentation for information
+     // on how apply stubs are registered by class implementations.
+     virtual somMethodPtr somGetApplyStub(somId methodId);
+     virtual somClassDataStructure* somGetClassData();
+     
+     // The class' pointer to the static <className>ClassData structure.
+     virtual void somSetClassData(somClassDataStructure* cds);
+     
+     // A pointer to the method table used by instances of this class. This
+     // method was misnamed; it should have been called somGetInstanceMtab.
+     virtual somMethodTab* somGetClassMtab();
+     
+     // Returns the offset of instance data introduced by the receiver in
+     // an instance of the receiver. This method is obsolete and not useful in
+     // multiple-inheritance situations. The attribute somInstanceDataOffsets
+     // replaces this method.
+     virtual long somGetInstanceOffset();
+     
+     // The size in bytes of the instance data introduced by the receiving
+     // class.
+     virtual long somGetInstancePartSize();
+     
+     // The total size of an instance of the receiving class.
+     virtual long somGetInstanceSize();
+     
+     // A data token that identifies the introduced portion of this class
+     // within itself or any derived class.  This token can be subsequently
+     // passed to the run-time somDataResolve function to locate the instance
+     // data introduced by this class in any object derived from this class.
+     virtual somDToken somGetInstanceToken();
+     
+     // Returns a data token that for the data member at offset
+     // "memberOffset" within the introduced portion of the class identified
+     // by instanceToken.  The instance token must have been obtained from a
+     // previous invocation of somGetInstanceToken.  The returned member
+     // token can be subsequently passed to the run-time somDataResolve
+     // function to locate the data member.
+     virtual somDToken somGetMemberToken(long memberOffset, somDToken instanceToken);
+     
+     // Sets the fields in the method descriptor block, <md>, to
+     // information about the method.  1 (true) is returned if the method is
+     // supported by this object and 0 (false) otherwise. The id field in
+     // the method descriptor block will also be set to NULL.
+     virtual boolean somGetMethodData(somId methodId, somMethodData* md);
+     
+     // Returns a redispatch stub for the indicated method, if possible.
+     // If not possible (because a valid redispatch stub has not been
+     // registered, and there is insufficient information to dynamically
+     // construct one), then a NULL is returned.
+     virtual somMethodProc* somGetRdStub(somId methodId);
+     
+     // Returns the method descriptor for the indicated method.	If
+     // this object does not support the indicated method then NULL is
+     // returned.
+     virtual somId somGetMethodDescriptor(somId methodId);
+     
+     // Returns the index for the specified method. (A number that may
+     // change if any methods are added or deleted to this class object or
+     // any of its ancestors).  This number is the basis for other calls to
+     // get info about the method. Indexes start at 0. A -1 is returned if
+     // the method cannot be found.
+     virtual long somGetMethodIndex(somId id);
+     
+     // Returns the specified method's access token. This token can then
+     // be passed to method resolution routines, which use the token
+     // to select a method pointer from a method table.
+     virtual somMToken somGetMethodToken(somId methodId);
+     
+     // This object's class name as a NULL terminated string.
+     virtual string somGetName();
+     
+     // loads *md with the method data associated with the the nth method,
+     // or NULL if there is no such method. Returns true is successful;
+     // false otherwise.
+     virtual boolean somGetNthMethodData(long n, somMethodData* md);
+     
+     // Returns the id of the <n>th method if one exists and NULL
+     // otherwise.
+     //
+     // The ordering of the methods is unpredictable, but will not change
+     // unless some change is made to the class or one of its ancestor classes.
+     //
+     // See CORBA documentation for info on method descriptors.
+     virtual somId somGetNthMethodInfo(long n, somId* descriptor);
+     
+     // The number of methods currently supported by this class,
+     // including inherited methods (both static and dynamic).
+     virtual long somGetNumMethods();
+     
+     // The number of static methods that this class has.  Can
+     // be used by a child class when initializing its method table.
+     virtual long somGetNumStaticMethods();
+     
+     // Returns the parent class of self (along its "left-hand" derivation
+     // path), if one exists and NULL otherwise.
+     virtual SOMClass* somGetParent();
+     
+     // The parent classes of self.
+     virtual SOMClassSequence somGetParents();
+     
+     // Returns a list of the method tables of this class's parent classes in the
+     // specific format required by somParentNumResolve (for making parent method
+     // calls. The first entry on the list is actually the method table of the
+     // receiving class. Because the CClassData structure contains this list, the
+     // method table for any class with a CClassData structure is statically
+     // available. This method now returns a list because older SI emitters load
+     // CClassData.parentMtab with the result of this call, and the new runtime
+     // requires a list of classes in that position.
+     virtual somMethodTabs somGetPClsMtab();
+     
+     // Returns a list of the method tables of this class's parent classes in the
+     // specific format required by somParentNumResolve (for making parent method
+     // calls. The first entry on the list is actually the method table of the
+     // receiving class. Because the CClassData structure contains this list, the
+     // method table for any class with a CClassData structure is statically
+     // available.
+     virtual somMethodTabs somGetPClsMtabs();
+     
+     // Returns the class' major and minor version numbers in the corresponding
+     // output parameters.
+     virtual void somGetVersionNumbers(long* majorVersion, long* minorVersion);
+     
+     // Sets the method descriptor given by <descriptor> for the method
+     // <methodId> into the method information kept by the receiving class.
+     // 1 (true) is returned if the method is supported by this object
+     // and 0 (false) otherwise.
+     virtual boolean somSetMethodDescriptor(somId methodId, somId descriptor);
+     
+     // Finds the method procedure associated with <methodId> for this
+     // class and sets <m> to it.  1 (true) is returned when the
+     // method procedure is a static method and 0 (false) is returned
+     // when the method procedure is dynamic method.
+     //
+     // If the class does not support the specified method then
+     // <m> is set to NULL and the return value is meaningless.
+     //
+     virtual boolean somFindMethod(somId methodId, somMethodPtr* m);
+     
+     // Just like <somFindMethod> except that if the method is not
+     // supported then an error is raised and execution is halted.
+     virtual boolean somFindMethodOk(somId methodId, somMethodPtr* m);
+     
+     // Finds the indicated method, which must be a static method supported
+     // by this class, and returns a pointer to its method procedure.
+     // If the method is not supported by the receiver (as a static method
+     // or at all) then a NULL pointer is returned.
+     virtual somMethodPtr somFindSMethod(somId methodId);
+     
+     // Uses <somFindSMethod>, and raises an error if the result is NULL.
+     virtual somMethodPtr somFindSMethodOk(somId methodId);
+     
+     // Like <somFindSMethodOK>, but without restriction to static methods.
+     virtual somMethodPtr somLookupMethod(somId methodId);
+     
+     // Returns 1 (true) if the implementation of this class is
+     // compatible with the specified major and minor version number and
+     // false (0) otherwise.  An implementation is compatible with the
+     // specified version numbers if it has the same major version number
+     // and a minor version number that is equal to or greater than
+     // <minorVersion>.	The major, minor version number pair (0,0) is
+     // considered to match any version.  This method is usually called
+     // immediately after creating the class object to verify that a
+     // dynamically loaded class definition is compatible with a using
+     // application.
+     virtual boolean somCheckVersion(long majorVersion, long minorVersion);
+     
+     // Returns 1 (true) if <self> is a descendent class of <aClassObj> and
+     // 0 (false) otherwise.  Note: a class object is considered to be
+     // descended itself for the purposes of this method.
+     virtual boolean somDescendedFrom(SOMClass* aClassObj);
+     
+     // Returns 1 (true) if the indicated method is supported by this
+     // class and 0 (false) otherwise.
+     virtual boolean somSupportsMethod(somId mId);
+     
+     // if the receiving class either introduces or overrides the
+     // indicated method, then its somMethodPtr is returned, otherwise
+     // NULL is returned.
+     virtual somMethodPtr somDefinedMethod(somMToken method);
+     
+     // Overrides the method table pointers to point to the redispatch stubs.
+     // All the methods except somDispatch methods are overriden.
+     virtual void somOverrideMtab();
+     
+     // The alignment required for the instance data structure
+     // introduced by the receiving class.
+     long somDataAlignment;
+
+     #pragma SOMAttribute(somDataAlignment, readonly, virtualaccessors)
+     
+     // The ancestors whose initializers the receiving
+     // class wants to directly invoke.
+     SOMClassSequence somDirectInitClasses;
+
+     #pragma SOMAttribute(somDirectInitClasses, virtualaccessors, noset)
+     
+     // The memory allocation routine used by somAllocate. Provided in this
+     // form to support array allocation.
+     somMethodProc *somClassAllocate;
+
+     #pragma SOMAttribute(somClassAllocate, readonly, virtualaccessors)
+     
+     // The memory allocation routine called by somDeallocate. Provided in
+     // this form to support array deallocation.
+     somMethodProc *somClassDeallocate;
+
+     #pragma SOMAttribute(somClassDeallocate, readonly, virtualaccessors)
+     #pragma SOMReleaseOrder ( \
+			      "somNew", \
+			      "somRenew", \
+			      "somInitClass", \
+			      "somClassReady", \
+			      "somGetName", \
+			      "somGetParent", \
+			      "somDescendedFrom", \
+			      "somCheckVersion", \
+			      "somFindMethod", \
+			      "somFindMethodOk", \
+			      "somSupportsMethod", \
+			      "somGetNumMethods", \
+			      "somGetInstanceSize", \
+			      "somGetInstanceOffset", \
+			      "somGetInstancePartSize", \
+			      "somGetMethodIndex", \
+			      "somGetNumStaticMethods", \
+			      "somGetPClsMtab", \
+			      "somGetClassMtab", \
+			      "somAddStaticMethod", \
+			      "somOverrideSMethod", \
+			      "somAddDynamicMethod", \
+			      *, \
+			      "somGetApplyStub", \
+			      "somFindSMethod", \
+			      "somFindSMethodOk", \
+			      "somGetMethodDescriptor", \
+			      "somGetNthMethodInfo", \
+			      "somSetClassData", \
+			      "somGetClassData", \
+			      "somNewNoInit", \
+			      "somRenewNoInit", \
+			      "somGetInstanceToken", \
+			      "somGetMemberToken", \
+			      "somSetMethodDescriptor", \
+			      "somGetMethodData", \
+			      "somOverrideMtab", \
+			      "somGetMethodToken", \
+			      "somGetParents", \
+			      "somGetPClsMtabs", \
+			      "somInitMIClass", \
+			      "somGetVersionNumbers", \
+			      "somLookupMethod", \
+			      "_get_somInstanceDataOffsets", \
+			      "somRenewNoZero", \
+			      "somRenewNoInitNoZero", \
+			      "somAllocate", \
+			      "somDeallocate", \
+			      "somGetRdStub", \
+			      "somGetNthMethodData", \
+			      *, \
+			      *, \
+			      "_get_somDirectInitClasses", \
+			      "_set_somDirectInitClasses", \
+			      "somGetInstanceInitMask", \
+			      "somGetInstanceDestructionMask", \
+			      *, \
+			      *, \
+			      *, \
+			      *, \
+			      *, \
+			      "somDefinedMethod", \
+			      *, \
+			      *, \
+			      *, \
+			      *, \
+			      *, \
+			      *, \
+			      *, \
+			      *, \
+			      "_get_somDataAlignment", \
+			      "somGetInstanceAssignmentMask", \
+			      *, \
+			      *, \
+			      "_get_somClassAllocate", \
+			      "_get_somClassDeallocate")
+};
+#pragma SOMAsDefault(pop)
+
+     #pragma SOMNonDTS(pop)
+/* End SOMClass */
+#endif /* _DTS_HH_INCLUDED_somcls */
Index: /tags/CWMM-0.3.0_GA/mediafolder/include/audioshadow.hh
===================================================================
--- /tags/CWMM-0.3.0_GA/mediafolder/include/audioshadow.hh	(revision 213)
+++ /tags/CWMM-0.3.0_GA/mediafolder/include/audioshadow.hh	(revision 213)
@@ -0,0 +1,147 @@
+/*
+ * This file is (C) Chris Wohlgemuth 2002
+ */
+/*
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; see the file COPYING.  If not, write to
+ * the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+#define INCL_DOS
+#define INCL_WIN
+#define INCL_GPIBITMAPS
+#include <os2.h>
+
+#define INCL_MCIOS2
+#include <os2me.h>
+
+
+#include "except.h"
+
+#define IDTIMER_PLAY  5L
+#define PLAYTIMER_DELAY 1000
+
+#define STATUS_LENGTH 200
+
+#define CWAUDIO_CLASS_NAME "MMAudio"
+
+#ifdef DEBUG
+    void writeDebugLog(char *text);
+#endif
+
+
+#pragma SOMAsDefault(on)
+#include <som.hh>
+#include <somcls.hh>
+#pragma SOMNoMangling(on)
+/*#include "progfolder.h"*/
+#include "wpshadow.hh"
+
+#pragma SOMAsDefault(off)
+typedef struct _MYVIEWITEM
+{
+  BOOL bIsInUseList;
+  USEITEM useItem;
+  VIEWITEM viewItem;
+}MYVIEWITEM; 
+
+typedef struct
+{
+  INT id;
+  RECTL rclSource;
+  HBITMAP hbmSource;
+  RECTL rclDest;
+}CONTROLINFO;
+
+typedef struct
+{
+  BITMAPINFOHEADER bmpInfoHdr;
+  HBITMAP hbm;
+}LOADEDBITMAP;
+
+
+#pragma SOMAsDefault(on)
+
+class M_CWAudioShadow:public M_WPShadow
+{
+/* The name of of the new class */
+#pragma SOMClassName(*,"M_CWAudioShadow")
+/* Required SOM version */
+#pragma SOMClassVersion(*,1,2)
+#pragma SOMCallstyle(oidl)
+public:
+  virtual PSZ  wpclsQueryTitle();
+  virtual ULONG wpclsQueryDetailsInfo( PCLASSFIELDINFO* ppClassFieldInfo, PULONG pSize);
+#if 0
+  virtual void wpclsInitData();
+  virtual	ULONG wpclsQueryIconData(PICONINFO pIconInfo);
+  virtual	ULONG wpclsQueryIconDataN(PICONINFO pIconInfo, ULONG ulIconIndex);
+  virtual void wpclsUnInitData();
+	virtual	ULONG wpclsQueryStyle();
+	virtual BOOL wpclsQueryDefaultHelp(PULONG HelpPanelId,PSZ HelpLibrary);
+  virtual BOOL wpclsCreateDefaultTemplates(WPObject * wpObject);
+#endif
+
+#pragma SOMReleaseOrder()
+#pragma SOMIDLPass(*,"Implementation-End","dllname = mediafld;")
+};
+
+class CWAudioShadow:public WPShadow
+{
+#pragma SOMClassName(*,"CWAudioShadow")
+#pragma SOMMetaClass(CWAudioShadow,"M_CWAudioShadow")
+#pragma SOMClassVersion(CWAudioShadow,1,2)
+#pragma SOMCallstyle(oidl)
+private:
+
+public:
+
+  virtual ULONG wpQueryDetailsData(PVOID* ppDetailsData, PULONG pcp);
+  //  virtual void wpInitData();
+#if 0
+  virtual BOOL wpMenuItemHelpSelected(ULONG MenuId);
+  virtual ULONG wpFilterPopupMenu(ULONG ulFlags, HWND hwndCnr, BOOL fMultiSelect);
+  virtual BOOL wpModifyPopupMenu(HWND hwndMenu, HWND hwndCnr, ULONG ulPosition);
+  virtual BOOL wpMenuItemSelected(HWND hwndFrame,ULONG ulMenuId);
+  virtual ULONG wpAddFolderView2Page(HWND hwndNotebook);
+  virtual MRESULT wpDragOver(HWND hwndCnr,PDRAGINFO pDragInfo);
+  virtual BOOL wpAddSettingsPages(HWND hwndNotebook);
+  virtual BOOL wpAddToContent(WPObject* Object);
+  virtual BOOL wpDeleteFromContent(WPObject* Object);
+  virtual BOOL cwIsWaveFile(WPObject* wpObject);
+  virtual ULONG cwSetWriteFlags(ULONG ulNewWriteFlags,ULONG ulMask);
+  virtual ULONG cwQueryWriteFlags();
+  virtual BOOL wpRestoreState(ULONG ulReserved);
+  virtual BOOL wpSaveState();
+  virtual MRESULT wpDragOver(HWND hwndCnr,PDRAGINFO pDragInfo);
+  virtual MRESULT wpDrop(HWND hwndCnr,PDRAGINFO pDragInfo,PDRAGITEM pDragItem);  
+#endif
+
+#pragma SOMReleaseOrder()
+
+#pragma SOMIDLPass(CWAudioShadow,"Implementation-End","dllname = mediafld;")
+};
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Index: /tags/CWMM-0.3.0_GA/mediafolder/include/cddb.h
===================================================================
--- /tags/CWMM-0.3.0_GA/mediafolder/include/cddb.h	(revision 213)
+++ /tags/CWMM-0.3.0_GA/mediafolder/include/cddb.h	(revision 213)
@@ -0,0 +1,10 @@
+typedef struct {
+  int  numTracks;
+  LONG startSector[100];
+  LONG discid;
+  int discLength;
+}CDDBINFO;
+
+#define MAXSERVERS 10
+
+
Index: /tags/CWMM-0.3.0_GA/mediafolder/include/cddb.hh
===================================================================
--- /tags/CWMM-0.3.0_GA/mediafolder/include/cddb.hh	(revision 213)
+++ /tags/CWMM-0.3.0_GA/mediafolder/include/cddb.hh	(revision 213)
@@ -0,0 +1,73 @@
+/*
+ * This file is (C) Chris Wohlgemuth 1999
+ */
+/*
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; see the file COPYING.  If not, write to
+ * the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+
+
+/* The track class holds the information about
+   every track of a CD. The tracks are linked
+   and the whole list is put into the cddb class */
+class clsTrack;
+
+class clsTrack
+{
+public:
+  clsTrack(char * title,int trackNo);
+  char trackname[1000];
+  int iTrackNo;
+  clsTrack *nextTrack;
+};
+
+/*****************************************************/
+
+/* This class holds the CDDB info of a CD. It
+   allows linking to support several matches. After
+   letting the user choose one match the missing
+   tracknames are filled with queried information from
+   the CDDB database*/ 
+
+class cddb;
+ 
+class cddb
+{
+public:
+  char title[101];
+  char artist[101];
+  char category[21];
+  LONG discid;
+
+  cddb(char * chrTitle,char *chrArtist, char *category, int iMatch);
+  ~cddb();
+  int newTrack(char * trackTitle, int trackNo);
+  clsTrack * cddbFirstTrack(){return firstTrack;};
+  clsTrack * cddbNextTrack(clsTrack * track);
+  void linkCddb(cddb * Cddb);
+  cddb * getNextCddb(){return nextCddb;};
+  int getFuzzyOrN() {return iFuzzy;};
+  clsTrack* cddbFindTrack(int iTrack);
+private:
+  int iFuzzy;
+  cddb* nextCddb;
+  clsTrack* firstTrack;
+  void addTrack(clsTrack * track);
+};
+
+
+
+
+
+
Index: /tags/CWMM-0.3.0_GA/mediafolder/include/cdfolder.hh
===================================================================
--- /tags/CWMM-0.3.0_GA/mediafolder/include/cdfolder.hh	(revision 213)
+++ /tags/CWMM-0.3.0_GA/mediafolder/include/cdfolder.hh	(revision 213)
@@ -0,0 +1,131 @@
+/*
+ * This file is (C) Chris Wohlgemuth 2002
+ */
+/*
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; see the file COPYING.  If not, write to
+ * the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+
+#ifndef CDFOLDER_HH_INCLUDED
+#define CDFOLDER_HH_INCLUDED
+
+#define IDHLP_CDFOLDERMAIN 200
+//#define OPEN_MMDISK  0x6500+0x400
+
+#include "mediafolder.hh"
+#include "mediafolderres.h"
+
+typedef struct _DISKUSEITEM
+{
+  WPObject* wpDiskObj;
+  USEITEM useItem;
+  VIEWITEM viewItem;
+}DISKUSEITEM;
+
+#pragma SOMAsDefault(on)
+#include <som.hh>
+#include <somcls.hh>
+#pragma SOMNoMangling(on)
+
+#include "cwaudio.hh"
+
+#pragma SOMNonDTS(on)
+
+class M_CWCDFolder:public M_CWMediaFolder
+{
+/* The name of of the new class */
+#pragma SOMClassName(*,"M_CWCDFolder")
+/* Required SOM version */
+#pragma SOMClassVersion(*,1,2)
+#pragma SOMCallstyle(oidl)
+public:
+  virtual PSZ  wpclsQueryTitle();
+  virtual ULONG wpclsQueryStyle();
+  virtual	ULONG wpclsQueryIconData(PICONINFO pIconInfo);
+  virtual	ULONG wpclsQueryIconDataN(PICONINFO pIconInfo, ULONG ulIconIndex);
+  virtual void wpclsInitData();
+  virtual BOOL wpclsQueryDefaultHelp(PULONG HelpPanelId,PSZ HelpLibrary);
+  virtual BOOL wpclsCreateDefaultTemplates(WPObject * wpObject);
+  /*  virtual void wpclsInitData();
+  virtual void wpclsUnInitData();
+
+  */
+#pragma SOMReleaseOrder()
+#pragma SOMIDLPass(*,"Implementation-End","dllname = mediafld;")
+};
+
+class CWCDFolder:public CWMediaFolder
+{
+#pragma SOMClassName(*,"CWCDFolder")
+#pragma SOMMetaClass(*,"M_CWCDFolder")
+#pragma SOMClassVersion(*,1,2)
+#pragma SOMCallstyle(oidl)
+private:
+  char  chrDrive[3];
+  ULONG ulNumTracks;
+  DISKUSEITEM diskUseItem;
+  HWND hwndFrameCDFldr;
+public:
+
+  PFNWP pfnwpCDFrame;
+#if 0
+  virtual BOOL wpMenuItemHelpSelected(ULONG MenuId);
+  virtual BOOL cwIsWaveFile(WPObject* wpObject);
+  virtual ULONG cwSetWriteFlags(ULONG ulNewWriteFlags,ULONG ulMask);
+  virtual ULONG cwQueryWriteFlags();
+  virtual BOOL wpMenuItemSelected(HWND hwndFrame,ULONG ulMenuId);
+  virtual void wpInitData();
+  virtual void wpUnInitData();
+  virtual BOOL wpModifyPopupMenu(HWND hwndMenu, HWND hwndCnr, ULONG ulPosition);
+  virtual BOOL wpAddSettingsPages(HWND hwndNotebook);
+#endif
+  virtual BOOL wpRestoreState(ULONG ulReserved);
+  virtual BOOL wpSaveState();
+  virtual BOOL wpSetup(PSZ pSetupString);
+  virtual BOOL wpSetupOnce(PSZ pSetupString);
+  virtual MRESULT wpDragOver(HWND hwndCnr,PDRAGINFO pDragInfo);
+  virtual BOOL wpRefresh(ULONG ulView, PVOID pReserved);
+  virtual HWND wpOpen(HWND hwndCnr,ULONG ulView,ULONG ulParam);
+  virtual ULONG wpFilterPopupMenu(ULONG ulFlags, HWND hwndCnr, BOOL fMultiSelect);
+  virtual ULONG wpAddObjectGeneralPage2(HWND hwndNotebook);
+  virtual ULONG wpAddFolderSortPage(HWND hwndNotebook);
+  virtual ULONG wpAddFolderIncludePage(HWND hwndNotebook);
+  virtual ULONG wpQueryConcurrentView();
+  virtual ULONG cwPlayAudioFile(HWND hwndFrame, ULONG ulWhich);
+  virtual BOOL cwSeekAudioFile(LONG lPosSec);
+  virtual void cwPlayTimeCallback(HWND hwndFrame, LONG lPosSec);
+  virtual BOOL cwInsertAllTracks(char* chrCDDrive);
+  virtual BOOL cwClose(HWND hwndFrame);
+#pragma SOMReleaseOrder(\
+)
+
+#pragma SOMIDLPass(CWMediaFolder,"Implementation-End","dllname = mediafld;")
+};
+
+#pragma SOMAsDefault(pop)
+#pragma SOMNonDTS(pop)
+
+#endif /* CDFOLDER_HH_INCLUDED */
+
+
+
+
+
+
+
+
+
+
+
+
Index: /tags/CWMM-0.3.0_GA/mediafolder/include/contextitem.hh
===================================================================
--- /tags/CWMM-0.3.0_GA/mediafolder/include/contextitem.hh	(revision 213)
+++ /tags/CWMM-0.3.0_GA/mediafolder/include/contextitem.hh	(revision 213)
@@ -0,0 +1,24 @@
+#ifndef _CONTEXTITEM_HH
+#define _CONTEXTITEM_HH
+
+#pragma SOMAsDefault (off)
+
+class CONTEXTITEM;
+
+class CONTEXTITEM
+{
+public:
+	MENUITEM menuItem;
+	ULONG ulSubMenuID;//if <>0 destinationsubmenu
+	char objectName[CCHMAXPATH];//Name of Object
+	HOBJECT  hObject;
+	WPObject *wpObject;//WPS-Objecthandle
+	CONTEXTITEM *previousItem;
+	CONTEXTITEM *nextItem;
+	CONTEXTITEM *subMenu;
+};
+
+#pragma SOMAsDefault (pop)
+
+
+#endif
Index: /tags/CWMM-0.3.0_GA/mediafolder/include/cwmmquerytrackinfo.h
===================================================================
--- /tags/CWMM-0.3.0_GA/mediafolder/include/cwmmquerytrackinfo.h	(revision 213)
+++ /tags/CWMM-0.3.0_GA/mediafolder/include/cwmmquerytrackinfo.h	(revision 213)
@@ -0,0 +1,10 @@
+/* For calling the method in the CWAudio class. Linking to the DLL would require the
+   new audio classes. By dynamically querying the method the media folder works without
+   installing the audio classes. */  
+typedef ULONG   SOMLINK somTP_MMAudio_cwmmQueryTrackInfo(MMAudio *somSelf,
+		PSZ    chrString,
+		ULONG ulSize,
+		int iWhich);
+typedef somTP_MMAudio_cwmmQueryTrackInfo *somTD_MMAudio_cwmmQueryTrackInfo;
+
+extern somTD_MMAudio_cwmmQueryTrackInfo methodPtr;
Index: /tags/CWMM-0.3.0_GA/mediafolder/include/except.h
===================================================================
--- /tags/CWMM-0.3.0_GA/mediafolder/include/except.h	(revision 213)
+++ /tags/CWMM-0.3.0_GA/mediafolder/include/except.h	(revision 213)
@@ -0,0 +1,80 @@
+
+#ifndef EXCEPT_H_INCLUDED
+#define EXCEPT_H_INCLUDED
+
+#include <setjmp.h>
+#include "excptLogName.h"
+
+typedef struct REGREC2_STRUCT {
+  PVOID     pNext;
+  PFN       pfnHandler;
+  jmp_buf   jmpThread;
+} REGREC2, *PREGREC2;
+
+typedef struct _LOCALEXCEPTSTRUCT {
+  //REGREC2               RegRec2;
+  EXCEPTIONREGISTRATIONRECORD  excptRegRecord;
+  ULONG                 ulExcpt;
+  APIRET                arc;
+  jmp_buf   jmpThread;
+} LOCALEXCEPTSTRUCT, *PLOCALEXCEPTSTRUCT;
+
+    /********************************************************************
+     *                                                                  *
+     *   Macros                                                         *
+     *                                                                  *
+     ********************************************************************/
+
+    /* See except.c for explanations how to use these. */
+
+    #define TRY_LOUD(localExceptStruct)                                   \
+               {  \ 
+                LOCALEXCEPTSTRUCT    localExceptStruct;                         \
+                localExceptStruct.excptRegRecord.ExceptionHandler = (ERR)excHandler;          \
+                localExceptStruct.arc = DosSetExceptionHandler(                  \
+                            (PEXCEPTIONREGISTRATIONRECORD)&(localExceptStruct.excptRegRecord)); \
+                if (localExceptStruct.arc)                                       \
+                    DosBeep(100, 1000);                                    \
+                localExceptStruct.ulExcpt = setjmp(localExceptStruct.jmpThread);               \
+                if (localExceptStruct.ulExcpt == 0)                              \
+                {   /* no exception occured: */
+
+    #define CATCH(localExceptStruct)                                       \
+                    DosUnsetExceptionHandler(                              \
+                            (PEXCEPTIONREGISTRATIONRECORD)&(localExceptStruct.excptRegRecord));   \
+                } /* end if (try_ulExcpt == 0) */                          \
+                else { /* exception occured: */                            \
+                    DosUnsetExceptionHandler(                              \
+                            (PEXCEPTIONREGISTRATIONRECORD)&(localExceptStruct.excptRegRecord));
+    #define END_CATCH                                                      \
+                } /* end else (excptstruct.ulExcpt == 0) */                \
+            } /* end variable scope block */
+
+
+    /*
+     * CRASH:
+     *      this macro is helpful for testing
+     *      the exception handlers.
+     *      This is not for general use. ;-)
+     */
+
+    #define CRASH {PSZ p = NULL; *p = 'a'; }
+
+    /********************************************************************
+     *                                                                  *
+     *   Prototypes                                                     *
+     *                                                                  *
+     ********************************************************************/
+
+ULONG _System excHandler(PEXCEPTIONREPORTRECORD pERepRec,
+                         PLOCALEXCEPTSTRUCT pRegRec2,
+                         //          PREGREC2 pRegRec2,
+                         PCONTEXTRECORD pCtxRec,
+                         PVOID pv);
+#if 0
+    ULONG _System excHandler(PEXCEPTIONREPORTRECORD pReportRec,
+                                         PREGREC2 pRegRec2,
+                                         PCONTEXTRECORD pContextRec,
+                                         PVOID pv);
+#endif
+#endif
Index: /tags/CWMM-0.3.0_GA/mediafolder/include/excptLogName.h
===================================================================
--- /tags/CWMM-0.3.0_GA/mediafolder/include/excptLogName.h	(revision 213)
+++ /tags/CWMM-0.3.0_GA/mediafolder/include/excptLogName.h	(revision 213)
@@ -0,0 +1,4 @@
+#ifndef  _EXCPT_LOGNAME_H
+  #define _EXCPT_LOGNAME_H
+  #define EXCEPTION_LOGFILE_NAME "MediaFld.log"
+#endif
Index: /tags/CWMM-0.3.0_GA/mediafolder/include/launchpad.hh
===================================================================
--- /tags/CWMM-0.3.0_GA/mediafolder/include/launchpad.hh	(revision 213)
+++ /tags/CWMM-0.3.0_GA/mediafolder/include/launchpad.hh	(revision 213)
@@ -0,0 +1,97 @@
+/*
+ * This file is (C) Chris Wohlgemuth 2001
+ */
+/*
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; see the file COPYING.  If not, write to
+ * the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+
+#ifndef LAUNCHPAD_H_INCLUDED
+#define LAUNCHPAD_H_INCLUDED
+
+#pragma SOMAsDefault(on)
+#include <som.hh>
+#include <somcls.hh>
+#pragma SOMNoMangling(on)
+
+#include "wpfolder.hh"
+
+#pragma SOMAsDefault(off) 
+
+class LPObject;
+class launchPad;
+class LPList;
+
+class LPList
+{
+public:
+  LPList *lplNext;
+  launchPad * lpPad;
+  void lplRefreshAllPads();
+};
+
+class LPObject
+{
+public:
+  LPObject(HPOINTER hptr);
+  ~LPObject(void);
+  LPObject* lpoNext;
+  WPObject *wpObject;
+  HOBJECT  hObject;
+  HPOINTER hPtr;
+  char chrName[CCHMAXPATH];
+  launchPad* lpParent;
+};
+
+class launchPad
+{
+public:
+  launchPad(HWND hwndParent,HWND hwndOwner, BOOL bVisible, WPFolder *wpParent, LPList** lpList, HWND hwndPrev, ULONG ulFl);
+  ~launchPad();
+  BOOL lpFillPad();
+  BOOL lpClearPad();
+  BOOL lpAddButton(WPObject* wpObject, int iAfter);
+  BOOL lpRemoveButton(LPObject *lpObject);
+  void lpRefreshLaunchPad();
+  // WPObject* lpQueryButtonObject(USHORT usButtonID);
+  WPFolder* lpQueryParentFolder();
+  //BOOL lpShowLaunchPad(BOOL bShow);
+  BOOL lpSetLaunchPadPos(HWND hwndInsertBehind, LONG x, LONG y, LONG cx, LONG cy, ULONG fl);
+  BOOL lpSetConfiguration(char * chrTarget, char * chrConfigID_);
+  void lpFreeObjectList();
+  virtual BOOL lpReBuildObjectList();
+  ULONG lpQueryNumObjects(void) {return ulNumObjects;};
+  BOOL  lpSetFlyOverText(char* chrText);
+  PSZ  lpQueryFlyOverText(void);
+private:
+  HWND hwndLaunchPad; /* This is the frame window handle of the launchpad */
+  WPFolder *wpParentFolder;
+  LPObject* lpoObjectList;
+  ULONG ulNumObjects;
+  HWND  hwndPrevious;
+  LPList** lpList;
+  ULONG fl;
+  char chrConfigTarget[CCHMAXPATH];
+  char chrConfigID[CCHMAXPATH];
+  char chrFlyOverText[250];/* Text for fly over help */
+  virtual BOOL lpBuildObjectList(char * chrFolderID);
+  virtual BOOL lpSaveObjectList();
+};
+
+#pragma SOMAsDefault(pop) 
+
+#define LP_USEOBJECTASPARAM  0x00000001
+#define LP_NODROPONPAD       0x00000002
+
+#endif
Index: /tags/CWMM-0.3.0_GA/mediafolder/include/m3ufolder.hh
===================================================================
--- /tags/CWMM-0.3.0_GA/mediafolder/include/m3ufolder.hh	(revision 213)
+++ /tags/CWMM-0.3.0_GA/mediafolder/include/m3ufolder.hh	(revision 213)
@@ -0,0 +1,116 @@
+/*
+ * This file is (C) Chris Wohlgemuth 2002
+ */
+
+#ifndef M3UFOLDER_HH_INCLUDED
+#define M3UFOLDER_HH_INCLUDED
+
+#include "mediafolder.hh"
+#include "mediafolderres.h"
+
+#pragma SOMAsDefault(on)
+#include <som.hh>
+#include <somcls.hh>
+#pragma SOMNoMangling(on)
+
+#include "cwaudio.hh"
+
+#pragma SOMAsDefault(off)
+#pragma SOMNonDTS(on)
+
+/* The help panel for the M3U folder */
+#define IDHLP_M3UFOLDERMAIN 300
+
+typedef struct _M3UTHREADPARMS
+{
+  WPObject* thisPtr;
+  HWND hwndCnr;
+  HWND hwndFrame;
+  BOOL fSaveOnly;
+}M3UTHREADPARMS;
+
+#pragma SOMAsDefault(on)
+//#pragma SOMNonDTS(on)
+
+class M_CWM3UFolder:public M_CWMediaFolder
+{
+/* The name of of the new class */
+#pragma SOMClassName(*,"M_CWM3UFolder")
+/* Required SOM version */
+#pragma SOMClassVersion(*,1,2)
+#pragma SOMCallstyle(oidl)
+public:
+  virtual PSZ  wpclsQueryTitle();
+  virtual ULONG wpclsQueryStyle();
+  virtual	ULONG wpclsQueryIconData(PICONINFO pIconInfo);
+  virtual	ULONG wpclsQueryIconDataN(PICONINFO pIconInfo, ULONG ulIconIndex);
+  virtual void wpclsInitData();
+  virtual BOOL wpclsQueryDefaultHelp(PULONG HelpPanelId,PSZ HelpLibrary);
+  virtual BOOL wpclsCreateDefaultTemplates(WPObject * wpObject);
+  /*
+  virtual void wpclsUnInitData();
+
+  */
+#pragma SOMReleaseOrder()
+#pragma SOMIDLPass(*,"Implementation-End","dllname = mediafld;")
+};
+
+class CWM3UFolder:public CWMediaFolder
+{
+#pragma SOMClassName(*,"CWM3UFolder")
+#pragma SOMMetaClass(*,"M_CWM3UFolder")
+#pragma SOMClassVersion(*,1,2)
+#pragma SOMCallstyle(oidl)
+private:
+
+public:
+
+  BOOL fContentsChanged;
+  BOOL fClosing;
+
+  virtual HWND wpOpen(HWND hwndCnr,ULONG ulView,ULONG ulParam);
+  //  virtual BOOL wpSetup(PSZ pSetupString);
+  virtual BOOL cwInsertAllTracks(char* chrM3UFile);
+  virtual BOOL cwSavePlaylist(char* chrM3UFile, BOOL fClose);
+  virtual BOOL wpDeleteFromContent(WPObject* Object);
+  virtual ULONG wpFilterPopupMenu(ULONG ulFlags, HWND hwndCnr, BOOL fMultiSelect);
+  virtual BOOL wpModifyPopupMenu(HWND hwndMenu, HWND hwndCnr, ULONG ulPosition);
+#if 0
+  virtual BOOL wpRestoreState(ULONG ulReserved);
+  virtual BOOL wpSaveState();
+  virtual BOOL wpSetupOnce(PSZ pSetupString);
+  virtual MRESULT wpDragOver(HWND hwndCnr,PDRAGINFO pDragInfo);
+  virtual BOOL wpRefresh(ULONG ulView, PVOID pReserved);
+  virtual ULONG wpAddObjectGeneralPage2(HWND hwndNotebook);
+  virtual ULONG wpAddFolderSortPage(HWND hwndNotebook);
+  virtual ULONG wpAddFolderIncludePage(HWND hwndNotebook);
+  virtual ULONG wpQueryConcurrentView();
+  virtual ULONG cwPlayAudioFile(HWND hwndFrame, ULONG ulWhich);
+  virtual BOOL cwSeekAudioFile(LONG lPosSec);
+  virtual void cwPlayTimeCallback(HWND hwndFrame, LONG lPosSec);
+  virtual MRESULT wpDrop(HWND hwndCnr,PDRAGINFO pDragInfo,PDRAGITEM pDragItem);
+  virtual BOOL wpDeleteFromContent(WPObject* Object);
+#endif
+  virtual BOOL cwClose(HWND hwndFrame);
+#pragma SOMReleaseOrder( \
+"cwSavePlaylist")
+
+#pragma SOMIDLPass(CWMediaFolder,"Implementation-End","dllname = mediafld;")
+};
+
+#pragma SOMAsDefault(pop)
+#pragma SOMNonDTS(pop)
+
+#endif /* CDFOLDER_HH_INCLUDED */
+
+
+
+
+
+
+
+
+
+
+
+
Index: /tags/CWMM-0.3.0_GA/mediafolder/include/mediafolder.hh
===================================================================
--- /tags/CWMM-0.3.0_GA/mediafolder/include/mediafolder.hh	(revision 213)
+++ /tags/CWMM-0.3.0_GA/mediafolder/include/mediafolder.hh	(revision 213)
@@ -0,0 +1,349 @@
+/*
+ * This file is (C) Chris Wohlgemuth 2002-2005
+ */
+/*
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; see the file COPYING.  If not, write to
+ * the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+
+#define INCL_DOS
+#define INCL_WIN
+#define INCL_GPIBITMAPS
+#include <os2.h>
+
+#define INCL_MCIOS2
+#include <os2me.h>
+#include "except.h"
+#include "mediafolderinc.h"
+
+
+#define  MAIN_BMP_IDX              0
+#define  CTRLIDX_POSSLIDER         1
+#define  CTRLIDX_POSSLIDERARM      2
+#define  CTRLIDX_VOLSLIDER         3
+#define  CTRLIDX_VOLSLIDERARM      4
+#define  CTRLIDX_VOLSLIDERARMSEL   5
+#define  CTRLIDX_PLAYTIME          6
+#define  CTRLIDX_TOPLEFT           7
+#define  CTRLIDX_TOPRIGHT          8
+#define  CTRLIDX_PLAYBUTTON        9
+#define  CTRLIDX_PLAYBUTTONSEL     10
+#define  CTRLIDX_STOPBUTTON        11
+#define  CTRLIDX_STOPBUTTONSEL     12
+#define  CTRLIDX_PAUSEBUTTON       13
+#define  CTRLIDX_PAUSEBUTTONSEL    14
+#define  CTRLIDX_SKIPBACKBUTTON    15
+#define  CTRLIDX_SKIPBACKBUTTONSEL 16
+#define  CTRLIDX_SKIPFWDBUTTON     17
+#define  CTRLIDX_SKIPFWDBUTTONSEL  18
+#define  CTRLIDX_BOTTOM            19
+#define  CTRLIDX_CHECK             20
+#define  CTRLIDX_UNCHECK           21
+#define  CTRLIDX_CHECKSEL          22
+#define  CTRLIDX_UNCHECKSEL        23
+
+#define  CTRLIDX_RANDOMCHECK             24
+#define  CTRLIDX_RANDOMUNCHECK           25
+#define  CTRLIDX_RANDOMCHECKSEL          26
+#define  CTRLIDX_RANDOMUNCHECKSEL        27
+
+#define  NUM_CTRL_IDX              28
+
+
+#define SHOWABOUTDIALOG_COMMAND   "SHOWABOUTDIALOG=1"
+#define SETUP_SHOWABOUTDIALOG     "SHOWABOUTDIALOG"
+
+#pragma SOMAsDefault(on)
+#include <som.hh>
+#include <somcls.hh>
+#pragma SOMNoMangling(on)
+/*#include "progfolder.h"*/
+#include "progfolder.hh"
+#include "cwaudio.hh"
+
+/* Forward declaration */
+class CWMediaFolder;
+
+#pragma SOMAsDefault(off)
+#pragma SOMNonDTS(on)
+
+typedef struct _MYVIEWITEM
+{
+  BOOL bIsInUseList;
+  USEITEM useItem;
+  VIEWITEM viewItem;
+}MYVIEWITEM;
+
+typedef struct
+{
+  INT id;
+  RECTL rclSource;
+  HBITMAP hbmSource;
+  RECTL rclDest;
+}CONTROLINFO;
+
+typedef struct
+{
+  BITMAPINFOHEADER bmpInfoHdr;
+  HBITMAP hbm;
+}LOADEDBITMAP;
+
+
+/* The following is used for openThreadFunc(void *arg) when openeing a media folder and
+   for storing information when calling cwPlayAudioFile() etc. from the player panel dialog of the folder. */
+typedef struct _THREADPARAMS
+{
+  CWMediaFolder *thisPtr;
+  HWND hwndFrame;
+}THREADPARAMS;
+
+/* This struct is used in the CWInsertTrack method to specify the REXX script
+to be started */
+typedef struct _INSERTTRACKPARMS
+{
+  WPObject* thisPtr;
+  char chrRexxScript[CCHMAXPATH];
+}INSERTTRACKPARMS;
+
+typedef  struct _MEDIAFLDRDATA
+{
+  ULONG ulTotalTime; /* Playtime of all folder tracks in secs */
+  char chrPlayTimeFont[50];/* Fontnamelength is 31 chars. Some space for the pointsize added and some to be save.
+                              Yeah, I know I'm lazy... */
+  BOOL bProcessing;  /* Set to TRUE if a thread is running. this is checked in the container proc and the wait ptr. is set. */
+  ULONG ulNumTracks;
+  ULONG ulSize;
+  BOOL bOpened;
+  BYTE *pRandomArray; /* This array holds the already random played tracks. When played the index is set to '1'. */
+  int iNumPlayed;     /* # of random played tracks */
+  int iNumToPlay;
+  HWND hwndPlayObject;/* Object window which handles the play commands so the WPS is not blocked. */
+}MEDIAFLDRDATA;
+typedef   MEDIAFLDRDATA*   PMEDIAFLDRDATA;
+
+typedef struct _DROPTHREADPARAMS
+{
+  CWMediaFolder *thisPtr;
+  HWND hwndCnr;
+  HWND hwndSource;
+  ULONG ulNumObjects;
+  POINTL ptl;
+  WPObject* wpObject[1];
+}DROPTHREADPARAMS;
+typedef DROPTHREADPARAMS* PDROPTHREADPARAMS;
+
+typedef struct _MFLDRCTRLDATA
+{
+  ULONG ulMnemonicPos;
+  BOOL  bPreviousCheckState;
+}MFLDRCTRLDATA;
+
+class launchPad;
+
+#pragma SOMAsDefault(on)
+
+#ifndef somMD_WPFileSystem_wpRefresh
+typedef BOOL   SOMLINK somTP_WPFileSystem_wpRefresh(WPFileSystem *somSelf,
+		ULONG ulView,
+		PVOID pReserved);
+//#pragma linkage(somTP_WPFileSystem_wpRefresh, system)
+typedef somTP_WPFileSystem_wpRefresh *somTD_WPFileSystem_wpRefresh;
+#define somMD_WPFileSystem_wpRefresh "::WPFileSystem::wpRefresh"
+#define WPFileSystem_wpRefresh(somSelf,ulView,pReserved) \
+    (SOM_Resolve(somSelf, WPFileSystem, wpRefresh) \
+	(somSelf,ulView,pReserved))
+#ifndef SOMGD_wpRefresh
+    #if (defined(_wpRefresh) || defined(__wpRefresh))
+        #undef _wpRefresh
+        #undef __wpRefresh
+        #define SOMGD_wpRefresh 1
+    #else
+        #define _wpRefresh WPFileSystem_wpRefresh
+    #endif /* _wpRefresh */
+#endif /* SOMGD_wpRefresh */
+#endif
+
+class M_CWMediaFolder:public M_CWProgFolder
+{
+/* The name of of the new class */
+#pragma SOMClassName(*,"M_CWMediaFolder")
+/* Required SOM version */
+#pragma SOMClassVersion(*,1,2)
+#pragma SOMCallstyle(oidl)
+public:
+  virtual PSZ  wpclsQueryTitle();
+  virtual void wpclsInitData();
+  virtual	ULONG wpclsQueryIconData(PICONINFO pIconInfo);
+  virtual	ULONG wpclsQueryIconDataN(PICONINFO pIconInfo, ULONG ulIconIndex);
+  virtual void wpclsUnInitData();
+  virtual BOOL wpclsCreateDefaultTemplates(WPObject * wpObject);
+  virtual	ULONG wpclsQueryStyle();
+  virtual BOOL wpclsQueryDefaultHelp(PULONG HelpPanelId,PSZ HelpLibrary);
+
+#pragma SOMReleaseOrder()
+#pragma SOMIDLPass(*,"Implementation-End","dllname = mediafld;")
+};
+
+class CWMediaFolder:public CWProgFolder
+{
+#pragma SOMClassName(*,"CWMediaFolder")
+#pragma SOMMetaClass(CWMediaFolder,"M_CWMediaFolder")
+#pragma SOMClassVersion(CWMediaFolder,1,2)
+#pragma SOMCallstyle(oidl)
+private:
+  /*
+     Added with V0.2.8 (07.09.2003)
+
+     Private flags used by the folder to keep track of current actions.
+
+     Tells the folder:
+     MFLDR_CURACTION_ADDFOLDERVIEW3: currently processing the wpAddFolderView3Page()
+     MFLDR_VIEW_COMPACT:             folder is in compact view
+
+   */
+  ULONG ulPrivFlags;
+  SWP swpUnshrink;
+public:
+  /* From M3UFolder*/
+  WPObject* wpObjM3UFile;
+  HWND hwndObject;
+
+  WPObject* currentObject; /* Currently playing object */
+  PMINIRECORDCORE mrcPlaying;
+  MYVIEWITEM myViewItem;
+
+  HWND hwndTopMiddle;/* */
+  HWND hwndBottom;
+  HWND hwndMFldrFrame;
+  int iWave;
+  ULONG ulFlags;
+  BOOL bPaused;
+  ULONG ulVolume;
+  ULONG ulStartPosition;
+  ULONG ulTotalLength;/* Total length of track in ms */
+  ULONG ulPos;/* Position in wave/track in secs */
+  //char chrTBFlyFontName[CCHMAXPATH+1];
+  //  RGB rgbTBFlyForeground;
+  //  RGB rgbTBFlyBackground;
+  //  BOOL bTBFlyOverEnabled;
+  //  int iTBFlyOverDelay;
+  PFNWP pfnwpFrame;
+  USHORT usLastSelMenuItem;
+  USHORT usWhichDisplay;
+  MEDIAFLDRDATA* mfData;/* Allocated in wpInitData() */
+  launchPad* lPad;
+#if 0
+  virtual BOOL wpMenuItemHelpSelected(ULONG MenuId);
+  virtual ULONG wpFilterPopupMenu(ULONG ulFlags, HWND hwndCnr, BOOL fMultiSelect);
+  virtual BOOL cwIsWaveFile(WPObject* wpObject);
+  virtual ULONG cwSetWriteFlags(ULONG ulNewWriteFlags,ULONG ulMask);
+  virtual ULONG cwQueryWriteFlags();
+#endif
+  virtual BOOL    wpSetupOnce(PSZ pSetupString);
+  virtual BOOL    wpAddToContent(WPObject* Object);
+  virtual BOOL    wpDeleteFromContent(WPObject* Object);
+  virtual ULONG   wpAddFolderView1Page(HWND hwndNotebook);
+  virtual ULONG   wpAddFolderView2Page(HWND hwndNotebook);
+  virtual ULONG   wpAddFolderView3Page(HWND hwndNotebook);
+  virtual ULONG   wpFilterPopupMenu(ULONG ulFlags, HWND hwndCnr, BOOL fMultiSelect);
+  virtual HWND    wpOpen(HWND hwndCnr,ULONG ulView,ULONG ulParam);
+  virtual BOOL    wpRestoreState(ULONG ulReserved);
+  virtual BOOL    wpSaveState();
+  virtual MRESULT wpDragOver(HWND hwndCnr,PDRAGINFO pDragInfo);
+  virtual MRESULT wpDrop(HWND hwndCnr,PDRAGINFO pDragInfo,PDRAGITEM pDragItem);
+  virtual BOOL    wpAddSettingsPages(HWND hwndNotebook);
+  virtual ULONG   wpInsertSettingsPage(HWND hwndNotebook, PPAGEINFO ppageinfo);
+  virtual BOOL    wpMenuItemSelected(HWND hwndFrame,ULONG ulMenuId);
+  virtual BOOL    wpModifyPopupMenu(HWND hwndMenu, HWND hwndCnr, ULONG ulPosition);
+  virtual BOOL    wpSetup(PSZ pSetupString);
+  virtual void    wpInitData();
+  virtual void    wpUnInitData();
+  virtual BOOL    wpRefresh(ULONG ulView, PVOID pReserved);
+  // The following was introduced by CWProgFolder
+  virtual BOOL    cwClose(HWND hwndFrame);
+  // These are our new methods
+  virtual ULONG   cwPlayAudioFile(HWND hwndFrame, ULONG ulWhich);
+  virtual BOOL    cwStopAudioFile(HWND hwndFrame);
+  virtual BOOL    cwPauseAudioFile(HWND hwndFrame);
+  virtual BOOL    cwAddToolbarOptionPage(HWND hwndNotebook);
+  virtual MMAudio* cwQueryCurrentlyPlayingObject();
+  virtual void    cwSetStatusLineText(char * chrText);
+  virtual BOOL    cwSeekAudioFile(LONG lPosSec);
+  virtual void    cwPlayTimeCallback(HWND hwndFrame, LONG lPosSec);
+  virtual ULONG   cwPlayRandomAudioFile(HWND hwndFrame);
+  virtual BOOL    cwInsertAllTracks(char* chrM3UFile);
+  virtual ULONG   cwQueryMFldrFlags();
+  virtual BOOL    cwShrinkFolderToCompact(HWND hwndFrame);
+  virtual BOOL    cwUnshrinkFolder(HWND hwndFrame);
+#pragma SOMReleaseOrder(\
+"cwPlayAudioFile",\
+"cwStopAudioFile",\
+"cwPauseAudioFile",\
+"cwAddToolbarOptionPage",\
+"cwQueryCurrentlyPlayingObject",\
+"cwSetStatusLineText",\
+"cwSeekAudioFile",\
+"cwPlayTimeCallback",\
+"cwPlayRandomAudioFile",\
+"cwInsertAllTracks",\
+"cwQueryMFldrFlags", \
+"cwShrinkFolderToCompact",\
+"cwUnshrinkFolder")
+
+#if 0
+  virtual MRESULT wpDrop(HWND hwndCnr,PDRAGINFO pDragInfo,PDRAGITEM pDragItem);
+  virtual BOOL cwClose();
+  virtual BOOL wpSetupOnce(PSZ pSetupString);
+  virtual BOOL wpSetup(PSZ pSetupString);
+
+#pragma SOMReleaseOrder(\
+"cwIsWaveFile",\
+"cwSetWriteFlags",\
+"cwQueryWriteFlags",\
+"cwEnableGrab",\
+"cwQueryGrabEnabled",\
+"cwEnableGrabControls",\
+"cwEnableSelectControls",\
+"cwFillTrackList",\
+"cwSetStatusTime",\
+"cwForceStatusUpdate",\
+"cwEnableWrite",\
+"cwQueryWriteEnabled",\
+"cwEnableWriteControls",\
+"cwSetStatusText",\
+"cwWriteAudioTracks",\
+"cwIsMp3File",\
+"cwCreateContentsFile")
+#endif
+#pragma SOMIDLPass(CWMediaFolder,"Implementation-End","dllname = mediafld;")
+};
+
+/************/
+#pragma SOMAsDefault(pop)
+
+#pragma SOMNonDTS(pop)
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Index: /tags/CWMM-0.3.0_GA/mediafolder/include/mediafolderinc.h
===================================================================
--- /tags/CWMM-0.3.0_GA/mediafolder/include/mediafolderinc.h	(revision 213)
+++ /tags/CWMM-0.3.0_GA/mediafolder/include/mediafolderinc.h	(revision 213)
@@ -0,0 +1,222 @@
+
+/* Defines for positioning the frame controls */
+#define FCTL_LEFT   1
+#define FCTL_RIGHT  2
+#define FCTL_TOP    4
+#define FCTL_BOTTOM 8
+#define FCTL_POSABOVE  1
+#define FCTL_POSBELOW  2
+
+/* The following is for use with WPS-Wizard if installed  */
+/* The first user menuitem ID */
+#define FIRSTUSERITEM        0x7200
+/* The first skript menuitem ID */
+/*#define FIRSTSKRIPTITEM        0x7300*/
+
+/* The view menu. We insert the 'Compact' menu here. */
+#define MENUID_VIEW          104
+
+/*#define SKRIPTFOLDER_MEDIAFOLDER   "<SKRIPTS_MEDIAFOLDER>"*/
+
+/* Keys for the instance data */
+#define KEY_VOLUME          4100
+#define KEY_FLYFOREGROUND   4101
+#define KEY_FLYBACKGROUND   4102
+#define KEY_FLYFONT         4103
+#define KEY_FLYDELAY        4104
+#define KEY_FLYENABLED      4105
+#define KEY_FLAGS           4106
+#define KEY_DISPLAYTYPE     4107
+#define KEY_PLAYTIMEFONT    4108
+
+#define KEY_DRIVE           4100
+
+/* Flags saved in the instance data */
+/* Make sure we only resize the folder ones */
+#define FLAG_ALREADYSIZED      0x00000001
+/* Repeat check button */
+#define FLAG_REPEAT            0x00000002
+/* Random play */
+#define FLAG_RANDOM            0x00000004
+
+/*** Private folder flags: ***/
+/* Flag indicating from where a method was called */
+#define MFLDR_CURACTION_ADDFOLDERVIEW3  0x00000001
+/* Flag telling if folder is in compact view */
+#define MFLDR_VIEW_COMPACT              0x00000002
+/* The view is currently changing */
+#define MFLDR_CHANGING_VIEW             0x00000004
+/* Indicate, we are currently showing the cancellation message box to the user */
+#define MFLDR_SHOWING_MBOX              0x00000008
+/*** End of private folder flags ***/
+
+/* Timer for automatically dismissing the message box and closing a mediafolder
+   when playing a media file. Used for enabling automatic shutdown. Otherwise
+the shutdown would hang until the user clicks 'ok'. See cwClose() */
+#define MFLDR_MBOX_TIMER_ID 100
+/* The timer delay in ms. This can be set in the INI file. */
+#define MFLDR_MBOX_TIMER_DELAY 60000
+/* The allowed minimum for the timer delay in ms */
+#define MFLDR_MBOX_MIN_TIMER_DELAY 5000
+/* */
+#define MFLDR_TIMER_DELAY_KEY "mfldrMBoxDisplayTime"
+
+#define IDHLP_MEDIAFOLDERMAIN  100
+
+/* Which display to show */
+#define DISPLAY_TIMEELAPSED    0
+#define DISPLAY_TIMEREMAINING  1
+#define DISPLAY_TIMEID3        2
+
+#define SHADOW_CLASS_NAME   "CWAudioShadow"
+
+/************* Object IDs *******************/
+#define MEDIAFLDR_TBID      "<MEDIAFLDR_TOOLBAR>"
+#define ID_MEDIAFLDRTEMPLATE       "<MMPM2_MEDIAFLDRTEMPLATE>"
+//#define MEDIAFLDR_TEMPLATE_NAME    "Media-Player"
+#define ID_MMTEMPLATEFOLDER        "<MMPM2_MMTEMPLATEFOLDER>"
+#define ID_MEDIALDRTMPL_SHADOW     "<MFLDRTMPL_SHADOW>"
+#define ID_MMFOLDER                "<MMPM2_FOLDER>"
+/* The ID for the data configuration folder */
+#define USERMENUFOLDER_MEDIAFOLDER "<USERMENU_MEDIAFOLDER>"
+
+#define USERMENUFOLDER_M3UFOLDER "<USERMENU_CWM3UFolder>"
+
+/************ INI file settings *************/
+#define APPKEY_CWMM           "CWMM"
+/* Setting for ini file to prevent template shadow creation in MM folder */
+#define MFLDR_NO_TEMPLATE_SHADOW   "bNoMediaFolderTemplateShadow"
+/* If set no blinking of the buttons while playing */
+#define MFLDR_NO_VISUAL_FEEDBACK   "bNoPlayCtrlBlinking"
+/* FreeDB root directory */
+#define KEY_FREEDBCLIENTROOT  "freedbclient"
+
+/*********** FreeDB client ******************/
+/* Client for FreeDB query. This path is relative to the 'freedbclient' path specified in os2.ini see above. */
+#define FREEDB_CLIENT_NAME    "\\pmcddb.exe"
+/* Script sending the tracknames. Path is relative to install dir of cdfolder */
+#define FREEDB_REXXSCRIPT     "\\bin\\trknames.cmd"
+
+/* Flyover default settings. Not yet used */
+#define MAXDELAY            9999       /* Delay for toolbar flyover */
+#define DEFAULTDELAY        250
+
+/* Fonts to use in dialogs */
+#define DEFAULT_DIALOG_FONT   "9.WarpSans"
+#define DEFAULT_DIALOG_FONT_WARP3   "8.Helv"
+
+
+/*********** Setup strings ******************/
+/* Setup strings for media folders */
+#define MEDIAFLDR_PLAY_FIRST    "MEDIAFLDRPLAYFIRST"
+#define MEDIAFLDR_PLAY    "MEDIAFLDRPLAY"
+#define MEDIAFLDR_STOP    "MEDIAFLDRSTOP"
+#define MEDIAFLDR_NEXT    "MEDIAFLDRNEXT"
+#define MEDIAFLDR_PREV    "MEDIAFLDRPREV"
+#define MEDIAFLDR_VOLUME  "MEDIAFLDRVOLUME"
+#define MEDIAFLDR_REPEAT  "MEDIAFLDRREPEAT"
+/* Setup strings for CD folder.
+   Usage: CDPLAYERDRIVE=O: */
+#define CDFLDR_DRIVE      "CDPLAYERDRIVE"
+/* The template for creting IDs for CD player objects.
+   For example: <CWMM_CDPLAYER_N> */
+#define CDFLDR_ID         "<CWMM_CDPLAYER_%c>"
+/* Destination for CD player objects */
+#define CDFLDR_LOCATION "<MMPM2_FOLDER>"
+/* CD folder classname */
+#define CDFLDR_CLASSNAME    "CWCDFolder"
+/* Setup string to hide the class page of menu folders */
+#define SETUP_HIDECLASSPAGE  "HIDECLASSPAGE"
+
+/* Script which creates the CD player objects */
+#define SCRIPT_CREATEPLAYERS "creatobj.cmd"
+
+/* The private media folder view when playing a track */
+#define OPEN_PLAYING           OPEN_USER+1000
+
+/* Which track to start */
+#define PLAY_FIRST       1L
+#define PLAY_NEXT        2L
+#define PLAY_PREV        3L
+#define PAUSE_TRACK      4L
+#define STOP_TRACK       5L
+#define SEEK_TRACK       6L
+#define PLAY_NEXT_CDFLDR 7L /* CD folders need special handling because they're slow */
+
+/* The IDs for the playtime display */
+#define IDTIMER_PLAY  5L
+#define PLAYTIMER_DELAY 1000
+
+/* Timer ID for status text */
+#define IDTIMER_STATUS 1
+
+/* Slider window class name */
+#define SLIDER_CLASS     "CWSLIDER"
+
+/* Data positions in the window words */
+#define SLIDERARMWIDTH    0  /* USHORT */
+#define SLIDERARMHEIGHT  2  /* USHORT */
+#define PTRPOSINSLARM    4  /* USHORT */
+#define SLINCREMENTS     6  /* USHORT */
+#define SLIDERCX         8  /* ULONG */
+#define SLIDERCY         12 /* ULONG */
+#define SLIDERX          16 /* ULONG */
+#define SLIDERY          20 /* ULONG */
+#define SLIDERARMPOS     24 /* LONG  */
+#define SLDRAGGING       28 /* BOOL  */
+#define SLADDBYTES       32 /* num additional window bytes for slider */
+
+/* Useful defines */
+#define MRFALSE (MRESULT)FALSE
+#define MRTRUE (MRESULT)TRUE
+
+/* Used for sending a click event from the time control to the main control */
+#define NOTIFY_CLICK       1 /* For WM_APPTERMINATENOTIFY */
+/* Same for context menu */
+#define NOTIFY_CONTEXT     2
+#define NOTIFY_STARTSTATUSTIMER 3
+
+/* for cwmmQueryTrackInfo() */
+/* ID tag defines */
+#define IDINFO_NAME              1
+#define IDINFO_ARTIST            2
+#define IDINFO_ALBUM             3
+#define IDINFO_YEAR              4
+#define IDINFO_COMMENT           5
+#define IDINFO_GENRE             6
+
+#define IDINFO_PLAYTIME          7
+#define IDINFO_BPS               8
+#define IDINFO_SAMPLERATE        9
+#define IDINFO_CHANNELS          10
+
+#define IDINFO_LASTINFO          10
+
+/* From CWCDTrack */
+#define IDINFO_TRACKNUM          100
+
+#ifndef CTXT_CHANGETOICON
+#define CTXT_CHANGETOICON   0x4000000
+#define CTXT_CHANGETOTREE   0x8000000
+#define CTXT_CHANGETODETAILS 0x10000000
+
+/* This shouldn't be static... But there's an overflow check so at least
+there's no crash id anyone has more objects in a playlist.  */
+#define MAX_RANDOM_OBJECTS   5000  /* Max objects we use when playing random */
+
+/* Internal REXX scripts */
+#define RX_INSERT_PLAYLISTTRACKS    "\\bin\\insTrack.rx"
+#define RX_INSERT_MEDIAFLDRTRACKS    "\\bin\\insTrk2.rx"
+/*#define RX_CREATE_AUDIOCD           "mkaudCD.rx"*/
+
+/* Additional window bytes for all the media folders */
+#define MFLDR_WINDOWBYTES  24
+
+/* Name of the DLL conatining the resources. %c%c will be replaced by the language code. */
+#define RESDLLNAME "\\mfldr_%c%c.dll"
+/* Default resource DLL name if NLV is not available. */
+#define DEFRESDLLNAME "\\mfldr_en.dll"
+
+#endif
+
+
Index: /tags/CWMM-0.3.0_GA/mediafolder/include/mediafolderres.h
===================================================================
--- /tags/CWMM-0.3.0_GA/mediafolder/include/mediafolderres.h	(revision 213)
+++ /tags/CWMM-0.3.0_GA/mediafolder/include/mediafolderres.h	(revision 213)
@@ -0,0 +1,133 @@
+
+#define IDSTR_CLOSETEXT            1
+#define IDSTRSETTING_TOOLBAR       2
+#define IDSTRS_NOFONTPALETTE       3
+#define IDSTRS_NOCOLORPALETTE      4
+#define IDSTRS_MEDIAFLDRSETTINGS   5
+#define IDSTR_MENUABOUT            6
+#define IDSTR_STATUSCOLLECTING     7
+#define IDSTR_MENUSKRIPTS          8
+#define IDSTR_STATUSTIME1          9
+#define IDSTR_STATUSTIME2          10
+#define IDSTR_STATUSTIME3          11
+#define IDSTR_STATUSTIME4          12
+#define IDSTR_STATUSTIME5          13
+#define IDSTR_MENUCOMPACT          14
+#define IDSTR_TITLEMEDIAFOLDER     15
+#define IDSTR_TITLECDFOLDER        16
+#define IDSTR_CLOSETITLE           17
+#define IDSTR_STARTINGTRACK        18
+#define IDSTR_TITLEM3UFOLDER       19
+#define IDSTR_M3UCLOSETEXT         20
+#define IDSTR_MENUFILE             21 /* File menu of CWM3UFolder */
+#define IDSTR_PLAYLISTVIEWTITLE    22 /* Title of the playlist view */
+#define IDSTR_LAUNCHPADFLYOVER     23 /* Flyover help for launchpads */
+#define IDSTR_VIEWPAGENAME         24 /* Title for Details view page which has now a major tab */
+#define IDSTR_VIEWCOMPACT          25 /* View name when in 'Compact' mode */
+#define IDSTR_CDFOLDERNAME         26
+#define IDSTR_MEDIAFLDHELP         27
+#define IDSTR_M3ULISTHELP          28
+
+#define IDPB_VOLUME                 202
+#define IDDLG_TOPFRAME              100
+
+#define IDICON_FOLDER1             2000
+#define IDICON_FOLDER2             2001
+#define IDICON_CDFOLDER            2002
+#define IDICON_M3UFILE             2003
+
+#define ID_MBMENUSKRIPTS           0x6fff
+
+#define ID_MENUABOUT              0x6620
+#define ID_ABOUTITEM              0x6621
+#define ID_MEDIAFLDHELP           0x6623
+#define ID_M3ULISTHELP            0x6624
+#define ID_MENUSEPARATOR          0x6629
+#define ID_MENUVIEWCOMPACT        0x6622
+#define ID_MENUTIMECONTEXT        1
+#define ID_MENUITEMELAPSED        2
+#define ID_MENUITEMREMAINING      3
+#define ID_MENUITEMID3            4
+#define ID_MENUFILE               0x6630
+#define ID_MENUITEMSAVE           0x6631
+#define ID_MENUITEMEXIT           0x6632
+
+#define IDBMP_SKIPBACK		       2102
+#define IDBMP_PLAY                 2103
+#define IDBMP_PAUSE                2104
+#define IDBMP_STOP                 2105
+#define IDBMP_SKIPFORWARD          2106
+#define IDBMP_BUTTONUP             2107
+#define IDBMP_BUTTONDOWN           2108
+#define IDBMP_TOPMIDDLE            2109
+#define IDBMP_POSSLIDERARM         2110
+#define IDBMP_VOLSLIDERARM         2111
+#define IDBMP_VOLSLIDERARMSEL      2112
+#define IDBMP_TOPLEFT              2113
+#define IDBMP_TOPRIGHT             2114
+#define IDBMP_PLAYSEL              2115
+#define IDBMP_SKIPFORWARDSEL       2116
+#define IDBMP_SKIPBACKSEL	       2117
+#define IDBMP_PAUSESEL             2118
+#define IDBMP_STOPSEL              2119
+#define IDBMP_BOTTOM               2120
+#define IDBMP_CHECK                2121
+#define IDBMP_UNCHECK              2122
+#define IDBMP_CHECKSEL             2123
+#define IDBMP_UNCHECKSEL           2124
+
+
+#define IDDLG_TOOLBARSETTINGS       3800
+#define IDPB_COLORUNDO              3801
+#define IDPB_COLORSTANDARD          3802
+#define IDPB_COLORHELP              3803
+#define IDPB_COLORPALETTE           3804
+#define IDPB_FONTPALETTE            3805
+#define IDST_TEXTDEMOFIELD          3806
+#define IDCB_ENABLETBFLYOVER        3807
+#define IDSB_TBFLYOVERDELAY         3808
+#define IDGB_COLORANDFONT           3809
+#define IDGB_TOOLBAR                3810
+
+#define IDSL_POSITION               101
+#define IDPB_SKIPBACK               102
+#define IDPB_PLAY                   103
+#define IDPB_PAUSE                  104
+#define IDPB_STOP                   105
+#define IDPB_SKIPFORWARD            106
+#define IDST_PLAYTIME               107
+#define IDST_ID3TAG                 108
+
+#define IDDLG_FRAMERIGHT            200
+#define IDSL_VOLUME                 201
+
+#define IDDLG_TOPMIDDLE             300
+#define IDPB_POSBAR                 301
+#define IDPB_SLIDERARM              302
+#define IDSL_VOLUMEARM              303
+#define IDCB_REPEAT                 304
+#define IDCB_RANDOM                 305
+
+#define IDDLG_LEFTFRAME             400
+#define IDPB_ADD                    402
+#define IDPB_REMOVE                 403
+#define IDCNR_PLAYLIST              404
+
+#define IDDLG_BOTTOMFRAME           500
+
+#define IDDLG_ABOUT           600
+#define IDST_PRODNAME         601
+#define IDST_PRODCOPY         602
+#define IDST_PRODGRAPHICS     603
+#define IDST_URL1             604
+
+
+#define IDGB_ABOUT                  605
+#define IDST_URL2                   606
+#define IDST_PRODCOPY2        607
+
+#define IDSL_TEST                   305
+#define IDSL_POSBAR                 306
+#define IDST_STATUSTEXT             501
+
+#define IDPTR_ARROWWE              2    /* WE Cursor for slider controls */
Index: /tags/CWMM-0.3.0_GA/mediafolder/include/mediashadow.hh
===================================================================
--- /tags/CWMM-0.3.0_GA/mediafolder/include/mediashadow.hh	(revision 213)
+++ /tags/CWMM-0.3.0_GA/mediafolder/include/mediashadow.hh	(revision 213)
@@ -0,0 +1,145 @@
+/*
+ * This file is (C) Chris Wohlgemuth 2002
+ */
+/*
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; see the file COPYING.  If not, write to
+ * the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+#define INCL_DOS
+#define INCL_WIN
+#define INCL_GPIBITMAPS
+#include <os2.h>
+
+#define INCL_MCIOS2
+#include <os2me.h>
+
+
+#include "except.h"
+
+#define IDTIMER_PLAY  5L
+#define PLAYTIMER_DELAY 1000
+
+#define STATUS_LENGTH 200
+
+#ifdef DEBUG
+    void writeDebugLog(char *text);
+#endif
+
+
+#pragma SOMAsDefault(on)
+#include <som.hh>
+#include <somcls.hh>
+#pragma SOMNoMangling(on)
+/*#include "progfolder.h"*/
+#include "wpshadow.hh"
+
+#pragma SOMAsDefault(off)
+typedef struct _MYVIEWITEM
+{
+  BOOL bIsInUseList;
+  USEITEM useItem;
+  VIEWITEM viewItem;
+}MYVIEWITEM; 
+
+typedef struct
+{
+  INT id;
+  RECTL rclSource;
+  HBITMAP hbmSource;
+  RECTL rclDest;
+}CONTROLINFO;
+
+typedef struct
+{
+  BITMAPINFOHEADER bmpInfoHdr;
+  HBITMAP hbm;
+}LOADEDBITMAP;
+
+
+#pragma SOMAsDefault(on)
+
+class M_CWAudioShadow:public M_WPShadow
+{
+/* The name of of the new class */
+#pragma SOMClassName(*,"M_CWAudioShadow")
+/* Required SOM version */
+#pragma SOMClassVersion(*,1,2)
+#pragma SOMCallstyle(oidl)
+public:
+  virtual PSZ  wpclsQueryTitle();
+  virtual ULONG wpclsQueryDetailsInfo( PCLASSFIELDINFO* ppClassFieldInfo, PULONG pSize);
+#if 0
+  virtual void wpclsInitData();
+  virtual	ULONG wpclsQueryIconData(PICONINFO pIconInfo);
+  virtual	ULONG wpclsQueryIconDataN(PICONINFO pIconInfo, ULONG ulIconIndex);
+  virtual void wpclsUnInitData();
+	virtual	ULONG wpclsQueryStyle();
+	virtual BOOL wpclsQueryDefaultHelp(PULONG HelpPanelId,PSZ HelpLibrary);
+  virtual BOOL wpclsCreateDefaultTemplates(WPObject * wpObject);
+#endif
+
+#pragma SOMReleaseOrder()
+#pragma SOMIDLPass(*,"Implementation-End","dllname = mediafld;")
+};
+
+class CWAudioShadow:public WPShadow
+{
+#pragma SOMClassName(*,"CWAudioShadow")
+#pragma SOMMetaClass(CWAudioShadow,"M_CWAudioShadow")
+#pragma SOMClassVersion(CWAudioShadow,1,2)
+#pragma SOMCallstyle(oidl)
+private:
+
+public:
+
+  virtual ULONG wpQueryDetailsData(PVOID* ppDetailsData, PULONG pcp);
+
+#if 0
+  virtual BOOL wpMenuItemHelpSelected(ULONG MenuId);
+  virtual ULONG wpFilterPopupMenu(ULONG ulFlags, HWND hwndCnr, BOOL fMultiSelect);
+  virtual BOOL wpModifyPopupMenu(HWND hwndMenu, HWND hwndCnr, ULONG ulPosition);
+  virtual BOOL wpMenuItemSelected(HWND hwndFrame,ULONG ulMenuId);
+  virtual ULONG wpAddFolderView2Page(HWND hwndNotebook);
+  virtual MRESULT wpDragOver(HWND hwndCnr,PDRAGINFO pDragInfo);
+  virtual BOOL wpAddSettingsPages(HWND hwndNotebook);
+  virtual BOOL wpAddToContent(WPObject* Object);
+  virtual BOOL wpDeleteFromContent(WPObject* Object);
+  virtual BOOL cwIsWaveFile(WPObject* wpObject);
+  virtual ULONG cwSetWriteFlags(ULONG ulNewWriteFlags,ULONG ulMask);
+  virtual ULONG cwQueryWriteFlags();
+  virtual BOOL wpRestoreState(ULONG ulReserved);
+  virtual BOOL wpSaveState();
+  virtual MRESULT wpDragOver(HWND hwndCnr,PDRAGINFO pDragInfo);
+  virtual MRESULT wpDrop(HWND hwndCnr,PDRAGINFO pDragInfo,PDRAGITEM pDragItem);  
+#endif
+
+#pragma SOMReleaseOrder()
+
+#pragma SOMIDLPass(CWMediaFolder,"Implementation-End","dllname = mediafld;")
+};
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Index: /tags/CWMM-0.3.0_GA/mediafolder/include/menufldr.h
===================================================================
--- /tags/CWMM-0.3.0_GA/mediafolder/include/menufldr.h	(revision 213)
+++ /tags/CWMM-0.3.0_GA/mediafolder/include/menufldr.h	(revision 213)
@@ -0,0 +1,834 @@
+
+/*
+ * This file was generated by the SOM Compiler.
+ * FileName: menufldr.h.
+ * Generated using:
+ *     SOM Precompiler somipc: 2.29.1.7
+ *     SOM Emitter emith: 2.42
+ */
+
+/*
+ * 
+ * menufldr.idl:
+ */
+
+
+#ifndef SOM_CWMenuFolder_h
+#define SOM_CWMenuFolder_h
+
+
+#include <som.h>
+
+/*
+ * -- This emitter treats Method Tokens as Thunks by default.
+ * -- Use the sc modifier "nothunks" to change this default
+ */
+#undef somresolve_
+#define somresolve_(obj,mToken) ((somMethodProc*)((void)obj, mToken))
+
+/*
+ * Define the class name as an object type
+ */
+#ifndef CWMenuFolder
+#define CWMenuFolder SOMObject
+#endif
+#include <wpfolder.h>
+
+/*
+ * Start of user-defined types:
+ */
+#ifndef SOMClass
+    #define SOMClass SOMObject
+#endif /* SOMClass */
+#ifndef WPFolder
+    #define WPFolder SOMObject
+#endif /* WPFolder */
+#ifndef M_WPObject
+    #define M_WPObject SOMObject
+#endif /* M_WPObject */
+#ifndef WPObject
+    #define WPObject SOMObject
+#endif /* WPObject */
+#ifndef M_WPFileSystem
+    #define M_WPFileSystem SOMObject
+#endif /* M_WPFileSystem */
+#ifndef M_WPFolder
+    #define M_WPFolder SOMObject
+#endif /* M_WPFolder */
+#ifndef M_CWMenuFolder
+    #define M_CWMenuFolder SOMObject
+#endif /* M_CWMenuFolder */
+
+/*
+ * End of user-defined types.
+ */
+
+#define CWMenuFolder_MajorVersion 1
+#define CWMenuFolder_MinorVersion 1
+
+/*
+ * External name shortening if required
+ */
+#ifdef SOM_USE_SHORT_EXTERNAL_NAMES
+#define CWMenuFolderNewClass cwmenufldrc
+#pragma linkage(cwmenufldrc, system)
+#define CWMenuFolderClassData cwmenufldrd
+#define CWMenuFolderCClassData cwmenufldrx
+#endif /* SOM_USE_SHORT_EXTERNAL_NAMES */
+
+/*
+ * Include the meta class file
+ */
+#include <menufldr.h>
+/*--------------Migration------------*/
+#define CWMenuFolder_classObj CWMenuFolderClassData.classObject
+#define _CWMenuFolder CWMenuFolder_classObj
+
+/*
+ * Declare the class creation procedure
+ */
+SOMEXTERN SOMClass * SOMLINK CWMenuFolderNewClass(integer4 somtmajorVersion,
+		integer4 somtminorVersion);
+#pragma linkage(CWMenuFolderNewClass, system)
+
+/*
+ * Declare the class data structure
+ */
+SOMEXTERN struct CWMenuFolderClassDataStructure {
+	SOMClass *classObject;
+	somMToken mfPrivateBuildMenu;
+	somMToken mfInsertMItems;
+	somMToken mfFreeMenu;
+	somMToken mfQueryMenuEnabled;
+	somMToken mfSetMenuEnabled;
+	somMToken mfInsertMenuItems;
+	somMToken mfCheckMenuItems;
+	somMToken mfAddClassChoosePage;
+	somMToken mfPrivateFreeMenu;
+	somMToken mfPrivateCheckMenuItems;
+} SOMDLINK CWMenuFolderClassData;
+
+/*
+ * Declare the C specific class data structure
+ */
+SOMEXTERN struct CWMenuFolderCClassDataStructure {
+	somMethodTabs parentMtab;
+	somDToken instanceDataToken;
+} SOMDLINK CWMenuFolderCClassData;
+
+/*
+ * New and Renew macros for CWMenuFolder
+ */
+#define CWMenuFolderNew() \
+   (_somNew(_CWMenuFolder ? _CWMenuFolder : CWMenuFolderNewClass(CWMenuFolder_MajorVersion, CWMenuFolder_MinorVersion)))
+#define CWMenuFolderRenew(buf) \
+   (_somRenew(_CWMenuFolder ? _CWMenuFolder : CWMenuFolderNewClass(CWMenuFolder_MajorVersion, CWMenuFolder_MinorVersion), buf))
+
+/*
+ * Override method: wpInitData
+ */
+#define CWMenuFolder_wpInitData(somSelf) \
+	WPObject_wpInitData(somSelf)
+
+/*
+ * Override method: wpDragOver
+ */
+#define CWMenuFolder_wpDragOver(somSelf,hwndCnr,pdrgInfo) \
+	WPObject_wpDragOver(somSelf,hwndCnr,pdrgInfo)
+
+/*
+ * Override method: wpDrop
+ */
+#define CWMenuFolder_wpDrop(somSelf,hwndCnr,pdrgInfo,pdrgItem) \
+	WPObject_wpDrop(somSelf,hwndCnr,pdrgInfo,pdrgItem)
+
+/*
+ * Override method: wpAddSettingsPages
+ */
+#define CWMenuFolder_wpAddSettingsPages(somSelf,hwndNotebook) \
+	WPObject_wpAddSettingsPages(somSelf,hwndNotebook)
+
+/*
+ * Override method: wpRestoreState
+ */
+#define CWMenuFolder_wpRestoreState(somSelf,ulReserved) \
+	WPObject_wpRestoreState(somSelf,ulReserved)
+
+/*
+ * Override method: wpSaveState
+ */
+#define CWMenuFolder_wpSaveState(somSelf) \
+	WPObject_wpSaveState(somSelf)
+
+/*
+ * Override method: wpSetupOnce
+ */
+#define CWMenuFolder_wpSetupOnce(somSelf,pszSetupString) \
+	WPObject_wpSetupOnce(somSelf,pszSetupString)
+
+/*
+ * Override method: wpCopiedFromTemplate
+ */
+#define CWMenuFolder_wpCopiedFromTemplate(somSelf) \
+	WPObject_wpCopiedFromTemplate(somSelf)
+
+/*
+ * Override method: wpDeleteFromContent
+ */
+#define CWMenuFolder_wpDeleteFromContent(somSelf,Object) \
+	WPFolder_wpDeleteFromContent(somSelf,Object)
+
+/*
+ * New Method: mfFreeMenu
+ */
+typedef void   SOMLINK somTP_CWMenuFolder_mfFreeMenu(CWMenuFolder *somSelf);
+#pragma linkage(somTP_CWMenuFolder_mfFreeMenu, system)
+typedef somTP_CWMenuFolder_mfFreeMenu *somTD_CWMenuFolder_mfFreeMenu;
+#define somMD_CWMenuFolder_mfFreeMenu "::CWMenuFolder::mfFreeMenu"
+#define CWMenuFolder_mfFreeMenu(somSelf) \
+    (SOM_Resolve(somSelf, CWMenuFolder, mfFreeMenu) \
+	(somSelf))
+#ifndef SOMGD_mfFreeMenu
+    #if (defined(_mfFreeMenu) || defined(__mfFreeMenu))
+        #undef _mfFreeMenu
+        #undef __mfFreeMenu
+        #define SOMGD_mfFreeMenu 1
+    #else
+        #define _mfFreeMenu CWMenuFolder_mfFreeMenu
+    #endif /* _mfFreeMenu */
+#endif /* SOMGD_mfFreeMenu */
+
+/*
+ * New Method: mfQueryMenuEnabled
+ */
+typedef BOOL   SOMLINK somTP_CWMenuFolder_mfQueryMenuEnabled(CWMenuFolder *somSelf);
+#pragma linkage(somTP_CWMenuFolder_mfQueryMenuEnabled, system)
+typedef somTP_CWMenuFolder_mfQueryMenuEnabled *somTD_CWMenuFolder_mfQueryMenuEnabled;
+#define somMD_CWMenuFolder_mfQueryMenuEnabled "::CWMenuFolder::mfQueryMenuEnabled"
+#define CWMenuFolder_mfQueryMenuEnabled(somSelf) \
+    (SOM_Resolve(somSelf, CWMenuFolder, mfQueryMenuEnabled) \
+	(somSelf))
+#ifndef SOMGD_mfQueryMenuEnabled
+    #if (defined(_mfQueryMenuEnabled) || defined(__mfQueryMenuEnabled))
+        #undef _mfQueryMenuEnabled
+        #undef __mfQueryMenuEnabled
+        #define SOMGD_mfQueryMenuEnabled 1
+    #else
+        #define _mfQueryMenuEnabled CWMenuFolder_mfQueryMenuEnabled
+    #endif /* _mfQueryMenuEnabled */
+#endif /* SOMGD_mfQueryMenuEnabled */
+
+/*
+ * New Method: mfSetMenuEnabled
+ */
+typedef void   SOMLINK somTP_CWMenuFolder_mfSetMenuEnabled(CWMenuFolder *somSelf,
+		BOOL bEnabled);
+#pragma linkage(somTP_CWMenuFolder_mfSetMenuEnabled, system)
+typedef somTP_CWMenuFolder_mfSetMenuEnabled *somTD_CWMenuFolder_mfSetMenuEnabled;
+#define somMD_CWMenuFolder_mfSetMenuEnabled "::CWMenuFolder::mfSetMenuEnabled"
+#define CWMenuFolder_mfSetMenuEnabled(somSelf,bEnabled) \
+    (SOM_Resolve(somSelf, CWMenuFolder, mfSetMenuEnabled) \
+	(somSelf,bEnabled))
+#ifndef SOMGD_mfSetMenuEnabled
+    #if (defined(_mfSetMenuEnabled) || defined(__mfSetMenuEnabled))
+        #undef _mfSetMenuEnabled
+        #undef __mfSetMenuEnabled
+        #define SOMGD_mfSetMenuEnabled 1
+    #else
+        #define _mfSetMenuEnabled CWMenuFolder_mfSetMenuEnabled
+    #endif /* _mfSetMenuEnabled */
+#endif /* SOMGD_mfSetMenuEnabled */
+
+/*
+ * New Method: mfInsertMenuItems
+ */
+typedef ULONG   SOMLINK somTP_CWMenuFolder_mfInsertMenuItems(CWMenuFolder *somSelf,
+		HWND hwndMenu,
+		ULONG iPosition,
+		ULONG ulLastMenuId);
+#pragma linkage(somTP_CWMenuFolder_mfInsertMenuItems, system)
+typedef somTP_CWMenuFolder_mfInsertMenuItems *somTD_CWMenuFolder_mfInsertMenuItems;
+#define somMD_CWMenuFolder_mfInsertMenuItems "::CWMenuFolder::mfInsertMenuItems"
+#define CWMenuFolder_mfInsertMenuItems(somSelf,hwndMenu,iPosition,ulLastMenuId) \
+    (SOM_Resolve(somSelf, CWMenuFolder, mfInsertMenuItems) \
+	(somSelf,hwndMenu,iPosition,ulLastMenuId))
+#ifndef SOMGD_mfInsertMenuItems
+    #if (defined(_mfInsertMenuItems) || defined(__mfInsertMenuItems))
+        #undef _mfInsertMenuItems
+        #undef __mfInsertMenuItems
+        #define SOMGD_mfInsertMenuItems 1
+    #else
+        #define _mfInsertMenuItems CWMenuFolder_mfInsertMenuItems
+    #endif /* _mfInsertMenuItems */
+#endif /* SOMGD_mfInsertMenuItems */
+
+/*
+ * New Method: mfCheckMenuItems
+ */
+typedef BOOL   SOMLINK somTP_CWMenuFolder_mfCheckMenuItems(CWMenuFolder *somSelf,
+		WPObject* wpObject,
+		ULONG ulMenuId);
+#pragma linkage(somTP_CWMenuFolder_mfCheckMenuItems, system)
+typedef somTP_CWMenuFolder_mfCheckMenuItems *somTD_CWMenuFolder_mfCheckMenuItems;
+#define somMD_CWMenuFolder_mfCheckMenuItems "::CWMenuFolder::mfCheckMenuItems"
+#define CWMenuFolder_mfCheckMenuItems(somSelf,wpObject,ulMenuId) \
+    (SOM_Resolve(somSelf, CWMenuFolder, mfCheckMenuItems) \
+	(somSelf,wpObject,ulMenuId))
+#ifndef SOMGD_mfCheckMenuItems
+    #if (defined(_mfCheckMenuItems) || defined(__mfCheckMenuItems))
+        #undef _mfCheckMenuItems
+        #undef __mfCheckMenuItems
+        #define SOMGD_mfCheckMenuItems 1
+    #else
+        #define _mfCheckMenuItems CWMenuFolder_mfCheckMenuItems
+    #endif /* _mfCheckMenuItems */
+#endif /* SOMGD_mfCheckMenuItems */
+
+/*
+ * New Method: mfAddClassChoosePage
+ */
+typedef ULONG   SOMLINK somTP_CWMenuFolder_mfAddClassChoosePage(CWMenuFolder *somSelf,
+		HWND hwndNotebook);
+#pragma linkage(somTP_CWMenuFolder_mfAddClassChoosePage, system)
+typedef somTP_CWMenuFolder_mfAddClassChoosePage *somTD_CWMenuFolder_mfAddClassChoosePage;
+#define somMD_CWMenuFolder_mfAddClassChoosePage "::CWMenuFolder::mfAddClassChoosePage"
+#define CWMenuFolder_mfAddClassChoosePage(somSelf,hwndNotebook) \
+    (SOM_Resolve(somSelf, CWMenuFolder, mfAddClassChoosePage) \
+	(somSelf,hwndNotebook))
+#ifndef SOMGD_mfAddClassChoosePage
+    #if (defined(_mfAddClassChoosePage) || defined(__mfAddClassChoosePage))
+        #undef _mfAddClassChoosePage
+        #undef __mfAddClassChoosePage
+        #define SOMGD_mfAddClassChoosePage 1
+    #else
+        #define _mfAddClassChoosePage CWMenuFolder_mfAddClassChoosePage
+    #endif /* _mfAddClassChoosePage */
+#endif /* SOMGD_mfAddClassChoosePage */
+
+/*
+ * New Method: mfPrivateFreeMenu
+ */
+typedef void   SOMLINK somTP_CWMenuFolder_mfPrivateFreeMenu(CWMenuFolder *somSelf);
+#pragma linkage(somTP_CWMenuFolder_mfPrivateFreeMenu, system)
+typedef somTP_CWMenuFolder_mfPrivateFreeMenu *somTD_CWMenuFolder_mfPrivateFreeMenu;
+#define somMD_CWMenuFolder_mfPrivateFreeMenu "::CWMenuFolder::mfPrivateFreeMenu"
+#define CWMenuFolder_mfPrivateFreeMenu(somSelf) \
+    (SOM_Resolve(somSelf, CWMenuFolder, mfPrivateFreeMenu) \
+	(somSelf))
+#ifndef SOMGD_mfPrivateFreeMenu
+    #if (defined(_mfPrivateFreeMenu) || defined(__mfPrivateFreeMenu))
+        #undef _mfPrivateFreeMenu
+        #undef __mfPrivateFreeMenu
+        #define SOMGD_mfPrivateFreeMenu 1
+    #else
+        #define _mfPrivateFreeMenu CWMenuFolder_mfPrivateFreeMenu
+    #endif /* _mfPrivateFreeMenu */
+#endif /* SOMGD_mfPrivateFreeMenu */
+
+/*
+ * New Method: mfPrivateBuildMenu
+ */
+typedef void*   SOMLINK somTP_CWMenuFolder_mfPrivateBuildMenu(CWMenuFolder *somSelf,
+		CWMenuFolder* wpFolder,
+		ULONG** ulLastMenuId);
+#pragma linkage(somTP_CWMenuFolder_mfPrivateBuildMenu, system)
+typedef somTP_CWMenuFolder_mfPrivateBuildMenu *somTD_CWMenuFolder_mfPrivateBuildMenu;
+#define somMD_CWMenuFolder_mfPrivateBuildMenu "::CWMenuFolder::mfPrivateBuildMenu"
+#define CWMenuFolder_mfPrivateBuildMenu(somSelf,wpFolder,ulLastMenuId) \
+    (SOM_Resolve(somSelf, CWMenuFolder, mfPrivateBuildMenu) \
+	(somSelf,wpFolder,ulLastMenuId))
+#ifndef SOMGD_mfPrivateBuildMenu
+    #if (defined(_mfPrivateBuildMenu) || defined(__mfPrivateBuildMenu))
+        #undef _mfPrivateBuildMenu
+        #undef __mfPrivateBuildMenu
+        #define SOMGD_mfPrivateBuildMenu 1
+    #else
+        #define _mfPrivateBuildMenu CWMenuFolder_mfPrivateBuildMenu
+    #endif /* _mfPrivateBuildMenu */
+#endif /* SOMGD_mfPrivateBuildMenu */
+
+/*
+ * New Method: mfInsertMItems
+ */
+typedef void   SOMLINK somTP_CWMenuFolder_mfInsertMItems(CWMenuFolder *somSelf,
+		HWND hwndMenu,
+		ULONG iPosition);
+#pragma linkage(somTP_CWMenuFolder_mfInsertMItems, system)
+typedef somTP_CWMenuFolder_mfInsertMItems *somTD_CWMenuFolder_mfInsertMItems;
+#define somMD_CWMenuFolder_mfInsertMItems "::CWMenuFolder::mfInsertMItems"
+#define CWMenuFolder_mfInsertMItems(somSelf,hwndMenu,iPosition) \
+    (SOM_Resolve(somSelf, CWMenuFolder, mfInsertMItems) \
+	(somSelf,hwndMenu,iPosition))
+#ifndef SOMGD_mfInsertMItems
+    #if (defined(_mfInsertMItems) || defined(__mfInsertMItems))
+        #undef _mfInsertMItems
+        #undef __mfInsertMItems
+        #define SOMGD_mfInsertMItems 1
+    #else
+        #define _mfInsertMItems CWMenuFolder_mfInsertMItems
+    #endif /* _mfInsertMItems */
+#endif /* SOMGD_mfInsertMItems */
+
+/*
+ * New Method: mfPrivateCheckMenuItems
+ */
+typedef BOOL   SOMLINK somTP_CWMenuFolder_mfPrivateCheckMenuItems(CWMenuFolder *somSelf,
+		WPObject* wpObject,
+		ULONG ulMenuId);
+#pragma linkage(somTP_CWMenuFolder_mfPrivateCheckMenuItems, system)
+typedef somTP_CWMenuFolder_mfPrivateCheckMenuItems *somTD_CWMenuFolder_mfPrivateCheckMenuItems;
+#define somMD_CWMenuFolder_mfPrivateCheckMenuItems "::CWMenuFolder::mfPrivateCheckMenuItems"
+#define CWMenuFolder_mfPrivateCheckMenuItems(somSelf,wpObject,ulMenuId) \
+    (SOM_Resolve(somSelf, CWMenuFolder, mfPrivateCheckMenuItems) \
+	(somSelf,wpObject,ulMenuId))
+#ifndef SOMGD_mfPrivateCheckMenuItems
+    #if (defined(_mfPrivateCheckMenuItems) || defined(__mfPrivateCheckMenuItems))
+        #undef _mfPrivateCheckMenuItems
+        #undef __mfPrivateCheckMenuItems
+        #define SOMGD_mfPrivateCheckMenuItems 1
+    #else
+        #define _mfPrivateCheckMenuItems CWMenuFolder_mfPrivateCheckMenuItems
+    #endif /* _mfPrivateCheckMenuItems */
+#endif /* SOMGD_mfPrivateCheckMenuItems */
+#ifndef SOM_DONT_USE_INHERITED_MACROS
+#define CWMenuFolder_wpSetFldrFlags WPFolder_wpSetFldrFlags
+#define CWMenuFolder_wpQueryFldrFlags WPFolder_wpQueryFldrFlags
+#define CWMenuFolder_wpSetFldrFont WPFolder_wpSetFldrFont
+#define CWMenuFolder_wpQueryFldrFont WPFolder_wpQueryFldrFont
+#define CWMenuFolder_wpSetFldrAttr WPFolder_wpSetFldrAttr
+#define CWMenuFolder_wpQueryFldrAttr WPFolder_wpQueryFldrAttr
+#define CWMenuFolder_wpSetNextIconPos WPFolder_wpSetNextIconPos
+#define CWMenuFolder_wpQueryNextIconPos WPFolder_wpQueryNextIconPos
+#define CWMenuFolder_wpPopulate WPFolder_wpPopulate
+#define CWMenuFolder_wpQueryContent WPFolder_wpQueryContent
+#define CWMenuFolder_wpAddFolderView1Page WPFolder_wpAddFolderView1Page
+#define CWMenuFolder_wpAddFolderView2Page WPFolder_wpAddFolderView2Page
+#define CWMenuFolder_wpAddFolderView3Page WPFolder_wpAddFolderView3Page
+#define CWMenuFolder_wpAddFolderIncludePage WPFolder_wpAddFolderIncludePage
+#define CWMenuFolder_wpAddFolderSortPage WPFolder_wpAddFolderSortPage
+#define CWMenuFolder_wpAddFolderBackgroundPage WPFolder_wpAddFolderBackgroundPage
+#define CWMenuFolder_wpAddFolderSelfClosePage WPFolder_wpAddFolderSelfClosePage
+#define CWMenuFolder_wpInitIconPosData WPFolder_wpInitIconPosData
+#define CWMenuFolder_wpFreeIconPosData WPFolder_wpFreeIconPosData
+#define CWMenuFolder_wpStoreIconPosData WPFolder_wpStoreIconPosData
+#define CWMenuFolder_wpQueryIconPosition WPFolder_wpQueryIconPosition
+#define CWMenuFolder_wpSetFldrSort WPFolder_wpSetFldrSort
+#define CWMenuFolder_wpQueryFldrSort WPFolder_wpQueryFldrSort
+#define CWMenuFolder_wpRestoreFldrRunObjs WPFolder_wpRestoreFldrRunObjs
+#define CWMenuFolder_wpStoreFldrRunObjs WPFolder_wpStoreFldrRunObjs
+#define CWMenuFolder_wpHideFldrRunObjs WPFolder_wpHideFldrRunObjs
+#define CWMenuFolder_wpDeleteContents WPFolder_wpDeleteContents
+#define CWMenuFolder_wpSetFldrDetailsClass WPFolder_wpSetFldrDetailsClass
+#define CWMenuFolder_wpQueryFldrDetailsClass WPFolder_wpQueryFldrDetailsClass
+#define CWMenuFolder_wpSearchFolder WPFolder_wpSearchFolder
+#define CWMenuFolder_wpContainsFolders WPFolder_wpContainsFolders
+#define CWMenuFolder_wpQueryOpenFolders WPFolder_wpQueryOpenFolders
+#define CWMenuFolder_wpModifyFldrFlags WPFolder_wpModifyFldrFlags
+#define CWMenuFolder_wpAddToContent WPFolder_wpAddToContent
+#define CWMenuFolder_wpSetDetailsColumnVisibility WPFolder_wpSetDetailsColumnVisibility
+#define CWMenuFolder_wpIsDetailsColumnVisible WPFolder_wpIsDetailsColumnVisible
+#define CWMenuFolder_wpSetFldrSortClass WPFolder_wpSetFldrSortClass
+#define CWMenuFolder_wpQueryFldrSortClass WPFolder_wpQueryFldrSortClass
+#define CWMenuFolder_wpSetSortAttribAvailable WPFolder_wpSetSortAttribAvailable
+#define CWMenuFolder_wpIsSortAttribAvailable WPFolder_wpIsSortAttribAvailable
+#define CWMenuFolder_wpQueryIconViewPos WPFolder_wpQueryIconViewPos
+#define CWMenuFolder_wpAddFirstChild WPFolder_wpAddFirstChild
+#define CWMenuFolder_wpSetRealName WPFileSystem_wpSetRealName
+#define CWMenuFolder_wpSetType WPFileSystem_wpSetType
+#define CWMenuFolder_wpQueryType WPFileSystem_wpQueryType
+#define CWMenuFolder_wpSetAttr WPFileSystem_wpSetAttr
+#define CWMenuFolder_wpQueryAttr WPFileSystem_wpQueryAttr
+#define CWMenuFolder_wpAddFile1Page WPFileSystem_wpAddFile1Page
+#define CWMenuFolder_wpAddFile2Page WPFileSystem_wpAddFile2Page
+#define CWMenuFolder_wpAddFile3Page WPFileSystem_wpAddFile3Page
+#define CWMenuFolder_wpAddFileMenuPage WPFileSystem_wpAddFileMenuPage
+#define CWMenuFolder_wpQueryCreation WPFileSystem_wpQueryCreation
+#define CWMenuFolder_wpQueryLastAccess WPFileSystem_wpQueryLastAccess
+#define CWMenuFolder_wpQueryLastWrite WPFileSystem_wpQueryLastWrite
+#define CWMenuFolder_wpQueryFileSize WPFileSystem_wpQueryFileSize
+#define CWMenuFolder_wpQueryEASize WPFileSystem_wpQueryEASize
+#define CWMenuFolder_wpSetDateInfo WPFileSystem_wpSetDateInfo
+#define CWMenuFolder_wpSetFileSizeInfo WPFileSystem_wpSetFileSizeInfo
+#define CWMenuFolder_wpRefresh WPFileSystem_wpRefresh
+#define CWMenuFolder_wpQueryRefreshFlags WPFileSystem_wpQueryRefreshFlags
+#define CWMenuFolder_wpSetRefreshFlags WPFileSystem_wpSetRefreshFlags
+#define CWMenuFolder_wpPrintPlainTextFile WPFileSystem_wpPrintPlainTextFile
+#define CWMenuFolder_wpSetTitleAndRenameFile WPFileSystem_wpSetTitleAndRenameFile
+#define CWMenuFolder_wpConfirmRenameFileWithExt WPFileSystem_wpConfirmRenameFileWithExt
+#define CWMenuFolder_wpVerifyUpdateAccess WPFileSystem_wpVerifyUpdateAccess
+#define CWMenuFolder_wpAddUserItemsToPopupMenu WPFileSystem_wpAddUserItemsToPopupMenu
+#define CWMenuFolder_wpIsDiskSwapped WPFileSystem_wpIsDiskSwapped
+#define CWMenuFolder_wpQueryRealName WPFileSystem_wpQueryRealName
+#define CWMenuFolder_wpQueryFilename WPFileSystem_wpQueryFilename
+#define CWMenuFolder_wpQueryDisk WPFileSystem_wpQueryDisk
+#define CWMenuFolder_wpQueryDateInfo WPFileSystem_wpQueryDateInfo
+#define CWMenuFolder_wpConfirmKeepAssoc WPFileSystem_wpConfirmKeepAssoc
+#define CWMenuFolder_wpAddObjectGeneralPage WPObject_wpAddObjectGeneralPage
+#define CWMenuFolder_wpAddObjectGeneralPage2 WPObject_wpAddObjectGeneralPage2
+#define CWMenuFolder_wpAddObjectWindowPage WPObject_wpAddObjectWindowPage
+#define CWMenuFolder_wpAddToObjUseList WPObject_wpAddToObjUseList
+#define CWMenuFolder_wpAllocMem WPObject_wpAllocMem
+#define CWMenuFolder_wpAppendObject WPObject_wpAppendObject
+#define CWMenuFolder_wpAssertObjectMutexSem WPObject_wpAssertObjectMutexSem
+#define CWMenuFolder_wpClose WPObject_wpClose
+#define CWMenuFolder_wpCnrInsertObject WPObject_wpCnrInsertObject
+#define CWMenuFolder_wpCnrRemoveObject WPObject_wpCnrRemoveObject
+#define CWMenuFolder_wpCnrSetEmphasis WPObject_wpCnrSetEmphasis
+#define CWMenuFolder_wpConfirmDelete WPObject_wpConfirmDelete
+#define CWMenuFolder_wpConfirmObjectTitle WPObject_wpConfirmObjectTitle
+#define CWMenuFolder_wpCopyObject WPObject_wpCopyObject
+#define CWMenuFolder_wpCreateAnother WPObject_wpCreateAnother
+#define CWMenuFolder_wpCreateFromTemplate WPObject_wpCreateFromTemplate
+#define CWMenuFolder_wpCreateShadowObject WPObject_wpCreateShadowObject
+#define CWMenuFolder_wpDelete WPObject_wpDelete
+#define CWMenuFolder_wpDeleteFromObjUseList WPObject_wpDeleteFromObjUseList
+#define CWMenuFolder_wpDisplayHelp WPObject_wpDisplayHelp
+#define CWMenuFolder_wpDisplayMenu WPObject_wpDisplayMenu
+#define CWMenuFolder_wpDoesObjectMatch WPObject_wpDoesObjectMatch
+#define CWMenuFolder_wpDraggedOverObject WPObject_wpDraggedOverObject
+#define CWMenuFolder_wpDroppedOnObject WPObject_wpDroppedOnObject
+#define CWMenuFolder_wpEndConversation WPObject_wpEndConversation
+#define CWMenuFolder_wpFilterPopupMenu WPObject_wpFilterPopupMenu
+#define CWMenuFolder_wpFindUseItem WPObject_wpFindUseItem
+#define CWMenuFolder_wpFormatDragItem WPObject_wpFormatDragItem
+#define CWMenuFolder_wpFree WPObject_wpFree
+#define CWMenuFolder_wpFreeMem WPObject_wpFreeMem
+#define CWMenuFolder_wpHide WPObject_wpHide
+#define CWMenuFolder_wpInsertPopupMenuItems WPObject_wpInsertPopupMenuItems
+#define CWMenuFolder_wpInsertSettingsPage WPObject_wpInsertSettingsPage
+#define CWMenuFolder_wpMenuItemHelpSelected WPObject_wpMenuItemHelpSelected
+#define CWMenuFolder_wpMenuItemSelected WPObject_wpMenuItemSelected
+#define CWMenuFolder_wpModifyPopupMenu WPObject_wpModifyPopupMenu
+#define CWMenuFolder_wpMoveObject WPObject_wpMoveObject
+#define CWMenuFolder_wpOpen WPObject_wpOpen
+#define CWMenuFolder_wpPrintObject WPObject_wpPrintObject
+#define CWMenuFolder_wpQueryConcurrentView WPObject_wpQueryConcurrentView
+#define CWMenuFolder_wpQueryButtonAppearance WPObject_wpQueryButtonAppearance
+#define CWMenuFolder_wpQueryConfirmations WPObject_wpQueryConfirmations
+#define CWMenuFolder_wpQueryDefaultHelp WPObject_wpQueryDefaultHelp
+#define CWMenuFolder_wpQueryDefaultView WPObject_wpQueryDefaultView
+#define CWMenuFolder_wpQueryDetailsData WPObject_wpQueryDetailsData
+#define CWMenuFolder_wpQueryError WPObject_wpQueryError
+#define CWMenuFolder_wpSetFolder WPObject_wpSetFolder
+#define CWMenuFolder_wpQueryFolder WPObject_wpQueryFolder
+#define CWMenuFolder_wpQueryIcon WPObject_wpQueryIcon
+#define CWMenuFolder_wpQueryIconData WPObject_wpQueryIconData
+#define CWMenuFolder_wpQueryMinWindow WPObject_wpQueryMinWindow
+#define CWMenuFolder_wpQueryNameClashOptions WPObject_wpQueryNameClashOptions
+#define CWMenuFolder_wpQueryStyle WPObject_wpQueryStyle
+#define CWMenuFolder_wpSetTaskRec WPObject_wpSetTaskRec
+#define CWMenuFolder_wpFindTaskRec WPObject_wpFindTaskRec
+#define CWMenuFolder_wpQueryTitle WPObject_wpQueryTitle
+#define CWMenuFolder_wpRegisterView WPObject_wpRegisterView
+#define CWMenuFolder_wpReleaseObjectMutexSem WPObject_wpReleaseObjectMutexSem
+#define CWMenuFolder_wpRender WPObject_wpRender
+#define CWMenuFolder_wpRenderComplete WPObject_wpRenderComplete
+#define CWMenuFolder_wpReplaceObject WPObject_wpReplaceObject
+#define CWMenuFolder_wpRequestObjectMutexSem WPObject_wpRequestObjectMutexSem
+#define CWMenuFolder_wpRestore WPObject_wpRestore
+#define CWMenuFolder_wpRestoreData WPObject_wpRestoreData
+#define CWMenuFolder_wpRestoreLong WPObject_wpRestoreLong
+#define CWMenuFolder_wpRestoreString WPObject_wpRestoreString
+#define CWMenuFolder_wpSaveData WPObject_wpSaveData
+#define CWMenuFolder_wpSaveImmediate WPObject_wpSaveImmediate
+#define CWMenuFolder_wpSaveDeferred WPObject_wpSaveDeferred
+#define CWMenuFolder_wpSaveLong WPObject_wpSaveLong
+#define CWMenuFolder_wpSaveString WPObject_wpSaveString
+#define CWMenuFolder_wpScanSetupString WPObject_wpScanSetupString
+#define CWMenuFolder_wpSetConcurrentView WPObject_wpSetConcurrentView
+#define CWMenuFolder_wpSetButtonAppearance WPObject_wpSetButtonAppearance
+#define CWMenuFolder_wpSetDefaultHelp WPObject_wpSetDefaultHelp
+#define CWMenuFolder_wpSetDefaultView WPObject_wpSetDefaultView
+#define CWMenuFolder_wpSetError WPObject_wpSetError
+#define CWMenuFolder_wpSetIconHandle WPObject_wpSetIconHandle
+#define CWMenuFolder_wpQueryScreenGroupID WPObject_wpQueryScreenGroupID
+#define CWMenuFolder_wpSetIcon WPObject_wpSetIcon
+#define CWMenuFolder_wpSetIconData WPObject_wpSetIconData
+#define CWMenuFolder_wpSetMinWindow WPObject_wpSetMinWindow
+#define CWMenuFolder_wpSetStyle WPObject_wpSetStyle
+#define CWMenuFolder_wpModifyStyle WPObject_wpModifyStyle
+#define CWMenuFolder_wpSetTitle WPObject_wpSetTitle
+#define CWMenuFolder_wpSetup WPObject_wpSetup
+#define CWMenuFolder_wpSwitchTo WPObject_wpSwitchTo
+#define CWMenuFolder_wpUnInitData WPObject_wpUnInitData
+#define CWMenuFolder_wpViewObject WPObject_wpViewObject
+#define CWMenuFolder_wpQueryTrueStyle WPObject_wpQueryTrueStyle
+#define CWMenuFolder_wpQueryHandle WPObject_wpQueryHandle
+#define CWMenuFolder_wpUnlockObject WPObject_wpUnlockObject
+#define CWMenuFolder_wpObjectReady WPObject_wpObjectReady
+#define CWMenuFolder_wpIsObjectInitialized WPObject_wpIsObjectInitialized
+#define CWMenuFolder_wpCreateShadowObjectExt WPObject_wpCreateShadowObjectExt
+#define CWMenuFolder_wpCnrDeleteUseItem WPObject_wpCnrDeleteUseItem
+#define CWMenuFolder_wpIsDeleteable WPObject_wpIsDeleteable
+#define CWMenuFolder_wpQueryCoreRecord WPObject_wpQueryCoreRecord
+#define CWMenuFolder_wpSetObjectID WPObject_wpSetObjectID
+#define CWMenuFolder_wpQueryObjectID WPObject_wpQueryObjectID
+#define CWMenuFolder_wpSetDefaultIconPos WPObject_wpSetDefaultIconPos
+#define CWMenuFolder_wpQueryDefaultIconPos WPObject_wpQueryDefaultIconPos
+#define CWMenuFolder_wpCnrRefreshDetails WPObject_wpCnrRefreshDetails
+#define CWMenuFolder_wpFindViewItem WPObject_wpFindViewItem
+#define CWMenuFolder_wpLockObject WPObject_wpLockObject
+#define CWMenuFolder_wpIsLocked WPObject_wpIsLocked
+#define CWMenuFolder_wpQueryContainerFlagPtr WPObject_wpQueryContainerFlagPtr
+#define CWMenuFolder_wpWaitForClose WPObject_wpWaitForClose
+#define CWMenuFolder_somDefaultInit SOMObject_somDefaultInit
+#define CWMenuFolder_somDestruct SOMObject_somDestruct
+#define CWMenuFolder_somDefaultCopyInit SOMObject_somDefaultCopyInit
+#define CWMenuFolder_somDefaultAssign SOMObject_somDefaultAssign
+#define CWMenuFolder_somDefaultConstCopyInit SOMObject_somDefaultConstCopyInit
+#define CWMenuFolder_somDefaultVCopyInit SOMObject_somDefaultVCopyInit
+#define CWMenuFolder_somDefaultConstVCopyInit SOMObject_somDefaultConstVCopyInit
+#define CWMenuFolder_somDefaultConstAssign SOMObject_somDefaultConstAssign
+#define CWMenuFolder_somDefaultVAssign SOMObject_somDefaultVAssign
+#define CWMenuFolder_somDefaultConstVAssign SOMObject_somDefaultConstVAssign
+#define CWMenuFolder_somInit SOMObject_somInit
+#define CWMenuFolder_somFree SOMObject_somFree
+#define CWMenuFolder_somUninit SOMObject_somUninit
+#define CWMenuFolder_somGetClass SOMObject_somGetClass
+#define CWMenuFolder_somGetClassName SOMObject_somGetClassName
+#define CWMenuFolder_somGetSize SOMObject_somGetSize
+#define CWMenuFolder_somIsA SOMObject_somIsA
+#define CWMenuFolder_somIsInstanceOf SOMObject_somIsInstanceOf
+#define CWMenuFolder_somRespondsTo SOMObject_somRespondsTo
+#define CWMenuFolder_somDispatch SOMObject_somDispatch
+#define CWMenuFolder_somClassDispatch SOMObject_somClassDispatch
+#define CWMenuFolder_somCastObj SOMObject_somCastObj
+#define CWMenuFolder_somResetObj SOMObject_somResetObj
+#define CWMenuFolder_somDispatchV SOMObject_somDispatchV
+#define CWMenuFolder_somDispatchL SOMObject_somDispatchL
+#define CWMenuFolder_somDispatchA SOMObject_somDispatchA
+#define CWMenuFolder_somDispatchD SOMObject_somDispatchD
+#define CWMenuFolder_somPrintSelf SOMObject_somPrintSelf
+#define CWMenuFolder_somDumpSelf SOMObject_somDumpSelf
+#define CWMenuFolder_somDumpSelfInt SOMObject_somDumpSelfInt
+#endif /* SOM_DONT_USE_INHERITED_MACROS */
+
+#endif       /* SOM_CWMenuFolder_h */
+
+#ifndef SOM_M_CWMenuFolder_h
+#define SOM_M_CWMenuFolder_h
+
+
+#include <som.h>
+
+/*
+ * -- This emitter treats Method Tokens as Thunks by default.
+ * -- Use the sc modifier "nothunks" to change this default
+ */
+#undef somresolve_
+#define somresolve_(obj,mToken) ((somMethodProc*)((void)obj, mToken))
+
+/*
+ * Define the class name as an object type
+ */
+#ifndef M_CWMenuFolder
+#define M_CWMenuFolder SOMObject
+#endif
+#include <wpfolder.h>
+
+/*
+ * Start of user-defined types:
+ */
+
+/*
+ * End of user-defined types.
+ */
+
+#define M_CWMenuFolder_MajorVersion 1
+#define M_CWMenuFolder_MinorVersion 1
+
+/*
+ * External name shortening if required
+ */
+#ifdef SOM_USE_SHORT_EXTERNAL_NAMES
+#define M_CWMenuFolderNewClass cwmenufldrMc
+#pragma linkage(cwmenufldrMc, system)
+#define M_CWMenuFolderClassData cwmenufldrMd
+#define M_CWMenuFolderCClassData cwmenufldrMx
+#endif /* SOM_USE_SHORT_EXTERNAL_NAMES */
+/*--------------Migration------------*/
+#define M_CWMenuFolder_classObj M_CWMenuFolderClassData.classObject
+#define _M_CWMenuFolder M_CWMenuFolder_classObj
+
+/*
+ * Declare the class creation procedure
+ */
+SOMEXTERN SOMClass * SOMLINK M_CWMenuFolderNewClass(integer4 somtmajorVersion,
+		integer4 somtminorVersion);
+#pragma linkage(M_CWMenuFolderNewClass, system)
+
+/*
+ * Declare the class data structure
+ */
+SOMEXTERN struct M_CWMenuFolderClassDataStructure {
+	SOMClass *classObject;
+} SOMDLINK M_CWMenuFolderClassData;
+
+/*
+ * Declare the C specific class data structure
+ */
+SOMEXTERN struct M_CWMenuFolderCClassDataStructure {
+	somMethodTabs parentMtab;
+	somDToken instanceDataToken;
+} SOMDLINK M_CWMenuFolderCClassData;
+
+/*
+ * New and Renew macros for M_CWMenuFolder
+ */
+#define M_CWMenuFolderNew() \
+   (_somNew(_M_CWMenuFolder ? _M_CWMenuFolder : M_CWMenuFolderNewClass(M_CWMenuFolder_MajorVersion, M_CWMenuFolder_MinorVersion)))
+#define M_CWMenuFolderRenew(buf) \
+   (_somRenew(_M_CWMenuFolder ? _M_CWMenuFolder : M_CWMenuFolderNewClass(M_CWMenuFolder_MajorVersion, M_CWMenuFolder_MinorVersion), buf))
+
+/*
+ * Override method: wpclsQueryTitle
+ */
+#define M_CWMenuFolder_wpclsQueryTitle(somSelf) \
+	M_WPObject_wpclsQueryTitle(somSelf)
+
+/*
+ * Override method: wpclsQueryIconData
+ */
+#define M_CWMenuFolder_wpclsQueryIconData(somSelf,pIconInfo) \
+	M_WPObject_wpclsQueryIconData(somSelf,pIconInfo)
+
+/*
+ * Override method: wpclsQueryIconDataN
+ */
+#define M_CWMenuFolder_wpclsQueryIconDataN(somSelf,pIconInfo,ulIconIndex) \
+	M_WPFolder_wpclsQueryIconDataN(somSelf,pIconInfo,ulIconIndex)
+
+/*
+ * Override method: wpclsQueryStyle
+ */
+#define M_CWMenuFolder_wpclsQueryStyle(somSelf) \
+	M_WPObject_wpclsQueryStyle(somSelf)
+#ifndef SOM_DONT_USE_INHERITED_MACROS
+#define M_CWMenuFolder_wpclsQueryIconN M_WPFolder_wpclsQueryIconN
+#define M_CWMenuFolder_wpclsQueryOpenFolders M_WPFolder_wpclsQueryOpenFolders
+#define M_CWMenuFolder_wpclsQueryAwakeObject M_WPFileSystem_wpclsQueryAwakeObject
+#define M_CWMenuFolder_wpclsFileSysExists M_WPFileSystem_wpclsFileSysExists
+#define M_CWMenuFolder_wpclsQueryObjectFromPath M_WPFileSystem_wpclsQueryObjectFromPath
+#define M_CWMenuFolder_wpclsQueryInstanceType M_WPFileSystem_wpclsQueryInstanceType
+#define M_CWMenuFolder_wpclsQueryInstanceFilter M_WPFileSystem_wpclsQueryInstanceFilter
+#define M_CWMenuFolder_wpclsCreateDefaultTemplates M_WPObject_wpclsCreateDefaultTemplates
+#define M_CWMenuFolder_wpclsInitData M_WPObject_wpclsInitData
+#define M_CWMenuFolder_wpclsMakeAwake M_WPObject_wpclsMakeAwake
+#define M_CWMenuFolder_wpclsNew M_WPObject_wpclsNew
+#define M_CWMenuFolder_wpclsQueryDefaultHelp M_WPObject_wpclsQueryDefaultHelp
+#define M_CWMenuFolder_wpclsQueryDefaultView M_WPObject_wpclsQueryDefaultView
+#define M_CWMenuFolder_wpclsQueryDetails M_WPObject_wpclsQueryDetails
+#define M_CWMenuFolder_wpclsQueryDetailsInfo M_WPObject_wpclsQueryDetailsInfo
+#define M_CWMenuFolder_wpclsQueryExtendedCriteria M_WPObject_wpclsQueryExtendedCriteria
+#define M_CWMenuFolder_wpclsQueryFolder M_WPObject_wpclsQueryFolder
+#define M_CWMenuFolder_wpclsQueryIcon M_WPObject_wpclsQueryIcon
+#define M_CWMenuFolder_wpclsQuerySearchInfo M_WPObject_wpclsQuerySearchInfo
+#define M_CWMenuFolder_wpclsUnInitData M_WPObject_wpclsUnInitData
+#define M_CWMenuFolder_wpclsFindObjectFirst M_WPObject_wpclsFindObjectFirst
+#define M_CWMenuFolder_wpclsFindObjectNext M_WPObject_wpclsFindObjectNext
+#define M_CWMenuFolder_wpclsFindObjectEnd M_WPObject_wpclsFindObjectEnd
+#define M_CWMenuFolder_wpclsSetError M_WPObject_wpclsSetError
+#define M_CWMenuFolder_wpclsQueryError M_WPObject_wpclsQueryError
+#define M_CWMenuFolder_wpclsQuerySettingsPageSize M_WPObject_wpclsQuerySettingsPageSize
+#define M_CWMenuFolder_wpclsQueryObject M_WPObject_wpclsQueryObject
+#define M_CWMenuFolder_wpclsQueryButtonAppearance M_WPObject_wpclsQueryButtonAppearance
+#define M_CWMenuFolder_wpclsDecUsage M_WPObject_wpclsDecUsage
+#define M_CWMenuFolder_wpclsIncUsage M_WPObject_wpclsIncUsage
+#define M_CWMenuFolder_wpclsInsertMultipleObjects M_WPObject_wpclsInsertMultipleObjects
+#define M_CWMenuFolder_wpclsFindOneObject M_WPObject_wpclsFindOneObject
+#define M_CWMenuFolder_wpclsSetSettingsPageSize M_WPObject_wpclsSetSettingsPageSize
+#define M_CWMenuFolder_wpclsSetIconData M_WPObject_wpclsSetIconData
+#define M_CWMenuFolder_wpclsSetIcon M_WPObject_wpclsSetIcon
+#define M_CWMenuFolder_wpclsObjectFromHandle M_WPObject_wpclsObjectFromHandle
+#define M_CWMenuFolder_wpclsRemoveObjects M_WPObject_wpclsRemoveObjects
+#define M_CWMenuFolder__get_somDataAlignment SOMClass__get_somDataAlignment
+#define M_CWMenuFolder__get_somInstanceDataOffsets SOMClass__get_somInstanceDataOffsets
+#define M_CWMenuFolder__get_somDirectInitClasses SOMClass__get_somDirectInitClasses
+#define M_CWMenuFolder__set_somDirectInitClasses SOMClass__set_somDirectInitClasses
+#define M_CWMenuFolder_somNew SOMClass_somNew
+#define M_CWMenuFolder_somNewNoInit SOMClass_somNewNoInit
+#define M_CWMenuFolder_somRenew SOMClass_somRenew
+#define M_CWMenuFolder_somRenewNoInit SOMClass_somRenewNoInit
+#define M_CWMenuFolder_somRenewNoZero SOMClass_somRenewNoZero
+#define M_CWMenuFolder_somRenewNoInitNoZero SOMClass_somRenewNoInitNoZero
+#define M_CWMenuFolder_somAllocate SOMClass_somAllocate
+#define M_CWMenuFolder_somDeallocate SOMClass_somDeallocate
+#define M_CWMenuFolder__get_somClassAllocate SOMClass__get_somClassAllocate
+#define M_CWMenuFolder__get_somClassDeallocate SOMClass__get_somClassDeallocate
+#define M_CWMenuFolder_somGetInstanceInitMask SOMClass_somGetInstanceInitMask
+#define M_CWMenuFolder_somGetInstanceDestructionMask SOMClass_somGetInstanceDestructionMask
+#define M_CWMenuFolder_somGetInstanceAssignmentMask SOMClass_somGetInstanceAssignmentMask
+#define M_CWMenuFolder_somInitClass SOMClass_somInitClass
+#define M_CWMenuFolder_somInitMIClass SOMClass_somInitMIClass
+#define M_CWMenuFolder_somAddStaticMethod SOMClass_somAddStaticMethod
+#define M_CWMenuFolder_somAddDynamicMethod SOMClass_somAddDynamicMethod
+#define M_CWMenuFolder_somOverrideSMethod SOMClass_somOverrideSMethod
+#define M_CWMenuFolder_somClassReady SOMClass_somClassReady
+#define M_CWMenuFolder_somGetApplyStub SOMClass_somGetApplyStub
+#define M_CWMenuFolder_somGetClassData SOMClass_somGetClassData
+#define M_CWMenuFolder_somSetClassData SOMClass_somSetClassData
+#define M_CWMenuFolder_somGetClassMtab SOMClass_somGetClassMtab
+#define M_CWMenuFolder_somGetInstanceOffset SOMClass_somGetInstanceOffset
+#define M_CWMenuFolder_somGetInstancePartSize SOMClass_somGetInstancePartSize
+#define M_CWMenuFolder_somGetInstanceSize SOMClass_somGetInstanceSize
+#define M_CWMenuFolder_somGetInstanceToken SOMClass_somGetInstanceToken
+#define M_CWMenuFolder_somGetMemberToken SOMClass_somGetMemberToken
+#define M_CWMenuFolder_somGetMethodData SOMClass_somGetMethodData
+#define M_CWMenuFolder_somGetRdStub SOMClass_somGetRdStub
+#define M_CWMenuFolder_somGetMethodDescriptor SOMClass_somGetMethodDescriptor
+#define M_CWMenuFolder_somGetMethodIndex SOMClass_somGetMethodIndex
+#define M_CWMenuFolder_somGetMethodToken SOMClass_somGetMethodToken
+#define M_CWMenuFolder_somGetName SOMClass_somGetName
+#define M_CWMenuFolder_somGetNthMethodData SOMClass_somGetNthMethodData
+#define M_CWMenuFolder_somGetNthMethodInfo SOMClass_somGetNthMethodInfo
+#define M_CWMenuFolder_somGetNumMethods SOMClass_somGetNumMethods
+#define M_CWMenuFolder_somGetNumStaticMethods SOMClass_somGetNumStaticMethods
+#define M_CWMenuFolder_somGetParent SOMClass_somGetParent
+#define M_CWMenuFolder_somGetParents SOMClass_somGetParents
+#define M_CWMenuFolder_somGetPClsMtab SOMClass_somGetPClsMtab
+#define M_CWMenuFolder_somGetPClsMtabs SOMClass_somGetPClsMtabs
+#define M_CWMenuFolder_somGetVersionNumbers SOMClass_somGetVersionNumbers
+#define M_CWMenuFolder_somSetMethodDescriptor SOMClass_somSetMethodDescriptor
+#define M_CWMenuFolder_somFindMethod SOMClass_somFindMethod
+#define M_CWMenuFolder_somFindMethodOk SOMClass_somFindMethodOk
+#define M_CWMenuFolder_somFindSMethod SOMClass_somFindSMethod
+#define M_CWMenuFolder_somFindSMethodOk SOMClass_somFindSMethodOk
+#define M_CWMenuFolder_somLookupMethod SOMClass_somLookupMethod
+#define M_CWMenuFolder_somCheckVersion SOMClass_somCheckVersion
+#define M_CWMenuFolder_somDescendedFrom SOMClass_somDescendedFrom
+#define M_CWMenuFolder_somSupportsMethod SOMClass_somSupportsMethod
+#define M_CWMenuFolder_somDefinedMethod SOMClass_somDefinedMethod
+#define M_CWMenuFolder_somOverrideMtab SOMClass_somOverrideMtab
+#define M_CWMenuFolder_somDefaultInit SOMObject_somDefaultInit
+#define M_CWMenuFolder_somDestruct SOMObject_somDestruct
+#define M_CWMenuFolder_somDefaultCopyInit SOMObject_somDefaultCopyInit
+#define M_CWMenuFolder_somDefaultAssign SOMObject_somDefaultAssign
+#define M_CWMenuFolder_somDefaultConstCopyInit SOMObject_somDefaultConstCopyInit
+#define M_CWMenuFolder_somDefaultVCopyInit SOMObject_somDefaultVCopyInit
+#define M_CWMenuFolder_somDefaultConstVCopyInit SOMObject_somDefaultConstVCopyInit
+#define M_CWMenuFolder_somDefaultConstAssign SOMObject_somDefaultConstAssign
+#define M_CWMenuFolder_somDefaultVAssign SOMObject_somDefaultVAssign
+#define M_CWMenuFolder_somDefaultConstVAssign SOMObject_somDefaultConstVAssign
+#define M_CWMenuFolder_somInit SOMObject_somInit
+#define M_CWMenuFolder_somFree SOMObject_somFree
+#define M_CWMenuFolder_somUninit SOMObject_somUninit
+#define M_CWMenuFolder_somGetClass SOMObject_somGetClass
+#define M_CWMenuFolder_somGetClassName SOMObject_somGetClassName
+#define M_CWMenuFolder_somGetSize SOMObject_somGetSize
+#define M_CWMenuFolder_somIsA SOMObject_somIsA
+#define M_CWMenuFolder_somIsInstanceOf SOMObject_somIsInstanceOf
+#define M_CWMenuFolder_somRespondsTo SOMObject_somRespondsTo
+#define M_CWMenuFolder_somDispatch SOMObject_somDispatch
+#define M_CWMenuFolder_somClassDispatch SOMObject_somClassDispatch
+#define M_CWMenuFolder_somCastObj SOMObject_somCastObj
+#define M_CWMenuFolder_somResetObj SOMObject_somResetObj
+#define M_CWMenuFolder_somDispatchV SOMObject_somDispatchV
+#define M_CWMenuFolder_somDispatchL SOMObject_somDispatchL
+#define M_CWMenuFolder_somDispatchA SOMObject_somDispatchA
+#define M_CWMenuFolder_somDispatchD SOMObject_somDispatchD
+#define M_CWMenuFolder_somPrintSelf SOMObject_somPrintSelf
+#define M_CWMenuFolder_somDumpSelf SOMObject_somDumpSelf
+#define M_CWMenuFolder_somDumpSelfInt SOMObject_somDumpSelfInt
+#endif /* SOM_DONT_USE_INHERITED_MACROS */
+
+#endif       /* SOM_M_CWMenuFolder_h */
Index: /tags/CWMM-0.3.0_GA/mediafolder/include/menufolder.hh
===================================================================
--- /tags/CWMM-0.3.0_GA/mediafolder/include/menufolder.hh	(revision 213)
+++ /tags/CWMM-0.3.0_GA/mediafolder/include/menufolder.hh	(revision 213)
@@ -0,0 +1,116 @@
+#ifndef _MENUFOLDER_HH
+#define _MENUFOLDER_HH
+
+
+#pragma SOMAsDefault(on)
+#include <som.hh>
+#include <somcls.hh>
+#pragma SOMNoMangling(on)
+#include <wpfolder.hh>
+#include <wppgm.hh>
+
+#pragma SOMAsDefault (off)
+class CONTEXTITEM;
+
+class CWMenuFolder;
+
+
+
+//	#pragma SOMAsDefault(off)
+	
+class MENUFOLDERINFO
+{
+public:
+ 	SOMClass * somClass;
+ 	SOMClass * tempClass;
+ 	CWMenuFolder *thisPtr;
+	PFNWP oldContainerProc;
+	BOOL tempMenuEnabled;
+};
+#pragma SOMAsDefault(pop)
+
+
+class M_CWMenuFolder:public M_WPFolder
+{
+#pragma SOMClassName(*,"M_CWMenuFolder")
+#pragma SOMClassVersion(*,1,2)
+#pragma SOMCallstyle(oidl)
+public:
+	virtual PSZ  wpclsQueryTitle();
+	virtual	ULONG wpclsQueryIconData(PICONINFO pIconInfo);
+  virtual	ULONG wpclsQueryIconDataN(PICONINFO pIconInfo, ULONG ulIconIndex);
+	virtual ULONG wpclsQueryDefaultHelp(PULONG HelpPanelId,PSZ HelpLibrary);	
+#pragma SOMReleaseOrder()
+};
+
+class CWMenuFolder:public WPFolder
+{
+#pragma SOMClassName(*,"CWMenuFolder")
+#pragma SOMMetaClass(CWMenuFolder,"M_CWMenuFolder")
+#pragma SOMClassVersion(CWMenuFolder,1,2)
+#pragma SOMCallstyle(oidl)
+private:
+  CONTEXTITEM * ptrCItem;
+  BOOL bMenuEnabled;
+  ULONG ulEnable;
+  ULONG ulLastMenuIDPrivate;
+  virtual void mfPrivateFreeMenu(void);
+public:
+  virtual CONTEXTITEM * mfPrivateBuildMenu(CWMenuFolder * wpFolder, ULONG * ulLastMenuId);
+  virtual void mfInsertMItems( HWND hwndMenu,ULONG iPosition);
+  virtual void wpInitData();
+  virtual MRESULT wpDragOver(HWND hwndCnr,PDRAGINFO pDragInfo);
+  virtual MRESULT wpDrop(HWND hwndCnr,PDRAGINFO pDragInfo,PDRAGITEM pDragItem);
+  virtual BOOL wpAddSettingsPages(HWND hwndNotebook);
+  virtual BOOL wpRestoreState(ULONG ulReserved);
+  virtual BOOL wpSaveState();	
+  virtual BOOL wpSetupOnce(PSZ pSetupString);
+  virtual BOOL wpSetup(PSZ pSetupString);
+  virtual void wpCopiedFromTemplate();
+  virtual BOOL wpDeleteFromContent(WPObject *object);
+  void mfFreeMenu();
+  virtual BOOL mfQueryMenuEnabled()	{return bMenuEnabled;};
+  void mfSetMenuEnabled(BOOL bEnabled){bMenuEnabled=bEnabled;};
+  virtual ULONG mfInsertMenuItems(HWND hwndMenu,ULONG iPosition, ULONG ulLastMenuId);
+  virtual BOOL mfCheckMenuItems(WPObject *wpObject,ULONG ulMenuId);
+  virtual ULONG mfAddClassChoosePage(HWND hwndNotebook);
+
+#pragma SOMReleaseOrder(\
+"mfPrivateBuildMenu",\
+"mfInsertMItems",\
+"mfFreeMenu",\
+"mfQueryMenuEnabled",\
+"mfSetMenuEnabled",\
+"mfInsertMenuItems",\
+"mfCheckMenuItems",\
+"mfAddClassChoosePage",\
+"mfPrivateFreeMenu")
+};
+
+#endif
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Index: /tags/CWMM-0.3.0_GA/mediafolder/include/omf.h
===================================================================
--- /tags/CWMM-0.3.0_GA/mediafolder/include/omf.h	(revision 213)
+++ /tags/CWMM-0.3.0_GA/mediafolder/include/omf.h	(revision 213)
@@ -0,0 +1,428 @@
+/*
+**
+** OMF.H - Object Module Format structures
+**
+*/
+
+struct exehdr_rec {
+   BYTE     signature[2];              // Must be "MZ"
+   USHORT   image_len;                 // Image Length
+   USHORT   pages;                     // Pages
+   USHORT   reloc_items;               // Relocation table items
+   USHORT   min_paragraphs;            // Mininum 16-bytes paragraphs
+   USHORT   max_paragraphs;            // Maximum 16-bytes paragraphs
+   USHORT   stack_pos;                 // Stack position
+   USHORT   offset_in_sp;              // Offset in SP
+   USHORT   checksum;                  // Checksum
+   USHORT   offset_in_ip;              // Offset in IP
+   USHORT   code_pos;                  // Code segment pos.
+   USHORT   reloc_item_pos;            // Position of first relocation item
+   USHORT   overlay_number;            // Overlay number
+   BYTE     unused[8];                 // Unused bytes
+   USHORT   oem_id;                    // OEM Identifier
+   BYTE     oem_info[24];              // OEM Info
+   ULONG    lexe_offset;               // Offset to linear header
+};
+
+struct lexehdr_rec {
+   BYTE     signature[2];              // Must be "LX"
+   BYTE     b_ord;                     // Byte ordering
+   BYTE     w_ord;                     // Word ordering
+   ULONG    format_level;              // Format level
+   USHORT   cpu_type;                  // CPU Type
+   USHORT   os_type;                   // Operating system
+   ULONG    module_version;            // Module version
+   ULONG    mod_flags;                 // Module flags
+   ULONG    mod_pages;                 // Module pages
+   ULONG    EIP_object;                // EIP Object no.
+   ULONG    EIP;                       // EIP Value
+   ULONG    ESP_object;                // ESP Object no
+   ULONG    ESP;                       // ESP Value
+   ULONG    page_size;                 // Page size
+   ULONG    page_ofs_shift;            // Page offset shift
+   ULONG    fixup_sect_size;           // Fixup section size
+   ULONG    fixup_sect_checksum;       // Fixup section checksum
+   ULONG    loader_sect_size;          // Loader section size
+   ULONG    loader_sect_checksum;      // Loader section checksum
+   ULONG    obj_table_ofs;             // Object table offset
+   ULONG    obj_count;                 // Object count
+   ULONG    obj_page_tab_ofs;          // Object page table offset
+   ULONG    obj_iter_page_ofs;         // Object iteration pages offset
+   ULONG    res_tab_ofs;               // Resource table offset
+   ULONG    res_table_entries;         // Resource table entries
+   ULONG    res_name_tab_ofs;          // Resident name table offset;
+   ULONG    ent_tab_ofs;               // Entry table offset
+   ULONG    mod_dir_ofs;               // Module directives offset
+   ULONG    mod_dir_count;             // Number of module directives
+   ULONG    fixup_page_tab_ofs;        // Fixup page table offset
+   ULONG    fixup_rec_tab_ofs;         // Fixup record table offset
+   ULONG    imp_tab_ofs;               // Import module table offset
+   ULONG    imp_mod_entries;           // Import module entries
+   ULONG    imp_proc_tab_ofs;          // Import proc table offset
+   ULONG    per_page_check_ofs;        // Per page checksum offset
+   ULONG    data_page_offset;          // Data pages offset
+   ULONG    preload_page_count;        // Preload pages count
+   ULONG    nonres_tab_ofs;            // Nonresident name table offset
+   ULONG    nonres_tab_len;            // Nonresident name table len
+   ULONG    nonres_tab_check;          // Nonresident tables checksum
+   ULONG    auto_ds_objectno;          // Auto DS object number
+   ULONG    debug_info_ofs;            // Debug info offset
+   ULONG    debug_info_len;            // Debug info length
+   ULONG    inst_preload_count;        // Instance preload count
+   ULONG    inst_demand_count;         // Instance demand count
+   ULONG    heapsize;                  // Heap size
+   ULONG    stacksize;                 // Stack size
+};
+
+struct debug_head_rec {
+   BYTE signature[3];                  // Debug signature
+   BYTE type;                          // Debug info type
+};
+
+struct dir_inf_rec {
+   USHORT   dirstruct_size;            // Size of directory structure
+   USHORT   number_of_entries;         // Number of dnt_rec's in the array
+   USHORT   unknown;                   // Unknown data
+   // Followed by an array of dnt_rec structures
+};
+
+struct dnt_rec {
+   USHORT   subsect_type;              // sst Subsection type
+   USHORT   mod_index;                 // Module index (1-based)
+   ULONG    offset;                    // Offset of start of section
+   ULONG    size;                      // Size of section
+};
+
+// Modules subsection
+struct modules_rec {
+   USHORT   code_seg_base;             // Code segment base
+   ULONG    code_seg_offset;           // Code segment offset
+   ULONG    code_seg_len;              // Code segment length
+   USHORT   overlay_no;                // Overlay number
+   USHORT   lib_idx;                   // Index into library section or 0
+   BYTE     segments;                  // Number of segments
+   BYTE     reserved;
+   BYTE     debug_style[2];            // "HL" for HLL, "CV" or 0 for CodeView
+   BYTE     debug_version[2];          // 00 01 or 00 03 for HLL, 00 00 for CV
+   BYTE     name_len;                  // Length of name (which follows)
+};
+
+// Publics subsection
+struct publics_rec {
+   ULONG    offset;                    // Offset
+   USHORT   segment;                   // Segment
+   USHORT   type;                      // Type index
+   BYTE     name_len;                  // Length of name (wich follows)
+};
+
+#if 0
+// Linenumbers header
+struct linhead_rec {
+   BYTE     id;                        // 0x95 for flat mem, 32 bit progs
+   USHORT   length;                    // Record length
+   USHORT   base_group;                // Base group
+   USHORT   base_segment;              // Base segment
+};
+#endif
+
+// First linenumber record
+struct linfirst_rec {
+   USHORT   lineno;                    // Line number (0)
+   BYTE     entry_type;                // Entry type
+   BYTE     reserved;                  // Reserved
+   USHORT   entries_count;             // Number of table entries
+   USHORT   segment_no;                // Segment number
+   ULONG    filename_tabsize;          // File names table size
+};
+
+
+// Source line numbers
+struct linsource_rec {
+   USHORT   source_line;               // Source file line number
+   USHORT   source_idx;                // Source file index
+   ULONG    offset;                    // Offset into segment
+};
+
+
+// Listing statement numbers
+struct linlist_rec {
+   ULONG    list_line;                 // Listing file linenumber
+   ULONG    statement;                 // Listing file statement number
+   ULONG    offset;                    // Offset into segment
+};
+
+
+// Source and Listing statement numbers
+struct linsourcelist_rec {
+   USHORT   source_line;               // Source file line number
+   USHORT   source_idx;                // Source file index
+   ULONG    list_line;                 // Listing file linenumber
+   ULONG    statement;                 // Listing file statement number
+   ULONG    offset;                    // Offset into segment
+};
+
+
+// Path table
+struct pathtab_rec {
+   ULONG    offset;                    // Offset into segment
+   USHORT   path_code;                 // Path code
+   USHORT   source_idx;                // Source file index
+};
+
+
+// File names table
+struct filenam_rec {
+   ULONG    first_char;                // First displayable char in list file
+   ULONG    disp_chars;                // Number of displayable chars in list line
+   ULONG    filecount;                 // Number of source/listing files
+};
+
+
+// Symbol types
+#define SYM_BEGIN          0x00        // Begin block
+#define SYM_PROC           0x01        // Function
+#define SYM_END            0x02        // End block of function
+#define SYM_AUTO           0x04        // Auto variable
+#define SYM_STATIC         0x05        // Static variable
+#define SYM_LABEL          0x0B        // Label
+#define SYM_WITH           0x0C        // With start symbol (not used)
+#define SYM_REG            0x0D        // Register variable
+#define SYM_CONST          0x0E        // Constant
+#define SYM_ENTRY          0x0F        // Secondary entry (not in C)
+#define SYM_SKIP           0x10        // For incremental linking (not used)
+#define SYM_CHANGESEG      0x11        // Change segment (#pragma alloc_text)
+#define SYM_TYPEDEF        0x12        // Typedef variable
+#define SYM_PUBLIC         0x13        // Public reference
+#define SYM_MEMBER         0x14        // Member of minor or major structure
+#define SYM_BASED          0x15        // Based variable
+#define SYM_TAG            0x16        // Tag in struct, union, enum ...
+#define SYM_TABLE          0x17        // Table (used in RPG - not C)
+#define SYM_MAP            0x18        // Map variable (extern in C)
+#define SYM_CLASS          0x19        // Class symbol (C++)
+#define SYM_MEMFUNC        0x1A        // Member function
+#define SYM_AUTOSCOPE      0x1B        // Scoped auto for C++ (not used)
+#define SYM_STATICSCOPE    0x1C        // scoped static for C++ (not used)
+#define SYM_CPPPROC        0x1D        // C++ Proc
+#define SYM_CPPSTAT        0x1E        // C++ Static var
+#define SYM_COMP           0x40        // Compiler information
+
+
+// Symbolic begin record
+struct symbegin_rec {
+   ULONG    offset;                    // Segment offset
+   ULONG    length;                    // Length of block
+   BYTE     name_len;                  // Length of block name
+   // Block name follows
+};
+
+
+// Symbolic auto var record
+struct symauto_rec {
+   ULONG    stack_offset;              // Stack offset
+   USHORT   type_idx;                  // Type index
+   BYTE     name_len;                  // Length of name
+   // Var name follows
+};
+
+
+// Symbolic procedure record
+struct symproc_rec {
+   ULONG    offset;                    // Segment offset
+   USHORT   type_idx;                  // Type index
+   ULONG    length;                    // Length of procedure
+   USHORT   pro_len;                   // Length of prologue
+   ULONG    pro_bodylen;               // Length of prologue + body
+   USHORT   class_type;                // Class type
+   BYTE     near_far;                  // Near or far
+   BYTE     name_len;                  // Length of name
+   // Function name follows
+};
+
+
+// Symbolic static var record
+struct symstatic_rec {
+   ULONG    offset;                    // Segment offset
+   USHORT   segaddr;                   // Segment address
+   USHORT   type_idx;                  // Type index
+   BYTE     name_len;                  // Length of name
+   // Var name follows
+};
+
+
+// Symbolic label var record
+struct symlabel_rec {
+   ULONG    offset;                    // Segment offset
+   BYTE     near_far;                  // Near or far
+   BYTE     name_len;                  // Length of name
+   // Var name follows
+};
+
+// Symbolic register var record
+struct symreg_rec {
+   USHORT   type_idx;                  // Type index
+   BYTE     reg_no;                    // Register number
+   BYTE     name_len;                  // Length of name
+   // Var name follows
+};
+
+// Symbolic change-segment record
+struct symseg_rec {
+   USHORT   seg_no;                    // Segment number
+};
+
+// Symbolic typedef record
+struct symtypedef_rec {
+   USHORT   type_idx;                  // Type index
+   BYTE     name_len;                  // Length of name
+   // Name follows
+};
+
+// Symbolic public record
+struct sympublic_rec {
+   ULONG    offset;                    // Segment offset
+   USHORT   segaddr;                   // Segment address
+   USHORT   type_idx;                  // Type index
+   BYTE     name_len;                  // Length of name
+   // Name follows
+};
+
+// Symbolic member record
+struct symmember_rec {
+   ULONG    offset;                    // Offset to subrecord
+   BYTE     name_len;                  // Length of name
+   // Name follows
+};
+
+// Symbolic based record
+struct symbased_rec {
+   ULONG    offset;                    // Offset to subrecord
+   USHORT   type_idx;                  // Type index
+   BYTE     name_len;                  // Length of name
+   // Name follows
+};
+
+// Symbolic tag record
+struct symtag_rec {
+   USHORT   type_idx;                  // Type index
+   BYTE     name_len;                  // Length of name
+   // Name follows
+};
+
+
+// Symbolic table record
+struct symtable_rec {
+   ULONG    offset;                    // Segment offset
+   USHORT   segaddr;                   // Segment address
+   USHORT   type_idx;                  // Type index
+   ULONG    idx_ofs;                   // Index offset to subrecord
+   BYTE     name_len;                  // Length of name
+   // Name follows
+};
+
+
+// Type record
+struct type_rec {
+   USHORT   length;                    // Length of sub-record
+   BYTE     type;                      // Sub-record type
+   BYTE     type_qual;                 // Type qualifier
+};
+
+
+
+// Types
+#define TYPE_CLASS         0x40        // Class
+#define TYPE_BASECLASS     0x41        // Base class
+#define TYPE_FRIEND        0x42        // Friend
+#define TYPE_CLASSDEF      0x43        // Class definition
+#define TYPE_MEMBERFUNC    0x45        // Member function
+#define TYPE_CLASSMEMBER   0x46        // Class member
+#define TYPE_REF           0x48        // Reference
+#define TYPE_MEMBERPTR     0x49        // Member pointer
+#define TYPE_SCALARS       0x51        // Scalars
+#define TYPE_SET           0x52        // Set
+#define TYPE_ENTRY         0x53        // Entry
+#define TYPE_FUNCTION      0x54        // Function
+#define TYPE_AREA          0x55        // Area
+#define TYPE_LOGICAL       0x56        // Logical
+#define TYPE_STACK         0x57        // Stack
+#define TYPE_MACRO         0x59        // Macro
+#define TYPE_BITSTRING     0x5C        // Bit string
+#define TYPE_USERDEF       0x5D        // User defined
+#define TYPE_CHARSTR       0x60        // Character string
+#define TYPE_PICTURE       0x61        // Picture
+#define TYPE_GRAPHIC       0x62        // Graphic
+#define TYPE_FORMATLAB     0x65        // Format label
+#define TYPE_FILE          0x67        // File
+#define TYPE_SUBRANGE      0x6F        // Subrange
+#define TYPE_CODELABEL     0x72        // Code label
+#define TYPE_PROCEDURE     0x75        // Procedure
+#define TYPE_ARRAY         0x78        // Array
+#define TYPE_STRUCT        0x79        // Structure / Union / Record
+#define TYPE_POINTER       0x7A        // Pointer
+#define TYPE_ENUM          0x7B        // Enum
+#define TYPE_LIST          0x7F        // List
+
+
+// Type userdef
+struct type_userdefrec {
+   BYTE     FID_index;                 // Field ID
+   USHORT   type_index;                // Type index
+   BYTE     FID_string;                // String ID
+   BYTE     name_len;                  // Length of name which follows
+};
+
+
+// Type function
+struct type_funcrec {
+   USHORT   params;
+   USHORT   max_params;
+   BYTE     FID_index;                 // Field ID
+   USHORT   type_index;                // Type index of return value
+   BYTE     FID_index1;                // String ID
+   USHORT   typelist_index;            // Index of list of params
+};
+
+
+// Type struct
+struct type_structrec {
+   ULONG    size;                      // Size of structure
+   USHORT   field_count;               // Number of fields in structure
+   BYTE     FID_index;                 // Field ID
+   USHORT   type_list_idx;             // Index to type list
+   BYTE     FID_index1;                // Field ID
+   USHORT   type_name_idx;             // Index to names / offsets
+   BYTE     dont_know;                 // Haven't a clue, but it seems to be needed
+   BYTE     name_len;                  // Length of structure name which follows
+};
+
+// Type list, type qualifier 1: contains types for structures
+// This record is repeated for the number of items in the structure definition
+struct type_list1 {
+   BYTE     FID_index;                 // Field identifier for index
+   USHORT   type_index;                // Type index.
+};
+
+// Type list, type qualifier 2: contains names and offsets for structure items
+// This record is repeated for the number of items in the structure definition
+struct type_list2 {
+   BYTE     FID_string;                // String identifier
+   BYTE     name_len;                  // Length of name which follows
+};
+
+// Type list, subrecord to the above, contains offset of variable in the structure
+struct type_list2_1 {
+   BYTE     FID_span;                  // Defines what type of variable follows
+   union {
+      BYTE   b_len;
+      USHORT s_len;
+      ULONG  l_len;
+   } u;
+};
+
+// Type pointer
+struct type_pointerrec {
+   BYTE     FID_index;                 // Index identifier
+   USHORT   type_index;                // Type index
+   BYTE     FID_string;                // String identifier
+   BYTE     name_len;                  // Length of name which follows
+};
Index: /tags/CWMM-0.3.0_GA/mediafolder/include/pmcddb.h
===================================================================
--- /tags/CWMM-0.3.0_GA/mediafolder/include/pmcddb.h	(revision 213)
+++ /tags/CWMM-0.3.0_GA/mediafolder/include/pmcddb.h	(revision 213)
@@ -0,0 +1,51 @@
+/* This file is (C) Chris Wohlgemuth 1999-2002
+ */
+/*
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; see the file COPYING.  If not, write to
+ * the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+
+#define ID_CREATORSETTINGS "<CWCREATOR_SETTINGS>"
+
+/* Fonts to use in dialogs */
+#define DEFAULT_DIALOG_FONT   "9.WarpSans"
+#define DEFAULT_DIALOG_FONT_WARP3   "8.Helv"
+
+#define RESDLL_BASENAME      "PMDB"
+
+
+/* Keys for CWMMAudio */
+#define IDKEY_DISCTITLE          6200
+#define IDKEY_TRACKTITLE         6201
+#define IDKEY_ARTIST             6202
+#define IDKEY_GENRE              6203
+#define IDKEY_DISCID             6204
+
+/* for cwmmQueryTrackInfo() */
+/* ID tag defines */
+#define IDINFO_NAME              1
+#define IDINFO_ARTIST            2
+#define IDINFO_ALBUM             3
+#define IDINFO_YEAR              4
+#define IDINFO_COMMENT           5
+#define IDINFO_GENRE             6
+#define IDINFO_PLAYTIME          7
+#define IDINFO_BPS               8
+#define IDINFO_SAMPLERATE        9
+#define IDINFO_CHANNELS          10
+
+#define IDINFO_LASTINFO          10
+
+#define PMCDDB_LOGFILENAME       "cddb.log"
+#define PMCDDB_INIFILENAME       "freedb.ini"
Index: /tags/CWMM-0.3.0_GA/mediafolder/include/pmcddbres.h
===================================================================
--- /tags/CWMM-0.3.0_GA/mediafolder/include/pmcddbres.h	(revision 213)
+++ /tags/CWMM-0.3.0_GA/mediafolder/include/pmcddbres.h	(revision 213)
@@ -0,0 +1,43 @@
+
+#define IDDLG_CDDBSETUP             2500
+#define IDPB_CDDBUNDO               2501
+#define IDPB_CDDBHELP               2502
+#define IDCB_USECDDB                2503
+#define IDPB_ADDSERVER              2504
+#define IDPB_DELETESERVER           2505
+#define IDEF_EMAIL                  2506
+#define IDGB_CDDBUSER               2507
+#define IDST_USERNAME               2508
+#define IDEF_CDDBUSER               2509
+#define IDEF_USERHOST               2510
+#define IDST_USERHOST               2511
+#define IDST_SERVERNEXTPAGE         2512
+
+#define IDDLG_CDDBSETUP2            3300
+#define IDPB_CDDB2UNDO              3301
+#define IDPB_CDDB2HELP              3302
+#define IDPB_SERVERUP               3303
+#define IDPB_SERVERDOWN             3304
+#define IDPB_SERVERDELETE           3305
+#define IDPB_SERVERADD              3306
+#define IDLB_CDDBSERVERS            3307
+#define IDEF_NEWSERVER              3308
+#define IDST_SERVERPORT             3309
+#define IDGB_CDDBSERVERSETUP        3310
+#define IDST_NEWSERVER              3311
+
+#define IDDLG_CDDBCHOOSE            300
+#define IDLB_CDDBCHOOSE             301
+#define IDST_CDDBCHOOSE             302
+#define IDPB_OK                     303
+#define IDPB_CANCEL                 304
+
+
+#define IDSTR_CDDBQUERYLOCALDB           4100
+#define IDSTR_ERRORCDDBLOCALDB           4101
+
+#define IDSTR_INIFILEOPENWARNING         4102
+#define IDSTR_PMCDDBTITLE                4103
+
+#define IDSTR_USAGE                      4104
+#define IDSTR_SETUPERROR                 4105
Index: /tags/CWMM-0.3.0_GA/mediafolder/include/progfolder.h
===================================================================
--- /tags/CWMM-0.3.0_GA/mediafolder/include/progfolder.h	(revision 213)
+++ /tags/CWMM-0.3.0_GA/mediafolder/include/progfolder.h	(revision 213)
@@ -0,0 +1,47 @@
+/*
+ * progfolder.h: Definitions for class CWProgFolder
+ *
+ *             (C) Chris Wohlgenuth 1999
+ *
+ */
+/*
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; see the file COPYING.  If not, write to
+ * the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+#define NUM_STOREWINDOWBYTES 12
+#define QWP_ORGFRAMEPROC 4 /* address of the original frame proc */
+#define QWP_FCTRLDATA 8 /* ptr to the private framectrl data */
+/* 0: this-ptr.
+   4: original frame proc
+   8: ptr. to framectrl data */
+
+#define ID_FOLDERSTOREWINDOW         1200
+
+#define ID_FRAMELEFT         1000
+#define ID_FRAMERIGHT         1001
+#define ID_FRAMETOP         1002
+#define ID_FRAMEBOTTOM         1003
+
+#define FCTL_LEFT   1
+#define FCTL_RIGHT  2
+#define FCTL_TOP    4
+#define FCTL_BOTTOM 8
+
+#define FCTL_POSABOVE  1
+#define FCTL_POSBELOW  2
+
+#define ID_FOLDERCLASSNAME 100
+
+#define IDPT_HAND       6000
+
Index: /tags/CWMM-0.3.0_GA/mediafolder/include/progfolder.hh
===================================================================
--- /tags/CWMM-0.3.0_GA/mediafolder/include/progfolder.hh	(revision 213)
+++ /tags/CWMM-0.3.0_GA/mediafolder/include/progfolder.hh	(revision 213)
@@ -0,0 +1,141 @@
+/*
+ *
+ * Include file with class definitions for class CWProgFolder
+ *
+ *             (C) Chris Wohlgenuth 1999-2002
+ *
+ * This class is intended for programmers and provides functions for some
+ * common tasks like:
+ *                     - Adding dialogs as frame controls to WPS folders
+ *                     - Showing 'About'-dialogs
+ *                     - Checking of object pointers
+ *                     - ...
+ *
+ * Use IBM VAC++ V3.00 and Gnu-make 3.74.1 to compile
+ *
+ */
+
+/*
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; see the file COPYING.  If not, write to
+ * the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+#define INCL_DOS
+#define INCL_WIN
+#include <os2.h>
+
+/* Structure which holds information about our
+   frame controls */
+typedef struct {
+    HWND hwndCtlLeft;
+    BOOL bLeft;
+    ULONG ulFlagsLeft;
+    SIZEL sizelLeftFrame;
+
+    HWND hwndCtlRight;
+    BOOL bRight;
+    ULONG ulFlagsRight;
+    SIZEL sizelRightFrame;
+
+    HWND hwndCtlTop;
+    BOOL bTop;
+    ULONG ulFlagsTop;
+    SIZEL sizelTopFrame;
+
+    HWND hwndCtlBottom;
+    BOOL bBottom;
+    ULONG ulFlagsBottom;
+    SIZEL sizelBottomFrame;
+
+  BOOL bCnrAdjusted;
+}FRAMECTRLDATA;
+
+/* Some stuff necessary for the compiler */
+#pragma SOMAsDefault(on)
+#include "som.hh"
+#include "somcls.hh"
+#pragma SOMNoMangling(on)
+/* Include file with definition for WPFolder class */
+#include "WPFOLDER.hh"
+/* Include file with definition for WPShadow class */
+#include "wpshadow.hh"
+
+
+
+/* Class definition for the Metaclass of our new folder class */
+class M_CWProgFolder:public M_WPFolder
+{
+#pragma SOMClassName(*,"M_CWProgFolder")
+  /* Minimal SOM-Version we need. No change necessary */
+#pragma SOMClassVersion(*,1,3)
+#pragma SOMCallstyle(oidl)
+public:
+  /* The member functions we want to override */
+  virtual PSZ  wpclsQueryTitle();
+  virtual ULONG wpclsQueryStyle();
+  virtual void wpclsInitData();
+
+  /* This statement describes new memberfunctions if we introduce them */
+#pragma SOMReleaseOrder()
+};
+
+/* The new folder class. It's a child of WPFolder-class */
+class CWProgFolder:public WPFolder
+{
+  /* The class name */
+#pragma SOMClassName(*,"CWProgFolder")
+  /* The name of the class' Metaclass */
+#pragma SOMMetaClass(CWProgFolder,"M_CWProgFolder")
+  /* SOM must be Version 1.2 or above */
+#pragma SOMClassVersion(CWProgFolder,1,3)
+#pragma SOMCallstyle(oidl)
+private:
+  /* We have no private data or functions */
+public:
+  /* Overridden or new functions come here */
+  /* This one is overridden */
+    virtual HWND wpOpen(HWND hwndCnr,ULONG ulView,ULONG ulParam);
+    virtual BOOL cwClose(HWND hwndFrame);
+  /* This one is a new one */
+    virtual ULONG cwNumAdditionalFrameControls(HWND hwndFolder);
+    virtual BOOL cwCalculateClient(HWND hwndFolder, PRECTL pRectl, BOOL which);
+    virtual ULONG cwFormatFrame(HWND hwndFolder, USHORT countSWP,PSWP pswp);
+    virtual BOOL cwAddFrameCtl(HWND hwndFolder,HWND hwndNewCtl,SIZEL sizel, ULONG ulPos, ULONG ulFlags);
+    virtual HWND cwQueryFrameCtl(HWND hwndFolder, SIZEL* sizel, ULONG ulPos, ULONG * ulFlags);
+    virtual void cwUpdateFrame(HWND hwndFolder);
+    virtual WPObject* cwGetFileSystemObject(WPObject* wpObject);
+    virtual ULONG cwShowAboutDlg(HMODULE hModule, ULONG idDialog);
+    virtual BOOL cwQueryCDDrives(int *iNumCD, char * cFirstDrive);
+  virtual ULONG cwInsertUserMenuItems(HWND hwndMenu, char* chrMenuFolder, ULONG ulFirstId, BOOL bLeadingSeparator);
+  virtual BOOL cwCheckUserMenuItems( char* chrMenuFolder, USHORT usItemId);
+
+    //  virtual ULONG cwQueryAudioCDInfo(char * drive);
+  /* Tell SOM the order of the new functions. NEVER change the order in
+     future versions or you break binary compatibility! */
+#pragma SOMReleaseOrder( \
+"cwNumAdditionalFrameControls",\
+"cwCalculateClient",\
+"cwFormatFrame",\
+"cwAddFrameCtl",\
+"cwQueryFrameCtl",\
+"cwUpdateFrame",\
+"cwGetFileSystemObject",\
+"cwShowAboutDlg",\
+"cwQueryCDDrives",\
+"cwClose",\
+"cwInsertUserMenuItems",\
+"cwCheckUserMenuItems")
+};
+
+
+
Index: /tags/CWMM-0.3.0_GA/mediafolder/include/sym.h
===================================================================
--- /tags/CWMM-0.3.0_GA/mediafolder/include/sym.h	(revision 213)
+++ /tags/CWMM-0.3.0_GA/mediafolder/include/sym.h	(revision 213)
@@ -0,0 +1,79 @@
+/* Pointer means offset from beginning of file or beginning of struct */
+#pragma pack(1)
+typedef struct {
+  unsigned short int ppNextMap;     /* paragraph pointer to next map         */
+  unsigned char      bFlags;        /* symbol types                          */
+  unsigned char      bReserved1;    /* reserved                              */
+  unsigned short int pSegEntry;     /* segment entry point value             */
+  unsigned short int cConsts;       /* count of constants in map             */
+  unsigned short int pConstDef;     /* pointer to constant chain             */
+  unsigned short int cSegs;         /* count of segments in map              */
+  unsigned short int ppSegDef;      /* paragraph pointer to first segment    */
+  unsigned char      cbMaxSym;      /* maximum symbol-name length            */
+  unsigned char      cbModName;     /* length of module name                 */
+  char               achModName[1]; /* cbModName Bytes of module-name member */
+} MAPDEF;
+
+typedef struct {
+  unsigned short int ppNextMap;     /* always zero                           */
+  unsigned char      release;       /* release number (minor version number) */
+  unsigned char      version;       /* major version number                  */
+} LAST_MAPDEF;
+
+typedef struct {
+  unsigned short int ppNextSeg;     /* paragraph pointer to next segment     */
+  unsigned short int cSymbols;      /* count of symbols in list              */
+  unsigned short int pSymDef;       /* offset of symbol chain                */
+  unsigned short int wReserved1;    /* reserved                              */
+  unsigned short int wReserved2;    /* reserved                              */
+  unsigned short int wReserved3;    /* reserved                              */
+  unsigned short int wReserved4;    /* reserved                              */
+  unsigned char      bFlags;        /* symbol types                          */
+  unsigned char      bReserved1;    /* reserved                              */
+  unsigned short int ppLineDef;     /* offset of line number record          */
+  unsigned char      bReserved2;    /* reserved                              */
+  unsigned char      bReserved3;    /* reserved                              */
+  unsigned char      cbSegName;     /* length of segment name                */
+  char               achSegName[1]; /* cbSegName Bytes of segment-name member*/
+} SEGDEF;
+
+typedef struct {
+  unsigned short int wSymVal;       /* symbol address or constant            */
+  unsigned char      cbSymName;     /* length of symbol name                 */
+  char               achSymName[1]; /* cbSymName Bytes of symbol-name member */
+} SYMDEF16;
+
+typedef struct {
+  unsigned       int wSymVal;       /* symbol address or constant            */
+  unsigned char      cbSymName;     /* length of symbol name                 */
+  char               achSymName[1]; /* cbSymName Bytes of symbol-name member */
+} SYMDEF32;
+
+typedef struct {
+  unsigned short int ppNextLine;    /* ptr to next linedef (0 if last)       */
+  unsigned short int wReserved1;    /* reserved                              */
+  unsigned short int pLines;        /* pointer to line numbers               */
+  unsigned short int cLines;        /* reserved                              */
+  unsigned char      cbFileName;    /* length of filename                    */
+  char               achFileName[1];/* cbFileName Bytes of filename          */
+} LINEDEF;
+
+typedef struct {
+  unsigned short int wCodeOffset;   /* executable offset                     */
+  unsigned short int dwFileOffset;  /* source offset                         */
+} LINEINF;
+
+#define SEGDEFOFFSET(MapDef)     (MapDef.ppSegDef*16)
+#define NEXTSEGDEFOFFSET(SegDef)  (SegDef.ppNextSeg*16)
+
+#define ASYMPTROFFSET(SegDefOffset,Segdef) (SegDefOffset+SegDef.pSymDef)
+#define SYMDEFOFFSET(SegDefOffset,SegDef,n) (ASYMPTROFFSET(SegDefOffset,SegDef)+(n)*(sizeof(unsigned short int)))
+
+#define ACONSTPTROFFSET(MapDef) (MapDef.ppConstDef)
+#define CONSTDEFOFFSET(MapDef,n) ((MapDef.ppConstDef)+(n)*(sizeof(unsigned short int)))
+
+#define LINEDEFOFFSET(SegDef) (SegDef.ppLineDef*16))
+#define NEXTLINEDEFOFFSET(LineDef) (LineDef.ppNextLine*16)
+#define LINESOFFSET(LinedefOffset,LineDef) ((LinedefOffset)+LineDef.pLines)
+
+
Index: /tags/CWMM-0.3.0_GA/mediafolder/include/wpfolder.hh
===================================================================
--- /tags/CWMM-0.3.0_GA/mediafolder/include/wpfolder.hh	(revision 213)
+++ /tags/CWMM-0.3.0_GA/mediafolder/include/wpfolder.hh	(revision 213)
@@ -0,0 +1,616 @@
+#ifndef _DTS_HH_INCLUDED_wpfolder
+#define _DTS_HH_INCLUDED_wpfolder
+/* Start Class WPFolder */
+
+// This file was generated by the IBM "DirectToSOM" emitter for C++ (V1.77)
+// Generated at 11/02/96 09:11:43 EST
+// This is class: WPFolder
+// Mangled class name: WPFolder
+// SE: May 19/94
+
+#include <som.hh>
+
+     #pragma SOMAsDefault(on)
+class SOMClass;
+     #pragma SOMAsDefault(pop)
+     #pragma SOMAsDefault(on)
+class SOMObject;
+     #pragma SOMAsDefault(pop)
+     #pragma SOMAsDefault(on)
+class WPFolder;
+     #pragma SOMAsDefault(pop)
+     #pragma SOMAsDefault(on)
+class M_WPObject;
+     #pragma SOMAsDefault(pop)
+     #pragma SOMAsDefault(on)
+class WPObject;
+     #pragma SOMAsDefault(pop)
+     #pragma SOMAsDefault(on)
+class M_WPFileSystem;
+     #pragma SOMAsDefault(pop)
+     #pragma SOMAsDefault(on)
+class M_WPFolder;
+     #pragma SOMAsDefault(pop)
+#include <wpfsys.hh>
+#pragma SOMNonDTS(on)
+
+/******************************************************/
+      /* Folder flags */
+
+      #define FOI_POPULATEDWITHALL      0x0001
+      #define FOI_POPULATEDWITHFOLDERS  0x0002
+      #define FOI_WORKAREA              0x0004
+      #define FOI_CHANGEFONT            0x0008        /* anti-recursion flag */
+      #define FOI_WAMINIMIZED           0x0020
+      #define FOI_WASTARTONRESTORE      0x0040
+      #define FOI_NOREFRESHVIEWS        0x0080
+      #define FOI_ASYNCREFRESHONOPEN    0x0100
+      #define FOI_TREEPOPULATED         0x0200
+      #define FOI_POPULATEINPROGRESS    0x0400                          /*DORM*/
+      #define FOI_REFRESHINPROGRESS     0x0800
+      #define FOI_FIRSTPOPULATE         0x1000  /* folder has no iconposdata */ //LD62414
+      #define FOI_WAMCRINPROGRESS       0x2000  /* Minimize, close, restore in progress ihs67096 */
+      #define FOI_CNRBKGNDOLDFORMAT     0x4000  /* CnrBkgnd saved in old format   ihs77154 */
+      #define FOI_CHANGEICONBGNDCOLOR   0x8000  /* Icon Text Background Color changing ihs79998 */
+      #define FOI_CHANGEICONTEXTCOLOR   0x00010000 /* Icon Text Color changing    ihs89146 */
+      #define FOI_DELETEINPROGRESS      0x00020000 /* To prevent wpFree from repopulating */
+
+      /* Open views for the wpOpen() method */
+
+      #define OPEN_TREE          101
+      #define OPEN_DETAILS       102
+
+      /* Folder save-restore keys */
+
+      #define IDKEY_FDRCONTENTATTR     2900
+      #define IDKEY_FDRTREEATTR        2901
+      #define IDKEY_FDRCVLFONT         2902
+      #define IDKEY_FDRCVNFONT         2903
+      #define IDKEY_FDRCVIFONT         2904
+      #define IDKEY_FDRTVLFONT         2905
+      #define IDKEY_FDRTVNFONT         2906
+      #define IDKEY_FDRDETAILSATTR     2907
+      #define IDKEY_FDRDVFONT          2908
+      #define IDKEY_FDRDETAILSCLASS    2909
+      #define IDKEY_FDRICONPOS         2910
+      #define IDKEY_FDRINVISCOLUMNS    2914
+      #define IDKEY_FDRINCCLASS        2920
+      #define IDKEY_FDRINCNAME         2921
+      #define IDKEY_FDRFSYSSEARCHINFO  2922
+      #define IDKEY_FILTERCONTENT      2923
+      #define IDKEY_CNRBACKGROUND      2924
+      #define IDKEY_FDRINCCRITERIA     2925
+      #define IDKEY_FDRICONVIEWPOS     2926
+      #define IDKEY_FDRSORTCLASS       2927
+      #define IDKEY_FDRSORTATTRIBS     2928
+      #define IDKEY_FDRSORTINFO        2929
+      #define IDKEY_FDRSNEAKYCOUNT     2930                              /*SNK*/
+      #define IDKEY_FDRLONGARRAY       2931
+      #define IDKEY_FDRSTRARRAY        2932
+      #define IDKEY_FDRCNRBACKGROUND   2933  // This key was only used in
+                                             // internal drivers 8.117-8.139
+      #define IDKEY_FDRBKGNDIMAGEFILE  2934
+      #define IDKEY_FDRBACKGROUND      2935
+      #define IDKEY_FDRSELFCLOSE       2936
+
+      /* Miscellaneous */
+
+      #define PPFONTSTRSIZE 20
+
+      #define ICONPOSSIZE(pI) ( sizeof(ICONPOS) + strlen(pI->szIdentity) )
+      #define PARTIAL_FILLFOLDER_SEM_TIMEOUT 5   /* avoid wasteful       */     //LD62414
+                                                 /* SEM_INDEFEINTE_WAIT  */     //LD62414
+      #define GETATTR(View) (View == OPEN_CONTENTS ? _ContentAttr : \ 
+                             (View == OPEN_TREE ? _TreeAttr : _DetailsAttr))
+      #define FOLDER_DEFATTRS (CV_ICON | CA_OWNERPAINTBACKGROUND     |  \ 
+                               CA_MIXEDTARGETEMPH | CA_OWNERDRAW)
+      #define FOLDER_DEFTREEATTRS (CV_ICON | CA_OWNERPAINTBACKGROUND |  \ 
+                                   CV_TREE | CA_TREELINE | CA_OWNERDRAW)
+      #define FOLDER_DEFDETAILS (CV_DETAIL | CA_OWNERPAINTBACKGROUND |  \ 
+                       CV_MINI | CA_DETAILSVIEWTITLES | CA_MIXEDTARGETEMPH)
+      #define FOLDER_DEFSORT NULL
+
+      /* wpSearchFolder structures */
+       typedef struct _SEARCH_INFO {
+          M_WPObject *ClassToBeFound;
+          BOOL   fSkipExtendedSearchCriteria;
+          PVOID  pvoidExtendedCriteria;
+       } SEARCH_INFO;
+       typedef SEARCH_INFO *PSEARCH_INFO;
+
+      #define MENUBAR_ON         1
+      #define MENUBAR_OFF        0
+      #define MENUBAR_DEFAULT    2
+
+
+/*--------------Migration------------*/
+#define WPFolder_classObj WPFolderClassData.classObject
+#define _WPFolder WPFolder_classObj
+
+
+/*
+ * Declare the class data structure
+ */
+SOMEXTERN struct WPFolderClassDataStructure {
+	SOMClass *classObject;
+	somMToken wpSetFldrFlags;
+	somMToken wpQueryFldrFlags;
+	somMToken wpSetFldrFont;
+	somMToken wpQueryFldrFont;
+	somMToken wpSetNextIconPos;
+	somMToken wpQueryNextIconPos;
+	somMToken wpPopulate;
+	somMToken wpAddToContent;
+	somMToken wpQueryContent;
+	somMToken wpAddFolderView1Page;
+	somMToken wpAddFolderView2Page;
+	somMToken wpAddFolderView3Page;
+	somMToken wpAddFolderIncludePage;
+	somMToken wpAddFolderSortPage;
+	somMToken wpAddFolderBackgroundPage;
+	somMToken wpInitIconPosData;
+	somMToken wpFreeIconPosData;
+	somMToken wpQueryIconPosition;
+	somMToken wpStoreIconPosData;
+	somMToken wpDeleteFromContent;
+	somMToken wpSetFldrAttr;
+	somMToken wpQueryFldrAttr;
+	somMToken wpSetFldrSort;
+	somMToken wpQueryFldrSort;
+	somMToken wpRestoreFldrRunObjs;
+	somMToken wpStoreFldrRunObjs;
+	somMToken withdrawn30;
+	somMToken withdrawn31;
+	somMToken wpDeleteContents;
+	somMToken wpQueryOpenFolders;
+	somMToken wpFolderPrivate1;
+	somMToken wpSearchFolder;
+	somMToken wpSetFldrDetailsClass;
+	somMToken wpQueryFldrDetailsClass;
+	somMToken wpRefresh;
+	somMToken wpSetDetailsColumnVisibility;
+	somMToken wpIsDetailsColumnVisible;
+	somMToken wpFolderPrivate2;
+	somMToken wpFolderPrivate3;
+	somMToken wpFolderPrivate4;
+	somMToken wpFolderPrivate5;
+	somMToken wpSetFldrSortClass;
+	somMToken wpQueryFldrSortClass;
+	somMToken wpSetSortAttribAvailable;
+	somMToken wpIsSortAttribAvailable;
+	somMToken wpFolderPrivate6;
+	somMToken wpContainsFolders;
+	somMToken wpFolderPrivate7;
+	somMToken wpQueryIconViewPos;
+	somMToken wpQueryDefaultView;
+	somMToken wpAddFirstChild;
+	somMToken wpFolderPrivate8;
+	somMToken wpHideFldrRunObjs;
+	somMToken wpFolderPrivate9;
+	somMToken wpFolderPrivate10;
+	somMToken wpFolderPrivate11;
+	somMToken wpFolderPrivate12;
+	somMToken wpFolderPrivate13;
+	somMToken wpFolderPrivate14;
+	somMToken wpFolderPrivate15;
+	somMToken wpFolderPrivate16;
+	somMToken wpFolderPrivate17;
+	somMToken wpFolderPrivate18;
+	somMToken wpFolderPrivate19;
+	somMToken wpFolderPrivate20;
+	somMToken wpFolderPrivate21;
+	somMToken wpFolderPrivate22;
+	somMToken wpFolderPrivate23;
+	somMToken wpModifyFldrFlags;
+	somMToken wpFolderPrivate24;
+	somMToken wpFolderPrivate25;
+	somMToken wpFolderPrivate26;
+	somMToken wpFolderPrivate27;
+	somMToken wpFolderPrivate28;
+	somMToken wpQueryIconTextBackgroundColor;
+	somMToken wpSetIconTextBackgroundColor;
+	somMToken wpFolderPrivate29;
+	somMToken wpFolderPrivate30;
+	somMToken wpFolderPrivate31;
+	somMToken wpQueryIconTextColor;
+	somMToken wpSetIconTextColor;
+	somMToken wpQueryIconTextVisibility;
+	somMToken wpSetIconTextVisibility;
+	somMToken wpAddFolderSelfClosePage;
+	somMToken wpFolderPrivate32;
+	somMToken wpFolderPrivate33;
+	somMToken wpFolderPrivate34;
+	somMToken wpFolderPrivate35;
+	somMToken wpFolderPrivate36;
+	somMToken wpFolderPrivate37;
+	somMToken wpFolderPrivate38;
+	somMToken wpFolderPrivate39;
+	somMToken wpFolderPrivate40;
+	somMToken wpFolderPrivate41;
+	somMToken wpFolderPrivate42;
+	somMToken wpAddFolderMenu2Page;
+	somMToken wpSetMenuBarVisibility;
+	somMToken wpQueryMenuBarVisibility;
+	somMToken wpFolderPrivate43;
+	somMToken wpFolderPrivate44;
+	somMToken wpFolderPrivate45;
+	somMToken wpFlushNotifications;
+	somMToken wpSetShadowTextColor;
+	somMToken wpQueryShadowTextColor;
+	somMToken wpSetFldrBackground;
+	somMToken wpQueryFldrBackground;
+	somMToken wpSetFldrGrid;
+	somMToken wpQueryFldrGrid;
+} SOMDLINK WPFolderClassData;
+
+/*
+ * Declare the C specific class data structure
+ */
+SOMEXTERN struct WPFolderCClassDataStructure {
+	somMethodTabs parentMtab;
+	somDToken instanceDataToken;
+} SOMDLINK WPFolderCClassData;
+
+
+/*
+ * Override method: wpSetup
+ */
+#define WPFolder_wpSetup(somSelf,pszSetupString) \
+	WPObject_wpSetup(somSelf,pszSetupString)
+
+
+/*
+ * New Method: wpAddToContent
+ */
+typedef BOOL   SOMLINK somTP_WPFolder_wpAddToContent(WPFolder *somSelf,
+		WPObject* Object);
+//#pragma linkage(somTP_WPFolder_wpAddToContent, system)
+typedef somTP_WPFolder_wpAddToContent *somTD_WPFolder_wpAddToContent;
+#define somMD_WPFolder_wpAddToContent "::WPFolder::wpAddToContent"
+#define WPFolder_wpAddToContent(somSelf,Object) \
+    (SOM_Resolve(somSelf, WPFolder, wpAddToContent) \
+	(somSelf,Object))
+#ifndef SOMGD_wpAddToContent
+    #if (defined(_wpAddToContent) || defined(__wpAddToContent))
+        #undef _wpAddToContent
+        #undef __wpAddToContent
+        #define SOMGD_wpAddToContent 1
+    #else
+        #define _wpAddToContent WPFolder_wpAddToContent
+    #endif /* _wpAddToContent */
+#endif /* SOMGD_wpAddToContent */
+
+
+/*
+ * New Method: wpDeleteFromContent
+ */
+typedef BOOL   SOMLINK somTP_WPFolder_wpDeleteFromContent(WPFolder *somSelf,
+		WPObject* Object);
+//#pragma linkage(somTP_WPFolder_wpDeleteFromContent, system)
+typedef somTP_WPFolder_wpDeleteFromContent *somTD_WPFolder_wpDeleteFromContent;
+#define somMD_WPFolder_wpDeleteFromContent "::WPFolder::wpDeleteFromContent"
+#define WPFolder_wpDeleteFromContent(somSelf,Object) \
+    (SOM_Resolve(somSelf, WPFolder, wpDeleteFromContent) \
+	(somSelf,Object))
+#ifndef SOMGD_wpDeleteFromContent
+    #if (defined(_wpDeleteFromContent) || defined(__wpDeleteFromContent))
+        #undef _wpDeleteFromContent
+        #undef __wpDeleteFromContent
+        #define SOMGD_wpDeleteFromContent 1
+    #else
+        #define _wpDeleteFromContent WPFolder_wpDeleteFromContent
+    #endif /* _wpDeleteFromContent */
+#endif /* SOMGD_wpDeleteFromContent */
+
+
+
+/******************************************************/
+
+
+
+
+#pragma SOMAsDefault(on)
+class WPFolder : public WPFileSystem {
+
+	#pragma SOMClassName(*, "WPFolder")
+	#pragma SOMNoMangling(*)
+	#pragma SOMNonDTS(*)
+
+     #pragma SOMClassName (WPFolder, "WPFolder")
+//     #pragma SOMMetaClass (WPFolder, "M_WPFolder")
+     #pragma SOMClassVersion (WPFolder, 1, 2)
+     #pragma SOMCallstyle (oidl)
+     #pragma SOMAsDefault(off)
+     #pragma SOMAsDefault(pop)
+  public :
+     virtual BOOL wpSetFldrFlags(ULONG ulFlags);
+     virtual ULONG wpQueryFldrFlags();
+     virtual BOOL wpSetFldrFont(PSZ pszFont, ULONG ulView);
+     virtual PSZ wpQueryFldrFont(ULONG ulView);
+     virtual BOOL wpSetFldrAttr(ULONG Attr, ULONG ulView);
+     virtual ULONG wpQueryFldrAttr(ULONG ulView);
+     virtual BOOL wpSetNextIconPos(PPOINTL pptl);
+     virtual PPOINTL wpQueryNextIconPos();
+     virtual BOOL wpPopulate(ULONG ulReserved, PSZ pszPath, BOOL fFoldersOnly);
+     virtual WPObject* wpQueryContent(WPObject* Object, ULONG ulOption);
+     virtual ULONG wpAddFolderView1Page(HWND hwndNotebook);
+     virtual ULONG wpAddFolderView2Page(HWND hwndNotebook);
+     virtual ULONG wpAddFolderView3Page(HWND hwndNotebook);
+     virtual ULONG wpAddFolderIncludePage(HWND hwndNotebook);
+     virtual ULONG wpAddFolderSortPage(HWND hwndNotebook);
+     virtual ULONG wpAddFolderBackgroundPage(HWND hwndNotebook);
+     virtual ULONG wpAddFolderSelfClosePage(HWND hwndNotebook);
+     virtual BOOL wpInitIconPosData();
+     virtual void wpFreeIconPosData();
+     virtual BOOL wpStoreIconPosData(PICONPOS pIconPos, ULONG cbSize);
+     virtual BOOL wpQueryIconPosition(PSZ pszIdentity, PPOINTL pptl, 
+                                      PULONG pIndex);
+     virtual BOOL wpSetFldrSort(PVOID pSortRecord, ULONG ulView, 
+                                ULONG ulType);
+     virtual PVOID wpQueryFldrSort(ULONG ulView, ULONG ulType);
+     virtual BOOL wpRestoreFldrRunObjs();
+     virtual BOOL wpStoreFldrRunObjs(ULONG ulType);
+     virtual BOOL wpHideFldrRunObjs(BOOL fHide);
+     virtual ULONG wpDeleteContents(ULONG fConfirmations);
+     virtual BOOL wpSetFldrDetailsClass(M_WPObject* Class);
+     virtual M_WPObject* wpQueryFldrDetailsClass();
+     virtual BOOL wpSearchFolder(PSZ pszName, ULONG ulSearchType, 
+                                 ULONG ulLen, PSEARCH_INFO pInfo, 
+                                 WPFolder* ResultFolder);
+     virtual BOOL wpContainsFolders(BOOL* pfSubFolders);
+     virtual WPObject* wpQueryOpenFolders(ULONG ulOption);
+     virtual BOOL wpModifyFldrFlags(ULONG ulFlags, ULONG ulFlagMask);
+     virtual BOOL wpAddToContent(WPObject* Object);
+     virtual BOOL wpDeleteFromContent(WPObject* Object);
+     virtual BOOL wpSetDetailsColumnVisibility(ULONG index, BOOL Visible);
+     virtual BOOL wpIsDetailsColumnVisible(ULONG index);
+     virtual BOOL wpSetFldrSortClass(M_WPObject* Class);
+     virtual M_WPObject* wpQueryFldrSortClass();
+     virtual BOOL wpSetSortAttribAvailable(ULONG index, BOOL Available);
+     virtual BOOL wpIsSortAttribAvailable(ULONG index);
+     virtual char* wpQueryIconViewPos();
+     virtual WPObject* wpAddFirstChild();
+     virtual void wpInitData();
+     virtual void wpUnInitData();
+     virtual BOOL wpFree();
+     virtual ULONG wpDelete(ULONG fConfirmations);
+     virtual ULONG wpConfirmDelete(ULONG fConfirmations);
+     virtual BOOL wpSaveState();
+     virtual BOOL wpRestoreState(ULONG ulReserved);
+     virtual BOOL wpMenuItemSelected(HWND hwndFrame, ULONG ulMenuId);
+     virtual BOOL wpModifyPopupMenu(HWND hwndMenu, HWND hwndCnr, 
+                                    ULONG iPosition);
+     virtual BOOL wpAddSettingsPages(HWND hwndNotebook);
+     virtual HWND wpOpen(HWND hwndCnr, ULONG ulView, ULONG param);
+     virtual BOOL wpSetup(PSZ pszSetupString);
+     virtual BOOL wpMoveObject(WPFolder* Folder);
+     virtual MRESULT wpDrop(HWND hwndCnr, PDRAGINFO pdrgInfo, 
+                            PDRAGITEM pdrgItem);
+     virtual MRESULT wpDragOver(HWND hwndCnr, PDRAGINFO pdrgInfo);
+     virtual BOOL wpMenuItemHelpSelected(ULONG MenuId);
+     virtual ULONG wpAddFile3Page(HWND hwndNotebook);
+     virtual ULONG wpAddFile2Page(HWND hwndNotebook);
+     virtual BOOL wpFormatDragItem(PDRAGITEM pdrgItem);
+     virtual MRESULT wpRender(PDRAGTRANSFER pdxfer);
+     virtual BOOL wpRefresh(ULONG ulView, PVOID pReserved);
+     virtual ULONG wpFilterPopupMenu(ULONG ulFlags, HWND hwndCnr, 
+                                     BOOL fMultiSelect);
+     virtual ULONG wpQueryDefaultView();
+     virtual MRESULT wpRenderComplete(PDRAGTRANSFER pdxfer, ULONG ulResult);
+     virtual BOOL wpQueryDefaultHelp(PULONG pHelpPanelId, PSZ HelpLibrary);
+     virtual void wpObjectReady(ULONG ulCode, WPObject* refObject);
+     virtual ULONG wpAddObjectWindowPage(HWND hwndNotebook);
+     virtual BOOL wpSetIconData(PICONINFO pIconInfo);
+  /* These are from Warp 4 */
+     virtual BOOL wpSetMenuBarVisibility(ULONG ulVisibility);
+     virtual ULONG wpQueryMenuBarVisibility();
+
+     #pragma SOMReleaseOrder ( \
+			      "wpSetFldrFlags", \
+			      "wpQueryFldrFlags", \
+			      "wpSetFldrFont", \
+			      "wpQueryFldrFont", \
+			      "wpSetNextIconPos", \
+			      "wpQueryNextIconPos", \
+			      "wpPopulate", \
+			      "wpAddToContent", \
+			      "wpQueryContent", \
+			      "wpAddFolderView1Page", \
+			      "wpAddFolderView2Page", \
+			      "wpAddFolderView3Page", \
+			      "wpAddFolderIncludePage", \
+			      "wpAddFolderSortPage", \
+			      "wpAddFolderBackgroundPage", \
+			      "wpInitIconPosData", \
+			      "wpFreeIconPosData", \
+			      "wpQueryIconPosition", \
+			      "wpStoreIconPosData", \
+			      "wpDeleteFromContent", \
+			      "wpSetFldrAttr", \
+			      "wpQueryFldrAttr", \
+			      "wpSetFldrSort", \
+			      "wpQueryFldrSort", \
+			      "wpRestoreFldrRunObjs", \
+			      "wpStoreFldrRunObjs", \
+			      *, \
+			      *, \
+			      "wpDeleteContents", \
+			      "wpQueryOpenFolders", \
+			      *, \
+			      "wpSearchFolder", \
+			      "wpSetFldrDetailsClass", \
+			      "wpQueryFldrDetailsClass", \
+						"wpSetDetailsColumnVisibility", \
+			      "wpIsDetailsColumnVisible", \
+			      *, \
+			      *, \
+			      *, \
+			      *, \
+			      "wpSetFldrSortClass", \
+			      "wpQueryFldrSortClass", \
+			      "wpSetSortAttribAvailable", \
+			      "wpIsSortAttribAvailable", \
+			      *, \
+			      "wpContainsFolders", \
+			      *, \
+			      "wpQueryIconViewPos", \
+						"wpAddFirstChild", \
+			      *, \
+			      "wpHideFldrRunObjs", \
+			      *, \
+			      *, \
+			      *, \
+			      *, \
+			      *, \
+			      *, \
+			      *, \
+			      *, \
+			      *, \
+			      *, \
+			      *, \
+			      *, \
+			      *, \
+			      *, \
+			      *, \
+			      "wpModifyFldrFlags", \
+			      *, \
+			      *, \
+			      *, \
+			      *, \
+			      *, \
+			      *, \
+			      *, \
+			      *, \
+			      *, \
+			      *, \
+			      *, \
+			      *, \
+			      *, \
+			      *, \
+			      "wpAddFolderSelfClosePage", \
+			      *, \        
+			      *, \      
+			      *, \
+                  *, \
+                  *, \
+                  *, \
+                  *, \
+                  *, \
+                  *, \
+                  *, \
+                  *,\
+                                         \
+                  *, \
+                  "wpSetMenuBarVisibility", \
+                  "wpQueryMenuBarVisibility", \
+                  *, \
+                  *, \
+                  *, \
+                  *, \
+                  *, \
+                  *, \
+                  *, \
+                  *, \
+                  *, \
+                  *)
+
+};
+#pragma SOMAsDefault(pop)
+
+     #pragma SOMNonDTS(pop)
+/* End WPFolder */
+
+
+
+
+/* Start Class M_WPFolder */
+
+#include <wpfsys.hh>
+#include <somcls.hh>
+#pragma SOMNonDTS(on)
+
+#pragma SOMAsDefault(on)
+
+/*
+ * Declare the class data structure
+ */
+SOMEXTERN struct M_WPFolderClassDataStructure {
+	SOMClass *classObject;
+	somMToken wpclsFolderPrivate1;
+	somMToken wpclsFolderPrivate2;
+	somMToken wpclsQueryOpenFolders;
+	somMToken wpclsFolderPrivate3;
+	somMToken wpclsQueryIconDataN;
+	somMToken wpclsQueryIconN;
+} SOMDLINK M_WPFolderClassData;
+
+/*
+ * Declare the C specific class data structure
+ */
+SOMEXTERN struct M_WPFolderCClassDataStructure {
+	somMethodTabs parentMtab;
+	somDToken instanceDataToken;
+} SOMDLINK M_WPFolderCClassData;
+
+
+/*
+ * New Method: wpclsQueryOpenFolders
+ */
+typedef WPFolder*   SOMLINK somTP_M_WPFolder_wpclsQueryOpenFolders(M_WPFolder *somSelf, 
+		WPFolder* Folder, 
+		ULONG ulOption, 
+		BOOL fLock);
+//#pragma linkage(somTP_M_WPFolder_wpclsQueryOpenFolders, system)
+typedef somTP_M_WPFolder_wpclsQueryOpenFolders *somTD_M_WPFolder_wpclsQueryOpenFolders;
+#define somMD_M_WPFolder_wpclsQueryOpenFolders "::M_WPFolder::wpclsQueryOpenFolders"
+#define M_WPFolder_wpclsQueryOpenFolders(somSelf,Folder,ulOption,fLock) \
+    (SOM_Resolve(somSelf, M_WPFolder, wpclsQueryOpenFolders) \
+	(somSelf,Folder,ulOption,fLock))
+#ifndef SOMGD_wpclsQueryOpenFolders
+    #if (defined(_wpclsQueryOpenFolders) || defined(__wpclsQueryOpenFolders))
+        #undef _wpclsQueryOpenFolders
+        #undef __wpclsQueryOpenFolders
+        #define SOMGD_wpclsQueryOpenFolders 1
+    #else
+        #define _wpclsQueryOpenFolders M_WPFolder_wpclsQueryOpenFolders
+    #endif /* _wpclsQueryOpenFolders */
+#endif /* SOMGD_wpclsQueryOpenFolders */
+
+class M_WPFolder : public M_WPFileSystem {
+
+	#pragma SOMClassName(*, "M_WPFolder")
+	#pragma SOMNoMangling(*)
+	#pragma SOMNonDTS(*)
+
+     #pragma SOMClassVersion (M_WPFolder, 1, 2)
+     #pragma SOMCallstyle (oidl)
+     #pragma SOMAsDefault(off)
+     #pragma SOMAsDefault(pop)
+  public :
+     virtual ULONG wpclsQueryIconDataN(ICONINFO* pIconInfo, ULONG ulIconIndex);
+     virtual HPOINTER wpclsQueryIconN(ULONG ulIconIndex);
+     virtual WPFolder* wpclsQueryOpenFolders(WPFolder* Folder, 
+                                             ULONG ulOption, 
+                                             BOOL fLock);
+     virtual void wpclsInitData();
+     virtual ULONG wpclsQueryDefaultView();
+     virtual PSZ wpclsQueryTitle();
+     virtual ULONG wpclsQueryIconData(PICONINFO pIconInfo);
+     virtual ULONG wpclsQueryStyle();
+     virtual BOOL wpclsQueryDefaultHelp(PULONG pHelpPanelId, 
+                                        PSZ pszHelpLibrary);
+     #pragma SOMReleaseOrder ( \
+			      *, \
+			      *, \
+			      "wpclsQueryOpenFolders", \
+			      *, \
+			      "wpclsQueryIconDataN", \
+			      "wpclsQueryIconN")
+};
+     #pragma SOMMetaClass (WPFolder, "M_WPFolder")
+
+#pragma SOMAsDefault(pop)
+
+     #pragma SOMNonDTS(pop)
+/* End M_WPFolder */
+#endif /* _DTS_HH_INCLUDED_wpfolder */
Index: /tags/CWMM-0.3.0_GA/mediafolder/include/wpobject.hh
===================================================================
--- /tags/CWMM-0.3.0_GA/mediafolder/include/wpobject.hh	(revision 213)
+++ /tags/CWMM-0.3.0_GA/mediafolder/include/wpobject.hh	(revision 213)
@@ -0,0 +1,1985 @@
+#ifndef _DTS_HH_INCLUDED_wpobject
+#define _DTS_HH_INCLUDED_wpobject
+/* Start Class WPObject */
+
+// This file was generated by the IBM "DirectToSOM" emitter for C++ (V1.77)
+// Generated at 10/22/96 06:18:53 EDT
+// This is class: WPObject
+// Mangled class name: WPObject
+// SE: May 19/94
+
+#pragma SOMAsDefault(off)
+
+/********************************************/
+
+      /* Object style flags (see wpSetStyle) */
+
+      #define OBJSTYLE_NOMOVE          2
+      #define OBJSTYLE_NOLINK          4
+      #define OBJSTYLE_NOCOPY          8
+      #define OBJSTYLE_NOTDEFAULTICON 16   /* Intentionally not declared CLSSTYLE */
+      #define OBJSTYLE_TEMPLATE       32
+      #define OBJSTYLE_NODELETE       64
+      #define OBJSTYLE_NOPRINT       128
+      #define OBJSTYLE_NODRAG        256
+      #define OBJSTYLE_NOTVISIBLE    512
+      #define OBJSTYLE_NOSETTINGS   1024
+      #define OBJSTYLE_NORENAME     2048
+      #define OBJSTYLE_NODROP       4096
+      #define OBJSTYLE_NODROPON     8192   /* Use instead of OBJSTYLE_NODROP,
+                                              because OBJSTYLE_NODROP and
+                                              CLSSTYLE_PRIVATE have the same
+                                              value (DD 86093F) */
+      #define OBJSTYLE_CUSTOMICON   16384  /* Use instead of OBJSTYLE_NOTDEFAULTICON
+                                               because OBJSTYLE_NOTDEFAULTICON and
+                                               CLSSTYLE_NEVERTEMPLATE have the same
+                                               value (DD 86093F) */
+
+     /*  Class style flags (see wpclsQueryStyle) */
+
+      #define CLSSTYLE_NEVERMOVE      OBJSTYLE_NOMOVE
+      #define CLSSTYLE_NEVERLINK      OBJSTYLE_NOLINK
+      #define CLSSTYLE_NEVERCOPY      OBJSTYLE_NOCOPY
+      #define CLSSTYLE_NEVERTEMPLATE  16
+      #define CLSSTYLE_NEVERDELETE    OBJSTYLE_NODELETE
+      #define CLSSTYLE_NEVERPRINT     OBJSTYLE_NOPRINT
+      #define CLSSTYLE_NEVERDRAG      OBJSTYLE_NODRAG
+      #define CLSSTYLE_NEVERVISIBLE   OBJSTYLE_NOTVISIBLE
+      #define CLSSTYLE_NEVERRENAME    OBJSTYLE_NORENAME
+      #define CLSSTYLE_PRIVATE        4096   /* Intentionally not declared OBJSTYLE */
+      #define CLSSTYLE_NEVERSETTINGS  OBJSTYLE_NOSETTINGS                      /*DD 86093F*/
+      #define CLSSTYLE_NEVERDROPON    OBJSTYLE_NODROPON                        /*DD 86093F*/
+      #define CLSSTYLE_HIDDEN         32768  /* Use instead of CLSSTYLE_PRIVATE
+                                                 because OBJSTYLE_NODROP and
+                                                 CLSSTYLE_PRIVATE have the same
+                                                 value (DD 86093F) */
+      #define CLSSTYLE_DONTTEMPLATE   65536  /* Use instead of CLSSTYLE_NEVERTEMPLATE
+                                                 because OBJSTYLE_NOTDEFAULTICON and
+                                                 CLSSTYLE_NEVERTEMPLATE have the same
+                                                 value (DD 86093F) */
+
+      #define SETTINGS_PAGE_REMOVED  -1
+
+
+      /* Notes: The class name immediately follows the control block. The
+       *        first instance variable control block immediately follows
+       *        this.
+       */
+      typedef struct _WPSRCLASSBLOCK
+      {
+        SHORT   ClassNameLength;       /* Length of class name, including the
+                                        * .. null terminator. This must be a
+                                        * .. SHORT and must be at the beginning
+                                        * .. of the structure.
+                                        */
+        USHORT  IVarLength;            /* Length of instance variable
+                                        * .. information, including the two-
+                                        * .. byte null terminator
+                                        */
+      } WPSRCLASSBLOCK;
+
+ //GKY missing? fixme
+ typedef struct _FILTERFLAGS
+      {
+         ULONG       cbItem;
+         ULONG       Flags[3];
+      } FILTERFLAGS;
+      typedef FILTERFLAGS *PFILTERFLAGS;
+
+
+      /* This control structure does not reside in the dormant state.
+       * It is used only when a persistant data block is
+       * resident in memory - either when an object is being saved or
+       * when it is being restored...
+       */
+      typedef struct _OBJDATA
+      {
+         WPSRCLASSBLOCK       *CurrentClass;
+         WPSRCLASSBLOCK       *First;
+         PUCHAR                NextData;
+         USHORT                Length;
+      } OBJDATA;
+      typedef OBJDATA *POBJDATA;
+
+     /*  wpCnrInsertObject/wpCnrRemoveObject structs
+       *  and macros...
+       */
+
+      typedef struct _CLASSDETAILS     /* Class Details struct */
+      {
+         PSZ          pszAttribute;    /* Translatable string for a class attribute*/
+         PVOID        pSortRecord;     /* Function pointer for sort function for attribute*/
+         struct _CLASSDETAILS *pNext; /* Next item in class details list */
+      } CLASSDETAILS;
+      typedef CLASSDETAILS *PCLASSDETAILS;
+
+
+     /* Details comparison function definition
+       *
+       *    Param1  PVOID   - Pointer to details field value
+       *    Param2  PVOID   - Pointer to value to be compared with
+       *
+       *    Returns LONG    - Must be CMP_EQUAL, CMP_GREATER, CMP_LESS
+       */
+      typedef LONG (EXPENTRY FNCOMPARE)(PVOID,PVOID);
+      typedef FNCOMPARE *PFNCOMPARE;
+
+
+     /* This structure is always followed immediately by a type
+       * dependant struct such as MEMORYITEM,RECORDITEM,VIEWITEM
+       * or some other user defined structure...
+       */
+      typedef struct _USEITEM
+      {
+         ULONG  type;                  /* Type of this Item */
+         struct _USEITEM *pNext;   /* Next item in use list */
+      } USEITEM;
+      typedef USEITEM *PUSEITEM;
+
+      #define USAGE_MEMORY          1  /* Values of 'type' */
+      #define USAGE_RECORD          4
+      #define USAGE_OPENVIEW        5
+      #define USAGE_LINK            6
+      #define USAGE_OPENFILE       20
+
+      typedef struct _MEMORYITEM       /* USAGE_MEMORY struct */
+      {
+         ULONG     cbBuffer;           /* Number of bytes in memory block */
+      } MEMORYITEM;
+      typedef MEMORYITEM *PMEMORYITEM;
+
+    typedef struct _RECORDITEM       /* USAGE_RECORD struct */
+      {
+         HWND            hwndCnr;      /* Cnr into which object is inserted */
+         PMINIRECORDCORE pRecord;      /* Record pointer within that cnr */
+         ULONG           ulUser;       /* For application use RECSH */
+      } RECORDITEM;
+      typedef RECORDITEM *PRECORDITEM;
+
+      typedef struct _VIEWITEM         /* USAGE_OPENVIEW struct */
+      {
+         ULONG        view;            /* Object view that this represents */
+         LHANDLE      handle;          /* Open handle */
+         ULONG        ulViewState;     /* View State flags */
+         HWND         hwndCnr;         /* System use only (window animation) */
+         PMINIRECORDCORE pRecord;      /* System use only (window animation) */
+      } VIEWITEM;
+      typedef VIEWITEM *PVIEWITEM;
+
+      typedef struct _LINKITEM         /* USAGE_LINK struct */
+      {
+         WPObject    *LinkObj;         /* The link object */
+      } LINKITEM;
+      typedef LINKITEM *PLINKITEM;
+
+      typedef struct _VIEWFILE         /* USAGE_OPENFILE struct */
+      {
+         ULONG        ulMenuId;        /* Menu id if association or menu page */
+         LHANDLE      handle;          /* Open handle */
+         HWND         hwndCnr;         /* System use only (window animation) */
+         PMINIRECORDCORE pRecord;      /* System use only (window animation) */
+      } VIEWFILE;
+      typedef VIEWFILE *PVIEWFILE;
+
+
+     #define VIEWSTATE_OPENING       0x0001   /* The view is being opened */
+      #define VIEWSTATE_OBJECTDELETED 0x0002   /* The object has been deleted */
+      #define VIEWSTATE_USERHIDDEN    0x0004   /* The view was hidden by user */
+      #define VIEWSTATE_POPULATING    0x0008   /* The view is populating      */
+      #define VIEWSTATE_USERMINIMIZED 0x0010   /* The view was minimized by the user */
+      #define VIEWSTATE_CLOSING       0x0020   /* The view is closing */
+      #define VIEWSTATE_DELETING      0x0040   /* The object is being deleted */
+
+
+     typedef struct _TASKREC
+      {
+         struct _TASKREC *next;     /* next in the list of current tasks   */
+         ULONG            useCount; /* can be referenced by multiple object*/
+         PVOID            pStdDlg;  /* ptr to standard WP task dialog      */
+         WPFolder        *folder;   /* intended folder for the object      */
+         LONG             xOrigin;  /* intended position for the object    */
+         LONG             yOrigin;  /* intended position for the object    */
+         PSZ              pszTitle; /* intended name for the object        */
+         ULONG            cbTitle;  /* length of the name buffer           */
+         PMINIRECORDCORE  positionAfterRecord; /* intended sort position   */
+         BOOL            fKeepAssociations;
+         PVOID            pReserved;    /* reserved - equal null           */
+
+      }  TASKREC;
+      typedef TASKREC *PTASKREC;
+
+
+
+      /* Owner draw function definition
+       *
+       *    Param1  HWND  - Handle of window that is being painted
+       *    Param2  PVOID - POWNERITEM structure pointer, see the container
+       *                    control programming reference for the meaning
+       *                    of the fields in this structure.
+       *    Param3  PVOID - Pointer to the comparison value to draw (this
+       *                    is NULL, except when this function is painting
+       *                    its value into the include criteria dialog
+       *                    when it points to Criteria.CompareValue...)
+       *
+       *    Returns BOOL  - TRUE if the field was ownerdrawn, FALSE if the
+       *                    container control should do default painting.
+       */
+      typedef BOOL (EXPENTRY FNOWNDRW)(HWND,PVOID,PVOID);
+      typedef FNOWNDRW *PFNOWNDRW;
+
+      /* Structure for wpclsQueryDetailsInfo method
+       *
+       * CLASSFIELDINFO is identical to the FIELDINFO structure of the
+       * container control with the following differences:
+       *
+       * - The offStruct field from FIELDINFO is reserved.
+       * - The offFieldData and usLenFieldData structure elements have
+       *   been added.
+       * - Compare/Sort/Ownerdraw fields have also been added for the
+       *   convenience of the programmer, so that object details can
+       *   be customized and objects can be found or included by any
+       *   of their displayable object details.
+       *
+       * For example if the application has the following details data:
+       *
+       * typedef struct _SAMPLE {
+       *   CDATE   cdate;
+       *   CTIME   ctime;
+       *   PSZ     psz;
+       * }  SAMPLE;
+       *
+       * classfieldinfo[0].offFieldData   = FIELDOFFSET(SAMPLE,cdate);
+       * classfieldinfo[0].ulLenFieldData = FIELDOFFSET(SAMPLE,ctime) -
+       *                                    FIELDOFFSET(SAMPLE,cdate);
+       *
+       * classfieldinfo[1].offFieldData   = FIELDOFFSET(SAMPLE,ctime);
+       * classfieldinfo[1].ulLenFieldData = FIELDOFFSET(SAMPLE,psz) -
+       *                                    FIELDOFFSET(SAMPLE,ctime);
+       *
+       * classfieldinfo[2].offFieldData   = FIELDOFFSET(SAMPLE,psz);
+       * classfieldinfo[2].ulLenFieldData = sizeof(SAMPLE) -
+       *                                    FIELDOFFSET(SAMPLE,psz);
+       *
+       * NOTE: It is essential that the fields be linked in order ex. above
+       *       cdate must be followed by ctime and finally psz.
+       */
+      typedef struct _CLASSFIELDINFO                                    /*!INC*/
+      {
+         /* Details field attributes
+          */
+         ULONG      cb;                  /* size of CLASSFIELDINFO struct  */
+         ULONG      flData;              /* attributes of field's data     */
+         ULONG      flTitle;             /* attributes of field's title    */
+         PVOID      pTitleData;          /* title data (default is string) */
+                                         /* If CFT_BITMAP, must be HBITMAP */
+         ULONG      ulReserved;          /* Reserved                       */
+         PVOID      pUserData;           /* pointer to user data           */
+         struct _CLASSFIELDINFO *pNextFieldInfo; /* pointer to next linked */
+                                                /* CLASSFIELDINFO structure*/
+         ULONG      cxWidth;             /* width of field in pels         */
+         ULONG      offFieldData;        /* offset from beginning of       */
+                                         /*   this class's data for this   */
+                                         /*   field. (first field is 0).   */
+         ULONG      ulLenFieldData;      /* width of data in bytes.        */
+                                         /*   (4 for a pointer).           */
+         PFNOWNDRW  pfnOwnerDraw;        /* Ownerdraw procedure for detail */
+                                         /* column. Can be NULL except if  */
+                                         /* ownerdraw is being used.       */
+         /* Include/Sort parameters
+          */
+         ULONG      flCompare;           /* Flags: for example, use the    */
+                                         /*   COMPARE_SUPPORTED flag if    */
+                                         /*   your field can be compared   */
+         PFNCOMPARE pfnCompare;          /* Comparison function for this   */
+                                         /*   field. Can be NULL unless    */
+                                         /*   ownerdraw is used.           */
+         ULONG      DefaultComparison;   /* This is the default compare    */
+                                         /*   operator in the include      */
+                                         /*   page criteria dialog. (eg:   */
+                                         /*   CMP_LESS_OR_EQUAL)           */
+         ULONG      ulLenCompareValue;   /* Maximum length of the compare  */
+                                         /*   data. Can be NULL unless     */
+                                         /*   ownerdraw is used.           */
+         PVOID      pDefCompareValue;    /* The default value to be used   */
+                                         /*   for comparisons. Can be NULL */
+                                         /*   unless ownerdraw is used.    */
+         PVOID      pMinCompareValue;    /* The default value to be used   */
+                                         /*   for comparisons.Can be NULL  */
+                                         /*   unless ownerdraw is used.    */
+         PVOID      pMaxCompareValue;    /* The default value to be used   */
+                                         /*   for comparisons.Can be NULL  */
+                                         /*   unless ownerdraw is used.    */
+         PSZ        pszEditControlClass; /* Window class to be used to edit*/
+                                         /*   the compare value. Can be    */
+                                         /*   NULL unless ownerdraw is used*/
+         PFNCOMPARE pfnSort;             /* Sort function for this @SM09511*/
+                                         /*   field. Can be NULL unless    */
+                                         /*   ownerdraw is used.           */
+         PSZ        *pNewComp;
+      } CLASSFIELDINFO;
+
+      typedef CLASSFIELDINFO *PCLASSFIELDINFO;
+
+ #define CMP_EQUAL            0
+      #define CMP_GREATER          1
+      #define CMP_LESS             2
+      #define CMP_GREATER_OR_EQUAL 3
+      #define CMP_LESS_OR_EQUAL    4
+      #define CMP_NOT_EQUAL        5
+
+      #define NUM_CMP_VALUES       6
+
+
+      #define COMPARE_SUPPORTED      1
+      #define SORTBY_SUPPORTED       2
+
+      /* Standard notebook size constants */
+      #define STDNOTEBOOKWIDTH    290
+      #define STDNOTEBOOKHEIGHT   275
+
+      /* Confirm flags */
+      #define CONFIRM_DELETE             0x0001
+      #define CONFIRM_DELETEFOLDER       0x0002
+      #define CONFIRM_RENAMEFILESWITHEXT 0x0004
+      #define CONFIRM_KEEPASSOC          0x0008
+      #define CONFIRM_ACTION             0x0010
+      #define CONFIRM_PROGRESS           0x0020
+      #define CONFIRM_ALLOWFORCEDELETE   0x0040
+      #define CONFIRM_FORCEDELETE        0x0080
+
+      #define OK_DELETE             1
+      #define NO_DELETE             2
+      #define CANCEL_DELETE         3
+
+      #define NUM_OBJDETAILS_FIELDS    5     /* number of object details */
+
+      /* Search Type for wpclsQueryExtendedCriteria */
+
+      #define SEARCH_ALL_FOLDERS 1
+      #define SEARCH_THIS_FOLDER 2
+      #define SEARCH_THIS_TREE   3
+
+
+      /* Find method related types and constants */
+
+      typedef WPObject   *OBJECT;                             /* FIND */
+      typedef OBJECT     *POBJECT;
+      typedef M_WPObject *CLASS;
+      typedef CLASS      *PCLASS;
+      typedef LHANDLE     HFIND;
+      typedef HFIND      *PHFIND;
+
+     /*  Flags for the wpFilterPopupMenu() method */
+
+      #define CTXT_CRANOTHER     0x0001   /* Flags for ulFlags */
+      #define CTXT_NEW           CTXT_CRANOTHER
+      #define CTXT_OPEN          0x0002
+      #define CTXT_WINDOW        0x0004
+      #define CTXT_SWITCHTO      CTXT_WINDOW
+      #define CTXT_CLOSE         0x0008
+      #define CTXT_SETTINGS      0x0010
+      #define CTXT_PRINT         0x0020
+      #define CTXT_HELP          0x0040
+      #define CTXT_DELETE        0x0080
+      #define CTXT_COPY          0x0100
+      #define CTXT_MOVE          0x0200
+      #define CTXT_SHADOW        0x0400
+      #define CTXT_LINK          CTXT_SHADOW
+      #define CTXT_PROGRAM       0x0800
+      #define CTXT_ICON        0x001000
+      #define CTXT_TREE        0x002000
+      #define CTXT_DETAILS     0x004000
+      #define CTXT_FIND        0x008000
+      #define CTXT_SELECT      0x010000
+      #define CTXT_ARRANGE     0x020000
+      #define CTXT_SORT        0x040000
+      #define CTXT_SHUTDOWN    0x080000
+      #define CTXT_LOCKUP      0x100000
+      #define CTXT_PALETTE     0x200000
+      #define CTXT_REFRESH     0x400000
+      #define CTXT_PICKUP      0x800000              /*rme88844*/
+      #define CTXT_PUTDOWN        0x1000000          /*rme88844*/
+      #define CTXT_PUTDOWN_CANCEL 0x2000000          /*rme88844*/
+
+
+     /* Flags for the wpDisplayMenu() method */
+
+     #define MENU_OBJECTPOPUP          0x00000001
+     #define MENU_OPENVIEWPOPUP        0x00000002
+     #define MENU_TITLEBARPULLDOWN     0x00000003
+     #define MENU_TITLEBARPULLDOWNINT  0x00000004
+     #define MENU_USER                 0x80000000
+
+      /* common context menu ids */
+
+      #define WPMENUID_USER          0x6500
+      #define WPMENUID_PRIMARY            0
+      #define WPMENUID_OPEN               1
+      #define WPMENUID_HELP               2
+      #define WPMENUID_PRINT              3
+      #define WPMENUID_SELECT             4
+      #define WPMENUID_SORT               5
+      #define WPMENUID_TREE               123                                 /*DD 86092F*/
+      #define WPMENUID_FIND               8                                   /*DD 86092F*/
+      #define WPMENUID_CREATEANOTHER      101                                 /*DD 86092F*/
+      #define WPMENUID_MOVE               107                                 /*DD 86092F*/
+      #define WPMENUID_COPY               108                                 /*DD 86092F*/
+      #define WPMENUID_DELETE             109                                 /*DD 86092F*/
+      #define WPMENUID_PROPERTIES         112                                 /*DD 86092F*/
+      #define WPMENUID_SELALL             114                                 /*DD 86092F*/
+      #define WPMENUID_DESELALL           115                                 /*DD 86092F*/
+      #define WPMENUID_RESERVED1          118                                 /*DD 86092F*/
+      #define WPMENUID_CLOSE              120                                 /*DD 86092F*/
+      #define WPMENUID_FORMAT             124                                 /*DD 86092F*/
+      #define WPMENUID_CHKDSK             128                                 /*DD 86092F*/
+      #define WPMENUID_FIXDSK             129                                 /*DD 86092F*/
+      #define WPMENUID_PROGRAM            132                                 /*DD 86092F*/
+      #define WPMENUID_COPYDSK            182                                 /*DD 86092F*/
+      #define WPMENUID_LOCKDISK           184                                 /*DD 86092F*/
+      #define WPMENUID_EJECTDISK          185                                 /*DD 86092F*/
+      #define WPMENUID_UNLOCKDISK         186                                 /*DD 86092F*/
+      #define WPMENUID_PICKUP             188                                 /* rme77131*/
+      #define WPMENUID_PUTDOWN            189                                 /* rme77131*/
+      #define WPMENUID_PUTDOWN_COPY       190                                 /* rme77131*/
+      #define WPMENUID_PUTDOWN_MOVE       191                                 /* rme77131*/
+      #define WPMENUID_PUTDOWN_LINK       192                                 /* rme77131*/
+      #define WPMENUID_PUTDOWN_CANCEL     193                                 /* rme77131*/
+      #define WPMENUID_PUTDOWN_CREATE     194                                 /* rme77131*/
+      #define WPMENUID_ICON               303                                 /*DD 86092F*/
+      #define WPMENUID_DETAILS            304                                 /*DD 86092F*/
+      #define WPMENUID_ARRANGE            309                                 /*DD 86092F*/
+      #define WPMENUID_RESERVED2          315                                 /*DD 86092F*/
+      #define WPMENUID_CREATESHADOW       316                                 /*DD 86092F*/
+      #define WPMENUID_PALETTE            317                                 /*DD 86092F*/
+      #define WPMENUID_REFRESH            503                                 /*DD 86092F*/
+      #define WPMENUID_HELP_FOR_HELP      601                                 /*DD 86092F*/
+      #define WPMENUID_HOWTOGETHELP       601                                 /*DD 86092F*/
+      #define WPMENUID_EXTENDEDHELP       602                                 /*DD 86092F*/
+      #define WPMENUID_HELPKEYS           603                                 /*DD 86092F*/
+      #define WPMENUID_HELPINDEX          604                                 /*DD 86092F*/
+      #define WPMENUID_SHUTDOWN           704                                 /*DD 86092F*/
+      #define WPMENUID_LOCKUP             705                                 /*DD 86092F*/
+      #define WPMENUID_LOGIN              708                                 /*DD 86092F*/
+      #define WPMENUID_LOGOUT             709                                 /*DD 86092F*/
+      #define WPMENUID_ASSIGN             710                                 /*DD 86092F*/
+      #define WPMENUID_UNASSIGN           711                                 /*DD 86092F*/
+      #define WPMENUID_ACCESSNEW          712                                 /*DD 86092F*/
+      #define WPMENUID_SYSTEMSETUP        713                                 /*DD 86092F*/
+
+
+
+
+     /*  Open views for the wpOpen() method */
+
+      #define OPEN_UNKNOWN      -1
+      #define OPEN_DEFAULT       0
+      #define OPEN_CONTENTS      1
+      #define OPEN_SETTINGS      2
+      #define OPEN_HELP          3
+      #define OPEN_RUNNING       4
+      #define OPEN_PROMPTDLG     5
+      #define OPEN_PALETTE       121                                   /*SPLIT*/
+      #define OPEN_USER          0x6500
+
+
+    /* Macro to return the object associated with a given MINIRECORDCORE
+       * that was inserted using the wpCnrInsertObject method
+       */
+      #define OBJECT_FROM_PREC( prec )   ( (PVOID)( * (((PULONG)prec)-2) ) )
+
+      /* wpDrop method return code  */
+
+      #define RC_DROP_DROPCOMPLETE 2
+      #define RC_DROP_ITEMCOMPLETE 1
+      #define RC_DROP_RENDERING    0
+      #define RC_DROP_ERROR       -1
+
+
+
+#define VIEW_CONTENTS      0x00000001
+#define VIEW_SETTINGS      0x00000002
+#define VIEW_HELP          0x00000004
+#define VIEW_RUNNING       0x00000008
+#define VIEW_DETAILS       0x00000010
+#define VIEW_TREE          0x00000020
+#define VIEW_ANY           0xFFFFFFFF  /* Special case - will find any ViewItem */
+
+
+#include <som.hh>
+
+     #pragma SOMAsDefault(on)
+class SOMClass;
+     #pragma SOMAsDefault(pop)
+     #pragma SOMAsDefault(on)
+class SOMObject;
+     #pragma SOMAsDefault(pop)
+     #pragma SOMAsDefault(on)
+class WPFolder;
+     #pragma SOMAsDefault(pop)
+     #pragma SOMAsDefault(on)
+class M_WPObject;
+     #pragma SOMAsDefault(pop)
+     #pragma SOMAsDefault(on)
+class WPObject;
+     #pragma SOMAsDefault(pop)
+#include <somobj.hh>
+#pragma SOMNonDTS(on)
+
+
+#pragma SOMAsDefault(on)
+
+
+
+/********************************************/
+
+
+
+
+/*********** From WPObject.h ******************/
+/*
+ * External name shortening if required
+ */
+#ifdef SOM_USE_SHORT_EXTERNAL_NAMES
+#define WPObjectNewClass wpobjc
+#pragma linkage(wpobjc, system)
+#define WPObjectClassData wpobjd
+#define WPObjectCClassData wpobjx
+#endif /* SOM_USE_SHORT_EXTERNAL_NAMES */
+
+#ifndef SOM_Resolve
+
+#define somresolve_(obj,mToken) (somResolve(obj,mToken))
+
+/* from oc's mtbl, with verification of o */
+#define SOM_Resolve(o, ocn, mn) \
+    (( somTD_ ## ocn ## _ ## mn ) \
+     somresolve_(SOM_TestCls(o, ocn ## ClassData.classObject), \
+                ocn ## ClassData.mn ))
+#endif
+
+#define WPObject_classObj WPObjectClassData.classObject
+#define _WPObject WPObject_classObj
+
+/*
+ * Declare the class creation procedure
+ */
+SOMEXTERN SOMClass * SOMLINK WPObjectNewClass(integer4 somtmajorVersion,
+		integer4 somtminorVersion);
+
+/*
+ * Declare the class data structure
+ */
+SOMEXTERN struct WPObjectClassDataStructure {
+	SOMClass *classObject;
+	somMToken wpSetTitle;
+	somMToken wpQueryTitle;
+	somMToken wpSetStyle;
+	somMToken wpQueryStyle;
+	somMToken wpSetIcon;
+	somMToken wpQueryIcon;
+	somMToken wpSetFolder;
+	somMToken wpQueryFolder;
+	somMToken wpObjectPrivate1;
+	somMToken wpObjectPrivate2;
+	somMToken wpSetDefaultView;
+	somMToken wpQueryDefaultView;
+	somMToken wpObjectPrivate3;
+	somMToken wpSaveState;
+	somMToken wpObjectPrivate4;
+	somMToken wpObjectPrivate5;
+	somMToken wpSaveLong;
+	somMToken wpSaveString;
+	somMToken wpSaveData;
+	somMToken wpObjectPrivate6;
+	somMToken wpRestoreState;
+	somMToken wpObjectPrivate7;
+	somMToken wpObjectPrivate8;
+	somMToken wpRestoreLong;
+	somMToken wpRestoreString;
+	somMToken wpRestoreData;
+	somMToken wpObjectPrivate9;
+	somMToken wpAllocMem;
+	somMToken wpFreeMem;
+	somMToken wpAddToObjUseList;
+	somMToken wpDeleteFromObjUseList;
+	somMToken wpFindUseItem;
+	somMToken wpSwitchTo;
+	somMToken withdrawn1;
+	somMToken wpFilterPopupMenu;
+	somMToken wpModifyPopupMenu;
+	somMToken wpMenuItemSelected;
+	somMToken wpFormatDragItem;
+	somMToken wpDrop;
+	somMToken wpDragOver;
+	somMToken wpRender;
+	somMToken wpEndConversation;
+	somMToken withdrawn10;
+	somMToken wpObjectPrivate10;
+	somMToken wpObjectPrivate11;
+	somMToken wpFree;
+	somMToken wpCopiedFromTemplate;
+	somMToken wpAddSettingsPages;
+	somMToken wpAddObjectGeneralPage;
+	somMToken wpDisplayHelp;
+	somMToken wpMenuItemHelpSelected;
+	somMToken wpInsertSettingsPage;
+	somMToken wpInsertPopupMenuItems;
+	somMToken withdrawn5;
+	somMToken withdrawn6;
+	somMToken withdrawn4;
+	somMToken withdrawn3;
+	somMToken wpCnrInsertObject;
+	somMToken wpCnrRemoveObject;
+	somMToken wpInitData;
+	somMToken wpUnInitData;
+	somMToken wpSetup;
+	somMToken wpScanSetupString;
+	somMToken wpSaveImmediate;
+	somMToken wpOpen;
+	somMToken wpClose;
+	somMToken wpHide;
+	somMToken wpRestore;
+	somMToken wpSetIconData;
+	somMToken wpQueryIconData;
+	somMToken wpObjectPrivate12;
+	somMToken wpDelete;
+	somMToken wpConfirmDelete;
+	somMToken withdrawn2;
+	somMToken withdrawn11;
+	somMToken withdrawn7;
+	somMToken wpRegisterView;
+	somMToken wpIdentify;
+	somMToken wpSetDefaultHelp;
+	somMToken wpQueryDefaultHelp;
+	somMToken wpDoesObjectMatch;
+	somMToken wpCnrRefreshDetails;
+	somMToken wpSetError;
+	somMToken wpQueryError;
+	somMToken wpDraggedOverObject;
+	somMToken wpDroppedOnObject;
+	somMToken wpSetDefaultIconPos;
+	somMToken wpQueryDefaultIconPos;
+	somMToken wpObjectPrivate13;
+	somMToken wpObjectPrivate14;
+	somMToken wpSetObjectID;
+	somMToken wpQueryObjectID;
+	somMToken wpIsDeleteable;
+	somMToken wpQueryHandle;
+	somMToken wpSaveDeferred;
+	somMToken wpAddObjectWindowPage;
+	somMToken wpQueryConcurrentView;
+	somMToken wpSetConcurrentView;
+	somMToken wpQueryMinWindow;
+	somMToken wpSetMinWindow;
+	somMToken wpViewObject;
+	somMToken wpQueryButtonAppearance;
+	somMToken wpSetButtonAppearance;
+	somMToken wpQueryConfirmations;
+	somMToken wpCnrSetEmphasis;
+	somMToken wpQueryCoreRecord;
+	somMToken wpFindViewItem;
+	somMToken wpCreateFromTemplate;
+	somMethodProc *wpQueryTrueStyle;
+	somMToken wpAssertObjectMutexSem;
+	somMToken wpReleaseObjectMutexSem;
+	somMToken wpRequestObjectMutexSem;
+	somMToken wpCreateAnother;
+	somMToken wpCreateShadowObject;
+	somMToken wpCopyObject;
+	somMToken wpMoveObject;
+	somMToken wpLockObject;
+	somMToken wpUnlockObject;
+	somMToken wpIsLocked;
+	somMToken wpRenderComplete;
+	somMToken wpQueryDetailsData;
+	somMToken wpPrintObject;
+	somMToken wpObjectPrivate15;
+	somMToken wpSetTaskRec;
+	somMToken wpObjectPrivate16;
+	somMToken wpModifyStyle;
+	somMToken wpObjectPrivate17;
+	somMToken wpFindTaskRec;
+	somMToken wpAppendObject;
+	somMToken wpReplaceObject;
+	somMToken wpQueryNameClashOptions;
+	somMToken wpConfirmObjectTitle;
+	somMToken _get_pobjNext;
+	somMToken wpQueryContainerFlagPtr;
+	somMToken wpObjectPrivate18;
+	somMToken wpObjectPrivate19;
+	somMToken wpObjectPrivate20;
+	somMToken wpCnrDeleteUseItem;
+	somMToken wpObjectReady;
+	somMToken wpIsObjectInitialized;
+	somMToken wpCreateShadowObjectExt;
+	somMToken wpObjectPrivate21;
+	somMToken wpObjectPrivate22;
+	somMToken wpObjectPrivate26;
+	somMToken wpDisplayMenu;
+	somMToken wpWaitForClose;
+	somMToken wpQueryScreenGroupID;
+	somMToken wpSetupOnce;
+	somMToken wpAddObjectGeneralPage2;
+	somMToken wpObjectPrivate23;
+	somMToken wpObjectPrivate24;
+	somMToken wpModifyMenu;
+	somMToken wpFilterMenu;
+	somMToken wpInsertMenuItems;
+	somMToken wpSetMenuStyle;
+	somMToken wpQueryMenuStyle;
+	somMToken wpObjectPrivate27;
+	somMToken wpObjectPrivate28;
+	somMToken wpObjectPrivate29;
+	somMToken wpObjectPrivate30;
+	somMToken wpQueryOpenView;
+	somMToken wpSetOpenView;
+	somMToken wpObjectPrivate31;
+	somMToken wpObjectPrivate32;
+	somMToken wpObjectPrivate33;
+} SOMDLINK WPObjectClassData;
+
+/*
+ * Declare the C specific class data structure
+ */
+SOMEXTERN struct WPObjectCClassDataStructure {
+	somMethodTabs parentMtab;
+	somDToken instanceDataToken;
+} SOMDLINK WPObjectCClassData;
+
+
+/*
+ * New and Renew macros for WPObject
+ */
+#define WPObjectNew() \
+   (_somNew(_WPObject ? _WPObject : WPObjectNewClass(WPObject_MajorVersion, WPObject_MinorVersion)))
+#define WPObjectRenew(buf) \
+   (_somRenew(_WPObject ? _WPObject : WPObjectNewClass(WPObject_MajorVersion, WPObject_MinorVersion), buf))
+
+/*
+ * Override method: somInit
+ */
+#define WPObject_somInit(somSelf) \
+	SOMObject_somInit(somSelf)
+
+/*
+ * Override method: somUninit
+ */
+#define WPObject_somUninit(somSelf) \
+	SOMObject_somUninit(somSelf)
+
+/*
+ * Override method: somDefaultInit
+ */
+#define WPObject_somDefaultInit(somSelf,ctrl) \
+	SOMObject_somDefaultInit(somSelf,ctrl)
+
+/*
+ * Override method: somDestruct
+ */
+#define WPObject_somDestruct(somSelf,doFree,ctrl) \
+	SOMObject_somDestruct(somSelf,doFree,ctrl)
+
+/*
+ * New Method: wpAddSettingsPages, inserted by CW
+ */
+typedef ULONG   SOMLINK somTP_WPObject_wpAddSettingsPages(WPObject *somSelf,
+		HWND hwndNotebook);
+//#pragma linkage(somTP_WPObject_wpAddSettingsPages, system)
+typedef somTP_WPObject_wpAddSettingsPages *somTD_WPObject_wpAddSettingsPages;
+#define somMD_WPObject_wpAddSettingsPages "::WPObject::wpAddSettingsPages"
+#define WPObject_wpAddSettingsPages(somSelf,hwndNotebook) \
+    (SOM_Resolve(somSelf, WPObject, wpAddSettingsPages) \
+	(somSelf,hwndNotebook))
+#ifndef SOMGD_wpAddSettingsPages
+    #if (defined(_wpAddSettingsPages) || defined(__wpAddSettingsPages))
+        #undef _wpAddSettingsPages
+        #undef __wpAddSettingsPages
+        #define SOMGD_wpAddSettingsPages 1
+    #else
+        #define _wpAddSettingsPages WPObject_wpAddSettingsPages
+    #endif /* _wpAddSettingsPages */
+#endif /* SOMGD_wpAddSettingsPages */
+
+/*
+ * New Method: wpClose
+ */
+typedef BOOL   SOMLINK somTP_WPObject_wpClose(WPObject *somSelf);
+//#pragma linkage(somTP_WPObject_wpClose, system)
+typedef somTP_WPObject_wpClose *somTD_WPObject_wpClose;
+#define somMD_WPObject_wpClose "::WPObject::wpClose"
+#define WPObject_wpClose(somSelf) \
+    (SOM_Resolve(somSelf, WPObject, wpClose) \
+	(somSelf))
+#ifndef SOMGD_wpClose
+    #if (defined(_wpClose) || defined(__wpClose))
+        #undef _wpClose
+        #undef __wpClose
+        #define SOMGD_wpClose 1
+    #else
+        #define _wpClose WPObject_wpClose
+    #endif /* _wpClose */
+#endif /* SOMGD_wpClose */
+
+
+/*
+ * New Method: wpDelete
+ */
+typedef ULONG   SOMLINK somTP_WPObject_wpDelete(WPObject *somSelf,
+		ULONG fConfirmations);
+//#pragma linkage(somTP_WPObject_wpDelete, system)
+typedef somTP_WPObject_wpDelete *somTD_WPObject_wpDelete;
+#define somMD_WPObject_wpDelete "::WPObject::wpDelete"
+#define WPObject_wpDelete(somSelf,fConfirmations) \
+    (SOM_Resolve(somSelf, WPObject, wpDelete) \
+	(somSelf,fConfirmations))
+#ifndef SOMGD_wpDelete
+    #if (defined(_wpDelete) || defined(__wpDelete))
+        #undef _wpDelete
+        #undef __wpDelete
+        #define SOMGD_wpDelete 1
+    #else
+        #define _wpDelete WPObject_wpDelete
+    #endif /* _wpDelete */
+#endif /* SOMGD_wpDelete */
+
+/*
+ * New Method: wpFilterPopupMenu, inserted by CW
+ */
+typedef ULONG   SOMLINK somTP_WPObject_wpFilterPopupMenu(WPObject *somSelf,
+		ULONG ulFlags,
+		HWND hwndCnr,
+		BOOL fMultiSelect);
+//#pragma linkage(somTP_WPObject_wpFilterPopupMenu, system)
+typedef somTP_WPObject_wpFilterPopupMenu *somTD_WPObject_wpFilterPopupMenu;
+#define somMD_WPObject_wpFilterPopupMenu "::WPObject::wpFilterPopupMenu"
+#define WPObject_wpFilterPopupMenu(somSelf,ulFlags,hwndCnr,fMultiSelect) \
+    (SOM_Resolve(somSelf, WPObject, wpFilterPopupMenu) \
+	(somSelf,ulFlags,hwndCnr,fMultiSelect))
+#ifndef SOMGD_wpFilterPopupMenu
+    #if (defined(_wpFilterPopupMenu) || defined(__wpFilterPopupMenu))
+        #undef _wpFilterPopupMenu
+        #undef __wpFilterPopupMenu
+        #define SOMGD_wpFilterPopupMenu 1
+    #else
+        #define _wpFilterPopupMenu WPObject_wpFilterPopupMenu
+    #endif /* _wpFilterPopupMenu */
+#endif /* SOMGD_wpFilterPopupMenu */
+
+
+
+/*
+ * New Method: wpInitData, inserted by CW
+ */
+typedef ULONG   SOMLINK somTP_WPObject_wpInitData(WPObject *somSelf);
+//#pragma linkage(somTP_WPObject_wpInitData, system)
+typedef somTP_WPObject_wpInitData *somTD_WPObject_wpInitData;
+#define somMD_WPObject_wpInitData "::WPObject::wpInitData"
+#define WPObject_wpInitData(somSelf) \
+    (SOM_Resolve(somSelf, WPObject, wpInitData) \
+	(somSelf))
+#ifndef SOMGD_wpInitData
+    #if (defined(_wpInitData) || defined(__wpInitData))
+        #undef _wpInitData
+        #undef __wpInitData
+        #define SOMGD_wpInitData 1
+    #else
+        #define _wpInitData WPObject_wpInitData
+    #endif /* _wpInitData */
+#endif /* SOMGD_wpInitData */
+
+/*
+ * New Method: wpOpen, inserted by CW
+ */
+typedef HWND   SOMLINK somTP_WPObject_wpOpen(WPObject *somSelf,
+		HWND hwndCnr,
+		ULONG ulView,
+		ULONG param);
+//#pragma linkage(somTP_WPObject_wpOpen, system)
+typedef somTP_WPObject_wpOpen *somTD_WPObject_wpOpen;
+#define somMD_WPObject_wpOpen "::WPObject::wpOpen"
+#define WPObject_wpOpen(somSelf,hwndCnr,ulView,param) \
+    (SOM_Resolve(somSelf, WPObject, wpOpen) \
+	(somSelf,hwndCnr,ulView,param))
+#ifndef SOMGD_wpOpen
+    #if (defined(_wpOpen) || defined(__wpOpen))
+        #undef _wpOpen
+        #undef __wpOpen
+        #define SOMGD_wpOpen 1
+    #else
+        #define _wpOpen WPObject_wpOpen
+    #endif /* _wpOpen */
+#endif /* SOMGD_wpOpen */
+
+/*
+ * New Method: wpInsertSettingsPage (CW)
+ */
+typedef ULONG   SOMLINK somTP_WPObject_wpInsertSettingsPage(WPObject *somSelf,
+		HWND hwndNotebook,
+		PPAGEINFO ppageinfo);
+//#pragma linkage(somTP_WPObject_wpInsertSettingsPage, system)
+typedef somTP_WPObject_wpInsertSettingsPage *somTD_WPObject_wpInsertSettingsPage;
+#define somMD_WPObject_wpInsertSettingsPage "::WPObject::wpInsertSettingsPage"
+#define WPObject_wpInsertSettingsPage(somSelf,hwndNotebook,ppageinfo) \
+    (SOM_Resolve(somSelf, WPObject, wpInsertSettingsPage) \
+	(somSelf,hwndNotebook,ppageinfo))
+#ifndef SOMGD_wpInsertSettingsPage
+    #if (defined(_wpInsertSettingsPage) || defined(__wpInsertSettingsPage))
+        #undef _wpInsertSettingsPage
+        #undef __wpInsertSettingsPage
+        #define SOMGD_wpInsertSettingsPage 1
+    #else
+        #define _wpInsertSettingsPage WPObject_wpInsertSettingsPage
+    #endif /* _wpInsertSettingsPage */
+#endif /* SOMGD_wpInsertSettingsPage */
+
+/*
+ * New Method: wpRestoreState
+ */
+typedef BOOL   SOMLINK somTP_WPObject_wpRestoreState(WPObject *somSelf,
+		ULONG ulReserved);
+//#pragma linkage(somTP_WPObject_wpRestoreState, system)
+typedef somTP_WPObject_wpRestoreState *somTD_WPObject_wpRestoreState;
+#define somMD_WPObject_wpRestoreState "::WPObject::wpRestoreState"
+#define WPObject_wpRestoreState(somSelf,ulReserved) \
+    (SOM_Resolve(somSelf, WPObject, wpRestoreState) \
+	(somSelf,ulReserved))
+#ifndef SOMGD_wpRestoreState
+    #if (defined(_wpRestoreState) || defined(__wpRestoreState))
+        #undef _wpRestoreState
+        #undef __wpRestoreState
+        #define SOMGD_wpRestoreState 1
+    #else
+        #define _wpRestoreState WPObject_wpRestoreState
+    #endif /* _wpRestoreState */
+#endif /* SOMGD_wpRestoreState */
+
+/*
+ * New Method: wpSaveState
+ */
+typedef BOOL   SOMLINK somTP_WPObject_wpSaveState(WPObject *somSelf);
+//#pragma linkage(somTP_WPObject_wpSaveState, system)
+typedef somTP_WPObject_wpSaveState *somTD_WPObject_wpSaveState;
+#define somMD_WPObject_wpSaveState "::WPObject::wpSaveState"
+#define WPObject_wpSaveState(somSelf) \
+    (SOM_Resolve(somSelf, WPObject, wpSaveState) \
+	(somSelf))
+#ifndef SOMGD_wpSaveState
+    #if (defined(_wpSaveState) || defined(__wpSaveState))
+        #undef _wpSaveState
+        #undef __wpSaveState
+        #define SOMGD_wpSaveState 1
+    #else
+        #define _wpSaveState WPObject_wpSaveState
+    #endif /* _wpSaveState */
+#endif /* SOMGD_wpSaveState */
+
+/*
+ * New Method: wpSetupOnce
+ */
+typedef BOOL   SOMLINK somTP_WPObject_wpSetupOnce(WPObject *somSelf,
+		PSZ pszSetupString);
+//#pragma linkage(somTP_WPObject_wpSetupOnce, system)
+typedef somTP_WPObject_wpSetupOnce *somTD_WPObject_wpSetupOnce;
+#define somMD_WPObject_wpSetupOnce "::WPObject::wpSetupOnce"
+#define WPObject_wpSetupOnce(somSelf,pszSetupString) \
+    (SOM_Resolve(somSelf, WPObject, wpSetupOnce) \
+	(somSelf,pszSetupString))
+#ifndef SOMGD_wpSetupOnce
+    #if (defined(_wpSetupOnce) || defined(__wpSetupOnce))
+        #undef _wpSetupOnce
+        #undef __wpSetupOnce
+        #define SOMGD_wpSetupOnce 1
+    #else
+        #define _wpSetupOnce WPObject_wpSetupOnce
+    #endif /* _wpSetupOnce */
+#endif /* SOMGD_wpSetupOnce */
+
+
+/*
+ * New Method: wpUnInitData
+ */
+typedef void   SOMLINK somTP_WPObject_wpUnInitData(WPObject *somSelf);
+//#pragma linkage(somTP_WPObject_wpUnInitData, system)
+typedef somTP_WPObject_wpUnInitData *somTD_WPObject_wpUnInitData;
+#define somMD_WPObject_wpUnInitData "::WPObject::wpUnInitData"
+#define WPObject_wpUnInitData(somSelf) \
+    (SOM_Resolve(somSelf, WPObject, wpUnInitData) \
+	(somSelf))
+#ifndef SOMGD_wpUnInitData
+    #if (defined(_wpUnInitData) || defined(__wpUnInitData))
+        #undef _wpUnInitData
+        #undef __wpUnInitData
+        #define SOMGD_wpUnInitData 1
+    #else
+        #define _wpUnInitData WPObject_wpUnInitData
+    #endif /* _wpUnInitData */
+#endif /* SOMGD_wpUnInitData */
+
+/*
+ * New Method: wpMenuItemSelected
+ */
+typedef BOOL   SOMLINK somTP_WPObject_wpMenuItemSelected(WPObject *somSelf,
+		HWND hwndFrame,
+		ULONG ulMenuId);
+//#pragma linkage(somTP_WPObject_wpMenuItemSelected, system)
+typedef somTP_WPObject_wpMenuItemSelected *somTD_WPObject_wpMenuItemSelected;
+#define somMD_WPObject_wpMenuItemSelected "::WPObject::wpMenuItemSelected"
+#define WPObject_wpMenuItemSelected(somSelf,hwndFrame,ulMenuId) \
+    (SOM_Resolve(somSelf, WPObject, wpMenuItemSelected) \
+	(somSelf,hwndFrame,ulMenuId))
+#ifndef SOMGD_wpMenuItemSelected
+    #if (defined(_wpMenuItemSelected) || defined(__wpMenuItemSelected))
+        #undef _wpMenuItemSelected
+        #undef __wpMenuItemSelected
+        #define SOMGD_wpMenuItemSelected 1
+    #else
+        #define _wpMenuItemSelected WPObject_wpMenuItemSelected
+    #endif /* _wpMenuItemSelected */
+#endif /* SOMGD_wpMenuItemSelected */
+
+
+
+/*
+ * New Method: wpModifyPopupMenu
+ */
+typedef BOOL   SOMLINK somTP_WPObject_wpModifyPopupMenu(WPObject *somSelf,
+		HWND hwndMenu,
+		HWND hwndCnr,
+		ULONG iPosition);
+//#pragma linkage(somTP_WPObject_wpModifyPopupMenu, system)
+typedef somTP_WPObject_wpModifyPopupMenu *somTD_WPObject_wpModifyPopupMenu;
+#define somMD_WPObject_wpModifyPopupMenu "::WPObject::wpModifyPopupMenu"
+#define WPObject_wpModifyPopupMenu(somSelf,hwndMenu,hwndCnr,iPosition) \
+    (SOM_Resolve(somSelf, WPObject, wpModifyPopupMenu) \
+	(somSelf,hwndMenu,hwndCnr,iPosition))
+#ifndef SOMGD_wpModifyPopupMenu
+    #if (defined(_wpModifyPopupMenu) || defined(__wpModifyPopupMenu))
+        #undef _wpModifyPopupMenu
+        #undef __wpModifyPopupMenu
+        #define SOMGD_wpModifyPopupMenu 1
+    #else
+        #define _wpModifyPopupMenu WPObject_wpModifyPopupMenu
+    #endif /* _wpModifyPopupMenu */
+#endif /* SOMGD_wpModifyPopupMenu */
+
+/*
+ * New Method: wpSetup
+ */
+typedef BOOL   SOMLINK somTP_WPObject_wpSetup(WPObject *somSelf,
+		PSZ pszSetupString);
+//#pragma linkage(somTP_WPObject_wpSetup, system)
+typedef somTP_WPObject_wpSetup *somTD_WPObject_wpSetup;
+#define somMD_WPObject_wpSetup "::WPObject::wpSetup"
+#define WPObject_wpSetup(somSelf,pszSetupString) \
+    (SOM_Resolve(somSelf, WPObject, wpSetup) \
+	(somSelf,pszSetupString))
+#ifndef SOMGD_wpSetup
+    #if (defined(_wpSetup) || defined(__wpSetup))
+        #undef _wpSetup
+        #undef __wpSetup
+        #define SOMGD_wpSetup 1
+    #else
+        #define _wpSetup WPObject_wpSetup
+    #endif /* _wpSetup */
+#endif /* SOMGD_wpSetup */
+
+/*
+ * New Method: wpViewObject, adapted and inserted by CW (copied from wpobject.h)
+ */
+
+typedef HWND   SOMLINK somTP_WPObject_wpViewObject(WPObject *somSelf,
+		HWND hwndCnr,
+		ULONG ulView,
+		ULONG param);
+//#pragma linkage(somTP_WPObject_wpViewObject, system) //comment by CW
+typedef somTP_WPObject_wpViewObject *somTD_WPObject_wpViewObject;
+#define somMD_WPObject_wpViewObject "::WPObject::wpViewObject"
+#define WPObject_wpViewObject(somSelf,hwndCnr,ulView,param) \
+    (SOM_Resolve(somSelf, WPObject, wpViewObject) \
+	(somSelf,hwndCnr,ulView,param))
+#ifndef SOMGD_wpViewObject
+    #if (defined(_wpViewObject) || defined(__wpViewObject))
+        #undef _wpViewObject
+        #undef __wpViewObject
+        #define SOMGD_wpViewObject 1
+    #else
+        #define _wpViewObject WPObject_wpViewObject
+    #endif /* _wpViewObject */
+#endif /* SOMGD_wpViewObject */
+
+/*
+ * New Method: wpCreateShadowObjectExt
+ */
+typedef WPObject*   SOMLINK somTP_WPObject_wpCreateShadowObjectExt(WPObject *somSelf,
+		WPFolder* Folder,
+		BOOL fLock,
+		PSZ pszSetup,
+		M_WPObject* shadowClass);
+//#pragma linkage(somTP_WPObject_wpCreateShadowObjectExt, system)
+typedef somTP_WPObject_wpCreateShadowObjectExt *somTD_WPObject_wpCreateShadowObjectExt;
+#define somMD_WPObject_wpCreateShadowObjectExt "::WPObject::wpCreateShadowObjectExt"
+#define WPObject_wpCreateShadowObjectExt(somSelf,Folder,fLock,pszSetup,shadowClass) \
+    (SOM_Resolve(somSelf, WPObject, wpCreateShadowObjectExt) \
+	(somSelf,Folder,fLock,pszSetup,shadowClass))
+#ifndef SOMGD_wpCreateShadowObjectExt
+    #if (defined(_wpCreateShadowObjectExt) || defined(__wpCreateShadowObjectExt))
+        #undef _wpCreateShadowObjectExt
+        #undef __wpCreateShadowObjectExt
+        #define SOMGD_wpCreateShadowObjectExt 1
+    #else
+        #define _wpCreateShadowObjectExt WPObject_wpCreateShadowObjectExt
+    #endif /* _wpCreateShadowObjectExt */
+#endif /* SOMGD_wpCreateShadowObjectExt */
+
+
+/*
+ * New Method: wpCopiedFromTemplate
+ */
+typedef void   SOMLINK somTP_WPObject_wpCopiedFromTemplate(WPObject *somSelf);
+//#pragma linkage(somTP_WPObject_wpCopiedFromTemplate, system)
+typedef somTP_WPObject_wpCopiedFromTemplate *somTD_WPObject_wpCopiedFromTemplate;
+#define somMD_WPObject_wpCopiedFromTemplate "::WPObject::wpCopiedFromTemplate"
+#define WPObject_wpCopiedFromTemplate(somSelf) \
+    (SOM_Resolve(somSelf, WPObject, wpCopiedFromTemplate) \
+	(somSelf))
+#ifndef SOMGD_wpCopiedFromTemplate
+    #if (defined(_wpCopiedFromTemplate) || defined(__wpCopiedFromTemplate))
+        #undef _wpCopiedFromTemplate
+        #undef __wpCopiedFromTemplate
+        #define SOMGD_wpCopiedFromTemplate 1
+    #else
+        #define _wpCopiedFromTemplate WPObject_wpCopiedFromTemplate
+    #endif /* _wpCopiedFromTemplate */
+#endif /* SOMGD_wpCopiedFromTemplate */
+
+/*
+ * New Method: wpDrop
+ */
+typedef MRESULT   SOMLINK somTP_WPObject_wpDrop(WPObject *somSelf,
+		HWND hwndCnr,
+		PDRAGINFO pdrgInfo,
+		PDRAGITEM pdrgItem);
+//#pragma linkage(somTP_WPObject_wpDrop, system)
+typedef somTP_WPObject_wpDrop *somTD_WPObject_wpDrop;
+#define somMD_WPObject_wpDrop "::WPObject::wpDrop"
+#define WPObject_wpDrop(somSelf,hwndCnr,pdrgInfo,pdrgItem) \
+    (SOM_Resolve(somSelf, WPObject, wpDrop) \
+	(somSelf,hwndCnr,pdrgInfo,pdrgItem))
+#ifndef SOMGD_wpDrop
+    #if (defined(_wpDrop) || defined(__wpDrop))
+        #undef _wpDrop
+        #undef __wpDrop
+        #define SOMGD_wpDrop 1
+    #else
+        #define _wpDrop WPObject_wpDrop
+    #endif /* _wpDrop */
+#endif /* SOMGD_wpDrop */
+
+/*
+ * New Method: wpQueryDetailsData
+ */
+typedef ULONG   SOMLINK somTP_WPObject_wpQueryDetailsData(WPObject *somSelf,
+		PVOID* ppDetailsData,
+		PULONG pcp);
+//#pragma linkage(somTP_WPObject_wpQueryDetailsData, system)
+typedef somTP_WPObject_wpQueryDetailsData *somTD_WPObject_wpQueryDetailsData;
+#define somMD_WPObject_wpQueryDetailsData "::WPObject::wpQueryDetailsData"
+#define WPObject_wpQueryDetailsData(somSelf,ppDetailsData,pcp) \
+    (SOM_Resolve(somSelf, WPObject, wpQueryDetailsData) \
+	(somSelf,ppDetailsData,pcp))
+#ifndef SOMGD_wpQueryDetailsData
+    #if (defined(_wpQueryDetailsData) || defined(__wpQueryDetailsData))
+        #undef _wpQueryDetailsData
+        #undef __wpQueryDetailsData
+        #define SOMGD_wpQueryDetailsData 1
+    #else
+        #define _wpQueryDetailsData WPObject_wpQueryDetailsData
+    #endif /* _wpQueryDetailsData */
+#endif /* SOMGD_wpQueryDetailsData */
+
+
+
+#ifndef SOM_DONT_USE_INHERITED_MACROS
+#define WPObject_somDefaultCopyInit SOMObject_somDefaultCopyInit
+#define WPObject_somDefaultAssign SOMObject_somDefaultAssign
+#define WPObject_somDefaultConstCopyInit SOMObject_somDefaultConstCopyInit
+#define WPObject_somDefaultVCopyInit SOMObject_somDefaultVCopyInit
+#define WPObject_somDefaultConstVCopyInit SOMObject_somDefaultConstVCopyInit
+#define WPObject_somDefaultConstAssign SOMObject_somDefaultConstAssign
+#define WPObject_somDefaultVAssign SOMObject_somDefaultVAssign
+#define WPObject_somDefaultConstVAssign SOMObject_somDefaultConstVAssign
+#define WPObject_somFree SOMObject_somFree
+#define WPObject_somGetClass SOMObject_somGetClass
+#define WPObject_somGetClassName SOMObject_somGetClassName
+#define WPObject_somGetSize SOMObject_somGetSize
+#define WPObject_somIsA SOMObject_somIsA
+#define WPObject_somIsInstanceOf SOMObject_somIsInstanceOf
+#define WPObject_somRespondsTo SOMObject_somRespondsTo
+#define WPObject_somDispatch SOMObject_somDispatch
+#define WPObject_somClassDispatch SOMObject_somClassDispatch
+#define WPObject_somCastObj SOMObject_somCastObj
+#define WPObject_somResetObj SOMObject_somResetObj
+#define WPObject_somDispatchV SOMObject_somDispatchV
+#define WPObject_somDispatchL SOMObject_somDispatchL
+#define WPObject_somDispatchA SOMObject_somDispatchA
+#define WPObject_somDispatchD SOMObject_somDispatchD
+#define WPObject_somPrintSelf SOMObject_somPrintSelf
+#define WPObject_somDumpSelf SOMObject_somDumpSelf
+#define WPObject_somDumpSelfInt SOMObject_somDumpSelfInt
+#endif /* SOM_DONT_USE_INHERITED_MACROS */
+
+
+
+/************ End from WPObject.h **************/
+
+#pragma SOMAsDefault(on)
+class WPObject : public SOMObject {
+
+	#pragma SOMClassName(*, "WPObject")
+	#pragma SOMNoMangling(*)
+	#pragma SOMNonDTS(*)
+
+     #pragma SOMClassName (WPObject, "WPObject")
+  /* #pragma SOMMetaClass (WPObject, "M_WPObject")  */
+     #pragma SOMClassVersion (WPObject, 1, 2)
+     #pragma SOMCallstyle (oidl)
+     #pragma SOMAsDefault(off)
+     #pragma SOMAsDefault(pop)
+  public :
+     virtual ULONG wpAddObjectGeneralPage(HWND hwndNotebook);
+     virtual ULONG wpAddObjectGeneralPage2(HWND hwndNotebook);
+     virtual ULONG wpAddObjectWindowPage(HWND hwndNotebook);
+     virtual BOOL wpAddSettingsPages(HWND hwndNotebook);
+     virtual BOOL wpAddToObjUseList(PUSEITEM pUseItem);
+     virtual PBYTE wpAllocMem(ULONG cbBytes, PULONG prc);
+     virtual BOOL32 wpAppendObject(WPObject* targetObject, BOOL32 fMove);
+     virtual BOOL wpAssertObjectMutexSem();
+     virtual BOOL wpClose();
+     virtual PMINIRECORDCORE wpCnrInsertObject(HWND hwndCnr,
+                                               PPOINTL pptlIcon,
+                                               PMINIRECORDCORE preccParent,
+                                               PRECORDINSERT pRecInsert);
+     virtual BOOL wpCnrRemoveObject(HWND hwndCnr);
+     virtual BOOL wpCnrSetEmphasis(ULONG ulEmphasisAttr, BOOL fTurnOn);
+     virtual ULONG wpConfirmDelete(ULONG fConfirmations);
+     virtual ULONG wpConfirmObjectTitle(WPFolder* Folder, WPObject** ppDuplicate,
+                                        PSZ pszTitle, ULONG cbTitle,
+                                        ULONG menuID);
+     virtual void wpCopiedFromTemplate();
+     virtual WPObject* wpCopyObject(WPFolder* Folder, BOOL fLock);
+     virtual WPObject* wpCreateAnother(PSZ pszTitle, PSZ pszSetupEnv,
+                                       WPFolder* Folder);
+     virtual WPObject* wpCreateFromTemplate(WPFolder* folder,
+                                            BOOL fLock);
+     virtual WPObject* wpCreateShadowObject(WPFolder* Folder,
+                                            BOOL fLock);
+     virtual ULONG wpDelete(ULONG fConfirmations);
+     virtual BOOL wpDeleteFromObjUseList(PUSEITEM pUseItem);
+     virtual BOOL wpDisplayHelp(ULONG HelpPanelId, PSZ HelpLibrary);
+     virtual HWND wpDisplayMenu(HWND hwndOwner, HWND hwndClient,
+                                POINTL* ptlPopupPt, ULONG ulMenuType,
+                                ULONG ulReserved);
+     virtual BOOL wpDoesObjectMatch(PVOID pvoidExtendedCriteria);
+     virtual MRESULT wpDraggedOverObject(WPObject* DraggedOverObject);
+     virtual MRESULT wpDragOver(HWND hwndCnr, PDRAGINFO pdrgInfo);
+     virtual MRESULT wpDrop(HWND hwndCnr, PDRAGINFO pdrgInfo,
+                            PDRAGITEM pdrgItem);
+     virtual BOOL wpDroppedOnObject(WPObject* DroppedOnObject);
+     virtual MRESULT wpEndConversation(ULONG ulItemID, ULONG flResult);
+     virtual ULONG wpFilterPopupMenu(ULONG ulFlags, HWND hwndCnr,
+                                     BOOL fMultiSelect);
+     virtual PUSEITEM wpFindUseItem(ULONG type, PUSEITEM pCurrentItem);
+     virtual BOOL wpFormatDragItem(PDRAGITEM pdrgItem);
+     virtual BOOL wpFree();
+     virtual BOOL wpFreeMem(PBYTE pByte);
+     virtual BOOL wpHide();
+     virtual void wpInitData();
+     virtual BOOL wpInsertPopupMenuItems(HWND hwndMenu, ULONG iPosition,
+                                         HMODULE hmod, ULONG MenuID,
+                                         ULONG SubMenuID);
+     virtual ULONG wpInsertSettingsPage(HWND hwndNotebook, PPAGEINFO ppageinfo);
+     virtual BOOL wpMenuItemHelpSelected(ULONG MenuId);
+     virtual BOOL wpMenuItemSelected(HWND hwndFrame, ULONG ulMenuId);
+     virtual BOOL wpModifyPopupMenu(HWND hwndMenu, HWND hwndCnr,
+                                    ULONG iPosition);
+     virtual BOOL wpMoveObject(WPFolder* Folder);
+     virtual HWND wpOpen(HWND hwndCnr, ULONG ulView, ULONG param);
+     virtual BOOL wpPrintObject(PPRINTDEST pPrintDest, ULONG ulReserved);
+     virtual ULONG wpQueryConcurrentView();
+     virtual ULONG wpQueryButtonAppearance();
+     virtual ULONG wpQueryConfirmations();
+     virtual BOOL wpQueryDefaultHelp(PULONG pHelpPanelId, PSZ HelpLibrary);
+     virtual ULONG wpQueryDefaultView();
+     virtual ULONG wpQueryDetailsData(PVOID* ppDetailsData, PULONG pcp);
+     virtual ULONG wpQueryError();
+     virtual BOOL wpSetFolder(WPObject* container);
+     virtual WPObject* wpQueryFolder();
+     virtual HPOINTER wpQueryIcon();
+     virtual ULONG wpQueryIconData(PICONINFO pIconInfo);
+     virtual ULONG wpQueryMinWindow();
+     virtual ULONG wpQueryNameClashOptions(ULONG menuID);
+     virtual ULONG wpQueryStyle();
+     virtual BOOL32 wpSetTaskRec(PTASKREC pNew, PTASKREC pOld);
+     virtual PTASKREC wpFindTaskRec();
+     virtual PSZ wpQueryTitle();
+     virtual BOOL wpRegisterView(HWND hwndFrame, PSZ pszViewTitle);
+     virtual ULONG wpReleaseObjectMutexSem();
+     virtual MRESULT wpRender(PDRAGTRANSFER pdxfer);
+     virtual MRESULT wpRenderComplete(PDRAGTRANSFER pdxfer, ULONG ulResult);
+     virtual BOOL32 wpReplaceObject(WPObject* targetObject, BOOL32 fMove);
+     virtual ULONG wpRequestObjectMutexSem(ULONG ulTimeout);
+     virtual BOOL wpRestore();
+     virtual BOOL wpRestoreData(PSZ pszClass, ULONG ulKey, PBYTE pValue,
+                                PULONG pcbValue);
+     virtual BOOL wpRestoreLong(PSZ pszClass, ULONG ulKey, PULONG pulValue);
+     virtual BOOL wpRestoreState(ULONG ulReserved);
+     virtual BOOL wpRestoreString(PSZ pszClass, ULONG ulKey,
+                                  PSZ pszValue, PULONG pcbValue);
+     virtual BOOL wpSaveData(PSZ pszClass, ULONG ulKey, PBYTE pValue,
+                             ULONG cbValue);
+     virtual BOOL wpSaveImmediate();
+     virtual BOOL wpSaveDeferred();
+     virtual BOOL wpSaveLong(PSZ pszClass, ULONG ulKey, ULONG ulValue);
+     virtual BOOL wpSaveState();
+     virtual BOOL wpSaveString(PSZ pszClass, ULONG ulKey, PSZ pszValue);
+     virtual BOOL wpScanSetupString(PSZ pszSetupString, PSZ pszKey,
+                                    PSZ pszValue, PULONG pcbValue);
+     virtual void wpSetConcurrentView(ULONG ulCCView);
+     virtual void wpSetButtonAppearance(ULONG ulButtonType);
+     virtual BOOL wpSetDefaultHelp(ULONG HelpPanelId, PSZ HelpLibrary);
+     virtual BOOL wpSetDefaultView(ULONG ulView);
+     virtual BOOL wpSetError(ULONG ulErrorId);
+     virtual USHORT wpQueryScreenGroupID(USHORT usPrevSgId);
+     virtual BOOL wpSetupOnce(PSZ pszSetupString);
+     virtual BOOL wpSetIcon(HPOINTER hptrNewIcon);
+     virtual BOOL wpSetIconData(PICONINFO pIconInfo);
+     virtual void wpSetMinWindow(ULONG ulMinWindow);
+     virtual BOOL wpSetStyle(ULONG ulNewStyle);
+     virtual BOOL wpModifyStyle(ULONG ulStyleFlags, ULONG ulStyleMask);
+     virtual BOOL wpSetTitle(PSZ pszNewTitle);
+     virtual BOOL wpSetup(PSZ pszSetupString);
+     virtual BOOL wpSwitchTo(ULONG View);
+     virtual void wpUnInitData();
+     virtual HWND wpViewObject(HWND hwndCnr, ULONG ulView, ULONG param);
+     virtual ULONG wpQueryTrueStyle();
+     virtual HOBJECT wpQueryHandle();
+     virtual BOOL wpUnlockObject();
+     virtual void wpObjectReady(ULONG ulCode, WPObject* refObject);
+     virtual BOOL wpIsObjectInitialized();
+     virtual WPObject* wpCreateShadowObjectExt(WPFolder* Folder,
+                                               BOOL fLock, PSZ pszSetup,
+                                               M_WPObject* shadowClass);
+     virtual BOOL wpCnrDeleteUseItem(HWND hwndCnr);
+     virtual BOOL wpIsDeleteable();
+     virtual PMINIRECORDCORE wpQueryCoreRecord();
+     virtual BOOL wpSetObjectID(PSZ pszObjectID);
+     virtual PSZ wpQueryObjectID();
+     virtual BOOL wpSetDefaultIconPos(PPOINTL pPointl);
+     virtual BOOL wpQueryDefaultIconPos(PPOINTL pPointl);
+     virtual void wpCnrRefreshDetails();
+     virtual PVIEWITEM wpFindViewItem(ULONG flViews, PVIEWITEM pCurrentItem);
+     virtual void wpLockObject();
+     virtual BOOL wpIsLocked();
+     virtual PULONG wpQueryContainerFlagPtr();
+     virtual ULONG wpWaitForClose(LHANDLE lhView, ULONG ulViews,
+                                  long lTimeOut, BOOL bAutoClose);
+	 virtual BOOL wpIdentify(PSZ pszIdentity);                                  
+	 virtual BOOL wpModifyMenu(
+		HWND hwndMenu, 
+		HWND hwndCnr, 
+		ULONG iPosition, 
+		ULONG ulMenuType, 
+		ULONG ulView, 
+		ULONG ulReserved);
+	 virtual BOOL wpFilterMenu(
+		FILTERFLAGS* pFlags, 
+		HWND hwndCnr, 
+		BOOL fMultiSelect, 
+		ULONG ulMenuType, 
+		ULONG ulView, 
+		ULONG ulReserved);
+	 virtual BOOL wpInsertMenuItems(
+		HWND hwndMenu, 
+		ULONG iPosition, 
+		HMODULE hmod, 
+		ULONG MenuID, 
+		ULONG SubMenuID);
+     virtual BOOL wpSetMenuStyle(ULONG ulStyle);
+	 virtual ULONG wpQueryMenuStyle();
+                                  
+     WPObject();
+     virtual ~WPObject();
+    #pragma SOMReleaseOrder ( \
+			      "wpSetTitle", \
+			      "wpQueryTitle", \
+			      "wpSetStyle", \
+			      "wpQueryStyle", \
+			      "wpSetIcon", \
+			      "wpQueryIcon", \
+			      "wpSetFolder", \
+			      "wpQueryFolder", \
+			      *, \
+			      *, \
+			      "wpSetDefaultView", \
+			      "wpQueryDefaultView", \
+			      *, \
+			      "wpSaveState", \
+			      *, \
+			      *, \
+			      "wpSaveLong", \
+			      "wpSaveString", \
+			      "wpSaveData", \
+			      *, \
+			      "wpRestoreState", \
+			      *, \
+			      *, \
+			      "wpRestoreLong", \
+			      "wpRestoreString", \
+			      "wpRestoreData", \
+			      *, \
+			      "wpAllocMem", \
+			      "wpFreeMem", \
+			      "wpAddToObjUseList", \
+			      "wpDeleteFromObjUseList", \
+			      "wpFindUseItem", \
+			      "wpSwitchTo", \
+			      *, \
+			      "wpFilterPopupMenu", \
+			      "wpModifyPopupMenu", \
+			      "wpMenuItemSelected", \
+			      "wpFormatDragItem", \
+			      "wpDrop", \
+			      "wpDragOver", \
+			      "wpRender", \
+			      "wpEndConversation", \
+			      *, \
+			      *, \
+			      *, \
+			      "wpFree", \
+			      "wpCopiedFromTemplate", \
+			      "wpAddSettingsPages", \
+			      "wpAddObjectGeneralPage", \
+			      "wpDisplayHelp", \
+			      "wpMenuItemHelpSelected", \
+			      "wpInsertSettingsPage", \
+			      "wpInsertPopupMenuItems", \
+			      *, \
+			      *, \
+			      *, \
+			      *, \
+			      "wpCnrInsertObject", \
+			      "wpCnrRemoveObject", \
+			      "wpInitData", \
+			      "wpUnInitData", \
+			      "wpSetup", \
+			      "wpScanSetupString", \
+			      "wpSaveImmediate", \
+			      "wpOpen", \
+			      "wpClose", \
+			      "wpHide", \
+			      "wpRestore", \
+			      "wpSetIconData", \
+			      "wpQueryIconData", \
+			      *, \
+			      "wpDelete", \
+			      "wpConfirmDelete", \
+			      *, \
+			      *, \
+			      *, \
+			      "wpRegisterView", \
+			      "wpIdentify", \
+			      "wpSetDefaultHelp", \
+			      "wpQueryDefaultHelp", \
+			      "wpDoesObjectMatch", \
+			      "wpCnrRefreshDetails", \
+			      "wpSetError", \
+			      "wpQueryError", \
+			      "wpDraggedOverObject", \
+			      "wpDroppedOnObject", \
+			      "wpSetDefaultIconPos", \
+			      "wpQueryDefaultIconPos", \
+			      *, \
+			      *, \
+			      "wpSetObjectID", \
+			      "wpQueryObjectID", \
+			      "wpIsDeleteable", \
+			      "wpQueryHandle", \
+			      "wpSaveDeferred", \
+			      "wpAddObjectWindowPage", \
+			      "wpQueryConcurrentView", \
+			      "wpSetConcurrentView", \
+			      "wpQueryMinWindow", \
+			      "wpSetMinWindow", \
+			      "wpViewObject", \
+			      "wpQueryButtonAppearance", \
+			      "wpSetButtonAppearance", \
+			      "wpQueryConfirmations", \
+			      "wpCnrSetEmphasis", \
+			      "wpQueryCoreRecord", \
+			      "wpFindViewItem", \
+			      "wpCreateFromTemplate", \
+			      "wpQueryTrueStyle", \
+			      "wpAssertObjectMutexSem", \
+			      "wpReleaseObjectMutexSem", \
+			      "wpRequestObjectMutexSem", \
+			      "wpCreateAnother", \
+			      "wpCreateShadowObject", \
+			      "wpCopyObject", \
+			      "wpMoveObject", \
+			      "wpLockObject", \
+			      "wpUnlockObject", \
+			      "wpIsLocked", \
+			      "wpRenderComplete", \
+			      "wpQueryDetailsData", \
+			      "wpPrintObject", \
+			      *, \
+			      "wpSetTaskRec", \
+			      *, \
+			      "wpModifyStyle", \
+			      *, \
+			      "wpFindTaskRec", \
+			      "wpAppendObject", \
+			      "wpReplaceObject", \
+			      "wpQueryNameClashOptions", \
+			      "wpConfirmObjectTitle", \
+			      *, \
+			      "wpQueryContainerFlagPtr", \
+			      *, \
+			      *, \
+			      *, \
+			      "wpCnrDeleteUseItem", \
+			      "wpObjectReady", \
+			      "wpIsObjectInitialized", \
+			      "wpCreateShadowObjectExt", \
+			      *, \
+			      *, \
+			      *, \
+			      "wpDisplayMenu", \
+			      "wpWaitForClose", \
+			      "wpQueryScreenGroupID", \
+			      "wpSetupOnce", \
+			      "wpAddObjectGeneralPage2", \
+			      *, \
+			      *, \
+			      "wpModifyMenu", \
+			      "wpFilterMenu", \
+			      "wpInsertMenuItems", \
+			      "wpSetMenuStyle", \
+			      "wpQueryMenuStyle", \
+			      *, \
+			      *, \
+			      *, \
+			      *, \
+			      *, \
+			      *, \
+			      *, \
+			      *, \
+			      *)
+};
+#pragma SOMAsDefault(pop)
+
+     #pragma SOMNonDTS(pop)
+/* End WPObject */
+
+
+
+
+/* Start Class M_WPObject */
+
+#include <somcls.hh>
+#pragma SOMNonDTS(on)
+
+#pragma SOMAsDefault(on)
+
+
+/************ From WPObject.h ************/
+
+
+
+/*
+ * External name shortening if required
+ */
+#ifdef SOM_USE_SHORT_EXTERNAL_NAMES
+#define M_WPObjectNewClass wpobjc
+//#pragma linkage(wpobjc, system)
+#define M_WPObjectClassData wpobjd
+#define M_WPObjectCClassData wpobjx
+#endif /* SOM_USE_SHORT_EXTERNAL_NAMES */
+
+/*--------------Migration------------*/
+#define M_WPObject_classObj M_WPObjectClassData.classObject
+#define _M_WPObject M_WPObject_classObj
+
+
+/*
+ * Declare the class data structure
+ */
+SOMEXTERN struct M_WPObjectClassDataStructure {
+	SOMClass *classObject;
+	somMToken wpclsInitData;
+	somMToken wpclsUnInitData;
+	somMToken withdrawn8;
+	somMToken wpclsMakeAwake;
+	somMToken wpclsIncUsage;
+	somMToken wpclsDecUsage;
+	somMToken wpclsQueryTitle;
+	somMToken wpclsQueryIcon;
+	somMToken wpclsQueryDefaultHelp;
+	somMToken wpclsQueryStyle;
+	somMToken wpclsQueryDetailsInfo;
+	somMToken wpclsQueryDefaultView;
+	somMToken wpclsQueryDetails;
+	somMToken wpclsQuerySearchInfo;
+	somMToken wpclsQueryExtendedCriteria;
+	somMToken wpclsCreateDefaultTemplates;
+	somMToken withdrawn9;
+	somMToken wpclsFindObjectFirst;
+	somMToken wpclsFindObjectNext;
+	somMToken wpclsFindObjectEnd;
+	somMToken wpclsFindObjects;
+	somMToken wpclsSetError;
+	somMToken wpclsQueryError;
+	somMToken wpclsQuerySettingsPageSize;
+	somMToken wpclsSetSettingsPageSize;
+	somMToken wpclsQueryIconData;
+	somMToken wpclsSetIcon;
+	somMToken wpclsSetIconData;
+	somMToken wpclsQueryObject;
+	somMToken wpclsObjectFromHandle;
+	somMToken wpclsSaveDirtyObjects;
+	somMToken wpclsLockDirtyList;
+	somMToken wpclsUnlockDirtyList;
+	somMToken wpclsLockRestartList;
+	somMToken wpclsUnlockRestartList;
+	somMToken wpclsQueryButtonAppearance;
+	somMToken wpclsNew;
+	somMToken wpclsQueryFolder;
+	somMToken wpclsLockSleepyList;
+	somMToken wpclsUnlockSleepyList;
+	somMToken wpclsRemoveObjects;
+	somMToken wpclsInsertMultipleObjects;
+	somMToken wpclsINew;
+	somMToken wpclsFindOneObject;
+	somMToken wpclsQueryMaxAnimationIcons;
+
+}  SOMDLINK  M_WPObjectClassData;
+
+/*
+ * Declare the C specific class data structure
+ */
+SOMEXTERN struct M_WPObjectCClassDataStructure {
+	somMethodTabs parentMtab;
+	somDToken instanceDataToken;
+} SOMDLINK M_WPObjectCClassData;
+
+
+
+
+/*
+ * New and Renew macros for M_WPObject
+ */
+#define M_WPObjectNew() \
+   (_somNew(_M_WPObject ? _M_WPObject : M_WPObjectNewClass(M_WPObject_MajorVersion, M_WPObject_MinorVersion)))
+#define M_WPObjectRenew(buf) \
+   (_somRenew(_M_WPObject ? _M_WPObject : M_WPObjectNewClass(M_WPObject_MajorVersion, M_WPObject_MinorVersion), buf))
+
+/*
+ * Override method: somUninit
+ */
+#define M_WPObject_somUninit(somSelf) \
+	SOMObject_somUninit(somSelf)
+
+/*
+ * Override method: somClassReady
+ */
+#define M_WPObject_somClassReady(somSelf) \
+	SOMClass_somClassReady(somSelf)
+
+/*
+ * Override method: somNew
+ */
+#define M_WPObject_somNew(somSelf) \
+	SOMClass_somNew(somSelf)
+
+/*
+ * Override method: somRenew
+ */
+#define M_WPObject_somRenew(somSelf,obj) \
+	SOMClass_somRenew(somSelf,obj)
+
+
+
+/*
+ * New Method: wpclsObjectFromHandle
+ */
+typedef WPObject*   SOMLINK somTP_M_WPObject_wpclsObjectFromHandle(M_WPObject *somSelf,
+		HOBJECT hObject);
+//#pragma linkage(somTP_M_WPObject_wpclsObjectFromHandle, system)
+typedef somTP_M_WPObject_wpclsObjectFromHandle *somTD_M_WPObject_wpclsObjectFromHandle;
+#define somMD_M_WPObject_wpclsObjectFromHandle "::M_WPObject::wpclsObjectFromHandle"
+#define M_WPObject_wpclsObjectFromHandle(somSelf,hObject) \
+    (SOM_Resolve(somSelf, M_WPObject, wpclsObjectFromHandle) \
+	(somSelf,hObject))
+#ifndef SOMGD_wpclsObjectFromHandle
+    #if (defined(_wpclsObjectFromHandle) || defined(__wpclsObjectFromHandle))
+        #undef _wpclsObjectFromHandle
+        #undef __wpclsObjectFromHandle
+        #define SOMGD_wpclsObjectFromHandle 1
+    #else
+        #define _wpclsObjectFromHandle M_WPObject_wpclsObjectFromHandle
+    #endif /* _wpclsObjectFromHandle */
+#endif /* SOMGD_wpclsObjectFromHandle */
+
+
+/*
+ * New Method: wpclsNew
+ */
+typedef WPObject*   SOMLINK somTP_M_WPObject_wpclsNew(M_WPObject *somSelf,
+		PSZ pszTitle,
+		PSZ pszSetupEnv,
+		WPFolder* Folder,
+		BOOL fLock);
+//#pragma linkage(somTP_M_WPObject_wpclsNew, system)
+typedef somTP_M_WPObject_wpclsNew *somTD_M_WPObject_wpclsNew;
+#define somMD_M_WPObject_wpclsNew "::M_WPObject::wpclsNew"
+#define M_WPObject_wpclsNew(somSelf,pszTitle,pszSetupEnv,Folder,fLock) \
+    (SOM_Resolve(somSelf, M_WPObject, wpclsNew) \
+	(somSelf,pszTitle,pszSetupEnv,Folder,fLock))
+#ifndef SOMGD_wpclsNew
+    #if (defined(_wpclsNew) || defined(__wpclsNew))
+        #undef _wpclsNew
+        #undef __wpclsNew
+        #define SOMGD_wpclsNew 1
+    #else
+        #define _wpclsNew M_WPObject_wpclsNew
+    #endif /* _wpclsNew */
+#endif /* SOMGD_wpclsNew */
+
+
+/*
+ * New Method: wpclsInitData
+ */
+typedef void   SOMLINK somTP_M_WPObject_wpclsInitData(M_WPObject *somSelf);
+//#pragma linkage(somTP_M_WPObject_wpclsInitData, system)
+typedef somTP_M_WPObject_wpclsInitData *somTD_M_WPObject_wpclsInitData;
+#define somMD_M_WPObject_wpclsInitData "::M_WPObject::wpclsInitData"
+#define M_WPObject_wpclsInitData(somSelf) \
+    (SOM_Resolve(somSelf, M_WPObject, wpclsInitData) \
+	(somSelf))
+#ifndef SOMGD_wpclsInitData
+    #if (defined(_wpclsInitData) || defined(__wpclsInitData))
+        #undef _wpclsInitData
+        #undef __wpclsInitData
+        #define SOMGD_wpclsInitData 1
+    #else
+        #define _wpclsInitData M_WPObject_wpclsInitData
+    #endif /* _wpclsInitData */
+#endif /* SOMGD_wpclsInitData */
+
+/*
+ * New Method: wpclsQueryStyle
+ */
+typedef ULONG   SOMLINK somTP_M_WPObject_wpclsQueryStyle(M_WPObject *somSelf);
+//#pragma linkage(somTP_M_WPObject_wpclsQueryStyle, system)
+typedef somTP_M_WPObject_wpclsQueryStyle *somTD_M_WPObject_wpclsQueryStyle;
+#define somMD_M_WPObject_wpclsQueryStyle "::M_WPObject::wpclsQueryStyle"
+#define M_WPObject_wpclsQueryStyle(somSelf) \
+    (SOM_Resolve(somSelf, M_WPObject, wpclsQueryStyle) \
+	(somSelf))
+#ifndef SOMGD_wpclsQueryStyle
+    #if (defined(_wpclsQueryStyle) || defined(__wpclsQueryStyle))
+        #undef _wpclsQueryStyle
+        #undef __wpclsQueryStyle
+        #define SOMGD_wpclsQueryStyle 1
+    #else
+        #define _wpclsQueryStyle M_WPObject_wpclsQueryStyle
+    #endif /* _wpclsQueryStyle */
+#endif /* SOMGD_wpclsQueryStyle */
+
+/*
+ * New Method: wpclsQueryObject
+ */
+typedef WPObject*   SOMLINK somTP_M_WPObject_wpclsQueryObject(M_WPObject *somSelf,
+		HOBJECT hObject);
+//#pragma linkage(somTP_M_WPObject_wpclsQueryObject, system)
+typedef somTP_M_WPObject_wpclsQueryObject *somTD_M_WPObject_wpclsQueryObject;
+#define somMD_M_WPObject_wpclsQueryObject "::M_WPObject::wpclsQueryObject"
+#define M_WPObject_wpclsQueryObject(somSelf,hObject) \
+    (SOM_Resolve(somSelf, M_WPObject, wpclsQueryObject) \
+	(somSelf,hObject))
+#ifndef SOMGD_wpclsQueryObject
+    #if (defined(_wpclsQueryObject) || defined(__wpclsQueryObject))
+        #undef _wpclsQueryObject
+        #undef __wpclsQueryObject
+        #define SOMGD_wpclsQueryObject 1
+    #else
+        #define _wpclsQueryObject M_WPObject_wpclsQueryObject
+    #endif /* _wpclsQueryObject */
+#endif /* SOMGD_wpclsQueryObject */
+
+
+/*
+ * New Method: wpclsQueryDetails
+ */
+typedef PCLASSDETAILS   SOMLINK somTP_M_WPObject_wpclsQueryDetails(M_WPObject *somSelf);
+//#pragma linkage(somTP_M_WPObject_wpclsQueryDetails, system)
+typedef somTP_M_WPObject_wpclsQueryDetails *somTD_M_WPObject_wpclsQueryDetails;
+#define somMD_M_WPObject_wpclsQueryDetails "::M_WPObject::wpclsQueryDetails"
+#define M_WPObject_wpclsQueryDetails(somSelf) \
+    (SOM_Resolve(somSelf, M_WPObject, wpclsQueryDetails) \
+	(somSelf))
+#ifndef SOMGD_wpclsQueryDetails
+    #if (defined(_wpclsQueryDetails) || defined(__wpclsQueryDetails))
+        #undef _wpclsQueryDetails
+        #undef __wpclsQueryDetails
+        #define SOMGD_wpclsQueryDetails 1
+    #else
+        #define _wpclsQueryDetails M_WPObject_wpclsQueryDetails
+    #endif /* _wpclsQueryDetails */
+#endif /* SOMGD_wpclsQueryDetails */
+
+/*
+ * New Method: wpclsQueryDetailsInfo
+ */
+typedef ULONG   SOMLINK somTP_M_WPObject_wpclsQueryDetailsInfo(M_WPObject *somSelf,
+		PCLASSFIELDINFO* ppClassFieldInfo,
+		PULONG pSize);
+//#pragma linkage(somTP_M_WPObject_wpclsQueryDetailsInfo, system)
+typedef somTP_M_WPObject_wpclsQueryDetailsInfo *somTD_M_WPObject_wpclsQueryDetailsInfo;
+#define somMD_M_WPObject_wpclsQueryDetailsInfo "::M_WPObject::wpclsQueryDetailsInfo"
+#define M_WPObject_wpclsQueryDetailsInfo(somSelf,ppClassFieldInfo,pSize) \
+    (SOM_Resolve(somSelf, M_WPObject, wpclsQueryDetailsInfo) \
+	(somSelf,ppClassFieldInfo,pSize))
+#ifndef SOMGD_wpclsQueryDetailsInfo
+    #if (defined(_wpclsQueryDetailsInfo) || defined(__wpclsQueryDetailsInfo))
+        #undef _wpclsQueryDetailsInfo
+        #undef __wpclsQueryDetailsInfo
+        #define SOMGD_wpclsQueryDetailsInfo 1
+    #else
+        #define _wpclsQueryDetailsInfo M_WPObject_wpclsQueryDetailsInfo
+    #endif /* _wpclsQueryDetailsInfo */
+#endif /* SOMGD_wpclsQueryDetailsInfo */
+
+
+
+
+
+class M_WPObject : public SOMClass {
+
+	#pragma SOMClassName(*, "M_WPObject")
+	#pragma SOMNoMangling(*)
+	#pragma SOMNonDTS(*)
+
+     #pragma SOMClassVersion (M_WPObject, 1, 2)
+     #pragma SOMCallstyle (oidl)
+     #pragma SOMAsDefault(off)
+     #pragma SOMAsDefault(pop)
+  public :
+     virtual BOOL wpclsCreateDefaultTemplates(WPObject* Folder);
+     virtual void wpclsInitData();
+     virtual WPObject* wpclsMakeAwake(PSZ pszTitle, ULONG ulStyle,
+                                      HPOINTER hptrIcon, POBJDATA pObjData,
+                                      WPFolder* Folder, ULONG ulUser);
+     virtual WPObject* wpclsNew(PSZ pszTitle, PSZ pszSetupEnv,
+                                WPFolder* Folder, BOOL fLock);
+     virtual BOOL wpclsQueryDefaultHelp(PULONG pHelpPanelId,
+                                        PSZ pszHelpLibrary);
+     virtual ULONG wpclsQueryDefaultView();
+     virtual PCLASSDETAILS wpclsQueryDetails();
+     virtual ULONG wpclsQueryDetailsInfo(PCLASSFIELDINFO* ppClassFieldInfo,
+                                         PULONG pSize);
+     virtual BOOL wpclsQueryExtendedCriteria(PSZ pszName, ULONG ulSearchType,
+                                             PVOID pvoidExtendedCriteria);
+     virtual WPObject* wpclsQueryFolder(PSZ pszLocation, BOOL fLock);
+     virtual HPOINTER wpclsQueryIcon();
+     virtual void wpclsQuerySearchInfo(M_WPObject** ClassExtended,
+                                       M_WPObject** ClassCreate,
+                                       PULONG pulClassCriteriaSize);
+     virtual ULONG wpclsQueryStyle();
+     virtual PSZ wpclsQueryTitle();
+     virtual void wpclsUnInitData();
+     virtual BOOL wpclsFindObjectFirst(PCLASS pClassList, PHFIND phFind,
+                                       PSZ pszTitle, WPFolder* Folder,
+                                       BOOL fSubfolders, PVOID pExtendedCriteria,
+                                       POBJECT pBuffer, PULONG pCount);
+     virtual BOOL wpclsFindObjectNext(HFIND hFind, POBJECT pBuffer,
+                                      PULONG pCount);
+     virtual BOOL wpclsFindObjectEnd(HFIND hFind);
+     virtual BOOL wpclsSetError(ULONG ulErrorId);
+     virtual ULONG wpclsQueryError();
+     virtual BOOL wpclsQuerySettingsPageSize(PSIZEL pSizl);
+     virtual ULONG wpclsQueryIconData(PICONINFO pIconInfo);
+     virtual WPObject* wpclsQueryObject(HOBJECT hObject);
+     virtual ULONG wpclsQueryButtonAppearance();
+     virtual void wpclsDecUsage();
+     virtual void wpclsIncUsage();
+     virtual BOOL wpclsInsertMultipleObjects(HWND hwndCnr, PPOINTL pptlIcon,
+                                             PVOID* pObjectArray,
+                                             PVOID pRecordParent,
+                                             ULONG NumRecords);
+     virtual WPObject* wpclsFindOneObject(HWND hwndOwner, PSZ pszFindParams);
+     virtual BOOL wpclsSetSettingsPageSize(PSIZEL pSizl);
+     virtual BOOL wpclsSetIconData(PICONINFO pIconInfo);
+     virtual BOOL wpclsSetIcon(HPOINTER hptrNewIcon);
+     virtual WPObject* wpclsObjectFromHandle(HOBJECT hObject);
+     virtual BOOL wpclsRemoveObjects(HWND hwndCnr, PVOID* pRecordArray,
+                                     ULONG NumRecords, BOOL RemoveAll);
+     virtual ~M_WPObject();
+     virtual void somClassReady();
+     virtual SOMObject* somNew();
+     virtual SOMObject* somRenew(void* obj);
+     #pragma SOMReleaseOrder ( \
+			      "wpclsInitData", \
+			      "wpclsUnInitData", \
+			      *, \
+			      "wpclsMakeAwake", \
+			      "wpclsIncUsage", \
+			      "wpclsDecUsage", \
+			      "wpclsQueryTitle", \
+			      "wpclsQueryIcon", \
+			      "wpclsQueryDefaultHelp", \
+			      "wpclsQueryStyle", \
+			      "wpclsQueryDetailsInfo", \
+			      "wpclsQueryDefaultView", \
+			      "wpclsQueryDetails", \
+			      "wpclsQuerySearchInfo", \
+			      "wpclsQueryExtendedCriteria", \
+			      "wpclsCreateDefaultTemplates", \
+			      *, \
+			      "wpclsFindObjectFirst", \
+			      "wpclsFindObjectNext", \
+			      "wpclsFindObjectEnd", \
+			      *, \
+			      "wpclsSetError", \
+			      "wpclsQueryError", \
+			      "wpclsQuerySettingsPageSize", \
+			      "wpclsSetSettingsPageSize", \
+			      "wpclsQueryIconData", \
+			      "wpclsSetIcon", \
+			      "wpclsSetIconData", \
+			      "wpclsQueryObject", \
+			      "wpclsObjectFromHandle", \
+			      *, \
+			      *, \
+			      *, \
+			      *, \
+			      *, \
+			      "wpclsQueryButtonAppearance", \
+			      "wpclsNew", \
+			      "wpclsQueryFolder", \
+			      *, \
+			      *, \
+			      "wpclsRemoveObjects", \
+			      "wpclsInsertMultipleObjects", \
+			      *, \
+			      "wpclsFindOneObject", \
+			      *)
+};
+     #pragma SOMMetaClass (WPObject, "M_WPObject")
+
+#pragma SOMAsDefault(pop)
+
+     #pragma SOMNonDTS(pop)
+/* End M_WPObject */
+#endif /* _DTS_HH_INCLUDED_wpobject */
+
Index: /tags/CWMM-0.3.0_GA/mediafolder/makefile
===================================================================
--- /tags/CWMM-0.3.0_GA/mediafolder/makefile	(revision 213)
+++ /tags/CWMM-0.3.0_GA/mediafolder/makefile	(revision 213)
@@ -0,0 +1,325 @@
+# Makefile mediafolder
+
+include ../make.inc
+
+CC           = icc
+#CPPFLAGS     = /Ge- /Gm+ /G4 /Gl  /O+ /Oc+ /Ol- /Q+ $(VACDEBUG)
+CPPFLAGS     = /G5 /Ge- /Gm+ /Gl- /Ga- /O+ /Ss /Oc+ /Ol- /Q+ /D$(ECS) $(VACDEBUG)
+
+
+LIBS	     =  somtk.lib mmPM2.lib rexx.lib
+INC	=	./include
+
+CMNINC	= 	$(COMMONSRC)/include
+CLSINC    =   $(COMMONSRC)/../classes/include
+
+HELPERDIR	=	./c/helper
+DEFS         =
+PROGS        =
+CDIR		=	./c
+IDLDIR		=	../classes/idl
+
+
+#######################################
+#
+# Define compile command
+#
+#######################################
+COMPILE	=	$(CC) $(CPPFLAGS) /C+ -I$(INC) -I$(CMNINC) -I$(CLSINC) /Fo$@ $<
+
+#######################################
+#
+# Define objects
+#
+#######################################
+OBJDIR		=	./obj
+
+# Mediafolder objects
+MFLDROBJDIR		= ./obj
+MFLDROBJS	=	$(MFLDROBJDIR)/mediafolder.obj \
+			$(MFLDROBJDIR)/mediafolderoverridenwpmethods.obj \
+			$(MFLDROBJDIR)/mediafolderoverridenwpclsmethods.obj \
+			$(MFLDROBJDIR)/mediadialogprocs.obj
+
+# CD-folder objects
+CDFLDROBJDIR		= ./obj
+CDFLDROBJS	=	$(CDFLDROBJDIR)/cdfolder.obj $(CDFLDROBJDIR)/cdfolderoverriddenwpmethods.obj \
+			$(CDFLDROBJDIR)/cdfolderoverriddenwpclsmethods.obj \
+			$(CDFLDROBJDIR)/cdfldrdialogprocs.obj
+
+# M3ufolder objects
+M3UFLDROBJDIR	= ./obj
+M3UFLDROBJS	=	$(M3UFLDROBJDIR)/m3ufolderoverriddenwpmethods.obj \
+			$(M3UFLDROBJDIR)/m3ufolderoverriddenwpclsmethods.obj
+
+#Audio shadow objects
+AUDSHWOBJDIR	=	./obj
+AUDSHWOBJS	=	$(AUDSHWOBJDIR)/audioshadowoverridenwpmethods.obj \
+			$(AUDSHWOBJDIR)/audioshadowoverridenwpclsmethods.obj \
+
+# Common functions used for Media folder and the classes
+LIBDIR		=	./lib
+LIBOBJS	=	$(LIBDIR)/sys_funcs.obj $(LIBDIR)/menu_funcs.obj
+
+# Some helper functions not contained in common_funcs
+CMNOBJS	=	$(OBJDIR)/messagehelper.obj $(OBJDIR)/helper.obj $(OBJDIR)/windowhelper.obj \
+			$(OBJDIR)/somandwpshelper.obj $(OBJDIR)/customprocs.obj $(OBJDIR)/except.obj \
+			$(OBJDIR)/mediafldrrexx.obj $(OBJDIR)/launchpad.obj $(OBJDIR)/cd.obj
+
+OBJECTS	=	 $(MFLDROBJS) $(CDFLDROBJS) $(M3UFLDROBJS) $(AUDSHWOBJS) $(LIBOBJS)\
+			$(CMNOBJS)
+
+#######################################
+#
+# Define Targets
+#
+#######################################
+all:	mediafld.dll mfldr_en.dll mfldr_nl.dll mfldr_de.dll mfldr_it.dll \
+	./help/mediafldr.hlp \
+	prog_tutorial\mediafldrprog.inf ./c/createcd/createcd.exe
+	cd ./c/cddb && make
+#	cd ./progfolder && make
+	-cd ./help && make
+
+# NLV resource dll
+nlv:
+	-cd ./help && make
+	-cd ./res && make nlv
+	-cd ./prog_tutorial && ipfc -i mediafldrprog.ipf
+	cd ./c/cddb && make nlv
+
+#force a new build number whenever the mediafolder is rebuilt
+#build.h:
+#		-cd ../. && make bld
+
+#######################################
+#
+# Compile
+#
+#######################################
+$(MFLDROBJDIR)/%.obj:		$(CDIR)/mediafldr/%.cpp $(INC)\mediafolder.hh $(INC)\mediafolderinc.h $(INC)/cwaudio.hh $(INC)/cwmmdataf.hh
+	$(COMPILE)
+
+$(CDFLDROBJDIR)/%.obj:	$(CDIR)/cdfldr/%.cpp  $(INC)\cdfolder.hh $(INC)/cwcdtrack.hh
+	$(COMPILE)
+
+$(M3UFLDROBJDIR)/%.obj:	$(CDIR)/m3ufolder/%.cpp  $(INC)\m3ufolder.hh
+	$(COMPILE)
+
+$(AUDSHWOBJDIR)/%.obj:	$(CDIR)/audioshadow/%.cpp $(INC)\audioshadow.hh
+	$(COMPILE)
+
+$(LIBDIR)/%.obj:	$(COMMONSRC)/%.c
+	$(COMPILE)
+
+#except.c needs other compiler flags
+$(OBJDIR)/except.obj:	$(HELPERDIR)/except.cpp
+	icc $(CPPFLAGS) /Sm /C+ -I$(INC) /Fo$@ $<
+
+$(OBJDIR)/%.obj:	$(HELPERDIR)/%.cpp
+	$(COMPILE)
+
+$(HELPERDIR)/%.obj:	./helper/%.cpp $(INC)\mediafolder.hh
+	$(COMPILE)
+
+mediafld.dll:	$(OBJECTS) $(INC)\mediafolderres.h ./res/mediafolder.res
+		-cd ../. && make bld
+		-cd ProgFolder && make
+		@create_mfldr_def.CMD mediafolder.def
+		implib /NOLOGO lib\progfldr.lib progfolder\progfolder.def
+		icc -Ge- /Q+ /D$(ECS) /Fe$@ /Fm$*.map $(OBJECTS) lib/progfldr.lib $(LIBS) mediafolder.def
+		rc ./res/mediafolder.res $@
+		MAPSYM $*.map
+
+mfldr_en.dll:	
+		-cd ./res && make
+
+mfldr_de.dll:
+		-cd ./res && make
+
+mfldr_nl.dll:
+		-cd ./res && make
+
+mfldr_it.dll:
+		-cd ./res && make
+
+./res/mediafolder.res:	./res/mediafolder.rc ../build.inc
+		-cd ./res && make
+
+./c/createcd/createcd.exe:	./c/createcd/createcd.c
+	cd ./c/createcd && make
+
+
+prog_tutorial\mediafldrprog.inf:	prog_tutorial\mediafldrprog.ipf
+	-cd ./prog_tutorial && make
+#	-cd ./prog_tutorial && ipfc -i mediafldrprog.ipf
+
+./help/mediafldr.hlp:	./help/mediafldr.ipf ./help/mediafldr049.ipf \
+			./help/mediafldr031.ipf ./help/mediafldr039.ipf
+	-cd ./help && make
+
+#######################################
+#
+# Create *.hh files from IDL files
+#
+#######################################
+$(INC)/cwaudio.hh: ../classes/idl/idl_audio/cwaudio.idl
+	sc -shh -S 100000  -I $(IDLDIR)/idl_mm  -dinclude -m noqualifytypes -musexhpass $<
+
+$(INC)/cwcdtrack.hh: ../classes/idl/idl_audio/cwcdtrack.idl
+	sc -shh -S 100000  -I $(IDLDIR)/idl_audio -I $(IDLDIR)/idl_mm -dinclude -m noqualifytypes -musexhpass $<
+
+$(INC)/cwmmdataf.hh:	../classes/idl/idl_mm/cwmmdataf.idl
+	sc -shh -S 100000  -I $(IDLDIR)/idl_mm -dinclude -m noqualifytypes -musexhpass $<
+
+
+#######################################
+#
+# Clean directories
+#
+#######################################
+clean:
+	-rm *.obj
+	-rm *.dll
+	-rm *.hlp
+	-rm *.exe
+	-rm *.map
+	-rm *.sym
+	-rm *.def
+	-cd prog_tutorial && rm *.inf
+	-cd ./res && make clean
+	-cd ./obj && rm *.obj
+	-cd ./lib && rm *.obj
+	-cd ./c && make clean
+	-cd ./help && make clean
+
+cleaner:
+	-rm *.*~
+	-rm *.flc
+	-cd ./c/helper && make cleaner
+	-cd ./res && make cleaner
+	-cd ./c && make cleaner
+	-cd ./include && rm *.*~
+	-cd ./help && make clean
+
+german:
+	-mkdir ..\..\$(PKGNAME)-$(VERSION)-ger\CWMFldr-$(VERSION)-ger
+	-mkdir ..\..\$(PKGNAME)-$(VERSION)-ger\CWMFldr-$(VERSION)-ger\bin
+	-mkdir ..\..\$(PKGNAME)-$(VERSION)-ger\CWMFldr-$(VERSION)-ger\DLL
+	-mkdir ..\..\$(PKGNAME)-$(VERSION)-ger\CWMFldr-$(VERSION)-ger\Doc
+	-mkdir ..\..\$(PKGNAME)-$(VERSION)-ger\CWMFldr-$(VERSION)-ger\Skripte
+	-mkdir ..\..\$(PKGNAME)-$(VERSION)-ger\CWMFldr-$(VERSION)-ger\FreeDB
+	-mkdir ..\..\$(PKGNAME)-$(VERSION)-ger\CWMFldr-$(VERSION)-ger\FreeDB\logfiles
+	-mkdir ..\..\$(PKGNAME)-$(VERSION)-ger\CWMFldr-$(VERSION)-ger\FreeDB\cddbdata
+	cp prog_tutorial/mediafldrprog.inf ../../$(PKGNAME)-$(VERSION)-ger\CWMFldr-$(VERSION)-ger\Doc\mediafldr.inf
+	cp bin/*.cmd ../../$(PKGNAME)-$(VERSION)-ger/CWMFldr-$(VERSION)-ger/bin/
+	cp bin/*.rx ../../$(PKGNAME)-$(VERSION)-ger/CWMFldr-$(VERSION)-ger/bin/
+	cp bin/*.dll ../../$(PKGNAME)-$(VERSION)-ger/CWMFldr-$(VERSION)-ger/dll/
+	cp ./c/createcd/createcd.exe  ../../$(PKGNAME)-$(VERSION)-ger/CWMFldr-$(VERSION)-ger/bin/
+	cp ./mediafld.dll ../../$(PKGNAME)-$(VERSION)-ger/CWMFldr-$(VERSION)-ger/bin/mediafld.dll
+	cp ./res/obj/mfldr_de.dll ../../$(PKGNAME)-$(VERSION)-ger/CWMFldr-$(VERSION)-ger/bin/mfldr_de.dll
+	cp ./help/mediafldr049.hlp ../../$(PKGNAME)-$(VERSION)-ger/CWMFldr-$(VERSION)-ger/bin/mediafld.hlp
+	cp ./install/MFLDRGER.ins  ../../$(PKGNAME)-$(VERSION)-ger/CWMFldr-$(VERSION)-ger/MFLDRGER.INS
+	cp ./c/cddb/pmcddb.exe ../../$(PKGNAME)-$(VERSION)-ger/CWMFldr-$(VERSION)-ger/FreeDB/
+	cp ./c/cddb/Res/pmcddb049.dll ../../$(PKGNAME)-$(VERSION)-ger/CWMFldr-$(VERSION)-ger/FreeDB/pmdb049.dll
+	cp ./c/cddb/cddb.ini ../../$(PKGNAME)-$(VERSION)-ger/CWMFldr-$(VERSION)-ger/FreeDB/
+	cp ./install/freedbgr.ins ../../$(PKGNAME)-$(VERSION)-ger/CWMFldr-$(VERSION)-ger/FreeDB/
+	cp Skripte_ger/* ../../$(PKGNAME)-$(VERSION)-ger/CWMFldr-$(VERSION)-ger/Skripte/
+	-cd ../../$(PKGNAME)-$(VERSION)-ger/CWMFldr-$(VERSION)-ger/bin && lxlite *
+	-cd ../../$(PKGNAME)-$(VERSION)-ger/CWMFldr-$(VERSION)-ger/DLL && lxlite *
+	-cd ../../$(PKGNAME)-$(VERSION)-ger/CWMFldr-$(VERSION)-ger/FreeDB && lxlite *
+
+done:
+	-cp doc/Readme.ger ../../$(PKGNAME)-$(VERSION)-ger/CWMFldr-$(VERSION)-ger/
+	-cp doc/FILE_ID.DIZ ../../$(PKGNAME)-$(VERSION)-ger/CWMFldr-$(VERSION)-ger/
+	-cp doc/Lizenz ../../$(PKGNAME)-$(VERSION)-ger/CWMFldr-$(VERSION)-ger/
+
+english:
+	-mkdir ..\..\$(PKGNAME)-$(VERSION)-eng\CWMFldr-$(VERSION)-eng
+	-mkdir ..\..\$(PKGNAME)-$(VERSION)-eng\CWMFldr-$(VERSION)-eng\bin
+	-mkdir ..\..\$(PKGNAME)-$(VERSION)-eng\CWMFldr-$(VERSION)-eng\DLL
+	-mkdir ..\..\$(PKGNAME)-$(VERSION)-eng\CWMFldr-$(VERSION)-eng\Doc
+	-mkdir ..\..\$(PKGNAME)-$(VERSION)-eng\CWMFldr-$(VERSION)-eng\Skripte
+	-mkdir ..\..\$(PKGNAME)-$(VERSION)-eng\CWMFldr-$(VERSION)-eng\FreeDB
+	-mkdir ..\..\$(PKGNAME)-$(VERSION)-eng\CWMFldr-$(VERSION)-eng\FreeDB\logfiles
+	-mkdir ..\..\$(PKGNAME)-$(VERSION)-eng\CWMFldr-$(VERSION)-eng\FreeDB\cddbdata
+	cp prog_tutorial/mediafldrprog.inf ../../$(PKGNAME)-$(VERSION)-eng\CWMFldr-$(VERSION)-eng\Doc\mediafldr.inf
+	cp bin/*.cmd ../../$(PKGNAME)-$(VERSION)-eng/CWMFldr-$(VERSION)-eng/bin/
+	cp bin/*.rx ../../$(PKGNAME)-$(VERSION)-eng/CWMFldr-$(VERSION)-eng/bin/
+	cp bin/*.dll ../../$(PKGNAME)-$(VERSION)-eng/CWMFldr-$(VERSION)-eng/dll/
+	cp ./c/createcd/createcd.exe  ../../$(PKGNAME)-$(VERSION)-eng/CWMFldr-$(VERSION)-eng/bin/
+	cp ./mediafld.dll ../../$(PKGNAME)-$(VERSION)-eng/CWMFldr-$(VERSION)-eng/bin/mediafld.dll
+	cp ./res/obj/mfldr_en.dll ../../$(PKGNAME)-$(VERSION)-eng/CWMFldr-$(VERSION)-eng/bin/mfldr_en.dll
+	cp ./help/mediafldr.hlp ../../$(PKGNAME)-$(VERSION)-eng/CWMFldr-$(VERSION)-eng/bin/mediafld.hlp
+	cp ./install/MEDIAFLD.ins  ../../$(PKGNAME)-$(VERSION)-eng/CWMFldr-$(VERSION)-eng/MEDIAFLD.INS
+	cp ./c/cddb/pmcddb.exe ../../$(PKGNAME)-$(VERSION)-eng/CWMFldr-$(VERSION)-eng/FreeDB/
+	cp ./c/cddb/Res/pmcddb001.dll ../../$(PKGNAME)-$(VERSION)-eng/CWMFldr-$(VERSION)-eng/FreeDB/pmdb001.dll
+	cp ./c/cddb/cddb.ini ../../$(PKGNAME)-$(VERSION)-eng/CWMFldr-$(VERSION)-eng/FreeDB/
+	cp ./install/freedb.ins ../../$(PKGNAME)-$(VERSION)-eng/CWMFldr-$(VERSION)-eng/FreeDB/
+	cp Skripte_eng/* ../../$(PKGNAME)-$(VERSION)-eng/CWMFldr-$(VERSION)-eng/Skripte/
+	-cd ../../$(PKGNAME)-$(VERSION)-eng/CWMFldr-$(VERSION)-eng/bin && lxlite *
+	-cd ../../$(PKGNAME)-$(VERSION)-eng/CWMFldr-$(VERSION)-eng/DLL && lxlite *
+	-cd ../../$(PKGNAME)-$(VERSION)-eng/CWMFldr-$(VERSION)-eng/FreeDB && lxlite *
+
+oldEnglish:
+	-mkdir ..\..\$(PKGNAME)-$(VERSION)-eng\CWMFldr-$(VERSION)-eng
+	-mkdir ..\..\$(PKGNAME)-$(VERSION)-eng\CWMFldr-$(VERSION)-eng\bin
+	-mkdir ..\..\$(PKGNAME)-$(VERSION)-eng\CWMFldr-$(VERSION)-eng\DLL
+	-mkdir ..\..\$(PKGNAME)-$(VERSION)-eng\CWMFldr-$(VERSION)-eng\Doc
+	-mkdir ..\..\$(PKGNAME)-$(VERSION)-eng\CWMFldr-$(VERSION)-eng\Skripte
+	-mkdir ..\..\$(PKGNAME)-$(VERSION)-eng\CWMFldr-$(VERSION)-eng\FreeDB
+	-mkdir ..\..\$(PKGNAME)-$(VERSION)-eng\CWMFldr-$(VERSION)-eng\FreeDB\logfiles
+	-mkdir ..\..\$(PKGNAME)-$(VERSION)-eng\CWMFldr-$(VERSION)-eng\FreeDB\cddbdata
+	-cp prog_tutorial\mediafldrprog.inf ..\..\$(PKGNAME)-$(VERSION)-eng\CWMFldr-$(VERSION)-eng\Doc\mediafldr.inf
+	-cp doc/Readme.eng ../../$(PKGNAME)-$(VERSION)-eng/CWMFldr-$(VERSION)-eng/
+	-cp doc/FILE_ID.DIZ ../../$(PKGNAME)-$(VERSION)-eng/CWMFldr-$(VERSION)-eng/
+	-cp doc/License ../../$(PKGNAME)-$(VERSION)-eng/CWMFldr-$(VERSION)-eng/
+	-cp bin/*.cmd ../../$(PKGNAME)-$(VERSION)-eng/CWMFldr-$(VERSION)-eng/bin/
+	-cp bin/*.rx ../../$(PKGNAME)-$(VERSION)-eng/CWMFldr-$(VERSION)-eng/bin/
+	-cp bin/*.dll ../../$(PKGNAME)-$(VERSION)-eng/CWMFldr-$(VERSION)-eng/dll/
+	-cp Skripte_eng/* ../../$(PKGNAME)-$(VERSION)-eng/CWMFldr-$(VERSION)-eng/Skripte/
+	-cp ./help/mediafldr.hlp ../../$(PKGNAME)-$(VERSION)-eng/CWMFldr-$(VERSION)-eng/bin/mediafld.hlp
+	-cp ./mediafld.dll ../../$(PKGNAME)-$(VERSION)-eng/CWMFldr-$(VERSION)-eng/bin/mediafld.dll
+	-cp ./mediafolder001.dll ../../$(PKGNAME)-$(VERSION)-eng/CWMFldr-$(VERSION)-eng/bin/media001.dll
+	-cp ./install/MEDIAFLD.INS  ../../$(PKGNAME)-$(VERSION)-eng/CWMFldr-$(VERSION)-eng/
+	-cp ./install/createcd.exe  ../../$(PKGNAME)-$(VERSION)-eng/CWMFldr-$(VERSION)-eng/bin
+	-cp cddb/pmcddb.exe ../../$(PKGNAME)-$(VERSION)-eng/CWMFldr-$(VERSION)-eng/FreeDB/
+	-cp cddb/Res/pmcddb001.dll ../../$(PKGNAME)-$(VERSION)-eng/CWMFldr-$(VERSION)-eng/FreeDB/pmdb001.dll
+	-cp cddb/cddb.ini ../../$(PKGNAME)-$(VERSION)-eng/CWMFldr-$(VERSION)-eng/FreeDB/
+	-cp install/freedb.ins ../../$(PKGNAME)-$(VERSION)-eng/CWMFldr-$(VERSION)-eng/FreeDB/
+	-cd ../../$(PKGNAME)-$(VERSION)-eng/CWMFldr-$(VERSION)-eng/bin && lxlite *
+	-cd ../../$(PKGNAME)-$(VERSION)-eng/CWMFldr-$(VERSION)-eng/DLL && lxlite *
+	-cd ../../$(PKGNAME)-$(VERSION)-eng/CWMFldr-$(VERSION)-eng/FreeDB && lxlite *
+
+distribution:
+#	make all
+	make english
+	make german
+
+ecsdisteng:
+	@echo '[32;1;m******* Packaging Media Folder... *******[0;m'
+	-mkdir ..\..\$(ECSBASE)-eng\$(ECSMFLDRDIR)
+	-mkdir ..\..\$(ECSBASE)-eng\$(ECSMFLDRDIR)\bin
+	-mkdir ..\..\$(ECSBASE)-eng\$(ECSMFLDRDIR)\Doc
+	-mkdir ..\..\$(ECSBASE)-eng\FreeDB
+	-mkdir ..\..\$(ECSBASE)-eng\FreeDB\logfiles
+	-mkdir ..\..\$(ECSBASE)-eng\FreeDB\cddbdata
+	-cp prog_tutorial/mediafldrprog.inf ../../$(ECSBASE)-eng/$(ECSMFLDRDIR)/Doc/mediafldr.inf
+	-cp bin/*.cmd ../../$(ECSBASE)-eng/$(ECSMFLDRDIR)/bin/
+	-cp bin/*.rx ../../$(ECSBASE)-eng/$(ECSMFLDRDIR)/bin/
+	-cp bin/progfldr.dll ../../$(ECSBASE)-eng/dll/
+	-cp ./help/mediafldr.hlp ../../$(ECSBASE)-eng/$(ECSMFLDRDIR)/bin/mediafld.hlp
+	-cp ./mediafld.dll ../../$(ECSBASE)-eng/$(ECSMFLDRDIR)/bin/mediafld.dll
+	-cp ./mediafolder001.dll ../../$(ECSBASE)-eng/$(ECSMFLDRDIR)/bin/media001.dll
+	-cp ./install/createcd.exe  ../../$(ECSBASE)-eng/$(ECSMFLDRDIR)/bin
+	-cd ../../$(ECSBASE)-eng/$(ECSMFLDRDIR)/bin && lxlite *
+#FreeDB client
+	-cp cddb/pmcddb.exe ../../$(ECSBASE)-eng/FreeDB/
+	-cp cddb/Res/pmcddb001.dll ../../$(ECSBASE)-eng/FreeDB/pmdb001.dll
+	-cp cddb/cddb.ini ../../$(ECSBASE)-eng/FreeDB/
+	-cd ../../$(ECSBASE)-eng/FreeDB && lxlite *
+
+
+ecsdistribution:
+	cd cddb && make
+	make ecsdisteng
Index: /tags/CWMM-0.3.0_GA/mediafolder/prog_tutorial/de/hiddenfeatures_de.inc
===================================================================
--- /tags/CWMM-0.3.0_GA/mediafolder/prog_tutorial/de/hiddenfeatures_de.inc	(revision 213)
+++ /tags/CWMM-0.3.0_GA/mediafolder/prog_tutorial/de/hiddenfeatures_de.inc	(revision 213)
@@ -0,0 +1,414 @@
+:h2 res=410
+x=50% width=50%
+group=2
+.Audioplayer ersetzen
+:p.
+Der mit MMOS2 mitgelieferte Standard-Audioplayer kann durch Hinzufgen des
+folgenden Schlssels zu OS2.INI ersetzt werden&colon.
+:p.
+:hp2.CWMM->audioplayer-><Pfad zu neuem Player>:ehp2.
+:nt.
+Sie mssen nicht den vollstndigen Pfad angeben, wenn sich das Programm in Ihrem
+PATH befindet. Das Programm muss ein PM-Programm sein!
+:ent.
+:p.
+Auch wenn in der INI-Datei kein neues Programm angegeben ist, verbessern die
+Klassen das Standardverhalten, indem sie den Player nicht als Teil des
+WPS-Prozesses starten. Wenn also der Player abstrzt, strzt WPS nicht mehr ab.
+
+:h2 res=429
+x=50% width=50%
+group=2
+.MIDI-Player ersetzen
+:p.
+Der standardmáig mit CWMM mitgelieferte Audio-/MIDI-Player kann durch
+Hinzufgen des folgenden Schlssels zu OS2.INI ersetzt werden&colon.
+:p.
+:hp2.CWMM->midiplayer-><Pfad zu neuem Player>:ehp2.
+:nt.
+Sie mssen nicht den vollstndigen Pfad angeben, wenn sich das Programm in Ihrem
+PATH befindet. Das Programm muss ein PM-Programm sein! IBMs ab.exe schlgt beim
+Versuch, MIDI-Dateien abzuspielen, mit einem 5051-Fehler fehl. Der
+standardmáige interne Player funktioniert jetzt. Der einzige externe Player,
+von dem ich weiá, dass er funktioniert, ist FM2play.exe. Dies ersetzt nur die
+Wiedergabe von MIDI-Dateien, nicht von anderen Audioformaten.
+:ent.
+:p.
+Auch wenn in der INI-Datei kein neues Programm angegeben ist, verbessern die
+Klassen das Standardverhalten, indem sie den Player nicht als Teil des
+WPS-Prozesses starten. Wenn also der Player abstrzt, strzt WPS nicht mehr ab.
+
+:h2 res=425
+x=50% width=50%
+group=2
+.Audiokonverter ersetzen
+:p.
+Der Standard-Audiokonverter kann durch Hinzufgen des folgenden Schlssels zu
+OS2.INI ersetzt werden&colon.
+:p.
+:hp2.CWMM->audioconverter-><Pfad zu neuem Player>:ehp2.
+:nt.
+Sie mssen nicht den vollstndigen Pfad angeben, wenn sich das Programm in Ihrem
+PATH befindet. Das Programm muss ein PM-Programm sein! Der Konverter wird nicht
+als Teil des WPS-Prozesses gestartet. Er wird von Midi-Dateien nicht verwendet.
+:ent.
+
+:h2 res=411
+x=50% width=50%
+group=2
+.Audio-Editor ersetzen
+:p.
+Der standardmáig mit MMOS2 mitgelieferte Audioeditor kann durch Hinzufgen des
+folgenden Schlssels zu OS2.INI ersetzt werden&colon.
+:p.
+:hp2.CWMM->audioeditor-><Pfad zu neuem Player>:ehp2.
+:nt.
+Sie mssen nicht den vollstndigen Pfad angeben, wenn sich das Programm in Ihrem
+PATH befindet. Das Programm muss ein PM-Programm sein!
+:ent.
+:p.
+Auch wenn in der INI-Datei kein neues Programm angegeben ist, verbessern die
+Klassen das Standardverhalten, indem sie den Editor nicht als Teil des
+WPS-Prozesses starten. Wenn also der Editor abstrzt, strzt WPS nicht mehr ab.
+Der Editor wird von Midi-Dateien nicht verwendet.
+
+
+:h2 res=412
+x=50% width=50%
+group=2
+.AVI-Player ersetzen
+:p.
+Der standardmáig mit MMOS2 gelieferte AVI-Player kann durch Hinzufgen des
+folgenden Schlssels zu OS2.INI ersetzt werden&colon.
+:p.
+:hp2.CWMM->aviplayer-><Pfad zu neuem Player>:ehp2.
+:nt.
+Sie mssen nicht den vollstndigen Pfad angeben, wenn sich das Programm in Ihrem
+PATH befindet. Das Programm muss ein PM-Programm sein!
+:ent.
+:p.
+Auch wenn in der INI-Datei kein neues Programm angegeben ist, verbessern die
+Klassen das Standardverhalten, indem sie den Player nicht als Teil des
+WPS-Prozesses starten. Wenn also der Player abstrzt, strzt WPS nicht mehr ab.
+
+
+:h2 res=413
+x=50% width=50%
+group=2
+.MPG-Player ersetzen
+:p.
+Der standardmáig mit MMOS2 mitgelieferte MPG-Player kann durch Hinzufgen des
+folgenden Schlssels zu OS2.INI ersetzt werden&colon.
+:p.
+:hp2.CWMM->mpgplayer-><Pfad zu neuem Player>:ehp2.
+:nt.
+Sie mssen nicht den vollstndigen Pfad angeben, wenn sich das Programm in Ihrem
+PATH befindet. Das Programm muss ein PM-Programm sein!
+:ent.
+:p.
+Auch wenn in der INI-Datei kein neues Programm angegeben ist, verbessern die
+Klassen das Standardverhalten, indem sie den Player nicht als Teil des
+WPS-Prozesses starten. Wenn also der Player abstrzt, strzt WPS nicht mehr ab.
+
+
+:h2 res=419
+x=50% width=50%
+group=2
+.MP3-Player ersetzen
+:p.
+Der standardmáige MP3-Player kann durch Hinzufgen des folgenden Schlssels zu
+OS2.INI ersetzt werden&colon.
+:p.
+:hp2.CWMM-mp3player-><Pfad zu neuem Player>:ehp2.
+:nt.
+Sie mssen nicht den vollstndigen Pfad angeben, wenn sich das Programm in Ihrem
+PATH befindet.
+:ent.
+:p.
+Auch wenn in der INI-Datei kein neues Programm angegeben ist, verbessern die
+Klassen das Standardverhalten, indem sie den Player nicht als Teil des
+WPS-Prozesses starten. Wenn also der Standard-Player abstrzt, strzt auch WPS
+nicht ab.
+
+:h2 res=427
+x=50% width=50%
+group=2
+.Modernen Videoplayer hinzufgen
+:p.
+Standardmáig verwenden die Multimediaklassen ffplay.exe, smplayer oder mplayer,
+um Videotypen abzuspielen, die von MMOS2 nicht untersttzt werden. Sie werden in
+der aufgelisteten Reihenfolge abgefragt und mssen in Ihrem PATH vorhanden sein,
+damit dies geschieht. Der Player wird nicht als Teil des WPS-Prozesses
+gestartet. Siehe :link reftype=hd res=428.Kein moderner Videoplayer:elink. wenn
+Sie diese Funktion nicht verwenden mchten.
+:p.
+Dieser Player kann auch hinzugefgt werden, indem der folgende Schlssel in OS2.INI
+eingefgt wird&colon.
+:p.
+:hp2.CWMM->mvidplayer-><Pfad zum Player>:ehp2.
+:nt.
+Sie mssen nicht den vollstndigen Pfad angeben, wenn sich das Programm in Ihrem
+PATH befindet.
+:ent.
+
+:h2 res=428
+x=50% width=50%
+group=2
+.Kein moderner Videoplayer
+:p.
+Die Standardeinstellung untersttzt die Verwendung eines
+:link reftype=hd res=427.Modern Video player:elink. . Wenn Sie diese Funktion
+nicht mchten, knnen Sie sie deaktivieren, indem Sie den folgenden Schlssel
+zu OS2.INI hinzufgen.
+:p.
+:hp2.CWMM->nomodvid->1:ehp2.
+
+:nt.
+Damit die Einstellung wirksam wird, mssen Sie WPS neu starten.
+:ent.
+
+:h2 res=422
+x=50% width=50%
+group=2
+.M3U-Editor ersetzen
+:p.
+Der standardmáige M3U-Editor kann durch Hinzufgen des folgenden Schlssels zu
+OS2.INI ersetzt werden&colon.
+:p.
+:hp2.CWMM->m3ueditor-><Pfad zu neuem Editor>:ehp2.
+:nt.
+Sie mssen nicht den vollstndigen Pfad angeben, wenn sich das Programm in Ihrem
+PATH befindet.
+:ent.
+
+:h2 res=423
+x=50% width=50%
+group=2
+.M3U-Player ersetzen
+:p.
+Der standardmáige M3U-Player kann durch Hinzufgen des folgenden Schlssels zu
+OS2.INI ersetzt werden&colon.
+:p.
+:hp2.CWMM->m3uplayer-><Pfad zu neuem Player>:ehp2.
+:nt.
+Sie mssen nicht den vollstndigen Pfad angeben, wenn sich das Programm in Ihrem
+PATH befindet.
+:ent.
+:p.
+Standardmáig wird ein neuer Medienordner erstellt und mit den in der M3U-Datei
+angegebenen Titeln gefllt. Mit dieser Einstellung ist es mglich, einen anderen
+M3U-Player zu verwenden. 
+
+:h2 res=414
+x=50% width=50%
+group=2
+.Bildeditor ersetzen
+:p.
+Der standardmáig mit MMOS2 mitgelieferte Bildeditor kann durch Hinzufgen des
+folgenden Schlssels zu OS2.INI ersetzt werden&colon.
+:p.
+:hp2.CWMM->imageeditor-><Pfad zu neuem Editor>:ehp2.
+:nt.
+Sie mssen nicht den vollstndigen Pfad angeben, wenn sich das Programm in Ihrem
+PATH befindet. Das Programm muss ein PM-Programm sein!
+:ent.
+:p.
+Auch wenn in der INI-Datei kein neues Programm angegeben ist, verbessern die
+Klassen das Standardverhalten, indem sie den Editor nicht als Teil des
+WPS-Prozesses starten. Wenn also der Editor abstrzt, strzt auch das WPS
+nicht mehr ab.
+
+:h2 res=426
+x=50% width=50%
+group=2
+.Bildkonverter ersetzen
+:p.
+Der Standard-Bildkonverter kann durch Hinzufgen des folgenden Schlssels zu
+OS2.INI ersetzt werden&colon.
+:p.
+:hp2.CWMM->imageeditor-><Pfad zu neuem Konverter>:ehp2.
+:nt.
+Sie mssen nicht den vollstndigen Pfad angeben, wenn sich das Programm in Ihrem
+PATH befindet. Das Programm muss ein PM-Programm sein! Der Konverter wird nicht
+als Teil des WPS-Prozesses gestartet.
+:ent.
+
+:h2 res=415
+x=50% width=50%
+group=2
+.Details fr Bilder auf CD aktivieren
+:p.
+In der Standardeinstellung werden keine Details fr Images auf CD untersttzt.
+Der Grund dafr ist, dass bei langsamen Laufwerken das Sammeln der Informationen
+sehr viel Zeit in Anspruch nimmt. Sie knnen die neuen Klassenfunktionen fr
+Images auf CD aktivieren, indem Sie den folgenden Schlssel zu OS2.INI
+hinzufgen&colon.
+:p.
+:hp2.CWMM->useNewImgClsFeaturesOnCD->1:ehp2.
+
+:nt.
+Achten Sie unbedingt auf die Groá-/Kleinschreibung!
+:ent.
+:nt.
+Damit die Einstellung wirksam wird, mssen Sie WPS neu starten.
+:ent.
+
+
+:h2 res=416
+x=50% width=50%
+group=2
+.Zeitanzeige in Symboltiteln deaktivieren
+:p.
+Beim Starten von Audiodateien per Doppelklick wird die verstrichene Zeit im
+Icon-Titel angezeigt. Um diese neue Funktion zu deaktivieren, setzen Sie den
+folgenden Schlssel in OS2.INI&colon.
+:p.
+:hp2.CWMM->mmClsNoExtendedIconTitles->1:ehp2.
+
+:nt.
+Achten Sie unbedingt auf die Groá-/Kleinschreibung!
+:ent.
+:nt.
+Damit die Einstellung wirksam wird, mssen Sie WPS neu starten.
+:ent.
+
+:h2 res=417
+x=50% width=50%
+group=2
+.Blinken der Wiedergabesteuerung whrend der Wiedergabe deaktivieren
+:p.
+Als visuelles Feedback blinken die Wiedergabesteuerungen (PLAY, PAUSE) whrend
+der Wiedergabe eines Titels. Um diese Funktion zu deaktivieren, setzen Sie den
+folgenden Schlssel in OS2.INI&colon.
+:p.
+:hp2.CWMM->bNoPlayCtrlBlinking->1:ehp2.
+
+:nt.
+Achten Sie unbedingt auf die Groá-/Kleinschreibung!
+:ent.
+:nt.
+Damit die Einstellung wirksam wird, mssen Sie WPS neu starten.
+:ent.
+
+:h2 res=418
+x=50% width=50%
+group=2
+.Verhindern der Erstellung eines Schattens fr die Media Player-Vorlage
+:p.
+Fr einen einfacheren Zugriff wird automatisch ein Schatten der Media
+Player-Vorlage im Ordner "Multimedia-Vorlagen" im Multimedia-Ordner erstellt.
+Durch Festlegen dieses Schlssels wird diese Funktion deaktiviert&colon.
+
+:p.
+:hp2.CWMM->bNoMediaFolderTemplateShadow->1:ehp2.
+
+:nt.
+Achten Sie unbedingt auf die Groá-/Kleinschreibung!
+:ent.
+
+:nt.
+Sie knnen den erstellten Schatten an eine andere Stelle verschieben. Er wird
+nur dann im Multimedia-Ordner neu erstellt, wenn er vom System gelscht wird.
+:ent.
+
+
+:h2 res=420
+x=50% width=50%
+group=2
+.Deaktivieren der Audiodateiprfung
+:p.
+Sie knnen die berprfung von Audiodateien fr bestimmte Laufwerke
+deaktivieren, indem Sie diesem Eintrag in OS2.INI den Laufwerksbuchstaben
+hinzufgen&colon.
+:p.
+:hp2.CWMM->mmClsDontCheckDrives-><Liste der Laufwerksbuchstaben>:ehp2.
+
+:nt.
+Achten Sie unbedingt auf die Groá-/Kleinschreibung!
+:ent.
+
+Dies kann fr Netzwerklaufwerke mit langsamen Verbindungen oder andere langsame
+Laufwerke ntzlich sein. Normalerweise werden die gesammelten Informationen in
+den erweiterten Attributen der Audiodatei gespeichert, sodass die berprfung
+nur einmal erfolgt. Wenn ein bestimmtes Dateisystem keine EAs untersttzt,
+knnen Sie dieses Laufwerk auch zur Liste hinzufgen, um die berprfung zu
+verhindern.
+
+:nt.
+Beachten Sie, dass fr Audioobjekte, die sich auf einem in der Liste angegebenen
+Laufwerk befinden, vom WPS keine Audioinformationen angezeigt werden.
+:ent.
+
+:nt.
+Damit die Einstellung wirksam wird, mssen Sie WPS neu starten.
+:ent.
+
+:p.
+Beispiel:
+:xmp.
+CWMM->mmClsDontCheckDrives->abcghzy
+:exmp.
+
+:nt.
+Diese Einstellung ist mittlerweile grátenteils veraltet, da das in
+:hp2.MMAudio Pak 2:ehp2. (verffentlicht am 30.08.2003) enthaltene MMIOMP3
+IO-Verfahren keine MP3-Dateien mehr scannt, sondern den Xing-Header fr
+VBR-codierte Dateien liest.
+:ent.
+
+
+:h2 res=421
+x=50% width=50%
+group=2
+.Deaktivieren des Lesens von ID3-Tags
+:p.
+Sie knnen das Lesen von ID3-Tags fr bestimmte Laufwerke deaktivieren, indem
+Sie diesem Eintrag in OS2.INI den Laufwerksbuchstaben hinzufgen&colon.
+:p.
+:hp2.CWMM->mmClsDontReadID3OnDrives-><Liste der Laufwerksbuchstaben>:ehp2.
+
+:nt.
+Achten Sie unbedingt auf die Groá-/Kleinschreibung!
+:ent.
+
+Dies kann fr Netzwerklaufwerke mit langsamen Verbindungen oder andere langsame
+Laufwerke ntzlich sein.
+
+:nt.
+Beachten Sie, dass fr MP3-Dateien, die sich auf einem in der Liste angegebenen
+Laufwerk befinden, vom WPS keine ID3-Tag-Informationen angezeigt werden.
+:ent.
+
+:nt.
+Damit die Einstellung wirksam wird, mssen Sie WPS neu starten.
+:ent.
+
+:p.
+Beispiel:
+:xmp.
+CWMM->mmClsDontReadID3OnDrives->abcghzy
+:exmp.
+
+
+:h2 res=424
+x=50% width=50%
+group=2
+.Zeit fr die Anzeige des Meldungsfelds festlegen
+:p.
+Das Besttigungsmeldungsfeld, das beim Schlieáen eines Medienordners whrend der
+Wiedergabe eines Titels angezeigt wird, wird nach 60 Sekunden automatisch
+geschlossen und der Ordner wird geschlossen. Diese Verzgerung kann durch
+Einstellen des folgenden Schlssels gendert werden&colon.
+
+:p.
+:hp2.CWMM->mfldrMBoxDisplayTime-><Zeit in Millisekunden>:ehp2.
+
+:nt.
+Achten Sie unbedingt auf die Groá-/Kleinschreibung!
+:ent.
+
+:nt.
+Die krzeste zulssige Zeit betrgt 5000ÿms.
+:ent.
+
+.* last id 424
Index: /tags/CWMM-0.3.0_GA/mediafolder/prog_tutorial/de/mediafldrprog_de.ipf
===================================================================
--- /tags/CWMM-0.3.0_GA/mediafolder/prog_tutorial/de/mediafldrprog_de.ipf	(revision 213)
+++ /tags/CWMM-0.3.0_GA/mediafolder/prog_tutorial/de/mediafldrprog_de.ipf	(revision 213)
@@ -0,0 +1,627 @@
+:userdoc.
+
+:docprof.
+
+:title.Programmier-Tutorial fr Multimedia-Klassen
+
+:h1 res=100.Einfhrung
+:p.
+Der Media-Ordner bietet zwei Schnittstellen zur Steuerung und Programmierung.
+Sie knnen :link reftype=hd res=200.Setup-Zeichenfolgen:elink. fr grundlegende
+Aufgaben wie das Starten und Stoppen der Wiedergabe oder eine
+:link reftype=hd res=300.REXX-Schnittstelle:elink. mit Zugriff auf interne
+Klassenmethoden verwenden.
+:p.
+Zur Nutzung der REXX-Schnittstelle muss
+:p.
+WPS-Wizard V0.2.0 (http&colon.//www.os2world.com/cdwriting)
+:p.
+oder hher installiert sein.
+
+:h1 res=200
+x=left y=bottom width=50%.Setup-Zeichenfolgen
+:p.
+Die folgenden zustzlichen Setup-Zeichenfolgen werden von jedem Medienordner
+untersttzt&colon.
+
+:ul.
+:li.:link reftype=hd res=210.MEDIAFLDRNEXT:elink.   Den nchsten Titel im Ordner abspielen
+:li.:link reftype=hd res=211.MEDIAFLDRPLAY:elink.   Jetzt abspielen
+:li.:link reftype=hd res=215.MEDIAFLDRPLAYFIRST:elink.   Ersten Track abspielen
+:li.:link reftype=hd res=212.MEDIAFLDRPREV:elink.   Zum vorherigen Track springen
+:li.:link reftype=hd res=216.MEDIAFLDRREPEAT:elink. Setze Wiederholungsmodus
+:li.:link reftype=hd res=213.MEDIAFLDRSTOP:elink.   Abspielen beenden
+:li.:link reftype=hd res=214.MEDIAFLDRVOLUME:elink. Setze Lautstrke
+:eul.
+:p.
+Damit diese Setup-Zeichenfolgen funktionieren, muss der Ordner geffnet sein.
+:p.
+Die MM-Audioklassen untersttzen die folgenden Zeichenfolgen&colon.
+:ul.
+:li.:link reftype=hd res=220.MMAUDIOTRACKNAME:elink.   Legt den Titelnamen der Audiodatei fest.
+:li.:link reftype=hd res=221.MMAUDIOARTIST:elink.   Legt den Knstler der Audiodatei fest.
+:li.:link reftype=hd res=222.MMAUDIOALBUM:elink.    Legt den Namen des Albums fest.
+:li.:link reftype=hd res=223.MMAUDIOCOMMENT:elink.  Legt den Kommentar der Audiodatei fest.
+:li.:link reftype=hd res=224.MMAUDIOYEAR:elink.     Legt das Erscheinungsjahr der Audiodatei fest.
+:li.:link reftype=hd res=225.MMAUDIOGENRE:elink.    Legt das Genre der Audiodatei fest.
+:li.:link reftype=hd res=226.MMREFRESH:elink.       Lieát die Informationen zur Audiodatei.
+:li.:link reftype=hd res=227.MMAUDIOCOPYTAGTO:elink.    Alle Tags der Audiodatei kopieren.
+:eul.
+
+
+:h2 res=210
+x=50% width=50%
+group=2
+.MEDIAFLDRNEXT
+:p.
+Whrend der Wiedergabe zum nchsten Titel springen. Falls die Wiedergabe noch
+nicht abgeschlossen ist, wird der erste Titel gestartet.
+
+:xmp.
+/* REXX - Dieser Befehl springt zum nchsten Track */
+
+rc=SysSetObjectData('x&colon.\pfad_zum_verzeichnis','MEDIAFLDRNEXT=1')
+:exmp.
+
+:h2 res=211
+x=50% width=50%
+group=2
+.MEDIAFLDRPLAY
+:p.
+Beginnt mit der Wiedergabe mit dem ersten Titel. Wenn ein beliebiger Titel
+ausgewhlt ist, beginnt die Wiedergabe mit dem ersten ausgewhlten Titel.
+
+:xmp.
+/* REXX - Dieser Befehl startet die Wiedergabe */
+
+rc=SysSetObjectData('x&colon.\pfad_zum_verzeichnis','MEDIAFLDRPLAY=1')
+:exmp.
+
+:h2 res=215
+x=50% width=50%
+group=2
+.MEDIAFLDRPLAYFIRST
+:p.
+Beginnt mit der Wiedergabe des ersten Titels, unabhngig davon, ob ein anderer
+Titel ausgewhlt ist.
+
+:xmp.
+/* REXX - Dieser Befehl startet die Wiedergabe des ersten Tracks */
+
+rc=SysSetObjectData('x&colon.\pfad_zum_verzeichnis','MEDIAFLDRPLAYFIRST=1')
+:exmp.
+
+
+:h2 res=212
+x=50% width=50%
+group=2
+.MEDIAFLDRPREV
+:p.
+Whrend der Wiedergabe zum vorherigen Titel springen.
+
+:xmp.
+/* REXX - Dieser Befehl springt zum vorherigen Track */
+
+rc=SysSetObjectData('x&colon.\pfad_zum_verzeichnis','MEDIAFLDRPREV=1')
+:exmp.
+
+:h2 res=216
+x=50% width=50%
+group=2
+.MEDIAFLDRREPEAT
+:p.
+Legt das Wiederholungsattribut fest. Wenn der Wert auf 1 gesetzt ist, werden
+die Titel im Ordner wiederholt. Wenn der Wert auf 0 gesetzt ist, ist die
+Wiederholung deaktiviert.
+
+:xmp.
+/* REXX - Dieser Befehl setzt den Wiederholmodus auf ja */
+
+rc=SysSetObjectData('x&colon.\pfad_zum_verzeichnis','MEDIAFLDRREPEAT=1')
+:exmp.
+
+:h2 res=213
+x=50% width=50%
+group=2
+.MEDIAFLDRSTOP
+:p.
+Wiedergabe beenden
+
+:xmp.
+/* REXX - Dieser Befehl stoppt die Wiedergabe */
+
+rc=SysSetObjectData('x&colon.\pfad_zum_verzeichnis','MEDIAFLDRSTOP=1')
+:exmp.
+
+:h2 res=214
+x=50% width=50%
+group=2
+.MEDIAFLDRVOLUME
+:p.
+ndert die Lautstrke zwischen 0 und 100 %.
+
+:xmp.
+/* REXX - Dieser Befehl setzt die Lautstrke auf 35% */
+
+rc=SysSetObjectData('x&colon.\pfad_zum_verzeichnis','MEDIAFLDRVOLUME=35')
+:exmp.
+
+.********************************************
+
+:h2 res=220
+x=50% width=50%
+group=2
+.MMAUDIOTRACKNAME
+:p.
+Legt den Titelnamen der Audiodatei fest. Diese Information wird im EA der Datei
+gespeichert. Bei MP3-Dateien wird diese Information auch im ID3-Tag gespeichert.
+
+:xmp.
+/* REXX - Dieser Befehl fgt den Titelnamen zur Audiodatei hinzu */
+
+rc=SysSetObjectData('x&colon.\pfad_zum_verzeichnis\audio_datei.ext','MMAUDIOTRACKNAME=Track-Name')
+:exmp.
+
+:h2 res=221
+x=50% width=50%
+group=2
+.MMAUDIOARTIST
+:p.
+Legt den Knstlernamen der Audiodatei fest. Diese Information wird im EA der
+Datei gespeichert. Bei MP3-Dateien wird diese Information auch im ID3-Tag
+gespeichert.
+
+:xmp.
+/* REXX - Dieser Befehl fgt den Knstlernamen zur Audiodatei hinzu */
+
+rc=SysSetObjectData('x&colon.\pfad_zum_verzeichnis\audio_datei.ext','MMAUDIOARTIST=Knstlername')
+:exmp.
+
+:h2 res=222
+x=50% width=50%
+group=2
+.MMAUDIOALBUM
+:p.
+Legt den Albumnamen der Audiodatei fest. Diese Information wird im EA der Datei
+gespeichert. Bei MP3-Dateien wird diese Information auch im ID3-Tag gespeichert.
+
+:xmp.
+/* REXX - Dieser Befehl fgt den Albumnamen zur Audiodatei hinzu */
+
+rc=SysSetObjectData('x&colon.\pfad_zum_verzeichnis\audio_datei.ext','MMAUDIOALBUM=Albumname')
+:exmp.
+
+:h2 res=223
+x=50% width=50%
+group=2
+.MMAUDIOCOMMENT
+:p.
+Legt den Kommentar der Audiodatei fest. Diese Information wird im EA der Datei
+gespeichert. Bei MP3-Dateien wird diese Information auch im ID3-Tag gespeichert.
+
+:xmp.
+/* REXX - Dieser Befehl fgt der Audiodatei einen Kommentar hinzu */
+
+rc=SysSetObjectData('x&colon.\pfad_zum_verzeichnis\audio_datei.ext','MMAUDIOCOMMENT=Track-Kommentar')
+:exmp.
+
+:h2 res=224
+x=50% width=50%
+group=2
+.MMAUDIOYEAR
+:p.
+Legt das Jahr der Audiodatei fest. Diese Information wird im EA der Datei
+gespeichert. Bei MP3-Dateien wird diese Information auch im ID3-Tag gespeichert.
+
+:xmp.
+/* REXX - Dieser Befehl fgt der Audiodatei das Jahr hinzu */
+
+rc=SysSetObjectData('x&colon.\pfad_zum_verzeichnis\audio_datei.ext','MMAUDIOYEAR=2003')
+:exmp.
+
+:h2 res=225
+x=50% width=50%
+group=2
+.MMAUDIOGENRE
+:p.
+Legt das Genre der Audiodatei fest. Diese Information wird im EA der Datei
+gespeichert. Bei MP3-Dateien wird diese Information zustzlich im ID3-Tag
+gespeichert.
+
+:xmp.
+/* REXX - Dieser Befehl fgt das Genre der Audiodatei hinzu */
+
+rc=SysSetObjectData('x&colon.\pfad_zum_verzeichnis\audio_datei.ext','MMAUDIOGENRE=Blues')
+:exmp.
+
+:h2 res=226
+x=50% width=50%
+group=2
+.MMREFRESH
+:p.
+Lieát die Audioinformationen erneut aus der Datei und aktualisieren Sie die
+internen Objektdaten.
+
+:xmp.
+/* REXX - Dieser Befehl liest die Informationen der Audiodatei erneut ein */
+
+rc=SysSetObjectData('x&colon.\pfad_zum_verzeichnis\audio_datei.ext','MMREFRESH=1')
+:exmp.
+
+:h2 res=227
+x=50% width=50%
+group=2
+.MMAUDIOCOPYTAGTO
+
+Liest die Audioinformationen aus dem Datei-Tag und kopiert sie in eine andere
+Datei.
+
+:xmp.
+/* REXX - Dieser Befehl kopiert die Datei-Tag-Informationen in eine andere Audiodatei */
+
+rc=SysSetObjectData('x&colon.\pfad_zum_verzeichnis\audio_datei.ext','MMAUDIOCOPYTAGTO=x&colon.\pfad_zum_verzeichnis\andere_datei.ext')
+:exmp.
+
+
+.********************************************
+
+:h1 res=300.REXX interface
+:p.
+Bei Verwendung der REXX-Schnittstelle haben Skripte Zugriff auf die
+Klassenmethoden des Medienordners. Untersttzung fr die wichtigsten Methoden
+der WPS, Hilfsfunktionen und einige PM-Fensterfunktionen wird vom WPS-Wizard
+bereitgestellt.
+
+:p.
+Die Methoden des Medienordners werden mithilfe einer Wrapper-Funktion
+aufgerufen&colon.
+
+:table cols='20 35'.
+:row.
+:c.:link reftype=hd res=320.MFldrCallFunc:elink.
+:c.Ruft eine der vom Medienordner eingefhrten Methoden auf.
+:etable.
+
+:p.
+Von den Multimediaklassen eingefhrte Methoden werden mithilfe der folgenden
+Funktion aufgerufen&colon.
+:table cols='20 35'.
+:row.
+:c.:link reftype=hd res=330.MMCallFunc:elink.
+:c.Ruft eine der von Multimediaklassen (CWAudio, CWMP3, CWOGG) eingefhrten
+Methoden auf.
+:etable.
+
+:p.
+Das Skript luft im Kontext der WPS, einem PM-Programm in einem separaten
+Thread. Sie knnen zustzlich verfgbare REXX-DLLs verwenden. Der Name des
+REXX-Skripts ist egal, die Datei muss jedoch wie blich mit einem Kommentar
+beginnen.
+
+.*************************************
+
+.***********************************************
+
+:h2 res=320
+width=30%
+.MFldrCallFunc
+:link reftype=hd res=321
+auto dependent group=2.
+:p.
+Verwenden Sie diese Funktion, um eine der neuen Medienordnermethoden oder eine
+Hilfsmethode aufzurufen&colon.
+:p.
+:link reftype=hd res=321 dependent.Syntax:elink.
+.*.br
+.*:link reftype=hd res=322.Parameter:elink.
+.br
+:link reftype=hd res=323 dependent.Rckgabewerte:elink.
+.br
+:link reftype=hd res=324 dependent.Hinweise:elink.
+.*.br
+.*:link reftype=hd res=325.Verwendung:elink.
+.br
+:link reftype=hd res=326.Beispiel:elink.
+
+:h2 res=321
+x=30%
+width=70%
+group=2
+hide
+.MFldrCallFunc - Syntax
+
+:xmp.
+/* Aufrufen einer Methode aus REXX */
+
+methodName     /* Der Name einer Methode */
+Object         /* Objekt, auf dem die Methode aufgerufen wird */
+param1         /* Erster Methodenparameter */
+param2         /* Zweiter Methodenparameter */
+:p.
+rc=MFldrCallFunc(methodName, Object,
+                 param1, param2, ...);
+:exmp.
+
+
+:h2 res=322
+x=30%
+width=70%
+group=2
+hide
+.MFldrCallFunc - Parameter
+:p.
+
+:h2 res=323
+x=30%
+width=70% height=35%
+group=3
+hide
+.MFldrCallFunc - Rckgabewerte
+:p.
+Der Rckgabewert hngt von der aufgerufenen Methode ab. Es kann sich um eine
+Zeichenfolge oder einen numerischen Wert handeln. Weitere Informationen finden
+Sie in der Methodenbeschreibung.
+:p.
+Wenn die Methode nicht gefunden werden kann, wird die Zeichenfolge
+:hp2.ERROR_METHOD&colon.:ehp2. zurckgegeben.
+
+:h2 res=324
+x=30%
+width=70%
+group=2
+hide
+.MFldrCallFunc - Hinweise
+:p.
+Die aufzurufende Methode muss ein Mitglied des Objekts :hp2.Object:ehp2 sein.
+Ein Fehler tritt auf, wenn das Objekt die angeforderte Methode nicht untersttzt.
+Beispielsweise untersttzt ein CWMediaFolder-Objekt nicht dieselben Methoden wie
+ein CWAudio-Objekt.
+
+:h2 res=325
+x=30%
+width=70%
+group=2
+hide
+.MFldrCallFunc - Verwendung
+:p.
+
+:h2 res=326
+x=30%
+width=70%
+group=2
+hide
+.MFldrCallFunc - Beispiel
+
+:xmp.
+/* Dieses Beispiel fragt das erste Objekt in */
+/* einem CWMediaFolder ab, holt die          */
+/* verknpfte Datei und fragt den Namen des  */
+/* Knstlers aus dem ID3-Tag ab.             */
+
+/* Holt das erste Objekt des Ordners theFolder */
+theObject=MFldrCallWPSFunc("wpQueryContent", theFolder, 0, QC_FIRST)
+
+/* Holt das verknpfte Dateisystemobjekt aus dem
+   Schatten. cwGetFileSystemObject ist ein Mitglied der
+   Klasse CWMediaFolder. */
+theFileObj=MFldrCallFunc("cwGetFileSystemObject", theFolder, theObject)
+
+/* Holen Sie sich den Knstlernamen. cwmmQueryTrackInfo
+   ist ein Mitglied der CWAudio-Klasse. Jedes Objekt im
+   CWMediaFolder ist normalerweise ein Schatten einer
+   Objektinstanz einer Unterklasse von CWAudio */
+theName=MFldrCallFunc("cwmmQueryTrackInfo", theFileObj, 2)
+
+/* Den Namen anzeigen */
+rc=RxMessageBox("The artist name : "||theName)
+:exmp.
+
+.*********************************************
+.***********************************************
+
+:h2 res=330
+width=30%
+.MMCallFunc
+:link reftype=hd res=331
+auto dependent group=2.
+:p.
+Verwenden Sie diese Funktion, um eine der neuen Multimedia-Klassenmethoden
+aufzurufen, die mit :hp2.CWAudio/MMAudio:ehp2. eingefhrt wurden.
+:p.
+:link reftype=hd res=331 dependent.Syntax:elink.
+.*.br
+.*:link reftype=hd res=332.Parameter:elink.
+.br
+:link reftype=hd res=333 dependent.Rckgabewerte:elink.
+.br
+:link reftype=hd res=334 dependent.Hinweise:elink.
+.*.br
+.*:link reftype=hd res=335.Verwendung:elink.
+.br
+:link reftype=hd res=336.Beispiel:elink.
+
+:h2 res=331
+x=30%
+width=70%
+group=2
+hide
+.MMCallFunc - Syntax
+
+:xmp.
+/* Aufrufen einer Methode aus REXX */
+
+methodName     /* Der Name einer Methode */
+Object         /* Objekt, auf dem die Methode aufgerufen wird */
+param1         /* Erster Methodenparameter */
+param2         /* Zweiter Methodenparameter */
+:p.
+rc=MMCallFunc(methodName, Object,
+                 param1, param2, ...);
+:exmp.
+
+
+:h2 res=332
+x=30%
+width=70%
+group=2
+hide
+.MMCallFunc - Parameter
+:p.
+
+:h2 res=333
+x=30%
+width=70% height=35%
+group=3
+hide
+.MMCallFunc - Rckgabewerte
+:p.
+Der Rckgabewert hngt von der aufgerufenen Methode ab. Es kann sich um eine
+Zeichenfolge oder einen numerischen Wert handeln. Weitere Informationen finden
+Sie in der Methodenbeschreibung.
+:p.
+Wenn die Methode nicht gefunden werden kann, wird die Zeichenfolge
+:hp2.ERROR_METHOD&colon.:ehp2. zurckgegeben.
+
+:h2 res=334
+x=30%
+width=70%
+group=2
+hide
+.MMCallFunc - Hinweise
+:p.
+Die aufzurufende Methode muss ein Mitglied des Objekts :hp2.Object:ehp2 sein.
+Ein Fehler tritt auf, wenn das Objekt die angeforderte Methode nicht
+untersttzt. Beispielsweise untersttzt ein CWMediaFolder-Objekt nicht
+dieselben Methoden wie ein CWAudio-Objekt.
+:p.
+In frheren Versionen der Klassen hatte diese Funktion den Namen
+:hp2.MMClsCallFunc:ehp2. . Dieser Name wird noch untersttzt, ist aber veraltet.
+
+:h2 res=335
+x=30%
+width=70%
+group=2
+hide
+.MMCallFunc - Verwendung
+:p.
+
+:h2 res=336
+x=30%
+width=70%
+group=2
+hide
+.MMCallFunc - Beispiel
+:xmp.
+/* Dieses Beispiel fragt das erste Objekt          */
+/* in einem CWMediaFolder ab, holt die verknpfte  */
+/* Datei und fragt den Namen des Knstlers aus dem */
+/* ID3-Tag ab.                                     */
+
+/* Holt das erste Objekt des Ordners theFolder */
+theObject=WPSWizCallWPSFunc("wpQueryContent", theFolder, 0, QC_FIRST)
+
+/* Holen Sie sich das verknpfte Dateisystemobjekt
+   aus dem Schatten. cwGetFileSystemObject ist ein
+   Mitglied der Klasse CWMediaFolder. */
+theFileObj=MFldrCallFunc("cwGetFileSystemObject", theFolder, theObject)
+
+/* Holen Sie sich den Knstlernamen. cwmmQueryTrackInfo
+   ist ein Mitglied der CWAudio-Klasse. Jedes Objekt im
+   CWMediaFolder ist normalerweise ein Schatten einer
+   Objektinstanz einer Unterklasse von CWAudio */
+theName=MMCallFunc("cwmmQueryTrackInfo", theFileObj, 2)
+
+/* Den Namen anzeigen */
+rc=RxMessageBox("The artist name : "||theName)
+:exmp.
+
+
+.im de\wpsmethods_de.inc
+
+:h1 res=400
+x=left y=bottom width=50%.Versteckte Funktionen
+:p.
+Die folgenden Funktionen der CW-Multimediaklassen knnen durch Festlegen von Werten
+in :hp2.OS2.INI:ehp2. aktiviert werden&colon.
+:ul.
+:li.:link reftype=hd res=410.Audioplayer ersetzen:elink.
+:li.:link reftype=hd res=429.MIDI-Player ersetzen:elink.
+:li.:link reftype=hd res=425.Audiokonverter ersetzen:elink.
+:li.:link reftype=hd res=411.Audio-Editor ersetzen:elink.
+:li.:link reftype=hd res=412.AVI-Player ersetzen:elink.
+:li.:link reftype=hd res=413.MPG-Player ersetzen:elink.
+:li.:link reftype=hd res=419.MP3-Player ersetzen:elink.
+:li.:link reftype=hd res=427.Modernen Videoplayer hinzufgen:elink.
+:li.:link reftype=hd res=428.Kein moderner Videoplayer:elink.
+:li.:link reftype=hd res=414.Bildeditor ersetzen:elink.
+:li.:link reftype=hd res=426.Bildkonverter ersetzen:elink.
+:li.:link reftype=hd res=415.Details fr Bilder auf CD aktivieren:elink.
+:li.:link reftype=hd res=416.Zeitanzeige in Symboltiteln deaktivieren:elink.
+:li.:link reftype=hd res=417.Blinken der Wiedergabesteuerung (PLAY, PAUSE) deaktivieren:elink.
+:li.:link reftype=hd res=418.Deaktivieren der Erstellung eines Schattens fr die Media Player-Vorlage:elink.
+:li.:link reftype=hd res=420.Deaktivieren der Audiodateiprfung:elink.
+:li.:link reftype=hd res=421.Deaktivieren des Lesens von ID3-Tags:elink.
+:li.:link reftype=hd res=422.M3U-Editor ersetzen:elink.
+:li.:link reftype=hd res=423.M3U-Player ersetzen:elink.
+:eul.
+
+.im de\hiddenfeatures_de.inc
+
+:h1 res=500.Erweiterte Attribute
+:p.
+Informationen zu Audiodateien werden in den erweiterten Attributen der Datei
+gespeichert und knnen von anderen Programmen oder REXX verwendet werden.
+Derzeit sind die folgenden EAs definiert&colon.
+
+:table cols='20 35'.
+:row.
+:c.MMALBUM
+:c.Das Album, zu dem dieser Titel gehrt
+:row.
+:c.MMARTIST
+:c.Name des Knstlers
+:row.
+:c.MMBPS
+:c.Bits pro Sample
+:row.
+:c.MMCHANNELS
+:c.Anzahl der Kanle
+:row.
+:c.MMCOMMENT
+:c.Der Kommentar zu dieser Datei
+:row.
+:c.MMGENRE
+:c.Das Genre dieser Audiodatei
+:row.
+:c.MMNUMAUDIOBYTES
+:c.Die Anzahl der Audiobytes in dieser Audiodatei
+:row.
+:c.MMPLAYTIME
+:c.Spielzeit in Sekunden
+:row.
+:c.MMPLAYTIMEMS
+:c.Spielzeit in Millisekunden
+:row.
+:c.MMSAMPLERATE
+:c.Abtastrate
+:row.
+:c.MMTRACKNAME
+:c.Name des Tracks
+:row.
+:c.MMYEAR
+:c.Erscheinungsjahr
+:etable.
+
+:nt.
+Die Informationen werden im ASCII-Format gespeichert.
+:ent.
+
+:euserdoc.
+
+
+
+
+
+
+
+
Index: /tags/CWMM-0.3.0_GA/mediafolder/prog_tutorial/de/newmethods_de.inc
===================================================================
--- /tags/CWMM-0.3.0_GA/mediafolder/prog_tutorial/de/newmethods_de.inc	(revision 213)
+++ /tags/CWMM-0.3.0_GA/mediafolder/prog_tutorial/de/newmethods_de.inc	(revision 213)
@@ -0,0 +1,538 @@
+.******************************************************
+
+:h2 res=1010
+width=30%
+.cwGetFileSystemObject
+:link reftype=hd res=1011
+auto dependent group=2.
+:p.
+:link reftype=hd res=1011.Syntax:elink.
+.br
+:link reftype=hd res=1013 dependent.Rckgabewerte:elink.
+.br
+:link reftype=hd res=1014 dependent.Hinweise:elink.
+.*.br
+.*:link reftype=hd res=315.Verwendung:elink.
+.*.br
+.*:link reftype=hd res=416 dependent.Beispiel:elink.
+
+:h2 res=1011
+x=30%
+width=70%
+hide
+group=2
+.cwGetFileSystemObject - Syntax
+
+:xmp.
+/* Holt das Dateisystemobjekt, auf das ein Schatten verweist */
+
+mediaFolder   /* Zeiger auf einen Medienordner */
+theShadow     /* Ein Schattenobjekt  */
+:p.
+fsObj=MFldrCallFunc("cwGetFileSystemObject", 
+                        mediaFolder, theShadow);
+:exmp.
+
+
+:h2 res=1013
+x=30%
+width=70% height=35%
+group=3
+hide
+.cwGetFileSystemObject - Rckgabewerte
+:p.
+:hp2.fsObj:ehp2. numerisch
+:p.
+Der Rckgabewert ist ein Zeiger auf das Dateisystemobjekt, auf das der Schatten
+:hp2.theShadow:ehp2. verweist. Wenn die Verknpfung unterbrochen ist, wird 0
+zurckgegeben.
+
+
+:h2 res=1014
+x=30%
+width=70%
+hide
+group=2
+.cwGetFileSystemObject - Hinweise
+:p.
+Diese Methode ist ein Mitglied des Medienordners, daher muss ein Objektzeiger
+auf einen Medienordner bereitgestellt werden.
+:p.
+Die Methode wurde von der Klasse CWProgFolder eingefhrt, die eine bergeordnete
+Klasse fr mehrere neue Ordnerklassen ist. Sie knnen also auch einen Zeiger auf
+jede andere Unterklasse von CWProgFolder verwenden. Einige dieser Unterklassen
+sind unten aufgefhrt.
+
+:ul.
+:li.CWAudioFolder
+:li.CWDataFolder
+:li.CWMediaFolder
+:eul.
+
+
+
+.******************************************************
+:h2 res=1040
+width=30%
+.cwPauseAudioFile
+:link reftype=hd res=1041
+auto dependent group=2.
+:p.
+:link reftype=hd res=1041.Syntax:elink.
+.br
+:link reftype=hd res=1043 dependent.Rckgabewerte:elink.
+.br
+:link reftype=hd res=1044 dependent.Hinweise:elink.
+.*.br
+.*:link reftype=hd res=315.Verwendung:elink.
+.*.br
+.*:link reftype=hd res=416 dependent.Beispiel:elink.
+
+:h2 res=1041
+x=30%
+width=70%
+hide
+group=2
+.cwPauseAudioFile - Syntax
+
+:xmp.
+/* Diese Methode pausiert die Wiedergabe */
+
+mediaFolder   /* Zeiger auf den Medienordner */
+frameHandle   /* Handle des Ordnerrahmens    */
+:p.
+rc=MFldrCallFunc("cwPauseAudioFile", 
+                        mediaFolder, frameHandle);
+:exmp.
+
+
+:h2 res=1043
+x=30%
+width=70% height=35%
+group=3
+hide
+.cwPauseAudioFile - Rckgabewerte
+:p.
+:hp2.rc:ehp2. numerisch
+:p.
+
+
+:h2 res=1044
+x=30%
+width=70%
+hide
+group=2
+.cwPauseAudioFile - Hinweise
+:p.
+Der Frame-Handle des Medienordners wird dem Skript beim Start als Parameter
+bergeben.
+
+.******************************************************
+:h2 res=1050
+width=30%
+.cwPlayAudioFile
+:link reftype=hd res=1051
+auto dependent group=2.
+:p.
+:link reftype=hd res=1051.Syntax:elink.
+.br
+:link reftype=hd res=1053 dependent.Rckgabewerte:elink.
+.br
+:link reftype=hd res=1054 dependent.Hinweise:elink.
+.*.br
+.*:link reftype=hd res=315.Verwendung:elink.
+.*.br
+.*:link reftype=hd res=416 dependent.Beispiel:elink.
+
+:h2 res=1051
+x=30%
+width=70%
+hide
+group=2
+.cwPlayAudioFile - Syntax
+
+:xmp.
+/* Mit dieser Methode wird der Inhalt des */
+   Medienordners abgespielt. */
+
+mediaFolder   /* Zeiger auf den Medienordner */
+frameHandle   /* Handle des Ordnerrahmens    */
+flag          /* Flag, das angibt, welcher Titel gestartet werden soll */
+:p.
+rc=MFldrCallFunc("cwPlayAudioFile", 
+                        mediaFolder, frameHandle, flag);
+:exmp.
+
+:h2 res=1053
+x=30%
+width=70% height=35%
+group=3
+hide
+.cwPlayAudioFile - Rckgabewerte
+:p.
+:hp2.rc:ehp2. numerisch
+:p.
+
+
+:h2 res=1054
+x=30%
+width=70%
+hide
+group=2
+.cwPlayAudioFile - Hinweise
+:p.
+Der Frame-Handle des Medienordners wird dem Skript beim Start als Parameter
+bergeben. Der Flag-Parameter kann einen der folgenden Werte haben.
+
+:ul.
+:li.PLAY_FIRST    1
+.br
+Starten Sie den ersten Audiotitel im Medienordner. Wenn ein beliebiger Titel
+ausgewhlt ist, beginnen Sie mit dem ersten ausgewhlten Titel.
+:li.PLAY_NEXT     2
+.br
+Den nchsten Titel abspielen.
+:li.PLAY_PREV     3
+.br
+Vorherigen Titel abspielen.
+:eul.
+
+
+.******************************************************
+:h2 res=1060
+width=30%
+.cwQueryCurrentlyPlayingObject
+:link reftype=hd res=1061
+auto dependent group=2.
+:p.
+:link reftype=hd res=1061.Syntax:elink.
+.br
+:link reftype=hd res=1063 dependent.Rckgabewerte:elink.
+.*.br
+.*:link reftype=hd res=1054 dependent.Hinweise:elink.
+.*.br
+.*:link reftype=hd res=315.Verwendung:elink.
+.*.br
+.*:link reftype=hd res=416 dependent.Beispiel:elink.
+
+:h2 res=1061
+x=30%
+width=70%
+hide
+group=2
+.cwQueryCurrentlyPlayingObject - Syntax
+
+:xmp.
+/* Diese Methode fragt den Zeiger auf das
+   aktuell abgespielte Objekt ab */
+
+mediaFolder   /* Zeiger auf den Medienordner */
+:p.
+rc=MFldrCallFunc("cwQueryCurrentlyPlayingObject", 
+                  mediaFolder);
+:exmp.
+
+:h2 res=1063
+x=30%
+width=70% height=35%
+group=3
+hide
+.cwQueryCurrentlyPlayingObject - Rckgabewerte
+:p.
+:hp2.rc:ehp2. numerisch
+:p.
+Objektzeiger auf das aktuell wiedergegebene Objekt oder 0, wenn kein Objekt
+wiedergegeben wird.
+
+
+
+.******************************************************
+:h2 res=1090
+width=30%
+.cwSetStatusLineText
+:link reftype=hd res=1091
+auto dependent group=2.
+:p.
+:link reftype=hd res=1091.Syntax:elink.
+.br
+:link reftype=hd res=1093 dependent.Rckgabewerte:elink.
+.br
+:link reftype=hd res=1094 dependent.Hinweise:elink.
+.*.br
+.*:link reftype=hd res=315.Verwendung:elink.
+.*.br
+.*:link reftype=hd res=416 dependent.Beispiel:elink.
+
+:h2 res=1091
+x=30%
+width=70%
+hide
+group=2
+.cwSetStatusLineText - Syntax
+
+:xmp.
+/* Diese Methode setzt den Statuszeilentext eines Medienordners */
+
+mediaFolder   /* Zeiger auf einen Medienordner, auf dem die Methode aufgerufen wird */
+theText       /* Text fr Statuszeile oder 0 */
+:p.
+info=MFldrCallFunc("cwSetStatusLineText", 
+                    mediaFolder, theText);
+:exmp.
+
+:h2 res=1093
+x=30%
+width=70% height=35%
+group=3
+hide
+.cwSetStatusLineText - Rckgabewerte
+:p.
+:hp2.info:ehp2. Zeichenkette
+:p.
+
+
+:h2 res=1094
+x=30%
+width=70%
+hide
+group=2
+.cwSetStatusLineText - Hinweise
+:p.
+Wenn der Textparameter 0 ist, zeigt der Ordner seinen Standardstatuszeilentext
+an.
+
+
+.******************************************************
+:h2 res=1100
+width=30%
+.cwStopAudioFile
+:link reftype=hd res=1101
+auto dependent group=2.
+:p.
+:link reftype=hd res=1101.Syntax:elink.
+.br
+:link reftype=hd res=1103 dependent.Rckgabewerte:elink.
+.br
+:link reftype=hd res=1104 dependent.Hinweise:elink.
+.*.br
+.*:link reftype=hd res=315.Verwendung:elink.
+.*.br
+.*:link reftype=hd res=416 dependent.Beispiel:elink.
+
+:h2 res=1101
+x=30%
+width=70%
+hide
+group=2
+.cwStopAudioFile - Syntax
+:xmp.
+/* Diese Methode stoppt die Wiedergabe */
+
+mediaFolder   /* Zeiger auf den Medienordner */
+frameHandle   /* Handle des Ordnerrahmens    */
+:p.
+rc=MFldrCallFunc("cwStopAudioFile", 
+                        mediaFolder, frameHandle);
+:exmp.
+
+
+:h2 res=1103
+x=30%
+width=70% height=35%
+group=3
+hide
+.cwStopAudioFile - Rckgabewerte
+:p.
+:hp2.rc:ehp2. numerisch
+:p.
+
+
+:h2 res=1104
+x=30%
+width=70%
+hide
+group=2
+.cwStopAudioFile - Hinweise
+:p.
+Der Frame-Handle des Medienordners wird dem Skript beim Start als Parameter
+bergeben.
+
+
+.******************************************************
+:h2 res=1070
+width=30%
+.cwmmQueryTrackInfo
+:link reftype=hd res=1071
+auto dependent group=2.
+:p.
+:link reftype=hd res=1071.Syntax:elink.
+.br
+:link reftype=hd res=1073 dependent.Rckgabewerte:elink.
+.br
+:link reftype=hd res=1074 dependent.Hinweise:elink.
+.*.br
+.*:link reftype=hd res=315.Verwendung:elink.
+.*.br
+.*:link reftype=hd res=416 dependent.Beispiel:elink.
+
+:h2 res=1071
+x=30%
+width=70%
+hide
+group=2
+.cwmmQueryTrackInfo - Syntax
+
+:xmp.
+/* Diese Methode fragt Informationen aus einem
+   Audioobjekt ab */
+
+audioObject   /* Zeiger auf ein Audioobjekt, auf dem die Methode aufgerufen wird */
+flag          /* Flag, das angibt, welche Informationen abgefragt werden sollen */
+:p.
+info=MMClsCallFunc("cwmmQueryTrackInfo", 
+                  audioObject, flag);
+:exmp.
+
+:h2 res=1073
+x=30%
+width=70% height=35%
+group=3
+hide
+.cwmmQueryTrackInfo - Rckgabewerte
+:p.
+:hp2.info:ehp2. Zeichenkette
+:p.
+Die angeforderten Informationen werden als Zeichenfolge zurckgegeben. Wenn
+keine Informationen verfgbar sind, wird eine leere Zeichenfolge zurckgegeben.
+:p.
+Wenn ein Fehler auftritt, wird :hp2.ERROR&colon.:ehp2. zurckgegeben.
+
+:h2 res=1074
+x=30%
+width=70%
+hide
+group=2
+.cwmmQueryTrackInfo - Hinweise
+:p.
+Das Objekt muss eine Instanz von :hp2.CWAudio:ehp2. oder einer seiner
+Unterklassen (:hp2.CWMP3:ehp2., :hp2.MMWAV:ehp2....) sein. Diese Methode wurde
+von :hp2.CWAudio:ehp2. eingefhrt. Seit V0.2.5 der Klassen lauten die
+Klassennamen :hp2.MMAudio:ehp2. :hp2.MMWAV:ehp2. usw., um mit den IBM-Klassen
+kompatibel zu sein, die mit OS/2 geliefert werden.
+:p.
+Der Flag-Parameter kann einen der folgenden Werte haben&colon.
+:ul.
+:li.IDINFO_NAME              1
+.br
+Titelname
+:li.IDINFO_ARTIST            2
+.br
+Name des Knstlers
+:li.IDINFO_ALBUM             3
+.br
+Name des Albums
+:li.IDINFO_YEAR              4
+.br
+Jahr aus ID3-Tag
+:li.IDINFO_COMMENT           5
+.br
+Kommentar
+:li.IDINFO_GENRE             6
+.br
+Das Genre als Zeichenfolge
+:li.IDINFO_PLAYTIME          7
+.br
+Spieldauer in Sekunden (numerischer Wert)
+:li.IDINFO_BPS               8
+.br
+Bits pro Sample (numerischer Wert)
+:li.IDINFO_SAMPLERATE        9
+.br
+Abtastrate in Hz (numerischer Wert)
+:li.IDINFO_CHANNELS          10
+.br
+Anzahl der Kanle (numerischer Wert)
+:li.IDINFO_BITRATE           11
+.br
+Bitrate in KB pro Sekunde (numerischer Wert). Dieses Flag ist nur fr Instanzen
+der Klassen MMMP3 und MMOGG gltig. Fr andere Klassen ist der Rckgabewert
+undefiniert. Neu mit Version 0.2.7
+:eul.
+
+
+.******************************************************
+:h2 res=1080
+width=30%
+.cwmmQueryImageInfo
+:link reftype=hd res=1081
+auto dependent group=2.
+:p.
+:link reftype=hd res=1081.Syntax:elink.
+.br
+:link reftype=hd res=1082 dependent.Parameter:elink.
+
+.br
+:link reftype=hd res=1083 dependent.Rckgabewerte:elink.
+.*.br
+.*:link reftype=hd res=1084 dependent.Hinweise:elink.
+.*.br
+.*:link reftype=hd res=315.Verwendung:elink.
+.*.br
+.*:link reftype=hd res=416 dependent.Beispiel:elink.
+
+:h2 res=1081
+x=30%
+width=70%
+hide
+group=2
+.cwmmQueryImageInfo - Syntax
+
+:xmp.
+/* Diese Methode fragt Informationen aus
+   einem Bildobjekt ab */
+
+imageObject   /* Zeiger auf ein Bildobjekt, auf dem die Methode aufgerufen wird */
+flag          /* Flag, das angibt, welche Informationen abgefragt werden sollen */
+:p.
+info=MMCallFunc("cwmmQueryTrackInfo", 
+                  imageObject, flag);
+:exmp.
+
+:h2 res=1083
+x=30%
+width=70% height=35%
+group=3
+hide
+.cwmmQueryImageInfo - Rckgabewerte
+:p.
+:hp2.info:ehp2. Zeichenkette
+:p.
+Die angeforderten Informationen werden als Zeichenfolge zurckgegeben. Wenn keine
+Informationen verfgbar sind, wird eine leere Zeichenfolge zurckgegeben.
+:p.
+Wenn ein Fehler auftritt, wird :hp2.ERROR&colon.:ehp2. zurckgegeben.
+
+:h2 res=1082
+x=30%
+width=70%
+hide
+group=2
+.cwmmQueryImageInfo - Parameter
+:p.
+:parml tsize=10.
+:pt.:hp2.imageObject:ehp2. (numerisch)
+:pd.Objektzeiger der Bilddatei.
+:pt.:hp2.flag:ehp2. (numerisch)
+:pd.Bestimmt die abzufragenden Informationen.
+:parml tsize=3.
+:pt.IDINFO_WIDTH    0x0001
+:pd.Die Breite des Bildes.
+:pt.IDINFO_HEIGHT   0x0002
+:pd.Die Hhe des Bildes.
+:pt.IDINFO_BPP      0x0003  
+:pd.Anzahl der Bits pro Pixel.
+:pt.IDINFO_FORMAT   0x0004  
+:pd.Bildformat.
+:eparml.
+:eparml.
+
Index: /tags/CWMM-0.3.0_GA/mediafolder/prog_tutorial/de/wpsmethods_de.inc
===================================================================
--- /tags/CWMM-0.3.0_GA/mediafolder/prog_tutorial/de/wpsmethods_de.inc	(revision 213)
+++ /tags/CWMM-0.3.0_GA/mediafolder/prog_tutorial/de/wpsmethods_de.inc	(revision 213)
@@ -0,0 +1,40 @@
+
+
+:h1 res=1000
+width=30%
+.Supported methods
+:p.
+Die folgenden eingefhrten Methoden werden derzeit untersttzt&colon.
+:p.
+.br
+:link reftype=hd res=1010 dependent.cwGetFileSystemObject:elink.
+.br
+:link reftype=hd res=1040 dependent.cwPauseAudioFile:elink.
+.br
+:link reftype=hd res=1050 dependent.cwPlayAudioFile:elink.
+.br
+:link reftype=hd res=1060 dependent.cwQueryCurrentlyPlayingObject:elink.
+.br
+:link reftype=hd res=1090 dependent.cwSetStatusLineText:elink.
+.br
+:link reftype=hd res=1100 dependent.cwStopAudioFile:elink.
+.br
+:link reftype=hd res=1070 dependent.cwmmQueryTrackInfo:elink.
+.br
+:link reftype=hd res=1080 dependent.cwmmQueryImageInfo:elink.
+
+
+.im de\newmethods_de.inc
+
+
+
+
+
+
+
+
+
+
+
+
+
Index: /tags/CWMM-0.3.0_GA/mediafolder/prog_tutorial/es/hiddenfeatures_es.inc
===================================================================
--- /tags/CWMM-0.3.0_GA/mediafolder/prog_tutorial/es/hiddenfeatures_es.inc	(revision 213)
+++ /tags/CWMM-0.3.0_GA/mediafolder/prog_tutorial/es/hiddenfeatures_es.inc	(revision 213)
@@ -0,0 +1,386 @@
+:h2 res=410
+x=50% width=50%
+group=2
+.Sustituir el reproductor de audio
+:p.El reproductor de audio por omisi¢n incluido con MMOS2 puede sustituirse
+a€adiendo la siguiente clave al archivo OS2.INI:
+
+:p.
+:hp2.CWMM&rarrow.audioplayer&rarrow.<v¡a de acceso al nuevo reproductor>:ehp2.
+
+:nt.No tiene que especificar la v¡a de acceso completa al programa si se
+encuentra en la variable PATH. ­La aplicaci¢n debe ser de tipo PM!:ent.
+
+:p.Incluso si no se especifica un programa nuevo en el archivo INI, las clases
+mejoran el comportamiento general del sistema al no iniciar el reproductor como
+parte del proceso del WPS. As¡, si el reproductor se bloquea o falla ya no
+arrastra al WPS.
+
+
+:h2 res=429
+x=50% width=50%
+group=2
+.Sustituir el reproductor MIDI
+:p.El reproductor de audio MIDI incluido con CWMM puede sustituirse a€adiendo
+la siguiente clave al archivo OS2.INI:
+
+:p.
+:hp2.CWMM&rarrow.midiplayer&rarrow.<v¡a de acceso al nuevo reproductor>:ehp2.
+
+:nt.No tiene que especificar la v¡a de acceso al programa si se encuentra en la
+variable PATH. ­La aplicaci¢n debe ser de tipo PM! El ab.exe de IBM falla con
+un error 5051 al intentar reproducir archivos MIDI. El reproductor interno por
+omisi¢n ya funciona. El £nico reproductor interno que s que funciona es
+FM2play.exe. Esto s¢lo sustituye la reproducci¢n de archivos MIDI, no la
+de otros formatos de audio.:ent.
+
+:p.Aunque no se especifique un programa nuevo en el archivo INI las clases ya
+mejoran el comportamiento por omisi¢n al no iniciar el reproductor como parte
+del proceso del WPS, as¡ que si el reproductor falla o se bloquea no arrastra
+al WPS.
+
+
+:h2 res=425
+x=50% width=50%
+group=2
+.Sustituir el conversor de audio
+:p.El conversor de audio por omisi¢n puede sustituirse a€adiendo la siguiente
+clave al archivo OS2.INI:
+
+:p.
+:hp2.CWMM&rarrow.audioconverter&rarrow.<v¡a de acceso al nuevo
+reproductor>:ehp2.
+
+:nt.No tiene que especificar la v¡a de acceso al programa si se encuentra en la
+variable PATH. ­La aplicaci¢n debe ser de tipo PM! El conversor interno no se
+inicia como parte del proceso del WPS. El conversor no se utiliza para los
+archivos MIDI.:ent.
+
+
+:h2 res=411
+x=50% width=50%
+group=2
+.Sustituir el editor de audio
+:p.El editor de audio por omisi¢n incluido con MMOS2 puede sustituirse
+a€adiendo la siguiente clave al archivo OS2.INI:
+
+:p.
+:hp2.CWMM&rarrow.audioeditor&rarrow.<v¡a de acceso al nuevo editor>:ehp2.
+
+:nt.No tiene que especificar la v¡a de acceso completa al programa si se
+encuentra en la variable PATH. ­La aplicaci¢n debe ser de tipo PM!:ent.
+
+:p.Incluso si no se especifica un programa nuevo en el archivo INI, las clases
+mejoran el comportamiento general del sistema al no iniciar el editor como
+parte del proceso del WPS. As¡ que si el editor se bloquea o falla ya no
+arrastra al WPS.
+
+
+:h2 res=412
+x=50% width=50%
+group=2
+.Sustituir el reproductor AVI
+:p.El reproductor AVI por omisi¢n incluido con MMOS2 puede sustituirse
+a€adiendo la siguiente clave al archivo OS2.INI:
+
+:p.
+:hp2.CWMM&rarrow.aviplayer&rarrow.<v¡a de acceso al nuevo reproductor>:ehp2.
+
+:nt.No tiene que especificar la v¡a de acceso completa al programa si se
+encuentra en la variable PATH. ­La aplicaci¢n debe ser de tipo PM!:ent.
+
+:p.Incluso si no se especifica un programa nuevo en el archivo INI, las clases
+mejoran el comportamiento general del sistema al no iniciar el reproductor como
+parte del proceso del WPS. As¡, si el reproductor se bloquea o falla ya no
+arrastra al WPS.
+
+
+:h2 res=413
+x=50% width=50%
+group=2
+.Sustituir el reproductor MPG
+:p.El reproductor MPG por omisi¢n incluido con MMOS2 puede sustituirse
+a€adiendo la siguiente clave al archivo OS2.INI:
+
+:p.
+:hp2.CWMM&rarrow.mpgplayer&rarrow.<v¡a de acceso al nuevo reproductor>:ehp2.
+
+:nt.No tiene que especificar la v¡a de acceso completa al programa si se
+encuentra en la variable PATH. ­La aplicaci¢n debe ser de tipo PM!:ent.
+
+:p.Incluso si no se especifica un programa nuevo en el archivo INI, las clases
+mejoran el comportamiento general del sistema al no iniciar el reproductor como
+parte del proceso del WPS. As¡, si el reproductor se bloquea o falla ya no
+arrastra al WPS.
+
+
+:h2 res=419
+x=50% width=50%
+group=2
+.Sustituir el reproductor MP3
+:p.El reproductor MP3 por omisi¢n puede sustituirse a€adiendo la siguiente
+clave al archivo OS2.INI:
+
+:p.
+:hp2.CWMM&rarrow.mp3player&rarrow.<v¡a de acceso al nuevo reproductor>:ehp2.
+
+:nt.No tiene que especificar la v¡a de acceso completa al programa si se
+encuentra en la variable PATH.:ent.
+
+:p.Incluso si no se especifica un programa nuevo en el archivo INI, las clases
+mejoran el comportamiento general del sistema al no iniciar el reproductor como
+parte del proceso del WPS. As¡, si el reproductor se bloquea o falla no
+arrastra al WPS.
+
+
+:h2 res=427
+x=50% width=50%
+group=2
+.A€adir reproductor de v¡deo moderno
+:p.Por omisi¢n las clases multimedia utilizar n ffplay.exe, smplayer o mplayer
+para reproducir los v¡deos de tipos no admitidos por MMOS2. Los buscan en el
+orden especificado y deben encontrarse en la variable PATH para que funcionen.
+El reproductor no se inicia como parte del proceso del WPS. Consulte
+:link reftype=hd res=428.Sin reproductor de v¡deo moderno:elink.
+si no desea utilizar esta funci¢n.
+
+:p.Este reproductor tambin se puede a€adir con la siguiente clave en OS2.INI:
+
+:p.
+:hp2.CWMM&rarrow.mvidplayer&rarrow.<v¡a de acceso al reproductor>:ehp2.
+
+:nt.No tiene que especificar la v¡a de acceso completa al programa si se
+encuentra en la variable PATH.:ent.
+
+
+:h2 res=428
+x=50% width=50%
+group=2
+.Sin reproductor de v¡deo moderno
+:p.El ajuste por omisi¢n es admitir el uso de un
+:link reftype=hd res=427.Reproductor de v¡deo moderno:elink.. Si no desea esta
+funci¢n puede inhabilitarla a€adiendo la siguiente clave a OS2.INI:
+
+:p.
+:hp2.CWMM->nomodvid->1:ehp2.
+
+:nt.Es necesario reiniciar el WPS para que el cambio surta efecto.:ent.
+
+
+:h2 res=422
+x=50% width=50%
+group=2
+.Sustituir el editor M3U
+:p.El editor M3U por omisi¢n puede sustituirse a€adiendo la siguiente clave al
+archivo OS2.INI:
+
+:p.
+:hp2.CWMM&rarrow.m3ueditor&rarrow.<v¡a de acceso al nuevo reproductor>:ehp2.
+
+:nt.No tiene que especificar la v¡a de acceso completa al programa si se
+encuentra en la variable PATH.:ent.
+
+
+:h2 res=423
+x=50% width=50%
+group=2
+.Sustituir el reproductor M3U
+
+El reproductor M3U por omisi¢n puede sustituirse a€adiendo la siguiente clave
+al archivo OS2.INI:
+
+:p.
+:hp2.CWMM&rarrow.m3uplayer&rarrow.<v¡a de acceso al nuevo reproductor>:ehp2.
+
+:nt.No tiene que especificar la v¡a de acceso completa al programa si se
+encuentra en la variable PATH.:ent.
+
+:p.El comportamiento por omisi¢n es crear una nueva carpeta de medios y
+rellenarla con las pistas especificadas en el archivo M3U. Utilizando esta
+opci¢n es posible utilizar otro reproductor M3U.
+
+
+:h2 res=414
+x=50% width=50%
+group=2
+.Sustituir el editor de im genes
+:p.El editor de im genes por omisi¢n incluido con MMOS2 puede sustituirse
+a€adiendo la siguiente clave al archivo OS2.INI:
+
+:p.
+:hp2.CWMM&rarrow.imageeditor&rarrow.<v¡a de acceso al nuevo editor>:ehp2.
+
+:nt.No tiene que especificar la v¡a de acceso completa al programa si se
+encuentra en la variable PATH. ­La aplicaci¢n debe ser de tipo PM!:ent.
+
+:p.Incluso si no se especifica un programa nuevo en el archivo INI, las clases
+mejoran el comportamiento general del sistema al no iniciar el editor como
+parte del proceso del WPS. As¡ que si el editor se bloquea o falla ya no
+arrastra al WPS.
+
+:h2 res=426
+x=50% width=50%
+group=2
+.Sustituir el conversor de im genes
+:p.El conversor de im genes por omisi¢n puede sustituirse a€adiendo la
+siguiente clave al archivo OS2.INI:
+
+:p.
+:hp2.CWMM&rarrow.imageeditor&rarrow.<v¡a de acceso al nuevo editor>:ehp2.
+
+:nt.No tiene que especificar la v¡a de acceso al programa si se encuentra en la
+variable PATH. ­La aplicaci¢n debe ser de tipo PM! El conversor no se inicia
+como parte del proceso del WPS.:ent.
+
+
+:h2 res=415
+x=50% width=50%
+group=2
+.Habilitar detalles en im genes en CD
+:p.La opci¢n por omisi¢n es no mostrar los detalles de las im genes en CD. El
+motivo es que con las unidades lentas recabar la informaci¢n es lent¡simo.
+Puede habilitar las nuevas funciones para im genes de las clases para los CDs
+a€adiendo la siguiente clave al archivo OS2.INI:
+
+:p.
+:hp2.CWMM&rarrow.useNewImgClsFeaturesOnCD&rarrow.1:ehp2.
+
+:nt.­Aseg£rese de respetar las may£sculas!:ent.
+
+:nt.Debe reiniciar el WPS para que esta opci¢n tenga efecto.:ent.
+
+
+:h2 res=416
+x=50% width=50%
+group=2
+.Inhabilitar mostrar tiempo en los t¡tulos de los iconos
+:p.Al reproducir los archivos de audio mediante una doble pulsaci¢n, el tiempo
+transcurrido se muestra en el t¡tulo del icono. Para inhabilitar esta nueva
+funci¢n, a€ada la siguiente clave al archivo OS2.INI:
+
+:p.
+:hp2.CWMM&rarrow.mmClsNoExtendedIconTitles&rarrow.1:ehp2.
+
+:nt.­Aseg£rese de respetar las may£sculas!:ent.
+
+:nt.Debe reiniciar el WPS para que esta opci¢n tenga efecto.:ent.
+
+
+:h2 res=417
+x=50% width=50%
+group=2
+.Inhabilitar el parpadeo del control de reproducci¢n durante la misma
+:p.Como indicaci¢n visual, los controles de reproducci¢n (reproducir, pausa)
+parpadean mientras se reproduce una pista. Para inhabilitar esta funci¢n a€ada
+la siguiente clave al archivo OS2.INI:
+
+:p.
+:hp2.CWMM&rarrow.bNoPlayCtrlBlinking&rarrow.1:ehp2.
+
+:nt.­Aseg£rese de respetar las may£sculas!:ent.
+
+:nt.Debe reiniciar el WPS para que esta opci¢n tenga efecto.:ent.
+
+
+:h2 res=418
+x=50% width=50%
+group=2
+.Evitar la creaci¢n de una sombra del modelo Reproductor de medios
+:p.Por facilidad de acceso, se crea en la carpeta Multimedia una sombra de la
+:hp1.Carpeta de medios:ehp1. de la carpeta :hp1.Modelos de multimedia:ehp1..
+Para inhabilitar esta funci¢n a€ada la siguiente clave al archivo OS2.INI:
+
+:p.
+:hp2.CWMM&rarrow.bNoMediaFolderTemplateShadow&rarrow.1:ehp2.
+
+:nt.­Aseg£rese de respetar las may£sculas!:ent.
+
+:nt.Puede mover la sombra creada a otro sitio. S¢lo se volver  a crear en la
+carpeta Multimedia si se elimina del sistema.:ent.
+
+
+:h2 res=420
+x=50% width=50%
+group=2
+.Inhabilitar examinar archivos de audio
+:p.Puede inhabilitar la exploraci¢n de los archivos de audio en ciertas
+unidades a€adiendo sus letras a esta entrada del archivo OS2.INI:
+
+:p.
+:hp2.CWMM&rarrow.mmClsDontCheckDrives&rarrow.<drive list>:ehp2.
+
+:nt.­Aseg£rese de respetar las may£sculas!:ent.
+
+:p.
+Esto puede resultar £til para recursos de red con malas conexiones y otras
+unidades lentas. Normalmente la informaci¢n recabada se almacena en los
+atributos extendidos de cada archivo de audio, as¡ que s¢lo se examinan una
+vez. Si un sistema de archivos en particular no soporta EAs puede elegir a€adir
+tambin esa unidad a la lista para avitar la exploraci¢n.
+
+:nt.
+Tenga en cuenta que el WPS no mostrar  informaci¢n de audio alguna para los
+archivos de audio en una unidad especificada en la lista.
+:ent.
+
+:nt.Debe reiniciar el WPS para que esta opci¢n tenga efecto.:ent.
+
+:p.
+Ejemplo:
+:xmp.
+CWMM&rarrow.mmClsDontCheckDrives&rarrow.abcghzy
+:exmp.
+
+:nt.Esta opci¢n resulta casi obsoleta porque el procedimiento E/S MMIOMP3
+incluido en el :hp2.MMAudio Pak 2:ehp2. (publicado el 30 de agosto de 2003) ya
+no examina los archivos MP3, sino que lee la cabecera Xing para los archivos
+codificados con compresi¢n variable (VBR).:ent.
+
+
+:h2 res=421
+x=50% width=50%
+group=2
+.Inhabilitar leer etiquetas ID3
+:p.Puede inhabilitar que se lean las etiquetas ID3 de los archivos de audio en
+ciertas unidades a€adiendo sus letras a esta entrada del archivo OS2.INI:
+
+:p.
+:hp2.CWMM&rarrow.mmClsDontReadID3OnDrives&rarrow.<drive list>:ehp2.
+
+:nt.­Aseg£rese de respetar las may£sculas!:ent.
+
+:p.Esto puede resultar £til para recursos de red con malas conexiones y otras
+unidades lentas.
+
+:nt.
+Tenga en cuenta que el WPS no mostrar  informaci¢n alguna de las etiquetas
+ID3 para los archivos MP3 de una unidad especificada en la lista.
+:ent.
+
+:nt.Debe reiniciar el WPS para que esta opci¢n tenga efecto.:ent.
+
+:p.
+Ejemplo:
+
+:xmp.
+CWMM&rarrow.mmClsDontReadID3OnDrives&rarrow.abcghzy
+:exmp.
+
+
+:h2 res=424
+x=50% width=50%
+group=2
+.Tiempo de visibilidad del mensaje
+:p.La ventana con el mensaje de confirmaci¢n para cerrar una carpeta de medios
+mientras se est  reproduciendo una pista se cierra autom ticamente a los 60
+segundos, y a continuaci¢n se cierra la carpeta. Esta espera puede cambiarse
+estableciendo la siguiente clave:
+
+:p.
+:hp2.CWMM->mfldrMBoxDisplayTime-><tiempo en milisegundos>:ehp2.
+
+:nt.­Aseg£rese de respetar las may£sculas!:ent.
+
+:nt.El tiempo m¡nimo permitido es 5000ms.:ent.
+
+.* last id 429
Index: /tags/CWMM-0.3.0_GA/mediafolder/prog_tutorial/es/mediafldrprog_es.ipf
===================================================================
--- /tags/CWMM-0.3.0_GA/mediafolder/prog_tutorial/es/mediafldrprog_es.ipf	(revision 213)
+++ /tags/CWMM-0.3.0_GA/mediafolder/prog_tutorial/es/mediafldrprog_es.ipf	(revision 213)
@@ -0,0 +1,600 @@
+:userdoc.
+
+:docprof.
+
+:title.Tutorial: programar las clases multimedia
+
+:h1 res=100.Introducci¢n
+:p.La Carpeta de medios ofrece dos interfaces para control y programaci¢n.
+Puede usar :link reftype=hd res=200.cadenas de configuraci¢n:elink. para las
+tareas b sicas como iniciar y detener la reproducci¢n o una
+:link reftype=hd res=300.interfaz REXX:elink. con acceso a los mtodos internos
+de las clases.
+
+:p.Para el uso de la interfaz REXX debe estar instalado
+
+:p.WPS-Wizard V0.2.0 (http&colon.//www.os2world.com/cdwriting)
+
+:p.o superior.
+
+:h1 res=200
+x=left y=bottom width=50%.Cadenas de configuraci¢n
+:p.Se da soporte a las siguientes cadenas de configuraci¢n adicionales en cada
+carpeta de medios:
+
+:ul.
+:li.:link reftype=hd res=210.MEDIAFLDRNEXT:elink.   Reproducir la siguiente
+pista de la carpeta
+:li.:link reftype=hd res=211.MEDIAFLDRPLAY:elink.   Iniciar la reproducci¢n
+:li.:link reftype=hd res=215.MEDIAFLDRPLAYFIRST:elink.   Iniciar la primera
+pista
+:li.:link reftype=hd res=212.MEDIAFLDRPREV:elink.   Ir a la pista anterior
+:li.:link reftype=hd res=216.MEDIAFLDRREPEAT:elink. Establecer repetici¢n
+:li.:link reftype=hd res=213.MEDIAFLDRSTOP:elink.   Detener la reproducci¢n
+:li.:link reftype=hd res=214.MEDIAFLDRVOLUME:elink. Establecer el volumen
+:eul.
+
+:p.Para que estas cadenas de configuraci¢n tengan efecto la carpeta debe
+encontrarse abierta.
+
+:p.Las clases multimedia de audio soportan las siguientes cadenas:
+
+:ul.
+:li.:link reftype=hd res=220.MMAUDIOTRACKNAME:elink.   Establecer el nombre
+de pista del archivo de audio.
+:li.:link reftype=hd res=221.MMAUDIOARTIST:elink.   Establecer el nombre del
+artista del archivo de audio.
+:li.:link reftype=hd res=222.MMAUDIOALBUM:elink.    Establecer el nombre del
+ lbum.
+:li.:link reftype=hd res=223.MMAUDIOCOMMENT:elink.  Establecer el comentario
+para el archivo de audio.
+:li.:link reftype=hd res=224.MMAUDIOYEAR:elink.     Establecer el a€o del
+archivo de audio.
+:li.:link reftype=hd res=225.MMAUDIOGENRE:elink.    Establecer el gnero del
+archivo de audio.
+:li.:link reftype=hd res=226.MMREFRESH:elink.       Releer la informaci¢n del
+archivo de audio.
+:li.:link reftype=hd res=227.MMAUDIOCOPYTAGTO:elink.    Copiar todas las
+etiquetas del archivo de audio.
+:eul.
+
+
+:h2 res=210
+x=50% width=50%
+group=2
+.MEDIAFLDRNEXT
+:p.Pasar a la siguiente pista durante la reproducci¢n. Si sta a£n no se hab¡a
+iniciado, se empezar  a reproducir la primera pista.
+
+:xmp.
+/* REXX - Este mandato pasa a la siguiente pista */
+
+rc=SysSetObjectData('x&colon.\ubicaci¢n_de_la_carpeta','MEDIAFLDRNEXT=1')
+:exmp.
+
+:h2 res=211
+x=50% width=50%
+group=2
+.MEDIAFLDRPLAY
+:p.Iniciar la reproducci¢n con la primera pista. Si hay seleccionadas pistas,
+se iniciar  la reproducci¢n con la primera pista seleccionada.
+
+:xmp.
+/* REXX - Este mandato inicia la reproducci¢n */
+
+rc=SysSetObjectData('x&colon.\ubicaci¢n_de_la_carpeta','MEDIAFLDRPLAY=1')
+:exmp.
+
+:h2 res=215
+x=50% width=50%
+group=2
+.MEDIAFLDRPLAYFIRST
+:p.Iniciar la reproducci¢n con la primera pista sin importar si hay
+seleccionada otra pista.
+
+:xmp.
+/* REXX - Este mandato inicia la reproducci¢n */
+
+rc=SysSetObjectData('x&colon.\ubicaci¢n_de_la_carpeta','MEDIAFLDRPLAYFIRST=1')
+:exmp.
+
+
+:h2 res=212
+x=50% width=50%
+group=2
+.MEDIAFLDRPREV
+:p.Pasar a la pista anterior durante la reproducci¢n.
+
+:xmp.
+/* REXX - Este mandato pasa a la pista anterior */
+
+rc=SysSetObjectData('x&colon.\ubicaci¢n_de_la_carpeta','MEDIAFLDRPREV=1')
+:exmp.
+
+:h2 res=216
+x=50% width=50%
+group=2
+.MEDIAFLDRREPEAT
+:p.Establecer el atributo de repetici¢n. Si se establece en 1 se repiten las
+pistas de la carpeta. Si se establece en 0 se inhabiita la repetici¢n.
+
+:xmp.
+/* REXX - Este mandato establece la repetici¢n */
+
+rc=SysSetObjectData('x&colon.\ubicaci¢n_de_la_carpeta','MEDIAFLDRREPEAT=1')
+:exmp.
+
+:h2 res=213
+x=50% width=50%
+group=2
+.MEDIAFLDRSTOP
+:p.Detener la reproducci¢n.
+
+:xmp.
+/* REXX - Este mandato detiene la reproducci¢n */
+
+rc=SysSetObjectData('x&colon.\ubicaci¢n_de_la_carpeta','MEDIAFLDRSTOP=1')
+:exmp.
+
+:h2 res=214
+x=50% width=50%
+group=2
+.MEDIAFLDRVOLUME
+:p.Cambiar el volumen, entre 0 y 100%.
+
+:xmp.
+/* REXX - Este mandato establece el volumen en el 35% */
+
+rc=SysSetObjectData('x&colon.\ubicaci¢n_de_la_carpeta','MEDIAFLDRVOLUME=35')
+:exmp.
+
+.********************************************
+
+:h2 res=220
+x=50% width=50%
+group=2
+.MMAUDIOTRACKNAME
+:p.Establecer el nombre de pista del archivo de audio. Esta informaci¢n se
+guarda en los atributos extendidos del archivo. Para los archivos MP3 tambin
+se guarda en la etiqueta ID3.
+
+:xmp.
+/* REXX - Este mandato a€ade el nombre de la pista al archivo de audio */
+
+rc=SysSetObjectData('x&colon.\ubicaci¢n_de_la_carpeta\archivo_audio.ext','MMAUDIOTRACKNAME=El nombre de la pista')
+:exmp.
+
+:h2 res=221
+x=50% width=50%
+group=2
+.MMAUDIOARTIST
+:p.Establecer el nombre del artista del archivo de audio. Esta informaci¢n se
+guarda en los atributos extendidos del archivo. Para los archivos MP3 tambin
+se guarda en la etiqueta ID3.
+
+:xmp.
+/* REXX - Este mandato a€ade el nombre del artista al archivo de audio */
+
+rc=SysSetObjectData('x&colon.\ubicaci¢n_de_la_carpeta\archivo_audio.ext','MMAUDIOARTIST=Nombre del artista')
+:exmp.
+
+:h2 res=222
+x=50% width=50%
+group=2
+.MMAUDIOALBUM
+:p.Establecer el nombre del  lbum del archivo de audio. Esta informaci¢n se
+guarda en los atributos extendidos del archivo. Para los archivos MP3 tambin
+se guarda en la etiqueta ID3.
+
+:xmp.
+/* REXX - Este mandato a€ade el nombre del  lbum al archivo de audio */
+
+rc=SysSetObjectData('x&colon.\ubicaci¢n_de_la_carpeta\archivo_audio.ext','MMAUDIOALBUM=Nombre del  lbum')
+:exmp.
+
+:h2 res=223
+x=50% width=50%
+group=2
+.MMAUDIOCOMMENT
+:p.Establecer el comentario del archivo de audio. Esta informaci¢n se guarda en
+los atributos extendidos del archivo. Para los archivos MP3 tambin se guarda
+en la etiqueta ID3.
+
+:xmp.
+/* REXX - Este mandato a€ade un comentario al archivo de audio */
+
+rc=SysSetObjectData('x&colon.\ubicaci¢n_de_la_carpeta\archivo_audio.ext','MMAUDIOCOMMENT=Comentario de la pista')
+:exmp.
+
+:h2 res=224
+x=50% width=50%
+group=2
+.MMAUDIOYEAR
+:p.Establecer el a€o del archivo de audio. Esta informaci¢n se guarda en los
+atributos extendidos del archivo. Para los archivos MP3 tambin se guarda en la
+etiqueta ID3.
+
+:xmp.
+/* REXX - Este mandato a€ade el a€o al archivo de audio */
+
+rc=SysSetObjectData('x&colon.\ubicaci¢n_de_la_carpeta\archivo_audio.ext','MMAUDIOYEAR=2020')
+:exmp.
+
+:h2 res=225
+x=50% width=50%
+group=2
+.MMAUDIOGENRE
+:p.Establecer el gnero del archivo de audio. Esta informaci¢n se guarda en los
+atributos extendidos del archivo. Para los archivos MP3 tambin se guarda en la
+etiqueta ID3.
+
+:xmp.
+/* REXX - Este mandato a€ade el gnero al archivo de audio */
+
+rc=SysSetObjectData('x&colon.\ubicaci¢n_de_la_carpeta\archivo_audio.ext','MMAUDIOGENRE=Blues')
+:exmp.
+
+:h2 res=226
+x=50% width=50%
+group=2
+.MMREFRESH
+:p.Releer la informaci¢n de audio del archivo y actualizar los datos internos
+del objeto.
+
+:xmp.
+/* REXX - Este mandato relee la informaci¢n del archivo de audio */
+
+rc=SysSetObjectData('x&colon.\ubicaci¢n_de_la_carpeta\archivo_audio.ext','MMREFRESH=1')
+:exmp.
+
+:h2 res=227
+x=50% width=50%
+group=2
+.MMAUDIOCOPYTAGTO
+:p.Leer la informaci¢n de audio de la etiqueta del archivo y copiarla a otro.
+
+:xmp.
+/* REXX - Este mandato copia a otro archivo la informaci¢n de la etiqueta */
+
+rc=SysSetObjectData('x&colon.\ubicaci¢n_de_la_carpeta\archivo_audio.ext','MMAUDIOCOPYTAGTO=x&colon.\ubicaci¢n_de_la_carpeta\otro_archivo.ext')
+:exmp.
+
+
+.********************************************
+
+:h1 res=300.Interfaz REXX
+:p.Cuando se usa la interfaz REXX los programas tienen acceso a los mtodos de
+la clase de la Carpeta de medios. WPS-Wizard proporciona acceso a los mtodos
+m s importantes del WPS, funciones auxiliares y algunas funciones de las
+ventanas PM.
+
+:p.Los mtodos de la carpeta de medios se invocan desde una funci¢n envolvente.
+
+:table cols='20 35'.
+:row.
+:c.:link reftype=hd res=320.MFldrCallFunc:elink.
+:c.Llamar a uno de los mtodos introducidos por la carpeta de medios.
+:etable.
+
+:p.Los mtodos introducidos por las clases multimedia se invocan mediante la
+siguiente funci¢n.
+
+:table cols='20 35'.
+:row.
+:c.:link reftype=hd res=330.MMCallFunc:elink.
+:c.Llamar a uno de los mtodos introducidos por las clases multimedia (CWAudio,
+CWMP3, CWOGG).
+:etable.
+
+:p.El programa se ejecuta en el contexto del WPS, es decir, un programa PM en
+un hilo separado. Se puede utilizar otras DLLs para REXX que haya disponibles.
+El nombre del programa REXX no importa, pero como es habitual el archivo debe
+empezar con un comentario.
+
+.*************************************
+
+.***********************************************
+
+:h2 res=320
+width=30%
+.MFldrCallFunc
+:p.Use esta funci¢n para invocar uno de los nuevos mtodos de la carpeta de
+medios o un mtodo auxiliar.
+
+:link reftype=hd res=321 auto dependent group=2.
+
+:p.
+:link reftype=hd res=321 dependent.Sintaxis:elink.
+.*.br
+.*:link reftype=hd res=322.Par metros:elink.
+.br
+:link reftype=hd res=323 dependent.Devuelve:elink.
+.br
+:link reftype=hd res=324 dependent.Observaciones:elink.
+.*.br
+.*:link reftype=hd res=325.Uso:elink.
+.br
+:link reftype=hd res=326.Ejemplo:elink.
+
+:h2 res=321
+x=30%
+width=70%
+group=2
+hide
+.MFldrCallFunc - Sintaxis
+:xmp.
+/* Invocar un mtodo desde REXX */
+
+nombreMtodo   /* El nombre del mtodo */
+Objeto         /* El objeto sobre el que se invoca el mtodo */
+param1         /* Primer par metro del mtodo */
+param2         /* Segundo par metro del mtodo */
+
+:p.rc=MFldrCallFunc(nombreMtodo, Objeto,  param1, param2, ...);
+:exmp.
+
+
+:h2 res=322
+x=30%
+width=70%
+group=2
+hide
+.MFldrCallFunc - Par metros
+
+:h2 res=323
+x=30%
+width=70% height=35%
+group=3
+hide
+.MFldrCallFunc - Valor de retorno
+:p.El valor devuelto depende del mtodo que se invoque. Puede ser una cadena o
+un valor numrico. Consulte la descripci¢n del mtodo para m s informaci¢n.
+
+:p.Si no se encuentra el mtodo se devuelve la cadena
+:hp2.ERROR_METHOD&colon.:ehp2..
+
+:h2 res=324
+x=30%
+width=70%
+group=2
+hide
+.MFldrCallFunc - Observaciones
+:p.El mtodo que se invoque debe ser miembro del objeto :hp2.Objeto:ehp2.. Se
+produce un error si el objeto no soporta el mtodo solicitado. Por ejemplo, un
+objeto CWMediaFolder no soporta los mismos mtodos que un objeto CWAudio.
+
+:h2 res=325
+x=30%
+width=70%
+group=2
+hide
+.MFldrCallFunc - Uso
+
+:h2 res=326
+x=30%
+width=70%
+group=2
+hide
+.MFldrCallFunc - Ejemplo
+:xmp.
+/* Este ejemplo descubre el primer objeto de una carpeta */
+/* CWMediaFolder, se hace con el archivo asociado y lee  */
+/* el nombre del artista de la etiqueta ID3.  */
+
+/* Obtener el primer objeto de la carpeta laCarpeta */
+elObjeto=MFldrCallWPSFunc("wpQueryContent", laCarpeta, 0, QC_FIRST)
+
+/* Obtener el archivo del sistema de archivos asociado
+   desde la sombra.
+   cwGetFileSystemObject es miembro de la
+   clase CWMediaFolder. */
+
+elArchivo=MFldrCallFunc("cwGetFileSystemObject", laCarpeta, elObjeto)
+
+/* Obtener el nombre del artista. cwmmQueryTrackInfo es miembro
+   de la clase CWAudio. Normalmente cada objeto en un
+   CWMediaFolder es una sombra de un objeto instancia de una
+   subclase de CWAudio */
+
+elNombre=MFldrCallFunc("cwmmQueryTrackInfo", elArchivo, 2)
+
+/* Mostrar el nombre */
+rc=RxMessageBox("Nombre del artista: "||elNombre)
+:exmp.
+
+.*********************************************
+.***********************************************
+
+:h2 res=330
+width=30%
+.MMCallFunc
+:p.Use esta funci¢n para llamar uno de los nuevos mtodos de las nuevas clases
+multimedia introducidas con :hp2.CWAudio/MMAudio:ehp2..
+
+:link reftype=hd res=331 auto dependent group=2.
+
+:p.
+:link reftype=hd res=331 dependent.Sintaxis:elink.
+.*.br
+.*:link reftype=hd res=332.Par metros:elink.
+.br
+:link reftype=hd res=333 dependent.Devuelve:elink.
+.br
+:link reftype=hd res=334 dependent.Observaciones:elink.
+.*.br
+.*:link reftype=hd res=335.Uso:elink.
+.br
+:link reftype=hd res=336.Ejemplo:elink.
+
+:h2 res=331
+x=30%
+width=70%
+group=2
+hide
+.MMCallFunc - Sintaxis
+:xmp.
+/* Invocar un mtodo desde REXX */
+
+nombreMtodo   /* El nombre del mtodo */
+Objeto         /* El objeto sobre el que se invoca el mtodo */
+param1         /* Primer par metro del mtodo */
+param2         /* Segundo par metro del mtodo */
+
+:p.rc=MMCallFunc(nombreMtodo, Objeto,  param1, param2, ...);
+:exmp.
+
+
+:h2 res=332
+x=30%
+width=70%
+group=2
+hide
+.MMCallFunc - Par metros
+
+
+:h2 res=333
+x=30%
+width=70% height=35%
+group=3
+hide
+.MMCallFunc - Valor de retorno
+:p.El valor devuelto depende del mtodo que se invoque. Puede ser una cadena o
+un valor numrico. Consulte la descripci¢n del mtodo para m s informaci¢n.
+
+:p.Si no se encuentra el mtodo se devuelve la cadena
+:hp2.ERROR_METHOD&colon.:ehp2..
+
+
+:h2 res=334
+x=30%
+width=70%
+group=2
+hide
+.MMCallFunc - Observaciones
+:p.El mtodo que se invoque debe ser miembro del objeto :hp2.Objeto:ehp2.. Se
+produce un error si el objeto no soporta el mtodo solicitado. Por ejemplo, un
+objeto CWMediaFolder no soporta los mtodos que un objeto CWAudio.
+
+:p.En versiones anteriores de las clases esta funci¢n ten¡a el nombre
+:hp2.MMClsCallFunc:ehp2.. A£n se le da soporte temporalmente.
+
+:h2 res=335
+x=30%
+width=70%
+group=2
+hide
+.MMCallFunc - Uso
+
+:h2 res=336
+x=30%
+width=70%
+group=2
+hide
+.MMCallFunc - Ejemplo
+:xmp.
+/* Este ejemplo descubre el primer objeto de una carpeta */
+/* CWMediaFolder, se hace con el archivo asociado y lee  */
+/* el nombre del artista de la etiqueta ID3.  */
+
+/* Obtener el primer objeto de la carpeta laCarpeta */
+elObjeto=WPSWizCallWPSFunc("wpQueryContent", laCarpeta, 0, QC_FIRST)
+
+/* Obtener el archivo del sistema de archivos asociado
+   desde la sombra.
+   cwGetFileSystemObject es miembro de la
+   clase CWMediaFolder. */
+
+elArchivo=MFldrCallFunc("cwGetFileSystemObject", laCarpeta, elObjeto)
+
+/* Obtener el nombre del artista. cwmmQueryTrackInfo es miembro
+   de la clase CWAudio. Normalmente cada objeto en un
+   CWMediaFolder es una sombra de un objeto instancia de una
+   subclase de CWAudio */
+
+elNombre=MMCallFunc("cwmmQueryTrackInfo", elArchivo, 2)
+
+/* Mostrar el nombre */
+rc=RxMessageBox("Nombre del artista: "||elNombre)
+:exmp.
+
+.im es\wpsmethods_es.inc
+
+:h1 res=400
+x=left y=bottom width=50%.Funciones ocultas
+:p.Las siguientes funciones de las clases multimedia CWMM se pueden habilitar
+estableciendo claves en el archivo :hp2.OS2.INI:ehp2.
+
+:ul.
+:li.:link reftype=hd res=410.Sustituir el reproductor de audio:elink.
+:li.:link reftype=hd res=429.Sustituir el reproductor MIDI:elink.
+:li.:link reftype=hd res=425.Sustituir el conversor de audio:elink.
+:li.:link reftype=hd res=411.Sustituir el editor de audio:elink.
+:li.:link reftype=hd res=412.Sustituir el reproductor AVI:elink.
+:li.:link reftype=hd res=413.Sustituir el reproductor MPG:elink.
+:li.:link reftype=hd res=419.Sustituir el reproductor MP3:elink.
+:li.:link reftype=hd res=427.A€adir un reproductor de v¡deo moderno:elink.
+:li.:link reftype=hd res=428.Sin reproductor de v¡deo moderno:elink.
+:li.:link reftype=hd res=414.Sustituir el editor de im genes:elink.
+:li.:link reftype=hd res=426.Sustituir el conversor de im genes:elink.
+:li.:link reftype=hd res=415.Habilitar detalles en im genes en CD:elink.
+:li.:link reftype=hd res=416.Inhabilitar mostrar tiempo en los t¡tulos de los
+iconos:elink.
+:li.:link reftype=hd res=417.Inhabilitar el parpadeo del control de
+reproducci¢n durante la misma:elink.
+:li.:link reftype=hd res=418.Inhabilitar la creaci¢n de una sombra del modelo
+Reproductor de medios:elink.
+:li.:link reftype=hd res=420.Inhabilitar examinar archivos de audio:elink.
+:li.:link reftype=hd res=421.Inhabilitar leer etiquetas ID3:elink.
+:li.:link reftype=hd res=422.Sustituir el editor M3U:elink.
+:li.:link reftype=hd res=423.Sustituir el reproductor M3U:elink.
+:eul.
+
+.im es\hiddenfeatures_es.inc
+
+:h1 res=500.Atributos extendidos
+:p.La informaci¢n sobre los archivos de audio se almacena en los atributos
+extendidos del archivo para su uso desde otros programas o REXX. Actualmente se
+definen los siguientes AEs:
+
+:table cols='20 35'.
+:row.
+:c.MMALBUM
+:c.El  lbum al que pertenece esta pista
+:row.
+:c.MMARTIST
+:c.Nombre del artista
+:row.
+:c.MMBPS
+:c.Bits de audio
+:row.
+:c.MMCHANNELS
+:c.N£mero de canales
+:row.
+:c.MMCOMMENT
+:c.El comentario para este archivo
+:row.
+:c.MMGENRE
+:c.El gnero de este archivo de audio
+:row.
+:c.MMNUMAUDIOBYTES
+:c.N£mero de bytes de audio en el archivo
+:row.
+:c.MMPLAYTIME
+:c.Duraci¢n en segundos
+:row.
+:c.MMPLAYTIMEMS
+:c.Duraci¢n en milisegundos
+:row.
+:c.MMSAMPLERATE
+:c.Frecuencia de muestreo
+:row.
+:c.MMTRACKNAME
+:c.Nombre de la pista
+:row.
+:c.MMYEAR
+:c.A€o
+:etable.
+
+:nt.La informaci¢n se almacena en formato ASCII.:ent.
+
+:euserdoc.
Index: /tags/CWMM-0.3.0_GA/mediafolder/prog_tutorial/es/newmethods_es.inc
===================================================================
--- /tags/CWMM-0.3.0_GA/mediafolder/prog_tutorial/es/newmethods_es.inc	(revision 213)
+++ /tags/CWMM-0.3.0_GA/mediafolder/prog_tutorial/es/newmethods_es.inc	(revision 213)
@@ -0,0 +1,539 @@
+.******************************************************
+
+:h2 res=1010
+width=30%
+.cwGetFileSystemObject
+:link reftype=hd res=1011
+auto dependent group=2.
+:p.
+:link reftype=hd res=1011.Sintaxis:elink.
+.br
+:link reftype=hd res=1013 dependent.Devuelve:elink.
+.br
+:link reftype=hd res=1014 dependent.Observaciones:elink.
+.*.br
+.*:link reftype=hd res=315.Uso:elink.
+.*.br
+.*:link reftype=hd res=416 dependent.Ejemplo:elink.
+
+:h2 res=1011
+x=30%
+width=70%
+hide
+group=2
+.cwGetFileSystemObject - Sintaxis
+
+:xmp.
+/* Obtener el objeto del sistema de archivos al que apunta la sombra */
+
+carpetaDeMedios   /* Puntero a una carpeta de medios */
+laSombra          /* Un objeto sombra */
+
+:p.
+fsObj=MFldrCallFunc("cwGetFileSystemObject", 
+                       carpetaDeMedios, laSombra);
+:exmp.
+
+
+:h2 res=1013
+x=30%
+width=70% height=35%
+group=3
+hide
+.cwGetFileSystemObject - Valor de retorno
+
+:hp2.objSA:ehp2. numrico
+
+:p.El valor devuelto es un puntero al objeto del sistema de archivos al que
+apunta la sombra :hp2.laSombra:ehp2.. Si se ha roto el v¡nculo se devuelve 0.
+
+
+:h2 res=1014
+x=30%
+width=70%
+hide
+group=2
+.cwGetFileSystemObject - Observaciones
+
+Este mtodo es miembro de la carpeta de medios, por tanto hay que proporcionar
+un objeto que apunte a una carpeta de medios.
+
+:p.El mtodo fue introducido por la clase CWProgFolder, que es la clase padre
+de algunas otras nuevas clases de carpetas. Por tanto tambin se puede usar un
+puntero a cualquier otra subclase de CWProgFolder. A continuaci¢n se listan
+algunas de ellas.
+
+:ul.
+:li.CWAudioFolder
+:li.CWDataFolder
+:li.CWMediaFolder
+:eul.
+
+
+
+.******************************************************
+:h2 res=1040
+width=30%
+.cwPauseAudioFile
+:link reftype=hd res=1041
+auto dependent group=2.
+:p.
+:link reftype=hd res=1041.Sintaxis:elink.
+.br
+:link reftype=hd res=1043 dependent.Devuelve:elink.
+.br
+:link reftype=hd res=1044 dependent.Observaciones:elink.
+.*.br
+.*:link reftype=hd res=315.Uso:elink.
+.*.br
+.*:link reftype=hd res=416 dependent.Ejemplo:elink.
+
+:h2 res=1041
+x=30%
+width=70%
+hide
+group=2
+.cwPauseAudioFile - Sintaxis
+
+:xmp.
+/* Este mtodo pausa la reproducci¢n */
+
+carpetaDeMedios  /* Puntero a una carpeta de medios */
+punteroAlMarco   /* Puntero al marco de la carpeta  */
+
+:p.
+rc=MFldrCallFunc("cwPauseAudioFile", 
+                    carpetaDeMedios, punteroAlMarco);
+:exmp.
+
+
+:h2 res=1043
+x=30%
+width=70% height=35%
+group=3
+hide
+.cwPauseAudioFile - Valor de retorno
+
+:hp2.rc:ehp2. numrico
+
+
+:h2 res=1044
+x=30%
+width=70%
+hide
+group=2
+.cwPauseAudioFile - Observaciones
+
+El puntero al marco de la carpeta de medios se pasa al programa como par metro
+de inicio.
+
+.******************************************************
+:h2 res=1050
+width=30%
+.cwPlayAudioFile
+:link reftype=hd res=1051
+auto dependent group=2.
+:p.
+:link reftype=hd res=1051.Sintaxis:elink.
+.br
+:link reftype=hd res=1053 dependent.Devuelve:elink.
+.br
+:link reftype=hd res=1054 dependent.Observaciones:elink.
+.*.br
+.*:link reftype=hd res=315.Uso:elink.
+.*.br
+.*:link reftype=hd res=416 dependent.Ejemplo:elink.
+
+:h2 res=1051
+x=30%
+width=70%
+hide
+group=2
+.cwPlayAudioFile - Sintaxis
+
+:xmp.
+/* Este mtodo inicia la reproducci¢n del
+   contenido de la carpeta de medios */
+
+carpetaDeMedios  /* Puntero a una carpeta de medios */
+punteroAlMarco   /* Puntero al marco de la carpeta  */
+indica           /* Especifica qu pista iniciar */
+
+:p.
+rc=MFldrCallFunc("cwPlayAudioFile",
+                    carpetaDeMedios, punteroAlMarco, indica);
+:exmp.
+
+:h2 res=1053
+x=30%
+width=70% height=35%
+group=3
+hide
+.cwPlayAudioFile - Valor de retorno
+
+:hp2.rc:ehp2. numrico
+
+
+:h2 res=1054
+x=30%
+width=70%
+hide
+group=2
+.cwPlayAudioFile - Observaciones
+
+El puntero al marco de la carpeta de medios se pasa al programa como par metro
+de inicio. El par metro ®indica¯ puede tener uno de los siguientes valores:
+
+:ul.
+:li.PLAY_FIRST    1
+.br
+Inicia la primera pista de audio de la carpeta de medios. Si hay seleccionadas
+pistas, iniciar con la primera seleccionada.
+:li.PLAY_NEXT     2
+.br
+Reproducir la siguiente pista.
+:li.PLAY_PREV     3
+.br
+Reproducir la pista anterior.
+:eul.
+
+
+.******************************************************
+:h2 res=1060
+width=30%
+.cwQueryCurrentlyPlayingObject
+:link reftype=hd res=1061
+auto dependent group=2.
+:p.
+:link reftype=hd res=1061.Sintaxis:elink.
+.br
+:link reftype=hd res=1063 dependent.Devuelve:elink.
+.*.br
+.*:link reftype=hd res=1054 dependent.Observaciones:elink.
+.*.br
+.*:link reftype=hd res=315.Uso:elink.
+.*.br
+.*:link reftype=hd res=416 dependent.Ejemplo:elink.
+
+:h2 res=1061
+x=30%
+width=70%
+hide
+group=2
+.cwQueryCurrentlyPlayingObject - Sintaxis
+
+:xmp.
+/* Este mtodo solicita el puntero al
+   objeto en reproducci¢n actual */
+
+carpetaDeMedios  /* Puntero a la carpeta de medios */
+
+:p.
+rc=MFldrCallFunc("cwQueryCurrentlyPlayingObject", 
+                  carpetaDeMedios);
+:exmp.
+
+:h2 res=1063
+x=30%
+width=70% height=35%
+group=3
+hide
+.cwQueryCurrentlyPlayingObject - Valor de retorno
+
+:hp2.rc:ehp2. numrico
+
+:p.Puntero de objeto al objeto que se est reproduciendo actualmente o 0 si no 
+hay ninguno.
+
+
+.******************************************************
+:h2 res=1090
+width=30%
+.cwSetStatusLineText
+:link reftype=hd res=1091
+auto dependent group=2.
+:p.
+:link reftype=hd res=1091.Sintaxis:elink.
+.br
+:link reftype=hd res=1093 dependent.Devuelve:elink.
+.br
+:link reftype=hd res=1094 dependent.Observaciones:elink.
+.*.br
+.*:link reftype=hd res=315.Uso:elink.
+.*.br
+.*:link reftype=hd res=416 dependent.Ejemplo:elink.
+
+:h2 res=1091
+x=30%
+width=70%
+hide
+group=2
+.cwSetStatusLineText - Sintaxis
+
+:xmp.
+/* Este mtodo establece el texto de la l¡nea
+   de estado de una carpeta de medios */
+
+carpetaDeMedios  /* Puntero a la carpeta de medios sobre la que se invoca */
+elTexto          /* El texto para la l¡nea de estado o 0 */
+
+:p.
+info=MFldrCallFunc("cwSetStatusLineText", 
+                    carpetaDeMedios, elTexto);
+:exmp.
+
+:h2 res=1093
+x=30%
+width=70% height=35%
+group=3
+hide
+.cwSetStatusLineText - Valor de retorno
+
+:hp2.info:ehp2. cadena
+
+
+:h2 res=1094
+x=30%
+width=70%
+hide
+group=2
+.cwSetStatusLineText - Observaciones
+
+Si el par metro de texto es 0 la carpeta muestra su l¡nea de texto de estado
+est ndar.
+
+
+.******************************************************
+:h2 res=1100
+width=30%
+.cwStopAudioFile
+:link reftype=hd res=1101
+auto dependent group=2.
+:p.
+:link reftype=hd res=1101.Sintaxis:elink.
+.br
+:link reftype=hd res=1103 dependent.Devuelve:elink.
+.br
+:link reftype=hd res=1104 dependent.Observaciones:elink.
+.*.br
+.*:link reftype=hd res=315.Uso:elink.
+.*.br
+.*:link reftype=hd res=416 dependent.Ejemplo:elink.
+
+:h2 res=1101
+x=30%
+width=70%
+hide
+group=2
+.cwStopAudioFile - Sintaxis
+:xmp.
+/* Este mtodo detiene la reproducci¢n */
+
+carpetaDeMedios  /* Puntero a la carpeta de medios */
+punteroAlMarco   /* Puntero al marco de la carpeta  */
+
+:p.
+rc=MFldrCallFunc("cwStopAudioFile", 
+                        carpetaDeMedios, punteroAlMarco);
+:exmp.
+
+
+:h2 res=1103
+x=30%
+width=70% height=35%
+group=3
+hide
+.cwStopAudioFile - Valor de retorno
+
+:hp2.rc:ehp2. numrico
+
+
+:h2 res=1104
+x=30%
+width=70%
+hide
+group=2
+.cwStopAudioFile - Observaciones
+
+El puntero al marco de la carpeta de medios se pasa al programa como par metro
+de inicio.
+
+
+.******************************************************
+:h2 res=1070
+width=30%
+.cwmmQueryTrackInfo
+:link reftype=hd res=1071
+auto dependent group=2.
+:p.
+:link reftype=hd res=1071.Sintaxis:elink.
+.br
+:link reftype=hd res=1073 dependent.Devuelve:elink.
+.br
+:link reftype=hd res=1074 dependent.Observaciones:elink.
+.*.br
+.*:link reftype=hd res=315.Uso:elink.
+.*.br
+.*:link reftype=hd res=416 dependent.Ejemplo:elink.
+
+:h2 res=1071
+x=30%
+width=70%
+hide
+group=2
+.cwmmQueryTrackInfo - Sintaxis
+:xmp.
+/* Este mtodo solicita informaci¢n sobre un
+   objeto de audio */
+
+objAudio  /* Puntero al objeto de audio sobre el que se invocar  el mtodo */
+indica    /* Indicador especificando qu se solicita */
+
+:p.
+info=MMClsCallFunc("cwmmQueryTrackInfo", 
+                  objAudio, indica);
+:exmp.
+
+:h2 res=1073
+x=30%
+width=70% height=35%
+group=3
+hide
+.cwmmQueryTrackInfo - Valor de retorno
+
+:hp2.info:ehp2. cadena
+
+:p.Se devuelve una cadena con la informaci¢n solicitada. Si la informaci¢n no
+est  disponible, se devuelve una cadena vac¡a.
+
+:p.Si se produce un error se devuelve :hp2.ERROR&colon.:ehp2..
+
+:h2 res=1074
+x=30%
+width=70%
+hide
+group=2
+.cwmmQueryTrackInfo - Observaciones
+
+El objeto debe ser una instancia de :hp2.CWAudio:ehp2. o una de sus subclases
+(:hp2.CWMP3:ehp2., :hp2.MMWAV:ehp2....). Este mtodo fue introducido por
+:hp2.CWAudio:ehp2.. Desde la v0.2.5 de las clases, los nombres de stas son
+:hp2.MMAudio:ehp2., :hp2.MMWAV:ehp2., etc. para ser compatibles con las
+clases de IBM incluidas con OS/2.
+
+:p.El par metro ®indica¯ puede tener uno de los siguientes valores.
+
+:ul.
+:li.IDINFO_NAME              1
+.br
+Nombre de la pista
+:li.IDINFO_ARTIST            2
+.br
+Nombre del artista.
+:li.IDINFO_ALBUM             3
+.br
+Nombre del  lbum.
+:li.IDINFO_YEAR              4
+.br
+A€o de la etiqueta ID3
+:li.IDINFO_COMMENT           5
+.br
+Comentario.
+:li.IDINFO_GENRE             6
+.br
+El gnero en forma de cadena.
+:li.IDINFO_PLAYTIME          7
+.br
+Duraci¢n en segundos (valor numrico).
+:li.IDINFO_BPS               8
+.br
+Bits de audio (valor numrico).
+:li.IDINFO_SAMPLERATE        9
+.br
+Frecuencia de muestreo en Hz (valor numrico).
+:li.IDINFO_CHANNELS          10
+.br
+N£mero de canales (valor numrico).
+:li.IDINFO_BITRATE           11
+.br
+Ratio de compresi¢n en KB por segundo (valor numrico). Este indicador s¢lo es
+v lido para las instancias de las clases MMMP3 y MMOGG; para las dem s no hay
+definido un valor de retorno. Nuevo con la v0.2.7.
+:eul.
+
+
+.******************************************************
+:h2 res=1080
+width=30%
+.cwmmQueryImageInfo
+:link reftype=hd res=1081
+auto dependent group=2.
+:p.
+:link reftype=hd res=1081.Sintaxis:elink.
+.br
+:link reftype=hd res=1082 dependent.Par metros:elink.
+.br
+:link reftype=hd res=1083 dependent.Devuelve:elink.
+.*.br
+.*:link reftype=hd res=1084 dependent.Observaciones:elink.
+.*.br
+.*:link reftype=hd res=315.Uso:elink.
+.*.br
+.*:link reftype=hd res=416 dependent.Ejemplo:elink.
+
+:h2 res=1081
+x=30%
+width=70%
+hide
+group=2
+.cwmmQueryImageInfo - Sintaxis
+:xmp.
+/* Este mtodo solicita informaci¢n sobre
+   un objeto imagen */
+
+objImagen  /* Puntero al objeto imagen sobre el que se invocar  el mtodo */
+indica     /* Indicador especificando qu se solicita */
+
+:p.
+info=MMCallFunc("cwmmQueryTrackInfo", 
+                  objImagen, indica);
+:exmp.
+
+:h2 res=1083
+x=30%
+width=70% height=35%
+group=3
+hide
+.cwmmQueryImageInfo - Valor de retorno
+
+:hp2.info:ehp2. cadena
+
+:p.Se devuelve una cadena con la informaci¢n solicitada. Si la informaci¢n no
+est  disponible, se devuelve una cadena vac¡a.
+
+:p.Si se produce un error se devuelve :hp2.ERROR&colon.:ehp2..
+
+:h2 res=1082
+x=30%
+width=70%
+hide
+group=2
+.cwmmQueryImageInfo - Par metros
+
+:parml tsize=10.
+:pt.:hp2.objImagen:ehp2. (numrico)
+:pd.Puntero de objeto del archivo de imagen.
+:pt.:hp2.indica:ehp2. (numrico)
+:pd.Determina la informaci¢n que se solicita.
+:parml tsize=3.
+:pt.IDINFO_WIDTH    0x0001
+:pd.La anchura de la imagen.
+:pt.IDINFO_HEIGHT   0x0002
+:pd.La altura de la imagen.
+:pt.IDINFO_BPP      0x0003  
+:pd.N£mero de bits por p¡xel.
+:pt.IDINFO_FORMAT   0x0004  
+:pd.Formato de la imagen.
+:eparml.
+:eparml.
+
Index: /tags/CWMM-0.3.0_GA/mediafolder/prog_tutorial/es/wpsmethods_es.inc
===================================================================
--- /tags/CWMM-0.3.0_GA/mediafolder/prog_tutorial/es/wpsmethods_es.inc	(revision 213)
+++ /tags/CWMM-0.3.0_GA/mediafolder/prog_tutorial/es/wpsmethods_es.inc	(revision 213)
@@ -0,0 +1,40 @@
+
+
+:h1 res=1000
+width=30%
+.Mtodos soportados
+:p.
+Actualmente se da soporte a los siguientes mtodos introducidos.
+:p.
+.br
+:link reftype=hd res=1010 dependent.cwGetFileSystemObject:elink.
+.br
+:link reftype=hd res=1040 dependent.cwPauseAudioFile:elink.
+.br
+:link reftype=hd res=1050 dependent.cwPlayAudioFile:elink.
+.br
+:link reftype=hd res=1060 dependent.cwQueryCurrentlyPlayingObject:elink.
+.br
+:link reftype=hd res=1090 dependent.cwSetStatusLineText:elink.
+.br
+:link reftype=hd res=1100 dependent.cwStopAudioFile:elink.
+.br
+:link reftype=hd res=1070 dependent.cwmmQueryTrackInfo:elink.
+.br
+:link reftype=hd res=1080 dependent.cwmmQueryImageInfo:elink.
+
+
+.im es\newmethods_es.inc
+
+
+
+
+
+
+
+
+
+
+
+
+
Index: /tags/CWMM-0.3.0_GA/mediafolder/prog_tutorial/fr/hiddenfeatures_fr.inc
===================================================================
--- /tags/CWMM-0.3.0_GA/mediafolder/prog_tutorial/fr/hiddenfeatures_fr.inc	(revision 213)
+++ /tags/CWMM-0.3.0_GA/mediafolder/prog_tutorial/fr/hiddenfeatures_fr.inc	(revision 213)
@@ -0,0 +1,333 @@
+.* ----------------------------------------------------------------------------
+.* Product...............: Hidden features
+.* Language..............: French
+.* Original file version.:
+.* French translation....: Guillaume Gay <guillaume[dot]gay[arobase]gmail[dot]com>
+.* Version...............: 2020-07-25
+
+.* ----------------------------------------------------------------------------
+.* res=410
+.* ----------------------------------------------------------------------------
+:h2 res=410
+x=50% width=50%
+group=2
+.Remplacement du lecteur audio
+:p.
+Le lecteur audio par dfaut de MMOS2 peut tre remplac en ajoutant la
+cl suivante dans OS2.INI &colon.
+:p.:hp2.CWMM->audioplayer-><chemin vers le nouveau lecteur>:ehp2.
+:note.vous n'avez pas besoin de fournir le chemin complet si le programme
+est dans l'un des rpertoires de la variable d'environnement PATH. Cela
+doit cependant tre un programme PM !
+:p.
+Mme si un nouveau programme ne figure pas dans le fichier INI, les
+classes amliorent le comportement par dfaut en ne lanant pas le
+lecteur comme processus du WPS. Ceci pour faire en sorte que si le
+lecteur plante, le WPS ne plante pas avec.
+:p.
+
+.* ----------------------------------------------------------------------------
+.* res=411
+.* ----------------------------------------------------------------------------
+:h2 res=411
+x=50% width=50%
+group=2
+.Remplacement de l'diteur audio
+:p.
+L'diteur audio par dfaut de MMOS2 peut tre remplac en ajoutant la
+cl suivante dans OS2.INI &colon.
+:p.
+:hp2.CWMM->audioeditor-><chemin vers le nouvel diteur>:ehp2.
+:note.vous n'avez pas besoin de fournir le chemin complet si le programme
+est dans l'un des rpertoires de la variable d'environnement PATH. Cela
+doit cependant tre un programme PM !
+:p.
+Mme si un nouveau programme ne figure pas dans le fichier INI, les
+classes amliorent le comportement par dfaut en ne lanant pas
+l'diteur comme processus du WPS. Ceci pour faire en sorte que si le
+lecteur plante, le WPS ne plante pas avec.
+:p.
+
+.* ----------------------------------------------------------------------------
+.* res=412
+.* ----------------------------------------------------------------------------
+:h2 res=412
+x=50% width=50%
+group=2
+.Remplacement du lecteur AVI
+:p.
+Le lecteur de video AVI par dfaut de MMOS2 peut tre remplac en
+ajoutant la cl suivante dans OS2.INI &colon.
+:p.
+:hp2.CWMM->aviplayer-><chemin vers le nouveau lecteur>:ehp2.
+:note.vous n'avez pas besoin de fournir le chemin complet si le programme
+est dans l'un des rpertoires de la variable d'environnement PATH. Cela
+doit cependant tre un programme PM !
+:p.
+Mme si un nouveau programme ne figure pas dans le fichier INI, les
+classes amliorent le comportement par dfaut en ne lanant pas le
+lecteur comme processus du WPS. Ceci pour faire en sorte que si le
+lecteur plante, le WPS ne plante pas avec.
+:p.
+
+.* ----------------------------------------------------------------------------
+.* res=413
+.* ----------------------------------------------------------------------------
+:h2 res=413
+x=50% width=50%
+group=2
+.Remplacement du lecteur MPG
+:p.
+Le lecteur de video MPG par dfaut de MMOS2 peut tre remplac en
+ajoutant la cl suivante dans OS2.INI &colon.
+:p.
+:hp2.CWMM->mpgplayer-><chemin vers le nouveau lecteur>:ehp2.
+:note.vous n'avez pas besoin de fournir le chemin complet si le programme
+est dans l'un des rpertoires de la variable d'environnement PATH. Cela
+doit cependant tre un programme PM !
+:p.
+Mme si un nouveau programme ne figure pas dans le fichier INI, les
+classes amliorent le comportement par dfaut en ne lanant pas le
+lecteur comme processus du WPS. Ceci pour faire en sorte que si le
+lecteur plante, le WPS ne plante pas avec.
+:p.
+
+.* ----------------------------------------------------------------------------
+.* res=419
+.* ----------------------------------------------------------------------------
+:h2 res=419
+x=50% width=50%
+group=2
+.Remplacement du lecteur MP3
+:p.
+Le lecteur MP3 par dfaut peut tre remplac en ajoutant la cl
+suivante dans OS2.INI &colon.
+:p.
+:hp2.CWMM->mp3player-><chemin vers le nouveau lecteur>:ehp2.
+:note.vous n'avez pas besoin de fournir le chemin complet si le programme
+est dans l'un des rpertoires de la variable d'environnement PATH.
+:p.
+Mme si un nouveau programme ne figure pas dans le fichier INI, les
+classes amliorent le comportement par dfaut en ne lanant pas le
+lecteur comme processus du WPS. Ceci pour faire en sorte que si le
+lecteur plante, le WPS ne plante pas avec.
+
+.* ----------------------------------------------------------------------------
+.* res=422
+.* ----------------------------------------------------------------------------
+:h2 res=422
+x=50% width=50%
+group=2
+.Remplacement de l'diteur de liste M3U
+:p.
+L'diteur M3U par dfaut peut tre remplac en ajoutant la cl suivante
+dans OS2.INI &colon.
+:p.
+:hp2.CWMM->m3ueditor-><chemin vers le nouvel diteur>:ehp2.
+:note.vous n'avez pas besoin de fournir le chemin complet si le programme
+est dans l'un des rpertoires de la variable d'environnement PATH.
+:p.
+
+.* ----------------------------------------------------------------------------
+.* res=423
+.* ----------------------------------------------------------------------------
+:h2 res=423
+x=50% width=50%
+group=2
+.Remplacement du lecteur M3U
+:p.
+Le lecteur M3U par dfaut peut tre remplac en ajoutant la cl suivante
+dans OS2.INI &colon.
+:p.
+:hp2.CWMM->m3uplayer-><chemin vers le nouveau lecteur>:ehp2.
+:note.vous n'avez pas besoin de fournir le chemin complet si le programme
+est dans l'un des rpertoires de la variable d'environnement PATH.
+:p.
+Le comportement par dfaut est de crer un nouveau dossier "Media Folder"
+et de le remplir des pistes contenues dans le fichier M3U. En utilisant
+ce paramtre, il est possible d'utiliser un autre lecteur MP3.
+:p.
+
+.* ----------------------------------------------------------------------------
+.* res=414
+.* ----------------------------------------------------------------------------
+:h2 res=414
+x=50% width=50%
+group=2
+.Remplacement de l'diteur d'images
+:p.
+L'diteur d'images par dfaut de MMOS2 peut tre remplac en ajoutant la
+cl suivante dans OS2.INI &colon.
+:p.
+:hp2.CWMM->imageeditor-><chemin vers le nouvel diteur>:ehp2.
+:note.vous n'avez pas besoin de fournir le chemin complet si le programme
+est dans l'un des rpertoires de la variable d'environnement PATH. Cela
+doit cependant tre un programme PM !
+:p.
+Mme si un nouveau programme ne figure pas dans le fichier INI, les
+classes amliorent le comportement par dfaut en ne lanant pas
+l'diteur comme processus du WPS. Ceci pour faire en sorte que si le
+lecteur plante, le WPS ne plante pas avec.
+:p.
+
+.* ----------------------------------------------------------------------------
+.* res=415
+.* ----------------------------------------------------------------------------
+:h2 res=415
+x=50% width=50%
+group=2
+.Activation des dtails pour les images sur CD
+:p.
+La valeur par dfaut est de ne pas prendre en charge les dtails pour
+les images sur CD. La raison est qu'avec les lecteurs lents, le
+rassemblement des informations requiert normment de temps. Vous pouvez
+activer cette fonctionnalit pour les images sur CD en ajoutant la cl
+suivante dans OS2.INI &colon.
+:p.
+:hp2.CWMM->useNewImgClsFeaturesOnCD->1:ehp2.
+:nt text='Remarques &colon.'.assurez-vous de bien respecter la casse
+(minuscule/MAJUSCULE) des caractres !
+:p.Vous devrez relancer le WPS pour que les modifications prennent
+effet.
+:ent.
+:p.
+
+.* ----------------------------------------------------------------------------
+.* res=416
+.* ----------------------------------------------------------------------------
+:h2 res=416
+x=50% width=50%
+group=2
+.Dsactivation de l'affichage de l'heure dans les titres d'icnes
+:p.
+En ouvrant des fichiers audio par double clic, le temps coul est
+affich dans le titre de l'icne.
+Pour dsactiver cette fonctionnalit, ajoutez la cl suivante dans
+OS2.INI &colon.
+:p.
+:hp2.CWMM->mmClsNoExtendedIconTitles->1:ehp2.
+:nt text='Remarques &colon.'.assurez-vous de bien respecter la casse
+(minuscule/MAJUSCULE) des caractres !
+:p.Vous devrez relancer le WPS pour que les modifications prennent
+effet.
+:ent.
+:p.
+
+.* ----------------------------------------------------------------------------
+.* res=417
+.* ----------------------------------------------------------------------------
+:h2 res=417
+x=50% width=50%
+group=2
+.Dsactivation du clignotement des boutons de contrle pendant la lecture
+:p.
+Comme retour visuel, les boutons de contrle (LECTURE, PAUSE) clignotent
+lorsqu'une piste est en cours de lecture.
+Pour dsactiver cette fonctionnalit, ajoutez la cl suivante dans
+OS2.INI &colon.
+:p.
+:hp2.CWMM->bNoPlayCtrlBlinking->1:ehp2.
+:nt text='Remarques &colon.'.assurez-vous de bien respecter la casse
+(minuscule/MAJUSCULE) des caractres !
+:p.Vous devrez relancer le WPS pour que les modifications prennent
+effet.
+:ent.
+;p.
+
+.* ----------------------------------------------------------------------------
+.* res=418
+.* ----------------------------------------------------------------------------
+:h2 res=418
+x=50% width=50%
+group=2
+.viter la cration d'un double du modle lecteur multimedia
+:p.
+Un double du modle lecteur multimedia du dossier "Modles
+multimedia" est automatiquement cr dans le dossier multimedia pour un
+accs plus ais. En crant la cl suivante, la fonctionnalit est
+dsactive.
+:p.
+:hp2.CWMM->bNoMediaFolderTemplateShadow->1:ehp2.
+:nt text='Remarques &colon.'.assurez-vous de bien respecter la casse
+(minuscule/MAJUSCULE) des caractres !
+:p.Vous pouvez dplacer le double cr 
+ un autre endroit. Il ne sera
+recr dans le dossier Multimdia que s'il est supprim du systme.
+:ent.
+:p.
+
+.* ----------------------------------------------------------------------------
+.* res=420
+.* ----------------------------------------------------------------------------
+:h2 res=420
+x=50% width=50%
+group=2
+.Dsactivation de la vrification automatique des fichiers audio
+:p.
+Vous pouvez dsactiver la vrification des fichiers audio pour
+certaines units de disque en ajoutant les lettres de ces units dans
+l'entre de OS2.INI suivante &colon.
+:p.
+:hp2.CWMM->mmClsDontCheckDrives-><liste d'units>:ehp2.
+:note.assurez-vous de bien respecter la casse (minuscule/MAJUSCULE) des
+caractres !
+:p.
+Cela peut s'avrer utile pour les disques rseaux avec des connexions
+lentes ou pour les units de disques lentes. Normalement, les
+informations rcupres sont stockes dans les attributs tendus du
+fichier audio de manire 
+ ce que la vrification ne se fasse qu'une
+fois. Si un systme de fichiers particulier ne prenait pas en charge les
+attributs tendus, vous pouvez alors dcider d'ajouter sa lettre d'unit
+
+ la liste, pour viter l'analyse.
+:nt text='Remarques &colon.'.gardez 
+ l'esprit qu'aucune information
+audio ne sera affiche par le WPS pour les objets audio situs sur une
+unit de disque figurant dans la liste.
+:p.Vous devrez relancer le WPS pour que les modifications prennent
+effet.
+:ent.
+:p.
+Exemple:
+:xmp.
+CWMM->mmClsDontCheckDrives->abcghzy
+:exmp.
+:note.Ce paramtre est quasiment obsolte 
+ prsent parceque la procdure
+d'Entre/Sortie MMIOMP3 contenue dans :hp2.MMAudio Pak 2:ehp2. (sorti le
+le 30/08/2003) n'analyse plus les fichiers MP3 mais lit l'entte Xing des
+fichiers encods en VBR.
+:p.
+
+.* ----------------------------------------------------------------------------
+.* res=421
+.* ----------------------------------------------------------------------------
+:h2 res=421
+x=50% width=50%
+group=2
+.Dsactivation de la lecture des balises ID3
+:p.
+Vous pouvez dsactiver la lecture des balises ID3 pour
+certaines units de disque en ajoutant les lettres de ces units dans
+l'entre de OS2.INI suivante &colon.
+:p.
+:hp2.CWMM->mmClsDontReadID3OnDrives-><liste d'units>:ehp2.
+:note.assurez-vous de bien respecter la casse (minuscule/MAJUSCULE) des
+caractres !
+:p.
+Cela peut s'avrer utile pour les disques rseaux avec des connexions
+lentes ou pour les units de disques lentes.
+:nt text='Remarques &colon.'.gardez 
+ l'esprit qu'aucune information
+ID3 ne sera affiche par le WPS pour les fichiers MP3 audio situs sur
+une des units de disque figurant dans la liste.
+:p.Vous devrez relancer le WPS pour que les modifications prennent
+effet.
+:ent.
+:p.
+Exemple:
+:xmp.
+CWMM->mmClsDontReadID3OnDrives->abcghzy
+:exmp.
+:p.
Index: /tags/CWMM-0.3.0_GA/mediafolder/prog_tutorial/fr/mediafldrprog_fr.ipf
===================================================================
--- /tags/CWMM-0.3.0_GA/mediafolder/prog_tutorial/fr/mediafldrprog_fr.ipf	(revision 213)
+++ /tags/CWMM-0.3.0_GA/mediafolder/prog_tutorial/fr/mediafldrprog_fr.ipf	(revision 213)
@@ -0,0 +1,727 @@
+:userdoc.
+:docprof.
+:title.Classes Multimdia - Tutoriel de programmation
+.* ----------------------------------------------------------------------------
+.* Product...............: Programming tutorial for Multimedia classes
+.* Language..............: French
+.* Original file version.:
+.* French translation....: Guillaume Gay <guillaume[dot]gay[arobase]gmail[dot]com>
+.* Version...............: 2020-07-26
+
+.* ----------------------------------------------------------------------------
+.* res=100
+.* ----------------------------------------------------------------------------
+:h1 res=100.Introduction
+:p.
+Le dossier multimdia offre deux interfaces pour le contrle et la
+programmation. Vous pouvez utiliser les
+:link reftype=hd res=200.chanes de paramtres:elink. pour les tches de
+base comme lancer ou arrter la lecture, ou
+l':link reftype=hd res=300.interface REXX:elink. avec accs aux mthodes
+des classes internes.
+:p.
+Pour l'utilisation de l'interface REXX &colon.
+WPS-Wizard V0.2.0 (http&colon.//www.os2world.com/cdwriting)
+ou suprieure doit tre installe.
+:p.
+.* ----------------------------------------------------------------------------
+.* res=200
+.* ----------------------------------------------------------------------------
+:h1 res=200
+x=left y=bottom width=50%.Chanes de paramtres
+:p.
+Les chanes de paramtres supplmentaires suivantes sont prises en charge
+par tout dossier multimedia &colon.
+:ul.
+:li.:link reftype=hd res=210.MEDIAFLDRNEXT:elink.  Lecture du morceau suivant dans le dossier.
+:li.:link reftype=hd res=211.MEDIAFLDRPLAY:elink.  Lancement de la lecture.
+:li.:link reftype=hd res=215.MEDIAFLDRPLAYFIRST:elink.  Lancement de la premire piste.
+:li.:link reftype=hd res=212.MEDIAFLDRPREV:elink.  Passage 
+ la piste prcdente.
+:li.:link reftype=hd res=216.MEDIAFLDRREPEAT:elink.  Dfinition du mode rptition.
+:li.:link reftype=hd res=213.MEDIAFLDRSTOP:elink.  Arrt de la lecture.
+:li.:link reftype=hd res=214.MEDIAFLDRVOLUME:elink.  Dfinition du volume.
+:eul.
+:p.
+Le dossier doit tre ouvert pour que ces chanes de paramtres puissent
+fonctionner.
+:p.
+Les classes MM audio prennent en charge les chanes de paramtres
+suivantes &colon.
+:ul.
+:li.:link reftype=hd res=220.MMAUDIOTRACKNAME:elink.  Dfinition du nom de morceau du fichier audio.
+:li.:link reftype=hd res=221.MMAUDIOARTIST:elink.  Dfinition du nom de l'artiste du fichier audio.
+:li.:link reftype=hd res=222.MMAUDIOALBUM:elink.  Dfinition du nom de l'album.
+:li.:link reftype=hd res=223.MMAUDIOCOMMENT:elink.  Dfinition du commentaire sur le fichier audio.
+:li.:link reftype=hd res=224.MMAUDIOYEAR:elink.  Dfinition de l'anne du fichier audio.
+:li.:link reftype=hd res=225.MMAUDIOGENRE:elink.  Dfinition du genre du fichier audio.
+:li.:link reftype=hd res=226.MMREFRESH:elink.  Relecture des informations du fichier audio.
+:li.:link reftype=hd res=227.MMAUDIOCOPYTAGTO:elink.  Copie de toutes les balises d'un fichier audio vers un autre.
+:eul.
+:p.
+
+.* ----------------------------------------------------------------------------
+.* res=210
+.* ----------------------------------------------------------------------------
+:h2 res=210
+x=50% width=50%
+group=2
+.MEDIAFLDRNEXT
+:p.
+Passage au morceau suivant en cours de lecture. S'il n'y a aucune lecture
+en cours, la premire piste sera lance.
+:xmp.
+/* REXX - Cette commande passe au morceau suivant */
+
+rc=SysSetObjectData('x&colon.\chemin_vers_le_dossier','MEDIAFLDRNEXT=1')
+:exmp.
+:p.
+
+.* ----------------------------------------------------------------------------
+.* res=211
+.* ----------------------------------------------------------------------------
+:h2 res=211
+x=50% width=50%
+group=2
+.MEDIAFLDRPLAY
+:p.
+Lancement de la lecture de la premire piste. Si un des morceaux est
+slectionn, la lecture dbutera avec la premire piste slectionne.
+:xmp.
+/* REXX - Cette commande lance la lecture */
+
+rc=SysSetObjectData('x&colon.\chemin_vers_le_dossier','MEDIAFLDRPLAY=1')
+:exmp.
+:p.
+
+.* ----------------------------------------------------------------------------
+.* res=215
+.* ----------------------------------------------------------------------------
+:h2 res=215
+x=50% width=50%
+group=2
+.MEDIAFLDRPLAYFIRST
+:p.
+Lancement de la lecture de la premire piste, quelle que soit celle
+slectionne.
+:xmp.
+/* REXX - Cette commande lance la lecture du premier morceau */
+
+rc=SysSetObjectData('x&colon.\chemin_vers_le_dossier','MEDIAFLDRPLAYFIRST=1')
+:exmp.
+:p.
+
+.* ----------------------------------------------------------------------------
+.* res=212
+.* ----------------------------------------------------------------------------
+:h2 res=212
+x=50% width=50%
+group=2
+.MEDIAFLDRPREV
+:p.
+Passe au morceau prcdent en cours de lecture.
+:xmp.
+/* REXX - Cette commande passe au morceau prcdent */
+
+rc=SysSetObjectData('x&colon.\chemin_vers_le_dossier','MEDIAFLDRPREV=1')
+:exmp.
+:p.
+
+.* ----------------------------------------------------------------------------
+.* res=216
+.* ----------------------------------------------------------------------------
+:h2 res=216
+x=50% width=50%
+group=2
+.MEDIAFLDRREPEAT
+:p.
+Dfinition de l'attribut rptition. S'il est paramtr 
+ 1, les
+pistes du dossier seront rpts. S'il est paramtr 
+ 0, la rptition
+est dsactive.
+:xmp.
+/* REXX - Cette commande active la rptition */
+
+rc=SysSetObjectData('x&colon.\chemin_vers_le_dossier','MEDIAFLDRREPEAT=1')
+:exmp.
+:p.
+
+.* ----------------------------------------------------------------------------
+.* res=213
+.* ----------------------------------------------------------------------------
+:h2 res=213
+x=50% width=50%
+group=2
+.MEDIAFLDRSTOP
+:p.
+Arrt de la lecture.
+:xmp.
+/* REXX - Cette commande interrompt la lecture */
+
+rc=SysSetObjectData('x&colon.\chemin_vers_le_dossier','MEDIAFLDRSTOP=1')
+:exmp.
+:p.
+
+.* ----------------------------------------------------------------------------
+.* res=214
+.* ----------------------------------------------------------------------------
+:h2 res=214
+x=50% width=50%
+group=2
+.MEDIAFLDRVOLUME
+:p.
+Modification du volume sonore entre 0 et 100%.
+:xmp.
+/* REXX - Cette commande paramtre le volume 
+ 35% */
+
+rc=SysSetObjectData('x&colon.\chemin_vers_le_dossier','MEDIAFLDRVOLUME=35')
+:exmp.
+:p.
+
+.* ----------------------------------------------------------------------------
+.* res=220
+.* ----------------------------------------------------------------------------
+:h2 res=220
+x=50% width=50%
+group=2
+.MMAUDIOTRACKNAME
+:p.
+Dfinition du nom de la piste du fichier audio.
+Cette information est enregistre dans les attributs tendus du fichier.
+Pour les fichiers MP3 cette information est aussi enregistre dans la
+balise ID3 correspondante.
+:xmp.
+/* REXX - Cette commande ajoute le nom du morceau au fichier audio */
+
+rc=SysSetObjectData('x&colon.\chemin_vers_le_dossier\fichier_audio.ext','MMAUDIOTRACKNAME=Nom du morceau')
+:exmp.
+:p.
+
+.* ----------------------------------------------------------------------------
+.* res=221
+.* ----------------------------------------------------------------------------
+:h2 res=221
+x=50% width=50%
+group=2
+.MMAUDIOARTIST
+:p.
+Dfinition du nom de l'artiste de ce fichier audio.
+Cette information est enregistre dans les attributs tendus du fichier.
+Pour les fichiers MP3 cette information est aussi enregistre dans la
+balise ID3 correspondante.
+:xmp.
+/* REXX - Cette commande ajoute le nom de l'artiste au fichier audio  */
+
+rc=SysSetObjectData('x&colon.\chemin_vers_le_dossier\fichier_audio.ext','MMAUDIOARTIST=Artist name')
+:exmp.
+:p.
+
+.* ----------------------------------------------------------------------------
+.* res=222
+.* ----------------------------------------------------------------------------
+:h2 res=222
+x=50% width=50%
+group=2
+.MMAUDIOALBUM
+:p.
+Dfinition du nom de l'album du fichier audio.
+Cette information est enregistre dans les attributs tendus du fichier.
+Pour les fichiers MP3 cette information est aussi enregistre dans la
+balise ID3 correspondante.
+:xmp.
+/* REXX - Cette commande ajoute le nom de l'album au fichier */
+
+rc=SysSetObjectData('x&colon.\chemin_vers_le_dossier\fichier_audio.ext',"MMAUDIOALBUM=Nom de l'Album")
+:exmp.
+:p.
+
+.* ----------------------------------------------------------------------------
+.* res=223
+.* ----------------------------------------------------------------------------
+:h2 res=223
+x=50% width=50%
+group=2
+.MMAUDIOCOMMENT
+:p.
+Dfinition du commentaire pour le fichier audio.
+Cette information est enregistre dans les attributs tendus du fichier.
+Pour les fichiers MP3 cette information est aussi enregistre dans la
+balise ID3 correspondante.
+:xmp.
+/* REXX - Cette commande ajoute un commentaire au fichier audio */
+
+rc=SysSetObjectData('x&colon.\chemin_vers_le_dossier\fichier_audio.ext','MMAUDIOCOMMENT=Commentaire sur la piste')
+:exmp.
+:p.
+
+.* ----------------------------------------------------------------------------
+.* res=224
+.* ----------------------------------------------------------------------------
+:h2 res=224
+x=50% width=50%
+group=2
+.MMAUDIOYEAR
+:p.
+Dfinition de l'anne du fichier audio.
+Cette information est enregistre dans les attributs tendus du fichier.
+Pour les fichiers MP3 cette information est aussi enregistre dans la
+balise ID3 correspondante.
+:xmp.
+/* REXX - Cette commande ajoute l'anne au fichier audio */
+
+rc=SysSetObjectData('x&colon.\chemin_vers_le_dossier\fichier_audio.ext','MMAUDIOYEAR=2008')
+:exmp.
+:p.
+
+.* ----------------------------------------------------------------------------
+.* res=225
+.* ----------------------------------------------------------------------------
+:h2 res=225
+x=50% width=50%
+group=2
+.MMAUDIOGENRE
+:p.
+Dfinition du genre de musique du fichier audio.
+Cette information est enregistre dans les attributs tendus du fichier.
+Pour les fichiers MP3 cette information est aussi enregistre dans la
+balise ID3 correspondante.
+:xmp.
+/* REXX - Cette commande ajoute le genre de musique au fichier audio */
+
+rc=SysSetObjectData('x&colon.\chemin_vers_le_dossier\fichier_audio.ext','MMAUDIOGENRE=Blues'
+:exmp.
+:p.
+
+.* ----------------------------------------------------------------------------
+.* res=226
+.* ----------------------------------------------------------------------------
+:h2 res=226
+x=50% width=50%
+group=2
+.MMREFRESH
+:p.
+Relecture des informations audio depuis le fichier et mise 
+ jour des
+donnes d'objet internes.
+:xmp.
+/* REXX - Cette commande ajoute le genre de musique au fichier audio */
+
+rc=SysSetObjectData('x&colon.\chemin_vers_le_dossier\fichier_audio.ext','MMREFRESH=1')
+:exmp.
+:p.
+
+.* ----------------------------------------------------------------------------
+.* res=227
+.* ----------------------------------------------------------------------------
+:h2 res=227
+x=50% width=50%
+group=2
+.MMAUDIOCOPYTAGTO
+:p.
+Lecture des informations audio d'un fichier et copie vers les donnes
+d'objet internes d'un autre fichier.
+:xmp.
+/* REXX - Cette commande copie les informations d'un fichier audio vers un autre */
+
+rc=SysSetObjectData('x&colon.\chemin_vers_le_dossier\fichier_audio.ext','MMAUDIOCOPYTAGTO=x&colon.\chemin_vers_le_dossier\autre_fichier_audio.ext')
+:exmp.
+:p.
+
+.* ----------------------------------------------------------------------------
+.* res=300
+.* ----------------------------------------------------------------------------
+:h1 res=300.Interface REXX
+:p.
+En utilisant l'interface REXX, les scripts ont accs aux mthodes de
+classes des dossiers "media folder".
+La prise en charge des mthodes les plus importantes du WPS, des
+fonctions d'aide et de quelques fonctions de fentres est fournie par
+WPS-Wizard.
+:p.
+Les mthodes de "media folder" sont utilises en utilisant une
+fonction d'encapsulation ("wrapper") &colon.
+:table cols='20 35'.
+:row.
+:c.:link reftype=hd res=320.MFldrCallFunc:elink.
+:c.appelle une des mthodes introduites par "media folder".
+:etable.
+:p.
+Les mthodes introduites par les classes multimedia sont invoques en
+utilisant la fonction suivante &colon.
+:table cols='20 35'.
+:row.
+:c.:link reftype=hd res=330.MMCallFunc:elink.
+:c.appelle une des mthodes introduites par les classes multimedia
+(CWAudio, CWMP3, CWOGG).
+:etable.
+:p.
+Le script s'excute dans le contexte du WPS qui est un programme PM dans
+une unit d'excution ("thread") spare. Vous pouvez utiliser les DLL
+REXX supplmentaires disponibles. Le nom du script REXX importe peu, mais
+le fichier doit comme d'habitude dbuter par un commentaire.
+:p.
+
+.* ----------------------------------------------------------------------------
+.* res=320
+.* ----------------------------------------------------------------------------
+:h2 res=320
+width=30%
+.MFldrCallFunc
+:link reftype=hd res=321
+auto dependent group=2.
+:p.
+Utilisez cette fonction pour invoquer l'une des nouvelles mthodes de
+dossier "media folder" ou une mthode d'aide.
+:p.
+:link reftype=hd res=321 dependent.Syntaxe:elink.
+.*.br
+.*:link reftype=hd res=322.Paramtres:elink.
+.br
+:link reftype=hd res=323 dependent.Retours:elink.
+.br
+:link reftype=hd res=324 dependent.Remarques:elink.
+.*.br
+.*:link reftype=hd res=325.Utilisation:elink.
+.br
+:link reftype=hd res=326.Exemple:elink.
+:p.
+
+.* ----------------------------------------------------------------------------
+.* res=321
+.* ----------------------------------------------------------------------------
+:h2 res=321
+x=30%
+width=70%
+group=2
+hide
+.MFldrCallFunc - Syntaxe
+:xmp.
+/* Invocation d'une mthode depuis REXX */
+
+MethodName     /* Le nom d'une mthode */
+Object         /* Objet sur lequel la mthode est invoque */
+param1         /* Premier paramtre de la mthode */
+param2         /* Second  paramtre de la mthode */
+:p.
+rc=MFldrCallFunc(methodName, Object,
+                 param1, param2, ...);
+:exmp.
+:p.
+
+.* ----------------------------------------------------------------------------
+.* res=322
+.* ----------------------------------------------------------------------------
+:h2 res=322
+x=30%
+width=70%
+group=2
+hide
+.MFldrCallFunc - Paramtres
+:p.
+
+.* ----------------------------------------------------------------------------
+.* res=323
+.* ----------------------------------------------------------------------------
+:h2 res=323
+x=30%
+width=70% height=35%
+group=3
+hide
+.MFldrCallFunc - Valeur de retour
+:p.
+La valeur de retour dpend de la mthode utilise. Cela peut tre une
+chane ou une valeur numrique. Veuillez vous rfrer 
+ la description
+de la mthode pour plus d'information.
+:p.
+Si la mthode ne peut pas tre trouve, la chane
+:hp2.ERROR_METHOD&colon.:ehp2. est retourne.
+:p.
+
+.* ----------------------------------------------------------------------------
+.* res=324
+.* ----------------------------------------------------------------------------
+:h2 res=324
+x=30%
+width=70%
+group=2
+hide
+.MFldrCallFunc - Remarques
+:p.
+La mthode 
+ invoquer doit tre membre de l'objet :hp2.Object:ehp2.&per.
+Une erreur se produit si l'objet ne prend pas en charge la mthode
+demande. Par exemple, un objet CWMediaFolder ne prend pas en charge les
+mmes mthodes qu'un objet CWAudio.
+:p.
+
+.* ----------------------------------------------------------------------------
+.* res=325
+.* ----------------------------------------------------------------------------
+:h2 res=325
+x=30%
+width=70%
+group=2
+hide
+.MFldrCallFunc - Utilisation
+:p.
+
+.* ----------------------------------------------------------------------------
+.* res=326
+.* ----------------------------------------------------------------------------
+:h2 res=326
+x=30%
+width=70%
+group=2
+hide
+.MFldrCallFunc - Exemple
+:xmp.
+/* Cet exemple demande le premier objet dans un  */
+/* dossier CWMediaFolder, obtient le fichier li */
+/* et demande le nom de l'artiste pris dans la   */
+/* baliste ID3 tag.                              */
+
+/* Obtention du premier objet du dossier theFolder */
+theObject=MFldrCallWPSFunc("wpQueryContent", theFolder, 0, QC_FIRST)
+
+/* Obtention l'objet du systme de fichier li au double.
+   cwGetFileSystemObject est un membre de la classe
+   CWMediaFolder. */
+theFileObj=MFldrCallFunc("cwGetFileSystemObject", theFolder, theObject)
+
+/* Obtention du nom de l'artiste.
+   cwmmQueryTrackInfo est un membre de la classe CWAudio.
+   Tout objet dans le dossier CWMediaFolder est habituellement
+   un double d'une instance d'objet d'une sous-classe de CWAudio */
+theName=MFldrCallFunc("cwmmQueryTrackInfo", theFileObj, 2)
+
+/* Affichage du nom */
+rc=RxMessageBox("Nom de l'artiste : "||theName)
+:exmp.
+:p.
+
+.* ----------------------------------------------------------------------------
+.* res=330
+.* ----------------------------------------------------------------------------
+:h2 res=330
+width=30%
+.MMCallFunc
+:link reftype=hd res=331
+auto dependent group=2.
+:p.
+Utilisez cette fonction pour invoquer une des nouvelles mthodes de
+classes multimedia introduites par :hp2.CWAudio/MMAudio:ehp2.&per.
+:p.
+:link reftype=hd res=331 dependent.Syntaxe:elink.
+.*.br
+.*:link reftype=hd res=332.Paramtres:elink.
+.br
+:link reftype=hd res=333 dependent.Retours:elink.
+.br
+:link reftype=hd res=334 dependent.Remarques:elink.
+.*.br
+.*:link reftype=hd res=335.Utilisation:elink.
+.br
+:link reftype=hd res=336.Exemple:elink.
+:p.
+
+.* ----------------------------------------------------------------------------
+.* res=331
+.* ----------------------------------------------------------------------------
+:h2 res=331
+x=30%
+width=70%
+group=2
+hide
+.MMCallFunc - Syntaxe
+:xmp.
+/* Invocation d'une mthode depuis REXX */
+
+MethodName     /* Le nom d'une mthode */
+Object         /* Objet sur lequel la mthode est invoque */
+param1         /* Premier paramtre de la mthode */
+param2         /* Second  paramtre de la mthode */
+:p.
+rc=MFldrCallFunc(methodName, Object,
+                 param1, param2, ...);
+:exmp.
+:p.
+
+.* ----------------------------------------------------------------------------
+.* res=332
+.* ----------------------------------------------------------------------------
+:h2 res=332
+x=30%
+width=70%
+group=2
+hide
+.MMCallFunc - Paramtres
+:p.
+
+.* ----------------------------------------------------------------------------
+.* res=333
+.* ----------------------------------------------------------------------------
+:h2 res=333
+x=30%
+width=70% height=35%
+group=3
+hide
+.MMCallFunc - Valeur de retour
+La valeur de retour dpend de la mthode utilise. Cela peut tre une
+chaine ou une valeur numrique. Veuillez vous rfrer 
+ la description
+de la mthode pour plus d'information.
+:p.
+Si la mthode ne peut pas tre trouve, la chane
+:hp2.ERROR_METHOD&colon.:ehp2. est retourne.
+:p.
+
+.* ----------------------------------------------------------------------------
+.* res=334
+.* ----------------------------------------------------------------------------
+:h2 res=334
+x=30%
+width=70%
+group=2
+hide
+.MMCallFunc - Remarques
+:p.
+La mthode 
+ invoquer doit tre membre de l'objet :hp2.Object:ehp2.&per.
+Une erreur se produit si l'objet ne prend pas en charge la mthode
+demande. Par exemple, un objet CWMediaFolder ne prend pas en charge les
+mmes mthodes qu'un objet CWAudio.
+:p.
+Dans les prcdentes versions des classes, cette fonction portait le nom
+:hp2.MMClsCallFunc:ehp2.&per. Ce nom est toujours pris en charge mais
+il est obsolte.
+:p.
+
+.* ----------------------------------------------------------------------------
+.* res=335
+.* ----------------------------------------------------------------------------
+:h2 res=335
+x=30%
+width=70%
+group=2
+hide
+.MMCallFunc - Utilisation
+:p.
+
+.* ----------------------------------------------------------------------------
+.* res=336
+.* ----------------------------------------------------------------------------
+:h2 res=336
+x=30%
+width=70%
+group=2
+hide
+.MMCallFunc - Exemple
+:xmp.
+/* Cet exemple demande le premier objet dans un  */
+/* dossier CWMediaFolder, obtient le fichier li */
+/* et demande le nom de l'artiste pris dans la   */
+/* baliste ID3 tag.                              */
+
+/* Obtention du premier objet du dossier theFolder */
+theObject=WPSWizCallWPSFunc("wpQueryContent", theFolder, 0, QC_FIRST)
+
+/* Obtention l'objet du systme de fichier li au double.
+   cwGetFileSystemObject est un membre de la classe
+   CWMediaFolder. */
+theFileObj=MFldrCallFunc("cwGetFileSystemObject", theFolder, theObject)
+
+/* Obtention du nom de l'artiste.
+   cwmmQueryTrackInfo est un membre de la classe CWAudio.
+   Tout objet dans le dossier CWMediaFolder est habituellement
+   un double d'une instance d'objet d'une sous-classe de CWAudio */
+theName=MMCallFunc("cwmmQueryTrackInfo", theFileObj, 2)
+
+/* Affichage du nom */
+rc=RxMessageBox("Nom de l'artiste : "||theName)
+:exmp.
+.im fr\wpsmethods_fr.inc
+:p.
+
+.* ----------------------------------------------------------------------------
+.* res=400
+.* ----------------------------------------------------------------------------
+:h1 res=400
+x=left
+y=bottom
+width=50%.Fonctions caches
+:p.
+Les fonctions suivantes des classes CW-multimedia peuvent tre actives
+en paramtrant les valeurs dans :hp2.OS2.INI:ehp2. &colon.
+:ul.
+:li.:link reftype=hd res=410.Remplacement du lecteur audio:elink.
+:li.:link reftype=hd res=411.Remplacement de l'diteur audio:elink.
+:li.:link reftype=hd res=412.Remplacement du lecteur AVI:elink.
+:li.:link reftype=hd res=413.Remplacement du lecteur MPG:elink.
+:li.:link reftype=hd res=419.Remplacement du lecteur MP3:elink.
+:li.:link reftype=hd res=422.Remplacement de l'diteur de liste M3U:elink.
+:li.:link reftype=hd res=423.Remplacement du lecteur M3U:elink.
+:li.:link reftype=hd res=414.Remplacement de l'diteur d'image:elink.
+:li.:link reftype=hd res=415.Activation des dtails pour les images sur CD:elink.
+:li.:link reftype=hd res=416.Dsactivation de l'affichage de l'heure dans les titres d'icnes:elink.
+:li.:link reftype=hd res=417.Dsactivation du clignotement des boutons de contrle de lecture (LECTURE, PAUSE):elink.
+:li.:link reftype=hd res=418.Dsactivation de la cration d'un double vers le modle Lecteur de media:elink.
+:li.:link reftype=hd res=420.Dsactivation de la vrification des fichiers audio:elink.
+:li.:link reftype=hd res=421.Dsactivation de la lecture des balises ID3:elink.
+:eul.
+.im fr\hiddenfeatures_fr.inc
+:p.
+
+.* ----------------------------------------------------------------------------
+.* res=500
+.* ----------------------------------------------------------------------------
+:h1 res=500.Attributs tendus
+:p.
+Les informations sur les fichiers audio est stocke dans les attributs
+tendus du fichier pour qu'elles puissent tre utilises par d'autres
+programmes ou par REXX. Sont actuellement dfinis les attributs tendus
+suivants &colon.
+:table cols='20 35'.
+:row.
+:c.MMALBUM
+:c.Album auquel le morceau appartient
+:row.
+:c.MMARTIST
+:c.Nom de l'artiste
+:row.
+:c.MMBPS
+:c.Bits par chantillon
+:row.
+:c.MMCHANNELS
+:c.Nombre de canaux
+:row.
+:c.MMCOMMENT
+:c.Commentaire sur ce fichier
+:row.
+:c.MMGENRE
+:c.Genre de ce fichier audio
+:row.
+:c.MMNUMAUDIOBYTES
+:c.Nombre d'octets audio contenus dans ce fichier audio
+:row.
+:c.MMPLAYTIME
+:c.Dure totale en secondes
+:row.
+:c.MMPLAYTIMEMS
+:c.Dure totale en millisecondes
+:row.
+:c.MMSAMPLERATE
+:c.Taux d'chantillonage
+:row.
+:c.MMTRACKNAME
+:c.Nom du morceau
+:row.
+:c.MMYEAR
+:c.Anne
+:etable.
+:note.les informations sont stockes sous forme ASCII.
+:p.
+:euserdoc.
+
Index: /tags/CWMM-0.3.0_GA/mediafolder/prog_tutorial/fr/newmethods_fr.inc
===================================================================
--- /tags/CWMM-0.3.0_GA/mediafolder/prog_tutorial/fr/newmethods_fr.inc	(revision 213)
+++ /tags/CWMM-0.3.0_GA/mediafolder/prog_tutorial/fr/newmethods_fr.inc	(revision 213)
@@ -0,0 +1,650 @@
+.* ----------------------------------------------------------------------------
+.* Product...............: New methods
+.* Language..............: French
+.* Original file version.:
+.* French translation....: Guillaume Gay <guillaume[dot]gay[arobase]gmail[dot]com>
+.* Version...............: 2020-07-25
+.* ----------------------------------------------------------------------------
+
+.* ----------------------------------------------------------------------------
+.* res=1010
+.* ----------------------------------------------------------------------------
+:h2 res=1010
+width=30%
+.cwGetFileSystemObject
+:link reftype=hd res=1011
+auto dependent group=2.
+:p.
+:link reftype=hd res=1011.Syntaxe:elink.
+.br
+:link reftype=hd res=1013 dependent.Retours:elink.
+.br
+:link reftype=hd res=1014 dependent.Remarques:elink.
+.*.br
+.*:link reftype=hd res=315.Utilisation:elink.
+.*.br
+.*:link reftype=hd res=416 dependent.Exemple:elink.
+.*
+:p.
+
+.* ----------------------------------------------------------------------------
+.* res=1011
+.* ----------------------------------------------------------------------------
+:h2 res=1011
+x=30%
+width=70%
+hide
+group=2
+.cwGetFileSystemObject - Syntaxe
+:xmp.
+/* Obtention d'un objet systme de fichiers */
+/* vers lequel pointe un double             */
+
+mediaFolder   /* Pointeur vers un dossier "media folder" */
+theShadow     /* Un objet double */
+:p.
+fsObj=MFldrCallFunc("cwGetFileSystemObject",
+                        mediaFolder, theShadow);
+:exmp.
+:p.
+
+.* ----------------------------------------------------------------------------
+.* res=1013
+.* ----------------------------------------------------------------------------
+:h2 res=1013
+x=30%
+width=70% height=35%
+group=3
+hide
+.cwGetFileSystemObject - Valeur de retour
+:p.
+:hp2.fsObj:ehp2. numrique
+:p.
+La valeur de retour est un pointeur vers l'objet systme de fichiers
+auquel le double :hp2.theShadow:ehp2. est li. Si le lien est rompu,
+0 est retourn.
+:p.
+
+.* ----------------------------------------------------------------------------
+.* res=1014
+.* ----------------------------------------------------------------------------
+:h2 res=1014
+x=30%
+width=70%
+hide
+group=2
+.cwGetFileSystemObject - Remarque
+:p.
+Cette mthode est un membre du dossier "media folder", un pointeur
+d'objet vers un dossier "media folder" doit donc tre fourni.
+:p.
+La mthode a t introduite par la classe CWProgFolder qui est une classe
+parente de plusieurs nouvelles classes de dossier. Ainsi vous pourrez
+utiliser un pointeur vers n'importe quelle autre sous-classe de
+CWProgFolder. Certaines de ces sous-classes sont listes
+ci-dessous &colon.
+:ul.
+:li.CWAudioFolder
+:li.CWDataFolder
+:li.CWMediaFolder
+:eul.
+:p.
+
+.* ----------------------------------------------------------------------------
+.* res=1040
+.* ----------------------------------------------------------------------------
+:h2 res=1040
+width=30%
+.cwPauseAudioFile
+:link reftype=hd res=1041
+auto dependent group=2.
+:p.
+:link reftype=hd res=1041.Syntaxe:elink.
+.br
+:link reftype=hd res=1043 dependent.Retours:elink.
+.br
+:link reftype=hd res=1044 dependent.Remarques:elink.
+.*.br
+.*:link reftype=hd res=315.Utilisation:elink.
+.*.br
+.*:link reftype=hd res=416 dependent.Exemple:elink.
+:p.
+
+.* ----------------------------------------------------------------------------
+.* res=1041
+.* ----------------------------------------------------------------------------
+:h2 res=1041
+x=30%
+width=70%
+hide
+group=2
+.cwPauseAudioFile - Syntaxe
+:xmp.
+/* Cette mthode met en pause la lecture */
+
+mediaFolder   /* Pointeur vers le dossier "media folder" */
+frameHandle   /* Handle de la structure de dossier */
+:p.
+rc=MFldrCallFunc("cwPauseAudioFile",
+                        mediaFolder, frameHandle);
+:exmp.
+:p.
+
+.* ----------------------------------------------------------------------------
+.* res=1043
+.* ----------------------------------------------------------------------------
+:h2 res=1043
+x=30%
+width=70% height=35%
+group=3
+hide
+.cwPauseAudioFile - Valeur de retour
+:p.
+:hp2.rc:ehp2. numrique
+:p.
+
+.* ----------------------------------------------------------------------------
+.* res=1044
+.* ----------------------------------------------------------------------------
+:h2 res=1044
+x=30%
+width=70%
+hide
+group=2
+.cwPauseAudioFile - Remarques
+:p.
+Le contrle ("handle") de structure du dossier "media folder" est pass
+au script comme paramtre au lancement.
+:p.
+
+.* ----------------------------------------------------------------------------
+.* res=1050
+.* ----------------------------------------------------------------------------
+:h2 res=1050
+width=30%
+.cwPlayAudioFile
+:link reftype=hd res=1051
+auto dependent group=2.
+:p.
+:link reftype=hd res=1051.Syntaxe:elink.
+.br
+:link reftype=hd res=1053 dependent.Retours:elink.
+.br
+:link reftype=hd res=1054 dependent.Remarques:elink.
+.*.br
+.*:link reftype=hd res=315.Utilisation:elink.
+.*.br
+.*:link reftype=hd res=416 dependent.Exemple:elink.
+:p.
+
+.* ----------------------------------------------------------------------------
+.* res=1051
+.* ----------------------------------------------------------------------------
+:h2 res=1051
+x=30%
+width=70%
+hide
+group=2
+.cwPlayAudioFile - Syntaxee
+:xmp.
+/* Cette mthode lance la lecture du contenu
+   du dossier "media folder" */
+
+mediaFolder   /* Pointeur vers le dossier "media folder" */
+frameHandle   /* Handle de la structure de dossier */
+flag          /* Drapeau indiquant la piste 
+ lancer */
+:p.
+rc=MFldrCallFunc("cwPlayAudioFile",
+                        mediaFolder, frameHandle, flag);
+:exmp.
+:p.
+
+.* ----------------------------------------------------------------------------
+.* res=1053
+.* ----------------------------------------------------------------------------
+:h2 res=1053
+x=30%
+width=70% height=35%
+group=3
+hide
+.cwPlayAudioFile - Valeur de retour
+:p.
+:hp2.rc:ehp2. numrique
+:p.
+
+.* ----------------------------------------------------------------------------
+.* res=1054
+.* ----------------------------------------------------------------------------
+:h2 res=1054
+x=30%
+width=70%
+hide
+group=2
+.cwPlayAudioFile - Remarques
+:p.
+Le contrle ("handle") de structure du dossier "media folder" est pass
+au script comme paramtre au lancement. Le paramtre de drapeau peut
+prsenter l'une des valeurs suivantes &colon.
+:ul.
+:li.PLAY_FIRST    1
+.br
+Lance la premire piste audio du dossier "media folder". Si un des
+morceaux est slectionn, la lecture dbutera par la premire piste
+slectionne.
+:li.PLAY_NEXT     2
+.br
+Lecture de la piste suivante.
+:li.PLAY_PREV     3
+.br
+Lecture de la piste prcdente.
+:eul.
+:p.
+
+.* ----------------------------------------------------------------------------
+.* res=1060
+.* ----------------------------------------------------------------------------
+:h2 res=1060
+width=30%
+.cwQueryCurrentlyPlayingObject
+:link reftype=hd res=1061
+auto dependent group=2.
+:p.
+:link reftype=hd res=1061.Syntaxe:elink.
+.br
+:link reftype=hd res=1063 dependent.Retours:elink.
+.*.br
+.*:link reftype=hd res=1054 dependent.Remarques:elink.
+.*.br
+.*:link reftype=hd res=315.Utilisation:elink.
+.*.br
+.*:link reftype=hd res=416 dependent.Exemple:elink.
+:p.
+
+.* ----------------------------------------------------------------------------
+.* res=1061
+.* ----------------------------------------------------------------------------
+:h2 res=1061
+x=30%
+width=70%
+hide
+group=2
+.cwQueryCurrentlyPlayingObject - Syntaxe
+:xmp.
+/* Cette mthode rcupre le pointeur de l'objet
+   en cours de lecture */
+
+mediaFolder   /* Pointeur vers le dossier "media folder" */
+:p.
+rc=MFldrCallFunc("cwQueryCurrentlyPlayingObject",
+                  mediaFolder);
+:exmp.
+:p.
+
+.* ----------------------------------------------------------------------------
+.* res=1063
+.* ----------------------------------------------------------------------------
+:h2 res=1063
+x=30%
+width=70% height=35%
+group=3
+hide
+.cwQueryCurrentlyPlayingObject - Valeur de retour
+:p.
+:hp2.rc:ehp2. numrique
+:p.
+Le pointeur objet vers l'objet en cours de lecture ou 0 si aucun
+objet n'est en cours de lecture.
+:p.
+
+.* ----------------------------------------------------------------------------
+.* res=1090
+.* ----------------------------------------------------------------------------
+:h2 res=1090
+width=30%
+.cwSetStatusLineText
+:link reftype=hd res=1091
+auto dependent group=2.
+:p.
+:link reftype=hd res=1091.Syntaxe:elink.
+.br
+:link reftype=hd res=1093 dependent.Retours:elink.
+.br
+:link reftype=hd res=1094 dependent.Remarques:elink.
+.*.br
+.*:link reftype=hd res=315.Utilisation:elink.
+.*.br
+.*:link reftype=hd res=416 dependent.Exemple:elink.
+.*
+:p.
+
+.* ----------------------------------------------------------------------------
+.* res=1091
+.* ----------------------------------------------------------------------------
+:h2 res=1091
+x=30%
+width=70%
+hide
+group=2
+.cwSetStatusLineText - Syntaxe
+:xmp.
+/* Cette mthode dfinit le texte de ligne d'tat
+   d'un dossier "media folder" */
+
+mediaFolder   /* Pointeur vers le dossier "media folder" sur lequel la mthode est invoque */
+theText       /* Texte pour la ligne d'tat ou 0 */
+:p.
+info=MFldrCallFunc("cwSetStatusLineText",
+                    mediaFolder, theText);
+:exmp.
+:p.
+
+.* ----------------------------------------------------------------------------
+.* res=1093
+.* ----------------------------------------------------------------------------
+:h2 res=1093
+x=30%
+width=70% height=35%
+group=3
+hide
+.cwSetStatusLineText - Valeur de retour
+:p.
+:hp2.info:ehp2. chane
+:p.
+
+.* ----------------------------------------------------------------------------
+.* res=1094
+.* ----------------------------------------------------------------------------
+:h2 res=1094
+x=30%
+width=70%
+hide
+group=2
+.cwSetStatusLineText - Remarque
+:p.
+Si le paramtre de texte est 0, le dossier affiche sa ligne d'tat
+standard.
+:p.
+
+.* ----------------------------------------------------------------------------
+.* res=1100
+.* ----------------------------------------------------------------------------
+:h2 res=1100
+width=30%
+.cwStopAudioFile
+:link reftype=hd res=1101
+auto dependent group=2.
+:p.
+:link reftype=hd res=1101.Syntaxe:elink.
+.br
+:link reftype=hd res=1103 dependent.Retours:elink.
+.br
+:link reftype=hd res=1104 dependent.Remarques:elink.
+.*.br
+.*:link reftype=hd res=315.Utilisation:elink.
+.*.br
+.*:link reftype=hd res=416 dependent.Exemple:elink.
+.*
+:p.
+
+.* ----------------------------------------------------------------------------
+.* res=1101
+.* ----------------------------------------------------------------------------
+:h2 res=1101
+x=30%
+width=70%
+hide
+group=2
+.cwStopAudioFile - Syntaxe
+:xmp.
+/* Cette mthode interrompt la lecture */
+
+mediaFolder   /* Pointeur vers le dossier "media folder" */
+frameHandle   /* Handle de la structure de dossier */
+:p.
+rc=MFldrCallFunc("cwStopAudioFile",
+                        mediaFolder, frameHandle);
+:exmp.
+:p.
+
+.* ----------------------------------------------------------------------------
+.* res=1103
+.* ----------------------------------------------------------------------------
+:h2 res=1103
+x=30%
+width=70% height=35%
+group=3
+hide
+.cwStopAudioFile - Valeur de retour
+:p.
+:hp2.rc:ehp2. numrique
+:p.
+
+.* ----------------------------------------------------------------------------
+.* res=1104
+.* ----------------------------------------------------------------------------
+:h2 res=1104
+x=30%
+width=70%
+hide
+group=2
+.cwStopAudioFile - Remarques
+:p.
+Le contrle ("handle") de structure du dossier "media folder" est pass
+au script comme paramtre au lancement.
+:p.
+
+.* ----------------------------------------------------------------------------
+.* res=1070
+.* ----------------------------------------------------------------------------
+:h2 res=1070
+width=30%
+.cwmmQueryTrackInfo
+:link reftype=hd res=1071
+auto dependent group=2.
+:p.
+:link reftype=hd res=1071.Syntaxe:elink.
+.br
+:link reftype=hd res=1073 dependent.Retours:elink.
+.br
+:link reftype=hd res=1074 dependent.Remarques:elink.
+.*.br
+.*:link reftype=hd res=315.Utilisation:elink.
+.*.br
+.*:link reftype=hd res=416 dependent.Exemple:elink.
+.*
+:p.
+
+.* ----------------------------------------------------------------------------
+.* res=1071
+.* ----------------------------------------------------------------------------
+:h2 res=1071
+x=30%
+width=70%
+hide
+group=2
+.cwmmQueryTrackInfo - Syntaxe
+:xmp.
+/* Cette mthode rcupre les informations depuis
+   un objet audio */
+
+audioObject   /* Pointeur vers un objet audio sur lequel la mthode est invoque */
+flag          /* Drapeau indiquant l'information 
+ rcuprer */
+:p.
+info=MMClsCallFunc("cwmmQueryTrackInfo",
+                  audioObject, flag);
+:exmp.
+:p.
+
+.* ----------------------------------------------------------------------------
+.* res=1073
+.* ----------------------------------------------------------------------------
+:h2 res=1073
+x=30%
+width=70% height=35%
+group=3
+hide
+.cwmmQueryTrackInfo - Valeur de retour
+:p.
+:hp2.info:ehp2. chane
+:p.
+L'information 
+ rcuprer est retourne sous forme de chane. Si aucune
+information n'est disponible, une chane vide est retourne.
+:p.
+Si une erreur se produit, :hp2.ERROR&colon.:ehp2. est retourne.
+:p.
+
+.* ----------------------------------------------------------------------------
+.* res=1074
+.* ----------------------------------------------------------------------------
+:h2 res=1074
+x=30%
+width=70%
+hide
+group=2
+.cwmmQueryTrackInfo - Remarques
+:p.
+L'objet doit tre une instance de :hp2.CWAudio:ehp2. ou de l'une de ses
+sous-classes (:hp2.CWMP3:ehp2., :hp2.MMWAV:ehp2., ...). Cette mthode a
+t introduite par :hp2.CWAudio:ehp2.. Depuis la version 0.2.5 des
+classes, les noms de classes sont :hp2.MMAudio:ehp2., :hp2.MMWAV:ehp2.,
+etc. pour tre compatibles avec les classes IBM venant avec OS/2.
+:p.
+Le paramtre drapeau peut prsenter l'une des valeurs suivantes &colon.
+:ul.
+:li.IDINFO_NAME              1
+.br
+Nom de la piste.
+:li.IDINFO_ARTIST            2
+.br
+Nom de l'artiste.
+:li.IDINFO_ALBUM             3
+.br
+Nom de l'album.
+:li.IDINFO_YEAR              4
+.br
+Anne prise dans la balise ID3 correspondante.
+:li.IDINFO_COMMENT           5
+.br
+Commentaire.
+:li.IDINFO_GENRE             6
+.br
+Genre (comme chane).
+:li.IDINFO_PLAYTIME          7
+.br
+Dure totale en secondes (valeur numrique).
+:li.IDINFO_BPS               8
+.br
+Bits par chantillon (valeur numrique).
+:li.IDINFO_SAMPLERATE        9
+.br
+Taux d'chantillonnage en Hz (valeur numrique).
+:li.IDINFO_CHANNELS          10
+.br
+Nombre de canaux (valeur numrique).
+:li.IDINFO_BITRATE           11
+.br
+Taux d'chantillonnage ("Bitrate") en Hz  (valeur numrique).
+Ce drapeau n'est valable que pour les instances de classes MMMP3 et
+MMOGG. Pour les autres classes, la valeur de retour est non dfinie.
+Nouveau avec la version 0.2.7.
+:eul.
+:p.
+
+.* ----------------------------------------------------------------------------
+.* res=1080
+.* ----------------------------------------------------------------------------
+:h2 res=1080
+width=30%
+.cwmmQueryImageInfo
+:link reftype=hd res=1081
+auto dependent group=2.
+:p.
+:link reftype=hd res=1081.Syntaxe:elink.
+.br
+:link reftype=hd res=1082 dependent.Paramtres:elink.
+.br
+:link reftype=hd res=1083 dependent.Retours:elink.
+.*.br
+.*:link reftype=hd res=1084 dependent.Remarques:elink.
+.*.br
+.*:link reftype=hd res=315.Utilisation:elink.
+.*.br
+.*:link reftype=hd res=416 dependent.Exemple:elink.
+:p.
+
+.* ----------------------------------------------------------------------------
+.* res=1081
+.* ----------------------------------------------------------------------------
+:h2 res=1081
+x=30%
+width=70%
+hide
+group=2
+.cwmmQueryImageInfo - Syntaxe
+:xmp.
+/* Cette mthode rcupre les informations depuis
+   un objet image */
+
+imageObject   /* Pointeur vers un objet image sur lequel la mthode est invoque */
+flag          /* Drapeau indiquant l'information 
+ rcuprer */
+:p.
+info=MMCallFunc("cwmmQueryTrackInfo",
+                  imageObject, flag);
+:exmp.
+:p.
+
+.* ----------------------------------------------------------------------------
+.* res=1083
+.* ----------------------------------------------------------------------------
+:h2 res=1083
+x=30%
+width=70% height=35%
+group=3
+hide
+.cwmmQueryImageInfo - Valeur de retour
+:p.
+:hp2.info:ehp2. chane
+:p.
+L'information 
+ rcuprer est retourne sous forme de chane. Si aucune
+information n'est disponible, une chane vide est retourne.
+:p.
+Si une erreur se produit, :hp2.ERROR&colon.:ehp2. est retourne.
+:p.
+
+.* ----------------------------------------------------------------------------
+.* res=1082
+.* ----------------------------------------------------------------------------
+:h2 res=1082
+x=30%
+width=70%
+hide
+group=2
+.cwmmQueryImageInfo - Paramtres
+:p.
+:parml tsize=10.
+:pt.:hp2.imageObject:ehp2. (numrique)
+:pd.Pointeur objet vers le fichier image.
+:pt.:hp2.flag:ehp2. (numrique)
+:pd.Dtermine l'information 
+ rcuprer.
+:parml tsize=3.
+:pt.IDINFO_WIDTH    0x0001
+:pd.La largeur de l'image.
+:pt.IDINFO_HEIGHT   0x0002
+:pd.La hauteur de l'image.
+:pt.IDINFO_BPP      0x0003
+:pd.Le nombre de bits par pixel.
+:pt.IDINFO_FORMAT   0x0004
+:pd.Le format d'image.
+:eparml.
+:pt.:hp2.info:ehp2. (numrique)
+:pd.L'information 
+ rcuprer retourne sous forme de chane.
+:eparml.
+:p.
+
Index: /tags/CWMM-0.3.0_GA/mediafolder/prog_tutorial/fr/wpsmethods_fr.inc
===================================================================
--- /tags/CWMM-0.3.0_GA/mediafolder/prog_tutorial/fr/wpsmethods_fr.inc	(revision 213)
+++ /tags/CWMM-0.3.0_GA/mediafolder/prog_tutorial/fr/wpsmethods_fr.inc	(revision 213)
@@ -0,0 +1,36 @@
+.* ----------------------------------------------------------------------------
+.* Product...............: WPS Methods
+.* Language..............: French
+.* Original file version.:
+.* French translation....: Guillaume Gay <guillaume[dot]gay[arobase]gmail[dot]com>
+.* Version...............: 2020-07-25
+.* ----------------------------------------------------------------------------
+
+.* ----------------------------------------------------------------------------
+.* res=1000
+.* ----------------------------------------------------------------------------
+:h1 res=1000
+width=30%
+.Mthodes prises en charge
+:p.
+Sont prises en charge les mthodes introduites suivantes &colon.
+:p.
+.br
+:link reftype=hd res=1010 dependent.cwGetFileSystemObject:elink.
+.br
+:link reftype=hd res=1040 dependent.cwPauseAudioFile:elink.
+.br
+:link reftype=hd res=1050 dependent.cwPlayAudioFile:elink.
+.br
+:link reftype=hd res=1060 dependent.cwQueryCurrentlyPlayingObject:elink.
+.br
+:link reftype=hd res=1090 dependent.cwSetStatusLineText:elink.
+.br
+:link reftype=hd res=1100 dependent.cwStopAudioFile:elink.
+.br
+:link reftype=hd res=1070 dependent.cwmmQueryTrackInfo:elink.
+.br
+:link reftype=hd res=1080 dependent.cwmmQueryImageInfo:elink.
+
+.im fr\newmethods_fr.inc
+
Index: /tags/CWMM-0.3.0_GA/mediafolder/prog_tutorial/hiddenfeatures.inc
===================================================================
--- /tags/CWMM-0.3.0_GA/mediafolder/prog_tutorial/hiddenfeatures.inc	(revision 213)
+++ /tags/CWMM-0.3.0_GA/mediafolder/prog_tutorial/hiddenfeatures.inc	(revision 213)
@@ -0,0 +1,350 @@
+:h2 res=410
+x=50% width=50%
+group=2
+.Replace audio player
+:p.
+The default audio player coming with MMOS2 may be replaced by adding the
+following key to OS2.INI:
+:p.
+:hp2.CWMM->audioplayer-><path to new player>:ehp2.
+:nt.You don't have to provide the full path if the program is in your PATH. The program must be a PM program!
+:ent.
+:p.
+Even if a new program isn't specified in the INI file the classes improve the default
+behavior by not starting the player as part of the WPS process. So if the player crashes
+the WPS doesn't crash anymore.
+
+:h2 res=429
+x=50% width=50%
+group=2
+.Replace midi player
+:p.
+The default audio/midi player coming with CWMM may be replaced by adding the
+following key to OS2.INI:
+:p.
+:hp2.CWMM->midiplayer-><path to new player>:ehp2.
+:nt.You don't have to provide the full path if the program is in your PATH. The program must be a PM program!
+IBM's ab.exe fails with a 5051 error trying to play midi files. The default internal
+player now works. The only extenal player I know works is FM2play.exe. This only
+replaces the play for Midi files not other audio formats
+:ent.
+:p.
+Even if a new program isn't specified in the INI file the classes improve the default
+behavior by not starting the player as part of the WPS process. So if the player crashes
+the WPS doesn't crash anymore.
+
+:h2 res=425
+x=50% width=50%
+group=2
+.Replace audio converter
+:p.
+The default audio converter may be replaced by adding the
+following key to OS2.INI:
+:p.
+:hp2.CWMM->audioconverter-><path to new player>:ehp2.
+:nt.You don't have to provide the full path if the program is in your PATH. The program must be a PM program!
+The converter is not started as part of the WPS process. The is not used by Midi files.
+:ent.
+
+
+:h2 res=411
+x=50% width=50%
+group=2
+.Replace audio editor
+:p.
+The default audio editor coming with MMOS2 may be replaced by adding the
+following key to OS2.INI:
+:p.
+:hp2.CWMM->audioeditor-><path to new editor>:ehp2.
+:nt.You don't have to provide the full path if the program is in your PATH. The program must be a PM program!
+:ent.
+:p.
+Even if a new program isn't specified in the INI file the classes improve the default
+behavior by not starting the editor as part of the WPS process. So if the editor crashes
+the WPS doesn't crash anymore. The editor is not used by Midi files.
+
+
+:h2 res=412
+x=50% width=50%
+group=2
+.Replace AVI player
+:p.
+The default AVI player coming with MMOS2 may be replaced by adding the
+following key to OS2.INI:
+:p.
+:hp2.CWMM->aviplayer-><path to new player>:ehp2.
+:nt.You don't have to provide the full path if the program is in your PATH. The program must be a PM program!
+:ent.
+:p.
+Even if a new program isn't specified in the INI file the classes improve the default
+behavior by not starting the player as part of the WPS process. So if the player crashes
+the WPS doesn't crash anymore.
+
+
+:h2 res=413
+x=50% width=50%
+group=2
+.Replace MPG player
+:p.
+The default MPG player coming with MMOS2 may be replaced by adding the
+following key to OS2.INI:
+:p.
+:hp2.CWMM->mpgplayer-><path to new player>:ehp2.
+:nt.You don't have to provide the full path if the program is in your PATH. The program must be a PM program!
+:ent.
+:p.
+Even if a new program isn't specified in the INI file the classes improve the default
+behavior by not starting the player as part of the WPS process. So if the player crashes
+the WPS doesn't crash anymore.
+
+
+:h2 res=419
+x=50% width=50%
+group=2
+.Replace MP3 player
+:p.
+The default MP3 player may be replaced by adding the
+following key to OS2.INI:
+:p.
+:hp2.CWMM->mp3player-><path to new player>:ehp2.
+:nt.You don't have to provide the full path if the program is in your PATH.
+:ent.
+:p.
+Even if a new program isn't specified in the INI file the classes improve the default
+behavior by not starting the player as part of the WPS process. So if the default player crashes
+the WPS doesn't crash, too.
+
+:h2 res=427
+x=50% width=50%
+group=2
+.Add Modern Video player
+:p.
+By default the multimedia classes will use ffplay.exe, smplayer or mplayer to play video types
+not supported bt MMOS2. It checks for them in the order listed and the must be in your PATH
+for for this to happen. The player is not started as part of the WPS process. 
+See :link reftype=hd res=428.No modern video player:elink. if you don't wish to use this feature.
+:p.
+This player also may be added by placing the
+following key to OS2.INI:
+:p.
+:hp2.CWMM->mvidplayer-><path to player>:ehp2.
+:nt.You don't have to provide the full path if the program is in your PATH.
+:ent.
+
+:h2 res=428
+x=50% width=50%
+group=2
+.No modern video player
+:p.
+The default setting is to support the use of a :link reftype=hd res=427.Modern Video player:elink. .
+If you don't want this feature you may disable it by adding the following key to OS2.INI.
+:p.
+:hp2.CWMM->nomodvid->1:ehp2.
+
+:nt.You have to restart the WPS so the setting takes effect.
+:ent.
+
+:h2 res=422
+x=50% width=50%
+group=2
+.Replace M3U editor
+:p.
+The default M3U editor may be replaced by adding the
+following key to OS2.INI:
+:p.
+:hp2.CWMM->m3ueditor-><path to new editor>:ehp2.
+:nt.You don't have to provide the full path if the program is in your PATH.
+:ent.
+
+:h2 res=423
+x=50% width=50%
+group=2
+.Replace M3U player
+:p.
+The default M3U player may be replaced by adding the
+following key to OS2.INI:
+:p.
+:hp2.CWMM->m3uplayer-><path to new player>:ehp2.
+:nt.You don't have to provide the full path if the program is in your PATH.
+:ent.
+:p.
+Default behavior is to create a new Media folder and fill it with the tracks specified in the
+M3U file. Using this setting it's possible to use another M3U player. 
+
+:h2 res=414
+x=50% width=50%
+group=2
+.Replace image editor
+:p.
+The default image editor coming with MMOS2 may be replaced by adding the
+following key to OS2.INI:
+:p.
+:hp2.CWMM->imageeditor-><path to new editor>:ehp2.
+:nt.You don't have to provide the full path if the program is in your PATH. The program must be a PM program!
+:ent.
+:p.
+Even if a new program isn't specified in the INI file the classes improve the default
+behavior by not starting the editor as part of the WPS process. So if the editor crashes
+the WPS doesn't crash anymore.
+
+:h2 res=426
+x=50% width=50%
+group=2
+.Replace image converter
+:p.
+The default image converter may be replaced by adding the
+following key to OS2.INI:
+:p.
+:hp2.CWMM->imageeditor-><path to new editor>:ehp2.
+:nt.You don't have to provide the full path if the program is in your PATH. The program must be a PM program!
+The converter is not started as part of the WPS process.
+:ent.
+
+:h2 res=415
+x=50% width=50%
+group=2
+.Enable details for images on CD
+:p.
+The default setting is not to support details for images on CD. The reason is that
+with slow drives the gathering of the information needs a huge amount of time. You may
+enable the new class features for images on CD by adding the following key to OS2.INI.
+:p.
+:hp2.CWMM->useNewImgClsFeaturesOnCD->1:ehp2.
+
+:nt.Be sure to keep the uppercase characters!
+:ent.
+:nt.You have to restart the WPS so the setting takes effect.
+:ent.
+
+
+:h2 res=416
+x=50% width=50%
+group=2
+.Disable time display in icon titles
+:p.
+When starting audio files with a doubleclick the elapsed time is displayed in the icon
+title. To disable this new feature set the following key in OS2.INI.
+:p.
+:hp2.CWMM->mmClsNoExtendedIconTitles->1:ehp2.
+
+:nt.Be sure to keep the uppercase characters!
+:ent.
+:nt.You have to restart the WPS so the setting takes effect.
+:ent.
+
+:h2 res=417
+x=50% width=50%
+group=2
+.Disable play control blinking while playing
+:p.
+As a visual feedback play controls (PLAY, PAUSE) blink while a track is playing.
+To disable this feature set the following key in OS2.INI.
+:p.
+:hp2.CWMM->bNoPlayCtrlBlinking->1:ehp2.
+
+:nt.Be sure to keep the uppercase characters!
+:ent.
+:nt.You have to restart the WPS so the setting takes effect.
+:ent.
+
+:h2 res=418
+x=50% width=50%
+group=2
+.Prevent creation of a shadow to the Media Player template
+:p.
+A shadow to the Media Player template in the Multimedia Templates Folder is automatically
+created in the Multimedia Folder for easier access. By setting this key this feature is disabled.
+
+:p.
+:hp2.CWMM->bNoMediaFolderTemplateShadow->1:ehp2.
+
+:nt.Be sure to keep the uppercase characters!
+:ent.
+
+:nt.You may move the created shadow to another place. It will only be recreated in the Multimedia Folder
+if it's deleted from the system.
+:ent.
+
+
+:h2 res=420
+x=50% width=50%
+group=2
+.Disable audio file checking
+:p.
+You may disable checking of audio files for certain drives by adding the drive letter to this
+entry in OS2.INI.
+:p.
+:hp2.CWMM->mmClsDontCheckDrives-><drive list>:ehp2.
+:nt.Be sure to keep the uppercase characters!
+:ent.
+
+This may be useful for network drives on slow connections or other slow drives. Normally
+the gathered information is stored in the extended attributes of the audio file so the checking only
+happens once. If a particular filesystem doesn't support EAs you may chose to add that drive to the list too,
+to prevent the scanning.
+:nt.
+Be aware that no audio information will be shown by the WPS for audio objects located on a drive specified in
+the list.
+:ent.
+:nt.
+The WPS must be restarted after changing this setting.
+:ent.
+
+:p.
+Example:
+:xmp.
+CWMM->mmClsDontCheckDrives->abcghzy
+:exmp.
+
+:nt.
+This setting is mostly obsolete now because the MMIOMP3 IO procedure contained in
+:hp2.MMAudio Pak 2:ehp2. (released 30.08.2003) no longer scans MP3 files but reads the Xing header
+for VBR encoded files.
+:ent.
+
+
+:h2 res=421
+x=50% width=50%
+group=2
+.Disable ID3 tag reading
+:p.
+You may disable reading of ID3 tags for certain drives by adding the drive letter to this
+entry in OS2.INI.
+:p.
+:hp2.CWMM->mmClsDontReadID3OnDrives-><drive list>:ehp2.
+:nt.Be sure to keep the uppercase characters!
+:ent.
+
+This may be useful for network drives on slow connections or other slow drives.
+
+:nt.
+Be aware that no ID3 tag information will be shown by the WPS for MP3 files located on a drive specified in
+the list.
+:ent.
+:nt.
+The WPS must be restarted after changing this setting.
+:ent.
+
+:p.
+Example:
+:xmp.
+CWMM->mmClsDontReadID3OnDrives->abcghzy
+:exmp.
+
+
+:h2 res=424
+x=50% width=50%
+group=2
+.Set time for message box display
+:p.
+The confirmation message box shown when closing a mediafolder while playing a track automatically closes after 60s and the
+folder will be closed. This delay may be changed by setting the following key.
+
+:p.
+:hp2.CWMM->mfldrMBoxDisplayTime-><time in milli seconds>:ehp2.
+:nt.Be sure to keep the uppercase characters!
+:ent.
+:nt.The shortest allowed time is 5000ms.
+:ent.
+
+.* last id 429
Index: /tags/CWMM-0.3.0_GA/mediafolder/prog_tutorial/makefile
===================================================================
--- /tags/CWMM-0.3.0_GA/mediafolder/prog_tutorial/makefile	(revision 213)
+++ /tags/CWMM-0.3.0_GA/mediafolder/prog_tutorial/makefile	(revision 213)
@@ -0,0 +1,38 @@
+# Makefile for Audio-CD-Creator Data-CD-Creator
+
+include ../../make.inc
+
+
+RESDIR	=	..\res\$(LANGUAGE)
+RESBASE2=	../res
+RESDIR2	=	../res/$(LANGUAGE)
+
+HELPSOURCE	=	$(RESDIR2)/ipf
+
+
+all:	mediafldrprog.inf
+	
+mediafldrprog.inf:	mediafldrprog.ipf hiddenfeatures.inc newmethods.inc wpsmethods.inc 
+	ipfc -i mediafldrprog.ipf mediafldrprog.inf
+	ipfc -i -c:850 -l:DEU -D:49 de\mediafldrprog_de.ipf de\mediafldrprog_de.inf
+	ipfc -i -c:850 -l:ESP -D:34 es\mediafldrprog_es.ipf es\mediafldrprog_es.inf
+	ipfc -i -c:850 -l:FRA -D:33 fr\mediafldrprog_fr.ipf fr\mediafldrprog_fr.inf
+	ipfc -i -c:866 -l:RUS -D:7  ru\mediafldrprog_ru.ipf ru\mediafldrprog_ru.inf
+	ipfc -i -c:950 -l:TWN -D:88 tw\mediafldrprog_tw.ipf tw\mediafldrprog_tw.inf
+
+clean:
+	-rm *.inf
+	-rm es/*.inf
+	-rm fr/*.inf
+	-rm ru/*.inf
+	-rm tw/*.inf
+
+cleaner:
+	-rm *.*~
+	-rm *.flc
+
+distger:
+
+disteng:
+
+distribution:
Index: /tags/CWMM-0.3.0_GA/mediafolder/prog_tutorial/mediafldrprog.ipf
===================================================================
--- /tags/CWMM-0.3.0_GA/mediafolder/prog_tutorial/mediafldrprog.ipf	(revision 213)
+++ /tags/CWMM-0.3.0_GA/mediafolder/prog_tutorial/mediafldrprog.ipf	(revision 213)
@@ -0,0 +1,583 @@
+:userdoc.
+
+:docprof.
+
+:title.Programming tutorial for Multimedia classes
+
+:h1 res=100.Introduction
+:p.
+The Media-Folder offers two interfaces for controlling and programming. You
+may use :link reftype=hd res=200.setup strings:elink. for basic tasks like starting and stopping the playing
+or a :link reftype=hd res=300.REXX interface:elink. with access to internal class methods.
+:p.
+For use of the REXX interface
+:p.
+WPS-Wizard V0.2.0 (http&colon.//www.os2world.com/cdwriting)
+:p.
+or above must be installed.
+
+:h1 res=200
+x=left y=bottom width=50%.Setup strings
+:p.
+The following additional setup strings are supported with every media folder.
+
+:ul.
+:li.:link reftype=hd res=210.MEDIAFLDRNEXT:elink.   Play the next track in the folder
+:li.:link reftype=hd res=211.MEDIAFLDRPLAY:elink.   Start playing
+:li.:link reftype=hd res=215.MEDIAFLDRPLAYFIRST:elink.   Start first track
+:li.:link reftype=hd res=212.MEDIAFLDRPREV:elink.   Skip to previous track
+:li.:link reftype=hd res=216.MEDIAFLDRREPEAT:elink. Set repeat
+:li.:link reftype=hd res=213.MEDIAFLDRSTOP:elink.   Stop playing
+:li.:link reftype=hd res=214.MEDIAFLDRVOLUME:elink. Set volume
+:eul.
+:p.
+The folder must be open for these setup strings to work.
+:p.
+The MM audio classes support the following strings:
+:ul.
+:li.:link reftype=hd res=220.MMAUDIOTRACKNAME:elink.   Set the track name of the audio file.
+:li.:link reftype=hd res=221.MMAUDIOARTIST:elink.   Set the artist name for the audio file.
+:li.:link reftype=hd res=222.MMAUDIOALBUM:elink.    Set the album name.
+:li.:link reftype=hd res=223.MMAUDIOCOMMENT:elink.  Set the comment for the audio file.
+:li.:link reftype=hd res=224.MMAUDIOYEAR:elink.     Set the year of the audio file.
+:li.:link reftype=hd res=225.MMAUDIOGENRE:elink.    Set the audio file genre.
+:li.:link reftype=hd res=226.MMREFRESH:elink.       Reread the infos of the audio file.
+:li.:link reftype=hd res=227.MMAUDIOCOPYTAGTO:elink.    Copy all tags of the audio file.
+
+:eul.
+
+
+:h2 res=210
+x=50% width=50%
+group=2
+.MEDIAFLDRNEXT
+:p.
+Skip to next track while playing. If not yet playing the first track will be started.
+:xmp.
+/* REXX - This command skips to the next track */
+
+rc=SysSetObjectData('x&colon.\path_to_folder','MEDIAFLDRNEXT=1')
+:exmp.
+
+:h2 res=211
+x=50% width=50%
+group=2
+.MEDIAFLDRPLAY
+:p.
+Start playing with the first track. If any track is selected playing will start with the first selected track.
+:xmp.
+/* REXX - This command starts playing */
+
+rc=SysSetObjectData('x&colon.\path_to_folder','MEDIAFLDRPLAY=1')
+:exmp.
+
+:h2 res=215
+x=50% width=50%
+group=2
+.MEDIAFLDRPLAYFIRST
+:p.
+Start playing with the first track no matter if any other track is selected.
+
+:xmp.
+/* REXX - This command starts playing */
+
+rc=SysSetObjectData('x&colon.\path_to_folder','MEDIAFLDRPLAYFIRST=1')
+:exmp.
+
+
+:h2 res=212
+x=50% width=50%
+group=2
+.MEDIAFLDRPREV
+:p.
+Skip to the previous track while playing.
+:xmp.
+/* REXX - This command skips to the previous track */
+
+rc=SysSetObjectData('x&colon.\path_to_folder','MEDIAFLDRPREV=1')
+:exmp.
+
+:h2 res=216
+x=50% width=50%
+group=2
+.MEDIAFLDRREPEAT
+:p.
+Set the repeat attribute. If set to 1 the tracks in the folder are
+repeated. If set to 0 repeating is disabled.
+:xmp.
+/* REXX - This command sets repeat to yes */
+
+rc=SysSetObjectData('x&colon.\path_to_folder','MEDIAFLDRREPEAT=1')
+:exmp.
+
+:h2 res=213
+x=50% width=50%
+group=2
+.MEDIAFLDRSTOP
+:p.
+Stop playing.
+:xmp.
+/* REXX - This command stops playing */
+
+rc=SysSetObjectData('x&colon.\path_to_folder','MEDIAFLDRSTOP=1')
+:exmp.
+
+:h2 res=214
+x=50% width=50%
+group=2
+.MEDIAFLDRVOLUME
+:p.
+Change the volume between 0 and 100%.
+:xmp.
+/* REXX - This command sets the volume to 35% */
+
+rc=SysSetObjectData('x&colon.\path_to_folder','MEDIAFLDRVOLUME=35')
+:exmp.
+
+.********************************************
+
+:h2 res=220
+x=50% width=50%
+group=2
+.MMAUDIOTRACKNAME
+:p.
+Set the track name of the audio file. This information is saved in the EA of the file. For
+MP3 files this information is also saved in the ID3 tag.
+:xmp.
+/* REXX - This command adds the track name to the audio file */
+
+rc=SysSetObjectData('x&colon.\path_to_folder\audio_file.ext','MMAUDIOTRACKNAME=The track name')
+:exmp.
+
+:h2 res=221
+x=50% width=50%
+group=2
+.MMAUDIOARTIST
+:p.
+Set the artist name of the audio file. This information is saved in the EA of the file. For
+MP3 files this information is also saved in the ID3 tag.
+:xmp.
+/* REXX - This command adds the artist name to the audio file */
+
+rc=SysSetObjectData('x&colon.\path_to_folder\audio_file.ext','MMAUDIOARTIST=Artist name')
+:exmp.
+
+:h2 res=222
+x=50% width=50%
+group=2
+.MMAUDIOALBUM
+:p.
+Set the album name of the audio file. This information is saved in the EA of the file. For
+MP3 files this information is also saved in the ID3 tag.
+:xmp.
+/* REXX - This command adds the album name to the audio file */
+
+rc=SysSetObjectData('x&colon.\path_to_folder\audio_file.ext','MMAUDIOALBUM=Album name')
+:exmp.
+
+:h2 res=223
+x=50% width=50%
+group=2
+.MMAUDIOCOMMENT
+:p.
+Set the comment of the audio file. This information is saved in the EA of the file. For
+MP3 files this information is also saved in the ID3 tag.
+:xmp.
+/* REXX - This command adds a comment to the audio file */
+
+rc=SysSetObjectData('x&colon.\path_to_folder\audio_file.ext','MMAUDIOCOMMENT=Track comment')
+:exmp.
+
+:h2 res=224
+x=50% width=50%
+group=2
+.MMAUDIOYEAR
+:p.
+Set the year of the audio file. This information is saved in the EA of the file. For
+MP3 files this information is also saved in the ID3 tag.
+:xmp.
+/* REXX - This command adds the year to the audio file */
+
+rc=SysSetObjectData('x&colon.\path_to_folder\audio_file.ext','MMAUDIOYEAR=2003')
+:exmp.
+
+:h2 res=225
+x=50% width=50%
+group=2
+.MMAUDIOGENRE
+:p.
+Set the genre of the audio file. This information is saved in the EA of the file. For
+MP3 files this information is also saved in the ID3 tag.
+:xmp.
+/* REXX - This command adds the genre of the audio file */
+
+rc=SysSetObjectData('x&colon.\path_to_folder\audio_file.ext','MMAUDIOGENRE=Blues')
+:exmp.
+
+:h2 res=226
+x=50% width=50%
+group=2
+.MMREFRESH
+:p.
+Reread the audio information from the file and update internal object data.
+:xmp.
+/* REXX - This command rereads the information of the audio file */
+
+rc=SysSetObjectData('x&colon.\path_to_folder\audio_file.ext','MMREFRESH=1')
+:exmp.
+
+:h2 res=227
+x=50% width=50%
+group=2
+.MMAUDIOCOPYTAGTO
+
+Read the audio information from the file tag and copies it to another file.
+
+:xmp.
+/* REXX - This command copies the file tag information to another audio file */
+
+rc=SysSetObjectData('x&colon.\path_to_folder\audio_file.ext','MMAUDIOCOPYTAGTO=x&colon.\path_to_folder\another_file.ext')
+:exmp.
+
+
+.********************************************
+
+:h1 res=300.REXX interface
+:p.
+When using the REXX interface skripts have access to the class methods of the media folder.
+Support for the most important methods of the WPS, helper functions and some PM window functions is provided by
+WPS-Wizard.
+
+:p.
+The media folder methods are called using a wrapper function.
+
+:table cols='20 35'.
+:row.
+:c.:link reftype=hd res=320.MFldrCallFunc:elink.
+:c.Call one of the methods introduced by the media folder.
+:etable.
+:p.
+Methods introduced by the multimedia classes are called using the following function.
+:table cols='20 35'.
+:row.
+:c.:link reftype=hd res=330.MMCallFunc:elink.
+:c.Call one of the methods introduced by multimedia classes (CWAudio, CWMP3, CWOGG).
+:etable.
+
+:p.
+The skript runs in the context of the WPS which is a PM program on a separate thread. You may
+use additional REXX dlls available. The name of the REXX skript does not matter but the file
+must as usual start with a comment.
+
+.*************************************
+
+.***********************************************
+
+:h2 res=320
+width=30%
+.MFldrCallFunc
+:link reftype=hd res=321
+auto dependent group=2.
+:p.
+Use this function to call one of the new media folder methods or a
+helper method.
+:p.
+:link reftype=hd res=321 dependent.Syntax:elink.
+.*.br
+.*:link reftype=hd res=322.Parameters:elink.
+.br
+:link reftype=hd res=323 dependent.Returns:elink.
+.br
+:link reftype=hd res=324 dependent.Remarks:elink.
+.*.br
+.*:link reftype=hd res=325.Usage:elink.
+.br
+:link reftype=hd res=326.Example:elink.
+
+:h2 res=321
+x=30%
+width=70%
+group=2
+hide
+.MFldrCallFunc - Syntax
+:xmp.
+/* Call a method from REXX */
+
+methodName  /* The name of a method */
+Object         /* Object on which the method is invoked */
+param1         /* First method parameter */
+param2         /* Second method parameter */
+:p.
+rc=MFldrCallFunc(methodName, Object,
+                 param1, param2, ...);
+:exmp.
+
+
+:h2 res=322
+x=30%
+width=70%
+group=2
+hide
+.MFldrCallFunc - Parameters
+:p.
+
+:h2 res=323
+x=30%
+width=70% height=35%
+group=3
+hide
+.MFldrCallFunc - Return value
+:p.
+The return value depends on the method being called. It may be a string or a
+numeric value. See the method description for more info.
+:p.
+If the method can't be found the string :hp2.ERROR_METHOD&colon.:ehp2. is returned.
+
+:h2 res=324
+x=30%
+width=70%
+group=2
+hide
+.MFldrCallFunc - Remarks
+:p.
+The method to be called must be a member of the object :hp2.Object:ehp2. An error occurs if
+the object does not support the requested method. For example a CWMediaFolder object does
+not support the same methods as a CWAudio object.
+
+:h2 res=325
+x=30%
+width=70%
+group=2
+hide
+.MFldrCallFunc - Usage
+:p.
+
+:h2 res=326
+x=30%
+width=70%
+group=2
+hide
+.MFldrCallFunc - Example
+:xmp.
+/* This example queries the first object in  */
+/* a CWMediaFolder, gets the linked file and */
+/* queries the name of the artist from the   */
+/* ID3 tag.                                  */
+
+/* Get the first object of folder theFolder */
+theObject=MFldrCallWPSFunc("wpQueryContent", theFolder, 0, QC_FIRST)
+
+/* Get the linked file system object from the shadow.
+   cwGetFileSystemObject is a member of the
+   CWMediaFolder class. */
+theFileObj=MFldrCallFunc("cwGetFileSystemObject", theFolder, theObject)
+
+/* Get the artist name. cwmmQueryTrackInfo is a member of the
+   CWAudio class. Every object in the CWMediaFolder is usually
+   a shadow to an object instance of a subclass of CWAudio */
+theName=MFldrCallFunc("cwmmQueryTrackInfo", theFileObj, 2)
+
+/* Display the name */
+rc=RxMessageBox("The artist name : "||theName)
+:exmp.
+
+.*********************************************
+.***********************************************
+
+:h2 res=330
+width=30%
+.MMCallFunc
+:link reftype=hd res=331
+auto dependent group=2.
+:p.
+Use this function to call one of the new multi media class methods introduced with :hp2.CWAudio/MMAudio:ehp2..
+:p.
+:link reftype=hd res=331 dependent.Syntax:elink.
+.*.br
+.*:link reftype=hd res=332.Parameters:elink.
+.br
+:link reftype=hd res=333 dependent.Returns:elink.
+.br
+:link reftype=hd res=334 dependent.Remarks:elink.
+.*.br
+.*:link reftype=hd res=335.Usage:elink.
+.br
+:link reftype=hd res=336.Example:elink.
+
+:h2 res=331
+x=30%
+width=70%
+group=2
+hide
+.MMCallFunc - Syntax
+:xmp.
+/* Call a method from REXX */
+
+methodName  /* The name of a method */
+Object         /* Object on which the method is invoked */
+param1         /* First method parameter */
+param2         /* Second method parameter */
+:p.
+rc=MMCallFunc(methodName, Object,
+                 param1, param2, ...);
+:exmp.
+
+
+:h2 res=332
+x=30%
+width=70%
+group=2
+hide
+.MMCallFunc - Parameters
+:p.
+
+:h2 res=333
+x=30%
+width=70% height=35%
+group=3
+hide
+.MMCallFunc - Return value
+:p.
+The return value depends on the method being called. It may be a string or a
+numeric value. See the method description for more info.
+:p.
+If the method can't be found the string :hp2.ERROR_METHOD&colon.:ehp2. is returned.
+
+:h2 res=334
+x=30%
+width=70%
+group=2
+hide
+.MMCallFunc - Remarks
+:p.
+The method to be called must be a member of the object :hp2.Object:ehp2. An error occurs if
+the object does not support the requested method. For example a CWMediaFolder object does
+not support the same methods as a CWAudio object.
+:p.
+In previous releases of the classes this function had the name :hp2.MMClsCallFunc:ehp2.. This
+name is still supported but depracted.
+
+:h2 res=335
+x=30%
+width=70%
+group=2
+hide
+.MMCallFunc - Usage
+:p.
+
+:h2 res=336
+x=30%
+width=70%
+group=2
+hide
+.MMCallFunc - Example
+:xmp.
+/* This example queries the first object in  */
+/* a CWMediaFolder, gets the linked file and */
+/* queries the name of the artist from the   */
+/* ID3 tag.                                  */
+
+/* Get the first object of folder theFolder */
+theObject=WPSWizCallWPSFunc("wpQueryContent", theFolder, 0, QC_FIRST)
+
+/* Get the linked file system object from the shadow.
+   cwGetFileSystemObject is a member of the
+   CWMediaFolder class. */
+theFileObj=MFldrCallFunc("cwGetFileSystemObject", theFolder, theObject)
+
+/* Get the artist name. cwmmQueryTrackInfo is a member of the
+   CWAudio class. Every object in the CWMediaFolder is usually
+   a shadow to an object instance of a subclass of CWAudio */
+theName=MMCallFunc("cwmmQueryTrackInfo", theFileObj, 2)
+
+/* Display the name */
+rc=RxMessageBox("The artist name : "||theName)
+:exmp.
+
+
+.im wpsmethods.inc
+
+:h1 res=400
+x=left y=bottom width=50%.Hidden features
+:p.
+The following features of the CW-multimedia classes may be enabled by setting values in :hp2.OS2.INI:ehp2..
+:ul.
+:li.:link reftype=hd res=410.Replace audio player:elink.
+:li.:link reftype=hd res=429.Replace midi player:elink.
+:li.:link reftype=hd res=425.Replace audio converter:elink.
+:li.:link reftype=hd res=411.Replace audio editor:elink.
+:li.:link reftype=hd res=412.Replace AVI player:elink.
+:li.:link reftype=hd res=413.Replace MPG player:elink.
+:li.:link reftype=hd res=419.Replace MP3 player:elink.
+:li.:link reftype=hd res=427.Add modern video player:elink.
+:li.:link reftype=hd res=428.No modern video player:elink.
+:li.:link reftype=hd res=414.Replace image editor:elink.
+:li.:link reftype=hd res=426.Replace image converter:elink.
+:li.:link reftype=hd res=415.Enable details for images on CD:elink.
+:li.:link reftype=hd res=416.Disable time display in icon titles:elink.
+:li.:link reftype=hd res=417.Disable blinking of play controls (PLAY, PAUSE):elink.
+:li.:link reftype=hd res=418.Disable creating of a shadow to the Media Player template:elink.
+:li.:link reftype=hd res=420.Disable audio file checking:elink.
+:li.:link reftype=hd res=421.Disable ID3 tag reading:elink.
+:li.:link reftype=hd res=422.Replace M3U editor:elink.
+:li.:link reftype=hd res=423.Replace M3U player:elink.
+:eul.
+
+.im hiddenfeatures.inc
+
+:h1 res=500.Extended attributes
+:p.
+Information about audio files is stored in the extended attributes of the file for use by other
+programs or REXX. The following EAs are currently defined.
+
+:table cols='20 35'.
+:row.
+:c.MMALBUM
+:c.The album this track belongs to
+:row.
+:c.MMARTIST
+:c.Name of the artist
+:row.
+:c.MMBPS
+:c.Bits per sample
+:row.
+:c.MMCHANNELS
+:c.Number of channels
+:row.
+:c.MMCOMMENT
+:c.The comment for this file
+:row.
+:c.MMGENRE
+:c.The genre of this audio file
+:row.
+:c.MMNUMAUDIOBYTES
+:c.The number of audio bytes in this audio file
+:row.
+:c.MMPLAYTIME
+:c.Playtime in seconds
+:row.
+:c.MMPLAYTIMEMS
+:c.Playtime in milliseconds
+:row.
+:c.MMSAMPLERATE
+:c.Samplerate
+:row.
+:c.MMTRACKNAME
+:c.Name of the track
+:row.
+:c.MMYEAR
+:c.Year
+:etable.
+
+:nt.
+The information is stored in ASCII format.
+:ent.
+:euserdoc.
+
+
+
+
+
+
+
+
Index: /tags/CWMM-0.3.0_GA/mediafolder/prog_tutorial/newmethods.inc
===================================================================
--- /tags/CWMM-0.3.0_GA/mediafolder/prog_tutorial/newmethods.inc	(revision 213)
+++ /tags/CWMM-0.3.0_GA/mediafolder/prog_tutorial/newmethods.inc	(revision 213)
@@ -0,0 +1,528 @@
+.******************************************************
+
+:h2 res=1010
+width=30%
+.cwGetFileSystemObject
+:link reftype=hd res=1011
+auto dependent group=2.
+:p.
+:link reftype=hd res=1011.Syntax:elink.
+.br
+:link reftype=hd res=1013 dependent.Returns:elink.
+.br
+:link reftype=hd res=1014 dependent.Remarks:elink.
+.*.br
+.*:link reftype=hd res=315.Usage:elink.
+.*.br
+.*:link reftype=hd res=416 dependent.Example:elink.
+
+:h2 res=1011
+x=30%
+width=70%
+hide
+group=2
+.cwGetFileSystemObject - Syntax
+:xmp.
+/* Get the file system object a shadow links to */
+
+mediaFolder   /* Pointer to a media folder */
+theShadow     /* A shadow object  */
+:p.
+fsObj=MFldrCallFunc("cwGetFileSystemObject", 
+                        mediaFolder, theShadow);
+:exmp.
+
+
+:h2 res=1013
+x=30%
+width=70% height=35%
+group=3
+hide
+.cwGetFileSystemObject - Return value
+:p.
+:hp2.fsObj:ehp2. numeric
+:p.
+The return value is a pointer to the file system object the shadow
+:hp2.theShadow:ehp2. links to. If the link is broken 0 is returned.
+
+
+:h2 res=1014
+x=30%
+width=70%
+hide
+group=2
+.cwGetFileSystemObject - Remarks
+:p.
+This method is a member of the media folder therefore an object pointer to
+a media folder must be provided.
+:p.
+The method was introduced by the CWProgFolder class which is a parent class
+for several new folder classes. So you may also use a pointer to any other
+subclass of CWProgFolder. Some of these subclasses are listed below.
+
+:ul.
+:li.CWAudioFolder
+:li.CWDataFolder
+:li.CWMediaFolder
+:eul.
+
+
+
+.******************************************************
+:h2 res=1040
+width=30%
+.cwPauseAudioFile
+:link reftype=hd res=1041
+auto dependent group=2.
+:p.
+:link reftype=hd res=1041.Syntax:elink.
+.br
+:link reftype=hd res=1043 dependent.Returns:elink.
+.br
+:link reftype=hd res=1044 dependent.Remarks:elink.
+.*.br
+.*:link reftype=hd res=315.Usage:elink.
+.*.br
+.*:link reftype=hd res=416 dependent.Example:elink.
+
+:h2 res=1041
+x=30%
+width=70%
+hide
+group=2
+.cwPauseAudioFile - Syntax
+:xmp.
+/* This method pauses playing */
+
+mediaFolder   /* Pointer to the media folder */
+frameHandle   /* Handle of the folder frame  */
+:p.
+rc=MFldrCallFunc("cwPauseAudioFile", 
+                        mediaFolder, frameHandle);
+:exmp.
+
+
+:h2 res=1043
+x=30%
+width=70% height=35%
+group=3
+hide
+.cwPauseAudioFile - Return value
+:p.
+:hp2.rc:ehp2. numeric
+:p.
+
+
+:h2 res=1044
+x=30%
+width=70%
+hide
+group=2
+.cwPauseAudioFile - Remarks
+:p.
+The frame handle of the media folder is given to the script as a parameter
+when started.
+
+.******************************************************
+:h2 res=1050
+width=30%
+.cwPlayAudioFile
+:link reftype=hd res=1051
+auto dependent group=2.
+:p.
+:link reftype=hd res=1051.Syntax:elink.
+.br
+:link reftype=hd res=1053 dependent.Returns:elink.
+.br
+:link reftype=hd res=1054 dependent.Remarks:elink.
+.*.br
+.*:link reftype=hd res=315.Usage:elink.
+.*.br
+.*:link reftype=hd res=416 dependent.Example:elink.
+
+:h2 res=1051
+x=30%
+width=70%
+hide
+group=2
+.cwPlayAudioFile - Syntax
+:xmp.
+/* This method starts playing the contents 
+    of the media folder */
+
+mediaFolder   /* Pointer to the media folder */
+frameHandle   /* Handle of the folder frame  */
+flag          /* Flag specifying which track to start */
+:p.
+rc=MFldrCallFunc("cwPlayAudioFile", 
+                        mediaFolder, frameHandle, flag);
+:exmp.
+
+:h2 res=1053
+x=30%
+width=70% height=35%
+group=3
+hide
+.cwPlayAudioFile - Return value
+:p.
+:hp2.rc:ehp2. numeric
+:p.
+
+
+:h2 res=1054
+x=30%
+width=70%
+hide
+group=2
+.cwPlayAudioFile - Remarks
+:p.
+The frame handle of the media folder is given to the script as a parameter
+when started. The flag parameter may have one of the following values.
+
+:ul.
+:li.PLAY_FIRST    1
+.br
+Start the first audio track in the media folder. If any track is selected
+start with the first selected track.
+:li.PLAY_NEXT     2
+.br
+Play the next track.
+:li.PLAY_PREV     3
+.br
+Play previous track.
+:eul.
+
+
+.******************************************************
+:h2 res=1060
+width=30%
+.cwQueryCurrentlyPlayingObject
+:link reftype=hd res=1061
+auto dependent group=2.
+:p.
+:link reftype=hd res=1061.Syntax:elink.
+.br
+:link reftype=hd res=1063 dependent.Returns:elink.
+.*.br
+.*:link reftype=hd res=1054 dependent.Remarks:elink.
+.*.br
+.*:link reftype=hd res=315.Usage:elink.
+.*.br
+.*:link reftype=hd res=416 dependent.Example:elink.
+
+:h2 res=1061
+x=30%
+width=70%
+hide
+group=2
+.cwQueryCurrentlyPlayingObject - Syntax
+:xmp.
+/* This method queries the pointer to the 
+   currently playing object */
+
+mediaFolder   /* Pointer to the media folder */
+:p.
+rc=MFldrCallFunc("cwQueryCurrentlyPlayingObject", 
+                  mediaFolder);
+:exmp.
+
+:h2 res=1063
+x=30%
+width=70% height=35%
+group=3
+hide
+.cwQueryCurrentlyPlayingObject - Return value
+:p.
+:hp2.rc:ehp2. numeric
+:p.
+Object pointer to the currently playing object or 0 if no object is
+playing.
+
+
+
+.******************************************************
+:h2 res=1090
+width=30%
+.cwSetStatusLineText
+:link reftype=hd res=1091
+auto dependent group=2.
+:p.
+:link reftype=hd res=1091.Syntax:elink.
+.br
+:link reftype=hd res=1093 dependent.Returns:elink.
+.br
+:link reftype=hd res=1094 dependent.Remarks:elink.
+.*.br
+.*:link reftype=hd res=315.Usage:elink.
+.*.br
+.*:link reftype=hd res=416 dependent.Example:elink.
+
+:h2 res=1091
+x=30%
+width=70%
+hide
+group=2
+.cwSetStatusLineText - Syntax
+:xmp.
+/* This method sets the status line text of a media folder */
+
+mediaFolder   /* Pointer to a media folder on which the method is invoked */
+theText       /* Text for status line or 0 */
+:p.
+info=MFldrCallFunc("cwSetStatusLineText", 
+                    mediaFolder, theText);
+:exmp.
+
+:h2 res=1093
+x=30%
+width=70% height=35%
+group=3
+hide
+.cwSetStatusLineText - Return value
+:p.
+:hp2.info:ehp2. string
+:p.
+
+
+:h2 res=1094
+x=30%
+width=70%
+hide
+group=2
+.cwSetStatusLineText - Remarks
+:p.
+If the text parameter is 0 the folder shows its standard
+status line text.
+
+
+.******************************************************
+:h2 res=1100
+width=30%
+.cwStopAudioFile
+:link reftype=hd res=1101
+auto dependent group=2.
+:p.
+:link reftype=hd res=1101.Syntax:elink.
+.br
+:link reftype=hd res=1103 dependent.Returns:elink.
+.br
+:link reftype=hd res=1104 dependent.Remarks:elink.
+.*.br
+.*:link reftype=hd res=315.Usage:elink.
+.*.br
+.*:link reftype=hd res=416 dependent.Example:elink.
+
+:h2 res=1101
+x=30%
+width=70%
+hide
+group=2
+.cwStopAudioFile - Syntax
+:xmp.
+/* This method stops playing */
+
+mediaFolder   /* Pointer to the media folder */
+frameHandle   /* Handle of the folder frame  */
+:p.
+rc=MFldrCallFunc("cwStopAudioFile", 
+                        mediaFolder, frameHandle);
+:exmp.
+
+
+:h2 res=1103
+x=30%
+width=70% height=35%
+group=3
+hide
+.cwStopAudioFile - Return value
+:p.
+:hp2.rc:ehp2. numeric
+:p.
+
+
+:h2 res=1104
+x=30%
+width=70%
+hide
+group=2
+.cwStopAudioFile - Remarks
+:p.
+The frame handle of the media folder is given to the script as a parameter
+when started.
+
+
+.******************************************************
+:h2 res=1070
+width=30%
+.cwmmQueryTrackInfo
+:link reftype=hd res=1071
+auto dependent group=2.
+:p.
+:link reftype=hd res=1071.Syntax:elink.
+.br
+:link reftype=hd res=1073 dependent.Returns:elink.
+.br
+:link reftype=hd res=1074 dependent.Remarks:elink.
+.*.br
+.*:link reftype=hd res=315.Usage:elink.
+.*.br
+.*:link reftype=hd res=416 dependent.Example:elink.
+
+:h2 res=1071
+x=30%
+width=70%
+hide
+group=2
+.cwmmQueryTrackInfo - Syntax
+:xmp.
+/* This method queries information from an
+   audio object */
+
+audioObject   /* Pointer to an audio object on which the method is invoked */
+flag          /* Flag specifying which info to query */
+:p.
+info=MMClsCallFunc("cwmmQueryTrackInfo", 
+                  audioObject, flag);
+:exmp.
+
+:h2 res=1073
+x=30%
+width=70% height=35%
+group=3
+hide
+.cwmmQueryTrackInfo - Return value
+:p.
+:hp2.info:ehp2. string
+:p.
+The requested information is returned as a string. If no information
+is available an empty string is returned.
+:p.
+If an error occurs :hp2.ERROR&colon.:ehp2. is returned.
+
+:h2 res=1074
+x=30%
+width=70%
+hide
+group=2
+.cwmmQueryTrackInfo - Remarks
+:p.
+The object must be an instance of :hp2.CWAudio:ehp2. or of one of its
+subclasses (:hp2.CWMP3:ehp2., :hp2.MMWAV:ehp2....). This method was introduced
+by :hp2.CWAudio:ehp2.. Since V0.2.5 of the classes the class names are :hp2.MMAudio:ehp2.
+:hp2.MMWAV:ehp2. etc. to be compatible with the IBM classes coming with OS/2.
+:p.
+The flag parameter may have one of the following values.
+:ul.
+:li.IDINFO_NAME              1
+.br
+Trackname
+:li.IDINFO_ARTIST            2
+.br
+Name of artist.
+:li.IDINFO_ALBUM             3
+.br
+Name of album.
+:li.IDINFO_YEAR              4
+.br
+Year from ID3 tag
+:li.IDINFO_COMMENT           5
+.br
+Comment.
+:li.IDINFO_GENRE             6
+.br
+The genre as a string.
+:li.IDINFO_PLAYTIME          7
+.br
+Play time in seconds (numeric value).
+:li.IDINFO_BPS               8
+.br
+Bits per sample (numeric value).
+:li.IDINFO_SAMPLERATE        9
+.br
+Samplerate in Hz (numeric value).
+:li.IDINFO_CHANNELS          10
+.br
+Number of channels (numeric value).
+:li.IDINFO_BITRATE           11
+.br
+Bitrate in KB per second (numeric value). This flag is only valid for instances
+of class MMMP3 and MMOGG. For other classes the return value is undefined. New
+with V0.2.7.
+:eul.
+
+
+.******************************************************
+:h2 res=1080
+width=30%
+.cwmmQueryImageInfo
+:link reftype=hd res=1081
+auto dependent group=2.
+:p.
+:link reftype=hd res=1081.Syntax:elink.
+.br
+:link reftype=hd res=1082 dependent.Parameters:elink.
+
+.br
+:link reftype=hd res=1083 dependent.Returns:elink.
+.*.br
+.*:link reftype=hd res=1084 dependent.Remarks:elink.
+.*.br
+.*:link reftype=hd res=315.Usage:elink.
+.*.br
+.*:link reftype=hd res=416 dependent.Example:elink.
+
+:h2 res=1081
+x=30%
+width=70%
+hide
+group=2
+.cwmmQueryImageInfo - Syntax
+:xmp.
+/* This method queries information from an
+   image object */
+
+imageObject   /* Pointer to an image object on which the method is invoked */
+flag          /* Flag specifying which info to query */
+:p.
+info=MMCallFunc("cwmmQueryTrackInfo", 
+                  imageObject, flag);
+:exmp.
+
+:h2 res=1083
+x=30%
+width=70% height=35%
+group=3
+hide
+.cwmmQueryImageInfo - Return value
+:p.
+:hp2.info:ehp2. string
+:p.
+The requested information is returned as a string. If no information
+is available an empty string is returned.
+:p.
+If an error occurs :hp2.ERROR&colon.:ehp2. is returned.
+
+:h2 res=1082
+x=30%
+width=70%
+hide
+group=2
+.cwmmQueryImageInfo - Parameters
+:p.
+:parml tsize=10.
+:pt.:hp2.imageObject:ehp2. (numeric)
+:pd.Object pointer of the image file.
+:pt.:hp2.flag:ehp2. (numeric)
+:pd.Determines the information to be queried.
+:parml tsize=3.
+:pt.IDINFO_WIDTH    0x0001
+:pd.The width of the image.
+:pt.IDINFO_HEIGHT   0x0002
+:pd.The height of the image.
+:pt.IDINFO_BPP      0x0003  
+:pd.Number of bits per pixel.
+:pt.IDINFO_FORMAT   0x0004  
+:pd.Image format.
+:eparml.
+:eparml.
+
Index: /tags/CWMM-0.3.0_GA/mediafolder/prog_tutorial/old/sommethods.inc
===================================================================
--- /tags/CWMM-0.3.0_GA/mediafolder/prog_tutorial/old/sommethods.inc	(revision 213)
+++ /tags/CWMM-0.3.0_GA/mediafolder/prog_tutorial/old/sommethods.inc	(revision 213)
@@ -0,0 +1,229 @@
+:h2 res=410
+width=30%
+.somGetClass
+:link reftype=hd res=411
+auto dependent group=2.
+:p.
+:link reftype=hd res=411.Syntax:elink.
+.br
+:link reftype=hd res=413 dependent.Returns:elink.
+.*.br
+.*:link reftype=hd res=314 dependent.Remarks:elink.
+.*.br
+.*:link reftype=hd res=315.Usage:elink.
+.*.br
+.*:link reftype=hd res=416 dependent.Example:elink.
+
+:h2 res=411
+x=30%
+width=70%
+hide
+group=2
+.somGetClass - Syntax
+:xmp.
+/* Get the class object from an object */
+
+theObject         /* Object for which the class is requested */
+:p.
+classObject=MFldrCallWPSFunc("somGetClass", theObject);
+:exmp.
+
+
+:h2 res=413
+x=30%
+width=70% height=35%
+group=3
+hide
+.somGetClass - Return value
+:p.
+:hp2.classObject:ehp2. numeric
+:p.
+The return value is numeric. It's a pointer to the class object for the object
+:hp2.theObject:ehp2.
+
+.******************************************************
+
+:h2 res=420
+width=30%
+.somGetClassName
+:link reftype=hd res=421
+auto dependent group=2.
+:p.
+:link reftype=hd res=421.Syntax:elink.
+.br
+:link reftype=hd res=423 dependent.Returns:elink.
+.*.br
+.*:link reftype=hd res=314 dependent.Remarks:elink.
+.*.br
+.*:link reftype=hd res=315.Usage:elink.
+.*.br
+.*:link reftype=hd res=416 dependent.Example:elink.
+
+:h2 res=421
+x=30%
+width=70%
+hide
+group=2
+.somGetClassName - Syntax
+:xmp.
+/* Get the class name an object is an
+   instance of. */
+
+theObject         /* Object for which the class name is requested */
+:p.
+className=MFldrCallWPSFunc("somGetClassName", theObject);
+:exmp.
+
+
+:h2 res=423
+x=30%
+width=70% height=35%
+group=3
+hide
+.somGetClassName - Return value
+:p.
+:hp2.className:ehp2. string
+:p.
+The return value is the name of the class the object 
+:hp2.theObject:ehp2. is an instance of.
+
+
+.******************************************************
+
+:h2 res=430
+width=30%
+.somGetname
+:link reftype=hd res=431
+auto dependent group=2.
+:p.
+:link reftype=hd res=431.Syntax:elink.
+.br
+:link reftype=hd res=433 dependent.Returns:elink.
+.*.br
+.*:link reftype=hd res=314 dependent.Remarks:elink.
+.*.br
+.*:link reftype=hd res=315.Usage:elink.
+.*.br
+.*:link reftype=hd res=416 dependent.Example:elink.
+
+:h2 res=431
+x=30%
+width=70%
+hide
+group=2
+.somGetname - Syntax
+:xmp.
+/* Get the class name from an class pointer */
+
+theClass         /* Class object for which the name is requested */
+:p.
+className=MFldrCallWPSFunc("somGetname", theClass);
+:exmp.
+
+
+:h2 res=433
+x=30%
+width=70% height=35%
+group=3
+hide
+.somGetname - Return value
+:p.
+:hp2.className:ehp2. string
+:p.
+The return value is the name of the class 
+:hp2.theClass:ehp2..
+
+
+.******************************************************
+
+:h2 res=440
+width=30%
+.somGetVersionNumbers
+:link reftype=hd res=441
+auto dependent group=2.
+:p.
+:link reftype=hd res=441.Syntax:elink.
+.br
+:link reftype=hd res=443 dependent.Returns:elink.
+.*.br
+.*:link reftype=hd res=314 dependent.Remarks:elink.
+.*.br
+.*:link reftype=hd res=315.Usage:elink.
+.*.br
+.*:link reftype=hd res=416 dependent.Example:elink.
+
+:h2 res=441
+x=30%
+width=70%
+hide
+group=2
+.somGetVersionNumbers - Syntax
+:xmp.
+/* Get the class version from an class pointer */
+
+theClass         /* Class object for which version is requested */
+:p.
+classVersion=MFldrCallWPSFunc("somGetVersionNumbers", theClass);
+:exmp.
+
+
+:h2 res=443
+x=30%
+width=70% height=35%
+group=3
+hide
+.somGetVersionNumbers - Return value
+:p.
+:hp2.classVersion:ehp2. string
+:p.
+The return value is the major.minor version of the class for example :hp2.1.3:ehp2..
+
+
+.***************************************************
+:h2 res=710
+width=30%
+.somIsObj
+:link reftype=hd res=711
+auto dependent group=2.
+:p.
+:link reftype=hd res=711.Syntax:elink.
+.br
+:link reftype=hd res=713 dependent.Returns:elink.
+.*.br
+.*:link reftype=hd res=314 dependent.Remarks:elink.
+.*.br
+.*:link reftype=hd res=315.Usage:elink.
+.*.br
+.*:link reftype=hd res=416 dependent.Example:elink.
+
+:h2 res=711
+x=30%
+width=70%
+hide
+group=2
+.somIsObj - Syntax
+:xmp.
+/* Check if an object pointer is valid */
+
+theObject         /* Object to be checked */
+:p.
+bValid=MFldrCallWPSFunc("somIsObj", theObject);
+:exmp.
+
+
+:h2 res=713
+x=30%
+width=70% height=35%
+group=3
+hide
+.somIsObj - Return value
+:p.
+:hp2.bValid:ehp2. numeric
+:p.
+The return value is numeric. It's 0 if the parameter isn't an object pointer.
+
+
+
+
+
+
Index: /tags/CWMM-0.3.0_GA/mediafolder/prog_tutorial/old/windowfunctions.inc
===================================================================
--- /tags/CWMM-0.3.0_GA/mediafolder/prog_tutorial/old/windowfunctions.inc	(revision 213)
+++ /tags/CWMM-0.3.0_GA/mediafolder/prog_tutorial/old/windowfunctions.inc	(revision 213)
@@ -0,0 +1,381 @@
+.******************************************************
+:h2 res=2050
+width=30%
+.winFileDlg
+:link reftype=hd res=2051
+auto dependent group=2.
+:p.
+:link reftype=hd res=2051.Syntax:elink.
+.br
+:link reftype=hd res=2053 dependent.Returns:elink.
+.br
+:link reftype=hd res=2054 dependent.Remarks:elink.
+.*.br
+.*:link reftype=hd res=315.Usage:elink.
+.*.br
+.*:link reftype=hd res=416 dependent.Example:elink.
+
+:h2 res=2051
+x=30%
+width=70%
+hide
+group=2
+.winFileDlg - Syntax
+:xmp.
+/* Display a file dialog. It may be an 'open'- or
+   a 'Save as' dialog */
+
+flag          /* 0: open dialog, 1: SaveAs dialog */
+title         /* Title of the file dialog         */
+fileMask      /* The file mask for example *.exe  */
+
+:p.
+fileName=MFldrCallWinFunc("winFileDlg", 
+                    flag, title, fileMask);
+:exmp.
+
+
+:h2 res=2053
+x=30%
+width=70% height=35%
+group=3
+hide
+.winFileDlg - Return value
+:p.
+:hp2.fileName:ehp2. string
+:p.
+Selected file name
+:p.
+In case of error :hp2.ERROR::ehp2. is returned.
+
+
+:h2 res=2054
+x=30%
+width=70%
+hide
+group=2
+.winFileDlg - Remarks
+:p.
+The frame handle of the media folder is given to the skript as a parameter
+when started.
+
+
+.******************************************************
+:h2 res=2010
+width=30%
+.winQueryContainerHWND
+:link reftype=hd res=2011
+auto dependent group=2.
+:p.
+:link reftype=hd res=2011.Syntax:elink.
+.br
+:link reftype=hd res=2013 dependent.Returns:elink.
+.br
+:link reftype=hd res=2014 dependent.Remarks:elink.
+.*.br
+.*:link reftype=hd res=315.Usage:elink.
+.*.br
+.*:link reftype=hd res=416 dependent.Example:elink.
+
+:h2 res=2011
+x=30%
+width=70%
+hide
+group=2
+.winQueryContainerHWND - Syntax
+:xmp.
+/* This function returns the container handle from
+    the frame handle of a folder */
+
+frameHandle   /* Handle of the folder frame  */
+:p.
+containerHandle=MFldrCallWinFunc("winQueryContainerHWND", 
+                    frameHandle);
+:exmp.
+
+
+:h2 res=2013
+x=30%
+width=70% height=35%
+group=3
+hide
+.winQueryContainerHWND - Return value
+:p.
+:hp2.containerHandle:ehp2. numeric
+:p.
+Handle to the container of a folder.
+
+
+:h2 res=2014
+x=30%
+width=70%
+hide
+group=2
+.winQueryContainerHWND - Remarks
+:p.
+The frame handle of the media folder is given to the skript as a parameter
+when started.
+
+
+.******************************************************
+:h2 res=2020
+width=30%
+.winQueryContainerRecord
+:link reftype=hd res=2021
+auto dependent group=2.
+:p.
+:link reftype=hd res=2021.Syntax:elink.
+.br
+:link reftype=hd res=2023 dependent.Returns:elink.
+.br
+:link reftype=hd res=2024 dependent.Remarks:elink.
+.br
+:link reftype=hd res=2025.Parameters:elink.
+.*.br
+.*:link reftype=hd res=416 dependent.Example:elink.
+
+:h2 res=2021
+x=30%
+width=70%
+hide
+group=2
+.winQueryContainerRecord - Syntax
+:xmp.
+/* This function returns the requested item from
+    the specified container handle from */
+
+containerHandle  /* Handle to the container              */
+pRec             /* Pointer to previous item or 0        */
+cmd              /* Value specifying which item to query */
+fsSearch         /* Enumeration order                    */
+:p.
+ptrRec=MFldrCallWinFunc("winQueryContainerRecord", 
+                         containerHandle, pRec,
+                         cmd, fsSearch);
+:exmp.
+
+
+:h2 res=2023
+x=30%
+width=70% height=35%
+group=3
+hide
+.winQueryContainerRecord - Return value
+:p.
+:hp2.ptrRec:ehp2. numeric
+:p.
+Pointer to a container item.
+
+
+:h2 res=2024
+x=30%
+width=70%
+hide
+group=2
+.winQueryContainerRecord - Remarks
+:p.
+The frame handle of the media folder is given to the skript as a parameter
+when started.
+
+:h2 res=2025
+x=30%
+width=70%
+hide
+group=2
+.winQueryContainerRecord - Parameters
+:p.
+:ul.
+:li.:hp2.containerHandle:ehp2.
+.br
+Handle to a container.
+:li.:hp2.pRec:ehp2.
+.br
+Pointer to previous item or 0. This parameter is ignored if CMA_FIRST or CMA_LAST is specified.
+:li.:hp2.cmd:ehp2.
+.br
+Command value specifying which container item to retrieve.
+:sl.
+:li.CMA_FIRST  0x0010
+.br
+Get first container record.
+:li.CMA_LAST   0x0020
+.br
+Get last container record.
+:li.CMA_PREV   0x0080
+.br
+Get previous container record of :hp1.pRec:ehp1..
+:li.CMA_NEXT   0x0100
+.br
+Get next container record after :hp1.pRec:ehp1..
+:esl.
+:li.:hp2.fsSearch:ehp2.
+.br
+Enumeration order.
+:sl.
+:li.CMA_ITEMORDER  1
+.br
+Query records in item order.
+:li.CMA_ZORDER     8
+.br
+Query records in z-order. The last record is the last to be drawn. This flag
+is only valid in icon view.
+:esl.
+
+:eul.
+
+.******************************************************
+:h2 res=2040
+width=30%
+.winQueryContRecEmphasis
+:link reftype=hd res=2041
+auto dependent group=2.
+:p.
+:link reftype=hd res=2041.Syntax:elink.
+.br
+:link reftype=hd res=2043 dependent.Returns:elink.
+.br
+:link reftype=hd res=2044 dependent.Remarks:elink.
+.br
+:link reftype=hd res=2045.Parameters:elink.
+.*.br
+.*:link reftype=hd res=416 dependent.Example:elink.
+
+:h2 res=2041
+x=30%
+width=70%
+hide
+group=2
+.winQueryContRecEmphasis - Syntax
+:xmp.
+/* This function returns a record with a certain 
+   emphasis from the specified container handle */
+
+containerHandle  /* Handle to the container       */
+pRec             /* Pointer to previous item or 0 */
+fEmphasis        /* Emphasis mask                 */
+:p.
+ptrRec=MFldrCallWinFunc("winQueryContainerRecord", 
+                         containerHandle, pRec,
+                         fEmphasis);
+:exmp.
+
+
+:h2 res=2043
+x=30%
+width=70% height=35%
+group=3
+hide
+.winQueryContRecEmphasis - Return value
+:p.
+:hp2.ptrRec:ehp2. numeric
+:p.
+Pointer to a container record or 0. In case of an error -1 is returned.
+
+
+:h2 res=2044
+x=30%
+width=70%
+hide
+group=2
+.winQueryContRecEmphasis - Remarks
+:p.
+The frame handle of the media folder is given to the skript as a parameter
+when started.
+
+:h2 res=2045
+x=30%
+width=70%
+hide
+group=2
+.winQueryContRecEmphasis - Parameters
+:p.
+:ul.
+:li.:hp2.containerHandle:ehp2.
+.br
+Handle to a container.
+:li.:hp2.pRec:ehp2.
+.br
+Pointer to previous item or CMA_FIRST (0x0010).
+:li.:hp2.fEmphasis:ehp2.
+.br
+Enumeration order.
+:sl.
+:li.CRA_SELECTED   1
+.br
+Selected records.
+:li.CRA_CURSORED   4
+.br
+Records drawn with a selection cursor.
+:li.CRA_INUSE      8
+.br
+Records with in-use emphasis
+:li.CRA_FILTERED   16
+.br
+Filtered records that means hidden from view.
+:li.CRA_SOURCE     0x4000
+.br
+Records drawn with source emphasis.
+:li.CRA_DISABLED   0x1000
+.br
+Disabled records.
+:esl.
+:eul.
+
+.******************************************************
+:h2 res=2030
+width=30%
+.winObjectFromPRec
+:link reftype=hd res=2031
+auto dependent group=2.
+:p.
+:link reftype=hd res=2031.Syntax:elink.
+.br
+:link reftype=hd res=2033 dependent.Returns:elink.
+.br
+:link reftype=hd res=2034 dependent.Remarks:elink.
+.*.br
+.*:link reftype=hd res=2025.Parameters:elink.
+.*.br
+.*:link reftype=hd res=416 dependent.Example:elink.
+
+:h2 res=2031
+x=30%
+width=70%
+hide
+group=2
+.winObjectFromPRec - Syntax
+:xmp.
+/* This function returns the object pointer
+   from a container record. */
+
+pRec             /* Pointer to a WPS container record */
+:p.
+pObject=MFldrCallWinFunc("winObjectFromPRec", 
+                         pRec)
+
+:exmp.
+
+
+:h2 res=2033
+x=30%
+width=70% height=35%
+group=3
+hide
+.winObjectFromPRec - Return value
+:p.
+:hp2.ptrRec:ehp2. numeric
+:p.
+Pointer to an object.
+
+
+:h2 res=2034
+x=30%
+width=70%
+hide
+group=2
+.winObjectFromPRec - Remarks
+:p.
+The record pointer must be queried from a WPS container that means a container
+created by a WPS object and filled with WPS objects.
+
+
Index: /tags/CWMM-0.3.0_GA/mediafolder/prog_tutorial/old/wpmethoddesc.inc
===================================================================
--- /tags/CWMM-0.3.0_GA/mediafolder/prog_tutorial/old/wpmethoddesc.inc	(revision 213)
+++ /tags/CWMM-0.3.0_GA/mediafolder/prog_tutorial/old/wpmethoddesc.inc	(revision 213)
@@ -0,0 +1,1481 @@
+.******************************************************
+
+:h2 res=450
+width=30%
+.wpClose
+:link reftype=hd res=451
+auto dependent group=2.
+:p.
+:link reftype=hd res=451.Syntax:elink.
+.br
+:link reftype=hd res=453 dependent.Returns:elink.
+.*.br
+.*:link reftype=hd res=314 dependent.Remarks:elink.
+.*.br
+.*:link reftype=hd res=315.Usage:elink.
+.*.br
+.*:link reftype=hd res=416 dependent.Example:elink.
+
+:h2 res=451
+x=30%
+width=70%
+hide
+group=2
+.wpClose - Syntax
+:xmp.
+/* Close all open views of an object */
+
+theObject         /* WPS-object  */
+:p.
+rc=MFldrCallWPSFunc("wpClose", theObject);
+:exmp.
+
+
+:h2 res=453
+x=30%
+width=70% height=35%
+group=3
+hide
+.wpClose - Return value
+:p.
+:hp2.rc:ehp2. numeric
+:p.
+The return value is 0 if an error occured.
+
+.******************************************************
+
+:h2 res=460
+width=30%
+.wpHide
+:link reftype=hd res=461
+auto dependent group=2.
+:p.
+:link reftype=hd res=461.Syntax:elink.
+.br
+:link reftype=hd res=463 dependent.Returns:elink.
+.*.br
+.*:link reftype=hd res=314 dependent.Remarks:elink.
+.*.br
+.*:link reftype=hd res=315.Usage:elink.
+.*.br
+.*:link reftype=hd res=416 dependent.Example:elink.
+
+:h2 res=461
+x=30%
+width=70%
+hide
+group=2
+.wpHide - Syntax
+:xmp.
+/* Hide all open views of an object */
+
+theObject         /* WPS-object  */
+:p.
+rc=MFldrCallWPSFunc("wpHide", theObject);
+:exmp.
+
+
+:h2 res=463
+x=30%
+width=70% height=35%
+group=3
+hide
+.wpHide - Return value
+:p.
+:hp2.rc:ehp2. numeric
+:p.
+The return value is 0 if an error occured.
+
+.******************************************************
+
+:h2 res=470
+width=30%
+.wpIsDeleteable
+:link reftype=hd res=471
+auto dependent group=2.
+:p.
+:link reftype=hd res=471.Syntax:elink.
+.br
+:link reftype=hd res=473 dependent.Returns:elink.
+.*.br
+.*:link reftype=hd res=314 dependent.Remarks:elink.
+.*.br
+.*:link reftype=hd res=315.Usage:elink.
+.*.br
+.*:link reftype=hd res=416 dependent.Example:elink.
+
+:h2 res=471
+x=30%
+width=70%
+hide
+group=2
+.wpIsDeleteable - Syntax
+:xmp.
+/* Check if an object is deleteable */
+
+theObject         /* The WPS-object to be checked */
+:p.
+rc=MFldrCallWPSFunc("wpIsDeleteable", theObject);
+:exmp.
+
+
+:h2 res=473
+x=30%
+width=70% height=35%
+group=3
+hide
+.wpIsDeleteable - Return value
+:p.
+:hp2.rc:ehp2. numeric
+:p.
+The return value is 0 if not deletable.
+
+.******************************************************
+
+:h2 res=480
+width=30%
+.wpQueryAttr
+:link reftype=hd res=481
+auto dependent group=2.
+:p.
+:link reftype=hd res=481.Syntax:elink.
+.br
+:link reftype=hd res=483 dependent.Returns:elink.
+.*.br
+.*:link reftype=hd res=314 dependent.Remarks:elink.
+.*.br
+.*:link reftype=hd res=315.Usage:elink.
+.*.br
+.*:link reftype=hd res=416 dependent.Example:elink.
+
+:h2 res=481
+x=30%
+width=70%
+hide
+group=2
+.wpQueryAttr - Syntax
+:xmp.
+/* Query the file attributes of an object */
+
+theObject         /* The WPS-object to be checked
+                     Must be of class WPFileSystem  */
+:p.
+rc=MFldrCallWPSFunc("wpQueryAttr", theObject);
+:exmp.
+
+
+:h2 res=483
+x=30%
+width=70% height=35%
+group=3
+hide
+.wpQueryAttr - Return value
+:p.
+:hp2.rc:ehp2. numeric
+:p.
+The return value is a bit mask of the file attributes.
+
+
+.******************************************************
+
+:h2 res=490
+width=30%
+.wpQueryConcurrentView
+:link reftype=hd res=491
+auto dependent group=2.
+:p.
+:link reftype=hd res=491.Syntax:elink.
+.br
+:link reftype=hd res=493 dependent.Returns:elink.
+.*.br
+.*:link reftype=hd res=314 dependent.Remarks:elink.
+.*.br
+.*:link reftype=hd res=315.Usage:elink.
+.*.br
+.*:link reftype=hd res=416 dependent.Example:elink.
+
+:h2 res=491
+x=30%
+width=70%
+hide
+group=2
+.wpQueryConcurrentView - Syntax
+:xmp.
+/* Query the concurrent view behavior of an object */
+
+theObject         /* The WPS-object to be checked */
+:p.
+ulView=MFldrCallWPSFunc("wpQueryConcurrentView", 
+                         theObject);
+:exmp.
+
+
+:h2 res=493
+x=30%
+width=70% height=55%
+group=3
+hide
+.wpQueryConcurrentView - Return value
+:p.
+:hp2.ulView:ehp2. numeric
+:p.
+The return value is one of the following:
+
+:ul.
+:li.CCVIEW_DEFAULT: 0
+.br
+Concurrent view is set to system default.
+:li.CCVIEW_ON:      1
+.br
+Concurrent view is off.
+:li.CCVIEW_OFF:     2
+.br
+Concurrent view is off.
+:eul.
+
+
+
+.******************************************************
+
+:h2 res=500
+width=30%
+.wpQueryConfirmations
+:link reftype=hd res=501
+auto dependent group=2.
+:p.
+:link reftype=hd res=501.Syntax:elink.
+.br
+:link reftype=hd res=503 dependent.Returns:elink.
+.*.br
+.*:link reftype=hd res=314 dependent.Remarks:elink.
+.*.br
+.*:link reftype=hd res=315.Usage:elink.
+.*.br
+.*:link reftype=hd res=416 dependent.Example:elink.
+
+:h2 res=501
+x=30%
+width=70%
+hide
+group=2
+.wpQueryConfirmations - Syntax
+:xmp.
+/* Query which confirmations are set for this
+   object */
+
+theObject         /* The WPS-object on which the method is invoked */
+:p.
+ulFlag=MFldrCallWPSFunc("wpQueryConfirmations", theObject);
+:exmp.
+
+
+:h2 res=503
+x=30%
+width=70% height=55%
+group=3
+hide
+.wpQueryConfirmations - Return value
+:p.
+:hp2.ulFlag:ehp2. numeric
+:p.
+The return value is one of the following.
+:ul.
+:li.0
+.br
+No confirmation set.
+:li.CONFIRM_DELETE             0x0001
+.br
+Prompt for all objects.
+:li.CONFIRM_DELETEFOLDER       0x0002
+.br
+Prompt for folders only.
+:li.CONFIRM_RENAMEFILESWITHEXT 0x0004
+.br
+Prompt when renaming files with extension.
+:li.CONFIRM_KEEPASSOC          0x0008
+.br
+Prompt if file to be renamed has an association depending on the extension.
+:li.CONFIRM_ACTION             0x0010
+.br
+Prompt when moving, copying or creating shadows.
+:li.CONFIRM_PROGRESS           0x0020
+.br
+Display a dialog box when performing a copy, move etc.
+:li.CONFIRM_ALLOWFORCEDELETE   0x0040
+.br
+Allow forced delete. Must be set when CONFIRM_FORCEDELETE is set.
+:li.CONFIRM_FORCEDELETE        0x0080
+.br
+Prompt for confirmation of forced deletion.
+:eul.
+
+The values are returned as decimal numbers.
+
+
+.******************************************************
+
+:h2 res=510
+width=30%
+.wpQueryContent
+:link reftype=hd res=511
+auto dependent group=2.
+:p.
+:link reftype=hd res=511.Syntax:elink.
+.br
+:link reftype=hd res=513 dependent.Returns:elink.
+.br
+:link reftype=hd res=514 dependent.Remarks:elink.
+.*.br
+.*:link reftype=hd res=315.Usage:elink.
+.*.br
+.*:link reftype=hd res=416 dependent.Example:elink.
+
+:h2 res=511
+x=30%
+width=70%
+hide
+group=2
+.wpQueryContent - Syntax
+:xmp.
+/* Query the contents of a folder */
+
+theFolder         /* The folder to be checked */
+theObject         /* Previous object or NULL */
+option            /* option, which object to query 
+                     (QC_FIRST, QC_NEXT, QC_LAST)
+:p.
+object=MFldrCallWPSFunc("wpQueryContent", 
+                         theObject, option);
+:exmp.
+
+
+:h2 res=513
+x=30%
+width=70% height=55%
+group=3
+hide
+.wpQueryContent - Return value
+:p.
+:hp2.object:ehp2. numeric
+:p.
+Pointer to the requested object.
+
+
+:h2 res=514
+x=30%
+width=70% 
+group=2
+hide
+.wpQueryContent - Remarks
+:p.
+Specify QC_FIRST (0) to get the first object in the folder, QC_LAST (2) for the last. When
+using QC_NEXT (1) then :hp2.theObject:ehp2. points to the previous object otherwise this
+parameter is ignored.
+:p.
+The order of the objects returned is the order in the internal list of the folder. It's no
+necessarily the order in which the objects appear in the container.  
+
+
+
+.******************************************************
+
+:h2 res=520
+width=30%
+.wpQueryDefaultView
+:link reftype=hd res=521
+auto dependent group=2.
+:p.
+:link reftype=hd res=521.Syntax:elink.
+.br
+:link reftype=hd res=523 dependent.Returns:elink.
+.*.br
+.*:link reftype=hd res=314 dependent.Remarks:elink.
+.*.br
+.*:link reftype=hd res=315.Usage:elink.
+.*.br
+.*:link reftype=hd res=416 dependent.Example:elink.
+
+:h2 res=521
+x=30%
+width=70%
+hide
+group=2
+.wpQueryDefaultView - Syntax
+:xmp.
+/* Query the default view of an object */
+
+theObject         /* The WPS-object to be checked */
+:p.
+ulView=MFldrCallWPSFunc("wpQueryDefaultView", 
+                         theObject);
+:exmp.
+
+
+:h2 res=523
+x=30%
+width=70% height=55%
+group=3
+hide
+.wpQueryDefaultView - Return value
+:p.
+:hp2.ulView:ehp2. numeric
+:p.
+The return value is one of the following:
+
+:ul.
+:li.OPEN_CONTENTS: 1
+.br
+Open in contents view (icon).
+:li.OPEN_DEFAULT:  0
+.br
+Same as doubleclick.
+:li.OPEN_DETAILS:  102
+.br
+Details view.
+:li.OPEN_HELP:     3  
+.br
+Display the help panel.
+:li.OPEN_RUNNING:  4  
+.br
+Execute the object.
+:li.OPEN_SETTINGS: 2  
+.br
+Open the settings of the object.
+:li.OPEN_TREE:     101
+.br
+Open the tree view.
+:li.OPEN_UNKNOWN:  -1  
+.br
+Unknown view.
+:li.OPEN_USER:     0x6500 or higher
+.br
+A user view introduced by a subclass.
+:eul.
+
+
+
+.******************************************************
+
+:h2 res=530
+width=30%
+.wpQueryDisk
+:link reftype=hd res=531
+auto dependent group=2.
+:p.
+:link reftype=hd res=531.Syntax:elink.
+.br
+:link reftype=hd res=533 dependent.Returns:elink.
+.*.br
+.*:link reftype=hd res=314 dependent.Remarks:elink.
+.*.br
+.*:link reftype=hd res=315.Usage:elink.
+.*.br
+.*:link reftype=hd res=416 dependent.Example:elink.
+
+:h2 res=531
+x=30%
+width=70%
+hide
+group=2
+.wpQueryDisk - Syntax
+:xmp.
+/* Query the disk object a file system
+   object is located on */
+
+theObject         /* The file system object to be checked */
+:p.
+Disk=MFldrCallWPSFunc("wpQueryDisk", 
+                         theObject);
+:exmp.
+
+
+:h2 res=533
+x=30%
+width=70% height=55%
+group=3
+hide
+.wpQueryDisk - Return value
+:p.
+:hp2.Disk:ehp2. numeric
+:p.
+The return value is a pointer to the disk object of the drive the file system object is
+located on.
+
+.******************************************************
+
+:h2 res=540
+width=30%
+.wpQueryEASize
+:link reftype=hd res=541
+auto dependent group=2.
+:p.
+:link reftype=hd res=541.Syntax:elink.
+.br
+:link reftype=hd res=543 dependent.Returns:elink.
+.*.br
+.*:link reftype=hd res=314 dependent.Remarks:elink.
+.*.br
+.*:link reftype=hd res=315.Usage:elink.
+.*.br
+.*:link reftype=hd res=416 dependent.Example:elink.
+
+:h2 res=541
+x=30%
+width=70%
+hide
+group=2
+.wpQueryEASize - Syntax
+:xmp.
+/* Query the size of the EAs of a file system
+   object */
+
+theObject         /* The file system object  */
+:p.
+eaSize=MFldrCallWPSFunc("wpQueryEASize", 
+                         theObject);
+:exmp.
+
+
+:h2 res=543
+x=30%
+width=70% height=55%
+group=3
+hide
+.wpQueryEASize - Return value
+:p.
+:hp2.eaSize:ehp2. numeric
+:p.
+The return value is the size of the extended attributes of a file.
+
+
+.******************************************************
+
+:h2 res=550
+width=30%
+.wpQueryFileSize
+:link reftype=hd res=551
+auto dependent group=2.
+:p.
+:link reftype=hd res=551.Syntax:elink.
+.br
+:link reftype=hd res=553 dependent.Returns:elink.
+.*.br
+.*:link reftype=hd res=314 dependent.Remarks:elink.
+.*.br
+.*:link reftype=hd res=315.Usage:elink.
+.*.br
+.*:link reftype=hd res=416 dependent.Example:elink.
+
+:h2 res=551
+x=30%
+width=70%
+hide
+group=2
+.wpQueryFileSize - Syntax
+:xmp.
+/* Query the size file */
+
+theObject         /* The file system object  */
+:p.
+size=MFldrCallWPSFunc("wpQueryFileSize", 
+                         theObject);
+:exmp.
+
+
+:h2 res=553
+x=30%
+width=70% height=55%
+group=3
+hide
+.wpQueryFileSize - Return value
+:p.
+:hp2.size:ehp2. numeric
+:p.
+The return value is the size of the file.
+
+.******************************************************
+
+:h2 res=560
+width=30%
+.wpQueryFldrFlags
+:link reftype=hd res=561
+auto dependent group=2.
+:p.
+:link reftype=hd res=561.Syntax:elink.
+.br
+:link reftype=hd res=563 dependent.Returns:elink.
+.*.br
+.*:link reftype=hd res=314 dependent.Remarks:elink.
+.*.br
+.*:link reftype=hd res=315.Usage:elink.
+.*.br
+.*:link reftype=hd res=416 dependent.Example:elink.
+
+:h2 res=561
+x=30%
+width=70%
+hide
+group=2
+.wpQueryFldrFlags - Syntax
+:xmp.
+/* Query the flags of a folder */
+
+theFolder         /* The folder object  */
+:p.
+flags=MFldrCallWPSFunc("wpQueryFldrFlags", 
+                         theFolder);
+:exmp.
+
+
+:h2 res=563
+x=30%
+width=70% height=55%
+group=3
+hide
+.wpQueryFldrFlags - Return value
+:p.
+:hp2.flags:ehp2. numeric
+:p.
+The return value is a bitmask of the following.
+
+:ul.
+:li.FOI_POPULATEDWITHALL     0x0001
+.br
+The folder is populated with all objects.
+:li.FOI_POPULATEDWITHFOLDERS 0x0002
+.br
+The folder is only populated with folders it contains.
+:li.FOI_WORKAREA             0x0004
+.br
+The folder is a workarea folder.
+:eul.
+
+.******************************************************
+
+:h2 res=570
+width=30%
+.wpQueryFldrFont
+:link reftype=hd res=571
+auto dependent group=2.
+:p.
+:link reftype=hd res=571.Syntax:elink.
+.br
+:link reftype=hd res=573 dependent.Returns:elink.
+.br
+:link reftype=hd res=574 dependent.Remarks:elink.
+.*.br
+.*:link reftype=hd res=315.Usage:elink.
+.*.br
+.*:link reftype=hd res=416 dependent.Example:elink.
+
+:h2 res=571
+x=30%
+width=70%
+hide
+group=2
+.wpQueryFldrFont - Syntax
+:xmp.
+/* Query the font of a folder view */
+
+thefolder         /* The folder on which the method is invoked */
+fldrView          /* One of OPEN_CONTENTS (1), OPEN_DETAILS (102) or OPEN_TREE (101) */
+:p.
+font=MFldrCallWPSFunc("wpQueryFldrFont", 
+                         theFolder, fldrView);
+:exmp.
+
+
+:h2 res=573
+x=30%
+width=70% height=55%
+group=3
+hide
+.wpQueryFldrFont - Return value
+:p.
+:hp2.font:ehp2. string
+:p.
+The return value is font of the specified folder view for example :hp2.10.Helv:ehp2..
+
+
+:h2 res=574
+x=30%
+width=70%
+hide
+group=2
+.wpQueryFldrFont - Remarks
+:p.
+There's only one font per view. All concurrent views share the same font.
+
+
+.******************************************************
+
+:h2 res=580
+width=30%
+.wpQueryFolder
+:link reftype=hd res=581
+auto dependent group=2.
+:p.
+:link reftype=hd res=581.Syntax:elink.
+.br
+:link reftype=hd res=583 dependent.Returns:elink.
+.*.br
+.*:link reftype=hd res=314 dependent.Remarks:elink.
+.*.br
+.*:link reftype=hd res=315.Usage:elink.
+.*.br
+.*:link reftype=hd res=416 dependent.Example:elink.
+
+:h2 res=581
+x=30%
+width=70%
+hide
+group=2
+.wpQueryFolder - Syntax
+:xmp.
+/* Query the folder an  objects resides in */
+
+theObject         /* A WPS object  */
+:p.
+theFolder=MFldrCallWPSFunc("wpQueryFolder", 
+                         theObject);
+:exmp.
+
+
+:h2 res=583
+x=30%
+width=70% height=55%
+group=3
+hide
+.wpQueryFolder - Return value
+:p.
+:hp2.theFolder:ehp2. numeric
+:p.
+The return value is the folder a given object resides in. The pointer
+may be used with other methods.
+
+
+.******************************************************
+
+:h2 res=590
+width=30%
+.wpQueryHandle
+:link reftype=hd res=591
+auto dependent group=2.
+:p.
+:link reftype=hd res=591.Syntax:elink.
+.br
+:link reftype=hd res=593 dependent.Returns:elink.
+.*.br
+.*:link reftype=hd res=314 dependent.Remarks:elink.
+.*.br
+.*:link reftype=hd res=315.Usage:elink.
+.*.br
+.*:link reftype=hd res=416 dependent.Example:elink.
+
+:h2 res=591
+x=30%
+width=70%
+hide
+group=2
+.wpQueryHandle - Syntax
+:xmp.
+/* Query the persistent handle of an object */
+
+theObject         /* A WPS object  */
+:p.
+handle=MFldrCallWPSFunc("wpQueryHandle", 
+                         theObject);
+:exmp.
+
+
+:h2 res=593
+x=30%
+width=70% height=55%
+group=3
+hide
+.wpQueryHandle - Return value
+:p.
+:hp2.handle:ehp2. numeric
+:p.
+The return value is a persistent handle to the given object. This
+handle is unique on the system.
+
+
+.******************************************************
+
+:h2 res=600
+width=30%
+.wpQueryObjectID
+:link reftype=hd res=601
+auto dependent group=2.
+:p.
+:link reftype=hd res=601.Syntax:elink.
+.br
+:link reftype=hd res=603 dependent.Returns:elink.
+.*.br
+.*:link reftype=hd res=314 dependent.Remarks:elink.
+.*.br
+.*:link reftype=hd res=315.Usage:elink.
+.*.br
+.*:link reftype=hd res=416 dependent.Example:elink.
+
+:h2 res=601
+x=30%
+width=70%
+hide
+group=2
+.wpQueryObjectID - Syntax
+:xmp.
+/* Query the ID of an object */
+
+theObject         /* A WPS object  */
+:p.
+id=MFldrCallWPSFunc("wpQueryObjectID", 
+                         theObject);
+:exmp.
+
+
+:h2 res=603
+x=30%
+width=70% height=55%
+group=3
+hide
+.wpQueryObjectID - Return value
+:p.
+:hp2.id:ehp2. string
+:p.
+The return value is the ID of the given object or NULL. This
+ID is unique on the system for example <WP_DESKTOP>.
+
+.******************************************************
+
+:h2 res=610
+width=30%
+.wpQueryShadowedObject
+:link reftype=hd res=611
+auto dependent group=2.
+:p.
+:link reftype=hd res=611.Syntax:elink.
+.br
+:link reftype=hd res=613 dependent.Returns:elink.
+.br
+:link reftype=hd res=614 dependent.Remarks:elink.
+.*.br
+.*:link reftype=hd res=315.Usage:elink.
+.*.br
+.*:link reftype=hd res=416 dependent.Example:elink.
+
+:h2 res=611
+x=30%
+width=70%
+hide
+group=2
+.wpQueryShadowedObject - Syntax
+:xmp.
+/* Query the object a shadow links to */
+
+theShadow         /* A shadow object  */
+fLock             /* lock flag 0/1*/
+:p.
+object=MFldrCallWPSFunc("wpQueryShadowedObject", 
+                         theShadow, fLock);
+:exmp.
+
+
+:h2 res=613
+x=30%
+width=70% height=55%
+group=3
+hide
+.wpQueryShadowedObject - Return value
+:p.
+:hp2.object:ehp2. numeric
+:p.
+The return value is the object the shadow links to.
+
+
+:h2 res=614
+x=30%
+width=70%
+hide
+group=2
+.wpQueryShadowedObject - Remarks
+:p.
+If fLock is 0 the queried object will go dormant when the object and the folder
+the object resides in are closed. Otherwise the object stays awake until a 
+wpUnlockObject call is made. Awake objects stay in memory while dormant objects release
+their resources when not longer accessed.
+
+
+.******************************************************
+
+:h2 res=620
+width=30%
+.wpQueryStyle
+:link reftype=hd res=621
+auto dependent group=2.
+:p.
+:link reftype=hd res=621.Syntax:elink.
+.br
+:link reftype=hd res=623 dependent.Returns:elink.
+.*.br
+.*:link reftype=hd res=614 dependent.Remarks:elink.
+.*.br
+.*:link reftype=hd res=315.Usage:elink.
+.*.br
+.*:link reftype=hd res=416 dependent.Example:elink.
+
+:h2 res=621
+x=30%
+width=70%
+hide
+group=2
+.wpQueryStyle - Syntax
+:xmp.
+/* Query the style of an object */
+
+theObject         /* An object  */
+:p.
+style=MFldrCallWPSFunc("wpQueryStyle", 
+                         theObject);
+:exmp.
+
+
+:h2 res=623
+x=30%
+width=70% height=55%
+group=3
+hide
+.wpQueryStyle - Return value
+:p.
+:hp2.style:ehp2. numeric
+:p.
+The return value is a bitmask of the style flags of an object.
+:ul.
+:li.OBJSTYLE_NOMOVE          2
+.br
+Object cannot be moved.
+:li.OBJSTYLE_NOLINK          4
+.br
+Shadows can't be created
+:li.OBJSTYLE_NOCOPY          8
+.br
+Object cannot be copied.
+:li.OBJSTYLE_TEMPLATE        32
+.br
+The object is a template.
+:li.OBJSTYLE_NODELETE        64
+.br
+The object cannot be deleted.
+:li.OBJSTYLE_NOPRINT         128
+.br
+The object cannot be printed.
+:li.OBJSTYLE_NODRAG          256
+.br
+The object cannot be dragged.
+:li.OBJSTYLE_NOTVISIBLE      512
+.br
+The object is hidden.
+:li.OBJSTYLE_NOSETTINGS      1024
+.br
+There're not settings for this object.
+:li.OBJSTYLE_NORENAME        2048
+.br
+The object cannot be renamed.
+:li.OBJSTYLE_NODROPON        8192
+.br
+Other objects can't be dropped on this object.
+:li.OBJSTYLE_CUSTOMICON      16384
+.br
+Icon is destroyed when object goes dormant. 
+:eul.
+
+.******************************************************
+
+:h2 res=630
+width=30%
+.wpQueryTitle
+:link reftype=hd res=631
+auto dependent group=2.
+:p.
+:link reftype=hd res=631.Syntax:elink.
+.br
+:link reftype=hd res=633 dependent.Returns:elink.
+.br
+:link reftype=hd res=634 dependent.Remarks:elink.
+.*.br
+.*:link reftype=hd res=315.Usage:elink.
+.*.br
+.*:link reftype=hd res=416 dependent.Example:elink.
+
+:h2 res=631
+x=30%
+width=70%
+hide
+group=2
+.wpQueryTitle - Syntax
+:xmp.
+/* Query the title of an object */
+
+theObject         /* An object  */
+:p.
+title=MFldrCallWPSFunc("wpQueryTitle", 
+                         theObject);
+:exmp.
+
+
+:h2 res=633
+x=30%
+width=70% height=55%
+group=3
+hide
+.wpQueryTitle - Return value
+:p.
+:hp2.title:ehp2. string
+:p.
+This call returns the title of the object as a string.
+
+:h2 res=634
+x=30%
+width=70%
+hide
+group=2
+.wpQueryTitle - Remarks
+:p.
+The title may differ from the real name of an object. For example
+FAT-drives don't support long file names but the WPS may take
+them from the EAs.
+
+
+.******************************************************
+
+:h2 res=640
+width=30%
+.wpQueryType
+:link reftype=hd res=641
+auto dependent group=2.
+:p.
+:link reftype=hd res=641.Syntax:elink.
+.br
+:link reftype=hd res=643 dependent.Returns:elink.
+.*.br
+.*:link reftype=hd res=634 dependent.Remarks:elink.
+.*.br
+.*:link reftype=hd res=315.Usage:elink.
+.*.br
+.*:link reftype=hd res=416 dependent.Example:elink.
+
+:h2 res=641
+x=30%
+width=70%
+hide
+group=2
+.wpQueryType - Syntax
+:xmp.
+/* Query the type of an object */
+
+theObject         /* An object  */
+:p.
+type=MFldrCallWPSFunc("wpQueryType", 
+                         theObject);
+:exmp.
+
+
+:h2 res=643
+x=30%
+width=70% height=55%
+group=3
+hide
+.wpQueryType - Return value
+:p.
+:hp2.type:ehp2. string
+:p.
+The return string contains a list of types delimited with linefeed characters.
+For example :hp2.Plain Text\nC Code:ehp2..
+
+.******************************************************
+
+:h2 res=650
+width=30%
+.wpRefresh
+:link reftype=hd res=651
+auto dependent group=2.
+:p.
+:link reftype=hd res=651.Syntax:elink.
+.br
+:link reftype=hd res=653 dependent.Returns:elink.
+.*.br
+.*:link reftype=hd res=634 dependent.Remarks:elink.
+.*.br
+.*:link reftype=hd res=315.Usage:elink.
+.*.br
+.*:link reftype=hd res=416 dependent.Example:elink.
+
+:h2 res=651
+x=30%
+width=70%
+hide
+group=2
+.wpRefresh - Syntax
+:xmp.
+/* Force a file system object to reread its information */
+
+theObject         /* A file system object */
+view              /* The view to be refreshed (OPEN_CONTENTS, OPEN_TREE, OPEN_DETAILS or any other defined view) */
+reserved          /* reserved parameter, must be 0 */
+:p.
+rc=MFldrCallWPSFunc("wpRefresh", 
+                         theObject, view, reserved);
+:exmp.
+
+
+:h2 res=653
+x=30%
+width=70% height=55%
+group=3
+hide
+.wpRefresh - Return value
+:p.
+:hp2.rc:ehp2. numeric
+:p.
+Returns 0 if an error occurs.
+
+
+.******************************************************
+
+:h2 res=660
+width=30%
+.wpSaveDeferred
+:link reftype=hd res=661
+auto dependent group=2.
+:p.
+:link reftype=hd res=661.Syntax:elink.
+.br
+:link reftype=hd res=663 dependent.Returns:elink.
+.br
+:link reftype=hd res=664 dependent.Remarks:elink.
+.*.br
+.*:link reftype=hd res=315.Usage:elink.
+.*.br
+.*:link reftype=hd res=416 dependent.Example:elink.
+
+:h2 res=661
+x=30%
+width=70%
+hide
+group=2
+.wpSaveDeferred - Syntax
+:xmp.
+/* Save the instance data of an object asynchronously */
+
+theObject         /* A WPS object */
+:p.
+rc=MFldrCallWPSFunc("wpSaveDeferred", 
+                         theObject);
+:exmp.
+
+
+:h2 res=663
+x=30%
+width=70% height=55%
+group=3
+hide
+.wpSaveDeferred - Return value
+:p.
+:hp2.rc:ehp2. numeric
+:p.
+Returns 0 if an error occurs.
+
+
+:h2 res=664
+x=30%
+width=70%
+hide
+group=2
+.wpSaveDeferred - Remarks
+:p.
+The instance data is saved on a separate thread in the background when the system is idle.
+If it's necessary to save critical data immediately use wpSaveImmediate.
+
+
+
+:h2 res=670
+width=30%
+.wpSaveImmediate
+:link reftype=hd res=671
+auto dependent group=2.
+:p.
+:link reftype=hd res=671.Syntax:elink.
+.br
+:link reftype=hd res=673 dependent.Returns:elink.
+.br
+:link reftype=hd res=674 dependent.Remarks:elink.
+.*.br
+.*:link reftype=hd res=315.Usage:elink.
+.*.br
+.*:link reftype=hd res=416 dependent.Example:elink.
+
+:h2 res=671
+x=30%
+width=70%
+hide
+group=2
+.wpSaveImmediate - Syntax
+:xmp.
+/* Save the instance data of an object synchronously */
+
+theObject         /* A WPS object */
+:p.
+rc=MFldrCallWPSFunc("wpSaveImmediate", 
+                         theObject);
+:exmp.
+
+
+:h2 res=673
+x=30%
+width=70% height=55%
+group=3
+hide
+.wpSaveImmediate - Return value
+:p.
+:hp2.rc:ehp2. numeric
+:p.
+Returns 0 if an error occurs.
+
+
+:h2 res=674
+x=30%
+width=70%
+hide
+group=2
+.wpSaveImmediate - Remarks
+:p.
+The instance data is saved immediate when calling this method. In general
+wpSaveDeferred should be used because when using that method the data is written
+when the system is idle.
+
+.******************************************************
+
+:h2 res=680
+width=30%
+.wpSetDefaultView
+:link reftype=hd res=681
+auto dependent group=2.
+:p.
+:link reftype=hd res=681.Syntax:elink.
+.br
+:link reftype=hd res=683 dependent.Returns:elink.
+.br
+:link reftype=hd res=684 dependent.Remarks:elink.
+.*.br
+.*:link reftype=hd res=315.Usage:elink.
+.*.br
+.*:link reftype=hd res=416 dependent.Example:elink.
+
+:h2 res=681
+x=30%
+width=70%
+hide
+group=2
+.wpSetDefaultView - Syntax
+:xmp.
+/* Set the default view of an object */
+
+theObject         /* A WPS object */#
+view              /* The new default view */
+:p.
+rc=MFldrCallWPSFunc("wpSetDefaultView", 
+                         theObject, view);
+:exmp.
+
+
+:h2 res=683
+x=30%
+width=70% height=55%
+group=3
+hide
+.wpSetDefaultView - Return value
+:p.
+:hp2.rc:ehp2. numeric
+:p.
+Returns 0 if an error occurs.
+
+
+:h2 res=684
+x=30%
+width=70%
+hide
+group=2
+.wpSetDefaultView - Remarks
+:p.
+The object may be set to one of the following views.
+
+:ul.
+:li.OPEN_CONTENTS: 1
+.br
+Open in contents view (icon).
+:li.OPEN_DEFAULT:  0
+.br
+Same as doubleclick.
+:li.OPEN_DETAILS:  102
+.br
+Details view.
+:li.OPEN_HELP:     3  
+.br
+Display the help panel.
+:li.OPEN_RUNNING:  4  
+.br
+Execute the object.
+:li.OPEN_SETTINGS: 2  
+.br
+Open the settings of the object.
+:li.OPEN_TREE:     101
+.br
+Unknown view.
+:li.OPEN_USER:     0x6500 or higher
+.br
+A user view introduced by a subclass.
+:eul.
+
+
+.******************************************************
+
+:h2 res=690
+width=30%
+.wpSetLinkToObject
+:link reftype=hd res=681
+auto dependent group=2.
+:p.
+:link reftype=hd res=691.Syntax:elink.
+.br
+:link reftype=hd res=693 dependent.Returns:elink.
+.*.br
+.*:link reftype=hd res=684 dependent.Remarks:elink.
+.*.br
+.*:link reftype=hd res=315.Usage:elink.
+.*.br
+.*:link reftype=hd res=416 dependent.Example:elink.
+
+:h2 res=691
+x=30%
+width=70%
+hide
+group=2
+.wpSetLinkToObject - Syntax
+:xmp.
+/* This method links the shadow to 
+   the specified object */
+
+theShadow
+theObject         /* A WPS object to link to */
+:p.
+rc=MFldrCallWPSFunc("wpSetLinkToObject", 
+                     theShadow, theObject);
+:exmp.
+
+
+:h2 res=693
+x=30%
+width=70% height=55%
+group=3
+hide
+.wpSetLinkToObject - Return value
+:p.
+:hp2.rc:ehp2. numeric
+:p.
+Returns 0 if an error occurs.
+
+
+.******************************************************
+
+:h2 res=700
+width=30%
+.wpSetStyle
+:link reftype=hd res=701
+auto dependent group=2.
+:p.
+:link reftype=hd res=701.Syntax:elink.
+.br
+:link reftype=hd res=703 dependent.Returns:elink.
+.br
+:link reftype=hd res=704 dependent.Remarks:elink.
+.*.br
+.*:link reftype=hd res=315.Usage:elink.
+.*.br
+.*:link reftype=hd res=416 dependent.Example:elink.
+
+:h2 res=701
+x=30%
+width=70%
+hide
+group=2
+.wpSetStyle - Syntax
+:xmp.
+/* Set the style of an object */
+
+theObject     /* A WPS object */
+newStyle      /* The new style of the object */
+:p.
+rc=MFldrCallWPSFunc("wpSetStyle", 
+                     theObject, newStyle);
+:exmp.
+
+
+:h2 res=703
+x=30%
+width=70% height=55%
+group=3
+hide
+.wpSetStyle - Return value
+:p.
+:hp2.rc:ehp2. numeric
+:p.
+Returns 0 if an error occurs.
+
+:h2 res=704
+x=30%
+width=70%
+hide
+group=2
+.wpSetStyle - Remarks
+:p.
+The following flags may be ored together.
+:ul.
+:li.OBJSTYLE_NOMOVE          2
+.br
+Object cannot be moved.
+:li.OBJSTYLE_NOLINK          4
+.br
+Shadows can't be created
+:li.OBJSTYLE_NOCOPY          8
+.br
+Object cannot be copied.
+:li.OBJSTYLE_TEMPLATE        32
+.br
+The object is a template.
+:li.OBJSTYLE_NODELETE        64
+.br
+The object cannot be deleted.
+:li.OBJSTYLE_NOPRINT         128
+.br
+The object cannot be printed.
+:li.OBJSTYLE_NODRAG          256
+.br
+The object cannot be dragged.
+:li.OBJSTYLE_NOTVISIBLE      512
+.br
+The object is hidden.
+:li.OBJSTYLE_NOSETTINGS      1024
+.br
+There're not settings for this object.
+:li.OBJSTYLE_NORENAME        2048
+.br
+The object cannot be renamed.
+:li.OBJSTYLE_NODROPON        8192
+.br
+Other objects can't be dropped on this object.
+:li.OBJSTYLE_CUSTOMICON      16384
+.br
+Icon is destroyed when object goes dormant. 
+:eul.
+
Index: /tags/CWMM-0.3.0_GA/mediafolder/prog_tutorial/ru/hiddenfeatures_ru.inc
===================================================================
--- /tags/CWMM-0.3.0_GA/mediafolder/prog_tutorial/ru/hiddenfeatures_ru.inc	(revision 213)
+++ /tags/CWMM-0.3.0_GA/mediafolder/prog_tutorial/ru/hiddenfeatures_ru.inc	(revision 213)
@@ -0,0 +1,254 @@
+:h2 res=410
+x=50% width=50%
+group=2
+. ¬¥­   ã€š®¯«¥¥à 
+:p.
+ã€š®¯«¥¥à ¯® ã¬®«ç ­šî, ¯®áâ ¢«ï¥¬ë© á MMOS2, ¬®Š­® § ¬¥­šâì €®¡ ¢š¢ á«¥€ãîéš©
+ª«îç ¢ OS2.INI:
+:p.
+:hp2.CWMM->audioplayer-><¯ãâì ª ­®¢®¬ã ¯à®š£àë¢ â¥«î>:ehp2.
+:nt. ¬ ­¥ ­ãŠ­® ãª §ë¢ âì ¯®«­ë© ¯ãâì, ¥á«š ¯à®£à ¬¬  ­ å®€šâáï ¢ PATH.
+à®£à ¬¬  €®«Š­  ¡ëâì ¯à®£à ¬¬®© PM!
+:ent.
+:p.
+ Š¥ ¥á«š ­®¢ ï ¯à®£à ¬¬  ­¥ ãª § ­  ¢ ä ©«¥ INI, ª« ááë ã«ãçè îâ ¯®¢¥€¥­š¥ ¯®
+ã¬®«ç ­šî, ­¥ § ¯ãáª ï ¯à®š£àë¢ â¥«ì ª ª ç áâì ¯à®æ¥áá  WPS. ®íâ®¬ã, ¥á«š
+¢ ¯«¥¥à¥ ¯à®šáå®€šâ á¡®©, WPS ¡®«ìè¥ ­¥ ¢ëå®€šâ š§ áâà®ï.
+
+
+:h2 res=411
+x=50% width=50%
+group=2
+. ¬¥­   ã€š®à¥€ ªâ®à 
+:p.
+ã€š®à¥€ ªâ®à ¯® ã¬®«ç ­šî, ¯®áâ ¢«ï¥¬ë© á MMOS2, ¬®Š­® § ¬¥­šâì €®¡ ¢š¢
+á«¥€ãîéš© ª«îç ¢ OS2.INI:
+:p.
+:hp2.CWMM->audioeditor-><¯ãâì ª ­®¢®¬ã à¥€ ªâ®àã>:ehp2.
+:nt. ¬ ­¥ ­ãŠ­® ãª §ë¢ âì ¯®«­ë© ¯ãâì, ¥á«š ¯à®£à ¬¬  ­ å®€šâáï ¢ PATH.
+à®£à ¬¬  €®«Š­  ¡ëâì ¯à®£à ¬¬®© PM!
+:ent.
+:p.
+ Š¥ ¥á«š ­®¢ ï ¯à®£à ¬¬  ­¥ ãª § ­  ¢ ä ©«¥ INI, ª« ááë ã«ãçè îâ ¯®¢¥€¥­š¥ ¯®
+ã¬®«ç ­šî, ­¥ § ¯ãáª ï à¥€ ªâ®à ª ª ç áâì ¯à®æ¥áá  WPS. ®íâ®¬ã, ¥á«š ¢
+à¥€ ªâ®à¥ ¯à®šáå®€šâ á¡®©, WPS ¡®«ìè¥ ­¥ ¢ëå®€šâ š§ áâà®ï. 
+
+
+:h2 res=412
+x=50% width=50%
+group=2
+. ¬¥­  AVI-¯«¥¥à 
+:p.
+AVI-¯«¥¥à ¯® ã¬®«ç ­šî, ¯®áâ ¢«ï¥¬ë© á MMOS2, ¬®Š­® § ¬¥­šâì €®¡ ¢š¢ á«¥€ãîéš©
+ª«îç ¢ OS2.INI:
+:p.
+:hp2.CWMM->aviplayer-><¯ãâì ª ­®¢®¬ã ¯à®š£àë¢ â¥«î>:ehp2.
+:nt. ¬ ­¥ ­ãŠ­® ãª §ë¢ âì ¯®«­ë© ¯ãâì, ¥á«š ¯à®£à ¬¬  ­ å®€šâáï ¢ PATH.
+à®£à ¬¬  €®«Š­  ¡ëâì ¯à®£à ¬¬®© PM!
+:ent.
+:p.
+ Š¥ ¥á«š ­®¢ ï ¯à®£à ¬¬  ­¥ ãª § ­  ¢ ä ©«¥ INI, ª« ááë ã«ãçè îâ ¯®¢¥€¥­š¥ ¯®
+ã¬®«ç ­šî, ­¥ § ¯ãáª ï ¯à®š£àë¢ â¥«ì ª ª ç áâì ¯à®æ¥áá  WPS. ®íâ®¬ã, ¥á«š
+¢ ¯«¥¥à¥ ¯à®šáå®€šâ á¡®©, WPS ¡®«ìè¥ ­¥ ¢ëå®€šâ š§ áâà®ï.
+
+
+:h2 res=413
+x=50% width=50%
+group=2
+. ¬¥­  MPG-¯«¥¥à 
+:p.
+MPG-¯«¥¥à ¯® ã¬®«ç ­šî, ¯®áâ ¢«ï¥¬ë© á MMOS2, ¬®Š­® § ¬¥­šâì €®¡ ¢š¢ á«¥€ãîéš©
+ª«îç ¢ OS2.INI:
+:p.
+:hp2.CWMM->mpgplayer-><¯ãâì ª ­®¢®¬ã ¯à®š£àë¢ â¥«î>:ehp2.
+:nt. ¬ ­¥ ­ãŠ­® ãª §ë¢ âì ¯®«­ë© ¯ãâì, ¥á«š ¯à®£à ¬¬  ­ å®€šâáï ¢ PATH.
+à®£à ¬¬  €®«Š­  ¡ëâì ¯à®£à ¬¬®© PM!
+:ent.
+:p.
+ Š¥ ¥á«š ­®¢ ï ¯à®£à ¬¬  ­¥ ãª § ­  ¢ ä ©«¥ INI, ª« ááë ã«ãçè îâ ¯®¢¥€¥­š¥ ¯®
+ã¬®«ç ­šî, ­¥ § ¯ãáª ï ¯à®š£àë¢ â¥«ì ª ª ç áâì ¯à®æ¥áá  WPS. ®íâ®¬ã, ¥á«š
+¢ ¯«¥¥à¥ ¯à®šáå®€šâ á¡®©, WPS ¡®«ìè¥ ­¥ ¢ëå®€šâ š§ áâà®ï.
+
+
+:h2 res=419
+x=50% width=50%
+group=2
+. ¬¥­  MP3-¯«¥¥à 
+:p.
+MP3-¯«¥¥à ¯® ã¬®«ç ­šî ¬®Š­® § ¬¥­šâì, €®¡ ¢š¢ ¢ OS2.INI á«¥€ãîéš© ª«îç:
+:p.
+:hp2.CWMM->mp3player-><¯ãâì ª ­®¢®¬ã ¯à®š£àë¢ â¥«î>:ehp2.
+:nt. ¬ ­¥ ­ãŠ­® ãª §ë¢ âì ¯®«­ë© ¯ãâì, ¥á«š ¯à®£à ¬¬  ­ å®€šâáï ¢ PATH.:ent.
+:p.
+ Š¥ ¥á«š ­®¢ ï ¯à®£à ¬¬  ­¥ ãª § ­  ¢ ä ©«¥ INI, ª« ááë ã«ãçè îâ ¯®¢¥€¥­š¥ ¯®
+ã¬®«ç ­šî, ­¥ § ¯ãáª ï ¯à®š£àë¢ â¥«ì ª ª ç áâì ¯à®æ¥áá  WPS. ®íâ®¬ã, ¥á«š
+¢ ¯«¥¥à¥ ¯à®šáå®€šâ á¡®©, WPS ¡®«ìè¥ ­¥ ¢ëå®€šâ š§ áâà®ï. 
+
+
+:h2 res=422
+x=50% width=50%
+group=2
+. ¬¥­  à¥€ ªâ®à  M3U
+:p.
+¥€ ªâ®à M3U ¯® ã¬®«ç ­šî ¬®Š­® § ¬¥­šâì, €®¡ ¢š¢ ¢ OS2.INI á«¥€ãîéš© ª«îç:
+:p.
+:hp2.CWMM->m3ueditor-><¯ãâì ª ­®¢®¬ã à¥€ ªâ®àã>:ehp2.
+:nt. ¬ ­¥ ­ãŠ­® ãª §ë¢ âì ¯®«­ë© ¯ãâì, ¥á«š ¯à®£à ¬¬  ­ å®€šâáï ¢ PATH.:ent.
+
+
+:h2 res=423
+x=50% width=50%
+group=2
+. ¬¥­  M3U-¯«¥¥à 
+:p.
+M3U-¯«¥¥à ¯® ã¬®«ç ­šî ¬®Š­® § ¬¥­šâì, €®¡ ¢š¢ ¢ OS2.INI á«¥€ãîéš© ª«îç:
+:p.
+:hp2.CWMM->m3uplayer-><¯ãâì ª ­®¢®¬ã ¯à®š£àë¢ â¥«î>:ehp2.
+:nt. ¬ ­¥ ­ãŠ­® ãª §ë¢ âì ¯®«­ë© ¯ãâì, ¥á«š ¯à®£à ¬¬  ­ å®€šâáï ¢ PATH.:ent.
+:p.
+®¢¥€¥­š¥ ¯® ã¬®«ç ­šî § ª«îç ¥âáï ¢ á®§€ ­šš ­®¢®© ¯ ¯ªš ¬ã«ìâš¬¥€š  š
+§ ¯®«­¥­šš ¥ñ €®à®Šª ¬š, ãª § ­­ë¬š ¢ ä ©«¥ M3U. á¯®«ì§ãï íâã ­ áâà®©ªã,
+¬®Š­® šá¯®«ì§®¢ âì €àã£®© ¯à®š£àë¢ â¥«ì M3U. 
+
+
+:h2 res=414
+x=50% width=50%
+group=2
+. ¬¥­  à¥€ ªâ®à  š§®¡à Š¥­š©
+:p.
+¥€ ªâ®à š§®¡à Š¥­š© ¯® ã¬®«ç ­šî, ¯®áâ ¢«ï¥¬ë© á MMOS2, ¬®Š­® § ¬¥­šâì €®¡ ¢š¢
+á«¥€ãîéš© ª«îç ¢ OS2.INI:
+:p.
+:hp2.CWMM->imageeditor-><¯ãâì ª ­®¢®¬ã à¥€ ªâ®àã>:ehp2.
+:nt. ¬ ­¥ ­ãŠ­® ãª §ë¢ âì ¯®«­ë© ¯ãâì, ¥á«š ¯à®£à ¬¬  ­ å®€šâáï ¢ PATH.
+à®£à ¬¬  €®«Š­  ¡ëâì ¯à®£à ¬¬®© PM!
+:ent.
+:p.
+ Š¥ ¥á«š ­®¢ ï ¯à®£à ¬¬  ­¥ ãª § ­  ¢ ä ©«¥ INI, ª« ááë ã«ãçè îâ ¯®¢¥€¥­š¥ ¯®
+ã¬®«ç ­šî, ­¥ § ¯ãáª ï à¥€ ªâ®à ª ª ç áâì ¯à®æ¥áá  WPS. ®íâ®¬ã, ¥á«š ¢
+à¥€ ªâ®à¥ ¯à®šáå®€šâ á¡®©, WPS ¡®«ìè¥ ­¥ ¢ëå®€šâ š§ áâà®ï.
+
+
+
+:h2 res=415
+x=50% width=50%
+group=2
+.®«ãç âì (®â®¡à Š âì) á¢¥€¥­šï ®¡ š§®¡à Š¥­šïå ­  ª®¬¯ ªâ-€šáª¥
+:p.
+® ã¬®«ç ­šî š­ä®à¬ æšï ®¡ š§®¡à Š¥­šïå ­  ª®¬¯ ªâ-€šáª¥ ­¥ ¯®€€¥àŠš¢ ¥âáï.
+àšçš­  ¢ â®¬, çâ® ­  ¬¥€«¥­­ëå €šáª å €«ï á¡®à  š­ä®à¬ æšš âà¥¡ã¥âáï ®£à®¬­®¥
+ª®«šç¥áâ¢® ¢à¥¬¥­š. ë ¬®Š¥â¥ ¢ª«îçšâì ­®¢ë¥ äã­ªæšš ª« áá  €«ï ®¡à §®¢ ­ 
+ª®¬¯ ªâ-€šáª¥, €®¡ ¢š¢ á«¥€ãîéš© ª«îç ¢ OS2.INI:
+:p.
+:hp2.CWMM->useNewImgClsFeaturesOnCD->1:ehp2.
+:nt.¡ï§ â¥«ì­® á®åà ­ï©â¥ áš¬¢®«ë ¢¥àå­¥£® à¥£šáâà !:ent.
+:nt. ¬ ­¥®¡å®€š¬® ¯¥à¥§ ¯ãáâšâì WPS, çâ®¡ë íâ  ­ áâà®©ª  ¢áâã¯š«  ¢ áš«ã.:ent.
+
+
+:h2 res=416
+x=50% width=50%
+group=2
+.âª«îçšâì ®â®¡à Š¥­š¥ ¢à¥¬¥­š ¢ § £®«®¢ª å §­ çª®¢
+:p.
+àš § ¯ãáª¥  ã€š®ä ©«®¢ €¢®©­ë¬ é¥«çª®¬ ¯à®è¥€è¥¥ ¢à¥¬ï á ­ ç « 
+¢®á¯à®š§¢¥€¥­šï ®â®¡à Š ¥âáï ¢ § £®«®¢ª¥ §­ çª . â®¡ë ®âª«îçšâì íâã ­®¢ãî
+äã­ªæšî, ãáâ ­®¢šâ¥ á«¥€ãîéš© ª«îç ¢ OS2.INI:
+:p.
+:hp2.CWMM->mmClsNoExtendedIconTitles->1:ehp2.
+:nt.¡ï§ â¥«ì­® á®åà ­ï©â¥ áš¬¢®«ë ¢¥àå­¥£® à¥£šáâà !:ent.
+:nt. ¬ ­¥®¡å®€š¬® ¯¥à¥§ ¯ãáâšâì WPS, çâ®¡ë íâ  ­ áâà®©ª  ¢áâã¯š«  ¢ áš«ã.:ent.
+
+
+:h2 res=417
+x=50% width=50%
+group=2
+.âª«îçšâì ¬š£ ­š¥ í«¥¬¥­â  ã¯à ¢«¥­šï ¢®á¯à®š§¢¥€¥­š¥¬ ¢® ¢à¥¬ï ¯à®š£àë¢ ­šï
+:p.
+ ª ç¥áâ¢¥ ¢š§ã «ì­®© ®¡à â­®© á¢ï§š í«¥¬¥­âë ã¯à ¢«¥­šï ¢®á¯à®š§¢¥€¥­š¥¬
+(
+, ) ¬š£ îâ ¢® ¢à¥¬ï ¢®á¯à®š§¢¥€¥­šï €®à®Šªš. â®¡ë ®âª«îçšâì
+íâã äã­ªæšî, ãáâ ­®¢šâ¥ á«¥€ãîéš© ª«îç ¢ OS2.INI:
+:p.
+:hp2.CWMM->bNoPlayCtrlBlinking->1:ehp2.
+:nt.¡ï§ â¥«ì­® á®åà ­ï©â¥ áš¬¢®«ë ¢¥àå­¥£® à¥£šáâà !:ent.
+:nt. ¬ ­¥®¡å®€š¬® ¯¥à¥§ ¯ãáâšâì WPS, çâ®¡ë íâ  ­ áâà®©ª  ¢áâã¯š«  ¢ áš«ã.:ent.
+
+
+:h2 res=418
+x=50% width=50%
+group=2
+.¥ á®§€ ¢ âì â¥­ì €«ï è ¡«®­  Media Player
+:p.
+¥­ì è ¡«®­  ¬¥€š ¯«¥¥à  š§ ¯ ¯ªš è ¡«®­®¢ ¬ã«ìâš¬¥€š   ¢â®¬ âšç¥áªš á®§€ ñâáï
+¢ ¯ ¯ª¥ ¬ã«ìâš¬¥€š  €«ï ®¡«¥£ç¥­šï €®áâã¯ . àš ãáâ ­®¢ª¥ íâ®£® ª«îç  íâ 
+äã­ªæšï ®âª«îç ¥âáï.
+:p.
+:hp2.CWMM->bNoMediaFolderTemplateShadow->1:ehp2.
+:nt.¡ï§ â¥«ì­® á®åà ­ï©â¥ áš¬¢®«ë ¢¥àå­¥£® à¥£šáâà !:ent.
+:nt.ë ¬®Š¥â¥ ¯¥à¥¬¥áâšâì á®§€ ­­ãî â¥­ì ¢ €àã£®¥ ¬¥áâ®. ­  ¡ã€¥â ¢®áá®§€ ­ 
+¢ ¯ ¯ª¥ ¬ã«ìâš¬¥€š  â®«ìª® ¢ â®¬ á«ãç ¥, ¥á«š ¡ã€¥â ã€ «¥­  š§ ášáâ¥¬ë.
+:ent.
+
+
+:h2 res=420
+x=50% width=50%
+group=2
+.âª«îçšâì ¯à®¢¥àªã  ã€š®ä ©«®¢
+:p.
+ë ¬®Š¥â¥ ®âª«îçšâì ¯à®¢¥àªã  ã€š®ä ©«®¢ €«ï ®¯à¥€¥«ñ­­ëå €šáª®¢, €®¡ ¢š¢ ¡ãª¢ã
+€šáª  ª íâ®© § ¯šáš ¢ OS2.INI:
+:p.
+:hp2.CWMM->mmClsDontCheckDrives-><á¯šá®ª €šáª®¢>:ehp2.
+:nt.¡ï§ â¥«ì­® á®åà ­ï©â¥ áš¬¢®«ë ¢¥àå­¥£® à¥£šáâà !:ent.
+:p.
+â® ¬®Š¥â ¡ëâì ¯®«¥§­® €«ï á¥â¥¢ëå €šáª®¢ á ¬¥€«¥­­ë¬ á®¥€š­¥­š¥¬ š«š €àã£šå
+¬¥€«¥­­ëå €šáª®¢. ¡ëç­® á®¡à ­­ ï š­ä®à¬ æšï åà ­šâáï ¢ à áèšà¥­­ëå  âàš¡ãâ å
+ ã€š®ä ©« , ¯®íâ®¬ã ¯à®¢¥àª  ¯à®šáå®€šâ â®«ìª® ®€š­ à §. 
+á«š ®¯à¥€¥«ñ­­ ï
+ä ©«®¢ ï ášáâ¥¬  ­¥ ¯®€€¥àŠš¢ ¥â EA, ë ¬®Š¥â¥ €®¡ ¢šâì íâ®â €šáª ¢ á¯šá®ª,
+çâ®¡ë ¯à¥€®â¢à âšâì áª ­šà®¢ ­š¥.
+:nt.
+¬¥©â¥ ¢ ¢š€ã, çâ® WPS ­¥ ¡ã€¥â ®â®¡à Š âì  ã€š®š­ä®à¬ æšî €«ï  ã€š®®¡ê¥ªâ®¢,
+à á¯®«®Š¥­­ëå ­  €šáª¥, ãª § ­­®¬ ¢ á¯šáª¥.
+:ent.
+:nt. ¬ ­¥®¡å®€š¬® ¯¥à¥§ ¯ãáâšâì WPS, çâ®¡ë íâ  ­ áâà®©ª  ¢áâã¯š«  ¢ áš«ã.:ent.
+
+:p.
+àš¬¥à:
+:xmp.
+CWMM->mmClsDontCheckDrives->abcghzy
+:exmp.
+
+:nt.
+â®â ¯ à ¬¥âà ¢ ­ áâ®ïé¥¥ ¢à¥¬ï ¢ ®á­®¢­®¬ ãáâ à¥«, ¯®áª®«ìªã ¯à®æ¥€ãà 
+¢¢®€ -¢ë¢®€  MMIOMP3, á®€¥àŠ é ïáï ¢ :hp2.MMAudio Pak 2:ehp2. (¢ë¯ãé¥­ 30.08.2003),
+¡®«ìè¥ ­¥ áª ­šàã¥â ä ©«ë MP3,   çšâ ¥â § £®«®¢®ª Xing €«ï ä ©«®¢ á ª®€šà®¢ª®©
+VBR.
+:ent.
+
+
+:h2 res=421
+x=50% width=50%
+group=2
+.âª«îçšâì çâ¥­š¥ â¥£®¢ ID3
+:p.
+ë ¬®Š¥â¥ ®âª«îçšâì çâ¥­š¥ â¥£®¢ ID3 €«ï ®¯à¥€¥«ñ­­ëå €šáª®¢, €®¡ ¢š¢ ¡ãª¢ã
+€šáª  ª íâ®© § ¯šáš ¢ OS2.INI:
+:p.
+:hp2.CWMM->mmClsDontReadID3OnDrives-><á¯šá®ª €šáª®¢>:ehp2.
+:nt.¡ï§ â¥«ì­® á®åà ­ï©â¥ áš¬¢®«ë ¢¥àå­¥£® à¥£šáâà !:ent.
+:p.
+â® ¬®Š¥â ¡ëâì ¯®«¥§­® €«ï á¥â¥¢ëå €šáª®¢ á ¬¥€«¥­­ë¬ á®¥€š­¥­š¥¬ š«š €àã£šå
+¬¥€«¥­­ëå €šáª®¢.
+:nt.
+¬¥©â¥ ¢ ¢š€ã, çâ® WPS €«ï ä ©«®¢ MP3, à á¯®«®Š¥­­ëå ­  €šáª¥, ãª § ­­®¬ ¢
+á¯šáª¥, ­¥ ¡ã€¥â ®â®¡à Š âì š­ä®à¬ æšî â¥£  ID3.
+:ent.
+:nt. ¬ ­¥®¡å®€š¬® ¯¥à¥§ ¯ãáâšâì WPS, çâ®¡ë íâ  ­ áâà®©ª  ¢áâã¯š«  ¢ áš«ã.:ent.
+
+:p.
+àš¬¥à:
+:xmp.
+CWMM->mmClsDontReadID3OnDrives->abcghzy
+:exmp.
+
Index: /tags/CWMM-0.3.0_GA/mediafolder/prog_tutorial/ru/mediafldrprog_ru.ipf
===================================================================
--- /tags/CWMM-0.3.0_GA/mediafolder/prog_tutorial/ru/mediafldrprog_ru.ipf	(revision 213)
+++ /tags/CWMM-0.3.0_GA/mediafolder/prog_tutorial/ru/mediafldrprog_ru.ipf	(revision 213)
@@ -0,0 +1,587 @@
+:userdoc.
+
+:docprof.
+
+:title.ç¥¡­šª ¯® ¯à®£à ¬¬šà®¢ ­šî €«ï ¬ã«ìâš¬¥€š©­ëå ª« áá®¢
+
+:h1 res=100.¢¥€¥­š¥
+:p.
+Media-Folder ¯à¥€« £ ¥â €¢  š­â¥àä¥©á  €«ï ã¯à ¢«¥­šï š ¯à®£à ¬¬šà®¢ ­šï. ë
+¬®Š¥â¥ šá¯®«ì§®¢ âì :link reftype=hd res=200.áâà®ªš ­ áâà®©ªš:elink. €«ï
+®á­®¢­ëå § € ç, â ªšå ª ª § ¯ãáª š ®áâ ­®¢ª  ¢®á¯à®š§¢¥€¥­šï, š«š
+:link reftype=hd res=300.š­â¥àä¥©á REXX:elink. €«ï €®áâã¯  ª ¢­ãâà¥­­š¬ ¬¥â®€ ¬
+ª« áá .
+:p.
+«ï šá¯®«ì§®¢ ­šï š­â¥àä¥©á  REXX
+:p.
+WPS-Wizard V0.2.0 (http&colon.//www.os2world.com/cdwriting)
+:p.
+š«š ¢ëè¥ €®«Š­ë ¡ëâì ãáâ ­®¢«¥­ë.
+
+:h1 res=200
+x=left y=bottom width=50%.âà®ªš ­ áâà®©ªš
+:p.
+«¥€ãîéš¥ €®¯®«­šâ¥«ì­ë¥ áâà®ªš ­ áâà®©ªš ¯®€€¥àŠš¢ îâáï €«ï ª Š€®© ¯ ¯ªš
+¬ã«ìâš¬¥€š .
+
+:ul.
+:li.:link reftype=hd res=210.MEDIAFLDRNEXT:elink.   ®á¯à®š§¢¥áâš á«¥€ãîéš© âà¥ª ¢ ¯ ¯ª¥.
+:li.:link reftype=hd res=211.MEDIAFLDRPLAY:elink.    ç âì ¢®á¯à®š§¢¥€¥­š¥.
+:li.:link reftype=hd res=215.MEDIAFLDRPLAYFIRST:elink.    ç âì ¯¥à¢ë© âà¥ª.
+:li.:link reftype=hd res=212.MEDIAFLDRPREV:elink.   ¥à¥å®€ ª ¯à¥€ë€ãé¥¬ã âà¥ªã.
+:li.:link reftype=hd res=216.MEDIAFLDRREPEAT:elink. áâ ­®¢šâì ¯®¢â®à.
+:li.:link reftype=hd res=213.MEDIAFLDRSTOP:elink.   áâ ­®¢šâì ¢®á¯à®š§¢¥€¥­š¥.
+:li.:link reftype=hd res=214.MEDIAFLDRVOLUME:elink. áâ ­®¢šâì £à®¬ª®áâì.
+:eul.
+:p.
+ ¯ª  €®«Š­  ¡ëâì ®âªàëâ , çâ®¡ë íâš áâà®ªš ­ áâà®©ªš à ¡®â «š.
+:p.
+ã€š®ª« ááë MM ¯®€€¥àŠš¢ îâ á«¥€ãîéš¥ áâà®ªš:
+:ul.
+:li.:link reftype=hd res=220.MMAUDIOTRACKNAME:elink.   áâ ­®¢šâì ­ §¢ ­š¥ âà¥ª   ã€š®ä ©« .
+:li.:link reftype=hd res=221.MMAUDIOARTIST:elink.   áâ ­®¢šâì š¬ï šá¯®«­šâ¥«ï €«ï  ã€š®ä ©« .
+:li.:link reftype=hd res=222.MMAUDIOALBUM:elink.    áâ ­®¢šâ¥ ­ §¢ ­š¥  «ì¡®¬ .
+:li.:link reftype=hd res=223.MMAUDIOCOMMENT:elink.  áâ ­®¢šâì ª®¬¬¥­â àš© ª  ã€š®ä ©«ã.
+:li.:link reftype=hd res=224.MMAUDIOYEAR:elink.     áâ ­®¢šâì £®€  ã€š®ä ©« .
+:li.:link reftype=hd res=225.MMAUDIOGENRE:elink.    áâ ­®¢šâì Š ­à  ã€š®ä ©« .
+:li.:link reftype=hd res=226.MMREFRESH:elink.       ®¢â®à­® ¯à®çšâ âì š­ä®à¬ æšî ®¡  ã€š®ä ©«¥.
+:li.:link reftype=hd res=227.MMAUDIOCOPYTAGTO:elink.    ª®¯šà®¢ âì ¢á¥ â¥£š  ã€š®ä ©« .
+
+:eul.
+
+
+:h2 res=210
+x=50% width=50%
+group=2
+.MEDIAFLDRNEXT
+:p.
+¥à¥å®€ ª á«¥€ãîé¥¬ã âà¥ªã ¢® ¢à¥¬ï ¢®á¯à®š§¢¥€¥­šï. 
+á«š ¥éñ ­¥
+¢®á¯à®š§¢®€šâáï, ¡ã€¥â § ¯ãé¥­  ¯¥à¢ ï €®à®Šª .
+:xmp.
+/* REXX - This command skips to the next track */
+
+rc=SysSetObjectData('x&colon.\path_to_folder','MEDIAFLDRNEXT=1')
+:exmp.
+
+:h2 res=211
+x=50% width=50%
+group=2
+.MEDIAFLDRPLAY
+:p.
+ ç âì ¢®á¯à®š§¢¥€¥­š¥ á ¯¥à¢®© €®à®Šªš. 
+á«š ¢ë¡à ­  ª ª ï-«š¡® €®à®Šª ,
+¢®á¯à®š§¢¥€¥­š¥ ­ ç­ñâáï á ¯¥à¢®© ¢ë¡à ­­®© €®à®Šªš.
+:xmp.
+/* REXX - This command starts playing */
+
+rc=SysSetObjectData('x&colon.\path_to_folder','MEDIAFLDRPLAY=1')
+:exmp.
+
+:h2 res=215
+x=50% width=50%
+group=2
+.MEDIAFLDRPLAYFIRST
+:p.
+Start playing with the first track no matter if any other track is selected.
+
+:xmp.
+/* REXX - This command starts playing */
+
+rc=SysSetObjectData('x&colon.\path_to_folder','MEDIAFLDRPLAYFIRST=1')
+:exmp.
+
+:h2 res=212
+x=50% width=50%
+group=2
+.MEDIAFLDRPREV
+:p.
+¥à¥å®€ ª ¯à¥€ë€ãé¥© €®à®Šª¥ ¢® ¢à¥¬ï ¢®á¯à®š§¢¥€¥­šï.
+:xmp.
+/* REXX - This command skips to the previous track */
+
+rc=SysSetObjectData('x&colon.\path_to_folder','MEDIAFLDRPREV=1')
+:exmp.
+
+:h2 res=216
+x=50% width=50%
+group=2
+.MEDIAFLDRREPEAT
+:p.
+áâ ­®¢šâì  âàš¡ãâ ¯®¢â®à . 
+á«š ãáâ ­®¢«¥­® §­ ç¥­š¥ 1 €®à®Šªš ¢ ¯ ¯ª¥
+¯®¢â®àïîâáï. 
+á«š ãáâ ­®¢«¥­® §­ ç¥­š¥ 0 ¯®¢â®à ®âª«îçñ­.
+:xmp.
+/* REXX - This command sets repeat to yes */
+
+rc=SysSetObjectData('x&colon.\path_to_folder','MEDIAFLDRREPEAT=1')
+:exmp.
+
+:h2 res=213
+x=50% width=50%
+group=2
+.MEDIAFLDRSTOP
+:p.
+áâ ­®¢šâì ¢®á¯à®š§¢¥€¥­š¥.
+:xmp.
+/* REXX - This command stops playing */
+
+rc=SysSetObjectData('x&colon.\path_to_folder','MEDIAFLDRSTOP=1')
+:exmp.
+
+:h2 res=214
+x=50% width=50%
+group=2
+.MEDIAFLDRVOLUME
+:p.
+§¬¥­šâì £à®¬ª®áâì ®â 0 €® 100%.
+:xmp.
+/* REXX - This command sets the volume to 35% */
+
+rc=SysSetObjectData('x&colon.\path_to_folder','MEDIAFLDRVOLUME=35')
+:exmp.
+
+.********************************************
+
+:h2 res=220
+x=50% width=50%
+group=2
+.MMAUDIOTRACKNAME
+:p.
+áâ ­®¢šâì ­ §¢ ­š¥ âà¥ª   ã€š®ä ©« . â  š­ä®à¬ æšï á®åà ­ï¥âáï ¢ à áèšà¥­­ëå
+ âàš¡ãâ å ä ©« . «ï ä ©«®¢ MP3 íâ  š­ä®à¬ æšï â ªŠ¥ á®åà ­ï¥âáï ¢ â¥£¥ ID3.
+:xmp.
+/* REXX - This command adds the track name to the audio file */
+
+rc=SysSetObjectData('x&colon.\path_to_folder\audio_file.ext','MMAUDIOTRACKNAME=The track name')
+:exmp.
+
+:h2 res=221
+x=50% width=50%
+group=2
+.MMAUDIOARTIST
+:p.
+áâ ­®¢šâì š¬ï šá¯®«­šâ¥«ï  ã€š®ä ©« . â  š­ä®à¬ æšï á®åà ­ï¥âáï ¢ à áèšà¥­­ëå
+ âàš¡ãâ å ä ©« . «ï ä ©«®¢ MP3 íâ  š­ä®à¬ æšï â ªŠ¥ á®åà ­ï¥âáï ¢ â¥£¥ ID3.
+:xmp.
+/* REXX - This command adds the artist name to the audio file */
+
+rc=SysSetObjectData('x&colon.\path_to_folder\audio_file.ext','MMAUDIOARTIST=Artist name')
+:exmp.
+
+:h2 res=222
+x=50% width=50%
+group=2
+.MMAUDIOALBUM
+:p.
+áâ ­®¢šâì ­ §¢ ­š¥  «ì¡®¬ . â  š­ä®à¬ æšï á®åà ­ï¥âáï ¢ à áèšà¥­­ëå  âàš¡ãâ å
+ä ©« . «ï ä ©«®¢ MP3 íâ  š­ä®à¬ æšï â ªŠ¥ á®åà ­ï¥âáï ¢ â¥£¥ ID3.
+:xmp.
+/* REXX - This command adds the album name to the audio file */
+
+rc=SysSetObjectData('x&colon.\path_to_folder\audio_file.ext','MMAUDIOALBUM=Album name')
+:exmp.
+
+:h2 res=223
+x=50% width=50%
+group=2
+.MMAUDIOCOMMENT
+:p.
+áâ ­®¢šâì ª®¬¬¥­â àš© ª  ã€š®ä ©«ã. â  š­ä®à¬ æšï á®åà ­ï¥âáï ¢ à áèšà¥­­ëå
+ âàš¡ãâ å ä ©« . «ï ä ©«®¢ MP3 íâ  š­ä®à¬ æšï â ªŠ¥ á®åà ­ï¥âáï ¢ â¥£¥ ID3.
+:xmp.
+/* REXX - This command adds a comment to the audio file */
+
+rc=SysSetObjectData('x&colon.\path_to_folder\audio_file.ext','MMAUDIOCOMMENT=Track comment')
+:exmp.
+
+:h2 res=224
+x=50% width=50%
+group=2
+.MMAUDIOYEAR
+:p.
+áâ ­®¢šâì £®€  ã€š®ä ©« . â  š­ä®à¬ æšï á®åà ­ï¥âáï ¢ à áèšà¥­­ëå  âàš¡ãâ å
+ä ©« . «ï ä ©«®¢ MP3 íâ  š­ä®à¬ æšï â ªŠ¥ á®åà ­ï¥âáï ¢ â¥£¥ ID3.
+:xmp.
+/* REXX - This command adds the year to the audio file */
+
+rc=SysSetObjectData('x&colon.\path_to_folder\audio_file.ext','MMAUDIOYEAR=2003')
+:exmp.
+
+:h2 res=225
+x=50% width=50%
+group=2
+.MMAUDIOGENRE
+:p.
+áâ ­®¢šâì Š ­à  ã€š®ä ©« . â  š­ä®à¬ æšï á®åà ­ï¥âáï ¢ à áèšà¥­­ëå  âàš¡ãâ å
+ä ©« . «ï ä ©«®¢ MP3 íâ  š­ä®à¬ æšï â ªŠ¥ á®åà ­ï¥âáï ¢ â¥£¥ ID3.
+:xmp.
+/* REXX - This command adds the genre of the audio file */
+
+rc=SysSetObjectData('x&colon.\path_to_folder\audio_file.ext','MMAUDIOGENRE=Blues')
+:exmp.
+
+:h2 res=226
+x=50% width=50%
+group=2
+.MMREFRESH
+:p.
+®¢â®à­® ¯à®çšâ âì §¢ãª®¢ãî š­ä®à¬ æšî š§ ä ©«  š ®¡­®¢šâì ¢­ãâà¥­­š¥ € ­­ë¥
+®¡ê¥ªâ .
+:xmp.
+/* REXX - This command rereads the information of the audio file */
+
+rc=SysSetObjectData('x&colon.\path_to_folder\audio_file.ext','MMREFRESH=1')
+:exmp.
+
+:h2 res=227
+x=50% width=50%
+group=2
+.MMAUDIOCOPYTAGTO
+
+à®çšâ âì §¢ãª®¢ãî š­ä®à¬ æšî š§ â¥£  ä ©«  š áª®¯šà®¢ âì ¥ñ ¢ €àã£®© ä ©«.
+
+:xmp.
+/* REXX - This command copies the file tag information to another audio file */
+
+rc=SysSetObjectData('x&colon.\path_to_folder\audio_file.ext','MMAUDIOCOPYTAGTO=x&colon.\path_to_folder\another_file.ext')
+:exmp.
+
+
+.********************************************
+
+:h1 res=300.­â¥àä¥©á REXX
+:p.
+àš šá¯®«ì§®¢ ­šš š­â¥àä¥©á  REXX áªàš¯âë ¯®«ãç îâ €®áâã¯ ª ¬¥â®€ ¬ ª« áá 
+¯ ¯ªš ¬ã«ìâš¬¥€š . ®€€¥àŠª  ­ š¡®«¥¥ ¢ Š­ëå ¬¥â®€®¢ WPS, ¢á¯®¬®£ â¥«ì­ëå
+äã­ªæš© š ­¥ª®â®àëå ®ª®­­ëå äã­ªæš© PM ®¡¥á¯¥çš¢ ¥âáï WPS-Wizard.
+
+:p.
+¥â®€ë ¯ ¯ªš ¬ã«ìâš¬¥€š  ¢ë§ë¢ îâáï á ¯®¬®éìî äã­ªæšš-®¡®«®çªš.
+
+:table cols='20 35'.
+:row.
+:c.:link reftype=hd res=320.MFldrCallFunc:elink.
+:c.ë§®¢ ¬¥â®€®¢ ¯à¥€áâ ¢«¥­­ëå ¯ ¯ª®© ¬ã«ìâš¬¥€š .
+:etable.
+:p.
+¥â®€ë, ¢¢¥€ñ­­ë¥ ¬ã«ìâš¬¥€š©­ë¬š ª« áá ¬š, ¢ë§ë¢ îâáï á ¯®¬®éìî á«¥€ãîé¥©
+äã­ªæšš.
+:table cols='20 35'.
+:row.
+:c.:link reftype=hd res=330.MMCallFunc:elink.
+:c.ë§®¢ ¬¥â®€®¢ ¯à¥€áâ ¢«¥­­ëå ¬ã«ìâš¬¥€š©­ë¬š ª« áá ¬š (CWAudio, CWMP3, CWOGG).
+:etable.
+
+:p.
+æ¥­ àš© à ¡®â ¥â ¢ ª®­â¥ªáâ¥ WPS, ª®â®àë© ï¢«ï¥âáï ¯à®£à ¬¬®© PM ¢ ®â€¥«ì­®¬
+¯®â®ª¥. ë ¬®Š¥â¥ šá¯®«ì§®¢ âì €®¯®«­šâ¥«ì­ë¥ ¡š¡«š®â¥ªš REXX. ¬ï áªàš¯â 
+REXX ­¥ š¬¥¥â §­ ç¥­šï, ­® ä ©«, ª ª ®¡ëç­®, €®«Š¥­ ­ çš­ âìáï á ª®¬¬¥­â àšï.
+
+.*************************************
+
+.***********************************************
+
+:h2 res=320
+width=30%
+.MFldrCallFunc
+:link reftype=hd res=321
+auto dependent group=2.
+:p.
+á¯®«ì§ã©â¥ íâã äã­ªæšî €«ï ¢ë§®¢  ®€­®£® š§ ­®¢ëå ¬¥â®€®¢ ¯ ¯ªš ¬ã«ìâš¬¥€š 
+š«š ¢á¯®¬®£ â¥«ì­®£® ¬¥â®€ .
+:p.
+:link reftype=hd res=321 dependent.š­â ªášá:elink.
+.*.br
+.*:link reftype=hd res=322. à ¬¥âàë:elink.
+.br
+:link reftype=hd res=323 dependent.®§¢à é ¥¬®¥ §­ ç¥­š¥:elink.
+.br
+:link reftype=hd res=324 dependent.®¬¬¥­â àšš:elink.
+.*.br
+.*:link reftype=hd res=325.á¯®«ì§®¢ ­š¥:elink.
+.br
+:link reftype=hd res=326.àš¬¥à:elink.
+
+:h2 res=321
+x=30%
+width=70%
+group=2
+hide
+.MFldrCallFunc - š­â ªášá
+:xmp.
+/* Call a method from REXX */
+
+methodName  /* The name of a method */
+Object         /* Object on which the method is invoked */
+param1         /* First method parameter */
+param2         /* Second method parameter */
+:p.
+rc=MFldrCallFunc(methodName, Object,
+                 param1, param2, ...);
+:exmp.
+
+
+:h2 res=322
+x=30%
+width=70%
+group=2
+hide
+.MFldrCallFunc -  à ¬¥âàë
+:p.
+
+:h2 res=323
+x=30%
+width=70% height=35%
+group=3
+hide
+.MFldrCallFunc - ®§¢à é ¥¬®¥ §­ ç¥­š¥
+:p.
+®§¢à é ¥¬®¥ §­ ç¥­š¥ § ¢šášâ ®â ¢ë§ë¢ ¥¬®£® ¬¥â®€ . â® ¬®Š¥â ¡ëâì áâà®ª  š«š
+çšá«®¢®¥ §­ ç¥­š¥. ¬®âàšâ¥ ®¯šá ­š¥ ¬¥â®€  €«ï ¯®«ãç¥­šï €®¯®«­šâ¥«ì­®©
+š­ä®à¬ æšš.
+:p.
+
+á«š ¬¥â®€ ­¥ ¬®Š¥â ¡ëâì ­ ©€¥­, ¢®§¢à é ¥âáï áâà®ª  :hp2.ERROR_METHOD&colon.:ehp2..
+
+:h2 res=324
+x=30%
+width=70%
+group=2
+hide
+.MFldrCallFunc - ®¬¬¥­â àšš
+:p.
+ë§ë¢ ¥¬ë© ¬¥â®€ €®«Š¥­ ¡ëâì ç«¥­®¬ ®¡ê¥ªâ  :hp2.Object:ehp2. èš¡ª  ¢®§­šª ¥â,
+¥á«š ®¡ê¥ªâ ­¥ ¯®€€¥àŠš¢ ¥â § ¯à®è¥­­ë© ¬¥â®€.  ¯àš¬¥à, ®¡ê¥ªâ CWMediaFolder
+­¥ ¯®€€¥àŠš¢ ¥â â¥ Š¥ ¬¥â®€ë, çâ® š ®¡ê¥ªâ CWAudio.
+
+:h2 res=325
+x=30%
+width=70%
+group=2
+hide
+.MFldrCallFunc - á¯®«ì§®¢ ­š¥
+:p.
+
+:h2 res=326
+x=30%
+width=70%
+group=2
+hide
+.MFldrCallFunc - àš¬¥à
+:xmp.
+/* This example queries the first object in  */
+/* a CWMediaFolder, gets the linked file and */
+/* queries the name of the artist from the   */
+/* ID3 tag.                                  */
+
+/* Get the first object of folder theFolder */
+theObject=MFldrCallWPSFunc("wpQueryContent", theFolder, 0, QC_FIRST)
+
+/* Get the linked file system object from the shadow.
+   cwGetFileSystemObject is a member of the
+   CWMediaFolder class. */
+theFileObj=MFldrCallFunc("cwGetFileSystemObject", theFolder, theObject)
+
+/* Get the artist name. cwmmQueryTrackInfo is a member of the
+   CWAudio class. Every object in the CWMediaFolder is usually
+   a shadow to an object instance of a subclass of CWAudio */
+theName=MFldrCallFunc("cwmmQueryTrackInfo", theFileObj, 2)
+
+/* Display the name */
+rc=RxMessageBox("The artist name : "||theName)
+:exmp.
+
+.*********************************************
+.***********************************************
+
+:h2 res=330
+width=30%
+.MMCallFunc
+:link reftype=hd res=331
+auto dependent group=2.
+:p.
+á¯®«ì§ã©â¥ íâã äã­ªæšî €«ï ¢ë§®¢  ®€­®£® š§ ­®¢ëå ¬¥â®€®¢ ¬ã«ìâš¬¥€š©­®£®
+ª« áá , ¯à¥€áâ ¢«¥­­ëå ¢ :hp2.CWAudio/MMAudio:ehp2..
+:p.
+:link reftype=hd res=331 dependent.š­â ªášá:elink.
+.*.br
+.*:link reftype=hd res=332. à ¬¥âàë:elink.
+.br
+:link reftype=hd res=333 dependent.®§¢à é ¥¬®¥ §­ ç¥­š¥:elink.
+.br
+:link reftype=hd res=334 dependent.®¬¬¥­â àšš:elink.
+.*.br
+.*:link reftype=hd res=335.á¯®«ì§®¢ ­š¥:elink.
+.br
+:link reftype=hd res=336.àš¬¥à:elink.
+
+:h2 res=331
+x=30%
+width=70%
+group=2
+hide
+.MMCallFunc - š­â ªášá
+:xmp.
+/* Call a method from REXX */
+
+methodName  /* The name of a method */
+Object         /* Object on which the method is invoked */
+param1         /* First method parameter */
+param2         /* Second method parameter */
+:p.
+rc=MMCallFunc(methodName, Object,
+                 param1, param2, ...);
+:exmp.
+
+
+:h2 res=332
+x=30%
+width=70%
+group=2
+hide
+.MMCallFunc -  à ¬¥âàë
+:p.
+
+:h2 res=333
+x=30%
+width=70% height=35%
+group=3
+hide
+.MMCallFunc - ®§¢à é ¥¬®¥ §­ ç¥­š¥
+:p.
+®§¢à é ¥¬®¥ §­ ç¥­š¥ § ¢šášâ ®â ¢ë§ë¢ ¥¬®£® ¬¥â®€ . â® ¬®Š¥â ¡ëâì áâà®ª  š«š
+çšá«®¢®¥ §­ ç¥­š¥. ¬®âàšâ¥ ®¯šá ­š¥ ¬¥â®€  €«ï ¯®«ãç¥­šï €®¯®«­šâ¥«ì­®©
+š­ä®à¬ æšš.
+:p.
+
+á«š ¬¥â®€ ­¥ ¬®Š¥â ¡ëâì ­ ©€¥­, ¢®§¢à é ¥âáï áâà®ª  :hp2.ERROR_METHOD&colon.:ehp2..
+
+:h2 res=334
+x=30%
+width=70%
+group=2
+hide
+.MMCallFunc - ®¬¬¥­â àšš
+:p.
+ë§ë¢ ¥¬ë© ¬¥â®€ €®«Š¥­ ¡ëâì ç«¥­®¬ ®¡ê¥ªâ  :hp2.Object:ehp2. èš¡ª  ¢®§­šª ¥â,
+¥á«š ®¡ê¥ªâ ­¥ ¯®€€¥àŠš¢ ¥â § ¯à®è¥­­ë© ¬¥â®€.  ¯àš¬¥à, ®¡ê¥ªâ CWMediaFolder
+­¥ ¯®€€¥àŠš¢ ¥â â¥ Š¥ ¬¥â®€ë, çâ® š ®¡ê¥ªâ CWAudio.
+:p.
+ ¯à¥€ë€ãéšå ¢¥àášïå ª« áá®¢ íâ  äã­ªæšï ­ §ë¢ « áì :hp2.MMClsCallFunc:ehp2..
+â® š¬ï ¢áñ ¥éñ ¯®€€¥àŠš¢ ¥âáï, ­® ãáâ à¥«®.
+
+:h2 res=335
+x=30%
+width=70%
+group=2
+hide
+.MMCallFunc - á¯®«ì§®¢ ­š¥
+:p.
+
+:h2 res=336
+x=30%
+width=70%
+group=2
+hide
+.MMCallFunc - àš¬¥à
+:xmp.
+/* This example queries the first object in  */
+/* a CWMediaFolder, gets the linked file and */
+/* queries the name of the artist from the   */
+/* ID3 tag.                                  */
+
+/* Get the first object of folder theFolder */
+theObject=WPSWizCallWPSFunc("wpQueryContent", theFolder, 0, QC_FIRST)
+
+/* Get the linked file system object from the shadow.
+   cwGetFileSystemObject is a member of the
+   CWMediaFolder class. */
+theFileObj=MFldrCallFunc("cwGetFileSystemObject", theFolder, theObject)
+
+/* Get the artist name. cwmmQueryTrackInfo is a member of the
+   CWAudio class. Every object in the CWMediaFolder is usually
+   a shadow to an object instance of a subclass of CWAudio */
+theName=MMCallFunc("cwmmQueryTrackInfo", theFileObj, 2)
+
+/* Display the name */
+rc=RxMessageBox("The artist name : "||theName)
+:exmp.
+
+
+.im ru\wpsmethods_ru.inc
+
+:h1 res=400
+x=left y=bottom width=50%.ªàëâë¥ äã­ªæšš
+:p.
+«¥€ãîéš¥ äã­ªæšš ª« áá®¢ CW-¬ã«ìâš¬¥€š  ¬®Š­® ¢ª«îçšâì, ãáâ ­®¢š¢
+á®®â¢¥âáâ¢ãîéš¥ §­ ç¥­šï ¢ :hp2.OS2.INI:ehp2..
+:ul.
+:li.:link reftype=hd res=410. ¬¥­   ã€š®¯«¥¥à :elink.
+:li.:link reftype=hd res=411. ¬¥­   ã€š®à¥€ ªâ®à :elink.
+:li.:link reftype=hd res=412. ¬¥­  AVI-¯«¥¥à :elink.
+:li.:link reftype=hd res=413. ¬¥­  MPG-¯«¥¥à :elink.
+:li.:link reftype=hd res=419. ¬¥­  MP3-¯«¥¥à :elink.
+:li.:link reftype=hd res=414. ¬¥­  à¥€ ªâ®à  š§®¡à Š¥­š©:elink.
+:li.:link reftype=hd res=415.®«ãç âì á¢¥€¥­šï ®¡ š§®¡à Š¥­šïå ­  CD:elink.
+:li.:link reftype=hd res=416.âª«îçšâì ®â®¡à Š¥­š¥ ¢à¥¬¥­š ¢ §­ çª å:elink.
+:li.:link reftype=hd res=417.âª«îçšâì ¬š£ ­š¥ í«¥¬¥­â  ã¯à ¢«¥­šï:elink.
+:li.:link reftype=hd res=418.¥ á®§€ ¢ âì â¥­ì €«ï è ¡«®­  Media Player:elink.
+:li.:link reftype=hd res=420.âª«îçšâì ¯à®¢¥àªã  ã€š®ä ©«®¢:elink.
+:li.:link reftype=hd res=421.âª«îçšâì çâ¥­š¥ â¥£®¢ ID3:elink.
+:li.:link reftype=hd res=422. ¬¥­  à¥€ ªâ®à  M3U:elink.
+:li.:link reftype=hd res=423. ¬¥­  M3U-¯«¥¥à :elink.
+:eul.
+
+.im ru\hiddenfeatures_ru.inc
+
+:h1 res=500. áèšà¥­­ë¥  âàš¡ãâë
+:p.
+­ä®à¬ æšï ®¡  ã€š®ä ©« å åà ­šâáï ¢ à áèšà¥­­ëå  âàš¡ãâ å ä ©«  €«ï
+šá¯®«ì§®¢ ­šï €àã£š¬š ¯à®£à ¬¬ ¬š š«š REXX.  ­ áâ®ïé¥¥ ¢à¥¬ï ®¯à¥€¥«¥­ë
+á«¥€ãîéš¥ à áèšà¥­­ë¥  âàš¡ãâë (EA).
+
+:table cols='20 35'.
+:row.
+:c.MMALBUM
+:c.«ì¡®¬, ª®â®à®¬ã ¯àš­ €«¥Ššâ íâ®â âà¥ª
+:row.
+:c.MMARTIST
+:c.¬ï šá¯®«­šâ¥«ï
+:row.
+:c.MMBPS
+:c.šá«® ¡šâ®¢ á¥¬¯« 
+:row.
+:c.MMCHANNELS
+:c.®«šç¥áâ¢® ª ­ «®¢
+:row.
+:c.MMCOMMENT
+:c.®¬¬¥­â àš© ª ä ©«ã
+:row.
+:c.MMGENRE
+:c. ­à  ã€š®ä ©« 
+:row.
+:c.MMNUMAUDIOBYTES
+:c.®«šç¥áâ¢®  ã€š®¡ ©â®¢ ¢  ã€š®ä ©«¥
+:row.
+:c.MMPLAYTIME
+:c.à¥¬ï ¢®á¯à®š§¢¥€¥­šï ¢ á¥ªã­€ å
+:row.
+:c.MMPLAYTIMEMS
+:c.à¥¬ï ¢®á¯à®š§¢¥€¥­šï ¢ ¬š««šá¥ªã­€ å
+:row.
+:c.MMSAMPLERATE
+:c. áâ®â  €šáªà¥âš§ æšš
+:row.
+:c.MMTRACKNAME
+:c. §¢ ­š¥ âà¥ª 
+:row.
+:c.MMYEAR
+:c.®€
+:etable.
+
+:nt.
+­ä®à¬ æšï åà ­šâáï ¢ ä®à¬ â¥ ASCII.
+:ent.
+:euserdoc.
Index: /tags/CWMM-0.3.0_GA/mediafolder/prog_tutorial/ru/newmethods_ru.inc
===================================================================
--- /tags/CWMM-0.3.0_GA/mediafolder/prog_tutorial/ru/newmethods_ru.inc	(revision 213)
+++ /tags/CWMM-0.3.0_GA/mediafolder/prog_tutorial/ru/newmethods_ru.inc	(revision 213)
@@ -0,0 +1,534 @@
+.******************************************************
+
+:h2 res=1010
+width=30%
+.cwGetFileSystemObject
+:link reftype=hd res=1011
+auto dependent group=2.
+:p.
+:link reftype=hd res=1011.š­â ªášá:elink.
+.br
+:link reftype=hd res=1013 dependent.®§¢à é ¥¬®¥ §­ ç¥­š¥:elink.
+.br
+:link reftype=hd res=1014 dependent.®¬¬¥­â àšš:elink.
+.*.br
+.*:link reftype=hd res=315.á¯®«ì§®¢ ­š¥:elink.
+.*.br
+.*:link reftype=hd res=416 dependent.àš¬¥à:elink.
+
+:h2 res=1011
+x=30%
+width=70%
+hide
+group=2
+.cwGetFileSystemObject - š­â ªášá
+:xmp.
+/* Get the file system object a shadow links to */
+
+mediaFolder   /* ª § â¥«ì ­  ¯ ¯ªã ¬ã«ìâš¬¥€š  */
+theShadow     /* A shadow object  */
+:p.
+fsObj=MFldrCallFunc("cwGetFileSystemObject", 
+                        mediaFolder, theShadow);
+:exmp.
+
+
+:h2 res=1013
+x=30%
+width=70% height=35%
+group=3
+hide
+.cwGetFileSystemObject - ®§¢à é ¥¬®¥ §­ ç¥­š¥
+:p.
+çšá«®¢®¥ :hp2.fsObj:ehp2.
+:p.
+®§¢à é ¥¬®¥ §­ ç¥­š¥ ¯à¥€áâ ¢«ï¥â á®¡®© ãª § â¥«ì ­  ®¡ê¥ªâ ä ©«®¢®© ášáâ¥¬ë,
+­  ª®â®àë© ááë« ¥âáï â¥­ì :hp2.theShadow:ehp2.. 
+á«š ááë«ª  ¡šâ ï, ¢®§¢à é ¥âáï 0.
+
+
+:h2 res=1014
+x=30%
+width=70%
+hide
+group=2
+.cwGetFileSystemObject - ®¬¬¥­â àšš
+:p.
+â®â ¬¥â®€ ï¢«ï¥âáï ç«¥­®¬ ¯ ¯ªš ¬ã«ìâš¬¥€š , ¯®íâ®¬ã ­¥®¡å®€š¬® ¯à¥€®áâ ¢šâì
+ãª § â¥«ì ®¡ê¥ªâ  ­  ¯ ¯ªã ¬ã«ìâš¬¥€š .
+:p.
+â®â ¬¥â®€ ¡ë« ¯à¥€áâ ¢«¥­ ª« áá®¬ CWProgFolder, ª®â®àë© ï¢«ï¥âáï à®€šâ¥«ìáªš¬
+ª« áá®¬ €«ï ­¥áª®«ìªšå ­®¢ëå ª« áá®¢ ¯ ¯®ª.  ªš¬ ®¡à §®¬, ë â ªŠ¥ ¬®Š¥â¥
+šá¯®«ì§®¢ âì ãª § â¥«ì ­  «î¡®© €àã£®© ¯®€ª« áá CWProgFolder. ¥ª®â®àë¥ š§
+íâšå ¯®€ª« áá®¢ ¯¥à¥çšá«¥­ë ­šŠ¥.
+
+:ul.
+:li.CWAudioFolder
+:li.CWDataFolder
+:li.CWMediaFolder
+:eul.
+
+
+
+.******************************************************
+:h2 res=1040
+width=30%
+.cwPauseAudioFile
+:link reftype=hd res=1041
+auto dependent group=2.
+:p.
+:link reftype=hd res=1041.š­â ªášá:elink.
+.br
+:link reftype=hd res=1043 dependent.®§¢à é ¥¬®¥ §­ ç¥­š¥:elink.
+.br
+:link reftype=hd res=1044 dependent.®¬¬¥­â àšš:elink.
+.*.br
+.*:link reftype=hd res=315.á¯®«ì§®¢ ­š¥:elink.
+.*.br
+.*:link reftype=hd res=416 dependent.àš¬¥à:elink.
+
+:h2 res=1041
+x=30%
+width=70%
+hide
+group=2
+.cwPauseAudioFile - š­â ªášá
+:xmp.
+/* This method pauses playing */
+
+mediaFolder   /* ª § â¥«ì ­  ¯ ¯ªã ¬ã«ìâš¬¥€š  */
+frameHandle   /* Handle of the folder frame  */
+:p.
+rc=MFldrCallFunc("cwPauseAudioFile", 
+                        mediaFolder, frameHandle);
+:exmp.
+
+
+:h2 res=1043
+x=30%
+width=70% height=35%
+group=3
+hide
+.cwPauseAudioFile - ®§¢à é ¥¬®¥ §­ ç¥­š¥
+:p.
+çšá«®¢®¥ :hp2.rc:ehp2.
+:p.
+
+
+:h2 res=1044
+x=30%
+width=70%
+hide
+group=2
+.cwPauseAudioFile - ®¬¬¥­â àšš
+:p.
+¥áªàš¯â®à äà¥©¬  ¯ ¯ªš ¬ã«ìâš¬¥€š  ¯¥à¥€ ñâáï áæ¥­ àšî ¢ ª ç¥áâ¢¥ ¯ à ¬¥âà 
+¯àš § ¯ãáª¥.
+
+.******************************************************
+:h2 res=1050
+width=30%
+.cwPlayAudioFile
+:link reftype=hd res=1051
+auto dependent group=2.
+:p.
+:link reftype=hd res=1051.š­â ªášá:elink.
+.br
+:link reftype=hd res=1053 dependent.®§¢à é ¥¬®¥ §­ ç¥­š¥:elink.
+.br
+:link reftype=hd res=1054 dependent.®¬¬¥­â àšš:elink.
+.*.br
+.*:link reftype=hd res=315.á¯®«ì§®¢ ­š¥:elink.
+.*.br
+.*:link reftype=hd res=416 dependent.àš¬¥à:elink.
+
+:h2 res=1051
+x=30%
+width=70%
+hide
+group=2
+.cwPlayAudioFile - š­â ªášá
+:xmp.
+/* This method starts playing the contents 
+    of the media folder */
+
+mediaFolder   /* ª § â¥«ì ­  ¯ ¯ªã ¬ã«ìâš¬¥€š  */
+frameHandle   /* Handle of the folder frame  */
+flag          /* Flag specifying which track to start */
+:p.
+rc=MFldrCallFunc("cwPlayAudioFile", 
+                        mediaFolder, frameHandle, flag);
+:exmp.
+
+:h2 res=1053
+x=30%
+width=70% height=35%
+group=3
+hide
+.cwPlayAudioFile - ®§¢à é ¥¬®¥ §­ ç¥­š¥
+:p.
+çšá«®¢®¥ :hp2.rc:ehp2.
+:p.
+
+
+:h2 res=1054
+x=30%
+width=70%
+hide
+group=2
+.cwPlayAudioFile - ®¬¬¥­â àšš
+:p.
+¥áªàš¯â®à äà¥©¬  ¯ ¯ªš ¬ã«ìâš¬¥€š  ¯¥à¥€ ñâáï áæ¥­ àšî ¢ ª ç¥áâ¢¥ ¯ à ¬¥âà 
+¯àš § ¯ãáª¥.  à ¬¥âà flag ¬®Š¥â š¬¥âì ®€­® š§ á«¥€ãîéšå §­ ç¥­š©:
+
+:ul.
+:li.PLAY_FIRST    1
+.br
+ ¯ãáâšâì ¯¥à¢ãî §¢ãª®¢ãî €®à®Šªã ¢ ¯ ¯ª¥ ¬ã«ìâš¬¥€š . 
+á«š ãŠ¥ ¢ë¡à ­ 
+ª ª ï-«š¡® €®à®Šª , ­ ç âì á ¯¥à¢®© ¢ë¡à ­­®© €®à®Šªš.
+:li.PLAY_NEXT     2
+.br
+®á¯à®š§¢¥áâš á«¥€ãîéš© âà¥ª.
+:li.PLAY_PREV     3
+.br
+®á¯à®š§¢¥áâš ¯à¥€ë€ãéš© âà¥ª.
+:eul.
+
+
+.******************************************************
+:h2 res=1060
+width=30%
+.cwQueryCurrentlyPlayingObject
+:link reftype=hd res=1061
+auto dependent group=2.
+:p.
+:link reftype=hd res=1061.š­â ªášá:elink.
+.br
+:link reftype=hd res=1063 dependent.®§¢à é ¥¬®¥ §­ ç¥­š¥:elink.
+.*.br
+.*:link reftype=hd res=1054 dependent.®¬¬¥­â àšš:elink.
+.*.br
+.*:link reftype=hd res=315.á¯®«ì§®¢ ­š¥:elink.
+.*.br
+.*:link reftype=hd res=416 dependent.àš¬¥à:elink.
+
+:h2 res=1061
+x=30%
+width=70%
+hide
+group=2
+.cwQueryCurrentlyPlayingObject - š­â ªášá
+:xmp.
+/* This method queries the pointer to the 
+   currently playing object */
+
+mediaFolder   /* ª § â¥«ì ­  ¯ ¯ªã ¬ã«ìâš¬¥€š  */
+:p.
+rc=MFldrCallFunc("cwQueryCurrentlyPlayingObject", 
+                  mediaFolder);
+:exmp.
+
+:h2 res=1063
+x=30%
+width=70% height=35%
+group=3
+hide
+.cwQueryCurrentlyPlayingObject - ®§¢à é ¥¬®¥ §­ ç¥­š¥
+:p.
+çšá«®¢®¥ :hp2.rc:ehp2.
+:p.
+ª § â¥«ì ®¡ê¥ªâ  ­  ¢®á¯à®š§¢®€š¬ë© ¢ € ­­ë© ¬®¬¥­â ®¡ê¥ªâ š«š 0 ¥á«š ®¡ê¥ªâ
+­¥ ¢®á¯à®š§¢®€šâáï.
+
+
+
+.******************************************************
+:h2 res=1090
+width=30%
+.cwSetStatusLineText
+:link reftype=hd res=1091
+auto dependent group=2.
+:p.
+:link reftype=hd res=1091.š­â ªášá:elink.
+.br
+:link reftype=hd res=1093 dependent.®§¢à é ¥¬®¥ §­ ç¥­š¥:elink.
+.br
+:link reftype=hd res=1094 dependent.®¬¬¥­â àšš:elink.
+.*.br
+.*:link reftype=hd res=315.á¯®«ì§®¢ ­š¥:elink.
+.*.br
+.*:link reftype=hd res=416 dependent.àš¬¥à:elink.
+
+:h2 res=1091
+x=30%
+width=70%
+hide
+group=2
+.cwSetStatusLineText - š­â ªášá
+:xmp.
+/* This method sets the status line text of a media folder */
+
+mediaFolder   /* Pointer to a media folder on which the method is invoked */
+theText       /* Text for status line or 0 */
+:p.
+info=MFldrCallFunc("cwSetStatusLineText", 
+                    mediaFolder, theText);
+:exmp.
+
+:h2 res=1093
+x=30%
+width=70% height=35%
+group=3
+hide
+.cwSetStatusLineText - ®§¢à é ¥¬®¥ §­ ç¥­š¥
+:p.
+áâà®ª®¢®¥ :hp2.info:ehp2.
+:p.
+
+
+:h2 res=1094
+x=30%
+width=70%
+hide
+group=2
+.cwSetStatusLineText - ®¬¬¥­â àšš
+:p.
+
+á«š â¥ªáâ®¢ë© ¯ à ¬¥âà à ¢¥­ 0, ¯ ¯ª  ¯®ª §ë¢ ¥â áâ ­€ àâ­ë© â¥ªáâ áâà®ªš
+á®áâ®ï­šï.
+
+
+.******************************************************
+:h2 res=1100
+width=30%
+.cwStopAudioFile
+:link reftype=hd res=1101
+auto dependent group=2.
+:p.
+:link reftype=hd res=1101.š­â ªášá:elink.
+.br
+:link reftype=hd res=1103 dependent.®§¢à é ¥¬®¥ §­ ç¥­š¥:elink.
+.br
+:link reftype=hd res=1104 dependent.®¬¬¥­â àšš:elink.
+.*.br
+.*:link reftype=hd res=315.á¯®«ì§®¢ ­š¥:elink.
+.*.br
+.*:link reftype=hd res=416 dependent.àš¬¥à:elink.
+
+:h2 res=1101
+x=30%
+width=70%
+hide
+group=2
+.cwStopAudioFile - š­â ªášá
+:xmp.
+/* This method stops playing */
+
+mediaFolder   /* ª § â¥«ì ­  ¯ ¯ªã ¬ã«ìâš¬¥€š  */
+frameHandle   /* Handle of the folder frame  */
+:p.
+rc=MFldrCallFunc("cwStopAudioFile", 
+                        mediaFolder, frameHandle);
+:exmp.
+
+
+:h2 res=1103
+x=30%
+width=70% height=35%
+group=3
+hide
+.cwStopAudioFile - ®§¢à é ¥¬®¥ §­ ç¥­š¥
+:p.
+çšá«®¢®¥ :hp2.rc:ehp2.
+:p.
+
+
+:h2 res=1104
+x=30%
+width=70%
+hide
+group=2
+.cwStopAudioFile - ®¬¬¥­â àšš
+:p.
+¥áªàš¯â®à äà¥©¬  ¯ ¯ªš ¬ã«ìâš¬¥€š  ¯¥à¥€ ñâáï áæ¥­ àšî ¢ ª ç¥áâ¢¥ ¯ à ¬¥âà 
+¯àš § ¯ãáª¥.
+
+
+.******************************************************
+:h2 res=1070
+width=30%
+.cwmmQueryTrackInfo
+:link reftype=hd res=1071
+auto dependent group=2.
+:p.
+:link reftype=hd res=1071.š­â ªášá:elink.
+.br
+:link reftype=hd res=1073 dependent.®§¢à é ¥¬®¥ §­ ç¥­š¥:elink.
+.br
+:link reftype=hd res=1074 dependent.®¬¬¥­â àšš:elink.
+.*.br
+.*:link reftype=hd res=315.á¯®«ì§®¢ ­š¥:elink.
+.*.br
+.*:link reftype=hd res=416 dependent.àš¬¥à:elink.
+
+:h2 res=1071
+x=30%
+width=70%
+hide
+group=2
+.cwmmQueryTrackInfo - š­â ªášá
+:xmp.
+/* This method queries information from an
+   audio object */
+
+audioObject   /* Pointer to an audio object on which the method is invoked */
+flag          /* Flag specifying which info to query */
+:p.
+info=MMClsCallFunc("cwmmQueryTrackInfo", 
+                  audioObject, flag);
+:exmp.
+
+:h2 res=1073
+x=30%
+width=70% height=35%
+group=3
+hide
+.cwmmQueryTrackInfo - ®§¢à é ¥¬®¥ §­ ç¥­š¥
+:p.
+áâà®ª®¢®¥ :hp2.info:ehp2.
+:p.
+ ¯à®è¥­­ ï š­ä®à¬ æšï ¢®§¢à é ¥âáï ¢ ¢š€¥ áâà®ªš. 
+á«š š­ä®à¬ æšï ­¥€®áâã¯­ ,
+¢®§¢à é ¥âáï ¯ãáâ ï áâà®ª .
+:p.
+àš ¢®§­šª­®¢¥­šš ®èš¡ªš ¢®§¢à é ¥âáï :hp2.ERROR&colon.:ehp2..
+
+:h2 res=1074
+x=30%
+width=70%
+hide
+group=2
+.cwmmQueryTrackInfo - ®¬¬¥­â àšš
+:p.
+¡ê¥ªâ €®«Š¥­ ¡ëâì íª§¥¬¯«ïà®¬ :hp2.CWAudio:ehp2. š«š ®€­®£® š§ ¥£® ¯®€ª« áá®¢
+(:hp2.CWMP3:ehp2., :hp2.MMWAV:ehp2....). â®â ¬¥â®€ ¡ë« ¯à¥€áâ ¢«¥­ :hp2.CWAudio:ehp2..
+ çš­ ï á ¢¥àášš 0.2.5 ª« ááë ­ §ë¢ îâáï :hp2.MMAudio:ehp2., :hp2.MMWAV:ehp2. š
+â.€., çâ®¡ë ¡ëâì á®¢¬¥áâš¬ë¬š á ª« áá ¬š IBM, ¢å®€ïéš¬š ¢ á®áâ ¢ OS/2.
+:p.
+ à ¬¥âà flag ¬®Š¥â š¬¥âì ®€­® š§ á«¥€ãîéšå §­ ç¥­š©:
+:ul.
+:li.IDINFO_NAME              1
+.br
+ §¢ ­š¥ âà¥ª .
+:li.IDINFO_ARTIST            2
+.br
+¬ï šá¯®«­šâ¥«ï.
+:li.IDINFO_ALBUM             3
+.br
+ §¢ ­š¥  «ì¡®¬ .
+:li.IDINFO_YEAR              4
+.br
+®€ š§ â¥£  ID3.
+:li.IDINFO_COMMENT           5
+.br
+®¬¬¥­â àš©.
+:li.IDINFO_GENRE             6
+.br
+ ­à ¢ ¢š€¥ áâà®ªš.
+:li.IDINFO_PLAYTIME          7
+.br
+à¥¬ï ¢®á¯à®š§¢¥€¥­šï ¢ á¥ªã­€ å (çšá«®¢®¥ §­ ç¥­š¥).
+:li.IDINFO_BPS               8
+.br
+šá«® ¡šâ®¢ á¥¬¯«  (çšá«®¢®¥ §­ ç¥­š¥).
+:li.IDINFO_SAMPLERATE        9
+.br
+ áâ®â  €šáªà¥âš§ æšš ¢ æ (çšá«®¢®¥ §­ ç¥­š¥).
+:li.IDINFO_CHANNELS          10
+.br
+®«šç¥áâ¢® ª ­ «®¢ (çšá«®¢®¥ §­ ç¥­š¥).
+:li.IDINFO_BITRATE           11
+.br
+šâà¥©â ¢  ¢ á¥ªã­€ã (çšá«®¢®¥ §­ ç¥­š¥). â®â ä« £ €¥©áâ¢šâ¥«¥­ â®«ìª® €«ï
+íª§¥¬¯«ïà®¢ ª« áá  MMMP3 š MMOGG. «ï €àã£šå ª« áá®¢ ¢®§¢à é ¥¬®¥ §­ ç¥­š¥ ­¥
+®¯à¥€¥«¥­®. ®¢®¥ ¢ ¢¥àášš 0.2.7.
+:eul.
+
+
+.******************************************************
+:h2 res=1080
+width=30%
+.cwmmQueryImageInfo
+:link reftype=hd res=1081
+auto dependent group=2.
+:p.
+:link reftype=hd res=1081.š­â ªášá:elink.
+.br
+:link reftype=hd res=1082 dependent. à ¬¥âàë:elink.
+
+.br
+:link reftype=hd res=1083 dependent.®§¢à é ¥¬®¥ §­ ç¥­š¥:elink.
+.*.br
+.*:link reftype=hd res=1084 dependent.®¬¬¥­â àšš:elink.
+.*.br
+.*:link reftype=hd res=315.á¯®«ì§®¢ ­š¥:elink.
+.*.br
+.*:link reftype=hd res=416 dependent.àš¬¥à:elink.
+
+:h2 res=1081
+x=30%
+width=70%
+hide
+group=2
+.cwmmQueryImageInfo - š­â ªášá
+:xmp.
+/* This method queries information from an
+   image object */
+
+imageObject   /* Pointer to an image object on which the method is invoked */
+flag          /* Flag specifying which info to query */
+:p.
+info=MMCallFunc("cwmmQueryTrackInfo", 
+                  imageObject, flag);
+:exmp.
+
+:h2 res=1083
+x=30%
+width=70% height=35%
+group=3
+hide
+.cwmmQueryImageInfo - ®§¢à é ¥¬®¥ §­ ç¥­š¥
+:p.
+áâà®ª®¢®¥ :hp2.info:ehp2.
+:p.
+ ¯à®è¥­­ ï š­ä®à¬ æšï ¢®§¢à é ¥âáï ¢ ¢š€¥ áâà®ªš. 
+á«š š­ä®à¬ æšï ­¥€®áâã¯­ ,
+¢®§¢à é ¥âáï ¯ãáâ ï áâà®ª .
+:p.
+àš ¢®§­šª­®¢¥­šš ®èš¡ªš ¢®§¢à é ¥âáï :hp2.ERROR&colon.:ehp2..
+
+:h2 res=1082
+x=30%
+width=70%
+hide
+group=2
+.cwmmQueryImageInfo -  à ¬¥âàë
+:p.
+:parml tsize=10.
+:pt.:hp2.imageObject:ehp2. (çšá«®¢®¥)
+:pd.ª § â¥«ì ®¡ê¥ªâ  ä ©«  š§®¡à Š¥­šï.
+:pt.:hp2.flag:ehp2. (çšá«®¢®¥)
+:pd.¯à¥€¥«ï¥â § ¯à èš¢ ¥¬ãî š­ä®à¬ æšî.
+:parml tsize=3.
+:pt.IDINFO_WIDTH    0x0001
+:pd.šàš­  š§®¡à Š¥­šï.
+:pt.IDINFO_HEIGHT   0x0002
+:pd.ëá®â  š§®¡à Š¥­šï.
+:pt.IDINFO_BPP      0x0003  
+:pd.®«šç¥áâ¢® ¡šâ ­  ¯šªá¥«ì.
+:pt.IDINFO_FORMAT   0x0004  
+:pd.®à¬ â š§®¡à Š¥­šï.
+:eparml.
+:eparml.
+
Index: /tags/CWMM-0.3.0_GA/mediafolder/prog_tutorial/ru/wpsmethods_ru.inc
===================================================================
--- /tags/CWMM-0.3.0_GA/mediafolder/prog_tutorial/ru/wpsmethods_ru.inc	(revision 213)
+++ /tags/CWMM-0.3.0_GA/mediafolder/prog_tutorial/ru/wpsmethods_ru.inc	(revision 213)
@@ -0,0 +1,40 @@
+
+
+:h1 res=1000
+width=30%
+.®€€¥àŠš¢ ¥¬ë¥ ¬¥â®€ë
+:p.
+à¥€áâ ¢«¥­ë á«¥€ãîéš¥ ¬¥â®€ë, ª®â®àë¥ ¯®€€¥àŠš¢ îâáï ¢ ­ áâ®ïé¥¥ ¢à¥¬ï.
+:p.
+.br
+:link reftype=hd res=1010 dependent.cwGetFileSystemObject:elink.
+.br
+:link reftype=hd res=1040 dependent.cwPauseAudioFile:elink.
+.br
+:link reftype=hd res=1050 dependent.cwPlayAudioFile:elink.
+.br
+:link reftype=hd res=1060 dependent.cwQueryCurrentlyPlayingObject:elink.
+.br
+:link reftype=hd res=1090 dependent.cwSetStatusLineText:elink.
+.br
+:link reftype=hd res=1100 dependent.cwStopAudioFile:elink.
+.br
+:link reftype=hd res=1070 dependent.cwmmQueryTrackInfo:elink.
+.br
+:link reftype=hd res=1080 dependent.cwmmQueryImageInfo:elink.
+
+
+.im ru\newmethods_ru.inc
+
+
+
+
+
+
+
+
+
+
+
+
+
Index: /tags/CWMM-0.3.0_GA/mediafolder/prog_tutorial/tw/hiddenfeatures_tw.inc
===================================================================
--- /tags/CWMM-0.3.0_GA/mediafolder/prog_tutorial/tw/hiddenfeatures_tw.inc	(revision 213)
+++ /tags/CWMM-0.3.0_GA/mediafolder/prog_tutorial/tw/hiddenfeatures_tw.inc	(revision 213)
@@ -0,0 +1,220 @@
+:h2 res=410
+x=50% width=50%
+group=2
+.šú¥NÁn­µŒœ©ñŸ¹
+:p.
+MMOS2 ÀHªþªº¹w³]Án­µŒœ©ñŸ¹·|Š]¬°¥[€J€U­±ªº key šì OS2.INI ŠÓ³Qšú¥N¡G
+:p.
+:hp2.CWMM->Án­µŒœ©ñŸ¹-><path to new player>:ehp2.
+:nt.­Yµ{Š¡Šb§Aªº PATH ³]©w€€¡A«h§A€£»Ý­nŽ£šÑ§¹Ÿãªºžô®|¡C¥²¶·¬O PM µ{Š¡¡I
+:ent.
+:p.
+§YšÏ·sµ{Š¡šS³Q«ü©wŠb INI ÀÉ®×€€¡AÃþ§O€]·|Ž£šÑ¹w³]ªºŠæ¬°¡A€£»Ý­n¶}±ÒŒœ©ñŸ¹šÓ°µ¬° WPS ³B²zªº€@³¡¥÷¡C¬G­YŒœ©ñŸ¹·í±Œ¡AWPS šÃ€£·|·í±Œ¡C
+
+:h2 res=411
+x=50% width=50%
+group=2
+.šú¥N­µ°Tœs¿èŸ¹
+:p.
+MMOS2 ÀHªþªº¹w³]­µ°Tœs¿èŸ¹·|Š]¬°¥[€J€U­±ªº key šì OS2.INI ŠÓ³Qšú¥N¡G
+:p.
+:hp2.CWMM->­µ°Tœs¿èŸ¹-><path to new editor>:ehp2.
+:nt.­Yµ{Š¡Šb§Aªº PATH ³]©w€€¡A«h§A€£»Ý­nŽ£šÑ§¹Ÿãªºžô®|¡C¥²¶·¬O PM µ{Š¡¡I
+:ent.
+:p.
+§YšÏ·sµ{Š¡šS³Q«ü©wŠb INI ÀÉ®×€€¡AÃþ§O€]·|Ž£šÑ¹w³]ªºŠæ¬°¡A€£»Ý­n¶}±Òœs¿èŸ¹šÓ°µ¬° WPS ³B²zªº€@³¡¥÷¡C¬G­Yœs¿èŸ¹·í±Œ¡AWPS šÃ€£·|·í±Œ¡C
+
+:h2 res=412
+x=50% width=50%
+group=2
+.šú¥N AVI Œœ©ñŸ¹
+:p.
+MMOS2 ÀHªþªº¹w³] AVI Œœ©ñŸ¹·|Š]¬°¥[€J€U­±ªº key šì OS2.INI ŠÓ³Qšú¥N¡G
+:p.
+:hp2.CWMM->aviplayer-><path to new player>:ehp2.
+:nt.­Yµ{Š¡Šb§Aªº PATH ³]©w€€¡A«h§A€£»Ý­nŽ£šÑ§¹Ÿãªºžô®|¡C¥²¶·¬O PM µ{Š¡¡I
+:ent.
+:p.
+§YšÏ·sµ{Š¡šS³Q«ü©wŠb INI ÀÉ®×€€¡AÃþ§O€]·|Ž£šÑ¹w³]ªºŠæ¬°¡A€£»Ý­n¶}±ÒŒœ©ñŸ¹šÓ°µ¬° WPS ³B²zªº€@³¡¥÷¡C¬G­YŒœ©ñŸ¹·í±Œ¡AWPS šÃ€£·|·í±Œ¡C
+
+:h2 res=413
+x=50% width=50%
+group=2
+.šú¥N MPG Œœ©ñŸ¹
+:p.
+MMOS2 ÀHªþªº¹w³] MPG Œœ©ñŸ¹·|Š]¬°¥[€J€U­±ªº key šì OS2.INI ŠÓ³Qšú¥N¡G
+:p.
+:hp2.CWMM->mpgplayer-><path to new player>:ehp2.
+:nt.­Yµ{Š¡Šb§Aªº PATH ³]©w€€¡A«h§A€£»Ý­nŽ£šÑ§¹Ÿãªºžô®|¡C¥²¶·¬O PM µ{Š¡¡I
+:ent.
+:p.
+§YšÏ·sµ{Š¡šS³Q«ü©wŠb INI ÀÉ®×€€¡AÃþ§O€]·|Ž£šÑ¹w³]ªºŠæ¬°¡A€£»Ý­n¶}±ÒŒœ©ñŸ¹šÓ°µ¬° WPS ³B²zªº€@³¡¥÷¡C¬G­YŒœ©ñŸ¹·í±Œ¡AWPS šÃ€£·|·í±Œ¡C
+
+:h2 res=419
+x=50% width=50%
+group=2
+.šú¥N MP3 Œœ©ñŸ¹
+:p.
+¹w³]ªº MP3 Œœ©ñŸ¹·|Š]¬°¥[€J€U­±ªº key šì OS2.INI ŠÓ³Qšú¥N¡G
+:p.
+:hp2.CWMM->mp3player-><path to new player>:ehp2.
+:nt.­Yµ{Š¡Šb§Aªº PATH ³]©w€€¡A«h§A€£»Ý­nŽ£šÑ§¹Ÿãªºžô®|¡C¥²¶·¬O PM µ{Š¡¡I
+:ent.
+:p.
+§YšÏ·sµ{Š¡šS³Q«ü©wŠb INI ÀÉ®×€€¡AÃþ§O€]·|Ž£šÑ¹w³]ªºŠæ¬°¡A€£»Ý­n¶}±ÒŒœ©ñŸ¹šÓ°µ¬° WPS ³B²zªº€@³¡¥÷¡C¬G­YŒœ©ñŸ¹·í±Œ¡AWPS šÃ€£·|·í±Œ¡C
+
+:h2 res=422
+x=50% width=50%
+group=2
+.šú¥N M3U œs¿èŸ¹
+:p.
+¹w³]ªº M3U œs¿èŸ¹·|Š]¬°¥[€J€U­±ªº key šì OS2.INI ŠÓ³Qšú¥N¡G
+:p.
+:hp2.CWMM->m3ueditor-><path to new editor>:ehp2.
+:nt.­Yµ{Š¡Šb§Aªº PATH ³]©w€€¡A«h§A€£»Ý­nŽ£šÑ§¹Ÿãªºžô®|¡C¥²¶·¬O PM µ{Š¡¡I
+:ent.
+
+:h2 res=423
+x=50% width=50%
+group=2
+.šú¥N M3U Œœ©ñŸ¹
+:p.
+¹w³]ªº M3U Œœ©ñŸ¹·|Š]¬°¥[€J€U­±ªº key šì OS2.INI ŠÓ³Qšú¥N¡G
+:p.
+:hp2.CWMM->m3uplayer-><path to new player>:ehp2.
+:nt.­Yµ{Š¡Šb§Aªº PATH ³]©w€€¡A«h§A€£»Ý­nŽ£šÑ§¹Ÿãªºžô®|¡C¥²¶·¬O PM µ{Š¡¡I
+:ent.
+:p.
+¹w³]Šæ¬°¬O«Ø¥ß€@­Ó·sªº MEdia žê®Æ§ššÃ¥[€J«ü©w©ó M3U ÀÉ®×€€©Ò«ü©wªºŠ±¥Ø¡CšÏ¥Î³o­Ó³]©wÁÙ¬OŠ³¥i¯àšä¥Lªº MP3 Œœ©ñŸ¹¡C
+
+:h2 res=414
+x=50% width=50%
+group=2
+.šú¥NŒv¹³œs¿èŸ¹
+:p.
+MMOS2 ÀHªþªº¹w³]Œv¹³œs¿èŸ¹·|Š]¬°¥[€J€U­±ªº key šì OS2.INI ŠÓ³Qšú¥N¡G
+:p.
+:hp2.CWMM->imageeditor-><path to new editor>:ehp2.
+:nt.­Yµ{Š¡Šb§Aªº PATH ³]©w€€¡A«h§A€£»Ý­nŽ£šÑ§¹Ÿãªºžô®|¡C¥²¶·¬O PM µ{Š¡¡I
+:ent.
+:p.
+§YšÏ·sµ{Š¡šS³Q«ü©wŠb INI ÀÉ®×€€¡AÃþ§O€]·|Ž£šÑ¹w³]ªºŠæ¬°¡A€£»Ý­n¶}±ÒŒœ©ñŸ¹šÓ°µ¬° WPS ³B²zªº€@³¡¥÷¡C¬G­YŒœ©ñŸ¹·í±Œ¡AWPS šÃ€£·|·í±Œ¡C
+
+
+:h2 res=415
+x=50% width=50%
+group=2
+.Šb CD €W±Ò¥ÎŒv¹³©ú²Ó¥\¯à
+:p.
+¹w³]³]©w¬O€£€äŽ©Šb CD €W±Ò¥ÎŒv¹³©ú²Ó¥\¯à¡C²z¥Ñ¬O³o·|­°§C¥úºÐŸ÷Š¬¶°žê°Tªº³t«×¡AŠ]³o«Üªá®É¶¡¡C§A¥i¥H¥[€J¥H€Uªº key šì OS2.INI šÓ¶}±Ò³o­Ó·sªºÃþ§O¥\¯à¡G
+:p.
+:hp2.CWMM->useNewImgClsFeaturesOnCD->1:ehp2.
+
+:nt.ª`·N»ÝšÏ¥Î€jŒgŠr¥À¡I
+:ent.
+:nt.§A¥²¶·­«·s±Ò°Ê WPS €~¯àÅý³]©w¥Í®Ä¡C
+:ent.
+
+
+:h2 res=416
+x=50% width=50%
+group=2
+.Ãö³¬®É¶¡Åã¥ÜŠb¹Ï°OŒÐÃD
+:p.
+·í§Q¥ÎÂùÀ»¶}±Ò­µ°TÀÉ®×®É¡A·|Š³žg¹L®É¶¡Åã¥ÜŠb¹Ï°OŒÐÃD€W¡C­nÃö³¬³o­Ó·s³]©w¥i¥H±N€U­±ªº key ¥[šì OS2.INI €€¡C
+:p.
+:hp2.CWMM->mmClsNoExtendedIconTitles->1:ehp2.
+
+:nt.ª`·N»ÝšÏ¥Î€jŒgŠr¥À¡I
+:ent.
+:nt.§A¥²¶·­«·s±Ò°Ê WPS €~¯àÅý³]©w¥Í®Ä¡C
+:ent.
+
+:h2 res=417
+x=50% width=50%
+group=2
+.Œœ©ñ®ÉÃö³¬Œœ©ñ±±šî°{Ã{
+:p.
+·íŠ±¥ØŒœ©ñ®É·|Š³¥iš£ªºŠ^õXŒœ©ñ±±šî¡]Œœ©ñ¡BŒÈ°±¡^¡C­nÃö³¬³o­Ó·s³]©w¥i¥H±N€U­±ªº key ¥[šì OS2.INI €€¡C
+:p.
+:hp2.CWMM->bNoPlayCtrlBlinking->1:ehp2.
+
+:nt.ª`·N»ÝšÏ¥Î€jŒgŠr¥À¡I
+:ent.
+:nt.§A¥²¶·­«·s±Ò°Ê WPS €~¯àÅý³]©w¥Í®Ä¡C
+:ent.
+
+:h2 res=418
+x=50% width=50%
+group=2
+.Á×§K±N§ëŒv«ØšìŽCÅéŒœ©ñŒÒª©
+:p.
+±qŠhŽCÅéžê®Æ§š€€©Ò°µªºŠhŽCÅéŒœ©ñŒÒª©§ëŒv¡A·|ŠÛ°Ê«ØŠbŠhŽCÅéžê®Æ§š€€šÓ°µŠ­ŽÁªºµn¿ý¡C³]©w³o­Ó key «áŠ¹¥\¯àŽN·|³QÃö³¬¡C
+
+:p.
+:hp2.CWMM->bNoMediaFolderTemplateShadow->1:ehp2.
+
+:nt.ª`·N»ÝšÏ¥Î€jŒgŠr¥À¡I
+:ent.
+
+:nt.§A¥i¥H±N«Ø¥ßªº§ëŒv²Ÿšì¥t€@­ÓŠa€è¡C­Y¥Š±qšt²Î€W³Q§R°£¡A·|ŠbŠhŽCÅéžê®Æ§š€€­«·s«Ø¥ß¡C
+:ent.
+
+
+:h2 res=420
+x=50% width=50%
+group=2
+.Ãö³¬­µ°TÀÉ®×ªºÀË¬d
+:p.
+§A¥i¥H±NºÏºÐ¥Nž¹¥[šì OS2.INI €€¡AŽN¥i¥HÃö³¬­µ°TÀÉ®×ªºÀË¬d¥\¯à¡C
+:p.
+:hp2.CWMM->mmClsDontCheckDrives-><drive list>:ehp2.
+:nt.ª`·N»ÝšÏ¥Î€jŒgŠr¥À¡I
+:ent.
+
+³o¹ï³sœu³t«×žûºC©Î¬Ošä¥LžûºCªºžËžmšÓ»¡¬O«ÜŠ³¥Îªº¡C¥¿±`šÓ»¡¡AŠ¬¶°šìªºžê°T¬OÀxŠsŠb­µ°TÀÉ®×ªº©µŠùÄÝ©Ê€€¡A©Ò¥H¥u·|ÀË¬d€@Šž¡C­Y°õŠæ€€ªºÀÉ®×št²Î€£€äŽ©©µŠùÄÝ©Ê¡A§A¥i¥H±NŠ¹ºÏºÐ¥[šì²M³æ€€¥HÁ×§K¥h±œºË¡C
+:nt.
+
+»ÝŽ£¿ôªº¬O¡A«ü©wŠb²M³æ€€ªºžËžm¡AšäÁn­µª«¥óªº­µ°Tžê°T€£·|³Q WPS ©ÒÅã¥Ü¡C
+:ent.
+:nt.
+¥²¶·­«·s±Ò°Ê WPS €~¯àÅý³]©w¥Í®Ä¡C
+:ent.
+
+:p.
+šÒ€l¡G
+:xmp.
+CWMM->mmClsDontCheckDrives->abcghzy
+:exmp.
+
+:nt.
+³o­Ó³]©w¥Ø«e€w¹L®É€F¡AŠ]¬° MMIOMP3 IO ³B²z¥]§tŠb:hp2.MMAudio Pak 2 €€¡A:ehp2.¡]2003.08.30 ÄÀ¥X¡^¡A€£·|ŠA±œºË MP3 ÀÉ®×Šý¬O·|Åªšú VBR œsœXÀÉ®×ªº header¡C
+:ent.
+
+
+:h2 res=421
+x=50% width=50%
+group=2
+.Ãö³¬ ID3 tag ªºÅªšú
+:p.
+§A¥i¥H±NºÏºÐ¥Nž¹¥[šì OS2.INI €€¡AŽN¥i¥HÃö³¬ ID3 tag ªºÅªšú¥\¯à¡C
+:p.
+:hp2.CWMM->mmClsDontReadID3OnDrives-><drive list>:ehp2.
+:nt.ª`·N»ÝšÏ¥Î€jŒgŠr¥À¡I
+:ent.
+
+³o¹ï³sœu³t«×žûºC©Î¬Ošä¥LžûºCªºžËžmšÓ»¡¬O«ÜŠ³¥Îªº¡C
+
+:nt.
+»ÝŽ£¿ôªº¬O¡A«ü©wŠb²M³æ€€ªºžËžm¡Ašä MP3 ÀÉ®×ªº ID3 tag žê°T€£·|³Q WPS ©ÒÅã¥Ü¡C
+:ent.
+:nt.
+¥²¶·­«·s±Ò°Ê WPS €~¯àÅý³]©w¥Í®Ä¡C
+:ent.
+
+:p.
+šÒ€l¡G
+:xmp.
+CWMM->mmClsDontReadID3OnDrives->abcghzy
+:exmp.
+
Index: /tags/CWMM-0.3.0_GA/mediafolder/prog_tutorial/tw/mediafldrprog_tw.ipf
===================================================================
--- /tags/CWMM-0.3.0_GA/mediafolder/prog_tutorial/tw/mediafldrprog_tw.ipf	(revision 213)
+++ /tags/CWMM-0.3.0_GA/mediafolder/prog_tutorial/tw/mediafldrprog_tw.ipf	(revision 213)
@@ -0,0 +1,549 @@
+:userdoc.
+
+:docprof.
+
+:title.ŠhŽCÅéÃþ§Oªºµ{Š¡³]­pŸÉÄý 
+
+:h1 res=100.«eš¥
+:p.
+Media-Folde Ž£šÑ€GºØ¬É­±šÓ±±šî€Î°µµ{Š¡³]­p¡C§A¥i¥HšÏ¥Î :link reftype=hd res=200. ³]©wŠr²ÅŠê:elink.šÓ°µ°òÂŠªº€u§@¡A¹³¬O±Ò°Ê€Î°±€îŒœ©ñ¡A©Î¬O¥Î :link reftype=hd res=300.REXX ¬É­±:elink.šÓµn¿ýÃþ§O€èªk¡C
+:p.
+šÏ¥Î REXX ¬É­±
+:p.
+:link reftype=launch
+object='netscape.exe'
+data='http://www.os2world.com/cdwriting'.
+WPS-Wizard V0.2.0:elink. (http&colon.//www.os2world.com/cdwriting)
+:p.
+¥H€W³£¥²¶·¥ýŠwžË¡C 
+
+:h1 res=200
+x=left y=bottom width=50%.³]©wŠr²ÅŠê
+:p.
+¥H€Uªº³]©wŠr²ÅŠê¬Ò€äŽ©šC­ÓŽCÅéžê®Æ§š¡C
+
+:ul.
+:li.:link reftype=hd res=210.MEDIAFLDRNEXT:elink.   Šbžê®Æ§š€€Œœ©ñ€U€@Š±¥Ø
+:li.:link reftype=hd res=211.MEDIAFLDRPLAY:elink.   ¶}©lŒœ©ñ
+:li.:link reftype=hd res=215.MEDIAFLDRPLAYFIRST:elink.   Œœ©ñ²Ä€@­ºŠ±¥Ø
+:li.:link reftype=hd res=212.MEDIAFLDRPREV:elink.   ²€¹LŠÜ«e€@Š±¥Ø
+:li.:link reftype=hd res=216.MEDIAFLDRREPEAT:elink. ³]©w­«ÂÐŒœ©ñ
+:li.:link reftype=hd res=213.MEDIAFLDRSTOP:elink.   °±€îŒœ©ñ
+:li.:link reftype=hd res=214.MEDIAFLDRVOLUME:elink. ³]©w­µ¶q
+:eul.
+:p.
+žê®Æ§š¥²¶·¶}±Ò€~¯àšÏ¥Î³ošÇ³]©wŠr²ÅŠê¡C
+:p.
+MM audio Ãþ§O€äŽ©¥H€UªºŠr²ÅŠê¡G
+:ul.
+:li.:link reftype=hd res=220.MMAUDIOTRACKNAME:elink.   ³]©w­µ°TÀÉªºŠ±¥ØŠWºÙ¡C
+:li.:link reftype=hd res=221.MMAUDIOARTIST:elink.   ³]©w­µ°TÀÉªººt¥XªÌ¡C
+:li.:link reftype=hd res=222.MMAUDIOALBUM:elink.    ³]©w±M¿èŠWºÙ¡C
+:li.:link reftype=hd res=223.MMAUDIOCOMMENT:elink.  ¬°­µ°TÀÉ³]©wµùžÑ¡C
+:li.:link reftype=hd res=224.MMAUDIOYEAR:elink.     ³]©w­µ°TÀÉªºŠ~¥÷¡C
+:li.:link reftype=hd res=225.MMAUDIOGENRE:elink.    ³]©w­µ°TÀÉªºÃþ«¬­·®æ¡C
+:li.:link reftype=hd res=226.MMREFRESH:elink.       ­«·sÅªšú­µ°TÀÉªºžê°T¡C
+:li.:link reftype=hd res=227.MMAUDIOCOPYTAGTO:elink.    œÆ»s­µ°TÀÉªº©ÒŠ³ tags¡C
+
+:eul.
+
+
+:h2 res=210
+x=50% width=50%
+group=2
+.MEDIAFLDRNEXT
+:p.
+Œœ©ñ®Éžõšì€U€@Š±¥Ø¡C­Y©|¥ŒŒœ©ñ«h²Ä€@Š±¥Ø·|³QŒœ©ñ¡C
+:xmp.
+/* REXX - This command skips to the next track */
+
+rc=SysSetObjectData('x&colon.\path_to_folder','MEDIAFLDRNEXT=1')
+:exmp.
+
+:h2 res=211
+x=50% width=50%
+group=2
+.MEDIAFLDRPLAY
+:p.
+±q²Ä€@Š±¥Ø¶}©lŒœ©ñ¡C­Y¿ïšúŠh­ÓŠ±¥Ø«h³Q¿ïšúªº²Ä€@­ÓŠ±¥Ø·|¥ýŒœ©ñ¡C
+:xmp.
+/* REXX - This command starts playing */
+
+rc=SysSetObjectData('x&colon.\path_to_folder','MEDIAFLDRPLAY=1')
+:exmp.
+
+:h2 res=215
+x=50% width=50%
+group=2
+.MEDIAFLDRPLAYFIRST
+:p.
+Œœ©ñ²Ä€@­ºŠ±¥Ø¡A€£ºÞ¬O§_¿ïšúšä¥LŠ±¥Ø¡C
+
+:xmp.
+/* REXX - This command starts playing */
+
+rc=SysSetObjectData('x&colon.\path_to_folder','MEDIAFLDRPLAYFIRST=1')
+:exmp.
+
+
+:h2 res=212
+x=50% width=50%
+group=2
+.MEDIAFLDRPREV
+:p.
+Œœ©ñ®Éžõšì«e€@Š±¥Ø¡C
+:xmp.
+/* REXX - This command skips to the previous track */
+
+rc=SysSetObjectData('x&colon.\path_to_folder','MEDIAFLDRPREV=1')
+:exmp.
+
+:h2 res=216
+x=50% width=50%
+group=2
+.MEDIAFLDRREPEAT
+:p.
+³]©w­«ÂÐÄÝ©Ê¡C­Y³]¬° 1 «hžê®Æ§š€€ªºŠ±¥Ø·|­«ÂÐŒœ©ñ¡A­Y³]¬° 0 «h€£­«ÂÐŒœ©ñ¡C
+:xmp.
+/* REXX - This command sets repeat to yes */
+
+rc=SysSetObjectData('x&colon.\path_to_folder','MEDIAFLDRREPEAT=1')
+:exmp.
+
+:h2 res=213
+x=50% width=50%
+group=2
+.MEDIAFLDRSTOP
+:p.
+°±€îŒœ©ñ
+:xmp.
+/* REXX - This command stops playing */
+
+rc=SysSetObjectData('x&colon.\path_to_folder','MEDIAFLDRSTOP=1')
+:exmp.
+
+:h2 res=214
+x=50% width=50%
+group=2
+.MEDIAFLDRVOLUME
+:p.
+§ó§ï­µ¶q¡]0 ~ 100%¡^¡C
+:xmp.
+/* REXX - This command sets the volume to 35% */
+
+rc=SysSetObjectData('x&colon.\path_to_folder','MEDIAFLDRVOLUME=35')
+:exmp.
+
+.********************************************
+
+:h2 res=220
+x=50% width=50%
+group=2
+.MMAUDIOTRACKNAME
+:p.
+³]©w­µ°TÀÉ®×ªºŠ±¥ØŠWºÙ¡C³o­Óžê°T·|ÀxŠsŠbÀÉ®×ªº©µŠùÄÝ©Ê€€¡C¹ï MP3 ÀÉ®×ŠÓš¥¡A³o­Óžê°T id €]·|³QÀxŠsŠb ID3 tag €€¡C
+:xmp.
+/* REXX - This command adds the track name to the audio file */
+
+rc=SysSetObjectData('x&colon.\path_to_folder\audio_file.ext','MMAUDIOTRACKNAME=The track name')
+:exmp.
+
+:h2 res=221
+x=50% width=50%
+group=2
+.MMAUDIOARTIST
+:p.
+³]©w­µ°TÀÉ®×ªººt¥XªÌŠWºÙ¡C³o­Óžê°T·|ÀxŠsŠbÀÉ®×ªº©µŠùÄÝ©Ê€€¡C¹ï MP3 ÀÉ®×ŠÓš¥¡A³o­Óžê°T id €]·|³QÀxŠsŠb ID3 tag €€¡C
+:xmp.
+/* REXX - This command adds the artist name to the audio file */
+
+rc=SysSetObjectData('x&colon.\path_to_folder\audio_file.ext','MMAUDIOARTIST=Artist name')
+:exmp.
+
+:h2 res=222
+x=50% width=50%
+group=2
+.MMAUDIOALBUM
+:p.
+³]©w­µ°TÀÉ®×ªº±M¿èŠWºÙ¡C³o­Óžê°T·|ÀxŠsŠbÀÉ®×ªº©µŠùÄÝ©Ê€€¡C¹ï MP3 ÀÉ®×ŠÓš¥¡A³o­Óžê°T id €]·|³QÀxŠsŠb ID3 tag €€¡C
+:xmp.
+/* REXX - This command adds the album name to the audio file */
+
+rc=SysSetObjectData('x&colon.\path_to_folder\audio_file.ext','MMAUDIOALBUM=Album name')
+:exmp.
+
+:h2 res=223
+x=50% width=50%
+group=2
+.MMAUDIOCOMMENT
+:p.
+³]©w­µ°TÀÉ®×ªºµùžÑ¡C³o­Óžê°T·|ÀxŠsŠbÀÉ®×ªº©µŠùÄÝ©Ê€€¡C¹ï MP3 ÀÉ®×ŠÓš¥¡A³o­Óžê°T id €]·|³QÀxŠsŠb ID3 tag €€¡C
+:xmp.
+/* REXX - This command adds a comment to the audio file */
+
+rc=SysSetObjectData('x&colon.\path_to_folder\audio_file.ext','MMAUDIOCOMMENT=Track comment')
+:exmp.
+
+:h2 res=224
+x=50% width=50%
+group=2
+.MMAUDIOYEAR
+:p.
+©w­µ°TÀÉ®×ªºŠ~¥÷¡C³o­Óžê°T·|ÀxŠsŠbÀÉ®×ªº©µŠùÄÝ©Ê€€¡C¹ï MP3 ÀÉ®×ŠÓš¥¡A³o­Óžê°T id €]·|³QÀxŠsŠb ID3 tag €€¡C
+:xmp.
+/* REXX - This command adds the year to the audio file */
+
+rc=SysSetObjectData('x&colon.\path_to_folder\audio_file.ext','MMAUDIOYEAR=2003')
+:exmp.
+
+:h2 res=225
+x=50% width=50%
+group=2
+.MMAUDIOGENRE
+:p.
+©w­µ°TÀÉ®×ªº­·®æÃþ«¬¡C³o­Óžê°T·|ÀxŠsŠbÀÉ®×ªº©µŠùÄÝ©Ê€€¡C¹ï MP3 ÀÉ®×ŠÓš¥¡A³o­Óžê°T id €]·|³QÀxŠsŠb ID3 tag €€¡C
+:xmp.
+/* REXX - This command adds the genre of the audio file */
+
+rc=SysSetObjectData('x&colon.\path_to_folder\audio_file.ext','MMAUDIOGENRE=Blues')
+:exmp.
+
+:h2 res=226
+x=50% width=50%
+group=2
+.MMREFRESH
+:p.
+±q·sÅªšúÀÉ®×ªº­µ°Tžê°T¡AšÃ§ó·s€º³¡ªºª«¥óžê®Æ¡C
+:xmp.
+/* REXX - This command adds the genre of the audio file */
+
+rc=SysSetObjectData('x&colon.\path_to_folder\audio_file.ext','MMREFRESH=1')
+:exmp.
+
+:h2 res=227
+x=50% width=50%
+group=2
+.MMAUDIOCOPYTAGTO
+:p.
+±q·sÅªšúÀÉ®×ªº­µ°Tžê°T¡AšÃ§ó·s€º³¡ªºª«¥óžê®Æ¡C
+:xmp.
+/* REXX - This command adds the genre of the audio file */
+
+rc=SysSetObjectData('x&colon.\path_to_folder\audio_file.ext','MMAUDIOCOPYTAGTO=x&colon.\path_to_folder\another_file.ext')
+:exmp.
+
+
+.********************************************
+
+:h1 res=300.REXX interface
+:p.
+šÏ¥Î REXX ¬É­±ªºŽy­z»yš¥šÓµn¿ýŽCÅéžê®Æ§šªºÃþ§O€èªk¡C€äŽ©€F WPS¡Bhelper ¥\¯à€Î€@šÇ¥Ñ WPS-Wizard ©ÒŽ£šÑªº PM µøµ¡¥\¯àªº³Ì­«­n€èªk¡C
+
+:p.
+šÏ¥Î¥]žËšçŠ¡¡]wrapper function¡^®É·|©I¥sŽCÅéžê®Æ§š€èªk¡C
+
+:table cols='20 35'.
+:row.
+:c.:link reftype=hd res=320.MFldrCallFunc:elink.
+:c.©I¥s¥ÑŽCÅéžê®Æ§š©ÒŸÉ€Jªº€èªk¡C
+:etable.
+:p.
+šÏ¥Î¥H€U¥\¯à®É·|©I¥s¥ÑŠhŽCÅéÃþ§O©ÒŸÉ€Jªº€èªk¡C
+:table cols='20 35'.
+:row.
+:c.:link reftype=hd res=330.MMCallFunc:elink.
+:c.©I¥s¥ÑŠhŽCÅéÃþ§O¡]CWAudio, CWMP3, CWOGG¡^©ÒŸÉ€Jªº€èªk¡C
+:etable.
+
+:p.
+Šb WPS štµž¡]PM µ{Š¡¡^€€ªºŽy­zµ{Š¡·|Šb­Ó§Oªº°õŠæºü€€°õŠæ¡C§A€]¥i¯àšÏ¥ÎÃB¥~ªº REXX dlls¡CREXX Žy­zµ{Š¡ªºŠWºÙ€£­«­n¡AŠý¬OÀÉ®×¥²¶·šãŠ³µùžÑ€~¯à±Ò°Ê¡C
+
+.*************************************
+
+.***********************************************
+
+:h2 res=320
+width=30%
+.MFldrCallFunc
+:link reftype=hd res=321
+auto dependent group=2.
+:p.
+šÏ¥Î³o­Ó¥\¯àšÓ©I¥s€@­Ó·sŽCÅéžê®Æ§š€èªk©Î helper €èªk¡C
+:p.
+:link reftype=hd res=321 dependent.»yªk:elink.
+.*.br
+.*:link reftype=hd res=322.°ÑŒÆ:elink.
+.br
+:link reftype=hd res=323 dependent.ªðŠ^:elink.
+.br
+:link reftype=hd res=324 dependent.³Æµù:elink.
+.*.br
+.*:link reftype=hd res=325.šÏ¥Î:elink.
+.br
+:link reftype=hd res=326.œdšÒ:elink.
+
+:h2 res=321
+x=30%
+width=70%
+group=2
+hide
+.MFldrCallFunc - »yªk
+:xmp.
+/* Call a method from REXX */
+
+methodName  /* The name of a method */
+Object         /* Object on which the method is invoked */
+param1         /* First method parameter */
+param2         /* Second method parameter */
+:p.
+rc=MFldrCallFunc(methodName, Object, 
+                 param1, param2, ...);
+:exmp.
+
+
+:h2 res=322
+x=30%
+width=70%
+group=2
+hide
+.MFldrCallFunc - °ÑŒÆ
+:p.
+
+:h2 res=323
+x=30%
+width=70% height=35%
+group=3
+hide
+.MFldrCallFunc - ªðŠ^­È
+:p.
+ªðŠ^­ÈšúšM©ó³Q©I¥sªº€èªk¡A¥i¯à¬O€@­ÓŠr²ÅŠê©Î€@­ÓŒÆ­È¡CžÔ±¡œÐ¬Ý€èªkŽy­z¡C
+:p.
+­Y§ä€£šì€èªk«h·|ªðŠ^ :hp2.ERROR_METHOD&colon.:ehp2. Šr²ÅŠê¡C
+
+:h2 res=324
+x=30%
+width=70%
+group=2
+hide
+.MFldrCallFunc - ³Æµù
+:p.
+³Q©I¥sªº€èªk¥²¶·¬O :hp2.Object:ehp2. ª«¥óªºŠš­û¡C­Yª«¥ó€£€äŽ©©Ò­nšDªº€èªkŽN·|µo¥Í¿ù»~¡CšÒŠp CWMediaFolder ª«¥ó€£€äŽ©ŠpŠP CWAudio ª«¥óªº€èªk¡C
+
+:h2 res=325
+x=30%
+width=70%
+group=2
+hide
+.MFldrCallFunc - šÏ¥Î
+:p.
+
+:h2 res=326
+x=30%
+width=70%
+group=2
+hide
+.MFldrCallFunc - œdšÒ
+:xmp.
+/* This example queries the first object in  */
+/* a CWMediaFolder, gets the linked file and */
+/* queries the name of the artist from the   */
+/* ID3 tag.                                  */
+
+/* Get the first object of folder theFolder */
+theObject=MFldrCallWPSFunc("wpQueryContent", theFolder, 0, QC_FIRST)
+
+/* Get the linked file system object from the shadow.
+   cwGetFileSystemObject is a member of the
+   CWMediaFolder class. */
+theFileObj=MFldrCallFunc("cwGetFileSystemObject", theFolder, theObject)
+
+/* Get the artist name. cwmmQueryTrackInfo is a member of the
+   CWAudio class. Every object in the CWMediaFolder is usually
+   a shadow to an object instance of a subclass of CWAudio */
+theName=MFldrCallFunc("cwmmQueryTrackInfo", theFileObj, 2)
+
+/* Display the name */
+rc=RxMessageBox("The artist name : "||theName)
+:exmp.
+
+.*********************************************
+.***********************************************
+
+:h2 res=330
+width=30%
+.MMCallFunc
+:link reftype=hd res=331
+auto dependent group=2.
+:p.
+šÏ¥Î³o­Ó¥\¯àšÓ©I¥s»P :hp2.CWAudio/MMAudio:ehp2. €@ŠP³QŸÉ€Jªº·sŠhŽCÅéÃþ§O¡C
+:p.
+:link reftype=hd res=331 dependent.»yªk:elink.
+.*.br
+.*:link reftype=hd res=332.°ÑŒÆ:elink.
+.br
+:link reftype=hd res=333 dependent.ªðŠ^:elink.
+.br
+:link reftype=hd res=334 dependent.³Æµù:elink.
+.*.br
+.*:link reftype=hd res=335.šÏ¥Î:elink.
+.br
+:link reftype=hd res=336.œdšÒ:elink.
+
+:h2 res=331
+x=30%
+width=70%
+group=2
+hide
+.MMCallFunc - »yªk
+:xmp.
+/* Call a method from REXX */
+
+methodName  /* The name of a method */
+Object         /* Object on which the method is invoked */
+param1         /* First method parameter */
+param2         /* Second method parameter */
+:p.
+rc=MMCallFunc(methodName, Object, 
+                 param1, param2, ...);
+:exmp.
+
+
+:h2 res=332
+x=30%
+width=70%
+group=2
+hide
+.MMCallFunc - °ÑŒÆ
+:p.
+
+:h2 res=333
+x=30%
+width=70% height=35%
+group=3
+hide
+.MMCallFunc - ªðŠ^­È
+:p.
+ªðŠ^­ÈšúšM©ó³Q©I¥sªº€èªk¡A¥i¯à¬O€@­ÓŠr²ÅŠê©Î€@­ÓŒÆ­È¡CžÔ±¡œÐ¬Ý€èªkŽy­z¡C
+:p.
+­Y§ä€£šì€èªk«h·|ªðŠ^ :hp2.ERROR_METHOD&colon.:ehp2. Šr²ÅŠê¡C
+
+:h2 res=334
+x=30%
+width=70%
+group=2
+hide
+.MMCallFunc - ³Æµù
+:p.
+³Q©I¥sªº€èªk¥²¶·¬O :hp2.Object:ehp2. ª«¥óªºŠš­û¡C­Yª«¥ó€£€äŽ©©Ò­nšDªº€èªkŽN·|µo¥Í¿ù»~¡CšÒŠp CWMediaFolder ª«¥ó€£€äŽ©ŠpŠP CWAudio ª«¥óªº€èªk¡C
+:p.
+Š¹¥\¯àŠb€§«eÄÀ©ñªºÃþ§OºÙ¬° :hp2.MMClsCallFunc:ehp2.¡C€Ž€äŽ©Š¹ŠWºÙ€£¹L€w³Q depracted¡C
+
+:h2 res=335
+x=30%
+width=70%
+group=2
+hide
+.MMCallFunc - šÏ¥Î
+:p.
+
+:h2 res=336
+x=30%
+width=70%
+group=2
+hide
+.MMCallFunc - œdšÒ
+:xmp.
+/* This example queries the first object in  */
+/* a CWMediaFolder, gets the linked file and */
+/* queries the name of the artist from the   */
+/* ID3 tag.                                  */
+
+/* Get the first object of folder theFolder */
+theObject=WPSWizCallWPSFunc("wpQueryContent", theFolder, 0, QC_FIRST)
+
+/* Get the linked file system object from the shadow.
+   cwGetFileSystemObject is a member of the
+   CWMediaFolder class. */
+theFileObj=MFldrCallFunc("cwGetFileSystemObject", theFolder, theObject)
+
+/* Get the artist name. cwmmQueryTrackInfo is a member of the
+   CWAudio class. Every object in the CWMediaFolder is usually
+   a shadow to an object instance of a subclass of CWAudio */
+theName=MMCallFunc("cwmmQueryTrackInfo", theFileObj, 2)
+
+/* Display the name */
+rc=RxMessageBox("The artist name : "||theName)
+:exmp.
+
+
+.im tw\wpsmethods_tw.inc
+
+:h1 res=400
+x=left y=bottom width=50%.ÁôÂÃ¶µ¥Ø
+:p.
+¥H€Uªº CW-multimedia Ãþ§O¶µ¥Ø¥i¥HŠb :hp2.OS2.INI:ehp2. €€³]©w€@šÇ­ÈšÓ±Ò¥Î¡C
+:ul.
+:li.:link reftype=hd res=410.šú¥N­µ°TŒœ©ñŸ¹:elink.
+:li.:link reftype=hd res=411.šú¥N­µ°Tœs¿èŸ¹:elink.
+:li.:link reftype=hd res=412.šú¥N AVI Œœ©ñŸ¹:elink.
+:li.:link reftype=hd res=413.šú¥N MPG Œœ©ñŸ¹:elink.
+:li.:link reftype=hd res=419.šú¥N MP3 Œœ©ñŸ¹:elink.
+:li.:link reftype=hd res=414.šú¥NŒv¹³œs¿èŸ¹:elink.
+:li.:link reftype=hd res=415.Šb CD €W±Ò¥ÎŒv¹³©ú²Ó¥\¯à:elink.
+:li.:link reftype=hd res=416.°±¥Î¹Ï°OŒÐÃDŠC€Wªº®É¶¡Åã¥Ü:elink.
+:li.:link reftype=hd res=417.°±¥ÎŒœ©ñ±±šîªº°{Ät¡]Œœ©ñ¡BŒÈ°±¡^:elink.
+:li.:link reftype=hd res=418.€£­n±N§ëŒv«Ø¥ßšìŽCÅéŒœ©ñŸ¹ŒÒª©:elink.
+:li.:link reftype=hd res=420.°±¥Î­µ°TÀÉ®×ªºÀË¬d:elink.
+:li.:link reftype=hd res=421.°±¥Î ID3 tag ªºÅªšú:elink.
+:eul.
+
+.im tw\hiddenfeatures_tw.inc
+
+:h1 res=500.©µŠùÄÝ©Ê
+:p.
+­µ°TÀÉ®×ªºžê°T·|ÀxŠsŠbÀÉ®×ªº©µŠùÄÝ©Ê€€¡A¥i¥H³QšäŠíªºµ{Š¡©Î REXX ©ÒšÏ¥Î¡C¥Ø«e³Q©wžqªº©µŠùÄÝ©ÊŠp€U¡C
+
+:table cols='20 35'.
+:row.
+:c.MMALBUM
+:c.Š¹Š±¥Ø©ÒÄÝªº±M¿è
+:row.
+:c.MMARTIST
+:c.ºt¥XªÌ©mŠW
+:row.
+:c.MMBPS
+:c.Bits per sample
+:row.
+:c.MMCHANNELS
+:c.Án¹DŒÆ¥Ø
+:row.
+:c.MMCOMMENT
+:c.Š¹ÀÉ®×ªºµùžÑ
+:row.
+:c.MMGENRE
+:c.Š¹­µ°TÀÉ®×ªº­·®æÃþ«¬
+:row.
+:c.MMNUMAUDIOBYTES
+:c.ŠbŠ¹­µ°TÀÉ®×€€ªº­µ°T bytes ŒÆ¥Ø
+:row.
+:c.MMPLAYTIME
+:c.Œœ©ñ®É¶¡¡]¬í¡^
+:row.
+:c.MMPLAYTIMEMS
+:c.Œœ©ñ®É¶¡¡]²@¬í¡^
+:row.
+:c.MMSAMPLERATE
+:c.šúŒË³t«×
+:row.
+:c.MMTRACKNAME
+:c.Š±¥ØŠWºÙ
+:row.
+:c.MMYEAR
+:c.Š~¥÷
+:etable.
+
+:nt.
+žê®Æ¬O¥H ASCII ®æŠ¡ÀxŠs¡C
+:ent.
+:euserdoc.
+\
Index: /tags/CWMM-0.3.0_GA/mediafolder/prog_tutorial/tw/newmethods_tw.inc
===================================================================
--- /tags/CWMM-0.3.0_GA/mediafolder/prog_tutorial/tw/newmethods_tw.inc	(revision 213)
+++ /tags/CWMM-0.3.0_GA/mediafolder/prog_tutorial/tw/newmethods_tw.inc	(revision 213)
@@ -0,0 +1,510 @@
+.******************************************************
+
+:h2 res=1010
+width=30%
+.cwGetFileSystemObject
+:link reftype=hd res=1011
+auto dependent group=2.
+:p.
+:link reftype=hd res=1011.»yªk:elink.
+.br
+:link reftype=hd res=1013 dependent.ªðŠ^:elink.
+.br
+:link reftype=hd res=1014 dependent.³Æµù:elink.
+.*.br
+.*:link reftype=hd res=315.šÏ¥Î:elink.
+.*.br
+.*:link reftype=hd res=416 dependent.œdšÒ:elink.
+
+:h2 res=1011
+x=30%
+width=70%
+hide
+group=2
+.cwGetFileSystemObject - »yªk
+:xmp.
+/* Get the file system object a shadow links to */
+
+mediaFolder   /* Pointer to a media folder */
+theShadow     /* A shadow object  */
+:p.
+fsObj=MFldrCallFunc("cwGetFileSystemObject", 
+                        mediaFolder, theShadow);
+:exmp.
+
+
+:h2 res=1013
+x=30%
+width=70% height=35%
+group=3
+hide
+.cwGetFileSystemObject - ªðŠ^­È
+:p.
+:hp2.fsObj:ehp2. numeric
+:p.
+ªðŠ^­È¬O§ëŒv :hp2.theShadow:ehp2. ©Ò³sµ²ªºÀÉ®×št²Îª«¥óªº«üŒÐ¡C­Y³sµ²¥¢±Ñ«h·|ªðŠ^ 0 ­È¡C
+
+:h2 res=1014
+x=30%
+width=70%
+hide
+group=2
+.cwGetFileSystemObject - ³Æµù
+:p.
+³o­Ó€èªk¬OŽCÅéžê®Æ§šªºŠš­û¡A©Ò¥H¥²¶·Ž£šÑ¶Çµ¹ŽCÅéžê®Æ§šªº«üŒÐ¡C
+:p.
+³o­Ó€èªk¬O¥Ñ CWProgFolder Ãþ§O¡]³o¬OŽX­Ó·sžê®Æ§šÃþ§Oªº¥ÀÃþ§O¡^©ÒŸÉ€Jªº¡C©Ò¥H§A€]¥i¥H±N«üŒÐ¶Çµ¹ CWProgFolder ªºšä¥L€lÃþ§O¡C€U­±ªíŠC€@šÇ€lÃþ§O¡C
+
+:ul.
+:li.CWAudioFolder
+:li.CWDataFolder
+:li.CWMediaFolder
+:eul.
+
+
+
+.******************************************************
+:h2 res=1040
+width=30%
+.cwPauseAudioFile
+:link reftype=hd res=1041
+auto dependent group=2.
+:p.
+:link reftype=hd res=1041.»yªk:elink.
+.br
+:link reftype=hd res=1043 dependent.ªðŠ^:elink.
+.br
+:link reftype=hd res=1044 dependent.³Æµù:elink.
+.*.br
+.*:link reftype=hd res=315.šÏ¥Î:elink.
+.*.br
+.*:link reftype=hd res=416 dependent.œdšÒ:elink.
+
+:h2 res=1041
+x=30%
+width=70%
+hide
+group=2
+.cwPauseAudioFile - »yªk
+:xmp.
+/* This method pauses playing */
+
+mediaFolder   /* Pointer to the media folder */
+frameHandle   /* Handle of the folder frame  */
+:p.
+rc=MFldrCallFunc("cwPauseAudioFile", 
+                        mediaFolder, frameHandle);
+:exmp.
+
+
+:h2 res=1043
+x=30%
+width=70% height=35%
+group=3
+hide
+.cwPauseAudioFile - ªðŠ^­È
+:p.
+:hp2.rc:ehp2. ŒÆ­È
+:p.
+
+
+:h2 res=1044
+x=30%
+width=70%
+hide
+group=2
+.cwPauseAudioFile - ³Æµù
+:p.
+ŽCÅéžê®Æ§šªº frame handle ·|¶Çµ¹Žy­z»yš¥¥H°µ¬°±Ò°Ê®Éªº°ÑŒÆ¡C
+
+.******************************************************
+:h2 res=1050
+width=30%
+.cwPlayAudioFile
+:link reftype=hd res=1051
+auto dependent group=2.
+:p.
+:link reftype=hd res=1051.»yªk:elink.
+.br
+:link reftype=hd res=1053 dependent.ªðŠ^:elink.
+.br
+:link reftype=hd res=1054 dependent.³Æµù:elink.
+.*.br
+.*:link reftype=hd res=315.šÏ¥Î:elink.
+.*.br
+.*:link reftype=hd res=416 dependent.œdšÒ:elink.
+
+:h2 res=1051
+x=30%
+width=70%
+hide
+group=2
+.cwPlayAudioFile - »yªk
+:xmp.
+/* This method starts playing the contents 
+    of the media folder */
+
+mediaFolder   /* Pointer to the media folder */
+frameHandle   /* Handle of the folder frame  */
+flag          /* Flag specifying which track to start */
+:p.
+rc=MFldrCallFunc("cwPlayAudioFile", 
+                        mediaFolder, frameHandle, flag);
+:exmp.
+
+:h2 res=1053
+x=30%
+width=70% height=35%
+group=3
+hide
+.cwPlayAudioFile - ªðŠ^­È
+:p.
+:hp2.rc:ehp2. ŒÆ­È
+:p.
+
+
+:h2 res=1054
+x=30%
+width=70%
+hide
+group=2
+.cwPlayAudioFile - ³Æµù
+:p.
+ŽCÅéžê®Æ§šªº frame handle ·|¶Çµ¹Žy­z»yš¥¥H°µ¬°±Ò°Ê®Éªº°ÑŒÆ¡CºXŒÐ°ÑŒÆ¥i¯àŠ³¥H€Uªº­È¡C
+
+:ul.
+:li.PLAY_FIRST    1
+.br
+¶}±ÒŽCÅéžê®Æ§š€€ªº²Ä€@­Ó­µ°TŠ±¥Ø¡C­YŠ³¿ïšúŠ±¥Ø¡A«h¥ýŒœ©ñ©Ò¿ïšúªº²Ä€@­ÓŠ±¥Ø¡C
+:li.PLAY_NEXT     2
+.br
+Œœ©ñ€U€@Š±¥Ø
+:li.PLAY_PREV     3
+.br
+Œœ©ñ«e€@¹DŠ±¥Ø¡C
+:eul.
+
+
+.******************************************************
+:h2 res=1060
+width=30%
+.cwQueryCurrentlyPlayingObject
+:link reftype=hd res=1061
+auto dependent group=2.
+:p.
+:link reftype=hd res=1061.»yªk:elink.
+.br
+:link reftype=hd res=1063 dependent.ªðŠ^:elink.
+.*.br
+.*:link reftype=hd res=1054 dependent.³Æµù:elink.
+.*.br
+.*:link reftype=hd res=315.šÏ¥Î:elink.
+.*.br
+.*:link reftype=hd res=416 dependent.œdšÒ:elink.
+
+:h2 res=1061
+x=30%
+width=70%
+hide
+group=2
+.cwQueryCurrentlyPlayingObject - »yªk
+:xmp.
+/* This method queries the pointer to the 
+   currently playing object */
+
+mediaFolder   /* Pointer to the media folder */
+:p.
+rc=MFldrCallFunc("cwQueryCurrentlyPlayingObject", 
+                  mediaFolder);
+:exmp.
+
+:h2 res=1063
+x=30%
+width=70% height=35%
+group=3
+hide
+.cwQueryCurrentlyPlayingObject - ªðŠ^­È
+:p.
+:hp2.rc:ehp2. numeric
+:p.
+ª«¥ó«üŒÐ¶Çµ¹¥Ø«e¥¿ŠbŒœ©ñªºª«¥ó¡A­YšSŒœ©ñ«h¬O 0¡C
+
+
+.******************************************************
+:h2 res=1090
+width=30%
+.cwSetStatusLineText
+:link reftype=hd res=1091
+auto dependent group=2.
+:p.
+:link reftype=hd res=1091.»yªk:elink.
+.br
+:link reftype=hd res=1093 dependent.ªðŠ^:elink.
+.br
+:link reftype=hd res=1094 dependent.³Æµù:elink.
+.*.br
+.*:link reftype=hd res=315.šÏ¥Î:elink.
+.*.br
+.*:link reftype=hd res=416 dependent.œdšÒ:elink.
+
+:h2 res=1091
+x=30%
+width=70%
+hide
+group=2
+.cwSetStatusLineText - »yªk
+:xmp.
+/* This method sets the status line text of a media folder */
+
+mediaFolder   /* Pointer to a media folder on which the method is invoked */
+theText       /* Text for status line or 0 */
+:p.
+info=MFldrCallFunc("cwSetStatusLineText", 
+                    mediaFolder, theText);
+:exmp.
+
+:h2 res=1093
+x=30%
+width=70% height=35%
+group=3
+hide
+.cwSetStatusLineText - ªðŠ^­È
+:p.
+:hp2.info:ehp2. ŠrŠê
+:p.
+
+
+:h2 res=1094
+x=30%
+width=70%
+hide
+group=2
+.cwSetStatusLineText - ³Æµù
+:p.
+­Y€åŠr°ÑŒÆ¬O 0¡A«hžê®Æ§š·|Åã¥ÜšäŒÐ·Çª¬ºAªº line text¡C
+
+
+.******************************************************
+:h2 res=1100
+width=30%
+.cwStopAudioFile
+:link reftype=hd res=1101
+auto dependent group=2.
+:p.
+:link reftype=hd res=1101.»yªk:elink.
+.br
+:link reftype=hd res=1103 dependent.ªðŠ^:elink.
+.br
+:link reftype=hd res=1104 dependent.³Æµù:elink.
+.*.br
+.*:link reftype=hd res=315.šÏ¥Î:elink.
+.*.br
+.*:link reftype=hd res=416 dependent.œdšÒ:elink.
+
+:h2 res=1101
+x=30%
+width=70%
+hide
+group=2
+.cwStopAudioFile - »yªk
+:xmp.
+/* This method stops playing */
+
+mediaFolder   /* Pointer to the media folder */
+frameHandle   /* Handle of the folder frame  */
+:p.
+rc=MFldrCallFunc("cwStopAudioFile", 
+                        mediaFolder, frameHandle);
+:exmp.
+
+
+:h2 res=1103
+x=30%
+width=70% height=35%
+group=3
+hide
+.cwStopAudioFile - ªðŠ^­È
+:p.
+:hp2.rc:ehp2. ŒÆ­È
+:p.
+
+
+:h2 res=1104
+x=30%
+width=70%
+hide
+group=2
+.cwStopAudioFile - ³Æµù
+:p.
+ŽCÅéžê®Æ§šªº frame handle ·|¶Çµ¹Žy­z»yš¥¥H°µ¬°±Ò°Ê®Éªº°ÑŒÆ¡C
+
+
+.******************************************************
+:h2 res=1070
+width=30%
+.cwmmQueryTrackInfo
+:link reftype=hd res=1071
+auto dependent group=2.
+:p.
+:link reftype=hd res=1071.»yªk:elink.
+.br
+:link reftype=hd res=1073 dependent.ªðŠ^:elink.
+.br
+:link reftype=hd res=1074 dependent.³Æµù:elink.
+.*.br
+.*:link reftype=hd res=315.šÏ¥Î:elink.
+.*.br
+.*:link reftype=hd res=416 dependent.œdšÒ:elink.
+
+:h2 res=1071
+x=30%
+width=70%
+hide
+group=2
+.cwmmQueryTrackInfo - »yªk
+:xmp.
+/* This method queries information from an
+   audio object */
+
+audioObject   /* Pointer to an audio object on which the method is invoked */
+flag          /* Flag specifying which info to query */
+:p.
+info=MMClsCallFunc("cwmmQueryTrackInfo", 
+                  audioObject, flag);
+:exmp.
+
+:h2 res=1073
+x=30%
+width=70% height=35%
+group=3
+hide
+.cwmmQueryTrackInfo - ªðŠ^­È
+:p.
+:hp2.info:ehp2. string
+:p.
+­nšDªºžê°T·|¥HŠrŠêªðŠ^¡C­YµLžê°T»ÝšD«h·|¶ÇŠ^ªÅŠrŠê¡C
+:p.
+­YŠ³¿ù»~µo¥Í¡A«h¶ÇŠ^ :hp2.ERROR&colon.:ehp2.¡C
+
+:h2 res=1074
+x=30%
+width=70%
+hide
+group=2
+.cwmmQueryTrackInfo - ³Æµù
+:p.
+ª«¥ó¥²¶·¬O :hp2.CWAudio:ehp2. ªº¹êÅé¡]instance¡^¡A©Î¬Ošä€lÃþ§O€§€@¡]:hp2.CWMP3:ehp2., :hp2.MMWAV:ehp2....¡^¡C³o­Ó€èªk¬O¥Ñ :hp2.CWAudio:ehp2. ©ÒŸÉ€J¡C±q V0.2.5 ª©°_¡AÃþ§OŠWºÙ¬° :hp2.MMAudio:ehp2.¡B:hp2.MMWAV:ehp2. µ¥µ¥¡A³£¯à»P OS/2 €€ªº IBM Ãþ§O¬Û®e¡C
+:p.
+Š¹ºXŒÐ°ÑŒÆ¥i¯àŠ³¥H€Uªº­È¡C
+:ul.
+:li.IDINFO_NAME              1
+.br
+Š±¥ØŠWºÙ
+:li.IDINFO_ARTIST            2
+.br
+ºt¥XªÌŠWºÙ
+:li.IDINFO_ALBUM             3
+.br
+±M¿èŠWºÙ
+:li.IDINFO_YEAR              4
+.br
+ID3 tag €€ªºŠ~¥÷
+:li.IDINFO_COMMENT           5
+.br
+µùžÑ
+:li.IDINFO_GENRE             6
+.br
+¥H­·®æÃþ«¬§@¬°ŠrŠê
+:li.IDINFO_PLAYTIME          7
+.br
+Œœ©ñ®É¶¡¡]¬í¡AŒÆ­È¡^
+:li.IDINFO_BPS               8
+.br
+Bits per sample (ŒÆ­È).
+:li.IDINFO_SAMPLERATE        9
+.br
+šúŒËÀW²v¡]Hz¡AŒÆ­È¡^
+:li.IDINFO_CHANNELS          10
+.br
+Number of channels (numeric value).
+:li.IDINFO_BITRATE           11
+.br
+Bitrate in Hz (ŒÆ­È)¡C³o­ÓºXŒÐ¥u¹ï MMMP3 €Î MMOGG ªºÃþ§O¹êÅéŠ³¥Î¡Ašä¥LÃþ§OªºªðŠ^­ÈµLªk³Q©wžq¡C³o¬O V0.2.7 ª©ªº·s¥\¯à¡C
+:eul.
+
+
+.******************************************************
+:h2 res=1080
+width=30%
+.cwmmQueryImageInfo
+:link reftype=hd res=1081
+auto dependent group=2.
+:p.
+:link reftype=hd res=1081.»yªk:elink.
+.br
+:link reftype=hd res=1082 dependent.Parameters:elink.
+
+.br
+:link reftype=hd res=1083 dependent.ªðŠ^:elink.
+.*.br
+.*:link reftype=hd res=1084 dependent.³Æµù:elink.
+.*.br
+.*:link reftype=hd res=315.šÏ¥Î:elink.
+.*.br
+.*:link reftype=hd res=416 dependent.œdšÒ:elink.
+
+:h2 res=1081
+x=30%
+width=70%
+hide
+group=2
+.cwmmQueryImageInfo - »yªk
+:xmp.
+/* This method queries information from an
+   image object */
+
+imageObject   /* Pointer to an image object on which the method is invoked */
+flag          /* Flag specifying which info to query */
+:p.
+info=MMCallFunc("cwmmQueryTrackInfo", 
+                  imageObject, flag);
+:exmp.
+
+:h2 res=1083
+x=30%
+width=70% height=35%
+group=3
+hide
+.cwmmQueryImageInfo - ªðŠ^­È
+:p.
+:hp2.info:ehp2. string
+:p.
+­nšDªºžê°T·|¥HŠrŠêªðŠ^¡C­YµLžê°T»ÝšD«h·|¶ÇŠ^ªÅŠrŠê¡C
+:p.
+­YŠ³¿ù»~µo¥Í¡A«h¶ÇŠ^ :hp2.ERROR&colon.:ehp2.¡C
+
+:h2 res=1082
+x=30%
+width=70%
+hide
+group=2
+.cwmmQueryImageInfo - °ÑŒÆ
+:p.
+:parml tsize=10.
+:pt.:hp2.imageObject:ehp2. (ŒÆ­È)
+:pd.Œv¹³ÀÉ®×ªºª«¥ó«üŒÐ¡C
+:pt.:hp2.flag:ehp2. (numeric)
+:pd.šM©w¬džßªºžê°T¡C
+:parml tsize=3.
+:pt.IDINFO_WIDTH    0x0001
+:pd.Œv¹³Œe«×
+:pt.IDINFO_HEIGHT   0x0002
+:pd.Œv¹³ªø«×
+:pt.IDINFO_BPP      0x0003  
+:pd.šC­Ó¹³¯Àªº bits ŒÆ¥Ø¡C
+:pt.IDINFO_FORMAT   0x0004  
+:pd.Œv¹³®æŠ¡¡C
+:eparml.
+:pt.:hp2.info:ehp2. (ŒÆ­È)
+:pd.¬džßžê°T§@¬°ŠrŠê¡C
+:eparml.
Index: /tags/CWMM-0.3.0_GA/mediafolder/prog_tutorial/tw/wpsmethods_tw.inc
===================================================================
--- /tags/CWMM-0.3.0_GA/mediafolder/prog_tutorial/tw/wpsmethods_tw.inc	(revision 213)
+++ /tags/CWMM-0.3.0_GA/mediafolder/prog_tutorial/tw/wpsmethods_tw.inc	(revision 213)
@@ -0,0 +1,40 @@
+
+
+:h1 res=1000
+width=30%
+.€äŽ©ªº€èªk
+:p.
+¥H€U¬O¥Ø«e€äŽ©ªº€èªk¡C
+:p.
+.br
+:link reftype=hd res=1010 dependent.cwGetFileSystemObject:elink.
+.br
+:link reftype=hd res=1040 dependent.cwPauseAudioFile:elink.
+.br
+:link reftype=hd res=1050 dependent.cwPlayAudioFile:elink.
+.br
+:link reftype=hd res=1060 dependent.cwQueryCurrentlyPlayingObject:elink.
+.br
+:link reftype=hd res=1090 dependent.cwSetStatusLineText:elink.
+.br
+:link reftype=hd res=1100 dependent.cwStopAudioFile:elink.
+.br
+:link reftype=hd res=1070 dependent.cwmmQueryTrackInfo:elink.
+.br
+:link reftype=hd res=1080 dependent.cwmmQueryImageInfo:elink.
+
+
+.im tw\newmethods_tw.inc
+
+
+
+
+
+
+
+
+
+
+
+
+
Index: /tags/CWMM-0.3.0_GA/mediafolder/prog_tutorial/wpsmethods.inc
===================================================================
--- /tags/CWMM-0.3.0_GA/mediafolder/prog_tutorial/wpsmethods.inc	(revision 213)
+++ /tags/CWMM-0.3.0_GA/mediafolder/prog_tutorial/wpsmethods.inc	(revision 213)
@@ -0,0 +1,40 @@
+
+
+:h1 res=1000
+width=30%
+.Supported methods
+:p.
+The following introduced methods are currently supported.
+:p.
+.br
+:link reftype=hd res=1010 dependent.cwGetFileSystemObject:elink.
+.br
+:link reftype=hd res=1040 dependent.cwPauseAudioFile:elink.
+.br
+:link reftype=hd res=1050 dependent.cwPlayAudioFile:elink.
+.br
+:link reftype=hd res=1060 dependent.cwQueryCurrentlyPlayingObject:elink.
+.br
+:link reftype=hd res=1090 dependent.cwSetStatusLineText:elink.
+.br
+:link reftype=hd res=1100 dependent.cwStopAudioFile:elink.
+.br
+:link reftype=hd res=1070 dependent.cwmmQueryTrackInfo:elink.
+.br
+:link reftype=hd res=1080 dependent.cwmmQueryImageInfo:elink.
+
+
+.im newmethods.inc
+
+
+
+
+
+
+
+
+
+
+
+
+
Index: /tags/CWMM-0.3.0_GA/mediafolder/res/Changes_res.txt
===================================================================
--- /tags/CWMM-0.3.0_GA/mediafolder/res/Changes_res.txt	(revision 213)
+++ /tags/CWMM-0.3.0_GA/mediafolder/res/Changes_res.txt	(revision 213)
@@ -0,0 +1,6 @@
+Mediafolder:
+Added:
+
+IDSTR_CDFOLDERNAME       "CD-Audio^Drive %c:"
+
+-------------------------------
Index: /tags/CWMM-0.3.0_GA/mediafolder/res/de/about_de.dlg
===================================================================
--- /tags/CWMM-0.3.0_GA/mediafolder/res/de/about_de.dlg	(revision 213)
+++ /tags/CWMM-0.3.0_GA/mediafolder/res/de/about_de.dlg	(revision 213)
@@ -0,0 +1,26 @@
+#define VER_STRING "Media-Ordner V" \
+MFLDR_VERSION \
+BUILD_STRING
+
+
+DLGTEMPLATE IDDLG_ABOUT LOADONCALL MOVEABLE DISCARDABLE
+BEGIN
+    DIALOG  "Information", IDDLG_ABOUT, 115, 69, 208, 132, WS_VISIBLE,
+            FCF_TITLEBAR
+    BEGIN
+        GROUPBOX        "", IDGB_ABOUT, 3, 21, 200, 108
+        CTEXT           VER_STRING, IDST_PRODNAME, 10, 107, 187,
+                        12, DT_VCENTER | NOT WS_GROUP
+        CTEXT           MFLDR_AUTHOR, IDST_PRODCOPY, 10, 87,
+                        186, 12, DT_VCENTER | NOT WS_GROUP
+        CTEXT           "Copyright (c) netlabs.org 2020",
+                        IDST_PRODCOPY2, 10, 64, 186, 12, DT_VCENTER | NOT WS_GROUP
+        CTEXT           "Graphiken von Klaus Staedtler-Przyborski",
+                        IDST_PRODGRAPHICS, 10, 64, 186, 17, DT_WORDBREAK |
+                        NOT WS_GROUP
+        CTEXT           "https://trac.netlabs.org/cwmmclasses", IDST_URL1,
+                        10, 30, 186, 18, DT_WORDBREAK | NOT WS_GROUP
+                        PRESPARAMS PP_FONTNAMESIZE, "8.Helv"
+        DEFPUSHBUTTON   "~Ok", DID_OK, 83, 3, 40, 14
+    END
+END
Index: /tags/CWMM-0.3.0_GA/mediafolder/res/de/about_ecs_de.dlg
===================================================================
--- /tags/CWMM-0.3.0_GA/mediafolder/res/de/about_ecs_de.dlg	(revision 213)
+++ /tags/CWMM-0.3.0_GA/mediafolder/res/de/about_ecs_de.dlg	(revision 213)
@@ -0,0 +1,25 @@
+#define VER_STRING "Media-Ordner V" \
+MFLDR_VERSION \
+BUILD_STRING
+
+ICON IDICON_FOLDER1  "../icons_ecs/mediafolder1.ico"
+
+DLGTEMPLATE IDDLG_ABOUT LOADONCALL MOVEABLE DISCARDABLE
+BEGIN
+    DIALOG  "Produktinformation", IDDLG_ABOUT, 110, 125, 184, 58,
+            WS_VISIBLE, FCF_TITLEBAR
+    BEGIN
+        ICON            IDICON_FOLDER1, IDICON_FOLDER1, 5, 33, 16, 15,
+                        WS_GROUP
+        LTEXT           "Multimedia-Integration fr die Arbeitsoberflche",
+                        IDST_PRODNAME, 28, 44, 154, 10, DT_VCENTER | NOT
+                        WS_GROUP
+                        //PRESPARAMS PP_FONTNAMESIZE, "9.WarpSans Bold"
+        CONTROL         "", 607, 28, 37, 150, 7, "CW_SEPARATOR", WS_VISIBLE
+        LTEXT           MFLDR_AUTHOR, IDST_PRODCOPY, 10,
+                        25, 184, 11, DT_VCENTER | NOT WS_GROUP
+                        //PRESPARAMS PP_FONTNAMESIZE, "9.WarpSans"
+        DEFPUSHBUTTON   "~Ok", IDSTR_CLOSETEXT, 10, 3, 30, 11
+    END
+END
+
Index: /tags/CWMM-0.3.0_GA/mediafolder/res/de/create_res_de_def.CMD
===================================================================
--- /tags/CWMM-0.3.0_GA/mediafolder/res/de/create_res_de_def.CMD	(revision 213)
+++ /tags/CWMM-0.3.0_GA/mediafolder/res/de/create_res_de_def.CMD	(revision 213)
@@ -0,0 +1,65 @@
+/* */
+call RxFuncAdd 'SysLoadFuncs', 'RexxUtil', 'SysLoadFuncs'
+call SysLoadFuncs
+
+deffile=ARG(1)
+if ARG(1)="" then deffile="tst.def"
+
+SAY ""
+SAY "Creating DEF file "deffile
+SAY ""
+
+theVersion=VALUE("MMCLSVERSION", ,"OS2ENVIRONMENT")
+if theVersion="" THEN theVersion=0.0.0
+
+def="; mediafolder_de.def: DEF-file for german resource DLL"||'0d'x||'0a'x
+def=def||";"||'0d'x||'0a'x
+def=def||";The following license applies ONLY TO THIS resource DLL. Be aware"||'0d'x||'0a'x
+def=def||";that the whole Media-folder package may be covered by another license."||'0d'x||'0a'x
+def=def||";"||'0d'x||'0a'x
+def=def||";/*"||'0d'x||'0a'x
+def=def||"; * Copyright (c) Chris Wohlgemuth 2002-2005 Netlabs 2023-"||WORD(DATE(), 3)  ||'0d'x||'0a'x
+def=def||"; * All rights reserved."||'0d'x||'0a'x
+def=def||"; *"||'0d'x||'0a'x
+def=def||"; * http://www.geocities.com/SiliconValley/Sector/5785/"||'0d'x||'0a'x
+def=def||"; * http://www.os2world.com/cdwriting"||'0d'x||'0a'x
+def=def||"; *"||'0d'x||'0a'x
+def=def||"; * Redistribution and use in source and binary forms, with or without"||'0d'x||'0a'x
+def=def||"; * modification, are permitted provided that the following conditions"||'0d'x||'0a'x
+def=def||"; * are met:"||'0d'x||'0a'x
+def=def||"; * 1. Redistributions of source code must retain the above copyright"||'0d'x||'0a'x
+def=def||"; *    notice, this list of conditions and the following disclaimer."||'0d'x||'0a'x
+def=def||"; * 2. Redistributions in binary form must reproduce the above copyright"||'0d'x||'0a'x
+def=def||"; *    notice, this list of conditions and the following disclaimer in the"||'0d'x||'0a'x
+def=def||"; *    documentation and/or other materials provided with the distribution."||'0d'x||'0a'x
+def=def||"; * 3. The authors name may not be used to endorse or promote products"||'0d'x||'0a'x
+def=def||"; *    derived from this software without specific prior written permission."||'0d'x||'0a'x
+def=def||"; *"||'0d'x||'0a'x
+def=def||"; * THIS SOFTWARE IS PROVIDED ``AS IS'' AND"||'0d'x||'0a'x
+def=def||"; * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE"||'0d'x||'0a'x
+def=def||"; * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE"||'0d'x||'0a'x
+def=def||"; * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE"||'0d'x||'0a'x
+def=def||"; * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL"||'0d'x||'0a'x
+def=def||"; * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS"||'0d'x||'0a'x
+def=def||"; * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)"||'0d'x||'0a'x
+def=def||"; * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT"||'0d'x||'0a'x
+def=def||"; * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY"||'0d'x||'0a'x
+def=def||"; * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF"||'0d'x||'0a'x
+def=def||"; * SUCH DAMAGE."||'0d'x||'0a'x
+def=def||"; *"||'0d'x||'0a'x
+def=def||"; */"||'0d'x||'0a'x
+
+def=def||'0d'x||'0a'x
+
+def=def||"LIBRARY MFLDR_DE INITINSTANCE TERMINSTANCE"||'0d'x||'0a'x
+def=def||"DESCRIPTION '$@# Netlabs CWMM Team"
+def=def||":"||theVersion||" #@##1## "||DATE("E")||" "||TIME("N")||"       Zobopeep ::::"||WORD(TRANSLATE(theVersion," ", "."),3)||"::@@Media-Folder DE res DLL (C) C. Wohlgemuth 2001-2005 Netlabs CWMM Team 2023-"||WORD(DATE(),3)||"'"||'0d'x||'0a'x
+def=def||"DATA MULTIPLE NONSHARED"||'0d'x||'0a'x
+def=def||"EXPORTS  "||'0d'x||'0a'x
+def=def||"        queryLanguage"||'0d'x||'0a'x
+
+'@type NUL > 'deffile
+call lineout deffile,def
+call stream deffile, "C", "close"
+exit
+
Index: /tags/CWMM-0.3.0_GA/mediafolder/res/de/makefile
===================================================================
--- /tags/CWMM-0.3.0_GA/mediafolder/res/de/makefile	(revision 213)
+++ /tags/CWMM-0.3.0_GA/mediafolder/res/de/makefile	(revision 213)
@@ -0,0 +1,17 @@
+
+include ../../../make.inc
+include ../../../build.inc
+
+all:
+	cd ./.. && make
+
+clean:
+	
+cleaner:
+	-rm *.flc
+	-rm *.*~
+
+distribution:
+
+	
+
Index: /tags/CWMM-0.3.0_GA/mediafolder/res/de/mediafolder_de.c
===================================================================
--- /tags/CWMM-0.3.0_GA/mediafolder/res/de/mediafolder_de.c	(revision 213)
+++ /tags/CWMM-0.3.0_GA/mediafolder/res/de/mediafolder_de.c	(revision 213)
@@ -0,0 +1,26 @@
+/*
+ * This file is (C) Chris Wohlgemuth 1999
+ */
+/*
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; see the file COPYING.  If not, write to
+ * the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+
+#include <os2.h>
+
+PSZ queryLanguage()
+{
+  return "Deutsch";
+}
+
Index: /tags/CWMM-0.3.0_GA/mediafolder/res/de/mediafolder_de.dlg
===================================================================
--- /tags/CWMM-0.3.0_GA/mediafolder/res/de/mediafolder_de.dlg	(revision 213)
+++ /tags/CWMM-0.3.0_GA/mediafolder/res/de/mediafolder_de.dlg	(revision 213)
@@ -0,0 +1,103 @@
+#ifndef OS2_INCLUDED
+   #include <os2.h>
+#endif
+DLGINCLUDE 1 "
+G:\Projects_working\mmclasses-0.3.0\source\include\mediafolderres.h"
+
+DLGTEMPLATE IDDLG_BOTTOMFRAME LOADONCALL MOVEABLE DISCARDABLE
+BEGIN
+    DIALOG  "", IDDLG_BOTTOMFRAME, 12, 70, 300, 16, NOT FS_DLGBORDER | NOT 
+            WS_SAVEBITS
+    BEGIN
+        CTEXT           "", IDST_STATUSTEXT, 39, 1, 221, 8
+    END
+END
+
+DLGTEMPLATE IDDLG_FRAMERIGHT LOADONCALL MOVEABLE DISCARDABLE
+BEGIN
+    DIALOG  "", IDDLG_FRAMERIGHT, 134, 21, 24, 109, NOT FS_DLGBORDER | NOT 
+            WS_SAVEBITS
+    BEGIN
+    END
+END
+
+DLGTEMPLATE IDDLG_LEFTFRAME LOADONCALL MOVEABLE DISCARDABLE
+BEGIN
+    DIALOG  "", IDDLG_LEFTFRAME, 12, 6, 148, 148, NOT FS_DLGBORDER | NOT 
+            WS_SAVEBITS
+    BEGIN
+        CONTAINER       IDCNR_PLAYLIST, 14, 11, 123, 111, CCS_SINGLESEL | 
+                        CCS_AUTOPOSITION | CCS_MINIRECORDCORE | WS_GROUP
+        PUSHBUTTON      "Hinzufgen", IDPB_ADD, 8, 129, 40, 14
+        PUSHBUTTON      "Entfernen", IDPB_REMOVE, 72, 129, 40, 14
+    END
+END
+
+DLGTEMPLATE IDDLG_TOOLBARSETTINGS LOADONCALL MOVEABLE DISCARDABLE
+BEGIN
+    DIALOG  "", IDDLG_TOOLBARSETTINGS, 91, 22, 201, 199, NOT FS_DLGBORDER | 
+            WS_VISIBLE
+    BEGIN
+        GROUPBOX        "Toolbar", IDGB_TOOLBAR, 9, 24, 181, 127, NOT 
+                        WS_GROUP
+        AUTOCHECKBOX    "Fly-Over-Hilfe ~aktivieren", IDCB_ENABLETBFLYOVER, 16, 
+                        129, 152, 10
+        SPINBUTTON      IDSB_TBFLYOVERDELAY, 97, 115, 40, 12, 
+                        SPBS_NUMERICONLY | SPBS_MASTER | SPBS_FASTSPIN | 
+                        WS_GROUP
+        GROUPBOX        "Fly-Over Farben und Schriftart", IDGB_COLORANDFONT, 15, 
+                        30, 168, 76, NOT WS_GROUP
+        LTEXT           "Klicken Sie auf die Schaltflche fr die Farb- oder"
+                        "Schriftpalette. Halten Sie whrend des Drag & Drop die"
+                        "Taste <Strg> gedrckt, um die Textfarbe zu ndern.", 
+                        IDST_TEXTDEMOFIELD, 23, 35, 95, 57, DT_WORDBREAK
+                        PRESPARAMS PP_FOREGROUNDCOLOR, 0x000000FFL
+                        PRESPARAMS PP_BACKGROUNDCOLOR, 0x00FFFFFFL
+        PUSHBUTTON      "~Farbe...", IDPB_COLORPALETTE, 129, 72, 45, 14
+        PUSHBUTTON      "~Zeichensatz...", IDPB_FONTPALETTE, 129, 49, 45, 14
+        PUSHBUTTON      "~Undo", IDPB_COLORUNDO, 16, 7, 52, 14
+        PUSHBUTTON      "~Standard", IDPB_COLORSTANDARD, 74, 7, 52, 14
+        PUSHBUTTON      "~Hilfe", IDPB_COLORHELP, 132, 7, 52, 14, BS_HELP
+        RTEXT           "Verzgerung (ms):", IDGB_COLORANDFONT, 35, 116, 55, 8, 
+                        DT_VCENTER
+    END
+END
+
+DLGTEMPLATE IDDLG_TOPFRAME LOADONCALL MOVEABLE DISCARDABLE
+BEGIN
+    DIALOG  "", IDDLG_TOPFRAME, 13, 52, 287, 26, NOT FS_DLGBORDER | 
+            FS_BORDER | NOT WS_SAVEBITS
+    BEGIN
+        PUSHBUTTON      "Drcken", IDPB_PAUSE, 2, 6, 19, 14, NOT WS_VISIBLE
+    END
+END
+
+DLGTEMPLATE IDDLG_TOPMIDDLE LOADONCALL MOVEABLE DISCARDABLE
+BEGIN
+    DIALOG  "", IDDLG_TOPMIDDLE, 12, 51, 249, 39, NOT FS_DLGBORDER | 
+            FS_BORDER | WS_VISIBLE | NOT WS_SAVEBITS
+    BEGIN
+        CONTROL         "~Zurck", IDPB_SKIPBACK, 19, 25, 20, 14, WC_BUTTON, 
+                        BS_USERBUTTON | BS_NOPOINTERFOCUS | WS_TABSTOP | 
+                        WS_VISIBLE
+        CONTROL         "~Stop", IDPB_STOP, 40, 25, 22, 14, WC_BUTTON, 
+                        BS_USERBUTTON | BS_NOPOINTERFOCUS | WS_VISIBLE
+        CONTROL         "~Pause", IDPB_PAUSE, 61, 25, 20, 14,  WC_BUTTON, 
+                        BS_USERBUTTON | BS_NOPOINTERFOCUS | WS_VISIBLE
+        CONTROL         "S~tart", IDPB_PLAY, 79, 25, 20, 14, WC_BUTTON, 
+                        BS_USERBUTTON | BS_NOPOINTERFOCUS | WS_VISIBLE
+        CONTROL         "~Vor", IDPB_SKIPFORWARD, 99, 25, 20, 14, WC_BUTTON, 
+                        BS_USERBUTTON | BS_NOPOINTERFOCUS | WS_VISIBLE
+        AUTOCHECKBOX    "~Wiederholen", IDCB_REPEAT, 133, 13, 73, 10, WS_VISIBLE  | BS_USERBUTTON | BS_AUTOCHECKBOX
+        AUTOCHECKBOX    "~Zufllig", IDCB_RANDOM, 133, 23, 73, 10, WS_VISIBLE  | BS_USERBUTTON | BS_AUTOCHECKBOX
+        
+        CTEXT           "0:00", IDST_PLAYTIME, 133, 24, 102, 10, DT_VCENTER
+                        PRESPARAMS PP_FONTNAMESIZE, "10.Helv"
+        PUSHBUTTON      "VolumeArm", IDSL_VOLUMEARM, 209, 5, 14, 14, NOT 
+                        WS_VISIBLE| BS_USERBUTTON
+        PUSHBUTTON      "Lautstrke", IDSL_VOLUME, 19, 4, 69, 14, 
+                        BS_NOPOINTERFOCUS | NOT WS_TABSTOP | NOT WS_VISIBLE |BS_USERBUTTON
+    END
+END
+
+
Index: /tags/CWMM-0.3.0_GA/mediafolder/res/de/mediafolder_de.rc
===================================================================
--- /tags/CWMM-0.3.0_GA/mediafolder/res/de/mediafolder_de.rc	(revision 213)
+++ /tags/CWMM-0.3.0_GA/mediafolder/res/de/mediafolder_de.rc	(revision 213)
@@ -0,0 +1,98 @@
+#define  INCL_GRAPHICBUTTON   /* need this for the graphic buttons control */
+#define  INCL_BITMAP
+
+#ifndef OS2_INCLUDED
+   #include <os2.h>
+#endif
+#include <sw.h>
+
+#include "mediafolderres.h"
+#include "version.h"
+#include "build.h"
+
+#ifdef ECS
+MENU ID_MENUABOUT
+BEGIN
+   MENUITEM  "" , ID_MENUSEPARATOR, MIS_SEPARATOR
+   MENUITEM "~Produktinformation",ID_ABOUTITEM   
+END
+#else
+MENU ID_MENUABOUT
+BEGIN
+   MENUITEM  "" , ID_MENUSEPARATOR, MIS_SEPARATOR
+   MENUITEM "~Media-Ordner-Information",ID_ABOUTITEM   
+END
+#endif
+
+MENU ID_MBMENUSKRIPTS
+BEGIN
+
+END
+
+MENU ID_MENUVIEWCOMPACT
+BEGIN
+   MENUITEM  "~Kompakt" , ID_MENUVIEWCOMPACT
+END
+
+MENU  ID_MENUTIMECONTEXT
+BEGIN
+	MENUITEM "~Verstrichene Zeit" ,       ID_MENUITEMELAPSED
+	MENUITEM "Ver~bleibende Zeit" ,       ID_MENUITEMREMAINING
+	MENUITEM "~Track-Information" ,       ID_MENUITEMID3
+END
+
+MENU  ID_MENUFILE
+BEGIN
+	MENUITEM "~Sichern"   ,          	ID_MENUITEMSAVE
+	MENUITEM ""           ,             ID_MENUSEPARATOR, MIS_SEPARATOR               
+	MENUITEM "~Beenden" ,          		ID_MENUITEMEXIT
+END
+
+
+STRINGTABLE
+BEGIN
+IDSTR_CLOSETITLE "Besttigung"
+IDSTR_CLOSETEXT  "Es wird gerade eine Audiodatei abgespielt. Wirklich Wiedergabe stoppen und Spieler schlieáen?"
+IDSTRSETTING_TOOLBAR 		"Toolbar"
+IDSTRS_NOFONTPALETTE          "Die Schriftpalette kann nicht geffnet werden. Mglicherweise ist die ID verloren gegangen. berprfen Sie Ihre INI-Dateien."
+IDSTRS_NOCOLORPALETTE         "Die Farbpalette kann nicht geffnet werden. Mglicherweise ist die ID verloren gegangen. berprfen Sie Ihre INI-Dateien."
+IDSTRS_MEDIAFLDRSETTINGS   "Media-Ordner Einstellungen"
+#ifdef ECS
+IDSTR_MENUABOUT          "Produktinformation"
+#else
+IDSTR_MENUABOUT          "Media-Ordner Information"
+#endif
+IDSTR_MEDIAFLDHELP       "~Media-Spieler Hilfe"
+IDSTR_M3ULISTHELP        "~M3U-Liste Hilfe" 
+IDSTR_MENUCOMPACT        "~Kompakt"
+IDSTR_STATUSCOLLECTING   "Suche Audiotracks..."
+IDSTR_MENUSKRIPTS        "Skripts und Tools"
+IDSTR_STATUSTIME1        "%d:%02d min"
+IDSTR_STATUSTIME2        "%d h %d:%02d min"
+IDSTR_STATUSTIME3        "%d Tag(e) %d h %d:%02d min"
+IDSTR_STATUSTIME4        "%d Audiodateien   -   %d%s%03d%s%03d Bytes   -   %s"
+IDSTR_STATUSTIME5        "%d Audiodateien   -   mehr als 4 GBytes"
+
+IDSTR_TITLEMEDIAFOLDER   "Media-Spieler"
+IDSTR_TITLECDFOLDER      "CD Spieler"
+
+IDSTR_STARTINGTRACK      "Starte Track..."
+IDSTR_TITLEM3UFOLDER     "M3U-Editor"
+IDSTR_M3UCLOSETEXT       "Playlist wurde bearbeitet. Jetzt Speichern?"
+IDSTR_MENUFILE           "~Datei"
+IDSTR_PLAYLISTVIEWTITLE  "Playlist-Editor"
+IDSTR_LAUNCHPADFLYOVER   "Launchpad: Objekte hier ablegen"
+IDSTR_VIEWPAGENAME       "~Anzeige"
+IDSTR_VIEWCOMPACT        "Kompakt"
+IDSTR_CDFOLDERNAME       "Audio-CD-Spieler^Laufwerk %c:"
+
+END
+
+rcinclude "mediafolder_de.dlg"
+
+#ifdef ECS
+rcinclude "about_ecs_de.dlg"
+#else
+rcinclude "about_de.dlg"
+#endif
+
Index: /tags/CWMM-0.3.0_GA/mediafolder/res/en/about_ecs_en.dlg
===================================================================
--- /tags/CWMM-0.3.0_GA/mediafolder/res/en/about_ecs_en.dlg	(revision 213)
+++ /tags/CWMM-0.3.0_GA/mediafolder/res/en/about_ecs_en.dlg	(revision 213)
@@ -0,0 +1,25 @@
+#define VER_STRING "Media Folder V" \
+MFLDR_VERSION \
+BUILD_STRING
+
+ICON IDICON_FOLDER1  "../icons_ecs/mediafolder1.ico"
+
+DLGTEMPLATE IDDLG_ABOUT LOADONCALL MOVEABLE DISCARDABLE
+BEGIN
+    DIALOG  "Product Information", IDDLG_ABOUT, 100, 120, 194, 67,
+            WS_VISIBLE, FCF_TITLEBAR
+    BEGIN
+        ICON            IDICON_FOLDER1, IDICON_FOLDER1, 10, 39, 16, 15, WS_GROUP
+        LTEXT           "Multimedia integration for the desktop",
+                        IDST_PRODNAME, 38, 50, 154, 10, DT_WORDBREAK | NOT
+                        WS_GROUP
+                        //PRESPARAMS PP_FONTNAMESIZE, "9.WarpSans Bold"
+        CONTROL         "", 607, 38, 43, 154, 7, "CW_SEPARATOR", WS_VISIBLE
+        LTEXT           MFLDR_AUTHOR, IDST_PRODCOPY, 10,
+                        25, 184, 11, DT_VCENTER | DT_WORDBREAK | NOT
+                        WS_GROUP
+                        //PRESPARAMS PP_FONTNAMESIZE, "9.WarpSans"
+        DEFPUSHBUTTON   "~Ok", IDSTR_CLOSETEXT, 10, 2, 34, 13
+    END
+END
+
Index: /tags/CWMM-0.3.0_GA/mediafolder/res/en/about_en.dlg
===================================================================
--- /tags/CWMM-0.3.0_GA/mediafolder/res/en/about_en.dlg	(revision 213)
+++ /tags/CWMM-0.3.0_GA/mediafolder/res/en/about_en.dlg	(revision 213)
@@ -0,0 +1,25 @@
+#define VER_STRING "Media Folder v" \
+MFLDR_VERSION \
+BUILD_STRING
+
+DLGTEMPLATE IDDLG_ABOUT LOADONCALL MOVEABLE DISCARDABLE
+BEGIN
+    DIALOG  "Product Information", IDDLG_ABOUT, 115, 69, 208, 132,
+            WS_VISIBLE, FCF_TITLEBAR
+    BEGIN
+        GROUPBOX        "", IDGB_ABOUT, 3, 21, 200, 108
+        CTEXT           VER_STRING, IDST_PRODNAME, 10, 107, 187,
+                        12, DT_VCENTER | NOT WS_GROUP
+        CTEXT           MFLDR_AUTHOR,
+                        IDST_PRODCOPY, 10, 87, 186, 12, DT_VCENTER | NOT WS_GROUP
+        CTEXT           "Copyright (c) netlabs.org 2020",
+                        IDST_PRODCOPY2, 10, 64, 186, 12, DT_VCENTER | NOT WS_GROUP
+        CTEXT           "Graphics by Klaus Staedtler-Przyborski", 
+                        IDST_PRODGRAPHICS, 10, 46, 186, 17, DT_WORDBREAK | 
+                        NOT WS_GROUP
+        CTEXT           "https://trac.netlabs.org/cwmmclasses", IDST_URL1,
+                        10, 30, 186, 18, DT_WORDBREAK | NOT WS_GROUP
+                        PRESPARAMS PP_FONTNAMESIZE, "8.Helv"
+        DEFPUSHBUTTON   "~Ok", DID_OK, 83, 3, 40, 14
+    END
+END
Index: /tags/CWMM-0.3.0_GA/mediafolder/res/en/create_res_en_def.CMD
===================================================================
--- /tags/CWMM-0.3.0_GA/mediafolder/res/en/create_res_en_def.CMD	(revision 213)
+++ /tags/CWMM-0.3.0_GA/mediafolder/res/en/create_res_en_def.CMD	(revision 213)
@@ -0,0 +1,66 @@
+/* */
+call RxFuncAdd 'SysLoadFuncs', 'RexxUtil', 'SysLoadFuncs'
+call SysLoadFuncs
+
+deffile=ARG(1)
+if ARG(1)="" then deffile="tst.def"
+
+SAY ""
+SAY "Creating DEF file "deffile
+SAY ""
+
+theVersion=VALUE("MMCLSVERSION", ,"OS2ENVIRONMENT")
+if theVersion="" THEN theVersion=0.0.0
+
+def="; mediafolder_en.def: DEF-file for english resource DLL"||'0d'x||'0a'x
+def=def||";"||'0d'x||'0a'x
+
+def=def||";The following license applies ONLY TO THIS resource DLL. Be aware"||'0d'x||'0a'x
+def=def||";that the whole Media-folder package may be covered by another license."||'0d'x||'0a'x
+def=def||";"||'0d'x||'0a'x
+def=def||";/*"||'0d'x||'0a'x
+def=def||"; * Copyright (c) Chris Wohlgemuth 2002-2005 Netlabs 2023-"||WORD(DATE(), 3)  ||'0d'x||'0a'x
+def=def||"; * All rights reserved."||'0d'x||'0a'x
+def=def||"; *"||'0d'x||'0a'x
+def=def||"; * http://www.geocities.com/SiliconValley/Sector/5785/"||'0d'x||'0a'x
+def=def||"; * http://www.os2world.com/cdwriting"||'0d'x||'0a'x
+def=def||"; *"||'0d'x||'0a'x
+def=def||"; * Redistribution and use in source and binary forms, with or without"||'0d'x||'0a'x
+def=def||"; * modification, are permitted provided that the following conditions"||'0d'x||'0a'x
+def=def||"; * are met:"||'0d'x||'0a'x
+def=def||"; * 1. Redistributions of source code must retain the above copyright"||'0d'x||'0a'x
+def=def||"; *    notice, this list of conditions and the following disclaimer."||'0d'x||'0a'x
+def=def||"; * 2. Redistributions in binary form must reproduce the above copyright"||'0d'x||'0a'x
+def=def||"; *    notice, this list of conditions and the following disclaimer in the"||'0d'x||'0a'x
+def=def||"; *    documentation and/or other materials provided with the distribution."||'0d'x||'0a'x
+def=def||"; * 3. The authors name may not be used to endorse or promote products"||'0d'x||'0a'x
+def=def||"; *    derived from this software without specific prior written permission."||'0d'x||'0a'x
+def=def||"; *"||'0d'x||'0a'x
+def=def||"; * THIS SOFTWARE IS PROVIDED ``AS IS'' AND"||'0d'x||'0a'x
+def=def||"; * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE"||'0d'x||'0a'x
+def=def||"; * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE"||'0d'x||'0a'x
+def=def||"; * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE"||'0d'x||'0a'x
+def=def||"; * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL"||'0d'x||'0a'x
+def=def||"; * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS"||'0d'x||'0a'x
+def=def||"; * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)"||'0d'x||'0a'x
+def=def||"; * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT"||'0d'x||'0a'x
+def=def||"; * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY"||'0d'x||'0a'x
+def=def||"; * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF"||'0d'x||'0a'x
+def=def||"; * SUCH DAMAGE."||'0d'x||'0a'x
+def=def||"; *"||'0d'x||'0a'x
+def=def||"; */"||'0d'x||'0a'x
+
+def=def||'0d'x||'0a'x
+
+def=def||"LIBRARY MFLDR_EN INITINSTANCE TERMINSTANCE"||'0d'x||'0a'x
+def=def||"DESCRIPTION '$@# Netlabs CWMM Team"
+def=def||":"||theVersion||" #@##1## "||DATE("E")||" "||TIME("N")||"       Zobopeep ::::"||WORD(TRANSLATE(theVersion," ", "."),3)||"::@@Media-Folder EN res DLL (C) C. Wohlgemuth 2001-2005 Netlabs CWMM Team 2023-"||WORD(DATE(),3)||"'"||'0d'x||'0a'x
+def=def||"DATA MULTIPLE NONSHARED"||'0d'x||'0a'x
+def=def||"EXPORTS  "||'0d'x||'0a'x
+def=def||"        queryLanguage"||'0d'x||'0a'x
+
+'@type NUL > 'deffile
+call lineout deffile,def
+call stream deffile, "C", "close"
+exit
+
Index: /tags/CWMM-0.3.0_GA/mediafolder/res/en/makefile
===================================================================
--- /tags/CWMM-0.3.0_GA/mediafolder/res/en/makefile	(revision 213)
+++ /tags/CWMM-0.3.0_GA/mediafolder/res/en/makefile	(revision 213)
@@ -0,0 +1,17 @@
+
+include ../../../make.inc
+include ../../../build.inc
+
+all:
+	cd ./.. && make
+
+clean:
+	
+cleaner:
+	-rm *.flc
+	-rm *.*~
+
+distribution:
+
+	
+
Index: /tags/CWMM-0.3.0_GA/mediafolder/res/en/mediafolder_en.c
===================================================================
--- /tags/CWMM-0.3.0_GA/mediafolder/res/en/mediafolder_en.c	(revision 213)
+++ /tags/CWMM-0.3.0_GA/mediafolder/res/en/mediafolder_en.c	(revision 213)
@@ -0,0 +1,26 @@
+/*
+ * This file is (C) Chris Wohlgemuth 1999
+ */
+/*
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; see the file COPYING.  If not, write to
+ * the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+
+#include <os2.h>
+
+PSZ queryLanguage()
+{
+  return "English";
+}
+
Index: /tags/CWMM-0.3.0_GA/mediafolder/res/en/mediafolder_en.dlg
===================================================================
--- /tags/CWMM-0.3.0_GA/mediafolder/res/en/mediafolder_en.dlg	(revision 213)
+++ /tags/CWMM-0.3.0_GA/mediafolder/res/en/mediafolder_en.dlg	(revision 213)
@@ -0,0 +1,100 @@
+#ifndef OS2_INCLUDED
+   #include <os2.h>
+#endif
+DLGINCLUDE 1 "
+G:\Projects_working\mmclasses-0.3.0\source\include\mediafolderres.h"
+
+DLGTEMPLATE IDDLG_BOTTOMFRAME LOADONCALL MOVEABLE DISCARDABLE
+BEGIN
+    DIALOG  "", IDDLG_BOTTOMFRAME, 12, 70, 300, 16, NOT FS_DLGBORDER | NOT 
+            WS_SAVEBITS
+    BEGIN
+        CTEXT           "", IDST_STATUSTEXT, 39, 1, 221, 8
+    END
+END
+
+DLGTEMPLATE IDDLG_FRAMERIGHT LOADONCALL MOVEABLE DISCARDABLE
+BEGIN
+    DIALOG  "", IDDLG_FRAMERIGHT, 134, 21, 24, 109, NOT FS_DLGBORDER | NOT 
+            WS_SAVEBITS
+    BEGIN
+    END
+END
+
+DLGTEMPLATE IDDLG_LEFTFRAME LOADONCALL MOVEABLE DISCARDABLE
+BEGIN
+    DIALOG  "", IDDLG_LEFTFRAME, 12, 6, 148, 148, NOT FS_DLGBORDER | NOT 
+            WS_SAVEBITS
+    BEGIN
+        CONTAINER       IDCNR_PLAYLIST, 14, 11, 123, 111, CCS_SINGLESEL | 
+                        CCS_AUTOPOSITION | CCS_MINIRECORDCORE | WS_GROUP
+        PUSHBUTTON      "Add", IDPB_ADD, 8, 129, 40, 14
+        PUSHBUTTON      "Remove", IDPB_REMOVE, 72, 129, 40, 14
+    END
+END
+
+DLGTEMPLATE IDDLG_TOOLBARSETTINGS LOADONCALL MOVEABLE DISCARDABLE
+BEGIN
+    DIALOG  "", IDDLG_TOOLBARSETTINGS, 91, 22, 201, 199, NOT FS_DLGBORDER | 
+            WS_VISIBLE
+    BEGIN
+        GROUPBOX        "Toolbar", IDGB_TOOLBAR, 9, 24, 181, 127, NOT 
+                        WS_GROUP
+        AUTOCHECKBOX    "~Enable fly-over help", IDCB_ENABLETBFLYOVER, 16, 
+                        129, 152, 10
+        SPINBUTTON      IDSB_TBFLYOVERDELAY, 97, 115, 40, 12, 
+                        SPBS_NUMERICONLY | SPBS_MASTER | SPBS_FASTSPIN | 
+                        WS_GROUP
+        GROUPBOX        "Fly-over colors and font", IDGB_COLORANDFONT, 15, 
+                        30, 168, 76, NOT WS_GROUP
+        LTEXT           "Click button for color or font palette.           "
+                        "Hold <Ctrl> during drag'n'drop to change the text color.", 
+                        IDST_TEXTDEMOFIELD, 23, 35, 95, 57, DT_WORDBREAK
+                        PRESPARAMS PP_FOREGROUNDCOLOR, 0x000000FFL
+                        PRESPARAMS PP_BACKGROUNDCOLOR, 0x00FFFFFFL
+        PUSHBUTTON      "~Color...", IDPB_COLORPALETTE, 129, 72, 45, 14
+        PUSHBUTTON      "~Font...", IDPB_FONTPALETTE, 129, 49, 45, 14
+        PUSHBUTTON      "~Undo", IDPB_COLORUNDO, 16, 7, 52, 14
+        PUSHBUTTON      "~Default", IDPB_COLORSTANDARD, 74, 7, 52, 14
+        PUSHBUTTON      "~Help", IDPB_COLORHELP, 132, 7, 52, 14, BS_HELP
+        RTEXT           "Delay (ms):", IDGB_COLORANDFONT, 35, 116, 55, 8, 
+                        DT_VCENTER
+    END
+END
+
+DLGTEMPLATE IDDLG_TOPFRAME LOADONCALL MOVEABLE DISCARDABLE
+BEGIN
+    DIALOG  "", IDDLG_TOPFRAME, 13, 52, 287, 26, NOT FS_DLGBORDER | 
+            FS_BORDER | NOT WS_SAVEBITS
+    BEGIN
+        PUSHBUTTON      "Push", IDPB_PAUSE, 2, 6, 19, 14, NOT WS_VISIBLE
+    END
+END
+
+DLGTEMPLATE IDDLG_TOPMIDDLE LOADONCALL MOVEABLE DISCARDABLE
+BEGIN
+    DIALOG  "", IDDLG_TOPMIDDLE, 12, 51, 249, 39, NOT FS_DLGBORDER | 
+            FS_BORDER | WS_VISIBLE | NOT WS_SAVEBITS
+    BEGIN
+        CONTROL         "~Back", IDPB_SKIPBACK, 19, 25, 20, 14, WC_BUTTON, 
+                        BS_USERBUTTON | BS_NOPOINTERFOCUS | WS_TABSTOP | 
+                        WS_VISIBLE
+        CONTROL         "~Stop", IDPB_STOP, 40, 25, 22, 14, WC_BUTTON, 
+                        BS_USERBUTTON | BS_NOPOINTERFOCUS | WS_VISIBLE
+        CONTROL         "~Pause", IDPB_PAUSE, 61, 25, 20, 14, WC_BUTTON, 
+                        BS_USERBUTTON | BS_NOPOINTERFOCUS | WS_VISIBLE 
+        CONTROL         "P~lay", IDPB_PLAY, 79, 25, 20, 14, WC_BUTTON, 
+                        BS_USERBUTTON | BS_NOPOINTERFOCUS | WS_VISIBLE
+        CONTROL         "~Next", IDPB_SKIPFORWARD, 99, 25, 20, 14, WC_BUTTON, 
+                        BS_USERBUTTON | BS_NOPOINTERFOCUS | WS_VISIBLE
+        AUTOCHECKBOX    "~Repeat", IDCB_REPEAT, 133, 13, 73, 10,WS_VISIBLE|BS_USERBUTTON | BS_AUTOCHECKBOX
+        AUTOCHECKBOX    "R~andom", IDCB_RANDOM, 133, 23, 73, 10, WS_VISIBLE  | BS_USERBUTTON | BS_AUTOCHECKBOX
+
+        CTEXT           "0:00", IDST_PLAYTIME, 133, 24, 102, 10, DT_VCENTER
+                        PRESPARAMS PP_FONTNAMESIZE, "10.Helv"
+        CONTROL         "VolumeArm", IDSL_VOLUMEARM, 209, 5, 14, 14, 
+                        WC_BUTTON, BS_USERBUTTON | WS_TABSTOP|BS_USERBUTTON
+        PUSHBUTTON      "Volume", IDSL_VOLUME, 19, 4, 69, 14, 
+                        BS_NOPOINTERFOCUS | NOT WS_TABSTOP | NOT WS_VISIBLE |BS_USERBUTTON
+    END
+END
Index: /tags/CWMM-0.3.0_GA/mediafolder/res/en/mediafolder_en.rc
===================================================================
--- /tags/CWMM-0.3.0_GA/mediafolder/res/en/mediafolder_en.rc	(revision 213)
+++ /tags/CWMM-0.3.0_GA/mediafolder/res/en/mediafolder_en.rc	(revision 213)
@@ -0,0 +1,98 @@
+#define  INCL_GRAPHICBUTTON   /* need this for the graphic buttons control */
+#define  INCL_BITMAP
+
+#ifndef OS2_INCLUDED
+   #include <os2.h>
+#endif
+#include <sw.h>
+
+#include "mediafolderres.h"
+#include "version.h"
+#include "build.h"
+
+#ifdef ECS
+MENU ID_MENUABOUT
+BEGIN
+   MENUITEM  "" , ID_MENUSEPARATOR, MIS_SEPARATOR
+   MENUITEM "~Product Information",ID_ABOUTITEM
+END
+#else
+MENU ID_MENUABOUT
+BEGIN
+   MENUITEM  "" , ID_MENUSEPARATOR, MIS_SEPARATOR
+   MENUITEM "~Media Folder Information",ID_ABOUTITEM
+END
+#endif
+
+MENU ID_MBMENUSKRIPTS
+BEGIN
+
+END
+
+MENU ID_MENUVIEWCOMPACT
+BEGIN
+   MENUITEM  "~Compact" , ID_MENUVIEWCOMPACT
+END
+
+MENU  ID_MENUTIMECONTEXT
+BEGIN
+	MENUITEM "~Elapsed time"   ,          ID_MENUITEMELAPSED
+	MENUITEM "~Remaining time" ,          ID_MENUITEMREMAINING
+	MENUITEM "~Track information" ,       ID_MENUITEMID3
+END
+
+MENU  ID_MENUFILE
+BEGIN
+	MENUITEM "~Save"   ,          	ID_MENUITEMSAVE
+	MENUITEM ""           ,                 ID_MENUSEPARATOR, MIS_SEPARATOR
+	MENUITEM "~Exit" ,          		ID_MENUITEMEXIT
+END
+
+
+STRINGTABLE
+BEGIN
+IDSTR_CLOSETITLE "Confirmation"
+IDSTR_CLOSETEXT  "There's currently an audio file playing. Do you really want to stop playing and close the player?"
+IDSTRSETTING_TOOLBAR "Toolbar"
+IDSTRS_NOFONTPALETTE          "Can't open the font palette. It may have lost its ID. Check your INI files."
+IDSTRS_NOCOLORPALETTE         "Can't open the color palette. It may have lost its ID. Check your INI files."
+IDSTRS_MEDIAFLDRSETTINGS   "Media-Folder setup"
+#ifdef ECS
+IDSTR_MENUABOUT          "Product Information"
+#else
+IDSTR_MENUABOUT          "Media-Folder Information"
+#endif
+IDSTR_MEDIAFLDHELP       "~Media-Folder Help"
+IDSTR_M3ULISTHELP        "~M3U List Help" 
+IDSTR_MENUCOMPACT        "~Compact"
+IDSTR_STATUSCOLLECTING   "Collecting audio tracks..."
+IDSTR_MENUSKRIPTS        "Scripts and tools"
+IDSTR_STATUSTIME1        "%d:%02d mins"
+IDSTR_STATUSTIME2        "%d h %d:%02d mins"
+IDSTR_STATUSTIME3        "%d day(s) %d h %d:%02d mins"
+IDSTR_STATUSTIME4        "%d Audiofiles   -   %d%s%03d%s%03d Bytes   -   %s"
+IDSTR_STATUSTIME5        "%d Audiofiles   -   more than 4 GBytes"
+
+IDSTR_TITLEMEDIAFOLDER   "Media player"
+IDSTR_TITLECDFOLDER      "CD player"
+
+IDSTR_STARTINGTRACK      "Starting track..."
+IDSTR_TITLEM3UFOLDER    "M3U editor"
+IDSTR_M3UCLOSETEXT      "Playlist changed. Save it now?"
+IDSTR_MENUFILE           "~File"
+IDSTR_PLAYLISTVIEWTITLE  "Playlist Editor"
+IDSTR_LAUNCHPADFLYOVER   "Launchpad: Drop objects here"
+IDSTR_VIEWPAGENAME       "~View"
+IDSTR_VIEWCOMPACT        "Compact"
+IDSTR_CDFOLDERNAME       "CD-Audio player^Drive %c:"
+
+END
+
+rcinclude "mediafolder_en.dlg"
+
+#ifdef ECS
+rcinclude "about_ecs_en.dlg"
+#else
+rcinclude "about_en.dlg"
+#endif
+
Index: /tags/CWMM-0.3.0_GA/mediafolder/res/es/about_ecs_es.dlg
===================================================================
--- /tags/CWMM-0.3.0_GA/mediafolder/res/es/about_ecs_es.dlg	(revision 213)
+++ /tags/CWMM-0.3.0_GA/mediafolder/res/es/about_ecs_es.dlg	(revision 213)
@@ -0,0 +1,25 @@
+#define VER_STRING "Carpeta multimedia v" \
+MFLDR_VERSION \
+BUILD_STRING
+
+ICON IDICON_FOLDER1  "../icons_ecs/mediafolder1.ico"
+
+DLGTEMPLATE IDDLG_ABOUT LOADONCALL MOVEABLE DISCARDABLE
+BEGIN
+    DIALOG  "Informaci¢n del producto", IDDLG_ABOUT, 100, 120, 194, 67,
+            WS_VISIBLE, FCF_TITLEBAR
+    BEGIN
+        ICON            IDICON_FOLDER1, IDICON_FOLDER1, 10, 39, 16, 15, WS_GROUP
+        LTEXT           "Multimedia integration for the desktop",
+                        IDST_PRODNAME, 38, 50, 154, 10, DT_WORDBREAK | NOT
+                        WS_GROUP
+                        //PRESPARAMS PP_FONTNAMESIZE, "9.WarpSans Bold"
+        CONTROL         "", 607, 38, 43, 154, 7, "CW_SEPARATOR", WS_VISIBLE
+        LTEXT           MFLDR_AUTHOR, IDST_PRODCOPY, 10,
+                        25 184, 11, DT_VCENTER | DT_WORDBREAK | NOT
+                        WS_GROUP
+                        //PRESPARAMS PP_FONTNAMESIZE, "9.WarpSans"
+        DEFPUSHBUTTON   "~Bien", IDSTR_CLOSETEXT, 10, 2, 34, 13
+    END
+END
+
Index: /tags/CWMM-0.3.0_GA/mediafolder/res/es/about_es.dlg
===================================================================
--- /tags/CWMM-0.3.0_GA/mediafolder/res/es/about_es.dlg	(revision 213)
+++ /tags/CWMM-0.3.0_GA/mediafolder/res/es/about_es.dlg	(revision 213)
@@ -0,0 +1,25 @@
+#define VER_STRING "Carpeta multimedia v" \
+MFLDR_VERSION \
+BUILD_STRING
+
+DLGTEMPLATE IDDLG_ABOUT LOADONCALL MOVEABLE DISCARDABLE
+BEGIN
+    DIALOG  "Informaci¢n del producto", IDDLG_ABOUT, 115, 69, 208, 132, 
+            WS_VISIBLE, FCF_TITLEBAR
+    BEGIN
+        GROUPBOX        "", IDGB_ABOUT, 3, 21, 200, 108
+        CTEXT           VER_STRING, IDST_PRODNAME, 10, 107, 187, 
+                        12, DT_VCENTER | NOT WS_GROUP
+        CTEXT           MFLDR_AUTHOR,
+                        IDST_PRODCOPY, 10, 87, 186, 12, DT_VCENTER | NOT WS_GROUP
+        CTEXT           "Copyright ž netlabs.org 2020",
+                        IDST_PRODCOPY2, 10, 64, 186, 12, DT_VCENTER | NOT WS_GROUP
+        CTEXT           "Gr ficos de Klaus Staedtler-Przyborski", 
+                        IDST_PRODGRAPHICS, 10, 46, 186, 17, DT_WORDBREAK | 
+                        NOT WS_GROUP
+        CTEXT           "https://trac.netlabs.org/cwmmclasses", IDST_URL1,
+                        10, 30, 186, 18, DT_WORDBREAK | NOT WS_GROUP
+                        PRESPARAMS PP_FONTNAMESIZE, "8.Helv"
+        DEFPUSHBUTTON   "~Bien", DID_OK, 83, 3, 40, 14
+    END
+END
Index: /tags/CWMM-0.3.0_GA/mediafolder/res/es/create_res_es_def.CMD
===================================================================
--- /tags/CWMM-0.3.0_GA/mediafolder/res/es/create_res_es_def.CMD	(revision 213)
+++ /tags/CWMM-0.3.0_GA/mediafolder/res/es/create_res_es_def.CMD	(revision 213)
@@ -0,0 +1,70 @@
+/* */
+call RxFuncAdd 'SysLoadFuncs', 'RexxUtil', 'SysLoadFuncs'
+call SysLoadFuncs
+
+deffile=ARG(1)
+if ARG(1)="" then deffile="tst.def"
+
+SAY ""
+SAY "Creando archivo DEF "deffile
+SAY ""
+
+theVersion=VALUE("MMCLSVERSION", ,"OS2ENVIRONMENT")
+if theVersion="" THEN theVersion=0.0.0
+
+def="; mediafolder_es.def: archivo DEF para la DLL de recursos en espa€ol"||'0d'x||'0a'x
+def=def||";"||'0d'x||'0a'x
+
+def=def||";La siguiente licencia se aplica SàLO A ESTA DLL de recursos. Tenga en cuenta"||'0d'x||'0a'x
+def=def||";que el paquete ®Carpeta de medios¯ completo puede estar bajo otra licencia."||'0d'x||'0a'x
+def=def||";"||'0d'x||'0a'x
+def=def||";/*"||'0d'x||'0a'x
+def=def||"; * Copyright ž Chris Wohlgemuth 2002-2005 Netlabs 2023-"||WORD(DATE(), 3)  ||'0d'x||'0a'x
+def=def||"; * Todos los derechos reservados."||'0d'x||'0a'x
+def=def||"; *"||'0d'x||'0a'x
+def=def||"; * http://www.geocities.com/SiliconValley/Sector/5785/"||'0d'x||'0a'x
+def=def||"; * http://www.os2world.com/cdwriting"||'0d'x||'0a'x
+def=def||"; *"||'0d'x||'0a'x
+
+def=def||"; * Se permiten la redistribuci¢n y uso en forma binaria y de c¢digo fuente,"||'0d'x||'0a'x
+def=def||"; * con o sin modificaciones, siempre que se cumplan estas condiciones:"||'0d'x||'0a'x
+def=def||"; * 1. Las redistribuciones de c¢digo fuente deben conservar el aviso de"||'0d'x||'0a'x
+def=def||"; *    derechos de copia anterior, esta lista de condiciones y el siguiente"||'0d'x||'0a'x
+def=def||"; *    descargo."||'0d'x||'0a'x
+def=def||"; * 2. Las redistribuciones en forma binaria deben reproducir el aviso de"||'0d'x||'0a'x
+def=def||"; *    derechos de copia anterior, esta lista de condiciones y el siguiente"||'0d'x||'0a'x
+def=def||"; *    descargo en la documentaci¢n y/u otros materiales suministrados con"||'0d'x||'0a'x
+def=def||"; *    la distribuci¢n."||'0d'x||'0a'x
+def=def||"; * 3. No se permite usar el nombre del autor para promocionar o respaldar"||'0d'x||'0a'x
+def=def||"; *    productos derivados de este programa sin permiso espec¡fico previo"||'0d'x||'0a'x
+def=def||"; *    por escrito."||'0d'x||'0a'x
+def=def||"; *"||'0d'x||'0a'x
+def=def||"; * ESTE PROGRAMA SE SUMINISTRA ®TAL CUAL¯, RENUNCIANDO A CUALESQUIERA"||'0d'x||'0a'x
+def=def||"; * GARANTÖAS, INCLUYENDO, PERO SIN LIMITARSE A, LAS IMPLÖCITAS DE"||'0d'x||'0a'x
+def=def||"; * COMERCIALIZABILIDAD O IDONEIDAD PARA UN PROPàSITO PARTICULAR. BAJO"||'0d'x||'0a'x
+def=def||"; * CIRCUNSTANCIA ALGUNA SE RESPONSABILIZARµ AL AUTOR O SUS CONTRIBUIDORES"||'0d'x||'0a'x
+def=def||"; * DE NINGéN DA¥O DIRECTO, INDIRECTO, INCIDENTAL, ESPECIAL, ILUSTRATIVO O"||'0d'x||'0a'x
+def=def||"; * DERIVADO (INCLUYENDO, PERO SIN LIMITARSE A, SUMINISTRAR MERCANCÖAS O"||'0d'x||'0a'x
+def=def||"; * PRESTAR SERVICIOS DE SUSTITUCIàN; PRDIDA DE USO, DATOS, O LUCRO"||'0d'x||'0a'x
+def=def||"; * CESANTE; O INTERRUPCIàN DE ACTIVIDAD COMERCIAL) DE CUALQUIER FORMA"||'0d'x||'0a'x
+def=def||"; * O DEFINICIàN DE RESPONSABILIDAD, YA SEA CONTRACTUAL, OBJETIVA O CIVIL"||'0d'x||'0a'x
+def=def||"; * (INCLUYENDO LA NEGLIGENCIA U OTRAS CAUSAS) QUE SE DERIVE DE CUALQUIER"||'0d'x||'0a'x
+def=def||"; * FORMA DE LA UTILIZACIàN DE ESTE PROGRAMA, INCLUSO BAJO ADVERTENCIA DE"||'0d'x||'0a'x
+def=def||"; * LA POSIBILIDAD DE TAL DA¥O."||'0d'x||'0a'x
+def=def||"; *"||'0d'x||'0a'x
+def=def||"; */"||'0d'x||'0a'x
+
+def=def||'0d'x||'0a'x
+
+def=def||"LIBRARY MFLDR_ES INITINSTANCE TERMINSTANCE"||'0d'x||'0a'x
+def=def||"DESCRIPTION '$@# Netlabs CWMM Team"
+def=def||":"||theVersion||" #@##1## "||DATE("E")||" "||TIME("N")||"       Zobopeep ::::"||WORD(TRANSLATE(theVersion," ", "."),3)||"::@@Media-Folder ES res DLL (C) C. Wohlgemuth 2001-2005 Netlabs CWMM Team 2023-"||WORD(DATE(),3)||"'"||'0d'x||'0a'x
+def=def||"DATA MULTIPLE NONSHARED"||'0d'x||'0a'x
+def=def||"EXPORTS  "||'0d'x||'0a'x
+def=def||"        queryLanguage"||'0d'x||'0a'x
+
+'@type NUL > 'deffile
+call lineout deffile,def
+call stream deffile, "C", "close"
+exit
+
Index: /tags/CWMM-0.3.0_GA/mediafolder/res/es/makefile
===================================================================
--- /tags/CWMM-0.3.0_GA/mediafolder/res/es/makefile	(revision 213)
+++ /tags/CWMM-0.3.0_GA/mediafolder/res/es/makefile	(revision 213)
@@ -0,0 +1,17 @@
+
+include ../../../make.inc
+include ../../../build.inc
+
+all:
+	cd ./.. && make
+
+clean:
+	
+cleaner:
+	-rm *.flc
+	-rm *.*~
+
+distribution:
+
+	
+
Index: /tags/CWMM-0.3.0_GA/mediafolder/res/es/mediafolder_es.c
===================================================================
--- /tags/CWMM-0.3.0_GA/mediafolder/res/es/mediafolder_es.c	(revision 213)
+++ /tags/CWMM-0.3.0_GA/mediafolder/res/es/mediafolder_es.c	(revision 213)
@@ -0,0 +1,24 @@
+/*
+ * This file is (C) Chris Wohlgemuth 1999
+ */
+/*
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; see the file COPYING.  If not, write to
+ * the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+#include <os2.h>
+
+PSZ queryLanguage()
+{
+  return "Espagnol";
+}
Index: /tags/CWMM-0.3.0_GA/mediafolder/res/es/mediafolder_es.dlg
===================================================================
--- /tags/CWMM-0.3.0_GA/mediafolder/res/es/mediafolder_es.dlg	(revision 213)
+++ /tags/CWMM-0.3.0_GA/mediafolder/res/es/mediafolder_es.dlg	(revision 213)
@@ -0,0 +1,101 @@
+#ifndef OS2_INCLUDED
+   #include <os2.h>
+#endif
+DLGINCLUDE 1 "
+G:\Projects_working\mmclasses-0.3.0\source\include\mediafolderres.h"
+
+DLGTEMPLATE IDDLG_BOTTOMFRAME LOADONCALL MOVEABLE DISCARDABLE
+BEGIN
+    DIALOG  "", IDDLG_BOTTOMFRAME, 12, 70, 300, 16, NOT FS_DLGBORDER | NOT 
+            WS_SAVEBITS
+    BEGIN
+        CTEXT           "", IDST_STATUSTEXT, 39, 1, 221, 8
+    END
+END
+
+DLGTEMPLATE IDDLG_FRAMERIGHT LOADONCALL MOVEABLE DISCARDABLE
+BEGIN
+    DIALOG  "", IDDLG_FRAMERIGHT, 134, 21, 24, 109, NOT FS_DLGBORDER | NOT 
+            WS_SAVEBITS
+    BEGIN
+    END
+END
+
+DLGTEMPLATE IDDLG_LEFTFRAME LOADONCALL MOVEABLE DISCARDABLE
+BEGIN
+    DIALOG  "", IDDLG_LEFTFRAME, 12, 6, 148, 148, NOT FS_DLGBORDER | NOT 
+            WS_SAVEBITS
+    BEGIN
+        CONTAINER       IDCNR_PLAYLIST, 14, 11, 123, 111, CCS_SINGLESEL | 
+                        CCS_AUTOPOSITION | CCS_MINIRECORDCORE | WS_GROUP
+        PUSHBUTTON      "A€adir", IDPB_ADD, 8, 129, 40, 14
+        PUSHBUTTON      "Eliminar", IDPB_REMOVE, 72, 129, 40, 14
+    END
+END
+
+DLGTEMPLATE IDDLG_TOOLBARSETTINGS LOADONCALL MOVEABLE DISCARDABLE
+BEGIN
+    DIALOG  "", IDDLG_TOOLBARSETTINGS, 91, 22, 201, 199, NOT FS_DLGBORDER | 
+            WS_VISIBLE
+    BEGIN
+        GROUPBOX        "Barra de herramientas", IDGB_TOOLBAR, 9, 24, 181, 127, NOT 
+                        WS_GROUP
+        AUTOCHECKBOX    "~Habilitar ayuda flotante", IDCB_ENABLETBFLYOVER, 16, 
+                        129, 152, 10
+        SPINBUTTON      IDSB_TBFLYOVERDELAY, 97, 115, 40, 12, 
+                        SPBS_NUMERICONLY | SPBS_MASTER | SPBS_FASTSPIN | 
+                        WS_GROUP
+        GROUPBOX        "Colores y fuente flotantes", IDGB_COLORANDFONT, 15, 
+                        30, 168, 76, NOT WS_GROUP
+        LTEXT           "Pulse el bot¢n para la paleta de fuentes o colores.           "
+                        "              
+Mantenga pulsado <Ctrl> durante el arrastre para cambiar el color del texto.", 
+                        IDST_TEXTDEMOFIELD, 23, 35, 95, 57, DT_WORDBREAK
+                        PRESPARAMS PP_FOREGROUNDCOLOR, 0x000000FFL
+                        PRESPARAMS PP_BACKGROUNDCOLOR, 0x00FFFFFFL
+        PUSHBUTTON      "~Color...", IDPB_COLORPALETTE, 129, 72, 45, 14
+        PUSHBUTTON      "~Fuente...", IDPB_FONTPALETTE, 129, 49, 45, 14
+        PUSHBUTTON      "~Deshacer", IDPB_COLORUNDO, 16, 7, 52, 14
+        PUSHBUTTON      "~Por omisi¢n", IDPB_COLORSTANDARD, 74, 7, 52, 14
+        PUSHBUTTON      "A~yuda", IDPB_COLORHELP, 132, 7, 52, 14, BS_HELP
+        RTEXT           "Retardo (ms):", IDGB_COLORANDFONT, 35, 116, 55, 8, 
+                        DT_VCENTER
+    END
+END
+
+DLGTEMPLATE IDDLG_TOPFRAME LOADONCALL MOVEABLE DISCARDABLE
+BEGIN
+    DIALOG  "", IDDLG_TOPFRAME, 13, 52, 287, 26, NOT FS_DLGBORDER | 
+            FS_BORDER | NOT WS_SAVEBITS
+    BEGIN
+        PUSHBUTTON      "Pulsar", IDPB_PAUSE, 2, 6, 19, 14, NOT WS_VISIBLE
+    END
+END
+
+DLGTEMPLATE IDDLG_TOPMIDDLE LOADONCALL MOVEABLE DISCARDABLE
+BEGIN
+    DIALOG  "", IDDLG_TOPMIDDLE, 12, 51, 249, 39, NOT FS_DLGBORDER | 
+            FS_BORDER | WS_VISIBLE | NOT WS_SAVEBITS
+    BEGIN
+        CONTROL         "~Anterior", IDPB_SKIPBACK, 19, 25, 20, 14, WC_BUTTON, 
+                        BS_USERBUTTON | BS_NOPOINTERFOCUS | WS_TABSTOP | 
+                        WS_VISIBLE
+        CONTROL         "~Detener", IDPB_STOP, 40, 25, 22, 14, WC_BUTTON, 
+                        BS_USERBUTTON | BS_NOPOINTERFOCUS | WS_VISIBLE
+        CONTROL         "~Pausa", IDPB_PAUSE, 61, 25, 20, 14, WC_BUTTON, 
+                        BS_USERBUTTON | BS_NOPOINTERFOCUS | WS_VISIBLE 
+        CONTROL         "~Reproducir", IDPB_PLAY, 79, 25, 20, 14, WC_BUTTON, 
+                        BS_USERBUTTON | BS_NOPOINTERFOCUS | WS_VISIBLE
+        CONTROL         "~Siguiente", IDPB_SKIPFORWARD, 99, 25, 20, 14, WC_BUTTON, 
+                        BS_USERBUTTON | BS_NOPOINTERFOCUS | WS_VISIBLE
+        AUTOCHECKBOX    "~Bucle", IDCB_REPEAT, 133, 13, 73, 10,WS_VISIBLE|BS_USERBUTTON | BS_AUTOCHECKBOX
+        AUTOCHECKBOX    "~Orden aleatorio", IDCB_RANDOM, 133, 23, 73, 10, WS_VISIBLE  | BS_USERBUTTON | BS_AUTOCHECKBOX
+
+        CTEXT           "0:00", IDST_PLAYTIME, 133, 24, 102, 10, DT_VCENTER
+                        PRESPARAMS PP_FONTNAMESIZE, "10.Helv"
+        CONTROL         "VolumeArm", IDSL_VOLUMEARM, 209, 5, 14, 14, 
+                        WC_BUTTON, BS_USERBUTTON | WS_TABSTOP|BS_USERBUTTON
+        PUSHBUTTON      "Volumen", IDSL_VOLUME, 19, 4, 69, 14, 
+                        BS_NOPOINTERFOCUS | NOT WS_TABSTOP | NOT WS_VISIBLE |BS_USERBUTTON
+    END
+END
Index: /tags/CWMM-0.3.0_GA/mediafolder/res/es/mediafolder_es.rc
===================================================================
--- /tags/CWMM-0.3.0_GA/mediafolder/res/es/mediafolder_es.rc	(revision 213)
+++ /tags/CWMM-0.3.0_GA/mediafolder/res/es/mediafolder_es.rc	(revision 213)
@@ -0,0 +1,97 @@
+#define  INCL_GRAPHICBUTTON   /* need this for the graphic buttons control */
+#define  INCL_BITMAP
+
+#ifndef OS2_INCLUDED
+   #include <os2.h>
+#endif
+#include <sw.h>
+
+#include "mediafolderres.h"
+#include "version.h"
+#include "build.h"
+
+#ifdef ECS
+MENU ID_MENUABOUT
+BEGIN
+   MENUITEM  "" , ID_MENUSEPARATOR, MIS_SEPARATOR
+   MENUITEM "Informaci¢n del ~producto",ID_ABOUTITEM
+END
+#else
+MENU ID_MENUABOUT
+BEGIN
+   MENUITEM  "" , ID_MENUSEPARATOR, MIS_SEPARATOR
+   MENUITEM "~Informaci¢n de la Carpeta de medios",ID_ABOUTITEM
+END
+#endif
+
+MENU ID_MBMENUSKRIPTS
+BEGIN
+
+END
+
+MENU ID_MENUVIEWCOMPACT
+BEGIN
+   MENUITEM  "~Vista compacta" , ID_MENUVIEWCOMPACT
+END
+
+MENU  ID_MENUTIMECONTEXT
+BEGIN
+	MENUITEM "Tiempo ~transcurrido" ,     ID_MENUITEMELAPSED
+	MENUITEM "Tiempo ~restante" ,         ID_MENUITEMREMAINING
+	MENUITEM "~Informaci¢n de la pista" , ID_MENUITEMID3
+END
+
+MENU  ID_MENUFILE
+BEGIN
+	MENUITEM "~Guardar"   ,          	ID_MENUITEMSAVE
+	MENUITEM ""           ,                 ID_MENUSEPARATOR, MIS_SEPARATOR
+	MENUITEM "~Salir" ,          		ID_MENUITEMEXIT
+END
+
+
+STRINGTABLE
+BEGIN
+IDSTR_CLOSETITLE "Confirmaci¢n"
+IDSTR_CLOSETEXT  "Hay un archivo de audio reproducindose. šSeguro que quiere detener el reproductor y cerrarlo?"
+IDSTRSETTING_TOOLBAR "Toolbar"
+IDSTRS_NOFONTPALETTE          "No se puede abrir la paleta de fuentes. Puede haber perdido su ID. Compruebe sus archivos INI."
+IDSTRS_NOCOLORPALETTE         "No se puede abrir la paleta de colores. Puede haber perdido su ID. Compruebe sus archivos INI."
+IDSTRS_MEDIAFLDRSETTINGS   "Configurar la Carpeta de medios"
+#ifdef ECS
+IDSTR_MENUABOUT          "Informaci¢n del producto"
+#else
+IDSTR_MENUABOUT          "Informaci¢n de la Carpeta de medios"
+#endif
+IDSTR_MEDIAFLDHELP       "~Reproductor de medios Ayuda"
+IDSTR_M3ULISTHELP        "~Editor M3U Ayuda" 
+IDSTR_MENUCOMPACT        "~Vista compacta"
+IDSTR_STATUSCOLLECTING   "Recopilando las pistas de audio..."
+IDSTR_MENUSKRIPTS        "Scripts and tools"
+IDSTR_STATUSTIME1        "%d:%02d min."
+IDSTR_STATUSTIME2        "%d h %d:%02d min."
+IDSTR_STATUSTIME3        "%d d¡a(s) %d h %d:%02d min."
+IDSTR_STATUSTIME4        "%d archivos de audio - %d%s%03d%s%03d bytes - %s"
+IDSTR_STATUSTIME5        "%d archivos de audio - m s de 4 GBytes"
+
+IDSTR_TITLEMEDIAFOLDER   "Reproductor de medios"
+IDSTR_TITLECDFOLDER      "Reproductor de CD"
+
+IDSTR_STARTINGTRACK      "Iniciando pista..."
+IDSTR_TITLEM3UFOLDER    "Editor M3U"
+IDSTR_M3UCLOSETEXT      "La lista de reproducci¢n ha cambiado. šGuardar ahora?"
+IDSTR_MENUFILE           "~Archivo"
+IDSTR_PLAYLISTVIEWTITLE  "Editor de listas de reproducci¢n"
+IDSTR_LAUNCHPADFLYOVER   "Lanzadera: arrastre objetos aqu¡"
+IDSTR_VIEWPAGENAME       "~Ver"
+IDSTR_VIEWCOMPACT        "~Vista compacta"
+
+END
+
+rcinclude "mediafolder_es.dlg"
+
+#ifdef ECS
+rcinclude "about_ecs_es.dlg"
+#else
+rcinclude "about_es.dlg"
+#endif
+
Index: /tags/CWMM-0.3.0_GA/mediafolder/res/fr/about_ecs_fr.dlg
===================================================================
--- /tags/CWMM-0.3.0_GA/mediafolder/res/fr/about_ecs_fr.dlg	(revision 213)
+++ /tags/CWMM-0.3.0_GA/mediafolder/res/fr/about_ecs_fr.dlg	(revision 213)
@@ -0,0 +1,25 @@
+#define VER_STRING "Media Folder V" \
+MFLDR_VERSION \
+BUILD_STRING
+
+ICON IDICON_FOLDER1  "../icons_ecs/mediafolder1.ico"
+
+DLGTEMPLATE IDDLG_ABOUT LOADONCALL MOVEABLE DISCARDABLE
+BEGIN
+    DIALOG  "Information sur le produit", IDDLG_ABOUT, 100, 120, 194, 67,
+            WS_VISIBLE, FCF_TITLEBAR
+    BEGIN
+        ICON            IDICON_FOLDER1, IDICON_FOLDER1, 10, 39, 16, 15, WS_GROUP
+        LTEXT           "Multimedia integration for the desktop",
+                        IDST_PRODNAME, 38, 50, 154, 10, DT_WORDBREAK | NOT
+                        WS_GROUP
+                        //PRESPARAMS PP_FONTNAMESIZE, "9.WarpSans Bold"
+        CONTROL         "", 607, 38, 43, 154, 7, "CW_SEPARATOR", WS_VISIBLE
+        LTEXT           MFLDR_AUTHOR, IDST_PRODCOPY, 10,
+                        25, 184, 11, DT_VCENTER | DT_WORDBREAK | NOT
+                        WS_GROUP
+                        //PRESPARAMS PP_FONTNAMESIZE, "9.WarpSans"
+        DEFPUSHBUTTON   "~Ok", IDSTR_CLOSETEXT, 10, 2, 34, 13
+    END
+END
+
Index: /tags/CWMM-0.3.0_GA/mediafolder/res/fr/about_fr.dlg
===================================================================
--- /tags/CWMM-0.3.0_GA/mediafolder/res/fr/about_fr.dlg	(revision 213)
+++ /tags/CWMM-0.3.0_GA/mediafolder/res/fr/about_fr.dlg	(revision 213)
@@ -0,0 +1,25 @@
+#define VER_STRING "Media Folder v" \
+MFLDR_VERSION \
+BUILD_STRING
+
+DLGTEMPLATE IDDLG_ABOUT LOADONCALL MOVEABLE DISCARDABLE
+BEGIN
+    DIALOG  "Information sur le produit", IDDLG_ABOUT, 115, 69, 208, 132,
+            WS_VISIBLE, FCF_TITLEBAR
+    BEGIN
+        GROUPBOX        "", IDGB_ABOUT, 3, 21, 200, 108
+        CTEXT           VER_STRING, IDST_PRODNAME, 10, 107, 187,
+                        12, DT_VCENTER | NOT WS_GROUP
+        CTEXT           MFLDR_AUTHOR,
+                        IDST_PRODCOPY, 10, 87, 186, 12, DT_VCENTER | NOT WS_GROUP
+        CTEXT           "Copyright (c) netlabs.org 2020",
+                        IDST_PRODCOPY2, 10, 64, 186, 12, DT_VCENTER | NOT WS_GROUP
+        CTEXT           "Graphics by Klaus Staedtler-Przyborski",
+                        IDST_PRODGRAPHICS, 10, 46, 186, 17, DT_WORDBREAK |
+                        NOT WS_GROUP
+        CTEXT           "https://trac.netlabs.org/cwmmclasses", IDST_URL1,
+                        10, 30, 186, 18, DT_WORDBREAK | NOT WS_GROUP
+                        PRESPARAMS PP_FONTNAMESIZE, "8.Helv"
+        DEFPUSHBUTTON   "~OK", DID_OK, 83, 3, 40, 14
+    END
+END
Index: /tags/CWMM-0.3.0_GA/mediafolder/res/fr/create_res_fr_def.CMD
===================================================================
--- /tags/CWMM-0.3.0_GA/mediafolder/res/fr/create_res_fr_def.CMD	(revision 213)
+++ /tags/CWMM-0.3.0_GA/mediafolder/res/fr/create_res_fr_def.CMD	(revision 213)
@@ -0,0 +1,101 @@
+/* */
+/**************************************************************************
+ French translation....: Guillaume Gay <guillaume[dot]gay[arobase]gmail[dot]com>
+ Version...............: 2020-07-23
+**************************************************************************/
+
+call RxFuncAdd 'SysLoadFuncs', 'RexxUtil', 'SysLoadFuncs'
+call SysLoadFuncs
+
+deffile=ARG(1)
+if ARG(1)="" then deffile="tst.def"
+
+SAY ""
+SAY "Cration du fichier DEF "deffile
+SAY ""
+
+theVersion=VALUE("MMCLSVERSION", ,"OS2ENVIRONMENT")
+if theVersion="" THEN theVersion=0.0.0
+
+def="; mediafolder_fr.def: Fichier DEF pour une DLL des ressources en franais"||'0d'x||'0a'x
+def=def||";"||'0d'x||'0a'x
+
+def=def||";La licence suivante s'applique UNIQUEMENT 
+ CETTE DLL de ressources."||'0d'x||'0a'x
+def=def||";Gardez 
+ l'esprit que la distribution de Media-folder tout entire"||'0d'x||'0a'x
+def=def||";peut tre couverte par une autre licence."||'0d'x||'0a'x
+def=def||";"||'0d'x||'0a'x
+def=def||";/*"||'0d'x||'0a'x
+def=def||"; * Copyright (c) Chris Wohlgemuth 2002-2005 Netlabs 2023-"||WORD(DATE(), 3)  ||'0d'x||'0a'x
+def=def||"; * Tous droits rservs."||'0d'x||'0a'x
+def=def||"; *"||'0d'x||'0a'x
+def=def||"; * http://www.geocities.com/SiliconValley/Sector/5785/"||'0d'x||'0a'x
+def=def||"; * http://www.os2world.com/cdwriting"||'0d'x||'0a'x
+def=def||"; *"||'0d'x||'0a'x
+def=def||"; * La redistribution et l'utilisation des sources et des binaires,"||'0d'x||'0a'x
+def=def||"; * avec ou sans modification, sont permises du moment que les"||'0d'x||'0a'x
+def=def||"; * conditions suivantes sont respectes :"||'0d'x||'0a'x
+def=def||"; *"||'0d'x||'0a'x
+def=def||"; * 1. Redistributions of source code must retain the above copyright"||'0d'x||'0a'x
+def=def||"; *    notice, this list of conditions and the following disclaimer."||'0d'x||'0a'x
+def=def||"; * 2. Redistributions in binary form must reproduce the above copyright"||'0d'x||'0a'x
+def=def||"; *    notice, this list of conditions and the following disclaimer in the"||'0d'x||'0a'x
+def=def||"; *    documentation and/or other materials provided with the distribution."||'0d'x||'0a'x
+def=def||"; * 3. The authors name may not be used to endorse or promote products"||'0d'x||'0a'x
+def=def||"; *    derived from this software without specific prior written permission."||'0d'x||'0a'x
+def=def||"; *"||'0d'x||'0a'x
+def=def||"; * THIS SOFTWARE IS PROVIDED ``AS IS'' AND"||'0d'x||'0a'x
+def=def||"; * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE"||'0d'x||'0a'x
+def=def||"; * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE"||'0d'x||'0a'x
+def=def||"; * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE"||'0d'x||'0a'x
+def=def||"; * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL"||'0d'x||'0a'x
+def=def||"; * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS"||'0d'x||'0a'x
+def=def||"; * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)"||'0d'x||'0a'x
+def=def||"; * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT"||'0d'x||'0a'x
+def=def||"; * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY"||'0d'x||'0a'x
+def=def||"; * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF"||'0d'x||'0a'x
+def=def||"; * SUCH DAMAGE."||'0d'x||'0a'x
+def=def||"; *"||'0d'x||'0a'x
+def=def||"; * [ Pour information :"||'0d'x||'0a'x
+def=def||"; *"||'0d'x||'0a'x
+def=def||"; * 1. Les redistributions du code source doivent faire figurer le"||'0d'x||'0a'x
+def=def||"; *    copyright ci-dessus, cette liste de conditions et les"||'0d'x||'0a'x
+def=def||"; *    clauses d'utilisation suivantes. "||'0d'x||'0a'x
+def=def||"; * 2. Les redistributions de la fome binaire doivent faire figurer le"||'0d'x||'0a'x
+def=def||"; *    copyright ci-dessus, cette liste de conditions et les"||'0d'x||'0a'x
+def=def||"; *    clauses d'utilisation suivantes dans la documentation et/ou"||'0d'x||'0a'x
+def=def||"; *    les autres documents fournis avec la distribution. "||'0d'x||'0a'x
+def=def||"; * 3. Le nom de l'auteur ne pourra pas tre utilis comme caution ou pour"||'0d'x||'0a'x
+def=def||"; *    la promotion de produits drivs de ce logiciel sans sa permission "||'0d'x||'0a'x
+def=def||"; *    spcifique crite et pralable. "||'0d'x||'0a'x
+def=def||"; *"||'0d'x||'0a'x
+def=def||"; * CE LOGICIEL EST FOURNI 'TEL QUEL' ET SANS AUCUNE GARANTIE EXPLICITE OU"||'0d'x||'0a'x
+def=def||"; * IMPLICITE, Y COMPRIS, SANS LIMITATION, LES GARANTIES IMPLICITES DE"||'0d'x||'0a'x
+def=def||"; * COMMERCIALISATION ET D'ADQUATION · UN BUT PARTICULIER. EN AUCUN CAS"||'0d'x||'0a'x
+def=def||"; * LES AUTEURS OU LES COLLABORATEURS NE POURRONT ÒTRE TENUS RESPONSABLES POUR"||'0d'x||'0a'x
+def=def||"; * QUELQUE INCIDENT QUE CE SOIT DIRECT OU INDIRECT, SPECIAL, EXEMPLAIRE OU "||'0d'x||'0a'x
+def=def||"; * QUELQUES DOMMAGES CONSQUENTS QUE CE SOIENT (INCLUANT, SANS"||'0d'x||'0a'x
+def=def||"; * LIMITATION, L'OBTENTION DE BIENS OU SERVICES DE SUBSTITUTION, LA"||'0d'x||'0a'x
+def=def||"; * PERTE DE DONNES, DE PROFITS, OU L'ARRÒT DE PRODUCTION)"||'0d'x||'0a'x
+def=def||"; * MÒME CAUSS DANS UN CADRE THORIQUE DE RESPONSABILIT, D'UN CONTRAT,"||'0d'x||'0a'x
+def=def||"; * DE RESPONSABILIT STRICTE OU PAR TORT (INCLUANT LA NGLIGENCE ET"||'0d'x||'0a'x
+def=def||"; * AUTRE) SURVENANTS DE L'USAGE DE CE LOGICIEL, ET CE MÒME SI PRVENU"||'0d'x||'0a'x
+def=def||"; * DE LA POSSIBILIT DE TELS DOMMAGES."||'0d'x||'0a'x
+def=def||"; * ]"||'0d'x||'0a'x
+def=def||"; *"||'0d'x||'0a'x
+def=def||"; */"||'0d'x||'0a'x
+
+def=def||'0d'x||'0a'x
+
+def=def||"LIBRARY MFLDR_FR INITINSTANCE TERMINSTANCE"||'0d'x||'0a'x
+def=def||"DESCRIPTION '$@# Netlabs CWMM Team"
+def=def||":"||theVersion||" #@##1## "||DATE("E")||" "||TIME("N")||"       Zobopeep ::::"||WORD(TRANSLATE(theVersion," ", "."),3)||"::@@Media-Folder FR res DLL (C) C. Wohlgemuth 2002-2005 Netlabs CWMM Team 2023-"||WORD(DATE(),3)||"'"||'0d'x||'0a'x
+def=def||"DATA MULTIPLE NONSHARED"||'0d'x||'0a'x
+def=def||"EXPORTS  "||'0d'x||'0a'x
+def=def||"        queryLanguage"||'0d'x||'0a'x
+
+'@type NUL > 'deffile
+call lineout deffile,def
+call stream deffile, "C", "close"
+exit
Index: /tags/CWMM-0.3.0_GA/mediafolder/res/fr/makefile
===================================================================
--- /tags/CWMM-0.3.0_GA/mediafolder/res/fr/makefile	(revision 213)
+++ /tags/CWMM-0.3.0_GA/mediafolder/res/fr/makefile	(revision 213)
@@ -0,0 +1,16 @@
+
+include ../../../make.inc
+include ../../../build.inc
+
+all:
+	cd ./.. && make
+
+clean:
+	
+cleaner:
+	-rm *.flc
+	-rm *.*~
+
+distribution:
+
+	
Index: /tags/CWMM-0.3.0_GA/mediafolder/res/fr/mediafolder_fr.c
===================================================================
--- /tags/CWMM-0.3.0_GA/mediafolder/res/fr/mediafolder_fr.c	(revision 213)
+++ /tags/CWMM-0.3.0_GA/mediafolder/res/fr/mediafolder_fr.c	(revision 213)
@@ -0,0 +1,28 @@
+/*
+ * This file is (C) Chris Wohlgemuth 1999
+ */
+/*
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; see the file COPYING.  If not, write to
+ * the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+/*
+ * French translation....: Guillaume Gay <guillaume[dot]gay[arobase]gmail[dot]com>
+ * Version...............: 2020-07-23
+ */
+#include <os2.h>
+
+PSZ queryLanguage()
+{
+  return "Franais";
+}
Index: /tags/CWMM-0.3.0_GA/mediafolder/res/fr/mediafolder_fr.dlg
===================================================================
--- /tags/CWMM-0.3.0_GA/mediafolder/res/fr/mediafolder_fr.dlg	(revision 213)
+++ /tags/CWMM-0.3.0_GA/mediafolder/res/fr/mediafolder_fr.dlg	(revision 213)
@@ -0,0 +1,101 @@
+#ifndef OS2_INCLUDED
+   #include <os2.h>
+#endif
+DLGINCLUDE 1 "
+G:\Projects_working\mmclasses-0.3.0\source\include\mediafolderres.h"
+
+DLGTEMPLATE IDDLG_BOTTOMFRAME LOADONCALL MOVEABLE DISCARDABLE
+BEGIN
+    DIALOG  "", IDDLG_BOTTOMFRAME, 12, 70, 300, 16, NOT FS_DLGBORDER | NOT
+            WS_SAVEBITS
+    BEGIN
+        CTEXT           "", IDST_STATUSTEXT, 39, 1, 221, 8
+    END
+END
+
+DLGTEMPLATE IDDLG_FRAMERIGHT LOADONCALL MOVEABLE DISCARDABLE
+BEGIN
+    DIALOG  "", IDDLG_FRAMERIGHT, 134, 21, 24, 109, NOT FS_DLGBORDER | NOT
+            WS_SAVEBITS
+    BEGIN
+    END
+END
+
+DLGTEMPLATE IDDLG_LEFTFRAME LOADONCALL MOVEABLE DISCARDABLE
+BEGIN
+    DIALOG  "", IDDLG_LEFTFRAME, 12, 6, 148, 148, NOT FS_DLGBORDER | NOT
+            WS_SAVEBITS
+    BEGIN
+        CONTAINER       IDCNR_PLAYLIST, 14, 11, 123, 111, CCS_SINGLESEL |
+                        CCS_AUTOPOSITION | CCS_MINIRECORDCORE | WS_GROUP
+        PUSHBUTTON      "Ajouter", IDPB_ADD, 8, 129, 40, 14
+        PUSHBUTTON      "Retirer", IDPB_REMOVE, 72, 129, 40, 14
+    END
+END
+
+DLGTEMPLATE IDDLG_TOOLBARSETTINGS LOADONCALL MOVEABLE DISCARDABLE
+BEGIN
+    DIALOG  "", IDDLG_TOOLBARSETTINGS, 91, 22, 201, 199, NOT FS_DLGBORDER |
+            WS_VISIBLE
+    BEGIN
+        GROUPBOX        "Barre d'outils", IDGB_TOOLBAR, 9, 24, 181, 127, NOT
+                        WS_GROUP
+        AUTOCHECKBOX    "~Activer l'aide contextuelle", IDCB_ENABLETBFLYOVER, 16,
+                        129, 152, 10
+        SPINBUTTON      IDSB_TBFLYOVERDELAY, 97, 115, 40, 12,
+                        SPBS_NUMERICONLY | SPBS_MASTER | SPBS_FASTSPIN |
+                        WS_GROUP
+        GROUPBOX        "Couleurs et police de l'aide contextuelle", IDGB_COLORANDFONT, 15,
+                        30, 168, 76, NOT WS_GROUP
+        LTEXT           "Cliquez sur le bouton correspondant pour ouvrir la palette de couleurs ou de polices. "
+                        "Maintenez 'Ctrl' appuye en dposant pour modifier la couleur du texte.",
+                        IDST_TEXTDEMOFIELD, 23, 35, 95, 57, DT_WORDBREAK
+                        PRESPARAMS PP_FOREGROUNDCOLOR, 0x000000FFL
+                        PRESPARAMS PP_BACKGROUNDCOLOR, 0x00FFFFFFL
+        PUSHBUTTON      "~Couleur...", IDPB_COLORPALETTE, 129, 72, 45, 14
+        PUSHBUTTON      "~Police...", IDPB_FONTPALETTE, 129, 49, 45, 14
+        PUSHBUTTON      "~Dfaire", IDPB_COLORUNDO, 16, 7, 52, 14
+        PUSHBUTTON      "~Par dfaut", IDPB_COLORSTANDARD, 74, 7, 52, 14
+        PUSHBUTTON      "A~ide", IDPB_COLORHELP, 132, 7, 52, 14, BS_HELP
+        RTEXT           "Dlai (ms) :", IDGB_COLORANDFONT, 35, 116, 55, 8,
+                        DT_VCENTER
+    END
+END
+
+DLGTEMPLATE IDDLG_TOPFRAME LOADONCALL MOVEABLE DISCARDABLE
+BEGIN
+    DIALOG  "", IDDLG_TOPFRAME, 13, 52, 287, 26, NOT FS_DLGBORDER |
+            FS_BORDER | NOT WS_SAVEBITS
+    BEGIN
+        PUSHBUTTON      "Appuyer", IDPB_PAUSE, 2, 6, 19, 14, NOT WS_VISIBLE
+    END
+END
+
+DLGTEMPLATE IDDLG_TOPMIDDLE LOADONCALL MOVEABLE DISCARDABLE
+BEGIN
+    DIALOG  "", IDDLG_TOPMIDDLE, 12, 51, 249, 39, NOT FS_DLGBORDER |
+            FS_BORDER | WS_VISIBLE | NOT WS_SAVEBITS
+    BEGIN
+        CONTROL         "P~rcdent", IDPB_SKIPBACK, 19, 25, 20, 14, WC_BUTTON,
+                        BS_USERBUTTON | BS_NOPOINTERFOCUS | WS_TABSTOP |
+                        WS_VISIBLE
+        CONTROL         "~Arrt", IDPB_STOP, 40, 25, 22, 14, WC_BUTTON,
+                        BS_USERBUTTON | BS_NOPOINTERFOCUS | WS_VISIBLE
+        CONTROL         "~Pause", IDPB_PAUSE, 61, 25, 20, 14, WC_BUTTON,
+                        BS_USERBUTTON | BS_NOPOINTERFOCUS | WS_VISIBLE
+        CONTROL         "~Lecture", IDPB_PLAY, 79, 25, 20, 14, WC_BUTTON,
+                        BS_USERBUTTON | BS_NOPOINTERFOCUS | WS_VISIBLE
+        CONTROL         "~Suivant", IDPB_SKIPFORWARD, 99, 25, 20, 14, WC_BUTTON,
+                        BS_USERBUTTON | BS_NOPOINTERFOCUS | WS_VISIBLE
+        AUTOCHECKBOX    "Rp~ter", IDCB_REPEAT, 133, 13, 73, 10,WS_VISIBLE|BS_USERBUTTON | BS_AUTOCHECKBOX
+        AUTOCHECKBOX    "Alat~oire", IDCB_RANDOM, 133, 23, 73, 10, WS_VISIBLE  | BS_USERBUTTON | BS_AUTOCHECKBOX
+
+        CTEXT           "0:00", IDST_PLAYTIME, 133, 24, 102, 10, DT_VCENTER
+                        PRESPARAMS PP_FONTNAMESIZE, "10.Helv"
+        CONTROL         "VolumeArm", IDSL_VOLUMEARM, 209, 5, 14, 14,
+                        WC_BUTTON, BS_USERBUTTON | WS_TABSTOP|BS_USERBUTTON
+        PUSHBUTTON      "Volume", IDSL_VOLUME, 19, 4, 69, 14,
+                        BS_NOPOINTERFOCUS | NOT WS_TABSTOP | NOT WS_VISIBLE |BS_USERBUTTON
+    END
+END
+
Index: /tags/CWMM-0.3.0_GA/mediafolder/res/fr/mediafolder_fr.rc
===================================================================
--- /tags/CWMM-0.3.0_GA/mediafolder/res/fr/mediafolder_fr.rc	(revision 213)
+++ /tags/CWMM-0.3.0_GA/mediafolder/res/fr/mediafolder_fr.rc	(revision 213)
@@ -0,0 +1,98 @@
+#define  INCL_GRAPHICBUTTON   /* need this for the graphic buttons control */
+#define  INCL_BITMAP
+
+#ifndef OS2_INCLUDED
+   #include <os2.h>
+#endif
+#include <sw.h>
+
+#include "mediafolderres.h"
+#include "version.h"
+#include "build.h"
+
+#ifdef ECS
+MENU ID_MENUABOUT
+BEGIN
+   MENUITEM  "" , ID_MENUSEPARATOR, MIS_SEPARATOR
+   MENUITEM "Info. sur le ~produit" ,    ID_ABOUTITEM
+END
+#else
+MENU ID_MENUABOUT
+BEGIN
+   MENUITEM  "" , ID_MENUSEPARATOR, MIS_SEPARATOR
+   MENUITEM "Info. sur le dossier ~multimdia" , ID_ABOUTITEM
+END
+#endif
+
+MENU ID_MBMENUSKRIPTS
+BEGIN
+
+END
+
+MENU ID_MENUVIEWCOMPACT
+BEGIN
+   MENUITEM  "Affichage ~compact" ,      ID_MENUVIEWCOMPACT
+END
+
+MENU  ID_MENUTIMECONTEXT
+BEGIN
+   MENUITEM "Temps ~coul" ,            ID_MENUITEMELAPSED
+   MENUITEM "Temps ~restant" ,           ID_MENUITEMREMAINING
+   MENUITEM "Info. sur la ~piste" ,      ID_MENUITEMID3
+END
+
+MENU  ID_MENUFILE
+BEGIN
+   MENUITEM "~Enregistrer" ,             ID_MENUITEMSAVE
+   MENUITEM "" ,                         ID_MENUSEPARATOR, MIS_SEPARATOR
+   MENUITEM "~Quitter" ,                 ID_MENUITEMEXIT
+END
+
+
+STRINGTABLE
+BEGIN
+IDSTR_CLOSETITLE         "Confirmation"
+IDSTR_CLOSETEXT          "Il y a actuellement un morceau de musique en cours de lecture. Voulez-vous rellement arrter la lecture et fermer le le lecteur ?"
+IDSTRSETTING_TOOLBAR     "Barre d'outils"
+IDSTRS_NOFONTPALETTE     "Ouverture impossible de la palette de polices. Il se peut qu'elle ait perdu sont identifiant d'objet. Vrifiez vos fichiers INI."
+IDSTRS_NOCOLORPALETTE    "Ouverture impossible de la palette de couleurs. Il se peut qu'elle ait perdu sont identifiant d'objet. Vrifiez vos fichiers INI."
+IDSTRS_MEDIAFLDRSETTINGS "Paramtres du dossier multimdia"
+#ifdef ECS
+IDSTR_MENUABOUT          "Informations produit"
+#else
+IDSTR_MENUABOUT          "Informations 
+ propos du dossier multimdia"
+#endif
+IDSTR_MEDIAFLDHELP       "~Lecteur multimdia Help"
+IDSTR_M3ULISTHELP        "~diteur M3U Help" 
+IDSTR_MENUCOMPACT        "Affichage ~compact"
+IDSTR_STATUSCOLLECTING   "Rcupration en cours des pistes audio..."
+IDSTR_MENUSKRIPTS        "Scripts et outils"
+IDSTR_STATUSTIME1        "%d:%02d min"
+IDSTR_STATUSTIME2        "%d h %d:%02d min"
+IDSTR_STATUSTIME3        "%d jour(s) %d h %d:%02d mins"
+IDSTR_STATUSTIME4        "%d fichier(s) audio   -   %d%s%03d%s%03d octets   -   %s"
+IDSTR_STATUSTIME5        "%d fichier(s) audio   -   plus de 4 Go"
+
+IDSTR_TITLEMEDIAFOLDER   "Lecteur multimdia"
+IDSTR_TITLECDFOLDER      "Lecteur CD"
+
+IDSTR_STARTINGTRACK      "Lancement de la piste..."
+IDSTR_TITLEM3UFOLDER     "diteur M3U"
+IDSTR_M3UCLOSETEXT       "La liste de lecture a t modifie. Voulez-vous l'enregistrer maintenant ?"
+IDSTR_MENUFILE           "~Fichier"
+IDSTR_PLAYLISTVIEWTITLE  "diteur de liste de lecture"
+IDSTR_LAUNCHPADFLYOVER   "Lanceur : Dposez des objets ici"
+IDSTR_VIEWPAGENAME       "~Affichage"
+IDSTR_VIEWCOMPACT        "Compact"
+
+END
+
+rcinclude "mediafolder_fr.dlg"
+
+#ifdef ECS
+rcinclude "about_ecs_fr.dlg"
+#else
+rcinclude "about_fr.dlg"
+#endif
+
Index: /tags/CWMM-0.3.0_GA/mediafolder/res/it/about_ecs_it.dlg
===================================================================
--- /tags/CWMM-0.3.0_GA/mediafolder/res/it/about_ecs_it.dlg	(revision 213)
+++ /tags/CWMM-0.3.0_GA/mediafolder/res/it/about_ecs_it.dlg	(revision 213)
@@ -0,0 +1,25 @@
+#define VER_STRING "Media-Ordner V" \
+MFLDR_VERSION \
+BUILD_STRING
+
+ICON IDICON_FOLDER1  "../icons_ecs/mediafolder1.ico"
+
+DLGTEMPLATE IDDLG_ABOUT LOADONCALL MOVEABLE DISCARDABLE
+BEGIN
+    DIALOG  "Produkt Information", IDDLG_ABOUT, 100, 120, 194, 67,
+            WS_VISIBLE, FCF_TITLEBAR
+    BEGIN
+        ICON            IDICON_FOLDER1, IDICON_FOLDER1, 10, 39, 16, 15, WS_GROUP
+        LTEXT           "Multimedia integration for the desktop",
+                        IDST_PRODNAME, 38, 50, 154, 10, DT_WORDBREAK | NOT
+                        WS_GROUP
+                        //PRESPARAMS PP_FONTNAMESIZE, "9.WarpSans Bold"
+        CONTROL         "", 607, 38, 43, 154, 7, "CW_SEPARATOR", WS_VISIBLE
+        LTEXT           MFLDR_AUTHOR, IDST_PRODCOPY, 10,
+                        25, 184, 11, DT_VCENTER | DT_WORDBREAK | NOT
+                        WS_GROUP
+                        //PRESPARAMS PP_FONTNAMESIZE, "9.WarpSans"
+        DEFPUSHBUTTON   "~Ok", IDSTR_CLOSETEXT, 10, 2, 34, 13
+    END
+END
+
Index: /tags/CWMM-0.3.0_GA/mediafolder/res/it/about_it.dlg
===================================================================
--- /tags/CWMM-0.3.0_GA/mediafolder/res/it/about_it.dlg	(revision 213)
+++ /tags/CWMM-0.3.0_GA/mediafolder/res/it/about_it.dlg	(revision 213)
@@ -0,0 +1,27 @@
+#define VER_STRING "Media-Ordner V" \
+MFLDR_VERSION \
+BUILD_STRING
+
+DLGTEMPLATE IDDLG_ABOUT LOADONCALL MOVEABLE DISCARDABLE
+BEGIN
+    DIALOG  "Product Information", IDDLG_ABOUT, 115, 69, 208, 132,
+            WS_VISIBLE, FCF_TITLEBAR
+    BEGIN
+        GROUPBOX        "", IDGB_ABOUT, 3, 21, 200, 108
+        CTEXT           VER_STRING, IDST_PRODNAME, 10, 107, 187,
+                        12, DT_VCENTER | NOT WS_GROUP
+        CTEXT           MFLDR_AUTHOR, IDST_PRODCOPY, 10, 87,
+                        186, 12, DT_VCENTER | NOT WS_GROUP
+        CTEXT           "Copyright (c) netlabs.org 2020",
+                        IDST_PRODCOPY2, 10, 64, 186, 12, DT_VCENTER | NOT WS_GROUP                        
+        CTEXT           "Graphics by Klaus Staedtler-Przyborski",
+                        IDST_PRODGRAPHICS, 10, 64, 186, 17, DT_WORDBREAK |
+                        NOT WS_GROUP
+        CTEXT           "https://trac.netlabs.org/cwmmclasses", IDST_URL1,
+                        10, 30, 186, 18, DT_WORDBREAK | NOT WS_GROUP
+                        PRESPARAMS PP_FONTNAMESIZE, "8.Helv"                        
+        DEFPUSHBUTTON   "~Ok", DID_OK, 83, 3, 40, 14
+    END
+END
+
+
Index: /tags/CWMM-0.3.0_GA/mediafolder/res/it/create_res_it_def.CMD
===================================================================
--- /tags/CWMM-0.3.0_GA/mediafolder/res/it/create_res_it_def.CMD	(revision 213)
+++ /tags/CWMM-0.3.0_GA/mediafolder/res/it/create_res_it_def.CMD	(revision 213)
@@ -0,0 +1,66 @@
+/* */
+call RxFuncAdd 'SysLoadFuncs', 'RexxUtil', 'SysLoadFuncs'
+call SysLoadFuncs
+
+deffile=ARG(1)
+if ARG(1)="" then deffile="tst.def"
+
+SAY ""
+SAY "Creating DEF file "deffile
+SAY ""
+
+theVersion=VALUE("MMCLSVERSION", ,"OS2ENVIRONMENT")
+if theVersion="" THEN theVersion=0.0.0
+
+def="; mediafolder_it.def: DEF-file for italian resource DLL"||'0d'x||'0a'x
+def=def||";"||'0d'x||'0a'x
+
+def=def||";The following license applies ONLY TO THIS resource DLL. Be aware"||'0d'x||'0a'x
+def=def||";that the whole Media-folder package may be covered by another license."||'0d'x||'0a'x
+def=def||";"||'0d'x||'0a'x
+def=def||";/*"||'0d'x||'0a'x
+def=def||"; * Copyright (c) Chris Wohlgemuth 2002-2005 Netlabs 2023-"||WORD(DATE(), 3)  ||'0d'x||'0a'x
+def=def||"; * All rights reserved."||'0d'x||'0a'x
+def=def||"; *"||'0d'x||'0a'x
+def=def||"; * http://www.geocities.com/SiliconValley/Sector/5785/"||'0d'x||'0a'x
+def=def||"; * http://www.os2world.com/cdwriting"||'0d'x||'0a'x
+def=def||"; *"||'0d'x||'0a'x
+def=def||"; * Redistribution and use in source and binary forms, with or without"||'0d'x||'0a'x
+def=def||"; * modification, are permitted provided that the following conditions"||'0d'x||'0a'x
+def=def||"; * are met:"||'0d'x||'0a'x
+def=def||"; * 1. Redistributions of source code must retain the above copyright"||'0d'x||'0a'x
+def=def||"; *    notice, this list of conditions and the following disclaimer."||'0d'x||'0a'x
+def=def||"; * 2. Redistributions in binary form must reproduce the above copyright"||'0d'x||'0a'x
+def=def||"; *    notice, this list of conditions and the following disclaimer in the"||'0d'x||'0a'x
+def=def||"; *    documentation and/or other materials provided with the distribution."||'0d'x||'0a'x
+def=def||"; * 3. The authors name may not be used to endorse or promote products"||'0d'x||'0a'x
+def=def||"; *    derived from this software without specific prior written permission."||'0d'x||'0a'x
+def=def||"; *"||'0d'x||'0a'x
+def=def||"; * THIS SOFTWARE IS PROVIDED ``AS IS'' AND"||'0d'x||'0a'x
+def=def||"; * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE"||'0d'x||'0a'x
+def=def||"; * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE"||'0d'x||'0a'x
+def=def||"; * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE"||'0d'x||'0a'x
+def=def||"; * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL"||'0d'x||'0a'x
+def=def||"; * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS"||'0d'x||'0a'x
+def=def||"; * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)"||'0d'x||'0a'x
+def=def||"; * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT"||'0d'x||'0a'x
+def=def||"; * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY"||'0d'x||'0a'x
+def=def||"; * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF"||'0d'x||'0a'x
+def=def||"; * SUCH DAMAGE."||'0d'x||'0a'x
+def=def||"; *"||'0d'x||'0a'x
+def=def||"; */"||'0d'x||'0a'x
+
+def=def||'0d'x||'0a'x
+
+def=def||"LIBRARY MFLDR_IT INITINSTANCE TERMINSTANCE"||'0d'x||'0a'x
+def=def||"DESCRIPTION '$@# Netlabs CWMM Team"
+def=def||":"||theVersion||" #@##1## "||DATE("E")||" "||TIME("N")||"       Zobopeep ::::"||WORD(TRANSLATE(theVersion," ", "."),3)||"::@@Media-Folder IT res DLL (C) C. Wohlgemuth 2001-2005 Netlabs CWMM Team 2023-"||WORD(DATE(),3)||"'"||'0d'x||'0a'x
+def=def||"DATA MULTIPLE NONSHARED"||'0d'x||'0a'x
+def=def||"EXPORTS  "||'0d'x||'0a'x
+def=def||"        queryLanguage"||'0d'x||'0a'x
+
+'@type NUL > 'deffile
+call lineout deffile,def
+call stream deffile, "C", "close"
+exit
+
Index: /tags/CWMM-0.3.0_GA/mediafolder/res/it/makefile
===================================================================
--- /tags/CWMM-0.3.0_GA/mediafolder/res/it/makefile	(revision 213)
+++ /tags/CWMM-0.3.0_GA/mediafolder/res/it/makefile	(revision 213)
@@ -0,0 +1,17 @@
+
+include ../../../make.inc
+include ../../../build.inc
+
+all:
+	cd ./.. && make
+
+clean:
+	
+cleaner:
+	-rm *.flc
+	-rm *.*~
+
+distribution:
+
+	
+
Index: /tags/CWMM-0.3.0_GA/mediafolder/res/it/mediafolder_it.c
===================================================================
--- /tags/CWMM-0.3.0_GA/mediafolder/res/it/mediafolder_it.c	(revision 213)
+++ /tags/CWMM-0.3.0_GA/mediafolder/res/it/mediafolder_it.c	(revision 213)
@@ -0,0 +1,25 @@
+/*
+ * This file is (C) Chris Wohlgemuth 1999
+ */
+/*
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; see the file COPYING.  If not, write to
+ * the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+
+#include <os2.h>
+
+PSZ queryLanguage()
+{
+  return "Italiano";
+}
Index: /tags/CWMM-0.3.0_GA/mediafolder/res/it/mediafolder_it.dlg
===================================================================
--- /tags/CWMM-0.3.0_GA/mediafolder/res/it/mediafolder_it.dlg	(revision 213)
+++ /tags/CWMM-0.3.0_GA/mediafolder/res/it/mediafolder_it.dlg	(revision 213)
@@ -0,0 +1,105 @@
+#ifndef OS2_INCLUDED
+   #include <os2.h>
+#endif
+DLGINCLUDE 1 "
+G:\Projects_working\mmclasses-0.3.0\source\include\mediafolderres.h"
+
+DLGTEMPLATE IDDLG_BOTTOMFRAME LOADONCALL MOVEABLE DISCARDABLE
+BEGIN
+    DIALOG  "", IDDLG_BOTTOMFRAME, 12, 70, 300, 16, NOT FS_DLGBORDER | NOT
+            WS_SAVEBITS
+    BEGIN
+        CTEXT           "", IDST_STATUSTEXT, 39, 1, 221, 8
+    END
+END
+
+DLGTEMPLATE IDDLG_FRAMERIGHT LOADONCALL MOVEABLE DISCARDABLE
+BEGIN
+    DIALOG  "", IDDLG_FRAMERIGHT, 134, 21, 24, 109, NOT FS_DLGBORDER | NOT
+            WS_SAVEBITS
+    BEGIN
+    END
+END
+
+DLGTEMPLATE IDDLG_LEFTFRAME LOADONCALL MOVEABLE DISCARDABLE
+BEGIN
+    DIALOG  "", IDDLG_LEFTFRAME, 12, 6, 148, 148, NOT FS_DLGBORDER | NOT
+            WS_SAVEBITS
+    BEGIN
+        CONTAINER       IDCNR_PLAYLIST, 14, 11, 123, 111, CCS_SINGLESEL |
+                        CCS_AUTOPOSITION | CCS_MINIRECORDCORE | WS_GROUP
+        PUSHBUTTON      "Aggiungi", IDPB_ADD, 8, 129, 40, 14
+        PUSHBUTTON      "Rimuovi", IDPB_REMOVE, 72, 129, 40, 14
+    END
+END
+
+DLGTEMPLATE IDDLG_TOOLBARSETTINGS LOADONCALL MOVEABLE DISCARDABLE
+BEGIN
+    DIALOG  "", IDDLG_TOOLBARSETTINGS, 91, 22, 201, 199, NOT FS_DLGBORDER |
+            WS_VISIBLE
+    BEGIN
+        GROUPBOX        "Pannello", IDGB_TOOLBAR, 9, 24, 181, 127, NOT
+                        WS_GROUP
+        AUTOCHECKBOX    "~Abilita suggerimenti", IDCB_ENABLETBFLYOVER, 16,
+                        129, 152, 10
+        SPINBUTTON      IDSB_TBFLYOVERDELAY, 97, 115, 40, 12,
+                        SPBS_NUMERICONLY | SPBS_MASTER | SPBS_FASTSPIN |
+                        WS_GROUP
+        GROUPBOX        "Colore e tipo carattere suggerimenti", IDGB_COLORANDFONT, 15,
+                        30, 168, 76, NOT WS_GROUP
+        LTEXT           "Premere il tasto per lo schema colori / font            "
+                        "
+Premere <Ctrl> durante il drag 'n drop per cambiare il colore del testo.",
+                        IDST_TEXTDEMOFIELD, 23, 35, 95, 57, DT_WORDBREAK
+                        PRESPARAMS PP_FOREGROUNDCOLOR, 0x000000FFL
+                        PRESPARAMS PP_BACKGROUNDCOLOR, 0x00FFFFFFL
+        PUSHBUTTON      "~Colore", IDPB_COLORPALETTE, 129, 72, 45, 14
+        PUSHBUTTON      "~Font", IDPB_FONTPALETTE, 129, 49, 45, 14
+        PUSHBUTTON      "~Regredire", IDPB_COLORUNDO, 16, 7, 52, 14
+        PUSHBUTTON      "~Valore assunto", IDPB_COLORSTANDARD, 74, 7, 52, 14
+        PUSHBUTTON      "A~iuto", IDPB_COLORHELP, 132, 7, 52, 14, BS_HELP
+        RTEXT           "Ritardo (ms):", IDGB_COLORANDFONT, 35, 116, 55, 8,
+                        DT_VCENTER
+    END
+END
+
+DLGTEMPLATE IDDLG_TOPFRAME LOADONCALL MOVEABLE DISCARDABLE
+BEGIN
+    DIALOG  "", IDDLG_TOPFRAME, 13, 52, 287, 26, NOT FS_DLGBORDER |
+            FS_BORDER | NOT WS_SAVEBITS
+    BEGIN
+        PUSHBUTTON      "Premi", IDPB_PAUSE, 2, 6, 19, 14, NOT WS_VISIBLE
+    END
+END
+
+DLGTEMPLATE IDDLG_TOPMIDDLE LOADONCALL MOVEABLE DISCARDABLE
+BEGIN
+    DIALOG  "", IDDLG_TOPMIDDLE, 12, 51, 249, 39, NOT FS_DLGBORDER |
+            FS_BORDER | WS_VISIBLE | NOT WS_SAVEBITS
+    BEGIN
+        CONTROL         "~Indietro", IDPB_SKIPBACK, 19, 25, 20, 14, WC_BUTTON,
+                        BS_USERBUTTON | BS_NOPOINTERFOCUS | WS_TABSTOP |
+                        WS_VISIBLE
+        CONTROL         "~Stop", IDPB_STOP, 40, 25, 22, 14, WC_BUTTON,
+                        BS_USERBUTTON | BS_NOPOINTERFOCUS | WS_VISIBLE
+        CONTROL         "~Pausa", IDPB_PAUSE, 61, 25, 20, 14, WC_BUTTON,
+                        BS_USERBUTTON | BS_NOPOINTERFOCUS | WS_VISIBLE
+        CONTROL         "P~lay", IDPB_PLAY, 79, 25, 20, 14, WC_BUTTON,
+                        BS_USERBUTTON | BS_NOPOINTERFOCUS | WS_VISIBLE
+        CONTROL         "~Avanti", IDPB_SKIPFORWARD, 99, 25, 20, 14, WC_BUTTON,
+                        BS_USERBUTTON | BS_NOPOINTERFOCUS | WS_VISIBLE
+        AUTOCHECKBOX    "~Ripeti", IDCB_REPEAT, 133, 13, 73, 10,WS_VISIBLE|BS_USERBUTTON | BS_AUTOCHECKBOX
+        AUTOCHECKBOX    "~Casuale", IDCB_RANDOM, 133, 23, 73, 10, WS_VISIBLE  | BS_USERBUTTON | BS_AUTOCHECKBOX
+
+        CTEXT           "0:00", IDST_PLAYTIME, 133, 24, 102, 10, DT_VCENTER
+                        PRESPARAMS PP_FONTNAMESIZE, "10.Helv"
+        CONTROL         "VolumeArm", IDSL_VOLUMEARM, 209, 5, 14, 14,
+                        WC_BUTTON, BS_USERBUTTON | WS_TABSTOP|BS_USERBUTTON
+        PUSHBUTTON      "Volume", IDSL_VOLUME, 19, 4, 69, 14,
+                        BS_NOPOINTERFOCUS | NOT WS_TABSTOP | NOT WS_VISIBLE |BS_USERBUTTON
+    END
+END
+
+#define VER_STRING "Media-Ordner V" \
+MFLDR_VERSION \
+BUILD_STRING
Index: /tags/CWMM-0.3.0_GA/mediafolder/res/it/mediafolder_it.rc
===================================================================
--- /tags/CWMM-0.3.0_GA/mediafolder/res/it/mediafolder_it.rc	(revision 213)
+++ /tags/CWMM-0.3.0_GA/mediafolder/res/it/mediafolder_it.rc	(revision 213)
@@ -0,0 +1,87 @@
+#define  INCL_GRAPHICBUTTON   /* need this for the graphic buttons control */
+#define  INCL_BITMAP
+
+#ifndef OS2_INCLUDED
+   #include <os2.h>
+#endif
+#include <sw.h>
+
+#include "mediafolderres.h"
+#include "version.h"
+#include "build.h"
+
+MENU ID_MENUABOUT
+BEGIN
+   MENUITEM  "" , ID_MENUSEPARATOR, MIS_SEPARATOR
+   MENUITEM "Informazioni cartella ~multimedia",ID_ABOUTITEM
+END
+
+MENU ID_MBMENUSKRIPTS
+BEGIN
+
+END
+
+MENU ID_MENUVIEWCOMPACT
+BEGIN
+   MENUITEM  "~Compatta" , ID_MENUVIEWCOMPACT
+END
+
+MENU  ID_MENUTIMECONTEXT
+BEGIN
+	MENUITEM "Tempo ~trascorso"   ,         ID_MENUITEMELAPSED
+	MENUITEM "Tempo ~rimanente" ,           ID_MENUITEMREMAINING
+	MENUITEM "~Informazioni tracca" ,       ID_MENUITEMID3
+END
+
+MENU  ID_MENUFILE
+BEGIN
+	MENUITEM "~Salva"   ,           	ID_MENUITEMSAVE
+	MENUITEM ""           ,                 ID_MENUSEPARATOR, MIS_SEPARATOR
+	MENUITEM "~Esci" ,          		ID_MENUITEMEXIT
+END
+
+
+STRINGTABLE
+BEGIN
+IDSTR_CLOSETITLE "Conferma chiusura"
+IDSTR_CLOSETEXT  "E' in corso la riproduzione di un brano. Interromempere e chiudere il lettore?"
+IDSTRSETTING_TOOLBAR "Pannello"
+IDSTRS_NOFONTPALETTE          "Impossibile aprire l'elenco tipi carattere, potrebbe avere perso la sua ID. Verificare i file INI."
+IDSTRS_NOCOLORPALETTE         "Impossibile aprire l'elenco colori, potrebbe avere perso la sua ID. Verificare i file INI."
+IDSTRS_MEDIAFLDRSETTINGS   "Impostazioni cartella multimedia"
+IDSTR_MENUABOUT          "Informazioni cartella multimedia"
+IDSTR_MEDIAFLDHELP       "~Media-Folder Help"
+IDSTR_M3ULISTHELP        "~M3U List Help" 
+IDSTR_MENUCOMPACT        "~Compatta"
+IDSTR_STATUSCOLLECTING   "Lettura tracce audio in corso"
+IDSTR_MENUSKRIPTS        "Script e strumenti"
+IDSTR_STATUSTIME1        "%d:%02d minuti"
+IDSTR_STATUSTIME2        "%d ore %d:%02d minuti"
+IDSTR_STATUSTIME3        "%d giorno(i) %d ore %d:%02d minuti"
+IDSTR_STATUSTIME4        "%d File audio   -   %d%s%03d%s%03d Byte   -   %s"
+IDSTR_STATUSTIME5        "%d File audio   -   pi di 4 GByte"
+
+IDSTR_TITLEMEDIAFOLDER   "Media player"
+IDSTR_TITLECDFOLDER      "CD player"
+
+IDSTR_STARTINGTRACK      "Avvio traccia..."
+IDSTR_TITLEM3UFOLDER    "Editor M3U"
+IDSTR_M3UCLOSETEXT      "Playlist modificata. Salvare i cambiamenti?"
+IDSTR_MENUFILE           "~File"
+IDSTR_PLAYLISTVIEWTITLE  "Editor playlist"
+IDSTR_LAUNCHPADFLYOVER   "Pannello di avvio: trascinarvi sopra gli oggetti desiderati"
+IDSTR_VIEWPAGENAME       "~Visualizzazione"
+IDSTR_VIEWCOMPACT        "Compatta"
+IDSTR_CDFOLDERNAME       "CD-Audio player^Drive %c:"
+
+END
+
+rcinclude "mediafolder_it.dlg"
+
+#ifdef ECS
+rcinclude "about_ecs_it.dlg"
+#else
+rcinclude "about_it.dlg"
+#endif
+
+
Index: /tags/CWMM-0.3.0_GA/mediafolder/res/makefile
===================================================================
--- /tags/CWMM-0.3.0_GA/mediafolder/res/makefile	(revision 213)
+++ /tags/CWMM-0.3.0_GA/mediafolder/res/makefile	(revision 213)
@@ -0,0 +1,66 @@
+# Makefile for Audio-CD-Creator Data-CD-Creator
+
+include ../../make.inc
+include ../../build.inc
+
+CC           = icc
+CPPFLAGS     = /Ge- /Gm+ /G4 /Gl- /Ga- /O+ /Oc+ /Ol- /Q+ $(VACDEBUG)
+INC	=	..\\include
+INC2	=	../include
+DEFS         =
+PROGS        =
+
+OBJDIR	=	./obj
+
+HELPSOURCE	=	$(RESDIR2)/ipf
+
+OBJECTS	=
+
+all:		$(OBJDIR)/version.h \
+		mediafolder.res \
+		nlv
+
+nlv:		$(OBJDIR)/version.h
+		@echo "Creating laguage files"
+		@for %i in ($(LANGUAGES)) do (echo Creating mfldr_%i.dll && make LANGUAGE=%i $(OBJDIR)/mfldr_%i.dll)
+
+
+$(OBJDIR)/version.h:	../../build.inc
+		
+		@echo #define MFLDR_VERSION "$(VERSION_STRING)" > $(OBJDIR)/version.h
+		@echo #define MFLDR_AUTHOR $(AUTHOR_STRING) >> $(OBJDIR)/version.h
+		@echo #define BUILD_STRING "$(BUILD_STRING)" > $(OBJDIR)/build.h
+		
+#### Resource DLL ####
+$(OBJDIR)/mfldr_$(LANGUAGE).dll:	./$(LANGUAGE)/mediafolder_$(LANGUAGE).c \
+						$(OBJDIR)/mediafolder_$(LANGUAGE).res
+		@./$(LANGUAGE)/create_res_$(LANGUAGE)_def.CMD $(OBJDIR)/mediafolder_$(LANGUAGE).def
+		icc $(CPPFLAGS) -I$(INC)  -c  /Fo$(OBJDIR)/mediafolder_$(LANGUAGE).obj $<
+		icc $(CPPFLAGS) -I$(INC) /Fe$@  $(OBJDIR)/mediafolder_$(LANGUAGE).obj ./obj/mediafolder_$(LANGUAGE).def
+		cd $(OBJDIR) && rc  mediafolder_$(LANGUAGE).res mfldr_$(LANGUAGE).dll
+	
+$(OBJDIR)/mediafolder_$(LANGUAGE).res:	./$(LANGUAGE)/mediafolder_$(LANGUAGE).rc \
+						./$(LANGUAGE)/mediafolder_$(LANGUAGE).dlg \
+						$(INC)\mediafolderres.h \
+						../../build.inc
+		cd ./$(LANGUAGE) && rc -D $(ECS) -i ../$(INC2) -i ../$(OBJDIR) -r mediafolder_$(LANGUAGE).rc
+		cp ./$(LANGUAGE)/mediafolder_$(LANGUAGE).res ./obj/
+		-rm ./$(LANGUAGE)/mediafolder_$(LANGUAGE).res
+
+
+mediafolder.res:		mediafolder.rc $(INC)\mediafolderres.h
+		rc -D $(ECS) -i $(INC) -i $(OBJDIR) -r mediafolder.rc
+
+clean:
+	-cd $(OBJDIR) && rm *
+	-rm *.RES
+
+cleaner:
+	-cd de && make cleaner
+	-cd en && make cleaner
+	-rm *.flc
+	-rm *.*~
+
+distribution:
+
+	
Index: /tags/CWMM-0.3.0_GA/mediafolder/res/mediafolder.rc
===================================================================
--- /tags/CWMM-0.3.0_GA/mediafolder/res/mediafolder.rc	(revision 213)
+++ /tags/CWMM-0.3.0_GA/mediafolder/res/mediafolder.rc	(revision 213)
@@ -0,0 +1,56 @@
+#define  INCL_GRAPHICBUTTON   /* need this for the graphic buttons control */
+#define  INCL_BITMAP
+
+#ifndef OS2_INCLUDED
+   #include <os2.h>
+#endif
+#include <sw.h>
+
+#include "mediafolderres.h"
+#include "version.h"
+#include "build.h"
+
+#ifdef ECS
+ICON IDICON_FOLDER1  "icons_ecs/mediafolder1.ico"
+ICON IDICON_FOLDER2  "icons_ecs/mediafolder2.ico"
+ICON IDICON_CDFOLDER "icons_ecs/warpcd.ico"
+ICON IDICON_M3UFILE  "icons_ecs/m3u.ico"
+#else
+ICON IDICON_FOLDER1  "icons/mediafolder1.ico"
+ICON IDICON_FOLDER2  "icons/mediafolder2.ico"
+ICON IDICON_CDFOLDER "icons/warpcd.ico"
+ICON IDICON_M3UFILE  "icons/m3u.ico"
+#endif
+
+BITMAP IDBMP_SKIPBACK         "bmp/Wrwd2.bmp"   
+BITMAP IDBMP_SKIPBACKSEL      "bmp/Brwd2.bmp"   
+
+BITMAP IDBMP_PLAY             "bmp/WSTART2.bmp"
+BITMAP IDBMP_PLAYSEL          "bmp/BSTART2.bmp"
+
+BITMAP IDBMP_PAUSE            "bmp/wPause2.bmp"
+BITMAP IDBMP_PAUSESEL         "bmp/BPause2.bmp"
+
+BITMAP IDBMP_STOP             "bmp/Wstop2.bmp"
+BITMAP IDBMP_STOPSEL          "bmp/Bstop2.bmp"
+
+BITMAP IDBMP_SKIPFORWARD      "bmp/WFWD2.bmp"
+BITMAP IDBMP_SKIPFORWARDSEL   "bmp/BFWD2.bmp"
+
+BITMAP IDBMP_POSSLIDERARM     "bmp/PosArm.bmp"
+
+BITMAP IDBMP_TOPMIDDLE        "bmp/Title3.bmp"
+BITMAP IDBMP_TOPLEFT          "bmp/Tile.bmp"
+BITMAP IDBMP_TOPRIGHT         "bmp/Tile.bmp"
+BITMAP IDBMP_BOTTOM           "bmp/bottom.bmp"
+
+BITMAP IDBMP_VOLSLIDERARM    "bmp/WVOL.bmp"
+BITMAP IDBMP_VOLSLIDERARMSEL "bmp/BVOL.bmp"
+
+BITMAP IDBMP_CHECK            "bmp/checked.bmp"
+BITMAP IDBMP_UNCHECK          "bmp/UNCHECKed.bmp"
+BITMAP IDBMP_CHECKSEL            "bmp/checkedsel.bmp"
+BITMAP IDBMP_UNCHECKSEL          "bmp/UNCHECKedsel.bmp"
+
+POINTER IDPTR_ARROWWE        "pointer/arrowwe.ptr"
+
Index: /tags/CWMM-0.3.0_GA/mediafolder/res/nl/about_ecs_nl.dlg
===================================================================
--- /tags/CWMM-0.3.0_GA/mediafolder/res/nl/about_ecs_nl.dlg	(revision 213)
+++ /tags/CWMM-0.3.0_GA/mediafolder/res/nl/about_ecs_nl.dlg	(revision 213)
@@ -0,0 +1,25 @@
+#define VER_STRING "Media-Ordner V" \
+MFLDR_VERSION \
+BUILD_STRING
+
+ICON IDICON_FOLDER1  "../icons_ecs/mediafolder1.ico"
+
+DLGTEMPLATE IDDLG_ABOUT LOADONCALL MOVEABLE DISCARDABLE
+BEGIN
+    DIALOG  "Produkt Information", IDDLG_ABOUT, 100, 120, 194, 67,
+            WS_VISIBLE, FCF_TITLEBAR
+    BEGIN
+        ICON            IDICON_FOLDER1, IDICON_FOLDER1, 10, 39, 16, 15, WS_GROUP
+        LTEXT           "Multimedia integration for the desktop",
+                        IDST_PRODNAME, 38, 50, 154, 10, DT_WORDBREAK | NOT
+                        WS_GROUP
+                        //PRESPARAMS PP_FONTNAMESIZE, "9.WarpSans Bold"
+        CONTROL         "", 607, 38, 43, 154, 7, "CW_SEPARATOR", WS_VISIBLE
+        LTEXT           MFLDR_AUTHOR, IDST_PRODCOPY, 10,
+                        25, 184, 11, DT_VCENTER | DT_WORDBREAK | NOT
+                        WS_GROUP
+                        //PRESPARAMS PP_FONTNAMESIZE, "9.WarpSans"
+        DEFPUSHBUTTON   "~Ok", IDSTR_CLOSETEXT, 10, 2, 34, 13
+    END
+END
+
Index: /tags/CWMM-0.3.0_GA/mediafolder/res/nl/about_nl.dlg
===================================================================
--- /tags/CWMM-0.3.0_GA/mediafolder/res/nl/about_nl.dlg	(revision 213)
+++ /tags/CWMM-0.3.0_GA/mediafolder/res/nl/about_nl.dlg	(revision 213)
@@ -0,0 +1,25 @@
+#define VER_STRING "Media-Ordner V" \
+MFLDR_VERSION \
+BUILD_STRING
+
+DLGTEMPLATE IDDLG_ABOUT LOADONCALL MOVEABLE DISCARDABLE
+BEGIN
+    DIALOG  "Produkt informatie", IDDLG_ABOUT, 115, 69, 208, 132,
+            WS_VISIBLE, FCF_TITLEBAR
+    BEGIN
+        GROUPBOX        "", IDGB_ABOUT, 3, 21, 200, 108
+        CTEXT           VER_STRING, IDST_PRODNAME, 10, 107, 187,
+                        12, DT_VCENTER | NOT WS_GROUP
+        CTEXT           MFLDR_AUTHOR, IDST_PRODCOPY, 10, 87,
+                        186, 12, DT_VCENTER | NOT WS_GROUP
+        CTEXT           "Copyright (c) netlabs.org 2020",
+                        IDST_PRODCOPY2, 10, 64, 186, 12, DT_VCENTER | NOT WS_GROUP                        
+        CTEXT           "Graphics door Klaus Staedtler-Przyborski",
+                        IDST_PRODGRAPHICS, 10, 64, 186, 17, DT_WORDBREAK |
+                        NOT WS_GROUP
+        CTEXT           "https://trac.netlabs.org/cwmmclasses", IDST_URL1,
+                        10, 30, 186, 18, DT_WORDBREAK | NOT WS_GROUP
+                        PRESPARAMS PP_FONTNAMESIZE, "8.Helv"
+        DEFPUSHBUTTON   "~Ok", DID_OK, 83, 3, 40, 14
+    END
+END
Index: /tags/CWMM-0.3.0_GA/mediafolder/res/nl/create_res_nl_def.CMD
===================================================================
--- /tags/CWMM-0.3.0_GA/mediafolder/res/nl/create_res_nl_def.CMD	(revision 213)
+++ /tags/CWMM-0.3.0_GA/mediafolder/res/nl/create_res_nl_def.CMD	(revision 213)
@@ -0,0 +1,66 @@
+/* */
+call RxFuncAdd 'SysLoadFuncs', 'RexxUtil', 'SysLoadFuncs'
+call SysLoadFuncs
+
+deffile=ARG(1)
+if ARG(1)="" then deffile="tst.def"
+
+SAY ""
+SAY "Creating DEF file "deffile
+SAY ""
+
+theVersion=VALUE("MMCLSVERSION", ,"OS2ENVIRONMENT")
+if theVersion="" THEN theVersion=0.0.0
+
+def="; mediafolder_nl.def: DEF-file for Dutch resource DLL"||'0d'x||'0a'x
+def=def||";"||'0d'x||'0a'x
+
+def=def||";The following license applies ONLY TO THIS resource DLL. Be aware"||'0d'x||'0a'x
+def=def||";that the whole Media-folder package may be covered by another license."||'0d'x||'0a'x
+def=def||";"||'0d'x||'0a'x
+def=def||";/*"||'0d'x||'0a'x
+def=def||"; * Copyright (c) Chris Wohlgemuth 2002-2005 Netlabs 2023-"||WORD(DATE(), 3)  ||'0d'x||'0a'x
+def=def||"; * All rights reserved."||'0d'x||'0a'x
+def=def||"; *"||'0d'x||'0a'x
+def=def||"; * http://www.geocities.com/SiliconValley/Sector/5785/"||'0d'x||'0a'x
+def=def||"; * http://www.os2world.com/cdwriting"||'0d'x||'0a'x
+def=def||"; *"||'0d'x||'0a'x
+def=def||"; * Redistribution and use in source and binary forms, with or without"||'0d'x||'0a'x
+def=def||"; * modification, are permitted provided that the following conditions"||'0d'x||'0a'x
+def=def||"; * are met:"||'0d'x||'0a'x
+def=def||"; * 1. Redistributions of source code must retain the above copyright"||'0d'x||'0a'x
+def=def||"; *    notice, this list of conditions and the following disclaimer."||'0d'x||'0a'x
+def=def||"; * 2. Redistributions in binary form must reproduce the above copyright"||'0d'x||'0a'x
+def=def||"; *    notice, this list of conditions and the following disclaimer in the"||'0d'x||'0a'x
+def=def||"; *    documentation and/or other materials provided with the distribution."||'0d'x||'0a'x
+def=def||"; * 3. The authors name may not be used to endorse or promote products"||'0d'x||'0a'x
+def=def||"; *    derived from this software without specific prior written permission."||'0d'x||'0a'x
+def=def||"; *"||'0d'x||'0a'x
+def=def||"; * THIS SOFTWARE IS PROVIDED ``AS IS'' AND"||'0d'x||'0a'x
+def=def||"; * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE"||'0d'x||'0a'x
+def=def||"; * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE"||'0d'x||'0a'x
+def=def||"; * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE"||'0d'x||'0a'x
+def=def||"; * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL"||'0d'x||'0a'x
+def=def||"; * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS"||'0d'x||'0a'x
+def=def||"; * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)"||'0d'x||'0a'x
+def=def||"; * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT"||'0d'x||'0a'x
+def=def||"; * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY"||'0d'x||'0a'x
+def=def||"; * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF"||'0d'x||'0a'x
+def=def||"; * SUCH DAMAGE."||'0d'x||'0a'x
+def=def||"; *"||'0d'x||'0a'x
+def=def||"; */"||'0d'x||'0a'x
+
+def=def||'0d'x||'0a'x
+
+def=def||"LIBRARY MFLDR_NL INITINSTANCE TERMINSTANCE"||'0d'x||'0a'x
+def=def||"DESCRIPTION '$@# Netlabs CWMM Team"
+def=def||":"||theVersion||" #@##1## "||DATE("E")||" "||TIME("N")||"       Zobopeep ::::"||WORD(TRANSLATE(theVersion," ", "."),3)||"::@@Media-Folder NL res DLL (C) C. Wohlgemuth 2001-2005 Netlabs CWMM Team 2023-"||WORD(DATE(),3)||"'"||'0d'x||'0a'x
+def=def||"DATA MULTIPLE NONSHARED"||'0d'x||'0a'x
+def=def||"EXPORTS  "||'0d'x||'0a'x
+def=def||"        queryLanguage"||'0d'x||'0a'x
+
+'@type NUL > 'deffile
+call lineout deffile,def
+call stream deffile, "C", "close"
+exit
+
Index: /tags/CWMM-0.3.0_GA/mediafolder/res/nl/makefile
===================================================================
--- /tags/CWMM-0.3.0_GA/mediafolder/res/nl/makefile	(revision 213)
+++ /tags/CWMM-0.3.0_GA/mediafolder/res/nl/makefile	(revision 213)
@@ -0,0 +1,17 @@
+
+include ../../../make.inc
+include ../../../build.inc
+
+all:
+	cd ./.. && make
+
+clean:
+	
+cleaner:
+	-rm *.flc
+	-rm *.*~
+
+distribution:
+
+	
+
Index: /tags/CWMM-0.3.0_GA/mediafolder/res/nl/mediafolder_nl.c
===================================================================
--- /tags/CWMM-0.3.0_GA/mediafolder/res/nl/mediafolder_nl.c	(revision 213)
+++ /tags/CWMM-0.3.0_GA/mediafolder/res/nl/mediafolder_nl.c	(revision 213)
@@ -0,0 +1,26 @@
+/*
+ * This file is (C) Chris Wohlgemuth 1999
+ */
+/*
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; see the file COPYING.  If not, write to
+ * the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+
+#include <os2.h>
+
+PSZ queryLanguage()
+{
+  return "Nederlands";
+}
+
Index: /tags/CWMM-0.3.0_GA/mediafolder/res/nl/mediafolder_nl.dlg
===================================================================
--- /tags/CWMM-0.3.0_GA/mediafolder/res/nl/mediafolder_nl.dlg	(revision 213)
+++ /tags/CWMM-0.3.0_GA/mediafolder/res/nl/mediafolder_nl.dlg	(revision 213)
@@ -0,0 +1,102 @@
+#ifndef OS2_INCLUDED
+   #include <os2.h>
+#endif
+DLGINCLUDE 1 "
+G:\Projects_working\mmclasses-0.3.0\source\include\mediafolderres.h"
+
+DLGTEMPLATE IDDLG_BOTTOMFRAME LOADONCALL MOVEABLE DISCARDABLE
+BEGIN
+    DIALOG  "", IDDLG_BOTTOMFRAME, 12, 70, 300, 16, NOT FS_DLGBORDER | NOT 
+            WS_SAVEBITS
+    BEGIN
+        CTEXT           "", IDST_STATUSTEXT, 39, 1, 221, 8
+    END
+END
+
+DLGTEMPLATE IDDLG_FRAMERIGHT LOADONCALL MOVEABLE DISCARDABLE
+BEGIN
+    DIALOG  "", IDDLG_FRAMERIGHT, 134, 21, 24, 109, NOT FS_DLGBORDER | NOT 
+            WS_SAVEBITS
+    BEGIN
+    END
+END
+
+DLGTEMPLATE IDDLG_LEFTFRAME LOADONCALL MOVEABLE DISCARDABLE
+BEGIN
+    DIALOG  "", IDDLG_LEFTFRAME, 12, 6, 148, 148, NOT FS_DLGBORDER | NOT 
+            WS_SAVEBITS
+    BEGIN
+        CONTAINER       IDCNR_PLAYLIST, 14, 11, 123, 111, CCS_SINGLESEL | 
+                        CCS_AUTOPOSITION | CCS_MINIRECORDCORE | WS_GROUP
+        PUSHBUTTON      "Toevoegen", IDPB_ADD, 8, 129, 40, 14
+        PUSHBUTTON      "Verwijderen", IDPB_REMOVE, 72, 129, 40, 14
+    END
+END
+
+DLGTEMPLATE IDDLG_TOOLBARSETTINGS LOADONCALL MOVEABLE DISCARDABLE
+BEGIN
+    DIALOG  "", IDDLG_TOOLBARSETTINGS, 91, 22, 201, 199, NOT FS_DLGBORDER | 
+            WS_VISIBLE
+    BEGIN
+        GROUPBOX        "Gereedschapsbalk", IDGB_TOOLBAR, 9, 24, 181, 127, NOT 
+                        WS_GROUP
+        AUTOCHECKBOX    "Activ~eer hulpballonnen", IDCB_ENABLETBFLYOVER, 16, 
+                        129, 152, 10
+        SPINBUTTON      IDSB_TBFLYOVERDELAY, 97, 115, 40, 12, 
+                        SPBS_NUMERICONLY | SPBS_MASTER | SPBS_FASTSPIN | 
+                        WS_GROUP
+        GROUPBOX        "Hulpballonnen kleuren en lettertype", IDGB_COLORANDFONT, 15, 
+                        30, 168, 76, NOT WS_GROUP
+        LTEXT           "Druk op knop voor kleur- of lettertype-palet.           "
+                        "              
+Houd <CTRL> ingedrukt tijdens het slepen om de tekst kleur aan te passen.", 
+                        IDST_TEXTDEMOFIELD, 23, 35, 95, 57, DT_WORDBREAK
+                        PRESPARAMS PP_FOREGROUNDCOLOR, 0x000000FFL
+                        PRESPARAMS PP_BACKGROUNDCOLOR, 0x00FFFFFFL
+        PUSHBUTTON      "~Kleur...", IDPB_COLORPALETTE, 129, 72, 45, 14
+        PUSHBUTTON      "~Lettertype...", IDPB_FONTPALETTE, 129, 49, 45, 14
+        PUSHBUTTON      "~Startwaarde", IDPB_COLORUNDO, 16, 7, 52, 14
+        PUSHBUTTON      "S~tandaard", IDPB_COLORSTANDARD, 74, 7, 52, 14
+        PUSHBUTTON      "~Hulp", IDPB_COLORHELP, 132, 7, 52, 14, BS_HELP
+        RTEXT           "Vertraging (ms):", IDGB_COLORANDFONT, 35, 116, 55, 8, 
+                        DT_VCENTER
+    END
+END
+
+DLGTEMPLATE IDDLG_TOPFRAME LOADONCALL MOVEABLE DISCARDABLE
+BEGIN
+    DIALOG  "", IDDLG_TOPFRAME, 13, 52, 287, 26, NOT FS_DLGBORDER | 
+            FS_BORDER | NOT WS_SAVEBITS
+    BEGIN
+        PUSHBUTTON      "Druk", IDPB_PAUSE, 2, 6, 19, 14, NOT WS_VISIBLE
+    END
+END
+
+DLGTEMPLATE IDDLG_TOPMIDDLE LOADONCALL MOVEABLE DISCARDABLE
+BEGIN
+    DIALOG  "", IDDLG_TOPMIDDLE, 12, 51, 249, 39, NOT FS_DLGBORDER | 
+            FS_BORDER | WS_VISIBLE | NOT WS_SAVEBITS
+    BEGIN
+        CONTROL         "~Terug", IDPB_SKIPBACK, 19, 25, 20, 14, WC_BUTTON, 
+                        BS_USERBUTTON | BS_NOPOINTERFOCUS | WS_TABSTOP | 
+                        WS_VISIBLE
+        CONTROL         "~Stoppen", IDPB_STOP, 40, 25, 22, 14, WC_BUTTON, 
+                        BS_USERBUTTON | BS_NOPOINTERFOCUS | WS_VISIBLE
+        CONTROL         "~Pauze", IDPB_PAUSE, 61, 25, 20, 14, WC_BUTTON, 
+                        BS_USERBUTTON | BS_NOPOINTERFOCUS | WS_VISIBLE 
+        CONTROL         "Afspe~len", IDPB_PLAY, 79, 25, 20, 14, WC_BUTTON, 
+                        BS_USERBUTTON | BS_NOPOINTERFOCUS | WS_VISIBLE
+        CONTROL         "Volge~nde", IDPB_SKIPFORWARD, 99, 25, 20, 14, WC_BUTTON, 
+                        BS_USERBUTTON | BS_NOPOINTERFOCUS | WS_VISIBLE
+        AUTOCHECKBOX    "He~rhalen", IDCB_REPEAT, 133, 13, 73, 10,WS_VISIBLE|BS_USERBUTTON | BS_AUTOCHECKBOX
+        AUTOCHECKBOX    "~Willekeurig", IDCB_RANDOM, 133, 23, 73, 10, WS_VISIBLE  | BS_USERBUTTON | BS_AUTOCHECKBOX
+
+        CTEXT           "0:00", IDST_PLAYTIME, 133, 24, 102, 10, DT_VCENTER
+                        PRESPARAMS PP_FONTNAMESIZE, "10.Helv"
+        CONTROL         "VolumeArm", IDSL_VOLUMEARM, 209, 5, 14, 14, 
+                        WC_BUTTON, BS_USERBUTTON | WS_TABSTOP|BS_USERBUTTON
+        PUSHBUTTON      "Volume", IDSL_VOLUME, 19, 4, 69, 14, 
+                        BS_NOPOINTERFOCUS | NOT WS_TABSTOP | NOT WS_VISIBLE |BS_USERBUTTON
+    END
+END
+
Index: /tags/CWMM-0.3.0_GA/mediafolder/res/nl/mediafolder_nl.rc
===================================================================
--- /tags/CWMM-0.3.0_GA/mediafolder/res/nl/mediafolder_nl.rc	(revision 213)
+++ /tags/CWMM-0.3.0_GA/mediafolder/res/nl/mediafolder_nl.rc	(revision 213)
@@ -0,0 +1,98 @@
+#define  INCL_GRAPHICBUTTON   /* need this for the graphic buttons control */
+#define  INCL_BITMAP
+
+#ifndef OS2_INCLUDED
+   #include <os2.h>
+#endif
+#include <sw.h>
+
+#include "mediafolderres.h"
+#include "version.h"
+#include "build.h"
+
+#ifdef ECS
+MENU ID_MENUABOUT
+BEGIN
+   MENUITEM  "" , ID_MENUSEPARATOR, MIS_SEPARATOR
+   MENUITEM "~Product Information",ID_ABOUTITEM   
+END
+#else
+MENU ID_MENUABOUT
+BEGIN
+   MENUITEM  "" , ID_MENUSEPARATOR, MIS_SEPARATOR
+   MENUITEM "~Media map Informatie",ID_ABOUTITEM   
+END
+#endif
+
+MENU ID_MBMENUSKRIPTS
+BEGIN
+
+END
+
+MENU ID_MENUVIEWCOMPACT
+BEGIN
+   MENUITEM  "~Compact" , ID_MENUVIEWCOMPACT
+END
+
+MENU  ID_MENUTIMECONTEXT
+BEGIN
+	MENUITEM "V~erstreken tijd"   ,          ID_MENUITEMELAPSED
+	MENUITEM "~Resterende tijd" ,          ID_MENUITEMREMAINING
+	MENUITEM "~Spoor informatie" ,         ID_MENUITEMID3
+END
+
+MENU  ID_MENUFILE
+BEGIN
+	MENUITEM "Ops~laan"   ,          	ID_MENUITEMSAVE
+	MENUITEM ""           ,                 ID_MENUSEPARATOR, MIS_SEPARATOR               
+	MENUITEM "Afsluit~en" ,          	ID_MENUITEMEXIT
+END
+
+
+STRINGTABLE
+BEGIN
+IDSTR_CLOSETITLE "Bevestiging"
+IDSTR_CLOSETEXT  "Er speelt momenteel een lied. Wilt u echt stoppen met afspelen en de speler afsluiten?"
+IDSTRSETTING_TOOLBAR "Gereedschapsbalk"
+IDSTRS_NOFONTPALETTE          "Kan het lettertype palet niet openen. Het kan zijn ID kwijt zijn. Controleer uw INI bestanden."
+IDSTRS_NOCOLORPALETTE         "Kan het kleuren palet niet openen. Het kan zijn ID kwijt zijn. Controleer uw INI bestanden."
+IDSTRS_MEDIAFLDRSETTINGS   "Media-map instellingen"
+#ifdef ECS
+IDSTR_MENUABOUT          "Produktinformation"
+#else
+IDSTR_MENUABOUT          "Media-map informatie"
+#endif
+IDSTR_MEDIAFLDHELP       "~Media-Folder Help"
+IDSTR_M3ULISTHELP        "~M3U List Help" 
+IDSTR_MENUCOMPACT        "~Compact"
+IDSTR_STATUSCOLLECTING   "Verzamelen geluidssporen..."
+IDSTR_MENUSKRIPTS        "Scripts en gereedschappen"
+IDSTR_STATUSTIME1        "%d:%02d min"
+IDSTR_STATUSTIME2        "%d u %d:%02d min"
+IDSTR_STATUSTIME3        "%d dag(en) %d u %d:%02d min"
+IDSTR_STATUSTIME4        "%d Geluidsbestanden   -   %d%s%03d%s%03d Bytes   -   %s"
+IDSTR_STATUSTIME5        "%d Geluidsbestanden   -   meer dan 4 GBytes"
+
+IDSTR_TITLEMEDIAFOLDER   "Media speler"
+IDSTR_TITLECDFOLDER      "Cd speler"
+
+IDSTR_STARTINGTRACK      "Starten spoor..."
+IDSTR_TITLEM3UFOLDER    "M3U editor"
+IDSTR_M3UCLOSETEXT      "Afspeellijst gewijzigd. Hem nu opslaan?"
+IDSTR_MENUFILE           "~Bestand"
+IDSTR_PLAYLISTVIEWTITLE  "Afspeellijst Editor"
+IDSTR_LAUNCHPADFLYOVER   "Hoofdvenster: Laat objecten hierop vallen"
+IDSTR_VIEWPAGENAME       "O~verzicht"
+IDSTR_VIEWCOMPACT        "Compact"
+IDSTR_CDFOLDERNAME       "CD-Audio player^Drive %c:"
+
+END
+
+rcinclude "mediafolder_nl.dlg"
+
+#ifdef ECS
+rcinclude "about_ecs_nl.dlg"
+#else
+rcinclude "about_nl.dlg"
+#endif
+
Index: /tags/CWMM-0.3.0_GA/mediafolder/res/ru/about_ecs_ru.dlg
===================================================================
--- /tags/CWMM-0.3.0_GA/mediafolder/res/ru/about_ecs_ru.dlg	(revision 213)
+++ /tags/CWMM-0.3.0_GA/mediafolder/res/ru/about_ecs_ru.dlg	(revision 213)
@@ -0,0 +1,25 @@
+#define VER_STRING "Media Folder V" \
+MFLDR_VERSION \
+BUILD_STRING
+
+ICON IDICON_FOLDER1  "../icons_ecs/mediafolder1.ico"
+
+DLGTEMPLATE IDDLG_ABOUT LOADONCALL MOVEABLE DISCARDABLE
+BEGIN
+    DIALOG  "­ä®à¬ æšï ® ¯à®€ãªâ¥", IDDLG_ABOUT, 100, 120, 194, 67,
+            WS_VISIBLE, FCF_TITLEBAR
+    BEGIN
+        ICON            IDICON_FOLDER1, IDICON_FOLDER1, 10, 39, 16, 15, WS_GROUP
+        LTEXT           "Multimedia integration for the desktop",
+                        IDST_PRODNAME, 38, 50, 154, 10, DT_WORDBREAK | NOT
+                        WS_GROUP
+                        //PRESPARAMS PP_FONTNAMESIZE, "9.WarpSans Bold"
+        CONTROL         "", 607, 38, 43, 154, 7, "CW_SEPARATOR", WS_VISIBLE
+        LTEXT           MFLDR_AUTHOR, IDST_PRODCOPY, 10,
+                        25, 184, 11, DT_VCENTER | DT_WORDBREAK | NOT
+                        WS_GROUP
+                        //PRESPARAMS PP_FONTNAMESIZE, "9.WarpSans"
+        DEFPUSHBUTTON   "~ª", IDSTR_CLOSETEXT, 10, 2, 34, 13
+    END
+END
+
Index: /tags/CWMM-0.3.0_GA/mediafolder/res/ru/about_ru.dlg
===================================================================
--- /tags/CWMM-0.3.0_GA/mediafolder/res/ru/about_ru.dlg	(revision 213)
+++ /tags/CWMM-0.3.0_GA/mediafolder/res/ru/about_ru.dlg	(revision 213)
@@ -0,0 +1,25 @@
+#define VER_STRING "Media Folder v" \
+MFLDR_VERSION \
+BUILD_STRING
+
+DLGTEMPLATE IDDLG_ABOUT LOADONCALL MOVEABLE DISCARDABLE
+BEGIN
+    DIALOG  "­ä®à¬ æšï ® ¯à®€ãªâ¥", IDDLG_ABOUT, 115, 69, 208, 132, 
+            WS_VISIBLE, FCF_TITLEBAR
+    BEGIN
+        GROUPBOX        "", IDGB_ABOUT, 3, 21, 200, 108
+        CTEXT           VER_STRING, IDST_PRODNAME, 10, 107, 187, 
+                        12, DT_VCENTER | NOT WS_GROUP
+        CTEXT           MFLDR_AUTHOR,
+                        IDST_PRODCOPY, 10, 87, 186, 12, DT_VCENTER | NOT WS_GROUP
+        CTEXT           "Copyright (c) netlabs.org 2020",
+                        IDST_PRODCOPY2, 10, 64, 186, 12, DT_VCENTER | NOT WS_GROUP
+        CTEXT           "à äšª  Klaus Staedtler-Przyborski", 
+                        IDST_PRODGRAPHICS, 10, 46, 186, 17, DT_WORDBREAK | 
+                        NOT WS_GROUP
+        CTEXT           "https://trac.netlabs.org/cwmmclasses", IDST_URL1,
+                        10, 30, 186, 18, DT_WORDBREAK | NOT WS_GROUP
+                        PRESPARAMS PP_FONTNAMESIZE, "8.Helv"
+        DEFPUSHBUTTON   "~ª", DID_OK, 83, 3, 40, 14
+    END
+END
Index: /tags/CWMM-0.3.0_GA/mediafolder/res/ru/create_res_ru_def.CMD
===================================================================
--- /tags/CWMM-0.3.0_GA/mediafolder/res/ru/create_res_ru_def.CMD	(revision 213)
+++ /tags/CWMM-0.3.0_GA/mediafolder/res/ru/create_res_ru_def.CMD	(revision 213)
@@ -0,0 +1,66 @@
+/* */
+call RxFuncAdd 'SysLoadFuncs', 'RexxUtil', 'SysLoadFuncs'
+call SysLoadFuncs
+
+deffile=ARG(1)
+if ARG(1)="" then deffile="tst.def"
+
+SAY ""
+SAY "®§€ ­š¥ DEF ä ©«  "deffile
+SAY ""
+
+theVersion=VALUE("MMCLSVERSION", ,"OS2ENVIRONMENT")
+if theVersion="" THEN theVersion=0.0.0
+
+def="; mediafolder_ru.def: DEF-ä ©« €«ï à¥áãàá­®© DLL ­  àãááª®¬"||'0d'x||'0a'x
+def=def||";"||'0d'x||'0a'x
+
+def=def||";The following license applies ONLY TO THIS resource DLL. Be aware"||'0d'x||'0a'x
+def=def||";that the whole Media-folder package may be covered by another license."||'0d'x||'0a'x
+def=def||";"||'0d'x||'0a'x
+def=def||";/*"||'0d'x||'0a'x
+def=def||"; * Copyright (c) Chris Wohlgemuth 2002-2005 Netlabs 2023-"||WORD(DATE(), 3)  ||'0d'x||'0a'x
+def=def||"; * All rights reserved."||'0d'x||'0a'x
+def=def||"; *"||'0d'x||'0a'x
+def=def||"; * http://www.geocities.com/SiliconValley/Sector/5785/"||'0d'x||'0a'x
+def=def||"; * http://www.os2world.com/cdwriting"||'0d'x||'0a'x
+def=def||"; *"||'0d'x||'0a'x
+def=def||"; * Redistribution and use in source and binary forms, with or without"||'0d'x||'0a'x
+def=def||"; * modification, are permitted provided that the following conditions"||'0d'x||'0a'x
+def=def||"; * are met:"||'0d'x||'0a'x
+def=def||"; * 1. Redistributions of source code must retain the above copyright"||'0d'x||'0a'x
+def=def||"; *    notice, this list of conditions and the following disclaimer."||'0d'x||'0a'x
+def=def||"; * 2. Redistributions in binary form must reproduce the above copyright"||'0d'x||'0a'x
+def=def||"; *    notice, this list of conditions and the following disclaimer in the"||'0d'x||'0a'x
+def=def||"; *    documentation and/or other materials provided with the distribution."||'0d'x||'0a'x
+def=def||"; * 3. The authors name may not be used to endorse or promote products"||'0d'x||'0a'x
+def=def||"; *    derived from this software without specific prior written permission."||'0d'x||'0a'x
+def=def||"; *"||'0d'x||'0a'x
+def=def||"; * THIS SOFTWARE IS PROVIDED ``AS IS'' AND"||'0d'x||'0a'x
+def=def||"; * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE"||'0d'x||'0a'x
+def=def||"; * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE"||'0d'x||'0a'x
+def=def||"; * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE"||'0d'x||'0a'x
+def=def||"; * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL"||'0d'x||'0a'x
+def=def||"; * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS"||'0d'x||'0a'x
+def=def||"; * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)"||'0d'x||'0a'x
+def=def||"; * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT"||'0d'x||'0a'x
+def=def||"; * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY"||'0d'x||'0a'x
+def=def||"; * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF"||'0d'x||'0a'x
+def=def||"; * SUCH DAMAGE."||'0d'x||'0a'x
+def=def||"; *"||'0d'x||'0a'x
+def=def||"; */"||'0d'x||'0a'x
+
+def=def||'0d'x||'0a'x
+
+def=def||"LIBRARY MFLDR_RU INITINSTANCE TERMINSTANCE"||'0d'x||'0a'x
+def=def||"DESCRIPTION '$@# Netlabs CWMM Team"
+def=def||":"||theVersion||" #@##1## "||DATE("E")||" "||TIME("N")||"       Zobopeep ::::"||WORD(TRANSLATE(theVersion," ", "."),3)||"::@@Media-Folder RU res DLL (C) C. Wohlgemuth 2001-2005 Netlabs CWMM Team 2023-"||WORD(DATE(),3)||"'"||'0d'x||'0a'x
+def=def||"DATA MULTIPLE NONSHARED"||'0d'x||'0a'x
+def=def||"EXPORTS  "||'0d'x||'0a'x
+def=def||"        queryLanguage"||'0d'x||'0a'x
+
+'@type NUL > 'deffile
+call lineout deffile,def
+call stream deffile, "C", "close"
+exit
+
Index: /tags/CWMM-0.3.0_GA/mediafolder/res/ru/mediafolder_ru.c
===================================================================
--- /tags/CWMM-0.3.0_GA/mediafolder/res/ru/mediafolder_ru.c	(revision 213)
+++ /tags/CWMM-0.3.0_GA/mediafolder/res/ru/mediafolder_ru.c	(revision 213)
@@ -0,0 +1,24 @@
+/*
+ * This file is (C) Chris Wohlgemuth 1999
+ */
+/*
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; see the file COPYING.  If not, write to
+ * the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+#include <os2.h>
+
+PSZ queryLanguage()
+{
+  return "Russian";
+}
Index: /tags/CWMM-0.3.0_GA/mediafolder/res/ru/mediafolder_ru.dlg
===================================================================
--- /tags/CWMM-0.3.0_GA/mediafolder/res/ru/mediafolder_ru.dlg	(revision 213)
+++ /tags/CWMM-0.3.0_GA/mediafolder/res/ru/mediafolder_ru.dlg	(revision 213)
@@ -0,0 +1,101 @@
+#ifndef OS2_INCLUDED
+   #include <os2.h>
+#endif
+DLGINCLUDE 1 "
+G:\Projects_working\mmclasses-0.3.0\source\include\mediafolderres.h"
+
+DLGTEMPLATE IDDLG_BOTTOMFRAME LOADONCALL MOVEABLE DISCARDABLE
+BEGIN
+    DIALOG  "", IDDLG_BOTTOMFRAME, 12, 70, 300, 16, NOT FS_DLGBORDER | NOT 
+            WS_SAVEBITS
+    BEGIN
+        CTEXT           "", IDST_STATUSTEXT, 39, 1, 221, 8
+    END
+END
+
+DLGTEMPLATE IDDLG_FRAMERIGHT LOADONCALL MOVEABLE DISCARDABLE
+BEGIN
+    DIALOG  "", IDDLG_FRAMERIGHT, 134, 21, 24, 109, NOT FS_DLGBORDER | NOT 
+            WS_SAVEBITS
+    BEGIN
+    END
+END
+
+DLGTEMPLATE IDDLG_LEFTFRAME LOADONCALL MOVEABLE DISCARDABLE
+BEGIN
+    DIALOG  "", IDDLG_LEFTFRAME, 12, 6, 148, 148, NOT FS_DLGBORDER | NOT 
+            WS_SAVEBITS
+    BEGIN
+        CONTAINER       IDCNR_PLAYLIST, 14, 11, 123, 111, CCS_SINGLESEL | 
+                        CCS_AUTOPOSITION | CCS_MINIRECORDCORE | WS_GROUP
+        PUSHBUTTON      "®¡ ¢šâì", IDPB_ADD, 8, 129, 40, 14
+        PUSHBUTTON      "¡à âì", IDPB_REMOVE, 72, 129, 40, 14
+    END
+END
+
+DLGTEMPLATE IDDLG_TOOLBARSETTINGS LOADONCALL MOVEABLE DISCARDABLE
+BEGIN
+    DIALOG  "", IDDLG_TOOLBARSETTINGS, 91, 22, 201, 199, NOT FS_DLGBORDER | 
+            WS_VISIBLE
+    BEGIN
+        GROUPBOX        " ­¥«ì š­áâàã¬¥­â®¢", IDGB_TOOLBAR, 9, 24, 181, 127, NOT 
+                        WS_GROUP
+        AUTOCHECKBOX    "~ª«îçšâì ¢á¯«ë¢ îéãî á¯à ¢ªã", IDCB_ENABLETBFLYOVER, 16, 
+                        129, 152, 10
+        SPINBUTTON      IDSB_TBFLYOVERDELAY, 97, 115, 40, 12, 
+                        SPBS_NUMERICONLY | SPBS_MASTER | SPBS_FASTSPIN | 
+                        WS_GROUP
+        GROUPBOX        "á¯«ë¢ îéš¥ æ¢¥â  š èàšäâ", IDGB_COLORANDFONT, 15, 
+                        30, 168, 76, NOT WS_GROUP
+        LTEXT           " Š¬šâ¥ ª­®¯ªã €«ï ¢ë¡®à  æ¢¥â  š«š ¯ «šâàë èàšäâ®¢.           "
+                        "              
+€¥àŠš¢ ©â¥ <Ctrl> ¢® ¢à¥¬ï ¯¥à¥â áªš¢ ­šï, çâ®¡ë š§¬¥­šâì æ¢¥â â¥ªáâ .", 
+                        IDST_TEXTDEMOFIELD, 23, 35, 95, 57, DT_WORDBREAK
+                        PRESPARAMS PP_FOREGROUNDCOLOR, 0x000000FFL
+                        PRESPARAMS PP_BACKGROUNDCOLOR, 0x00FFFFFFL
+        PUSHBUTTON      "~¢¥â...", IDPB_COLORPALETTE, 129, 72, 45, 14
+        PUSHBUTTON      "~àšäâ...", IDPB_FONTPALETTE, 129, 49, 45, 14
+        PUSHBUTTON      "~âª âšâì", IDPB_COLORUNDO, 16, 7, 52, 14
+        PUSHBUTTON      "~® ã¬®«ç ­šî", IDPB_COLORSTANDARD, 74, 7, 52, 14
+        PUSHBUTTON      "~¯à ¢ª ", IDPB_COLORHELP, 132, 7, 52, 14, BS_HELP
+        RTEXT           " €¥àŠª  (¬á):", IDGB_COLORANDFONT, 35, 116, 55, 8, 
+                        DT_VCENTER
+    END
+END
+
+DLGTEMPLATE IDDLG_TOPFRAME LOADONCALL MOVEABLE DISCARDABLE
+BEGIN
+    DIALOG  "", IDDLG_TOPFRAME, 13, 52, 287, 26, NOT FS_DLGBORDER | 
+            FS_BORDER | NOT WS_SAVEBITS
+    BEGIN
+        PUSHBUTTON      " Š âì", IDPB_PAUSE, 2, 6, 19, 14, NOT WS_VISIBLE
+    END
+END
+
+DLGTEMPLATE IDDLG_TOPMIDDLE LOADONCALL MOVEABLE DISCARDABLE
+BEGIN
+    DIALOG  "", IDDLG_TOPMIDDLE, 12, 51, 249, 39, NOT FS_DLGBORDER | 
+            FS_BORDER | WS_VISIBLE | NOT WS_SAVEBITS
+    BEGIN
+        CONTROL         "à~¥€ë€ãéš©", IDPB_SKIPBACK, 19, 25, 20, 14, WC_BUTTON, 
+                        BS_USERBUTTON | BS_NOPOINTERFOCUS | WS_TABSTOP | 
+                        WS_VISIBLE
+        CONTROL         "~â®¯", IDPB_STOP, 40, 25, 22, 14, WC_BUTTON, 
+                        BS_USERBUTTON | BS_NOPOINTERFOCUS | WS_VISIBLE
+        CONTROL         "~ ã§ ", IDPB_PAUSE, 61, 25, 20, 14, WC_BUTTON, 
+                        BS_USERBUTTON | BS_NOPOINTERFOCUS | WS_VISIBLE 
+        CONTROL         "~®á¯à®š§¢¥áâš", IDPB_PLAY, 79, 25, 20, 14, WC_BUTTON, 
+                        BS_USERBUTTON | BS_NOPOINTERFOCUS | WS_VISIBLE
+        CONTROL         "~«¥€ãîéš©", IDPB_SKIPFORWARD, 99, 25, 20, 14, WC_BUTTON, 
+                        BS_USERBUTTON | BS_NOPOINTERFOCUS | WS_VISIBLE
+        AUTOCHECKBOX    "~®¢â®àšâì", IDCB_REPEAT, 133, 13, 73, 10,WS_VISIBLE|BS_USERBUTTON | BS_AUTOCHECKBOX
+        AUTOCHECKBOX    "~à®š§¢®«ì­®", IDCB_RANDOM, 133, 23, 73, 10, WS_VISIBLE  | BS_USERBUTTON | BS_AUTOCHECKBOX
+
+        CTEXT           "0:00", IDST_PLAYTIME, 133, 24, 102, 10, DT_VCENTER
+                        PRESPARAMS PP_FONTNAMESIZE, "10.Helv"
+        CONTROL         "VolumeArm", IDSL_VOLUMEARM, 209, 5, 14, 14, 
+                        WC_BUTTON, BS_USERBUTTON | WS_TABSTOP|BS_USERBUTTON
+        PUSHBUTTON      "à®¬ª®áâì", IDSL_VOLUME, 19, 4, 69, 14, 
+                        BS_NOPOINTERFOCUS | NOT WS_TABSTOP | NOT WS_VISIBLE |BS_USERBUTTON
+    END
+END
Index: /tags/CWMM-0.3.0_GA/mediafolder/res/ru/mediafolder_ru.rc
===================================================================
--- /tags/CWMM-0.3.0_GA/mediafolder/res/ru/mediafolder_ru.rc	(revision 213)
+++ /tags/CWMM-0.3.0_GA/mediafolder/res/ru/mediafolder_ru.rc	(revision 213)
@@ -0,0 +1,99 @@
+#define  INCL_GRAPHICBUTTON   /* need this for the graphic buttons control */
+#define  INCL_BITMAP
+
+#ifndef OS2_INCLUDED
+   #include <os2.h>
+#endif
+#include <sw.h>
+
+#include "mediafolderres.h"
+#include "version.h"
+#include "build.h"
+
+CODEPAGE 866
+
+#ifdef ECS
+MENU ID_MENUABOUT
+BEGIN
+   MENUITEM  "" , ID_MENUSEPARATOR, MIS_SEPARATOR
+   MENUITEM "~­ä®à¬ æšï ® ¯à®€ãªâ¥",ID_ABOUTITEM
+END
+#else
+MENU ID_MENUABOUT
+BEGIN
+   MENUITEM  "" , ID_MENUSEPARATOR, MIS_SEPARATOR
+   MENUITEM "~Media Folder ­ä®",ID_ABOUTITEM
+END
+#endif
+
+MENU ID_MBMENUSKRIPTS
+BEGIN
+
+END
+
+MENU ID_MENUVIEWCOMPACT
+BEGIN
+   MENUITEM  "~®¬¯ ªâ­ë©" , ID_MENUVIEWCOMPACT
+END
+
+MENU  ID_MENUTIMECONTEXT
+BEGIN
+	MENUITEM "~à¥¬ï ¢®á¯à®š§¢¥€¥­šï"   , ID_MENUITEMELAPSED
+	MENUITEM "~áâ ¢è¥¥áï ¢à¥¬ï" ,        ID_MENUITEMREMAINING
+	MENUITEM "~­ä®à¬ æšï ® âà¥ª¥" ,      ID_MENUITEMID3
+END
+
+MENU  ID_MENUFILE
+BEGIN
+	MENUITEM "~®åà ­šâì"   ,          	ID_MENUITEMSAVE
+	MENUITEM ""           ,             ID_MENUSEPARATOR, MIS_SEPARATOR
+	MENUITEM "~ëå®€" ,          		ID_MENUITEMEXIT
+END
+
+
+STRINGTABLE
+BEGIN
+IDSTR_CLOSETITLE         "®€â¢¥àŠ€¥­š¥"
+IDSTR_CLOSETEXT          " ­ áâ®ïé¥¥ ¢à¥¬ï ¢®á¯à®š§¢®€šâáï  ã€š®ä ©«. ë €¥©áâ¢šâ¥«ì­® å®âšâ¥ ®áâ ­®¢šâì ¯à®š£àë¢ ­š¥ š § ªàëâì ¯«¥¥à?"
+IDSTRSETTING_TOOLBAR     " ­¥«ì š­áâàã¬¥­â®¢"
+IDSTRS_NOFONTPALETTE     "¥ ã€ ñâáï ®âªàëâì ¯ «šâàã èàšäâ®¢. ®§¬®Š­®, ¯®â¥àï­ š€¥­âšäšª â®à. à®¢¥àìâ¥ á¢®š ä ©«ë INI."
+IDSTRS_NOCOLORPALETTE    "¥ ã€ ñâáï ®âªàëâì æ¢¥â®¢ãî ¯ «šâàã. ®§¬®Š­®, ¯®â¥àï­ š€¥­âšäšª â®à. à®¢¥àìâ¥ á¢®š ä ©«ë INI."
+IDSTRS_MEDIAFLDRSETTINGS " áâà®©ª  Media-Folder"
+#ifdef ECS
+IDSTR_MENUABOUT          "­ä®à¬ æšï ® ¯à®€ãªâ¥"
+#else
+IDSTR_MENUABOUT          "Media-Folder ­ä®"
+#endif
+IDSTR_MEDIAFLDHELP       "~Media-Folder Help"
+IDSTR_M3ULISTHELP        "~M3U List Help" 
+IDSTR_MENUCOMPACT        "~®¬¯ ªâ­ë©"
+IDSTR_STATUSCOLLECTING   "¡®à §¢ãª®¢ëå €®à®Š¥ª..."
+IDSTR_MENUSKRIPTS        "æ¥­ àšš š š­áâàã¬¥­âë"
+IDSTR_STATUSTIME1        "%d:%02d ¬š­"
+IDSTR_STATUSTIME2        "%d ç %d:%02d ¬š­"
+IDSTR_STATUSTIME3        "%d €­¥© %d ç %d:%02d ¬š­"
+IDSTR_STATUSTIME4        "%d  ã€š®ä ©«®¢   -   %d%s%03d%s%03d ¡ ©â   -   %s"
+IDSTR_STATUSTIME5        "%d  ã€š®ä ©«®¢   -   ¡®«¥¥ 4 "
+
+IDSTR_TITLEMEDIAFOLDER   "¥€š ¯«¥¥à"
+IDSTR_TITLECDFOLDER      "CD-¯«¥¥à"
+
+IDSTR_STARTINGTRACK      " ç «ì­ë© âà¥ª..."
+IDSTR_TITLEM3UFOLDER     "¥€ ªâ®à M3U"
+IDSTR_M3UCLOSETEXT       "«¥©«šáâ š§¬¥­ñ­. ®åà ­šâì ¥£® á¥©ç á?"
+IDSTR_MENUFILE           "~ ©«"
+IDSTR_PLAYLISTVIEWTITLE  "¥€ ªâ®à ¯«¥©«šáâ "
+IDSTR_LAUNCHPADFLYOVER   " ­¥«ì § ¯ãáª : ¯¥à¥â éšâ¥ áî€  ®¡ê¥ªâë"
+IDSTR_VIEWPAGENAME       "~š€"
+IDSTR_VIEWCOMPACT        "®¬¯ ªâ­ë©"
+
+END
+
+rcinclude "mediafolder_ru.dlg"
+
+#ifdef ECS
+rcinclude "about_ecs_ru.dlg"
+#else
+rcinclude "about_ru.dlg"
+#endif
+
Index: /tags/CWMM-0.3.0_GA/mediafolder/res/tw/about_ecs_tw.dlg
===================================================================
--- /tags/CWMM-0.3.0_GA/mediafolder/res/tw/about_ecs_tw.dlg	(revision 213)
+++ /tags/CWMM-0.3.0_GA/mediafolder/res/tw/about_ecs_tw.dlg	(revision 213)
@@ -0,0 +1,25 @@
+#define VER_STRING "Media Folder V" \
+MFLDR_VERSION \
+BUILD_STRING
+
+ICON IDICON_FOLDER1  "../icons_ecs/mediafolder1.ico"
+
+DLGTEMPLATE IDDLG_ABOUT LOADONCALL MOVEABLE DISCARDABLE
+BEGIN
+    DIALOG  "Product Information", IDDLG_ABOUT, 100, 120, 194, 67,
+            WS_VISIBLE, FCF_TITLEBAR
+    BEGIN
+        ICON            IDICON_FOLDER1, IDICON_FOLDER1, 10, 39, 16, 15, WS_GROUP
+        LTEXT           "Multimedia integration for the desktop",
+                        IDST_PRODNAME, 38, 50, 154, 10, DT_WORDBREAK | NOT
+                        WS_GROUP
+                        //PRESPARAMS PP_FONTNAMESIZE, "9.WarpSans Bold"
+        CONTROL         "", 607, 38, 43, 154, 7, "CW_SEPARATOR", WS_VISIBLE
+        LTEXT           MFLDR_AUTHOR, IDST_PRODCOPY, 10,
+                        25, 184, 11, DT_VCENTER | DT_WORDBREAK | NOT
+                        WS_GROUP
+                        //PRESPARAMS PP_FONTNAMESIZE, "9.WarpSans"
+        DEFPUSHBUTTON   "~Ok", IDSTR_CLOSETEXT, 10, 2, 34, 13
+    END
+END
+
Index: /tags/CWMM-0.3.0_GA/mediafolder/res/tw/about_tw.dlg
===================================================================
--- /tags/CWMM-0.3.0_GA/mediafolder/res/tw/about_tw.dlg	(revision 213)
+++ /tags/CWMM-0.3.0_GA/mediafolder/res/tw/about_tw.dlg	(revision 213)
@@ -0,0 +1,25 @@
+#define VER_STRING "Media Folder V" \
+MFLDR_VERSION \
+BUILD_STRING
+
+DLGTEMPLATE IDDLG_ABOUT LOADONCALL MOVEABLE DISCARDABLE
+BEGIN
+    DIALOG  "Product Information", IDDLG_ABOUT, 115, 69, 208, 132,
+            WS_VISIBLE, FCF_TITLEBAR
+    BEGIN
+        GROUPBOX        "", IDGB_ABOUT, 3, 21, 200, 108
+        CTEXT           VER_STRING, IDST_PRODNAME, 10, 107, 187,
+                        12, DT_VCENTER | NOT WS_GROUP
+        CTEXT           MFLDR_AUTHOR,
+                        IDST_PRODCOPY, 10, 87, 186, 12, DT_VCENTER | NOT WS_GROUP
+        CTEXT           "Copyright (c) netlabs.org 2020",
+                        IDST_PRODCOPY2, 10, 64, 186, 12, DT_VCENTER | NOT WS_GROUP
+        CTEXT           "Graphics by Klaus Staedtler-Przyborski", 
+                        IDST_PRODGRAPHICS, 10, 46, 186, 17, DT_WORDBREAK | 
+                        NOT WS_GROUP
+        CTEXT           "https://trac.netlabs.org/cwmmclasses", IDST_URL1,
+                        10, 30, 186, 18, DT_WORDBREAK | NOT WS_GROUP
+                        PRESPARAMS PP_FONTNAMESIZE, "8.Helv"
+        DEFPUSHBUTTON   "~Ok", DID_OK, 83, 3, 40, 14
+    END
+END
Index: /tags/CWMM-0.3.0_GA/mediafolder/res/tw/create_res_tw_def.CMD
===================================================================
--- /tags/CWMM-0.3.0_GA/mediafolder/res/tw/create_res_tw_def.CMD	(revision 213)
+++ /tags/CWMM-0.3.0_GA/mediafolder/res/tw/create_res_tw_def.CMD	(revision 213)
@@ -0,0 +1,66 @@
+/* */
+call RxFuncAdd 'SysLoadFuncs', 'RexxUtil', 'SysLoadFuncs'
+call SysLoadFuncs
+
+deffile=ARG(1)
+if ARG(1)="" then deffile="tst.def"
+
+SAY ""
+SAY "¥¿Šb«Ø¥ß DEF ÀÉ®× "deffile
+SAY ""
+
+theVersion=VALUE("MMCLSVERSION", ,"OS2ENVIRONMENT")
+if theVersion="" THEN theVersion=0.0.0
+
+def="; mediafolder_tw.def: DEF-file for Traditional Chinese (TW) resource DLL"||'0d'x||'0a'x
+def=def||";"||'0d'x||'0a'x
+
+def=def||";The following license applies ONLY TO THIS resource DLL. Be aware"||'0d'x||'0a'x
+def=def||";that the whole Media-folder package may be covered by another license."||'0d'x||'0a'x
+def=def||";"||'0d'x||'0a'x
+def=def||";/*"||'0d'x||'0a'x
+def=def||"; * Copyright (c) Chris Wohlgemuth 2002-2005 Netlabs 2023-"||WORD(DATE(), 3)  ||'0d'x||'0a'x
+def=def||"; * All rights reserved."||'0d'x||'0a'x
+def=def||"; *"||'0d'x||'0a'x
+def=def||"; * http://www.geocities.com/SiliconValley/Sector/5785/"||'0d'x||'0a'x
+def=def||"; * http://www.os2world.com/cdwriting"||'0d'x||'0a'x
+def=def||"; *"||'0d'x||'0a'x
+def=def||"; * Redistribution and use in source and binary forms, with or without"||'0d'x||'0a'x
+def=def||"; * modification, are permitted provided that the following conditions"||'0d'x||'0a'x
+def=def||"; * are met:"||'0d'x||'0a'x
+def=def||"; * 1. Redistributions of source code must retain the above copyright"||'0d'x||'0a'x
+def=def||"; *    notice, this list of conditions and the following disclaimer."||'0d'x||'0a'x
+def=def||"; * 2. Redistributions in binary form must reproduce the above copyright"||'0d'x||'0a'x
+def=def||"; *    notice, this list of conditions and the following disclaimer in the"||'0d'x||'0a'x
+def=def||"; *    documentation and/or other materials provided with the distribution."||'0d'x||'0a'x
+def=def||"; * 3. The authors name may not be used to endorse or promote products"||'0d'x||'0a'x
+def=def||"; *    derived from this software without specific prior written permission."||'0d'x||'0a'x
+def=def||"; *"||'0d'x||'0a'x
+def=def||"; * THIS SOFTWARE IS PROVIDED ``AS IS'' AND"||'0d'x||'0a'x
+def=def||"; * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE"||'0d'x||'0a'x
+def=def||"; * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE"||'0d'x||'0a'x
+def=def||"; * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE"||'0d'x||'0a'x
+def=def||"; * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL"||'0d'x||'0a'x
+def=def||"; * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS"||'0d'x||'0a'x
+def=def||"; * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)"||'0d'x||'0a'x
+def=def||"; * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT"||'0d'x||'0a'x
+def=def||"; * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY"||'0d'x||'0a'x
+def=def||"; * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF"||'0d'x||'0a'x
+def=def||"; * SUCH DAMAGE."||'0d'x||'0a'x
+def=def||"; *"||'0d'x||'0a'x
+def=def||"; */"||'0d'x||'0a'x
+
+def=def||'0d'x||'0a'x
+
+def=def||"LIBRARY MFLDR_tw INITINSTANCE TERMINSTANCE"||'0d'x||'0a'x
+def=def||"DESCRIPTION '$@# Netlabs CWMM Team"
+def=def||":"||theVersion||" #@##1## "||DATE("E")||" "||TIME("N")||"       Zobopeep ::::"||WORD(TRANSLATE(theVersion," ", "."),3)||"::@@Media-Folder TW res DLL (C) C. Wohlgemuth 2001-2005 Netlabs CWMM Team 2023-"||WORD(DATE(),3)||"'"||'0d'x||'0a'x
+def=def||"DATA MULTIPLE NONSHARED"||'0d'x||'0a'x
+def=def||"EXPORTS  "||'0d'x||'0a'x
+def=def||"        queryLanguage"||'0d'x||'0a'x
+
+'@type NUL > 'deffile
+call lineout deffile,def
+call stream deffile, "C", "close"
+exit
+
Index: /tags/CWMM-0.3.0_GA/mediafolder/res/tw/makefile
===================================================================
--- /tags/CWMM-0.3.0_GA/mediafolder/res/tw/makefile	(revision 213)
+++ /tags/CWMM-0.3.0_GA/mediafolder/res/tw/makefile	(revision 213)
@@ -0,0 +1,16 @@
+
+include ../../../make.inc
+include ../../../build.inc
+
+all:
+	cd ./.. && make
+
+clean:
+	
+cleaner:
+	-rm *.flc
+	-rm *.*~
+
+distribution:
+
+	
Index: /tags/CWMM-0.3.0_GA/mediafolder/res/tw/mediafolder_tw.c
===================================================================
--- /tags/CWMM-0.3.0_GA/mediafolder/res/tw/mediafolder_tw.c	(revision 213)
+++ /tags/CWMM-0.3.0_GA/mediafolder/res/tw/mediafolder_tw.c	(revision 213)
@@ -0,0 +1,26 @@
+/*
+ * This file is (C) Chris Wohlgemuth 1999
+ */
+/*
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; see the file COPYING.  If not, write to
+ * the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+
+#include <os2.h>
+
+PSZ queryLanguage()
+{
+  return "Taiwan";
+}
+
Index: /tags/CWMM-0.3.0_GA/mediafolder/res/tw/mediafolder_tw.dlg
===================================================================
--- /tags/CWMM-0.3.0_GA/mediafolder/res/tw/mediafolder_tw.dlg	(revision 213)
+++ /tags/CWMM-0.3.0_GA/mediafolder/res/tw/mediafolder_tw.dlg	(revision 213)
@@ -0,0 +1,126 @@
+#ifndef OS2_INCLUDED
+   #include <os2.h>
+#endif
+DLGINCLUDE 1 "
+G:\Projects_working\mmclasses-0.3.0\source\include\mediafolderres.h"
+
+DLGTEMPLATE IDDLG_BOTTOMFRAME LOADONCALL MOVEABLE DISCARDABLE
+BEGIN
+    DIALOG  "", IDDLG_BOTTOMFRAME, 12, 70, 300, 16, NOT FS_DLGBORDER | NOT
+            WS_SAVEBITS
+    BEGIN
+        CTEXT           "", IDST_STATUSTEXT, 39, 1, 221, 8
+    END
+END
+
+DLGTEMPLATE IDDLG_FRAMERIGHT LOADONCALL MOVEABLE DISCARDABLE
+BEGIN
+    DIALOG  "", IDDLG_FRAMERIGHT, 134, 21, 24, 109, NOT FS_DLGBORDER | NOT
+            WS_SAVEBITS
+    BEGIN
+    END
+END
+
+DLGTEMPLATE IDDLG_LEFTFRAME LOADONCALL MOVEABLE DISCARDABLE
+BEGIN
+    DIALOG  "", IDDLG_LEFTFRAME, 12, 6, 148, 148, NOT FS_DLGBORDER | NOT
+            WS_SAVEBITS
+    BEGIN
+        CONTAINER       IDCNR_PLAYLIST, 14, 11, 123, 111, CCS_SINGLESEL |
+                        CCS_AUTOPOSITION | CCS_MINIRECORDCORE | WS_GROUP
+        PUSHBUTTON      "Add", IDPB_ADD, 8, 129, 40, 14
+        PUSHBUTTON      "Remove", IDPB_REMOVE, 72, 129, 40, 14
+    END
+END
+
+DLGTEMPLATE IDDLG_TOOLBARSETTINGS LOADONCALL MOVEABLE DISCARDABLE
+BEGIN
+    DIALOG  "", IDDLG_TOOLBARSETTINGS, 91, 22, 201, 199, NOT FS_DLGBORDER |
+            WS_VISIBLE
+    BEGIN
+        GROUPBOX        "€ušãŠC", IDGB_TOOLBAR, 9, 24, 181, 127, NOT
+                        WS_GROUP
+        AUTOCHECKBOX    "±Ò¥Î§Y®ÉžÑ»¡(~E)", IDCB_ENABLETBFLYOVER, 16,
+                        129, 152, 10
+        SPINBUTTON      IDSB_TBFLYOVERDELAY, 97, 115, 40, 12,
+                        SPBS_NUMERICONLY | SPBS_MASTER | SPBS_FASTSPIN |
+                        WS_GROUP
+        GROUPBOX        "§Y®ÉÃCŠâ€ÎŠr«¬", IDGB_COLORANDFONT, 15,
+                        30, 168, 76, NOT WS_GROUP
+        LTEXT           "ÃCŠâ©ÎŠrÅé¿ï¥Î°ÏªºÂIÀ»«ö¶s¡C"
+                        "©ì©ñ®É«öŠí <CTRL> ¥i¥H§ïÅÜŠrÅéÃCŠâ¡C",
+                        IDST_TEXTDEMOFIELD, 23, 35, 95, 57, DT_WORDBREAK
+                        PRESPARAMS PP_FOREGROUNDCOLOR, 0x000000FFL
+                        PRESPARAMS PP_BACKGROUNDCOLOR, 0x00FFFFFFL
+        PUSHBUTTON      "ÃCŠâ(~C)...", IDPB_COLORPALETTE, 129, 72, 45, 14
+        PUSHBUTTON      "ŠrÅé(~F)...", IDPB_FONTPALETTE, 129, 49, 45, 14
+        PUSHBUTTON      "Š^Ž_(~U)", IDPB_COLORUNDO, 16, 7, 52, 14
+        PUSHBUTTON      "¹w³]­È(~D)", IDPB_COLORSTANDARD, 74, 7, 52, 14
+        PUSHBUTTON      "žÑ»¡(~H)", IDPB_COLORHELP, 132, 7, 52, 14, BS_HELP
+        RTEXT           "©µ¿ð(ms)¡G", IDGB_COLORANDFONT, 35, 116, 55, 8,
+                        DT_VCENTER
+    END
+END
+
+DLGTEMPLATE IDDLG_TOPFRAME LOADONCALL MOVEABLE DISCARDABLE
+BEGIN
+    DIALOG  "", IDDLG_TOPFRAME, 13, 52, 287, 26, NOT FS_DLGBORDER |
+            FS_BORDER | NOT WS_SAVEBITS
+    BEGIN
+        PUSHBUTTON      "«ö", IDPB_PAUSE, 2, 6, 19, 14, NOT WS_VISIBLE
+    END
+END
+
+DLGTEMPLATE IDDLG_TOPMIDDLE LOADONCALL MOVEABLE DISCARDABLE
+BEGIN
+    DIALOG  "", IDDLG_TOPMIDDLE, 12, 51, 249, 39, NOT FS_DLGBORDER |
+            FS_BORDER | WS_VISIBLE | NOT WS_SAVEBITS
+    BEGIN
+        CONTROL         "­Ë°h(~B)", IDPB_SKIPBACK, 19, 25, 20, 14, WC_BUTTON,
+                        BS_USERBUTTON | BS_NOPOINTERFOCUS | WS_TABSTOP |
+                        WS_VISIBLE
+        CONTROL         "°±€î(~S)", IDPB_STOP, 40, 25, 22, 14, WC_BUTTON,
+                        BS_USERBUTTON | BS_NOPOINTERFOCUS | WS_VISIBLE
+        CONTROL         "ŒÈ°±(~P)", IDPB_PAUSE, 61, 25, 20, 14, WC_BUTTON,
+                        BS_USERBUTTON | BS_NOPOINTERFOCUS | WS_VISIBLE
+        CONTROL         "Œœ©ñ(~L)", IDPB_PLAY, 79, 25, 20, 14, WC_BUTTON,
+                        BS_USERBUTTON | BS_NOPOINTERFOCUS | WS_VISIBLE
+        CONTROL         "€U€@­º(~N)", IDPB_SKIPFORWARD, 99, 25, 20, 14, WC_BUTTON,
+                        BS_USERBUTTON | BS_NOPOINTERFOCUS | WS_VISIBLE
+        AUTOCHECKBOX    "­«ÂÐ(~R)", IDCB_REPEAT, 133, 13, 73, 10,WS_VISIBLE|BS_USERBUTTON | BS_AUTOCHECKBOX
+        AUTOCHECKBOX    "ÀHŸ÷(~A)", IDCB_RANDOM, 133, 23, 73, 10, WS_VISIBLE  | BS_USERBUTTON | BS_AUTOCHECKBOX
+
+        CTEXT           "0:00", IDST_PLAYTIME, 133, 24, 102, 10, DT_VCENTER
+                        PRESPARAMS PP_FONTNAMESIZE, "10.Helv"
+        CONTROL         "­µ¶qºb", IDSL_VOLUMEARM, 209, 5, 14, 14,
+                        WC_BUTTON, BS_USERBUTTON | WS_TABSTOP|BS_USERBUTTON
+        PUSHBUTTON      "­µ¶q", IDSL_VOLUME, 19, 4, 69, 14,
+                        BS_NOPOINTERFOCUS | NOT WS_TABSTOP | NOT WS_VISIBLE |BS_USERBUTTON
+    END
+END
+
+/*#define VER_STRING "Media-Ordner V" \
+MFLDR_VERSION \
+BUILD_STRING
+
+DLGTEMPLATE IDDLG_ABOUT LOADONCALL MOVEABLE DISCARDABLE
+BEGIN
+    DIALOG  "²£«~žê°T", IDDLG_ABOUT, 115, 69, 208, 132,
+            WS_VISIBLE, FCF_TITLEBAR
+    BEGIN
+        GROUPBOX        "", IDGB_ABOUT, 3, 21, 200, 108
+        CTEXT           VER_STRING, IDST_PRODNAME, 10, 107, 187,
+                        12, DT_VCENTER | NOT WS_GROUP
+        CTEXT           MFLDR_AUTHOR, IDST_PRODCOPY, 10, 87,
+                        186, 12, DT_VCENTER | NOT WS_GROUP
+        CTEXT           "Copyright (c) netlabs.org 2020",
+                        IDST_PRODCOPY2, 10, 64, 186, 12, DT_VCENTER | NOT WS_GROUP
+        CTEXT           "Graphics by Klaus Staedtler-Przyborski",
+                        IDST_PRODGRAPHICS, 10, 64, 186, 17, DT_WORDBREAK |
+                        NOT WS_GROUP
+        CTEXT           "https://trac.netlabs.org/cwmmclasses", IDST_URL1,
+                        10, 30, 186, 18, DT_WORDBREAK | NOT WS_GROUP
+                        PRESPARAMS PP_FONTNAMESIZE, "8.Helv"
+        DEFPUSHBUTTON   "~Ok", DID_OK, 83, 3, 40, 14
+    END
+END*/
Index: /tags/CWMM-0.3.0_GA/mediafolder/res/tw/mediafolder_tw.rc
===================================================================
--- /tags/CWMM-0.3.0_GA/mediafolder/res/tw/mediafolder_tw.rc	(revision 213)
+++ /tags/CWMM-0.3.0_GA/mediafolder/res/tw/mediafolder_tw.rc	(revision 213)
@@ -0,0 +1,86 @@
+#define  INCL_GRAPHICBUTTON   /* need this for the graphic buttons control */
+#define  INCL_BITMAP
+
+#ifndef OS2_INCLUDED
+   #include <os2.h>
+#endif
+#include <sw.h>
+
+#include "mediafolderres.h"
+#include "version.h"
+#include "build.h"
+
+CODEPAGE 950
+
+MENU ID_MENUABOUT
+BEGIN
+   MENUITEM  "" , ID_MENUSEPARATOR, MIS_SEPARATOR
+   MENUITEM "ŽCÅéžê®Æ§šžê°T(~M)",ID_ABOUTITEM   
+END
+
+MENU ID_MBMENUSKRIPTS
+BEGIN
+
+END
+
+MENU ID_MENUVIEWCOMPACT
+BEGIN
+   MENUITEM  "À£ÁY(~C)" , ID_MENUVIEWCOMPACT
+END
+
+MENU  ID_MENUTIMECONTEXT
+BEGIN
+	MENUITEM "žg¹L®É¶¡(~E)"   ,          ID_MENUITEMELAPSED
+	MENUITEM "³ÑŸl®É¶¡(~R)" ,          ID_MENUITEMREMAINING
+	MENUITEM "Š±¥Øžê°T(~T)" ,       ID_MENUITEMID3
+END
+
+MENU  ID_MENUFILE
+BEGIN
+	MENUITEM "ÀxŠs(~S)"   ,          	ID_MENUITEMSAVE
+	MENUITEM ""           ,                 ID_MENUSEPARATOR, MIS_SEPARATOR               
+	MENUITEM "Â÷¶}(~E)" ,          		ID_MENUITEMEXIT
+END
+
+
+STRINGTABLE
+BEGIN
+IDSTR_CLOSETITLE "œT»{"
+IDSTR_CLOSETEXT  "¥Ø«e¥¿ŠbŒœ©ñºqŠ±¡A§AœT©w­n°±€îŒœ©ñšÃÃö³¬Œœ©ñŸ¹¡H"
+IDSTRSETTING_TOOLBAR "€ušãŠC"
+IDSTRS_NOFONTPALETTE          "µLªk¶}±ÒŠrÅé¿ï¥Î°Ï¡Ašä ID ¥i¯à€w¿ò¥¢¡AœÐÀË¬d INI ÀÉ®×¡C"
+IDSTRS_NOCOLORPALETTE         "µLªk¶}±ÒÃCŠâ¿ï¥Î°Ï¡Ašä ID ¥i¯à€w¿ò¥¢¡AœÐÀË¬d INI ÀÉ®×¡C"
+IDSTRS_MEDIAFLDRSETTINGS   "Media-Folder ³]©w"
+IDSTR_MENUABOUT          "Media-Folder žê°T"
+IDSTR_MEDIAFLDHELP       "~Media-Folder Help"
+IDSTR_M3ULISTHELP        "~M3U List Help" 
+IDSTR_MENUCOMPACT        "À£ÁY(~C)"
+IDSTR_STATUSCOLLECTING   "Š¬¶°Án­µŠ±¥Ø€€¡K"
+IDSTR_MENUSKRIPTS        "ž}¥»€Î€ušã"
+IDSTR_STATUSTIME1        "%d:%02d €À"
+IDSTR_STATUSTIME2        "%d ®É %d:%02d €À"
+IDSTR_STATUSTIME3        "%d €Ñ %d ®É %d:%02d €À"
+IDSTR_STATUSTIME4        "%d Audiofiles   -   %d%s%03d%s%03d Bytes   -   %s"
+IDSTR_STATUSTIME5        "%d Audiofiles   -   ¶W¹L 4 GBytes"
+
+IDSTR_TITLEMEDIAFOLDER   "ŽCÅéŒœ©ñŸ¹"
+IDSTR_TITLECDFOLDER      "CD Œœ©ñŸ¹"
+
+IDSTR_STARTINGTRACK      "¶}©l°lÂÜ¡K"
+IDSTR_TITLEM3UFOLDER    "M3U œs¿èŸ¹"
+IDSTR_M3UCLOSETEXT      "²M³æ€w§ïÅÜ¡A²{Šb­nÀxŠs¶Ü¡H"
+IDSTR_MENUFILE           "ÀÉ®×(~F)"
+IDSTR_PLAYLISTVIEWTITLE  "²M³æœs¿èŸ¹"
+IDSTR_LAUNCHPADFLYOVER   "µo®g¥x¡G©ñª«¥óŠÜŠ¹"
+IDSTR_VIEWPAGENAME       "ÀËµø(~V)"
+IDSTR_VIEWCOMPACT        "À£ÁY"
+
+END
+
+rcinclude "mediafolder_tw.dlg"
+
+#ifdef ECS
+rcinclude "about_ecs_tw.dlg"
+#else
+rcinclude "about_tw.dlg"
+#endif
Index: /tags/CWMM-0.3.0_GA/nl_nlv/about_ecs_nl.dlg
===================================================================
--- /tags/CWMM-0.3.0_GA/nl_nlv/about_ecs_nl.dlg	(revision 213)
+++ /tags/CWMM-0.3.0_GA/nl_nlv/about_ecs_nl.dlg	(revision 213)
@@ -0,0 +1,27 @@
+#define VER_STRING "Media-Ordner V" \
+MFLDR_VERSION \
+BUILD_STRING
+
+ICON IDICON_FOLDER1  "../icons_ecs/mediafolder1.ico"
+
+DLGTEMPLATE IDDLG_ABOUT LOADONCALL MOVEABLE DISCARDABLE
+BEGIN
+    DIALOG  "Produkt Information", IDDLG_ABOUT, 100, 120, 194, 67, 
+            WS_VISIBLE, FCF_TITLEBAR
+    BEGIN
+        ICON            IDICON_FOLDER1, IDICON_FOLDER1, 10, 39, 16, 15, WS_GROUP
+        LTEXT           "Multimedia integration for the desktop", 
+                        IDST_PRODNAME, 38, 50, 154, 10, DT_WORDBREAK | NOT 
+                        WS_GROUP
+                        PRESPARAMS PP_FONTNAMESIZE, "9.WarpSans Bold"
+        CONTROL         "", 607, 38, 43, 154, 7, "CW_SEPARATOR", WS_VISIBLE
+        LTEXT           "(C) 2002-2004 Chris Wohlgemuth", IDST_PRODCOPY, 38, 
+                        29, 154, 11, DT_VCENTER | DT_WORDBREAK | NOT 
+                        WS_GROUP
+                        PRESPARAMS PP_FONTNAMESIZE, "9.WarpSans"
+        LTEXT           "Licensed to Serenity Systems", 608, 38, 19, 154, 9
+                        PRESPARAMS PP_FONTNAMESIZE, "9.WarpSans"
+        DEFPUSHBUTTON   "~Ok", IDSTR_CLOSETEXT, 38, 2, 34, 13
+    END
+END
+
Index: /tags/CWMM-0.3.0_GA/nl_nlv/about_nl.dlg
===================================================================
--- /tags/CWMM-0.3.0_GA/nl_nlv/about_nl.dlg	(revision 213)
+++ /tags/CWMM-0.3.0_GA/nl_nlv/about_nl.dlg	(revision 213)
@@ -0,0 +1,28 @@
+#define VER_STRING "Media-Ordner V" \
+MFLDR_VERSION \
+BUILD_STRING
+
+DLGTEMPLATE IDDLG_ABOUT LOADONCALL MOVEABLE DISCARDABLE
+BEGIN
+    DIALOG  "Produkt informatie", IDDLG_ABOUT, 115, 69, 208, 132, 
+            WS_VISIBLE, FCF_TITLEBAR
+    BEGIN
+        GROUPBOX        "", IDGB_ABOUT, 3, 21, 200, 108
+;        CTEXT           "Media-map V0.2.5", IDST_PRODNAME, 36, 107, 135, 
+        CTEXT           VER_STRING, IDST_PRODNAME, 10, 107, 187, 
+                        12, DT_VCENTER | NOT WS_GROUP
+        CTEXT           "(C) Chris Wohlgemuth 2002/2003", IDST_PRODCOPY, 10, 87, 
+                        186, 12, DT_VCENTER | NOT WS_GROUP
+        CTEXT           "Graphics door Klaus Staedtler-Przyborski", 
+                        IDST_PRODGRAPHICS, 10, 64, 186, 17, DT_WORDBREAK | 
+                        NOT WS_GROUP
+        CTEXT           "http://www.geocities.com/SiliconValley/Sector/5785/"
+                        "index.html", IDST_URL1, 10, 46, 186, 18, 
+                        DT_WORDBREAK | NOT WS_GROUP
+                        PRESPARAMS PP_FONTNAMESIZE, "8.Helv"
+        CTEXT           "http://www.os2world.com/cdwriting", IDST_URL2, 10, 
+                        30, 186, 16, DT_WORDBREAK
+                        PRESPARAMS PP_FONTNAMESIZE, "8.Helv"
+        DEFPUSHBUTTON   "~Ok", DID_OK, 83, 3, 40, 14
+    END
+END
Index: /tags/CWMM-0.3.0_GA/nl_nlv/mmfind_nl.dlg
===================================================================
--- /tags/CWMM-0.3.0_GA/nl_nlv/mmfind_nl.dlg	(revision 213)
+++ /tags/CWMM-0.3.0_GA/nl_nlv/mmfind_nl.dlg	(revision 213)
@@ -0,0 +1,51 @@
+#ifndef OS2_INCLUDED
+   #include <os2.h>
+#endif
+
+DLGTEMPLATE IDDLG_MMFIND LOADONCALL MOVEABLE DISCARDABLE
+BEGIN
+    DIALOG  "Find Multimedia File", IDDLG_MMFIND, 12, 23, 338, 133, WS_VISIBLE | WS_SYNCPAINT, 
+            FCF_SYSMENU | FCF_TITLEBAR
+            PRESPARAMS PP_FONTNAMESIZE, "9.WarpSans"
+    BEGIN
+        LTEXT           "Open filename", 257, 4, 120, 51, 9, DT_VCENTER | 
+                        NOT WS_GROUP
+        ENTRYFIELD      "*", 258, 55, 120, 239, 7, ES_MARGIN | WS_GROUP
+        LTEXT           "Drive", 259, 4, 108, 51, 9, DT_VCENTER | NOT 
+                        WS_GROUP
+        CONTROL         "H:  [SOURCES]", 260, 54, 18, 87, 99, WC_COMBOBOX, 
+                        CBS_DROPDOWNLIST | WS_TABSTOP | WS_VISIBLE
+        LTEXT           "Restrict files to", 261, 174, 4, 46, 9, DT_VCENTER | 
+                        NOT WS_GROUP | NOT WS_VISIBLE
+        CONTROL         "<All Files>", 262, 209, 4, 29, 8, WC_COMBOBOX, 
+                        CBS_DROPDOWNLIST | WS_TABSTOP
+        LTEXT           "Directory", 263, 4, 97, 35, 7, NOT WS_GROUP
+        LTEXT           "", 270, 42, 98, 60, 6, NOT WS_GROUP | NOT 
+                        WS_VISIBLE
+        LTEXT           "File", 265, 131, 97, 17, 7, NOT WS_GROUP
+        AUTOCHECKBOX    "Read-Only", 269, 171, 97, 42, 8, NOT WS_TABSTOP | 
+                        NOT WS_VISIBLE
+        LISTBOX         264, 4, 17, 116, 76, LS_OWNERDRAW | LS_HORZSCROLL
+        LISTBOX         266, 125, 17, 116, 76, LS_HORZSCROLL
+        RTEXT           "Type of file", IDST_TYPE, 146, 108, 58, 9, DT_VCENTER
+        CONTROL         "", IDCB_TYPEOFFILE, 208, 18, 87, 99, WC_COMBOBOX, 
+                        CBS_DROPDOWNLIST | WS_GROUP | WS_TABSTOP | 
+                        WS_VISIBLE
+        GROUPBOX        "Preview", IDGB_PREVIEW, 245, 16, 89, 80, NOT WS_VISIBLE
+        CONTROL         "", IDSR_IMGPREVIEW, 249, 20, 82, 68, WC_STATIC, SS_FGNDRECT | 
+                        WS_GROUP
+        CTEXT           "No preview available", IDST_NOPREVIEWAVAILABLE, 251, 42, 78, 33, 
+                        DT_WORDBREAK | NOT WS_VISIBLE
+        LTEXT           "", IDST_AUDIOINFO, 253, 21, 75, 62, DT_WORDBREAK | NOT 
+                        WS_VISIBLE
+        GROUPBOX        "Audio info", IDGB_AUDIOINFO, 245, 17, 89, 79, NOT WS_VISIBLE
+        DEFPUSHBUTTON   "~OK", DID_OK, 3, 2, 40, 12
+        PUSHBUTTON      "~New...", IDPB_NEWFILE, 46, 2, 40, 12
+        PUSHBUTTON      "Apply", 268, 293, 3, 40, 12, NOT WS_TABSTOP | NOT 
+                        WS_VISIBLE
+        PUSHBUTTON      "~Cancel", DID_CANCEL, 95, 2, 40, 12, NOT WS_TABSTOP
+        PUSHBUTTON      "Help", 267, 243, 2, 40, 12, BS_NOPOINTERFOCUS | NOT 
+                        WS_TABSTOP | NOT WS_VISIBLE
+        LISTBOX         3, 0, 0, 2, 1, NOT WS_TABSTOP | NOT WS_VISIBLE
+    END
+END
Index: /tags/CWMM-0.3.0_GA/nl_nlv/mmfind_nl.rc
===================================================================
--- /tags/CWMM-0.3.0_GA/nl_nlv/mmfind_nl.rc	(revision 213)
+++ /tags/CWMM-0.3.0_GA/nl_nlv/mmfind_nl.rc	(revision 213)
@@ -0,0 +1,13 @@
+#ifndef OS2_INCLUDED
+   #include <os2.h>
+#endif
+
+STRINGTABLE
+BEGIN
+IDSTR_TYPEAUDIO       "Audio"
+IDSTR_TYPEIMAGE       "Image"
+IDSTR_TYPEVIDEO       "Video"
+IDSTR_AUDIOINFOTEXT   "Play time:\t%02d:%02d\n\nSamplerate:\t%d\n\nBits per sample:\t%d\n\nChannels:\t%d"
+IDSTR_NOMMTEMPLATEFLDRTITLE "Error during file creation"
+IDSTR_NOMMTEMPLATEFLDR "Multimedia template folder can't be found. It may has lost the object ID <MMPM2_MMTEMPLATEFOLDER>."
+END
Index: /tags/CWMM-0.3.0_GA/nlv/de/classes/res/audioconv_de.dlg
===================================================================
--- /tags/CWMM-0.3.0_GA/nlv/de/classes/res/audioconv_de.dlg	(revision 213)
+++ /tags/CWMM-0.3.0_GA/nlv/de/classes/res/audioconv_de.dlg	(revision 213)
@@ -0,0 +1,38 @@
+#ifndef OS2_INCLUDED
+   #include <os2.h>
+#endif
+
+DLGTEMPLATE IDDLG_CONVERT LOADONCALL MOVEABLE DISCARDABLE
+BEGIN
+    DIALOG  "Audiodatei konvertieren", IDDLG_CONVERT, 115, 36, 207, 174, 
+            WS_VISIBLE, FCF_SYSMENU | FCF_TITLEBAR
+    BEGIN
+        GROUPBOX        "", IDGB_CONVERT, 3, 105, 203, 69
+        LTEXT           "Name:", IDST_CONVERTNAMELABEL, 7, 156, 32, 8
+        RTEXT           "", IDST_CONVERTNAME, 45, 156, 156, 8
+        LTEXT           "? Hz", IDST_CONVERTSAMPLERATE, 7, 131, 91, 8
+        LTEXT           "? Kanle", IDST_CONVERTCHANNELS, 7, 120, 91, 8
+        LTEXT           "(CD: 16 Bit pro Sample)", IDST_CONVERTCDBITS, 103, 
+                        142, 98, 8
+        LTEXT           "(CD: 44100 Hz)", IDST_CONVERTCDSAMPLELABEL, 103, 
+                        131, 98, 8
+        LTEXT           "(CD: 2 Kanle)", IDST_CONVERTCDCHANNELSLABEL, 103, 
+                        120, 98, 8
+        LTEXT           "Spielzeit: ?", IDST_CONVERTPLAYTIME, 7, 109, 161, 8
+        GROUPBOX        "", IDGB_CONVERT2, 3, 19, 203, 85
+        LTEXT           "Konvertieren in:", 317, 7, 86, 86, 8
+        CONTROL         "", IDDD_IOPROC, 7, 28, 195, 54, WC_COMBOBOX, 
+                        CBS_DROPDOWNLIST | WS_GROUP | WS_TABSTOP | 
+                        WS_VISIBLE
+        LTEXT           "Zielname:", 2419, 7, 57, 64, 8, NOT WS_GROUP
+        ENTRYFIELD      "", IDEF_CONVERTTARGETNAME, 9, 45, 139, 8, ES_RIGHT | 
+                        ES_MARGIN
+        PUSHBUTTON      "~Suchen...", IDPB_CONVERTBROWSE, 153, 42, 47, 14
+        CONTROL         "", IDBAR_CONVERTPROGRESS, 6, 24, 194, 13, 
+                        "CW_PERCENTBAR", 5 | WS_GROUP | WS_VISIBLE
+        DEFPUSHBUTTON   "~Konvertieren", IDPB_CONVERTOK, 20, 2, 47, 14
+        PUSHBUTTON      "~Abbruch", IDPB_CONVERTABORT, 71, 2, 40, 14
+        PUSHBUTTON      "~Schlieáen", IDPB_CONVERTCLOSE, 135, 2, 40, 14
+    END
+END
+
Index: /tags/CWMM-0.3.0_GA/nlv/de/classes/res/audioconv_de.rc
===================================================================
--- /tags/CWMM-0.3.0_GA/nlv/de/classes/res/audioconv_de.rc	(revision 213)
+++ /tags/CWMM-0.3.0_GA/nlv/de/classes/res/audioconv_de.rc	(revision 213)
@@ -0,0 +1,19 @@
+#ifndef OS2_INCLUDED
+   #include <os2.h>
+#endif
+
+STRINGTABLE 
+BEGIN
+
+IDSTR_CONVERTCHANNELS    "%d Kanle"
+IDSTR_CONVERTSAMPLERATE  "%d Hz"
+IDSTR_CONVERTPLAYTIME    "%d:%02d min Spielzeit"
+IDSTR_INSTALLERRORTITLE  "Installationsproblem"
+IDSTR_CONVERTDIALOGERROR "Dialog kann nicht geladen werden! Bitte Installation prfen."
+IDSTR_CONVERTNOSPACETITLE   "In Wavedatei umsetzen"
+IDSTR_CONVERTNOSPACETEXT   "Nicht gengend Platz fr die Zieldatei. Einen anderen Speicherort mit mindestens %d MB freiem Speicher whlen."
+IDSTR_AUDIOBROWSETITLE   "Audio-Dateiname"
+
+
+END
+
Index: /tags/CWMM-0.3.0_GA/nlv/de/classes/res/audioplayer_de.dlg
===================================================================
--- /tags/CWMM-0.3.0_GA/nlv/de/classes/res/audioplayer_de.dlg	(revision 213)
+++ /tags/CWMM-0.3.0_GA/nlv/de/classes/res/audioplayer_de.dlg	(revision 213)
@@ -0,0 +1,27 @@
+#ifndef OS2_INCLUDED
+   #include <os2.h>
+#endif
+
+DLGTEMPLATE IDDLG_MMPLAYER LOADONCALL MOVEABLE DISCARDABLE
+BEGIN
+    DIALOG  "Audio-Spieler", IDDLG_MMPLAYER, 68, 78, 207, 124, 
+            WS_VISIBLE, FCF_SYSMENU | FCF_TITLEBAR
+    BEGIN
+        CONTROL         "", ID_CLIENT, 18, 0, 56, 67, WC_STATIC, SS_FGNDRECT | 
+                        WS_GROUP | WS_VISIBLE 
+        CONTROL         "~Stop", IDPB_MMPLAYERSTOP, 40, 25, 22, 14, WC_BUTTON, 
+                        BS_USERBUTTON | WS_VISIBLE| WS_TABSTOP
+        CONTROL         "~Pause", IDPB_MMPLAYERPAUSE, 61, 25, 20, 14, WC_BUTTON, 
+                        BS_USERBUTTON | WS_VISIBLE
+        CONTROL         "P~lay", IDPB_MMPLAYERPLAY, 79, 25, 20, 14, WC_BUTTON, 
+                        BS_USERBUTTON | WS_VISIBLE
+        CTEXT           "0:00", IDST_MMPLAYERPLAYTIME, 123, 14, 134, 13, DT_VCENTER
+                        PRESPARAMS PP_FONTNAMESIZE, "10.Helv"
+;        CONTROL         "VolumeArm", IDSL_MMPLAYERVOLUMEARM, 209, 5, 14, 14, 
+;                        WC_BUTTON, BS_USERBUTTON | WS_TABSTOP|BS_USERBUTTON
+;        PUSHBUTTON      "Volume", IDSL_MMPLAYERVOLUME, 19, 4, 69, 14, 
+;                        BS_NOPOINTERFOCUS | NOT WS_TABSTOP | NOT WS_VISIBLE |BS_USERBUTTON
+
+    END
+END
+
Index: /tags/CWMM-0.3.0_GA/nlv/de/classes/res/audioplayer_de.rc
===================================================================
--- /tags/CWMM-0.3.0_GA/nlv/de/classes/res/audioplayer_de.rc	(revision 213)
+++ /tags/CWMM-0.3.0_GA/nlv/de/classes/res/audioplayer_de.rc	(revision 213)
@@ -0,0 +1,16 @@
+#ifndef OS2_INCLUDED
+   #include <os2.h>
+#endif
+
+MENU  ID_MENUTIMECONTEXT
+BEGIN
+	MENUITEM "~Aktuelle Position"   ,        ID_MENUITEMELAPSED
+	MENUITEM "~Verbleibende Zeit" ,          ID_MENUITEMREMAINING
+	MENUITEM "~Track-Information" ,          ID_MENUITEMID3
+END
+
+STRINGTABLE
+BEGIN
+IDSTR_MASTERVOLUMEITEM "System-~Lautstrke"
+END
+
Index: /tags/CWMM-0.3.0_GA/nlv/de/classes/res/classvolume_de.dlg
===================================================================
--- /tags/CWMM-0.3.0_GA/nlv/de/classes/res/classvolume_de.dlg	(revision 213)
+++ /tags/CWMM-0.3.0_GA/nlv/de/classes/res/classvolume_de.dlg	(revision 213)
@@ -0,0 +1,15 @@
+#ifndef OS2_INCLUDED
+   #include <os2.h>
+#endif
+
+DLGTEMPLATE IDDLG_CLASSVOLUME LOADONCALL MOVEABLE DISCARDABLE
+BEGIN
+    DIALOG  "Lautstrke", IDDLG_CLASSVOLUME, 68, 78, 207, 124, 
+            WS_VISIBLE, FCF_SYSMENU | FCF_TITLEBAR
+    BEGIN
+        CONTROL         "", ID_CLASSVOLCLIENT, 18, 0, 56, 67, WC_STATIC, SS_FGNDRECT | 
+                        WS_GROUP | WS_VISIBLE 
+
+    END
+END
+
Index: /tags/CWMM-0.3.0_GA/nlv/de/classes/res/cwaudio_de.dlg
===================================================================
--- /tags/CWMM-0.3.0_GA/nlv/de/classes/res/cwaudio_de.dlg	(revision 213)
+++ /tags/CWMM-0.3.0_GA/nlv/de/classes/res/cwaudio_de.dlg	(revision 213)
@@ -0,0 +1,78 @@
+#ifndef OS2_INCLUDED
+   #include <os2.h>
+#endif
+
+DLGTEMPLATE IDDLG_WAVEINFOPAGE LOADONCALL MOVEABLE DISCARDABLE
+BEGIN
+    DIALOG  "", IDDLG_WAVEINFOPAGE, 91, 31, 169, 109, NOT FS_DLGBORDER | 
+            WS_VISIBLE
+    BEGIN
+        GROUPBOX        "Audio Info", IDGB_WAVEINFO, 6, 4, 154, 67, NOT 
+                        WS_GROUP
+        LTEXT           "Spielzeit:", IDST_PLAYTIMELABEL, 17, 47, 76, 8
+        LTEXT           "Sample Rate:", IDST_SAMPLERATELABEL, 17, 35, 76, 8
+        LTEXT           "Bits pro Sample:", IDST_BPSLABEL, 17, 23, 76, 8
+        LTEXT           "Kanle:", IDST_CHANNELSLABEL, 17, 12, 76, 8
+        LTEXT           "??:??", IDST_PLAYTIME, 108, 47, 39, 8
+        LTEXT           "??", IDST_SAMPLERATE, 108, 35, 39, 8
+        LTEXT           "??", IDST_BPS, 108, 23, 39, 8
+        LTEXT           "??", IDST_CHANNELS, 108, 12, 39, 8
+    END
+END
+
+DLGTEMPLATE IDDLG_ID3TAGS LOADONCALL MOVEABLE DISCARDABLE
+BEGIN
+    DIALOG  "", IDDLG_ID3TAGS, 92, 13, 209, 120, NOT FS_DLGBORDER | 
+            WS_VISIBLE
+    BEGIN
+        PUSHBUTTON      "~Sichern", IDPB_ID3SAVE, 44, 1, 40, 14
+        PUSHBUTTON      "~Widerrufen", IDPB_CANCEL, 87, 1, 40, 14
+        PUSHBUTTON      "~Hilfe", IDPB_ID3HELP, 130, 1, 40, 14, BS_HELP
+        GROUPBOX        "ID3 Tags", IDGB_ID3TAGS, 6, 17, 202, 97
+        LTEXT           "Titel:", 210, 9, 95, 57, 8
+        ENTRYFIELD      "", IDEF_ID3NAME, 73, 95, 127, 8, ES_MARGIN
+        LTEXT           "Knstler:", 211, 9, 82, 57, 8
+        ENTRYFIELD      "", IDEF_ID3ARTIST, 73, 82, 127, 8, ES_MARGIN
+        LTEXT           "Album:", 212, 9, 69, 57, 8
+        ENTRYFIELD      "", IDEF_ID3ALBUM, 73, 69, 127, 8, ES_MARGIN
+        LTEXT           "Kommentar:", 213, 9, 56, 57, 8
+        ENTRYFIELD      "", IDEF_ID3COMMENT, 73, 56, 127, 8, ES_MARGIN
+        LTEXT           "Jahr:", 214, 9, 44, 57, 8
+        ENTRYFIELD      "", IDEF_ID3YEAR, 73, 43, 40, 8, ES_MARGIN
+        LTEXT           "Genre:", 215, 9, 26, 57, 8
+        CONTROL         "", IDDD_ID3GENRE, 71, 5, 99, 31, WC_COMBOBOX, 
+                        CBS_DROPDOWN | WS_GROUP | WS_TABSTOP | WS_VISIBLE
+    END
+END
+
+DLGTEMPLATE IDDLG_STREAMURLPAGE LOADONCALL MOVEABLE DISCARDABLE
+BEGIN
+    DIALOG  "", IDDLG_STREAMURLPAGE, 91, 31, 169, 109, NOT FS_DLGBORDER | 
+            WS_VISIBLE
+    BEGIN
+       PUSHBUTTON      "~Hilfe", IDPB_STREAMHELP, 130, 1, 40, 14, BS_HELP
+        GROUPBOX        "URL", IDGB_STREAMURL, 6, 4, 154, 61, NOT WS_GROUP
+        ENTRYFIELD      "", IDEF_URL, 13, 23, 140, 8, ES_MARGIN
+        LTEXT           "URL fr Server eingeben:", IDST_URLTEXT, 12, 37, 
+                        143, 8
+    END
+END
+
+DLGTEMPLATE IDDLG_IMAGEINFOPAGE LOADONCALL MOVEABLE DISCARDABLE
+BEGIN
+    DIALOG  "", IDDLG_IMAGEINFOPAGE, 91, 31, 169, 109, NOT FS_DLGBORDER | 
+            WS_VISIBLE
+    BEGIN
+        GROUPBOX        "Bild Information", IDGB_IMAGEINFO, 6, 4, 140, 64, 
+                        NOT WS_GROUP
+        LTEXT           "Breite:", IDST_IMAGEWIDTHLABEL, 11, 30, 76, 8
+        LTEXT           "Hhe:", IDST_IMAGEHEIGHTLABEL, 11, 18, 76, 8
+        LTEXT           "Farbtiefe:", IDST_COLORDEPTHLABEL, 11, 7, 76, 8
+        LTEXT           "??", IDST_IMAGEWIDTH, 102, 30, 36, 8
+        LTEXT           "??", IDST_IMAGEHEIGHT, 102, 18, 36, 8
+        LTEXT           "??", IDST_COLORDEPTH, 102, 7, 36, 8
+        LTEXT           "", IDST_IMAGEFORMAT, 43, 40, 100, 16, DT_WORDBREAK
+        LTEXT           "Typ:", 309, 11, 48, 30, 8
+    END
+END
+
Index: /tags/CWMM-0.3.0_GA/nlv/de/classes/res/cwaudio_de.rc
===================================================================
--- /tags/CWMM-0.3.0_GA/nlv/de/classes/res/cwaudio_de.rc	(revision 213)
+++ /tags/CWMM-0.3.0_GA/nlv/de/classes/res/cwaudio_de.rc	(revision 213)
@@ -0,0 +1,127 @@
+#ifndef OS2_INCLUDED
+   #include <os2.h>
+#endif
+
+MENU ID_MENU_VOLUME
+BEGIN
+        MENUITEM "~Lautstrke",ID_MENU_VOLUME       
+END
+
+MENU ID_MENU_START
+BEGIN
+        MENUITEM "~Start",ID_MENU_START       
+END
+
+MENU ID_MENU_STOP
+BEGIN
+        MENUITEM "~Stopp", ID_MENU_STOP       
+END
+
+MENU ID_MENU_PAUSE
+BEGIN
+        MENUITEM "~Pause", ID_MENU_PAUSE       
+END
+
+MENU ID_MENU_RESUME
+BEGIN
+        MENUITEM "~Fortsetzen", ID_MENU_RESUME       
+END
+
+MENU ID_MENU_EDITOR
+BEGIN
+        MENUITEM "~Audioeditor", ID_MENU_EDITOR       
+END
+
+MENU ID_MENU_PLAYER
+BEGIN
+        MENUITEM "S~pieler", ID_MENU_PLAYER
+END
+
+MENU ID_MENU_CONVERT
+BEGIN
+	SUBMENU  "~Umsetzen in",ID_MENU_CONVERT
+	BEGIN
+        MENUITEM "~WAV (RIFF WAVE Digital Audio)", ID_ITEM_CONVERT
+	END
+END
+
+MENU ID_MENUICONSIZE
+BEGIN
+   MENUITEM "Normale Symbole", ID_NORMALICONSITEM
+   MENUITEM  "50 * 50" , ID_50X50ITEM
+   MENUITEM  "100 * 100" , ID_100X100ITEM
+   MENUITEM  "150 * 150" , ID_150X150ITEM
+   MENUITEM  "200 * 200" , ID_200X200ITEM
+   MENUITEM  "250 * 250" , ID_250X250ITEM
+END
+
+MENU ID_MENU_M3UEDITOR
+BEGIN
+        MENUITEM "Playlist-~Editor", ID_MENU_M3UEDITOR       
+END
+
+MENU ID_MENU_M3UPLAYER
+BEGIN
+        MENUITEM "Liste ~spielen", ID_MENU_M3UPLAYER       
+END
+
+
+STRINGTABLE 
+BEGIN
+ID_WAVEINFOPAGENAME "~Audio-Information"
+ID_ID3TAGSPAGENAME  "~ID3-Tags"
+ID_TRACKNAMEPAGENAME "~Trackname"
+IDSTR_TRACKNAME      "Trackname"
+
+IDSTR_PLAYTIME      "Spielzeit"
+IDSTR_SAMPLERATE    "Samplerate"
+IDSTR_CHANNELS      "Kanle"
+IDSTR_BPS           "Bits pro Sample"
+
+;IDSTR_BITRATE       "Bitrate"
+;IDSTR_VBR           "VBR"
+
+IDSTR_TITLE         "Titel"
+IDSTR_ARTIST        "Interpret"
+IDSTR_ALBUM         "Album"
+IDSTR_YEAR          "Jahr"
+IDSTR_COMMENT       "Kommentar"
+IDSTR_GENRE         "Genre"
+
+IDSTR_CWMMDATAFILETITLE "MM-Datei"
+IDSTR_HELPLIBRARY      "MMPARTS.HLP"
+;Titles of audio classes
+IDSTR_CWAUDIOTITLE   "Digital Audio"
+IDSTR_AIFTITLE       "AIFAudio.AIF"
+IDSTR_AUTITLE        "AUAudio.AU"
+IDSTR__AUTITLE       "_AUAudio._AU"
+IDSTR_IFFTITLE       "IFFAudio.IFF"
+IDSTR_SNDFTITLE      "SNDAudio.SND"
+IDSTR_VOCTITLE       "VOCAudio.VOC"
+IDSTR_WAVTITLE       "WAVAudio.WAV"
+IDSTR_OGGTITLE       "OGGAudio.OGG"
+IDSTR_MP3TITLE       "MP3Audio.MP3"
+IDSTR_MIDITITLE       "MIDI.MID"
+IDSTR_FLACTITLE       "FLACAudio.FLA"
+IDSTR_LIGHTTABLETITLE "Leuchttisch"
+
+IDSTR_ICONSIZEMENU    "Symbolgráe"
+;Used as an information when starting and audio file from the WPS
+IDSTR_STARTINGTRACK      "Starte Track..."
+;Title for audiofile scanning window
+IDSTR_AUDIOSCANNING     "berprfe Audiodatei..."
+IDSTR_AUDIOSTREAMTITLE  "Audio-Stream"
+IDSTR_STREAMURLPAGENAME "~URL-Angabe"
+IDSTR_CDTRACKTITLE      "CD-Track"
+IDSTR_M3UTITLE          "M3U-Playlist"
+;Titles used when starting player and editor applications
+IDSTR_AUDPLAYERTITLE       "Audio-Spieler"
+IDSTR_AUDEDITORTITLE       "Audio-Editor"
+IDSTR_M3UEDITORTITLE       "Playlist-Editor"
+IDSTR_TRACKPAUSED          " (Pause)"
+;Used for window list
+IDSTR_VOLUMETITLE           "Lautstrke"
+
+END
+
+
Index: /tags/CWMM-0.3.0_GA/nlv/de/classes/res/cwimage_de.rc
===================================================================
--- /tags/CWMM-0.3.0_GA/nlv/de/classes/res/cwimage_de.rc	(revision 213)
+++ /tags/CWMM-0.3.0_GA/nlv/de/classes/res/cwimage_de.rc	(revision 213)
@@ -0,0 +1,49 @@
+#ifndef OS2_INCLUDED
+   #include <os2.h>
+#endif
+
+
+MENU ID_MENU_IMGEDITOR
+BEGIN
+        MENUITEM "Bild~editor", ID_MENU_IMGEDITOR       
+END
+
+
+STRINGTABLE 
+BEGIN
+IDSTR_MENU_CONVERT "~Umsetzen in"
+ 
+IDSTR_AVCTITLE      "AVCImage._IM"
+IDSTR_DIBTITLE      "DIBImage.DIB"
+IDSTR_GIFTITLE      "GIFImage.GIF"
+IDSTR_JPGTITLE      "JPGImage.JPG"
+IDSTR_PCDTITLE      "PCDImage.PCD"
+IDSTR_PCXTITLE      "PCXImage.PCX"
+IDSTR_TGATITLE      "TargaImage.TGA"
+IDSTR_TIFTITLE      "TIFImage.TIF"
+IDSTR_PNGTITLE      "PNGImage.PNG"
+IDSTR_MMOTIONTITLE  "VIDImage.VID"
+IDSTR_CWIMAGETITLE  "Digitales Bild"
+
+IDSTR_IMAGEINFOPAGENAME "~Bild-Information"
+IDSTR_SPRINTFPIXEL	"%d Pixel"
+IDSTR_SPRINTFBIT       "%d Bit"
+;Bitmpap load errors
+IDSTR_NOIMGIOPROCERROR   "Keine Ein/Ausgabeprozedur zum Laden des Bildes gefunden."
+IDSTR_OPENFILEERRORTITLE "Dateifehler"
+IDSTR_OPENFILEERROR      "Datei kann nicht geffnet werden."
+IDSTR_NOMEMERROR         "Nicht gengend Speicher verfgbar!"
+IDSTR_IMGIOPROCCRASH     "Ein interner Fehler trat beim ffnen des Bildes auf. Die Arbeitsoberflche MUSS neu gestartet werden, andernfalls kann es zu Stabilittsproblemen kommen! Alle laufenden Programme bleiben gestartet."
+
+IDSTR_IMAGEDETAIL_WIDTH   "Breite"
+IDSTR_IMAGEDETAIL_HEIGHT  "Hhe"
+IDSTR_IMAGEDETAIL_DEPTH   "Farbtiefe"
+IDSTR_IMAGEDETAIL_FORMAT  "Format"
+;Titles used when starting player and editor applications
+IDSTR_IMGEDITORTITLE       "Bildanzeige"
+IDSTR_MENU_IMAGEINFO        "Bild-Information: %d x %d x %d"
+
+;IDSTR_HELPLIBRARY   "MMPARTS.HLP"
+END
+
+
Index: /tags/CWMM-0.3.0_GA/nlv/de/classes/res/cwvideo_de.rc
===================================================================
--- /tags/CWMM-0.3.0_GA/nlv/de/classes/res/cwvideo_de.rc	(revision 213)
+++ /tags/CWMM-0.3.0_GA/nlv/de/classes/res/cwvideo_de.rc	(revision 213)
@@ -0,0 +1,13 @@
+
+STRINGTABLE 
+BEGIN
+;Titles of video classes
+IDSTR_CWVIDEOTITLE       "Digital Video"
+IDSTR_MPGTITLE       	 "MPGVideo.MPG"
+IDSTR_MOVTITLE       	 "MOVVideo.MOV"
+IDSTR_FLITITLE       	 "FLIVideo.FLI"
+IDSTR_AVITITLE       	 "AVIVideo.AVI"
+IDSTR_VIDPLAYERTITLE       "Video-Spieler"
+
+END
+
Index: /tags/CWMM-0.3.0_GA/nlv/de/classes/res/imageconv_de.dlg
===================================================================
--- /tags/CWMM-0.3.0_GA/nlv/de/classes/res/imageconv_de.dlg	(revision 213)
+++ /tags/CWMM-0.3.0_GA/nlv/de/classes/res/imageconv_de.dlg	(revision 213)
@@ -0,0 +1,29 @@
+#ifndef OS2_INCLUDED
+   #include <os2.h>
+#endif
+
+DLGTEMPLATE IDDLG_IMGCONVERT LOADONCALL MOVEABLE DISCARDABLE
+BEGIN
+    DIALOG  "Bilddatei konvertieren", IDDLG_IMGCONVERT, 68, 78, 207, 191, 
+            WS_VISIBLE, FCF_SYSMENU | FCF_TITLEBAR
+    BEGIN
+        GROUPBOX        "", IDGB_IMGCONVERT, 2, 19, 203, 172
+        LTEXT           "Name:", IDST_IMGCONVERTNAMELABEL, 7, 173, 32, 8
+        LTEXT           "", IDST_IMGCONVERTNAME, 45, 173, 156, 8
+        CONTROL         "", IDSR_BMP, 12, 100, 185, 69, WC_STATIC, 
+                        SS_FGNDRECT | WS_GROUP | WS_VISIBLE
+        LTEXT           "Konvertieren zu", IDST_IMGCONVERTTO, 7, 88, 53, 8
+        CONTROL         "", IDDD_IMGIOPROC, 6, 6, 196, 78, WC_COMBOBOX, 
+                        CBS_DROPDOWNLIST | LS_HORZSCROLL | WS_GROUP | 
+                        WS_TABSTOP | WS_VISIBLE
+        LTEXT           "Zielname:", 2419, 7, 57, 64, 8
+        ENTRYFIELD      "", IDEF_IMGCONVERTTARGETNAME, 9, 45, 139, 8, ES_MARGIN
+        PUSHBUTTON      "~Suchen...", IDPB_IMGCONVERTBROWSE, 153, 42, 47, 14
+        CONTROL         "", IDBAR_IMGCONVERTPROGRESS, 6, 24, 194, 13, 
+                        "CW_PERCENTBAR", 5 | WS_GROUP | WS_VISIBLE
+        DEFPUSHBUTTON   "~Konvertieren", IDPB_IMGCONVERTOK, 20, 2, 47, 14
+        PUSHBUTTON      "~Abbruch", IDPB_IMGCONVERTABORT, 71, 2, 40, 14
+        PUSHBUTTON      "~Schlieáen", IDPB_IMGCONVERTCLOSE, 135, 2, 40, 14
+    END
+END
+
Index: /tags/CWMM-0.3.0_GA/nlv/de/classes/res/imageconv_de.rc
===================================================================
--- /tags/CWMM-0.3.0_GA/nlv/de/classes/res/imageconv_de.rc	(revision 213)
+++ /tags/CWMM-0.3.0_GA/nlv/de/classes/res/imageconv_de.rc	(revision 213)
@@ -0,0 +1,8 @@
+#ifndef OS2_INCLUDED
+   #include <os2.h>
+#endif
+
+STRINGTABLE
+BEGIN
+IDSTR_IMAGEBROWSETITLE   "Bild-Dateiname"
+END
Index: /tags/CWMM-0.3.0_GA/nlv/de/classes/res/makefile
===================================================================
--- /tags/CWMM-0.3.0_GA/nlv/de/classes/res/makefile	(revision 213)
+++ /tags/CWMM-0.3.0_GA/nlv/de/classes/res/makefile	(revision 213)
@@ -0,0 +1,38 @@
+# Makefile for CWMM resource dll
+
+include ../../../../make.inc
+include ../../../../build.inc
+
+LANGUAGE	=	_de
+
+CC           = icc
+CPPFLAGS     = /Ge- /Gm+ /G4 /Gl  /O+ /Oc+ /Ol- /Q+ $(VACDEBUG)
+INC	=	$(MMSRCBASE)/classes/inc
+DEFS         = 
+
+OBJDIR	=	$(NLVBASE)/out/$(LANGUAGE)
+
+OBJECTS	= 	$(INC)\mmres.h mmres$(LANGUAGE).rc \
+			audioplayer$(LANGUAGE).dlg audioplayer$(LANGUAGE).rc \
+			audioconv$(LANGUAGE).dlg audioconv$(LANGUAGE).rc \
+			volume$(LANGUAGE).rc volume$(LANGUAGE).dlg \
+			imageconv$(LANGUAGE).dlg imageconv$(LANGUAGE).rc \
+			cwaudio_de.rc cwaudio_de.dlg cwimage_de.rc cwvideo_de.rc \
+			mmfind$(LANGUAGE).dlg mmfind$(LANGUAGE).rc
+
+
+all:	$(OBJDIR)/mmres$(LANGUAGE).dll mmres$(LANGUAGE).def
+
+$(OBJDIR)/mmres$(LANGUAGE).dll:	mmres$(LANGUAGE).c $(OBJECTS) mmres$(LANGUAGE).def
+#		icc $(CPPFLAGS) -I$(INC) /Fe$(OBJDIR)\$@ $< mmres$(LANGUAGE).def
+		icc $(CPPFLAGS) -I$(INC) /Fe$@ $< mmres$(LANGUAGE).def
+		rc -D $(ECS) -i $(INC) mmres$(LANGUAGE).rc $(OBJDIR)/mmres$(LANGUAGE).dll
+		rc -r -D $(ECS) -i $(INC) mmres$(LANGUAGE).rc $(OBJDIR)/mmres$(LANGUAGE).res
+                		
+clean:
+	-rm $(OBJDIR)/*.obj
+	-rm $(OBJDIR)/*.dll
+	-rm *.*~
+	-rm *.flc
+	-rm *.RES
+	-rm *.obj
Index: /tags/CWMM-0.3.0_GA/nlv/de/classes/res/mmfind_de.dlg
===================================================================
--- /tags/CWMM-0.3.0_GA/nlv/de/classes/res/mmfind_de.dlg	(revision 213)
+++ /tags/CWMM-0.3.0_GA/nlv/de/classes/res/mmfind_de.dlg	(revision 213)
@@ -0,0 +1,55 @@
+#ifndef OS2_INCLUDED
+   #include <os2.h>
+#endif
+
+DLGTEMPLATE IDDLG_MMFIND LOADONCALL MOVEABLE DISCARDABLE
+BEGIN
+    DIALOG  "Multimedia-Datei finden", IDDLG_MMFIND, 12, 23, 338, 133, WS_VISIBLE | WS_SYNCPAINT, 
+            FCF_SYSMENU | FCF_TITLEBAR
+            PRESPARAMS PP_FONTNAMESIZE, "9.WarpSans"
+    BEGIN
+        LTEXT           "Dateiname", 257, 4, 120, 51, 9, DT_VCENTER | 
+                        NOT WS_GROUP
+        ENTRYFIELD      "*", 258, 55, 120, 239, 7, ES_MARGIN | WS_GROUP
+        LTEXT           "Laufwerk", 259, 4, 108, 51, 9, DT_VCENTER | NOT 
+                        WS_GROUP
+        CONTROL         "", 260, 54, 18, 87, 99, WC_COMBOBOX, 
+                        CBS_DROPDOWNLIST | WS_TABSTOP | WS_VISIBLE
+        LTEXT           "Restrict files to", 261, 174, 4, 46, 9, DT_VCENTER | 
+                        NOT WS_GROUP | NOT WS_VISIBLE
+        CONTROL         "<All Files>", 262, 209, 4, 29, 8, WC_COMBOBOX, 
+                        CBS_DROPDOWNLIST | WS_TABSTOP
+        LTEXT           "Verzeichnis", 263, 4, 97, 35, 7, NOT WS_GROUP
+        LTEXT           "", 270, 42, 98, 60, 6, NOT WS_GROUP | NOT 
+                        WS_VISIBLE
+        LTEXT           "Datei", 265, 131, 97, 17, 7, NOT WS_GROUP
+        AUTOCHECKBOX    "Read-Only", 269, 171, 97, 42, 8, NOT WS_TABSTOP | 
+                        NOT WS_VISIBLE
+        LISTBOX         264, 4, 17, 116, 76, LS_OWNERDRAW | LS_HORZSCROLL
+        LISTBOX         266, 125, 17, 116, 76, LS_HORZSCROLL
+        RTEXT           "Dateityp", IDST_TYPE, 146, 108, 58, 9, DT_VCENTER
+        CONTROL         "", IDCB_TYPEOFFILE, 208, 18, 87, 99, WC_COMBOBOX, 
+                        CBS_DROPDOWNLIST | WS_GROUP | WS_TABSTOP | 
+                        WS_VISIBLE
+        GROUPBOX        "Vorschau", IDGB_PREVIEW, 245, 16, 89, 80, NOT WS_VISIBLE
+        CONTROL         "", IDSR_IMGPREVIEW, 249, 20, 82, 68, WC_STATIC, SS_FGNDRECT | 
+                        WS_GROUP
+        CTEXT           "Keine Vorschau verfgbar", IDST_NOPREVIEWAVAILABLE, 251, 42, 78, 33, 
+                        DT_WORDBREAK | NOT WS_VISIBLE
+        LTEXT           "", IDST_AUDIOINFO, 253, 41, 75, 42, DT_WORDBREAK | NOT 
+                        WS_VISIBLE
+        GROUPBOX        "Audio-Information", IDGB_AUDIOINFO, 245, 17, 89, 79, NOT WS_VISIBLE
+        PUSHBUTTON      "Stop", IDPB_MMFINDSTOP, 267, 19, 21, 10, 
+                        BS_NOPOINTERFOCUS | NOT WS_TABSTOP
+        PUSHBUTTON      "Play", IDPB_MMFINDPLAY, 291, 19, 21, 10, 
+                        BS_NOPOINTERFOCUS | NOT WS_TABSTOP
+        DEFPUSHBUTTON   "~OK", DID_OK, 3, 2, 40, 12
+        PUSHBUTTON      "~Neu...", IDPB_NEWFILE, 46, 2, 40, 12
+        PUSHBUTTON      "Apply", 268, 293, 3, 40, 12, NOT WS_TABSTOP | NOT 
+                        WS_VISIBLE
+        PUSHBUTTON      "~Abbruch", DID_CANCEL, 95, 2, 40, 12, NOT WS_TABSTOP
+        PUSHBUTTON      "Hilfe", 267, 243, 2, 40, 12, BS_NOPOINTERFOCUS | NOT 
+                        WS_TABSTOP | NOT WS_VISIBLE
+        LISTBOX         3, 0, 0, 2, 1, NOT WS_TABSTOP | NOT WS_VISIBLE
+    END
+END
Index: /tags/CWMM-0.3.0_GA/nlv/de/classes/res/mmfind_de.rc
===================================================================
--- /tags/CWMM-0.3.0_GA/nlv/de/classes/res/mmfind_de.rc	(revision 213)
+++ /tags/CWMM-0.3.0_GA/nlv/de/classes/res/mmfind_de.rc	(revision 213)
@@ -0,0 +1,13 @@
+#ifndef OS2_INCLUDED
+   #include <os2.h>
+#endif
+
+STRINGTABLE
+BEGIN
+IDSTR_TYPEAUDIO       "Audiodatei"
+IDSTR_TYPEIMAGE       "Bilddatei"
+IDSTR_TYPEVIDEO       "Videodatei"
+IDSTR_AUDIOINFOTEXT   "Spielzeit:\t%02d:%02d\x0a\x0aSamplerate:\t%d\x0a\x0aBits pro Sample:\t%d\x0a\x0aKanle:\t\t%d"
+IDSTR_NOMMTEMPLATEFLDRTITLE "Fehler bei Dateierstellung"
+IDSTR_NOMMTEMPLATEFLDR "Multimedia-Schablonenordner kann nicht gefunden werden. Mglicherweise ist die Objekt-ID <MMPM2_MMTEMPLATEFOLDER> verloren gegangen."
+END
Index: /tags/CWMM-0.3.0_GA/nlv/de/classes/res/mmres_de.DEF
===================================================================
--- /tags/CWMM-0.3.0_GA/nlv/de/classes/res/mmres_de.DEF	(revision 213)
+++ /tags/CWMM-0.3.0_GA/nlv/de/classes/res/mmres_de.DEF	(revision 213)
@@ -0,0 +1,27 @@
+; mediafolderres.DEF: DEF-file for mmres_de.dll
+;
+;                    (C) Chris Wohlgemuth 2003
+;/*
+; * This program is free software; you can redistribute it and/or modify
+; * it under the terms of the GNU General Public License as published by
+; * the Free Software Foundation; either version 2, or (at your option)
+; * any later version.
+; *
+; * This program is distributed in the hope that it will be useful,
+; * but WITHOUT ANY WARRANTY; without even the implied warranty of
+; * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+; * GNU General Public License for more details.
+; *
+; * You should have received a copy of the GNU General Public License
+; * along with this program; see the file COPYING.  If not, write to
+; * the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
+; */
+
+LIBRARY MMRES_DE INITGLOBAL
+DESCRIPTION '$@#(c) Chris Wohlgemuth :0.2 (13.03.02) (mmres_de.DLL)#@##1## 13.03.2002 18:17:00      My ;-)  ::::1::@@Resource-DLL'
+PROTMODE
+CODE LOADONCALL DISCARDABLE
+DATA SINGLE SHARED DISCARDABLE
+EXPORTS  
+        queryLanguage
+
Index: /tags/CWMM-0.3.0_GA/nlv/de/classes/res/mmres_de.c
===================================================================
--- /tags/CWMM-0.3.0_GA/nlv/de/classes/res/mmres_de.c	(revision 213)
+++ /tags/CWMM-0.3.0_GA/nlv/de/classes/res/mmres_de.c	(revision 213)
@@ -0,0 +1,26 @@
+/*
+ * This file is (C) Chris Wohlgemuth 2003
+ */
+/*
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; see the file COPYING.  If not, write to
+ * the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+
+#include <os2.h>
+
+PSZ queryLanguage()
+{
+  return "Deutsch";
+}
+
Index: /tags/CWMM-0.3.0_GA/nlv/de/classes/res/mmres_de.rc
===================================================================
--- /tags/CWMM-0.3.0_GA/nlv/de/classes/res/mmres_de.rc	(revision 213)
+++ /tags/CWMM-0.3.0_GA/nlv/de/classes/res/mmres_de.rc	(revision 213)
@@ -0,0 +1,38 @@
+#define  INCL_GRAPHICBUTTON   /* need this for the graphic buttons control */
+#define  INCL_BITMAP
+
+#ifndef OS2_INCLUDED
+   #include <os2.h>
+#endif
+#include <sw.h>
+
+#include "mmres.h"
+
+;#include "version.h"
+;#include "build.h"
+
+
+;Dialog Resources for volume.exe
+rcinclude "volume_de.rc"
+rcinclude "volume_de.dlg"
+
+rcinclude "audioconv_de.rc"
+rcinclude "audioconv_de.dlg"
+
+rcinclude "imageconv_de.rc"
+rcinclude "imageconv_de.dlg"
+
+rcinclude "audioplayer_de.rc"
+rcinclude "audioplayer_de.dlg"
+
+rcinclude "classvolume_de.dlg"
+
+rcinclude "cwaudio_de.rc"
+rcinclude "cwaudio_de.dlg"
+
+rcinclude "cwimage_de.rc"
+rcinclude "cwvideo_de.rc"
+
+rcinclude "mmfind_de.rc"
+rcinclude "mmfind_de.dlg"
+
Index: /tags/CWMM-0.3.0_GA/nlv/de/classes/res/volume_de.dlg
===================================================================
--- /tags/CWMM-0.3.0_GA/nlv/de/classes/res/volume_de.dlg	(revision 213)
+++ /tags/CWMM-0.3.0_GA/nlv/de/classes/res/volume_de.dlg	(revision 213)
@@ -0,0 +1,20 @@
+#ifndef OS2_INCLUDED
+   #include <os2.h>
+#endif
+#define INCL_GRAPHICBUTTON
+#include <sw.h>
+
+DLGTEMPLATE IDDLG_VOLUME LOADONCALL MOVEABLE DISCARDABLE
+BEGIN
+    DIALOG  "Lautstrke", IDDLG_VOLUME, 73, 148, 112, 56,  
+             WS_VISIBLE, FCF_SYSMENU | FCF_TITLEBAR |  FCF_TASKLIST |
+            FCF_MINBUTTON 
+    BEGIN
+        CONTROL         "~Lautstrke", IDCS_VOLUME, 3, 3, 63, 44, WC_CIRCULARSLIDER, 
+                        WS_GROUP | WS_VISIBLE | WS_TABSTOP
+        CONTROL         "~Stumm", IDPB_MUTE , 65, 17, 40, 14, WC_GRAPHICBUTTON,
+			 WS_VISIBLE | GBS_AUTOTWOSTATE | WS_TABSTOP
+        GROUPBOX        "", IDGB_VOLUME,  1, 2, 109, 53
+    END
+END
+
Index: /tags/CWMM-0.3.0_GA/nlv/de/classes/res/volume_de.rc
===================================================================
--- /tags/CWMM-0.3.0_GA/nlv/de/classes/res/volume_de.rc	(revision 213)
+++ /tags/CWMM-0.3.0_GA/nlv/de/classes/res/volume_de.rc	(revision 213)
@@ -0,0 +1,12 @@
+#ifndef OS2_INCLUDED
+   #include <os2.h>
+#endif
+
+MENU    IDM_POPUP
+BEGIN
+    MENUITEM    "Titelleiste ~verdecken",    IDM_ITEMTITLEBAR
+    MENUITEM    "",    0, MIS_SEPARATOR
+    MENUITEM    "~Beenden",    IDM_ITEMEXIT
+END
+
+
Index: /tags/CWMM-0.3.0_GA/nlv/de/makefile
===================================================================
--- /tags/CWMM-0.3.0_GA/nlv/de/makefile	(revision 213)
+++ /tags/CWMM-0.3.0_GA/nlv/de/makefile	(revision 213)
@@ -0,0 +1,5 @@
+
+all:
+	@echo "[33;1;m Creating $(LANGUAGE) [0;m"
+	-@mkdir $(NLVBASE)/out/_$(LANGUAGE) 2>nul 1>nul
+	@cd $(CURDIR)/classes/res && make LANGUAGE=_$(LANGUAGE) && cd .. 
Index: /tags/CWMM-0.3.0_GA/nlv/makefile
===================================================================
--- /tags/CWMM-0.3.0_GA/nlv/makefile	(revision 213)
+++ /tags/CWMM-0.3.0_GA/nlv/makefile	(revision 213)
@@ -0,0 +1,104 @@
+# Makefile
+
+include ../make.inc
+
+#######################################
+#
+# Define *.hlp files.
+#
+#######################################
+HLP_FILES	=	./Help/de/cwmm049.hlp \
+			./Help/en/cwmm.hlp \
+			./Help/nl/cwmm031.hlp \
+			./Help/it/cwmm039.hlp
+
+###################################
+#
+#  Rules for generating the NLV
+#  ressources.
+#
+###################################
+nlv:
+	-@mkdir $(NLVBASE)/out
+	@echo "[35;1;mCreating laguage resources for MM base classes.[0;m"
+	@for i in $(LANGUAGES); \
+	do \
+		cd $(CURDIR)/$$i && make LANGUAGE=$$i && cd .. ; \
+	done
+	
+
+###################################
+#
+#  Rules for generating online help
+#
+###################################
+# German
+./Help/de/cwmm049.hlp:	./Help/de/cwmm049.ipf 
+	cd ./Help/de && make 	
+
+# English
+./Help/en/cwmm.hlp:	./Help/en/cwmm.ipf
+	cd ./Help/en && make
+
+# Dutch
+./Help/nl/cwmm031.hlp:	./Help/nl/cwmm031.ipf
+	cd ./Help/nl && make
+
+# Italian
+./Help/it/cwmm039.hlp:	./Help/it/cwmm039.ipf
+	cd ./Help/it && make
+
+
+###################################
+#
+#  Rules for cleaning the tree
+#
+###################################
+
+clean_nlv:
+	@for i in $(LANGUAGES); \
+	do \
+		cd $(CURDIR)/$$i && make LANGUAGE=_$$i clean && cd .. ; \
+	done
+
+clean:	clean_nlv
+	-cd ./common_res && make clean
+
+clean2:
+	-cd $(OBJDIR) && rm *.obj
+	-cd ./include && rm *.ih
+	-cd ./include && rm *.h
+	-cd ./include && rm *.hh
+	-cd $(LIBDIR) && rm *.obj
+	-rm *.dll
+	-rm *.map
+	-rm *.sym
+	-cd ./Help/de && make clean
+	-cd ./Help/en && make clean
+	-cd ./Help/nl && make clean
+	-cd ./Help/it && make clean
+	-cd ./res && make clean
+	-cd ./mm-progs && make clean
+
+
+cleaner:
+	-cd ./c && make clean
+	-cd ./common_functions && make cleaner
+	-cd ./mm-progs && make cleaner
+	-cd ./Help/de && make cleaner
+	-cd ./Help/en && make cleaner
+	-cd ./Help/nl && make cleaner
+	-cd ./Help/it && make cleaner
+	-cd ./res && make cleaner
+	-cd ./mm-progs && make cleaner
+	-cd ./include && rm *.*~
+	-cd ./inc && rm *.*~
+	-cd $(IDLDIR)/idl_audio && rm *.*~
+	-cd $(IDLDIR)/idl_image && rm *.*~
+	-cd $(IDLDIR)/idl_mm && rm *.*~
+	-cd $(IDLDIR)/idl_video && rm *.*~
+
+distribution:
+	make
+
+
Index: /tags/CWMM-0.3.0_GA/old_inst/install.CMD
===================================================================
--- /tags/CWMM-0.3.0_GA/old_inst/install.CMD	(revision 213)
+++ /tags/CWMM-0.3.0_GA/old_inst/install.CMD	(revision 213)
@@ -0,0 +1,56 @@
+/* rexx - Install the CW-Audio classes */
+
+call RxFuncAdd 'SysLoadFuncs', 'RexxUtil', 'SysLoadFuncs'
+call SysLoadFuncs
+
+curDir=DIRECTORY()
+
+
+call SysCls
+SAY ''
+SAY 'This skript will install the CWAudio classes.'
+SAY 'Do you want to continue?'
+SAY ''
+SAY 'Enter Y for yes and N for no.'
+SAY ''
+SAY '> '
+parse value SysCurPos() with aktzeile aktspalte
+newposition=SysCurPos(aktzeile-1,2)
+
+resp=LINEIN()
+IF TRANSLATE(resp)='N' THEN EXIT
+
+classDLL=DIRECTORY()||'\cwmm.dll'
+
+rc=SysRegisterObjectClass('CWAudio', classDLL)
+IF rc=0 THEN DO
+	SAY 'Error while registering the class.'
+	'@PAUSE'
+	Exit
+END
+'repclass MMAudio CWAudio'
+
+SAY 'Registering MP3-Class...'
+rc=SysRegisterObjectClass('CWMP3', classDLL)
+IF rc=0 THEN DO
+	SAY 'Error while registering the class.'
+	SAY 'Only the icon will be wrong now.' 
+END
+
+
+SAY 'Registering Ogg-Class...'
+rc=SysRegisterObjectClass('CWOGG', classDLL)
+IF rc=0 THEN DO
+	SAY 'Error while registering the class.'
+	SAY 'Only the icon will be wrong now.' 
+END
+
+SAY 'Registering CDTrack-Class...'
+rc=SysRegisterObjectClass('CWCDTrack', classDLL)
+IF rc=0 THEN DO
+	SAY 'Error while registering the class.'
+END
+
+'@PAUSE'
+EXIT
+
Index: /tags/CWMM-0.3.0_GA/old_inst/install.txt
===================================================================
--- /tags/CWMM-0.3.0_GA/old_inst/install.txt	(revision 213)
+++ /tags/CWMM-0.3.0_GA/old_inst/install.txt	(revision 213)
@@ -0,0 +1,4 @@
+If you have problems installing the classes using the
+generic installer put these programs and scripts into
+the root of the unzipped package and start install.cmd.
+
Index: /tags/CWMM-0.3.0_GA/old_inst/rep.CMD
===================================================================
--- /tags/CWMM-0.3.0_GA/old_inst/rep.CMD	(revision 213)
+++ /tags/CWMM-0.3.0_GA/old_inst/rep.CMD	(revision 213)
@@ -0,0 +1,10 @@
+/* */
+ call RxFuncAdd 'SysLoadFuncs', 'RexxUtil', 'SysLoadFuncs'
+ call SysLoadFuncs
+
+
+repCmd='repclass.exe  2>NUL 1>NUL'
+
+repCmd
+
+SAY RC
Index: /tags/CWMM-0.3.0_GA/old_inst/uninst.CMD
===================================================================
--- /tags/CWMM-0.3.0_GA/old_inst/uninst.CMD	(revision 213)
+++ /tags/CWMM-0.3.0_GA/old_inst/uninst.CMD	(revision 213)
@@ -0,0 +1,49 @@
+/* rexx -  Uninstall the CW-Audio classes */
+
+call RxFuncAdd 'SysLoadFuncs', 'RexxUtil', 'SysLoadFuncs'
+call SysLoadFuncs
+
+call SysCls
+SAY ''
+SAY 'This skript will remove the CWAudio classes.'
+SAY 'Do you want to continue?'
+SAY ''
+SAY 'Enter Y for yes and N for no.'
+SAY ''
+SAY '> '
+parse value SysCurPos() with aktzeile aktspalte
+newposition=SysCurPos(aktzeile-1,2)
+
+resp=LINEIN()
+IF TRANSLATE(resp)='N' THEN EXIT
+
+
+rc=SysDeRegisterObjectClass('CWMP3')
+IF rc=0 THEN DO
+	SAY 'Error while deregistering the MP3-class.'
+END
+ELSE
+	SAY 'MP3-class deregistered.'
+
+rc=SysDeRegisterObjectClass('CWOGG')
+IF rc=0 THEN DO
+	SAY 'Error while deregistering the Ogg-class.'
+END
+ELSE
+	SAY 'Ogg-class deregistered.'
+
+rc=SysDeRegisterObjectClass('CWCDTrack')
+IF rc=0 THEN DO
+	SAY 'Error while deregistering the CDTrack-class.'
+END
+ELSE
+	SAY 'CDTrack-class deregistered.'
+
+'repclass MMAudio CWAudio u' 
+rc=SysDeRegisterObjectClass('CWAudio')
+IF rc=0 THEN DO
+	SAY 'Error while deregistering the CWAudio replacement class.'
+END
+'@PAUSE'
+Exit
+
Index: /tags/CWMM-0.3.0_GA/prepare.CMD
===================================================================
--- /tags/CWMM-0.3.0_GA/prepare.CMD	(revision 213)
+++ /tags/CWMM-0.3.0_GA/prepare.CMD	(revision 213)
@@ -0,0 +1,11 @@
+/* Reset the read only flag of the folder and all subfolders */
+
+'cp -r f:/emx r:/emx'
+'cp -r f:/IBMCPP r:/IBMCPP'
+'rm -r r:/IBMCPP/SAMPLES'
+'rm -r r:/IBMCPP/INCLUDE_when_not_tk45'
+'rm -r r:/IBMCPP/TUTORIAL'
+'rm -r r:/IBMCPP/_include'
+EXIT
+
+
Index: /tags/CWMM-0.3.0_GA/readme_shl.txt
===================================================================
--- /tags/CWMM-0.3.0_GA/readme_shl.txt	(revision 213)
+++ /tags/CWMM-0.3.0_GA/readme_shl.txt	(revision 213)
@@ -0,0 +1,21 @@
+
+How the Trunk was Built
+
+2017-07-12 SHL Baseline
+
+The trunk was built from the contents of the zip files stashed in
+tags/imported-zips.
+
+The zip files are dirty in the sense that they contain a combination of
+build sources, backup files, build products and some other cruft.
+
+This initial import was a best efforts to import a buildable set of files.
+However, it is not unlikely that some files were missed.  If so, they should
+be found in one of the zip files and should be "svn added" to the trunk.
+
+It is also likely that some build products where committed to the trunk.  If
+so, they should be "svn removed" from the trunk.
+
+Have fun
+
+Steven
Index: /tags/CWMM-0.3.0_GA/slide-show/Readme.txt
===================================================================
--- /tags/CWMM-0.3.0_GA/slide-show/Readme.txt	(revision 213)
+++ /tags/CWMM-0.3.0_GA/slide-show/Readme.txt	(revision 213)
@@ -0,0 +1,134 @@
+Slide Show V1.00 23.10.2004
+------------------------
+
+This little program displays image files contained in one or more
+folders as a slide show. Fullscreen and windowed mode is possible.
+The images may be presented in a randomized order.
+
+
+Installation
+---------
+There's not much about installation. Create an program object pointing to
+the executable and you're done. This may be done using the supplied script
+createob.cmd.
+
+
+Usage
+-----
+
+Just start the program and you're welcomed by the main dialog where you
+may change settings and select directories to be shown. Note: the directory
+list is drag and drop enabled.
+
+If you start the program with a directory as the parameter the contents is
+displayed imediatly in a window.
+
+You may switch to fullscreen using the <RETURN> key. Get back to windowed
+mode using ESC.
+
+The following keys are supported:
+
+RETURN
+	switch to fullscreen
+ESC
+	back to windowed mode/close dialog
+RIGHT
+	next image
+LEFT
+	previous image
+SPACE
+	Pause/Continue
+s
+	Show controls
+h
+	Hide controls
+
+
+Source
+------
+The source can be found in the subdirectory "source". The program is
+written using DrDialog a free tool which can be found as drdialog.zip
+at many places.
+The source to drctl017.dll can be found in the drctl017 distribution.
+Search
+
+	http://www.os2world.com/cdwriting
+
+or 
+	http://hobbes.nmsu.edu
+
+for a package named drdialog-controls-0_1_7.zip.
+
+
+National Languages
+----------------
+The program is coming with german and english language support.
+If you want to have a translation to your language translate the
+contents of en.txt or de.txt. Name the resulting file XY.txt with
+XY being your language code (see LANG config.sys setting).
+
+Translate the file using the script addnls.cmd, for example
+
+  addnls.cmd de.txt
+
+Be sure you don't have any spaces in the path to addnls.cmd or
+XY.txt.
+Copy the resulting INI file into the \lang subdirectory and on next
+start the program should use your language.
+
+
+Credits
+------
+Gbmsize.exe and gbm.dll are (c) Andy Key
+
+ http://www.interalpha.net/customer/nyangau/
+
+They're public domain.
+
+The JPEG support is based on code provided by The Independent JPEG Group.
+
+
+License
+------
+The Slide Show program is provided under the following license.
+
+/*
+ * Copyright (c) Chris Wohlgemuth 2001-2004 
+ * All rights reserved.
+ *
+ * http://www.geocities.com/SiliconValley/Sector/5785/
+ * http://www.os2world.com/cdwriting
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. The authors name may not be used to endorse or promote products
+ *    derived from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ *
+ */
+
+
+Author
+------
+Copyright Chris Wohlgemuth 2004
+
+http://www.os2world.com/cdwriting
+http://www.geocities.com/SiliconValley/Sector/5785/
+
Index: /tags/CWMM-0.3.0_GA/slide-show/creatobj.CMD
===================================================================
--- /tags/CWMM-0.3.0_GA/slide-show/creatobj.CMD	(revision 213)
+++ /tags/CWMM-0.3.0_GA/slide-show/creatobj.CMD	(revision 213)
@@ -0,0 +1,33 @@
+/* */
+ call RxFuncAdd 'SysLoadFuncs', 'RexxUtil', 'SysLoadFuncs'
+ call SysLoadFuncs
+
+
+parse source . . sourceFile
+
+thedir=FILESPEC('drive', sourcefile)||FILESPEC('path', sourcefile)
+theDir=LEFT(theDir,LENGTH(theDir)-1)
+
+globalData._languagefile=theDir"\lang\lang.ini"
+theLang=getLanguage(globalData._languageFile)
+theTitle=SysIni(globalData._languagefile, thelang, "wpsobject")
+IF theTitle="ERROR:" THEN theTitle="Slide Show"
+rc=SysCreateObject("WPProgram", theTitle, "<WP_DESKTOP>", "EXENAME="||theDir||"\slide-show.exe;OBJECTID=<CW_SLIDESHOW_PGM>", "update" )
+
+EXIT
+
+getLanguage: PROCEDURE
+
+
+theLang=VALUE("LANG",,"OS2ENVIRONMENT")
+if theLang="" then return "EN"
+theLang=LEFT(theLang, 5)
+IF LENGTH(theLang)<2 then return "EN"
+
+theLang=TRANSLATE(RIGHT(theLang,2))
+/* Try to load an entry */
+rc=SysIni(ARG(1), theLang, "installed")
+IF rc="ERROR:" THEN return "EN"
+
+return TRANSLATE(RIGHT(theLang,2))
+
Index: /tags/CWMM-0.3.0_GA/slide-show/slideshoweng.ins
===================================================================
--- /tags/CWMM-0.3.0_GA/slide-show/slideshoweng.ins	(revision 213)
+++ /tags/CWMM-0.3.0_GA/slide-show/slideshoweng.ins	(revision 213)
@@ -0,0 +1,40 @@
+[APPLICATION]
+NAME Slide Show  1.0.0
+VERSION 1.0.0.0
+COPYRIGHT (C) Chris Wohlgemuth 2004
+HOME http://www.os2world.com/cdwriting
+INTERNALNAME SLIDESHW
+TOTALSIZE 425661
+INSTALLER 0.1.1.0
+DESCRIPTION Slide show program which displays the contents of one ore more directories. Fullscreen and windowed mode. Randomize function.
+
+[DESCRIPTION]
+DESCRIPTION  Slide show program which displays the contents of one ore more directories. Fullscreen and windowed mode. Randomize function.
+
+[FILES]
+creatobj.CMD, %TARGET%\ ,  F,  934
+Readme.txt, %TARGET%\ ,  F,  4072
+slide-show.EXE, %TARGET%\ ,  F,  194048
+bin\drctl017.dll, %TARGET%\ ,  F,  137586
+bin\gbmsize.exe, %TARGET%\ ,  F,  57460
+lang\LANG.INI, %TARGET%\ ,  F,  3061
+source\addnls.CMD, %TARGET%\ ,  F,  2712
+source\de.txt, %TARGET%\ ,  F,  1381
+source\en.txt, %TARGET%\ ,  F,  1246
+source\slide-show.RES, %TARGET%\ ,  F,  23161
+
+[OBJECTS]
+Slide Showõ,õ <CWMM_SLIDESHOW_PGM>õ,õ WPProgramõ,õ <MMPM2_FOLDER>õ,õ EXENAME=%TARGET%\slide-show.exe;õ,õ replace
+
+[INSTALLPROFILES]
+SLIDESHW õ,õ Slide show program for displaying directory contents õ,õ Slide show program which displays the contents of one ore more directories. Fullscreen and windowed mode. Randomize function.
+
+[SLIDESHW]
+SLIDESHW, , ,S,[ ], slideshoweng.ins
+
+[DEFAULTTARGET]
+PATH %APPS%\CWMMOS2\Slide-show
+
+[INI]
+USER õ,õ CWMM õ,õ slideshowpgm õ,õ %TARGET%\slide-show.exe õ,õ YES
+
Index: /tags/CWMM-0.3.0_GA/slide-show/slideshowger.ins
===================================================================
--- /tags/CWMM-0.3.0_GA/slide-show/slideshowger.ins	(revision 213)
+++ /tags/CWMM-0.3.0_GA/slide-show/slideshowger.ins	(revision 213)
@@ -0,0 +1,40 @@
+[APPLICATION]
+NAME Diaschau 1.0.0
+VERSION 1.0.0.0
+COPYRIGHT (C) Chris Wohlgemuth 2004
+HOME http://www.os2world.com/cdwriting
+INTERNALNAME SLIDESHW
+TOTALSIZE 425661
+INSTALLER 0.1.1.0
+DESCRIPTION Diaschau-Programm, das den Inhalt eines oder mehrerer Verzeichnisse anzeigt. Vollbildschirm- und Fenstermodus, Zufallswiedergabe.
+
+[DESCRIPTION]
+DESCRIPTION  Diaschau-Programm, das den Inhalt eines oder mehrerer Verzeichnisse anzeigt. Vollbildschirm- und Fenstermodus, Zufallswiedergabe.
+
+[FILES]
+creatobj.CMD, %TARGET%\ ,  F,  934
+Readme.txt, %TARGET%\ ,  F,  4072
+slide-show.EXE, %TARGET%\ ,  F,  194048
+bin\drctl017.dll, %TARGET%\ ,  F,  137586
+bin\gbmsize.exe, %TARGET%\ ,  F,  57460
+lang\LANG.INI, %TARGET%\ ,  F,  3061
+source\addnls.CMD, %TARGET%\ ,  F,  2712
+source\de.txt, %TARGET%\ ,  F,  1381
+source\en.txt, %TARGET%\ ,  F,  1246
+source\slide-show.RES, %TARGET%\ ,  F,  23161
+
+[OBJECTS]
+Diaschau õ,õ <CWMM_SLIDESHOW_PGM>õ,õ WPProgramõ,õ <MMPM2_FOLDER>õ,õ EXENAME=%TARGET%\slide-show.exe;õ,õ replace
+
+[INSTALLPROFILES]
+SLIDESHW õ,õ Diaschau-Programm zum Anzeigen von Verzeichnisinhalten õ,õ Diaschau-Programm, das den Inhalt eines oder mehrerer Verzeichnisse anzeigt. Vollbildschirm- und Fenstermodus, Zufallswiedergabe.
+
+[SLIDESHW]
+SLIDESHW, , ,S,[ ], slideshowger.ins
+
+[DEFAULTTARGET]
+PATH %APPS%\CWMMOS2\Slide-show
+
+[INI]
+USER õ,õ CWMM õ,õ slideshowpgm õ,õ %TARGET%\slide-show.exe õ,õ YES
+
Index: /tags/CWMM-0.3.0_GA/slide-show/source/addnls.CMD
===================================================================
--- /tags/CWMM-0.3.0_GA/slide-show/source/addnls.CMD	(revision 213)
+++ /tags/CWMM-0.3.0_GA/slide-show/source/addnls.CMD	(revision 213)
@@ -0,0 +1,122 @@
+/* */
+call RxFuncAdd 'SysLoadFuncs', 'RexxUtil', 'SysLoadFuncs'
+call SysLoadFuncs
+
+IF ARG()=1 THEN DO
+	datafile=ARG(1)
+END
+ELSE DO
+	datafile=nls001.txt
+END
+	hintini='lang.ini'
+
+lang=TRANSLATE(LEFT(RIGHT(datafile, 6), 2))
+index=0
+
+SAY 'Datafile with NLS strings: '||datafile
+SAY ''
+SAY ARG()
+/* Read the datafile */
+    i = 0
+    do while lines(datafile) <> 0
+       i=i+1
+       data.i = linein(datafile)
+    END
+    data.0=i
+
+   call stream datafile, 'C', 'CLOSE'
+
+
+    /* Correct tip numbers */
+    currentline=1
+    do while currentline <= data.0
+      section = Strip(Translate(word(data.currentline,1)))
+	select
+	    when (Left(section,1) = '#') | section = '' then
+		do
+		/* Jump comments and empty lines */
+		end;
+              otherwise
+		IF POS('[',section)=1 THEN DO
+			index=index+1
+			data.currentline='['index']'
+		END
+           end
+           currentline=currentline+1
+        end
+
+
+    currentline=1
+    do while currentline <= data.0
+      section = Strip(Translate(word(data.currentline,1)))
+	select
+	    when (Left(section,1) = '#') | section = '' then
+		do
+			/* Jump comments and empty lines */
+		end;
+              otherwise
+		call parseapp currentline
+		   nop
+           end
+           currentline=currentline+1
+        end
+
+/* Set general info like number of tips */
+RETURN
+
+
+parseapp:
+ app=STRIP(TRANSLATE(data.currentline,'  ','[]'))
+ currentline=currentline+1
+    do a=currentline to data.0
+      section = Strip(data.a)
+	select
+	    when (Left(section,1) = '#') | section = '' then
+		do
+			/* Jump comments and empty lines */
+		end;
+                WHEN (Left(section,1) = '[') THEN DO
+                    /* Next section reached */
+                        currentline=currentline-1
+			return
+                END
+              otherwise
+		section=replaceCR(section)
+		section=replaceTab(section)
+		say app||": "||section
+		SAY ""
+		rc=SysIni(hintini, lang, word(section,1), STRIP(subword(section, 2)))
+                  /* Parse source and target */
+               end
+           currentline=currentline+1
+        end
+return
+
+
+replaceCR:
+
+	string=STRIP(ARG(1))
+
+	thePos=WORDPOS("0ax",string)
+	if thePos\=0 THEN DO
+		string=SUBWORD(string,1,thePos-1)||'0a'x||replaceCR(SUBWORD(string,thePos+1))
+	END
+
+return string
+
+replaceTab:
+
+	string=STRIP(ARG(1))
+	thePos=WORDPOS("0tx",string)
+	if thePos\=0 THEN DO
+		string=SUBWORD(string,1,thePos-1)||'        '||replaceTab(SUBWORD(string,thePos+1))
+	END
+
+	thePos=WORDPOS("0t2x",string)
+	if thePos\=0 THEN DO
+		string=SUBWORD(string,1,thePos-1)||'0a'x||'        '||replaceTab(SUBWORD(string,thePos+1))
+	END
+
+return string
+
+
Index: /tags/CWMM-0.3.0_GA/slide-show/source/de.txt
===================================================================
--- /tags/CWMM-0.3.0_GA/slide-show/source/de.txt	(revision 213)
+++ /tags/CWMM-0.3.0_GA/slide-show/source/de.txt	(revision 213)
@@ -0,0 +1,73 @@
+[1]
+installed yes
+
+[1]
+ok ~Ok
+
+[1]
+errortext Ein Fehler trat whrend der Programmausfhrung auf. Benachrichtigen sie den Author und hngen sie dabei die unten angezeigte Meldung an.
+# Besser noch, versuchen sie den Fehler selber zu finden mit Hilfe des zur Verfgung gestellten Quelltextes und senden Sie einen Patch.
+
+[1]
+error Fehler
+
+[1]
+fullscreen ~Vollbild
+
+[1]
+next ~>>
+
+[1]
+previous ~<<
+
+[1]
+start ~Start
+
+[1]
+stop Sto~pp
+
+[1]
+adddir  ~Verz. hinzufgen...
+
+[1]
+removedir Verz. ent~fernen
+
+[1]
+quit ~Ende
+
+[1]
+random ~Zufllig
+
+[1]
+pause ~Pause
+
+[1]
+directories Verzeichnisse
+
+[1]
+settings Einstellungen
+
+
+[1]
+time Anzeigedauer:
+
+[1]
+main Diaschau
+
+[1]
+question Frage
+
+[1]
+questiontext Es existiert kein WPS-Objekt fr die Diaschau. Soll eines auf der Arbeitsoberflche angelegt werden?
+
+[1]
+wpsobject Diaschau
+
+[1]
+continue ~Fortsetzen
+
+[1]
+help ~Hilfe
+
+[1]
+helptext === Hilfe fr Tasten === 0ax 0ax Allgemein 0ax 0ax F1 0t2x Diese Hilfe 0ax 0ax Pfeil rechts 0t2x Nchstes Bild 0ax 0ax Pfeil zurck 0t2x Vorheriges Bild 0ax 0ax Leertaste 0t2x Pause/Weiter 0ax 0ax 0ax Im Fenstermodus: 0ax 0ax ESC 0t2x Fenster schlieáen 0ax 0ax RETURN 0t2x Vollbildschirm 0ax 0ax S 0t2x Zeige Bedienknpfe 0ax 0ax H 0t2x Verberge Bedienknpfe 0ax 0ax 0ax Im Vollbildschirmmodus: 0ax 0ax ESC 0t2x Zurck zum Fenstermodus
Index: /tags/CWMM-0.3.0_GA/slide-show/source/en.txt
===================================================================
--- /tags/CWMM-0.3.0_GA/slide-show/source/en.txt	(revision 213)
+++ /tags/CWMM-0.3.0_GA/slide-show/source/en.txt	(revision 213)
@@ -0,0 +1,72 @@
+[1]
+installed yes
+
+[1]
+errortext An error occured during execution of this program. Send a notice to the author with the message below attached.
+#Or even better try to fix it on your own using the provided source code and send a patch.
+
+[1]
+error Fehler
+
+[1]
+ok ~Ok
+
+[1]
+fullscreen ~Fullscreen
+
+[1]
+next ~>>
+
+[1]
+previous ~<<
+
+[1]
+start ~Start
+
+[1]
+stop Sto~p
+
+[1]
+adddir Add ~Dir...
+
+[1]
+removedir ~Remove Dir
+
+[1]
+quit ~Quit
+
+[1]
+random R~andom
+
+[1]
+pause ~Pause
+
+[1]
+directories Directories
+
+[1]
+settings Settings
+
+[1]
+time Time (s):
+
+[1]
+main Slide Show
+
+[1]
+question Question
+
+[1]
+questiontext There's no WPS object for the Slide Show. Do you want me to create one on your desktop?
+
+[1]
+wpsobject Slide Show
+
+[1]
+continue ~Continue
+
+[1]
+help ~Help
+
+[1]
+helptext === Help for keys === 0ax 0ax General keys 0ax 0ax F1 0t2x This Help 0ax 0ax Cursor right 0t2x Next Picture 0ax 0ax Cursor left 0t2x Previous Picture 0ax 0ax SPACE 0t2x Pause/Continue 0ax 0ax 0ax During windowed mode: 0ax 0ax ESC 0t2x Close window 0ax 0ax RETURN 0t2x Fullscreen 0ax 0ax S 0t2x Show controls 0ax 0ax H 0t2x Hide controls 0ax 0ax 0ax During fullscreen: 0ax 0ax ESC 0t2x Back to windowed mode
Index: /tags/CWMM-0.3.0_GA/stream_ioproc/Control.SCR
===================================================================
--- /tags/CWMM-0.3.0_GA/stream_ioproc/Control.SCR	(revision 213)
+++ /tags/CWMM-0.3.0_GA/stream_ioproc/Control.SCR	(revision 213)
@@ -0,0 +1,18 @@
+package="Stream IO procedure"
+codepage=437
+filelist="MASTER.DSK"
+groupcount=1
+munitcount=1
+medianame="Stream IO"
+
+/*** Destination Directorys ***/
+destindir = "\\MMOS2\\DLL\\"                           = 0
+destindir = "\\MMOS2\\INSTALL\\"                       = 1
+
+ssgroup=1
+sssize=100
+ssname="Stream IO"
+ssversion="0.1.0"
+ssinich="STREAMIO.SCR"
+ssselect="YES"
+
Index: /tags/CWMM-0.3.0_GA/stream_ioproc/MASTER.DSK
===================================================================
--- /tags/CWMM-0.3.0_GA/stream_ioproc/MASTER.DSK	(revision 213)
+++ /tags/CWMM-0.3.0_GA/stream_ioproc/MASTER.DSK	(revision 213)
@@ -0,0 +1,5 @@
+	2
+/* Disk# Group# Dest# Source# Filename  */
+    0       1      0       0      "STREAMIO.DLL"
+    0       1      1       0      "STREAMIO.SCR"
+
Index: /tags/CWMM-0.3.0_GA/stream_ioproc/STREAMIO.SCR
===================================================================
--- /tags/CWMM-0.3.0_GA/stream_ioproc/STREAMIO.SCR	(revision 213)
+++ /tags/CWMM-0.3.0_GA/stream_ioproc/STREAMIO.SCR	(revision 213)
@@ -0,0 +1,13 @@
+mmioInstall =
+(
+  mmioFourCC        = "CAST"
+  mmioDllName       = "$(DEST)STREAMIO.DLL"
+  mmioDllEntryPoint = "IOProc_Entry"
+  mmioFlags         = 0x00000000L
+  mmioExtendLen     = 0x00000010L
+  mmioMediaType     = 0x00000002L
+  mmioIOProcType    = 0x00000001L
+  mmioDefExt        = ""
+)
+
+
Index: /tags/CWMM-0.3.0_GA/stream_ioproc/source/iotest.c
===================================================================
--- /tags/CWMM-0.3.0_GA/stream_ioproc/source/iotest.c	(revision 213)
+++ /tags/CWMM-0.3.0_GA/stream_ioproc/source/iotest.c	(revision 213)
@@ -0,0 +1,256 @@
+/*
+ * Copyright (c) Chris Wohlgemuth 2002 
+ * All rights reserved.
+ *
+ * http://www.geocities.com/SiliconValley/Sector/5785/
+ * http://www.os2world.com/cdwriting
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. The authors name may not be used to endorse or promote products
+ *    derived from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ *
+ */
+#define INCL_DOSERRORS
+#define INCL_DOSMODULEMGR
+#define INCL_DOSPROCESS
+#define INCL_DOSSEMAPHORES
+#define INCL_DOSMEMMGR
+#define INCL_GPI
+#define INCL_GPICONTROL
+#define INCL_GPILCIDS
+#define INCL_GPIMETAFILES
+#define INCL_GPIPRIMITIVES
+#define INCL_GPIREGIONS
+#define INCL_PM
+#define INCL_WIN
+#define INCL_WINDIALOGS
+#define INCL_WINERRORS
+#define INCL_WINFRAMEMGR
+#define INCL_WINHELP
+#define INCL_WINMENUS
+#define INCL_WINMESSAGEMGR
+#define INCL_WINMLE
+#define INCL_WINPOINTERS
+#define INCL_WINSTDDLGS
+#define INCL_WINSTDFILE
+#define INCL_WINSTDSLIDER
+#define INCL_WINSWITCHLIST
+#define INCL_WINSYS
+#define INCL_WINTIMER
+#define INCL_WINWINDOWMGR
+
+#include <os2.h>
+#include <stdio.h>
+#include <string.h>
+#include <malloc.h>
+#include "mmioos2.h"
+
+char pszFileName[]="";
+
+int main()
+{
+    HBITMAP       hbm;
+    MMIOINFO      mmioinfo;
+    MMFORMATINFO  mmFormatInfo;
+    HMMIO         hmmio;
+    ULONG         ulImageHeaderLength;
+    MMIMAGEHEADER mmImgHdr;
+    ULONG         ulBytesRead;
+    ULONG         dwNumRowBytes;
+    PBYTE         pRowBuffer;
+    ULONG         dwRowCount;
+    SIZEL         ImageSize;
+    ULONG         dwHeight, dwWidth;
+    SHORT          wBitCount;
+    FOURCC        fccStorageSystem;
+    ULONG         dwPadBytes;
+    ULONG         dwRowBits;
+    ULONG         ulReturnCode;
+    ULONG         dwReturnCode;
+    HBITMAP       hbReturnCode;
+    LONG          lReturnCode;
+    FOURCC        fccIOProc;
+
+#if 0
+    CHAR          szBuffer[ sizeof( FOURCC ) + MAX_FILENAME_SIZE + 4 ];
+    LONG          lNumIOProcs;
+    MMFORMATINFO  mmFormatInfo;
+    PMMFORMATINFO pmmFormatInfoArray;
+    PSZ           pszFourccString;
+    ULONG         ulReturnCode;
+    LONG          lFormatsRead;
+    LONG          index;
+    LONG          lBytesRead;
+#endif
+
+    printf("in Main\n");
+    ulReturnCode = mmioIdentifyFile ( pszFileName,
+                                      0L,
+                                      &mmFormatInfo,
+                                      &fccStorageSystem,
+                                      0L,
+                                      0L);
+
+    /*
+     *  If this file was NOT identified, then this function won't
+     *  work, so return an error by indicating an empty bitmap.
+     */
+
+    if ( ulReturnCode == MMIO_ERROR )
+    {
+      printf("Can't identify file...\n");
+         return (0L);
+    }
+
+    /*
+     *  If mmioIdentifyFile did not find a custom-written IO proc which
+     *  can understand the image file, then it will return the DOS IO Proc
+     *  info because the image file IS a DOS file.
+     */
+
+    if( mmFormatInfo.fccIOProc == FOURCC_DOS )
+    {
+
+      printf("Image file could not be interpreted by any permanently or temporarily installed IO procedures.\n");
+         return ( 0L );
+    }
+
+    /*
+     *  Ensure this is an IMAGE IOproc, and that it can read
+     *  translated data
+     */
+
+    if ( (mmFormatInfo.ulMediaType != MMIO_MEDIATYPE_IMAGE) ||
+         ((mmFormatInfo.ulFlags & MMIO_CANREADTRANSLATED) == 0) )
+    {
+      printf("No IMAGE IO Procedures exist which can translate the data in the image file specified.");
+         return (0L);
+    }
+    else
+    {
+         fccIOProc = mmFormatInfo.fccIOProc;
+    }
+
+    /* Clear out and initialize mminfo structure */
+    
+    memset ( &mmioinfo,
+             0L,
+             sizeof ( MMIOINFO ) );
+    
+    mmioinfo.fccIOProc = fccIOProc;
+    mmioinfo.ulTranslate = MMIO_TRANSLATEHEADER | MMIO_TRANSLATEDATA;
+    
+    hmmio = mmioOpen ( (PSZ) pszFileName,
+                       &mmioinfo,
+                       MMIO_READ | MMIO_DENYWRITE | MMIO_NOIDENTIFY );
+    
+    if ( ! hmmio )
+      {
+        /* If file could not be opened, return with error */
+        printf("File can't be opened!\n");
+        return (0L);
+    }
+
+    dwReturnCode = mmioQueryHeaderLength ( hmmio,
+                                         (PLONG)&ulImageHeaderLength,
+                                           0L,
+                                           0L);
+
+    if ( ulImageHeaderLength != sizeof ( MMIMAGEHEADER ) )
+    {
+         /* We have a problem.....possibly incompatible versions */
+      printf("Error in mmioQueryHeaderLength ()\n");
+         ulReturnCode = mmioClose (hmmio, 0L);
+         return (0L);
+    }
+
+    ulReturnCode = mmioGetHeader ( hmmio,
+                                   &mmImgHdr,
+                                   (LONG) sizeof ( MMIMAGEHEADER ),
+                                   (PLONG)&ulBytesRead,
+                                   0L,
+                                   0L);
+
+    if ( ulReturnCode != MMIO_SUCCESS )
+    {
+         /* Header unavailable */
+      printf("Can't get header!\n");
+         ulReturnCode = mmioClose (hmmio, 0L);
+
+         return (0L);
+    }
+
+    /*
+     *  Determine the number of bytes required, per row.
+     *      PLANES MUST ALWAYS BE = 1
+     */
+
+    dwHeight = mmImgHdr.mmXDIBHeader.BMPInfoHeader2.cy;
+    dwWidth = mmImgHdr.mmXDIBHeader.BMPInfoHeader2.cx;
+    wBitCount = mmImgHdr.mmXDIBHeader.BMPInfoHeader2.cBitCount;
+    dwRowBits = dwWidth * mmImgHdr.mmXDIBHeader.BMPInfoHeader2.cBitCount;
+    dwNumRowBytes = dwRowBits >> 3;
+
+    /*
+     *  Account for odd bits used in 1bpp or 4bpp images that are
+     *  NOT on byte boundaries.
+     */
+
+    if ( dwRowBits % 8 )
+    {
+         dwNumRowBytes++;
+    }
+
+    /*
+     *  Ensure the row length in bytes accounts for byte padding.
+     *  All bitmap data rows must are aligned on LONG/4-BYTE boundaries.
+     *  The data FROM an IOProc should always appear in this form.
+     */
+
+    dwPadBytes = ( dwNumRowBytes % 4 );
+
+    if ( dwPadBytes )
+    {
+         dwNumRowBytes += 4 - dwPadBytes;
+    }
+
+    /* Allocate space for ONE row of pels */
+
+    if ( DosAllocMem( (PPVOID)&pRowBuffer,
+                      (ULONG)dwNumRowBytes,
+                      fALLOC))
+    {
+         ulReturnCode = mmioClose (hmmio, 0L);
+
+         printf("No memory!!\n");
+         return(0L);
+    }
+
+
+  printf("Done\n");
+  return 0;
+}
+
+
+
+
+
Index: /tags/CWMM-0.3.0_GA/stream_ioproc/source/makefile
===================================================================
--- /tags/CWMM-0.3.0_GA/stream_ioproc/source/makefile	(revision 213)
+++ /tags/CWMM-0.3.0_GA/stream_ioproc/source/makefile	(revision 213)
@@ -0,0 +1,102 @@
+#/*
+# * Copyright (c) Chris Wohlgemuth 2002 
+# * All rights reserved.
+# *
+# * http://www.geocities.com/SiliconValley/Sector/5785/
+# * http://www.os2world.com/cdwriting
+# *
+# * Redistribution and use in source and binary forms, with or without
+# * modification, are permitted provided that the following conditions
+# * are met:
+# * 1. Redistributions of source code must retain the above copyright
+# *    notice, this list of conditions and the following disclaimer.
+# * 2. Redistributions in binary form must reproduce the above copyright
+# *    notice, this list of conditions and the following disclaimer in the
+# *    documentation and/or other materials provided with the distribution.
+# * 3. The authors name may not be used to endorse or promote products
+# *    derived from this software without specific prior written permission.
+# *
+# * THIS SOFTWARE IS PROVIDED ``AS IS'' AND
+# * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+# * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+# * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+# * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+# * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+# * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+# * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+# * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+# * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+# * SUCH DAMAGE.
+# *
+# */
+#################################################################################
+#
+# Makefile for STREAM IOProc
+#
+#   Generates
+#         STREAMIO.dll       - Stream storage IOproc
+#
+# Copyright Chris Wohlgemuth 2005
+#
+# http://www.os2world.com/cdwriting
+# http://www.geocities.com/SiliconValley/Sector/5785/
+#
+# Use VAC++ V3.08 and gmake to compile
+#
+#################################################################################
+
+.SUFFIXES: .exe .obj .asm .inc .def .lrf .lst .sym .map .c .h .lib .dlg .txt .cod  \
+           .res .rc .l$(LANG) .dll
+
+
+#################################
+CC=icc
+CFLAGS       =   -Ge- /Gm+ -G4 /ss -Gl /O+ -Oc+ -Ol- /Q+ /C
+
+#################################
+# Definitions for linker
+# LIBRARIES:
+#  MMPM2  == MMPM2 Library
+#################################
+MAPSYM=mapsym
+LIBS=	MMPM2.LIB
+LDFLAGS =	-Ge- /Gm+ -G4 /ss -Gl /O+ -Oc+ -Ol-  /Q+ /B"/NOE"
+
+
+#################################
+# Object file lists
+#################################
+OBJS =	streamproc.obj streamfunc.obj
+
+#################################
+# Target Descriptions
+#################################
+all:	STREAMIO.DLL testproc.exe
+#iotest.exe 
+
+testproc.exe:	testproc.c
+	icc /ss testproc.c $(LIBS)
+
+iotest.exe:	iotest.c
+	icc iotest.c $(LIBS)
+
+STREAMIO.DLL:		$(OBJS)
+	$(CC) $(LDFLAGS)  /Fm$(basename $@) /Fe$@  $(OBJS) $(LIBS) streamio.def
+	rc streamproc.rc STREAMIO.DLL
+	mapsym streamio.map
+
+
+
+streamproc.obj:	streamproc.c
+	$(CC) $(CFLAGS) /Fo$@ $<
+
+streamfunc.obj:	streamfunc.c
+	$(CC) $(CFLAGS) /Fo$@ $<
+
+clean:
+	-rm *.obj
+	-rm *.dll
+	-rm *.RES
+	-rm *.*~
+	-rm *.map
+	-rm *.sym
Index: /tags/CWMM-0.3.0_GA/stream_ioproc/source/streamfunc.c
===================================================================
--- /tags/CWMM-0.3.0_GA/stream_ioproc/source/streamfunc.c	(revision 213)
+++ /tags/CWMM-0.3.0_GA/stream_ioproc/source/streamfunc.c	(revision 213)
@@ -0,0 +1,284 @@
+/*
+ * Copyright (c) Chris Wohlgemuth 2005 
+ * All rights reserved.
+ *
+ * http://www.geocities.com/SiliconValley/Sector/5785/
+ * http://www.os2world.com/cdwriting
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. The authors name may not be used to endorse or promote products
+ *    derived from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ *
+ */
+
+/************************************************************************/
+/* Put all #defines here                                                */
+/************************************************************************/
+
+#define INCL_32                          * force 32 bit compile
+#define INCL_GPIBITMAPS
+#define INCL_DOSFILEMGR
+#define INCL_DOSRESOURCES
+#define INCL_DOSMODULEMGR
+#define INCL_WIN
+#define INCL_GPI
+#define INCL_PM                         /* force 32 bit compile */
+
+/************************************************************************/
+/* Put all #includes here                                               */
+/************************************************************************/
+
+#include <limits.h>
+#include <os2.h>
+#include <string.h>
+#include <stdlib.h>
+#include <os2medef.h>
+#include <mmioos2.h>
+#include "streamproc.h"
+
+
+
+/*************************************************************************************
+ * Routine is called on each DLL instantiation and termination.
+ * Caller assures that no two instances execute this code
+ * at the same time.
+ * 00) Change name to _DLL_InitTerm and use the linkage pragma.
+ *************************************************************************************/
+/*************************************************************************************
+ * Variable holds DLL module handle.  Gets set at initialization.
+ * Data area is separate for each using process, so this value
+ * could be different (or same) per process.
+ *************************************************************************************/
+HMODULE hModuleHandle;
+
+#pragma linkage (_DLL_InitTerm, system)
+//#pragma checkout (suspend)       /* Prevent unreferenced parameter messages */
+ULONG _DLL_InitTerm (ULONG hModHandle, ULONG fTerm/*, BOOL FirstInstance*/)
+{
+   hModuleHandle = hModHandle;  /* Remember for NLS lookup */
+   if (!fTerm) {
+      if (_CRT_init())
+         return (0L);
+   } /* endif */
+
+   return (1L);                 /* Success */
+} /* DLL_InitTerm */
+//#pragma checkout (resume)
+
+
+/**************************************************************************
+ *   GetFormatString                                                     **
+ **************************************************************************
+ *
+ * ARGUMENTS:
+ *
+ *     lSearchId         - Table search key
+ *     pszFormatString   - Address where to return string.
+ *                         If null, then string is not returned.
+ *     lBytes            - Number of bytes to copy.
+ *
+ * RETURN:
+ *
+ *     Returns 0 if string not found, or the number of characters (bytes)
+ *     copied to the callers buffer.
+ *     Note, returned string is not ASCII nul terminated
+ *
+ * DESCRIPTION:
+ *
+ *     This function will retrieve the format string for the specified
+ *     IOProc from the resource file that contains the strings.
+ *
+ ***************************************************************************/
+LONG GetFormatString (LONG lSearchId,
+                      PSZ  pszFormatString,   /* Null, or dest address     */
+                      LONG lBytes)            /* Caller provided maximum   */
+{
+   PVOID   pResourceData;
+   CHAR    *pTemp;
+   LONG    lStringLen;      /* Length of format string  */
+   LONG    lRetVal = 0;     /* Function return value    */
+   LONG    lSearchTemp;
+
+   if (DosGetResource(hModuleHandle,
+                      RT_RCDATA,
+                      MMOTION_IOPROC_NAME_TABLE,
+                      &pResourceData))
+      {
+      return (MMIO_ERROR);
+      }
+
+   /*
+    * The resource table is of the form : FOURCC String\0
+    * Loop until a match is found, then return the string.
+    * Copy up to the number of bytes specified.
+    */
+
+   lStringLen = 0;
+   pTemp = (CHAR *)pResourceData;
+
+   while (pTemp)
+      {
+      memmove(&lSearchTemp, pTemp, sizeof(LONG));
+
+      if (lSearchTemp == 0L)
+         {
+         break;  /* End of table, search item not found */
+         }
+
+      if (lSearchTemp == lSearchId)   /* Search item found?               */
+         {
+         pTemp += sizeof(LONG);       /* Bypass numeric search id         */
+         lStringLen = strlen(pTemp);  /* Determine length of found string */
+         if (lStringLen >= lBytes)    /* Truncate, if necessary           */
+            {
+            if (lBytes > 0)
+               lStringLen = lBytes;   /* Number of characters to return   */
+            else
+               {
+               /* Callers buffer has zero size.  Cannot return any data   */
+               lRetVal = 0;           /* Size of returned data            */
+               break;                 /* Done searching                   */
+               }
+            }
+         if (pszFormatString != NULL)
+            {
+            memcpy(pszFormatString, pTemp, lStringLen); /* Copy string to caller */
+            }
+         lRetVal = lStringLen;        /* Function return value            */
+         break;                       /* We're done searching             */
+         }
+
+      pTemp += sizeof(FOURCC);
+      pTemp += (strlen(pTemp) + 1);   /* Advance to next search key       */
+      }
+
+   DosFreeResource( pResourceData );
+
+   return (lRetVal);  /* Zero or strlen */
+}
+
+
+/**************************************************************************
+ *   GetFormatStringLength                                               **
+ **************************************************************************
+ *
+ * ARGUMENTS:
+ *
+ *     lSearchId         - Table search key
+ *     plNameLength      - Address where to return string length.
+ *
+ * RETURN:
+ *
+ *     Length of the format string not including the terminating '\0'.
+ *     That is, the same value as would be returned from strlen().
+ *
+ * DESCRIPTION:
+ *
+ *     This function will retrieve the length of the format string
+ *     for the specified IOProc from the resource file that contains
+ *     the strings.
+ *
+ ***************************************************************************/
+LONG GetFormatStringLength (LONG  lSearchId,
+                            PLONG plNameLength)
+{
+   LONG  lStringSize;
+   LONG  lRetVal;
+
+   lStringSize = GetFormatString (lSearchId, NULL, LONG_MAX);
+   if (lStringSize > 0)             /* String found?                      */
+      {
+      *plNameLength = lStringSize;  /* yes, return strlen                 */
+      lRetVal = 0;                  /* and indicate success to caller     */
+      }
+   else
+      {
+      *plNameLength = 0;            /* no, error.  Return zero for length */
+      lRetVal = lStringSize;        /* and error code from called routine */
+      }
+   return (lRetVal);
+}
+
+
+/**************************************************************************
+ *   GetNLSData                                                          **
+ **************************************************************************
+ *
+ * ARGUMENTS:
+ *
+ *     pulCodePage       - Address where to return the code page/country.
+ *     pulLanguage       - Address where to return the language/dialect.
+ *
+ * RETURN:
+ *
+ *     Error code or 0.
+ *
+ * DESCRIPTION:
+ *
+ *     This function will retrieve the NLS information for the IOProc
+ *     strings contained in the resource file.
+ *
+ ***************************************************************************/
+
+ULONG APIENTRY GetNLSData( PULONG pulCodePage,
+                           PULONG pulLanguage )
+{
+   PVOID   pResourceData;
+   CHAR    *pTemp;
+
+   if (DosGetResource( hModuleHandle,
+                       RT_RCDATA,
+                       MMOTION_NLS_CHARSET_INFO,
+                       &pResourceData ))
+      {
+      return (MMIO_ERROR);
+      }
+
+   /*
+    * The resource table is of the form :
+    *   usCodePage     Low
+    *   usCountryCode  High
+    *   usLanguage     Low
+    *   usDialect      High
+    */
+
+   pTemp = (CHAR *)pResourceData;
+
+   while (pTemp)
+      {
+      memmove( pulCodePage, pTemp, sizeof(ULONG) );
+      pTemp += sizeof(ULONG);
+
+      if (pTemp == NULL)
+         {
+         break;
+         }
+
+      memmove( pulLanguage, pTemp, sizeof(ULONG) );
+
+      break;
+      }
+
+   DosFreeResource( pResourceData );
+
+   return (MMIO_SUCCESS);
+}
Index: /tags/CWMM-0.3.0_GA/stream_ioproc/source/streamio.def
===================================================================
--- /tags/CWMM-0.3.0_GA/stream_ioproc/source/streamio.def	(revision 213)
+++ /tags/CWMM-0.3.0_GA/stream_ioproc/source/streamio.def	(revision 213)
@@ -0,0 +1,42 @@
+;/*
+; * Copyright (c) Chris Wohlgemuth 2002 
+; * All rights reserved.
+; *
+; * http://www.geocities.com/SiliconValley/Sector/5785/
+; * http://www.os2world.com/cdwriting
+; *
+; * Redistribution and use in source and binary forms, with or without
+; * modification, are permitted provided that the following conditions
+; * are met:
+; * 1. Redistributions of source code must retain the above copyright
+; *    notice, this list of conditions and the following disclaimer.
+; * 2. Redistributions in binary form must reproduce the above copyright
+; *    notice, this list of conditions and the following disclaimer in the
+; *    documentation and/or other materials provided with the distribution.
+; * 3. The authors name may not be used to endorse or promote products
+; *    derived from this software without specific prior written permission.
+; *
+; * THIS SOFTWARE IS PROVIDED ``AS IS'' AND
+; * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+; * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+; * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+; * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+; * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+; * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+; * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+; * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+; * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+; * SUCH DAMAGE.
+; *
+; */
+LIBRARY STREAMIO INITINSTANCE TERMINSTANCE
+DESCRIPTION '$@#(C) C. Wohlgemuth 2005:#@##1## 13.05.2005 15:17:00      My ;-)  : :::0::@@ Stream IO procedure V0.1.0' 
+DATA MULTIPLE NONSHARED
+SEGMENTS
+   shardata CLASS 'DATA' SHARED
+HEAPSIZE 0
+BASE = 0x1B130000
+IMPORTS
+EXPORTS
+   IOProc_Entry    @1
+
Index: /tags/CWMM-0.3.0_GA/stream_ioproc/source/streamproc.c
===================================================================
--- /tags/CWMM-0.3.0_GA/stream_ioproc/source/streamproc.c	(revision 213)
+++ /tags/CWMM-0.3.0_GA/stream_ioproc/source/streamproc.c	(revision 213)
@@ -0,0 +1,439 @@
+/*
+ * Copyright (c) Chris Wohlgemuth 2005 
+ * All rights reserved.
+ *
+ * http://www.geocities.com/SiliconValley/Sector/5785/
+ * http://www.os2world.com/cdwriting
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. The authors name may not be used to endorse or promote products
+ *    derived from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ *
+ */
+ 
+/************************************************************************/
+/* Put all #defines here                                                */
+/************************************************************************/
+
+#define INCL_32                         /* force 32 bit compile */
+#define INCL_GPIBITMAPS
+#define INCL_DOSFILEMGR
+#define INCL_WIN
+#define INCL_GPI
+#define INCL_PM                         
+
+#define MEMCHECK
+
+/************************************************************************/
+/* Put all #includes here                                               */
+/************************************************************************/
+
+#include <os2.h>
+#include <stdio.h>
+#include <string.h>
+#include <stdlib.h>
+#include <stdarg.h>
+#include <io.h>
+#include <fcntl.h>
+#include <sys\stat.h>
+#include <os2medef.h>
+#include <mmioos2.h>
+#include <streamproc.h>
+
+#define DEBUG
+
+#ifdef DEBUG
+void writeLog(const char* chrFormat, ...)
+{
+  char logNameLocal[CCHMAXPATH];
+  FILE *fHandle;
+
+  sprintf(logNameLocal,"r:\\streamio.log");
+  fHandle=fopen(logNameLocal,"a");
+  if(fHandle) {
+    va_list arg_ptr;
+    void *tb;
+
+    va_start (arg_ptr, chrFormat);
+    vfprintf(fHandle, chrFormat, arg_ptr);
+    va_end (arg_ptr);
+    fclose(fHandle);
+  }
+}
+#endif
+
+
+/************************************************************************/
+/* STREAM IOProc                                                        */
+/*                                                                      */
+/* ARGUMENTS:                                                           */
+/*                                                                      */
+/*     PSZ pmmioStr - pointer to MMIOINFO block                         */
+/*     USHORT usMsg - MMIO message being sent                           */
+/*     LONG lParam1 - filename or other parameter depending on message  */
+/*     LONG lParam2 - used with some messages as values                 */
+/*                                                                      */
+/*                                                                      */
+/*  RETURN:                                                             */
+/*                                                                      */
+/*      MMIOM_OPEN                                                      */
+/*          Success           - MMIO_SUCCESS     (0)                    */
+/*          Failure           - MMIO_ERROR      (-1)                    */
+/*                                                                      */
+/*      MMIOM_READ                                                      */
+/*          Success           - Returns the number of bytes actually    */
+/*                              read.  Return 0L if no more bytes can   */
+/*                              be read.                                */
+/*          Failure           - MMIO_ERROR      (-1)                    */
+/*                                                                      */
+/*      MMIOM_WRITE                                                     */
+/*          Success           - Returns the number of bytes actually    */
+/*                              written.                                */
+/*          Failure           - MMIO_ERROR      (-1)                    */
+/*                                                                      */
+/*      MMIOM_SEEK                                                      */
+/*          Success           - Returns the new file position           */
+/*          Failure           - MMIO_ERROR      (-1)                    */
+/*                                                                      */
+/*      MMIOM_CLOSE                                                     */
+/*          Success           - MMIO_SUCCESS     (0)                    */
+/*          Failure           - MMIO_ERROR      (-1)                    */
+/*          Other             - MMIO_WARNING, file was closed but the   */
+/*                              IOProc expected additional data         */
+/*                                                                      */
+/*      MMIOM_GETFORMATNAME                                             */
+/*          Success           - Returns the number of bytes read into   */
+/*                              the buffer (size of format name)        */
+/*          Failure           - Return 0                                */
+/*                                                                      */
+/*      MMIOM_GETFORMATINFO                                             */
+/*          Success           - MMIO_SUCCESS     (0)                    */
+/*          Failure           - MMIO_ERROR      (-1)                    */
+/*                                                                      */
+/*      MMIOM_QUERYHEADERLENGTH                                         */
+/*          Success           - Returns the size of the header in bytes */
+/*          Failure           - Return 0                                */
+/*                                                                      */
+/*      MMIOM_IDENTIFYFILE                                              */
+/*          Success           - MMIO_SUCCESS     (0)                    */
+/*          Failure           - MMIO_ERROR      (-1)                    */
+/*                                                                      */
+/*      MMIOM_GETHEADER                                                 */
+/*          Success           - Returns number of bytes copied into     */
+/*                              the header structure.                   */
+/*          Failure           - Return 0                                */
+/*          Other             - If length passed in was not large       */
+/*                              enough to hold header then,             */
+/*                              MMIOERR_INVALID_BUFFER_LENGTH is set    */
+/*                              in ulErrorRet.                          */
+/*                            - If header is bad,                       */
+/*                              MMIOERR_INVALID_STRUCTURE is set in     */
+/*                              ulErrorRet                              */
+/*                                                                      */
+/*      MMIOM_SETHEADER                                                 */
+/*          Success           - Returns number of bytes written         */
+/*          Failure           - Return 0                                */
+/*          Other             - If header is bad,                       */
+/*                              MMIOERR_INVALID_STRUCTURE is set in     */
+/*                              ulErrorRet                              */
+/*                                                                      */
+/*  DESCRIPTION:                                                        */
+/*                                                                      */
+/*      This routine will translate JPEG image data into                */
+/*      OS/2 2.0 memory bitmap data and back again.                     */
+/*                                                                      */
+/*                                                                      */
+/*  GLOBAL VARS REFERENCED:                                             */
+/*                                                                      */
+/*      None                                                            */
+/*                                                                      */
+/*  GLOBAL VARS MODIFIED:                                               */
+/*                                                                      */
+/*      None                                                            */
+/*                                                                      */
+/*  NOTES:                                                              */
+/*                                                                      */
+/*      None                                                            */
+/*                                                                      */
+/*  SIDE EFFECTS:                                                       */
+/*                                                                      */
+/*      None                                                            */
+/*                                                                      */
+/************************************************************************/
+
+LONG EXPENTRY IOProc_Entry (PVOID  pmmioStr,
+                             USHORT usMsg,
+                             LONG   lParam1,
+                             LONG   lParam2)
+
+    {
+    PMMIOINFO   pmmioinfo;                      /* MMIOINFO block */
+
+    pmmioinfo = (PMMIOINFO) pmmioStr;
+
+//DosBeep(5000, 30);
+#ifdef DEBUG
+    writeLog("MSG: %d %x\n", usMsg,usMsg);
+#endif
+
+    switch (usMsg)
+        {
+        /*#############################################################*
+         * When Closing the file, perform the following:
+         * 1) Setup Variables
+         * 2) Process the Image buffer
+         * 3) Compress the Image to appropriate format
+         *#############################################################*/
+        case MMIOM_CLOSE:
+            {
+            /************************************************************
+             * Declare local variables.
+             ************************************************************/
+
+
+            LONG            lRetCode;
+            USHORT          rc;
+
+#ifdef DEBUG
+            writeLog("MMIO_CLOSE\n");
+#endif
+
+            return (MMIO_ERROR);
+#if 0
+            /***********************************************************
+             * Check for valid MMIOINFO block.
+             ***********************************************************/
+            if (!pmmioinfo)
+                return (MMIO_ERROR);
+
+            /***********************************************************
+             * Set up our working file status variable.
+             ***********************************************************/
+            pJPGInfo = (PJPGFILESTATUS)pmmioinfo->pExtraInfoStruct;
+            
+            /***********************************************************
+             * Assume success for the moment....
+             ***********************************************************/
+            lRetCode = MMIO_SUCCESS;
+            
+            /************************************************************
+             * see if we are in Write mode and have a buffer to write out.
+             *    We have no image buffer in UNTRANSLATED mode.
+             ************************************************************/
+            if ((pmmioinfo->ulFlags & MMIO_WRITE) && (pJPGInfo->lpRGBBuf))
+                {
+                  /* Write the buffer to disk */
+                  }
+
+            /***********************************************************
+             * Close the file 
+             ***********************************************************/
+            return (lRetCode);
+#endif
+            }  /* end case of MMIOM_CLOSE */
+            
+        /*#############################################################*
+         * Get the NLS format Information.
+         *#############################################################*/
+        case MMIOM_GETFORMATINFO:
+            {
+            /***********************************************************
+             * Declare local variables.
+             ***********************************************************/
+            PMMFORMATINFO       pmmformatinfo;
+
+#ifdef DEBUG
+            writeLog("MMIO_GETFORMATINFO\n");
+#endif
+#if 0
+            /************************************************************
+             * Set pointer to MMFORMATINFO structure.
+             ************************************************************/
+            pmmformatinfo = (PMMFORMATINFO) lParam1;
+
+            /************************************************************
+             * Fill in the values for the MMFORMATINFO structure.
+             ************************************************************/
+            pmmformatinfo->ulStructLen  = sizeof (MMFORMATINFO);
+            pmmformatinfo->fccIOProc    = FOURCC_STREAM;
+            pmmformatinfo->ulIOProcType = MMIO_IOPROC_FILEFORMAT;
+            pmmformatinfo->ulMediaType  = MMIO_MEDIATYPE_IMAGE;
+
+            pmmformatinfo->ulFlags      = MMIO_CANREADTRANSLATED |       
+              MMIO_CANSEEKTRANSLATED        |
+              MMIO_CANWRITETRANSLATED     
+              /* MMIO_CANREADUNTRANSLATED      |
+                 MMIO_CANSEEKUNTRANSLATED */;
+
+            strcpy ((PSZ) pmmformatinfo->szDefaultFormatExt, pszJPGExt);
+            if (GetNLSData( &pmmformatinfo->ulCodePage,
+                            &pmmformatinfo->ulLanguage ))
+               {
+               return( -1L );
+               }
+
+            if (GetFormatStringLength( FOURCC_JPG,
+                                       &(pmmformatinfo->lNameLength) ))
+               {
+               return( -1L );
+               }
+#endif
+
+            return (MMIO_ERROR);
+
+            /************************************************************
+             * Return success back to the application.
+             ************************************************************/
+            return (MMIO_SUCCESS);
+            } /* end case of MMIOM_GETFORMATINFO */
+
+        /*#############################################################*
+         * Get the NLS format name.
+         *#############################################################*/
+        case MMIOM_GETFORMATNAME:
+            {
+            LONG lBytesCopied;
+
+#ifdef DEBUG
+            writeLog("MMIO_GETFORMATNAME\n");
+#endif
+
+            /************************************************************
+             * Copy format string into buffer supplied by
+             * lParam1.  Only put in the amount of my string up to the
+             * allocated amount which is in lParam2.  Leave enough room
+             * for the NULL termination.
+             ************************************************************/
+            lBytesCopied = GetFormatString( FOURCC_STREAM,
+                                            (char *)lParam1,
+                                            lParam2 );
+
+            return (lBytesCopied);
+            } /* end case of MMIOM_GETFORMATNAME */
+
+        /*#############################################################*
+         * Identify whether this file can be processed.
+         *#############################################################*/
+        case MMIOM_IDENTIFYFILE:
+            {
+
+            /************************************************************
+             * Declare local variables.
+             ************************************************************/
+
+            BOOL bValidJPG= FALSE;
+
+            ULONG           ulTempFlags = MMIO_READ | MMIO_DENYWRITE |
+                                          MMIO_NOIDENTIFY;
+                                           /* flags used for temp open  */
+                                           /* and close                 */
+#ifdef DEBUG
+            writeLog("MMIO_IDENTIFYFILE\n");
+#endif
+
+            /************************************************************
+             * We need either a file name (lParam1) or file handle (lParam2)
+             ************************************************************/
+            if (!lParam1 && !lParam2)
+                return (MMIO_ERROR);
+
+
+            return (MMIO_ERROR);
+
+            } /* end case of MMIOM_IDENTIFYFILE */
+
+        /*#############################################################*/
+        /*#############################################################*/
+        case MMIOM_OPEN:
+            {
+
+            /************************************************************
+             * Declare local variables
+             ************************************************************/
+#ifdef DEBUG
+            writeLog("MMIO_OPEN\n");
+#endif
+            /************************************************************
+             * Check for valid MMIOINFO block.
+             ************************************************************/
+            if (!pmmioinfo)
+                return (MMIO_ERROR);
+
+            return (MMIO_ERROR);
+
+            } /* end case of MMIOM_OPEN */
+
+        /*#############################################################*/
+        /*#############################################################*/
+        case MMIOM_READ:
+            {
+
+            /************************************************************
+             * Declare Local Variables
+             ************************************************************/
+              /*            PJPGFILESTATUS   pJPGInfo; */
+            LONG            rc;
+            LONG            lBytesToRead;
+
+#ifdef DEBUG
+            writeLog("MMIO_READ\n");
+#endif
+
+            /************************************************************
+             * Check for valid MMIOINFO block.
+             ************************************************************/
+            if (!pmmioinfo)
+                return (MMIO_ERROR);
+
+            return (MMIO_ERROR);
+
+            }   /* end case  of MMIOM_READ */
+
+        /*#############################################################*/
+        /*#############################################################*/
+
+        /* 
+         * If the IOProc has a child IOProc, then pass the message on to the Child, otherwise 
+         * return Unsupported Message
+         */
+        default: 
+            {
+             /*
+              * Declare Local Variables.
+              */
+              //             PMMFILESTATUS       pVidInfo;
+             LONG                lRC;
+
+             /************************************************************
+              * Check for valid MMIOINFO block.
+              ************************************************************/
+             if (!pmmioinfo)
+                 return (MMIO_ERROR);
+
+             /* !!!!!!!!!!!! FIXME !!!!!!!!!!!!!*/ 
+             return (MMIOERR_UNSUPPORTED_MESSAGE);
+            }   /* end case of Default */
+
+        } /* end SWITCH statement for MMIO messages */
+
+    return (0);
+    }      /* end of window procedure */
Index: /tags/CWMM-0.3.0_GA/stream_ioproc/source/streamproc.h
===================================================================
--- /tags/CWMM-0.3.0_GA/stream_ioproc/source/streamproc.h	(revision 213)
+++ /tags/CWMM-0.3.0_GA/stream_ioproc/source/streamproc.h	(revision 213)
@@ -0,0 +1,115 @@
+/*
+ * Copyright (c) Chris Wohlgemuth 2002 
+ * All rights reserved.
+ *
+ * http://www.geocities.com/SiliconValley/Sector/5785/
+ * http://www.os2world.com/cdwriting
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. The authors name may not be used to endorse or promote products
+ *    derived from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ *
+ */
+
+/********************** START OF SPECIFICATIONS *************************/
+/*                                                                      */
+/* COPYRIGHT:                                                           */
+/*              Chris Wohlgemuth 2002                                   */
+/*                        All Rights Reserved                           */
+/*                                                                      */
+/* ABSTRACT: This file is the include/header file for use with the      */
+/*           STREAM IOProc                                              */
+/*                                                                      */
+/*********************** END OF SPECIFICATIONS **************************/
+
+
+#pragma pack(2)
+
+static char     pszStreamExt  [] = "";
+
+
+#if 0
+/****************************************
+ * IOProc information structure, used for every file opened
+ *    by this IOProc
+ ****************************************/
+typedef struct _JPGFILESTATUS
+{
+  
+  int ft;  /* GBM index for the proc to use */
+  int fHandleGBM;
+
+  PBYTE   lpRGBBuf;               /* 24-bit RGB Buf for translated data */
+  ULONG   ulRGBTotalBytes;        /* Length of 24-bit RGBBuf       */
+
+  LONG    lImgBytePos;            /* Current pos in RGB buf        */
+
+  ULONG   ulImgTotalBytes;
+  BOOL    bSetHeader;             /* TRUE if header set in WRITE mode*/
+  
+  MMIMAGEHEADER   mmImgHdr;       /* Standard image header         */
+} JPGFILESTATUS;
+typedef JPGFILESTATUS FAR *PJPGFILESTATUS;
+
+
+#define     MMOTION_HEADER_SIZE         sizeof (MMOTIONHEADER)
+#define     ONE_BLOCK                   6L
+#endif
+
+#define     FOURCC_STREAM               mmioFOURCC('S', 'T', 'R', 'M')
+
+/* RC file defines */
+
+/* #define     HEX_FOURCC_STREAM           0x54534143L */
+#define     HEX_FOURCC_STREAM           0x4d5453L
+
+#define     MMOTION_IOPROC_NAME_TABLE   7000
+#define     MMOTION_NLS_CHARSET_INFO    7500
+
+#ifndef BITT_NONE
+#define BITT_NONE 0
+#define BI_NONE   0
+#endif
+
+/**********************
+ * Function Declarations
+ **********************/
+LONG EXPENTRY IOProc_Entry (PVOID  pmmioStr, USHORT usMsg,
+                                   LONG   lParam1, LONG lParam2);
+
+
+LONG GetFormatString (LONG lSearchId,
+                      PSZ  pszFormatString,
+                      LONG lBytes);
+
+LONG GetFormatStringLength (LONG  lSearchId,
+                            PLONG plNameLength);
+
+ULONG APIENTRY GetNLSData (PULONG, PULONG);
+
+#pragma pack()
+
+
+
+
+
+
Index: /tags/CWMM-0.3.0_GA/stream_ioproc/source/streamproc.rc
===================================================================
--- /tags/CWMM-0.3.0_GA/stream_ioproc/source/streamproc.rc	(revision 213)
+++ /tags/CWMM-0.3.0_GA/stream_ioproc/source/streamproc.rc	(revision 213)
@@ -0,0 +1,48 @@
+;/*
+; * Copyright (c) Chris Wohlgemuth 2002 
+; * All rights reserved.
+; *
+; * http://www.geocities.com/SiliconValley/Sector/5785/
+; * http://www.os2world.com/cdwriting
+; *
+; * Redistribution and use in source and binary forms, with or without
+; * modification, are permitted provided that the following conditions
+; * are met:
+; * 1. Redistributions of source code must retain the above copyright
+; *    notice, this list of conditions and the following disclaimer.
+; * 2. Redistributions in binary form must reproduce the above copyright
+; *    notice, this list of conditions and the following disclaimer in the
+; *    documentation and/or other materials provided with the distribution.
+; * 3. The authors name may not be used to endorse or promote products
+; *    derived from this software without specific prior written permission.
+; *
+; * THIS SOFTWARE IS PROVIDED ``AS IS'' AND
+; * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+; * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+; * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+; * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+; * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+; * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+; * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+; * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+; * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+; * SUCH DAMAGE.
+; *
+; */
+#include <mmioos2.h>
+#include "streamproc.h"
+
+RCDATA MMOTION_NLS_CHARSET_INFO
+BEGIN
+        MMIO_DEFAULT_CODE_PAGE,
+        MMIO_CC_USA,
+        MMIO_LC_US_ENGLISH,
+        MMIO_DC_US_ENGLISH
+END
+
+RCDATA MMOTION_IOPROC_NAME_TABLE
+BEGIN
+        HEX_FOURCC_STREAM,     "Stream-IOProc\0",
+        0,                   "\0"
+END
+
Index: /tags/CWMM-0.3.0_GA/stream_ioproc/source/testproc.c
===================================================================
--- /tags/CWMM-0.3.0_GA/stream_ioproc/source/testproc.c	(revision 213)
+++ /tags/CWMM-0.3.0_GA/stream_ioproc/source/testproc.c	(revision 213)
@@ -0,0 +1,238 @@
+/* This program (install.c) is Public Domain */
+
+#define INCL_OS2MM
+#define INCL_DOS
+#include <os2.h>
+#include <os2me.h>
+#include <string.h>
+#include <stdlib.h>
+#include <stdio.h>
+#include "streamproc.h"
+
+
+//#include <minstall.h>
+//If you don't have minstall.h, this is all that is needed
+typedef struct _INSTMCISENDCOMMAND
+   {
+   USHORT wDeviceID;
+   USHORT wMessage;
+   ULONG  dwParam1;
+   ULONG  dwParam2;
+   USHORT wUserParm;
+   } INSTMCISENDCOMMAND;
+
+typedef INSTMCISENDCOMMAND *PINSTMCISENDCOMMAND;
+#define IM_MCI_SEND_COMMAND         0x057C
+#define IM_MCI_EXTENDED_SYSINFO     0x057E
+#define IM_LOG_ERROR       0x0573
+
+
+int deleteProc(char *Fourcc) {
+    MMINIFILEINFO mmIniFileInfo;
+    ULONG ulFlags = 0L;
+    ULONG rc;
+
+    memset( &mmIniFileInfo, '\0', sizeof(MMINIFILEINFO) );
+    mmIniFileInfo.fccIOProc = mmioStringToFOURCC(Fourcc,0);
+    ulFlags = MMIO_FINDPROC;
+    rc = mmioIniFileHandler( &mmIniFileInfo,
+                             ulFlags);
+    if (rc) {
+        printf("Couldn't find IOProc %s.  Code: %ld\n",Fourcc,rc);
+        return rc;
+    }
+
+    ulFlags = MMIO_REMOVEPROC;
+    rc = mmioIniFileHandler( &mmIniFileInfo,
+                             ulFlags);
+    if (rc) {
+        printf("Couldn't remove IOProc %s.  Code: %ld\n",Fourcc,rc);
+        return rc;
+    } else {
+        printf("Removed IOProc %s.\n",Fourcc);
+    } /* endif */
+
+    {
+       char dllname[DLLNAME_SIZE] = "DLL\\";
+       char fulldllname[DLLNAME_SIZE] = "";
+
+       strncat(dllname, mmIniFileInfo.szDLLName,sizeof(dllname));
+       strncat(dllname, ".DLL",sizeof(dllname));
+       rc = DosSearchPath(2,"MMBASE",dllname,fulldllname,sizeof(fulldllname));
+       if (rc) {
+           printf("Couldn't find %s. code:%ld\n", dllname,rc);
+           return rc;
+       }
+
+       rc = DosReplaceModule(fulldllname,NULL,NULL);
+       if (rc) {
+           printf("Couldn't unlock %s. code:%ld\n", fulldllname,rc);
+       } else {
+           printf("Unlocked %s.\n", fulldllname);
+       } /* endif */
+
+       rc = DosDelete(fulldllname);
+       if (rc) {
+           printf("Couldn't delete %s. code:%ld\n", fulldllname,rc);
+           return rc;
+       } else {
+            printf("Deleted %s.\n", fulldllname);
+       } /* endif */
+    }
+
+    return 0;
+}
+
+int queryNumStorageProcs(void)
+{
+  MMFORMATINFO mmfinfo;
+  LONG lNum=0;
+
+  printf("In %s().\n", __FUNCTION__);
+
+  memset( &mmfinfo, '\0', sizeof(MMFORMATINFO) );
+  // mmfinfo.ulIOProcType=MMIO_IOPROC_STORAGESYSTEM;
+  //mmfinfo.ulMediaType=MMIO_MEDIATYPE_AUDIO;
+
+  mmioQueryFormatCount(&mmfinfo, &lNum, 0, 0);
+  return lNum;
+}
+
+int queryNumFormatProcs(void)
+{
+  MMFORMATINFO mmfinfo;
+  LONG lNum=0;
+
+  memset( &mmfinfo, '\0', sizeof(MMFORMATINFO) );
+  mmfinfo.ulIOProcType=MMIO_IOPROC_STORAGESYSTEM;
+  mmfinfo.ulMediaType=MMIO_MEDIATYPE_AUDIO;
+
+  mmioQueryFormatCount(&mmfinfo, &lNum, 0, 0);
+  return lNum;
+}
+
+BOOL getFormats(LONG lNum)
+{
+  MMFORMATINFO mmfinfo;
+  PMMFORMATINFO pmmfi;
+
+  LONG lFormatsRead;
+  int a;
+
+  memset( &mmfinfo, '\0', sizeof(MMFORMATINFO) );
+  mmfinfo.ulIOProcType=MMIO_IOPROC_STORAGESYSTEM;
+  //  mmfinfo.ulMediaType=MMIO_MEDIATYPE_AUDIO;
+
+  if((pmmfi=(PMMFORMATINFO)malloc(lNum*sizeof(MMFORMATINFO)))==NULL)
+    return FALSE;
+
+  printf("mmioGetFormats() returned: %d \n",
+         mmioGetFormats(&mmfinfo, lNum, pmmfi, &lFormatsRead,0,0));
+
+  printf("Info for %d formats read.\n\n", lFormatsRead);
+
+  for(a=0;a<lFormatsRead;a++)
+    {
+      char name[1000];
+      LONG lBytesRead;
+
+      if(0==mmioGetFormatName(pmmfi, name, &lBytesRead, 0L, 0L))
+        {
+          name[lBytesRead]=0;
+          printf("%2d: %s\n", a+1, name);
+        }
+      else
+        printf("%2d: Can't get format name\n", a+1);
+      pmmfi++;
+    }
+  return TRUE;
+}
+
+int installProc(char * dllPath) {
+    MMINIFILEINFO mmIniFileInfo;
+    ULONG ulFlags = 0L;
+    ULONG rc;
+
+#if 0
+
+    memset( &mmIniFileInfo, '\0', sizeof(MMINIFILEINFO) );
+    mmIniFileInfo.fccIOProc = FOURCC_STREAM;//mmioStringToFOURCC(,0);
+    ulFlags = MMIO_FINDPROC;
+    rc = mmioIniFileHandler( &mmIniFileInfo,
+                             ulFlags);
+    if (rc) {
+        printf("Couldn't find IOProc %s.  Code: %ld\n",Fourcc,rc);
+        return rc;
+    }
+
+    ulFlags = MMIO_REMOVEPROC;
+    rc = mmioIniFileHandler( &mmIniFileInfo,
+                             ulFlags);
+    if (rc) {
+        printf("Couldn't remove IOProc %s.  Code: %ld\n",Fourcc,rc);
+        return rc;
+    } else {
+        printf("Removed IOProc %s.\n",Fourcc);
+    } /* endif */
+
+    {
+       char dllname[DLLNAME_SIZE] = "DLL\\";
+       char fulldllname[DLLNAME_SIZE] = "";
+
+       strncat(dllname, mmIniFileInfo.szDLLName,sizeof(dllname));
+       strncat(dllname, ".DLL",sizeof(dllname));
+       rc = DosSearchPath(2,"MMBASE",dllname,fulldllname,sizeof(fulldllname));
+       if (rc) {
+           printf("Couldn't find %s. code:%ld\n", dllname,rc);
+           return rc;
+       }
+
+       rc = DosReplaceModule(fulldllname,NULL,NULL);
+       if (rc) {
+           printf("Couldn't unlock %s. code:%ld\n", fulldllname,rc);
+       } else {
+           printf("Unlocked %s.\n", fulldllname);
+       } /* endif */
+
+       rc = DosDelete(fulldllname);
+       if (rc) {
+           printf("Couldn't delete %s. code:%ld\n", fulldllname,rc);
+           return rc;
+       } else {
+            printf("Deleted %s.\n", fulldllname);
+       } /* endif */
+    }
+#endif
+    return 0;
+}
+
+void checkForIOProc(FOURCC fourcc1)
+{
+  PMMIOPROC  pIOProc1=NULLHANDLE;
+  ULONG      ulFlags;
+
+  ulFlags= MMIO_FINDPROC;
+  pIOProc1= mmioInstallIOProc (fourcc1, pIOProc1, ulFlags);
+  //  pIOProc1= mmioInstallIOProc (0x4745504a, pIOProc1, ulFlags);
+  if (!pIOProc1)
+    /* I/O Procedure NOT FOUND */
+    printf("IO-Proc NOT found 0x%x 0x%x\n", pIOProc1, fourcc1);
+  else
+    printf("IO-Proc found!!!\n");
+      /* I/O Procedure found */
+}
+int main(int argc, char **argv) {
+
+  printf("Test stream io proc...\n\n");
+  
+  printf("Number of installed storage procs: %d\n", queryNumStorageProcs());
+  getFormats(queryNumStorageProcs());
+  checkForIOProc(mmioStringToFOURCC("WAVE",0));
+
+  //  getFormats(45);
+  installProc("STREAMIO.DLL");
+  return 0;
+}
+
+
+
Index: /tags/CWMM-0.3.0_GA/todo.txt
===================================================================
--- /tags/CWMM-0.3.0_GA/todo.txt	(revision 213)
+++ /tags/CWMM-0.3.0_GA/todo.txt	(revision 213)
@@ -0,0 +1,29 @@
+Cache Information for audio shadows so mp3 tracks from CD work in media folders.
+
+Allow additional parameters for player and editor
+CDFolder: Create folder script
+
+-Help panel for PNG
+-Types (strings) for MM classes as resources
+-bitrate and #samples in EA
+-Help panel for FLAC
+-Hilfe fr volume
+
+cwimage:
+Create bitmap thread may not be thread safe.
+
+Delete main bitmap handle after creating a new one for the caller in
+wpQueryBitmapHandle().
+
+Implement a method for shared bitmaps with reference count.
+
+Mediafolder::wpSetup(): Volume setting is broken.
+
+
+mmfind_nl.rc/dlg must be translated.
+
+Position of audio-info control may be wrong in other languages.
+
+27.08.06:
+
+wpQueryBitmapHandle(): if size is zero don't scale. ATM no bmp is created at all.
Index: /tags/CWMM-0.3.0_GA/tools/create_def.CMD
===================================================================
--- /tags/CWMM-0.3.0_GA/tools/create_def.CMD	(revision 213)
+++ /tags/CWMM-0.3.0_GA/tools/create_def.CMD	(revision 213)
@@ -0,0 +1,202 @@
+/*                                                         */
+/* Create DEF file for a MM helper program from a template */
+/*                                                         */
+/*         (c) Chris Wohlgemuth 2005                       */
+/*                                                         */
+
+call RxFuncAdd 'SysLoadFuncs', 'RexxUtil', 'SysLoadFuncs'
+call SysLoadFuncs
+
+DEBUG=1
+
+
+deffile=ARG(1)
+if ARG(1)="" then deffile="tst.def"
+/*Trim off the templateFile if any*/
+deffile=DELWORD(deffile,2)
+/* License file to be added to the DEF file */
+licenseFile=VALUE("CWMMLICENCE", ,"OS2ENVIRONMENT")
+
+/* Template file */
+templateFile=ARG(1)
+/*Trim end of args*/
+templateFile=DELWORD(templateFile,3)
+/*Template file is really ARG(2) but ARG(1) pulls in everything so we delete the first arg*/
+templateFile=DELWORD(templateFile,1,1)
+IF templateFile="" THEN
+	templateFile=DIRECTORY()||'\'||def.tpl
+
+/* Get the version of the classes */
+theVersion=VALUE("MMCLSVERSION", ,"OS2ENVIRONMENT")
+if theVersion="" THEN theVersion="0.0.0"
+
+/* The stem holding all the information we get from the template file */
+fileData.=''
+
+
+call getTemplateData templateFile
+/* Index */
+call assignTemplateVars
+
+IF DEBUG=1 THEN DO
+	DO a=1 to filedata.0
+		SAY fileData.a.sectionname":"
+		SAY fileData.a
+	END
+END
+
+/* Specify save defaults */
+IF fileData.buildmachine="" THEN
+	fileData.buildmachine="Default"
+fileData.buildmachine.desc="Build machine: "
+
+IF fileData.author="" THEN
+	fileData.author="                      "
+fileData.author.desc="Author: "
+IF fileData.name='' THEN
+	fileData.name=""
+
+IF DEBUG=1 THEN DO
+	SAY ""
+	SAY "License file: "||licensefile
+	SAY "DEF-file: "||deffile
+        SAY "Version: "||theversion
+    SAY "Template file: "||templateFile
+	SAY "Template data: "
+	DO a=1 to fileData.0
+		SAY " "||fileData.a.desc||": "||fileData.a
+	END
+END
+
+'@type NUL > 'deffile
+
+/* Write header */
+call lineout deffile, ';'
+call lineout deffile, '; '||WORD(fileData.name,2)||": "fileData.description
+call lineout deffile, ';'
+
+/* Write copyright */
+call lineout deffile, ';'
+IF fileData.copyright><"" THEN
+	call lineout deffile, ';    '||fileData.copyright||"-"WORD(DATE(),3)
+ELSE
+	call lineout deffile, ';    '||fileData.author||" "WORD(DATE(),3)
+call lineout deffile, ';'
+/* Write creation date */
+call lineout deffile, ';'
+call lineout deffile, '; Created '||DATE()||" "||TIME()
+call lineout deffile, ';'
+
+/* Write license */
+DO WHILE LINES(licenseFile)
+	theLine=LINEIN(licenseFile)
+        IF LENGTH(theLine) >0 THEN DO
+		IF substr(theLine,1,1) >< ';' THEN
+			theLine=';'||theLine
+	END
+	ELSE
+	   theLine=theLine||';'
+	call LINEOUT deffile, theLine
+END
+call stream licenseFile, "C", "close"
+
+/* Now write the NAME data */
+call lineout deffile, fileData.name
+
+/* Description with bldlevel info */
+timeData=OVERLAY(DATE("E")||" "||TIME("N"), "                       ")
+versionData=OVERLAY( LEFT(theVersion,3),"           ")
+def="DESCRIPTION '$@#"||fileData.author||" "
+def=def||":"||theVersion||"#@##1## "||timeData
+def=def||"  "||SUBSTR(fileData.buildmachine,1,11)||"::::"||WORD(TRANSLATE(theVersion," ", "."),3)
+def=def||"::@@"||fileData.description||" "||fileData.copyright||"-"WORD(DATE(),3)"'"
+call lineout deffile, def
+
+/* Additional info we may have */
+call  lineout deffile, fileData.other
+
+call stream deffile, "C", "close"
+
+SAY "New DEF file created for V"||theVersion||"."
+exit
+
+/************************************************************/
+/* Assign the symbols specified by the sections list the position value
+   they have in the list of sections. By doing this the symbols may be used
+   as indexes in the filedata. stem*/
+assignTemplateVars: procedure expose (fileData.sections)
+	DO a=1 to WORDS(fileData.sections)
+		call VALUE WORD(fileData.sections,a),a
+	END
+return
+
+/************ Parse the template file ***********************/
+getTemplateData: procedure expose fileData.
+	theFile=arg(1)
+
+	fileData.=''
+	fileContents.=''
+
+	fileContents.0=0
+	/* Read in the file for easier processing */
+	DO WHILE LINES(theFile)
+		fileContents.0=fileContents.0+1
+		b=fileContents.0
+		fileContents.b=LINEIN(theFile)
+	END
+	call stream theFile, "C", "close"
+
+	DO b=1 to fileContents.0
+		theLine=fileContents.b
+		fileContents.current=b
+		section = Strip(Translate(word(theline,1)))
+		select
+	    		when (Left(section,1) = '#') | section = '' then
+			do
+			/* Jump comments and empty lines */
+			end;
+		WHEN LEFT(section,1)="[" THEN DO
+			call parseSection
+			b=fileContents.current
+		END
+		OTHERWISE
+			nop			
+		END
+
+	END
+	fileData.0=WORDS(fileData.sections)
+	DROP fileContents.
+return
+
+parseSection: procedure expose fileData. fileContents.
+	b=fileContents.current
+	/* Add this section to the list of sections */
+	filedata.sections=filedata.sections||" "||SPACE(TRANSLATE(fileContents.b, "  ", "[]"))
+	index=WORDS(fileData.sections)
+	fileData.index=""
+	fileData.index.sectionname=SPACE(TRANSLATE(fileContents.b, "  ", "[]"))
+	/* Parse this section */
+	b=b+1
+	DO a=b to fileContents.0
+		theLine=fileContents.a
+		fileContents.current=a
+		section = Strip(Translate(word(theline,1)))
+		select
+	    		when (Left(section,1) = '#') | section = '' then
+			do
+			/* Jump comments and empty lines */
+			end;
+		WHEN LEFT(section,1)="[" THEN DO
+			/* New section jump back after correcting the index */
+			fileContents.current=fileContents.current-1
+			return
+		END
+		OTHERWISE
+			IF fileData.index <>"" THEN fileData.index=fileData.index||'0d'x||'0a'x
+			fileData.index=fileData.index||theLine			
+		END
+
+	END
+
+return
+/***********************************************/
Index: /tags/CWMM-0.3.0_GA/tools/license.txt
===================================================================
--- /tags/CWMM-0.3.0_GA/tools/license.txt	(revision 213)
+++ /tags/CWMM-0.3.0_GA/tools/license.txt	(revision 213)
@@ -0,0 +1,15 @@
+/*
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; see the file COPYING.  If not, write to
+ * the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
Index: /tags/CWMM-0.3.0_GA/warpin/Build_CWMM.cmd
===================================================================
--- /tags/CWMM-0.3.0_GA/warpin/Build_CWMM.cmd	(revision 213)
+++ /tags/CWMM-0.3.0_GA/warpin/Build_CWMM.cmd	(revision 213)
@@ -0,0 +1,122 @@
+/*
+        Build_CWMM.cmd:
+        this uses WIC.EXE to create an archive called
+        CWMM.WPI, containing the CWMM program
+        (C) VOICE 
+*/
+
+/* Set DEBUG=1 to output diagnostic information, and pause, while building */
+DEBUG=0
+
+/* Load the REXX Funcs library */
+call RxFuncAdd 'SysLoadFuncs', 'RexxUtil', 'SysLoadFuncs'
+call SysLoadFuncs
+
+/* Big screen, so you can see what happened */
+"@MODE Co80,43"
+
+/* Find out where warpIn is. */
+origdir = directory();
+warpindir=SysIni('USER', 'WarpIN', 'Path')
+warpindir=left(warpindir,length(warpindir)-1)
+
+/* set the ENDLIBPATH */
+"@SET ENDLIBPATH="warpindir
+
+If DEBUG=1 then Do
+  SAY "Wic.exe is found in: "warpindir
+  SAY "Press any key to continue"
+  a=SysGetKey()
+end
+
+/*call directory origdir*/
+
+/* set package name */
+pkgname='CWMM'
+
+/*x = lastpos("\",origdir)
+pkgname=right(origdir,length(origdir)-x)*/
+
+If DEBUG=1 then Do
+  SAY "Package name: "pkgname
+  SAY "Press any key to continue"
+  a=SysGetKey()
+end
+
+/* get environment variables for major/minor/revision/fixlevel */
+major=VALUE('CWMMMAJOR',,'OS2ENVIRONMENT')
+minor=VALUE('CWMMMINOR',,'OS2ENVIRONMENT')
+revision=VALUE('CWMMREVISION',,'OS2ENVIRONMENT')
+fixlevel=VALUE('CWMMFIXLEVEL',,'OS2ENVIRONMENT')
+
+if major=''|minor=''|revision='' then Do
+  /* If the environment variables are not set, ask for version number */
+  version = ''
+  SAY 
+  SAY "Please enter the 3, or 4, digit version number, in the form 1\2\3 or 1\2\3\4 : "
+
+  PARSE PULL major'\'minor'\'revision'\'fixlevel
+end
+
+/* This is where the version information is added to the file name */
+if fixlevel='' then do
+   version=major'\'minor'\'revision
+   fileversion='-'major'-'minor'-'revision
+end
+else Do
+   version=major'\'minor'\'revision'\'fixlevel
+   fileversion='-'major'-'minor'-'revision'-'fixlevel
+end
+
+If DEBUG=1 then Do
+  SAY "The WarpIn installer file name will be: "pkgname||fileversion".WPI"
+  SAY "Press any key to continue"
+  a=SysGetKey()
+end
+
+/* Now, update the package.wis file to add the version information */
+InName=pkgname||".wis" 
+OutName=pkgname||fileversion||".wis"
+DO UNTIL (lines(InName)=0)
+  linex=linein(InName)
+  If POS('PACKAGEID="Netlabs\CWMM',linex)>0 then Do
+    linex=linex||version||'"'
+  end
+  rc=lineout(Outname,linex)
+END
+call stream OutName, "C", "CLOSE"	/* close them */
+call stream InName, "C", "CLOSE"
+
+If DEBUG=1 then Do
+  /* display the resulting WIS file */
+  "@E.EXE "OutName
+end
+
+/* Create the packages as a WPI file */
+/* Package 1 prog.dll */
+warpindir"\wic.exe "pkgname||fileversion" -a 1 -r -cOS2DLL * -s "||pkgname||fileversion||".wis"
+
+/* Package 2 CW Multimedia classes */
+warpindir"\wic.exe "pkgname||fileversion" -a 2 -r -cMMCLASS * -s "||pkgname||fileversion||".wis"
+
+/* Package 3 Media folder */
+warpindir"\wic.exe "pkgname||fileversion" -a 3 -r -cMEDIAFLD * -s "||pkgname||fileversion||".wis"
+
+/* Package 4 JPEGIO.DLL */
+warpindir"\wic.exe "pkgname||fileversion" -a 4 -r -cDLL * -s "||pkgname||fileversion||".wis"
+
+/* Package 5 FreeDB */
+warpindir"\wic.exe "pkgname||fileversion" -a 5 -r -cFREEDB * -s "||pkgname||fileversion||".wis"
+
+If DEBUG=1 then Do
+  SAY "Save the results? [Y/N]"
+  PARSE UPPER PULL answer
+end
+
+IF answer = "Y"|DEBUG=0 then DO
+   /* save the last attempt */
+   '@copy 'pkgname||fileversion'.* History'
+END
+"@del "pkgname||fileversion".*"
+
+exit
Index: /tags/CWMM-0.3.0_GA/warpin/CWMM.wis
===================================================================
--- /tags/CWMM-0.3.0_GA/warpin/CWMM.wis	(revision 213)
+++ /tags/CWMM-0.3.0_GA/warpin/CWMM.wis	(revision 213)
@@ -0,0 +1,123 @@
+<WARPIN VERSION="1.0"
+CODEPAGE=850>
+
+<HEAD>
+
+    <REXX NAME="CheckDLL">
+        /* Searches the system LIBPATH for the specified DLL.  If not found,
+         * displays a popup dialog, and optionally aborts the installation.
+         *
+         * Parameters:
+         *      dname   Name of the DLL to look for (must include extension)
+         *      fail    If 1, abort installation if the DLL was not found
+         *      message Message text to be shown when the DLL is not found
+         */
+        CALL RxFuncAdd 'SysLoadFuncs', 'REXXUTIL', 'SysLoadFuncs'
+        CALL SysLoadFuncs
+
+        PARSE ARG dname fail message
+        IF dname == '' THEN RETURN ''
+
+        _bd = SysBootDrive()
+        IF _bd == '' THEN
+            _bd = FILESPEC('DRIVE', VALUE('COMSPEC',,'OS2ENVIRONMENT'))
+        _cwmm = _bd'\MMOS2\MMCLASS\'dname
+
+        call SysFileTree _cwmm, 'file', 'FO'
+
+        IF file.0 == 0 THEN DO
+            title = dname 'Not Found'
+            rc = WirexxShowMessage( title, message )
+            IF fail == 1 THEN CALL WirexxCancel
+        END
+
+        RETURN ''
+    </REXX>
+
+<PCK INDEX=1
+     PACKAGEID="Netlabs\CWMM\Progfld\
+     TARGET="?:\OS2\DLL"
+     TITLE="CWMM Program Support Class Module"
+     SELECT
+     NODESELECT
+     LONGFILENAMES
+     KILLPROCESS="progfld.dll"
+     FIXED
+     =("CheckDLL CWMM.DLL 1 Either this is not an ArcaOS system or MMOS2/CWMM is not installed. This installer can only be used to update an ArcaOS system with MMOS2/CWMM already installed.")
+     >This package contains the CWMM Program Support class DLL.
+     </PCK>
+
+<PCK INDEX=2
+     PACKAGEID="Netlabs\CWMM\Classes\
+     TARGET="?:\MMOS2\MMCLASS"
+     BASE
+     TITLE="CWMM Classes"
+     SELECT
+     NODESELECT
+     LONGFILENAMES
+     KILLPROCESS="CWMM.dll"
+     FIXED
+     EXECUTE="cube {RL #EXTNAMES=# WITH #EXTNAMES=14,AVI,FLI,FLC,FLV,3GP,M4V,MKV,MOV,MP4,MPEG,MTS,VOB,WMV,WEBM# (FIRST *ID} ?:\MMOS2\MMPM2.INI ?:\MMOS2\MMPM2.BCK (DLM #"
+     >This package contains the CWMM classes.
+     </PCK>
+
+<PCK INDEX=3
+     PACKAGEID="Netlabs\CWMM\MediaFolder\
+     TARGET="?:\MMOS2\MEDIAFLD"
+     TITLE="CWMM Media Folder"
+     SELECT
+     NODESELECT
+     LONGFILENAMES
+     FIXED
+     >This package contains the CWMM Media Folder.
+     </PCK>
+     
+<PCK INDEX=4
+     PACKAGEID="Netlabs\CWMM\JPEGIO\
+     TARGET="?:\MMOS2\DLL"
+     TITLE="JPEG IO Plugin"
+     SELECT
+     LONGFILENAMES
+     FIXED
+     >This package contains the JPEG IO DLL.
+     </PCK>
+
+<PCK INDEX=5
+     PACKAGEID="Netlabs\CWMM\FreeDB\
+     TARGET="?:\MMOS2\FREEDB"
+     TITLE="CWMM Configure CDDB client"
+     SELECT
+     LONGFILENAMES
+     FIXED
+     CREATEOBJECT="REPLACE WPProgram|Configure CDDB Client|<MMPM2_FOLDER>|EXENAME=$(5)\PMCDDB.EXE;PARAMETERS=/C [Enter your email address];ICONRESOURCE=1,$(5)\pmdb001.dll;OBJECTID=<CWFREEDB_CLIENT_CONFIG>"
+     >This Package contains the CD database lookup utility
+     </PCK>
+
+</HEAD>
+
+<BODY>
+
+<PAGE INDEX=1 TYPE=README>
+<NEXTBUTTON TARGET=2>~Next</NEXTBUTTON>
+<TEXT>This package will install CWMM.</TEXT>
+<README>NOTE: This installer will only work on an ArcaOS system with MMOS2 installed.</README>  
+</PAGE>
+
+<PAGE INDEX=2 TYPE=README>
+<NEXTBUTTON TARGET=3>~I agree</NEXTBUTTON>
+<TEXT>By pressing the "I agree" button, you agree to all terms and conditions of the license agreement below.</TEXT>
+<README EXTRACTFROMPCK="2">copying</README>
+</PAGE>
+
+<PAGE INDEX=3 TYPE=CONTAINER>
+    <TEXT>Please select the packages to install, and the target path(s).</TEXT>
+</PAGE>
+
+<PAGE INDEX=4 TYPE=CONFIGURE>
+    <TEXT>Select "Install" to begin the installation. You must reboot the system in order for the update to take effect</TEXT>
+    <NEXTBUTTON TARGET=0>~Install</NEXTBUTTON>
+</PAGE>
+
+</BODY>
+</WARPIN>
+
Index: /tags/CWMM-0.3.0_GA/warpin/Prebuild_CWMM.cmd
===================================================================
--- /tags/CWMM-0.3.0_GA/warpin/Prebuild_CWMM.cmd	(revision 213)
+++ /tags/CWMM-0.3.0_GA/warpin/Prebuild_CWMM.cmd	(revision 213)
@@ -0,0 +1,72 @@
+rem CW-Multimedia classes  	
+	if not exist MMCLASS md MMCLASS
+        copy ..\classes\cwmm.dll MMCLASS
+	copy ..\classes\cwmm.sym MMCLASS
+	cd MMCLASS && lxlite *.dll && lxlite *.dll /c:minstub && cd ..
+        if not exist MMCLASS\bin md MMCLASS\bin
+        if not exist MMCLASS\bin\languages md MMCLASS\bin\languages
+	copy ..\classes\mm-progs\audioconverter\audconv.exe MMCLASS\bin
+	copy ..\classes\mm-progs\master_volume\volume.exe MMCLASS\bin 
+	copy ..\classes\mm-progs\volume\classvol.exe MMCLASS\bin 
+	copy ..\classes\mm-progs\imageconverter\imgconv.exe MMCLASS\bin 
+	copy ..\classes\mm-progs\mmplayer\mmplayer.exe MMCLASS\bin 
+	copy ..\classes\mm-progs\mmfind\mmfind.exe MMCLASS\bin 
+	copy ..\classes\res\dll\mmres_EN.dll MMCLASS\bin
+	copy ..\classes\res\dll\mmres_*.dll MMCLASS\bin\languages
+	cd MMCLASS\bin && lxlite * && lxlite * /c:minstub && cd ..\..
+	cd MMCLASS\bin\languages && lxlite * && lxlite * /c:minstub && cd ..\..\..
+	copy ..\classes\bin\*.CMD MMCLASS\bin
+	copy ..\classes\bin\*.rx  MMCLASS\bin
+	copy ..\classes\help\en\cwmm.hlp MMCLASS
+	copy ..\HISTORY MMCLASS
+        copy ..\classes\help\ru\cwmm007.hlp MMCLASS\bin\languages
+        copy ..\classes\help\de\cwmm049.hlp MMCLASS\bin\languages
+        copy ..\classes\help\es\cwmm034.hlp MMCLASS\bin\languages
+        copy ..\classes\help\fr\cwmm033.hlp MMCLASS\bin\languages
+        copy ..\classes\help\it\cwmm039.hlp MMCLASS\bin\languages
+        copy ..\classes\help\nl\cwmm031.hlp MMCLASS\bin\languages
+        copy ..\classes\help\tw\cwmm088.hlp MMCLASS\bin\languages
+   
+rem JPEG IO-Proc
+	if not exist DLL md DLL
+        copy ..\JPGPROC\source\JPEGIO.DLL DLL
+	copy ..\JPGPROC\source\JPEGIO.SYM DLL
+	cd DLL && lxlite *.dll && lxlite *.dll /c:minstub && cd ..
+rem Mediafolder        
+        if not exist MEDIAFLD\Doc md MEDIAFLD\Doc
+        if not exist MEDIAFLD\bin md MEDIAFLD\bin
+        if not exist MEDIAFLD\bin\languages md MEDIAFLD\bin\languages
+        copy ..\mediafolder\prog_tutorial\mediafldrprog.inf MEDIAFLD\Doc\mediafldr.inf
+        copy ..\mediafolder\prog_tutorial\de\mediafldrprog_de.inf MEDIAFLD\Doc\mediafldr_de.inf
+        copy ..\mediafolder\prog_tutorial\es\mediafldrprog_es.inf MEDIAFLD\Doc\mediafldr_es.inf
+        copy ..\mediafolder\prog_tutorial\fr\mediafldrprog_fr.inf MEDIAFLD\Doc\mediafldr_fr.inf
+        copy ..\mediafolder\prog_tutorial\ru\mediafldrprog_ru.inf MEDIAFLD\Doc\mediafldr_ru.inf
+        copy ..\mediafolder\prog_tutorial\tw\mediafldrprog_tw.inf MEDIAFLD\Doc\mediafldr_tw.inf
+	copy ..\mediafolder\bin\*.cmd MEDIAFLD\bin
+	copy ..\mediafolder\bin\*.rx  MEDIAFLD\bin
+        if not exist OS2DLL md OS2DLL
+	copy ..\mediafolder\progfldr.dll OS2DLL
+	copy ..\mediafolder\c\createcd\createcd.exe  MEDIAFLD\bin
+	copy ..\mediafolder\mediafld.dll MEDIAFLD\bin\mediafld.dll
+	copy ..\mediafolder\res\obj\mfldr_en.dll MEDIAFLD\bin\mfldr_en.dll
+	copy ..\mediafolder\res\obj\mfldr_*.dll MEDIAFLD\bin\languages
+	copy ..\mediafolder\help\mediafldr.hlp MEDIAFLD\bin\mediafld.hlp
+        copy ..\mediafolder\Help\mediafldr007.hlp MEDIAFLD\bin\languages
+        copy ..\mediafolder\Help\mediafldr031.hlp MEDIAFLD\bin\languages
+        copy ..\mediafolder\Help\mediafldr033.hlp MEDIAFLD\bin\languages
+        copy ..\mediafolder\Help\mediafldr034.hlp MEDIAFLD\bin\languages
+        copy ..\mediafolder\Help\mediafldr039.hlp MEDIAFLD\bin\languages
+        copy ..\mediafolder\Help\mediafldr049.hlp MEDIAFLD\bin\languages
+        copy ..\mediafolder\Help\mediafldr088.hlp MEDIAFLD\bin\languages
+        if not exist FreeDB md FreeDB
+        if not exist FreeDB\languages md FreeDB\languages
+	copy ..\mediafolder\c\cddb\pmcddb.exe FreeDB
+	copy ..\mediafolder\c\cddb\pmdb001.dll FreeDB
+	copy ..\mediafolder\c\cddb\pmdb*.dll FreeDB\languages
+	copy ..\mediafolder\c\cddb\cddb.ini FreeDB
+	cd MEDIAFLD\bin && lxlite * && lxlite * /c:minstub && cd ..\..
+	cd MEDIAFLD\bin\languages && lxlite * && lxlite * /c:minstub && cd ..\..\..
+	cd OS2DLL && lxlite * && lxlite * /c:minstub && cd ..
+	cd FreeDB && lxlite * && lxlite * /c:minstub && cd ..
+	cd OS2DLL && lxlite * && lxlite * /c:minstub && cd ..
+Build_CWMM.cmd
