messagingapp/msgui/msgaudiofetcher/src/msgaudiofetchermodel.cpp
changeset 37 518b245aa84c
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/messagingapp/msgui/msgaudiofetcher/src/msgaudiofetchermodel.cpp	Fri Jun 25 15:47:40 2010 +0530
@@ -0,0 +1,192 @@
+/*
+ * Copyright (c) 2010 Nokia Corporation and/or its subsidiary(-ies).
+ * All rights reserved.
+ * This component and the accompanying materials are made available
+ * under the terms of "Eclipse Public License v1.0"
+ * which accompanies this distribution, and is available
+ * at the URL "http://www.eclipse.org/legal/epl-v10.html".
+ *
+ * Initial Contributors:
+ * Nokia Corporation - initial contribution.
+ * 
+ * Contributors:
+ * 
+ * Description:
+ *     The source file for messaging's audio fetcher model
+ */
+
+// SYSTEM INCLUDES
+#include <xqutils.h>
+#include <xqappmgr.h>
+
+// USER INCLUDES
+#include "msgaudiofetchermodel.h"
+#include "msgaudioselectionengine.h"
+
+MsgAudioFetcherModel::MsgAudioFetcherModel(QObject *parent) :
+    QStandardItemModel(parent), mSelectionEngine(0)
+{
+    init();   
+}
+
+MsgAudioFetcherModel::~MsgAudioFetcherModel()
+{
+    delete mSelectionEngine;
+}
+
+void MsgAudioFetcherModel::init()
+{
+    mSelectionEngine = new MsgAudioSelectionEngine();
+
+    connect(mSelectionEngine, SIGNAL(mdeSessionOpened()), this, SLOT(mdeSessionOpened()));
+    connect(mSelectionEngine, SIGNAL(mdeSessionError(int)), this, SLOT(mdeSessionError(int)));
+    connect(mSelectionEngine, SIGNAL(queryComplete(QStringList, QStringList)), this,
+        SLOT(queryComplete(QStringList, QStringList)));
+    connect(mSelectionEngine, SIGNAL(queryError(int)), this, SLOT(queryError(int)));
+
+    connect(mSelectionEngine, SIGNAL(notifyObjectChanged()), this, SLOT(onObjectChanged()));
+    mSelectionEngine->CreateMetaDataSession();
+}
+
+void MsgAudioFetcherModel::getRomToneFiles()
+{
+    // z:\data\sounds\digital
+    QDir digitalsoundPath(XQUtils::romRootPath() + XQUtils::digitalSoundsPath());
+    addToneFiles(digitalsoundPath);
+
+    //z:\data\sounds\simple
+    QDir simpleSoundPath(XQUtils::romRootPath() + XQUtils::simpleSoundsPath());
+    addToneFiles(simpleSoundPath);
+
+    //z:\data\sounds
+    QDir soundPath(XQUtils::romRootPath() + XQUtils::soundsPath());
+    addToneFiles(soundPath);
+}
+
+void MsgAudioFetcherModel::addToneFiles(QDir& toneDir)
+{
+    // List only xx.amr files
+    QStringList filters;
+    filters << "*.amr";
+    toneDir.setNameFilters(filters);
+
+    QStringList soundList = toneDir.entryList();
+    for (int i = 0; i < soundList.size(); ++i) {
+        QString fullPath = QDir::toNativeSeparators(toneDir.absolutePath());
+        fullPath.append(QDir::separator());
+        fullPath.append(soundList.at(i));
+        addRow(fullPath);
+    }
+}
+
+QVariant MsgAudioFetcherModel::data(const QModelIndex &index, int role) const
+{
+    return QStandardItemModel::data(index, role);
+}
+
+void MsgAudioFetcherModel::addRow(QString filepath)
+{
+    if(isDRM(filepath))
+    {
+        // don't insert DRM protected files, as sending itself
+        // is not allowed in 'Restricted Mode'
+        return;
+    }
+
+    QFileInfo fInfo(filepath);
+    QStandardItem* item = new QStandardItem();
+    QString filename = fInfo.baseName();
+    item->setData(filename, Qt::DisplayRole);
+    item->setData(filepath, Qt::UserRole);
+
+    // get insert index
+    int index = this->insertIndex(0, rowCount(), filename);
+    insertRow(index, item);
+}
+
+int MsgAudioFetcherModel::insertIndex(int low, int high, QString value)
+{
+    if (low == high) {
+        return low;
+    }
+    int middle = (low + high - 1) / 2;
+    QModelIndex lowItemIndex = ((QStandardItemModel *) this)->index(low, 0);
+    QModelIndex highItemIndex = ((QStandardItemModel *) this)->index(high - 1, 0);
+    QModelIndex middleItemIndex = ((QStandardItemModel *) this)->index(middle, 0);
+    QString lowString = data(lowItemIndex).toString();
+    QString highString = data(highItemIndex).toString();
+    QString middleString = data(middleItemIndex).toString();
+
+    if (value >= highString) {
+        return high;
+    }
+    if (value < lowString) {
+        return low;
+    }
+    high = high - 1;
+    while (low < high) {
+        middle = (low + high) / 2;
+        middleItemIndex = ((QStandardItemModel *) this)->index(middle, 0);
+        middleString = data(middleItemIndex).toString();
+        if (value >= middleString) {
+            low = middle + 1;
+        }
+        else {
+            high = middle;
+        }
+    }
+    return low;
+}
+
+void MsgAudioFetcherModel::clearAll()
+{    
+    QStandardItemModel::clear();
+}
+
+void MsgAudioFetcherModel::mdeSessionOpened()
+{
+    mSelectionEngine->QueryTones();
+    getRomToneFiles();
+}
+
+void MsgAudioFetcherModel::queryComplete(const QStringList &nameList, const QStringList &uriList)
+{
+    for (int i = 0; i < nameList.size(); ++i) {
+        addRow(uriList.at(i));
+    }
+}
+
+void MsgAudioFetcherModel::queryError(int error)
+{
+    Q_UNUSED(error);        
+}
+
+void MsgAudioFetcherModel::mdeSessionError(int error)
+{
+    Q_UNUSED(error);
+}
+
+void MsgAudioFetcherModel::onObjectChanged()
+{
+    clearAll();
+    getRomToneFiles();
+    mSelectionEngine->QueryTones();
+}
+
+bool MsgAudioFetcherModel::isDRM(QString filepath)
+{
+    QList<int> attrNames;
+    attrNames.append(XQApplicationManager::IsProtected);
+    
+    QFile file(filepath);
+    QVariantList attrValues;
+    XQApplicationManager appmgr;
+    bool ok = appmgr.getDrmAttributes(file, attrNames, attrValues);
+    if(!ok)
+    {
+        return true;
+    }
+    return (0 < attrValues.at(0).toInt());
+}
+
+//End of File