From 5ad95134dc521d5eeb85cc37e6681b72b8d62c62 Mon Sep 17 00:00:00 2001 From: robotbrainify Date: Fri, 6 Dec 2013 16:24:55 -0500 Subject: [PATCH] work on pasting instance logs blame clang for formatting changes --- CMakeLists.txt | 222 +++++++++++++++++++------------------- gui/ConsoleWindow.cpp | 19 ++++ gui/ConsoleWindow.h | 2 + gui/ConsoleWindow.ui | 7 ++ logic/net/PasteUpload.cpp | 84 +++++++++++++++ logic/net/PasteUpload.h | 30 ++++++ 6 files changed, 254 insertions(+), 110 deletions(-) create mode 100644 logic/net/PasteUpload.cpp create mode 100644 logic/net/PasteUpload.h diff --git a/CMakeLists.txt b/CMakeLists.txt index 79a69225..3f9c435b 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,8 +1,8 @@ cmake_minimum_required(VERSION 2.8.9) IF(WIN32) - # In Qt 5.1+ we have our own main() function, don't autolink to qtmain on Windows - cmake_policy(SET CMP0020 OLD) + # In Qt 5.1+ we have our own main() function, don't autolink to qtmain on Windows + cmake_policy(SET CMP0020 OLD) ENDIF() project(MultiMC) @@ -21,20 +21,20 @@ SET(MMC_BIN "${PROJECT_BINARY_DIR}") SET(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${PROJECT_BINARY_DIR}) IF(UNIX) - SET(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${PROJECT_BINARY_DIR}) + SET(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${PROJECT_BINARY_DIR}) ENDIF() ######## Set compiler flags ######## IF(APPLE) - message(STATUS "Using APPLE CMAKE_CXX_FLAGS") - SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11 -Wall") + message(STATUS "Using APPLE CMAKE_CXX_FLAGS") + SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11 -Wall") ELSEIF(UNIX) - # assume GCC, add C++0x/C++11 stuff - MESSAGE(STATUS "Using UNIX CMAKE_CXX_FLAGS") - SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11 -Wall") + # assume GCC, add C++0x/C++11 stuff + MESSAGE(STATUS "Using UNIX CMAKE_CXX_FLAGS") + SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11 -Wall") ELSEIF(MINGW) - MESSAGE(STATUS "Using MINGW CMAKE_CXX_FLAGS") - SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=gnu++11 -Wall") + MESSAGE(STATUS "Using MINGW CMAKE_CXX_FLAGS") + SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=gnu++11 -Wall") ENDIF() ################################ INCLUDE LIBRARIES ################################ @@ -51,11 +51,11 @@ include_directories(${Qt5Widgets_INCLUDE_DIRS}) # The Qt5 cmake files don't provide its install paths, so ask qmake. get_target_property(QMAKE_EXECUTABLE Qt5::qmake LOCATION) function(QUERY_QMAKE VAR RESULT) - exec_program(${QMAKE_EXECUTABLE} ARGS "-query ${VAR}" RETURN_VALUE return_code OUTPUT_VARIABLE output ) - if(NOT return_code) - file(TO_CMAKE_PATH "${output}" output) - set(${RESULT} ${output} PARENT_SCOPE) - endif(NOT return_code) + exec_program(${QMAKE_EXECUTABLE} ARGS "-query ${VAR}" RETURN_VALUE return_code OUTPUT_VARIABLE output ) + if(NOT return_code) + file(TO_CMAKE_PATH "${output}" output) + set(${RESULT} ${output} PARENT_SCOPE) + endif(NOT return_code) endfunction(QUERY_QMAKE) query_qmake(QT_INSTALL_PLUGINS QT_PLUGINS_DIR) @@ -103,7 +103,7 @@ include_directories(${LIBGROUPVIEW_INCLUDE_DIR}) INCLUDE(TestBigEndian) TEST_BIG_ENDIAN(BIGENDIAN) IF(${BIGENDIAN}) - ADD_DEFINITIONS(-DMULTIMC_BIG_ENDIAN) + ADD_DEFINITIONS(-DMULTIMC_BIG_ENDIAN) ENDIF(${BIGENDIAN}) @@ -120,11 +120,11 @@ SET(MultiMC_VERSION_BUILD_TYPE "custombuild" CACHE STRING "Build type. Usually c SET(MultiMC_VERSION_STRING "${MultiMC_VERSION_MAJOR}.${MultiMC_VERSION_MINOR}") IF (MultiMC_VERSION_BUILD GREATER -1) - SET(MultiMC_VERSION_STRING "${MultiMC_VERSION_STRING}.${MultiMC_VERSION_BUILD}") + SET(MultiMC_VERSION_STRING "${MultiMC_VERSION_STRING}.${MultiMC_VERSION_BUILD}") ENDIF () IF (NOT MultiMC_VERSION_BUILD_TYPE STREQUAL "") - SET(MultiMC_VERSION_STRING "${MultiMC_VERSION_STRING}-${MultiMC_VERSION_BUILD_TYPE}") + SET(MultiMC_VERSION_STRING "${MultiMC_VERSION_STRING}-${MultiMC_VERSION_BUILD_TYPE}") ENDIF () MESSAGE(STATUS "MultiMC 5 version ${MultiMC_VERSION_STRING}") @@ -134,56 +134,56 @@ ADD_CUSTOM_TARGET(version echo "Version: ${MultiMC_VERSION_STRING}") # Check the current Git commit execute_process(COMMAND git rev-parse HEAD - WORKING_DIRECTORY ${CMAKE_SOURCE_DIR} - RESULT_VARIABLE GIT_COMMIT_CHECK_RESULTVAR - OUTPUT_VARIABLE GIT_COMMIT_CHECK_OUTVAR - OUTPUT_STRIP_TRAILING_WHITESPACE + WORKING_DIRECTORY ${CMAKE_SOURCE_DIR} + RESULT_VARIABLE GIT_COMMIT_CHECK_RESULTVAR + OUTPUT_VARIABLE GIT_COMMIT_CHECK_OUTVAR + OUTPUT_STRIP_TRAILING_WHITESPACE ) # If Git executed successfully IF(GIT_COMMIT_CHECK_RESULTVAR EQUAL 0) - SET(MultiMC_GIT_COMMIT "${GIT_COMMIT_CHECK_OUTVAR}") - MESSAGE(STATUS "Git commit: ${MultiMC_GIT_COMMIT}") + SET(MultiMC_GIT_COMMIT "${GIT_COMMIT_CHECK_OUTVAR}") + MESSAGE(STATUS "Git commit: ${MultiMC_GIT_COMMIT}") ELSE() - SET(MultiMC_GIT_COMMIT "Unknown") - MESSAGE(STATUS "Failed to check Git commit. ${GIT_COMMIT_CHECK_RESULTVAR}") + SET(MultiMC_GIT_COMMIT "Unknown") + MESSAGE(STATUS "Failed to check Git commit. ${GIT_COMMIT_CHECK_RESULTVAR}") ENDIF() ######## Set Jenkins info ######## # Jenkins build tag IF(DEFINED MultiMC_BUILD_TAG) - MESSAGE(STATUS "Build tag: ${MultiMC_BUILD_TAG}") + MESSAGE(STATUS "Build tag: ${MultiMC_BUILD_TAG}") ELSE() - MESSAGE(STATUS "No build tag specified.") - SET(MultiMC_BUILD_TAG custom) + MESSAGE(STATUS "No build tag specified.") + SET(MultiMC_BUILD_TAG custom) ENDIF() # Architecture detection IF(CMAKE_SIZEOF_VOID_P EQUAL 8) - SET(MultiMC_ARCH "x64" CACHE STRING "Architecture we're building for.") + SET(MultiMC_ARCH "x64" CACHE STRING "Architecture we're building for.") ELSE() - SET(MultiMC_ARCH "x86" CACHE STRING "Architecture we're building for.") + SET(MultiMC_ARCH "x86" CACHE STRING "Architecture we're building for.") ENDIF() MESSAGE(STATUS "Architecture is ${MultiMC_ARCH}") # Jenkins job name IF(WIN32) - SET(MultiMC_JOB_NAME "MultiMC5Windows" CACHE STRING "Jenkins job name.") + SET(MultiMC_JOB_NAME "MultiMC5Windows" CACHE STRING "Jenkins job name.") ELSEIF(UNIX AND APPLE) - SET(MultiMC_JOB_NAME "MultiMC5OSX" CACHE STRING "Jenkins job name.") + SET(MultiMC_JOB_NAME "MultiMC5OSX" CACHE STRING "Jenkins job name.") ELSE() - SET(MultiMC_JOB_NAME "MultiMC5Linux" CACHE STRING "Jenkins job name.") + SET(MultiMC_JOB_NAME "MultiMC5Linux" CACHE STRING "Jenkins job name.") ENDIF() # Jenkins URL SET(MultiMC_JOB_URL "http://ci.forkk.net/job/${MultiMC_JOB_NAME}/arch=${MultiMC_ARCH}${MultiMC_Extra_Label}/" - CACHE STRING "URL of the jenkins job to pull updates from.") + CACHE STRING "URL of the jenkins job to pull updates from.") MESSAGE(STATUS "Job URL: ${MultiMC_JOB_URL}") ######## Configure header ######## configure_file("${PROJECT_SOURCE_DIR}/config.h.in" - "${PROJECT_BINARY_DIR}/include/config.h") + "${PROJECT_BINARY_DIR}/include/config.h") ######## Other Stuff ######## @@ -300,6 +300,8 @@ logic/net/HttpMetaCache.h logic/net/HttpMetaCache.cpp logic/net/S3ListBucket.h logic/net/S3ListBucket.cpp +logic/net/PasteUpload.h +logic/net/PasteUpload.cpp # Yggdrasil login stuff logic/auth/MojangAccount.h @@ -425,11 +427,11 @@ ENDIF() ####### X11 Stuff ####### IF(UNIX AND NOT APPLE) - SET(MultiMC_QT_ADDITIONAL_MODULES ${MultiMC_QT_ADDITIONAL_MODULES} X11Extras) - SET(MultiMC_LINK_ADDITIONAL_LIBS ${MultiMC_LINK_ADDITIONAL_LIBS} xcb) - LIST(APPEND MULTIMC_SOURCES gui/Platform_X11.cpp) + SET(MultiMC_QT_ADDITIONAL_MODULES ${MultiMC_QT_ADDITIONAL_MODULES} X11Extras) + SET(MultiMC_LINK_ADDITIONAL_LIBS ${MultiMC_LINK_ADDITIONAL_LIBS} xcb) + LIST(APPEND MULTIMC_SOURCES gui/Platform_X11.cpp) ELSE() - LIST(APPEND MULTIMC_SOURCES gui/Platform_Other.cpp) + LIST(APPEND MULTIMC_SOURCES gui/Platform_Other.cpp) ENDIF() @@ -437,16 +439,16 @@ ENDIF() # ICNS file for OS X IF(APPLE) - SET(MACOSX_BUNDLE_ICON_FILE MultiMC.icns) - SET_SOURCE_FILES_PROPERTIES(${CMAKE_CURRENT_SOURCE_DIR}/MultiMC.icns PROPERTIES MACOSX_PACKAGE_LOCATION Resources) - SET(MULTIMC_SOURCES ${MULTIMC_SOURCES} ${CMAKE_CURRENT_SOURCE_DIR}/MultiMC.icns) + SET(MACOSX_BUNDLE_ICON_FILE MultiMC.icns) + SET_SOURCE_FILES_PROPERTIES(${CMAKE_CURRENT_SOURCE_DIR}/MultiMC.icns PROPERTIES MACOSX_PACKAGE_LOCATION Resources) + SET(MULTIMC_SOURCES ${MULTIMC_SOURCES} ${CMAKE_CURRENT_SOURCE_DIR}/MultiMC.icns) ENDIF(APPLE) # Link additional libraries IF(WIN32) - SET(MultiMC_LINK_ADDITIONAL_LIBS ${MultiMC_LINK_ADDITIONAL_LIBS} - Qt5::WinMain # Link WinMain - ) + SET(MultiMC_LINK_ADDITIONAL_LIBS ${MultiMC_LINK_ADDITIONAL_LIBS} + Qt5::WinMain # Link WinMain + ) ENDIF(WIN32) # Tell CMake that MultiMCLauncher.jar is generated. @@ -461,7 +463,7 @@ QT5_ADD_RESOURCES(GRAPHICS_QRC graphics.qrc) # Add executable ADD_EXECUTABLE(MultiMC MACOSX_BUNDLE WIN32 - ${MULTIMC_SOURCES} ${MULTIMC_UI} ${GRAPHICS_QRC} ${GENERATED_QRC} ${MULTIMC_RCS}) + ${MULTIMC_SOURCES} ${MULTIMC_UI} ${GRAPHICS_QRC} ${GENERATED_QRC} ${MULTIMC_RCS}) # Link TARGET_LINK_LIBRARIES(MultiMC xz-embedded unpack200 quazip libUtil libSettings libGroupView ${MultiMC_LINK_ADDITIONAL_LIBS}) @@ -473,23 +475,23 @@ ADD_DEPENDENCIES(MultiMC MultiMCLauncher JavaCheck) ######## Packaging/install paths setup ######## IF(UNIX AND APPLE) - SET(PLUGIN_DEST_DIR MultiMC.app/Contents/MacOS) - SET(QTCONF_DEST_DIR MultiMC.app/Contents/Resources) - SET(APPS "\${CMAKE_INSTALL_PREFIX}/MultiMC.app") + SET(PLUGIN_DEST_DIR MultiMC.app/Contents/MacOS) + SET(QTCONF_DEST_DIR MultiMC.app/Contents/Resources) + SET(APPS "\${CMAKE_INSTALL_PREFIX}/MultiMC.app") - SET(MACOSX_BUNDLE_BUNDLE_NAME "MultiMC") - SET(MACOSX_BUNDLE_INFO_STRING "MultiMC Minecraft launcher and management utility.") - SET(MACOSX_BUNDLE_BUNDLE_VERSION "${MultiMC_VERSION_MAJOR}.${MultiMC_VERSION_MINOR}.${MultiMC_VERSION_REV}.${MultiMC_VERSION_BUILD}") - #SET(MACOSX_BUNDLE_GUI_IDENTIFIER "") - SET(MACOSX_BUNDLE_ICON_FILE MultiMC.icns) + SET(MACOSX_BUNDLE_BUNDLE_NAME "MultiMC") + SET(MACOSX_BUNDLE_INFO_STRING "MultiMC Minecraft launcher and management utility.") + SET(MACOSX_BUNDLE_BUNDLE_VERSION "${MultiMC_VERSION_MAJOR}.${MultiMC_VERSION_MINOR}.${MultiMC_VERSION_REV}.${MultiMC_VERSION_BUILD}") + #SET(MACOSX_BUNDLE_GUI_IDENTIFIER "") + SET(MACOSX_BUNDLE_ICON_FILE MultiMC.icns) ELSEIF(UNIX) - SET(PLUGIN_DEST_DIR plugins) - SET(QTCONF_DEST_DIR .) - SET(APPS "\${CMAKE_INSTALL_PREFIX}/bin/MultiMC") + SET(PLUGIN_DEST_DIR plugins) + SET(QTCONF_DEST_DIR .) + SET(APPS "\${CMAKE_INSTALL_PREFIX}/bin/MultiMC") ELSEIF(WIN32) - SET(PLUGIN_DEST_DIR .) - SET(QTCONF_DEST_DIR .) - SET(APPS "\${CMAKE_INSTALL_PREFIX}/MultiMC.exe") + SET(PLUGIN_DEST_DIR .) + SET(QTCONF_DEST_DIR .) + SET(APPS "\${CMAKE_INSTALL_PREFIX}/MultiMC.exe") ENDIF() # directories to look for dependencies @@ -499,24 +501,24 @@ SET(DIRS "${QT_LIBS_DIR}") #### Executable #### IF(APPLE AND UNIX) ## OSX - INSTALL(TARGETS MultiMC - BUNDLE DESTINATION . COMPONENT Runtime - RUNTIME DESTINATION MultiMC.app/Contents/MacOS COMPONENT Runtime - ) + INSTALL(TARGETS MultiMC + BUNDLE DESTINATION . COMPONENT Runtime + RUNTIME DESTINATION MultiMC.app/Contents/MacOS COMPONENT Runtime + ) ELSEIF(UNIX) ## LINUX and similar - INSTALL(TARGETS MultiMC - BUNDLE DESTINATION . COMPONENT Runtime - RUNTIME DESTINATION bin COMPONENT Runtime - ) - INSTALL(PROGRAMS package/linux/MultiMC DESTINATION .) + INSTALL(TARGETS MultiMC + BUNDLE DESTINATION . COMPONENT Runtime + RUNTIME DESTINATION bin COMPONENT Runtime + ) + INSTALL(PROGRAMS package/linux/MultiMC DESTINATION .) ELSEIF(WIN32) ## WINDOWS - INSTALL(TARGETS MultiMC - BUNDLE DESTINATION . COMPONENT Runtime - LIBRARY DESTINATION . COMPONENT Runtime - RUNTIME DESTINATION . COMPONENT Runtime - ) + INSTALL(TARGETS MultiMC + BUNDLE DESTINATION . COMPONENT Runtime + LIBRARY DESTINATION . COMPONENT Runtime + RUNTIME DESTINATION . COMPONENT Runtime + ) ENDIF() #### Dist package logic #### @@ -524,64 +526,64 @@ ENDIF() if (CMAKE_BUILD_TYPE STREQUAL "Debug" OR CMAKE_BUILD_TYPE STREQUAL "RelWithDebInfo") # Image formats INSTALL( - DIRECTORY "${QT_PLUGINS_DIR}/imageformats" - DESTINATION ${PLUGIN_DEST_DIR} - COMPONENT Runtime - REGEX "tga|svg|tiff|mng" EXCLUDE + DIRECTORY "${QT_PLUGINS_DIR}/imageformats" + DESTINATION ${PLUGIN_DEST_DIR} + COMPONENT Runtime + REGEX "tga|svg|tiff|mng" EXCLUDE ) # Platform plugins INSTALL( - DIRECTORY "${QT_PLUGINS_DIR}/platforms" - DESTINATION ${PLUGIN_DEST_DIR} - COMPONENT Runtime - REGEX "minimal|linuxfb|offscreen" EXCLUDE + DIRECTORY "${QT_PLUGINS_DIR}/platforms" + DESTINATION ${PLUGIN_DEST_DIR} + COMPONENT Runtime + REGEX "minimal|linuxfb|offscreen" EXCLUDE ) else() # Image formats INSTALL( - DIRECTORY "${QT_PLUGINS_DIR}/imageformats" - DESTINATION ${PLUGIN_DEST_DIR} - COMPONENT Runtime - REGEX "tga|svg|tiff|mng" EXCLUDE - REGEX "d\\." EXCLUDE - REGEX "_debug\\." EXCLUDE + DIRECTORY "${QT_PLUGINS_DIR}/imageformats" + DESTINATION ${PLUGIN_DEST_DIR} + COMPONENT Runtime + REGEX "tga|svg|tiff|mng" EXCLUDE + REGEX "d\\." EXCLUDE + REGEX "_debug\\." EXCLUDE ) # Platform plugins INSTALL( - DIRECTORY "${QT_PLUGINS_DIR}/platforms" - DESTINATION ${PLUGIN_DEST_DIR} - COMPONENT Runtime - REGEX "minimal|linuxfb|offscreen" EXCLUDE - REGEX "d\\." EXCLUDE - REGEX "_debug\\." EXCLUDE + DIRECTORY "${QT_PLUGINS_DIR}/platforms" + DESTINATION ${PLUGIN_DEST_DIR} + COMPONENT Runtime + REGEX "minimal|linuxfb|offscreen" EXCLUDE + REGEX "d\\." EXCLUDE + REGEX "_debug\\." EXCLUDE ) endif() # qtconf INSTALL( - CODE " + CODE " FILE(WRITE \"\${CMAKE_INSTALL_PREFIX}/${QTCONF_DEST_DIR}/qt.conf\" \"\") " - COMPONENT Runtime + COMPONENT Runtime ) INSTALL( - CODE " + CODE " FILE(GLOB_RECURSE QTPLUGINS \"\${CMAKE_INSTALL_PREFIX}/${PLUGIN_DEST_DIR}/*${CMAKE_SHARED_LIBRARY_SUFFIX}\") function(gp_resolved_file_type_override resolved_file type_var) - if(resolved_file MATCHES \"^/usr/lib/libQt\") - message(\"resolving \${resolved_file} as other\") - set(\${type_var} other PARENT_SCOPE) + if(resolved_file MATCHES \"^/usr/lib/libQt\") + message(\"resolving \${resolved_file} as other\") + set(\${type_var} other PARENT_SCOPE) endif() endfunction() include(BundleUtilities) fixup_bundle(\"${APPS}\" \"\${QTPLUGINS}\" \"${DIRS}\") " - COMPONENT Runtime + COMPONENT Runtime ) @@ -590,13 +592,13 @@ fixup_bundle(\"${APPS}\" \"\${QTPLUGINS}\" \"${DIRS}\") # Package with CPack IF(UNIX) - if(APPLE) - SET(CPACK_GENERATOR "ZIP") - else() - SET(CPACK_GENERATOR "TGZ") - endif() + if(APPLE) + SET(CPACK_GENERATOR "ZIP") + else() + SET(CPACK_GENERATOR "TGZ") + endif() ELSEIF(WIN32) - SET(CPACK_GENERATOR "ZIP") + SET(CPACK_GENERATOR "ZIP") ENDIF() SET(CPACK_INCLUDE_TOPLEVEL_DIRECTORY 0) @@ -628,9 +630,9 @@ file (GLOB TRANSLATIONS_FILES translations/*.ts) option (UPDATE_TRANSLATIONS "Update source translation translations/*.ts files (WARNING: make clean will delete the source .ts files! Danger!)") IF(UPDATE_TRANSLATIONS) - qt5_create_translation(QM_FILES ${FILES_TO_TRANSLATE} ${TRANSLATIONS_FILES}) + qt5_create_translation(QM_FILES ${FILES_TO_TRANSLATE} ${TRANSLATIONS_FILES}) ELSE() - qt5_add_translation(QM_FILES ${TRANSLATIONS_FILES}) + qt5_add_translation(QM_FILES ${TRANSLATIONS_FILES}) ENDIF() add_custom_target (translations DEPENDS ${QM_FILES}) diff --git a/gui/ConsoleWindow.cpp b/gui/ConsoleWindow.cpp index d0210df6..f08f10de 100644 --- a/gui/ConsoleWindow.cpp +++ b/gui/ConsoleWindow.cpp @@ -22,6 +22,9 @@ #include #include +#include + +#include "logic/net/PasteUpload.h" ConsoleWindow::ConsoleWindow(MinecraftProcess *mcproc, QWidget *parent) : QMainWindow(parent), ui(new Ui::ConsoleWindow), proc(mcproc) @@ -179,3 +182,19 @@ void ConsoleWindow::onLaunchFailed(BaseInstance *instance) if(!isVisible()) show(); } + +void ConsoleWindow::on_btnPaste_clicked() +{ + auto text = ui->text->toPlainText(); + ProgressDialog dialog(this); + PasteUpload* paste=new PasteUpload(this, text); + dialog.exec(paste); + if(paste->successful()) + { + paste->messageBox()->exec(); + } + else + { + CustomMessageBox::selectable(this, "Upload failed", paste->failReason(), QMessageBox::Critical)->exec(); + } +} diff --git a/gui/ConsoleWindow.h b/gui/ConsoleWindow.h index 2d948484..731c616c 100644 --- a/gui/ConsoleWindow.h +++ b/gui/ConsoleWindow.h @@ -76,6 +76,8 @@ slots: // FIXME: add handlers for the other MinecraftProcess signals (pre/post launch command // failures) + void on_btnPaste_clicked(); + protected: void closeEvent(QCloseEvent *); diff --git a/gui/ConsoleWindow.ui b/gui/ConsoleWindow.ui index ed1b627b..6cb5e93b 100644 --- a/gui/ConsoleWindow.ui +++ b/gui/ConsoleWindow.ui @@ -74,6 +74,13 @@ + + + + Upload Log + + + diff --git a/logic/net/PasteUpload.cpp b/logic/net/PasteUpload.cpp new file mode 100644 index 00000000..9945d85e --- /dev/null +++ b/logic/net/PasteUpload.cpp @@ -0,0 +1,84 @@ +#include "PasteUpload.h" +#include "MultiMC.h" +#include "logger/QsLog.h" +#include +#include +#include "gui/dialogs/CustomMessageBox.h" + +PasteUpload::PasteUpload(QWidget *window, QString text) : m_text(text), m_window(window) +{ +} + +void PasteUpload::executeTask() +{ + QNetworkRequest request(QUrl("http://paste.ee/api")); + request.setHeader(QNetworkRequest::UserAgentHeader, "MultiMC/5.0 (Uncached)"); + QByteArray content( + "key=public&description=MultiMC5+Log+File&language=plain&format=json&paste=" + + m_text.toUtf8()); + request.setRawHeader("Content-Type", "application/x-www-form-urlencoded"); + request.setRawHeader("Content-Length", QByteArray::number(content.size())); + + auto worker = MMC->qnam(); + QNetworkReply *rep = worker->post(request, content); + + m_reply = std::shared_ptr(rep); + connect(rep, &QNetworkReply::downloadProgress, [&](qint64 value, qint64 max) + { setProgress(value / max * 100); }); + connect(rep, SIGNAL(error(QNetworkReply::NetworkError)), this, + SLOT(downloadError(QNetworkReply::NetworkError))); + connect(rep, SIGNAL(finished()), this, SLOT(downloadFinished())); +} + +void PasteUpload::downloadError(QNetworkReply::NetworkError error) +{ + // error happened during download. + QLOG_ERROR() << "Network error: " << error; + emitFailed(m_reply->errorString()); +} + +void PasteUpload::downloadFinished() +{ + // if the download succeeded + if (m_reply->error() == QNetworkReply::NetworkError::NoError) + { + QByteArray data = m_reply->readAll(); + m_reply.reset(); + QJsonParseError jsonError; + QJsonDocument doc = QJsonDocument::fromJson(data, &jsonError); + if (jsonError.error != QJsonParseError::NoError) + { + emitFailed(jsonError.errorString()); + return; + } + QString error; + if (parseResult(doc, &error)) + { + emitFailed(error); + return; + } + } + // else the download failed + else + { + emitFailed(QString("Network error: %s").arg(m_reply->errorString())); + m_reply.reset(); + return; + } + emitSucceeded(); +} + +bool PasteUpload::parseResult(QJsonDocument doc, QString *parseError) +{ + auto object = doc.object(); + auto status = object.value("status").toString("error"); + if (status == "error") + { + parseError = new QString(object.value("error").toString()); + return false; + } + QString pasteUrl = object.value("paste").toObject().value("link").toString(); + m_messageBox = + CustomMessageBox::selectable(m_window, "Paste upload successful!", QString("Find your paste at %s").arg(pasteUrl)); + return true; +} diff --git a/logic/net/PasteUpload.h b/logic/net/PasteUpload.h new file mode 100644 index 00000000..27186ba6 --- /dev/null +++ b/logic/net/PasteUpload.h @@ -0,0 +1,30 @@ +#pragma once +#include "logic/tasks/Task.h" +#include +#include +#include + +class PasteUpload : public Task +{ +public: + PasteUpload(QWidget *window, QString text); + QMessageBox *messageBox() const + { + return m_messageBox; + } + +protected: + virtual void executeTask(); + +private: + bool parseResult(QJsonDocument doc, QString *parseError); + QString m_text; + QString m_error; + QWidget *m_window; + QMessageBox *m_messageBox; + std::shared_ptr m_reply; +public +slots: + void downloadError(QNetworkReply::NetworkError); + void downloadFinished(); +};