Compare commits

...
Author SHA1 Message Date
Burer 9ee27c5595 end: rewrite; save the RAM-disk on shutdown reliably
Check kernel codestyle / Check kernel codestyle (pull_request) Successful in 22s
Test PR / Build (en_US) (pull_request) Successful in 1m58s
Test PR / Build (es_ES) (pull_request) Successful in 2m9s
Test PR / Build (ru_RU) (pull_request) Successful in 2m17s
- merge end/light into a single modern end.asm, drop the unused
  image-based variant (back.raw)
- autosave writes the image back to the boot medium in place
  (SF 18.6 with ecx = 0) instead of spawning rdsave and hanging on
  its dialog; a failed save cancels the shutdown
- settings unified into app.ini [RDSave] (was rdsave.ini [settings])
- autosave is skipped when libini is missing instead of crashing
- locales ru/es/en via encoding.inc, -dlang from the Tupfile
2026-08-24 16:26:43 +03:00
Burer dc7d6dd842 rdsave: rewrite from scratch (2.0)
- default target is the boot medium (SF 18.6 with ecx = 0) when the
  system was booted from a floppy or a hard disk; a file picked in
  the dialog overrides it
- silent modes (-h/path) can no longer open windows - the old hidden
  mode popped an OpenDialog on a bad ini path and stalled the
  shutdown; legacy "h" argument still accepted
- UTF-8 source, strings emitted as CP866/CP850 by encoding.inc;
  locales ru/es/en picked by -dlang from the Tupfile, no lang.inc
- folder flattened to rdsave.asm + Tupfile.lua, shared string.inc
  instead of the local str.inc
2026-08-24 16:26:42 +03:00
Burer a8ade5e0c2 kernel: save ramdisk to its boot medium; new SF 26.13
SF 18.6 with ecx = 0 now writes the ramdisk image back to the medium
the system was booted from: a floppy via save_image, or the image
file on a hard disk partition found by rdload.inc at boot. Returns
2 when the boot source is not writable, 11 on a floppy write error.

New SF 26.13 exposes BOOT.rd_load_from (RD_LOAD_FROM_*) so programs
can tell the boot source in advance.

Docs for both (sysfuncs.txt, sysfuncr.txt), SSF_RD_BOOT_SOURCE and
RD_LOAD_FROM_* constants in KOSfuncs.inc.
2026-08-24 16:17:26 +03:00
Doczom f143ca1928 Kernel/disk.inc: fixed getting the disk partition number #651
Check kernel codestyle / Check kernel codestyle (pull_request) Successful in 18s
Test PR / Build (en_US) (pull_request) Successful in 2m17s
Test PR / Build (ru_RU) (pull_request) Successful in 2m18s
Test PR / Build (es_ES) (pull_request) Successful in 2m24s
Build system / Build (en_US) (push) Successful in 2m47s
Build system / Build (es_ES) (push) Successful in 2m50s
Build system / Build (ru_RU) (push) Successful in 2m52s
Build system / Publish Images (push) Successful in 2m49s
2026-08-22 10:47:21 +00:00
Matou1306andBurer 931071a0e9 kernel/fs: new SF's 70.11 (create symlink) and 70.12 (read symlink) with EXT driver support (#570)
Build system / Build (es_ES) (push) Successful in 2m33s
Build system / Build (en_US) (push) Successful in 2m39s
Build system / Build (ru_RU) (push) Successful in 2m43s
Build system / Publish Images (push) Successful in 3m28s
Tested the changes on qemu and umka and everything appears to be working fine

---------

