degesch: buffer creation cleanup

This commit is contained in:
Přemysl Eric Janouch 2020-10-31 23:42:49 +01:00
parent 3dc6ee9a5b
commit 8f5dec0456
Signed by: p
GPG Key ID: A0420B94F92B9493

View File

@ -1591,12 +1591,14 @@ static struct ispect_field g_buffer_ispect[] =
};
static struct buffer *
buffer_new (struct input *input)
buffer_new (struct input *input, enum buffer_type type, char *name)
{
struct buffer *self = xcalloc (1, sizeof *self);
self->ref_count = 1;
self->input = input;
self->input_data = CALL (input, buffer_new);
self->type = type;
self->name = name;
return self;
}
@ -4446,9 +4448,8 @@ buffer_remove_safe (struct app_context *ctx, struct buffer *buffer)
static void
init_global_buffer (struct app_context *ctx)
{
struct buffer *global = ctx->global_buffer = buffer_new (ctx->input);
global->type = BUFFER_GLOBAL;
global->name = xstrdup (PROGRAM_NAME);
struct buffer *global = ctx->global_buffer =
buffer_new (ctx->input, BUFFER_GLOBAL, xstrdup (PROGRAM_NAME));
buffer_add (ctx, global);
buffer_activate (ctx, global);
@ -4456,6 +4457,19 @@ init_global_buffer (struct app_context *ctx)
// --- Users, channels ---------------------------------------------------------
static char *
irc_make_buffer_name (struct server *s, const char *target)
{
if (!target)
return xstrdup (s->name);
// XXX: this may be able to trigger the uniqueness assertion with non-UTF-8
char *target_utf8 = irc_to_utf8 (target);
char *result = xstrdup_printf ("%s.%s", s->name, target_utf8);
free (target_utf8);
return result;
}
static void
irc_user_on_destroy (void *object, void *user_data)
{
@ -4495,11 +4509,8 @@ irc_get_or_make_user_buffer (struct server *s, const char *nickname)
struct user *user = irc_get_or_make_user (s, nickname);
// Open a new buffer for the user
buffer = buffer_new (s->ctx->input);
buffer->type = BUFFER_PM;
char *nickname_utf8 = irc_to_utf8 (nickname);
buffer->name = xstrdup_printf ("%s.%s", s->name, nickname_utf8);
free (nickname_utf8);
buffer = buffer_new (s->ctx->input,
BUFFER_PM, irc_make_buffer_name (s, nickname));
buffer->server = s;
buffer->user = user;
str_map_set (&s->irc_buffer_map, user->nickname, buffer);
@ -6644,11 +6655,8 @@ irc_handle_join (struct server *s, const struct irc_message *msg)
if (!irc_is_this_us (s, msg->prefix))
return;
buffer = buffer_new (s->ctx->input);
buffer->type = BUFFER_CHANNEL;
char *channel_name_utf8 = irc_to_utf8 (channel_name);
buffer->name = xstrdup_printf ("%s.%s", s->name, channel_name_utf8);
free (channel_name_utf8);
buffer = buffer_new (s->ctx->input,
BUFFER_CHANNEL, irc_make_buffer_name (s, channel_name));
buffer->server = s;
buffer->channel = channel =
irc_make_channel (s, xstrdup (channel_name));
@ -8318,9 +8326,8 @@ server_add (struct app_context *ctx,
s->config = subtree;
// Add a buffer and activate it
struct buffer *buffer = s->buffer = buffer_new (ctx->input);
buffer->type = BUFFER_SERVER;
buffer->name = xstrdup (s->name);
struct buffer *buffer = s->buffer = buffer_new (ctx->input,
BUFFER_SERVER, irc_make_buffer_name (s, NULL));
buffer->server = s;
buffer_add (ctx, buffer);