//----------------------------------------------------------------------------
// ObjectWindows
// Copyright (c) 1995, 1996 by Borland International, All Rights Reserved
//
/// \file
/// Winsock for OWL subsystem.
/// Based on work by Paul Pedriana, 70541.3223@compuserve.com
//----------------------------------------------------------------------------
 
#if !defined(OWL_WSKSOCK_H)
#define OWL_WSKSOCK_H
 
#include <owl/private/defs.h>
#if defined(BI_HAS_PRAGMA_ONCE)
# pragma once
#endif
 
#include <owl/window.h>
#include <owl/wskaddr.h>
 
 
namespace owl {
 
#define WINSOCK_NOERROR (int)0
#define WINSOCK_ERROR   (int)SOCKET_ERROR
 
#define N_DEF_MAX_READ_BUFFFER_SIZE 8192
 
//
//
//
#define MSG_SOCKET_NOTIFY ((UINT)(WM_USER+301))    ///< User-defined message used for socked notifications
#define FD_ALL            (FD_READ|FD_WRITE|FD_OOB|FD_ACCEPT|FD_CONNECT|FD_CLOSE)
#define FD_NONE           (0)
 
//
/// Enumeration describing the type of event notifications you want to
/// receive for a given socket.
//
enum TNotificationSet {
  NotifyNone    = 0x00,   ///< No notifications
  NotifyRead    = 0x01,   ///< Notification of readiness for reading
  NotifyWrite   = 0x02,   ///< Notification of readiness for writing
  NotifyOOB     = 0x04,   ///< Notification of the arrival of out-of-band data
  NotifyAccept  = 0x08,   ///< Notification of incoming connections
  NotifyConnect = 0x10,   ///< Notification of completed connection
  NotifyClose   = 0x20,   ///< Notification of socket closure
  NotifyAll     = 0x3F    ///< All notifications
};
 
//
// Forward ref.
//
class _OWLCLASS TSocket;
 
/// \cond NoSuppressDoxygenWarning
#include <owl/preclass.h>
/// \endcond
 
//
/// \class TSocketWindow
// ~~~~~ ~~~~~~~~~~~~~
/// Derived from TWindow, a private window used to catch notification messages.
//
class _OWLCLASS TSocketWindow : public TWindow {
  public:
    TSocketWindow(TSocket* socketParent);
    TSocketWindow& operator =(TSocketWindow& src); // !CQ const?
 
    void SetNotificationSet(int notificationSet);
    void SetNotificationWindow(TWindow* windowNotification);
 
    int  GetLastError();
    int  StartAcceptNotification();
    int  StartRegularNotification();
    int  StartCustomNotification(int selectOptions);
    int  CancelNotification();
 
    TSocket* GetSocketParent() const;
    void SetSocketParent(TSocket* socket);
 
  public_data:
    static uint  MsgSocketNotification; ///< Message used to notify hwndNotification, if hwndNotification is used.
    TSocket*     SocketParent;          ///< Exported so Parent can have easy access to it.
 
  protected:
    int           SelectOptions;      ///< We need to keep our own copy of this so we can do an assignment operator.
    TWindow*      WindowNotification; ///< A second window that can be notified instead of the Socket.
    int           NotificationSet;    ///< Types of notification to respond to
    int           LastError;          ///< Last error
 
    TResult DoNotification(TParam1, TParam2);
 
  DECLARE_RESPONSE_TABLE(TSocketWindow);
};
 
//
/// \class TSocket
// ~~~~~ ~~~~~~~
/// TSocket encapsulates the basic attributes of a socket. A socket is an endpoint
/// of communication to which a name may be bound. Each socket in use has a type and
/// an associated process.
//
class _OWLCLASS TSocket {
  public:
    /// How to shutdown the socket.
    //
    enum TShutMode {
      ShutModeNoRecv = 0,        ///< No more receives on the socket.
      ShutModeNoSend = 1,        ///< No more sends on the socket.
      ShutModeNoRecvSend = 2     ///< No more sends or receives.
    };
 
    TSocket();
    TSocket(SOCKET& newS);
    TSocket(TSocketAddress& newSocketAddress, int nNewFamily = PF_INET,
            int nNewType = SOCK_STREAM, int nNewProtocol = 0);
    virtual ~TSocket();
 
    operator SOCKET() const;
    virtual int CloseSocket();
    virtual int ShutDownSocket(TShutMode shutMode = ShutModeNoRecvSend);
 
    TSocket& operator =(TSocket& newSocket);
    friend bool operator ==(const TSocket& socket1, const TSocket& socket2);
 
    // Commands
    //
    virtual void SetNotificationSet(int notificationSet);
    virtual void SetNotificationWindow(TWindow* windowNotification);
    virtual int  CreateSocket();
    /// binds to a given address
    //
    virtual int  BindSocket(const TSocketAddress& addressToBindTo);
 
    /// binds to our address
    //
    virtual int  BindSocket();
    virtual void SetMyAddress(TSocketAddress& newSocketAddress);
    virtual void SetPeerSocketAddress(TSocketAddress& newPeerSocketAddress);
    virtual void SetSocketStyle(int nNewFamily = PF_INET,
                                int nNewType = SOCK_STREAM,
                                int nNewProtocol = 0);
    virtual int StartAcceptNotification();
    virtual int StartRegularNotification();
    virtual int StartCustomNotification(int nSelectionOptions);
    virtual int CancelNotification();
 
