Add a callback for when messages are added to the database. Abuse it to forward messages semi-live.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@3686 ed5197a5-7fde-0310-b194-c3ffbd925b24
This commit is contained in:
65
src/ssb.c
65
src/ssb.c
@ -94,6 +94,14 @@ typedef struct _tf_ssb_connections_changed_callback_node_t {
|
||||
tf_ssb_connections_changed_callback_node_t* next;
|
||||
} tf_ssb_connections_changed_callback_node_t;
|
||||
|
||||
typedef struct _tf_ssb_message_added_callback_node_t tf_ssb_message_added_callback_node_t;
|
||||
typedef struct _tf_ssb_message_added_callback_node_t {
|
||||
tf_ssb_message_added_callback_t* callback;
|
||||
tf_ssb_callback_cleanup_t* cleanup;
|
||||
void* user_data;
|
||||
tf_ssb_message_added_callback_node_t* next;
|
||||
} tf_ssb_message_added_callback_node_t;
|
||||
|
||||
typedef struct _tf_ssb_blob_want_added_callback_node_t tf_ssb_blob_want_added_callback_node_t;
|
||||
typedef struct _tf_ssb_blob_want_added_callback_node_t {
|
||||
tf_ssb_blob_want_added_callback_t* callback;
|
||||
@ -142,6 +150,7 @@ typedef struct _tf_ssb_t {
|
||||
|
||||
tf_ssb_rpc_callback_node_t* rpc;
|
||||
tf_ssb_connections_changed_callback_node_t* connections_changed;
|
||||
tf_ssb_message_added_callback_node_t* message_added;
|
||||
tf_ssb_blob_want_added_callback_node_t* blob_want_added;
|
||||
tf_ssb_broadcasts_changed_callback_node_t* broadcasts_changed;
|
||||
} tf_ssb_t;
|
||||
@ -1145,6 +1154,8 @@ void tf_ssb_append_message(tf_ssb_t* ssb, JSValue message)
|
||||
printf("Failed to verify message signature.\n");
|
||||
}
|
||||
|
||||
tf_ssb_notify_message_added(ssb, id);
|
||||
|
||||
JS_FreeValue(context, root);
|
||||
}
|
||||
|
||||
@ -1610,6 +1621,16 @@ void tf_ssb_destroy(tf_ssb_t* ssb)
|
||||
}
|
||||
free(node);
|
||||
}
|
||||
while (ssb->message_added)
|
||||
{
|
||||
tf_ssb_message_added_callback_node_t* node = ssb->message_added;
|
||||
ssb->message_added = node->next;
|
||||
if (node->cleanup)
|
||||
{
|
||||
node->cleanup(ssb, node->user_data);
|
||||
}
|
||||
free(node);
|
||||
}
|
||||
while (ssb->blob_want_added)
|
||||
{
|
||||
tf_ssb_blob_want_added_callback_node_t* node = ssb->blob_want_added;
|
||||
@ -2270,6 +2291,50 @@ JSValue tf_ssb_connection_get_object(tf_ssb_connection_t* connection)
|
||||
return connection ? connection->object : JS_UNDEFINED;
|
||||
}
|
||||
|
||||
void tf_ssb_add_message_added_callback(tf_ssb_t* ssb, void (*callback)(tf_ssb_t* ssb, const char* id, void* user_data), void (*cleanup)(tf_ssb_t* ssb, void* user_data), void* user_data)
|
||||
{
|
||||
tf_ssb_message_added_callback_node_t* node = malloc(sizeof(tf_ssb_message_added_callback_node_t));
|
||||
*node = (tf_ssb_message_added_callback_node_t)
|
||||
{
|
||||
.callback = callback,
|
||||
.cleanup = cleanup,
|
||||
.user_data = user_data,
|
||||
.next = ssb->message_added,
|
||||
};
|
||||
ssb->message_added = node;
|
||||
}
|
||||
|
||||
void tf_ssb_remove_message_added_callback(tf_ssb_t* ssb, tf_ssb_message_added_callback_t* callback, void* user_data)
|
||||
{
|
||||
tf_ssb_message_added_callback_node_t** it = &ssb->message_added;
|
||||
while (*it)
|
||||
{
|
||||
if ((*it)->callback == callback &&
|
||||
(*it)->user_data == user_data)
|
||||
{
|
||||
tf_ssb_message_added_callback_node_t* node = *it;
|
||||
*it = node->next;
|
||||
if (node->cleanup)
|
||||
{
|
||||
node->cleanup(ssb, node->user_data);
|
||||
}
|
||||
free(node);
|
||||
}
|
||||
else
|
||||
{
|
||||
*it = (*it)->next;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void tf_ssb_notify_message_added(tf_ssb_t* ssb, const char* id)
|
||||
{
|
||||
for (tf_ssb_message_added_callback_node_t* node = ssb->message_added; node; node = node->next)
|
||||
{
|
||||
node->callback(ssb, id, node->user_data);
|
||||
}
|
||||
}
|
||||
|
||||
void tf_ssb_add_blob_want_added_callback(tf_ssb_t* ssb, void (*callback)(tf_ssb_t* ssb, const char* id, void* user_data), void (*cleanup)(tf_ssb_t* ssb, void* user_data), void* user_data)
|
||||
{
|
||||
tf_ssb_blob_want_added_callback_node_t* node = malloc(sizeof(tf_ssb_blob_want_added_callback_node_t));
|
||||
|
Reference in New Issue
Block a user