/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- */ /* * Copyright (C) 2012 Red Hat * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 2 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, see . * * Written by: * Jasper St. Pierre */ /* Account page {{{1 */ #define PAGE_ID "account" #include "config.h" #include "account-resources.h" #include "gis-account-page.h" #include "gis-account-page-local.h" #include "gis-account-page-enterprise.h" #include #include struct _GisAccountPage { GisPage parent; GtkWidget *page_local; GtkWidget *page_enterprise; GtkWidget *stack; GtkWidget *page_toggle; GtkWidget *offline_label; GtkWidget *offline_stack; UmAccountMode mode; }; G_DEFINE_TYPE (GisAccountPage, gis_account_page, GIS_TYPE_PAGE); static void enterprise_apply_complete (GisPage *dummy, gboolean valid, gpointer user_data) { GisAccountPage *page = GIS_ACCOUNT_PAGE (user_data); gis_driver_set_username (GIS_PAGE (page)->driver, NULL); gis_page_apply_complete (GIS_PAGE (page), valid); } static gboolean page_validate (GisAccountPage *page) { switch (page->mode) { case UM_LOCAL: return gis_account_page_local_validate (GIS_ACCOUNT_PAGE_LOCAL (page->page_local)); case UM_ENTERPRISE: return gis_account_page_enterprise_validate (GIS_ACCOUNT_PAGE_ENTERPRISE (page->page_enterprise)); default: g_assert_not_reached (); } } static void update_page_validation (GisAccountPage *page) { gis_page_set_complete (GIS_PAGE (page), page_validate (page)); } static void on_validation_changed (gpointer page_area, GisAccountPage *page) { update_page_validation (page); } static void set_mode (GisAccountPage *page, UmAccountMode mode) { if (page->mode == mode) return; page->mode = mode; gis_driver_set_account_mode (GIS_PAGE (page)->driver, mode); switch (mode) { case UM_LOCAL: gtk_stack_set_visible_child (GTK_STACK (page->stack), page->page_local); gis_account_page_local_shown (GIS_ACCOUNT_PAGE_LOCAL (page->page_local)); break; case UM_ENTERPRISE: gtk_stack_set_visible_child (GTK_STACK (page->stack), page->page_enterprise); gis_account_page_enterprise_shown (GIS_ACCOUNT_PAGE_ENTERPRISE (page->page_enterprise)); break; default: g_assert_not_reached (); } update_page_validation (page); } static void toggle_mode (GtkToggleButton *button, gpointer user_data) { set_mode (GIS_ACCOUNT_PAGE (user_data), gtk_toggle_button_get_active (button) ? UM_ENTERPRISE : UM_LOCAL); } static gboolean gis_account_page_apply (GisPage *gis_page, GCancellable *cancellable) { GisAccountPage *page = GIS_ACCOUNT_PAGE (gis_page); switch (page->mode) { case UM_LOCAL: return gis_account_page_local_apply (GIS_ACCOUNT_PAGE_LOCAL (page->page_local), gis_page); case UM_ENTERPRISE: return gis_account_page_enterprise_apply (GIS_ACCOUNT_PAGE_ENTERPRISE (page->page_enterprise), cancellable, enterprise_apply_complete, page); default: g_assert_not_reached (); break; } } static gboolean gis_account_page_save_data (GisPage *gis_page, GError **error) { GisAccountPage *page = GIS_ACCOUNT_PAGE (gis_page); switch (page->mode) { case UM_LOCAL: return gis_account_page_local_create_user (GIS_ACCOUNT_PAGE_LOCAL (page->page_local), gis_page, error); case UM_ENTERPRISE: /* Nothing to do. */ return TRUE; default: g_assert_not_reached (); return FALSE; } } static void gis_account_page_shown (GisPage *gis_page) { GisAccountPage *page = GIS_ACCOUNT_PAGE (gis_page); gis_account_page_local_shown (GIS_ACCOUNT_PAGE_LOCAL (page->page_local)); } static void on_local_main_user_created (GtkWidget *page_local, ActUser *user, const gchar *password, GisAccountPage *page) { const gchar *language; language = gis_driver_get_user_language (GIS_PAGE (page)->driver); if (language) act_user_set_language (user, language); gis_driver_set_user_permissions (GIS_PAGE (page)->driver, user, password); } static void on_local_parent_user_created (GtkWidget *page_local, ActUser *user, const gchar *password, GisAccountPage *page) { const gchar *language; language = gis_driver_get_user_language (GIS_PAGE (page)->driver); if (language) act_user_set_language (user, language); gis_driver_set_parent_permissions (GIS_PAGE (page)->driver, user, password); } static void on_local_page_confirmed (GisAccountPageLocal *local, GisAccountPage *page) { gis_assistant_next_page (gis_driver_get_assistant (GIS_PAGE (page)->driver)); } static void on_local_user_cached (GtkWidget *page_local, ActUser *user, char *password, GisAccountPage *page) { const gchar *language; language = gis_driver_get_user_language (GIS_PAGE (page)->driver); if (language) act_user_set_language (user, language); gis_driver_set_user_permissions (GIS_PAGE (page)->driver, user, password); } static void on_network_changed (GNetworkMonitor *monitor, gboolean available, GisAccountPage *page) { if (!available && page->mode != UM_ENTERPRISE) gtk_stack_set_visible_child (GTK_STACK (page->offline_stack), page->offline_label); else gtk_stack_set_visible_child (GTK_STACK (page->offline_stack), page->page_toggle); } static void gis_account_page_constructed (GObject *object) { GisAccountPage *page = GIS_ACCOUNT_PAGE (object); GNetworkMonitor *monitor; gboolean available; G_OBJECT_CLASS (gis_account_page_parent_class)->constructed (object); g_signal_connect (page->page_local, "validation-changed", G_CALLBACK (on_validation_changed), page); g_signal_connect (page->page_local, "main-user-created", G_CALLBACK (on_local_main_user_created), page); g_signal_connect (page->page_local, "parent-user-created", G_CALLBACK (on_local_parent_user_created), page); g_signal_connect (page->page_local, "confirm", G_CALLBACK (on_local_page_confirmed), page); g_signal_connect (page->page_enterprise, "validation-changed", G_CALLBACK (on_validation_changed), page); g_signal_connect (page->page_enterprise, "user-cached", G_CALLBACK (on_local_user_cached), page); update_page_validation (page); g_signal_connect (page->page_toggle, "toggled", G_CALLBACK (toggle_mode), page); g_object_bind_property (page, "applying", page->page_toggle, "sensitive", G_BINDING_INVERT_BOOLEAN); g_object_bind_property (page->page_enterprise, "visible", page->offline_stack, "visible", G_BINDING_DEFAULT | G_BINDING_SYNC_CREATE); /* force a refresh by setting to an invalid value */ page->mode = NUM_MODES; set_mode (page, UM_LOCAL); monitor = g_network_monitor_get_default (); available = g_network_monitor_get_network_available (monitor); on_network_changed (monitor, available, page); g_signal_connect_object (monitor, "network-changed", G_CALLBACK (on_network_changed), page, 0); gtk_widget_show (GTK_WIDGET (page)); } static void gis_account_page_locale_changed (GisPage *page) { gis_page_set_title (GIS_PAGE (page), _("About You")); } static void gis_account_page_class_init (GisAccountPageClass *klass) { GisPageClass *page_class = GIS_PAGE_CLASS (klass); GObjectClass *object_class = G_OBJECT_CLASS (klass); gtk_widget_class_set_template_from_resource (GTK_WIDGET_CLASS (klass), "/org/gnome/initial-setup/gis-account-page.ui"); gtk_widget_class_bind_template_child (GTK_WIDGET_CLASS (klass), GisAccountPage, page_local); gtk_widget_class_bind_template_child (GTK_WIDGET_CLASS (klass), GisAccountPage, page_enterprise); gtk_widget_class_bind_template_child (GTK_WIDGET_CLASS (klass), GisAccountPage, stack); gtk_widget_class_bind_template_child (GTK_WIDGET_CLASS (klass), GisAccountPage, page_toggle); gtk_widget_class_bind_template_child (GTK_WIDGET_CLASS (klass), GisAccountPage, offline_label); gtk_widget_class_bind_template_child (GTK_WIDGET_CLASS (klass), GisAccountPage, offline_stack); page_class->page_id = PAGE_ID; page_class->locale_changed = gis_account_page_locale_changed; page_class->apply = gis_account_page_apply; page_class->save_data = gis_account_page_save_data; page_class->shown = gis_account_page_shown; object_class->constructed = gis_account_page_constructed; } static void gis_account_page_init (GisAccountPage *page) { g_resources_register (account_get_resource ()); g_type_ensure (GIS_TYPE_ACCOUNT_PAGE_LOCAL); g_type_ensure (GIS_TYPE_ACCOUNT_PAGE_ENTERPRISE); gtk_widget_init_template (GTK_WIDGET (page)); }