| File: | src/addressbook/libebook/e-book-client-view.c |
| Warning: | line 887, column 4 Potential memory leak |
Press '?' to see keyboard shortcuts
Keyboard shortcuts:
| 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 | ||||
| 30 | typedef struct _SignalClosure SignalClosure; | |||
| 31 | ||||
| 32 | struct _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 | ||||
| 55 | struct _SignalClosure { | |||
| 56 | GWeakRef client_view; | |||
| 57 | GSList *object_list; | |||
| 58 | GSList *string_list; | |||
| 59 | gchar *message; | |||
| 60 | guint percent; | |||
| 61 | GError *error; | |||
| 62 | }; | |||
| 63 | ||||
| 64 | enum { | |||
| 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 | ||||
| 75 | enum { | |||
| 76 | OBJECTS_ADDED, | |||
| 77 | OBJECTS_MODIFIED, | |||
| 78 | OBJECTS_REMOVED, | |||
| 79 | PROGRESS, | |||
| 80 | COMPLETE, | |||
| 81 | CONTENT_CHANGED, | |||
| 82 | LAST_SIGNAL | |||
| 83 | }; | |||
| 84 | ||||
| 85 | /* Forward Declarations */ | |||
| 86 | static void e_book_client_view_initable_init | |||
| 87 | (GInitableIface *iface); | |||
| 88 | ||||
| 89 | static GParamSpec *properties[N_PROPS] = { NULL((void*)0), }; | |||
| 90 | ||||
| 91 | static guint signals[LAST_SIGNAL]; | |||
| 92 | ||||
| 93 | G_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 | ||||
| 102 | typedef struct { | |||
| 103 | EBookClientView *client_view; | |||
| 104 | guint signum; | |||
| 105 | } NotificationData; | |||
| 106 | ||||
| 107 | static void | |||
| 108 | signal_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 | ||||
| 128 | static GMainContext * | |||
| 129 | book_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 | ||||
| 146 | static void | |||
| 147 | book_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 | ||||
| 160 | static gboolean | |||
| 161 | book_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 | ||||
| 179 | static gboolean | |||
| 180 | book_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 | ||||
| 198 | static gboolean | |||
| 199 | book_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 | ||||
| 217 | static gboolean | |||
| 218 | book_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 | ||||
| 237 | static gboolean | |||
| 238 | book_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 | ||||
| 256 | static void | |||
| 257 | book_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 | ||||
| 282 | static void | |||
| 283 | book_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 | ||||
| 308 | static gchar * | |||
| 309 | direct_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 | ||||
| 332 | static void | |||
| 333 | direct_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 | ||||
| 376 | static void | |||
| 377 | direct_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 | ||||
| 442 | static void | |||
| 443 | book_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 | ||||
| 487 | static void | |||
| 488 | book_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 | ||||
| 532 | static void | |||
| 533 | book_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 | ||||
| 577 | static void | |||
| 578 | book_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 | ||||
| 619 | static void | |||
| 620 | book_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 */ | |||
| 669 | static void | |||
| 670 | book_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 | ||||
| 686 | static gboolean | |||
| 687 | book_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 | ||||
| 702 | static void | |||
| 703 | book_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 | ||||
| 713 | static gboolean | |||
| 714 | book_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 | ||||
| 729 | static void | |||
| 730 | book_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 | ||||
| 741 | static gboolean | |||
| 742 | book_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 | ||||
| 757 | static void | |||
| 758 | book_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 | ||||
| 769 | static void | |||
| 770 | book_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 | ||||
| 779 | static void | |||
| 780 | book_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 | ||||
| 789 | static void | |||
| 790 | book_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 | ||||
| 802 | static void | |||
| 803 | book_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 | ||||
| 812 | static void | |||
| 813 | book_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 | ||||
| 847 | static void | |||
| 848 | book_client_view_get_property (GObject *object, | |||
| 849 | guint property_id, | |||
| 850 | GValue *value, | |||
| 851 | GParamSpec *pspec) | |||
| 852 | { | |||
| 853 | switch (property_id) { | |||
| ||||
| 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 ( | |||
| 886 | E_BOOK_CLIENT_VIEW (object)((((EBookClientView*) (void *) ((object))))))); | |||
| 887 | return; | |||
| ||||
| 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 | ||||
| 893 | static void | |||
| 894 | book_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 | ||||
| 944 | static void | |||
| 945 | book_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 | ||||
| 960 | static gboolean | |||
| 961 | book_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 | ||||
| 1062 | static void | |||
| 1063 | e_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 | ||||
| 1254 | static void | |||
| 1255 | e_book_client_view_initable_init (GInitableIface *iface) | |||
| 1256 | { | |||
| 1257 | iface->init = book_client_view_initable_init; | |||
| 1258 | } | |||
| 1259 | ||||
| 1260 | static void | |||
| 1261 | e_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 | **/ | |||
| 1282 | EBookClient * | |||
| 1283 | e_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 | **/ | |||
| 1303 | EBookClient * | |||
| 1304 | e_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 | **/ | |||
| 1331 | GDBusConnection * | |||
| 1332 | e_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 | **/ | |||
| 1349 | const gchar * | |||
| 1350 | e_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 | */ | |||
| 1364 | void | |||
| 1365 | e_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 | **/ | |||
| 1397 | void | |||
| 1398 | e_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 | */ | |||
| 1426 | void | |||
| 1427 | e_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 | **/ | |||
| 1462 | void | |||
| 1463 | e_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 | **/ | |||
| 1520 | gboolean | |||
| 1521 | e_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 | **/ | |||
| 1555 | gsize | |||
| 1556 | e_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 | **/ | |||
| 1575 | guint | |||
| 1576 | e_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 | **/ | |||
| 1600 | EBookIndices * | |||
| 1601 | e_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); | |||
| 1610 | ||||
| 1611 | var_indices = e_dbus_address_book_view_get_indices (self->priv->dbus_proxy); | |||
| 1612 | if (!var_indices) | |||
| 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; })); | |||
| 1616 | ||||
| 1617 | for (ii = 0; g_variant_iter_next (&iter, "(su)", &chr, &index); ii++) { | |||
| 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 | ||||
| 1628 | typedef struct _DupContactsData { | |||
| 1629 | EBookClientView *self; | |||
| 1630 | GTask *task; | |||
| 1631 | guint range_start; | |||
| 1632 | guint range_length; | |||
| 1633 | } DupContactsData; | |||
| 1634 | ||||
| 1635 | static void | |||
| 1636 | dup_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 | ||||
| 1647 | static void | |||
| 1648 | e_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 | **/ | |||
| 1698 | void | |||
| 1699 | e_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 | **/ | |||
| 1743 | gboolean | |||
| 1744 | e_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 | } |