Esempio n. 1
0
void
org_gnome_exchange_check_address_book_subscribed (EPlugin *ep, EABPopupTargetSource *target)
{
	GSList *menus = NULL;
	int i = 0;
	ESource *source = NULL;
	gchar *uri = NULL;
	gchar *path = NULL;
	char *sub_folder = NULL;
	const char *base_uri;
	ExchangeAccount *account = NULL;
	ESourceGroup *group;

	account = exchange_operations_get_exchange_account ();

	if (!account)
		return;

	source = e_source_selector_peek_primary_selection (E_SOURCE_SELECTOR (target->selector));
	group = e_source_peek_group (source);
	base_uri = e_source_group_peek_base_uri (group);
	if (!base_uri || strcmp (base_uri, "exchange://"))
		return;

	uri = e_source_get_uri (source);
	path = g_strdup (uri + strlen ("exchange://") + strlen (account->account_filename) + strlen ("/;"));
	g_free (uri);
	sub_folder = strchr (path, '@');

	if (!sub_folder) {
		g_free (path);
		return;
	}

	for (i = 0; i < sizeof (popup_ab_items) / sizeof (popup_ab_items[0]); i++)
		menus = g_slist_prepend (menus, &popup_ab_items[i]);

	e_popup_add_items (target->target.popup, menus, NULL, popup_ab_free, target);
	g_free (path);

}
ESourceGroup *
e_source_list_peek_group_by_base_uri (ESourceList *list, const gchar *base_uri)
{
        GSList *p;
        gint len;

        g_return_val_if_fail (E_IS_SOURCE_LIST (list), NULL);
        g_return_val_if_fail (base_uri != NULL, NULL);

        len = strlen (base_uri);

        for (p = e_source_list_peek_groups (list); p != NULL; p = p->next) {
                ESourceGroup *group = E_SOURCE_GROUP (p->data);
                const gchar *buri = e_source_group_peek_base_uri (group);

                if (buri && g_ascii_strncasecmp (buri, base_uri, len) == 0)
                        return group;
        }

        return NULL;
}
Esempio n. 3
0
static void
dump_group (ESourceGroup *group)
{
	GSList *sources, *p;

	g_print ("Group %s\n", e_source_group_peek_uid (group));
	g_print ("\tname: %s\n", e_source_group_peek_name (group));
	g_print ("\tbase_uri: %s\n", e_source_group_peek_base_uri (group));

	sources = e_source_group_peek_sources (group);
	for (p = sources; p != NULL; p = p->next) {
		ESource *source = E_SOURCE (p->data);

		dump_source (source);

		if (e_source_peek_group (source) != group)
			g_warning ("\t\t** ERROR ** parent pointer is %p, should be %p",
				   (gpointer) e_source_peek_group (source),
				   (gpointer) group);
	}
}
GtkWidget *
plugin_couchdb_calendar (EPlugin *epl, EConfigHookItemFactoryData *data)
{
	ESource *source;
	ESourceGroup *group;
	const gchar *base_uri;
	ECalConfigTargetSource *t = (ECalConfigTargetSource *) data->target;

	source = t->source;
        group  = e_source_peek_group (source);

        base_uri = e_source_group_peek_base_uri (group);

        g_object_set_data (G_OBJECT (epl), "cwidget", NULL);

	if (strcmp (base_uri, COUCHDB_BASE_URI) != 0)
                return NULL;

	build_couchdb_settings (epl, source, data->parent);

	return NULL;
}
Esempio n. 5
0
gpointer
check_username_filled (ESource *source)
{
	gboolean res = TRUE;

	g_return_val_if_fail (source != NULL, NULL);

	if (g_ascii_strncasecmp (
		GOOGLE_BASE_URI, e_source_group_peek_base_uri (
		e_source_peek_group (source)), strlen (GOOGLE_BASE_URI)) == 0) {
		gchar *username;

		username  = g_strdup (e_source_get_property (source, "username"));

		if (username)
			username = g_strstrip (username);

		res = username && *username;

		g_free (username);
	}

	return GINT_TO_POINTER (res ? 1 : 0);
}
Esempio n. 6
0
GtkWidget *
plugin_google_contacts (EPlugin *epl,
                        EConfigHookItemFactoryData *data)
{
	EABConfigTargetSource *t = (EABConfigTargetSource *) data->target;
	ESource *source;
	ESourceGroup *group;
	const gchar *base_uri;
	const gchar *username;
	const gchar *refresh_interval_str;
	guint refresh_interval;
	const gchar *use_ssl_str;
	gchar *buff;
	gboolean use_ssl;
	GtkWidget *parent;
	GtkWidget *vbox;

	GtkWidget *section;
	GtkWidget *vbox2;

	GtkWidget *hbox;
	GtkWidget *spacer;
	GtkWidget *label;
	GtkWidget *username_entry;

	GtkWidget *interval_sb;
	GtkWidget *interval_combo;
	IntervalType type;
	gint time;

	GtkWidget *ssl_cb;
	struct ui_data *ui;

	source = t->source;
	group = e_source_peek_group (source);

	base_uri = e_source_group_peek_base_uri (group);

	g_object_set_data (G_OBJECT (epl), "gwidget", NULL);

	if (g_ascii_strncasecmp (GOOGLE_BASE_URI, base_uri, 9) != 0)
		return NULL;

	/* Build up the UI */
	parent = data->parent;
	vbox = gtk_widget_get_ancestor (
		gtk_widget_get_parent (parent), GTK_TYPE_VBOX);

	vbox2 = gtk_vbox_new (FALSE, 6);
	gtk_box_pack_start (GTK_BOX (vbox), vbox2, FALSE, FALSE, 0);

	section = gtk_label_new (NULL);
	buff = g_strconcat ("<b>", _("Server"), "</b>", NULL);
	gtk_label_set_markup (GTK_LABEL (section), buff);
	g_free (buff);
	gtk_misc_set_alignment (GTK_MISC (section), 0.0, 0.0);
	gtk_box_pack_start (GTK_BOX (vbox2), section, FALSE, FALSE, 0);

	hbox = gtk_hbox_new (FALSE, 10);
	gtk_box_pack_start (GTK_BOX (vbox2), hbox, TRUE, TRUE, 0);

	spacer = gtk_label_new ("   ");
	gtk_box_pack_start (GTK_BOX (hbox), spacer, FALSE, FALSE, 0);

	label = gtk_label_new_with_mnemonic (_("User_name:"));
	gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, FALSE, 0);

	username_entry = gtk_entry_new ();
	username = e_source_get_property (source, "username");
	if (username)
		gtk_entry_set_text (GTK_ENTRY (username_entry), username);
	gtk_box_pack_start (GTK_BOX (hbox), username_entry, TRUE, TRUE, 0);

	hbox = gtk_hbox_new (FALSE, 10);
	gtk_box_pack_start (GTK_BOX (vbox2), hbox, TRUE, TRUE, 0);

	spacer = gtk_label_new ("   ");
	gtk_box_pack_start (GTK_BOX (hbox), spacer, FALSE, FALSE, 0);

	use_ssl_str = e_source_get_property (source, "use-ssl");
	if (use_ssl_str && ('1' == use_ssl_str[0] ||
		0 == g_ascii_strcasecmp (use_ssl_str, "true"))) {
		use_ssl = 1;
	} else {
		use_ssl = 0;
	}
	ssl_cb = gtk_check_button_new_with_mnemonic (_("Use _secure connection"));
	gtk_box_pack_start (GTK_BOX (hbox), ssl_cb, FALSE, FALSE, 0);
	gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (ssl_cb), use_ssl);

	hbox = gtk_hbox_new (FALSE, 10);
	gtk_box_pack_start (GTK_BOX (vbox2), hbox, TRUE, TRUE, 0);

	spacer = gtk_label_new ("   ");
	gtk_box_pack_start (GTK_BOX (hbox), spacer, FALSE, FALSE, 0);

	refresh_interval_str = e_source_get_property (source, "refresh-interval");
	if (refresh_interval_str &&
		(1 == sscanf (refresh_interval_str, "%u", &refresh_interval))) {
	} else {
		refresh_interval = -1;
	}
	seconds_to_interval (refresh_interval, &type, &time);

	label = gtk_label_new_with_mnemonic (_("Re_fresh:"));
	gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, FALSE, 0);

	interval_sb = gtk_spin_button_new_with_range (1, 100, 1);
	gtk_spin_button_set_value (GTK_SPIN_BUTTON (interval_sb), time);
	gtk_box_pack_start (GTK_BOX (hbox), interval_sb, FALSE, FALSE, 0);

	interval_combo = gtk_combo_box_text_new ();
	gtk_combo_box_text_append_text (GTK_COMBO_BOX_TEXT (interval_combo), _("minutes"));
	gtk_combo_box_text_append_text (GTK_COMBO_BOX_TEXT (interval_combo), _("hours"));
	gtk_combo_box_text_append_text (GTK_COMBO_BOX_TEXT (interval_combo), _("days"));
	gtk_combo_box_text_append_text (GTK_COMBO_BOX_TEXT (interval_combo), _("weeks"));
	gtk_combo_box_set_active (GTK_COMBO_BOX (interval_combo), type);
	gtk_box_pack_start (GTK_BOX (hbox), interval_combo, FALSE, FALSE, 0);

	gtk_widget_show_all (vbox2);

	g_object_set_data (G_OBJECT (interval_sb), "interval-combo", interval_combo);
	g_object_set_data (G_OBJECT (interval_combo), "interval-sb", interval_sb);

	ui = g_malloc0 (sizeof (struct ui_data));
	ui->widget = vbox2;
	g_object_set_data_full(G_OBJECT(epl), "gwidget", ui, destroy_ui_data);
	g_signal_connect (
		ui->widget, "destroy",
		G_CALLBACK (gtk_widget_destroyed), &ui->widget);

	g_signal_connect (
		username_entry, "changed",
		G_CALLBACK (on_username_entry_changed), source);
	g_signal_connect (
		interval_combo, "changed",
		G_CALLBACK (on_interval_combo_changed), source);
	g_signal_connect (
		ssl_cb, "toggled",
		G_CALLBACK (on_ssl_cb_toggled), source);
	g_signal_connect (
		interval_sb, "value-changed",
		G_CALLBACK (on_interval_sb_value_changed), source);

	return NULL;
}
GtkWidget *
plugin_couchdb_contacts (EPlugin *epl, EConfigHookItemFactoryData *data)
{
	ESource *source;
        ESourceGroup *group;
	const gchar *base_uri;
	GtkWidget *parent;
	GtkWidget *table, *label, *parent_vbox;
	UIData *ui;
	const gchar *property;
	EABConfigTargetSource *t = (EABConfigTargetSource *) data->target;

	source = t->source;
        group  = e_source_peek_group (source);

        base_uri = e_source_group_peek_base_uri (group);

        g_object_set_data (G_OBJECT (epl), "cwidget", NULL);

	if (strcmp (base_uri, COUCHDB_BASE_URI) != 0)
                return NULL;

	/* Build up the UI */
	ui = g_new0 (UIData, 1);
	ui->source = t->source;

	parent = data->parent;
	parent_vbox = gtk_widget_get_ancestor (gtk_widget_get_parent (parent), GTK_TYPE_VBOX);

	ui->vbox = gtk_vbox_new (FALSE, 6);
	gtk_box_pack_start (GTK_BOX (parent_vbox), ui->vbox, FALSE, FALSE, 0);

	label = gtk_label_new (NULL);
	gtk_label_set_markup (GTK_LABEL (label), _("<b>Server</b>"));
	gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.0);
	gtk_box_pack_start (GTK_BOX (ui->vbox), label, FALSE, FALSE, 0);

	table = gtk_table_new (3, 3, FALSE);
	gtk_box_pack_start (GTK_BOX (ui->vbox), table, TRUE, TRUE, 0);

	label = gtk_label_new ("   ");
	gtk_table_attach (GTK_TABLE (table), label, 0, 1, 0, 1, GTK_FILL, GTK_FILL, 0, 0);

	ui->user_db_button = gtk_radio_button_new_with_label (NULL, _("Desktop CouchDB"));
	gtk_table_attach (GTK_TABLE (table), ui->user_db_button, 1, 3, 0, 1,
			  GTK_EXPAND | GTK_FILL, GTK_FILL, 3, 3);

	ui->system_db_button = gtk_radio_button_new_with_label (
		gtk_radio_button_get_group (GTK_RADIO_BUTTON (ui->user_db_button)),
		_("System-wide CouchDB"));
	gtk_table_attach (GTK_TABLE (table), ui->system_db_button, 1, 3, 1, 2,
			  GTK_EXPAND | GTK_FILL, GTK_FILL, 3, 3);

	ui->remote_db_button = gtk_radio_button_new_with_label (
		gtk_radio_button_get_group (GTK_RADIO_BUTTON (ui->user_db_button)),
		_("Remote CouchDB server"));
	gtk_table_attach (GTK_TABLE (table), ui->remote_db_button, 1, 2, 2, 3,
			  GTK_EXPAND | GTK_FILL, GTK_FILL, 3, 3);
	ui->remote_db_entry = gtk_entry_new ();
	gtk_table_attach (GTK_TABLE (table), ui->remote_db_entry, 2, 3, 2, 3,
			  GTK_EXPAND | GTK_FILL, GTK_FILL, 3, 3);

	gtk_widget_show_all (ui->vbox);

	/* Set values from the source */
	property = e_source_get_property (ui->source, "couchdb_instance");
	if (g_strcmp0 (property, "system") == 0) {
		gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (ui->system_db_button), TRUE);
		gtk_widget_set_sensitive (ui->remote_db_entry, FALSE);
	} else if (g_strcmp0 (property, "remote") == 0) {
		gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (ui->remote_db_button), TRUE);
		gtk_widget_set_sensitive (ui->remote_db_entry, TRUE);
		gtk_entry_set_text (GTK_ENTRY (ui->remote_db_entry),
				    e_source_get_property (ui->source, "couchdb_remote_server"));
	} else {
		gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (ui->user_db_button), TRUE);
		if (!property)
			e_source_set_property (ui->source, "couchdb_instance", "user");
		gtk_widget_set_sensitive (ui->remote_db_entry, FALSE);
	}

	g_object_set_data_full (G_OBJECT (epl), "cwidget", ui, destroy_ui_data);
	g_signal_connect (ui->vbox, "destroy", G_CALLBACK (gtk_widget_destroyed), &ui->vbox);

	/* Signals */
	g_signal_connect (G_OBJECT (ui->user_db_button), "toggled", G_CALLBACK (on_user_db_toggled), ui);
	g_signal_connect (G_OBJECT (ui->system_db_button), "toggled", G_CALLBACK (on_system_db_toggled), ui);
	g_signal_connect (G_OBJECT (ui->remote_db_button), "toggled", G_CALLBACK (on_remote_db_toggled), ui);
	g_signal_connect (G_OBJECT (ui->remote_db_entry), "changed", G_CALLBACK (on_remote_db_changed), ui);

	return NULL;
}
Esempio n. 8
0
void
dates_update_calendars (ESourceList *cal_list, DatesData *d)
{
    GSList *groups, *g;

    /* TODO: Don't reload *all* calendars on update */
    d->dcal = NULL;
    gtk_list_store_clear (d->cal_list_store);
    dates_view_remove_all_calendars (d->view);
    groups = e_source_list_peek_groups (cal_list);

#ifdef DEBUG
    if (d->debug & DATES_DEBUG_CALENDAR)
	g_debug ("Updating Calendars");
#endif

    /* Disable creating of calendars until we know there's a valid
     * calendar to add events to.
     */
	d->cal_loaded = FALSE;
	
	if (d->TBNew)
	{
#ifdef DEBUG
		if (d->debug & DATES_DEBUG_CALENDAR)
			g_debug ("*** Setting TBNew button insensitive ***");
#endif
		gtk_widget_set_sensitive (d->TBNew, FALSE);
	}
	
    for (g = groups; g; g = g->next) {
	GSList *sources, *s;
#ifdef DEBUG
	if (d->debug & DATES_DEBUG_CALENDAR)
	    g_debug ("Group %s (%s)",
		     e_source_group_peek_name (
			 E_SOURCE_GROUP (g->data)),
		     e_source_group_peek_base_uri (
			 E_SOURCE_GROUP (g->data)));
#endif
	sources = e_source_group_peek_sources (
	    E_SOURCE_GROUP (g->data));
	for (s = sources; s; s = s->next) {
	    ESource *source = E_SOURCE (s->data);
	    ECal *ecal;
			
	    ecal = dates_load_esource (source,
				 E_CAL_SOURCE_TYPE_EVENT, NULL, d);
	    if (!ecal) {
#ifdef DEBUG
		if (d->debug & DATES_DEBUG_CALENDAR)
		    g_debug ("No EVENTS in this source");
#endif
		continue;
	    }

#ifdef DEBUG
	    if (d->debug & DATES_DEBUG_CALENDAR)
		g_debug ("Found EVENTS in this source");
#endif

	    g_signal_connect (G_OBJECT (ecal), "cal_opened",
			      G_CALLBACK (dates_cal_open_cb), d);

	    e_cal_open_async (ecal, FALSE);
	    
	    /* 
	     * Set the calendar mode to CAL_MODE_REMOTE. This is necessary to get the
	     * remote (webcal) calendars to work. It doesn't seem to have any effect
	     * on the file backend.
	     */
	    e_cal_set_mode (ecal, CAL_MODE_REMOTE);
	}
    }	
}
Esempio n. 9
0
void
dates_cal_open_cb (ECal *ecal, ECalendarStatus status, DatesData *d)
{
    gboolean read_only;
    GError *error = NULL;
    const char *ecal_name;
    ESource *source;
    ESourceGroup *group;
    GtkTreeIter iter;
    gchar *primary_uid;
    GSList *selected_list;
    gboolean selected;
	gchar * cal_name;
	
#ifdef DEBUG
    if (d->debug & DATES_DEBUG_CALENDAR)
	g_debug ("Calendar opened, setting up...");
#endif

    if (status != E_CALENDAR_STATUS_OK)
	{
		g_warning ("Error '%d' opening ecal", status);
		g_object_unref (ecal);
		if (d->first_load) {
			GtkWidget *dialog = gtk_message_dialog_new (
				GTK_WINDOW (d->main_window),
				GTK_DIALOG_MODAL | GTK_DIALOG_NO_SEPARATOR,
				GTK_MESSAGE_ERROR,
				GTK_BUTTONS_CLOSE,
				_("Dates failed to open the system calendar. "
				  "You will not be able to view or create "
				  "events; this may be remedied by restarting."));
			gtk_dialog_run (GTK_DIALOG (dialog));
		}
		return;
    }
	
    source = e_cal_get_source (ecal);

    ecal_name = e_source_peek_name (source);

    if (!e_cal_is_read_only (ecal, &read_only, &error))
	{
		g_warning ("Error querying calendar's read-only status: %s",
				   error->message);
		g_error_free (error);
		g_object_unref (ecal);
		return;
    }

	/* 
	 * Work around the fact that eds-dbus seems to be returning the wrong
	 * value for e_cal_is_read_only on the calendar itself for the http
	 * backend. But on the events themselves it is fine
	 */
	group = e_source_peek_group (source);
	if (strncmp (e_source_group_peek_base_uri (group), "webcal://", 9) == 0)
		read_only = TRUE;
	
    selected_list = gconf_client_get_list (gconf_client_get_default (),
					   CALENDAR_GCONF_SELECTED, GCONF_VALUE_STRING, NULL);
#ifdef DEBUG
		if (d->debug & DATES_DEBUG_CALENDAR)
			g_debug ("selected_list %p: is in uids %d",
					 selected_list,
					 is_in_uids (selected_list, source));
#endif
	
    if (selected_list && is_in_uids (selected_list, source))
	{
		dates_view_add_calendar (d->view, ecal);
		g_signal_connect (G_OBJECT (ecal), "backend_died",
						  G_CALLBACK (dates_backend_died_cb), d);
		selected = TRUE;
    }
	else
	{
		selected = FALSE;
    }
	
    if ((!read_only) && (selected))
	{
		if (!d->dcal)
			d->dcal = ecal;
		else
		{
			/* Find out if it's the default calendar */
			primary_uid = gconf_client_get_string (
				gconf_client_get_default (),
				CALENDAR_GCONF_PRIMARY, NULL);
			if (primary_uid) {
				if (strcmp (e_source_peek_uid (source),
							primary_uid) == 0)
					d->dcal = ecal;
				g_free (primary_uid);
			}
		}

		d->cal_loaded = TRUE;
	
		if (d->TBNew)
		{
#ifdef DEBUG
			if (d->debug & DATES_DEBUG_CALENDAR)
				g_debug ("*** Setting TBNew button sensitive ***");
#endif
			gtk_widget_set_sensitive (d->TBNew, TRUE);
		}
    }
	else
	{
#ifdef DEBUG
		if (d->debug & DATES_DEBUG_CALENDAR)
			g_debug ("*** RO %d, Selected %d ***", read_only, selected);
#endif
	}

	if (ecal_name && !read_only)
		cal_name = g_strdup (ecal_name);
	else if (ecal_name)
		cal_name = g_strconcat (ecal_name, _(" (Read Only)"), NULL);
	else if (!read_only)
		cal_name = g_strdup (_("Unknown"));
	else
		cal_name = g_strconcat (_("Unknown"), _(" (Read Only)"), NULL);
		
    gtk_list_store_insert_with_values (d->cal_list_store, &iter, G_MAXINT,
								COL_CALNAME, cal_name,
								COL_CALPTR, ecal,
								COL_NOTREADONLY, !read_only,
								COL_SELECTED, selected,
								-1);

	g_free (cal_name);
	
#ifdef DEBUG
    if (d->debug & DATES_DEBUG_CALENDAR)
		g_debug ("Calendar added.");
#endif

	dates_platform_cal_open (d);
}
Esempio n. 10
0
static void
ensure_sources (MemosComponent *component)
{
	GSList *groups;
	ESourceList *source_list;
	ESourceGroup *group;
	ESourceGroup *on_this_computer;
	ESourceGroup *on_the_web;
	ESource *personal_source;
	char *base_uri, *base_uri_proto;
	const gchar *base_dir;

	on_this_computer = NULL;
	on_the_web = NULL;
	personal_source = NULL;

	if (!e_cal_get_sources (&source_list, E_CAL_SOURCE_TYPE_JOURNAL, NULL)) {
		g_warning ("Could not get memo source list from GConf!");
		return;
	}

	base_dir = memos_component_peek_base_directory (component);
	base_uri = g_build_filename (base_dir, "local", NULL);

	base_uri_proto = g_filename_to_uri (base_uri, NULL, NULL);

	groups = e_source_list_peek_groups (source_list);
	if (groups) {
		/* groups are already there, we need to search for things... */
		GSList *g;

		for (g = groups; g; g = g->next) {

			group = E_SOURCE_GROUP (g->data);

			/* compare only file:// part. If user home dir name changes we do not want to create
			   one more group  */

			if (!on_this_computer && !strncmp (base_uri_proto, e_source_group_peek_base_uri (group), 7))
				on_this_computer = group;
			else if (!on_the_web && !strcmp (WEB_BASE_URI, e_source_group_peek_base_uri (group)))
				on_the_web = group;
		}
	}

	if (on_this_computer) {
		/* make sure "Personal" shows up as a source under
		   this group */
		GSList *sources = e_source_group_peek_sources (on_this_computer);
		GSList *s;
		for (s = sources; s; s = s->next) {
			ESource *source = E_SOURCE (s->data);
			const gchar *relative_uri;

			relative_uri = e_source_peek_relative_uri (source);
			if (relative_uri == NULL)
				continue;
			if (!strcmp (PERSONAL_RELATIVE_URI, relative_uri)) {
				personal_source = source;
				break;
			}
		}
		/* Make sure we have the correct base uri. This can change when user's
		   homedir name changes */
		if (strcmp (base_uri_proto, e_source_group_peek_base_uri (on_this_computer))) {
		    e_source_group_set_base_uri (on_this_computer, base_uri_proto);

		    /* *sigh* . We shouldn't  need this sync call here as set_base_uri
		       call results in synching to gconf, but that happens in idle loop
		       and too late to prevent user seeing "Can not Open ... because of invalid uri" error.*/
		    e_source_list_sync (source_list,NULL);
		}
	}
	else {
		/* create the local source group */
		group = e_source_group_new (_("On This Computer"), base_uri_proto);
		e_source_list_add_group (source_list, group, -1);

		on_this_computer = group;
	}

	if (!personal_source) {
		GSList *memos_selected;
		/* Create the default Person addressbook */
		ESource *source = e_source_new (_("Personal"), PERSONAL_RELATIVE_URI);
		e_source_group_add_source (on_this_computer, source, -1);

		memos_selected = calendar_config_get_memos_selected ();

		if (!calendar_config_get_primary_memos () && !memos_selected) {
			GSList selected;

			calendar_config_set_primary_memos (e_source_peek_uid (source));

			selected.data = (gpointer)e_source_peek_uid (source);
			selected.next = NULL;
			calendar_config_set_memos_selected (&selected);
		}

		if (memos_selected) {
			g_slist_foreach (memos_selected, (GFunc) g_free, NULL);
			g_slist_free (memos_selected);
		}

		e_source_set_color_spec (source, "#BECEDD");
		personal_source = source;
	}

	if (!on_the_web) {
		/* Create the LDAP source group */
		group = e_source_group_new (_("On The Web"), WEB_BASE_URI);
		e_source_list_add_group (source_list, group, -1);

		on_the_web = group;
	}

	component->priv->source_list = source_list;
	g_free (base_uri_proto);
	g_free (base_uri);
}
Esempio n. 11
0
static void
create_memo_sources (EShellBackend *shell_backend,
                     ESourceList *source_list,
                     ESourceGroup **on_this_computer,
                     ESourceGroup **on_the_web,
                     ESource **personal_source)
{
	EShell *shell;
	EShellSettings *shell_settings;
	GSList *groups;
	ESourceGroup *group;

	*on_this_computer = NULL;
	*on_the_web = NULL;
	*personal_source = NULL;

	shell = e_shell_backend_get_shell (shell_backend);
	shell_settings = e_shell_get_shell_settings (shell);

	groups = e_source_list_peek_groups (source_list);
	if (groups) {
		/* groups are already there, we need to search for things... */
		GSList *g;
		gchar *base_dir, *base_uri;

		base_dir = g_build_filename (e_shell_backend_get_data_dir (shell_backend), "local", NULL);
		base_uri = g_filename_to_uri (base_dir, NULL, NULL);

		for (g = groups; g; g = g->next) {
			group = E_SOURCE_GROUP (g->data);

			if (strcmp (base_uri, e_source_group_peek_base_uri (group)) == 0)
				e_source_group_set_base_uri (group, LOCAL_BASE_URI);

			if (!*on_this_computer && !strcmp (LOCAL_BASE_URI, e_source_group_peek_base_uri (group)))
				*on_this_computer = g_object_ref (group);
			else if (!*on_the_web && !strcmp (WEBCAL_BASE_URI, e_source_group_peek_base_uri (group)))
				*on_the_web = g_object_ref (group);
		}

		g_free (base_dir);
		g_free (base_uri);
	}

	if (*on_this_computer) {
		/* make sure "Personal" shows up as a source under
		 * this group */
		GSList *sources = e_source_group_peek_sources (*on_this_computer);
		GSList *s;
		for (s = sources; s; s = s->next) {
			ESource *source = E_SOURCE (s->data);
			const gchar *relative_uri;

			relative_uri = e_source_peek_relative_uri (source);
			if (relative_uri == NULL)
				continue;
			if (!strcmp (PERSONAL_RELATIVE_URI, relative_uri)) {
				*personal_source = g_object_ref (source);
				break;
			}
		}
	} else {
		/* create the local source group */
		group = e_source_group_new (_("On This Computer"), LOCAL_BASE_URI);
		e_source_list_add_group (source_list, group, -1);

		*on_this_computer = group;
	}

	if (!*personal_source) {
		GSList *selected;
		gchar *primary_memo_list;

		/* Create the default Person memo list */
		ESource *source = e_source_new (_("Personal"), PERSONAL_RELATIVE_URI);
		e_source_group_add_source (*on_this_computer, source, -1);

		primary_memo_list = e_shell_settings_get_string (
			shell_settings, "cal-primary-memo-list");

		selected = e_memo_shell_backend_get_selected_memo_lists (
			E_MEMO_SHELL_BACKEND (shell_backend));

		if (primary_memo_list == NULL && selected == NULL) {
			GSList link;

			e_shell_settings_set_string (
				shell_settings, "cal-primary-memo-list",
				e_source_peek_uid (source));

			link.data = (gpointer) e_source_peek_uid (source);
			link.next = NULL;

			e_memo_shell_backend_set_selected_memo_lists (
				E_MEMO_SHELL_BACKEND (shell_backend), &link);
		}

		g_slist_foreach (selected, (GFunc) g_free, NULL);
		g_slist_free (selected);

		e_source_set_color_spec (source, "#BECEDD");
		*personal_source = source;
	}

	if (!*on_the_web) {
		/* Create the Webcal source group */
		group = e_source_group_new (_("On The Web"), WEBCAL_BASE_URI);
		e_source_list_add_group (source_list, group, -1);

		*on_the_web = group;
	}
}