Commit dd2411d7 authored by longpanda's avatar longpanda
Browse files

Add Linux native GUI program for Ventoy2Disk.

x86_64    gtk2/gtk3
i386      gtk2/gtk3
aarch64   gtk3
mips64el  gtk3
parent 7db83dc0
====== ARM64 ======
1. Download CentOS-7-aarch64-Everything-2009.iso from internet.
2. mount CentOS-7-aarch64-Everything-2009.iso /mnt
3. sh prepare_lib_aarch64.sh /mnt/Packages/
====== MIPS64EL ======
1. build dpkg for CentOS7
download dpkg_1.18.25.tar.xz from internet.
cd dpkg-1.18.25
./configure
make
cp -a ./src/dpkg /sbin/
cp -a ./dpkg-deb/dpkg-deb /sbin/
2. download debian 9.x mips64el DVD iso (e.g. debian-9.9.0-mips64el-DVD-1.iso) form internet
3. download libgtk-3-dev_3.22.11-1_mips64el.deb from internet
4. mount debian-9.9.0-mips64el-DVD-1.iso /mnt
5. sh prepare_lib_mips64el.sh /mnt/
gtk3-
glib2-
pango-
cairo-
gdk-pixbuf2-
libXcursor-
libcap-
pcre-
libffi-
libthai-
fribidi-
libXrender-
libxcb-
pixman-
libpng-
libselinux-
zlib-
libwayland-
wayland-
libglvnd-
elfutils-
libattr-
libX11-
libXi-
libXfixes-
libepoxy-
harfbuzz-
fontconfig-
freetype-
libXinerama-
libXrandr-
libXcomposite-
libXdamage-
libxkbcommon-
libuuid-
libmount-
atk-
libblkid-
graphite2-
libXau-
bzip2-
expat-
libXext-
pcre2-
pcre-
at-spi2-atk
dbus-
dbus-libs
systemd-libs
at-spi2-core
xz-libs
lz4-
libgcrypt-
libgpg-error-
libglib2
libgtk-3
libpango
libharfbuzz
pixbuf2
atk
wayland
libx11
libxi6
epoxy
cairo
composite
damage
libxfixes
libxkbcommon
libfontconfig
libfreetype
libxinerama
libxrandr
libxcursor
libxext
libthai
libfribidi
libpixman
libpng
libxcb
libxrender
zlib1g
libmount
libselinux
libffi
libpcre3
libdbus
libatspi
libgraphite
libexpat
libuuid
libdatrie
libxdmcp
libblkid
libxau
libsystemd
libbsd
liblz4
liblzma
libgcrypt
libgpg-error
#!/bin/bash
if [ ! -d $1 ]; then
echo "$1 not exist"
exit 1
fi
rm -rf aarch64
mkdir aarch64
cd aarch64
cat ../aarch64libs | while read line; do
ls -1 $1/${line}* | while read rpm; do
echo "extract ${rpm##*/} ..."
rpm2cpio $rpm | cpio -idmu --quiet
done
done
cd ..
#!/bin/bash
if [ ! -d $1/pool ]; then
echo "$1/pool not exist"
exit 1
fi
rm -rf mips64el
mkdir mips64el
cd mips64el
cat ../mips64ellibs | while read line; do
find "$1/pool" -name "*${line}*.deb" | while read deb; do
echo "extract ${deb##*/} ..."
dpkg -x $deb .
done
done
dpkg -x ../libgtk-3-dev_3.22.11-1_mips64el.deb .
cd ..
......@@ -133,7 +133,7 @@ void ventoy_syslog(int level, const char *Fmt, ...)
if (fp)
{
fprintf(fp, "[%04u/%02u/%02u %02u:%02u:%02u] %s",
ttm.tm_year, ttm.tm_mon, ttm.tm_mday,
ttm.tm_year + 1900, ttm.tm_mon, ttm.tm_mday,
ttm.tm_hour, ttm.tm_min, ttm.tm_sec,
log);
fclose(fp);
......
/******************************************************************************
* refresh_icon_data.c
*
* Copyright (c) 2021, longpanda <admin@ventoy.net>
*
* 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 <http://www.gnu.org/licenses/>.
*
*/
#include <stdio.h>
#include <stdlib.h>
static unsigned char refresh_icon_hexData[4286] = {
0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x20, 0x20, 0x00, 0x00, 0x01, 0x00, 0x20, 0x00, 0xA8, 0x10,
0x00, 0x00, 0x16, 0x00, 0x00, 0x00, 0x28, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x40, 0x00,
0x00, 0x00, 0x01, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x27,
0x00, 0x00, 0x10, 0x27, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE,
0x32, 0x00, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE,
0x32, 0x00, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE,
0x32, 0x00, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE,
0x32, 0x00, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x0C, 0xA6, 0xBE,
0x32, 0x2D, 0xA6, 0xBE, 0x32, 0x54, 0xA6, 0xBE, 0x32, 0x72, 0xA6, 0xBE, 0x32, 0x81, 0xA6, 0xBE,
0x32, 0x81, 0xA6, 0xBE, 0x32, 0x72, 0xA6, 0xBE, 0x32, 0x54, 0xA6, 0xBE, 0x32, 0x2D, 0xA6, 0xBE,
0x32, 0x0C, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE,
0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE,
0x32, 0x00, 0xA6, 0xBE, 0x32, 0x21, 0xA6, 0xBE, 0x32, 0x72, 0xA6, 0xBE, 0x32, 0xBF, 0xA6, 0xBE,
0x32, 0xEB, 0xA6, 0xBE, 0x32, 0xFC, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE,
0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFC, 0xA6, 0xBE, 0x32, 0xEB, 0xA6, 0xBE,
0x32, 0xBF, 0xA6, 0xBE, 0x32, 0x72, 0xA6, 0xBE, 0x32, 0x21, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE,
0x32, 0x00, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xA6, 0xBE,
0x32, 0x00, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x10, 0xA6, 0xBE,
0x32, 0x71, 0xA6, 0xBE, 0x32, 0xD9, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE,
0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE,
0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE,
0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xDA, 0xA6, 0xBE, 0x32, 0x71, 0xA6, 0xBE,
0x32, 0x10, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE,
0x32, 0x00, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x29, 0xA6, 0xBE, 0x32, 0xB2, 0xA6, 0xBE,
0x32, 0xFE, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE,
0x32, 0xFF, 0xA6, 0xBE, 0x31, 0xFF, 0xA5, 0xBD, 0x30, 0xFF, 0xA5, 0xBD, 0x2F, 0xFF, 0xA5, 0xBD,
0x2F, 0xFF, 0xA5, 0xBD, 0x2F, 0xFF, 0xA5, 0xBE, 0x31, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE,
0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFE, 0xA6, 0xBE,
0x32, 0xB2, 0xA6, 0xBE, 0x32, 0x29, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE,
0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE,
0x32, 0x00, 0xA6, 0xBE, 0x32, 0x35, 0xA6, 0xBE, 0x32, 0xCF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE,
0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA5, 0xBD, 0x30, 0xFF, 0xA5, 0xBE,
0x31, 0xFF, 0xAC, 0xC3, 0x40, 0xFF, 0xB7, 0xCA, 0x59, 0xFF, 0xBF, 0xD0, 0x6B, 0xFF, 0xC0, 0xD1,
0x6E, 0xFF, 0xBA, 0xCD, 0x60, 0xFF, 0xAF, 0xC5, 0x48, 0xFF, 0xA7, 0xBF, 0x34, 0xFF, 0xA5, 0xBD,
0x2F, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE,
0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xCF, 0xA6, 0xBE, 0x32, 0x35, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE,
0x32, 0x00, 0xA6, 0xBE, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE,
0x32, 0x29, 0xA6, 0xBE, 0x32, 0xCF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE,
0x32, 0xFF, 0xA6, 0xBE, 0x31, 0xFF, 0xA6, 0xBE, 0x31, 0xFF, 0xB5, 0xC9, 0x54, 0xFF, 0xD4, 0xE0,
0x9D, 0xFF, 0xED, 0xF2, 0xD6, 0xFF, 0xF9, 0xFB, 0xF1, 0xFF, 0xFD, 0xFD, 0xFA, 0xFF, 0xFD, 0xFE,
0xFB, 0xFF, 0xFB, 0xFC, 0xF5, 0xFF, 0xF2, 0xF6, 0xE1, 0xFF, 0xDD, 0xE6, 0xB1, 0xFF, 0xBD, 0xCF,
0x67, 0xFF, 0xA7, 0xBF, 0x35, 0xFF, 0xA5, 0xBE, 0x30, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE,
0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xCF, 0xA6, 0xBE, 0x32, 0x29, 0xA6, 0xBE,
0x32, 0x00, 0xA6, 0xBE, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x10, 0xA6, 0xBE,
0x32, 0xB2, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE,
0x31, 0xFF, 0xA8, 0xC0, 0x37, 0xFF, 0xCB, 0xD9, 0x87, 0xFF, 0xF4, 0xF7, 0xE6, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFA, 0xFB,
0xF4, 0xFF, 0xD9, 0xE4, 0xA8, 0xFF, 0xAF, 0xC4, 0x46, 0xFF, 0xA5, 0xBD, 0x30, 0xFF, 0xA6, 0xBE,
0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xB2, 0xA6, 0xBE,
0x32, 0x10, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x71, 0xA6, 0xBE,
0x32, 0xFE, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x31, 0xFF, 0xA9, 0xC0,
0x38, 0xFF, 0xD5, 0xE0, 0x9D, 0xFF, 0xFD, 0xFE, 0xFA, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0xFE,
0xFD, 0xFF, 0xEE, 0xF3, 0xD9, 0xFF, 0xD9, 0xE3, 0xA8, 0xFF, 0xCC, 0xDA, 0x8A, 0xFF, 0xCA, 0xD8,
0x85, 0xFF, 0xD3, 0xDF, 0x99, 0xFF, 0xE6, 0xEC, 0xC4, 0xFF, 0xFA, 0xFB, 0xF3, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xE7, 0xED, 0xC7, 0xFF, 0xB1, 0xC6, 0x4C, 0xFF, 0xA5, 0xBD,
0x30, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFE, 0xA6, 0xBE,
0x32, 0x71, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0xA6, 0xBE,
0x32, 0x00, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x21, 0xA6, 0xBE, 0x32, 0xDA, 0xA6, 0xBE,
0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xCD, 0xDB,
0x8C, 0xFF, 0xFD, 0xFE, 0xFB, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF4, 0xF7, 0xE7, 0xFF, 0xCB, 0xD9,
0x87, 0xFF, 0xAE, 0xC3, 0x43, 0xFF, 0xA6, 0xBE, 0x31, 0xFF, 0xA4, 0xBD, 0x2F, 0xFF, 0xA4, 0xBD,
0x2E, 0xFF, 0xA5, 0xBD, 0x2F, 0xFF, 0xA9, 0xC0, 0x38, 0xFF, 0xBD, 0xCF, 0x66, 0xFF, 0xE8, 0xEE,
0xC9, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xE4, 0xEB, 0xC1, 0xFF, 0xAD, 0xC3,
0x41, 0xFF, 0xA6, 0xBE, 0x31, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE,
0x32, 0xDA, 0xA6, 0xBE, 0x32, 0x21, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBD,
0x32, 0x00, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x72, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE,
0x32, 0xFF, 0xA5, 0xBD, 0x2F, 0xFF, 0xA4, 0xBC, 0x2D, 0xFF, 0xB8, 0xCB, 0x5C, 0xFF, 0xF6, 0xF9,
0xEB, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF1, 0xF5, 0xDF, 0xFF, 0xBA, 0xCD, 0x60, 0xFF, 0xA4, 0xBD,
0x2E, 0xFF, 0xA5, 0xBE, 0x31, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE,
0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA5, 0xBD, 0x2F, 0xFF, 0xAE, 0xC4,
0x44, 0xFF, 0xE2, 0xE9, 0xBB, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xC7, 0xD6,
0x7E, 0xFF, 0xA5, 0xBD, 0x2F, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE,
0x32, 0xFF, 0xA6, 0xBE, 0x32, 0x72, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE,
0x32, 0x00, 0xA6, 0xBE, 0x32, 0x0C, 0xA6, 0xBE, 0x32, 0xC0, 0xA6, 0xBE, 0x32, 0xFF, 0xA9, 0xC0,
0x39, 0xFF, 0xC8, 0xD7, 0x80, 0xFF, 0xD0, 0xDC, 0x92, 0xFF, 0xE7, 0xEE, 0xC8, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xE6, 0xED, 0xC5, 0xFF, 0xCC, 0xDA, 0x8A, 0xFF, 0xB0, 0xC5,
0x49, 0xFF, 0xA5, 0xBE, 0x31, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE,
0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA5, 0xBD,
0x30, 0xFF, 0xB0, 0xC6, 0x4A, 0xFF, 0xE3, 0xEA, 0xBE, 0xFF, 0xEA, 0xEF, 0xCE, 0xFF, 0xB8, 0xCB,
0x5C, 0xFF, 0xA5, 0xBD, 0x30, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE,
0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xBF, 0xA6, 0xBE, 0x32, 0x0C, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE,
0x32, 0x00, 0xA6, 0xBE, 0x32, 0x2E, 0xA6, 0xBE, 0x32, 0xEB, 0xA6, 0xBE, 0x32, 0xFF, 0xA8, 0xC0,
0x37, 0xFF, 0xE0, 0xE8, 0xB8, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF3, 0xF6, 0xE3, 0xFF, 0xB3, 0xC7,
0x4F, 0xFF, 0xA5, 0xBD, 0x30, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE,
0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE,
0x32, 0xFF, 0xA6, 0xBE, 0x31, 0xFF, 0xAA, 0xC1, 0x3A, 0xFF, 0xAB, 0xC1, 0x3D, 0xFF, 0xA6, 0xBE,
0x31, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE,
0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xEB, 0xA6, 0xBE, 0x32, 0x2D, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE,
0x32, 0x00, 0xA6, 0xBE, 0x32, 0x54, 0xA6, 0xBE, 0x32, 0xFC, 0xA6, 0xBE, 0x32, 0xFF, 0xA5, 0xBD,
0x30, 0xFF, 0xB6, 0xCA, 0x58, 0xFF, 0xF4, 0xF7, 0xE6, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFD, 0xFE, 0xFB, 0xFF, 0xC9, 0xD8, 0x84, 0xFF, 0xA5, 0xBD,
0x30, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE,
0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE,
0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA5, 0xBE, 0x31, 0xFF, 0xA5, 0xBD, 0x2F, 0xFF, 0xA6, 0xBE,
0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE,
0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFC, 0xA6, 0xBE, 0x32, 0x54, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE,
0x32, 0x00, 0xA6, 0xBE, 0x32, 0x72, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE,
0x32, 0xFF, 0xA5, 0xBE, 0x30, 0xFF, 0xCD, 0xDB, 0x8C, 0xFF, 0xFE, 0xFE, 0xFD, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xE2, 0xEA, 0xBC, 0xFF, 0xAA, 0xC1, 0x3A, 0xFF, 0xA6, 0xBE,
0x31, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE,
0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE,
0x32, 0xFF, 0xA6, 0xBE, 0x31, 0xFF, 0xAB, 0xC2, 0x3E, 0xFF, 0xBB, 0xCE, 0x63, 0xFF, 0xA7, 0xBF,
0x35, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE,
0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0x72, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE,
0x32, 0x00, 0xA6, 0xBE, 0x32, 0x81, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE,
0x32, 0xFF, 0xA6, 0xBE, 0x31, 0xFF, 0xAB, 0xC2, 0x3E, 0xFF, 0xE6, 0xED, 0xC5, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xF5, 0xF8, 0xE8, 0xFF, 0xB7, 0xCB, 0x5A, 0xFF, 0xA5, 0xBD, 0x30, 0xFF, 0xA6, 0xBE,
0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE,
0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE,
0x32, 0xFF, 0xA5, 0xBE, 0x31, 0xFF, 0xCE, 0xDB, 0x8F, 0xFF, 0xF7, 0xF9, 0xEC, 0xFF, 0xBD, 0xCF,
0x67, 0xFF, 0xA5, 0xBD, 0x2F, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE,
0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0x81, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE,
0x32, 0x00, 0xA6, 0xBE, 0x32, 0x81, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE,
0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA5, 0xBD, 0x2F, 0xFF, 0xBB, 0xCD, 0x63, 0xFF, 0xF6, 0xF8,
0xEA, 0xFF, 0xCE, 0xDB, 0x8F, 0xFF, 0xA5, 0xBE, 0x31, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE,
0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE,
0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA5, 0xBD,
0x30, 0xFF, 0xB7, 0xCB, 0x5A, 0xFF, 0xF5, 0xF8, 0xE8, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xE8, 0xEE,
0xC9, 0xFF, 0xAC, 0xC2, 0x40, 0xFF, 0xA6, 0xBE, 0x31, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE,
0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0x81, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE,
0x32, 0x00, 0xA6, 0xBE, 0x32, 0x72, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE,
0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA7, 0xBF, 0x34, 0xFF, 0xBA, 0xCD,
0x60, 0xFF, 0xAB, 0xC2, 0x3E, 0xFF, 0xA6, 0xBE, 0x31, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE,
0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE,
0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x31, 0xFF, 0xAA, 0xC1,
0x3A, 0xFF, 0xE2, 0xEA, 0xBC, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFE, 0xFF, 0xCF, 0xDC, 0x90, 0xFF, 0xA6, 0xBE, 0x31, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE,
0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0x72, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE,
0x32, 0x00, 0xA6, 0xBE, 0x32, 0x54, 0xA6, 0xBE, 0x32, 0xFC, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE,
0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA5, 0xBD,
0x2F, 0xFF, 0xA6, 0xBE, 0x31, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE,
0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE,
0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA5, 0xBD, 0x30, 0xFF, 0xC9, 0xD8,
0x84, 0xFF, 0xFD, 0xFE, 0xFB, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xF5, 0xF8, 0xE9, 0xFF, 0xB8, 0xCB, 0x5B, 0xFF, 0xA5, 0xBD, 0x30, 0xFF, 0xA6, 0xBE,
0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFC, 0xA6, 0xBE, 0x32, 0x54, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE,
0x32, 0x00, 0xA6, 0xBE, 0x32, 0x2E, 0xA6, 0xBE, 0x32, 0xEB, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE,
0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x31, 0xFF, 0xA9, 0xC0,
0x38, 0xFF, 0xA8, 0xBF, 0x37, 0xFF, 0xA6, 0xBE, 0x31, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE,
0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE,
0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA5, 0xBD, 0x30, 0xFF, 0xB2, 0xC7, 0x4F, 0xFF, 0xF2, 0xF6,
0xE2, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xE2, 0xE9, 0xBB, 0xFF, 0xA9, 0xC0, 0x38, 0xFF, 0xA6, 0xBE,
0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xEB, 0xA6, 0xBE, 0x32, 0x2D, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE,
0x32, 0x00, 0xA6, 0xBE, 0x32, 0x0C, 0xA6, 0xBE, 0x32, 0xC0, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE,
0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA5, 0xBD, 0x30, 0xFF, 0xB5, 0xC9, 0x54, 0xFF, 0xE4, 0xEB,
0xC1, 0xFF, 0xDF, 0xE8, 0xB5, 0xFF, 0xAF, 0xC5, 0x47, 0xFF, 0xA5, 0xBD, 0x30, 0xFF, 0xA6, 0xBE,
0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE,
0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA5, 0xBE, 0x31, 0xFF, 0xAF, 0xC5, 0x47, 0xFF, 0xCA, 0xD8,
0x85, 0xFF, 0xE2, 0xE9, 0xBB, 0xFF, 0xFF, 0xFF, 0xFE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xE9, 0xEF,
0xCD, 0xFF, 0xCE, 0xDB, 0x8F, 0xFF, 0xC7, 0xD6, 0x7E, 0xFF, 0xA9, 0xC0, 0x39, 0xFF, 0xA6, 0xBE,
0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xBF, 0xA6, 0xBE, 0x32, 0x0C, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBD,
0x32, 0x00, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x73, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE,
0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA5, 0xBD, 0x2F, 0xFF, 0xC6, 0xD6, 0x7C, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xDF, 0xE8, 0xB5, 0xFF, 0xAC, 0xC3, 0x40, 0xFF, 0xA5, 0xBD,
0x2F, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE,
0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x31, 0xFF, 0xA4, 0xBD, 0x2E, 0xFF, 0xB5, 0xC9,
0x55, 0xFF, 0xED, 0xF2, 0xD6, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF9, 0xFB, 0xF1, 0xFF, 0xBC, 0xCE,
0x65, 0xFF, 0xA4, 0xBC, 0x2C, 0xFF, 0xA5, 0xBD, 0x2F, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE,
0x32, 0xFF, 0xA6, 0xBE, 0x32, 0x72, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE,
0x32, 0x00, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x21, 0xA6, 0xBE, 0x32, 0xDA, 0xA6, 0xBE,
0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x31, 0xFF, 0xAE, 0xC4, 0x44, 0xFF, 0xE6, 0xED,
0xC6, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xE4, 0xEB, 0xC1, 0xFF, 0xB9, 0xCC,
0x5E, 0xFF, 0xA7, 0xBF, 0x35, 0xFF, 0xA5, 0xBD, 0x2F, 0xFF, 0xA4, 0xBD, 0x2E, 0xFF, 0xA4, 0xBD,
0x2E, 0xFF, 0xA5, 0xBD, 0x2F, 0xFF, 0xAB, 0xC1, 0x3D, 0xFF, 0xC5, 0xD5, 0x79, 0xFF, 0xF1, 0xF5,
0xDE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0xFF, 0xD3, 0xDF, 0x99, 0xFF, 0xA7, 0xBE,
0x33, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE,
0x32, 0xDA, 0xA6, 0xBE, 0x32, 0x21, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x00, 0x00, 0x00,
0x00, 0x00, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x72, 0xA6, 0xBE,
0x32, 0xFE, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA5, 0xBD, 0x30, 0xFF, 0xB3, 0xC8,
0x51, 0xFF, 0xE9, 0xEF, 0xCD, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF8, 0xFA,
0xEE, 0xFF, 0xE1, 0xE9, 0xBA, 0xFF, 0xCD, 0xDB, 0x8C, 0xFF, 0xC4, 0xD4, 0x78, 0xFF, 0xC6, 0xD6,
0x7C, 0xFF, 0xD3, 0xDF, 0x9A, 0xFF, 0xE9, 0xEF, 0xCD, 0xFF, 0xFC, 0xFD, 0xF9, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFE, 0xFF, 0xFE, 0xFF, 0xDB, 0xE4, 0xAB, 0xFF, 0xAA, 0xC1, 0x3C, 0xFF, 0xA6, 0xBE,
0x31, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFE, 0xA6, 0xBE,
0x32, 0x71, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x10, 0xA6, 0xBE,
0x32, 0xB3, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA5, 0xBD,
0x30, 0xFF, 0xB1, 0xC6, 0x4B, 0xFF, 0xDD, 0xE6, 0xB2, 0xFF, 0xFC, 0xFD, 0xF8, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0xFF, 0xFE, 0xFF, 0xFF, 0xFF,
0xFE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF8, 0xFA,
0xEE, 0xFF, 0xD1, 0xDE, 0x96, 0xFF, 0xAA, 0xC1, 0x3C, 0xFF, 0xA5, 0xBE, 0x31, 0xFF, 0xA6, 0xBE,
0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xB2, 0xA6, 0xBE,
0x32, 0x10, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE,
0x32, 0x29, 0xA6, 0xBE, 0x32, 0xCF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE,
0x32, 0xFF, 0xA5, 0xBD, 0x30, 0xFF, 0xA9, 0xC0, 0x38, 0xFF, 0xC1, 0xD2, 0x71, 0xFF, 0xE2, 0xEA,
0xBC, 0xFF, 0xF5, 0xF8, 0xE9, 0xFF, 0xFD, 0xFD, 0xFA, 0xFF, 0xFF, 0xFF, 0xFE, 0xFF, 0xFE, 0xFF,
0xFE, 0xFF, 0xFB, 0xFC, 0xF7, 0xFF, 0xF2, 0xF5, 0xE1, 0xFF, 0xDB, 0xE5, 0xAC, 0xFF, 0xB9, 0xCC,
0x5F, 0xFF, 0xA6, 0xBE, 0x33, 0xFF, 0xA6, 0xBE, 0x31, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE,
0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xCF, 0xA6, 0xBE, 0x32, 0x29, 0xA6, 0xBE,
0x32, 0x00, 0xA6, 0xBE, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE,
0x32, 0x00, 0xA6, 0xBE, 0x32, 0x35, 0xA6, 0xBE, 0x32, 0xCF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE,
0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x31, 0xFF, 0xA5, 0xBD, 0x2F, 0xFF, 0xA8, 0xBF,
0x36, 0xFF, 0xB3, 0xC7, 0x4F, 0xFF, 0xBF, 0xD0, 0x6B, 0xFF, 0xC5, 0xD5, 0x7A, 0xFF, 0xC4, 0xD4,
0x78, 0xFF, 0xBC, 0xCE, 0x64, 0xFF, 0xB0, 0xC5, 0x48, 0xFF, 0xA6, 0xBE, 0x33, 0xFF, 0xA5, 0xBD,
0x30, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE,
0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xCF, 0xA6, 0xBE, 0x32, 0x35, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE,
0x32, 0x00, 0xA6, 0xBE, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE,
0x32, 0x00, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x29, 0xA6, 0xBE, 0x32, 0xB2, 0xA6, 0xBE,
0x32, 0xFE, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE,
0x32, 0xFF, 0xA5, 0xBD, 0x30, 0xFF, 0xA5, 0xBD, 0x2F, 0xFF, 0xA4, 0xBD, 0x2E, 0xFF, 0xA4, 0xBD,
0x2E, 0xFF, 0xA5, 0xBD, 0x2F, 0xFF, 0xA5, 0xBE, 0x31, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE,
0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFE, 0xA6, 0xBE,
0x32, 0xB3, 0xA6, 0xBE, 0x32, 0x29, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE,
0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xA6, 0xBE,
0x32, 0x00, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x10, 0xA6, 0xBE,
0x32, 0x71, 0xA6, 0xBE, 0x32, 0xDA, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE,
0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE,
0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE,
0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xDA, 0xA6, 0xBE, 0x32, 0x72, 0xA6, 0xBE,
0x32, 0x10, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE,
0x32, 0x00, 0xA6, 0xBE, 0x32, 0x21, 0xA6, 0xBE, 0x32, 0x72, 0xA6, 0xBE, 0x32, 0xBF, 0xA6, 0xBE,
0x32, 0xEB, 0xA6, 0xBE, 0x32, 0xFC, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE,
0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFC, 0xA6, 0xBE, 0x32, 0xEB, 0xA6, 0xBE,
0x32, 0xC0, 0xA6, 0xBE, 0x32, 0x73, 0xA6, 0xBE, 0x32, 0x21, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE,
0x32, 0x00, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE,
0x32, 0x00, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x0C, 0xA6, 0xBE,
0x32, 0x2D, 0xA6, 0xBE, 0x32, 0x54, 0xA6, 0xBE, 0x32, 0x72, 0xA6, 0xBE, 0x32, 0x81, 0xA6, 0xBE,
0x32, 0x81, 0xA6, 0xBE, 0x32, 0x72, 0xA6, 0xBE, 0x32, 0x54, 0xA6, 0xBE, 0x32, 0x2E, 0xA6, 0xBE,
0x32, 0x0C, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE,
0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBD, 0x31, 0x00, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE,
0x32, 0x00, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE,
0x32, 0x00, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE,
0x32, 0x00, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x80,
0x01, 0xFF, 0xFE, 0x00, 0x00, 0x7F, 0xF8, 0x00, 0x00, 0x1F, 0xF0, 0x00, 0x00, 0x0F, 0xE0, 0x00,
0x00, 0x07, 0xC0, 0x00, 0x00, 0x03, 0xC0, 0x00, 0x00, 0x03, 0x80, 0x00, 0x00, 0x01, 0x80, 0x00,
0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x01, 0x80, 0x00,
0x00, 0x01, 0xC0, 0x00, 0x00, 0x03, 0xC0, 0x00, 0x00, 0x03, 0xE0, 0x00, 0x00, 0x07, 0xF0, 0x00,
0x00, 0x0F, 0xF8, 0x00, 0x00, 0x1F, 0xFE, 0x00, 0x00, 0x7F, 0xFF, 0x80, 0x01, 0xFF
};
void *get_refresh_icon_raw_data(int *len)
{
*len = (int)sizeof(refresh_icon_hexData);
return refresh_icon_hexData;
}
/******************************************************************************
* secure_icon_data.c
*
* Copyright (c) 2021, longpanda <admin@ventoy.net>
*
* 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 <http://www.gnu.org/licenses/>.
*
*/
#include <stdio.h>
#include <stdlib.h>
static unsigned char secure_icon_hexData[958] = {
0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x0D, 0x10, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0xA8, 0x03,
0x00, 0x00, 0x16, 0x00, 0x00, 0x00, 0x28, 0x00, 0x00, 0x00, 0x0D, 0x00, 0x00, 0x00, 0x20, 0x00,
0x00, 0x00, 0x01, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x03, 0x00, 0x00, 0x46, 0x5C,
0x00, 0x00, 0x46, 0x5C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x8C,
0xFB, 0x01, 0x00, 0x8C, 0xFB, 0x2E, 0x00, 0x8C, 0xFB, 0x52, 0x00, 0x8C, 0xFB, 0x53, 0x00, 0x8C,
0xFB, 0x53, 0x00, 0x8C, 0xFB, 0x53, 0x00, 0x8C, 0xFB, 0x53, 0x00, 0x8C, 0xFB, 0x53, 0x00, 0x8C,
0xFB, 0x53, 0x00, 0x8C, 0xFB, 0x53, 0x00, 0x8C, 0xFB, 0x52, 0x00, 0x8C, 0xFB, 0x2E, 0x00, 0x8C,
0xFB, 0x01, 0x00, 0x8C, 0xFB, 0x3E, 0x00, 0x8C, 0xFB, 0xDA, 0x00, 0x8C, 0xFB, 0xF8, 0x00, 0x8C,
0xFB, 0xF7, 0x00, 0x8C, 0xFB, 0xF7, 0x00, 0x8C, 0xFB, 0xF7, 0x00, 0x8C, 0xFB, 0xF7, 0x00, 0x8C,
0xFB, 0xF7, 0x00, 0x8C, 0xFB, 0xF7, 0x00, 0x8C, 0xFB, 0xF7, 0x00, 0x8C, 0xFB, 0xF8, 0x00, 0x8C,
0xFB, 0xDA, 0x00, 0x8C, 0xFB, 0x3E, 0x00, 0x8C, 0xFB, 0x78, 0x00, 0x8C, 0xFB, 0xFF, 0x00, 0x8C,
0xFB, 0xFF, 0x00, 0x8C, 0xFB, 0xFF, 0x00, 0x8C, 0xFB, 0xFF, 0x00, 0x8C, 0xFB, 0xFF, 0x00, 0x8C,
0xFB, 0xFF, 0x00, 0x8C, 0xFB, 0xFF, 0x00, 0x8C, 0xFB, 0xFF, 0x00, 0x8C, 0xFB, 0xFF, 0x00, 0x8C,
0xFB, 0xFF, 0x00, 0x8C, 0xFB, 0xFF, 0x00, 0x8C, 0xFB, 0x78, 0x00, 0x8C, 0xFB, 0x7B, 0x00, 0x8C,
0xFB, 0xFF, 0x00, 0x8C, 0xFB, 0xFF, 0x00, 0x8C, 0xFB, 0xFF, 0x00, 0x8C, 0xFB, 0xFF, 0x00, 0x8C,
0xFB, 0xFF, 0x00, 0x8C, 0xFB, 0xFF, 0x00, 0x8C, 0xFB, 0xFF, 0x00, 0x8C, 0xFB, 0xFF, 0x00, 0x8C,
0xFB, 0xFF, 0x00, 0x8C, 0xFB, 0xFF, 0x00, 0x8C, 0xFB, 0xFF, 0x00, 0x8C, 0xFB, 0x7B, 0x00, 0x8C,
0xFB, 0x7A, 0x00, 0x8C, 0xFB, 0xFF, 0x00, 0x8C, 0xFB, 0xFF, 0x00, 0x8C, 0xFB, 0xFF, 0x00, 0x8C,
0xFB, 0xFF, 0x00, 0x86, 0xF1, 0xFF, 0x00, 0x7C, 0xDF, 0xFF, 0x00, 0x86, 0xF1, 0xFF, 0x00, 0x8C,
0xFB, 0xFF, 0x00, 0x8C, 0xFB, 0xFF, 0x00, 0x8C, 0xFB, 0xFF, 0x00, 0x8C, 0xFB, 0xFF, 0x00, 0x8C,
0xFB, 0x7A, 0x00, 0x8C, 0xFB, 0x7A, 0x00, 0x8C, 0xFB, 0xFF, 0x00, 0x8C, 0xFB, 0xFF, 0x00, 0x8C,
0xFB, 0xFF, 0x00, 0x8C, 0xFC, 0xFF, 0x00, 0x7C, 0xDF, 0xFF, 0x00, 0x6C, 0xC4, 0xFF, 0x00, 0x7C,
0xDF, 0xFF, 0x00, 0x8C, 0xFC, 0xFF, 0x00, 0x8C, 0xFB, 0xFF, 0x00, 0x8C, 0xFB, 0xFF, 0x00, 0x8C,
0xFB, 0xFF, 0x00, 0x8C, 0xFB, 0x7A, 0x00, 0x8C, 0xFB, 0x7A, 0x00, 0x8C, 0xFB, 0xFF, 0x00, 0x8C,
0xFB, 0xFF, 0x00, 0x8C, 0xFB, 0xFF, 0x00, 0x8C, 0xFB, 0xFF, 0x00, 0x87, 0xF2, 0xFF, 0x00, 0x7D,
0xE1, 0xFF, 0x00, 0x87, 0xF2, 0xFF, 0x00, 0x8C, 0xFB, 0xFF, 0x00, 0x8C, 0xFB, 0xFF, 0x00, 0x8C,
0xFB, 0xFF, 0x00, 0x8C, 0xFB, 0xFF, 0x00, 0x8C, 0xFB, 0x7A, 0x00, 0x8C, 0xFB, 0x7B, 0x00, 0x8C,
0xFB, 0xFF, 0x00, 0x8C, 0xFB, 0xFF, 0x00, 0x8C, 0xFB, 0xFF, 0x00, 0x8C, 0xFB, 0xFF, 0x00, 0x8C,
0xFB, 0xFF, 0x00, 0x8C, 0xFC, 0xFF, 0x00, 0x8C, 0xFB, 0xFF, 0x00, 0x8C, 0xFB, 0xFF, 0x00, 0x8C,
0xFB, 0xFF, 0x00, 0x8C, 0xFB, 0xFF, 0x00, 0x8C, 0xFB, 0xFF, 0x00, 0x8C, 0xFB, 0x7B, 0x00, 0x8C,
0xFB, 0x77, 0x00, 0x8C, 0xFB, 0xFF, 0x00, 0x8C, 0xFB, 0xFF, 0x00, 0x8C, 0xFB, 0xFF, 0x00, 0x8C,
0xFB, 0xFF, 0x00, 0x8C, 0xFB, 0xFF, 0x00, 0x8C, 0xFB, 0xFF, 0x00, 0x8C, 0xFB, 0xFF, 0x00, 0x8C,
0xFB, 0xFF, 0x00, 0x8C, 0xFB, 0xFF, 0x00, 0x8C, 0xFB, 0xFF, 0x00, 0x8C, 0xFB, 0xFF, 0x00, 0x8C,
0xFB, 0x77, 0x00, 0x8C, 0xFB, 0x3A, 0x00, 0x8C, 0xFB, 0xD4, 0x01, 0x8B, 0xF9, 0xF7, 0x03, 0x89,
0xF3, 0xFF, 0x01, 0x8B, 0xF8, 0xF8, 0x00, 0x8C, 0xFB, 0xF4, 0x00, 0x8C, 0xFB, 0xF4, 0x00, 0x8C,
0xFB, 0xF4, 0x01, 0x8B, 0xF8, 0xF8, 0x03, 0x89, 0xF3, 0xFF, 0x01, 0x8B, 0xF9, 0xF7, 0x00, 0x8C,
0xFB, 0xD4, 0x00, 0x8C, 0xFB, 0x3A, 0x00, 0x8C, 0xFB, 0x00, 0x00, 0x93, 0xFF, 0x1E, 0x1D, 0x6B,
0xA9, 0x6B, 0x32, 0x54, 0x6F, 0xF6, 0x22, 0x65, 0x9A, 0x7D, 0x00, 0x90, 0xFF, 0x39, 0x00, 0x8C,
0xFB, 0x3C, 0x00, 0x90, 0xFF, 0x39, 0x22, 0x65, 0x9A, 0x7D, 0x32, 0x54, 0x6F, 0xF6, 0x1D, 0x6B,
0xA9, 0x6B, 0x00, 0x93, 0xFF, 0x1E, 0x00, 0x8C, 0xFB, 0x00, 0x00, 0x8C, 0xFB, 0x00, 0x2A, 0x5D,
0x85, 0x00, 0x46, 0x3D, 0x36, 0x3A, 0x43, 0x41, 0x3F, 0xF3, 0x45, 0x3F, 0x3A, 0x58, 0x26, 0x62,
0x91, 0x00, 0x00, 0x8D, 0xFD, 0x00, 0x26, 0x62, 0x91, 0x00, 0x45, 0x3F, 0x3A, 0x58, 0x43, 0x41,
0x3F, 0xF3, 0x46, 0x3D, 0x36, 0x3A, 0x2A, 0x5D, 0x85, 0x00, 0x00, 0x8C, 0xFB, 0x00, 0x00, 0x00,
0x00, 0x00, 0x42, 0x42, 0x42, 0x00, 0x42, 0x42, 0x42, 0x27, 0x42, 0x42, 0x42, 0xE9, 0x42, 0x42,
0x42, 0x94, 0x42, 0x42, 0x42, 0x01, 0x42, 0x42, 0x42, 0x00, 0x42, 0x42, 0x42, 0x01, 0x42, 0x42,
0x42, 0x94, 0x42, 0x42, 0x42, 0xE9, 0x42, 0x42, 0x42, 0x27, 0x42, 0x42, 0x42, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x42, 0x42, 0x42, 0x00, 0x42, 0x42, 0x42, 0x04, 0x42, 0x42,
0x42, 0x96, 0x42, 0x42, 0x42, 0xF5, 0x42, 0x42, 0x42, 0x8E, 0x42, 0x42, 0x42, 0x53, 0x42, 0x42,
0x42, 0x8E, 0x42, 0x42, 0x42, 0xF5, 0x42, 0x42, 0x42, 0x96, 0x42, 0x42, 0x42, 0x04, 0x42, 0x42,
0x42, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x42, 0x42, 0x42, 0x00, 0x42, 0x42,
0x42, 0x00, 0x42, 0x42, 0x42, 0x16, 0x42, 0x42, 0x42, 0x96, 0x42, 0x42, 0x42, 0xE9, 0x42, 0x42,
0x42, 0xF3, 0x42, 0x42, 0x42, 0xE9, 0x42, 0x42, 0x42, 0x96, 0x42, 0x42, 0x42, 0x16, 0x42, 0x42,
0x42, 0x00, 0x42, 0x42, 0x42, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x42, 0x42,
0x42, 0x00, 0x42, 0x42, 0x42, 0x00, 0x42, 0x42, 0x42, 0x00, 0x42, 0x42, 0x42, 0x05, 0x42, 0x42,
0x42, 0x31, 0x42, 0x42, 0x42, 0x4B, 0x42, 0x42, 0x42, 0x31, 0x42, 0x42, 0x42, 0x05, 0x42, 0x42,
0x42, 0x00, 0x42, 0x42, 0x42, 0x00, 0x42, 0x42, 0x42, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x08,
0x00, 0x00, 0x80, 0x08, 0x00, 0x00, 0x80, 0x08, 0x00, 0x00, 0x80, 0x08, 0x00, 0x00
};
void *get_secure_icon_raw_data(int *len)
{
*len = (int)sizeof(secure_icon_hexData);
return secure_icon_hexData;
}
/******************************************************************************
* ventoy_gtk.c
*
* Copyright (c) 2021, longpanda <admin@ventoy.net>
*
* 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 <http://www.gnu.org/licenses/>.
*
*/
#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>
#include <string.h>
#include <stdarg.h>
#include <errno.h>
#include <time.h>
#include <unistd.h>
#include <ventoy_define.h>
#include <ventoy_json.h>
#include <ventoy_util.h>
#include <ventoy_disk.h>
#include <ventoy_http.h>
#include <gtk/gtk.h>
#include "ventoy_gtk.h"
int g_secure_boot_support = 0;
GtkWidget *g_topWindow = NULL;
GtkWidget *g_partCfgWindow = NULL;
GtkBuilder *g_pXmlBuilder = NULL;
GtkComboBoxText *g_dev_combobox = NULL;
GtkButton *g_refresh_button = NULL;
GtkButton *g_install_button = NULL;
GtkButton *g_update_button = NULL;
GtkMenu *g_lang_menu = NULL;;
GtkCheckMenuItem *g_menu_item_secure_boot = NULL;
GtkCheckMenuItem *g_menu_item_mbr = NULL;
GtkCheckMenuItem *g_menu_item_gpt = NULL;
GtkCheckMenuItem *g_menu_item_show_all = NULL;
GtkLabel *g_device_title = NULL;
GtkLabel *g_label_local_part_style = NULL;
GtkLabel *g_label_dev_part_style = NULL;
GtkLabel *g_label_local_ver = NULL;
GtkLabel *g_label_disk_ver = NULL;
GtkLabel *g_label_status = NULL;
GtkImage *g_image_secure_local = NULL;
GtkImage *g_image_secure_device = NULL;
GtkToggleButton *g_part_align_checkbox = NULL;
GtkToggleButton *g_part_preserve_checkbox = NULL;
GtkEntry *g_part_reserve_space_value = NULL;
GtkComboBoxText *g_part_space_unit_combox = NULL;
GtkProgressBar *g_progress_bar = NULL;
VTOY_JSON *g_languages_json = NULL;
int g_languages_toggled_proc = 0;
int g_dev_changed_proc = 0;
gboolean g_align_part_with_4k = TRUE;
gboolean g_preserve_space_check = FALSE;
int g_preserve_space_unit = 1;
int g_preserve_space_number = 0;
gboolean g_thread_run = FALSE;
const char *language_string(const char *id)
{
const char *pName = NULL;
VTOY_JSON *node = NULL;
const char *pCurLang = ventoy_code_get_cur_language();
for (node = g_languages_json->pstChild; node; node = node->pstNext)
{
pName = vtoy_json_get_string_ex(node->pstChild, "name");
if (0 == g_strcmp0(pName, pCurLang))
{
break;
}
}
if (NULL == node)
{
return "xxx";
}
return vtoy_json_get_string_ex(node->pstChild, id);
}
int msgbox(GtkMessageType type, GtkButtonsType buttons, const char *strid)
{
int ret;
GtkWidget *pMsgBox = NULL;
pMsgBox = gtk_message_dialog_new(NULL, GTK_DIALOG_MODAL, type, buttons, "%s", language_string(strid));
ret = gtk_dialog_run(GTK_DIALOG(pMsgBox));
gtk_widget_destroy(pMsgBox);
return ret;
}
static void set_item_visible(const char *id, int visible)
{
GtkWidget *pWidget = NULL;
pWidget = GTK_WIDGET(gtk_builder_get_object(g_pXmlBuilder, id));
if (visible)
{
gtk_widget_show(pWidget);
}
else
{
gtk_widget_hide(pWidget);
}
}
static void init_part_style_menu(void)
{
int style;
style = ventoy_code_get_cur_part_style();
gtk_check_menu_item_set_active(g_menu_item_mbr, (0 == style));
gtk_check_menu_item_set_active(g_menu_item_gpt, (1 == style));
gtk_label_set_text(g_label_local_part_style, style ? "GPT" : "MBR");
}
static void select_language(const char *lang)
{
const char *pName = NULL;
const char *pPos = NULL;
const char *pDevice = NULL;
VTOY_JSON *node = NULL;
char device[256];
for (node = g_languages_json->pstChild; node; node = node->pstNext)
{
pName = vtoy_json_get_string_ex(node->pstChild, "name");
if (0 == g_strcmp0(pName, lang))
{
break;
}
}
if (NULL == node)
{
return;
}
pDevice = gtk_label_get_text(g_device_title);
if (pDevice && (pPos = strchr(pDevice, '[')) != NULL)
{
g_snprintf(device, sizeof(device), "%s %s", vtoy_json_get_string_ex(node->pstChild, "STR_DEVICE"), pPos);
gtk_label_set_text(g_device_title, device);
}
else
{
gtk_label_set_text(g_device_title, vtoy_json_get_string_ex(node->pstChild, "STR_DEVICE"));
}
LANG_LABEL_TEXT("label_local_ver", "STR_LOCAL_VER");
LANG_LABEL_TEXT("label_device_ver", "STR_DISK_VER");
LANG_LABEL_TEXT("label_status", "STR_STATUS");
LANG_BUTTON_TEXT("button_install", "STR_INSTALL");
LANG_BUTTON_TEXT("button_update", "STR_UPDATE");
LANG_MENU_ITEM_TEXT("menu_option", "STR_MENU_OPTION");
LANG_MENU_ITEM_TEXT("menu_item_secure", "STR_MENU_SECURE_BOOT");
LANG_MENU_ITEM_TEXT("menu_part_style", "STR_MENU_PART_STYLE");
LANG_MENU_ITEM_TEXT("menu_item_part_cfg", "STR_MENU_PART_CFG");
LANG_MENU_ITEM_TEXT("menu_item_clear", "STR_MENU_CLEAR");
LANG_MENU_ITEM_TEXT("menu_item_show_all", "STR_SHOW_ALL_DEV");
LANG_BUTTON_TEXT("space_check_btn", "STR_PRESERVE_SPACE");
LANG_BUTTON_TEXT("space_align_btn", "STR_PART_ALIGN_4KB");
LANG_BUTTON_TEXT("button_partcfg_ok", "STR_BTN_OK");
LANG_BUTTON_TEXT("button_partcfg_cancel", "STR_BTN_CANCEL");
gtk_window_set_title(GTK_WINDOW(g_partCfgWindow), vtoy_json_get_string_ex(node->pstChild, "STR_MENU_PART_CFG"));
/*
* refresh screen
*/
gtk_widget_hide(g_topWindow);
gtk_widget_show(g_topWindow);
}
void on_secure_boot_toggled(GtkMenuItem *menuItem, gpointer data)
{
g_secure_boot_support = 1 - g_secure_boot_support;
vlog("on_secure_boot_toggled %d\n",g_secure_boot_support );
if (g_secure_boot_support)
{
gtk_widget_show((GtkWidget *)g_image_secure_local);
}
else
{
gtk_widget_hide((GtkWidget *)g_image_secure_local);
}
}
void on_devlist_changed(GtkWidget *widget, gpointer data)
{
int active;
ventoy_disk *cur = NULL;
char version[512];
if (g_dev_changed_proc == 0)
{
return;
}
gtk_widget_set_sensitive(GTK_WIDGET(g_update_button), FALSE);
gtk_widget_hide((GtkWidget *)g_image_secure_device);
gtk_label_set_markup(g_label_disk_ver, "");
gtk_label_set_text(g_label_dev_part_style, "");
active = gtk_combo_box_get_active((GtkComboBox *)g_dev_combobox);
if (active < 0 || active >= g_disk_num)
{
vlog("invalid active combox id %d\n", active);
return;
}
cur = g_disk_list + active;
if (cur->vtoydata.ventoy_valid)
{
if (cur->vtoydata.secure_boot_flag)
{
gtk_widget_show((GtkWidget *)g_image_secure_device);
}
else
{
gtk_widget_hide((GtkWidget *)g_image_secure_device);
}
if (g_secure_boot_support != cur->vtoydata.secure_boot_flag)
{
gtk_check_menu_item_set_active(g_menu_item_secure_boot, 1 - g_secure_boot_support);
}
g_snprintf(version, sizeof(version), VTOY_VER_FMT, cur->vtoydata.ventoy_ver);
gtk_label_set_markup(g_label_disk_ver, version);
gtk_label_set_text(g_label_dev_part_style, cur->vtoydata.partition_style ? "GPT" : "MBR");
gtk_widget_set_sensitive(GTK_WIDGET(g_update_button), TRUE);
}
else
{
if (g_secure_boot_support)
{
gtk_check_menu_item_set_active(g_menu_item_secure_boot, 1 - g_secure_boot_support);
}
}
}
void on_language_toggled(GtkMenuItem *menuItem, gpointer data)
{
const char *cur_lang = NULL;
if (g_languages_toggled_proc == 0)
{
return;
}
cur_lang = ventoy_code_get_cur_language();
if (g_strcmp0(cur_lang, (char *)data) != 0)
{
ventoy_code_set_cur_language((char *)data);
select_language((char *)data);
}
}
void on_part_style_toggled(GtkMenuItem *menuItem, gpointer data)
{
int style;
style = ventoy_code_get_cur_part_style();
ventoy_code_set_cur_part_style(1 - style);
gtk_label_set_text(g_label_local_part_style, style ? "MBR" : "GPT");
}
static ventoy_disk *select_active_dev(const char *select, int *activeid)
{
int i;
ventoy_disk *cur = NULL;
/* find the match one */
if (select)
{
for (i = 0; i < g_disk_num; i++)
{
cur = g_disk_list + i;
if (strcmp(cur->disk_name, select) == 0)
{
*activeid = i;
return cur;
}
}
}
/* find the first one that installed with Ventoy */
for (i = 0; i < g_disk_num; i++)
{
cur = g_disk_list + i;
if (cur->vtoydata.ventoy_valid)
{
*activeid = i;
return cur;
}
}
/* find the first USB interface device */
for (i = 0; i < g_disk_num; i++)
{
cur = g_disk_list + i;
if (cur->type == VTOY_DEVICE_USB)
{
*activeid = i;
return cur;
}
}
/* use the first one */
*activeid = 0;
return g_disk_list;
}
static void fill_dev_list(const char *select)
{
int i;
int alldev;
int activeid;
int count = 0;
char line[512];
ventoy_disk *cur = NULL;
ventoy_disk *active = NULL;
GtkListStore *store = NULL;
g_dev_changed_proc = 0;
alldev = ventoy_code_get_cur_show_all();
vlog("fill_dev_list total disk: %d showall:%d\n", g_disk_num, alldev);
/* gtk_combo_box_text_remove_all */
store = GTK_LIST_STORE(gtk_combo_box_get_model(GTK_COMBO_BOX(g_dev_combobox)));
gtk_list_store_clear(store);
for (i = 0; i < g_disk_num; i++)
{
cur = g_disk_list + i;
if (alldev == 0 && cur->type != VTOY_DEVICE_USB)
{
continue;
}
g_snprintf(line, sizeof(line), "%s [%s] %s", cur->disk_name, cur->human_readable_size, cur->disk_model);
gtk_combo_box_text_append_text(g_dev_combobox, line);
count++;
}
active = select_active_dev(select, &activeid);
if (active)
{
vlog("combox count:%d, active:%s id:%d\n", count, active->disk_name, activeid);
gtk_combo_box_set_active((GtkComboBox *)g_dev_combobox, activeid);
gtk_widget_set_sensitive(GTK_WIDGET(g_install_button), TRUE);
gtk_widget_set_sensitive(GTK_WIDGET(g_update_button), active->vtoydata.ventoy_valid);
}
else
{
vlog("combox count:%d, no active id\n", count);
gtk_widget_set_sensitive(GTK_WIDGET(g_install_button), FALSE);
gtk_widget_set_sensitive(GTK_WIDGET(g_update_button), FALSE);
}
g_dev_changed_proc = 1;
on_devlist_changed(NULL, NULL);
}
void on_show_all_toggled(GtkMenuItem *menuItem, gpointer data)
{
int show_all = ventoy_code_get_cur_show_all();
ventoy_code_set_cur_show_all(1 - show_all);
fill_dev_list(NULL);
}
void on_button_refresh_clicked(GtkWidget *widget, gpointer data)
{
if (g_thread_run || ventoy_code_is_busy())
{
msgbox(GTK_MESSAGE_INFO, GTK_BUTTONS_OK, "STR_WAIT_PROCESS");
return;
}
ventoy_code_refresh_device();
fill_dev_list(NULL);
}
static void set_progress_bar_percent(int percent)
{
char *pos = NULL;
const char *text = NULL;
char tmp[128];
gtk_progress_bar_set_fraction(g_progress_bar, percent * 1.0 / 100);
vlog("set percent %d\n", percent);
text = language_string("STR_STATUS");
if (percent == 0)
{
gtk_label_set_text(g_label_status, text);
}
else
{
g_snprintf(tmp, sizeof(tmp), "%s", text);
pos = strchr(tmp, '-');
if (pos)
{
g_snprintf(pos + 2, sizeof(tmp), "%d%%", percent);
gtk_label_set_text(g_label_status, tmp);
}
}
}
void on_clear_ventoy(GtkMenuItem *menuItem, gpointer data)
{
int ret;
int active;
char buf[1024];
char out[256];
char disk_name[32];
ventoy_disk *cur = NULL;
if (g_thread_run || ventoy_code_is_busy())
{
msgbox(GTK_MESSAGE_INFO, GTK_BUTTONS_OK, "STR_WAIT_PROCESS");
return;
}
active = gtk_combo_box_get_active((GtkComboBox *)g_dev_combobox);
if (active < 0 || active >= g_disk_num)
{
vlog("invalid active combox id %d\n", active);
return;
}
if (GTK_RESPONSE_CANCEL == msgbox(GTK_MESSAGE_WARNING, GTK_BUTTONS_OK_CANCEL, "STR_INSTALL_TIP"))
{
return;
}
if (GTK_RESPONSE_CANCEL == msgbox(GTK_MESSAGE_WARNING, GTK_BUTTONS_OK_CANCEL, "STR_INSTALL_TIP2"))
{
return;
}
gtk_widget_set_sensitive (GTK_WIDGET(g_refresh_button), FALSE);
gtk_widget_set_sensitive (GTK_WIDGET(g_install_button), FALSE);
gtk_widget_set_sensitive (GTK_WIDGET(g_update_button), FALSE);
g_thread_run = TRUE;
cur = g_disk_list + active;
g_snprintf(disk_name, sizeof(disk_name), "%s", cur->disk_name);
g_snprintf(buf, sizeof(buf), "{\"method\":\"clean\",\"disk\":\"%s\"}", disk_name);
out[0] = 0;
ventoy_func_handler(buf, out, sizeof(out));
vlog("func handler clean <%s>\n", out);
if (strstr(out, "success"))
{
ret = ventoy_code_get_result();
ventoy_code_refresh_device();
cur = NULL;
}
else
{
ret = 1;
}
if (ret == 0)
{
msgbox(GTK_MESSAGE_INFO, GTK_BUTTONS_OK, "STR_CLEAR_SUCCESS");
}
else
{
msgbox(GTK_MESSAGE_ERROR, GTK_BUTTONS_OK, "STR_CLEAR_FAILED");
}
set_progress_bar_percent(0);
gtk_widget_set_sensitive(GTK_WIDGET(g_refresh_button), TRUE);
gtk_widget_set_sensitive(GTK_WIDGET(g_install_button), TRUE);
gtk_widget_set_sensitive(GTK_WIDGET(g_update_button), TRUE);
fill_dev_list(disk_name);
g_thread_run = FALSE;
}
static int install_proc(ventoy_disk *cur)
{
int ret = 0;
int pos = 0;
int buflen = 0;
int percent = 0;
char buf[1024];
char dec[64];
char out[256];
char disk_name[32];
long long space;
vlog("install_thread ...\n");
g_snprintf(disk_name, sizeof(disk_name), "%s", cur->disk_name);
buflen = sizeof(buf);
VTOY_JSON_FMT_BEGIN(pos, buf, buflen);
VTOY_JSON_FMT_OBJ_BEGIN();
VTOY_JSON_FMT_STRN("method", "install");
VTOY_JSON_FMT_STRN("disk", disk_name);
if (g_preserve_space_check)
{
space = g_preserve_space_number;
if (g_preserve_space_unit == 1)
{
space = space * 1024 * 1024 * 1024LL;
}
else
{
space = space * 1024 * 1024LL;
}
snprintf(dec, sizeof(dec), "%lld", space);
VTOY_JSON_FMT_STRN("reserve_space", dec);
}
else
{
VTOY_JSON_FMT_STRN("reserve_space", "0");
}
VTOY_JSON_FMT_UINT("partstyle", ventoy_code_get_cur_part_style());
VTOY_JSON_FMT_UINT("secure_boot", g_secure_boot_support);
VTOY_JSON_FMT_UINT("align_4kb", g_align_part_with_4k);
VTOY_JSON_FMT_OBJ_END();
VTOY_JSON_FMT_END(pos);
out[0] = 0;
ventoy_func_handler(buf, out, sizeof(out));
vlog("func handler install <%s>\n", out);
if (strstr(out, "success"))
{
while (percent != 100)
{
percent = ventoy_code_get_percent();
set_progress_bar_percent(percent);
GTK_MSG_ITERATION();
usleep(50 * 1000);
}
ret = ventoy_code_get_result();
ventoy_code_refresh_device();
cur = NULL;
}
else
{
ret = 1;
}
if (ret)
{
msgbox(GTK_MESSAGE_ERROR, GTK_BUTTONS_OK, "STR_INSTALL_FAILED");
}
else
{
msgbox(GTK_MESSAGE_INFO, GTK_BUTTONS_OK, "STR_INSTALL_SUCCESS");
}
set_progress_bar_percent(0);
gtk_widget_set_sensitive(GTK_WIDGET(g_refresh_button), TRUE);
gtk_widget_set_sensitive(GTK_WIDGET(g_install_button), TRUE);
gtk_widget_set_sensitive(GTK_WIDGET(g_update_button), TRUE);
fill_dev_list(disk_name);
g_thread_run = FALSE;
return 0;
}
void on_button_install_clicked(GtkWidget *widget, gpointer data)
{
int active;
ventoy_disk *cur = NULL;
if (g_thread_run || ventoy_code_is_busy())
{
msgbox(GTK_MESSAGE_INFO, GTK_BUTTONS_OK, "STR_WAIT_PROCESS");
return;
}
active = gtk_combo_box_get_active((GtkComboBox *)g_dev_combobox);
if (active < 0 || active >= g_disk_num)
{
vlog("invalid active combox id %d\n", active);
return;
}
cur = g_disk_list + active;
if (ventoy_code_get_cur_part_style() == 0 && cur->size_in_byte > 2199023255552ULL)
{
msgbox(GTK_MESSAGE_ERROR, GTK_BUTTONS_OK, "STR_DISK_2TB_MBR_ERROR");
return;
}
if (GTK_RESPONSE_CANCEL == msgbox(GTK_MESSAGE_WARNING, GTK_BUTTONS_OK_CANCEL, "STR_INSTALL_TIP"))
{
return;
}
if (GTK_RESPONSE_CANCEL == msgbox(GTK_MESSAGE_WARNING, GTK_BUTTONS_OK_CANCEL, "STR_INSTALL_TIP2"))
{
return;
}
gtk_widget_set_sensitive (GTK_WIDGET(g_refresh_button), FALSE);
gtk_widget_set_sensitive (GTK_WIDGET(g_install_button), FALSE);
gtk_widget_set_sensitive (GTK_WIDGET(g_update_button), FALSE);
g_thread_run = TRUE;
install_proc(cur);
}
static int update_proc(ventoy_disk *cur)
{
int ret = 0;
int percent = 0;
char buf[1024];
char out[256];
char disk_name[32];
g_snprintf(disk_name, sizeof(disk_name), "%s", cur->disk_name);
g_snprintf(buf, sizeof(buf), "{\"method\":\"update\",\"disk\":\"%s\",\"secure_boot\":%d}",
disk_name, g_secure_boot_support);
out[0] = 0;
ventoy_func_handler(buf, out, sizeof(out));
vlog("func handler update <%s>\n", out);
if (strstr(out, "success"))
{
while (percent != 100)
{
percent = ventoy_code_get_percent();
set_progress_bar_percent(percent);
GTK_MSG_ITERATION();
usleep(50 * 1000);
}
ret = ventoy_code_get_result();
ventoy_code_refresh_device();
cur = NULL;
}
else
{
ret = 1;
}
if (ret)
{
msgbox(GTK_MESSAGE_ERROR, GTK_BUTTONS_OK, "STR_UPDATE_FAILED");
}
else
{
msgbox(GTK_MESSAGE_INFO, GTK_BUTTONS_OK, "STR_UPDATE_SUCCESS");
}
set_progress_bar_percent(0);
gtk_widget_set_sensitive(GTK_WIDGET(g_refresh_button), TRUE);
gtk_widget_set_sensitive(GTK_WIDGET(g_install_button), TRUE);
gtk_widget_set_sensitive(GTK_WIDGET(g_update_button), TRUE);
fill_dev_list(disk_name);
g_thread_run = FALSE;
return 0;
}
void on_button_update_clicked(GtkWidget *widget, gpointer data)
{
int active;
ventoy_disk *cur = NULL;
if (g_thread_run || ventoy_code_is_busy())
{
msgbox(GTK_MESSAGE_INFO, GTK_BUTTONS_OK, "STR_WAIT_PROCESS");
return;
}
active = gtk_combo_box_get_active((GtkComboBox *)g_dev_combobox);
if (active < 0 || active >= g_disk_num)
{
vlog("invalid active combox id %d\n", active);
return;
}
cur = g_disk_list + active;
if (cur->vtoydata.ventoy_valid == 0)
{
vlog("invalid ventoy version.\n");
return;
}
if (GTK_RESPONSE_CANCEL == msgbox(GTK_MESSAGE_INFO, GTK_BUTTONS_OK_CANCEL, "STR_UPDATE_TIP"))
{
return;
}
gtk_widget_set_sensitive (GTK_WIDGET(g_refresh_button), FALSE);
gtk_widget_set_sensitive (GTK_WIDGET(g_install_button), FALSE);
gtk_widget_set_sensitive (GTK_WIDGET(g_update_button), FALSE);
g_thread_run = TRUE;
update_proc(cur);
}
static gint lang_compare(gconstpointer a, gconstpointer b)
{
const char *name1 = (const char *)a;
const char *name2 = (const char *)b;
if (strncmp(name1, "Chinese Simplified", 18) == 0)
{
return -1;
}
else if (strncmp(name2, "Chinese Simplified", 18) == 0)
{
return 1;
}
else
{
return g_strcmp0(name1, name2);
}
}
static int load_languages(void)
{
int size = 0;
char *pBuf = NULL;
char *pCur = NULL;
const char *pCurLang = NULL;
const char *pName = NULL;
VTOY_JSON *json = NULL;
VTOY_JSON *node = NULL;
VTOY_JSON *lang = NULL;
GSList *pGroup = NULL;
GList *pNameNode = NULL;
GList *pNameList = NULL;
GtkRadioMenuItem *pItem = NULL;
vlog("load_languages ...\n");
pCurLang = ventoy_code_get_cur_language();
if (pCurLang[0] == 0)
{
pName = getenv("LANG");
if (pName && strncmp(pName, "zh_CN", 5) == 0)
{
ventoy_code_set_cur_language("Chinese Simplified (简体中文)");
}
else
{
ventoy_code_set_cur_language("English (English)");
}
pCurLang = ventoy_code_get_cur_language();
}
vlog("current language <%s>\n", pCurLang);
ventoy_read_file_to_buf("./tool/languages.json", 1, (void **)&pBuf, &size);
json = vtoy_json_create();
vtoy_json_parse(json, pBuf);
g_languages_json = json;
for (node = json->pstChild; node; node = node->pstNext)
{
pName = vtoy_json_get_string_ex(node->pstChild, "name");
if (pName)
{
pNameList = g_list_append(pNameList, (gpointer)pName);
}
for (lang = node->pstChild; lang; lang = lang->pstNext)
{
if (lang->enDataType == JSON_TYPE_STRING)
{
pCur = lang->unData.pcStrVal;
while (*pCur)
{
if (*pCur == '#')
{
*pCur = '\r';
}
else if (*pCur == '@')
{
*pCur = '\n';
}
pCur++;
}
}
}
}
pNameList = g_list_sort(pNameList, lang_compare);
for (pNameNode = g_list_first(pNameList); pNameNode; pNameNode = g_list_next(pNameNode))
{
pName = (char *)(pNameNode->data);
pItem = (GtkRadioMenuItem *)gtk_radio_menu_item_new_with_label(pGroup, pName);
pGroup = gtk_radio_menu_item_get_group(pItem);
if (strcmp(pCurLang, pName) == 0)
{
gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(pItem), TRUE);
}
g_signal_connect(pItem, "toggled", G_CALLBACK(on_language_toggled), (gpointer)pName);
gtk_widget_show((GtkWidget *)pItem);
gtk_menu_shell_append(GTK_MENU_SHELL(g_lang_menu), (GtkWidget *)pItem);
}
g_list_free(pNameList);
free(pBuf);
select_language(pCurLang);
g_languages_toggled_proc = 1;
return 0;
}
void on_part_cfg_ok(GtkWidget *widget, gpointer data)
{
const char *pos = NULL;
const char *input = NULL;
char device[256];
gboolean checked = gtk_toggle_button_get_active(g_part_preserve_checkbox);
if (checked)
{
input = gtk_entry_get_text(g_part_reserve_space_value);
if (input == NULL || input[0] == 0)
{
msgbox(GTK_MESSAGE_ERROR, GTK_BUTTONS_OK, "STR_SPACE_VAL_INVALID");
return;
}
for (pos = input; *pos; pos++)
{
if (*pos < '0' || *pos >= '9')
{
msgbox(GTK_MESSAGE_ERROR, GTK_BUTTONS_OK, "STR_SPACE_VAL_INVALID");
return;
}
}
g_preserve_space_unit = gtk_combo_box_get_active((GtkComboBox *)g_part_space_unit_combox);
g_preserve_space_number = (int)strtol(input, NULL, 10);
g_snprintf(device, sizeof(device), "%s [ -%d%s ]",
language_string("STR_DEVICE"), g_preserve_space_number,
g_preserve_space_unit ? "GB" : "MB");
gtk_label_set_text(g_device_title, device);
}
else
{
gtk_label_set_text(g_device_title, language_string("STR_DEVICE"));
}
g_preserve_space_check = checked;
g_align_part_with_4k = gtk_toggle_button_get_active(g_part_align_checkbox);
gtk_widget_hide(g_partCfgWindow);
}
void on_part_cfg_cancel(GtkWidget *widget, gpointer data)
{
gtk_widget_hide(g_partCfgWindow);
}
int on_part_cfg_close(GtkWidget *widget, gpointer data)
{
gtk_widget_hide(g_partCfgWindow);
return TRUE;
}
void on_part_config(GtkMenuItem *menuItem, gpointer data)
{
char value[64];
gtk_toggle_button_set_active(g_part_align_checkbox, g_align_part_with_4k);
gtk_toggle_button_set_active(g_part_preserve_checkbox, g_preserve_space_check);
gtk_widget_set_sensitive(GTK_WIDGET(g_part_reserve_space_value), g_preserve_space_check);
gtk_widget_set_sensitive(GTK_WIDGET(g_part_space_unit_combox), g_preserve_space_check);
if (g_preserve_space_check)
{
g_snprintf(value, sizeof(value), "%d", g_preserve_space_number);
gtk_entry_set_text(g_part_reserve_space_value, value);
gtk_combo_box_set_active((GtkComboBox *)g_part_space_unit_combox, g_preserve_space_unit);
}
gtk_widget_show_all(g_partCfgWindow);
}
void on_reserve_space_toggled(GtkMenuItem *menuItem, gpointer data)
{
gboolean checked = gtk_toggle_button_get_active(g_part_preserve_checkbox);
gtk_widget_set_sensitive(GTK_WIDGET(g_part_reserve_space_value), checked);
gtk_widget_set_sensitive(GTK_WIDGET(g_part_space_unit_combox), checked);
}
static void init_part_cfg_window(GtkBuilder *pBuilder)
{
#if GTK_CHECK_VERSION(3, 0, 0)
GtkWidget *pHeader = NULL;
pHeader = gtk_header_bar_new();
gtk_header_bar_set_show_close_button(GTK_HEADER_BAR(pHeader), FALSE);
gtk_window_set_titlebar (GTK_WINDOW(g_partCfgWindow), pHeader);
gtk_window_set_title(GTK_WINDOW(g_partCfgWindow), "Partition Configuration");
#endif
gtk_combo_box_set_active((GtkComboBox *)g_part_space_unit_combox, g_preserve_space_unit);
gtk_widget_set_sensitive (GTK_WIDGET(g_part_reserve_space_value), FALSE);
gtk_widget_set_sensitive (GTK_WIDGET(g_part_space_unit_combox), FALSE);
SIGNAL("space_check_btn", "toggled", on_reserve_space_toggled);
SIGNAL("button_partcfg_ok", "clicked", on_part_cfg_ok);
SIGNAL("button_partcfg_cancel", "clicked", on_part_cfg_cancel);
SIGNAL("part_cfg_dlg", "delete_event", on_part_cfg_close);
}
void on_init_window(GtkBuilder *pBuilder)
{
GSList *pGroup = NULL;
char version[512];
vlog("on_init_window ...\n");
g_pXmlBuilder = pBuilder;
g_topWindow = BUILDER_ITEM(GtkWidget, "window");
g_partCfgWindow = BUILDER_ITEM(GtkWidget, "part_cfg_dlg");
g_dev_combobox = BUILDER_ITEM(GtkComboBoxText, "combobox_devlist");
g_refresh_button = BUILDER_ITEM(GtkButton, "button_refresh");
g_install_button = BUILDER_ITEM(GtkButton, "button_install");
g_update_button = BUILDER_ITEM(GtkButton, "button_update");
g_lang_menu = BUILDER_ITEM(GtkMenu, "submenu_language");
g_menu_item_secure_boot = BUILDER_ITEM(GtkCheckMenuItem, "menu_item_secure");
g_menu_item_mbr = BUILDER_ITEM(GtkCheckMenuItem, "menu_item_mbr");
g_menu_item_gpt = BUILDER_ITEM(GtkCheckMenuItem, "menu_item_gpt");
g_menu_item_show_all = BUILDER_ITEM(GtkCheckMenuItem, "menu_item_show_all");
g_device_title = BUILDER_ITEM(GtkLabel, "label_device");
g_label_local_part_style = BUILDER_ITEM(GtkLabel, "label_local_part_style");
g_label_dev_part_style = BUILDER_ITEM(GtkLabel, "label_dev_part_style");
g_label_local_ver = BUILDER_ITEM(GtkLabel, "label_local_ver_value");
g_label_disk_ver = BUILDER_ITEM(GtkLabel, "label_dev_ver_value");
g_label_status = BUILDER_ITEM(GtkLabel, "label_status");
g_image_secure_local = BUILDER_ITEM(GtkImage, "image_secure_local");
g_image_secure_device = BUILDER_ITEM(GtkImage, "image_secure_dev");
g_part_preserve_checkbox = BUILDER_ITEM(GtkToggleButton, "space_check_btn");
g_part_align_checkbox = BUILDER_ITEM(GtkToggleButton, "space_align_btn");
g_part_reserve_space_value = BUILDER_ITEM(GtkEntry, "entry_reserve_space");
g_part_space_unit_combox = BUILDER_ITEM(GtkComboBoxText, "comboboxtext_unit");
g_progress_bar = BUILDER_ITEM(GtkProgressBar, "progressbar1");
init_part_cfg_window(pBuilder);
/* for gtk2 */
gtk_frame_set_shadow_type(BUILDER_ITEM(GtkFrame, "frame_dummy1"), GTK_SHADOW_NONE);
gtk_frame_set_shadow_type(BUILDER_ITEM(GtkFrame, "frame_dummy2"), GTK_SHADOW_NONE);
/* join group */
pGroup = gtk_radio_menu_item_get_group((GtkRadioMenuItem *)g_menu_item_mbr);
gtk_radio_menu_item_set_group((GtkRadioMenuItem *)g_menu_item_gpt, pGroup);
gtk_widget_hide((GtkWidget *)g_image_secure_local);
gtk_widget_hide((GtkWidget *)g_image_secure_device);
g_snprintf(version, sizeof(version), VTOY_VER_FMT, ventoy_get_local_version());
gtk_label_set_markup(g_label_local_ver, version);
init_part_style_menu();
gtk_check_menu_item_set_active(g_menu_item_show_all, ventoy_code_get_cur_show_all());
load_languages();
SIGNAL("combobox_devlist", "changed", on_devlist_changed);
SIGNAL("button_refresh", "clicked", on_button_refresh_clicked);
SIGNAL("button_install", "clicked", on_button_install_clicked);
SIGNAL("button_update", "clicked", on_button_update_clicked);
SIGNAL("menu_item_secure", "toggled", on_secure_boot_toggled);
SIGNAL("menu_item_mbr", "toggled", on_part_style_toggled);
SIGNAL("menu_item_show_all", "toggled", on_show_all_toggled);
SIGNAL("menu_item_part_cfg", "activate", on_part_config);
SIGNAL("menu_item_clear", "activate", on_clear_ventoy);
fill_dev_list(NULL);
return;
}
int on_exit_window(GtkWidget *widget, gpointer data)
{
vlog("on_exit_window ...\n");
if (g_thread_run || ventoy_code_is_busy())
{
msgbox(GTK_MESSAGE_INFO, GTK_BUTTONS_OK, "STR_WAIT_PROCESS");
return TRUE;
}
ventoy_code_save_cfg();
return FALSE;
}
/******************************************************************************
* ventoy_gtk.h
*
* Copyright (c) 2021, longpanda <admin@ventoy.net>
*
* 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 <http://www.gnu.org/licenses/>.
*
*/
#ifndef __VENTOY_GTK_H__
#define __VENTOY_GTK_H__
int ventoy_disk_init(void);
void ventoy_disk_exit(void);
int ventoy_http_init(void);
void ventoy_http_exit(void);
int ventoy_log_init(void);
void ventoy_log_exit(void);
void *get_refresh_icon_raw_data(int *len);
void *get_secure_icon_raw_data(int *len);
void *get_window_icon_raw_data(int *len);
int ventoy_func_handler(const char *jsonstr, char *jsonbuf, int buflen);
const char * ventoy_code_get_cur_language(void);
int ventoy_code_get_cur_part_style(void);
void ventoy_code_set_cur_part_style(int style);
int ventoy_code_get_cur_show_all(void);
void ventoy_code_set_cur_show_all(int show_all);
void ventoy_code_set_cur_language(const char *lang);
void ventoy_code_save_cfg(void);
void on_init_window(GtkBuilder *pBuilder);
int on_exit_window(GtkWidget *widget, gpointer data) ;
void ventoy_code_refresh_device(void);
int ventoy_code_is_busy(void);
int ventoy_code_get_percent(void);
int ventoy_code_get_result(void);
int msgbox(GtkMessageType type, GtkButtonsType buttons, const char *strid);
#define MAX_PARAS 64
#define VTOY_VER_FMT "<span weight='bold' foreground='red' size='xx-large'>%s</span>"
#define LANG_LABEL_TEXT(id, str) \
gtk_label_set_text(BUILDER_ITEM(GtkLabel, id), vtoy_json_get_string_ex(node->pstChild, str))
#define LANG_BUTTON_TEXT(id, str) \
gtk_button_set_label(BUILDER_ITEM(GtkButton, id), vtoy_json_get_string_ex(node->pstChild, str))
#define LANG_MENU_ITEM_TEXT(id, str) \
gtk_menu_item_set_label(BUILDER_ITEM(GtkMenuItem, id), vtoy_json_get_string_ex(node->pstChild, str))
#define LANG_CHKBTN_TEXT(id, str) \
gtk_check_button_set_label(BUILDER_ITEM(GtkCheckButton, id), vtoy_json_get_string_ex(node->pstChild, str))
#define BUILDER_ITEM(type, id) (type *)gtk_builder_get_object(g_pXmlBuilder, id)
#define SIGNAL(id, act, func) \
g_signal_connect(gtk_builder_get_object(g_pXmlBuilder, id), act, G_CALLBACK(func), NULL)
#define GTK_MSG_ITERATION() while (gtk_events_pending ()) gtk_main_iteration()
#endif /* __VENTOY_GTK_H__ */
This source diff could not be displayed because it is too large. You can view the blob instead.
......@@ -40,9 +40,13 @@
#include <ventoy_http.h>
#include "fat_filelib.h"
static char *g_pub_out_buf = NULL;
static int g_pub_out_max = 0;
static pthread_mutex_t g_api_mutex;
static char g_cur_language[128];
static int g_cur_part_style = 0;
static int g_cur_show_all = 0;
static char g_cur_server_token[64];
static struct mg_context *g_ventoy_http_ctx = NULL;
......@@ -52,8 +56,8 @@ static uint8_t *g_grub_stg1_raw_img = NULL;
static char g_cur_process_diskname[64];
static char g_cur_process_type[64];
static int g_cur_process_result = 0;
static PROGRESS_POINT g_current_progress = PT_FINISH;
static volatile int g_cur_process_result = 0;
static volatile PROGRESS_POINT g_current_progress = PT_FINISH;
static int ventoy_load_mbr_template(void)
{
......@@ -162,7 +166,8 @@ static int ventoy_http_save_cfg(void)
return 0;
}
fprintf(fp, "[Ventoy]\nLanguage=%s\nPartStyle=%d\n", g_cur_language, g_cur_part_style);
fprintf(fp, "[Ventoy]\nLanguage=%s\nPartStyle=%d\nShowAllDevice=%d\n",
g_cur_language, g_cur_part_style, g_cur_show_all);
fclose(fp);
return 0;
......@@ -205,6 +210,10 @@ static int ventoy_http_load_cfg(void)
{
g_cur_part_style = (int)strtol(line + strlen("PartStyle="), NULL, 10);
}
else if (strncmp(line, "ShowAllDevice=", strlen("ShowAllDevice=")) == 0)
{
g_cur_show_all = (int)strtol(line + strlen("ShowAllDevice="), NULL, 10);
}
}
fclose(fp);
......@@ -214,23 +223,47 @@ static int ventoy_http_load_cfg(void)
static int ventoy_json_result(struct mg_connection *conn, const char *err)
{
mg_printf(conn,
"HTTP/1.1 200 OK \r\n"
"Content-Type: application/json\r\n"
"Content-Length: %d\r\n"
"\r\n%s",
(int)strlen(err), err);
if (conn)
{
mg_printf(conn,
"HTTP/1.1 200 OK \r\n"
"Content-Type: application/json\r\n"
"Content-Length: %d\r\n"
"\r\n%s",
(int)strlen(err), err);
}
else
{
memcpy(g_pub_out_buf, err, (int)strlen(err) + 1);
}
return 0;
}
static int ventoy_json_buffer(struct mg_connection *conn, const char *json_buf, int json_len)
{
mg_printf(conn,
"HTTP/1.1 200 OK \r\n"
"Content-Type: application/json\r\n"
"Content-Length: %d\r\n"
"\r\n%s",
json_len, json_buf);
if (conn)
{
mg_printf(conn,
"HTTP/1.1 200 OK \r\n"
"Content-Type: application/json\r\n"
"Content-Length: %d\r\n"
"\r\n%s",
json_len, json_buf);
}
else
{
if (json_len >= g_pub_out_max)
{
vlog("json buffer overflow\n");
}
else
{
memcpy(g_pub_out_buf, json_buf, json_len);
g_pub_out_buf[json_len] = 0;
}
}
return 0;
}
......@@ -1369,6 +1402,41 @@ static int ventoy_json_handler(struct mg_connection *conn, VTOY_JSON *json)
return 0;
}
int ventoy_func_handler(const char *jsonstr, char *jsonbuf, int buflen)
{
int i;
const char *method = NULL;
VTOY_JSON *json = NULL;
g_pub_out_buf = jsonbuf;
g_pub_out_max = buflen;
json = vtoy_json_create();
if (JSON_SUCCESS == vtoy_json_parse(json, jsonstr))
{
pthread_mutex_lock(&g_api_mutex);
method = vtoy_json_get_string_ex(json->pstChild, "method");
for (i = 0; i < (int)(sizeof(g_ventoy_json_cb) / sizeof(g_ventoy_json_cb[0])); i++)
{
if (method && strcmp(method, g_ventoy_json_cb[i].method) == 0)
{
g_ventoy_json_cb[i].callback(NULL, json->pstChild);
break;
}
}
pthread_mutex_unlock(&g_api_mutex);
}
else
{
ventoy_json_result(NULL, VTOY_JSON_INVALID_RET);
}
vtoy_json_destroy(json);
return 0;
}
static int ventoy_request_handler(struct mg_connection *conn)
{
int post_data_len;
......@@ -1481,3 +1549,77 @@ void ventoy_http_exit(void)
g_efi_part_raw_img = NULL;
}
const char * ventoy_code_get_cur_language(void)
{
return g_cur_language;
}
int ventoy_code_get_cur_part_style(void)
{
return g_cur_part_style;
}
void ventoy_code_set_cur_part_style(int style)
{
pthread_mutex_lock(&g_api_mutex);
g_cur_part_style = style;
ventoy_http_save_cfg();
pthread_mutex_unlock(&g_api_mutex);
}
int ventoy_code_get_cur_show_all(void)
{
return g_cur_show_all;
}
void ventoy_code_set_cur_show_all(int show_all)
{
pthread_mutex_lock(&g_api_mutex);
g_cur_show_all = show_all;
ventoy_http_save_cfg();
pthread_mutex_unlock(&g_api_mutex);
}
void ventoy_code_set_cur_language(const char *lang)
{
pthread_mutex_lock(&g_api_mutex);
scnprintf(g_cur_language, "%s", lang);
ventoy_http_save_cfg();
pthread_mutex_unlock(&g_api_mutex);
}
void ventoy_code_refresh_device(void)
{
if (g_current_progress == PT_FINISH)
{
g_disk_num = 0;
ventoy_disk_enumerate_all();
}
}
int ventoy_code_is_busy(void)
{
return (g_current_progress == PT_FINISH) ? 0 : 1;
}
int ventoy_code_get_percent(void)
{
return g_current_progress * 100 / PT_FINISH;
}
int ventoy_code_get_result(void)
{
return g_cur_process_result;
}
void ventoy_code_save_cfg(void)
{
ventoy_http_save_cfg();
}
#include <gtk/gtk.h>
#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>
#include <string.h>
#include <stdarg.h>
#include <errno.h>
#include <time.h>
#include <unistd.h>
#include <ventoy_define.h>
#include <ventoy_util.h>
#include "ventoy_gtk.h"
static int set_image_from_pixbuf(GtkBuilder *pBuilder, const char *id, const void *pData, int len)
{
GtkImage *pImage = NULL;
GdkPixbuf *pPixbuf = NULL;
GInputStream *pStream = NULL;
pImage = (GtkImage *)gtk_builder_get_object(pBuilder, id);
pStream = g_memory_input_stream_new_from_data(pData, len, NULL);
pPixbuf = gdk_pixbuf_new_from_stream(pStream, NULL, NULL);
gtk_image_set_from_pixbuf(pImage, pPixbuf);
return 0;
}
static int set_window_icon_from_pixbuf(GtkWindow *window, const void *pData, int len)
{
GdkPixbuf *pPixbuf = NULL;
GInputStream *pStream = NULL;
pStream = g_memory_input_stream_new_from_data(pData, len, NULL);
pPixbuf = gdk_pixbuf_new_from_stream(pStream, NULL, NULL);
gtk_window_set_icon(window, pPixbuf);
return 0;
}
int early_msgbox(GtkMessageType type, GtkButtonsType buttons, const char *str)
{
int ret;
GtkWidget *pMsgBox = NULL;
pMsgBox= gtk_message_dialog_new(NULL, GTK_DIALOG_MODAL, type, buttons, str);
ret = gtk_dialog_run(GTK_DIALOG(pMsgBox));
gtk_widget_destroy(pMsgBox);
return ret;
}
int main(int argc, char *argv[])
{
int len;
const void *pData = NULL;
GtkWidget *pWidget = NULL;
GtkBuilder *pBuilder = NULL;
GError *error = NULL;
gtk_init(&argc, &argv);
if (geteuid() != 0)
{
early_msgbox(GTK_MESSAGE_ERROR, GTK_BUTTONS_CLOSE,
"Ventoy2Disk permission denied!\r\nPlease run with root privileges.");
return EACCES;
}
if (access("./boot/boot.img", F_OK) == -1)
{
early_msgbox(GTK_MESSAGE_ERROR, GTK_BUTTONS_CLOSE, "Please run under the correct directory.");
return 1;
}
ventoy_log_init();
vlog("================================================\n");
vlog("===== Ventoy2Disk %s powered by GTK%d.x =====\n", ventoy_get_local_version(), GTK_MAJOR_VERSION);
vlog("================================================\n");
ventoy_disk_init();
ventoy_http_init();
pBuilder = gtk_builder_new();
if (!pBuilder)
{
vlog("failed to create builder\n");
return 1;
}
if (!gtk_builder_add_from_file(pBuilder, "./tool/VentoyGTK.glade", &error))
{
vlog("gtk_builder_add_from_file failed:%s\n", error->message);
g_clear_error(&error);
return 1;
}
pData = get_refresh_icon_raw_data(&len);
set_image_from_pixbuf(pBuilder, "image_refresh", pData, len);
pData = get_secure_icon_raw_data(&len);
set_image_from_pixbuf(pBuilder, "image_secure_local", pData, len);
set_image_from_pixbuf(pBuilder, "image_secure_dev", pData, len);
pWidget = GTK_WIDGET(gtk_builder_get_object(pBuilder, "window"));
gtk_widget_show_all(pWidget);
pData = get_window_icon_raw_data(&len);
set_window_icon_from_pixbuf(GTK_WINDOW(pWidget), pData, len);
on_init_window(pBuilder);
g_signal_connect(G_OBJECT(pWidget), "delete_event", G_CALLBACK(on_exit_window), NULL);
gtk_main();
ventoy_disk_exit();
ventoy_http_exit();
g_object_unref (G_OBJECT(pBuilder));
vlog("######## Ventoy2Disk GTK %s exit ########\n", ventoy_get_local_version());
/* log exit must at the end */
ventoy_log_exit();
return 0;
}
#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>
#include <string.h>
#include <stdarg.h>
#include <unistd.h>
#include <errno.h>
#include <time.h>
#include <dirent.h>
#include <sys/utsname.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <sys/fcntl.h>
#include <sys/mman.h>
#define LIB_FLAG_GTK2 (1 << 0)
#define LIB_FLAG_GTK3 (1 << 1)
#define LIB_FLAG_GTK4 (1 << 2)
#define LIB_FLAG_QT4 (1 << 3)
#define LIB_FLAG_QT5 (1 << 4)
#define LIB_FLAG_QT6 (1 << 5)
#define LIB_FLAG_GLADE2 (1 << 30)
#define LIB_FLAG_GTK (LIB_FLAG_GTK2 | LIB_FLAG_GTK3 | LIB_FLAG_GTK4)
#define LIB_FLAG_QT (LIB_FLAG_QT4 | LIB_FLAG_QT5 | LIB_FLAG_QT6)
#define MAX_PARAS 64
#define MAX_LOG_BUF (1024 * 1024)
#define VTOY_GUI_PATH "_vtoy_gui_path_="
#define VTOY_ENV_STR "_vtoy_env_str_="
#define LD_CACHE_FILE "/etc/ld.so.cache"
#define INT2STR_YN(a) ((a) == 0 ? "NO" : "YES")
static char *g_log_buf = NULL;
extern char ** environ;
#define CACHEMAGIC "ld.so-1.7.0"
struct file_entry
{
int flags; /* This is 1 for an ELF library. */
unsigned int key, value; /* String table indices. */
};
struct cache_file
{
char magic[sizeof CACHEMAGIC - 1];
unsigned int nlibs;
struct file_entry libs[0];
};
#define CACHEMAGIC_NEW "glibc-ld.so.cache"
#define CACHE_VERSION "1.1"
#define CACHEMAGIC_VERSION_NEW CACHEMAGIC_NEW CACHE_VERSION
struct file_entry_new
{
int32_t flags; /* This is 1 for an ELF library. */
uint32_t key, value; /* String table indices. */
uint32_t osversion; /* Required OS version. */
uint64_t hwcap; /* Hwcap entry. */
};
struct cache_file_new
{
char magic[sizeof CACHEMAGIC_NEW - 1];
char version[sizeof CACHE_VERSION - 1];
uint32_t nlibs; /* Number of entries. */
uint32_t len_strings; /* Size of string table. */
uint32_t unused[5]; /* Leave space for future extensions
and align to 8 byte boundary. */
struct file_entry_new libs[0]; /* Entries describing libraries. */
/* After this the string table of size len_strings is found. */
};
/* Used to align cache_file_new. */
#define ALIGN_CACHE(addr) \
(((addr) + __alignof__ (struct cache_file_new) -1) \
& (~(__alignof__ (struct cache_file_new) - 1)))
static void vlog(const char *Fmt, ...)
{
int buflen;
char *buf = NULL;
char log[512];
va_list arg;
time_t stamp;
struct tm ttm;
FILE *fp;
time(&stamp);
localtime_r(&stamp, &ttm);
if (g_log_buf)
{
buf = g_log_buf;
buflen = MAX_LOG_BUF;
}
else
{
buf = log;
buflen = sizeof(log);
}
va_start(arg, Fmt);
vsnprintf(buf, buflen, Fmt, arg);
va_end(arg);
fp = fopen("log.txt", "a+");
if (fp)
{
fprintf(fp, "[%04u/%02u/%02u %02u:%02u:%02u] %s",
ttm.tm_year + 1900, ttm.tm_mon, ttm.tm_mday,
ttm.tm_hour, ttm.tm_min, ttm.tm_sec,
buf);
fclose(fp);
}
printf("[%04u/%02u/%02u %02u:%02u:%02u] %s",
ttm.tm_year + 1900, ttm.tm_mon, ttm.tm_mday,
ttm.tm_hour, ttm.tm_min, ttm.tm_sec,
buf);
}
static int is_gtk_env(void)
{
const char *env = NULL;
env = getenv("GNOME_SETUP_DISPLAY");
if (env && env[0] == ':')
{
vlog("GNOME_SETUP_DISPLAY=%s\n", env);
return 1;
}
env = getenv("DESKTOP_SESSION");
if (env && strcasecmp(env, "xfce") == 0)
{
vlog("DESKTOP_SESSION=%s\n", env);
return 1;
}
return 0;
}
static int is_qt_env(void)
{
return 0;
}
static int detect_gtk_version(int libflag)
{
int gtk2;
int gtk3;
int gtk4;
int glade2;
gtk2 = libflag & LIB_FLAG_GTK2;
gtk3 = libflag & LIB_FLAG_GTK3;
gtk4 = libflag & LIB_FLAG_GTK4;
glade2 = libflag & LIB_FLAG_GLADE2;
if (gtk2 > 0 && glade2 > 0 && (gtk3 == 0 && gtk4 == 0))
{
return 2;
}
if (gtk3 > 0 && (gtk2 == 0 && gtk4 == 0))
{
return 3;
}
if (gtk4 > 0 && (gtk2 == 0 && gtk3 == 0))
{
return 4;
}
if (gtk3 > 0)
{
return 3;
}
if (gtk4 > 0)
{
return 4;
}
if (gtk2 > 0 && glade2 > 0)
{
return 2;
}
return 0;
}
static int detect_qt_version(int libflag)
{
int qt4;
int qt5;
int qt6;
qt4 = libflag & LIB_FLAG_QT4;
qt5 = libflag & LIB_FLAG_QT5;
qt6 = libflag & LIB_FLAG_QT6;
if (qt4 > 0 && (qt5 == 0 && qt6 == 0))
{
return 4;
}
if (qt5 > 0 && (qt4 == 0 && qt6 == 0))
{
return 5;
}
if (qt6 > 0 && (qt4 == 0 && qt5 == 0))
{
return 6;
}
if (qt5 > 0)
{
return 5;
}
if (qt4 > 0)
{
return 4;
}
if (qt6 > 0)
{
return 6;
}
return 0;
}
int bit_from_machine(const char *machine)
{
if (strstr(machine, "64"))
{
return 64;
}
else
{
return 32;
}
}
int get_os_bit(int *bit)
{
int ret;
struct utsname unameData;
memset(&unameData, 0, sizeof(unameData));
ret = uname(&unameData);
if (ret != 0)
{
vlog("uname error, code: %d\n", errno);
return 1;
}
*bit = strstr(unameData.machine, "64") ? 64 : 32;
vlog("uname -m <%s> %dbit\n", unameData.machine, *bit);
return 0;
}
int read_file_1st_line(const char *file, char *buffer, int buflen)
{
FILE *fp = NULL;
fp = fopen(file, "r");
if (fp == NULL)
{
vlog("Failed to open file %s code:%d", file, errno);
return 1;
}
fgets(buffer, buflen, fp);
fclose(fp);
return 0;
}
static int read_pid_cmdline(long pid, char *Buffer, int BufLen)
{
char path[256];
snprintf(path, sizeof(path), "/proc/%ld/cmdline", pid);
return read_file_1st_line(path, Buffer, BufLen);
}
static int find_exe_path(const char *exe, char *pathbuf, int buflen)
{
int i;
char path[PATH_MAX];
char *tmpptr = NULL;
char *saveptr = NULL;
char *newenv = NULL;
const char *env = getenv("PATH");
if (NULL == env)
{
return 0;
}
newenv = strdup(env);
if (!newenv)
{
return 0;
}
tmpptr = newenv;
while (NULL != (tmpptr = strtok_r(tmpptr, ":", &saveptr)))
{
snprintf(path, sizeof(path), "%s/%s", tmpptr, exe);
if (access(path, F_OK) != -1)
{
snprintf(pathbuf, buflen, "%s", path);
free(newenv);
return 1;
}
tmpptr = NULL;
}
free(newenv);
return 0;
}
void dump_args(const char *prefix, char **argv)
{
int i = 0;
vlog("=========%s ARGS BEGIN===========\n", prefix);
while (argv[i])
{
vlog("argv[%d]=<%s>\n", i, argv[i]);
i++;
}
vlog("=========%s ARGS END===========\n", prefix);
}
int pre_check(void)
{
int ret;
int bit;
int buildbit;
const char *env = NULL;
env = getenv("DISPLAY");
if (NULL == env || env[0] != ':')
{
vlog("DISPLAY not exist(%p). Not in X environment.\n", env);
return 1;
}
ret = get_os_bit(&bit);
if (ret)
{
vlog("Failed to get os bit.\n");
return 1;
}
buildbit = strstr(VTOY_GUI_ARCH, "64") ? 64 : 32;
vlog("Build bit is %d (%s)\n", buildbit, VTOY_GUI_ARCH);
if (bit != buildbit)
{
vlog("Current system is %d bit (%s). Please run the correct VentoyGUI.\n", bit, VTOY_GUI_ARCH);
return 1;
}
return 0;
}
static char * find_argv(int argc, char **argv, char *key)
{
int i;
int len;
len = (int)strlen(key);
for (i = 0; i < argc; i++)
{
if (strncmp(argv[i], key, len) == 0)
{
return argv[i];
}
}
return NULL;
}
static int adjust_cur_dir(char *argv0)
{
int ret = 2;
char c;
char *pos = NULL;
char *end = NULL;
if (argv0[0] == '.')
{
return 1;
}
for (pos = argv0; pos && *pos; pos++)
{
if (*pos == '/')
{
end = pos;
}
}
if (end)
{
c = *end;
*end = 0;
ret = chdir(argv0);
*end = c;
}
return ret;
}
static char **recover_environ_param(char *env)
{
int i = 0;
int j = 0;
int k = 0;
int cnt = 0;
char **newenvs = NULL;
for (i = 0; env[i]; i++)
{
if (env[i] == '\n')
{
cnt++;
}
}
newenvs = malloc(sizeof(char *) * (cnt + 1));
if (!newenvs)
{
vlog("malloc new envs fail %d\n", cnt + 1);
return NULL;
}
memset(newenvs, 0, sizeof(char *) * (cnt + 1));
for (j = i = 0; env[i]; i++)
{
if (env[i] == '\n')
{
env[i] = 0;
newenvs[k++] = env + j;
j = i + 1;
}
}
vlog("recover environ %d %d\n", cnt, k);
return newenvs;
}
static int restart_main(int argc, char **argv, char *guiexe)
{
int i = 0;
int j = 0;
char *para = NULL;
char **envs = NULL;
char *newargv[MAX_PARAS + 1] = { NULL };
para = find_argv(argc, argv, VTOY_ENV_STR);
if (!para)
{
vlog("failed to find %s\n", VTOY_ENV_STR);
return 1;
}
newargv[j++] = guiexe;
for (i = 1; i < argc && j < MAX_PARAS; i++)
{
if (strncmp(argv[i], "_vtoy_", 6) != 0)
{
newargv[j++] = argv[i];
}
}
envs = recover_environ_param(para + strlen(VTOY_ENV_STR));
if (envs)
{
vlog("recover success, argc=%d evecve <%s>\n", j, guiexe);
execve(guiexe, newargv, envs);
}
else
{
vlog("recover failed, argc=%d evecv <%s>\n", j, guiexe);
execv(guiexe, newargv);
}
return 1;
}
static char *create_environ_param(const char *prefix, char **envs)
{
int i = 0;
int cnt = 0;
int envlen = 0;
int prelen = 0;
char *cur = NULL;
char *para = NULL;
prelen = strlen(prefix);
for (i = 0; envs[i]; i++)
{
cnt++;
envlen += strlen(envs[i]) + 1;
}
para = malloc(prelen + envlen);
if (!para)
{
vlog("failed to malloc env str %d\n", prelen + envlen);
return NULL;
}
cur = para;
memcpy(cur, prefix, prelen);
cur += prelen;
for (i = 0; envs[i]; i++)
{
envlen = strlen(envs[i]);
memcpy(cur, envs[i], envlen);
cur[envlen] = '\n';
cur += envlen + 1;
}
vlog("create environment param %d\n", cnt);
return para;
}
static int restart_by_pkexec(int argc, char **argv, const char *curpath, const char *exe)
{
int i = 0;
int j = 0;
char envcount[64];
char path[PATH_MAX];
char pkexec[PATH_MAX];
char exepara[PATH_MAX];
char *newargv[MAX_PARAS + 1] = { NULL };
vlog("try restart self by pkexec ...\n");
if (find_exe_path("pkexec", pkexec, sizeof(pkexec)))
{
vlog("Find pkexec at <%s>\n", pkexec);
}
else
{
vlog("pkexec not found\n");
return 1;
}
if (argv[0][0] != '/')
{
snprintf(path, sizeof(path), "%s/%s", curpath, argv[0]);
}
else
{
snprintf(path, sizeof(path), "%s", argv[0]);
}
snprintf(exepara, sizeof(exepara), "%s%s", VTOY_GUI_PATH, exe);
newargv[j++] = pkexec;
newargv[j++] = path;
for (i = 1; i < argc && j < MAX_PARAS - 2; i++)
{
newargv[j++] = argv[i];
}
newargv[j++] = create_environ_param(VTOY_ENV_STR, environ);
newargv[j++] = exepara;
dump_args("PKEXEC", newargv);
execv(pkexec, newargv);
return 1;
}
static int ld_cache_lib_check(const char *lib, int *flag)
{
if (((*flag) & LIB_FLAG_GTK3) == 0)
{
if (strncmp(lib, "libgtk-3.so", 11) == 0)
{
vlog("LIB:<%s>\n", lib);
*flag |= LIB_FLAG_GTK3;
return 0;
}
}
if (((*flag) & LIB_FLAG_GTK2) == 0)
{
if (strncmp(lib, "libgtk-x11-2.0.so", 17) == 0)
{
vlog("LIB:<%s>\n", lib);
*flag |= LIB_FLAG_GTK2;
return 0;
}
}
if (((*flag) & LIB_FLAG_GTK4) == 0)
{
if (strncmp(lib, "libgtk-4.so", 11) == 0)
{
vlog("LIB:<%s>\n", lib);
*flag |= LIB_FLAG_GTK4;
return 0;
}
}
if (((*flag) & LIB_FLAG_QT4) == 0)
{
if (strncmp(lib, "libqt4", 6) == 0)
{
vlog("LIB:<%s>\n", lib);
*flag |= LIB_FLAG_QT4;
return 0;
}
}
if (((*flag) & LIB_FLAG_QT5) == 0)
{
if (strncmp(lib, "libqt5", 6) == 0)
{
vlog("LIB:<%s>\n", lib);
*flag |= LIB_FLAG_QT5;
return 0;
}
}
if (((*flag) & LIB_FLAG_QT6) == 0)
{
if (strncmp(lib, "libqt6", 6) == 0)
{
vlog("LIB:<%s>\n", lib);
*flag |= LIB_FLAG_QT6;
return 0;
}
}
if (((*flag) & LIB_FLAG_GLADE2) == 0)
{
if (strncmp(lib, "libglade-2", 10) == 0)
{
vlog("LIB:<%s>\n", lib);
*flag |= LIB_FLAG_GLADE2;
return 0;
}
}
return 0;
}
static int parse_ld_cache(int *flag)
{
int fd;
int format;
unsigned int i;
struct stat st;
size_t offset = 0;
size_t cache_size = 0;
const char *cache_data = NULL;
struct cache_file *cache = NULL;
struct cache_file_new *cache_new = NULL;
*flag = 0;
fd = open(LD_CACHE_FILE, O_RDONLY);
if (fd < 0)
{
vlog("failed to open %s err:%d\n", LD_CACHE_FILE, errno);
return 1;
}
if (fstat(fd, &st) < 0 || st.st_size == 0)
{
close(fd);
return 1;
}
cache = mmap(NULL, st.st_size, PROT_READ, MAP_PRIVATE, fd, 0);
if (cache == MAP_FAILED)
{
close(fd);
return 1;
}
cache_size = st.st_size;
if (cache_size < sizeof (struct cache_file))
{
vlog("File is not a cache file.\n");
munmap (cache, cache_size);
close(fd);
return 1;
}
if (memcmp(cache->magic, CACHEMAGIC, sizeof CACHEMAGIC - 1))
{
/* This can only be the new format without the old one. */
cache_new = (struct cache_file_new *) cache;
if (memcmp(cache_new->magic, CACHEMAGIC_NEW, sizeof CACHEMAGIC_NEW - 1) ||
memcmp (cache_new->version, CACHE_VERSION, sizeof CACHE_VERSION - 1))
{
munmap (cache, cache_size);
close(fd);
return 1;
}
format = 1;
/* This is where the strings start. */
cache_data = (const char *) cache_new;
}
else
{
/* Check for corruption, avoiding overflow. */
if ((cache_size - sizeof (struct cache_file)) / sizeof (struct file_entry) < cache->nlibs)
{
vlog("File is not a cache file.\n");
munmap (cache, cache_size);
close(fd);
return 1;
}
offset = ALIGN_CACHE(sizeof (struct cache_file) + (cache->nlibs * sizeof (struct file_entry)));
/* This is where the strings start. */
cache_data = (const char *) &cache->libs[cache->nlibs];
/* Check for a new cache embedded in the old format. */
if (cache_size > (offset + sizeof (struct cache_file_new)))
{
cache_new = (struct cache_file_new *) ((void *)cache + offset);
if (memcmp(cache_new->magic, CACHEMAGIC_NEW, sizeof CACHEMAGIC_NEW - 1) == 0 &&
memcmp(cache_new->version, CACHE_VERSION, sizeof CACHE_VERSION - 1) == 0)
{
cache_data = (const char *) cache_new;
format = 1;
}
}
}
if (format == 0)
{
vlog("%d libs found in cache format 0\n", cache->nlibs);
for (i = 0; i < cache->nlibs; i++)
{
ld_cache_lib_check(cache_data + cache->libs[i].key, flag);
}
}
else if (format == 1)
{
vlog("%d libs found in cache format 1\n", cache_new->nlibs);
for (i = 0; i < cache_new->nlibs; i++)
{
ld_cache_lib_check(cache_data + cache_new->libs[i].key, flag);
}
}
vlog("ldconfig lib flags 0x%x\n", *flag);
vlog("lib flags GLADE2:[%s] GTK2:[%s] GTK3:[%s] GTK4:[%s] QT4:[%s] QT5:[%s] QT6:[%s]\n",
INT2STR_YN((*flag) & LIB_FLAG_GLADE2), INT2STR_YN((*flag) & LIB_FLAG_GTK2),
INT2STR_YN((*flag) & LIB_FLAG_GTK3), INT2STR_YN((*flag) & LIB_FLAG_GTK4),
INT2STR_YN((*flag) & LIB_FLAG_QT4), INT2STR_YN((*flag) & LIB_FLAG_QT5),
INT2STR_YN((*flag) & LIB_FLAG_QT6));
munmap (cache, cache_size);
close (fd);
return 0;
}
static int detect_gui_exe_path(const char *curpath, char *pathbuf, int buflen)
{
int ret;
int ver;
int libflag = 0;
const char *guitype = NULL;
char line[256];
mode_t mode;
struct stat filestat;
if (access("./ventoy_gui_type", F_OK) != -1)
{
vlog("Get GUI type from ventoy_gui_type file.\n");
line[0] = 0;
read_file_1st_line("./ventoy_gui_type", line, sizeof(line));
if (strncmp(line, "gtk2", 4) == 0)
{
guitype = "gtk";
ver = 2;
parse_ld_cache(&libflag);
if ((libflag & LIB_FLAG_GLADE2) == 0)
{
vlog("libglade2 is necessary for GTK2, but not found.\n");
return 1;
}
}
else if (strncmp(line, "gtk3", 4) == 0)
{
guitype = "gtk";
ver = 3;
}
else if (strncmp(line, "gtk4", 4) == 0)
{
guitype = "gtk";
ver = 4;
}
else if (strncmp(line, "qt4", 3) == 0)
{
guitype = "qt";
ver = 4;
}
else if (strncmp(line, "qt5", 3) == 0)
{
guitype = "qt";
ver = 5;
}
else if (strncmp(line, "qt6", 3) == 0)
{
guitype = "qt";
ver = 6;
}
else
{
vlog("Current X environment is NOT supported.\n");
return 1;
}
}
else
{
vlog("Now detect the GUI type ...\n");
parse_ld_cache(&libflag);
if ((LIB_FLAG_GTK & libflag) > 0 && (LIB_FLAG_QT & libflag) == 0)
{
guitype = "gtk";
ver = detect_gtk_version(libflag);
}
else if ((LIB_FLAG_GTK & libflag) == 0 && (LIB_FLAG_QT & libflag) > 0)
{
guitype = "qt";
ver = detect_qt_version(libflag);
}
else if ((LIB_FLAG_GTK & libflag) > 0 && (LIB_FLAG_QT & libflag) > 0)
{
if (is_gtk_env())
{
guitype = "gtk";
ver = detect_gtk_version(libflag);
}
else if (is_qt_env())
{
guitype = "qt";
ver = detect_qt_version(libflag);
}
else
{
vlog("Current X environment is NOT supported.\n");
return 1;
}
}
else
{
vlog("Current X environment is NOT supported.\n");
return 1;
}
}
snprintf(pathbuf, buflen, "%s/tool/%s/Ventoy2Disk.%s%d", curpath, VTOY_GUI_ARCH, guitype, ver);
vlog("This is %s%d X environment.\n", guitype, ver);
vlog("exe = %s\n", pathbuf);
if (access(pathbuf, F_OK) == -1)
{
vlog("%s is not exist.\n", pathbuf);
return 1;
}
if (access(pathbuf, X_OK) == -1)
{
vlog("execute permission check fail, try chmod.\n", pathbuf);
if (stat(pathbuf, &filestat) == 0)
{
mode = filestat.st_mode | S_IXUSR | S_IXGRP | S_IXOTH;
ret = chmod(pathbuf, mode);
vlog("old mode=%o new mode=%o ret=%d\n", filestat.st_mode, mode, ret);
}
}
else
{
vlog("execute permission check success.\n");
}
return 0;
}
int real_main(int argc, char **argv)
{
int ret;
int euid;
char *exe = NULL;
char path[PATH_MAX];
char curpath[PATH_MAX];
ret = adjust_cur_dir(argv[0]);
vlog("\n");
vlog("=========================================================\n");
vlog("=========================================================\n");
vlog("=============== VentoyGui %s ===============\n", VTOY_GUI_ARCH);
vlog("=========================================================\n");
vlog("=========================================================\n");
euid = geteuid();
getcwd(curpath, sizeof(curpath));
vlog("pid:%ld ppid:%ld uid:%d euid:%d\n", (long)getpid(), (long)getppid(), getuid(), euid);
vlog("adjust dir:%d current path:%s\n", ret, curpath);
dump_args("RAW", argv);
if (access("./boot/boot.img", F_OK) == -1)
{
vlog("Please run under the correct directory!\n");
return 1;
}
exe = find_argv(argc, argv, VTOY_GUI_PATH);
if (exe)
{
if (euid != 0)
{
vlog("Invalid euid %d when restart.\n", euid);
return 1;
}
return restart_main(argc, argv, exe + strlen(VTOY_GUI_PATH));
}
else
{
if (pre_check())
{
return 1;
}
if (detect_gui_exe_path(curpath, path, sizeof(path)))
{
return 1;
}
if (euid == 0)
{
vlog("We have root privileges, just exec %s\n", path);
argv[0] = path;
argv[1] = NULL;
execv(argv[0], argv);
}
else
{
vlog("EUID check failed.\n");
/* try pkexec */
restart_by_pkexec(argc, argv, curpath, path);
vlog("### Please run with root privileges. ###\n");
return 1;
}
}
return 1;
}
int main(int argc, char **argv)
{
int ret;
g_log_buf = malloc(MAX_LOG_BUF);
if (!g_log_buf)
{
vlog("Failed to malloc log buffer %d\n", MAX_LOG_BUF);
return 1;
}
ret = real_main(argc, argv);
free(g_log_buf);
return ret;
}
......@@ -32,7 +32,7 @@ build_func() {
-I ./Ventoy2Disk/Lib/fat_io_lib \
\
-L ./Ventoy2Disk/Lib/fat_io_lib/lib \
Ventoy2Disk/*.c \
Ventoy2Disk/main_webui.c \
Ventoy2Disk/Core/*.c \
Ventoy2Disk/Web/*.c \
Ventoy2Disk/Lib/xz-embedded/linux/lib/decompress_unxz.c \
......
#!/bin/bash
build_func() {
libsuffix=$2
toolDir=$3
gtkver=$4
if [ "$libsuffix" = "aa64" ]; then
EXD=./EXLIB/aarch64
GTKFLAG="-pthread -I$EXD/usr/include/gtk-3.0 -I$EXD/usr/include/atk-1.0 -I$EXD/usr/include/at-spi2-atk/2.0 -I$EXD/usr/include/pango-1.0 -I$EXD/usr/include/gio-unix-2.0/ -I$EXD/usr/include/cairo -I$EXD/usr/include/gdk-pixbuf-2.0 -I$EXD/usr/include/glib-2.0 -I$EXD/usr/lib64/glib-2.0/include -I$EXD/usr/include/at-spi-2.0 -I$EXD/usr/include/dbus-1.0 -I$EXD/usr/lib64/dbus-1.0/include -I$EXD/usr/include/harfbuzz -I$EXD/usr/include/freetype2 -I$EXD/usr/include/pixman-1 -I$EXD/usr/include/libpng15 -I$EXD/usr/include/libdrm"
XXLIB="-Wl,-rpath-link $EXD/usr/lib64 -Wl,-rpath-link $EXD/lib64 -Wno-deprecated-declarations -L$EXD/usr/lib64 -lgtk-3 -lgdk-3 -latk-1.0 -lgio-2.0 -lpangocairo-1.0 -lgdk_pixbuf-2.0 -lcairo-gobject -lpango-1.0 -lcairo -lgobject-2.0 -lglib-2.0 "
elif [ "$libsuffix" = "m64e" ]; then
EXDI=./EXLIB/mips64el
EXDL=./EXLIB/mips64el/usr/lib/mips64el-linux-gnuabi64
EXDL2=./EXLIB/mips64el/lib/mips64el-linux-gnuabi64
GTKFLAG="-pthread -I$EXDI/usr/include/gtk-3.0 -I$EXDI/usr/include/at-spi2-atk/2.0 -I$EXDI/usr/include/at-spi-2.0 -I$EXDI/usr/include/dbus-1.0 -I./EXLIB/mips64el/usr/lib/x86_64-linux-gnu/dbus-1.0/include -I$EXDI/usr/include/gtk-3.0 -I$EXDI/usr/include/gio-unix-2.0 -I$EXDI/usr/include/cairo -I$EXDI/usr/include/pango-1.0 -I$EXDI/usr/include/harfbuzz -I$EXDI/usr/include/pango-1.0 -I$EXDI/usr/include/fribidi -I$EXDI/usr/include/harfbuzz -I$EXDI/usr/include/atk-1.0 -I$EXDI/usr/include/cairo -I$EXDI/usr/include/pixman-1 -I$EXDI/usr/include/uuid -I$EXDI/usr/include/freetype2 -I$EXDI/usr/include/libpng16 -I$EXDI/usr/include/gdk-pixbuf-2.0 -I$EXDI/usr/include/libmount -I$EXDI/usr/include/blkid -I$EXDI/usr/include/glib-2.0 -I$EXDL/glib-2.0/include"
XXLIB="-Wl,-rpath-link $EXDL -Wl,-rpath-link $EXDL2 -Wno-deprecated-declarations -L$EXDL -L$EXDL2 -lm -lgtk-3 -lgdk-3 -lpangocairo-1.0 -lpango-1.0 -lharfbuzz -latk-1.0 -lcairo-gobject -lcairo -lgdk_pixbuf-2.0 -lgio-2.0 -lgobject-2.0 -lglib-2.0 -lpcre "
else
if [ "$gtkver" = "gtk3" ]; then
GTKFLAG=$(pkg-config --cflags --libs gtk+-3.0)
GLADE=""
else
GTKFLAG=$(pkg-config --cflags --libs gtk+-2.0)
GLADE=$(pkg-config --cflags --libs libglade-2.0)
fi
XXLIB=""
fi
XXFLAG="-std=gnu99 -D_FILE_OFFSET_BITS=64 $GTKFLAG $GLADE -Wall"
echo "CC=$1 libsuffix=$libsuffix toolDir=$toolDir $gtkver"
$1 $XXFLAG -c -Wall -Wextra -Wshadow -Wformat-security -Winit-self \
-Wmissing-prototypes -O2 -DLINUX \
-I./Ventoy2Disk/Lib/libhttp/include \
-DNDEBUG -DNO_CGI -DNO_CACHING -DNO_SSL -DSQLITE_DISABLE_LFS -DSSL_ALREADY_INITIALIZED \
-DUSE_STACK_SIZE=102400 -DNDEBUG -fPIC \
./Ventoy2Disk/Lib/libhttp/include/civetweb.c \
-o ./civetweb.o
$1 -O2 -Wall -Wno-unused-function -DSTATIC=static -DINIT= \
-I./Ventoy2Disk \
-I./Ventoy2Disk/Core \
-I./Ventoy2Disk/Web \
-I./Ventoy2Disk/GTK \
-I./Ventoy2Disk/Include \
-I./Ventoy2Disk/Lib/libhttp/include \
-I./Ventoy2Disk/Lib/fat_io_lib/include \
-I./Ventoy2Disk/Lib/xz-embedded/linux/include \
-I./Ventoy2Disk/Lib/xz-embedded/linux/include/linux \
-I./Ventoy2Disk/Lib/xz-embedded/userspace \
-I ./Ventoy2Disk/Lib/exfat/src/libexfat \
-I ./Ventoy2Disk/Lib/exfat/src/mkfs \
-I ./Ventoy2Disk/Lib/fat_io_lib \
\
-L ./Ventoy2Disk/Lib/fat_io_lib/lib \
Ventoy2Disk/main_gtk.c \
Ventoy2Disk/Core/*.c \
Ventoy2Disk/Web/*.c \
Ventoy2Disk/GTK/*.c \
Ventoy2Disk/Lib/xz-embedded/linux/lib/decompress_unxz.c \
Ventoy2Disk/Lib/exfat/src/libexfat/*.c \
Ventoy2Disk/Lib/exfat/src/mkfs/*.c \
Ventoy2Disk/Lib/fat_io_lib/*.c \
$XXLIB \
-l pthread \
./civetweb.o \
-o Ventoy2Disk.${gtkver}_$libsuffix $XXFLAG
rm -f *.o
if [ "$libsuffix" = "aa64" ]; then
aarch64-linux-gnu-strip Ventoy2Disk.${gtkver}_$libsuffix
elif [ "$libsuffix" = "m64e" ]; then
mips-linux-gnu-strip Ventoy2Disk.${gtkver}_$libsuffix
else
strip Ventoy2Disk.${gtkver}_$libsuffix
fi
rm -f ../INSTALL/tool/$toolDir/Ventoy2Disk.${gtkver}_$libsuffix
cp -a Ventoy2Disk.${gtkver}_$libsuffix ../INSTALL/tool/$toolDir/Ventoy2Disk.${gtkver}
$1 -D_FILE_OFFSET_BITS=64 Ventoy2Disk/ventoy_gui.c -DVTOY_GUI_ARCH="\"$toolDir\"" -o VentoyGUI.$toolDir
cp -a VentoyGUI.$toolDir ../INSTALL/
}
build_func "gcc" '64' 'x86_64' 'gtk2'
build_func "gcc" '64' 'x86_64' 'gtk3'
build_func "gcc -m32" '32' 'i386' 'gtk2'
build_func "gcc -m32" '32' 'i386' 'gtk3'
build_func "aarch64-linux-gnu-gcc" 'aa64' 'aarch64' 'gtk3'
build_func "mips-linux-gnu-gcc -mips64r2 -mabi=64" 'm64e' 'mips64el' 'gtk3'
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment