~ubuntu-branches/ubuntu/saucy/evolution-data-server/saucy

1 by Sebastien Bacher
Import upstream version 1.2.1
1
/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
2
/*
3
 * Author:
4
 *   Nat Friedman (nat@ximian.com)
5
 *
1.1.52 by Sebastien Bacher
Import upstream version 2.23.6
6
 * Copyright (C) 1999-2008 Novell, Inc. (www.novell.com)
1 by Sebastien Bacher
Import upstream version 1.2.1
7
 */
8
9
#include <config.h>
1.1.1 by Daniel Holbach
Import upstream version 1.4.1
10
1.1.88 by Mathieu Trudel-Lapierre
Import upstream version 3.1.2
11
#include <glib/gi18n-lib.h>
12
1 by Sebastien Bacher
Import upstream version 1.2.1
13
#include "e-data-book-view.h"
1.9.1 by Yves-Alexis Perez
Import upstream version 2.29.2
14
#include "e-data-book.h"
1 by Sebastien Bacher
Import upstream version 1.2.1
15
#include "e-book-backend.h"
16
1.1.91 by Mathieu Trudel-Lapierre
Import upstream version 3.1.5
17
#define EDB_OPENING_ERROR	e_data_book_create_error (E_DATA_BOOK_STATUS_BUSY, _("Cannot process, book backend is opening"))
18
#define EDB_NOT_OPENED_ERROR	e_data_book_create_error (E_DATA_BOOK_STATUS_NOT_OPENED, NULL)
1.1.88 by Mathieu Trudel-Lapierre
Import upstream version 3.1.2
19
1.10.8 by Jordi Mallach
Import upstream version 3.4.1
20
#define E_BOOK_BACKEND_GET_PRIVATE(obj) \
21
	(G_TYPE_INSTANCE_GET_PRIVATE \
22
	((obj), E_TYPE_BOOK_BACKEND, EBookBackendPrivate))
23
1 by Sebastien Bacher
Import upstream version 1.2.1
24
struct _EBookBackendPrivate {
1.1.100 by Mathieu Trudel-Lapierre
Import upstream version 3.5.3.1
25
	ESourceRegistry *registry;
26
1 by Sebastien Bacher
Import upstream version 1.2.1
27
	GMutex *clients_mutex;
1.1.88 by Mathieu Trudel-Lapierre
Import upstream version 3.1.2
28
	GSList *clients;
1 by Sebastien Bacher
Import upstream version 1.2.1
29
1.1.88 by Mathieu Trudel-Lapierre
Import upstream version 3.1.2
30
	gboolean opening, opened, readonly, removed, online;
1 by Sebastien Bacher
Import upstream version 1.2.1
31
32
	GMutex *views_mutex;
1.1.88 by Mathieu Trudel-Lapierre
Import upstream version 3.1.2
33
	GSList *views;
1.1.82 by Mathieu Trudel-Lapierre
Import upstream version 2.32.0
34
35
	gchar *cache_dir;
36
};
37
38
/* Property IDs */
39
enum {
40
	PROP_0,
1.1.100 by Mathieu Trudel-Lapierre
Import upstream version 3.5.3.1
41
	PROP_CACHE_DIR,
42
	PROP_REGISTRY
1 by Sebastien Bacher
Import upstream version 1.2.1
43
};
44
1.10.8 by Jordi Mallach
Import upstream version 3.4.1
45
G_DEFINE_TYPE (EBookBackend, e_book_backend, E_TYPE_BACKEND)
1.1.82 by Mathieu Trudel-Lapierre
Import upstream version 2.32.0
46
47
static void
48
book_backend_set_default_cache_dir (EBookBackend *backend)
49
{
50
	ESource *source;
51
	const gchar *user_cache_dir;
1.1.100 by Mathieu Trudel-Lapierre
Import upstream version 3.5.3.1
52
	const gchar *uid;
1.1.82 by Mathieu Trudel-Lapierre
Import upstream version 2.32.0
53
	gchar *filename;
54
55
	user_cache_dir = e_get_user_cache_dir ();
1.10.8 by Jordi Mallach
Import upstream version 3.4.1
56
	source = e_backend_get_source (E_BACKEND (backend));
1.1.82 by Mathieu Trudel-Lapierre
Import upstream version 2.32.0
57
1.1.100 by Mathieu Trudel-Lapierre
Import upstream version 3.5.3.1
58
	uid = e_source_get_uid (source);
59
	g_return_if_fail (uid != NULL);
1.1.82 by Mathieu Trudel-Lapierre
Import upstream version 2.32.0
60
61
	filename = g_build_filename (
1.1.100 by Mathieu Trudel-Lapierre
Import upstream version 3.5.3.1
62
		user_cache_dir, "addressbook", uid, NULL);
1.1.82 by Mathieu Trudel-Lapierre
Import upstream version 2.32.0
63
	e_book_backend_set_cache_dir (backend, filename);
64
	g_free (filename);
65
}
66
67
static void
1.1.92 by Mathieu Trudel-Lapierre
Import upstream version 3.1.91
68
book_backend_get_backend_property (EBookBackend *backend,
69
                                   EDataBook *book,
70
                                   guint32 opid,
71
                                   GCancellable *cancellable,
72
                                   const gchar *prop_name)
1.1.88 by Mathieu Trudel-Lapierre
Import upstream version 3.1.2
73
{
74
	g_return_if_fail (backend != NULL);
75
	g_return_if_fail (E_IS_BOOK_BACKEND (backend));
76
	g_return_if_fail (book != NULL);
77
	g_return_if_fail (prop_name != NULL);
78
79
	if (g_str_equal (prop_name, CLIENT_BACKEND_PROPERTY_OPENED)) {
80
		e_data_book_respond_get_backend_property (book, opid, NULL, e_book_backend_is_opened (backend) ? "TRUE" : "FALSE");
81
	} else if (g_str_equal (prop_name, CLIENT_BACKEND_PROPERTY_OPENING)) {
82
		e_data_book_respond_get_backend_property (book, opid, NULL, e_book_backend_is_opening (backend) ? "TRUE" : "FALSE");
83
	} else if (g_str_equal (prop_name, CLIENT_BACKEND_PROPERTY_ONLINE)) {
1.10.8 by Jordi Mallach
Import upstream version 3.4.1
84
		e_data_book_respond_get_backend_property (book, opid, NULL, e_backend_get_online (E_BACKEND (backend)) ? "TRUE" : "FALSE");
1.1.88 by Mathieu Trudel-Lapierre
Import upstream version 3.1.2
85
	} else if (g_str_equal (prop_name, CLIENT_BACKEND_PROPERTY_READONLY)) {
86
		e_data_book_respond_get_backend_property (book, opid, NULL, e_book_backend_is_readonly (backend) ? "TRUE" : "FALSE");
87
	} else if (g_str_equal (prop_name, CLIENT_BACKEND_PROPERTY_CACHE_DIR)) {
88
		e_data_book_respond_get_backend_property (book, opid, NULL, e_book_backend_get_cache_dir (backend));
89
	} else {
90
		e_data_book_respond_get_backend_property (book, opid, e_data_book_create_error_fmt (E_DATA_BOOK_STATUS_NOT_SUPPORTED, _("Unknown book property '%s'"), prop_name), NULL);
91
	}
92
}
93
94
static void
1.1.92 by Mathieu Trudel-Lapierre
Import upstream version 3.1.91
95
book_backend_set_backend_property (EBookBackend *backend,
96
                                   EDataBook *book,
97
                                   guint32 opid,
98
                                   GCancellable *cancellable,
99
                                   const gchar *prop_name,
100
                                   const gchar *prop_value)
1.1.88 by Mathieu Trudel-Lapierre
Import upstream version 3.1.2
101
{
102
	g_return_if_fail (backend != NULL);
103
	g_return_if_fail (E_IS_BOOK_BACKEND (backend));
104
	g_return_if_fail (book != NULL);
105
	g_return_if_fail (prop_name != NULL);
106
107
	e_data_book_respond_set_backend_property (book, opid, e_data_book_create_error_fmt (E_DATA_BOOK_STATUS_NOT_SUPPORTED, _("Cannot change value of book property '%s'"), prop_name));
108
}
109
110
static void
1.1.100 by Mathieu Trudel-Lapierre
Import upstream version 3.5.3.1
111
book_backend_set_registry (EBookBackend *backend,
112
                           ESourceRegistry *registry)
113
{
114
	g_return_if_fail (E_IS_SOURCE_REGISTRY (registry));
115
	g_return_if_fail (backend->priv->registry == NULL);
116
117
	backend->priv->registry = g_object_ref (registry);
118
}
119
120
static void
1.1.82 by Mathieu Trudel-Lapierre
Import upstream version 2.32.0
121
book_backend_set_property (GObject *object,
122
                           guint property_id,
123
                           const GValue *value,
124
                           GParamSpec *pspec)
125
{
126
	switch (property_id) {
127
		case PROP_CACHE_DIR:
128
			e_book_backend_set_cache_dir (
129
				E_BOOK_BACKEND (object),
130
				g_value_get_string (value));
131
			return;
1.1.100 by Mathieu Trudel-Lapierre
Import upstream version 3.5.3.1
132
133
		case PROP_REGISTRY:
134
			book_backend_set_registry (
135
				E_BOOK_BACKEND (object),
136
				g_value_get_object (value));
137
			return;
1.1.82 by Mathieu Trudel-Lapierre
Import upstream version 2.32.0
138
	}
139
140
	G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
141
}
142
143
static void
144
book_backend_get_property (GObject *object,
145
                           guint property_id,
146
                           GValue *value,
147
                           GParamSpec *pspec)
