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); - } - } - 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); - } - else - 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_STR(fileName); + 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); } } - else - esyslog("ERROR: can't copy file name '%s'", FileName); + 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); + } + else + 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_STR(*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);