Ticket #8763: upnp-wmp12.patch

File upnp-wmp12.patch, 17.9 KB (added by mattpyne@…, 9 years ago)

Patch for UPnP wmp12 support

  • libs/libmythupnp/upnpcds.h

     
    5454
    5555} UPnpCDSBrowseFlag;
    5656
     57typedef enum
     58{
     59    CDS_ClientDefault             = 0,          // Unknown client (no special attention required)
     60    CDS_ClientWMP                         = 1,          // Windows Media Player
     61    CDS_ClientXBMC                        = 2,          // XBMC
     62    CDS_ClientMP101                       = 3,          // Netgear MP101
     63    CDS_ClientXBox            = 4,              // XBox 360
     64} UPnpCDSClient;
     65
    5766//////////////////////////////////////////////////////////////////////////////
    5867
    5968class UPNP_PUBLIC UPnpCDSRequest
     
    7988        QStringList       m_sSearchList;
    8089        QString           m_sSearchClass;
    8190
     91        // The device performing the request
     92                UPnpCDSClient     m_eClient;
     93                double                    m_nClientVersion;
     94
    8295    public:
    8396
    8497        UPnpCDSRequest() : m_nStartingIndex ( 0 ),
    8598                           m_nRequestedCount( 0 ),
    86                            m_eBrowseFlag( CDS_BrowseUnknown )
     99                           m_eBrowseFlag( CDS_BrowseUnknown ),
     100                           m_eClient( CDS_ClientDefault ),
     101                           m_nClientVersion( 0 )
    87102        {
    88103        }
    89104};
     
    183198        virtual QString          GetItemListSQL( QString sColumn = "" ) = 0;
    184199        virtual void             BuildItemQuery( MSqlQuery &query, const QStringMap &mapParams ) = 0;
    185200
    186         virtual void       AddItem( const QString           &sObjectId,
     201        virtual void       AddItem( const UPnpCDSRequest    *pRequest,
     202                                                                        const QString           &sObjectId,
    187203                                    UPnpCDSExtensionResults *pResults,
    188204                                    bool                     bAddRef,
    189205                                    MSqlQuery               &query )  = 0;
     
    246262        void            HandleGetSearchCapabilities( HTTPRequest *pRequest );
    247263        void            HandleGetSortCapabilities  ( HTTPRequest *pRequest );
    248264        void            HandleGetSystemUpdateID    ( HTTPRequest *pRequest );
     265                void            DetermineClient            ( HTTPRequest *pRequest, UPnpCDSRequest *pCDSRequest );
    249266
    250267    protected:
    251268
  • libs/libmythupnp/httprequest.cpp

     
    375375
    376376            // Adjust ranges that are too long. 
    377377
    378             if (llEnd > llSize)
    379                 llEnd = llSize;
     378            if (llEnd > llSize-1)
     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                {
  • libs/libmythupnp/upnpcds.cpp

     
    188188
    189189}
    190190
     191void UPnpCDS::DetermineClient( HTTPRequest *pRequest, UPnpCDSRequest *pCDSRequest )
     192{
     193    QString sUserAgent = pRequest->GetHeaderValue( "User-Agent", "" );
     194
     195        const char *client_name[]               =
     196                          { "Windows-Media-Player",                                                             // Window Media Player version 12
     197                            "Mozilla/4.0 (compatible; UPnP/1.0; Windows 9x",    // Window Media Player < 12
     198                                "Platinum",                                                                                     // XBMC
     199                                "Xbox"                                                                                          // XBox 360
     200        };             
     201        const UPnpCDSClient client_id[] = { CDS_ClientWMP, CDS_ClientWMP, CDS_ClientXBMC, CDS_ClientXBox };
     202
     203        pCDSRequest->m_eClient = CDS_ClientDefault;
     204        pCDSRequest->m_nClientVersion = 0;
     205
     206        // Do we know this client string?
     207        for ( uint i = 0; i < sizeof(client_name) / sizeof(client_name[0]); ++ i)
     208        {
     209                int idx = sUserAgent.indexOf(client_name[i]);
     210                if (idx != -1)
     211                {
     212                        pCDSRequest->m_eClient = client_id[i];
     213
     214                        // Now find the version number
     215                        QString version = sUserAgent.mid( idx + strlen( client_name[i] ) + 1 ).trimmed();
     216                        idx = version.indexOf( '.' );
     217                        if (idx != -1)
     218                        {
     219                                idx = version.indexOf( '.', idx + 1 );
     220                        }
     221                        if (idx != -1)
     222                        {
     223                                version = version.left( idx );
     224                        }
     225                        idx = version.indexOf( ' ' );
     226                        if (idx != -1)
     227                        {
     228                                version = version.left( idx );
     229                        }
     230
     231                        pCDSRequest->m_nClientVersion = version.toDouble();
     232
     233                        break;
     234                }
     235        }
     236
     237        VERBOSE(VB_UPNP, QString("UPnpCDS::DetermineClient User-Agent:%1 Indentified as %2 version %3")
     238                             .arg(sUserAgent)
     239                                         .arg(pCDSRequest->m_eClient)
     240                                         .arg(pCDSRequest->m_nClientVersion) );
     241
     242}
     243
     244
    191245/////////////////////////////////////////////////////////////////////////////
    192246//
    193247/////////////////////////////////////////////////////////////////////////////
     
    197251    UPnpCDSExtensionResults *pResult  = NULL;
    198252    UPnpCDSRequest           request;
    199253
     254        DetermineClient( pRequest, &request );
    200255    request.m_sObjectId         = pRequest->m_mapParams[ "ObjectID"      ];
    201256    request.m_sContainerID      = pRequest->m_mapParams[ "ContainerID"   ];
    202257    request.m_sParentId         = "0";
     
    281336                short nCount = Min( nTotalMatches, request.m_nRequestedCount );
    282337
    283338                UPnpCDSRequest       childRequest;
    284 
     339               
     340                DetermineClient( pRequest, &request );
    285341                childRequest.m_sParentId         = "0";
    286342                childRequest.m_eBrowseFlag       = CDS_BrowseMetadata;
    287343                childRequest.m_sFilter           = "";
     
    389445    short         nUpdateID       = 0;
    390446    QString       sResultXML;
    391447
     448    DetermineClient( pRequest, &request );
    392449    request.m_sObjectId         = pRequest->m_mapParams[ "ObjectID"      ];
    393450    request.m_sContainerID      = pRequest->m_mapParams[ "ContainerID"   ];
    394451    request.m_sFilter           = pRequest->m_mapParams[ "Filter"        ];
     
    896953                {
    897954                    pRequest->m_sObjectId = RemoveToken( "/", pRequest->m_sObjectId, 1 );
    898955
    899                     AddItem( pRequest->m_sObjectId, pResults, false, query );
     956                    AddItem( pRequest, pRequest->m_sObjectId, pResults, false, query );
    900957                    pResults->m_nTotalMatches = 1;
    901958                }
    902959            }
     
    12291286        if (query.exec())
    12301287        {
    12311288            while(query.next())
    1232                 AddItem( pRequest->m_sObjectId, pResults, bAddRef, query );
     1289                AddItem( pRequest, pRequest->m_sObjectId, pResults, bAddRef, query );
    12331290
    12341291        }
    12351292    }
  • programs/mythbackend/upnpcdsvideo.h

     
    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 );
  • programs/mythbackend/upnpcdsmusic.h

     
    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 );
  • programs/mythbackend/upnpcdstv.cpp

     
    180180    // See if we need to modify the request for compatibility
    181181    // ----------------------------------------------------------------------
    182182
     183    // ----------------------------------------------------------------------
     184    // Xbox360 compatibility code.
     185    // ----------------------------------------------------------------------
     186
     187    if (pRequest->m_eClient == CDS_ClientXBox && pRequest->m_sContainerID == "15" &&
     188        gCoreContext->GetSetting("UPnP/WMPSource") !=  "1")
     189    {
     190        pRequest->m_sObjectId = "Videos/0";
     191
     192        VERBOSE( VB_UPNP, "UPnpCDSTv::IsBrowseRequestForUs - Yes ContainerID == 15" );
     193        return true;
     194    }
     195
     196
     197    // ----------------------------------------------------------------------
    183198    // WMP11 compatibility code
    184 
    185     if (( pRequest->m_sObjectId                  == "13") &&
     199    // ----------------------------------------------------------------------
     200    if (( pRequest->m_eClient == CDS_ClientWMP && pRequest->m_nClientVersion < 12.0) &&
    186201        ( gCoreContext->GetSetting("UPnP/WMPSource") !=  "1") )
    187202    {
    188203        pRequest->m_sObjectId = "RecTv/0";
     
    210225    // XBox 360 compatibility code
    211226    // ----------------------------------------------------------------------
    212227
     228        if (pRequest->m_eClient == CDS_ClientXBox && pRequest->m_sContainerID == "15" &&
     229        gCoreContext->GetSetting("UPnP/WMPSource") !=  "1")
     230    {
     231        pRequest->m_sObjectId = "Videos/0";
     232
     233        VERBOSE( VB_UPNP, "UPnpCDSTv::IsSearchRequestForUs... Yes." );
     234
     235        return true;
     236    }
     237
     238
    213239    if ((pRequest->m_sObjectId.isEmpty()) && (!pRequest->m_sContainerID.isEmpty()))
    214240        pRequest->m_sObjectId = pRequest->m_sContainerID;
    215241
     
    219245
    220246    // ----------------------------------------------------------------------
    221247    // WMP11 compatibility code
     248        //
     249        // In this mode browsing for "Videos" is forced to either RecordedTV (us)
     250        // or Videos (handled by upnpcdsvideo)
     251        //
    222252    // ----------------------------------------------------------------------
    223253
    224     if ( bOurs && ( pRequest->m_sObjectId == "0" ))
     254    if ( bOurs && pRequest->m_eClient == CDS_ClientWMP && pRequest->m_nClientVersion < 12.0)
    225255    {
    226256        if ( gCoreContext->GetSetting("UPnP/WMPSource") != "1") // GetBoolSetting()?
    227257        {
     
    239269//
    240270/////////////////////////////////////////////////////////////////////////////
    241271
    242 void UPnpCDSTv::AddItem( const QString           &sObjectId,
     272void UPnpCDSTv::AddItem( const UPnpCDSRequest    *pRequest,
     273                                                 const QString           &sObjectId,
    243274                         UPnpCDSExtensionResults *pResults,
    244275                         bool                     bAddRef,
    245276                         MSqlQuery               &query )
     
    284315                            .arg( nChanid )
    285316                            .arg( dtStartTime.toString(Qt::ISODate));
    286317
    287     QString sId        = QString( "%1/item%2")
    288                             .arg( sObjectId )
     318    QString sId        = QString( "RecTv/0/item%1")
    289319                            .arg( sURIParams );
    290320
    291321    CDSObject *pItem   = CDSObject::CreateVideoItem( sId,
     
    343373        sMimeType = HTTPRequest::TestMimeType( sBaseName );
    344374
    345375
     376    // If we are dealing with Window Media Player 12 (i.e. Windows 7)
     377    // then fake the Mime type to place the recorded TV in the
     378    // recorded TV section.
     379    if (pRequest->m_eClient == CDS_ClientWMP && pRequest->m_nClientVersion >= 12.0)
     380    {
     381        sMimeType = "video/x-ms-dvr";
     382    }
     383
    346384    // DLNA string below is temp fix for ps3 seeking.
    347385    QString sProtocol = QString( "http-get:*:%1:DLNA.ORG_OP=01;DLNA.ORG_CI=0;DLNA.ORG_FLAGS=01500000000000000000000000000000" ).arg( sMimeType  );
    348386    QString sURI      = QString( "%1GetRecording%2").arg( sURIBase   )
  • programs/mythbackend/upnpcdsvideo.cpp

     
    111111    // Xbox360 compatibility code.
    112112    // ----------------------------------------------------------------------
    113113
    114     if (pRequest->m_sContainerID == "15")
     114    if (pRequest->m_eClient == CDS_ClientXBox && pRequest->m_sContainerID == "15" &&
     115        gCoreContext->GetSetting("UPnP/WMPSource") ==  "1")
    115116    {
    116117        pRequest->m_sObjectId = "Videos/0";
    117118
     
    124125
    125126    // ----------------------------------------------------------------------
    126127    // WMP11 compatibility code
     128        //
     129        // In this mode browsing for "Videos" is forced to either Videos (us)
     130        // or RecordedTV (handled by upnpcdstv)
     131        //
    127132    // ----------------------------------------------------------------------
    128133
    129     if (( pRequest->m_sObjectId                  == "13") &&
     134    if (( pRequest->m_eClient == CDS_ClientWMP && pRequest->m_nClientVersion < 12.0) &&
    130135        ( gCoreContext->GetSetting("UPnP/WMPSource") ==  "1"))
    131136    {
    132137        pRequest->m_sObjectId = "Videos/0";
     
    154159    // XBox 360 compatibility code
    155160    // ----------------------------------------------------------------------
    156161
    157     if (pRequest->m_sContainerID == "15")
     162
     163        if (pRequest->m_eClient == CDS_ClientXBox && pRequest->m_sContainerID == "15" &&
     164        gCoreContext->GetSetting("UPnP/WMPSource") ==  "1")
    158165    {
    159166        pRequest->m_sObjectId = "Videos/0";
    160167
     
    174181    // WMP11 compatibility code
    175182    // ----------------------------------------------------------------------
    176183
    177     if (  bOurs && ( pRequest->m_sObjectId == "0"))
     184    if (  bOurs && pRequest->m_eClient == CDS_ClientWMP && pRequest->m_nClientVersion < 12.0)
    178185    {
    179 
    180         if ( gCoreContext->GetSetting("UPnP/WMPSource") == "1") // GetBoolSetting()?
     186        if ( gCoreContext->GetSetting("UPnP/WMPSource") == "1")
    181187        {
    182188            pRequest->m_sObjectId = "Videos/0";
    183             pRequest->m_sParentId = '8';        // -=>TODO: Not sure why this was added.
     189            pRequest->m_sParentId = "8";        // -=>TODO: Not sure why this was added.
    184190        }
    185191        else
    186192            bOurs = false;
     
    253259
    254260                if (query.exec() && query.next())
    255261                {
    256                         AddItem( pRequest->m_sParentId, pResults, false, query );
     262                        AddItem( pRequest, pRequest->m_sParentId, pResults, false, query );
    257263                        pResults->m_nTotalMatches = 1;
    258264                }
    259265            }
     
    364370        if (query.exec())
    365371        {
    366372            while(query.next())
    367                 AddItem( pRequest->m_sObjectId, pResults, bAddRef, query );
     373                AddItem( pRequest, pRequest->m_sObjectId, pResults, bAddRef, query );
    368374
    369375        }
    370376    }
     
    374380//
    375381/////////////////////////////////////////////////////////////////////////////
    376382
    377 void UPnpCDSVideo::AddItem( const QString           &sObjectId,
     383void UPnpCDSVideo::AddItem( const UPnpCDSRequest    *pRequest,
     384                            const QString           &sObjectId,
    378385                            UPnpCDSExtensionResults *pResults,
    379386                            bool                     bAddRef,
    380387                            MSqlQuery               &query )
  • programs/mythbackend/upnpcdsmusic.cpp

     
    182182
    183183    // Xbox360 compatibility code.
    184184
    185     if (pRequest->m_sContainerID == "7")
     185    if (pRequest->m_eClient == CDS_ClientXBox && pRequest->m_sContainerID == "7")
    186186    {
    187187        pRequest->m_sObjectId = "Music";
    188188
     
    211211
    212212    // XBox 360 compatibility code
    213213
    214     if (pRequest->m_sContainerID == "7")
     214    if (pRequest->m_eClient == CDS_ClientXBox && pRequest->m_sContainerID == "7")
    215215    {
    216216        pRequest->m_sObjectId       = "Music/1";
    217217        pRequest->m_sSearchCriteria = "object.container.album.musicAlbum";
     
    245245//
    246246/////////////////////////////////////////////////////////////////////////////
    247247
    248 void UPnpCDSMusic::AddItem( const QString           &sObjectId,
     248void UPnpCDSMusic::AddItem( const UPnpCDSRequest    *pRequest,
     249                                                    const QString           &sObjectId,
    249250                            UPnpCDSExtensionResults *pResults,
    250251                            bool                     bAddRef,
    251252                            MSqlQuery               &query )
     
    303304                            .arg( nId );
    304305
    305306
    306     QString sId        = QString( "%1/item%2")
    307                             .arg( sObjectId )
     307    QString sId        = QString( "Music/1/item%1")
    308308                            .arg( sURIParams );
    309309
    310310    CDSObject *pItem   = CDSObject::CreateMusicTrack( sId,
  • programs/mythbackend/upnpcdstv.h

     
    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 );