--- /dev/null
+/*
+ * e-source-uoa.c
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) version 3.
+ *
+ * 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with the program; if not, see <http://www.gnu.org/licenses/>
+ *
+ */
+
+/**
+ * SECTION: e-source-uoa
+ * @include: libedataserver/libedataserver.h
+ * @short_description: #ESource extension for Ubuntu Online Accounts
+ *
+ * The #ESourceUoa extension associates an #ESource with an #AgAccount.
+ * This extension is usually found in a top-level #ESource, with various
+ * mail, calendar and address book data sources as children.
+ *
+ * Access the extension as follows:
+ *
+ * |[
+ * #include <libedataserver/libedataserver.h>
+ *
+ * ESourceUoa *extension;
+ *
+ * extension = e_source_get_extension (source, E_SOURCE_EXTENSION_UOA);
+ * ]|
+ **/
+
+#include "e-source-uoa.h"
+
+#include <libedataserver/e-data-server-util.h>
+
+#define E_SOURCE_UOA_GET_PRIVATE(obj) \
+ (G_TYPE_INSTANCE_GET_PRIVATE \
+ ((obj), E_TYPE_SOURCE_UOA, ESourceUoaPrivate))
+
+struct _ESourceUoaPrivate {
+ guint account_id;
+};
+
+enum {
+ PROP_0,
+ PROP_ACCOUNT_ID
+};
+
+G_DEFINE_TYPE (
+ ESourceUoa,
+ e_source_uoa,
+ E_TYPE_SOURCE_EXTENSION)
+
+static void
+source_uoa_set_property (GObject *object,
+ guint property_id,
+ const GValue *value,
+ GParamSpec *pspec)
+{
+ switch (property_id) {
+ case PROP_ACCOUNT_ID:
+ e_source_uoa_set_account_id (
+ E_SOURCE_UOA (object),
+ g_value_get_uint (value));
+ return;
+ }
+
+ G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
+}
+
+static void
+source_uoa_get_property (GObject *object,
+ guint property_id,
+ GValue *value,
+ GParamSpec *pspec)
+{
+ switch (property_id) {
+ case PROP_ACCOUNT_ID:
+ g_value_set_uint (
+ value,
+ e_source_uoa_get_account_id (
+ E_SOURCE_UOA (object)));
+ return;
+ }
+
+ G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
+}
+
+static void
+e_source_uoa_class_init (ESourceUoaClass *class)
+{
+ GObjectClass *object_class;
+ ESourceExtensionClass *extension_class;
+
+ g_type_class_add_private (class, sizeof (ESourceUoaPrivate));
+
+ object_class = G_OBJECT_CLASS (class);
+ object_class->set_property = source_uoa_set_property;
+ object_class->get_property = source_uoa_get_property;
+
+ extension_class = E_SOURCE_EXTENSION_CLASS (class);
+ extension_class->name = E_SOURCE_EXTENSION_UOA;
+
+ g_object_class_install_property (
+ object_class,
+ PROP_ACCOUNT_ID,
+ g_param_spec_uint (
+ "account-id",
+ "Account ID",
+ "Ubuntu Online Account ID",
+ 0, G_MAXUINT, 0,
+ G_PARAM_READWRITE |
+ G_PARAM_CONSTRUCT |
+ G_PARAM_STATIC_STRINGS |
+ E_SOURCE_PARAM_SETTING));
+}
+
+static void
+e_source_uoa_init (ESourceUoa *extension)
+{
+ extension->priv = E_SOURCE_UOA_GET_PRIVATE (extension);
+}
+
+/**
+ * e_source_uoa_get_account_id:
+ * @extension: an #ESourceUoa
+ *
+ * Returns the numeric identifier of the Ubuntu Online Account associated
+ * with the #ESource to which @extension belongs.
+ *
+ * Returns: the associated Ubuntu Online Account ID
+ *
+ * Since: 3.8
+ **/
+guint
+e_source_uoa_get_account_id (ESourceUoa *extension)
+{
+ g_return_val_if_fail (E_IS_SOURCE_UOA (extension), 0);
+
+ return extension->priv->account_id;
+}
+
+/**
+ * e_source_uoa_set_account_id:
+ * @extension: an #ESourceUoa
+ * @account_id: the associated Ubuntu Online Account ID
+ *
+ * Sets the numeric identifier of the Ubuntu Online Account associated
+ * with the #ESource to which @extension belongs.
+ *
+ * Since: 3.8
+ **/
+void
+e_source_uoa_set_account_id (ESourceUoa *extension,
+ guint account_id)
+{
+ g_return_if_fail (E_IS_SOURCE_UOA (extension));
+
+ if (extension->priv->account_id == account_id)
+ return;
+
+ extension->priv->account_id = account_id;
+
+ g_object_notify (G_OBJECT (extension), "account-id");
+}
+
--- /dev/null
+/*
+ * e-source-uoa.h
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) version 3.
+ *
+ * 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with the program; if not, see <http://www.gnu.org/licenses/>
+ *
+ */
+
+#if !defined (__LIBEDATASERVER_H_INSIDE__) && !defined (LIBEDATASERVER_COMPILATION)
+#error "Only <libedataserver/libedataserver.h> should be included directly."
+#endif
+
+#ifndef E_SOURCE_UOA_H
+#define E_SOURCE_UOA_H
+
+#include <libedataserver/e-source-extension.h>
+
+/* Standard GObject macros */
+#define E_TYPE_SOURCE_UOA \
+ (e_source_uoa_get_type ())
+#define E_SOURCE_UOA(obj) \
+ (G_TYPE_CHECK_INSTANCE_CAST \
+ ((obj), E_TYPE_SOURCE_UOA, ESourceUoa))
+#define E_SOURCE_UOA_CLASS(cls) \
+ (G_TYPE_CHECK_CLASS_CAST \
+ ((cls), E_TYPE_SOURCE_UOA, ESourceUoaClass))
+#define E_IS_SOURCE_UOA(obj) \
+ (G_TYPE_CHECK_INSTANCE_TYPE \
+ ((obj), E_TYPE_SOURCE_UOA))
+#define E_IS_SOURCE_UOA_CLASS(cls) \
+ (G_TYPE_CHECK_CLASS_TYPE \
+ ((cls), E_TYPE_SOURCE_UOA))
+#define E_SOURCE_UOA_GET_CLASS(obj) \
+ (G_TYPE_INSTANCE_GET_CLASS \
+ ((obj), E_TYPE_SOURCE_UOA, ESourceUoaClass))
+
+/**
+ * E_SOURCE_EXTENSION_UOA:
+ *
+ * Pass this extension name to e_source_get_extension() to access
+ * #ESourceUoa. This is also used as a group name in key files.
+ *
+ * Since: 3.8
+ **/
+#define E_SOURCE_EXTENSION_UOA "Ubuntu Online Accounts"
+
+G_BEGIN_DECLS
+
+typedef struct _ESourceUoa ESourceUoa;
+typedef struct _ESourceUoaClass ESourceUoaClass;
+typedef struct _ESourceUoaPrivate ESourceUoaPrivate;
+
+/**
+ * ESourceUoa:
+ *
+ * Contains only private data that should be read and manipulated using the
+ * functions below.
+ *
+ * Since: 3.8
+ **/
+struct _ESourceUoa {
+ ESourceExtension parent;
+ ESourceUoaPrivate *priv;
+};
+
+struct _ESourceUoaClass {
+ ESourceExtensionClass parent_class;
+};
+
+GType e_source_uoa_get_type (void) G_GNUC_CONST;
+guint e_source_uoa_get_account_id (ESourceUoa *extension);
+void e_source_uoa_set_account_id (ESourceUoa *extension,
+ guint account_id);
+
+G_END_DECLS
+
+#endif /* E_SOURCE_UOA */
+