The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
/////////////////////////////////////////////////////////////////////////////
// Name:        Wx.xs
// Purpose:     main XS module
// Author:      Mattia Barbon
// Modified by:
// Created:     01/10/2000
// RCS-ID:      $Id: Wx.xs 3486 2013-04-16 17:39:27Z mdootson $
// Copyright:   (c) 2000-2002, 2004-2013 Mattia Barbon
// Licence:     This program is free software; you can redistribute it and/or
//              modify it under the same terms as Perl itself
/////////////////////////////////////////////////////////////////////////////

#undef bool
#define PERL_NO_GET_CONTEXT

#include <stddef.h>
#include "cpp/compat.h"

// THIS IS AN HACK!
#if defined(_MSC_VER)
#define STRICT
#endif

#include "cpp/wxapi.h"

#include <wx/window.h>
#include <wx/module.h>
#include <wx/log.h>
// FIXME hack
#if WXPERL_W_VERSION_GE( 2, 5, 2 ) \
    && defined(__DARWIN__)
#define HACK
#include <wx/html/htmlwin.h>
#if wxUSE_MEDIACTRL
#include <wx/mediactrl.h>
#endif
#endif

#if defined(__WXMSW__)
#include <wx/msw/private.h>
#endif

#if defined(__WXMAC__)
#include <ApplicationServices/ApplicationServices.h>
#endif

#if WXPERL_W_VERSION_GE( 2, 5, 1 )
    #include <wx/init.h>
#else
#if defined(__WXGTK__)
int  WXDLLEXPORT wxEntryStart( int& argc, char** argv );
#else
int  WXDLLEXPORT wxEntryStart( int argc, char** argv );
#endif
int  WXDLLEXPORT wxEntryInitGui();
void WXDLLEXPORT wxEntryCleanup();
#endif

#include "cpp/v_cback.h"

// to declare wxPliUserDataCD
#include "cpp/helpers.h"
#include "cpp/helpers.cpp"
#include "cpp/v_cback.cpp"
#include "cpp/overload.cpp"
#include "cpp/ovl_const.cpp"

//
// our App
//
#include <wx/app.h>
#include "cpp/app.h"

IMPLEMENT_APP_NO_MAIN(wxPliApp);
static bool wxPerlAppCreated = false;
static bool wxPerlInitialized = false;
#if !wxUSE_UNICODE
bool wxPli_always_utf8;
#endif

#undef THIS

#ifdef __cplusplus
extern "C" {
#endif
    XS( boot_Wx_Const );
    XS( boot_Wx_Ctrl );
    XS( boot_Wx_Evt );
    XS( boot_Wx_Win );
    XS( boot_Wx_Wnd );
    XS( boot_Wx_GDI );
#if defined( WXPL_STATIC )
    XS( boot_Wx__DocView );
#if wxPERL_USE_STC
    XS( boot_Wx__STC );
#endif
#if wxPERL_USE_XRC
    XS( boot_Wx__XRC );
#endif
    XS( boot_Wx__Print );
    XS( boot_Wx__MDI );
    XS( boot_Wx__Html );
    XS( boot_Wx__Help );
    XS( boot_Wx__Grid );
    XS( boot_Wx__FS );
    XS( boot_Wx__DND );
#endif
#ifdef __cplusplus
}
#endif

extern void SetConstants();
extern void SetConstantsOnce();

static int call_oninit( pTHX_ SV* This, SV* sub )
{
    dSP;

    ENTER;
    SAVETMPS;

    PUSHMARK( SP );
    XPUSHs( This );
    PUTBACK;

    int count = call_sv( sub, G_SCALAR|G_EVAL );
    int retval = 0;

    SPAGAIN;

    if( SvTRUE( ERRSV ) )
    {
        croak( Nullch );
    }
    else if( count == 1 )
    {
        retval = POPi;
    }

    PUTBACK;

    FREETMPS;
    LEAVE;

    return retval;
}


