mpviewplugins/mpdetailsviewplugin/src/mpdetailssharedialog.cpp
author hgs
Fri, 14 May 2010 18:54:37 -0500
changeset 35 fdb31ab341af
child 36 a0afa279b8fe
permissions -rw-r--r--
201019
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
35
hgs
parents:
diff changeset
     1
#ifdef SHARE_FUNC_ENABLED
hgs
parents:
diff changeset
     2
hgs
parents:
diff changeset
     3
#include "mpdetailssharedialog.h"
hgs
parents:
diff changeset
     4
#include "mpsharedata.h"
hgs
parents:
diff changeset
     5
#include "mpsongdata.h"
hgs
parents:
diff changeset
     6
#include "mptrace.h"
hgs
parents:
diff changeset
     7
#include <QObject>
hgs
parents:
diff changeset
     8
#include <QGraphicsWebView>
hgs
parents:
diff changeset
     9
#include <QGraphicsScene>
hgs
parents:
diff changeset
    10
#include <QWebPage>
hgs
parents:
diff changeset
    11
#include <QWebFrame>
hgs
parents:
diff changeset
    12
#include <QNetworkAccessManager>
hgs
parents:
diff changeset
    13
#include <QNetworkDiskCache>
hgs
parents:
diff changeset
    14
#include <QDesktopServices>
hgs
parents:
diff changeset
    15
#include <QNetworkProxyFactory>
hgs
parents:
diff changeset
    16
#include <hbmessagebox.h>
hgs
parents:
diff changeset
    17
#include <QFile>
hgs
parents:
diff changeset
    18
#include <QTextStream>
hgs
parents:
diff changeset
    19
hgs
parents:
diff changeset
    20
hgs
parents:
diff changeset
    21
// SHARE_INDEX_FILE defines where the index.html file is loaded from.
hgs
parents:
diff changeset
    22
#define SHARE_INDEX_URL "qrc:///shareview/index.html"
hgs
parents:
diff changeset
    23
hgs
parents:
diff changeset
    24
#ifdef Q_OS_SYMBIAN
hgs
parents:
diff changeset
    25
// Symbian target.
hgs
parents:
diff changeset
    26
#ifdef SHARE_PLAYER_RND
hgs
parents:
diff changeset
    27
// For R&D testing, index.html may be loaded from E: drive.
hgs
parents:
diff changeset
    28
// User must manually place index.html in the correct location.
hgs
parents:
diff changeset
    29
// If the RND file does not exist, then SHARE_INDEX_URL will be used.
hgs
parents:
diff changeset
    30
#define RND_SHARE_INDEX_URL "file:///e:/index.html"
hgs
parents:
diff changeset
    31
#define RND_SHARE_INDEX_FILE "e:\\index.html"
hgs
parents:
diff changeset
    32
#define RND_OVI_LOGIN_FILE "e:\\ovicredentials.txt"
hgs
parents:
diff changeset
    33
#define RND_DEFAULT_USER "hipsu"
hgs
parents:
diff changeset
    34
#define RND_DEFAULT_PASS "hipsupass"
hgs
parents:
diff changeset
    35
#endif
hgs
parents:
diff changeset
    36
#else
hgs
parents:
diff changeset
    37
// Assume Windows target.
hgs
parents:
diff changeset
    38
#define RND_SHARE_INDEX_URL "file:///c:/temp/index.html"
hgs
parents:
diff changeset
    39
#define RND_SHARE_INDEX_FILE "c:\\temp\\index.html"
hgs
parents:
diff changeset
    40
#define RND_OVI_LOGIN_FILE "c:\\temp\\ovicredentials.txt"
hgs
parents:
diff changeset
    41
hgs
parents:
diff changeset
    42
#endif
hgs
parents:
diff changeset
    43
hgs
parents:
diff changeset
    44
// For allowing local caching of javascript files loaded by popup
hgs
parents:
diff changeset
    45
class MpNetworkAccessManager : public QNetworkAccessManager
hgs
parents:
diff changeset
    46
{
hgs
parents:
diff changeset
    47
public:
hgs
parents:
diff changeset
    48
    MpNetworkAccessManager() { };
hgs
parents:
diff changeset
    49
hgs
parents:
diff changeset
    50
private:
hgs
parents:
diff changeset
    51
    QNetworkReply *createRequest( Operation op,
hgs
parents:
diff changeset
    52
                                 const QNetworkRequest &request,
hgs
parents:
diff changeset
    53
                                 QIODevice *outgoingData = 0 )
hgs
parents:
diff changeset
    54
    {
hgs
parents:
diff changeset
    55
        TX_ENTRY
hgs
parents:
diff changeset
    56
        QVariant val = request.attribute( QNetworkRequest::CacheLoadControlAttribute );
hgs
parents:
diff changeset
    57
        qDebug() << "request cachecontrol - " << val.typeName() << val.toInt();
hgs
parents:
diff changeset
    58
hgs
parents:
diff changeset
    59
         // Change the cache load control attrbute!
hgs
parents:
diff changeset
    60
        QNetworkRequest req = request;
hgs
parents:
diff changeset
    61
        req.setAttribute( QNetworkRequest::CacheLoadControlAttribute,
hgs
parents:
diff changeset
    62
                           QVariant( QNetworkRequest::PreferCache ) ); // was PreferNetwork
hgs
parents:
diff changeset
    63
        TX_EXIT
hgs
parents:
diff changeset
    64
        return QNetworkAccessManager::createRequest( op, req, outgoingData );
hgs
parents:
diff changeset
    65
    }
hgs
parents:
diff changeset
    66
};
hgs
parents:
diff changeset
    67
hgs
parents:
diff changeset
    68
hgs
parents:
diff changeset
    69
/*!
hgs
parents:
diff changeset
    70
 Constructor.
hgs
parents:
diff changeset
    71
 */
hgs
parents:
diff changeset
    72
MpDetailsShareDialog::MpDetailsShareDialog()
hgs
parents:
diff changeset
    73
    : mShareWebView( 0 ),
hgs
parents:
diff changeset
    74
      mShareNetAccMan( 0 )
hgs
parents:
diff changeset
    75
{
hgs
parents:
diff changeset
    76
}
hgs
parents:
diff changeset
    77
hgs
parents:
diff changeset
    78
void MpDetailsShareDialog::initialize( MpSongData* aSongData )
hgs
parents:
diff changeset
    79
{
hgs
parents:
diff changeset
    80
    TX_ENTRY
hgs
parents:
diff changeset
    81
    if ( !initUser() )
hgs
parents:
diff changeset
    82
    {
hgs
parents:
diff changeset
    83
        emit closeShareDialog();
hgs
parents:
diff changeset
    84
        return;
hgs
parents:
diff changeset
    85
    }
hgs
parents:
diff changeset
    86
    initShareData( aSongData );
hgs
parents:
diff changeset
    87
    initNetworkAccessManager();
hgs
parents:
diff changeset
    88
    initWebView();
hgs
parents:
diff changeset
    89
    initSignalSlots();
hgs
parents:
diff changeset
    90
hgs
parents:
diff changeset
    91
    setDismissPolicy( HbDialog::NoDismiss );
hgs
parents:
diff changeset
    92
hgs
parents:
diff changeset
    93
    // No timeout needed for the dialog.
hgs
parents:
diff changeset
    94
    setTimeout( HbPopup::NoTimeout );
hgs
parents:
diff changeset
    95
hgs
parents:
diff changeset
    96
#ifdef SHARE_PLAYER_RND
hgs
parents:
diff changeset
    97
    // Test whether the RND file exists.
hgs
parents:
diff changeset
    98
    QFile file( RND_SHARE_INDEX_FILE );
hgs
parents:
diff changeset
    99
    if ( file.exists() )
hgs
parents:
diff changeset
   100
    {
hgs
parents:
diff changeset
   101
        // Load the RND URL from the specified location to the web view.
hgs
parents:
diff changeset
   102
        TX_LOG_ARGS( "share: Use RND index.html file " << RND_SHARE_INDEX_FILE )
hgs
parents:
diff changeset
   103
        mShareWebView->load( QUrl( RND_SHARE_INDEX_URL ) );
hgs
parents:
diff changeset
   104
    }
hgs
parents:
diff changeset
   105
    else
hgs
parents:
diff changeset
   106
#endif
hgs
parents:
diff changeset
   107
    {
hgs
parents:
diff changeset
   108
        // Load the production URL from the application resources to the web view.
hgs
parents:
diff changeset
   109
        TX_LOG_ARGS( "share: Use QRC index.html file " << SHARE_INDEX_URL )
hgs
parents:
diff changeset
   110
        mShareWebView->load( QUrl( SHARE_INDEX_URL ) );
hgs
parents:
diff changeset
   111
    }
hgs
parents:
diff changeset
   112
    TX_EXIT
hgs
parents:
diff changeset
   113
}
hgs
parents:
diff changeset
   114
hgs
parents:
diff changeset
   115
hgs
parents:
diff changeset
   116
/*!
hgs
parents:
diff changeset
   117
 Destructor.
hgs
parents:
diff changeset
   118
 */
hgs
parents:
diff changeset
   119
MpDetailsShareDialog::~MpDetailsShareDialog()
hgs
parents:
diff changeset
   120
{
hgs
parents:
diff changeset
   121
    TX_ENTRY
hgs
parents:
diff changeset
   122
    logoutPlayer();
hgs
parents:
diff changeset
   123
    delete mShareNetAccMan;
hgs
parents:
diff changeset
   124
    TX_EXIT
hgs
parents:
diff changeset
   125
}
hgs
parents:
diff changeset
   126
hgs
parents:
diff changeset
   127
void MpDetailsShareDialog::initShareData( MpSongData* aSongData )
hgs
parents:
diff changeset
   128
{
hgs
parents:
diff changeset
   129
    TX_ENTRY
hgs
parents:
diff changeset
   130
    // Set information for the share data.
hgs
parents:
diff changeset
   131
    mShareData.setOwner( this );
hgs
parents:
diff changeset
   132
    mShareData.setSongData( aSongData );
hgs
parents:
diff changeset
   133
    // TODO need localized error message.
hgs
parents:
diff changeset
   134
    mShareData.setErrorMessage( "An error occured. Sharing is not currently available" );
hgs
parents:
diff changeset
   135
    // TODO need language setting.
hgs
parents:
diff changeset
   136
    mShareData.setLanguage( "en" );
hgs
parents:
diff changeset
   137
    TX_EXIT
hgs
parents:
diff changeset
   138
}
hgs
parents:
diff changeset
   139
hgs
parents:
diff changeset
   140
void MpDetailsShareDialog::initNetworkAccessManager()
hgs
parents:
diff changeset
   141
{
hgs
parents:
diff changeset
   142
    TX_ENTRY
hgs
parents:
diff changeset
   143
    // Make our own network access manager to allow JS retrieval from local cache,
hgs
parents:
diff changeset
   144
    // since configuration for the default network access manager seems to be
hgs
parents:
diff changeset
   145
    // to always redownload from network.
hgs
parents:
diff changeset
   146
    mShareNetAccMan = new MpNetworkAccessManager();
hgs
parents:
diff changeset
   147
    mShareNetAccMan->proxyFactory()->setUseSystemConfiguration( true );
hgs
parents:
diff changeset
   148
    QNetworkDiskCache* diskCache = new QNetworkDiskCache( this );
hgs
parents:
diff changeset
   149
    QString location = QDesktopServices::storageLocation( QDesktopServices::CacheLocation );
hgs
parents:
diff changeset
   150
    diskCache->setCacheDirectory( location );
hgs
parents:
diff changeset
   151
    mShareNetAccMan->setCache( diskCache );
hgs
parents:
diff changeset
   152
    TX_EXIT
hgs
parents:
diff changeset
   153
}
hgs
parents:
diff changeset
   154
hgs
parents:
diff changeset
   155
