<div dir="ltr"><div><span class="gmail-router-outlet-wrapper gmail-ng-tns-c4274809755-0"><p class="gmail-ng-star-inserted"><span><span class="gmail-ng-star-inserted">Hi everyone,</span></span></p><p class="gmail-ng-star-inserted"><span><span class="gmail-ng-star-inserted">Last night, Prof. Lima asked a question about PoC2. He wondered</span><br class="gmail-ng-star-inserted"><span class="gmail-ng-star-inserted"></span><span class="gmail-ng-star-inserted">why </span><span class="gmail-inline-code gmail-ng-star-inserted">forName</span><span class="gmail-ng-star-inserted"> returned null for services like</span><br class="gmail-ng-star-inserted"><span class="gmail-ng-star-inserted"></span><span class="gmail-inline-code gmail-ng-star-inserted">com.sun.star.style.StyleFamily</span><span class="gmail-ng-star-inserted"> and</span><br class="gmail-ng-star-inserted"><span class="gmail-ng-star-inserted"></span><span class="gmail-inline-code gmail-ng-star-inserted">com.sun.star.frame.Desktop</span><span class="gmail-ng-star-inserted">. Now, it has hit me.</span></span></p><p class="gmail-ng-star-inserted"><span><span class="gmail-ng-star-inserted">My initial thought was that </span><span class="gmail-inline-code gmail-ng-star-inserted">theCoreReflection::forName()</span><br class="gmail-ng-star-inserted"><span class="gmail-ng-star-inserted"></span><span class="gmail-ng-star-inserted">fails for services because their definitions are in XML, not</span><br class="gmail-ng-star-inserted"><span class="gmail-ng-star-inserted"></span><span class="gmail-ng-star-inserted">binary </span><span class="gmail-inline-code gmail-ng-star-inserted">.rdb</span><span class="gmail-ng-star-inserted"> files. However, I realized the issue is more</span><br class="gmail-ng-star-inserted"><span class="gmail-ng-star-inserted"></span><span class="gmail-ng-star-inserted">fundamental:</span></span></p><p class="gmail-ng-star-inserted"><span><span class="gmail-ng-star-inserted">The </span><span class="gmail-inline-code gmail-ng-star-inserted">forName()</span><span class="gmail-ng-star-inserted"> method is primarily designed for UNO </span><span style="font-style:italic" class="gmail-ng-star-inserted"><span><span class="gmail-ng-star-inserted">type names</span></span></span><span class="gmail-ng-star-inserted">,</span><br class="gmail-ng-star-inserted"><span class="gmail-ng-star-inserted"></span><span class="gmail-ng-star-inserted">not </span><span style="font-style:italic" class="gmail-ng-star-inserted"><span><span class="gmail-ng-star-inserted">service names</span></span></span><span class="gmail-ng-star-inserted">. In the codebase, it's used for type</span><br class="gmail-ng-star-inserted"><span class="gmail-ng-star-inserted"></span><span class="gmail-ng-star-inserted">introspection and reflection.</span></span></p><p class="gmail-ng-star-inserted"><span><span class="gmail-ng-star-inserted">Example from </span><span class="gmail-inline-code gmail-ng-star-inserted">basctl/source/basicide/baside2b.cxx</span><span class="gmail-ng-star-inserted"> shows</span><br class="gmail-ng-star-inserted"><span class="gmail-ng-star-inserted"></span><span class="gmail-inline-code gmail-ng-star-inserted">forName</span><span class="gmail-ng-star-inserted"> obtaining </span><span class="gmail-inline-code gmail-ng-star-inserted">xClass</span><span class="gmail-ng-star-inserted"> for type introspection:<span class="gmail_default" style="font-family:comic sans ms,sans-serif"> </span></span></span><span class="gmail-router-outlet-wrapper gmail-ng-tns-c4274809755-0"><span class="gmail-ng-star-inserted">2957-2967</span></span></p></span><span class="gmail-router-outlet-wrapper gmail-ng-tns-c4274809755-0"><pre><code><span class="gmail-hljs-keyword">try</span><br>{
  <span class="gmail-hljs-comment">// Get the base class for reflection:</span>
  xClass = css::reflection::theCoreReflection::<span class="gmail-hljs-keyword">get</span>(
    comphelper::getProcessComponentContext())->forName(sVarType);
}<br><span class="gmail-hljs-keyword">catch</span>( <span class="gmail-hljs-keyword">const</span> Exception& )<br>{
  bCanComplete = <span class="gmail-hljs-literal">false</span>;
  <span class="gmail-hljs-keyword">return</span>;
}</code></pre></span><span class="gmail-router-outlet-wrapper gmail-ng-tns-c4274809755-0"><p class="gmail-ng-star-inserted"><span><span class="gmail-ng-star-inserted">The method returns an </span><span class="gmail-inline-code gmail-ng-star-inserted">XIdlClass</span><span class="gmail-ng-star-inserted"> object used to introspect</span><br class="gmail-ng-star-inserted"><span class="gmail-ng-star-inserted"></span><span class="gmail-ng-star-inserted">UNO types, providing access to their methods and fields for</span><br class="gmail-ng-star-inserted"><span class="gmail-ng-star-inserted"></span><span class="gmail-ng-star-inserted">code completion.<span class="gmail_default" style="font-family:comic sans ms,sans-serif"> </span></span></span><span class="gmail-router-outlet-wrapper gmail-ng-tns-c4274809755-0"><span class="gmail-ng-star-inserted">2974-2986</span></span></p></span><span class="gmail-router-outlet-wrapper gmail-ng-tns-c4274809755-0"><pre><code><span class="gmail-hljs-function"><span class="gmail-hljs-built_in">std</span>::<span class="gmail-hljs-built_in">vector</span>< OUString > <span class="gmail-hljs-title">UnoTypeCodeCompletetor::GetXIdlClassMethods</span><span class="gmail-hljs-params">()</span>
<span class="gmail-hljs-keyword">const</span> </span>{
  <span class="gmail-hljs-built_in">std</span>::<span class="gmail-hljs-built_in">vector</span>< OUString > aRetVect;
  <span class="gmail-hljs-keyword">if</span>( bCanComplete && ( xClass != <span class="gmail-hljs-literal">nullptr</span> ) )<br><span class="gmail_default" style="font-family:comic sans ms,sans-serif">    </span><span class="gmail_default" style="font-family:comic sans ms,sans-serif"></span><span class="gmail_default" style="font-family:comic sans ms,sans-serif"></span>{
    <span class="gmail-hljs-keyword">const</span> Sequence< Reference< reflection::XIdlMethod > > aMethods =
      xClass->getMethods();
    <span class="gmail-hljs-keyword">for</span>(Reference< reflection::XIdlMethod > <span class="gmail-hljs-keyword">const</span> & rMethod : aMethods)<br><span class="gmail_default" style="font-family:comic sans ms,sans-serif">       </span>{
      aRetVect.push_back( rMethod->getName() );
    }
  }
  <span class="gmail-hljs-keyword">return</span> aRetVect; <span class="gmail-hljs-comment">// This is empty when cannot code complete</span>
}</code></pre></span><span class="gmail-router-outlet-wrapper gmail-ng-tns-c4274809755-0"><p class="gmail-ng-star-inserted"><span><span class="gmail-ng-star-inserted"><br></span></span></p><p class="gmail-ng-star-inserted"><span><span class="gmail-ng-star-inserted"><u>Think of it this way:</u></span><br class="gmail-ng-star-inserted"><span class="gmail-ng-star-inserted"></span><span class="gmail-ng-star-inserted">A </span><strong class="gmail-ng-star-inserted"><span><span class="gmail-ng-star-inserted">Type</span></span></strong><span class="gmail-ng-star-inserted"> (like an interface, struct, or enum) is a </span><span style="font-style:italic" class="gmail-ng-star-inserted"><span><span class="gmail-ng-star-inserted">blueprint</span></span></span><span class="gmail-ng-star-inserted">.</span><br class="gmail-ng-star-inserted"><span class="gmail-ng-star-inserted"></span><span class="gmail-ng-star-inserted">It's a concrete definition of a data structure or methods. Like</span><br class="gmail-ng-star-inserted"><span class="gmail-ng-star-inserted"></span><span class="gmail-ng-star-inserted">a "Spark Plug" part number (</span><span class="gmail-inline-code gmail-ng-star-inserted">com.sun.star.beans.XPropertySet</span><span class="gmail-ng-star-inserted">).</span><br class="gmail-ng-star-inserted"><span class="gmail-ng-star-inserted"></span><span class="gmail-ng-star-inserted">Types are registered in </span><span class="gmail-inline-code gmail-ng-star-inserted">TypeDescriptionManager</span><span class="gmail-ng-star-inserted"> via</span><br class="gmail-ng-star-inserted"><span class="gmail-ng-star-inserted"></span><span class="gmail-inline-code gmail-ng-star-inserted">XHierarchicalNameAccess</span><span class="gmail-ng-star-inserted">.</span></span></p><p class="gmail-ng-star-inserted"><span><span class="gmail-ng-star-inserted">A </span><strong class="gmail-ng-star-inserted"><span><span class="gmail-ng-star-inserted">Service</span></span></strong><span class="gmail-ng-star-inserted"> (like </span><span class="gmail-inline-code gmail-ng-star-inserted">com.sun.star.frame.Desktop</span><span class="gmail-ng-star-inserted">) is a </span><span style="font-style:italic" class="gmail-ng-star-inserted"><span><span class="gmail-ng-star-inserted">job</span><br class="gmail-ng-star-inserted"><span class="gmail-ng-star-inserted"></span><span class="gmail-ng-star-inserted">description</span></span></span><span class="gmail-ng-star-inserted"> or </span><span style="font-style:italic" class="gmail-ng-star-inserted"><span><span class="gmail-ng-star-inserted">product specification</span></span></span><span class="gmail-ng-star-inserted">. It's an abstract concept</span><br class="gmail-ng-star-inserted"><span class="gmail-ng-star-inserted"></span><span class="gmail-ng-star-inserted">that says, "A 'Desktop' must have these features/support these</span><br class="gmail-ng-star-inserted"><span class="gmail-ng-star-inserted"></span><span class="gmail-ng-star-inserted">blueprints (interfaces)." It doesn't define methods itself; it</span><br class="gmail-ng-star-inserted"><span class="gmail-ng-star-inserted"></span><span class="gmail-ng-star-inserted">references other blueprints. Like a "Car Engine" spec that</span><br class="gmail-ng-star-inserted"><span class="gmail-ng-star-inserted"></span><span class="gmail-ng-star-inserted">requires spark plugs, pistons, etc. Services are registered in</span><br class="gmail-ng-star-inserted"><span class="gmail-ng-star-inserted"></span><span class="gmail-ng-star-inserted">the service manager via </span><span class="gmail-inline-code gmail-ng-star-inserted">XMultiServiceFactory::createInstance()</span><span class="gmail-ng-star-inserted">.</span></span></p><p class="gmail-ng-star-inserted"><span><span class="gmail-ng-star-inserted">So, </span><span class="gmail-inline-code gmail-ng-star-inserted"><b>theCoreReflection::forName()</b></span><span class="gmail-ng-star-inserted"> looks up blueprints (Types),</span><br class="gmail-ng-star-inserted"><span class="gmail-ng-star-inserted"></span><span class="gmail-ng-star-inserted">not job descriptions (Services). When we call </span><span class="gmail-inline-code gmail-ng-star-inserted">forName</span><span class="gmail-ng-star-inserted"> with a</span><br class="gmail-ng-star-inserted"><span class="gmail-ng-star-inserted"></span><span class="gmail-ng-star-inserted">service name like </span><span class="gmail-inline-code gmail-ng-star-inserted">"com.sun.star.frame.Desktop"</span><span class="gmail-ng-star-inserted">, it fails</span><br class="gmail-ng-star-inserted"><span class="gmail-ng-star-inserted"></span><span class="gmail-ng-star-inserted">because no single, concrete blueprint exists with that name.</span><br class="gmail-ng-star-inserted"><span class="gmail-ng-star-inserted"></span><span class="gmail-ng-star-inserted">"Desktop" is a concept, an aggregation of many types/interfaces.</span><br class="gmail-ng-star-inserted"><span class="gmail-ng-star-inserted"></span><span class="gmail-inline-code gmail-ng-star-inserted">theCoreReflection</span><span class="gmail-ng-star-inserted"> is for type introspection, not service</span><br class="gmail-ng-star-inserted"><span class="gmail-ng-star-inserted"></span><span class="gmail-ng-star-inserted">discovery.</span></span></p><p class="gmail-ng-star-inserted"><span><span class="gmail-ng-star-inserted"><b>I hav<span style="font-family:arial,sans-serif">e <span class="gmail_default">two</span> q</span>uestio<span style="font-family:arial,sans-serif">n:</span></b><span style="font-family:arial,sans-serif"> <span class="gmail_default">1. </span></span>When </span><span class="gmail-inline-code gmail-ng-star-inserted">.rdb</span><span class="gmail-ng-star-inserted"> files are loaded by LibreOffice</span><br class="gmail-ng-star-inserted"><span class="gmail-ng-star-inserted"></span><span class="gmail-ng-star-inserted">Runtime, are their contents placed into a single, unified</span><br class="gmail-ng-star-inserted"><span class="gmail-ng-star-inserted"></span><span class="gmail-ng-star-inserted">in-memory database, or do they maintain separation within that</span><br class="gmail-ng-star-inserted"><span class="gmail-ng-star-inserted"></span><span class="gmail-ng-star-inserted">memory space? With older binary </span><span class="gmail-inline-code gmail-ng-star-inserted">.rdb</span><span class="gmail-ng-star-inserted"> files, </span><span class="gmail-inline-code gmail-ng-star-inserted">regmerge</span><span class="gmail-ng-star-inserted"> was used</span><br class="gmail-ng-star-inserted"><span class="gmail-ng-star-inserted"></span><span class="gmail-ng-star-inserted">to consolidate data from separate </span><span class="gmail-inline-code gmail-ng-star-inserted">.rdb</span><span class="gmail-ng-star-inserted"> files.</span></span></p></span><span class="gmail-router-outlet-wrapper gmail-ng-tns-c4274809755-0"></span></div><div><span class="gmail-router-outlet-wrapper gmail-ng-tns-c4274809755-0" style="font-family:arial,sans-serif"><span class="gmail-ng-star-inserted"><span class="gmail_default">2. </span></span></span><span style="font-family:arial,sans-serif">How can we programmatically distinguish a "service name" from an<br><span class="gmail_default"></span><span class="gmail_default">   </span>"interface name"? I know interfaces often start with 'X', but is there<br><span class="gmail_default">   </span>a more definitive method than just naming conventions?</span></div><div><span class="gmail-router-outlet-wrapper gmail-ng-tns-c4274809755-0"><span class="gmail-ng-star-inserted"><br></span></span></div><div><span class="gmail-router-outlet-wrapper gmail-ng-tns-c4274809755-0"><span class="gmail-ng-star-inserted"><br></span></span></div><div class="gmail_quote gmail_quote_container"><div dir="ltr" class="gmail_attr">On Tue, 17 Jun 2025 at 18:50, Devansh Varshney <<a href="mailto:varshney.devansh614@gmail.com">varshney.devansh614@gmail.com</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><div dir="ltr"><div dir="ltr"><div style="font-family:comic sans ms,sans-serif"><span><pre><code>Hi Everyone,

