jprocessoutputstream.cpp 3.19 KB
/***************************************************************************
 *   Copyright (C) 2005 by Jeff Ferr                                       *
 *   root@sat                                                              *
 *                                                                         *
 *   This program is free software; you can redistribute it and/or modify  *
 *   it under the terms of the GNU General Public License as published by  *
 *   the Free Software Foundation; either version 2 of the License, or     *
 *   (at your option) any later version.                                   *
 *                                                                         *
 *   This program 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 General Public License for more details.                          *
 *                                                                         *
 *   You should have received a copy of the GNU General Public License     *
 *   along with this program; if not, write to the                         *
 *   Free Software Foundation, Inc.,                                       *
 *   59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.             *
 ***************************************************************************/
#include "Stdafx.h"
#include "jprocessoutputstream.h"

using namespace std;

namespace jshared {

#ifdef _WIN32
ProcessOutputStream::ProcessOutputStream(HANDLE fd):
#else
ProcessOutputStream::ProcessOutputStream(int fd):
#endif
	jcommon::Object()
{
	jcommon::Object::SetClassName("jshared::ProcessOutputStream");

	_fd = fd;
}

ProcessOutputStream::~ProcessOutputStream()
{
}

bool ProcessOutputStream::IsEmpty()
{
	return false;
}

int64_t ProcessOutputStream::Available()
{
	return 0LL;
}

int64_t ProcessOutputStream::GetSize()
{
	return 0LL;
}

int64_t ProcessOutputStream::Write(int64_t b)
{
	char byte = (char)b;

	return Write((const char *)&byte, 1LL);
}

int64_t ProcessOutputStream::Write(const char *data, int64_t size)
{
#ifdef _WIN32
	DWORD n;
	
	if (WriteFile(_fd, data, size, &n, NULL) == TRUE) {
		return (int64_t)n;
	}

	return -1LL;
#else
	if (IsBlocking() == true) {
		int64_t n = 0LL;

		if ((n = ::write(_fd, data, size)) > 0) {
			// fsync(_fd);
		}

		return n;
	} else {
		struct timeval waittime;
		fd_set writefs;

		FD_ZERO(&writefs);
		FD_SET(_fd, &writefs);

		waittime.tv_sec = 1L;	// TODO:: usuario especifica ou use pool
		waittime.tv_usec = 0L;

		if (select(_fd+1, NULL, &writefs, NULL, &waittime) < 0) {
			return -1LL;
		}

		int64_t n = 0LL;

		if (FD_ISSET(_fd, &writefs)) {
			if ((n = ::write(_fd, data, size)) > 0) {
				fsync(_fd);
			}
		}

		return n;
	}
#endif
}

int64_t ProcessOutputStream::Write(std::string)
{
	return 0LL;
}

int64_t ProcessOutputStream::Flush()
{
	return 0LL;
}

void ProcessOutputStream::Seek(int64_t index)
{
}

void ProcessOutputStream::Close()
{
#ifdef _WIN32
	CloseHandle(_fd);
#else
	::close(_fd);
#endif
}

bool ProcessOutputStream::IsClosed()
{
	return false;
}

int64_t ProcessOutputStream::GetSentBytes()
{
	return 0LL;
}

}