+// 1 success, data avail, 0 need moar data (see that decodeTarget is still 0),
+// -1: fail... connection needs resetting
+int SlipBIO::unmask() {
+#ifdef UNMASK_DEBUG
+ {
+ std::ostringstream conv;
+ conv << "unmasking starting, decodeTarget: " << decodeTarget << " decodePos: " << decodePos << " rawPos: " << rawPos << "bytes stored";
+ logger::note( conv.str() );
+ }
+ logger::note( "unmasking" );
+#endif
+ if( waitForConnection ){
+#ifdef UNMASK_DEBUG
+ logger::note( "scanning for connection" );
+#endif
+ decodeTarget = 0;
+ if( server ) {
+#ifdef UNMASK_DEBUG
+ logger::note( "on server site, waiting for CONNECTION-byte");
+#endif
+ while(decodePos < rawPos) {
+ if(buffer[decodePos] == SLIP_CONNECTION) {
+ resetCounter = 0;
+#ifdef UNMASK_DEBUG
+ logger::note( "got connection byte" );
+#endif
+ } else if(resetCounter >= 0) {
+ header[resetCounter] = buffer[decodePos];
+ resetCounter++;
+ }
+ decodePos++;
+ if( resetCounter >= ((int) header.size()) ){
+ waitForConnection = false;
+ char data[] = { SLIP_CONNECTION };
+ target->write( data, 1);
+#ifdef UNMASK_DEBUG
+ logger::notef( "SLIP, initing connection with ping-seq %s:", toHex(header.data(), header.size()) );
+#endif
+ target->write( header.data(), header.size() );
+ break;
+ }
+ }
+ if( decodePos >= rawPos ){
+ decodePos = 0;
+ rawPos = 0;
+ return 0; // no package
+ }
+
+ } else {
+ while(decodePos < rawPos) {
+ if(buffer[decodePos] == SLIP_CONNECTION) {
+#ifdef UNMASK_DEBUG
+ logger::note( "got connbyte" );
+#endif
+ resetCounter = 0;
+ } else if(resetCounter >= 0) {
+#ifdef UNMASK_DEBUG
+ logger::note( "got head-byte" );
+#endif
+ if(buffer[decodePos] == header[resetCounter]) {
+ resetCounter++;
+ } else {
+ resetCounter = -1;
+ }
+ }
+ decodePos++;
+ if( resetCounter >= ((int) header.size()) ){
+ waitForConnection = false;
+#ifdef UNMASK_DEBUG
+ logger::note("connection found! :-)!");
+#endif
+ break;
+ }
+ }
+ if( decodePos >= rawPos ){
+ rawPos = 0;
+ decodePos = 0;
+ return 0; // no package
+ }
+ }
+ }