1 ////////////////////////////////////////////////////////////////////////////////
3 // Purpose: Socket handler classes
4 // Authors: Guilhem Lavaux
7 // Copyright: (C) 1999, 1998, 1997, Guilhem Lavaux
9 // License: see wxWindows license
10 ////////////////////////////////////////////////////////////////////////////////
12 #pragma implementation "socket.h"
15 // For compilers that support precompilation, includes "wx.h".
16 #include "wx/wxprec.h"
24 /////////////////////////////////////////////////////////////////////////////
26 /////////////////////////////////////////////////////////////////////////////
28 #include <wx/object.h>
29 #include <wx/string.h>
32 #include <wx/module.h>
39 /////////////////////////////////////////////////////////////////////////////
41 /////////////////////////////////////////////////////////////////////////////
42 #include <wx/sckaddr.h>
43 #include <wx/socket.h>
45 // --------------------------------------------------------------
47 // --------------------------------------------------------------
48 #if !USE_SHARED_LIBRARY
49 IMPLEMENT_CLASS(wxSocketBase
, wxObject
)
50 IMPLEMENT_CLASS(wxSocketServer
, wxSocketBase
)
51 IMPLEMENT_CLASS(wxSocketClient
, wxSocketBase
)
52 IMPLEMENT_DYNAMIC_CLASS(wxSocketEvent
, wxEvent
)
55 class wxSocketState
: public wxObject
{
58 GSocketEventFlags evt_notify_state
;
59 wxSocketBase::wxSockFlags socket_flags
;
60 wxSocketBase::wxSockCbk c_callback
;
61 char *c_callback_data
;
64 wxSocketState() : wxObject() {}
67 // --------------------------------------------------------------
68 // --------- wxSocketBase CONSTRUCTOR ---------------------------
69 // --------------------------------------------------------------
70 wxSocketBase::wxSocketBase(wxSocketBase::wxSockFlags _flags
,
71 wxSocketBase::wxSockType _type
) :
73 m_socket(NULL
), m_flags(_flags
), m_type(_type
),
74 m_neededreq(GSOCK_INPUT_FLAG
| GSOCK_LOST_FLAG
),
75 m_lcount(0), m_timeout(600),
76 m_unread(NULL
), m_unrd_size(0), m_unrd_cur(0),
77 m_cbk(NULL
), m_cdata(NULL
),
78 m_connected(FALSE
), m_establishing(FALSE
),
79 m_notify_state(FALSE
), m_id(-1),
85 wxSocketBase::wxSocketBase() :
87 m_socket(NULL
), m_flags(SPEED
| WAITALL
), m_type(SOCK_UNINIT
),
88 m_neededreq(GSOCK_INPUT_FLAG
| GSOCK_LOST_FLAG
),
89 m_lcount(0), m_timeout(600),
90 m_unread(NULL
), m_unrd_size(0), m_unrd_cur(0),
91 m_cbk(NULL
), m_cdata(NULL
),
92 m_connected(FALSE
), m_establishing(FALSE
),
93 m_notify_state(FALSE
), m_id(-1),
99 // --------------------------------------------------------------
100 // wxSocketBase destructor
101 // --------------------------------------------------------------
103 wxSocketBase::~wxSocketBase()
108 // At last, close the file descriptor.
112 GSocket_destroy(m_socket
);
115 bool wxSocketBase::Close()
119 if (m_notify_state
== TRUE
)
122 // Shutdown the connection.
123 GSocket_Shutdown(m_socket
);
125 m_establishing
= FALSE
;
131 // --------------------------------------------------------------
132 // wxSocketBase base IO function
133 // --------------------------------------------------------------
134 class _wxSocketInternalTimer
: public wxTimer
{
137 unsigned long m_new_val
;
141 *m_state
= m_new_val
; // Change the value
145 int wxSocketBase::DeferRead(char *buffer
, wxUint32 nbytes
)
147 wxSocketEventFlags old_event_flags
;
148 bool old_notify_state
;
150 _wxSocketInternalTimer timer
;
152 wxASSERT(m_defering
== NO_DEFER
);
154 // Set the defering mode to READ.
155 m_defering
= DEFER_READ
;
157 // Save the old state.
158 old_event_flags
= NeededReq();
159 old_notify_state
= m_notify_state
;
161 // Set the new async flag.
162 SetNotify(GSOCK_INPUT_FLAG
| GSOCK_LOST_FLAG
);
165 // Set the current buffer.
166 m_defer_buffer
= buffer
;
167 m_defer_nbytes
= nbytes
;
168 m_defer_timer
= &timer
;
170 timer
.m_state
= (int *)&m_defer_buffer
;
173 timer
.Start(m_timeout
* 1000, FALSE
);
175 // Wait for buffer completion.
176 while (m_defer_buffer
!= NULL
)
181 // Restore the old state.
182 Notify(old_notify_state
);
183 SetNotify(old_event_flags
);
185 // Disable defering mode.
186 m_defering
= NO_DEFER
;
187 m_defer_timer
= NULL
;
189 // Return the number of bytes read from the socket.
190 return nbytes
-m_defer_nbytes
;
193 wxSocketBase
& wxSocketBase::Read(char* buffer
, wxUint32 nbytes
)
197 m_lcount
= GetPushback(buffer
, nbytes
, FALSE
);
204 // If we have got the whole needed buffer or if we don't want to
205 // wait then it returns immediately.
206 if (!nbytes
|| (m_lcount
&& !(m_flags
& WAITALL
)) ) {
210 if ((m_flags
& SPEED
) != 0) {
212 if ((m_flags
& WAITALL
) != 0) {
213 while (ret
> 0 && nbytes
> 0) {
214 ret
= GSocket_Read(m_socket
, buffer
, nbytes
);
219 // In case the last call was an error ...
223 ret
= GSocket_Read(m_socket
, buffer
, nbytes
);
229 ret
= DeferRead(buffer
, nbytes
);
238 wxSocketBase
& wxSocketBase::ReadMsg(char* buffer
, wxUint32 nbytes
)
240 unsigned long len
, len2
, sig
;
246 // sig should be an explicit 32-bit unsigned integer; I've seen
247 // compilers in which wxUint32 was actually a 16-bit unsigned integer
249 Read((char *)&msg
, sizeof(msg
));
250 if (m_lcount
!= sizeof(msg
))
253 sig
= msg
.sig
[0] & 0xff;
254 sig
|= (wxUint32
)(msg
.sig
[1] & 0xff) << 8;
255 sig
|= (wxUint32
)(msg
.sig
[2] & 0xff) << 16;
256 sig
|= (wxUint32
)(msg
.sig
[3] & 0xff) << 24;
258 if (sig
!= 0xfeeddead)
260 len
= msg
.len
[0] & 0xff;
261 len
|= (wxUint32
)(msg
.len
[1] & 0xff) << 8;
262 len
|= (wxUint32
)(msg
.len
[2] & 0xff) << 16;
263 len
|= (wxUint32
)(msg
.len
[3] & 0xff) << 24;
265 // len2 is incorrectly computed in the original; this sequence is
274 // the "len &&" in the following statement is necessary so that
275 // we don't attempt to read (and possibly hang the system)
276 // if the message was zero bytes long
277 if (len
&& Read(buffer
, len
).LastCount() != len
)
279 if (len2
&& (Read(NULL
, len2
).LastCount() != len2
))
281 if (Read((char *)&msg
, sizeof(msg
)).LastCount() != sizeof(msg
))
284 sig
= msg
.sig
[0] & 0xff;
285 sig
|= (wxUint32
)(msg
.sig
[1] & 0xff) << 8;
286 sig
|= (wxUint32
)(msg
.sig
[2] & 0xff) << 16;
287 sig
|= (wxUint32
)(msg
.sig
[3] & 0xff) << 24;
290 if (sig
!= 0xdeadfeed)
291 wxLogDebug(_T("Warning: invalid signature returned to ReadMsg\n"));
296 wxSocketBase
& wxSocketBase::Peek(char* buffer
, wxUint32 nbytes
)
298 Read(buffer
, nbytes
);
299 CreatePushbackAfter(buffer
, nbytes
);
304 int wxSocketBase::DeferWrite(const char *buffer
, wxUint32 nbytes
)
306 wxSocketEventFlags old_event_flags
;
307 bool old_notify_state
;
309 _wxSocketInternalTimer timer
;
311 wxASSERT(m_defering
== NO_DEFER
);
313 m_defering
= DEFER_WRITE
;
315 // Save the old state
316 old_event_flags
= NeededReq();
317 old_notify_state
= m_notify_state
;
319 SetNotify(GSOCK_OUTPUT_FLAG
| GSOCK_LOST_FLAG
);
322 // Set the current buffer
323 m_defer_buffer
= (char *)buffer
;
324 m_defer_nbytes
= nbytes
;
327 timer
.m_state
= (int *)&m_defer_buffer
;
330 m_defer_timer
= &timer
;
331 timer
.Start(m_timeout
* 1000, FALSE
);
333 while (m_defer_buffer
!= NULL
)
337 m_defer_timer
= NULL
;
340 // Restore the old state
341 Notify(old_notify_state
);
342 SetNotify(old_event_flags
);
344 m_defering
= NO_DEFER
;
346 return nbytes
-m_defer_nbytes
;
349 wxSocketBase
& wxSocketBase::Write(const char *buffer
, wxUint32 nbytes
)
353 if ((m_flags
& SPEED
) != 0)
354 ret
= GSocket_Write(m_socket
, buffer
, nbytes
);
356 ret
= DeferWrite(buffer
, nbytes
);
364 wxSocketBase
& wxSocketBase::WriteMsg(const char *buffer
, wxUint32 nbytes
)
371 // warning about 'cast truncates constant value'
373 #pragma warning(disable: 4310)
374 #endif // __VISUALC__
376 msg
.sig
[0] = (char) 0xad;
377 msg
.sig
[1] = (char) 0xde;
378 msg
.sig
[2] = (char) 0xed;
379 msg
.sig
[3] = (char) 0xfe;
381 msg
.len
[0] = (char) nbytes
& 0xff;
382 msg
.len
[1] = (char) (nbytes
>> 8) & 0xff;
383 msg
.len
[2] = (char) (nbytes
>> 16) & 0xff;
384 msg
.len
[3] = (char) (nbytes
>> 24) & 0xff;
386 if (Write((char *)&msg
, sizeof(msg
)).LastCount() < sizeof(msg
))
388 if (Write(buffer
, nbytes
).LastCount() < nbytes
)
391 msg
.sig
[0] = (char) 0xed;
392 msg
.sig
[1] = (char) 0xfe;
393 msg
.sig
[2] = (char) 0xad;
394 msg
.sig
[3] = (char) 0xde;
395 msg
.len
[0] = msg
.len
[1] = msg
.len
[2] = msg
.len
[3] = (char) 0;
396 Write((char *)&msg
, sizeof(msg
));
401 #pragma warning(default: 4310)
402 #endif // __VISUALC__
405 wxSocketBase
& wxSocketBase::Unread(const char *buffer
, wxUint32 nbytes
)
409 CreatePushbackAfter(buffer
, nbytes
);
415 bool wxSocketBase::IsData() const
420 return (GSocket_DataAvailable(m_socket
));
423 void wxSocketBase::DoDefer(wxSocketNotify req_evt
)
427 if (req_evt
== wxSOCKET_LOST
) {
429 m_defer_buffer
= NULL
;
432 switch (m_defering
) {
434 ret
= GSocket_Read(m_socket
, m_defer_buffer
, m_defer_nbytes
);
437 ret
= GSocket_Write(m_socket
, m_defer_buffer
, m_defer_nbytes
);
444 m_defer_nbytes
-= ret
;
449 // If we are waiting for all bytes to be acquired, keep the defering modei
451 if ((m_flags
& WAITALL
) == 0 || m_defer_nbytes
== 0 || ret
< 0) {
452 m_defer_buffer
= NULL
;
455 m_defer_buffer
+= ret
;
456 m_defer_timer
->Start(m_timeout
* 1000, FALSE
);
460 // ---------------------------------------------------------------------
461 // --------- wxSocketBase Discard(): deletes all byte in the input queue
462 // ---------------------------------------------------------------------
463 void wxSocketBase::Discard()
465 #define MAX_BUFSIZE (10*1024)
466 char *my_data
= new char[MAX_BUFSIZE
];
467 wxUint32 recv_size
= MAX_BUFSIZE
;
470 SetFlags(NOWAIT
| SPEED
);
472 while (recv_size
== MAX_BUFSIZE
)
474 recv_size
= Read(my_data
, MAX_BUFSIZE
).LastCount();
483 // --------------------------------------------------------------
484 // wxSocketBase socket info functions
485 // --------------------------------------------------------------
487 bool wxSocketBase::GetPeer(wxSockAddress
& addr_man
) const
494 peer
= GSocket_GetPeer(m_socket
);
495 addr_man
.SetAddress(peer
);
496 GAddress_destroy(peer
);
501 bool wxSocketBase::GetLocal(wxSockAddress
& addr_man
) const
508 local
= GSocket_GetLocal(m_socket
);
509 addr_man
.SetAddress(local
);
510 GAddress_destroy(local
);
515 // --------------------------------------------------------------
516 // wxSocketBase wait functions
517 // --------------------------------------------------------------
519 void wxSocketBase::SaveState()
521 wxSocketState
*state
;
523 state
= new wxSocketState();
525 state
->notify_state
= m_notify_state
;
526 state
->evt_notify_state
= m_neededreq
;
527 state
->socket_flags
= m_flags
;
528 state
->c_callback
= m_cbk
;
529 state
->c_callback_data
= m_cdata
;
531 m_states
.Append(state
);
534 void wxSocketBase::RestoreState()
537 wxSocketState
*state
;
539 node
= m_states
.Last();
543 state
= (wxSocketState
*)node
->Data();
545 SetFlags(state
->socket_flags
);
546 m_neededreq
= state
->evt_notify_state
;
547 m_cbk
= state
->c_callback
;
548 m_cdata
= state
->c_callback_data
;
549 Notify(state
->notify_state
);
555 // --------------------------------------------------------------
556 // --------- wxSocketBase callback functions --------------------
557 // --------------------------------------------------------------
559 wxSocketBase::wxSockCbk
wxSocketBase::Callback(wxSockCbk cbk_
)
561 wxSockCbk old_cbk
= cbk_
;
567 char *wxSocketBase::CallbackData(char *data
)
569 char *old_data
= m_cdata
;
575 // --------------------------------------------------------------
576 // --------- wxSocketBase wait functions ------------------------
577 // --------------------------------------------------------------
579 static void wx_socket_wait(GSocket
*socket
, GSocketEvent event
, char *cdata
)
581 int *state
= (int *)cdata
;
586 bool wxSocketBase::_Wait(long seconds
, long milliseconds
, int type
)
588 bool old_notify_state
= m_notify_state
;
590 _wxSocketInternalTimer timer
;
592 if ((!m_connected
&& !m_establishing
) || !m_socket
)
595 // Set the variable to change
596 timer
.m_state
= &state
;
597 timer
.m_new_val
= GSOCK_MAX_EVENT
;
599 // Disable the previous handler
603 timer
.Start(seconds
* 1000 + milliseconds
, TRUE
);
604 GSocket_SetCallback(m_socket
, type
, wx_socket_wait
, (char *)&state
);
609 GSocket_UnsetCallback(m_socket
, type
);
612 // Notify will restore automatically the old GSocket flags
613 Notify(old_notify_state
);
615 // GRG: If a LOST event occured, we set m_establishing to
616 // FALSE here (this is a quick hack to make WaitOnConnect
617 // work; it will be removed when this function is modified
618 // so that it tells the caller which event occured).
620 if (state
== GSOCK_LOST
)
621 m_establishing
= FALSE
;
623 return (state
!= GSOCK_MAX_EVENT
);
626 bool wxSocketBase::Wait(long seconds
, long milliseconds
)
628 return _Wait(seconds
, milliseconds
, GSOCK_INPUT_FLAG
|
630 GSOCK_CONNECTION_FLAG
|
634 bool wxSocketBase::WaitForRead(long seconds
, long milliseconds
)
636 return _Wait(seconds
, milliseconds
, GSOCK_INPUT_FLAG
| GSOCK_LOST_FLAG
);
639 bool wxSocketBase::WaitForWrite(long seconds
, long milliseconds
)
641 return _Wait(seconds
, milliseconds
, GSOCK_OUTPUT_FLAG
| GSOCK_LOST_FLAG
);
644 bool wxSocketBase::WaitForLost(long seconds
, long milliseconds
)
646 return _Wait(seconds
, milliseconds
, GSOCK_LOST_FLAG
);
649 // --------------------------------------------------------------
650 // --------- wxSocketBase callback management -------------------
651 // --------------------------------------------------------------
653 wxSocketEventFlags
wxSocketBase::EventToNotify(wxSocketNotify evt
)
658 return GSOCK_INPUT_FLAG
;
660 return GSOCK_OUTPUT_FLAG
;
661 case GSOCK_CONNECTION
:
662 return GSOCK_CONNECTION_FLAG
;
664 return GSOCK_LOST_FLAG
;
669 void wxSocketBase::SetFlags(wxSockFlags _flags
)
674 wxSocketBase::wxSockFlags
wxSocketBase::GetFlags() const
679 void wxSocketBase::SetNotify(wxSocketEventFlags flags
)
681 // GRG: A client can also have connection events!
683 if (m_type != SOCK_SERVER)
684 flags &= ~GSOCK_CONNECTION_FLAG;
688 if (m_neededreq
== 0)
691 Notify(m_notify_state
);
694 // --------------------------------------------------------------
695 // Automatic notifier
696 // --------------------------------------------------------------
698 static void wx_socket_callback(GSocket
*socket
, GSocketEvent event
, char *cdata
)
700 wxSocketBase
*sckobj
= (wxSocketBase
*)cdata
;
702 sckobj
->OnRequest((wxSocketNotify
)event
);
705 void wxSocketBase::Notify(bool notify
)
707 m_notify_state
= notify
;
711 GSocket_UnsetCallback(m_socket
, GSOCK_INPUT_FLAG
| GSOCK_OUTPUT_FLAG
|
712 GSOCK_LOST_FLAG
| GSOCK_CONNECTION_FLAG
);
716 GSocket_SetCallback(m_socket
, m_neededreq
, wx_socket_callback
, (char *)this);
719 void wxSocketBase::OnRequest(wxSocketNotify req_evt
)
721 wxSocketEvent
event(m_id
);
722 wxSocketEventFlags notify
= EventToNotify(req_evt
);
726 case wxSOCKET_CONNECTION
:
727 m_establishing
= FALSE
;
734 case wxSOCKET_OUTPUT
:
735 if (m_defering
!= NO_DEFER
)
738 // Do not notify to user
744 if ((m_neededreq
& notify
) == notify
)
746 event
.m_socket
= this;
747 event
.m_skevt
= req_evt
;
749 OldOnNotify(req_evt
);
753 void wxSocketBase::OldOnNotify(wxSocketNotify evt
)
757 // --------------------------------------------------------------
758 // --------- wxSocketBase functions [Callback, CallbackData] ----
759 // --------------------------------------------------------------
761 void wxSocketBase::SetEventHandler(wxEvtHandler
& h_evt
, int id
)
763 SetNextHandler(&h_evt
);
767 // --------------------------------------------------------------
768 // --------- wxSocketBase pushback library ----------------------
769 // --------------------------------------------------------------
771 void wxSocketBase::CreatePushbackAfter(const char *buffer
, wxUint32 size
)
775 if (m_unread
!= NULL
)
776 m_unread
= (char *) realloc(m_unread
, m_unrd_size
+size
);
778 m_unread
= (char *) malloc(size
);
780 curr_pos
= m_unread
+ m_unrd_size
;
782 memcpy(curr_pos
, buffer
, size
);
786 void wxSocketBase::CreatePushbackBefore(const char *buffer
, wxUint32 size
)
788 if (m_unread
== NULL
)
789 m_unread
= (char *)malloc(size
);
793 tmp
= (char *)malloc(m_unrd_size
+ size
);
794 memcpy(tmp
+size
, m_unread
, m_unrd_size
);
802 memcpy(m_unread
, buffer
, size
);
805 wxUint32
wxSocketBase::GetPushback(char *buffer
, wxUint32 size
, bool peek
)
810 if (size
> (m_unrd_size
-m_unrd_cur
))
811 size
= m_unrd_size
-m_unrd_cur
;
812 memcpy(buffer
, (m_unread
+m_unrd_cur
), size
);
816 if (m_unrd_size
== m_unrd_cur
) {
827 // --------------------------------------------------------------
829 // --------------------------------------------------------------
831 wxSocketServer::wxSocketServer(wxSockAddress
& addr_man
,
833 wxSocketBase(flags
, SOCK_SERVER
)
835 m_socket
= GSocket_new();
840 GSocket_SetLocal(m_socket
, addr_man
.GetAddress());
841 if (GSocket_SetServer(m_socket
) != GSOCK_NOERROR
) {
842 GSocket_destroy(m_socket
);
850 // --------------------------------------------------------------
851 // wxSocketServer Accept
852 // --------------------------------------------------------------
854 bool wxSocketServer::AcceptWith(wxSocketBase
& sock
, bool wait
)
856 GSocket
*child_socket
;
858 // GRG: If wait == FALSE, then set the socket to
859 // nonblocking. I will set it back to blocking later,
860 // but I am not sure if this is really a good idea.
861 // IMO, all GSockets objects used in wxSocket should
863 // --------------------------------
866 GSocket_SetNonBlocking(m_socket
, TRUE
);
868 child_socket
= GSocket_WaitConnection(m_socket
);
871 GSocket_SetNonBlocking(m_socket
, FALSE
);
873 // GRG: this was not being handled!
874 if (child_socket
== NULL
)
877 sock
.m_type
= SOCK_INTERNAL
;
878 sock
.m_socket
= child_socket
;
879 sock
.m_connected
= TRUE
;
884 wxSocketBase
*wxSocketServer::Accept(bool wait
)
886 wxSocketBase
* sock
= new wxSocketBase();
888 sock
->SetFlags((wxSockFlags
)m_flags
);
890 if (!AcceptWith(*sock
, wait
))
896 bool wxSocketServer::WaitOnAccept(long seconds
, long milliseconds
)
898 // TODO: return immediately if there is already a pending connection.
900 return _Wait(seconds
, milliseconds
, GSOCK_CONNECTION_FLAG
| GSOCK_LOST_FLAG
);
903 // --------------------------------------------------------------
905 // --------------------------------------------------------------
907 // --------- wxSocketClient CONSTRUCTOR -------------------------
908 // --------------------------------------------------------------
909 wxSocketClient::wxSocketClient(wxSockFlags _flags
) :
910 wxSocketBase(_flags
, SOCK_CLIENT
)
912 m_establishing
= FALSE
;
915 // --------------------------------------------------------------
916 // --------- wxSocketClient DESTRUCTOR --------------------------
917 // --------------------------------------------------------------
918 wxSocketClient::~wxSocketClient()
922 // --------------------------------------------------------------
923 // --------- wxSocketClient Connect functions -------------------
924 // --------------------------------------------------------------
925 bool wxSocketClient::Connect(wxSockAddress
& addr_man
, bool wait
)
932 // This should never happen.
934 GSocket_destroy(m_socket
);
936 // Initializes all socket stuff ...
937 // --------------------------------
938 m_socket
= GSocket_new();
940 m_establishing
= FALSE
;
945 // Update the flags of m_socket and enable BG events
949 // GRG: If wait == FALSE, then set the socket to
950 // nonblocking. I will set it back to blocking later,
951 // but I am not sure if this is really a good idea.
952 // IMO, all GSockets objects used in wxSocket should
954 // --------------------------------
956 GSocket_SetNonBlocking(m_socket
, TRUE
);
958 GSocket_SetPeer(m_socket
, addr_man
.GetAddress());
959 err
= GSocket_Connect(m_socket
, GSOCK_STREAMED
);
962 GSocket_SetNonBlocking(m_socket
, FALSE
);
964 if (err
== GSOCK_WOULDBLOCK
)
965 m_establishing
= TRUE
;
967 if (err
!= GSOCK_NOERROR
)
974 bool wxSocketClient::WaitOnConnect(long seconds
, long milliseconds
)
982 // There is no connection in progress
986 ret
= _Wait(seconds
, milliseconds
, GSOCK_CONNECTION_FLAG
| GSOCK_LOST_FLAG
);
990 if (m_establishing
) // it wasn't GSOCK_LOST
993 m_establishing
= FALSE
;
999 void wxSocketClient::OnRequest(wxSocketNotify evt
)
1001 if ((GSocketEvent
)evt
== GSOCK_CONNECTION
)
1005 m_neededreq
&= ~GSOCK_CONNECTION_FLAG
;
1011 wxSocketBase::OnRequest(evt
);
1014 // --------------------------------------------------------------
1016 // --------------------------------------------------------------
1018 wxSocketEvent::wxSocketEvent(int id
)
1021 wxEventType type
= (wxEventType
)wxEVT_SOCKET
;
1026 void wxSocketEvent::CopyObject(wxObject
& obj_d
) const
1028 wxSocketEvent
*event
= (wxSocketEvent
*)&obj_d
;
1030 wxEvent::CopyObject(obj_d
);
1032 event
->m_skevt
= m_skevt
;
1033 event
->m_socket
= m_socket
;
1036 // --------------------------------------------------------------------------
1038 // --------------------------------------------------------------------------
1039 class WXDLLEXPORT wxSocketModule
: public wxModule
{
1040 DECLARE_DYNAMIC_CLASS(wxSocketModule
)
1043 return GSocket_Init();
1050 IMPLEMENT_DYNAMIC_CLASS(wxSocketModule
, wxModule
)