[GSoC] WIP: FeedFlow - RSS Feeds Reader #379

Open
efpiem wants to merge 51 commits from efpiem/kolibrios:rss-atom-client into main
First-time contributor

Hello KolibriOS Team,

Here is my test task submission for GSoC 2026. This PR introduces a FASM application that, using the asm-xml static library, successfully parses the custom test.xml file (defined by employees_schema.xml), traverses the generated memory tree, and displays the extracted XML data on the GUI.

Technical highlights of this implementation:

  • Dynamically assigned the number of bytes to read by extracting the file size from the file information structure before loading the XML buffers.
  • Wrote custom wrapper functions for memory allocation to strictly adhere to the cdecl calling convention required by asm-xml, carefully protecting preserved registers.
  • Adhered to the KolibriOS formatting rules (8-space commands, 16-space short mnemonics, strict comma spacing, and zero tab characters).
  • Clearly defined and documented all input parameters and expected return values for all custom functions.

Please let me know if you have any feedback or need any adjustments. Thank you for your time reviewing this!

Hello KolibriOS Team, Here is my test task submission for GSoC 2026. This PR introduces a FASM application that, using the `asm-xml` static library, successfully parses the custom `test.xml` file (defined by `employees_schema.xml`), traverses the generated memory tree, and displays the extracted XML data on the GUI. **Technical highlights of this implementation:** - Dynamically assigned the number of bytes to read by extracting the file size from the file information structure before loading the XML buffers. - Wrote custom wrapper functions for memory allocation to strictly adhere to the cdecl calling convention required by asm-xml, carefully protecting preserved registers. - Adhered to the KolibriOS formatting rules (8-space commands, 16-space short mnemonics, strict comma spacing, and zero tab characters). - Clearly defined and documented all input parameters and expected return values for all custom functions. Please let me know if you have any feedback or need any adjustments. Thank you for your time reviewing this!
efpiem added 1 commit 2026-03-19 17:08:33 +00:00
add xml parser for local test file using asm-xml
Build system / Check kernel codestyle (pull_request) Has been cancelled
Build system / Build (pull_request) Has been cancelled
ee73ba4f46
Owner

Hello!

Would you like to join our Discord, Telegram, Matrix or IRC for direct communication?

That is not required, but would make things just easier.

Hello! Would you like to join our Discord, Telegram, Matrix or IRC for direct communication? That is not required, but would make things just easier.
Author
First-time contributor

I'm already on Discord as @efpiem and I was also on Telegram (as @efpiem, too) but I think the anti-spam bot banned me earlier for posting the link of this PR.
Feel free to send a message anytime.

I'm already on Discord as @efpiem and I was also on Telegram (as @efpiem, too) but I think the anti-spam bot banned me earlier for posting the link of this PR. Feel free to send a message anytime.
dunkaist requested review from dunkaist 2026-03-19 23:36:37 +00:00
Author
First-time contributor

As requested, here is a showcase of the application running successfully.

image.png

The application successfully loads test.xml and the schema, parses the memory tree via the statically linked asm-xml library, and renders the extracted employee attributes directly to the GUI.

Let me know if you need any other details!

As requested, here is a showcase of the application running successfully. ![image.png](/attachments/17eb6f08-2317-454d-8b2f-c05a7a9e2b5a) The application successfully loads `test.xml` and the schema, parses the memory tree via the statically linked asm-xml library, and renders the extracted employee attributes directly to the GUI. Let me know if you need any other details!
Burer requested changes 2026-03-21 07:49:32 +00:00
Dismissed
Burer left a comment
Owner

Hi!

I reviwed code and found several problems.

Overall, that is good start, but I recommend you to fix this problems and/or expand this prototype functionality in order to increase value of your application - for example, make it more agile to parse any local RSS feed file, not only simple test schema.

  • Buffer overflow risk. file_buffer and schema_buffer are 1024 bytes each, but file sizes (already known from the info call) are never checked before reading. Oversized XML silently overwrites parse_context, class_context, and the stack.
  • Silent error handling. Every failure jumps straight to event_loop. classFromString/initializeClassParser errors leave display_text set to msg_ok ("File Loaded!") while parse_text stays "Parse Failed" — misleading combination. No way to distinguish file I/O errors from schema or parse errors.
  • Hardcoded to exactly 2 employees. If the XML has fewer, Element.nextSibling dereferences garbage. If more, they're ignored. Needs a loop with a null check.
  • Magic attribute offsets (push 16, push 24). If the schema changes, these break silently. Should be named constants.
  • Missing SSF_END_DRAW at the end of draw_window. May cause redraw artifacts in KolibriOS.
  • extract_text calling convention mixes implicit register (eax) with stack parameter — inconsistent; easy to misuse.
  • Event mask 0x27 enables keyboard and mouse events that are never handled in the event loop.
  • rb 0 does nothing; align 1024 for BSS buffers is excessive — align 4 or align 16 suffices.
  • msg_fail / msg_parse_failed are only used as default values, never set on specific error paths — confirms the error-handling gap.
