# HG changeset patch
# Node ID 7d0959d74c01
# Parent  b2db8ddd4756
diff --git a/libpurple/meson.build b/libpurple/meson.build
--- a/libpurple/meson.build
+++ b/libpurple/meson.build
@@ -86,7 +86,6 @@
 	'request/purplerequestfieldaccount.c',
 	'request/purplerequestfieldbool.c',
 	'request/purplerequestfieldchoice.c',
-	'request/purplerequestfielddatasheet.c',
 	'request/purplerequestfieldimage.c',
 	'request/purplerequestfieldint.c',
 	'request/purplerequestfieldlabel.c',
@@ -94,7 +93,6 @@
 	'request/purplerequestfieldstring.c',
 	'request/purplerequestgroup.c',
 	'request/purplerequestpage.c',
-	'request-datasheet.c',
 	'signals.c',
 	'util.c',
 	'xmlnode.c'
@@ -183,7 +181,6 @@
 	'purplewhiteboardops.h',
 	'purplewhiteboarduiops.h',
 	'request.h',
-	'request-datasheet.h',
 	'signals.h',
 	'util.h',
 	'xmlnode.h',
@@ -201,7 +198,6 @@
 	'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/request-datasheet.h b/libpurple/request-datasheet.h
deleted file mode 100644
--- a/libpurple/request-datasheet.h
+++ /dev/null
@@ -1,541 +0,0 @@
-/*
- * 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 library 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 library 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 library; 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_DATA_H
-#define PURPLE_REQUEST_DATA_H
-
-#include <glib.h>
-
-#include "purpleversion.h"
-
-/**
- * PurpleRequestDatasheet:
- *
- * Request Datasheet is a UI abstracted table.
- */
-typedef struct _PurpleRequestDatasheet PurpleRequestDatasheet;
-
-/**
- * PurpleRequestDatasheetRecord:
- *
- * A data sheet record.
- */
-typedef struct _PurpleRequestDatasheetRecord PurpleRequestDatasheetRecord;
-
-/**
- * PurpleRequestDatasheetAction:
- *
- * A data sheet action.
- */
-typedef struct _PurpleRequestDatasheetAction PurpleRequestDatasheetAction;
-
-/**
- * PurpleRequestDatasheetActionCb:
- * @rec: The record.
- * @user_data: User data.
- *
- * A callback function for actions in a data sheet.
- *
- * Since: 3.0
- */
-typedef void (*PurpleRequestDatasheetActionCb)(
-	PurpleRequestDatasheetRecord *rec, gpointer user_data);
-
-/**
- * PurpleRequestDatasheetActionCheckCb:
- * @rec: The record.
- * @user_data: User data.
- *
- * A callback function for checking if an action is enabled or not.
- *
- * Returns: %TRUE if the actions should be enabled, otherwise %FALSE.
- *
- * Since: 3.0
- */
-typedef gboolean (*PurpleRequestDatasheetActionCheckCb)(
-	PurpleRequestDatasheetRecord *rec, gpointer user_data);
-
-/**
- * PurpleRequestDatasheetColumnType:
- * @PURPLE_REQUEST_DATASHEET_COLUMN_STRING: The column displays strings.
- * @PURPLE_REQUEST_DATASHEET_COLUMN_IMAGE: The column displays images.
- *
- * The type of data to be shown in a column.
- */
-
-typedef enum
-{
-	PURPLE_REQUEST_DATASHEET_COLUMN_STRING,
-	PURPLE_REQUEST_DATASHEET_COLUMN_IMAGE
-} PurpleRequestDatasheetColumnType;
-
-G_BEGIN_DECLS
-
-/**************************************************************************/
-/* Datasheet API                                                          */
-/**************************************************************************/
-
-/**
- * purple_request_datasheet_new:
- *
- * Creates new Datasheet.
- *
- * Returns: (transfer full): The new datasheet.
- */
-PURPLE_AVAILABLE_IN_3_0
-PurpleRequestDatasheet *
-purple_request_datasheet_new(void);
-
-/**
- * purple_request_datasheet_free:
- * @sheet: The datasheet.
- *
- * Destroys datasheet with all its contents.
- */
-PURPLE_AVAILABLE_IN_3_0
-void
-purple_request_datasheet_free(PurpleRequestDatasheet *sheet);
-
-/**
- * purple_request_datasheet_add_column:
- * @sheet: The datasheet.
- * @type:  The column type.
- * @title: The column title (may be %NULL).
- *
- * Adds a column to the datasheet.
- *
- * You cannot add a column if datasheet contains any data.
- *
- * Since: 3.0
- */
-PURPLE_AVAILABLE_IN_3_0
-void
-purple_request_datasheet_add_column(PurpleRequestDatasheet *sheet,
-	PurpleRequestDatasheetColumnType type, const gchar *title);
-
-/**
- * purple_request_datasheet_get_column_count:
- * @sheet: The datasheet.
- *
- * Returns the column count of datasheet.
- *
- * Returns: The column count.
- *
- * Since: 3.0
- */
-PURPLE_AVAILABLE_IN_3_0
-guint
-purple_request_datasheet_get_column_count(PurpleRequestDatasheet *sheet);
-
-/**
- * purple_request_datasheet_get_column_type:
- * @sheet:  The datasheet.
- * @col_no: The column number (0 is the first one).
- *
- * Returns the column type for a datasheet.
- *
- * Returns: The column type.
- *
- * Since: 3.0
- */
-PURPLE_AVAILABLE_IN_3_0
-PurpleRequestDatasheetColumnType
-purple_request_datasheet_get_column_type(PurpleRequestDatasheet *sheet,
-	guint col_no);
-
-/**
- * purple_request_datasheet_get_column_title:
- * @sheet:  The datasheet.
- * @col_no: The column number (0 is the first one).
- *
- * Returns the column title for a datasheet.
- *
- * Returns: The column title.
- *
- * Since: 3.0
- */
-PURPLE_AVAILABLE_IN_3_0
-const gchar *
-purple_request_datasheet_get_column_title(PurpleRequestDatasheet *sheet,
-	guint col_no);
-
-/**
- * purple_request_datasheet_get_records:
- * @sheet: The datasheet.
- *
- * Returns the list of records in a datasheet.
- *
- * You shouldn't modify datasheet's data while iterating through it.
- *
- * Returns: (element-type PurpleRequestDatasheetRecord) (transfer none): The list of records.
- *
- * Since: 3.0
- */
-PURPLE_AVAILABLE_IN_3_0
-const GList *
-purple_request_datasheet_get_records(PurpleRequestDatasheet *sheet);
-
-/**
- * purple_request_datasheet_add_action:
- * @sheet:  The datasheet.
- * @action: The action.
- *
- * Adds an action to the datasheet.
- *
- * Action object is owned by the datasheet since this call.
- *
- * Since: 3.0
- */
-PURPLE_AVAILABLE_IN_3_0
-void
-purple_request_datasheet_add_action(PurpleRequestDatasheet *sheet,
-	PurpleRequestDatasheetAction *action);
-
-/**
- * purple_request_datasheet_get_actions:
- * @sheet: The datasheet.
- *
- * Returns the list of actions in a datasheet.
- *
- * Returns: (element-type PurpleRequestDatasheetAction) (transfer none): The list of actions.
- *
- * Since: 3.0
- */
-PURPLE_AVAILABLE_IN_3_0
-const GList *
-purple_request_datasheet_get_actions(PurpleRequestDatasheet *sheet);
-
-
-/**************************************************************************/
-/* Datasheet actions API                                                  */
-/**************************************************************************/
-
-/**
- * purple_request_datasheet_action_new:
- *
- * Creates new datasheet action.
- *
- * Returns: (transfer full): The new action.
- *
- * Since: 3.0
- */
-PURPLE_AVAILABLE_IN_3_0
-PurpleRequestDatasheetAction *
-purple_request_datasheet_action_new(void);
-
-/**
- * purple_request_datasheet_action_free:
- * @act: The action.
- *
- * Destroys the datasheet action.
- *
- * Since: 3.0
- */
-PURPLE_AVAILABLE_IN_3_0
-void
-purple_request_datasheet_action_free(PurpleRequestDatasheetAction *act);
-
-/**
- * purple_request_datasheet_action_set_label:
- * @act:   The action.
- * @label: The label.
- *
- * Sets the localized label for the action.
- *
- * Since: 3.0
- */
-PURPLE_AVAILABLE_IN_3_0
-void
-purple_request_datasheet_action_set_label(PurpleRequestDatasheetAction *act,
-	const gchar *label);
-
-/**
- * purple_request_datasheet_action_get_label:
- * @act: The action.
- *
- * Gets the label of action.
- *
- * Returns: The localized label text.
- *
- * Since: 3.0
- */
-PURPLE_AVAILABLE_IN_3_0
-const gchar*
-purple_request_datasheet_action_get_label(PurpleRequestDatasheetAction *act);
-
-/**
- * purple_request_datasheet_action_set_cb:
- * @act:       The action.
- * @cb: (scope notified):       The callback function.
- * @user_data: The data to be passed to the callback function.
- *
- * Sets the callback for the action.
- *
- * Since: 3.0
- */
-PURPLE_AVAILABLE_IN_3_0
-void
-purple_request_datasheet_action_set_cb(PurpleRequestDatasheetAction *act,
-	PurpleRequestDatasheetActionCb cb, gpointer user_data);
-
-/**
- * purple_request_datasheet_action_call:
- * @act: The action.
- * @rec: The user selected record.
- *
- * Calls the callback of the action.
- *
- * Since: 3.0
- */
-PURPLE_AVAILABLE_IN_3_0
-void
-purple_request_datasheet_action_call(PurpleRequestDatasheetAction *act,
-	PurpleRequestDatasheetRecord *rec);
-
-/**
- * purple_request_datasheet_action_set_sens_cb:
- * @act:       The action.
- * @cb: (scope notified):       The callback function, may be %NULL.
- * @user_data: The data to be passed to the callback function.
- *
- * Sets the sensitivity checker for the action.
- *
- * If there is no callback set, default is used: the action is enabled, if any
- * record is active.
- *
- * Since: 3.0
- */
-PURPLE_AVAILABLE_IN_3_0
-void
-purple_request_datasheet_action_set_sens_cb(
-	PurpleRequestDatasheetAction *act,
-	PurpleRequestDatasheetActionCheckCb cb, gpointer user_data);
-
-/**
- * purple_request_datasheet_action_is_sensitive:
- * @act: The action.
- * @rec: The record.
- *
- * Checks, if the action is enabled for the active record.
- *
- * Returns: %TRUE, if the action is enabled, %FALSE otherwise.
- *
- * Since: 3.0
- */
-PURPLE_AVAILABLE_IN_3_0
-gboolean
-purple_request_datasheet_action_is_sensitive(PurpleRequestDatasheetAction *act,
-	PurpleRequestDatasheetRecord *rec);
-
-
-/**************************************************************************/
-/* Datasheet record API                                                   */
-/**************************************************************************/
-
-/**
- * purple_request_datasheet_record_get_key:
- * @rec: The record.
- *
- * Returns the key of a record.
- *
- * Returns: The key.
- *
- * Since: 3.0
- */
-PURPLE_AVAILABLE_IN_3_0
-gpointer
-purple_request_datasheet_record_get_key(
-	const PurpleRequestDatasheetRecord *rec);
-
-/**
- * purple_request_datasheet_record_get_datasheet:
- * @rec: The record.
- *
- * Returns the datasheet of a record.
- *
- * Returns: (transfer none): The datasheet.
- *
- * Since: 3.0
- */
-PURPLE_AVAILABLE_IN_3_0
-PurpleRequestDatasheet *
-purple_request_datasheet_record_get_datasheet(
-	PurpleRequestDatasheetRecord *rec);
-
-/**
- * purple_request_datasheet_record_find:
- * @sheet: The datasheet.
- * @key:   The key.
- *
- * Looks up for a record in datasheet.
- *
- * Returns: (transfer none): The record if found, %NULL otherwise.
- *
- * Since: 3.0
- */
-PURPLE_AVAILABLE_IN_3_0
-PurpleRequestDatasheetRecord *
-purple_request_datasheet_record_find(PurpleRequestDatasheet *sheet,
-	gpointer key);
-
-/**
- * purple_request_datasheet_record_add:
- * @sheet: The datasheet.
- * @key:   The key.
- *
- * Adds a record to the datasheet.
- *
- * If the specified key already exists in datasheet, old record is returned.
- *
- * Returns: (transfer full): The record.
- *
- * Since: 3.0
- */
-PURPLE_AVAILABLE_IN_3_0
-PurpleRequestDatasheetRecord *
-purple_request_datasheet_record_add(PurpleRequestDatasheet *sheet,
-	gpointer key);
-
-/**
- * purple_request_datasheet_record_remove:
- * @sheet: The datasheet.
- * @key:   The key.
- *
- * Removes a record from a datasheet.
- *
- * Since: 3.0
- */
-PURPLE_AVAILABLE_IN_3_0
-void
-purple_request_datasheet_record_remove(PurpleRequestDatasheet *sheet,
-	gpointer key);
-
-/**
- * purple_request_datasheet_record_remove_all:
- * @sheet: The datasheet.
- *
- * Removes all records from a datasheet.
- *
- * Since: 3.0
- */
-PURPLE_AVAILABLE_IN_3_0
-void
-purple_request_datasheet_record_remove_all(PurpleRequestDatasheet *sheet);
-
-/**
- * purple_request_datasheet_record_mark_all_for_rem:
- * @sheet: The datasheet.
- *
- * Marks all records for removal. Record will be unmarked, when touched with
- * purple_request_datasheet_record_add.
- *
- * See purple_request_datasheet_record_add().
- *
- * Since: 3.0
- */
-PURPLE_AVAILABLE_IN_3_0
-void
-purple_request_datasheet_record_mark_all_for_rem(PurpleRequestDatasheet *sheet);
-
-/**
- * purple_request_datasheet_record_remove_marked:
- * @sheet: The datasheet.
- *
- * Removes all marked records.
- *
- * See purple_request_datasheet_record_mark_all_for_rem().
- *
- * Since: 3.0
- */
-PURPLE_AVAILABLE_IN_3_0
-void
-purple_request_datasheet_record_remove_marked(PurpleRequestDatasheet *sheet);
-
-/**
- * purple_request_datasheet_record_set_string_data:
- * @rec:    The record.
- * @col_no: The column.
- * @data:   The data.
- *
- * Sets data for a string column of specified record.
- *
- * Since: 3.0
- */
-PURPLE_AVAILABLE_IN_3_0
-void
-purple_request_datasheet_record_set_string_data(
-	PurpleRequestDatasheetRecord *rec, guint col_no, const gchar *data);
-
-/**
- * purple_request_datasheet_record_set_image_data:
- * @rec:      The record.
- * @col_no:   The column.
- * @stock_id: The stock identifier of a image.
- *
- * Sets data for a image column of specified record.
- *
- * Since: 3.0
- */
-PURPLE_AVAILABLE_IN_3_0
-void
-purple_request_datasheet_record_set_image_data(
-	PurpleRequestDatasheetRecord *rec, guint col_no, const gchar *stock_id);
-
-/**
- * purple_request_datasheet_record_get_string_data:
- * @rec:    The record.
- * @col_no: The column.
- *
- * Returns data for a string column of specified record.
- *
- * Returns: The data.
- *
- * Since: 3.0
- */
-PURPLE_AVAILABLE_IN_3_0
-const gchar *
-purple_request_datasheet_record_get_string_data(
-	const PurpleRequestDatasheetRecord *rec, guint col_no);
-
-/**
- * purple_request_datasheet_record_get_image_data:
- * @rec:    The record.
- * @col_no: The column.
- *
- * Returns data for an image column of specified record.
- *
- * Returns: The stock id of an image.
- *
- * Since: 3.0
- */
-PURPLE_AVAILABLE_IN_3_0
-const gchar *
-purple_request_datasheet_record_get_image_data(
-	const PurpleRequestDatasheetRecord *rec, guint col_no);
-
-G_END_DECLS
-
-#endif /* PURPLE_REQUEST_DATA_H */
diff --git a/libpurple/request-datasheet.c b/libpurple/request-datasheet.c
deleted file mode 100644
--- a/libpurple/request-datasheet.c
+++ /dev/null
@@ -1,501 +0,0 @@
-/*
- * 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 library 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 library 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 library; if not, see <https://www.gnu.org/licenses/>.
- */
-
-#include "request-datasheet.h"
-
-#include "debug.h"
-#include "signals.h"
-
-struct _PurpleRequestDatasheet
-{
-	guint col_count;
-	GArray *col_types;
-	GArray *col_titles;
-	GList *actions;
-
-	GList *record_list;
-	GHashTable *record_li_by_key;
-
-	GHashTable *marked_for_rem;
-};
-
-struct _PurpleRequestDatasheetRecord
-{
-	PurpleRequestDatasheet *sheet;
-	gpointer key;
-	gchar **data; /* at this point, there is only string data possible */
-};
-
-struct _PurpleRequestDatasheetAction
-{
-	gchar *label;
-
-	PurpleRequestDatasheetActionCb cb;
-	gpointer cb_data;
-
-	PurpleRequestDatasheetActionCheckCb sens_cb;
-	gpointer sens_data;
-};
-
-static void
-purple_request_datasheet_record_free(PurpleRequestDatasheetRecord *rec);
-
-/***** Datasheet API **********************************************************/
-
-PurpleRequestDatasheet *
-purple_request_datasheet_new(void)
-{
-	PurpleRequestDatasheet *sheet;
-
-	sheet = g_new0(PurpleRequestDatasheet, 1);
-
-	sheet->col_types = g_array_new(FALSE, FALSE,
-		sizeof(PurpleRequestDatasheetColumnType));
-	sheet->col_titles = g_array_new(FALSE, FALSE, sizeof(gchar *));
-	/* XXX: use g_array_set_clear_func when we depend on Glib 2.32 */
-
-	sheet->record_li_by_key = g_hash_table_new(g_direct_hash, g_direct_equal);
-
-	purple_signal_register(sheet, "record-changed",
-		purple_marshal_VOID__POINTER_POINTER, G_TYPE_NONE, 2,
-		G_TYPE_POINTER, /* (PurpleRequestDatasheet *) */
-		G_TYPE_POINTER); /* NULL for all */
-
-	purple_signal_register(sheet, "destroy",
-		purple_marshal_VOID__POINTER, G_TYPE_NONE, 1,
-		G_TYPE_POINTER); /* (PurpleRequestDatasheet *) */
-
-	return sheet;
-}
-
-void
-purple_request_datasheet_free(PurpleRequestDatasheet *sheet)
-{
-	guint i;
-
-	g_return_if_fail(sheet != NULL);
-
-	purple_signal_emit(sheet, "destroy", sheet);
-	purple_signals_unregister_by_instance(sheet);
-
-	for (i = 0; i < sheet->col_titles->len; i++)
-		g_free(g_array_index(sheet->col_titles, gchar *, i));
-
-	g_array_free(sheet->col_titles, TRUE);
-	g_array_free(sheet->col_types, TRUE);
-
-	g_list_free_full(sheet->actions,
-		(GDestroyNotify)purple_request_datasheet_action_free);
-
-	g_hash_table_destroy(sheet->record_li_by_key);
-	g_list_free_full(sheet->record_list,
-		(GDestroyNotify)purple_request_datasheet_record_free);
-
-	g_clear_pointer(&sheet->marked_for_rem, g_hash_table_destroy);
-
-	g_free(sheet);
-}
-
-void
-purple_request_datasheet_add_column(PurpleRequestDatasheet *sheet,
-	PurpleRequestDatasheetColumnType type, const gchar *title)
-{
-	gchar *title_clone;
-
-	g_return_if_fail(sheet != NULL);
-
-	if (sheet->record_list != NULL) {
-		purple_debug_error("request-datasheet", "Cannot modify model "
-			"when there is already some data");
-		return;
-	}
-
-	title_clone = g_strdup(title);
-	sheet->col_count++;
-	g_array_append_val(sheet->col_types, type);
-	g_array_append_val(sheet->col_titles, title_clone);
-}
-
-guint
-purple_request_datasheet_get_column_count(PurpleRequestDatasheet *sheet)
-{
-	g_return_val_if_fail(sheet != NULL, 0);
-
-	return sheet->col_count;
-	/*return sheet->col_types->len;*/
-}
-
-PurpleRequestDatasheetColumnType
-purple_request_datasheet_get_column_type(PurpleRequestDatasheet *sheet,
-	guint col_no)
-{
-	g_return_val_if_fail(sheet != NULL, 0);
-
-	return g_array_index(sheet->col_types,
-		PurpleRequestDatasheetColumnType, col_no);
-}
-
-const gchar *
-purple_request_datasheet_get_column_title(PurpleRequestDatasheet *sheet,
-	guint col_no)
-{
-	g_return_val_if_fail(sheet != NULL, 0);
-
-	return g_array_index(sheet->col_titles, gchar *, col_no);
-}
-
-const GList *
-purple_request_datasheet_get_records(PurpleRequestDatasheet *sheet)
-{
-	g_return_val_if_fail(sheet != NULL, NULL);
-
-	return sheet->record_list;
-}
-
-void
-purple_request_datasheet_add_action(PurpleRequestDatasheet *sheet,
-	PurpleRequestDatasheetAction *action)
-{
-	g_return_if_fail(sheet != NULL);
-	g_return_if_fail(action != NULL);
-
-	sheet->actions = g_list_append(sheet->actions, action);
-}
-
-const GList *
-purple_request_datasheet_get_actions(PurpleRequestDatasheet *sheet)
-{
-	g_return_val_if_fail(sheet != NULL, NULL);
-
-	return sheet->actions;
-}
-
-/***** Datasheet actions API **************************************************/
-
-PurpleRequestDatasheetAction *
-purple_request_datasheet_action_new(void)
-{
-	return g_new0(PurpleRequestDatasheetAction, 1);
-}
-
-void
-purple_request_datasheet_action_free(PurpleRequestDatasheetAction *act)
-{
-	g_return_if_fail(act != NULL);
-	g_free(act->label);
-	g_free(act);
-}
-
-void
-purple_request_datasheet_action_set_label(PurpleRequestDatasheetAction *act,
-	const gchar *label)
-{
-	gchar *new_label;
-
-	g_return_if_fail(act != NULL);
-
-	new_label = g_strdup(label);
-	g_free(act->label);
-	act->label = new_label;
-}
-
-const gchar*
-purple_request_datasheet_action_get_label(PurpleRequestDatasheetAction *act)
-{
-	g_return_val_if_fail(act != NULL, NULL);
-
-	return act->label;
-}
-
-void
-purple_request_datasheet_action_set_cb(PurpleRequestDatasheetAction *act,
-	PurpleRequestDatasheetActionCb cb, gpointer user_data)
-{
-	g_return_if_fail(act != NULL);
-
-	act->cb = cb;
-	act->cb_data = user_data;
-}
-
-void
-purple_request_datasheet_action_call(PurpleRequestDatasheetAction *act,
-	PurpleRequestDatasheetRecord *rec)
-{
-	g_return_if_fail(act != NULL);
-
-	if (!act->cb)
-		return;
-
-	if (!purple_request_datasheet_action_is_sensitive(act, rec)) {
-		purple_debug_warning("request-datasheet",
-			"Action is disabled for this record");
-		return;
-	}
-
-	act->cb(rec, act->cb_data);
-}
-
-void
-purple_request_datasheet_action_set_sens_cb(
-	PurpleRequestDatasheetAction *act,
-	PurpleRequestDatasheetActionCheckCb cb, gpointer user_data)
-{
-	g_return_if_fail(act != NULL);
-
-	act->sens_cb = cb;
-	act->sens_data = user_data;
-}
-
-gboolean
-purple_request_datasheet_action_is_sensitive(PurpleRequestDatasheetAction *act,
-	PurpleRequestDatasheetRecord *rec)
-{
-	g_return_val_if_fail(act != NULL, FALSE);
-
-	if (!act->sens_cb)
-		return (rec != NULL);
-
-	return act->sens_cb(rec, act->sens_data);
-}
-
-/***** Datasheet record API ***************************************************/
-
-static PurpleRequestDatasheetRecord *
-purple_request_datasheet_record_new(void)
-{
-	return g_new0(PurpleRequestDatasheetRecord, 1);
-}
-
-static void
-purple_request_datasheet_record_free(PurpleRequestDatasheetRecord *rec)
-{
-	g_strfreev(rec->data);
-	g_free(rec);
-}
-
-gpointer
-purple_request_datasheet_record_get_key(const PurpleRequestDatasheetRecord *rec)
-{
-	g_return_val_if_fail(rec != NULL, NULL);
-
-	return rec->key;
-}
-
-PurpleRequestDatasheet *
-purple_request_datasheet_record_get_datasheet(
-	PurpleRequestDatasheetRecord *rec)
-{
-	g_return_val_if_fail(rec != NULL, NULL);
-
-	return rec->sheet;
-}
-
-PurpleRequestDatasheetRecord *
-purple_request_datasheet_record_find(PurpleRequestDatasheet *sheet,
-	gpointer key)
-{
-	GList *it;
-
-	g_return_val_if_fail(sheet != NULL, NULL);
-
-	it = g_hash_table_lookup(sheet->record_li_by_key, key);
-	if (!it)
-		return NULL;
-
-	return it->data;
-}
-
-PurpleRequestDatasheetRecord *
-purple_request_datasheet_record_add(PurpleRequestDatasheet *sheet,
-	gpointer key)
-{
-	PurpleRequestDatasheetRecord *rec;
-
-	g_return_val_if_fail(sheet != NULL, NULL);
-
-	rec = purple_request_datasheet_record_find(sheet, key);
-	if (rec != NULL) {
-		if (sheet->marked_for_rem != NULL)
-			g_hash_table_remove(sheet->marked_for_rem, key);
-		return rec;
-	}
-
-	rec = purple_request_datasheet_record_new();
-	rec->sheet = sheet;
-	rec->key = key;
-
-	/* We don't allow modifying column count when datasheet contains any
-	 * records. */
-	rec->data = g_new0(gchar*,
-		purple_request_datasheet_get_column_count(sheet) + 1);
-
-	sheet->record_list = g_list_append(sheet->record_list, rec);
-	g_hash_table_insert(sheet->record_li_by_key, key,
-		g_list_find(sheet->record_list, rec));
-
-	purple_signal_emit(sheet, "record-changed", sheet, key);
-
-	return rec;
-}
-
-void
-purple_request_datasheet_record_remove(PurpleRequestDatasheet *sheet,
-	gpointer key)
-{
-	GList *it;
-
-	g_return_if_fail(sheet != NULL);
-
-	it = g_hash_table_lookup(sheet->record_li_by_key, key);
-	if (it == NULL)
-		return;
-
-	purple_request_datasheet_record_free(it->data);
-	sheet->record_list = g_list_delete_link(sheet->record_list, it);
-	g_hash_table_remove(sheet->record_li_by_key, key);
-
-	purple_signal_emit(sheet, "record-changed", sheet, key);
-}
-
-void
-purple_request_datasheet_record_remove_all(PurpleRequestDatasheet *sheet)
-{
-	g_return_if_fail(sheet != NULL);
-
-	g_clear_list(&sheet->record_list,
-	             (GDestroyNotify)purple_request_datasheet_record_free);
-	g_hash_table_remove_all(sheet->record_li_by_key);
-
-	purple_signal_emit(sheet, "record-changed", sheet, NULL);
-}
-
-void
-purple_request_datasheet_record_mark_all_for_rem(PurpleRequestDatasheet *sheet)
-{
-	const GList *it;
-
-	g_clear_pointer(&sheet->marked_for_rem, g_hash_table_destroy);
-	sheet->marked_for_rem = g_hash_table_new(g_direct_hash, g_direct_equal);
-
-	it = purple_request_datasheet_get_records(sheet);
-	for (; it != NULL; it = g_list_next(it)) {
-		PurpleRequestDatasheetRecord *rec = it->data;
-		gpointer key = purple_request_datasheet_record_get_key(rec);
-
-		g_hash_table_insert(sheet->marked_for_rem, key, key);
-	}
-}
-
-void
-purple_request_datasheet_record_remove_marked(PurpleRequestDatasheet *sheet)
-{
-	GHashTableIter it;
-	gpointer key;
-	GHashTable *rem;
-
-	if (sheet->marked_for_rem == NULL)
-		return;
-	rem = sheet->marked_for_rem;
-	sheet->marked_for_rem = NULL;
-
-	g_hash_table_iter_init(&it, rem);
-	while (g_hash_table_iter_next(&it, &key, NULL))
-		purple_request_datasheet_record_remove(sheet, key);
-
-	g_hash_table_destroy(rem);
-}
-
-static void
-purple_request_datasheet_record_set_common_data(
-	PurpleRequestDatasheetRecord *rec, guint col_no, const gchar *data)
-{
-	g_return_if_fail(rec != NULL);
-	g_return_if_fail(
-		purple_request_datasheet_get_column_count(rec->sheet) > col_no);
-
-	if (g_strcmp0(rec->data[col_no], data) == 0)
-		return;
-
-	/* we assume, model hasn't changed */
-	g_free(rec->data[col_no]);
-	rec->data[col_no] = g_strdup(data);
-
-	purple_signal_emit(rec->sheet, "record-changed", rec->sheet, rec->key);
-}
-
-void
-purple_request_datasheet_record_set_string_data(
-	PurpleRequestDatasheetRecord *rec, guint col_no, const gchar *data)
-{
-	g_return_if_fail(rec != NULL);
-	g_return_if_fail(purple_request_datasheet_get_column_type(rec->sheet,
-		col_no) == PURPLE_REQUEST_DATASHEET_COLUMN_STRING);
-
-	purple_request_datasheet_record_set_common_data(rec, col_no, data);
-}
-
-void
-purple_request_datasheet_record_set_image_data(
-	PurpleRequestDatasheetRecord *rec, guint col_no, const gchar *stock_id)
-{
-	g_return_if_fail(rec != NULL);
-	g_return_if_fail(purple_request_datasheet_get_column_type(rec->sheet,
-		col_no) == PURPLE_REQUEST_DATASHEET_COLUMN_IMAGE);
-
-	purple_request_datasheet_record_set_common_data(rec, col_no, stock_id);
-}
-
-static const gchar *
-purple_request_datasheet_record_get_common_data(
-	const PurpleRequestDatasheetRecord *rec, guint col_no)
-{
-	g_return_val_if_fail(rec != NULL, NULL);
-	g_return_val_if_fail(
-		purple_request_datasheet_get_column_count(rec->sheet) > col_no,
-		NULL);
-
-	return rec->data[col_no];
-}
-
-const gchar *
-purple_request_datasheet_record_get_string_data(
-	const PurpleRequestDatasheetRecord *rec, guint col_no)
-{
-	g_return_val_if_fail(rec != NULL, NULL);
-	g_return_val_if_fail(purple_request_datasheet_get_column_type(
-		rec->sheet, col_no) == PURPLE_REQUEST_DATASHEET_COLUMN_STRING,
-		NULL);
-
-	return purple_request_datasheet_record_get_common_data(rec, col_no);
-}
-
-const gchar *
-purple_request_datasheet_record_get_image_data(
-	const PurpleRequestDatasheetRecord *rec, guint col_no)
-{
-	g_return_val_if_fail(rec != NULL, NULL);
-	g_return_val_if_fail(purple_request_datasheet_get_column_type(
-		rec->sheet, col_no) == PURPLE_REQUEST_DATASHEET_COLUMN_IMAGE,
-		NULL);
-
-	return purple_request_datasheet_record_get_common_data(rec, col_no);
-}
diff --git a/libpurple/request.h b/libpurple/request.h
--- a/libpurple/request.h
+++ b/libpurple/request.h
@@ -49,7 +49,6 @@
 #include "request/purplerequestpage.h"
 #include "request/purplerequestgroup.h"
 #include "request/purplerequestfield.h"
