2002-08-02 23:57:46 +04:00
|
|
|
/*
|
|
|
|
* synergy -- mouse and keyboard sharing utility
|
|
|
|
* Copyright (C) 2002 Chris Schoeneman
|
|
|
|
*
|
|
|
|
* This package is free software; you can redistribute it and/or
|
|
|
|
* modify it under the terms of the GNU General Public License
|
|
|
|
* found in the file COPYING that should have accompanied this file.
|
|
|
|
*
|
|
|
|
* This package 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.
|
|
|
|
*/
|
|
|
|
|
2001-10-06 18:13:28 +04:00
|
|
|
#include "CBufferedOutputStream.h"
|
2002-06-11 02:06:45 +04:00
|
|
|
#include "XIO.h"
|
2001-10-06 18:13:28 +04:00
|
|
|
#include "CLock.h"
|
|
|
|
#include "CMutex.h"
|
|
|
|
#include "CThread.h"
|
|
|
|
#include "IJob.h"
|
|
|
|
|
|
|
|
//
|
|
|
|
// CBufferedOutputStream
|
|
|
|
//
|
|
|
|
|
2002-07-28 21:25:13 +04:00
|
|
|
CBufferedOutputStream::CBufferedOutputStream(
|
|
|
|
CMutex* mutex, IJob* adoptedCloseCB) :
|
2002-06-11 02:06:45 +04:00
|
|
|
m_mutex(mutex),
|
2002-07-28 21:25:13 +04:00
|
|
|
m_closeCB(adoptedCloseCB),
|
2002-06-11 02:06:45 +04:00
|
|
|
m_empty(mutex, true),
|
|
|
|
m_closed(false)
|
2001-10-06 18:13:28 +04:00
|
|
|
{
|
|
|
|
assert(m_mutex != NULL);
|
|
|
|
}
|
|
|
|
|
|
|
|
CBufferedOutputStream::~CBufferedOutputStream()
|
|
|
|
{
|
|
|
|
delete m_closeCB;
|
|
|
|
}
|
|
|
|
|
2002-06-11 02:06:45 +04:00
|
|
|
const void*
|
2002-06-17 17:31:21 +04:00
|
|
|
CBufferedOutputStream::peek(UInt32 n)
|
2001-10-06 18:13:28 +04:00
|
|
|
{
|
|
|
|
return m_buffer.peek(n);
|
|
|
|
}
|
|
|
|
|
2002-06-11 02:06:45 +04:00
|
|
|
void
|
2002-06-17 17:31:21 +04:00
|
|
|
CBufferedOutputStream::pop(UInt32 n)
|
2001-10-06 18:13:28 +04:00
|
|
|
{
|
|
|
|
m_buffer.pop(n);
|
2002-06-03 02:57:50 +04:00
|
|
|
if (m_buffer.getSize() == 0) {
|
|
|
|
m_empty.broadcast();
|
|
|
|
}
|
2001-10-06 18:13:28 +04:00
|
|
|
}
|
|
|
|
|
2002-06-11 02:06:45 +04:00
|
|
|
UInt32
|
|
|
|
CBufferedOutputStream::getSize() const
|
2001-10-06 18:13:28 +04:00
|
|
|
{
|
|
|
|
return m_buffer.getSize();
|
|
|
|
}
|
|
|
|
|
2002-06-11 02:06:45 +04:00
|
|
|
void
|
|
|
|
CBufferedOutputStream::close()
|
2001-10-06 18:13:28 +04:00
|
|
|
{
|
|
|
|
CLock lock(m_mutex);
|
|
|
|
if (m_closed) {
|
|
|
|
throw XIOClosed();
|
|
|
|
}
|
|
|
|
|
|
|
|
m_closed = true;
|
2001-10-21 04:21:02 +04:00
|
|
|
m_buffer.pop(m_buffer.getSize());
|
2002-07-28 21:25:13 +04:00
|
|
|
if (m_closeCB != NULL) {
|
2001-10-06 18:13:28 +04:00
|
|
|
m_closeCB->run();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2002-06-11 02:06:45 +04:00
|
|
|
UInt32
|
2002-07-28 21:25:13 +04:00
|
|
|
CBufferedOutputStream::write(const void* buffer, UInt32 n)
|
2001-10-06 18:13:28 +04:00
|
|
|
{
|
|
|
|
CLock lock(m_mutex);
|
|
|
|
if (m_closed) {
|
|
|
|
throw XIOClosed();
|
|
|
|
}
|
|
|
|
|
2002-07-28 21:25:13 +04:00
|
|
|
m_buffer.write(buffer, n);
|
2001-10-06 18:13:28 +04:00
|
|
|
return n;
|
|
|
|
}
|
|
|
|
|
2002-06-11 02:06:45 +04:00
|
|
|
void
|
|
|
|
CBufferedOutputStream::flush()
|
2001-10-06 18:13:28 +04:00
|
|
|
{
|
|
|
|
// wait until all data is written
|
|
|
|
CLock lock(m_mutex);
|
2002-06-03 02:57:50 +04:00
|
|
|
while (m_buffer.getSize() > 0) {
|
|
|
|
m_empty.wait();
|
|
|
|
}
|
2001-10-06 18:13:28 +04:00
|
|
|
}
|