diff --git a/examples/libmbpatcher_test.cpp b/examples/libmbpatcher_test.cpp index 88a541059..55ff7e178 100644 --- a/examples/libmbpatcher_test.cpp +++ b/examples/libmbpatcher_test.cpp @@ -96,9 +96,8 @@ static bool get_device(const char *path, mb::device::Device &device) return true; } -static void mbp_progress_cb(uint64_t bytes, uint64_t maxBytes, void *userdata) +static void mbp_progress_cb(uint64_t bytes, uint64_t maxBytes) { - (void) userdata; printf("Current bytes percentage: %.1f\n", 100.0 * static_cast(bytes) / static_cast(maxBytes)); } @@ -140,7 +139,7 @@ int main(int argc, char *argv[]) { } patcher->set_file_info(&fi); - bool ret = patcher->patch_file(&mbp_progress_cb, nullptr, nullptr, nullptr); + bool ret = patcher->patch_file(&mbp_progress_cb, nullptr, nullptr); if (!ret) { fprintf(stderr, "Error: %d\n", static_cast(patcher->error())); diff --git a/gui/mainwindow.cpp b/gui/mainwindow.cpp index bf3a2fe6e..87a69d94f 100644 --- a/gui/mainwindow.cpp +++ b/gui/mainwindow.cpp @@ -688,34 +688,16 @@ PatcherTask::PatcherTask(QWidget *parent) { } -static void progressUpdatedCbWrapper(uint64_t bytes, uint64_t maxBytes, - void *userData) -{ - PatcherTask *task = static_cast(userData); - task->progressUpdatedCb(bytes, maxBytes); -} - -static void filesUpdatedCbWrapper(uint64_t files, uint64_t maxFiles, - void *userData) -{ - PatcherTask *task = static_cast(userData); - task->filesUpdatedCb(files, maxFiles); -} - -static void detailsUpdatedCbWrapper(const std::string &text, void *userData) -{ - PatcherTask *task = static_cast(userData); - task->detailsUpdatedCb(text); -} - void PatcherTask::patch(PatcherPtr patcher, FileInfoPtr info) { + using namespace std::placeholders; + patcher->set_file_info(info); - bool ret = patcher->patch_file(&progressUpdatedCbWrapper, - &filesUpdatedCbWrapper, - &detailsUpdatedCbWrapper, - this); + bool ret = patcher->patch_file( + std::bind(&PatcherTask::progressUpdatedCb, this, _1, _2), + std::bind(&PatcherTask::filesUpdatedCb, this, _1, _2), + std::bind(&PatcherTask::detailsUpdatedCb, this, _1)); QString newFile(QString::fromStdString(info->output_path())); diff --git a/libmbpatcher/include/mbpatcher/cwrapper/cpatcherinterface.h b/libmbpatcher/include/mbpatcher/cwrapper/cpatcherinterface.h index 4fc03aa70..fe05b5de4 100644 --- a/libmbpatcher/include/mbpatcher/cwrapper/cpatcherinterface.h +++ b/libmbpatcher/include/mbpatcher/cwrapper/cpatcherinterface.h @@ -1,5 +1,5 @@ /* - * Copyright (C) 2014-2015 Andrew Gunnerson + * Copyright (C) 2014-2018 Andrew Gunnerson * * This file is part of DualBootPatcher * @@ -35,10 +35,10 @@ MB_EXPORT /* enum ErrorCode */ int mbpatcher_patcher_error(const CPatcher *patch MB_EXPORT char * mbpatcher_patcher_id(const CPatcher *patcher); MB_EXPORT void mbpatcher_patcher_set_fileinfo(CPatcher *patcher, const CFileInfo *info); MB_EXPORT bool mbpatcher_patcher_patch_file(CPatcher *patcher, - ProgressUpdatedCallback progressCb, - FilesUpdatedCallback filesCb, - DetailsUpdatedCallback detailsCb, - void *userData); + ProgressUpdatedCallback progress_cb, + FilesUpdatedCallback files_cb, + DetailsUpdatedCallback details_cb, + void *userdata); MB_EXPORT void mbpatcher_patcher_cancel_patching(CPatcher *patcher); diff --git a/libmbpatcher/include/mbpatcher/patcherinterface.h b/libmbpatcher/include/mbpatcher/patcherinterface.h index abe35a5aa..de68cec18 100644 --- a/libmbpatcher/include/mbpatcher/patcherinterface.h +++ b/libmbpatcher/include/mbpatcher/patcherinterface.h @@ -1,5 +1,5 @@ /* - * Copyright (C) 2014-2015 Andrew Gunnerson + * Copyright (C) 2014-2018 Andrew Gunnerson * * This file is part of DualBootPatcher * @@ -19,6 +19,8 @@ #pragma once +#include + #include "mbcommon/common.h" #include "mbpatcher/errors.h" @@ -39,9 +41,9 @@ namespace mb::patcher class MB_EXPORT Patcher { public: - typedef void (*ProgressUpdatedCallback) (uint64_t, uint64_t, void *); - typedef void (*FilesUpdatedCallback) (uint64_t, uint64_t, void *); - typedef void (*DetailsUpdatedCallback) (const std::string &, void *); + using ProgressUpdatedCallback = std::function; + using FilesUpdatedCallback = std::function; + using DetailsUpdatedCallback = std::function; virtual ~Patcher() {} @@ -73,12 +75,10 @@ class MB_EXPORT Patcher * \param progress_cb Callback for receiving current progress values * \param files_cb Callback for receiving current files count * \param details_cb Callback for receiving detailed progress text - * \param userdata Pointer to pass to callback functions */ - virtual bool patch_file(ProgressUpdatedCallback progress_cb, - FilesUpdatedCallback files_cb, - DetailsUpdatedCallback details_cb, - void *userdata) = 0; + virtual bool patch_file(const ProgressUpdatedCallback &progress_cb, + const FilesUpdatedCallback &files_cb, + const DetailsUpdatedCallback &details_cb) = 0; /*! * \brief Cancel the patching of a file diff --git a/libmbpatcher/include/mbpatcher/patchers/odinpatcher.h b/libmbpatcher/include/mbpatcher/patchers/odinpatcher.h index 1f0515213..4eead0bd2 100644 --- a/libmbpatcher/include/mbpatcher/patchers/odinpatcher.h +++ b/libmbpatcher/include/mbpatcher/patchers/odinpatcher.h @@ -1,5 +1,5 @@ /* - * Copyright (C) 2015-2017 Andrew Gunnerson + * Copyright (C) 2015-2018 Andrew Gunnerson * * This file is part of DualBootPatcher * @@ -55,10 +55,9 @@ class OdinPatcher : public Patcher // Patching void set_file_info(const FileInfo * const info) override; - bool patch_file(ProgressUpdatedCallback progress_cb, - FilesUpdatedCallback files_cb, - DetailsUpdatedCallback details_cb, - void *userdata) override; + bool patch_file(const ProgressUpdatedCallback &progress_cb, + const FilesUpdatedCallback &files_cb, + const DetailsUpdatedCallback &details_cb) override; void cancel_patching() override; @@ -85,9 +84,8 @@ class OdinPatcher : public Patcher std::unordered_set m_added_files; // Callbacks - OdinPatcher::ProgressUpdatedCallback m_progress_cb; - OdinPatcher::DetailsUpdatedCallback m_details_cb; - void *m_userdata; + const ProgressUpdatedCallback *m_progress_cb; + const DetailsUpdatedCallback *m_details_cb; // Patching archive *m_a_input; diff --git a/libmbpatcher/include/mbpatcher/patchers/ramdiskupdater.h b/libmbpatcher/include/mbpatcher/patchers/ramdiskupdater.h index bfb930c5b..856d10e3e 100644 --- a/libmbpatcher/include/mbpatcher/patchers/ramdiskupdater.h +++ b/libmbpatcher/include/mbpatcher/patchers/ramdiskupdater.h @@ -1,5 +1,5 @@ /* - * Copyright (C) 2014-2017 Andrew Gunnerson + * Copyright (C) 2014-2018 Andrew Gunnerson * * This file is part of DualBootPatcher * @@ -47,10 +47,9 @@ class RamdiskUpdater : public Patcher // Patching void set_file_info(const FileInfo * const info) override; - bool patch_file(ProgressUpdatedCallback progress_cb, - FilesUpdatedCallback files_cb, - DetailsUpdatedCallback details_cb, - void *userdata) override; + bool patch_file(const ProgressUpdatedCallback &progress_cb, + const FilesUpdatedCallback &files_cb, + const DetailsUpdatedCallback &details_cb) override; void cancel_patching() override; diff --git a/libmbpatcher/include/mbpatcher/patchers/zippatcher.h b/libmbpatcher/include/mbpatcher/patchers/zippatcher.h index 1d2a4a2cc..f91812bf8 100644 --- a/libmbpatcher/include/mbpatcher/patchers/zippatcher.h +++ b/libmbpatcher/include/mbpatcher/patchers/zippatcher.h @@ -1,5 +1,5 @@ /* - * Copyright (C) 2014-2017 Andrew Gunnerson + * Copyright (C) 2014-2018 Andrew Gunnerson * * This file is part of DualBootPatcher * @@ -50,10 +50,9 @@ class ZipPatcher : public Patcher // Patching void set_file_info(const FileInfo * const info) override; - bool patch_file(ProgressUpdatedCallback progress_cb, - FilesUpdatedCallback files_cb, - DetailsUpdatedCallback details_cb, - void *userdata) override; + bool patch_file(const ProgressUpdatedCallback &progress_cb, + const FilesUpdatedCallback &files_cb, + const DetailsUpdatedCallback &details_cb) override; void cancel_patching() override; @@ -73,10 +72,9 @@ class ZipPatcher : public Patcher ErrorCode m_error; // Callbacks - ProgressUpdatedCallback m_progress_cb; - FilesUpdatedCallback m_files_cb; - DetailsUpdatedCallback m_details_cb; - void *m_userdata; + const ProgressUpdatedCallback *m_progress_cb; + const FilesUpdatedCallback *m_files_cb; + const DetailsUpdatedCallback *m_details_cb; // Patching ZipCtx *m_z_input = nullptr; @@ -98,7 +96,7 @@ class ZipPatcher : public Patcher void update_files(uint64_t files, uint64_t max_files); void update_details(const std::string &msg); - static void la_progress_cb(uint64_t bytes, void *userdata); + void la_progress_cb(uint64_t bytes); }; } diff --git a/libmbpatcher/include/mbpatcher/private/miniziputils.h b/libmbpatcher/include/mbpatcher/private/miniziputils.h index 5b2e295a9..e025dc525 100644 --- a/libmbpatcher/include/mbpatcher/private/miniziputils.h +++ b/libmbpatcher/include/mbpatcher/private/miniziputils.h @@ -1,5 +1,5 @@ /* - * Copyright (C) 2014-2017 Andrew Gunnerson + * Copyright (C) 2014-2018 Andrew Gunnerson * * This file is part of DualBootPatcher * @@ -19,6 +19,7 @@ #pragma once +#include #include #include @@ -61,13 +62,11 @@ class MinizipUtils static bool copy_file_raw(void *source_handle, void *target_handle, const std::string &name, - void (*cb)(uint64_t bytes, void *), - void *userdata); + const std::function &cb); static bool read_to_memory(void *handle, std::vector &output, - void (*cb)(uint64_t bytes, void *), - void *userdata); + const std::function &cb); static bool extract_file(void *handle, const std::string &directory); diff --git a/libmbpatcher/src/cwrapper/cpatcherinterface.cpp b/libmbpatcher/src/cwrapper/cpatcherinterface.cpp index 70e7b704f..c19e41187 100644 --- a/libmbpatcher/src/cwrapper/cpatcherinterface.cpp +++ b/libmbpatcher/src/cwrapper/cpatcherinterface.cpp @@ -1,5 +1,5 @@ /* - * Copyright (C) 2014-2015 Andrew Gunnerson + * Copyright (C) 2014-2018 Andrew Gunnerson * * This file is part of DualBootPatcher * @@ -54,39 +54,6 @@ extern "C" { -struct CallbackWrapper -{ - ProgressUpdatedCallback progress_cb; - FilesUpdatedCallback files_cb; - DetailsUpdatedCallback details_cb; - void *userdata; -}; - -static void progress_cb_wrapper(uint64_t bytes, uint64_t max_bytes, - void *userdata) -{ - CallbackWrapper *wrapper = reinterpret_cast(userdata); - if (wrapper->progress_cb != nullptr) { - wrapper->progress_cb(bytes, max_bytes, wrapper->userdata); - } -} - -static void files_cb_wrapper(uint64_t files, uint64_t max_files, void *userdata) -{ - CallbackWrapper *wrapper = reinterpret_cast(userdata); - if (wrapper->files_cb) { - wrapper->files_cb(files, max_files, userdata); - } -} - -static void details_cb_wrapper(const std::string &text, void *userdata) -{ - CallbackWrapper *wrapper = reinterpret_cast(userdata); - if (wrapper->details_cb) { - wrapper->details_cb(text.c_str(), wrapper->userdata); - } -} - /*! * \brief Get the error information * @@ -143,30 +110,39 @@ void mbpatcher_patcher_set_fileinfo(CPatcher *patcher, const CFileInfo *info) * \brief Start patching the file * * \param patcher CPatcher object - * \param progressCb Callback for receiving current progress value - * \param detailsCb Callback for receiving detailed progress text - * \param userData Pointer to pass to callback functions + * \param progress_cb Callback for receiving current progress value + * \param files_cb Callback for receiving current files count + * \param details_cb Callback for receiving detailed progress text + * \param userdata Pointer to pass to callback functions * \return true on success, otherwise false (and error set appropriately) * * \sa Patcher::patchFile() */ bool mbpatcher_patcher_patch_file(CPatcher *patcher, - ProgressUpdatedCallback progressCb, - FilesUpdatedCallback filesCb, - DetailsUpdatedCallback detailsCb, - void *userData) + ProgressUpdatedCallback progress_cb, + FilesUpdatedCallback files_cb, + DetailsUpdatedCallback details_cb, + void *userdata) { CASTP(patcher); - CallbackWrapper wrapper; - wrapper.progress_cb = progressCb; - wrapper.files_cb = filesCb; - wrapper.details_cb = detailsCb; - wrapper.userdata = userData; - - return p->patch_file(&progress_cb_wrapper, &files_cb_wrapper, - &details_cb_wrapper, - reinterpret_cast(&wrapper)); + return p->patch_file( + [&](uint64_t bytes, uint64_t max_bytes) { + if (progress_cb) { + progress_cb(bytes, max_bytes, userdata); + } + }, + [&](uint64_t files, uint64_t max_files) { + if (files_cb) { + files_cb(files, max_files, userdata); + } + }, + [&](const std::string &text) { + if (details_cb) { + details_cb(text.c_str(), userdata); + } + } + ); } /*! diff --git a/libmbpatcher/src/patchers/odinpatcher.cpp b/libmbpatcher/src/patchers/odinpatcher.cpp index 6774af50e..667e0f44a 100644 --- a/libmbpatcher/src/patchers/odinpatcher.cpp +++ b/libmbpatcher/src/patchers/odinpatcher.cpp @@ -1,5 +1,5 @@ /* - * Copyright (C) 2015-2017 Andrew Gunnerson + * Copyright (C) 2015-2018 Andrew Gunnerson * * This file is part of DualBootPatcher * @@ -73,7 +73,6 @@ OdinPatcher::OdinPatcher(PatcherConfig &pc) , m_added_files() , m_progress_cb() , m_details_cb() - , m_userdata() , m_a_input(nullptr) , m_z_output(nullptr) { @@ -101,10 +100,9 @@ void OdinPatcher::cancel_patching() m_cancelled = true; } -bool OdinPatcher::patch_file(ProgressUpdatedCallback progress_cb, - FilesUpdatedCallback files_cb, - DetailsUpdatedCallback details_cb, - void *userdata) +bool OdinPatcher::patch_file(const ProgressUpdatedCallback &progress_cb, + const FilesUpdatedCallback &files_cb, + const DetailsUpdatedCallback &details_cb) { (void) files_cb; @@ -112,9 +110,8 @@ bool OdinPatcher::patch_file(ProgressUpdatedCallback progress_cb, assert(m_info != nullptr); - m_progress_cb = progress_cb; - m_details_cb = details_cb; - m_userdata = userdata; + m_progress_cb = &progress_cb; + m_details_cb = &details_cb; m_old_bytes = 0; m_bytes = 0; @@ -124,7 +121,6 @@ bool OdinPatcher::patch_file(ProgressUpdatedCallback progress_cb, m_progress_cb = nullptr; m_details_cb = nullptr; - m_userdata = nullptr; if (m_a_input != nullptr) { close_input_archive(); @@ -607,7 +603,7 @@ bool OdinPatcher::close_output_archive() void OdinPatcher::update_progress(uint64_t bytes, uint64_t max_bytes) { - if (m_progress_cb) { + if (m_progress_cb && *m_progress_cb) { bool should_call = true; if (max_bytes > 0) { // Rate limit... call back only if percentage exceeds 0.01% @@ -620,7 +616,7 @@ void OdinPatcher::update_progress(uint64_t bytes, uint64_t max_bytes) } } if (should_call) { - m_progress_cb(bytes, max_bytes, m_userdata); + (*m_progress_cb)(bytes, max_bytes); m_old_bytes = bytes; } } @@ -628,8 +624,8 @@ void OdinPatcher::update_progress(uint64_t bytes, uint64_t max_bytes) void OdinPatcher::update_details(const std::string &msg) { - if (m_details_cb) { - m_details_cb(msg, m_userdata); + if (m_details_cb && *m_details_cb) { + (*m_details_cb)(msg); } } diff --git a/libmbpatcher/src/patchers/ramdiskupdater.cpp b/libmbpatcher/src/patchers/ramdiskupdater.cpp index 3bb6596e6..b44a63661 100644 --- a/libmbpatcher/src/patchers/ramdiskupdater.cpp +++ b/libmbpatcher/src/patchers/ramdiskupdater.cpp @@ -1,5 +1,5 @@ /* - * Copyright (C) 2014-2017 Andrew Gunnerson + * Copyright (C) 2014-2018 Andrew Gunnerson * * This file is part of DualBootPatcher * @@ -71,15 +71,13 @@ void RamdiskUpdater::cancel_patching() m_cancelled = true; } -bool RamdiskUpdater::patch_file(ProgressUpdatedCallback progress_cb, - FilesUpdatedCallback files_cb, - DetailsUpdatedCallback details_cb, - void *userdata) +bool RamdiskUpdater::patch_file(const ProgressUpdatedCallback &progress_cb, + const FilesUpdatedCallback &files_cb, + const DetailsUpdatedCallback &details_cb) { (void) progress_cb; (void) files_cb; (void) details_cb; - (void) userdata; m_cancelled = false; diff --git a/libmbpatcher/src/patchers/zippatcher.cpp b/libmbpatcher/src/patchers/zippatcher.cpp index 1b2167555..0b56384a6 100644 --- a/libmbpatcher/src/patchers/zippatcher.cpp +++ b/libmbpatcher/src/patchers/zippatcher.cpp @@ -1,5 +1,5 @@ /* - * Copyright (C) 2014-2017 Andrew Gunnerson + * Copyright (C) 2014-2018 Andrew Gunnerson * * This file is part of DualBootPatcher * @@ -62,7 +62,6 @@ ZipPatcher::ZipPatcher(PatcherConfig &pc) , m_progress_cb(nullptr) , m_files_cb(nullptr) , m_details_cb(nullptr) - , m_userdata(nullptr) , m_z_input(nullptr) , m_z_output(nullptr) { @@ -90,19 +89,17 @@ void ZipPatcher::cancel_patching() m_cancelled = true; } -bool ZipPatcher::patch_file(ProgressUpdatedCallback progress_cb, - FilesUpdatedCallback files_cb, - DetailsUpdatedCallback details_cb, - void *userdata) +bool ZipPatcher::patch_file(const ProgressUpdatedCallback &progress_cb, + const FilesUpdatedCallback &files_cb, + const DetailsUpdatedCallback &details_cb) { m_cancelled = false; assert(m_info != nullptr); - m_progress_cb = progress_cb; - m_files_cb = files_cb; - m_details_cb = details_cb; - m_userdata = userdata; + m_progress_cb = &progress_cb; + m_files_cb = &files_cb; + m_details_cb = &details_cb; m_bytes = 0; m_max_bytes = 0; @@ -114,7 +111,6 @@ bool ZipPatcher::patch_file(ProgressUpdatedCallback progress_cb, m_progress_cb = nullptr; m_files_cb = nullptr; m_details_cb = nullptr; - m_userdata = nullptr; for (auto *p : m_auto_patchers) { m_pc.destroy_auto_patcher(p); @@ -313,6 +309,8 @@ bool ZipPatcher::patch_zip() bool ZipPatcher::pass1(const std::string &temporary_dir, const std::unordered_set &exclude) { + using namespace std::placeholders; + void *h_in = MinizipUtils::ctx_get_zip_handle(m_z_input); void *h_out = MinizipUtils::ctx_get_zip_handle(m_z_output); @@ -353,8 +351,8 @@ bool ZipPatcher::pass1(const std::string &temporary_dir, cur_file = "META-INF/com/google/android/update-binary.orig"; } - if (!MinizipUtils::copy_file_raw( - h_in, h_out, cur_file, &la_progress_cb, this)) { + if (!MinizipUtils::copy_file_raw(h_in, h_out, cur_file, + std::bind(&ZipPatcher::la_progress_cb, this, _1))) { LOGW("minizip: Failed to copy raw data: %s", cur_file.c_str()); m_error = ErrorCode::ArchiveWriteDataError; return false; @@ -487,29 +485,28 @@ void ZipPatcher::close_output_archive() void ZipPatcher::update_progress(uint64_t bytes, uint64_t max_bytes) { - if (m_progress_cb) { - m_progress_cb(bytes, max_bytes, m_userdata); + if (m_progress_cb && *m_progress_cb) { + (*m_progress_cb)(bytes, max_bytes); } } void ZipPatcher::update_files(uint64_t files, uint64_t max_files) { - if (m_files_cb) { - m_files_cb(files, max_files, m_userdata); + if (m_files_cb && *m_files_cb) { + (*m_files_cb)(files, max_files); } } void ZipPatcher::update_details(const std::string &msg) { - if (m_details_cb) { - m_details_cb(msg, m_userdata); + if (m_details_cb && *m_details_cb) { + (*m_details_cb)(msg); } } -void ZipPatcher::la_progress_cb(uint64_t bytes, void *userdata) +void ZipPatcher::la_progress_cb(uint64_t bytes) { - auto *p = static_cast(userdata); - p->update_progress(p->m_bytes + bytes, p->m_max_bytes); + update_progress(m_bytes + bytes, m_max_bytes); } std::string ZipPatcher::create_info_prop(const std::string &rom_id) diff --git a/libmbpatcher/src/private/miniziputils.cpp b/libmbpatcher/src/private/miniziputils.cpp index f4c9e12b4..e610a14eb 100644 --- a/libmbpatcher/src/private/miniziputils.cpp +++ b/libmbpatcher/src/private/miniziputils.cpp @@ -1,5 +1,5 @@ /* - * Copyright (C) 2014-2017 Andrew Gunnerson + * Copyright (C) 2014-2018 Andrew Gunnerson * * This file is part of DualBootPatcher * @@ -212,8 +212,7 @@ ErrorCode MinizipUtils::archive_stats(const std::string &path, bool MinizipUtils::copy_file_raw(void *source_handle, void *target_handle, const std::string &name, - void (*cb)(uint64_t bytes, void *), - void *userdata) + const std::function &cb) { mz_zip_file *file_info; @@ -264,8 +263,7 @@ bool MinizipUtils::copy_file_raw(void *source_handle, ratio = static_cast(bytes) / static_cast(file_info->compressed_size); cb(static_cast( - ratio * static_cast(file_info->uncompressed_size)), - userdata); + ratio * static_cast(file_info->uncompressed_size))); } int n_written = mz_zip_entry_write( @@ -302,8 +300,7 @@ bool MinizipUtils::copy_file_raw(void *source_handle, bool MinizipUtils::read_to_memory(void *handle, std::vector &output, - void (*cb)(uint64_t bytes, void *), - void *userdata) + const std::function &cb) { mz_zip_file *file_info; @@ -331,8 +328,7 @@ bool MinizipUtils::read_to_memory(void *handle, while ((n = mz_zip_entry_read(handle, buf, sizeof(buf))) > 0) { if (cb) { - cb(static_cast(data.size()) + static_cast(n), - userdata); + cb(static_cast(data.size()) + static_cast(n)); } data.insert(data.end(), buf, buf + n);