-#include "request-datasheet.h"
 
 /**
  * PURPLE_DEFAULT_ACTION_NONE:
diff --git a/libpurple/request/purplerequestfielddatasheet.h b/libpurple/request/purplerequestfielddatasheet.h
deleted file mode 100644
--- a/libpurple/request/purplerequestfielddatasheet.h
+++ /dev/null
@@ -1,82 +0,0 @@
-/*
- * 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 library 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 library 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 library; 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 <glib.h>
-#include <glib-object.h>
-
-#include "request.h"
-#include "request-datasheet.h"
-#include "purpleversion.h"
-
-G_BEGIN_DECLS
-
-/**
- * PurpleRequestFieldDatasheet:
- *
- * A datasheet request field.
- *
- * Since: 3.0
- */
-#define PURPLE_TYPE_REQUEST_FIELD_DATASHEET (purple_request_field_datasheet_get_type())
-
-PURPLE_AVAILABLE_IN_3_0
-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.
- *
- * Since: 3.0
- */
-PURPLE_AVAILABLE_IN_3_0
-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.
- *
- * Since: 3.0
- */
-PURPLE_AVAILABLE_IN_3_0
-PurpleRequestDatasheet *purple_request_field_datasheet_get_sheet(PurpleRequestFieldDatasheet *field);
-
-G_END_DECLS
-
-#endif /* PURPLE_REQUEST_FIELD_DATASHEET_H */
diff --git a/libpurple/request/purplerequestfielddatasheet.c b/libpurple/request/purplerequestfielddatasheet.c
deleted file mode 100644
--- a/libpurple/request/purplerequestfielddatasheet.c
+++ /dev/null
@@ -1,154 +0,0 @@
-/*
- * 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 library 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 library 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 library; if not, see <https://www.gnu.org/licenses/>.
- */
-
-#include <glib/gi18n-lib.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_FINAL_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
-	 */
-	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/po/POTFILES.in b/po/POTFILES.in
--- a/po/POTFILES.in
+++ b/po/POTFILES.in
@@ -67,13 +67,11 @@
 libpurple/purplewhiteboardmanager.c
 libpurple/purplewhiteboarduiops.c
 libpurple/request.c
-libpurple/request-datasheet.c
 libpurple/request/purplerequestfield.c
 libpurple/request/purplerequestfieldaccount.c
 libpurple/request/purplerequestfieldbool.c
 libpurple/request/purplerequestfield.c
 libpurple/request/purplerequestfieldchoice.c
-libpurple/request/purplerequestfielddatasheet.c
 libpurple/request/purplerequestfieldimage.c
 libpurple/request/purplerequestfieldint.c
 libpurple/request/purplerequestfieldlabel.c