#if defined(__WXMOTIF__) && WXPERL_W_VERSION_LT( 2, 5, 1 )

#include <wx/app.h>
#include <wx/log.h>

int wxEntryStart( int argc, char** argv )
{
    // This seems to be necessary since there are 'rogue'
    // objects present at this point (perhaps global objects?)
    // Setting a checkpoint will ignore them as far as the
    // memory checking facility is concerned.
    // Of course you may argue that memory allocated in globals should be
    // checked, but this is a reasonable compromise.
#if WXPERL_W_VERSION_GE( 2, 9, 3 )
#if ( ( wxDEBUG_LEVEL > 1 ) && wxUSE_MEMORY_TRACING ) || wxUSE_DEBUG_CONTEXT
    wxDebugContext::SetCheckpoint();
#endif
#else
#if (defined(__WXDEBUG__) && wxUSE_MEMORY_TRACING ) || wxUSE_DEBUG_CONTEXT
    wxDebugContext::SetCheckpoint();
#endif
#endif
    if (!wxApp::Initialize())
        return -1;

    return 0;
}

int wxEntryInitGui()
{
    int retValue = 0;

    // GUI-specific initialization, such as creating an app context.
    if( !wxTheApp->OnInitGui() )
        retValue = -1;

    return retValue;
}

void wxEntryCleanup()
{
#if wxUSE_LOG
    // flush the logged messages if any
    wxLog *pLog = wxLog::GetActiveTarget();
    if ( pLog != NULL && pLog->HasPendingMessages() )
        pLog->Flush();

    delete wxLog::SetActiveTarget(new wxLogStderr); // So dialog boxes aren't used
    // for further messages
#endif

    wxApp::CleanUp();

    // some code moved to _wxApp destructor
    // since at this point the app is already destroyed
}

#endif

DEFINE_PLI_HELPERS( st_wxPliHelpers );

#include <wx/confbase.h>
typedef wxConfigBase::EntryType EntryType;

WXPLI_BOOT_ONCE_EXP(Wx);
#define boot_Wx wxPli_boot_Wx

extern bool Wx_booted, Wx_Const_booted, Wx_Ctrl_booted,
    Wx_Evt_booted, Wx_Wnd_booted, Wx_GDI_booted, Wx_Win_booted;

#if WXPERL_W_VERSION_LT( 2, 9, 0 )
typedef int wxPolygonFillMode;
#endif

MODULE=Wx PACKAGE=Wx

BOOT:
  newXSproto( "Wx::_boot_Constant", boot_Wx_Const, file, "$$" );
  newXSproto( "Wx::_boot_Controls", boot_Wx_Ctrl, file, "$$" );
  newXSproto( "Wx::_boot_Events", boot_Wx_Evt, file, "$$" );
  newXSproto( "Wx::_boot_Window", boot_Wx_Win, file, "$$" );
  newXSproto( "Wx::_boot_Frames", boot_Wx_Wnd, file, "$$" );
  newXSproto( "Wx::_boot_GDI", boot_Wx_GDI, file, "$$" );
#if defined( WXPL_STATIC )
  newXSproto( "Wx::_boot_Wx__DocView", boot_Wx__DocView, file, "$$" );
#if wxPERL_USE_STC
  newXSproto( "Wx::_boot_Wx__STC", boot_Wx__STC, file, "$$" );
#endif
#if wxPERL_USE_XRC
  newXSproto( "Wx::_boot_Wx__XRC", boot_Wx__XRC, file, "$$" );
#endif
  newXSproto( "Wx::_boot_Wx__Print", boot_Wx__Print, file, "$$" );
  newXSproto( "Wx::_boot_Wx__MDI", boot_Wx__MDI, file, "$$" );
  newXSproto( "Wx::_boot_Wx__Html", boot_Wx__Html, file, "$$" );
  newXSproto( "Wx::_boot_Wx__Help", boot_Wx__Help, file, "$$" );
  newXSproto( "Wx::_boot_Wx__Grid", boot_Wx__Grid, file, "$$" );
  newXSproto( "Wx::_boot_Wx__FS", boot_Wx__FS, file, "$$" );
  newXSproto( "Wx::_boot_Wx__DND", boot_Wx__DND, file, "$$" );
