From 1cfde9f1162495c2815f0913b0aa3368be1a4240 Mon Sep 17 00:00:00 2001 From: gfdgd_xi <3025613752@qq.com> Date: Fri, 15 Sep 2023 19:41:50 +0800 Subject: [PATCH] =?UTF-8?q?=E6=96=B0=E5=A2=9E=E5=9C=A8=E7=BA=BF=E5=AE=89?= =?UTF-8?q?=E8=A3=85=E5=B7=A5=E5=85=B7=E5=88=9D=E7=A8=BF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../.gitignore | 73 ++ .../LICENSE | 674 +++++++++++ .../README.md | 15 + .../aboutprogram.cpp | 32 + .../aboutprogram.h | 22 + .../aboutprogram.ui | 91 ++ ...pin-community-live-cd-online-installer.pro | 54 + ...ommunity-live-cd-online-installer_zh_CN.ts | 3 + .../diskcontrol.cpp | 65 ++ .../diskcontrol.h | 17 + .../editpartdialog.cpp | 56 + .../editpartdialog.h | 28 + .../editpartdialog.ui | 219 ++++ .../icon.png | Bin 0 -> 39856 bytes .../icon.qrc | 10 + .../icon.svg | 1033 +++++++++++++++++ .../installsystem.cpp | 16 + .../installsystem.h | 22 + .../installsystemwindow.cpp | 32 + .../installsystemwindow.h | 22 + .../installsystemwindow.ui | 41 + .../main.cpp | 32 + .../mainwindow.cpp | 352 ++++++ .../mainwindow.h | 54 + .../mainwindow.ui | 311 +++++ .../no.png | Bin 0 -> 11833 bytes .../no.svg | 54 + .../runcommandinterminal.cpp | 38 + .../runcommandinterminal.h | 20 + .../yes.png | Bin 0 -> 11670 bytes .../yes.svg | 54 + 31 files changed, 3440 insertions(+) create mode 100644 deepin-community-live-cd-online-installer/.gitignore create mode 100755 deepin-community-live-cd-online-installer/LICENSE create mode 100644 deepin-community-live-cd-online-installer/README.md create mode 100644 deepin-community-live-cd-online-installer/aboutprogram.cpp create mode 100644 deepin-community-live-cd-online-installer/aboutprogram.h create mode 100644 deepin-community-live-cd-online-installer/aboutprogram.ui create mode 100644 deepin-community-live-cd-online-installer/deepin-community-live-cd-online-installer.pro create mode 100644 deepin-community-live-cd-online-installer/deepin-community-live-cd-online-installer_zh_CN.ts create mode 100644 deepin-community-live-cd-online-installer/diskcontrol.cpp create mode 100644 deepin-community-live-cd-online-installer/diskcontrol.h create mode 100644 deepin-community-live-cd-online-installer/editpartdialog.cpp create mode 100644 deepin-community-live-cd-online-installer/editpartdialog.h create mode 100644 deepin-community-live-cd-online-installer/editpartdialog.ui create mode 100644 deepin-community-live-cd-online-installer/icon.png create mode 100644 deepin-community-live-cd-online-installer/icon.qrc create mode 100644 deepin-community-live-cd-online-installer/icon.svg create mode 100644 deepin-community-live-cd-online-installer/installsystem.cpp create mode 100644 deepin-community-live-cd-online-installer/installsystem.h create mode 100644 deepin-community-live-cd-online-installer/installsystemwindow.cpp create mode 100644 deepin-community-live-cd-online-installer/installsystemwindow.h create mode 100644 deepin-community-live-cd-online-installer/installsystemwindow.ui create mode 100644 deepin-community-live-cd-online-installer/main.cpp create mode 100644 deepin-community-live-cd-online-installer/mainwindow.cpp create mode 100644 deepin-community-live-cd-online-installer/mainwindow.h create mode 100644 deepin-community-live-cd-online-installer/mainwindow.ui create mode 100644 deepin-community-live-cd-online-installer/no.png create mode 100644 deepin-community-live-cd-online-installer/no.svg create mode 100644 deepin-community-live-cd-online-installer/runcommandinterminal.cpp create mode 100644 deepin-community-live-cd-online-installer/runcommandinterminal.h create mode 100644 deepin-community-live-cd-online-installer/yes.png create mode 100644 deepin-community-live-cd-online-installer/yes.svg diff --git a/deepin-community-live-cd-online-installer/.gitignore b/deepin-community-live-cd-online-installer/.gitignore new file mode 100644 index 0000000..c324fe6 --- /dev/null +++ b/deepin-community-live-cd-online-installer/.gitignore @@ -0,0 +1,73 @@ +# This file is used to ignore files which are generated +# ---------------------------------------------------------------------------- + +*~ +*.autosave +*.a +*.core +*.moc +*.o +*.obj +*.orig +*.rej +*.so +*.so.* +*_pch.h.cpp +*_resource.rc +*.qm +.#* +*.*# +core +!core/ +tags +.DS_Store +.directory +*.debug +Makefile* +*.prl +*.app +moc_*.cpp +ui_*.h +qrc_*.cpp +Thumbs.db +*.res +*.rc +/.qmake.cache +/.qmake.stash + +# qtcreator generated files +*.pro.user* + +# xemacs temporary files +*.flc + +# Vim temporary files +.*.swp +build-installer-Qt_5_15_6_in_PATH_qt5-Debug +# Visual Studio generated files +*.ib_pdb_index +*.idb +*.ilk +*.pdb +*.sln +*.suo +*.vcproj +*vcproj.*.*.user +*.ncb +*.sdf +*.opensdf +*.vcxproj +*vcxproj.* + +# MinGW generated files +*.Debug +*.Release + +# Python byte code +*.pyc + +# Binaries +# -------- +*.dll +*.exe + diff --git a/deepin-community-live-cd-online-installer/LICENSE b/deepin-community-live-cd-online-installer/LICENSE new file mode 100755 index 0000000..94a9ed0 --- /dev/null +++ b/deepin-community-live-cd-online-installer/LICENSE @@ -0,0 +1,674 @@ + GNU GENERAL PUBLIC LICENSE + Version 3, 29 June 2007 + + Copyright (C) 2007 Free Software Foundation, Inc. + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The GNU General Public License is a free, copyleft license for +software and other kinds of works. + + The licenses for most software and other practical works are designed +to take away your freedom to share and change the works. By contrast, +the GNU General Public License is intended to guarantee your freedom to +share and change all versions of a program--to make sure it remains free +software for all its users. We, the Free Software Foundation, use the +GNU General Public License for most of our software; it applies also to +any other work released this way by its authors. You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +them if you wish), that you receive source code or can get it if you +want it, that you can change the software or use pieces of it in new +free programs, and that you know you can do these things. + + To protect your rights, we need to prevent others from denying you +these rights or asking you to surrender the rights. Therefore, you have +certain responsibilities if you distribute copies of the software, or if +you modify it: responsibilities to respect the freedom of others. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must pass on to the recipients the same +freedoms that you received. You must make sure that they, too, receive +or can get the source code. And you must show them these terms so they +know their rights. + + Developers that use the GNU GPL protect your rights with two steps: +(1) assert copyright on the software, and (2) offer you this License +giving you legal permission to copy, distribute and/or modify it. + + For the developers' and authors' protection, the GPL clearly explains +that there is no warranty for this free software. For both users' and +authors' sake, the GPL requires that modified versions be marked as +changed, so that their problems will not be attributed erroneously to +authors of previous versions. + + Some devices are designed to deny users access to install or run +modified versions of the software inside them, although the manufacturer +can do so. This is fundamentally incompatible with the aim of +protecting users' freedom to change the software. The systematic +pattern of such abuse occurs in the area of products for individuals to +use, which is precisely where it is most unacceptable. Therefore, we +have designed this version of the GPL to prohibit the practice for those +products. If such problems arise substantially in other domains, we +stand ready to extend this provision to those domains in future versions +of the GPL, as needed to protect the freedom of users. + + Finally, every program is threatened constantly by software patents. +States should not allow patents to restrict development and use of +software on general-purpose computers, but in those that do, we wish to +avoid the special danger that patents applied to a free program could +make it effectively proprietary. To prevent this, the GPL assures that +patents cannot be used to render the program non-free. + + The precise terms and conditions for copying, distribution and +modification follow. + + TERMS AND CONDITIONS + + 0. Definitions. + + "This License" refers to version 3 of the GNU General Public License. + + "Copyright" also means copyright-like laws that apply to other kinds of +works, such as semiconductor masks. + + "The Program" refers to any copyrightable work licensed under this +License. Each licensee is addressed as "you". "Licensees" and +"recipients" may be individuals or organizations. + + To "modify" a work means to copy from or adapt all or part of the work +in a fashion requiring copyright permission, other than the making of an +exact copy. The resulting work is called a "modified version" of the +earlier work or a work "based on" the earlier work. + + A "covered work" means either the unmodified Program or a work based +on the Program. + + To "propagate" a work means to do anything with it that, without +permission, would make you directly or secondarily liable for +infringement under applicable copyright law, except executing it on a +computer or modifying a private copy. Propagation includes copying, +distribution (with or without modification), making available to the +public, and in some countries other activities as well. + + To "convey" a work means any kind of propagation that enables other +parties to make or receive copies. Mere interaction with a user through +a computer network, with no transfer of a copy, is not conveying. + + An interactive user interface displays "Appropriate Legal Notices" +to the extent that it includes a convenient and prominently visible +feature that (1) displays an appropriate copyright notice, and (2) +tells the user that there is no warranty for the work (except to the +extent that warranties are provided), that licensees may convey the +work under this License, and how to view a copy of this License. If +the interface presents a list of user commands or options, such as a +menu, a prominent item in the list meets this criterion. + + 1. Source Code. + + The "source code" for a work means the preferred form of the work +for making modifications to it. "Object code" means any non-source +form of a work. + + A "Standard Interface" means an interface that either is an official +standard defined by a recognized standards body, or, in the case of +interfaces specified for a particular programming language, one that +is widely used among developers working in that language. + + The "System Libraries" of an executable work include anything, other +than the work as a whole, that (a) is included in the normal form of +packaging a Major Component, but which is not part of that Major +Component, and (b) serves only to enable use of the work with that +Major Component, or to implement a Standard Interface for which an +implementation is available to the public in source code form. A +"Major Component", in this context, means a major essential component +(kernel, window system, and so on) of the specific operating system +(if any) on which the executable work runs, or a compiler used to +produce the work, or an object code interpreter used to run it. + + The "Corresponding Source" for a work in object code form means all +the source code needed to generate, install, and (for an executable +work) run the object code and to modify the work, including scripts to +control those activities. However, it does not include the work's +System Libraries, or general-purpose tools or generally available free +programs which are used unmodified in performing those activities but +which are not part of the work. For example, Corresponding Source +includes interface definition files associated with source files for +the work, and the source code for shared libraries and dynamically +linked subprograms that the work is specifically designed to require, +such as by intimate data communication or control flow between those +subprograms and other parts of the work. + + The Corresponding Source need not include anything that users +can regenerate automatically from other parts of the Corresponding +Source. + + The Corresponding Source for a work in source code form is that +same work. + + 2. Basic Permissions. + + All rights granted under this License are granted for the term of +copyright on the Program, and are irrevocable provided the stated +conditions are met. This License explicitly affirms your unlimited +permission to run the unmodified Program. The output from running a +covered work is covered by this License only if the output, given its +content, constitutes a covered work. This License acknowledges your +rights of fair use or other equivalent, as provided by copyright law. + + You may make, run and propagate covered works that you do not +convey, without conditions so long as your license otherwise remains +in force. You may convey covered works to others for the sole purpose +of having them make modifications exclusively for you, or provide you +with facilities for running those works, provided that you comply with +the terms of this License in conveying all material for which you do +not control copyright. Those thus making or running the covered works +for you must do so exclusively on your behalf, under your direction +and control, on terms that prohibit them from making any copies of +your copyrighted material outside their relationship with you. + + Conveying under any other circumstances is permitted solely under +the conditions stated below. Sublicensing is not allowed; section 10 +makes it unnecessary. + + 3. Protecting Users' Legal Rights From Anti-Circumvention Law. + + No covered work shall be deemed part of an effective technological +measure under any applicable law fulfilling obligations under article +11 of the WIPO copyright treaty adopted on 20 December 1996, or +similar laws prohibiting or restricting circumvention of such +measures. + + When you convey a covered work, you waive any legal power to forbid +circumvention of technological measures to the extent such circumvention +is effected by exercising rights under this License with respect to +the covered work, and you disclaim any intention to limit operation or +modification of the work as a means of enforcing, against the work's +users, your or third parties' legal rights to forbid circumvention of +technological measures. + + 4. Conveying Verbatim Copies. + + You may convey verbatim copies of the Program's source code as you +receive it, in any medium, provided that you conspicuously and +appropriately publish on each copy an appropriate copyright notice; +keep intact all notices stating that this License and any +non-permissive terms added in accord with section 7 apply to the code; +keep intact all notices of the absence of any warranty; and give all +recipients a copy of this License along with the Program. + + You may charge any price or no price for each copy that you convey, +and you may offer support or warranty protection for a fee. + + 5. Conveying Modified Source Versions. + + You may convey a work based on the Program, or the modifications to +produce it from the Program, in the form of source code under the +terms of section 4, provided that you also meet all of these conditions: + + a) The work must carry prominent notices stating that you modified + it, and giving a relevant date. + + b) The work must carry prominent notices stating that it is + released under this License and any conditions added under section + 7. This requirement modifies the requirement in section 4 to + "keep intact all notices". + + c) You must license the entire work, as a whole, under this + License to anyone who comes into possession of a copy. This + License will therefore apply, along with any applicable section 7 + additional terms, to the whole of the work, and all its parts, + regardless of how they are packaged. This License gives no + permission to license the work in any other way, but it does not + invalidate such permission if you have separately received it. + + d) If the work has interactive user interfaces, each must display + Appropriate Legal Notices; however, if the Program has interactive + interfaces that do not display Appropriate Legal Notices, your + work need not make them do so. + + A compilation of a covered work with other separate and independent +works, which are not by their nature extensions of the covered work, +and which are not combined with it such as to form a larger program, +in or on a volume of a storage or distribution medium, is called an +"aggregate" if the compilation and its resulting copyright are not +used to limit the access or legal rights of the compilation's users +beyond what the individual works permit. Inclusion of a covered work +in an aggregate does not cause this License to apply to the other +parts of the aggregate. + + 6. Conveying Non-Source Forms. + + You may convey a covered work in object code form under the terms +of sections 4 and 5, provided that you also convey the +machine-readable Corresponding Source under the terms of this License, +in one of these ways: + + a) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by the + Corresponding Source fixed on a durable physical medium + customarily used for software interchange. + + b) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by a + written offer, valid for at least three years and valid for as + long as you offer spare parts or customer support for that product + model, to give anyone who possesses the object code either (1) a + copy of the Corresponding Source for all the software in the + product that is covered by this License, on a durable physical + medium customarily used for software interchange, for a price no + more than your reasonable cost of physically performing this + conveying of source, or (2) access to copy the + Corresponding Source from a network server at no charge. + + c) Convey individual copies of the object code with a copy of the + written offer to provide the Corresponding Source. This + alternative is allowed only occasionally and noncommercially, and + only if you received the object code with such an offer, in accord + with subsection 6b. + + d) Convey the object code by offering access from a designated + place (gratis or for a charge), and offer equivalent access to the + Corresponding Source in the same way through the same place at no + further charge. You need not require recipients to copy the + Corresponding Source along with the object code. If the place to + copy the object code is a network server, the Corresponding Source + may be on a different server (operated by you or a third party) + that supports equivalent copying facilities, provided you maintain + clear directions next to the object code saying where to find the + Corresponding Source. Regardless of what server hosts the + Corresponding Source, you remain obligated to ensure that it is + available for as long as needed to satisfy these requirements. + + e) Convey the object code using peer-to-peer transmission, provided + you inform other peers where the object code and Corresponding + Source of the work are being offered to the general public at no + charge under subsection 6d. + + A separable portion of the object code, whose source code is excluded +from the Corresponding Source as a System Library, need not be +included in conveying the object code work. + + A "User Product" is either (1) a "consumer product", which means any +tangible personal property which is normally used for personal, family, +or household purposes, or (2) anything designed or sold for incorporation +into a dwelling. In determining whether a product is a consumer product, +doubtful cases shall be resolved in favor of coverage. For a particular +product received by a particular user, "normally used" refers to a +typical or common use of that class of product, regardless of the status +of the particular user or of the way in which the particular user +actually uses, or expects or is expected to use, the product. A product +is a consumer product regardless of whether the product has substantial +commercial, industrial or non-consumer uses, unless such uses represent +the only significant mode of use of the product. + + "Installation Information" for a User Product means any methods, +procedures, authorization keys, or other information required to install +and execute modified versions of a covered work in that User Product from +a modified version of its Corresponding Source. The information must +suffice to ensure that the continued functioning of the modified object +code is in no case prevented or interfered with solely because +modification has been made. + + If you convey an object code work under this section in, or with, or +specifically for use in, a User Product, and the conveying occurs as +part of a transaction in which the right of possession and use of the +User Product is transferred to the recipient in perpetuity or for a +fixed term (regardless of how the transaction is characterized), the +Corresponding Source conveyed under this section must be accompanied +by the Installation Information. But this requirement does not apply +if neither you nor any third party retains the ability to install +modified object code on the User Product (for example, the work has +been installed in ROM). + + The requirement to provide Installation Information does not include a +requirement to continue to provide support service, warranty, or updates +for a work that has been modified or installed by the recipient, or for +the User Product in which it has been modified or installed. Access to a +network may be denied when the modification itself materially and +adversely affects the operation of the network or violates the rules and +protocols for communication across the network. + + Corresponding Source conveyed, and Installation Information provided, +in accord with this section must be in a format that is publicly +documented (and with an implementation available to the public in +source code form), and must require no special password or key for +unpacking, reading or copying. + + 7. Additional Terms. + + "Additional permissions" are terms that supplement the terms of this +License by making exceptions from one or more of its conditions. +Additional permissions that are applicable to the entire Program shall +be treated as though they were included in this License, to the extent +that they are valid under applicable law. If additional permissions +apply only to part of the Program, that part may be used separately +under those permissions, but the entire Program remains governed by +this License without regard to the additional permissions. + + When you convey a copy of a covered work, you may at your option +remove any additional permissions from that copy, or from any part of +it. (Additional permissions may be written to require their own +removal in certain cases when you modify the work.) You may place +additional permissions on material, added by you to a covered work, +for which you have or can give appropriate copyright permission. + + Notwithstanding any other provision of this License, for material you +add to a covered work, you may (if authorized by the copyright holders of +that material) supplement the terms of this License with terms: + + a) Disclaiming warranty or limiting liability differently from the + terms of sections 15 and 16 of this License; or + + b) Requiring preservation of specified reasonable legal notices or + author attributions in that material or in the Appropriate Legal + Notices displayed by works containing it; or + + c) Prohibiting misrepresentation of the origin of that material, or + requiring that modified versions of such material be marked in + reasonable ways as different from the original version; or + + d) Limiting the use for publicity purposes of names of licensors or + authors of the material; or + + e) Declining to grant rights under trademark law for use of some + trade names, trademarks, or service marks; or + + f) Requiring indemnification of licensors and authors of that + material by anyone who conveys the material (or modified versions of + it) with contractual assumptions of liability to the recipient, for + any liability that these contractual assumptions directly impose on + those licensors and authors. + + All other non-permissive additional terms are considered "further +restrictions" within the meaning of section 10. If the Program as you +received it, or any part of it, contains a notice stating that it is +governed by this License along with a term that is a further +restriction, you may remove that term. If a license document contains +a further restriction but permits relicensing or conveying under this +License, you may add to a covered work material governed by the terms +of that license document, provided that the further restriction does +not survive such relicensing or conveying. + + If you add terms to a covered work in accord with this section, you +must place, in the relevant source files, a statement of the +additional terms that apply to those files, or a notice indicating +where to find the applicable terms. + + Additional terms, permissive or non-permissive, may be stated in the +form of a separately written license, or stated as exceptions; +the above requirements apply either way. + + 8. Termination. + + You may not propagate or modify a covered work except as expressly +provided under this License. Any attempt otherwise to propagate or +modify it is void, and will automatically terminate your rights under +this License (including any patent licenses granted under the third +paragraph of section 11). + + However, if you cease all violation of this License, then your +license from a particular copyright holder is reinstated (a) +provisionally, unless and until the copyright holder explicitly and +finally terminates your license, and (b) permanently, if the copyright +holder fails to notify you of the violation by some reasonable means +prior to 60 days after the cessation. + + Moreover, your license from a particular copyright holder is +reinstated permanently if the copyright holder notifies you of the +violation by some reasonable means, this is the first time you have +received notice of violation of this License (for any work) from that +copyright holder, and you cure the violation prior to 30 days after +your receipt of the notice. + + Termination of your rights under this section does not terminate the +licenses of parties who have received copies or rights from you under +this License. If your rights have been terminated and not permanently +reinstated, you do not qualify to receive new licenses for the same +material under section 10. + + 9. Acceptance Not Required for Having Copies. + + You are not required to accept this License in order to receive or +run a copy of the Program. Ancillary propagation of a covered work +occurring solely as a consequence of using peer-to-peer transmission +to receive a copy likewise does not require acceptance. However, +nothing other than this License grants you permission to propagate or +modify any covered work. These actions infringe copyright if you do +not accept this License. Therefore, by modifying or propagating a +covered work, you indicate your acceptance of this License to do so. + + 10. Automatic Licensing of Downstream Recipients. + + Each time you convey a covered work, the recipient automatically +receives a license from the original licensors, to run, modify and +propagate that work, subject to this License. You are not responsible +for enforcing compliance by third parties with this License. + + An "entity transaction" is a transaction transferring control of an +organization, or substantially all assets of one, or subdividing an +organization, or merging organizations. If propagation of a covered +work results from an entity transaction, each party to that +transaction who receives a copy of the work also receives whatever +licenses to the work the party's predecessor in interest had or could +give under the previous paragraph, plus a right to possession of the +Corresponding Source of the work from the predecessor in interest, if +the predecessor has it or can get it with reasonable efforts. + + You may not impose any further restrictions on the exercise of the +rights granted or affirmed under this License. For example, you may +not impose a license fee, royalty, or other charge for exercise of +rights granted under this License, and you may not initiate litigation +(including a cross-claim or counterclaim in a lawsuit) alleging that +any patent claim is infringed by making, using, selling, offering for +sale, or importing the Program or any portion of it. + + 11. Patents. + + A "contributor" is a copyright holder who authorizes use under this +License of the Program or a work on which the Program is based. The +work thus licensed is called the contributor's "contributor version". + + A contributor's "essential patent claims" are all patent claims +owned or controlled by the contributor, whether already acquired or +hereafter acquired, that would be infringed by some manner, permitted +by this License, of making, using, or selling its contributor version, +but do not include claims that would be infringed only as a +consequence of further modification of the contributor version. For +purposes of this definition, "control" includes the right to grant +patent sublicenses in a manner consistent with the requirements of +this License. + + Each contributor grants you a non-exclusive, worldwide, royalty-free +patent license under the contributor's essential patent claims, to +make, use, sell, offer for sale, import and otherwise run, modify and +propagate the contents of its contributor version. + + In the following three paragraphs, a "patent license" is any express +agreement or commitment, however denominated, not to enforce a patent +(such as an express permission to practice a patent or covenant not to +sue for patent infringement). To "grant" such a patent license to a +party means to make such an agreement or commitment not to enforce a +patent against the party. + + If you convey a covered work, knowingly relying on a patent license, +and the Corresponding Source of the work is not available for anyone +to copy, free of charge and under the terms of this License, through a +publicly available network server or other readily accessible means, +then you must either (1) cause the Corresponding Source to be so +available, or (2) arrange to deprive yourself of the benefit of the +patent license for this particular work, or (3) arrange, in a manner +consistent with the requirements of this License, to extend the patent +license to downstream recipients. "Knowingly relying" means you have +actual knowledge that, but for the patent license, your conveying the +covered work in a country, or your recipient's use of the covered work +in a country, would infringe one or more identifiable patents in that +country that you have reason to believe are valid. + + If, pursuant to or in connection with a single transaction or +arrangement, you convey, or propagate by procuring conveyance of, a +covered work, and grant a patent license to some of the parties +receiving the covered work authorizing them to use, propagate, modify +or convey a specific copy of the covered work, then the patent license +you grant is automatically extended to all recipients of the covered +work and works based on it. + + A patent license is "discriminatory" if it does not include within +the scope of its coverage, prohibits the exercise of, or is +conditioned on the non-exercise of one or more of the rights that are +specifically granted under this License. You may not convey a covered +work if you are a party to an arrangement with a third party that is +in the business of distributing software, under which you make payment +to the third party based on the extent of your activity of conveying +the work, and under which the third party grants, to any of the +parties who would receive the covered work from you, a discriminatory +patent license (a) in connection with copies of the covered work +conveyed by you (or copies made from those copies), or (b) primarily +for and in connection with specific products or compilations that +contain the covered work, unless you entered into that arrangement, +or that patent license was granted, prior to 28 March 2007. + + Nothing in this License shall be construed as excluding or limiting +any implied license or other defenses to infringement that may +otherwise be available to you under applicable patent law. + + 12. No Surrender of Others' Freedom. + + If conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot convey a +covered work so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you may +not convey it at all. For example, if you agree to terms that obligate you +to collect a royalty for further conveying from those to whom you convey +the Program, the only way you could satisfy both those terms and this +License would be to refrain entirely from conveying the Program. + + 13. Use with the GNU Affero General Public License. + + Notwithstanding any other provision of this License, you have +permission to link or combine any covered work with a work licensed +under version 3 of the GNU Affero General Public License into a single +combined work, and to convey the resulting work. The terms of this +License will continue to apply to the part which is the covered work, +but the special requirements of the GNU Affero General Public License, +section 13, concerning interaction through a network will apply to the +combination as such. + + 14. Revised Versions of this License. + + The Free Software Foundation may publish revised and/or new versions of +the GNU General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + + Each version is given a distinguishing version number. If the +Program specifies that a certain numbered version of the GNU General +Public License "or any later version" applies to it, you have the +option of following the terms and conditions either of that numbered +version or of any later version published by the Free Software +Foundation. If the Program does not specify a version number of the +GNU General Public License, you may choose any version ever published +by the Free Software Foundation. + + If the Program specifies that a proxy can decide which future +versions of the GNU General Public License can be used, that proxy's +public statement of acceptance of a version permanently authorizes you +to choose that version for the Program. + + Later license versions may give you additional or different +permissions. However, no additional obligations are imposed on any +author or copyright holder as a result of your choosing to follow a +later version. + + 15. Disclaimer of Warranty. + + THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY +APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT +HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY +OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, +THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM +IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF +ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. Limitation of Liability. + + IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS +THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY +GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE +USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF +DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD +PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), +EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF +SUCH DAMAGES. + + 17. Interpretation of Sections 15 and 16. + + If the disclaimer of warranty and limitation of liability provided +above cannot be given local legal effect according to their terms, +reviewing courts shall apply local law that most closely approximates +an absolute waiver of all civil liability in connection with the +Program, unless a warranty or assumption of liability accompanies a +copy of the Program in return for a fee. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +state the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + +Also add information on how to contact you by electronic and paper mail. + + If the program does terminal interaction, make it output a short +notice like this when it starts in an interactive mode: + + Copyright (C) + This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, your program's commands +might be different; for a GUI interface, you would use an "about box". + + You should also get your employer (if you work as a programmer) or school, +if any, to sign a "copyright disclaimer" for the program, if necessary. +For more information on this, and how to apply and follow the GNU GPL, see +. + + The GNU General Public License does not permit incorporating your program +into proprietary programs. If your program is a subroutine library, you +may consider it more useful to permit linking proprietary applications with +the library. If this is what you want to do, use the GNU Lesser General +Public License instead of this License. But first, please read +. diff --git a/deepin-community-live-cd-online-installer/README.md b/deepin-community-live-cd-online-installer/README.md new file mode 100644 index 0000000..7b35b75 --- /dev/null +++ b/deepin-community-live-cd-online-installer/README.md @@ -0,0 +1,15 @@ +# Deepin Community Live CD 在线系统安装工具 +Deepin Community Live CD 在线安装工具是一个能在 Live CD 上自动从互联网获取系统安装包安装系统的工具 +目前支持安装 Debian +该程序依照 GPLV3 开源 + +## 编译方法 +```bash +sudo apt install qt5-default git make +git clone https://gitee.com/gfdgd-xi/deepin-community-live-cd-online-installer +cd deepin-community-live-cd-online-installer +qmake . +make -j4 +``` + +## ©2022~Now gfdgd xi \ No newline at end of file diff --git a/deepin-community-live-cd-online-installer/aboutprogram.cpp b/deepin-community-live-cd-online-installer/aboutprogram.cpp new file mode 100644 index 0000000..a7fec93 --- /dev/null +++ b/deepin-community-live-cd-online-installer/aboutprogram.cpp @@ -0,0 +1,32 @@ +#include "aboutprogram.h" +#include "ui_aboutprogram.h" +#include + +AboutProgram::AboutProgram(QWidget *parent) : + QDialog(parent), + ui(new Ui::AboutProgram) +{ + ui->setupUi(this); + // 获取当前年份 + QDate currentdate = QDate::currentDate(); + int year = currentdate.year(); + // 显示关于内容 + ui->information->setHtml("

