io.cpp
Go to the documentation of this file.
1 /* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
22 #include "io.hpp"
23 #include "../encoding/buffer-stream.hpp"
24 #include "../security/transform.hpp"
25 
26 namespace ndn {
27 namespace io {
28 
30 loadBlock(std::istream& is, IoEncoding encoding)
31 {
32  namespace t = ndn::security::transform;
33 
34  OBufferStream os;
35  try {
36  switch (encoding) {
37  case NO_ENCODING:
38  t::streamSource(is) >> t::streamSink(os);
39  break;
40  case BASE64:
41  t::streamSource(is) >> t::stripSpace("\n") >> t::base64Decode(false) >> t::streamSink(os);
42  break;
43  case HEX:
45  break;
46  default:
47  return nullopt;
48  }
49  }
50  catch (const t::Error&) {
51  return nullopt;
52  }
53 
54  try {
55  return make_optional<Block>(os.buf());
56  }
57  catch (const tlv::Error&) {
58  return nullopt;
59  }
60 }
61 
62 void
63 saveBlock(const Block& block, std::ostream& os, IoEncoding encoding)
64 {
65  namespace t = ndn::security::transform;
66 
67  try {
68  switch (encoding) {
69  case NO_ENCODING:
70  t::bufferSource(block.wire(), block.size()) >> t::streamSink(os);
71  break;
72  case BASE64:
73  t::bufferSource(block.wire(), block.size()) >> t::base64Encode() >> t::streamSink(os);
74  break;
75  case HEX:
76  t::bufferSource(block.wire(), block.size()) >> t::hexEncode(true) >> t::streamSink(os);
77  break;
78  default:
79  BOOST_THROW_EXCEPTION(Error("unrecognized IoEncoding"));
80  }
81  }
82  catch (const t::Error& e) {
83  BOOST_THROW_EXCEPTION(Error(e.what()));
84  }
85 }
86 
87 } // namespace io
88 } // namespace ndn
optional< Block > loadBlock(std::istream &is, IoEncoding encoding)
loads a TLV block from a stream
Definition: io.cpp:30
constexpr nullopt_t nullopt
void saveBlock(const Block &block, std::ostream &os, IoEncoding encoding)
saves a TLV block to a stream
Definition: io.cpp:63
Copyright (c) 2013-2017 Regents of the University of California.
Definition: common.hpp:66
unique_ptr< Transform > base64Decode(bool expectNewlineEvery64Bytes)
unique_ptr< Transform > hexEncode(bool useUpperCase)
Definition: hex-encode.cpp:69
Represents a TLV element of NDN packet format.
Definition: block.hpp:42
unique_ptr< Transform > stripSpace(const char *whitespaces)
constructs a StripSpace transform
Definition: strip-space.cpp:55
size_t size() const
Get size of encoded wire, including Type-Length-Value.
Definition: block.cpp:299
hexadecimal encoding
Definition: io.hpp:61
binary without encoding
Definition: io.hpp:48
unique_ptr< Sink > streamSink(std::ostream &os)
Definition: stream-sink.cpp:53
unique_ptr< Transform > hexDecode()
Definition: hex-decode.cpp:111
shared_ptr< Buffer > buf()
Flush written data to the stream and return shared pointer to the underlying buffer.
const uint8_t * wire() const
Get pointer to encoded wire.
Definition: block.cpp:290
implements an output stream that constructs ndn::Buffer
base64 encoding
Definition: io.hpp:55
represents an error in TLV encoding or decoding
unique_ptr< Transform > base64Encode(bool needBreak)
IoEncoding
indicates how a file or stream is encoded
Definition: io.hpp:45