15#include <forward_list>
25#include <dconf/dconf.h>
28#include <com/sun/star/uno/Sequence.hxx>
30#include <rtl/ustrbuf.hxx>
121template<
typename T>
class GObjectHolder {
123 explicit GObjectHolder(T *
object):
object_(
object) {}
134 GObjectHolder(GObjectHolder
const &) =
delete;
135 GObjectHolder& operator =(GObjectHolder
const &) =
delete;
140class GVariantHolder {
142 explicit GVariantHolder(GVariant * variant =
nullptr):
variant_(variant) {}
144 ~GVariantHolder() { unref(); }
146 void reset(GVariant * variant) {
151 void release() {
variant_ =
nullptr; }
156 GVariantHolder(GVariantHolder
const &) =
delete;
157 GVariantHolder& operator =(GVariantHolder
const &) =
delete;
168class GVariantTypeHolder {
170 explicit GVariantTypeHolder(GVariantType *
type):
type_(
type) {}
172 ~GVariantTypeHolder() {
173 if (
type_ !=
nullptr) {
174 g_variant_type_free(
type_);
178 GVariantType *
get()
const {
return type_; }
181 GVariantTypeHolder(GVariantTypeHolder
const &) =
delete;
182 GVariantTypeHolder& operator =(GVariantTypeHolder
const &) =
delete;
187class StringArrayHolder {
189 explicit StringArrayHolder(gchar ** array):
array_(array) {}
191 ~StringArrayHolder() { g_strfreev(
array_); }
196 StringArrayHolder(StringArrayHolder
const &) =
delete;
197 StringArrayHolder& operator =(StringArrayHolder
const &) =
delete;
202class ChangesetHolder {
204 explicit ChangesetHolder(DConfChangeset * changeset):
217 ChangesetHolder(ChangesetHolder
const &) =
delete;
218 ChangesetHolder& operator =(ChangesetHolder
const &) =
delete;
224 return "/org/libreoffice/registry";
227bool decode(OUString *
string,
bool slash) {
228 for (sal_Int32 i = 0;; ++
i) {
229 i =
string->indexOf(
'\\', i);
233 if (string->match(
"00", i + 1)) {
234 *
string =
string->replaceAt(i, 3, OUStringChar(u
'\0'));
235 }
else if (slash && string->match(
"2F", i + 1)) {
236 *
string =
string->replaceAt(i, 3, u
"/");
237 }
else if (string->match(
"5C", i + 1)) {
238 *
string =
string->replaceAt(i + 1, 2, u
"");
240 SAL_WARN(
"configmgr.dconf",
"bad escape in " << *
string);
247 OString
const & key, GVariantHolder
const & variant, css::uno::Any * value)
249 assert(value !=
nullptr);
250 if (!g_variant_is_of_type(variant.get(), G_VARIANT_TYPE_BOOLEAN)) {
253 "bad key " << key <<
" does not match boolean property");
256 *
value <<= bool(g_variant_get_boolean(variant.get()));
261 OString
const & key, GVariantHolder
const & variant, css::uno::Any * value)
263 assert(value !=
nullptr);
264 if (!g_variant_is_of_type(variant.get(), G_VARIANT_TYPE_INT16)) {
267 "bad key " << key <<
" does not match short property");
270 *
value <<= sal_Int16(g_variant_get_int16(variant.get()));
275 OString
const & key, GVariantHolder
const & variant, css::uno::Any * value)
277 assert(value !=
nullptr);
278 if (!g_variant_is_of_type(variant.get(), G_VARIANT_TYPE_INT32)) {
281 "bad key " << key <<
" does not match int property");
284 *
value <<= sal_Int32(g_variant_get_int32(variant.get()));
289 OString
const & key, GVariantHolder
const & variant, css::uno::Any * value)
291 assert(value !=
nullptr);
292 if (!g_variant_is_of_type(variant.get(), G_VARIANT_TYPE_INT64)) {
295 "bad key " << key <<
" does not match long property");
298 *
value <<= sal_Int64(g_variant_get_int64(variant.get()));
303 OString
const & key, GVariantHolder
const & variant, css::uno::Any * value)
305 assert(value !=
nullptr);
306 if (!g_variant_is_of_type(variant.get(), G_VARIANT_TYPE_DOUBLE)) {
309 "bad key " << key <<
" does not match double property");
312 *
value <<= double(g_variant_get_double(variant.get()));
317 OString
const & key, GVariantHolder
const & variant, OUString * value)
319 assert(value !=
nullptr);
320 if (!g_variant_is_of_type(variant.get(), G_VARIANT_TYPE_STRING)) {
323 "bad key " << key <<
" does not match string property");
327 char const *
p = g_variant_get_string(variant.get(), &n);
329 std::numeric_limits<sal_Int32>::max()))
331 SAL_WARN(
"configmgr.dconf",
"too long string value for key " << key);
334 if (!rtl_convertStringToUString(
335 &
value->pData, p,
static_cast<sal_Int32
>(n), RTL_TEXTENCODING_UTF8,
336 (RTL_TEXTTOUNICODE_FLAGS_UNDEFINED_ERROR
337 | RTL_TEXTTOUNICODE_FLAGS_MBUNDEFINED_ERROR
338 | RTL_TEXTTOUNICODE_FLAGS_INVALID_ERROR)))
340 SAL_WARN(
"configmgr.dconf",
"non--UTF-8 string value for key " << key);
343 return decode(value,
false);
347 OString
const & key, GVariantHolder
const & variant, css::uno::Any * value)
349 assert(value !=
nullptr);
351 if (!getStringValue(key, variant, &v)) {
358bool getHexbinaryValue(
359 OString
const & key, GVariantHolder
const & variant,
360 css::uno::Sequence<sal_Int8> * value)
362 assert(value !=
nullptr);
363 if (std::strcmp(g_variant_get_type_string(variant.get()),
"ay") != 0) {
366 "bad key " << key <<
" does not match hexbinary property");
370 gconstpointer
p = g_variant_get_fixed_array(
371 variant.get(), &n, sizeof (guchar));
373 std::numeric_limits<sal_Int32>::max()))
375 SAL_WARN(
"configmgr.dconf",
"too long hexbinary value for key " << key);
378 value->realloc(
static_cast<sal_Int32
>(n));
379 static_assert(
sizeof (
sal_Int8) ==
sizeof (guchar),
"size mismatch");
380 std::memcpy(
value->getArray(), p, n * sizeof (guchar));
386 OString
const & key, GVariantHolder
const & variant, css::uno::Any * value)
388 assert(value !=
nullptr);
389 css::uno::Sequence<sal_Int8>
v;
390 if (!getHexbinaryValue(key, variant, &v)) {
398 OString
const & key, GVariantHolder
const & variant, css::uno::Any * value)
400 assert(value !=
nullptr);
401 if (std::strcmp(g_variant_get_type_string(variant.get()),
"ab") != 0) {
404 "bad key " << key <<
" does not match boolean list property");
408 gconstpointer
p = g_variant_get_fixed_array(
409 variant.get(), &n, sizeof (guchar));
411 std::numeric_limits<sal_Int32>::max()))
413 SAL_WARN(
"configmgr.dconf",
"too long boolean list for key " << key);
416 css::uno::Sequence<sal_Bool>
v(
static_cast<sal_Int32
>(n));
417 static_assert(
sizeof (
sal_Bool) ==
sizeof (guchar),
"size mismatch");
418 std::memcpy(
v.getArray(), p, n * sizeof (guchar));
425 OString
const & key, GVariantHolder
const & variant, css::uno::Any * value)
427 assert(value !=
nullptr);
428 if (std::strcmp(g_variant_get_type_string(variant.get()),
"an") != 0) {
431 "bad key " << key <<
" does not match short list property");
435 gconstpointer
p = g_variant_get_fixed_array(
436 variant.get(), &n, sizeof (gint16));
438 std::numeric_limits<sal_Int32>::max()))
440 SAL_WARN(
"configmgr.dconf",
"too long short list for key " << key);
443 css::uno::Sequence<sal_Int16>
v(
static_cast<sal_Int32
>(n));
444 static_assert(
sizeof (sal_Int16) ==
sizeof (gint16),
"size mismatch");
445 std::memcpy(
v.getArray(), p, n * sizeof (gint16));
452 OString
const & key, GVariantHolder
const & variant, css::uno::Any * value)
454 assert(value !=
nullptr);
455 if (std::strcmp(g_variant_get_type_string(variant.get()),
"ai") != 0) {
458 "bad key " << key <<
" does not match int list property");
462 gconstpointer
p = g_variant_get_fixed_array(
463 variant.get(), &n, sizeof (gint32));
465 std::numeric_limits<sal_Int32>::max()))
467 SAL_WARN(
"configmgr.dconf",
"too long int list for key " << key);
470 css::uno::Sequence<sal_Int32>
v(
static_cast<sal_Int32
>(n));
471 static_assert(
sizeof (sal_Int32) ==
sizeof (gint32),
"size mismatch");
472 std::memcpy(
v.getArray(), p, n * sizeof (gint32));
479 OString
const & key, GVariantHolder
const & variant, css::uno::Any * value)
481 assert(value !=
nullptr);
482 if (std::strcmp(g_variant_get_type_string(variant.get()),
"ax") != 0) {
485 "bad key " << key <<
" does not match long list property");
489 gconstpointer
p = g_variant_get_fixed_array(
490 variant.get(), &n, sizeof (gint64));
492 std::numeric_limits<sal_Int32>::max()))
494 SAL_WARN(
"configmgr.dconf",
"too long long list for key " << key);
497 css::uno::Sequence<sal_Int64>
v(
static_cast<sal_Int32
>(n));
498 static_assert(
sizeof (sal_Int64) ==
sizeof (gint64),
"size mismatch");
499 std::memcpy(
v.getArray(), p, n * sizeof (gint64));
506 OString
const & key, GVariantHolder
const & variant, css::uno::Any * value)
508 assert(value !=
nullptr);
509 if (std::strcmp(g_variant_get_type_string(variant.get()),
"ad") != 0) {
512 "bad key " << key <<
" does not match double list property");
516 gconstpointer
p = g_variant_get_fixed_array(
517 variant.get(), &n, sizeof (gdouble));
519 std::numeric_limits<sal_Int32>::max()))
521 SAL_WARN(
"configmgr.dconf",
"too long double list for key " << key);
524 css::uno::Sequence<double>
v(
static_cast<sal_Int32
>(n));
525 static_assert(std::is_same<double, gdouble>::value,
"type mismatch");
526 std::memcpy(
v.getArray(), p, n * sizeof (gdouble));
533 OString
const & key, GVariantHolder
const & variant, css::uno::Any * value)
535 assert(value !=
nullptr);
536 if (std::strcmp(g_variant_get_type_string(variant.get()),
"as") != 0) {
539 "bad key " << key <<
" does not match string list property");
542 gsize
n = g_variant_n_children(variant.get());
544 std::numeric_limits<sal_Int32>::max()))
546 SAL_WARN(
"configmgr.dconf",
"too long string list for key " << key);
549 css::uno::Sequence<OUString>
v(
static_cast<sal_Int32
>(n));
550 for (gsize i = 0;
i !=
n; ++
i) {
551 GVariantHolder c(g_variant_get_child_value(variant.get(), i));
552 if (!getStringValue(key, c,
v.getArray() + i)) {
560bool getHexbinaryList(
561 OString
const & key, GVariantHolder
const & variant, css::uno::Any * value)
563 assert(value !=
nullptr);
564 if (std::strcmp(g_variant_get_type_string(variant.get()),
"aay") != 0) {
567 "bad key " << key <<
" does not match hexbinary list property");
570 gsize
n = g_variant_n_children(variant.get());
572 std::numeric_limits<sal_Int32>::max()))
574 SAL_WARN(
"configmgr.dconf",
"too long hexbinary list for key " << key);
577 css::uno::Sequence<css::uno::Sequence<sal_Int8>>
v(
578 static_cast<sal_Int32
>(n));
579 for (gsize i = 0;
i !=
n; ++
i) {
580 GVariantHolder c(g_variant_get_child_value(variant.get(), i));
581 if (!getHexbinaryValue(key, c,
v.getArray() + i)) {
590 OString
const & key, GVariantHolder
const & variant, css::uno::Any * value)
592 char const *
t = g_variant_get_type_string(variant.get());
593 if (std::strcmp(t,
"b") == 0) {
594 return getBoolean(key, variant, value);
596 if (std::strcmp(t,
"n") == 0) {
597 return getShort(key, variant, value);
599 if (std::strcmp(t,
"i") == 0) {
600 return getInt(key, variant, value);
602 if (std::strcmp(t,
"x") == 0) {
603 return getLong(key, variant, value);
605 if (std::strcmp(t,
"d") == 0) {
608 if (std::strcmp(t,
"s") == 0) {
611 if (std::strcmp(t,
"ay") == 0) {
612 return getHexbinary(key, variant, value);
614 if (std::strcmp(t,
"ab") == 0) {
615 return getBooleanList(key, variant, value);
617 if (std::strcmp(t,
"an") == 0) {
618 return getShortList(key, variant, value);
620 if (std::strcmp(t,
"ai") == 0) {
621 return getIntList(key, variant, value);
623 if (std::strcmp(t,
"ax") == 0) {
624 return getLongList(key, variant, value);
626 if (std::strcmp(t,
"ad") == 0) {
627 return getDoubleList(key, variant, value);
629 if (std::strcmp(t,
"as") == 0) {
630 return getStringList(key, variant, value);
632 if (std::strcmp(t,
"aay") == 0) {
633 return getHexbinaryList(key, variant, value);
636 "configmgr.dconf",
"bad key " << key <<
" does not match any property");
643 GObjectHolder<DConfClient>
const & client, OString
const & path, Type type,
644 bool nillable,
bool removable, css::uno::Any * value)
646 assert(value !=
nullptr);
647 assert(!
value->hasValue());
648 assert(!path.endsWith(
"/"));
649 GVariantHolder
v(dconf_client_read(client.get(), path.getStr()));
650 if (
v.get() ==
nullptr) {
651 SAL_WARN(
"configmgr.dconf",
"cannot read key " << path);
652 return ReadValue::Error;
654 if (removable && std::strcmp(g_variant_get_type_string(
v.get()),
"()") == 0)
656 return ReadValue::Remove;
660 if (g_variant_classify(
v.get()) != G_VARIANT_CLASS_MAYBE) {
663 "bad key " << path <<
" does not match nillable property");
665 v.reset(g_variant_get_maybe(
v.get()));
666 nil =
v.get() ==
nullptr;
673 if (!getAny(path, v, value)) {
674 return ReadValue::Error;
678 if (!getBoolean(path, v, value)) {
679 return ReadValue::Error;
683 if (!getShort(path, v, value)) {
684 return ReadValue::Error;
688 if (!getInt(path, v, value)) {
689 return ReadValue::Error;
693 if (!getLong(path, v, value)) {
694 return ReadValue::Error;
699 return ReadValue::Error;
704 return ReadValue::Error;
708 if (!getHexbinary(path, v, value)) {
709 return ReadValue::Error;
713 if (!getBooleanList(path, v, value)) {
714 return ReadValue::Error;
718 if (!getShortList(path, v, value)) {
719 return ReadValue::Error;
723 if (!getIntList(path, v, value)) {
724 return ReadValue::Error;
728 if (!getLongList(path, v, value)) {
729 return ReadValue::Error;
733 if (!getDoubleList(path, v, value)) {
734 return ReadValue::Error;
738 if (!getStringList(path, v, value)) {
739 return ReadValue::Error;
743 if (!getHexbinaryList(path, v, value)) {
744 return ReadValue::Error;
751 return ReadValue::Value;
755 GObjectHolder<DConfClient>
const & client, OString
const & path,
758 if (!dconf_client_is_writable(client.get(), path.getStr())) {
759 node->setFinalized(layer);
765 NodeMap & members, GObjectHolder<DConfClient>
const & client,
768 StringArrayHolder
a(dconf_client_list(client.get(), dir.getStr(),
nullptr));
769 for (
char const *
const * p =
a.get(); *p !=
nullptr; ++p) {
770 std::size_t
n = std::strlen(*p);
772 std::numeric_limits<sal_Int32>::max()))
774 SAL_WARN(
"configmgr.dconf",
"too long dir/key in dir " << dir);
777 OString s(*p,
static_cast<sal_Int32
>(n));
778 OString path(dir + s);
780 if (!rtl_convertStringToUString(
781 &
name.pData, s.getStr(), s.getLength(), RTL_TEXTENCODING_UTF8,
782 (RTL_TEXTTOUNICODE_FLAGS_UNDEFINED_ERROR
783 | RTL_TEXTTOUNICODE_FLAGS_MBUNDEFINED_ERROR
784 | RTL_TEXTTOUNICODE_FLAGS_INVALID_ERROR)))
786 SAL_WARN(
"configmgr.dconf",
"non--UTF-8 dir/key in dir " << dir);
789 bool isDir =
name.endsWith(
"/", &
name);
797 "bad key " << path <<
" does not match set element");
800 if (!decode(&
name,
true)) {
805 bool content =
false;
807 StringArrayHolder a2(
808 dconf_client_list(client.get(), path.getStr(),
nullptr));
809 for (
char const *
const * p2 = a2.get(); *p2 !=
nullptr; ++p2) {
810 if (std::strcmp(*p2,
"op") == 0) {
811 OString path2(path +
"op");
813 dconf_client_read(client.get(), path2.getStr()));
814 if (
v.get() ==
nullptr) {
816 "configmgr.dconf",
"cannot read key " << path2);
821 if (!getStringValue(path2, v, &ops)) {
827 }
else if (ops ==
"replace") {
829 }
else if (ops ==
"remove") {
834 "bad key " << path2 <<
" value " << ops);
838 }
else if (std::strcmp(*p2,
"template") == 0) {
839 OString path2(path +
"template");
841 dconf_client_read(client.get(), path2.getStr()));
842 if (
v.get() ==
nullptr) {
844 "configmgr.dconf",
"cannot read key " << path2);
848 if (!getStringValue(path2, v, &templ)) {
852 if (!
static_cast<SetNode *
>(node.get())->
853 isValidTemplate(templ))
857 "bad key " << path2 <<
" value " << templ
858 <<
" denotes unsupported set element template");
862 }
else if (std::strcmp(*p2,
"content/") == 0) {
868 <<
" in set element indirection dir " << path);
880 "bad set element indirection dir " << path
881 <<
" missing \"op\" key");
885 if (templ.isEmpty() || !content) {
888 "missing \"content\" and/or \"template\" dir/key in "
889 "\"op\" = \"fuse\"/\"remove\" set element"
890 " indirection dir " << path);
895 replace = op == Op::Replace;
898 if (!templ.isEmpty() || content) {
901 "bad \"content\" and/or \"template\" dir/key in \"op\" "
902 "= \"remove\" set element indirection dir "
915 bool insert = !member.is();
917 if (replace || insert) {
919 SAL_WARN(
"configmgr.dconf",
"bad unmatched " << path);
922 switch (node->kind()) {
924 member.set(
new LocalizedValueNode(layer));
927 if (!
static_cast<GroupNode *
>(node.get())->isExtensible()) {
928 SAL_WARN(
"configmgr.dconf",
"bad unmatched " << path);
933 layer,
TYPE_ANY,
true, css::uno::Any(),
true));
936 assert(!templ.isEmpty());
937 member = data.getTemplate(layer, templ);
941 "bad " << path <<
" denoting undefined template "
945 member = member->clone(
true);
950 }
else if (!templ.isEmpty() && templ != member->getTemplateName()) {
954 <<
" denoting set element of non-matching template "
955 << member->getTemplateName());
960 if (member->getFinalized() < layer) {
963 switch (member->kind()) {
969 "bad dir " << path <<
" does not match property");
973 static_cast<PropertyNode *
>(member.get()));
976 client, path, prop->getStaticType(),
977 prop->isNillable(), prop->isExtension(),
980 case ReadValue::Error:
982 case ReadValue::Value:
983 prop->setValue(layer, value);
984 finalize(client, path, member, layer);
986 case ReadValue::Remove:
998 <<
" does not match localized value");
1005 static_cast<LocalizedPropertyNode *
>(node.get()));
1006 css::uno::Any
value;
1008 client, path, locProp->getStaticType(),
1009 locProp->isNillable(),
false, &value)
1010 == ReadValue::Error)
1014 static_cast<LocalizedValueNode *
>(member.get())->
setValue(
1016 finalize(client, path, member, layer);
1026 <<
" does not match localized property, group, or"
1027 " set, respectively");
1030 assert(path.endsWith(
"/"));
1032 data, layer, member, member->getMembers(), client, path);
1039 if (!(member.is() && member->getMandatory())) {
1042 }
else if (replace) {
1045 }
else if (insert) {
1053 return name.toUtf8();
1056 for (sal_Int32 i = 0;
i !=
name.getLength(); ++
i) {
1072 return buf.makeStringAndClear().toUtf8();
1075OString encodeString(OUString
const & value) {
1077 for (sal_Int32 i = 0;
i !=
value.getLength(); ++
i) {
1090 return buf.makeStringAndClear().toUtf8();
1094 ChangesetHolder
const & changeset, OString
const & pathRepresentation,
1095 Type type,
bool nillable, css::uno::Any
const & value)
1103 std::forward_list<GVariantHolder> children;
1107 v.reset(g_variant_new_maybe(G_VARIANT_TYPE_BOOLEAN,
nullptr));
1110 v.reset(g_variant_new_maybe(G_VARIANT_TYPE_INT16,
nullptr));
1113 v.reset(g_variant_new_maybe(G_VARIANT_TYPE_INT32,
nullptr));
1116 v.reset(g_variant_new_maybe(G_VARIANT_TYPE_INT64,
nullptr));
1119 v.reset(g_variant_new_maybe(G_VARIANT_TYPE_DOUBLE,
nullptr));
1122 v.reset(g_variant_new_maybe(G_VARIANT_TYPE_STRING,
nullptr));
1133 static char const *
const typeString[
1135 = {
"ay",
"ab",
"an",
"ai",
"ax",
"ad",
"as",
"aay" };
1136 GVariantTypeHolder ty(
1138 if (ty.get() ==
nullptr) {
1139 SAL_WARN(
"configmgr.dconf",
"g_variant_type_new failed");
1142 v.reset(g_variant_new_maybe(ty.get(),
nullptr));
1149 if (
v.get() ==
nullptr) {
1150 SAL_WARN(
"configmgr.dconf",
"g_variant_new_maybe failed");
1156 v.reset(g_variant_new_boolean(
value.get<
bool>()));
1159 v.reset(g_variant_new_int16(
value.get<sal_Int16>()));
1162 v.reset(g_variant_new_int32(
value.get<sal_Int32>()));
1165 v.reset(g_variant_new_int64(
value.get<sal_Int64>()));
1168 v.reset(g_variant_new_double(
value.get<
double>()));
1172 g_variant_new_string(
1173 encodeString(
value.get<OUString>()).getStr()));
1177 css::uno::Sequence<sal_Int8> seq(
1178 value.get<css::uno::Sequence<sal_Int8>>());
1180 sizeof(sal_Int32) <=
sizeof(gsize),
1181 "G_MAXSIZE too small");
1183 sizeof (
sal_Int8) ==
sizeof (guchar),
"size mismatch");
1185 g_variant_new_fixed_array(
1186 G_VARIANT_TYPE_BYTE, seq.getConstArray(),
1187 seq.getLength(),
sizeof (
sal_Int8)));
1192 css::uno::Sequence<sal_Bool> seq(
1193 value.get<css::uno::Sequence<sal_Bool>>());
1195 sizeof(sal_Int32) <=
sizeof(gsize),
1196 "G_MAXSIZE too small");
1197 static_assert(
sizeof (
sal_Bool) == 1,
"size mismatch");
1199 g_variant_new_fixed_array(
1200 G_VARIANT_TYPE_BOOLEAN, seq.getConstArray(),
1201 seq.getLength(),
sizeof (
sal_Bool)));
1206 css::uno::Sequence<sal_Int16> seq(
1207 value.get<css::uno::Sequence<sal_Int16>>());
1209 sizeof(sal_Int32) <=
sizeof(gsize),
1210 "G_MAXSIZE too small");
1212 sizeof (sal_Int16) ==
sizeof (gint16),
"size mismatch");
1214 g_variant_new_fixed_array(
1215 G_VARIANT_TYPE_INT16, seq.getConstArray(),
1216 seq.getLength(),
sizeof (sal_Int16)));
1222 css::uno::Sequence<sal_Int32> seq(
1223 value.get<css::uno::Sequence<sal_Int32>>());
1225 sizeof(sal_Int32) <=
sizeof(gsize),
1226 "G_MAXSIZE too small");
1228 sizeof (sal_Int32) ==
sizeof (gint32),
"size mismatch");
1230 g_variant_new_fixed_array(
1231 G_VARIANT_TYPE_INT32, seq.getConstArray(),
1232 seq.getLength(),
sizeof (sal_Int32)));
1238 css::uno::Sequence<sal_Int64> seq(
1239 value.get<css::uno::Sequence<sal_Int64>>());
1241 sizeof(sal_Int32) <=
sizeof(gsize),
1242 "G_MAXSIZE too small");
1244 sizeof (sal_Int64) ==
sizeof (gint64),
"size mismatch");
1246 g_variant_new_fixed_array(
1247 G_VARIANT_TYPE_INT64, seq.getConstArray(),
1248 seq.getLength(),
sizeof (sal_Int64)));
1254 css::uno::Sequence<double> seq(
1255 value.get<css::uno::Sequence<double>>());
1257 sizeof(sal_Int32) <=
sizeof(gsize),
1258 "G_MAXSIZE too small");
1260 sizeof (double) ==
sizeof (gdouble),
"size mismatch");
1262 g_variant_new_fixed_array(
1263 G_VARIANT_TYPE_DOUBLE, seq.getConstArray(),
1264 seq.getLength(),
sizeof (double)));
1270 const css::uno::Sequence<OUString> seq(
1271 value.get<css::uno::Sequence<OUString>>());
1272 std::vector<GVariant *> vs;
1273 for (OUString
const & s : seq) {
1274 children.emplace_front(
1275 g_variant_new_string(encodeString(s).getStr()));
1276 if (children.front().get() ==
nullptr) {
1278 "configmgr.dconf",
"g_variant_new_string failed");
1281 vs.push_back(children.front().get());
1284 sizeof(sal_Int32) <=
sizeof(gsize),
1285 "G_MAXSIZE too small");
1287 g_variant_new_array(
1288 G_VARIANT_TYPE_STRING, vs.data(), seq.getLength()));
1293 const css::uno::Sequence<css::uno::Sequence<sal_Int8>> seqSeq(
1295 css::uno::Sequence<css::uno::Sequence<sal_Int8>>>());
1296 std::vector<GVariant *> vs;
1297 for (css::uno::Sequence<sal_Int8>
const & seq : seqSeq) {
1299 sizeof(sal_Int32) <=
sizeof(gsize),
1300 "G_MAXSIZE too small");
1302 sizeof (
sal_Int8) ==
sizeof (guchar),
"size mismatch");
1303 children.emplace_front(
1304 g_variant_new_fixed_array(
1305 G_VARIANT_TYPE_BYTE, seq.getConstArray(),
1306 seq.getLength(),
sizeof (
sal_Int8)));
1307 if (children.front().get() ==
nullptr) {
1310 "g_variant_new_fixed_array failed");
1313 vs.push_back(children.front().get());
1315 GVariantTypeHolder ty(g_variant_type_new(
"aay"));
1316 if (ty.get() ==
nullptr) {
1317 SAL_WARN(
"configmgr.dconf",
"g_variant_type_new failed");
1321 sizeof(sal_Int32) <=
sizeof(gsize),
1322 "G_MAXSIZE too small");
1324 g_variant_new_array(ty.get(), vs.data(), seqSeq.getLength()));
1331 if (
v.get() ==
nullptr) {
1332 SAL_WARN(
"configmgr.dconf",
"GVariant creation failed");
1336 GVariantHolder v1(g_variant_new_maybe(
nullptr,
v.get()));
1337 if (v1.get() ==
nullptr) {
1338 SAL_WARN(
"configmgr.dconf",
"g_variant_new_maybe failed");
1346 dconf_changeset_set(
1347 changeset.get(), pathRepresentation.getStr(),
v.get());
1348 for (
auto & i: children) {
1356 Components & components, ChangesetHolder
const & changeset,
1360 switch (node->kind()) {
1363 PropertyNode * prop =
static_cast<PropertyNode *
>(node.get());
1365 changeset, pathRepresentation, prop->getStaticType(),
1366 prop->isNillable(), prop->getValue(components)))
1375 LocalizedPropertyNode * locprop
1376 =
static_cast<LocalizedPropertyNode *
>(parent.get());
1378 changeset, pathRepresentation,
1379 locprop->getStaticType(), locprop->isNillable(),
1380 static_cast<LocalizedValueNode *
>(node.get())->
getValue()))
1389 for (
auto const & i: node->getMembers()) {
1390 OUString templ(
i.second->getTemplateName());
1392 pathRepresentation +
"/"
1394 if (!templ.isEmpty()) {
1396 GVariantHolder
v(g_variant_new_string(
"replace"));
1397 if (
v.get() ==
nullptr) {
1398 SAL_WARN(
"configmgr.dconf",
"g_variant_new_string failed");
1401 dconf_changeset_set(
1402 changeset.get(), OString(path +
"op").getStr(),
v.get());
1404 v.reset(g_variant_new_string(encodeString(templ).getStr()));
1405 if (
v.get() ==
nullptr) {
1406 SAL_WARN(
"configmgr.dconf",
"g_variant_new_string failed");
1409 dconf_changeset_set(
1410 changeset.get(), OString(path +
"template").getStr(),
1415 if (!addNode(components, changeset, parent, path,
i.second)) {
1427bool addModifications(
1428 Components & components, ChangesetHolder
const & changeset,
1429 OString
const & parentPathRepresentation,
1432 Modifications::Node
const & modifications)
1436 if (modifications.children.empty()) {
1437 assert(parent.is());
1440 OUString templ(node->getTemplateName());
1442 parentPathRepresentation +
"/"
1444 if (!templ.isEmpty()) {
1446 GVariantHolder
v(g_variant_new_string(
"replace"));
1447 if (
v.get() ==
nullptr) {
1448 SAL_WARN(
"configmgr.dconf",
"g_variant_new_string failed");
1451 dconf_changeset_set(
1452 changeset.get(), OString(path +
"op").getStr(),
v.get());
1454 v.reset(g_variant_new_string(encodeString(templ).getStr()));
1455 if (
v.get() ==
nullptr) {
1456 SAL_WARN(
"configmgr.dconf",
"g_variant_new_string failed");
1459 dconf_changeset_set(
1460 changeset.get(), OString(path +
"template").getStr(),
1465 if (!addNode(components, changeset, parent, path, node)) {
1469 switch (parent->kind()) {
1473 GVariantHolder
v(g_variant_new_tuple(
nullptr, 0));
1474 if (
v.get() ==
nullptr) {
1476 "configmgr.dconf",
"g_variant_new_tuple failed");
1479 OString path(parentPathRepresentation);
1480 if (!nodeName.isEmpty()) {
1483 dconf_changeset_set(
1484 changeset.get(), path.getStr(),
v.get());
1491 parentPathRepresentation +
"/"
1493 GVariantHolder
v(g_variant_new_string(
"remove"));
1494 if (
v.get() ==
nullptr) {
1496 "configmgr.dconf",
"g_variant_new_string failed");
1499 dconf_changeset_set(
1500 changeset.get(), OString(path +
"op").getStr(),
1503 dconf_changeset_set(
1504 changeset.get(), OString(path +
"template").getStr(),
1506 dconf_changeset_set(
1507 changeset.get(), OString(path +
"content/").getStr(),
1518 OUString templ(node->getTemplateName());
1520 parentPathRepresentation +
"/"
1522 if (!templ.isEmpty()) {
1524 GVariantHolder
v(g_variant_new_string(
"fuse"));
1525 if (
v.get() ==
nullptr) {
1526 SAL_WARN(
"configmgr.dconf",
"g_variant_new_string failed");
1529 dconf_changeset_set(
1530 changeset.get(), OString(path +
"op").getStr(),
v.get());
1532 v.reset(g_variant_new_string(encodeString(templ).getStr()));
1533 if (
v.get() ==
nullptr) {
1534 SAL_WARN(
"configmgr.dconf",
"g_variant_new_string failed");
1537 dconf_changeset_set(
1538 changeset.get(), OString(path +
"template").getStr(),
v.get());
1542 for (
auto const & i: modifications.children) {
1543 if (!addModifications(
1544 components, changeset, path, node,
i.first,
1545 node->getMember(
i.first),
i.second))
1557 GObjectHolder<DConfClient> client(dconf_client_new());
1558 if (client.get() ==
nullptr) {
1559 SAL_WARN(
"configmgr.dconf",
"dconf_client_new failed");
1568 GObjectHolder<DConfClient> client(dconf_client_new());
1569 if (client.get() ==
nullptr) {
1570 SAL_WARN(
"configmgr.dconf",
"dconf_client_new failed");
1572 ChangesetHolder cs(dconf_changeset_new());
1573 if (cs.get() ==
nullptr) {
1574 SAL_WARN(
"configmgr.dconf",
"dconf_changeset_new failed");
1578 if (!addModifications(
1586 if (!dconf_client_change_sync(
1587 client.get(), cs.get(),
nullptr,
nullptr,
nullptr))
1590 SAL_WARN(
"configmgr.dconf",
"dconf_client_change_sync failed");
Node const & getRoot() const
rtl::Reference< Node > findNode(int layer, OUString const &name) const
NodeMapImpl::value_type value_type
@ KIND_LOCALIZED_PROPERTY
DConfChangeset * changeset_
#define SAL_WARN(area, stream)
std::map< const SwTextNode *, const sal_uInt32 > NodeMap
OUStringBuffer & remove(OUStringBuffer &rIn, sal_Unicode c)
double getDouble(const Any &_rAny)
OUString getString(const Any &_rAny)
void readLayer(Data &data, int layer)
void writeModifications(Components &components, Data &data)
Type getDynamicType(css::uno::Any const &value)
css::beans::Optional< css::uno::Any > getValue(std::u16string_view id)
constexpr std::enable_if_t< std::is_signed_v< T >, std::make_unsigned_t< T > > make_unsigned(T value)
Op_< std::function< void(double &, double)>, double > Op
css::uno::Reference< css::linguistic2::XProofreadingIterator > get(css::uno::Reference< css::uno::XComponentContext > const &context)
OUString encodeSegment(const OUString &rSegment)
PyObject_HEAD PyUNO_callable_Internals * members
RegError REGISTRY_CALLTYPE setValue(RegKeyHandle hKey, rtl_uString *keyName, RegValueType valueType, RegValue pData, sal_uInt32 valueSize)
Modifications modifications
NodeMap & getComponents() const
std::vector< uno::Reference< sheet::XSpreadsheetDocument > > Components