Hi! I reviwed code and found several problems. Overall, that is good start, but I recommend you to fix this problems and/or expand this prototype functionality in order to increase value of your application - for example, make it more agile to parse any local RSS feed file, not only simple test schema. - **Buffer overflow risk.** `file_buffer` and `schema_buffer` are 1024 bytes each, but file sizes (already known from the info call) are never checked before reading. Oversized XML silently overwrites `parse_context`, `class_context`, and the stack. - **Silent error handling.** Every failure jumps straight to `event_loop`. `classFromString`/`initializeClassParser` errors leave `display_text` set to `msg_ok` ("File Loaded!") while `parse_text` stays "Parse Failed" — misleading combination. No way to distinguish file I/O errors from schema or parse errors. - **Hardcoded to exactly 2 employees.** If the XML has fewer, `Element.nextSibling` dereferences garbage. If more, they're ignored. Needs a loop with a null check. - **Magic attribute offsets** (`push 16`, `push 24`). If the schema changes, these break silently. Should be named constants. - **Missing `SSF_END_DRAW`** at the end of `draw_window`. May cause redraw artifacts in KolibriOS. - **`extract_text` calling convention** mixes implicit register (`eax`) with stack parameter — inconsistent; easy to misuse. - **Event mask `0x27`** enables keyboard and mouse events that are never handled in the event loop. - **`rb 0` does nothing;** `align 1024` for BSS buffers is excessive — `align 4` or `align 16` suffices. - **`msg_fail` / `msg_parse_failed`** are only used as default values, never set on specific error paths — confirms the error-handling gap.
Author
First-time contributor

Hi! Thank you so much for taking the time to write such a detailed review.

Some of these mistakes (like missing SSF_END_DRAW and the excessive alignment) are definitely due to my inexperience with FASM, so I really appreciate the guidance!

For the hardcoded values and buffer sizes, I originally wrote it strictly to parse the test.xml file, but you are right, expanding it to be agile enough for a real RSS feed is the right move.

My original thought with the error messages was to set them to 'fail' by default and only overwrite them on success, but I see how jumping straight to the event loop on an error creates a misleading UI state.

I will fix all of these issues and push an updated prototype that can handle a standard local RSS feed. Thanks again!

Hi! Thank you so much for taking the time to write such a detailed review. Some of these mistakes (like missing `SSF_END_DRAW` and the excessive alignment) are definitely due to my inexperience with FASM, so I really appreciate the guidance! For the hardcoded values and buffer sizes, I originally wrote it strictly to parse the `test.xml` file, but you are right, expanding it to be agile enough for a real RSS feed is the right move. My original thought with the error messages was to set them to 'fail' by default and only overwrite them on success, but I see how jumping straight to the event loop on an error creates a misleading UI state. I will fix all of these issues and push an updated prototype that can handle a standard local RSS feed. Thanks again!
efpiem added 4 commits 2026-03-22 09:51:41 +00:00
Author
First-time contributor

Hi! I've fixed the issues pointed out in the previous review and completely hardened the parser to handle real-world data safely.

Here is a breakdown of the specific changes:

  • Addressed buffer overflow risk: switched to dynamic allocation using SSF_MEM_ALLOC. I'm aware that for files under 4KB this allocates a minimum 4KB page, but I believe the safety trade-off is well worth the memory footprint.
  • Fixed the inconsistent calling convention in extract_text.
  • Resolved KolibriOS API and FASM syntax errors.
  • Added strict error handling for file loading, schema parsing, and tree climbing.
  • Content extraction process now safely handles missing roots/channels/items.
  • UI now only draws text if the target tags (TITLE, LINK, DESC, LANG_OR_PUB) actually exist in the node.
  • Tested against real-world feeds (BBC, Hacker News, Wired). It extracts data flawlessly, although they clearly don't fit the app window. The next step will be adding a Y-coordinate boundary check to safely stop the drawing loop at the bottom edge, followed by a scrollbar.

Visual proof of UI and Edge-Case Handling:

image.png
Notice how it safely skips missing tags without leaving blank UI gaps.

Hi! I've fixed the issues pointed out in the previous review and completely hardened the parser to handle real-world data safely. Here is a breakdown of the specific changes: - Addressed buffer overflow risk: switched to dynamic allocation using `SSF_MEM_ALLOC`. I'm aware that for files under 4KB this allocates a minimum 4KB page, but I believe the safety trade-off is well worth the memory footprint. - Fixed the inconsistent calling convention in `extract_text`. - Resolved KolibriOS API and FASM syntax errors. - Added strict error handling for file loading, schema parsing, and tree climbing. - Content extraction process now safely handles missing roots/channels/items. - UI now only draws text if the target tags (TITLE, LINK, DESC, LANG_OR_PUB) actually exist in the node. - Tested against real-world feeds (BBC, Hacker News, Wired). It extracts data flawlessly, although they clearly don't fit the app window. The next step will be adding a Y-coordinate boundary check to safely stop the drawing loop at the bottom edge, followed by a scrollbar. **Visual proof of UI and Edge-Case Handling:** ![image.png](/attachments/9ca2e17e-c038-40f3-bee7-4a72757d62b3) Notice how it safely skips missing tags without leaving blank UI gaps.
Burer requested changes 2026-03-22 11:57:37 +00:00
Dismissed
Burer left a comment
Owner