148
{
149
	switch (property_id) {
150
		case PROP_CACHE_DIR:
151
			g_value_set_string (
152
				value, e_book_backend_get_cache_dir (
153
				E_BOOK_BACKEND (object)));
154
			return;
1.1.100 by Mathieu Trudel-Lapierre
Import upstream version 3.5.3.1
155
156
		case PROP_REGISTRY:
157
			g_value_set_object (
158
				value, e_book_backend_get_registry (
159
				E_BOOK_BACKEND (object)));
160
			return;
1.1.82 by Mathieu Trudel-Lapierre
Import upstream version 2.32.0
161
	}
162
163
	G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
164
}
165
166
static void
167
book_backend_dispose (GObject *object)
168
{
169
	EBookBackendPrivate *priv;
170
1.10.8 by Jordi Mallach
Import upstream version 3.4.1
171
	priv = E_BOOK_BACKEND_GET_PRIVATE (object);
1.1.82 by Mathieu Trudel-Lapierre
Import upstream version 2.32.0
172
1.1.100 by Mathieu Trudel-Lapierre
Import upstream version 3.5.3.1
173
	if (priv->registry != NULL) {
174
		g_object_unref (priv->registry);
175
		priv->registry = NULL;
176
	}
177
1.1.82 by Mathieu Trudel-Lapierre
Import upstream version 2.32.0
178
	if (priv->views != NULL) {
1.1.88 by Mathieu Trudel-Lapierre
Import upstream version 3.1.2
179
		g_slist_free (priv->views);
1.1.82 by Mathieu Trudel-Lapierre
Import upstream version 2.32.0
180
		priv->views = NULL;
181
	}
182
183
	/* Chain up to parent's dispose() method. */
184
	G_OBJECT_CLASS (e_book_backend_parent_class)->dispose (object);
185
}
186
187
static void
188
book_backend_finalize (GObject *object)
189
{
190
	EBookBackendPrivate *priv;
191
1.10.8 by Jordi Mallach
Import upstream version 3.4.1
192
	priv = E_BOOK_BACKEND_GET_PRIVATE (object);
1.1.82 by Mathieu Trudel-Lapierre
Import upstream version 2.32.0
193
1.1.88 by Mathieu Trudel-Lapierre
Import upstream version 3.1.2
194
	g_slist_free (priv->clients);
1.1.82 by Mathieu Trudel-Lapierre
Import upstream version 2.32.0
195
196
	g_mutex_free (priv->clients_mutex);
197
	g_mutex_free (priv->views_mutex);
198
199
	g_free (priv->cache_dir);
200
201
	/* Chain up to parent's finalize() method. */
202
	G_OBJECT_CLASS (e_book_backend_parent_class)->finalize (object);
203
}
204
1.1.91 by Mathieu Trudel-Lapierre
Import upstream version 3.1.5
205
static gboolean
1.1.102 by Mathieu Trudel-Lapierre
Import upstream version 3.5.5
206
book_backend_authenticate_sync (EBackend *backend,
207
                                ESourceAuthenticator *auth,
208
                                GCancellable *cancellable,
209
                                GError **error)
210
{
211
	EBookBackend *book_backend;
212
	ESourceRegistry *registry;
213
	ESource *source;
214
215
	book_backend = E_BOOK_BACKEND (backend);
216
	registry = e_book_backend_get_registry (book_backend);
217
	source = e_backend_get_source (backend);
218
219
	return e_source_registry_authenticate_sync (
220
		registry, source, auth, cancellable, error);
221
}
222
223
static gboolean
1.1.92 by Mathieu Trudel-Lapierre
Import upstream version 3.1.91
224
view_notify_update (EDataBookView *view,
225
                    gpointer contact)
1.1.91 by Mathieu Trudel-Lapierre
Import upstream version 3.1.5
226
{
227
	e_data_book_view_notify_update (view, contact);
228
229
	return TRUE;
230
}
231
232
static void
1.1.92 by Mathieu Trudel-Lapierre
Import upstream version 3.1.91
233
book_backend_notify_update (EBookBackend *backend,
234
                            const EContact *contact)
1.1.91 by Mathieu Trudel-Lapierre
Import upstream version 3.1.5
235
{
236
	e_book_backend_foreach_view (backend, view_notify_update, (gpointer) contact);
237
}
238
1.1.82 by Mathieu Trudel-Lapierre
Import upstream version 2.32.0
239
static void
1.10.8 by Jordi Mallach
Import upstream version 3.4.1
240
e_book_backend_class_init (EBookBackendClass *class)
1.1.82 by Mathieu Trudel-Lapierre
Import upstream version 2.32.0
241
{
242
	GObjectClass *object_class;
1.1.102 by Mathieu Trudel-Lapierre
Import upstream version 3.5.5
243
	EBackendClass *backend_class;
1.1.82 by Mathieu Trudel-Lapierre
Import upstream version 2.32.0
244
1.10.8 by Jordi Mallach
Import upstream version 3.4.1
245
	g_type_class_add_private (class, sizeof (EBookBackendPrivate));
1.1.82 by Mathieu Trudel-Lapierre
Import upstream version 2.32.0
246
1.10.8 by Jordi Mallach
Import upstream version 3.4.1
247
	object_class = G_OBJECT_CLASS (class);
1.1.82 by Mathieu Trudel-Lapierre
Import upstream version 2.32.0
248
	object_class->set_property = book_backend_set_property;
249
	object_class->get_property = book_backend_get_property;
250
	object_class->dispose = book_backend_dispose;
251
	object_class->finalize = book_backend_finalize;
252
1.1.102 by Mathieu Trudel-Lapierre
Import upstream version 3.5.5
253
	backend_class = E_BACKEND_CLASS (class);
254
	backend_class->authenticate_sync = book_backend_authenticate_sync;
255
1.10.8 by Jordi Mallach
Import upstream version 3.4.1
256
	class->get_backend_property = book_backend_get_backend_property;
257
	class->set_backend_property = book_backend_set_backend_property;
258
	class->notify_update        = book_backend_notify_update;
1.1.88 by Mathieu Trudel-Lapierre
Import upstream version 3.1.2
259
1.1.82 by Mathieu Trudel-Lapierre
Import upstream version 2.32.0
260
	g_object_class_install_property (
261
		object_class,
262
		PROP_CACHE_DIR,
263
		g_param_spec_string (
264
			"cache-dir",
1.1.100 by Mathieu Trudel-Lapierre
Import upstream version 3.5.3.1
265
			"Cache Dir",
266
			"The backend's cache directory",
267
			NULL,
268
			G_PARAM_READWRITE |
269
			G_PARAM_STATIC_STRINGS));
270
271
	g_object_class_install_property (
272
		object_class,
273
		PROP_REGISTRY,
274
		g_param_spec_object (
275
			"registry",
276
			"Registry",
277
			"Data source registry",
278
			E_TYPE_SOURCE_REGISTRY,
279
			G_PARAM_READWRITE |
280
			G_PARAM_CONSTRUCT_ONLY |
281
			G_PARAM_STATIC_STRINGS));
1.1.82 by Mathieu Trudel-Lapierre
Import upstream version 2.32.0
282
}
283
284
static void
285
e_book_backend_init (EBookBackend *backend)
286
{
1.10.8 by Jordi Mallach
Import upstream version 3.4.1
287
	backend->priv = E_BOOK_BACKEND_GET_PRIVATE (backend);
1.1.82 by Mathieu Trudel-Lapierre
Import upstream version 2.32.0
288
1.1.88 by Mathieu Trudel-Lapierre
Import upstream version 3.1.2
289
	backend->priv->clients = NULL;
1.1.82 by Mathieu Trudel-Lapierre
Import upstream version 2.32.0
290
	backend->priv->clients_mutex = g_mutex_new ();
1.1.88 by Mathieu Trudel-Lapierre
Import upstream version 3.1.2
291
292
	backend->priv->views = NULL;
1.1.82 by Mathieu Trudel-Lapierre
Import upstream version 2.32.0
293
	backend->priv->views_mutex = g_mutex_new ();
294
}
295
296
/**
297
 * e_book_backend_get_cache_dir:
298
 * @backend: an #EBookBackend
299
 *
300
 * Returns the cache directory for the given backend.
301
 *
302
 * Returns: the cache directory for the backend
303
 *
304
 * Since: 2.32
305
 **/
306
const gchar *
307
e_book_backend_get_cache_dir (EBookBackend *backend)
308
{
309
	g_return_val_if_fail (E_IS_BOOK_BACKEND (backend), NULL);
310
311
	return backend->priv->cache_dir;
312
}
313
314
/**
315
 * e_book_backend_set_cache_dir:
316
 * @backend: an #EBookBackend
317
 * @cache_dir: a local cache directory
318
 *
319
 * Sets the cache directory for the given backend.
320
 *
321
 * Note that #EBookBackend is initialized with a usable default based on
1.1.88 by Mathieu Trudel-Lapierre
Import upstream version 3.1.2
322
 * the #ESource given to e_book_backend_open().  Backends should
1.1.82 by Mathieu Trudel-Lapierre
Import upstream version 2.32.0
323
 * not override the default without good reason.
324
 *
325
 * Since: 2.32
326
 **/
327
void
328
e_book_backend_set_cache_dir (EBookBackend *backend,
329
                              const gchar *cache_dir)
330
{
331
	g_return_if_fail (E_IS_BOOK_BACKEND (backend));
332
	g_return_if_fail (cache_dir != NULL);
333
1.1.100 by Mathieu Trudel-Lapierre
Import upstream version 3.5.3.1
334
	if (g_strcmp0 (backend->priv->cache_dir, cache_dir) == 0)
335
		return;
336
1.1.82 by Mathieu Trudel-Lapierre
Import upstream version 2.32.0
337
	g_free (backend->priv->cache_dir);
338
	backend->priv->cache_dir = g_strdup (cache_dir);
339
340
	g_object_notify (G_OBJECT (backend), "cache-dir");
1 by Sebastien Bacher
Import upstream version 1.2.1
341
}
342
1.1.1 by Daniel Holbach
Import upstream version 1.4.1
343
/**
1.1.100 by Mathieu Trudel-Lapierre
Import upstream version 3.5.3.1
344
 * e_book_backend_get_registry:
345
 * @backend: an #EBookBackend
346
 *
347
 * Returns the data source registry to which #EBackend:source belongs.
348
 *
349
 * Returns: an #ESourceRegistry
350
 *
351
 * Since: 3.6
352
 **/
