diff options
author | ambrop7 <ambrop7@1a93d707-3861-5ebc-ad3b-9740d49b5140> | 2011-05-17 13:48:14 +0400 |
---|---|---|
committer | ambrop7 <ambrop7@1a93d707-3861-5ebc-ad3b-9740d49b5140> | 2011-05-17 13:48:14 +0400 |
commit | 753bccc38b0f0f40d215656ee69e7136a0ae2c2a (patch) | |
tree | 64d2186ec05eb3c0fef4811bba997fdb89c25c50 /flow | |
parent | 37b952b940192ddcd0bf633e747f0460ff22b058 (diff) |
flow: add SingleStreamReceiver
Diffstat (limited to 'flow')
-rw-r--r-- | flow/SingleStreamReceiver.c | 75 | ||||
-rw-r--r-- | flow/SingleStreamReceiver.h | 46 |
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 |