blob: 6169478c368aa28437efb31339e3a490b52817c6 [file] [log] [blame]
// Copyright (C) 2006-2010 David Sugar, Tycho Softworks.
//
// This file is part of GNU uCommon C++.
//
// GNU uCommon C++ is free software: you can redistribute it and/or modify
// it under the terms of the GNU Lesser General Public License as published
// by the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// GNU uCommon C++ is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU Lesser General Public License for more details.
//
// You should have received a copy of the GNU Lesser General Public License
// along with GNU uCommon C++. If not, see <http://www.gnu.org/licenses/>.
/**
* Classes which use the buffer protocol to stream data.
* @file ucommon/buffer.h
*/
#ifndef _UCOMMON_BUFFER_H_
#define _UCOMMON_BUFFER_H_
#ifndef _UCOMMON_CONFIG_H_
#include <ucommon/platform.h>
#endif
#ifndef _UCOMMON_PROTOCOLS_H_
#include <ucommon/protocols.h>
#endif
#ifndef _UCOMMON_SOCKET_H_
#include <ucommon/socket.h>
#endif
#ifndef _UCOMMON_STRING_H_
#include <ucommon/string.h>
#endif
#ifndef _UCOMMON_FSYS_H_
#include <ucommon/fsys.h>
#endif
#ifndef _UCOMMON_SHELL_H_
#include <ucommon/shell.h>
#endif
NAMESPACE_UCOMMON
/**
* A generic tcp socket class that offers i/o buffering. All user i/o
* operations are directly inherited from the IOBuffer base class public
* members. Some additional members are added for layering ssl services.
* @author David Sugar <dyfet@gnutelephony.org>
*/
class __EXPORT TCPBuffer : public BufferProtocol, protected Socket
{
protected:
void _buffer(size_t size);
virtual size_t _push(const char *address, size_t size);
virtual size_t _pull(char *address, size_t size);
int _err(void) const;
void _clear(void);
bool _blocking(void);
/**
* Get the low level socket object.
* @return socket we are using.
*/
inline socket_t getsocket(void) const
{return so;};
public:
/**
* Construct an unconnected tcp client and specify our service profile.
*/
TCPBuffer();
/**
* Construct a tcp server session from a listening socket.
* @param server socket we are created from.
* @param size of buffer and tcp fragments.
*/
TCPBuffer(const TCPServer *server, size_t size = 536);
/**
* Construct a tcp client session connected to a specific host uri.
* @param host and optional :port we are connecting to.
* @param service identifier of our client.
* @param size of buffer and tcp fragments.
*/
TCPBuffer(const char *host, const char *service, size_t size = 536);
/**
* Destroy the tcp socket and release all resources.
*/
virtual ~TCPBuffer();
/**
* Connect a tcp socket to a client from a listener. If the socket was
* already connected, it is automatically closed first.
* @param server we are connected from.
* @param size of buffer and tcp fragments.
*/
void open(const TCPServer *server, size_t size = 536);
/**
* Connect a tcp client session to a specific host uri. If the socket
* was already connected, it is automatically closed first.
* @param host we are connecting.
* @param service to connect to.
* @param size of buffer and tcp fragments.
*/
void open(const char *host, const char *service, size_t size = 536);
/**
* Close active connection.
*/
void close(void);
protected:
/**
* Check for pending tcp or ssl data.
* @return true if data pending.
*/
virtual bool _pending(void);
};
/**
* Convenience type for pure tcp sockets.
*/
typedef TCPBuffer tcp_t;
END_NAMESPACE
#endif