+#include <cstdio>
#include <unistd.h>
#include <fcntl.h>
#include <lib/base/rawfile.h>
if (!m_cached)
return ::lseek(m_fd, offset, whence);
else
- return ::fseeko(m_file, offset, whence);
+ {
+ ::fseeko(m_file, offset, whence);
+ return ::ftello(m_file);
+ }
}
switch (whence)
{
int eRawFile::valid()
{
- return m_fd != -1;
+ if (!m_cached)
+ return m_fd != -1;
+ else
+ return !!m_file;
}
void eRawFile::scan()
{
if (!m_cached)
{
- int f = openFile(m_nrfiles);
+ int f = openFileUncached(m_nrfiles);
if (f < 0)
break;
if (!m_nrfiles)
::close(f);
} else
{
- FILE *f = (FILE*)openFile(m_nrfiles);
+ FILE *f = openFileCached(m_nrfiles);
if (!f)
break;
+ ::fseeko(f, 0, SEEK_END);
if (!m_nrfiles)
- m_splitsize = ::fseeko(f, 0, SEEK_END);
- m_totallength += ::fseeko(f, 0, SEEK_END);
+ m_splitsize = ::ftello(f);
+ m_totallength += ::ftello(f);
::fclose(f);
}
// eDebug("-> %d", filenr);
close();
if (!m_cached)
- m_fd = openFile(filenr);
+ m_fd = openFileUncached(filenr);
else
- m_file = (FILE*)openFile(filenr);
+ m_file = openFileCached(filenr);
m_last_offset = m_base_offset = m_splitsize * filenr;
m_current_file = filenr;
}
if (!m_cached)
m_last_offset = ::lseek(m_fd, off - m_base_offset, SEEK_SET) + m_base_offset;
else
- m_last_offset = ::fseeko(m_file, off - m_base_offset, SEEK_SET) + m_base_offset;
+ {
+ ::fseeko(m_file, off - m_base_offset, SEEK_SET);
+ m_last_offset = ::ftello(m_file) + m_base_offset;
+ }
return m_last_offset;
} else
{
}
}
-int eRawFile::openFile(int nr)
+/* m_cached */
+FILE *eRawFile::openFileCached(int nr)
{
std::string filename = m_basename;
if (nr)
snprintf(suffix, 5, ".%03d", nr);
filename += suffix;
}
- if (!m_cached)
- return ::open(filename.c_str(), O_RDONLY | O_LARGEFILE);
- else
- return (int)::fopen64(filename.c_str(), "rb");
+ return ::fopen64(filename.c_str(), "rb");
+}
+
+/* !m_cached */
+int eRawFile::openFileUncached(int nr)
+{
+ std::string filename = m_basename;
+ if (nr)
+ {
+ char suffix[5];
+ snprintf(suffix, 5, ".%03d", nr);
+ filename += suffix;
+ }
+ return ::open(filename.c_str(), O_RDONLY | O_LARGEFILE);
+}
+
+off_t eRawFile::length()
+{
+ return m_totallength;
}