#endif
  SV* tmp = get_sv( "Wx::_exports", 1 );
  sv_setiv( tmp, (IV)(void*)&st_wxPliHelpers );

#if WXPERL_W_VERSION_GE( 2, 5, 1 )
#define wxPliEntryStart( argc, argv ) wxEntryStart( (argc), (argv) )
#else
#define wxPliEntryStart( argc, argv ) ( wxEntryStart( (argc), (argv) ) == 0 )
#endif

bool
EnableDefaultAssertHandler()
  CODE:
#if WXPERL_W_VERSION_GE( 2, 9, 3 )
    wxSetDefaultAssertHandler();
    RETVAL = 1;
#else
    RETVAL = 0;
#endif
  OUTPUT: RETVAL

bool
DisableAssertHandler()
  CODE:
#if WXPERL_W_VERSION_GE( 2, 9, 3 )
    wxDisableAsserts();
    RETVAL = 1;
#else
    RETVAL = 0;
#endif
  OUTPUT: RETVAL


##// bool
##// EnableCustomAssertHandler( handler )
##//     SV* handler
##//   CODE:
##// #if WXPERL_W_VERSION_GE( 2, 9, 3 )
##//     RETVAL = 1;
##// #else
##//     RETVAL = 0;
##// #endif
##//   OUTPUT: RETVAL

bool 
Load( bool croak_on_error = false )
  CODE:
    wxPerlAppCreated = wxTheApp != NULL;
    if( wxPerlInitialized )
        XSRETURN( true );
    wxPerlInitialized = true;

    NV ver = wxMAJOR_VERSION + wxMINOR_VERSION / 1000.0 + 
        wxRELEASE_NUMBER / 1000000.0;
    // set up version as soon as possible
    SV* tmp = get_sv( "Wx::_wx_version", 1 );
    sv_setnv( tmp, ver );
    tmp = get_sv( "Wx::wxVERSION", 1 );
    sv_setnv( tmp, ver );
        
    int platform;
    // change App.pm whenever these change
#if defined(__WXMSW__)
    platform = 1;
#elif defined(__WXGTK__)
    platform = 2;
#elif defined(__WXMOTIF__)
    platform = 3;
#elif defined(__WXMAC__)
    platform = 4;
#elif defined(__WXX11__)
    platform = 5;
#else
    #error must add case
#endif

    tmp = get_sv( "Wx::_platform", 1 );
    sv_setiv( tmp, platform );

    if( wxPerlAppCreated || wxTopLevelWindows.GetCount() > 0 )
        XSRETURN( true );
#if defined(DEBUGGING) && !defined(PERL_USE_SAFE_PUTENV)
    // avoid crash on exit in Fedora (and other DEBUGGING Perls)
    PL_use_safe_putenv = 1;
#endif

    int argc = 0;
#if wxUSE_UNICODE && WXPERL_W_VERSION_GE( 2, 5, 3 )
    wxChar** argv = 0;

    argc = wxPli_get_args_argc_argv( (void***) &argv, 1 );
    wxPerlInitialized = wxPliEntryStart( argc, argv );
#if WXPERL_W_VERSION_LE( 2, 5, 2 )
    wxPli_delete_argv( (void***) &argv, 1 );
#endif
#else
    char** argv = 0;

    argc = wxPli_get_args_argc_argv( (void***) &argv, 0 );
    wxPerlInitialized = wxPliEntryStart( argc, argv );
#if WXPERL_W_VERSION_LE( 2, 5, 2 )
    wxPli_delete_argv( (void***) &argv, 0 );
