Ticket #8763: 0001-Reworked-patch-from-8763-WMP12-support.patch

File 0001-Reworked-patch-from-8763-WMP12-support.patch, 27.5 KB (added by beirdo, 9 years ago)
  • mythtv/libs/libmythupnp/httprequest.cpp

    From 1b1ff68b701882479c6c19cc1a5d651557689d3d Mon Sep 17 00:00:00 2001
    From: Gavin Hurlbut <gjhurlbu@gmail.com>
    Date: Sun, 15 Aug 2010 14:17:21 -0700
    Subject: [PATCH] Reworked patch from #8763 - WMP12 support
    
    
    diff --git a/mythtv/libs/libmythupnp/httprequest.cpp b/mythtv/libs/libmythupnp/httprequest.cpp
    index 66937c8..b437249 100644
    a b long HTTPRequest::SendResponseFile( QString sFileName ) 
    375375
    376376            // Adjust ranges that are too long. 
    377377
    378             if (llEnd > llSize)
    379                 llEnd = llSize;
     378            if (llEnd >= llSize)
     379                llEnd = llSize-1;
    380380
    381             if ((llSize >= llStart) && (llSize >= llEnd) && (llEnd >= llStart))
     381            if ((llSize > llStart) && (llSize > llEnd) && (llEnd > llStart))
    382382            {
    383383                if (bRange)
    384384                {
  • mythtv/libs/libmythupnp/upnpcds.cpp

    diff --git a/mythtv/libs/libmythupnp/upnpcds.cpp b/mythtv/libs/libmythupnp/upnpcds.cpp
    index 9f55c5b..89d537f 100644
    a b bool UPnpCDS::ProcessRequest( HttpWorkerThread *pThread, HTTPRequest *pRequest ) 
    188188
    189189}
    190190
     191static UPnpCDSClientException clientExceptions[] = {
     192    // Windows Media Player version 12
     193    { CDS_ClientWMP,        "Windows-Media-Player" },
     194    // Windows Media Player version < 12
     195    { CDS_ClientWMP,        "Mozilla/4.0 (compatible; UPnP/1.0; Windows 9x" },
     196    // XBMC
     197    { CDS_ClientXBMC,       "Platinum" },
     198    // XBox 360
     199    { CDS_ClientXBox,       "Xbox" },
     200};
     201static uint clientExceptionCount = sizeof(clientExceptions) /
     202                                   sizeof(clientExceptions[0]);
     203
     204void UPnpCDS::DetermineClient( HTTPRequest *pRequest, UPnpCDSRequest *pCDSRequest )
     205{
     206    QString sUserAgent = pRequest->GetHeaderValue( "User-Agent", "" );
     207
     208    pCDSRequest->m_eClient = CDS_ClientDefault;
     209    pCDSRequest->m_nClientVersion = 0;
     210
     211    // Do we know this client string?
     212    for ( uint i = 0; i < clientExceptionCount; i++ )
     213    {
     214        UPnpCDSClientException *except = &clientExceptions[i];
     215
     216        int idx = sUserAgent.indexOf(except->sClientId);
     217        if (idx != -1)
     218        {
     219            pCDSRequest->m_eClient = except->nClientType;;
     220
     221            // Now find the version number
     222            QString version =
     223               sUserAgent.mid( idx + except->sClientId.length() + 1 ).trimmed();
     224            idx = version.indexOf( '.' );
     225            if (idx != -1)
     226            {
     227                idx = version.indexOf( '.', idx + 1 );
     228            }
     229            if (idx != -1)
     230            {
     231                version = version.left( idx );
     232            }
     233            idx = version.indexOf( ' ' );
     234            if (idx != -1)
     235            {
     236                version = version.left( idx );
     237            }
     238
     239            pCDSRequest->m_nClientVersion = version.toDouble();
     240
     241            break;
     242        }
     243    }
     244
     245    VERBOSE(VB_UPNP, QString("UPnpCDS::DetermineClient User-Agent:%1 Indentified as %2 version %3")
     246                     .arg(sUserAgent)
     247                     .arg(pCDSRequest->m_eClient)
     248                     .arg(pCDSRequest->m_nClientVersion) );
     249
     250}
     251
     252
    191253/////////////////////////////////////////////////////////////////////////////
    192254//
    193255/////////////////////////////////////////////////////////////////////////////
    void UPnpCDS::HandleBrowse( HTTPRequest *pRequest ) 
    197259    UPnpCDSExtensionResults *pResult  = NULL;
    198260    UPnpCDSRequest           request;
    199261
     262    DetermineClient( pRequest, &request );
    200263    request.m_sObjectId         = pRequest->m_mapParams[ "ObjectID"      ];
    201264    request.m_sContainerID      = pRequest->m_mapParams[ "ContainerID"   ];
    202265    request.m_sParentId         = "0";
    void UPnpCDS::HandleBrowse( HTTPRequest *pRequest ) 
    235298    FilterMap filter =  (FilterMap) request.m_sFilter.split(',');
    236299
    237300    VERBOSE(VB_UPNP, QString("UPnpCDS::HandleBrowse ObjectID=%1, ContainerId=%2")
    238                              .arg(request.m_sObjectId)
    239                              .arg(request.m_sContainerID));
     301                     .arg(request.m_sObjectId)
     302                     .arg(request.m_sContainerID));
    240303
    241304    if (request.m_sObjectId == "0")
    242305    {
    void UPnpCDS::HandleBrowse( HTTPRequest *pRequest ) 
    281344                short nCount = Min( nTotalMatches, request.m_nRequestedCount );
    282345
    283346                UPnpCDSRequest       childRequest;
    284 
     347               
     348                DetermineClient( pRequest, &request );
    285349                childRequest.m_sParentId         = "0";
    286350                childRequest.m_eBrowseFlag       = CDS_BrowseMetadata;
    287351                childRequest.m_sFilter           = "";
    void UPnpCDS::HandleSearch( HTTPRequest *pRequest ) 
    389453    short         nUpdateID       = 0;
    390454    QString       sResultXML;
    391455
     456    DetermineClient( pRequest, &request );
    392457    request.m_sObjectId         = pRequest->m_mapParams[ "ObjectID"      ];
    393458    request.m_sContainerID      = pRequest->m_mapParams[ "ContainerID"   ];
    394459    request.m_sFilter           = pRequest->m_mapParams[ "Filter"        ];
    UPnpCDSExtensionResults *UPnpCDSExtension::ProcessRoot( UPnpCDSRequest 
    754819
    755820        case CDS_BrowseDirectChildren:
    756821        {
    757                 VERBOSE(VB_UPNP, "CDS_BrowseDirectChildren");
     822        VERBOSE(VB_UPNP, "CDS_BrowseDirectChildren");
    758823            pResults->m_nUpdateID     = 1;
    759824            pResults->m_nTotalMatches = nRootCount ;
    760825           
    UPnpCDSExtensionResults *UPnpCDSExtension::ProcessItem( 
    874939   // VERBOSE(VB_UPNP, QString("UPnpCDSExtension::ProcessItem : %1").arg(idPath
    875940    switch( pRequest->m_eBrowseFlag )
    876941    {
    877         case CDS_BrowseMetadata:
     942    case CDS_BrowseMetadata:
    878943        {
    879944            // --------------------------------------------------------------
    880945            // Return 1 Item
    UPnpCDSExtensionResults *UPnpCDSExtension::ProcessItem( 
    896961                {
    897962                    pRequest->m_sObjectId = RemoveToken( "/", pRequest->m_sObjectId, 1 );
    898963
    899                     AddItem( pRequest->m_sObjectId, pResults, false, query );
     964                    AddItem( pRequest, pRequest->m_sObjectId, pResults, false, query );
    900965                    pResults->m_nTotalMatches = 1;
    901966                }
    902967            }
    UPnpCDSExtensionResults *UPnpCDSExtension::ProcessKey( UPnpCDSRequest * 
    9881053
    9891054            case CDS_BrowseDirectChildren:
    9901055            {
    991                
     1056       
    9921057                CreateItems( pRequest, pResults, nNodeIdx, sKey, true );
    9931058
    9941059                break;
    void UPnpCDSExtension::CreateItems( UPnpCDSRequest *pRequest, 
    12291294        if (query.exec())
    12301295        {
    12311296            while(query.next())
    1232                 AddItem( pRequest->m_sObjectId, pResults, bAddRef, query );
     1297                AddItem( pRequest, pRequest->m_sObjectId, pResults, bAddRef, query );
    12331298
    12341299        }
    12351300    }
    12361301}
     1302
     1303// vim:ts=4:sw=4:ai:et:si:sts=4
  • mythtv/libs/libmythupnp/upnpcds.h

    diff --git a/mythtv/libs/libmythupnp/upnpcds.h b/mythtv/libs/libmythupnp/upnpcds.h
    index b645ef9..c6a882f 100644
    a b  
    2525#define UPnpCDS_H_
    2626
    2727#include <QList>
     28#include <QMap>
    2829#include <QObject>
    2930
    3031#include "upnp.h"
    typedef enum 
    5455
    5556} UPnpCDSBrowseFlag;
    5657
     58typedef enum
     59{
     60    CDS_ClientDefault         = 0,      // (no special attention required)
     61    CDS_ClientWMP             = 1,      // Windows Media Player
     62    CDS_ClientXBMC            = 2,      // XBMC
     63    CDS_ClientMP101           = 3,      // Netgear MP101
     64    CDS_ClientXBox            = 4,      // XBox 360
     65} UPnpCDSClient;
     66
     67typedef struct
     68{
     69    UPnpCDSClient   nClientType;
     70    QString         sClientId;
     71} UPnpCDSClientException;
     72
    5773//////////////////////////////////////////////////////////////////////////////
    5874
    5975class UPNP_PUBLIC UPnpCDSRequest
    class UPNP_PUBLIC UPnpCDSRequest 
    7995        QStringList       m_sSearchList;
    8096        QString           m_sSearchClass;
    8197
     98        // The device performing the request
     99        UPnpCDSClient     m_eClient;
     100        double            m_nClientVersion;
     101
    82102    public:
    83103
    84104        UPnpCDSRequest() : m_nStartingIndex ( 0 ),
    85105                           m_nRequestedCount( 0 ),
    86                            m_eBrowseFlag( CDS_BrowseUnknown )
     106                           m_eBrowseFlag( CDS_BrowseUnknown ),
     107                           m_eClient( CDS_ClientDefault ),
     108                           m_nClientVersion( 0 )
    87109        {
    88110        }
    89111};
    class UPNP_PUBLIC UPnpCDSExtension 
    183205        virtual QString          GetItemListSQL( QString sColumn = "" ) = 0;
    184206        virtual void             BuildItemQuery( MSqlQuery &query, const QStringMap &mapParams ) = 0;
    185207
    186         virtual void       AddItem( const QString           &sObjectId,
     208        virtual void       AddItem( const UPnpCDSRequest    *pRequest,
     209                                    const QString           &sObjectId,
    187210                                    UPnpCDSExtensionResults *pResults,
    188211                                    bool                     bAddRef,
    189212                                    MSqlQuery               &query )  = 0;
    class UPNP_PUBLIC UPnpCDS : public Eventing 
    246269        void            HandleGetSearchCapabilities( HTTPRequest *pRequest );
    247270        void            HandleGetSortCapabilities  ( HTTPRequest *pRequest );
    248271        void            HandleGetSystemUpdateID    ( HTTPRequest *pRequest );
     272        void            DetermineClient            ( HTTPRequest *pRequest, UPnpCDSRequest *pCDSRequest );
    249273
    250274    protected:
    251275
    class UPNP_PUBLIC UPnpCDS : public Eventing 
    269293};
    270294
    271295#endif
     296
     297// vim:ts=4:sw=4:ai:et:si:sts=4
  • mythtv/programs/mythbackend/upnpcdsmusic.cpp

    diff --git a/mythtv/programs/mythbackend/upnpcdsmusic.cpp b/mythtv/programs/mythbackend/upnpcdsmusic.cpp
    index 43fbe6a..930aa97 100644
    a b QString UPnpCDSMusic::GetTableName( QString sColumn ) 
    144144
    145145QString UPnpCDSMusic::GetItemListSQL( QString /* sColumn */ )
    146146{
    147     return "SELECT song.song_id as intid, artist.artist_name as artist, "         \
    148                "album.album_name as album, song.name as title, "                  \
    149                "genre.genre, song.year, song.track as tracknum, "                 \
    150                "song.description, song.filename, song.length "                    \
    151             "FROM music_songs song "                                              \
    152                " join music_artists artist on artist.artist_id = song.artist_id " \
    153                " join music_albums album on album.album_id = song.album_id "      \
    154                " join music_genres genre on  genre.genre_id = song.genre_id ";
     147    return "SELECT song.song_id as intid, artist.artist_name as artist, "     \
     148           "album.album_name as album, song.name as title, "                  \
     149           "genre.genre, song.year, song.track as tracknum, "                 \
     150           "song.description, song.filename, song.length "                    \
     151           "FROM music_songs song "                                           \
     152           " join music_artists artist on artist.artist_id = song.artist_id " \
     153           " join music_albums album on album.album_id = song.album_id "      \
     154           " join music_genres genre on  genre.genre_id = song.genre_id ";
    155155}
    156156
    157157/////////////////////////////////////////////////////////////////////////////
    void UPnpCDSMusic::BuildItemQuery( MSqlQuery &query, const QStringMap &mapParams 
    167167
    168168    query.prepare( sSQL );
    169169
    170     query.bindValue(":ID"   , (int)nId    );
     170    query.bindValue( ":ID", (int)nId );
    171171}
    172172
    173173/////////////////////////////////////////////////////////////////////////////
    bool UPnpCDSMusic::IsBrowseRequestForUs( UPnpCDSRequest *pRequest ) 
    182182
    183183    // Xbox360 compatibility code.
    184184
    185     if (pRequest->m_sContainerID == "7")
     185    if (pRequest->m_eClient == CDS_ClientXBox &&
     186        pRequest->m_sContainerID == "7")
    186187    {
    187188        pRequest->m_sObjectId = "Music";
    188189
    bool UPnpCDSMusic::IsBrowseRequestForUs( UPnpCDSRequest *pRequest ) 
    191192        return true;
    192193    }
    193194
    194     if ((pRequest->m_sObjectId.isEmpty()) && (!pRequest->m_sContainerID.isEmpty()))
     195    if ((pRequest->m_sObjectId.isEmpty()) &&
     196        (!pRequest->m_sContainerID.isEmpty()))
    195197        pRequest->m_sObjectId = pRequest->m_sContainerID;
    196198
    197199    VERBOSE( VB_UPNP, "UPnpCDSMusic::IsBrowseRequestForUs - Not sure... Calling base class." );
    bool UPnpCDSMusic::IsSearchRequestForUs( UPnpCDSRequest *pRequest ) 
    211213
    212214    // XBox 360 compatibility code
    213215
    214     if (pRequest->m_sContainerID == "7")
     216    if (pRequest->m_eClient == CDS_ClientXBox &&
     217        pRequest->m_sContainerID == "7")
    215218    {
    216219        pRequest->m_sObjectId       = "Music/1";
    217220        pRequest->m_sSearchCriteria = "object.container.album.musicAlbum";
    bool UPnpCDSMusic::IsSearchRequestForUs( UPnpCDSRequest *pRequest ) 
    233236        return true;
    234237    }
    235238
    236     if ((pRequest->m_sObjectId.isEmpty()) && (!pRequest->m_sContainerID.isEmpty()))
     239    if ((pRequest->m_sObjectId.isEmpty()) &&
     240        (!pRequest->m_sContainerID.isEmpty()))
    237241        pRequest->m_sObjectId = pRequest->m_sContainerID;
    238242
    239243    VERBOSE( VB_UPNP, "UPnpCDSMusic::IsSearchRequestForUs... Don't know, calling base class." );
    bool UPnpCDSMusic::IsSearchRequestForUs( UPnpCDSRequest *pRequest ) 
    245249//
    246250/////////////////////////////////////////////////////////////////////////////
    247251
    248 void UPnpCDSMusic::AddItem( const QString           &sObjectId,
     252void UPnpCDSMusic::AddItem( const UPnpCDSRequest    *pRequest,
     253                            const QString           &sObjectId,
    249254                            UPnpCDSExtensionResults *pResults,
    250255                            bool                     bAddRef,
    251256                            MSqlQuery               &query )
    void UPnpCDSMusic::AddItem( const QString &sObjectId, 
    303308                            .arg( nId );
    304309
    305310
    306     QString sId        = QString( "%1/item%2")
    307                             .arg( sObjectId )
     311    QString sId        = QString( "Music/1/item%1")
    308312                            .arg( sURIParams );
    309313
    310314    CDSObject *pItem   = CDSObject::CreateMusicTrack( sId,
    void UPnpCDSMusic::AddItem( const QString &sObjectId, 
    374378    pRes->AddAttribute( "duration"  , sDur      );
    375379}
    376380
     381// vim:ts=4:sw=4:ai:et:si:sts=4
  • mythtv/programs/mythbackend/upnpcdsmusic.h

    diff --git a/mythtv/programs/mythbackend/upnpcdsmusic.h b/mythtv/programs/mythbackend/upnpcdsmusic.h
    index d73c2cb..5cc28a6 100644
    a b class UPnpCDSMusic : public UPnpCDSExtension 
    3939        virtual void             BuildItemQuery( MSqlQuery        &query,
    4040                                                 const QStringMap &mapParams );
    4141
    42         virtual void             AddItem( const QString           &sObjectId,
     42        virtual void             AddItem( const UPnpCDSRequest    *pRequest,
     43                                          const QString           &sObjectId,
    4344                                          UPnpCDSExtensionResults *pResults,
    4445                                          bool                     bAddRef,
    4546                                          MSqlQuery               &query );
  • mythtv/programs/mythbackend/upnpcdstv.cpp

    diff --git a/mythtv/programs/mythbackend/upnpcdstv.cpp b/mythtv/programs/mythbackend/upnpcdstv.cpp
    index 2fbd5f3..f02f9ff 100644
    a b bool UPnpCDSTv::IsBrowseRequestForUs( UPnpCDSRequest *pRequest ) 
    180180    // See if we need to modify the request for compatibility
    181181    // ----------------------------------------------------------------------
    182182
    183     // WMP11 compatibility code
     183    // ----------------------------------------------------------------------
     184    // Xbox360 compatibility code.
     185    // ----------------------------------------------------------------------
    184186
    185     if (( pRequest->m_sObjectId                  == "13") &&
    186         ( gCoreContext->GetSetting("UPnP/WMPSource") !=  "1") )
     187    if (pRequest->m_eClient == CDS_ClientXBox &&
     188        pRequest->m_sContainerID == "15" &&
     189        gCoreContext->GetSetting("UPnP/WMPSource") != "1")
     190    {
     191        pRequest->m_sObjectId = "Videos/0";
     192
     193        VERBOSE( VB_UPNP, "UPnpCDSTv::IsBrowseRequestForUs - Yes ContainerID == 15" );
     194        return true;
     195    }
     196
     197    // ----------------------------------------------------------------------
     198    // WMP11 compatibility code
     199    // ----------------------------------------------------------------------
     200    if (pRequest->m_eClient == CDS_ClientWMP &&
     201        pRequest->m_nClientVersion < 12.0 &&
     202        pRequest->m_sContainerID == "13" &&
     203        gCoreContext->GetSetting("UPnP/WMPSource") != "1")
    187204    {
    188205        pRequest->m_sObjectId = "RecTv/0";
    189206
    bool UPnpCDSTv::IsSearchRequestForUs( UPnpCDSRequest *pRequest ) 
    210227    // XBox 360 compatibility code
    211228    // ----------------------------------------------------------------------
    212229
    213     if ((pRequest->m_sObjectId.isEmpty()) && (!pRequest->m_sContainerID.isEmpty()))
     230    if (pRequest->m_eClient == CDS_ClientXBox &&
     231        pRequest->m_sContainerID == "15" &&
     232        gCoreContext->GetSetting("UPnP/WMPSource") !=  "1")
     233    {
     234        pRequest->m_sObjectId = "Videos/0";
     235
     236        VERBOSE( VB_UPNP, "UPnpCDSTv::IsSearchRequestForUs... Yes." );
     237
     238        return true;
     239    }
     240
     241
     242    if ((pRequest->m_sObjectId.isEmpty()) &&
     243        (!pRequest->m_sContainerID.isEmpty()))
    214244        pRequest->m_sObjectId = pRequest->m_sContainerID;
    215245
    216246    // ----------------------------------------------------------------------
    bool UPnpCDSTv::IsSearchRequestForUs( UPnpCDSRequest *pRequest ) 
    219249
    220250    // ----------------------------------------------------------------------
    221251    // WMP11 compatibility code
     252    //
     253    // In this mode browsing for "Videos" is forced to either RecordedTV (us)
     254    // or Videos (handled by upnpcdsvideo)
     255    //
    222256    // ----------------------------------------------------------------------
    223257
    224     if ( bOurs && ( pRequest->m_sObjectId == "0" ))
     258    if ( bOurs && pRequest->m_eClient == CDS_ClientWMP &&
     259         pRequest->m_nClientVersion < 12.0)
    225260    {
    226         if ( gCoreContext->GetSetting("UPnP/WMPSource") != "1") // GetBoolSetting()?
     261        // GetBoolSetting()?
     262        if ( gCoreContext->GetSetting("UPnP/WMPSource") != "1")
    227263        {
    228264            pRequest->m_sObjectId = "RecTv/0";
    229             pRequest->m_sParentId = '8';        // -=>TODO: Not sure why this was added
     265            // -=>TODO: Not sure why this was added
     266            pRequest->m_sParentId = '8';       
    230267        }
    231268        else
    232269            bOurs = false;
    bool UPnpCDSTv::IsSearchRequestForUs( UPnpCDSRequest *pRequest ) 
    239276//
    240277/////////////////////////////////////////////////////////////////////////////
    241278
    242 void UPnpCDSTv::AddItem( const QString           &sObjectId,
     279void UPnpCDSTv::AddItem( const UPnpCDSRequest    *pRequest,
     280                         const QString           &sObjectId,
    243281                         UPnpCDSExtensionResults *pResults,
    244282                         bool                     bAddRef,
    245283                         MSqlQuery               &query )
    void UPnpCDSTv::AddItem( const QString &sObjectId, 
    284322                            .arg( nChanid )
    285323                            .arg( dtStartTime.toString(Qt::ISODate));
    286324
    287     QString sId        = QString( "%1/item%2")
    288                             .arg( sObjectId )
     325    QString sId        = QString( "RecTv/0/item%1")
    289326                            .arg( sURIParams );
    290327
    291328    CDSObject *pItem   = CDSObject::CreateVideoItem( sId,
    void UPnpCDSTv::AddItem( const QString &sObjectId, 
    344381        sMimeType = HTTPRequest::TestMimeType( sBaseName );
    345382
    346383
     384    // If we are dealing with Window Media Player 12 (i.e. Windows 7)
     385    // then fake the Mime type to place the recorded TV in the
     386    // recorded TV section.
     387    if (pRequest->m_eClient == CDS_ClientWMP && pRequest->m_nClientVersion >= 12.0)
     388    {
     389        sMimeType = "video/x-ms-dvr";
     390    }
     391
    347392    // DLNA string below is temp fix for ps3 seeking.
    348393    QString sProtocol = QString( "http-get:*:%1:DLNA.ORG_OP=01;DLNA.ORG_CI=0;DLNA.ORG_FLAGS=01500000000000000000000000000000" ).arg( sMimeType  );
    349394    QString sURI      = QString( "%1GetRecording%2").arg( sURIBase   )
    void UPnpCDSTv::AddItem( const QString &sObjectId, 
    401446
    402447}
    403448
     449// vim:ts=4:sw=4:ai:et:si:sts=4
  • mythtv/programs/mythbackend/upnpcdstv.h

    diff --git a/mythtv/programs/mythbackend/upnpcdstv.h b/mythtv/programs/mythbackend/upnpcdstv.h
    index 567ae66..9b4e620 100644
    a b class UPnpCDSTv : public UPnpCDSExtension 
    4040        virtual void             BuildItemQuery( MSqlQuery        &query,
    4141                                                 const QStringMap &mapParams );
    4242
    43         virtual void             AddItem( const QString           &sObjectId,
     43        virtual void             AddItem( const UPnpCDSRequest    *pRequest,
     44                                          const QString           &sObjectId,
    4445                                          UPnpCDSExtensionResults *pResults,
    4546                                          bool                     bAddRef,
    4647                                          MSqlQuery               &query );
  • mythtv/programs/mythbackend/upnpcdsvideo.cpp

    diff --git a/mythtv/programs/mythbackend/upnpcdsvideo.cpp b/mythtv/programs/mythbackend/upnpcdsvideo.cpp
    index 859e6ea..d204e21 100644
    a b QString UPnpCDSVideo::GetTableName( QString sColumn ) 
    7777QString UPnpCDSVideo::GetItemListSQL( QString sColumn )
    7878{
    7979    return "SELECT intid, title, filepath, " \
    80        "itemtype, itemproperties, parentid, "\
     80           "itemtype, itemproperties, parentid, "\
    8181           "coverart FROM upnpmedia WHERE class = 'VIDEO'";
    8282}
    8383
    bool UPnpCDSVideo::IsBrowseRequestForUs( UPnpCDSRequest *pRequest ) 
    111111    // Xbox360 compatibility code.
    112112    // ----------------------------------------------------------------------
    113113
    114     if (pRequest->m_sContainerID == "15")
     114    if (pRequest->m_eClient == CDS_ClientXBox &&
     115        pRequest->m_sContainerID == "15" &&
     116        gCoreContext->GetSetting("UPnP/WMPSource") == "1")
    115117    {
    116118        pRequest->m_sObjectId = "Videos/0";
    117119
    bool UPnpCDSVideo::IsBrowseRequestForUs( UPnpCDSRequest *pRequest ) 
    119121        return true;
    120122    }
    121123
    122     if ((pRequest->m_sObjectId.isEmpty()) && (!pRequest->m_sContainerID.isEmpty()))
     124    if ((pRequest->m_sObjectId.isEmpty()) &&
     125        (!pRequest->m_sContainerID.isEmpty()))
    123126        pRequest->m_sObjectId = pRequest->m_sContainerID;
    124127
    125128    // ----------------------------------------------------------------------
    126129    // WMP11 compatibility code
     130    //
     131    // In this mode browsing for "Videos" is forced to either Videos (us)
     132    // or RecordedTV (handled by upnpcdstv)
     133    //
    127134    // ----------------------------------------------------------------------
    128135
    129     if (( pRequest->m_sObjectId                  == "13") &&
    130         ( gCoreContext->GetSetting("UPnP/WMPSource") ==  "1"))
     136    if (pRequest->m_eClient == CDS_ClientWMP &&
     137        pRequest->m_sContainerID == "13" &&
     138        pRequest->m_nClientVersion < 12.0 &&
     139        gCoreContext->GetSetting("UPnP/WMPSource") == "1")
    131140    {
    132141        pRequest->m_sObjectId = "Videos/0";
    133142
    bool UPnpCDSVideo::IsSearchRequestForUs( UPnpCDSRequest *pRequest ) 
    154163    // XBox 360 compatibility code
    155164    // ----------------------------------------------------------------------
    156165
    157     if (pRequest->m_sContainerID == "15")
     166
     167    if (pRequest->m_eClient == CDS_ClientXBox &&
     168        pRequest->m_sContainerID == "15" &&
     169        gCoreContext->GetSetting("UPnP/WMPSource") == "1")
    158170    {
    159171        pRequest->m_sObjectId = "Videos/0";
    160172
    bool UPnpCDSVideo::IsSearchRequestForUs( UPnpCDSRequest *pRequest ) 
    163175        return true;
    164176    }
    165177
    166     if ((pRequest->m_sObjectId.isEmpty()) && (!pRequest->m_sContainerID.isEmpty()))
     178    if ((pRequest->m_sObjectId.isEmpty()) &&
     179        (!pRequest->m_sContainerID.isEmpty()))
    167180        pRequest->m_sObjectId = pRequest->m_sContainerID;
    168181
    169182    // ----------------------------------------------------------------------
    bool UPnpCDSVideo::IsSearchRequestForUs( UPnpCDSRequest *pRequest ) 
    174187    // WMP11 compatibility code
    175188    // ----------------------------------------------------------------------
    176189
    177     if (  bOurs && ( pRequest->m_sObjectId == "0"))
     190    if ( bOurs && pRequest->m_eClient == CDS_ClientWMP &&
     191         pRequest->m_nClientVersion < 12.0 )
    178192    {
    179 
    180         if ( gCoreContext->GetSetting("UPnP/WMPSource") == "1") // GetBoolSetting()?
     193        if ( gCoreContext->GetSetting("UPnP/WMPSource") == "1")
    181194        {
    182195            pRequest->m_sObjectId = "Videos/0";
    183             pRequest->m_sParentId = '8';        // -=>TODO: Not sure why this was added.
     196            // -=>TODO: Not sure why this was added.
     197            pRequest->m_sParentId = "8";
    184198        }
    185199        else
    186200            bOurs = false;
    UPnpCDSExtensionResults *UPnpCDSVideo::ProcessItem( UPnpCDSRequest *pRe 
    253267
    254268                if (query.exec() && query.next())
    255269                {
    256                         AddItem( pRequest->m_sParentId, pResults, false, query );
     270                        AddItem( pRequest, pRequest->m_sParentId, pResults, false, query );
    257271                        pResults->m_nTotalMatches = 1;
    258272                }
    259273            }
    void UPnpCDSVideo::CreateItems( UPnpCDSRequest *pRequest, 
    364378        if (query.exec())
    365379        {
    366380            while(query.next())
    367                 AddItem( pRequest->m_sObjectId, pResults, bAddRef, query );
     381                AddItem( pRequest, pRequest->m_sObjectId, pResults, bAddRef, query );
    368382
    369383        }
    370384    }
    void UPnpCDSVideo::CreateItems( UPnpCDSRequest *pRequest, 
    374388//
    375389/////////////////////////////////////////////////////////////////////////////
    376390
    377 void UPnpCDSVideo::AddItem( const QString           &sObjectId,
     391void UPnpCDSVideo::AddItem( const UPnpCDSRequest    *pRequest,
     392                            const QString           &sObjectId,
    378393                            UPnpCDSExtensionResults *pResults,
    379394                            bool                     bAddRef,
    380395                            MSqlQuery               &query )
    void UPnpCDSVideo::AddItem( const QString &sObjectId, 
    484499    pRes->AddAttribute( "duration"  , "0:01:00.000"      );
    485500
    486501}
     502
     503// vim:ts=4:sw=4:ai:et:si:sts=4
  • mythtv/programs/mythbackend/upnpcdsvideo.h

    diff --git a/mythtv/programs/mythbackend/upnpcdsvideo.h b/mythtv/programs/mythbackend/upnpcdsvideo.h
    index eeac9f0..074e344 100644
    a b class UPnpCDSVideo : public UPnpCDSExtension 
    5454        virtual void             BuildItemQuery( MSqlQuery        &query,
    5555                                                 const QStringMap &mapParams );
    5656
    57         virtual void             AddItem( const QString           &sObjectId,
     57                                                 
     58        virtual void             AddItem( const UPnpCDSRequest    *pRequest,
     59                                          const QString           &sObjectId,
    5860                                          UPnpCDSExtensionResults *pResults,
    5961                                          bool                     bAddRef,
    6062                                          MSqlQuery               &query );