libpurple/purpleroomlistroom.c

Fri, 12 Aug 2022 03:44:34 -0500

author
Gary Kramlich <grim@reaperworld.com>
date
Fri, 12 Aug 2022 03:44:34 -0500
branch
gtk4
changeset 41560
2579a5138f0c
parent 41351
a2cd8d6d9483
child 41942
013f54f8f035
permissions
-rw-r--r--

A bunch of random fixes for the the gtk4 branch

Testing Done:
Compiled

Reviewed at https://reviews.imfreedom.org/r/1581/

/*
 * Purple - Internet Messaging Library
 * Copyright (C) Pidgin Developers <devel@pidgin.im>
 *
 * This library 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 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
 * Lesser General Public License for more details.
 *
 * You should have received a copy of the GNU Lesser General Public License
 * along with this library; if not, see <https://www.gnu.org/licenses/>.
 */

#include "purpleroomlistroom.h"

typedef struct {
	gchar *name;
	gchar *description;
	gchar *category;
	guint user_count;

	GHashTable *components;
} PurpleRoomlistRoomPrivate;

enum {
	PROP_0,
	PROP_NAME,
	PROP_DESCRIPTION,
	PROP_CATEGORY,
	PROP_USER_COUNT,
	N_PROPERTIES
};
static GParamSpec *properties[N_PROPERTIES] = {NULL, };

G_DEFINE_TYPE_WITH_PRIVATE(PurpleRoomlistRoom, purple_roomlist_room,
                           G_TYPE_OBJECT)

/******************************************************************************
 * Helpers
 *****************************************************************************/
static void
purple_roomlist_room_set_name(PurpleRoomlistRoom *room, const gchar *name) {
	PurpleRoomlistRoomPrivate *priv = NULL;

	g_return_if_fail(PURPLE_IS_ROOMLIST_ROOM(room));

	priv = purple_roomlist_room_get_instance_private(room);

	g_clear_pointer(&priv->name, g_free);
	priv->name = g_strdup(name);

	g_object_notify_by_pspec(G_OBJECT(room), properties[PROP_NAME]);
}

static void
purple_roomlist_room_set_description(PurpleRoomlistRoom *room,
                                     const gchar *description)
{
	PurpleRoomlistRoomPrivate *priv = NULL;

	g_return_if_fail(PURPLE_IS_ROOMLIST_ROOM(room));

	priv = purple_roomlist_room_get_instance_private(room);

	g_clear_pointer(&priv->description, g_free);
	priv->description = g_strdup(description);

	g_object_notify_by_pspec(G_OBJECT(room), properties[PROP_DESCRIPTION]);
}

/******************************************************************************
 * GObject Implementation
 *****************************************************************************/
static void
purple_roomlist_room_get_property(GObject *obj, guint param_id, GValue *value,
                                  GParamSpec *pspec)
{
	PurpleRoomlistRoom *room = PURPLE_ROOMLIST_ROOM(obj);

	switch(param_id) {
		case PROP_NAME:
			g_value_set_string(value, purple_roomlist_room_get_name(room));
			break;
		case PROP_DESCRIPTION:
			g_value_set_string(value,
			                   purple_roomlist_room_get_description(room));
			break;
		case PROP_CATEGORY:
			g_value_set_string(value, purple_roomlist_room_get_category(room));
			break;
		case PROP_USER_COUNT:
			g_value_set_uint(value, purple_roomlist_room_get_user_count(room));
			break;
		default:
			G_OBJECT_WARN_INVALID_PROPERTY_ID(obj, param_id, pspec);
			break;
	}
}

static void
purple_roomlist_room_set_property(GObject *obj, guint param_id,
                                  const GValue *value, GParamSpec *pspec)
{
	PurpleRoomlistRoom *room = PURPLE_ROOMLIST_ROOM(obj);

	switch(param_id) {
		case PROP_NAME:
			purple_roomlist_room_set_name(room, g_value_get_string(value));
			break;
		case PROP_DESCRIPTION:
			purple_roomlist_room_set_description(room,
			                                     g_value_get_string(value));
			break;
		case PROP_CATEGORY:
			purple_roomlist_room_set_category(room, g_value_get_string(value));
			break;
		case PROP_USER_COUNT:
			purple_roomlist_room_set_user_count(room, g_value_get_uint(value));
			break;
		default:
			G_OBJECT_WARN_INVALID_PROPERTY_ID(obj, param_id, pspec);
			break;
	}
}

static void
purple_roomlist_room_finalize(GObject *obj) {
	PurpleRoomlistRoom *room = NULL;
	PurpleRoomlistRoomPrivate *priv = NULL;;

	room = PURPLE_ROOMLIST_ROOM(obj);
	priv = purple_roomlist_room_get_instance_private(room);

	g_clear_pointer(&priv->name, g_free);
	g_clear_pointer(&priv->description, g_free);
	g_clear_pointer(&priv->category, g_free);

	g_clear_pointer(&priv->components, g_hash_table_destroy);

	G_OBJECT_CLASS(purple_roomlist_room_parent_class)->finalize(obj);
}

static void
purple_roomlist_room_init(PurpleRoomlistRoom *room) {
	PurpleRoomlistRoomPrivate *priv = NULL;

	priv = purple_roomlist_room_get_instance_private(room);

	priv->components = g_hash_table_new_full(g_str_hash, g_str_equal, NULL,
	                                         g_free);
}

static void
purple_roomlist_room_class_init(PurpleRoomlistRoomClass *klass) {
	GObjectClass *obj_class = G_OBJECT_CLASS(klass);

	obj_class->get_property = purple_roomlist_room_get_property;
	obj_class->set_property = purple_roomlist_room_set_property;
	obj_class->finalize = purple_roomlist_room_finalize;

	properties[PROP_NAME] = g_param_spec_string(
		"name", "name",
		"The name of the room",
		NULL,
		G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY | G_PARAM_STATIC_STRINGS);

	properties[PROP_DESCRIPTION] = g_param_spec_string(
		"description", "description",
		"The description of the room",
		NULL,
		G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY | G_PARAM_STATIC_STRINGS);

	properties[PROP_CATEGORY] = g_param_spec_string(
		"category", "category",
		"The category of the room",
		NULL,
		G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY | G_PARAM_STATIC_STRINGS);

	properties[PROP_USER_COUNT] = g_param_spec_uint(
		"user-count", "user-count",
		"The user count of the room",
		0, G_MAXUINT, 0,
		G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY | G_PARAM_STATIC_STRINGS);

	g_object_class_install_properties(obj_class, N_PROPERTIES, properties);
}

/******************************************************************************
 * Public API
 *****************************************************************************/
PurpleRoomlistRoom *
purple_roomlist_room_new(const gchar *name, const gchar *description) {
	return g_object_new(
		PURPLE_TYPE_ROOMLIST_ROOM,
		"name", name,
		"description", description,
		NULL);
}

const gchar *
purple_roomlist_room_get_name(PurpleRoomlistRoom *room) {
	PurpleRoomlistRoomPrivate *priv = NULL;

	g_return_val_if_fail(PURPLE_IS_ROOMLIST_ROOM(room), NULL);

	priv = purple_roomlist_room_get_instance_private(room);

	return priv->name;
}

const gchar *
purple_roomlist_room_get_description(PurpleRoomlistRoom *room) {
	PurpleRoomlistRoomPrivate *priv = NULL;

	g_return_val_if_fail(PURPLE_IS_ROOMLIST_ROOM(room), NULL);

	priv = purple_roomlist_room_get_instance_private(room);

	return priv->description;
}

const gchar *
purple_roomlist_room_get_category(PurpleRoomlistRoom *room) {
	PurpleRoomlistRoomPrivate *priv = NULL;

	g_return_val_if_fail(PURPLE_IS_ROOMLIST_ROOM(room), NULL);

	priv = purple_roomlist_room_get_instance_private(room);

	return priv->category;
}

void
purple_roomlist_room_set_category(PurpleRoomlistRoom *room,
                                  const gchar *category)
{
	PurpleRoomlistRoomPrivate *priv = NULL;

	g_return_if_fail(PURPLE_IS_ROOMLIST_ROOM(room));

	priv = purple_roomlist_room_get_instance_private(room);

	g_clear_pointer(&priv->category, g_free);
	priv->category = g_strdup(category);

	g_object_notify_by_pspec(G_OBJECT(room), properties[PROP_CATEGORY]);
}

const guint
purple_roomlist_room_get_user_count(PurpleRoomlistRoom *room) {
	PurpleRoomlistRoomPrivate *priv = NULL;

	g_return_val_if_fail(PURPLE_IS_ROOMLIST_ROOM(room), 0);

	priv = purple_roomlist_room_get_instance_private(room);

	return priv->user_count;
}

void
purple_roomlist_room_set_user_count(PurpleRoomlistRoom *room,
                                    guint user_count)
{
	PurpleRoomlistRoomPrivate *priv = NULL;

	g_return_if_fail(PURPLE_IS_ROOMLIST_ROOM(room));

	priv = purple_roomlist_room_get_instance_private(room);

	priv->user_count = user_count;

	g_object_notify_by_pspec(G_OBJECT(room), properties[PROP_USER_COUNT]);
}

void
purple_roomlist_room_add_field(PurpleRoomlistRoom *room, const gchar *field,
                               const gchar *value)
{
	PurpleRoomlistRoomPrivate *priv = NULL;

	g_return_if_fail(PURPLE_IS_ROOMLIST_ROOM(room));
	g_return_if_fail(field != NULL);
	g_return_if_fail(value != NULL);

	priv = purple_roomlist_room_get_instance_private(room);

	g_hash_table_replace(priv->components, (gpointer)field, g_strdup(value));
}

const gchar *
purple_roomlist_room_get_field(PurpleRoomlistRoom *room, const gchar *field) {
	PurpleRoomlistRoomPrivate *priv = NULL;

	g_return_val_if_fail(PURPLE_IS_ROOMLIST_ROOM(room), NULL);
	g_return_val_if_fail(field != NULL, NULL);

	priv = purple_roomlist_room_get_instance_private(room);

	return g_hash_table_lookup(priv->components, field);
}

GHashTable *
purple_roomlist_room_get_components(PurpleRoomlistRoom *room) {
	PurpleRoomlistRoomPrivate *priv = NULL;

	g_return_val_if_fail(PURPLE_IS_ROOMLIST_ROOM(room), NULL);

	priv = purple_roomlist_room_get_instance_private(room);

	return priv->components;
}

mercurial