Thank you Stephan. After your mail, I looked <span>into</span> this more.
Here<span>'s what I found:
<a href="https://cgit.freedesktop.org/libreoffice/core/log/unoidl?h=libreoffice-4.2.8.2&id=72b8e929af5bcfb7d17a74de636fb1ef5204297b&showmsg=1" target="_blank">https://cgit.freedesktop.org/libreoffice/core/log/unoidl?h=libreoffice-4.2.8.2&id=72b8e929af5bcfb7d17a74de636fb1ef5204297b&showmsg=1</a>
(This is in reverse chronological order.) <br></span></code><span><pre>commit -   320571bf701a092d0f2d15fd4589ae271802a03f</pre></span><code><span>
The cgit logs from 2013, primarily by Stephan Bergmann, document
a massive refactoring of LibreOffice'</span>s core UNO infrastructure.

<b>The "Old World" (Legacy, pre<span>-2013</span>):</b>
LibreOffice inherited a <span>system</span> <span>from</span> OpenOffice.org that used a
toolchain <span>of</span> idlc, regmerge, <span>and</span> regview.
<span>-</span> .idl files compiled <span>by</span> idlc <span>into</span> <span>binary</span> .urd (UNO Reflection
  Data).
<span>-</span> regmerge <span>then</span> combined these .urd files <span>into</span> a <span>large</span>, complex,
  legacy<span>-</span>format <span>binary</span> registry file (.rdb).
