You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
tdemultimedia/akode_artsplugin/arts_inputstream.h

153 lines
3.8 KiB

/* aKode: aRts InputStream
Copyright (C) 2004 Allan Sandfeld Jensen <kde@carewolf.com>
This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Library General Public
License as published by the Free Software Foundation; either
version 2 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
Library General Public License for more details.
You should have received a copy of the GNU Library General Public License
along with this library; see the file COPYING.LIB. If not, write to
the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
Boston, MA 02110-1301, USA.
*/
#ifndef _AKODE_ARTS_INPUTSTREAM_H
#define _AKODE_ARTS_INPUTSTREAM_H
extern "C" {
#include <stdio.h>
#include <fcntl.h>
}
#include <arts/dispatcher.h>
#include <akode/file.h>
#include <akode/bytebuffer.h>
class Arts_InputStream : public aKode::File
{
protected:
// m_instream is mutable because Arts::InputStream has not marked const functions
mutable Arts::InputStream m_instream;
aKode::ByteBuffer *m_buffer;
bool m_open, m_seekable;
long m_pos;
long m_len;
public:
Arts_InputStream(Arts::InputStream inputstream, aKode::ByteBuffer *buffer)
: File("arts_inputstream"),
m_instream(inputstream), m_buffer(buffer),
m_open(false), m_seekable(false),
m_pos(-1), m_len(-1)
{
m_instream.streamInit();
};
virtual ~Arts_InputStream() {
}
bool openRO() {
m_open = true;
m_pos = 0;
// Arts::Dispatcher::lock();
m_len = m_instream.size();
m_seekable = m_instream.seekOk();
m_instream.streamStart();
// Arts::Dispatcher::unlock();
return true;
}
void close() {
m_open = false;
m_instream.streamEnd();
}
long read(char* ptr, long num) {
if (!m_open) return -1;
if (num<=0) return 0;
long n = m_buffer->read(ptr,num,true);
m_pos += n;
return n;
}
long write(const char*, long) {
return -1;
}
ssize_t seek(long to, int whence) {
if(!m_open || !seekable()) return -1;
arts_debug("akode: InputStream seeking");
long newpos = 0;
switch (whence) {
case SEEK_SET:
newpos = to;
break;
case SEEK_CUR:
newpos = m_pos + to;
break;
case SEEK_END:
if (m_len < 0) return -1;
newpos = m_len + to;
break;
default:
return -1;
}
ssize_t s = m_instream.seek(newpos);
if (s >= 0) {
m_pos = s;
m_buffer->flush();
return s;
}
else
return -1;
}
long position() const {
if(!m_open) return -1;
return m_pos;
}
long length() const {
if(!m_open) return -1;
return m_len;
}
bool seekable() const {
return m_seekable;
}
bool readable() const {
return true;
}
bool writeable() const {
return false;
}
// Arts-call needs to be protected since
// the member-functions here are called by another thread
bool eof() const {
if(!m_open) return true;
bool res = false;
if (m_buffer->empty()) {
Arts::Dispatcher::lock();
res = m_instream.eof();
Arts::Dispatcher::unlock();
}
return res;
}
bool error() const {
return (!m_open);
}
void fadvise() {
return;
}
};
#endif