Commit 5155b0f6 authored by Max Kellermann's avatar Max Kellermann

ClientMessage: turn into a class

parent d919f8d5
...@@ -40,57 +40,3 @@ client_message_valid_channel_name(const char *name) ...@@ -40,57 +40,3 @@ client_message_valid_channel_name(const char *name)
return true; return true;
} }
void
client_message_init_null(struct client_message *msg)
{
assert(msg != NULL);
msg->channel = NULL;
msg->message = NULL;
}
void
client_message_init(struct client_message *msg,
const char *channel, const char *message)
{
assert(msg != NULL);
msg->channel = g_strdup(channel);
msg->message = g_strdup(message);
}
void
client_message_copy(struct client_message *dest,
const struct client_message *src)
{
assert(dest != NULL);
assert(src != NULL);
assert(client_message_defined(src));
client_message_init(dest, src->channel, src->message);
}
struct client_message *
client_message_dup(const struct client_message *src)
{
struct client_message *dest = g_slice_new(struct client_message);
client_message_copy(dest, src);
return dest;
}
void
client_message_deinit(struct client_message *msg)
{
assert(msg != NULL);
g_free(msg->channel);
g_free(msg->message);
}
void
client_message_free(struct client_message *msg)
{
client_message_deinit(msg);
g_slice_free(struct client_message, msg);
}
...@@ -22,52 +22,31 @@ ...@@ -22,52 +22,31 @@
#include "gcc.h" #include "gcc.h"
#include <assert.h> #include <string>
#include <stdbool.h>
#include <stddef.h>
/** /**
* A client-to-client message. * A client-to-client message.
*/ */
struct client_message { class ClientMessage {
char *channel; std::string channel, message;
char *message; public:
template<typename T, typename U>
ClientMessage(T &&_channel, U &&_message)
:channel(std::forward<T>(_channel)),
message(std::forward<U>(_message)) {}
const char *GetChannel() const {
return channel.c_str();
}
const char *GetMessage() const {
return message.c_str();
}
}; };
gcc_pure gcc_pure
bool bool
client_message_valid_channel_name(const char *name); client_message_valid_channel_name(const char *name);
gcc_pure
static inline bool
client_message_defined(const struct client_message *msg)
{
assert(msg != NULL);
assert((msg->channel == NULL) == (msg->message == NULL));
return msg->channel != NULL;
}
void
client_message_init_null(struct client_message *msg);
void
client_message_init(struct client_message *msg,
const char *channel, const char *message);
void
client_message_copy(struct client_message *dest,
const struct client_message *src);
gcc_malloc
struct client_message *
client_message_dup(const struct client_message *src);
void
client_message_deinit(struct client_message *msg);
void
client_message_free(struct client_message *msg);
#endif #endif
...@@ -25,6 +25,7 @@ extern "C" { ...@@ -25,6 +25,7 @@ extern "C" {
#include "idle.h" #include "idle.h"
} }
#include <assert.h>
#include <string.h> #include <string.h>
enum client_subscribe_result enum client_subscribe_result
...@@ -78,21 +79,19 @@ client_unsubscribe_all(Client *client) ...@@ -78,21 +79,19 @@ client_unsubscribe_all(Client *client)
} }
bool bool
client_push_message(Client *client, const struct client_message *msg) client_push_message(Client *client, const ClientMessage &msg)
{ {
assert(client != NULL); assert(client != NULL);
assert(msg != NULL);
assert(client_message_defined(msg));
if (client->num_messages >= CLIENT_MAX_MESSAGES || if (client->num_messages >= CLIENT_MAX_MESSAGES ||
!client->IsSubscribed(msg->channel)) !client->IsSubscribed(msg.GetChannel()))
return false; return false;
if (client->messages == NULL) if (client->messages == NULL)
client_idle_add(client, IDLE_MESSAGE); client_idle_add(client, IDLE_MESSAGE);
client->messages = g_slist_prepend(client->messages, client->messages = g_slist_prepend(client->messages,
client_message_dup(msg)); new ClientMessage(msg));
++client->num_messages; ++client->num_messages;
return true; return true;
......
...@@ -24,7 +24,7 @@ ...@@ -24,7 +24,7 @@
typedef struct _GSList GSList; typedef struct _GSList GSList;
class Client; class Client;
struct client_message; class ClientMessage;
enum client_subscribe_result { enum client_subscribe_result {
/** success */ /** success */
...@@ -50,7 +50,7 @@ void ...@@ -50,7 +50,7 @@ void
client_unsubscribe_all(Client *client); client_unsubscribe_all(Client *client);
bool bool
client_push_message(Client *client, const struct client_message *msg); client_push_message(Client *client, const ClientMessage &msg);
gcc_malloc gcc_malloc
GSList * GSList *
......
...@@ -112,11 +112,12 @@ handle_read_messages(Client *client, ...@@ -112,11 +112,12 @@ handle_read_messages(Client *client,
GSList *messages = client_read_messages(client); GSList *messages = client_read_messages(client);
for (GSList *i = messages; i != NULL; i = g_slist_next(i)) { for (GSList *i = messages; i != NULL; i = g_slist_next(i)) {
struct client_message *msg = (struct client_message *)i->data; ClientMessage *msg = (ClientMessage *)i->data;
client_printf(client, "channel: %s\nmessage: %s\n", client_printf(client, "channel: %s\nmessage: %s\n",
msg->channel, msg->message); msg->GetChannel(),
client_message_free(msg); msg->GetMessage());
delete msg;
} }
g_slist_free(messages); g_slist_free(messages);
...@@ -125,9 +126,14 @@ handle_read_messages(Client *client, ...@@ -125,9 +126,14 @@ handle_read_messages(Client *client,
} }
struct send_message_context { struct send_message_context {
struct client_message msg; ClientMessage msg;
bool sent; bool sent;
template<typename T, typename U>
send_message_context(T &&_channel, U &&_message)
:msg(std::forward<T>(_channel), std::forward<U>(_message)),
sent(false) {}
}; };
static void static void
...@@ -137,7 +143,7 @@ send_message(gpointer data, gpointer user_data) ...@@ -137,7 +143,7 @@ send_message(gpointer data, gpointer user_data)
(struct send_message_context *)user_data; (struct send_message_context *)user_data;
Client *client = (Client *)data; Client *client = (Client *)data;
if (client_push_message(client, &context->msg)) if (client_push_message(client, context->msg))
context->sent = true; context->sent = true;
} }
...@@ -153,15 +159,10 @@ handle_send_message(Client *client, ...@@ -153,15 +159,10 @@ handle_send_message(Client *client,
return COMMAND_RETURN_ERROR; return COMMAND_RETURN_ERROR;
} }
struct send_message_context context; struct send_message_context context(argv[1], argv[2]);
context.sent = false;
client_message_init(&context.msg, argv[1], argv[2]);
client_list_foreach(send_message, &context); client_list_foreach(send_message, &context);
client_message_deinit(&context.msg);
if (context.sent) if (context.sent)
return COMMAND_RETURN_OK; return COMMAND_RETURN_OK;
else { else {
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment