libiqxmlrpc  0.12.4
 All Classes Namespaces Files Functions Typedefs Enumerations
ssl_connection.h
1 // Libiqxmlrpc - an object-oriented XML-RPC solution.
2 // Copyright (C) 2011 Anton Dedov
3 
4 #ifndef _libiqnet_ssl_connection_
5 #define _libiqnet_ssl_connection_
6 
7 #include "connection.h"
8 #include "conn_factory.h"
9 #include "reactor.h"
10 #include "ssl_lib.h"
11 
12 #include <openssl/ssl.h>
13 
14 namespace iqnet {
15 namespace ssl {
16 
18 class LIBIQXMLRPC_API Connection: public iqnet::Connection {
19 protected:
20  ssl::Ctx* ssl_ctx;
21  SSL *ssl;
22 
23 public:
24  Connection( const Socket& sock );
25  ~Connection();
26 
27  void shutdown();
28  size_t send( const char*, size_t );
29  size_t recv( char*, size_t );
30 
32  void post_accept();
34  void post_connect();
35 
36 protected:
38  virtual void ssl_accept();
40  virtual void ssl_connect();
41 
42  bool shutdown_recved();
43  bool shutdown_sent();
44 };
45 
48 class LIBIQXMLRPC_API Reaction_connection: public ssl::Connection {
49  Reactor_base* reactor;
50 
51  enum State { EMPTY, ACCEPTING, CONNECTING, READING, WRITING, SHUTDOWN };
52  State state;
53 
54  char* recv_buf;
55  const char* send_buf;
56  size_t buf_len;
57 
58 public:
59  Reaction_connection( const Socket&, Reactor_base* = 0 );
60 
62  void set_reactor( Reactor_base* r )
63  {
64  reactor = r;
65  }
66 
67  void post_accept();
68  void post_connect();
69  void handle_input( bool& );
70  void handle_output( bool& );
71 
72 private:
73  void switch_state( bool& terminate );
74  void try_send();
75  size_t try_recv();
76 
77 protected:
78  void ssl_accept();
79  void ssl_connect();
81  bool reg_shutdown();
82  void reg_accept();
83  void reg_connect();
84  void reg_send( const char*, size_t );
85  void reg_recv( char*, size_t );
86 
88  virtual void accept_succeed() {};
90  virtual void connect_succeed() {};
91 
92  virtual void recv_succeed( bool& terminate, size_t req_len, size_t real_len ) = 0;
93  virtual void send_succeed( bool& terminate ) = 0;
94 };
95 
96 } // namespace ssl
97 } // namespace iqnet
98 
99 #endif