<span>-</span> regview was the tool designed <span>to</span> read this <span>old</span> format.

<b>The "New World" (The <span>2013</span> unoidl Refactoring):</b>
<span>-</span> Goal: Replace the <span>old</span>, cumbersome <span>system</span> <span>with</span> something
  more modern, efficient, <span>and</span> easier <span>to</span> maintain.
<span>-</span> Solution: The unoidl <span>module</span> was created <span>to</span> be the central
  authority <span>for</span> handling UNO type information.

<b>The <span>New</span> Tools:</b>
<span>-</span> <b>unoidl<span>-</span>write:</b> Replaced idlc <span>and</span> regmerge. It compiles .idl
  files directly <span>into</span> the <span>new</span>, more efficient <span>binary</span> format.
<span>-</span> <b>unoidl<span>-</span>read:</b> Replaced regview. Its <span>specific</span> purpose <span>is</span>
  <span>to</span> read the <span>new</span> .rdb files <span>and</span> dump their contents <span>in</span> a
  human<span>-</span>readable, IDL<span>-</span><span>like</span> format.
<span>-</span> <b>unoidl<span>-</span><span>check</span></b>: Replaced regcompare <span>for</span> API compatibility.

<b>What this history tells us:</b>
<span>-</span> <i>Why regview Failed:</i> My <span>initial</span> PoC attempts <span>to</span> use regview
  <span>on</span> a modern LibreOffice build failed because I was <span>using</span> a
  legacy tool <span>on</span> <span>new</span> files. We were trying <span>to</span> read a Blu<span>-</span>ray
  <span>with</span> a VHS player.
<span>-</span> <i>The Correct Tool:</i> This confirms that unoidl<span>-</span>read <span>is</span> the
  correct, modern tool <span>for</span> our goal <span>of</span> getting a <span>static</span> dump
  <span>of</span> the UNO API types.
<span>-</span> RDBs <span>are</span> the Compiled Truth: It shows that the .rdb files
  <span>are</span> the canonical, compiled source <span>of</span> truth <span>for</span> UNO types.

<b>Key Commits that Tell the Story:</b>
<span>-</span> "WIP: Experimental new binary type.rdb format" (Stephan
  Bergmann, Feb<span>/</span>Mar<span>/</span>Apr <span>2013</span>): Documents <span>new</span> RDB format <span>and</span> unoidl
  <span>module</span> creation. Explicitly aimed <span>to</span> "ultimately remove
  modules store and registry."
<span>-</span> "New unoidl-read tool to translate registries into readable
  .idl files" (Stephan Bergmann, Sep <span>2013</span>): Introduces our
  <span>primary</span> <span>static</span> dumping tool.
<span>-</span> "New unoidl-check tool to replace regcompare" (Stephan
  Bergmann, Sep <span>2013</span>): This further shows the entire legacy
  toolchain (regcompare, regmerge, idlc, regview) was
  being systematically replaced <span>by</span> a <span>new</span>, unified unoidl<span>-</span><span>*</span>
  toolset.