Deepin Community Live CD 在线安装工具是一个能在 Live CD 上自动从互联网获取系统安装包安装系统的工具

"\ + "

目前支持安装 Debian

"\ + "

程序版本:" + QString(APP_VERSION) + "

"\ + "

QQ 交流群:881201853

"\ + "

本程序依照 GPLV3 协议开源

"\ + "
"\ + "

程序地址:

"\ + "
\n"\
+                             "Gitee:https://gitee.com/gfdgd-xi/deepin-community-live-cd-online-installer\n"\
+                             "Github:https://github.com/gfdgd-xi/deepin-community-live-cd-online-installer\n"\
+                             "
"\ + "
"\ + "

©2022~" + QString::number(year) + " gfdgd xi

"); +} + +AboutProgram::~AboutProgram() +{ + delete ui; +} diff --git a/deepin-community-live-cd-online-installer/aboutprogram.h b/deepin-community-live-cd-online-installer/aboutprogram.h new file mode 100644 index 0000000..bc5f5bf --- /dev/null +++ b/deepin-community-live-cd-online-installer/aboutprogram.h @@ -0,0 +1,22 @@ +#ifndef ABOUTPROGRAM_H +#define ABOUTPROGRAM_H + +#include + +namespace Ui { +class AboutProgram; +} + +class AboutProgram : public QDialog +{ + Q_OBJECT + +public: + explicit AboutProgram(QWidget *parent = nullptr); + ~AboutProgram(); + +private: + Ui::AboutProgram *ui; +}; + +#endif // ABOUTPROGRAM_H diff --git a/deepin-community-live-cd-online-installer/aboutprogram.ui b/deepin-community-live-cd-online-installer/aboutprogram.ui new file mode 100644 index 0000000..fff7c42 --- /dev/null +++ b/deepin-community-live-cd-online-installer/aboutprogram.ui @@ -0,0 +1,91 @@ + + + AboutProgram + + + + 0 + 0 + 732 + 487 + + + + Dialog + + + + + + Qt::Horizontal + + + QDialogButtonBox::Cancel|QDialogButtonBox::Ok + + + + + + + + + <img src=":/icon/icon.svg" width=256> + + + + + + + Qt::Vertical + + + + 20 + 40 + + + + + + + + + + + + + + + buttonBox + accepted() + AboutProgram + accept() + + + 248 + 254 + + + 157 + 274 + + + + + buttonBox + rejected() + AboutProgram + reject() + + + 316 + 260 + + + 286 + 274 + + + + + diff --git a/deepin-community-live-cd-online-installer/deepin-community-live-cd-online-installer.pro b/deepin-community-live-cd-online-installer/deepin-community-live-cd-online-installer.pro new file mode 100644 index 0000000..892f052 --- /dev/null +++ b/deepin-community-live-cd-online-installer/deepin-community-live-cd-online-installer.pro @@ -0,0 +1,54 @@ +QT += core gui network +#QT += qtermwidget + +greaterThan(QT_MAJOR_VERSION, 4): QT += widgets + +CONFIG += c++17 + +# 程序版本号 +VERSION = 1.0.0 +DEFINES += APP_VERSION=\\\"$$VERSION\\\" + +# You can make your code fail to compile if it uses deprecated APIs. +# In order to do so, uncomment the following line. +#DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000 # disables all the APIs deprecated before Qt 6.0.0 + +SOURCES += \ + aboutprogram.cpp \ + diskcontrol.cpp \ + editpartdialog.cpp \ + installsystem.cpp \ + installsystemwindow.cpp \ + main.cpp \ + mainwindow.cpp \ + runcommandinterminal.cpp + +HEADERS += \ + aboutprogram.h \ + diskcontrol.h \ + editpartdialog.h \ + installsystem.h \ + installsystemwindow.h \ + mainwindow.h \ + runcommandinterminal.h + +FORMS += \ + aboutprogram.ui \ + editpartdialog.ui \ + installsystemwindow.ui \ + mainwindow.ui + +TRANSLATIONS += \ + deepin-community-live-cd-online-installer_zh_CN.ts +CONFIG += lrelease +CONFIG += embed_translations + +# Default rules for deployment. +qnx: target.path = /tmp/$${TARGET}/bin +else: unix:!android: target.path = /opt/$${TARGET}/bin +!isEmpty(target.path): INSTALLS += target + +RESOURCES += \ + icon.qrc + +unix:!macx: LIBS += -lqtermwidget5 # 这一行让我查了好久 diff --git a/deepin-community-live-cd-online-installer/deepin-community-live-cd-online-installer_zh_CN.ts b/deepin-community-live-cd-online-installer/deepin-community-live-cd-online-installer_zh_CN.ts new file mode 100644 index 0000000..630fd35 --- /dev/null +++ b/deepin-community-live-cd-online-installer/deepin-community-live-cd-online-installer_zh_CN.ts @@ -0,0 +1,3 @@ + + + diff --git a/deepin-community-live-cd-online-installer/diskcontrol.cpp b/deepin-community-live-cd-online-installer/diskcontrol.cpp new file mode 100644 index 0000000..5b94d97 --- /dev/null +++ b/deepin-community-live-cd-online-installer/diskcontrol.cpp @@ -0,0 +1,65 @@ +#include "diskcontrol.h" +#include +#include +#include +#include +#include + +#include + +DiskControl::DiskControl() +{ + // 检测是否以 root 权限运行 + // 该库需要以 root 权限运行 + if(!geteuid() == 0){ + throw "Please run program with root!"; + } +} + +// 获取命令输出 +QString DiskControl::GetCommandReturn(QString command){ + QProcess process; + process.start(command); + process.waitForFinished(); + QString result = process.readAllStandardOutput(); + process.close(); + return result; +} + +void DiskControl::GetDiskInfo(QStringList *diskPath, QStringList *diskFormat, QStringList *freeSpaceList, QStringList *totalSpaceList, QStringList *mountPathList){ + // 清空列表 + diskPath->clear(); + diskFormat->clear(); + freeSpaceList->clear(); + totalSpaceList->clear(); + mountPathList->clear(); + QStringList diskList; + QString infoStr = GetCommandReturn("fdisk -l"); + // 筛选字符串 + QStringList oldList = infoStr.split("\n"); + // 获取分区列表 + for(int i = 0; i < oldList.size(); i++){ + QString info = oldList.at(i); + // 判断是不是分区 + if(info.trimmed().mid(0, 5) == "/dev/"){ + // 二次筛选出路径 + QStringList diskInfoList = info.split(" "); + QString disk = diskInfoList.at(0); + diskPath->append(disk); + // 筛选分区格式 + //diskFormat->append(diskInfoList.at(diskInfoList.count() - 1)); + } + + } + // 获取分区格式和大小 + for (int i = 0; i < diskPath->size(); i++){ + QString disk = diskPath->at(i); + QStringList resultList = GetCommandReturn("df -H -T " + disk + "").split("\n").at(1).trimmed().split(" "); + resultList.removeAll(""); + qDebug() << resultList; + diskFormat->append(resultList.at(1)); + mountPathList->append(resultList.at(resultList.count() - 1)); + freeSpaceList->append(resultList.at(resultList.count() - 3)); + totalSpaceList->append(resultList.at(resultList.count() - 5)); + } +} diff --git a/deepin-community-live-cd-online-installer/diskcontrol.h b/deepin-community-live-cd-online-installer/diskcontrol.h new file mode 100644 index 0000000..ac0ed0e --- /dev/null +++ b/deepin-community-live-cd-online-installer/diskcontrol.h @@ -0,0 +1,17 @@ +#ifndef DISKCONTROL_H +#define DISKCONTROL_H + +#include + +class DiskControl +{ +private: + QString GetCommandReturn(QString command); + +public: + DiskControl(); + + void GetDiskInfo(QStringList *diskPath, QStringList *diskFormat, QStringList *freeSpaceList, QStringList *totalSpaceList, QStringList *mountPathList); +}; + +#endif // DISKCONTROL_H diff --git a/deepin-community-live-cd-online-installer/editpartdialog.cpp b/deepin-community-live-cd-online-installer/editpartdialog.cpp new file mode 100644 index 0000000..22e810d --- /dev/null +++ b/deepin-community-live-cd-online-installer/editpartdialog.cpp @@ -0,0 +1,56 @@ +#include "editpartdialog.h" +#include "ui_editpartdialog.h" + +EditPartDialog::EditPartDialog(QString part, QMap *partSetMountPoint, QMap *partSetPartFormat, QWidget *parent) : + QDialog(parent), + ui(new Ui::EditPartDialog) +{ + ui->setupUi(this); + // 设置标题 + this->setWindowTitle("编辑分区 " + part); + // 设置该 .h 下的全局变量 + this->partSetMountPoint = partSetMountPoint; + this->partSetPartFormat = partSetPartFormat; + this->part = part; + // 判断之前有没有选择,有的话自动填写 + if(partSetMountPoint->count(part)){ + ui->mountPointChooser->setCurrentText(partSetMountPoint->value(part)); + } + if(partSetPartFormat->count(part)){ + ui->partFormatChooser->setCurrentText(partSetPartFormat->value(part)); + } +} + +EditPartDialog::~EditPartDialog() +{ + delete ui; +} + +void EditPartDialog::on_buttonBox_accepted() +{ + // 判断选择的是不是有挂载点 + if(ui->mountPointChooser->currentIndex() == 0){ + // 如果不是 + if(partSetMountPoint->count(part)){ + // 移除标识 + partSetMountPoint->remove(part); + } + } + else{ + // 否则添加标识 + partSetMountPoint->insert(part, ui->mountPointChooser->currentText()); + } + // 判断选择的是不是格式化 + if(ui->partFormatChooser->currentIndex() == 0){ + // 如果不是 + if(partSetPartFormat->count(part)){ + partSetPartFormat->remove(part); + } + } + else{ + // 否则添加标识 + partSetPartFormat->insert(part, ui->partFormatChooser->currentText()); + } + +} + diff --git a/deepin-community-live-cd-online-installer/editpartdialog.h b/deepin-community-live-cd-online-installer/editpartdialog.h new file mode 100644 index 0000000..151392f --- /dev/null +++ b/deepin-community-live-cd-online-installer/editpartdialog.h @@ -0,0 +1,28 @@ +#ifndef EDITPARTDIALOG_H +#define EDITPARTDIALOG_H + +#include + +namespace Ui { +class EditPartDialog; +} + +class EditPartDialog : public QDialog +{ + Q_OBJECT + +public: + explicit EditPartDialog(QString part, QMap *partSetMountPoint, QMap *partSetPartFormat, QWidget *parent = nullptr); + ~EditPartDialog(); + +private slots: + void on_buttonBox_accepted(); + +private: + Ui::EditPartDialog *ui; + QMap *partSetMountPoint; + QMap *partSetPartFormat; + QString part; +}; + +#endif // EDITPARTDIALOG_H diff --git a/deepin-community-live-cd-online-installer/editpartdialog.ui b/deepin-community-live-cd-online-installer/editpartdialog.ui new file mode 100644 index 0000000..f7e545e --- /dev/null +++ b/deepin-community-live-cd-online-installer/editpartdialog.ui @@ -0,0 +1,219 @@ + + + EditPartDialog + + + + 0 + 0 + 400 + 300 + + + + 编辑分区 + + + + :/icon/icon.svg:/icon/icon.svg + + + + + + + + + 不设置挂载点 + + + + + / + + + + + /boot + + + + + /boot/efi + + + + + /home + + + + + /opt + + + + + /usr + + + + + + + + + 不格式化 + + + + + ext2 + + + + + ext3 + + + + + ext4 + + + + + bfs + + + + + btrfs + + + + + cramfs + + + + + exfat + + + + + fat + + + + + minix + + + + + msdos + + + + + ntfs + + + + + reiserfs + + + + + vfat + + + + + xfs + + + + + + + + 分区格式: + + + + + + + Qt::Vertical + + + + 20 + 40 + + + + + + + + 挂载点: + + + + + + + + + Qt::Vertical + + + QDialogButtonBox::Cancel|QDialogButtonBox::Ok + + + + + + + + + + + buttonBox + accepted() + EditPartDialog + accept() + + + 248 + 254 + + + 157 + 274 + + + + + buttonBox + rejected() + EditPartDialog + reject() + + + 316 + 260 + + + 286 + 274 + + + + + diff --git a/deepin-community-live-cd-online-installer/icon.png b/deepin-community-live-cd-online-installer/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..56d76a7ec96ce0079c32406d94543af355c259cc GIT binary patch literal 39856 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 literal 0 HcmV?d00001 diff --git a/deepin-community-live-cd-online-installer/icon.qrc b/deepin-community-live-cd-online-installer/icon.qrc new file mode 100644 index 0000000..4e1e0d6 --- /dev/null +++ b/deepin-community-live-cd-online-installer/icon.qrc @@ -0,0 +1,10 @@ + + + icon.png + icon.svg + no.png + no.svg + yes.png + yes.svg + + diff --git a/deepin-community-live-cd-online-installer/icon.svg b/deepin-community-live-cd-online-installer/icon.svg new file mode 100644 index 0000000..69c0466 --- /dev/null +++ b/deepin-community-live-cd-online-installer/icon.svg @@ -0,0 +1,1033 @@ + + + + diff --git a/deepin-community-live-cd-online-installer/installsystem.cpp b/deepin-community-live-cd-online-installer/installsystem.cpp new file mode 100644 index 0000000..857219f --- /dev/null +++ b/deepin-community-live-cd-online-installer/installsystem.cpp @@ -0,0 +1,16 @@ +#include "installsystem.h" +#include "runcommandinterminal.h" +#include +#include +#include + +InstallSystem::InstallSystem(QTermWidget *terminal, QProgressBar *progressbar, QMap partSetPartFormat, QMap partSetMountPoint) +{ + this->terminal = terminal; + this->progressbar = progressbar; + this->partSetMountPoint = partSetMountPoint; + this->partSetPartFormat = partSetPartFormat; + this->command = new RunCommandInTerminal(this->terminal, this->progressbar); + this->command->AddCommand("zenity --info"); + this->command->RunCommand(); +} diff --git a/deepin-community-live-cd-online-installer/installsystem.h b/deepin-community-live-cd-online-installer/installsystem.h new file mode 100644 index 0000000..cc588d4 --- /dev/null +++ b/deepin-community-live-cd-online-installer/installsystem.h @@ -0,0 +1,22 @@ +#ifndef INSTALLSYSTEM_H +#define INSTALLSYSTEM_H + +#include "runcommandinterminal.h" +#include +#include +#include +#include + +class InstallSystem +{ +public: + InstallSystem(QTermWidget *terminal, QProgressBar *progressbar, QMap partSetPartFormat, QMap partSetMountPoint); +private: + QTermWidget *terminal; + QProgressBar *progressbar; + QMap partSetPartFormat; + QMap partSetMountPoint; + RunCommandInTerminal *command; +}; + +#endif // INSTALLSYSTEM_H diff --git a/deepin-community-live-cd-online-installer/installsystemwindow.cpp b/deepin-community-live-cd-online-installer/installsystemwindow.cpp new file mode 100644 index 0000000..c5e6c5e --- /dev/null +++ b/deepin-community-live-cd-online-installer/installsystemwindow.cpp @@ -0,0 +1,32 @@ +#include "installsystemwindow.h" +#include "ui_installsystemwindow.h" +#include "installsystem.h" +#include +#include +#include +#include +//#include + +InstallSystemWindow::InstallSystemWindow(QMap partSetPartFormat, QMap partSetMountPoint, QWidget *parent) : + QMainWindow(parent), + ui(new Ui::InstallSystemWindow) +{ + ui->setupUi(this); + QTermWidget *ter = new QTermWidget(0); + ui->verticalLayout->addWidget(ter); + InstallSystem *system = new InstallSystem(ter, ui->progressBar, partSetPartFormat, partSetMountPoint); + /*ter->setColorScheme("DarkPastels"); + ter->setShellProgram("/usr/bin/bash"); + ter->setArgs(QStringList() << "-c" << "gedit"); + ter->setAutoClose(0); + ter->setAutoFillBackground(1); + //ter->setTerminalBackgroundImage("/home/gfdgd_xi/Pictures/有兽档案馆Banner.png"); + ter->startShellProgram(); + connect(ter, &QTermWidget::finished, this, [&, this](){QMessageBox::information(NULL, "提示", "系统安装完成");});*/ + +} + +InstallSystemWindow::~InstallSystemWindow() +{ + delete ui; +} diff --git a/deepin-community-live-cd-online-installer/installsystemwindow.h b/deepin-community-live-cd-online-installer/installsystemwindow.h new file mode 100644 index 0000000..bb5d24a --- /dev/null +++ b/deepin-community-live-cd-online-installer/installsystemwindow.h @@ -0,0 +1,22 @@ +#ifndef INSTALLSYSTEMWINDOW_H +#define INSTALLSYSTEMWINDOW_H + +#include + +namespace Ui { +class InstallSystemWindow; +} + +class InstallSystemWindow : public QMainWindow +{ + Q_OBJECT + +public: + explicit InstallSystemWindow(QMap partSetPartFormat, QMap partSetMountPoint, QWidget *parent = nullptr); + ~InstallSystemWindow(); + +private: + Ui::InstallSystemWindow *ui; +}; + +#endif // INSTALLSYSTEMWINDOW_H diff --git a/deepin-community-live-cd-online-installer/installsystemwindow.ui b/deepin-community-live-cd-online-installer/installsystemwindow.ui new file mode 100644 index 0000000..66a5cf8 --- /dev/null +++ b/deepin-community-live-cd-online-installer/installsystemwindow.ui @@ -0,0 +1,41 @@ + + + InstallSystemWindow + + + + 0 + 0 + 800 + 600 + + + + MainWindow + + + + + + + 24 + + + + + + + + + 0 + 0 + 800 + 36 + + + + + + + + diff --git a/deepin-community-live-cd-online-installer/main.cpp b/deepin-community-live-cd-online-installer/main.cpp new file mode 100644 index 0000000..6e7ab86 --- /dev/null +++ b/deepin-community-live-cd-online-installer/main.cpp @@ -0,0 +1,32 @@ +#include "mainwindow.h" + +#include +#include +#include +#include +#include +#include +#include + +int main(int argc, char *argv[]) +{ + QApplication a(argc, argv); + // 设置允许 qDebug 输出 + QLoggingCategory::defaultCategory()->setEnabled(QtDebugMsg, true); + QTranslator translator; + const QStringList uiLanguages = QLocale::system().uiLanguages(); + for (const QString &locale : uiLanguages) { + const QString baseName = "deepin-community-live-cd-online-installer_" + QLocale(locale).name(); + if (translator.load(":/i18n/" + baseName)) { + a.installTranslator(&translator); + break; + } + } + if(geteuid() != 0){ + QMessageBox::critical(NULL, "错误", "请用 root 权限运行该程序"); + return 1; + } + MainWindow w; + w.show(); + return a.exec(); +} diff --git a/deepin-community-live-cd-online-installer/mainwindow.cpp b/deepin-community-live-cd-online-installer/mainwindow.cpp new file mode 100644 index 0000000..bfae939 --- /dev/null +++ b/deepin-community-live-cd-online-installer/mainwindow.cpp @@ -0,0 +1,352 @@ +#include "mainwindow.h" +#include "ui_mainwindow.h" +#include +#include +#include +#include +#include +#include +#include +#include "diskcontrol.h" +#include "editpartdialog.h" +#include "aboutprogram.h" +#include "installsystemwindow.h" + +MainWindow::MainWindow(QWidget *parent) + : QMainWindow(parent) + , ui(new Ui::MainWindow) +{ + ui->setupUi(this); + QString info = GetCommandReturn("dmesg"); + bool uefiBoot = info.contains("EFI v"); + // 设置程序标题 + + this->setWindowTitle("Deepin Community Live CD 安装工具 " + QString(APP_VERSION)); + if(uefiBoot){ + this->setWindowTitle(this->windowTitle() + "(UEFI启动)"); + } + else{ + this->setWindowTitle(this->windowTitle() + "(传统启动)"); + } + SetDiskList(ui->diskChooser); + // 设置用户名和计算机名只能输入字母和数字 + ui->userName->setValidator(new QRegExpValidator(QRegExp("[a-zA-Z0-9]+-+_+$"))); + ui->hostName->setValidator(new QRegExpValidator(QRegExp("[a-zA-Z0-9]+-+_+$"))); + // 读取当前用户名 + ui->userName->setText(qgetenv("USER")); + // 读取当前计算机名 + ui->hostName->setText(QHostInfo::localHostName()); + +} + +MainWindow::~MainWindow() +{ + delete ui; +} + +QStringList MainWindow::GetDiskList(){ + +} + +void MainWindow::SetDiskList(QTableView *diskListWidget){ + QStandardItemModel *nmodel = new QStandardItemModel(this); + // 设置表头 + nmodel->setColumnCount(6); + nmodel->setHeaderData(0, Qt::Horizontal, "分区"); + nmodel->setHeaderData(1, Qt::Horizontal, "分区格式"); + nmodel->setHeaderData(2, Qt::Horizontal, "剩余空间"); + nmodel->setHeaderData(3, Qt::Horizontal, "全部空间"); + nmodel->setHeaderData(4, Qt::Horizontal, "设置挂载点"); + nmodel->setHeaderData(5, Qt::Horizontal, "是否格式化"); + //nmodel->setHeaderData(6, Qt::Horizontal, ""); + // 设置不可编辑 + diskListWidget->setEditTriggers(QAbstractItemView::NoEditTriggers); + // 设置选择整行且只能单选 + diskListWidget->setSelectionBehavior(QAbstractItemView::SelectRows); + diskListWidget->setSelectionMode(QAbstractItemView::SingleSelection); + // 显示信息 + DiskControl diskControl; + QStringList diskPathList; + QStringList diskFormatList; + QStringList mountPathList; + QStringList freeSpaceList; + QStringList totalSpaceList; + diskControl.GetDiskInfo(&diskPathList, &diskFormatList, &freeSpaceList, &totalSpaceList, &mountPathList); + qDebug() << "=======Disk========="; + qDebug() << diskPathList; + qDebug() << diskFormatList; + qDebug() << mountPathList; + qDebug() << freeSpaceList; + qDebug() << totalSpaceList; + int count = diskPathList.size(); + for(int i = 0; i < count; i++){ + QString diskPath = diskPathList.at(i); + nmodel->setItem(i, 0, new QStandardItem(diskPath)); + nmodel->setItem(i, 1, new QStandardItem(diskFormatList.at(i))); + nmodel->setItem(i, 2, new QStandardItem(freeSpaceList.at(i))); + nmodel->setItem(i, 3, new QStandardItem(totalSpaceList.at(i))); + if(partSetMountPoint.count(diskPath)){ + nmodel->setItem(i, 4, new QStandardItem(partSetMountPoint.value(diskPath))); + } + if(partSetPartFormat.count(diskPath)){ + nmodel->setItem(i, 5, new QStandardItem(partSetPartFormat.value(diskPath))); + } + } + diskListWidget->setModel(nmodel); +} + +// 退出程序 +void MainWindow::on_action_exit_triggered() +{ + QApplication *app; + app->exit(); +} + + +void MainWindow::on_refreshDiskList_clicked() +{ + SetDiskList(ui->diskChooser); +} + + +void MainWindow::on_editChoosePart_clicked() +{ + // 获取选择内容 + int index = ui->diskChooser->currentIndex().row(); + if(index == -1){ + QMessageBox::information(this, "提示", "请先选择分区才能编辑"); + return; + } + QAbstractItemModel *model = ui->diskChooser->model(); + QString part = model->index(index, 0).data().toString(); + // 创建对话框 + EditPartDialog *dialog = new EditPartDialog(part, &partSetMountPoint, &partSetPartFormat, this); + // 堵塞线程 + dialog->setAttribute(Qt::WA_ShowModal, true); + dialog->show(); + if(dialog->exec()){ + // 只有在按确定时才刷新列表 + SetDiskList(ui->diskChooser); + QString showMsg = "当前状态:设置" + part; + if(partSetMountPoint.count(part)){ + showMsg += "挂载点为" + partSetMountPoint.value(part); + } + if(partSetPartFormat.count(part)){ + showMsg += "并格式化为" + partSetPartFormat.value(part) + "格式"; + } + ui->statusbar->showMessage(showMsg); + } + delete dialog; +} + + +void MainWindow::on_userName_textChanged(const QString &arg1) +{ + // 自动清除空格 + ui->userName->setText(ui->userName->text().replace(" ", "")); + // 用户名检测 + if(ui->userName->text().size() < 2){ + ui->userNameTips->setText("用户名:×用户名过短"); + } + else if(ui->userName->text() == "root"){ + ui->userNameTips->setText("用户名:×该用户名不合法"); + } + else{ + ui->userNameTips->setText("用户名:"); + } + // 检测是否有中文 + QString userName = ui->userName->text(); + for(int i = 0; i < userName.size(); i++){ + QChar cha = userName.at(i); + ushort uni = cha.unicode(); + if(uni >= 0x4E00 && uni <= 0x9FA5){ + // 含有中文 + ui->userNameTips->setText("用户名:×该用户名不合法(不能有中文)"); + break; + } + if(specialSymbol.contains(userName.at(i))){ + ui->userNameTips->setText("用户名:×不能含有特殊符号"); + break; + } + } +} + + +void MainWindow::on_hostName_textChanged(const QString &arg1) +{ + // 自动清除空格 + ui->hostName->setText(ui->hostName->text().replace(" ", "")); + // 计算机名检测 + if(ui->hostName->text().size() < 2){ + ui->hostNameTips->setText("主机名:×主机名过短"); + } + else{ + ui->hostNameTips->setText("主机名:"); + } + // 检测是否有中文 + QString userName = ui->hostName->text(); + for(int i = 0; i < userName.size(); i++){ + QChar cha = userName.at(i); + ushort uni = cha.unicode(); + if(uni >= 0x4E00 && uni <= 0x9FA5){ + // 含有中文 + ui->hostNameTips->setText("用户名:×该用户名不合法(不能有中文)"); + break; + } + if(specialSymbol.contains(userName.at(i))){ + ui->userNameTips->setText("用户名:×不能含有特殊符号"); + break; + } + } +} + + +void MainWindow::on_rootPassword0_textChanged(const QString &arg1) +{ + // 检查密码 + PasswordCheck(ui->rootPasswordTips0, ui->rootPasswordTips1, ui->rootPassword0, ui->rootPassword1, "root 用户密码:", "再输一次root用户密码:"); +} + + +void MainWindow::on_rootPassword1_textChanged(const QString &arg1) +{ + // 检查密码 + PasswordCheck(ui->rootPasswordTips0, ui->rootPasswordTips1, ui->rootPassword0, ui->rootPassword1, "root 用户密码:", "再输一次root用户密码:"); +} + + +void MainWindow::on_action_about_triggered() +{ + // 显示关于窗口 + AboutProgram program; + // 堵塞线程 + program.setAttribute(Qt::WA_ShowModal, true); + program.show(); + program.exec(); +} + +// 密码检查 +// (方便复用) +void MainWindow::PasswordCheck(QLabel *label0, QLabel *label1, QLineEdit *password0, QLineEdit *password1, QString labelTips0, QString labelTips1){ + // 如果密码不相同就显示提示 + if(password0->text() == password1->text()){ + label0->setText(labelTips0 + ""); + label1->setText(labelTips1 + ""); + } + else{ + label1->setText(labelTips1 + "×两次密码不相同!"); + } + // 空密码提示 + if(password0->text() == ""){ + label0->setText(labelTips0 + "×密码不能为空"); + } + else{ + label0->setText(labelTips0 + ""); + } + if(password1->text() == ""){ + label1->setText(labelTips1 + "×密码不能为空"); + } +} + +void MainWindow::on_userPassword0_textChanged(const QString &arg1) +{ + // 检查密码 + PasswordCheck(ui->userPasswordTips0, ui->userPasswordTips1, ui->userPassword0, ui->userPassword1, "用户密码:", "再输一次用户密码:"); +} + + +void MainWindow::on_userPassword1_textChanged(const QString &arg1) +{ + // 检查密码 + PasswordCheck(ui->userPasswordTips0, ui->userPasswordTips1, ui->userPassword0, ui->userPassword1, "用户密码:", "再输一次用户密码:"); +} + +// 获取命令输出 +QString MainWindow::GetCommandReturn(QString command){ + QProcess process; + process.start(command); + process.waitForFinished(); + QString result = process.readAllStandardOutput(); + process.close(); + return result; +} + +void MainWindow::on_installButton_clicked() +{ + // 这里先忽略合法性检测,直接显示窗口以调试 + InstallSystemWindow *window = new InstallSystemWindow(this->partSetPartFormat, this->partSetMountPoint); + window->show(); + return; + // 检测合法性 + // 检测是否有相同挂载点 + QList keyList = partSetMountPoint.keys(); + QMap alreadySetMountPoint; + for(int i = 0; i < keyList.size(); i++){ + if(alreadySetMountPoint.count(partSetMountPoint.value(keyList.at(i)))){ + QMessageBox::critical(this, "错误", "不能设置多个挂载点“" + partSetMountPoint.value(keyList.at(i)) + "”"); + return; + } + alreadySetMountPoint.insert(partSetMountPoint.value(keyList.at(i)), true); + } + // 检测是否有设置挂载点 / + if(!alreadySetMountPoint.count("/")){ + QMessageBox::critical(this, "错误", "没有设置挂载点“/”"); + return; + } + // 判断是否为 UEFI 启动 + QString info = GetCommandReturn("dmesg"); + if(info.contains("EFI v") && !alreadySetMountPoint.count("/boot/efi")){ + QMessageBox::critical(this, "错误", "请设置挂载点“/boot/efi”"); + return; + } + // 检测密码 + if(ui->rootPassword0->text() != ui->rootPassword1->text()){ + QMessageBox::critical(this, "错误", "root 密码不相同"); + return; + } + if(ui->userPassword0->text() != ui->userPassword1->text()){ + QMessageBox::critical(this, "错误", "用户密码不相同"); + return; + } + // 检测用户名和计算机名是否合法 + if(ui->hostName->text().size() < 2){ + QMessageBox::critical(this, "错误", "主机名不合法"); + return; + } + if(ui->userName->text().size() < 2){ + QMessageBox::critical(this, "错误", "用户名不合法"); + return; + } + // 检测是否有中文 + QString userName = ui->userName->text(); + for(int i = 0; i < userName.size(); i++){ + QChar cha = userName.at(i); + ushort uni = cha.unicode(); + if(uni >= 0x4E00 && uni <= 0x9FA5){ + // 含有中文 + QMessageBox::critical(this, "错误", "用户名不合法"); + return; + } + if(specialSymbol.contains(userName.at(i))){ + QMessageBox::critical(this, "错误", "用户名不合法"); + return; + } + } + userName = ui->hostName->text(); + for(int i = 0; i < userName.size(); i++){ + QChar cha = userName.at(i); + ushort uni = cha.unicode(); + if(uni >= 0x4E00 && uni <= 0x9FA5){ + // 含有中文 + QMessageBox::critical(this, "错误", "主机名不合法"); + break; + } + if(specialSymbol.contains(userName.at(i))){ + QMessageBox::critical(this, "错误", "主机名不合法"); + break; + } + } + + //window->exec(); +} + diff --git a/deepin-community-live-cd-online-installer/mainwindow.h b/deepin-community-live-cd-online-installer/mainwindow.h new file mode 100644 index 0000000..50ce066 --- /dev/null +++ b/deepin-community-live-cd-online-installer/mainwindow.h @@ -0,0 +1,54 @@ +#ifndef MAINWINDOW_H +#define MAINWINDOW_H + +#include +#include +#include +#include + +QT_BEGIN_NAMESPACE +namespace Ui { class MainWindow; } +QT_END_NAMESPACE + +class MainWindow : public QMainWindow +{ + Q_OBJECT + +public: + MainWindow(QWidget *parent = nullptr); + ~MainWindow(); + +private slots: + void on_action_exit_triggered(); + + void on_refreshDiskList_clicked(); + + void on_editChoosePart_clicked(); + + void on_userName_textChanged(const QString &arg1); + + void on_hostName_textChanged(const QString &arg1); + + void on_rootPassword0_textChanged(const QString &arg1); + + void on_rootPassword1_textChanged(const QString &arg1); + + void on_action_about_triggered(); + + void on_userPassword0_textChanged(const QString &arg1); + + void on_userPassword1_textChanged(const QString &arg1); + + void on_installButton_clicked(); + +private: + QString GetCommandReturn(QString command); + Ui::MainWindow *ui; + void SetDiskList(QTableView *diskListWidget); + QStringList GetDiskList(); + QMap partSetMountPoint; + QMap partSetPartFormat; + void PasswordCheck(QLabel *label0, QLabel *label1, QLineEdit *password0, QLineEdit *password1, QString labelTips0, QString labelTips1); + QStringList specialSymbol = {"`", "~", "!", "@", "#", "$", "%", "^", "&", "*", "(", ")", "=", "|", "\\", "[", "]", "{", "}", ":", ";", "\"", "'", ",", "<", ">", "?", "/"}; +}; +#endif // MAINWINDOW_H diff --git a/deepin-community-live-cd-online-installer/mainwindow.ui b/deepin-community-live-cd-online-installer/mainwindow.ui new file mode 100644 index 0000000..965ab3a --- /dev/null +++ b/deepin-community-live-cd-online-installer/mainwindow.ui @@ -0,0 +1,311 @@ + + + MainWindow + + + + 0 + 0 + 1007 + 638 + + + + MainWindow + + + + :/icon/icon.svg:/icon/icon.svg + + + + + + + + + + 0 + 0 + + + + 安装系统 + + + + + + + + bookworm + + + + + sid + + + + + bullseye + + + + + buster + + + + + + + + + 0 + 0 + + + + 刷新磁盘列表 + + + + + + + + 0 + 0 + + + + 安装系统: + + + + + + + + + + + + + + + + + + <html><head/><body><p>如果需要添加/删除分区等操作,请使用其他分区工具操作,如 gparted</p></body></html> + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + + 0 + 0 + + + + 编辑选中分区 + + + + + + + + + + + + + + QFrame::StyledPanel + + + QFrame::Raised + + + + + + root 用户密码:<a style='color: red;'><b>×</b></a>没有填写 + + + + + + + QLineEdit::Password + + + + + + + 再输一次root用户密码:<a style='color: red;'><b>×</b></a>没有填写 + + + + + + + QLineEdit::Password + + + + + + + <hr> + + + + + + + 用户名:<a style='color: red;'><b>×</b></a>没有填写 + + + + + + + QLineEdit::Normal + + + + + + + 用户密码:<a style='color: red;'><b>×</b></a>没有填写 + + + + + + + QLineEdit::Password + + + + + + + 再输一次用户密码:<a style='color: red;'><b>×</b></a>没有填写 + + + + + + + QLineEdit::Password + + + + + + + <hr> + + + + + + + 主机名:<a style='color: red;'><b>×</b></a>没有填写 + + + + + + + + + + Qt::Vertical + + + + 20 + 40 + + + + + + + + + + + + + + + 0 + 0 + 1007 + 36 + + + + + 程序(&P) + + + + + + 帮助(&H) + + + + + + + + + + + + 退出(&E) + + + + + 关于(&A) + + + + + false + + + QQ 交流群:881201853 + + + + + + + + diff --git a/deepin-community-live-cd-online-installer/no.png b/deepin-community-live-cd-online-installer/no.png new file mode 100644 index 0000000000000000000000000000000000000000..adc36ebaab96eefda6c73e27ab42b19267bffa1a GIT binary patch literal 11833 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 literal 0 HcmV?d00001 diff --git a/deepin-community-live-cd-online-installer/no.svg b/deepin-community-live-cd-online-installer/no.svg new file mode 100644 index 0000000..b7e43d0 --- /dev/null +++ b/deepin-community-live-cd-online-installer/no.svg @@ -0,0 +1,54 @@ + + + + + + + + × + + diff --git a/deepin-community-live-cd-online-installer/runcommandinterminal.cpp b/deepin-community-live-cd-online-installer/runcommandinterminal.cpp new file mode 100644 index 0000000..42fb784 --- /dev/null +++ b/deepin-community-live-cd-online-installer/runcommandinterminal.cpp @@ -0,0 +1,38 @@ +#include "runcommandinterminal.h" +#include +#include + +RunCommandInTerminal::RunCommandInTerminal(QTermWidget *terminal, QProgressBar *progressbar) +{ + this->terminal = terminal; + this->progressbar = progressbar; +} + +void RunCommandInTerminal::AddCommand(QString command){ + commandList.append(command); +} + +void RunCommandInTerminal::RunCommand(){ + this->runStatus = true; + // 写入为 Bash 文件,方便执行 + QString commandCode = "#!/bin/bash\n"; + QString bashPath = "/tmp/deepin-community-live-cd-installer-" + QString::number(QDateTime::currentMSecsSinceEpoch()) + ".sh"; + for(int i = 0; i < this->commandList.size(); i++){ + commandCode += this->commandList.at(i) + "\n"; + } + commandCode += "rm -rfv '" + bashPath + "'"; + QFile file(bashPath); + file.open(QFile::WriteOnly); + if(!file.isWritable()){ + throw "Can't write the file!"; + } + file.write(commandCode.toUtf8()); + file.close(); + system(("chmod +x '" + bashPath + "'").toUtf8()); // 赋予运行权限 + this->terminal->setColorScheme("DarkPastels"); + this->terminal->setShellProgram("/usr/bin/bash"); + this->terminal->setArgs(QStringList() << bashPath); + this->terminal->setAutoClose(1); + this->terminal->setAutoFillBackground(1); + this->terminal->startShellProgram(); +} diff --git a/deepin-community-live-cd-online-installer/runcommandinterminal.h b/deepin-community-live-cd-online-installer/runcommandinterminal.h new file mode 100644 index 0000000..7b37d3d --- /dev/null +++ b/deepin-community-live-cd-online-installer/runcommandinterminal.h @@ -0,0 +1,20 @@ +#ifndef RUNCOMMANDINTERMINAL_H +#define RUNCOMMANDINTERMINAL_H + +#include +#include + +class RunCommandInTerminal +{ +public: + RunCommandInTerminal(QTermWidget *terminal, QProgressBar *progressbar); + void AddCommand(QString command); + void RunCommand(); + QStringList commandList; +private: + QTermWidget *terminal; + QProgressBar *progressbar; + bool runStatus; +}; + +#endif // RUNCOMMANDINTERMINAL_H diff --git a/deepin-community-live-cd-online-installer/yes.png b/deepin-community-live-cd-online-installer/yes.png new file mode 100644 index 0000000000000000000000000000000000000000..f7a62fc8f77a0b1d8a1734962b648b3fd76950c3 GIT binary patch literal 11670 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 + + + + + + + + +