353
ESourceRegistry *
354
e_book_backend_get_registry (EBookBackend *backend)
355
{
356
	g_return_val_if_fail (E_IS_BOOK_BACKEND (backend), NULL);
357
358
	return backend->priv->registry;
359
}
360
361
/**
1.1.1 by Daniel Holbach
Import upstream version 1.4.1
362
 * e_book_backend_open:
363
 * @backend: an #EBookBackend
364
 * @book: an #EDataBook
365
 * @opid: the ID to use for this operation
1.1.88 by Mathieu Trudel-Lapierre
Import upstream version 3.1.2
366
 * @cancellable: a #GCancellable for the operation
1.1.1 by Daniel Holbach
Import upstream version 1.4.1
367
 * @only_if_exists: %TRUE to prevent the creation of a new book
368
 *
369
 * Executes an 'open' request specified by @opid on @book
1.1.88 by Mathieu Trudel-Lapierre
Import upstream version 3.1.2
370
 * using @backend. This call might be finished
371
 * with e_data_book_respond_open() or e_book_backend_respond_opened(),
372
 * though the overall opening phase finishes only after call
373
 * of e_book_backend_notify_opened() after which call the backend
374
 * is either fully opened (including authentication against (remote)
375
 * server/storage) or an error was encountered during this opening phase.
376
 * 'opened' and 'opening' properties are updated automatically.
377
 * The backend refuses all other operations until the opening phase is finished.
378
 *
379
 * The e_book_backend_notify_opened() is called either from this function
380
 * or from e_book_backend_authenticate_user(), or after necessary steps
381
 * initiated by these two functions.
382
 *
383
 * The opening phase usually works like this:
384
 * 1) client requests open for the backend
385
 * 2) server receives this request and calls e_book_backend_open() - the opening phase begun
386
 * 3) either the backend is opened during this call, and notifies client
387
 *    with e_book_backend_notify_opened() about that. This is usually
388
 *    for local backends; their opening phase is finished
389
 * 4) or the backend requires authentication, thus it notifies client
390
 *    about that with e_book_backend_notify_auth_required() and is
391
 *    waiting for credentials, which will be received from client
392
 *    by e_book_backend_authenticate_user() call. Backend's opening
393
 *    phase is still running in this case, thus it doesn't call
394
 *    e_book_backend_notify_opened() within e_book_backend_open() call.
395
 * 5) when backend receives credentials in e_book_backend_authenticate_user()
396
 *    then it tries to authenticate against a server/storage with them
397
 *    and only after it knows result of the authentication, whether user
398
 *    was or wasn't authenticated, it notifies client with the result
399
 *    by e_book_backend_notify_opened() and it's opening phase is
400
 *    finished now. If there was no error returned then the backend is
401
 *    considered opened, otherwise it's considered closed. Use AuthenticationFailed
402
 *    error when the given credentials were rejected by the server/store, which
403
 *    will result in a re-prompt on the client side, otherwise use AuthenticationRequired
404
 *    if there was anything wrong with the given credentials. Set error's
405
 *    message to a reason for a re-prompt, it'll be shown to a user.
406
 * 6) client checks error returned from e_book_backend_notify_opened() and
407
 *    reprompts for a password if it was AuthenticationFailed. Otherwise
408
 *    considers backend opened based on the error presence (no error means success).
409
 *
410
 * In any case, the call of e_book_backend_open() should be always finished
411
 * with e_data_book_respond_open(), which has no influence on the opening phase,
412
 * or alternatively with e_book_backend_respond_opened(). Never use authentication
413
 * errors in e_data_book_respond_open() to notify the client the authentication is
414
 * required, there is e_book_backend_notify_auth_required() for this.
1.1.1 by Daniel Holbach
Import upstream version 1.4.1
415
 **/
1 by Sebastien Bacher
Import upstream version 1.2.1
416
void
417
e_book_backend_open (EBookBackend *backend,
1.1.92 by Mathieu Trudel-Lapierre
Import upstream version 3.1.91
418
                     EDataBook *book,
419
                     guint32 opid,
420
                     GCancellable *cancellable,
421
                     gboolean only_if_exists)
1 by Sebastien Bacher
Import upstream version 1.2.1
422
{
423
	g_return_if_fail (E_IS_BOOK_BACKEND (backend));
424
	g_return_if_fail (E_IS_DATA_BOOK (book));
425
1.1.88 by Mathieu Trudel-Lapierre
Import upstream version 3.1.2
426
	g_mutex_lock (backend->priv->clients_mutex);
427
428
	if (e_book_backend_is_opened (backend)) {
429
		g_mutex_unlock (backend->priv->clients_mutex);
430
431
		e_data_book_report_readonly (book, backend->priv->readonly);
432
		e_data_book_report_online (book, backend->priv->online);
433
434
		e_book_backend_respond_opened (backend, book, opid, NULL);
435
	} else if (e_book_backend_is_opening (backend)) {
436
		g_mutex_unlock (backend->priv->clients_mutex);
437
438
		e_data_book_respond_open (book, opid, EDB_OPENING_ERROR);
1 by Sebastien Bacher
Import upstream version 1.2.1
439
	} else {
1.1.88 by Mathieu Trudel-Lapierre
Import upstream version 3.1.2
440
		backend->priv->opening = TRUE;
441
		g_mutex_unlock (backend->priv->clients_mutex);
442
443
		/* Subclasses may need to call e_book_backend_get_cache_dir() in
444
		 * their open() methods, so get the "cache-dir" property
445
		 * initialized before we call the method. */
446
		book_backend_set_default_cache_dir (backend);
447
448
		g_return_if_fail (E_BOOK_BACKEND_GET_CLASS (backend)->open != NULL);
449
450
		(* E_BOOK_BACKEND_GET_CLASS (backend)->open) (backend, book, opid, cancellable, only_if_exists);
1 by Sebastien Bacher
Import upstream version 1.2.1
451
	}
452
}
453
1.1.1 by Daniel Holbach
Import upstream version 1.4.1
454
/**
455
 * e_book_backend_remove:
456
 * @backend: an #EBookBackend
457
 * @book: an #EDataBook
1.1.88 by Mathieu Trudel-Lapierre
Import upstream version 3.1.2
458
 * @cancellable: a #GCancellable for the operation
1.1.1 by Daniel Holbach
Import upstream version 1.4.1
459
 * @opid: the ID to use for this operation
460
 *
461
 * Executes a 'remove' request to remove all of @backend's data,
462
 * specified by @opid on @book.
1.1.88 by Mathieu Trudel-Lapierre
Import upstream version 3.1.2
463
 * This might be finished with e_data_book_respond_remove().
1.1.1 by Daniel Holbach
Import upstream version 1.4.1
464
 **/
1 by Sebastien Bacher
Import upstream version 1.2.1
465
void
466
e_book_backend_remove (EBookBackend *backend,
1.1.92 by Mathieu Trudel-Lapierre
Import upstream version 3.1.91
467
                       EDataBook *book,
468
                       guint32 opid,
469
                       GCancellable *cancellable)
1 by Sebastien Bacher
Import upstream version 1.2.1
470
{
471
	g_return_if_fail (E_IS_BOOK_BACKEND (backend));
472
	g_return_if_fail (E_IS_DATA_BOOK (book));
1.1.88 by Mathieu Trudel-Lapierre
Import upstream version 3.1.2
473
	g_return_if_fail (E_BOOK_BACKEND_GET_CLASS (backend)->remove);
474
475
	if (e_book_backend_is_opening (backend))
476
		e_data_book_respond_remove (book, opid, EDB_OPENING_ERROR);
477
	else
478
		(* E_BOOK_BACKEND_GET_CLASS (backend)->remove) (backend, book, opid, cancellable);
479
}
480
481
/**
482
 * e_book_backend_refresh:
483
 * @backend: an #EBookBackend
484
 * @book: an #EDataBook
485
 * @opid: the ID to use for this operation
486
 * @cancellable: a #GCancellable for the operation
487
 *
488
 * Refreshes the address book being accessed by the given backend.
489
 * This might be finished with e_data_book_respond_refresh(),
490
 * and it might be called as soon as possible; it doesn't mean
491
 * that the refreshing is done after calling that, the backend
492
 * is only notifying client whether it started the refresh process
493
 * or not.
494
 *
495
 * Since: 3.2
496
 **/
497
void
1.1.92 by Mathieu Trudel-Lapierre
Import upstream version 3.1.91
498
e_book_backend_refresh (EBookBackend *backend,
499
                        EDataBook *book,
500
                        guint32 opid,
501
                        GCancellable *cancellable)
1.1.88 by Mathieu Trudel-Lapierre
Import upstream version 3.1.2
502
{
503
	g_return_if_fail (backend != NULL);
504
	g_return_if_fail (E_IS_BOOK_BACKEND (backend));
505
506
	if (e_book_backend_is_opening (backend))
507
		e_data_book_respond_refresh (book, opid, EDB_OPENING_ERROR);
508
	else if (!E_BOOK_BACKEND_GET_CLASS (backend)->refresh)
509
		e_data_book_respond_refresh (book, opid, e_data_book_create_error (E_DATA_BOOK_STATUS_NOT_SUPPORTED, NULL));
1.1.91 by Mathieu Trudel-Lapierre
Import upstream version 3.1.5
510
	else if (!e_book_backend_is_opened (backend))
511
		e_data_book_respond_refresh (book, opid, EDB_NOT_OPENED_ERROR);
1.1.88 by Mathieu Trudel-Lapierre
Import upstream version 3.1.2
512
	else
513
		(* E_BOOK_BACKEND_GET_CLASS (backend)->refresh) (backend, book, opid, cancellable);
1 by Sebastien Bacher
Import upstream version 1.2.1
514
}
515
1.1.1 by Daniel Holbach
Import upstream version 1.4.1
516
/**
1.10.8 by Jordi Mallach
Import upstream version 3.4.1
517
 * e_book_backend_create_contacts
1.1.1 by Daniel Holbach
Import upstream version 1.4.1
518
 * @backend: an #EBookBackend
519
 * @book: an #EDataBook
520
 * @opid: the ID to use for this operation
1.1.88 by Mathieu Trudel-Lapierre
Import upstream version 3.1.2
521
 * @cancellable: a #GCancellable for the operation
1.10.8 by Jordi Mallach
Import upstream version 3.4.1
522
 * @vcards: a #GSList of vCards to add
1.1.1 by Daniel Holbach
Import upstream version 1.4.1
523
 *
1.10.8 by Jordi Mallach
Import upstream version 3.4.1
524
 * Executes a 'create contacts' request specified by @opid on @book
1.1.1 by Daniel Holbach
Import upstream version 1.4.1
525
 * using @backend.
1.10.8 by Jordi Mallach
Import upstream version 3.4.1
526
 * This might be finished with e_data_book_respond_create_contacts().
527
 *
528
 * Since: 3.4
1.1.1 by Daniel Holbach
Import upstream version 1.4.1
529
 **/