#endif
#endif
    RETVAL = wxPerlInitialized;

    if( !RETVAL && croak_on_error )
    {
#if wxUSE_LOG
        wxLog::FlushActive();
#endif
        require_pv( "Carp.pm" );
        const char* argv[2] = { "Failed to initialize wxWidgets", NULL };
        call_argv( "Carp::croak", G_VOID|G_DISCARD, (char**) argv );
    }
  OUTPUT: RETVAL

#if defined(__WXMAC__)

void
_MacSetFrontProcess()
  CODE:
    ProcessSerialNumber kCurrentPSN = { 0, kCurrentProcess };
    TransformProcessType( &kCurrentPSN, kProcessTransformToForegroundApplication );
    SetFrontProcess( &kCurrentPSN );

#endif

void
SetConstants()
  CODE:
    // this is after wxEntryStart, since
    // wxInitializeStockObjects needs to be called
    // (for colours, cursors, pens, etc...)
    SetConstants();

void
SetConstantsOnce()

void
SetOvlConstants()

void
UnLoad()
  CODE:
    wxPerlAppCreated = wxTheApp != NULL;
    Wx_booted = Wx_Const_booted = Wx_Ctrl_booted =
        Wx_Evt_booted = Wx_Wnd_booted = Wx_GDI_booted = Wx_Win_booted = false;
    if( wxPerlInitialized && !wxPerlAppCreated )
        wxEntryCleanup();
    wxPerlInitialized = false;

void
SetAlwaysUTF8( always_utf8 = true )
    bool always_utf8
  CODE:
#if !wxUSE_UNICODE
    wxPli_always_utf8 = always_utf8;
#endif

#if WXPERL_W_VERSION_GE( 2, 5, 1 )

#include <wx/dynload.h>

## this has the same interface as DynaLoader::dl_load_files, but since
## internally it uses wxPluginModule, it ensures proper initialization for
## wxModule, wxRTTI and (hopefully) any other internal wxWidgets' data structure
IV
_load_plugin( string, int flags = 0 /* to be compatible with dl_load_file */ )
    wxString string
  CODE:
#ifdef HACK
    delete new wxHtmlWindow();
#if wxUSE_MEDIACTRL
    delete new wxMediaCtrl();
#endif
#endif
    wxDynamicLibrary *lib = wxPluginManager::LoadLibrary( string, wxDL_VERBATIM );
    RETVAL = PTR2IV( lib->GetLibHandle() );
  OUTPUT:
    RETVAL

bool
_unload_plugin( string )
    wxString string
  CODE:
    RETVAL = wxPluginManager::UnloadLibrary( string );
  OUTPUT:
    RETVAL

#endif

bool
_xsmatch( avref, proto, required = -1, allowmore = false )
    SV* avref
    SV* proto
    int required
    bool allowmore
  PREINIT:
    AV* av;
    wxPliPrototype* prototype;
    int n, len;
  PROTOTYPE: \@$;$$
  CODE:
    av = wxPli_avref_2_av( avref );
    if( !av ) croak( "first parameter must be an ARRAY reference" );
    prototype = INT2PTR( wxPliPrototype*, SvIV( proto ) );
    len = av_len( av ) + 1;
    EXTEND(SP, len);
    PUSHMARK(SP);
    for( int i = 0; i < len; ++i )
        PUSHs( *av_fetch( av, i, 0 ) );
    PUTBACK;
    RETVAL = wxPli_match_arguments( aTHX_ *prototype, required, allowmore );
    SPAGAIN;
    POPMARK; // wxPli_match_* does a PUSHMARK
  OUTPUT: RETVAL

## // Optional Modules Included

bool
_wx_optmod_ribbon()
  CODE:
#if wxPERL_USE_RIBBON && wxUSE_RIBBON && WXPERL_W_VERSION_GE( 2, 9, 3 )
    RETVAL = TRUE;
#else
    RETVAL = FALSE;
#endif
  OUTPUT: RETVAL

bool
_wx_optmod_propgrid()
  CODE:
