summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--p2pvr/scanner/eitRows.cpp26
-rw-r--r--p2pvr/scanner/eitRows.h10
-rw-r--r--p2pvr/scanner/serviceRows.cpp16
-rw-r--r--p2pvr/scanner/serviceRows.h3
4 files changed, 36 insertions, 19 deletions
diff --git a/p2pvr/scanner/eitRows.cpp b/p2pvr/scanner/eitRows.cpp
index bdc46f0..f5bcf51 100644
--- a/p2pvr/scanner/eitRows.cpp
+++ b/p2pvr/scanner/eitRows.cpp
@@ -393,26 +393,17 @@ static bool validateDescription(const u_char *data, size_t len) {
return false;
} /*}}}*/
-class SeenProgram {
- public:
- SeenProgram(int sid, int eid);
- bool operator<(const SeenProgram &) const;
- const int sid;
- const int eid;
-};
-SeenProgram::SeenProgram(int s, int e) :
+EitRows::SeenProgram::SeenProgram(int s, int e) :
sid(s),
eid(e)
{
}
bool
-SeenProgram::operator<(const SeenProgram & o) const
+EitRows::SeenProgram::operator<(const SeenProgram & o) const
{
return ((this->sid < o.sid) || ((this->sid == o.sid) && (this->eid < o.eid)));
}
-typedef std::set<SeenProgram> SeenPrograms;
-SeenPrograms seenPrograms;
bool
EitRows::parseInfoTable(const u_char *data, size_t len, const RowProcessor * rp) const {
const struct eit *e = reinterpret_cast<const struct eit *>(data);
@@ -486,8 +477,15 @@ EitRows::filterInput(int fd) const
void
EitRows::execute(const RowProcessor * rp) const
{
- openInput();
- readTables(rp);
- closeInput();
+ try {
+ openInput();
+ readTables(rp);
+ closeInput();
+ seenPrograms.clear();
+ }
+ catch (...) {
+ seenPrograms.clear();
+ throw;
+ }
}
diff --git a/p2pvr/scanner/eitRows.h b/p2pvr/scanner/eitRows.h
index 255f52b..bc44568 100644
--- a/p2pvr/scanner/eitRows.h
+++ b/p2pvr/scanner/eitRows.h
@@ -25,6 +25,16 @@ class EitRows : public RowSet, DvbSiReaderHelper {
RowAttribute resolveAttr(const Glib::ustring & attrName) const;
private:
+ class SeenProgram {
+ public:
+ SeenProgram(int sid, int eid);
+ bool operator<(const SeenProgram &) const;
+ const int sid;
+ const int eid;
+ };
+ typedef std::set<SeenProgram> SeenPrograms;
+ mutable SeenPrograms seenPrograms;
+
void filterInput(int fd) const;
bool parseInfoTable(const u_char *data, size_t len, const RowProcessor *) const;
void parseEventDescription(const u_char *data) const;
diff --git a/p2pvr/scanner/serviceRows.cpp b/p2pvr/scanner/serviceRows.cpp
index 474d1e5..3489f72 100644
--- a/p2pvr/scanner/serviceRows.cpp
+++ b/p2pvr/scanner/serviceRows.cpp
@@ -24,6 +24,7 @@ class Service {
VariableType defaultAuthority;
VariableType transportID;
};
+
void
ServiceRows::loadComplete(const CommonObjects *)
{
@@ -115,13 +116,18 @@ ServiceRows::filterInput(int fd) const
void
ServiceRows::execute(const RowProcessor * rp) const
{
- openInput();
- readTables(rp);
- closeInput();
+ try {
+ openInput();
+ readTables(rp);
+ closeInput();
+ seenServices.clear();
+ }
+ catch (...) {
+ seenServices.clear();
+ throw;
+ }
}
-typedef std::set<int> SeenServices;
-SeenServices seenServices;
bool
ServiceRows::parseInfoTable(const u_char * data, size_t len, const RowProcessor * rp) const {
const struct sit *e = reinterpret_cast<const struct sit *>(data);
diff --git a/p2pvr/scanner/serviceRows.h b/p2pvr/scanner/serviceRows.h
index 0a048a0..7ad2457 100644
--- a/p2pvr/scanner/serviceRows.h
+++ b/p2pvr/scanner/serviceRows.h
@@ -25,6 +25,9 @@ class ServiceRows : public RowSet, DvbSiReaderHelper {
RowAttribute resolveAttr(const Glib::ustring & attrName) const;
private:
+ typedef std::set<int> SeenServices;
+ mutable SeenServices seenServices;
+
void filterInput(int fd) const;
bool parseInfoTable(const u_char *data, size_t len, const RowProcessor *) const;
void parseServiceDescriptor(const u_char *data, size_t len) const;