Ticket #9632: xbox360upnp.diff

File xbox360upnp.diff, 13.7 KB (added by Joe Bryant <tenminjoe@…>, 13 years ago)

Revised diff, this time against latest git source

  • mythtv/libs/libmythupnp/upnpcds.cpp

    diff --git mythtv/libs/libmythupnp/upnpcds.cpp mythtv/libs/libmythupnp/upnpcds.cpp
    index eadf9e7..046d74a 100644
    void UPnpCDS::HandleSearch( HTTPRequest *pRequest ) 
    531531    // ----------------------------------------------------------------------
    532532    // -=>TODO: Need to process all expressions in searchCriteria... for now,
    533533    //          Just focus on the "upnp:class derivedfrom" expression
     534    //          and the "upnp:class =" expression
    534535    // ----------------------------------------------------------------------
    535536
    536537    for ( QStringList::Iterator it  = request.m_sSearchList.begin();
    537538                                it != request.m_sSearchList.end();
    538539                              ++it )
    539540    {
    540         if ((*it).contains("upnp:class derivedfrom", Qt::CaseInsensitive))
     541        if ((*it).contains("upnp:class derivedfrom", Qt::CaseInsensitive) ||
     542            (*it).contains("upnp:class =", Qt::CaseInsensitive))
    541543        {
    542544            QStringList sParts = (*it).split(' ', QString::SkipEmptyParts);
    543545
    void UPnpCDS::HandleSearch( HTTPRequest *pRequest ) 
    545547            {
    546548                request.m_sSearchClass = sParts[2].trimmed();
    547549                request.m_sSearchClass.remove( '"' );
     550                request.m_sSearchClass.remove( ')' );
    548551
    549552                break;
    550553            }
    UPnpCDSExtensionResults *UPnpCDSExtension::Search( UPnpCDSRequest *pRequest ) 
    822825
    823826    UPnpCDSExtensionResults *pResults = new UPnpCDSExtensionResults();
    824827
    825     CreateItems( pRequest, pResults, 0, "", false );
     828    QString sKey = "";
     829    if (IsOurContainerPrefix(pRequest->m_sContainerID))
     830    {
     831        sKey = RemoveContainerPrefix(pRequest->m_sContainerID);
     832    }
     833    CreateItems( pRequest, pResults, 0, sKey, false );
    826834
    827835    return pResults;
    828836}
    void UPnpCDSExtension::CreateItems( UPnpCDSRequest *pRequest, 
    13241332    pResults->m_nTotalMatches = 0;
    13251333    pResults->m_nUpdateID     = 1;
    13261334
    1327     UPnpCDSRootInfo *pInfo = GetRootInfo( nNodeIdx );
     1335    UPnpCDSRootInfo *pInfo = GetRootInfo( nNodeIdx, pRequest->m_sContainerID );
    13281336
    13291337    if (pInfo == NULL)
    13301338        return;
  • mythtv/libs/libmythupnp/upnpcds.h

    diff --git mythtv/libs/libmythupnp/upnpcds.h mythtv/libs/libmythupnp/upnpcds.h
    index 446f232..30bf8d0 100644
    class UPNP_PUBLIC UPnpCDSExtension 
    167167
    168168    protected:
    169169
     170        virtual bool IsOurContainerPrefix(QString sContainerID) { return false; };
     171        virtual QString RemoveContainerPrefix(QString sContainerID) { return sContainerID; };
    170172        QString RemoveToken ( const QString &sToken, const QString &sStr, int num );
    171173
    172174        virtual UPnpCDSExtensionResults *ProcessRoot     ( UPnpCDSRequest          *pRequest,
    class UPNP_PUBLIC UPnpCDSExtension 
    202204
    203205        // ------------------------------------------------------------------
    204206
    205         virtual UPnpCDSRootInfo *GetRootInfo   ( int nIdx) = 0;
     207        virtual UPnpCDSRootInfo *GetRootInfo   ( int nIdx, QString sContainerId = "" ) = 0;
    206208        virtual int              GetRootCount  ( )         = 0;
    207209        virtual QString          GetTableName  ( QString sColumn      ) = 0;
    208210        virtual QString          GetItemListSQL( QString sColumn = "" ) = 0;
  • mythtv/programs/mythbackend/mediaserver.cpp

    diff --git mythtv/programs/mythbackend/mediaserver.cpp mythtv/programs/mythbackend/mediaserver.cpp
    index c039017..0c2946a 100644
     
    1616#include "upnpcdstv.h"
    1717#include "upnpcdsmusic.h"
    1818#include "upnpcdsvideo.h"
     19#include "upnpcdsmusicalbum.h"
    1920
    2021#include <QScriptEngine>
    2122
    void MediaServer::Init(bool bIsMaster, bool bDisableUPnp /* = FALSE */) 
    229230                "MediaServer::Registering UPnpCDSVideo Extension");
    230231
    231232            RegisterExtension(new UPnpCDSVideo());
     233
     234            LOG(VB_UPNP, LOG_INFO,
     235                "MediaServer::Registering UPnpCDSMusicAlbum Extension");
     236
     237            RegisterExtension(new UPnpCDSMusicAlbum());
    232238        }
    233239
    234240#if 0
  • mythtv/programs/mythbackend/mythbackend.pro

    diff --git mythtv/programs/mythbackend/mythbackend.pro mythtv/programs/mythbackend/mythbackend.pro
    index ac8742c..46a9866 100644
    HEADERS += playbacksock.h scheduler.h server.h housekeeper.h backendutil.h 
    2323HEADERS += upnpcdstv.h upnpcdsmusic.h upnpcdsvideo.h mediaserver.h
    2424HEADERS += internetContent.h main_helpers.h backendcontext.h
    2525HEADERS += httpconfig.h mythsettings.h commandlineparser.h
     26HEADERS += upnpcdsmusicalbum.h
    2627
    2728HEADERS += serviceHosts/mythServiceHost.h    serviceHosts/guideServiceHost.h
    2829HEADERS += serviceHosts/contentServiceHost.h serviceHosts/dvrServiceHost.h
    SOURCES += housekeeper.cpp backendutil.cpp 
    3738SOURCES += upnpcdstv.cpp upnpcdsmusic.cpp upnpcdsvideo.cpp mediaserver.cpp
    3839SOURCES += internetContent.cpp main_helpers.cpp backendcontext.cpp
    3940SOURCES += httpconfig.cpp mythsettings.cpp commandlineparser.cpp
     41SOURCES += upnpcdsmusicalbum.cpp
    4042
    4143SOURCES += services/myth.cpp services/guide.cpp services/content.cpp
    4244SOURCES += services/dvr.cpp services/channel.cpp services/video.cpp
  • mythtv/programs/mythbackend/upnpcdsmusic.cpp

    diff --git mythtv/programs/mythbackend/upnpcdsmusic.cpp mythtv/programs/mythbackend/upnpcdsmusic.cpp
    index 57cc570..c2aa0a7 100644
    UPnpCDSRootInfo UPnpCDSMusic::g_RootNodes[] = 
    109109
    110110int UPnpCDSMusic::g_nRootCount = sizeof( g_RootNodes ) / sizeof( UPnpCDSRootInfo );
    111111
     112UPnpCDSRootInfo UPnpCDSMusic::g_Containers[] =
     113{
     114     {
     115        "musicalbum",
     116        "song.album_id",
     117        "SELECT song_id as id, "
     118        "name, "
     119        "1 as children "
     120        "FROM music_songs song "
     121        "%1 "
     122        "ORDER BY name",
     123        "WHERE album_id = :KEY"
     124     }
     125};
     126
     127int UPnpCDSMusic::g_nContainersCount = sizeof( g_Containers ) / sizeof( UPnpCDSRootInfo );
     128
    112129/////////////////////////////////////////////////////////////////////////////
    113130//
    114131/////////////////////////////////////////////////////////////////////////////
    115132
    116 UPnpCDSRootInfo *UPnpCDSMusic::GetRootInfo( int nIdx )
     133UPnpCDSRootInfo *UPnpCDSMusic::GetRootInfo( int nIdx, QString sContainerId )
    117134{
     135    for(int i=0; i<g_nContainersCount; i++)
     136    {
     137        if (sContainerId.startsWith(g_Containers[ i ].title))
     138        {
     139            return &(g_Containers[ i ]);
     140        }
     141    }
     142       
    118143    if ((nIdx >=0 ) && ( nIdx < g_nRootCount ))
    119144        return &(g_RootNodes[ nIdx ]);
    120145
    void UPnpCDSMusic::BuildItemQuery( MSqlQuery &query, const QStringMap &mapParams 
    175200//
    176201/////////////////////////////////////////////////////////////////////////////
    177202
     203bool UPnpCDSMusic::IsOurContainerPrefix(QString sContainerId)
     204{
     205    for(int i=0; i<g_nContainersCount; i++)
     206    {
     207        if (sContainerId.startsWith(g_Containers[ i ].title))
     208        {
     209            return true;
     210        }
     211    }
     212    return false;
     213}
     214
     215/////////////////////////////////////////////////////////////////////////////
     216//
     217/////////////////////////////////////////////////////////////////////////////
     218
     219QString UPnpCDSMusic::RemoveContainerPrefix(QString sContainerId)
     220{
     221    for(int i=0; i<g_nContainersCount; i++)
     222    {
     223        if (sContainerId.startsWith(g_Containers[ i ].title))
     224        {
     225            return sContainerId.right(sContainerId.length() - strlen(g_Containers[ i ].title));
     226        }
     227    }
     228    return sContainerId;
     229}
     230
     231/////////////////////////////////////////////////////////////////////////////
     232//
     233/////////////////////////////////////////////////////////////////////////////
     234
    178235bool UPnpCDSMusic::IsBrowseRequestForUs( UPnpCDSRequest *pRequest )
    179236{
    180237    // ----------------------------------------------------------------------
    bool UPnpCDSMusic::IsBrowseRequestForUs( UPnpCDSRequest *pRequest ) 
    182239    // ----------------------------------------------------------------------
    183240
    184241    // Xbox360 compatibility code.
    185 
     242    /*
    186243    if (pRequest->m_eClient == CDS_ClientXBox &&
    187244        pRequest->m_sContainerID == "7")
    188245    {
    bool UPnpCDSMusic::IsBrowseRequestForUs( UPnpCDSRequest *pRequest ) 
    193250
    194251        return true;
    195252    }
    196 
     253    */
    197254    if ((pRequest->m_sObjectId.isEmpty()) &&
    198255        (!pRequest->m_sContainerID.isEmpty()))
    199256        pRequest->m_sObjectId = pRequest->m_sContainerID;
    bool UPnpCDSMusic::IsSearchRequestForUs( UPnpCDSRequest *pRequest ) 
    215272    // ----------------------------------------------------------------------
    216273
    217274    // XBox 360 compatibility code
    218 
     275    /*
    219276    if (pRequest->m_eClient == CDS_ClientXBox &&
    220277        pRequest->m_sContainerID == "7")
    221278    {
    bool UPnpCDSMusic::IsSearchRequestForUs( UPnpCDSRequest *pRequest ) 
    227284
    228285        return true;
    229286    }
    230 
     287    */
    231288    if (pRequest->m_sContainerID == "4")
    232289    {
    233290        pRequest->m_sObjectId       = "Music";
    void UPnpCDSMusic::AddItem( const UPnpCDSRequest *pRequest, 
    308365                            .arg( sServerIp )
    309366                            .arg( sPort     );
    310367
    311     QString sURIParams = QString( "?Id=%1" )
     368    QString sURIParams = QString( "\%3FId\%3D%1" )
    312369                            .arg( nId );
    313370
    314371
    void UPnpCDSMusic::AddItem( const UPnpCDSRequest *pRequest, 
    366423                                                .arg( sURIParams );
    367424
    368425    Resource *pRes = pItem->AddResource( sProtocol, sURI );
    369 
    370     nLength /= 1000;
    371 
    372426    QString sDur;
    373427
    374     sDur.sprintf("%02d:%02d:%02d",
    375                   (nLength / 3600) % 24,
    376                   (nLength / 60) % 60,
    377                   nLength % 60);
     428    sDur.sprintf("%02d:%02d:%02d.%03d",
     429                  (nLength / 3600000) % 24,
     430                  (nLength / 60000) % 60,
     431                  (nLength / 1000) % 60,
     432                  nLength % 1000
     433                );
    378434
    379435    pRes->AddAttribute( "duration"  , sDur      );
    380436}
  • mythtv/programs/mythbackend/upnpcdsmusic.h

    diff --git mythtv/programs/mythbackend/upnpcdsmusic.h mythtv/programs/mythbackend/upnpcdsmusic.h
    index 5cc28a6..815d38e 100644
    class UPnpCDSMusic : public UPnpCDSExtension 
    2424    private:
    2525
    2626        static UPnpCDSRootInfo g_RootNodes[];
     27        static UPnpCDSRootInfo g_Containers[];
    2728        static int             g_nRootCount;
     29        static int             g_nContainersCount;
    2830
    2931    protected:
    3032
     33        virtual bool             IsOurContainerPrefix ( QString sContainerId );
     34        virtual QString          RemoveContainerPrefix ( QString sContainerId );
    3135        virtual bool             IsBrowseRequestForUs( UPnpCDSRequest *pRequest );
    3236        virtual bool             IsSearchRequestForUs( UPnpCDSRequest *pRequest );
    3337
    34         virtual UPnpCDSRootInfo *GetRootInfo   (int nIdx);
     38        virtual UPnpCDSRootInfo *GetRootInfo   ( int nIdx, QString sContainerId = "" );
    3539        virtual int              GetRootCount  ( );
    3640        virtual QString          GetTableName  ( QString sColumn );
    3741        virtual QString          GetItemListSQL( QString sColumn = "" );
  • mythtv/programs/mythbackend/upnpcdstv.cpp

    diff --git mythtv/programs/mythbackend/upnpcdstv.cpp mythtv/programs/mythbackend/upnpcdstv.cpp
    index a29c2ff..6da5e66 100644
    int UPnpCDSTv::g_nRootCount = sizeof( g_RootNodes ) / sizeof( UPnpCDSRootInfo ); 
    111111//
    112112/////////////////////////////////////////////////////////////////////////////
    113113
    114 UPnpCDSRootInfo *UPnpCDSTv::GetRootInfo( int nIdx )
     114UPnpCDSRootInfo *UPnpCDSTv::GetRootInfo( int nIdx, QString sContainerId )
    115115{
    116116    if ((nIdx >=0 ) && ( nIdx < g_nRootCount ))
    117117        return &(g_RootNodes[ nIdx ]);
  • mythtv/programs/mythbackend/upnpcdstv.h

    diff --git mythtv/programs/mythbackend/upnpcdstv.h mythtv/programs/mythbackend/upnpcdstv.h
    index 9b4e620..b3970cc 100644
    class UPnpCDSTv : public UPnpCDSExtension 
    3232        virtual bool             IsBrowseRequestForUs( UPnpCDSRequest *pRequest );
    3333        virtual bool             IsSearchRequestForUs( UPnpCDSRequest *pRequest );
    3434
    35         virtual UPnpCDSRootInfo *GetRootInfo   (int nIdx);
     35        virtual UPnpCDSRootInfo *GetRootInfo   ( int nIdx, QString sContainerId = "" );
    3636        virtual int              GetRootCount  ( );
    3737        virtual QString          GetTableName  ( QString sColumn );
    3838        virtual QString          GetItemListSQL( QString sColumn = "" );
  • mythtv/programs/mythbackend/upnpcdsvideo.cpp

    diff --git mythtv/programs/mythbackend/upnpcdsvideo.cpp mythtv/programs/mythbackend/upnpcdsvideo.cpp
    index b0b12b3..88637a0 100644
    int UPnpCDSVideo::g_nRootCount = 1; 
    4444//
    4545/////////////////////////////////////////////////////////////////////////////
    4646
    47 UPnpCDSRootInfo *UPnpCDSVideo::GetRootInfo( int nIdx )
     47UPnpCDSRootInfo *UPnpCDSVideo::GetRootInfo( int nIdx, QString sContainerId )
    4848{
    4949    if ((nIdx >=0 ) && ( nIdx < g_nRootCount ))
    5050        return &(g_RootNodes[ nIdx ]);
  • mythtv/programs/mythbackend/upnpcdsvideo.h

    diff --git mythtv/programs/mythbackend/upnpcdsvideo.h mythtv/programs/mythbackend/upnpcdsvideo.h
    index 56e98d5..b547035 100644
    class UPnpCDSVideo : public UPnpCDSExtension 
    3737
    3838        virtual int              GetDistinctCount( UPnpCDSRootInfo *pInfo );
    3939
    40         virtual UPnpCDSRootInfo *GetRootInfo   (int nIdx);
     40        virtual UPnpCDSRootInfo *GetRootInfo   ( int nIdx, QString sContainerId = "" );
    4141        virtual int              GetRootCount  ( );
    4242        virtual QString          GetTableName  ( QString sColumn );
    4343        virtual QString          GetItemListSQL( QString sColumn = "");