#endif //WX_PRECOMP
#include "wx/apptrait.h"
+#include "wx/dynload.h"
#include "wx/msw/private.h" // includes <windows.h>
#include "wx/msw/missing.h" // CHARSET_HANGUL
-#ifdef __GNUWIN32_OLD__
+#if defined(__GNUWIN32_OLD__) || defined(__WXWINCE__) \
+ || defined(__CYGWIN32__)
// apparently we need to include winsock.h to get WSADATA and other stuff
// used in wxGetFullHostName() with the old mingw32 versions
#include <winsock.h>
#endif
#endif
-// ----------------------------------------------------------------------------
-// module globals
-// ----------------------------------------------------------------------------
-
-#if wxUSE_ON_FATAL_EXCEPTION
- static bool gs_handleExceptions = FALSE;
-#endif
-
// ----------------------------------------------------------------------------
// constants
// ----------------------------------------------------------------------------
// get full hostname (with domain name if possible)
bool wxGetFullHostName(wxChar *buf, int maxSize)
{
-#if defined(__WIN32__) && !defined(__WXMICROWIN__) && ! (defined(__GNUWIN32__) && !defined(__MINGW32__))
+#if !defined( __WXMICROWIN__) && wxUSE_DYNAMIC_LOADER
// TODO should use GetComputerNameEx() when available
- // the idea is that if someone had set wxUSE_SOCKETS to 0 the code
- // shouldn't use winsock.dll (a.k.a. ws2_32.dll) at all so only use this
- // code if we link with it anyhow
-#if wxUSE_SOCKETS
-
- WSADATA wsa;
- if ( WSAStartup(MAKEWORD(1, 1), &wsa) == 0 )
+ // we don't want to always link with Winsock DLL as we might not use it at
+ // all, so load it dynamically here if needed
+ wxDynamicLibrary dllWinsock(_T("ws2_32.dll"), wxDL_VERBATIM);
+ if ( dllWinsock.IsLoaded() )
{
- wxString host;
- char bufA[256];
- if ( gethostname(bufA, WXSIZEOF(bufA)) == 0 )
+ typedef int (PASCAL *WSAStartup_t)(WORD, WSADATA *);
+ typedef int (PASCAL *gethostname_t)(char *, int);
+ typedef hostent* (PASCAL *gethostbyname_t)(const char *);
+ typedef hostent* (PASCAL *gethostbyaddr_t)(const char *, int , int);
+ typedef int (PASCAL *WSACleanup_t)(void);
+
+ #define LOAD_WINSOCK_FUNC(func) \
+ func ## _t \
+ pfn ## func = (func ## _t)dllWinsock.GetSymbol(_T(#func))
+
+ LOAD_WINSOCK_FUNC(WSAStartup);
+
+ WSADATA wsa;
+ if ( pfnWSAStartup && pfnWSAStartup(MAKEWORD(1, 1), &wsa) == 0 )
{
- // gethostname() won't usually include the DNS domain name, for
- // this we need to work a bit more
- if ( !strchr(bufA, '.') )
- {
- struct hostent *pHostEnt = gethostbyname(bufA);
+ LOAD_WINSOCK_FUNC(gethostname);
- if ( pHostEnt )
+ wxString host;
+ if ( pfngethostname )
+ {
+ char bufA[256];
+ if ( pfngethostname(bufA, WXSIZEOF(bufA)) == 0 )
{
- // Windows will use DNS internally now
- pHostEnt = gethostbyaddr(pHostEnt->h_addr, 4, AF_INET);
- }
+ // gethostname() won't usually include the DNS domain name,
+ // for this we need to work a bit more
+ if ( !strchr(bufA, '.') )
+ {
+ LOAD_WINSOCK_FUNC(gethostbyname);
- if ( pHostEnt )
- {
- host = wxString::FromAscii(pHostEnt->h_name);
+ struct hostent *pHostEnt = pfngethostbyname
+ ? pfngethostbyname(bufA)
+ : NULL;
+
+ if ( pHostEnt )
+ {
+ // Windows will use DNS internally now
+ LOAD_WINSOCK_FUNC(gethostbyaddr);
+
+ pHostEnt = pfngethostbyaddr
+ ? pfngethostbyaddr(pHostEnt->h_addr,
+ 4, AF_INET)
+ : NULL;
+ }
+
+ if ( pHostEnt )
+ {
+ host = wxString::FromAscii(pHostEnt->h_name);
+ }
+ }
}
}
- }
- WSACleanup();
+ LOAD_WINSOCK_FUNC(WSACleanup);
+ if ( pfnWSACleanup )
+ pfnWSACleanup();
- if ( !host.empty() )
- {
- wxStrncpy(buf, host, maxSize);
- return TRUE;
+ if ( !host.empty() )
+ {
+ wxStrncpy(buf, host, maxSize);
+
+ return TRUE;
+ }
}
}
-
-#endif // wxUSE_SOCKETS
-
-#endif // Win32
+#endif // !__WXMICROWIN__
return wxGetHostName(buf, maxSize);
}
wxString strPath;
::GetModuleFileName(::GetModuleHandle(NULL),
- strPath.GetWriteBuf(MAX_PATH), MAX_PATH);
- strPath.UngetWriteBuf();
+ wxStringBuffer(strPath, MAX_PATH), MAX_PATH);
// extract the dir name
wxSplitPath(strPath, &strDir, NULL, NULL);
if ( value )
{
- (void)::GetEnvironmentVariable(var, value->GetWriteBuf(dwRet), dwRet);
- value->UngetWriteBuf();
+ (void)::GetEnvironmentVariable(var, wxStringBuffer(*value, dwRet),
+ dwRet);
}
return TRUE;
#endif // Win32/16
}
-int wxAppTraits::GetOSVersion(int *verMaj, int *verMin)
+wxToolkitInfo& wxAppTraits::GetToolkitInfo()
{
// cache the version info, it's not going to change
//
case VER_PLATFORM_WIN32_NT:
s_ver = wxWINDOWS_NT;
break;
-
+#ifdef __WXWINCE__
case VER_PLATFORM_WIN32_CE:
s_ver = wxWINDOWS_CE;
break;
+#endif
}
}
}
- if ( verMaj )
- *verMaj = s_major;
- if ( verMin )
- *verMin = s_minor;
-
- return s_ver;
+ static wxToolkitInfo info;
+ info.versionMajor = s_major;
+ info.versionMinor = s_minor;
+ info.os = s_ver;
+ info.name = _T("wxBase");
+ return info;
}
// ----------------------------------------------------------------------------
#endif // wxUSE_FONTMAP/!wxUSE_FONTMAP
-// ----------------------------------------------------------------------------
-// wxApp::OnFatalException() support
-// ----------------------------------------------------------------------------
-
-bool wxHandleFatalExceptions(bool doit)
-{
-#if wxUSE_ON_FATAL_EXCEPTION
- // assume this can only be called from the main thread
- gs_handleExceptions = doit;
-
- return TRUE;
-#else
- wxFAIL_MSG(_T("set wxUSE_ON_FATAL_EXCEPTION to 1 to use this function"));
-
- (void)doit;
- return FALSE;
-#endif
-}
-
-#if wxUSE_ON_FATAL_EXCEPTION
-
-extern unsigned long wxGlobalSEHandler()
-{
- if ( gs_handleExceptions && wxTheApp )
- {
- // give the user a chance to do something special about this
- wxTheApp->OnFatalException();
-
- // this will execute our handler and terminate the process
- return EXCEPTION_EXECUTE_HANDLER;
- }
-
- return EXCEPTION_CONTINUE_SEARCH;
-}
-
-#endif // wxUSE_ON_FATAL_EXCEPTION
-