// -*- 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: PipeInputStream.jlc,v 1.9 2003/09/27 08:10:28 florian Exp $ */ #include "jakelib2.h" #include "jakelib2/lang/System.h" #include "jakelib2/io/PipeInputStream.h" #include using namespace jakelib::lang; using namespace jakelib::io; JAKELIB_IMPLEMENT_CLASS("jakelib.io.PipeInputStream", PipeInputStream, InputStream) #if !defined(JAKELIB_WIN32API) # include # include #endif #ifdef HAVE_ERRNO_H # include #endif /*****************************************************************************\ * PipeInputStream | *****************************************************************************/ #if defined(JAKELIB_WIN32API) PipeInputStream::PipeInputStream(HANDLE pipe) { this->pipe = pipe; } #else PipeInputStream::PipeInputStream(int pipe) { this->pipe = pipe; } #endif PipeInputStream::~PipeInputStream() { close(); } /*****************************************************************************\ * read | *****************************************************************************/ int PipeInputStream::read() { jbyte b; long r; r = read(&b, 0, 1); if (r == 1) { return b & 0xff; } else if (r == 0) { return -2; } else { return -1; } } /*****************************************************************************\ * read | *****************************************************************************/ int PipeInputStream::read(jbyte* b, int offset, int len) { if (b == null) throw new NullPointerException(); else if (len < 0 || offset < 0) throw new IndexOutOfBoundsException(); else if (len == 0) return 0; #if defined(JAKELIB_WIN32API) DWORD r; if (!ReadFile(pipe, &b[offset], len, &r, NULL)) { if (GetLastError() == ERROR_BROKEN_PIPE) { return -1; } else { throw new IOException(System::explainErrorCode(GetLastError()) .. JAKELIB_AT2("jakelib.io.PipeInputStream.read")); } } return r; #else int r; if ((r = ::read(pipe, (char*) &b[offset], len)) < 0) { if (errno == EAGAIN || errno == ENOENT || errno == EINTR) { return 0; } else { throw new IOException(System::explainErrorCode(errno) .. JAKELIB_AT2("jakelib.io.PipeInputStream.read")); } } if (r == 0) return -1; else return r; #endif } /*****************************************************************************\ * close | *****************************************************************************/ void PipeInputStream::close() { #if defined(JAKELIB_WIN32API) CloseHandle(pipe); #else ::close(pipe); #endif } /*****************************************************************************\ * reset | *****************************************************************************/ void PipeInputStream::reset() { } /*****************************************************************************\ * setBlocking | *****************************************************************************/ void PipeInputStream::setBlocking(jboolean on) { #if !defined(JAKELIB_WIN32API) if (fcntl(pipe, F_SETFL, O_NONBLOCK) == -1) { throw new IOException(System::explainErrorCode(errno) .. JAKELIB_AT2("jakelib.io.PipeInputStream.setBlocking")); } #else throw new UnsupportedOperationException(`"setBlocking is not yet supported under Win32API"` .. JAKELIB_AT2("jakelib.io.PipeInputStream.setBlocking")); #endif }