00001 #ifndef DATADIRECT_H_
00002 #define DATADIRECT_H_
00003
00004 #include <QStringList>
00005 #include <QDateTime>
00006 #include <QXmlDefaultHandler>
00007 #include <QMap>
00008 #include <QNetworkReply>
00009 #include <QAuthenticator>
00010
00011 #include "mythtvexp.h"
00012
00013 #include <vector>
00014
00015 using namespace std;
00016
00017 enum DD_PROVIDERS
00018 {
00019 DD_ZAP2IT = 0,
00020 DD_SCHEDULES_DIRECT = 1,
00021 DD_PROVIDER_COUNT = 2,
00022 };
00023
00024 class DataDirectURLs
00025 {
00026
00027 public:
00028 DataDirectURLs(QString a, QString b, QString c, QString d) :
00029 name(a), webServiceURL(b), webURL(c), loginPage(d) {}
00030
00031 QString name;
00032 QString webServiceURL;
00033 QString webURL;
00034 QString loginPage;
00035 };
00036
00037 typedef vector<DataDirectURLs> DDProviders;
00038
00039 class DataDirectProcessor;
00040
00041 class DataDirectStation
00042 {
00043
00044 public:
00045 DataDirectStation();
00046
00047 void Reset(void)
00048 {
00049 DataDirectStation tmp;
00050 *this = tmp;
00051 }
00052
00053 public:
00054
00055 QString stationid;
00056 QString callsign;
00057 QString stationname;
00058 QString affiliate;
00059 QString fccchannelnumber;
00060 };
00061
00062 typedef DataDirectStation DDStation;
00063
00064 class DataDirectLineup
00065 {
00066
00067 public:
00068 DataDirectLineup();
00069
00070 void Reset(void)
00071 {
00072 DataDirectLineup tmp;
00073 *this = tmp;
00074 }
00075
00076 public:
00077
00078 QString lineupid;
00079 QString name;
00080 QString displayname;
00081 QString type;
00082 QString postal;
00083 QString device;
00084 QString location;
00085 };
00086
00087 class DataDirectLineupMap
00088 {
00089
00090 public:
00091 DataDirectLineupMap();
00092
00093 void Reset(void)
00094 {
00095 DataDirectLineupMap tmp;
00096 *this = tmp;
00097 }
00098
00099 public:
00100
00101 QString lineupid;
00102 QString stationid;
00103 QString channel;
00104 QString channelMinor;
00105 QDate mapFrom;
00106 QDate mapTo;
00107 };
00108
00109 class DataDirectSchedule
00110 {
00111
00112 public:
00113 DataDirectSchedule();
00114
00115 void Reset(void)
00116 {
00117 DataDirectSchedule tmp;
00118 *this = tmp;
00119 }
00120
00121 public:
00122 QString programid;
00123 QString stationid;
00124 QDateTime time;
00125 QTime duration;
00126 bool repeat;
00127 bool isnew;
00128 bool stereo;
00129 bool dolby;
00130 bool subtitled;
00131 bool hdtv;
00132 bool closecaptioned;
00133 QString tvrating;
00134 int partnumber;
00135 int parttotal;
00136 };
00137
00138 class DataDirectProgram
00139 {
00140
00141 public:
00142 DataDirectProgram();
00143
00144 void Reset(void)
00145 {
00146 DataDirectProgram tmp;
00147 *this = tmp;
00148 }
00149
00150 public:
00151 QString programid;
00152 QString seriesid;
00153 QString title;
00154 QString subtitle;
00155 QString description;
00156 QString mpaaRating;
00157 QString starRating;
00158 QTime duration;
00159 QString year;
00160 QString showtype;
00161 QString colorcode;
00162 QDate originalAirDate;
00163 QString syndicatedEpisodeNumber;
00164
00165 };
00166
00167 class DataDirectProductionCrew
00168 {
00169
00170 public:
00171 DataDirectProductionCrew();
00172
00173 void Reset(void)
00174 {
00175 DataDirectProductionCrew tmp;
00176 *this = tmp;
00177 }
00178
00179 public:
00180 QString programid;
00181 QString role;
00182 QString givenname;
00183 QString surname;
00184 QString fullname;
00185 };
00186
00187 class DataDirectGenre
00188 {
00189
00190 public:
00191 DataDirectGenre();
00192
00193 void Reset(void)
00194 {
00195 DataDirectGenre tmp;
00196 *this = tmp;
00197 }
00198
00199 public:
00200 QString programid;
00201 QString gclass;
00202 QString relevance;
00203 };
00204
00205 class RawLineupChannel
00206 {
00207
00208 public:
00209 RawLineupChannel() :
00210 chk_name(QString::null), chk_id(QString::null),
00211 chk_value(QString::null), chk_checked(false),
00212 lbl_ch(QString::null), lbl_callsign(QString::null) {}
00213
00214 RawLineupChannel(QString name, QString id,
00215 QString value, bool checked,
00216 QString ch, QString callsign) :
00217 chk_name(name), chk_id(id), chk_value(value),
00218 chk_checked(checked), lbl_ch(ch), lbl_callsign(callsign) {}
00219
00220 public:
00221 QString chk_name;
00222 QString chk_id;
00223 QString chk_value;
00224 bool chk_checked;
00225 QString lbl_ch;
00226 QString lbl_callsign;
00227 };
00228
00229 typedef vector<RawLineupChannel> RawLineupChannels;
00230
00231 class RawLineup
00232 {
00233
00234 public:
00235 RawLineup() :
00236 get_action(QString::null), set_action(QString::null),
00237 udl_id(QString::null), zipcode(QString::null) {}
00238
00239 RawLineup(QString a, QString b, QString c) :
00240 get_action(a), set_action(QString::null), udl_id(b), zipcode(c) {}
00241
00242 public:
00243 QString get_action;
00244 QString set_action;
00245 QString udl_id;
00246 QString zipcode;
00247
00248 RawLineupChannels channels;
00249 };
00250
00251 typedef QMap<QString, RawLineup> RawLineupMap;
00252
00253 class PostItem
00254 {
00255
00256 public:
00257 PostItem(QString k, QString v) : key(k), value(v) {}
00258
00259 QString key;
00260 QString value;
00261 };
00262
00263 typedef vector<PostItem> PostList;
00264
00265 class DDStructureParser: public QXmlDefaultHandler
00266 {
00267
00268 public:
00269 DDStructureParser(DataDirectProcessor& _ddparent) :
00270 parent(_ddparent) {}
00271
00272 bool startElement(const QString &pnamespaceuri, const QString &plocalname,
00273 const QString &pqname, const QXmlAttributes &pxmlatts);
00274
00275 bool endElement(const QString &pnamespaceuri, const QString &plocalname,
00276 const QString &pqname);
00277
00278 bool characters(const QString &pchars);
00279
00280 bool startDocument(void);
00281 bool endDocument(void);
00282
00283 private:
00284 DataDirectProcessor &parent;
00285
00286 QString currtagname;
00287 DataDirectStation curr_station;
00288 DataDirectLineup curr_lineup;
00289 DataDirectLineupMap curr_lineupmap;
00290 DataDirectSchedule curr_schedule;
00291 DataDirectProgram curr_program;
00292 DataDirectProductionCrew curr_productioncrew;
00293 DataDirectGenre curr_genre;
00294 QString lastprogramid;
00295 };
00296
00297
00298 typedef QMap<QString, DataDirectStation> DDStationList;
00299 typedef vector<DataDirectLineup> DDLineupList;
00300 typedef vector<DataDirectLineupMap> DDLineupChannels;
00301 typedef QMap<QString, DDLineupChannels> DDLineupMap;
00302
00303 class MTV_PUBLIC DataDirectProcessor
00304 {
00305
00306 friend class DDStructureParser;
00307 friend void authenticationCallback(QNetworkReply*, QAuthenticator*, void*);
00308
00309 public:
00310 DataDirectProcessor(uint listings_provider = DD_ZAP2IT,
00311 QString userid = "", QString password = "");
00312 ~DataDirectProcessor();
00313
00314 QString CreateTempDirectory(bool *ok = NULL) const;
00315
00316
00317 bool GrabData(const QDateTime &startdate, const QDateTime &enddate);
00318 bool GrabNextSuggestedTime(void);
00319
00320
00321 bool GrabLineupsOnly(void);
00322 bool GrabAllData(void);
00323
00324
00325 bool GrabLoginCookiesAndLineups(bool parse_lineups = true);
00326 bool GrabLineupForModify(const QString &lineupid);
00327 bool SaveLineupChanges(const QString &lineupid);
00328
00329
00330 bool GrabFullLineup(const QString &lineupid, bool restore = true,
00331 bool onlyGrabSelected = false,
00332 uint cache_age_allowed_in_seconds = 0);
00333 bool SaveLineup(const QString &lineupid,
00334 const QMap<QString, bool> &xmltvids);
00335 bool UpdateListings(uint sourceid);
00336
00337
00338 bool GrabLineupsFromCache(const QString &lineupid);
00339 bool SaveLineupToCache(const QString &lineupid) const;
00340
00341
00342 DDStationList GetStations(void) const { return m_stations; }
00343 DDLineupList GetLineups(void) const { return m_lineups; }
00344 DDLineupMap GetLineupMap(void) const { return m_lineupmaps; }
00345 QDateTime GetLineupCacheAge(const QString &lineupid) const;
00346
00347 QString GetUserID(void) const { return m_userid.toLower(); }
00348 QString GetPassword(void) const { return m_password; }
00349 uint GetListingsProvider(void) const { return m_listingsProvider; }
00350
00351 QString GetListingsProviderName(void) const
00352 {
00353 return m_providers[m_listingsProvider % DD_PROVIDER_COUNT].name;
00354 }
00355
00356 QDateTime GetDDProgramsStartAt(bool localtime = false) const;
00357 QDateTime GetDDProgramsEndAt(bool localtime = false) const;
00358 DDLineupChannels GetDDLineup(const QString &lineupid) const
00359 {
00360 return m_lineupmaps[lineupid];
00361 }
00362
00363 DDStation GetDDStation(const QString &xmltvid) const
00364 {
00365 return m_stations[xmltvid];
00366 }
00367
00368 QString GetRawUDLID(const QString &lineupid) const;
00369 QString GetRawZipCode(const QString &lineupid) const;
00370 RawLineup GetRawLineup(const QString &lineupid) const;
00371
00372
00373 void SetUserID(const QString &uid);
00374 void SetPassword(const QString &pwd);
00375 void SetListingsProvider(uint i)
00376 {
00377 m_listingsProvider = i % DD_PROVIDER_COUNT;
00378 }
00379
00380 void SetInputFile(const QString &file);
00381 void SetCacheData(bool cd) { m_cacheData = cd; }
00382
00383
00384 static void UpdateStationViewTable(QString lineupid);
00385 static void UpdateProgramViewTable(uint sourceid);
00386
00387
00388 static int UpdateChannelsSafe(
00389 uint sourceid, bool insert_channels, bool filter_new_channels);
00390 static bool UpdateChannelsUnsafe(
00391 uint sourceid, bool filter_new_channels);
00392 static void DataDirectProgramUpdate(void);
00393
00394 QStringList GetFatalErrors(void) const { return m_fatalErrors; }
00395
00396 private:
00397 void CreateTempTables(void);
00398 void CreateATempTable(const QString &ptablename,
00399 const QString &ptablestruct);
00400
00401 bool ParseLineups(const QString &documentFile);
00402 bool ParseLineup(const QString &lineupid, const QString &documentFile);
00403
00404 void CreateTemp(const QString &templatefilename, const QString &errmsg,
00405 bool directory, QString &filename, bool &ok) const;
00406
00407 QString GetResultFilename(bool &ok) const;
00408 QString GetCookieFilename(bool &ok) const;
00409
00410 void SetAll(const QString &lineupid, bool val);
00411 void SetDDProgramsStartAt(QDateTime begts) { m_actualListingsFrom = begts; }
00412 void SetDDProgramsEndAt(QDateTime endts) { m_actualListingsTo = endts; }
00413
00414 static bool Post(QString url, const PostList &list, QString documentFile,
00415 QString inCookieFile, QString outCookieFile);
00416
00417 bool DDPost(QString url, QString &inputFilename,
00418 QDateTime pstartDate, QDateTime pendDate,
00419 QString &err_txt);
00420
00421
00422 private:
00423 void authenticationCallback(QNetworkReply *reply, QAuthenticator *auth);
00424
00425 uint m_listingsProvider;
00426 DDProviders m_providers;
00427
00428 QString m_userid;
00429 QString m_password;
00430 mutable QString m_tmpDir;
00431 bool m_cacheData;
00432
00433 QDateTime m_actualListingsFrom;
00434 QDateTime m_actualListingsTo;
00435
00436 QString m_inputFilename;
00437
00438 DDStationList m_stations;
00439 DDLineupList m_lineups;
00440 DDLineupMap m_lineupmaps;
00441
00442 RawLineupMap m_rawLineups;
00443 mutable QString m_tmpPostFile;
00444 mutable QString m_tmpResultFile;
00445 mutable QString m_cookieFile;
00446 QDateTime m_cookieFileDT;
00447
00448 mutable QStringList m_fatalErrors;
00449 };
00450
00451 #endif