IceWarp fixes and improvements
This commit is contained in:
parent
414414b11d
commit
3feba6e7ec
3 changed files with 287 additions and 192 deletions
|
@ -31,6 +31,7 @@ using System.IO;
|
|||
using System.Net.Mail;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Runtime.InteropServices;
|
||||
using System.Text;
|
||||
using System.Text.RegularExpressions;
|
||||
using Microsoft.Win32;
|
||||
|
@ -38,7 +39,7 @@ using WebsitePanel.Server.Utils;
|
|||
|
||||
namespace WebsitePanel.Providers.Mail
|
||||
{
|
||||
public class IceWarp : HostingServiceProviderBase, IMailServer
|
||||
public class IceWarp : HostingServiceProviderBase, IMailServer, IDisposable
|
||||
{
|
||||
protected const string API_PROGID = "IceWarpServer.APIObject";
|
||||
protected const string DOMAIN_PROGID = "IceWarpServer.DomainObject";
|
||||
|
@ -46,7 +47,7 @@ namespace WebsitePanel.Providers.Mail
|
|||
|
||||
private dynamic _currentApiObject = null;
|
||||
|
||||
#region IceWarp Enums
|
||||
#region Protected Enums
|
||||
|
||||
protected enum IceWarpErrorCode
|
||||
{
|
||||
|
@ -248,6 +249,11 @@ namespace WebsitePanel.Providers.Mail
|
|||
}
|
||||
}
|
||||
|
||||
protected void DisposeObject(object obj)
|
||||
{
|
||||
Marshal.FinalReleaseComObject(obj);
|
||||
}
|
||||
|
||||
protected dynamic GetApiObject()
|
||||
{
|
||||
if (_currentApiObject != null) return _currentApiObject;
|
||||
|
@ -386,6 +392,8 @@ namespace WebsitePanel.Providers.Mail
|
|||
}
|
||||
}
|
||||
|
||||
DisposeObject(accountObject);
|
||||
|
||||
return mailAccounts.ToArray();
|
||||
}
|
||||
|
||||
|
@ -473,6 +481,8 @@ namespace WebsitePanel.Providers.Mail
|
|||
{
|
||||
var itemsDiskspace = new List<ServiceProviderItemDiskSpace>();
|
||||
|
||||
var accountObject = GetAccountObject();
|
||||
|
||||
// update items with diskspace
|
||||
foreach (var item in items.OfType<MailAccount>())
|
||||
{
|
||||
|
@ -480,11 +490,12 @@ namespace WebsitePanel.Providers.Mail
|
|||
{
|
||||
Log.WriteStart(String.Format("Calculating mail account '{0}' size", item.Name));
|
||||
// calculate disk space
|
||||
var accountObject = GetAccountObject(item.Name);
|
||||
accountObject.Open(item.Name);
|
||||
var size = Convert.ToInt64((object)accountObject.GetProperty("U_MailboxSize")) * 1024;
|
||||
|
||||
var diskspace = new ServiceProviderItemDiskSpace { ItemId = item.Id, DiskSpace = size };
|
||||
itemsDiskspace.Add(diskspace);
|
||||
|
||||
Log.WriteEnd(String.Format("Calculating mail account '{0}' size", item.Name));
|
||||
}
|
||||
catch (Exception ex)
|
||||
|
@ -492,6 +503,9 @@ namespace WebsitePanel.Providers.Mail
|
|||
Log.WriteError(ex);
|
||||
}
|
||||
}
|
||||
|
||||
DisposeObject(accountObject);
|
||||
|
||||
return itemsDiskspace.ToArray();
|
||||
}
|
||||
|
||||
|
@ -499,10 +513,10 @@ namespace WebsitePanel.Providers.Mail
|
|||
{
|
||||
var itemsBandwidth = new ServiceProviderItemBandwidth[items.Length];
|
||||
|
||||
// update items with diskspace
|
||||
for (int i = 0; i < items.Length; i++)
|
||||
// update items with bandwidth
|
||||
for (var i = 0; i < items.Length; i++)
|
||||
{
|
||||
ServiceProviderItem item = items[i];
|
||||
var item = items[i];
|
||||
|
||||
// create new bandwidth object
|
||||
itemsBandwidth[i] = new ServiceProviderItemBandwidth
|
||||
|
@ -511,8 +525,8 @@ namespace WebsitePanel.Providers.Mail
|
|||
Days = new DailyStatistics[0]
|
||||
};
|
||||
|
||||
if (item is MailDomain)
|
||||
{
|
||||
if (!(item is MailDomain)) continue;
|
||||
|
||||
try
|
||||
{
|
||||
// get daily statistics
|
||||
|
@ -524,7 +538,6 @@ namespace WebsitePanel.Providers.Mail
|
|||
System.Diagnostics.Debug.WriteLine(ex);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return itemsBandwidth;
|
||||
}
|
||||
|
@ -641,27 +654,29 @@ namespace WebsitePanel.Providers.Mail
|
|||
|
||||
public MailDomain GetDomain(string domainName)
|
||||
{
|
||||
var domain = GetDomainObject(domainName);
|
||||
var domainObject = GetDomainObject(domainName);
|
||||
|
||||
var mailDomain = new MailDomain
|
||||
{
|
||||
Name = domain.Name,
|
||||
PostmasterAccount = domain.GetProperty("D_AdminEmail"),
|
||||
CatchAllAccount = domain.GetProperty("D_UnknownForwardTo"),
|
||||
Enabled = Convert.ToBoolean((object) domain.GetProperty("D_DisableLogin")),
|
||||
MaxDomainSizeInMB = Convert.ToInt32((object) domain.GetProperty("D_DiskQuota"))/1024,
|
||||
MaxDomainUsers = Convert.ToInt32((object) domain.GetProperty("D_AccountNumber")),
|
||||
MegaByteSendLimit = Convert.ToInt32((object) domain.GetProperty("D_VolumeLimit"))/1024,
|
||||
NumberSendLimit = Convert.ToInt32((object) domain.GetProperty("D_NumberLimit")),
|
||||
DefaultUserQuotaInMB = Convert.ToInt32((object) domain.GetProperty("D_UserMailbox"))/1024,
|
||||
DefaultUserMaxMessageSizeMegaByte = Convert.ToInt32((object) domain.GetProperty("D_UserMsg"))/1024,
|
||||
DefaultUserMegaByteSendLimit = Convert.ToInt32((object) domain.GetProperty("D_UserMB")),
|
||||
DefaultUserNumberSendLimit = Convert.ToInt32((object) domain.GetProperty("D_UserNumber")),
|
||||
Name = domainObject.Name,
|
||||
PostmasterAccount = domainObject.GetProperty("D_AdminEmail"),
|
||||
CatchAllAccount = domainObject.GetProperty("D_UnknownForwardTo"),
|
||||
Enabled = Convert.ToBoolean((object)domainObject.GetProperty("D_DisableLogin")),
|
||||
MaxDomainSizeInMB = Convert.ToInt32((object)domainObject.GetProperty("D_DiskQuota")) / 1024,
|
||||
MaxDomainUsers = Convert.ToInt32((object)domainObject.GetProperty("D_AccountNumber")),
|
||||
MegaByteSendLimit = Convert.ToInt32((object)domainObject.GetProperty("D_VolumeLimit")) / 1024,
|
||||
NumberSendLimit = Convert.ToInt32((object)domainObject.GetProperty("D_NumberLimit")),
|
||||
DefaultUserQuotaInMB = Convert.ToInt32((object)domainObject.GetProperty("D_UserMailbox")) / 1024,
|
||||
DefaultUserMaxMessageSizeMegaByte = Convert.ToInt32((object)domainObject.GetProperty("D_UserMsg")) / 1024,
|
||||
DefaultUserMegaByteSendLimit = Convert.ToInt32((object)domainObject.GetProperty("D_UserMB")),
|
||||
DefaultUserNumberSendLimit = Convert.ToInt32((object)domainObject.GetProperty("D_UserNumber")),
|
||||
UseDomainDiskQuota = Convert.ToBoolean(ProviderSettings["UseDomainDiskQuota"]),
|
||||
UseDomainLimits = Convert.ToBoolean(ProviderSettings["UseDomainLimits"]),
|
||||
UseUserLimits = Convert.ToBoolean(ProviderSettings["UseUserLimits"])
|
||||
};
|
||||
|
||||
DisposeObject(domainObject);
|
||||
|
||||
return mailDomain;
|
||||
}
|
||||
|
||||
|
@ -685,6 +700,8 @@ namespace WebsitePanel.Providers.Mail
|
|||
|
||||
SaveDomain(domainObject);
|
||||
|
||||
DisposeObject(domainObject);
|
||||
|
||||
UpdateDomain(domain);
|
||||
}
|
||||
|
||||
|
@ -717,6 +734,8 @@ namespace WebsitePanel.Providers.Mail
|
|||
domainObject.SetProperty("D_UserNumber", domain.DefaultUserNumberSendLimit);
|
||||
|
||||
SaveDomain(domainObject);
|
||||
|
||||
DisposeObject(domainObject);
|
||||
}
|
||||
|
||||
public void DeleteDomain(string domainName)
|
||||
|
@ -732,6 +751,8 @@ namespace WebsitePanel.Providers.Mail
|
|||
{
|
||||
Log.WriteError("Could not delete domain" + GetErrorMessage(domainObject.LastErr), null);
|
||||
}
|
||||
|
||||
DisposeObject(domainObject);
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
@ -747,7 +768,11 @@ namespace WebsitePanel.Providers.Mail
|
|||
|
||||
var domainObject = GetDomainObject(aliasName);
|
||||
|
||||
return Convert.ToInt32((object) domainObject.GetProperty("D_Type")) == 2 && string.Compare(domainObject.GetProperty("D_DomainValue").ToString(), domainName, true) == 0;
|
||||
var result = Convert.ToInt32((object)domainObject.GetProperty("D_Type")) == 2 && string.Compare(domainObject.GetProperty("D_DomainValue").ToString(), domainName, true) == 0;
|
||||
|
||||
DisposeObject(domainObject);
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
public string[] GetDomainAliases(string domainName)
|
||||
|
@ -779,6 +804,8 @@ namespace WebsitePanel.Providers.Mail
|
|||
domainObject.SetProperty("D_Type", 2);
|
||||
domainObject.SetProperty("D_DomainValue", domainName);
|
||||
SaveDomain(domainObject);
|
||||
|
||||
DisposeObject(domainObject);
|
||||
}
|
||||
|
||||
public void DeleteDomainAlias(string domainName, string aliasName)
|
||||
|
@ -794,7 +821,11 @@ namespace WebsitePanel.Providers.Mail
|
|||
{
|
||||
var accountObject = GetAccountObject();
|
||||
|
||||
return accountObject.Open(mailboxName) && Convert.ToInt32((object) accountObject.GetProperty("U_Type")) == (int) IceWarpAccountType.User;
|
||||
var result = accountObject.Open(mailboxName) && Convert.ToInt32((object)accountObject.GetProperty("U_Type")) == (int)IceWarpAccountType.User;
|
||||
|
||||
DisposeObject(accountObject);
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
protected class IceWarpResponderContent
|
||||
|
@ -840,7 +871,7 @@ namespace WebsitePanel.Providers.Mail
|
|||
return result;
|
||||
}
|
||||
|
||||
protected static MailAccount CreateMailAccountFromAccountObject(dynamic accountObject)
|
||||
protected MailAccount CreateMailAccountFromAccountObject(dynamic accountObject)
|
||||
{
|
||||
var mailAccount = new MailAccount
|
||||
{
|
||||
|
@ -907,7 +938,11 @@ namespace WebsitePanel.Providers.Mail
|
|||
public MailAccount GetAccount(string mailboxName)
|
||||
{
|
||||
var accountObject = GetAccountObject(mailboxName);
|
||||
return CreateMailAccountFromAccountObject(accountObject);
|
||||
var account = CreateMailAccountFromAccountObject(accountObject);
|
||||
|
||||
DisposeObject(accountObject);
|
||||
|
||||
return account;
|
||||
}
|
||||
|
||||
public void CreateAccount(MailAccount mailbox)
|
||||
|
@ -924,10 +959,12 @@ namespace WebsitePanel.Providers.Mail
|
|||
|
||||
if (accountObject.New(mailbox.Name))
|
||||
{
|
||||
accountObject.SetProperty("U_Password", mailbox.Password);
|
||||
accountObject.Save();
|
||||
UpdateAccount(mailbox);
|
||||
}
|
||||
|
||||
UpdateAccount(mailbox);
|
||||
DisposeObject(accountObject);
|
||||
}
|
||||
|
||||
public void UpdateAccount(MailAccount mailbox)
|
||||
|
@ -937,7 +974,12 @@ namespace WebsitePanel.Providers.Mail
|
|||
accountObject.SetProperty("U_Name", mailbox.FullName);
|
||||
accountObject.SetProperty("U_AccountDisabled", mailbox.IceWarpAccountState);
|
||||
accountObject.SetProperty("U_DomainAdmin", mailbox.IsDomainAdmin);
|
||||
|
||||
if (mailbox.ChangePassword)
|
||||
{
|
||||
accountObject.SetProperty("U_Password", mailbox.Password);
|
||||
}
|
||||
|
||||
accountObject.SetProperty("U_MaxBoxSize", mailbox.MaxMailboxSize * 1024);
|
||||
accountObject.SetProperty("U_MaxBox", mailbox.MaxMailboxSize > 0 ? "1" : "0");
|
||||
accountObject.SetProperty("U_MaxMessageSize", mailbox.MaxMessageSizeMegaByte * 1024);
|
||||
|
@ -1000,6 +1042,8 @@ namespace WebsitePanel.Providers.Mail
|
|||
}
|
||||
|
||||
SaveAccount(accountObject);
|
||||
|
||||
DisposeObject(accountObject);
|
||||
}
|
||||
|
||||
public void DeleteAccount(string mailboxName)
|
||||
|
@ -1014,6 +1058,8 @@ namespace WebsitePanel.Providers.Mail
|
|||
{
|
||||
Log.WriteError("Cannot delete account: " + GetErrorMessage(accountObject.LastErr), null);
|
||||
}
|
||||
|
||||
DisposeObject(accountObject);
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
@ -1024,7 +1070,11 @@ namespace WebsitePanel.Providers.Mail
|
|||
{
|
||||
var accountObject = GetAccountObject();
|
||||
|
||||
return accountObject.Open(mailAliasName);
|
||||
var result = accountObject.Open(mailAliasName);
|
||||
|
||||
DisposeObject(accountObject);
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
protected IEnumerable<string> GetAliasListFromAccountObject(dynamic accountObject)
|
||||
|
@ -1062,6 +1112,8 @@ namespace WebsitePanel.Providers.Mail
|
|||
accountObject.FindDone();
|
||||
}
|
||||
|
||||
DisposeObject(accountObject);
|
||||
|
||||
return aliasList.ToArray();
|
||||
}
|
||||
|
||||
|
@ -1071,7 +1123,11 @@ namespace WebsitePanel.Providers.Mail
|
|||
|
||||
var forwardTo = GetForwardToAddressFromAccountObject(accountObject);
|
||||
|
||||
return new MailAlias {ForwardTo = forwardTo, Name = mailAliasName};
|
||||
var result = new MailAlias { ForwardTo = forwardTo, Name = mailAliasName };
|
||||
|
||||
DisposeObject(accountObject);
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
public void CreateMailAlias(MailAlias mailAlias)
|
||||
|
@ -1088,16 +1144,18 @@ namespace WebsitePanel.Providers.Mail
|
|||
// else open account and add alias to list
|
||||
else
|
||||
{
|
||||
var accountOject = GetAccountObject(mailAlias.ForwardTo);
|
||||
var aliases = ((IEnumerable<string>) GetAliasListFromAccountObject(accountOject)).ToList();
|
||||
var accountObject = GetAccountObject(mailAlias.ForwardTo);
|
||||
var aliases = ((IEnumerable<string>)GetAliasListFromAccountObject(accountObject)).ToList();
|
||||
aliases.Add(GetEmailUser(mailAlias.Name));
|
||||
accountOject.SetProperty("U_EmailAlias", string.Join(";", aliases));
|
||||
accountObject.SetProperty("U_EmailAlias", string.Join(";", aliases));
|
||||
|
||||
SaveAccount(accountOject, "account when creating mail alias");
|
||||
SaveAccount(accountObject, "account when creating mail alias");
|
||||
|
||||
DisposeObject(accountObject);
|
||||
}
|
||||
}
|
||||
|
||||
private string GetRandowChars(string chars, int length)
|
||||
private static string GetRandowChars(string chars, int length)
|
||||
{
|
||||
var random = new Random();
|
||||
return new string(Enumerable.Repeat(chars, length).Select(s => s[random.Next(s.Length)]).ToArray());
|
||||
|
@ -1142,6 +1200,8 @@ namespace WebsitePanel.Providers.Mail
|
|||
{
|
||||
DeleteAccount(mailAliasName);
|
||||
}
|
||||
|
||||
DisposeObject(accountObject);
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
@ -1152,7 +1212,11 @@ namespace WebsitePanel.Providers.Mail
|
|||
{
|
||||
var accountObject = GetAccountObject();
|
||||
|
||||
return accountObject.Open(groupName) && Convert.ToInt32(accountObject.GetProperty("U_Type")) == 7;
|
||||
var result = accountObject.Open(groupName) && (IceWarpAccountType)Enum.Parse(typeof(IceWarpAccountType), ((object)accountObject.GetProperty("U_Type")).ToString()) == IceWarpAccountType.UserGroup;
|
||||
|
||||
DisposeObject(accountObject);
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
public MailGroup[] GetGroups(string domainName)
|
||||
|
@ -1176,7 +1240,11 @@ namespace WebsitePanel.Providers.Mail
|
|||
public MailGroup GetGroup(string groupName)
|
||||
{
|
||||
var accountObject = GetAccountObject(groupName);
|
||||
return CreateMailGroupFromAccountObject(accountObject);
|
||||
var result = CreateMailGroupFromAccountObject(accountObject);
|
||||
|
||||
DisposeObject(accountObject);
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
public void CreateGroup(MailGroup @group)
|
||||
|
@ -1185,7 +1253,7 @@ namespace WebsitePanel.Providers.Mail
|
|||
|
||||
if (accountObject.New(group.Name))
|
||||
{
|
||||
accountObject.SetProperty("U_Type", 7);
|
||||
accountObject.SetProperty("U_Type", IceWarpAccountType.UserGroup);
|
||||
accountObject.SetProperty("G_GroupwareMailDelivery", false);
|
||||
SaveAccount(accountObject, "group account");
|
||||
}
|
||||
|
@ -1195,6 +1263,8 @@ namespace WebsitePanel.Providers.Mail
|
|||
}
|
||||
|
||||
UpdateGroup(group);
|
||||
|
||||
DisposeObject(accountObject);
|
||||
}
|
||||
|
||||
public void UpdateGroup(MailGroup @group)
|
||||
|
@ -1206,6 +1276,8 @@ namespace WebsitePanel.Providers.Mail
|
|||
accountObject.SetProperty("G_ListFile_Contents", string.Join("\n", group.Members));
|
||||
|
||||
SaveAccount(accountObject, "group");
|
||||
|
||||
DisposeObject(accountObject);
|
||||
}
|
||||
|
||||
public void DeleteGroup(string groupName)
|
||||
|
@ -1220,6 +1292,8 @@ namespace WebsitePanel.Providers.Mail
|
|||
{
|
||||
Log.WriteError("Cannot delete group: " + GetErrorMessage(accountObject.LastErr), null);
|
||||
}
|
||||
|
||||
DisposeObject(accountObject);
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
@ -1230,7 +1304,11 @@ namespace WebsitePanel.Providers.Mail
|
|||
{
|
||||
var accountObject = GetAccountObject();
|
||||
|
||||
return accountObject.Open(maillistName) && (IceWarpAccountType) Enum.Parse(typeof (IceWarpAccountType), ((object) accountObject.GetProperty("U_Type")).ToString()) == IceWarpAccountType.MailingList;
|
||||
var result = accountObject.Open(maillistName) && (IceWarpAccountType)Enum.Parse(typeof(IceWarpAccountType), ((object)accountObject.GetProperty("U_Type")).ToString()) == IceWarpAccountType.MailingList;
|
||||
|
||||
DisposeObject(accountObject);
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
public MailList[] GetLists(string domainName)
|
||||
|
@ -1363,13 +1441,19 @@ namespace WebsitePanel.Providers.Mail
|
|||
break;
|
||||
}
|
||||
|
||||
DisposeObject(listServerAccountObject);
|
||||
|
||||
return mailList;
|
||||
}
|
||||
|
||||
public MailList GetList(string maillistName)
|
||||
{
|
||||
var accountObject = GetAccountObject(maillistName);
|
||||
return CreateMailListFromAccountObject(accountObject);
|
||||
var result = CreateMailListFromAccountObject(accountObject);
|
||||
|
||||
DisposeObject(accountObject);
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
public void CreateList(MailList maillist)
|
||||
|
@ -1395,6 +1479,8 @@ namespace WebsitePanel.Providers.Mail
|
|||
SaveAccount(accountObject, "mailing list");
|
||||
|
||||
UpdateList(maillist);
|
||||
|
||||
DisposeObject(accountObject);
|
||||
}
|
||||
|
||||
protected dynamic FindMatchingListServerAccount(string mailingListName, bool createListServerAccountIfNeeded)
|
||||
|
@ -1555,7 +1641,7 @@ namespace WebsitePanel.Providers.Mail
|
|||
listServerAccountObject.SetProperty("L_ListSender", maillist.Originator);
|
||||
listServerAccountObject.SetProperty("L_MaxList", maillist.SuppressCommandResponses);
|
||||
|
||||
SaveAccount(accountObject, "listserver account associated with mailing list");
|
||||
SaveAccount(listServerAccountObject, "listserver account associated with mailing list");
|
||||
}
|
||||
|
||||
public void DeleteList(string maillistName)
|
||||
|
@ -1602,8 +1688,16 @@ namespace WebsitePanel.Providers.Mail
|
|||
{
|
||||
Log.WriteError("Cannot delete mail list: " + GetErrorMessage(accountObject.LastErr), null);
|
||||
}
|
||||
|
||||
DisposeObject(accountObject);
|
||||
DisposeObject(listServerAccountObject);
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
public void Dispose()
|
||||
{
|
||||
Marshal.FinalReleaseComObject(_currentApiObject);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -153,6 +153,7 @@ namespace WebsitePanel.Portal
|
|||
if (maxMailboxSizeLimit == -1 || maxMailboxSizeLimit == 0)
|
||||
{
|
||||
MaxMailboxSizeLimitValidator.Enabled = false;
|
||||
CompareValidator1.Enabled = false;
|
||||
}
|
||||
else
|
||||
{
|
||||
|
|
|
@ -43,6 +43,7 @@ namespace WebsitePanel.Portal.ProviderControls
|
|||
secForwarding.Visible = (PanelRequest.ItemID > 0);
|
||||
OlderMailsPanel.Visible = (PanelRequest.ItemID > 0);
|
||||
secOlderMails.Visible = (PanelRequest.ItemID > 0);
|
||||
Utils.SelectListItem(ddlAccountType, "1"); // Set default account type to POP3 & IMAP
|
||||
}
|
||||
|
||||
public void BindItem(MailAccount item)
|
||||
|
@ -108,7 +109,6 @@ namespace WebsitePanel.Portal.ProviderControls
|
|||
item.ForwardingAddresses = Utils.ParseDelimitedString(txtForward.Text, ';', ' ', ',');
|
||||
item.DeleteOnForward = cbDeleteOnForward.Checked;
|
||||
item.ChangePassword = cbChangePassword.Checked;
|
||||
item.ChangePassword = cbChangePassword.Checked;
|
||||
item.IsDomainAdmin = cbDomainAdmin.Checked;
|
||||
|
||||
item.DeleteOlder = cbDeleteOlder.Checked;
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue