/// <summary> /// Reads string-literal(stores it to reader 'r') and continuing fetch line. /// </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 ReadStringLiteral(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"); } if(r.SourceString.EndsWith("}") && r.SourceString.IndexOf("{") > -1){ MemoryStream stream = new MemoryStream(); string size = r.SourceString.Substring(r.SourceString.LastIndexOf("{") + 1,r.SourceString.Length - r.SourceString.LastIndexOf("{") - 2); // Remove {n} from string. r.RemoveFromEnd(r.SourceString.Length - r.SourceString.LastIndexOf('{')); IMAP_Client.ReadStringLiteralAsyncOP op = new IMAP_Client.ReadStringLiteralAsyncOP(stream,Convert.ToInt32(size)); op.CompletedAsync += delegate(object sender,EventArgs<IMAP_Client.ReadStringLiteralAsyncOP> e){ try{ // Read string literal failed. if(op.Error != null){ callback(this,new EventArgs<Exception>(op.Error)); } else{ // Append string-literal to fetch reader. r.AppendString(TextUtils.QuoteString(Encoding.UTF8.GetString(stream.ToArray()))); // Read next fetch line completed synchronously. if(!ReadNextFetchLine(imap,r,callback)){ ParseDataItems(imap,r,callback); } } } catch(Exception x){ callback(this,new EventArgs<Exception>(x)); } finally{ op.Dispose(); } }; // Read string literal completed sync. if(!imap.ReadStringLiteralAsync(op)){ try{ // Read string literal failed. if(op.Error != null){ callback(this,new EventArgs<Exception>(op.Error)); return true; } else{ // Append string-literal to fetch reader. r.AppendString(TextUtils.QuoteString(Encoding.UTF8.GetString(stream.ToArray()))); return ReadNextFetchLine(imap,r,callback); } } finally{ op.Dispose(); } } // Read string literal completed async. else{ return true; } } else{ throw new ParseException("No string-literal available '" + r.SourceString + "'."); } }
/// <summary> /// Reads IMAP string(string-literal,quoted-string,NIL) and remaining FETCH line if needed. /// </summary> /// <param name="imap">IMAP client.</param> /// <param name="r">Fetch line reader.</param> /// <param name="callback">Fetch completion callback.</param> /// <param name="stream">Stream where to store readed data.</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>,<b>callback</b> or <b>stream</b> is null reference.</exception> private bool ReadData(IMAP_Client imap,StringReader r,EventHandler<EventArgs<Exception>> callback,Stream stream) { if(imap == null){ throw new ArgumentNullException("imap"); } if(r == null){ throw new ArgumentNullException("r"); } if(callback == null){ throw new ArgumentNullException("callback"); } if(stream == null){ throw new ArgumentNullException("stream"); } r.ReadToFirstChar(); // We don't have data. if(r.StartsWith("NIL",false)){ // Eat NIL. r.ReadWord(); return false; } // Data value is returned as string-literal. else if(r.StartsWith("{",false)){ IMAP_Client.ReadStringLiteralAsyncOP op = new IMAP_Client.ReadStringLiteralAsyncOP(stream,Convert.ToInt32(r.ReadParenthesized())); op.CompletedAsync += delegate(object sender,EventArgs<IMAP_Client.ReadStringLiteralAsyncOP> e){ try{ // Read string literal failed. if(op.Error != null){ callback(this,new EventArgs<Exception>(op.Error)); } else{ // Read next fetch line completed synchronously. if(!ReadNextFetchLine(imap,r,callback)){ ParseDataItems(imap,r,callback); } } } catch(Exception x){ callback(this,new EventArgs<Exception>(x)); } finally{ op.Dispose(); } }; // Read string literal completed sync. if(!imap.ReadStringLiteralAsync(op)){ try{ // Read string literal failed. if(op.Error != null){ callback(this,new EventArgs<Exception>(op.Error)); return true; } else{ // Read next fetch line completed synchronously. if(!ReadNextFetchLine(imap,r,callback)){ return false; } else{ return true; } } } finally{ op.Dispose(); } } // Read string literal completed async. else{ return true; } } // Data is quoted-string. else{ byte[] data = Encoding.UTF8.GetBytes(r.ReadWord()); stream.Write(data,0,data.Length); return false; } }