]> git.saurik.com Git - wxWidgets.git/blobdiff - include/wx/socket.h
support SDK < 10.6, fixes #14902
[wxWidgets.git] / include / wx / socket.h
index d7dca131b48bc9632949498a95e66ab2499004eb..93b39325da264f0a3775170df780a1fd95e6e77c 100644 (file)
@@ -1,5 +1,5 @@
 /////////////////////////////////////////////////////////////////////////////
 /////////////////////////////////////////////////////////////////////////////
-// Name:        socket.h
+// Name:        wx/socket.h
 // Purpose:     Socket handling classes
 // Authors:     Guilhem Lavaux, Guillermo Rodriguez Garcia
 // Modified by:
 // Purpose:     Socket handling classes
 // Authors:     Guilhem Lavaux, Guillermo Rodriguez Garcia
 // Modified by:
@@ -71,13 +71,17 @@ enum wxSocketError
 // socket options/flags bit masks
 enum
 {
 // socket options/flags bit masks
 enum
 {
-    wxSOCKET_NONE = 0,
-    wxSOCKET_NOWAIT = 1,
-    wxSOCKET_WAITALL = 2,
-    wxSOCKET_BLOCK = 4,
-    wxSOCKET_REUSEADDR = 8,
-    wxSOCKET_BROADCAST = 16,
-    wxSOCKET_NOBIND = 32
+    wxSOCKET_NONE           = 0x0000,
+    wxSOCKET_NOWAIT_READ    = 0x0001,
+    wxSOCKET_NOWAIT_WRITE   = 0x0002,
+    wxSOCKET_NOWAIT         = wxSOCKET_NOWAIT_READ | wxSOCKET_NOWAIT_WRITE,
+    wxSOCKET_WAITALL_READ   = 0x0004,
+    wxSOCKET_WAITALL_WRITE  = 0x0008,
+    wxSOCKET_WAITALL        = wxSOCKET_WAITALL_READ | wxSOCKET_WAITALL_WRITE,
+    wxSOCKET_BLOCK          = 0x0010,
+    wxSOCKET_REUSEADDR      = 0x0020,
+    wxSOCKET_BROADCAST      = 0x0040,
+    wxSOCKET_NOBIND         = 0x0080
 };
 
 typedef int wxSocketFlags;
 };
 
 typedef int wxSocketFlags;
@@ -123,6 +127,8 @@ public:
     bool IsData() { return WaitForRead(0, 0); }
     bool IsDisconnected() const { return !IsConnected(); }
     wxUint32 LastCount() const { return m_lcount; }
     bool IsData() { return WaitForRead(0, 0); }
     bool IsDisconnected() const { return !IsConnected(); }
     wxUint32 LastCount() const { return m_lcount; }
+    wxUint32 LastReadCount() const { return m_lcount_read; }
+    wxUint32 LastWriteCount() const { return m_lcount_write; }
     wxSocketError LastError() const;
     void SaveState();
     void RestoreState();
     wxSocketError LastError() const;
     void SaveState();
     void RestoreState();
@@ -171,6 +177,8 @@ public:
     bool GetOption(int level, int optname, void *optval, int *optlen);
     bool SetOption(int level, int optname, const void *optval, int optlen);
     wxUint32 GetLastIOSize() const { return m_lcount; }
     bool GetOption(int level, int optname, void *optval, int *optlen);
     bool SetOption(int level, int optname, const void *optval, int optlen);
     wxUint32 GetLastIOSize() const { return m_lcount; }
+    wxUint32 GetLastIOReadSize() const { return m_lcount_read; }
+    wxUint32 GetLastIOWriteSize() const { return m_lcount_write; }
 
     // event handling
     void *GetClientData() const { return m_clientData; }
 
     // event handling
     void *GetClientData() const { return m_clientData; }
@@ -179,11 +187,21 @@ public:
     void SetNotify(wxSocketEventFlags flags);
     void Notify(bool notify);
 
     void SetNotify(wxSocketEventFlags flags);
     void Notify(bool notify);
 
