]> WPIA git - cassiopeia.git/blobdiff - src/io/opensslBIO.cpp
upd: use central position to do line buffering
[cassiopeia.git] / src / io / opensslBIO.cpp
index 03122db2ce738ec04c1df0f5660fc99ac5c26ecd..056c2911f657085a844fe557ddc211029f525187 100644 (file)
@@ -1,6 +1,6 @@
 #include "opensslBIO.h"
 
-OpensslBIOWrapper::OpensslBIOWrapper( std::shared_ptr<BIO> b ) : b( b ) {
+OpensslBIOWrapper::OpensslBIOWrapper( std::shared_ptr<BIO> _b ) : b( _b ), buffer( 2*0xFFFF+20, 0 ), pos(0) {
 }
 
 OpensslBIOWrapper::~OpensslBIOWrapper() {
@@ -29,3 +29,33 @@ int OpensslBIOWrapper::gets( char* str, int size ) {
 const char* OpensslBIOWrapper::getName() {
     return "OpenSSLWrapper";
 }
+#include <log/logger.hpp>
+std::string OpensslBIOWrapper::readLine(){
+    int target = 0;
+    while(1){
+        logger::warn("doing data");
+        while(target < pos){
+            if(buffer[target] == '\n'){
+                target++;
+                std::string res(buffer.data(), 0, target);
+                std::copy(buffer.data() + target, buffer.data() + pos, buffer.data() );
+                pos -= target;
+                logger::warn("emit");
+                return res;
+            }
+            target++;
+        }
+        std::stringstream ss;
+        ss << "target: " << target << ", pos:" << pos;
+        logger::warn(ss.str());
+        int dlen = read(buffer.data() + pos, buffer.size() - pos);
+        if ( dlen <= 0 ){
+            logger::warn(" error! ");
+            throw EOFException();
+        }
+        std::stringstream ss2;
+        ss2 << "done: " << dlen;
+        logger::warn(ss2.str());
+        pos += dlen;
+    }
+}