parent
b5f1253738
commit
792f805909
@ -0,0 +1,121 @@
|
||||
#include "webfuse_provider/impl/message_writer.h"
|
||||
#include "webfuse_provider/impl/message.h"
|
||||
#include "webfuse_provider/impl/util/base64.h"
|
||||
#include "webfuse_provider/impl/dirbuffer.h"
|
||||
|
||||
#include <jansson.h>
|
||||
#include <libwebsockets.h>
|
||||
#include <stdlib.h>
|
||||
|
||||
struct wfp_message_writer
|
||||
{
|
||||
json_t * result;
|
||||
json_t * error;
|
||||
int id;
|
||||
};
|
||||
|
||||
struct wfp_message_writer *
|
||||
wfp_impl_message_writer_create(int id)
|
||||
{
|
||||
struct wfp_message_writer * writer = malloc(sizeof(writer));
|
||||
writer->result = json_object();
|
||||
writer->error = NULL;
|
||||
writer->id = id;
|
||||
|
||||
return writer;
|
||||
}
|
||||
|
||||
void
|
||||
wfp_impl_message_writer_dispose(
|
||||
struct wfp_message_writer * writer)
|
||||
{
|
||||
json_decref(writer->result);
|
||||
json_decref(writer->error);
|
||||
free(writer);
|
||||
}
|
||||
|
||||
struct wfp_message *
|
||||
wfp_impl_message_writer_take_message(
|
||||
struct wfp_message_writer * writer)
|
||||
{
|
||||
json_t * response = json_object();
|
||||
|
||||
if (writer->result)
|
||||
{
|
||||
json_object_set_new(response, "result", writer->result);
|
||||
}
|
||||
else
|
||||
{
|
||||
json_object_set_new(response, "error", writer->error);
|
||||
}
|
||||
json_object_set_new(response, "id", json_integer(writer->id));
|
||||
|
||||
size_t const length = json_dumpb(response, NULL, 0, JSON_COMPACT);
|
||||
|
||||
char * data = malloc(sizeof(struct wfp_message) + LWS_PRE + length);
|
||||
struct wfp_message * message = (struct wfp_message *) data;
|
||||
message->data = &data[sizeof(struct wfp_message) + LWS_PRE];
|
||||
message->length = length;
|
||||
|
||||
json_dumpb(response, message->data, length, JSON_COMPACT);
|
||||
|
||||
|
||||
json_decref(response);
|
||||
return message;
|
||||
}
|
||||
|
||||
void
|
||||
wfp_impl_message_writer_add_int(
|
||||
struct wfp_message_writer * writer,
|
||||
char const * key,
|
||||
int value)
|
||||
{
|
||||
json_object_set_new(writer->result, key, json_integer(value));
|
||||
}
|
||||
|
||||
void
|
||||
wfp_impl_message_writer_add_string(
|
||||
struct wfp_message_writer * writer,
|
||||
char const * key,
|
||||
char const * value)
|
||||
{
|
||||
json_object_set_new(writer->result, key, json_string(value));
|
||||
}
|
||||
|
||||
void
|
||||
wfp_impl_message_writer_add_bytes(
|
||||
struct wfp_message_writer * writer,
|
||||
char const * key,
|
||||
char const * data,
|
||||
size_t length)
|
||||
{
|
||||
size_t const size = wfp_impl_base64_encoded_size(length) + 1;
|
||||
char * buffer = malloc(size);
|
||||
wfp_impl_base64_encode((uint8_t const *) data, length, buffer, size);
|
||||
|
||||
json_object_set_new(writer->result, "data", json_string(buffer));
|
||||
|
||||
free(buffer);
|
||||
}
|
||||
|
||||
void
|
||||
wfp_impl_message_writer_add_dirbuffer(
|
||||
struct wfp_message_writer * writer,
|
||||
struct wfp_dirbuffer * dirbuffer)
|
||||
{
|
||||
json_decref(writer->result);
|
||||
writer->result = wfp_impl_dirbuffer_take(dirbuffer);
|
||||
}
|
||||
|
||||
void
|
||||
wfp_impl_message_writer_set_error(
|
||||
struct wfp_message_writer * writer,
|
||||
int error_code)
|
||||
{
|
||||
json_decref(writer->result);
|
||||
writer->result = NULL;
|
||||
|
||||
json_decref(writer->error);
|
||||
writer->error = json_object();
|
||||
json_object_set_new(writer->error, "code", json_integer(error_code));
|
||||
}
|
@ -0,0 +1,63 @@
|
||||
#ifndef WFP_IMPL_MESSAGE_WRITER_H
|
||||
#define WFP_IMPL_MESSAGE_WRITER_H
|
||||
|
||||
#ifndef _cplusplus
|
||||
#include <stddef.h>
|
||||
#else
|
||||
#include <cstddef>
|
||||
#endif
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C"
|
||||
{
|
||||
#endif
|
||||
|
||||
struct wfp_message_writer;
|
||||
struct wfp_message;
|
||||
struct wfp_dirbuffer;
|
||||
|
||||
extern struct wfp_message_writer *
|
||||
wfp_impl_message_writer_create(int id);
|
||||
|
||||
extern void
|
||||
wfp_impl_message_writer_dispose(
|
||||
struct wfp_message_writer * writer);
|
||||
|
||||
extern struct wfp_message *
|
||||
wfp_impl_message_writer_take_message(
|
||||
struct wfp_message_writer * writer);
|
||||
|
||||
extern void
|
||||
wfp_impl_message_writer_add_int(
|
||||
struct wfp_message_writer * writer,
|
||||
char const * key,
|
||||
int value);
|
||||
|
||||
extern void
|
||||
wfp_impl_message_writer_add_string(
|
||||
struct wfp_message_writer * writer,
|
||||
char const * key,
|
||||
char const * value);
|
||||
|
||||
extern void
|
||||
wfp_impl_message_writer_add_bytes(
|
||||
struct wfp_message_writer * writer,
|
||||
char const * key,
|
||||
char const * data,
|
||||
size_t length);
|
||||
|
||||
extern void
|
||||
wfp_impl_message_writer_add_dirbuffer(
|
||||
struct wfp_message_writer * writer,
|
||||
struct wfp_dirbuffer * dirbuffer);
|
||||
|
||||
extern void
|
||||
wfp_impl_message_writer_set_error(
|
||||
struct wfp_message_writer * writer,
|
||||
int code);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif
|
Loading…
Reference in new issue