// -*- c++ -*- /* * Jakelib2 - General purpose C++ library * Copyright (C) 2001 Florian Wolff (florian@donuz.de) * * 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * * $Id: SocketOutputStream.jlc,v 1.4 2003/09/27 08:10:28 florian Exp $ */ #include "jakelib2.h" #include "jakelib2/net/SocketOutputStream.h" #include "jakelib2/net/Socket.h" #include "jakelib2/lang/System.h" #ifdef WIN32 # include #else # include # include # include # include # include # include # include # ifndef MSG_NOSIGNAL # define MSG_NOSIGNAL 0 # endif #endif using namespace jakelib::net; using namespace jakelib::io; using namespace jakelib::lang; JAKELIB_IMPLEMENT_CLASS("jakelib.net.SocketOutputStream", SocketOutputStream, OutputStream); /*****************************************************************************\ * SocketOutputStream | *****************************************************************************/ SocketOutputStream::SocketOutputStream(JL2_SOCKET sock) { this->sock = sock; } SocketOutputStream::~SocketOutputStream() { close(); } /*****************************************************************************\ * write | *****************************************************************************/ void SocketOutputStream::write(int b) { jbyte c = (char) b; write(&c, 0, 1); } /*****************************************************************************\ * write | *****************************************************************************/ void SocketOutputStream::write(jbyte* b, int offset, int len) { if (b == null) throw new NullPointerException(); else if (len < 0) throw new IndexOutOfBoundsException(); else if (len == 0) return; int sent; int totalSent = 0; do { #ifdef WIN32 if ((sent = send(sock, (char*) &b[offset + totalSent], len, 0)) < -1) { throw new IOException(`"Socket error while writing - "` .. System::explainErrorCode(Socket::getLastError()) .. JAKELIB_AT2("jakelib.net.SocketOutputStream.write")); } #else if ((sent = send(sock, (char*) &b[offset + totalSent], len, MSG_NOSIGNAL)) < -1) { throw new IOException(`"Socket error while writing - "` .. System::explainErrorCode(Socket::getLastError()) .. JAKELIB_AT2("jakelib.net.SocketOutputStream.write")); } #endif totalSent += sent; } while (totalSent < len); } /*****************************************************************************\ * close | *****************************************************************************/ void SocketOutputStream::close() { }