From 76c2a9fdad11521763fa4a525b569d10e90cca46 Mon Sep 17 00:00:00 2001 From: Atlante45 Date: Tue, 18 Mar 2014 17:36:05 -0700 Subject: [PATCH] Modified Browser to be able to dowload all the fst file when there are more than 1000 --- interface/src/Menu.cpp | 11 ++-- interface/src/ModelBrowser.cpp | 105 ++++++++++++++++++++------------- interface/src/ModelBrowser.h | 21 ++++--- 3 files changed, 82 insertions(+), 55 deletions(-) diff --git a/interface/src/Menu.cpp b/interface/src/Menu.cpp index e0f2ba14ff..8352adf9f2 100644 --- a/interface/src/Menu.cpp +++ b/interface/src/Menu.cpp @@ -694,7 +694,8 @@ void Menu::loginForCurrentDomain() { void Menu::editPreferences() { Application* applicationInstance = Application::getInstance(); - ModelBrowser browser; + ModelBrowser headBrowser(Head); + ModelBrowser skeletonBrowser(Skeleton); const QString BROWSE_BUTTON_TEXT = "Browse"; @@ -712,8 +713,8 @@ void Menu::editPreferences() { QString faceURLString = applicationInstance->getAvatar()->getHead()->getFaceModel().getURL().toString(); QLineEdit headURLEdit(faceURLString); QPushButton headBrowseButton(BROWSE_BUTTON_TEXT); - connect(&headBrowseButton, SIGNAL(clicked()), &browser, SLOT(browseHead())); - connect(&browser, SIGNAL(selectedHead(QString)), &headURLEdit, SLOT(setText(QString))); + connect(&headBrowseButton, SIGNAL(clicked()), &headBrowser, SLOT(browse())); + connect(&headBrowser, SIGNAL(selected (QString)), &headURLEdit, SLOT(setText(QString))); headURLEdit.setReadOnly(true); headURLEdit.setMinimumWidth(QLINE_MINIMUM_WIDTH); headURLEdit.setPlaceholderText(DEFAULT_HEAD_MODEL_URL.toString()); @@ -725,8 +726,8 @@ void Menu::editPreferences() { QString skeletonURLString = applicationInstance->getAvatar()->getSkeletonModel().getURL().toString(); QLineEdit skeletonURLEdit(skeletonURLString); QPushButton SkeletonBrowseButton(BROWSE_BUTTON_TEXT); - connect(&SkeletonBrowseButton, SIGNAL(clicked()), &browser, SLOT(browseSkeleton())); - connect(&browser, SIGNAL(selectedSkeleton(QString)), &skeletonURLEdit, SLOT(setText(QString))); + connect(&SkeletonBrowseButton, SIGNAL(clicked()), &skeletonBrowser, SLOT(browse())); + connect(&skeletonBrowser, SIGNAL(selected(QString)), &skeletonURLEdit, SLOT(setText(QString))); skeletonURLEdit.setReadOnly(true); skeletonURLEdit.setMinimumWidth(QLINE_MINIMUM_WIDTH); skeletonURLEdit.setPlaceholderText(DEFAULT_BODY_MODEL_URL.toString()); diff --git a/interface/src/ModelBrowser.cpp b/interface/src/ModelBrowser.cpp index cf401d6b75..e03081273f 100644 --- a/interface/src/ModelBrowser.cpp +++ b/interface/src/ModelBrowser.cpp @@ -19,23 +19,36 @@ #include "ModelBrowser.h" -static const int DOWNLOAD_TIMEOUT = 1000; +static const QString PREFIX_PARAMETER_NAME = "prefix"; +static const QString MARKER_PARAMETER_NAME = "marker"; +static const QString IS_TRUNCATED_NAME = "IsTruncated"; static const QString CONTAINER_NAME = "Contents"; static const QString KEY_NAME = "Key"; -ModelBrowser::ModelBrowser(QWidget* parent) : - QWidget(parent), - _downloader(QUrl(S3_URL)) -{ +ModelBrowser::ModelBrowser(ModelType modelType, QWidget* parent) : QWidget(parent), _type(modelType) { + QUrl url(S3_URL); + QUrlQuery query; + + if (_type == Head) { + query.addQueryItem(PREFIX_PARAMETER_NAME, HEAD_MODELS_LOCATION); + } else if (_type == Skeleton) { + query.addQueryItem(PREFIX_PARAMETER_NAME, SKELETON_MODELS_LOCATION); + } + url.setQuery(query); + + _downloader = new FileDownloader(url); + connect(_downloader, SIGNAL(done(QNetworkReply::NetworkError)), SLOT(downloadFinished())); } -QString ModelBrowser::browse(ModelType modelType) { - _models.clear(); - if (!parseXML(modelType)) { - return QString(); - } - - +ModelBrowser::~ModelBrowser() { + delete _downloader; +} + +void ModelBrowser::downloadFinished() { + parseXML(_downloader->getData()); +} + +void ModelBrowser::browse() { QDialog dialog(this); dialog.setWindowTitle("Browse models"); @@ -61,47 +74,38 @@ QString ModelBrowser::browse(ModelType modelType) { dialog.connect(buttons, SIGNAL(rejected()), SLOT(reject())); if (dialog.exec() == QDialog::Rejected) { - return QString(); + return; } QString selectedKey = model->data(listView->currentIndex(), Qt::DisplayRole).toString(); - return _models[selectedKey]; -} - -void ModelBrowser::browseHead() { - QString model = browse(Head); - emit selectedHead(model); -} - -void ModelBrowser::browseSkeleton() { - QString model = browse(Skeleton); - emit selectedSkeleton(model); -} - -bool ModelBrowser::parseXML(ModelType modelType) { - _downloader.waitForFile(DOWNLOAD_TIMEOUT); - QString location; - switch (modelType) { - case Head: - location = HEAD_MODELS_LOCATION; - break; - case Skeleton: - location = SKELETON_MODELS_LOCATION; - break; - default: - return false; - } - QXmlStreamReader xml(_downloader.getData()); - QRegExp rx(location + "[^/]*fst"); + emit selected(_models[selectedKey]); +} + +bool ModelBrowser::parseXML(QByteArray xmlFile) { + QXmlStreamReader xml(xmlFile); + QRegExp rx(".*fst"); + bool truncated = false; + QString lastKey; // Read xml until the end or an error is detected while(!xml.atEnd() && !xml.hasError()) { + if(xml.tokenType() == QXmlStreamReader::StartElement && xml.name() == IS_TRUNCATED_NAME) { + while(!(xml.tokenType() == QXmlStreamReader::EndElement && xml.name() == IS_TRUNCATED_NAME)) { + // Let's check if there is more + xml.readNext(); + if (xml.text().toString() == "True") { + truncated = true; + } + } + } + if(xml.tokenType() == QXmlStreamReader::StartElement && xml.name() == CONTAINER_NAME) { while(!(xml.tokenType() == QXmlStreamReader::EndElement && xml.name() == CONTAINER_NAME)) { // If a file is find, process it if(xml.tokenType() == QXmlStreamReader::StartElement && xml.name() == KEY_NAME) { xml.readNext(); + lastKey = xml.text().toString(); if (rx.exactMatch(xml.text().toString())) { // Add the found file to the list _models.insert(QFileInfo(xml.text().toString()).baseName(), @@ -123,5 +127,24 @@ bool ModelBrowser::parseXML(ModelType modelType) { QMessageBox::Ok); return false; } + + // If we didn't all the files, download the next ones + if (truncated) { + QUrl url(S3_URL); + QUrlQuery query; + + if (_type == Head) { + query.addQueryItem(PREFIX_PARAMETER_NAME, HEAD_MODELS_LOCATION); + } else if (_type == Skeleton) { + query.addQueryItem(PREFIX_PARAMETER_NAME, SKELETON_MODELS_LOCATION); + } + query.addQueryItem(MARKER_PARAMETER_NAME, lastKey); + url.setQuery(query); + + delete _downloader; + _downloader = new FileDownloader(url); + connect(_downloader, SIGNAL(done(QNetworkReply::NetworkError)), SLOT(downloadFinished())); + } + return true; } \ No newline at end of file diff --git a/interface/src/ModelBrowser.h b/interface/src/ModelBrowser.h index 42dd65ab27..9eb27f5db6 100644 --- a/interface/src/ModelBrowser.h +++ b/interface/src/ModelBrowser.h @@ -27,25 +27,28 @@ class ModelBrowser : public QWidget { Q_OBJECT public: - ModelBrowser(QWidget* parent = NULL); - - QString browse(ModelType modelType); + ModelBrowser(ModelType modelType, QWidget* parent = NULL); + ~ModelBrowser(); signals: - void selectedHead(QString); - void selectedSkeleton(QString); + void selected(QString); public slots: - void browseHead(); - void browseSkeleton(); + void browse(); + +private slots: + void downloadFinished(); private: - FileDownloader _downloader; + ModelType _type; + FileDownloader* _downloader; QHash _models; - bool parseXML(ModelType modelType); + bool parseXML(QByteArray xmlFile); }; + + class ListView : public QListView { Q_OBJECT public: