Ticket #3952: linkage_backend.3.diff

File linkage_backend.3.diff, 4.7 KB (added by Wolfgang <mythtv@…>, 5 years ago)

new backend version

  • libs/libmythtv/eithelper.cpp

     
    387387            } 
    388388        } 
    389389 
     390        // Find all linked events 
     391        desc_list_t linkages = 
     392            MPEGDescriptor::FindAll(list, DescriptorID::linkage); 
     393        if (linkages.size() > 0) 
     394            StoreLinkageList(chanid,linkages,fix); 
     395        else if (chanid_has_linkage[chanid]) 
     396            DeleteLinkageList(chanid); 
     397 
    390398        QDateTime starttime = MythUTCToLocal(eit->StartTimeUTC(i)); 
    391399        EITFixUp::TimeFix(starttime); 
    392400        QDateTime endtime   = starttime.addSecs(eit->DurationInSeconds(i)); 
     
    513521    eitcache->WriteToDB(); 
    514522} 
    515523 
     524void EITHelper::DeleteLinkageList(uint portal_chanid) 
     525{ 
     526    MSqlQuery query(MSqlQuery::InitCon()); 
     527    QString qstr = "DELETE FROM linkage where portal_chanid = :CHANID"; 
     528    query.prepare(qstr); 
     529    query.bindValue(":CHANID", portal_chanid); 
     530    if (!query.exec() || !query.isActive()) 
     531        MythContext::DBError("DELETE LINKAGELIST", query); 
     532     
     533    chanid_has_linkage[portal_chanid] = false; 
     534} 
     535 
     536void EITHelper::StoreLinkageList(uint portal_chanid, desc_list_t linkages, uint fix) 
     537{ 
     538    unsigned char enc_1[3]  = { 0x10, 0x00, 0x01 }; 
     539    unsigned char enc_15[3] = { 0x10, 0x00, 0x0f }; 
     540    unsigned char enc_premiere[1] = { 0x5 }; 
     541    int enc_len = 0; 
     542    const unsigned char *enc = NULL; 
     543     
     544    MSqlQuery query(MSqlQuery::InitCon()); 
     545 
     546    //Delete old entries first 
     547    DeleteLinkageList(portal_chanid); 
     548 
     549    // Is this BellExpressVU EIT (Canada) ? 
     550    // Use an encoding override of ISO 8859-1 (Latin1) 
     551    if (fix & EITFixUp::kEFixForceISO8859_1) 
     552    { 
     553        enc = enc_1; 
     554        enc_len = sizeof(enc_1); 
     555    } 
     556 
     557    // Is this broken DVB provider in Western Europe? 
     558    // Use an encoding override of ISO 8859-15 (Latin6) 
     559    if (fix & EITFixUp::kEFixForceISO8859_15) 
     560    { 
     561        enc = enc_15; 
     562        enc_len = sizeof(enc_15); 
     563    } 
     564 
     565    // The german provider Premiere needs extra handling 
     566    if (fix & EITFixUp::kFixPremiere) 
     567    { 
     568        enc = enc_premiere; 
     569        enc_len = sizeof(enc_premiere); 
     570    } 
     571 
     572    QString qstr = ""; 
     573 
     574    for (uint j=0;j<linkages.size();j++) 
     575    { 
     576        LinkageDescriptor linkage(linkages[j]); 
     577        uint networkid         = linkage.OriginalNetworkID(); 
     578        uint tsid              = linkage.TSID(); 
     579        uint serviceid         = linkage.ServiceID(); 
     580        uint linkagetype       = linkage.LinkageType(); 
     581        QString subevent       = dvb_decode_text(linkage.PrivateData_N8(),linkage.PrivateDataLength_N8(),enc,enc_len); 
     582 
     583        uint chanid = GetChanID(serviceid,networkid,tsid); 
     584 
     585        qstr += QString("%1 (%2,%3,%4,'%5')") 
     586                    .arg(j>0?",":"INSERT INTO linkage VALUES")  
     587                    .arg(j) 
     588                    .arg(portal_chanid) 
     589                    .arg(chanid) 
     590                    .arg(subevent.utf8()); 
     591 
     592    } 
     593 
     594    query.prepare(qstr); 
     595 
     596    if (!query.exec() || !query.isActive()) 
     597        MythContext::DBError("INSERT LINKAGELIST", query); 
     598 
     599    chanid_has_linkage[portal_chanid] = true; 
     600} 
     601 
    516602////////////////////////////////////////////////////////////////////// 
    517603// private methods and functions below this line                    // 
    518604////////////////////////////////////////////////////////////////////// 
  • libs/libmythtv/eithelper.h

     
    1313// MythTV includes 
    1414#include "mythdeque.h" 
    1515 
     16typedef vector<const unsigned char*> desc_list_t; 
     17 
    1618class MSqlQuery; 
    1719 
    1820class ATSCEvent 
     
    3941typedef QMap<uint,EventIDToATSCEvent>      ATSCSRCToEvents; 
    4042typedef QMap<uint,EventIDToETT>            ATSCSRCToETTs; 
    4143typedef QMap<unsigned long long,int>       ServiceToChanID; 
     44typedef QMap<int,bool>                     ChanIDHasLinkage; 
    4245 
    4346class DBEvent; 
    4447class EITFixUp; 
     
    8285    // EIT cache handling 
    8386    void PruneEITCache(uint timestamp); 
    8487    void WriteEITCache(void); 
     88    void DeleteLinkageList(uint portal_chanid); 
     89    void StoreLinkageList(uint portal_chanid, desc_list_t linkages, uint fix); 
    8590 
    8691  private: 
    8792    uint GetChanID(uint atsc_major, uint atsc_minor); 
     
    9499        //QListList_Events  eitList;      ///< Event Information Tables List 
    95100    mutable QMutex    eitList_lock; ///< EIT List lock 
    96101    mutable ServiceToChanID srv_to_chanid; 
     102    mutable ChanIDHasLinkage chanid_has_linkage; 
    97103 
    98104    EITFixUp               *eitfixup; 
    99105    EITCache               *eitcache;