[libgdata: 5/7] demos: Added a demo to get/set/remove GDataDocumentsProperty in bulk
- From: Philip Withnall <pwithnall src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [libgdata: 5/7] demos: Added a demo to get/set/remove GDataDocumentsProperty in bulk
- Date: Tue, 30 Jul 2019 15:46:37 +0000 (UTC)
commit 7f65364ef55e8c2522d62c4821f9364f1a306e32
Author: Mayank Sharma <mayank8019 gmail com>
Date: Thu Jul 25 17:06:29 2019 +0530
demos: Added a demo to get/set/remove GDataDocumentsProperty in bulk
The demo program uses the newly added GDataDocumentsProperty to create
custom properties on GDataDocumentsEntry, based upon the ownership of
the file. A full run of docs-property program will firstly set 4 public
properties on each file in a user's Google Drive (limited to first 10
files only), and then goes on to unset them all, thereby returning
files' metadata to their initial state.
demos/docs-property/docs-property.c | 254 ++++++++++++++++++++++++++++++++++++
demos/meson.build | 5 +-
2 files changed, 258 insertions(+), 1 deletion(-)
---
diff --git a/demos/docs-property/docs-property.c b/demos/docs-property/docs-property.c
new file mode 100644
index 00000000..b1586141
--- /dev/null
+++ b/demos/docs-property/docs-property.c
@@ -0,0 +1,254 @@
+/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */
+/*
+ * GData Client
+ * Copyright (C) 2019 Mayank Sharma <mayank8019 gmail com>
+ *
+ * GData Client 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.1 of the License, or (at your option) any later version.
+ *
+ * GData Client 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 GData Client. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+/*
+ * Simple example program to fetch a list of all the files from a user's Google Drive,
+ * then set the documents property and finally remove those set properties.
+ *
+ * This program is just meant to show how to set/get/remove GDataDocumentsProperty
+ * , i.e. the Property Resource on a file.
+ */
+
+#include <gio/gio.h>
+#include <glib.h>
+#include <locale.h>
+
+#define GOA_API_IS_SUBJECT_TO_CHANGE
+#include <gdata/gdata.h>
+#include <goa/goa.h>
+
+#define SET_DUMMY_PROPERTIES TRUE
+
+static void print_documents_properties (GDataDocumentsEntry *entry);
+static void set_dummy_properties (GDataDocumentsEntry *entry);
+static void unset_dummy_properties (GDataDocumentsEntry *entry);
+static gboolean is_owner (GDataService *service, GDataEntry *entry);
+
+static void test_dummy_properties (GDataDocumentsService *service, gboolean set, GCancellable *cancellable,
GError **error);
+
+gint
+main (void)
+{
+ g_autoptr(GDataDocumentsService) service = NULL;
+ g_autoptr(GError) error = NULL;
+ g_autolist(GoaObject) accounts = NULL;
+ GList *l = NULL;
+ g_autoptr(GoaClient) client = NULL;
+ gint retval = 0;
+
+ setlocale (LC_ALL, "");
+
+ client = goa_client_new_sync (NULL, &error);
+ if (error != NULL) {
+ g_warning ("%s", error->message);
+ return 1;
+ }
+
+ accounts = goa_client_get_accounts (client);
+ for (l = accounts; l != NULL; l = l->next) {
+ GoaAccount *account;
+ GoaObject *object = GOA_OBJECT (l->data);
+ const gchar *provider_type, *account_identity;
+
+ account = goa_object_peek_account (object);
+ provider_type = goa_account_get_provider_type (account);
+ account_identity = goa_account_get_identity (account);
+
+ if (g_strcmp0 (provider_type, "google") == 0) {
+ g_autoptr(GDataGoaAuthorizer) authorizer = NULL;
+
+ authorizer = gdata_goa_authorizer_new (object);
+ service = gdata_documents_service_new (GDATA_AUTHORIZER (authorizer));
+
+ if (service == NULL) {
+ g_warning ("Account not found");
+ retval = 1;
+ continue;
+ }
+
+ g_message ("Setting dummy properties on the files owned by user - %s",
account_identity);
+ test_dummy_properties (service, SET_DUMMY_PROPERTIES, NULL, &error);
+ if (error != NULL) {
+ g_warning ("Error: %s", error->message);
+ retval = 1;
+ continue;
+ }
+
+ g_message ("Removing dummy properties from the files owned by user - %s",
account_identity);
+ test_dummy_properties (service, !SET_DUMMY_PROPERTIES, NULL, &error);
+ if (error != NULL) {
+ g_warning ("Error: %s", error->message);
+ retval = 1;
+ continue;
+ }
+ }
+ }
+
+ return retval;
+}
+
+static void
+test_dummy_properties (GDataDocumentsService *service, gboolean set, GCancellable *cancellable, GError
**error)
+{
+ g_autoptr(GDataDocumentsQuery) query = NULL;
+ g_autoptr(GDataDocumentsFeed) feed = NULL;
+ g_autoptr(GError) child_error = NULL;
+ GList *entries;
+ GList *l;
+
+ query = gdata_documents_query_new_with_limits (NULL, 1, 10);
+ gdata_documents_query_set_show_folders (query, TRUE);
+
+ /* Since our query supports fetching 10 results in one go, we just
+ * perform fetch a single page of query. You can use pagination here
+ * and call gdata_query_next_page (GDATA_QUERY (query)) inside a while
+ * loop to set/unset properties on all the files.
+ * */
+ feed = gdata_documents_service_query_documents (service, query, NULL, NULL, NULL, &child_error);
+ if (child_error != NULL) {
+ g_propagate_error (error, g_steal_pointer (&child_error));
+ return;
+ }
+
+ entries = gdata_feed_get_entries (GDATA_FEED (feed));
+ if (entries == NULL) {
+ return;
+ }
+
+ for (l = entries; l != NULL; l = l->next) {
+ const gchar *title;
+ g_autoptr(GDataEntry) new_entry = NULL;
+ GDataEntry *entry = GDATA_ENTRY (l->data);
+
+ title = gdata_entry_get_title (entry);
+ g_message ("File = %s, id = %s", title, gdata_entry_get_id (GDATA_ENTRY (entry)));
+
+ if (!is_owner (GDATA_SERVICE (service), entry)) {
+ g_message ("\t**NOT OWNED**");
+ continue;
+ }
+
+ if (set) {
+ set_dummy_properties (GDATA_DOCUMENTS_ENTRY (entry));
+ } else {
+ unset_dummy_properties (GDATA_DOCUMENTS_ENTRY (entry));
+ }
+
+ new_entry = gdata_service_update_entry (GDATA_SERVICE (service),
+
gdata_documents_service_get_primary_authorization_domain(),
+ entry,
+ NULL,
+ &child_error);
+
+ if (child_error != NULL) {
+ g_propagate_error (error, g_steal_pointer (&child_error));
+ return;
+ }
+
+ print_documents_properties (GDATA_DOCUMENTS_ENTRY (new_entry));
+ }
+}
+
+static gboolean
+is_owner (GDataService *service, GDataEntry *entry) {
+ GList *l;
+ GDataGoaAuthorizer *goa_authorizer;
+ GoaAccount *account;
+ const gchar *account_identity;
+
+ goa_authorizer = GDATA_GOA_AUTHORIZER (gdata_service_get_authorizer (service));
+ account = goa_object_peek_account (gdata_goa_authorizer_get_goa_object (goa_authorizer));
+ account_identity = goa_account_get_identity (account);
+
+ for (l = gdata_entry_get_authors (entry); l != NULL; l = l->next) {
+ GDataAuthor *author = GDATA_AUTHOR (l->data);
+
+ if (g_strcmp0 (gdata_author_get_email_address (author), account_identity) == 0) {
+ return TRUE;
+ }
+ }
+
+ return FALSE;
+}
+
+static void
+print_documents_properties (GDataDocumentsEntry *entry)
+{
+ GList *l, *properties;
+
+ g_return_if_fail (GDATA_IS_DOCUMENTS_ENTRY (entry));
+
+ properties = gdata_documents_entry_get_document_properties (GDATA_DOCUMENTS_ENTRY (entry));
+ for (l = properties; l != NULL; l = l->next) {
+ GDataDocumentsProperty *property = GDATA_DOCUMENTS_PROPERTY (l->data);
+
+ g_message ("\tkey = %s, value = %s, %s",
+ gdata_documents_property_get_key (GDATA_DOCUMENTS_PROPERTY (property)),
+ gdata_documents_property_get_value (GDATA_DOCUMENTS_PROPERTY (property)),
+ gdata_documents_property_get_visibility (GDATA_DOCUMENTS_PROPERTY (property))
+ );
+ }
+
+}
+
+static void
+set_dummy_properties (GDataDocumentsEntry *entry)
+{
+ g_autoptr(GDataDocumentsProperty) p1 = NULL, p2 = NULL, p3 = NULL, p4 = NULL;
+
+ p1 = gdata_documents_property_new ("1");
+ gdata_documents_property_set_visibility (p1, GDATA_DOCUMENTS_PROPERTY_VISIBILITY_PUBLIC);
+ gdata_documents_property_set_value (p1, "ONE");
+ gdata_documents_entry_add_documents_property (entry, p1);
+
+ p2 = gdata_documents_property_new ("2");
+ gdata_documents_property_set_visibility (p2, GDATA_DOCUMENTS_PROPERTY_VISIBILITY_PRIVATE);
+ gdata_documents_property_set_value (p2, "TWO");
+ gdata_documents_entry_add_documents_property (entry, p2);
+
+ p3 = gdata_documents_property_new ("3");
+ gdata_documents_property_set_visibility (p3, GDATA_DOCUMENTS_PROPERTY_VISIBILITY_PUBLIC);
+ gdata_documents_entry_add_documents_property (entry, p3);
+
+ p4 = gdata_documents_property_new ("4");
+ gdata_documents_property_set_visibility (p4, GDATA_DOCUMENTS_PROPERTY_VISIBILITY_PRIVATE);
+ gdata_documents_entry_add_documents_property (entry, p4);
+}
+
+static void
+unset_dummy_properties (GDataDocumentsEntry *entry)
+{
+ g_autoptr(GDataDocumentsProperty) p1 = NULL, p2 = NULL, p3 = NULL, p4 = NULL;
+
+ p1 = gdata_documents_property_new ("1");
+ gdata_documents_property_set_visibility (p1, GDATA_DOCUMENTS_PROPERTY_VISIBILITY_PUBLIC);
+ gdata_documents_entry_remove_documents_property (entry, p1);
+
+ p2 = gdata_documents_property_new ("2");
+ gdata_documents_property_set_visibility (p2, GDATA_DOCUMENTS_PROPERTY_VISIBILITY_PRIVATE);
+ gdata_documents_entry_remove_documents_property (entry, p2);
+
+ p3 = gdata_documents_property_new ("3");
+ gdata_documents_property_set_visibility (p3, GDATA_DOCUMENTS_PROPERTY_VISIBILITY_PUBLIC);
+ gdata_documents_entry_remove_documents_property (entry, p3);
+
+ p4 = gdata_documents_property_new ("4");
+ gdata_documents_property_set_visibility (p4, GDATA_DOCUMENTS_PROPERTY_VISIBILITY_PRIVATE);
+ gdata_documents_entry_remove_documents_property (entry, p4);
+}
diff --git a/demos/meson.build b/demos/meson.build
index dd0eccde..7d2e52e7 100644
--- a/demos/meson.build
+++ b/demos/meson.build
@@ -10,7 +10,10 @@ demos = [
]
if enable_goa
- demos += [['docs-list', 'docs-list', {'sources': 'docs-list/docs-list.c'}]]
+ demos += [
+ ['docs-list', 'docs-list', {'sources': 'docs-list/docs-list.c'}],
+ ['docs-property', 'docs-property', {'sources': 'docs-property/docs-property.c'}]
+ ]
endif
if gtk_dep.found()
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]