* Committing new wxSocket core (socket.cpp sckint.cpp). It has to be improved ...

* Adding sckint.cpp to various makefiles.
* Fixes in threadpsx.cpp (Pause/Resume)
* Fixes in threaded event dispatching
* Added Clone() to wxObject
* Implemented Clone() in wxEvent and wxSocketEvent
* wxSocket sample save the data got from the URL in test.url (this will change)
* As I only tested wxSocket on Linux Redhat 5.2 I disabled it by default on
  Windows, Mac and Unix platforms.


git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@2289 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
Guilhem Lavaux
1999-04-26 18:16:56 +00:00
parent 6a3ab8b15a
commit a737331db6
26 changed files with 1013 additions and 1190 deletions

View File

@@ -290,6 +290,8 @@ public:
// exists only for optimization purposes
bool IsCommandEvent() const { return m_isCommandEvent; }
wxObject *Clone() const;
public:
bool m_skipped;
wxObject* m_eventObject;

View File

@@ -167,7 +167,7 @@
#define wxUSE_TOOLTIPS 1
// Define to use wxToolTip class and
// wxWindow::SetToolTip() method
#define wxUSE_SOCKETS 1
#define wxUSE_SOCKETS 0
// Set to 1 to use socket classes
/*

View File

@@ -192,6 +192,7 @@ class WXDLLEXPORT wxObject
virtual ~wxObject(void);
virtual wxClassInfo *GetClassInfo(void) const { return &sm_classwxObject; }
virtual wxObject *Clone(void) const;
bool IsKindOf(wxClassInfo *info) const;

144
include/wx/sckint.h Normal file
View File

@@ -0,0 +1,144 @@
/////////////////////////////////////////////////////////////////////////////
// Name: sckint.h
// Purpose: Socket internal classes
// Author: Guilhem Lavaux
// Modified by:
// Created: April 1999
// RCS-ID: $Id$
// Copyright: (c) Guilhem Lavaux
// Licence: wxWindows licence
/////////////////////////////////////////////////////////////////////////////
#ifndef _WX_NETWORK_SOCKET_INT_H
#define _WX_NETWORK_SOCKET_INT_H
#ifdef __GNUG__
#pragma interface
#endif
#if wxUSE_SOCKETS
#include <wx/object.h>
#include <wx/list.h>
#include <wx/socket.h>
#include <wx/thread.h>
// Socket state
class SocketState
{
public:
// TRUE if the background notifyier is on.
bool notify_state;
// Specifies which events we want to be notified.
wxSocketBase::wxRequestNotify evt_notify_state;
// Socket flags.
wxSocketBase::wxSockFlags socket_flags;
// Pointer to the C callback function.
wxSocketBase::wxSockCbk c_callback;
char *c_callback_data;
};
// Socket request
class SockRequest
{
public:
// Buffer where to get/put data.
char *buffer;
// Size of the buffer.
size_t size;
// Number of bytes really read/written.
size_t io_nbytes;
// Error.
unsigned int error;
// Type of the request.
wxSocketBase::wxRequestNotify type;
// Timeout (in milliseconds).
unsigned int timeout;
// TRUE if the buffer has been processed.
bool done;
// TRUE if we must wait for the request completion, in the other case an
// event will be sent to the main thread when the request is finished.
bool wait;
};
class wxSocketInternal;
class SocketWaiter: public wxThread {
public:
SocketWaiter(wxSocketBase *socket, wxSocketInternal *internal);
~SocketWaiter();
// Thread Entry point
// ---
virtual void *Entry();
protected:
void ProcessReadEvent();
void ProcessWriteEvent();
public:
wxSocketBase *m_socket;
wxSocketInternal *m_internal;
int m_fd;
};
class SocketRequester: public wxThread {
public:
SocketRequester(wxSocketBase *socket, wxSocketInternal *internal);
~SocketRequester();
void ProcessWaitEvent(SockRequest *req);
void ProcessReadEvent(SockRequest *req);
void ProcessWriteEvent(SockRequest *req);
bool WaitFor(wxSocketBase::wxRequestNotify req, int millisec);
// Thread Entry point
// ---
virtual void *Entry();
public:
wxSocketBase *m_socket;
wxSocketInternal *m_internal;
int m_fd;
};
class wxSocketInternal {
public:
wxSocketInternal(wxSocketBase *socket);
~wxSocketInternal();
// wxSocket thread manager
// -----------------------
void AcquireData();
void ReleaseData();
void AcquireFD();
void ReleaseFD();
int GetFD() { return m_fd; }
void InitializeSocket();
void FinalizeSocket();
void PauseSocket();
void ResumeSocket();
void EnableWaiter();
void DisableWaiter();
void QueueRequest(SockRequest *request, bool async);
void WaitForEnd(SockRequest *request);
SockRequest *WaitForReq();
void EndRequest(SockRequest *req);
public:
wxMutex m_socket_locker, m_fd_locker, m_request_locker;
wxCondition m_socket_cond;
wxSocketBase *m_socket;
SocketWaiter *m_thread_waiter;
SocketRequester *m_thread_requester;
wxList m_requests;
int m_fd;
};
#endif
// wxUSE_SOCKETS
#endif
// _WX_NETWORK_SOCKET_INT_H

View File

@@ -22,15 +22,6 @@
#if defined(__WINDOWS__) && defined(WXSOCK_INTERNAL)
#include <winsock.h>
#include <wx/msw/private.h>
struct wxSockInternal {
UINT my_msg;
};
struct wxSockHandlerInternal {
HWND sockWin;
UINT firstAvailableMsg;
};
#endif // defined(__WINDOWS__) && defined(WXSOCK_INTERNAL)
// ---------------------------------------------------------------------------
@@ -40,29 +31,6 @@ struct wxSockHandlerInternal {
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
// ---------------------------------------------------------------------------
// Athena specific
// ---------------------------------------------------------------------------
#if defined(__WXXT__) || defined(__WXMOTIF__)
#include <X11/Intrinsic.h>
struct wxSockInternal {
XtInputId sock_inputid, sock_outputid, sock_exceptid;
};
#endif
// ---------------------------------------------------------------------------
// GTK specific
// ---------------------------------------------------------------------------
#if defined(__WXGTK__)
#include <gdk/gdk.h>
struct wxSockInternal {
gint sock_inputid, sock_outputid, sock_exceptid;
};
#endif
#endif // defined(__UNIX__) && defined(WXSOCK_INTERNAL)
// ---------------------------------------------------------------------------
@@ -77,70 +45,46 @@ struct wxSockInternal {
class WXDLLEXPORT wxSocketEvent;
class WXDLLEXPORT wxSocketHandler;
class wxSocketInternal;
class WXDLLEXPORT wxSocketBase : public wxEvtHandler
{
DECLARE_CLASS(wxSocketBase)
#ifdef __WXMAC__
friend void wxMacSocketOnRequestProc(void *refcon , short event) ;
#endif
#if defined(__WXGTK__) && defined(WXSOCK_INTERNAL)
friend void wxPrereadSocket(wxSocketBase *sock);
#endif
public:
enum wxSockFlags { NONE=0, NOWAIT=1, WAITALL=2, SPEED=4 };
// Type of request
enum { REQ_READ=0x1, REQ_PEEK=0x2, REQ_WRITE=0x4, REQ_LOST=0x8,
REQ_ACCEPT=0x10, REQ_CONNECT=0x20};
REQ_ACCEPT=0x10, REQ_CONNECT=0x20, REQ_WAIT=0x40};
enum { EVT_READ=0, EVT_PEEK=1, EVT_WRITE=2, EVT_LOST=3, EVT_ACCEPT=4,
EVT_CONNECT=5 };
typedef int wxRequestNotify;
typedef int wxRequestEvent;
enum wxSockType { SOCK_CLIENT, SOCK_SERVER, SOCK_INTERNAL, SOCK_UNINIT };
typedef void (*wxSockCbk)(wxSocketBase& sock,wxRequestEvent evt,char *cdata);
protected:
wxList req_list[EVT_WRITE+1];
// Internal use for SaveState() and RestoreState()
class wxSockState : public wxObject {
public:
bool cbk_on;
wxSockCbk cbk;
char *cdata;
bool notif;
wxRequestNotify cbk_set;
wxSockFlags flags;
};
typedef struct {
char sig[4];
char len[4];
} SockMsg;
enum wxSockType { SOCK_CLIENT, SOCK_SERVER, SOCK_INTERNAL, SOCK_UNINIT };
wxSockFlags m_flags;
wxSockType m_type; // wxSocket type
bool m_connected, m_connecting; // State of the socket
int m_fd; // Socket file descriptors
int m_waitflags; // Wait flags
wxList m_states; // States list
wxSockCbk m_cbk; // C callback
char *m_cdata; // C callback data
int m_id; // Socket id (for event handler)
wxSocketHandler *m_handler; // the current socket handler
wxRequestNotify m_neededreq; // Specify which requet signals we need
bool m_cbkon;
char *m_unread; // The unread buf
size_t m_unrd_size; // The size of the unread buf
bool m_processing; // To prevent some endless loop
unsigned long m_timeout;
int m_wantbuf;
size_t m_lcount; // Last IO request size
int m_error; // Last IO error
bool m_notifyme;
struct wxSockInternal *m_internal; // System specific variables
wxSocketInternal *m_internal;
char *m_unread; // Pushback buffer
size_t m_unrd_size; // Pushback buffer size
wxSockCbk m_cbk;
char *m_cdata;
bool m_notify_state;
public:
wxSocketBase();
virtual ~wxSocketBase();
@@ -150,8 +94,6 @@ public:
wxSocketBase& Peek(char* buffer, size_t nbytes);
wxSocketBase& Read(char* buffer, size_t nbytes);
wxSocketBase& Write(const char *buffer, size_t nbytes);
wxSocketBase& WriteMsg(const char *buffer, size_t nbytes);
wxSocketBase& ReadMsg(char* buffer, size_t nbytes);
wxSocketBase& Unread(const char *buffer, size_t nbytes);
void Discard();
@@ -168,8 +110,10 @@ public:
bool IsData() const;
inline size_t LastCount() const { return m_lcount; }
inline int LastError() const { return m_error; }
inline wxSockType GetType() const { return m_type; }
void SetFlags(wxSockFlags _flags);
wxSockFlags GetFlags() const;
inline void SetTimeout(unsigned long sec) { m_timeout = sec; }
// seconds = -1 means infinite wait
@@ -213,6 +157,7 @@ public:
protected:
friend class wxSocketServer;
friend class wxSocketHandler;
friend class wxSocketInternal;
#ifdef __SALFORDC__
public:
@@ -230,10 +175,6 @@ protected:
inline virtual void SetHandler(wxSocketHandler *handler)
{ m_handler = handler; }
// Activate or disactivate callback
void SetupCallbacks();
void DestroyCallbacks();
// Pushback library
size_t GetPushback(char *buffer, size_t size, bool peek);
@@ -241,8 +182,6 @@ protected:
// ==> cause strange things :-)
void WantSpeedBuffer(char *buffer, size_t size, wxRequestEvent req);
void WantBuffer(char *buffer, size_t size, wxRequestEvent req);
virtual bool DoRequests(wxRequestEvent req);
};
////////////////////////////////////////////////////////////////////////
@@ -258,7 +197,6 @@ public:
wxSocketBase* Accept();
bool AcceptWith(wxSocketBase& sock);
virtual void OnRequest(wxRequestEvent flags);
};
////////////////////////////////////////////////////////////////////////
@@ -284,10 +222,6 @@ class WXDLLEXPORT wxSocketHandler : public wxObject
{
DECLARE_CLASS(wxSocketHandler)
protected:
#if defined(__WINDOWS__)
wxList *smsg_list;
struct wxSockHandlerInternal *internal;
#endif
wxList *socks;
public:
@@ -337,15 +271,17 @@ public:
wxSocketEvent(int id = 0);
wxSocketBase::wxRequestEvent SocketEvent() const { return m_skevt; }
wxSocketBase *Socket() const { return m_socket; }
wxObject *Clone() const;
public:
wxSocketBase::wxRequestEvent m_skevt;
wxSocketBase *m_socket;
};
typedef void (wxEvtHandler::*wxSocketEventFunction)(wxSocketEvent&);
#define wxEVT_SOCKET wxEVT_FIRST+301
#define EVT_SOCKET(id, func) { wxEVT_SOCKET, id, 0, \
#define EVT_SOCKET(id, func) { wxEVT_SOCKET, id, -1, \
(wxObjectEventFunction) (wxEventFunction) (wxSocketEventFunction) & func, \
(wxObject *) NULL },

View File

@@ -301,7 +301,7 @@ public:
// Returns true if the thread is running (not paused, not killed).
bool IsRunning() const;
// Returns true if the thread is suspended
bool IsPaused() const { return IsAlive() && !IsRunning(); }
bool IsPaused() const;
// called when the thread exits - in the context of this thread
//

View File

@@ -53,8 +53,8 @@ class wxFileOutputStream: public wxOutputStream {
virtual ~wxFileOutputStream();
// To solve an ambiguity on GCC
inline wxOutputStream& Write(const void *buffer, size_t size)
{ return wxOutputStream::Write(buffer, size); }
// inline wxOutputStream& Write(const void *buffer, size_t size)
// { return wxOutputStream::Write(buffer, size); }
void Sync();
size_t StreamSize() const;