Updated licenses to all files
[vlc-remote] / browsemainwindow.cpp
index 4ddf99e..01ed1c2 100644 (file)
@@ -1,28 +1,27 @@
 /*   VLC-REMOTE for MAEMO 5
- *   Copyright (C) 2010 Schutz Sacha <istdasklar@gmail.com>
- *   This program is free software; you can redistribute it and/or modify
- *   it under the terms of the GNU General Public License version 2,
- *   or (at your option) any later version, as published by the Free
- *   Software Foundation
- *
- *   This program is distributed in the hope that it will be useful,
- *   but WITHOUT ANY WARRANTY; without even the implied warranty of
- *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- *   GNU General Public License for more details
- *
- *   You should have received a copy of the GNU General Public
- *   License along with this program; if not, write to the
- *   Free Software Foundation, Inc.,
- *   51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
- */
+*   Copyright (C) 2010 Schutz Sacha <istdasklar@gmail.com>, Dru Moore <usr@dru-id.co.uk>
+*   This program is free software; you can redistribute it and/or modify
+*   it under the terms of the GNU General Public License version 2,
+*   or (at your option) any later version, as published by the Free
+*   Software Foundation
+*
+*   This program is distributed in the hope that it will be useful,
+*   but WITHOUT ANY WARRANTY; without even the implied warranty of
+*   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+*   GNU General Public License for more details
+*
+*   You should have received a copy of the GNU General Public
+*   License along with this program; if not, write to the
+*   Free Software Foundation, Inc.,
+*   51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
+*/
 #include "browsemainwindow.h"
 #include "ui_browsemainwindow.h"
 #include <QSettings>
-#include <QDebug>
 #include "configdialog.h"
 #include "aboutdialog.h"
 #include "vlcbrowseelement.h"
-
+#include "accountdialog.h"
 
 BrowseMainWindow::BrowseMainWindow(QWidget *parent) :
         QMainWindow(parent),
@@ -33,28 +32,37 @@ BrowseMainWindow::BrowseMainWindow(QWidget *parent) :
     mCurrentDir = "~/"; // This works on win as well as linux, would guess mac too.
     setWindowTitle("Vlc remote");
 
-    QSettings settings;
-
-    QString currentKey = settings.value("config/currentKey").toString();
-    mIp = settings.value("account/"+currentKey).toString();
 
     mNetManager = new QNetworkAccessManager(this);
 
+    mContents = new QList<VlcBrowseElement>();
+
+    ui->listWidget->setTextElideMode(Qt::ElideMiddle);
+    ui->listWidget->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
+
     ui->playButton->setIcon(QIcon::fromTheme("camera_playback"));
     ui->addButton->setIcon(QIcon::fromTheme("general_add"));
     ui->browseButton->setIcon(QIcon::fromTheme("filemanager_media_folder"));
     ui->browseButton->setDisabled(true);
     ui->playButton->setDisabled(true);
     ui->addButton->setDisabled(true);
-    //ui->listWidget->setHorizontalScrollMode(QListWidget::ScrollMode::ScrollPerItem);
-    //ui->listWidget->setHorizontalScrollHint(QListWidget::ScrollHint::PositionAtTop);
 
     connect(ui->browseButton,SIGNAL(clicked()),this,SLOT(onBrowse()));
     connect(ui->addButton,SIGNAL(clicked()),this,SLOT(onAddToPlaylist()));
     connect(ui->playButton,SIGNAL(clicked()),this,SLOT(onPlay()));
     connect(ui->listWidget, SIGNAL(itemSelectionChanged()), this, SLOT(onListSelectionChanged()));
 
-    this->browseDirectory(mCurrentDir);
+    init();
+
+
+}
+void BrowseMainWindow::init()  // THIS METHOD IS CALLED WHEN CONFIG CHANGED...
+{
+    mIp = AccountDialog::currentIp();
+}
+void BrowseMainWindow::showCurrentDirectory()  // THIS METHOD IS CALLED WHEN WINDOW IS OPENED...
+{
+    browseDirectory(mCurrentDir);
 }
 
 BrowseMainWindow::~BrowseMainWindow()
