static async Task CapaHandler(Pop3Engine engine, Pop3Command pc, string text, bool doAsync) { if (pc.Status != Pop3CommandStatus.Ok) { return; } string response; do { if ((response = await engine.ReadLineAsync(doAsync, pc.CancellationToken).ConfigureAwait(false)) == ".") { break; } int index = response.IndexOf(' '); string token, data; int value; if (index != -1) { token = response.Substring(0, index); while (index < response.Length && char.IsWhiteSpace(response[index])) { index++; } if (index < response.Length) { data = response.Substring(index); } else { data = string.Empty; } } else { data = string.Empty; token = response; } switch (token) { case "EXPIRE": engine.Capabilities |= Pop3Capabilities.Expire; var tokens = data.Split(' '); if (int.TryParse(tokens[0], NumberStyles.None, CultureInfo.InvariantCulture, out value)) { engine.ExpirePolicy = value; } else if (tokens[0] == "NEVER") { engine.ExpirePolicy = -1; } break; case "IMPLEMENTATION": engine.Implementation = data; break; case "LOGIN-DELAY": if (int.TryParse(data, NumberStyles.None, CultureInfo.InvariantCulture, out value)) { engine.Capabilities |= Pop3Capabilities.LoginDelay; engine.LoginDelay = value; } break; case "PIPELINING": engine.Capabilities |= Pop3Capabilities.Pipelining; break; case "RESP-CODES": engine.Capabilities |= Pop3Capabilities.ResponseCodes; break; case "SASL": engine.Capabilities |= Pop3Capabilities.Sasl; foreach (var authmech in data.Split(new [] { ' ' }, StringSplitOptions.RemoveEmptyEntries)) { engine.AuthenticationMechanisms.Add(authmech); } break; case "STLS": engine.Capabilities |= Pop3Capabilities.StartTLS; break; case "TOP": engine.Capabilities |= Pop3Capabilities.Top; break; case "UIDL": engine.Capabilities |= Pop3Capabilities.UIDL; break; case "USER": engine.Capabilities |= Pop3Capabilities.User; break; case "UTF8": engine.Capabilities |= Pop3Capabilities.UTF8; foreach (var item in data.Split(' ')) { if (item == "USER") { engine.Capabilities |= Pop3Capabilities.UTF8User; } } break; case "LANG": engine.Capabilities |= Pop3Capabilities.Lang; break; } } while (true); }
static async Task CapaHandler(Pop3Engine engine, Pop3Command pc, string text, bool doAsync) { if (pc.Status != Pop3CommandStatus.Ok) { return; } string response; do { if ((response = await engine.ReadLineAsync(doAsync, pc.CancellationToken).ConfigureAwait(false)) == ".") { break; } int index = response.IndexOf(' '); int startIndex, length, value; if (index == -1) { index = response.Length; } if (IsCapability("EXPIRE", response, index, true)) { engine.Capabilities |= Pop3Capabilities.Expire; if (ReadNextToken(response, ref index, out startIndex, out length)) { if (IsToken("NEVER", response, startIndex, length)) { engine.ExpirePolicy = -1; } else if (TryParseInt32(response, startIndex, length, out value)) { engine.ExpirePolicy = value; } } } else if (IsCapability("IMPLEMENTATION", response, index, true)) { engine.Implementation = response.Substring(index + 1); } else if (IsCapability("LANG", response, index)) { engine.Capabilities |= Pop3Capabilities.Lang; } else if (IsCapability("LOGIN-DELAY", response, index, true)) { if (ReadNextToken(response, ref index, out startIndex, out length)) { if (TryParseInt32(response, startIndex, length, out value)) { engine.Capabilities |= Pop3Capabilities.LoginDelay; engine.LoginDelay = value; } } } else if (IsCapability("PIPELINING", response, index)) { engine.Capabilities |= Pop3Capabilities.Pipelining; } else if (IsCapability("RESP-CODES", response, index)) { engine.Capabilities |= Pop3Capabilities.ResponseCodes; } else if (IsCapability("SASL", response, index, true)) { engine.Capabilities |= Pop3Capabilities.Sasl; engine.AddAuthenticationMechanisms(response, index); } else if (IsCapability("STLS", response, index)) { engine.Capabilities |= Pop3Capabilities.StartTLS; } else if (IsCapability("TOP", response, index)) { engine.Capabilities |= Pop3Capabilities.Top; } else if (IsCapability("UIDL", response, index)) { engine.Capabilities |= Pop3Capabilities.UIDL; } else if (IsCapability("USER", response, index)) { engine.Capabilities |= Pop3Capabilities.User; } else if (IsCapability("UTF8", response, index, true)) { engine.Capabilities |= Pop3Capabilities.UTF8; while (ReadNextToken(response, ref index, out startIndex, out length)) { if (IsToken("USER", response, startIndex, length)) { engine.Capabilities |= Pop3Capabilities.UTF8User; } } } } while (true); }