#if wxPERL_USE_PROPGRID && wxUSE_PROPGRID && WXPERL_W_VERSION_GE( 2, 9, 3 )
    RETVAL = TRUE;
#else
    RETVAL = FALSE;
#endif
  OUTPUT: RETVAL
  
bool
_wx_optmod_media()
  CODE:
#if wxPERL_USE_MEDIA && wxUSE_MEDIACTRL
    RETVAL = TRUE;
#else
    RETVAL = FALSE;
#endif
  OUTPUT: RETVAL

bool
_wx_optmod_webview()
  CODE:
#if wxPERL_USE_WEBVIEW && wxUSE_WEBVIEW && WXPERL_W_VERSION_GE( 2, 9, 3 )
    RETVAL = TRUE;
#else
    RETVAL = FALSE;
#endif
  OUTPUT: RETVAL

bool
_wx_optmod_ipc()
  CODE:
#if wxPERL_USE_IPC && wxUSE_IPC
    RETVAL = TRUE;
#else
    RETVAL = FALSE;
#endif
  OUTPUT: RETVAL

I32
looks_like_number( sval )
    SV* sval
  CODE:
    RETVAL = my_looks_like_number( aTHX_ sval );
  OUTPUT:
    RETVAL

void
CLONE( CLASS )
    char* CLASS
  CODE:
    SetConstants();

INCLUDE: XS/App.xs
INCLUDE: XS/Caret.xs
INCLUDE: XS/Geom.xs
INCLUDE: XS/Menu.xs
INCLUDE: XS/Log.xs
INCLUDE: XS/ToolTip.xs
INCLUDE: XS/Locale.xs
INCLUDE: XS/Utils.xs
INCLUDE: XS/Timer.xs
INCLUDE: XS/Stream.xs
INCLUDE: XS/TaskBarIcon.xs
INCLUDE: XS/Config.xs
INCLUDE: XS/Process.xs
INCLUDE: XS/FontMapper.xs
INCLUDE: XS/Wave.xs

INCLUDE_COMMAND: $^X -MExtUtils::XSpp::Cmd -e xspp -- -t typemap.xsp XS/FontEnumerator.xsp

INCLUDE_COMMAND: $^X -MExtUtils::XSpp::Cmd -e xspp -- -t typemap.xsp XS/ArtProvider.xsp

INCLUDE_COMMAND: $^X -MExtUtils::XSpp::Cmd -e xspp -- -t typemap.xsp XS/MimeTypes.xsp

INCLUDE_COMMAND: $^X -MExtUtils::XSpp::Cmd -e xspp -- -t typemap.xsp XS/Sound.xsp

INCLUDE_COMMAND: $^X -MExtUtils::XSpp::Cmd -e xspp -- -t typemap.xsp XS/Power.xsp

INCLUDE_COMMAND: $^X -MExtUtils::XSpp::Cmd -e xspp -- -t typemap.xsp XS/ClassInfo.xsp

INCLUDE_COMMAND: $^X -MExtUtils::XSpp::Cmd -e xspp -- -t typemap.xsp XS/Display.xsp

INCLUDE_COMMAND: $^X -MExtUtils::XSpp::Cmd -e xspp -- -t typemap.xsp XS/StandardPaths.xsp

INCLUDE_COMMAND: $^X -MExtUtils::XSpp::Cmd -e xspp -- -t typemap.xsp XS/Variant.xsp

INCLUDE_COMMAND: $^X -MExtUtils::XSpp::Cmd -e xspp -- -t typemap.xsp XS/NotificationMessage.xsp

INCLUDE_COMMAND: $^X -MExtUtils::XSpp::Cmd -e xspp -- -t typemap.xsp XS/EventFilter.xsp

INCLUDE_COMMAND: $^X -MExtUtils::XSpp::Cmd -e xspp -- -t typemap.xsp interface/wx/uiaction.h

##  //FIXME// tricky
##if defined(__WXMSW__)
##undef XS
##define XS( name ) WXXS( name )
##endif

MODULE=Wx PACKAGE=Wx

#!irrelevant class wxArray
#!irrelevant class wxArray<T>
#!irrelevant class wxArrayString
#!irrelevant class wxObjArray
#!irrelevant class wxBrushList
#!irrelevant class wxClientData
#!irrelevant class wxClientDataContainer
#!irrelevant class wxCondition
#!irrelevant class wxCriticalSection
#!irrelevant class wxCriticalSectionLocker
#!irrelevant class wxDebugContext
#!irrelevant class wxDebugStreamBuf
#!irrelevant class wxDynamicLibrary
#!irrelevant class wxDynamicLibraryDetails
#!irrelevant class wxFFile
#!irrelevant class wxFFileInputStream
#!irrelevant class wxFFileOutputStream
#!irrelevant class wxFFileStream
#!irrelevant class wxFile
#!irrelevant class wxFileInputStream
#!irrelevant class wxFileOutputStream
#!irrelevant class wxFileStream
#!irrelevant class wxFilterClassFactory
#!irrelevant class wxFontList
#!irrelevant class wxHashMap
#!irrelevant class wxHashSet
#!irrelevant class wxHashTable
#!irrelevant class wxList
#!irrelevant class wxLongLong
#!irrelevant class wxMemoryBuffer
#!irrelevant class wxModule
#!irrelevant class wxMutex
#!irrelevant class wxMutexLocker
#!irrelevant class wxNode
#!irrelevant class wxObjectRefData
#!irrelevant class wxPathList
#!irrelevant class wxPenList
#!irrelevant class wxProtocol
#!irrelevant class wxRecursionGuard
#!irrelevant class wxRecursionGuardFlag
#!irrelevant class wxScopedArray
#!irrelevant class wxScopedPtr
#!irrelevant class wxScopedTiedPtr
#!irrelevant class wxSemaphore
#!irrelevant class wxString
#!irrelevant class wxStringBuffer
#!irrelevant class wxStringBufferLength
#!irrelevant class wxStringClientData
#!irrelevant class wxStringTokenizer
#!irrelevant class wxThreadHelper

#!equivalent class wxThread to Perl modules thread, thread::shared

#!equivalent class wxArchiveClassFactory to Perl modules Archive::Any, Archive::Zip, Archive::Tar
#!equivalent class wxArchiveEntry to Perl modules Archive::Any, Archive::Zip, Archive::Tar
#!equivalent class wxArchiveInputStream to Perl modules Archive::Any, Archive::Zip, Archive::Tar
#!equivalent class wxArchiveIterator to Perl modules Archive::Any, Archive::Zip, Archive::Tar
#!equivalent class wxArchiveNotifier to Perl modules Archive::Any, Archive::Zip, Archive::Tar
#!equivalent class wxArchiveOutputStream to Perl modules Archive::Any, Archive::Zip, Archive::Tar
#!equivalent class wxAutomationObject to perl module Win32::OLE

#!equivalent class wxCSConv to Perl module Encode
#!equivalent class wxEncodingConverter to Perl module Encode
#!equivalent class wxMBConv to Perl module Encode
#!equivalent class wxMBConvFile to Perl module Encode
#!equivalent class wxMBConvUTF16 to Perl module Encode
#!equivalent class wxMBConvUTF32 to Perl module Encode
#!equivalent class wxMBConvUTF7 to Perl module Encode
#!equivalent class wxMBConvUTF8 to Perl module Encode

#!equivalent class wxDb to Perl module DBI
#!equivalent class wxDbColDataPtr to Perl module DBI
#!equivalent class wxDbColDef to Perl module DBI
#!equivalent class wxDbColFor to Perl module DBI
#!equivalent class wxDbColInf to Perl module DBI
#!equivalent class wxDbConnectInf to Perl module DBI
#!irrelevant class wxDbGridColInfo
#!equivalent class wxDbIdxDef to Perl module DBI
#!equivalent class wxDbInf to Perl module DBI
#!equivalent class wxDbTable to Perl module DBI
#!equivalent class wxDbTableInf to Perl module DBI

