]> git.saurik.com Git - wxWidgets.git/blobdiff - samples/console/console.cpp
Add event based Drop API
[wxWidgets.git] / samples / console / console.cpp
index 35037e5b9781c5641f1fca15c241135204e9db68..8a9a0705c6eeceeea06dd7d531f884233ad62a81 100644 (file)
@@ -1,6 +1,6 @@
 /////////////////////////////////////////////////////////////////////////////
 // Name:        samples/console/console.cpp
-// Purpose:     a sample console (as opposed to GUI) progam using wxWidgets
+// Purpose:     A sample console (as opposed to GUI) program using wxWidgets
 // Author:      Vadim Zeitlin
 // Modified by:
 // Created:     04.10.99
@@ -9,6 +9,57 @@
 // Licence:     wxWindows license
 /////////////////////////////////////////////////////////////////////////////
 
+// IMPORTANT NOTE FOR WXWIDGETS USERS:
+// If you're a wxWidgets user and you're looking at this file to learn how to
+// structure a wxWidgets console application, then you don't have much to learn.
+// This application is used more for testing rather than as sample but
+// basically the following simple block is enough for you to start your
+// own console application:
+
+/*
+    int main(int argc, char **argv)
+    {
+        wxApp::CheckBuildOptions(WX_BUILD_OPTIONS_SIGNATURE, "program");
+
+        wxInitializer initializer;
+        if ( !initializer )
+        {
+            fprintf(stderr, "Failed to initialize the wxWidgets library, aborting.");
+            return -1;
+        }
+
+        static const wxCmdLineEntryDesc cmdLineDesc[] =
+        {
+            { wxCMD_LINE_SWITCH, "h", "help", "show this help message",
+                wxCMD_LINE_VAL_NONE, wxCMD_LINE_OPTION_HELP },
+            // ... your other command line options here...
+
+            { wxCMD_LINE_NONE }
+        };
+
+        wxCmdLineParser parser(cmdLineDesc, argc, wxArgv);
+        switch ( parser.Parse() )
+        {
+            case -1:
+                wxLogMessage(_T("Help was given, terminating."));
+                break;
+
+            case 0:
+                // everything is ok; proceed
+                break;
+
+            default:
+                wxLogMessage(_T("Syntax error detected, aborting."));
+                break;
+        }
+
+        // do something useful here
+
+        return 0;
+    }
+*/
+
+
 // ============================================================================
 // declarations
 // ============================================================================
 
 #include "wx/string.h"
 #include "wx/file.h"
+#include "wx/filename.h"
 #include "wx/app.h"
 #include "wx/log.h"
+#include "wx/apptrait.h"
+#include "wx/platinfo.h"
+#include "wx/wxchar.h"
 
 // without this pragma, the stupid compiler precompiles #defines below so that
 // changing them doesn't "take place" later!
 
 // what to test (in alphabetic order)? Define TEST_ALL to 0 to do a single
 // test, define it to 1 to do all tests.
-#define TEST_ALL 0
+#define TEST_ALL 1
 
 
 #if TEST_ALL
     #define TEST_CMDLINE
     #define TEST_DATETIME
     #define TEST_DIR
-    #define TEST_DLLLOADER
+    #define TEST_DYNLIB
     #define TEST_ENVIRON
     #define TEST_EXECUTE
     #define TEST_FILE
     #define TEST_FILECONF
     #define TEST_FILENAME
     #define TEST_FILETIME
- //   #define TEST_FTP  --FIXME! (RN)
+    #define TEST_FTP
     #define TEST_INFO_FUNCTIONS
     #define TEST_LOCALE
     #define TEST_LOG
     #define TEST_MIME
+    #define TEST_MODULE
     #define TEST_PATHLIST
-    #define TEST_ODBC
     #define TEST_PRINTF
     #define TEST_REGCONF
     #define TEST_REGEX
     #define TEST_WCHAR
     #define TEST_ZIP
 #else // #if TEST_ALL
-    #define TEST_STACKWALKER
+    #define TEST_FTP
 #endif
 
 // some tests are interactive, define this to run them
@@ -133,7 +188,7 @@ static wxString MakePrintable(const wxChar *s)
 
 static void ShowCmdLine(const wxCmdLineParser& parser)
 {
-    wxString s = _T("Input files: ");
+    wxString s = _T("Command line parsed successfully:\nInput files: ");
 
     size_t count = parser.GetParamCount();
     for ( size_t param = 0; param < count; param++ )
@@ -147,6 +202,7 @@ static void ShowCmdLine(const wxCmdLineParser& parser)
 
     wxString strVal;
     long lVal;
+    double dVal;
     wxDateTime dt;
     if ( parser.Found(_T("o"), &strVal) )
         s << _T("Output file:\t") << strVal << '\n';
@@ -154,6 +210,8 @@ static void ShowCmdLine(const wxCmdLineParser& parser)
         s << _T("Input dir:\t") << strVal << '\n';
     if ( parser.Found(_T("s"), &lVal) )
         s << _T("Size:\t") << lVal << '\n';
+    if ( parser.Found(_T("f"), &dVal) )
+        s << _T("Double:\t") << dVal << '\n';
     if ( parser.Found(_T("d"), &dt) )
         s << _T("Date:\t") << dt.FormatISODate() << '\n';
     if ( parser.Found(_T("project_name"), &strVal) )
@@ -201,7 +259,7 @@ static void TestCmdLineConvert()
 #ifdef __UNIX__
     static const wxChar *ROOTDIR = _T("/");
     static const wxChar *TESTDIR = _T("/usr/local/share");
-#elif defined(__WXMSW__)
+#elif defined(__WXMSW__) || defined(__DOS__) || defined(__OS2__)
     static const wxChar *ROOTDIR = _T("c:\\");
     static const wxChar *TESTDIR = _T("d:\\");
 #else
@@ -228,6 +286,8 @@ static void TestDirEnumHelper(wxDir& dir,
     wxPuts(wxEmptyString);
 }
 
+#if TEST_ALL
+
 static void TestDirEnum()
 {
     wxPuts(_T("*** Testing wxDir::GetFirst/GetNext ***"));
@@ -283,6 +343,8 @@ static void TestDirEnum()
     TestDirEnumHelper(dirNo);
 }
 
+#endif // TEST_ALL
+
 class DirPrintTraverser : public wxDirTraverser
 {
 public:
@@ -294,7 +356,7 @@ public:
     virtual wxDirTraverseResult OnDir(const wxString& dirname)
     {
         wxString path, name, ext;
-        wxSplitPath(dirname, &path, &name, &ext);
+        wxFileName::SplitPath(dirname, &path, &name, &ext);
 
         if ( !ext.empty() )
             name << _T('.') << ext;
@@ -333,6 +395,8 @@ static void TestDirTraverse()
     dir.Traverse(traverser, wxEmptyString, wxDIR_DIRS | wxDIR_HIDDEN);
 }
 
+#if TEST_ALL
+
 static void TestDirExists()
 {
     wxPuts(_T("*** Testing wxDir::Exists() ***"));
@@ -366,13 +430,15 @@ static void TestDirExists()
     }
 }
 
+#endif // TEST_ALL
+
 #endif // TEST_DIR
 
 // ----------------------------------------------------------------------------
 // wxDllLoader
 // ----------------------------------------------------------------------------
 
-#ifdef TEST_DLLLOADER
+#ifdef TEST_DYNLIB
 
 #include "wx/dynlib.h"
 
@@ -398,7 +464,7 @@ static void TestDllLoad()
     }
     else
     {
-        typedef int (*wxStrlenType)(const char *);
+        typedef int (wxSTDCALL *wxStrlenType)(const char *);
         wxStrlenType pfnStrlen = (wxStrlenType)lib.GetSymbol(FUNC_NAME);
         if ( !pfnStrlen )
         {
@@ -419,6 +485,26 @@ static void TestDllLoad()
                 wxPuts(_T("... ok"));
             }
         }
+
+#ifdef __WXMSW__
+        static const wxChar *FUNC_NAME_AW = _T("lstrlen");
+
+        typedef int (wxSTDCALL *wxStrlenTypeAorW)(const wxChar *);
+        wxStrlenTypeAorW
+            pfnStrlenAorW = (wxStrlenTypeAorW)lib.GetSymbolAorW(FUNC_NAME_AW);
+        if ( !pfnStrlenAorW )
+        {
+            wxPrintf(_T("ERROR: function '%s' wasn't found in '%s'.\n"),
+                     FUNC_NAME_AW, LIB_NAME);
+        }
+        else
+        {
+            if ( pfnStrlenAorW(_T("foobar")) != 6 )
+            {
+                wxPrintf(_T("ERROR: loaded function is not wxStrlen()!\n"));
+            }
+        }
+#endif // __WXMSW__
     }
 }
 
@@ -434,7 +520,7 @@ static void TestDllListLoaded()
     for ( size_t n = 0; n < count; ++n )
     {
         const wxDynamicLibraryDetails& details = dlls[n];
-        printf("%-45s", details.GetPath().mb_str());
+        printf("%-45s", (const char *)details.GetPath().mb_str());
 
         void *addr;
         size_t len;
@@ -444,13 +530,13 @@ static void TestDllListLoaded()
                    (unsigned long)addr, (unsigned long)((char *)addr + len));
         }
 
-        printf(" %s\n", details.GetVersion().mb_str());
+        printf(" %s\n", (const char *)details.GetVersion().mb_str());
     }
 }
 
 #endif
 
-#endif // TEST_DLLLOADER
+#endif // TEST_DYNLIB
 
 // ----------------------------------------------------------------------------
 // wxGet/SetEnv
@@ -502,11 +588,13 @@ static void TestExecute()
     wxPuts(_T("*** testing wxExecute ***"));
 
 #ifdef __UNIX__
-    #define COMMAND "cat -n ../../Makefile" // "echo hi"
+    #define COMMAND "echo hi"
+    #define ASYNC_COMMAND "xclock"
     #define SHELL_COMMAND "echo hi from shell"
-    #define REDIRECT_COMMAND COMMAND // "date"
+    #define REDIRECT_COMMAND "cat -n Makefile"
 #elif defined(__WXMSW__)
     #define COMMAND "command.com /c echo hi"
+    #define ASYNC_COMMAND "notepad"
     #define SHELL_COMMAND "echo hi"
     #define REDIRECT_COMMAND COMMAND
 #else
@@ -522,19 +610,22 @@ static void TestExecute()
 
     wxPrintf(_T("Testing wxExecute: "));
     fflush(stdout);
-    if ( wxExecute(_T(COMMAND), true /* sync */) == 0 )
+    if ( wxExecute(_T(COMMAND), wxEXEC_SYNC) == 0 )
         wxPuts(_T("Ok."));
     else
         wxPuts(_T("ERROR."));
 
-#if 0 // no, it doesn't work (yet?)
     wxPrintf(_T("Testing async wxExecute: "));
     fflush(stdout);
-    if ( wxExecute(COMMAND) != 0 )
+    int pid = wxExecute(ASYNC_COMMAND);
+    if ( pid != 0 )
+    {
         wxPuts(_T("Ok (command launched)."));
+        if ( wxKill(pid) == -1 )
+            wxPuts("ERROR: failed to kill child process.");
+    }
     else
         wxPuts(_T("ERROR."));
-#endif // 0
 
     wxPrintf(_T("Testing wxExecute with redirection:\n"));
     wxArrayString output;
@@ -544,10 +635,25 @@ static void TestExecute()
     }
     else
     {
-        size_t count = output.GetCount();
-        for ( size_t n = 0; n < count; n++ )
+        // don't show too much output, MAX_LINES is enough
+        static const unsigned MAX_LINES = 20;
+
+        const unsigned count = output.size();
+        for ( unsigned n = 0;
+              n < (count > MAX_LINES ? MAX_LINES/2 : count);
+              n++ )
         {
-            wxPrintf(_T("\t%s\n"), output[n].c_str());
+            wxPrintf("%04u:\t%s\n", n + 1, output[n]);
+        }
+
+        if ( count > MAX_LINES )
+        {
+            wxPrintf("... skipping %u lines...\n", count - MAX_LINES);
+
+            for ( unsigned n = count - MAX_LINES/2; n < count; n++ )
+            {
+                wxPrintf("%04u:\t%s\n", n + 1, output[n]);
+            }
         }
 
         wxPuts(_T("Ok."));
@@ -689,6 +795,24 @@ static void TestFileCopy()
     wxPuts(wxEmptyString);
 }
 
