]> WPIA git - cassiopeia.git/blob - src/io/opensslBIO.cpp
e175b2cf6d30aefa05e7190eeaa0f93dbcfff9a5
[cassiopeia.git] / src / io / opensslBIO.cpp
1 #include "opensslBIO.h"
2 #include <log/logger.hpp>
3
4 OpensslBIOWrapper::OpensslBIOWrapper( std::shared_ptr<BIO> _b ) : b( _b ), buffer( 2 * 0xFFFF + 20, 0 ), pos( 0 ) {
5 }
6
7 OpensslBIOWrapper::~OpensslBIOWrapper() {
8 }
9
10 int OpensslBIOWrapper::write( const char *buf, int num ) {
11     return BIO_write( b.get(), buf, num );
12 }
13
14 int OpensslBIOWrapper::read( char *buf, int size ) {
15     return BIO_read( b.get(), buf, size );
16 }
17
18 long OpensslBIOWrapper::ctrl( int cmod, long arg1, void *arg2 ) {
19     return BIO_ctrl( b.get(), cmod, arg1, arg2 );
20 }
21
22 int OpensslBIOWrapper::puts( const char *str ) {
23     return BIO_puts( b.get(), str );
24 }
25
26 int OpensslBIOWrapper::gets( char *str, int size ) {
27     return BIO_gets( b.get(), str, size );
28 }
29
30 const char *OpensslBIOWrapper::getName() {
31     return "OpenSSLWrapper";
32 }
33 std::string OpensslBIOWrapper::readLine() {
34     int target = 0;
35
36     while( 1 ) {
37         logger::debug( "doing data" );
38
39         while( target < pos ) {
40             if( buffer[target] == '\n' ) {
41                 target++;
42                 std::string res( buffer.data(), 0, target );
43                 std::copy( buffer.data() + target, buffer.data() + pos, buffer.data() );
44                 pos -= target;
45                 logger::debug( "emit" );
46                 return res;
47             }
48
49             target++;
50         }
51
52         std::stringstream ss;
53         ss << "target: " << target << ", pos:" << pos;
54         logger::debug( ss.str() );
55         int dlen = read( buffer.data() + pos, buffer.size() - pos );
56
57         if( dlen <= 0 ) {
58             throw eof_exception();
59         }
60
61         std::stringstream ss2;
62         ss2 << "done: " << dlen;
63         logger::debug( ss2.str() );
64         pos += dlen;
65     }
66 }