1 by Sebastien Bacher
Import upstream version 1.2.1
530
void
1.10.8 by Jordi Mallach
Import upstream version 3.4.1
531
e_book_backend_create_contacts (EBookBackend *backend,
1.1.92 by Mathieu Trudel-Lapierre
Import upstream version 3.1.91
532
                               EDataBook *book,
533
                               guint32 opid,
534
                               GCancellable *cancellable,
1.10.8 by Jordi Mallach
Import upstream version 3.4.1
535
                               const GSList *vcards)
1 by Sebastien Bacher
Import upstream version 1.2.1
536
{
537
	g_return_if_fail (E_IS_BOOK_BACKEND (backend));
538
	g_return_if_fail (E_IS_DATA_BOOK (book));
1.10.8 by Jordi Mallach
Import upstream version 3.4.1
539
	g_return_if_fail (vcards);
540
	g_return_if_fail (E_BOOK_BACKEND_GET_CLASS (backend)->create_contacts);
1.1.88 by Mathieu Trudel-Lapierre
Import upstream version 3.1.2
541
542
	if (e_book_backend_is_opening (backend))
1.10.8 by Jordi Mallach
Import upstream version 3.4.1
543
		e_data_book_respond_create_contacts (book, opid, EDB_OPENING_ERROR, NULL);
1.1.91 by Mathieu Trudel-Lapierre
Import upstream version 3.1.5
544
	else if (!e_book_backend_is_opened (backend))
1.10.8 by Jordi Mallach
Import upstream version 3.4.1
545
		e_data_book_respond_create_contacts (book, opid, EDB_NOT_OPENED_ERROR, NULL);
1.1.88 by Mathieu Trudel-Lapierre
Import upstream version 3.1.2
546
	else
1.10.8 by Jordi Mallach
Import upstream version 3.4.1
547
		(* E_BOOK_BACKEND_GET_CLASS (backend)->create_contacts) (backend, book, opid, cancellable, vcards);
1 by Sebastien Bacher
Import upstream version 1.2.1
548
}
549
1.1.1 by Daniel Holbach
Import upstream version 1.4.1
550
/**
551
 * e_book_backend_remove_contacts:
552
 * @backend: an #EBookBackend
553
 * @book: an #EDataBook
554
 * @opid: the ID to use for this operation
1.1.88 by Mathieu Trudel-Lapierre
Import upstream version 3.1.2
555
 * @cancellable: a #GCancellable for the operation
1.1.1 by Daniel Holbach
Import upstream version 1.4.1
556
 * @id_list: list of string IDs to remove
557
 *
558
 * Executes a 'remove contacts' request specified by @opid on @book
559
 * using @backend.
1.1.88 by Mathieu Trudel-Lapierre
Import upstream version 3.1.2
560
 * This might be finished with e_data_book_respond_remove_contacts().
1.1.1 by Daniel Holbach
Import upstream version 1.4.1
561
 **/
1 by Sebastien Bacher
Import upstream version 1.2.1
562
void
563
e_book_backend_remove_contacts (EBookBackend *backend,
1.1.92 by Mathieu Trudel-Lapierre
Import upstream version 3.1.91
564
                                EDataBook *book,
565
                                guint32 opid,
566
                                GCancellable *cancellable,
567
                                const GSList *id_list)
1 by Sebastien Bacher
Import upstream version 1.2.1
568
{
569
	g_return_if_fail (E_IS_BOOK_BACKEND (backend));
570
	g_return_if_fail (E_IS_DATA_BOOK (book));
571
	g_return_if_fail (id_list);
1.1.88 by Mathieu Trudel-Lapierre
Import upstream version 3.1.2
572
	g_return_if_fail (E_BOOK_BACKEND_GET_CLASS (backend)->remove_contacts);
573
574
	if (e_book_backend_is_opening (backend))
575
		e_data_book_respond_remove_contacts (book, opid, EDB_OPENING_ERROR, NULL);
1.1.91 by Mathieu Trudel-Lapierre
Import upstream version 3.1.5
576
	else if (!e_book_backend_is_opened (backend))
577
		e_data_book_respond_remove_contacts (book, opid, EDB_NOT_OPENED_ERROR, NULL);
1.1.88 by Mathieu Trudel-Lapierre
Import upstream version 3.1.2
578
	else
579
		(* E_BOOK_BACKEND_GET_CLASS (backend)->remove_contacts) (backend, book, opid, cancellable, id_list);
1 by Sebastien Bacher
Import upstream version 1.2.1
580
}
581
1.1.1 by Daniel Holbach
Import upstream version 1.4.1
582
/**
1.10.8 by Jordi Mallach
Import upstream version 3.4.1
583
 * e_book_backend_modify_contacts:
1.1.1 by Daniel Holbach
Import upstream version 1.4.1
584
 * @backend: an #EBookBackend
585
 * @book: an #EDataBook
586
 * @opid: the ID to use for this operation
1.1.88 by Mathieu Trudel-Lapierre
Import upstream version 3.1.2
587
 * @cancellable: a #GCancellable for the operation
1.10.8 by Jordi Mallach
Import upstream version 3.4.1
588
 * @vcards: the VCards to update
1.1.1 by Daniel Holbach
Import upstream version 1.4.1
589
 *
1.10.8 by Jordi Mallach
Import upstream version 3.4.1
590
 * Executes a 'modify contacts' request specified by @opid on @book
1.1.1 by Daniel Holbach
Import upstream version 1.4.1
591
 * using @backend.
1.10.8 by Jordi Mallach
Import upstream version 3.4.1
592
 * This might be finished with e_data_book_respond_modify_contacts().
593
 *
594
 * Since: 3.4
1.1.1 by Daniel Holbach
Import upstream version 1.4.1
595
 **/
1 by Sebastien Bacher
Import upstream version 1.2.1
596
void
1.10.8 by Jordi Mallach
Import upstream version 3.4.1
597
e_book_backend_modify_contacts (EBookBackend *backend,
1.1.92 by Mathieu Trudel-Lapierre
Import upstream version 3.1.91
598
                               EDataBook *book,
599
                               guint32 opid,
600
                               GCancellable *cancellable,
1.10.8 by Jordi Mallach
Import upstream version 3.4.1
601
                               const GSList *vcards)
1 by Sebastien Bacher
Import upstream version 1.2.1
602
{
603
	g_return_if_fail (E_IS_BOOK_BACKEND (backend));
604
	g_return_if_fail (E_IS_DATA_BOOK (book));
1.10.8 by Jordi Mallach
Import upstream version 3.4.1
605
	g_return_if_fail (vcards);
606
	g_return_if_fail (E_BOOK_BACKEND_GET_CLASS (backend)->modify_contacts);
1.1.88 by Mathieu Trudel-Lapierre
Import upstream version 3.1.2
607
608
	if (e_book_backend_is_opening (backend))
1.10.8 by Jordi Mallach
Import upstream version 3.4.1
609
		e_data_book_respond_modify_contacts (book, opid, EDB_OPENING_ERROR, NULL);
1.1.91 by Mathieu Trudel-Lapierre
Import upstream version 3.1.5
610
	else if (!e_book_backend_is_opened (backend))
1.10.8 by Jordi Mallach
Import upstream version 3.4.1
611
		e_data_book_respond_modify_contacts (book, opid, EDB_NOT_OPENED_ERROR, NULL);
1.1.88 by Mathieu Trudel-Lapierre
Import upstream version 3.1.2
612
	else
1.10.8 by Jordi Mallach
Import upstream version 3.4.1
613
		(* E_BOOK_BACKEND_GET_CLASS (backend)->modify_contacts) (backend, book, opid, cancellable, vcards);
1 by Sebastien Bacher
Import upstream version 1.2.1
614
}
615
1.1.1 by Daniel Holbach
Import upstream version 1.4.1
616
/**
617
 * e_book_backend_get_contact:
618
 * @backend: an #EBookBackend
619
 * @book: an #EDataBook
620
 * @opid: the ID to use for this operation
1.1.88 by Mathieu Trudel-Lapierre
Import upstream version 3.1.2
621
 * @cancellable: a #GCancellable for the operation
1.1.1 by Daniel Holbach
Import upstream version 1.4.1
622
 * @id: the ID of the contact to get
623
 *
624
 * Executes a 'get contact' request specified by @opid on @book
625
 * using @backend.
1.1.88 by Mathieu Trudel-Lapierre
Import upstream version 3.1.2
626
 * This might be finished with e_data_book_respond_get_contact().
1.1.1 by Daniel Holbach
Import upstream version 1.4.1
627
 **/
1 by Sebastien Bacher
Import upstream version 1.2.1
628
void
629
e_book_backend_get_contact (EBookBackend *backend,
1.1.92 by Mathieu Trudel-Lapierre
Import upstream version 3.1.91
630
                            EDataBook *book,
631
                            guint32 opid,
632
                            GCancellable *cancellable,
633
                            const gchar *id)
