mpviewplugins/mpdetailsviewplugin/src/mpquerymanager.cpp
author hgs
Fri, 23 Jul 2010 17:31:12 -0500
changeset 45 612c4815aebe
parent 36 a0afa279b8fe
child 47 4cc1412daed0
permissions -rw-r--r--
201029
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
35
hgs
parents:
diff changeset
     1
/*
hgs
parents:
diff changeset
     2
* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
hgs
parents:
diff changeset
     3
* All rights reserved.
hgs
parents:
diff changeset
     4
* This component and the accompanying materials are made available 
hgs
parents:
diff changeset
     5
* under the terms of "Eclipse Public License v1.0"
hgs
parents:
diff changeset
     6
* which accompanies this distribution, and is available
hgs
parents:
diff changeset
     7
* at the URL "http://www.eclipse.org/legal/epl-v10.html".
hgs
parents:
diff changeset
     8
*
hgs
parents:
diff changeset
     9
* Initial Contributors:
hgs
parents:
diff changeset
    10
* Nokia Corporation - initial contribution.
hgs
parents:
diff changeset
    11
*
hgs
parents:
diff changeset
    12
* Contributors:
hgs
parents:
diff changeset
    13
*
hgs
parents:
diff changeset
    14
* Description: Music Player Query Manager.
hgs
parents:
diff changeset
    15
*
hgs
parents:
diff changeset
    16
*/
hgs
parents:
diff changeset
    17
hgs
parents:
diff changeset
    18
#include "mpquerymanager.h"
hgs
parents:
diff changeset
    19
#include <QDebug>
hgs
parents:
diff changeset
    20
#include <QObject>
hgs
parents:
diff changeset
    21
#include <QNetworkAccessManager>
hgs
parents:
diff changeset
    22
#include <QNetworkDiskCache>
hgs
parents:
diff changeset
    23
#include <QNetworkProxyFactory>
hgs
parents:
diff changeset
    24
#include <qmobilityglobal.h>
hgs
parents:
diff changeset
    25
#include <qnetworksession.h>
hgs
parents:
diff changeset
    26
#include <QDomElement>
hgs
parents:
diff changeset
    27
#include <QList>
hgs
parents:
diff changeset
    28
#include <QFile>
hgs
parents:
diff changeset
    29
#include <QUrl>
hgs
parents:
diff changeset
    30
#include <QSslError>
hgs
parents:
diff changeset
    31
#include <QDir>
hgs
parents:
diff changeset
    32
#include <QCoreApplication>
hgs
parents:
diff changeset
    33
36
hgs
parents: 35
diff changeset
    34
#include <thumbnailmanager_qt.h>
hgs
parents: 35
diff changeset
    35
#include <thumbnaildata.h>
hgs
parents: 35
diff changeset
    36
#include <thumbnailobjectsource.h>
hgs
parents: 35
diff changeset
    37
35
hgs
parents:
diff changeset
    38
#include "mpdetailssharedialog.h"
hgs
parents:
diff changeset
    39
#include "mptrace.h"
hgs
parents:
diff changeset
    40
36
hgs
parents: 35
diff changeset
    41
const int KUndefined = -1;
35
hgs
parents:
diff changeset
    42
const int KRecommendationCount = 2;
hgs
parents:
diff changeset
    43
hgs
parents:
diff changeset
    44
MpQueryManager::MpQueryManager()
36
hgs
parents: 35
diff changeset
    45
    : mManager(0),
hgs
parents: 35
diff changeset
    46
      mDownloadManager(0),
hgs
parents: 35
diff changeset
    47
      mThumbnailManager(0)        
35
hgs
parents:
diff changeset
    48
                               
hgs
parents:
diff changeset
    49
{
hgs
parents:
diff changeset
    50
    TX_ENTRY
hgs
parents:
diff changeset
    51
hgs
parents:
diff changeset
    52
    QString privatePathQt( QCoreApplication::applicationDirPath() );
hgs
parents:
diff changeset
    53
    TX_LOG_ARGS( "Private path: " << privatePathQt );
hgs
parents:
diff changeset
    54
    QDir dir( privatePathQt );
hgs
parents:
diff changeset
    55
    QString newDir = "detailsview";
hgs
parents:
diff changeset
    56
    bool res = dir.mkdir( newDir );
hgs
parents:
diff changeset
    57
    TX_LOG_ARGS( "New dir creation result: " << res);
hgs
parents:
diff changeset
    58
hgs
parents:
diff changeset
    59
    // We're not handling a negative result for directory creation here,
hgs
parents:
diff changeset
    60
    // instead it will be escalated in DownloadFinished() method.
hgs
parents:
diff changeset
    61
    privatePathQt = privatePathQt + "/detailsview";
hgs
parents:
diff changeset
    62
    QString albumArt1( privatePathQt + "/albumOne.png" );
hgs
parents:
diff changeset
    63
    QString albumArt2( privatePathQt + "/albumTwo.png" );
hgs
parents:
diff changeset
    64
    mRecommendationAlbumArtsName << albumArt1 << albumArt2;
hgs
parents:
diff changeset
    65
    TX_LOG_ARGS( "recommendation album art names: " << mRecommendationAlbumArtsName );
hgs
parents:
diff changeset
    66
hgs
parents:
diff changeset
    67
    mManager = new QNetworkAccessManager( this );
hgs
parents:
diff changeset
    68
      
hgs
parents:
diff changeset
    69
    mDownloadManager = new QNetworkAccessManager( this );
hgs
parents:
diff changeset
    70
    connect( mDownloadManager, SIGNAL( finished( QNetworkReply * ) ), this, SLOT( DownloadFinished( QNetworkReply * ) ) );
36
hgs
parents: 35
diff changeset
    71
    
hgs
parents: 35
diff changeset
    72
    mThumbnailManager = new ThumbnailManager( this );
hgs
parents: 35
diff changeset
    73
    mThumbnailManager->setQualityPreference( ThumbnailManager::OptimizeForQuality );
hgs
parents: 35
diff changeset
    74
    mThumbnailManager->setThumbnailSize( ThumbnailManager::ThumbnailSmall );
hgs
parents: 35
diff changeset
    75
    QObject::connect( mThumbnailManager, SIGNAL( thumbnailReady( QPixmap , void * , int , int ) ),
hgs
parents: 35
diff changeset
    76
            this, SLOT( thumbnailReady( QPixmap , void * , int , int  ) ) );
hgs
parents: 35
diff changeset
    77
    // TODO: Use the album art in provided by 10.1 wk16 platform. Current one is in the binary        
hgs
parents: 35
diff changeset
    78
    mDefaultRecommendationAlbumArt = QPixmap( ":/mpdetailsviewicons/qtg_large_music_album.svg" );    
35
hgs
parents:
diff changeset
    79
     
hgs
parents:
diff changeset
    80
    TX_EXIT
hgs
parents:
diff changeset
    81
}
hgs
parents:
diff changeset
    82
hgs
parents:
diff changeset
    83
MpQueryManager::~MpQueryManager()
hgs
parents:
diff changeset
    84
{
hgs
parents:
diff changeset
    85
    TX_ENTRY
hgs
parents:
diff changeset
    86
    if ( mManager ) {
hgs
parents:
diff changeset
    87
       mManager->deleteLater();
hgs
parents:
diff changeset
    88
     }
hgs
parents:
diff changeset
    89
    if ( mDownloadManager ) {
hgs
parents:
diff changeset
    90
       mDownloadManager->deleteLater();
hgs
parents:
diff changeset
    91
    }
36
hgs
parents: 35
diff changeset
    92
    delete mThumbnailManager;
35
hgs
parents:
diff changeset
    93
    TX_EXIT
hgs
parents:
diff changeset
    94
}
hgs
parents:
diff changeset
    95
hgs
parents:
diff changeset
    96
hgs
parents:
diff changeset
    97
void MpQueryManager::clearNetworkReplies()
hgs
parents:
diff changeset
    98
{
hgs
parents:
diff changeset
    99
    disconnect( mManager, SIGNAL( finished( QNetworkReply * ) ), this, SLOT( retrieveInformationFinished( QNetworkReply * ) ) );     
hgs
parents:
diff changeset
   100
    TX_ENTRY_ARGS( "Reply count = " << mReplys.count() );    
hgs
parents:
diff changeset
   101
    for ( int i = 0; i < mReplys.count(); i++ ) {
hgs
parents:
diff changeset
   102
        QNetworkReply *reply = mReplys.at( i );
hgs
parents:
diff changeset
   103
        disconnect( reply, SIGNAL( error( QNetworkReply::NetworkError ) ), this, SLOT( retrieveInformationNetworkError( QNetworkReply::NetworkError ) ) );        
hgs
parents:
diff changeset
   104
        if ( reply != NULL ) {
hgs
parents:
diff changeset
   105
            reply->close();
hgs
parents:
diff changeset
   106
            reply->deleteLater();
hgs
parents:
diff changeset
   107
            reply = NULL;
hgs
parents:
diff changeset
   108
        }   
hgs
parents:
diff changeset
   109
    }
hgs
parents:
diff changeset
   110
    mReplys.clear();
hgs
parents:
diff changeset
   111
    TX_EXIT
hgs
parents:
diff changeset
   112
}
hgs
parents:
diff changeset
   113
hgs
parents:
diff changeset
   114
hgs
parents:
diff changeset
   115
void MpQueryManager::queryLocalMusicStore(QString artist,QString album,QString title)
hgs
parents:
diff changeset
   116
{
hgs
parents:
diff changeset
   117
    TX_ENTRY
hgs
parents:
diff changeset
   118
    mArtist=artist;
hgs
parents:
diff changeset
   119
    mAlbum=album;
hgs
parents:
diff changeset
   120
    mTitle=title;
hgs
parents:
diff changeset
   121
    // TODO: country information handling, MCC
hgs
parents:
diff changeset
   122
    QString queryURI("http://api.music.ovi.com/1.0/ru/?");
hgs
parents:
diff changeset
   123
    constructRequest( queryURI );
hgs
parents:
diff changeset
   124
    TX_LOG_ARGS( "queryURI : " << queryURI );
hgs
parents:
diff changeset
   125
    retrieveInformation( queryURI );
hgs
parents:
diff changeset
   126
    TX_EXIT    
hgs
parents:
diff changeset
   127
}
hgs
parents:
diff changeset
   128
    
hgs
parents:
diff changeset
   129
void MpQueryManager::queryInspireMeItems(QString artist,QString album,QString title)
hgs
parents:
diff changeset
   130
{
hgs
parents:
diff changeset
   131
    TX_ENTRY    
hgs
parents:
diff changeset
   132
    mArtist=artist;
hgs
parents:
diff changeset
   133
    mAlbum=album;
hgs
parents:
diff changeset
   134
    mTitle=title;
hgs
parents:
diff changeset
   135
    // start querying inspire me items
hgs
parents:
diff changeset
   136
    QString queryRecommendation("http://api.music.ovi.com/1.0/gb/releases/recommend/?");
hgs
parents:
diff changeset
   137
    constructRequest( queryRecommendation );
hgs
parents:
diff changeset
   138
    TX_LOG_ARGS( "queryRecommendation : " << queryRecommendation );
hgs
parents:
diff changeset
   139
    retrieveInformation( queryRecommendation );
hgs
parents:
diff changeset
   140
    TX_EXIT
hgs
parents:
diff changeset
   141
}
hgs
parents:
diff changeset
   142
hgs
parents:
diff changeset
   143
void MpQueryManager::clearRecommendations()
hgs
parents:
diff changeset
   144
{
hgs
parents:
diff changeset
   145
    TX_ENTRY    
hgs
parents:
diff changeset
   146
    mDownloadedAlbumArts = 0;
hgs
parents:
diff changeset
   147
    mAlbumArtsReadyCount = 0;
hgs
parents:
diff changeset
   148
    for ( int i = 0; i < KRecommendationCount; i++ ) {
hgs
parents:
diff changeset
   149
       mRecommendationSongs.clear();
hgs
parents:
diff changeset
   150
       mRecommendationArtists.clear();
hgs
parents:
diff changeset
   151
       mRecommendationAlbumArtsLink.clear();
hgs
parents:
diff changeset
   152
       mRecommendationAlbumArtsMap.clear();      
hgs
parents:
diff changeset
   153
       QFile file( mRecommendationAlbumArtsName.at( i ) );        
hgs
parents:
diff changeset
   154
       if ( file.exists() ) {
hgs
parents:
diff changeset
   155
           if ( file.remove() ) {
hgs
parents:
diff changeset
   156
               TX_LOG_ARGS( "File removed - " << file.fileName() );
hgs
parents:
diff changeset
   157
           }
hgs
parents:
diff changeset
   158
           else {
hgs
parents:
diff changeset
   159
               TX_LOG_ARGS( "Cannot remove file - " << file.fileName() );
hgs
parents:
diff changeset
   160
           }
hgs
parents:
diff changeset
   161
       } else {
hgs
parents:
diff changeset
   162
           TX_LOG_ARGS( "File doesn't exist - " << file.fileName() );
hgs
parents:
diff changeset
   163
       }
hgs
parents:
diff changeset
   164
    }
hgs
parents:
diff changeset
   165
    TX_EXIT    
hgs
parents:
diff changeset
   166
}
hgs
parents:
diff changeset
   167
hgs
parents:
diff changeset
   168
/*!
hgs
parents:
diff changeset
   169
 Return recommendation songs
hgs
parents:
diff changeset
   170
 */
hgs
parents:
diff changeset
   171
QStringList MpQueryManager::recommendationSongs()
hgs
parents:
diff changeset
   172
{
hgs
parents:
diff changeset
   173
    TX_LOG  
hgs
parents:
diff changeset
   174
    return mRecommendationSongs;
hgs
parents:
diff changeset
   175
}
hgs
parents:
diff changeset
   176
hgs
parents:
diff changeset
   177
/*!
hgs
parents:
diff changeset
   178
 Return recommendation artists
hgs
parents:
diff changeset
   179
 */
hgs
parents:
diff changeset
   180
QStringList MpQueryManager::recommendationArtists()
hgs
parents:
diff changeset
   181
{
hgs
parents:
diff changeset
   182
    TX_LOG  
hgs
parents:
diff changeset
   183
    return mRecommendationArtists;
hgs
parents:
diff changeset
   184
}
hgs
parents:
diff changeset
   185
hgs
parents:
diff changeset
   186
/*!
hgs
parents:
diff changeset
   187
 Return recommendation album arts links
hgs
parents:
diff changeset
   188
 */
hgs
parents:
diff changeset
   189
QStringList MpQueryManager::recommendationAlbumArtsLink()
hgs
parents:
diff changeset
   190
{
hgs
parents:
diff changeset
   191
    TX_LOG  
hgs
parents:
diff changeset
   192
    return mRecommendationAlbumArtsLink;
hgs
parents:
diff changeset
   193
}
hgs
parents:
diff changeset
   194
hgs
parents:
diff changeset
   195
/*!
hgs
parents:
diff changeset
   196
 Return map of name and pixmap
hgs
parents:
diff changeset
   197
 */
hgs
parents:
diff changeset
   198
QMap<QString, QPixmap>  MpQueryManager::recommendationAlbumArtsMap()
hgs
parents:
diff changeset
   199
{
hgs
parents:
diff changeset
   200
    TX_LOG  
hgs
parents:
diff changeset
   201
    return mRecommendationAlbumArtsMap;
hgs
parents:
diff changeset
   202
}
hgs
parents:
diff changeset
   203
hgs
parents:
diff changeset
   204
/*!
hgs
parents:
diff changeset
   205
 Insert one uri & pixmap item into map
hgs
parents:
diff changeset
   206
 */
hgs
parents:
diff changeset
   207
void MpQueryManager::insertMapItem( const QString &uri, const QPixmap &pixmap )
hgs
parents:
diff changeset
   208
{
hgs
parents:
diff changeset
   209
    TX_ENTRY_ARGS( "Map Item URI: " << uri );
hgs
parents:
diff changeset
   210
    mRecommendationAlbumArtsMap.insert( uri, pixmap );
hgs
parents:
diff changeset
   211
    TX_EXIT
hgs
parents:
diff changeset
   212
}
hgs
parents:
diff changeset
   213
hgs
parents:
diff changeset
   214
/*!
hgs
parents:
diff changeset
   215
 Slot to call when getting response
hgs
parents:
diff changeset
   216
 */
hgs
parents:
diff changeset
   217
void MpQueryManager::retrieveInformationFinished( QNetworkReply* reply )
hgs
parents:
diff changeset
   218
{
hgs
parents:
diff changeset
   219
    TX_ENTRY
hgs
parents:
diff changeset
   220
    QString errorStr;
hgs
parents:
diff changeset
   221
    int errorLine;
hgs
parents:
diff changeset
   222
    int errorColumn;
hgs
parents:
diff changeset
   223
    bool parsingSuccess;
hgs
parents:
diff changeset
   224
    
hgs
parents:
diff changeset
   225
    if ( reply->error() == QNetworkReply::NoError )
hgs
parents:
diff changeset
   226
    {
hgs
parents:
diff changeset
   227
        parsingSuccess = mDomDocument.setContent( reply, true, &errorStr, &errorLine, &errorColumn );
hgs
parents:
diff changeset
   228
        if ( parsingSuccess ) {
hgs
parents:
diff changeset
   229
            handleParsedXML();  //CodeScanner throws a warning mis-interpreting the trailing 'L' to be a leaving function.
hgs
parents:
diff changeset
   230
        } else {
hgs
parents:
diff changeset
   231
            // TODO: agree on error handling            
hgs
parents:
diff changeset
   232
            TX_LOG_ARGS( "XML parsing error" );
hgs
parents:
diff changeset
   233
        }
hgs
parents:
diff changeset
   234
    }
hgs
parents:
diff changeset
   235
    else
hgs
parents:
diff changeset
   236
    {
hgs
parents:
diff changeset
   237
        // TODO: agree on error handling
hgs
parents:
diff changeset
   238
        TX_LOG_ARGS( "Network error in retrieving Information" );
hgs
parents:
diff changeset
   239
        emit networkError();
hgs
parents:
diff changeset
   240
    }
hgs
parents:
diff changeset
   241
    TX_EXIT
hgs
parents:
diff changeset
   242
}
hgs
parents:
diff changeset
   243
hgs
parents:
diff changeset
   244
/*!
hgs
parents:
diff changeset
   245
 Slot to call when there is network error
hgs
parents:
diff changeset
   246
 */
hgs
parents:
diff changeset
   247
void MpQueryManager::retrieveInformationNetworkError( QNetworkReply::NetworkError error )
hgs
parents:
diff changeset
   248
{
36
hgs
parents: 35
diff changeset
   249
    // TODO: agree on error handling
45
hgs
parents: 36
diff changeset
   250
	Q_UNUSED(error)
35
hgs
parents:
diff changeset
   251
    TX_ENTRY_ARGS( "Network error for retrieving Information" << error);
hgs
parents:
diff changeset
   252
    TX_EXIT
hgs
parents:
diff changeset
   253
}
hgs
parents:
diff changeset
   254
hgs
parents:
diff changeset
   255
/*!
hgs
parents:
diff changeset
   256
 Slot to call when there is ssl error
hgs
parents:
diff changeset
   257
 */
hgs
parents:
diff changeset
   258
void MpQueryManager::retrieveInformationSslErrors( const QList<QSslError> &/*error*/ )
hgs
parents:
diff changeset
   259
{   
hgs
parents:
diff changeset
   260
    // TODO: agree on error handling
hgs
parents:
diff changeset
   261
    TX_ENTRY_ARGS( "SSL error for retrieving Information" );
hgs
parents:
diff changeset
   262
    TX_EXIT
hgs
parents:
diff changeset
   263
}
hgs
parents:
diff changeset
   264
hgs
parents:
diff changeset
   265
/*!
hgs
parents:
diff changeset
   266
 Slot to call when downloading finished
hgs
parents:
diff changeset
   267
 */
hgs
parents:
diff changeset
   268
void MpQueryManager::DownloadFinished( QNetworkReply* reply )
hgs
parents:
diff changeset
   269
{
hgs
parents:
diff changeset
   270
    TX_ENTRY_ARGS( "mDownloadedAlbumArts = " << mDownloadedAlbumArts );
hgs
parents:
diff changeset
   271
    if ( reply->error() == QNetworkReply::NoError )
hgs
parents:
diff changeset
   272
        {
hgs
parents:
diff changeset
   273
        QString fileName = mRecommendationAlbumArtsName.at( mDownloadedAlbumArts );
hgs
parents:
diff changeset
   274
        QByteArray imageData = reply->readAll();
hgs
parents:
diff changeset
   275
        bool ret = writeImageToFile( imageData, fileName );
hgs
parents:
diff changeset
   276
hgs
parents:
diff changeset
   277
        // If file writing went OK, emit a signal with the real filename
hgs
parents:
diff changeset
   278
        // If it failed, use empty filename (since file was removed in any case)
hgs
parents:
diff changeset
   279
        if ( ret )
hgs
parents:
diff changeset
   280
            {
36
hgs
parents: 35
diff changeset
   281
            setAlbumArtUri( mRecommendationAlbumArtsLink.at( mDownloadedAlbumArts), 
hgs
parents: 35
diff changeset
   282
                            mRecommendationAlbumArtsName.at( mDownloadedAlbumArts ) );
35
hgs
parents:
diff changeset
   283
            }
hgs
parents:
diff changeset
   284
        else
hgs
parents:
diff changeset
   285
            {
36
hgs
parents: 35
diff changeset
   286
            setAlbumArtUri(mRecommendationAlbumArtsLink.at( mDownloadedAlbumArts), "");
35
hgs
parents:
diff changeset
   287
            }
hgs
parents:
diff changeset
   288
        }
hgs
parents:
diff changeset
   289
    else
hgs
parents:
diff changeset
   290
    {
hgs
parents:
diff changeset
   291
        TX_LOG_ARGS( "Downloading album art failed!" );
hgs
parents:
diff changeset
   292
        emit networkError();
hgs
parents:
diff changeset
   293
    }
hgs
parents:
diff changeset
   294
    
hgs
parents:
diff changeset
   295
    mDownloadedAlbumArts++;
hgs
parents:
diff changeset
   296
    TX_EXIT
hgs
parents:
diff changeset
   297
}
hgs
parents:
diff changeset
   298
hgs
parents:
diff changeset
   299
/*!
hgs
parents:
diff changeset
   300
 Write the image data to a file with the given filename.
hgs
parents:
diff changeset
   301
 If writing operation fails for any reason (e.g. OOD),
hgs
parents:
diff changeset
   302
 returns false, otherwise true.
hgs
parents:
diff changeset
   303
 */
hgs
parents:
diff changeset
   304
bool MpQueryManager::writeImageToFile(const QByteArray &aImageData, const QString &aImageFileName )
hgs
parents:
diff changeset
   305
    {
hgs
parents:
diff changeset
   306
    bool ret( false );
hgs
parents:
diff changeset
   307
    TX_ENTRY_ARGS( "imagefile: " << aImageFileName );
hgs
parents:
diff changeset
   308
    if ( aImageFileName.isEmpty() )
hgs
parents:
diff changeset
   309
        {
hgs
parents:
diff changeset
   310
        TX_LOG_ARGS( "Only store two album arts" );
hgs
parents:
diff changeset
   311
        }
hgs
parents:
diff changeset
   312
    else
hgs
parents:
diff changeset
   313
        {
hgs
parents:
diff changeset
   314
        QFile file( aImageFileName );
hgs
parents:
diff changeset
   315
hgs
parents:
diff changeset
   316
        if ( !file.open( QIODevice::ReadWrite ) )
hgs
parents:
diff changeset
   317
            {
hgs
parents:
diff changeset
   318
            TX_LOG_ARGS( "Unable to open file" );
hgs
parents:
diff changeset
   319
            }
hgs
parents:
diff changeset
   320
        else
hgs
parents:
diff changeset
   321
            {
hgs
parents:
diff changeset
   322
            qint64 writtenBytes = file.write( aImageData );
hgs
parents:
diff changeset
   323
hgs
parents:
diff changeset
   324
            // Verify file write status
hgs
parents:
diff changeset
   325
            if ( writtenBytes < aImageData.size() )
hgs
parents:
diff changeset
   326
                {
hgs
parents:
diff changeset
   327
                // If write succeeded only partially, or completely failed,
hgs
parents:
diff changeset
   328
                // remove the file from filesystem to remove risk of corruption
hgs
parents:
diff changeset
   329
                TX_LOG_ARGS( "Wrote only " << writtenBytes << " bytes, aborting operation!" );
hgs
parents:
diff changeset
   330
                file.close();
hgs
parents:
diff changeset
   331
                QFile::remove( mRecommendationAlbumArtsName.at( mDownloadedAlbumArts ) );
hgs
parents:
diff changeset
   332
                }
hgs
parents:
diff changeset
   333
            else
hgs
parents:
diff changeset
   334
                {
hgs
parents:
diff changeset
   335
                // If write fully succeeded, flush contents
hgs
parents:
diff changeset
   336
                TX_LOG_ARGS( "Wrote all the bytes (" << writtenBytes << "), flushing and closing!");
hgs
parents:
diff changeset
   337
                file.flush();
hgs
parents:
diff changeset
   338
                file.close();
hgs
parents:
diff changeset
   339
                ret = true;
hgs
parents:
diff changeset
   340
                }
hgs
parents:
diff changeset
   341
            }
hgs
parents:
diff changeset
   342
        }
hgs
parents:
diff changeset
   343
    TX_LOG_ARGS( "Returning with value: " << ret );
hgs
parents:
diff changeset
   344
    TX_EXIT
hgs
parents:
diff changeset
   345
    return ret;
hgs
parents:
diff changeset
   346
    }
hgs
parents:
diff changeset
   347
hgs
parents:
diff changeset
   348
/*!
hgs
parents:
diff changeset
   349
 Get Atom response from Ovi server based on query
hgs
parents:
diff changeset
   350
 */
hgs
parents:
diff changeset
   351
void MpQueryManager::retrieveInformation( const QString &urlEncoded )
hgs
parents:
diff changeset
   352
{
hgs
parents:
diff changeset
   353
    TX_ENTRY_ARGS( "urlEconded = " << urlEncoded)
hgs
parents:
diff changeset
   354
    connect( mManager, SIGNAL( finished( QNetworkReply * ) ), this, SLOT( retrieveInformationFinished( QNetworkReply * ) ) );    
hgs
parents:
diff changeset
   355
    QNetworkReply *reply = mManager->get( QNetworkRequest( QUrl( urlEncoded ) ) );
hgs
parents:
diff changeset
   356
    mReplys.append( reply );
hgs
parents:
diff changeset
   357
    
hgs
parents:
diff changeset
   358
    connect( reply, SIGNAL( error( QNetworkReply::NetworkError ) ), this, SLOT( retrieveInformationNetworkError( QNetworkReply::NetworkError ) ) );
hgs
parents:
diff changeset
   359
    connect( reply, SIGNAL( sslErrors( QList<QSslError> ) ), this, SLOT( retrieveInformationSslErrors( QList<QSslError> ) ) );
hgs
parents:
diff changeset
   360
    TX_EXIT
hgs
parents:
diff changeset
   361
}
hgs
parents:
diff changeset
   362
hgs
parents:
diff changeset
   363
hgs
parents:
diff changeset
   364
/*!
hgs
parents:
diff changeset
   365
 Find the most suitable link based on Atom response from Ovi music server
hgs
parents:
diff changeset
   366
 */
hgs
parents:
diff changeset
   367
void MpQueryManager::handleParsedXML()
hgs
parents:
diff changeset
   368
{
hgs
parents:
diff changeset
   369
    TX_ENTRY
hgs
parents:
diff changeset
   370
    QDomElement rootElement = mDomDocument.documentElement();
hgs
parents:
diff changeset
   371
    
hgs
parents:
diff changeset
   372
    if ( rootElement.attribute( "type" ) == "search" ) {
hgs
parents:
diff changeset
   373
        TX_LOG_ARGS( "URI response" )
hgs
parents:
diff changeset
   374
        QString result;
hgs
parents:
diff changeset
   375
        QDomElement entry = rootElement.firstChildElement( "entry" );
hgs
parents:
diff changeset
   376
        while ( !entry.isNull() )
hgs
parents:
diff changeset
   377
        {
hgs
parents:
diff changeset
   378
            if ( entry.attribute( "type" ) == "musictrack" ) {
hgs
parents:
diff changeset
   379
                QDomElement link = entry.firstChildElement( "link" );
hgs
parents:
diff changeset
   380
                while ( !link.isNull() )
hgs
parents:
diff changeset
   381
                {
hgs
parents:
diff changeset
   382
                    if ( link.attribute( "rel" ) == "alternate"
hgs
parents:
diff changeset
   383
                        && link.attribute( "type" ) == "text/html" ) {
hgs
parents:
diff changeset
   384
                        result = link.attribute( "href" );
hgs
parents:
diff changeset
   385
                    }
hgs
parents:
diff changeset
   386
                    link = link.nextSiblingElement( "link" );
hgs
parents:
diff changeset
   387
                }
hgs
parents:
diff changeset
   388
            }
hgs
parents:
diff changeset
   389
            entry = entry.nextSiblingElement( "entry" );
hgs
parents:
diff changeset
   390
        }
hgs
parents:
diff changeset
   391
		// Signal that the url was received. Might be empty string.
hgs
parents:
diff changeset
   392
		emit searchUrlRetrieved( result );
hgs
parents:
diff changeset
   393
    } else if ( rootElement.attribute( "type" ) == "recommendedTracks" ) {
hgs
parents:
diff changeset
   394
        TX_LOG_ARGS( "Recommendation response" )
hgs
parents:
diff changeset
   395
        QDomElement entry = rootElement.firstChildElement( "entry" );
hgs
parents:
diff changeset
   396
        QNetworkReply *reply;
hgs
parents:
diff changeset
   397
        int count = 0;
hgs
parents:
diff changeset
   398
        while ( !entry.isNull() && count < KRecommendationCount )
hgs
parents:
diff changeset
   399
        {
hgs
parents:
diff changeset
   400
            if ( entry.attribute( "type" ) == "musictrack" ) {
hgs
parents:
diff changeset
   401
                QDomElement link = entry.firstChildElement( "link" );
hgs
parents:
diff changeset
   402
                while ( !link.isNull() )
hgs
parents:
diff changeset
   403
                {
hgs
parents:
diff changeset
   404
                    if ( link.attribute( "title" ) == "albumart100" ) {
hgs
parents:
diff changeset
   405
                        mRecommendationAlbumArtsLink.append( link.attribute( "href" ) );
hgs
parents:
diff changeset
   406
                        break;
hgs
parents:
diff changeset
   407
                    } else {
hgs
parents:
diff changeset
   408
                        link = link.nextSiblingElement( "link" );
hgs
parents:
diff changeset
   409
                    }                    
hgs
parents:
diff changeset
   410
                }
hgs
parents:
diff changeset
   411
                QDomElement metadata = entry.firstChildElement( "metadata" );
hgs
parents:
diff changeset
   412
                mRecommendationSongs.append( metadata.firstChildElement( "name" ).text() );
hgs
parents:
diff changeset
   413
                mRecommendationArtists.append( metadata.firstChildElement( "primaryartist" ).text() );
hgs
parents:
diff changeset
   414
                count++;
hgs
parents:
diff changeset
   415
            }
hgs
parents:
diff changeset
   416
            entry = entry.nextSiblingElement( "entry" );
hgs
parents:
diff changeset
   417
        }          
hgs
parents:
diff changeset
   418
        
hgs
parents:
diff changeset
   419
        for (int i = 0; i < KRecommendationCount; i++ ) {
hgs
parents:
diff changeset
   420
            TX_LOG_ARGS( "song name: " << mRecommendationSongs.at(i) );
hgs
parents:
diff changeset
   421
            TX_LOG_ARGS( "Artist name: " << mRecommendationArtists.at(i) );
hgs
parents:
diff changeset
   422
            TX_LOG_ARGS( "Album art link: " << mRecommendationAlbumArtsLink.at(i) );
hgs
parents:
diff changeset
   423
            
hgs
parents:
diff changeset
   424
            if ( mRecommendationAlbumArtsLink.at( i ).contains( "http", Qt::CaseInsensitive ) ) {
hgs
parents:
diff changeset
   425
                reply = mDownloadManager->get( QNetworkRequest( QUrl( mRecommendationAlbumArtsLink.at(i) ) ) );
hgs
parents:
diff changeset
   426
                mReplys.append( reply );
hgs
parents:
diff changeset
   427
                connect( reply, SIGNAL( error( QNetworkReply::NetworkError ) ), this, SLOT( retrieveInformationNetworkError( QNetworkReply::NetworkError ) ) );
hgs
parents:
diff changeset
   428
                connect( reply, SIGNAL( sslErrors( QList<QSslError> ) ), this, SLOT( retrieveInformationSslErrors( QList<QSslError> ) ) );
hgs
parents:
diff changeset
   429
            }             
hgs
parents:
diff changeset
   430
        }
hgs
parents:
diff changeset
   431
    } else {
hgs
parents:
diff changeset
   432
        TX_LOG_ARGS( "Not supported response" )
hgs
parents:
diff changeset
   433
    }
hgs
parents:
diff changeset
   434
    TX_EXIT
hgs
parents:
diff changeset
   435
}
hgs
parents:
diff changeset
   436
hgs
parents:
diff changeset
   437
/*!
hgs
parents:
diff changeset
   438
 Construct the query for fetching URI & recommendations
hgs
parents:
diff changeset
   439
 */
hgs
parents:
diff changeset
   440
void MpQueryManager::constructRequest( QString &uri )
hgs
parents:
diff changeset
   441
{
hgs
parents:
diff changeset
   442
    TX_ENTRY_ARGS( "uri =" << uri)
hgs
parents:
diff changeset
   443
    
hgs
parents:
diff changeset
   444
    QStringList keys;
hgs
parents:
diff changeset
   445
    keys << "artist" << "albumtitle" << "tracktitle" << "orderby";
hgs
parents:
diff changeset
   446
    
hgs
parents:
diff changeset
   447
    // TODO: need to clarify which crition to use for sort, currently hard code to "relevancy"
hgs
parents:
diff changeset
   448
    // order can be relevancy, alltimedownloads, streetreleasedate, sortname, recentdownloads
hgs
parents:
diff changeset
   449
    QStringList values;
hgs
parents:
diff changeset
   450
    values << mArtist << mAlbum << mTitle << QString("relevancy");
hgs
parents:
diff changeset
   451
    TX_LOG_ARGS( "Artist: " << mArtist ); 
hgs
parents:
diff changeset
   452
    TX_LOG_ARGS( "Album: " << mAlbum );
hgs
parents:
diff changeset
   453
    TX_LOG_ARGS( "Title: " << mTitle );
hgs
parents:
diff changeset
   454
    
hgs
parents:
diff changeset
   455
    uri += keyValues( keys, values );
hgs
parents:
diff changeset
   456
hgs
parents:
diff changeset
   457
    QUrl url(uri);
hgs
parents:
diff changeset
   458
    uri = url.toEncoded();
hgs
parents:
diff changeset
   459
    TX_EXIT
hgs
parents:
diff changeset
   460
}
hgs
parents:
diff changeset
   461
hgs
parents:
diff changeset
   462
/*!
hgs
parents:
diff changeset
   463
 Make a key & value pair string for querying
hgs
parents:
diff changeset
   464
 */
hgs
parents:
diff changeset
   465
QString MpQueryManager::keyValues( QStringList keys, QStringList values ) const
hgs
parents:
diff changeset
   466
{
hgs
parents:
diff changeset
   467
    TX_ENTRY
hgs
parents:
diff changeset
   468
    QString str;
hgs
parents:
diff changeset
   469
    if ( keys.length() != values.length() ) {
hgs
parents:
diff changeset
   470
        TX_LOG_ARGS( "Error: keys length is not equal to values length" ); 
hgs
parents:
diff changeset
   471
    } else {
hgs
parents:
diff changeset
   472
        for ( int i = 0; i < keys.length(); i++ ) {
hgs
parents:
diff changeset
   473
            QString tValue = values.at( i );
hgs
parents:
diff changeset
   474
            if ( 0 != tValue.length() )
hgs
parents:
diff changeset
   475
            {
hgs
parents:
diff changeset
   476
                str += keys.at( i ) + "=" + values.at( i ) + "&";
hgs
parents:
diff changeset
   477
            }
hgs
parents:
diff changeset
   478
        }
hgs
parents:
diff changeset
   479
    }
hgs
parents:
diff changeset
   480
    TX_EXIT
hgs
parents:
diff changeset
   481
    return str.left( str.length() - 1 );
hgs
parents:
diff changeset
   482
}
hgs
parents:
diff changeset
   483
36
hgs
parents: 35
diff changeset
   484
/*!
hgs
parents: 35
diff changeset
   485
 Sets recommendation album art
hgs
parents: 35
diff changeset
   486
*/
hgs
parents: 35
diff changeset
   487
void MpQueryManager::setAlbumArtUri( const QString &albumArtUri, const QString &albumArtName )
hgs
parents: 35
diff changeset
   488
{
hgs
parents: 35
diff changeset
   489
    TX_ENTRY_ARGS( "albumArtUri = " << albumArtUri )
hgs
parents: 35
diff changeset
   490
    TX_LOG_ARGS( "albumArtName = " << albumArtName )
hgs
parents: 35
diff changeset
   491
    if ( !albumArtUri.isEmpty() && !albumArtName.isEmpty() ) {
hgs
parents: 35
diff changeset
   492
        int id = mThumbnailManager->getThumbnail( albumArtName, reinterpret_cast<void *>( const_cast<QString *>( &albumArtUri ) ) );
hgs
parents: 35
diff changeset
   493
        if ( id == KUndefined ) {
hgs
parents: 35
diff changeset
   494
            // Request failed. Set default album art.
hgs
parents: 35
diff changeset
   495
            insertMapItem( albumArtUri, mDefaultRecommendationAlbumArt );
hgs
parents: 35
diff changeset
   496
        }
hgs
parents: 35
diff changeset
   497
    }
hgs
parents: 35
diff changeset
   498
    else {
hgs
parents: 35
diff changeset
   499
        // No album art uri. Set default album art.
hgs
parents: 35
diff changeset
   500
        insertMapItem( albumArtUri, mDefaultRecommendationAlbumArt );
hgs
parents: 35
diff changeset
   501
    }
hgs
parents: 35
diff changeset
   502
    TX_EXIT
hgs
parents: 35
diff changeset
   503
}
hgs
parents: 35
diff changeset
   504
hgs
parents: 35
diff changeset
   505
/*!
hgs
parents: 35
diff changeset
   506
 Slot to handle the recommendation album art 
hgs
parents: 35
diff changeset
   507
*/
hgs
parents: 35
diff changeset
   508
void MpQueryManager::thumbnailReady(
hgs
parents: 35
diff changeset
   509
        const QPixmap& pixmap,
hgs
parents: 35
diff changeset
   510
        void *data,
hgs
parents: 35
diff changeset
   511
        int /*id*/,
hgs
parents: 35
diff changeset
   512
        int error  )
hgs
parents: 35
diff changeset
   513
{
hgs
parents: 35
diff changeset
   514
    TX_ENTRY
hgs
parents: 35
diff changeset
   515
    // TODO: Hkn: use qobject_cast
hgs
parents: 35
diff changeset
   516
    QString uri = *( reinterpret_cast<QString *>( data ) );
hgs
parents: 35
diff changeset
   517
    TX_LOG_ARGS( "Uri: " << uri );
hgs
parents: 35
diff changeset
   518
    
hgs
parents: 35
diff changeset
   519
    if ( error == 0 ) {
hgs
parents: 35
diff changeset
   520
        TX_LOG_ARGS( "album art link: " << uri );
hgs
parents: 35
diff changeset
   521
        insertMapItem( uri, pixmap );
hgs
parents: 35
diff changeset
   522
    } else {
hgs
parents: 35
diff changeset
   523
        insertMapItem( uri, mDefaultRecommendationAlbumArt );
hgs
parents: 35
diff changeset
   524
    }
hgs
parents: 35
diff changeset
   525
    if(++mAlbumArtsReadyCount == KRecommendationCount) {
hgs
parents: 35
diff changeset
   526
        emit recommendationAlbumArtsReady();
hgs
parents: 35
diff changeset
   527
    }    
hgs
parents: 35
diff changeset
   528
    TX_EXIT
hgs
parents: 35
diff changeset
   529
}