/* 
**  Virtual I/O library
**  Written by Andrei Errapart <andreie@no.spam.ee>
*/

/*
 * Concrete Vio around socket. Doesn't differ much from VioFd.
 */

#ifdef WIN32
	typedef	SOCKET	vio_socket;
#else
	typedef int	vio_socket;
#endif /* WIN32 */

VIO_NS_BEGIN

class VioSSL;
class VioSocket : public Vio
{
public:
  VioSocket(vio_socket sd, bool	localhost=true);
  virtual ~VioSocket();
  virtual bool		is_open() const;
  virtual int		read(vio_ptr		buf,	int	size);
  virtual int		write(const vio_ptr		buf,	int	size);
  virtual int		blocking(bool    onoff);
  virtual bool		blocking() const;
  virtual int		fastsend(bool	onoff=true);
  virtual int		keepalive(bool	onoff);
  virtual bool		should_retry() const;
  virtual int		close();
  virtual const char*	description() const;
  virtual bool		peer_addr(char *buf) const;
  virtual const char*	cipher_description() const;
  virtual int 		vio_errno();
  int			shutdown(int how);

private:
  vio_socket			sd_;
  const bool			localhost_;
  int				fcntl_;
  bool				fcntl_set_;
  char				desc_[30];
  mutable struct sockaddr_in	local_;
  mutable struct sockaddr_in	remote_;
  mutable char*			cipher_description_;

  friend class VioSSL;	// he wants to tinker with this->sd_;
};

VIO_NS_END

#endif /* vio_VioSocket_h_ */