1 by Sebastien Bacher
Import upstream version 1.2.1
634
{
635
	g_return_if_fail (E_IS_BOOK_BACKEND (backend));
636
	g_return_if_fail (E_IS_DATA_BOOK (book));
637
	g_return_if_fail (id);
1.1.88 by Mathieu Trudel-Lapierre
Import upstream version 3.1.2
638
	g_return_if_fail (E_BOOK_BACKEND_GET_CLASS (backend)->get_contact);
639
640
	if (e_book_backend_is_opening (backend))
641
		e_data_book_respond_get_contact (book, opid, EDB_OPENING_ERROR, NULL);
1.1.91 by Mathieu Trudel-Lapierre
Import upstream version 3.1.5
642
	else if (!e_book_backend_is_opened (backend))
643
		e_data_book_respond_get_contact (book, opid, EDB_NOT_OPENED_ERROR, NULL);
1.1.88 by Mathieu Trudel-Lapierre
Import upstream version 3.1.2
644
	else
645
		(* E_BOOK_BACKEND_GET_CLASS (backend)->get_contact) (backend, book, opid, cancellable, id);
1 by Sebastien Bacher
Import upstream version 1.2.1
646
}
647
1.1.1 by Daniel Holbach
Import upstream version 1.4.1
648
/**
649
 * e_book_backend_get_contact_list:
650
 * @backend: an #EBookBackend
651
 * @book: an #EDataBook
652
 * @opid: the ID to use for this operation
1.1.88 by Mathieu Trudel-Lapierre
Import upstream version 3.1.2
653
 * @cancellable: a #GCancellable for the operation
1.1.1 by Daniel Holbach
Import upstream version 1.4.1
654
 * @query: the s-expression to match
655
 *
656
 * Executes a 'get contact list' request specified by @opid on @book
657
 * using @backend.
1.1.88 by Mathieu Trudel-Lapierre
Import upstream version 3.1.2
658
 * This might be finished with e_data_book_respond_get_contact_list().
1.1.1 by Daniel Holbach
Import upstream version 1.4.1
659
 **/
1 by Sebastien Bacher
Import upstream version 1.2.1
660
void
661
e_book_backend_get_contact_list (EBookBackend *backend,
1.1.92 by Mathieu Trudel-Lapierre
Import upstream version 3.1.91
662
                                 EDataBook *book,
663
                                 guint32 opid,
664
                                 GCancellable *cancellable,
665
                                 const gchar *query)
1.11.9 by Josselin Mouette
Import upstream version 3.2.2
666
{
667
	g_return_if_fail (E_IS_BOOK_BACKEND (backend));
668
	g_return_if_fail (E_IS_DATA_BOOK (book));
669
	g_return_if_fail (query);
1.1.88 by Mathieu Trudel-Lapierre
Import upstream version 3.1.2
670
	g_return_if_fail (E_BOOK_BACKEND_GET_CLASS (backend)->get_contact_list);
671
672
	if (e_book_backend_is_opening (backend))
673
		e_data_book_respond_get_contact_list (book, opid, EDB_OPENING_ERROR, NULL);
1.1.91 by Mathieu Trudel-Lapierre
Import upstream version 3.1.5
674
	else if (!e_book_backend_is_opened (backend))
675
		e_data_book_respond_get_contact_list (book, opid, EDB_NOT_OPENED_ERROR, NULL);
1.1.88 by Mathieu Trudel-Lapierre
Import upstream version 3.1.2
676
	else
677
		(* E_BOOK_BACKEND_GET_CLASS (backend)->get_contact_list) (backend, book, opid, cancellable, query);
678
}
679
680
/**
681
 * e_book_backend_get_contact_list_uids:
682
 * @backend: an #EBookBackend
683
 * @book: an #EDataBook
684
 * @opid: the ID to use for this operation
685
 * @cancellable: a #GCancellable for the operation
686
 * @query: the s-expression to match
687
 *
688
 * Executes a 'get contact list uids' request specified by @opid on @book
689
 * using @backend.
690
 * This might be finished with e_data_book_respond_get_contact_list_uids().
691
 *
692
 * Since: 3.2
693
 **/
694
void
695
e_book_backend_get_contact_list_uids (EBookBackend *backend,
1.1.92 by Mathieu Trudel-Lapierre
Import upstream version 3.1.91
696
                                      EDataBook *book,
697
                                      guint32 opid,
698
                                      GCancellable *cancellable,
699
                                      const gchar *query)
1.1.88 by Mathieu Trudel-Lapierre
Import upstream version 3.1.2
700
{
701
	g_return_if_fail (E_IS_BOOK_BACKEND (backend));
702
	g_return_if_fail (E_IS_DATA_BOOK (book));
703
	g_return_if_fail (query);
704
	g_return_if_fail (E_BOOK_BACKEND_GET_CLASS (backend)->get_contact_list_uids);
705
706
	if (e_book_backend_is_opening (backend))
707
		e_data_book_respond_get_contact_list_uids (book, opid, EDB_OPENING_ERROR, NULL);
1.1.91 by Mathieu Trudel-Lapierre
Import upstream version 3.1.5
708
	else if (!e_book_backend_is_opened (backend))
709
		e_data_book_respond_get_contact_list_uids (book, opid, EDB_NOT_OPENED_ERROR, NULL);
1.1.88 by Mathieu Trudel-Lapierre
Import upstream version 3.1.2
710
	else
711
		(* E_BOOK_BACKEND_GET_CLASS (backend)->get_contact_list_uids) (backend, book, opid, cancellable, query);
1 by Sebastien Bacher
Import upstream version 1.2.1
712
}
713
1.1.1 by Daniel Holbach
Import upstream version 1.4.1
714
/**
715
 * e_book_backend_start_book_view:
716
 * @backend: an #EBookBackend
1.10.8 by Jordi Mallach
Import upstream version 3.4.1
717
 * @view: the #EDataBookView to start
1.1.1 by Daniel Holbach
Import upstream version 1.4.1
718
 *
1.10.8 by Jordi Mallach
Import upstream version 3.4.1
719
 * Starts running the query specified by @view, emitting signals for
720
 * matching contacts.
1.1.1 by Daniel Holbach
Import upstream version 1.4.1
721
 **/
1 by Sebastien Bacher
Import upstream version 1.2.1
722
void
1.1.92 by Mathieu Trudel-Lapierre
Import upstream version 3.1.91
723
e_book_backend_start_book_view (EBookBackend *backend,
1.10.8 by Jordi Mallach
Import upstream version 3.4.1
724
                                EDataBookView *view)
1 by Sebastien Bacher
Import upstream version 1.2.1
725
{
726
	g_return_if_fail (E_IS_BOOK_BACKEND (backend));
1.10.8 by Jordi Mallach
Import upstream version 3.4.1
727
	g_return_if_fail (E_IS_DATA_BOOK_VIEW (view));
1.1.88 by Mathieu Trudel-Lapierre
Import upstream version 3.1.2
728
	g_return_if_fail (E_BOOK_BACKEND_GET_CLASS (backend)->start_book_view);
1.10.7 by Josselin Mouette
Import upstream version 2.91.92
729
1.10.8 by Jordi Mallach
Import upstream version 3.4.1
730
	(* E_BOOK_BACKEND_GET_CLASS (backend)->start_book_view) (backend, view);
1 by Sebastien Bacher
Import upstream version 1.2.1
731
}
732
1.1.1 by Daniel Holbach
Import upstream version 1.4.1
733
/**
734
 * e_book_backend_stop_book_view:
735
 * @backend: an #EBookBackend
1.10.8 by Jordi Mallach
Import upstream version 3.4.1
736
 * @view: the #EDataBookView to stop
1.1.1 by Daniel Holbach
Import upstream version 1.4.1
737
 *
1.10.8 by Jordi Mallach
Import upstream version 3.4.1
738
 * Stops running the query specified by @view, emitting no more signals.
1.1.1 by Daniel Holbach
Import upstream version 1.4.1
739
 **/
1 by Sebastien Bacher
Import upstream version 1.2.1
740
void
1.1.92 by Mathieu Trudel-Lapierre
Import upstream version 3.1.91
741
e_book_backend_stop_book_view (EBookBackend *backend,
1.10.8 by Jordi Mallach
Import upstream version 3.4.1
742
                               EDataBookView *view)
1 by Sebastien Bacher
Import upstream version 1.2.1
743
{
744
	g_return_if_fail (E_IS_BOOK_BACKEND (backend));
1.10.8 by Jordi Mallach
Import upstream version 3.4.1
745
	g_return_if_fail (E_IS_DATA_BOOK_VIEW (view));
1.1.88 by Mathieu Trudel-Lapierre
Import upstream version 3.1.2
746
	g_return_if_fail (E_BOOK_BACKEND_GET_CLASS (backend)->stop_book_view);
1.10.7 by Josselin Mouette
Import upstream version 2.91.92
747
1.10.8 by Jordi Mallach
Import upstream version 3.4.1
748
	(* E_BOOK_BACKEND_GET_CLASS (backend)->stop_book_view) (backend, view);
1 by Sebastien Bacher
Import upstream version 1.2.1
749
}
750
1.1.1 by Daniel Holbach
Import upstream version 1.4.1
751
/**
752
 * e_book_backend_add_book_view:
753
 * @backend: an #EBookBackend
754
 * @view: an #EDataBookView
755
 *
756
 * Adds @view to @backend for querying.
757
 **/
1 by Sebastien Bacher
Import upstream version 1.2.1
758
void
759
e_book_backend_add_book_view (EBookBackend *backend,
1.1.92 by Mathieu Trudel-Lapierre
Import upstream version 3.1.91
760
                              EDataBookView *view)
1 by Sebastien Bacher
Import upstream version 1.2.1
761
{
762
	g_return_if_fail (E_IS_BOOK_BACKEND (backend));
763
764
	g_mutex_lock (backend->priv->views_mutex);
765
1.10.8 by Jordi Mallach
Import upstream version 3.4.1
766
	e_data_book_view_ref (view);
1.1.88 by Mathieu Trudel-Lapierre
Import upstream version 3.1.2
767
	backend->priv->views = g_slist_append (backend->priv->views, view);
1 by Sebastien Bacher
Import upstream version 1.2.1
768
769
	g_mutex_unlock (backend->priv->views_mutex);
770
}
771
1.1.1 by Daniel Holbach
Import upstream version 1.4.1
772
/**
773
 * e_book_backend_remove_book_view:
774
 * @backend: an #EBookBackend
775
 * @view: an #EDataBookView
776
 *
777
 * Removes @view from @backend.
778
 **/
1 by Sebastien Bacher
Import upstream version 1.2.1
779
void
780
e_book_backend_remove_book_view (EBookBackend *backend,
1.1.92 by Mathieu Trudel-Lapierre
Import upstream version 3.1.91
781
                                 EDataBookView *view)
