blob: eda95216f30de45d77444c59e4deceb248574c16 [file] [log] [blame]
Jeff Thompson25b4e612013-10-10 16:03:24 -07001/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil -*- */
Jeff Thompsonfcf347d2013-07-15 11:30:44 -07002/**
Jeff Thompson7687dc02013-09-13 11:54:07 -07003 * Copyright (C) 2013 Regents of the University of California.
Jeff Thompsonfcf347d2013-07-15 11:30:44 -07004 * See COPYING for copyright and distribution information.
5 */
6
Alexander Afanasyev5964fb72014-02-18 12:42:45 -08007#ifndef NDN_TRANSPORT_TRANSPORT_HPP
8#define NDN_TRANSPORT_TRANSPORT_HPP
Jeff Thompsonfcf347d2013-07-15 11:30:44 -07009
Alexander Afanasyev19508852014-01-29 01:01:51 -080010#include "../common.hpp"
Alexander Afanasyeve2dcdfd2014-02-07 15:53:28 -080011#include "../encoding/block.hpp"
Jeff Thompsonb605b5d2013-07-30 15:12:56 -070012
Jeff Thompsonfcf347d2013-07-15 11:30:44 -070013namespace ndn {
Jeff Thompson0cb7aee2013-07-16 16:18:06 -070014
Alexander Afanasyev2a7f7202014-04-23 14:25:29 -070015class Transport
16{
Jeff Thompsonfcf347d2013-07-15 11:30:44 -070017public:
Steve DiBenedettoc07b3a22014-03-19 12:32:52 -060018 class Error : public std::runtime_error
19 {
20 public:
Alexander Afanasyevfdbfc6d2014-04-14 15:12:11 -070021 inline Error(const boost::system::error_code& code, const std::string& msg);
Steve DiBenedettoc07b3a22014-03-19 12:32:52 -060022 inline Error(const std::string& msg);
23 };
Alexander Afanasyevfdbfc6d2014-04-14 15:12:11 -070024
25 typedef ptr_lib::function<void (const Block& wire)> ReceiveCallback;
Alexander Afanasyeva557d5a2013-12-28 21:59:03 -080026 typedef ptr_lib::function<void ()> ErrorCallback;
Alexander Afanasyevfdbfc6d2014-04-14 15:12:11 -070027
Alexander Afanasyeve2e0d752014-01-03 13:30:30 -080028 inline
29 Transport();
Alexander Afanasyevfdbfc6d2014-04-14 15:12:11 -070030
Alexander Afanasyeve2e0d752014-01-03 13:30:30 -080031 inline virtual
32 ~Transport();
33
Jeff Thompson2ed62fb2013-07-16 18:10:30 -070034 /**
Alexander Afanasyeva557d5a2013-12-28 21:59:03 -080035 * Connect transport
36 *
37 * @throws If connection cannot be established
Alexander Afanasyeve2e0d752014-01-03 13:30:30 -080038 */
Alexander Afanasyevfdbfc6d2014-04-14 15:12:11 -070039 inline virtual void
Alexander Afanasyev5964fb72014-02-18 12:42:45 -080040 connect(boost::asio::io_service& io_service,
41 const ReceiveCallback& receiveCallback);
Alexander Afanasyevfdbfc6d2014-04-14 15:12:11 -070042
Alexander Afanasyeve2e0d752014-01-03 13:30:30 -080043 /**
44 * Close the connection.
Jeff Thompson10e34382013-08-22 13:34:46 -070045 */
Alexander Afanasyevfdbfc6d2014-04-14 15:12:11 -070046 virtual void
Alexander Afanasyev52afb3f2014-03-07 09:05:35 +000047 close() = 0;
Alexander Afanasyeve2e0d752014-01-03 13:30:30 -080048
Jeff Thompson432c8be2013-08-09 16:16:08 -070049 /**
Alexander Afanasyev5964fb72014-02-18 12:42:45 -080050 * @brief Set data to the host
51 *
Jeff Thompson432c8be2013-08-09 16:16:08 -070052 * @param data A pointer to the buffer of data to send.
53 * @param dataLength The number of bytes in data.
54 */
Alexander Afanasyevfdbfc6d2014-04-14 15:12:11 -070055 virtual void
Alexander Afanasyev52afb3f2014-03-07 09:05:35 +000056 send(const Block& wire) = 0;
Jeff Thompson7098dd62013-08-06 14:42:02 -070057
Alexander Afanasyev5964fb72014-02-18 12:42:45 -080058 /**
59 * @brief Alternative version of sending data, applying scatter/gather I/O concept
60 *
61 * Two non-consecutive memory blocks will be send out together, e.g., as part of the
62 * same message in datagram-oriented transports.
63 */
Alexander Afanasyevfdbfc6d2014-04-14 15:12:11 -070064 virtual void
Alexander Afanasyev52afb3f2014-03-07 09:05:35 +000065 send(const Block& header, const Block& payload) = 0;
66
67 virtual void
68 pause() = 0;
69
70 virtual void
71 resume() = 0;
Alexander Afanasyevfdbfc6d2014-04-14 15:12:11 -070072
73 inline bool
Alexander Afanasyeve2e0d752014-01-03 13:30:30 -080074 isConnected();
75
Alexander Afanasyev52afb3f2014-03-07 09:05:35 +000076 inline bool
77 isExpectingData();
78
Alexander Afanasyeve2e0d752014-01-03 13:30:30 -080079protected:
80 inline void
Alexander Afanasyev5964fb72014-02-18 12:42:45 -080081 receive(const Block& wire);
Alexander Afanasyevfdbfc6d2014-04-14 15:12:11 -070082
Alexander Afanasyeve2e0d752014-01-03 13:30:30 -080083protected:
Alexander Afanasyev5964fb72014-02-18 12:42:45 -080084 boost::asio::io_service* m_ioService;
85 bool m_isConnected;
Alexander Afanasyev52afb3f2014-03-07 09:05:35 +000086 bool m_isExpectingData;
Alexander Afanasyev5964fb72014-02-18 12:42:45 -080087 ReceiveCallback m_receiveCallback;
Jeff Thompsonfcf347d2013-07-15 11:30:44 -070088};
89
Alexander Afanasyeve2e0d752014-01-03 13:30:30 -080090inline
91Transport::Transport()
Alexander Afanasyev5964fb72014-02-18 12:42:45 -080092 : m_ioService(0)
93 , m_isConnected(false)
Alexander Afanasyev52afb3f2014-03-07 09:05:35 +000094 , m_isExpectingData(false)
Alexander Afanasyeve2e0d752014-01-03 13:30:30 -080095{
96}
97
Steve DiBenedettoc07b3a22014-03-19 12:32:52 -060098inline
99Transport::Error::Error(const boost::system::error_code& code, const std::string& msg)
Alexander Afanasyev3ae2da22013-12-29 15:50:04 -0800100 : std::runtime_error(msg + (code.value() ? " (" + code.category().message(code.value()) + ")" : ""))
101{
102}
103
Alexander Afanasyeve2e0d752014-01-03 13:30:30 -0800104inline
Steve DiBenedettoc07b3a22014-03-19 12:32:52 -0600105Transport::Error::Error(const std::string& msg)
106 : std::runtime_error(msg)
107{
108}
109
110inline
Alexander Afanasyeve2e0d752014-01-03 13:30:30 -0800111Transport::~Transport()
112{
113}
114
Alexander Afanasyevfdbfc6d2014-04-14 15:12:11 -0700115inline void
Alexander Afanasyev5964fb72014-02-18 12:42:45 -0800116Transport::connect(boost::asio::io_service& ioService,
117 const ReceiveCallback& receiveCallback)
Alexander Afanasyeve2e0d752014-01-03 13:30:30 -0800118{
Alexander Afanasyev5964fb72014-02-18 12:42:45 -0800119 m_ioService = &ioService;
120 m_receiveCallback = receiveCallback;
Alexander Afanasyeve2e0d752014-01-03 13:30:30 -0800121}
122
Alexander Afanasyevfdbfc6d2014-04-14 15:12:11 -0700123inline bool
Alexander Afanasyeve2e0d752014-01-03 13:30:30 -0800124Transport::isConnected()
125{
Alexander Afanasyev5964fb72014-02-18 12:42:45 -0800126 return m_isConnected;
Alexander Afanasyeve2e0d752014-01-03 13:30:30 -0800127}
128
Alexander Afanasyev52afb3f2014-03-07 09:05:35 +0000129inline bool
130Transport::isExpectingData()
131{
132 return m_isExpectingData;
133}
134
Alexander Afanasyeve2e0d752014-01-03 13:30:30 -0800135inline void
Alexander Afanasyev5964fb72014-02-18 12:42:45 -0800136Transport::receive(const Block& wire)
Alexander Afanasyeve2e0d752014-01-03 13:30:30 -0800137{
Alexander Afanasyev5964fb72014-02-18 12:42:45 -0800138 m_receiveCallback(wire);
Alexander Afanasyeve2e0d752014-01-03 13:30:30 -0800139}
140
Alexander Afanasyev5964fb72014-02-18 12:42:45 -0800141} // namespace ndn
Jeff Thompsonfcf347d2013-07-15 11:30:44 -0700142
Alexander Afanasyev5964fb72014-02-18 12:42:45 -0800143#endif // NDN_TRANSPORT_TRANSPORT_HPP