blob: e376b77bd062800c947a737a25fbad763c5015e5 [file] [log] [blame]
Jeff Thompson68192a32013-10-17 17:34:17 -07001/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil -*- */
2/**
3 * Copyright (C) 2013 Regents of the University of California.
Jeff Thompsone37aa212013-10-17 17:53:23 -07004 * @author: Alexander Afanasyev <alexander.afanasyev@ucla.edu>
Jeff Thompson68192a32013-10-17 17:34:17 -07005 * @author: Jeff Thompson <jefft0@remap.ucla.edu>
6 * See COPYING for copyright and distribution information.
7 */
8
9#ifndef NDN_BLOB_STREAM_HPP
10#define NDN_BLOB_STREAM_HPP
11
Alexander Afanasyev8e96e582013-11-19 12:07:04 -080012#include <ndn-cpp/common.hpp>
13
14#if NDN_CPP_USE_SYSTEM_BOOST
15#include <boost/iostreams/detail/ios.hpp>
16#include <boost/iostreams/categories.hpp>
17#include <boost/iostreams/stream.hpp>
18namespace ndnboost = boost;
19#else
Jeff Thompson68192a32013-10-17 17:34:17 -070020// We can use ndnboost::iostreams because this is internal and will not conflict with the application if it uses boost::iostreams.
21#include <ndnboost/iostreams/detail/ios.hpp>
22#include <ndnboost/iostreams/categories.hpp>
23#include <ndnboost/iostreams/stream.hpp>
Alexander Afanasyev8e96e582013-11-19 12:07:04 -080024#endif
Jeff Thompson68192a32013-10-17 17:34:17 -070025
26namespace ndn {
27
28class blob_append_device {
29public:
30 typedef char char_type;
31 typedef ndnboost::iostreams::sink_tag category;
32
33 blob_append_device(std::vector<uint8_t>& container)
34 : container_(container)
35 {
36 }
37
38 std::streamsize
39 write(const char_type* s, std::streamsize n)
40 {
41 std::copy(s, s+n, std::back_inserter(container_));
42 return n;
43 }
44
45protected:
46 std::vector<uint8_t>& container_;
47};
48
49/**
50 * This is called "blob_stream" but it doesn't use an ndn::Blob which is immutable. It uses a pointer to a vector<uint8_t>.
51 * This is inteded for internal library use, not exported in the API.
52 */
53struct blob_stream : public ndnboost::iostreams::stream<blob_append_device>
54{
55 blob_stream()
56 : buffer_(new std::vector<uint8_t>())
57 , device_(*buffer_)
58 {
59 open(device_);
60 }
61
62 ptr_lib::shared_ptr<std::vector<uint8_t> >
63 buf()
64 {
65 flush();
66 return buffer_;
67 }
68
69private:
70 ptr_lib::shared_ptr<std::vector<uint8_t> > buffer_;
71 blob_append_device device_;
72};
73
74}
75
76#endif