Merged r4518:5130 from developer branch n4hy/ofdm into trunk, passes distcheck.
[debian/gnuradio] / gnuradio-core / src / lib / io / gr_message_vector_source.cc
1 /* -*- c++ -*- */
2 /*
3  * Copyright 2007 Free Software Foundation, Inc.
4  * 
5  * This file is part of GNU Radio
6  * 
7  * GNU Radio is free software; you can redistribute it and/or modify
8  * it under the terms of the GNU General Public License as published by
9  * the Free Software Foundation; either version 2, or (at your option)
10  * any later version.
11  * 
12  * GNU Radio is distributed in the hope that it will be useful,
13  * but WITHOUT ANY WARRANTY; without even the implied warranty of
14  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15  * GNU General Public License for more details.
16  * 
17  * You should have received a copy of the GNU General Public License
18  * along with GNU Radio; see the file COPYING.  If not, write to
19  * the Free Software Foundation, Inc., 51 Franklin Street,
20  * Boston, MA 02110-1301, USA.
21  */
22
23 #ifdef HAVE_CONFIG_H
24 #include "config.h"
25 #endif
26
27 #include <gr_message_vector_source.h>
28 #include <gr_io_signature.h>
29 #include <cstdio>
30 #include <errno.h>
31 #include <sys/types.h>
32 #include <sys/stat.h>
33 #include <fcntl.h>
34 #include <stdexcept>
35
36
37 // public constructor that returns a shared_ptr
38
39 gr_message_vector_source_sptr
40 gr_make_message_vector_source(size_t max_msg_size, int msgq_limit)
41 {
42   return gr_message_vector_source_sptr(new gr_message_vector_source(max_msg_size,msgq_limit));
43 }
44
45 gr_message_vector_source::gr_message_vector_source (size_t max_msg_size, int msgq_limit)
46   : gr_sync_block("message_vector_source",
47                   gr_make_io_signature(0, 0, 0),
48                   gr_make_io_signature(1, 1, 2*sizeof(int) + max_msg_size * sizeof(char))), // Make room for length fields
49     d_max_msg_size(max_msg_size), d_msgq(gr_make_msg_queue(msgq_limit)), d_eof(false)
50 {
51 }
52
53 gr_message_vector_source::~gr_message_vector_source()
54 {
55 }
56
57 int
58 gr_message_vector_source::work(int noutput_items,
59                                gr_vector_const_void_star &input_items,
60                                gr_vector_void_star &output_items)
61 {
62   /*
63   char *out = (char *) output_items[0];
64
65   if (d_eof)
66       return -1;
67
68   gr_message_sptr msg = d_msgq->delete_head();
69   
70   if (msg->type() == 1) {                  // type == 1 sets EOF
71     d_eof = true;
72   }
73
74   assert(msg->length() <= d_max_msg_size);
75   memset((int*)out, msg->length(), 1);
76   memcpy (&out[4], (msg->msg()), msg->length());
77   */
78
79   char *out = (char *) output_items[0];
80   gr_frame *myframe = (gr_frame*)out;
81
82   if (d_eof)
83       return -1;
84
85   gr_message_sptr msg = d_msgq->delete_head();
86   
87   if (msg->type() == 1) {                  // type == 1 sets EOF
88     d_eof = true;
89   }
90
91   assert(msg->length() <= d_max_msg_size);
92   myframe->length = msg->length();
93   myframe->mtu = d_max_msg_size;
94   memcpy (myframe->data, (msg->msg()), msg->length());
95
96   return 1;
97 }