Ignore:
Timestamp:
May 5, 2011, 5:36:53 AM (14 years ago)
Author:
Dmitry A. Kuminov
Message:

trunk: Merged in qt 4.7.2 sources from branches/vendor/nokia/qt.

Location:
trunk
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • trunk

  • trunk/src/3rdparty/phonon/mmf/mediaobject.cpp

    r769 r846  
    3535
    3636#include <QDir>
     37#include <QResource>
    3738#include <QUrl>
     39#include <cdbcols.h>
     40#include <cdblen.h>
     41#include <commdb.h>
     42#include <mmf/common/mmfcontrollerframeworkbase.h>
    3843
    3944QT_BEGIN_NAMESPACE
     
    5358                                               , m_recognizerOpened(false)
    5459                                               , m_nextSourceSet(false)
     60                                               , m_file(0)
     61                                               , m_resource(0)
    5562{
    5663    m_player.reset(new DummyPlayer());
     
    5966    TRACE_ENTRY_0();
    6067
    61     Q_UNUSED(parent);
     68    const int err = m_fileServer.Connect();
     69    QT_TRAP_THROWING(User::LeaveIfError(err));
     70
     71    parent->installEventFilter(this);
     72    m_iap = KUseDefaultIap;
    6273
    6374    TRACE_EXIT_0();
     
    6980    TRACE_ENTRY_0();
    7081
    71     m_file.Close();
     82    parent()->removeEventFilter(this);
     83    delete m_resource;
     84
     85    if (m_file)
     86        m_file->Close();
     87    delete m_file;
     88
    7289    m_fileServer.Close();
    7390    m_recognizer.Close();
     
    89106        if (KErrNone != err) {
    90107            TRACE("RApaLsSession::Connect error %d", err);
    91             return false;
    92         }
    93 
    94         err = m_fileServer.Connect();
    95         if (KErrNone != err) {
    96             TRACE("RFs::Connect error %d", err);
    97108            return false;
    98109        }
     
    120131
    121132    if (openRecognizer()) {
    122 
    123         const QHBufC fileNameSymbian(QDir::toNativeSeparators(fileName));
    124 
    125         m_file.Close();
    126         TInt err = m_file.Open(m_fileServer, *fileNameSymbian, EFileRead | EFileShareReadersOnly);
    127 
     133        TInt err = openFileHandle(fileName);
     134        const QHBufC nativeFileName(QDir::toNativeSeparators(fileName));
    128135        if (KErrNone == err) {
    129136            TDataRecognitionResult recognizerResult;
    130             err = m_recognizer.RecognizeData(m_file, recognizerResult);
     137            err = m_recognizer.RecognizeData(*m_file, recognizerResult);
    131138            if (KErrNone == err) {
    132139                const TPtrC mimeType = recognizerResult.iDataType.Des();
    133140                result = Utils::mimeTypeToMediaType(mimeType);
    134141            } else {
    135                 TRACE("RApaLsSession::RecognizeData filename %S error %d", fileNameSymbian.data(), err);
     142                TRACE("RApaLsSession::RecognizeData filename %S error %d", nativeFileName.data(), err);
    136143            }
    137144        } else {
    138             TRACE("RFile::Open filename %S error %d", fileNameSymbian.data(), err);
     145            TRACE("RFile::Open filename %S error %d", nativeFileName.data(), err);
    139146        }
    140147    }
     
    143150}
    144151
     152int MMF::MediaObject::openFileHandle(const QString &fileName)
     153{
     154    TRACE_CONTEXT(MediaObject::openFileHandle, EAudioInternal);
     155    const QHBufC nativeFileName(QDir::toNativeSeparators(fileName));
     156    TRACE_ENTRY("filename %S", nativeFileName.data());
     157    if (m_file)
     158        m_file->Close();
     159    delete m_file;
     160    m_file = 0;
     161    m_file = new RFile;
     162    TInt err = m_file->Open(m_fileServer, *nativeFileName, EFileRead | EFileShareReadersOrWriters);
     163    return err;
     164}
     165
     166MMF::MediaType MMF::MediaObject::bufferMediaType(const uchar *data, qint64 size)
     167{
     168    TRACE_CONTEXT(MediaObject::bufferMediaType, EAudioInternal);
     169    MediaType result = MediaTypeUnknown;
     170    if (openRecognizer()) {
     171        TDataRecognitionResult recognizerResult;
     172        const TPtrC8 des(data, size);
     173        const TInt err = m_recognizer.RecognizeData(KNullDesC, des, recognizerResult);
     174        if (KErrNone == err) {
     175            const TPtrC mimeType = recognizerResult.iDataType.Des();
     176            result = Utils::mimeTypeToMediaType(mimeType);
     177        } else {
     178            TRACE("RApaLsSession::RecognizeData error %d", err);
     179        }
     180    }
     181    return result;
     182}
    145183
    146184//-----------------------------------------------------------------------------
     
    229267void MMF::MediaObject::switchToSource(const MediaSource &source)
    230268{
     269    if (m_file)
     270        m_file->Close();
     271    delete m_file;
     272    m_file = 0;
     273
     274    delete m_resource;
     275    m_resource = 0;
     276
    231277    createPlayer(source);
    232278    m_source = source;
    233     m_player->open(m_source, m_file);
     279    m_player->open();
    234280    emit currentSourceChanged(m_source);
    235281}
     
    273319    case MediaSource::Invalid:
    274320    case MediaSource::Disc:
     321        errorMessage = tr("Error opening source: type not supported");
     322        break;
     323
    275324    case MediaSource::Stream:
    276         errorMessage = tr("Error opening source: type not supported");
     325        {
     326            const QString fileName = source.url().toLocalFile();
     327            if (fileName.startsWith(QLatin1String(":/")) || fileName.startsWith(QLatin1String("qrc://"))) {
     328                Q_ASSERT(!m_resource);
     329                m_resource = new QResource(fileName);
     330                if (m_resource->isValid()) {
     331                    if (m_resource->isCompressed())
     332                        errorMessage = tr("Error opening source: resource is compressed");
     333                    else
     334                        mediaType = bufferMediaType(m_resource->data(), m_resource->size());
     335                } else {
     336                    errorMessage = tr("Error opening source: resource not valid");
     337                }
     338            } else {
     339                errorMessage = tr("Error opening source: type not supported");
     340            }
     341        }
    277342        break;
    278343
     
    281346        break;
    282347    }
     348
     349    if (oldPlayer)
     350        oldPlayer->close();
    283351
    284352    AbstractPlayer* newPlayer = 0;
     
    372440}
    373441
     442RFile* MMF::MediaObject::file() const
     443{
     444    return m_file;
     445}
     446
     447QResource* MMF::MediaObject::resource() const
     448{
     449    return m_resource;
     450}
     451
    374452//-----------------------------------------------------------------------------
    375453// MediaNode
     
    422500
    423501//-----------------------------------------------------------------------------
     502// IAP support
     503//-----------------------------------------------------------------------------
     504
     505int MMF::MediaObject::currentIAP() const
     506{
     507    return m_iap;
     508}
     509
     510bool MMF::MediaObject::eventFilter(QObject *watched, QEvent *event)
     511{
     512    if (event->type() == QEvent::DynamicPropertyChange ) {
     513        QDynamicPropertyChangeEvent* dynamicEvent = static_cast<QDynamicPropertyChangeEvent*>(event);
     514        if (dynamicEvent->propertyName() == "InternetAccessPointName") {
     515            QVariant value = watched->property("InternetAccessPointName");
     516            if (value.isValid()) {
     517                QString iapName = value.toString();
     518                TRAPD(err, setIAPIdFromNameL(iapName));
     519                if (err)
     520                    m_player->setError(tr("Failed to set requested IAP"), err);
     521            }
     522        }
     523    }
     524    return false;
     525}
     526
     527void MMF::MediaObject::setIAPIdFromNameL(const QString& iapString)
     528{
     529    TRACE_CONTEXT(MediaObject::getIapIdFromName, EVideoInternal);
     530    TBuf<KCommsDbSvrMaxColumnNameLength> iapDes = qt_QString2TPtrC(iapString);
     531    CCommsDatabase *commsDb = CCommsDatabase::NewL(EDatabaseTypeIAP);
     532    CleanupStack::PushL(commsDb);
     533    commsDb->ShowHiddenRecords();
     534    CCommsDbTableView *view = commsDb->OpenTableLC(TPtrC(IAP));
     535    for (TInt l = view->GotoFirstRecord(); l != KErrNotFound; l = view->GotoNextRecord()) {
     536        TBuf<KCommsDbSvrMaxColumnNameLength> iapName;
     537        view->ReadTextL(TPtrC(COMMDB_NAME), iapName);
     538        TRACE("found IAP %S", &iapName);
     539        if (iapName.CompareF(iapDes) == 0) {
     540            TUint32 uiap;
     541            view->ReadUintL(TPtrC(COMMDB_ID), uiap);
     542            TRACE("matched IAP %S, setting m_iap %d", &iapName, uiap);
     543            m_iap = uiap;
     544            break;
     545        }
     546    }
     547    CleanupStack::PopAndDestroy(2); // commsDb, view
     548}
     549
     550//-----------------------------------------------------------------------------
    424551// Other private functions
    425552//-----------------------------------------------------------------------------
Note: See TracChangeset for help on using the changeset viewer.