Hi!

Nice progress.
At this point, I recommend you to start working on your GSoC application, as well as continue to work on code.

Probrelms I see in current version:

  • cmp bx, 60 is a magic constant. This special-cases spacing for the first child node. If the tree structure differs from the expected RSS layout, spacing breaks.
  • status_text initialized to 0. If the first SF_FILE call fails, SF_DRAW_TEXT receives a null pointer.
  • channel_* and item_* (title, link, desc, lang/pub + lengths) are declared but never referenced. Dead data.
  • xml_ptr and schema_ptr are not released on exit. KolibriOS reclaims on termination, but explicit cleanup is better practice.
Hi! Nice progress. At this point, I recommend you to start working on your GSoC application, as well as continue to work on code. Probrelms I see in current version: - `cmp bx, 60` is a magic constant. This special-cases spacing for the first child node. If the tree structure differs from the expected RSS layout, spacing breaks. - `status_text` initialized to 0. If the first `SF_FILE` call fails, `SF_DRAW_TEXT` receives a null pointer. - `channel_*` and `item_*` (title, link, desc, lang/pub + lengths) are declared but never referenced. Dead data. - `xml_ptr` and `schema_ptr` are not released on exit. KolibriOS reclaims on termination, but explicit cleanup is better practice.
Author
First-time contributor

Thank you so much for the review. I'm currently outlining my proposal and will share it as soon as possible. In the meantime, I'll work on these fixes and push an update shortly. Thanks again for the guidance!

Thank you so much for the review. I'm currently outlining my proposal and will share it as soon as possible. In the meantime, I'll work on these fixes and push an update shortly. Thanks again for the guidance!
dunkaist requested changes 2026-03-23 20:00:40 +00:00
Dismissed
@@ -0,0 +11,4 @@
include "../../macros.inc"
include "../../KOSfuncs.inc"
include "./asm-xml.asm"
Owner

Please, use the dynamically loadable library of asm-xml, don't compile it in. https://board.kolibrios.org/viewtopic.php?p=32909#p32909

Otherwise looks good to me!

Please, use the dynamically loadable library of asm-xml, don't compile it in. https://board.kolibrios.org/viewtopic.php?p=32909#p32909 Otherwise looks good to me!
Author
First-time contributor

I've refactored this section to use dynamic linking via dll.Load instead of static linking.
I’ve also implemented explicit error handling to ensure the app exits gracefully if the library is missing from /sys/lib.

Let me know what you think about it!

I've refactored this section to use dynamic linking via dll.Load instead of static linking. I’ve also implemented explicit error handling to ensure the app exits gracefully if the library is missing from /sys/lib. Let me know what you think about it!
dunkaist marked this conversation as resolved
Burer requested changes 2026-03-26 11:12:46 +00:00
Dismissed
Burer left a comment
Owner
  • Missing null-terminator for XML buffers. Memory is allocated exactly to the file size without +1 for \0. If the allocator doesn't zero-fill memory, the parser will read past the buffer boundary.
  • Stale comment ; load test.xml — the code actually loads rss_feed.xml.
  • status_text is set to msg_ok twice — after loading the schema and again after parsing. The first assignment is redundant.
  • No verification of complete file read. Only the SF_FILE return code is checked, not whether the file was read in full.
  • Hardcoded tree traversal logiccmp bx, 60 / je .extract_loop only works with a specific RSS structure and will break with any different nesting.
  • Unused variableschannel_title, channel_link, item_title, item_link, etc. are declared but never referenced.
  • Inconsistent formatting — label .desc has a stray leading space.
- **Missing null-terminator for XML buffers.** Memory is allocated exactly to the file size without +1 for `\0`. If the allocator doesn't zero-fill memory, the parser will read past the buffer boundary. - **Stale comment `; load test.xml`** — the code actually loads `rss_feed.xml`. - **`status_text` is set to `msg_ok` twice** — after loading the schema and again after parsing. The first assignment is redundant. - **No verification of complete file read.** Only the `SF_FILE` return code is checked, not whether the file was read in full. - **Hardcoded tree traversal logic** — `cmp bx, 60` / `je .extract_loop` only works with a specific RSS structure and will break with any different nesting. - **Unused variables** — `channel_title`, `channel_link`, `item_title`, `item_link`, etc. are declared but never referenced. - **Inconsistent formatting** — label ` .desc` has a stray leading space.
efpiem added 6 commits 2026-03-26 20:30:41 +00:00
- correct stale comment regarding test.xml
- remove redundant status_text assignment to msg_ok
- remove unused variables (channel_* and item_*)
- fix inconsistent label indentation for '.desc'
- replaced coordinate-based logic (cmp bx, 60) with an attribute_printed flag.
- set status_text default to "Loading..." to ensure a valid pointer is always passed to SF_DRAW_TEXT.
- switch from static linking to dynamic loading of 'xml.obj' via dll.Load.
- implement explicit release of AXParseContext and AXClassContext on termination.
- add error handling for library loading.
refactor: replaced manual TITLE/LINK/DESC/LANG_PUB blocks with a 'rept' macro loop
Build system / Check kernel codestyle (pull_request) Has been cancelled
Build system / Build (pull_request) Has been cancelled
c4ba2c3752
efpiem added 1 commit 2026-03-26 20:51:18 +00:00
refactor: use sizeof.AXAttribute and restore eax reload in loop
Build system / Check kernel codestyle (pull_request) Has been cancelled
Build system / Build (pull_request) Has been cancelled
554ba7ecbc
- Replaced hardcoded magic number (8) with `sizeof.AXAttribute` for better
  portability and readability.
- Restored `mov eax, [esp+4]` inside the `rept` block.
Author
First-time contributor

Hi!

I've addressed the feedback from the previous review. Here is a breakdown of the specific changes:

  • Dynamic Library Integration: Migrated to xml.obj via dll.Load. I've also added explicit error handling to prevent crashes if the library is missing.
  • Memory Safety & Lifecycle:
    • Implemented explicit cleanup for AXParseContext and AXClassContext upon application exit.
    • Added logic to release xml_ptr and schema_ptr heap allocations, ensuring no memory leaks occur on termination.
    • Verified file read completion and ensured proper null-termination for the XML parser.
  • UI Logic & Spacing:
    • Replaced "magic constant" coordinate checks (cmp bx, 60) with an attribute_printed state flag.
    • Set status_text to a safe default ("Loading...") to eliminate null-pointer risks during the initial SF_DRAW_TEXT calls.
  • Code Optimization:
    • Refactored the attribute extraction logic into a rept macro loop.
    • Cleaned up the codebase by removing unused variables (channel_, item_) and fixing stale comments.
Hi! I've addressed the feedback from the previous review. Here is a breakdown of the specific changes: - **Dynamic Library Integration**: Migrated to xml.obj via dll.Load. I've also added explicit error handling to prevent crashes if the library is missing. - **Memory Safety & Lifecycle:** - Implemented explicit cleanup for AXParseContext and AXClassContext upon application exit. - Added logic to release xml_ptr and schema_ptr heap allocations, ensuring no memory leaks occur on termination. - Verified file read completion and ensured proper null-termination for the XML parser. - **UI Logic & Spacing**: - Replaced "magic constant" coordinate checks (cmp bx, 60) with an attribute_printed state flag. - Set status_text to a safe default ("Loading...") to eliminate null-pointer risks during the initial SF_DRAW_TEXT calls. - **Code Optimization**: - Refactored the attribute extraction logic into a rept macro loop. - Cleaned up the codebase by removing unused variables (channel_*, item_*) and fixing stale comments.
dunkaist approved these changes 2026-03-27 09:13:10 +00:00
Burer requested changes 2026-03-28 12:13:38 +00:00
Burer left a comment
Owner
  • xml.obj committed to repo – binary artifact should not be version-controlled; build from source instead
  • Pointer used as status flagcmp [status_text], msg_ok breaks silently if data layout changes; use a dedicated parsed_ok db 0
  • Magic 4 in rept 4 counter – hardcoded attribute count; define RSS_ATTR_COUNT = 4 for maintainability
  • msg_loading string – initialized but never reset after successful parse; user sees "Loading..." if window is redrawn before file loads
  • No bounds check on bxadd bx, 10/20 in the draw loop is unbounded; deep RSS feeds will draw text off-screen
  • rept block skips eax restore on first iteration – counter=1 path relies on [esp+4] being valid before the first mov eax inside the loop; fragile if calling context changes
- **`xml.obj` committed to repo** – binary artifact should not be version-controlled; build from source instead - **Pointer used as status flag** – `cmp [status_text], msg_ok` breaks silently if data layout changes; use a dedicated `parsed_ok db 0` - **Magic `4` in `rept 4 counter`** – hardcoded attribute count; define `RSS_ATTR_COUNT = 4` for maintainability - **`msg_loading` string** – initialized but never reset after successful parse; user sees "Loading..." if window is redrawn before file loads - **No bounds check on `bx`** – `add bx, 10/20` in the draw loop is unbounded; deep RSS feeds will draw text off-screen - **`rept` block skips `eax` restore on first iteration** – counter=1 path relies on `[esp+4]` being valid before the first `mov eax` inside the loop; fragile if calling context changes
efpiem added 5 commits 2026-04-02 15:57:37 +00:00
efpiem added 1 commit 2026-04-05 00:15:24 +00:00
feat: implement dynamic UI rendering
Build system / Check kernel codestyle (pull_request) Successful in 1m26s
Build system / Build (pull_request) Successful in 11m33s
fbb4ddad52
- Add system-aware window creation using `SSF_GET_COLORS` and `SSF_GET_SKIN_HEIGHT`.
- Replace hardcoded Y-axis magic numbers (10, 20) with dynamic line heights based on system font size.
- Refactor the main drawing loop by extracting `draw_bounded_text` and `draw_attribute` into modular subroutines.
- Define `RSS_SCHEMA_PATH` and `RSS_FEED_PATH` constants at the top of the file.
- Automatically trigger a UI redraw event upon successful XML parsing.
Author
First-time contributor

Hi!
I have addressed the recent code review feedback and made the UI rendering logic dynamic. I've attached a screenshot demonstrating the app successfully parsing the HackerNews feed and bounding the text both horizontally and vertically.

