summaryrefslogtreecommitdiff
path: root/libpurple
diff options
context:
space:
mode:
authorElliott Sales de Andrade <quantum.analyst@gmail.com>2023-03-10 17:42:23 -0600
committerElliott Sales de Andrade <quantum.analyst@gmail.com>2023-03-10 17:42:23 -0600
commita01aa55fada72e214a0005a7e0b0d6cb502741fe (patch)
tree1ad4415e1e7a77badeabd5c1eb8c584eb0d595f6 /libpurple
parentce9173bdcf6fad2c97fc53527ceea6b475b1497a (diff)
downloadpidgin-a01aa55fada72e214a0005a7e0b0d6cb502741fe.tar.gz
Make PurpleRequestFieldDatasheet into a GObject
Not sure that we want to keep all of this, but probably we don't need this extra wrapper object long term, and `PurpleRequestDatasheet` (once made into a `GObject`) and `PurpleRequestFieldDatasheet` could merge. Testing Done: Compiled only. Reviewed at https://reviews.imfreedom.org/r/2340/
Diffstat (limited to 'libpurple')
-rw-r--r--libpurple/meson.build2
-rw-r--r--libpurple/purplerequestfield.c41
-rw-r--r--libpurple/purplerequestfield.h30
-rw-r--r--libpurple/request/purplerequestfielddatasheet.c153
-rw-r--r--libpurple/request/purplerequestfielddatasheet.h77
5 files changed, 232 insertions, 71 deletions
diff --git a/libpurple/meson.build b/libpurple/meson.build
index 14b4614d7e..f1ce3c47a9 100644
--- a/libpurple/meson.build
+++ b/libpurple/meson.build
@@ -100,6 +100,7 @@ purple_coresources = [
'request/purplerequestfieldaccount.c',
'request/purplerequestfieldbool.c',
'request/purplerequestfieldchoice.c',
+ 'request/purplerequestfielddatasheet.c',
'request/purplerequestfieldimage.c',
'request/purplerequestfieldint.c',
'request/purplerequestfieldlabel.c',
@@ -231,6 +232,7 @@ purple_request_headers = [
'request/purplerequestfieldaccount.h',
'request/purplerequestfieldbool.h',
'request/purplerequestfieldchoice.h',
+ 'request/purplerequestfielddatasheet.h',
'request/purplerequestfieldimage.h',
'request/purplerequestfieldint.h',
'request/purplerequestfieldlabel.h',
diff --git a/libpurple/purplerequestfield.c b/libpurple/purplerequestfield.c
index 2ecddbec81..40238897ef 100644
--- a/libpurple/purplerequestfield.c
+++ b/libpurple/purplerequestfield.c
@@ -40,12 +40,6 @@ typedef struct {
gboolean required;
gboolean sensitive;
- union {
- struct {
- PurpleRequestDatasheet *sheet;
- } datasheet;
- } u;
-
void *ui_data;
char *tooltip;
@@ -189,10 +183,6 @@ purple_request_field_finalize(GObject *obj) {
g_free(priv->type_hint);
g_free(priv->tooltip);
- if(priv->type == PURPLE_REQUEST_FIELD_DATASHEET) {
- purple_request_datasheet_free(priv->u.datasheet.sheet);
- }
-
G_OBJECT_CLASS(purple_request_field_parent_class)->finalize(obj);
}
@@ -624,34 +614,3 @@ purple_request_field_is_sensitive(PurpleRequestField *field)
return priv->sensitive;
}
-
-PurpleRequestField *
-purple_request_field_datasheet_new(const char *id,
- const gchar *text, PurpleRequestDatasheet *sheet)
-{
- PurpleRequestField *field;
- PurpleRequestFieldPrivate *priv = NULL;
-
- g_return_val_if_fail(id != NULL, NULL);
- g_return_val_if_fail(sheet != NULL, NULL);
-
- field = purple_request_field_new(id, text, PURPLE_REQUEST_FIELD_DATASHEET);
- priv = purple_request_field_get_instance_private(field);
-
- priv->u.datasheet.sheet = sheet;
-
- return field;
-}
-
-PurpleRequestDatasheet *
-purple_request_field_datasheet_get_sheet(PurpleRequestField *field)
-{
- PurpleRequestFieldPrivate *priv = NULL;
-
- g_return_val_if_fail(PURPLE_IS_REQUEST_FIELD(field), NULL);
-
- priv = purple_request_field_get_instance_private(field);
- g_return_val_if_fail(priv->type == PURPLE_REQUEST_FIELD_DATASHEET, NULL);
-
- return priv->u.datasheet.sheet;
-}
diff --git a/libpurple/purplerequestfield.h b/libpurple/purplerequestfield.h
index 7e858c6dea..83f07ff86e 100644
--- a/libpurple/purplerequestfield.h
+++ b/libpurple/purplerequestfield.h
@@ -64,14 +64,12 @@ struct _PurpleRequestFieldClass {
/**
* PurpleRequestFieldType:
* @PURPLE_REQUEST_FIELD_NONE: No field.
- * @PURPLE_REQUEST_FIELD_DATASHEET: Datasheet field.
*
* A type of field.
*/
typedef enum
{
PURPLE_REQUEST_FIELD_NONE,
- PURPLE_REQUEST_FIELD_DATASHEET
} PurpleRequestFieldType;
@@ -305,34 +303,6 @@ void purple_request_field_set_sensitive(PurpleRequestField *field,
gboolean purple_request_field_is_sensitive(PurpleRequestField *field);
/**************************************************************************/
-/* Datasheet Field API */
-/**************************************************************************/
-
-/**
- * purple_request_field_datasheet_new:
- * @id: The field ID.
- * @text: The label of the field, may be %NULL.
- * @sheet: The datasheet.
- *
- * Creates a datasheet item field.
- *
- * Returns: (transfer full): The new field.
- */
-PurpleRequestField *purple_request_field_datasheet_new(const char *id,
- const gchar *text, PurpleRequestDatasheet *sheet);
-
-/**
- * purple_request_field_datasheet_get_sheet:
- * @field: The field.
- *
- * Returns a datasheet for a field.
- *
- * Returns: (transfer none): The datasheet object.
- */
-PurpleRequestDatasheet *purple_request_field_datasheet_get_sheet(
- PurpleRequestField *field);
-
-/**************************************************************************/
/* Validators for request fields. */
/**************************************************************************/
diff --git a/libpurple/request/purplerequestfielddatasheet.c b/libpurple/request/purplerequestfielddatasheet.c
new file mode 100644
index 0000000000..72a212b068
--- /dev/null
+++ b/libpurple/request/purplerequestfielddatasheet.c
@@ -0,0 +1,153 @@
+/* purple
+ *
+ * Purple is the legal property of its developers, whose names are too numerous
+ * to list here. Please refer to the COPYRIGHT file distributed with this
+ * source distribution.
+ *
+ * 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 2 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, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1301 USA
+ */
+
+#include <glib/gi18n-lib.h>
+
+#include "glibcompat.h"
+#include "purplerequestfield.h"
+#include "purplerequestfielddatasheet.h"
+
+struct _PurpleRequestFieldDatasheet {
+ PurpleRequestField parent;
+
+ PurpleRequestDatasheet *sheet;
+};
+
+enum {
+ PROP_0,
+ PROP_SHEET,
+ N_PROPERTIES,
+};
+static GParamSpec *properties[N_PROPERTIES] = {NULL, };
+
+/******************************************************************************
+ * Helpers
+ *****************************************************************************/
+static void
+purple_request_field_datasheet_set_sheet(PurpleRequestFieldDatasheet *field,
+ PurpleRequestDatasheet *sheet)
+{
+ g_clear_pointer(&field->sheet, purple_request_datasheet_free);
+ field->sheet = sheet;
+
+ g_object_notify_by_pspec(G_OBJECT(field), properties[PROP_SHEET]);
+}
+
+/******************************************************************************
+ * GObject Implementation
+ *****************************************************************************/
+G_DEFINE_TYPE(PurpleRequestFieldDatasheet, purple_request_field_datasheet,
+ PURPLE_TYPE_REQUEST_FIELD)
+
+static void
+purple_request_field_datasheet_get_property(GObject *obj, guint param_id,
+ GValue *value, GParamSpec *pspec)
+{
+ PurpleRequestFieldDatasheet *field = PURPLE_REQUEST_FIELD_DATASHEET(obj);
+
+ switch(param_id) {
+ case PROP_SHEET:
+ g_value_set_pointer(value,
+ purple_request_field_datasheet_get_sheet(field));
+ break;
+ default:
+ G_OBJECT_WARN_INVALID_PROPERTY_ID(obj, param_id, pspec);
+ break;
+ }
+}
+
+static void
+purple_request_field_datasheet_set_property(GObject *obj, guint param_id,
+ const GValue *value,
+ GParamSpec *pspec)
+{
+ PurpleRequestFieldDatasheet *field = PURPLE_REQUEST_FIELD_DATASHEET(obj);
+
+ switch(param_id) {
+ case PROP_SHEET:
+ purple_request_field_datasheet_set_sheet(field,
+ g_value_get_pointer(value));
+ break;
+ default:
+ G_OBJECT_WARN_INVALID_PROPERTY_ID(obj, param_id, pspec);
+ break;
+ }
+}
+
+static void
+purple_request_field_datasheet_finalize(GObject *obj) {
+ PurpleRequestFieldDatasheet *field = PURPLE_REQUEST_FIELD_DATASHEET(obj);
+
+ g_clear_pointer(&field->sheet, purple_request_datasheet_free);
+
+ G_OBJECT_CLASS(purple_request_field_datasheet_parent_class)->finalize(obj);
+}
+
+static void
+purple_request_field_datasheet_init(G_GNUC_UNUSED PurpleRequestFieldDatasheet *field) {
+}
+
+static void
+purple_request_field_datasheet_class_init(PurpleRequestFieldDatasheetClass *klass) {
+ GObjectClass *obj_class = G_OBJECT_CLASS(klass);
+
+ obj_class->finalize = purple_request_field_datasheet_finalize;
+ obj_class->get_property = purple_request_field_datasheet_get_property;
+ obj_class->set_property = purple_request_field_datasheet_set_property;
+
+ /**
+ * PurpleRequestFieldDatasheet:sheet:
+ *
+ * The datasheet of the field.
+ *
+ * Since: 3.0.0
+ */
+ properties[PROP_SHEET] = g_param_spec_pointer(
+ "sheet", "sheet",
+ "The datasheet of the field.",
+ G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY | G_PARAM_STATIC_STRINGS);
+
+ g_object_class_install_properties(obj_class, N_PROPERTIES, properties);
+}
+
+/******************************************************************************
+ * Public API
+ *****************************************************************************/
+PurpleRequestField *
+purple_request_field_datasheet_new(const char *id, const char *text,
+ PurpleRequestDatasheet *sheet)
+{
+ g_return_val_if_fail(id != NULL, NULL);
+ g_return_val_if_fail(sheet != NULL, NULL);
+
+ return g_object_new(PURPLE_TYPE_REQUEST_FIELD_DATASHEET,
+ "id", id,
+ "label", text,
+ "sheet", sheet,
+ NULL);
+}
+
+PurpleRequestDatasheet *
+purple_request_field_datasheet_get_sheet(PurpleRequestFieldDatasheet *field) {
+ g_return_val_if_fail(PURPLE_IS_REQUEST_FIELD_DATASHEET(field), NULL);
+
+ return field->sheet;
+}
diff --git a/libpurple/request/purplerequestfielddatasheet.h b/libpurple/request/purplerequestfielddatasheet.h
new file mode 100644
index 0000000000..8f7dee6e9b
--- /dev/null
+++ b/libpurple/request/purplerequestfielddatasheet.h
@@ -0,0 +1,77 @@
+/*
+ * Purple - Internet Messaging Library
+ * Copyright (C) Pidgin Developers <devel@pidgin.im>
+ *
+ * Purple is the legal property of its developers, whose names are too numerous
+ * to list here. Please refer to the COPYRIGHT file distributed with this
+ * source distribution.
+ *
+ * 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 2 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 <https://www.gnu.org/licenses/>.
+ */
+
+#if !defined(PURPLE_GLOBAL_HEADER_INSIDE) && !defined(PURPLE_COMPILATION)
+# error "only <purple.h> may be included directly"
+#endif
+
+#ifndef PURPLE_REQUEST_FIELD_DATASHEET_H
+#define PURPLE_REQUEST_FIELD_DATASHEET_H
+
+#include <stdlib.h>
+
+#include <glib.h>
+#include <glib-object.h>
+
+/**
+ * PurpleRequestField:
+ *
+ * A request field.
+ */
+typedef struct _PurpleRequestField PurpleRequestField;
+
+#include "request.h"
+#include "request-datasheet.h"
+
+#define PURPLE_DEFAULT_ACTION_NONE -1
+
+G_BEGIN_DECLS
+
+#define PURPLE_TYPE_REQUEST_FIELD_DATASHEET (purple_request_field_datasheet_get_type())
+G_DECLARE_FINAL_TYPE(PurpleRequestFieldDatasheet, purple_request_field_datasheet,
+ PURPLE, REQUEST_FIELD_DATASHEET, PurpleRequestField)
+
+/**
+ * purple_request_field_datasheet_new:
+ * @id: The field ID.
+ * @text: The label of the field, may be %NULL.
+ * @sheet: The datasheet.
+ *
+ * Creates a datasheet item field.
+ *
+ * Returns: (transfer full): The new field.
+ */
+PurpleRequestField *purple_request_field_datasheet_new(const char *id, const gchar *text, PurpleRequestDatasheet *sheet);
+
+/**
+ * purple_request_field_datasheet_get_sheet:
+ * @field: The field.
+ *
+ * Returns a datasheet for a field.
+ *
+ * Returns: (transfer none): The datasheet object.
+ */
+PurpleRequestDatasheet *purple_request_field_datasheet_get_sheet(PurpleRequestFieldDatasheet *field);
+
+G_END_DECLS
+
+#endif /* PURPLE_REQUEST_FIELD_DATASHEET_H */