|
Packit |
4b6dd7 |
/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */
|
|
Packit |
4b6dd7 |
/*
|
|
Packit |
4b6dd7 |
* GData Client
|
|
Packit |
4b6dd7 |
* Copyright (C) Thibault Saunier 2009 <saunierthibault@gmail.com>
|
|
Packit |
4b6dd7 |
* Copyright (C) Philip Withnall 2009–2010, 2014 <philip@tecnocode.co.uk>
|
|
Packit |
4b6dd7 |
* Copyright (C) Red Hat, Inc. 2015
|
|
Packit |
4b6dd7 |
*
|
|
Packit |
4b6dd7 |
* GData Client is free software; you can redistribute it and/or
|
|
Packit |
4b6dd7 |
* modify it under the terms of the GNU Lesser General Public
|
|
Packit |
4b6dd7 |
* License as published by the Free Software Foundation; either
|
|
Packit |
4b6dd7 |
* version 2.1 of the License, or (at your option) any later version.
|
|
Packit |
4b6dd7 |
*
|
|
Packit |
4b6dd7 |
* GData Client is distributed in the hope that it will be useful,
|
|
Packit |
4b6dd7 |
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
Packit |
4b6dd7 |
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
Packit |
4b6dd7 |
* Lesser General Public License for more details.
|
|
Packit |
4b6dd7 |
*
|
|
Packit |
4b6dd7 |
* You should have received a copy of the GNU Lesser General Public
|
|
Packit |
4b6dd7 |
* License along with GData Client. If not, see <http://www.gnu.org/licenses/>.
|
|
Packit |
4b6dd7 |
*/
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
/**
|
|
Packit |
4b6dd7 |
* SECTION:gdata-access-rule
|
|
Packit |
4b6dd7 |
* @short_description: GData access rule object
|
|
Packit |
4b6dd7 |
* @stability: Stable
|
|
Packit |
4b6dd7 |
* @include: gdata/gdata-access-rule.h
|
|
Packit |
4b6dd7 |
*
|
|
Packit |
4b6dd7 |
* #GDataAccessRule is a subclass of #GDataEntry to represent a generic access rule from an access control list (ACL).
|
|
Packit |
4b6dd7 |
* It is returned by the ACL methods implemented in the #GDataAccessHandler interface.
|
|
Packit |
4b6dd7 |
*
|
|
Packit |
4b6dd7 |
* Access rules should be inserted to the %GDATA_LINK_ACCESS_CONTROL_LIST URI of the feed or entry they should be applied to. This will return a
|
|
Packit |
4b6dd7 |
* %GDATA_SERVICE_ERROR_CONFLICT error if a rule already exists on that feed or entry for that scope type and value.
|
|
Packit |
4b6dd7 |
*
|
|
Packit |
4b6dd7 |
* <example>
|
|
Packit |
4b6dd7 |
* <title>Adding a Rule to the Access Control List for an Entry</title>
|
|
Packit |
4b6dd7 |
* <programlisting>
|
|
Packit |
4b6dd7 |
* GDataAuthorizationDomain *domain;
|
|
Packit |
4b6dd7 |
* GDataService *service;
|
|
Packit |
4b6dd7 |
* GDataEntry *entry;
|
|
Packit |
4b6dd7 |
* GDataFeed *acl_feed;
|
|
Packit |
4b6dd7 |
* GDataAccessRule *rule, *new_rule;
|
|
Packit |
4b6dd7 |
* GError *error = NULL;
|
|
Packit |
4b6dd7 |
*
|
|
Packit |
4b6dd7 |
* domain = gdata_documents_service_get_primary_authorization_domain ();
|
|
Packit |
4b6dd7 |
*
|
|
Packit |
4b6dd7 |
* /* Retrieve a GDataEntry which will have a new rule inserted into its ACL. */
|
|
Packit |
4b6dd7 |
* service = build_my_service ();
|
|
Packit |
4b6dd7 |
* entry = get_the_entry (service);
|
|
Packit |
4b6dd7 |
*
|
|
Packit |
4b6dd7 |
* /* Create and insert a new access rule for example@gmail.com which grants them _no_ permissions on the entry.
|
|
Packit |
4b6dd7 |
* * In a real application, the GDataEntry subclass would define its own access roles which are more useful. For example,
|
|
Packit |
4b6dd7 |
* * GDataDocumentsEntry defines access roles for users who can read (but not write) a Google Document, and users who
|
|
Packit |
4b6dd7 |
* * can also write to the document. */
|
|
Packit |
4b6dd7 |
* rule = gdata_access_rule_new (NULL);
|
|
Packit |
4b6dd7 |
* gdata_access_rule_set_role (rule, GDATA_ACCESS_ROLE_NONE); /* or, for example, GDATA_DOCUMENTS_ACCESS_ROLE_READER */
|
|
Packit |
4b6dd7 |
* gdata_access_rule_set_scope (rule, GDATA_ACCESS_SCOPE_USER, "example@gmail.com"); /* e-mail address of the user the ACL applies to */
|
|
Packit |
4b6dd7 |
*
|
|
Packit |
4b6dd7 |
* acl_link = gdata_entry_look_up_link (entry, GDATA_LINK_ACCESS_CONTROL_LIST);
|
|
Packit |
4b6dd7 |
* new_rule = GDATA_ACCESS_RULE (gdata_service_insert_entry (GDATA_SERVICE (service), domain, gdata_link_get_uri (acl_link),
|
|
Packit |
4b6dd7 |
* GDATA_ENTRY (rule), NULL, &error));
|
|
Packit |
4b6dd7 |
*
|
|
Packit |
4b6dd7 |
* g_object_unref (rule);
|
|
Packit |
4b6dd7 |
* g_object_unref (entry);
|
|
Packit |
4b6dd7 |
* g_object_unref (service);
|
|
Packit |
4b6dd7 |
*
|
|
Packit |
4b6dd7 |
* if (error != NULL) {
|
|
Packit |
4b6dd7 |
* g_error ("Error inserting access rule: %s", error->message);
|
|
Packit |
4b6dd7 |
* g_error_free (error);
|
|
Packit |
4b6dd7 |
* return;
|
|
Packit |
4b6dd7 |
* }
|
|
Packit |
4b6dd7 |
*
|
|
Packit |
4b6dd7 |
* /* Potentially do something with the new_rule here, such as store its ID for later use. */
|
|
Packit |
4b6dd7 |
*
|
|
Packit |
4b6dd7 |
* g_object_unref (new_rule);
|
|
Packit |
4b6dd7 |
* </programlisting>
|
|
Packit |
4b6dd7 |
* </example>
|
|
Packit |
4b6dd7 |
*
|
|
Packit |
4b6dd7 |
* Since: 0.3.0
|
|
Packit |
4b6dd7 |
*/
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
#include <config.h>
|
|
Packit |
4b6dd7 |
#include <glib.h>
|
|
Packit |
4b6dd7 |
#include <libxml/parser.h>
|
|
Packit |
4b6dd7 |
#include <string.h>
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
#include "gdata-access-rule.h"
|
|
Packit |
4b6dd7 |
#include "gdata-parser.h"
|
|
Packit |
4b6dd7 |
#include "gdata-types.h"
|
|
Packit |
4b6dd7 |
#include "gdata-private.h"
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
static GObject *gdata_access_rule_constructor (GType type, guint n_construct_params, GObjectConstructParam *construct_params);
|
|
Packit |
4b6dd7 |
static void gdata_access_rule_finalize (GObject *object);
|
|
Packit |
4b6dd7 |
static void get_namespaces (GDataParsable *parsable, GHashTable *namespaces);
|
|
Packit |
4b6dd7 |
static void get_xml (GDataParsable *parsable, GString *xml_string);
|
|
Packit |
4b6dd7 |
static void gdata_access_rule_set_property (GObject *object, guint property_id, const GValue *value, GParamSpec *pspec);
|
|
Packit |
4b6dd7 |
static void gdata_access_rule_get_property (GObject *object, guint property_id, GValue *value, GParamSpec *pspec);
|
|
Packit |
4b6dd7 |
static gboolean parse_xml (GDataParsable *parsable, xmlDoc *doc, xmlNode *node, gpointer user_data, GError **error);
|
|
Packit |
4b6dd7 |
static gboolean post_parse_xml (GDataParsable *parsable, gpointer user_data, GError **error);
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
struct _GDataAccessRulePrivate {
|
|
Packit |
4b6dd7 |
gchar *role;
|
|
Packit |
4b6dd7 |
gchar *scope_type;
|
|
Packit |
4b6dd7 |
gchar *scope_value;
|
|
Packit |
4b6dd7 |
gint64 edited;
|
|
Packit |
4b6dd7 |
gchar *key;
|
|
Packit |
4b6dd7 |
};
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
enum {
|
|
Packit |
4b6dd7 |
PROP_ROLE = 1,
|
|
Packit |
4b6dd7 |
PROP_SCOPE_TYPE,
|
|
Packit |
4b6dd7 |
PROP_SCOPE_VALUE,
|
|
Packit |
4b6dd7 |
PROP_EDITED,
|
|
Packit |
4b6dd7 |
PROP_ETAG,
|
|
Packit |
4b6dd7 |
PROP_KEY,
|
|
Packit |
4b6dd7 |
};
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
G_DEFINE_TYPE (GDataAccessRule, gdata_access_rule, GDATA_TYPE_ENTRY)
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
static void
|
|
Packit |
4b6dd7 |
gdata_access_rule_class_init (GDataAccessRuleClass *klass)
|
|
Packit |
4b6dd7 |
{
|
|
Packit |
4b6dd7 |
GObjectClass *gobject_class = G_OBJECT_CLASS (klass);
|
|
Packit |
4b6dd7 |
GDataParsableClass *parsable_class = GDATA_PARSABLE_CLASS (klass);
|
|
Packit |
4b6dd7 |
GDataEntryClass *entry_class = GDATA_ENTRY_CLASS (klass);
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
g_type_class_add_private (klass, sizeof (GDataAccessRulePrivate));
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
gobject_class->constructor = gdata_access_rule_constructor;
|
|
Packit |
4b6dd7 |
gobject_class->finalize = gdata_access_rule_finalize;
|
|
Packit |
4b6dd7 |
gobject_class->get_property = gdata_access_rule_get_property;
|
|
Packit |
4b6dd7 |
gobject_class->set_property = gdata_access_rule_set_property;
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
parsable_class->parse_xml = parse_xml;
|
|
Packit |
4b6dd7 |
parsable_class->post_parse_xml = post_parse_xml;
|
|
Packit |
4b6dd7 |
parsable_class->get_xml = get_xml;
|
|
Packit |
4b6dd7 |
parsable_class->get_namespaces = get_namespaces;
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
entry_class->kind_term = "http://schemas.google.com/acl/2007#accessRule";
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
/**
|
|
Packit |
4b6dd7 |
* GDataAccessRule:role:
|
|
Packit |
4b6dd7 |
*
|
|
Packit |
4b6dd7 |
* The role of the person concerned by this ACL. By default, this can only be %GDATA_ACCESS_ROLE_NONE. Services may extend it with
|
|
Packit |
4b6dd7 |
* their own namespaced roles.
|
|
Packit |
4b6dd7 |
*
|
|
Packit |
4b6dd7 |
* Since: 0.3.0
|
|
Packit |
4b6dd7 |
*/
|
|
Packit |
4b6dd7 |
g_object_class_install_property (gobject_class, PROP_ROLE,
|
|
Packit |
4b6dd7 |
g_param_spec_string ("role",
|
|
Packit |
4b6dd7 |
"Role", "The role of the person concerned by this ACL.",
|
|
Packit |
4b6dd7 |
GDATA_ACCESS_ROLE_NONE,
|
|
Packit |
4b6dd7 |
G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
/**
|
|
Packit |
4b6dd7 |
* GDataAccessRule:scope-type:
|
|
Packit |
4b6dd7 |
*
|
|
Packit |
4b6dd7 |
* Specifies to whom this access rule applies. For example, %GDATA_ACCESS_SCOPE_USER or %GDATA_ACCESS_SCOPE_DEFAULT.
|
|
Packit |
4b6dd7 |
*
|
|
Packit |
4b6dd7 |
* Since: 0.3.0
|
|
Packit |
4b6dd7 |
*/
|
|
Packit |
4b6dd7 |
g_object_class_install_property (gobject_class, PROP_SCOPE_TYPE,
|
|
Packit |
4b6dd7 |
g_param_spec_string ("scope-type",
|
|
Packit |
4b6dd7 |
"Scope type", "Specifies to whom this access rule applies.",
|
|
Packit |
4b6dd7 |
GDATA_ACCESS_SCOPE_DEFAULT,
|
|
Packit |
4b6dd7 |
G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
/**
|
|
Packit |
4b6dd7 |
* GDataAccessRule:scope-value:
|
|
Packit |
4b6dd7 |
*
|
|
Packit |
4b6dd7 |
* A value representing the user who is represented by the access rule, such as an
|
|
Packit |
4b6dd7 |
* e-mail address for users, or a domain name for domains.
|
|
Packit |
4b6dd7 |
*
|
|
Packit |
4b6dd7 |
* This must be %NULL if and only if #GDataAccessRule:scope-type is %GDATA_ACCESS_SCOPE_DEFAULT.
|
|
Packit |
4b6dd7 |
*
|
|
Packit |
4b6dd7 |
* Since: 0.3.0
|
|
Packit |
4b6dd7 |
*/
|
|
Packit |
4b6dd7 |
g_object_class_install_property (gobject_class, PROP_SCOPE_VALUE,
|
|
Packit |
4b6dd7 |
g_param_spec_string ("scope-value",
|
|
Packit |
4b6dd7 |
"Scope value", "The scope value for this access rule.",
|
|
Packit |
4b6dd7 |
NULL,
|
|
Packit |
4b6dd7 |
G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
/**
|
|
Packit |
4b6dd7 |
* GDataAccessRule:edited:
|
|
Packit |
4b6dd7 |
*
|
|
Packit |
4b6dd7 |
* The last time the access rule was edited. If the rule has not been edited yet, the content indicates the time it was created.
|
|
Packit |
4b6dd7 |
*
|
|
Packit |
4b6dd7 |
* For more information, see the <ulink type="http" url="http://www.atomenabled.org/developers/protocol/#appEdited">
|
|
Packit |
4b6dd7 |
* Atom Publishing Protocol specification</ulink>.
|
|
Packit |
4b6dd7 |
*
|
|
Packit |
4b6dd7 |
* Since: 0.7.0
|
|
Packit |
4b6dd7 |
*/
|
|
Packit |
4b6dd7 |
g_object_class_install_property (gobject_class, PROP_EDITED,
|
|
Packit |
4b6dd7 |
g_param_spec_int64 ("edited",
|
|
Packit |
4b6dd7 |
"Edited", "The last time the access rule was edited.",
|
|
Packit |
4b6dd7 |
-1, G_MAXINT64, -1,
|
|
Packit |
4b6dd7 |
G_PARAM_READABLE | G_PARAM_STATIC_STRINGS));
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
/**
|
|
Packit |
4b6dd7 |
* GDataAccessRule:key:
|
|
Packit |
4b6dd7 |
*
|
|
Packit |
4b6dd7 |
* An optional authorisation key required to access this item with the given scope. If set, this restricts
|
|
Packit |
4b6dd7 |
* access to those principals who have a copy of the key. The key is generated server-side and cannot be
|
|
Packit |
4b6dd7 |
* modified by the client. If no authorisation key is set (and hence none is needed for access to the item),
|
|
Packit |
4b6dd7 |
* this will be %NULL.
|
|
Packit |
4b6dd7 |
*
|
|
Packit |
4b6dd7 |
* Since: 0.16.0
|
|
Packit |
4b6dd7 |
*/
|
|
Packit |
4b6dd7 |
g_object_class_install_property (gobject_class, PROP_KEY,
|
|
Packit |
4b6dd7 |
g_param_spec_string ("key",
|
|
Packit |
4b6dd7 |
"Key", "An optional authorisation key required to access this item.",
|
|
Packit |
4b6dd7 |
NULL,
|
|
Packit |
4b6dd7 |
G_PARAM_READABLE | G_PARAM_STATIC_STRINGS));
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
/* Override the ETag property since ETags don't seem to be supported for ACL entries. TODO: Investigate this further (might only be
|
|
Packit |
4b6dd7 |
* unsupported for Google Calendar). */
|
|
Packit |
4b6dd7 |
g_object_class_override_property (gobject_class, PROP_ETAG, "etag");
|
|
Packit |
4b6dd7 |
}
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
static void notify_role_cb (GDataAccessRule *self, GParamSpec *pspec, gpointer user_data);
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
static void
|
|
Packit |
4b6dd7 |
notify_title_cb (GDataAccessRule *self, GParamSpec *pspec, gpointer user_data)
|
|
Packit |
4b6dd7 |
{
|
|
Packit |
4b6dd7 |
/* Update GDataAccessRule:role */
|
|
Packit |
4b6dd7 |
g_signal_handlers_block_by_func (self, notify_role_cb, self);
|
|
Packit |
4b6dd7 |
gdata_access_rule_set_role (self, gdata_entry_get_title (GDATA_ENTRY (self)));
|
|
Packit |
4b6dd7 |
g_signal_handlers_unblock_by_func (self, notify_role_cb, self);
|
|
Packit |
4b6dd7 |
}
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
static void
|
|
Packit |
4b6dd7 |
notify_role_cb (GDataAccessRule *self, GParamSpec *pspec, gpointer user_data)
|
|
Packit |
4b6dd7 |
{
|
|
Packit |
4b6dd7 |
/* Update GDataEntry:title */
|
|
Packit |
4b6dd7 |
g_signal_handlers_block_by_func (self, notify_title_cb, self);
|
|
Packit |
4b6dd7 |
gdata_entry_set_title (GDATA_ENTRY (self), gdata_access_rule_get_role (self));
|
|
Packit |
4b6dd7 |
g_signal_handlers_unblock_by_func (self, notify_title_cb, self);
|
|
Packit |
4b6dd7 |
}
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
static void
|
|
Packit |
4b6dd7 |
gdata_access_rule_init (GDataAccessRule *self)
|
|
Packit |
4b6dd7 |
{
|
|
Packit |
4b6dd7 |
self->priv = G_TYPE_INSTANCE_GET_PRIVATE (self, GDATA_TYPE_ACCESS_RULE, GDataAccessRulePrivate);
|
|
Packit |
4b6dd7 |
self->priv->edited = -1;
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
/* Listen to change notifications for the entry's title, since it's linked to GDataAccessRule:role */
|
|
Packit |
4b6dd7 |
g_signal_connect (self, "notify::title", (GCallback) notify_title_cb, self);
|
|
Packit |
4b6dd7 |
g_signal_connect (self, "notify::role", (GCallback) notify_role_cb, self);
|
|
Packit |
4b6dd7 |
}
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
static GObject *
|
|
Packit |
4b6dd7 |
gdata_access_rule_constructor (GType type, guint n_construct_params, GObjectConstructParam *construct_params)
|
|
Packit |
4b6dd7 |
{
|
|
Packit |
4b6dd7 |
GObject *object;
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
/* Chain up to the parent class */
|
|
Packit |
4b6dd7 |
object = G_OBJECT_CLASS (gdata_access_rule_parent_class)->constructor (type, n_construct_params, construct_params);
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
/* We can't create these in init, or they would collide with the group and control created when parsing the XML */
|
|
Packit |
4b6dd7 |
if (_gdata_parsable_is_constructed_from_xml (GDATA_PARSABLE (object)) == FALSE) {
|
|
Packit |
4b6dd7 |
GDataAccessRulePrivate *priv = GDATA_ACCESS_RULE (object)->priv;
|
|
Packit |
4b6dd7 |
GTimeVal time_val;
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
/* Set the edited property to the current time (creation time). We don't do this in *_init() since that would cause
|
|
Packit |
4b6dd7 |
* setting it from parse_xml() to fail (duplicate element). */
|
|
Packit |
4b6dd7 |
g_get_current_time (&time_val);
|
|
Packit |
4b6dd7 |
priv->edited = time_val.tv_sec;
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
/* Set up the role and scope type */
|
|
Packit |
4b6dd7 |
priv->role = g_strdup (GDATA_ACCESS_ROLE_NONE);
|
|
Packit |
4b6dd7 |
priv->scope_type = g_strdup (GDATA_ACCESS_SCOPE_DEFAULT);
|
|
Packit |
4b6dd7 |
}
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
return object;
|
|
Packit |
4b6dd7 |
}
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
static void
|
|
Packit |
4b6dd7 |
gdata_access_rule_finalize (GObject *object)
|
|
Packit |
4b6dd7 |
{
|
|
Packit |
4b6dd7 |
GDataAccessRulePrivate *priv = GDATA_ACCESS_RULE (object)->priv;
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
g_free (priv->role);
|
|
Packit |
4b6dd7 |
g_free (priv->scope_type);
|
|
Packit |
4b6dd7 |
g_free (priv->scope_value);
|
|
Packit |
4b6dd7 |
g_free (priv->key);
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
/* Chain up to the parent class */
|
|
Packit |
4b6dd7 |
G_OBJECT_CLASS (gdata_access_rule_parent_class)->finalize (object);
|
|
Packit |
4b6dd7 |
}
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
static void
|
|
Packit |
4b6dd7 |
gdata_access_rule_get_property (GObject *object, guint property_id, GValue *value, GParamSpec *pspec)
|
|
Packit |
4b6dd7 |
{
|
|
Packit |
4b6dd7 |
GDataAccessRulePrivate *priv = GDATA_ACCESS_RULE (object)->priv;
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
switch (property_id) {
|
|
Packit |
4b6dd7 |
case PROP_ROLE:
|
|
Packit |
4b6dd7 |
g_value_set_string (value, priv->role);
|
|
Packit |
4b6dd7 |
break;
|
|
Packit |
4b6dd7 |
case PROP_SCOPE_TYPE:
|
|
Packit |
4b6dd7 |
g_value_set_string (value, priv->scope_type);
|
|
Packit |
4b6dd7 |
break;
|
|
Packit |
4b6dd7 |
case PROP_SCOPE_VALUE:
|
|
Packit |
4b6dd7 |
g_value_set_string (value, priv->scope_value);
|
|
Packit |
4b6dd7 |
break;
|
|
Packit |
4b6dd7 |
case PROP_EDITED:
|
|
Packit |
4b6dd7 |
g_value_set_int64 (value, priv->edited);
|
|
Packit |
4b6dd7 |
break;
|
|
Packit |
4b6dd7 |
case PROP_ETAG:
|
|
Packit |
4b6dd7 |
/* Never return an ETag */
|
|
Packit |
4b6dd7 |
g_value_set_string (value, NULL);
|
|
Packit |
4b6dd7 |
break;
|
|
Packit |
4b6dd7 |
case PROP_KEY:
|
|
Packit |
4b6dd7 |
g_value_set_string (value, priv->key);
|
|
Packit |
4b6dd7 |
break;
|
|
Packit |
4b6dd7 |
default:
|
|
Packit |
4b6dd7 |
/* We don't have any other property... */
|
|
Packit |
4b6dd7 |
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
|
|
Packit |
4b6dd7 |
break;
|
|
Packit |
4b6dd7 |
}
|
|
Packit |
4b6dd7 |
}
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
static void
|
|
Packit |
4b6dd7 |
gdata_access_rule_set_property (GObject *object, guint property_id, const GValue *value, GParamSpec *pspec)
|
|
Packit |
4b6dd7 |
{
|
|
Packit |
4b6dd7 |
GDataAccessRule *self = GDATA_ACCESS_RULE (object);
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
switch (property_id) {
|
|
Packit |
4b6dd7 |
case PROP_ROLE:
|
|
Packit |
4b6dd7 |
gdata_access_rule_set_role (self, g_value_get_string (value));
|
|
Packit |
4b6dd7 |
break;
|
|
Packit |
4b6dd7 |
case PROP_SCOPE_TYPE:
|
|
Packit |
4b6dd7 |
g_free (self->priv->scope_type);
|
|
Packit |
4b6dd7 |
self->priv->scope_type = g_value_dup_string (value);
|
|
Packit |
4b6dd7 |
g_object_notify (object, "scope-type");
|
|
Packit |
4b6dd7 |
break;
|
|
Packit |
4b6dd7 |
case PROP_SCOPE_VALUE:
|
|
Packit |
4b6dd7 |
g_free (self->priv->scope_value);
|
|
Packit |
4b6dd7 |
self->priv->scope_value = g_value_dup_string (value);
|
|
Packit |
4b6dd7 |
g_object_notify (object, "scope-value");
|
|
Packit |
4b6dd7 |
break;
|
|
Packit |
4b6dd7 |
case PROP_ETAG:
|
|
Packit |
4b6dd7 |
/* Never set an ETag (note that this doesn't stop it being set in GDataEntry due to XML parsing) */
|
|
Packit |
4b6dd7 |
break;
|
|
Packit |
4b6dd7 |
case PROP_KEY:
|
|
Packit |
4b6dd7 |
/* Read only; fall through */
|
|
Packit |
4b6dd7 |
default:
|
|
Packit |
4b6dd7 |
/* We don't have any other property... */
|
|
Packit |
4b6dd7 |
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
|
|
Packit |
4b6dd7 |
break;
|
|
Packit |
4b6dd7 |
}
|
|
Packit |
4b6dd7 |
}
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
static gboolean
|
|
Packit |
4b6dd7 |
parse_xml (GDataParsable *parsable, xmlDoc *doc, xmlNode *node, gpointer user_data, GError **error)
|
|
Packit |
4b6dd7 |
{
|
|
Packit |
4b6dd7 |
gboolean success;
|
|
Packit |
4b6dd7 |
GDataAccessRule *self = GDATA_ACCESS_RULE (parsable);
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
if (gdata_parser_is_namespace (node, "http://www.w3.org/2007/app") == TRUE &&
|
|
Packit |
4b6dd7 |
gdata_parser_int64_time_from_element (node, "edited", P_REQUIRED | P_NO_DUPES, &(self->priv->edited), &success, error) == TRUE) {
|
|
Packit |
4b6dd7 |
return success;
|
|
Packit |
4b6dd7 |
} else if (gdata_parser_is_namespace (node, "http://schemas.google.com/acl/2007") == TRUE) {
|
|
Packit |
4b6dd7 |
if (xmlStrcmp (node->name, (xmlChar*) "role") == 0) {
|
|
Packit |
4b6dd7 |
/* gAcl:role */
|
|
Packit |
4b6dd7 |
xmlChar *role = xmlGetProp (node, (xmlChar*) "value");
|
|
Packit |
4b6dd7 |
if (role == NULL || *role == '\0') {
|
|
Packit |
4b6dd7 |
xmlFree (role);
|
|
Packit |
4b6dd7 |
return gdata_parser_error_required_property_missing (node, "value", error);
|
|
Packit |
4b6dd7 |
}
|
|
Packit |
4b6dd7 |
self->priv->role = (gchar*) role;
|
|
Packit |
4b6dd7 |
} else if (xmlStrcmp (node->name, (xmlChar*) "scope") == 0) {
|
|
Packit |
4b6dd7 |
/* gAcl:scope */
|
|
Packit |
4b6dd7 |
xmlChar *scope_type, *scope_value;
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
scope_type = xmlGetProp (node, (xmlChar*) "type");
|
|
Packit |
4b6dd7 |
if (scope_type == NULL || *scope_type == '\0') {
|
|
Packit |
4b6dd7 |
xmlFree (scope_type);
|
|
Packit |
4b6dd7 |
return gdata_parser_error_required_property_missing (node, "type", error);
|
|
Packit |
4b6dd7 |
}
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
scope_value = xmlGetProp (node, (xmlChar*) "value");
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
/* The @value property is required for all scope types except "default".
|
|
Packit |
4b6dd7 |
* See: https://developers.google.com/google-apps/calendar/v2/reference#gacl_reference */
|
|
Packit |
4b6dd7 |
if (xmlStrcmp (scope_type, (xmlChar*) GDATA_ACCESS_SCOPE_DEFAULT) != 0 && scope_value == NULL) {
|
|
Packit |
4b6dd7 |
xmlFree (scope_type);
|
|
Packit |
4b6dd7 |
return gdata_parser_error_required_property_missing (node, "value", error);
|
|
Packit |
4b6dd7 |
}
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
self->priv->scope_type = (gchar*) scope_type;
|
|
Packit |
4b6dd7 |
self->priv->scope_value = (gchar*) scope_value;
|
|
Packit |
4b6dd7 |
} else if (xmlStrcmp (node->name, (xmlChar*) "withKey") == 0) {
|
|
Packit |
4b6dd7 |
/* gAcl:withKey */
|
|
Packit |
4b6dd7 |
gboolean found_role = FALSE;
|
|
Packit |
4b6dd7 |
xmlNode *child;
|
|
Packit |
4b6dd7 |
xmlChar *key;
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
/* Extract the key. */
|
|
Packit |
4b6dd7 |
key = xmlGetProp (node, (xmlChar *) "key");
|
|
Packit |
4b6dd7 |
if (key == NULL) {
|
|
Packit |
4b6dd7 |
return gdata_parser_error_required_property_missing (node, "key", error);
|
|
Packit |
4b6dd7 |
}
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
self->priv->key = (gchar *) key;
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
/* Look for a gAcl:role child element. */
|
|
Packit |
4b6dd7 |
for (child = node->children; child != NULL; child = child->next) {
|
|
Packit |
4b6dd7 |
if (xmlStrcmp (child->name, (xmlChar*) "role") == 0) {
|
|
Packit |
4b6dd7 |
xmlChar *role = xmlGetProp (child, (xmlChar *) "value");
|
|
Packit |
4b6dd7 |
if (role == NULL) {
|
|
Packit |
4b6dd7 |
return gdata_parser_error_required_property_missing (child, "value", error);
|
|
Packit |
4b6dd7 |
}
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
self->priv->role = (gchar *) role;
|
|
Packit |
4b6dd7 |
found_role = TRUE;
|
|
Packit |
4b6dd7 |
} else {
|
|
Packit |
4b6dd7 |
/* TODO: this logic copied from gdata-parsable.c. Re-evaluate this at some point in the future.
|
|
Packit |
4b6dd7 |
* If GeoRSS and GML support were to be used more widely, it might due to implement GML objects. */
|
|
Packit |
4b6dd7 |
xmlBuffer *buffer;
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
/* Unhandled XML */
|
|
Packit |
4b6dd7 |
buffer = xmlBufferCreate ();
|
|
Packit |
4b6dd7 |
xmlNodeDump (buffer, doc, child, 0, 0);
|
|
Packit |
4b6dd7 |
g_debug ("Unhandled XML in <gAcl:withKey>: %s", (gchar *) xmlBufferContent (buffer));
|
|
Packit |
4b6dd7 |
xmlBufferFree (buffer);
|
|
Packit |
4b6dd7 |
}
|
|
Packit |
4b6dd7 |
}
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
if (!found_role) {
|
|
Packit |
4b6dd7 |
return gdata_parser_error_required_element_missing ("role", "gAcl:withKey", error);
|
|
Packit |
4b6dd7 |
}
|
|
Packit |
4b6dd7 |
} else {
|
|
Packit |
4b6dd7 |
return GDATA_PARSABLE_CLASS (gdata_access_rule_parent_class)->parse_xml (parsable, doc, node, user_data, error);
|
|
Packit |
4b6dd7 |
}
|
|
Packit |
4b6dd7 |
} else {
|
|
Packit |
4b6dd7 |
return GDATA_PARSABLE_CLASS (gdata_access_rule_parent_class)->parse_xml (parsable, doc, node, user_data, error);
|
|
Packit |
4b6dd7 |
}
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
return TRUE;
|
|
Packit |
4b6dd7 |
}
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
static gboolean
|
|
Packit |
4b6dd7 |
post_parse_xml (GDataParsable *parsable, gpointer user_data, GError **error)
|
|
Packit |
4b6dd7 |
{
|
|
Packit |
4b6dd7 |
GDataAccessRulePrivate *priv = GDATA_ACCESS_RULE (parsable)->priv;
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
/* Check for missing required elements */
|
|
Packit |
4b6dd7 |
if (gdata_entry_get_title (GDATA_ENTRY (parsable)) == NULL || *gdata_entry_get_title (GDATA_ENTRY (parsable)) == '\0')
|
|
Packit |
4b6dd7 |
return gdata_parser_error_required_element_missing ("role", "entry", error);
|
|
Packit |
4b6dd7 |
if (priv->scope_type == NULL)
|
|
Packit |
4b6dd7 |
return gdata_parser_error_required_element_missing ("scope", "entry", error);
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
return TRUE;
|
|
Packit |
4b6dd7 |
}
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
static void
|
|
Packit |
4b6dd7 |
get_xml (GDataParsable *parsable, GString *xml_string)
|
|
Packit |
4b6dd7 |
{
|
|
Packit |
4b6dd7 |
GDataAccessRulePrivate *priv = GDATA_ACCESS_RULE (parsable)->priv;
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
/* Chain up to the parent class */
|
|
Packit |
4b6dd7 |
GDATA_PARSABLE_CLASS (gdata_access_rule_parent_class)->get_xml (parsable, xml_string);
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
if (priv->key != NULL) {
|
|
Packit |
4b6dd7 |
/* gAcl:withKey; has to wrap gAcl:role */
|
|
Packit |
4b6dd7 |
gdata_parser_string_append_escaped (xml_string, "<gAcl:withKey key='", priv->key, "'>");
|
|
Packit |
4b6dd7 |
}
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
if (priv->role != NULL) {
|
|
Packit |
4b6dd7 |
/* gAcl:role */
|
|
Packit |
4b6dd7 |
gdata_parser_string_append_escaped (xml_string, "<gAcl:role value='", priv->role, "'/>");
|
|
Packit |
4b6dd7 |
}
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
if (priv->key != NULL) {
|
|
Packit |
4b6dd7 |
g_string_append (xml_string, "</gAcl:withKey>");
|
|
Packit |
4b6dd7 |
}
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
if (priv->scope_value != NULL) {
|
|
Packit |
4b6dd7 |
/* gAcl:scope */
|
|
Packit |
4b6dd7 |
if (priv->scope_type != NULL) {
|
|
Packit |
4b6dd7 |
gdata_parser_string_append_escaped (xml_string, "
|
|
Packit |
4b6dd7 |
gdata_parser_string_append_escaped (xml_string, " value='", priv->scope_value, "'/>");
|
|
Packit |
4b6dd7 |
} else {
|
|
Packit |
4b6dd7 |
gdata_parser_string_append_escaped (xml_string, "<gAcl:scope value='", priv->scope_value, "'/>");
|
|
Packit |
4b6dd7 |
}
|
|
Packit |
4b6dd7 |
} else {
|
|
Packit |
4b6dd7 |
/* gAcl:scope of type GDATA_ACCESS_SCOPE_DEFAULT. */
|
|
Packit |
4b6dd7 |
g_assert (priv->scope_type != NULL && strcmp (priv->scope_type, GDATA_ACCESS_SCOPE_DEFAULT) == 0);
|
|
Packit |
4b6dd7 |
g_string_append (xml_string, "<gAcl:scope type='default'/>");
|
|
Packit |
4b6dd7 |
}
|
|
Packit |
4b6dd7 |
}
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
static void
|
|
Packit |
4b6dd7 |
get_namespaces (GDataParsable *parsable, GHashTable *namespaces)
|
|
Packit |
4b6dd7 |
{
|
|
Packit |
4b6dd7 |
/* Chain up to the parent class */
|
|
Packit |
4b6dd7 |
GDATA_PARSABLE_CLASS (gdata_access_rule_parent_class)->get_namespaces (parsable, namespaces);
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
g_hash_table_insert (namespaces, (gchar*) "gAcl", (gchar*) "http://schemas.google.com/acl/2007");
|
|
Packit |
4b6dd7 |
}
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
/**
|
|
Packit |
4b6dd7 |
* gdata_access_rule_new:
|
|
Packit |
4b6dd7 |
* @id: the access rule's ID, or %NULL
|
|
Packit |
4b6dd7 |
*
|
|
Packit |
4b6dd7 |
* Creates a new #GDataAccessRule with the given ID and default properties.
|
|
Packit |
4b6dd7 |
*
|
|
Packit |
4b6dd7 |
* Return value: a new #GDataAccessRule; unref with g_object_unref()
|
|
Packit |
4b6dd7 |
*
|
|
Packit |
4b6dd7 |
* Since: 0.3.0
|
|
Packit |
4b6dd7 |
*/
|
|
Packit |
4b6dd7 |
GDataAccessRule *
|
|
Packit |
4b6dd7 |
gdata_access_rule_new (const gchar *id)
|
|
Packit |
4b6dd7 |
{
|
|
Packit |
4b6dd7 |
return GDATA_ACCESS_RULE (g_object_new (GDATA_TYPE_ACCESS_RULE, "id", id, NULL));
|
|
Packit |
4b6dd7 |
}
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
/**
|
|
Packit |
4b6dd7 |
* gdata_access_rule_set_role:
|
|
Packit |
4b6dd7 |
* @self: a #GDataAccessRule
|
|
Packit |
4b6dd7 |
* @role: a new role, or %NULL
|
|
Packit |
4b6dd7 |
*
|
|
Packit |
4b6dd7 |
* Sets the #GDataAccessRule:role property to @role. @role must be a non-empty string, such as %GDATA_ACCESS_ROLE_NONE.
|
|
Packit |
4b6dd7 |
*
|
|
Packit |
4b6dd7 |
* Set @role to %NULL to unset the property in the access rule.
|
|
Packit |
4b6dd7 |
*
|
|
Packit |
4b6dd7 |
* Since: 0.3.0
|
|
Packit |
4b6dd7 |
*/
|
|
Packit |
4b6dd7 |
void
|
|
Packit |
4b6dd7 |
gdata_access_rule_set_role (GDataAccessRule *self, const gchar *role)
|
|
Packit |
4b6dd7 |
{
|
|
Packit |
4b6dd7 |
g_return_if_fail (GDATA_IS_ACCESS_RULE (self));
|
|
Packit |
4b6dd7 |
g_return_if_fail (role == NULL || *role != '\0');
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
g_free (self->priv->role);
|
|
Packit |
4b6dd7 |
self->priv->role = g_strdup (role);
|
|
Packit |
4b6dd7 |
g_object_notify (G_OBJECT (self), "role");
|
|
Packit |
4b6dd7 |
}
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
/**
|
|
Packit |
4b6dd7 |
* gdata_access_rule_get_role:
|
|
Packit |
4b6dd7 |
* @self: a #GDataAccessRule
|
|
Packit |
4b6dd7 |
*
|
|
Packit |
4b6dd7 |
* Gets the #GDataAccessRule:role property.
|
|
Packit |
4b6dd7 |
*
|
|
Packit |
4b6dd7 |
* Return value: the access rule's role, or %NULL
|
|
Packit |
4b6dd7 |
*
|
|
Packit |
4b6dd7 |
* Since: 0.3.0
|
|
Packit |
4b6dd7 |
*/
|
|
Packit |
4b6dd7 |
const gchar *
|
|
Packit |
4b6dd7 |
gdata_access_rule_get_role (GDataAccessRule *self)
|
|
Packit |
4b6dd7 |
{
|
|
Packit |
4b6dd7 |
g_return_val_if_fail (GDATA_IS_ACCESS_RULE (self), NULL);
|
|
Packit |
4b6dd7 |
return self->priv->role;
|
|
Packit |
4b6dd7 |
}
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
/**
|
|
Packit |
4b6dd7 |
* gdata_access_rule_set_scope:
|
|
Packit |
4b6dd7 |
* @self: a #GDataAccessRule
|
|
Packit |
4b6dd7 |
* @type: a new scope type
|
|
Packit |
4b6dd7 |
* @value: (allow-none): a new scope value, or %NULL
|
|
Packit |
4b6dd7 |
*
|
|
Packit |
4b6dd7 |
* Sets the #GDataAccessRule:scope-type property to @type and the #GDataAccessRule:scope-value property to @value.
|
|
Packit |
4b6dd7 |
*
|
|
Packit |
4b6dd7 |
* Set @scope_value to %NULL to unset the #GDataAccessRule:scope-value property in the access rule. @type cannot
|
|
Packit |
4b6dd7 |
* be %NULL. @scope_value must be %NULL if @type is <literal>default</literal>, and non-%NULL otherwise.
|
|
Packit |
4b6dd7 |
*
|
|
Packit |
4b6dd7 |
* See the
|
|
Packit |
4b6dd7 |
* <ulink type="http" url="https://developers.google.com/google-apps/calendar/v3/reference/acl">online
|
|
Packit |
4b6dd7 |
* documentation</ulink> for more information.
|
|
Packit |
4b6dd7 |
*
|
|
Packit |
4b6dd7 |
* Since: 0.3.0
|
|
Packit |
4b6dd7 |
*/
|
|
Packit |
4b6dd7 |
void
|
|
Packit |
4b6dd7 |
gdata_access_rule_set_scope (GDataAccessRule *self, const gchar *type, const gchar *value)
|
|
Packit |
4b6dd7 |
{
|
|
Packit |
4b6dd7 |
g_return_if_fail (GDATA_IS_ACCESS_RULE (self));
|
|
Packit |
4b6dd7 |
g_return_if_fail (type != NULL && *type != '\0');
|
|
Packit |
4b6dd7 |
g_return_if_fail ((strcmp (type, GDATA_ACCESS_SCOPE_DEFAULT) == 0 && value == NULL) || value != NULL);
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
g_free (self->priv->scope_type);
|
|
Packit |
4b6dd7 |
self->priv->scope_type = g_strdup (type);
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
g_free (self->priv->scope_value);
|
|
Packit |
4b6dd7 |
self->priv->scope_value = g_strdup (value);
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
g_object_freeze_notify (G_OBJECT (self));
|
|
Packit |
4b6dd7 |
g_object_notify (G_OBJECT (self), "scope-type");
|
|
Packit |
4b6dd7 |
g_object_notify (G_OBJECT (self), "scope-value");
|
|
Packit |
4b6dd7 |
g_object_thaw_notify (G_OBJECT (self));
|
|
Packit |
4b6dd7 |
}
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
/**
|
|
Packit |
4b6dd7 |
* gdata_access_rule_get_scope:
|
|
Packit |
4b6dd7 |
* @self: a #GDataAccessRule
|
|
Packit |
4b6dd7 |
* @type: (out callee-allocates) (transfer none) (allow-none): return location for the scope type, or %NULL
|
|
Packit |
4b6dd7 |
* @value: (out callee-allocates) (transfer none) (allow-none): return location for the scope value, or %NULL
|
|
Packit |
4b6dd7 |
*
|
|
Packit |
4b6dd7 |
* Gets the #GDataAccessRule:scope-type and #GDataAccessRule:scope-value properties.
|
|
Packit |
4b6dd7 |
*
|
|
Packit |
4b6dd7 |
* Since: 0.3.0
|
|
Packit |
4b6dd7 |
*/
|
|
Packit |
4b6dd7 |
void
|
|
Packit |
4b6dd7 |
gdata_access_rule_get_scope (GDataAccessRule *self, const gchar **type, const gchar **value)
|
|
Packit |
4b6dd7 |
{
|
|
Packit |
4b6dd7 |
g_return_if_fail (GDATA_IS_ACCESS_RULE (self));
|
|
Packit |
4b6dd7 |
if (type != NULL)
|
|
Packit |
4b6dd7 |
*type = self->priv->scope_type;
|
|
Packit |
4b6dd7 |
if (value != NULL)
|
|
Packit |
4b6dd7 |
*value = self->priv->scope_value;
|
|
Packit |
4b6dd7 |
}
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
/**
|
|
Packit |
4b6dd7 |
* gdata_access_rule_get_edited:
|
|
Packit |
4b6dd7 |
* @self: a #GDataAccessRule
|
|
Packit |
4b6dd7 |
*
|
|
Packit |
4b6dd7 |
* Gets the #GDataAccessRule:edited property. If the property is unset, -1 will be returned.
|
|
Packit |
4b6dd7 |
*
|
|
Packit |
4b6dd7 |
* Return value: the UNIX timestamp for the time the access rule was last edited, or -1
|
|
Packit |
4b6dd7 |
*
|
|
Packit |
4b6dd7 |
* Since: 0.7.0
|
|
Packit |
4b6dd7 |
*/
|
|
Packit |
4b6dd7 |
gint64
|
|
Packit |
4b6dd7 |
gdata_access_rule_get_edited (GDataAccessRule *self)
|
|
Packit |
4b6dd7 |
{
|
|
Packit |
4b6dd7 |
g_return_val_if_fail (GDATA_IS_ACCESS_RULE (self), -1);
|
|
Packit |
4b6dd7 |
return self->priv->edited;
|
|
Packit |
4b6dd7 |
}
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
void
|
|
Packit |
4b6dd7 |
_gdata_access_rule_set_key (GDataAccessRule *self, const gchar *key)
|
|
Packit |
4b6dd7 |
{
|
|
Packit |
4b6dd7 |
g_return_if_fail (GDATA_IS_ACCESS_RULE (self));
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
if (g_strcmp0 (key, self->priv->key) == 0)
|
|
Packit |
4b6dd7 |
return;
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
g_free (self->priv->key);
|
|
Packit |
4b6dd7 |
self->priv->key = g_strdup (key);
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
g_object_notify (G_OBJECT (self), "key");
|
|
Packit |
4b6dd7 |
}
|
|
Packit |
4b6dd7 |
|
|
Packit |
4b6dd7 |
/**
|
|
Packit |
4b6dd7 |
* gdata_access_rule_get_key:
|
|
Packit |
4b6dd7 |
* @self: a #GDataAccessRule
|
|
Packit |
4b6dd7 |
*
|
|
Packit |
4b6dd7 |
* Gets the #GDataAccessRule:key property.
|
|
Packit |
4b6dd7 |
*
|
|
Packit |
4b6dd7 |
* Return value: the access rule's authorisation key, or %NULL
|
|
Packit |
4b6dd7 |
*
|
|
Packit |
4b6dd7 |
* Since: 0.16.0
|
|
Packit |
4b6dd7 |
*/
|
|
Packit |
4b6dd7 |
const gchar *
|
|
Packit |
4b6dd7 |
gdata_access_rule_get_key (GDataAccessRule *self)
|
|
Packit |
4b6dd7 |
{
|
|
Packit |
4b6dd7 |
g_return_val_if_fail (GDATA_IS_ACCESS_RULE (self), NULL);
|
|
Packit |
4b6dd7 |
return self->priv->key;
|
|
Packit |
4b6dd7 |
}
|