Changes Implemented:

  • Removed binary tracking: Removed xml.obj from version control (now building from source).
  • State Management: Replaced the fragile cmp [status_text], msg_ok pointer check with a dedicated parsed_ok db 0 flag.
  • Magic Numbers Eliminated: Replaced magic Y-step constants (10, 20) with dynamic line heights using SSF_GET_FONT_SIZE.
  • Bounds Checking: The UI now dynamically wraps text on the X-axis and safely halts drawing if it hits the Y-axis window boundary.

image.png

Hi! I have addressed the recent code review feedback and made the UI rendering logic dynamic. I've attached a screenshot demonstrating the app successfully parsing the [HackerNews feed](https://news.ycombinator.com/rss) and bounding the text both horizontally and vertically. Changes Implemented: - **Removed binary tracking:** Removed xml.obj from version control (now building from source). - **State Management:** Replaced the fragile `cmp [status_text], msg_ok` pointer check with a dedicated `parsed_ok db 0` flag. - **Magic Numbers Eliminated:** Replaced magic Y-step constants (10, 20) with dynamic line heights using `SSF_GET_FONT_SIZE`. - **Bounds Checking:** The UI now dynamically wraps text on the X-axis and safely halts drawing if it hits the Y-axis window boundary. ![image.png](/attachments/a5b7b651-1c84-41c6-878e-6ffb63e852bd)
efpiem added 4 commits 2026-04-17 16:02:43 +00:00
Initial implementation of the vertical scrollbar using a
two-pass rendering architecture: a math pass for computing
max_area, and a draw pass for rendering the visible text.
chore: add RSS Hacker News Feed to test the vertical scrollbar
Build system / Check kernel codestyle (pull_request) Successful in 1m8s
Build system / Build (pull_request) Successful in 10m47s
b310d8d2ba
efpiem added 1 commit 2026-04-18 13:50:51 +00:00
feat: implement UI dynamic resizing
Build system / Check kernel codestyle (pull_request) Successful in 1m12s
Build system / Build (pull_request) Successful in 11m9s
8c1a907b67
* Added SF_THREAD_INFO to copy the live client area coordinates into local variables (WIN BOX).
* Every redraw event now triggers a math pass (to compute the scrollbar max_area) and a draw pass (to configure the scrollbar and paint the text).
* Replaced hardcoded text bounds with live client width/height math for perfect wrapping and clipping.
* Shrunk line_height to a 16-bit word and extracted text X/Y offsets into pure constants.
Author
First-time contributor

Hi!

As suggested, I introduced the box_lib scrollbar for better readability of long feeds. Furthermore, I implemented a dynamic UI resizing system using a two-pass rendering architecture. The application now perfectly word-wraps and clips text based on the live client area of the window.

Key Changes:

  • Input Controls: Added full support for mouse wheel scrolling and keyboard navigation (Up/Down arrows, Page Up/Page Down).
  • Dynamic UI Resizing: Replaced hardcoded text bounds with live client width/height math.
    • Used SF_THREAD_INFO to copy live client area coordinates into local variables (WIN BOX).
    • Redraw events now trigger a "math pass" to accurately compute the scrollbar's max_area, followed by a "draw pass" to configure the scrollbar and paint the text.
  • Font Update: Switched to the big system font (8x16 UTF-8) for main feed content to improve readability.
  • Test Data: Added a Hacker News RSS feed to the workspace to properly test vertical scrolling and heavy text wrapping.

Screenshots:
image.png
image.png

Hi! As suggested, I introduced the `box_lib` scrollbar for better readability of long feeds. Furthermore, I implemented a dynamic UI resizing system using a two-pass rendering architecture. The application now perfectly word-wraps and clips text based on the live client area of the window. Key Changes: - **Input Controls:** Added full support for mouse wheel scrolling and keyboard navigation (Up/Down arrows, Page Up/Page Down). - **Dynamic UI Resizing:** Replaced hardcoded text bounds with live client width/height math. - Used SF_THREAD_INFO to copy live client area coordinates into local variables (WIN BOX). - Redraw events now trigger a "math pass" to accurately compute the scrollbar's max_area, followed by a "draw pass" to configure the scrollbar and paint the text. - **Font Update:** Switched to the big system font (8x16 UTF-8) for main feed content to improve readability. - **Test Data:** Added a Hacker News RSS feed to the workspace to properly test vertical scrolling and heavy text wrapping. Screenshots: ![image.png](/attachments/607c84b5-85f3-46a5-95eb-f714d4fbe24e) ![image.png](/attachments/c5f7217e-9593-4869-a839-be872af0b574)
Owner

