Bug Summary

File:src/addressbook/libebook/e-book-client-view.c
Warning:line 887, column 4
Potential memory leak

Annotated Source Code

Press '?' to see keyboard shortcuts

clang -cc1 -cc1 -triple x86_64-redhat-linux-gnu -O3 -analyze -disable-free -clear-ast-before-backend -disable-llvm-verifier -discard-value-names -main-file-name e-book-client-view.c -analyzer-checker=core -analyzer-checker=apiModeling -analyzer-checker=unix -analyzer-checker=deadcode -analyzer-checker=security.insecureAPI.UncheckedReturn -analyzer-checker=security.insecureAPI.getpw -analyzer-checker=security.insecureAPI.gets -analyzer-checker=security.insecureAPI.mktemp -analyzer-checker=security.insecureAPI.mkstemp -analyzer-checker=security.insecureAPI.vfork -analyzer-checker=nullability.NullPassedToNonnull -analyzer-checker=nullability.NullReturnedFromNonnull -analyzer-output plist -w -setup-static-analyzer -mrelocation-model pic -pic-level 2 -fhalf-no-semantic-interposition -mframe-pointer=none -relaxed-aliasing -fmath-errno -ffp-contract=on -fno-rounding-math -mconstructor-aliases -funwind-tables=2 -target-cpu x86-64 -tune-cpu generic -debugger-tuning=gdb -fdebug-compilation-dir=/builds/GNOME/evolution-data-server/_build -fcoverage-compilation-dir=/builds/GNOME/evolution-data-server/_build -resource-dir /usr/bin/../lib/clang/22 -D GLIB_VERSION_MAX_ALLOWED=GLIB_VERSION_2_68 -D GLIB_VERSION_MIN_REQUIRED=GLIB_VERSION_2_68 -D G_LOG_DOMAIN="libebook" -D LDAP_DEPRECATED -D LIBEBOOK_COMPILATION -D LOCALEDIR="/home/user/_prefix/share/locale" -D SOUP_VERSION_MAX_ALLOWED=SOUP_VERSION_3_2 -D SOUP_VERSION_MIN_REQUIRED=SOUP_VERSION_3_2 -D _LARGEFILE64_SOURCE=1 -D ebook_EXPORTS -I /builds/GNOME/evolution-data-server/_build -I /builds/GNOME/evolution-data-server/_build/src -I /builds/GNOME/evolution-data-server/_build/src/addressbook -I /builds/GNOME/evolution-data-server/_build/src/private -I /builds/GNOME/evolution-data-server/src -I /builds/GNOME/evolution-data-server/src/private -I /builds/GNOME/evolution-data-server/src/addressbook -I /builds/GNOME/evolution-data-server/_build/src/addressbook/libebook -I /builds/GNOME/evolution-data-server/src/addressbook/libebook -I /usr/include/libxml2 -I /usr/include/libsoup-3.0 -I /usr/include/glib-2.0 -I /usr/lib64/glib-2.0/include -I /usr/include/libmount -I /usr/include/blkid -I /usr/include/sysprof-6 -I /home/user/_prefix/include -I /usr/include/nss3 -I /usr/include/nspr4 -I /builds/GNOME/evolution-data-server/_build/src/camel -I /builds/GNOME/evolution-data-server/src/camel -I /builds/GNOME/evolution-data-server/_build/src/libebackend -I /builds/GNOME/evolution-data-server/src/libebackend -I /usr/include/gio-unix-2.0 -I /builds/GNOME/evolution-data-server/_build/src/libedataserver -I /builds/GNOME/evolution-data-server/src/libedataserver -I /usr/include/libsecret-1 -I /usr/include/p11-kit-1 -I /usr/include/json-glib-1.0 -I /usr/include/uuid -I /builds/GNOME/evolution-data-server/_build/src/addressbook/libebook-contacts -I /builds/GNOME/evolution-data-server/src/addressbook/libebook-contacts -I /builds/GNOME/evolution-data-server/_build/src/addressbook/libedata-book -D NDEBUG -I /usr/include/libxml2 -I /usr/include -I /usr/include/libsoup-3.0 -I /usr/include/glib-2.0 -I /usr/lib64/glib-2.0/include -I /usr/include/libmount -I /usr/include/blkid -I /usr/include/sysprof-6 -D WITH_GZFILEOP -D I18N_PHONENUMBERS_USE_BOOST -I /usr/include/nss3 -I /usr/include/nspr4 -I /usr/include/gio-unix-2.0 -I /usr/include/libsecret-1 -I /usr/include/p11-kit-1 -I /usr/include/json-glib-1.0 -I /usr/include/uuid -internal-isystem /usr/bin/../lib/clang/22/include -internal-isystem /usr/local/include -internal-isystem /usr/bin/../lib/gcc/x86_64-redhat-linux/16/../../../../x86_64-redhat-linux/include -internal-externc-isystem /include -internal-externc-isystem /usr/include -Wno-unused-parameter -Wno-sign-compare -Wno-missing-field-initializers -Wno-missing-include-dirs -Wno-deprecated-declarations -Wno-cast-function-type -Wwrite-strings -fconst-strings -ferror-limit 19 -fgnuc-version=4.2.1 -fskip-odr-check-in-gmf -vectorize-loops -vectorize-slp -analyzer-output=html -faddrsig -fdwarf2-cfi-asm -o /builds/GNOME/evolution-data-server/_build/scan-build/2026-08-11-054813-10-1 -x c /builds/GNOME/evolution-data-server/src/addressbook/libebook/e-book-client-view.c
1/*
2 * SPDX-FileCopyrightText: (C) 1999-2008 Novell, Inc. (www.novell.com)
3 * SPDX-FileCopyrightText: (C) 2006 OpenedHand Ltd
4 * SPDX-FileCopyrightText: (C) 2009 Intel Corporation
5 * SPDX-License-Identifier: LGPL-2.0-or-later
6 * SPDX-FileContributor: Ross Burton <ross@linux.intel.com>
7 */
8
9/**
10 * SECTION: e-book-client-view
11 * @include: libebook/libebook.h
12 * @short_description: Receiving change notifications on addressbooks
13 *
14 * This class provides functionality for watching for changes on a
15 * given addressbook opened with an #EBookClient. Use e_book_client_get_view()
16 * to create an #EBookClientView.
17 **/
18
19#include "evolution-data-server-config.h"
20
21#include <glib/gi18n-lib.h>
22
23#include <libedataserver/libedataserver.h>
24#include <libedata-book/libedata-book.h>
25
26#include "e-book-client.h"
27#include "e-book-client-view.h"
28#include "e-dbus-address-book-view.h"
29
30typedef struct _SignalClosure SignalClosure;
31
32struct _EBookClientViewPrivate {
33 EBookClient *client;
34 EDBusAddressBookView *dbus_proxy;
35 GDBusConnection *connection;
36 gchar *object_path;
37 guint running : 1;
38 guint complete : 1;
39
40 GMainContext *main_context;
41 GMutex main_context_lock;
42
43 EBookBackend *direct_backend;
44
45 gulong objects_added_handler_id;
46 gulong objects_modified_handler_id;
47 gulong objects_removed_handler_id;
48 gulong progress_handler_id;
49 gulong complete_handler_id;
50 gulong content_changed_handler_id;
51 gulong notify_n_total_handler_id;
52 gulong notify_indices_handler_id;
53};
54
55struct _SignalClosure {
56 GWeakRef client_view;
57 GSList *object_list;
58 GSList *string_list;
59 gchar *message;
60 guint percent;
61 GError *error;
62};
63
64enum {
65 PROP_0,
66 PROP_CLIENT,
67 PROP_CONNECTION,
68 PROP_DIRECT_BACKEND,
69 PROP_OBJECT_PATH,
70 PROP_N_TOTAL,
71 PROP_INDICES,
72 N_PROPS
73};
74
75enum {
76 OBJECTS_ADDED,
77 OBJECTS_MODIFIED,
78 OBJECTS_REMOVED,
79 PROGRESS,
80 COMPLETE,
81 CONTENT_CHANGED,
82 LAST_SIGNAL
83};
84
85/* Forward Declarations */
86static void e_book_client_view_initable_init
87 (GInitableIface *iface);
88
89static GParamSpec *properties[N_PROPS] = { NULL((void*)0), };
90
91static guint signals[LAST_SIGNAL];
92
93G_DEFINE_TYPE_WITH_CODE (static void e_book_client_view_init (EBookClientView *self); static
void e_book_client_view_class_init (EBookClientViewClass *klass
); static GType e_book_client_view_get_type_once (void); static
gpointer e_book_client_view_parent_class = ((void*)0); static
gint EBookClientView_private_offset; static void e_book_client_view_class_intern_init
(gpointer klass) { e_book_client_view_parent_class = g_type_class_peek_parent
(klass); if (EBookClientView_private_offset != 0) g_type_class_adjust_private_offset
(klass, &EBookClientView_private_offset); e_book_client_view_class_init
((EBookClientViewClass*) klass); } __attribute__ ((__unused__
)) static inline gpointer e_book_client_view_get_instance_private
(EBookClientView *self) { return (((gpointer) ((guint8*) (self
) + (glong) (EBookClientView_private_offset)))); } GType e_book_client_view_get_type
(void) { static gsize static_g_define_type_id = 0; if ((__extension__
({ _Static_assert (sizeof *(&static_g_define_type_id) ==
sizeof (gpointer), "Expression evaluates to false"); (void) (
0 ? (gpointer) *(&static_g_define_type_id) : ((void*)0));
(!(__extension__ ({ _Static_assert (sizeof *(&static_g_define_type_id
) == sizeof (gpointer), "Expression evaluates to false"); __typeof__
(*(&static_g_define_type_id)) gapg_temp_newval; __typeof__
((&static_g_define_type_id)) gapg_temp_atomic = (&static_g_define_type_id
); __atomic_load (gapg_temp_atomic, &gapg_temp_newval, 5)
; gapg_temp_newval; })) && g_once_init_enter (&static_g_define_type_id
)); }))) { GType g_define_type_id = e_book_client_view_get_type_once
(); (__extension__ ({ _Static_assert (sizeof *(&static_g_define_type_id
) == sizeof (gpointer), "Expression evaluates to false"); 0 ?
(void) (*(&static_g_define_type_id) = (g_define_type_id)
) : (void) 0; g_once_init_leave ((&static_g_define_type_id
), (gsize) (g_define_type_id)); })); } return static_g_define_type_id
; } __attribute__ ((__noinline__)) static GType e_book_client_view_get_type_once
(void) { GType g_define_type_id = g_type_register_static_simple
(((GType) ((20) << (2))), g_intern_static_string ("EBookClientView"
), sizeof (EBookClientViewClass), (GClassInitFunc)(void (*)(void
)) e_book_client_view_class_intern_init, sizeof (EBookClientView
), (GInstanceInitFunc)(void (*)(void)) e_book_client_view_init
, (GTypeFlags) 0); { {{ EBookClientView_private_offset = g_type_add_instance_private
(g_define_type_id, sizeof (EBookClientViewPrivate)); } { const
GInterfaceInfo g_implement_interface_info = { (GInterfaceInitFunc
)(void (*)(void)) e_book_client_view_initable_init, ((void*)0
), ((void*)0) }; g_type_add_interface_static (g_define_type_id
, (g_initable_get_type ()), &g_implement_interface_info);
};} } return g_define_type_id; }
94 EBookClientView,static void e_book_client_view_init (EBookClientView *self); static
void e_book_client_view_class_init (EBookClientViewClass *klass
); static GType e_book_client_view_get_type_once (void); static
gpointer e_book_client_view_parent_class = ((void*)0); static
gint EBookClientView_private_offset; static void e_book_client_view_class_intern_init
(gpointer klass) { e_book_client_view_parent_class = g_type_class_peek_parent
(klass); if (EBookClientView_private_offset != 0) g_type_class_adjust_private_offset
(klass, &EBookClientView_private_offset); e_book_client_view_class_init
((EBookClientViewClass*) klass); } __attribute__ ((__unused__
)) static inline gpointer e_book_client_view_get_instance_private
(EBookClientView *self) { return (((gpointer) ((guint8*) (self
) + (glong) (EBookClientView_private_offset)))); } GType e_book_client_view_get_type
(void) { static gsize static_g_define_type_id = 0; if ((__extension__
({ _Static_assert (sizeof *(&static_g_define_type_id) ==
sizeof (gpointer), "Expression evaluates to false"); (void) (
0 ? (gpointer) *(&static_g_define_type_id) : ((void*)0));
(!(__extension__ ({ _Static_assert (sizeof *(&static_g_define_type_id
) == sizeof (gpointer), "Expression evaluates to false"); __typeof__
(*(&static_g_define_type_id)) gapg_temp_newval; __typeof__
((&static_g_define_type_id)) gapg_temp_atomic = (&static_g_define_type_id
); __atomic_load (gapg_temp_atomic, &gapg_temp_newval, 5)
; gapg_temp_newval; })) && g_once_init_enter (&static_g_define_type_id
)); }))) { GType g_define_type_id = e_book_client_view_get_type_once
(); (__extension__ ({ _Static_assert (sizeof *(&static_g_define_type_id
) == sizeof (gpointer), "Expression evaluates to false"); 0 ?
(void) (*(&static_g_define_type_id) = (g_define_type_id)
) : (void) 0; g_once_init_leave ((&static_g_define_type_id
), (gsize) (g_define_type_id)); })); } return static_g_define_type_id
; } __attribute__ ((__noinline__)) static GType e_book_client_view_get_type_once
(void) { GType g_define_type_id = g_type_register_static_simple
(((GType) ((20) << (2))), g_intern_static_string ("EBookClientView"
), sizeof (EBookClientViewClass), (GClassInitFunc)(void (*)(void
)) e_book_client_view_class_intern_init, sizeof (EBookClientView
), (GInstanceInitFunc)(void (*)(void)) e_book_client_view_init
, (GTypeFlags) 0); { {{ EBookClientView_private_offset = g_type_add_instance_private
(g_define_type_id, sizeof (EBookClientViewPrivate)); } { const
GInterfaceInfo g_implement_interface_info = { (GInterfaceInitFunc
)(void (*)(void)) e_book_client_view_initable_init, ((void*)0
), ((void*)0) }; g_type_add_interface_static (g_define_type_id
, (g_initable_get_type ()), &g_implement_interface_info);
};} } return g_define_type_id; }
95 e_book_client_view,static void e_book_client_view_init (EBookClientView *self); static
void e_book_client_view_class_init (EBookClientViewClass *klass
); static GType e_book_client_view_get_type_once (void); static
gpointer e_book_client_view_parent_class = ((void*)0); static
gint EBookClientView_private_offset; static void e_book_client_view_class_intern_init
(gpointer klass) { e_book_client_view_parent_class = g_type_class_peek_parent
(klass); if (EBookClientView_private_offset != 0) g_type_class_adjust_private_offset
(klass, &EBookClientView_private_offset); e_book_client_view_class_init
((EBookClientViewClass*) klass); } __attribute__ ((__unused__
)) static inline gpointer e_book_client_view_get_instance_private
(EBookClientView *self) { return (((gpointer) ((guint8*) (self
) + (glong) (EBookClientView_private_offset)))); } GType e_book_client_view_get_type
(void) { static gsize static_g_define_type_id = 0; if ((__extension__
({ _Static_assert (sizeof *(&static_g_define_type_id) ==
sizeof (gpointer), "Expression evaluates to false"); (void) (
0 ? (gpointer) *(&static_g_define_type_id) : ((void*)0));
(!(__extension__ ({ _Static_assert (sizeof *(&static_g_define_type_id
) == sizeof (gpointer), "Expression evaluates to false"); __typeof__
(*(&static_g_define_type_id)) gapg_temp_newval; __typeof__
((&static_g_define_type_id)) gapg_temp_atomic = (&static_g_define_type_id
); __atomic_load (gapg_temp_atomic, &gapg_temp_newval, 5)
; gapg_temp_newval; })) && g_once_init_enter (&static_g_define_type_id
)); }))) { GType g_define_type_id = e_book_client_view_get_type_once
(); (__extension__ ({ _Static_assert (sizeof *(&static_g_define_type_id
) == sizeof (gpointer), "Expression evaluates to false"); 0 ?
(void) (*(&static_g_define_type_id) = (g_define_type_id)
) : (void) 0; g_once_init_leave ((&static_g_define_type_id
), (gsize) (g_define_type_id)); })); } return static_g_define_type_id
; } __attribute__ ((__noinline__)) static GType e_book_client_view_get_type_once
(void) { GType g_define_type_id = g_type_register_static_simple
(((GType) ((20) << (2))), g_intern_static_string ("EBookClientView"
), sizeof (EBookClientViewClass), (GClassInitFunc)(void (*)(void
)) e_book_client_view_class_intern_init, sizeof (EBookClientView
), (GInstanceInitFunc)(void (*)(void)) e_book_client_view_init
, (GTypeFlags) 0); { {{ EBookClientView_private_offset = g_type_add_instance_private
(g_define_type_id, sizeof (EBookClientViewPrivate)); } { const
GInterfaceInfo g_implement_interface_info = { (GInterfaceInitFunc
)(void (*)(void)) e_book_client_view_initable_init, ((void*)0
), ((void*)0) }; g_type_add_interface_static (g_define_type_id
, (g_initable_get_type ()), &g_implement_interface_info);
};} } return g_define_type_id; }
96 G_TYPE_OBJECT,static void e_book_client_view_init (EBookClientView *self); static
void e_book_client_view_class_init (EBookClientViewClass *klass
); static GType e_book_client_view_get_type_once (void); static
gpointer e_book_client_view_parent_class = ((void*)0); static
gint EBookClientView_private_offset; static void e_book_client_view_class_intern_init
(gpointer klass) { e_book_client_view_parent_class = g_type_class_peek_parent
(klass); if (EBookClientView_private_offset != 0) g_type_class_adjust_private_offset
(klass, &EBookClientView_private_offset); e_book_client_view_class_init
((EBookClientViewClass*) klass); } __attribute__ ((__unused__
)) static inline gpointer e_book_client_view_get_instance_private
(EBookClientView *self) { return (((gpointer) ((guint8*) (self
) + (glong) (EBookClientView_private_offset)))); } GType e_book_client_view_get_type
(void) { static gsize static_g_define_type_id = 0; if ((__extension__
({ _Static_assert (sizeof *(&static_g_define_type_id) ==
sizeof (gpointer), "Expression evaluates to false"); (void) (
0 ? (gpointer) *(&static_g_define_type_id) : ((void*)0));
(!(__extension__ ({ _Static_assert (sizeof *(&static_g_define_type_id
) == sizeof (gpointer), "Expression evaluates to false"); __typeof__
(*(&static_g_define_type_id)) gapg_temp_newval; __typeof__
((&static_g_define_type_id)) gapg_temp_atomic = (&static_g_define_type_id
); __atomic_load (gapg_temp_atomic, &gapg_temp_newval, 5)
; gapg_temp_newval; })) && g_once_init_enter (&static_g_define_type_id
)); }))) { GType g_define_type_id = e_book_client_view_get_type_once
(); (__extension__ ({ _Static_assert (sizeof *(&static_g_define_type_id
) == sizeof (gpointer), "Expression evaluates to false"); 0 ?
(void) (*(&static_g_define_type_id) = (g_define_type_id)
) : (void) 0; g_once_init_leave ((&static_g_define_type_id
), (gsize) (g_define_type_id)); })); } return static_g_define_type_id
; } __attribute__ ((__noinline__)) static GType e_book_client_view_get_type_once
(void) { GType g_define_type_id = g_type_register_static_simple
(((GType) ((20) << (2))), g_intern_static_string ("EBookClientView"
), sizeof (EBookClientViewClass), (GClassInitFunc)(void (*)(void
)) e_book_client_view_class_intern_init, sizeof (EBookClientView
), (GInstanceInitFunc)(void (*)(void)) e_book_client_view_init
, (GTypeFlags) 0); { {{ EBookClientView_private_offset = g_type_add_instance_private
(g_define_type_id, sizeof (EBookClientViewPrivate)); } { const
GInterfaceInfo g_implement_interface_info = { (GInterfaceInitFunc
)(void (*)(void)) e_book_client_view_initable_init, ((void*)0
), ((void*)0) }; g_type_add_interface_static (g_define_type_id
, (g_initable_get_type ()), &g_implement_interface_info);
};} } return g_define_type_id; }
97 G_ADD_PRIVATE (EBookClientView)static void e_book_client_view_init (EBookClientView *self); static
void e_book_client_view_class_init (EBookClientViewClass *klass
); static GType e_book_client_view_get_type_once (void); static
gpointer e_book_client_view_parent_class = ((void*)0); static
gint EBookClientView_private_offset; static void e_book_client_view_class_intern_init
(gpointer klass) { e_book_client_view_parent_class = g_type_class_peek_parent
(klass); if (EBookClientView_private_offset != 0) g_type_class_adjust_private_offset
(klass, &EBookClientView_private_offset); e_book_client_view_class_init
((EBookClientViewClass*) klass); } __attribute__ ((__unused__
)) static inline gpointer e_book_client_view_get_instance_private
(EBookClientView *self) { return (((gpointer) ((guint8*) (self
) + (glong) (EBookClientView_private_offset)))); } GType e_book_client_view_get_type
(void) { static gsize static_g_define_type_id = 0; if ((__extension__
({ _Static_assert (sizeof *(&static_g_define_type_id) ==
sizeof (gpointer), "Expression evaluates to false"); (void) (
0 ? (gpointer) *(&static_g_define_type_id) : ((void*)0));
(!(__extension__ ({ _Static_assert (sizeof *(&static_g_define_type_id
) == sizeof (gpointer), "Expression evaluates to false"); __typeof__
(*(&static_g_define_type_id)) gapg_temp_newval; __typeof__
((&static_g_define_type_id)) gapg_temp_atomic = (&static_g_define_type_id
); __atomic_load (gapg_temp_atomic, &gapg_temp_newval, 5)
; gapg_temp_newval; })) && g_once_init_enter (&static_g_define_type_id
)); }))) { GType g_define_type_id = e_book_client_view_get_type_once
(); (__extension__ ({ _Static_assert (sizeof *(&static_g_define_type_id
) == sizeof (gpointer), "Expression evaluates to false"); 0 ?
(void) (*(&static_g_define_type_id) = (g_define_type_id)
) : (void) 0; g_once_init_leave ((&static_g_define_type_id
), (gsize) (g_define_type_id)); })); } return static_g_define_type_id
; } __attribute__ ((__noinline__)) static GType e_book_client_view_get_type_once
(void) { GType g_define_type_id = g_type_register_static_simple
(((GType) ((20) << (2))), g_intern_static_string ("EBookClientView"
), sizeof (EBookClientViewClass), (GClassInitFunc)(void (*)(void
)) e_book_client_view_class_intern_init, sizeof (EBookClientView
), (GInstanceInitFunc)(void (*)(void)) e_book_client_view_init
, (GTypeFlags) 0); { {{ EBookClientView_private_offset = g_type_add_instance_private
(g_define_type_id, sizeof (EBookClientViewPrivate)); } { const
GInterfaceInfo g_implement_interface_info = { (GInterfaceInitFunc
)(void (*)(void)) e_book_client_view_initable_init, ((void*)0
), ((void*)0) }; g_type_add_interface_static (g_define_type_id
, (g_initable_get_type ()), &g_implement_interface_info);
};} } return g_define_type_id; }
98 G_IMPLEMENT_INTERFACE (static void e_book_client_view_init (EBookClientView *self); static
void e_book_client_view_class_init (EBookClientViewClass *klass
); static GType e_book_client_view_get_type_once (void); static
gpointer e_book_client_view_parent_class = ((void*)0); static
gint EBookClientView_private_offset; static void e_book_client_view_class_intern_init
(gpointer klass) { e_book_client_view_parent_class = g_type_class_peek_parent
(klass); if (EBookClientView_private_offset != 0) g_type_class_adjust_private_offset
(klass, &EBookClientView_private_offset); e_book_client_view_class_init
((EBookClientViewClass*) klass); } __attribute__ ((__unused__
)) static inline gpointer e_book_client_view_get_instance_private
(EBookClientView *self) { return (((gpointer) ((guint8*) (self
) + (glong) (EBookClientView_private_offset)))); } GType e_book_client_view_get_type
(void) { static gsize static_g_define_type_id = 0; if ((__extension__
({ _Static_assert (sizeof *(&static_g_define_type_id) ==
sizeof (gpointer), "Expression evaluates to false"); (void) (
0 ? (gpointer) *(&static_g_define_type_id) : ((void*)0));
(!(__extension__ ({ _Static_assert (sizeof *(&static_g_define_type_id
) == sizeof (gpointer), "Expression evaluates to false"); __typeof__
(*(&static_g_define_type_id)) gapg_temp_newval; __typeof__
((&static_g_define_type_id)) gapg_temp_atomic = (&static_g_define_type_id
); __atomic_load (gapg_temp_atomic, &gapg_temp_newval, 5)
; gapg_temp_newval; })) && g_once_init_enter (&static_g_define_type_id
)); }))) { GType g_define_type_id = e_book_client_view_get_type_once
(); (__extension__ ({ _Static_assert (sizeof *(&static_g_define_type_id
) == sizeof (gpointer), "Expression evaluates to false"); 0 ?
(void) (*(&static_g_define_type_id) = (g_define_type_id)
) : (void) 0; g_once_init_leave ((&static_g_define_type_id
), (gsize) (g_define_type_id)); })); } return static_g_define_type_id
; } __attribute__ ((__noinline__)) static GType e_book_client_view_get_type_once
(void) { GType g_define_type_id = g_type_register_static_simple
(((GType) ((20) << (2))), g_intern_static_string ("EBookClientView"
), sizeof (EBookClientViewClass), (GClassInitFunc)(void (*)(void
)) e_book_client_view_class_intern_init, sizeof (EBookClientView
), (GInstanceInitFunc)(void (*)(void)) e_book_client_view_init
, (GTypeFlags) 0); { {{ EBookClientView_private_offset = g_type_add_instance_private
(g_define_type_id, sizeof (EBookClientViewPrivate)); } { const
GInterfaceInfo g_implement_interface_info = { (GInterfaceInitFunc
)(void (*)(void)) e_book_client_view_initable_init, ((void*)0
), ((void*)0) }; g_type_add_interface_static (g_define_type_id
, (g_initable_get_type ()), &g_implement_interface_info);
};} } return g_define_type_id; }
99 G_TYPE_INITABLE,static void e_book_client_view_init (EBookClientView *self); static
void e_book_client_view_class_init (EBookClientViewClass *klass
); static GType e_book_client_view_get_type_once (void); static
gpointer e_book_client_view_parent_class = ((void*)0); static
gint EBookClientView_private_offset; static void e_book_client_view_class_intern_init
(gpointer klass) { e_book_client_view_parent_class = g_type_class_peek_parent
(klass); if (EBookClientView_private_offset != 0) g_type_class_adjust_private_offset
(klass, &EBookClientView_private_offset); e_book_client_view_class_init
((EBookClientViewClass*) klass); } __attribute__ ((__unused__
)) static inline gpointer e_book_client_view_get_instance_private
(EBookClientView *self) { return (((gpointer) ((guint8*) (self
) + (glong) (EBookClientView_private_offset)))); } GType e_book_client_view_get_type
(void) { static gsize static_g_define_type_id = 0; if ((__extension__
({ _Static_assert (sizeof *(&static_g_define_type_id) ==
sizeof (gpointer), "Expression evaluates to false"); (void) (
0 ? (gpointer) *(&static_g_define_type_id) : ((void*)0));
(!(__extension__ ({ _Static_assert (sizeof *(&static_g_define_type_id
) == sizeof (gpointer), "Expression evaluates to false"); __typeof__
(*(&static_g_define_type_id)) gapg_temp_newval; __typeof__
((&static_g_define_type_id)) gapg_temp_atomic = (&static_g_define_type_id
); __atomic_load (gapg_temp_atomic, &gapg_temp_newval, 5)
; gapg_temp_newval; })) && g_once_init_enter (&static_g_define_type_id
)); }))) { GType g_define_type_id = e_book_client_view_get_type_once
(); (__extension__ ({ _Static_assert (sizeof *(&static_g_define_type_id
) == sizeof (gpointer), "Expression evaluates to false"); 0 ?
(void) (*(&static_g_define_type_id) = (g_define_type_id)
) : (void) 0; g_once_init_leave ((&static_g_define_type_id
), (gsize) (g_define_type_id)); })); } return static_g_define_type_id
; } __attribute__ ((__noinline__)) static GType e_book_client_view_get_type_once
(void) { GType g_define_type_id = g_type_register_static_simple
(((GType) ((20) << (2))), g_intern_static_string ("EBookClientView"
), sizeof (EBookClientViewClass), (GClassInitFunc)(void (*)(void
)) e_book_client_view_class_intern_init, sizeof (EBookClientView
), (GInstanceInitFunc)(void (*)(void)) e_book_client_view_init
, (GTypeFlags) 0); { {{ EBookClientView_private_offset = g_type_add_instance_private
(g_define_type_id, sizeof (EBookClientViewPrivate)); } { const
GInterfaceInfo g_implement_interface_info = { (GInterfaceInitFunc
)(void (*)(void)) e_book_client_view_initable_init, ((void*)0
), ((void*)0) }; g_type_add_interface_static (g_define_type_id
, (g_initable_get_type ()), &g_implement_interface_info);
};} } return g_define_type_id; }
100 e_book_client_view_initable_init))static void e_book_client_view_init (EBookClientView *self); static
void e_book_client_view_class_init (EBookClientViewClass *klass
); static GType e_book_client_view_get_type_once (void); static
gpointer e_book_client_view_parent_class = ((void*)0); static
gint EBookClientView_private_offset; static void e_book_client_view_class_intern_init
(gpointer klass) { e_book_client_view_parent_class = g_type_class_peek_parent
(klass); if (EBookClientView_private_offset != 0) g_type_class_adjust_private_offset
(klass, &EBookClientView_private_offset); e_book_client_view_class_init
((EBookClientViewClass*) klass); } __attribute__ ((__unused__
)) static inline gpointer e_book_client_view_get_instance_private
(EBookClientView *self) { return (((gpointer) ((guint8*) (self
) + (glong) (EBookClientView_private_offset)))); } GType e_book_client_view_get_type
(void) { static gsize static_g_define_type_id = 0; if ((__extension__
({ _Static_assert (sizeof *(&static_g_define_type_id) ==
sizeof (gpointer), "Expression evaluates to false"); (void) (
0 ? (gpointer) *(&static_g_define_type_id) : ((void*)0));
(!(__extension__ ({ _Static_assert (sizeof *(&static_g_define_type_id
) == sizeof (gpointer), "Expression evaluates to false"); __typeof__
(*(&static_g_define_type_id)) gapg_temp_newval; __typeof__
((&static_g_define_type_id)) gapg_temp_atomic = (&static_g_define_type_id
); __atomic_load (gapg_temp_atomic, &gapg_temp_newval, 5)
; gapg_temp_newval; })) && g_once_init_enter (&static_g_define_type_id
)); }))) { GType g_define_type_id = e_book_client_view_get_type_once
(); (__extension__ ({ _Static_assert (sizeof *(&static_g_define_type_id
) == sizeof (gpointer), "Expression evaluates to false"); 0 ?
(void) (*(&static_g_define_type_id) = (g_define_type_id)
) : (void) 0; g_once_init_leave ((&static_g_define_type_id
), (gsize) (g_define_type_id)); })); } return static_g_define_type_id
; } __attribute__ ((__noinline__)) static GType e_book_client_view_get_type_once
(void) { GType g_define_type_id = g_type_register_static_simple
(((GType) ((20) << (2))), g_intern_static_string ("EBookClientView"
), sizeof (EBookClientViewClass), (GClassInitFunc)(void (*)(void
)) e_book_client_view_class_intern_init, sizeof (EBookClientView
), (GInstanceInitFunc)(void (*)(void)) e_book_client_view_init
, (GTypeFlags) 0); { {{ EBookClientView_private_offset = g_type_add_instance_private
(g_define_type_id, sizeof (EBookClientViewPrivate)); } { const
GInterfaceInfo g_implement_interface_info = { (GInterfaceInitFunc
)(void (*)(void)) e_book_client_view_initable_init, ((void*)0
), ((void*)0) }; g_type_add_interface_static (g_define_type_id
, (g_initable_get_type ()), &g_implement_interface_info);
};} } return g_define_type_id; }
101
102typedef struct {
103 EBookClientView *client_view;
104 guint signum;
105} NotificationData;
106
107static void
108signal_closure_free (SignalClosure *signal_closure)
109{
110 g_weak_ref_clear (&signal_closure->client_view);
111
112 g_slist_free_full (
113 signal_closure->object_list,
114 (GDestroyNotify) g_object_unref);
115
116 g_slist_free_full (
117 signal_closure->string_list,
118 (GDestroyNotify) g_free);
119
120 g_free (signal_closure->message);
121
122 if (signal_closure->error != NULL((void*)0))
123 g_error_free (signal_closure->error);
124
125 g_slice_free (SignalClosure, signal_closure)do { if (1) g_slice_free1 (sizeof (SignalClosure), (signal_closure
)); else (void) ((SignalClosure*) 0 == (signal_closure)); } while
(0)
;
126}
127
128static GMainContext *
129book_client_view_ref_main_context (EBookClientView *client_view)
130{
131 GMainContext *main_context;
132
133 /* Intentionally not checking for NULL so we get a console
134 * warning if we try to reference a NULL main context, but
135 * that should never happen. */
136
137 g_mutex_lock (&client_view->priv->main_context_lock);
138
139 main_context = g_main_context_ref (client_view->priv->main_context);
140
141 g_mutex_unlock (&client_view->priv->main_context_lock);
142
143 return main_context;
144}
145
146static void
147book_client_view_set_main_context (EBookClientView *client_view,
148 GMainContext *main_context)
149{
150 g_mutex_lock (&client_view->priv->main_context_lock);
151
152 if (client_view->priv->main_context != NULL((void*)0))
153 g_main_context_unref (client_view->priv->main_context);
154
155 client_view->priv->main_context = g_main_context_ref (main_context);
156
157 g_mutex_unlock (&client_view->priv->main_context_lock);
158}
159
160static gboolean
161book_client_view_emit_objects_added_idle_cb (gpointer user_data)
162{
163 SignalClosure *signal_closure = user_data;
164 EBookClientView *client_view;
165
166 client_view = g_weak_ref_get (&signal_closure->client_view);
167
168 if (client_view != NULL((void*)0)) {
169 g_signal_emit (
170 client_view,
171 signals[OBJECTS_ADDED], 0,
172 signal_closure->object_list);
173 g_object_unref (client_view);
174 }
175
176 return FALSE(0);
177}
178
179static gboolean
180book_client_view_emit_objects_modified_idle_cb (gpointer user_data)
181{
182 SignalClosure *signal_closure = user_data;
183 EBookClientView *client_view;
184
185 client_view = g_weak_ref_get (&signal_closure->client_view);
186
187 if (client_view != NULL((void*)0)) {
188 g_signal_emit (
189 client_view,
190 signals[OBJECTS_MODIFIED], 0,
191 signal_closure->object_list);
192 g_object_unref (client_view);
193 }
194
195 return FALSE(0);
196}
197
198static gboolean
199book_client_view_emit_objects_removed_idle_cb (gpointer user_data)
200{
201 SignalClosure *signal_closure = user_data;
202 EBookClientView *client_view;
203
204 client_view = g_weak_ref_get (&signal_closure->client_view);
205
206 if (client_view != NULL((void*)0)) {
207 g_signal_emit (
208 client_view,
209 signals[OBJECTS_REMOVED], 0,
210 signal_closure->string_list);
211 g_object_unref (client_view);
212 }
213
214 return FALSE(0);
215}
216
217static gboolean
218book_client_view_emit_progress_idle_cb (gpointer user_data)
219{
220 SignalClosure *signal_closure = user_data;
221 EBookClientView *client_view;
222
223 client_view = g_weak_ref_get (&signal_closure->client_view);
224
225 if (client_view != NULL((void*)0)) {
226 g_signal_emit (
227 client_view,
228 signals[PROGRESS], 0,
229 signal_closure->percent,
230 signal_closure->message);
231 g_object_unref (client_view);
232 }
233
234 return FALSE(0);
235}
236
237static gboolean
238book_client_view_emit_complete_idle_cb (gpointer user_data)
239{
240 SignalClosure *signal_closure = user_data;
241 EBookClientView *client_view;
242
243 client_view = g_weak_ref_get (&signal_closure->client_view);
244
245 if (client_view != NULL((void*)0)) {
246 g_signal_emit (
247 client_view,
248 signals[COMPLETE], 0,
249 signal_closure->error);
250 g_object_unref (client_view);
251 }
252
253 return FALSE(0);
254}
255
256static void
257book_client_view_emit_objects_added (EBookClientView *client_view,
258 GSList *object_list)
259{
260 GSource *idle_source;
261 GMainContext *main_context;
262 SignalClosure *signal_closure;
263
264 signal_closure = g_slice_new0 (SignalClosure)(SignalClosure *) (__extension__ ({ gsize __s = (sizeof (SignalClosure
) > 0 ? sizeof (SignalClosure) : 1); gpointer __p; __p = g_slice_alloc
(__s); memset (__p, 0, __s); __p; }))
;
265 g_weak_ref_init (&signal_closure->client_view, client_view);
266 signal_closure->object_list = object_list; /* takes ownership */
267
268 main_context = book_client_view_ref_main_context (client_view);
269
270 idle_source = g_idle_source_new ();
271 g_source_set_callback (
272 idle_source,
273 book_client_view_emit_objects_added_idle_cb,
274 signal_closure,
275 (GDestroyNotify) signal_closure_free);
276 g_source_attach (idle_source, main_context);
277 g_source_unref (idle_source);
278
279 g_main_context_unref (main_context);
280}
281
282static void
283book_client_view_emit_objects_modified (EBookClientView *client_view,
284 GSList *object_list)
285{
286 GSource *idle_source;
287 GMainContext *main_context;
288 SignalClosure *signal_closure;
289
290 signal_closure = g_slice_new0 (SignalClosure)(SignalClosure *) (__extension__ ({ gsize __s = (sizeof (SignalClosure
) > 0 ? sizeof (SignalClosure) : 1); gpointer __p; __p = g_slice_alloc
(__s); memset (__p, 0, __s); __p; }))
;
291 g_weak_ref_init (&signal_closure->client_view, client_view);
292 signal_closure->object_list = object_list; /* takes ownership */
293
294 main_context = book_client_view_ref_main_context (client_view);
295
296 idle_source = g_idle_source_new ();
297 g_source_set_callback (
298 idle_source,
299 book_client_view_emit_objects_modified_idle_cb,
300 signal_closure,
301 (GDestroyNotify) signal_closure_free);
302 g_source_attach (idle_source, main_context);
303 g_source_unref (idle_source);
304
305 g_main_context_unref (main_context);
306}
307
308static gchar *
309direct_contacts_query (const gchar * const *uids)
310{
311 EBookQuery *query, **qs;
312 gchar *sexp;
313 gint i, len;
314
315 len = g_strv_length ((gchar **) uids);
316 qs = g_new0 (EBookQuery *, len)(EBookQuery * *) (__extension__ ({ gsize __n = (gsize) (len);
gsize __s = sizeof (EBookQuery *); gpointer __p; if (__s == 1
) __p = g_malloc0 (__n); else if (__builtin_constant_p (__n) &&
(__s == 0 || __n <= (9223372036854775807L *2UL+1UL) / __s
)) __p = g_malloc0 (__n * __s); else __p = g_malloc0_n (__n, __s
); __p; }))
;
317
318 for (i = 0; uids[i] != NULL((void*)0); i++) {
319 const gchar *uid = uids[i];
320
321 qs[i] = e_book_query_field_test (E_CONTACT_UID, E_BOOK_QUERY_IS, uid);
322 }
323
324 query = e_book_query_or (len, qs, TRUE(!(0)));
325 sexp = e_book_query_to_string (query);
326 e_book_query_unref (query);
327 g_free (qs);
328
329 return sexp;
330}
331
332static void
333direct_contacts_ready (GObject *source_object,
334 GAsyncResult *result,
335 gpointer user_data)
336{
337 NotificationData *data = (NotificationData *) user_data;
338 GQueue queue = G_QUEUE_INIT{ ((void*)0), ((void*)0), 0 };
339 GSList *list = NULL((void*)0);
340 GError *local_error = NULL((void*)0);
341
342 e_book_backend_get_contact_list_finish (
343 E_BOOK_BACKEND (source_object)((((EBookBackend*) (void *) ((source_object))))),
344 result, &queue, &local_error);
345
346 while (!g_queue_is_empty (&queue))
347 list = g_slist_prepend (list, g_queue_pop_head (&queue));
348
349 list = g_slist_reverse (list);
350
351 if (local_error != NULL((void*)0)) {
352 g_warn_if_fail (list == NULL)do { if (__builtin_expect (__extension__ ({ int _g_boolean_var_39
= 0; if (list == ((void*)0)) _g_boolean_var_39 = 1; _g_boolean_var_39
; }), 1)) ; else g_warn_message ("libebook", "/builds/GNOME/evolution-data-server/src/addressbook/libebook/e-book-client-view.c"
, 352, ((const char*) (__func__)), "list == NULL"); } while (
0)
;
353 g_warning (
354 "Error fetching contacts directly: %s\n",
355 local_error->message);
356 g_error_free (local_error);
357
358 } else if (data->signum == OBJECTS_ADDED) {
359 /* Takes ownership of the linked list. */
360 book_client_view_emit_objects_added (
361 data->client_view, list);
362
363 } else if (data->signum == OBJECTS_MODIFIED) {
364 /* Takes ownership of the linked list. */
365 book_client_view_emit_objects_modified (
366 data->client_view, list);
367
368 } else {
369 g_slist_free_full (list, (GDestroyNotify) g_object_unref);
370 }
371
372 g_object_unref (data->client_view);
373 g_slice_free (NotificationData, data)do { if (1) g_slice_free1 (sizeof (NotificationData), (data))
; else (void) ((NotificationData*) 0 == (data)); } while (0)
;
374}
375
376static void
377direct_contacts_fetch (EBookClientView *client_view,
378 const gchar * const *uids,
379 guint signum)
380{
381 EBookBackend *backend;
382 NotificationData *data;
383 gchar *sexp = direct_contacts_query (uids);
384
385 backend = client_view->priv->direct_backend;
386
387 /* Until the view has completely loaded, we need to make
388 * sync calls to the backend
389 */
390 if (!client_view->priv->complete) {
391 GQueue queue = G_QUEUE_INIT{ ((void*)0), ((void*)0), 0 };
392 GSList *list = NULL((void*)0);
393 GError *local_error = NULL((void*)0);
394
395 e_book_backend_get_contact_list_sync (
396 backend, sexp, &queue, NULL((void*)0), &local_error);
397
398 while (!g_queue_is_empty (&queue)) {
399 list = g_slist_prepend (
400 list, g_queue_pop_head (&queue));
401 }
402
403 list = g_slist_reverse (list);
404
405 if (local_error != NULL((void*)0)) {
406 g_warn_if_fail (list == NULL)do { if (__builtin_expect (__extension__ ({ int _g_boolean_var_40
= 0; if (list == ((void*)0)) _g_boolean_var_40 = 1; _g_boolean_var_40
; }), 1)) ; else g_warn_message ("libebook", "/builds/GNOME/evolution-data-server/src/addressbook/libebook/e-book-client-view.c"
, 406, ((const char*) (__func__)), "list == NULL"); } while (
0)
;
407 g_warning (
408 "Error fetching contacts directly: %s\n",
409 local_error->message);
410 g_error_free (local_error);
411
412 } else if (signum == OBJECTS_ADDED) {
413 /* Takes ownership of the linked list. */
414 book_client_view_emit_objects_added (
415 client_view, list);
416
417 } else if (signum == OBJECTS_MODIFIED) {
418 /* Takes ownership of the linked list. */
419 book_client_view_emit_objects_modified (
420 client_view, list);
421
422 } else {
423 g_slist_free_full (
424 list, (GDestroyNotify) g_object_unref);
425 }
426
427 } else {
428 /* Make async calls, avoid blocking the thread owning the view
429 * as much as possible
430 */
431 data = g_slice_new (NotificationData)((NotificationData*) g_slice_alloc ((sizeof (NotificationData
) > 0 ? sizeof (NotificationData) : 1)))
;
432 data->client_view = g_object_ref (client_view)((__typeof__ (client_view)) (g_object_ref) (client_view));
433 data->signum = signum;
434
435 e_book_backend_get_contact_list (
436 backend, sexp, NULL((void*)0), direct_contacts_ready, data);
437 }
438
439 g_free (sexp);
440}
441
442static void
443book_client_view_objects_added_cb (EDBusAddressBookView *object,
444 const gchar * const *vcards,
445 GWeakRef *client_view_weak_ref)
446{
447 EBookClientView *client_view;
448
449 client_view = g_weak_ref_get (client_view_weak_ref);
450
451 if (client_view != NULL((void*)0)) {
452 GSList *list = NULL((void*)0);
453 gint ii;
454
455 if (!client_view->priv->running) {
456 g_object_unref (client_view);
457 return;
458 }
459
460 /* array contains UIDs only */
461 if (client_view->priv->direct_backend != NULL((void*)0)) {
462 direct_contacts_fetch (
463 client_view, vcards, OBJECTS_ADDED);
464 g_object_unref (client_view);
465 return;
466 }
467
468 /* array contains both UID and vcard */
469 for (ii = 0; vcards[ii] != NULL((void*)0) && vcards[ii + 1] != NULL((void*)0); ii += 2) {
470 EContact *contact;
471 const gchar *vcard = vcards[ii];
472 const gchar *uid = vcards[ii + 1];
473
474 contact = e_contact_new_from_vcard_with_uid (vcard, uid);
475 list = g_slist_prepend (list, contact);
476 }
477
478 list = g_slist_reverse (list);
479
480 /* Takes ownership of the linked list. */
481 book_client_view_emit_objects_added (client_view, list);
482
483 g_object_unref (client_view);
484 }
485}
486
487static void
488book_client_view_objects_modified_cb (EDBusAddressBookView *object,
489 const gchar * const *vcards,
490 GWeakRef *client_view_weak_ref)
491{
492 EBookClientView *client_view;
493
494 client_view = g_weak_ref_get (client_view_weak_ref);
495
496 if (client_view != NULL((void*)0)) {
497 GSList *list = NULL((void*)0);
498 gint ii;
499
500 if (!client_view->priv->running) {
501 g_object_unref (client_view);
502 return;
503 }
504
505 /* array contains UIDs only */
506 if (client_view->priv->direct_backend != NULL((void*)0)) {
507 direct_contacts_fetch (
508 client_view, vcards, OBJECTS_MODIFIED);
509 g_object_unref (client_view);
510 return;
511 }
512
513 /* array contains both UID and vcard */
514 for (ii = 0; vcards[ii] != NULL((void*)0) && vcards[ii + 1] != NULL((void*)0); ii += 2) {
515 EContact *contact;
516 const gchar *vcard = vcards[ii];
517 const gchar *uid = vcards[ii + 1];
518
519 contact = e_contact_new_from_vcard_with_uid (vcard, uid);
520 list = g_slist_prepend (list, contact);
521 }
522
523 list = g_slist_reverse (list);
524
525 /* Takes ownership of the linked list. */
526 book_client_view_emit_objects_modified (client_view, list);
527
528 g_object_unref (client_view);
529 }
530}
531
532static void
533book_client_view_objects_removed_cb (EDBusAddressBookView *object,
534 const gchar * const *uids,
535 GWeakRef *client_view_weak_ref)
536{
537 EBookClientView *client_view;
538
539 client_view = g_weak_ref_get (client_view_weak_ref);
540
541 if (client_view != NULL((void*)0)) {
542 GSource *idle_source;
543 GMainContext *main_context;
544 SignalClosure *signal_closure;
545 GSList *list = NULL((void*)0);
546 gint ii;
547
548 if (!client_view->priv->running) {
549 g_object_unref (client_view);
550 return;
551 }
552
553 for (ii = 0; uids[ii] != NULL((void*)0); ii++)
554 list = g_slist_prepend (list, g_strdup (uids[ii])g_strdup_inline (uids[ii]));
555
556 signal_closure = g_slice_new0 (SignalClosure)(SignalClosure *) (__extension__ ({ gsize __s = (sizeof (SignalClosure
) > 0 ? sizeof (SignalClosure) : 1); gpointer __p; __p = g_slice_alloc
(__s); memset (__p, 0, __s); __p; }))
;
557 g_weak_ref_init (&signal_closure->client_view, client_view);
558 signal_closure->string_list = g_slist_reverse (list);
559
560 main_context = book_client_view_ref_main_context (client_view);
561
562 idle_source = g_idle_source_new ();
563 g_source_set_callback (
564 idle_source,
565 book_client_view_emit_objects_removed_idle_cb,
566 signal_closure,
567 (GDestroyNotify) signal_closure_free);
568 g_source_attach (idle_source, main_context);
569 g_source_unref (idle_source);
570
571 g_main_context_unref (main_context);
572
573 g_object_unref (client_view);
574 }
575}
576
577static void
578book_client_view_progress_cb (EDBusAddressBookView *object,
579 guint percent,
580 const gchar *message,
581 GWeakRef *client_view_weak_ref)
582{
583 EBookClientView *client_view;
584
585 client_view = g_weak_ref_get (client_view_weak_ref);
586
587 if (client_view != NULL((void*)0)) {
588 GSource *idle_source;
589 GMainContext *main_context;
590 SignalClosure *signal_closure;
591
592 if (!client_view->priv->running) {
593 g_object_unref (client_view);
594 return;
595 }
596
597 signal_closure = g_slice_new0 (SignalClosure)(SignalClosure *) (__extension__ ({ gsize __s = (sizeof (SignalClosure
) > 0 ? sizeof (SignalClosure) : 1); gpointer __p; __p = g_slice_alloc
(__s); memset (__p, 0, __s); __p; }))
;
598 g_weak_ref_init (&signal_closure->client_view, client_view);
599 signal_closure->message = g_strdup (message)g_strdup_inline (message);
600 signal_closure->percent = percent;
601
602 main_context = book_client_view_ref_main_context (client_view);
603
604 idle_source = g_idle_source_new ();
605 g_source_set_callback (
606 idle_source,
607 book_client_view_emit_progress_idle_cb,
608 signal_closure,
609 (GDestroyNotify) signal_closure_free);
610 g_source_attach (idle_source, main_context);
611 g_source_unref (idle_source);
612
613 g_main_context_unref (main_context);
614
615 g_object_unref (client_view);
616 }
617}
618
619static void
620book_client_view_complete_cb (EDBusAddressBookView *object,
621 const gchar *arg_error_name,
622 const gchar *arg_error_message,
623 GWeakRef *client_view_weak_ref)
624{
625 EBookClientView *client_view;
626
627 client_view = g_weak_ref_get (client_view_weak_ref);
628
629 if (client_view != NULL((void*)0)) {
630 GSource *idle_source;
631 GMainContext *main_context;
632 SignalClosure *signal_closure;
633
634 if (!client_view->priv->running) {
635 g_object_unref (client_view);
636 return;
637 }
638
639 signal_closure = g_slice_new0 (SignalClosure)(SignalClosure *) (__extension__ ({ gsize __s = (sizeof (SignalClosure
) > 0 ? sizeof (SignalClosure) : 1); gpointer __p; __p = g_slice_alloc
(__s); memset (__p, 0, __s); __p; }))
;
640 g_weak_ref_init (&signal_closure->client_view, client_view);
641 if (arg_error_name && *arg_error_name && arg_error_message)
642 signal_closure->error = g_dbus_error_new_for_dbus_error (arg_error_name, arg_error_message);
643 else
644 signal_closure->error = NULL((void*)0);
645
646 if (signal_closure->error)
647 g_dbus_error_strip_remote_error (signal_closure->error);
648
649 main_context = book_client_view_ref_main_context (client_view);
650
651 idle_source = g_idle_source_new ();
652 g_source_set_callback (
653 idle_source,
654 book_client_view_emit_complete_idle_cb,
655 signal_closure,
656 (GDestroyNotify) signal_closure_free);
657 g_source_attach (idle_source, main_context);
658 g_source_unref (idle_source);
659
660 g_main_context_unref (main_context);
661
662 client_view->priv->complete = TRUE(!(0));
663
664 g_object_unref (client_view);
665 }
666}
667
668/* the user_data for the @cb is a GWeakRef with the @self */
669static void
670book_client_view_schedule_on_idle_simple (EBookClientView *self,
671 GSourceFunc cb)
672{
673 GSource *idle_source;
674 GMainContext *main_context;
675
676 main_context = book_client_view_ref_main_context (self);
677
678 idle_source = g_idle_source_new ();
679 g_source_set_callback (idle_source, cb, e_weak_ref_new (self), (GDestroyNotify) e_weak_ref_free);
680 g_source_attach (idle_source, main_context);
681 g_source_unref (idle_source);
682
683 g_main_context_unref (main_context);
684}
685
686static gboolean
687book_client_view_emit_content_changed_idle_cb (gpointer user_data)
688{
689 GWeakRef *weak_ref = user_data;
690 EBookClientView *self;
691
692 self = g_weak_ref_get (weak_ref);
693
694 if (self) {
695 g_signal_emit (self, signals[CONTENT_CHANGED], 0, NULL((void*)0));
696 g_object_unref (self);
697 }
698
699 return FALSE(0);
700}
701
702static void
703book_client_view_content_changed_cb (EDBusAddressBookView *object,
704 gpointer user_data)
705{
706 EBookClientView *self = user_data;
707
708 g_return_if_fail (E_IS_BOOK_CLIENT_VIEW (self))do { if ((__builtin_expect (__extension__ ({ int _g_boolean_var_41
= 0; if ((((__extension__ ({ GTypeInstance *__inst = (GTypeInstance
*) ((self)); GType __t = ((e_book_client_view_get_type ())); gboolean
__r; if (!__inst) __r = (0); else if (__inst->g_class &&
__inst->g_class->g_type == __t) __r = (!(0)); else __r
= g_type_check_instance_is_a (__inst, __t); __r; }))))) _g_boolean_var_41
= 1; _g_boolean_var_41; }), 1))) { } else { g_return_if_fail_warning
("libebook", ((const char*) (__func__)), "E_IS_BOOK_CLIENT_VIEW (self)"
); return; } } while (0)
;
709
710 book_client_view_schedule_on_idle_simple (self, book_client_view_emit_content_changed_idle_cb);
711}
712
713static gboolean
714book_client_view_notify_n_total_idle_cb (gpointer user_data)
715{
716 GWeakRef *weak_ref = user_data;
717 EBookClientView *self;
718
719 self = g_weak_ref_get (weak_ref);
720
721 if (self) {
722 g_object_notify_by_pspec (G_OBJECT (self)((((GObject*) (void *) ((self))))), properties[PROP_N_TOTAL]);
723 g_object_unref (self);
724 }
725
726 return FALSE(0);
727}
728
729static void
730book_client_view_notify_n_total_cb (EDBusAddressBookView *object,
731 GParamSpec *param,
732 gpointer user_data)
733{
734 EBookClientView *self = user_data;
735
736 g_return_if_fail (E_IS_BOOK_CLIENT_VIEW (self))do { if ((__builtin_expect (__extension__ ({ int _g_boolean_var_42
= 0; if ((((__extension__ ({ GTypeInstance *__inst = (GTypeInstance
*) ((self)); GType __t = ((e_book_client_view_get_type ())); gboolean
__r; if (!__inst) __r = (0); else if (__inst->g_class &&
__inst->g_class->g_type == __t) __r = (!(0)); else __r
= g_type_check_instance_is_a (__inst, __t); __r; }))))) _g_boolean_var_42
= 1; _g_boolean_var_42; }), 1))) { } else { g_return_if_fail_warning
("libebook", ((const char*) (__func__)), "E_IS_BOOK_CLIENT_VIEW (self)"
); return; } } while (0)
;
737
738 book_client_view_schedule_on_idle_simple (self, book_client_view_notify_n_total_idle_cb);
739}
740
741static gboolean
742book_client_view_notify_indices_idle_cb (gpointer user_data)
743{
744 GWeakRef *weak_ref = user_data;
745 EBookClientView *self;
746
747 self = g_weak_ref_get (weak_ref);
748
749 if (self) {
750 g_object_notify_by_pspec (G_OBJECT (self)((((GObject*) (void *) ((self))))), properties[PROP_INDICES]);
751 g_object_unref (self);
752 }
753
754 return FALSE(0);
755}
756
757static void
758book_client_view_notify_indices_cb (EDBusAddressBookView *object,
759 GParamSpec *param,
760 gpointer user_data)
761{
762 EBookClientView *self = user_data;
763
764 g_return_if_fail (E_IS_BOOK_CLIENT_VIEW (self))do { if ((__builtin_expect (__extension__ ({ int _g_boolean_var_43
= 0; if ((((__extension__ ({ GTypeInstance *__inst = (GTypeInstance
*) ((self)); GType __t = ((e_book_client_view_get_type ())); gboolean
__r; if (!__inst) __r = (0); else if (__inst->g_class &&
__inst->g_class->g_type == __t) __r = (!(0)); else __r
= g_type_check_instance_is_a (__inst, __t); __r; }))))) _g_boolean_var_43
= 1; _g_boolean_var_43; }), 1))) { } else { g_return_if_fail_warning
("libebook", ((const char*) (__func__)), "E_IS_BOOK_CLIENT_VIEW (self)"
); return; } } while (0)
;
765
766 book_client_view_schedule_on_idle_simple (self, book_client_view_notify_indices_idle_cb);
767}
768
769static void
770book_client_view_set_client (EBookClientView *client_view,
771 EBookClient *client)
772{
773 g_return_if_fail (E_IS_BOOK_CLIENT (client))do { if ((__builtin_expect (__extension__ ({ int _g_boolean_var_44
= 0; if ((((__extension__ ({ GTypeInstance *__inst = (GTypeInstance
*) ((client)); GType __t = ((e_book_client_get_type ())); gboolean
__r; if (!__inst) __r = (0); else if (__inst->g_class &&
__inst->g_class->g_type == __t) __r = (!(0)); else __r
= g_type_check_instance_is_a (__inst, __t); __r; }))))) _g_boolean_var_44
= 1; _g_boolean_var_44; }), 1))) { } else { g_return_if_fail_warning
("libebook", ((const char*) (__func__)), "E_IS_BOOK_CLIENT (client)"
); return; } } while (0)
;
774 g_return_if_fail (client_view->priv->client == NULL)do { if ((__builtin_expect (__extension__ ({ int _g_boolean_var_45
= 0; if (client_view->priv->client == ((void*)0)) _g_boolean_var_45
= 1; _g_boolean_var_45; }), 1))) { } else { g_return_if_fail_warning
("libebook", ((const char*) (__func__)), "client_view->priv->client == NULL"
); return; } } while (0)
;
775
776 client_view->priv->client = g_object_ref (client)((__typeof__ (client)) (g_object_ref) (client));
777}
778
779static void
780book_client_view_set_connection (EBookClientView *client_view,
781 GDBusConnection *connection)
782{
783 g_return_if_fail (G_IS_DBUS_CONNECTION (connection))do { if ((__builtin_expect (__extension__ ({ int _g_boolean_var_46
= 0; if ((((__extension__ ({ GTypeInstance *__inst = (GTypeInstance
*) ((connection)); GType __t = ((g_dbus_connection_get_type (
))); gboolean __r; if (!__inst) __r = (0); else if (__inst->
g_class && __inst->g_class->g_type == __t) __r =
(!(0)); else __r = g_type_check_instance_is_a (__inst, __t);
__r; }))))) _g_boolean_var_46 = 1; _g_boolean_var_46; }), 1)
)) { } else { g_return_if_fail_warning ("libebook", ((const char
*) (__func__)), "G_IS_DBUS_CONNECTION (connection)"); return;
} } while (0)
;
784 g_return_if_fail (client_view->priv->connection == NULL)do { if ((__builtin_expect (__extension__ ({ int _g_boolean_var_47
= 0; if (client_view->priv->connection == ((void*)0)) _g_boolean_var_47
= 1; _g_boolean_var_47; }), 1))) { } else { g_return_if_fail_warning
("libebook", ((const char*) (__func__)), "client_view->priv->connection == NULL"
); return; } } while (0)
;
785
786 client_view->priv->connection = g_object_ref (connection)((__typeof__ (connection)) (g_object_ref) (connection));
787}
788
789static void
790book_client_view_set_direct_backend (EBookClientView *client_view,
791 EBookBackend *backend)
792{
793 if (backend == NULL((void*)0))
794 return;
795
796 g_return_if_fail (E_IS_BOOK_BACKEND (backend))do { if ((__builtin_expect (__extension__ ({ int _g_boolean_var_48
= 0; if ((((__extension__ ({ GTypeInstance *__inst = (GTypeInstance
*) ((backend)); GType __t = ((e_book_backend_get_type ())); gboolean
__r; if (!__inst) __r = (0); else if (__inst->g_class &&
__inst->g_class->g_type == __t) __r = (!(0)); else __r
= g_type_check_instance_is_a (__inst, __t); __r; }))))) _g_boolean_var_48
= 1; _g_boolean_var_48; }), 1))) { } else { g_return_if_fail_warning
("libebook", ((const char*) (__func__)), "E_IS_BOOK_BACKEND (backend)"
); return; } } while (0)
;
797 g_return_if_fail (client_view->priv->direct_backend == NULL)do { if ((__builtin_expect (__extension__ ({ int _g_boolean_var_49
= 0; if (client_view->priv->direct_backend == ((void*)
0)) _g_boolean_var_49 = 1; _g_boolean_var_49; }), 1))) { } else
{ g_return_if_fail_warning ("libebook", ((const char*) (__func__
)), "client_view->priv->direct_backend == NULL"); return
; } } while (0)
;
798
799 client_view->priv->direct_backend = g_object_ref (backend)((__typeof__ (backend)) (g_object_ref) (backend));
800}
801
802static void
803book_client_view_set_object_path (EBookClientView *client_view,
804 const gchar *object_path)
805{
806 g_return_if_fail (object_path != NULL)do { if ((__builtin_expect (__extension__ ({ int _g_boolean_var_50
= 0; if (object_path != ((void*)0)) _g_boolean_var_50 = 1; _g_boolean_var_50
; }), 1))) { } else { g_return_if_fail_warning ("libebook", (
(const char*) (__func__)), "object_path != NULL"); return; } }
while (0)
;
807 g_return_if_fail (client_view->priv->object_path == NULL)do { if ((__builtin_expect (__extension__ ({ int _g_boolean_var_51
= 0; if (client_view->priv->object_path == ((void*)0))
_g_boolean_var_51 = 1; _g_boolean_var_51; }), 1))) { } else {
g_return_if_fail_warning ("libebook", ((const char*) (__func__
)), "client_view->priv->object_path == NULL"); return; }
} while (0)
;
808
809 client_view->priv->object_path = g_strdup (object_path)g_strdup_inline (object_path);
810}
811
812static void
813book_client_view_set_property (GObject *object,
814 guint property_id,
815 const GValue *value,
816 GParamSpec *pspec)
817{
818 switch (property_id) {
819 case PROP_CLIENT:
820 book_client_view_set_client (
821 E_BOOK_CLIENT_VIEW (object)((((EBookClientView*) (void *) ((object))))),
822 g_value_get_object (value));
823 return;
824
825 case PROP_CONNECTION:
826 book_client_view_set_connection (
827 E_BOOK_CLIENT_VIEW (object)((((EBookClientView*) (void *) ((object))))),
828 g_value_get_object (value));
829 return;
830
831 case PROP_DIRECT_BACKEND:
832 book_client_view_set_direct_backend (
833 E_BOOK_CLIENT_VIEW (object)((((EBookClientView*) (void *) ((object))))),
834 g_value_get_object (value));
835 return;
836
837 case PROP_OBJECT_PATH:
838 book_client_view_set_object_path (
839 E_BOOK_CLIENT_VIEW (object)((((EBookClientView*) (void *) ((object))))),
840 g_value_get_string (value));
841 return;
842 }
843
844 G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec)do { GObject *_glib__object = (GObject*) ((object)); GParamSpec
*_glib__pspec = (GParamSpec*) ((pspec)); guint _glib__property_id
= ((property_id)); g_warning ("%s:%d: invalid %s id %u for \"%s\" of type '%s' in '%s'"
, "/builds/GNOME/evolution-data-server/src/addressbook/libebook/e-book-client-view.c"
, 844, ("property"), _glib__property_id, _glib__pspec->name
, g_type_name ((((((GTypeClass*) (((GTypeInstance*) (_glib__pspec
))->g_class))->g_type)))), (g_type_name ((((((GTypeClass
*) (((GTypeInstance*) (_glib__object))->g_class))->g_type
)))))); } while (0)
;
845}
846
847static void
848book_client_view_get_property (GObject *object,
849 guint property_id,
850 GValue *value,
851 GParamSpec *pspec)
852{
853 switch (property_id) {
1
Control jumps to 'case PROP_INDICES:' at line 882
854 case PROP_CLIENT:
855 g_value_take_object (
856 value,
857 e_book_client_view_ref_client (
858 E_BOOK_CLIENT_VIEW (object)((((EBookClientView*) (void *) ((object)))))));
859 return;
860
861 case PROP_CONNECTION:
862 g_value_set_object (
863 value,
864 e_book_client_view_get_connection (
865 E_BOOK_CLIENT_VIEW (object)((((EBookClientView*) (void *) ((object)))))));
866 return;
867
868 case PROP_OBJECT_PATH:
869 g_value_set_string (
870 value,
871 e_book_client_view_get_object_path (
872 E_BOOK_CLIENT_VIEW (object)((((EBookClientView*) (void *) ((object)))))));
873 return;
874
875 case PROP_N_TOTAL:
876 g_value_set_uint (
877 value,
878 e_book_client_view_get_n_total (
879 E_BOOK_CLIENT_VIEW (object)((((EBookClientView*) (void *) ((object)))))));
880 return;
881
882 case PROP_INDICES:
883 g_value_take_boxed (
884 value,
885 e_book_client_view_dup_indices (
2
Calling 'e_book_client_view_dup_indices'
15
Returned allocated memory
886 E_BOOK_CLIENT_VIEW (object)((((EBookClientView*) (void *) ((object)))))));
887 return;
16
Potential memory leak
888 }
889
890 G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec)do { GObject *_glib__object = (GObject*) ((object)); GParamSpec
*_glib__pspec = (GParamSpec*) ((pspec)); guint _glib__property_id
= ((property_id)); g_warning ("%s:%d: invalid %s id %u for \"%s\" of type '%s' in '%s'"
, "/builds/GNOME/evolution-data-server/src/addressbook/libebook/e-book-client-view.c"
, 890, ("property"), _glib__property_id, _glib__pspec->name
, g_type_name ((((((GTypeClass*) (((GTypeInstance*) (_glib__pspec
))->g_class))->g_type)))), (g_type_name ((((((GTypeClass
*) (((GTypeInstance*) (_glib__object))->g_class))->g_type
)))))); } while (0)
;
891}
892
893static void
894book_client_view_dispose (GObject *object)
895{
896 EBookClientViewPrivate *priv;
897
898 priv = E_BOOK_CLIENT_VIEW (object)((((EBookClientView*) (void *) ((object)))))->priv;
899
900 g_clear_object (&priv->client)do { _Static_assert (sizeof *((&priv->client)) == sizeof
(gpointer), "Expression evaluates to false"); __typeof__ (((
&priv->client))) _pp = ((&priv->client)); __typeof__
(*((&priv->client))) _ptr = *_pp; *_pp = ((void*)0); if
(_ptr) (g_object_unref) (_ptr); } while (0)
;
901 g_clear_object (&priv->connection)do { _Static_assert (sizeof *((&priv->connection)) == sizeof
(gpointer), "Expression evaluates to false"); __typeof__ (((
&priv->connection))) _pp = ((&priv->connection)
); __typeof__ (*((&priv->connection))) _ptr = *_pp; *_pp
= ((void*)0); if (_ptr) (g_object_unref) (_ptr); } while (0)
;
902 g_clear_pointer (&priv->main_context, g_main_context_unref)do { _Static_assert (sizeof *(&priv->main_context) == sizeof
(gpointer), "Expression evaluates to false"); __typeof__ ((&
priv->main_context)) _pp = (&priv->main_context); __typeof__
(*(&priv->main_context)) _ptr = *_pp; *_pp = ((void*)
0); if (_ptr) (g_main_context_unref) (_ptr); } while (0)
;
903 g_clear_object (&priv->direct_backend)do { _Static_assert (sizeof *((&priv->direct_backend))
== sizeof (gpointer), "Expression evaluates to false"); __typeof__
(((&priv->direct_backend))) _pp = ((&priv->direct_backend
)); __typeof__ (*((&priv->direct_backend))) _ptr = *_pp
; *_pp = ((void*)0); if (_ptr) (g_object_unref) (_ptr); } while
(0)
;
904
905 if (priv->dbus_proxy != NULL((void*)0)) {
906 g_signal_handler_disconnect (
907 priv->dbus_proxy,
908 priv->objects_added_handler_id);
909 g_signal_handler_disconnect (
910 priv->dbus_proxy,
911 priv->objects_modified_handler_id);
912 g_signal_handler_disconnect (
913 priv->dbus_proxy,
914 priv->objects_removed_handler_id);
915 g_signal_handler_disconnect (
916 priv->dbus_proxy,
917 priv->progress_handler_id);
918 g_signal_handler_disconnect (
919 priv->dbus_proxy,
920 priv->complete_handler_id);
921 g_signal_handler_disconnect (
922 priv->dbus_proxy,
923 priv->content_changed_handler_id);
924 g_signal_handler_disconnect (
925 priv->dbus_proxy,
926 priv->notify_n_total_handler_id);
927 g_signal_handler_disconnect (
928 priv->dbus_proxy,
929 priv->notify_indices_handler_id);
930
931 /* Call D-Bus dispose() asynchronously so we don't block this dispose().
932 * Also omit a callback function, so the GDBusMessage
933 * uses G_DBUS_MESSAGE_FLAGS_NO_REPLY_EXPECTED.
934 */
935 e_dbus_address_book_view_call_dispose (priv->dbus_proxy, G_DBUS_CALL_FLAGS_NONE, -1, NULL((void*)0), NULL((void*)0), NULL((void*)0));
936 g_object_unref (priv->dbus_proxy);
937 priv->dbus_proxy = NULL((void*)0);
938 }
939
940 /* Chain up to parent's dispose() method. */
941 G_OBJECT_CLASS (e_book_client_view_parent_class)((((GObjectClass*) (void *) ((e_book_client_view_parent_class
)))))
->dispose (object);
942}
943
944static void
945book_client_view_finalize (GObject *object)
946{
947 EBookClientViewPrivate *priv;
948
949 priv = E_BOOK_CLIENT_VIEW (object)((((EBookClientView*) (void *) ((object)))))->priv;
950
951 g_free (priv->object_path);
952
953 g_mutex_clear (&priv->main_context_lock);
954 g_clear_object (&priv->client)do { _Static_assert (sizeof *((&priv->client)) == sizeof
(gpointer), "Expression evaluates to false"); __typeof__ (((
&priv->client))) _pp = ((&priv->client)); __typeof__
(*((&priv->client))) _ptr = *_pp; *_pp = ((void*)0); if
(_ptr) (g_object_unref) (_ptr); } while (0)
;
955
956 /* Chain up to parent's finalize() method. */
957 G_OBJECT_CLASS (e_book_client_view_parent_class)((((GObjectClass*) (void *) ((e_book_client_view_parent_class
)))))
->finalize (object);
958}
959
960static gboolean
961book_client_view_initable_init (GInitable *initable,
962 GCancellable *cancellable,
963 GError **error)
964{
965 EBookClient *book_client;
966 EBookClientViewPrivate *priv;
967 EDBusAddressBookView *dbus_bookview;
968 gulong handler_id;
969 gchar *bus_name;
970
971 priv = E_BOOK_CLIENT_VIEW (initable)((((EBookClientView*) (void *) ((initable)))))->priv;
972
973 book_client = priv->client ? g_object_ref (priv->client)((__typeof__ (priv->client)) (g_object_ref) (priv->client
))
: NULL((void*)0);
974 if (book_client == NULL((void*)0)) {
975 g_set_error (
976 error, E_CLIENT_ERRORe_client_error_quark (),
977 E_CLIENT_ERROR_OTHER_ERROR,
978 _("Client disappeared")((char *) g_dgettext ("evolution-data-server", "Client disappeared"
))
);
979
980 return FALSE(0);
981 }
982
983 bus_name = e_client_dup_bus_name (E_CLIENT (book_client)((((EClient*) (void *) ((book_client))))));
984 g_object_unref (book_client);
985
986 dbus_bookview = e_dbus_address_book_view_proxy_new_sync (
987 priv->connection,
988 G_DBUS_PROXY_FLAGS_NONE,
989 bus_name,
990 priv->object_path,
991 cancellable, error);
992
993 g_free (bus_name);
994
995 if (dbus_bookview == NULL((void*)0))
996 return FALSE(0);
997
998 priv->dbus_proxy = dbus_bookview;
999
1000 handler_id = g_signal_connect_data (
1001 priv->dbus_proxy, "objects-added",
1002 G_CALLBACK (book_client_view_objects_added_cb)((GCallback) (book_client_view_objects_added_cb)),
1003 e_weak_ref_new (initable),
1004 (GClosureNotify) e_weak_ref_free, 0);
1005 priv->objects_added_handler_id = handler_id;
1006
1007 handler_id = g_signal_connect_data (
1008 priv->dbus_proxy, "objects-modified",
1009 G_CALLBACK (book_client_view_objects_modified_cb)((GCallback) (book_client_view_objects_modified_cb)),
1010 e_weak_ref_new (initable),
1011 (GClosureNotify) e_weak_ref_free, 0);
1012 priv->objects_modified_handler_id = handler_id;
1013
1014 handler_id = g_signal_connect_data (
1015 priv->dbus_proxy, "objects-removed",
1016 G_CALLBACK (book_client_view_objects_removed_cb)((GCallback) (book_client_view_objects_removed_cb)),
1017 e_weak_ref_new (initable),
1018 (GClosureNotify) e_weak_ref_free, 0);
1019 priv->objects_removed_handler_id = handler_id;
1020
1021 handler_id = g_signal_connect_data (
1022 priv->dbus_proxy, "progress",
1023 G_CALLBACK (book_client_view_progress_cb)((GCallback) (book_client_view_progress_cb)),
1024 e_weak_ref_new (initable),
1025 (GClosureNotify) e_weak_ref_free, 0);
1026 priv->progress_handler_id = handler_id;
1027
1028 handler_id = g_signal_connect_data (
1029 priv->dbus_proxy, "complete",
1030 G_CALLBACK (book_client_view_complete_cb)((GCallback) (book_client_view_complete_cb)),
1031 e_weak_ref_new (initable),
1032 (GClosureNotify) e_weak_ref_free, 0);
1033 priv->complete_handler_id = handler_id;
1034
1035 handler_id = g_signal_connect_object (
1036 priv->dbus_proxy, "content-changed",
1037 G_CALLBACK (book_client_view_content_changed_cb)((GCallback) (book_client_view_content_changed_cb)),
1038 initable, 0);
1039 priv->content_changed_handler_id = handler_id;
1040
1041 handler_id = g_signal_connect_object (
1042 priv->dbus_proxy, "notify::n-total",
1043 G_CALLBACK (book_client_view_notify_n_total_cb)((GCallback) (book_client_view_notify_n_total_cb)),
1044 initable, 0);
1045 priv->notify_n_total_handler_id = handler_id;
1046
1047 handler_id = g_signal_connect_object (
1048 priv->dbus_proxy, "notify::indices",
1049 G_CALLBACK (book_client_view_notify_indices_cb)((GCallback) (book_client_view_notify_indices_cb)),
1050 initable, 0);
1051 priv->notify_indices_handler_id = handler_id;
1052
1053 /* When in direct read access mode, we add a special field
1054 * to fields-of-interest indicating we only want uids sent. */
1055 if (priv->direct_backend != NULL((void*)0))
1056 e_book_client_view_set_fields_of_interest (
1057 E_BOOK_CLIENT_VIEW (initable)((((EBookClientView*) (void *) ((initable))))), NULL((void*)0), NULL((void*)0));
1058
1059 return TRUE(!(0));
1060}
1061
1062static void
1063e_book_client_view_class_init (EBookClientViewClass *class)
1064{
1065 GObjectClass *object_class;
1066
1067 object_class = G_OBJECT_CLASS (class)((((GObjectClass*) (void *) ((class)))));
1068 object_class->set_property = book_client_view_set_property;
1069 object_class->get_property = book_client_view_get_property;
1070 object_class->dispose = book_client_view_dispose;
1071 object_class->finalize = book_client_view_finalize;
1072
1073 /**
1074 * EBookClientView:client
1075 *
1076 * The #EBookClient for the view
1077 **/
1078 properties[PROP_CLIENT] =
1079 g_param_spec_object (
1080 "client",
1081 NULL((void*)0), NULL((void*)0),
1082 E_TYPE_BOOK_CLIENT(e_book_client_get_type ()),
1083 G_PARAM_READWRITE |
1084 G_PARAM_CONSTRUCT_ONLY |
1085 G_PARAM_STATIC_STRINGS(G_PARAM_STATIC_NAME | G_PARAM_STATIC_NICK | G_PARAM_STATIC_BLURB
)
);
1086
1087 /**
1088 * EBookClientView:connection
1089 *
1090 * The #GDBusConnection used to create the D-Bus proxy
1091 **/
1092 properties[PROP_CONNECTION] =
1093 g_param_spec_object (
1094 "connection",
1095 NULL((void*)0), NULL((void*)0),
1096 G_TYPE_DBUS_CONNECTION(g_dbus_connection_get_type ()),
1097 G_PARAM_READWRITE |
1098 G_PARAM_CONSTRUCT_ONLY |
1099 G_PARAM_STATIC_STRINGS(G_PARAM_STATIC_NAME | G_PARAM_STATIC_NICK | G_PARAM_STATIC_BLURB
)
);
1100
1101 /**
1102 * EBookClientView:direct-backend
1103 *
1104 * The #EBookBackend to fetch contact data from, if direct read access is enabled
1105 **/
1106 properties[PROP_DIRECT_BACKEND] =
1107 g_param_spec_object (
1108 "direct-backend",
1109 NULL((void*)0), NULL((void*)0),
1110 E_TYPE_BOOK_BACKEND(e_book_backend_get_type ()),
1111 G_PARAM_WRITABLE |
1112 G_PARAM_CONSTRUCT_ONLY |
1113 G_PARAM_STATIC_STRINGS(G_PARAM_STATIC_NAME | G_PARAM_STATIC_NICK | G_PARAM_STATIC_BLURB
)
);
1114
1115 /**
1116 * EBookClientView:object-path
1117 *
1118 * The object path used to create the D-Bus proxy
1119 **/
1120 properties[PROP_OBJECT_PATH] =
1121 g_param_spec_string (
1122 "object-path",
1123 NULL((void*)0), NULL((void*)0),
1124 NULL((void*)0),
1125 G_PARAM_READWRITE |
1126 G_PARAM_CONSTRUCT_ONLY |
1127 G_PARAM_STATIC_STRINGS(G_PARAM_STATIC_NAME | G_PARAM_STATIC_NICK | G_PARAM_STATIC_BLURB
)
);
1128
1129 /**
1130 * EBookClientView:n-total:
1131 *
1132 * How many contacts are available in the view.
1133 *
1134 * Note: This property can be used only with @E_BOOK_CLIENT_VIEW_FLAGS_MANUAL_QUERY.
1135 *
1136 * Since: 3.50
1137 **/
1138 properties[PROP_N_TOTAL] =
1139 g_param_spec_uint (
1140 "n-total",
1141 NULL((void*)0), NULL((void*)0),
1142 0, G_MAXUINT(2147483647 *2U +1U), 0,
1143 G_PARAM_READABLE |
1144 G_PARAM_STATIC_STRINGS(G_PARAM_STATIC_NAME | G_PARAM_STATIC_NICK | G_PARAM_STATIC_BLURB
)
);
1145
1146 /**
1147 * EBookClientView:indices:
1148 *
1149 * A list of #EBookIndices holding indices of the contacts in the view.
1150 * These are received from the first sort field set by
1151 * e_book_client_view_set_sort_fields_sync(). The last item of the returned
1152 * array is the one with chr member being %NULL.
1153 *
1154 * Note: This property can be used only with @E_BOOK_CLIENT_VIEW_FLAGS_MANUAL_QUERY.
1155 *
1156 * Since: 3.50
1157 **/
1158 properties[PROP_INDICES] =
1159 g_param_spec_boxed (
1160 "indices",
1161 NULL((void*)0), NULL((void*)0),
1162 E_TYPE_BOOK_INDICES(e_book_indices_get_type ()),
1163 G_PARAM_READABLE |
1164 G_PARAM_STATIC_STRINGS(G_PARAM_STATIC_NAME | G_PARAM_STATIC_NICK | G_PARAM_STATIC_BLURB
)
);
1165
1166 g_object_class_install_properties (object_class, N_PROPS, properties);
1167
1168 /**
1169 * EBookClientView::objects-added:
1170 * @client_view: the #EBookClientView which emitted the signal
1171 * @objects: (type GSList) (transfer none) (element-type EContact): a #GSList
1172 * of added #EContact objects into the @client_view.
1173 */
1174 signals[OBJECTS_ADDED] = g_signal_new (
1175 "objects-added",
1176 G_OBJECT_CLASS_TYPE (object_class)((((GTypeClass*) (object_class))->g_type)),
1177 G_SIGNAL_RUN_LAST,
1178 G_STRUCT_OFFSET (EBookClientViewClass, objects_added)((glong) __builtin_offsetof(EBookClientViewClass, objects_added
))
,
1179 NULL((void*)0), NULL((void*)0), NULL((void*)0),
1180 G_TYPE_NONE((GType) ((1) << (2))), 1,
1181 G_TYPE_POINTER((GType) ((17) << (2))));
1182
1183 /**
1184 * EBookClientView::objects-modified:
1185 * @client_view: the #EBookClientView which emitted the signal
1186 * @objects: (type GSList) (transfer none) (element-type EContact): a #GSList
1187 * of modified #EContact objects within the @client_view
1188 */
1189 signals[OBJECTS_MODIFIED] = g_signal_new (
1190 "objects-modified",
1191 G_OBJECT_CLASS_TYPE (object_class)((((GTypeClass*) (object_class))->g_type)),
1192 G_SIGNAL_RUN_LAST,
1193 G_STRUCT_OFFSET (EBookClientViewClass, objects_modified)((glong) __builtin_offsetof(EBookClientViewClass, objects_modified
))
,
1194 NULL((void*)0), NULL((void*)0), NULL((void*)0),
1195 G_TYPE_NONE((GType) ((1) << (2))), 1,
1196 G_TYPE_POINTER((GType) ((17) << (2))));
1197
1198 /**
1199 * EBookClientView::objects-removed:
1200 * @client_view: the #EBookClientView which emitted the signal
1201 * @uids: (type GSList) (transfer none) (element-type utf8): a #GSList
1202 * of removed objects, described by their UID.
1203 */
1204 signals[OBJECTS_REMOVED] = g_signal_new (
1205 "objects-removed",
1206 G_OBJECT_CLASS_TYPE (object_class)((((GTypeClass*) (object_class))->g_type)),
1207 G_SIGNAL_RUN_LAST,
1208 G_STRUCT_OFFSET (EBookClientViewClass, objects_removed)((glong) __builtin_offsetof(EBookClientViewClass, objects_removed
))
,
1209 NULL((void*)0), NULL((void*)0), NULL((void*)0),
1210 G_TYPE_NONE((GType) ((1) << (2))), 1,
1211 G_TYPE_POINTER((GType) ((17) << (2))));
1212
1213 signals[PROGRESS] = g_signal_new (
1214 "progress",
1215 G_OBJECT_CLASS_TYPE (object_class)((((GTypeClass*) (object_class))->g_type)),
1216 G_SIGNAL_RUN_LAST,
1217 G_STRUCT_OFFSET (EBookClientViewClass, progress)((glong) __builtin_offsetof(EBookClientViewClass, progress)),
1218 NULL((void*)0), NULL((void*)0), NULL((void*)0),
1219 G_TYPE_NONE((GType) ((1) << (2))), 2,
1220 G_TYPE_UINT((GType) ((7) << (2))),
1221 G_TYPE_STRING((GType) ((16) << (2))));
1222
1223 signals[COMPLETE] = g_signal_new (
1224 "complete",
1225 G_OBJECT_CLASS_TYPE (object_class)((((GTypeClass*) (object_class))->g_type)),
1226 G_SIGNAL_RUN_LAST,
1227 G_STRUCT_OFFSET (EBookClientViewClass, complete)((glong) __builtin_offsetof(EBookClientViewClass, complete)),
1228 NULL((void*)0), NULL((void*)0), NULL((void*)0),
1229 G_TYPE_NONE((GType) ((1) << (2))), 1,
1230 G_TYPE_ERROR(g_error_get_type ()));
1231
1232 /**
1233 * EBookClientView::content-changed:
1234 * @client_view: the #EBookClientView which emitted the signal
1235 *
1236 * The signal is emitted whenever content of any contact in the @client_view changes,
1237 * or a contact is added or removed. It may or may not change @EBookClientView:n-total
1238 * property too.
1239 *
1240 * Note: This signal can be used only with @E_BOOK_CLIENT_VIEW_FLAGS_MANUAL_QUERY.
1241 *
1242 * Since: 3.50
1243 **/
1244 signals[CONTENT_CHANGED] = g_signal_new (
1245 "content-changed",
1246 G_OBJECT_CLASS_TYPE (object_class)((((GTypeClass*) (object_class))->g_type)),
1247 G_SIGNAL_RUN_LAST,
1248 0,
1249 NULL((void*)0), NULL((void*)0), g_cclosure_marshal_VOID__VOID,
1250 G_TYPE_NONE((GType) ((1) << (2))), 0,
1251 G_TYPE_NONE((GType) ((1) << (2))));
1252}
1253
1254static void
1255e_book_client_view_initable_init (GInitableIface *iface)
1256{
1257 iface->init = book_client_view_initable_init;
1258}
1259
1260static void
1261e_book_client_view_init (EBookClientView *client_view)
1262{
1263 client_view->priv = e_book_client_view_get_instance_private (client_view);
1264
1265 g_mutex_init (&client_view->priv->main_context_lock);
1266 client_view->priv->client = NULL((void*)0);
1267}
1268
1269/**
1270 * e_book_client_view_ref_client:
1271 * @client_view: an #EBookClientView
1272 *
1273 * Returns the #EBookClientView:client associated with @client_view.
1274 *
1275 * The returned #EBookClient is referenced for thread-safety. Unreference
1276 * the #EBookClient with g_object_unref() when finished with it.
1277 *
1278 * Returns: (transfer full) (type EBookClient): an #EBookClient
1279 *
1280 * Since: 3.10
1281 **/
1282EBookClient *
1283e_book_client_view_ref_client (EBookClientView *client_view)
1284{
1285 g_return_val_if_fail (E_IS_BOOK_CLIENT_VIEW (client_view), NULL)do { if ((__builtin_expect (__extension__ ({ int _g_boolean_var_52
= 0; if ((((__extension__ ({ GTypeInstance *__inst = (GTypeInstance
*) ((client_view)); GType __t = ((e_book_client_view_get_type
())); gboolean __r; if (!__inst) __r = (0); else if (__inst->
g_class && __inst->g_class->g_type == __t) __r =
(!(0)); else __r = g_type_check_instance_is_a (__inst, __t);
__r; }))))) _g_boolean_var_52 = 1; _g_boolean_var_52; }), 1)
)) { } else { g_return_if_fail_warning ("libebook", ((const char
*) (__func__)), "E_IS_BOOK_CLIENT_VIEW (client_view)"); return
(((void*)0)); } } while (0)
;
1286
1287 if (!client_view->priv->client)
1288 return NULL((void*)0);
1289
1290 return g_object_ref (client_view->priv->client)((__typeof__ (client_view->priv->client)) (g_object_ref
) (client_view->priv->client))
;
1291}
1292
1293/**
1294 * e_book_client_view_get_client:
1295 * @client_view: an #EBookClientView
1296 *
1297 * Returns the #EBookClientView:client associated with @client_view.
1298 *
1299 * Returns: (transfer none) (type EBookClient): an #EBookClient
1300 *
1301 * Deprecated: 3.10: Use e_book_client_view_ref_client() instead.
1302 **/
1303EBookClient *
1304e_book_client_view_get_client (EBookClientView *client_view)
1305{
1306 EBookClient *client;
1307
1308 g_return_val_if_fail (E_IS_BOOK_CLIENT_VIEW (client_view), NULL)do { if ((__builtin_expect (__extension__ ({ int _g_boolean_var_53
= 0; if ((((__extension__ ({ GTypeInstance *__inst = (GTypeInstance
*) ((client_view)); GType __t = ((e_book_client_view_get_type
())); gboolean __r; if (!__inst) __r = (0); else if (__inst->
g_class && __inst->g_class->g_type == __t) __r =
(!(0)); else __r = g_type_check_instance_is_a (__inst, __t);
__r; }))))) _g_boolean_var_53 = 1; _g_boolean_var_53; }), 1)
)) { } else { g_return_if_fail_warning ("libebook", ((const char
*) (__func__)), "E_IS_BOOK_CLIENT_VIEW (client_view)"); return
(((void*)0)); } } while (0)
;
1309
1310 client = e_book_client_view_ref_client (client_view);
1311
1312 /* XXX Drop the EBookClient reference for backward-compatibility.
1313 * This is risky. Without a reference, the EBookClient could
1314 * be finalized while the caller is still using it. */
1315 if (client != NULL((void*)0))
1316 g_object_unref (client);
1317
1318 return client;
1319}
1320
1321/**
1322 * e_book_client_view_get_connection:
1323 * @client_view: an #EBookClientView
1324 *
1325 * Returns the #GDBusConnection used to create the D-Bus proxy.
1326 *
1327 * Returns: (transfer none): the #GDBusConnection
1328 *
1329 * Since: 3.8
1330 **/
1331GDBusConnection *
1332e_book_client_view_get_connection (EBookClientView *client_view)
1333{
1334 g_return_val_if_fail (E_IS_BOOK_CLIENT_VIEW (client_view), NULL)do { if ((__builtin_expect (__extension__ ({ int _g_boolean_var_54
= 0; if ((((__extension__ ({ GTypeInstance *__inst = (GTypeInstance
*) ((client_view)); GType __t = ((e_book_client_view_get_type
())); gboolean __r; if (!__inst) __r = (0); else if (__inst->
g_class && __inst->g_class->g_type == __t) __r =
(!(0)); else __r = g_type_check_instance_is_a (__inst, __t);
__r; }))))) _g_boolean_var_54 = 1; _g_boolean_var_54; }), 1)
)) { } else { g_return_if_fail_warning ("libebook", ((const char
*) (__func__)), "E_IS_BOOK_CLIENT_VIEW (client_view)"); return
(((void*)0)); } } while (0)
;
1335
1336 return client_view->priv->connection;
1337}
1338
1339/**
1340 * e_book_client_view_get_object_path:
1341 * @client_view: an #EBookClientView
1342 *
1343 * Returns the object path used to create the D-Bus proxy.
1344 *
1345 * Returns: the object path
1346 *
1347 * Since: 3.8
1348 **/
1349const gchar *
1350e_book_client_view_get_object_path (EBookClientView *client_view)
1351{
1352 g_return_val_if_fail (E_IS_BOOK_CLIENT_VIEW (client_view), NULL)do { if ((__builtin_expect (__extension__ ({ int _g_boolean_var_55
= 0; if ((((__extension__ ({ GTypeInstance *__inst = (GTypeInstance
*) ((client_view)); GType __t = ((e_book_client_view_get_type
())); gboolean __r; if (!__inst) __r = (0); else if (__inst->
g_class && __inst->g_class->g_type == __t) __r =
(!(0)); else __r = g_type_check_instance_is_a (__inst, __t);
__r; }))))) _g_boolean_var_55 = 1; _g_boolean_var_55; }), 1)
)) { } else { g_return_if_fail_warning ("libebook", ((const char
*) (__func__)), "E_IS_BOOK_CLIENT_VIEW (client_view)"); return
(((void*)0)); } } while (0)
;
1353
1354 return client_view->priv->object_path;
1355}
1356
1357/**
1358 * e_book_client_view_start:
1359 * @client_view: an #EBookClientView
1360 * @error: return location for a #GError, or %NULL
1361 *
1362 * Tells @client_view to start processing events.
1363 */
1364void
1365e_book_client_view_start (EBookClientView *client_view,
1366 GError **error)
1367{
1368 GMainContext *main_context;
1369 GError *local_error = NULL((void*)0);
1370
1371 g_return_if_fail (E_IS_BOOK_CLIENT_VIEW (client_view))do { if ((__builtin_expect (__extension__ ({ int _g_boolean_var_56
= 0; if ((((__extension__ ({ GTypeInstance *__inst = (GTypeInstance
*) ((client_view)); GType __t = ((e_book_client_view_get_type
())); gboolean __r; if (!__inst) __r = (0); else if (__inst->
g_class && __inst->g_class->g_type == __t) __r =
(!(0)); else __r = g_type_check_instance_is_a (__inst, __t);
__r; }))))) _g_boolean_var_56 = 1; _g_boolean_var_56; }), 1)
)) { } else { g_return_if_fail_warning ("libebook", ((const char
*) (__func__)), "E_IS_BOOK_CLIENT_VIEW (client_view)"); return
; } } while (0)
;
1372
1373 /* Emit signals from the current thread-default main context. */
1374 main_context = g_main_context_ref_thread_default ();
1375 book_client_view_set_main_context (client_view, main_context);
1376 g_main_context_unref (main_context);
1377
1378 client_view->priv->running = TRUE(!(0));
1379
1380 e_dbus_address_book_view_call_start_sync (
1381 client_view->priv->dbus_proxy, G_DBUS_CALL_FLAGS_NONE, -1, NULL((void*)0), &local_error);
1382
1383 if (local_error != NULL((void*)0)) {
1384 client_view->priv->running = FALSE(0);
1385 g_dbus_error_strip_remote_error (local_error);
1386 g_propagate_error (error, local_error);
1387 }
1388}
1389
1390/**
1391 * e_book_client_view_stop:
1392 * @client_view: an #EBookClientView
1393 * @error: return location for a #GError, or %NULL
1394 *
1395 * Tells @client_view to stop processing events.
1396 **/
1397void
1398e_book_client_view_stop (EBookClientView *client_view,
1399 GError **error)
1400{
1401 GError *local_error = NULL((void*)0);
1402
1403 g_return_if_fail (E_IS_BOOK_CLIENT_VIEW (client_view))do { if ((__builtin_expect (__extension__ ({ int _g_boolean_var_57
= 0; if ((((__extension__ ({ GTypeInstance *__inst = (GTypeInstance
*) ((client_view)); GType __t = ((e_book_client_view_get_type
())); gboolean __r; if (!__inst) __r = (0); else if (__inst->
g_class && __inst->g_class->g_type == __t) __r =
(!(0)); else __r = g_type_check_instance_is_a (__inst, __t);
__r; }))))) _g_boolean_var_57 = 1; _g_boolean_var_57; }), 1)
)) { } else { g_return_if_fail_warning ("libebook", ((const char
*) (__func__)), "E_IS_BOOK_CLIENT_VIEW (client_view)"); return
; } } while (0)
;
1404
1405 client_view->priv->running = FALSE(0);
1406
1407 e_dbus_address_book_view_call_stop_sync (
1408 client_view->priv->dbus_proxy, G_DBUS_CALL_FLAGS_NONE, -1, NULL((void*)0), &local_error);
1409
1410 if (local_error != NULL((void*)0)) {
1411 g_dbus_error_strip_remote_error (local_error);
1412 g_propagate_error (error, local_error);
1413 }
1414}
1415
1416/**
1417 * e_book_client_view_set_flags:
1418 * @client_view: an #EBookClientView
1419 * @flags: the #EBookClientViewFlags for @client_view
1420 * @error: return location for a #GError, or %NULL
1421 *
1422 * Sets the @flags which control the behaviour of @client_view.
1423 *
1424 * Since: 3.4
1425 */
1426void
1427e_book_client_view_set_flags (EBookClientView *client_view,
1428 EBookClientViewFlags flags,
1429 GError **error)
1430{
1431 GError *local_error = NULL((void*)0);
1432
1433 g_return_if_fail (E_IS_BOOK_CLIENT_VIEW (client_view))do { if ((__builtin_expect (__extension__ ({ int _g_boolean_var_58
= 0; if ((((__extension__ ({ GTypeInstance *__inst = (GTypeInstance
*) ((client_view)); GType __t = ((e_book_client_view_get_type
())); gboolean __r; if (!__inst) __r = (0); else if (__inst->
g_class && __inst->g_class->g_type == __t) __r =
(!(0)); else __r = g_type_check_instance_is_a (__inst, __t);
__r; }))))) _g_boolean_var_58 = 1; _g_boolean_var_58; }), 1)
)) { } else { g_return_if_fail_warning ("libebook", ((const char
*) (__func__)), "E_IS_BOOK_CLIENT_VIEW (client_view)"); return
; } } while (0)
;
1434
1435 e_dbus_address_book_view_call_set_flags_sync (
1436 client_view->priv->dbus_proxy, flags, G_DBUS_CALL_FLAGS_NONE, -1, NULL((void*)0), &local_error);
1437
1438 if (local_error != NULL((void*)0)) {
1439 g_dbus_error_strip_remote_error (local_error);
1440 g_propagate_error (error, local_error);
1441 }
1442}
1443
1444/**
1445 * e_book_client_view_set_fields_of_interest:
1446 * @client_view: an #EBookClientView
1447 * @fields_of_interest: (element-type utf8): List of field names in which
1448 * the client is interested
1449 * @error: return location for a #GError, or %NULL
1450 *
1451 * Client can instruct server to which fields it is interested in only, thus
1452 * the server can return less data over the wire. The server can still return
1453 * complete objects, this is just a hint to it that the listed fields will
1454 * be used only. The UID field is returned always. Initial views has no fields
1455 * of interest and using %NULL for @fields_of_interest will unset any previous
1456 * changes.
1457 *
1458 * Some backends can use summary information of its cache to create artifical
1459 * objects, which will omit stored object parsing. If this cannot be done then
1460 * it will simply return object as is stored in the cache.
1461 **/
1462void
1463e_book_client_view_set_fields_of_interest (EBookClientView *client_view,
1464 const GSList *fields_of_interest,
1465 GError **error)
1466{
1467 gchar **strv;
1468 GError *local_error = NULL((void*)0);
1469
1470 g_return_if_fail (E_IS_BOOK_CLIENT_VIEW (client_view))do { if ((__builtin_expect (__extension__ ({ int _g_boolean_var_59
= 0; if ((((__extension__ ({ GTypeInstance *__inst = (GTypeInstance
*) ((client_view)); GType __t = ((e_book_client_view_get_type
())); gboolean __r; if (!__inst) __r = (0); else if (__inst->
g_class && __inst->g_class->g_type == __t) __r =
(!(0)); else __r = g_type_check_instance_is_a (__inst, __t);
__r; }))))) _g_boolean_var_59 = 1; _g_boolean_var_59; }), 1)
)) { } else { g_return_if_fail_warning ("libebook", ((const char
*) (__func__)), "E_IS_BOOK_CLIENT_VIEW (client_view)"); return
; } } while (0)
;
1471
1472 /* When in direct read access mode, ensure that the
1473 * backend is configured to only send us UIDs for everything,
1474 *
1475 * Just ignore the fields_of_interest and use them locally
1476 * when filtering cards to be returned in direct reads. */
1477 if (client_view->priv->direct_backend != NULL((void*)0)) {
1478 GSList uid_field = { 0, };
1479
1480 uid_field.data = (gpointer)"x-evolution-uids-only";
1481 strv = e_client_util_slist_to_strv (&uid_field);
1482 } else
1483 strv = e_client_util_slist_to_strv (fields_of_interest);
1484
1485 e_dbus_address_book_view_call_set_fields_of_interest_sync (
1486 client_view->priv->dbus_proxy,
1487 (const gchar * const *) strv,
1488 G_DBUS_CALL_FLAGS_NONE, -1, NULL((void*)0), &local_error);
1489 g_strfreev (strv);
1490
1491 if (local_error != NULL((void*)0)) {
1492 g_dbus_error_strip_remote_error (local_error);
1493 g_propagate_error (error, local_error);
1494 }
1495}
1496
1497/**
1498 * e_book_client_view_set_sort_fields_sync:
1499 * @self: an #EBookClientView
1500 * @fields: an array of #EBookClientViewSortFields, terminated by item with %E_CONTACT_FIELD_LAST field
1501 * @cancellable: optional #GCancellable object, or %NULL
1502 * @error: return location for a #GError, or %NULL
1503 *
1504 * Sets @fields to sort the view by. The default is to sort by the file-as
1505 * field in ascending order. Not every field can be used for sorting,
1506 * usually available fields are %E_CONTACT_FILE_AS,
1507 * %E_CONTACT_GIVEN_NAME and %E_CONTACT_FAMILY_NAME.
1508 *
1509 * The array is terminated by an item with an %E_CONTACT_FIELD_LAST field.
1510 *
1511 * The first sort field is used to populate indices, as returned
1512 * by e_book_client_view_dup_indices().
1513 *
1514 * Note: This function can be used only with @E_BOOK_CLIENT_VIEW_FLAGS_MANUAL_QUERY.
1515 *
1516 * Returns: whether succeeded
1517 *
1518 * Since: 3.50
1519 **/
1520gboolean
1521e_book_client_view_set_sort_fields_sync (EBookClientView *self,
1522 const EBookClientViewSortFields *fields,
1523 GCancellable *cancellable,
1524 GError **error)
1525{
1526 GVariantBuilder builder;
1527 guint ii;
1528
1529 g_return_val_if_fail (E_IS_BOOK_CLIENT_VIEW (self), FALSE)do { if ((__builtin_expect (__extension__ ({ int _g_boolean_var_60
= 0; if ((((__extension__ ({ GTypeInstance *__inst = (GTypeInstance
*) ((self)); GType __t = ((e_book_client_view_get_type ())); gboolean
__r; if (!__inst) __r = (0); else if (__inst->g_class &&
__inst->g_class->g_type == __t) __r = (!(0)); else __r
= g_type_check_instance_is_a (__inst, __t); __r; }))))) _g_boolean_var_60
= 1; _g_boolean_var_60; }), 1))) { } else { g_return_if_fail_warning
("libebook", ((const char*) (__func__)), "E_IS_BOOK_CLIENT_VIEW (self)"
); return ((0)); } } while (0)
;
1530 g_return_val_if_fail (fields != NULL, FALSE)do { if ((__builtin_expect (__extension__ ({ int _g_boolean_var_61
= 0; if (fields != ((void*)0)) _g_boolean_var_61 = 1; _g_boolean_var_61
; }), 1))) { } else { g_return_if_fail_warning ("libebook", (
(const char*) (__func__)), "fields != NULL"); return ((0)); }
} while (0)
;
1531
1532 g_variant_builder_init (&builder, G_VARIANT_TYPE ("a(uu)")(g_variant_type_checked_ (("a(uu)"))));
1533
1534 for (ii = 0; fields[ii].field != E_CONTACT_FIELD_LAST; ii++) {
1535 g_variant_builder_add (&builder, "(uu)", fields[ii].field, fields[ii].sort_type);
1536 }
1537
1538 return e_dbus_address_book_view_call_set_sort_fields_sync (self->priv->dbus_proxy,
1539 g_variant_builder_end (&builder), G_DBUS_CALL_FLAGS_NONE, -1, cancellable, error);
1540}
1541
1542/**
1543 * e_book_client_view_get_id:
1544 * @self: an #EBookClientView
1545 *
1546 * Returns an identifier of the @self. It does not change
1547 * for the whole life time of the @self.
1548 *
1549 * Note: This function can be used only with @E_BOOK_CLIENT_VIEW_FLAGS_MANUAL_QUERY.
1550 *
1551 * Returns: an identifier of the view
1552 *
1553 * Since: 3.50
1554 **/
1555gsize
1556e_book_client_view_get_id (EBookClientView *self)
1557{
1558 g_return_val_if_fail (E_IS_BOOK_CLIENT_VIEW (self), 0)do { if ((__builtin_expect (__extension__ ({ int _g_boolean_var_62
= 0; if ((((__extension__ ({ GTypeInstance *__inst = (GTypeInstance
*) ((self)); GType __t = ((e_book_client_view_get_type ())); gboolean
__r; if (!__inst) __r = (0); else if (__inst->g_class &&
__inst->g_class->g_type == __t) __r = (!(0)); else __r
= g_type_check_instance_is_a (__inst, __t); __r; }))))) _g_boolean_var_62
= 1; _g_boolean_var_62; }), 1))) { } else { g_return_if_fail_warning
("libebook", ((const char*) (__func__)), "E_IS_BOOK_CLIENT_VIEW (self)"
); return (0); } } while (0)
;
1559
1560 return (gsize) e_dbus_address_book_view_get_id (self->priv->dbus_proxy);
1561}
1562
1563/**
1564 * e_book_client_view_get_n_total:
1565 * @self: an #EBookClientView
1566 *
1567 * Returns how many contacts are available in the view.
1568 *
1569 * Note: This function can be used only with @E_BOOK_CLIENT_VIEW_FLAGS_MANUAL_QUERY.
1570 *
1571 * Returns: how many contacts are available in the view
1572 *
1573 * Since: 3.50
1574 **/
1575guint
1576e_book_client_view_get_n_total (EBookClientView *self)
1577{
1578 g_return_val_if_fail (E_IS_BOOK_CLIENT_VIEW (self), 0)do { if ((__builtin_expect (__extension__ ({ int _g_boolean_var_63
= 0; if ((((__extension__ ({ GTypeInstance *__inst = (GTypeInstance
*) ((self)); GType __t = ((e_book_client_view_get_type ())); gboolean
__r; if (!__inst) __r = (0); else if (__inst->g_class &&
__inst->g_class->g_type == __t) __r = (!(0)); else __r
= g_type_check_instance_is_a (__inst, __t); __r; }))))) _g_boolean_var_63
= 1; _g_boolean_var_63; }), 1))) { } else { g_return_if_fail_warning
("libebook", ((const char*) (__func__)), "E_IS_BOOK_CLIENT_VIEW (self)"
); return (0); } } while (0)
;
1579
1580 return e_dbus_address_book_view_get_n_total (self->priv->dbus_proxy);
1581}
1582
1583/**
1584 * e_book_client_view_dup_indices:
1585 * @self: an #EBookClientView
1586 *
1587 * Returns a list of #EBookIndices holding indices of the contacts
1588 * in the view. These are received from the first sort field set by
1589 * e_book_client_view_set_sort_fields_sync(). The last item of the returned
1590 * array is the one with chr member being %NULL.
1591 *
1592 * Free the returned array with e_book_indices_free(), when no longer needed.
1593 *
1594 * Note: This function can be used only with @E_BOOK_CLIENT_VIEW_FLAGS_MANUAL_QUERY.
1595 *
1596 * Returns: (transfer full): list of indices for the view
1597 *
1598 * Since: 3.50
1599 **/
1600EBookIndices *
1601e_book_client_view_dup_indices (EBookClientView *self)
1602{
1603 GVariant *var_indices;
1604 GVariantIter iter;
1605 EBookIndices *indices;
1606 guint index, ii;
1607 gchar *chr = NULL((void*)0);
1608
1609 g_return_val_if_fail (E_IS_BOOK_CLIENT_VIEW (self), NULL)do { if ((__builtin_expect (__extension__ ({ int _g_boolean_var_64
= 0; if ((((__extension__ ({ GTypeInstance *__inst = (GTypeInstance
*) ((self)); GType __t = ((e_book_client_view_get_type ())); gboolean
__r; if (!__inst) __r = (0); else if (__inst->g_class &&
__inst->g_class->g_type == __t) __r = (!(0)); else __r
= g_type_check_instance_is_a (__inst, __t); __r; }))))) _g_boolean_var_64
= 1; _g_boolean_var_64; }), 1))) { } else { g_return_if_fail_warning
("libebook", ((const char*) (__func__)), "E_IS_BOOK_CLIENT_VIEW (self)"
); return (((void*)0)); } } while (0)
;
3
Assuming '__inst' is non-null
4
Taking false branch
5
Assuming field 'g_class' is null
6
Assuming the condition is true
7
Taking true branch
8
Taking true branch
9
Loop condition is false. Exiting loop
1610
1611 var_indices = e_dbus_address_book_view_get_indices (self->priv->dbus_proxy);
1612 if (!var_indices)
10
Assuming 'var_indices' is non-null
11
Taking false branch
1613 return NULL((void*)0);
1614
1615 indices = g_new0 (EBookIndices, g_variant_iter_init (&iter, var_indices) + 1)(EBookIndices *) (__extension__ ({ gsize __n = (gsize) (g_variant_iter_init
(&iter, var_indices) + 1); gsize __s = sizeof (EBookIndices
); gpointer __p; if (__s == 1) __p = g_malloc0 (__n); else if
(__builtin_constant_p (__n) && (__s == 0 || __n <=
(9223372036854775807L *2UL+1UL) / __s)) __p = g_malloc0 (__n
* __s); else __p = g_malloc0_n (__n, __s); __p; }))
;
12
Taking false branch
13
Memory is allocated
1616
1617 for (ii = 0; g_variant_iter_next (&iter, "(su)", &chr, &index); ii++) {
14
Loop condition is false. Execution continues on line 1622
1618 indices[ii].chr = chr;
1619 indices[ii].index = index;
1620 }
1621
1622 indices[ii].chr = NULL((void*)0);
1623 indices[ii].index = G_MAXUINT(2147483647 *2U +1U);
1624
1625 return indices;
1626}
1627
1628typedef struct _DupContactsData {
1629 EBookClientView *self;
1630 GTask *task;
1631 guint range_start;
1632 guint range_length;
1633} DupContactsData;
1634
1635static void
1636dup_contacts_data_free (gpointer ptr)
1637{
1638 DupContactsData *dcd = ptr;
1639
1640 if (dcd) {
1641 g_clear_object (&dcd->self)do { _Static_assert (sizeof *((&dcd->self)) == sizeof (
gpointer), "Expression evaluates to false"); __typeof__ (((&
dcd->self))) _pp = ((&dcd->self)); __typeof__ (*((&
dcd->self))) _ptr = *_pp; *_pp = ((void*)0); if (_ptr) (g_object_unref
) (_ptr); } while (0)
;
1642 g_clear_object (&dcd->task)do { _Static_assert (sizeof *((&dcd->task)) == sizeof (
gpointer), "Expression evaluates to false"); __typeof__ (((&
dcd->task))) _pp = ((&dcd->task)); __typeof__ (*((&
dcd->task))) _ptr = *_pp; *_pp = ((void*)0); if (_ptr) (g_object_unref
) (_ptr); } while (0)
;
1643 g_free (dcd);
1644 }
1645}
1646
1647static void
1648e_book_client_view_got_contacts_cb (GObject *source_object,
1649 GAsyncResult *result,
1650 gpointer user_data)
1651{
1652 DupContactsData *dcd = user_data;
1653 gchar **vcards = NULL((void*)0);
1654 GError *local_error = NULL((void*)0);
1655
1656 if (!e_dbus_address_book_view_call_dup_contacts_finish (E_DBUS_ADDRESS_BOOK_VIEW (source_object)((((EDBusAddressBookView*) (void *) ((source_object))))), &vcards, result, &local_error)) {
1657 g_task_return_error (dcd->task, local_error);
1658 } else {
1659 GPtrArray *contacts;
1660 guint ii;
1661
1662 contacts = g_ptr_array_new_full (g_strv_length (vcards), g_object_unref);
1663
1664 for (ii = 0; vcards[ii]; ii++) {
1665 EContact *contact = e_contact_new_from_vcard (vcards[ii]);
1666 if (!contact)
1667 g_warning ("%s: Failed to covert vCard from string: %s", G_STRFUNC((const char*) (__func__)), vcards[ii]);
1668 g_ptr_array_add (contacts, contact);
1669 }
1670
1671 g_task_return_pointer (dcd->task, contacts, (GDestroyNotify) g_ptr_array_unref);
1672 }
1673
1674 g_strfreev (vcards);
1675 g_clear_object (&dcd->task)do { _Static_assert (sizeof *((&dcd->task)) == sizeof (
gpointer), "Expression evaluates to false"); __typeof__ (((&
dcd->task))) _pp = ((&dcd->task)); __typeof__ (*((&
dcd->task))) _ptr = *_pp; *_pp = ((void*)0); if (_ptr) (g_object_unref
) (_ptr); } while (0)
;
1676}
1677
1678/**
1679 * e_book_client_view_dup_contacts:
1680 * @self: an #EBookClientView
1681 * @range_start: 0-based range start to retrieve the contacts for
1682 * @range_length: how many contacts to retrieve
1683 * @cancellable: optional #GCancellable object, or %NULL
1684 * @cb: (scope async) (closure user_data): a callback to call when the contacts are received
1685 * @user_data: user data for @cb
1686 *
1687 * Asynchronously reads @range_length contacts from index @range_start.
1688 * When there are asked more than e_book_client_view_get_n_total()
1689 * contacts only those up to the total number of contacts are read.
1690 * Asking for out of range contacts results in an error.
1691 *
1692 * Finish the call by e_book_client_view_dup_contacts_finish() from the @cb.
1693 *
1694 * Note: This function can be used only with @E_BOOK_CLIENT_VIEW_FLAGS_MANUAL_QUERY.
1695 *
1696 * Since: 3.50
1697 **/
1698void
1699e_book_client_view_dup_contacts (EBookClientView *self,
1700 guint range_start,
1701 guint range_length,
1702 GCancellable *cancellable,
1703 GAsyncReadyCallback cb,
1704 gpointer user_data)
1705{
1706 DupContactsData *dcd;
1707
1708 g_return_if_fail (E_IS_BOOK_CLIENT_VIEW (self))do { if ((__builtin_expect (__extension__ ({ int _g_boolean_var_65
= 0; if ((((__extension__ ({ GTypeInstance *__inst = (GTypeInstance
*) ((self)); GType __t = ((e_book_client_view_get_type ())); gboolean
__r; if (!__inst) __r = (0); else if (__inst->g_class &&
__inst->g_class->g_type == __t) __r = (!(0)); else __r
= g_type_check_instance_is_a (__inst, __t); __r; }))))) _g_boolean_var_65
= 1; _g_boolean_var_65; }), 1))) { } else { g_return_if_fail_warning
("libebook", ((const char*) (__func__)), "E_IS_BOOK_CLIENT_VIEW (self)"
); return; } } while (0)
;
1709
1710 dcd = g_new0 (DupContactsData, 1)(DupContactsData *) (__extension__ ({ gsize __n = (gsize) (1)
; gsize __s = sizeof (DupContactsData); gpointer __p; if (__s
== 1) __p = g_malloc0 (__n); else if (__builtin_constant_p (
__n) && (__s == 0 || __n <= (9223372036854775807L *
2UL+1UL) / __s)) __p = g_malloc0 (__n * __s); else __p = g_malloc0_n
(__n, __s); __p; }))
;
1711 dcd->range_start = range_start;
1712 dcd->range_length = range_length;
1713 dcd->self = g_object_ref (self)((__typeof__ (self)) (g_object_ref) (self));
1714 dcd->task = g_task_new (self, cancellable, cb, user_data);
1715 g_task_set_task_data (dcd->task, dcd, dup_contacts_data_free);
1716 g_task_set_source_tag (dcd->task, e_book_client_view_dup_contacts);
1717
1718 e_dbus_address_book_view_call_dup_contacts (self->priv->dbus_proxy,
1719 range_start, range_length, G_DBUS_CALL_FLAGS_NONE, -1, cancellable, e_book_client_view_got_contacts_cb, dcd);
1720}
1721
1722/**
1723 * e_book_client_view_dup_contacts_finish:
1724 * @self: an #EBookClientView
1725 * @result: an asynchronous call result
1726 * @out_range_start: (out) (optional): output location where to store original range start, or %NULL
1727 * @out_contacts: (out callee-allocates) (transfer container) (element-type EContact):
1728 * output location where to store array of the read contacts
1729 * @error: return location for a #GError, or %NULL
1730 *
1731 * Finishes previous call of e_book_client_view_dup_contacts();
1732 * see it for further information.
1733 *
1734 * Free the returned #GPtrArray with g_ptr_array_unref(), when
1735 * no longer needed.
1736 *
1737 * Note: This function can be used only with @E_BOOK_CLIENT_VIEW_FLAGS_MANUAL_QUERY.
1738 *
1739 * Returns: whether succeeded; if not, the @error is set
1740 *
1741 * Since: 3.50
1742 **/
1743gboolean
1744e_book_client_view_dup_contacts_finish (EBookClientView *self,
1745 GAsyncResult *result,
1746 guint *out_range_start,
1747 GPtrArray **out_contacts,
1748 GError **error)
1749{
1750 DupContactsData *dcd;
1751
1752 g_return_val_if_fail (E_IS_BOOK_CLIENT_VIEW (self), FALSE)do { if ((__builtin_expect (__extension__ ({ int _g_boolean_var_66
= 0; if ((((__extension__ ({ GTypeInstance *__inst = (GTypeInstance
*) ((self)); GType __t = ((e_book_client_view_get_type ())); gboolean
__r; if (!__inst) __r = (0); else if (__inst->g_class &&
__inst->g_class->g_type == __t) __r = (!(0)); else __r
= g_type_check_instance_is_a (__inst, __t); __r; }))))) _g_boolean_var_66
= 1; _g_boolean_var_66; }), 1))) { } else { g_return_if_fail_warning
("libebook", ((const char*) (__func__)), "E_IS_BOOK_CLIENT_VIEW (self)"
); return ((0)); } } while (0)
;
1753 g_return_val_if_fail (out_contacts != NULL, FALSE)do { if ((__builtin_expect (__extension__ ({ int _g_boolean_var_67
= 0; if (out_contacts != ((void*)0)) _g_boolean_var_67 = 1; _g_boolean_var_67
; }), 1))) { } else { g_return_if_fail_warning ("libebook", (
(const char*) (__func__)), "out_contacts != NULL"); return ((
0)); } } while (0)
;
1754
1755 dcd = g_task_get_task_data (G_TASK (result)((((GTask*) (void *) ((result))))));
1756
1757 *out_contacts = g_task_propagate_pointer (G_TASK (result)((((GTask*) (void *) ((result))))), error);
1758
1759 if (*out_contacts && out_range_start)
1760 *out_range_start = dcd->range_start;
1761
1762 return *out_contacts != NULL((void*)0);
1763}