summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorTannin <devnull@localhost>2013-05-25 12:26:13 +0200
committerTannin <devnull@localhost>2013-05-25 12:26:13 +0200
commit3c21d1884a499066785e70dc44a869cb8b2d589d (patch)
treef722d7ca296ddbefe2fbd4e32fbfce624794db5b /src
parent16bda49e0667f77f4ebe1d8fa2682abf57aa6765 (diff)
parent2c4ba2c62cc7acce44d89948e7fb669d5a59b968 (diff)
Merge
Diffstat (limited to 'src')
-rw-r--r--src/downloadmanager.cpp29
-rw-r--r--src/downloadmanager.h6
-rw-r--r--src/logbuffer.cpp3
-rw-r--r--src/mainwindow.cpp26
-rw-r--r--src/nxmaccessmanager.cpp9
-rw-r--r--src/problemsdialog.cpp2
-rw-r--r--src/profile.cpp15
7 files changed, 65 insertions, 25 deletions
diff --git a/src/downloadmanager.cpp b/src/downloadmanager.cpp
index 3aeb9429..854942d0 100644
--- a/src/downloadmanager.cpp
+++ b/src/downloadmanager.cpp
@@ -42,11 +42,13 @@ using namespace MOBase;
static const char UNFINISHED[] = ".unfinished";
+unsigned int DownloadManager::DownloadInfo::s_NextDownloadID = 1U;
+
DownloadManager::DownloadInfo *DownloadManager::DownloadInfo::createNew(const NexusInfo &nexusInfo, int modID, int fileID, const QStringList &URLs)
{
DownloadInfo *info = new DownloadInfo;
-
+ info->m_DownloadID = s_NextDownloadID++;
info->m_StartTime.start();
info->m_Progress = 0;
info->m_ResumePos = 0;
@@ -88,6 +90,7 @@ DownloadManager::DownloadInfo *DownloadManager::DownloadInfo::createFromMeta(con
}
}
+ info->m_DownloadID = s_NextDownloadID++;
info->m_Output.setFileName(filePath);
info->m_ModID = metaFile.value("modID", 0).toInt();
info->m_FileID = metaFile.value("fileID", 0).toInt();
@@ -466,6 +469,18 @@ void DownloadManager::resumeDownload(int index)
}
+DownloadManager::DownloadInfo *DownloadManager::downloadInfoByID(unsigned int id)
+{
+ auto iter = std::find_if(m_ActiveDownloads.begin(), m_ActiveDownloads.end(),
+ [id](DownloadInfo *info) { return info->m_DownloadID == id; });
+ if (iter != m_ActiveDownloads.end()) {
+ return *iter;
+ } else {
+ return NULL;
+ }
+}
+
+
void DownloadManager::queryInfo(int index)
{
if ((index < 0) || (index >= m_ActiveDownloads.size())) {
@@ -637,10 +652,10 @@ void DownloadManager::setState(DownloadManager::DownloadInfo *info, DownloadMana
info->m_Reply->abort();
} break;
case STATE_FETCHINGMODINFO: {
- m_RequestIDs.insert(m_NexusInterface->requestDescription(info->m_ModID, this, qVariantFromValue(static_cast<void*>(info))));
+ m_RequestIDs.insert(m_NexusInterface->requestDescription(info->m_ModID, this, info->m_DownloadID));
} break;
case STATE_FETCHINGFILEINFO: {
- m_RequestIDs.insert(m_NexusInterface->requestFiles(info->m_ModID, this, qVariantFromValue(static_cast<void*>(info))));
+ m_RequestIDs.insert(m_NexusInterface->requestFiles(info->m_ModID, this, info->m_DownloadID));
} break;
case STATE_READY: {
createMetaFile(info);
@@ -739,7 +754,10 @@ void DownloadManager::nxmDescriptionAvailable(int, QVariant userData, QVariant r
QVariantMap result = resultData.toMap();
- DownloadInfo *info = static_cast<DownloadInfo*>(userData.value<void*>());
+// DownloadInfo *info = static_cast<DownloadInfo*>(userData.value<void*>());
+ DownloadInfo *info = downloadInfoByID(userData.toInt());
+ if (info == NULL) return;
+
info->m_NexusInfo.m_Category = result["category_id"].toInt();
info->m_NexusInfo.m_ModName = result["name"].toString().trimmed();
info->m_NexusInfo.m_NewestVersion = result["version"].toString();
@@ -761,7 +779,8 @@ void DownloadManager::nxmFilesAvailable(int, QVariant userData, QVariant resultD
m_RequestIDs.erase(idIter);
}
- DownloadInfo *info = static_cast<DownloadInfo*>(userData.value<void*>());
+ DownloadInfo *info = downloadInfoByID(userData.toInt());
+ if (info == NULL) return;
QVariantList result = resultData.toList();
diff --git a/src/downloadmanager.h b/src/downloadmanager.h
index 46e852aa..e44a0be2 100644
--- a/src/downloadmanager.h
+++ b/src/downloadmanager.h
@@ -76,6 +76,7 @@ public:
private:
struct DownloadInfo {
+ unsigned int m_DownloadID;
QString m_FileName;
QFile m_Output;
QNetworkReply *m_Reply;
@@ -109,7 +110,8 @@ private:
bool isPausedState();
QString currentURL();
-
+ private:
+ static unsigned int s_NextDownloadID;
private:
DownloadInfo() : m_TotalSize(0), m_ReQueried(false) {}
};
@@ -355,6 +357,8 @@ private:
void setState(DownloadInfo *info, DownloadManager::DownloadState state);
+ DownloadInfo *downloadInfoByID(unsigned int id);
+
private:
static const int AUTOMATIC_RETRIES = 3;
diff --git a/src/logbuffer.cpp b/src/logbuffer.cpp
index c891f4c5..d563f796 100644
--- a/src/logbuffer.cpp
+++ b/src/logbuffer.cpp
@@ -65,6 +65,8 @@ void LogBuffer::write() const
return;
}
+ DWORD lastError = ::GetLastError();
+
QFile file(m_OutFileName);
if (!file.open(QIODevice::WriteOnly)) {
reportError(tr("failed to write log to %1: %2").arg(m_OutFileName).arg(file.errorString()));
@@ -77,6 +79,7 @@ void LogBuffer::write() const
file.write(m_Messages.at(i % m_Messages.size()).toUtf8());
file.write("\r\n");
}
+ ::SetLastError(lastError);
}
diff --git a/src/mainwindow.cpp b/src/mainwindow.cpp
index 9c0559c7..4ac883e9 100644
--- a/src/mainwindow.cpp
+++ b/src/mainwindow.cpp
@@ -2403,8 +2403,15 @@ void MainWindow::refreshFilters()
ui->modList->setCurrentIndex(QModelIndex());
// save previous filter text so we can restore it later, in case the filter still exists then
- QTreeWidgetItem *currentItem = ui->categoriesList->currentItem();
- QString previousFilter = currentItem != NULL ? currentItem->text(0) : tr("<All>");
+// QTreeWidgetItem *currentItem = ui->categoriesList->currentItem();
+// QString previousFilter = currentItem != NULL ? currentItem->text(0) : tr("<All>");
+
+
+ QStringList selectedItems;
+ foreach (QTreeWidgetItem *item, ui->categoriesList->selectedItems()) {
+ selectedItems.append(item->text(0));
+ }
+
ui->categoriesList->clear();
addFilterItem(NULL, tr("<Checked>"), CategoryFactory::CATEGORY_SPECIAL_CHECKED);
@@ -2428,13 +2435,10 @@ void MainWindow::refreshFilters()
addCategoryFilters(NULL, categoriesUsed, 0);
- QList<QTreeWidgetItem*> matches = ui->categoriesList->findItems(previousFilter, Qt::MatchFixedString | Qt::MatchRecursive);
- if (matches.size() > 0) {
- QTreeWidgetItem *currentItem = matches.at(0);
- ui->categoriesList->setCurrentItem(currentItem);
- while (currentItem != NULL) {
- currentItem->setExpanded(true);
- currentItem = currentItem->parent();
+ foreach (const QString &item, selectedItems) {
+ QList<QTreeWidgetItem*> matches = ui->categoriesList->findItems(item, Qt::MatchFixedString | Qt::MatchRecursive);
+ if (matches.size() > 0) {
+ matches.at(0)->setSelected(true);
}
}
@@ -2445,10 +2449,6 @@ void MainWindow::refreshFilters()
void MainWindow::renameMod_clicked()
{
try {
-/* QModelIndex treeIdx = m_ModListGroupProxy->mapFromSource(m_ModListSortProxy->mapFromSource(m_ModList.index(m_ContextRow, 0)));
- ui->modList->setCurrentIndex(treeIdx);
- ui->modList->edit(treeIdx);*/
-
ui->modList->edit(ui->modList->currentIndex());
} catch (const std::exception &e) {
reportError(tr("failed to rename mod: %1").arg(e.what()));
diff --git a/src/nxmaccessmanager.cpp b/src/nxmaccessmanager.cpp
index 0f9f0209..dd05116d 100644
--- a/src/nxmaccessmanager.cpp
+++ b/src/nxmaccessmanager.cpp
@@ -95,10 +95,15 @@ void NXMAccessManager::login(const QString &username, const QString &password)
void NXMAccessManager::pageLogin()
{
- QString requestString = QString("http://gatekeeper.nexusmods.com/Sessions/?Login&username=%2&password=%3").arg(m_Username).arg(m_Password);
+ QString requestString = QString("http://gatekeeper.nexusmods.com/Sessions/?Login");
+ QUrl postData;
+ postData.addQueryItem("username", m_Username);
+ postData.addQueryItem("password", m_Password);
QNetworkRequest request(requestString);
- m_LoginReply = get(request);
+ request.setHeader(QNetworkRequest::ContentTypeHeader, "application/x-www-form-urlencoded");
+
+ m_LoginReply = post(request, postData.encodedQuery());
m_LoginTimeout.start();
connect(m_LoginReply, SIGNAL(finished()), this, SLOT(loginFinished()));
diff --git a/src/problemsdialog.cpp b/src/problemsdialog.cpp
index e0837f45..8173e1e2 100644
--- a/src/problemsdialog.cpp
+++ b/src/problemsdialog.cpp
@@ -24,7 +24,7 @@ ProblemsDialog::ProblemsDialog(std::vector<MOBase::IPluginDiagnose *> diagnosePl
if (diagnose->hasGuidedFix(key)) {
ui->problemsWidget->setItemWidget(newItem, 1, new QPushButton(tr("Fix")));
} else {
- newItem->setText(1, tr("No guided fix :("));
+ newItem->setText(1, tr("No guided fix"));
}
ui->problemsWidget->addTopLevelItem(newItem);
}
diff --git a/src/profile.cpp b/src/profile.cpp
index 5f98d4be..eb2eff87 100644
--- a/src/profile.cpp
+++ b/src/profile.cpp
@@ -547,6 +547,9 @@ bool Profile::invalidationActive(bool *supported) const
*supported = true;
wchar_t buffer[1024];
std::wstring iniFileName = ToWString(QDir::toNativeSeparators(getIniFileName()));
+ // epic ms fail: GetPrivateProfileString uses errno (for whatever reason) to signal a fail since the return value
+ // has a different meaning (number of bytes copied). HOWEVER, it will not set errno to 0 if NO error occured
+ errno = 0;
if (::GetPrivateProfileStringW(L"Archive", GameInfo::instance().archiveListKey().c_str(),
L"", buffer, 1024, iniFileName.c_str()) == 0) {
if (errno != 0x02) {
@@ -555,8 +558,7 @@ bool Profile::invalidationActive(bool *supported) const
}
return false;
} else {
- qCritical("failed to parse \"%ls\"", iniFileName.c_str());
- QString errorMessage = tr("failed to parse ini file (%1): %2").arg(QDir::toNativeSeparators(getIniFileName())).arg(::GetLastError());
+ QString errorMessage = tr("failed to parse ini file (%1)").arg(ToQString(iniFileName));
throw windows_error(errorMessage.toUtf8().constData());
}
}
@@ -580,6 +582,7 @@ void Profile::deactivateInvalidation() const
if (GameInfo::instance().requiresBSAInvalidation()) {
wchar_t buffer[1024];
std::wstring iniFileName = ToWString(QDir::toNativeSeparators(getIniFileName()));
+ errno = 0;
if (::GetPrivateProfileStringW(L"Archive", GameInfo::instance().archiveListKey().c_str(),
L"", buffer, 1024, iniFileName.c_str()) == 0) {
if (errno == 0x02) {
@@ -619,9 +622,15 @@ void Profile::activateInvalidation(const QString& dataDirectory) const
if (GameInfo::instance().requiresBSAInvalidation()) {
wchar_t buffer[1024];
std::wstring iniFileName = ToWString(QDir::toNativeSeparators(getIniFileName()));
+ errno = 0;
if (::GetPrivateProfileStringW(L"Archive", GameInfo::instance().archiveListKey().c_str(),
L"", buffer, 1024, iniFileName.c_str()) == 0) {
- throw windows_error("failed to parse ini file");
+ if (errno == 0x02) {
+ throw windows_error("failed to parse ini file");
+ } else {
+ // ignore. shouldn't have gotten here anyway
+ return;
+ }
}
QStringList archives = ToQString(buffer).split(", ");