/// <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); } }
/// <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; } }
/// <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 + "'."); } }