/// <summary> /// Set the quota limits for the folder. /// </summary> /// <remarks> /// <para>Sets the quota limits for the folder.</para> /// <para>To determine if a quotas are supported, check the /// <see cref="ImapClient.SupportsQuotas"/> property.</para> /// </remarks> /// <returns>The folder quota.</returns> /// <param name="messageLimit">If not <c>null</c>, sets the maximum number of messages to allow.</param> /// <param name="storageLimit">If not <c>null</c>, sets the maximum storage size (in kilobytes).</param> /// <param name="cancellationToken">The cancellation token.</param> /// <exception cref="System.ObjectDisposedException"> /// The <see cref="ImapClient"/> has been disposed. /// </exception> /// <exception cref="ServiceNotConnectedException"> /// The <see cref="ImapClient"/> is not connected. /// </exception> /// <exception cref="ServiceNotAuthenticatedException"> /// The <see cref="ImapClient"/> is not authenticated. /// </exception> /// <exception cref="System.NotSupportedException"> /// The IMAP server does not support the QUOTA extension. /// </exception> /// <exception cref="System.OperationCanceledException"> /// The operation was canceled via the cancellation token. /// </exception> /// <exception cref="System.IO.IOException"> /// An I/O error occurred. /// </exception> /// <exception cref="ImapProtocolException"> /// The server's response contained unexpected tokens. /// </exception> /// <exception cref="ImapCommandException"> /// The server replied with a NO or BAD response. /// </exception> public override FolderQuota SetQuota (uint? messageLimit, uint? storageLimit, CancellationToken cancellationToken = default (CancellationToken)) { CheckState (false, false); if ((Engine.Capabilities & ImapCapabilities.Quota) == 0) throw new NotSupportedException ("The IMAP server does not support the QUOTA extension."); var command = new StringBuilder ("SETQUOTA %F ("); if (messageLimit.HasValue) command.AppendFormat ("MESSAGE {0} ", messageLimit.Value); if (storageLimit.HasValue) command.AppendFormat ("STORAGE {0} ", storageLimit.Value); command[command.Length - 1] = ')'; command.Append ("\r\n"); var ic = new ImapCommand (Engine, cancellationToken, null, command.ToString (), this); var ctx = new QuotaContext (); Quota quota; ic.RegisterUntaggedHandler ("QUOTA", UntaggedQuota); ic.UserData = ctx; Engine.QueueCommand (ic); Engine.Wait (ic); ProcessResponseCodes (ic, null); if (ic.Response != ImapCommandResponse.Ok) throw ImapCommandException.Create ("SETQUOTA", ic); if (ctx.Quotas.TryGetValue (EncodedName, out quota)) { return new FolderQuota (this) { CurrentMessageCount = quota.CurrentMessageCount, CurrentStorageSize = quota.CurrentStorageSize, MessageLimit = quota.MessageLimit, StorageLimit = quota.StorageLimit }; } return new FolderQuota (null); }
/// <summary> /// Get the quota information for the folder. /// </summary> /// <remarks> /// <para>Gets the quota information for the folder.</para> /// <para>To determine if a quotas are supported, check the /// <see cref="ImapClient.SupportsQuotas"/> property.</para> /// </remarks> /// <returns>The folder quota.</returns> /// <param name="cancellationToken">The cancellation token.</param> /// <exception cref="System.ObjectDisposedException"> /// The <see cref="ImapClient"/> has been disposed. /// </exception> /// <exception cref="ServiceNotConnectedException"> /// The <see cref="ImapClient"/> is not connected. /// </exception> /// <exception cref="ServiceNotAuthenticatedException"> /// The <see cref="ImapClient"/> is not authenticated. /// </exception> /// <exception cref="System.NotSupportedException"> /// The IMAP server does not support the QUOTA extension. /// </exception> /// <exception cref="System.OperationCanceledException"> /// The operation was canceled via the cancellation token. /// </exception> /// <exception cref="System.IO.IOException"> /// An I/O error occurred. /// </exception> /// <exception cref="ImapProtocolException"> /// The server's response contained unexpected tokens. /// </exception> /// <exception cref="ImapCommandException"> /// The server replied with a NO or BAD response. /// </exception> public override FolderQuota GetQuota (CancellationToken cancellationToken = default (CancellationToken)) { CheckState (false, false); if ((Engine.Capabilities & ImapCapabilities.Quota) == 0) throw new NotSupportedException ("The IMAP server does not support the QUOTA extension."); var ic = new ImapCommand (Engine, cancellationToken, null, "GETQUOTAROOT %F\r\n", this); var ctx = new QuotaContext (); ic.RegisterUntaggedHandler ("QUOTAROOT", UntaggedQuotaRoot); ic.RegisterUntaggedHandler ("QUOTA", UntaggedQuota); ic.UserData = ctx; Engine.QueueCommand (ic); Engine.Wait (ic); ProcessResponseCodes (ic, null); if (ic.Response != ImapCommandResponse.Ok) throw ImapCommandException.Create ("GETQUOTAROOT", ic); for (int i = 0; i < ctx.QuotaRoots.Count; i++) { var encodedName = ctx.QuotaRoots[i]; ImapFolder quotaRoot; Quota quota; if (!ctx.Quotas.TryGetValue (encodedName, out quota)) continue; quotaRoot = Engine.GetQuotaRootFolder (encodedName, cancellationToken); return new FolderQuota (quotaRoot) { CurrentMessageCount = quota.CurrentMessageCount, CurrentStorageSize = quota.CurrentStorageSize, MessageLimit = quota.MessageLimit, StorageLimit = quota.StorageLimit }; } return new FolderQuota (null); }