+static void TestTempFile()
+{
+    wxPuts(_T("*** wxTempFile test ***"));
+
+    wxTempFile tmpFile;
+    if ( tmpFile.Open(_T("test2")) && tmpFile.Write(_T("the answer is 42")) )
+    {
+        if ( tmpFile.Commit() )
+            wxPuts(_T("File committed."));
+        else
+            wxPuts(_T("ERROR: could't commit temp file."));
+
+        wxRemoveFile(_T("test2"));
+    }
+
+    wxPuts(wxEmptyString);
+}
+
 #endif // TEST_FILE
 
 // ----------------------------------------------------------------------------
@@ -869,8 +993,8 @@ static void TestFileNameCwd()
 
 #ifdef TEST_FILETIME
 
-#include <wx/filename.h>
-#include <wx/datetime.h>
+#include "wx/filename.h"
+#include "wx/datetime.h"
 
 static void TestFileGetTimes()
 {
@@ -915,7 +1039,10 @@ static void TestFileSetTimes()
 #include "wx/intl.h"
 #include "wx/utils.h"   // for wxSetEnv
 
-static wxLocale gs_localeDefault(wxLANGUAGE_ENGLISH);
+static wxLocale gs_localeDefault;
+    // NOTE: don't init it here as it needs a wxAppTraits object
+    //       and thus must be init-ed after creation of the wxInitializer
+    //       class in the main()
 
 // find the name of the language from its value
 static const wxChar *GetLangName(int lang)
@@ -1164,6 +1291,8 @@ static void TestDefaultLang()
 {
     wxPuts(_T("*** Testing wxLocale::GetSystemLanguage ***"));
 
+    gs_localeDefault.Init(wxLANGUAGE_ENGLISH);
+
     static const wxChar *langStrings[] =
     {
         NULL,               // system default
@@ -1253,32 +1382,6 @@ static void TestMimeEnum()
     wxPuts(wxEmptyString);
 }
 
-static void TestMimeOverride()
-{
-    wxPuts(_T("*** Testing wxMimeTypesManager additional files loading ***\n"));
-
-    static const wxChar *mailcap = _T("/tmp/mailcap");
-    static const wxChar *mimetypes = _T("/tmp/mime.types");
-
-    if ( wxFile::Exists(mailcap) )
-        wxPrintf(_T("Loading mailcap from '%s': %s\n"),
-                 mailcap,
-                 wxTheMimeTypesManager->ReadMailcap(mailcap) ? _T("ok") : _T("ERROR"));
-    else
-        wxPrintf(_T("WARN: mailcap file '%s' doesn't exist, not loaded.\n"),
-                 mailcap);
-
-    if ( wxFile::Exists(mimetypes) )
-        wxPrintf(_T("Loading mime.types from '%s': %s\n"),
-                 mimetypes,
-                 wxTheMimeTypesManager->ReadMimeTypes(mimetypes) ? _T("ok") : _T("ERROR"));
-    else
-        wxPrintf(_T("WARN: mime.types file '%s' doesn't exist, not loaded.\n"),
-                 mimetypes);
-
-    wxPuts(wxEmptyString);
-}
-
 static void TestMimeFilename()
 {
     wxPuts(_T("*** Testing MIME type from filename query ***\n"));
@@ -1323,6 +1426,35 @@ static void TestMimeFilename()
     wxPuts(wxEmptyString);
 }
 
+// these tests were broken by wxMimeTypesManager changes, temporarily disabling
+#if 0
+
+static void TestMimeOverride()
+{
+    wxPuts(_T("*** Testing wxMimeTypesManager additional files loading ***\n"));
+
+    static const wxChar *mailcap = _T("/tmp/mailcap");
+    static const wxChar *mimetypes = _T("/tmp/mime.types");
+
+    if ( wxFile::Exists(mailcap) )
+        wxPrintf(_T("Loading mailcap from '%s': %s\n"),
+                 mailcap,
+                 wxTheMimeTypesManager->ReadMailcap(mailcap) ? _T("ok") : _T("ERROR"));
+    else
+        wxPrintf(_T("WARN: mailcap file '%s' doesn't exist, not loaded.\n"),
+                 mailcap);
+
+    if ( wxFile::Exists(mimetypes) )
+        wxPrintf(_T("Loading mime.types from '%s': %s\n"),
+                 mimetypes,
+                 wxTheMimeTypesManager->ReadMimeTypes(mimetypes) ? _T("ok") : _T("ERROR"));
+    else
+        wxPrintf(_T("WARN: mime.types file '%s' doesn't exist, not loaded.\n"),
+                 mimetypes);
+
+    wxPuts(wxEmptyString);
+}
+
 static void TestMimeAssociate()
 {
     wxPuts(_T("*** Testing creation of filetype association ***\n"));
@@ -1333,7 +1465,7 @@ static void TestMimeAssociate()
                             _T(""),             // print cmd
                             _T("XYZ File"),     // description
                             _T(".xyz"),         // extensions
-                            NULL                // end of extensions
+                            wxNullPtr           // end of extensions
                          );
     ftInfo.SetShortDesc(_T("XYZFile")); // used under Win32 only
 
@@ -1351,8 +1483,84 @@ static void TestMimeAssociate()
     wxPuts(wxEmptyString);
 }
 
+#endif // 0
+
 #endif // TEST_MIME
 
+// ----------------------------------------------------------------------------
+// module dependencies feature
+// ----------------------------------------------------------------------------
+
+#ifdef TEST_MODULE
+
+#include "wx/module.h"
+
+class wxTestModule : public wxModule
+{
+protected:
+    virtual bool OnInit() { wxPrintf(_T("Load module: %s\n"), GetClassInfo()->GetClassName()); return true; }
+    virtual void OnExit() { wxPrintf(_T("Unload module: %s\n"), GetClassInfo()->GetClassName()); }
+};
+
+class wxTestModuleA : public wxTestModule
+{
+public:
+    wxTestModuleA();
+private:
+    DECLARE_DYNAMIC_CLASS(wxTestModuleA)
+};
+
+class wxTestModuleB : public wxTestModule
+{
+public:
+    wxTestModuleB();
+private:
+    DECLARE_DYNAMIC_CLASS(wxTestModuleB)
+};
+
+class wxTestModuleC : public wxTestModule
+{
+public:
+    wxTestModuleC();
+private:
+    DECLARE_DYNAMIC_CLASS(wxTestModuleC)
+};
+
+class wxTestModuleD : public wxTestModule
+{
+public:
+    wxTestModuleD();
+private:
+    DECLARE_DYNAMIC_CLASS(wxTestModuleD)
+};
+
+IMPLEMENT_DYNAMIC_CLASS(wxTestModuleC, wxModule)
+wxTestModuleC::wxTestModuleC()
+{
+    AddDependency(CLASSINFO(wxTestModuleD));
+}
+
+IMPLEMENT_DYNAMIC_CLASS(wxTestModuleA, wxModule)
+wxTestModuleA::wxTestModuleA()
+{
+    AddDependency(CLASSINFO(wxTestModuleB));
+    AddDependency(CLASSINFO(wxTestModuleD));
+}
+
+IMPLEMENT_DYNAMIC_CLASS(wxTestModuleD, wxModule)
+wxTestModuleD::wxTestModuleD()
+{
+}
+
+IMPLEMENT_DYNAMIC_CLASS(wxTestModuleB, wxModule)
+wxTestModuleB::wxTestModuleB()
+{
+    AddDependency(CLASSINFO(wxTestModuleD));
+    AddDependency(CLASSINFO(wxTestModuleC));
+}
+
+#endif // TEST_MODULE
+
 // ----------------------------------------------------------------------------
 // misc information functions
 // ----------------------------------------------------------------------------
@@ -1361,6 +1569,7 @@ static void TestMimeAssociate()
 
 #include "wx/utils.h"
 
+#if TEST_INTERACTIVE
 static void TestDiskInfo()
 {
     wxPuts(_T("*** Testing wxGetDiskSpace() ***"));
@@ -1389,6 +1598,7 @@ static void TestDiskInfo()
         }
     }
 }
