diff options
| author | ghost <andreas.monzner@multimedia-labs.de> | 2010-11-09 23:29:09 +0100 |
|---|---|---|
| committer | ghost <andreas.monzner@multimedia-labs.de> | 2010-11-09 23:29:09 +0100 |
| commit | 593d7ac3a2a3c916eda486352bbcc25c4aede678 (patch) | |
| tree | 0803e6c521cac23828da7650bb4ef56bc6cc0fe9 | |
| parent | 57f0f06b1e3235dfb6739a43bb95ab92c02f9574 (diff) | |
| download | enigma2-593d7ac3a2a3c916eda486352bbcc25c4aede678.tar.gz enigma2-593d7ac3a2a3c916eda486352bbcc25c4aede678.zip | |
rawfile.h/cpp: add virtual baseclass for data sources (iDataSource)
let eRawFile inherit from iDataSource
| -rw-r--r-- | lib/base/rawfile.cpp | 20 | ||||
| -rw-r--r-- | lib/base/rawfile.h | 40 |
2 files changed, 57 insertions, 3 deletions
diff --git a/lib/base/rawfile.cpp b/lib/base/rawfile.cpp index c7e11feb..1552203a 100644 --- a/lib/base/rawfile.cpp +++ b/lib/base/rawfile.cpp @@ -4,7 +4,10 @@ #include <lib/base/rawfile.h> #include <lib/base/eerror.h> +DEFINE_REF(eRawFile); + eRawFile::eRawFile() + :m_lock(true) { m_fd = -1; m_file = 0; @@ -232,3 +235,20 @@ off_t eRawFile::length() { return m_totallength; } + +off_t eRawFile::position() +{ + if (m_nrfiles < 2) + { + if (!m_cached) + return ::lseek(m_fd, 0, SEEK_CUR); + else + return ::fseeko(m_file, 0, SEEK_CUR); + } + return m_current_offset; +} + +eSingleLock &eRawFile::getLock() +{ + return m_lock; +} diff --git a/lib/base/rawfile.h b/lib/base/rawfile.h index a1c73d6a..bb39dc6e 100644 --- a/lib/base/rawfile.h +++ b/lib/base/rawfile.h @@ -2,24 +2,58 @@ #define __lib_base_rawfile_h #include <string> +#include <lib/base/object.h> -class eRawFile +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 +{ + DECLARE_REF(eRawFile); + eSingleLock m_lock; +public: eRawFile(); ~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! */ 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 */ - int m_cached; std::string m_basename; off_t m_splitsize, m_totallength, m_current_offset, m_base_offset, m_last_offset; |
