├── release_version.txt ├── icons └── main.ico ├── ssl ├── libeay32.dll └── ssleay32.dll ├── docs ├── screenshot_gui.jpg └── screenshot_console.jpg ├── images └── thanks │ ├── AliHadi.png │ ├── Bartosz.png │ ├── Xylit0l.png │ ├── clayne.png │ ├── phithon.png │ ├── AdricNet.png │ ├── DavClark.png │ ├── JoaoVitor.png │ ├── fr0zenbag.png │ ├── misonothx.png │ ├── AdamHenault.png │ ├── DavidZimmer.png │ ├── FilipNavara.png │ ├── FrenchYeti.png │ ├── GiladReich.png │ ├── IntegralTech.png │ ├── JasonJackTan.png │ ├── LeandroFroes.png │ ├── AndersonLeite.png │ ├── DuncanOgilvie.png │ ├── FernandoMerces.png │ ├── clayne.json │ ├── JoaoVitor.json │ ├── fr0zenbag.json │ ├── misonothx.json │ ├── AdricNet.json │ ├── GiladReich.json │ ├── JasonJackTan.json │ ├── FrenchYeti.json │ ├── Xylit0l.json │ ├── FilipNavara.json │ ├── phithon.json │ ├── AdamHenault.json │ ├── Bartosz.json │ ├── DavidZimmer.json │ ├── LeandroFroes.json │ ├── AliHadi.json │ ├── DavClark.json │ ├── DuncanOgilvie.json │ ├── IntegralTech.json │ ├── AndersonLeite.json │ └── FernandoMerces.json ├── gui_source ├── images │ └── main.png ├── resources.qrc ├── plugininfowidget.ui ├── dialoginfomodule.cpp ├── plugininfowidget.h ├── dialogabout.h ├── dialoginfomodule.h ├── dialoginfomodule.ui ├── main_gui.cpp ├── dialogoptions.h ├── dialogabout.ui ├── dialogremovemodule.h ├── dialoggetfilefromserverprocess.h ├── dialogconvertprocess.h ├── dialogupdategitprocess.h ├── dialogremovemodule.ui ├── dialogcreatemoduleprocess.h ├── dialogconvertprocess.ui ├── dialogupdategitprocess.ui ├── dialoginstallmodule.h ├── dialogremovemoduleprocess.h ├── dialogremovemodule.cpp ├── dialoginstallmoduleprocess.h ├── dialogcreatemoduleprocess.ui ├── plugininfowidget.cpp ├── dialogcreatemodule.h ├── dialoggetfilefromserverprocess.ui ├── gui_source.pro ├── dialogoptions.cpp ├── dialoginstallmoduleprocess.ui ├── dialogremovemoduleprocess.ui ├── dialogupdategitprocess.cpp ├── dialogconvertprocess.cpp ├── dialogcreatemoduleprocess.cpp ├── dialoggetfilefromserverprocess.cpp ├── dialoginstallmodule.ui ├── dialogremovemoduleprocess.cpp ├── dialoginstallmoduleprocess.cpp ├── guimainwindow.h ├── dialogoptions.ui ├── dialogabout.cpp ├── dialoginstallmodule.cpp ├── dialogcreatemodule.cpp └── guimainwindow.ui ├── x64dbgPluginManager_source.pro ├── changelog.txt ├── .gitmodules ├── binaryocthex.py ├── LICENSE ├── console_source ├── console_source.pro ├── consoleoutput.h └── consoleoutput.cpp ├── global.h ├── README.md ├── convertprocess.h ├── removemoduleprocess.h ├── createmoduleprocess.h ├── installmoduleprocess.h ├── updategitprocess.h ├── getfilefromserverprocess.h ├── convertprocess.cpp ├── removemoduleprocess.cpp ├── installmoduleprocess.cpp ├── getfilefromserverprocess.cpp ├── updategitprocess.cpp ├── utils.h ├── createmoduleprocess.cpp └── THANKS.md /release_version.txt: -------------------------------------------------------------------------------- 1 | 0.06 2 | -------------------------------------------------------------------------------- /icons/main.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/FarhaKousar1601/x64dbg-Plugin-Manager/HEAD/icons/main.ico -------------------------------------------------------------------------------- /ssl/libeay32.dll: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/FarhaKousar1601/x64dbg-Plugin-Manager/HEAD/ssl/libeay32.dll -------------------------------------------------------------------------------- /ssl/ssleay32.dll: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/FarhaKousar1601/x64dbg-Plugin-Manager/HEAD/ssl/ssleay32.dll -------------------------------------------------------------------------------- /docs/screenshot_gui.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/FarhaKousar1601/x64dbg-Plugin-Manager/HEAD/docs/screenshot_gui.jpg -------------------------------------------------------------------------------- /images/thanks/AliHadi.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/FarhaKousar1601/x64dbg-Plugin-Manager/HEAD/images/thanks/AliHadi.png -------------------------------------------------------------------------------- /images/thanks/Bartosz.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/FarhaKousar1601/x64dbg-Plugin-Manager/HEAD/images/thanks/Bartosz.png -------------------------------------------------------------------------------- /images/thanks/Xylit0l.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/FarhaKousar1601/x64dbg-Plugin-Manager/HEAD/images/thanks/Xylit0l.png -------------------------------------------------------------------------------- /images/thanks/clayne.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/FarhaKousar1601/x64dbg-Plugin-Manager/HEAD/images/thanks/clayne.png -------------------------------------------------------------------------------- /images/thanks/phithon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/FarhaKousar1601/x64dbg-Plugin-Manager/HEAD/images/thanks/phithon.png -------------------------------------------------------------------------------- /docs/screenshot_console.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/FarhaKousar1601/x64dbg-Plugin-Manager/HEAD/docs/screenshot_console.jpg -------------------------------------------------------------------------------- /gui_source/images/main.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/FarhaKousar1601/x64dbg-Plugin-Manager/HEAD/gui_source/images/main.png -------------------------------------------------------------------------------- /images/thanks/AdricNet.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/FarhaKousar1601/x64dbg-Plugin-Manager/HEAD/images/thanks/AdricNet.png -------------------------------------------------------------------------------- /images/thanks/DavClark.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/FarhaKousar1601/x64dbg-Plugin-Manager/HEAD/images/thanks/DavClark.png -------------------------------------------------------------------------------- /images/thanks/JoaoVitor.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/FarhaKousar1601/x64dbg-Plugin-Manager/HEAD/images/thanks/JoaoVitor.png -------------------------------------------------------------------------------- /images/thanks/fr0zenbag.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/FarhaKousar1601/x64dbg-Plugin-Manager/HEAD/images/thanks/fr0zenbag.png -------------------------------------------------------------------------------- /images/thanks/misonothx.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/FarhaKousar1601/x64dbg-Plugin-Manager/HEAD/images/thanks/misonothx.png -------------------------------------------------------------------------------- /images/thanks/AdamHenault.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/FarhaKousar1601/x64dbg-Plugin-Manager/HEAD/images/thanks/AdamHenault.png -------------------------------------------------------------------------------- /images/thanks/DavidZimmer.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/FarhaKousar1601/x64dbg-Plugin-Manager/HEAD/images/thanks/DavidZimmer.png -------------------------------------------------------------------------------- /images/thanks/FilipNavara.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/FarhaKousar1601/x64dbg-Plugin-Manager/HEAD/images/thanks/FilipNavara.png -------------------------------------------------------------------------------- /images/thanks/FrenchYeti.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/FarhaKousar1601/x64dbg-Plugin-Manager/HEAD/images/thanks/FrenchYeti.png -------------------------------------------------------------------------------- /images/thanks/GiladReich.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/FarhaKousar1601/x64dbg-Plugin-Manager/HEAD/images/thanks/GiladReich.png -------------------------------------------------------------------------------- /images/thanks/IntegralTech.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/FarhaKousar1601/x64dbg-Plugin-Manager/HEAD/images/thanks/IntegralTech.png -------------------------------------------------------------------------------- /images/thanks/JasonJackTan.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/FarhaKousar1601/x64dbg-Plugin-Manager/HEAD/images/thanks/JasonJackTan.png -------------------------------------------------------------------------------- /images/thanks/LeandroFroes.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/FarhaKousar1601/x64dbg-Plugin-Manager/HEAD/images/thanks/LeandroFroes.png -------------------------------------------------------------------------------- /x64dbgPluginManager_source.pro: -------------------------------------------------------------------------------- 1 | TEMPLATE = subdirs 2 | SUBDIRS += gui_source 3 | SUBDIRS += console_source 4 | -------------------------------------------------------------------------------- /images/thanks/AndersonLeite.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/FarhaKousar1601/x64dbg-Plugin-Manager/HEAD/images/thanks/AndersonLeite.png -------------------------------------------------------------------------------- /images/thanks/DuncanOgilvie.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/FarhaKousar1601/x64dbg-Plugin-Manager/HEAD/images/thanks/DuncanOgilvie.png -------------------------------------------------------------------------------- /images/thanks/FernandoMerces.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/FarhaKousar1601/x64dbg-Plugin-Manager/HEAD/images/thanks/FernandoMerces.png -------------------------------------------------------------------------------- /gui_source/resources.qrc: -------------------------------------------------------------------------------- 1 | 2 | 3 | images/main.png 4 | 5 | 6 | -------------------------------------------------------------------------------- /images/thanks/clayne.json: -------------------------------------------------------------------------------- 1 | { 2 | "data": { 3 | "name": "Christopher Layne", 4 | "website": "", 5 | "github": "clayne", 6 | "twitter": "", 7 | "avatar": "clayne.png" 8 | } 9 | } -------------------------------------------------------------------------------- /images/thanks/JoaoVitor.json: -------------------------------------------------------------------------------- 1 | { 2 | "data": { 3 | "name": "João Vitor", 4 | "website": "http://joaovitor.gq", 5 | "github": "keowu", 6 | "twitter": "", 7 | "avatar": "JoaoVitor.png" 8 | } 9 | } -------------------------------------------------------------------------------- /images/thanks/fr0zenbag.json: -------------------------------------------------------------------------------- 1 | { 2 | "data": { 3 | "name": "fr0zenbag", 4 | "website": "", 5 | "github": "fr0zenbag", 6 | "twitter": "", 7 | "avatar": "fr0zenbag.png" 8 | } 9 | } 10 | -------------------------------------------------------------------------------- /images/thanks/misonothx.json: -------------------------------------------------------------------------------- 1 | { 2 | "data": { 3 | "name": "misonothx", 4 | "website": "", 5 | "github": "miso-xyz", 6 | "twitter": "", 7 | "avatar": "misonothx.png" 8 | } 9 | } 10 | -------------------------------------------------------------------------------- /images/thanks/AdricNet.json: -------------------------------------------------------------------------------- 1 | { 2 | "data": { 3 | "name": "Adric Net", 4 | "website": "http://dfirnotes.net", 5 | "github": "adricnet", 6 | "twitter": "dfirnotes", 7 | "avatar": "AdricNet.png" 8 | } 9 | } -------------------------------------------------------------------------------- /images/thanks/GiladReich.json: -------------------------------------------------------------------------------- 1 | { 2 | "data": { 3 | "name": "Gilad Reich", 4 | "website": "https://greich.com", 5 | "github": "giladreich", 6 | "twitter": "", 7 | "avatar": "GiladReich.png" 8 | } 9 | } -------------------------------------------------------------------------------- /images/thanks/JasonJackTan.json: -------------------------------------------------------------------------------- 1 | { 2 | "data": { 3 | "name": "Jason Jack Tan", 4 | "website": "", 5 | "github": "Perthys", 6 | "twitter": "", 7 | "avatar": "JasonJackTan.png" 8 | } 9 | } 10 | -------------------------------------------------------------------------------- /images/thanks/FrenchYeti.json: -------------------------------------------------------------------------------- 1 | { 2 | "data": { 3 | "name": "FrenchYeti", 4 | "website": "", 5 | "github": "FrenchYeti", 6 | "twitter": "frenchyeti", 7 | "avatar": "FrenchYeti.png" 8 | } 9 | } 10 | -------------------------------------------------------------------------------- /images/thanks/Xylit0l.json: -------------------------------------------------------------------------------- 1 | { 2 | "data": { 3 | "name": "Xylit0l", 4 | "website": "http://xylibox.com", 5 | "github": "Xyl2k", 6 | "twitter": "Xylit0l", 7 | "avatar": "Xylit0l.png" 8 | } 9 | } 10 | -------------------------------------------------------------------------------- /images/thanks/FilipNavara.json: -------------------------------------------------------------------------------- 1 | { 2 | "data": { 3 | "name": "Filip Navara", 4 | "website": "", 5 | "github": "filipnavara", 6 | "twitter": "filipnavara", 7 | "avatar": "FilipNavara.png" 8 | } 9 | } 10 | -------------------------------------------------------------------------------- /images/thanks/phithon.json: -------------------------------------------------------------------------------- 1 | { 2 | "data": { 3 | "name": "phithon", 4 | "website": "https://www.leavesongs.com", 5 | "github": "phith0n", 6 | "twitter": "", 7 | "avatar": "phithon.png" 8 | } 9 | } 10 | -------------------------------------------------------------------------------- /images/thanks/AdamHenault.json: -------------------------------------------------------------------------------- 1 | { 2 | "data": { 3 | "name": "Adam Henault", 4 | "website": "http://adamhlt.com/", 5 | "github": "adamhlt", 6 | "twitter": "", 7 | "avatar": "AdamHenault.png" 8 | } 9 | } 10 | -------------------------------------------------------------------------------- /images/thanks/Bartosz.json: -------------------------------------------------------------------------------- 1 | { 2 | "data": { 3 | "name": "Bartosz Wójcik", 4 | "website": "https://www.pelock.com", 5 | "github": "PELock", 6 | "twitter": "PELock", 7 | "avatar": "Bartosz.png" 8 | } 9 | } 10 | -------------------------------------------------------------------------------- /images/thanks/DavidZimmer.json: -------------------------------------------------------------------------------- 1 | { 2 | "data": { 3 | "name": "David Zimmer", 4 | "website": "http://sandsprite.com", 5 | "github": "dzzie", 6 | "twitter": "", 7 | "avatar": "DavidZimmer.png" 8 | } 9 | } 10 | -------------------------------------------------------------------------------- /images/thanks/LeandroFroes.json: -------------------------------------------------------------------------------- 1 | { 2 | "data": { 3 | "name": "Leandro Fróes", 4 | "website": "", 5 | "github": "leandrofroes", 6 | "twitter": "leandrofr0es", 7 | "avatar": "LeandroFroes.png" 8 | } 9 | } 10 | -------------------------------------------------------------------------------- /images/thanks/AliHadi.json: -------------------------------------------------------------------------------- 1 | { 2 | "data": { 3 | "name": "Ali Hadi", 4 | "website": "https://www.ashemery.com", 5 | "github": "ashemery", 6 | "twitter": "binaryz0ne", 7 | "avatar": "AliHadi.png" 8 | } 9 | } 10 | -------------------------------------------------------------------------------- /images/thanks/DavClark.json: -------------------------------------------------------------------------------- 1 | { 2 | "data": { 3 | "name": "Dav Clark", 4 | "website": "https://www.linkedin.com/in/davclark", 5 | "github": "davclark", 6 | "twitter": "davclark", 7 | "avatar": "DavClark.png" 8 | } 9 | } 10 | -------------------------------------------------------------------------------- /images/thanks/DuncanOgilvie.json: -------------------------------------------------------------------------------- 1 | { 2 | "data": { 3 | "name": "Duncan Ogilvie", 4 | "website": "http://mrexodia.re", 5 | "github": "mrexodia", 6 | "twitter": "mrexodia", 7 | "avatar": "DuncanOgilvie.png" 8 | } 9 | } 10 | -------------------------------------------------------------------------------- /images/thanks/IntegralTech.json: -------------------------------------------------------------------------------- 1 | { 2 | "data": { 3 | "name": "Integral-Tech", 4 | "website": "https://integral.org.cn/", 5 | "github": "Integral-Tech", 6 | "twitter": "", 7 | "avatar": "IntegralTech.png" 8 | } 9 | } 10 | -------------------------------------------------------------------------------- /images/thanks/AndersonLeite.json: -------------------------------------------------------------------------------- 1 | { 2 | "data": { 3 | "name": "Anderson Leite", 4 | "website": "https://reversing.codes", 5 | "github": "buzzer-re", 6 | "twitter": "buzz3r_", 7 | "avatar": "AndersonLeite.png" 8 | } 9 | } 10 | -------------------------------------------------------------------------------- /images/thanks/FernandoMerces.json: -------------------------------------------------------------------------------- 1 | { 2 | "data": { 3 | "name": "Fernando Mercês", 4 | "website": "https://www.mentebinaria.com.br", 5 | "github": "merces", 6 | "twitter": "mer0x36", 7 | "avatar": "FernandoMerces.png" 8 | } 9 | } 10 | -------------------------------------------------------------------------------- /changelog.txt: -------------------------------------------------------------------------------- 1 | 0.06 2 | ----------------------------------------------------------------------- 3 | [+] Minor bugs fixed 4 | ####################################################################### 5 | 6 | 0.05 7 | ----------------------------------------------------------------------- 8 | [+] Minor bugs fixed 9 | ####################################################################### 10 | 11 | 0.04 12 | ----------------------------------------------------------------------- 13 | [+] Fixed AV false detects 14 | [+] GitHub API. 15 | [+] Minor bugs fixed 16 | ####################################################################### -------------------------------------------------------------------------------- /.gitmodules: -------------------------------------------------------------------------------- 1 | [submodule "XArchive"] 2 | path = XArchive 3 | url = https://github.com/horsicq/XArchive.git 4 | [submodule "Formats"] 5 | path = Formats 6 | url = https://github.com/horsicq/Formats.git 7 | [submodule "XGithub"] 8 | path = XGithub 9 | url = https://github.com/horsicq/XGithub.git 10 | [submodule "XOptions"] 11 | path = XOptions 12 | url = https://github.com/horsicq/XOptions.git 13 | [submodule "XShortcuts"] 14 | path = XShortcuts 15 | url = https://github.com/horsicq/XShortcuts.git 16 | [submodule "build_tools"] 17 | path = build_tools 18 | url = https://github.com/horsicq/build_tools 19 | [submodule "XUpdate"] 20 | path = XUpdate 21 | url = https://github.com/horsicq/XUpdate 22 | [submodule "XAboutWidget"] 23 | path = XAboutWidget 24 | url = https://github.com/horsicq/XAboutWidget 25 | -------------------------------------------------------------------------------- /binaryocthex.py: -------------------------------------------------------------------------------- 1 | def bin2Dec(val): 2 | rev=val[::-1] 3 | dec = 0 4 | i = 0 5 | for dig in rev: 6 | dec += int(dig) * 2**i 7 | i += 1 8 | 9 | return dec 10 | 11 | 12 | 13 | def oct2Hex(val): 14 | rev = val[::-1] 15 | dec = 0 16 | i = 0 17 | for dig in rev: 18 | dec += int(dig) * 8 ** i 19 | i += 1 20 | 21 | hex_val = "" # Initialize an empty string to store the hexadecimal result 22 | 23 | while dec != 0: 24 | remainder = dec % 16 # Calculate the remainder when dividing by 16 25 | if remainder <= 9: 26 | hex_digit = str(remainder) # Convert remainder to a string for hex representation 27 | else: 28 | hex_digit = chr(ord('A') + remainder - 10) # Convert to hex letter (A-F) 29 | hex_val = hex_digit + hex_val # Add the hex digit to the result 30 | dec = dec // 16 # Integer division to continue the process 31 | 32 | return hex_val 33 | num1 = input("Enter a binary number : ") 34 | print(bin2Dec(num1)) 35 | num2 = input("Enter a octal number : ") 36 | print(oct2Hex(num2)) 37 | -------------------------------------------------------------------------------- /gui_source/plugininfowidget.ui: -------------------------------------------------------------------------------- 1 | 2 | 3 | PluginInfoWidget 4 | 5 | 6 | 7 | 0 8 | 0 9 | 390 10 | 166 11 | 12 | 13 | 14 | Form 15 | 16 | 17 | 18 | 0 19 | 20 | 21 | 0 22 | 23 | 24 | 0 25 | 26 | 27 | 0 28 | 29 | 30 | 31 | 32 | true 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2019-2023 hors 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /console_source/console_source.pro: -------------------------------------------------------------------------------- 1 | QT -= gui 2 | QT += network 3 | 4 | CONFIG += c++11 console 5 | CONFIG -= app_bundle 6 | 7 | TARGET = x64plgmnrc 8 | 9 | include(../build.pri) 10 | 11 | SOURCES += \ 12 | ../createmoduleprocess.cpp \ 13 | ../getfilefromserverprocess.cpp \ 14 | ../installmoduleprocess.cpp \ 15 | ../removemoduleprocess.cpp \ 16 | ../updategitprocess.cpp \ 17 | ../convertprocess.cpp \ 18 | ../utils.cpp \ 19 | main_console.cpp \ 20 | consoleoutput.cpp 21 | 22 | HEADERS += \ 23 | ../createmoduleprocess.h \ 24 | ../getfilefromserverprocess.h \ 25 | ../global.h \ 26 | ../installmoduleprocess.h \ 27 | ../removemoduleprocess.h \ 28 | ../updategitprocess.h \ 29 | ../convertprocess.h \ 30 | ../utils.h \ 31 | consoleoutput.h 32 | 33 | !contains(XCONFIG, xarchive) { 34 | XCONFIG += xarchive 35 | include(../XArchive/xarchive.pri) 36 | } 37 | 38 | !contains(XCONFIG, xgithub) { 39 | XCONFIG += xgithub 40 | include(../XGithub/xgithub.pri) 41 | } 42 | 43 | !contains(XCONFIG, xoptions) { 44 | XCONFIG += xoptions 45 | include(../XOptions/xoptions.pri) 46 | } 47 | -------------------------------------------------------------------------------- /console_source/consoleoutput.h: -------------------------------------------------------------------------------- 1 | // Copyright (c) 2019-2023 hors 2 | // 3 | // Permission is hereby granted, free of charge, to any person obtaining a copy 4 | // of this software and associated documentation files (the "Software"), to deal 5 | // in the Software without restriction, including without limitation the rights 6 | // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 7 | // copies of the Software, and to permit persons to whom the Software is 8 | // furnished to do so, subject to the following conditions: 9 | 10 | // The above copyright notice and this permission notice shall be included in all 11 | // copies or substantial portions of the Software. 12 | 13 | // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 14 | // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 15 | // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 16 | // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 17 | // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 18 | // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 19 | // SOFTWARE. 20 | // 21 | #ifndef CONSOLEOUTPUT_H 22 | #define CONSOLEOUTPUT_H 23 | 24 | #include 25 | 26 | class ConsoleOutput : public QObject { 27 | Q_OBJECT 28 | public: 29 | explicit ConsoleOutput(QObject *pParent = nullptr); 30 | 31 | public slots: 32 | void infoMessage(QString sText); 33 | void errorMessage(QString sText); 34 | }; 35 | 36 | #endif // CONSOLEOUTPUT_H 37 | -------------------------------------------------------------------------------- /console_source/consoleoutput.cpp: -------------------------------------------------------------------------------- 1 | // Copyright (c) 2019-2023 hors 2 | // 3 | // Permission is hereby granted, free of charge, to any person obtaining a copy 4 | // of this software and associated documentation files (the "Software"), to deal 5 | // in the Software without restriction, including without limitation the rights 6 | // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 7 | // copies of the Software, and to permit persons to whom the Software is 8 | // furnished to do so, subject to the following conditions: 9 | 10 | // The above copyright notice and this permission notice shall be included in all 11 | // copies or substantial portions of the Software. 12 | 13 | // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 14 | // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 15 | // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 16 | // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 17 | // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 18 | // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 19 | // SOFTWARE. 20 | // 21 | #include "consoleoutput.h" 22 | 23 | ConsoleOutput::ConsoleOutput(QObject *pParent) : QObject(pParent) 24 | { 25 | } 26 | 27 | void ConsoleOutput::infoMessage(QString sText) 28 | { 29 | QString _sText = sText; 30 | printf("%s\n", _sText.toLatin1().data()); 31 | } 32 | 33 | void ConsoleOutput::errorMessage(QString sText) 34 | { 35 | QString _sText = sText; 36 | printf("Error: %s\n", _sText.toLatin1().data()); 37 | } 38 | -------------------------------------------------------------------------------- /global.h: -------------------------------------------------------------------------------- 1 | // Copyright (c) 2019-2023 hors 2 | // 3 | // Permission is hereby granted, free of charge, to any person obtaining a copy 4 | // of this software and associated documentation files (the "Software"), to deal 5 | // in the Software without restriction, including without limitation the rights 6 | // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 7 | // copies of the Software, and to permit persons to whom the Software is 8 | // furnished to do so, subject to the following conditions: 9 | 10 | // The above copyright notice and this permission notice shall be included in all 11 | // copies or substantial portions of the Software. 12 | 13 | // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 14 | // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 15 | // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 16 | // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 17 | // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 18 | // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 19 | // SOFTWARE. 20 | // 21 | #ifndef _GLOBAL_H 22 | #define _GLOBAL_H 23 | 24 | #include 25 | 26 | #define X_APPLICATIONDISPLAYNAME "x64dbg Plugin Manager" 27 | #define X_APPLICATIONNAME "x64dbg Plugin Manager" 28 | #define X_APPLICATIONVERSION "0.06" 29 | #define X_ORGANIZATIONNAME "NTInfo" 30 | #define X_ORGANIZATIONDOMAIN "ntinfo.biz" 31 | #define X_OPTIONSFILE "x64plgmnr.ini" 32 | 33 | #define X_JSON_DEFAULT "https://raw.githubusercontent.com/x64dbg/PluginManager/master/list.json" 34 | 35 | #endif // _GLOBAL_H 36 | -------------------------------------------------------------------------------- /gui_source/dialoginfomodule.cpp: -------------------------------------------------------------------------------- 1 | // Copyright (c) 2019-2023 hors 2 | // 3 | // Permission is hereby granted, free of charge, to any person obtaining a copy 4 | // of this software and associated documentation files (the "Software"), to deal 5 | // in the Software without restriction, including without limitation the rights 6 | // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 7 | // copies of the Software, and to permit persons to whom the Software is 8 | // furnished to do so, subject to the following conditions: 9 | 10 | // The above copyright notice and this permission notice shall be included in all 11 | // copies or substantial portions of the Software. 12 | 13 | // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 14 | // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 15 | // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 16 | // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 17 | // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 18 | // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 19 | // SOFTWARE. 20 | // 21 | #include "dialoginfomodule.h" 22 | 23 | #include "ui_dialoginfomodule.h" 24 | 25 | DialogInfoModule::DialogInfoModule(QWidget *pParent, Utils::MDATA *pMData) : QDialog(pParent), ui(new Ui::DialogInfoModule) 26 | { 27 | ui->setupUi(this); 28 | 29 | ui->widgetInfo->setData(pMData); 30 | } 31 | 32 | DialogInfoModule::~DialogInfoModule() 33 | { 34 | delete ui; 35 | } 36 | 37 | void DialogInfoModule::on_pushButtonOK_clicked() 38 | { 39 | this->close(); 40 | } 41 | -------------------------------------------------------------------------------- /gui_source/plugininfowidget.h: -------------------------------------------------------------------------------- 1 | // Copyright (c) 2019-2023 hors 2 | // 3 | // Permission is hereby granted, free of charge, to any person obtaining a copy 4 | // of this software and associated documentation files (the "Software"), to deal 5 | // in the Software without restriction, including without limitation the rights 6 | // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 7 | // copies of the Software, and to permit persons to whom the Software is 8 | // furnished to do so, subject to the following conditions: 9 | 10 | // The above copyright notice and this permission notice shall be included in all 11 | // copies or substantial portions of the Software. 12 | 13 | // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 14 | // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 15 | // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 16 | // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 17 | // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 18 | // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 19 | // SOFTWARE. 20 | // 21 | #ifndef PLUGININFOWIDGET_H 22 | #define PLUGININFOWIDGET_H 23 | 24 | #include 25 | 26 | #include "../utils.h" 27 | 28 | namespace Ui { 29 | class PluginInfoWidget; 30 | } 31 | 32 | class PluginInfoWidget : public QWidget { 33 | Q_OBJECT 34 | 35 | public: 36 | explicit PluginInfoWidget(QWidget *pParent = nullptr); 37 | ~PluginInfoWidget(); 38 | void setData(Utils::MDATA *pMData); 39 | 40 | private: 41 | Ui::PluginInfoWidget *ui; 42 | }; 43 | 44 | #endif // PLUGININFOWIDGET_H 45 | -------------------------------------------------------------------------------- /gui_source/dialogabout.h: -------------------------------------------------------------------------------- 1 | // Copyright (c) 2019-2023 hors 2 | // 3 | // Permission is hereby granted, free of charge, to any person obtaining a copy 4 | // of this software and associated documentation files (the "Software"), to deal 5 | // in the Software without restriction, including without limitation the rights 6 | // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 7 | // copies of the Software, and to permit persons to whom the Software is 8 | // furnished to do so, subject to the following conditions: 9 | 10 | // The above copyright notice and this permission notice shall be included in all 11 | // copies or substantial portions of the Software. 12 | 13 | // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 14 | // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 15 | // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 16 | // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 17 | // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 18 | // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 19 | // SOFTWARE. 20 | // 21 | #ifndef DIALOGABOUT_H 22 | #define DIALOGABOUT_H 23 | 24 | #include 25 | #include 26 | 27 | #include "../global.h" 28 | #include "xoptions.h" 29 | 30 | namespace Ui { 31 | class DialogAbout; 32 | } 33 | 34 | class DialogAbout : public QDialog { 35 | Q_OBJECT 36 | 37 | public: 38 | explicit DialogAbout(QWidget *pParent = nullptr); 39 | ~DialogAbout(); 40 | 41 | private slots: 42 | void on_pushButtonOK_clicked(); 43 | 44 | private: 45 | Ui::DialogAbout *ui; 46 | }; 47 | 48 | #endif // DIALOGABOUT_H 49 | -------------------------------------------------------------------------------- /gui_source/dialoginfomodule.h: -------------------------------------------------------------------------------- 1 | // Copyright (c) 2019-2023 hors 2 | // 3 | // Permission is hereby granted, free of charge, to any person obtaining a copy 4 | // of this software and associated documentation files (the "Software"), to deal 5 | // in the Software without restriction, including without limitation the rights 6 | // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 7 | // copies of the Software, and to permit persons to whom the Software is 8 | // furnished to do so, subject to the following conditions: 9 | 10 | // The above copyright notice and this permission notice shall be included in all 11 | // copies or substantial portions of the Software. 12 | 13 | // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 14 | // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 15 | // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 16 | // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 17 | // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 18 | // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 19 | // SOFTWARE. 20 | // 21 | #ifndef DIALOGINFOMODULE_H 22 | #define DIALOGINFOMODULE_H 23 | 24 | #include 25 | 26 | #include "../utils.h" 27 | 28 | namespace Ui { 29 | class DialogInfoModule; 30 | } 31 | 32 | class DialogInfoModule : public QDialog { 33 | Q_OBJECT 34 | 35 | public: 36 | explicit DialogInfoModule(QWidget *pParent, Utils::MDATA *pMData); 37 | ~DialogInfoModule(); 38 | 39 | private slots: 40 | void on_pushButtonOK_clicked(); 41 | 42 | private: 43 | Ui::DialogInfoModule *ui; 44 | }; 45 | 46 | #endif // DIALOGINFOMODULE_H 47 | -------------------------------------------------------------------------------- /gui_source/dialoginfomodule.ui: -------------------------------------------------------------------------------- 1 | 2 | 3 | DialogInfoModule 4 | 5 | 6 | 7 | 0 8 | 0 9 | 391 10 | 326 11 | 12 | 13 | 14 | Information 15 | 16 | 17 | 18 | 19 | 20 | 21 | 0 22 | 0 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | Qt::Horizontal 33 | 34 | 35 | 36 | 40 37 | 20 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | OK 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | PluginInfoWidget 56 | QWidget 57 |
plugininfowidget.h
58 | 1 59 |
60 |
61 | 62 | 63 |
64 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | [![Donate](https://img.shields.io/badge/Donate-PayPal-green.svg)](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=NF3FBD3KHMXDN) 2 | [![GitHub tag (latest SemVer)](https://img.shields.io/github/tag/horsicq/x64dbg-Plugin-Manager.svg)](https://github.com/horsicq/x64dbg-Plugin-Manager/releases) 3 | [![GitHub All Releases](https://img.shields.io/github/downloads/horsicq/x64dbg-Plugin-Manager/total.svg)](https://github.com/horsicq/x64dbg-Plugin-Manager/releases) 4 | 5 | x64dbg Plugin Manager 6 | ======= 7 | 8 | ![alt text](https://github.com/horsicq/x64dbg-Plugin-Manager/blob/master/docs/screenshot_gui.jpg "Screenshot gui") 9 | ![alt text](https://github.com/horsicq/x64dbg-Plugin-Manager/blob/master/docs/screenshot_console.jpg "Screenshot console") 10 | 11 | Download 12 | ======= 13 | 14 | https://github.com/horsicq/x64dbg-Plugin-Manager/releases/tag/Beta 15 | 16 | Console example 17 | ======= 18 | 19 | x64plgmnrc.exe -G "C:\x64dbg_root" // Set root path for x64dbg 20 | 21 | x64plgmnrc.exe -U // Update list from server 22 | 23 | x64plgmnrc.exe -S // Show list of plugins 24 | 25 | x64plgmnrc.exe -i x64core // Install last version of x64dbg 26 | 27 | x64plgmnrc.exe -i AdvancedScript // install AdvancedScript 28 | 29 | 30 | # How to build on Windows 31 | ======= 32 | 33 | Install Visual Studio 2013: https://github.com/horsicq/build_tools 34 | 35 | Install Qt 5.6.3 for VS2013(x86): https://github.com/horsicq/build_tools 36 | 37 | Install 7-Zip: https://github.com/horsicq/build_tools 38 | 39 | Clone project: git clone --recursive https://github.com/horsicq/x64dbg-Plugin-Manager.git 40 | 41 | Edit build_win32.bat ( check VS_PATH, SEVENZIP_PATH, QT_PATH variables) 42 | 43 | Run build_win32.bat 44 | 45 | 46 | # How to add new plugin 47 | ======= 48 | 49 | You should make PR with new plugin to https://github.com/x64dbg/PluginManager/blob/master/list.json 50 | -------------------------------------------------------------------------------- /gui_source/main_gui.cpp: -------------------------------------------------------------------------------- 1 | // Copyright (c) 2019-2023 hors 2 | // 3 | // Permission is hereby granted, free of charge, to any person obtaining a copy 4 | // of this software and associated documentation files (the "Software"), to deal 5 | // in the Software without restriction, including without limitation the rights 6 | // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 7 | // copies of the Software, and to permit persons to whom the Software is 8 | // furnished to do so, subject to the following conditions: 9 | 10 | // The above copyright notice and this permission notice shall be included in all 11 | // copies or substantial portions of the Software. 12 | 13 | // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 14 | // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 15 | // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 16 | // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 17 | // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 18 | // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 19 | // SOFTWARE. 20 | // 21 | #include 22 | #include 23 | 24 | #include "guimainwindow.h" 25 | 26 | int main(int argc, char *argv[]) 27 | { 28 | QCoreApplication::setAttribute(Qt::AA_EnableHighDpiScaling); 29 | 30 | QCoreApplication::setOrganizationName(X_ORGANIZATIONNAME); 31 | QCoreApplication::setOrganizationDomain(X_ORGANIZATIONDOMAIN); 32 | QCoreApplication::setApplicationName(X_APPLICATIONNAME); 33 | QCoreApplication::setApplicationVersion(X_APPLICATIONVERSION); 34 | 35 | QApplication a(argc, argv); 36 | QApplication::setStyle(QStyleFactory::create("Fusion")); 37 | 38 | GuiMainWindow w; 39 | w.show(); 40 | 41 | return a.exec(); 42 | } 43 | -------------------------------------------------------------------------------- /gui_source/dialogoptions.h: -------------------------------------------------------------------------------- 1 | // Copyright (c) 2019-2023 hors 2 | // 3 | // Permission is hereby granted, free of charge, to any person obtaining a copy 4 | // of this software and associated documentation files (the "Software"), to deal 5 | // in the Software without restriction, including without limitation the rights 6 | // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 7 | // copies of the Software, and to permit persons to whom the Software is 8 | // furnished to do so, subject to the following conditions: 9 | 10 | // The above copyright notice and this permission notice shall be included in all 11 | // copies or substantial portions of the Software. 12 | 13 | // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 14 | // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 15 | // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 16 | // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 17 | // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 18 | // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 19 | // SOFTWARE. 20 | // 21 | #ifndef DIALOGOPTIONS_H 22 | #define DIALOGOPTIONS_H 23 | 24 | #include 25 | #include 26 | #include 27 | 28 | #include "../global.h" 29 | #include "../utils.h" 30 | #include "xoptions.h" 31 | 32 | namespace Ui { 33 | class DialogOptions; 34 | } 35 | 36 | class DialogOptions : public QDialog { 37 | Q_OBJECT 38 | 39 | public: 40 | explicit DialogOptions(QWidget *pParent, XOptions *pOptions); 41 | ~DialogOptions(); 42 | 43 | private slots: 44 | void on_pushButtonOK_clicked(); 45 | void on_pushButtonCancel_clicked(); 46 | void on_toolButtonRootPath_clicked(); 47 | void on_toolButtonDataPath_clicked(); 48 | 49 | private: 50 | Ui::DialogOptions *ui; 51 | XOptions *pOptions; 52 | }; 53 | 54 | #endif // DIALOGOPTIONS_H 55 | -------------------------------------------------------------------------------- /gui_source/dialogabout.ui: -------------------------------------------------------------------------------- 1 | 2 | 3 | DialogAbout 4 | 5 | 6 | Qt::ApplicationModal 7 | 8 | 9 | 10 | 0 11 | 0 12 | 464 13 | 278 14 | 15 | 16 | 17 | About 18 | 19 | 20 | true 21 | 22 | 23 | 24 | 25 | 26 | 27 | 0 28 | 0 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | Qt::Horizontal 39 | 40 | 41 | 42 | 40 43 | 20 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | OK 52 | 53 | 54 | 55 | 56 | 57 | 58 | 59 | 60 | 61 | XAboutWidget 62 | QWidget 63 |
xaboutwidget.h
64 | 1 65 |
66 |
67 | 68 | 69 |
70 | -------------------------------------------------------------------------------- /gui_source/dialogremovemodule.h: -------------------------------------------------------------------------------- 1 | // Copyright (c) 2019-2023 hors 2 | // 3 | // Permission is hereby granted, free of charge, to any person obtaining a copy 4 | // of this software and associated documentation files (the "Software"), to deal 5 | // in the Software without restriction, including without limitation the rights 6 | // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 7 | // copies of the Software, and to permit persons to whom the Software is 8 | // furnished to do so, subject to the following conditions: 9 | 10 | // The above copyright notice and this permission notice shall be included in all 11 | // copies or substantial portions of the Software. 12 | 13 | // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 14 | // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 15 | // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 16 | // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 17 | // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 18 | // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 19 | // SOFTWARE. 20 | // 21 | #ifndef DIALOGREMOVEMODULE_H 22 | #define DIALOGREMOVEMODULE_H 23 | 24 | #include 25 | 26 | #include "../utils.h" 27 | #include "dialogremovemoduleprocess.h" 28 | 29 | namespace Ui { 30 | class DialogRemoveModule; 31 | } 32 | 33 | class DialogRemoveModule : public QDialog { 34 | Q_OBJECT 35 | 36 | public: 37 | explicit DialogRemoveModule(QWidget *pParent, QString sDataPath, QString sRootPath, QString sModuleName); 38 | ~DialogRemoveModule(); 39 | 40 | private slots: 41 | void on_pushButtonCancel_clicked(); 42 | void on_pushButtonOK_clicked(); 43 | 44 | signals: 45 | void errorMessage(QString sMessage); 46 | 47 | private: 48 | Ui::DialogRemoveModule *ui; 49 | QString sDataPath; 50 | QString sRootPath; 51 | QString sModuleName; 52 | }; 53 | 54 | #endif // DIALOGREMOVEMODULE_H 55 | -------------------------------------------------------------------------------- /convertprocess.h: -------------------------------------------------------------------------------- 1 | // Copyright (c) 2019-2023 hors 2 | // 3 | // Permission is hereby granted, free of charge, to any person obtaining a copy 4 | // of this software and associated documentation files (the "Software"), to deal 5 | // in the Software without restriction, including without limitation the rights 6 | // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 7 | // copies of the Software, and to permit persons to whom the Software is 8 | // furnished to do so, subject to the following conditions: 9 | 10 | // The above copyright notice and this permission notice shall be included in all 11 | // copies or substantial portions of the Software. 12 | 13 | // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 14 | // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 15 | // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 16 | // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 17 | // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 18 | // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 19 | // SOFTWARE. 20 | // 21 | #ifndef CONVERTPROCESS_H 22 | #define CONVERTPROCESS_H 23 | 24 | #include 25 | #include 26 | 27 | #include "utils.h" 28 | #include "xzip.h" 29 | 30 | class ConvertProcess : public QObject { 31 | Q_OBJECT 32 | public: 33 | explicit ConvertProcess(QObject *pParent = nullptr); 34 | void setData(Utils::MDATA *pMData, QString sDataPath, XBinary::PDSTRUCT *pPdStruct); 35 | void stop(); 36 | Utils::STATS getCurrentStats(); 37 | 38 | signals: 39 | void errorMessage(QString sMessage); 40 | void infoMessage(QString sMessage); 41 | void completed(qint64 nElapsedTime); 42 | 43 | public slots: 44 | void process(); 45 | 46 | private: 47 | Utils::MDATA *pMData; 48 | Utils::STATS currentStats; 49 | QString sDataPath; 50 | XBinary::PDSTRUCT *g_pPdStruct; 51 | }; 52 | 53 | #endif // CONVERTPROCESS_H 54 | -------------------------------------------------------------------------------- /removemoduleprocess.h: -------------------------------------------------------------------------------- 1 | // Copyright (c) 2019-2023 hors 2 | // 3 | // Permission is hereby granted, free of charge, to any person obtaining a copy 4 | // of this software and associated documentation files (the "Software"), to deal 5 | // in the Software without restriction, including without limitation the rights 6 | // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 7 | // copies of the Software, and to permit persons to whom the Software is 8 | // furnished to do so, subject to the following conditions: 9 | 10 | // The above copyright notice and this permission notice shall be included in all 11 | // copies or substantial portions of the Software. 12 | 13 | // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 14 | // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 15 | // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 16 | // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 17 | // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 18 | // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 19 | // SOFTWARE. 20 | // 21 | #ifndef REMOVEMODULEPROCESS_H 22 | #define REMOVEMODULEPROCESS_H 23 | 24 | #include 25 | #include 26 | 27 | #include "utils.h" 28 | 29 | class RemoveModuleProcess : public QObject { 30 | Q_OBJECT 31 | 32 | public: 33 | explicit RemoveModuleProcess(QObject *pParent = nullptr); 34 | void setData(QString sDataPath, QString sRootPath, QList listModuleNames); 35 | void stop(); 36 | Utils::STATS getCurrentStats(); 37 | 38 | signals: 39 | void errorMessage(QString sMessage); 40 | void infoMessage(QString sMessage); 41 | void completed(qint64 nElapsedTime); 42 | 43 | public slots: 44 | void process(); 45 | 46 | private: 47 | QString sDataPath; 48 | QString sRootPath; 49 | QList listModuleNames; 50 | bool bIsStop; 51 | Utils::STATS currentStats; 52 | }; 53 | 54 | #endif // REMOVEMODULEPROCESS_H 55 | -------------------------------------------------------------------------------- /createmoduleprocess.h: -------------------------------------------------------------------------------- 1 | // Copyright (c) 2019-2023 hors 2 | // 3 | // Permission is hereby granted, free of charge, to any person obtaining a copy 4 | // of this software and associated documentation files (the "Software"), to deal 5 | // in the Software without restriction, including without limitation the rights 6 | // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 7 | // copies of the Software, and to permit persons to whom the Software is 8 | // furnished to do so, subject to the following conditions: 9 | 10 | // The above copyright notice and this permission notice shall be included in all 11 | // copies or substantial portions of the Software. 12 | 13 | // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 14 | // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 15 | // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 16 | // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 17 | // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 18 | // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 19 | // SOFTWARE. 20 | // 21 | #ifndef CREATEMODULEPROCESS_H 22 | #define CREATEMODULEPROCESS_H 23 | 24 | #include 25 | #include 26 | 27 | #include "utils.h" 28 | #include "xzip.h" 29 | 30 | class CreateModuleProcess : public QObject { 31 | Q_OBJECT 32 | 33 | public: 34 | explicit CreateModuleProcess(QObject *pParent = nullptr); 35 | void setData(Utils::MDATA *pMData, bool bCreateInfoFile, XBinary::PDSTRUCT *pPdStruct); 36 | void stop(); 37 | Utils::STATS getCurrentStats(); 38 | 39 | signals: 40 | void errorMessage(QString sMessage); 41 | void infoMessage(QString sMessage); 42 | void completed(qint64 nElapsedTime); 43 | 44 | public slots: 45 | void process(); 46 | 47 | private: 48 | Utils::MDATA *pMData; 49 | Utils::STATS currentStats; 50 | bool bCreateInfoFile; 51 | XBinary::PDSTRUCT *g_pPdStruct; 52 | }; 53 | 54 | #endif // CREATEMODULEPROCESS_H 55 | -------------------------------------------------------------------------------- /installmoduleprocess.h: -------------------------------------------------------------------------------- 1 | // Copyright (c) 2019-2023 hors 2 | // 3 | // Permission is hereby granted, free of charge, to any person obtaining a copy 4 | // of this software and associated documentation files (the "Software"), to deal 5 | // in the Software without restriction, including without limitation the rights 6 | // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 7 | // copies of the Software, and to permit persons to whom the Software is 8 | // furnished to do so, subject to the following conditions: 9 | 10 | // The above copyright notice and this permission notice shall be included in all 11 | // copies or substantial portions of the Software. 12 | 13 | // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 14 | // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 15 | // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 16 | // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 17 | // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 18 | // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 19 | // SOFTWARE. 20 | // 21 | #ifndef INSTALLMODULEPROCESS_H 22 | #define INSTALLMODULEPROCESS_H 23 | 24 | #include 25 | #include 26 | 27 | #include "utils.h" 28 | #include "xzip.h" 29 | 30 | class InstallModuleProcess : public QObject { 31 | Q_OBJECT 32 | 33 | public: 34 | explicit InstallModuleProcess(QObject *pParent = nullptr); 35 | void setData(QString sDataPath, QString sRootPath, QList listModuleFileNames, XBinary::PDSTRUCT *pPdStruct); 36 | void stop(); 37 | Utils::STATS getCurrentStats(); 38 | 39 | signals: 40 | void errorMessage(QString sMessage); 41 | void infoMessage(QString sMessage); 42 | void completed(qint64 nElapsedTime); 43 | 44 | public slots: 45 | void process(); 46 | 47 | private: 48 | QString sDataPath; 49 | QString sRootPath; 50 | QList listModuleFileNames; 51 | XBinary::PDSTRUCT *g_pPdStruct; 52 | Utils::STATS currentStats; 53 | }; 54 | 55 | #endif // INSTALLMODULEPROCESS_H 56 | -------------------------------------------------------------------------------- /gui_source/dialoggetfilefromserverprocess.h: -------------------------------------------------------------------------------- 1 | // Copyright (c) 2019-2023 hors 2 | // 3 | // Permission is hereby granted, free of charge, to any person obtaining a copy 4 | // of this software and associated documentation files (the "Software"), to deal 5 | // in the Software without restriction, including without limitation the rights 6 | // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 7 | // copies of the Software, and to permit persons to whom the Software is 8 | // furnished to do so, subject to the following conditions: 9 | 10 | // The above copyright notice and this permission notice shall be included in all 11 | // copies or substantial portions of the Software. 12 | 13 | // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 14 | // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 15 | // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 16 | // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 17 | // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 18 | // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 19 | // SOFTWARE. 20 | // 21 | #ifndef DIALOGGETFILEFROMSERVERPROCESS_H 22 | #define DIALOGGETFILEFROMSERVERPROCESS_H 23 | 24 | #include 25 | #include 26 | #include 27 | 28 | #include "../getfilefromserverprocess.h" 29 | 30 | namespace Ui { 31 | class DialogGetFileFromServerProcess; 32 | } 33 | 34 | class DialogGetFileFromServerProcess : public QDialog { 35 | Q_OBJECT 36 | 37 | public: 38 | explicit DialogGetFileFromServerProcess(QWidget *pParent, QList listWebRecords); 39 | ~DialogGetFileFromServerProcess(); 40 | 41 | private slots: 42 | void on_pushButtonCancel_clicked(); 43 | void onCompleted(qint64 nElapsed); 44 | void timerSlot(); 45 | 46 | signals: 47 | void errorMessage(QString sMessage); 48 | 49 | private: 50 | Ui::DialogGetFileFromServerProcess *ui; 51 | GetFileFromServerProcess *pGetFileFromServerProcess; 52 | QThread *pThread; 53 | bool bIsRun; 54 | QTimer *pTimer; 55 | }; 56 | 57 | #endif // DIALOGGETFILEFROMSERVERPROCESS_H 58 | -------------------------------------------------------------------------------- /gui_source/dialogconvertprocess.h: -------------------------------------------------------------------------------- 1 | // Copyright (c) 2019-2023 hors 2 | // 3 | // Permission is hereby granted, free of charge, to any person obtaining a copy 4 | // of this software and associated documentation files (the "Software"), to deal 5 | // in the Software without restriction, including without limitation the rights 6 | // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 7 | // copies of the Software, and to permit persons to whom the Software is 8 | // furnished to do so, subject to the following conditions: 9 | 10 | // The above copyright notice and this permission notice shall be included in all 11 | // copies or substantial portions of the Software. 12 | 13 | // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 14 | // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 15 | // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 16 | // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 17 | // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 18 | // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 19 | // SOFTWARE. 20 | // 21 | #ifndef DIALOGCONVERTPROCESS_H 22 | #define DIALOGCONVERTPROCESS_H 23 | 24 | #include 25 | #include 26 | #include 27 | 28 | #include "../convertprocess.h" 29 | #include "../utils.h" 30 | 31 | namespace Ui { 32 | class DialogConvertProcess; 33 | } 34 | 35 | class DialogConvertProcess : public QDialog { 36 | Q_OBJECT 37 | 38 | public: 39 | explicit DialogConvertProcess(QWidget *pParent, Utils::MDATA *pMData, QString sDataPath); 40 | ~DialogConvertProcess(); 41 | 42 | private slots: 43 | void on_pushButtonCancel_clicked(); 44 | void onCompleted(qint64 nElapsed); 45 | void timerSlot(); 46 | 47 | signals: 48 | void errorMessage(QString sMessage); 49 | 50 | private: 51 | Ui::DialogConvertProcess *ui; 52 | Utils::MDATA *pMData; 53 | QString sDataPath; 54 | ConvertProcess *pConvertProcess; 55 | QThread *pThread; 56 | XBinary::PDSTRUCT g_pdStructEmpty; 57 | bool bIsRun; 58 | QTimer *pTimer; 59 | }; 60 | 61 | #endif // DIALOGCONVERTPROCESS_H 62 | -------------------------------------------------------------------------------- /gui_source/dialogupdategitprocess.h: -------------------------------------------------------------------------------- 1 | // Copyright (c) 2019-2023 hors 2 | // 3 | // Permission is hereby granted, free of charge, to any person obtaining a copy 4 | // of this software and associated documentation files (the "Software"), to deal 5 | // in the Software without restriction, including without limitation the rights 6 | // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 7 | // copies of the Software, and to permit persons to whom the Software is 8 | // furnished to do so, subject to the following conditions: 9 | 10 | // The above copyright notice and this permission notice shall be included in all 11 | // copies or substantial portions of the Software. 12 | 13 | // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 14 | // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 15 | // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 16 | // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 17 | // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 18 | // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 19 | // SOFTWARE. 20 | // 21 | #ifndef DIALOGUPDATEGITPROCESS_H 22 | #define DIALOGUPDATEGITPROCESS_H 23 | 24 | #include 25 | #include 26 | #include 27 | 28 | #include "../updategitprocess.h" 29 | #include "../utils.h" 30 | 31 | namespace Ui { 32 | class DialogUpdateGitProcess; 33 | } 34 | 35 | class DialogUpdateGitProcess : public QDialog { 36 | Q_OBJECT 37 | 38 | public: 39 | explicit DialogUpdateGitProcess(QWidget *pParent, QString sServerListFileName, QString sServerLastestListFileName, bool bInit); 40 | ~DialogUpdateGitProcess(); 41 | 42 | private slots: 43 | void on_pushButtonCancel_clicked(); 44 | void onCompleted(qint64 nElapsed); 45 | void timerSlot(); 46 | 47 | signals: 48 | void errorMessage(QString sMessage); 49 | 50 | private: 51 | Ui::DialogUpdateGitProcess *ui; 52 | QString sServerLastestListFileName; 53 | UpdateGitProcess *pUpdateGitProcess; 54 | QThread *pThread; 55 | bool bIsRun; 56 | QTimer *pTimer; 57 | }; 58 | 59 | #endif // DIALOGUPDATEGITPROCESS_H 60 | -------------------------------------------------------------------------------- /updategitprocess.h: -------------------------------------------------------------------------------- 1 | // Copyright (c) 2019-2023 hors 2 | // 3 | // Permission is hereby granted, free of charge, to any person obtaining a copy 4 | // of this software and associated documentation files (the "Software"), to deal 5 | // in the Software without restriction, including without limitation the rights 6 | // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 7 | // copies of the Software, and to permit persons to whom the Software is 8 | // furnished to do so, subject to the following conditions: 9 | 10 | // The above copyright notice and this permission notice shall be included in all 11 | // copies or substantial portions of the Software. 12 | 13 | // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 14 | // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 15 | // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 16 | // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 17 | // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 18 | // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 19 | // SOFTWARE. 20 | // 21 | #ifndef UPDATEGITPROCESS_H 22 | #define UPDATEGITPROCESS_H 23 | 24 | #include 25 | #include 26 | #include 27 | 28 | #include "utils.h" 29 | #include "xgithub.h" 30 | 31 | class UpdateGitProcess : public QObject { 32 | Q_OBJECT 33 | 34 | public: 35 | explicit UpdateGitProcess(QObject *pParent = nullptr); 36 | void setData(QString sServerListFileName, QString sServerLastestListFileName, bool bInit); 37 | void stop(); 38 | Utils::STATS getCurrentStats(); 39 | void setCredentials(QString sUser, QString sToken); 40 | 41 | signals: 42 | void errorMessage(QString sMessage); 43 | void infoMessage(QString sMessage); 44 | void completed(qint64 nElapsedTime); 45 | 46 | public slots: 47 | void process(); 48 | 49 | private: 50 | QString sServerListFileName; 51 | QString sServerLastestListFileName; 52 | bool bIsStop; 53 | Utils::STATS currentStats; 54 | QString sAuthUser; 55 | QString sAuthToken; 56 | bool g_bInit; 57 | }; 58 | 59 | #endif // UPDATEGITPROCESS_H 60 | -------------------------------------------------------------------------------- /gui_source/dialogremovemodule.ui: -------------------------------------------------------------------------------- 1 | 2 | 3 | DialogRemoveModule 4 | 5 | 6 | Qt::ApplicationModal 7 | 8 | 9 | 10 | 0 11 | 0 12 | 390 13 | 260 14 | 15 | 16 | 17 | Remove 18 | 19 | 20 | true 21 | 22 | 23 | 24 | 25 | 26 | 27 | 0 28 | 0 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | Qt::Horizontal 39 | 40 | 41 | 42 | 40 43 | 20 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | Cancel 52 | 53 | 54 | 55 | 56 | 57 | 58 | OK 59 | 60 | 61 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | PluginInfoWidget 69 | QWidget 70 |
plugininfowidget.h
71 | 1 72 |
73 |
74 | 75 | 76 |
77 | -------------------------------------------------------------------------------- /getfilefromserverprocess.h: -------------------------------------------------------------------------------- 1 | // Copyright (c) 2019-2023 hors 2 | // 3 | // Permission is hereby granted, free of charge, to any person obtaining a copy 4 | // of this software and associated documentation files (the "Software"), to deal 5 | // in the Software without restriction, including without limitation the rights 6 | // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 7 | // copies of the Software, and to permit persons to whom the Software is 8 | // furnished to do so, subject to the following conditions: 9 | 10 | // The above copyright notice and this permission notice shall be included in all 11 | // copies or substantial portions of the Software. 12 | 13 | // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 14 | // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 15 | // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 16 | // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 17 | // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 18 | // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 19 | // SOFTWARE. 20 | // 21 | #ifndef GETFILEFROMSERVERPROCESS_H 22 | #define GETFILEFROMSERVERPROCESS_H 23 | 24 | #include 25 | #include 26 | #include 27 | #include 28 | #include 29 | 30 | #include "utils.h" 31 | 32 | class GetFileFromServerProcess : public QObject { 33 | Q_OBJECT 34 | public: 35 | explicit GetFileFromServerProcess(QObject *pParent = nullptr); 36 | void setData(QList listWebRecords); 37 | void stop(); 38 | Utils::STATS getCurrentStats(); 39 | 40 | signals: 41 | void errorMessage(QString sMessage); 42 | void infoMessage(QString sMessage); 43 | void completed(qint64 nElapsedTime); 44 | 45 | public slots: 46 | void process(); 47 | void _downloadProgress(qint64 bytesReceived, qint64 bytesTotal); 48 | 49 | private: 50 | bool bIsStop; 51 | QList listWebRecords; 52 | QNetworkReply *pReply; 53 | QNetworkReply *replyRed; 54 | Utils::STATS currentStats; 55 | }; 56 | 57 | #endif // GETFILEFROMSERVERPROCESS_H 58 | -------------------------------------------------------------------------------- /gui_source/dialogcreatemoduleprocess.h: -------------------------------------------------------------------------------- 1 | // Copyright (c) 2019-2023 hors 2 | // 3 | // Permission is hereby granted, free of charge, to any person obtaining a copy 4 | // of this software and associated documentation files (the "Software"), to deal 5 | // in the Software without restriction, including without limitation the rights 6 | // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 7 | // copies of the Software, and to permit persons to whom the Software is 8 | // furnished to do so, subject to the following conditions: 9 | 10 | // The above copyright notice and this permission notice shall be included in all 11 | // copies or substantial portions of the Software. 12 | 13 | // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 14 | // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 15 | // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 16 | // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 17 | // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 18 | // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 19 | // SOFTWARE. 20 | // 21 | #ifndef DIALOGCREATEMODULEPROCESS_H 22 | #define DIALOGCREATEMODULEPROCESS_H 23 | 24 | #include 25 | #include 26 | #include 27 | 28 | #include "../createmoduleprocess.h" 29 | #include "../utils.h" 30 | 31 | namespace Ui { 32 | class DialogCreateModuleProcess; 33 | } 34 | 35 | class DialogCreateModuleProcess : public QDialog { 36 | Q_OBJECT 37 | 38 | public: 39 | explicit DialogCreateModuleProcess(QWidget *pParent, Utils::MDATA *pMData, bool bCreateInfoFile); 40 | ~DialogCreateModuleProcess(); 41 | 42 | private slots: 43 | void on_pushButtonCancel_clicked(); 44 | void onCompleted(qint64 nElapsed); 45 | void timerSlot(); 46 | 47 | signals: 48 | void errorMessage(QString sMessage); 49 | 50 | private: 51 | Ui::DialogCreateModuleProcess *ui; 52 | Utils::MDATA *pMData; 53 | 54 | CreateModuleProcess *pCreateModuleProcess; 55 | QThread *pThread; 56 | bool bIsRun; 57 | XBinary::PDSTRUCT g_pdStructEmpty; 58 | QTimer *pTimer; 59 | }; 60 | 61 | #endif // DIALOGCREATEMODULEPROCESS_H 62 | -------------------------------------------------------------------------------- /gui_source/dialogconvertprocess.ui: -------------------------------------------------------------------------------- 1 | 2 | 3 | DialogConvertProcess 4 | 5 | 6 | 7 | 0 8 | 0 9 | 457 10 | 118 11 | 12 | 13 | 14 | Convert 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | Qt::AlignCenter 24 | 25 | 26 | 27 | 28 | 29 | 30 | 0 31 | 32 | 33 | 0 34 | 35 | 36 | Qt::AlignCenter 37 | 38 | 39 | 40 | 41 | 42 | 43 | Qt::Vertical 44 | 45 | 46 | 47 | 20 48 | 20 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | 58 | Qt::Horizontal 59 | 60 | 61 | 62 | 40 63 | 20 64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 | Cancel 72 | 73 | 74 | 75 | 76 | 77 | 78 | 79 | 80 | 81 | 82 | -------------------------------------------------------------------------------- /gui_source/dialogupdategitprocess.ui: -------------------------------------------------------------------------------- 1 | 2 | 3 | DialogUpdateGitProcess 4 | 5 | 6 | 7 | 0 8 | 0 9 | 496 10 | 103 11 | 12 | 13 | 14 | Update Github 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | Qt::AlignCenter 24 | 25 | 26 | 27 | 28 | 29 | 30 | 0 31 | 32 | 33 | 0 34 | 35 | 36 | Qt::AlignCenter 37 | 38 | 39 | 40 | 41 | 42 | 43 | Qt::Vertical 44 | 45 | 46 | 47 | 20 48 | 5 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | 58 | Qt::Horizontal 59 | 60 | 61 | 62 | 40 63 | 20 64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 | Cancel 72 | 73 | 74 | 75 | 76 | 77 | 78 | 79 | 80 | 81 | 82 | -------------------------------------------------------------------------------- /gui_source/dialoginstallmodule.h: -------------------------------------------------------------------------------- 1 | // Copyright (c) 2019-2023 hors 2 | // 3 | // Permission is hereby granted, free of charge, to any person obtaining a copy 4 | // of this software and associated documentation files (the "Software"), to deal 5 | // in the Software without restriction, including without limitation the rights 6 | // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 7 | // copies of the Software, and to permit persons to whom the Software is 8 | // furnished to do so, subject to the following conditions: 9 | 10 | // The above copyright notice and this permission notice shall be included in all 11 | // copies or substantial portions of the Software. 12 | 13 | // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 14 | // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 15 | // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 16 | // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 17 | // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 18 | // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 19 | // SOFTWARE. 20 | // 21 | #ifndef DIALOGINSTALLMODULE_H 22 | #define DIALOGINSTALLMODULE_H 23 | 24 | #include 25 | 26 | #include "../utils.h" 27 | #include "dialogconvertprocess.h" 28 | #include "dialogcreatemoduleprocess.h" 29 | #include "dialoggetfilefromserverprocess.h" 30 | #include "dialoginstallmoduleprocess.h" 31 | 32 | namespace Ui { 33 | class DialogInstallModule; 34 | } 35 | 36 | class DialogInstallModule : public QDialog { 37 | Q_OBJECT 38 | 39 | public: 40 | explicit DialogInstallModule(QWidget *pParent, QString sDataPath, QString sRootPath); 41 | ~DialogInstallModule(); 42 | void setFileName(QString sModuleFileName); 43 | bool setMData(Utils::MDATA *pMData); 44 | 45 | private slots: 46 | void on_pushButtonCancel_clicked(); 47 | void on_pushButtonOK_clicked(); 48 | 49 | signals: 50 | void errorMessage(QString sMessage); 51 | 52 | private: 53 | Ui::DialogInstallModule *ui; 54 | QWidget *pParent; 55 | Utils::MDATA _mdata; 56 | QString sDataPath; 57 | QString sRootPath; 58 | QString sModuleFileName; 59 | }; 60 | 61 | #endif // DIALOGINSTALLMODULE_H 62 | -------------------------------------------------------------------------------- /gui_source/dialogremovemoduleprocess.h: -------------------------------------------------------------------------------- 1 | // Copyright (c) 2019-2023 hors 2 | // 3 | // Permission is hereby granted, free of charge, to any person obtaining a copy 4 | // of this software and associated documentation files (the "Software"), to deal 5 | // in the Software without restriction, including without limitation the rights 6 | // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 7 | // copies of the Software, and to permit persons to whom the Software is 8 | // furnished to do so, subject to the following conditions: 9 | 10 | // The above copyright notice and this permission notice shall be included in all 11 | // copies or substantial portions of the Software. 12 | 13 | // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 14 | // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 15 | // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 16 | // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 17 | // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 18 | // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 19 | // SOFTWARE. 20 | // 21 | #ifndef DIALOGREMOVEMODULEPROCESS_H 22 | #define DIALOGREMOVEMODULEPROCESS_H 23 | 24 | #include 25 | #include 26 | #include 27 | 28 | #include "../removemoduleprocess.h" 29 | #include "../utils.h" 30 | 31 | namespace Ui { 32 | class DialogRemoveModuleProcess; 33 | } 34 | 35 | class DialogRemoveModuleProcess : public QDialog { 36 | Q_OBJECT 37 | 38 | public: 39 | explicit DialogRemoveModuleProcess(QWidget *pParent, QString sDataPath, QString sRootPath, QList listModuleNames); 40 | ~DialogRemoveModuleProcess(); 41 | 42 | private slots: 43 | void on_pushButtonCancel_clicked(); 44 | void onCompleted(qint64 nElapsed); 45 | void timerSlot(); 46 | 47 | signals: 48 | void errorMessage(QString sMessage); 49 | 50 | private: 51 | Ui::DialogRemoveModuleProcess *ui; 52 | QString sDataPath; 53 | QString sRootPath; 54 | QList listModuleNames; 55 | RemoveModuleProcess *pRemoveModuleProcess; 56 | QThread *pThread; 57 | bool bIsRun; 58 | QTimer *pTimer; 59 | }; 60 | 61 | #endif // DIALOGREMOVEMODULEPROCESS_H 62 | -------------------------------------------------------------------------------- /gui_source/dialogremovemodule.cpp: -------------------------------------------------------------------------------- 1 | // Copyright (c) 2019-2023 hors 2 | // 3 | // Permission is hereby granted, free of charge, to any person obtaining a copy 4 | // of this software and associated documentation files (the "Software"), to deal 5 | // in the Software without restriction, including without limitation the rights 6 | // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 7 | // copies of the Software, and to permit persons to whom the Software is 8 | // furnished to do so, subject to the following conditions: 9 | 10 | // The above copyright notice and this permission notice shall be included in all 11 | // copies or substantial portions of the Software. 12 | 13 | // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 14 | // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 15 | // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 16 | // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 17 | // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 18 | // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 19 | // SOFTWARE. 20 | // 21 | #include "dialogremovemodule.h" 22 | 23 | #include "ui_dialogremovemodule.h" 24 | 25 | DialogRemoveModule::DialogRemoveModule(QWidget *pParent, QString sDataPath, QString sRootPath, QString sModuleName) : QDialog(pParent), ui(new Ui::DialogRemoveModule) 26 | { 27 | ui->setupUi(this); 28 | 29 | this->sDataPath = sDataPath; 30 | this->sRootPath = sRootPath; 31 | this->sModuleName = sModuleName; 32 | 33 | QString sFileName = Utils::getInstalledJsonFileName(sDataPath, sModuleName); 34 | 35 | Utils::MDATA mdata = Utils::getMDataFromJSONFile(sFileName); 36 | 37 | ui->widgetInfo->setData(&mdata); 38 | } 39 | 40 | DialogRemoveModule::~DialogRemoveModule() 41 | { 42 | delete ui; 43 | } 44 | 45 | void DialogRemoveModule::on_pushButtonCancel_clicked() 46 | { 47 | this->close(); 48 | } 49 | 50 | void DialogRemoveModule::on_pushButtonOK_clicked() 51 | { 52 | DialogRemoveModuleProcess drmp(this, sDataPath, sRootPath, QList() << sModuleName); 53 | 54 | connect(&drmp, SIGNAL(errorMessage(QString)), this, SIGNAL(errorMessage(QString))); 55 | 56 | drmp.exec(); 57 | 58 | this->close(); 59 | } 60 | -------------------------------------------------------------------------------- /gui_source/dialoginstallmoduleprocess.h: -------------------------------------------------------------------------------- 1 | // Copyright (c) 2019-2023 hors 2 | // 3 | // Permission is hereby granted, free of charge, to any person obtaining a copy 4 | // of this software and associated documentation files (the "Software"), to deal 5 | // in the Software without restriction, including without limitation the rights 6 | // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 7 | // copies of the Software, and to permit persons to whom the Software is 8 | // furnished to do so, subject to the following conditions: 9 | 10 | // The above copyright notice and this permission notice shall be included in all 11 | // copies or substantial portions of the Software. 12 | 13 | // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 14 | // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 15 | // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 16 | // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 17 | // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 18 | // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 19 | // SOFTWARE. 20 | // 21 | #ifndef DIALOGINSTALLMODULEPROCESS_H 22 | #define DIALOGINSTALLMODULEPROCESS_H 23 | 24 | #include 25 | #include 26 | #include 27 | 28 | #include "../installmoduleprocess.h" 29 | #include "../utils.h" 30 | 31 | namespace Ui { 32 | class DialogInstallModuleProcess; 33 | } 34 | 35 | class DialogInstallModuleProcess : public QDialog { 36 | Q_OBJECT 37 | 38 | public: 39 | explicit DialogInstallModuleProcess(QWidget *pParent, QString sDataPath, QString sRootPath, QList listModuleFileNames); 40 | ~DialogInstallModuleProcess(); 41 | 42 | private slots: 43 | void on_pushButtonCancel_clicked(); 44 | void onCompleted(qint64 nElapsed); 45 | void timerSlot(); 46 | 47 | signals: 48 | void errorMessage(QString sMessage); 49 | 50 | private: 51 | Ui::DialogInstallModuleProcess *ui; 52 | QString sDataPath; 53 | QString sRootPath; 54 | QList listModuleFileNames; 55 | InstallModuleProcess *pInstallModuleProcess; 56 | QThread *pThread; 57 | bool bIsRun; 58 | XBinary::PDSTRUCT g_pdStructEmpty; 59 | QTimer *pTimer; 60 | }; 61 | 62 | #endif // DIALOGINSTALLMODULEPROCESS_H 63 | -------------------------------------------------------------------------------- /gui_source/dialogcreatemoduleprocess.ui: -------------------------------------------------------------------------------- 1 | 2 | 3 | DialogCreateModuleProcess 4 | 5 | 6 | Qt::ApplicationModal 7 | 8 | 9 | 10 | 0 11 | 0 12 | 621 13 | 110 14 | 15 | 16 | 17 | Create Module 18 | 19 | 20 | true 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | Qt::AlignCenter 30 | 31 | 32 | 33 | 34 | 35 | 36 | 0 37 | 38 | 39 | 0 40 | 41 | 42 | Qt::AlignCenter 43 | 44 | 45 | 46 | 47 | 48 | 49 | Qt::Vertical 50 | 51 | 52 | 53 | 20 54 | 40 55 | 56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 | 64 | Qt::Horizontal 65 | 66 | 67 | 68 | 40 69 | 20 70 | 71 | 72 | 73 | 74 | 75 | 76 | 77 | Cancel 78 | 79 | 80 | 81 | 82 | 83 | 84 | 85 | 86 | 87 | 88 | -------------------------------------------------------------------------------- /gui_source/plugininfowidget.cpp: -------------------------------------------------------------------------------- 1 | // Copyright (c) 2019-2023 hors 2 | // 3 | // Permission is hereby granted, free of charge, to any person obtaining a copy 4 | // of this software and associated documentation files (the "Software"), to deal 5 | // in the Software without restriction, including without limitation the rights 6 | // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 7 | // copies of the Software, and to permit persons to whom the Software is 8 | // furnished to do so, subject to the following conditions: 9 | 10 | // The above copyright notice and this permission notice shall be included in all 11 | // copies or substantial portions of the Software. 12 | 13 | // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 14 | // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 15 | // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 16 | // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 17 | // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 18 | // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 19 | // SOFTWARE. 20 | // 21 | #include "plugininfowidget.h" 22 | 23 | #include "ui_plugininfowidget.h" 24 | 25 | PluginInfoWidget::PluginInfoWidget(QWidget *pParent) : QWidget(pParent), ui(new Ui::PluginInfoWidget) 26 | { 27 | ui->setupUi(this); 28 | } 29 | 30 | PluginInfoWidget::~PluginInfoWidget() 31 | { 32 | delete ui; 33 | } 34 | 35 | void PluginInfoWidget::setData(Utils::MDATA *pMData) 36 | { 37 | QString sText; 38 | 39 | sText += QString("%1: %2
").arg(tr("Name")).arg(pMData->sName); 40 | sText += QString("%1: %2
").arg(tr("Version")).arg(pMData->sVersion); 41 | sText += QString("%1: %2
").arg(tr("Date")).arg(pMData->sDate); 42 | sText += QString("%1: %2
").arg(tr("Author")).arg(pMData->sAuthor); 43 | sText += QString("%1: %2
").arg(tr("Bugreport")).arg(pMData->sBugreport); 44 | sText += QString("%1: %2
").arg(tr("Info")).arg(pMData->sInfo); 45 | sText += QString("%1: %2
").arg(tr("Size")).arg(pMData->nSize); 46 | sText += QString("%1: %2
").arg(tr("Compressed size")).arg(pMData->nCompressedSize); 47 | sText += QString("%1: %2
").arg(tr("Is32")).arg((pMData->bIs32) ? ("true") : ("false")); 48 | sText += QString("%1: %2
").arg(tr("Is64")).arg((pMData->bIs64) ? ("true") : ("false")); 49 | 50 | ui->textEditInfo->setHtml(sText); 51 | } 52 | -------------------------------------------------------------------------------- /gui_source/dialogcreatemodule.h: -------------------------------------------------------------------------------- 1 | // Copyright (c) 2019-2023 hors 2 | // 3 | // Permission is hereby granted, free of charge, to any person obtaining a copy 4 | // of this software and associated documentation files (the "Software"), to deal 5 | // in the Software without restriction, including without limitation the rights 6 | // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 7 | // copies of the Software, and to permit persons to whom the Software is 8 | // furnished to do so, subject to the following conditions: 9 | 10 | // The above copyright notice and this permission notice shall be included in all 11 | // copies or substantial portions of the Software. 12 | 13 | // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 14 | // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 15 | // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 16 | // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 17 | // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 18 | // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 19 | // SOFTWARE. 20 | // 21 | #ifndef DIALOGCREATEMODULE_H 22 | #define DIALOGCREATEMODULE_H 23 | 24 | #include 25 | #include 26 | #include 27 | #include 28 | #include 29 | 30 | #include "../utils.h" 31 | #include "dialogcreatemoduleprocess.h" 32 | 33 | namespace Ui { 34 | class DialogCreateModule; 35 | } 36 | 37 | class DialogCreateModule : public QDialog { 38 | Q_OBJECT 39 | 40 | public: 41 | explicit DialogCreateModule(QWidget *pParent); 42 | ~DialogCreateModule(); 43 | 44 | private slots: 45 | void on_pushButtonLoad_clicked(); 46 | void on_pushButtonSave_clicked(); 47 | void on_pushButtonCreate_clicked(); 48 | void on_toolButtonRoot_clicked(); 49 | void on_lineEditRoot_textChanged(const QString &sDirectoryName); 50 | void on_pushButtonCancel_clicked(); 51 | void on_lineEditName_textChanged(const QString &sName); 52 | void on_lineEditVersion_textChanged(const QString &sVersion); 53 | void on_pushButtonCurrentDate_clicked(); 54 | void _currentDate(); 55 | void on_dateEdit_dateChanged(const QDate &date); 56 | void on_lineEditInfo_textChanged(const QString &sInfo); 57 | void on_lineEditAuthor_textChanged(const QString &sAuthor); 58 | void on_lineEditBugreport_textChanged(const QString &sBugreport); 59 | 60 | signals: 61 | void errorMessage(QString sMessage); 62 | 63 | private: 64 | Ui::DialogCreateModule *ui; 65 | Utils::MDATA mdata; 66 | }; 67 | 68 | #endif // DIALOGCREATEMODULE_H 69 | -------------------------------------------------------------------------------- /gui_source/dialoggetfilefromserverprocess.ui: -------------------------------------------------------------------------------- 1 | 2 | 3 | DialogGetFileFromServerProcess 4 | 5 | 6 | 7 | 0 8 | 0 9 | 452 10 | 135 11 | 12 | 13 | 14 | Download file 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | Qt::AlignCenter 24 | 25 | 26 | 27 | 28 | 29 | 30 | 0 31 | 32 | 33 | 0 34 | 35 | 36 | Qt::AlignCenter 37 | 38 | 39 | 40 | 41 | 42 | 43 | 0 44 | 45 | 46 | 0 47 | 48 | 49 | Qt::AlignCenter 50 | 51 | 52 | 53 | 54 | 55 | 56 | Qt::Vertical 57 | 58 | 59 | 60 | 20 61 | 6 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 | Qt::Horizontal 72 | 73 | 74 | 75 | 40 76 | 20 77 | 78 | 79 | 80 | 81 | 82 | 83 | 84 | Cancel 85 | 86 | 87 | 88 | 89 | 90 | 91 | 92 | 93 | 94 | 95 | -------------------------------------------------------------------------------- /gui_source/gui_source.pro: -------------------------------------------------------------------------------- 1 | QT += core gui network 2 | 3 | greaterThan(QT_MAJOR_VERSION, 4): QT += widgets 4 | 5 | CONFIG += c++11 6 | 7 | TARGET = x64plgmnr 8 | TEMPLATE = app 9 | 10 | include(../build.pri) 11 | 12 | SOURCES += \ 13 | ../convertprocess.cpp \ 14 | ../getfilefromserverprocess.cpp \ 15 | ../installmoduleprocess.cpp \ 16 | ../removemoduleprocess.cpp \ 17 | ../updategitprocess.cpp \ 18 | ../utils.cpp \ 19 | ../createmoduleprocess.cpp \ 20 | dialogabout.cpp \ 21 | dialogconvertprocess.cpp \ 22 | dialogcreatemodule.cpp \ 23 | dialogcreatemoduleprocess.cpp \ 24 | dialoggetfilefromserverprocess.cpp \ 25 | dialoginfomodule.cpp \ 26 | dialoginstallmodule.cpp \ 27 | dialoginstallmoduleprocess.cpp \ 28 | dialogoptions.cpp \ 29 | dialogremovemodule.cpp \ 30 | dialogremovemoduleprocess.cpp \ 31 | dialogupdategitprocess.cpp \ 32 | guimainwindow.cpp \ 33 | main_gui.cpp \ 34 | plugininfowidget.cpp 35 | 36 | HEADERS += \ 37 | ../convertprocess.h \ 38 | ../getfilefromserverprocess.h \ 39 | ../global.h \ 40 | ../installmoduleprocess.h \ 41 | ../removemoduleprocess.h \ 42 | ../updategitprocess.h \ 43 | ../utils.h \ 44 | ../createmoduleprocess.h \ 45 | dialogabout.h \ 46 | dialogconvertprocess.h \ 47 | dialogcreatemodule.h \ 48 | dialogcreatemoduleprocess.h \ 49 | dialoggetfilefromserverprocess.h \ 50 | dialoginfomodule.h \ 51 | dialoginstallmodule.h \ 52 | dialoginstallmoduleprocess.h \ 53 | dialogoptions.h \ 54 | dialogremovemodule.h \ 55 | dialogremovemoduleprocess.h \ 56 | dialogupdategitprocess.h \ 57 | guimainwindow.h \ 58 | plugininfowidget.h 59 | 60 | FORMS += \ 61 | dialogabout.ui \ 62 | dialogconvertprocess.ui \ 63 | dialogcreatemodule.ui \ 64 | dialogcreatemoduleprocess.ui \ 65 | dialoggetfilefromserverprocess.ui \ 66 | dialoginfomodule.ui \ 67 | dialoginstallmodule.ui \ 68 | dialoginstallmoduleprocess.ui \ 69 | dialogoptions.ui \ 70 | dialogremovemodule.ui \ 71 | dialogremovemoduleprocess.ui \ 72 | dialogupdategitprocess.ui \ 73 | guimainwindow.ui \ 74 | plugininfowidget.ui 75 | 76 | !contains(XCONFIG, xarchive) { 77 | XCONFIG += xarchive 78 | include(../XArchive/xarchive.pri) 79 | } 80 | 81 | !contains(XCONFIG, xgithub) { 82 | XCONFIG += xgithub 83 | include(../XGithub/xgithub.pri) 84 | } 85 | 86 | !contains(XCONFIG, xoptions) { 87 | XCONFIG += xoptions 88 | include(../XOptions/xoptions.pri) 89 | } 90 | 91 | !contains(XCONFIG, xaboutwidget) { 92 | XCONFIG += xaboutwidget 93 | include(../XAboutWidget/xaboutwidget.pri) 94 | } 95 | 96 | win32 { 97 | RC_ICONS = ../icons/main.ico 98 | } 99 | 100 | RESOURCES += \ 101 | resources.qrc 102 | -------------------------------------------------------------------------------- /gui_source/dialogoptions.cpp: -------------------------------------------------------------------------------- 1 | // Copyright (c) 2019-2023 hors 2 | // 3 | // Permission is hereby granted, free of charge, to any person obtaining a copy 4 | // of this software and associated documentation files (the "Software"), to deal 5 | // in the Software without restriction, including without limitation the rights 6 | // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 7 | // copies of the Software, and to permit persons to whom the Software is 8 | // furnished to do so, subject to the following conditions: 9 | 10 | // The above copyright notice and this permission notice shall be included in all 11 | // copies or substantial portions of the Software. 12 | 13 | // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 14 | // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 15 | // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 16 | // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 17 | // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 18 | // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 19 | // SOFTWARE. 20 | // 21 | #include "dialogoptions.h" 22 | 23 | #include "ui_dialogoptions.h" 24 | 25 | DialogOptions::DialogOptions(QWidget *pParent, XOptions *pOptions) : QDialog(pParent), ui(new Ui::DialogOptions) 26 | { 27 | ui->setupUi(this); 28 | 29 | this->pOptions = pOptions; 30 | 31 | pOptions->setCheckBox(ui->checkBoxStayOnTop, XOptions::ID_VIEW_STAYONTOP); 32 | pOptions->setLineEdit(ui->lineEditRootPath, XOptions::ID_ROOTPATH); 33 | pOptions->setLineEdit(ui->lineEditDataPath, XOptions::ID_DATAPATH); 34 | pOptions->setLineEdit(ui->lineEditJSONLink, XOptions::ID_JSON); 35 | } 36 | 37 | DialogOptions::~DialogOptions() 38 | { 39 | delete ui; 40 | } 41 | 42 | void DialogOptions::on_pushButtonOK_clicked() 43 | { 44 | pOptions->getCheckBox(ui->checkBoxStayOnTop, XOptions::ID_VIEW_STAYONTOP); 45 | pOptions->getLineEdit(ui->lineEditRootPath, XOptions::ID_ROOTPATH); 46 | pOptions->getLineEdit(ui->lineEditDataPath, XOptions::ID_DATAPATH); 47 | pOptions->getLineEdit(ui->lineEditJSONLink, XOptions::ID_JSON); 48 | 49 | this->close(); 50 | } 51 | 52 | void DialogOptions::on_pushButtonCancel_clicked() 53 | { 54 | this->close(); 55 | } 56 | 57 | void DialogOptions::on_toolButtonRootPath_clicked() 58 | { 59 | QString sDirectoryName = QFileDialog::getExistingDirectory(this, tr("Select root directory"), XBinary::convertPathName(ui->lineEditRootPath->text())); 60 | 61 | if (sDirectoryName != "") { 62 | ui->lineEditRootPath->setText(sDirectoryName); 63 | } 64 | } 65 | 66 | void DialogOptions::on_toolButtonDataPath_clicked() 67 | { 68 | QString sDirectoryName = QFileDialog::getExistingDirectory(this, tr("Select data directory"), XBinary::convertPathName(ui->lineEditDataPath->text())); 69 | 70 | if (sDirectoryName != "") { 71 | ui->lineEditDataPath->setText(sDirectoryName); 72 | } 73 | } 74 | -------------------------------------------------------------------------------- /gui_source/dialoginstallmoduleprocess.ui: -------------------------------------------------------------------------------- 1 | 2 | 3 | DialogInstallModuleProcess 4 | 5 | 6 | 7 | 0 8 | 0 9 | 444 10 | 161 11 | 12 | 13 | 14 | Install 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | Qt::AlignCenter 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | Qt::AlignCenter 34 | 35 | 36 | 37 | 38 | 39 | 40 | 0 41 | 42 | 43 | 0 44 | 45 | 46 | Qt::AlignCenter 47 | 48 | 49 | 50 | 51 | 52 | 53 | 0 54 | 55 | 56 | 0 57 | 58 | 59 | Qt::AlignCenter 60 | 61 | 62 | 63 | 64 | 65 | 66 | Qt::Vertical 67 | 68 | 69 | 70 | 20 71 | 6 72 | 73 | 74 | 75 | 76 | 77 | 78 | 79 | 80 | 81 | Qt::Horizontal 82 | 83 | 84 | 85 | 40 86 | 20 87 | 88 | 89 | 90 | 91 | 92 | 93 | 94 | Cancel 95 | 96 | 97 | 98 | 99 | 100 | 101 | 102 | 103 | 104 | 105 | -------------------------------------------------------------------------------- /gui_source/dialogremovemoduleprocess.ui: -------------------------------------------------------------------------------- 1 | 2 | 3 | DialogRemoveModuleProcess 4 | 5 | 6 | 7 | 0 8 | 0 9 | 444 10 | 149 11 | 12 | 13 | 14 | Remove Module 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | Qt::AlignCenter 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | Qt::AlignCenter 34 | 35 | 36 | 37 | 38 | 39 | 40 | 0 41 | 42 | 43 | 0 44 | 45 | 46 | Qt::AlignCenter 47 | 48 | 49 | 50 | 51 | 52 | 53 | 0 54 | 55 | 56 | 0 57 | 58 | 59 | Qt::AlignCenter 60 | 61 | 62 | 63 | 64 | 65 | 66 | Qt::Vertical 67 | 68 | 69 | 70 | 20 71 | 44 72 | 73 | 74 | 75 | 76 | 77 | 78 | 79 | 80 | 81 | Qt::Horizontal 82 | 83 | 84 | 85 | 40 86 | 20 87 | 88 | 89 | 90 | 91 | 92 | 93 | 94 | Cancel 95 | 96 | 97 | 98 | 99 | 100 | 101 | 102 | 103 | 104 | 105 | -------------------------------------------------------------------------------- /gui_source/dialogupdategitprocess.cpp: -------------------------------------------------------------------------------- 1 | // Copyright (c) 2019-2023 hors 2 | // 3 | // Permission is hereby granted, free of charge, to any person obtaining a copy 4 | // of this software and associated documentation files (the "Software"), to deal 5 | // in the Software without restriction, including without limitation the rights 6 | // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 7 | // copies of the Software, and to permit persons to whom the Software is 8 | // furnished to do so, subject to the following conditions: 9 | 10 | // The above copyright notice and this permission notice shall be included in all 11 | // copies or substantial portions of the Software. 12 | 13 | // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 14 | // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 15 | // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 16 | // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 17 | // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 18 | // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 19 | // SOFTWARE. 20 | // 21 | #include "dialogupdategitprocess.h" 22 | 23 | #include "ui_dialogupdategitprocess.h" 24 | 25 | DialogUpdateGitProcess::DialogUpdateGitProcess(QWidget *pParent, QString sServerListFileName, QString sServerLastestListFileName, bool bInit) 26 | : QDialog(pParent), ui(new Ui::DialogUpdateGitProcess) 27 | { 28 | ui->setupUi(this); 29 | 30 | this->sServerLastestListFileName = sServerLastestListFileName; 31 | 32 | pUpdateGitProcess = new UpdateGitProcess; 33 | pThread = new QThread; 34 | 35 | pUpdateGitProcess->moveToThread(pThread); 36 | 37 | connect(pThread, SIGNAL(started()), pUpdateGitProcess, SLOT(process())); 38 | connect(pUpdateGitProcess, SIGNAL(completed(qint64)), this, SLOT(onCompleted(qint64))); 39 | connect(pUpdateGitProcess, SIGNAL(errorMessage(QString)), this, SIGNAL(errorMessage(QString))); 40 | 41 | pTimer = new QTimer(this); 42 | connect(pTimer, SIGNAL(timeout()), this, SLOT(timerSlot())); 43 | 44 | pUpdateGitProcess->setData(sServerListFileName, sServerLastestListFileName, bInit); 45 | 46 | bIsRun = true; 47 | 48 | ui->progressBar->setMaximum(100); 49 | ui->progressBar->setValue(0); 50 | 51 | pThread->start(); 52 | pTimer->start(100); // 0.1 sec 53 | } 54 | 55 | DialogUpdateGitProcess::~DialogUpdateGitProcess() 56 | { 57 | if (bIsRun) { 58 | pUpdateGitProcess->stop(); 59 | } 60 | 61 | pTimer->stop(); 62 | 63 | pThread->quit(); 64 | pThread->wait(); 65 | 66 | delete ui; 67 | 68 | delete pThread; 69 | delete pUpdateGitProcess; 70 | } 71 | 72 | void DialogUpdateGitProcess::on_pushButtonCancel_clicked() 73 | { 74 | if (bIsRun) { 75 | pUpdateGitProcess->stop(); 76 | pTimer->stop(); 77 | bIsRun = false; 78 | } 79 | } 80 | 81 | void DialogUpdateGitProcess::onCompleted(qint64 nElapsed) 82 | { 83 | Q_UNUSED(nElapsed) 84 | // TODO 85 | bIsRun = false; 86 | this->close(); 87 | } 88 | 89 | void DialogUpdateGitProcess::timerSlot() 90 | { 91 | Utils::STATS stats = pUpdateGitProcess->getCurrentStats(); 92 | 93 | ui->labelInfo->setText(stats.sFile); 94 | 95 | if (stats.nTotalModule) { 96 | ui->progressBar->setValue((int)((stats.nCurrentModule * 100) / stats.nTotalModule)); 97 | } 98 | } 99 | -------------------------------------------------------------------------------- /gui_source/dialogconvertprocess.cpp: -------------------------------------------------------------------------------- 1 | // Copyright (c) 2019-2023 hors 2 | // 3 | // Permission is hereby granted, free of charge, to any person obtaining a copy 4 | // of this software and associated documentation files (the "Software"), to deal 5 | // in the Software without restriction, including without limitation the rights 6 | // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 7 | // copies of the Software, and to permit persons to whom the Software is 8 | // furnished to do so, subject to the following conditions: 9 | 10 | // The above copyright notice and this permission notice shall be included in all 11 | // copies or substantial portions of the Software. 12 | 13 | // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 14 | // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 15 | // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 16 | // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 17 | // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 18 | // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 19 | // SOFTWARE. 20 | // 21 | #include "dialogconvertprocess.h" 22 | 23 | #include "ui_dialogconvertprocess.h" 24 | 25 | DialogConvertProcess::DialogConvertProcess(QWidget *pParent, Utils::MDATA *pMData, QString sDataPath) : QDialog(pParent), ui(new Ui::DialogConvertProcess) 26 | { 27 | ui->setupUi(this); 28 | 29 | this->pMData = pMData; 30 | this->sDataPath = sDataPath; 31 | 32 | pConvertProcess = new ConvertProcess; 33 | pThread = new QThread; 34 | 35 | pConvertProcess->moveToThread(pThread); 36 | 37 | connect(pThread, SIGNAL(started()), pConvertProcess, SLOT(process())); 38 | connect(pConvertProcess, SIGNAL(completed(qint64)), this, SLOT(onCompleted(qint64))); 39 | connect(pConvertProcess, SIGNAL(errorMessage(QString)), this, SIGNAL(errorMessage(QString))); 40 | 41 | pTimer = new QTimer(this); 42 | connect(pTimer, SIGNAL(timeout()), this, SLOT(timerSlot())); 43 | 44 | g_pdStructEmpty = XBinary::createPdStruct(); 45 | 46 | pConvertProcess->setData(pMData, sDataPath, &g_pdStructEmpty); 47 | 48 | bIsRun = true; 49 | 50 | ui->progressBar->setMaximum(100); 51 | ui->progressBar->setValue(0); 52 | 53 | pThread->start(); 54 | pTimer->start(100); // 0.1 sec 55 | } 56 | 57 | DialogConvertProcess::~DialogConvertProcess() 58 | { 59 | if (bIsRun) { 60 | pConvertProcess->stop(); 61 | } 62 | 63 | pTimer->stop(); 64 | 65 | pThread->quit(); 66 | pThread->wait(); 67 | 68 | delete ui; 69 | 70 | delete pThread; 71 | delete pConvertProcess; 72 | } 73 | 74 | void DialogConvertProcess::on_pushButtonCancel_clicked() 75 | { 76 | if (bIsRun) { 77 | pConvertProcess->stop(); 78 | pTimer->stop(); 79 | bIsRun = false; 80 | } 81 | } 82 | 83 | void DialogConvertProcess::onCompleted(qint64 nElapsed) 84 | { 85 | Q_UNUSED(nElapsed) 86 | // TODO 87 | bIsRun = false; 88 | this->close(); 89 | } 90 | 91 | void DialogConvertProcess::timerSlot() 92 | { 93 | Utils::STATS stats = pConvertProcess->getCurrentStats(); 94 | 95 | ui->labelInfo->setText(stats.sModule); 96 | 97 | if (stats.nTotalModule) { 98 | ui->progressBar->setValue((int)((stats.nCurrentModule * 100) / stats.nTotalModule)); 99 | } 100 | } 101 | -------------------------------------------------------------------------------- /convertprocess.cpp: -------------------------------------------------------------------------------- 1 | // Copyright (c) 2019-2023 hors 2 | // 3 | // Permission is hereby granted, free of charge, to any person obtaining a copy 4 | // of this software and associated documentation files (the "Software"), to deal 5 | // in the Software without restriction, including without limitation the rights 6 | // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 7 | // copies of the Software, and to permit persons to whom the Software is 8 | // furnished to do so, subject to the following conditions: 9 | 10 | // The above copyright notice and this permission notice shall be included in all 11 | // copies or substantial portions of the Software. 12 | 13 | // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 14 | // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 15 | // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 16 | // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 17 | // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 18 | // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 19 | // SOFTWARE. 20 | // 21 | #include "convertprocess.h" 22 | 23 | ConvertProcess::ConvertProcess(QObject *pParent) : QObject(pParent) 24 | { 25 | currentStats = {}; 26 | g_pPdStruct = nullptr; 27 | } 28 | 29 | void ConvertProcess::setData(Utils::MDATA *pMData, QString sDataPath, XBinary::PDSTRUCT *pPdStruct) 30 | { 31 | this->pMData = pMData; 32 | this->sDataPath = XBinary::convertPathName(sDataPath); 33 | this->g_pPdStruct = pPdStruct; 34 | } 35 | 36 | void ConvertProcess::stop() 37 | { 38 | g_pPdStruct->bIsStop = true; 39 | } 40 | 41 | Utils::STATS ConvertProcess::getCurrentStats() 42 | { 43 | return currentStats; 44 | } 45 | 46 | void ConvertProcess::process() 47 | { 48 | QElapsedTimer elapsedTimer; 49 | elapsedTimer.start(); 50 | 51 | QString sGithubZipModulePath = Utils::getConvertModulePath(sDataPath, pMData->sName); 52 | 53 | currentStats.nTotalModule = pMData->listConvertRecords.count(); 54 | 55 | for (int i = 0; (i < currentStats.nTotalModule) && (!(g_pPdStruct->bIsStop)); i++) { 56 | Utils::HANDLE_RECORD handleRecord = pMData->listConvertRecords.at(i); 57 | 58 | QString sFileName = Utils::getConvertDownloadFileName(sDataPath, pMData->sName, handleRecord.sPattern); 59 | QString sPath = sGithubZipModulePath + QDir::separator() + handleRecord.sPath; 60 | 61 | XZip zip; 62 | 63 | // TODO errors 64 | if (handleRecord.action == Utils::ACTION_MAKEDIRECTORY) { 65 | XBinary::createDirectory(sPath); 66 | } else if (handleRecord.action == Utils::ACTION_COPYFILE) { 67 | if (sFileName != "") { 68 | XBinary::createDirectory(QFileInfo(sPath).absolutePath()); 69 | XBinary::copyFile(sFileName, sPath); 70 | } 71 | // TODO errors 72 | } else if (handleRecord.action == Utils::ACTION_UNPACKFILE) { 73 | if (sFileName != "") { 74 | zip.decompressToFile(sFileName, handleRecord.sSrc, sPath, g_pPdStruct); 75 | } 76 | // TODO errors 77 | } else if (handleRecord.action == Utils::ACTION_UNPACKDIRECTORY) { 78 | if (sFileName != "") { 79 | zip.decompressToPath(sFileName, handleRecord.sSrc, sPath, g_pPdStruct); 80 | } 81 | // TODO errors 82 | } 83 | 84 | currentStats.nCurrentModule = i; 85 | } 86 | 87 | emit completed(elapsedTimer.elapsed()); 88 | } 89 | -------------------------------------------------------------------------------- /gui_source/dialogcreatemoduleprocess.cpp: -------------------------------------------------------------------------------- 1 | // Copyright (c) 2019-2023 hors 2 | // 3 | // Permission is hereby granted, free of charge, to any person obtaining a copy 4 | // of this software and associated documentation files (the "Software"), to deal 5 | // in the Software without restriction, including without limitation the rights 6 | // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 7 | // copies of the Software, and to permit persons to whom the Software is 8 | // furnished to do so, subject to the following conditions: 9 | 10 | // The above copyright notice and this permission notice shall be included in all 11 | // copies or substantial portions of the Software. 12 | 13 | // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 14 | // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 15 | // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 16 | // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 17 | // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 18 | // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 19 | // SOFTWARE. 20 | // 21 | #include "dialogcreatemoduleprocess.h" 22 | 23 | #include "ui_dialogcreatemoduleprocess.h" 24 | 25 | DialogCreateModuleProcess::DialogCreateModuleProcess(QWidget *pParent, Utils::MDATA *pMData, bool bCreateInfoFile) 26 | : QDialog(pParent), ui(new Ui::DialogCreateModuleProcess) 27 | { 28 | ui->setupUi(this); 29 | 30 | this->pMData = pMData; 31 | 32 | pCreateModuleProcess = new CreateModuleProcess; 33 | pThread = new QThread; 34 | 35 | pCreateModuleProcess->moveToThread(pThread); 36 | 37 | connect(pThread, SIGNAL(started()), pCreateModuleProcess, SLOT(process())); 38 | connect(pCreateModuleProcess, SIGNAL(completed(qint64)), this, SLOT(onCompleted(qint64))); 39 | connect(pCreateModuleProcess, SIGNAL(errorMessage(QString)), this, SIGNAL(errorMessage(QString))); 40 | 41 | pTimer = new QTimer(this); 42 | connect(pTimer, SIGNAL(timeout()), this, SLOT(timerSlot())); 43 | 44 | g_pdStructEmpty = XBinary::createPdStruct(); 45 | 46 | pCreateModuleProcess->setData(pMData, bCreateInfoFile, &g_pdStructEmpty); 47 | 48 | bIsRun = true; 49 | 50 | ui->progressBar->setMaximum(100); 51 | ui->progressBar->setValue(0); 52 | 53 | pThread->start(); 54 | pTimer->start(1000); // 1 sec 55 | } 56 | 57 | DialogCreateModuleProcess::~DialogCreateModuleProcess() 58 | { 59 | if (bIsRun) { 60 | pCreateModuleProcess->stop(); 61 | } 62 | 63 | pTimer->stop(); 64 | 65 | pThread->quit(); 66 | pThread->wait(); 67 | 68 | delete ui; 69 | 70 | delete pThread; 71 | delete pCreateModuleProcess; 72 | } 73 | 74 | void DialogCreateModuleProcess::on_pushButtonCancel_clicked() 75 | { 76 | if (bIsRun) { 77 | pCreateModuleProcess->stop(); 78 | pTimer->stop(); 79 | bIsRun = false; 80 | } 81 | } 82 | 83 | void DialogCreateModuleProcess::onCompleted(qint64 nElapsed) 84 | { 85 | Q_UNUSED(nElapsed) 86 | // TODO 87 | bIsRun = false; 88 | this->close(); 89 | } 90 | 91 | void DialogCreateModuleProcess::timerSlot() 92 | { 93 | Utils::STATS stats = pCreateModuleProcess->getCurrentStats(); 94 | 95 | ui->labelInfo->setText(stats.sFile); 96 | 97 | if (stats.nTotalFile) { 98 | ui->progressBar->setValue((int)((stats.nCurrentFile * 100) / stats.nTotalFile)); 99 | } 100 | } 101 | -------------------------------------------------------------------------------- /gui_source/dialoggetfilefromserverprocess.cpp: -------------------------------------------------------------------------------- 1 | // Copyright (c) 2019-2023 hors 2 | // 3 | // Permission is hereby granted, free of charge, to any person obtaining a copy 4 | // of this software and associated documentation files (the "Software"), to deal 5 | // in the Software without restriction, including without limitation the rights 6 | // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 7 | // copies of the Software, and to permit persons to whom the Software is 8 | // furnished to do so, subject to the following conditions: 9 | 10 | // The above copyright notice and this permission notice shall be included in all 11 | // copies or substantial portions of the Software. 12 | 13 | // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 14 | // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 15 | // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 16 | // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 17 | // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 18 | // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 19 | // SOFTWARE. 20 | // 21 | #include "dialoggetfilefromserverprocess.h" 22 | 23 | #include "ui_dialoggetfilefromserverprocess.h" 24 | 25 | DialogGetFileFromServerProcess::DialogGetFileFromServerProcess(QWidget *pParent, QList listWebRecords) 26 | : QDialog(pParent), ui(new Ui::DialogGetFileFromServerProcess) 27 | { 28 | ui->setupUi(this); 29 | 30 | pGetFileFromServerProcess = new GetFileFromServerProcess; 31 | pThread = new QThread; 32 | 33 | pGetFileFromServerProcess->moveToThread(pThread); 34 | 35 | connect(pThread, SIGNAL(started()), pGetFileFromServerProcess, SLOT(process())); 36 | connect(pGetFileFromServerProcess, SIGNAL(completed(qint64)), this, SLOT(onCompleted(qint64))); 37 | connect(pGetFileFromServerProcess, SIGNAL(errorMessage(QString)), this, SIGNAL(errorMessage(QString))); 38 | 39 | bIsRun = false; 40 | 41 | pGetFileFromServerProcess->setData(listWebRecords); 42 | 43 | bIsRun = true; 44 | 45 | pThread->start(); 46 | 47 | pTimer = new QTimer(this); 48 | connect(pTimer, SIGNAL(timeout()), this, SLOT(timerSlot())); 49 | 50 | ui->progressBarModule->setMaximum(100); 51 | ui->progressBarModule->setValue(0); 52 | 53 | ui->progressBarBytes->setMaximum(100); 54 | ui->progressBarBytes->setValue(0); 55 | 56 | pTimer->start(100); // 0.1 sec 57 | } 58 | 59 | DialogGetFileFromServerProcess::~DialogGetFileFromServerProcess() 60 | { 61 | if (bIsRun) { 62 | pGetFileFromServerProcess->stop(); 63 | } 64 | 65 | pTimer->stop(); 66 | 67 | pThread->quit(); 68 | pThread->wait(); 69 | 70 | delete ui; 71 | 72 | delete pThread; 73 | delete pGetFileFromServerProcess; 74 | } 75 | 76 | void DialogGetFileFromServerProcess::on_pushButtonCancel_clicked() 77 | { 78 | if (bIsRun) { 79 | pGetFileFromServerProcess->stop(); 80 | pTimer->stop(); 81 | bIsRun = false; 82 | } 83 | } 84 | 85 | void DialogGetFileFromServerProcess::onCompleted(qint64 nElapsed) 86 | { 87 | Q_UNUSED(nElapsed) 88 | // TODO 89 | bIsRun = false; 90 | this->close(); 91 | } 92 | 93 | void DialogGetFileFromServerProcess::timerSlot() 94 | { 95 | Utils::STATS stats = pGetFileFromServerProcess->getCurrentStats(); 96 | 97 | ui->labelInfoModule->setText(stats.sModule); 98 | 99 | if (stats.nTotalModule) { 100 | ui->progressBarModule->setValue((int)((stats.nCurrentModule * 100) / stats.nTotalModule)); 101 | } 102 | 103 | if (stats.nTotalBytes) { 104 | ui->progressBarBytes->setValue((int)((stats.nCurrentBytes * 100) / stats.nTotalBytes)); 105 | } 106 | } 107 | -------------------------------------------------------------------------------- /gui_source/dialoginstallmodule.ui: -------------------------------------------------------------------------------- 1 | 2 | 3 | DialogInstallModule 4 | 5 | 6 | Qt::ApplicationModal 7 | 8 | 9 | 10 | 0 11 | 0 12 | 502 13 | 461 14 | 15 | 16 | 17 | Install 18 | 19 | 20 | true 21 | 22 | 23 | 24 | 25 | 26 | 27 | 0 28 | 0 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | Files 37 | 38 | 39 | 40 | 1 41 | 42 | 43 | 1 44 | 45 | 46 | 1 47 | 48 | 49 | 1 50 | 51 | 52 | 53 | 54 | QAbstractItemView::NoEditTriggers 55 | 56 | 57 | QAbstractItemView::SelectRows 58 | 59 | 60 | false 61 | 62 | 63 | true 64 | 65 | 66 | false 67 | 68 | 69 | 20 70 | 71 | 72 | 20 73 | 74 | 75 | 76 | 77 | 78 | 79 | 80 | 81 | 82 | 83 | 84 | Qt::Horizontal 85 | 86 | 87 | 88 | 40 89 | 20 90 | 91 | 92 | 93 | 94 | 95 | 96 | 97 | Cancel 98 | 99 | 100 | 101 | 102 | 103 | 104 | OK 105 | 106 | 107 | 108 | 109 | 110 | 111 | 112 | 113 | 114 | PluginInfoWidget 115 | QWidget 116 |
plugininfowidget.h
117 | 1 118 |
119 |
120 | 121 | 122 |
123 | -------------------------------------------------------------------------------- /gui_source/dialogremovemoduleprocess.cpp: -------------------------------------------------------------------------------- 1 | // Copyright (c) 2019-2023 hors 2 | // 3 | // Permission is hereby granted, free of charge, to any person obtaining a copy 4 | // of this software and associated documentation files (the "Software"), to deal 5 | // in the Software without restriction, including without limitation the rights 6 | // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 7 | // copies of the Software, and to permit persons to whom the Software is 8 | // furnished to do so, subject to the following conditions: 9 | 10 | // The above copyright notice and this permission notice shall be included in all 11 | // copies or substantial portions of the Software. 12 | 13 | // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 14 | // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 15 | // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 16 | // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 17 | // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 18 | // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 19 | // SOFTWARE. 20 | // 21 | #include "dialogremovemoduleprocess.h" 22 | 23 | #include "ui_dialogremovemoduleprocess.h" 24 | 25 | DialogRemoveModuleProcess::DialogRemoveModuleProcess(QWidget *pParent, QString sDataPath, QString sRootPath, QList listModuleNames) 26 | : QDialog(pParent), ui(new Ui::DialogRemoveModuleProcess) 27 | { 28 | ui->setupUi(this); 29 | 30 | this->sDataPath = sDataPath; 31 | this->sRootPath = sRootPath; 32 | this->listModuleNames = listModuleNames; 33 | 34 | pRemoveModuleProcess = new RemoveModuleProcess; 35 | pThread = new QThread; 36 | 37 | pRemoveModuleProcess->moveToThread(pThread); 38 | 39 | connect(pThread, SIGNAL(started()), pRemoveModuleProcess, SLOT(process())); 40 | connect(pRemoveModuleProcess, SIGNAL(completed(qint64)), this, SLOT(onCompleted(qint64))); 41 | connect(pRemoveModuleProcess, SIGNAL(errorMessage(QString)), this, SIGNAL(errorMessage(QString))); 42 | 43 | pTimer = new QTimer(this); 44 | connect(pTimer, SIGNAL(timeout()), this, SLOT(timerSlot())); 45 | 46 | pRemoveModuleProcess->setData(sDataPath, sRootPath, listModuleNames); 47 | 48 | bIsRun = true; 49 | 50 | ui->progressBarFile->setMaximum(100); 51 | ui->progressBarFile->setValue(0); 52 | 53 | ui->progressBarModule->setMaximum(100); 54 | ui->progressBarModule->setValue(0); 55 | 56 | pThread->start(); 57 | pTimer->start(1000); // 1 sec 58 | } 59 | 60 | DialogRemoveModuleProcess::~DialogRemoveModuleProcess() 61 | { 62 | if (bIsRun) { 63 | pRemoveModuleProcess->stop(); 64 | } 65 | 66 | pTimer->stop(); 67 | 68 | pThread->quit(); 69 | pThread->wait(); 70 | 71 | delete ui; 72 | 73 | delete pThread; 74 | delete pRemoveModuleProcess; 75 | } 76 | 77 | void DialogRemoveModuleProcess::on_pushButtonCancel_clicked() 78 | { 79 | if (bIsRun) { 80 | pRemoveModuleProcess->stop(); 81 | pTimer->stop(); 82 | bIsRun = false; 83 | } 84 | } 85 | 86 | void DialogRemoveModuleProcess::onCompleted(qint64 nElapsed) 87 | { 88 | Q_UNUSED(nElapsed) 89 | // TODO 90 | bIsRun = false; 91 | this->close(); 92 | } 93 | 94 | void DialogRemoveModuleProcess::timerSlot() 95 | { 96 | Utils::STATS stats = pRemoveModuleProcess->getCurrentStats(); 97 | 98 | ui->labelInfoFile->setText(stats.sFile); 99 | 100 | if (stats.nTotalFile) { 101 | ui->progressBarFile->setValue((int)((stats.nCurrentFile * 100) / stats.nTotalFile)); 102 | } 103 | 104 | ui->labelInfoModule->setText(stats.sModule); 105 | 106 | if (stats.nTotalModule) { 107 | ui->progressBarModule->setValue((int)((stats.nCurrentModule * 100) / stats.nTotalModule)); 108 | } 109 | } 110 | -------------------------------------------------------------------------------- /gui_source/dialoginstallmoduleprocess.cpp: -------------------------------------------------------------------------------- 1 | // Copyright (c) 2019-2023 hors 2 | // 3 | // Permission is hereby granted, free of charge, to any person obtaining a copy 4 | // of this software and associated documentation files (the "Software"), to deal 5 | // in the Software without restriction, including without limitation the rights 6 | // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 7 | // copies of the Software, and to permit persons to whom the Software is 8 | // furnished to do so, subject to the following conditions: 9 | 10 | // The above copyright notice and this permission notice shall be included in all 11 | // copies or substantial portions of the Software. 12 | 13 | // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 14 | // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 15 | // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 16 | // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 17 | // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 18 | // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 19 | // SOFTWARE. 20 | // 21 | #include "dialoginstallmoduleprocess.h" 22 | 23 | #include "ui_dialoginstallmoduleprocess.h" 24 | 25 | DialogInstallModuleProcess::DialogInstallModuleProcess(QWidget *pParent, QString sDataPath, QString sRootPath, QList listModuleFileNames) 26 | : QDialog(pParent), ui(new Ui::DialogInstallModuleProcess) 27 | { 28 | ui->setupUi(this); 29 | 30 | this->sDataPath = sDataPath; 31 | this->sRootPath = sRootPath; 32 | this->listModuleFileNames = listModuleFileNames; 33 | 34 | pInstallModuleProcess = new InstallModuleProcess; 35 | pThread = new QThread; 36 | 37 | pInstallModuleProcess->moveToThread(pThread); 38 | 39 | connect(pThread, SIGNAL(started()), pInstallModuleProcess, SLOT(process())); 40 | connect(pInstallModuleProcess, SIGNAL(completed(qint64)), this, SLOT(onCompleted(qint64))); 41 | connect(pInstallModuleProcess, SIGNAL(errorMessage(QString)), this, SIGNAL(errorMessage(QString))); 42 | 43 | pTimer = new QTimer(this); 44 | connect(pTimer, SIGNAL(timeout()), this, SLOT(timerSlot())); 45 | 46 | g_pdStructEmpty = XBinary::createPdStruct(); 47 | 48 | pInstallModuleProcess->setData(sDataPath, sRootPath, listModuleFileNames, &g_pdStructEmpty); 49 | 50 | bIsRun = true; 51 | 52 | ui->progressBarFile->setMaximum(100); 53 | ui->progressBarFile->setValue(0); 54 | 55 | ui->progressBarModule->setMaximum(100); 56 | ui->progressBarModule->setValue(0); 57 | 58 | pThread->start(); 59 | pTimer->start(1000); // 1 sec 60 | } 61 | 62 | DialogInstallModuleProcess::~DialogInstallModuleProcess() 63 | { 64 | if (bIsRun) { 65 | pInstallModuleProcess->stop(); 66 | } 67 | 68 | pTimer->stop(); 69 | 70 | pThread->quit(); 71 | pThread->wait(); 72 | 73 | delete ui; 74 | 75 | delete pThread; 76 | delete pInstallModuleProcess; 77 | } 78 | 79 | void DialogInstallModuleProcess::on_pushButtonCancel_clicked() 80 | { 81 | if (bIsRun) { 82 | pInstallModuleProcess->stop(); 83 | pTimer->stop(); 84 | bIsRun = false; 85 | } 86 | } 87 | 88 | void DialogInstallModuleProcess::onCompleted(qint64 nElapsed) 89 | { 90 | Q_UNUSED(nElapsed) 91 | // TODO 92 | bIsRun = false; 93 | this->close(); 94 | } 95 | 96 | void DialogInstallModuleProcess::timerSlot() 97 | { 98 | Utils::STATS stats = pInstallModuleProcess->getCurrentStats(); 99 | 100 | ui->labelInfoFile->setText(stats.sFile); 101 | 102 | if (stats.nTotalFile) { 103 | ui->progressBarFile->setValue((int)((stats.nCurrentFile * 100) / stats.nTotalFile)); 104 | } 105 | 106 | ui->labelInfoModule->setText(stats.sModule); 107 | 108 | if (stats.nTotalModule) { 109 | ui->progressBarModule->setValue((int)((stats.nCurrentModule * 100) / stats.nTotalModule)); 110 | } 111 | } 112 | -------------------------------------------------------------------------------- /gui_source/guimainwindow.h: -------------------------------------------------------------------------------- 1 | // Copyright (c) 2019-2023 hors 2 | // 3 | // Permission is hereby granted, free of charge, to any person obtaining a copy 4 | // of this software and associated documentation files (the "Software"), to deal 5 | // in the Software without restriction, including without limitation the rights 6 | // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 7 | // copies of the Software, and to permit persons to whom the Software is 8 | // furnished to do so, subject to the following conditions: 9 | 10 | // The above copyright notice and this permission notice shall be included in all 11 | // copies or substantial portions of the Software. 12 | 13 | // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 14 | // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 15 | // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 16 | // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 17 | // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 18 | // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 19 | // SOFTWARE. 20 | // 21 | #ifndef GUIMAINWINDOW_H 22 | #define GUIMAINWINDOW_H 23 | 24 | #include 25 | #include 26 | #include 27 | #include 28 | #include 29 | #include 30 | #include 31 | #include 32 | 33 | #include "../global.h" 34 | #include "dialogabout.h" 35 | #include "dialogcreatemodule.h" 36 | #include "dialoggetfilefromserverprocess.h" 37 | #include "dialoginfomodule.h" 38 | #include "dialoginstallmodule.h" 39 | #include "dialogoptions.h" 40 | #include "dialogremovemodule.h" 41 | #include "dialogupdategitprocess.h" 42 | 43 | QT_BEGIN_NAMESPACE 44 | namespace Ui { 45 | class GuiMainWindow; 46 | } 47 | QT_END_NAMESPACE 48 | 49 | class GuiMainWindow : public QMainWindow { 50 | Q_OBJECT 51 | 52 | enum CN { 53 | CN_NAME = 0, 54 | CN_INFO, 55 | CN_32, 56 | CN_64, 57 | CN_VERSION, 58 | CN_DATE, 59 | CN_INSTALL, 60 | CN_REMOVE, 61 | CN_size 62 | }; 63 | 64 | public: 65 | GuiMainWindow(QWidget *pParent = nullptr); 66 | ~GuiMainWindow(); 67 | 68 | private: 69 | void adjustTable(QTableWidget *pTableWidget); 70 | void fillTable(QTableWidget *pTableWidget, QList *pMData, QMap *pMapStatus); 71 | 72 | private slots: 73 | void createPlugin(); 74 | void aboutDialog(); 75 | void openPlugin(); 76 | void optionsDialog(); 77 | void exitProgram(); 78 | void errorMessage(QString sMessage); 79 | void getModules(); 80 | void openPlugin(QString sFileName); 81 | void updateJsonList(bool bInit); 82 | void installButtonSlot(); 83 | void removeButtonSlot(); 84 | void installPlugin(QString sName); 85 | void installPlugins(QList *pListNames); 86 | void removePlugin(QString sName); 87 | void infoPlugin(Utils::MDATA *pMData); 88 | void on_tableWidgetServerList_customContextMenuRequested(const QPoint &pos); 89 | void on_tableWidgetInstalled_customContextMenuRequested(const QPoint &pos); 90 | void _infoPluginServerList(); 91 | void _installPluginServerList(); 92 | void _removePluginServerList(); 93 | void _infoPluginInstalled(); 94 | void _installPluginInstalled(); 95 | void _removePluginInstalled(); 96 | void updateServerList(); 97 | void updateAllInstalledPlugins(); 98 | void on_pushButtonUpdateServerList_clicked(); 99 | void on_pushButtonUpdateAllInstalledPlugins_clicked(); 100 | void on_actionExit_triggered(); 101 | void on_actionAbout_triggered(); 102 | void on_actionOpen_triggered(); 103 | void on_actionCreate_triggered(); 104 | void on_actionOptions_triggered(); 105 | void on_actionUpdate_server_list_triggered(); 106 | void on_actionUpdate_all_installed_plugins_triggered(); 107 | 108 | protected: 109 | void dragEnterEvent(QDragEnterEvent *pEvent) override; 110 | void dragMoveEvent(QDragMoveEvent *pEvent) override; 111 | void dropEvent(QDropEvent *pEvent) override; 112 | 113 | private: 114 | Ui::GuiMainWindow *ui; 115 | XOptions xOptions; 116 | Utils::MODULES_DATA modulesData; 117 | }; 118 | #endif // GUIMAINWINDOW_H 119 | -------------------------------------------------------------------------------- /gui_source/dialogoptions.ui: -------------------------------------------------------------------------------- 1 | 2 | 3 | DialogOptions 4 | 5 | 6 | Qt::ApplicationModal 7 | 8 | 9 | 10 | 0 11 | 0 12 | 463 13 | 221 14 | 15 | 16 | 17 | Options 18 | 19 | 20 | true 21 | 22 | 23 | 24 | 25 | 26 | Stay on top 27 | 28 | 29 | 30 | 31 | 32 | 33 | Root path 34 | 35 | 36 | 37 | 1 38 | 39 | 40 | 1 41 | 42 | 43 | 1 44 | 45 | 46 | 1 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | ... 55 | 56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 | 64 | Data path 65 | 66 | 67 | 68 | 1 69 | 70 | 71 | 1 72 | 73 | 74 | 1 75 | 76 | 77 | 1 78 | 79 | 80 | 81 | 82 | 83 | 84 | 85 | ... 86 | 87 | 88 | 89 | 90 | 91 | 92 | 93 | 94 | 95 | JSON link 96 | 97 | 98 | 99 | 1 100 | 101 | 102 | 1 103 | 104 | 105 | 1 106 | 107 | 108 | 1 109 | 110 | 111 | 112 | 113 | 114 | 115 | 116 | 117 | 118 | 119 | Qt::Vertical 120 | 121 | 122 | 123 | 20 124 | 119 125 | 126 | 127 | 128 | 129 | 130 | 131 | 132 | 133 | 134 | Qt::Horizontal 135 | 136 | 137 | 138 | 40 139 | 20 140 | 141 | 142 | 143 | 144 | 145 | 146 | 147 | Cancel 148 | 149 | 150 | 151 | 152 | 153 | 154 | OK 155 | 156 | 157 | 158 | 159 | 160 | 161 | 162 | 163 | 164 | 165 | -------------------------------------------------------------------------------- /removemoduleprocess.cpp: -------------------------------------------------------------------------------- 1 | // Copyright (c) 2019-2023 hors 2 | // 3 | // Permission is hereby granted, free of charge, to any person obtaining a copy 4 | // of this software and associated documentation files (the "Software"), to deal 5 | // in the Software without restriction, including without limitation the rights 6 | // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 7 | // copies of the Software, and to permit persons to whom the Software is 8 | // furnished to do so, subject to the following conditions: 9 | 10 | // The above copyright notice and this permission notice shall be included in all 11 | // copies or substantial portions of the Software. 12 | 13 | // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 14 | // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 15 | // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 16 | // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 17 | // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 18 | // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 19 | // SOFTWARE. 20 | // 21 | #include "removemoduleprocess.h" 22 | 23 | RemoveModuleProcess::RemoveModuleProcess(QObject *pParent) : QObject(pParent) 24 | { 25 | bIsStop = false; 26 | currentStats = {}; 27 | } 28 | 29 | void RemoveModuleProcess::setData(QString sDataPath, QString sRootPath, QList listModuleNames) 30 | { 31 | this->sDataPath = XBinary::convertPathName(sDataPath); 32 | this->sRootPath = XBinary::convertPathName(sRootPath); 33 | this->listModuleNames = listModuleNames; 34 | } 35 | 36 | void RemoveModuleProcess::stop() 37 | { 38 | bIsStop = true; 39 | } 40 | 41 | Utils::STATS RemoveModuleProcess::getCurrentStats() 42 | { 43 | return currentStats; 44 | } 45 | 46 | void RemoveModuleProcess::process() 47 | { 48 | QElapsedTimer elapsedTimer; 49 | elapsedTimer.start(); 50 | 51 | bIsStop = false; 52 | 53 | currentStats.nTotalModule = listModuleNames.count(); 54 | 55 | for (qint32 i = 0; (i < currentStats.nTotalModule) && (!bIsStop); i++) { 56 | currentStats.sModule = QString("%1: %2").arg(tr("Remove module")).arg(listModuleNames.at(i)); 57 | emit infoMessage(currentStats.sModule); 58 | 59 | QString sFileName = Utils::getInstalledJsonFileName(sDataPath, listModuleNames.at(i)); 60 | 61 | if (XBinary::isFileExists(sFileName)) { 62 | Utils::MDATA mdata = Utils::getMDataFromJSONFile(sFileName); 63 | 64 | currentStats.nTotalFile = mdata.listRemoveRecords.count(); 65 | 66 | for (qint32 j = 0; (j < currentStats.nTotalFile) && (!bIsStop); j++) { 67 | Utils::HANDLE_RECORD record = mdata.listRemoveRecords.at(j); 68 | 69 | if (record.action == Utils::ACTION_REMOVEFILE) { 70 | XBinary::removeFile(sRootPath + QDir::separator() + record.sPath); 71 | 72 | if (!XBinary::isFileExists(sRootPath + QDir::separator() + record.sPath)) { 73 | currentStats.sFile = QString("%1: %2").arg(tr("Remove file")).arg(record.sPath); 74 | emit infoMessage(currentStats.sFile); 75 | } else { 76 | emit errorMessage(tr("%1: %2").arg(tr("Cannot remove file")).arg(sRootPath + QDir::separator() + record.sPath)); 77 | bIsStop = true; 78 | } 79 | } else if (record.action == Utils::ACTION_REMOVEDIRECTORYIFEMPTY) { 80 | if (XBinary::isDirectoryEmpty(sRootPath + QDir::separator() + record.sPath)) { 81 | XBinary::removeDirectory(sRootPath + QDir::separator() + record.sPath); 82 | 83 | if (!XBinary::isDirectoryExists(sRootPath + QDir::separator() + record.sPath)) { 84 | currentStats.sFile = QString("%1: %2").arg(tr("Remove directory")).arg(record.sPath); 85 | emit infoMessage(currentStats.sFile); 86 | } else { 87 | emit errorMessage(tr("%1: %2").arg(tr("Cannot remove directory")).arg(sRootPath + QDir::separator() + record.sPath)); 88 | bIsStop = true; 89 | } 90 | } 91 | } 92 | 93 | currentStats.nCurrentFile = j + 1; 94 | } 95 | 96 | if (!bIsStop) { 97 | XBinary::removeFile(sFileName); 98 | 99 | if (!XBinary::isFileExists(sFileName)) { 100 | emit infoMessage(QString("%1: %2").arg(tr("Remove file")).arg(sFileName)); 101 | } else { 102 | emit errorMessage(tr("%1: %2").arg(tr("Cannot remove file")).arg(sFileName)); 103 | bIsStop = true; 104 | } 105 | } 106 | 107 | if (bIsStop) { 108 | emit errorMessage(tr("Please, close all applications and try again.")); 109 | } 110 | } 111 | 112 | currentStats.nCurrentModule = i + 1; 113 | } 114 | 115 | emit completed(elapsedTimer.elapsed()); 116 | } 117 | -------------------------------------------------------------------------------- /gui_source/dialogabout.cpp: -------------------------------------------------------------------------------- 1 | // Copyright (c) 2019-2023 hors 2 | // 3 | // Permission is hereby granted, free of charge, to any person obtaining a copy 4 | // of this software and associated documentation files (the "Software"), to deal 5 | // in the Software without restriction, including without limitation the rights 6 | // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 7 | // copies of the Software, and to permit persons to whom the Software is 8 | // furnished to do so, subject to the following conditions: 9 | 10 | // The above copyright notice and this permission notice shall be included in all 11 | // copies or substantial portions of the Software. 12 | 13 | // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 14 | // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 15 | // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 16 | // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 17 | // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 18 | // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 19 | // SOFTWARE. 20 | // 21 | #include "dialogabout.h" 22 | 23 | #include "ui_dialogabout.h" 24 | 25 | DialogAbout::DialogAbout(QWidget *pParent) : QDialog(pParent), ui(new Ui::DialogAbout) 26 | { 27 | ui->setupUi(this); 28 | 29 | XAboutWidget::DATA _data = {}; 30 | 31 | _data.sInfo += QString( 32 | "

%1

") 34 | .arg(XOptions::getTitle(X_APPLICATIONDISPLAYNAME, X_APPLICATIONVERSION)); 35 | _data.sInfo += QString( 36 | "

Copyright (C) " 37 | "2019-2023 Hors

"); 38 | _data.sInfo += QString( 39 | "

%1: " 40 | "horsicq@gmail.com

") 43 | .arg(tr("Bugreports")); 44 | _data.sInfo += QString( 45 | "

%1: " 46 | "http://ntinfo.biz

") 49 | .arg(tr("Website")); 50 | _data.sInfo += QString( 51 | "

%1(Paypal): " 52 | "ntinfo.re@gmail.com

") 55 | .arg(tr("Donate")); 56 | _data.sInfo += QString( 57 | "

%1(BTC): " 58 | "3DqddVBX9PKqMvNPXZ3gPHBNNRtD9CnmJo") 62 | .arg(tr("Donate")); 63 | _data.sInfo += QString( 64 | "

%1: " 65 | "https://github.com/horsicq/x64dbg-Plugin-Manager") 69 | .arg(tr("Source code")); 70 | 71 | _data.sLibraries += QString( 72 | "

QT Library " 73 | "%1 http://qt-project.org

") 76 | .arg(QT_VERSION_STR); 77 | 78 | _data.sLogoPath = ":/images/main.png"; 79 | _data.sUpdatesLink = "https://github.com/horsicq/x64dbg-Plugin-Manager/releases"; 80 | _data.sServerVersionLink = "https://raw.githubusercontent.com/horsicq/x64dbg-Plugin-Manager/master/release_version.txt"; 81 | 82 | #ifndef QT_DEBUG 83 | _data.sThanksPath = XOptions().getApplicationDataPath() + QDir::separator() + "images" + QDir::separator() + "thanks"; 84 | #else 85 | QDir dir(XOptions().getApplicationDataPath()); 86 | 87 | dir.cdUp(); 88 | dir.cdUp(); 89 | 90 | _data.sThanksPath = dir.absolutePath() + QDir::separator() + "images" + QDir::separator() + "thanks"; 91 | #endif 92 | 93 | ui->widgetAbout->setData(_data); 94 | } 95 | 96 | DialogAbout::~DialogAbout() 97 | { 98 | delete ui; 99 | } 100 | 101 | void DialogAbout::on_pushButtonOK_clicked() 102 | { 103 | this->close(); 104 | } 105 | -------------------------------------------------------------------------------- /installmoduleprocess.cpp: -------------------------------------------------------------------------------- 1 | // Copyright (c) 2019-2023 hors 2 | // 3 | // Permission is hereby granted, free of charge, to any person obtaining a copy 4 | // of this software and associated documentation files (the "Software"), to deal 5 | // in the Software without restriction, including without limitation the rights 6 | // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 7 | // copies of the Software, and to permit persons to whom the Software is 8 | // furnished to do so, subject to the following conditions: 9 | 10 | // The above copyright notice and this permission notice shall be included in all 11 | // copies or substantial portions of the Software. 12 | 13 | // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 14 | // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 15 | // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 16 | // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 17 | // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 18 | // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 19 | // SOFTWARE. 20 | // 21 | #include "installmoduleprocess.h" 22 | 23 | InstallModuleProcess::InstallModuleProcess(QObject *pParent) : QObject(pParent) 24 | { 25 | currentStats = {}; 26 | g_pPdStruct = nullptr; 27 | } 28 | 29 | void InstallModuleProcess::setData(QString sDataPath, QString sRootPath, QList listModuleFileNames, XBinary::PDSTRUCT *pPdStruct) 30 | { 31 | this->sDataPath = XBinary::convertPathName(sDataPath); 32 | this->sRootPath = XBinary::convertPathName(sRootPath); 33 | this->listModuleFileNames = listModuleFileNames; 34 | this->g_pPdStruct = pPdStruct; 35 | } 36 | 37 | void InstallModuleProcess::stop() 38 | { 39 | g_pPdStruct->bIsStop = true; 40 | } 41 | 42 | Utils::STATS InstallModuleProcess::getCurrentStats() 43 | { 44 | return currentStats; 45 | } 46 | 47 | void InstallModuleProcess::process() 48 | { 49 | QElapsedTimer elapsedTimer; 50 | elapsedTimer.start(); 51 | 52 | currentStats.nTotalModule = listModuleFileNames.count(); 53 | 54 | for (qint32 i = 0; (i < currentStats.nTotalModule) && (!(g_pPdStruct->bIsStop)); i++) { 55 | currentStats.sModule = QString("%1: %2").arg(tr("Install module")).arg(QFileInfo(listModuleFileNames.at(i)).baseName()); 56 | emit infoMessage(currentStats.sModule); 57 | 58 | QFile file; 59 | file.setFileName(listModuleFileNames.at(i)); 60 | 61 | if (file.open(QIODevice::ReadOnly)) { 62 | Utils::MDATA mdata = Utils::getMDataFromZip(&file, XBinary::convertPathName(sRootPath), g_pPdStruct); 63 | 64 | XZip zip(&file); 65 | 66 | QList listZipRecords = zip.getRecords(-1, g_pPdStruct); 67 | 68 | currentStats.nTotalFile = mdata.listInstallRecords.count(); 69 | 70 | for (qint32 j = 0; (j < currentStats.nTotalFile) && (!(g_pPdStruct->bIsStop)); j++) { 71 | Utils::HANDLE_RECORD record = mdata.listInstallRecords.at(j); 72 | 73 | currentStats.sFile = QString("%1: %2").arg(tr("Install file")).arg(sRootPath + QDir::separator() + record.sPath); 74 | emit infoMessage(currentStats.sFile); 75 | 76 | if (record.action == Utils::ACTION_COPYFILE) { 77 | if (XBinary::isFileExists(sRootPath + QDir::separator() + record.sPath)) { 78 | if (!XBinary::removeFile(sRootPath + QDir::separator() + record.sPath)) { 79 | emit errorMessage(QString("%1: %2").arg(tr("Cannot remove file")).arg(sRootPath + QDir::separator() + record.sPath)); 80 | g_pPdStruct->bIsStop = true; 81 | } 82 | } 83 | 84 | XArchive::RECORD archiveRecord = XArchive::getArchiveRecord("files/" + record.sPath, &listZipRecords); 85 | zip.decompressToFile(&archiveRecord, sRootPath + QDir::separator() + record.sPath); 86 | 87 | if (!XBinary::isFileHashValid(XBinary::HASH_SHA1, sRootPath + QDir::separator() + record.sPath, record.sSHA1)) { 88 | emit errorMessage(QString("%1: %2").arg(tr("Invalid file HASH")).arg(sRootPath + QDir::separator() + record.sPath)); 89 | g_pPdStruct->bIsStop = true; 90 | } 91 | } else if (record.action == Utils::ACTION_MAKEDIRECTORY) { 92 | XBinary::createDirectory(sRootPath + QDir::separator() + record.sPath); 93 | } 94 | 95 | currentStats.nCurrentFile = j + 1; 96 | } 97 | 98 | QString sInfoFileName = Utils::getInstalledJsonFileName(sDataPath, mdata.sName); 99 | 100 | if (XBinary::isFileExists(sInfoFileName)) { 101 | if (!XBinary::removeFile(sInfoFileName)) { 102 | emit errorMessage(QString("%1: %2").arg(tr("Cannot remove file")).arg(sInfoFileName)); 103 | g_pPdStruct->bIsStop = true; 104 | } 105 | } 106 | 107 | XArchive::RECORD archiveRecord = XArchive::getArchiveRecord("plugin_info.json", &listZipRecords); 108 | zip.decompressToFile(&archiveRecord, sInfoFileName); 109 | 110 | file.close(); 111 | } 112 | 113 | currentStats.nCurrentModule = i + 1; 114 | } 115 | 116 | emit completed(elapsedTimer.elapsed()); 117 | } 118 | -------------------------------------------------------------------------------- /getfilefromserverprocess.cpp: -------------------------------------------------------------------------------- 1 | // Copyright (c) 2019-2023 hors 2 | // 3 | // Permission is hereby granted, free of charge, to any person obtaining a copy 4 | // of this software and associated documentation files (the "Software"), to deal 5 | // in the Software without restriction, including without limitation the rights 6 | // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 7 | // copies of the Software, and to permit persons to whom the Software is 8 | // furnished to do so, subject to the following conditions: 9 | 10 | // The above copyright notice and this permission notice shall be included in all 11 | // copies or substantial portions of the Software. 12 | 13 | // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 14 | // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 15 | // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 16 | // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 17 | // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 18 | // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 19 | // SOFTWARE. 20 | // 21 | #include "getfilefromserverprocess.h" 22 | 23 | GetFileFromServerProcess::GetFileFromServerProcess(QObject *pParent) : QObject(pParent) 24 | { 25 | pReply = 0; 26 | replyRed = 0; 27 | currentStats = {}; 28 | } 29 | 30 | void GetFileFromServerProcess::setData(QList listWebRecords) 31 | { 32 | this->listWebRecords = listWebRecords; 33 | } 34 | 35 | void GetFileFromServerProcess::stop() 36 | { 37 | bIsStop = true; 38 | 39 | if (pReply) { 40 | pReply->abort(); 41 | } 42 | 43 | if (replyRed) { 44 | replyRed->abort(); 45 | } 46 | } 47 | 48 | Utils::STATS GetFileFromServerProcess::getCurrentStats() 49 | { 50 | return currentStats; 51 | } 52 | 53 | void GetFileFromServerProcess::process() 54 | { 55 | QElapsedTimer elapsedTimer; 56 | elapsedTimer.start(); 57 | 58 | bIsStop = false; 59 | 60 | currentStats.nTotalModule = listWebRecords.count(); 61 | 62 | for (qint32 i = 0; (i < currentStats.nTotalModule) && (!bIsStop); i++) { 63 | currentStats.sModule = listWebRecords.at(i).sLink; 64 | emit infoMessage(currentStats.sModule); 65 | 66 | QNetworkAccessManager nam; 67 | QNetworkRequest *pRequest = new QNetworkRequest(QUrl(listWebRecords.at(i).sLink)); 68 | pReply = nam.get(*pRequest); 69 | QEventLoop loop; 70 | QObject::connect(pReply, SIGNAL(finished()), &loop, SLOT(quit())); 71 | QObject::connect(pReply, SIGNAL(downloadProgress(qint64, qint64)), this, SLOT(_downloadProgress(qint64, qint64))); 72 | loop.exec(); 73 | 74 | if (pReply->error() == QNetworkReply::NoError) { 75 | QString sRedirectUrl = pReply->attribute(QNetworkRequest::RedirectionTargetAttribute).toString(); 76 | 77 | if (pReply->bytesAvailable() || (sRedirectUrl != "")) { 78 | bool bSuccess = false; 79 | QByteArray baData; 80 | 81 | if (sRedirectUrl != "") // Github redirect 82 | { 83 | QNetworkAccessManager namRed; 84 | QNetworkRequest *pRequestRed = new QNetworkRequest(QUrl(sRedirectUrl)); 85 | replyRed = namRed.get(*pRequestRed); 86 | QEventLoop loopRed; 87 | QObject::connect(replyRed, SIGNAL(finished()), &loopRed, SLOT(quit())); 88 | QObject::connect(replyRed, SIGNAL(downloadProgress(qint64, qint64)), this, SLOT(_downloadProgress(qint64, qint64))); 89 | loopRed.exec(); 90 | 91 | if (replyRed->bytesAvailable()) { 92 | baData = replyRed->readAll(); 93 | bSuccess = true; 94 | } 95 | } else { 96 | baData = pReply->readAll(); 97 | bSuccess = true; 98 | } 99 | 100 | if (bSuccess) { 101 | if (XBinary::isFileExists(listWebRecords.at(i).sFileName)) { 102 | if (!XBinary::removeFile(listWebRecords.at(i).sFileName)) { 103 | emit errorMessage(QString("%1: %2").arg(tr("Cannot remove file")).arg(listWebRecords.at(i).sFileName)); 104 | bIsStop = true; 105 | } 106 | } 107 | 108 | if (XBinary::writeToFile(listWebRecords.at(i).sFileName, baData)) { 109 | currentStats.sFile = QString("%1: %2").arg(tr("Write data to file")).arg(listWebRecords.at(i).sFileName); 110 | emit infoMessage(currentStats.sFile); 111 | } else { 112 | emit errorMessage(QString("%1: %2").arg(tr("Cannot write data to file")).arg(listWebRecords.at(i).sFileName)); 113 | } 114 | } 115 | } 116 | } else { 117 | emit errorMessage(pReply->errorString()); 118 | bIsStop = true; 119 | } 120 | 121 | pReply->deleteLater(); 122 | delete pRequest; 123 | 124 | pReply = 0; 125 | 126 | currentStats.nCurrentModule = i; 127 | } 128 | 129 | bIsStop = false; 130 | 131 | emit completed(elapsedTimer.elapsed()); 132 | } 133 | 134 | void GetFileFromServerProcess::_downloadProgress(qint64 bytesReceived, qint64 bytesTotal) 135 | { 136 | currentStats.nTotalBytes = bytesTotal; 137 | currentStats.nCurrentBytes = bytesReceived; 138 | } 139 | -------------------------------------------------------------------------------- /updategitprocess.cpp: -------------------------------------------------------------------------------- 1 | // Copyright (c) 2019-2023 hors 2 | // 3 | // Permission is hereby granted, free of charge, to any person obtaining a copy 4 | // of this software and associated documentation files (the "Software"), to deal 5 | // in the Software without restriction, including without limitation the rights 6 | // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 7 | // copies of the Software, and to permit persons to whom the Software is 8 | // furnished to do so, subject to the following conditions: 9 | 10 | // The above copyright notice and this permission notice shall be included in all 11 | // copies or substantial portions of the Software. 12 | 13 | // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 14 | // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 15 | // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 16 | // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 17 | // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 18 | // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 19 | // SOFTWARE. 20 | // 21 | #include "updategitprocess.h" 22 | 23 | bool _sort_mdata(const Utils::MDATA &mdata1, const Utils::MDATA &mdata2) 24 | { 25 | bool bResult = false; 26 | 27 | if (mdata1.sName == "x64core") { 28 | bResult = true; 29 | } else if (mdata2.sName == "x64core") { 30 | bResult = false; 31 | } else { 32 | bResult = (mdata2.sUpdated > mdata1.sUpdated); 33 | } 34 | 35 | return bResult; 36 | } 37 | 38 | UpdateGitProcess::UpdateGitProcess(QObject *pParent) : QObject(pParent) 39 | { 40 | bIsStop = false; 41 | g_bInit = false; 42 | currentStats = {}; 43 | } 44 | 45 | void UpdateGitProcess::setData(QString sServerListFileName, QString sServerLastestListFileName, bool bInit) 46 | { 47 | this->sServerListFileName = sServerListFileName; 48 | this->sServerLastestListFileName = sServerLastestListFileName; 49 | this->g_bInit = bInit; 50 | } 51 | 52 | void UpdateGitProcess::stop() 53 | { 54 | bIsStop = true; 55 | } 56 | 57 | Utils::STATS UpdateGitProcess::getCurrentStats() 58 | { 59 | return currentStats; 60 | } 61 | 62 | void UpdateGitProcess::process() 63 | { 64 | QElapsedTimer elapsedTimer; 65 | elapsedTimer.start(); 66 | 67 | bIsStop = false; 68 | 69 | QList listMData = Utils::getModulesFromJSONFile(sServerLastestListFileName); 70 | 71 | if (g_bInit) { // The first core only 72 | QList _listMData; 73 | 74 | if (listMData.count()) { 75 | _listMData.append(listMData.at(0)); 76 | 77 | listMData = _listMData; 78 | } 79 | } else { 80 | if (XBinary::isFileExists(sServerListFileName)) { 81 | QList _listMData = Utils::getModulesFromJSONFile(sServerListFileName); 82 | 83 | int nCount = listMData.count(); 84 | 85 | for (int i = 0; i < nCount; i++) { 86 | QString sName = listMData.at(i).sName; 87 | Utils::MDATA mdata = Utils::getMDataByName(&_listMData, sName); 88 | 89 | if (mdata.sUpdated != "") { 90 | listMData[i].sUpdated = mdata.sUpdated; 91 | } 92 | } 93 | } 94 | } 95 | 96 | std::sort(listMData.begin(), listMData.end(), _sort_mdata); 97 | 98 | int nCount = listMData.count(); 99 | 100 | int nNumbersOfGithub = 0; 101 | 102 | for (int i = 0; i < nCount; i++) { 103 | if (listMData.at(i).sGithub != "") { 104 | nNumbersOfGithub++; 105 | } 106 | } 107 | 108 | currentStats.nTotalModule = nNumbersOfGithub; 109 | 110 | for (int i = 0; (i < nCount) && (!bIsStop); i++) { 111 | Utils::MDATA mdata = listMData.at(i); 112 | 113 | if (mdata.sGithub != "") { 114 | #ifdef QT_DEBUG 115 | qDebug("Guthub %s", mdata.sGithub.toLatin1().data()); 116 | #endif 117 | 118 | QString sGithub = mdata.sGithub; 119 | sGithub = sGithub.section("github.com/", 1, 1); 120 | 121 | QString sUserName = sGithub.section("/", 0, 0); 122 | QString sRepoName = sGithub.section("/", 1, 1); 123 | 124 | XGithub github(sUserName, sRepoName); 125 | github.setCredentials(sAuthUser, sAuthToken); 126 | 127 | connect(&github, SIGNAL(errorMessage(QString)), this, SIGNAL(errorMessage(QString))); 128 | 129 | XGithub::RELEASE_HEADER release = github.getLatestRelease(true); 130 | 131 | if (release.bValid) { 132 | mdata.sDate = release.dt.toString("yyyy-MM-dd"); // rewrite 133 | 134 | if (release.sTag != "") { 135 | mdata.sVersion = release.sTag; 136 | } else { 137 | mdata.sVersion = release.sName; 138 | } 139 | 140 | int nNumberOfAsserts = release.listRecords.count(); 141 | 142 | QSet stDownloads; 143 | 144 | for (int j = 0; j < nNumberOfAsserts; j++) { 145 | if (Utils::checkPattern(release.listRecords.at(j).sSrc, &mdata)) { 146 | stDownloads.insert(release.listRecords.at(j).sSrc); 147 | } 148 | } 149 | 150 | QList listStrings = XGithub::getDownloadLinks(release.sBody); 151 | 152 | int nNumberOfLinks = listStrings.count(); 153 | 154 | for (int j = 0; j < nNumberOfLinks; j++) { 155 | if (Utils::checkPattern(listStrings.at(j), &mdata)) { 156 | stDownloads.insert(listStrings.at(j)); 157 | } 158 | } 159 | 160 | mdata.listDownloads = stDownloads.toList(); 161 | 162 | Utils::updateJsonFile(sServerLastestListFileName, QList() << mdata); 163 | } 164 | 165 | if (release.bNetworkError) { 166 | #ifdef QT_DEBUG 167 | qDebug("Broken %s", mdata.sGithub.toLatin1().data()); 168 | #endif 169 | break; 170 | } 171 | } 172 | 173 | currentStats.nCurrentModule = i + 1; 174 | } 175 | 176 | emit completed(elapsedTimer.elapsed()); 177 | } 178 | 179 | void UpdateGitProcess::setCredentials(QString sUser, QString sToken) 180 | { 181 | sAuthUser = sUser; 182 | sAuthToken = sToken; 183 | } 184 | -------------------------------------------------------------------------------- /gui_source/dialoginstallmodule.cpp: -------------------------------------------------------------------------------- 1 | // Copyright (c) 2019-2023 hors 2 | // 3 | // Permission is hereby granted, free of charge, to any person obtaining a copy 4 | // of this software and associated documentation files (the "Software"), to deal 5 | // in the Software without restriction, including without limitation the rights 6 | // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 7 | // copies of the Software, and to permit persons to whom the Software is 8 | // furnished to do so, subject to the following conditions: 9 | 10 | // The above copyright notice and this permission notice shall be included in all 11 | // copies or substantial portions of the Software. 12 | 13 | // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 14 | // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 15 | // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 16 | // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 17 | // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 18 | // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 19 | // SOFTWARE. 20 | // 21 | #include "dialoginstallmodule.h" 22 | 23 | #include "ui_dialoginstallmodule.h" 24 | 25 | DialogInstallModule::DialogInstallModule(QWidget *pParent, QString sDataPath, QString sRootPath) : QDialog(pParent), ui(new Ui::DialogInstallModule) 26 | { 27 | ui->setupUi(this); 28 | 29 | this->pParent = pParent; 30 | this->sDataPath = sDataPath; 31 | this->sRootPath = sRootPath; 32 | } 33 | 34 | DialogInstallModule::~DialogInstallModule() 35 | { 36 | delete ui; 37 | } 38 | 39 | void DialogInstallModule::setFileName(QString sModuleFileName) 40 | { 41 | this->sModuleFileName = sModuleFileName; 42 | 43 | XBinary::PDSTRUCT pdStructEmpty = XBinary::createPdStruct(); 44 | 45 | _mdata = Utils::getMDataFromZip(sModuleFileName, XBinary::convertPathName(sRootPath), &pdStructEmpty); 46 | 47 | ui->widgetInfo->setData(&_mdata); 48 | 49 | int nCount = _mdata.listInstallRecords.count(); 50 | 51 | ui->tableWidgetRecords->setColumnCount(1); 52 | ui->tableWidgetRecords->setRowCount(nCount); 53 | 54 | for (int i = 0; i < nCount; i++) { 55 | QTableWidgetItem *pItem = new QTableWidgetItem(_mdata.listInstallRecords.at(i).sPath); 56 | ui->tableWidgetRecords->setItem(i, 0, pItem); 57 | } 58 | } 59 | 60 | bool DialogInstallModule::setMData(Utils::MDATA *pMData) 61 | { 62 | bool bResult = false; 63 | 64 | QString sSHA1 = pMData->sSHA1; 65 | 66 | QString sModuleFileName = Utils::getModuleFileName(sDataPath, pMData->sName); 67 | 68 | bool bHash = XBinary::isFileHashValid(XBinary::HASH_SHA1, sModuleFileName, sSHA1); 69 | 70 | if (!bHash) { 71 | if (pMData->sGithub != "") { 72 | QString sConvertPath = Utils::getConvertPath(sDataPath, pMData->sName); 73 | QString sDownloadModulePath = Utils::getConvertModulePath(sDataPath, pMData->sName); 74 | 75 | XBinary::createDirectory(sConvertPath); 76 | XBinary::createDirectory(sDownloadModulePath); 77 | 78 | QList listWebRecords; 79 | 80 | int nCount = pMData->listDownloads.count(); 81 | 82 | for (int i = 0; i < nCount; i++) { 83 | Utils::WEB_RECORD record = {}; 84 | 85 | QString sLink = pMData->listDownloads.at(i); 86 | 87 | record.sFileName = sConvertPath + QDir::separator() + sLink.section("/", -1, -1); 88 | record.sFileName = record.sFileName.remove("?raw=true"); 89 | record.sLink = sLink; 90 | 91 | listWebRecords.append(record); 92 | } 93 | 94 | DialogGetFileFromServerProcess dialogGetFileFromServer(pParent, listWebRecords); 95 | 96 | connect(&dialogGetFileFromServer, SIGNAL(errorMessage(QString)), this, SIGNAL(errorMessage(QString))); 97 | 98 | dialogGetFileFromServer.exec(); 99 | 100 | DialogConvertProcess dialogConvertProcess(pParent, pMData, sDataPath); 101 | 102 | connect(&dialogConvertProcess, SIGNAL(errorMessage(QString)), this, SIGNAL(errorMessage(QString))); 103 | 104 | dialogConvertProcess.exec(); 105 | 106 | Utils::MDATA mdata = *pMData; 107 | 108 | mdata.sBundleFileName = Utils::getModuleFileName(sDataPath, mdata.sName); 109 | mdata.sRoot = sDownloadModulePath; 110 | 111 | QString sErrorString; 112 | 113 | if (Utils::checkMData(&mdata, &sErrorString)) { 114 | DialogCreateModuleProcess dcmp(pParent, &mdata, false); 115 | 116 | connect(&dcmp, SIGNAL(errorMessage(QString)), this, SIGNAL(errorMessage(QString))); 117 | 118 | dcmp.exec(); 119 | } else { 120 | emit errorMessage(sErrorString); 121 | } 122 | 123 | #ifndef QT_DEBUG 124 | XBinary::removeDirectory(sConvertPath); 125 | #endif 126 | 127 | Utils::updateJsonFile(Utils::getServerListFileName(sDataPath), QList() << mdata); 128 | 129 | sSHA1 = mdata.sSHA1; 130 | } else { 131 | Utils::WEB_RECORD record = {}; 132 | 133 | record.sFileName = sModuleFileName; 134 | record.sLink = pMData->sSrc; 135 | 136 | DialogGetFileFromServerProcess dialogGetFileFromServer(pParent, QList() << record); 137 | 138 | connect(&dialogGetFileFromServer, SIGNAL(errorMessage(QString)), this, SIGNAL(errorMessage(QString))); 139 | 140 | dialogGetFileFromServer.exec(); 141 | } 142 | 143 | bHash = XBinary::isFileHashValid(XBinary::HASH_SHA1, sModuleFileName, sSHA1); 144 | } 145 | 146 | if (bHash) { 147 | setFileName(sModuleFileName); 148 | 149 | bResult = true; 150 | } else { 151 | emit errorMessage(QString("%1: %2").arg(tr("Invalid SHA1")).arg(sModuleFileName)); 152 | } 153 | 154 | return bResult; 155 | } 156 | 157 | void DialogInstallModule::on_pushButtonCancel_clicked() 158 | { 159 | this->close(); 160 | } 161 | 162 | void DialogInstallModule::on_pushButtonOK_clicked() 163 | { 164 | DialogInstallModuleProcess dimp(this, sDataPath, sRootPath, QList() << sModuleFileName); 165 | 166 | connect(&dimp, SIGNAL(errorMessage(QString)), this, SIGNAL(errorMessage(QString))); 167 | 168 | dimp.exec(); 169 | 170 | this->close(); 171 | } 172 | -------------------------------------------------------------------------------- /gui_source/dialogcreatemodule.cpp: -------------------------------------------------------------------------------- 1 | // Copyright (c) 2019-2023 hors 2 | // 3 | // Permission is hereby granted, free of charge, to any person obtaining a copy 4 | // of this software and associated documentation files (the "Software"), to deal 5 | // in the Software without restriction, including without limitation the rights 6 | // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 7 | // copies of the Software, and to permit persons to whom the Software is 8 | // furnished to do so, subject to the following conditions: 9 | 10 | // The above copyright notice and this permission notice shall be included in all 11 | // copies or substantial portions of the Software. 12 | 13 | // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 14 | // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 15 | // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 16 | // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 17 | // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 18 | // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 19 | // SOFTWARE. 20 | // 21 | #include "dialogcreatemodule.h" 22 | 23 | #include "ui_dialogcreatemodule.h" 24 | 25 | DialogCreateModule::DialogCreateModule(QWidget *pParent) : QDialog(pParent), ui(new Ui::DialogCreateModule) 26 | { 27 | ui->setupUi(this); 28 | 29 | mdata = {}; 30 | 31 | _currentDate(); 32 | ui->pushButtonSave->setEnabled(false); 33 | } 34 | 35 | DialogCreateModule::~DialogCreateModule() 36 | { 37 | delete ui; 38 | } 39 | 40 | void DialogCreateModule::on_pushButtonLoad_clicked() 41 | { 42 | // QString sInitDirectory=QStandardPaths::writableLocation(QStandardPaths::DocumentsLocation); 43 | QString sInitDirectory; 44 | 45 | QString sFileName = QFileDialog::getOpenFileName(this, tr("Load project"), sInitDirectory, "*.pro.ini"); 46 | 47 | if (sFileName != "") { 48 | QSettings settings(sFileName, QSettings::IniFormat); 49 | 50 | ui->lineEditName->setText(settings.value("Name", "").toString()); 51 | ui->lineEditVersion->setText(settings.value("Version", "").toString()); 52 | ui->dateEdit->setDate(QDate::fromString(settings.value("Date", QDate::currentDate().toString("yyyy-MM-dd")).toString(), "yyyy-MM-dd")); 53 | ui->lineEditAuthor->setText(settings.value("Author", "").toString()); 54 | ui->lineEditBugreport->setText(settings.value("Bugreport", "").toString()); 55 | ui->lineEditInfo->setText(settings.value("Info", "").toString()); 56 | ui->lineEditRoot->setText(settings.value("Root", "").toString()); 57 | } 58 | } 59 | 60 | void DialogCreateModule::on_pushButtonSave_clicked() 61 | { 62 | // QString sFileName=QStandardPaths::writableLocation(QStandardPaths::DocumentsLocation)+QDir::separator()+ui->lineEditName->text()+".pro.ini"; 63 | QString sFileName; 64 | 65 | sFileName = QFileDialog::getSaveFileName(this, tr("Save project"), sFileName, "*.pro.ini"); 66 | 67 | if (sFileName != "") { 68 | QSettings settings(sFileName, QSettings::IniFormat); 69 | 70 | settings.setValue("Name", ui->lineEditName->text()); 71 | settings.setValue("Version", ui->lineEditVersion->text()); 72 | settings.setValue("Date", ui->dateEdit->date().toString("yyyy-MM-dd")); 73 | settings.setValue("Author", ui->lineEditAuthor->text()); 74 | settings.setValue("Bugreport", ui->lineEditBugreport->text()); 75 | settings.setValue("Info", ui->lineEditInfo->text()); 76 | settings.setValue("Root", ui->lineEditRoot->text()); 77 | } 78 | } 79 | 80 | void DialogCreateModule::on_pushButtonCreate_clicked() 81 | { 82 | QString sFileName = Utils::createBundleName(&mdata) + ".x64dbg.zip"; 83 | sFileName = QFileDialog::getSaveFileName(this, tr("Save plugin bundle"), sFileName, "*.x64dbg.zip"); 84 | 85 | if (sFileName != "") { 86 | mdata.sBundleFileName = sFileName; 87 | 88 | QString sErrorString; 89 | 90 | if (Utils::checkMData(&mdata, &sErrorString)) { 91 | DialogCreateModuleProcess dcmp(this, &mdata, true); 92 | 93 | connect(&dcmp, SIGNAL(errorMessage(QString)), this, SIGNAL(errorMessage(QString))); 94 | 95 | dcmp.exec(); 96 | } else { 97 | emit errorMessage(sErrorString); 98 | } 99 | } 100 | } 101 | 102 | void DialogCreateModule::on_toolButtonRoot_clicked() 103 | { 104 | QString sDirectoryName = QFileDialog::getExistingDirectory(this, tr("Select plugin root directory"), ui->lineEditRoot->text()); 105 | 106 | if (sDirectoryName != "") { 107 | ui->lineEditRoot->setText(sDirectoryName); 108 | } 109 | } 110 | 111 | void DialogCreateModule::on_lineEditRoot_textChanged(const QString &sDirectoryName) 112 | { 113 | mdata.sRoot = ""; 114 | 115 | QString _sDirectoryName = sDirectoryName; 116 | 117 | if (sDirectoryName != "") { 118 | _sDirectoryName = XBinary::convertPathName(_sDirectoryName); 119 | 120 | QDir dir(_sDirectoryName); 121 | 122 | if (dir.exists()) { 123 | mdata.sRoot = _sDirectoryName; 124 | 125 | QList listRecords = Utils::getRecords(_sDirectoryName); 126 | 127 | int nCount = listRecords.count(); 128 | 129 | ui->tableWidgetRecords->setColumnCount(1); 130 | ui->tableWidgetRecords->setRowCount(nCount); 131 | 132 | for (int i = 0; i < nCount; i++) { 133 | QTableWidgetItem *pItem = new QTableWidgetItem(listRecords.at(i).sPath); 134 | ui->tableWidgetRecords->setItem(i, 0, pItem); 135 | } 136 | } 137 | } 138 | } 139 | 140 | void DialogCreateModule::on_pushButtonCancel_clicked() 141 | { 142 | this->close(); 143 | } 144 | 145 | void DialogCreateModule::on_lineEditName_textChanged(const QString &sName) 146 | { 147 | QSignalBlocker(ui->lineEditName); 148 | 149 | QString _sName = sName; 150 | 151 | if (_sName.contains(" ")) _sName.remove(" "); 152 | // TODO more checks 153 | 154 | ui->lineEditName->setText(_sName); 155 | 156 | mdata.sName = _sName; 157 | 158 | ui->pushButtonSave->setEnabled(_sName != ""); 159 | } 160 | 161 | void DialogCreateModule::on_lineEditVersion_textChanged(const QString &sVersion) 162 | { 163 | // TODO Checks 164 | mdata.sVersion = sVersion; 165 | } 166 | 167 | void DialogCreateModule::on_pushButtonCurrentDate_clicked() 168 | { 169 | _currentDate(); 170 | } 171 | 172 | void DialogCreateModule::_currentDate() 173 | { 174 | ui->dateEdit->setDate(QDate::currentDate()); 175 | } 176 | 177 | void DialogCreateModule::on_dateEdit_dateChanged(const QDate &date) 178 | { 179 | mdata.sDate = date.toString("yyyy-MM-dd"); 180 | } 181 | 182 | void DialogCreateModule::on_lineEditInfo_textChanged(const QString &sInfo) 183 | { 184 | mdata.sInfo = sInfo; 185 | } 186 | 187 | void DialogCreateModule::on_lineEditAuthor_textChanged(const QString &sAuthor) 188 | { 189 | mdata.sAuthor = sAuthor; 190 | } 191 | 192 | void DialogCreateModule::on_lineEditBugreport_textChanged(const QString &sBugreport) 193 | { 194 | mdata.sBugreport = sBugreport; 195 | } 196 | -------------------------------------------------------------------------------- /utils.h: -------------------------------------------------------------------------------- 1 | // Copyright (c) 2019-2023 hors 2 | // 3 | // Permission is hereby granted, free of charge, to any person obtaining a copy 4 | // of this software and associated documentation files (the "Software"), to deal 5 | // in the Software without restriction, including without limitation the rights 6 | // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 7 | // copies of the Software, and to permit persons to whom the Software is 8 | // furnished to do so, subject to the following conditions: 9 | 10 | // The above copyright notice and this permission notice shall be included in all 11 | // copies or substantial portions of the Software. 12 | 13 | // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 14 | // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 15 | // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 16 | // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 17 | // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 18 | // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 19 | // SOFTWARE. 20 | // 21 | #ifndef UTILS_H 22 | #define UTILS_H 23 | 24 | #include 25 | #include 26 | #include 27 | #include 28 | #include 29 | #include 30 | #include 31 | 32 | #include "global.h" 33 | #include "xzip.h" 34 | 35 | class Utils : public QObject { 36 | Q_OBJECT 37 | 38 | public: 39 | enum ACTION { 40 | ACTION_UNKNOWN = 0, 41 | ACTION_COPYFILE, 42 | ACTION_REMOVEFILE, 43 | ACTION_REMOVEDIRECTORYIFEMPTY, 44 | ACTION_MAKEDIRECTORY, 45 | ACTION_UNPACKDIRECTORY, 46 | ACTION_UNPACKFILE 47 | }; 48 | 49 | struct WEB_RECORD { 50 | QString sName; 51 | QString sFileName; 52 | QString sLink; 53 | }; 54 | 55 | struct STATUS { 56 | bool bInstall; 57 | bool bUpdate; 58 | bool bRemove; 59 | QString sServerListVersion; 60 | QString sServerListDate; 61 | QString sInstalledVersion; 62 | QString sInstalledDate; 63 | WEB_RECORD webRecord; 64 | }; 65 | 66 | struct STATS { 67 | QString sModule; 68 | qint64 nTotalModule; 69 | qint64 nCurrentModule; 70 | QString sFile; 71 | qint64 nTotalFile; 72 | qint64 nCurrentFile; 73 | qint64 nTotalBytes; 74 | qint64 nCurrentBytes; 75 | }; 76 | 77 | struct RECORD { 78 | QString sFullPath; 79 | QString sPath; 80 | bool bIsFile; 81 | }; 82 | 83 | struct HANDLE_RECORD { 84 | QString sSrc; 85 | QString sPath; 86 | QString sSHA1; 87 | QString sPattern; 88 | ACTION action; 89 | }; 90 | 91 | struct MDATA { 92 | QString sName; 93 | QString sVersion; 94 | bool bIs32; 95 | bool bIs64; 96 | QString sDate; 97 | QString sAuthor; 98 | QString sBugreport; 99 | QString sInfo; 100 | QString sRoot; 101 | QString sBundleFileName; 102 | QList listInstallRecords; 103 | QList listRemoveRecords; 104 | QList listConvertRecords; 105 | qint64 nSize; 106 | qint64 nCompressedSize; 107 | QString sSrc; 108 | QString sSHA1; 109 | QString sGithub; 110 | QList listDownloads; 111 | QString sUpdated; 112 | }; 113 | 114 | struct FILE_RECORD { 115 | QString sFullPath; 116 | QString sPath; 117 | QString sSHA1; 118 | // qint64 nSize; 119 | // qint64 nCompressedSize; 120 | }; 121 | 122 | struct DIRECTORY_RECORD { 123 | QString sFullPath; 124 | QString sPath; 125 | }; 126 | 127 | struct MODULES_DATA { 128 | QList listServerList; 129 | QList listInstalled; 130 | QMap mapStatus; 131 | QList listUpdates; 132 | }; 133 | 134 | explicit Utils(QObject *pParent = nullptr); 135 | 136 | static QList getRecords(QString sRootPath); 137 | static bool checkMData(MDATA *pMData, QString *psErrorString); 138 | static QString createBundleName(MDATA *pMData); 139 | static bool isPluginValid(QString sFileName, XBinary::PDSTRUCT *pPdStruct); 140 | static bool isPluginValid(QIODevice *pDevice, XBinary::PDSTRUCT *pPdStruct); 141 | 142 | static QByteArray createPluginInfo(Utils::MDATA *pMData, QList *pListFileRecords, QList *pListDirectoryRecords); 143 | static MDATA getMDataFromZip(QString sFileName, QString sRootPath, XBinary::PDSTRUCT *pPdStruct); 144 | static MDATA getMDataFromZip(QIODevice *pDevice, QString sRootPath, XBinary::PDSTRUCT *pPdStruct); 145 | static MDATA getMDataFromData(QByteArray baData); 146 | static MDATA getMDataFromJSONFile(QString sFileName); 147 | 148 | static QList getInstalledModules(QString sDataPath, QString sRootPath); 149 | static QList getModulesFromJSONFile(QString sFileName); 150 | static QDate getDateFromJSONFile(QString sFileName); 151 | 152 | static bool createServerList(QString sListFileName, QList *pList, QString sWebPrefix, QString sDate); 153 | 154 | static void mDataToObject(Utils::MDATA *pMData, QJsonObject *pObject); 155 | static void objectToMData(QJsonObject *pObject, Utils::MDATA *pMData); 156 | 157 | static void handleRecordToObject(Utils::HANDLE_RECORD *pHandleRecord, QJsonObject *pObject); 158 | static void objectToHandleRecord(QJsonObject *pObject, Utils::HANDLE_RECORD *pHandleRecord); 159 | 160 | static QMap getModulesStatusMap(QString sDataPath, QList *pServerList, QList *pInstalled); 161 | 162 | static MODULES_DATA getModulesData(QString sDataPath); 163 | static QList getUpdates(QMap *pMapStatus); 164 | 165 | static QString getInstalledJsonFileName(QString sDataPath, QString sName); 166 | static QString getServerListFileName(QString sDataPath); 167 | static QString getServerLastestListFileName(QString sDataPath); 168 | static QString getModuleFileName(QString sDataPath, QString sName); 169 | static QString getConvertPath(QString sDataPath, QString sName); 170 | static QString getConvertDownloadFileName(QString sDataPath, QString sName, QString sPattern); 171 | static QString getConvertModulePath(QString sDataPath, QString sName); 172 | 173 | static Utils::MDATA getMDataByName(QList *pServerList, QString sName); 174 | static QList getNamesFromWebRecords(QList *pListWebRecords); 175 | static Utils::WEB_RECORD getWebRecordByName(QList *pListWebRecords, QString sName); 176 | 177 | static bool isGithubPresent(QString sServerListFileName); 178 | 179 | static bool updateJsonFile(QString sFileName, QList listMData); 180 | static bool updateServerList(QString sOldFileName, QString sNewFileName); 181 | 182 | static QString actionIdToString(ACTION action); 183 | static ACTION stringToActionId(QString sAction); 184 | 185 | static bool checkPattern(QString sString, Utils::MDATA *pMData); 186 | 187 | private: 188 | static void _getRecords(QString sRootPath, QString sCurrentPath, QList *pListRecords); 189 | }; 190 | 191 | #endif // UTILS_H 192 | -------------------------------------------------------------------------------- /createmoduleprocess.cpp: -------------------------------------------------------------------------------- 1 | // Copyright (c) 2019-2023 hors 2 | // 3 | // Permission is hereby granted, free of charge, to any person obtaining a copy 4 | // of this software and associated documentation files (the "Software"), to deal 5 | // in the Software without restriction, including without limitation the rights 6 | // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 7 | // copies of the Software, and to permit persons to whom the Software is 8 | // furnished to do so, subject to the following conditions: 9 | 10 | // The above copyright notice and this permission notice shall be included in all 11 | // copies or substantial portions of the Software. 12 | 13 | // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 14 | // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 15 | // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 16 | // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 17 | // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 18 | // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 19 | // SOFTWARE. 20 | // 21 | #include "createmoduleprocess.h" 22 | 23 | CreateModuleProcess::CreateModuleProcess(QObject *pParent) : QObject(pParent) 24 | { 25 | currentStats = {}; 26 | g_pPdStruct = nullptr; 27 | } 28 | 29 | void CreateModuleProcess::setData(Utils::MDATA *pMData, bool bCreateInfoFile, XBinary::PDSTRUCT *pPdStruct) 30 | { 31 | this->pMData = pMData; 32 | this->bCreateInfoFile = bCreateInfoFile; 33 | this->g_pPdStruct = pPdStruct; 34 | } 35 | 36 | void CreateModuleProcess::stop() 37 | { 38 | g_pPdStruct->bIsStop = true; 39 | } 40 | 41 | Utils::STATS CreateModuleProcess::getCurrentStats() 42 | { 43 | return currentStats; 44 | } 45 | 46 | void CreateModuleProcess::process() 47 | { 48 | QElapsedTimer elapsedTimer; 49 | elapsedTimer.start(); 50 | 51 | QList listFileRecords; 52 | QList listDirectoryRecords; 53 | 54 | QList listRecords = Utils::getRecords(XBinary::convertPathName(pMData->sRoot)); 55 | 56 | QString sBundleFileName = pMData->sBundleFileName; 57 | QString sBundleInfoFileName = pMData->sBundleFileName + ".json"; 58 | 59 | if (pMData->sDate == "") { 60 | pMData->sDate = QDate::currentDate().toString("yyyy-MM-dd"); 61 | } 62 | 63 | bool bSuccess = true; 64 | 65 | if (XBinary::isFileExists(sBundleFileName)) { 66 | bSuccess = XBinary::removeFile(sBundleFileName); 67 | 68 | if (!bSuccess) { 69 | emit errorMessage(QString("%1: %2").arg(tr("Cannot remove")).arg(sBundleFileName)); 70 | } 71 | } 72 | 73 | if (bCreateInfoFile) { 74 | if (XBinary::isFileExists(sBundleInfoFileName)) { 75 | bSuccess = XBinary::removeFile(sBundleInfoFileName); 76 | 77 | if (!bSuccess) { 78 | emit errorMessage(QString("%1: %2").arg(tr("Cannot remove")).arg(sBundleFileName)); 79 | } 80 | } 81 | } 82 | 83 | QFileInfo fi(sBundleFileName); 84 | 85 | pMData->sSrc = fi.fileName(); 86 | 87 | pMData->nSize = 0; 88 | pMData->nCompressedSize = 0; 89 | currentStats.nTotalFile = listRecords.count(); 90 | 91 | if (bSuccess) { 92 | QFile fileResult; 93 | 94 | fileResult.setFileName(sBundleFileName); 95 | 96 | if (fileResult.open(QIODevice::ReadWrite)) { 97 | QList listZipFiles; 98 | 99 | for (int i = 0; (i < currentStats.nTotalFile) && (!(g_pPdStruct->bIsStop)); i++) { 100 | if (listRecords.at(i).bIsFile) { 101 | currentStats.sFile = QString("%1: %2").arg(tr("Add file")).arg(listRecords.at(i).sPath); 102 | 103 | emit infoMessage(currentStats.sFile); 104 | 105 | QFile file; 106 | 107 | file.setFileName(listRecords.at(i).sFullPath); 108 | 109 | if (file.open(QIODevice::ReadOnly)) { 110 | Utils::FILE_RECORD fileRecord = {}; 111 | 112 | fileRecord.sFullPath = listRecords.at(i).sFullPath; 113 | fileRecord.sPath = listRecords.at(i).sPath; 114 | fileRecord.sSHA1 = XBinary::getHash(XBinary::HASH_SHA1, &file); 115 | 116 | XZip::ZIPFILE_RECORD zipFileRecord = {}; 117 | 118 | zipFileRecord.sFileName = QString("files/") + fileRecord.sPath; 119 | zipFileRecord.method = XZip::METHOD_DEFLATE; 120 | 121 | XZip::addLocalFileRecord(&file, &fileResult, &zipFileRecord); // TODO handle errors 122 | 123 | pMData->nSize += zipFileRecord.nUncompressedSize; 124 | pMData->nCompressedSize += zipFileRecord.nCompressedSize; 125 | 126 | file.close(); 127 | 128 | listFileRecords.append(fileRecord); 129 | listZipFiles.append(zipFileRecord); 130 | } 131 | } else { 132 | if (listRecords.at(i).sPath.toLower() == "x32") { 133 | pMData->bIs32 = true; 134 | } 135 | 136 | if (listRecords.at(i).sPath.toLower() == "x64") { 137 | pMData->bIs64 = true; 138 | } 139 | 140 | currentStats.sFile = QString("%1: %2").arg(tr("Add directory")).arg(listRecords.at(i).sPath); 141 | 142 | Utils::DIRECTORY_RECORD directoryRecord = {}; 143 | 144 | directoryRecord.sFullPath = listRecords.at(i).sFullPath; 145 | directoryRecord.sPath = listRecords.at(i).sPath; 146 | 147 | listDirectoryRecords.append(directoryRecord); 148 | } 149 | 150 | currentStats.nCurrentFile = i + 1; 151 | } 152 | 153 | QByteArray baInfoFile = Utils::createPluginInfo(pMData, &listFileRecords, &listDirectoryRecords); 154 | 155 | QBuffer bufferInfoFile(&baInfoFile); 156 | 157 | if (bufferInfoFile.open(QIODevice::ReadOnly)) { 158 | XZip::ZIPFILE_RECORD zipFileRecord = {}; 159 | 160 | zipFileRecord.sFileName = "plugin_info.json"; 161 | zipFileRecord.method = XZip::METHOD_DEFLATE; 162 | 163 | XZip::addLocalFileRecord(&bufferInfoFile, &fileResult, &zipFileRecord); 164 | 165 | pMData->nSize += zipFileRecord.nUncompressedSize; 166 | pMData->nCompressedSize += zipFileRecord.nCompressedSize; 167 | 168 | listZipFiles.append(zipFileRecord); 169 | 170 | bufferInfoFile.close(); 171 | } 172 | 173 | if (!(g_pPdStruct->bIsStop)) { 174 | currentStats.sFile = tr("Add central directory"); 175 | 176 | XZip::addCentralDirectory(&fileResult, &listZipFiles, QString("%1 v%2").arg(X_APPLICATIONNAME).arg(X_APPLICATIONVERSION)); 177 | } 178 | 179 | fileResult.close(); 180 | 181 | pMData->sSHA1 = XBinary::getHash(XBinary::HASH_SHA1, sBundleFileName); 182 | 183 | if (bCreateInfoFile) { 184 | if (!XBinary::writeToFile(sBundleInfoFileName, Utils::createPluginInfo(pMData, &listFileRecords, &listDirectoryRecords))) { 185 | emit errorMessage(QString("%1: %2").arg(tr("Cannot write data to file")).arg(sBundleInfoFileName)); 186 | } 187 | } 188 | } 189 | } 190 | 191 | emit completed(elapsedTimer.elapsed()); 192 | } 193 | -------------------------------------------------------------------------------- /gui_source/guimainwindow.ui: -------------------------------------------------------------------------------- 1 | 2 | 3 | GuiMainWindow 4 | 5 | 6 | 7 | 0 8 | 0 9 | 990 10 | 472 11 | 12 | 13 | 14 | GuiMainWindow 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | Update server list 24 | 25 | 26 | 27 | 28 | 29 | 30 | Qt::Horizontal 31 | 32 | 33 | 34 | 40 35 | 20 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | Update all installed plugins 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 0 53 | 54 | 55 | 56 | Server list 57 | 58 | 59 | 60 | 1 61 | 62 | 63 | 1 64 | 65 | 66 | 1 67 | 68 | 69 | 1 70 | 71 | 72 | 73 | 74 | Qt::CustomContextMenu 75 | 76 | 77 | QAbstractItemView::NoEditTriggers 78 | 79 | 80 | QAbstractItemView::SingleSelection 81 | 82 | 83 | QAbstractItemView::SelectRows 84 | 85 | 86 | true 87 | 88 | 89 | 5 90 | 91 | 92 | false 93 | 94 | 95 | false 96 | 97 | 98 | 20 99 | 100 | 101 | 20 102 | 103 | 104 | 105 | 106 | 107 | 108 | 109 | Installed 110 | 111 | 112 | 113 | 1 114 | 115 | 116 | 1 117 | 118 | 119 | 1 120 | 121 | 122 | 1 123 | 124 | 125 | 126 | 127 | Qt::CustomContextMenu 128 | 129 | 130 | QAbstractItemView::NoEditTriggers 131 | 132 | 133 | QAbstractItemView::SingleSelection 134 | 135 | 136 | QAbstractItemView::SelectRows 137 | 138 | 139 | true 140 | 141 | 142 | 5 143 | 144 | 145 | false 146 | 147 | 148 | false 149 | 150 | 151 | 20 152 | 153 | 154 | 20 155 | 156 | 157 | 158 | 159 | 160 | 161 | 162 | 163 | 164 | 165 | 166 | 167 | 0 168 | 0 169 | 990 170 | 22 171 | 172 | 173 | 174 | 175 | File 176 | 177 | 178 | 179 | 180 | 181 | 182 | 183 | 184 | Help 185 | 186 | 187 | 188 | 189 | 190 | Tools 191 | 192 | 193 | 194 | 195 | 196 | Action 197 | 198 | 199 | 200 | 201 | 202 | 203 | 204 | 205 | 206 | 207 | 208 | Exit 209 | 210 | 211 | 212 | 213 | About 214 | 215 | 216 | 217 | 218 | Open 219 | 220 | 221 | 222 | 223 | Create 224 | 225 | 226 | 227 | 228 | Options 229 | 230 | 231 | 232 | 233 | Update server list 234 | 235 | 236 | 237 | 238 | Update all installed plugins 239 | 240 | 241 | 242 | 243 | 244 | 245 | -------------------------------------------------------------------------------- /THANKS.md: -------------------------------------------------------------------------------- 1 |

2 | 3 | 4 | 15 | 16 | 17 | 18 | 32 | 33 | 34 | 35 | 49 | 50 | 51 | 52 | 66 | 67 | 68 | 69 | 83 | 84 | 85 | 86 | 94 | 95 | 96 | 97 | 111 | 112 | 113 | 114 | 125 | 126 | 127 | 128 | 142 | 143 | 144 | 145 | 159 | 160 | 161 | 162 | 173 | 174 | 175 | 176 | 184 | 185 | 186 | 187 | 198 | 199 | 200 | 201 | 212 | 213 | 214 | 215 | 226 | 227 | 228 | 229 | 237 | 238 | 239 | 240 | 251 | 252 | 253 | 254 | 265 | 266 | 267 | 268 | 276 | 277 | 278 | 279 | 290 | 291 | 292 | 293 | 307 | 308 |

5 |

6 | Adam Henault 7 |

8 |

9 | Website: http://adamhlt.com/ 10 |

11 |

12 | GitHub: adamhlt 13 |

14 |
19 |

20 | Adric Net 21 |

22 |

23 | Website: http://dfirnotes.net 24 |

25 |

26 | GitHub: adricnet 27 |

28 |

29 | Twitter: dfirnotes 30 |

31 |
36 |

37 | Ali Hadi 38 |

39 |

40 | Website: https://www.ashemery.com 41 |

42 |

43 | GitHub: ashemery 44 |

45 |

46 | Twitter: binaryz0ne 47 |

48 |
53 |

54 | Anderson Leite 55 |

56 |

57 | Website: https://reversing.codes 58 |

59 |

60 | GitHub: buzzer-re 61 |

62 |

63 | Twitter: buzz3r_ 64 |

65 |
70 |

71 | Bartosz Wójcik 72 |

73 |

74 | Website: https://www.pelock.com 75 |

76 |

77 | GitHub: PELock 78 |

79 |

80 | Twitter: PELock 81 |

82 |
87 |

88 | Christopher Layne 89 |

90 |

91 | GitHub: clayne 92 |

93 |
98 |

99 | Dav Clark 100 |

101 |

102 | Website: https://www.linkedin.com/in/davclark 103 |

104 |

105 | GitHub: davclark 106 |

107 |

108 | Twitter: davclark 109 |

110 |
115 |

116 | David Zimmer 117 |

118 |

119 | Website: http://sandsprite.com 120 |

121 |

122 | GitHub: dzzie 123 |

124 |
129 |

130 | Duncan Ogilvie 131 |

132 |

133 | Website: http://mrexodia.re 134 |

135 |

136 | GitHub: mrexodia 137 |

138 |

139 | Twitter: mrexodia 140 |

141 |
146 |

147 | Fernando Mercês 148 |

149 |

150 | Website: https://www.mentebinaria.com.br 151 |

152 |

153 | GitHub: merces 154 |

155 |

156 | Twitter: mer0x36 157 |

158 |
163 |

164 | Filip Navara 165 |

166 |

167 | GitHub: filipnavara 168 |

169 |

170 | Twitter: filipnavara 171 |

172 |
177 |

178 | fr0zenbag 179 |

180 |

181 | GitHub: fr0zenbag 182 |

183 |
188 |

189 | FrenchYeti 190 |

191 |

192 | GitHub: FrenchYeti 193 |

194 |

195 | Twitter: frenchyeti 196 |

197 |
202 |

203 | Gilad Reich 204 |

205 |

206 | Website: https://greich.com 207 |

208 |

209 | GitHub: giladreich 210 |

211 |
216 |

217 | Integral-Tech 218 |

219 |

220 | Website: https://integral.org.cn/ 221 |

222 |

223 | GitHub: Integral-Tech 224 |

225 |
230 |

231 | Jason Jack Tan 232 |

233 |

234 | GitHub: Perthys 235 |

236 |
241 |

242 | João Vitor 243 |

244 |

245 | Website: http://joaovitor.gq 246 |

247 |

248 | GitHub: keowu 249 |

250 |
255 |

256 | Leandro Fróes 257 |

258 |

259 | GitHub: leandrofroes 260 |

261 |

262 | Twitter: leandrofr0es 263 |

264 |
269 |

270 | misonothx 271 |

272 |

273 | GitHub: miso-xyz 274 |

275 |
280 |

281 | phithon 282 |

283 |

284 | Website: https://www.leavesongs.com 285 |

286 |

287 | GitHub: phith0n 288 |

289 |
294 |

295 | Xylit0l 296 |

297 |

298 | Website: http://xylibox.com 299 |

300 |

301 | GitHub: Xyl2k 302 |

303 |

304 | Twitter: Xylit0l 305 |

306 |
309 | --------------------------------------------------------------------------------