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