Squashed 'third_party/rawrtc/rawrtc-common/' content from commit aff7a3a3b

Change-Id: I2cb019410e8d0e1e0bf814577b0ef83aeb32c7fd
git-subtree-dir: third_party/rawrtc/rawrtc-common
git-subtree-split: aff7a3a3b9bbf49f7d2fc8b123edd301825b3e1c
diff --git a/include/rawrtcc/message_buffer.h b/include/rawrtcc/message_buffer.h
new file mode 100644
index 0000000..2385770
--- /dev/null
+++ b/include/rawrtcc/message_buffer.h
@@ -0,0 +1,27 @@
+#pragma once
+#include "code.h"
+#include <re.h>
+
+/// Handler for buffered messages.
+///
+/// Return `true` if the message has been handled successfully and can
+/// be unlinked, `false` to stop processing messages and keep the current
+/// message in the list.
+typedef bool(rawrtc_message_buffer_handler)(
+    struct mbuf* const buffer, void* const context, void* const arg);
+
+/// Create a message buffer and add it to a list.
+enum rawrtc_code rawrtc_message_buffer_append(
+    struct list* const message_buffer,
+    struct mbuf* const buffer,  // referenced
+    void* const context  // referenced, nullable
+);
+
+/// Apply a receive handler to buffered messages.
+///
+/// Will stop iterating and return `RAWRTC_CODE_STOP_ITERATION` in case
+/// the message handler returned `false`.
+enum rawrtc_code rawrtc_message_buffer_clear(
+    struct list* const message_buffer,
+    rawrtc_message_buffer_handler* const message_handler,
+    void* arg);