Compare commits
45
Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
9ee27c5595 | ||
|
|
dc7d6dd842 | ||
|
|
a8ade5e0c2 | ||
|
|
f143ca1928 | ||
|
|
931071a0e9 | ||
|
|
bed9528756 | ||
|
|
570a432a84 | ||
|
|
1215116155 | ||
|
|
e470ef5db5 | ||
|
|
24d1b5877a | ||
|
|
aa8913ea33 | ||
|
|
647f35ea10 | ||
|
|
f44ceb560c | ||
|
|
6defa11a9e | ||
|
|
944d74f013 | ||
|
|
2bebbcbdc3 | ||
|
|
201e8b2de3 | ||
|
|
0390ad41e4 | ||
|
|
2515d1fa37 | ||
|
|
da0e6f492b | ||
|
|
3c2bdfb418 | ||
|
|
67770ec3f4 | ||
|
|
76294451d2 | ||
|
|
031fe62338 | ||
|
|
8766bfc546 | ||
|
|
2db92868a9 | ||
|
|
4bdee82489 | ||
|
|
b9fe23b7b2 | ||
|
|
d33a03c2e4
|
||
|
|
35f35b39e7 | ||
|
|
a020a2c434 | ||
|
|
77d600c663 | ||
|
|
f7dd4033ba | ||
|
|
0ca124d6cb | ||
|
|
7365a98326 | ||
|
|
9941a5dfc9 | ||
|
|
041029b406 | ||
|
|
7c4d3f57e6 | ||
|
|
00fb7afe33 | ||
|
|
db846b5eee | ||
|
|
686f18772a | ||
|
|
9b7292f3e7 | ||
|
|
e41362fb04 | ||
|
|
bbc0f1262c | ||
|
|
5fb16b1d81 |
No files matched your search
@@ -62,7 +62,7 @@ jobs:
|
||||
make -f Makefile.lin32
|
||||
chmod +x c--
|
||||
mv c-- /home/autobuild/tools/win32/bin/c--
|
||||
cp ${{ gitea.workspace }}/programs/cmm/c--/c--.ini /home/autobuild/tools/win32/bin/c--.ini
|
||||
cp ${{ gitea.workspace }}/programs/develop/cmm/c--.ini /home/autobuild/tools/win32/bin/c--.ini
|
||||
make -f Makefile.lin32 clean
|
||||
|
||||
- name: Install TCC
|
||||
|
||||
@@ -64,7 +64,7 @@ jobs:
|
||||
make -f Makefile.lin32
|
||||
chmod +x c--
|
||||
mv c-- /home/autobuild/tools/win32/bin/c--
|
||||
cp ${{ gitea.workspace }}/programs/cmm/c--/c--.ini /home/autobuild/tools/win32/bin/c--.ini
|
||||
cp ${{ gitea.workspace }}/programs/develop/cmm/c--.ini /home/autobuild/tools/win32/bin/c--.ini
|
||||
make -f Makefile.lin32 clean
|
||||
|
||||
- name: Install TCC
|
||||
|
||||
@@ -24,6 +24,8 @@ jobs:
|
||||
path: programs/develop/cmm
|
||||
- name: oberon07
|
||||
path: programs/develop/oberon07
|
||||
- name: cmm_apps
|
||||
path: programs/cmm
|
||||
- name: kterm
|
||||
path: programs/other/kterm
|
||||
|
||||
@@ -68,7 +70,7 @@ jobs:
|
||||
git config user.name "kolibri-bot"
|
||||
git config user.email "bot@kolibrios.org"
|
||||
git checkout -B "$BRANCH"
|
||||
git commit -m "$NAME: bump submodule to $WANT" -- "$PATH_"
|
||||
git commit -m "chore/submodules: bump $NAME to $WANT" -- "$PATH_"
|
||||
git push -f origin "$BRANCH"
|
||||
|
||||
# Open a PR via the Gitea API.
|
||||
@@ -77,7 +79,7 @@ jobs:
|
||||
http=$(curl -sS -o /tmp/pr.json -w '%{http_code}' -X POST \
|
||||
-H "Authorization: token ${TOKEN}" \
|
||||
-H "Content-Type: application/json" \
|
||||
-d "{\"head\":\"${BRANCH}\",\"base\":\"main\",\"title\":\"${NAME}: bump submodule to upstream\"}" \
|
||||
-d "{\"head\":\"${BRANCH}\",\"base\":\"main\",\"title\":\"chore/submodules: bump ${NAME} to upstream\"}" \
|
||||
"${API}/repos/${REPO}/pulls")
|
||||
echo "PR API HTTP status: $http"
|
||||
cat /tmp/pr.json; echo
|
||||
|
||||
@@ -6,6 +6,10 @@
|
||||
path = programs/develop/oberon07
|
||||
url = https://github.com/AntKrotov/oberon-07-compiler.git
|
||||
branch = master
|
||||
[submodule "programs/cmm"]
|
||||
path = programs/cmm
|
||||
url = https://git.kolibrios.org/KolibriOS/cmm_apps.git
|
||||
branch = main
|
||||
[submodule "programs/other/kterm"]
|
||||
path = programs/other/kterm
|
||||
url = https://git.kolibrios.org/b00bl1k/kterm.git
|
||||
|
||||
@@ -59,6 +59,12 @@ Co-authored-by: ANOTHER-NAME <ANOTHER-NAME@EXAMPLE.COM>
|
||||
|
||||
to the end commit message body on a new line.
|
||||
|
||||
If you used AI tools while preparing the commit, you are encouraged to include an Assisted-by tag:
|
||||
|
||||
```
|
||||
Assisted-by: AGENT_NAME:MODEL_VERSION
|
||||
```
|
||||
|
||||
### Merge commits
|
||||
|
||||
> [!WARNING]
|
||||
|
||||
+19
-10
@@ -74,7 +74,6 @@ if build_type == "ru_RU" then tup.append_table(img_files, {
|
||||
{"WELCOME.HTM", VAR_DATA .. "/" .. build_type .. "/welcome.htm.kpack"},
|
||||
{"EXAMPLE.ASM", SRC_PROGS .. "/develop/examples/example/rus/example.asm"},
|
||||
{"DEVELOP/BACKY", SRC_PROGS .. "/develop/backy/Backy_ru"},
|
||||
{"GAMES/BASEKURS.KLA", build_type .. "/games/basekurs.kla"},
|
||||
{"File Managers/KFAR.INI", build_type .. "/File Managers/kfar.ini"},
|
||||
{"GAMES/DESCENT", build_type .. "/games/descent"},
|
||||
{"SETTINGS/.shell", SRC_PROGS .. "/system/shell/bin/rus/.shell"},
|
||||
@@ -170,8 +169,6 @@ extra_files = {
|
||||
{"kolibrios/demos/life2", "common/demos/life2"},
|
||||
{"kolibrios/demos/relay.lif", "common/demos/relay.lif"},
|
||||
{"kolibrios/demos/rpento.lif", "common/demos/rpento.lif"},
|
||||
{"kolibrios/develop/c--/c--.ini", SRC_PROGS .. "/cmm/c--/c--.ini"},
|
||||
{"kolibrios/develop/c--/manual_c--.htm", SRC_PROGS .. "/cmm/c--/manual_c--.htm"},
|
||||
{"kolibrios/develop/fpc/", "common/develop/fpc/*"},
|
||||
{"kolibrios/develop/fpc/examples/", "../programs/develop/fp/examples/src/*"},
|
||||
{"kolibrios/develop/oberon07/compiler.kex", SRC_PROGS .. "/develop/oberon07/Compiler.kex"},
|
||||
@@ -194,6 +191,12 @@ extra_files = {
|
||||
{"kolibrios/develop/tcc/samples/", SRC_PROGS .. "/develop/ktcc/libc.obj/samples/*.sh"},
|
||||
{"kolibrios/develop/tcc/samples/clayer/", SRC_PROGS .. "/develop/ktcc/libc.obj/samples/clayer/*"},
|
||||
{"kolibrios/develop/utils/SPEDump", SRC_PROGS .. "/develop/SPEDump/SPEDump.kex"},
|
||||
{"kolibrios/develop/XDPascal/", SRC_PROGS .. "/develop/XDPascal/xdpk/*"},
|
||||
{"kolibrios/develop/XDPascal/projects2025/", SRC_PROGS .. "/develop/XDPascal/xdpk/projects2025/*"},
|
||||
{"kolibrios/develop/XDPascal/projects2025/Compiler/", SRC_PROGS .. "/develop/XDPascal/xdpk/projects2025/Compiler/*"},
|
||||
{"kolibrios/develop/XDPascal/projects2026/", SRC_PROGS .. "/develop/XDPascal/xdpk/projects2026/*"},
|
||||
{"kolibrios/develop/XDPascal/source/", SRC_PROGS .. "/develop/XDPascal/xdpk/source/*"},
|
||||
{"kolibrios/develop/XDPascal/units/", SRC_PROGS .. "/develop/XDPascal/xdpk/units/*"},
|
||||
{"kolibrios/emul/", "common/emul/*"},
|
||||
{"kolibrios/emul/dosbox/", "common/emul/DosBox/*"},
|
||||
{"kolibrios/emul/e80/readme.txt", SRC_PROGS .. "/emulator/e80/readme.txt"},
|
||||
@@ -293,8 +296,6 @@ extra_files = {
|
||||
{"kolibrios/utils/vmode", "common/vmode"},
|
||||
{"kolibrios/utils/texture", "common/utils/texture"},
|
||||
{"kolibrios/utils/kterm/kterm", VAR_PROGS .. "/other/kterm/kterm"},
|
||||
{"kolibrios/utils/kterm/serial.sys", VAR_DRVS .. "/serial/serial.sys"},
|
||||
{"kolibrios/utils/kterm/install.sh", SRC .. "/drivers/serial/install.sh"},
|
||||
{"kolibrios/utils/cnc_editor/cnc_editor", VAR_PROGS .. "/other/cnc_editor/cnc_editor"},
|
||||
{"kolibrios/utils/cnc_editor/kolibri.NC", SRC_PROGS .. "/other/cnc_editor/kolibri.NC"},
|
||||
{"kolibrios/utils/kfm/kfm.ini", "common/File Managers/kfm.ini"},
|
||||
@@ -426,9 +427,8 @@ tup.append_table(img_files, {
|
||||
{"DOCPACK", VAR_PROGS .. "/system/docpack/docpack"},
|
||||
{"DEFAULT.SKN", VAR_SKINS .. "/../skins/Leency/Shkvorka/Shkvorka.skn"},
|
||||
{"DISPTEST", VAR_PROGS .. "/testing/disptest/disptest"},
|
||||
{"END", VAR_PROGS .. "/system/end/light/end"},
|
||||
{"END", VAR_PROGS .. "/system/end/end"},
|
||||
{"ESKIN", VAR_PROGS .. "/system/eskin/eskin"},
|
||||
{"FSPEED", VAR_PROGS .. "/testing/fspeed/fspeed"},
|
||||
{"GMON", VAR_PROGS .. "/system/gmon/gmon"},
|
||||
{"HDD_INFO", VAR_PROGS .. "/system/hdd_info/hdd_info"},
|
||||
{"KBD", VAR_PROGS .. "/testing/kbd/kbd"},
|
||||
@@ -437,7 +437,6 @@ tup.append_table(img_files, {
|
||||
{"LOADDRV", VAR_PROGS .. "/system/loaddrv/loaddrv"},
|
||||
{"MAGNIFY", VAR_PROGS .. "/system/magnify/magnify"},
|
||||
{"MADMOUSE", VAR_PROGS .. "/other/madmouse/madmouse"},
|
||||
{"MGB", VAR_PROGS .. "/testing/mgb/mgb"},
|
||||
{"MOUSEMUL", VAR_PROGS .. "/system/mousemul/mousemul"},
|
||||
{"MOUSEPOS", VAR_PROGS .. "/other/mousepos/mousepos"},
|
||||
{"MYKEY", VAR_PROGS .. "/system/MyKey/MyKey"},
|
||||
@@ -543,7 +542,7 @@ tup.append_table(img_files, {
|
||||
{"NETWORK/PING", VAR_PROGS .. "/network/ping/ping"},
|
||||
{"NETWORK/NETCFG", VAR_PROGS .. "/network/netcfg/netcfg"},
|
||||
{"NETWORK/NETSTAT", VAR_PROGS .. "/network/netstat/netstat"},
|
||||
{"NETWORK/NSINST", VAR_PROGS .. "/network/netsurf/nsinstall"},
|
||||
{"NETWORK/NETSURF", VAR_PROGS .. "/network/netsurf/netsurf"},
|
||||
{"NETWORK/NSLOOKUP", VAR_PROGS .. "/network/nslookup/nslookup"},
|
||||
{"NETWORK/PASTA", VAR_PROGS .. "/network/pasta/pasta"},
|
||||
{"NETWORK/SYNERGYC", VAR_PROGS .. "/network/synergyc/synergyc"},
|
||||
@@ -575,9 +574,13 @@ tup.append_table(img_files, {
|
||||
{"DRIVERS/OHCI.SYS", VAR_DRVS .. "/usb/ohci.sys"},
|
||||
{"DRIVERS/EHCI.SYS", VAR_DRVS .. "/usb/ehci.sys"},
|
||||
{"DRIVERS/USBHID.SYS", VAR_DRVS .. "/usb/usbhid/usbhid.sys"},
|
||||
{"DRIVERS/USBFTDI.SYS", VAR_DRVS .. "/usb/usbftdi/usbftdi.sys"},
|
||||
{"DRIVERS/USBOTHER.SYS",VAR_DRVS .. "/usb/usbother/usbother.sys"},
|
||||
{"DRIVERS/USBCDC.SYS", VAR_DRVS .. "/usb/usbnet/usbcdc.sys"},
|
||||
{"DRIVERS/USBRNDIS.SYS", VAR_DRVS .. "/usb/usbnet/usbrndis.sys"},
|
||||
{"DRIVERS/USBSTOR.SYS", VAR_DRVS .. "/usb/usbstor.sys"},
|
||||
{"DRIVERS/RDC.SYS", VAR_DRVS .. "/video/rdc.sys"},
|
||||
{"DRIVERS/SERIAL.SYS", VAR_DRVS .. "/serial/serial.sys"},
|
||||
{"DRIVERS/COMMOUSE.SYS", VAR_DRVS .. "/mouse/commouse.sys"},
|
||||
{"DRIVERS/PS2MOUSE.SYS", VAR_DRVS .. "/mouse/ps2mouse4d/ps2mouse.sys"},
|
||||
{"DRIVERS/TMPDISK.SYS", VAR_DRVS .. "/disk/tmpdisk.sys"},
|
||||
@@ -640,6 +643,8 @@ tup.append_table(extra_files, {
|
||||
{"kolibrios/media/zsea/plugins/rotate.obj", VAR_PROGS .. "/media/zsea/plugins/rotate/rotate.obj"},
|
||||
{"kolibrios/media/zsea/plugins/scaling.obj", VAR_PROGS .. "/media/zsea/plugins/scaling/scaling.obj"},
|
||||
{"kolibrios/utils/AMDtemp", VAR_PROGS .. "/system/amd_temp_view/AMDtemp"},
|
||||
{"kolibrios/utils/fspeed", VAR_PROGS .. "/testing/fspeed/fspeed"},
|
||||
{"kolibrios/utils/mgb", VAR_PROGS .. "/testing/mgb/mgb"},
|
||||
{"kolibrios/utils/kfm/kfm", VAR_PROGS .. "/fs/kfm/kfm"},
|
||||
{"kolibrios/utils/tedit/t_edit", VAR_PROGS .. "/other/t_edit/t_edit"},
|
||||
{"kolibrios/3D/blocks/block.bin", VAR_PROGS .. "/bcc32/games/blocks/block.bin"},
|
||||
@@ -649,7 +654,6 @@ tup.append_table(extra_files, {
|
||||
})
|
||||
-- For russian build, add russian-only programs.
|
||||
if build_type == "ru_RU" then tup.append_table(img_files, {
|
||||
{"GAMES/KLAVISHA", VAR_PROGS .. "/games/klavisha/klavisha"},
|
||||
{"DEVELOP/EXAMPLES/TESTCON2", VAR_PROGS .. "/develop/libraries/console_coff/examples/testcon2_rus"},
|
||||
}) else tup.append_table(img_files, {
|
||||
{"DEVELOP/EXAMPLES/TESTCON2", VAR_PROGS .. "/develop/libraries/console_coff/examples/testcon2_eng"},
|
||||
@@ -658,6 +662,8 @@ if build_type == "ru_RU" then tup.append_table(img_files, {
|
||||
if build_type == "ru_RU" then tup.append_table(extra_files, {
|
||||
{"kolibrios/utils/period", VAR_PROGS .. "/other/period/period"},
|
||||
{"kolibrios/games/Dungeons/Dungeons", VAR_PROGS .. "/games/Dungeons/Dungeons"},
|
||||
{"kolibrios/games/klavisha/klavisha", VAR_PROGS .. "/games/klavisha/klavisha"},
|
||||
{"kolibrios/games/klavisha/basekurs.kla", "ru_RU/games/basekurs.kla"},
|
||||
}) end
|
||||
|
||||
end -- tup.getconfig('NO_FASM') ~= 'full'
|
||||
@@ -681,6 +687,7 @@ tup.append_table(img_files, {
|
||||
{"EASYSHOT", VAR_PROGS .. "/cmm/misc/easyshot.com"},
|
||||
{"MOUSECFG", VAR_PROGS .. "/cmm/mousecfg/mousecfg.com"},
|
||||
{"BARSCFG", VAR_PROGS .. "/cmm/barscfg/barscfg.com"},
|
||||
{"BBENCH", VAR_PROGS .. "/cmm/bbench/bbench.com"},
|
||||
{"SEARCH", VAR_PROGS .. "/cmm/misc/search.com"},
|
||||
{"SYSPANEL", VAR_PROGS .. "/cmm/misc/software_widget.com"},
|
||||
{"SYSMON", VAR_PROGS .. "/cmm/sysmon/sysmon.com"},
|
||||
@@ -809,6 +816,8 @@ tup.append_table(extra_files, {
|
||||
{"kolibrios/utils/minizip/minizip", VAR_PROGS .. "/fs/minizip/minizip"},
|
||||
{"kolibrios/utils/minizip/miniunz", VAR_PROGS .. "/fs/minizip/miniunz"},
|
||||
{"kolibrios/develop/c--/c--", VAR_PROGS .. "/develop/cmm/cmm"},
|
||||
{"kolibrios/develop/c--/c--.ini", SRC_PROGS .. "/develop/cmm/c--.ini"},
|
||||
{"kolibrios/develop/c--/manual_c--.htm", SRC_PROGS .. "/develop/cmm/manual_c--.htm"},
|
||||
{"kolibrios/develop/tcc/tcc", VAR_PROGS .. "/develop/ktcc/source/tcc"},
|
||||
{"kolibrios/develop/sqlite3/sqlite3", VAR_CONTRIB .. "/sdk/sources/sqlite3/shell/sqlite3"},
|
||||
{"kolibrios/develop/utils/objconv", VAR_PROGS .. "/develop/objconv/objconv"},
|
||||
|
||||
@@ -29,6 +29,7 @@ xcf=/sys/media/kiv
|
||||
rtf=/sys/RtfRead
|
||||
3ds=/sys/3d/view3ds
|
||||
asc=/sys/3d/view3ds
|
||||
stl=/sys/3d/view3ds
|
||||
lif=/kolibrios/demos/life2
|
||||
skn=/sys/skincfg
|
||||
dtp=/sys/skincfg
|
||||
@@ -47,7 +48,7 @@ mht=/sys/network/WebView
|
||||
docx=/sys/network/WebView
|
||||
url=/sys/network/WebView
|
||||
fb2=/sys/fb2read
|
||||
kla=/sys/games/klavisha
|
||||
kla=/kolibrios/games/klavisha/klavisha
|
||||
pdf=/kolibrios/media/updf
|
||||
avi=/kolibrios/media/fplay_run
|
||||
mpg=/kolibrios/media/fplay_run
|
||||
|
||||
@@ -174,11 +174,12 @@ sh=/sys/shell
|
||||
|
||||
3ds=/sys/3d/view3ds
|
||||
asc=/sys/3d/view3ds
|
||||
stl=/sys/3d/view3ds
|
||||
|
||||
skn=/sys/skincfg
|
||||
dtp=/sys/skincfg
|
||||
lif=/kolibrios/demos/life2
|
||||
kla=/sys/games/klavisha
|
||||
kla=/kolibrios/games/klavisha/klavisha
|
||||
pdf=/kolibrios/media/updf
|
||||
|
||||
smc=/kolibrios/emul/zsnes/zsnes
|
||||
|
||||
@@ -39,7 +39,7 @@ Donkey=/kg/donkey
|
||||
Loderunner=/kg/LRL/LRL,41
|
||||
; 21days=/kg/21days,104 ;rus only
|
||||
BabyPainter=/kg/BabyPainter,87
|
||||
Klavisha=games/klavisha,69
|
||||
Klavisha=/kg/klavisha/klavisha,69
|
||||
Millioneer=/kg/WHOWTBAM/whowtbam,114
|
||||
StarTrek71=/kg/sstartrek/SStarTrek
|
||||
Descent=games/descent
|
||||
|
||||
@@ -35,7 +35,6 @@ Console Board=develop/dbgboard,19
|
||||
PCI Devices=pcidev,38
|
||||
CPU Info=cpuid,37
|
||||
Display Test=disptest,113
|
||||
Graphic Bench=mgb,121
|
||||
Benchmark=bbench,121
|
||||
HDD Info=hdd_info,50
|
||||
File Speed=fspeed,45
|
||||
Network Speed=network/dl|-test,51
|
||||
@@ -243,7 +243,7 @@ x=204
|
||||
y=0
|
||||
[22]
|
||||
name=NETSURF
|
||||
path=/sys/NETWORK/NSINST
|
||||
path=/sys/NETWORK/NETSURF
|
||||
param=
|
||||
ico=125
|
||||
x=204
|
||||
|
||||
@@ -116,6 +116,7 @@
|
||||
33 HTTPGet |network/httpget
|
||||
33 Downloader |network/dl
|
||||
12 WebView Browser |network/webview
|
||||
12 NetSurf |network/netsurf
|
||||
#13 **** SERVERS
|
||||
24 FTP |network/ftpd
|
||||
#14 **** OTHER
|
||||
|
||||
@@ -243,7 +243,7 @@ x=204
|
||||
y=0
|
||||
[22]
|
||||
name=NETSURF
|
||||
path=/sys/NETWORK/NSINST
|
||||
path=/sys/NETWORK/NETSURF
|
||||
param=
|
||||
ico=125
|
||||
x=204
|
||||
|
||||
@@ -121,6 +121,7 @@
|
||||
16 HTTPGet |network/httpget
|
||||
16 Descargas |network/dl
|
||||
16 Navegador WebView |network/webview
|
||||
12 NetSurf |network/netsurf
|
||||
#15 **** OTROS
|
||||
16 Reloj analвgico |demos/aclock
|
||||
16 Reloj binario |demos/bcdclk
|
||||
|
||||
@@ -35,7 +35,6 @@ Consola de depuracion=develop/dbgboard,19
|
||||
Dispositivos PCI=pcidev,38
|
||||
CPU Info=cpuid,37
|
||||
Prueba de pantalla=disptest,113
|
||||
Rendimiento grafico=mgb,121
|
||||
Benchmark=bbench,121
|
||||
Info de disco=hdd_info,50
|
||||
Velocidad FS=fspeed,45
|
||||
Velocidad de red=network/dl|-test,51
|
||||
@@ -39,7 +39,7 @@ docx=/sys/network/WebView
|
||||
url=/sys/network/WebView
|
||||
fb2=/sys/fb2read
|
||||
mht=/sys/network/WebView
|
||||
kla=/sys/games/klavisha
|
||||
kla=/kolibrios/games/klavisha/klavisha
|
||||
pdf=/kolibrios/media/updf
|
||||
avi=/kolibrios/media/fplay_run
|
||||
mpg=/kolibrios/media/fplay_run
|
||||
|
||||
@@ -39,7 +39,7 @@ Donkey=/kg/donkey
|
||||
Loderunner=/kg/LRL/LRL,41
|
||||
21days=/kg/21days,104 ;rus only
|
||||
BabyPainter=/kg/BabyPainter,87
|
||||
Klavisha=games/klavisha,69
|
||||
Klavisha=/kg/klavisha/klavisha,69
|
||||
Millioneer=/kg/WHOWTBAM/whowtbam,114
|
||||
StarTrek71=/kg/sstartrek/SStarTrek
|
||||
Descent=games/descent
|
||||
|
||||
@@ -243,7 +243,7 @@ x=204
|
||||
y=0
|
||||
[22]
|
||||
name=NETSURF
|
||||
path=/sys/NETWORK/NSINST
|
||||
path=/sys/NETWORK/NETSURF
|
||||
param=
|
||||
ico=125
|
||||
x=204
|
||||
|
||||
@@ -115,6 +115,7 @@
|
||||
33 HTTPGet |network/httpget
|
||||
33 Загрузчик |network/dl
|
||||
12 Браузер WebView |network/webview
|
||||
12 Браузер NetSurf |network/netsurf
|
||||
#14 **** Разное
|
||||
00 Эмуляторы* > |@6
|
||||
45 Создание скриншотов |scrshoot
|
||||
@@ -122,7 +123,7 @@
|
||||
18 FB2 Читалка |fb2read
|
||||
16 Аналоговые часы |aclock
|
||||
21 Таблица Менделеева |/kolibrios/utils/period
|
||||
59 Тренажёр KJ|ABuIIIA |games/klavisha
|
||||
59 Тренажёр KJIABuIIIA |/kolibrios/games/klavisha/klavisha
|
||||
16 Бинарные часы |demos/bcdclk
|
||||
53 Таймер |timer
|
||||
09 Разархиватор Unz |unz
|
||||
|
||||
@@ -35,7 +35,6 @@ AMDtemp=/k/utils/AMDtemp,128
|
||||
Устройства PCI=pcidev,38
|
||||
CPU Info=cpuid,37
|
||||
Тест экрана=disptest,113
|
||||
Скорость графики=mgb,121
|
||||
Benchmark=bbench,121
|
||||
Информация о дисках=hdd_info,50
|
||||
Скорость ФС=fspeed,45
|
||||
Скорость сети=network/dl|-test,51
|
||||
@@ -515,20 +515,18 @@ HDA_AMP_VOLMASK equ 0x7F
|
||||
|
||||
|
||||
; unsolicited event handler
|
||||
HDA_UNSOL_QUEUE_SIZE equ 64
|
||||
HDA_UNSOL_QUEUE_SIZE equ 64 ; must stay a power of 2 (used as a bitmask for wrap)
|
||||
|
||||
;struc HDA_BUS_UNSOLICITED
|
||||
;{
|
||||
; ; ring buffer
|
||||
; .queue:
|
||||
; times HDA_UNSOL_QUEUE_SIZE*2 dd ?
|
||||
; .rp dd ?
|
||||
; .wp dd ?
|
||||
;
|
||||
; ; workqueue
|
||||
; .work dd ?;struct work_struct work;
|
||||
; .bus dd ? ;struct hda_bus ;bus
|
||||
;};
|
||||
struc HDA_BUS_UNSOLICITED
|
||||
{
|
||||
; ring buffer
|
||||
.queue rd HDA_UNSOL_QUEUE_SIZE * 2 ; 2 dword for each event (res and res_ex)
|
||||
.rp dd ? ; Read pointer
|
||||
.wp dd ? ; Write pointer
|
||||
; ; workqueue
|
||||
; .work dd ? ;struct work_struct work;
|
||||
; .bus dd ? ;struct hda_bus ;bus
|
||||
}
|
||||
|
||||
; Helper for automatic ping configuration
|
||||
AUTO_PIN_MIC equ 0
|
||||
|
||||
@@ -654,7 +654,15 @@ end if
|
||||
stdcall hda_codec_setup_stream, eax, SDO_TAG, 0, 0x11 ; Left & Right channels (Back panel)
|
||||
;Asper+ ]
|
||||
|
||||
invoke TimerHS, 1, 0, snd_hda_automute, 0
|
||||
if USE_UNSOL_EV = 0
|
||||
invoke TimerHS, 1, 0, snd_hda_automute, 1
|
||||
else
|
||||
; Keep the unsolicited-event mode on the event-driven path. Running
|
||||
; snd_hda_automute at startup can issue codec commands before the new
|
||||
; unsolicited-response flow is ready, which hangs some systems.
|
||||
invoke TimerHS, 1, 0, process_unsol_events, 0
|
||||
end if
|
||||
|
||||
if USE_SINGLE_MODE
|
||||
mov esi, msgSingleMode
|
||||
invoke SysMsgBoardStr
|
||||
@@ -2635,7 +2643,7 @@ proc snd_hda_automute stdcall, data:dword
|
||||
test eax, eax
|
||||
jz .out
|
||||
|
||||
stdcall snd_hda_read_pin_sense, edx, 1
|
||||
stdcall snd_hda_read_pin_sense, edx, [data]
|
||||
test eax, AC_PINSENSE_PRESENCE
|
||||
jnz @f
|
||||
xchg ecx, esi
|
||||
@@ -2664,24 +2672,64 @@ proc snd_hda_automute stdcall, data:dword
|
||||
endp
|
||||
|
||||
|
||||
;Asper remember to add this functions:
|
||||
proc snd_hda_queue_unsol_event stdcall, par1:dword, par2:dword
|
||||
;if DEBUG
|
||||
; push esi
|
||||
; mov esi, msgUnsolEvent
|
||||
; invoke SysMsgBoardStr
|
||||
; pop esi
|
||||
;end if
|
||||
if USE_UNSOL_EV = 1
|
||||
;Test. Do not make queue, process immediately!
|
||||
;stdcall here snd_hda_read_pin_sense stdcall, nid:dword, trigger_sense:dword
|
||||
;and then mute/unmute pin based on the results
|
||||
invoke TimerHS, 1, 0, snd_hda_automute, 0
|
||||
end if
|
||||
ret
|
||||
endp
|
||||
;...
|
||||
; ;Asper remember to add this functions:
|
||||
; proc snd_hda_queue_unsol_event stdcall, par1:dword, par2:dword
|
||||
; ;if DEBUG
|
||||
; ; push esi
|
||||
; ; mov esi, msgUnsolEvent
|
||||
; ; invoke SysMsgBoardStr
|
||||
; ; pop esi
|
||||
; ;end if
|
||||
; if USE_UNSOL_EV = 1
|
||||
; ;Test. Do not make queue, process immediately!
|
||||
; ;stdcall here snd_hda_read_pin_sense stdcall, nid:dword, trigger_sense:dword
|
||||
; ;and then mute/unmute pin based on the results
|
||||
; invoke TimerHS, 1, 0, snd_hda_automute, 0
|
||||
; end if
|
||||
; ret
|
||||
; endp
|
||||
; ;...
|
||||
|
||||
align 4
|
||||
proc snd_hda_queue_unsol_event stdcall, res:dword, res_ex:dword
|
||||
; Single-producer (HDA IRQ) lock-free enqueue. The caller azx_update_rirb
|
||||
; only carries EBX across iterations and reloads the rest, and TimerHS
|
||||
; preserves EBX too - so by using scratch regs only we need no saves.
|
||||
mov eax, [unsol_events.wp]
|
||||
lea edx, [eax+1]
|
||||
and edx, HDA_UNSOL_QUEUE_SIZE - 1 ; next write pos (size must be 2^n)
|
||||
cmp edx, [unsol_events.rp]
|
||||
je .full ; ring full -> drop, keep 1 slot free
|
||||
|
||||
mov ecx, [res]
|
||||
mov [unsol_events.queue + eax*8], ecx
|
||||
mov ecx, [res_ex]
|
||||
mov [unsol_events.queue + eax*8 + 4], ecx
|
||||
mov [unsol_events.wp], edx ; publish only after data is stored
|
||||
|
||||
invoke TimerHS, 1, 0, process_unsol_events, 0
|
||||
.full:
|
||||
ret
|
||||
endp
|
||||
|
||||
align 4
|
||||
proc process_unsol_events stdcall, data:dword
|
||||
; Runs from TimerHS (single consumer). Uses only EAX (scratch) and calls
|
||||
; snd_hda_automute, which preserves every register, so nothing is saved.
|
||||
.loop:
|
||||
mov eax, [unsol_events.rp]
|
||||
cmp eax, [unsol_events.wp]
|
||||
je .done
|
||||
; The event payload is at [unsol_events.queue + eax*8] (res) and +4 (res_ex).
|
||||
; Per-pin tag parsing is not implemented yet, so just re-evaluate jack state.
|
||||
inc eax
|
||||
and eax, HDA_UNSOL_QUEUE_SIZE - 1
|
||||
mov [unsol_events.rp], eax
|
||||
stdcall snd_hda_automute, 0
|
||||
jmp .loop
|
||||
.done:
|
||||
ret
|
||||
endp
|
||||
|
||||
align 4
|
||||
proc fdword2str stdcall, flags:dword ; bit 0 - skipLeadZeroes; bit 1 - newLine; other bits undefined
|
||||
@@ -3057,6 +3105,7 @@ aspinlock dd SPINLOCK_FREE
|
||||
|
||||
codec CODEC
|
||||
ctrl AC_CNTRL
|
||||
unsol_events HDA_BUS_UNSOLICITED
|
||||
|
||||
;Asper: BDL must be aligned to 128 according to HDA specification.
|
||||
pcmout_bdl rd 1
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
SERIAL_COMPATIBLE_API_VER = 0 ; increments in case of breaking changes
|
||||
SERIAL_COMPATIBLE_API_VER = 1 ; increments in case of breaking changes
|
||||
|
||||
SERIAL_API_GET_VERSION = 0
|
||||
SERIAL_API_SRV_ADD_PORT = 1
|
||||
@@ -9,6 +9,7 @@ SERIAL_API_CLOSE_PORT = 5
|
||||
SERIAL_API_SETUP_PORT = 6
|
||||
SERIAL_API_READ = 7
|
||||
SERIAL_API_WRITE = 8
|
||||
SERIAL_API_ENUM_PORTS = 9
|
||||
|
||||
SERIAL_API_ERR_PORT_INVALID = 1
|
||||
SERIAL_API_ERR_PORT_BUSY = 2
|
||||
@@ -29,6 +30,9 @@ SERIAL_CONF_STOP_BITS_2 = 2
|
||||
|
||||
SERIAL_CONF_FLOW_CTRL_NONE = 0
|
||||
|
||||
SERIAL_INFO_DRIVER_LEN = 16
|
||||
SERIAL_INFO_DESCR_LEN = 64
|
||||
|
||||
struct SP_DRIVER
|
||||
size dd ? ; size of this struct
|
||||
startup dd ? ; int __stdcall (*startup)(void *drv_data, const struct serial_conf *conf);
|
||||
@@ -46,7 +50,20 @@ struct SP_CONF
|
||||
flow_ctrl db ?
|
||||
ends
|
||||
|
||||
proc serial_add_port stdcall, drv:dword, drv_data:dword
|
||||
struct SP_PORT_INFO
|
||||
size dd ? ; size of this struct
|
||||
driver dd ? ; ASCIIZ driver name, e.g. "uart16550", "usb-cdc"
|
||||
descr dd ? ; ASCIIZ description, may be NULL
|
||||
ends
|
||||
|
||||
struct SP_PORT_ENUM_ENTRY
|
||||
id dd ? ; unique port number (SERIAL_PORT.id)
|
||||
busy dd ? ; 0 = free, non-zero = port is opened
|
||||
driver rb SERIAL_INFO_DRIVER_LEN
|
||||
descr rb SERIAL_INFO_DESCR_LEN
|
||||
ends
|
||||
|
||||
proc serial_add_port stdcall, drv:dword, drv_data:dword, info:dword
|
||||
locals
|
||||
handler dd ?
|
||||
io_code dd ?
|
||||
@@ -60,7 +77,7 @@ endl
|
||||
mov [io_code], SERIAL_API_SRV_ADD_PORT
|
||||
lea eax, [drv]
|
||||
mov [input], eax
|
||||
mov [inp_size], 8
|
||||
mov [inp_size], 12
|
||||
xor eax, eax
|
||||
mov [output], eax
|
||||
mov [out_size], eax
|
||||
@@ -129,7 +146,7 @@ proc serial_port_init
|
||||
ret
|
||||
endp
|
||||
|
||||
proc serial_port_get_version stdcall, version:dword
|
||||
proc serial_port_get_version stdcall uses ebx, version:dword
|
||||
locals
|
||||
.handler dd ?
|
||||
.io_code dd ?
|
||||
@@ -149,7 +166,7 @@ endl
|
||||
|
||||
lea ecx, [.handler]
|
||||
mcall SF_SYS_MISC, SSF_CONTROL_DRIVER
|
||||
|
||||
|
||||
ret
|
||||
endp
|
||||
|
||||
@@ -297,6 +314,43 @@ endl
|
||||
ret
|
||||
endp
|
||||
|
||||
proc serial_port_enum stdcall uses ebx, buf:dword, buf_size:dword, \
|
||||
total:dword, filled:dword
|
||||
locals
|
||||
.handler dd ?
|
||||
.io_code dd ?
|
||||
.input dd ?
|
||||
.inp_size dd ?
|
||||
.output dd ?
|
||||
.out_size dd ?
|
||||
endl
|
||||
push [buf_size]
|
||||
push [buf]
|
||||
mov eax, [serial_drv_handle]
|
||||
mov [.handler], eax
|
||||
mov dword [.io_code], SERIAL_API_ENUM_PORTS
|
||||
mov [.input], esp
|
||||
mov dword [.inp_size], 8
|
||||
sub esp, 8
|
||||
mov [.output], esp
|
||||
mov dword [.out_size], 8
|
||||
|
||||
lea ecx, [.handler]
|
||||
mcall SF_SYS_MISC, SSF_CONTROL_DRIVER
|
||||
|
||||
pop ebx edx
|
||||
cmp eax, -1
|
||||
je .err
|
||||
mov ecx, [total]
|
||||
mov [ecx], ebx
|
||||
mov ecx, [filled]
|
||||
mov [ecx], edx
|
||||
.err:
|
||||
|
||||
add esp, 8
|
||||
ret
|
||||
endp
|
||||
|
||||
align 4
|
||||
serial_drv_name db "SERIAL", 0
|
||||
serial_drv_handle dd ?
|
||||
@@ -1,5 +0,0 @@
|
||||
#SHS
|
||||
echo Installing serial driver for kterm...
|
||||
cp /kolibrios/utils/kterm/serial.sys /sys/drivers/
|
||||
/sys/loaddrv serial
|
||||
echo Serial driver successfully installed!
|
||||
+148
-7
@@ -44,6 +44,8 @@ struct SERIAL_PORT
|
||||
rx_buf RING_BUF
|
||||
tx_buf RING_BUF
|
||||
conf SP_CONF
|
||||
driver rb SERIAL_INFO_DRIVER_LEN ; ASCIIZ, copied from SP_PORT_INFO.driver in add_port
|
||||
descr rb SERIAL_INFO_DESCR_LEN ; ASCIIZ, copied from SP_PORT_INFO.descr in add_port (may be empty)
|
||||
ends
|
||||
|
||||
proc START c, reason:dword, cmdline:dword
|
||||
@@ -57,7 +59,7 @@ proc START c, reason:dword, cmdline:dword
|
||||
stdcall uart_probe, 0x2f8, 3
|
||||
stdcall uart_probe, 0x3e8, 4
|
||||
stdcall uart_probe, 0x2e8, 3
|
||||
invoke RegService, drv_name, service_proc
|
||||
invoke RegService, serial_drv_name, service_proc
|
||||
ret
|
||||
|
||||
.fail:
|
||||
@@ -75,7 +77,7 @@ srv_calls:
|
||||
dd service_proc.setup
|
||||
dd service_proc.read
|
||||
dd service_proc.write
|
||||
; TODO enumeration
|
||||
dd service_proc.enum_ports
|
||||
srv_calls_end:
|
||||
|
||||
proc service_proc stdcall uses ebx esi edi, ioctl:dword
|
||||
@@ -97,11 +99,13 @@ proc service_proc stdcall uses ebx esi edi, ioctl:dword
|
||||
; in:
|
||||
; +0: driver
|
||||
; +4: driver data
|
||||
cmp [edx + IOCTL.inp_size], 8
|
||||
; +8: port info (SP_PORT_INFO*)
|
||||
cmp [edx + IOCTL.inp_size], 12
|
||||
jb .err
|
||||
mov ebx, [edx + IOCTL.input]
|
||||
mov ecx, [ebx]
|
||||
mov edx, [ebx + 4]
|
||||
mov ebx, [ebx + 8]
|
||||
call add_port
|
||||
ret
|
||||
|
||||
@@ -137,6 +141,7 @@ proc service_proc stdcall uses ebx esi edi, ioctl:dword
|
||||
; +4 addr to SERIAL_CONF
|
||||
; out:
|
||||
; +0 port handle if success
|
||||
; eax = 0 if success, otherwise an error code SERIAL_API_ERR_*
|
||||
cmp [edx + IOCTL.inp_size], 8
|
||||
jb .err
|
||||
cmp [edx + IOCTL.out_size], 4
|
||||
@@ -220,25 +225,60 @@ proc service_proc stdcall uses ebx esi edi, ioctl:dword
|
||||
mov [ebx], ecx
|
||||
ret
|
||||
|
||||
.enum_ports:
|
||||
; in:
|
||||
; +0 output buffer (array of SP_PORT_ENUM_ENTRY), may be NULL
|
||||
; +4 output buffer size in bytes
|
||||
; out:
|
||||
; +0 total number of ports in the system
|
||||
; +4 number of entries actually filled into the buffer
|
||||
; eax = 0 if success, -1 otherwise
|
||||
cmp [edx + IOCTL.inp_size], 8
|
||||
jb .err
|
||||
cmp [edx + IOCTL.out_size], 8
|
||||
jb .err
|
||||
mov ebx, [edx + IOCTL.input]
|
||||
push edx
|
||||
mov eax, [ebx]
|
||||
mov edx, [ebx + 4]
|
||||
call sp_enum
|
||||
pop edx
|
||||
mov ebx, [edx + IOCTL.output]
|
||||
mov [ebx], eax
|
||||
mov [ebx + 4], ecx
|
||||
xor eax, eax
|
||||
ret
|
||||
|
||||
.err:
|
||||
or eax, -1
|
||||
ret
|
||||
endp
|
||||
|
||||
; struct SERIAL_PORT __fastcall *add_port(const struct SP_DRIVER *drv, const void *drv_data);
|
||||
align 4
|
||||
; @param ecx pointer to SP_DRIVER
|
||||
; @param edx driver-specific argument
|
||||
; @param ebx pointer to SP_PORT_INFO
|
||||
; @return SERIAL_PORT descriptor
|
||||
proc add_port uses edi
|
||||
DEBUGF L_DBG, "serial.sys: add port drv=%x drv_data=%x\n", ecx, edx
|
||||
DEBUGF L_DBG, "serial.sys: add port drv=%x drv_data=%x info=%x\n", ecx, edx, ebx
|
||||
|
||||
mov eax, [ecx + SP_DRIVER.size]
|
||||
cmp eax, sizeof.SP_DRIVER
|
||||
jne .fail
|
||||
|
||||
test ebx, ebx
|
||||
jz .fail
|
||||
mov eax, [ebx + SP_PORT_INFO.size]
|
||||
cmp eax, sizeof.SP_PORT_INFO
|
||||
jne .fail
|
||||
|
||||
; alloc memory for serial port descriptor
|
||||
push ecx
|
||||
push edx
|
||||
push ebx
|
||||
movi eax, sizeof.SERIAL_PORT
|
||||
invoke Kmalloc
|
||||
pop ebx
|
||||
pop edx
|
||||
pop ecx
|
||||
test eax, eax
|
||||
@@ -252,6 +292,17 @@ proc add_port uses edi
|
||||
invoke MutexInit
|
||||
and [edi + SERIAL_PORT.con], 0
|
||||
|
||||
; copy port info strings
|
||||
mov eax, [ebx + SP_PORT_INFO.driver]
|
||||
lea edx, [edi + SERIAL_PORT.driver]
|
||||
mov ecx, SERIAL_INFO_DRIVER_LEN
|
||||
call copy_bounded_str
|
||||
|
||||
mov eax, [ebx + SP_PORT_INFO.descr]
|
||||
lea edx, [edi + SERIAL_PORT.descr]
|
||||
mov ecx, SERIAL_INFO_DESCR_LEN
|
||||
call copy_bounded_str
|
||||
|
||||
mov ecx, port_list_mutex
|
||||
invoke MutexLock
|
||||
|
||||
@@ -282,7 +333,35 @@ proc add_port uses edi
|
||||
endp
|
||||
|
||||
align 4
|
||||
; u32 __fastcall *remove_port(struct SERIAL_PORT *port);
|
||||
; copies an ASCIIZ string into a fixed-size buffer: copies up to (size - 1)
|
||||
; bytes or until the NUL, then zero-pads the rest of the buffer
|
||||
; @param eax source ASCIIZ ptr, may be NULL
|
||||
; @param edx dest buffer ptr
|
||||
; @param ecx dest buffer size in bytes, must be >= 1
|
||||
proc copy_bounded_str uses esi edi
|
||||
mov esi, eax
|
||||
mov edi, edx
|
||||
dec ecx ; reserve the last byte for the NUL terminator
|
||||
.copy:
|
||||
test ecx, ecx
|
||||
jz .pad
|
||||
test esi, esi
|
||||
jz .pad
|
||||
lodsb
|
||||
test al, al
|
||||
jz .pad
|
||||
stosb
|
||||
dec ecx
|
||||
jmp .copy
|
||||
.pad:
|
||||
inc ecx ; account for the reserved NUL byte
|
||||
xor al, al
|
||||
rep stosb
|
||||
ret
|
||||
endp
|
||||
|
||||
align 4
|
||||
; @param ecx serial port descriptor
|
||||
proc remove_port uses esi
|
||||
mov esi, ecx
|
||||
mov ecx, port_list_mutex
|
||||
@@ -657,7 +736,69 @@ proc sp_write
|
||||
ret
|
||||
endp
|
||||
|
||||
drv_name db 'SERIAL', 0
|
||||
align 4
|
||||
; @param eax buf
|
||||
; @param edx buf_size (bytes)
|
||||
; @return eax total port count in the system
|
||||
; ecx entries filled into buf
|
||||
proc sp_enum uses ebx esi edi
|
||||
mov ecx, eax
|
||||
mov eax, edx
|
||||
xor edx, edx
|
||||
mov ebx, sizeof.SP_PORT_ENUM_ENTRY
|
||||
div ebx
|
||||
; eax max entries count
|
||||
|
||||
mov edi, ecx
|
||||
imul eax, sizeof.SP_PORT_ENUM_ENTRY
|
||||
add eax, ecx
|
||||
mov edx, eax ; end-of-buffer boundary
|
||||
|
||||
xor ebx, ebx ; total port count
|
||||
xor ecx, ecx ; filled count
|
||||
|
||||
push ecx edx
|
||||
mov ecx, port_list_mutex
|
||||
invoke MutexLock
|
||||
pop edx ecx
|
||||
|
||||
mov esi, port_list
|
||||
.next:
|
||||
mov esi, [esi + SERIAL_PORT.fd]
|
||||
cmp esi, port_list
|
||||
jz .done
|
||||
inc ebx
|
||||
cmp edi, edx
|
||||
jae .next
|
||||
|
||||
mov eax, [esi + SERIAL_PORT.id]
|
||||
mov [edi + SP_PORT_ENUM_ENTRY.id], eax
|
||||
xor eax, eax
|
||||
cmp dword [esi + SERIAL_PORT.con], 0
|
||||
setnz al
|
||||
mov [edi + SP_PORT_ENUM_ENTRY.busy], eax
|
||||
|
||||
push ecx esi edi
|
||||
lea esi, [esi + SERIAL_PORT.driver]
|
||||
lea edi, [edi + SP_PORT_ENUM_ENTRY.driver]
|
||||
mov ecx, (SERIAL_INFO_DRIVER_LEN + SERIAL_INFO_DESCR_LEN) / 4
|
||||
rep movsd
|
||||
pop edi esi ecx
|
||||
|
||||
add edi, sizeof.SP_PORT_ENUM_ENTRY
|
||||
inc ecx
|
||||
jmp .next
|
||||
|
||||
.done:
|
||||
push ecx
|
||||
mov ecx, port_list_mutex
|
||||
invoke MutexUnlock
|
||||
pop ecx
|
||||
|
||||
mov eax, ebx
|
||||
ret
|
||||
endp
|
||||
|
||||
include_debug_strings
|
||||
|
||||
align 4
|
||||
|
||||
@@ -169,6 +169,7 @@ proc uart_probe stdcall uses ebx esi edi, io_addr:dword, irqn:dword
|
||||
; register port
|
||||
lea ecx, [uart_drv]
|
||||
mov edx, edi
|
||||
lea ebx, [uart_port_info]
|
||||
call add_port
|
||||
test eax, eax
|
||||
jz .free_desc ; TODO detach_int_handler?
|
||||
@@ -406,3 +407,11 @@ uart_drv:
|
||||
dd uart_reconf
|
||||
dd uart_tx
|
||||
uart_drv_end:
|
||||
|
||||
align 4
|
||||
uart_port_info:
|
||||
dd uart_port_end - uart_port_info
|
||||
dd uart_port_name
|
||||
dd 0
|
||||
uart_port_end:
|
||||
uart_port_name db 'uart16550', 0
|
||||
+203
-310
@@ -1,6 +1,6 @@
|
||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||
;; ;;
|
||||
;; Copyright (C) KolibriOS team 2004-2015. All rights reserved. ;;
|
||||
;; Copyright (C) KolibriOS team 2004-2026. All rights reserved. ;;
|
||||
;; Distributed under terms of the GNU General Public License ;;
|
||||
;; ;;
|
||||
;; FTDI chips driver for KolibriOS ;;
|
||||
@@ -15,10 +15,11 @@
|
||||
format PE DLL native 0.05
|
||||
entry START
|
||||
|
||||
DEBUG = 1
|
||||
L_DBG = 1
|
||||
L_ERR = 2
|
||||
|
||||
__DEBUG__ = 1
|
||||
__DEBUG_LEVEL__ = 1
|
||||
__DEBUG_LEVEL__ = L_ERR
|
||||
|
||||
node equ ftdi_context
|
||||
node.next equ ftdi_context.next_context
|
||||
@@ -122,9 +123,10 @@ TYPE_232H=6
|
||||
TYPE_230X=7
|
||||
|
||||
;strings
|
||||
my_driver db 'usbother',0
|
||||
my_driver db 'usbftdi',0
|
||||
serial_driver db 'SERIAL',0
|
||||
nomemory_msg db 'K : no memory',13,10,0
|
||||
nomemory_msg db 'ftdi: no memory',13,10,0
|
||||
ftdi_port_name db 'ftdi',0
|
||||
|
||||
; Structures
|
||||
struct ftdi_context
|
||||
@@ -200,10 +202,13 @@ endp
|
||||
|
||||
|
||||
proc AddDevice stdcall uses ebx esi edi, .config_pipe:DWORD, .config_descr:DWORD, .interface:DWORD
|
||||
|
||||
locals
|
||||
.pinfo rb sizeof.SP_PORT_INFO
|
||||
endl
|
||||
|
||||
invoke USBGetParam, [.config_pipe], 0
|
||||
mov edx, eax
|
||||
DEBUGF 2,'K : Detected device vendor: 0x%x\n', [eax+usb_descr.idVendor]
|
||||
DEBUGF L_DBG, 'ftdi: Detected device vendor: 0x%x\n', [eax+usb_descr.idVendor]
|
||||
cmp word[eax+usb_descr.idVendor], 0x0403
|
||||
jnz .notftdi
|
||||
mov eax, sizeof.ftdi_context
|
||||
@@ -214,7 +219,7 @@ proc AddDevice stdcall uses ebx esi edi, .config_pipe:DWORD, .config_descr:DWORD
|
||||
invoke SysMsgBoardStr
|
||||
jmp .nothing
|
||||
@@:
|
||||
DEBUGF 2,'K : Adding struct to list 0x%x\n', eax
|
||||
DEBUGF L_DBG, 'ftdi: Adding struct to list 0x%x\n', eax
|
||||
call linkedlist_add
|
||||
|
||||
mov ebx, [.config_pipe]
|
||||
@@ -233,7 +238,7 @@ proc AddDevice stdcall uses ebx esi edi, .config_pipe:DWORD, .config_descr:DWORD
|
||||
jmp .slow
|
||||
|
||||
mov cx, [edx+usb_descr.bcdDevice]
|
||||
DEBUGF 2, 'K : Chip type 0x%x\n', ecx
|
||||
DEBUGF L_DBG, 'ftdi: Chip type 0x%x\n', ecx
|
||||
cmp cx, 0x400
|
||||
jnz @f
|
||||
mov [eax + ftdi_context.chipType], TYPE_BM
|
||||
@@ -287,8 +292,13 @@ proc AddDevice stdcall uses ebx esi edi, .config_pipe:DWORD, .config_descr:DWORD
|
||||
mov eax, [serial_drv_entry]
|
||||
test eax, eax
|
||||
jz @f
|
||||
stdcall serial_add_port, uart_drv, ebx
|
||||
DEBUGF 1, "usbftdi: add serial port with result %x\n", eax
|
||||
mov dword [.pinfo + SP_PORT_INFO.size], sizeof.SP_PORT_INFO
|
||||
mov dword [.pinfo + SP_PORT_INFO.driver], ftdi_port_name
|
||||
; TODO obtain iManufacturer, iProduct and iSerial strings
|
||||
mov dword [.pinfo + SP_PORT_INFO.descr], 0
|
||||
lea ecx, [.pinfo]
|
||||
stdcall serial_add_port, uart_drv, ebx, ecx
|
||||
DEBUGF L_DBG, 'ftdi: add serial port with result %x\n', eax
|
||||
@@:
|
||||
mov [ebx + ftdi_context.port_handle], eax
|
||||
|
||||
@@ -296,7 +306,7 @@ proc AddDevice stdcall uses ebx esi edi, .config_pipe:DWORD, .config_descr:DWORD
|
||||
ret
|
||||
|
||||
.notftdi:
|
||||
DEBUGF 1,'K : Skipping not FTDI device\n'
|
||||
DEBUGF L_DBG, 'ftdi: Skipping not FTDI device\n'
|
||||
.nothing:
|
||||
xor eax, eax
|
||||
ret
|
||||
@@ -317,7 +327,7 @@ EventData rd 3
|
||||
endl
|
||||
mov edi, [ioctl]
|
||||
mov eax, [edi+io_code]
|
||||
DEBUGF 1,'K : FTDI got the request: %d\n', eax
|
||||
DEBUGF L_DBG, 'ftdi: FTDI got the request: %d\n', eax
|
||||
test eax, eax ;0
|
||||
jz .version
|
||||
dec eax ;1
|
||||
@@ -416,7 +426,7 @@ endl
|
||||
.version:
|
||||
jmp .endswitch
|
||||
.error:
|
||||
DEBUGF 1, 'K : FTDI error occured! %d\n', eax
|
||||
DEBUGF L_ERR, 'ftdi: error occured! %d\n', eax
|
||||
;mov esi, [edi+output]
|
||||
;mov [esi], dword 'ERR0'
|
||||
;or [esi], eax
|
||||
@@ -449,7 +459,7 @@ endl
|
||||
mov word[ConfPacket+6], cx
|
||||
.own_index:
|
||||
mov ebx, [edi+4]
|
||||
DEBUGF 2,'K : ConfPacket 0x%x 0x%x\n', [ConfPacket], [ConfPacket+4]
|
||||
DEBUGF L_DBG, 'ftdi: ConfPacket 0x%x 0x%x\n', [ConfPacket], [ConfPacket+4]
|
||||
lea esi, [ConfPacket]
|
||||
lea edi, [EventData]
|
||||
invoke USBControlTransferAsync, [ebx + ftdi_context.nullP], esi, 0,\
|
||||
@@ -465,7 +475,7 @@ endl
|
||||
jmp .error
|
||||
|
||||
.ftdi_setrtshigh:
|
||||
DEBUGF 2,'K : FTDI Setting RTS pin HIGH PID: %d Dev handler 0x0x%x\n', [edi],\
|
||||
DEBUGF L_DBG, 'ftdi: Setting RTS pin HIGH PID: %d Dev handler 0x0x%x\n', [edi],\
|
||||
[edi+4]
|
||||
mov dword[ConfPacket], (FTDI_DEVICE_OUT_REQTYPE) \
|
||||
+ (SIO_SET_MODEM_CTRL_REQUEST shl 8) \
|
||||
@@ -473,7 +483,7 @@ endl
|
||||
jmp .ftdi_out_control_transfer_noinp
|
||||
|
||||
.ftdi_setrtslow:
|
||||
DEBUGF 2,'K : FTDI Setting RTS pin LOW PID: %d Dev handler 0x0x%x\n', [edi],\
|
||||
DEBUGF L_DBG, 'ftdi: Setting RTS pin LOW PID: %d Dev handler 0x0x%x\n', [edi],\
|
||||
[edi+4]
|
||||
mov dword[ConfPacket], (FTDI_DEVICE_OUT_REQTYPE) \
|
||||
+ (SIO_SET_MODEM_CTRL_REQUEST shl 8) \
|
||||
@@ -481,7 +491,7 @@ endl
|
||||
jmp .ftdi_out_control_transfer_noinp
|
||||
|
||||
.ftdi_setdtrhigh:
|
||||
DEBUGF 2,'K : FTDI Setting DTR pin HIGH PID: %d Dev handler 0x0x%x\n', [edi],\
|
||||
DEBUGF L_DBG, 'ftdi: Setting DTR pin HIGH PID: %d Dev handler 0x0x%x\n', [edi],\
|
||||
[edi+4]
|
||||
mov dword[ConfPacket], (FTDI_DEVICE_OUT_REQTYPE) \
|
||||
+ (SIO_SET_MODEM_CTRL_REQUEST shl 8) \
|
||||
@@ -489,7 +499,7 @@ endl
|
||||
jmp .ftdi_out_control_transfer_noinp
|
||||
|
||||
.ftdi_setdtrlow:
|
||||
DEBUGF 2,'K : FTDI Setting DTR pin LOW PID: %d Dev handler 0x0x%x\n', [edi],\
|
||||
DEBUGF L_DBG, 'ftdi: Setting DTR pin LOW PID: %d Dev handler 0x0x%x\n', [edi],\
|
||||
[edi+4]
|
||||
mov dword[ConfPacket], (FTDI_DEVICE_OUT_REQTYPE) \
|
||||
+ (SIO_SET_MODEM_CTRL_REQUEST shl 8) \
|
||||
@@ -497,7 +507,7 @@ endl
|
||||
jmp .ftdi_out_control_transfer_noinp
|
||||
|
||||
.ftdi_usb_reset:
|
||||
DEBUGF 2,'K : FTDI Reseting PID: %d Dev handler 0x0x%x\n', [edi],\
|
||||
DEBUGF L_DBG, 'ftdi: Reseting PID: %d Dev handler 0x0x%x\n', [edi],\
|
||||
[edi+4]
|
||||
mov dword[ConfPacket], (FTDI_DEVICE_OUT_REQTYPE) \
|
||||
+ (SIO_RESET_REQUEST shl 8) \
|
||||
@@ -505,7 +515,7 @@ endl
|
||||
jmp .ftdi_out_control_transfer_noinp
|
||||
|
||||
.ftdi_purge_rx_buf:
|
||||
DEBUGF 2, 'K : FTDI Purge TX buffer PID: %d Dev handler 0x0x%x\n', [edi],\
|
||||
DEBUGF L_DBG, 'ftdi: Purge TX buffer PID: %d Dev handler 0x0x%x\n', [edi],\
|
||||
[edi+4]
|
||||
mov dword[ConfPacket], (FTDI_DEVICE_OUT_REQTYPE) \
|
||||
+ (SIO_RESET_REQUEST shl 8) \
|
||||
@@ -513,7 +523,7 @@ endl
|
||||
jmp .ftdi_out_control_transfer_noinp
|
||||
|
||||
.ftdi_purge_tx_buf:
|
||||
DEBUGF 2, 'K : FTDI Purge RX buffer PID: %d Dev handler 0x0x%x\n', [edi],\
|
||||
DEBUGF L_DBG, 'ftdi: Purge RX buffer PID: %d Dev handler 0x0x%x\n', [edi],\
|
||||
[edi+4]
|
||||
mov dword[ConfPacket], (FTDI_DEVICE_OUT_REQTYPE) \
|
||||
+ (SIO_RESET_REQUEST shl 8) \
|
||||
@@ -521,42 +531,42 @@ endl
|
||||
jmp .ftdi_out_control_transfer_noinp
|
||||
|
||||
.ftdi_set_bitmode:
|
||||
DEBUGF 2, 'K : FTDI Set bitmode 0x%x, bitmask 0x%x %d PID: %d Dev handler 0x0x%x\n', \
|
||||
DEBUGF L_DBG, 'ftdi: Set bitmode 0x%x, bitmask 0x%x %d PID: %d Dev handler 0x0x%x\n', \
|
||||
[edi+8]:2,[edi+10]:2,[edi],[edi+4]
|
||||
mov word[ConfPacket], (FTDI_DEVICE_OUT_REQTYPE) \
|
||||
+ (SIO_SET_BITMODE_REQUEST shl 8)
|
||||
jmp .ftdi_out_control_transfer_withinp
|
||||
|
||||
.ftdi_set_line_property:
|
||||
DEBUGF 2, 'K : FTDI Set line property 0x%x PID: %d Dev handler 0x0x%x\n', \
|
||||
DEBUGF L_DBG, 'ftdi: Set line property 0x%x PID: %d Dev handler 0x0x%x\n', \
|
||||
[edi+8]:4,[edi],[edi+4]
|
||||
mov word[ConfPacket], (FTDI_DEVICE_OUT_REQTYPE) \
|
||||
+ (SIO_SET_DATA_REQUEST shl 8)
|
||||
jmp .ftdi_out_control_transfer_withinp
|
||||
|
||||
.ftdi_set_latency_timer:
|
||||
DEBUGF 2, 'K : FTDI Set latency %d PID: %d Dev handler 0x0x%x\n', \
|
||||
DEBUGF L_DBG, 'ftdi: Set latency %d PID: %d Dev handler 0x0x%x\n', \
|
||||
[edi+8],[edi],[edi+4]
|
||||
mov word[ConfPacket], (FTDI_DEVICE_OUT_REQTYPE) \
|
||||
+ (SIO_SET_LATENCY_TIMER_REQUEST shl 8)
|
||||
jmp .ftdi_out_control_transfer_withinp
|
||||
|
||||
.ftdi_set_event_char:
|
||||
DEBUGF 2, 'K : FTDI Set event char %c PID: %d Dev handler 0x0x%x\n', \
|
||||
DEBUGF L_DBG, 'ftdi: Set event char %c PID: %d Dev handler 0x0x%x\n', \
|
||||
[edi+8],[edi],[edi+4]
|
||||
mov word[ConfPacket], (FTDI_DEVICE_OUT_REQTYPE) \
|
||||
+ (SIO_SET_EVENT_CHAR_REQUEST shl 8)
|
||||
jmp .ftdi_out_control_transfer_withinp
|
||||
|
||||
.ftdi_set_error_char:
|
||||
DEBUGF 2, 'K : FTDI Set error char %c PID: %d Dev handler 0x0x%x\n', \
|
||||
DEBUGF L_DBG, 'ftdi: Set error char %c PID: %d Dev handler 0x0x%x\n', \
|
||||
[edi+8],[edi],[edi+4]
|
||||
mov word[ConfPacket], (FTDI_DEVICE_OUT_REQTYPE) \
|
||||
+ (SIO_SET_ERROR_CHAR_REQUEST shl 8)
|
||||
jmp .ftdi_out_control_transfer_withinp
|
||||
|
||||
.ftdi_setflowctrl:
|
||||
DEBUGF 2, 'K : FTDI Set flow control PID: %d Dev handler 0x0x%x\n', [edi],\
|
||||
DEBUGF L_DBG, 'ftdi: Set flow control PID: %d Dev handler 0x0x%x\n', [edi],\
|
||||
[edi+4]
|
||||
mov dword[ConfPacket], (FTDI_DEVICE_OUT_REQTYPE) \
|
||||
+ (SIO_SET_FLOW_CTRL_REQUEST shl 8) + (0 shl 16)
|
||||
@@ -569,7 +579,7 @@ endl
|
||||
jmp .own_index
|
||||
|
||||
.ftdi_read_pins:
|
||||
DEBUGF 2, 'K : FTDI Read pins PID: %d Dev handler 0x0x%x\n', [edi],\
|
||||
DEBUGF L_DBG, 'ftdi: Read pins PID: %d Dev handler 0x0x%x\n', [edi],\
|
||||
[edi+4]
|
||||
mov ebx, [edi+4]
|
||||
mov dword[ConfPacket], (FTDI_DEVICE_IN_REQTYPE) \
|
||||
@@ -598,7 +608,7 @@ endl
|
||||
jmp .error
|
||||
|
||||
.ftdi_set_wchunksize:
|
||||
DEBUGF 2, 'K : FTDI Set write chunksize %d bytes PID: %d Dev handler 0x0x%x\n', \
|
||||
DEBUGF L_DBG, 'ftdi: Set write chunksize %d bytes PID: %d Dev handler 0x0x%x\n', \
|
||||
[edi+8], [edi], [edi+4]
|
||||
mov ebx, [edi+4]
|
||||
mov ecx, [edi+8]
|
||||
@@ -608,7 +618,7 @@ endl
|
||||
jmp .endswitch
|
||||
|
||||
.ftdi_get_wchunksize:
|
||||
DEBUGF 2, 'K : FTDI Get write chunksize PID: %d Dev handler 0x0x%x\n', [edi],\
|
||||
DEBUGF L_DBG, 'ftdi: Get write chunksize PID: %d Dev handler 0x0x%x\n', [edi],\
|
||||
[edi+4]
|
||||
mov esi, [edi+output]
|
||||
mov edi, [edi+input]
|
||||
@@ -618,7 +628,7 @@ endl
|
||||
jmp .endswitch
|
||||
|
||||
.ftdi_set_rchunksize:
|
||||
DEBUGF 2, 'K : FTDI Set read chunksize %d bytes PID: %d Dev handler 0x0x%x\n', \
|
||||
DEBUGF L_DBG, 'ftdi: Set read chunksize %d bytes PID: %d Dev handler 0x0x%x\n', \
|
||||
[edi+8], [edi], [edi+4]
|
||||
mov ebx, [edi+4]
|
||||
mov ecx, [edi+8]
|
||||
@@ -628,7 +638,7 @@ endl
|
||||
jmp .endswitch
|
||||
|
||||
.ftdi_get_rchunksize:
|
||||
DEBUGF 2, 'K : FTDI Get read chunksize PID: %d Dev handler 0x0x%x\n', [edi],\
|
||||
DEBUGF L_DBG, 'ftdi: Get read chunksize PID: %d Dev handler 0x0x%x\n', [edi],\
|
||||
[edi+4]
|
||||
mov esi, [edi+output]
|
||||
mov edi, [edi+input]
|
||||
@@ -638,7 +648,7 @@ endl
|
||||
jmp .endswitch
|
||||
|
||||
.ftdi_write_data:
|
||||
DEBUGF 2, 'K : FTDI Write %d bytes PID: %d Dev handler 0x%x\n', [edi+8],\
|
||||
DEBUGF L_DBG, 'ftdi: Write %d bytes PID: %d Dev handler 0x%x\n', [edi+8],\
|
||||
[edi], [edi+4]
|
||||
mov esi, edi
|
||||
add esi, 12
|
||||
@@ -685,7 +695,7 @@ endl
|
||||
jmp .write_loop
|
||||
|
||||
.ftdi_read_data:
|
||||
DEBUGF 2, 'K : FTDI Read %d bytes PID: %d Dev handler 0x%x\n', [edi+8],\
|
||||
DEBUGF L_DBG, 'ftdi: Read %d bytes PID: %d Dev handler 0x%x\n', [edi+8],\
|
||||
[edi], [edi+4]
|
||||
mov edi, [ioctl]
|
||||
mov esi, [edi+input]
|
||||
@@ -743,7 +753,7 @@ endl
|
||||
;---Dirty hack end
|
||||
|
||||
.ftdi_poll_modem_status:
|
||||
DEBUGF 2, 'K : FTDI Poll modem status PID: %d Dev handler 0x0x%x\n', [edi],\
|
||||
DEBUGF L_DBG, 'ftdi: Poll modem status PID: %d Dev handler 0x0x%x\n', [edi],\
|
||||
[edi+4]
|
||||
mov ebx, [edi+4]
|
||||
mov dword[ConfPacket], (FTDI_DEVICE_IN_REQTYPE) \
|
||||
@@ -767,7 +777,7 @@ endl
|
||||
jmp .endswitch
|
||||
|
||||
.ftdi_get_latency_timer:
|
||||
DEBUGF 2, 'K : FTDI Get latency timer PID: %d Dev handler 0x0x%x\n', [edi],\
|
||||
DEBUGF L_DBG, 'ftdi: Get latency timer PID: %d Dev handler 0x0x%x\n', [edi],\
|
||||
[edi+4]
|
||||
mov ebx, [edi+4]
|
||||
mov dword[ConfPacket], FTDI_DEVICE_IN_REQTYPE \
|
||||
@@ -787,7 +797,7 @@ endl
|
||||
jmp .endswitch
|
||||
|
||||
.ftdi_get_list:
|
||||
DEBUGF 2, 'K : FTDI devices list request\n'
|
||||
DEBUGF L_DBG, 'ftdi: devices list request\n'
|
||||
mov edi, [edi+output]
|
||||
xor ecx, ecx
|
||||
call linkedlist_gethead
|
||||
@@ -817,7 +827,7 @@ endl
|
||||
jmp .endswitch
|
||||
|
||||
.ftdi_lock:
|
||||
DEBUGF 2, 'K : FTDI Lock PID: %d Dev handler 0x0x%x\n', [edi], [edi+4]
|
||||
DEBUGF L_DBG, 'ftdi: Lock PID: %d Dev handler 0x0x%x\n', [edi], [edi+4]
|
||||
mov esi, [edi+input]
|
||||
mov ebx, [esi+4]
|
||||
mov eax, [ebx + ftdi_context.lockPID]
|
||||
@@ -831,7 +841,7 @@ endl
|
||||
jmp .endswitch
|
||||
|
||||
.ftdi_unlock:
|
||||
DEBUGF 2, 'K : FTDI Unlock PID: %d Dev handler 0x0x%x\n', [edi], [edi+4]
|
||||
DEBUGF L_DBG, 'ftdi: Unlock PID: %d Dev handler 0x0x%x\n', [edi], [edi+4]
|
||||
mov esi, [edi+input]
|
||||
mov edi, [edi+output]
|
||||
mov ebx, [esi+4]
|
||||
@@ -845,145 +855,19 @@ endl
|
||||
mov [edi], eax
|
||||
jmp .endswitch
|
||||
|
||||
H_CLK = 120000000
|
||||
C_CLK = 48000000
|
||||
.ftdi_set_baudrate:
|
||||
DEBUGF 2, 'K : FTDI Set baudrate to %d PID: %d Dev handle: 0x%x\n',\
|
||||
DEBUGF L_DBG, 'ftdi: Set baudrate to %d PID: %d Dev handle: 0x%x\n',\
|
||||
[edi+8], [edi], [edi+4]
|
||||
mov ebx, [edi+4]
|
||||
cmp [ebx + ftdi_context.chipType], TYPE_2232H
|
||||
jl .c_clk
|
||||
imul eax, [edi+8], 10
|
||||
cmp eax, H_CLK / 0x3FFF
|
||||
jle .c_clk
|
||||
.h_clk:
|
||||
cmp dword[edi+8], H_CLK/10
|
||||
jl .h_nextbaud1
|
||||
xor edx, edx
|
||||
mov ecx, H_CLK/10
|
||||
jmp .calcend
|
||||
|
||||
.c_clk:
|
||||
cmp dword[edi+8], C_CLK/16
|
||||
jl .c_nextbaud1
|
||||
xor edx, edx
|
||||
mov ecx, C_CLK/16
|
||||
jmp .calcend
|
||||
|
||||
.h_nextbaud1:
|
||||
cmp dword[edi+8], H_CLK/(10 + 10/2)
|
||||
jl .h_nextbaud2
|
||||
mov edx, 1
|
||||
mov ecx, H_CLK/(10 + 10/2)
|
||||
jmp .calcend
|
||||
|
||||
.c_nextbaud1:
|
||||
cmp dword[edi+8], C_CLK/(16 + 16/2)
|
||||
jl .c_nextbaud2
|
||||
mov edx, 1
|
||||
mov ecx, C_CLK/(16 + 16/2)
|
||||
jmp .calcend
|
||||
|
||||
.h_nextbaud2:
|
||||
cmp dword[edi+8], H_CLK/(2*10)
|
||||
jl .h_nextbaud3
|
||||
mov edx, 2
|
||||
mov ecx, H_CLK/(2*10)
|
||||
jmp .calcend
|
||||
|
||||
.c_nextbaud2:
|
||||
cmp dword[edi+8], C_CLK/(2*16)
|
||||
jl .c_nextbaud3
|
||||
mov edx, 2
|
||||
mov ecx, C_CLK/(2*16)
|
||||
jmp .calcend
|
||||
|
||||
.h_nextbaud3:
|
||||
mov eax, H_CLK*16/10 ; eax - best_divisor
|
||||
xor edx, edx
|
||||
div dword[edi+8] ; [edi+8] - baudrate
|
||||
push eax
|
||||
and eax, 1
|
||||
pop eax
|
||||
shr eax, 1
|
||||
jz .h_rounddowndiv ; jump by result of and eax, 1
|
||||
inc eax
|
||||
.h_rounddowndiv:
|
||||
cmp eax, 0x20000
|
||||
jle .h_best_divok
|
||||
mov eax, 0x1FFFF
|
||||
.h_best_divok:
|
||||
mov ecx, eax
|
||||
mov eax, H_CLK*16/10
|
||||
xor edx, edx
|
||||
div ecx
|
||||
xchg ecx, eax ; ecx - best_baud
|
||||
push ecx
|
||||
and ecx, 1
|
||||
pop ecx
|
||||
shr ecx, 1
|
||||
jz .rounddownbaud
|
||||
inc ecx
|
||||
jmp .rounddownbaud
|
||||
|
||||
.c_nextbaud3:
|
||||
mov eax, C_CLK ; eax - best_divisor
|
||||
xor edx, edx
|
||||
div dword[edi+8] ; [edi+8] - baudrate
|
||||
push eax
|
||||
and eax, 1
|
||||
pop eax
|
||||
shr eax, 1
|
||||
jnz .c_rounddowndiv ; jump by result of and eax, 1
|
||||
inc eax
|
||||
.c_rounddowndiv:
|
||||
cmp eax, 0x20000
|
||||
jle .c_best_divok
|
||||
mov eax, 0x1FFFF
|
||||
.c_best_divok:
|
||||
mov ecx, eax
|
||||
mov eax, C_CLK
|
||||
xor edx, edx
|
||||
div ecx
|
||||
xchg ecx, eax ; ecx - best_baud
|
||||
push ecx
|
||||
and ecx, 1
|
||||
pop ecx
|
||||
shr ecx, 1
|
||||
jnz .rounddownbaud
|
||||
inc ecx
|
||||
|
||||
.rounddownbaud:
|
||||
mov edx, eax ; edx - encoded_divisor
|
||||
shr edx, 3
|
||||
and eax, 0x7
|
||||
push 7 6 5 1 4 2 3 0
|
||||
mov eax, [esp+eax*4]
|
||||
shl eax, 14
|
||||
or edx, eax
|
||||
add esp, 32
|
||||
|
||||
.calcend:
|
||||
mov eax, edx ; eax - *value
|
||||
mov ecx, edx ; ecx - *index
|
||||
and eax, 0xFFFF
|
||||
cmp [ebx + ftdi_context.chipType], TYPE_2232H
|
||||
jge .foxyindex
|
||||
shr ecx, 16
|
||||
jmp .preparepacket
|
||||
.foxyindex:
|
||||
shr ecx, 8
|
||||
and ecx, 0xFF00
|
||||
or ecx, [ebx + ftdi_context.index]
|
||||
|
||||
.preparepacket:
|
||||
mov esi, [edi+8]
|
||||
call ftdi_calc_baud_divisor
|
||||
mov word[ConfPacket], (FTDI_DEVICE_OUT_REQTYPE) \
|
||||
+ (SIO_SET_BAUDRATE_REQUEST shl 8)
|
||||
mov word[ConfPacket+2], ax
|
||||
mov word[ConfPacket+4], cx
|
||||
mov word[ConfPacket+6], 0
|
||||
jmp .own_index
|
||||
|
||||
jmp .own_index
|
||||
|
||||
endp
|
||||
restore handle
|
||||
restore io_code
|
||||
@@ -993,10 +877,143 @@ restore output
|
||||
restore out_size
|
||||
|
||||
|
||||
proc ftdi_calc_baud_divisor
|
||||
; in: ebx = ftdi_context pointer
|
||||
; esi = baud rate
|
||||
; out: ax = encoded value
|
||||
; cx = encoded index
|
||||
; destroys: eax, ecx, edx, esi
|
||||
cmp [ebx + ftdi_context.chipType], TYPE_2232H
|
||||
jl .c_clk
|
||||
imul eax, esi, 10
|
||||
cmp eax, H_CLK / 0x3FFF
|
||||
jle .c_clk
|
||||
.h_clk:
|
||||
cmp esi, H_CLK / 10
|
||||
jl .h_nextbaud1
|
||||
xor edx, edx
|
||||
mov ecx, H_CLK / 10
|
||||
jmp .calcend
|
||||
|
||||
.c_clk:
|
||||
cmp esi, C_CLK / 16
|
||||
jl .c_nextbaud1
|
||||
xor edx, edx
|
||||
mov ecx, C_CLK / 16
|
||||
jmp .calcend
|
||||
|
||||
.h_nextbaud1:
|
||||
cmp esi, H_CLK / (10 + 10 / 2)
|
||||
jl .h_nextbaud2
|
||||
mov edx, 1
|
||||
mov ecx, H_CLK / (10 + 10 / 2)
|
||||
jmp .calcend
|
||||
|
||||
.c_nextbaud1:
|
||||
cmp esi, C_CLK / (16 + 16 / 2)
|
||||
jl .c_nextbaud2
|
||||
mov edx, 1
|
||||
mov ecx, C_CLK/(16 + 16 / 2)
|
||||
jmp .calcend
|
||||
|
||||
.h_nextbaud2:
|
||||
cmp esi, H_CLK / (2 * 10)
|
||||
jl .h_nextbaud3
|
||||
mov edx, 2
|
||||
mov ecx, H_CLK / (2 * 10)
|
||||
jmp .calcend
|
||||
|
||||
.c_nextbaud2:
|
||||
cmp esi, C_CLK / (2 * 16)
|
||||
jl .c_nextbaud3
|
||||
mov edx, 2
|
||||
mov ecx, C_CLK / (2 * 16)
|
||||
jmp .calcend
|
||||
|
||||
.h_nextbaud3:
|
||||
mov eax, H_CLK * 16 / 10 ; eax - best_divisor
|
||||
xor edx, edx
|
||||
div esi
|
||||
push eax
|
||||
and eax, 1
|
||||
pop eax
|
||||
shr eax, 1
|
||||
jz .h_rounddowndiv ; jump by result of and eax, 1
|
||||
inc eax
|
||||
.h_rounddowndiv:
|
||||
cmp eax, 0x20000
|
||||
jle .h_best_divok
|
||||
mov eax, 0x1FFFF
|
||||
.h_best_divok:
|
||||
mov ecx, eax
|
||||
mov eax, H_CLK * 16 / 10
|
||||
xor edx, edx
|
||||
div ecx
|
||||
xchg ecx, eax ; ecx - best_baud
|
||||
push ecx
|
||||
and ecx, 1
|
||||
pop ecx
|
||||
shr ecx, 1
|
||||
jz .rounddownbaud
|
||||
inc ecx
|
||||
jmp .rounddownbaud
|
||||
|
||||
.c_nextbaud3:
|
||||
mov eax, C_CLK ; eax - best_divisor
|
||||
xor edx, edx
|
||||
div esi
|
||||
push eax
|
||||
and eax, 1
|
||||
pop eax
|
||||
shr eax, 1
|
||||
jnz .c_rounddowndiv ; jump by result of and eax, 1
|
||||
inc eax
|
||||
.c_rounddowndiv:
|
||||
cmp eax, 0x20000
|
||||
jle .c_best_divok
|
||||
mov eax, 0x1FFFF
|
||||
.c_best_divok:
|
||||
mov ecx, eax
|
||||
mov eax, C_CLK
|
||||
xor edx, edx
|
||||
div ecx
|
||||
xchg ecx, eax ; ecx - best_baud
|
||||
push ecx
|
||||
and ecx, 1
|
||||
pop ecx
|
||||
shr ecx, 1
|
||||
jnz .rounddownbaud
|
||||
inc ecx
|
||||
|
||||
.rounddownbaud:
|
||||
mov edx, eax ; edx - encoded_divisor
|
||||
shr edx, 3
|
||||
and eax, 0x7
|
||||
push 7 6 5 1 4 2 3 0
|
||||
mov eax, [esp + eax * 4]
|
||||
shl eax, 14
|
||||
or edx, eax
|
||||
add esp, 32
|
||||
|
||||
.calcend:
|
||||
mov eax, edx ; eax - *value
|
||||
mov ecx, edx ; ecx - *index
|
||||
and eax, 0xFFFF
|
||||
cmp [ebx + ftdi_context.chipType], TYPE_2232H
|
||||
jge .foxyindex
|
||||
shr ecx, 16
|
||||
ret
|
||||
.foxyindex:
|
||||
shr ecx, 8
|
||||
and ecx, 0xFF00
|
||||
or ecx, [ebx + ftdi_context.index]
|
||||
ret
|
||||
endp
|
||||
|
||||
proc control_callback stdcall uses ebx edi esi, .pipe:DWORD, .status:DWORD, \
|
||||
.buffer:DWORD, .length:DWORD, .calldata:DWORD
|
||||
|
||||
DEBUGF 1, 'K : status is %d\n', [.status]
|
||||
DEBUGF L_DBG, 'ftdi: status is %d\n', [.status]
|
||||
mov ecx, [.calldata]
|
||||
mov eax, [ecx]
|
||||
mov ebx, [ecx+4]
|
||||
@@ -1011,7 +1028,7 @@ endp
|
||||
proc bulk_callback stdcall uses ebx edi esi, .pipe:DWORD, .status:DWORD, \
|
||||
.buffer:DWORD, .length:DWORD, .calldata:DWORD
|
||||
|
||||
DEBUGF 1, 'K : status is %d\n', [.status]
|
||||
DEBUGF L_DBG, 'ftdi: status is %d\n', [.status]
|
||||
mov ecx, [.calldata]
|
||||
mov eax, [ecx]
|
||||
mov ebx, [ecx+4]
|
||||
@@ -1034,7 +1051,7 @@ endp
|
||||
|
||||
proc DeviceDisconnected stdcall uses ebx esi edi, .device_data:DWORD
|
||||
|
||||
DEBUGF 1, 'K : FTDI deleting device data 0x%x\n', [.device_data]
|
||||
DEBUGF L_DBG, 'ftdi: deleting device data 0x%x\n', [.device_data]
|
||||
mov esi, [.device_data]
|
||||
mov eax, [esi + ftdi_context.readBufPtr]
|
||||
test eax, eax
|
||||
@@ -1062,7 +1079,7 @@ proc bulk_in_complete stdcall uses ebx edi esi, .pipe:DWORD, .status:DWORD, \
|
||||
mov eax, [.status]
|
||||
test eax, eax
|
||||
jz @f
|
||||
DEBUGF 2, 'ftdi: bulk in error %x\n', eax
|
||||
DEBUGF L_ERR, 'ftdi: bulk in error %x\n', eax
|
||||
@@:
|
||||
mov ebx, [.calldata]
|
||||
btr dword [ebx + ftdi_context.writeBufLock], 0
|
||||
@@ -1075,7 +1092,7 @@ proc bulk_out_complete stdcall uses ebx edi esi, .pipe:DWORD, .status:DWORD, \
|
||||
mov eax, [.status]
|
||||
test eax, eax
|
||||
jz @f
|
||||
DEBUGF 2, 'ftdi: bulk out error %x\n', eax
|
||||
DEBUGF L_ERR, 'ftdi: bulk out error %x\n', eax
|
||||
@@:
|
||||
mov ebx, [.calldata]
|
||||
mov ecx, [.length]
|
||||
@@ -1092,18 +1109,18 @@ proc bulk_out_complete stdcall uses ebx edi esi, .pipe:DWORD, .status:DWORD, \
|
||||
endp
|
||||
|
||||
proc uart_startup stdcall uses ebx, data:dword, conf:dword
|
||||
DEBUGF 1, "ftdi: startup %x %x\n", [data], [conf]
|
||||
DEBUGF L_DBG, "ftdi: startup %x %x\n", [data], [conf]
|
||||
stdcall uart_reconf, [data], [conf]
|
||||
test eax, eax
|
||||
jz @f
|
||||
DEBUGF 2, "ftdi: uart reconf error %x\n", eax
|
||||
DEBUGF L_ERR, "ftdi: uart reconf error %x\n", eax
|
||||
jmp .exit
|
||||
@@:
|
||||
mov ebx, [data]
|
||||
invoke TimerHS, 2, 2, uart_rx, ebx
|
||||
test eax, eax
|
||||
jnz @f
|
||||
DEBUGF 2, "ftdi: timer creation error\n"
|
||||
DEBUGF L_ERR, "ftdi: timer creation error\n"
|
||||
or eax, -1
|
||||
jmp .exit
|
||||
@@:
|
||||
@@ -1114,7 +1131,7 @@ proc uart_startup stdcall uses ebx, data:dword, conf:dword
|
||||
endp
|
||||
|
||||
proc uart_shutdown stdcall uses ebx, data:dword
|
||||
DEBUGF 1, "ftdi: shutdown %x\n", [data]
|
||||
DEBUGF L_DBG, "ftdi: shutdown %x\n", [data]
|
||||
mov ebx, [data]
|
||||
cmp [ebx + ftdi_context.rx_timer], 0
|
||||
jz @f
|
||||
@@ -1246,137 +1263,14 @@ proc uart_rx stdcall uses ebx esi, data:dword
|
||||
ret
|
||||
endp
|
||||
|
||||
proc ftdi_set_baudrate stdcall uses ebx, dev:dword, baud:dword
|
||||
proc ftdi_set_baudrate stdcall uses ebx esi, dev:dword, baud:dword
|
||||
locals
|
||||
ConfPacket rb 8
|
||||
endl
|
||||
mov ebx, [dev]
|
||||
cmp [ebx + ftdi_context.chipType], TYPE_2232H
|
||||
jl .c_clk
|
||||
imul eax, [baud], 10
|
||||
cmp eax, H_CLK / 0x3FFF
|
||||
jle .c_clk
|
||||
.h_clk:
|
||||
cmp dword [baud], H_CLK / 10
|
||||
jl .h_nextbaud1
|
||||
xor edx, edx
|
||||
mov ecx, H_CLK / 10
|
||||
jmp .calcend
|
||||
mov esi, [baud]
|
||||
call ftdi_calc_baud_divisor
|
||||
|
||||
.c_clk:
|
||||
cmp dword [baud], C_CLK / 16
|
||||
jl .c_nextbaud1
|
||||
xor edx, edx
|
||||
mov ecx, C_CLK / 16
|
||||
jmp .calcend
|
||||
|
||||
.h_nextbaud1:
|
||||
cmp dword [baud], H_CLK / (10 + 10 / 2)
|
||||
jl .h_nextbaud2
|
||||
mov edx, 1
|
||||
mov ecx, H_CLK / (10 + 10 / 2)
|
||||
jmp .calcend
|
||||
|
||||
.c_nextbaud1:
|
||||
cmp dword [baud], C_CLK / (16 + 16 / 2)
|
||||
jl .c_nextbaud2
|
||||
mov edx, 1
|
||||
mov ecx, C_CLK/(16 + 16 / 2)
|
||||
jmp .calcend
|
||||
|
||||
.h_nextbaud2:
|
||||
cmp dword [baud], H_CLK / (2 * 10)
|
||||
jl .h_nextbaud3
|
||||
mov edx, 2
|
||||
mov ecx, H_CLK / (2 * 10)
|
||||
jmp .calcend
|
||||
|
||||
.c_nextbaud2:
|
||||
cmp dword [baud], C_CLK / (2 * 16)
|
||||
jl .c_nextbaud3
|
||||
mov edx, 2
|
||||
mov ecx, C_CLK / (2 * 16)
|
||||
jmp .calcend
|
||||
|
||||
.h_nextbaud3:
|
||||
mov eax, H_CLK * 16 / 10 ; eax - best_divisor
|
||||
xor edx, edx
|
||||
div dword [baud]
|
||||
push eax
|
||||
and eax, 1
|
||||
pop eax
|
||||
shr eax, 1
|
||||
jz .h_rounddowndiv ; jump by result of and eax, 1
|
||||
inc eax
|
||||
.h_rounddowndiv:
|
||||
cmp eax, 0x20000
|
||||
jle .h_best_divok
|
||||
mov eax, 0x1FFFF
|
||||
.h_best_divok:
|
||||
mov ecx, eax
|
||||
mov eax, H_CLK * 16 / 10
|
||||
xor edx, edx
|
||||
div ecx
|
||||
xchg ecx, eax ; ecx - best_baud
|
||||
push ecx
|
||||
and ecx, 1
|
||||
pop ecx
|
||||
shr ecx, 1
|
||||
jz .rounddownbaud
|
||||
inc ecx
|
||||
jmp .rounddownbaud
|
||||
|
||||
.c_nextbaud3:
|
||||
mov eax, C_CLK ; eax - best_divisor
|
||||
xor edx, edx
|
||||
div dword [baud]
|
||||
push eax
|
||||
and eax, 1
|
||||
pop eax
|
||||
shr eax, 1
|
||||
jnz .c_rounddowndiv ; jump by result of and eax, 1
|
||||
inc eax
|
||||
.c_rounddowndiv:
|
||||
cmp eax, 0x20000
|
||||
jle .c_best_divok
|
||||
mov eax, 0x1FFFF
|
||||
.c_best_divok:
|
||||
mov ecx, eax
|
||||
mov eax, C_CLK
|
||||
xor edx, edx
|
||||
div ecx
|
||||
xchg ecx, eax ; ecx - best_baud
|
||||
push ecx
|
||||
and ecx, 1
|
||||
pop ecx
|
||||
shr ecx, 1
|
||||
jnz .rounddownbaud
|
||||
inc ecx
|
||||
|
||||
.rounddownbaud:
|
||||
mov edx, eax ; edx - encoded_divisor
|
||||
shr edx, 3
|
||||
and eax, 0x7
|
||||
push 7 6 5 1 4 2 3 0
|
||||
mov eax, [esp + eax * 4]
|
||||
shl eax, 14
|
||||
or edx, eax
|
||||
add esp, 32
|
||||
|
||||
.calcend:
|
||||
mov eax, edx ; eax - *value
|
||||
mov ecx, edx ; ecx - *index
|
||||
and eax, 0xFFFF
|
||||
cmp [ebx + ftdi_context.chipType], TYPE_2232H
|
||||
jge .foxyindex
|
||||
shr ecx, 16
|
||||
jmp .preparepacket
|
||||
.foxyindex:
|
||||
shr ecx, 8
|
||||
and ecx, 0xFF00
|
||||
or ecx, [ebx + ftdi_context.index]
|
||||
|
||||
.preparepacket:
|
||||
mov word [ConfPacket], (FTDI_DEVICE_OUT_REQTYPE) \
|
||||
+ (SIO_SET_BAUDRATE_REQUEST shl 8)
|
||||
mov word [ConfPacket + 2], ax
|
||||
@@ -1451,10 +1345,9 @@ uart_drv:
|
||||
dd uart_tx
|
||||
uart_drv_end:
|
||||
|
||||
serial_drv_entry dd 0
|
||||
include_debug_strings
|
||||
|
||||
data fixups
|
||||
end data
|
||||
|
||||
;for DEBUGF macro
|
||||
include_debug_strings
|
||||
|
||||
serial_drv_entry dd ?
|
||||
@@ -0,0 +1,3 @@
|
||||
if tup.getconfig("NO_FASM") ~= "" then return end
|
||||
ROOT = "../../.."
|
||||
tup.foreach_rule("*.asm", "fasm %f %o " .. tup.getconfig("PESTRIP_CMD") .. tup.getconfig("KPACK_CMD"), "%B.sys")
|
||||
File diff suppressed because it is too large.
Load diff
File diff suppressed because it is too large.
Load diff
@@ -79,7 +79,7 @@ macro ADD_CLASS drv_name, class, subclass, protocol {
|
||||
..class_code = ..length or (class shl 8)
|
||||
|
||||
if ..length = 3
|
||||
..class_code = ..class_code or (protocol shl 24)
|
||||
..class_code = ..class_code or (subclass shl 16) or (protocol shl 24)
|
||||
end if
|
||||
if ..length = 2
|
||||
..class_code = ..class_code or (subclass shl 16)
|
||||
@@ -172,7 +172,17 @@ macro ADD_IDL drv_name, [vendor_id, device_id] {
|
||||
|
||||
INIT_USBDRV_FILE
|
||||
|
||||
;ADD_CLASS 'usbcdc-ctrl' , 0x02, X , X
|
||||
; CDC (Communications Device Class): NCM network + ACM serial
|
||||
ADD_CLASS 'usbcdc' , 0x02, X , X
|
||||
|
||||
; RNDIS network (Remote NDIS): LTE modems in HiLink mode, USB tethering.
|
||||
; Three encodings exist: Wireless-Controller/RF/RNDIS, Miscellaneous/
|
||||
; RNDIS-over-Ethernet (phone tethering) and an ACM masquerade (the
|
||||
; latter is declined by usbcdc, so the scan falls through to us).
|
||||
ADD_CLASS 'usbrndis' , 0xE0, 0x01, 0x03
|
||||
ADD_CLASS 'usbrndis' , 0xEF, 0x04, 0x01
|
||||
ADD_CLASS 'usbrndis' , 0x02, 0x02, 0xFF
|
||||
|
||||
;ADD_CLASS 'usbimage' , 0x06, 1 , 1
|
||||
;ADD_CLASS 'usbcdc-data' , 0x0A, X , X
|
||||
;ADD_CLASS 'ccid' , 0x0B, X , X
|
||||
|
||||
@@ -722,6 +722,225 @@ endp
|
||||
; callback inquiry_callback;
|
||||
; * inquiry_callback checks that a logical device is a block device
|
||||
; and the unit was ready; if so, it notifies the kernel about new disk device.
|
||||
; Open the bulk pipes of the Zero-CD device and send the switch message
|
||||
; chosen for it (optionally preceded by an INQUIRY exchange). Used as
|
||||
; the fallback when the device has no MS OS 2.0 alternate enumeration.
|
||||
proc modeswitch_send_cbw
|
||||
push ebx
|
||||
mov ebx, [modeswitch_pipe0]
|
||||
cmp dword [modeswitch_in_ep], 0
|
||||
jz @f
|
||||
invoke USBOpenPipe, ebx, [modeswitch_in_ep], [modeswitch_in_mps], \
|
||||
BULK_PIPE, 0
|
||||
mov [modeswitch_in_pipe], eax
|
||||
@@:
|
||||
invoke USBOpenPipe, ebx, [modeswitch_out_ep], [modeswitch_out_mps], \
|
||||
BULK_PIPE, 0
|
||||
test eax, eax
|
||||
jz .fail
|
||||
mov [modeswitch_out_pipe], eax
|
||||
; warm up the firmware with an INQUIRY exchange first, if the method
|
||||
; asks for it (and the CSW pipe is available)
|
||||
cmp dword [modeswitch_inq], 0
|
||||
jz .magic
|
||||
cmp dword [modeswitch_in_pipe], 0
|
||||
jz .magic
|
||||
invoke USBNormalTransferAsync, eax, modeswitch_cbw_inq, 31, \
|
||||
modeswitch_inq_cbw_callback, 0, 0
|
||||
DEBUGF 1,'K : modeswitch INQUIRY CBW submitted, handle %x\n', eax
|
||||
test eax, eax
|
||||
jz .fail
|
||||
pop ebx
|
||||
ret
|
||||
.magic:
|
||||
invoke USBNormalTransferAsync, [modeswitch_out_pipe], [modeswitch_msg], 31, \
|
||||
modeswitch_callback, 0, 0
|
||||
DEBUGF 1,'K : modeswitch CBW submitted, handle %x\n', eax
|
||||
test eax, eax
|
||||
jz .fail
|
||||
pop ebx
|
||||
ret
|
||||
.fail:
|
||||
mov dword [modeswitch_pipe0], 0 ; transaction over
|
||||
pop ebx
|
||||
ret
|
||||
endp
|
||||
|
||||
; The INQUIRY CBW went out: read the 36 data bytes.
|
||||
proc modeswitch_inq_cbw_callback stdcall uses ebx esi edi, .pipe:dword, .status:dword, .buffer:dword, .length:dword, .calldata:dword
|
||||
DEBUGF 1,'K : modeswitch INQUIRY CBW done, status %d\n', [.status]
|
||||
cmp [.status], 0
|
||||
jne .fail
|
||||
invoke USBNormalTransferAsync, [modeswitch_in_pipe], modeswitch_bos_buf, \
|
||||
36, modeswitch_inq_data_callback, 0, 1
|
||||
test eax, eax
|
||||
jz .fail
|
||||
ret
|
||||
.fail:
|
||||
mov dword [modeswitch_pipe0], 0 ; transaction over
|
||||
ret
|
||||
endp
|
||||
|
||||
; The INQUIRY data arrived: read the CSW.
|
||||
proc modeswitch_inq_data_callback stdcall uses ebx esi edi, .pipe:dword, .status:dword, .buffer:dword, .length:dword, .calldata:dword
|
||||
DEBUGF 1,'K : modeswitch INQUIRY data done, status %d len %d\n', [.status], [.length]
|
||||
invoke USBNormalTransferAsync, [modeswitch_in_pipe], modeswitch_csw, \
|
||||
13, modeswitch_inq_csw_callback, 0, 1
|
||||
test eax, eax
|
||||
jz .fail
|
||||
ret
|
||||
.fail:
|
||||
mov dword [modeswitch_pipe0], 0 ; transaction over
|
||||
ret
|
||||
endp
|
||||
|
||||
; The INQUIRY transaction is complete: now the switch message itself.
|
||||
proc modeswitch_inq_csw_callback stdcall uses ebx esi edi, .pipe:dword, .status:dword, .buffer:dword, .length:dword, .calldata:dword
|
||||
DEBUGF 1,'K : modeswitch INQUIRY CSW done, status %d\n', [.status]
|
||||
invoke USBNormalTransferAsync, [modeswitch_out_pipe], [modeswitch_msg], 31, \
|
||||
modeswitch_callback, 0, 0
|
||||
DEBUGF 1,'K : modeswitch CBW submitted, handle %x\n', eax
|
||||
test eax, eax
|
||||
jz .fail
|
||||
ret
|
||||
.fail:
|
||||
mov dword [modeswitch_pipe0], 0 ; transaction over
|
||||
ret
|
||||
endp
|
||||
|
||||
; The BOS descriptor has been read. If the device carries an
|
||||
; MS OS 2.0 platform capability with a nonzero bAltEnumCode, switch it
|
||||
; the way Windows does: a vendor control request "set alternate
|
||||
; enumeration". Otherwise fall back to the bulk switch message.
|
||||
proc modeswitch_bos_callback stdcall uses ebx esi edi, .pipe:dword, .status:dword, .buffer:dword, .length:dword, .calldata:dword
|
||||
DEBUGF 1,'K : modeswitch BOS done, status %d len %d\n', [.status], [.length]
|
||||
cmp [.status], 0
|
||||
jne .fallback
|
||||
mov ecx, [.length]
|
||||
sub ecx, 8 ; minus the setup packet
|
||||
cmp ecx, 5
|
||||
jb .fallback
|
||||
mov esi, modeswitch_bos_buf
|
||||
cmp byte [esi+1], 0x0F ; BOS descriptor type
|
||||
jne .fallback
|
||||
movzx edx, word [esi+2] ; wTotalLength
|
||||
cmp edx, ecx
|
||||
jbe @f
|
||||
mov edx, ecx ; clamp to what was received
|
||||
@@:
|
||||
add edx, esi ; edx = end of BOS data
|
||||
add esi, 5 ; first device capability
|
||||
.cap_loop:
|
||||
lea eax, [esi+3]
|
||||
cmp eax, edx
|
||||
ja .fallback ; no more capabilities
|
||||
movzx ecx, byte [esi] ; bLength
|
||||
test ecx, ecx
|
||||
jz .fallback
|
||||
cmp byte [esi+1], 0x10 ; DEVICE_CAPABILITY
|
||||
jne .next_cap
|
||||
cmp byte [esi+2], 0x05 ; PLATFORM capability
|
||||
jne .next_cap
|
||||
cmp ecx, 20+8 ; header + GUID + one set info
|
||||
jb .next_cap
|
||||
lea eax, [esi+ecx]
|
||||
cmp eax, edx
|
||||
ja .fallback ; capability sticks out of BOS
|
||||
; is it the MS OS 2.0 platform GUID?
|
||||
push esi edi ecx
|
||||
add esi, 4
|
||||
mov edi, msos20_guid
|
||||
mov ecx, 16
|
||||
repe cmpsb
|
||||
pop ecx edi esi
|
||||
jne .next_cap
|
||||
; walk the descriptor set info structures, take one with bAltEnumCode
|
||||
push ecx
|
||||
sub ecx, 20
|
||||
shr ecx, 3 ; number of 8-byte set infos
|
||||
lea eax, [esi+20]
|
||||
.set_loop:
|
||||
test ecx, ecx
|
||||
jz .no_alt_enum
|
||||
cmp byte [eax+7], 0 ; bAltEnumCode
|
||||
jne .set_found
|
||||
add eax, 8
|
||||
dec ecx
|
||||
jmp .set_loop
|
||||
.set_found:
|
||||
pop ecx
|
||||
mov cl, [eax+6] ; bMS_VendorCode
|
||||
mov [modeswitch_alt_setup+1], cl
|
||||
mov cl, [eax+7] ; bAltEnumCode -> wValue high byte
|
||||
mov [modeswitch_alt_setup+3], cl
|
||||
DEBUGF 1,'K : modeswitch: MS OS 2.0 alt enum supported\n'
|
||||
mov ebx, [.calldata] ; pipe 0
|
||||
invoke USBControlTransferAsync, ebx, modeswitch_alt_setup, 0, 0, \
|
||||
modeswitch_alt_callback, ebx, 0
|
||||
DEBUGF 1,'K : modeswitch SET_ALT_ENUMERATION submit %x\n', eax
|
||||
test eax, eax
|
||||
jz .fallback
|
||||
ret
|
||||
.no_alt_enum:
|
||||
pop ecx
|
||||
jmp .fallback
|
||||
.next_cap:
|
||||
add esi, ecx
|
||||
jmp .cap_loop
|
||||
.fallback:
|
||||
DEBUGF 1,'K : modeswitch: no MS OS 2.0, using bulk message\n'
|
||||
call modeswitch_send_cbw
|
||||
ret
|
||||
endp
|
||||
|
||||
; SET_ALT_ENUMERATION completed: on success the device re-enumerates
|
||||
; by itself; if it stalled the request, try the bulk message instead.
|
||||
proc modeswitch_alt_callback stdcall uses ebx esi edi, .pipe:dword, .status:dword, .buffer:dword, .length:dword, .calldata:dword
|
||||
DEBUGF 1,'K : modeswitch SET_ALT_ENUMERATION done, status %d\n', [.status]
|
||||
cmp [.status], 0
|
||||
je .ret
|
||||
call modeswitch_send_cbw
|
||||
.ret:
|
||||
ret
|
||||
endp
|
||||
|
||||
; The mode-switch CBW has completed. Read the CSW status like
|
||||
; usb_modeswitch does: some firmwares only switch after the host has
|
||||
; completed the whole Bulk-Only transaction.
|
||||
proc modeswitch_callback stdcall uses ebx esi edi, .pipe:dword, .status:dword, .buffer:dword, .length:dword, .calldata:dword
|
||||
DEBUGF 1,'K : modeswitch CBW done, status %d\n', [.status]
|
||||
cmp [.status], 0
|
||||
jne .done
|
||||
mov eax, [modeswitch_in_pipe]
|
||||
test eax, eax
|
||||
jz .done
|
||||
invoke USBNormalTransferAsync, eax, modeswitch_csw, 13, \
|
||||
modeswitch_csw_callback, 0, 1
|
||||
test eax, eax
|
||||
jnz .ret
|
||||
.done:
|
||||
mov dword [modeswitch_pipe0], 0 ; transaction over
|
||||
.ret:
|
||||
ret
|
||||
endp
|
||||
|
||||
; The CSW arrived (or errored); nothing more to do, the device should
|
||||
; drop off the bus and re-enumerate in its real configuration.
|
||||
proc modeswitch_csw_callback stdcall uses ebx esi edi, .pipe:dword, .status:dword, .buffer:dword, .length:dword, .calldata:dword
|
||||
DEBUGF 1,'K : modeswitch CSW done, status %d len %d\n', [.status], [.length]
|
||||
mov dword [modeswitch_pipe0], 0 ; transaction over
|
||||
ret
|
||||
endp
|
||||
|
||||
; SET_FEATURE(1) completed; the device either resets into its real
|
||||
; configuration or (newer firmwares) just resets back into Zero-CD,
|
||||
; which re-triggers the quirk with the next method of the list.
|
||||
proc modeswitch_sf_callback stdcall uses ebx esi edi, .pipe:dword, .status:dword, .buffer:dword, .length:dword, .calldata:dword
|
||||
DEBUGF 1,'K : modeswitch SET_FEATURE done, status %d\n', [.status]
|
||||
mov dword [modeswitch_pipe0], 0 ; transaction over
|
||||
ret
|
||||
endp
|
||||
|
||||
proc AddDevice
|
||||
push ebx esi
|
||||
virtual at esp
|
||||
@@ -737,6 +956,134 @@ end virtual
|
||||
; bInterfaceProtocol are subsequent in interface_descr, just one
|
||||
; memory reference is used for both.
|
||||
mov esi, [.interface]
|
||||
; Some 3G/LTE modems enumerate as a mass-storage-only "Zero-CD" (a
|
||||
; virtual CD-ROM with Windows drivers) and must be switched to their
|
||||
; real configuration by a magic vendor SCSI command sent to the bulk
|
||||
; OUT endpoint (usb_modeswitch's "HuaweiNewMode"; a SET_FEATURE(1)
|
||||
; only resets these devices back into Zero-CD). Match by VID:PID,
|
||||
; fire the command and do not bind: the device drops off the bus and
|
||||
; re-enumerates with a new PID.
|
||||
mov ebx, [.pipe0]
|
||||
invoke USBGetParam, ebx, 0 ; 0 = get device descriptor
|
||||
test eax, eax
|
||||
jz .no_modeswitch
|
||||
mov ecx, [eax+8] ; idVendor | idProduct shl 16
|
||||
mov edx, modeswitch_ids
|
||||
.modeswitch_scan:
|
||||
cmp dword [edx], 0
|
||||
jz .no_modeswitch
|
||||
cmp ecx, [edx]
|
||||
jz .do_modeswitch
|
||||
add edx, 8
|
||||
jmp .modeswitch_scan
|
||||
.do_modeswitch:
|
||||
; one switch transaction at a time: some Zero-CDs (12d1:14ad) carry TWO
|
||||
; storage interfaces and AddDevice fires for each; a second concurrent
|
||||
; CBW confuses the firmware
|
||||
cmp [modeswitch_pipe0], ebx
|
||||
je .nothing
|
||||
; pick the method: repeated appearances of the same id walk its method
|
||||
; list (wrapping around), a different id starts from the first method
|
||||
cmp ecx, [modeswitch_last_id]
|
||||
je @f
|
||||
mov [modeswitch_last_id], ecx
|
||||
mov dword [modeswitch_attempt], 0
|
||||
jmp .method_select
|
||||
@@:
|
||||
inc [modeswitch_attempt]
|
||||
.method_select:
|
||||
mov eax, [edx+4] ; start of the method list
|
||||
mov ecx, [modeswitch_attempt]
|
||||
.method_walk:
|
||||
cmp dword [eax], -1 ; end of list: wrap around
|
||||
jne @f
|
||||
mov eax, [edx+4]
|
||||
@@:
|
||||
test ecx, ecx
|
||||
jz .method_found
|
||||
add eax, 8
|
||||
dec ecx
|
||||
jmp .method_walk
|
||||
.method_found:
|
||||
mov [modeswitch_pipe0], ebx
|
||||
push esi
|
||||
mov esi, switchdevice
|
||||
invoke SysMsgBoardStr
|
||||
pop esi
|
||||
DEBUGF 1,'K : modeswitch attempt %d, method %d\n', [modeswitch_attempt], [eax]
|
||||
cmp dword [eax], MSW_SET_FEATURE
|
||||
je .method_set_feature
|
||||
xor ecx, ecx
|
||||
cmp dword [eax], MSW_CBW_INQ
|
||||
jne @f
|
||||
inc ecx
|
||||
@@:
|
||||
mov [modeswitch_inq], ecx
|
||||
mov eax, [eax+4] ; the CBW for this attempt
|
||||
mov [modeswitch_msg], eax
|
||||
jmp .method_cbw
|
||||
; SET_FEATURE(1) needs no endpoints: fire the control request and let
|
||||
; the device drop off the bus by itself
|
||||
.method_set_feature:
|
||||
invoke USBControlTransferAsync, ebx, modeswitch_sf_setup, 0, 0, \
|
||||
modeswitch_sf_callback, 0, 0
|
||||
DEBUGF 1,'K : modeswitch SET_FEATURE submit %x\n', eax
|
||||
test eax, eax
|
||||
jnz .nothing
|
||||
mov dword [modeswitch_pipe0], 0
|
||||
jmp .nothing
|
||||
.method_cbw:
|
||||
; collect the bulk IN and bulk OUT endpoints of this interface
|
||||
mov dword [modeswitch_in_pipe], 0
|
||||
mov dword [modeswitch_in_ep], 0
|
||||
mov dword [modeswitch_out_ep], 0
|
||||
mov edx, [.config]
|
||||
movzx ecx, [edx+config_descr.wTotalLength]
|
||||
add edx, ecx ; edx = end of configuration data
|
||||
.modeswitch_ep_scan:
|
||||
movzx ecx, byte [esi] ; bLength
|
||||
test ecx, ecx
|
||||
jz .modeswitch_send ; malformed, use what we have
|
||||
add esi, ecx
|
||||
lea ecx, [esi+sizeof.endpoint_descr]
|
||||
cmp ecx, edx
|
||||
ja .modeswitch_send ; ran out of descriptors
|
||||
cmp byte [esi+1], ENDPOINT_DESCR_TYPE
|
||||
jne .modeswitch_ep_scan
|
||||
mov cl, [esi+endpoint_descr.bmAttributes]
|
||||
and cl, 3
|
||||
cmp cl, BULK_PIPE
|
||||
jne .modeswitch_ep_scan
|
||||
movzx ecx, [esi+endpoint_descr.bEndpointAddress]
|
||||
push edx
|
||||
movzx edx, [esi+endpoint_descr.wMaxPacketSize]
|
||||
and edx, 0xFFF
|
||||
test cl, 80h
|
||||
jz .modeswitch_ep_out
|
||||
mov [modeswitch_in_ep], ecx
|
||||
mov [modeswitch_in_mps], edx
|
||||
pop edx
|
||||
jmp .modeswitch_ep_scan
|
||||
.modeswitch_ep_out:
|
||||
mov [modeswitch_out_ep], ecx
|
||||
mov [modeswitch_out_mps], edx
|
||||
pop edx
|
||||
jmp .modeswitch_ep_scan
|
||||
.modeswitch_send:
|
||||
cmp dword [modeswitch_out_ep], 0
|
||||
jz .nothing ; no bulk OUT: cannot switch
|
||||
mov [modeswitch_pipe0], ebx
|
||||
; try the Windows mechanism first (MS OS 2.0 alternate enumeration,
|
||||
; this is how E3372h switches); its callback falls back to the classic
|
||||
; bulk switch message if the device has no such capability
|
||||
invoke USBControlTransferAsync, ebx, modeswitch_bos_setup, \
|
||||
modeswitch_bos_buf, 256, modeswitch_bos_callback, ebx, 1
|
||||
DEBUGF 1,'K : modeswitch BOS read submit %x\n', eax
|
||||
test eax, eax
|
||||
jnz .nothing
|
||||
call modeswitch_send_cbw ; could not even ask: fall back
|
||||
jmp .nothing
|
||||
.no_modeswitch:
|
||||
xor ebx, ebx
|
||||
mov cx, word [esi+interface_descr.bInterfaceSubClass]
|
||||
; 1b. For Mass-storage SCSI-command-set Bulk-only devices subclass must be 6
|
||||
@@ -991,6 +1338,16 @@ proc inquiry_callback
|
||||
test al, al
|
||||
jnz .nothing
|
||||
DEBUGF 1,'K : direct-access mass storage device detected\n'
|
||||
; Units that report 'medium not present' (the empty card slot of an LTE
|
||||
; modem or card reader) are not registered: the kernel has no media
|
||||
; change detection, so such a disk would only sit dead in the file
|
||||
; managers. Replugging the device after inserting a card registers it.
|
||||
mov edx, [esp+8]
|
||||
cmp [edx+usb_unit_data.MediaPresent], 0
|
||||
jnz @f
|
||||
DEBUGF 1,'K : no media, not registering the disk\n'
|
||||
ret 8
|
||||
@@:
|
||||
; 3. We have found a new disk device. Increment number of references.
|
||||
lock inc [ecx+usb_device_data.NumReferences]
|
||||
; Unfortunately, we are now in the context of the USB thread,
|
||||
@@ -1568,6 +1925,117 @@ inquiry_fail db 'K : INQUIRY command failed',13,10,0
|
||||
;read_capacity_fail db 'K : READ CAPACITY command failed',13,10,0
|
||||
;read_fail db 'K : READ command failed',13,10,0
|
||||
noindex db 'K : failed to generate disk name',13,10,0
|
||||
switchdevice db 'K : Zero-CD modem detected, switching mode',13,10,0
|
||||
|
||||
; Zero-CD devices to switch: pairs of (idVendor + idProduct shl 16,
|
||||
; pointer to a method list). Different firmware generations accept
|
||||
; different switch methods and silently ignore (or merely ACK) the
|
||||
; others, and some do not react to the method the usb_modeswitch
|
||||
; database prescribes. So every id gets a LIST of methods and each
|
||||
; (re)appearance of the same id tries the next one, wrapping around.
|
||||
; No timers needed: an unswitched stick resets itself about half a
|
||||
; minute after a swallowed command (observed on K3806), and the user
|
||||
; can always just replug.
|
||||
MSW_CBW = 0 ; method: bulk message, param = CBW ptr
|
||||
MSW_SET_FEATURE = 1 ; method: SET_FEATURE(1) control request
|
||||
MSW_CBW_INQ = 2 ; method: INQUIRY exchange, then the CBW;
|
||||
; some firmwares accept the switch only
|
||||
; after normal SCSI traffic (on Linux and
|
||||
; Windows the storage driver reads the
|
||||
; virtual CD before any switch tool runs)
|
||||
|
||||
align 4
|
||||
modeswitch_ids dd 0x1F0112D1, modeswitch_list_1f01 ; Huawei E3372 etc
|
||||
dd 0x14AD12D1, modeswitch_list_14ad ; Vodafone K3806
|
||||
dd 0
|
||||
|
||||
; E3372h-153: the 10-byte command is the only one this firmware
|
||||
; reacts to (verified on hardware; SET_FEATURE only resets it)
|
||||
modeswitch_list_1f01:
|
||||
dd MSW_CBW, modeswitch_cbw_new
|
||||
dd -1
|
||||
; K3806: the plain usb_modeswitch message (classic Huawei), the eject
|
||||
; and the E3372 message are all ACKed but ignored, SET_FEATURE stalls
|
||||
; (verified on hardware) - so lead with INQUIRY+message
|
||||
modeswitch_list_14ad:
|
||||
dd MSW_CBW_INQ, modeswitch_cbw_old
|
||||
dd MSW_SET_FEATURE, 0
|
||||
dd MSW_CBW, modeswitch_cbw_eject
|
||||
dd MSW_CBW, modeswitch_cbw_new
|
||||
dd MSW_CBW, modeswitch_cbw_old
|
||||
dd -1
|
||||
; usb_modeswitch's message for the 1F01 Zero-CD family: a CBW with the
|
||||
; 10-byte vendor command 11 06 20 00 00 00 00 00 01 00 (note the 01 in
|
||||
; byte 8; the older 6-byte 11 06 20 00 00 01 variant is ignored by
|
||||
; E3372h firmwares) and no data stage
|
||||
modeswitch_cbw_new:
|
||||
db 'USBC' ; dCBWSignature
|
||||
dd 0x12345678 ; dCBWTag
|
||||
dd 0 ; dCBWDataTransferLength
|
||||
db 0 ; bmCBWFlags
|
||||
db 0 ; bCBWLUN
|
||||
db 10 ; bCBWCBLength
|
||||
db 0x11, 0x06, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00
|
||||
db 0, 0, 0, 0, 0, 0
|
||||
; the classic Huawei message for older sticks (usb_modeswitch 12d1:14ad
|
||||
; etc): the 6-byte vendor command 11 06 20 00 00 01, byte-for-byte as
|
||||
; usb_modeswitch sends it (bCBWCBLength is 0 in the original message)
|
||||
modeswitch_cbw_old:
|
||||
db 'USBC' ; dCBWSignature
|
||||
dd 0x12345678 ; dCBWTag
|
||||
dd 0 ; dCBWDataTransferLength
|
||||
db 0 ; bmCBWFlags
|
||||
db 0 ; bCBWLUN
|
||||
db 0 ; bCBWCBLength
|
||||
db 0x11, 0x06, 0x20, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00
|
||||
db 0, 0, 0, 0, 0, 0
|
||||
; the standard eject (START STOP UNIT with LoEj|Stop): the generic
|
||||
; Zero-CD switch used by many non-Huawei sticks
|
||||
modeswitch_cbw_eject:
|
||||
db 'USBC' ; dCBWSignature
|
||||
dd 0x12345678 ; dCBWTag
|
||||
dd 0 ; dCBWDataTransferLength
|
||||
db 0 ; bmCBWFlags
|
||||
db 0 ; bCBWLUN
|
||||
db 6 ; bCBWCBLength
|
||||
db 0x1B, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00
|
||||
db 0, 0, 0, 0, 0, 0
|
||||
; SET_FEATURE(1) to the device: the switch of the oldest Huawei sticks
|
||||
modeswitch_sf_setup db 0x00, 0x03, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00
|
||||
; standard INQUIRY (36 bytes of data IN), the warm-up for MSW_CBW_INQ
|
||||
modeswitch_cbw_inq:
|
||||
db 'USBC' ; dCBWSignature
|
||||
dd 0x12345678 ; dCBWTag
|
||||
dd 36 ; dCBWDataTransferLength
|
||||
db 0x80 ; bmCBWFlags: data IN
|
||||
db 0 ; bCBWLUN
|
||||
db 6 ; bCBWCBLength
|
||||
db 0x12, 0x00, 0x00, 0x00, 0x24, 0x00, 0x00, 0x00, 0x00, 0x00
|
||||
db 0, 0, 0, 0, 0, 0
|
||||
; scratch state of the mode-switch transaction
|
||||
modeswitch_pipe0 dd 0 ; config pipe of the device
|
||||
; (nonzero = transaction running)
|
||||
modeswitch_msg dd 0 ; the CBW chosen for this device
|
||||
modeswitch_inq dd 0 ; run an INQUIRY before the CBW
|
||||
modeswitch_out_pipe dd 0 ; bulk OUT pipe handle
|
||||
modeswitch_last_id dd 0 ; VID:PID of the last attempt
|
||||
modeswitch_attempt dd 0 ; method index for that id
|
||||
modeswitch_in_pipe dd 0 ; bulk IN pipe handle (for the CSW)
|
||||
modeswitch_in_ep dd 0
|
||||
modeswitch_in_mps dd 0
|
||||
modeswitch_out_ep dd 0
|
||||
modeswitch_out_mps dd 0
|
||||
; GET_DESCRIPTOR(BOS), up to 256 bytes
|
||||
modeswitch_bos_setup db 0x80, 0x06, 0x00, 0x0F, 0x00, 0x00
|
||||
dw 256
|
||||
; MS OS 2.0 "set alternate enumeration": vendor request to the device,
|
||||
; bRequest (+1) and wValue high byte (+3) are patched in at runtime
|
||||
modeswitch_alt_setup db 0x40, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00
|
||||
; platform capability GUID of MS OS 2.0: D8DD60DF-4589-4CC7-9CD2-659D9E648A9F
|
||||
msos20_guid db 0xDF, 0x60, 0xDD, 0xD8, 0x89, 0x45, 0xC7, 0x4C
|
||||
db 0x9C, 0xD2, 0x65, 0x9D, 0x9E, 0x64, 0x8A, 0x9F
|
||||
modeswitch_csw rb 16 ; CSW receive buffer
|
||||
modeswitch_bos_buf rb 256 ; BOS descriptor buffer
|
||||
|
||||
align 4
|
||||
; Structure with callback functions.
|
||||
|
||||
+809
-97
File diff suppressed because it is too large.
Load diff
@@ -1489,19 +1489,31 @@ dyndisk_handler:
|
||||
; 12. The fs operation has specified some partition.
|
||||
push edx ecx
|
||||
xor eax, eax
|
||||
mov ecx, eax
|
||||
lodsb
|
||||
@@:
|
||||
lea ecx, [ecx*4 + ecx]
|
||||
shl ecx, 1
|
||||
|
||||
sub eax, '0'
|
||||
jz .dyndisk_cleanup
|
||||
jb .dyndisk_cleanup
|
||||
cmp eax, 10
|
||||
jnc .dyndisk_cleanup
|
||||
mov ecx, eax
|
||||
|
||||
add ecx, eax
|
||||
cmp ecx, MAX_NUM_PARTITIONS
|
||||
ja .dyndisk_cleanup
|
||||
|
||||
lodsb
|
||||
cmp eax, '/'
|
||||
jz @f
|
||||
test eax, eax
|
||||
jnz .dyndisk_cleanup
|
||||
jnz @b
|
||||
dec esi
|
||||
@@:
|
||||
test ecx, ecx
|
||||
jz .dyndisk_cleanup
|
||||
|
||||
cmp byte [esi], 0
|
||||
jnz @f
|
||||
; partition info
|
||||
|
||||
@@ -18,7 +18,24 @@ saverd_fileinfo:
|
||||
.name:
|
||||
dd ?
|
||||
endg
|
||||
sysfn_saveramdisk: ; 18.6 = SAVE FLOPPY IMAGE (HD version only)
|
||||
sysfn_saveramdisk: ; 18.6 = SAVE RAMDISK IMAGE
|
||||
; ecx -> path to the image file; ecx = 0 - write the image back to the
|
||||
; medium it was booted from (a floppy or the file found by rdload.inc)
|
||||
test ecx, ecx
|
||||
jnz .have_path
|
||||
if ~ defined extended_primary_loader
|
||||
mov ecx, read_image_fsinfo.name
|
||||
cmp [BOOT.rd_load_from], RD_LOAD_FROM_HD
|
||||
je .have_path
|
||||
end if
|
||||
movi eax, ERROR_UNSUPPORTED_FS
|
||||
cmp [BOOT.rd_load_from], RD_LOAD_FROM_FLOPPY
|
||||
jne .done
|
||||
mov ebx, 1
|
||||
call save_image
|
||||
imul eax, ERROR_DEVICE ; 0 -> 0, 1 -> ERROR_DEVICE
|
||||
jmp .done
|
||||
.have_path:
|
||||
mov ebx, saverd_fileinfo
|
||||
mov [ebx+21], ecx
|
||||
mov eax, [ramdisk_actual_size]
|
||||
@@ -27,5 +44,6 @@ sysfn_saveramdisk: ; 18.6 = SAVE FLOPPY IMAGE (HD version only)
|
||||
pushad
|
||||
call file_system_lfn_protected ;in ebx
|
||||
popad
|
||||
.done:
|
||||
mov [esp+32], eax
|
||||
ret
|
||||
+107
-17
@@ -781,12 +781,21 @@ picture rb Xsize*Ysize*4 ; 32 бита
|
||||
* ebx = 6 - номер подфункции
|
||||
* ecx = указатель на строку с полным именем файла
|
||||
(например, "/hd0/1/kolibri/kolibri.img")
|
||||
* ecx = 0 - записать образ обратно на носитель, с которого была
|
||||
загружена система: на дискету или в файл образа, найденный при
|
||||
загрузке на разделе жёсткого диска
|
||||
Возвращаемое значение:
|
||||
* eax = 0 - успешно
|
||||
* иначе eax = код ошибки файловой системы
|
||||
Замечания:
|
||||
* Все папки в указанном пути должны существовать, иначе вернётся
|
||||
значение 5, "файл не найден".
|
||||
* Для ecx = 0: если рамдиск не был загружен с перезаписываемого
|
||||
носителя (например, образ заранее загружен в память
|
||||
загрузчиком), вернётся значение 2; ошибка записи на дискету
|
||||
вернёт значение 11.
|
||||
* Устройство-источник загрузки можно заранее узнать подфункцией
|
||||
13 функции 26.
|
||||
|
||||
---------------------- Константы для регистров: ----------------------
|
||||
eax - SF_SYSTEM (18)
|
||||
@@ -1654,6 +1663,27 @@ Remarks:
|
||||
eax - SF_SYSTEM_GET (26)
|
||||
ebx - SSF_ACCESS_PCI (12)
|
||||
======================================================================
|
||||
===== Функция 26, подфункция 13 - откуда загружен рамдиск. ===========
|
||||
======================================================================
|
||||
Параметры:
|
||||
* eax = 26 - номер функции
|
||||
* ebx = 13 - номер подфункции
|
||||
Возвращаемое значение:
|
||||
* eax = устройство, с которого при загрузке был прочитан образ
|
||||
рамдиска:
|
||||
* 1 = дискета
|
||||
* 2 = раздел жёсткого диска
|
||||
* 3 = образ заранее загружен в память загрузчиком
|
||||
* 4 = рамдиск создан пустым (отформатирован при загрузке)
|
||||
* 5 = рамдиска нет
|
||||
Замечания:
|
||||
* Для сохранения рамдиска на загрузочный носитель используйте
|
||||
функцию 18.6 с ecx = 0; она успешна для значений 1 и 2.
|
||||
|
||||
---------------------- Константы для регистров: ----------------------
|
||||
eax - SF_SYSTEM_GET (26)
|
||||
ebx - SSF_RD_BOOT_SOURCE (13)
|
||||
======================================================================
|
||||
================ Функция 29 - получить системную дату. ===============
|
||||
======================================================================
|
||||
Параметры:
|
||||
@@ -2507,7 +2537,7 @@ dword-значение цвета 0x00RRGGBB
|
||||
* иначе eax = TID - идентификатор потока
|
||||
|
||||
---------------------- Константы для регистров: ----------------------
|
||||
eax - SF_CREATE_THREAD (51) /
|
||||
eax - SF_THREAD_CONTROL (51) /
|
||||
ebx - SSF_CREATE_THREAD (1), SSF_GET_CURR_THREAD_SLOT (2),
|
||||
SSF_GET_THREAD_PRIORITY (3), SSF_SET_THREAD_PRIORITY (4)
|
||||
|
||||
@@ -4098,6 +4128,9 @@ Architecture Software Developer's Manual, Volume 3, Appendix B);
|
||||
* подфункция 7 - запуск программы
|
||||
* подфункция 8 - удаление файла/папки
|
||||
* подфункция 9 - создание папки
|
||||
* подфункция 10 - переименование/перемещение
|
||||
* подфункция 11 - создание симлинка
|
||||
* подфункция 12 - чтение симлинка
|
||||
Для CD-приводов в связи с аппаратными ограничениями доступны
|
||||
только подфункции 0,1,5 и 7, вызов других подфункций завершится
|
||||
ошибкой с кодом 2.
|
||||
@@ -4112,7 +4145,8 @@ Architecture Software Developer's Manual, Volume 3, Appendix B);
|
||||
[ebx] - SSF_READ_FILE (0), SSF_READ_FOLDER (1), SSF_CREATE_FILE (2),
|
||||
SSF_WRITE_FILE (3), SSF_SET_END (4), SSF_GET_INFO (5),
|
||||
SSF_SET_INFO (6), SSF_START_APP (7), SSF_DELETE (8),
|
||||
SSF_CREATE_FOLDER (9)
|
||||
SSF_CREATE_FOLDER (9), SSF_RENAME (10), SSF_CREATE_SYMLINK (11),
|
||||
SSF_READ_SYMLINK (12)
|
||||
======================================================================
|
||||
= Функция 70, подфункция 0 - чтение файла с поддержкой длинных имён. =
|
||||
======================================================================
|
||||
@@ -4464,6 +4498,62 @@ Architecture Software Developer's Manual, Volume 3, Appendix B);
|
||||
* Формирование нового пути отличается от общих правил:
|
||||
относительный путь относится к папке целевого файла (или папки),
|
||||
абсолютный путь считается от корня раздела.
|
||||
|
||||
---------------------- Константы для регистров: ----------------------
|
||||
eax - SF_FILE (70)
|
||||
[ebx] - SSF_RENAME (10)
|
||||
======================================================================
|
||||
=========== Функция 70, подфункция 11 - создание симлинка. ===========
|
||||
======================================================================
|
||||
Параметры:
|
||||
* eax = 70 - номер функции
|
||||
* ebx = указатель на информационную структуру
|
||||
Формат информационной структуры:
|
||||
* +0: dword: 11 = номер подфункции
|
||||
* +4: dword: 0 (зарезервировано)
|
||||
* +8: dword: 0 (зарезервировано)
|
||||
* +12 = +0xC: dword: 0 (зарезервировано)
|
||||
* +16 = +0x10: dword: указатель на строку с целевым путём
|
||||
* +20 = +0x14: путь, правила формирования имён указаны в общем
|
||||
описании (путь ссылки)
|
||||
Возвращаемое значение:
|
||||
* eax = 0 - успешно, иначе код ошибки файловой системы
|
||||
* ebx разрушается
|
||||
Замечания:
|
||||
* Родительская папка должна существовать.
|
||||
* Для CD функция не поддерживается (возвращает код ошибки 2).
|
||||
|
||||
---------------------- Константы для регистров: ----------------------
|
||||
eax - SF_FILE (70)
|
||||
[ebx] - SSF_CREATE_SYMLINK (11)
|
||||
======================================================================
|
||||
============ Функция 70, подфункция 12 - чтение симлинка. ============
|
||||
======================================================================
|
||||
Параметры:
|
||||
* eax = 70 - номер функции
|
||||
* ebx = указатель на информационную структуру
|
||||
Формат информационной структуры:
|
||||
* +0: dword: 12 = номер подфункции
|
||||
* +4: dword: 0 (зарезервировано)
|
||||
* +8: dword: 0 (зарезервировано)
|
||||
* +12 = +0xC: dword: размер буфера в байтах
|
||||
* +16 = +0x10: dword: указатель на буфер для целевого пути
|
||||
* +20 = +0x14: путь, правила формирования имён указаны в общем
|
||||
описании (путь ссылки)
|
||||
Возвращаемое значение:
|
||||
* eax = 0 - успешно, иначе код ошибки файловой системы
|
||||
* ebx = число байт, записанных в буфер
|
||||
Замечания:
|
||||
* Функция не следует по симлинку; она читает целевой путь,
|
||||
на который указывает симлинк.
|
||||
* Целевой путь всегда завершается нулём, в том числе при обрезании;
|
||||
записывается не более (размер буфера - 1) байт пути.
|
||||
* Значение в ebx включает завершающий 0, как в подфункции 2
|
||||
функции 30.
|
||||
|
||||
---------------------- Константы для регистров: ----------------------
|
||||
eax - SF_FILE (70)
|
||||
[ebx] - SSF_READ_SYMLINK (12)
|
||||
======================================================================
|
||||
========== Функция 71 - установить заголовок окна программы ==========
|
||||
======================================================================
|
||||
@@ -5059,8 +5149,8 @@ Architecture Software Developer's Manual, Volume 3, Appendix B);
|
||||
* eax = дескриптор фьютекса, 0 при ошибке
|
||||
|
||||
---------------------- Константы для регистров: ----------------------
|
||||
eax - SF_FUTEX (77)
|
||||
ebx - SSF_CREATE (0)
|
||||
eax - SF_POSIX (77)
|
||||
ebx - SSF_FUTEX_CREATE (0)
|
||||
======================================================================
|
||||
============= Функция 77, подфункция 1, Удалить фьютекс. =============
|
||||
======================================================================
|
||||
@@ -5074,8 +5164,8 @@ Architecture Software Developer's Manual, Volume 3, Appendix B);
|
||||
* Ядро автоматически удаляет фьютексы при завершении процесса.
|
||||
|
||||
---------------------- Константы для регистров: ----------------------
|
||||
eax - SF_FUTEX (77)
|
||||
ebx - SSF_DESTROY (1)
|
||||
eax - SF_POSIX (77)
|
||||
ebx - SSF_FUTEX_DESTROY (1)
|
||||
======================================================================
|
||||
================= Функция 77, подфункция 2, Ожидать. =================
|
||||
======================================================================
|
||||
@@ -5091,8 +5181,8 @@ Architecture Software Developer's Manual, Volume 3, Appendix B);
|
||||
-2 - контрольное значение фьютекса не соответствует
|
||||
|
||||
---------------------- Константы для регистров: ----------------------
|
||||
eax - SF_FUTEX (77)
|
||||
ebx - SSF_WAIT (2)
|
||||
eax - SF_POSIX (77)
|
||||
ebx - SSF_FUTEX_WAIT (2)
|
||||
======================================================================
|
||||
================ Функция 77, подфункция 3, Разбудить. ================
|
||||
======================================================================
|
||||
@@ -5105,8 +5195,8 @@ Architecture Software Developer's Manual, Volume 3, Appendix B);
|
||||
* eax = количество разбуженых
|
||||
|
||||
---------------------- Константы для регистров: ----------------------
|
||||
eax - SF_FUTEX (77)
|
||||
ebx - SSF_WAKE (3)
|
||||
eax - SF_POSIX (77)
|
||||
ebx - SSF_FUTEX_WAKE (3)
|
||||
======================================================================
|
||||
Замечания:
|
||||
* Подфункции 4-7 зарезервированы и сейчас возвращают -1.
|
||||
@@ -5128,8 +5218,8 @@ Architecture Software Developer's Manual, Volume 3, Appendix B);
|
||||
* Поддерживаются только pipe-дескрипторы.
|
||||
|
||||
---------------------- Константы для регистров: ----------------------
|
||||
eax - SF_FUTEX (77)
|
||||
ebx - SSF_FILE_READ (10)
|
||||
eax - SF_POSIX (77)
|
||||
ebx - SSF_FD_READ (10)
|
||||
|
||||
======================================================================
|
||||
======== Функция 77, подфункция 11, Записать из буфера в файл. =======
|
||||
@@ -5148,8 +5238,8 @@ Architecture Software Developer's Manual, Volume 3, Appendix B);
|
||||
* Поддерживаются только pipe-дескрипторы.
|
||||
|
||||
---------------------- Константы для регистров: ----------------------
|
||||
eax - SF_FUTEX (77)
|
||||
ebx - SSF_FILE_WRITE (11)
|
||||
eax - SF_POSIX (77)
|
||||
ebx - SSF_FD_WRITE (11)
|
||||
|
||||
======================================================================
|
||||
=========== Функция 77, подфункция 13, Создать новый pipe. ===========
|
||||
@@ -5170,11 +5260,11 @@ Architecture Software Developer's Manual, Volume 3, Appendix B);
|
||||
-EINVAL (-11), -EFAULT (-14), -ENFILE (-23), -EMFILE (-24)
|
||||
Примечания:
|
||||
* В случае успеха pipefd[0] является дескриптором чтения, а pipefd[1]
|
||||
- дескриптором записи.
|
||||
- дескриптором записи.
|
||||
|
||||
---------------------- Константы для регистров: ----------------------
|
||||
eax - SF_FUTEX (77)
|
||||
ebx - SSF_PIPE_CREATE (13)
|
||||
eax - SF_POSIX (77)
|
||||
ebx - SSF_FD_PIPE2 (13)
|
||||
|
||||
======================================================================
|
||||
========== Функция -1 - завершить выполнение потока/процесса =========
|
||||
|
||||
+102
-16
@@ -769,12 +769,20 @@ Parameters:
|
||||
* ebx = 6 - subfunction number
|
||||
* ecx = pointer to the full path to file
|
||||
(for example, "/hd0/1/kolibri/kolibri.img")
|
||||
* ecx = 0 - write the image back to the medium the system was
|
||||
booted from: the floppy drive, or the image file found on a hard
|
||||
disk partition at boot
|
||||
Returned value:
|
||||
* eax = 0 - success
|
||||
* else eax = error code of the file system
|
||||
Remarks:
|
||||
* All folders in the given path must exist, otherwise function
|
||||
returns value 5, "file not found".
|
||||
* For ecx = 0: if the ramdisk was not loaded from a writable
|
||||
medium (e.g. it was preloaded to memory by the loader), function
|
||||
returns value 2; a failed floppy write returns value 11.
|
||||
* The boot source device can be checked in advance with
|
||||
subfunction 13 of function 26.
|
||||
|
||||
---------------------- Constants for registers: ----------------------
|
||||
eax - SF_SYSTEM (18)
|
||||
@@ -1639,6 +1647,26 @@ Remarks:
|
||||
eax - SF_SYSTEM_GET (26)
|
||||
ebx - SSF_ACCESS_PCI (12)
|
||||
======================================================================
|
||||
== Function 26, subfunction 13 - get ramdisk boot source device. =====
|
||||
======================================================================
|
||||
Parameters:
|
||||
* eax = 26 - function number
|
||||
* ebx = 13 - subfunction number
|
||||
Returned value:
|
||||
* eax = device the ramdisk image was loaded from at boot:
|
||||
* 1 = floppy drive
|
||||
* 2 = hard disk partition
|
||||
* 3 = image preloaded to memory by the loader
|
||||
* 4 = ramdisk was created empty (formatted at boot)
|
||||
* 5 = no ramdisk
|
||||
Remarks:
|
||||
* To save the ramdisk back to the boot medium use function 18.6
|
||||
with ecx = 0; it succeeds for values 1 and 2.
|
||||
|
||||
---------------------- Constants for registers: ----------------------
|
||||
eax - SF_SYSTEM_GET (26)
|
||||
ebx - SSF_RD_BOOT_SOURCE (13)
|
||||
======================================================================
|
||||
=================== Function 29 - get system date. ===================
|
||||
======================================================================
|
||||
Parameters:
|
||||
@@ -2492,7 +2520,7 @@ Returned value:
|
||||
* otherwise eax = TID - thread identifier
|
||||
|
||||
---------------------- Constants for registers: ----------------------
|
||||
eax - SF_CREATE_THREAD (51)
|
||||
eax - SF_THREAD_CONTROL (51)
|
||||
ebx - SSF_CREATE_THREAD (1), SSF_GET_CURR_THREAD_SLOT (2),
|
||||
SSF_GET_THREAD_PRIORITY (3), SSF_SET_THREAD_PRIORITY (4)
|
||||
======================================================================
|
||||
@@ -4060,6 +4088,9 @@ Available subfunctions:
|
||||
* subfunction 7 - start application
|
||||
* subfunction 8 - delete file/folder
|
||||
* subfunction 9 - create folder
|
||||
* subfunction 10 - rename/move
|
||||
* subfunction 11 - create symlink
|
||||
* subfunction 12 - read symlink
|
||||
For CD-drives due to hardware limitations only subfunctions
|
||||
0,1,5 and 7 are available, other subfunctions return error
|
||||
with code 2.
|
||||
@@ -4073,7 +4104,8 @@ is called for corresponding device.
|
||||
[ebx] - SSF_READ_FILE (0), SSF_READ_FOLDER (1), SSF_CREATE_FILE (2),
|
||||
SSF_WRITE_FILE (3), SSF_SET_END (4), SSF_GET_INFO (5),
|
||||
SSF_SET_INFO (6), SSF_START_APP (7), SSF_DELETE (8),
|
||||
SSF_CREATE_FOLDER (9)
|
||||
SSF_CREATE_FOLDER (9), SSF_RENAME (10), SSF_CREATE_SYMLINK (11),
|
||||
SSF_READ_SYMLINK (12)
|
||||
======================================================================
|
||||
=== Function 70, subfunction 0 - read file with long names support. ==
|
||||
======================================================================
|
||||
@@ -4423,6 +4455,60 @@ Remarks:
|
||||
* New path forming differs from general rules:
|
||||
relative path relates to the target's parent folder,
|
||||
absolute path relates to the partition's root folder.
|
||||
|
||||
---------------------- Constants for registers: ----------------------
|
||||
eax - SF_FILE (70)
|
||||
[ebx] - SSF_RENAME (10)
|
||||
======================================================================
|
||||
=========== Function 70, subfunction 11 - create symlink. ============
|
||||
======================================================================
|
||||
Parameters:
|
||||
* eax = 70 - function number
|
||||
* ebx = pointer to the information structure
|
||||
Format of the information structure:
|
||||
* +0: dword: 11 = subfunction number
|
||||
* +4: dword: 0 (reserved)
|
||||
* +8: dword: 0 (reserved)
|
||||
* +12 = +0xC: dword: 0 (reserved)
|
||||
* +16 = +0x10: dword: pointer to the target path string
|
||||
* +20 = +0x14: path, general rules of names forming (link path)
|
||||
Returned value:
|
||||
* eax = 0 - success, otherwise file system error code
|
||||
* ebx destroyed
|
||||
Remarks:
|
||||
* The parent folder must already exist.
|
||||
* The function is not supported for CD (returns error code 2).
|
||||
|
||||
---------------------- Constants for registers: ----------------------
|
||||
eax - SF_FILE (70)
|
||||
[ebx] - SSF_CREATE_SYMLINK (11)
|
||||
======================================================================
|
||||
============ Function 70, subfunction 12 - read symlink. =============
|
||||
======================================================================
|
||||
Parameters:
|
||||
* eax = 70 - function number
|
||||
* ebx = pointer to the information structure
|
||||
Format of the information structure:
|
||||
* +0: dword: 12 = subfunction number
|
||||
* +4: dword: 0 (reserved)
|
||||
* +8: dword: 0 (reserved)
|
||||
* +12 = +0xC: dword: buffer size in bytes
|
||||
* +16 = +0x10: dword: pointer to buffer for target path
|
||||
* +20 = +0x14: path, general rules of names forming (link path)
|
||||
Returned value:
|
||||
* eax = 0 - success, otherwise file system error code
|
||||
* ebx = number of bytes written to the buffer
|
||||
Remarks:
|
||||
* The function does not follow the symlink; it reads the target path
|
||||
that the symlink points to.
|
||||
* The target path is always terminated with 0, even when truncated;
|
||||
at most (buffer size - 1) path bytes are written.
|
||||
* The value returned in ebx includes the terminating 0, as in
|
||||
subfunction 2 of function 30.
|
||||
|
||||
---------------------- Constants for registers: ----------------------
|
||||
eax - SF_FILE (70)
|
||||
[ebx] - SSF_READ_SYMLINK (12)
|
||||
======================================================================
|
||||
================== Function 71 - set window caption ==================
|
||||
======================================================================
|
||||
@@ -5273,8 +5359,8 @@ Returned value:
|
||||
* eax = futex handle, 0 on error
|
||||
|
||||
---------------------- Constants for registers: ----------------------
|
||||
eax - SF_FUTEX (77)
|
||||
ebx - SSF_CREATE (0)
|
||||
eax - SF_POSIX (77)
|
||||
ebx - SSF_FUTEX_CREATE (0)
|
||||
======================================================================
|
||||
========= Function 77, Subfunction 1, Destroy futex object ===========
|
||||
======================================================================
|
||||
@@ -5289,8 +5375,8 @@ Remarks:
|
||||
terminates.
|
||||
|
||||
---------------------- Constants for registers: ----------------------
|
||||
eax - SF_FUTEX (77)
|
||||
ebx - SSF_DESTROY (1)
|
||||
eax - SF_POSIX (77)
|
||||
ebx - SSF_FUTEX_DESTROY (1)
|
||||
======================================================================
|
||||
=============== Function 77, Subfunction 2, Futex wait ===============
|
||||
======================================================================
|
||||
@@ -5306,8 +5392,8 @@ Returned value:
|
||||
-2 - futex control value doesn't match
|
||||
|
||||
---------------------- Constants for registers: ----------------------
|
||||
eax - SF_FUTEX (77)
|
||||
ebx - SSF_WAIT (2)
|
||||
eax - SF_POSIX (77)
|
||||
ebx - SSF_FUTEX_WAIT (2)
|
||||
======================================================================
|
||||
=============== Function 77, Subfunction 3, Futex wake ===============
|
||||
======================================================================
|
||||
@@ -5320,8 +5406,8 @@ Returned value:
|
||||
* eax = number of waiters that were woken up
|
||||
|
||||
---------------------- Constants for registers: ----------------------
|
||||
eax - SF_FUTEX (77)
|
||||
ebx - SSF_WAKE (3)
|
||||
eax - SF_POSIX (77)
|
||||
ebx - SSF_FUTEX_WAKE (3)
|
||||
======================================================================
|
||||
Remarks:
|
||||
* Subfunctions 4-7 are reserved and currently return -1.
|
||||
@@ -5343,8 +5429,8 @@ Remarks:
|
||||
* Only pipe descriptors are supported.
|
||||
|
||||
---------------------- Constants for registers: ----------------------
|
||||
eax - SF_FUTEX (77)
|
||||
ebx - SSF_FILE_READ (10)
|
||||
eax - SF_POSIX (77)
|
||||
ebx - SSF_FD_READ (10)
|
||||
======================================================================
|
||||
=========== Function 77, Subfunction 11, Write to file. =============
|
||||
======================================================================
|
||||
@@ -5362,8 +5448,8 @@ Remarks:
|
||||
* Only pipe descriptors are supported.
|
||||
|
||||
---------------------- Constants for registers: ----------------------
|
||||
eax - SF_FUTEX (77)
|
||||
ebx - SSF_FILE_WRITE (11)
|
||||
eax - SF_POSIX (77)
|
||||
ebx - SSF_FD_WRITE (11)
|
||||
======================================================================
|
||||
========== Function 77, Subfunction 13, Create pipe. ================
|
||||
======================================================================
|
||||
@@ -5381,8 +5467,8 @@ Remarks:
|
||||
write handle.
|
||||
|
||||
---------------------- Constants for registers: ----------------------
|
||||
eax - SF_FUTEX (77)
|
||||
ebx - SSF_PIPE_CREATE (13)
|
||||
eax - SF_POSIX (77)
|
||||
ebx - SSF_FD_PIPE2 (13)
|
||||
======================================================================
|
||||
=== Function 80 - file system interface with parameter of encoding ===
|
||||
======================================================================
|
||||
|
||||
+302
-33
@@ -30,6 +30,8 @@ ext_user_functions:
|
||||
dd ext_Delete
|
||||
dd ext_CreateFolder
|
||||
dd ext_Rename
|
||||
dd ext_CreateSymlink
|
||||
dd ext_ReadSymlink
|
||||
ext_user_functions_end:
|
||||
endg
|
||||
|
||||
@@ -169,7 +171,9 @@ blocksFree_hi dd ?
|
||||
minExtraISize dw ?
|
||||
wantExtraISize dw ?
|
||||
Flags dd ?
|
||||
csum_seed_padding rb 268
|
||||
logGroupsPerFlex_padding rb 16
|
||||
logGroupsPerFlex db ?
|
||||
csum_seed_padding rb 251
|
||||
checksumSeed dd ?
|
||||
checksum_padding rb 392
|
||||
checksum dd ?
|
||||
@@ -222,10 +226,13 @@ EXT4_IMMUTABLE_FL = 10h
|
||||
EXT4_APPEND_ONLY_FL = 20h
|
||||
EXT4_NOATIME_FL = 80h
|
||||
; File System Feature Flags
|
||||
INCOMPAT_64BIT = 80h
|
||||
INCOMPAT_CSUM_SEED = 2000h
|
||||
RO_COMPAT_METADATA_CSUM = 400h
|
||||
RO_COMPAT_GDT_CSUM = 10h ; Not supported but need to check it for csum validation on RO.
|
||||
INCOMPAT_FILETYPE = 2h
|
||||
INCOMPAT_EXTENTS = 40h
|
||||
INCOMPAT_64BIT = 80h
|
||||
INCOMPAT_FLEX_BG = 200h
|
||||
INCOMPAT_CSUM_SEED = 2000h
|
||||
RO_COMPAT_METADATA_CSUM = 400h
|
||||
RO_COMPAT_GDT_CSUM = 10h ; Not supported but need to check it for csum validation on RO.
|
||||
CSUM_FLAGS = RO_COMPAT_GDT_CSUM or RO_COMPAT_METADATA_CSUM
|
||||
|
||||
EXT_CRC_POLY = 82F63B78h
|
||||
@@ -240,9 +247,9 @@ EXT_CSUM_FAKE_TAIL = 0DEh
|
||||
; 80h = 64bit
|
||||
; 200h = flexible block groups
|
||||
; 2000h = metadata_csum_seed
|
||||
INCOMPATIBLE_SUPPORT = 22C2h
|
||||
INCOMPATIBLE_SUPPORT = INCOMPAT_FILETYPE or INCOMPAT_EXTENTS or INCOMPAT_64BIT or INCOMPAT_FLEX_BG or INCOMPAT_CSUM_SEED
|
||||
; Read only support for "incompatible" features:
|
||||
INCOMPATIBLE_READ_SUPPORT = 240h
|
||||
INCOMPATIBLE_READ_SUPPORT = INCOMPAT_EXTENTS
|
||||
|
||||
; Mount policies
|
||||
MOUNT_POLICY_NOATIME = 0
|
||||
@@ -261,6 +268,7 @@ Lock MUTEX
|
||||
mountType dd ?
|
||||
descShift db ?
|
||||
descSize dd ?
|
||||
flexGroupSize dd ?
|
||||
bytesPerBlock dd ?
|
||||
sectorsPerBlock dd ?
|
||||
dwordsPerBlock dd ?
|
||||
@@ -277,7 +285,8 @@ align2 rb 800h-EXTFS.align2
|
||||
inodeBuffer INODE
|
||||
align3 rb 0A00h-EXTFS.align3
|
||||
symlink_workspace rb maxPathLength
|
||||
symlink_depth dd ?
|
||||
symlink_depth dw ?
|
||||
symlink_no_follow dw ?
|
||||
MOUNT_POLICY dd ? ; TODO: add proper mount syscall
|
||||
c_inode dd ?
|
||||
c_sz dd ?
|
||||
@@ -482,6 +491,19 @@ ext2_create_partition:
|
||||
mov [ebp+EXTFS.descSize], eax
|
||||
bsf eax, eax
|
||||
mov [ebp+EXTFS.descShift], al
|
||||
|
||||
mov eax, 1
|
||||
test [ebx+SUPERBLOCK.incompatibleFlags], INCOMPAT_FLEX_BG
|
||||
jz .no_flex_bg
|
||||
movzx ecx, [ebx+SUPERBLOCK.logGroupsPerFlex]
|
||||
cmp ecx, 31
|
||||
jbe @f
|
||||
xor ecx, ecx
|
||||
@@:
|
||||
shl eax, cl
|
||||
.no_flex_bg:
|
||||
mov [ebp+EXTFS.flexGroupSize], eax
|
||||
|
||||
mov eax, [ebx+SUPERBLOCK.inodesTotal]
|
||||
dec eax
|
||||
xor edx, edx
|
||||
@@ -759,8 +781,11 @@ extfsInodeAlloc:
|
||||
push ebx
|
||||
.test_block_group:
|
||||
push ebx
|
||||
cmp [ebp+EXTFS.flexGroupSize], 1
|
||||
ja @f
|
||||
cmp [ebx+BGDESCR.blocksFree_lo], 0
|
||||
jz .next
|
||||
@@:
|
||||
cmp [ebx+BGDESCR.inodesFree_lo], 0
|
||||
jz .next
|
||||
dec [ebx+BGDESCR.inodesFree_lo]
|
||||
@@ -840,16 +865,30 @@ extfsInodeAlloc:
|
||||
jmp .ret
|
||||
|
||||
extfsExtentAlloc:
|
||||
; in: eax = parent inode number, ecx = blocks max
|
||||
; in: edi = goal block (0 = use inode, clobbered), eax = parent inode number, ecx = blocks max
|
||||
; out: ebx = first block number, ecx = blocks allocated
|
||||
push edx esi edi ecx
|
||||
; On error, ecx is undefined, no longer guaranteed to be 0.
|
||||
push edx esi ecx
|
||||
test edi, edi
|
||||
jnz .use_goal
|
||||
dec eax
|
||||
xor edx, edx
|
||||
div [ebp+EXTFS.superblock.inodesPerGroup]
|
||||
jmp .calc_group
|
||||
.use_goal:
|
||||
mov eax, edi
|
||||
sub eax, [ebp+EXTFS.superblock.firstGroupBlock]
|
||||
xor edx, edx
|
||||
div [ebp+EXTFS.superblock.blocksPerGroup]
|
||||
.calc_group:
|
||||
mov ebx, [ebp+EXTFS.descriptorTable]
|
||||
mov cl, [ebp+EXTFS.descShift]
|
||||
shl eax, cl
|
||||
add ebx, eax
|
||||
cmp ebx, [ebp+EXTFS.descriptorTable]
|
||||
jb .oob
|
||||
cmp ebx, [ebp+EXTFS.descriptorTableEnd]
|
||||
jae .oob
|
||||
push ebx
|
||||
.test_block_group:
|
||||
push ebx
|
||||
@@ -860,7 +899,7 @@ extfsExtentAlloc:
|
||||
mov edx, eax
|
||||
mov edi, ebx
|
||||
call extfsReadBlock
|
||||
jc .fail
|
||||
jc .fail5
|
||||
mov ecx, [ebp+EXTFS.superblock.blocksPerGroup]
|
||||
shr ecx, 5
|
||||
or eax, -1
|
||||
@@ -975,9 +1014,13 @@ extfsExtentAlloc:
|
||||
add [ebp+EXTFS.inodeBuffer.sectorsUsed], eax
|
||||
xor eax, eax
|
||||
.ret:
|
||||
pop edi esi edx
|
||||
pop esi edx
|
||||
ret
|
||||
|
||||
.oob:
|
||||
movi eax, ERROR_FS_FAIL
|
||||
jmp .fail3
|
||||
|
||||
.next: ; search forward, then backward
|
||||
pop ebx
|
||||
cmp ebx, [esp]
|
||||
@@ -992,9 +1035,10 @@ extfsExtentAlloc:
|
||||
jnc .test_block_group
|
||||
movi eax, ERROR_DISK_FULL
|
||||
push eax
|
||||
.fail:
|
||||
add esp, 12
|
||||
xor ecx, ecx
|
||||
.fail5:
|
||||
pop ecx ecx
|
||||
.fail3:
|
||||
pop ecx
|
||||
stc
|
||||
jmp .ret
|
||||
|
||||
@@ -1451,7 +1495,10 @@ doublyIndirectBlockAlloc:
|
||||
xor eax, eax
|
||||
jecxz .end
|
||||
mov eax, [esp+16]
|
||||
push edi
|
||||
lea edi, [ebx-1]
|
||||
call extfsExtentAlloc
|
||||
pop edi
|
||||
jc .end
|
||||
sub [esp+12], ecx
|
||||
jmp @b
|
||||
@@ -1492,6 +1539,18 @@ extfsExtendFile:
|
||||
mov eax, [esp+4]
|
||||
test ecx, ecx
|
||||
jz .done
|
||||
|
||||
xor edi, edi
|
||||
test edx, edx
|
||||
jz .call_alloc
|
||||
push ecx
|
||||
lea ecx, [edx-1]
|
||||
call extfsGetExtent
|
||||
pop ecx
|
||||
jc .call_alloc
|
||||
mov edi, eax
|
||||
.call_alloc:
|
||||
mov eax, [esp+4]
|
||||
call extfsExtentAlloc
|
||||
jc .errDone
|
||||
sub [esp], ecx
|
||||
@@ -1617,7 +1676,10 @@ extfsExtendFile:
|
||||
mov ecx, [esp]
|
||||
mov eax, [esp+4]
|
||||
jecxz @f
|
||||
push edi
|
||||
lea edi, [ebx-1]
|
||||
call extfsExtentAlloc
|
||||
pop edi
|
||||
jc .errSave
|
||||
sub [esp], ecx
|
||||
jmp @b
|
||||
@@ -2096,6 +2158,11 @@ unlinkInode:
|
||||
pop eax
|
||||
ret
|
||||
|
||||
reachSymlink:
|
||||
; Set symlink_depth = SYMLINK_MAX_DEPTH and symlink_no_follow = 1
|
||||
mov dword [ebp+EXTFS.symlink_depth], SYMLINK_MAX_DEPTH + 10000h
|
||||
jmp @f
|
||||
|
||||
findInode:
|
||||
; in: esi -> path string in UTF-8
|
||||
; out:
|
||||
@@ -2104,7 +2171,8 @@ findInode:
|
||||
; [ebp+EXTFS.inodeBuffer] = last inode
|
||||
; ecx = parent inode number
|
||||
; CF=1 -> file not found, edi=0 -> error
|
||||
mov [ebp+EXTFS.symlink_depth], SYMLINK_MAX_DEPTH
|
||||
mov dword [ebp+EXTFS.symlink_depth], SYMLINK_MAX_DEPTH
|
||||
@@:
|
||||
push esi
|
||||
lea esi, [ebp+EXTFS.rootInodeBuffer]
|
||||
lea edi, [ebp+EXTFS.inodeBuffer]
|
||||
@@ -2201,7 +2269,13 @@ findInode:
|
||||
and eax, TYPE_MASK
|
||||
; check if symlink
|
||||
cmp eax, FLAG_SYMLINK
|
||||
jz .resolve_symlink
|
||||
jne @f
|
||||
cmp byte [esi], 0
|
||||
jnz .resolve_symlink
|
||||
cmp [ebp+EXTFS.symlink_no_follow], 0
|
||||
jnz .ret
|
||||
jmp .resolve_symlink
|
||||
@@:
|
||||
|
||||
cmp byte [esi], 0
|
||||
je .ret
|
||||
@@ -2239,14 +2313,12 @@ findInode:
|
||||
; Symlink path is in symlink_workspace. esi points to the remaining path (tail).
|
||||
; Shift tail by symlink size to prevent overwriting during insertion.
|
||||
push edi ecx eax
|
||||
|
||||
; Find tail length
|
||||
mov edi, esi
|
||||
mov ecx, -1
|
||||
xor al, al
|
||||
repnz scasb
|
||||
not ecx ; ecx = tail length including null
|
||||
|
||||
; Boundary overflow check
|
||||
mov eax, [ebx+INODE.fileSize]
|
||||
lea edi, [esi + eax]
|
||||
@@ -2254,13 +2326,11 @@ findInode:
|
||||
lea eax, [ebp+EXTFS.symlink_workspace + maxPathLength]
|
||||
cmp edi, eax
|
||||
ja .error_nested
|
||||
|
||||
; Shift
|
||||
mov eax, [ebx+INODE.fileSize]
|
||||
lea edi, [esi + ecx - 1]
|
||||
add edi, eax
|
||||
lea esi, [esi + ecx - 1]
|
||||
|
||||
std
|
||||
rep movsb
|
||||
cld
|
||||
@@ -2281,23 +2351,21 @@ findInode:
|
||||
mov edx, [ebx+INODE.fileSize]
|
||||
cmp edx, maxPathLength
|
||||
jae .error_slow
|
||||
cmp edx, [ebp+EXTFS.bytesPerBlock]
|
||||
ja .error_slow
|
||||
|
||||
push ecx edx edi
|
||||
|
||||
call extfsGetExtent
|
||||
jc .error_slow
|
||||
mov ebx, [ebp+EXTFS.tempBlockBuffer]
|
||||
call extfsReadBlock
|
||||
jc .error_slow
|
||||
|
||||
pop edi edx ecx
|
||||
|
||||
push esi
|
||||
mov esi, [ebp+EXTFS.tempBlockBuffer]
|
||||
mov ecx, edx
|
||||
rep movsb
|
||||
pop esi
|
||||
|
||||
jmp .symlink_merge
|
||||
|
||||
; The target path is short enough, it's stored in the inode's block numbers.
|
||||
@@ -2308,7 +2376,6 @@ findInode:
|
||||
|
||||
.symlink_merge:
|
||||
pop esi ; Restore the remaining path
|
||||
|
||||
cmp byte [esi], 0
|
||||
jne .symlink_copy_remaining
|
||||
mov byte [edi], 0
|
||||
@@ -2322,10 +2389,19 @@ findInode:
|
||||
mov byte [edi], '/'
|
||||
inc edi
|
||||
@@:
|
||||
lodsb
|
||||
stosb
|
||||
test al, al
|
||||
jnz @b
|
||||
push edi
|
||||
mov edi, esi
|
||||
xor ecx, ecx
|
||||
dec ecx
|
||||
xor eax, eax
|
||||
repnz scasb
|
||||
not ecx
|
||||
lea eax, [ebp+EXTFS.symlink_workspace + maxPathLength]
|
||||
sub eax, [esp]
|
||||
cmp ecx, eax
|
||||
pop edi
|
||||
ja .error
|
||||
rep movsb
|
||||
|
||||
.symlink_check_type:
|
||||
lea esi, [ebp+EXTFS.symlink_workspace]
|
||||
@@ -2336,16 +2412,13 @@ findInode:
|
||||
inc esi
|
||||
mov dword [esp], ROOT_INODE
|
||||
mov dword [esp+4], ROOT_INODE
|
||||
|
||||
push esi
|
||||
lea esi, [ebp+EXTFS.rootInodeBuffer]
|
||||
lea edi, [ebp+EXTFS.inodeBuffer]
|
||||
movzx ecx, [ebp+EXTFS.superblock.inodeSize]
|
||||
rep movsb
|
||||
pop esi
|
||||
|
||||
lea edx, [ebp+EXTFS.inodeBuffer]
|
||||
|
||||
cmp byte [esi], 0
|
||||
jz .ret
|
||||
jmp .next_path_part
|
||||
@@ -3545,6 +3618,7 @@ ext_SetFileEnd:
|
||||
call extfsTruncateFile
|
||||
pop eax
|
||||
.done:
|
||||
lea ebx, [ebp+EXTFS.inodeBuffer]
|
||||
lea eax, [ebx+INODE.mTime]
|
||||
mov edx, -1
|
||||
cmp [ebx+INODE.extraISize], 12
|
||||
@@ -3641,3 +3715,198 @@ ext_Rename:
|
||||
call ext_unlock
|
||||
pop eax ebx
|
||||
ret
|
||||
|
||||
ext_CreateSymlink:
|
||||
; Copy target path into workspace and find its length
|
||||
push esi
|
||||
mov edi, [ebx+16]
|
||||
mov esi, edi
|
||||
call strlen
|
||||
inc ecx
|
||||
cmp ecx, maxPathLength
|
||||
jae .path_too_long
|
||||
cmp ecx, [ebp+EXTFS.bytesPerBlock]
|
||||
ja .path_too_long
|
||||
lea edi, [ebp+EXTFS.symlink_workspace]
|
||||
rep movsb
|
||||
pop esi
|
||||
|
||||
call extfsWritingInit
|
||||
call reachSymlink
|
||||
mov [ebp+EXTFS.symlink_no_follow], 0
|
||||
jnc .exist
|
||||
test edi, edi
|
||||
jz .error
|
||||
|
||||
mov eax, esi
|
||||
call extfsInodeAlloc ; ebx = allocated inode number
|
||||
jc .error
|
||||
|
||||
push ebx esi edi
|
||||
lea edi, [ebp+EXTFS.inodeBuffer]
|
||||
movzx ecx, [ebp+EXTFS.superblock.inodeSize]
|
||||
xor eax, eax
|
||||
rep stosb
|
||||
lea ebx, [ebp+EXTFS.inodeBuffer]
|
||||
call initializeTimeFields
|
||||
pop edi esi edx ; edx = inode number
|
||||
|
||||
mov [ebx+INODE.accessMode], FLAG_SYMLINK or 110110110b
|
||||
mov byte [ebx+INODE.linksCount], 1
|
||||
|
||||
push esi edi
|
||||
lea edi, [ebp+EXTFS.symlink_workspace]
|
||||
mov esi, edi
|
||||
call strlen
|
||||
mov [ebx+INODE.fileSize], ecx
|
||||
pop edi esi
|
||||
|
||||
; Choose fast symlink (<=60 bytes) or slow symlink (>60 bytes)
|
||||
cmp ecx, FAST_SYMLINK_MAX_SIZE
|
||||
ja .slow_symlink
|
||||
|
||||
push esi edi
|
||||
lea esi, [ebp+EXTFS.symlink_workspace]
|
||||
lea edi, [ebx+INODE.blockNumbers]
|
||||
inc ecx
|
||||
rep movsb
|
||||
pop edi esi
|
||||
jmp .write_inode
|
||||
|
||||
.slow_symlink:
|
||||
; Allocate a data block and write the path to it
|
||||
push ebx
|
||||
mov eax, edx
|
||||
mov ecx, 1
|
||||
push edi
|
||||
xor edi, edi
|
||||
call extfsExtentAlloc ; ebx = allocated block number
|
||||
pop edi
|
||||
jc .error_alloc
|
||||
|
||||
push esi edi ebx
|
||||
lea esi, [ebp+EXTFS.symlink_workspace]
|
||||
mov edi, [ebp+EXTFS.tempBlockBuffer]
|
||||
push edi
|
||||
mov eax, esi
|
||||
call strlen
|
||||
inc ecx
|
||||
rep movsb
|
||||
pop ebx
|
||||
mov eax, [esp]
|
||||
|
||||
call extfsWriteBlock
|
||||
jc .error_write
|
||||
|
||||
pop eax edi esi ebx
|
||||
mov [ebx+INODE.blockNumbers], eax
|
||||
jmp .write_inode
|
||||
|
||||
.write_inode:
|
||||
; Write constructed inode to disk and link to parent
|
||||
mov eax, edx
|
||||
call writeInode
|
||||
jc .error
|
||||
|
||||
mov eax, esi
|
||||
mov ebx, edx
|
||||
mov esi, edi
|
||||
mov dl, DIR_SYMLINK
|
||||
call linkInode
|
||||
jc .error
|
||||
|
||||
xor eax, eax
|
||||
jmp .error
|
||||
|
||||
.exist:
|
||||
movi eax, ERROR_ACCESS_DENIED
|
||||
jmp .error
|
||||
.error_write:
|
||||
pop edx edi esi
|
||||
.error_alloc:
|
||||
pop ebx
|
||||
.error:
|
||||
push eax
|
||||
call ext_unlock
|
||||
pop eax
|
||||
ret
|
||||
.path_too_long:
|
||||
pop esi
|
||||
movi eax, ERROR_FS_FAIL
|
||||
ret
|
||||
|
||||
;----------------------------------------------------------------
|
||||
ext_ReadSymlink:
|
||||
call ext_lock
|
||||
call reachSymlink
|
||||
mov [ebp+EXTFS.symlink_no_follow], 0
|
||||
pushd 0 eax
|
||||
jc .ret
|
||||
|
||||
lea esi, [ebp+EXTFS.inodeBuffer]
|
||||
mov dword [esp], ERROR_ACCESS_DENIED
|
||||
movzx eax, [esi+INODE.accessMode]
|
||||
and eax, TYPE_MASK
|
||||
cmp eax, FLAG_SYMLINK
|
||||
jne .ret
|
||||
|
||||
mov dword [esp], ERROR_END_OF_FILE
|
||||
mov eax, [esi+INODE.fileSize]
|
||||
cmp eax, [ebp+EXTFS.bytesPerBlock]
|
||||
jbe @f
|
||||
mov eax, [ebp+EXTFS.bytesPerBlock]
|
||||
@@:
|
||||
mov ecx, [ebx+12]
|
||||
test ecx, ecx
|
||||
jz .done_copy
|
||||
dec ecx
|
||||
cmp ecx, eax
|
||||
jb @f
|
||||
mov ecx, eax
|
||||
@@:
|
||||
mov [esp+4], ecx
|
||||
mov edi, [ebx+16]
|
||||
test ecx, ecx
|
||||
jz .write_nul
|
||||
|
||||
cmp [esi+INODE.fileSize], FAST_SYMLINK_MAX_SIZE
|
||||
jbe .fast_symlink
|
||||
|
||||
.slow_symlink:
|
||||
push ecx edi
|
||||
xor ecx, ecx
|
||||
call extfsGetExtent
|
||||
jc .errorGet
|
||||
mov ebx, [ebp+EXTFS.mainBlockBuffer]
|
||||
call extfsReadBlock
|
||||
jc .errorGet
|
||||
pop edi ecx
|
||||
|
||||
push esi
|
||||
mov esi, [ebp+EXTFS.mainBlockBuffer]
|
||||
rep movsb
|
||||
pop esi
|
||||
jmp .write_nul
|
||||
|
||||
.errorGet:
|
||||
pop edi ecx
|
||||
mov dword [esp], ERROR_DEVICE
|
||||
jmp .ret
|
||||
|
||||
.fast_symlink:
|
||||
push esi
|
||||
lea esi, [esi+INODE.blockNumbers]
|
||||
rep movsb
|
||||
pop esi
|
||||
|
||||
.write_nul:
|
||||
mov byte [edi], 0
|
||||
inc dword [esp+4]
|
||||
|
||||
.done_copy:
|
||||
mov dword [esp], 0
|
||||
|
||||
.ret:
|
||||
call ext_unlock
|
||||
pop eax ebx
|
||||
ret
|
||||
@@ -182,10 +182,22 @@ proc file_system_is_operation_safe stdcall, inf_struct_ptr: dword
|
||||
|
||||
.case6:
|
||||
cmp dword [ebx], 6
|
||||
jnz .switch_none
|
||||
jnz .case11
|
||||
mov ecx, 32
|
||||
jmp .end_switch
|
||||
|
||||
.case11:
|
||||
cmp dword [ebx], 11
|
||||
jnz .case12
|
||||
stdcall is_string_userspace, edx
|
||||
jmp .ret
|
||||
|
||||
.case12:
|
||||
cmp dword [ebx], 12
|
||||
jnz .switch_none
|
||||
mov ecx, dword [ebx + 12]
|
||||
jmp .end_switch
|
||||
|
||||
.switch_none:
|
||||
cmp ecx, ecx
|
||||
jmp .ret
|
||||
|
||||
@@ -253,9 +253,10 @@ UTF16to8_string:
|
||||
|
||||
UTF16to8:
|
||||
; in:
|
||||
; eax = UTF-16 char
|
||||
; ax = UTF-16 char
|
||||
; edi -> buffer for UTF-8 char (increasing)
|
||||
; ecx = byte counter (decreasing)
|
||||
movzx eax, ax
|
||||
dec ecx
|
||||
js .ret
|
||||
cmp eax, 80h
|
||||
|
||||
+11
-1
@@ -1634,6 +1634,7 @@ sys_getsetup:
|
||||
; 10 = not used
|
||||
; 11 = get the state "lba read"
|
||||
; 12 = get the state "pci access"
|
||||
; 13 = get device the ramdisk was loaded from
|
||||
;-----------------------------------------------------------------------------
|
||||
; F.26.2 - get keyboard layout
|
||||
sub ebx, 2
|
||||
@@ -1725,12 +1726,21 @@ sys_getsetup:
|
||||
@@:
|
||||
; F.26.12 - Find out whether low-level PCI access is enabled
|
||||
dec ebx
|
||||
jnz .error
|
||||
jnz @f
|
||||
|
||||
mov eax, [pci_access_enabled]
|
||||
mov [esp + SYSCALL_STACK.eax], eax
|
||||
ret
|
||||
;--------------------------------------
|
||||
@@:
|
||||
; F.26.13 - get device the ramdisk was loaded from, RD_LOAD_FROM_*
|
||||
dec ebx
|
||||
jnz .error
|
||||
|
||||
movzx eax, byte [BOOT.rd_load_from]
|
||||
mov [esp + SYSCALL_STACK.eax], eax
|
||||
ret
|
||||
;--------------------------------------
|
||||
.error:
|
||||
or [esp + SYSCALL_STACK.eax], -1
|
||||
ret
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||
;; ;;
|
||||
;; Copyright (C) KolibriOS team 2004-2024. All rights reserved. ;;
|
||||
;; Copyright (C) KolibriOS team 2004-2026. All rights reserved. ;;
|
||||
;; Distributed under terms of the GNU General Public License ;;
|
||||
;; ;;
|
||||
;; IPv4.INC ;;
|
||||
@@ -765,9 +765,9 @@ ipv4_output_raw:
|
||||
push ebx ; push the mac
|
||||
push ax
|
||||
|
||||
inc [IPv4_packets_tx + 4*edi]
|
||||
inc [IPv4_packets_tx + edi]
|
||||
mov ax, ETHER_PROTO_IPv4
|
||||
mov ebx, [net_device_list + 4*edi]
|
||||
mov ebx, [net_device_list + edi]
|
||||
mov ecx, [esp + 6 + 4]
|
||||
add ecx, sizeof.IPv4_header
|
||||
mov edx, esp
|
||||
@@ -951,7 +951,7 @@ endp
|
||||
; edi = device number*4 ;
|
||||
; ;
|
||||
; DESTROYED: ;
|
||||
; ecx ;
|
||||
; ebx, ecx ;
|
||||
; ;
|
||||
;-----------------------------------------------------------------;
|
||||
align 4
|
||||
@@ -964,6 +964,7 @@ ipv4_route:
|
||||
cmp eax, 0xffffffff
|
||||
je .broadcast
|
||||
|
||||
; Check for on-link
|
||||
xor edi, edi
|
||||
.loop:
|
||||
mov ebx, [IPv4_address + edi]
|
||||
@@ -978,9 +979,55 @@ ipv4_route:
|
||||
cmp edi, 4*NET_DEVICES_MAX
|
||||
jb .loop
|
||||
|
||||
mov eax, [IPv4_gateway + 4] ; TODO: let user (or a user space daemon) configure default route
|
||||
; no on-link match, find first device with a gateway
|
||||
mov edi, 4 ; skip loopback device
|
||||
.loop_gw:
|
||||
cmp [IPv4_gateway + edi], 0
|
||||
jne .found_gw
|
||||
add edi, 4
|
||||
cmp edi, 4*NET_DEVICES_MAX
|
||||
jb .loop_gw
|
||||
jmp .loopback ; no gateway found, fall-back to loopback device
|
||||
|
||||
.found_gw:
|
||||
mov eax, [IPv4_gateway + edi]
|
||||
jmp .got_it
|
||||
|
||||
.broadcast:
|
||||
mov edi, 4 ; TODO: same as above
|
||||
; broadcast: we will do our best without full routing..
|
||||
|
||||
; find the first non loopback device which has an active link without IP address
|
||||
mov edi, 4 ; skip loopback device
|
||||
.bc_loop1:
|
||||
mov ebx, [net_device_list + edi]
|
||||
test ebx, ebx
|
||||
jz @f
|
||||
cmp [ebx + NET_DEVICE.link_state], 0
|
||||
je @f
|
||||
cmp [IPv4_address + edi], 0
|
||||
je .got_it
|
||||
@@:
|
||||
add edi, 4
|
||||
cmp edi, 4*NET_DEVICES_MAX
|
||||
jb .bc_loop1
|
||||
|
||||
; If there is no such device, try the one with active link and IP address
|
||||
mov edi, 4 ; skip loopback device
|
||||
.bc_loop2:
|
||||
mov ebx, [net_device_list + edi]
|
||||
test ebx, ebx
|
||||
jz @f
|
||||
cmp [ebx + NET_DEVICE.link_state], 0
|
||||
jne .got_it
|
||||
@@:
|
||||
add edi, 4
|
||||
cmp edi, 4*NET_DEVICES_MAX
|
||||
jb .bc_loop2
|
||||
; jmp .loopback ; no gateway found, fall-back to loopback device
|
||||
|
||||
.loopback:
|
||||
xor edi, edi ; nowhere to go for now.. route it to the loopback device
|
||||
|
||||
.got_it:
|
||||
DEBUGF DEBUG_NETWORK_VERBOSE, "IPv4_route: %u\n", edi
|
||||
test edx, edx
|
||||
|
||||
@@ -780,8 +780,6 @@ socket_close:
|
||||
|
||||
cmp [eax + SOCKET.Protocol], IP_PROTO_TCP
|
||||
jne .free
|
||||
test [eax + SOCKET.state], SS_ISCONNECTED
|
||||
jz @f
|
||||
test [eax + SOCKET.state], SS_ISDISCONNECTING
|
||||
jnz @f
|
||||
call tcp_disconnect
|
||||
|
||||
@@ -355,9 +355,14 @@ endl
|
||||
DEBUGF DEBUG_NETWORK_VERBOSE, "TCP_input: Got window scale option\n"
|
||||
or [ebx + TCP_SOCKET.t_flags], TF_RCVD_SCALE
|
||||
|
||||
; remember the peer's scale factor; it is applied to SND_SCALE when the
|
||||
; connection is established (together with our RCV_SCALE)
|
||||
lodsb
|
||||
mov [ebx + TCP_SOCKET.SND_SCALE], al
|
||||
;;;;; TODO
|
||||
cmp al, TCP_max_winshift
|
||||
jbe .wscale_capped
|
||||
mov al, TCP_max_winshift
|
||||
.wscale_capped:
|
||||
mov [ebx + TCP_SOCKET.requested_s_scale], al
|
||||
|
||||
@@:
|
||||
jmp .opt_loop
|
||||
|
||||
@@ -320,12 +320,12 @@ tcp_respond:
|
||||
stosb
|
||||
mov eax, SOCKET_BUFFER_SIZE
|
||||
sub eax, [esi + STREAM_SOCKET.rcv.size]
|
||||
cmp eax, TCP_max_win
|
||||
mov cl, [esi + TCP_SOCKET.RCV_SCALE]
|
||||
shr eax, cl ; scale first, then clamp to the
|
||||
cmp eax, TCP_max_win ; 16-bit field maximum
|
||||
jbe .lessthanmax
|
||||
mov eax, TCP_max_win
|
||||
.lessthanmax:
|
||||
mov cl, [esi + TCP_SOCKET.RCV_SCALE]
|
||||
shr eax, cl
|
||||
|
||||
xchg al, ah
|
||||
stosw ; window
|
||||
@@ -488,7 +488,7 @@ tcp_set_persist:
|
||||
; Start/restart persistence timer.
|
||||
|
||||
tcpt_rangeset [eax + TCP_SOCKET.timer_persist], ebx, TCP_time_pers_min, TCP_time_pers_max
|
||||
or [ebx + TCP_SOCKET.timer_flags], timer_flag_persist
|
||||
or [eax + TCP_SOCKET.timer_flags], timer_flag_persist
|
||||
pop ebx
|
||||
|
||||
cmp [eax + TCP_SOCKET.t_rxtshift], TCP_max_rxtshift
|
||||
|
||||
@@ -111,13 +111,13 @@ proc tcp_timer_640ms
|
||||
|
||||
DEBUGF DEBUG_NETWORK_VERBOSE, "socket %x: Keepalive expired\n", eax
|
||||
|
||||
cmp [eax + TCP_SOCKET.state], TCPS_ESTABLISHED
|
||||
ja .dont_kill
|
||||
cmp [eax + TCP_SOCKET.t_state], TCPS_ESTABLISHED
|
||||
jae .dont_kill
|
||||
|
||||
push eax
|
||||
push [eax + SOCKET.NextPtr]
|
||||
call tcp_disconnect
|
||||
pop eax
|
||||
jmp .loop
|
||||
jmp .check_only
|
||||
|
||||
.dont_kill:
|
||||
test [eax + SOCKET.options], SO_KEEPALIVE
|
||||
|
||||
+15
-9
@@ -84,6 +84,12 @@ SF_SCREEN_PUT_IMAGE=25
|
||||
SF_SYSTEM_GET=26
|
||||
SSF_TIME_COUNT=9
|
||||
SSF_TIME_COUNT_PRO=10
|
||||
SSF_RD_BOOT_SOURCE=13
|
||||
RD_LOAD_FROM_FLOPPY=1
|
||||
RD_LOAD_FROM_HD=2
|
||||
RD_LOAD_FROM_MEMORY=3
|
||||
RD_LOAD_FROM_FORMAT=4
|
||||
RD_LOAD_FROM_NONE=5
|
||||
SF_GET_SYS_DATE=29
|
||||
SF_CURRENT_FOLDER=30
|
||||
SSF_SET_CF=1
|
||||
@@ -125,7 +131,7 @@ SF_STYLE_SETTINGS=48
|
||||
SSF_SET_FONT_SIZE=12
|
||||
SF_APM=49
|
||||
SF_SET_WINDOW_SHAPE=50
|
||||
SF_CREATE_THREAD=51
|
||||
SF_THREAD_CONTROL=51
|
||||
SSF_CREATE_THREAD=1
|
||||
SSF_GET_CURR_THREAD_SLOT=2
|
||||
SSF_GET_THREAD_PRIORITY=3
|
||||
@@ -281,14 +287,14 @@ SF_NETWORK_PROTOCOL=76
|
||||
SSF_ARP_DEL_ENTRY=50005h
|
||||
SSF_ARP_SEND_ANNOUNCE=50006h
|
||||
SSF_ARP_CONFLICTS_COUNT=50007h
|
||||
SF_FUTEX=77
|
||||
SSF_CREATE=0
|
||||
SSF_DESTROY=1
|
||||
SSF_WAIT=2
|
||||
SSF_WAKE=3
|
||||
SSF_FILE_READ=10
|
||||
SSF_FILE_WRITE=11
|
||||
SSF_PIPE_CREATE=13
|
||||
SF_POSIX=77
|
||||
SSF_FUTEX_CREATE=0
|
||||
SSF_FUTEX_DESTROY=1
|
||||
SSF_FUTEX_WAIT=2
|
||||
SSF_FUTEX_WAKE=3
|
||||
SSF_FD_READ=10
|
||||
SSF_FD_WRITE=11
|
||||
SSF_FD_PIPE2=13
|
||||
|
||||
; File system errors:
|
||||
FSERR_SUCCESS=0
|
||||
|
||||
@@ -1111,7 +1111,7 @@ end if
|
||||
mov dword [edx+8],ebx
|
||||
mov dword [edx+4],ecx
|
||||
mov dword [edx],Kolibri_ThreadFinish
|
||||
mov eax,SF_CREATE_THREAD
|
||||
mov eax,SF_THREAD_CONTROL
|
||||
mov ebx,1
|
||||
mov ecx,@Kolibri@ThreadMain$qpvt1
|
||||
int 0x40
|
||||
|
||||
Submodule
+1
Submodule programs/cmm added at 4678e1605d.
@@ -1,6 +0,0 @@
|
||||
if tup.getconfig("NO_CMM") ~= "" then return end
|
||||
if tup.getconfig("LANG") == "ru_RU"
|
||||
then C_LANG = "LANG_RUS"
|
||||
else C_LANG = "LANG_ENG" -- this includes default case without config
|
||||
end
|
||||
tup.rule("app_plus.c", "c-- /D=$(C_LANG) /OPATH=%o %f" .. tup.getconfig("KPACK_CMD"), "app_plus.com")
|
||||
@@ -1,18 +0,0 @@
|
||||
|
||||
struct sysdir
|
||||
{
|
||||
char name[64];
|
||||
char path[64];
|
||||
} sysdir;
|
||||
|
||||
|
||||
:int SetAdditionalSystemDirectory(dword tName, tPath)
|
||||
{
|
||||
int i;
|
||||
strcpy(#sysdir.name, tName);
|
||||
strcpy(#sysdir.path, tPath);
|
||||
$mov eax, 30
|
||||
$mov ebx, 3
|
||||
ECX = #sysdir;
|
||||
$int 0x40
|
||||
}
|
||||
@@ -1,162 +0,0 @@
|
||||
#define MEMSIZE 1024*60
|
||||
|
||||
#include "..\lib\gui.h"
|
||||
#include "..\lib\obj\proc_lib.h"
|
||||
#include "..\lib\patterns\simple_open_dialog.h"
|
||||
#include "..\lib\patterns\restart_process.h"
|
||||
#include "added_sysdir.c"
|
||||
|
||||
//===================================================//
|
||||
// //
|
||||
// DATA //
|
||||
// //
|
||||
//===================================================//
|
||||
|
||||
#define WINW 570
|
||||
#define WINH 300
|
||||
#define CONX 28 //content X pos
|
||||
#define CONY 25 //content Y pos
|
||||
|
||||
char default_dir[] = "/sys";
|
||||
od_filter filter2;
|
||||
|
||||
#define BTN_MANUAL_SEARCH 10
|
||||
#define BTN_OPEN_ANYWAY 11
|
||||
|
||||
#define APP_PLUS_INI_PATH "/sys/settings/app_plus.ini"
|
||||
|
||||
//===================================================//
|
||||
// //
|
||||
// TRANSLATIONS //
|
||||
// //
|
||||
//===================================================//
|
||||
|
||||
#ifdef LANG_RUS
|
||||
?define WINDOW_TITLE_TEXT "Внимание!"
|
||||
?define CONTENT_HEADER_TEXT "KolibriOS работает в режиме дискеты"
|
||||
?define DESCRIPTION_TEXT "Многие приложения сейчас недоступны.
|
||||
|
||||
Причина в том, что не смонтирован дополнительный системный
|
||||
каталог. Но вы можете найти и задать его вручную. Его название
|
||||
'kolibrios'. Вы также можете загрузить latest-dirstr.7z через
|
||||
WebView и найти его внутри."
|
||||
?define MANUALLY_BUTTON_TEXT "Указать папку /kolibrios/..."
|
||||
?define OPEN_ANYWAY_BUTTON_TEXT "Запустить APP+ (некоторые программы будут недоступны)"
|
||||
#else
|
||||
?define WINDOW_TITLE_TEXT "Warning!"
|
||||
?define CONTENT_HEADER_TEXT "KolibriOS is running in floppy mode"
|
||||
?define DESCRIPTION_TEXT "A lot of apps aren't available.
|
||||
|
||||
The reason is that additional system directory is not mounted.
|
||||
But you can find and set it manually. Its name is 'kolibrios'.
|
||||
You can also download latest-dirstr.7z via WebView and find
|
||||
it inside."
|
||||
?define MANUALLY_BUTTON_TEXT "Choose /kolibrios/ folder..."
|
||||
?define OPEN_ANYWAY_BUTTON_TEXT "Open APP+ anyway (some programs won't be available)"
|
||||
#endif
|
||||
|
||||
//===================================================//
|
||||
// //
|
||||
// CODE //
|
||||
// //
|
||||
//===================================================//
|
||||
|
||||
void main()
|
||||
{
|
||||
if (param) {
|
||||
SetAdditionalSystemDirectory("kolibrios", #param+1);
|
||||
ExitProcess();
|
||||
}
|
||||
|
||||
WaitAutosearch();
|
||||
CheckKosMounted();
|
||||
|
||||
o_dialog.type = 2;
|
||||
#define NO_DLL_INIT
|
||||
load_dll(Proc_lib, #OpenDialog_init,0);
|
||||
OpenDialog_init stdcall (#o_dialog);
|
||||
active_button_id = BTN_MANUAL_SEARCH;
|
||||
|
||||
loop() switch(@WaitEvent())
|
||||
{
|
||||
case evButton:
|
||||
EventButton(GetButtonID());
|
||||
break;
|
||||
case evKey:
|
||||
@GetKeyScancode();
|
||||
if (AL == SCAN_CODE_ENTER) {
|
||||
EventButton(active_button_id);
|
||||
} else if (AL == SCAN_CODE_TAB) {
|
||||
active_button_id = active_button_id-10^1 + 10;
|
||||
DrawButtons();
|
||||
}
|
||||
break;
|
||||
|
||||
case evReDraw:
|
||||
draw_window();
|
||||
}
|
||||
}
|
||||
|
||||
void draw_window()
|
||||
{
|
||||
sc.get();
|
||||
DefineAndDrawWindow(screen.w-WINW/2, 100, WINW, WINH+skin_h, 0x34, sc.work, WINDOW_TITLE_TEXT,0);
|
||||
draw_icon_16w(CONX+2, CONY-3, 5);
|
||||
WriteTextB(CONX+27+2,CONY+2,0x81,MixColors(sc.work, 0xB92234,220),CONTENT_HEADER_TEXT);
|
||||
WriteTextB(CONX+27,CONY,0x81,0xB92234,CONTENT_HEADER_TEXT);
|
||||
WriteTextLines(CONX,CONY+42,0x90,sc.work_text,DESCRIPTION_TEXT,20);
|
||||
DrawButtons();
|
||||
}
|
||||
|
||||
void DrawButtons()
|
||||
{
|
||||
DrawStandartCaptButton(CONX, WINH-CONY-58, BTN_MANUAL_SEARCH, MANUALLY_BUTTON_TEXT);
|
||||
DrawStandartCaptButton(CONX, WINH-CONY-22, BTN_OPEN_ANYWAY, OPEN_ANYWAY_BUTTON_TEXT);
|
||||
}
|
||||
|
||||
void CheckKosMounted()
|
||||
{
|
||||
if (dir_exists("/kolibrios"))
|
||||
{
|
||||
if (file_exists(APP_PLUS_INI_PATH)) EventOpenApp();
|
||||
ExitProcess();
|
||||
}
|
||||
}
|
||||
|
||||
void WaitAutosearch()
|
||||
{
|
||||
while (CheckProcessExists("SEARCHAP")) pause(2);
|
||||
}
|
||||
|
||||
//===================================================//
|
||||
// //
|
||||
// EVENTS //
|
||||
// //
|
||||
//===================================================//
|
||||
|
||||
void EventManualSearch()
|
||||
{
|
||||
OpenDialog_start stdcall (#o_dialog);
|
||||
if (o_dialog.status) SetAdditionalSystemDirectory("kolibrios", #openfile_path+1);
|
||||
pause(3);
|
||||
CheckKosMounted();
|
||||
}
|
||||
|
||||
void EventOpenApp()
|
||||
{
|
||||
if (RunProgram("/sys/syspanel", APP_PLUS_INI_PATH) < 0) {
|
||||
notify("'App+ cannot start because\n/sys/syspanel does not exist' -E");
|
||||
}
|
||||
}
|
||||
|
||||
void EventButton(dword id)
|
||||
{
|
||||
if (id==CLOSE_BTN) ExitProcess();
|
||||
else if (id==BTN_MANUAL_SEARCH) EventManualSearch();
|
||||
else if (id==BTN_OPEN_ANYWAY) {
|
||||
EventOpenApp();
|
||||
ExitProcess();
|
||||
}
|
||||
}
|
||||
|
||||
stop:
|
||||
@@ -1,6 +0,0 @@
|
||||
@c-- /D=LANG_ENG app_plus.c
|
||||
@del *.
|
||||
@rename *.com *.
|
||||
@del warning.txt
|
||||
@pause
|
||||
|
||||
@@ -1,5 +0,0 @@
|
||||
@c-- /D=LANG_RUS app_plus.c
|
||||
@del *.
|
||||
@rename *.com *.
|
||||
@del warning.txt
|
||||
@pause
|
||||
@@ -1,6 +0,0 @@
|
||||
if tup.getconfig("NO_CMM") ~= "" then return end
|
||||
if tup.getconfig("LANG") == "ru_RU"
|
||||
then C_LANG = "LANG_RUS"
|
||||
else C_LANG = "LANG_ENG" -- this includes default case without config
|
||||
end
|
||||
tup.rule("appearance.c", "c-- /D=AUTOBUILD /D=$(C_LANG) /OPATH=%o %f" .. tup.getconfig("KPACK_CMD"), "appearance.com")
|
||||
@@ -1,472 +0,0 @@
|
||||
//11.03.12 - start!
|
||||
|
||||
#define MEMSIZE 1024*70
|
||||
#include "../lib/mem.h"
|
||||
#include "../lib/strings.h"
|
||||
#include "../lib/io.h"
|
||||
#include "../lib/list_box.h"
|
||||
#include "../lib/gui.h"
|
||||
|
||||
#include "../lib/obj/box_lib.h"
|
||||
#include "../lib/obj/proc_lib.h"
|
||||
#include "../lib/obj/libini.h"
|
||||
|
||||
#include "../lib/patterns/select_list.h"
|
||||
#include "../lib/patterns/simple_open_dialog.h"
|
||||
#include "../lib/patterns/restart_process.h"
|
||||
|
||||
dword fmas;
|
||||
|
||||
#include "ui_elements_preview.h"
|
||||
#include "const.h"
|
||||
|
||||
//===================================================//
|
||||
// //
|
||||
// DATA //
|
||||
// //
|
||||
//===================================================//
|
||||
|
||||
int active_skin=-1, active_wallpaper=-1, active_screensaver=-1;
|
||||
|
||||
checkbox optionbox_stretch = { T_CHECKBOX_STRETCH, false };
|
||||
checkbox optionbox_tiled = { T_CHECKBOX_TILED, false };
|
||||
checkbox optionbox_auto = { T_CHECKBOX_AUTO, true };
|
||||
|
||||
char ss_available[200];
|
||||
|
||||
collection list;
|
||||
|
||||
|
||||
//===================================================//
|
||||
// //
|
||||
// CODE //
|
||||
// //
|
||||
//===================================================//
|
||||
|
||||
void main()
|
||||
{
|
||||
int id, i;
|
||||
load_dll(boxlib, #box_lib_init,0);
|
||||
load_dll(libini, #lib_init,1);
|
||||
load_dll(Proc_lib, #OpenDialog_init,0);
|
||||
OpenDialog_init stdcall (#o_dialog);
|
||||
|
||||
GetIniSettings();
|
||||
|
||||
tabs.add(#t_skins, #EventTabSkinsClick);
|
||||
tabs.add(#t_wallpapers, #EventTabWallpappersClick);
|
||||
tabs.add(#t_screensaver, #EventTabScreensaverClick);
|
||||
tabs.draw_active_tab();
|
||||
|
||||
SetEventMask(EVM_REDRAW + EVM_KEY + EVM_BUTTON + EVM_MOUSE + EVM_MOUSE_FILTER);
|
||||
loop() switch(WaitEvent())
|
||||
{
|
||||
case evMouse:
|
||||
SelectList_ProcessMouse();
|
||||
if (tabs.active_tab == TAB_SCREENSAVERS) {
|
||||
scrollbar_h_mouse stdcall (#ss_timeout);
|
||||
if (ss_timeout.redraw) {
|
||||
draw_timeout();
|
||||
ss_timeout.redraw = false; //reset flag
|
||||
}
|
||||
}
|
||||
break;
|
||||
|
||||
case evButton:
|
||||
id=GetButtonID();
|
||||
if (id==1) EventExit();
|
||||
tabs.click(id);
|
||||
if (tabs.active_tab == TAB_SKINS) {
|
||||
checkbox1.click(id);
|
||||
spinbox1.click(id);
|
||||
}
|
||||
if (tabs.active_tab == TAB_WALLPAPERS) {
|
||||
if (id==BTN_SELECT_WALLP_FOLDER) EventSelectWallpFolder();
|
||||
if (optionbox_stretch.click(id)) EventSetWallpMode(1,0,0);
|
||||
if (optionbox_tiled.click(id)) EventSetWallpMode(0,1,0);
|
||||
if (optionbox_auto.click(id)) EventSetWallpMode(0,0,1);
|
||||
}
|
||||
if (tabs.active_tab == TAB_SCREENSAVERS) {
|
||||
if (id==BTN_TEST_SCREENSAVER) EventOpenFile();
|
||||
if (id==BTN_SET_SCREENSAVER) EventSetSs();
|
||||
}
|
||||
break;
|
||||
|
||||
case evKey:
|
||||
GetKeys();
|
||||
if (select_list.ProcessKey(key_scancode)) { EventApply(); break; }
|
||||
if (key_scancode==SCAN_CODE_ENTER) { EventOpenFile(); break; }
|
||||
if (key_scancode==SCAN_CODE_DEL) { EventDeleteFile(); break; }
|
||||
if (key_scancode==SCAN_CODE_TAB) {
|
||||
id = tabs.active_tab+1;
|
||||
if(id==3)id=0;
|
||||
tabs.click(id + tabs.base_id);
|
||||
break;
|
||||
}
|
||||
for (i=select_list.cur_y+1; i<select_list.count; i++)
|
||||
{
|
||||
id = list.get(i) + strrchr(list.get(i), '/');
|
||||
if (ESBYTE[id]==key_ascii) || (ESBYTE[id]==key_ascii-32)
|
||||
{
|
||||
select_list.cur_y = i - 1;
|
||||
select_list.KeyDown();
|
||||
EventApply();
|
||||
break;
|
||||
}
|
||||
}
|
||||
break;
|
||||
|
||||
case evReDraw:
|
||||
draw_window();
|
||||
}
|
||||
}
|
||||
|
||||
void draw_window()
|
||||
{
|
||||
sc.get();
|
||||
DefineAndDrawWindow(screen.w-WIN_W-9/2,80,WIN_W+9,WIN_H+4+skin_h,0x74,sc.work,WINDOW_HEADER,0);
|
||||
|
||||
DrawBar(0, 0, WIN_W, PANEL_H-2, sc.work); //top
|
||||
DrawBar(0, PANEL_H-2, LP-2, WIN_H-PANEL_H-LP+4, EDX); //left
|
||||
DrawBar(LIST_W+LP+20, PANEL_H-2, WIN_W-LIST_W-26, WIN_H-PANEL_H-LP+4, EDX); //right
|
||||
DrawBar(0, WIN_H-LP+2, WIN_W, LP-2, EDX); //bottom
|
||||
|
||||
tabs.draw();
|
||||
draw_icon_16w(tabs.x + TAB_P, LP+5, 17);
|
||||
draw_icon_16w(sizeof(t_skins)-1*8 + TAB_P + TAB_P + tabs.x, LP+5, 6);
|
||||
draw_icon_16w(sizeof(t_wallpapers)+sizeof(t_skins)-2*8 + TAB_P + TAB_P + TAB_P + tabs.x, LP+5, 61);
|
||||
|
||||
if (tabs.active_tab == TAB_SKINS)
|
||||
{
|
||||
DrawFrame(RIGHTx, PANEL_H+5, RIGHTw, RIGHTh, T_UI_PREVIEW);
|
||||
DrawUiElementsPreview(RIGHTx+20, PANEL_H+5, RIGHTh);
|
||||
}
|
||||
if (tabs.active_tab == TAB_WALLPAPERS)
|
||||
{
|
||||
DrawFrame(RIGHTx, PANEL_H+5, 180, 105, T_PICTURE_MODE);
|
||||
optionbox_stretch.draw(RIGHTx+14, PANEL_H+25);
|
||||
optionbox_tiled.draw(RIGHTx+14, PANEL_H+52);
|
||||
optionbox_auto.draw(RIGHTx+14, PANEL_H+79);
|
||||
DrawStandartCaptButton(RIGHTx, PANEL_H+130, BTN_SELECT_WALLP_FOLDER, T_SELECT_FOLDER);
|
||||
}
|
||||
if (tabs.active_tab == TAB_SCREENSAVERS)
|
||||
{
|
||||
draw_timeout();
|
||||
ss_timeout.line_col = sc.line;
|
||||
ss_timeout.frnt_col = sc.work;
|
||||
scrollbar_h_draw stdcall (#ss_timeout);
|
||||
DrawRectangle(RIGHTx, RIGHTy+25, RIGHTw-20, 15, sc.line);
|
||||
ESI = DrawStandartCaptButton(RIGHTx, PANEL_H + 65, BTN_TEST_SCREENSAVER, T_SS_PREVIEW);
|
||||
DrawStandartCaptButton(RIGHTx+ESI, PANEL_H + 65, BTN_SET_SCREENSAVER, T_SS_SET);
|
||||
}
|
||||
|
||||
$push select_list.cur_y
|
||||
SelectList_Init(
|
||||
LP,
|
||||
PANEL_H,
|
||||
LIST_W,
|
||||
WIN_H - LP - PANEL_H
|
||||
);
|
||||
$pop select_list.cur_y
|
||||
|
||||
SelectList_Draw();
|
||||
SelectList_DrawBorder();
|
||||
}
|
||||
|
||||
void draw_timeout()
|
||||
{
|
||||
miniprintf(#param, T_SS_TIMEOUT, ss_timeout.position+1);
|
||||
WriteTextWithBg(RIGHTx, PANEL_H, 0xD0, sc.work_text, #param, sc.work);
|
||||
}
|
||||
|
||||
void add_filesnames_into_the_list()
|
||||
{
|
||||
int j;
|
||||
for (j=0; j<select_list.count; j++) {
|
||||
miniprintf(#param,"%s/",#folder_path);
|
||||
strcat(#param, io.dir.position(ESDWORD[j*4+fmas]));
|
||||
list.add(#param);
|
||||
}
|
||||
}
|
||||
|
||||
void Open_Dir()
|
||||
{
|
||||
int j;
|
||||
dword ext;
|
||||
select_list.ClearList();
|
||||
|
||||
if (io.dir.buffer) free(io.dir.buffer);
|
||||
io.dir.load(#folder_path,DIR_ONLYREAL);
|
||||
|
||||
if (fmas) free(fmas);
|
||||
fmas = malloc(io.dir.count * 4);
|
||||
|
||||
for (j=0; j<io.dir.count; j++)
|
||||
{
|
||||
strncpy(#param, io.dir.position(j), PATHLEN);
|
||||
strlwr(#param);
|
||||
ext = #param + strrchr(#param,'.');
|
||||
if (tabs.active_tab==TAB_SKINS) {
|
||||
if (!streq(ext,"skn")) continue;
|
||||
}
|
||||
if (tabs.active_tab==TAB_WALLPAPERS) {
|
||||
if (!streq(ext,"png")) && (!streq(ext,"jpg"))
|
||||
&& (!streq(ext,"jpeg")) && (!streq(ext,"bmp"))
|
||||
&& (!streq(ext,"gif")) continue;
|
||||
}
|
||||
ESDWORD[select_list.count*4 + fmas] = j;
|
||||
select_list.count++;
|
||||
}
|
||||
sort_by_name(0, select_list.count-1);
|
||||
|
||||
list.drop();
|
||||
//save current item for tab change
|
||||
//add default item
|
||||
if(tabs.active_tab == TAB_SKINS)
|
||||
{
|
||||
select_list.count++;
|
||||
list.add(#default_skin);
|
||||
add_filesnames_into_the_list();
|
||||
if (active_skin==-1) && (ESBYTE[#previous_skin])
|
||||
{
|
||||
for (j=0; j<select_list.count; j++) {
|
||||
if (streq(list.get(j), #previous_skin)) {
|
||||
active_skin = j;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
select_list.cur_y = active_skin;
|
||||
} else {
|
||||
select_list.count++;
|
||||
list.add(#default_wallp);
|
||||
add_filesnames_into_the_list();
|
||||
if (active_wallpaper==-1) && (ESBYTE[#previous_wallp]=='\\')
|
||||
{
|
||||
for (j=0; j<select_list.count; j++) {
|
||||
if (streq(list.get(j), #previous_wallp+4)) {
|
||||
active_wallpaper = j;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
select_list.cur_y = active_wallpaper;
|
||||
}
|
||||
|
||||
if (!select_list.count) notify(T_NO_FILES);
|
||||
if (select_list.cur_y>SL_VISIBLE) {
|
||||
select_list.first = -SL_VISIBLE/2 + select_list.cur_y;
|
||||
}
|
||||
select_list.CheckDoesValuesOkey();
|
||||
if (LIST_W) draw_window();
|
||||
}
|
||||
|
||||
void SelectList_DrawLine(dword i)
|
||||
{
|
||||
int draw_y = i*SELECT_LIST_ITEMH+PANEL_H;
|
||||
int i_abs = select_list.first + i;
|
||||
dword text_color = 0xFFFfff;
|
||||
dword bg_color = 0x000000;
|
||||
char filename_buf[PATHLEN];
|
||||
char* filename = #filename_buf;
|
||||
|
||||
strcpy(filename, list.get(i_abs));
|
||||
if (EAX = strrchr(filename,'/')) filename += EAX;
|
||||
if (ESBYTE[filename]=='T') && (ESBYTE[filename+1]=='_') filename+=2;
|
||||
EAX = math.min(strrchr(filename,'.')-1, LIST_W - 24 / 8);
|
||||
if(EAX) ESBYTE[filename+EAX] = '\0';
|
||||
|
||||
//save current item for tab change
|
||||
switch(tabs.active_tab) {
|
||||
CASE TAB_SKINS:
|
||||
active_skin = select_list.cur_y;
|
||||
if (!i_abs) filename = T_DEFAULT;
|
||||
BREAK;
|
||||
CASE TAB_WALLPAPERS:
|
||||
active_wallpaper = select_list.cur_y;
|
||||
if (!i_abs) filename = T_DEFAULT;
|
||||
BREAK;
|
||||
CASE TAB_SCREENSAVERS:
|
||||
active_screensaver = select_list.cur_y;
|
||||
if (!i_abs) filename = T_NO_SS;
|
||||
}
|
||||
|
||||
if (select_list.cur_y == i_abs) {
|
||||
text_color = sc.button;
|
||||
bg_color = sc.button_text;
|
||||
}
|
||||
DrawBar(select_list.x, draw_y, LIST_W, SELECT_LIST_ITEMH, text_color);
|
||||
WriteText(select_list.x+12,draw_y+select_list.text_y,select_list.font_type,bg_color, filename);
|
||||
}
|
||||
|
||||
|
||||
|
||||
void GetIniSettings()
|
||||
{
|
||||
ini.section = "style";
|
||||
ini.GetString("default_skin", #default_skin, PATHLEN, 0);
|
||||
ini.GetString("default_wallp", #default_wallp, PATHLEN, 0);
|
||||
ini.GetString("skin", #previous_skin, PATHLEN, 0);
|
||||
ini.GetString("bg_param", #previous_wallp, PATHLEN, 0);
|
||||
|
||||
ini.section = "screensaver";
|
||||
ss_timeout.position = ini.GetInt("timeout", 10) - 1;
|
||||
ini.GetString("available", #ss_available, sizeof(ss_available), 0);
|
||||
ini.GetString("program", #previous_ss, PATHLEN, 0);
|
||||
}
|
||||
|
||||
//===================================================//
|
||||
// //
|
||||
// EVENTS //
|
||||
// //
|
||||
//===================================================//
|
||||
|
||||
void EventTabSkinsClick()
|
||||
{
|
||||
miniprintf(#folder_path, "%s/res/skins", get_real_kolibrios_path());
|
||||
Open_Dir();
|
||||
}
|
||||
|
||||
void EventTabWallpappersClick()
|
||||
{
|
||||
if (opendir_path) {
|
||||
strcpy(#folder_path, #opendir_path);
|
||||
} else {
|
||||
miniprintf(#folder_path, "%s/res/wallpapers", get_real_kolibrios_path());
|
||||
}
|
||||
Open_Dir();
|
||||
}
|
||||
|
||||
void EventTabScreensaverClick()
|
||||
{
|
||||
dword j;
|
||||
char ssmas[sizeof(ss_available)];
|
||||
list.drop();
|
||||
select_list.ClearList();
|
||||
|
||||
select_list.count++;
|
||||
list.add("");
|
||||
|
||||
strcpy(#ssmas, #ss_available);
|
||||
do {
|
||||
j = strrchr(#ssmas, '|');
|
||||
if (ssmas[j]=='/') {
|
||||
strcpy(#param, #ssmas + j);
|
||||
} else {
|
||||
miniprintf(#param, "/sys/%s", #ssmas + j);
|
||||
}
|
||||
list.add(#param);
|
||||
ESBYTE[#ssmas + j - 1] = '\0';
|
||||
select_list.count++;
|
||||
} while (j);
|
||||
|
||||
if (active_screensaver == -1) && (ESBYTE[#previous_ss]) {
|
||||
for (j=0; j<select_list.count; j++) {
|
||||
if (strstr(list.get(j), #previous_ss)) active_screensaver = j;
|
||||
}
|
||||
}
|
||||
select_list.cur_y = active_screensaver;
|
||||
|
||||
if (LIST_W) draw_window();
|
||||
}
|
||||
|
||||
void EventDeleteFile()
|
||||
{
|
||||
if (select_list.cur_y) DeleteFile(list.get(select_list.cur_y)); //no not delete default
|
||||
Open_Dir();
|
||||
EventApply();
|
||||
}
|
||||
|
||||
void EventSelectWallpFolder()
|
||||
{
|
||||
o_dialog.type = 2; //select folder
|
||||
OpenDialog_start stdcall (#o_dialog);
|
||||
if (o_dialog.status) EventTabWallpappersClick();
|
||||
}
|
||||
|
||||
void EventSetWallpMode(dword _stretch, _titled, _auto)
|
||||
{
|
||||
optionbox_stretch.checked = _stretch;
|
||||
optionbox_tiled.checked = _titled;
|
||||
optionbox_auto.checked = _auto;
|
||||
optionbox_tiled.redraw();
|
||||
optionbox_stretch.redraw();
|
||||
optionbox_auto.redraw();
|
||||
EventApply();
|
||||
}
|
||||
|
||||
void EventApply()
|
||||
{
|
||||
char kivparam[4096+10];
|
||||
dword file_name = list.get(select_list.cur_y);
|
||||
if (tabs.active_tab==TAB_SKINS)
|
||||
{
|
||||
strcpy(#cur_skin_path, list.get(select_list.cur_y));
|
||||
SetSystemSkin(#cur_skin_path);
|
||||
MoveSize(OLD, OLD, OLD, WIN_H+4+GetSkinHeight());
|
||||
}
|
||||
if (tabs.active_tab==TAB_WALLPAPERS)
|
||||
{
|
||||
SelectList_Draw();
|
||||
miniprintf(#kivparam, "\\S__%s", list.get(select_list.cur_y));
|
||||
if (optionbox_tiled.checked) || (!select_list.cur_y) kivparam[1]='T';
|
||||
if (optionbox_auto.checked) {
|
||||
file_name += strrchr(file_name, '/');
|
||||
if (ESBYTE[file_name] == 'T') && (ESBYTE[file_name+1] == '_') {
|
||||
kivparam[1]='T';
|
||||
}
|
||||
}
|
||||
RunProgram("/sys/media/kiv", #kivparam);
|
||||
}
|
||||
if (tabs.active_tab==TAB_SCREENSAVERS)
|
||||
{
|
||||
SelectList_Draw();
|
||||
}
|
||||
}
|
||||
|
||||
void EventOpenFile()
|
||||
{
|
||||
switch (tabs.active_tab) {
|
||||
case TAB_SKINS:
|
||||
RunProgram("/sys/skincfg", list.get(select_list.cur_y));
|
||||
break;
|
||||
case TAB_WALLPAPERS:
|
||||
RunProgram("/sys/media/kiv", list.get(select_list.cur_y));
|
||||
break;
|
||||
case TAB_SCREENSAVERS:
|
||||
if(select_list.cur_y) {
|
||||
KillProcessByName("@ss", MULTIPLE);
|
||||
RunProgram(list.get(select_list.cur_y), "@ss");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void EventExit()
|
||||
{
|
||||
if (get_real_kolibrios_path()) && (ESBYTE[#cur_skin_path]) {
|
||||
ini.section = "style";
|
||||
ini.SetString("skin", #cur_skin_path, strlen(#cur_skin_path));
|
||||
}
|
||||
ExitProcess();
|
||||
}
|
||||
|
||||
void EventSetSs()
|
||||
{
|
||||
dword cur_ss = list.get(select_list.cur_y);
|
||||
ini.section = "screensaver";
|
||||
ini.SetString("program", cur_ss, strlen(cur_ss));
|
||||
ini.SetInt("timeout", ss_timeout.position+1);
|
||||
RestartProcessByName("/sys/@ss", MULTIPLE);
|
||||
}
|
||||
|
||||
stop:
|
||||
|
||||
char folder_path[PATHLEN];
|
||||
char cur_skin_path[PATHLEN];
|
||||
|
||||
char default_skin[PATHLEN];
|
||||
char default_wallp[PATHLEN];
|
||||
|
||||
char previous_skin[PATHLEN];
|
||||
char previous_wallp[PATHLEN];
|
||||
char previous_ss[PATHLEN];
|
||||
@@ -1,5 +0,0 @@
|
||||
@c-- /D=LANG_ENG appearance.c
|
||||
@del *.
|
||||
@rename *.com *.
|
||||
@del warning.txt
|
||||
if not exist appearance ( @pause )
|
||||
@@ -1,5 +0,0 @@
|
||||
@c-- /D=LANG_RUS appearance.c
|
||||
@del *.
|
||||
@rename *.com *.
|
||||
@del warning.txt
|
||||
if not exist appearance ( @pause )
|
||||
@@ -1,106 +0,0 @@
|
||||
#ifdef LANG_RUS
|
||||
char t_skins[] = " Стиль окон";
|
||||
char t_wallpapers[] = " Обои";
|
||||
char t_screensaver[] = " Скринсейвер";
|
||||
?define WINDOW_HEADER "Настройки оформления"
|
||||
?define T_SELECT_FOLDER "Выбрать папку"
|
||||
?define T_PICTURE_MODE " Положение картинки "
|
||||
?define T_CHECKBOX_STRETCH "Растянуть"
|
||||
?define T_CHECKBOX_TILED "Замостить"
|
||||
?define T_CHECKBOX_AUTO "Автоматически"
|
||||
?define T_UPDATE_DOCK "Обновлять Dock-панель"
|
||||
?define T_NO_FILES "'Поддерживаемые файлы не найдены' -E"
|
||||
?define T_UI_PREVIEW " Пример компонентов "
|
||||
?define T_SS_TIMEOUT "Интервал в минутах: %i "
|
||||
?define T_SS_PREVIEW "Просмотр"
|
||||
?define T_SS_SET "Установить"
|
||||
?define T_NO_SS "[Выключен]"
|
||||
?define T_DEFAULT "[По умолчанию]"
|
||||
#else
|
||||
char t_skins[] = " Skins";
|
||||
char t_wallpapers[] = " Wallpapers";
|
||||
char t_screensaver[] = " Screensaver";
|
||||
?define WINDOW_HEADER "Appearance"
|
||||
?define T_SELECT_FOLDER "Select folder"
|
||||
?define T_PICTURE_MODE " Picture Mode "
|
||||
?define T_CHECKBOX_STRETCH "Stretch"
|
||||
?define T_CHECKBOX_TILED "Tiled"
|
||||
?define T_CHECKBOX_AUTO "Auto"
|
||||
?define T_UPDATE_DOCK "Update Dock"
|
||||
?define T_NO_FILES "'No supported files were found' -E"
|
||||
?define T_UI_PREVIEW " Components Preview "
|
||||
?define T_SS_TIMEOUT "Wait in minutes: %i "
|
||||
?define T_SS_PREVIEW "View"
|
||||
?define T_SS_SET "Set"
|
||||
?define T_NO_SS "[Disable]"
|
||||
?define T_DEFAULT "[Default]"
|
||||
#endif
|
||||
|
||||
#define WIN_W 560
|
||||
#define WIN_H 445
|
||||
#define LIST_W 260
|
||||
#define PANEL_H 50
|
||||
#define LP 6 //LIST_PADDING
|
||||
#define SL_VISIBLE WIN_H - PANEL_H - LP / SELECT_LIST_ITEMH
|
||||
|
||||
#define RIGHTx LP + LIST_W + TAB_P + 30
|
||||
#define RIGHTy PANEL_H
|
||||
#define RIGHTw WIN_W - RIGHTx - LP - TAB_P
|
||||
#define RIGHTh 215
|
||||
|
||||
enum {
|
||||
TAB_SKINS,
|
||||
TAB_WALLPAPERS,
|
||||
TAB_SCREENSAVERS
|
||||
};
|
||||
|
||||
enum {
|
||||
BASE_TAB_BUTTON_ID=3,
|
||||
BTN_SELECT_WALLP_FOLDER=10,
|
||||
BTN_TEST_SCREENSAVER,
|
||||
BTN_SET_SCREENSAVER
|
||||
};
|
||||
|
||||
_ini ini = { "/sys/settings/system.ini" };
|
||||
|
||||
char default_dir[] = "/sys";
|
||||
od_filter filter2 = { 8, "TXT\0\0" };
|
||||
|
||||
_tabs tabs = { -sizeof(t_skins)-sizeof(t_wallpapers)-sizeof(t_screensaver)
|
||||
-3*8+WIN_W - TAB_P / 2, LP, NULL, BASE_TAB_BUTTON_ID };
|
||||
|
||||
scroll_bar ss_timeout = { RIGHTw-19,RIGHTx,15,RIGHTy+25,0,3,89,10,0,0xFFFfff,
|
||||
0xBBBbbb,0xeeeeee};
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
void sort_by_name(int a, b) // for the first call: a = 0, b = sizeof(mas) - 1
|
||||
{
|
||||
int j;
|
||||
int isn = a;
|
||||
if (a >= b) return;
|
||||
for (j = a; j <= b; j++) {
|
||||
if (strcmpi(io.dir.position(ESDWORD[j*4+fmas]), io.dir.position(ESDWORD[b*4+fmas]))<=0) {
|
||||
ESDWORD[isn*4+fmas] >< ESDWORD[j*4+fmas];
|
||||
isn++;
|
||||
}
|
||||
}
|
||||
sort_by_name(a, isn-2);
|
||||
sort_by_name(isn, b);
|
||||
}
|
||||
|
||||
dword get_real_kolibrios_path()
|
||||
{
|
||||
char real_kolibrios_path[256];
|
||||
if (!dir_exists("/kolibrios")) return 0;
|
||||
SetCurDir("/kolibrios");
|
||||
GetCurDir(#real_kolibrios_path, sizeof(real_kolibrios_path));
|
||||
return #real_kolibrios_path;
|
||||
}
|
||||
|
||||
void SelectList_LineChanged()
|
||||
{
|
||||
EventApply();
|
||||
}
|
||||
@@ -1,33 +0,0 @@
|
||||
|
||||
checkbox checkbox1 = { "Checkbox", true };
|
||||
more_less_box spinbox1 = { 23, 0, 999, "SpinBox" };
|
||||
edit_box edit_cmm = {180,NULL,NULL,0xffffff,0x94AECE,0xFFFfff,0xffffff,
|
||||
0x10000000,sizeof(param)-2,#param,0, 0b};
|
||||
char st_str[16];
|
||||
edit_box edit_st = {180,NULL,NULL,0xffffff,0x94AECE,0xFFFfff,0xffffff,
|
||||
0x10000000,sizeof(st_str)-2,#st_str,0, 0b};
|
||||
|
||||
|
||||
void DrawUiElementsPreview(dword x,y,h)
|
||||
{
|
||||
incn y2;
|
||||
spinbox1.draw(x, y2.set(y+30));
|
||||
WriteText(x, y2.inc(30), 0x90, sc.work_text, "C-- Edit");
|
||||
DrawEditBoxPos(x, y2.inc(20), #edit_cmm);
|
||||
WriteText(x, y2.inc(35), 0x90, sc.work_text, "Standard Edit");
|
||||
DrawStEditBoxPos(x, y2.inc(20), #edit_st);
|
||||
DrawStandartCaptButton(x, y+h-40, GetFreeButtonId(), "Button1");
|
||||
DrawStandartCaptButton(x+100, y+h-40, GetFreeButtonId(), "Button2");
|
||||
}
|
||||
|
||||
:void DrawStEditBoxPos(dword x,y, edit_box_pointer)
|
||||
{
|
||||
dword c_inactive = MixColors(sc.line, sc.work, 128);
|
||||
dword c_active = MixColors(sc.line, 0, 128);
|
||||
ESI = edit_box_pointer;
|
||||
ESI.edit_box.left = x;
|
||||
ESI.edit_box.top = y;
|
||||
ESI.edit_box.border_color = c_inactive;
|
||||
ESI.edit_box.focus_border_color = c_active;
|
||||
edit_box_draw stdcall (edit_box_pointer);
|
||||
}
|
||||
@@ -1,6 +0,0 @@
|
||||
if tup.getconfig("NO_CMM") ~= "" then return end
|
||||
if tup.getconfig("LANG") == "ru_RU"
|
||||
then C_LANG = "LANG_RUS"
|
||||
else C_LANG = "LANG_ENG" -- this includes default case without config
|
||||
end
|
||||
tup.rule("barscfg.c", "c-- /D=$(C_LANG) /OPATH=%o %f" .. tup.getconfig("KPACK_CMD"), "barscfg.com")
|
||||
Binary file not shown.
|
Before Width: | Height: | Size: 400 B |
Binary file not shown.
Binary file not shown.
@@ -1,317 +0,0 @@
|
||||
#define MEMSIZE 1024*40
|
||||
#include "..\lib\kolibri.h"
|
||||
#include "..\lib\strings.h"
|
||||
#include "..\lib\mem.h"
|
||||
#include "..\lib\fs.h"
|
||||
#include "..\lib\dll.h"
|
||||
#include "..\lib\gui.h"
|
||||
|
||||
#include "..\lib\obj\libini.h"
|
||||
#include "..\lib\obj\box_lib.h"
|
||||
|
||||
#include "..\lib\patterns\restart_process.h"
|
||||
|
||||
#ifdef LANG_RUS
|
||||
?define WINDOW_TITLE "Настройки панели задач и Дока"
|
||||
?define TASK_FRAME_T " Панель задач "
|
||||
?define DOCK_FRAME_T " Док "
|
||||
?define MIN_LEFT_BUTTON "Кнопка скрытия слева"
|
||||
?define MIN_RIGHT_BUTTON "Кнопка скрытия справа"
|
||||
?define SOFTEN_UP "Сглаживание сверху"
|
||||
?define SOFTEN_DOWN "Сглаживание снизу"
|
||||
?define CLOCK "Часы"
|
||||
?define CPU_USAGE "Загрузка ЦП"
|
||||
?define CHANGE_LANG "Язык ввода"
|
||||
?define MENU_BUTTON "Кнопка меню"
|
||||
?define PANEL_HEIGHT "Высота панели"
|
||||
?define SOFTEN_HEIGHT "Высота сглаживания"
|
||||
?define BUTTON_OFFSET "Поле вокруг кнопок"
|
||||
?define FSIZE "Режим панели"
|
||||
?define ASHOW "Не скрывать"
|
||||
?define CHANGE_POS "Нажмите на изображение для смены позиции"
|
||||
#else
|
||||
?define WINDOW_TITLE "Taskbar and Docky configuration"
|
||||
?define TASK_FRAME_T " Taskbar "
|
||||
?define DOCK_FRAME_T " Docky "
|
||||
?define MIN_LEFT_BUTTON "Min Left Button"
|
||||
?define MIN_RIGHT_BUTTON "Min Right Button"
|
||||
?define SOFTEN_UP "Soften Up"
|
||||
?define SOFTEN_DOWN "Soften Down"
|
||||
?define CLOCK "Clock"
|
||||
?define CPU_USAGE "Cpu Usage"
|
||||
?define CHANGE_LANG "Change Language"
|
||||
?define MENU_BUTTON "Menu Button"
|
||||
?define PANEL_HEIGHT "Panel Height"
|
||||
?define SOFTEN_HEIGHT "Soften Height"
|
||||
?define BUTTON_OFFSET "Button Offset"
|
||||
?define FSIZE "Full width"
|
||||
?define ASHOW "Always show"
|
||||
?define CHANGE_POS "Click on image to change position"
|
||||
#endif
|
||||
|
||||
char taskbar_ini_path[] = "/sys/settings/taskbar.ini";
|
||||
_ini taskbar_flags_ini = { #taskbar_ini_path, "Flags" };
|
||||
_ini taskbar_vars_ini = { #taskbar_ini_path, "Variables" };
|
||||
|
||||
_ini docky_ini = { "/sys/settings/docky.ini", "@" };
|
||||
|
||||
#define PIMG_W 37
|
||||
#define PIMG_H 27 //27*5
|
||||
unsigned char panels_img_data[] = FROM "bars_8b.raw";
|
||||
dword panels_img_pal[] = {
|
||||
0x00405D74,0x0084FC84,0x00FAFAFA,0x0000B400,
|
||||
0x00E4E4E4,0x008C9B9C,0x000212FD,0x00D8DEDF,
|
||||
0x00585C5D,0x0085B7E0,0x009EC6E7,0x0094C0E5,
|
||||
0x00CB8800,0x00CE3D9E,0x00D20404,0x00485966
|
||||
};
|
||||
|
||||
proc_info Form;
|
||||
|
||||
enum { BTN_TB_ATTACHEMENT=100, BTN_DOCKY_ATTACHEMENT=200 };
|
||||
enum { TASKBAR, DOCKY };
|
||||
|
||||
more_less_box tbPanelHeight = { NULL, 6, 99, PANEL_HEIGHT };
|
||||
more_less_box tbSoftenHeight = { NULL, 0, 99, SOFTEN_HEIGHT };
|
||||
more_less_box tbButtonOffset = { NULL, 0, 99, BUTTON_OFFSET };
|
||||
|
||||
checkbox taskbar_on = 0;
|
||||
checkbox docky_on = 0;
|
||||
|
||||
int tbAttachment;
|
||||
checkbox tbSoftenUp = { SOFTEN_UP };
|
||||
checkbox tbClock = { CLOCK };
|
||||
checkbox tbSoftenDown = { SOFTEN_DOWN };
|
||||
checkbox tbCpuUsage = { CPU_USAGE };
|
||||
checkbox tbMinLeftButton = { MIN_LEFT_BUTTON };
|
||||
checkbox tbChangeLang = { CHANGE_LANG };
|
||||
checkbox tbMinRightButton = { MIN_RIGHT_BUTTON };
|
||||
checkbox tbMenuButton = { MENU_BUTTON };
|
||||
checkbox dkFsize = { FSIZE };
|
||||
checkbox dkAshow = { ASHOW };
|
||||
|
||||
int dkLocation=0;
|
||||
checkbox tbRunApplButton;
|
||||
checkbox tbClnDeskButton;
|
||||
|
||||
|
||||
void main()
|
||||
{
|
||||
dword id;
|
||||
|
||||
load_dll(libini, #lib_init,1);
|
||||
load_dll(boxlib, #box_lib_init,0);
|
||||
|
||||
LoadCfg();
|
||||
|
||||
loop() switch(@WaitEvent())
|
||||
{
|
||||
case evButton:
|
||||
id = @GetButtonID();
|
||||
if (1==id) @ExitProcess();
|
||||
|
||||
if (taskbar_on.checked) EventTaskbarProcessButton(id);
|
||||
if (docky_on.checked) EventDockyProcessButton(id);
|
||||
|
||||
if (taskbar_on.click(id)) {
|
||||
IF (taskbar_on.checked == true) RunProgram("/sys/@taskbar", 0);
|
||||
ELSE KillProcessByName("@TASKBAR", SINGLE);
|
||||
DrawWindowContent();
|
||||
}
|
||||
if (docky_on.click(id)) {
|
||||
IF (docky_on.checked == true) {
|
||||
dkLocation = 2;
|
||||
SaveSettingsAndRestartProcess(DOCKY);
|
||||
} ELSE {
|
||||
KillProcessByName("@DOCKY", SINGLE);
|
||||
}
|
||||
DrawWindowContent();
|
||||
}
|
||||
break;
|
||||
|
||||
case evKey:
|
||||
if (@GetKeyScancode() == SCAN_CODE_ESC) ExitProcess();
|
||||
break;
|
||||
|
||||
case evReDraw:
|
||||
sc.get();
|
||||
DefineAndDrawWindow(130, 150, 465, 398 + skin_h, 0x34, sc.work, WINDOW_TITLE, 0);
|
||||
GetProcessInfo(#Form, SelfInfo);
|
||||
if (Form.status_window&ROLLED_UP) break;
|
||||
DrawWindowContent();
|
||||
}
|
||||
}
|
||||
|
||||
void DrawPanelsImage(dword y, n)
|
||||
{
|
||||
PutPaletteImage(n * PIMG_W * PIMG_H + #panels_img_data, PIMG_W, PIMG_H, 22, y, 8, #panels_img_pal);
|
||||
}
|
||||
|
||||
void SetDisabledMode()
|
||||
{
|
||||
EAX = taskbar_on.checked ^ 1;
|
||||
tbSoftenUp.disabled =
|
||||
tbSoftenDown.disabled =
|
||||
tbMinLeftButton.disabled =
|
||||
tbMinRightButton.disabled =
|
||||
tbRunApplButton.disabled =
|
||||
tbClnDeskButton.disabled =
|
||||
tbClock.disabled =
|
||||
tbCpuUsage.disabled =
|
||||
tbChangeLang.disabled =
|
||||
tbMenuButton.disabled =
|
||||
tbPanelHeight.disabled =
|
||||
tbSoftenHeight.disabled =
|
||||
tbButtonOffset.disabled =
|
||||
tbButtonOffset.disabled = EAX;
|
||||
//
|
||||
dkFsize.disabled =
|
||||
dkAshow.disabled = docky_on.checked ^ 1;
|
||||
}
|
||||
|
||||
void DrawWindowContent()
|
||||
{
|
||||
#define PD 10
|
||||
dword frame_y;
|
||||
word win_center_x = Form.cwidth / 2 + 20;
|
||||
incn y;
|
||||
int i;
|
||||
|
||||
SetDisabledMode();
|
||||
|
||||
frame_y = 15;
|
||||
y.n = frame_y;
|
||||
DefineButton(22, y.inc(18), PIMG_W-1, PIMG_H-1, 100 + BT_HIDE, 0);
|
||||
DrawPanelsImage(y.n, tbAttachment);
|
||||
WriteTextWithBg(68, y.inc(7), 0xD0, sc.work_text, CHANGE_POS, sc.work);
|
||||
tbSoftenUp.draw(22, y.inc(35));
|
||||
tbClock.draw(win_center_x, y.n);
|
||||
tbSoftenDown.draw(22, y.inc(24));
|
||||
tbCpuUsage.draw(win_center_x, y.n);
|
||||
tbMinLeftButton.draw(22, y.inc(24));
|
||||
tbChangeLang.draw(win_center_x, y.n);
|
||||
tbMinRightButton.draw(22, y.inc(24));
|
||||
tbMenuButton.draw(win_center_x, y.n);
|
||||
tbPanelHeight.draw(22, y.inc(28));
|
||||
tbSoftenHeight.draw(22, y.inc(32));
|
||||
tbButtonOffset.draw(22, y.inc(32));
|
||||
DrawFrame(PD, frame_y, Form.cwidth-PD-PD, y.inc(32)-frame_y, TASK_FRAME_T);
|
||||
taskbar_on.draw(22, frame_y-7);
|
||||
//DOCKY
|
||||
frame_y = calc(y.inc(20));
|
||||
DefineButton(22, y.inc(18), PIMG_W-1, PIMG_H-1, 200 + BT_HIDE, 0);
|
||||
if (!dkLocation) i=2; else i=dkLocation;
|
||||
DrawPanelsImage(y.n, i+1);
|
||||
WriteTextWithBg(68, y.inc(7), 0xD0, sc.work_text, CHANGE_POS, sc.work);
|
||||
dkFsize.draw(22, y.inc(35));
|
||||
dkAshow.draw(win_center_x, y.n);
|
||||
DrawFrame(PD, frame_y, Form.cwidth-PD-PD, Form.cheight-frame_y-PD, DOCK_FRAME_T);
|
||||
docky_on.draw(22, frame_y-7);
|
||||
}
|
||||
|
||||
void LoadCfg()
|
||||
{
|
||||
tbAttachment = taskbar_flags_ini.GetInt("Attachment", 1);
|
||||
tbSoftenUp.checked = taskbar_flags_ini.GetInt("SoftenUp", 1);
|
||||
tbSoftenDown.checked = taskbar_flags_ini.GetInt("SoftenDown", 1);
|
||||
tbMinLeftButton.checked = taskbar_flags_ini.GetInt("MinLeftButton", 1);
|
||||
tbMinRightButton.checked = taskbar_flags_ini.GetInt("MinRightButton", 1);
|
||||
tbClock.checked = taskbar_flags_ini.GetInt("Clock", 1);
|
||||
tbCpuUsage.checked = taskbar_flags_ini.GetInt("CpuUsage", 1);
|
||||
tbChangeLang.checked = taskbar_flags_ini.GetInt("ChangeLang", 1);
|
||||
tbMenuButton.checked = taskbar_flags_ini.GetInt("MenuButton", 1);
|
||||
tbPanelHeight.value = taskbar_vars_ini.GetInt("PanelHeight", 28);
|
||||
tbSoftenHeight.value = taskbar_vars_ini.GetInt("SoftenHeight", 4);
|
||||
tbButtonOffset.value = taskbar_vars_ini.GetInt("ButtonTopOffset", 3);
|
||||
tbButtonOffset.value = taskbar_vars_ini.GetInt("ButtonBotOffset", 3);
|
||||
|
||||
dkLocation = docky_ini.GetInt("location", 0);
|
||||
dkFsize.checked = docky_ini.GetInt("fsize", 0);
|
||||
dkAshow.checked = docky_ini.GetInt("ashow", 0);
|
||||
|
||||
taskbar_on.checked = CheckProcessExists("@TASKBAR");
|
||||
docky_on.checked = CheckProcessExists("@DOCKY");
|
||||
}
|
||||
|
||||
void SaveSettingsAndRestartProcess(byte panel_type)
|
||||
{
|
||||
if (panel_type==TASKBAR) {
|
||||
taskbar_flags_ini.SetInt("Attachment", tbAttachment);
|
||||
taskbar_flags_ini.SetInt("SoftenUp", tbSoftenUp.checked);
|
||||
taskbar_flags_ini.SetInt("SoftenDown", tbSoftenDown.checked);
|
||||
taskbar_flags_ini.SetInt("MinLeftButton", tbMinLeftButton.checked);
|
||||
taskbar_flags_ini.SetInt("MinRightButton", tbMinRightButton.checked);
|
||||
taskbar_flags_ini.SetInt("RunApplButton", tbRunApplButton.checked);
|
||||
taskbar_flags_ini.SetInt("ClnDeskButton", tbClnDeskButton.checked);
|
||||
taskbar_flags_ini.SetInt("Clock", tbClock.checked);
|
||||
taskbar_flags_ini.SetInt("CpuUsage", tbCpuUsage.checked);
|
||||
taskbar_flags_ini.SetInt("ChangeLang", tbChangeLang.checked);
|
||||
taskbar_flags_ini.SetInt("MenuButton", tbMenuButton.checked);
|
||||
taskbar_vars_ini.SetInt("PanelHeight", tbPanelHeight.value);
|
||||
taskbar_vars_ini.SetInt("SoftenHeight", tbSoftenHeight.value);
|
||||
taskbar_vars_ini.SetInt("ButtonTopOffset", tbButtonOffset.value);
|
||||
taskbar_vars_ini.SetInt("ButtonBottOffset", tbButtonOffset.value);
|
||||
}
|
||||
if (panel_type==DOCKY) {
|
||||
if (!docky_on.checked) {
|
||||
docky_ini.SetInt("location", 0);
|
||||
} else {
|
||||
docky_ini.SetInt("location", dkLocation);
|
||||
}
|
||||
docky_ini.SetInt("fsize", dkFsize.checked);
|
||||
docky_ini.SetInt("ashow", dkAshow.checked);
|
||||
}
|
||||
RestartProcess(panel_type);
|
||||
}
|
||||
|
||||
void RestartProcess(byte panel_type)
|
||||
{
|
||||
dword proc_name1;
|
||||
if (panel_type == TASKBAR)
|
||||
{
|
||||
RestartProcessByName("/sys/@taskbar", SINGLE);
|
||||
pause(50);
|
||||
}
|
||||
else
|
||||
{
|
||||
RestartProcessByName("/sys/@docky", SINGLE);
|
||||
pause(120);
|
||||
}
|
||||
GetProcessInfo(#Form, SelfInfo);
|
||||
ActivateWindow(GetProcessSlot(Form.ID));
|
||||
}
|
||||
|
||||
void EventTaskbarProcessButton(dword id)
|
||||
{
|
||||
if (BTN_TB_ATTACHEMENT == id) {
|
||||
tbAttachment ^= 1;
|
||||
DrawWindowContent();
|
||||
SaveSettingsAndRestartProcess(TASKBAR);
|
||||
}
|
||||
if (tbSoftenUp.click(id)) || (tbSoftenDown.click(id))
|
||||
|| (tbMinLeftButton.click(id)) || (tbMinRightButton.click(id))
|
||||
|| (tbRunApplButton.click(id)) || (tbClnDeskButton.click(id)) {
|
||||
SaveSettingsAndRestartProcess(TASKBAR);
|
||||
}
|
||||
if (tbClock.click(id)) || (tbCpuUsage.click(id))
|
||||
|| (tbChangeLang.click(id)) || (tbMenuButton.click(id))
|
||||
|| (tbPanelHeight.click(id)) || (tbSoftenHeight.click(id))
|
||||
|| (tbButtonOffset.click(id)) {
|
||||
SaveSettingsAndRestartProcess(TASKBAR);
|
||||
}
|
||||
}
|
||||
|
||||
void EventDockyProcessButton(dword id)
|
||||
{
|
||||
if (BTN_DOCKY_ATTACHEMENT == id) {
|
||||
dkLocation++;
|
||||
if (dkLocation>4) dkLocation=1;
|
||||
DrawWindowContent();
|
||||
SaveSettingsAndRestartProcess(DOCKY);
|
||||
}
|
||||
if (dkFsize.click(id)) || (dkAshow.click(id)) {
|
||||
SaveSettingsAndRestartProcess(DOCKY);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
stop:
|
||||
@@ -1,6 +0,0 @@
|
||||
@c-- /D=LANG_ENG barscfg.c
|
||||
@pause
|
||||
@del barscfg
|
||||
@rename *.com *.
|
||||
@del warning.txt
|
||||
|
||||
@@ -1,6 +0,0 @@
|
||||
@c-- /D=LANG_RUS barscfg.c
|
||||
@pause
|
||||
@del barscfg
|
||||
@rename *.com *.
|
||||
@del warning.txt
|
||||
|
||||
@@ -1,285 +0,0 @@
|
||||
#include "TWB\colors.h"
|
||||
#include "TWB\anchors.h"
|
||||
#include "TWB\parse_tag.h"
|
||||
#include "TWB\special.h"
|
||||
#include "TWB\tag_list.h"
|
||||
#define DEFAULT_BG_COL 0xffFBE5E4; //- peach; 0xffEBE8E9 - more grey
|
||||
dword link_color_default;
|
||||
dword link_color_active;
|
||||
#include "TWB\links.h"
|
||||
|
||||
#define BODY_MARGIN 6
|
||||
#define BASIC_CHAR_W 8
|
||||
#define BASIC_LINE_H 18
|
||||
|
||||
struct STYLE {
|
||||
bool
|
||||
b, u, s, h,
|
||||
font,
|
||||
pre,
|
||||
blq,
|
||||
button,
|
||||
image,
|
||||
nav, header;
|
||||
LIST tag_list;
|
||||
dword title;
|
||||
dword cur_line_h;
|
||||
void reset();
|
||||
};
|
||||
|
||||
void STYLE::reset()
|
||||
{
|
||||
b = u = s = h = font = pre = blq =
|
||||
title = button = image = nav = header = false;
|
||||
cur_line_h = NULL;
|
||||
tag_list.reset();
|
||||
}
|
||||
|
||||
struct TWebBrowser {
|
||||
llist list;
|
||||
STYLE style;
|
||||
dword draw_y, draw_x, draw_w, left_gap;
|
||||
dword o_bufpointer;
|
||||
int cur_encoding, custom_encoding;
|
||||
bool link, t_html, t_body;
|
||||
dword bufpointer;
|
||||
dword bufsize;
|
||||
dword is_html;
|
||||
collection img_url;
|
||||
char header[150];
|
||||
char linebuf[500];
|
||||
char redirect[URL_SIZE];
|
||||
|
||||
bool secondrun;
|
||||
|
||||
void SetStyle();
|
||||
void RenderTextbuf();
|
||||
void RenderLine();
|
||||
bool RenderImage();
|
||||
|
||||
void SetPageDefaults();
|
||||
void ParseHtml();
|
||||
void Reparse();
|
||||
void NewLine();
|
||||
void ChangeEncoding();
|
||||
void AddCharToTheLine();
|
||||
void DrawPage();
|
||||
|
||||
void tag_a();
|
||||
void tag_p();
|
||||
void tag_img();
|
||||
void tag_kosicon();
|
||||
void tag_div();
|
||||
void tag_h1234_caption();
|
||||
void tag_ol_ul_dt();
|
||||
void tag_li();
|
||||
void tag_q();
|
||||
void tag_hr();
|
||||
void tag_code();
|
||||
void tag_meta_xml();
|
||||
void tag_body();
|
||||
void tag_iframe();
|
||||
void tag_title();
|
||||
void tag_font();
|
||||
void tag_table_reset();
|
||||
void tag_table();
|
||||
void tag_td();
|
||||
void tag_tr();
|
||||
void reset_font_style();
|
||||
};
|
||||
|
||||
#include "TWB\render.h"
|
||||
#include "TWB\set_style.h"
|
||||
//============================================================================================
|
||||
void TWebBrowser::SetPageDefaults()
|
||||
{
|
||||
t_html = t_body = link = false;
|
||||
style.reset();
|
||||
reset_font_style();
|
||||
link_color_default = 0x0000FF;
|
||||
link_color_active = 0xFF0000;
|
||||
links.clear();
|
||||
anchors.clear();
|
||||
img_url.drop();
|
||||
text_colors.drop();
|
||||
text_colors.add(0);
|
||||
if (secondrun) {
|
||||
canvas.Init(list.x, list.y, list.w, math.max(list.visible, list.count)+200);
|
||||
canvas.Fill(0, bg_colors.get(0));
|
||||
}
|
||||
bg_colors.drop();
|
||||
bg_colors.add(DEFAULT_BG_COL);
|
||||
header = NULL;
|
||||
draw_y = BODY_MARGIN;
|
||||
draw_x = left_gap = BODY_MARGIN;
|
||||
draw_w = list.w - BODY_MARGIN - BODY_MARGIN;
|
||||
linebuf = 0;
|
||||
redirect = '\0';
|
||||
tag_table_reset();
|
||||
is_html = true;
|
||||
if (!strstri(bufpointer, "<body")) {
|
||||
t_body = true;
|
||||
if (!strstri(bufpointer, "<html")) && (!strstri(bufpointer, "<head")) && (!strstri(bufpointer, "<title"))
|
||||
&& (!strstr(bufpointer, "<?xml")) && (!strstr(bufpointer, "<xml")) {
|
||||
style.pre = true; //show linebreaks for a plaint text
|
||||
is_html = false;
|
||||
}
|
||||
}
|
||||
}
|
||||
//============================================================================================
|
||||
void TWebBrowser::Reparse()
|
||||
{
|
||||
ParseHtml(bufpointer, bufsize);
|
||||
}
|
||||
//============================================================================================
|
||||
void TWebBrowser::ParseHtml(dword _bufpointer, _bufsize){
|
||||
int tab_len;
|
||||
dword bufpos;
|
||||
bufsize = _bufsize;
|
||||
|
||||
if (bufpointer == _bufpointer) {
|
||||
custom_encoding = cur_encoding;
|
||||
} else {
|
||||
bufpointer = malloc(bufsize);
|
||||
memmov(bufpointer, _bufpointer, bufsize);
|
||||
|
||||
//hold original buffer
|
||||
o_bufpointer = malloc(bufsize);
|
||||
memmov(o_bufpointer, bufpointer, bufsize);
|
||||
|
||||
cur_encoding = CH_CP866;
|
||||
if (custom_encoding != -1) {
|
||||
cur_encoding = custom_encoding;
|
||||
bufpointer = ChangeCharset(cur_encoding, CH_CP866, bufpointer);
|
||||
bufsize = strlen(bufpointer);
|
||||
}
|
||||
}
|
||||
|
||||
table.cols.drop();
|
||||
secondrun = false;
|
||||
|
||||
_PARSE_START_:
|
||||
|
||||
SetPageDefaults();
|
||||
for (bufpos=bufpointer; bufpos < bufpointer+bufsize; bufpos++;)
|
||||
{
|
||||
if (style.pre) {
|
||||
if (ESBYTE[bufpos] == 0x0a) {
|
||||
RenderTextbuf();
|
||||
NewLine();
|
||||
continue;
|
||||
}
|
||||
if (ESBYTE[bufpos] == 0x09) {
|
||||
tab_len = draw_x - left_gap / list.font_w + strlen(#linebuf) % 4;
|
||||
if (!tab_len) tab_len = 4; else tab_len = 4 - tab_len;
|
||||
while (tab_len) {chrcat(#linebuf,' '); tab_len--;}
|
||||
continue;
|
||||
}
|
||||
}
|
||||
if (ESBYTE[bufpos] == '&') {
|
||||
bufpos = GetUnicodeSymbol(#linebuf, sizeof(TWebBrowser.linebuf)-1, bufpos+1, bufpointer+bufsize);
|
||||
continue;
|
||||
}
|
||||
if (ESBYTE[bufpos] == '<') && (is_html) {
|
||||
if (strchr("!/?abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ", ESBYTE[bufpos+1])) {
|
||||
bufpos++;
|
||||
if (tag.parse(#bufpos, bufpointer + bufsize)) {
|
||||
|
||||
/*
|
||||
if (secondrun)
|
||||
{
|
||||
if (streq(#tag.name, "tr")) debugln(" ");
|
||||
if (!tag.opened) {
|
||||
debugch('/');
|
||||
} else {
|
||||
debugch(' ');
|
||||
}
|
||||
debugln(sprintf(#param, "%s x%i y%i %s",
|
||||
#tag.name, draw_x, draw_y, #linebuf));
|
||||
}
|
||||
//*/
|
||||
RenderTextbuf();
|
||||
if (debug_mode) { debugch('<'); if(!tag.opened)debugch('/'); debug(#tag.name); debugln(">"); }
|
||||
$push cur_encoding
|
||||
SetStyle();
|
||||
$pop eax
|
||||
// The thing is that UTF if longer than other encodings.
|
||||
// So if encoding was changed from UTF to DOS than $bufpos position got wrong,
|
||||
// and we have to start parse from the very beginning
|
||||
if (EAX != cur_encoding) && (cur_encoding == CH_UTF8) {
|
||||
ParseHtml(bufpointer, strlen(bufpointer));
|
||||
return;
|
||||
}
|
||||
}
|
||||
continue;
|
||||
}
|
||||
}
|
||||
AddCharToTheLine(ESBYTE[bufpos]);
|
||||
}
|
||||
|
||||
RenderTextbuf();
|
||||
list.count = draw_y + style.cur_line_h;
|
||||
list.CheckDoesValuesOkey();
|
||||
anchors.current = NULL;
|
||||
|
||||
if (!secondrun) {
|
||||
secondrun = true;
|
||||
goto _PARSE_START_;
|
||||
}
|
||||
if (!header) {
|
||||
strncpy(#header, #version, sizeof(TWebBrowser.header)-1);
|
||||
DrawTitle(#header);
|
||||
}
|
||||
}
|
||||
//============================================================================================
|
||||
void TWebBrowser::AddCharToTheLine(unsigned char _char)
|
||||
{
|
||||
dword line_len = strlen(#linebuf);
|
||||
if (_char<=15) _char=' ';
|
||||
if (!style.pre) && (_char == ' ')
|
||||
{
|
||||
if (linebuf[line_len-1]==' ') return; //no double spaces
|
||||
if (draw_x==left_gap) && (!linebuf) return; //no paces at the beginning of the line
|
||||
if (link) && (line_len==0) return;
|
||||
}
|
||||
if (line_len < sizeof(TWebBrowser.linebuf)) {
|
||||
chrcat(#linebuf+line_len, _char);
|
||||
} else {
|
||||
RenderTextbuf();
|
||||
}
|
||||
}
|
||||
//============================================================================================
|
||||
void TWebBrowser::ChangeEncoding(int _new_encoding)
|
||||
{
|
||||
if (cur_encoding == _new_encoding) return;
|
||||
cur_encoding = _new_encoding;
|
||||
bufpointer = ChangeCharset(cur_encoding, CH_CP866, bufpointer);
|
||||
if (header) {
|
||||
ChangeCharset(cur_encoding, CH_CP866, #header);
|
||||
DrawTitle(#header);
|
||||
}
|
||||
}
|
||||
//============================================================================================
|
||||
scroll_bar scroll_wv = { 15,NULL,NULL,NULL,
|
||||
0,2,NULL,0,0,0xeeeeee,0xBBBbbb,0xeeeeee};
|
||||
|
||||
void TWebBrowser::DrawPage()
|
||||
{
|
||||
if (list.w!=canvas.bufw) Reparse();
|
||||
canvas.Show(list.first, list.h);
|
||||
|
||||
scroll_wv.max_area = list.count;
|
||||
scroll_wv.cur_area = list.visible;
|
||||
scroll_wv.position = list.first;
|
||||
scroll_wv.all_redraw = 0;
|
||||
scroll_wv.start_x = list.x + list.w;
|
||||
scroll_wv.start_y = list.y;
|
||||
scroll_wv.size_y = list.h;
|
||||
|
||||
if (list.count <= list.visible) {
|
||||
DrawBar(scroll_wv.start_x, scroll_wv.start_y, scroll_wv.size_x,
|
||||
scroll_wv.size_y, bg_colors.get(0) & 0x00FFFFFF);
|
||||
} else {
|
||||
scrollbar_v_draw(#scroll_wv);
|
||||
}
|
||||
}
|
||||
@@ -1,43 +0,0 @@
|
||||
|
||||
struct _anchors {
|
||||
char current[256];
|
||||
collection anchor_name;
|
||||
collection anchor_position;
|
||||
void add();
|
||||
int get_pos_by_name();
|
||||
void clear();
|
||||
void take_anchor_from();
|
||||
} anchors=0;
|
||||
|
||||
void _anchors::add(dword _name, _pos)
|
||||
{
|
||||
anchor_name.add(_name);
|
||||
anchor_position.add(itoa(_pos));
|
||||
}
|
||||
|
||||
int _anchors::get_pos_by_name(dword _get_name)
|
||||
{
|
||||
dword pos_name = anchor_name.get_pos_by_name(_get_name);
|
||||
if (ESBYTE[_get_name]==NULL) return 0;
|
||||
if (pos_name==-1) {
|
||||
return -1;
|
||||
} else {
|
||||
return atoi(anchor_position.get(pos_name));
|
||||
}
|
||||
}
|
||||
|
||||
void _anchors::clear()
|
||||
{
|
||||
anchor_name.drop();
|
||||
anchor_position.drop();
|
||||
}
|
||||
|
||||
void _anchors::take_anchor_from(dword _URL)
|
||||
{
|
||||
int anchor_pos;
|
||||
if (!current) && (_URL) && (anchor_pos = strrchr(_URL, '#')) {
|
||||
strncpy(#current, _URL+anchor_pos-1, sizeof(_anchors.current)-1);
|
||||
ESBYTE[_URL+anchor_pos-1] = '\0';
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,75 +0,0 @@
|
||||
collection_int text_colors;
|
||||
collection_int bg_colors;
|
||||
|
||||
struct WEB_COLORS {
|
||||
char *name;
|
||||
dword rgb;
|
||||
} web_colors[] = {
|
||||
"aliceblue", 0xF0F8FF, "antiquewhite", 0xFAEBD7, "aqua", 0x00FFFF, "aquamarine", 0x7FFFD4,
|
||||
"azure", 0xF0FFFF, "beige", 0xF5F5DC, "bisque", 0xFFE4C4, "black", 0x000000,
|
||||
"blanchedalmond", 0xFFEBCD, "blue", 0x0000FF, "blueviolet", 0x8A2BE2, "brown", 0xA52A2A,
|
||||
"burlywood", 0xDEB887, "cadetblue", 0x5F9EA0, "chartreuse", 0x7FFF00, "chocolate", 0xD2691E,
|
||||
"coral", 0xFF7F50, "cornflowerblue", 0x6495ED, "cornsilk", 0xFFF8DC, "crimson", 0xDC143C,
|
||||
"cyan", 0x00FFFF, "darkblue", 0x00008B, "darkcyan", 0x008B8B, "darkgoldenrod", 0xB8860B,
|
||||
"darkgray", 0xA9A9A9, "darkgreen", 0x006400, "darkkhaki", 0xBDB76B, "darkmagenta", 0x8B008B,
|
||||
"darkolivegreen", 0x556B2F, "darkorange", 0xFF8C00, "darkorchid", 0x9932CC, "darkred", 0x8B0000,
|
||||
"darksalmon", 0xE9967A, "darkseagreen", 0x8FBC8F, "darkslateblue", 0x483D8B, "darkslategray", 0x2F4F4F,
|
||||
"darkturquoise", 0x00CED1, "darkviolet", 0x9400D3, "deeppink", 0xFF1493, "deepskyblue", 0x00BFFF,
|
||||
"dimgray", 0x696969, "dodgerblue", 0x1E90FF, "firebrick", 0xB22222, "floralwhite", 0xFFFAF0,
|
||||
"forestgreen", 0x228B22, "fuchsia", 0xFF00FF, "gainsboro", 0xDCDCDC, "ghostwhite", 0xF8F8FF,
|
||||
"gold", 0xFFD700, "goldenrod", 0xDAA520, "gray", 0x808080, "green", 0x008000,
|
||||
"greenyellow", 0xADFF2F, "honeydew", 0xF0FFF0, "hotpink", 0xFF69B4, "indianred", 0xCD5C5C,
|
||||
"indigo", 0x4B0082, "ivory", 0xFFFFF0, "khaki", 0xF0E68C, "lavender", 0xE6E6FA,
|
||||
"lavenderblush", 0xFFF0F5, "lawngreen", 0x7CFC00, "lemonchiffon", 0xFFFACD, "lightblue", 0xADD8E6,
|
||||
"lightcoral", 0xF08080, "lightcyan", 0xE0FFFF, "lightgreen", 0x90EE90, "lightgrey", 0xD3D3D3,
|
||||
"lightpink", 0xFFB6C1, "lightsalmon", 0xFFA07A, "lightseagreen", 0x20B2AA, "lightskyblue", 0x87CEFA,
|
||||
"lightslategray", 0x778899, "lightsteelblue", 0xB0C4DE, "lightyellow", 0xFFFFE0, "lime", 0x00FF00,
|
||||
"limegreen", 0x32CD32, "linen", 0xFAF0E6, "magenta", 0xFF00FF, "maroon", 0x800000,
|
||||
"mediumaquamarine", 0x66CDAA, "mediumblue", 0x0000CD, "mediumorchid", 0xBA55D3, "mediumpurple", 0x9370DB,
|
||||
"mediumseagreen", 0x3CB371, "mediumslateblue", 0x7B68EE, "mediumspringgreen",0x00FA9A, "mediumturquoise", 0x48D1CC,
|
||||
"mediumvioletred", 0xC71585, "midnightblue", 0x191970, "mintcream", 0xF5FFFA, "mistyrose", 0xFFE4E1,
|
||||
"moccasin", 0xFFE4B5, "navajowhite", 0xFFDEAD, "navy", 0x000080, "oldlace", 0xFDF5E6,
|
||||
"olive", 0x808000, "olivedrab", 0x6B8E23, "orange", 0xFFA500, "orangered", 0xFF4500,
|
||||
"orchid", 0xDA70D6, "palegoldenrod", 0xEEE8AA, "palegreen", 0x98FB98, "paleturquoise", 0xAFEEEE,
|
||||
"palevioletred", 0xDB7093, "papayawhip", 0xFFEFD5, "peachpuff", 0xFFDAB9, "peru", 0xCD853F,
|
||||
"pink", 0xFFC0CB, "plum", 0xDDA0DD, "powderblue", 0xB0E0E6, "purple", 0x800080,
|
||||
"red", 0xFF0000, "rosybrown", 0xBC8F8F, "royalblue", 0x4169E1, "saddlebrown", 0x8B4513,
|
||||
"salmon", 0xFA8072, "sandybrown", 0xF4A460, "seagreen", 0x2E8B57, "seashell", 0xFFF5EE,
|
||||
"sienna", 0xA0522D, "silver", 0xC0C0C0, "skyblue", 0x87CEEB, "slateblue", 0x6A5ACD,
|
||||
"slategray", 0x708090, "snow", 0xFFFAFA, "springgreen", 0x00FF7F, "steelblue", 0x4682B4,
|
||||
"tan", 0xD2B48C, "teal", 0x008080, "thistle", 0xD8BFD8, "tomato", 0xFF6347,
|
||||
"turquoise", 0x40E0D0, "violet", 0xEE82EE, "wheat", 0xF5DEB3, "white", 0xFFFFFF,
|
||||
"whitesmoke", 0xF5F5F5, "yellow", 0xFFFF00, "yellowgreen", 0x9ACD32, 0};
|
||||
|
||||
dword GetColor(char* color_str)
|
||||
{
|
||||
int ii;
|
||||
dword textlen=0;
|
||||
dword color=0;
|
||||
|
||||
strlwr(color_str);
|
||||
if (ESBYTE[color_str] == '#') {
|
||||
color_str++;
|
||||
} else {
|
||||
for (ii=0; web_colors[ii].name!=0; ii++)
|
||||
{
|
||||
if (streq(color_str, web_colors[ii].name)) return web_colors[ii].rgb;
|
||||
}
|
||||
}
|
||||
|
||||
textlen = strlen(color_str);
|
||||
if (textlen==6) || (textlen==3)
|
||||
{
|
||||
FOR (ii=0; ii<textlen; ii++)
|
||||
{
|
||||
BL = ESBYTE[color_str+ii];
|
||||
IF ((BL>='0') && (BL<='9')) BL -= '0';
|
||||
//IF ((BL>='A') && (BL<='F')) BL -= 'A'-10;
|
||||
IF ((BL>='a') && (BL<='f')) BL -= 'a'-10;
|
||||
color = color*0x10 + BL;
|
||||
if (textlen==3) color = color*0x10 + BL; //#abc ->> #aabbcc
|
||||
}
|
||||
return color;
|
||||
}
|
||||
return text_colors.get(0);
|
||||
}
|
||||
@@ -1,113 +0,0 @@
|
||||
CustomCursor CursorPointer;
|
||||
dword CursorFile = FROM "TWB/pointer.cur";
|
||||
#include "..\lib\collection.h"
|
||||
|
||||
struct PAGE_LINKS {
|
||||
collection unic_links;
|
||||
collection element_links;
|
||||
|
||||
collection_int x;
|
||||
collection_int y;
|
||||
collection_int w;
|
||||
collection_int h;
|
||||
collection_int id;
|
||||
collection_int underline_h;
|
||||
|
||||
signed int active;
|
||||
dword active_url;
|
||||
bool hover();
|
||||
void add_link();
|
||||
void add_text();
|
||||
void clear();
|
||||
void draw_underline();
|
||||
} links;
|
||||
|
||||
void PAGE_LINKS::add_link(dword lpath)
|
||||
{
|
||||
unic_links.add(lpath);
|
||||
}
|
||||
|
||||
void PAGE_LINKS::add_text(dword _x, _y, _w, _h, _underline_h)
|
||||
{
|
||||
x.add(_x);
|
||||
y.add(_y);
|
||||
w.add(_w);
|
||||
h.add(_h);
|
||||
underline_h.add(_underline_h);
|
||||
element_links.add(unic_links.get_last());
|
||||
id.add(unic_links.count);
|
||||
}
|
||||
|
||||
void PAGE_LINKS::clear()
|
||||
{
|
||||
x.drop();
|
||||
y.drop();
|
||||
w.drop();
|
||||
h.drop();
|
||||
underline_h.drop();
|
||||
id.drop();
|
||||
|
||||
element_links.drop();
|
||||
unic_links.drop();
|
||||
|
||||
active = -1;
|
||||
active_url = 0;
|
||||
CursorPointer.Restore();
|
||||
}
|
||||
|
||||
void PAGE_LINKS::draw_underline(signed _id, dword list_first, list_y, color)
|
||||
{
|
||||
int i;
|
||||
if (_id == -1) return;
|
||||
for (i=0; i<id.count; i++)
|
||||
{
|
||||
if (id.get(i) - id.get(_id) == 0)
|
||||
&& (y.get(i) + h.get(i) - list_first > list_y) {
|
||||
DrawBar(x.get(i), y.get(i) + h.get(i) - list_first,
|
||||
w.get(i), underline_h.get(i), color);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
bool PAGE_LINKS::hover(dword list_y, list_first)
|
||||
{
|
||||
int i;
|
||||
int mx = mouse.x;
|
||||
int my = mouse.y + list_first;
|
||||
if (!id.count) return false;
|
||||
|
||||
//Here we check is any link hovered
|
||||
for (i=0; i<id.count; i++)
|
||||
{
|
||||
if (mx>x.get(i)) && (my>y.get(i))
|
||||
&& (mx<x.get(i)+w.get(i)) && (my<y.get(i)+h.get(i))
|
||||
&& (my>list_y+list_first)
|
||||
{
|
||||
if (active!=i) {
|
||||
CursorPointer.Load(#CursorFile);
|
||||
CursorPointer.Set();
|
||||
|
||||
draw_underline(active, list_first, list_y, link_color_default);
|
||||
draw_underline(i, list_first, list_y, DEFAULT_BG_COL);
|
||||
|
||||
active_url = element_links.get(i);
|
||||
active = i;
|
||||
DrawStatusBar(active_url);
|
||||
}
|
||||
if (mouse.lkm) && (mouse.down) {
|
||||
DrawRectangle(x.get(active), -list_first + y.get(active),
|
||||
w.get(active), h.get(active), 0);
|
||||
}
|
||||
return true;
|
||||
}
|
||||
}
|
||||
if (active_url) {
|
||||
CursorPointer.Restore();
|
||||
draw_underline(active, list_first, list_y, link_color_default);
|
||||
active_url = 0;
|
||||
active = -1;
|
||||
DrawStatusBar(NULL);
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
@@ -1,202 +0,0 @@
|
||||
/*
|
||||
struct _DOM {
|
||||
collection tag;
|
||||
collection tagparam;
|
||||
collection_int parent;
|
||||
} dom;
|
||||
*/
|
||||
|
||||
struct _tag
|
||||
{
|
||||
char name[32];
|
||||
char prior[32];
|
||||
bool opened;
|
||||
collection attributes;
|
||||
collection values;
|
||||
dword value;
|
||||
dword number;
|
||||
bool is();
|
||||
bool parse();
|
||||
dword get_next_param();
|
||||
dword get_value_of();
|
||||
signed get_number_of();
|
||||
} tag=0;
|
||||
|
||||
bool _tag::is(dword _text)
|
||||
{
|
||||
return streq(#name, _text);
|
||||
}
|
||||
|
||||
bool _tag::parse(dword _bufpos, bufend)
|
||||
{
|
||||
bool retok = true;
|
||||
dword bufpos = ESDWORD[_bufpos];
|
||||
dword params, paramsend;
|
||||
|
||||
dword closepos;
|
||||
dword whitepos;
|
||||
dword openpos;
|
||||
|
||||
if (name) strcpy(#prior, #name); else prior = '\0';
|
||||
name = '\0';
|
||||
attributes.drop();
|
||||
values.drop();
|
||||
|
||||
if (!strncmp(bufpos,"!--",3))
|
||||
{
|
||||
bufpos+=3;
|
||||
//STRSTR
|
||||
while (strncmp(bufpos,"-->",3)!=0) && (bufpos < bufend)
|
||||
{
|
||||
bufpos++;
|
||||
}
|
||||
bufpos+=2;
|
||||
retok = false;
|
||||
goto _RET;
|
||||
}
|
||||
|
||||
if (ESBYTE[bufpos] == '/') {
|
||||
opened = false;
|
||||
bufpos++;
|
||||
} else {
|
||||
opened = true;
|
||||
}
|
||||
|
||||
closepos = strchr(bufpos, '>');
|
||||
whitepos = strchrw(bufpos, bufend-bufpos);
|
||||
|
||||
if (!whitepos) || (whitepos > closepos) {
|
||||
//no param
|
||||
strncpy(#name, bufpos, math.min(closepos - bufpos, sizeof(tag.name)-1));
|
||||
bufpos = closepos;
|
||||
} else {
|
||||
//we have param
|
||||
while (chrlnum(whitepos, '\"', closepos - whitepos)%2) { //alt="Next>>"
|
||||
if (!openpos = strchr(closepos+1, '<')) break;
|
||||
if (openpos < strchr(closepos+1, '>')) break;
|
||||
if (!closepos = EAX) {closepos = bufend;break;}
|
||||
}
|
||||
strncpy(#name, bufpos, math.min(whitepos - bufpos, sizeof(tag.name)-1));
|
||||
bufpos = closepos;
|
||||
|
||||
params = malloc(closepos - whitepos + 1);
|
||||
strncpy(params, whitepos, closepos - whitepos);
|
||||
paramsend = params + closepos - whitepos;
|
||||
while (paramsend = get_next_param(params, paramsend-1));
|
||||
free(params);
|
||||
}
|
||||
|
||||
if (name) {
|
||||
strlwr(#name);
|
||||
// ignore text inside the next tags
|
||||
if (is("script")) || (is("style")) || (is("binary")) || (is("select")) {
|
||||
strcpy(#prior, #name);
|
||||
sprintf(#name, "</%s>", #prior);
|
||||
if (strstri(bufpos, #name)) bufpos = EAX-1;
|
||||
retok = false;
|
||||
} else {
|
||||
if (name[strlen(#name)-1]=='/') name[strlen(#name)-1]=NULL; //for <br/>
|
||||
}
|
||||
} else {
|
||||
retok = false;
|
||||
}
|
||||
|
||||
_RET:
|
||||
ESDWORD[_bufpos] = bufpos;
|
||||
return retok;
|
||||
}
|
||||
|
||||
dword _tag::get_next_param(dword ps, pe)
|
||||
{
|
||||
// "ps" - param start
|
||||
// "pe" - param end
|
||||
// "q" - quote char
|
||||
char q = NULL;
|
||||
dword initial_pe = pe;
|
||||
dword fixeq;
|
||||
dword val;
|
||||
dword attr;
|
||||
|
||||
if (ESBYTE[pe] == '/') pe--;
|
||||
while (pe>ps) && (__isWhite(ESBYTE[pe])) pe--;
|
||||
|
||||
if (ESBYTE[pe] == '"') || (ESBYTE[pe] == '\'')
|
||||
{
|
||||
//remove quote
|
||||
q = ESBYTE[pe];
|
||||
ESBYTE[pe] = '\0';
|
||||
pe--;
|
||||
|
||||
//find VAL start and copy
|
||||
pe = strrchr(ps, q) + ps;
|
||||
val = pe;
|
||||
if (pe>ps) pe--;
|
||||
ESBYTE[pe] = '\0';
|
||||
|
||||
//find ATTR end
|
||||
while (pe > ps) && (ESBYTE[pe] != '=') pe--;
|
||||
ESBYTE[pe] = '\0';
|
||||
}
|
||||
else
|
||||
{
|
||||
//find VAL start and copy
|
||||
while (pe > ps) && (ESBYTE[pe] != '=') pe--;
|
||||
val = pe+1;
|
||||
ESBYTE[pe] = '\0';
|
||||
//already have ATTR end
|
||||
}
|
||||
|
||||
if (pe > ps) pe--;
|
||||
|
||||
//Fix case: "src ="
|
||||
while (pe>ps) && (__isWhite(ESBYTE[pe])) {
|
||||
ESBYTE[pe] = '\0';
|
||||
pe--;
|
||||
}
|
||||
|
||||
//find ATTR start and copy
|
||||
while (pe>ps) && (!__isWhite(ESBYTE[pe])) pe--;
|
||||
attr = pe + 1;
|
||||
ESBYTE[pe] = '\0';
|
||||
|
||||
// Fix case: src=./images/logo?sid=e8ece8b38b
|
||||
// Exchange '=' and '\0' position.
|
||||
// attr: src=./images/logo?sid => src
|
||||
// val: e8ece8b38b => ./images/logo?sid=e8ece8b38b
|
||||
fixeq = strchr(attr,'=');
|
||||
if (!q) && (fixeq) {
|
||||
ESBYTE[val-1] >< ESBYTE[fixeq];
|
||||
val = fixeq+1;
|
||||
}
|
||||
strlwr(attr);
|
||||
strrtrim(val);
|
||||
//Fix case: " img.png"
|
||||
while(__isWhite(ESBYTE[val])) && (val<initial_pe) val++;
|
||||
|
||||
attributes.add(attr);
|
||||
values.add(val);
|
||||
|
||||
if (pe==ps) return NULL;
|
||||
return pe;
|
||||
}
|
||||
|
||||
dword _tag::get_value_of(dword _attr_name)
|
||||
{
|
||||
int pos = attributes.get_pos_by_name(_attr_name);
|
||||
if (pos == -1) {
|
||||
value = 0;
|
||||
} else {
|
||||
value = values.get(pos);
|
||||
}
|
||||
return value;
|
||||
}
|
||||
|
||||
signed _tag::get_number_of(dword _attr_name)
|
||||
{
|
||||
if (get_value_of(_attr_name)) {
|
||||
number = atoi(value);
|
||||
} else {
|
||||
number = 0;
|
||||
}
|
||||
return number;
|
||||
}
|
||||
Binary file not shown.
|
Before Width: | Height: | Size: 3.2 KiB |
@@ -1,184 +0,0 @@
|
||||
CANVAS canvas;
|
||||
|
||||
void TWebBrowser::RenderLine(dword _line)
|
||||
{
|
||||
unsigned px; //paint x coordinate
|
||||
unsigned pw; //paint y coordinate
|
||||
dword pc; //paint color
|
||||
int zoom;
|
||||
|
||||
if (style.title)
|
||||
{
|
||||
strncpy(#header, _line, sizeof(TWebBrowser.header)-1);
|
||||
strncat(#header, " - ", sizeof(TWebBrowser.header)-1);
|
||||
strncat(#header, #version, sizeof(TWebBrowser.header)-1);
|
||||
}
|
||||
else if (t_html) && (!t_body) {
|
||||
//
|
||||
}
|
||||
else if (ESBYTE[_line])
|
||||
{
|
||||
pw = strlen(_line) * list.font_w;
|
||||
zoom = list.font_w / BASIC_CHAR_W;
|
||||
|
||||
//there is some shit happens!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
||||
if (debug_mode) && (pw > draw_w + BODY_MARGIN) {
|
||||
debugln("anomaly");
|
||||
debugln(_line);
|
||||
}
|
||||
|
||||
if (debug_mode) {
|
||||
canvas.DrawBar(draw_x, draw_y, pw, list.item_h, 0xCCCccc);
|
||||
debugln(_line);
|
||||
}
|
||||
|
||||
style.cur_line_h = math.max(style.cur_line_h, list.item_h);
|
||||
|
||||
if (!secondrun) goto _SKIP_DRAW;
|
||||
if (bg_colors.get_last() - bg_colors.get(0)) {
|
||||
canvas.DrawBar(draw_x, draw_y, pw, list.item_h, bg_colors.get_last());
|
||||
}
|
||||
|
||||
if (style.image) {
|
||||
canvas.DrawBar(draw_x, draw_y, pw, list.item_h-1, 0xF9DBCB);
|
||||
}
|
||||
if (style.button) {
|
||||
canvas.DrawBar(draw_x, draw_y, pw, list.item_h - calc(zoom*2), 0xCCCccc);
|
||||
canvas.DrawBar(draw_x, draw_y + list.item_h - calc(zoom*2), pw, zoom, 0x999999);
|
||||
}
|
||||
|
||||
pc = text_colors.get_last();
|
||||
if (link) && (pc == text_colors.get(0)) pc = link_color_default;
|
||||
|
||||
canvas.WriteText(draw_x, draw_y+1, list.font_type, pc, _line, NULL);
|
||||
if (style.b) canvas.WriteText(draw_x+1, draw_y+1, list.font_type, pc, _line, NULL);
|
||||
if (style.s) canvas.DrawBar(draw_x, list.item_h / 2 - zoom + draw_y, pw, zoom, pc);
|
||||
if (style.u) canvas.DrawBar(draw_x, draw_y + list.font_h, pw, zoom, pc);
|
||||
if (link) {
|
||||
if (ESBYTE[_line]==' ') && (ESBYTE[_line+1]==NULL) {} else {
|
||||
canvas.DrawBar(draw_x, draw_y + list.font_h, pw, zoom, link_color_default);
|
||||
links.add_text(draw_x, draw_y + list.y, pw, list.font_h, zoom);
|
||||
}
|
||||
}
|
||||
_SKIP_DRAW:
|
||||
draw_x += pw;
|
||||
}
|
||||
ESBYTE[_line] = NULL;
|
||||
}
|
||||
|
||||
void TWebBrowser::RenderTextbuf()
|
||||
{
|
||||
dword lbp = #linebuf;
|
||||
int br; //break position
|
||||
char nul = '\0';
|
||||
unsigned int len;
|
||||
|
||||
//Do we need a line break?
|
||||
|
||||
if (!linebuf[0]) return;
|
||||
|
||||
while (len = strlen(lbp)) && (len * list.font_w + draw_x - left_gap >= draw_w) {
|
||||
//Yes, we do. Lets calculate where...
|
||||
br = len;
|
||||
|
||||
//Is a new line fits in the maximum line width?
|
||||
if (br * list.font_w + draw_x - left_gap >= draw_w) {
|
||||
br = draw_w - draw_x + left_gap - BODY_MARGIN / list.font_w;
|
||||
if (br < 0) br = 0;
|
||||
while(br) {
|
||||
if (ESBYTE[lbp + br]==' ') || (ESBYTE[lbp + br]=='-') {
|
||||
if (br < len) br++;
|
||||
break;
|
||||
}
|
||||
br--;
|
||||
}
|
||||
}
|
||||
//Maybe a new line is too big for the whole new line? Then we have to split it
|
||||
if (!br) && (len * list.font_w >= draw_w) {
|
||||
br = draw_w - draw_x + left_gap - BODY_MARGIN / list.font_w;
|
||||
if (br < 0) {
|
||||
NewLine();
|
||||
br = draw_w - draw_x + left_gap - BODY_MARGIN / list.font_w;
|
||||
}
|
||||
}
|
||||
|
||||
if (br) {
|
||||
ESBYTE[lbp + br] >< nul;
|
||||
RenderLine(lbp);
|
||||
ESBYTE[lbp + br] >< nul;
|
||||
lbp += br;
|
||||
while (ESBYTE[lbp]==' ') && (ESBYTE[lbp]) lbp++;
|
||||
if (ESBYTE[lbp]) NewLine();
|
||||
} else {
|
||||
NewLine();
|
||||
}
|
||||
}
|
||||
RenderLine(lbp);
|
||||
}
|
||||
|
||||
void TWebBrowser::NewLine()
|
||||
{
|
||||
static bool empty_line = true;
|
||||
|
||||
if (draw_x==left_gap) && (draw_y==BODY_MARGIN) return;
|
||||
if (t_html) && (!t_body) return;
|
||||
|
||||
if (draw_x == style.tag_list.level * 5 * list.font_w + left_gap) {
|
||||
if (!empty_line) {
|
||||
empty_line=true;
|
||||
} else {
|
||||
return;
|
||||
}
|
||||
} else {
|
||||
empty_line = false;
|
||||
}
|
||||
|
||||
draw_y += style.cur_line_h;
|
||||
style.cur_line_h = list.item_h;
|
||||
if (style.blq) draw_x = 6 * list.font_w; else draw_x = 0; //left_gap += style.tag_list.level * 5 * list.font_w ???
|
||||
draw_x += style.tag_list.level * 5 * list.font_w + left_gap;
|
||||
}
|
||||
|
||||
bool TWebBrowser::RenderImage(dword cur_img)
|
||||
{
|
||||
int img_x, img_y, img_w, img_h;
|
||||
dword imgbuf[44];
|
||||
|
||||
if (!cur_img) || (!buf_data) return false;
|
||||
|
||||
img_h = ESDWORD[cur_img+8];
|
||||
img_w = ESDWORD[cur_img+4];
|
||||
|
||||
if (img_w + draw_x - left_gap >= draw_w) NewLine();
|
||||
img_y = draw_y;
|
||||
if (img_h < list.item_h) img_y += list.item_h - img_h / 2 - 1; else img_y -= 2;
|
||||
style.cur_line_h = math.max(style.cur_line_h, img_h);
|
||||
|
||||
img_w = math.min(img_w, canvas.bufw - draw_x);
|
||||
|
||||
if (link) links.add_text(draw_x + list.x, img_y + list.y, img_w, img_h, 0);
|
||||
|
||||
if (img_y + img_h >= canvas.bufh) canvas.IncreaseBufSize();
|
||||
|
||||
if (secondrun)
|
||||
{
|
||||
if (ESDWORD[cur_img+20] != IMAGE_BPP32) {
|
||||
img_convert stdcall(cur_img, 0, IMAGE_BPP32, 0, 0);
|
||||
$push eax
|
||||
img_destroy stdcall(cur_img);
|
||||
$pop eax
|
||||
cur_img = EAX;
|
||||
if (!EAX) return false;
|
||||
}
|
||||
imgbuf[04] = canvas.bufw;
|
||||
imgbuf[08] = canvas.bufh;
|
||||
imgbuf[20] = IMAGE_BPP32;
|
||||
imgbuf[24] = buf_data+8;
|
||||
img_blend stdcall(#imgbuf, cur_img, draw_x, img_y, 0, 0, img_w, img_h);
|
||||
img_destroy stdcall(cur_img);
|
||||
}
|
||||
|
||||
draw_x += img_w;
|
||||
if (draw_x - left_gap >= draw_w) NewLine();
|
||||
return true;
|
||||
}
|
||||
@@ -1,513 +0,0 @@
|
||||
void TWebBrowser::SetStyle()
|
||||
{
|
||||
if (tag.get_value_of("name")) || (tag.get_value_of("id")) {
|
||||
anchors.add(tag.value, draw_y);
|
||||
if (anchors.current) && (streq(tag.value, #anchors.current+1)) {
|
||||
list.first = draw_y;
|
||||
anchors.current = NULL;
|
||||
}
|
||||
}
|
||||
if (tag.is("a")) { tag_a(); return; }
|
||||
if (tag.is("p")) { tag_p(); return; }
|
||||
if (tag.is("img")) { tag_img(); return; }
|
||||
if (tag.is("kosicon")) { tag_kosicon(); return; }
|
||||
if (tag.is("div")) { tag_div(); return; }
|
||||
if (tag.is("br")) { /*draw_x++;*/NewLine(); return; }
|
||||
if (tag.is("nav")) { style.nav = tag.opened; return; }
|
||||
if (tag.is("header")) { NewLine(); return; }
|
||||
if (tag.is("article")) { NewLine(); return; }
|
||||
if (tag.is("footer")) { NewLine(); return; }
|
||||
if (tag.is("figure")) { NewLine(); return; }
|
||||
if (tag.is("w:p")) { NewLine(); return; }
|
||||
if (tag.is("b")) { style.b = tag.opened; return; }
|
||||
if (tag.is("strong")) { style.b = tag.opened; return; }
|
||||
if (tag.is("big")) { style.b = tag.opened; return; }
|
||||
if (tag.is("w:b")) { style.b = tag.opened; return; }
|
||||
if (tag.is("u")) { style.u = tag.opened; return; }
|
||||
if (tag.is("ins")) { style.u = tag.opened; return; }
|
||||
if (tag.is("s")) { style.s = tag.opened; return; }
|
||||
if (tag.is("strike")) { style.s = tag.opened; return; }
|
||||
if (tag.is("del")) { style.s = tag.opened; return; }
|
||||
if (tag.is("pre")) { style.pre = tag.opened; return; }
|
||||
if (tag.is("blockquote")) { style.blq = tag.opened; return; }
|
||||
if (tag.is("button")) { style.button = tag.opened; return; }
|
||||
if (tag.is("dl")) { if (tag.opened) NewLine(); return; }
|
||||
if (tag.is("w:r")) { if (!tag.opened) style.b = false; return; }
|
||||
if (tag.is("h1")) { tag_h1234_caption(); return; }
|
||||
if (tag.is("h2")) { tag_h1234_caption(); return; }
|
||||
if (tag.is("h3")) { tag_h1234_caption(); return; }
|
||||
if (tag.is("h4")) { tag_h1234_caption(); return; }
|
||||
if (tag.is("font")) { tag_font(); return; }
|
||||
if (tag.is("dt")) { tag_ol_ul_dt(); return; }
|
||||
if (tag.is("dd")) { tag_ol_ul_dt(); return; }
|
||||
if (tag.is("ul")) { tag_ol_ul_dt(); return; }
|
||||
if (tag.is("ol")) { tag_ol_ul_dt(); return; }
|
||||
if (tag.is("li")) { tag_li(); return; }
|
||||
if (tag.is("q")) { tag_q(); return; }
|
||||
if (tag.is("hr")) { tag_hr(); return; }
|
||||
if (tag.is("meta")) { tag_meta_xml(); return; }
|
||||
if (tag.is("?xml")) { tag_meta_xml(); return; }
|
||||
if (tag.is("code")) { tag_code(); return; }
|
||||
if (tag.is("iframe")) { tag_iframe(); return; }
|
||||
if (tag.is("caption")) { tag_h1234_caption(); return; }
|
||||
if (tag.is("title")) { tag_title(); return; }
|
||||
if (tag.is("body")) { tag_body(); return; }
|
||||
if (tag.is("html")) { t_html = tag.opened; return; }
|
||||
if (tag.is("table")) { tag_table(); return; }
|
||||
if (tag.is("tr")) { tag_table(); return; }
|
||||
if (tag.is("th")) { tag_table(); return; }
|
||||
if (tag.is("td")) { tag_table(); return; }
|
||||
}
|
||||
|
||||
void TWebBrowser::tag_p()
|
||||
{
|
||||
IF (tag.prior[0] == 'h') || (streq(#tag.prior,"td")) return;
|
||||
IF (!tag.opened) && (streq(#tag.prior,"p")) return;
|
||||
NewLine();
|
||||
}
|
||||
|
||||
void TWebBrowser::tag_title()
|
||||
{
|
||||
style.title = tag.opened;
|
||||
if (!tag.opened) DrawTitle(#header);
|
||||
}
|
||||
|
||||
void TWebBrowser::tag_font()
|
||||
{
|
||||
style.font = tag.opened;
|
||||
if (tag.opened)
|
||||
{
|
||||
if (tag.get_value_of("bg")) {
|
||||
bg_colors.add(GetColor(tag.value));
|
||||
} else {
|
||||
bg_colors.add(bg_colors.get_last());
|
||||
}
|
||||
if (tag.get_value_of("color")) {
|
||||
text_colors.add(GetColor(tag.value));
|
||||
} else {
|
||||
text_colors.add(text_colors.get_last());
|
||||
}
|
||||
}
|
||||
else {
|
||||
if (text_colors.count>1) text_colors.pop();
|
||||
if (bg_colors.count>1) bg_colors.pop(); //never pop the last color
|
||||
}
|
||||
}
|
||||
|
||||
void TWebBrowser::tag_div()
|
||||
{
|
||||
//if (streq(#tag.prior,"div")) && (tag.opened) return;
|
||||
if (streq(#tag.prior,"td")) return;
|
||||
if (streq(#tag.prior,"div")) return;
|
||||
if (!tag.opened) && (style.font) text_colors.pop();
|
||||
NewLine();
|
||||
}
|
||||
|
||||
void TWebBrowser::tag_iframe()
|
||||
{
|
||||
if (tag.get_value_of("src")) {
|
||||
NewLine();
|
||||
strcpy(#linebuf, "IFRAME: ");
|
||||
RenderTextbuf();
|
||||
link=true;
|
||||
links.add_link(tag.value);
|
||||
strncpy(#linebuf, tag.value, sizeof(TWebBrowser.linebuf)-1);
|
||||
RenderTextbuf();
|
||||
link=false;
|
||||
NewLine();
|
||||
}
|
||||
}
|
||||
|
||||
void TWebBrowser::tag_a()
|
||||
{
|
||||
if (!secondrun) return;
|
||||
if (tag.opened)
|
||||
{
|
||||
if (tag.get_value_of("href")) && (!strstr(tag.value,"javascript:"))
|
||||
{
|
||||
link = true;
|
||||
links.add_link(tag.value);
|
||||
}
|
||||
} else {
|
||||
link = false;
|
||||
}
|
||||
}
|
||||
|
||||
void TWebBrowser::tag_meta_xml()
|
||||
{
|
||||
if (secondrun) return;
|
||||
if (custom_encoding == -1) if (tag.get_value_of("charset"))
|
||||
|| (tag.get_value_of("content")) || (tag.get_value_of("encoding"))
|
||||
{
|
||||
EDX = strrchr(tag.value, '=') + tag.value; //search in content=
|
||||
if (ESBYTE[EDX] == '"') EDX++;
|
||||
strlwr(EDX);
|
||||
EAX = get_encoding_type_by_name(EDX);
|
||||
if (EAX!=-1) ChangeEncoding(EAX);
|
||||
}
|
||||
if (streq(tag.get_value_of("http-equiv"), "refresh")) && (tag.get_value_of("content")) {
|
||||
if (tag.value = strstri(tag.value, "url")) strcpy(#redirect, tag.value);
|
||||
}
|
||||
}
|
||||
|
||||
signed int get_encoding_type_by_name(dword name)
|
||||
{
|
||||
EDX = name;
|
||||
if (streqrp(EDX,"utf-8")) || (streqrp(EDX,"utf8")) return CH_UTF8;
|
||||
else if (streqrp(EDX,"windows-1251")) || (streqrp(EDX,"windows1251")) return CH_CP1251;
|
||||
else if (streqrp(EDX,"dos")) || (streqrp(EDX,"cp-866")) return CH_CP866;
|
||||
else if (streqrp(EDX,"iso-8859-5")) || (streqrp(EDX,"iso8859-5")) return CH_ISO8859_5;
|
||||
else if (streqrp(EDX,"koi8-r")) || (streqrp(EDX,"koi8-u")) return CH_KOI8;
|
||||
return -1;
|
||||
}
|
||||
|
||||
void TWebBrowser::tag_code()
|
||||
{
|
||||
if (style.pre = tag.opened) {
|
||||
bg_colors.add(0xe4ffcb);
|
||||
} else {
|
||||
if (bg_colors.count>1) bg_colors.pop(); //never pop the last color
|
||||
}
|
||||
}
|
||||
|
||||
void TWebBrowser::tag_ol_ul_dt()
|
||||
{
|
||||
char type = ESBYTE[#tag.name];
|
||||
switch(type)
|
||||
{
|
||||
case 'd':
|
||||
if (ESBYTE[#tag.name+1]=='d') style.tag_list.upd_level(tag.opened, type);
|
||||
if (ESBYTE[#tag.name+1]=='t') style.tag_list.upd_level(false, 'd');
|
||||
if (tag.opened) NewLine();
|
||||
break;
|
||||
case 'u':
|
||||
case 'o':
|
||||
if (style.nav) && (style.tag_list.level) NewLine();
|
||||
style.tag_list.upd_level(tag.opened, type);
|
||||
if (!tag.opened) && (!style.pre) NewLine();
|
||||
}
|
||||
}
|
||||
|
||||
void TWebBrowser::tag_li()
|
||||
{
|
||||
if (style.nav) {
|
||||
chrncat(#linebuf, ' ', sizeof(TWebBrowser.linebuf));
|
||||
} else if (tag.opened) {
|
||||
if (!style.tag_list.level) style.tag_list.upd_level(1, 'u');
|
||||
if (!style.pre) NewLine();
|
||||
if (style.tag_list.order_type() == 'u') {
|
||||
strcpy(#linebuf, "\31 ");
|
||||
draw_x = style.tag_list.level * 5 - 2 * list.font_w + left_gap;
|
||||
}
|
||||
if (style.tag_list.order_type() == 'o') {
|
||||
sprintf(#linebuf, "%i. ", style.tag_list.inc_counter());
|
||||
draw_x = style.tag_list.level * 5 - 1 - strlen(#linebuf) * list.font_w + left_gap;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void TWebBrowser::tag_hr()
|
||||
{
|
||||
dword hrcol = 0x00777777;
|
||||
dword hr_width = draw_w-BODY_MARGIN-BODY_MARGIN;
|
||||
dword hr_size = 1;
|
||||
if (tag.get_value_of("color")) {
|
||||
hrcol = GetColor(tag.value);
|
||||
}
|
||||
if (tag.get_value_of("width")) && (!strchr(tag.value, '%')) {
|
||||
hr_width = math.min(hr_width, tag.get_number_of("width"));
|
||||
}
|
||||
if (tag.get_number_of("size")) {
|
||||
hr_size = math.min(500, tag.number);
|
||||
}
|
||||
if (draw_x != left_gap) NewLine();
|
||||
if (secondrun) canvas.DrawBar(left_gap, style.cur_line_h / 2 + draw_y - 1, hr_width, hr_size, hrcol);
|
||||
draw_y += hr_size - 3;
|
||||
draw_x++;
|
||||
NewLine();
|
||||
return;
|
||||
}
|
||||
|
||||
void TWebBrowser::tag_body()
|
||||
{
|
||||
t_body = tag.opened;
|
||||
if (tag.get_value_of("link")) link_color_default = GetColor(tag.value);
|
||||
if (tag.get_value_of("alink")) link_color_active = GetColor(tag.value);
|
||||
if (tag.get_value_of("text")) text_colors.set(0, GetColor(tag.value));
|
||||
if (tag.get_value_of("bgcolor")) bg_colors.set(0, GetColor(tag.value));
|
||||
// Autodetecting encoding if no encoding was set
|
||||
if (tag.opened) && (custom_encoding==-1) && (cur_encoding == CH_CP866) {
|
||||
if (strstr(bufpointer, "\208\190")) ChangeEncoding(CH_UTF8);
|
||||
else if (chrnum(bufpointer, '\246')>5) ChangeEncoding(CH_CP1251);
|
||||
}
|
||||
}
|
||||
|
||||
void TWebBrowser::tag_q()
|
||||
{
|
||||
chrncat(#linebuf, '\"', sizeof(TWebBrowser.linebuf));
|
||||
}
|
||||
|
||||
void TWebBrowser::reset_font_style()
|
||||
{
|
||||
list.SetFont(BASIC_CHAR_W, 14, 10011000b);
|
||||
style.cur_line_h = list.item_h = list.font_h + 5;
|
||||
}
|
||||
|
||||
void TWebBrowser::tag_h1234_caption()
|
||||
{
|
||||
if (ESBYTE[#tag.name+1]=='4') {
|
||||
NewLine();
|
||||
NewLine();
|
||||
style.h = tag.opened;
|
||||
style.b = tag.opened;
|
||||
} else {
|
||||
style.h = tag.opened;
|
||||
if (tag.opened) {
|
||||
if (!style.pre) {
|
||||
NewLine();
|
||||
NewLine();
|
||||
}
|
||||
if (tag.is("h1")) {
|
||||
list.SetFont(BASIC_CHAR_W*2, 14+13, 10011001b);
|
||||
style.b = true;
|
||||
} else if (tag.is("h2")) {
|
||||
list.SetFont(BASIC_CHAR_W*2, 14+13, 10011001b);
|
||||
} else {
|
||||
list.SetFont(6*2, 9+8, 10001001b);
|
||||
}
|
||||
style.cur_line_h = list.item_h = list.font_h + 3;
|
||||
} else {
|
||||
if (tag.is("h1")) style.b = false;
|
||||
NewLine();
|
||||
reset_font_style();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void TWebBrowser::tag_kosicon()
|
||||
{
|
||||
dword imgbuf[44];
|
||||
dword maxicon;
|
||||
dword shared_i18 = memopen("ICONS18", NULL, SHM_READ);
|
||||
maxicon = EDX / 18 / 18 / 4;
|
||||
if (shared_i18) && (tag.get_number_of("n")) {
|
||||
if (tag.number < maxicon) {
|
||||
if (draw_x + 18 > canvas.bufw) NewLine();
|
||||
canvas.DrawImage(draw_x, draw_y-1, 18, 18, 18*18*4*tag.number+shared_i18);
|
||||
draw_x += 22;
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
void TWebBrowser::tag_img()
|
||||
{
|
||||
char img_path[4096]=0;
|
||||
dword base64img;
|
||||
|
||||
if (!tag.get_value_of("data-large-image"))
|
||||
if (!tag.get_value_of("data-src"))
|
||||
if (!tag.get_value_of("src")) return;
|
||||
|
||||
if (streqrp(tag.value, "data:")) {
|
||||
if (!strstr(tag.value, "base64,")) goto NOIMG;
|
||||
EDX = EAX+7;
|
||||
if (ESBYTE[EDX]==' ') EDX++;
|
||||
base64img = malloc(strlen(EDX));
|
||||
base64_decode stdcall (EDX, base64img, strlen(EDX));
|
||||
img_decode stdcall (base64img, EAX, 0);
|
||||
$push eax
|
||||
free(base64img);
|
||||
$pop eax
|
||||
if (EAX) goto IMGOK; else goto NOIMG;
|
||||
}
|
||||
|
||||
if (!strcmp(tag.value + strrchr(tag.value, '.'), "svg")) goto NOIMG;
|
||||
if (!strcmp(tag.value + strrchr(tag.value, '.'), "webp")) goto NOIMG;
|
||||
|
||||
strlcpy(#img_path, tag.value, sizeof(img_path)-1);
|
||||
replace_char(#img_path, ' ', '\0', sizeof(img_path)-1);
|
||||
get_absolute_url(#img_path, history.current());
|
||||
|
||||
if (check_is_the_adress_local(#img_path)) {
|
||||
img_from_file stdcall(#img_path);
|
||||
if (EAX) goto IMGOK; else goto NOIMG;
|
||||
}
|
||||
|
||||
if (cache.has(#img_path)) {
|
||||
img_decode stdcall (cache.current_buf, cache.current_size, 0);
|
||||
if (EAX) goto IMGOK; else goto NOIMG;
|
||||
} else {
|
||||
if (img_url.get_pos_by_name(#img_path)==-1) img_url.add(#img_path);
|
||||
goto NOIMG;
|
||||
}
|
||||
|
||||
IMGOK:
|
||||
if (RenderImage(EAX)) return;
|
||||
|
||||
NOIMG:
|
||||
if (tag.get_value_of("title")) || (tag.get_value_of("alt")) {
|
||||
strncpy(#img_path, tag.value, sizeof(TWebBrowser.linebuf)-3);
|
||||
sprintf(#linebuf, "[%s]", #img_path);
|
||||
} else {
|
||||
if (streqrp(#img_path, "data:")) img_path=0;
|
||||
replace_char(#img_path, '?', NULL, strlen(#img_path));
|
||||
img_path[sizeof(TWebBrowser.linebuf)-3] = '\0'; //prevent overflow in sprintf
|
||||
sprintf(#linebuf, "[%s]", #img_path+strrchr(#img_path, '/'));
|
||||
linebuf[50]= NULL;
|
||||
}
|
||||
text_colors.add(0x9A6F29);
|
||||
style.image = true;
|
||||
RenderTextbuf();
|
||||
style.image = false;
|
||||
text_colors.pop();
|
||||
}
|
||||
|
||||
struct TABLE {
|
||||
int depth;
|
||||
int margin;
|
||||
collection_int cols;
|
||||
} table;
|
||||
|
||||
unsigned table_id;
|
||||
unsigned colcount;
|
||||
unsigned tr_pos;
|
||||
unsigned td_pos;
|
||||
unsigned row_start_y;
|
||||
unsigned tallest_cell_in_row;
|
||||
unsigned cur_cell_w;
|
||||
|
||||
void TWebBrowser::tag_table_reset()
|
||||
{
|
||||
table_id = 0;
|
||||
colcount = 0;
|
||||
tr_pos = 0;
|
||||
td_pos = 0;
|
||||
table.depth = 0;
|
||||
cur_cell_w = 0;
|
||||
}
|
||||
|
||||
void TWebBrowser::tag_table()
|
||||
{
|
||||
if (!tag.opened) {
|
||||
if (style.font) tag_font();
|
||||
if (link) tag_a();
|
||||
style.b = false;
|
||||
}
|
||||
if (tag.is("table")) {
|
||||
if(tag.opened) {
|
||||
table.depth++;
|
||||
if (table.depth==1) {
|
||||
table_id++;
|
||||
colcount = 0;
|
||||
td_pos = 0;
|
||||
row_start_y = draw_y;
|
||||
if (tag.get_number_of("width")) {
|
||||
if (strchr(tag.value, '%')) tag.number = list.w * tag.number / 100;
|
||||
cur_cell_w = math.min(tag.number,list.w);
|
||||
} else {
|
||||
cur_cell_w = list.w;
|
||||
}
|
||||
}
|
||||
} else {
|
||||
if (table.depth>0) {
|
||||
table.depth--;
|
||||
}
|
||||
if (table.depth==0) {
|
||||
draw_x = left_gap = style.tag_list.level * 5 * list.font_w + BODY_MARGIN;
|
||||
draw_w = list.w;
|
||||
if (td_pos) draw_y = math.max(draw_y, tallest_cell_in_row);
|
||||
draw_y = math.max(draw_y+style.cur_line_h, tallest_cell_in_row);
|
||||
row_start_y = tallest_cell_in_row = draw_y;
|
||||
style.cur_line_h = list.item_h;
|
||||
}
|
||||
}
|
||||
}
|
||||
if (table.depth>1) {
|
||||
if (tag.is("tr")) && (tag.opened) NewLine();
|
||||
return;
|
||||
}
|
||||
|
||||
if (!secondrun) {
|
||||
if (tag.is("tr")) {
|
||||
if (tag.opened) {
|
||||
table.cols.add(1);
|
||||
}
|
||||
colcount = 0;
|
||||
}
|
||||
if (tag.opened) if (tag.is("td")) || (tag.is("th")) {
|
||||
if (!table.cols.count) { table.cols.add(1); colcount = 0;}
|
||||
colcount++;
|
||||
if (colcount) table.cols.set(table.cols.count-1, colcount);
|
||||
//if (tag.get_number_of("colspan")) colcount += tag.number-1;
|
||||
}
|
||||
} else {
|
||||
if (tag.is("tr")) {
|
||||
if (tag.opened) {
|
||||
if (td_pos) draw_y = math.max(draw_y, tallest_cell_in_row);
|
||||
_TR_FIX:
|
||||
if (draw_x==left_gap) && (draw_y==BODY_MARGIN) {
|
||||
row_start_y = tallest_cell_in_row = draw_y;
|
||||
} else {
|
||||
row_start_y = tallest_cell_in_row = draw_y = draw_y + style.cur_line_h;
|
||||
}
|
||||
style.cur_line_h = list.item_h;
|
||||
tr_pos++;
|
||||
td_pos = 0;
|
||||
} else {
|
||||
draw_y = math.max(draw_y, tallest_cell_in_row);
|
||||
td_pos = 0;
|
||||
}
|
||||
draw_x = left_gap = style.tag_list.level * 5 * list.font_w + BODY_MARGIN;
|
||||
draw_w = list.w;
|
||||
}
|
||||
if (tag.is("td")) || (tag.is("th")) {
|
||||
|
||||
if (!tr_pos) goto _TR_FIX;
|
||||
|
||||
tallest_cell_in_row = math.max(draw_y+style.cur_line_h-list.item_h+1, tallest_cell_in_row);
|
||||
style.cur_line_h = list.item_h;
|
||||
if (tag.opened)
|
||||
{
|
||||
if (!td_pos) {
|
||||
table.margin = list.w - cur_cell_w / 2 + BODY_MARGIN;
|
||||
draw_x = left_gap = table.margin;
|
||||
draw_w = cur_cell_w - BODY_MARGIN;
|
||||
} else {
|
||||
draw_x = left_gap = left_gap + draw_w;
|
||||
draw_w = cur_cell_w - left_gap + table.margin - BODY_MARGIN;
|
||||
}
|
||||
|
||||
if (EAX = table.cols.get(tr_pos-1)-td_pos) {
|
||||
draw_w /= EAX;
|
||||
} else {
|
||||
draw_y = row_start_y;
|
||||
draw_x = left_gap = table.margin;
|
||||
}
|
||||
if (table.cols.get(tr_pos-1)-td_pos>1) && (tag.get_number_of("width")) {
|
||||
if (strchr(tag.value, '%')) {
|
||||
tag.number = cur_cell_w * tag.number / 100; //
|
||||
}
|
||||
if (tag.number < list.w - table.margin - left_gap) draw_w = tag.number;
|
||||
|
||||
}
|
||||
draw_y = row_start_y;
|
||||
td_pos++;
|
||||
}
|
||||
}
|
||||
}
|
||||
if (draw_x > cur_cell_w) {
|
||||
draw_x = left_gap = table.margin;
|
||||
draw_w = cur_cell_w - table.margin - 23 - left_gap;
|
||||
table.depth = 0;
|
||||
NewLine();
|
||||
if (debug_mode) {
|
||||
debugln("anomaly draw_x");
|
||||
canvas.DrawBar(0, draw_y, 20, 20, 0xFF0000);
|
||||
}
|
||||
}
|
||||
//if (left_gap + draw_w > list.w) {
|
||||
// draw_w = list.w - left_gap;
|
||||
// if (debug_mode) debugln("anomaly draw_W");
|
||||
//}
|
||||
}
|
||||
@@ -1,117 +0,0 @@
|
||||
char *unicode_symbols[]={
|
||||
"quot","\"",
|
||||
"amp", "&",
|
||||
"lt", "<",
|
||||
"gt", ">",
|
||||
"#183","\31", "middot", "\31",
|
||||
"#149","-",
|
||||
"#151","-",
|
||||
"#160"," ", "nbsp", "\t", "emsp", " ",
|
||||
"#169","(c)", "copy", "(c)",
|
||||
"#171","<<", "laquo","<<",
|
||||
"#174","(r)", "reg", "(r)",
|
||||
"#187",">>", "raquo",">>",
|
||||
"hellip", "...",
|
||||
|
||||
"trade", "[TM]",
|
||||
"bdquo", ",,",
|
||||
|
||||
"minus", "-",
|
||||
"ndash", "-",
|
||||
"mdash", "-", //--
|
||||
|
||||
"rsquo", "'", "apos", "'",
|
||||
"sect", "#",
|
||||
|
||||
"ensp", " ",
|
||||
"emsp13", " ",
|
||||
"emsp14", " ",
|
||||
"numsp", " ",
|
||||
"puncsp", " ",
|
||||
"thinsp", " ",
|
||||
|
||||
"#1028", "\242",
|
||||
"#1030", "I",
|
||||
"#1031", "\244",
|
||||
|
||||
"#8211", "-",
|
||||
"#8212", "-",
|
||||
"#8217", "'",
|
||||
"#8220", "\"",
|
||||
"#8222", "\"", "ldquo", "\"",
|
||||
"#8221", "\"", "rdquo", "\"",
|
||||
"#8470", "N",
|
||||
"#8722", "-",
|
||||
"#9642", "-", //square in the middle of the line
|
||||
"#9658", ">",
|
||||
"#9660", "v",
|
||||
"#10094", "<",
|
||||
"#10095", ">",
|
||||
"#65122", "+",
|
||||
|
||||
"#8594", "->",
|
||||
"#8627", "->",
|
||||
|
||||
"uarr", "^",
|
||||
"darr", "v",
|
||||
"rarr", "->",
|
||||
"larr", "<-",
|
||||
|
||||
"bull", "\31",
|
||||
"percnt","%",
|
||||
|
||||
"#xfeff", "",
|
||||
|
||||
"times", "x",
|
||||
"lowast","*",
|
||||
|
||||
"#128154","<3",
|
||||
"#128545",":(",
|
||||
|
||||
0};
|
||||
|
||||
|
||||
unsigned char unicode_chars[] = "АБВГДЕЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯабвгдежзийклмнопрстуфхцчшщъыьэюяЁёhг\243i\105\244\0";
|
||||
|
||||
bool GetUnicodeSymbol(dword _line, line_size, bufpos, buf_end)
|
||||
{
|
||||
int i;
|
||||
int code;
|
||||
char special_code[10];
|
||||
bool white_end = false;
|
||||
dword bufstart = bufpos;
|
||||
|
||||
for (i=0; i<9; i++, bufpos++)
|
||||
{
|
||||
if (__isWhite(ESBYTE[bufpos])) {bufpos--; break;}
|
||||
if (ESBYTE[bufpos] == ';') || (bufpos >= buf_end) break;
|
||||
if (!strchr("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789#", ESBYTE[bufpos])) {bufpos--; break;}
|
||||
special_code[i] = ESBYTE[bufpos];
|
||||
}
|
||||
special_code[i] = '\0';
|
||||
|
||||
for (i=0; unicode_symbols[i]!=0; i+=2;)
|
||||
{
|
||||
if (!strcmp(#special_code, unicode_symbols[i]))
|
||||
{
|
||||
strncat(_line, unicode_symbols[i+1], line_size);
|
||||
return bufpos;
|
||||
}
|
||||
}
|
||||
|
||||
if (special_code[0]=='#')
|
||||
{
|
||||
code = atoi(#special_code + 1);
|
||||
if (code>=0) && (code<=255) {
|
||||
chrncat(_line, code, line_size); //NOT ALL ASCII CODES IN KOLIBRI ARE COMPATABLE WITH STANDARDS
|
||||
return bufpos;
|
||||
}
|
||||
if (code>=1040) && (code<=1040+72) {
|
||||
chrncat(_line, unicode_chars[code-1040], line_size);
|
||||
return bufpos;
|
||||
}
|
||||
}
|
||||
|
||||
chrncat(_line, '&', line_size);
|
||||
return bufstart;
|
||||
}
|
||||
@@ -1,38 +0,0 @@
|
||||
struct LIST
|
||||
{
|
||||
int level;
|
||||
char ordered[5];
|
||||
int counter[5];
|
||||
void reset();
|
||||
void upd_level();
|
||||
int inc_counter();
|
||||
char order_type();
|
||||
};
|
||||
|
||||
void LIST::reset()
|
||||
{
|
||||
level = 0;
|
||||
}
|
||||
|
||||
void LIST::upd_level(int direction, char type)
|
||||
{
|
||||
if (direction == 1) && (level<5) {
|
||||
level++;
|
||||
counter[level] = 0;
|
||||
ordered[level] = type;
|
||||
}
|
||||
if (direction == 0) && (level>0) {
|
||||
level--;
|
||||
}
|
||||
}
|
||||
|
||||
int LIST::inc_counter()
|
||||
{
|
||||
counter[level]++;
|
||||
return counter[level];
|
||||
}
|
||||
|
||||
char LIST::order_type()
|
||||
{
|
||||
return ordered[level];
|
||||
}
|
||||
@@ -1,6 +0,0 @@
|
||||
if tup.getconfig("NO_CMM") ~= "" then return end
|
||||
if tup.getconfig("LANG") == "ru_RU"
|
||||
then C_LANG = "LANG_RUS"
|
||||
else C_LANG = "LANG_ENG" -- this includes default case without config
|
||||
end
|
||||
tup.rule("WebView.c", "c-- /D=$(C_LANG) /OPATH=%o %f" .. tup.getconfig("KPACK_CMD"), "WebView.com")
|
||||
File diff suppressed because it is too large.
Load diff
@@ -1,17 +0,0 @@
|
||||
@ECHO OFF
|
||||
|
||||
@c-- /D=LANG_RUS WebView.c
|
||||
@del WebView
|
||||
@rename WebView.com WebView
|
||||
@del warning.txt
|
||||
|
||||
if not exist WebView ( @pause )
|
||||
|
||||
if exist WebView (
|
||||
"C:\Program Files (x86)\WinImage\winimage.exe" "C:\Users\leency\Desktop\kolibri.img" /H /Q /I WebView
|
||||
d:
|
||||
cd "D:\Kolibri\Infrastructure\QEMU"
|
||||
call "C:\Users\leency\Desktop\qemu.bat"
|
||||
) else (
|
||||
pause
|
||||
)
|
||||
@@ -1 +0,0 @@
|
||||
c-- -D=LANG_ENG WebView.c
|
||||
@@ -1,64 +0,0 @@
|
||||
enum {
|
||||
PAGE=1, IMG, FILE
|
||||
};
|
||||
|
||||
struct _cache
|
||||
{
|
||||
dword current_buf;
|
||||
dword current_size;
|
||||
dword current_type;
|
||||
dword current_charset;
|
||||
collection url;
|
||||
collection_int data;
|
||||
collection_int size;
|
||||
collection_int type;
|
||||
collection_int charset;
|
||||
void add();
|
||||
bool has();
|
||||
void clear();
|
||||
} cache;
|
||||
|
||||
void _cache::add(dword _url, _data, _size, _type, _charset)
|
||||
{
|
||||
dword data_pointer;
|
||||
data_pointer = malloc(_size);
|
||||
memmov(data_pointer, _data, _size);
|
||||
data.add(data_pointer);
|
||||
|
||||
url.add(_url);
|
||||
size.add(_size);
|
||||
type.add(_type);
|
||||
charset.add(_charset);
|
||||
|
||||
current_buf = data_pointer;
|
||||
current_size = _size;
|
||||
}
|
||||
|
||||
bool _cache::has(dword _link)
|
||||
{
|
||||
int pos;
|
||||
if (!url.count) return false;
|
||||
pos = url.get_pos_by_name(_link);
|
||||
if (pos != -1) {
|
||||
current_buf = data.get(pos);
|
||||
current_size = size.get(pos);
|
||||
current_type = type.get(pos);
|
||||
current_charset = charset.get(pos);
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
void _cache::clear()
|
||||
{
|
||||
int i;
|
||||
for (i=0; i<data.count; i++) free(data.get(i));
|
||||
url.drop();
|
||||
data.drop();
|
||||
size.drop();
|
||||
type.drop();
|
||||
current_buf = NULL;
|
||||
current_size = NULL;
|
||||
current_type = NULL;
|
||||
current_charset = NULL;
|
||||
}
|
||||
@@ -1,118 +0,0 @@
|
||||
#ifdef LANG_RUS
|
||||
//===================================================//
|
||||
// //
|
||||
// CYRILLIC //
|
||||
// //
|
||||
//===================================================//
|
||||
char buildin_page_error[] = FROM "res/page_not_found_ru.htm";
|
||||
char buildin_page_home[] = FROM "res/homepage_ru.htm";
|
||||
char buildin_page_help[] = FROM "res/help_ru.htm";
|
||||
char accept_language[]= "Accept-Language: ru\n";
|
||||
char rmb_menu[] =
|
||||
"Back|Ctrl+<
|
||||
Forward|Ctrl+>
|
||||
-
|
||||
Посмотреть исходник|Ctrl+U
|
||||
Редактировать исходник|F2";
|
||||
char main_menu[] =
|
||||
"Открыть файл...|Ctrl+O
|
||||
Новое окно|Ctrl+N
|
||||
-
|
||||
История|Ctrl+H
|
||||
Менеджер загрузок|Ctrl+J
|
||||
Настройки|Ctrl+E
|
||||
Очистить кэш|Ctrl+F5
|
||||
Обновить браузер";
|
||||
char link_menu[] =
|
||||
"Открыть в новой вкладке
|
||||
Открыть в новом окне
|
||||
-
|
||||
Копировать ссылку
|
||||
Скачать содержимое ссылки";
|
||||
char loading_text[] = "Загрузка...";
|
||||
|
||||
char update_param[] = "-e http://builds.kolibrios.org/ru_RU/data/programs/cmm/browser/WebView.com";
|
||||
char update_download_error[] = "'WebView\nОшибка при получении обновлений!' -tE";
|
||||
char update_ok[] = "'WebView\nБраузер был успешно обновлен!' -tO";
|
||||
char update_is_current[] = "'WebView\nВы уже используете последнюю версию.' -tI";
|
||||
char update_can_not_copy[] = "'WebView\nНе могу переместить новую версию из папки Downloads на Ramdisk. Возможно, не достаточно места.' -tE";
|
||||
char clear_cache_ok[] = "'WebView\nКэш очищен.' -tI";
|
||||
#define T_RENDERING "Рендеринг страницы..."
|
||||
#define T_DONE_IN_SEC "Готово: %i сек (%i милисек)"
|
||||
#else
|
||||
//===================================================//
|
||||
// //
|
||||
// ENGLISH //
|
||||
// //
|
||||
//===================================================//
|
||||
char buildin_page_error[] = FROM "res/page_not_found_en.htm";
|
||||
char buildin_page_home[] = FROM "res/homepage_en.htm";
|
||||
char buildin_page_help[] = FROM "res/help_en.htm";
|
||||
char accept_language[]= "Accept-Language: en\n";
|
||||
char rmb_menu[] =
|
||||
"Back|Ctrl+<
|
||||
Forward|Ctrl+>
|
||||
-
|
||||
View source|Ctrl+U
|
||||
Edit source|F2";
|
||||
char main_menu[] =
|
||||
"Open local file...|Ctrl+O
|
||||
New window|Ctrl+N
|
||||
-
|
||||
History|Ctrl+H
|
||||
Download Manager|Ctrl+J
|
||||
Settings|Ctrl+E
|
||||
Clear cache|Ctrl+F5
|
||||
Update browser";
|
||||
char link_menu[] =
|
||||
"Open in new tab
|
||||
Open in new window
|
||||
-
|
||||
Copy link
|
||||
Download link contents";
|
||||
char loading_text[] = "Loading...";
|
||||
char update_param[] = "-e http://builds.kolibrios.org/en_US/data/programs/cmm/browser/WebView.com";
|
||||
char update_download_error[] = "'WebView\nError receiving update information!' -tE";
|
||||
char update_ok[] = "'WebView\nThe browser has been updated!' -tO";
|
||||
char update_is_current[] = "'WebView\nThe browser is up to date.' -tI";
|
||||
char update_can_not_copy[] = "'WebView\nError copying a new version from Downloads folder!\nProbably too litle space on Ramdisk.' -tE";
|
||||
char clear_cache_ok[] = "'WebView\nThe cache has been cleared.' -tI";
|
||||
#define T_RENDERING "Rendering..."
|
||||
#define T_DONE_IN_SEC "Done in %i sec (%i milisec)"
|
||||
#endif
|
||||
|
||||
//===================================================//
|
||||
// //
|
||||
// GLOBAL //
|
||||
// //
|
||||
//===================================================//
|
||||
|
||||
char buildin_page_test[] = FROM "res/test.htm";
|
||||
|
||||
#define URL_SERVICE_HISTORY "WebView:history"
|
||||
#define URL_SERVICE_HOMEPAGE "WebView:home"
|
||||
#define URL_SERVICE_TEST "WebView:test"
|
||||
|
||||
char webview_shared[] = "WEBVIEW";
|
||||
|
||||
enum {
|
||||
NEW_TAB=600,
|
||||
ENCODINGS=700,
|
||||
BACK_BUTTON=800,
|
||||
FORWARD_BUTTON, VIEW_SOURCE, EDIT_SOURCE,
|
||||
REFRESH_BUTTON, GOTOURL_BUTTON, CHANGE_ENCODING,
|
||||
GO_BUTTON, SEARCH_BUTTON, SANDWICH_BUTTON,
|
||||
OPEN_FILE, NEW_WINDOW, VIEW_HISTORY, DOWNLOAD_MANAGER,
|
||||
OPEN_SETTINGS, CLEAR_CACHE, UPDATE_BROWSER, IN_NEW_TAB, IN_NEW_WINDOW,
|
||||
COPY_LINK_URL, DOWNLOAD_LINK_CT, TAB_ID,
|
||||
TAB_CLOSE_ID = 900
|
||||
};
|
||||
|
||||
char editbox_icons[] = FROM "res/editbox_icons.raw";
|
||||
|
||||
#define WIN_W 850
|
||||
#define WIN_H 920
|
||||
|
||||
#define DEFAULT_URL URL_SERVICE_HOMEPAGE
|
||||
|
||||
char version[]="WebView 3.98";
|
||||
@@ -1,36 +0,0 @@
|
||||
#ifdef LANG_RUS
|
||||
#define HISTORY_HEADER "<html><title>История</title><body bgcolor=#fff><h3>Посещенные страницы</h3><br>"
|
||||
#else
|
||||
#define HISTORY_HEADER "<html><title>History</title><body bgcolor=#fff><h3>Visited pages</h3><br>"
|
||||
#endif
|
||||
|
||||
|
||||
ShowHistory()
|
||||
{
|
||||
int i;
|
||||
dword history_pointer = malloc(history.items.data_size+256);
|
||||
strcat(history_pointer, HISTORY_HEADER);
|
||||
|
||||
for (i=0; i<history.items.count-1; i++) //if (cache.type.get(i) == PAGE)
|
||||
{
|
||||
strcat(history_pointer, "<kosicon n=3><a href='");
|
||||
strcat(history_pointer, history.items.get(i));
|
||||
strcat(history_pointer, "'>");
|
||||
strcat(history_pointer, history.items.get(i));
|
||||
strcat(history_pointer, "</a><br>");
|
||||
}
|
||||
|
||||
/*
|
||||
strcat(history_pointer, "<br><b>Cached images</b><br>");
|
||||
for (i=1; i<cache.url.count; i++) if (cache.type.get(i) == IMG)
|
||||
{
|
||||
strcat(history_pointer, cache.url.get(i));
|
||||
strcat(history_pointer, " <img src='");
|
||||
strcat(history_pointer, cache.url.get(i));
|
||||
strcat(history_pointer, "'><br>");
|
||||
}
|
||||
*/
|
||||
|
||||
LoadInternalPage(history_pointer, strlen(history_pointer));
|
||||
free(history_pointer);
|
||||
}
|
||||
Binary file not shown.
|
Before Width: | Height: | Size: 1.1 KiB |
@@ -1 +0,0 @@
|
||||
▐▐▌бЯЮВБ~xwtВБ~бЯЮ▐▐▌ ╜╗╗ ¤¤¤млк{xuЙЕГСОМЦУССОМЙЕГ{xuмлл╗╗╣rpm нмй~{ПНКЙЕГ~{x{xu|yЙЕГПНККЖДЙЕГxvs ▐▐▌{xuПНКБ|ввЯччх√√√ччхеввКИДЩХТЩХТyxu вЯЯЙЕГЙЕГввЯ ╛╜╗КЖДЩХТЩХТyxu ГБСОМ~{xччх ╜╗╗rpmxvsyxuyxutqo xwtЦУС{xu··· ДБСОМ~{xшчч бЮЭЙЕГЙЕГдба пон}yx┤│▓ ▌▌▌{xuПНКБ|двбччч√√√чччдвб~{ЙЕГ|yv нкк~{ПНКЙЕГ~{x{xu~{xЙЕГПНК~{нлй √√√нкк{xuЙЕГСОМЦУССОМЙЕГ{xuнкк№№№ ▐▌▌вЯЯВБxwtВБвЯЯ▐▌▌ ▄▄▄ ,╨ ,╨ ,╨ФОъ,╨ ,╨ФОъ,╨ ,╨ФОъJA┘JA┘JA┘ JA┘ФОъJA┘JA┘,╨ ,╨JA┘JA┘JA┘JA┘JA┘JA┘JA┘JA┘JA┘JA┘JA┘JA┘,╨ жJA┘JA┘JA┘JA┘JA┘JA┘JA┘JA┘JA┘JA┘JA┘,╨ ж жJA┘JA┘JA┘JA┘JA┘JA┘JA┘JA┘JA┘,╨ ж ,╨JA┘JA┘JA┘JA┘JA┘JA┘JA┘,╨ ж ,╨JA┘JA┘JA┘JA┘JA┘JA┘,╨ ,╨JA┘JA┘JA┘JA┘JA┘JA┘JA┘JA┘ ж ,╨ФОъJA┘JA┘JA┘JA┘JA┘JA┘JA┘JA┘JA┘,╨ ,╨ФОъJA┘JA┘JA┘JA┘,╨,╨JA┘JA┘JA┘JA┘JA┘,╨ ,╨JA┘JA┘JA┘JA┘,╨ ,╨JA┘JA┘JA┘,╨ ж ,╨JA┘,╨ ж ,╨JA┘,╨ ж ж ж ,╨ ж ▄▄▄
|
||||
@@ -1,19 +0,0 @@
|
||||
<html><title>WebView Help</title><body>
|
||||
|
||||
<h1>WebView Text-Based Browser</h1>
|
||||
|
||||
It is free and open-source. If you have any suggestions or want to help improving it please visit its topic at <a href="//board.kolibrios.org/viewtopic.php?f=40&t=1075">board.kolibrios.org</a><pre>
|
||||
|
||||
<b>Shortcut keys</b>
|
||||
|
||||
<font bg=C7CEE4>[CTRL + N or CTRL + T]</font> New window
|
||||
<font bg=C7CEE4>[CTRL + R or F5]</font> Refresh the current page
|
||||
<font bg=C7CEE4>[CTRL + O]</font> Start OpenDialog to open local file
|
||||
<font bg=C7CEE4>[CTRL + U]</font> View a web page's source code
|
||||
<font bg=C7CEE4>[CTRL + H]</font> Open browser history
|
||||
<font bg=C7CEE4>[CTRL + J]</font> Display the file downloader
|
||||
<font bg=C7CEE4>[CTRL + W]</font> Exit browser
|
||||
<font bg=C7CEE4>[CTRL + ENTER]</font> Submit a web search
|
||||
<font bg=C7CEE4>[CTRL + LEFT]</font> Back a page.
|
||||
<font bg=C7CEE4>[CTRL + RIGHT]</font> Forward a page.
|
||||
<font bg=C7CEE4>[F6]</font> Moves a text cursor to the omnibox
|
||||
@@ -1,17 +0,0 @@
|
||||
<html>
|
||||
<meta charset="cp-866">
|
||||
<title>Справка WebView</title>
|
||||
<body><pre><h1>Справка WebView</h1>
|
||||
<b>Клавиши быстрого вызова</b>
|
||||
|
||||
<font bg=C7CEE4>[CTRL + N или CTRL + T]</font> Новое окно
|
||||
<font bg=C7CEE4>[CTRL + R или F5]</font> Перезагрузить страницу
|
||||
<font bg=C7CEE4>[CTRL + O]</font> Вызвать диалог выбора файла
|
||||
<font bg=C7CEE4>[CTRL + U]</font> Смотреть исходный код страницы
|
||||
<font bg=C7CEE4>[CTRL + H]</font> Смотреть историю посещенных страниц
|
||||
<font bg=C7CEE4>[CTRL + J]</font> Открыть загрузчик файлов
|
||||
<font bg=C7CEE4>[CTRL + W]</font> Закрыть браузер
|
||||
<font bg=C7CEE4>[CTRL + ENTER]</font> Поиск в интернете с помощью Google
|
||||
<font bg=C7CEE4>[CTRL + ВЛЕВО]</font> Аналогично кнопке "Назад" в браузере
|
||||
<font bg=C7CEE4>[CTRL + ВПРАВО]</font> Аналогично кнопке "Вперед"
|
||||
<font bg=C7CEE4>[F6]</font> Перемещает текстовый курсор в омнибокс
|
||||
@@ -1,121 +0,0 @@
|
||||
enum { TAG, OPTION_VALUE, TEXT, COMMENT, INLINE_COMMENT, CODE };
|
||||
|
||||
|
||||
|
||||
char* C_HL_keywords[] = {
|
||||
"switch", "if", "while", "for", "break", "continue", "return", "else",
|
||||
"union", "typedef", "static", "class", "case", "#include",
|
||||
"volatile", "register", "sizeof", "typedef", "union", "goto", "const", "auto",
|
||||
"#define", "#endif", "#error", "#ifdef", "#ifndef", "#undef", "#if", "#else",
|
||||
"inline",
|
||||
|
||||
"int ", "dword ", "long ", "double ", "float ", "char ", "unsigned ", "signed ",
|
||||
"void ", "bool ", "enum ", "byte ", "word ", "struct ", "NULL", "loop", "stdcall ",
|
||||
":void ", ":int ", ":bool ", ":dword ", NULL
|
||||
};
|
||||
|
||||
dword ShowCodeSource(dword _bufpointer, _bufsize)
|
||||
{
|
||||
dword new_buf, new_buf_start, i;
|
||||
int mode = CODE;
|
||||
|
||||
char spstr[64];
|
||||
dword keylen;
|
||||
dword keyn;
|
||||
dword keycolor;
|
||||
|
||||
new_buf = malloc(_bufsize*10);
|
||||
new_buf_start = new_buf;
|
||||
sprintf(new_buf,"<html><head><title>%s</title><body><pre>",#current_path);
|
||||
new_buf += strlen(new_buf);
|
||||
for (i=_bufpointer; i<_bufpointer+_bufsize; i++)
|
||||
{
|
||||
if ('<' == ESBYTE[i]) {
|
||||
strcpy(new_buf, "<");
|
||||
new_buf+=4;
|
||||
continue;
|
||||
}
|
||||
if ('>' == ESBYTE[i]) {
|
||||
strcpy(new_buf, ">");
|
||||
new_buf+=4;
|
||||
continue;
|
||||
}
|
||||
if (ESBYTE[i] >= '0') && (ESBYTE[i] <= '9') && (CODE == mode) {
|
||||
strcpy(new_buf, "<font color=#CF00FF>?</font>");
|
||||
ESBYTE[new_buf+20] = ESBYTE[i];
|
||||
new_buf+=28;
|
||||
if (ESBYTE[i+1] == 'x') {
|
||||
strcpy(new_buf, "<font color=#CF00FF>x</font>");
|
||||
new_buf+=28;
|
||||
i++;
|
||||
}
|
||||
continue;
|
||||
}
|
||||
|
||||
if (CODE == mode) && ('\"' == ESBYTE[i]) {
|
||||
mode = TEXT;
|
||||
strcpy(new_buf, "<font color=#080>\"");
|
||||
new_buf+=18;
|
||||
continue;
|
||||
}
|
||||
if (TEXT == mode) && ('\"' == ESBYTE[i]) {
|
||||
mode = CODE;
|
||||
strcpy(new_buf, "\"</font>");
|
||||
new_buf+=8;
|
||||
continue;
|
||||
}
|
||||
|
||||
if (! strncmp(i, "//", 2) ) && (mode == CODE) {
|
||||
mode = INLINE_COMMENT;
|
||||
strcpy(new_buf, "<font color=#999>//");
|
||||
new_buf+=19;
|
||||
i++;
|
||||
continue;
|
||||
}
|
||||
|
||||
if (INLINE_COMMENT == mode) {
|
||||
if (13 == ESBYTE[i]) {
|
||||
mode = CODE;
|
||||
strcpy(new_buf, "\13</font>");
|
||||
new_buf+=8;
|
||||
continue;
|
||||
}
|
||||
}
|
||||
|
||||
if (! strncmp(i, "/*", 2) ) {
|
||||
mode = COMMENT;
|
||||
strcpy(new_buf, "<font color=#999>/*");
|
||||
new_buf+=19;
|
||||
i++;
|
||||
continue;
|
||||
}
|
||||
if (! strncmp(i, "*/", 2) ) {
|
||||
mode = CODE;
|
||||
strcpy(new_buf, "*/</font>");
|
||||
new_buf+=9;
|
||||
i++;
|
||||
continue;
|
||||
}
|
||||
|
||||
if (CODE == mode) for (keyn=0; C_HL_keywords[keyn]!=NULL; keyn++)
|
||||
{
|
||||
keylen = strlen(C_HL_keywords[keyn]);
|
||||
if (! strncmp(i, C_HL_keywords[keyn], keylen) ) {
|
||||
|
||||
if (keyn<31) keycolor="#f00"; else keycolor="#00f";
|
||||
sprintf(#spstr, "<font color=%s>%s</font>", keycolor, C_HL_keywords[keyn]);
|
||||
strcpy(new_buf, #spstr);
|
||||
|
||||
new_buf += keylen + 24;
|
||||
i += keylen-1;
|
||||
goto _CONTINUE;
|
||||
}
|
||||
}
|
||||
ESBYTE[new_buf] = ESBYTE[i];
|
||||
new_buf++;
|
||||
_CONTINUE:
|
||||
}
|
||||
ESBYTE[new_buf] = 0;
|
||||
LoadInternalPage(new_buf_start, new_buf - new_buf_start);
|
||||
free(new_buf_start);
|
||||
}
|
||||
@@ -1,49 +0,0 @@
|
||||
<html><head><title>New tab</title></head>
|
||||
<body bgcolor=#fff>
|
||||
|
||||
<table><tr><td width=20><td width=220><pre>
|
||||
_____________________
|
||||
|# : : #|
|
||||
| : WebView : |
|
||||
| : for : |
|
||||
| : KolibriOS : |
|
||||
| : : |
|
||||
| :_______________: |
|
||||
| ____________ |
|
||||
| | __ | |
|
||||
| || | | |
|
||||
\_____||__|________|__|<font color=#DDD>lc</font>
|
||||
|
||||
<font bg=#F8F15B> web <font bg=#FF5A7E color=#fff> 1.0 <font bg=#47D018> compatible
|
||||
<font bg=#3CE7FF> </font></font></font></font>
|
||||
<td>
|
||||
|
||||
</pre>
|
||||
<kosicon n=58><a href=//kolibrios.org>Homepage</a>
|
||||
<kosicon n=50><a href="//builds.kolibrios.org">Night-builds</a>
|
||||
<kosicon n=50><a href="//ftp.kolibrios.org">FTP Server</a>
|
||||
<pre>
|
||||
|
||||
By the way,
|
||||
<font color="#555555">• You can check for browser updates from the main menu.
|
||||
• To run a web search, type text in the address box and press Ctrl+Enter.
|
||||
• Pressing F6 moves the text cursor to the omnibox.
|
||||
• You can manually change the encoding of a page by clicking on the label in the bottom right corner.
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
~+
|
||||
|
||||
* +
|
||||
' |
|
||||
() .-.,="``"=. - o -
|
||||
'=/_ \ |
|
||||
* | '=.<a href=WebView:test> </a> |
|
||||
\ `=./`, '
|
||||
. '=.__.=' `=' *
|
||||
+ +
|
||||
O * ' .<font color=#DDD>jgs</font>
|
||||
@@ -1,49 +0,0 @@
|
||||
<html><head><title>Новая вкладка</title></head>
|
||||
<body bgcolor=#fff>
|
||||
|
||||
<table><tr><td width=20><td width=220><pre>
|
||||
_____________________
|
||||
|# : : #|
|
||||
| : WebView : |
|
||||
| : for : |
|
||||
| : KolibriOS : |
|
||||
| : : |
|
||||
| :_______________: |
|
||||
| ____________ |
|
||||
| | __ | |
|
||||
| || | | |
|
||||
\_____||__|________|__|<font color=#DDD>lc</font>
|
||||
|
||||
<font bg=#F8F15B> web <font bg=#FF5A7E color=#fff> 1.0 <font bg=#47D018> compatable
|
||||
<font bg=#3CE7FF> </font></font></font></font>
|
||||
<td>
|
||||
|
||||
</pre>
|
||||
<kosicon n=58><a href=//kolibrios.org>Официальный сайт</a>
|
||||
<kosicon n=50><a href="//builds.kolibrios.org">Ночные сборки</a>
|
||||
<kosicon n=50><a href="//ftp.kolibrios.org">FTP сервер</a>
|
||||
<pre>
|
||||
|
||||
Кстати,
|
||||
<font color="#555555">• Из главного меню можно проверить наличие обновлений
|
||||
• Для поиска в Google наберите тест в адресной строке и нажмите Ctrl+Enter
|
||||
• Клавиша F6 перемещает текстовый курсор в омнибокс.
|
||||
• Можно изменить кодировку страницы, для этого нажмите на надпись в правом нижнем углу окна.
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
~+
|
||||
|
||||
* +
|
||||
' |
|
||||
() .-.,="``"=. - o -
|
||||
'=/_ \ |
|
||||
* | '=.<a href=WebView:test> </a> |
|
||||
\ `=./`, '
|
||||
. '=.__.=' `=' *
|
||||
+ +
|
||||
O * ' .<font color=#DDD>jgs</font>
|
||||
@@ -1,14 +0,0 @@
|
||||
<html>
|
||||
<head><title>Page not found</title></head>
|
||||
<body>
|
||||
<h1> Webpage Not Available</h1>
|
||||
<h2> What could be done:</h2>
|
||||
<ul>
|
||||
<li>Make sure that you have a working Internet connection.<br>
|
||||
Open <a href="/sys/network/netcfg">Netcfg</a> network diagnostic tool.<br>
|
||||
<li>Check the page address for any typos.<br>
|
||||
<li>Server is temporarily unavailable.<br>
|
||||
Refresh the page.<br>
|
||||
<li>Browser didn't properly handle the server's response.<br>
|
||||
Please, report an error.<br>
|
||||
</ul>
|
||||
@@ -1,17 +0,0 @@
|
||||
<html>
|
||||
<head>
|
||||
<meta charset="cp-866">
|
||||
<title>Страница не найдена</title>
|
||||
</head>
|
||||
<body>
|
||||
<h1> Веб-страница недоступна <img src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAdCAMAAAD8QJ61AAAAIVBMVEUBAAAAAAAAgAAAgIAAAIAAAP+AgICZmZnAwMD/mZn///8vq9FJAAAAAXRSTlMAQObYZgAAAORJREFUeNpiGHQAUCcZoEgMwzAQyXbj9f8ffMJp7xz2Om2dgAaUQLF5j8vKBPAS5xWk6eM/iuKqcD7gK6+rjMEXAwqvkX61ICuSwo2uR5jjKBBkCA1ZJDiFrEqahzMIaAgnMG9AjwyBtdAVdO1uwVSQln0GCQvdsU4hkg2WgFhDSBl5DaEZgmVF1ZlPA2kxG0pjL4/QxnWZbQE9ekHHWJHRUMLns260ldA27RCw+m1BGwg+wu5odsM9LYZx3gF7hocwCYFfjr9Vhh5juBb3EQp0rYKgN91/Cu34iGdBHwT729V/8Q+bbAkSfuA/hwAAAABJRU5ErkJggg=="></h1>
|
||||
|
||||
<ul>
|
||||
<li>Проверьте адресс страницы, возможно, была сделана опечатка.<br>
|
||||
<li>Сервер временно недоступен. Штош поделать...<br>
|
||||
<li>Убедитесь, что есть подключение к сети Интернет.<br>
|
||||
В Колибри поддерживается только подключение по кабелю (WiFi не работает). Если кабель подключен, проверьте установлен ли драйвер сетевой карты. Для этого откройте <a href="/sys/network/netcfg">Netcfg</a> и убедитесь, что в колонке DRIVER указано имя двайвера.<br>
|
||||
Список поддерживаемых сетевых карт <a target="_blank" href="/kolibrios/res/guide/hardware_support.htm#net">тут</a>.<br>
|
||||
<li>Текстовый браузер не правильно обработал ответ сервера.<br>
|
||||
Сообщите об ошибке.<br>
|
||||
</ul>
|
||||
@@ -1,39 +0,0 @@
|
||||
<html>
|
||||
<title>TEST</title>
|
||||
<body bgcolor=#fff>
|
||||
|
||||
<pre><h3><kosicon n=21>Tables</h3>
|
||||
<a href=//th99.infania.net>Total Hardware 1999</a>
|
||||
<a href=//xcal1.vodafone.co.uk>Vodafone Test Files</a>
|
||||
<a href=//vetusware.com>vetusware.com</a>
|
||||
<a href=//toastytech.com/guis/index.html>GUI Gallery</a>
|
||||
<a href=//www.weitek.com/textual/support/driver.html>weitek</a>
|
||||
<a href=http://www.retro-computing.com/Home/retro-computing.php>retro-computing</a>
|
||||
<a href=https://www.alanwood.net/unicode/cyrillic.html>cyrillic</a>
|
||||
|
||||
<pre><h3><kosicon n=22>Demoscene</h3>
|
||||
<a href="https://amp.dascene.net/home.php">Amiga Music Preservation</a>
|
||||
<a href="https://files.scene.org">Scene.org</a>
|
||||
<a href=https://www.pouet.net/>Pouet.net</a>
|
||||
<a href="https://aminet.net/tree?path=mods">Aminet</a>
|
||||
<a href=https://barefeats.com/indarch.html>barefeats</a>
|
||||
|
||||
<h3><kosicon n=13>Forms</h3>
|
||||
<a href=//wiby.org>wiby.org</a>
|
||||
|
||||
|
||||
<h3><kosicon n=3>Other</h3>
|
||||
<a href=//menuetos.net>menuetos.net</a>
|
||||
<a href=//osnews.com>osnews.com</a>
|
||||
|
||||
|
||||
<h3><kosicon n=54>Cyrillic only</h3>
|
||||
<a href=//dgmag.in>dgmag.in</a> <a href=//old-dos.ru>old-dos.ru</a> <a href=//lionovsky.us>lionovsky.us</a> <a href=//mirrors.pdp-11.ru>mirrors.pdp-11.ru</a>
|
||||
<a href=//artcon.ru>artcon.ru</a> <a href=//nubo.ru>nubo.ru</a> <a href=//nostalgy.net.ru/>nostalgy.net.ru</a> <a href=//acmp.ru/index.asp?main=tasks>acmp.ru</a>
|
||||
<a href=//opennet.ru>opennet</a> <a href=//linux.org.ru>LOR</a>
|
||||
<a href=//samlib.ru/b>samlib.ru/b</a>
|
||||
<a href=//os-menuet.narod.ru>os-menuet.narod.ru</a> <a href=//coolthemes.narod.ru/indexold.html>coolthemes.narod.ru</a>
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -1 +0,0 @@
|
||||
qemu-system-i386 -m 512 -fda kolibri.img -boot a -vga vmware -net nic,model=rtl8139 -net user -soundhw ac97 -usb -usbdevice tablet -enable-kvm -drive file=fat:rw:.
|
||||
@@ -1,10 +0,0 @@
|
||||
_ini ini;
|
||||
|
||||
void LoadIniConfig()
|
||||
{
|
||||
ini.path = GetIni(#settings_file, "app.ini");
|
||||
ini.section = "WebView";
|
||||
|
||||
ini.GetString("proxy_address", #proxy_address, sizeof(proxy_address), NULL);
|
||||
ini.GetString("search_engine", #search_engine, sizeof(search_engine), "http://bing.com/search?q=");
|
||||
}
|
||||
@@ -1,91 +0,0 @@
|
||||
enum { TAG=1, VALUE, TEXT, COMMENT, SCRIPT};
|
||||
|
||||
int opened_font_counter=0;
|
||||
int mode;
|
||||
|
||||
dword source_buf_end;
|
||||
|
||||
void SourceBufAdd(dword _mode, src)
|
||||
{
|
||||
dword font_found_pointer, src_orig = src;
|
||||
|
||||
if (_mode) mode = _mode;
|
||||
|
||||
strcpy(source_buf_end, src);
|
||||
source_buf_end += strlen(source_buf_end);
|
||||
|
||||
if (font_found_pointer = strstr(src, "</font>")) {
|
||||
opened_font_counter--;
|
||||
}
|
||||
|
||||
if (font_found_pointer = strstr(src_orig, "<font ")) {
|
||||
opened_font_counter++;
|
||||
}
|
||||
}
|
||||
|
||||
void CloseAllOpenedFonts(dword _mode)
|
||||
{
|
||||
while (opened_font_counter) SourceBufAdd(_mode, "</font>");
|
||||
}
|
||||
|
||||
dword ShowSource(dword _bufdata, _in_bufsize)
|
||||
{
|
||||
dword i, j;
|
||||
bool activate_script_mode = false;
|
||||
dword source_buf_start;
|
||||
|
||||
opened_font_counter=0;
|
||||
source_buf_start = malloc(_in_bufsize*5);
|
||||
source_buf_end = source_buf_start;
|
||||
|
||||
SourceBufAdd(TEXT, "<html><head><title>View Source</title><body><pre>");
|
||||
|
||||
for (i=_bufdata; i<_bufdata+_in_bufsize; i++) switch (ESBYTE[i])
|
||||
{
|
||||
case '<':
|
||||
if (!strncmp(i+1,"!--", 3)) SourceBufAdd(COMMENT, "<font color=#bbb><");
|
||||
else if (SCRIPT == mode) {
|
||||
if (!strncmp(i+1,"/script>", 8)) {
|
||||
CloseAllOpenedFonts(NULL);
|
||||
SourceBufAdd(TAG, "<font color=#00f><");
|
||||
}
|
||||
else SourceBufAdd(NULL, "<");
|
||||
}
|
||||
else if (COMMENT == mode) {
|
||||
SourceBufAdd(NULL, "<");
|
||||
}
|
||||
else if (TEXT == mode) {
|
||||
if (!strncmp(i+1,"script", 6)) activate_script_mode = true;
|
||||
SourceBufAdd(TAG, "<font color=#00f><");
|
||||
}
|
||||
break;
|
||||
case '>':
|
||||
if (TAG == mode) && (activate_script_mode) {
|
||||
activate_script_mode = false;
|
||||
SourceBufAdd(SCRIPT, "></font><font color=#994500>");
|
||||
}
|
||||
else if (VALUE == mode) CloseAllOpenedFonts(TEXT);
|
||||
else if (COMMENT == mode) && (!strncmp(i-2,"--", 2)) {
|
||||
SourceBufAdd(TEXT, ">");
|
||||
CloseAllOpenedFonts(TEXT);
|
||||
}
|
||||
else if (COMMENT == mode) || (SCRIPT == mode) SourceBufAdd(NULL, ">");
|
||||
else if (TAG == mode) SourceBufAdd(TEXT, "></font>");
|
||||
break;
|
||||
case '&':
|
||||
SourceBufAdd(NULL, "&");
|
||||
break;
|
||||
case '\"':
|
||||
case '\'':
|
||||
if (TAG == mode) SourceBufAdd(VALUE, "<font color=#F301F2>"");
|
||||
else if (VALUE == mode) SourceBufAdd(TAG, ""</font>");
|
||||
else SourceBufAdd(NULL, """);
|
||||
break;
|
||||
default:
|
||||
ESBYTE[source_buf_end] = ESBYTE[i];
|
||||
source_buf_end++;
|
||||
}
|
||||
ESBYTE[source_buf_end] = 0;
|
||||
LoadInternalPage(source_buf_start, source_buf_end-source_buf_start);
|
||||
free(source_buf_start);
|
||||
}
|
||||
@@ -1,195 +0,0 @@
|
||||
|
||||
//===================================================//
|
||||
// //
|
||||
// MODULE //
|
||||
// //
|
||||
//===================================================//
|
||||
|
||||
#define TABS_MAX 5
|
||||
|
||||
TWebBrowser tabdata[TABS_MAX+1];
|
||||
_history tabstory[TABS_MAX+1];
|
||||
|
||||
struct TAB
|
||||
{
|
||||
int count;
|
||||
signed int active;
|
||||
bool add();
|
||||
bool close();
|
||||
void save_state();
|
||||
void restore();
|
||||
} tab = {1,0};
|
||||
|
||||
|
||||
bool TAB::add()
|
||||
{
|
||||
if (count==TABS_MAX) return false;
|
||||
save_state();
|
||||
count++;
|
||||
active = count-1;
|
||||
history = tabstory[active];
|
||||
return true;
|
||||
}
|
||||
|
||||
bool TAB::close(int _tab_number)
|
||||
{
|
||||
int i;
|
||||
if (count==1) return false;
|
||||
for (i=_tab_number; i<TABS_MAX; i++) {
|
||||
tabdata[i] = tabdata[i+1];
|
||||
tabstory[i] = tabstory[i+1];
|
||||
}
|
||||
if (_tab_number<active) && (active>0) active--;
|
||||
if (active==count-1) && (active>0) active--;
|
||||
count--;
|
||||
return true;
|
||||
}
|
||||
|
||||
void TAB::save_state()
|
||||
{
|
||||
tabstory[active] = history;
|
||||
tabdata[active] = WB1;
|
||||
}
|
||||
|
||||
void TAB::restore(int _id)
|
||||
{
|
||||
tab.active = _id;
|
||||
WB1 = tabdata[_id];
|
||||
history = tabstory[_id];
|
||||
}
|
||||
|
||||
//===================================================//
|
||||
// //
|
||||
// WebView Actions //
|
||||
// //
|
||||
//===================================================//
|
||||
|
||||
#define DEFAULT_TABW 220
|
||||
int tab_w = DEFAULT_TABW;
|
||||
|
||||
int GetTabWidth()
|
||||
{
|
||||
if (tab.count == TABS_MAX) return Form.cwidth / tab.count;
|
||||
if (tab.count * DEFAULT_TABW + TAB_H < Form.cwidth) return DEFAULT_TABW; else
|
||||
return Form.cwidth - TAB_H - 2 / tab.count;
|
||||
}
|
||||
|
||||
void DrawTab(int _id)
|
||||
{
|
||||
#define CLOSE_S 13
|
||||
dword bgcol, border_bottom_color;
|
||||
char header_no_version[sizeof(TWebBrowser.header)];
|
||||
char name[DEFAULT_TABW/6];
|
||||
int xxx = _id * tab_w;
|
||||
|
||||
if (_id==tab.active) {
|
||||
tab.save_state();
|
||||
bgcol = sc.light;
|
||||
border_bottom_color = sc.light;
|
||||
} else {
|
||||
bgcol=sc.work;
|
||||
border_bottom_color = sc.line;
|
||||
}
|
||||
if (tabdata[_id].header) {
|
||||
strncpy(#header_no_version, #tabdata[_id].header, strlen(#tabdata[_id].header)-sizeof(version)-2);
|
||||
strncpy(#name, #header_no_version, tab_w-CLOSE_S/6-2);
|
||||
}
|
||||
DrawBar(xxx, TOOLBAR_H, 1, TAB_H, sc.dark);
|
||||
DrawBar(xxx+1, TOOLBAR_H, tab_w-1, TAB_H-1, bgcol);
|
||||
DrawBar(xxx+1, TOOLBAR_H+TAB_H-1, tab_w-1, 1, border_bottom_color);
|
||||
DefineHiddenButton(xxx, TOOLBAR_H-1, tab_w, TAB_H, TAB_ID+_id);
|
||||
WriteTextCenter(xxx, TOOLBAR_H+6, tab_w-CLOSE_S, sc.work_text, #name);
|
||||
|
||||
DefineHiddenButton(xxx+tab_w-CLOSE_S-3, TOOLBAR_H+3, CLOSE_S-1, CLOSE_S-1, TAB_CLOSE_ID+_id);
|
||||
DrawBar(xxx+tab_w-CLOSE_S-3, TOOLBAR_H+3, CLOSE_S, CLOSE_S, sc.dark);
|
||||
WriteText(xxx+tab_w-CLOSE_S+1, TOOLBAR_H+5, 0x80, sc.light, "x");
|
||||
}
|
||||
|
||||
void DrawActiveTab()
|
||||
{
|
||||
if (tab_w == GetTabWidth()) DrawTab(tab.active);
|
||||
else DrawTabsBar();
|
||||
}
|
||||
|
||||
int DrawNewTabButton()
|
||||
{
|
||||
dword btn_light = MixColors(sc.button, 0xFFFfff, 220);
|
||||
dword btn_dark = MixColors(sc.button, 0, 180);
|
||||
int xxx = tab.count * tab_w;
|
||||
|
||||
if (tab.count < TABS_MAX) {
|
||||
DrawBar(xxx, TOOLBAR_H, 1, TAB_H, sc.line);
|
||||
DrawBar(xxx+1, TOOLBAR_H, TAB_H, TAB_H-1, sc.button);
|
||||
DrawRectangle3D(xxx+1, TOOLBAR_H, TAB_H, TAB_H-1, btn_light, btn_dark);
|
||||
PutPixel(xxx+1+TAB_H, TOOLBAR_H, btn_dark);
|
||||
DefineHiddenButton(xxx+1, TOOLBAR_H, TAB_H-1, TAB_H-1, NEW_TAB);
|
||||
WriteText(xxx+7, TOOLBAR_H+2, 0x90, sc.button_text, "+");
|
||||
return xxx + TAB_H + 2;
|
||||
} else {
|
||||
return xxx;
|
||||
}
|
||||
}
|
||||
|
||||
void DrawTabsBar()
|
||||
{
|
||||
dword i;
|
||||
tab_w = GetTabWidth();
|
||||
for (i=0; i<tab.count; i++) DrawTab(i);
|
||||
i = DrawNewTabButton();
|
||||
DrawBar(i, TOOLBAR_H, Form.cwidth-i, TAB_H-1, MixColors(sc.dark, sc.work, 128));
|
||||
DrawBar(i, TOOLBAR_H+TAB_H-1, Form.cwidth-i, 1, sc.line);
|
||||
}
|
||||
|
||||
void EventTabClose(int _id)
|
||||
{
|
||||
DeleteButton(TAB_ID + tab.count-1);
|
||||
if (_id == tab.active) {
|
||||
tab.close(_id);
|
||||
tab.restore(tab.active);
|
||||
SetElementSizes();
|
||||
WB1.Reparse();
|
||||
WB1.DrawPage();
|
||||
SetOmniboxText(history.current());
|
||||
} else {
|
||||
tab.close(_id);
|
||||
}
|
||||
DrawTabsBar();
|
||||
DrawStatusBar(NULL);
|
||||
}
|
||||
|
||||
void EventCloseActiveTab()
|
||||
{
|
||||
EventTabClose(tab.active);
|
||||
}
|
||||
|
||||
void EventTabClick(int _id)
|
||||
{
|
||||
if (_id>=tab.count) _id = 0;
|
||||
if (_id==-1) _id = tab.count-1;
|
||||
tab.save_state();
|
||||
tab.restore(_id);
|
||||
DrawTabsBar();
|
||||
SetElementSizes();
|
||||
WB1.Reparse();
|
||||
WB1.DrawPage();
|
||||
SetOmniboxText(history.current());
|
||||
DrawStatusBar(NULL);
|
||||
}
|
||||
|
||||
void EventOpenNewTab(dword _url)
|
||||
{
|
||||
tab.add();
|
||||
OpenPage(_url);
|
||||
DrawTabsBar();
|
||||
}
|
||||
|
||||
void EventActivateNextTab()
|
||||
{
|
||||
EventTabClick(tab.active+1);
|
||||
}
|
||||
|
||||
void EventActivatePreviousTab()
|
||||
{
|
||||
EventTabClick(tab.active-1);
|
||||
}
|
||||
|
||||
@@ -1,119 +0,0 @@
|
||||
<!--doctype html public "-//w3c//dtd html 4.0 transitional//ru"-->
|
||||
<html>
|
||||
<head>
|
||||
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
|
||||
<title>Тест Acid 0.1</title>
|
||||
</head>
|
||||
<body bgcolor="#000000" link="#0066FF" text="#FFFFFF">
|
||||
<h1 align=center>Тест Acid 0.1</h1>
|
||||
<br>
|
||||
<b>Это тестовая страница для проверки текстового браузера <s>HTML Viewer</s> WebView</b>
|
||||
|
||||
<p>Из кодировок поддерживаются: CP866(DOS), CP1251(Windows), CP1252(Latin legacy), KOI8, и конечно UTF8. CSS и Javascript пока не реализованы (ахахаха). Поддержка тега <table> крайне базовая, поддержки вложенных таблиц нет.
|
||||
</p>
|
||||
|
||||
<h3>История</h3>
|
||||
|
||||
Ранее программа называлась <b >HTMLv (HTML Viewer)</b> и изначально задумывалась как <q>Центр справки и поддержки</q>. Чтобы не изобретать велосипед и одновременно исполнить мечту многих, форматом просматриваемых страниц был выбран html.
|
||||
Первоначальный автор Veliant, затем разработка была подхвачена дизайнером Leency. Это была моя вторая программа после файлового менеджера Eolite.<br>
|
||||
|
||||
<span> <br />
|
||||
|
||||
<b>
|
||||
<font color="#FF0000">K</font>
|
||||
<font color="#FFC005">o</font>
|
||||
<font color="#F6F574">l</font>
|
||||
<font color="#9EFC36">i</font>
|
||||
<font color="#29FDFD">b</font>
|
||||
<font color="#36A8FC">r</font>
|
||||
<font color="blueviolet">i</font>
|
||||
<font color="#C911FF">O</font>
|
||||
<font color="#C911FF">S</font>
|
||||
|
||||
<font color="#C911FF">F</font>
|
||||
<font color="#36A8FC">o</font>
|
||||
<font color="#29FDFD">r</font>
|
||||
<font color="#9EFC36">e</font>
|
||||
<font color="#FFC005">v</font>
|
||||
<font color="#FF0000">e</font>
|
||||
<font color="#FFC005">r</font>
|
||||
</b>
|
||||
<br>
|
||||
|
||||
<table>
|
||||
<td>
|
||||
<bg bgcolor=#333>
|
||||
Небольшой список:<ol>
|
||||
<li><q>Этот текст в кавычках</q></li>
|
||||
<li><u>Это подчеркнутый текст</u></li>
|
||||
<li><s>Это перечеркнутый текст</s></li>
|
||||
<li><i>Это наклонный текст</i></li>
|
||||
<li><strong>Это текст с усиленным выделением</strong></li>
|
||||
<li><b><u><s><font color="#777444">Много тегов</font></s></u></b></ol>
|
||||
</bg>
|
||||
</p>
|
||||
<br>
|
||||
|
||||
<!-- комментарий: этого текста здесь <нет> -->
|
||||
|
||||
<br>
|
||||
|
||||
<img alt="нет картинки, просто alt">
|
||||
|
||||
<img src = http://wiby.org/about/wibyplex.gif>
|
||||
|
||||
<a href="http://kolibrios.org/i/logo.png"><img id="2.1.4" src="http://kolibrios.org/i/logo.png" alt="logo"><br>Открыть</a><br>
|
||||
|
||||
<br>
|
||||
<br>
|
||||
<a href='./index.htm'>./index.htm</a><br>
|
||||
<a href='/sys/index.htm'>Незакрытый тег а - index.htm<br>
|
||||
<a href="/sys/calc">/sys/calc</a><br>
|
||||
<a href="#2.1.4">#2.1.4</a><br>
|
||||
<a href="http://kolibrios.org">http://kolibrios.org</a><br>
|
||||
<a href="mailto:leency@mail.ru">Mail to Leency</a><br>
|
||||
<br>
|
||||
|
||||
<h1><a href=#>Link H1</a> <u>Underline H1</u></h1>
|
||||
<h2><a href=#>Link H2</a> <u>Underline H2</u></h2>
|
||||
<h3><a href=#>Link H3</a> <u>Underline H2</u></h3>
|
||||
<a href=#>Link</a> <u>Underline</u>
|
||||
|
||||
<td>
|
||||
|
||||
<pre>
|
||||
"Осень уже пришла!"-
|
||||
Шепнул мне на ухо ветер,
|
||||
Подкравшись к подушке моей.
|
||||
|
||||
Басе
|
||||
|
||||
</pre><br>
|
||||
|
||||
В этом тексте есть переход на следующую строку, но браузер
|
||||
его должен проигнорировать. Еще много пробелов. А тут есть
|
||||
табы. Кое-какие символы: " & < > •
|
||||
© ® „ “ — Їжачок іншого боку р. Євфрат з'їв ґрунт та єврейський ґербалайф.
|
||||
|
||||
<p>61055, г.
|
||||
Харьков, ул. Краснознаменная, 16</SPAN>, радиофизический
|
||||
корпус на территории НТУ «ХПИ»
|
||||
</p>
|
||||
|
||||
<pre><font color="#000">
|
||||
<font bg=#FFED00 style="background-color:#FFED00"> Заметки </font>
|
||||
<font bg=#FFFBCE style="background-color:#FFFBCE"> </font>
|
||||
<font bg=#FFFBCE style="background-color:#FFFBCE"> Речка на Жукова </font>
|
||||
<font bg=#FFFBCE style="background-color:#FFFBCE"> Heroes 3 </font>
|
||||
<font bg=#FFFBCE style="background-color:#FFFBCE"> Рисостерон, куринабол </font>
|
||||
<font bg=#FFFBCE style="background-color:#FFFBCE"> </font>
|
||||
</font></pre>
|
||||
|
||||
</table>
|
||||
|
||||
<hr color="#758999">
|
||||
<center>Zhytomyr 2008-2025</center>
|
||||
|
||||
|
||||
</body>
|
||||
</html>
|
||||
@@ -1,36 +0,0 @@
|
||||
<!DOCTYPE html>
|
||||
<html>
|
||||
<body>
|
||||
|
||||
<form action="https://www.w3schools.com/action_page.php">
|
||||
First name: <input type="text" name="fname" value="Mickey"><br>
|
||||
Last name: <input type="text" name="lname" value="Mouse"><br>
|
||||
<input type="submit" value="Submit">
|
||||
</form>
|
||||
|
||||
<form action="https://www.w3schools.com/action_page.php" method="post">
|
||||
First name: <input type="text" name="fname" value="Aboba"><br>
|
||||
Last name: <input type="text" name="lname" value="Aboba"><br>
|
||||
<input type="submit" value="Submit">
|
||||
</form>
|
||||
|
||||
<p>Click the "Submit" button and the form-data will be sent to a script on the server.</p>
|
||||
|
||||
<h1>aboba</h1><br>
|
||||
<h1>aboba</h1><br>
|
||||
<h1>aboba</h1><br>
|
||||
<h1>aboba</h1><br>
|
||||
<h1>aboba</h1><br>
|
||||
<h1>aboba</h1><br>
|
||||
<h1>aboba</h1><br>
|
||||
<h1>aboba</h1><br>
|
||||
<h1>aboba</h1><br>
|
||||
<h1>aboba</h1><br>
|
||||
<h1>aboba</h1><br>
|
||||
<h1>aboba</h1><br>
|
||||
<h1>aboba</h1><br>
|
||||
<h1>aboba</h1><br>
|
||||
|
||||
|
||||
</body>
|
||||
</html>
|
||||
Loaded 100 of 567 files, more files were not shown because too many files have changed in this diff.
Show more
Reference in new issue
Block a user