qtinternetradio/ui/src/irplaylist.cpp
changeset 3 ee64f059b8e1
child 12 608f67c22514
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/qtinternetradio/ui/src/irplaylist.cpp	Fri May 14 15:43:29 2010 +0300
@@ -0,0 +1,284 @@
+/*
+* Copyright (c) 2009 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:
+*
+*/
+#include <QFile>
+#include <QTextStream>
+#include <QStringList>
+#include <HbGlobal>
+#include "irplaylist.h"
+#include "irqisdsdatastructure.h"
+
+const QString KEqual("=");
+const QString KFile("File");
+const QString KTitle("Title");
+const QString KLength("Length");
+const QString KPlsExtension(".pls");
+const QString KM3uExtension(".m3u");
+const QString KHttpProtocol("http");
+const QString KMmsProtocol("mms");
+const QString KRtspProtocol("rtsp");
+const QString KM3uComment("#EXTINF");
+
+IRPlayListItem::IRPlayListItem(const QString &aFile, const QString &aTitle, int aLength) :
+                                     iFile(aFile), iTitle(aTitle), iLength(aLength)
+{
+}
+
+const QString & IRPlayListItem::file() const
+{
+    return iFile;
+}
+
+const QString & IRPlayListItem::title() const
+{
+    return iTitle;
+}
+
+IRPlayList::IRPlayList()
+{
+}
+
+IRPlayList::~IRPlayList()
+{
+    clearPlayList();
+}
+    
+void IRPlayList::parseFile(const QString &aFileName)
+{
+    iFileName = aFileName;
+    QString extension = aFileName.right(4);
+    
+    if (0 == extension.compare(KPlsExtension, Qt::CaseInsensitive))
+    {
+        parsePlsFile(aFileName);
+    }
+    else if (0 == extension.compare(KM3uExtension, Qt::CaseInsensitive))
+    {
+        parseM3uFile(aFileName);
+    }
+    else
+    {
+        Q_ASSERT(false);
+    }
+}
+    
+int IRPlayList::getNumberOfEntries() const
+{
+    return iItemList.count();
+}
+
+IRPlayListItem* IRPlayList::getEntry(int aIndex)
+{
+    if (aIndex >=0 && aIndex < iItemList.count())
+    {
+        return iItemList.at(aIndex);
+    }
+    
+    return NULL;
+}
+
+/*
+ * create an object of IRQPreset for item at aIndex.
+ * Note : caller must be responsible for deleting the returned object
+ */
+IRQPreset* IRPlayList::getPresetForEntry(int aIndex)
+{
+    IRQPreset *preset = NULL;
+    if (aIndex >=0 && aIndex < iItemList.count())
+    {
+        preset = new IRQPreset;
+        IRPlayListItem *item = iItemList.at(aIndex);
+        IRQChannelServerURL server;
+        server.bitrate = 0;
+        server.url = item->file();
+        server.serverName = item->title();
+        
+        preset->insertChannelServer(server);
+        preset->name = item->title();
+        preset->description = item->file();
+        preset->shortDesc = item->file();
+        preset->type = 0;
+        preset->uniqID = 0;
+        preset->presetId = 0;
+    }
+    
+    return preset;
+}
+
+const QString& IRPlayList::getFileName() const
+{
+    return iFileName;
+}
+
+void IRPlayList::deleteItem(int aIndex)
+{
+    if (aIndex >=0 && aIndex < iItemList.count())
+    {
+        IRPlayListItem *item = iItemList.at(aIndex);
+        delete item;
+        iItemList.removeAt(aIndex);
+    }
+}
+
+void IRPlayList::parsePlsFile(const QString &aFileName)
+{
+    if (aFileName.length() == 0)
+    {
+        return;
+    }
+  
+    clearPlayList();
+    
+    QFile file(aFileName);
+    if (!file.open(QIODevice::ReadOnly))
+    {
+        return;
+    }
+    
+    QTextStream stream(&file);
+    QString readStr = stream.readLine().trimmed();
+    if (readStr.compare("[playlist]", Qt::CaseInsensitive))
+    {
+        file.close();
+        return;
+    }
+    
+    readStr = stream.readLine().trimmed();
+    QStringList splitStr = readStr.split(KEqual);
+    if (splitStr.count() != 2)
+    {
+        file.close();
+        return;
+    }
+    
+    int nbEntries = 0;
+    if (0 == splitStr.first().compare("NumberOfEntries", Qt::CaseInsensitive))
+    {
+        nbEntries = splitStr.last().toInt();
+    }
+    
+    if (nbEntries <= 0)
+    {
+        file.close();
+        return;
+    }
+    
+    for (int i = 0; i < nbEntries; ++i)
+    {
+        //read file line : File=xxx     
+        QString filePath = readValue(stream, KFile);
+        if (filePath.length() == 0)
+        {
+            break;
+        }
+        
+        //read title line : Title=xxx
+        QString title = readValue(stream, KTitle);
+        if (title.length() == 0)
+        {
+            break;
+        }
+        
+        //read length line : Length=xxx
+        QString strLength = readValue(stream, KLength);
+        if (strLength.length() == 0)
+        {
+            break;
+        }
+        
+        int length = strLength.toInt();
+        
+        //all information is ready
+        if (length == -1)
+        {
+            IRPlayListItem *item = new IRPlayListItem(filePath, title, length);
+            iItemList.append(item);
+        }
+    }
+    
+    file.close();
+}
+
+void IRPlayList::parseM3uFile(const QString &aFileName)
+{
+    clearPlayList();
+    
+    QFile file(aFileName);
+    if (!file.open(QIODevice::ReadOnly))
+    {
+        return;
+    }
+    
+    QTextStream stream(&file);
+    QString previousLine;
+    QString currentLine;
+    
+    while (!stream.atEnd())
+    {
+        currentLine = stream.readLine().trimmed();
+        if (currentLine.startsWith(KHttpProtocol, Qt::CaseInsensitive) ||
+            currentLine.startsWith(KMmsProtocol, Qt::CaseInsensitive) ||
+            currentLine.startsWith(KRtspProtocol, Qt::CaseInsensitive) )
+        {
+            IRPlayListItem *item = NULL;
+            if (previousLine.startsWith(KM3uComment, Qt::CaseInsensitive))
+            {
+                //previousLine can be used as station name
+                item = new IRPlayListItem(currentLine, previousLine, -1);
+            }
+            else
+            {
+                //no station name is available
+                item = new IRPlayListItem(currentLine, hbTrId("txt_irad_info_unnamed"), -1);
+            }
+            iItemList.append(item);
+        }
+        
+        previousLine = currentLine;
+    }
+    
+    file.close();
+}
+
+void IRPlayList::clearPlayList()
+{
+    while (!iItemList.isEmpty())
+    {
+        IRPlayListItem *firstItem = iItemList.takeFirst();
+        delete firstItem;
+    }
+}
+
+QString IRPlayList::readValue(QTextStream &aStream, const QString &aKey)
+{
+    QString readStr;
+    QStringList splitStr;
+    
+    do
+    {
+        readStr = aStream.readLine().trimmed();    
+    }while (readStr.length() == 0 && !aStream.atEnd());
+            
+    splitStr = readStr.split(KEqual);
+    if (splitStr.count() != 2 || !splitStr.first().startsWith(aKey, Qt::CaseInsensitive))
+    {
+        return QString();
+    }
+    else
+    {
+        return splitStr.last();
+    }
+}