Ejemplo n.º 1
0
        /// <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);
        }
Ejemplo n.º 2
0
        /// <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 + "'.");
            }
        }