+#endif // TEST_INTERACTIVE
 
 static void TestOsInfo()
 {
@@ -1399,7 +1609,7 @@ static void TestOsInfo()
     wxPrintf(_T("Running under: %s, version %d.%d\n"),
             wxGetOsDescription().c_str(), major, minor);
 
-    wxPrintf(_T("%ld free bytes of memory left.\n"), wxGetFreeMemory());
+    wxPrintf(_T("%ld free bytes of memory left.\n"), wxGetFreeMemory().ToLong());
 
     wxPrintf(_T("Host name is %s (%s).\n"),
            wxGetHostName().c_str(), wxGetFullHostName().c_str());
@@ -1407,6 +1617,23 @@ static void TestOsInfo()
     wxPuts(wxEmptyString);
 }
 
+static void TestPlatformInfo()
+{
+    wxPuts(_T("*** Testing wxPlatformInfo functions ***\n"));
+
+    // get this platform
+    wxPlatformInfo plat;
+
+    wxPrintf(_T("Operating system family name is: %s\n"), plat.GetOperatingSystemFamilyName().c_str());
+    wxPrintf(_T("Operating system name is: %s\n"), plat.GetOperatingSystemIdName().c_str());
+    wxPrintf(_T("Port ID name is: %s\n"), plat.GetPortIdName().c_str());
+    wxPrintf(_T("Port ID short name is: %s\n"), plat.GetPortIdShortName().c_str());
+    wxPrintf(_T("Architecture is: %s\n"), plat.GetArchName().c_str());
+    wxPrintf(_T("Endianness is: %s\n"), plat.GetEndiannessName().c_str());
+
+    wxPuts(wxEmptyString);
+}
+
 static void TestUserInfo()
 {
     wxPuts(_T("*** Testing user info functions ***\n"));
@@ -1456,7 +1683,7 @@ static void TestPathList()
 // regular expressions
 // ----------------------------------------------------------------------------
 
-#ifdef TEST_REGEX
+#if defined TEST_REGEX && TEST_INTERACTIVE
 
 #include "wx/regex.h"
 
@@ -1516,26 +1743,6 @@ static void TestRegExInteractive()
 
 #endif // TEST_REGEX
 
-// ----------------------------------------------------------------------------
-// database
-// ----------------------------------------------------------------------------
-
-#if !wxUSE_ODBC
-    #undef TEST_ODBC
-#endif
-
-#ifdef TEST_ODBC
-
-#include <wx/db.h>
-
-static void TestDbOpen()
-{
-    HENV henv;
-    wxDb db(henv);
-}
-
-#endif // TEST_ODBC
-
 // ----------------------------------------------------------------------------
 // printf() tests
 // ----------------------------------------------------------------------------
@@ -1938,7 +2145,7 @@ static void TestRegConfWrite()
 
 static void TestRegConfRead()
 {
-    wxConfig *config = new wxConfig(_T("myapp"));
+    wxRegConfig *config = new wxRegConfig(_T("myapp"));
 
     wxString str;
     long dummy;
@@ -2085,9 +2292,9 @@ static void TestScopeGuard()
     wxON_BLOCK_EXIT2(function2, 3.14, 'p');
 
     Object obj;
-    wxON_BLOCK_EXIT_OBJ0(obj, &Object::method0);
-    wxON_BLOCK_EXIT_OBJ1(obj, &Object::method1, 7);
-    wxON_BLOCK_EXIT_OBJ2(obj, &Object::method2, 2.71, 'e');
+    wxON_BLOCK_EXIT_OBJ0(obj, Object::method0);
+    wxON_BLOCK_EXIT_OBJ1(obj, Object::method1, 7);
+    wxON_BLOCK_EXIT_OBJ2(obj, Object::method2, 2.71, 'e');
 
     wxScopeGuard dismissed = wxMakeGuard(function0);
     dismissed.Dismiss();
@@ -2249,10 +2456,10 @@ static void TestSocketClient()
 
 #include "wx/protocol/ftp.h"
 
-static wxFTP ftp;
-
 #define FTP_ANONYMOUS
 
+static wxFTP *ftp;
+
 #ifdef FTP_ANONYMOUS
     static const wxChar *directory = _T("/pub");
     static const wxChar *filename = _T("welcome.msg");
@@ -2275,18 +2482,18 @@ static bool TestFtpConnect()
     wxChar user[256];
     wxFgets(user, WXSIZEOF(user), stdin);
     user[wxStrlen(user) - 1] = '\0'; // chop off '\n'
-    ftp.SetUser(user);
+    ftp->SetUser(user);
 
     wxChar password[256];
     wxPrintf(_T("Password for %s: "), password);
     wxFgets(password, WXSIZEOF(password), stdin);
     password[wxStrlen(password) - 1] = '\0'; // chop off '\n'
-    ftp.SetPassword(password);
+    ftp->SetPassword(password);
 
     wxPrintf(_T("--- Attempting to connect to %s:21 as %s...\n"), hostname, user);
 #endif // FTP_ANONYMOUS/!FTP_ANONYMOUS
 
-    if ( !ftp.Connect(hostname) )
+    if ( !ftp->Connect(hostname) )
     {
         wxPrintf(_T("ERROR: failed to connect to %s\n"), hostname);
 
@@ -2295,72 +2502,34 @@ static bool TestFtpConnect()
     else
     {
         wxPrintf(_T("--- Connected to %s, current directory is '%s'\n"),
-                 hostname, ftp.Pwd().c_str());
-        ftp.Close();
+                 hostname, ftp->Pwd().c_str());
+        ftp->Close();
     }
 
     return true;
 }
 
-// test (fixed?) wxFTP bug with wu-ftpd >= 2.6.0?
-static void TestFtpWuFtpd()
-{
-    wxFTP ftp;
-    static const wxChar *hostname = _T("ftp.eudora.com");
-    if ( !ftp.Connect(hostname) )
-    {
-        wxPrintf(_T("ERROR: failed to connect to %s\n"), hostname);
-    }
-    else
-    {
-        static const wxChar *filename = _T("eudora/pubs/draft-gellens-submit-09.txt");
-        wxInputStream *in = ftp.GetInputStream(filename);
-        if ( !in )
-        {
-            wxPrintf(_T("ERROR: couldn't get input stream for %s\n"), filename);
-        }
-        else
-        {
-            size_t size = in->GetSize();
-            wxPrintf(_T("Reading file %s (%u bytes)..."), filename, size);
-
-            wxChar *data = new wxChar[size];
-            if ( !in->Read(data, size) )
-            {
-                wxPuts(_T("ERROR: read error"));
-            }
-            else
-            {
-                wxPrintf(_T("Successfully retrieved the file.\n"));
-            }
-
-            delete [] data;
-            delete in;
-        }
-    }
-}
-
 static void TestFtpList()
 {
     wxPuts(_T("*** Testing wxFTP file listing ***\n"));
 
     // test CWD
-    if ( !ftp.ChDir(directory) )
+    if ( !ftp->ChDir(directory) )
     {
         wxPrintf(_T("ERROR: failed to cd to %s\n"), directory);
     }
 
-    wxPrintf(_T("Current directory is '%s'\n"), ftp.Pwd().c_str());
+    wxPrintf(_T("Current directory is '%s'\n"), ftp->Pwd().c_str());
 
     // test NLIST and LIST
     wxArrayString files;
-    if ( !ftp.GetFilesList(files) )
+    if ( !ftp->GetFilesList(files) )
     {
         wxPuts(_T("ERROR: failed to get NLIST of files"));
     }
     else
     {
-        wxPrintf(_T("Brief list of files under '%s':\n"), ftp.Pwd().c_str());
+        wxPrintf(_T("Brief list of files under '%s':\n"), ftp->Pwd().c_str());
         size_t count = files.GetCount();
         for ( size_t n = 0; n < count; n++ )
         {
@@ -2369,13 +2538,13 @@ static void TestFtpList()
         wxPuts(_T("End of the file list"));
     }
 
-    if ( !ftp.GetDirList(files) )
+    if ( !ftp->GetDirList(files) )
     {
         wxPuts(_T("ERROR: failed to get LIST of files"));
     }
     else
     {
-        wxPrintf(_T("Detailed list of files under '%s':\n"), ftp.Pwd().c_str());
+        wxPrintf(_T("Detailed list of files under '%s':\n"), ftp->Pwd().c_str());
         size_t count = files.GetCount();
         for ( size_t n = 0; n < count; n++ )
         {
@@ -2384,12 +2553,12 @@ static void TestFtpList()
         wxPuts(_T("End of the file list"));
     }
 
-    if ( !ftp.ChDir(_T("..")) )
+    if ( !ftp->ChDir(_T("..")) )
     {
         wxPuts(_T("ERROR: failed to cd to .."));
     }
 
-    wxPrintf(_T("Current directory is '%s'\n"), ftp.Pwd().c_str());
+    wxPrintf(_T("Current directory is '%s'\n"), ftp->Pwd().c_str());
 }
 
 static void TestFtpDownload()
@@ -2397,7 +2566,7 @@ static void TestFtpDownload()
     wxPuts(_T("*** Testing wxFTP download ***\n"));
 
     // test RETR
-    wxInputStream *in = ftp.GetInputStream(filename);
+    wxInputStream *in = ftp->GetInputStream(filename);
     if ( !in )
     {
         wxPrintf(_T("ERROR: couldn't get input stream for %s\n"), filename);
@@ -2427,16 +2596,16 @@ static void TestFtpFileSize()
 {
     wxPuts(_T("*** Testing FTP SIZE command ***"));
 
-    if ( !ftp.ChDir(directory) )
+    if ( !ftp->ChDir(directory) )
     {
         wxPrintf(_T("ERROR: failed to cd to %s\n"), directory);
     }
 
-    wxPrintf(_T("Current directory is '%s'\n"), ftp.Pwd().c_str());
+    wxPrintf(_T("Current directory is '%s'\n"), ftp->Pwd().c_str());
 
-    if ( ftp.FileExists(filename) )
+    if ( ftp->FileExists(filename) )
     {
-        int size = ftp.GetFileSize(filename);
+        int size = ftp->GetFileSize(filename);
         if ( size == -1 )
             wxPrintf(_T("ERROR: couldn't get size of '%s'\n"), filename);
         else
@@ -2452,26 +2621,28 @@ static void TestFtpMisc()
 {
     wxPuts(_T("*** Testing miscellaneous wxFTP functions ***"));
 
-    if ( ftp.SendCommand(_T("STAT")) != '2' )
+    if ( ftp->SendCommand(_T("STAT")) != '2' )
     {
         wxPuts(_T("ERROR: STAT failed"));
     }
     else
     {
-        wxPrintf(_T("STAT returned:\n\n%s\n"), ftp.GetLastResult().c_str());
+        wxPrintf(_T("STAT returned:\n\n%s\n"), ftp->GetLastResult().c_str());
     }
 
-    if ( ftp.SendCommand(_T("HELP SITE")) != '2' )
+    if ( ftp->SendCommand(_T("HELP SITE")) != '2' )
     {
         wxPuts(_T("ERROR: HELP SITE failed"));
     }
     else
     {
         wxPrintf(_T("The list of site-specific commands:\n\n%s\n"),
-               ftp.GetLastResult().c_str());
+               ftp->GetLastResult().c_str());
     }
 }
 
+#if TEST_INTERACTIVE
+
 static void TestFtpInteractive()
 {
     wxPuts(_T("\n*** Interactive wxFTP test ***"));
@@ -2497,14 +2668,14 @@ static void TestFtpInteractive()
                 wildcard = buf + 5;
 
             wxArrayString files;
-            if ( !ftp.GetList(files, wildcard, start == _T("LIST")) )
+            if ( !ftp->GetList(files, wildcard, start == _T("LIST")) )
             {
                 wxPrintf(_T("ERROR: failed to get %s of files\n"), start.c_str());
             }
             else
             {
                 wxPrintf(_T("--- %s of '%s' under '%s':\n"),
-                       start.c_str(), wildcard.c_str(), ftp.Pwd().c_str());
+                       start.c_str(), wildcard.c_str(), ftp->Pwd().c_str());
                 size_t count = files.GetCount();
                 for ( size_t n = 0; n < count; n++ )
                 {
@@ -2515,20 +2686,22 @@ static void TestFtpInteractive()
         }
         else // !list
         {
-            wxChar ch = ftp.SendCommand(buf);
+            wxChar ch = ftp->SendCommand(buf);
             wxPrintf(_T("Command %s"), ch ? _T("succeeded") : _T("failed"));
             if ( ch )
             {
                 wxPrintf(_T(" (return code %c)"), ch);
             }
 
-            wxPrintf(_T(", server reply:\n%s\n\n"), ftp.GetLastResult().c_str());
+            wxPrintf(_T(", server reply:\n%s\n\n"), ftp->GetLastResult().c_str());
         }
     }
 
     wxPuts(_T("\n*** done ***"));
 }
 
+#endif // TEST_INTERACTIVE
+
 static void TestFtpUpload()
 {
     wxPuts(_T("*** Testing wxFTP uploading ***\n"));
@@ -2536,7 +2709,7 @@ static void TestFtpUpload()
     // upload a file
     static const wxChar *file1 = _T("test1");
     static const wxChar *file2 = _T("test2");
-    wxOutputStream *out = ftp.GetOutputStream(file1);
+    wxOutputStream *out = ftp->GetOutputStream(file1);
     if ( out )
     {
         wxPrintf(_T("--- Uploading to %s ---\n"), file1);
@@ -2545,17 +2718,17 @@ static void TestFtpUpload()
     }
 
     // send a command to check the remote file
-    if ( ftp.SendCommand(wxString(_T("STAT ")) + file1) != '2' )
+    if ( ftp->SendCommand(wxString(_T("STAT ")) + file1) != '2' )
     {
         wxPrintf(_T("ERROR: STAT %s failed\n"), file1);
     }
     else
     {
         wxPrintf(_T("STAT %s returned:\n\n%s\n"),
-               file1, ftp.GetLastResult().c_str());
+               file1, ftp->GetLastResult().c_str());
     }
 
-    out = ftp.GetOutputStream(file2);
+    out = ftp->GetOutputStream(file2);
     if ( out )
     {
         wxPrintf(_T("--- Uploading to %s ---\n"), file1);
@@ -2584,22 +2757,22 @@ public:
     {
     }
 
-    virtual void Walk(size_t skip = 1)
+    virtual void Walk(size_t skip = 1, size_t maxdepth = wxSTACKWALKER_MAX_DEPTH)
     {
         wxPuts(_T("Stack dump:"));
 
-        wxStackWalker::Walk(skip);
+        wxStackWalker::Walk(skip, maxdepth);
     }
 
 protected:
     virtual void OnStackFrame(const wxStackFrame& frame)
     {
-        printf("[%2d] ", frame.GetLevel());
+        printf("[%2d] ", (int) frame.GetLevel());
 
         wxString name = frame.GetName();
         if ( !name.empty() )
         {
-            printf("%-20.40s", name.mb_str());
+            printf("%-20.40s", (const char*)name.mb_str());
         }
         else
         {
@@ -2609,8 +2782,8 @@ protected:
         if ( frame.HasSourceLocation() )
         {
             printf("\t%s:%d",
-                   frame.GetFileName().mb_str(),
-                   frame.GetLine());
+                   (const char*)frame.GetFileName().mb_str(),
+                   (int)frame.GetLine());
         }
 
         puts("");
@@ -2618,7 +2791,9 @@ protected:
         wxString type, val;
         for ( size_t n = 0; frame.GetParam(n, &type, &name, &val); n++ )
         {
-            printf("\t%s %s = %s\n", type.mb_str(), name.mb_str(), val.mb_str());
+            printf("\t%s %s = %s\n", (const char*)type.mb_str(),
+                                     (const char*)name.mb_str(),
+                                     (const char*)val.mb_str());
         }
     }
 };
@@ -2642,6 +2817,7 @@ static void TestStackWalk(const char *argv0)
 #ifdef TEST_STDPATHS
 
 #include "wx/stdpaths.h"
+#include "wx/wxchar.h"      // wxPrintf
 
 static void TestStandardPaths()
 {
@@ -2656,7 +2832,18 @@ static void TestStandardPaths()
     wxPrintf(_T("Data dir (sys local):\t%s\n"), stdp.GetLocalDataDir().c_str());
     wxPrintf(_T("Data dir (user):\t%s\n"), stdp.GetUserDataDir().c_str());
     wxPrintf(_T("Data dir (user local):\t%s\n"), stdp.GetUserLocalDataDir().c_str());
+    wxPrintf(_T("Documents dir:\t\t%s\n"), stdp.GetDocumentsDir().c_str());
+    wxPrintf(_T("Executable path:\t%s\n"), stdp.GetExecutablePath().c_str());
     wxPrintf(_T("Plugins dir:\t\t%s\n"), stdp.GetPluginsDir().c_str());
+    wxPrintf(_T("Resources dir:\t\t%s\n"), stdp.GetResourcesDir().c_str());
+    wxPrintf(_T("Localized res. dir:\t%s\n"),
+             stdp.GetLocalizedResourcesDir(_T("fr")).c_str());
+    wxPrintf(_T("Message catalogs dir:\t%s\n"),
+             stdp.GetLocalizedResourcesDir
+                  (
+                    _T("fr"),
+                    wxStandardPaths::ResourceCat_Messages
+                  ).c_str());
 }
 
 #endif // TEST_STDPATHS
@@ -2680,11 +2867,14 @@ static void TestFileStream()
         fsOut.Write("foo", 3);
     }
 
-    wxFileInputStream fsIn(filename);
-    wxPrintf(_T("File stream size: %u\n"), fsIn.GetSize());
-    while ( !fsIn.Eof() )
     {
-        wxPutchar(fsIn.GetC());
+        wxFileInputStream fsIn(filename);
+        wxPrintf(_T("File stream size: %u\n"), fsIn.GetSize());
+        int c;
+        while ( (c=fsIn.GetC()) != wxEOF  )
+        {
+            wxPutchar(c);
+        }
     }
 
     if ( !wxRemoveFile(filename) )
@@ -2718,9 +2908,10 @@ static void TestMemoryStream()
 
     wxMemoryInputStream memInpStream(buf, len);
     wxPrintf(_T("Memory stream size: %u\n"), memInpStream.GetSize());
-    while ( !memInpStream.Eof() )
+    int c;
+    while ( (c=memInpStream.GetC()) != wxEOF )
     {
-        wxPutchar(memInpStream.GetC());
+        wxPutchar(c);
     }
 
     wxPuts(_T("\n*** wxMemoryInputStream test done ***"));
@@ -2787,6 +2978,52 @@ static void TestStopWatch()
     wxPuts(_T(", ok."));
 }
 
+#include "wx/timer.h"
+#include "wx/evtloop.h"
+
+void TestTimer()
+{
+    wxPuts(_T("*** Testing wxTimer ***\n"));
+
+    class MyTimer : public wxTimer
+    {
+    public:
+        MyTimer() : wxTimer() { m_num = 0; }
+
+        virtual void Notify()
+        {
+            wxPrintf(_T("%d"), m_num++);
+            fflush(stdout);
+
+            if ( m_num == 10 )
+            {
+                wxPrintf(_T("... exiting the event loop"));
+                Stop();
+
+                wxEventLoop::GetActive()->Exit(0);
+                wxPuts(_T(", ok."));
+            }
+
+            fflush(stdout);
+        }
+
+    private:
+        int m_num;
+    };
+
+    wxEventLoop loop;
+
+    wxTimer timer1;
+    timer1.Start(100, true /* one shot */);
+    timer1.Stop();
+    timer1.Start(100, true /* one shot */);
+
+    MyTimer timer;
+    timer.Start(500);
+
+    loop.Run();
+}
+
 #endif // TEST_TIMER
 
 // ----------------------------------------------------------------------------
@@ -2995,7 +3232,7 @@ static void TestVCardRead()
 
         wxPrintf(_T("Full name from wxVCard API: %s\n"), value.c_str());
 
-        // now show how to deal with multiply occuring properties
+        // now show how to deal with multiply occurring properties
         DumpVCardAddresses(vcard);
         DumpVCardPhoneNumbers(vcard);
 
@@ -3223,13 +3460,18 @@ static void TestZipStreamRead()
     wxPuts(_T("*** Testing ZIP reading ***\n"));
 
     static const wxString filename = _T("foo");
-    wxZipInputStream istr(TESTFILE_ZIP, filename);
+    wxFFileInputStream in(TESTFILE_ZIP);
+    wxZipInputStream istr(in);
+    wxZipEntry entry(filename);
+    istr.OpenEntry(entry);
+
     wxPrintf(_T("Archive size: %u\n"), istr.GetSize());
 
     wxPrintf(_T("Dumping the file '%s':\n"), filename.c_str());
-    while ( !istr.Eof() )
+    int c;
+    while ( (c=istr.GetC()) != wxEOF )
     {
-        wxPutchar(istr.GetC());
+        wxPutchar(c);
         fflush(stdout);
     }
 
@@ -3906,39 +4148,6 @@ static void TestThreadConditions()
     wxThread::Sleep(500);
 }
 
-#include "wx/utils.h"
-
-class MyExecThread : public wxThread
-{
-public:
-    MyExecThread(const wxString& command) : wxThread(wxTHREAD_JOINABLE),
-                                            m_command(command)
-    {
-        Create();
-    }
-
-    virtual ExitCode Entry()
-    {
-        return (ExitCode)wxExecute(m_command, wxEXEC_SYNC);
-    }
-
-private:
-    wxString m_command;
-};
-
-static void TestThreadExec()
-{
-    wxPuts(_T("*** Testing wxExecute interaction with threads ***\n"));
-
-    MyExecThread thread(_T("true"));
-    thread.Run();
-
-    wxPrintf(_T("Main program exit code: %ld.\n"),
-             wxExecute(_T("false"), wxEXEC_SYNC));
-
-    wxPrintf(_T("Thread exit code: %ld.\n"), (long)thread.Wait());
-}
-
 // semaphore tests
 #include "wx/datetime.h"
 
@@ -4069,19 +4278,21 @@ int main(int argc, char **argv)
 #if wxUSE_CMDLINE_PARSER
     static const wxCmdLineEntryDesc cmdLineDesc[] =
     {
-        { wxCMD_LINE_SWITCH, _T("h"), _T("help"), _T("show this help message"),
+        { wxCMD_LINE_SWITCH, "h", "help", "show this help message",
             wxCMD_LINE_VAL_NONE, wxCMD_LINE_OPTION_HELP },
-        { wxCMD_LINE_SWITCH, _T("v"), _T("verbose"), _T("be verbose") },
-        { wxCMD_LINE_SWITCH, _T("q"), _T("quiet"),   _T("be quiet") },
+        { wxCMD_LINE_SWITCH, "v", "verbose", "be verbose" },
+        { wxCMD_LINE_SWITCH, "q", "quiet",   "be quiet" },
 
-        { wxCMD_LINE_OPTION, _T("o"), _T("output"),  _T("output file") },
-        { wxCMD_LINE_OPTION, _T("i"), _T("input"),   _T("input dir") },
-        { wxCMD_LINE_OPTION, _T("s"), _T("size"),    _T("output block size"),
+        { wxCMD_LINE_OPTION, "o", "output",  "output file" },
+        { wxCMD_LINE_OPTION, "i", "input",   "input dir" },
+        { wxCMD_LINE_OPTION, "s", "size",    "output block size",
             wxCMD_LINE_VAL_NUMBER },
-        { wxCMD_LINE_OPTION, _T("d"), _T("date"),    _T("output file date"),
+        { wxCMD_LINE_OPTION, "d", "date",    "output file date",
             wxCMD_LINE_VAL_DATE },
+        { wxCMD_LINE_OPTION, "f", "double",  "output double",
+            wxCMD_LINE_VAL_DOUBLE },
 
-        { wxCMD_LINE_PARAM,  NULL, NULL, _T("input file"),
+        { wxCMD_LINE_PARAM,  NULL, NULL, "input file",
             wxCMD_LINE_VAL_STRING, wxCMD_LINE_PARAM_MULTIPLE },
 
         { wxCMD_LINE_NONE }
@@ -4119,10 +4330,10 @@ int main(int argc, char **argv)
     TestDirTraverse();
 #endif // TEST_DIR
 
-#ifdef TEST_DLLLOADER
+#ifdef TEST_DYNLIB
     TestDllLoad();
     TestDllListLoaded();
-#endif // TEST_DLLLOADER
+#endif // TEST_DYNLIB
 
 #ifdef TEST_ENVIRON
     TestEnvironment();
@@ -4168,6 +4379,7 @@ int main(int argc, char **argv)
     TestFileRead();
     TestTextFileRead();
     TestFileCopy();
+    TestTempFile();
 #endif // TEST_FILE
 
 #ifdef TEST_FILENAME
@@ -4187,6 +4399,11 @@ int main(int argc, char **argv)
 
 #ifdef TEST_FTP
     wxLog::AddTraceMask(FTP_TRACE_MASK);
+
+    // wxFTP cannot be a static variable as its ctor needs to access
+    // wxWidgets internals after it has been initialized
+    ftp = new wxFTP;
+
     if ( TestFtpConnect() )
     {
         #if TEST_ALL
@@ -4198,34 +4415,31 @@ int main(int argc, char **argv)
         #endif // TEST_ALL
 
         #if TEST_INTERACTIVE
-            TestFtpInteractive();
+            //TestFtpInteractive();
         #endif
     }
     //else: connecting to the FTP server failed
 
-    #if 0
-        TestFtpWuFtpd();
-    #endif
+    delete ftp;
 #endif // TEST_FTP
 
 #ifdef TEST_MIME
-    wxLog::AddTraceMask(_T("mime"));
-    #if TEST_ALL
-        TestMimeEnum();
-        TestMimeOverride();
-        TestMimeAssociate();
-    #endif
+    //wxLog::AddTraceMask(_T("mime"));
+    TestMimeEnum();
+#if 0
+    TestMimeOverride();
+    TestMimeAssociate();
+#endif
     TestMimeFilename();
 #endif // TEST_MIME
 
 #ifdef TEST_INFO_FUNCTIONS
-    #if TEST_ALL
-        TestOsInfo();
-        TestUserInfo();
+    TestOsInfo();
+    TestPlatformInfo();
+    TestUserInfo();
 
-        #if TEST_INTERACTIVE
-            TestDiskInfo();
-        #endif
+    #if TEST_INTERACTIVE
+        TestDiskInfo();
     #endif
 #endif // TEST_INFO_FUNCTIONS
 
@@ -4233,10 +4447,6 @@ int main(int argc, char **argv)
     TestPathList();
 #endif // TEST_PATHLIST
 
-#ifdef TEST_ODBC
-    TestDbOpen();
-#endif // TEST_ODBC
-
 #ifdef TEST_PRINTF
     TestPrintf();
 #endif // TEST_PRINTF
@@ -4287,13 +4497,13 @@ int main(int argc, char **argv)
         TestThreadSuspend();
         TestThreadDelete();
         TestThreadConditions();
-        TestThreadExec();
         TestSemaphore();
     #endif
 #endif // TEST_THREADS
 
 #ifdef TEST_TIMER
     TestStopWatch();
+    TestTimer();
 #endif // TEST_TIMER
 
 #ifdef TEST_DATETIME
@@ -4365,4 +4575,3 @@ int main(int argc, char **argv)
     wxUnusedVar(argv);
     return 0;
 }
-