00001
00007
00008 #include <algorithm>
00009 using namespace std;
00010
00011
00012 #include "iptvfeederwrapper.h"
00013
00014 #include "iptvfeeder.h"
00015 #include "iptvfeederrtsp.h"
00016 #include "iptvfeederudp.h"
00017 #include "iptvfeederrtp.h"
00018 #include "iptvfeederfile.h"
00019 #include "iptvfeederhls.h"
00020 #include "mythcontext.h"
00021 #include "mythlogging.h"
00022
00023 #define LOC QString("IPTVFeed: ")
00024
00025
00026 IPTVFeederWrapper::IPTVFeederWrapper() :
00027 _feeder(NULL), _url(QString::null), _lock()
00028 {
00029 }
00030
00031 IPTVFeederWrapper::~IPTVFeederWrapper()
00032 {
00033 if (_feeder)
00034 {
00035 _feeder->Stop();
00036 _feeder->Close();
00037 delete _feeder;
00038 _feeder = NULL;
00039 }
00040 }
00041
00042 bool IPTVFeederWrapper::InitFeeder(const QString &url)
00043 {
00044 LOG(VB_RECORD, LOG_INFO, LOC + "Init() -- begin");
00045 QMutexLocker locker(&_lock);
00046
00047 if (_feeder && _feeder->CanHandle(url))
00048 {
00049 _url = url;
00050 _url.detach();
00051 LOG(VB_RECORD, LOG_INFO, LOC + "Init() -- end 0");
00052
00053 return true;
00054 }
00055
00056 IPTVFeeder *tmp_feeder = NULL;
00057 if (IPTVFeederRTSP::IsRTSP(url))
00058 {
00059 tmp_feeder = new IPTVFeederRTSP();
00060 }
00061 else if (IPTVFeederUDP::IsUDP(url))
00062 {
00063 tmp_feeder = new IPTVFeederUDP();
00064 }
00065 else if (IPTVFeederRTP::IsRTP(url))
00066 {
00067 tmp_feeder = new IPTVFeederRTP();
00068 }
00069 else if (IPTVFeederFile::IsFile(url))
00070 {
00071 tmp_feeder = new IPTVFeederFile();
00072 }
00073 else if (IPTVFeederHLS::IsHLS(url))
00074 {
00075 tmp_feeder = new IPTVFeederHLS();
00076 }
00077 else
00078 {
00079 LOG(VB_RECORD, LOG_ERR, LOC +
00080 QString("Init() -- unhandled url (%1)").arg(url));
00081
00082 return false;
00083 }
00084
00085 if (_feeder)
00086 delete _feeder;
00087
00088 _feeder = tmp_feeder;
00089
00090 _url = url;
00091 _url.detach();
00092
00093 LOG(VB_RECORD, LOG_INFO, LOC + "Init() -- adding listeners");
00094
00095 vector<TSDataListener*>::iterator it = _listeners.begin();
00096 for (; it != _listeners.end(); ++it)
00097 _feeder->AddListener(*it);
00098
00099 LOG(VB_RECORD, LOG_INFO, LOC + "Init() -- end 1");
00100
00101 return true;
00102 }
00103
00104
00105 bool IPTVFeederWrapper::Open(const QString& url)
00106 {
00107 LOG(VB_RECORD, LOG_INFO, LOC + "Open() -- begin");
00108
00109 bool result = InitFeeder(url) && _feeder->Open(_url);
00110
00111 LOG(VB_RECORD, LOG_INFO, LOC + "Open() -- end");
00112
00113 return result;
00114 }
00115
00116 bool IPTVFeederWrapper::IsOpen(void) const
00117 {
00118 LOG(VB_RECORD, LOG_INFO, LOC + "IsOpen() -- begin");
00119
00120 bool result = _feeder && _feeder->IsOpen();
00121
00122 LOG(VB_RECORD, LOG_INFO, LOC + "IsOpen() -- end");
00123
00124 return result;
00125 }
00126
00127 void IPTVFeederWrapper::Close(void)
00128 {
00129 LOG(VB_RECORD, LOG_INFO, LOC + "Close() -- begin");
00130
00131 if (_feeder)
00132 _feeder->Close();
00133
00134 LOG(VB_RECORD, LOG_INFO, LOC + "Close() -- end");
00135 }
00136
00137 void IPTVFeederWrapper::Run(void)
00138 {
00139 LOG(VB_RECORD, LOG_INFO, LOC + "Run() -- begin");
00140
00141 if (_feeder)
00142 _feeder->Run();
00143
00144 LOG(VB_RECORD, LOG_INFO, LOC + "Run() -- end");
00145 }
00146
00147 void IPTVFeederWrapper::Stop(void)
00148 {
00149 LOG(VB_RECORD, LOG_INFO, LOC + "Stop() -- begin");
00150
00151 if (_feeder)
00152 _feeder->Stop();
00153
00154 LOG(VB_RECORD, LOG_INFO, LOC + "Stop() -- end");
00155 }
00156
00157 void IPTVFeederWrapper::AddListener(TSDataListener *item)
00158 {
00159 LOG(VB_RECORD, LOG_INFO, LOC + QString("AddListener(0x%1) -- begin")
00160 .arg((uint64_t)item,0,16));
00161
00162 if (!item)
00163 {
00164 LOG(VB_RECORD, LOG_INFO, LOC + QString("AddListener(0x%1) -- end 0")
00165 .arg((uint64_t)item,0,16));
00166 return;
00167 }
00168
00169 QMutexLocker locker(&_lock);
00170 vector<TSDataListener*>::iterator it =
00171 find(_listeners.begin(), _listeners.end(), item);
00172 if (it == _listeners.end())
00173 {
00174 _listeners.push_back(item);
00175 if (_feeder)
00176 _feeder->AddListener(item);
00177 }
00178
00179 LOG(VB_RECORD, LOG_INFO, LOC + QString("AddListener(0x%1) -- end 1")
00180 .arg((uint64_t)item,0,16));
00181 }
00182
00183 void IPTVFeederWrapper::RemoveListener(TSDataListener *item)
00184 {
00185 LOG(VB_RECORD, LOG_INFO, LOC + QString("RemoveListener(0x%1) -- begin")
00186 .arg((uint64_t)item,0,16));
00187
00188 QMutexLocker locker(&_lock);
00189 vector<TSDataListener*>::iterator it =
00190 find(_listeners.begin(), _listeners.end(), item);
00191
00192 if (it == _listeners.end())
00193 {
00194 LOG(VB_RECORD, LOG_ERR, LOC + QString("RemoveListener(0x%1) -- end "
00195 "(not found)")
00196 .arg((uint64_t)item,0,16));
00197
00198 return;
00199 }
00200
00201
00202 *it = *_listeners.rbegin();
00203 _listeners.resize(_listeners.size() - 1);
00204 if (_feeder)
00205 _feeder->RemoveListener(item);
00206
00207 LOG(VB_RECORD, LOG_INFO, LOC + QString("RemoveListener(0x%1) -- end (ok, "
00208 "removed)")
00209 .arg((uint64_t)item,0,16));
00210 }