<span>-</span> "Revert 'WIP: Experimental new binary type.rdb format'"
  (multiple times): The log shows this was a complex transition
  <span>with</span> reverts <span>and</span> re<span>-</span>applications. This <span>is</span> normal <span>for</span> a change
  <span>of</span> this magnitude <span>and</span> explains why the legacy code <span>and</span> <span>new</span> code
  had <span>to</span> co<span>-</span>exist.

<b>Why XML <span>for</span> "Services" RDBs?</b>

It turns <span>out</span> services.rdb files <span>are</span> intentionally kept <span>in</span> XML,
<span>not</span> <span>by</span> accident. Here<span>'s why:

1. Legacy support & human readability: While .rdb files for
   types switched to new binary, service registries remained
   XML "for backwards compatibility" [<a href="https://listarchives.libreoffice.org/global/dev/2013/msg14613.html" target="_blank">1</a>, <a href="https://wiki.documentfoundation.org/Documentation/DevGuide/Extensions" target="_blank">2</a>, <a href="https://docs.libreoffice.org/store.html" target="_blank">3</a>]. Human-readable
   XML eases maintenance, debugging, and scripting.

2. Consistent tooling across UNO bridges: Developers noted that
   `program/services` .rdb files are XML-based. The Python-UNO
   bridge, for instance, depends on those XML service definitions;
   binary would hinder Python tools [<a href="https://www.openoffice.org/udk/python/python-bridge.html" target="_blank">4</a>, <a href="https://ask.libreoffice.org/t/no-helloworldpython-nor-any-other-python-script-using-appimage/107376/21" target="_blank">5</a>]. </span><br></code><span><pre><code><span>3. Consistency with ODF: LibreOffice'</span>s file formats (ODT, ODS)
   <span>are</span> XML<span>-</span>based (ODF). Keeping service registration <span>in</span> XML
   aligns <span>with</span> this broader architectural philosophy.</code></pre></span><code><br></code><span></span><code>
<b>TL;DR:</b>
<u>File Type</u>     <u>Format</u>  <u>Reason</u>
types.rdb     <span>Binary</span>  Efficient, compact, <span>new</span> unoidl<span>-</span>write toolchain
services.rdb  XML     Human<span>-</span>readable, backwards compatibility, supports
                      scripting tools <span>like</span> Python<span>-</span>UNO.

</code><span><pre><span><pre><code>So, the "mixed-format" nature <span>of</span> the registry <span>is</span> a deliberate <span>and</span>
pragmatic design choice, balancing performance (<span>for</span> <span>binary</span> types)
<span>with</span> interoperability <span>and</span> maintainability (<span>for</span> XML services).</code></pre></span></pre></span><code>

<b>Flowchart: Evolution <span>of</span> UNO RDBs</b>

<b><span>Old</span> World (Pre<span>-2013</span>) UNO Type Processing:</b>

<span>+</span><span>----------+     +--------+     +---------+</span>
<span>|</span> .idl     <span>|</span> <span>--> | idlc   | --> | .urd    |</span>
<span>|</span> (Source) <span>|</span>     <span>|</span>        <span>|</span>     <span>|</span> (<span>Binary</span>)<span>|</span>
<span>+</span><span>----------+     +--------+     +---------+</span>
                              <span>|</span>
                              v
                       <span>+</span><span>----------+     +-----------+</span>
                       <span>|</span> regmerge <span>|</span> <span>--> | Legacy    |</span>
                       <span>|</span>          <span>|</span>     <span>|</span> .rdb      <span>|</span>
                       <span>|</span>          <span>|</span>     <span>|</span> (<span>Binary</span>)  <span>|</span>
                       <span>+</span><span>----------+     +-----------+</span>
                                              <span>|</span>
                                              v
                                        <span>+</span><span>---------+</span>
                                        <span>|</span> regview <span>|</span>
                                        <span>|</span> (Dump)  <span>|</span>
                                        <span>+</span><span>---------+</span>

<b><span>New</span> World (<span>2013</span> Refactoring) UNO Type Processing:</b>

<span>+</span><span>----------+     +--------------+     +----------+</span>
<span>|</span> .idl     <span>|</span> <span>--> | unoidl-write | --> | New      |</span>
<span>|</span> (Source) <span>|</span>     <span>|</span>              <span>|</span>     <span>|</span> .rdb     <span>|</span>
<span>+</span><span>----------+     +--------------+     | (Binary) |</span>
                                      <span>+</span><span>----------+</span>
                                            <span>|</span>
                                            v
                                      <span>+</span><span>------------+</span>
                                      <span>|</span> unoidl<span>-</span>read<span>|</span>
                                      <span>|</span> (Dump)     <span>|</span>
                                      <span>+</span><span>------------+</span>

<b>Special <span>Case</span>: UNO Service Processing (Remains XML):</b>

<span>+</span><span>----------+     +------------------+     +-----------------+</span>
<span>|</span> Services <span>|</span> <span>--> |  XML .rdb files  | --> | Text Editor     |</span>
<span>|</span> (Config) <span>|</span>     <span>|</span> (e.g., pyuno.rdb)<span>|</span>     <span>|</span> (Human Read)    <span>|</span>
<span>+</span><span>----------+     +------------------+     +-----------------+</span>
                           <span>|</span>
                           v
              <span>+</span><span>----------------------------+</span>
              <span>|</span> Runtime Service Manager    <span>|</span>
              <span>|</span> (Loads <span>for</span> Component Info) <span>|</span>
              <span>+</span><span>----------------------------+</span>

<b><br></b></code><span><pre><code><b>Our Project</b><span><b>'s possible Cache Philosophy (Hybrid Approach):</b>

+-----------------------+     +---------------------------+
| Static Data Sources   | --> |  Offline Tool             |
| (UNO APIs, Std Libs)  |     | (like unoidl-write + PoC) |
+-----------------------+     +---------------------------+
                                        |
                                        v
                               +-----------------------+
                               | Binary Cache File     |
                               | (e.g., SQLite .db)    |
                               +-----------------------+
                                        |
                                        v
                       +------------------------------------+
                       | IDE Startup: Load Binary Cache     |
                       | into Master Analyzer (In-Memory)   |
                       +------------------------------------+
                                        |
                                        v
                       +------------------------------------+
                       | Dynamic Data (User Code, Vars)     |
                       | (Analyzed In-Memory by MA)         |
                       +------------------------------------+
                                        |
                                        v
                       +----------------------------------------+
                       |    Live IDE Cache (In-Memory Hybrid)   |
                       | (Can be saved to XML/JSON for session) |
                       +----------------------------------------+</span></code></pre></span><br><code><b><br>Our Project</b><span><b>'s Cache Philosophy - Considerations for a Hybrid Approach:</b>

Drawing lessons from LibreOffice'</span>s RDB evolution, we <span>can</span>
consider a hybrid cache design <span>for</span> our project. This would
address performance needs while maintaining flexibility.

<u>Potential Approaches:</u>
<span>-</span> <b>The Core <span>Static</span> Cache (UNO APIs, Standard Libraries):</b> <span>For</span>
  this <span>large</span> amount <span>of</span> relatively stable data, we can consider
  storing it <span>in</span> a fast, compact, <span>binary</span> format. This could
  potentially use something <span>like</span> SQLite <span>for</span> efficient querying
  <span>and</span> retrieval. This <span>is</span> analogous <span>to</span> the <span>new</span> <span>binary</span> types.rdb
  format, aiming <span>for</span> quick IDE startup.
<span>-</span> <b>The <span>Dynamic</span> Cache <span>&</span> <span>User</span><span>-</span><span>Specific</span> Data:</b> Information about the
  <span>user</span><span>'s currently open modules, local variables, and editor
  state is highly dynamic. For debugging or saving the IDE'</span>s
  session state, a more readable format <span>like</span> JSON <span>or</span> XML could be
  beneficial. This <span>is</span> analogous <span>to</span> the XML services.rdb files.
<span>-</span> <b>The Hybrid <span>System</span> Concept:</b> Our Master Analyzer would produce
  IdeSymbolInfo objects <span>in</span> memory. <span>For</span> persistence, we can
  consider options <span>to</span>:
    <span>-</span> Build an offline tool (<span>similar</span> <span>to</span> unoidl<span>-</span>write) <span>using</span> our
      PoC logic (theCoreReflection, BASIC parser) <span>to</span> generate
      a comprehensive <span>binary</span> cache file <span>of</span> <span>all</span> shippable UNO <span>and</span>
      Standard<span>/</span>ScriptForge library info, possibly <span>using</span> SQLite.
      This file would ideally ship <span>with</span> LibreOffice.
    <span>-</span> <span>At</span> runtime, the IDE would load this <span>binary</span> cache <span>into</span> memory.
      The Master Analyzer would <span>then</span> <span>add</span> <span>to</span> <span>or</span> <span>overlay</span> this cache
      <span>with</span> information <span>from</span> the <span>user</span><span>'s open documents and unsaved
      changes. This live part might not need disk saving, or could
      be saved as XML/JSON for session state.