void MpDetailsShareDialog::initWebView()
hgs
parents:
diff changeset
   156
{
hgs
parents:
diff changeset
   157
    TX_ENTRY
hgs
parents:
diff changeset
   158
    mShareWebView = new QGraphicsWebView();
hgs
parents:
diff changeset
   159
    mShareWebView->settings()->setAttribute( QWebSettings::LocalContentCanAccessRemoteUrls, true );
hgs
parents:
diff changeset
   160
    mShareWebView->settings()->setAttribute( QWebSettings::LocalStorageDatabaseEnabled, true );
hgs
parents:
diff changeset
   161
    mShareWebView->settings()->enablePersistentStorage();
hgs
parents:
diff changeset
   162
    mShareWebView->page()->setNetworkAccessManager( mShareNetAccMan );
hgs
parents:
diff changeset
   163
    setContentWidget( mShareWebView );
hgs
parents:
diff changeset
   164
    TX_EXIT
hgs
parents:
diff changeset
   165
}
hgs
parents:
diff changeset
   166
hgs
parents:
diff changeset
   167
void MpDetailsShareDialog::initSignalSlots()
hgs
parents:
diff changeset
   168
{
hgs
parents:
diff changeset
   169
    TX_ENTRY
hgs
parents:
diff changeset
   170
    // Connect various signals to slots for interface to webview.
hgs
parents:
diff changeset
   171
    connect( mShareWebView, SIGNAL( loadFinished( bool ) ), SLOT( onIndexLoad( bool ) ) );
hgs
parents:
diff changeset
   172
    connect( mShareWebView->page()->mainFrame(), SIGNAL( javaScriptWindowObjectCleared() ), this, SLOT( addContext() ) );
hgs
parents:
diff changeset
   173
    connect( mShareWebView->page(), SIGNAL( windowCloseRequested() ), this, SIGNAL( closeShareDialog() ) );
hgs
parents:
diff changeset
   174
    TX_EXIT
hgs
parents:
diff changeset
   175
}
hgs
parents:
diff changeset
   176
hgs
parents:
diff changeset
   177
/*!
hgs
parents:
diff changeset
   178
 initUser is used as temporary solution until Single Sign On is implemented in platform.
hgs
parents:
diff changeset
   179
 */
hgs
parents:
diff changeset
   180
bool MpDetailsShareDialog::initUser()
hgs
parents:
diff changeset
   181
{
hgs
parents:
diff changeset
   182
    TX_ENTRY
hgs
parents:
diff changeset
   183
    bool result = false;
hgs
parents:
diff changeset
   184
#ifdef SHARE_PLAYER_RND
hgs
parents:
diff changeset
   185
    // ovicredentials.txt is used as temporary solution until Single Sign On is implemented in platform.
hgs
parents:
diff changeset
   186
    QFile file( RND_OVI_LOGIN_FILE );
hgs
parents:
diff changeset
   187
    if ( !file.open( QFile::ReadOnly ) )
hgs
parents:
diff changeset
   188
    {
hgs
parents:
diff changeset
   189
//        errorHandler( "share", QString( RND_OVI_LOGIN_FILE ) + " missing" );
hgs
parents:
diff changeset
   190
        mShareData.setUsername( RND_DEFAULT_USER );
hgs
parents:
diff changeset
   191
        mShareData.setPassword( RND_DEFAULT_PASS );
hgs
parents:
diff changeset
   192
        result = true;
hgs
parents:
diff changeset
   193
    }
hgs
parents:
diff changeset
   194
    else
hgs
parents:
diff changeset
   195
    {
hgs
parents:
diff changeset
   196
        QTextStream stream ( &file );
hgs
parents:
diff changeset
   197
        QString strCred = stream.readLine( 0 );
hgs
parents:
diff changeset
   198
        file.close();
hgs
parents:
diff changeset
   199
        QStringList slCred = strCred.split( ":" );
hgs
parents:
diff changeset
   200
        if ( slCred.length() > 1 )
hgs
parents:
diff changeset
   201
        {
hgs
parents:
diff changeset
   202
            mShareData.setUsername( slCred[ 0 ] );
hgs
parents:
diff changeset
   203
            mShareData.setPassword( slCred[ 1 ] );
hgs
parents:
diff changeset
   204
            result = true;
hgs
parents:
diff changeset
   205
        }
hgs
parents:
diff changeset
   206
        else
hgs
parents:
diff changeset
   207
        {
hgs
parents:
diff changeset
   208
            errorHandler( "share", QString( RND_OVI_LOGIN_FILE ) + " username:password expected" );
hgs
parents:
diff changeset
   209
        }
hgs
parents:
diff changeset
   210
    }
hgs
parents:
diff changeset
   211
    TX_LOG_ARGS( "share: credentials " << mShareData.username() << " / " << mShareData.password() )
hgs
parents:
diff changeset
   212
#else
hgs
parents:
diff changeset
   213
    // TODO: Single Sign On stuff.
hgs
parents:
diff changeset
   214
#endif // SHARE_PLAYER_RND
hgs
parents:
diff changeset
   215
    TX_EXIT
hgs
parents:
diff changeset
   216
    return result;
hgs
parents:
diff changeset
   217
}
hgs
parents:
diff changeset
   218
