/* Copyright (C) 2010 Jonathon Jongsma
 *
 * This library 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 2.1 of the License, or (at your option) any later version.
 *
 * This library 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 this library.  If not, see <http://www.gnu.org/licenses/>.
 */

#include <giomm/socketlistener.h>

_DEFS(giomm,gio)
_PINCLUDE(giomm/private/socketlistener_p.h)

namespace Gio
{

/** Make it easy to implement a network service.
 *
 * @see ThreadedSocketService, SocketListener.
 *
 * A %SocketService is an object that represents a service that is
 * provided to the network or over local sockets.  When a new
 * connection is made to the service signal_incoming() is emitted.
 *
 * A %SocketService is a subclass of SocketListener and you need
 * to add the addresses you want to accept connections on with the
 * SocketListener APIs.
 *
 * There are two options for implementing a network service based on
 * %SocketService. The first is to create the service using
 * create() and to connect to signal_incoming().
 * The second is to subclass %SocketService and override the
 * default signal handler implementation, on_incoming().
 *
 * In either case, the handler must immediately return, or else it
 * will block additional incoming connections from being serviced.
 * If you are interested in writing connection handlers that contain
 * blocking code then see ThreadedSocketService.
 *
 * The socket service runs on the main loop of the thread-default context
 * of the thread it is created in, and is not
 * threadsafe in general. However, the calls to start and stop
 * the service are threadsafe so these can be used from threads that
 * handle incoming clients.
 *
 * @newin{2,24}
 * @ingroup NetworkIO
 */
class GIOMM_API SocketService : public Gio::SocketListener
{
  _CLASS_GOBJECT(SocketService, GSocketService, G_SOCKET_SERVICE, Gio::SocketListener, GSocketListener, , , GIOMM_API)

protected:
  _CTOR_DEFAULT

public:
  _WRAP_CREATE()
  _WRAP_METHOD(void start(), g_socket_service_start)
  _WRAP_METHOD(void stop(), g_socket_service_stop)
  _WRAP_METHOD(bool is_active(), g_socket_service_is_active)

#m4 _CONVERSION(`GObject*',`const Glib::RefPtr<Glib::Object>&',`Glib::wrap($3, true)')
#m4 _CONVERSION(`GSocketConnection*',`const Glib::RefPtr<SocketConnection>&',`Glib::wrap($3, true)')
  _WRAP_SIGNAL(bool incoming(const Glib::RefPtr<SocketConnection>& connection, const Glib::RefPtr<Glib::Object>& source_object), "incoming")

  _WRAP_PROPERTY("active", bool, newin "2,46")
};

} // namespace Gio