<b>This ideated approach aims for:</b>
- Optimized Startup Performance: From loading a pre-compiled
  binary cache (e.g., SQLite).
- Flexibility & Dynamicism: From in-memory analysis of live code.
- Improved Debuggability: From clear static/dynamic separation.


[1] <a href="https://listarchives.libreoffice.org/global/dev/2013/msg14613.html" target="_blank">https://listarchives.libreoffice.org/global/dev/2013/msg14613.html</a>
[2] <a href="https://wiki.documentfoundation.org/Documentation/DevGuide/Extensions" target="_blank">https://wiki.documentfoundation.org/Documentation/DevGuide/Extensions</a>
[3] <a href="https://docs.libreoffice.org/store.html" target="_blank">https://docs.libreoffice.org/store.html</a>
[4] <a href="https://www.openoffice.org/udk/python/python-bridge.html" target="_blank">https://www.openoffice.org/udk/python/python-bridge.html</a>
[5] <a href="https://ask.libreoffice.org/t/no-helloworldpython-nor-any-other-python-script-using-appimage/107376/21" target="_blank">https://ask.libreoffice.org/t/no-helloworldpython-nor-any-other-python-script-using-appimage/107376/21</a></span></code><br></pre><pre><code><span>    Week 4 mail chain - </span></code><a href="https://lists.freedesktop.org/archives/libreoffice/2025-June/093392.html" target="_blank">https://lists.freedesktop.org/archives/libreoffice/2025-June/093392.html</a></pre><pre><span><pre><code><span><br>I look forward to discussing these considerations and
potential strategies with the community and specially with mentors</span></code></pre></span></pre></span><br></div></div><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">On Tue, 17 Jun 2025 at 01:32, Stephan Bergmann <<a href="mailto:stephan.bergmann@allotropia.de" target="_blank">stephan.bergmann@allotropia.de</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">On 6/16/25 18:37, Devansh Varshney wrote:<br>
> *2. Legacy RDBs*: Interestingly, when I tried to run unoidl-read on some<br>
>      other RDBs from workdir/Rdb/ (like pyuno.rdb), I got a different error:<br>
> <br>
> |$ unoidl-read $PWD/workdir/Rdb/pyuno.rdb Bad input <...>: cannot open <br>
> legacy file: 6|<br>
> <br>
> This confirms the unoidl/README.md note that unoidl::Manager can<br>
> detect the old legacy format but may not be able to read all of them with<br>
> this specific tool. It's a great insight into the mixed-format nature of the<br>
> registry system.<br>
Traditionally, the original store-based binary rdb format was used for <br>
both "types" files (storing information about UNOIDL entities) and <br>
"services" files (storing information about UNO components).  Both those <br>
kinds of rdb files have since been changed, using a different binary <br>
format for the "types" files and an XML format for the "services" files. <br>
  Somewhat confusingly, all those kinds of files still use the ".rdb" <br>
extension.<br>
<br>
unoidl-read can read "types" files (both the old and new binary <br>
formats), but not "services" files (the XML format)---and <br>
workdir/Rdb/pyuno.rdb is such a "services" file.<br>
</blockquote></div><div><br clear="all"></div><br><span class="gmail_signature_prefix">-- </span><br><div dir="ltr" class="gmail_signature"><div dir="ltr"><div><span style="font-family:monospace"><b>Regards,</b></span></div><div><span style="font-family:monospace;color:rgb(153,0,255)"><b>Devansh</b></span><br></div></div></div></div>
</blockquote></div><div><br clear="all"></div><br><span class="gmail_signature_prefix">-- </span><br><div dir="ltr" class="gmail_signature"><div dir="ltr"><div><span style="font-family:monospace"><b>Regards,</b></span></div><div><span style="font-family:monospace;color:rgb(153,0,255)"><b>Devansh</b></span><br></div></div></div></div>