summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--HISTORY3
-rw-r--r--recording.c133
-rw-r--r--recording.h5
3 files changed, 69 insertions, 72 deletions
diff --git a/HISTORY b/HISTORY
index 65f08832..7bb15071 100644
--- a/HISTORY
+++ b/HISTORY
@@ -6650,7 +6650,7 @@ Video Disk Recorder Revision History
- Added support for "content identifier descriptor" and "default authority descriptor"
to 'libsi' (thanks to Dave Pickles).
-2011-08-12: Version 1.7.20
+2011-08-13: Version 1.7.20
- Added some missing 'const' to tChannelID (reported by Sundararaj Reel).
- The isnumber() function now checks the given pointer for NULL (thanks to Holger
@@ -6678,3 +6678,4 @@ Video Disk Recorder Revision History
case insensitive sorting (suggested by Sundararaj Reel).
- Now scanning new transponders before old ones, to make sure transponder changes
are recognized (thanks to Reinhard Nissl).
+- Implemented static cIndexFile::IndexFileName().
diff --git a/recording.c b/recording.c
index a8b40f2d..317e6305 100644
--- a/recording.c
+++ b/recording.c
@@ -4,7 +4,7 @@
* See the main source file 'vdr.c' for copyright information and
* how to reach the author.
*
- * $Id: recording.c 2.31 2011/06/12 13:04:28 kls Exp $
+ * $Id: recording.c 2.32 2011/08/13 10:59:32 kls Exp $
*/
#include "recording.h"
@@ -1540,84 +1540,75 @@ cIndexFile::cIndexFile(const char *FileName, bool Record, bool IsPesRecording)
:resumeFile(FileName, IsPesRecording)
{
f = -1;
- fileName = NULL;
size = 0;
last = -1;
index = NULL;
isPesRecording = IsPesRecording;
indexFileGenerator = NULL;
if (FileName) {
- const char *Suffix = isPesRecording ? INDEXFILESUFFIX ".vdr" : INDEXFILESUFFIX;
- fileName = MALLOC(char, strlen(FileName) + strlen(Suffix) + 1);
- if (fileName) {
- strcpy(fileName, FileName);
- char *pFileExt = fileName + strlen(fileName);
- strcpy(pFileExt, Suffix);
- int delta = 0;
- if (!Record && access(fileName, R_OK) != 0) {
- // Index file doesn't exist, so try to regenerate it:
- if (!isPesRecording) { // sorry, can only do this for TS recordings
- resumeFile.Delete(); // just in case
- indexFileGenerator = new cIndexFileGenerator(FileName);
- // Wait until the index file exists:
- time_t tmax = time(NULL) + MAXWAITFORINDEXFILE;
- do {
- cCondWait::SleepMs(INDEXFILECHECKINTERVAL); // start with a sleep, to give it a head start
- } while (access(fileName, R_OK) != 0 && time(NULL) < tmax);
- }
+ fileName = IndexFileName(FileName, isPesRecording);
+ int delta = 0;
+ if (!Record && access(fileName, R_OK) != 0) {
+ // Index file doesn't exist, so try to regenerate it:
+ if (!isPesRecording) { // sorry, can only do this for TS recordings
+ resumeFile.Delete(); // just in case
+ indexFileGenerator = new cIndexFileGenerator(FileName);
+ // Wait until the index file exists:
+ time_t tmax = time(NULL) + MAXWAITFORINDEXFILE;
+ do {
+ cCondWait::SleepMs(INDEXFILECHECKINTERVAL); // start with a sleep, to give it a head start
+ } while (access(fileName, R_OK) != 0 && time(NULL) < tmax);
}
- if (access(fileName, R_OK) == 0) {
- struct stat buf;
- if (stat(fileName, &buf) == 0) {
- delta = int(buf.st_size % sizeof(tIndexTs));
- if (delta) {
- delta = sizeof(tIndexTs) - delta;
- esyslog("ERROR: invalid file size (%"PRId64") in '%s'", buf.st_size, fileName);
- }
- last = int((buf.st_size + delta) / sizeof(tIndexTs) - 1);
- if (!Record && last >= 0) {
- size = last + 1;
- index = MALLOC(tIndexTs, size);
- if (index) {
- f = open(fileName, O_RDONLY);
- if (f >= 0) {
- if (safe_read(f, index, size_t(buf.st_size)) != buf.st_size) {
- esyslog("ERROR: can't read from file '%s'", fileName);
- free(index);
- index = NULL;
- close(f);
- f = -1;
- }
- // we don't close f here, see CatchUp()!
- else if (isPesRecording)
- ConvertFromPes(index, size);
+ }
+ if (access(fileName, R_OK) == 0) {
+ struct stat buf;
+ if (stat(fileName, &buf) == 0) {
+ delta = int(buf.st_size % sizeof(tIndexTs));
+ if (delta) {
+ delta = sizeof(tIndexTs) - delta;
+ esyslog("ERROR: invalid file size (%"PRId64") in '%s'", buf.st_size, *fileName);
+ }
+ last = int((buf.st_size + delta) / sizeof(tIndexTs) - 1);
+ if (!Record && last >= 0) {
+ size = last + 1;
+ index = MALLOC(tIndexTs, size);
+ if (index) {
+ f = open(fileName, O_RDONLY);
+ if (f >= 0) {
+ if (safe_read(f, index, size_t(buf.st_size)) != buf.st_size) {
+ esyslog("ERROR: can't read from file '%s'", *fileName);
+ free(index);
+ index = NULL;
+ close(f);
+ f = -1;
}
- else
- LOG_ERROR_STR(fileName);
+ // we don't close f here, see CatchUp()!
+ else if (isPesRecording)
+ ConvertFromPes(index, size);
}
else
- esyslog("ERROR: can't allocate %zd bytes for index '%s'", size * sizeof(tIndexTs), fileName);
+ LOG_ERROR_STR(*fileName);
}
+ else
+ esyslog("ERROR: can't allocate %zd bytes for index '%s'", size * sizeof(tIndexTs), *fileName);
}
- else
- LOG_ERROR;
}
- else if (!Record)
- isyslog("missing index file %s", fileName);
- if (Record) {
- if ((f = open(fileName, O_WRONLY | O_CREAT | O_APPEND, DEFFILEMODE)) >= 0) {
- if (delta) {
- esyslog("ERROR: padding index file with %d '0' bytes", delta);
- while (delta--)
- writechar(f, 0);
- }
+ else
+ LOG_ERROR;
+ }
+ else if (!Record)
+ isyslog("missing index file %s", *fileName);
+ if (Record) {
+ if ((f = open(fileName, O_WRONLY | O_CREAT | O_APPEND, DEFFILEMODE)) >= 0) {
+ if (delta) {
+ esyslog("ERROR: padding index file with %d '0' bytes", delta);
+ while (delta--)
+ writechar(f, 0);
}
- else
- LOG_ERROR_STR(fileName);
}
+ else
+ LOG_ERROR_STR(*fileName);
}
- else
- esyslog("ERROR: can't copy file name '%s'", FileName);
}
}
@@ -1625,11 +1616,15 @@ cIndexFile::~cIndexFile()
{
if (f >= 0)
close(f);
- free(fileName);
free(index);
delete indexFileGenerator;
}
+cString cIndexFile::IndexFileName(const char *FileName, bool IsPesRecording)
+{
+ return cString::sprintf("%s%s", FileName, IsPesRecording ? INDEXFILESUFFIX ".vdr" : INDEXFILESUFFIX);
+}
+
void cIndexFile::ConvertFromPes(tIndexTs *IndexTs, int Count)
{
tIndexPes IndexPes;
@@ -1696,7 +1691,7 @@ bool cIndexFile::CatchUp(int Index)
last = newLast;
}
else
- LOG_ERROR_STR(fileName);
+ LOG_ERROR_STR(*fileName);
}
else {
esyslog("ERROR: can't realloc() index");
@@ -1705,7 +1700,7 @@ bool cIndexFile::CatchUp(int Index)
}
}
else
- LOG_ERROR_STR(fileName);
+ LOG_ERROR_STR(*fileName);
if (Index < last - (i ? 2 * INDEXSAFETYLIMIT : 0) || Index > 10 * INDEXSAFETYLIMIT) // keep off the end in case of "Pause live video"
break;
cCondWait::SleepMs(1000);
@@ -1721,7 +1716,7 @@ bool cIndexFile::Write(bool Independent, uint16_t FileNumber, off_t FileOffset)
if (isPesRecording)
ConvertToPes(&i, 1);
if (safe_write(f, &i, sizeof(i)) < 0) {
- LOG_ERROR_STR(fileName);
+ LOG_ERROR_STR(*fileName);
close(f);
f = -1;
return false;
@@ -1811,8 +1806,8 @@ bool cIndexFile::IsStillRecording()
void cIndexFile::Delete(void)
{
- if (fileName) {
- dsyslog("deleting index file '%s'", fileName);
+ if (*fileName) {
+ dsyslog("deleting index file '%s'", *fileName);
if (f >= 0) {
close(f);
f = -1;
diff --git a/recording.h b/recording.h
index 8ec7f49e..4498ae9b 100644
--- a/recording.h
+++ b/recording.h
@@ -4,7 +4,7 @@
* See the main source file 'vdr.c' for copyright information and
* how to reach the author.
*
- * $Id: recording.h 2.19 2011/04/17 13:18:04 kls Exp $
+ * $Id: recording.h 2.20 2011/08/13 09:52:25 kls Exp $
*/
#ifndef __RECORDING_H
@@ -236,13 +236,14 @@ class cIndexFileGenerator;
class cIndexFile {
private:
int f;
- char *fileName;
+ cString fileName;
int size, last;
tIndexTs *index;
bool isPesRecording;
cResumeFile resumeFile;
cIndexFileGenerator *indexFileGenerator;
cMutex mutex;
+ static cString IndexFileName(const char *FileName, bool IsPesRecording);
void ConvertFromPes(tIndexTs *IndexTs, int Count);
void ConvertToPes(tIndexTs *IndexTs, int Count);
bool CatchUp(int Index = -1);