blob: 3a39bd00efa1348675e46bb23e348a045da2bab8 [file] [log] [blame]
Junxiao Shi160701a2016-08-30 11:35:25 +00001/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
Ashlesh Gawandee84d1eb2018-01-04 20:46:44 -06002/*
3 * Copyright (c) 2013-2018 Regents of the University of California.
Junxiao Shi160701a2016-08-30 11:35:25 +00004 *
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 "io.hpp"
23#include "../encoding/buffer-stream.hpp"
24#include "../security/transform.hpp"
25
26namespace ndn {
27namespace io {
28
29optional<Block>
30loadBlock(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;
Junxiao Shi4ce0bcf2016-09-03 07:09:03 +000040 case BASE64:
41 t::streamSource(is) >> t::stripSpace("\n") >> t::base64Decode(false) >> t::streamSink(os);
Junxiao Shi160701a2016-08-30 11:35:25 +000042 break;
43 case HEX:
44 t::streamSource(is) >> t::hexDecode() >> t::streamSink(os);
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 }
Ashlesh Gawandee84d1eb2018-01-04 20:46:44 -060060 catch (const std::invalid_argument&) {
61 return nullopt;
62 }
Junxiao Shi160701a2016-08-30 11:35:25 +000063}
64
65void
66saveBlock(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;
Junxiao Shi4ce0bcf2016-09-03 07:09:03 +000075 case BASE64:
Junxiao Shi160701a2016-08-30 11:35:25 +000076 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 BOOST_THROW_EXCEPTION(Error("unrecognized IoEncoding"));
83 }
84 }
85 catch (const t::Error& e) {
86 BOOST_THROW_EXCEPTION(Error(e.what()));
87 }
88}
89
90} // namespace io
91} // namespace ndn