@@ -102,13 +110,11 @@ void BrowseMainWindow::onListSelectionChanged() {
 }
 
 VlcBrowseElement BrowseMainWindow::getElementFromText(QString text) {
-    //if (0 != QString::compare("", text)) {
     for (int idx = 0; idx < mContents->count(); ++idx) {
         if (0 == QString::compare(text, mContents->at(idx).name)) {
             return mContents->at(idx);
         }
     }
-    //}
     return *(new VlcBrowseElement());
 }
 
@@ -118,28 +124,55 @@ void BrowseMainWindow::onBrowse() {
         // call browseDirectory
         this->browseDirectory(mCurrentElement.path);
     }
+    else {
+        ui->browseButton->setDisabled(true);
+    }
 }
 
 void BrowseMainWindow::onAddToPlaylist() {
-    /*QNetworkReply * reply = */ mNetManager->get(QNetworkRequest(QUrl("http://"+mIp+"/requests/status.xml?command=in_enqueue&input=" + mCurrentElement.path)));
-                             }
+    QUrl url = QUrl("http://"+mIp+"/requests/status.xml?command=in_enqueue");
+    url.addEncodedQueryItem(QByteArray("input"), QUrl::toPercentEncoding(mCurrentElement.path.replace("\\", "\\\\")));
+    mNetManager->get(QNetworkRequest(url));
+    //mNetManager->get(QNetworkRequest(QUrl("http://"+mIp+"/requests/status.xml?command=in_enqueue&input=" + mCurrentElement.path.replace("\\", "\\\\"))));
+}
 
 void BrowseMainWindow::onPlay() {
-    /*QNetworkReply * reply = */ mNetManager->get(QNetworkRequest(QUrl("http://"+mIp+"/requests/status.xml?command=in_play&input=" + mCurrentElement.path)));
-                             }
+    QUrl url = QUrl("http://"+mIp+"/requests/status.xml?command=in_play");
+    url.addEncodedQueryItem(QByteArray("input"), QUrl::toPercentEncoding(mCurrentElement.path.replace("\\", "\\\\")));
+    mNetManager->get(QNetworkRequest(url));
+    //mNetManager->get(QNetworkRequest(QUrl("http://"+mIp+"/requests/status.xml?command=in_play&input=" + mCurrentElement.path.replace("\\", "\\\\"))));
+}
 
 void BrowseMainWindow::browseDirectory(QString dir) {
+    mContents->clear();
     ui->listWidget->clear();
-    QNetworkReply * reply =  mNetManager->get(QNetworkRequest(QUrl("http://"+mIp+"/requests/browse.xml?dir=" + dir)));
-    connect(reply,SIGNAL(readyRead()),this,SLOT(parseXmlDirectory()));
+    mResponse.clear();
+    QUrl url = QUrl("http://"+mIp+"/requests/browse.xml");
+    url.addEncodedQueryItem(QByteArray("dir"), QUrl::toPercentEncoding(dir));
+    QNetworkReply * reply = mNetManager->get(QNetworkRequest(url));
+    //QNetworkReply * reply =  mNetManager->get(QNetworkRequest(QUrl("http://"+mIp+"/requests/browse.xml?dir=" + dir.replace("&", "%26").replace("\\", "\\\\"))));
+    connect(reply,SIGNAL(readyRead()),this,SLOT(readReady()));
+    connect(mNetManager,SIGNAL(finished(QNetworkReply *)),this,SLOT(finished(QNetworkReply *)));
 }
