1 /*
2  * Copyright (C) 2009-2012 Codership Oy <info@codership.com>
3  */
4 
5 /*!
6  * @file transport.hpp
7  *
8  * @brief Transport interface.
9  */
10 
11 #ifndef _GCOMM_TRANSPORT_HPP_
12 #define _GCOMM_TRANSPORT_HPP_
13 
14 #include "gcomm/uuid.hpp"
15 #include "gcomm/protolay.hpp"
16 #include "gcomm/protostack.hpp"
17 #include "gcomm/protonet.hpp"
18 
19 #include "gu_uri.hpp"
20 
21 namespace gcomm
22 {
23     /*!
24      * @class Transport
25      *
26      * @brief Transport interface
27      */
28     class Transport;
29 }
30 
31 /*!
32  *
33  */
34 class gcomm::Transport : public Protolay
35 {
36 public:
37     virtual ~Transport();
38 
39     virtual size_t      mtu()           const = 0;
40     virtual const UUID& uuid()          const = 0;
41     virtual std::string local_addr()    const;
42     virtual std::string remote_addr()   const;
43 
44     int                 err_no()        const;
45 
connect(bool start_prim)46     virtual void connect(bool start_prim)
47     {
48         gu_throw_fatal << "connect(start_prim) not supported";
49     }
connect()50     virtual void connect() // if not overloaded, will default to connect(bool)
51     {
52         connect(false);
53     }
connect(const gu::URI & uri)54     virtual void connect(const gu::URI& uri)
55     {
56         gu_throw_fatal << "connect(URI) not supported";
57     }
58 
59     virtual void close(bool force = false) = 0;
close(const UUID & uuid)60     virtual void close(const UUID& uuid)
61     {
62         gu_throw_error(ENOTSUP) << "close(UUID) not supported by "
63                                 << uri_.get_scheme();
64     }
65 
66     virtual void        listen();
67     // Get configured listen addr. For test purposes only.
configured_listen_addr() const68     virtual std::string configured_listen_addr() const
69     {
70         gu_throw_fatal << "not supported";
71     }
listen_addr() const72     virtual std::string listen_addr() const
73     {
74         gu_throw_fatal << "not supported";
75     }
76     virtual Transport*  accept();
handle_accept(Transport *)77     virtual void handle_accept(Transport*)
78     {
79         gu_throw_error(ENOTSUP) << "handle_accept() not supported by"
80                                 << uri_.get_scheme();
81     }
handle_connect()82     virtual void handle_connect()
83     {
84         gu_throw_error(ENOTSUP) << "handle_connect() not supported by"
85                                 << uri_.get_scheme();
86     }
87 
88     virtual int  handle_down(Datagram&, const ProtoDownMeta&) = 0;
89     virtual void handle_up  (const void*, const Datagram&, const ProtoUpMeta&) = 0;
handle_stable_view(const View & view)90     virtual void handle_stable_view(const View& view) { }
pstack()91     Protostack& pstack() { return pstack_; }
pnet()92     Protonet&   pnet()   { return pnet_; }
93 
94     static Transport* create(Protonet&, const std::string&);
95     static Transport* create(Protonet&, const gu::URI&);
96 
97 protected:
98     Transport (Protonet&, const gu::URI&);
99     Protostack        pstack_;
100     Protonet&         pnet_;
101     gu::URI           uri_;
102     int               error_no_;
103 
104 private:
105     Transport (const Transport&);
106     Transport& operator=(const Transport&);
107 };
108 
109 
110 
111 #endif // _GCOMM_TRANSPORT_HPP_
112