1 by Sebastien Bacher
Import upstream version 1.2.1
782
{
783
	g_return_if_fail (E_IS_BOOK_BACKEND (backend));
784
785
	g_mutex_lock (backend->priv->views_mutex);
786
1.1.88 by Mathieu Trudel-Lapierre
Import upstream version 3.1.2
787
	backend->priv->views = g_slist_remove (backend->priv->views, view);
1.10.8 by Jordi Mallach
Import upstream version 3.4.1
788
	e_data_book_view_unref (view);
1 by Sebastien Bacher
Import upstream version 1.2.1
789
790
	g_mutex_unlock (backend->priv->views_mutex);
791
}
792
793
/**
794
 * e_book_backend_add_client:
795
 * @backend: An addressbook backend.
796
 * @book: the corba object representing the client connection.
797
 *
798
 * Adds a client to an addressbook backend.
799
 *
1.11.3 by Yves-Alexis Perez
Import upstream version 2.30.1
800
 * Returns: TRUE on success, FALSE on failure to add the client.
1 by Sebastien Bacher
Import upstream version 1.2.1
801
 */
802
gboolean
1.1.92 by Mathieu Trudel-Lapierre
Import upstream version 3.1.91
803
e_book_backend_add_client (EBookBackend *backend,
804
                           EDataBook *book)
1 by Sebastien Bacher
Import upstream version 1.2.1
805
{
806
	g_return_val_if_fail (E_IS_BOOK_BACKEND (backend), FALSE);
807
	g_return_val_if_fail (E_IS_DATA_BOOK (book), FALSE);
808
809
	g_mutex_lock (backend->priv->clients_mutex);
1.1.88 by Mathieu Trudel-Lapierre
Import upstream version 3.1.2
810
	backend->priv->clients = g_slist_prepend (backend->priv->clients, book);
1 by Sebastien Bacher
Import upstream version 1.2.1
811
	g_mutex_unlock (backend->priv->clients_mutex);
812
813
	return TRUE;
814
}
815
1.1.1 by Daniel Holbach
Import upstream version 1.4.1
816
/**
817
 * e_book_backend_remove_client:
818
 * @backend: an #EBookBackend
819
 * @book: an #EDataBook to remove
820
 *
821
 * Removes @book from the list of @backend's clients.
822
 **/
1 by Sebastien Bacher
Import upstream version 1.2.1
823
void
824
e_book_backend_remove_client (EBookBackend *backend,
1.1.92 by Mathieu Trudel-Lapierre
Import upstream version 3.1.91
825
                              EDataBook *book)
1 by Sebastien Bacher
Import upstream version 1.2.1
826
{
827
	g_return_if_fail (E_IS_BOOK_BACKEND (backend));
828
	g_return_if_fail (E_IS_DATA_BOOK (book));
829
1.1.100 by Mathieu Trudel-Lapierre
Import upstream version 3.5.3.1
830
	/* Make sure the backend stays alive while holding the mutex. */
1 by Sebastien Bacher
Import upstream version 1.2.1
831
	g_object_ref (backend);
832
833
	/* Disconnect */
834
	g_mutex_lock (backend->priv->clients_mutex);
1.1.88 by Mathieu Trudel-Lapierre
Import upstream version 3.1.2
835
	backend->priv->clients = g_slist_remove (backend->priv->clients, book);
1 by Sebastien Bacher
Import upstream version 1.2.1
836
1.1.100 by Mathieu Trudel-Lapierre
Import upstream version 3.5.3.1
837
	if (backend->priv->clients == NULL)
1.1.92 by Mathieu Trudel-Lapierre
Import upstream version 3.1.91
838
		backend->priv->opening = FALSE;
1.1.39 by Sebastien Bacher
Import upstream version 2.21.3
839
1 by Sebastien Bacher
Import upstream version 1.2.1
840
	g_mutex_unlock (backend->priv->clients_mutex);
841
842
	g_object_unref (backend);
843
}
844
1.1.1 by Daniel Holbach
Import upstream version 1.4.1
845
/**
1.1.88 by Mathieu Trudel-Lapierre
Import upstream version 3.1.2
846
 * e_book_backend_foreach_view:
847
 * @backend: an #EBookBackend
848
 * @callback: callback to call
849
 * @user_data: user_data passed into the @callback
850
 *
851
 * Calls @callback for each known book view of this @backend.
852
 * @callback returns %FALSE to stop further processing.
1.1.92 by Mathieu Trudel-Lapierre
Import upstream version 3.1.91
853
 *
854
 * Since: 3.2
1.1.88 by Mathieu Trudel-Lapierre
Import upstream version 3.1.2
855
 **/
856
void
1.1.92 by Mathieu Trudel-Lapierre
Import upstream version 3.1.91
857
e_book_backend_foreach_view (EBookBackend *backend,
858
                             gboolean (*callback) (EDataBookView *view,
859
                                                   gpointer user_data),
860
                             gpointer user_data)
1.1.88 by Mathieu Trudel-Lapierre
Import upstream version 3.1.2
861
{
862
	const GSList *views;
863
	EDataBookView *view;
864
	gboolean stop = FALSE;
865
866
	g_return_if_fail (backend != NULL);
867
	g_return_if_fail (callback != NULL);
868
869
	g_mutex_lock (backend->priv->views_mutex);
870
871
	for (views = backend->priv->views; views && !stop; views = views->next) {
872
		view = E_DATA_BOOK_VIEW (views->data);
873
		stop = !callback (view, user_data);
874
	}
875
876
	g_mutex_unlock (backend->priv->views_mutex);
877
}
878
879
/**
880
 * e_book_backend_get_book_backend_property:
881
 * @backend: an #EBookBackend
882
 * @book: an #EDataBook
883
 * @opid: the ID to use for this operation
884
 * @cancellable: a #GCancellable for the operation
885
 * @prop_name: property name to get value of; cannot be NULL
886
 *
887
 * Calls the get_backend_property method on the given backend.
888
 * This might be finished with e_data_book_respond_get_backend_property().
889
 * Default implementation takes care of common properties and returns
890
 * an 'unsupported' error for any unknown properties. The subclass may
891
 * always call this default implementation for properties which fetching
892
 * it doesn't overwrite.
893
 *
894
 * Since: 3.2
895
 **/
896
void
1.1.92 by Mathieu Trudel-Lapierre
Import upstream version 3.1.91
897
e_book_backend_get_backend_property (EBookBackend *backend,
898
                                     EDataBook *book,
899
                                     guint32 opid,
900
                                     GCancellable *cancellable,
901
                                     const gchar *prop_name)
1.1.88 by Mathieu Trudel-Lapierre
Import upstream version 3.1.2
902
{
903
	g_return_if_fail (E_IS_BOOK_BACKEND (backend));
904
	g_return_if_fail (E_BOOK_BACKEND_GET_CLASS (backend)->get_backend_property);
905
906
	E_BOOK_BACKEND_GET_CLASS (backend)->get_backend_property (backend, book, opid, cancellable, prop_name);
907
}
908
909
/**
910
 * e_book_backend_set_backend_property:
911
 * @backend: an #EBookBackend
912
 * @book: an #EDataBook
913
 * @opid: the ID to use for this operation
914
 * @cancellable: a #GCancellable for the operation
915
 * @prop_name: property name to change; cannot be NULL
916
 * @prop_value: value to set to @prop_name; cannot be NULL
917
 *
918
 * Calls the set_backend_property method on the given backend.
919
 * This might be finished with e_data_book_respond_set_backend_property().
920
 * Default implementation simply returns an 'unsupported' error.
921
 * The subclass may always call this default implementation for properties
922
 * which fetching it doesn't overwrite.
923
 *
924
 * Since: 3.2
925
 **/
926
void
1.1.92 by Mathieu Trudel-Lapierre
Import upstream version 3.1.91
927
e_book_backend_set_backend_property (EBookBackend *backend,
928
                                     EDataBook *book,
929
                                     guint32 opid,
930
                                     GCancellable *cancellable,
931
                                     const gchar *prop_name,
932
                                     const gchar *prop_value)
1.1.88 by Mathieu Trudel-Lapierre
Import upstream version 3.1.2
933
{
934
	g_return_if_fail (backend != NULL);
935
	g_return_if_fail (E_IS_BOOK_BACKEND (backend));
936
	g_return_if_fail (prop_name != NULL);
937
	g_return_if_fail (prop_value != NULL);
938
	g_return_if_fail (E_BOOK_BACKEND_GET_CLASS (backend)->set_backend_property != NULL);
939
940
	E_BOOK_BACKEND_GET_CLASS (backend)->set_backend_property (backend, book, opid, cancellable, prop_name, prop_value);
941
}
942
943
/**
944
 * e_book_backend_is_opened:
945
 * @backend: an #EBookBackend
946
 *
947
 * Checks if @backend's storage has been opened (and
948
 * authenticated, if necessary) and the backend itself
949
 * is ready for accessing. This property is changed automatically
950
 * within call of e_book_backend_notify_opened().
951
 *
952
 * Returns: %TRUE if fully opened, %FALSE otherwise.
1.1.92 by Mathieu Trudel-Lapierre
Import upstream version 3.1.91
953
 *
954
 * Since: 3.2
1.1.88 by Mathieu Trudel-Lapierre
Import upstream version 3.1.2
955
 **/
956
gboolean
957
e_book_backend_is_opened (EBookBackend *backend)
958
{
959
	g_return_val_if_fail (E_IS_BOOK_BACKEND (backend), FALSE);
960
961
	return backend->priv->opened;
962
}
963
964
/**
965
 * e_book_backend_is_opening:
966
 * @backend: an #EBookBackend
967
 *
968
 * Checks if @backend is processing its opening phase, which
969
 * includes everything since the e_book_backend_open() call,
970
 * through authentication, up to e_book_backend_notify_opened().
971
 * This property is managed automatically and the backend deny
972
 * every operation except of cancel and authenticate_user while
973
 * it is being opening.
974
 *
975
 * Returns: %TRUE if opening phase is in the effect, %FALSE otherwise.
1.1.92 by Mathieu Trudel-Lapierre
Import upstream version 3.1.91
976
 *
977
 * Since: 3.2
1.1.88 by Mathieu Trudel-Lapierre
Import upstream version 3.1.2
978
 **/
979
gboolean
980
e_book_backend_is_opening (EBookBackend *backend)
981
{
982
	g_return_val_if_fail (E_IS_BOOK_BACKEND (backend), FALSE);
983
984
	return backend->priv->opening;
985
}
986
987
/**
988
 * e_book_backend_is_readonly:
1.1.1 by Daniel Holbach
Import upstream version 1.4.1
989
 * @backend: an #EBookBackend
990
 *
991
 * Checks if we can write to @backend.
992
 *
1.11.3 by Yves-Alexis Perez
Import upstream version 2.30.1
993
 * Returns: %TRUE if writeable, %FALSE if not.
1.1.92 by Mathieu Trudel-Lapierre
Import upstream version 3.1.91
994
 *
995
 * Since: 3.2
1.1.1 by Daniel Holbach
Import upstream version 1.4.1
996
 **/
1 by Sebastien Bacher
Import upstream version 1.2.1
997
gboolean
1.1.88 by Mathieu Trudel-Lapierre
Import upstream version 3.1.2
998
e_book_backend_is_readonly (EBookBackend *backend)
1 by Sebastien Bacher
Import upstream version 1.2.1
999
{
1000
	g_return_val_if_fail (E_IS_BOOK_BACKEND (backend), FALSE);
1.1.39 by Sebastien Bacher
Import upstream version 2.21.3
1001
1.1.88 by Mathieu Trudel-Lapierre
Import upstream version 3.1.2
1002
	return backend->priv->readonly;
1 by Sebastien Bacher
Import upstream version 1.2.1
1003
}
1004
1.1.1 by Daniel Holbach
Import upstream version 1.4.1
1005
/**
1006
 * e_book_backend_is_removed:
1007
 * @backend: an #EBookBackend
1008
 *
1009
 * Checks if @backend has been removed from its physical storage.
1010
 *
1.11.3 by Yves-Alexis Perez
Import upstream version 2.30.1
1011
 * Returns: %TRUE if @backend has been removed, %FALSE otherwise.
1.1.1 by Daniel Holbach
Import upstream version 1.4.1
1012
 **/
1 by Sebastien Bacher
Import upstream version 1.2.1
1013
gboolean
1014
e_book_backend_is_removed (EBookBackend *backend)
1015
{
1016
	g_return_val_if_fail (E_IS_BOOK_BACKEND (backend), FALSE);
1.1.39 by Sebastien Bacher
Import upstream version 2.21.3
1017
1 by Sebastien Bacher
Import upstream version 1.2.1
1018
	return backend->priv->removed;
1019
}
1020
1.1.1 by Daniel Holbach
Import upstream version 1.4.1
1021
/**
1022
 * e_book_backend_set_is_removed:
1023
 * @backend: an #EBookBackend
1024
 * @is_removed: A flag indicating whether the backend's storage was removed
1025
 *
1026
 * Sets the flag indicating whether @backend was removed to @is_removed.
1027
 * Meant to be used by backend implementations.
1028
 **/
1 by Sebastien Bacher
Import upstream version 1.2.1
1029
void
1.1.92 by Mathieu Trudel-Lapierre
Import upstream version 3.1.91
1030
e_book_backend_set_is_removed (EBookBackend *backend,
1031
                               gboolean is_removed)
1 by Sebastien Bacher
Import upstream version 1.2.1
1032
{
1033
	g_return_if_fail (E_IS_BOOK_BACKEND (backend));
1.1.39 by Sebastien Bacher
Import upstream version 2.21.3
1034
1 by Sebastien Bacher
Import upstream version 1.2.1
1035
	backend->priv->removed = is_removed;
1036
}
1037
1.1.1 by Daniel Holbach
Import upstream version 1.4.1
1038
/**
1.1.28 by Sebastien Bacher
Import upstream version 1.11.2
1039
 * e_book_backend_sync:
1040
 * @backend: an #EBookbackend
1041
 *
1042
 * Write all pending data to disk.  This is only required under special
1043
 * circumstances (for example before a live backup) and should not be used in
1044
 * normal use.
1.11.3 by Yves-Alexis Perez
Import upstream version 2.30.1
1045
 *
1046
 * Since: 1.12
1.1.28 by Sebastien Bacher
Import upstream version 1.11.2
1047
 */
1.1.39 by Sebastien Bacher
Import upstream version 2.21.3
1048
void
1.1.28 by Sebastien Bacher
Import upstream version 1.11.2
1049
e_book_backend_sync (EBookBackend *backend)
1050
{
1051
	g_return_if_fail (E_IS_BOOK_BACKEND (backend));
1.1.39 by Sebastien Bacher
Import upstream version 2.21.3
1052
1.10.7 by Josselin Mouette
Import upstream version 2.91.92
1053
	g_object_ref (backend);
1054
1.1.28 by Sebastien Bacher
Import upstream version 1.11.2
1055
	if (E_BOOK_BACKEND_GET_CLASS (backend)->sync)
1056
		(* E_BOOK_BACKEND_GET_CLASS (backend)->sync) (backend);
1.10.7 by Josselin Mouette
Import upstream version 2.91.92
1057
1058
	g_object_unref (backend);
1.1.28 by Sebastien Bacher
Import upstream version 1.11.2
1059
}
1060
1061
/**
1 by Sebastien Bacher
Import upstream version 1.2.1
1062
 * e_book_backend_notify_update:
1.1.1 by Daniel Holbach
Import upstream version 1.4.1
1063
 * @backend: an #EBookBackend
1 by Sebastien Bacher
Import upstream version 1.2.1
1064
 * @contact: a new or modified contact
1065
 *
1066
 * Notifies all of @backend's book views about the new or modified
1067
 * contacts @contact.
1068
 *
1.10.8 by Jordi Mallach
Import upstream version 3.4.1
1069
 * e_data_book_respond_create_contacts() and e_data_book_respond_modify_contacts() call this
1 by Sebastien Bacher
Import upstream version 1.2.1
1070
 * function for you. You only need to call this from your backend if
1071
 * contacts are created or modified by another (non-PAS-using) client.
1072
 **/
1073
void
1.1.92 by Mathieu Trudel-Lapierre
Import upstream version 3.1.91
1074
e_book_backend_notify_update (EBookBackend *backend,
1075
                              const EContact *contact)
1 by Sebastien Bacher
Import upstream version 1.2.1
1076
{
1.1.91 by Mathieu Trudel-Lapierre
Import upstream version 3.1.5
1077
	E_BOOK_BACKEND_GET_CLASS (backend)->notify_update (backend, contact);
1 by Sebastien Bacher
Import upstream version 1.2.1
1078
}
1079
1.1.88 by Mathieu Trudel-Lapierre
Import upstream version 3.1.2
1080
static gboolean
1.1.92 by Mathieu Trudel-Lapierre
Import upstream version 3.1.91
1081
view_notify_remove (EDataBookView *view,
1082
                    gpointer id)
1 by Sebastien Bacher
Import upstream version 1.2.1
1083
{
1084
	e_data_book_view_notify_remove (view, id);
1.1.88 by Mathieu Trudel-Lapierre
Import upstream version 3.1.2
1085
1086
	return TRUE;
1 by Sebastien Bacher
Import upstream version 1.2.1
1087
}
1088
1089
/**
1090
 * e_book_backend_notify_remove:
1.1.1 by Daniel Holbach
Import upstream version 1.4.1
1091
 * @backend: an #EBookBackend
1 by Sebastien Bacher
Import upstream version 1.2.1
1092
 * @id: a contact id
1093
 *
1094
 * Notifies all of @backend's book views that the contact with UID
1095
 * @id has been removed.
1096
 *
1097
 * e_data_book_respond_remove_contacts() calls this function for you. You
1098
 * only need to call this from your backend if contacts are removed by
1099
 * another (non-PAS-using) client.
1100
 **/
1101
void
1.1.92 by Mathieu Trudel-Lapierre
Import upstream version 3.1.91
1102
e_book_backend_notify_remove (EBookBackend *backend,
1103
                              const gchar *id)
1 by Sebastien Bacher
Import upstream version 1.2.1
1104
{
1.1.88 by Mathieu Trudel-Lapierre
Import upstream version 3.1.2
1105
	e_book_backend_foreach_view (backend, view_notify_remove, (gpointer) id);
1 by Sebastien Bacher
Import upstream version 1.2.1
1106
}
1107
1.1.88 by Mathieu Trudel-Lapierre
Import upstream version 3.1.2
1108
static gboolean
1.1.92 by Mathieu Trudel-Lapierre
Import upstream version 3.1.91
1109
view_notify_complete (EDataBookView *view,
1110
                      gpointer unused)
1 by Sebastien Bacher
Import upstream version 1.2.1
1111
{
1.1.82 by Mathieu Trudel-Lapierre
Import upstream version 2.32.0
1112
	e_data_book_view_notify_complete (view, NULL /* SUCCESS */);
1.1.88 by Mathieu Trudel-Lapierre
Import upstream version 3.1.2
1113
1114
	return TRUE;
1 by Sebastien Bacher
Import upstream version 1.2.1
1115
}
1116
1117
/**
1118
 * e_book_backend_notify_complete:
1.1.1 by Daniel Holbach
Import upstream version 1.4.1
1119
 * @backend: an #EBookbackend
1 by Sebastien Bacher
Import upstream version 1.2.1
1120
 *
1121
 * Notifies all of @backend's book views that the current set of
1122
 * notifications is complete; use this after a series of
1123
 * e_book_backend_notify_update() and e_book_backend_notify_remove() calls.
1124
 **/
1125
void
1126
e_book_backend_notify_complete (EBookBackend *backend)
1127
{
1128
	e_book_backend_foreach_view (backend, view_notify_complete, NULL);
1129
}
1130
1131

1.1.1 by Daniel Holbach
Import upstream version 1.4.1
1132
/**
1.1.88 by Mathieu Trudel-Lapierre
Import upstream version 3.1.2
1133
 * e_book_backend_notify_error:
1134
 * @backend: an #EBookBackend
1135
 * @message: an error message
1136
 *
1137
 * Notifies each backend listener about an error. This is meant to be used
1138
 * for cases where is no GError return possibility, to notify user about
1139
 * an issue.
1.1.92 by Mathieu Trudel-Lapierre
Import upstream version 3.1.91
1140
 *
1141
 * Since: 3.2
1.1.88 by Mathieu Trudel-Lapierre
Import upstream version 3.1.2
1142
 **/