-    // initialize/shutdown the sockets (usually called automatically)
-    static bool IsInitialized();
+    // initialize/shutdown the sockets (done automatically so there is no need
+    // to call these functions usually)
+    //
+    // should always be called from the main thread only so one of the cases
+    // where they should indeed be called explicitly is when the first wxSocket
+    // object in the application is created in a different thread
     static bool Initialize();
     static void Shutdown();
 
     static bool Initialize();
     static void Shutdown();
 
+    // check if wxSocket had been already initialized
+    //
+    // notice that this function should be only called from the main thread as
+    // otherwise it is inherently unsafe because Initialize/Shutdown() may be
+    // called concurrently with it in the main thread
+    static bool IsInitialized();
 
     // Implementation from now on
     // --------------------------
 
     // Implementation from now on
     // --------------------------
@@ -244,6 +262,8 @@ private:
     bool          m_writing;          // busy writing?
     bool          m_closed;           // was the other end closed?
     wxUint32      m_lcount;           // last IO transaction size
     bool          m_writing;          // busy writing?
     bool          m_closed;           // was the other end closed?
     wxUint32      m_lcount;           // last IO transaction size
+    wxUint32      m_lcount_read;      // last IO transaction size of Read() direction.
+    wxUint32      m_lcount_write;     // last IO transaction size of Write() direction.
     unsigned long m_timeout;          // IO timeout value in seconds
                                       // (TODO: remove, wxSocketImpl has it too)
     wxList        m_states;           // stack of states (TODO: remove!)
     unsigned long m_timeout;          // IO timeout value in seconds
                                       // (TODO: remove, wxSocketImpl has it too)
     wxList        m_states;           // stack of states (TODO: remove!)
@@ -264,14 +284,11 @@ private:
     wxSocketEventFlags  m_eventmask;  // which events to notify?
     wxSocketEventFlags  m_eventsgot;  // collects events received in OnRequest()
 
     wxSocketEventFlags  m_eventmask;  // which events to notify?
     wxSocketEventFlags  m_eventsgot;  // collects events received in OnRequest()
 
-    // the initialization count, wxSocket is initialized if > 0
-    static size_t m_countInit;
-
 
     friend class wxSocketReadGuard;
     friend class wxSocketWriteGuard;
 
 
     friend class wxSocketReadGuard;
     friend class wxSocketWriteGuard;
 
-    DECLARE_NO_COPY_CLASS(wxSocketBase)
+    wxDECLARE_NO_COPY_CLASS(wxSocketBase);
     DECLARE_CLASS(wxSocketBase)
 };
 
     DECLARE_CLASS(wxSocketBase)
 };
 
@@ -291,7 +308,7 @@ public:
 
     bool WaitForAccept(long seconds = -1, long milliseconds = 0);
 
 
     bool WaitForAccept(long seconds = -1, long milliseconds = 0);
 
-    DECLARE_NO_COPY_CLASS(wxSocketServer)
+    wxDECLARE_NO_COPY_CLASS(wxSocketServer);
     DECLARE_CLASS(wxSocketServer)
 };
 
     DECLARE_CLASS(wxSocketServer)
 };
 
@@ -330,7 +347,7 @@ private:
     int m_initialRecvBufferSize;
     int m_initialSendBufferSize;
 
     int m_initialRecvBufferSize;
     int m_initialSendBufferSize;
 
-    DECLARE_NO_COPY_CLASS(wxSocketClient)
+    wxDECLARE_NO_COPY_CLASS(wxSocketClient);
     DECLARE_CLASS(wxSocketClient)
 };
 
     DECLARE_CLASS(wxSocketClient)
 };
 
@@ -359,7 +376,7 @@ public:
      */
 
 private:
      */
 
 private:
-    DECLARE_NO_COPY_CLASS(wxDatagramSocket)
+    wxDECLARE_NO_COPY_CLASS(wxDatagramSocket);
     DECLARE_CLASS(wxDatagramSocket)
 };
 
     DECLARE_CLASS(wxDatagramSocket)
 };