//Yuck, this algorithm is kind of slow... bool ezSockets::ReadLine( MString & str ) { if ( mode != skGeneral ) return false; str = ""; ReceiveGeneralData(); ezSocketsPacket * tmp = pDataInHead; bool bFound = false; int i = 0; while ( tmp ) { for ( i = tmp->Position; i < (int)(tmp->PositionTAG); i++ ) if ( tmp->Data[i] == '\n' ) { bFound = true; break; } if ( !bFound ) tmp = tmp->Next; else break; } if ( !bFound && !bBlocking ) return false; if ( bFound ) while ( pDataInHead != tmp ) { str.append( pDataInHead->Data, pDataInHead->Size-pDataInHead->Position ); pDataInHead = pDataInHead->Next; } if ( pDataInHead ) if ( i != pDataInHead->Position ) { str.append( pDataInHead->Data + pDataInHead->Position, i - pDataInHead->Position ); pDataInHead->Position = i + 1; } //Keep waiting for more data if ( !bFound && bBlocking ) { if ( pDataInHead ) pDataInHead->Position = pDataInHead->PositionTAG; char tmp = '\0'; while ( tmp != '\n' ) { if ( ReadLeftover( &tmp, 1 ) != 1 ) return false; if ( tmp != '\n' ) str.append( &tmp, 1 ); } } if ( str.length() > 0 ) if ( str.c_str()[str.length()-1] == '\r' ) str.resize ( str.length() - 1 ); return true; }