void SetAddress(GAddress *address);
// we need to be able to create copies of the addresses polymorphically (i.e.
- // wihtout knowing the exact address class)
+ // without knowing the exact address class)
virtual wxSockAddress *Clone() const = 0;
protected:
GAddress *m_address;
+
+private:
+ void Init();
};
class WXDLLEXPORT wxIPV4address : public wxSockAddress {
void SetNotify(wxSocketEventFlags flags);
void Notify(bool notify);
+ // initialize/shutdown the sockets (usually called automatically)
+ static bool IsInitialized();
+ static bool Initialize();
+ static void Shutdown();
+
// callbacks are deprecated, use events instead
#if WXWIN_COMPATIBILITY
wxSockCbk Callback(wxSockCbk cbk_);
bool m_notify; // notify events to users?
wxSocketEventFlags m_eventmask; // which events to notify?
+ // the initialization count, GSocket is initialized if > 0
+ static size_t m_countInit;
+
// callbacks are deprecated, use events instead
#if WXWIN_COMPATIBILITY
wxSockCbk m_cbk; // callback
#if wxUSE_SOCKETS
-#include <stdio.h>
-#include <stdlib.h>
-#include <ctype.h>
+#ifndef WX_PRECOMP
+ #include "wx/defs.h"
+ #include "wx/object.h"
+ #include "wx/log.h"
+ #include "wx/intl.h"
-#if !defined(__MWERKS__) && !defined(__SALFORDC__)
-#include <memory.h>
-#endif
+ #include <stdio.h>
+ #include <stdlib.h>
+ #include <ctype.h>
+
+ #if !defined(__MWERKS__) && !defined(__SALFORDC__)
+ #include <memory.h>
+ #endif
+#endif // !WX_PRECOMP
-#include "wx/defs.h"
-#include "wx/object.h"
-#include "wx/log.h"
-#include "wx/intl.h"
#include "wx/gsocket.h"
+#include "wx/socket.h"
#include "wx/sckaddr.h"
IMPLEMENT_ABSTRACT_CLASS(wxSockAddress, wxObject)
// wxIPV4address
// ---------------------------------------------------------------------------
+void wxSockAddress::Init()
+{
+ if ( !wxSocketBase::IsInitialized() )
+ {
+ // we must do it before using GAddress_XXX functions
+ (void)wxSocketBase::Initialize();
+ }
+}
+
wxSockAddress::wxSockAddress()
{
- m_address = GAddress_new();
+ Init();
+
+ m_address = GAddress_new();
}
wxSockAddress::wxSockAddress(const wxSockAddress& other)
{
+ Init();
+
m_address = GAddress_copy(other.m_address);
}
// 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++ )
+ {
+ 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
// --------------------------------------------------------------------------
m_cbk = NULL;
m_cdata = NULL;
#endif // WXWIN_COMPATIBILITY
+
+ if ( !IsInitialized() )
+ {
+ // this Initialize() will be undone by wxSocketModule::OnExit(), all the
+ // other calls to it should be matched by a call to Shutdown()
+ Initialize();
+ }
}
wxSocketBase::wxSocketBase()
class WXDLLEXPORT wxSocketModule : public wxModule
{
- DECLARE_DYNAMIC_CLASS(wxSocketModule)
-
public:
- bool OnInit() { return GSocket_Init() != 0; }
- void OnExit() { GSocket_Cleanup(); }
+ virtual bool OnInit()
+ {
+ // wxSocketBase will call GSocket_Init() itself when/if needed
+ return TRUE;
+ }
+
+ virtual void OnExit()
+ {
+ if ( wxSocketBase::IsInitialized() )
+ wxSocketBase::Shutdown();
+ }
+
+private:
+ DECLARE_DYNAMIC_CLASS(wxSocketModule)
};
IMPLEMENT_DYNAMIC_CLASS(wxSocketModule, wxModule)