summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGeorges Basile Stavracas Neto <georges.stavracas@gmail.com>2019-04-26 12:59:29 -0300
committerGeorges Basile Stavracas Neto <georges.stavracas@gmail.com>2019-04-26 12:59:29 -0300
commit68943eec57ea54175b5ed9f6b0be6d51a3bedf1c (patch)
tree24b5aacd67c93731d22e8264bc5e843bde0f0615
parent3bff2b89816c83b467d183485b788c960a0b50da (diff)
downloadgnome-calendar-68943eec57ea54175b5ed9f6b0be6d51a3bedf1c.tar.gz
utils: Add GDateTime utils
This will greatly help with the transition to GDateTime. In the future, we can propose these APIs to GLib itself.
-rw-r--r--src/meson.build1
-rw-r--r--src/utils/gcal-date-time-utils.c116
-rw-r--r--src/utils/gcal-date-time-utils.h44
-rw-r--r--src/utils/gcal-utils.h3
-rw-r--r--tests/test-event.c2
5 files changed, 164 insertions, 2 deletions
diff --git a/src/meson.build b/src/meson.build
index 07014f69..dd081ade 100644
--- a/src/meson.build
+++ b/src/meson.build
@@ -20,6 +20,7 @@ gcal_deps = [
]
sources = files(
+ 'utils/gcal-date-time-utils.c',
'utils/gcal-utils.c',
'views/gcal-month-cell.c',
'views/gcal-month-popover.c',
diff --git a/src/utils/gcal-date-time-utils.c b/src/utils/gcal-date-time-utils.c
new file mode 100644
index 00000000..2f5f8079
--- /dev/null
+++ b/src/utils/gcal-date-time-utils.c
@@ -0,0 +1,116 @@
+/* gcal-date-time-utils.c
+ *
+ * Copyright 2019 Georges Basile Stavracas Neto <georges.stavracas@gmail.com>
+ *
+ * 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 3 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 <http://www.gnu.org/licenses/>.
+ *
+ * SPDX-License-Identifier: GPL-3.0-or-later
+ */
+
+#include "gcal-date-time-utils.h"
+#include "gcal-utils.h"
+
+/**
+ * gcal_set_datetime:
+ * @dest: location to a #GDateTime pointer
+ * @src: (nullable): a #GDateTime
+ *
+ * Performs the same of g_set_object(), but with #GDateTime
+ * instances.
+ *
+ * Returns: %TRUE if the value of @dest changed, %FALSE otherwise
+ */
+gboolean
+gcal_set_date_time (GDateTime **dest,
+ GDateTime *src)
+{
+ gboolean changed = *dest != src;
+
+ gcal_clear_datetime (dest);
+
+ if (src)
+ *dest = g_date_time_ref (src);
+
+ return changed;
+}
+
+/**
+ * gcal_date_time_get_days_in_month:
+ * @date: a #GDateTime
+ *
+ * Retrieves the number of days in the month and year
+ * represented by @date.
+ *
+ * Returns: number of days in month during the year of @date
+ */
+guint8
+gcal_date_time_get_days_in_month (GDateTime *date)
+{
+ return g_date_get_days_in_month (g_date_time_get_month (date),
+ g_date_time_get_year (date));
+}
+
+/**
+ * gcal_date_time_get_start_of_week:
+ * @date: a #GDateTime
+ *
+ * Retrieves the first day of the week @date is in, at 00:00
+ * of the local timezone.
+ *
+ * This date is inclusive.
+ *
+ * Returns: (transfer full): a #GDateTime
+ */
+GDateTime*
+gcal_date_time_get_start_of_week (GDateTime *date)
+{
+ g_autoptr (GDateTime) start_of_week = NULL;
+ gint n_days_after_week_start;
+ gint first_weekday;
+ gint weekday;
+
+ g_assert (date != NULL);
+
+ first_weekday = get_first_weekday ();
+ weekday = g_date_time_get_day_of_week (date) - 1;
+ n_days_after_week_start = (weekday - first_weekday) % 7;
+
+ start_of_week = g_date_time_add_days (date, -n_days_after_week_start);
+
+ return g_date_time_new_local (g_date_time_get_year (start_of_week),
+ g_date_time_get_month (start_of_week),
+ g_date_time_get_day_of_month (start_of_week),
+ 0, 0, 0);
+}
+
+/**
+ * gcal_date_time_get_end_of_week:
+ * @date: a #GDateTime
+ *
+ * Retrieves the last day of the week @date is in, at 23:59:59
+ * of the local timezone.
+ *
+ * Because this date is exclusive, it actually is start of the
+ * next week.
+ *
+ * Returns: (transfer full): a #GDateTime
+ */
+GDateTime*
+gcal_date_time_get_end_of_week (GDateTime *date)
+{
+ g_autoptr (GDateTime) week_start = NULL;
+
+ week_start = gcal_date_time_get_start_of_week (date);
+ return g_date_time_add_weeks (week_start, 1);
+}
diff --git a/src/utils/gcal-date-time-utils.h b/src/utils/gcal-date-time-utils.h
new file mode 100644
index 00000000..5b930a64
--- /dev/null
+++ b/src/utils/gcal-date-time-utils.h
@@ -0,0 +1,44 @@
+/* gcal-date-time-utils.h
+ *
+ * Copyright 2019 Georges Basile Stavracas Neto <georges.stavracas@gmail.com>
+ *
+ * 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 3 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 <http://www.gnu.org/licenses/>.
+ *
+ * SPDX-License-Identifier: GPL-3.0-or-later
+ */
+
+#pragma once
+
+#include <glib.h>
+
+G_BEGIN_DECLS
+
+/**
+ * gcal_clear_datetime:
+ * @dt: location of a #GDateTime pointer
+ *
+ * Unreferences @dt if not %NULL, and set it to %NULL.
+ */
+#define gcal_clear_datetime(dt) g_clear_pointer (dt, g_date_time_unref)
+
+gboolean gcal_set_date_time (GDateTime **dest,
+ GDateTime *src);
+
+guint8 gcal_date_time_get_days_in_month (GDateTime *date);
+
+GDateTime* gcal_date_time_get_start_of_week (GDateTime *date);
+
+GDateTime* gcal_date_time_get_end_of_week (GDateTime *date);
+
+G_END_DECLS
diff --git a/src/utils/gcal-utils.h b/src/utils/gcal-utils.h
index bda43b95..6691317e 100644
--- a/src/utils/gcal-utils.h
+++ b/src/utils/gcal-utils.h
@@ -19,7 +19,9 @@
#ifndef __GCAL_UTILS_H__
#define __GCAL_UTILS_H__
+#include "gcal-date-time-utils.h"
#include "gcal-manager.h"
+
#include <gtk/gtk.h>
#include <libecal/libecal.h>
#include <libgweather/gweather.h>
@@ -31,7 +33,6 @@
#define MINUTES_PER_DAY 1440
#define MAX_MINUTES (7 * MINUTES_PER_DAY)
-#define gcal_clear_datetime(dt) g_clear_pointer (dt, g_date_time_unref)
#define gcal_clear_timeout(pp) { if (pp && *pp) { g_source_remove (*pp); *pp = 0; } }
#if !EDS_CHECK_VERSION (3, 31, 90)
diff --git a/tests/test-event.c b/tests/test-event.c
index 87b28e51..53fcd0bf 100644
--- a/tests/test-event.c
+++ b/tests/test-event.c
@@ -18,7 +18,7 @@
#include <glib.h>
-#include "gcal-utils.h"
+#include "utils/gcal-utils.h"
#include "gcal-event.h"
#define STUB_EVENT "BEGIN:VEVENT\n" \