00001
00002 #ifndef SENDS_SSL_BASE_HH
00003 #define SENDS_SSL_BASE_HH
00004 #include "socket_api.hh"
00005 #include <string>
00006
00007 struct ssl_ctx_st;
00008 struct bio_st;
00009
00010
00011 namespace sends {
00012
00019 class ssl_ctx {
00020 public:
00024 ssl_ctx(void);
00025
00029 virtual ~ssl_ctx(void);
00030
00037 static void error(const std::string& err);
00038
00045 void secure(const std::string& certpath, const std::string& keypath,
00046 const std::string& pass);
00047
00052 bio_st* new_ssl(void);
00053
00058 ssl_ctx_st& ref_ctx(void);
00059 private:
00060 ssl_ctx_st* mCtx;
00061 };
00062
00063
00064 inline ssl_ctx_st&
00065 ssl_ctx::ref_ctx(void) {
00066 return *mCtx;
00067 }
00068
00081 class ssl_bio :public socket_api {
00082 public:
00086 ssl_bio(void);
00087
00093 explicit ssl_bio(ssl_ctx& ctx);
00094
00098 virtual ~ssl_bio(void);
00099
00106 ssl_bio& operator=(ssl_bio& bio);
00107
00113 ssl_bio* accept(void);
00114
00120 sock_err bind(const std::string& port);
00121
00126 sock_err close(void);
00127
00133 sock_err connect(const std::string& peer);
00134
00139 sock_err handshake(void);
00140
00149 sock_err listen(const std::string& port, int lq);
00150
00157 long read_available(char* buffer, long length);
00158
00162 bio_st& ref_bio(void);
00163
00169 bio_st* release(void);
00170
00176 void reset(bio_st* bio);
00177
00182 void set_ssl_mode(long mode);
00183
00189 int socket_id(void) const;
00190
00197 long write(const char* buffer, long length);
00198
00199 private:
00205 ssl_bio(bio_st* bio);
00206
00207 private:
00208 bio_st* mBio;
00209 };
00210
00211
00212 inline bio_st&
00213 ssl_bio::ref_bio(void) {
00214 return *mBio;
00215 }
00216
00217 }
00218
00219 #endif // !defined(SENDS_SSL_BASE_HH)