Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/ambrop72/badvpn.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
path: root/flow
diff options
context:
space:
mode:
authorambrop7 <ambrop7@1a93d707-3861-5ebc-ad3b-9740d49b5140>2011-05-17 13:48:14 +0400
committerambrop7 <ambrop7@1a93d707-3861-5ebc-ad3b-9740d49b5140>2011-05-17 13:48:14 +0400
commit753bccc38b0f0f40d215656ee69e7136a0ae2c2a (patch)
tree64d2186ec05eb3c0fef4811bba997fdb89c25c50 /flow
parent37b952b940192ddcd0bf633e747f0460ff22b058 (diff)
flow: add SingleStreamReceiver
Diffstat (limited to 'flow')
-rw-r--r--flow/SingleStreamReceiver.c75
-rw-r--r--flow/SingleStreamReceiver.h46
2 files changed, 121 insertions, 0 deletions
diff --git a/flow/SingleStreamReceiver.c b/flow/SingleStreamReceiver.c
new file mode 100644
index 0000000..463aedf
--- /dev/null
+++ b/flow/SingleStreamReceiver.c
@@ -0,0 +1,75 @@
+/**
+ * @file SingleStreamReceiver.c
+ * @author Ambroz Bizjak <ambrop7@gmail.com>
+ *
+ * @section LICENSE
+ *
+ * This file is part of BadVPN.
+ *
+ * BadVPN is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2
+ * as published by the Free Software Foundation.
+ *
+ * BadVPN is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+ */
+
+#include <misc/debug.h>
+
+#include "SingleStreamReceiver.h"
+
+static void input_handler_done (SingleStreamReceiver *o, int data_len)
+{
+ DebugObject_Access(&o->d_obj);
+ ASSERT(data_len > 0)
+ ASSERT(data_len <= o->packet_len - o->pos)
+
+ // update position
+ o->pos += data_len;
+
+ // if everything was received, notify user
+ if (o->pos == o->packet_len) {
+ DEBUGERROR(&o->d_err, o->handler(o->user));
+ return;
+ }
+
+ // receive more
+ StreamRecvInterface_Receiver_Recv(o->input, o->packet + o->pos, o->packet_len - o->pos);
+}
+
+void SingleStreamReceiver_Init (SingleStreamReceiver *o, uint8_t *packet, int packet_len, StreamRecvInterface *input, BPendingGroup *pg, void *user, SingleStreamReceiver_handler handler)
+{
+ ASSERT(packet_len > 0)
+ ASSERT(handler)
+
+ // init arguments
+ o->packet = packet;
+ o->packet_len = packet_len;
+ o->input = input;
+ o->user = user;
+ o->handler = handler;
+
+ // set position zero
+ o->pos = 0;
+
+ // init output
+ StreamRecvInterface_Receiver_Init(o->input, (StreamRecvInterface_handler_done)input_handler_done, o);
+
+ // start receiving
+ StreamRecvInterface_Receiver_Recv(o->input, o->packet + o->pos, o->packet_len - o->pos);
+
+ DebugError_Init(&o->d_err, pg);
+ DebugObject_Init(&o->d_obj);
+}
+
+void SingleStreamReceiver_Free (SingleStreamReceiver *o)
+{
+ DebugObject_Free(&o->d_obj);
+ DebugError_Free(&o->d_err);
+}
diff --git a/flow/SingleStreamReceiver.h b/flow/SingleStreamReceiver.h
new file mode 100644
index 0000000..2ad2e33
--- /dev/null
+++ b/flow/SingleStreamReceiver.h
@@ -0,0 +1,46 @@
+/**
+ * @file SingleStreamReceiver.h
+ * @author Ambroz Bizjak <ambrop7@gmail.com>
+ *
+ * @section LICENSE
+ *
+ * This file is part of BadVPN.
+ *
+ * BadVPN is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2
+ * as published by the Free Software Foundation.
+ *
+ * BadVPN is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+ */
+
+#ifndef BADVPN_SINGLESTREAMRECEIVER_H
+#define BADVPN_SINGLESTREAMRECEIVER_H
+
+#include <misc/debugerror.h>
+#include <base/DebugObject.h>
+#include <flow/StreamRecvInterface.h>
+
+typedef void (*SingleStreamReceiver_handler) (void *user);
+
+typedef struct {
+ uint8_t *packet;
+ int packet_len;
+ StreamRecvInterface *input;
+ void *user;
+ SingleStreamReceiver_handler handler;
+ int pos;
+ DebugError d_err;
+ DebugObject d_obj;
+} SingleStreamReceiver;
+
+void SingleStreamReceiver_Init (SingleStreamReceiver *o, uint8_t *packet, int packet_len, StreamRecvInterface *input, BPendingGroup *pg, void *user, SingleStreamReceiver_handler handler);
+void SingleStreamReceiver_Free (SingleStreamReceiver *o);
+
+#endif