@efpiem, great progress, I think we are closer to the RSS client than ever now.

  1. Why don't you give your rss client a name? It's for you to decide but I believe that 'rss-atom-client' is a quite boring name for a program.
  2. Please, rename the file(s) in your directory. At the moment, I can't understand which file is the main one by just looking at the directory. It is probably xmlparser.asm, but such things should be easy to understand. For example, in ftpd you can clearly see ftpd.asm as the main file.
  3. It is not clear how to build your program. Please, use our build system, tup. You can find many example build files around the repository, they are called 'Tupfile.lua'. Ping me if it isn't obvious how to setup tup on your machine. But first read build.txt in the root of kolibrios repo.
  4. Currently you are concentrated on a GUI client, why not. That said, RSS and Atom logic doesn't depend on UI. In theory, somebody can want a minimalistic console RSS client like newsboat. If you separate the UI code into a program and the feed logic into a library, another person can implement such a newsboat-like client using your library. You have already started using dynamic libraries, maybe it's time to implement your own one too. This will be good for the architecture of your project and for your experience.
  5. It is not obvious from the files in the repo how you test your program. Maybe your RSS client should accept an xml file as a command line argument, then dump some output which you can test automatically (compare against some reference output). The further you go, the more time you will spend on manual testing. Set up an automatic testing script/framework until it takes too much time.
  6. In general, your code looks good enough. I don't think we should spend time on minor issues now. What is of most importance at this early stage is architecture and processes. So, please, think about 4 and 5 while you are addressing 1--3.

Again, your progress is impressive! Please, keep going

@efpiem, great progress, I think we are closer to the RSS client than ever now. 1. Why don't you give your rss client a name? It's for you to decide but I believe that 'rss-atom-client' is a quite boring name for a program. 2. Please, rename the file(s) in your directory. At the moment, I can't understand which file is the main one by just looking at the directory. It is probably xmlparser.asm, but such things should be easy to understand. For example, in [ftpd](https://git.kolibrios.org/KolibriOS/kolibrios/src/branch/main/programs/network/ftpd) you can clearly see ftpd.asm as the main file. 3. It is not clear how to build your program. Please, use our build system, tup. You can find many example build files around the repository, they are called 'Tupfile.lua'. Ping me if it isn't obvious how to setup tup on your machine. But first read build.txt in the root of kolibrios repo. 4. Currently you are concentrated on a GUI client, why not. That said, RSS and Atom logic doesn't depend on UI. In theory, somebody can want a minimalistic console RSS client like [newsboat](https://www.google.com/search?client=firefox-b-d&hs=ew4U&udm=2&fbs=ADc_l-aN0CWEZBOHjofHoaMMDiKpmAsnXCN5UBx17opt8eaTX-iVZ7JibxEA2X7M_ninQtyPvLjOMD8rEbvmEXFkpf-BZ9Ye0DvaGo2VIh3rPCRxJragnb-9eJaaEkLpI3ApzEqtrkBm0K6fWTOfx3azLlfHO7rdzNROTSoE3YbHrmnVygZLmPQE55Tx-C0llcaWI-pdhHMSgWl3F3wDL9J1Hfo8Vc8l7Q&q=newsboat&sa=X). If you separate the UI code into a program and the feed logic into a library, another person can implement such a newsboat-like client using your library. You have already started using dynamic libraries, maybe it's time to implement your own one too. This will be good for the architecture of your project and for your experience. 5. It is not obvious from the files in the repo how you test your program. Maybe your RSS client should accept an xml file as a command line argument, then dump some output which you can test automatically (compare against some reference output). The further you go, the more time you will spend on manual testing. Set up an automatic testing script/framework until it takes too much time. 6. In general, your code looks good enough. I don't think we should spend time on minor issues now. What is of most importance at this early stage is architecture and processes. So, please, think about 4 and 5 while you are addressing 1--3. Again, your progress is impressive! Please, keep going
Author
First-time contributor

@dunkaist thank you so much for the encouraging feedback and the architectural advice! I really appreciate the guidance.
I'm really excited to build my own dynamic library and I completely agree about the testing and build system. I will be working on these updates over the next few days.
Thank you again for all the support so far!

@dunkaist thank you so much for the encouraging feedback and the architectural advice! I really appreciate the guidance. I'm really excited to build my own dynamic library and I completely agree about the testing and build system. I will be working on these updates over the next few days. Thank you again for all the support so far!
efpiem added 11 commits 2026-05-13 17:06:32 +00:00
- Embed the RSS schema into the binary
- Replace UI error jumps with eax return codes
- Add file structures for RSS file populated at runtime
- test.asm calls the parser, extracts attribute data and writes them to
  an output file
- helper test functions in test_rss_parser.inc
- automatic system shutdown upon completion for integration with bash
  script
test: add automated test bash script and test cases
Build system / Check kernel codestyle (pull_request) Successful in 1m34s
Build system / Build (pull_request) Successful in 11m17s
228ac4554d
- add comprehensive suite of XML inputs covering standard payloads and
  edge cases
- add corresponding '.expected' files as reference output
efpiem changed title from [GSoC] RSS/Atom news reader to [GSoC] WIP: FeedFlow - RSS Feeds Reader 2026-05-20 16:34:41 +00:00
efpiem added 3 commits 2026-05-20 17:39:48 +00:00
Implement dynamic HTTP downloader and in-memory RSS parsing
Build system / Check kernel codestyle (pull_request) Successful in 40s
Build system / Build (pull_request) Successful in 9m43s
031b6f671c
- Implement an HTTP downloader with dynamic heap allocation (network.inc)
- Refactor the XML parser to process raw memory buffers
- Pipe the downloaded network buffer directly into the parser
Author
First-time contributor

