// -*- Mode: C++; indent-tabs-mode: nil; c-basic-offset: 2 -*- /* Copyright (C) 2007 The giomm Development Team * * 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 #include #include #include #include "slot_async.h" namespace Gio { Socket::Socket(SocketFamily family, SocketType type, SocketProtocol protocol, const Glib::RefPtr& cancellable) : _CONSTRUCT("family", int(family), "type", int(type), "protocol", int(protocol)) { init(cancellable); } Socket::Socket(int fd, const Glib::RefPtr& cancellable) : _CONSTRUCT("fd", fd) { init(cancellable); } // static Glib::RefPtr Socket::create(SocketFamily family, SocketType type, SocketProtocol protocol, const Glib::RefPtr& cancellable) { return Glib::RefPtr(new Socket(family, type, protocol, cancellable)); } // static Glib::RefPtr Socket::create_from_fd(int fd, const Glib::RefPtr& cancellable) { return Glib::RefPtr(new Socket(fd, cancellable)); } gssize Socket::receive_from(Glib::RefPtr& address, char* buffer, gsize size, const Glib::RefPtr& cancellable) { GError* gerror = nullptr; GSocketAddress* caddr = nullptr; auto retvalue = g_socket_receive_from(gobj(), &caddr, buffer, size, const_cast(Glib::unwrap(cancellable)), &(gerror)); if(gerror) ::Glib::Error::throw_exception(gerror); if (caddr) address = Glib::wrap (caddr); return retvalue; } gssize Socket::receive_from(Glib::RefPtr& address, char* buffer, gsize size) { GError* gerror = nullptr; GSocketAddress* caddr = nullptr; auto retvalue = g_socket_receive_from(gobj(), &caddr, buffer, size, 0, &(gerror)); if(gerror) ::Glib::Error::throw_exception(gerror); if (caddr) address = Glib::wrap (caddr); return retvalue; } gssize Socket::receive_with_blocking(gchar* buffer, gsize size, bool blocking, const Glib::RefPtr& cancellable) { GError* gerror = nullptr; const auto retvalue = g_socket_receive_with_blocking(gobj(), buffer, size, blocking, Glib::unwrap(cancellable), &(gerror)); if(gerror) ::Glib::Error::throw_exception(gerror); return retvalue; } gssize Socket::send_with_blocking(gchar* buffer, gsize size, bool blocking, const Glib::RefPtr& cancellable) { GError* gerror = nullptr; const auto retvalue = g_socket_send_with_blocking(gobj(), buffer, size, blocking, Glib::unwrap(cancellable), &(gerror)); if(gerror) ::Glib::Error::throw_exception(gerror); return retvalue; } Glib::RefPtr Socket::create_source(Glib::IOCondition condition, const Glib::RefPtr& cancellable) { // The corresponding unreference() takes place in the dtor // of the Glib::RefPtr object below. reference(); return SocketSource::create(Glib::RefPtr(this), condition, cancellable); } } // namespace Gio