Co-authored-by: Burer <burer@kolibrios.org>
Reviewed-on: #570
Reviewed-by: Burer <burer@kolibrios.org>
Reviewed-by: Ivan B <1+dunkaist@noreply.localhost>
Reviewed-by: Kiril Lipatov <lipatov.kiril@gmail.com>
Reviewed-by: Егор Ярин <y.yarin@inbox.ru>
Reviewed-by: Mikhail Frolov <mixa.frolov2003@gmail.com>
Co-authored-by: Matou <mathieubotros@gmail.com>
2026-08-21 10:30:06 +00:00
Matou1306andBurer bed9528756 fs/ext: support flex-bg writing and update new blocks allocation selection (#584)
Build system / Build (en_US) (push) Successful in 2m27s
Build system / Build (es_ES) (push) Successful in 2m29s
Build system / Build (ru_RU) (push) Successful in 2m35s
Build system / Publish Images (push) Successful in 2m5s
Update `extfsExtentAlloc` to take edi as a goal block to start allocation at the previous block's group, falling back to the file's inode block group if edi is zero.

---------

Co-authored-by: Burer <burer@kolibrios.org>
Reviewed-on: #584
Reviewed-by: Mikhail Frolov <mixa.frolov2003@gmail.com>
Reviewed-by: Burer <burer@kolibrios.org>
Co-authored-by: Matou <mathieubotros@gmail.com>
2026-08-18 07:02:57 +00:00
Egor00f 570a432a84 libc.obj: fix _ksys_read_dir (#650)
Build system / Build (en_US) (push) Successful in 2m26s
Build system / Build (es_ES) (push) Successful in 2m32s
Build system / Build (ru_RU) (push) Successful in 2m35s
Build system / Publish Images (push) Successful in 2m31s
and update `libc.obj`: update `opendir` for new `_ksys_read_dir`

Thanks to @Burer for spotting this mistake.

Reviewed-on: #650
Co-authored-by: Egor00f <y.yarin@inbox.ru>
2026-08-17 17:24:24 +00:00
Leency 1215116155 add netsurf app that download and run (or only run) the NeSurf (#648)
Build system / Build (en_US) (push) Successful in 2m11s
Build system / Build (es_ES) (push) Successful in 2m14s
Build system / Build (ru_RU) (push) Successful in 2m22s
Build system / Publish Images (push) Successful in 2m1s
+ update icon path, add to menu

Reviewed-on: #648
Reviewed-by: Ivan B <1+dunkaist@noreply.localhost>
Reviewed-by: Burer <burer@kolibrios.org>
Co-authored-by: leency <lipatov.kiril@gmail.com>
2026-08-17 16:32:03 +00:00
Egor00f e470ef5db5 libc.obj: fix opendir (#645)
Build system / Build (en_US) (push) Successful in 2m14s
Build system / Build (ru_RU) (push) Successful in 2m26s
Build system / Build (es_ES) (push) Successful in 2m30s
Build system / Publish Images (push) Successful in 2m31s
Changes:
- [x] ignore `EOF` error
- [x] fix buf size
  `520` and `264` were mixed up
- [x] Separate checks for `malloc` and `_ksys_read_dir`
- [x] fix some potential errors
- [x] update `dir_example.c`
  + it may have page fail if run it from `shell`, because it try call `con_set_flags`
  + fix `mkdir` test
  + show `opendir` error

Reviewed-on: #645
Co-authored-by: Egor00f <y.yarin@inbox.ru>
2026-08-17 15:42:54 +00:00
Burerandkolibrios-bot Bot 24d1b5877a chore/submodules: bump kterm to upstream (#644)
Build system / Build (es_ES) (push) Successful in 2m15s
Build system / Build (ru_RU) (push) Successful in 2m22s
Build system / Build (en_US) (push) Successful in 2m27s
Build system / Publish Images (push) Successful in 1m52s
Co-authored-by: kolibri-bot <bot@kolibrios.org>
Reviewed-on: #644
Reviewed-by: Kiril Lipatov <lipatov.kiril@gmail.com>
Reviewed-by: Mikhail Frolov <mixa.frolov2003@gmail.com>
2026-08-14 16:12:31 +00:00
Burer aa8913ea33 games/dino: binary size optimization (fix #537) (#632)
Build system / Build (en_US) (push) Successful in 3m8s
Build system / Build (es_ES) (push) Successful in 3m7s
Build system / Build (ru_RU) (push) Successful in 3m9s
Build system / Publish Images (push) Successful in 2m29s
- Size (fit into 8192 bytes or 16 IMG sectors):
  - Drop `ulist` in favor of static arrays
  - Dropping `malloc`/`free`/`exit`; `sprintf`, `pow`, `strlen` and 64-bit division no longer pull in libc and libtcc1
  - Dead code removed

- Rendering:
  - libimg dropped. `png2h.py` turns the original PNG into a palette-indexed atlas; the blit writes a 32bpp buffer, sysfn 65 puts it on screen - the same call `img_draw` made. No runtime PNG decode, output pixel-identical. The buffer ends at the ground line: 18% fewer pixels per frame

- Bugs fixed:
  - Every fourth pterodactyl was invisible and unhittable: `getRandomNumber` is inclusive, so `yPosArr[3]` read the next field (999) and the bird spawned off-screen
  - Releasing the jump key never shortened the first jump: gated on a flag set only after the intro; Chrome gates on the loop being scheduled
  - Flap rate `1000/6` truncated to 166, `minSpeed` 8.5 to 8 - birds came earlier than in Chrome
  - Hardcoded caption height clipped the window on every non-default skin
  - A maximum jump left the buffer and cut off the dino's head; the playfield is centered now
  - Obstacles and clouds leaked: nodes were freed, their data never

- Localization:
  - Caption localized to EN/RU/ES via `CONFIG_LANG`, fits every skin in the tree

Reviewed-on: #632
Reviewed-by: Kiril Lipatov <lipatov.kiril@gmail.com>
Reviewed-by: Ivan B <1+dunkaist@noreply.localhost>
2026-08-14 13:51:14 +00:00
Leency 647f35ea10 XDPascal: smart linking (#646)
Build system / Build (es_ES) (push) Successful in 2m28s
Build system / Build (en_US) (push) Successful in 2m32s
Build system / Build (ru_RU) (push) Successful in 2m39s
Build system / Publish Images (push) Successful in 2m35s
XDPascal для Колибри и Винды. С примерами.

Компиляторы убирают из бинарника недостижимые процедуры: два прохода,
на первом строится граф вызовов, на втором код мёртвых процедур не пишется.
Бинарники меньше в 1.5-5 раз. Ключ -nosmart отключает, вывод при этом
побайтово совпадает со старым компилятором.

Также снимаются кавычки с аргументов командной строки: без этого
make.bat не работал со сборкой не через Delphi.

xdpw_2020 - прежний компилятор, xdpw_2026 - новый.

Assisted-by: Claude Opus 5 <noreply@anthropic.com>
Reviewed-on: #646
Reviewed-by: Ivan B <1+dunkaist@noreply.localhost>
Reviewed-by: Burer <burer@kolibrios.org>
Co-authored-by: leency <lipatov.kiril@gmail.com>
2026-08-13 11:54:35 +00:00
Doczom f44ceb560c macros/format: fixed the flag for having an import table in KX format
Test PR / Build (es_ES) (pull_request) Successful in 2m36s
Test PR / Build (en_US) (pull_request) Successful in 2m38s
Test PR / Build (ru_RU) (pull_request) Successful in 2m40s
Build system / Build (ru_RU) (push) Successful in 3m10s
Build system / Build (en_US) (push) Successful in 3m13s
Build system / Build (es_ES) (push) Successful in 3m16s
Build system / Publish Images (push) Successful in 2m23s
2026-08-11 21:28:53 +05:00
Burer 6defa11a9e kernel/docs, programs: rename SF 51 and SF 77 constants (fix #321) (#640)
Test PR / Build (en_US) (pull_request) Successful in 4m7s
Build system / Build (en_US) (push) Successful in 4m28s
Test PR / Build (es_ES) (pull_request) Successful in 4m21s
Build system / Build (es_ES) (push) Successful in 4m39s
Build system / Build (ru_RU) (push) Successful in 4m43s
Test PR / Build (ru_RU) (pull_request) Successful in 1m24s
Build system / Publish Images (push) Successful in 2m0s
| SF | SSF | Old Name | Name Name |
|---|---|---|---|
| 51 | — | `SF_CREATE_THREAD` | `SF_THREAD_CONTROL` |
| 77 | — | `SF_FUTEX` | `SF_POSIX` |
| 77 | 0 | `SSF_CREATE` | `SSF_FUTEX_CREATE` |
| 77 | 1 | `SSF_DESTROY` | `SSF_FUTEX_DESTROY` |
| 77 | 2 | `SSF_WAIT` | `SSF_FUTEX_WAIT` |
| 77 | 3 | `SSF_WAKE` | `SSF_FUTEX_WAKE` |
| 77 | 10 | `SSF_FILE_READ` | `SSF_FD_READ` |
| 77 | 11 | `SSF_FILE_WRITE` | `SSF_FD_WRITE` |
| 77 | 13 | `SSF_PIPE_CREATE` | `SSF_FD_PIPE2` |

Reviewed-on: #640
Reviewed-by: Kiril Lipatov <lipatov.kiril@gmail.com>
Reviewed-by: Mikhail Frolov <mixa.frolov2003@gmail.com>
2026-08-09 19:08:15 +00:00
LeencyandBurer 944d74f013 drivers/hdaudio: add ring buffer for unsolicited events (#455)
Build system / Build (es_ES) (push) Successful in 2m15s
Build system / Build (ru_RU) (push) Successful in 2m19s
Build system / Build (en_US) (push) Successful in 2m23s
Build system / Publish Images (push) Successful in 1m46s
I had an issue with 100% cpu load caused by this commit be847c5e1f
This PC is HP dc5800. Its audio card is PCI\VEN_8086&DEV_293E&REV_02 (ICH9 - 82801I) with build-in speaker.

So I Gemini wrote some code for me:

> This code implements a circular buffer to temporarily store unsolicited events, allowing the interrupt handler to quickly save data and immediately release the CPU. Now, instead of placing a direct load on the system, a background timer periodically "picks up" the accumulated events from this buffer and processes them safely.

Now it fixed on my PC. Also I've tested it on two machines and it also works well. Please take a look.

---------

Co-authored-by: Burer <burer@kolibrios.org>
Reviewed-on: #455
Reviewed-by: Mikhail Frolov <mixa.frolov2003@gmail.com>
Reviewed-by: Ivan B <1+dunkaist@noreply.localhost>
Reviewed-by: hidnplayr <hidnplayr@gmail.com>
Co-authored-by: leency <lipatov.kiril@gmail.com>
2026-08-08 15:46:02 +00:00
Leency 2bebbcbdc3 kernel/fs: narrow the UTF16to8 input to ax (#633)
Build system / Build (es_ES) (push) Successful in 2m9s
Build system / Build (ru_RU) (push) Successful in 2m13s
Build system / Build (en_US) (push) Successful in 2m18s
Build system / Publish Images (push) Successful in 2m32s
Load characters with lodsw only ever set ax. Anything left in the high half - including what this routine's own three-byte branch leaves there - would then push every following character into a longer form: an ASCII name off a Joliet CD came out as overlong three-byte sequences from the second character on. Narrow the input here, so every caller is safe.

Reviewed-on: #633
Reviewed-by: Burer <burer@kolibrios.org>
Reviewed-by: Mikhail Frolov <mixa.frolov2003@gmail.com>
Co-authored-by: leency <lipatov.kiril@gmail.com>
2026-08-08 15:30:25 +00:00
4ds-devandBurer 201e8b2de3 apps/cedit: menu for managing supported languages, universal language configs (#554)
Build system / Build (en_US) (push) Successful in 2m4s
Build system / Build (es_ES) (push) Successful in 2m10s
Build system / Build (ru_RU) (push) Successful in 2m15s
Build system / Publish Images (push) Successful in 2m15s
- all languages are configured via cedit.ini (the “edit” button in the “languages” menu)
- build/run/debug commands are also configured via cedit.ini
- new languages can be added via cedit.ini
- zator language has been added

---------

Co-authored-by: Burer <burer@kolibrios.org>
Reviewed-on: #554
Reviewed-by: Kiril Lipatov <lipatov.kiril@gmail.com>
Reviewed-by: Alexey Ryabov <alex@b00bl1k.ru>
Co-authored-by: 4ds-dev <4ds.dev@gmail.com>
2026-08-07 07:57:14 +00:00
Burer 0390ad41e4 apps/klavisha: move to iso (#635)
Build system / Build (es_ES) (push) Successful in 2m17s
Build system / Build (en_US) (push) Successful in 2m25s
Build system / Build (ru_RU) (push) Successful in 2m31s
Build system / Publish Images (push) Successful in 1m53s
Klavisha takes 11 sectors in IMG, and is included only in RU build.
I propose move it to ISO to free space on IMG and make it more consisntent.

Reviewed-on: #635
Reviewed-by: Mikhail Frolov <mixa.frolov2003@gmail.com>
Reviewed-by: Alexey <alex@b00bl1k.ru>
2026-08-07 07:44:31 +00:00
b00bl1k 2515d1fa37 drivers/serial: implement serial ports enumeration (#629)
Build system / Build (es_ES) (push) Successful in 3m22s
Build system / Build (en_US) (push) Successful in 3m31s
Build system / Build (ru_RU) (push) Successful in 3m39s
Build system / Publish Images (push) Successful in 2m15s
This PR adds a new enum_ports call to the serial driver's control API that lets user-mode programs list the serial ports currently registered in the system.

It also updates debug output strings, changes the USB FTDI driver's service procedure name, and removes duplicated code from the baud rate calculation.

Reviewed-on: #629
Reviewed-by: Mikhail Frolov <mixa.frolov2003@gmail.com>
Reviewed-by: Burer <burer@kolibrios.org>
Co-authored-by: Alexey Ryabov <alex@b00bl1k.ru>
2026-08-07 04:40:23 +00:00
Egor00f da0e6f492b libc.obj: export missed vfprintf (#634)
Build system / Build (en_US) (push) Successful in 2m36s
Build system / Build (es_ES) (push) Successful in 2m38s
Build system / Build (ru_RU) (push) Successful in 2m41s
Build system / Publish Images (push) Successful in 2m9s
The `vfprintf` function is declared in the header files, but is not exported in the library.

Reviewed-on: #634
Co-authored-by: Egor00f <y.yarin@inbox.ru>
2026-08-06 13:52:14 +00:00
Egor00f 3c2bdfb418 Обновить programs/develop/ktcc/libc.obj/source/stdio/puts.c
Test PR / Build (es_ES) (pull_request) Successful in 1m50s
Test PR / Build (ru_RU) (pull_request) Successful in 1m56s
Test PR / Build (en_US) (pull_request) Successful in 1m58s
Build system / Build (en_US) (push) Successful in 2m10s
Build system / Build (es_ES) (push) Successful in 2m13s
Build system / Build (ru_RU) (push) Successful in 2m17s
Build system / Publish Images (push) Successful in 2m22s
2026-08-05 17:24:27 +00:00
Egor00f 67770ec3f4 libc.obj: implement console output via SHELL (#354)
Test PR / Build (ru_RU) (pull_request) Successful in 1m49s
Test PR / Build (en_US) (pull_request) Successful in 1m54s
Test PR / Build (es_ES) (pull_request) Successful in 1m57s
Adding console I/O via the `SHELL`.

Demonstration of [http_tcp_demo.c](https://git.kolibrios.org/KolibriOS/kolibrios/src/branch/main/programs/develop/ktcc/libc.obj/samples/http_tcp_demo.c):
<video src="attachments/847d7d19-3d67-480d-80c8-6d678af61a43" title="Запись экрана от 2026-03-07 13-55-50.mp4" controls></video>

- [x] output
- [x] multithread
  - [x] add mutex
  - [x] multithread tests

Reviewed-on: #354
Reviewed-by: Mikhail Frolov <mixa.frolov2003@gmail.com>
Reviewed-by: Kiril Lipatov <lipatov.kiril@gmail.com>
Co-authored-by: Egor00f <y.yarin@inbox.ru>
2026-08-04 12:49:19 +05:00
Egor00f 76294451d2 libc.obj: implement console output via SHELL (#354)
Build system / Build (en_US) (push) Successful in 3m18s
Build system / Build (es_ES) (push) Successful in 3m21s
Build system / Build (ru_RU) (push) Successful in 2m28s
Build system / Publish Images (push) Successful in 2m39s
Adding console I/O via the `SHELL`.

Demonstration of [http_tcp_demo.c](https://git.kolibrios.org/KolibriOS/kolibrios/src/branch/main/programs/develop/ktcc/libc.obj/samples/http_tcp_demo.c):
<video src="attachments/847d7d19-3d67-480d-80c8-6d678af61a43" title="Запись экрана от 2026-03-07 13-55-50.mp4" controls></video>

- [x] output
- [x] multithread
  - [x] add mutex
  - [x] multithread tests

Reviewed-on: #354
Reviewed-by: Mikhail Frolov <mixa.frolov2003@gmail.com>
Reviewed-by: Kiril Lipatov <lipatov.kiril@gmail.com>
Co-authored-by: Egor00f <y.yarin@inbox.ru>
2026-08-04 07:10:36 +00:00
LeencyandClaude Opus 5 031fe62338 kernel/net: fix the TCP keepalive timer expiry handler (#621)
Build system / Build (es_ES) (push) Successful in 2m12s
Build system / Build (en_US) (push) Successful in 2m18s
Build system / Build (ru_RU) (push) Successful in 2m18s
Build system / Publish Images (push) Successful in 1m40s
Summary: the keepalive handler compared the wrong field against the TCB
state constants, and walked into freed memory when the socket it killed was
released by tcp_disconnect.

Details:
Two independent defects in the same branch of tcp_timer_640ms.

First, the state test read TCP_SOCKET.state. That field is the inherited
SOCKET.state, an SS_* bitmask, not the TCB state machine; comparing it
against TCPS_ESTABLISHED compared a bitmask against an enum and decided
nothing meaningful. The TCB state lives in t_state. The comparison is also
changed from `ja` to `jae`, so only embryonic connections -- those whose
handshake never completed within TCP_time_keep_init -- are torn down here.
A synchronized connection now always falls through to .dont_kill, where it
either gets a keepalive probe (SO_KEEPALIVE set) or simply rearms the timer,
as in BSD. Previously an idle but perfectly healthy connection could be
dropped without the application ever asking for keepalives.

Second, the kill path did

        push    eax
        call    tcp_disconnect
        pop     eax
        jmp     .loop

and .loop dereferences SOCKET.NextPtr of that socket. But tcp_disconnect
jumps straight to tcp_close for a not-yet-synchronized connection, and
tcp_close calls socket_free -- so NextPtr was read out of freed kernel heap
and the timer thread continued its walk down a dangling pointer. The
successor is now saved before the call and the loop resumes at .check_only,
which is exactly what the timed-wait branch at the end of the same loop
already does.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Reviewed-on: #621
Reviewed-by: hidnplayr <hidnplayr@gmail.com>
Reviewed-by: Mikhail Frolov <mixa.frolov2003@gmail.com>
2026-08-03 18:28:35 +00:00
LeencyandClaude Opus 5 8766bfc546 kernel/net: free TCP sockets closed before the handshake completes (#620)
Build system / Build (en_US) (push) Successful in 3m21s
Build system / Build (es_ES) (push) Successful in 3m23s
Build system / Build (ru_RU) (push) Successful in 1m37s
Build system / Publish Images (push) Successful in 2m16s
Summary: socket_close() skipped both tcp_disconnect and socket_free for any
TCP socket that was not yet in the SS_ISCONNECTED state, leaking the socket
structure and leaving it on the net_sockets list forever.

Details:
The SS_ISCONNECTED gate in socket_close covered only fully established
connections. A socket closed while in SYN_SENT, SYN_RECEIVED or LISTEN, or
one that never connected at all, fell through to a bare `ret`: it was
neither disconnected nor freed. The 4 KiB socket structure and its two ring
buffers stayed allocated, the socket kept its place on net_sockets, its
timers kept being decremented by tcp_timer_640ms, and SOCKET.TID kept
pointing at a thread that was about to exit. A browser or any other
application that opens connections which fail to establish (refused,
filtered, or simply cancelled by the user) leaked one socket per attempt.

The gate is not needed: tcp_disconnect dispatches on the TCB state itself
and jumps straight to tcp_close -- which calls socket_free -- whenever
t_state is below TCPS_ESTABLISHED. Dropping the test therefore routes the
not-yet-synchronized cases to exactly the cleanup they were missing, and
leaves the established path untouched. The SS_ISDISCONNECTING test is kept,
so a second close() on a socket already shutting down is still a no-op.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Reviewed-on: #620
Reviewed-by: hidnplayr <hidnplayr@gmail.com>
Reviewed-by: Mikhail Frolov <mixa.frolov2003@gmail.com>
2026-08-03 18:08:29 +00:00
hidnplayr 2db92868a9 Updated IPv4 routing to perform best guess instead of hardcoded default device, until we have full routing. (#613)
Build system / Build (ru_RU) (push) Successful in 2m8s
Build system / Build (en_US) (push) Successful in 2m12s
Build system / Build (es_ES) (push) Successful in 2m17s
Build system / Publish Images (push) Successful in 1m49s
#612

Reviewed-on: #613
Reviewed-by: Mikhail Frolov <mixa.frolov2003@gmail.com>
Reviewed-by: Kiril Lipatov <lipatov.kiril@gmail.com>
Co-authored-by: hidnplayr <hidnplayr@gmail.com>
2026-08-02 16:54:07 +00:00
IgorA 4bdee82489 apps/palitra: small improvements (#626)
Build system / Build (es_ES) (push) Successful in 2m15s
Build system / Build (ru_RU) (push) Successful in 2m20s
Build system / Build (en_US) (push) Successful in 2m27s
Build system / Publish Images (push) Successful in 2m56s
- redraw sliders while moving the mouse,
- slider redrawing optimized

Reviewed-on: #626
Reviewed-by: Kiril Lipatov <lipatov.kiril@gmail.com>
Reviewed-by: Burer <burer@kolibrios.org>
Co-authored-by: IgorA <aie85playm@gmail.com>
2026-08-02 14:00:20 +00:00
Burer b9fe23b7b2 drivers: add serial and usbftdi to img (#628)
Build system / Build (en_US) (push) Successful in 2m21s
Build system / Build (es_ES) (push) Successful in 2m6s
Build system / Build (ru_RU) (push) Successful in 2m5s
Build system / Publish Images (push) Successful in 1m52s
By the request of @b00bl1k.

Reviewed-on: #628
Reviewed-by: Mikhail Frolov <mixa.frolov2003@gmail.com>
Reviewed-by: b00bl1k <alex@b00bl1k.ru>
2026-08-02 09:01:07 +00:00
b00bl1k d33a03c2e4 kernel/AHCI: preserve ebx/esi/edi in ahci_irq_handler
Check kernel codestyle / Check kernel codestyle (pull_request) Successful in 18s
Test PR / Build (en_US) (pull_request) Successful in 2m12s
Test PR / Build (ru_RU) (pull_request) Successful in 2m15s
Test PR / Build (es_ES) (pull_request) Successful in 2m18s
Build system / Build (es_ES) (push) Successful in 2m20s
Build system / Build (en_US) (push) Successful in 2m23s
Build system / Build (ru_RU) (push) Successful in 2m25s
Build system / Publish Images (push) Successful in 2m23s
2026-08-01 15:58:09 +05:00
LeencyandClaude Opus 5 35f35b39e7 kernel/net: scale the window before clamping it in tcp_respond
Check kernel codestyle / Check kernel codestyle (pull_request) Successful in 20s
Test PR / Build (en_US) (pull_request) Successful in 1m51s
Test PR / Build (es_ES) (pull_request) Successful in 1m56s
Test PR / Build (ru_RU) (pull_request) Successful in 2m0s
Build system / Build (en_US) (push) Successful in 2m7s
Build system / Build (es_ES) (push) Successful in 2m13s
Build system / Build (ru_RU) (push) Successful in 2m21s
Build system / Publish Images (push) Successful in 1m46s
Summary: tcp_respond clamped the free receive space to 65535 and only then
applied RCV_SCALE, so scaled ACKs and keepalives advertised a window far
smaller than the one actually available.

Подробно:
The window field of a TCP header is 16 bits wide and, when window scaling is
in effect, carries the free space shifted right by RCV_SCALE. The two
operations therefore have to happen in that order: shift first, then clamp
the result to TCP_max_win.

tcp_respond did the opposite. With a receive buffer larger than 64 KiB and
RCV_SCALE = 2, free space of 128 KiB was first cut down to 65535 and then
shifted to 16383, announcing 64 KiB instead of the full 128 KiB. The larger
the buffer and the scale factor, the worse the under-advertisement -- the
window only ever shrank, so the effect was lost throughput rather than
corruption, but it silently defeated window scaling on exactly the responses
that carry the window most often.

tcp_output already gets this right (it compares against TCP_max_win shl
RCV_SCALE before writing the field); tcp_respond now agrees with it.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-07-31 17:45:52 +00:00
Leency a020a2c434 kernel/net: fix wild write in tcp_set_persist
Check kernel codestyle / Check kernel codestyle (pull_request) Successful in 18s
Test PR / Build (es_ES) (pull_request) Successful in 2m27s
Test PR / Build (ru_RU) (pull_request) Successful in 2m31s
Test PR / Build (en_US) (pull_request) Successful in 2m34s
Build system / Build (en_US) (push) Successful in 2m10s
Build system / Build (es_ES) (push) Successful in 2m14s
Build system / Build (ru_RU) (push) Successful in 2m20s
Build system / Publish Images (push) Successful in 1m45s
tcp_set_persist takes the socket pointer in eax and uses ebx as a
scratch register to compute the RTO:

        mov     ebx, [eax + TCP_SOCKET.t_srtt]
        shr     ebx, 2
        add     ebx, [eax + TCP_SOCKET.t_rttvar]
        shr     ebx, 1
        mov     cl, [eax + TCP_SOCKET.t_rxtshift]
        shl     ebx, cl

By the time the persist timer is armed ebx therefore holds the timeout
value, not the socket. The flag store nevertheless went through ebx, so
it wrote to the linear address <RTO> + TCP_SOCKET.timer_flags -- an
unmapped low address -- instead of setting timer_flag_persist on the
socket.

Any TCP connection whose peer advertises a zero window takes this path
from tcp_output.enter_persist and faults the kernel:

        K : Page fault
        K : EBX : 0000000A
        K : EIP : 80037DF3   (tcp_set_persist, the flag store)
        K : Process - forced terminate PID: 00000005

Observed with NetSurf on a HTTP/2 connection to www.redhat.com, where
twelve multiplexed streams closed the receive window. Store the flag
through eax, which tcpt_rangeset leaves untouched.

Assisted-by: Claude Opus 5 <noreply@anthropic.com>
2026-07-31 17:32:55 +00:00
Leency 77d600c663 open: finally fix file association (#594)
Build system / Build (en_US) (push) Successful in 2m10s
Build system / Build (es_ES) (push) Successful in 2m21s
Build system / Build (ru_RU) (push) Successful in 2m21s
Build system / Publish Images (push) Successful in 3m16s
htm association with Netfurf never worked normally before!

Reviewed-on: #594
Reviewed-by: Burer <burer@kolibrios.org>
Reviewed-by: Mikhail Frolov <mixa.frolov2003@gmail.com>
Co-authored-by: leency <lipatov.kiril@gmail.com>
2026-07-30 02:34:26 +00:00
LeencyandClaude Opus 5 f7dd4033ba kernel/net: honour the window scale factor advertised by the peer (#619)
Build system / Build (es_ES) (push) Successful in 2m21s
Build system / Build (en_US) (push) Successful in 2m24s
Build system / Build (ru_RU) (push) Successful in 2m28s
Build system / Publish Images (push) Successful in 3m24s
Summary: the received window scale option was stored into SND_SCALE, which
the connection setup code then immediately overwrote with zero, so every
peer window was interpreted unscaled.

Details:
RFC 1323 negotiation is completed in two places -- the SYN_RECEIVED branch
and the active-open branch of tcp_input. Both do

        mov     ax, word[ebx + TCP_SOCKET.requested_s_scale]
        mov     word[ebx + TCP_SOCKET.SND_SCALE], ax

relying on the declared order of the four adjacent bytes SND_SCALE,
RCV_SCALE, requested_s_scale, request_r_scale to move both factors at once.
requested_s_scale, however, was never filled in: the option parser wrote the
peer's shift count into SND_SCALE directly, and that value was then clobbered
by the word move with the zero left in requested_s_scale by socket_alloc.

The result was that SND_SCALE ended up 0 on every connection while
TF_RCVD_SCALE was set, so a peer advertising, say, 64 KiB with a shift of 7
was read as advertising 512 bytes. Sending to any modern host was throttled
to a fraction of the real window.

The parser now stores into requested_s_scale, where the setup code expects
it, and clamps the value to TCP_max_winshift (14) as required by RFC 1323 --
a peer sending a larger shift must not be allowed to make our SND_WND
computation shift out of range.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Reviewed-on: #619
Reviewed-by: hidnplayr <hidnplayr@gmail.com>
Reviewed-by: Mikhail Frolov <mixa.frolov2003@gmail.com>
Co-authored-by: leency <lipatov.kiril@gmail.com>
2026-07-30 02:26:39 +00:00
b00bl1k 0ca124d6cb Update CONTRIBUTING guidelines (#598)
Build system / Build (en_US) (push) Successful in 2m12s
Build system / Build (ru_RU) (push) Successful in 2m20s
Build system / Build (es_ES) (push) Successful in 2m23s
Build system / Publish Images (push) Successful in 1m58s
It would be helpful for reviewers if contributors included an `Assisted-by` tag in commits prepared with the help of AI tools.

Reviewed-on: #598
Reviewed-by: Burer <burer@kolibrios.org>
Reviewed-by: Mikhail Frolov <mixa.frolov2003@gmail.com>
Reviewed-by: Gleb Zaharov <risdeveau@lair.moe>
Reviewed-by: Ivan B <1+dunkaist@noreply.localhost>
Co-authored-by: Alexey Ryabov <alex@b00bl1k.ru>
2026-07-25 07:35:46 +00:00
Burer 7365a98326 apps/cmm: take the c-- programs and the compiler config from their repositories (#585)
Build system / Build (es_ES) (push) Successful in 2m32s
Build system / Build (ru_RU) (push) Successful in 2m40s
Build system / Build (en_US) (push) Successful in 2m46s
Build system / Publish Images (push) Successful in 2m27s
Reviewed-on: #585
Reviewed-by: Kiril Lipatov <lipatov.kiril@gmail.com>
Reviewed-by: bad_Dr3dd0x <1702+bad_dr3dd0x@noreply.localhost>
2026-07-25 07:27:02 +00:00
Matou1306 9941a5dfc9 fs/ext: fix bug in ext_setFileEnd (#595)
Build system / Build (es_ES) (push) Successful in 2m15s
Build system / Build (en_US) (push) Successful in 2m19s
Build system / Build (ru_RU) (push) Successful in 2m22s
Build system / Publish Images (push) Successful in 2m28s
Discovered this bug when working on truncating a file with EXTENTS flag.
Basically ebx was getting cloberred which resulted in loading an incorrect address into eax.

Reviewed-on: #595
Reviewed-by: Burer <burer@kolibrios.org>
Reviewed-by: Mikhail Frolov <mixa.frolov2003@gmail.com>
Reviewed-by: Ivan B <1+dunkaist@noreply.localhost>
Co-authored-by: Matou <mathieubotros@gmail.com>
2026-07-25 06:31:49 +00:00
Leency 041029b406 kernel/AHCI: use IRQ instead of delay (#597)
Build system / Build (ru_RU) (push) Successful in 2m16s
Build system / Build (en_US) (push) Successful in 2m21s
Build system / Build (es_ES) (push) Successful in 2m24s
Build system / Publish Images (push) Successful in 1m53s
This change was proceeded by request of Rhimad, author of original AHCI driver.
Tested on real hardware.Reviewed-on: #597
Reviewed-by: Ivan B <1+dunkaist@noreply.localhost>
Reviewed-by: rgimad <3+rgimad@noreply.localhost>
2026-07-23 19:28:52 +00:00
LeencyandBurer 7c4d3f57e6 apps/bbench - CPU, graphics, memory and disk benchmark for KolibriOS (#561)
Build system / Build (en_US) (push) Successful in 2m19s
Build system / Build (es_ES) (push) Successful in 2m22s
Build system / Build (ru_RU) (push) Successful in 2m30s
Build system / Publish Images (push) Successful in 2m32s
- Add `bbench` to IMG and System Panel
  - Universal benchmark with 17 tests for CPU, graphics, memory and disk
  - Tests can be toggled and configured
  - Generates derailed reports in HTML
- Remove `MGB` and `FSPEED` from System Panel, move them from IMG to ISO

---------

Co-authored-by: Burer <burer@kolibrios.org>
Reviewed-on: #561
Reviewed-by: bad_Dr3dd0x <1702+bad_dr3dd0x@noreply.localhost>
Reviewed-by: Burer <burer@kolibrios.org>
Co-authored-by: leency <lipatov.kiril@gmail.com>
2026-07-23 13:51:18 +00:00
LeencyandBurer 00fb7afe33 libs/libimg: fix progressive jpeg 4:2:0 shear when width mod 16 = 8 (#590)
Build system / Build (en_US) (push) Successful in 3m5s
Build system / Build (es_ES) (push) Successful in 3m5s
Build system / Build (ru_RU) (push) Successful in 3m8s
Build system / Publish Images (push) Successful in 2m3s
Co-authored-by: Burer <burer@kolibrios.org>
Reviewed-on: #590
Reviewed-by: Burer <burer@kolibrios.org>
Reviewed-by: IgorA <22+igora@noreply.localhost>
Reviewed-by: Ivan B <1+dunkaist@noreply.localhost>
Co-authored-by: leency <lipatov.kiril@gmail.com>
2026-07-22 08:09:55 +00:00
Leency db846b5eee AddDevice: class EF subclass 04 protocol 01
Test PR / Build (en_US) (pull_request) Successful in 1m54s
Test PR / Build (es_ES) (pull_request) Successful in 1m59s
Test PR / Build (ru_RU) (pull_request) Successful in 2m7s
Build system / Build (es_ES) (push) Successful in 2m6s
Build system / Build (ru_RU) (push) Successful in 2m15s
Build system / Build (en_US) (push) Successful in 2m20s
Build system / Publish Images (push) Successful in 2m32s
2026-07-21 17:51:53 +00:00
Leency 686f18772a final update 2026-07-21 17:51:53 +00:00
Leency 9b7292f3e7 update 2 2026-07-21 17:51:53 +00:00
Leency e41362fb04 full support Huawei E3372h-153 modem 2026-07-21 17:51:53 +00:00
Leency bbc0f1262c usbnet: upload drivers usbcdc and usbrndis 2026-07-21 17:51:53 +00:00
Leency 5fb16b1d81 data/common: stl=/sys/3d/view3ds (#591)
Build system / Build (en_US) (push) Successful in 2m15s
Build system / Build (ru_RU) (push) Successful in 2m18s
Build system / Build (es_ES) (push) Successful in 2m22s
Build system / Publish Images (push) Successful in 2m22s
Reviewed-on: #591
Reviewed-by: hidnplayr <hidnplayr@gmail.com>
Reviewed-by: Burer <burer@kolibrios.org>
Co-authored-by: leency <lipatov.kiril@gmail.com>
2026-07-21 16:34:17 +00:00
567 changed files with 63171 additions and 275283 deletions

No files matched your search

+1 -1
View File
@@ -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
+1 -1
View File
@@ -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
+4 -2
View File
@@ -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
+4
View File
@@ -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
+6
View File
@@ -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
View File
@@ -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"},
+2 -1
View File
@@ -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
+2 -1
View File
@@ -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
+1 -1
View File
@@ -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
+1 -2
View File
@@ -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
+1 -1
View File
@@ -243,7 +243,7 @@ x=204
y=0
[22]
name=NETSURF
path=/sys/NETWORK/NSINST
path=/sys/NETWORK/NETSURF
param=
ico=125
x=204
+1
View File
@@ -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
+1 -1
View File
@@ -243,7 +243,7 @@ x=204
y=0
[22]
name=NETSURF
path=/sys/NETWORK/NSINST
path=/sys/NETWORK/NETSURF
param=
ico=125
x=204
+1
View File
@@ -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
+1 -2
View File
@@ -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
+1 -1
View File
@@ -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
+1 -1
View File
@@ -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
+1 -1
View File
@@ -243,7 +243,7 @@ x=204
y=0
[22]
name=NETSURF
path=/sys/NETWORK/NSINST
path=/sys/NETWORK/NETSURF
param=
ico=125
x=204
+2 -1
View File
@@ -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
+1 -2
View File
@@ -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
+11 -13
View File
@@ -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
+68 -19
View File
@@ -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
+59 -5
View File
@@ -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 ?
-5
View File
@@ -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
View File
@@ -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
+9
View File
@@ -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
View File
@@ -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 ?
+3
View File
@@ -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
+12 -2
View File
@@ -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
+468
View File
@@ -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.
File diff suppressed because it is too large. Load diff
+15 -3
View File
@@ -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
+19 -1
View File
@@ -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
View File
@@ -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
View File
@@ -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
View File
@@ -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
+13 -1
View File
@@ -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
+2 -1
View File
@@ -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
View File
@@ -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
+53 -6
View File
@@ -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
-2
View File
@@ -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
+7 -2
View File
@@ -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
+4 -4
View File
@@ -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
+4 -4
View File
@@ -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
View File
@@ -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
+1 -1
View File
@@ -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.
-6
View File
@@ -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")
-18
View File
@@ -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
}
-162
View File
@@ -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:
-6
View File
@@ -1,6 +0,0 @@
@c-- /D=LANG_ENG app_plus.c
@del *.
@rename *.com *.
@del warning.txt
@pause
-5
View File
@@ -1,5 +0,0 @@
@c-- /D=LANG_RUS app_plus.c
@del *.
@rename *.com *.
@del warning.txt
@pause
-6
View File
@@ -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")
-472
View File
@@ -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];
-5
View File
@@ -1,5 +0,0 @@
@c-- /D=LANG_ENG appearance.c
@del *.
@rename *.com *.
@del warning.txt
if not exist appearance ( @pause )
-5
View File
@@ -1,5 +0,0 @@
@c-- /D=LANG_RUS appearance.c
@del *.
@rename *.com *.
@del warning.txt
if not exist appearance ( @pause )
-106
View File
@@ -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);
}
-6
View File
@@ -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.
-317
View File
@@ -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:
-6
View File
@@ -1,6 +0,0 @@
@c-- /D=LANG_ENG barscfg.c
@pause
@del barscfg
@rename *.com *.
@del warning.txt
-6
View File
@@ -1,6 +0,0 @@
@c-- /D=LANG_RUS barscfg.c
@pause
@del barscfg
@rename *.com *.
@del warning.txt
-285
View File
@@ -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);
}
}
-43
View File
@@ -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';
}
}
-75
View File
@@ -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);
}
-113
View File
@@ -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;
}
-202
View File
@@ -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

-184
View File
@@ -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;
}
-513
View File
@@ -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");
//}
}
-117
View File
@@ -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;
}
-38
View File
@@ -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];
}
-6
View File
@@ -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
-17
View File
@@ -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
View File
@@ -1 +0,0 @@
c-- -D=LANG_ENG WebView.c
-64
View File
@@ -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;
}
-118
View File
@@ -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";
-36
View File
@@ -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┘,╨ ж                                     ж ж                  ,╨ ж                                                                                                                                                                                                                                                                                                                                                                        ▄▄▄
-19
View File
@@ -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&amp;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
-17
View File
@@ -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> Перемещает текстовый курсор в омнибокс
-121
View File
@@ -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, "&lt;");
new_buf+=4;
continue;
}
if ('>' == ESBYTE[i]) {
strcpy(new_buf, "&gt;");
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);
}
-49
View File
@@ -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> &nbsp;
<kosicon n=50><a href="//builds.kolibrios.org">Night-builds</a> &nbsp;
<kosicon n=50><a href="//ftp.kolibrios.org">FTP Server</a>
<pre>
By the way,
<font color="#555555">&bull; You can check for browser updates from the main menu.
&bull; To run a web search, type text in the address box and press Ctrl+Enter.
&bull; Pressing F6 moves the text cursor to the omnibox.
&bull; You can manually change the encoding of a page by clicking on the label in the bottom right corner.
~+
* +
' |
() .-.,="``"=. - o -
'=/_ \ |
* | '=.<a href=WebView:test>&nbsp;</a> |
\ `=./`, '
. '=.__.=' `=' *
+ +
O * ' .<font color=#DDD>jgs</font>
-49
View File
@@ -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> &nbsp;
<kosicon n=50><a href="//builds.kolibrios.org">Ночные сборки</a> &nbsp;
<kosicon n=50><a href="//ftp.kolibrios.org">FTP сервер</a>
<pre>
Кстати,
<font color="#555555">&bull; Из главного меню можно проверить наличие обновлений
&bull; Для поиска в Google наберите тест в адресной строке и нажмите Ctrl+Enter
&bull; Клавиша F6 перемещает текстовый курсор в омнибокс.
&bull; Можно изменить кодировку страницы, для этого нажмите на надпись в правом нижнем углу окна.
~+
* +
' |
() .-.,="``"=. - o -
'=/_ \ |
* | '=.<a href=WebView:test>&nbsp;</a> |
\ `=./`, '
. '=.__.=' `=' *
+ +
O * ' .<font color=#DDD>jgs</font>
@@ -1,14 +0,0 @@
<html>
<head><title>Page not found</title></head>
<body>
<h1>&nbsp;Webpage Not Available</h1>
<h2>&nbsp;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>&nbsp;Веб-страница недоступна <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>
-39
View File
@@ -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
View File
@@ -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:.
-10
View File
@@ -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=");
}
-91
View File
@@ -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>&lt;");
else if (SCRIPT == mode) {
if (!strncmp(i+1,"/script>", 8)) {
CloseAllOpenedFonts(NULL);
SourceBufAdd(TAG, "<font color=#00f>&lt;");
}
else SourceBufAdd(NULL, "&lt;");
}
else if (COMMENT == mode) {
SourceBufAdd(NULL, "&lt;");
}
else if (TEXT == mode) {
if (!strncmp(i+1,"script", 6)) activate_script_mode = true;
SourceBufAdd(TAG, "<font color=#00f>&lt;");
}
break;
case '>':
if (TAG == mode) && (activate_script_mode) {
activate_script_mode = false;
SourceBufAdd(SCRIPT, "&gt;</font><font color=#994500>");
}
else if (VALUE == mode) CloseAllOpenedFonts(TEXT);
else if (COMMENT == mode) && (!strncmp(i-2,"--", 2)) {
SourceBufAdd(TEXT, "&gt;");
CloseAllOpenedFonts(TEXT);
}
else if (COMMENT == mode) || (SCRIPT == mode) SourceBufAdd(NULL, "&gt;");
else if (TAG == mode) SourceBufAdd(TEXT, "&gt;</font>");
break;
case '&':
SourceBufAdd(NULL, "&amp;");
break;
case '\"':
case '\'':
if (TAG == mode) SourceBufAdd(VALUE, "<font color=#F301F2>&quot;");
else if (VALUE == mode) SourceBufAdd(TAG, "&quot;</font>");
else SourceBufAdd(NULL, "&quot;");
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);
}
-195
View File
@@ -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);
}
-119
View File
@@ -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 пока не реализованы (ахахаха). Поддержка тега &lt;table&gt; крайне базовая, поддержки вложенных таблиц нет.
</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>
&nbsp; &nbsp;
<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>
В этом тексте есть переход на следующую строку, но браузер
его должен проигнорировать. Еще много пробелов. А тут есть
табы. Кое-какие символы: &quot; &amp; &lt; &gt; &#149;
&nbsp; &copy; &reg; &bdquo; &ldquo; &#151; Їжачок іншого боку р. Євфрат з'їв ґрунт та єврейський ґербалайф.
<p>61055,&nbsp; &#1075;.
&#1061;&#1072;&#1088;&#1100;&#1082;&#1086;&#1074;, &#1091;&#1083;.&nbsp; &#1050;&#1088;&#1072;&#1089;&#1085;&#1086;&#1079;&#1085;&#1072;&#1084;&#1077;&#1085;&#1085;&#1072;&#1103;, 16</SPAN>,&nbsp; &#1088;&#1072;&#1076;&#1080;&#1086;&#1092;&#1080;&#1079;&#1080;&#1095;&#1077;&#1089;&#1082;&#1080;&#1081;
&#1082;&#1086;&#1088;&#1087;&#1091;&#1089; &#1085;&#1072; &#1090;&#1077;&#1088;&#1088;&#1080;&#1090;&#1086;&#1088;&#1080;&#1080; &#1053;&#1058;&#1059; «&#1061;&#1055;&#1048;»
</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>
-36
View File
@@ -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