WebKitUserMessage.cpp [plain text]
#include "config.h"
#include "WebKitUserMessage.h"
#include "WebKitUserMessagePrivate.h"
#include <gio/gunixfdlist.h>
#include <glib/gi18n-lib.h>
#include <wtf/CompletionHandler.h>
#include <wtf/glib/WTFGType.h>
using namespace WebKit;
enum {
PROP_0,
PROP_NAME,
PROP_PARAMETERS,
PROP_FD_LIST
};
struct _WebKitUserMessagePrivate {
UserMessage message;
CompletionHandler<void(UserMessage&&)> replyHandler;
};
WEBKIT_DEFINE_TYPE(WebKitUserMessage, webkit_user_message, G_TYPE_INITIALLY_UNOWNED)
G_DEFINE_QUARK(WebKitUserMessageError, webkit_user_message_error)
static void webkitUserMessageDispose(GObject* object)
{
WebKitUserMessage* message = WEBKIT_USER_MESSAGE(object);
if (auto replyHandler = std::exchange(message->priv->replyHandler, nullptr))
replyHandler(UserMessage(message->priv->message.name, WEBKIT_USER_MESSAGE_UNHANDLED_MESSAGE));
G_OBJECT_CLASS(webkit_user_message_parent_class)->dispose(object);
}
static void webkitUserMessageGetProperty(GObject* object, guint propId, GValue* value, GParamSpec* paramSpec)
{
WebKitUserMessage* message = WEBKIT_USER_MESSAGE(object);
switch (propId) {
case PROP_NAME:
g_value_set_string(value, webkit_user_message_get_name(message));
break;
case PROP_PARAMETERS:
g_value_set_variant(value, webkit_user_message_get_parameters(message));
break;
case PROP_FD_LIST:
g_value_set_object(value, webkit_user_message_get_fd_list(message));
break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID(object, propId, paramSpec);
}
}
static void webkitUserMessageSetProperty(GObject* object, guint propId, const GValue* value, GParamSpec* paramSpec)
{
WebKitUserMessage* message = WEBKIT_USER_MESSAGE(object);
switch (propId) {
case PROP_NAME:
message->priv->message.name = g_value_get_string(value);
message->priv->message.type = UserMessage::Type::Message;
break;
case PROP_PARAMETERS:
message->priv->message.parameters = g_value_get_variant(value);
break;
case PROP_FD_LIST:
message->priv->message.fileDescriptors = G_UNIX_FD_LIST(g_value_get_object(value));
break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID(object, propId, paramSpec);
}
}
static void webkit_user_message_class_init(WebKitUserMessageClass* klass)
{
GObjectClass* gObjectClass = G_OBJECT_CLASS(klass);
gObjectClass->dispose = webkitUserMessageDispose;
gObjectClass->get_property = webkitUserMessageGetProperty;
gObjectClass->set_property = webkitUserMessageSetProperty;
g_object_class_install_property(
gObjectClass,
PROP_NAME,
g_param_spec_string(
"name",
_("Name"),
_("The user message name"),
nullptr,
static_cast<GParamFlags>(WEBKIT_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY)));
g_object_class_install_property(
gObjectClass,
PROP_PARAMETERS,
g_param_spec_variant(
"parameters",
_("Parameters"),
_("The user message parameters"),
G_VARIANT_TYPE_ANY,
nullptr,
static_cast<GParamFlags>(WEBKIT_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY)));
g_object_class_install_property(
gObjectClass,
PROP_FD_LIST,
g_param_spec_object(
"fd-list",
_("File Descriptor List"),
_("The user message list of file descriptors"),
G_TYPE_UNIX_FD_LIST,
static_cast<GParamFlags>(WEBKIT_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY)));
}
WebKitUserMessage* webkitUserMessageCreate(UserMessage&& message)
{
WebKitUserMessage* returnValue = WEBKIT_USER_MESSAGE(g_object_new(WEBKIT_TYPE_USER_MESSAGE, nullptr));
returnValue->priv->message = WTFMove(message);
return returnValue;
}
WebKitUserMessage* webkitUserMessageCreate(UserMessage&& message, CompletionHandler<void(UserMessage&&)>&& replyHandler)
{
WebKitUserMessage* returnValue = WEBKIT_USER_MESSAGE(g_object_new(WEBKIT_TYPE_USER_MESSAGE, nullptr));
returnValue->priv->message = WTFMove(message);
returnValue->priv->replyHandler = WTFMove(replyHandler);
return returnValue;
}
UserMessage& webkitUserMessageGetMessage(WebKitUserMessage* message)
{
return message->priv->message;
}
WebKitUserMessage* webkit_user_message_new(const char* name, GVariant* parameters)
{
return webkit_user_message_new_with_fd_list(name, parameters, nullptr);
}
WebKitUserMessage* webkit_user_message_new_with_fd_list(const char* name, GVariant* parameters, GUnixFDList* fdList)
{
g_return_val_if_fail(name, nullptr);
g_return_val_if_fail(!fdList || G_IS_UNIX_FD_LIST(fdList), nullptr);
return WEBKIT_USER_MESSAGE(g_object_new(WEBKIT_TYPE_USER_MESSAGE, "name", name, "parameters", parameters, "fd-list", fdList, nullptr));
}
const char* webkit_user_message_get_name(WebKitUserMessage* message)
{
g_return_val_if_fail(WEBKIT_IS_USER_MESSAGE(message), nullptr);
return message->priv->message.name.data();
}
GVariant* webkit_user_message_get_parameters(WebKitUserMessage* message)
{
g_return_val_if_fail(WEBKIT_IS_USER_MESSAGE(message), nullptr);
return message->priv->message.parameters.get();
}
GUnixFDList* webkit_user_message_get_fd_list(WebKitUserMessage* message)
{
g_return_val_if_fail(WEBKIT_IS_USER_MESSAGE(message), nullptr);
return message->priv->message.fileDescriptors.get();
}
void webkit_user_message_send_reply(WebKitUserMessage* message, WebKitUserMessage* reply)
{
g_return_if_fail(WEBKIT_IS_USER_MESSAGE(message));
g_return_if_fail(WEBKIT_IS_USER_MESSAGE(reply));
g_return_if_fail(message->priv->replyHandler);
GRefPtr<WebKitUserMessage> adoptedReply = reply;
if (auto replyHandler = std::exchange(message->priv->replyHandler, nullptr))
replyHandler(reply ? reply->priv->message : UserMessage());
}