1143
void
1.1.92 by Mathieu Trudel-Lapierre
Import upstream version 3.1.91
1144
e_book_backend_notify_error (EBookBackend *backend,
1145
                             const gchar *message)
1.1.88 by Mathieu Trudel-Lapierre
Import upstream version 3.1.2
1146
{
1147
	EBookBackendPrivate *priv;
1148
	GSList *clients;
1149
1150
	priv = backend->priv;
1151
1152
	g_mutex_lock (priv->clients_mutex);
1153
1154
	for (clients = priv->clients; clients != NULL; clients = g_slist_next (clients))
1155
		e_data_book_report_error (E_DATA_BOOK (clients->data), message);
1156
1157
	g_mutex_unlock (priv->clients_mutex);
1158
}
1159
1160
/**
1161
 * e_book_backend_notify_readonly:
1162
 * @backend: an #EBookBackend
1163
 * @is_readonly: flag indicating readonly status
1164
 *
1165
 * Notifies all backend's clients about the current readonly state.
1.1.92 by Mathieu Trudel-Lapierre
Import upstream version 3.1.91
1166
 *
1167
 * Since: 3.2
1.1.88 by Mathieu Trudel-Lapierre
Import upstream version 3.1.2
1168
 **/
1169
void
1.1.92 by Mathieu Trudel-Lapierre
Import upstream version 3.1.91
1170
e_book_backend_notify_readonly (EBookBackend *backend,
1171
                                gboolean is_readonly)
1.1.88 by Mathieu Trudel-Lapierre
Import upstream version 3.1.2
1172
{
1173
	EBookBackendPrivate *priv;
1174
	GSList *clients;
1175
1176
	priv = backend->priv;
1177
	priv->readonly = is_readonly;
1178
	g_mutex_lock (priv->clients_mutex);
1179
1180
	for (clients = priv->clients; clients != NULL; clients = g_slist_next (clients))
1181
		e_data_book_report_readonly (E_DATA_BOOK (clients->data), is_readonly);
1182
1183
	g_mutex_unlock (priv->clients_mutex);
1184
1185
}
1186
1187
/**
1188
 * e_book_backend_notify_online:
1.1.1 by Daniel Holbach
Import upstream version 1.4.1
1189
 * @backend: an #EBookBackend
1190
 * @is_online: flag indicating whether @backend is connected and online
1191
 *
1192
 * Notifies clients of @backend's connection status indicated by @is_online.
1193
 * Meant to be used by backend implementations.
1.1.92 by Mathieu Trudel-Lapierre
Import upstream version 3.1.91
1194
 *
1195
 * Since: 3.2
1.1.1 by Daniel Holbach
Import upstream version 1.4.1
1196
 **/
1.1.39 by Sebastien Bacher
Import upstream version 2.21.3
1197
void
1.1.92 by Mathieu Trudel-Lapierre
Import upstream version 3.1.91
1198
e_book_backend_notify_online (EBookBackend *backend,
1199
                              gboolean is_online)
1 by Sebastien Bacher
Import upstream version 1.2.1
1200
{
1201
	EBookBackendPrivate *priv;
1.1.88 by Mathieu Trudel-Lapierre
Import upstream version 3.1.2
1202
	GSList *clients;
1.1.39 by Sebastien Bacher
Import upstream version 2.21.3
1203
1 by Sebastien Bacher
Import upstream version 1.2.1
1204
	priv = backend->priv;
1.1.32 by Sebastien Bacher
Import upstream version 1.11.6
1205
	priv->online = is_online;
1 by Sebastien Bacher
Import upstream version 1.2.1
1206
	g_mutex_lock (priv->clients_mutex);
1.1.39 by Sebastien Bacher
Import upstream version 2.21.3
1207
1.1.88 by Mathieu Trudel-Lapierre
Import upstream version 3.1.2
1208
	for (clients = priv->clients; clients != NULL; clients = g_slist_next (clients))
1209
		e_data_book_report_online (E_DATA_BOOK (clients->data), is_online);
1 by Sebastien Bacher
Import upstream version 1.2.1
1210
1211
	g_mutex_unlock (priv->clients_mutex);
1212
}
1213
1.1.1 by Daniel Holbach
Import upstream version 1.4.1
1214
/**
1.1.88 by Mathieu Trudel-Lapierre
Import upstream version 3.1.2
1215
 * e_book_backend_notify_opened:
1216
 * @backend: an #EBookBackend
1217
 * @error: a #GError corresponding to the error encountered during
1218
 *    the opening phase. Use %NULL for success. The @error is freed
1219
 *    automatically if not %NULL.
1220
 *
1221
 * Notifies clients that @backend finished its opening phase.
1222
 * See e_book_backend_open() for more information how the opening
1223
 * phase works. Calling this function changes 'opening' property,
1224
 * same as 'opened'. 'opening' is set to %FALSE and the backend
1225
 * is considered 'opened' only if the @error is %NULL.
1226
 *
1227
 * See also: e_book_backend_respond_opened()
1228
 *
1229
 * Note: The @error is freed automatically if not %NULL.
1230
 *
1231
 * Meant to be used by backend implementations.
1.1.92 by Mathieu Trudel-Lapierre
Import upstream version 3.1.91
1232
 *
1233
 * Since: 3.2
1.1.88 by Mathieu Trudel-Lapierre
Import upstream version 3.1.2
1234
 **/
1235
void
1.1.92 by Mathieu Trudel-Lapierre
Import upstream version 3.1.91
1236
e_book_backend_notify_opened (EBookBackend *backend,
1237
                              GError *error)
1.1.88 by Mathieu Trudel-Lapierre
Import upstream version 3.1.2
1238
{
1239
	EBookBackendPrivate *priv;
1240
	GSList *clients;
1241
1242
	priv = backend->priv;
1243
	g_mutex_lock (priv->clients_mutex);
1244
1245
	priv->opening = FALSE;
1246
	priv->opened = error == NULL;
1247
1248
	for (clients = priv->clients; clients != NULL; clients = g_slist_next (clients))
1249
		e_data_book_report_opened (E_DATA_BOOK (clients->data), error);
1250
1251
	g_mutex_unlock (priv->clients_mutex);
1252
1253
	if (error)
1254
		g_error_free (error);
1255
}
1256
1257
/**
1.1.91 by Mathieu Trudel-Lapierre
Import upstream version 3.1.5
1258
 * e_book_backend_notify_property_changed:
1259
 * @backend: an #EBookBackend
1260
 * @prop_name: property name, which changed
1261
 * @prop_value: new property value
1262
 *
1263
 * Notifies clients about property value change.
1.1.92 by Mathieu Trudel-Lapierre
Import upstream version 3.1.91
1264
 *
1265
 * Since: 3.2
1.1.91 by Mathieu Trudel-Lapierre
Import upstream version 3.1.5
1266
 **/
1267
void
1.1.92 by Mathieu Trudel-Lapierre
Import upstream version 3.1.91
1268
e_book_backend_notify_property_changed (EBookBackend *backend,
1269
                                        const gchar *prop_name,
1270
                                        const gchar *prop_value)
1.1.91 by Mathieu Trudel-Lapierre
Import upstream version 3.1.5
1271
{
1272
	EBookBackendPrivate *priv;
1273
	GSList *clients;
1274
1275
	g_return_if_fail (E_IS_BOOK_BACKEND (backend));
1276
	g_return_if_fail (prop_name != NULL);
1277
	g_return_if_fail (*prop_name != '\0');
1278
	g_return_if_fail (prop_value != NULL);
1279
1280
	priv = backend->priv;
1281
	g_mutex_lock (priv->clients_mutex);
1282
1283
	for (clients = priv->clients; clients != NULL; clients = g_slist_next (clients))
1284
		e_data_book_report_backend_property_changed (E_DATA_BOOK (clients->data), prop_name, prop_value);
1285
1286
	g_mutex_unlock (priv->clients_mutex);
1287
}
1288
1289
/**
1.1.88 by Mathieu Trudel-Lapierre
Import upstream version 3.1.2
1290
 * e_book_backend_respond_opened:
1291
 * @backend: an #EBookBackend
1292
 * @book: an #EDataBook
1293
 * @opid: an operation ID
1294
 * @error: result error; can be %NULL, if it isn't then it's automatically freed
1295
 *
1296
 * This is a replacement for e_data_book_respond_open() for cases where
1297
 * the finish of 'open' method call also finishes backend opening phase.
1.1.89 by Mathieu Trudel-Lapierre
Import upstream version 3.1.3.1
1298
 * This function covers calling of both e_book_backend_notify_opened()
1299
 * and e_data_book_respond_open() with the same @error.
1.1.88 by Mathieu Trudel-Lapierre
Import upstream version 3.1.2
1300
 *
1301
 * See e_book_backend_open() for more details how the opening phase works.
1.1.92 by Mathieu Trudel-Lapierre
Import upstream version 3.1.91
1302
 *
1303
 * Since: 3.2
1.1.88 by Mathieu Trudel-Lapierre
Import upstream version 3.1.2
1304
 **/
1305
void
1.1.92 by Mathieu Trudel-Lapierre
Import upstream version 3.1.91
1306
e_book_backend_respond_opened (EBookBackend *backend,
1307
                               EDataBook *book,
1308
                               guint32 opid,
1309
                               GError *error)
1.1.88 by Mathieu Trudel-Lapierre
Import upstream version 3.1.2
1310
{
1311
	GError *copy = NULL;
1312
1313
	g_return_if_fail (backend != NULL);
1314
	g_return_if_fail (E_IS_BOOK_BACKEND (backend));
1315
	g_return_if_fail (book != NULL);
1316
	g_return_if_fail (opid != 0);
1317
1318
	if (error)
1319
		copy = g_error_copy (error);
1320
1.1.89 by Mathieu Trudel-Lapierre
Import upstream version 3.1.3.1
1321
	e_book_backend_notify_opened (backend, copy);
1.1.88 by Mathieu Trudel-Lapierre
Import upstream version 3.1.2
1322
	e_data_book_respond_open (book, opid, error);
1323
}