Modified Browser to be able to dowload all the fst file when there are more than 1000

This commit is contained in:
Atlante45 2014-03-18 17:36:05 -07:00
parent 1e2dabfd5e
commit 76c2a9fdad
3 changed files with 82 additions and 55 deletions

View file

@ -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());

View file

@ -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;
}

View file

@ -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<QString, QString> _models;
bool parseXML(ModelType modelType);
bool parseXML(QByteArray xmlFile);
};
class ListView : public QListView {
Q_OBJECT
public: