[GSoC] WIP: FeedFlow - RSS Feeds Reader #379
Open
efpiem
wants to merge 51 commits from
efpiem/kolibrios:rss-atom-client into main
pull from: efpiem/kolibrios:rss-atom-client
merge into: KolibriOS:main
KolibriOS:main
KolibriOS:wolf3d-launcher
KolibriOS:kterm-upload
KolibriOS:app/socketdbg_fix1
KolibriOS:webview-3.96
KolibriOS:hdaudio-add-ring-buffer-for-unsolicied-events
KolibriOS:workflow-fuse
KolibriOS:rewrite-piano
KolibriOS:add-license-file-header-to-guide
KolibriOS:blocks-add-models
KolibriOS:shell-improve-cpuid
KolibriOS:rewrite_ide_drv
KolibriOS:add_usbother
KolibriOS:webview-3.91
KolibriOS:qrcodegen
KolibriOS:ci/update
KolibriOS:floppybird-window-fix
KolibriOS:laser-tank-fix-win-height
KolibriOS:improvement/commit-and-branch-styles
KolibriOS:docs/libs
Labels
Clear labels
C
Category/Applications
Category/Drivers
Category/General
Category/Kernel
Category/Libraries
Eolite
FASM
FS
GSoC
HardwareTested
HLL
Influence/Settings
Influence/Text/TYPO
IRCC
Kernel
Pay for the code
This issue in GSoC program
Kind
Breaking
Breaking change that won't be backward compatible
Kind
Bug
Something is not working
Kind
Build
Kind
Documentation
Documentation changes
Kind
Enhancement
Improve existing functionality
Kind
Feature
New functionality
Kind
Security
This is security issue
Kind
Testing
Issue or pull request related to testing
Paid task
PR
Conflicts
PR conflicts with main
PR
Dependent
This PR is dependent on another PR
Priority
Critical
The priority is critical
Priority
High
The priority is high
Priority
Low
The priority is low
Priority
Medium
The priority is medium
PR
Ready to merge
Pull request is ready for merge
PR
Request changes
Changes requested in pull request
PR
Review required
Reviewed
Confirmed
Issue has been confirmed
Reviewed
Duplicate
This issue or pull request already exists
Reviewed
Invalid
Invalid issue
Reviewed
Won't Fix
This issue won't be fixed
Status
Abandoned
Somebody has started to work on this but abandoned work
Status
Blocked
Something is blocking this issue or pull request
Status
Need More Info
Feedback is required to reproduce issue or to continue work
No Label
Milestone
No items
No Milestone
Projects
Clear projects
No project
No Assignees
Notifications
Due Date
No due date set.
Dependencies
No dependencies set.
Reference: KolibriOS/kolibrios#379
Reference in New Issue
Block a user
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
Delete Branch "efpiem/kolibrios:rss-atom-client"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Hello KolibriOS Team,
Here is my test task submission for GSoC 2026. This PR introduces a FASM application that, using the
asm-xmlstatic library, successfully parses the customtest.xmlfile (defined byemployees_schema.xml), traverses the generated memory tree, and displays the extracted XML data on the GUI.Technical highlights of this implementation:
Please let me know if you have any feedback or need any adjustments. Thank you for your time reviewing this!
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.
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.
As requested, here is a showcase of the application running successfully.
The application successfully loads
test.xmland 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!
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.
file_bufferandschema_bufferare 1024 bytes each, but file sizes (already known from the info call) are never checked before reading. Oversized XML silently overwritesparse_context,class_context, and the stack.event_loop.classFromString/initializeClassParsererrors leavedisplay_textset tomsg_ok("File Loaded!") whileparse_textstays "Parse Failed" — misleading combination. No way to distinguish file I/O errors from schema or parse errors.Element.nextSiblingdereferences garbage. If more, they're ignored. Needs a loop with a null check.push 16,push 24). If the schema changes, these break silently. Should be named constants.SSF_END_DRAWat the end ofdraw_window. May cause redraw artifacts in KolibriOS.extract_textcalling convention mixes implicit register (eax) with stack parameter — inconsistent; easy to misuse.0x27enables keyboard and mouse events that are never handled in the event loop.rb 0does nothing;align 1024for BSS buffers is excessive —align 4oralign 16suffices.msg_fail/msg_parse_failedare only used as default values, never set on specific error paths — confirms the error-handling gap.Hi! Thank you so much for taking the time to write such a detailed review.
Some of these mistakes (like missing
SSF_END_DRAWand 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.xmlfile, 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! 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:
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.extract_text.Visual proof of UI and Edge-Case Handling:
Notice how it safely skips missing tags without leaving blank UI gaps.
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, 60is 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_textinitialized to 0. If the firstSF_FILEcall fails,SF_DRAW_TEXTreceives a null pointer.channel_*anditem_*(title, link, desc, lang/pub + lengths) are declared but never referenced. Dead data.xml_ptrandschema_ptrare not released on exit. KolibriOS reclaims on termination, but explicit cleanup is better practice.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!
@@ -0,0 +11,4 @@include "../../macros.inc"include "../../KOSfuncs.inc"include "./asm-xml.asm"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!
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!
\0. If the allocator doesn't zero-fill memory, the parser will read past the buffer boundary.; load test.xml— the code actually loadsrss_feed.xml.status_textis set tomsg_oktwice — after loading the schema and again after parsing. The first assignment is redundant.SF_FILEreturn code is checked, not whether the file was read in full.cmp bx, 60/je .extract_looponly works with a specific RSS structure and will break with any different nesting.channel_title,channel_link,item_title,item_link, etc. are declared but never referenced..deschas a stray leading space.Hi!
I've addressed the feedback from the previous review. Here is a breakdown of the specific changes:
xml.objcommitted to repo – binary artifact should not be version-controlled; build from source insteadcmp [status_text], msg_okbreaks silently if data layout changes; use a dedicatedparsed_ok db 04inrept 4 counter– hardcoded attribute count; defineRSS_ATTR_COUNT = 4for maintainabilitymsg_loadingstring – initialized but never reset after successful parse; user sees "Loading..." if window is redrawn before file loadsbx–add bx, 10/20in the draw loop is unbounded; deep RSS feeds will draw text off-screenreptblock skipseaxrestore on first iteration – counter=1 path relies on[esp+4]being valid before the firstmov eaxinside the loop; fragile if calling context changesHi!
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:
cmp [status_text], msg_okpointer check with a dedicatedparsed_ok db 0flag.SSF_GET_FONT_SIZE.Hi!
As suggested, I introduced the
box_libscrollbar 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:
Screenshots:


@efpiem, great progress, I think we are closer to the RSS client than ever now.
Again, your progress is impressive! Please, keep going
@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!
[GSoC] RSS/Atom news readerto [GSoC] WIP: FeedFlow - RSS Feeds ReaderHi!
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:
This week (May 14-20) I focused on the Network Engine. In particular, Key updates:
Hi! This week I focused on network testing and bug fixes:
test.asm.In general, code looks clean and readable.
I did not test the application yet this time, only reviewed source.
Some small remarks:
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.
Label syntax:
local labels (those starting with a dot) may be offset with two spaces.
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.
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)
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.
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.
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.
Hi!
Thank you for the detailed review. This week I focused on addressing your feedback.
Here is a summary of the changes:
feedflow.asmwas 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.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/
View command line instructions
Checkout
From your project repository, check out a new branch and test the changes.