io.cpp
Go to the documentation of this file.
1 /* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
2 /*
3  * Copyright (c) 2013-2019 Regents of the University of California.
4  *
5  * This file is part of ndn-cxx library (NDN C++ library with eXperimental eXtensions).
6  *
7  * ndn-cxx library is free software: you can redistribute it and/or modify it under the
8  * terms of the GNU Lesser General Public License as published by the Free Software
9  * Foundation, either version 3 of the License, or (at your option) any later version.
10  *
11  * ndn-cxx library is distributed in the hope that it will be useful, but WITHOUT ANY
12  * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A
13  * PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details.
14  *
15  * You should have received copies of the GNU General Public License and GNU Lesser
16  * General Public License along with ndn-cxx, e.g., in COPYING.md file. If not, see
17  * <http://www.gnu.org/licenses/>.
18  *
19  * See AUTHORS.md for complete list of ndn-cxx authors and contributors.
20  */
21 
22 #include "ndn-cxx/util/io.hpp"
25 
26 namespace ndn {
27 namespace io {
28 
29 optional<Block>
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  catch (const std::invalid_argument&) {
61  return nullopt;
62  }
63 }
64 
65 void
66 saveBlock(const Block& block, std::ostream& os, IoEncoding encoding)
67 {
68  namespace t = ndn::security::transform;
69 
70  try {
71  switch (encoding) {
72  case NO_ENCODING:
73  t::bufferSource(block.wire(), block.size()) >> t::streamSink(os);
74  break;
75  case BASE64:
76  t::bufferSource(block.wire(), block.size()) >> t::base64Encode() >> t::streamSink(os);
77  break;
78  case HEX:
79  t::bufferSource(block.wire(), block.size()) >> t::hexEncode(true) >> t::streamSink(os);
80  break;
81  default:
82  NDN_THROW(Error("Unknown IoEncoding " + to_string(encoding)));
83  }
84  }
85  catch (const t::Error&) {
86  NDN_THROW_NESTED(Error("Transform error during save"));
87  }
88 }
89 
90 } // namespace io
91 } // namespace ndn
optional< Block > loadBlock(std::istream &is, IoEncoding encoding)
loads a TLV block from a stream
Definition: io.cpp:30
#define NDN_THROW_NESTED(e)
Definition: exception.hpp:71
void saveBlock(const Block &block, std::ostream &os, IoEncoding encoding)
saves a TLV block to a stream
Definition: io.cpp:66
Definition: data.cpp:26
unique_ptr< Transform > base64Decode(bool expectNewlineEvery64Bytes)
unique_ptr< Transform > hexEncode(bool useUpperCase)
Definition: hex-encode.cpp:70
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
#define NDN_THROW(e)
Definition: exception.hpp:61
size_t size() const
Return the size of the encoded wire, i.e.
Definition: block.cpp:289
hexadecimal encoding
Definition: io.hpp:57
binary without encoding
Definition: io.hpp:44
unique_ptr< Sink > streamSink(std::ostream &os)
Definition: stream-sink.cpp:53
unique_ptr< Transform > hexDecode()
Definition: hex-decode.cpp:114
shared_ptr< Buffer > buf()
Flush written data to the stream and return shared pointer to the underlying buffer.
const uint8_t * wire() const
Return a raw pointer to the beginning of the encoded wire.
Definition: block.cpp:280
implements an output stream that constructs ndn::Buffer
std::string to_string(const V &v)
Definition: backports.hpp:67
base64 encoding
Definition: io.hpp:51
const nullopt_t nullopt((nullopt_t::init()))
represents an error in TLV encoding or decoding
Definition: tlv.hpp:52
unique_ptr< Transform > base64Encode(bool needBreak)
IoEncoding
indicates how a file or stream is encoded
Definition: io.hpp:41