#define __lib_base_rawfile_h
#include <string>
-#include <lib/base/object.h>
+#include <lib/base/itssource.h>
-class iDataSource: public iObject
-{
-public:
- virtual off_t lseek(off_t offset, int whence)=0;
- virtual ssize_t read(void *buf, size_t count)=0; /* NOTE: you must be able to handle short reads! */
- virtual off_t length()=0;
- virtual off_t position()=0;
- virtual int valid()=0;
- virtual eSingleLock &getLock()=0;
- virtual bool is_shared()=0;
-};
-
-class iDataSourcePositionRestorer
-{
- ePtr<iDataSource> &m_source;
- off_t m_position;
-public:
- iDataSourcePositionRestorer(ePtr<iDataSource> &source)
- :m_source(source)
- {
- if (m_source->is_shared())
- m_position = m_source->position();
- }
- ~iDataSourcePositionRestorer()
- {
- if (m_source->is_shared())
- m_source->lseek(m_position, SEEK_SET);
- }
-};
-
-class eRawFile: public iDataSource
+class eRawFile: public iTsSource
{
DECLARE_REF(eRawFile);
eSingleLock m_lock;
~eRawFile();
int open(const char *filename, int cached = 0);
void setfd(int fd);
- off_t lseek(off_t offset, int whence);
int close();
- ssize_t read(void *buf, size_t count); /* NOTE: you must be able to handle short reads! */
+
+ // iTsSource
+ off_t lseek(off_t offset, int whence);
+ ssize_t read(off_t offset, void *buf, size_t count);
off_t length();
- off_t position();
int valid();
- eSingleLock &getLock();
- bool is_shared() { return ref.count > 1; }
private:
int m_fd; /* for uncached */
FILE *m_file; /* for cached */
void scan();
int m_current_file;
int switchOffset(off_t off);
+
+ off_t lseek_internal(off_t offset, int whence);
FILE *openFileCached(int nr);
int openFileUncached(int nr);
};