#!equivalent class wxDir to opendir/readdir and to Perl modules File::Find, File::Find::Rule
#!equivalent class wxDirTraverser to Perl modules File::Find, File::Find::Rule
#!equivalent class wxFileName to File::Spec, Path::Class

#!equivalent class wxFTP to Perl modules Net::FTP, LWP::UserAgent
#!equivalent class wxHTTP to Perl modules Net::HTTP, LWP::UserAgent

#!equivalent class wxRegEx to a Perl regular expression
#!equivalent class wxRegKey to Perl module Win32::Registry

#!equivalent class wxTarClassFactory to Perl module Archive::Tar
#!equivalent class wxTarEntry to Perl module Archive::Tar
#!equivalent class wxTarInputStream to Perl module Archive::Tar
#!equivalent class wxTarOutputStream to Perl module Archive::Tar

#!equivalent class wxTempFile to Perl module File::Temp
#!equivalent class wxTempFileOutputStream to Perl module File::Temp

#!equivalent class wxTextValidator to Perl module Wx::Perl::TextValidator

#!equivalent class wxURI to Perl module URI
#!equivalent class wxURL to Perl module URI::URL

#!equivalent class wxZipClassFactory to Perl module Archive::Zip
#!equivalent class wxZipEntry to Perl module Archive::Zip
#!equivalent class wxZipInputStream to Perl module Archive::Zip
#!equivalent class wxZipNotifier to Perl module Archive::Zip
#!equivalent class wxZipOutputStream to Perl module Archive::Zip

#!equivalent class wxZlibInputStream to Perl module Compress::Zlib, IO::Zlib
#!equivalent class wxZlibOutputStream to Perl module Compress::Zlib, IO::Zlib

#!equivalent class wxBufferedInputStream to Perl input/output
#!equivalent class wxBufferedOutputStream to Perl input/output
#!equivalent class wxCountingOutputStream to Perl input/output
#!equivalent class wxCountingOutputStream to Perl input/output
#!equivalent class wxDataInputStream to Perl module Storable
#!equivalent class wxDataOutputStream to Perl module Storable
#!equivalent class wxFilterInputStream to Perl module PerlIO::via
#!equivalent class wxFilterOutputStream to Perl module PerlIO::via
#!equivalent class wxMemoryInputStream to Perl module PerlIO::scalar
#!equivalent class wxMemoryOutputStream to Perl module PerlIO::scalar
#!equivalent class wxSocketInputStream to Perl modules IO::Socket::*
#!equivalent class wxSocketOutputStream to Perl modules IO::Socket::*
#!equivalent class wxStreamBase to Perl input/output
#!equivalent class wxStreamBase to Perl input/output
#!equivalent class wxStreamBuffer to Perl input/output
#!equivalent class wxStringInputStream to Perl module PerlIO::scalar
#!equivalent class wxStringOutputStream to Perl module PerlIO::scalar
#!equivalent class wxTextFile to Perl input/output
#!equivalent class wxTextInputStream to Perl input/output
#!equivalent class wxTextOutputStream to Perl input/output

#!equivalent class wxMetafile to Perl module Wx::Metafile

#!equivalent class wxDialUpEvent to Perl module Wx::DialUpEvent
#!equivalent class wxDialUpManager to Perl module Wx::DialUpManager      

#!equivalent class wxGLCanvas to Perl module Wx::GLCanvas
#!equivalent class wxGLContext to Perl module Wx::GLCanvas

#!equivalent class wxDateTime to perl module DateTime, Date::Calc, Date::Manip, Time::Piece
#!equivalent class wxDateSpan to perl module DateTime, Date::Calc, Date::Manip, Time::Piece
#!equivalent class wxTimeSpan to perl module DateTime, Date::Calc, Date::Manip, Time::Piece