    // Tells class Sockete not to close the socket on deletion.
    bool    SetSaveSocketOnDelete(bool saveSocket = true);
 
    virtual int  ConvertProtocol(char* protocol);
 
    // Info
    //
    int GetLastError();
    virtual ulong GetDriverWaitingSize();
    virtual ulong GetTotalWaitingSize();
    virtual int GetMyAddress(  TSocketAddress& socketAddress,
                              int& nAddressLength, SOCKET& socket);
    virtual int GetMyAddress(  TSocketAddress& socketAddress,
                              int& nAddressLength);
    virtual int GetPeerAddress(  TSocketAddress& socketAddress,
                                int& nAddressLength, SOCKET& socket);
    virtual int GetPeerAddress(  TSocketAddress& socketAddress,
                                int& nAddressLength);
 
    // Read/Write (Send/Receive)
    //
    virtual void SetMaxReadBufferSize(int nNewMaxReadBufferSize);
 
    // Options
    //
    int SetBroadcastOption(bool bBroadcast);
    int SetDebugOption(bool bDebug);
    int SetLingerOption(bool bLinger, ushort nLingerTime=0);
    int SetRouteOption(bool bRoute);
    int SetKeepAliveOption(bool bKeepAlive);
    int SetOOBOption(bool bSendOOBDataInline);
    int SetReceiveBufferOption(int nReceiveBufferSize);
    int SetSendBufferOption(int nSendBufferSize);
    int SetReuseAddressOption(bool bAllowReuseAddress);
 
    int GetBroadcastOption(bool& bBroadcast);
    int GetDebugOption(bool& bDebug);
    int GetLingerOption(bool& bLinger, ushort& nLingerTime);
    int GetRouteOption(bool& bRoute);
    int GetKeepAliveOption(bool& bKeepAlive);
    int GetOOBOption(bool& bSendOOBDataInline);
    int GetReceiveBufferOption(int& nReceiveBufferSize);
    int GetSendBufferOption(int& nSendBufferSize);
    int GetReuseAddressOption(bool& bAllowReuseAddress);
 
  public_data:
    SOCKET         Handle;             ///< The Socket handle
    bool           Bound;              ///< A flag that we can use to tell if
                                       ///< socket is bound or not.  It gets set
                                       ///< on automatically, but doesn't get
                                       ///< set off automatically.
    TSocketAddress SocketAddress;      ///< My address.
    TSocketAddress PeerSocketAddress;  ///< Address of Peer to communicate with.
                                       ///< Used for datagrams and connections.
 
  protected:
    int            Family;             ///< PF_INET, etc. (this is the protocol family)
    int            Type;               ///< SOCK_STREAM, etc.
    int            Protocol;           ///< IPPROTO_TCP, etc.
    int            LastError;          ///< Last Error.
    int            MaxReadBufferSize;  ///< Maximum buffer size
    short          SaveSocket;         ///< Save the socket on deletion?
    TSocketWindow  Window;             ///< Will receive internal notifications and pass them to this class.
    friend class   TSocketWindow;
 
    // Protected initialization
    //
    void Init();      // Sets up the friend window.
 
    int  SocketsCallCheck(int error);
 
    // Notification
    //
    virtual int DoReadNotification(const SOCKET& s, int nError);
    virtual int DoWriteNotification(const SOCKET& s, int nError);
    virtual int DoOOBNotification(const SOCKET& s, int nError);
    virtual int DoAcceptNotification(const SOCKET& s, int nError);
    virtual int DoConnectNotification(const SOCKET& s, int nError);
    virtual int DoCloseNotification(const SOCKET& s, int nError);
};
 
/// \cond NoSuppressDoxygenWarning
#include <owl/posclass.h>
/// \endcond
 
 
//----------------------------------------------------------------------------
// Inline implementations
//
 
//
/// Return the last error on the socket.
//
inline int
TSocketWindow::GetLastError()
{
  return LastError;
}
 
//
/// Return the set of notifications socket will catch.
//
inline void
TSocketWindow::SetNotificationSet(int notificationSet)
{
  NotificationSet = notificationSet;
}
 
//
/// Set the new notification window.
//
inline void
TSocketWindow::SetNotificationWindow(TWindow* windowNotification)
{
  WindowNotification = windowNotification;
}
 
inline TSocket* TSocketWindow::GetSocketParent() const
{
  return SocketParent;
}
 
inline void TSocketWindow::SetSocketParent(TSocket* socket)
{
  SocketParent = socket;
}
 
 
//
/// Assigns new set of notifications socket will catch.
//
inline void
TSocket::SetNotificationSet(int notificationSet)
{
  Window.SetNotificationSet(notificationSet);
}
 
//
/// Sets the new notification window.
//
inline void
TSocket::SetNotificationWindow(TWindow* windowNotification)
{
  Window.SetNotificationWindow(windowNotification);
}
 
//
/// Returns the handle of the socket.
//
inline
TSocket::operator SOCKET() const
{
  return Handle;
}
 
//
/// Saves the socket on deletion.
//
inline bool
TSocket::SetSaveSocketOnDelete(bool saveSocket)
{
  return (SaveSocket = saveSocket);
}
 
//
/// Returns the last error of the socket.
//
inline int
TSocket::GetLastError()
{
  return LastError;
}
 
} // OWL namespace
 
 
#endif  // OWL_WSKSOCK_H

V690 The 'TSocket' class implements the copy assignment operator, but lacks a copy constructor. It is dangerous to use such a class.