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