-void BrowseMainWindow::parseXmlDirectory() {
+void BrowseMainWindow::readReady() {
     QNetworkReply * reply = qobject_cast<QNetworkReply*>(sender());
+    // append to buffer
+    mResponse += reply->readAll();
+}
+void BrowseMainWindow::finished(QNetworkReply * reply) {
+    // now we can call parseXmlDirectory to process the full buffers
+    this->parseXmlDirectory();
+    // only interested in finished signals
+    disconnect(mNetManager,SIGNAL(finished(QNetworkReply *)),this,SLOT(finished(QNetworkReply *)));
+}
+void BrowseMainWindow::parseXmlDirectory() {
     QDomDocument doc;
-    doc.setContent(reply->readAll());
+    doc.setContent(this->mResponse);
     QDomElement docElem = doc.documentElement();
     QDomNodeList elements = docElem.elementsByTagName("element");
-    mContents = new QList<VlcBrowseElement>();
+    // we can sort by folders then files alphabetically by running to lists and appending them at the end
+    // vlc alpha sorts everything in the incoming stream, we just need to seperate files from folders.
+    QList<VlcBrowseElement>* files = new QList<VlcBrowseElement>();
     if (0 < elements.count()) {
         int idx = 0;
         do {
@@ -150,31 +183,76 @@ void BrowseMainWindow::parseXmlDirectory() {
             dir->date = QDate::fromString(node.attributes().namedItem("date").nodeValue());
             dir->path = node.attributes().namedItem("path").nodeValue();
             dir->name = node.attributes().namedItem("name").nodeValue();
-            dir->extension = node.attributes().namedItem("extension").nodeValue();
+            dir->extension = getExtension(dir->path, node.attributes().namedItem("extension").nodeValue());
             ++idx;
-            this->mContents->append(*dir);
+            if (0 != QString::compare("directory", dir->type)) {
+                files->append(*dir);
+            }
+            else if (0 == QString::compare("..", dir->name)) {
+                this->mContents->prepend(*dir);
+            }
+            else {
+                this->mContents->append(*dir);
+            }
+            delete dir;
         } while (idx < elements.count());
+        if (0 < files->count()) {
+            mContents->append(*files);
+        }
     }
-    delete reply;
+    delete files;
+    mResponse.clear();
 
     // Update UI
     this->updateList();
 }
 
+QString BrowseMainWindow::getExtension(QString path, QString extension) {
+    // return extension if exists
+    if (!extension.isNull() && !extension.isEmpty()) return extension;
+    // return blank if no path
+    if (path.isNull() || path.isEmpty()) return "";
+    // otherwise extract the extension
+    int dot_pos = path.lastIndexOf('.');
+    if (0 < dot_pos) {
+        return path.right(path.length() - (dot_pos + 1));
+    }
+    else { // no dot
+        return "";
+    }
+}
+
+void BrowseMainWindow::writeFile(QString path, QByteArray text) {
+    QFile file(path);
+    if (!file.open(QIODevice::WriteOnly | QIODevice::Text))
+        return;
+
+    QTextStream out(&file);
+    out << text;
+}
+
 void BrowseMainWindow::updateList() {
     int ct = this->mContents->count();
     if (0 < ct) {
+        QIcon icon_up     = QIcon::fromTheme("filemanager_folder_up");
+        QIcon icon_folder = QIcon::fromTheme("general_folder");
+        QIcon icon_audio  = QIcon::fromTheme("general_audio_file");
+        QIcon icon_video  = QIcon::fromTheme("general_video_file");
+        QIcon icon_image  = QIcon::fromTheme("general_image");
+        QIcon icon_flash  = QIcon::fromTheme("filemanager_flash_file");
         for (int idx = 0; idx < ct; ++idx) {
             VlcBrowseElement dir = mContents->at(idx);
             QListWidgetItem* item;
+            bool item_good = false;
             if (0 == QString::compare("directory", dir.type)) {
                 if (0 == QString::compare("..", dir.name)) {
-                    item = new QListWidgetItem(QIcon::fromTheme("filemanager_folder_up"), dir.name, ui->listWidget, 0);
+                    item = new QListWidgetItem(icon_up, dir.name, ui->listWidget, 0);
+                    item_good = true;
                 }
                 else {
-                    item = new QListWidgetItem(QIcon::fromTheme("general_folder"), dir.name, ui->listWidget, 0);
+                    item = new QListWidgetItem(icon_folder, dir.name, ui->listWidget, 0);
+                    item_good = true;
                 }
-                ui->listWidget->addItem(item);
             }
             else if (0 == QString::compare("file", dir.type)) {
                 if ( 0 == QString::compare(dir.extension, "jpg")  ||
@@ -182,38 +260,47 @@ void BrowseMainWindow::updateList() {
                      0 == QString::compare(dir.extension, "gif")  ||
                      0 == QString::compare(dir.extension, "png")  ||
                      0 == QString::compare(dir.extension, "bmp")  ) {
-                    item = new QListWidgetItem(QIcon::fromTheme("general_image"), dir.name, ui->listWidget, 0); // .jpg, .jpeg, .gif, .png, .bmp
+                    item_good = true;
+                    item = new QListWidgetItem(icon_image, dir.name, ui->listWidget, 0); // .jpg, .jpeg, .gif, .png, .bmp
                 }
                 else if ( 0 == QString::compare(dir.extension, "mp3")  ||
-                          0 == QString::compare(dir.extension, "m4a") ||
+                          0 == QString::compare(dir.extension, "m4a")  ||
                           0 == QString::compare(dir.extension, "ogg")  ||
                           0 == QString::compare(dir.extension, "oga")  ||
                           0 == QString::compare(dir.extension, "wav")  ||
                           0 == QString::compare(dir.extension, "flac")  ) {
-                    item = new QListWidgetItem(QIcon::fromTheme("general_audio_file"), dir.name, ui->listWidget, 0); // .mp3, .m4a, .ogg, .oga, .wav, .flac
+                    item_good = true;
+                    item = new QListWidgetItem(icon_audio, dir.name, ui->listWidget, 0); // .mp3, .m4a, .ogg, .oga, .wav, .flac
                 }
-                else if ( 0 == QString::compare(dir.extension, "flv")   ||
-                          0 == QString::compare(dir.extension, "avi")  ||
+                else if ( 0 == QString::compare(dir.extension, "avi")  ||
                           0 == QString::compare(dir.extension, "mpeg") ||
+                          0 == QString::compare(dir.extension, "mpg")  ||
                           0 == QString::compare(dir.extension, "mov")  ||
                           0 == QString::compare(dir.extension, "mp4")  ||
                           0 == QString::compare(dir.extension, "wmv")  ||
                           0 == QString::compare(dir.extension, "mkv")  ||
                           0 == QString::compare(dir.extension, "ogv")  ) {
-                    item = new QListWidgetItem(QIcon::fromTheme("general_video_file"), dir.name, ui->listWidget, 0); // .flv, .avi, .mpeg, .mov, .mp4, .wmv, .mkv, .ogv
+                    item_good = true;
+                    item = new QListWidgetItem(icon_video, dir.name, ui->listWidget, 0); // .avi, .mpg, .mpeg, .mov, .mp4, .wmv, .mkv, .ogv
+                }
+                else if ( 0 == QString::compare(dir.extension, "flv")  ) {
+                    item_good = true;
+                    item = new QListWidgetItem(icon_flash, dir.name, ui->listWidget, 0); // .flv
                 }
                 else {
                     if (dir.name.startsWith("Flash")) {
-                        item = new QListWidgetItem(QIcon::fromTheme("general_video_file"), dir.name, ui->listWidget, 0);
+                        item_good = true;
+                        item = new QListWidgetItem(icon_flash, dir.name, ui->listWidget, 0);
                     }
                     else {
-                        item = new QListWidgetItem(QIcon::fromTheme("filemanager_unknown_file"), dir.name, ui->listWidget, 0);
+                        item_good = false;
                     }
                 }
+            }
+            if (item_good) {
                 ui->listWidget->addItem(item);
             }
             // other types ignored
-            //if (item) delete item;
         }
     }
 }