// -*- Mode: C++; indent-tabs-mode: nil; c-basic-offset: 2 -*-

/* 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, write to the Free
 * Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
 */

#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 the SocketService:incoming
 * signal is emitted.
 *
 * A SocketService is a subclass of SocketListener and you need
 * to add the addresses you want to accept connections on to the
 * with the SocketListener APIs.
 *
 * There are two options for implementing a network service based on
 * SocketService. The first is to create the service using
 * g_socket_service_new() and to connect to the SocketService:incoming
 * signal. The second is to subclass SocketService and override the
 * default signal handler implementation.
 *
 * 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 in the main thread, 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 SocketService : public Gio::SocketListener
{
    _CLASS_GOBJECT(SocketService, GSocketService, G_SOCKET_SERVICE, Gio::SocketListener, GSocketListener)

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)

    _WRAP_SIGNAL(bool incoming(const Glib::RefPtr<SocketConnection>& connection, const Glib::RefPtr<Glib::Object>& source_object), "incoming")
};

} // namespace Gio