Hi!
To keep everything simple and in one place, I thought of posting my weekly updates here. I attach here also the GSoC proposal.

Last week (May 6-13) I focused on project setup and testing. Key updates:

  • Officially named the application FeedFlow, renamed the core files to match, and set up the Tup build system.
  • Restructured the codebase into clean modules (ui.inc, rss_parser.inc) and added support for CLI parameters to load specific RSS files.
  • Built an automated test suite (test.asm + bash script) with comprehensive XML edge cases and expected reference outputs.

This week (May 14-20) I focused on the Network Engine. In particular, Key updates:

  • Built a streaming HTTP downloader with dynamic reallocation.
  • Refactored the XML parser to read data directly from the downloaded RAM buffers instead of relying on local disk I/O.
  • Cleaned up the project architecture by extracting string utilities, UI constants, and error-handling logic into dedicated helper files.
Hi! To keep everything simple and in one place, I thought of posting my weekly updates here. I attach here also the GSoC proposal. Last week (May 6-13) I focused on project setup and testing. Key updates: - Officially named the application FeedFlow, renamed the core files to match, and set up the Tup build system. - Restructured the codebase into clean modules (ui.inc, rss_parser.inc) and added support for CLI parameters to load specific RSS files. - Built an automated test suite (test.asm + bash script) with comprehensive XML edge cases and expected reference outputs. This week (May 14-20) I focused on the Network Engine. In particular, Key updates: - Built a streaming HTTP downloader with dynamic reallocation. - Refactored the XML parser to read data directly from the downloaded RAM buffers instead of relying on local disk I/O. - Cleaned up the project architecture by extracting string utilities, UI constants, and error-handling logic into dedicated helper files.
efpiem added 7 commits 2026-05-27 18:43:37 +00:00
Author
First-time contributor

Hi! This week I focused on network testing and bug fixes:

  • Testing: Integrated a Python mock HTTP server and added unit tests for file downloads, buffer reallocation, and failure handling.
  • Architecture: Refactored error handling into subroutines and added command-line parameter validation, unifying parser and network testing inside test.asm.
  • UX & Performance: Stopped the app from redrawing while in the background and added native @notify popups for import errors.
Hi! This week I focused on network testing and bug fixes: - **Testing:** Integrated a Python mock HTTP server and added unit tests for file downloads, buffer reallocation, and failure handling. - **Architecture:** Refactored error handling into subroutines and added command-line parameter validation, unifying parser and network testing inside `test.asm`. - **UX & Performance:** Stopped the app from redrawing while in the background and added native @notify popups for import errors.
Member

In general, code looks clean and readable.
I did not test the application yet this time, only reviewed source.

Some small remarks:

  1. Source/data layout:
    Usually, application has all the executable code at the beginning of the binary, and data at the end.
    Hence, the @import section is normally at the end of the source file.
    Also, if you want to place data in .inc files, you can use iglobal/uglobal macros to place them in the initialized/uninitialized data sections respectively, while maintaining readability.

  2. Label syntax:
    local labels (those starting with a dot) may be offset with two spaces.

  3. Call conventions.
    I noticed the ASMXML has been built with the C-calling convention, almost all existing libraries currently are using stdcall instead.
    Perhaps it would be better to also switch it to this convention.

  4. Data after I_END.
    Just don’t forget that it will be uninitialized when the program loads. It could be zero's, but don’t count on it.
    Also, for single data elements please use "db ?" instead of "rb 1". (There is also dw, dd and dq of course)

  5. Command line parameters (and URL in general).
    It seems you have reserved 1024 bytes for cmd line parameters (and URLs).
    It could be a bit too short (what is current limit in KolibriOS?).
    All bytes written that do not fit into the buffer will go straight into the stack heap!
    Moreover, the copy_sz routine does not take the maximum length into account which is a recipe for disaster.
    Perhaps you can find inspiration in "safe string" c library functions.

  6. We discussed unnecessary redraws before.
    I notice you put a check in the code to see if the window is on top.
    Unfortunately, it's not a good solution, the window must be redrawn when another window that is partially above has been moved.
    You'll need to find out why the window was redrawn unnecessarily under some conditions, and fix the issue at the source.

  7. Locals on the stack in draw_attribute.
    You could use the "proc" macro from proc32.inc for this purpose, to increase the readability and maintainability.
    When using proc/endp you can use locals macro to declare local data on the stack, with named labels.

In general, code looks clean and readable. I did not test the application yet this time, only reviewed source. Some small remarks: 1. Source/data layout: Usually, application has all the executable code at the beginning of the binary, and data at the end. Hence, the @import section is normally at the end of the source file. Also, if you want to place data in .inc files, you can use iglobal/uglobal macros to place them in the initialized/uninitialized data sections respectively, while maintaining readability. 2. Label syntax: local labels (those starting with a dot) may be offset with two spaces. 3. Call conventions. I noticed the ASMXML has been built with the C-calling convention, almost all existing libraries currently are using stdcall instead. Perhaps it would be better to also switch it to this convention. 4. Data after I_END. Just don’t forget that it will be uninitialized when the program loads. It could be zero's, but don’t count on it. Also, for single data elements please use "db ?" instead of "rb 1". (There is also dw, dd and dq of course) 5. Command line parameters (and URL in general). It seems you have reserved 1024 bytes for cmd line parameters (and URLs). It could be a bit too short (what is current limit in KolibriOS?). All bytes written that do not fit into the buffer will go straight into the stack heap! Moreover, the copy_sz routine does not take the maximum length into account which is a recipe for disaster. Perhaps you can find inspiration in "safe string" c library functions. 6. We discussed unnecessary redraws before. I notice you put a check in the code to see if the window is on top. Unfortunately, it's not a good solution, the window must be redrawn when another window that is partially above has been moved. You'll need to find out why the window was redrawn unnecessarily under some conditions, and fix the issue at the source. 7. Locals on the stack in draw_attribute. You could use the "proc" macro from proc32.inc for this purpose, to increase the readability and maintainability. When using proc/endp you can use locals macro to declare local data on the stack, with named labels.
efpiem added 7 commits 2026-06-03 18:43:34 +00:00
Author
First-time contributor

Hi!
Thank you for the detailed review. This week I focused on addressing your feedback.
Here is a summary of the changes:

  • URL Buffer & String Safety: I rewrote copy_sz to act as a safe strlcpy equivalent with bounds-checking. However, I realized its use in feedflow.asm was actually unnecessary. I refactored the code passing the URL pointer directly to the network library via eax. I also increased the CLI buffer limit to 64KB.
  • Unnecessary Redraws: I removed the window-on-top check and fixed the issue by checking if the scrollbar position has actually changed before triggering a redraw.
  • Source & Data Layout: I moved the @IMPORT section to the end of the file and implemented the iglobal and uglobal macros for better readability. I also cleaned up the data after I_END, making sure to use ? for uninitialized memory.
  • Syntax & Readability: All local labels are now properly offset with two spaces, and I rewrote draw_attribute utilizing the proc32.inc macros to cleanly manage local variables on the stack.
Hi! Thank you for the detailed review. This week I focused on addressing your feedback. Here is a summary of the changes: - URL Buffer & String Safety: I rewrote copy_sz to act as a safe strlcpy equivalent with bounds-checking. However, I realized its use in `feedflow.asm` was actually unnecessary. I refactored the code passing the URL pointer directly to the network library via eax. I also increased the CLI buffer limit to 64KB. - Unnecessary Redraws: I removed the window-on-top check and fixed the issue by checking if the scrollbar position has actually changed before triggering a redraw. - Source & Data Layout: I moved the @IMPORT section to the end of the file and implemented the iglobal and uglobal macros for better readability. I also cleaned up the data after I_END, making sure to use ? for uninitialized memory. - Syntax & Readability: All local labels are now properly offset with two spaces, and I rewrote draw_attribute utilizing the proc32.inc macros to cleanly manage local variables on the stack.
Member

Hi. Looks like AsmXML is BSD licensed. Does that work with this program's license?

Hi. Looks like [AsmXML](https://tibleiz.net/asm-xml/index.html) is BSD licensed. Does that work with this program's license?
Member

Hi. Looks like AsmXML is BSD licensed. Does that work with this program's license?

It depends on the specific revision of the BSD license, which the author unfortunately did not specify.
See: https://en.wikipedia.org/wiki/BSD_licenses
We'll need to contact the author to confirm

> Hi. Looks like [AsmXML](https://tibleiz.net/asm-xml/index.html) is BSD licensed. Does that work with this program's license? It depends on the specific revision of the BSD license, which the author unfortunately did not specify. See: https://en.wikipedia.org/wiki/BSD_licenses We'll need to contact the author to confirm
Member

Hi. Looks like AsmXML is BSD licensed. Does that work with this program's license?

It depends on the specific revision of the BSD license, which the author unfortunately did not specify.
See: https://en.wikipedia.org/wiki/BSD_licenses
We'll need to contact the author to confirm

Furthermore, the author of AsmXml (Marc Kerbiquet) has released one of his own examples of using AsmXml under GPLv2 license. See https://tibleiz.net/woodrat-reader/

> > Hi. Looks like [AsmXML](https://tibleiz.net/asm-xml/index.html) is BSD licensed. Does that work with this program's license? > > It depends on the specific revision of the BSD license, which the author unfortunately did not specify. > See: https://en.wikipedia.org/wiki/BSD_licenses > We'll need to contact the author to confirm Furthermore, the author of AsmXml (Marc Kerbiquet) has released one of his own examples of using AsmXml under GPLv2 license. See https://tibleiz.net/woodrat-reader/
All checks were successful
Build system / Check kernel codestyle (pull_request) Successful in 28s
Required
Details
Build system / Build (pull_request) Successful in 10m35s
Required
Details
This pull request doesn't have enough required approvals yet. 1 of 2 official approvals granted.
This branch is out-of-date with the base branch
You are not authorized to merge this pull request.
View command line instructions

Checkout

From your project repository, check out a new branch and test the changes.
git fetch -u http://git.kolibrios.org/efpiem/kolibrios rss-atom-client:efpiem-rss-atom-client
git checkout efpiem-rss-atom-client
Sign in to join this conversation.
No Reviewers
5 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: KolibriOS/kolibrios#379