hgs
parents:
diff changeset
   219
/*!
hgs
parents:
diff changeset
   220
 Release resources from share player.
hgs
parents:
diff changeset
   221
 */
hgs
parents:
diff changeset
   222
void MpDetailsShareDialog::logoutPlayer()
hgs
parents:
diff changeset
   223
{
hgs
parents:
diff changeset
   224
    TX_ENTRY
hgs
parents:
diff changeset
   225
    if (mShareWebView)
hgs
parents:
diff changeset
   226
    {
hgs
parents:
diff changeset
   227
        mShareWebView->page()->mainFrame()->evaluateJavaScript( "music.teardown();" );
hgs
parents:
diff changeset
   228
    }
hgs
parents:
diff changeset
   229
    TX_EXIT
hgs
parents:
diff changeset
   230
}
hgs
parents:
diff changeset
   231
hgs
parents:
diff changeset
   232
/*!
hgs
parents:
diff changeset
   233
 Adds the shared data context to the javascript of the loaded page.
hgs
parents:
diff changeset
   234
 */
hgs
parents:
diff changeset
   235
void MpDetailsShareDialog::addContext()
hgs
parents:
diff changeset
   236
{
hgs
parents:
diff changeset
   237
    TX_ENTRY
hgs
parents:
diff changeset
   238
    if (mShareWebView)
hgs
parents:
diff changeset
   239
    {
hgs
parents:
diff changeset
   240
        mShareWebView->page()->mainFrame()->addToJavaScriptWindowObject( "context", &mShareData );
hgs
parents:
diff changeset
   241
    }
hgs
parents:
diff changeset
   242
    TX_EXIT
hgs
parents:
diff changeset
   243
}
hgs
parents:
diff changeset
   244
hgs
parents:
diff changeset
   245
/*!
hgs
parents:
diff changeset
   246
 Updates the shared data context in the javascript of the loaded page.
hgs
parents:
diff changeset
   247
 */
hgs
parents:
diff changeset
   248
void MpDetailsShareDialog::updateSharedData()
hgs
parents:
diff changeset
   249
{
hgs
parents:
diff changeset
   250
    TX_ENTRY
hgs
parents:
diff changeset
   251
    if (mShareWebView)
hgs
parents:
diff changeset
   252
    {
hgs
parents:
diff changeset
   253
        mShareWebView->page()->mainFrame()->evaluateJavaScript( "music.updateContextArea();" );
hgs
parents:
diff changeset
   254
        mShareWebView->page()->mainFrame()->evaluateJavaScript( "music.updateMetadata();" );
hgs
parents:
diff changeset
   255
    }
hgs
parents:
diff changeset
   256
    TX_EXIT
hgs
parents:
diff changeset
   257
}
hgs
parents:
diff changeset
   258
hgs
parents:
diff changeset
   259
/*!
hgs
parents:
diff changeset
   260
 Slot to call when index.html loading completes.
hgs
parents:
diff changeset
   261
 */
hgs
parents:
diff changeset
   262
void MpDetailsShareDialog::onIndexLoad( bool aOk )
hgs
parents:
diff changeset
   263
{
hgs
parents:
diff changeset
   264
    TX_ENTRY
hgs
parents:
diff changeset
   265
    if ( !aOk )
hgs
parents:
diff changeset
   266
    {
hgs
parents:
diff changeset
   267
        // Close the popup window, failed to load index.html.
hgs
parents:
diff changeset
   268
        // This is pretty serious and most likely unrecoverable error.
hgs
parents:
diff changeset
   269
        // Only thing we can do really is to close the share player
hgs
parents:
diff changeset
   270
        // dialog - TODO do we need to show any error message to user?
hgs
parents:
diff changeset
   271
        TX_LOG_ARGS( "share: failed to load index.html" )
hgs
parents:
diff changeset
   272
        emit closeShareDialog();
hgs
parents:
diff changeset
   273
    }
hgs
parents:
diff changeset
   274
    TX_EXIT
hgs
parents:
diff changeset
   275
}
hgs
parents:
diff changeset
   276
hgs
parents:
diff changeset
   277
/*!
hgs
parents:
diff changeset
   278
 Slot to call for debug output.
hgs
parents:
diff changeset
   279
 */
hgs
parents:
diff changeset
   280
void MpDetailsShareDialog::debugJs( QString s )
hgs
parents:
diff changeset
   281
{
hgs
parents:
diff changeset
   282
    TX_ENTRY
hgs
parents:
diff changeset
   283
    TX_LOG_ARGS( "share: debugJs: " << s )
hgs
parents:
diff changeset
   284
    TX_EXIT
hgs
parents:
diff changeset
   285
}
hgs
parents:
diff changeset
   286
hgs
parents:
diff changeset
   287
/*!
hgs
parents:
diff changeset
   288
 Slot to call for displaying an error message to the user.
hgs
parents:
diff changeset
   289
 */
hgs
parents:
diff changeset
   290
void MpDetailsShareDialog::errorHandler( QString error, QString message )
hgs
parents:
diff changeset
   291
{
hgs
parents:
diff changeset
   292
    TX_ENTRY
hgs
parents:
diff changeset
   293
    TX_LOG_ARGS( "share: errorHandler: " << error << ": " << message )
hgs
parents:
diff changeset
   294
    HbMessageBox::warning( error + ": " + message ); // For week16 hbwidgets
hgs
parents:
diff changeset
   295
//    HbMessageBox::launchWarningMessageBox( error + ": " + message ); // For week12 hbwidgets
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
 Slot to call to clear the web view cache.
hgs
parents:
diff changeset
   301
 */
hgs
parents:
diff changeset
   302
void MpDetailsShareDialog::clearCache()
hgs
parents:
diff changeset
   303
{
hgs
parents:
diff changeset
   304
    TX_ENTRY
hgs
parents:
diff changeset
   305
    QAbstractNetworkCache* cache = mShareNetAccMan ? mShareNetAccMan->cache() : NULL;
hgs
parents:
diff changeset
   306
    if ( cache )
hgs
parents:
diff changeset
   307
    {
hgs
parents:
diff changeset
   308
        TX_LOG_ARGS( "share: clearCache: clearing cache" )
hgs
parents:
diff changeset
   309
        cache->clear();
hgs
parents:
diff changeset
   310
#ifdef SHARE_PLAYER_RND
hgs
parents:
diff changeset
   311
        errorHandler( "Cache", "Cleared cache!" );
hgs
parents:
diff changeset
   312
#endif
hgs
parents:
diff changeset
   313
    }
hgs
parents:
diff changeset
   314
    else
hgs
parents:
diff changeset
   315
    {
hgs
parents:
diff changeset
   316
        TX_LOG_ARGS( "share: clearCache: unable to clear cache" )
hgs
parents:
diff changeset
   317
#ifdef SHARE_PLAYER_RND
hgs
parents:
diff changeset
   318
        errorHandler( "Cache", "Could not clear cache!" );
hgs
parents:
diff changeset
   319
#endif
hgs
parents:
diff changeset
   320
    }
hgs
parents:
diff changeset
   321
    TX_EXIT
hgs
parents:
diff changeset
   322
}
hgs
parents:
diff changeset
   323
hgs
parents:
diff changeset
   324
#endif // SHARE_FUNC_ENABLED