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() { void Menu::editPreferences() {
Application* applicationInstance = Application::getInstance(); Application* applicationInstance = Application::getInstance();
ModelBrowser browser; ModelBrowser headBrowser(Head);
ModelBrowser skeletonBrowser(Skeleton);
const QString BROWSE_BUTTON_TEXT = "Browse"; const QString BROWSE_BUTTON_TEXT = "Browse";
@ -712,8 +713,8 @@ void Menu::editPreferences() {
QString faceURLString = applicationInstance->getAvatar()->getHead()->getFaceModel().getURL().toString(); QString faceURLString = applicationInstance->getAvatar()->getHead()->getFaceModel().getURL().toString();
QLineEdit headURLEdit(faceURLString); QLineEdit headURLEdit(faceURLString);
QPushButton headBrowseButton(BROWSE_BUTTON_TEXT); QPushButton headBrowseButton(BROWSE_BUTTON_TEXT);
connect(&headBrowseButton, SIGNAL(clicked()), &browser, SLOT(browseHead())); connect(&headBrowseButton, SIGNAL(clicked()), &headBrowser, SLOT(browse()));
connect(&browser, SIGNAL(selectedHead(QString)), &headURLEdit, SLOT(setText(QString))); connect(&headBrowser, SIGNAL(selected (QString)), &headURLEdit, SLOT(setText(QString)));
headURLEdit.setReadOnly(true); headURLEdit.setReadOnly(true);
headURLEdit.setMinimumWidth(QLINE_MINIMUM_WIDTH); headURLEdit.setMinimumWidth(QLINE_MINIMUM_WIDTH);
headURLEdit.setPlaceholderText(DEFAULT_HEAD_MODEL_URL.toString()); headURLEdit.setPlaceholderText(DEFAULT_HEAD_MODEL_URL.toString());
@ -725,8 +726,8 @@ void Menu::editPreferences() {
QString skeletonURLString = applicationInstance->getAvatar()->getSkeletonModel().getURL().toString(); QString skeletonURLString = applicationInstance->getAvatar()->getSkeletonModel().getURL().toString();
QLineEdit skeletonURLEdit(skeletonURLString); QLineEdit skeletonURLEdit(skeletonURLString);
QPushButton SkeletonBrowseButton(BROWSE_BUTTON_TEXT); QPushButton SkeletonBrowseButton(BROWSE_BUTTON_TEXT);
connect(&SkeletonBrowseButton, SIGNAL(clicked()), &browser, SLOT(browseSkeleton())); connect(&SkeletonBrowseButton, SIGNAL(clicked()), &skeletonBrowser, SLOT(browse()));
connect(&browser, SIGNAL(selectedSkeleton(QString)), &skeletonURLEdit, SLOT(setText(QString))); connect(&skeletonBrowser, SIGNAL(selected(QString)), &skeletonURLEdit, SLOT(setText(QString)));
skeletonURLEdit.setReadOnly(true); skeletonURLEdit.setReadOnly(true);
skeletonURLEdit.setMinimumWidth(QLINE_MINIMUM_WIDTH); skeletonURLEdit.setMinimumWidth(QLINE_MINIMUM_WIDTH);
skeletonURLEdit.setPlaceholderText(DEFAULT_BODY_MODEL_URL.toString()); skeletonURLEdit.setPlaceholderText(DEFAULT_BODY_MODEL_URL.toString());

View file

@ -19,23 +19,36 @@
#include "ModelBrowser.h" #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 CONTAINER_NAME = "Contents";
static const QString KEY_NAME = "Key"; static const QString KEY_NAME = "Key";
ModelBrowser::ModelBrowser(QWidget* parent) : ModelBrowser::ModelBrowser(ModelType modelType, QWidget* parent) : QWidget(parent), _type(modelType) {
QWidget(parent), QUrl url(S3_URL);
_downloader(QUrl(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) { ModelBrowser::~ModelBrowser() {
_models.clear(); delete _downloader;
if (!parseXML(modelType)) { }
return QString();
}
void ModelBrowser::downloadFinished() {
parseXML(_downloader->getData());
}
void ModelBrowser::browse() {
QDialog dialog(this); QDialog dialog(this);
dialog.setWindowTitle("Browse models"); dialog.setWindowTitle("Browse models");
@ -61,47 +74,38 @@ QString ModelBrowser::browse(ModelType modelType) {
dialog.connect(buttons, SIGNAL(rejected()), SLOT(reject())); dialog.connect(buttons, SIGNAL(rejected()), SLOT(reject()));
if (dialog.exec() == QDialog::Rejected) { if (dialog.exec() == QDialog::Rejected) {
return QString(); return;
} }
QString selectedKey = model->data(listView->currentIndex(), Qt::DisplayRole).toString(); QString selectedKey = model->data(listView->currentIndex(), Qt::DisplayRole).toString();
return _models[selectedKey];
emit selected(_models[selectedKey]);
} }
void ModelBrowser::browseHead() { bool ModelBrowser::parseXML(QByteArray xmlFile) {
QString model = browse(Head); QXmlStreamReader xml(xmlFile);
emit selectedHead(model); QRegExp rx(".*fst");
} bool truncated = false;
QString lastKey;
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");
// Read xml until the end or an error is detected // Read xml until the end or an error is detected
while(!xml.atEnd() && !xml.hasError()) { 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) { if(xml.tokenType() == QXmlStreamReader::StartElement && xml.name() == CONTAINER_NAME) {
while(!(xml.tokenType() == QXmlStreamReader::EndElement && xml.name() == CONTAINER_NAME)) { while(!(xml.tokenType() == QXmlStreamReader::EndElement && xml.name() == CONTAINER_NAME)) {
// If a file is find, process it // If a file is find, process it
if(xml.tokenType() == QXmlStreamReader::StartElement && xml.name() == KEY_NAME) { if(xml.tokenType() == QXmlStreamReader::StartElement && xml.name() == KEY_NAME) {
xml.readNext(); xml.readNext();
lastKey = xml.text().toString();
if (rx.exactMatch(xml.text().toString())) { if (rx.exactMatch(xml.text().toString())) {
// Add the found file to the list // Add the found file to the list
_models.insert(QFileInfo(xml.text().toString()).baseName(), _models.insert(QFileInfo(xml.text().toString()).baseName(),
@ -123,5 +127,24 @@ bool ModelBrowser::parseXML(ModelType modelType) {
QMessageBox::Ok); QMessageBox::Ok);
return false; 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; return true;
} }

View file

@ -27,25 +27,28 @@ class ModelBrowser : public QWidget {
Q_OBJECT Q_OBJECT
public: public:
ModelBrowser(QWidget* parent = NULL); ModelBrowser(ModelType modelType, QWidget* parent = NULL);
~ModelBrowser();
QString browse(ModelType modelType);
signals: signals:
void selectedHead(QString); void selected(QString);
void selectedSkeleton(QString);
public slots: public slots:
void browseHead(); void browse();
void browseSkeleton();
private slots:
void downloadFinished();
private: private:
FileDownloader _downloader; ModelType _type;
FileDownloader* _downloader;
QHash<QString, QString> _models; QHash<QString, QString> _models;
bool parseXML(ModelType modelType); bool parseXML(QByteArray xmlFile);
}; };
class ListView : public QListView { class ListView : public QListView {
Q_OBJECT Q_OBJECT
public: public: