/// <summary> /// Reads next continuing FETCH line and stores to fetch reader 'r'. /// </summary> /// <param name="imap">IMAP client.</param> /// <param name="r">String reader.</param> /// <param name="callback">Fetch completion callback.</param> /// <returns>Returns true if completed asynchronously or false if completed synchronously.</returns> /// <exception cref="ArgumentNullException">Is raised when <b>imap</b>,<b>r</b> or <b>callback</b> is null reference.</exception> private bool ReadNextFetchLine(IMAP_Client imap,StringReader r,EventHandler<EventArgs<Exception>> callback) { if(imap == null){ throw new ArgumentNullException("imap"); } if(r == null){ throw new ArgumentNullException("r"); } if(callback == null){ throw new ArgumentNullException("callback"); } SmartStream.ReadLineAsyncOP readLineOP = new SmartStream.ReadLineAsyncOP(new byte[64000],SizeExceededAction.JunkAndThrowException); readLineOP.Completed += delegate(object sender,EventArgs<SmartStream.ReadLineAsyncOP> e){ try{ // Read line failed. if(readLineOP.Error != null){ callback(this,new EventArgs<Exception>(readLineOP.Error)); } else{ // Log. imap.LogAddRead(readLineOP.BytesInBuffer,readLineOP.LineUtf8); // Append fetch line to fetch reader. r.AppendString(readLineOP.LineUtf8); ParseDataItems(imap,r,callback); } } catch(Exception x){ callback(this,new EventArgs<Exception>(x)); } finally{ readLineOP.Dispose(); } }; // Read line completed synchronously. if(imap.TcpStream.ReadLine(readLineOP,true)){ try{ // Read line failed. if(readLineOP.Error != null){ callback(this,new EventArgs<Exception>(readLineOP.Error)); return true; } else{ // Log. imap.LogAddRead(readLineOP.BytesInBuffer,readLineOP.LineUtf8); // Append fetch line to fetch reader. r.AppendString(readLineOP.LineUtf8); return false; } } finally{ readLineOP.Dispose(); } } return true; }