diff options
author | Bastian Bloessl <bastian.bloessl@uibk.ac.at> | 2013-05-31 10:57:06 +0200 |
---|---|---|
committer | Johnathan Corgan <johnathan@corganlabs.com> | 2013-10-28 08:42:25 -0700 |
commit | 7b874636db9e214cff863e081d59c3eaa37046fc (patch) | |
tree | 60c14444473ad140e48514896ec41b7b4ed05a6a | |
parent | 883ae8e3bbcaac6402fa07ac9e6c3d37d20fd973 (diff) |
blocks: add append option to file sink
-rw-r--r-- | gr-blocks/grc/blocks_file_sink.xml | 16 | ||||
-rw-r--r-- | gr-blocks/include/gnuradio/blocks/file_sink.h | 4 | ||||
-rw-r--r-- | gr-blocks/include/gnuradio/blocks/file_sink_base.h | 3 | ||||
-rw-r--r-- | gr-blocks/lib/file_sink_base.cc | 14 | ||||
-rw-r--r-- | gr-blocks/lib/file_sink_impl.cc | 8 | ||||
-rw-r--r-- | gr-blocks/lib/file_sink_impl.h | 2 |
6 files changed, 34 insertions, 13 deletions
diff --git a/gr-blocks/grc/blocks_file_sink.xml b/gr-blocks/grc/blocks_file_sink.xml index 75ef86a6b8..ece21fd2ae 100644 --- a/gr-blocks/grc/blocks_file_sink.xml +++ b/gr-blocks/grc/blocks_file_sink.xml @@ -8,7 +8,7 @@ <name>File Sink</name> <key>blocks_file_sink</key> <import>from gnuradio import blocks</import> - <make>blocks.file_sink($type.size*$vlen, $file) + <make>blocks.file_sink($type.size*$vlen, $file, $append) self.$(id).set_unbuffered($unbuffered)</make> <callback>set_unbuffered($unbuffered)</callback> <callback>open($file)</callback> @@ -68,6 +68,20 @@ self.$(id).set_unbuffered($unbuffered)</make> <key>True</key> </option> </param> + <param> + <name>Append file</name> + <key>append</key> + <value>False</value> + <type>bool</type> + <option> + <name>Append</name> + <key>True</key> + </option> + <option> + <name>Overwrite</name> + <key>False</key> + </option> + </param> <check>$vlen > 0</check> <sink> diff --git a/gr-blocks/include/gnuradio/blocks/file_sink.h b/gr-blocks/include/gnuradio/blocks/file_sink.h index c1041683d3..177964682d 100644 --- a/gr-blocks/include/gnuradio/blocks/file_sink.h +++ b/gr-blocks/include/gnuradio/blocks/file_sink.h @@ -45,8 +45,10 @@ namespace gr { * \brief Make a file sink. * \param itemsize size of the input data items. * \param filename name of the file to open and write output to. + * \param append if true, data is appended to the file instead of + * overwriting the initial content. */ - static sptr make(size_t itemsize, const char *filename); + static sptr make(size_t itemsize, const char *filename, bool append=false); }; } /* namespace blocks */ diff --git a/gr-blocks/include/gnuradio/blocks/file_sink_base.h b/gr-blocks/include/gnuradio/blocks/file_sink_base.h index 812da6dfae..253b5ea122 100644 --- a/gr-blocks/include/gnuradio/blocks/file_sink_base.h +++ b/gr-blocks/include/gnuradio/blocks/file_sink_base.h @@ -42,9 +42,10 @@ namespace gr { bool d_is_binary; boost::mutex d_mutex; bool d_unbuffered; + bool d_append; protected: - file_sink_base(const char *filename, bool is_binary); + file_sink_base(const char *filename, bool is_binary, bool append); public: file_sink_base() {} diff --git a/gr-blocks/lib/file_sink_base.cc b/gr-blocks/lib/file_sink_base.cc index 42e2eae528..81bc94f351 100644 --- a/gr-blocks/lib/file_sink_base.cc +++ b/gr-blocks/lib/file_sink_base.cc @@ -53,8 +53,8 @@ namespace gr { namespace blocks { - file_sink_base::file_sink_base(const char *filename, bool is_binary) - : d_fp(0), d_new_fp(0), d_updated(false), d_is_binary(is_binary) + file_sink_base::file_sink_base(const char *filename, bool is_binary, bool append) + : d_fp(0), d_new_fp(0), d_updated(false), d_is_binary(is_binary), d_append(append) { if (!open(filename)) throw std::runtime_error ("can't open file"); @@ -76,9 +76,13 @@ namespace gr { // we use the open system call to get access to the O_LARGEFILE flag. int fd; - if((fd = ::open(filename, - O_WRONLY|O_CREAT|O_TRUNC|OUR_O_LARGEFILE|OUR_O_BINARY, - 0664)) < 0){ + int flags; + if(d_append) { + flags = O_WRONLY|O_CREAT|O_APPEND|OUR_O_LARGEFILE|OUR_O_BINARY; + } else { + flags = O_WRONLY|O_CREAT|O_TRUNC|OUR_O_LARGEFILE|OUR_O_BINARY; + } + if((fd = ::open(filename, flags, 0664)) < 0){ perror(filename); return false; } diff --git a/gr-blocks/lib/file_sink_impl.cc b/gr-blocks/lib/file_sink_impl.cc index e78576e288..ab36dcd4e6 100644 --- a/gr-blocks/lib/file_sink_impl.cc +++ b/gr-blocks/lib/file_sink_impl.cc @@ -32,17 +32,17 @@ namespace gr { namespace blocks { file_sink::sptr - file_sink::make(size_t itemsize, const char *filename) + file_sink::make(size_t itemsize, const char *filename, bool append) { return gnuradio::get_initial_sptr - (new file_sink_impl(itemsize, filename)); + (new file_sink_impl(itemsize, filename, append)); } - file_sink_impl::file_sink_impl(size_t itemsize, const char *filename) + file_sink_impl::file_sink_impl(size_t itemsize, const char *filename, bool append) : sync_block("file_sink", io_signature::make(1, 1, itemsize), io_signature::make(0, 0, 0)), - file_sink_base(filename, true), + file_sink_base(filename, true, append), d_itemsize(itemsize) { } diff --git a/gr-blocks/lib/file_sink_impl.h b/gr-blocks/lib/file_sink_impl.h index f86009419e..9e0c81569b 100644 --- a/gr-blocks/lib/file_sink_impl.h +++ b/gr-blocks/lib/file_sink_impl.h @@ -34,7 +34,7 @@ namespace gr { size_t d_itemsize; public: - file_sink_impl(size_t itemsize, const char *filename); + file_sink_impl(size_t itemsize, const char *filename, bool append=false); ~file_sink_impl(); int work(int noutput_items, |