[Libreoffice] Storage of user's configuration
Stephan Bergmann
sbergman at redhat.com
Tue Jan 24 12:38:12 PST 2012
On 01/24/2012 04:22 PM, Martin Richard wrote:
> I'm hacking the cross-platform filepicker (in fpicker/source/office). I
> added a "Places" (bookmarks) list on the left and I would like to save
> the entries that the user bookmarked .
>
> Cedric Bosdonnat told me to look at xcu and xcs files, but I'm a bit
> lost. I'm looking for a code sample where user's persistent
> configuration is manipulated (read and written) and/or anything that can
> be usefull, like search keywords, links to old threads in the mailing
> list, which would help me to identify some good practices (naming
> conventions, for instance).
The configuration data is stored into a hierarchy of groups (think
"structs") and typed properties, plus homogeneous sets (where a set is
somewhat like an array with members of one kind of group, but the order
is not defined and the members have arbitrary names rather than
numerical indices). The static structure of that hierarchy is at
officecfg/registry/data/ and the actual initial data at
officecfg/registry/schema/.
For file paths, there is already something looking over-engineered at
org.openoffice.Office.Paths, but if all you need is an (ordered?) list
of bookmarks (just URIs?) that does not grow unbounded, you might get
away with a single property of type oor:string-list.
org.openoffice.Office.Common is a kind of catch-all file for various
configuration settings that do not fit any of the other, more
specialized ones. Maybe you find a fitting group node there, or add a
new one.
Accessing the configuration at runtime to read/write the data is
something of a disaster. The configuration is UNO based, but tries to
re-use each and every of the existing UNO interfaces, so that getting an
idea of how it actually works is rather difficult. Plus, various people
thought it a good idea to add various wrappers on top of it, adding even
more confusion. I'm trying to clean up that mess over time, but it is
no easy feat.
One thing that's already there, though, is that if you can indeed go
with a single string-list property (lets assume you add it as
org.openoffice.Office.Common/Misc/FilePickerBookmarks), you can
#include "officecfg/Office/Common.hxx"
and read the list (as a com::sun::star::uno::Sequence<rtl::OUString>) with
officecfg::Office::Common::Misc::FilePickerBookmarks::get(context)
where context is the UNO component context (use
comphelper::getProcessComponentContext() for now if you have none
around). Writing is always done in batch mode:
unotools::ConfigurationChanges batch(
unotools::ConfigurationChanges::create(context));
officecfg::Office::Common::Misc::FilePickerBookmarks::set(
context, batch, value);
batch.commit();
svl/source/config/asiancfg.cxx is one of the few examples that are
already converted to this new, simplified approach.
Don't hesitate to come back with any further questions (I'm sberg on IRC).
Stephan
More information about the LibreOffice
mailing list