/* Generated automatically by jlpp - do not edit. */ #include static jakelib::lang::String* jakelib2_strings[] = {null}; // "Socket error while reading - " static jchar chars_jakelib2_str_0[] = {83,111,99,107,101,116,32,101,114,114,111,114,32,119,104,105,108,101,32,114,101,97,100,105,110,103,32,45,32}; #line 1 "net/SocketInputStream.jlc" // -*- 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: SocketInputStream.jlc,v 1.8 2003/09/27 08:10:28 florian Exp $ */ #include "jakelib2.h" #include "jakelib2/net/SocketInputStream.h" #include "jakelib2/net/Socket.h" #include "jakelib2/lang/System.h" #ifdef WIN32 # include #else # include # include # include # include #endif #include using namespace jakelib::net; using namespace jakelib::io; using namespace jakelib::lang; JAKELIB_IMPLEMENT_CLASS("jakelib.net.SocketInputStream", SocketInputStream, InputStream); #ifdef HAVE_ERRNO_H #include #endif /*****************************************************************************\ * SocketInputStream | *****************************************************************************/ SocketInputStream::SocketInputStream(JL2_SOCKET sock) { contentLength = -1; this->sock = sock; } SocketInputStream::~SocketInputStream() { close(); } /*****************************************************************************\ * read | *****************************************************************************/ int SocketInputStream::read() { jbyte b; long r; if (contentLength == 0) { return -1; } else { r = read(&b, 0, 1); if (r == 1) { if (contentLength != -1) contentLength --; return b & 0xff; } else if (r == 0) { return -2; } else { return -1; } } } /*****************************************************************************\ * read | *****************************************************************************/ int SocketInputStream::read(jbyte* b, int offset, int len) { int r; int readMax = len; if (b == null) throw new NullPointerException(); else if (len < 0 || offset < 0) throw new IndexOutOfBoundsException(); else if (len == 0) return 0; if (contentLength != -1 && readMax > contentLength) readMax = contentLength; if ((r = recv(sock, (char*) &b[offset], readMax, 0)) < 0) { #if defined(JAKELIB_WIN32API) if (r == SOCKET_ERROR) { if (Socket::getLastError() == WSAEWOULDBLOCK) { return 0; } } #else if (errno == EAGAIN || errno == ENOENT) { return 0; } #endif else { throw new IOException(JAKELIB_ONDEMAND(jakelib2_strings[0], new jakelib::lang::String(chars_jakelib2_str_0, 0, 29)) ->plus( System::explainErrorCode(Socket::getLastError()) )->plus( JAKELIB_AT2("jakelib.net.SocketInputStream.read"))); } } if (contentLength != -1) contentLength -= r; return r; } /*****************************************************************************\ * close | *****************************************************************************/ void SocketInputStream::close() { } /*****************************************************************************\ * reset | *****************************************************************************/ void SocketInputStream::reset() { } void SocketInputStream::setContentLength(int length) { contentLength = length; } /*****************************************************************************\ * setBlocking | *****************************************************************************/ void SocketInputStream::setBlocking(jboolean on) { #if defined(JAKELIB_WIN32API) u_long nonblocking = (on ? 0 : 1); if (ioctlsocket(sock, FIONBIO, &nonblocking)) { throw new IOException(System::explainErrorCode(Socket::getLastError()) ->plus( JAKELIB_AT2("jakelib.net.SocketInputStream.setBlocking"))); } #else if (fcntl(sock, F_SETFL, (on ? 0 : O_NONBLOCK)) == -1) { throw new IOException(System::explainErrorCode(Socket::getLastError()) ->plus( JAKELIB_AT2("jakelib.net.SocketInputStream.setBlocking"))); } #endif }