/* 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, see . */ #include #include #include #include #include using Type = Gio::Socket::Type; using Protocol = Gio::Socket::Protocol; namespace Gio { Socket::Socket(SocketFamily family, Type type, Protocol 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, Type type, Protocol protocol, const Glib::RefPtr& cancellable) { return Glib::make_refptr_for_instance(new Socket(family, type, protocol, cancellable)); } // static Glib::RefPtr Socket::create_from_fd(int fd, const Glib::RefPtr& cancellable) { return Glib::make_refptr_for_instance(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, nullptr, &(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) { return SocketSource::create(gobj(), condition, cancellable); } } // namespace Gio