-// --------------------------------------------------------------
-// wxSocketBase ctor and dtor
-// --------------------------------------------------------------
-
-wxSocketBase::wxSocketBase(wxSockFlags _flags, wxSockType _type) :
- wxEvtHandler(),
- m_socket(NULL), m_evt_handler(NULL), m_id(-1),
- m_flags(_flags), m_type(_type),
- m_neededreq(0), m_notify_state(FALSE),
- m_connected(FALSE), m_establishing(FALSE),
- m_reading(FALSE), m_writing(FALSE),
- m_error(FALSE), m_lcount(0), m_timeout(600), m_states(),
- m_unread(NULL), m_unrd_size(0), m_unrd_cur(0),
- m_cbk(NULL), m_cdata(NULL)
+// ==========================================================================
+// wxSocketBase
+// ==========================================================================
+
+// --------------------------------------------------------------------------
+// Initialization and shutdown
+// --------------------------------------------------------------------------
+
+// FIXME-MT: all this is MT-unsafe, of course, we should protect all accesses
+// to m_countInit with a crit section
+size_t wxSocketBase::m_countInit = 0;
+
+bool wxSocketBase::IsInitialized()
+{
+ return m_countInit > 0;
+}
+
+bool wxSocketBase::Initialize()
+{
+ if ( !m_countInit++ )
+ {
+ /*
+ Details: Initialize() creates a hidden window as a sink for socket
+ events, such as 'read completed'. wxMSW has only one message loop
+ for the main thread. If Initialize is called in a secondary thread,
+ the socket window will be created for the secondary thread, but
+ since there is no message loop on this thread, it will never
+ receive events and all socket operations will time out.
+ BTW, the main thread must not be stopped using sleep or block
+ on a semaphore (a bad idea in any case) or socket operations
+ will time out.
+ */
+ wxASSERT_MSG( wxIsMainThread(),
+ wxT("Call wxSocketBase::Initialize() from the main thread first!"));
+
+ wxAppTraits *traits = wxAppConsole::GetInstance() ?
+ wxAppConsole::GetInstance()->GetTraits() : NULL;
+ GSocketGUIFunctionsTable *functions =
+ traits ? traits->GetSocketGUIFunctionsTable() : NULL;
+ GSocket_SetGUIFunctions(functions);
+
+ if ( !GSocket_Init() )
+ {
+ m_countInit--;
+
+ return false;
+ }
+ }
+
+ return true;
+}
+
+void wxSocketBase::Shutdown()
+{
+ // we should be initialized
+ wxASSERT_MSG( m_countInit, _T("extra call to Shutdown()") );
+ if ( !--m_countInit )
+ {
+ GSocket_Cleanup();
+ }
+}
+
+// --------------------------------------------------------------------------
+// Ctor and dtor
+// --------------------------------------------------------------------------
+
+void wxSocketBase::Init()