2 * e-mail-config-provider-page.c
4 * This program is free software; you can redistribute it and/or
5 * modify it under the terms of the GNU Lesser General Public
6 * License as published by the Free Software Foundation; either
7 * version 2 of the License, or (at your option) version 3.
9 * This program is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12 * Lesser General Public License for more details.
14 * You should have received a copy of the GNU Lesser General Public
15 * License along with the program; if not, see <http://www.gnu.org/licenses/>
19 #include "e-mail-config-provider-page.h"
23 #include <glib/gi18n-lib.h>
25 #include <libebackend/libebackend.h>
27 #define E_MAIL_CONFIG_PROVIDER_PAGE_GET_PRIVATE(obj) \
28 (G_TYPE_INSTANCE_GET_PRIVATE \
29 ((obj), E_TYPE_MAIL_CONFIG_PROVIDER_PAGE, EMailConfigProviderPagePrivate))
31 #define STANDARD_MARGIN 12
32 #define DEPENDENCY_MARGIN 24
34 struct _EMailConfigProviderPagePrivate
{
35 EMailConfigServiceBackend
*backend
;
44 /* Forward Declarations */
45 static void e_mail_config_provider_page_interface_init
46 (EMailConfigPageInterface
*interface
);
48 G_DEFINE_TYPE_WITH_CODE (
49 EMailConfigProviderPage
,
50 e_mail_config_provider_page
,
51 E_TYPE_MAIL_CONFIG_ACTIVITY_PAGE
,
52 G_IMPLEMENT_INTERFACE (
53 E_TYPE_EXTENSIBLE
, NULL
)
54 G_IMPLEMENT_INTERFACE (
55 E_TYPE_MAIL_CONFIG_PAGE
,
56 e_mail_config_provider_page_interface_init
))
59 mail_config_provider_page_handle_dependency (EMailConfigProviderPage
*page
,
60 CamelProviderConfEntry
*entry
,
63 EMailConfigServiceBackend
*backend
;
64 CamelSettings
*settings
;
65 GBindingFlags binding_flags
= G_BINDING_SYNC_CREATE
;
66 const gchar
*depname
= entry
->depname
;
72 if (*depname
== '!') {
73 binding_flags
|= G_BINDING_INVERT_BOOLEAN
;
77 backend
= e_mail_config_provider_page_get_backend (page
);
78 settings
= e_mail_config_service_backend_get_settings (backend
);
80 g_object_bind_property (
85 /* Further indent the widget to show its dependency. */
86 margin
= gtk_widget_get_margin_left (widget
);
87 gtk_widget_set_margin_left (widget
, margin
+ DEPENDENCY_MARGIN
);
91 mail_config_provider_page_add_section (EMailConfigProviderPage
*page
,
92 CamelProviderConfEntry
*entry
)
94 EMailConfigServiceBackend
*backend
;
95 CamelProvider
*provider
;
99 g_return_if_fail (entry
->text
!= NULL
);
101 backend
= e_mail_config_provider_page_get_backend (page
);
102 provider
= e_mail_config_service_backend_get_provider (backend
);
104 markup
= g_markup_printf_escaped ("<b>%s</b>", entry
->text
);
106 widget
= gtk_label_new (markup
);
107 gtk_label_set_use_markup (GTK_LABEL (widget
), TRUE
);
108 gtk_misc_set_alignment (GTK_MISC (widget
), 0.0, 0.5);
109 gtk_box_pack_start (GTK_BOX (page
), widget
, FALSE
, FALSE
, 0);
110 gtk_widget_show (widget
);
112 /* Skip the top margin if this is the first entry. */
113 if (entry
!= provider
->extra_conf
)
114 gtk_widget_set_margin_top (widget
, 6);
120 mail_config_provider_page_add_checkbox (EMailConfigProviderPage
*page
,
121 CamelProviderConfEntry
*entry
)
123 EMailConfigServiceBackend
*backend
;
124 CamelSettings
*settings
;
127 g_return_if_fail (entry
->text
!= NULL
);
129 backend
= e_mail_config_provider_page_get_backend (page
);
130 settings
= e_mail_config_service_backend_get_settings (backend
);
132 widget
= gtk_check_button_new_with_mnemonic (entry
->text
);
133 gtk_widget_set_margin_left (widget
, STANDARD_MARGIN
);
134 gtk_box_pack_start (GTK_BOX (page
), widget
, FALSE
, FALSE
, 0);
135 gtk_widget_show (widget
);
137 g_object_bind_property (
138 settings
, entry
->name
,
140 G_BINDING_BIDIRECTIONAL
|
141 G_BINDING_SYNC_CREATE
);
143 mail_config_provider_page_handle_dependency (page
, entry
, widget
);
147 mail_config_provider_page_add_checkspin (EMailConfigProviderPage
*page
,
148 CamelProviderConfEntry
*entry
)
150 EMailConfigServiceBackend
*backend
;
151 CamelSettings
*settings
;
154 GParamSpec
*use_pspec
;
155 GtkAdjustment
*adjustment
;
156 GtkWidget
*hbox
, *spin
;
158 gchar
*use_property_name
;
161 g_return_if_fail (entry
->text
!= NULL
);
163 backend
= e_mail_config_provider_page_get_backend (page
);
164 settings
= e_mail_config_service_backend_get_settings (backend
);
166 /* The entry->name property (e.g. "foo") should be numeric for the
167 * spin button. If a "use" boolean property exists (e.g. "use-foo")
168 * then a checkbox is also shown. */
170 class = G_OBJECT_GET_CLASS (settings
);
171 pspec
= g_object_class_find_property (class, entry
->name
);
172 g_return_if_fail (pspec
!= NULL
);
174 use_property_name
= g_strconcat ("use-", entry
->name
, NULL
);
175 use_pspec
= g_object_class_find_property (class, use_property_name
);
176 if (use_pspec
!= NULL
&& use_pspec
->value_type
!= G_TYPE_BOOLEAN
)
178 g_free (use_property_name
);
180 /* Make sure we can convert to and from doubles. */
182 g_value_type_transformable (
183 pspec
->value_type
, G_TYPE_DOUBLE
));
185 g_value_type_transformable (
186 G_TYPE_DOUBLE
, pspec
->value_type
));
188 if (G_IS_PARAM_SPEC_CHAR (pspec
)) {
189 GParamSpecChar
*pspec_char
;
190 pspec_char
= G_PARAM_SPEC_CHAR (pspec
);
191 adjustment
= gtk_adjustment_new (
192 (gdouble
) pspec_char
->default_value
,
193 (gdouble
) pspec_char
->minimum
,
194 (gdouble
) pspec_char
->maximum
,
197 } else if (G_IS_PARAM_SPEC_UCHAR (pspec
)) {
198 GParamSpecUChar
*pspec_uchar
;
199 pspec_uchar
= G_PARAM_SPEC_UCHAR (pspec
);
200 adjustment
= gtk_adjustment_new (
201 (gdouble
) pspec_uchar
->default_value
,
202 (gdouble
) pspec_uchar
->minimum
,
203 (gdouble
) pspec_uchar
->maximum
,
206 } else if (G_IS_PARAM_SPEC_INT (pspec
)) {
207 GParamSpecInt
*pspec_int
;
208 pspec_int
= G_PARAM_SPEC_INT (pspec
);
209 adjustment
= gtk_adjustment_new (
210 (gdouble
) pspec_int
->default_value
,
211 (gdouble
) pspec_int
->minimum
,
212 (gdouble
) pspec_int
->maximum
,
215 } else if (G_IS_PARAM_SPEC_UINT (pspec
)) {
216 GParamSpecUInt
*pspec_uint
;
217 pspec_uint
= G_PARAM_SPEC_UINT (pspec
);
218 adjustment
= gtk_adjustment_new (
219 (gdouble
) pspec_uint
->default_value
,
220 (gdouble
) pspec_uint
->minimum
,
221 (gdouble
) pspec_uint
->maximum
,
224 } else if (G_IS_PARAM_SPEC_LONG (pspec
)) {
225 GParamSpecLong
*pspec_long
;
226 pspec_long
= G_PARAM_SPEC_LONG (pspec
);
227 adjustment
= gtk_adjustment_new (
228 (gdouble
) pspec_long
->default_value
,
229 (gdouble
) pspec_long
->minimum
,
230 (gdouble
) pspec_long
->maximum
,
233 } else if (G_IS_PARAM_SPEC_ULONG (pspec
)) {
234 GParamSpecULong
*pspec_ulong
;
235 pspec_ulong
= G_PARAM_SPEC_ULONG (pspec
);
236 adjustment
= gtk_adjustment_new (
237 (gdouble
) pspec_ulong
->default_value
,
238 (gdouble
) pspec_ulong
->minimum
,
239 (gdouble
) pspec_ulong
->maximum
,
242 } else if (G_IS_PARAM_SPEC_FLOAT (pspec
)) {
243 GParamSpecFloat
*pspec_float
;
244 pspec_float
= G_PARAM_SPEC_FLOAT (pspec
);
245 adjustment
= gtk_adjustment_new (
246 (gdouble
) pspec_float
->default_value
,
247 (gdouble
) pspec_float
->minimum
,
248 (gdouble
) pspec_float
->maximum
,
251 } else if (G_IS_PARAM_SPEC_DOUBLE (pspec
)) {
252 GParamSpecDouble
*pspec_double
;
253 pspec_double
= G_PARAM_SPEC_DOUBLE (pspec
);
254 adjustment
= gtk_adjustment_new (
255 (gdouble
) pspec_double
->default_value
,
256 (gdouble
) pspec_double
->minimum
,
257 (gdouble
) pspec_double
->maximum
,
261 g_return_if_reached ();
263 pre
= g_alloca (strlen (entry
->text
) + 1);
264 strcpy (pre
, entry
->text
);
265 post
= strstr (pre
, "%s");
271 hbox
= gtk_hbox_new (FALSE
, 3);
272 gtk_widget_set_margin_left (hbox
, STANDARD_MARGIN
);
273 gtk_box_pack_start (GTK_BOX (page
), hbox
, FALSE
, FALSE
, 0);
274 gtk_widget_show (hbox
);
276 if (use_pspec
!= NULL
) {
277 prefix
= gtk_check_button_new_with_mnemonic (pre
);
279 g_object_bind_property (
280 settings
, use_pspec
->name
,
282 G_BINDING_BIDIRECTIONAL
|
283 G_BINDING_SYNC_CREATE
);
285 prefix
= gtk_label_new_with_mnemonic (pre
);
287 gtk_box_pack_start (GTK_BOX (hbox
), prefix
, FALSE
, TRUE
, 0);
288 gtk_widget_show (prefix
);
290 spin
= gtk_spin_button_new (adjustment
, 1.0, 0);
291 gtk_box_pack_start (GTK_BOX (hbox
), spin
, FALSE
, TRUE
, 0);
292 gtk_widget_show (spin
);
294 g_object_bind_property (
295 settings
, entry
->name
,
297 G_BINDING_BIDIRECTIONAL
|
298 G_BINDING_SYNC_CREATE
);
300 if (use_pspec
!= NULL
)
301 g_object_bind_property (
304 G_BINDING_SYNC_CREATE
);
307 GtkWidget
*label
= gtk_label_new_with_mnemonic (post
);
308 gtk_label_set_mnemonic_widget (GTK_LABEL (label
), prefix
);
309 gtk_box_pack_start (GTK_BOX (hbox
), label
, FALSE
, TRUE
, 0);
310 gtk_widget_show (label
);
313 mail_config_provider_page_handle_dependency (page
, entry
, hbox
);
317 mail_config_provider_page_add_entry (EMailConfigProviderPage
*page
,
318 CamelProviderConfEntry
*entry
)
320 EMailConfigServiceBackend
*backend
;
321 CamelSettings
*settings
;
326 g_return_if_fail (entry
->text
!= NULL
);
328 backend
= e_mail_config_provider_page_get_backend (page
);
329 settings
= e_mail_config_service_backend_get_settings (backend
);
331 hbox
= gtk_hbox_new (FALSE
, 0);
332 gtk_box_set_spacing (GTK_BOX (hbox
), 6);
333 gtk_widget_set_margin_left (hbox
, STANDARD_MARGIN
);
334 gtk_box_pack_start (GTK_BOX (page
), hbox
, FALSE
, FALSE
, 0);
335 gtk_widget_show (hbox
);
337 label
= gtk_label_new_with_mnemonic (entry
->text
);
338 gtk_misc_set_alignment (GTK_MISC (label
), 0.0, 0.5);
339 gtk_box_pack_start (GTK_BOX (hbox
), label
, FALSE
, FALSE
, 0);
340 gtk_widget_show (label
);
342 input
= gtk_entry_new ();
343 gtk_label_set_mnemonic_widget (GTK_LABEL (label
), input
);
344 gtk_box_pack_start (GTK_BOX (hbox
), input
, TRUE
, TRUE
, 0);
345 gtk_widget_show (input
);
347 g_object_bind_property (
348 settings
, entry
->name
,
350 G_BINDING_BIDIRECTIONAL
|
351 G_BINDING_SYNC_CREATE
);
353 g_object_bind_property (
356 G_BINDING_SYNC_CREATE
);
358 mail_config_provider_page_handle_dependency (page
, entry
, hbox
);
362 mail_config_provider_page_add_options (EMailConfigProviderPage
*page
,
363 CamelProviderConfEntry
*entry
)
365 EMailConfigServiceBackend
*backend
;
366 CamelProvider
*provider
;
367 CamelSettings
*settings
;
368 GtkCellRenderer
*renderer
;
376 /* The 'value' string is of the format:
378 * 'nick0:caption0:nick1:caption1:...nickN:captionN'
380 * where 'nick' is the nickname a GEnumValue and 'caption'
381 * is the localized combo box item displayed to the user. */
383 g_return_if_fail (entry
->text
!= NULL
);
384 g_return_if_fail (entry
->value
!= NULL
);
386 backend
= e_mail_config_provider_page_get_backend (page
);
387 provider
= e_mail_config_service_backend_get_provider (backend
);
388 settings
= e_mail_config_service_backend_get_settings (backend
);
390 hbox
= gtk_hbox_new (FALSE
, 0);
391 gtk_box_set_spacing (GTK_BOX (hbox
), 6);
392 gtk_widget_set_margin_left (hbox
, STANDARD_MARGIN
);
393 gtk_box_pack_start (GTK_BOX (page
), hbox
, FALSE
, FALSE
, 0);
394 gtk_widget_show (hbox
);
396 label
= gtk_label_new_with_mnemonic (entry
->text
);
397 gtk_misc_set_alignment (GTK_MISC (label
), 0.0, 0.5);
398 gtk_box_pack_start (GTK_BOX (hbox
), label
, FALSE
, FALSE
, 0);
399 gtk_widget_show (label
);
401 /* 0: 'nick', 1: caption */
402 store
= gtk_list_store_new (2, G_TYPE_STRING
, G_TYPE_STRING
);
404 tokens
= g_strsplit (entry
->value
, ":", -1);
405 length
= g_strv_length (tokens
);
407 /* Take the strings two at a time. */
408 for (ii
= 0; ii
+ 1 < length
; ii
+= 2) {
411 const gchar
*caption
;
413 nick
= tokens
[ii
+ 0];
414 caption
= tokens
[ii
+ 1];
416 /* Localize the caption. */
417 caption
= dgettext (provider
->translation_domain
, caption
);
419 gtk_list_store_append (store
, &iter
);
420 gtk_list_store_set (store
, &iter
, 0, nick
, 1, caption
, -1);
425 combo
= gtk_combo_box_new_with_model (GTK_TREE_MODEL (store
));
426 gtk_combo_box_set_id_column (GTK_COMBO_BOX (combo
), 0);
427 gtk_label_set_mnemonic_widget (GTK_LABEL (label
), combo
);
428 gtk_box_pack_start (GTK_BOX (hbox
), combo
, FALSE
, FALSE
, 0);
429 gtk_widget_show (combo
);
431 g_object_bind_property_full (
432 settings
, entry
->name
,
434 G_BINDING_BIDIRECTIONAL
|
435 G_BINDING_SYNC_CREATE
,
436 e_binding_transform_enum_value_to_nick
,
437 e_binding_transform_enum_nick_to_value
,
438 NULL
, (GDestroyNotify
) NULL
);
440 renderer
= gtk_cell_renderer_text_new ();
441 gtk_cell_layout_pack_start (GTK_CELL_LAYOUT (combo
), renderer
, TRUE
);
442 gtk_cell_layout_set_attributes (
443 GTK_CELL_LAYOUT (combo
), renderer
, "text", 1, NULL
);
445 mail_config_provider_page_handle_dependency (page
, entry
, hbox
);
449 mail_config_provider_page_add_widgets (EMailConfigProviderPage
*page
)
451 EMailConfigServiceBackend
*backend
;
452 CamelProviderConfEntry
*entries
;
453 CamelProvider
*provider
;
454 GtkWidget
*container
;
457 ESourceExtension
*extension
;
458 gboolean first_section
= TRUE
;
459 const gchar
*extension_name
;
464 /* XXX We begin the page with our own section header and refresh
465 * interval setting, and then skip the CamelProvider's first
466 * CAMEL_PROVIDER_CONF_SECTION_START entry.
468 * This is all very brittle. I'm convinced that generating
469 * a user interface from an array of records like this is a
470 * bad idea. We already have EMailConfigServiceBackend for
471 * building provider-specific "Receving Email" and "Sending
472 * EMail" pages by hand. We should do similarly here. */
474 backend
= e_mail_config_provider_page_get_backend (page
);
475 source
= e_mail_config_service_backend_get_source (backend
);
476 provider
= e_mail_config_service_backend_get_provider (backend
);
477 g_return_if_fail (provider
!= NULL
);
479 /* XXX I guess refresh options go in the mail account source,
480 * even if the source is part of a collection. I did not
481 * think about it too hard, so hopefully this is right. */
482 extension_name
= E_SOURCE_EXTENSION_REFRESH
;
483 extension
= e_source_get_extension (source
, extension_name
);
485 text
= _("Checking for New Mail");
486 markup
= g_markup_printf_escaped ("<b>%s</b>", text
);
487 widget
= gtk_label_new (markup
);
488 gtk_label_set_use_markup (GTK_LABEL (widget
), TRUE
);
489 gtk_misc_set_alignment (GTK_MISC (widget
), 0.0, 0.5);
490 gtk_box_pack_start (GTK_BOX (page
), widget
, FALSE
, FALSE
, 0);
491 gtk_widget_show (widget
);
494 widget
= gtk_box_new (GTK_ORIENTATION_HORIZONTAL
, 6);
495 gtk_widget_set_margin_left (widget
, STANDARD_MARGIN
);
496 gtk_box_pack_start (GTK_BOX (page
), widget
, FALSE
, FALSE
, 0);
497 gtk_widget_show (widget
);
501 text
= _("Check for _new messages every");
502 widget
= gtk_check_button_new_with_mnemonic (text
);
503 gtk_box_pack_start (GTK_BOX (container
), widget
, FALSE
, FALSE
, 0);
504 gtk_widget_show (widget
);
506 g_object_bind_property (
507 extension
, "enabled",
509 G_BINDING_BIDIRECTIONAL
|
510 G_BINDING_SYNC_CREATE
);
512 widget
= gtk_spin_button_new_with_range (1.0, 1440.0, 1.0);
513 gtk_box_pack_start (GTK_BOX (container
), widget
, FALSE
, FALSE
, 0);
514 gtk_widget_show (widget
);
516 g_object_bind_property (
517 extension
, "enabled",
519 G_BINDING_SYNC_CREATE
);
521 g_object_bind_property (
522 extension
, "interval-minutes",
524 G_BINDING_BIDIRECTIONAL
|
525 G_BINDING_SYNC_CREATE
);
527 widget
= gtk_label_new (_("minutes"));
528 gtk_box_pack_start (GTK_BOX (container
), widget
, FALSE
, FALSE
, 0);
529 gtk_widget_show (widget
);
531 /* Note the "text" member of each CamelProviderConfEntry is
532 * already localized, so we can use it directly in widgets. */
534 entries
= provider
->extra_conf
;
536 /* Loop until we see CAMEL_PROVIDER_CONF_END. */
537 for (ii
= 0; entries
[ii
].type
!= CAMEL_PROVIDER_CONF_END
; ii
++) {
539 /* Skip entries with no name. */
540 if (entries
[ii
].name
== NULL
)
543 switch (entries
[ii
].type
) {
544 case CAMEL_PROVIDER_CONF_SECTION_START
:
545 /* Skip the first section start. */
547 first_section
= FALSE
;
550 mail_config_provider_page_add_section (
554 case CAMEL_PROVIDER_CONF_CHECKBOX
:
555 mail_config_provider_page_add_checkbox (
559 case CAMEL_PROVIDER_CONF_CHECKSPIN
:
560 mail_config_provider_page_add_checkspin (
564 case CAMEL_PROVIDER_CONF_ENTRY
:
565 mail_config_provider_page_add_entry (
569 case CAMEL_PROVIDER_CONF_OPTIONS
:
570 mail_config_provider_page_add_options (
581 mail_config_provider_page_set_backend (EMailConfigProviderPage
*page
,
582 EMailConfigServiceBackend
*backend
)
584 g_return_if_fail (E_IS_MAIL_CONFIG_SERVICE_BACKEND (backend
));
585 g_return_if_fail (page
->priv
->backend
== NULL
);
587 page
->priv
->backend
= g_object_ref (backend
);
591 mail_config_provider_page_set_property (GObject
*object
,
596 switch (property_id
) {
598 mail_config_provider_page_set_backend (
599 E_MAIL_CONFIG_PROVIDER_PAGE (object
),
600 g_value_get_object (value
));
604 G_OBJECT_WARN_INVALID_PROPERTY_ID (object
, property_id
, pspec
);
608 mail_config_provider_page_get_property (GObject
*object
,
613 switch (property_id
) {
617 e_mail_config_provider_page_get_backend (
618 E_MAIL_CONFIG_PROVIDER_PAGE (object
)));
622 G_OBJECT_WARN_INVALID_PROPERTY_ID (object
, property_id
, pspec
);
626 mail_config_provider_page_dispose (GObject
*object
)
628 EMailConfigProviderPagePrivate
*priv
;
630 priv
= E_MAIL_CONFIG_PROVIDER_PAGE_GET_PRIVATE (object
);
632 if (priv
->backend
!= NULL
) {
633 g_object_unref (priv
->backend
);
634 priv
->backend
= NULL
;
637 /* Chain up parent's dispose() method. */
638 G_OBJECT_CLASS (e_mail_config_provider_page_parent_class
)->
643 mail_config_provider_page_constructed (GObject
*object
)
645 EMailConfigProviderPage
*page
;
646 EMailConfigServiceBackend
*backend
;
647 CamelProvider
*provider
;
649 page
= E_MAIL_CONFIG_PROVIDER_PAGE (object
);
651 /* Chain up parent's constructed() method. */
652 G_OBJECT_CLASS (e_mail_config_provider_page_parent_class
)->
653 constructed (object
);
655 gtk_box_set_spacing (GTK_BOX (object
), 6);
657 gtk_orientable_set_orientation (
658 GTK_ORIENTABLE (object
), GTK_ORIENTATION_VERTICAL
);
660 backend
= e_mail_config_provider_page_get_backend (page
);
661 provider
= e_mail_config_service_backend_get_provider (backend
);
663 if (provider
!= NULL
&& provider
->extra_conf
!= NULL
)
664 mail_config_provider_page_add_widgets (page
);
666 page
->priv
->is_empty
= TRUE
;
668 e_extensible_load_extensions (E_EXTENSIBLE (page
));
672 e_mail_config_provider_page_class_init (EMailConfigProviderPageClass
*class)
674 GObjectClass
*object_class
;
676 g_type_class_add_private (class, sizeof (EMailConfigProviderPagePrivate
));
678 object_class
= G_OBJECT_CLASS (class);
679 object_class
->set_property
= mail_config_provider_page_set_property
;
680 object_class
->get_property
= mail_config_provider_page_get_property
;
681 object_class
->dispose
= mail_config_provider_page_dispose
;
682 object_class
->constructed
= mail_config_provider_page_constructed
;
684 g_object_class_install_property (
687 g_param_spec_object (
690 "Service backend to generate options from",
691 E_TYPE_MAIL_CONFIG_SERVICE_BACKEND
,
693 G_PARAM_CONSTRUCT_ONLY
|
694 G_PARAM_STATIC_STRINGS
));
698 e_mail_config_provider_page_interface_init (EMailConfigPageInterface
*interface
)
700 interface
->title
= _("Receiving Options");
701 interface
->sort_order
= E_MAIL_CONFIG_PROVIDER_PAGE_SORT_ORDER
;
705 e_mail_config_provider_page_init (EMailConfigProviderPage
*page
)
707 page
->priv
= E_MAIL_CONFIG_PROVIDER_PAGE_GET_PRIVATE (page
);
711 e_mail_config_provider_page_new (EMailConfigServiceBackend
*backend
)
713 g_return_val_if_fail (E_IS_MAIL_CONFIG_SERVICE_BACKEND (backend
), NULL
);
715 return g_object_new (
716 E_TYPE_MAIL_CONFIG_PROVIDER_PAGE
,
717 "backend", backend
, NULL
);
721 e_mail_config_provider_page_is_empty (EMailConfigProviderPage
*page
)
723 g_return_val_if_fail (E_IS_MAIL_CONFIG_PROVIDER_PAGE (page
), TRUE
);
725 return page
->priv
->is_empty
;
728 EMailConfigServiceBackend
*
729 e_mail_config_provider_page_get_backend (EMailConfigProviderPage
*page
)
731 g_return_val_if_fail (E_IS_MAIL_CONFIG_PROVIDER_PAGE (page
), NULL
);
733 return page
->priv
->backend
;