private void Bind()
 {
     lock (this.m_pVirtualServer.Server.LockSynchronizer)
     {
         this.m_pVirtualServer.Server.TCP_Client.TcpStream.WriteLine("GetRoutes " + this.m_pVirtualServer.VirtualServerID);
         string text = this.m_pVirtualServer.Server.ReadLine();
         if (!text.ToUpper().StartsWith("+OK"))
         {
             throw new Exception(text);
         }
         int num = Convert.ToInt32(text.Split(new char[]
         {
             ' '
         }, 2)[1]);
         MemoryStream memoryStream = new MemoryStream();
         this.m_pVirtualServer.Server.TCP_Client.TcpStream.ReadFixedCount(memoryStream, (long)num);
         DataSet dataSet = Utils.DecompressDataSet(memoryStream);
         if (dataSet.Tables.Contains("Routing"))
         {
             foreach (DataRow dataRow in dataSet.Tables["Routing"].Rows)
             {
                 RouteAction     routeAction_enum = (RouteAction)Convert.ToInt32(dataRow["Action"]);
                 RouteActionBase action           = null;
                 if (routeAction_enum == RouteAction.RouteToEmail)
                 {
                     action = new RouteAction_RouteToEmail(Convert.FromBase64String(dataRow["ActionData"].ToString()));
                 }
                 else if (routeAction_enum == RouteAction.RouteToHost)
                 {
                     action = new RouteAction_RouteToHost(Convert.FromBase64String(dataRow["ActionData"].ToString()));
                 }
                 else if (routeAction_enum == RouteAction.RouteToMailbox)
                 {
                     action = new RouteAction_RouteToMailbox(Convert.FromBase64String(dataRow["ActionData"].ToString()));
                 }
                 this.m_pRoutes.Add(new Route(this, dataRow["RouteID"].ToString(), Convert.ToInt64(dataRow["Cost"]), dataRow["Description"].ToString(), dataRow["Pattern"].ToString(), Convert.ToBoolean(dataRow["Enabled"].ToString()), action));
             }
         }
     }
 }
        public void Restore(Stream stream, RestoreFlags_enum restoreFlags)
        {
            DataSet dataSet = new DataSet();

            dataSet.ReadXml(stream);
            if (dataSet.Tables.Contains("Settings"))
            {
                this.SystemSettings.LoadSettings(dataSet);
                this.SystemSettings.Commit();
            }
            if (dataSet.Tables.Contains("Domains"))
            {
                foreach (DataRow dataRow in dataSet.Tables["Domains"].Rows)
                {
                    if (this.Domains.Contains(dataRow["DomainName"].ToString()))
                    {
                        if ((restoreFlags & RestoreFlags_enum.Replace) != (RestoreFlags_enum)0)
                        {
                        }
                    }
                    else if ((restoreFlags & RestoreFlags_enum.Add) != (RestoreFlags_enum)0)
                    {
                        this.Domains.Add(dataRow["DomainName"].ToString(), dataRow["Description"].ToString());
                    }
                }
            }
            if (dataSet.Tables.Contains("Users"))
            {
                foreach (DataRow dataRow2 in dataSet.Tables["Users"].Rows)
                {
                    User user = null;
                    bool flag = false;
                    if (this.Users.Contains(dataRow2["UserName"].ToString()))
                    {
                        if ((restoreFlags & RestoreFlags_enum.Replace) != (RestoreFlags_enum)0)
                        {
                            user                    = this.Users.GetUserByName(dataRow2["UserName"].ToString());
                            user.UserName           = dataRow2["UserName"].ToString();
                            user.FullName           = dataRow2["FullName"].ToString();
                            user.Password           = dataRow2["Password"].ToString();
                            user.Description        = dataRow2["Description"].ToString();
                            user.MaximumMailboxSize = ConvertEx.ToInt32(dataRow2["Mailbox_Size"]);
                            user.Enabled            = ConvertEx.ToBoolean(dataRow2["Enabled"]);
                            user.Permissions        = (UserPermissions)ConvertEx.ToInt32(dataRow2["Permissions"]);
                            user.Commit();
                            string[] array = user.EmailAddresses.ToArray();
                            for (int i = 0; i < array.Length; i++)
                            {
                                string emailAddress = array[i];
                                user.EmailAddresses.Remove(emailAddress);
                            }
                            UserRemoteServer[] array2 = user.RemoteServers.ToArray();
                            for (int j = 0; j < array2.Length; j++)
                            {
                                UserRemoteServer remoteServer = array2[j];
                                user.RemoteServers.Remove(remoteServer);
                            }
                            UserMessageRule[] array3 = user.MessageRules.ToArray();
                            for (int k = 0; k < array3.Length; k++)
                            {
                                UserMessageRule rule = array3[k];
                                user.MessageRules.Remove(rule);
                            }
                            flag = true;
                        }
                    }
                    else if ((restoreFlags & RestoreFlags_enum.Add) != (RestoreFlags_enum)0)
                    {
                        user = this.Users.Add(dataRow2["UserName"].ToString(), dataRow2["FullName"].ToString(), dataRow2["Password"].ToString(), dataRow2["Description"].ToString(), ConvertEx.ToInt32(dataRow2["Mailbox_Size"]), ConvertEx.ToBoolean(dataRow2["Enabled"]), (UserPermissions)ConvertEx.ToInt32(dataRow2["Permissions"]));
                        flag = true;
                    }
                    if (flag)
                    {
                        if (dataSet.Tables.Contains("User_EmailAddresses"))
                        {
                            foreach (DataRowView dataRowView in new DataView(dataSet.Tables["User_EmailAddresses"])
                            {
                                RowFilter = "UserID='" + dataRow2["UserID"].ToString() + "'"
                            })
                            {
                                user.EmailAddresses.Add(dataRowView["EmailAddress"].ToString());
                            }
                        }
                        if (dataSet.Tables.Contains("User_RemoteServers"))
                        {
                            foreach (DataRowView dataRowView2 in new DataView(dataSet.Tables["User_RemoteServers"])
                            {
                                RowFilter = "UserID='" + dataRow2["UserID"].ToString() + "'"
                            })
                            {
                                user.RemoteServers.Add(dataRowView2["Description"].ToString(), dataRowView2["RemoteServer"].ToString(), ConvertEx.ToInt32(dataRowView2["RemotePort"]), ConvertEx.ToBoolean(dataRowView2["UseSSL"]), dataRowView2["RemoteUserName"].ToString(), dataRowView2["RemotePassword"].ToString(), ConvertEx.ToBoolean(dataRowView2["Enabled"]));
                            }
                        }
                        if (dataSet.Tables.Contains("User_MessageRules"))
                        {
                            foreach (DataRowView dataRowView3 in new DataView(dataSet.Tables["User_MessageRules"])
                            {
                                RowFilter = "UserID='" + dataRow2["UserID"].ToString() + "'"
                            })
                            {
                                UserMessageRule userMessageRule = user.MessageRules.Add(ConvertEx.ToBoolean(dataRowView3["Enabled"]), dataRowView3["Description"].ToString(), dataRowView3["MatchExpression"].ToString(), (GlobalMessageRule_CheckNextRule)ConvertEx.ToInt32(dataRowView3["CheckNextRuleIf"]));
                                if (dataSet.Tables.Contains("User_MessageRuleActions"))
                                {
                                    foreach (DataRowView dataRowView4 in new DataView(dataSet.Tables["User_MessageRuleActions"])
                                    {
                                        RowFilter = string.Concat(new string[]
                                        {
                                            "UserID='",
                                            dataRow2["UserID"].ToString(),
                                            "' AND RuleID='",
                                            dataRowView3["RuleID"].ToString(),
                                            "'"
                                        })
                                    })
                                    {
                                        userMessageRule.Actions.Add(dataRowView4["ActionID"].ToString(), dataRowView4["Description"].ToString(), (UserMessageRuleActionType)Convert.ToInt32(dataRowView4["ActionType"]), Convert.FromBase64String(dataRowView4["ActionData"].ToString()), true);
                                    }
                                }
                            }
                        }
                    }
                }
            }
            if (dataSet.Tables.Contains("Groups"))
            {
                foreach (DataRow dataRow3 in dataSet.Tables["Groups"].Rows)
                {
                    bool flag2 = false;
                    if (this.Groups.Contains(dataRow3["GroupName"].ToString()) && (restoreFlags & RestoreFlags_enum.Replace) != (RestoreFlags_enum)0)
                    {
                        this.Groups.Remove(this.Groups.GetGroupByName(dataRow3["GroupName"].ToString()));
                        flag2 = true;
                    }
                    if (!this.Groups.Contains(dataRow3["GroupName"].ToString()) && (flag2 || (restoreFlags & RestoreFlags_enum.Add) != (RestoreFlags_enum)0))
                    {
                        Group group = this.Groups.Add(dataRow3["GroupName"].ToString(), dataRow3["Description"].ToString(), ConvertEx.ToBoolean(dataRow3["Enabled"]));
                        if (dataSet.Tables.Contains("Group_Members"))
                        {
                            foreach (DataRowView dataRowView5 in new DataView(dataSet.Tables["Group_Members"])
                            {
                                RowFilter = "GroupID='" + dataRow3["GroupID"].ToString() + "'"
                            })
                            {
                                group.Members.Add(dataRowView5["UserOrGroup"].ToString());
                            }
                        }
                    }
                }
            }
            if (dataSet.Tables.Contains("MailingLists"))
            {
                foreach (DataRow dataRow4 in dataSet.Tables["MailingLists"].Rows)
                {
                    bool flag3 = false;
                    if (this.MailingLists.Contains(dataRow4["MailingListName"].ToString()) && (restoreFlags & RestoreFlags_enum.Replace) != (RestoreFlags_enum)0)
                    {
                        this.MailingLists.Remove(this.MailingLists.GetMailingListByName(dataRow4["MailingListName"].ToString()));
                        flag3 = true;
                    }
                    if (!this.MailingLists.Contains(dataRow4["MailingListName"].ToString()) && (flag3 || (restoreFlags & RestoreFlags_enum.Add) != (RestoreFlags_enum)0))
                    {
                        MailingList mailingList = this.MailingLists.Add(dataRow4["MailingListName"].ToString(), dataRow4["Description"].ToString(), ConvertEx.ToBoolean(dataRow4["Enabled"]));
                        if (dataSet.Tables.Contains("MailingList_Members"))
                        {
                            foreach (DataRowView dataRowView6 in new DataView(dataSet.Tables["MailingList_Members"])
                            {
                                RowFilter = "MailingListID='" + dataRow4["MailingListID"].ToString() + "'"
                            })
                            {
                                mailingList.Members.Add(dataRowView6["Address"].ToString());
                            }
                        }
                        if (dataSet.Tables.Contains("MailingList_ACL"))
                        {
                            foreach (DataRowView dataRowView7 in new DataView(dataSet.Tables["MailingList_ACL"])
                            {
                                RowFilter = "MailingListID='" + dataRow4["MailingListID"].ToString() + "'"
                            })
                            {
                                mailingList.ACL.Add(dataRowView7["UserOrGroup"].ToString());
                            }
                        }
                    }
                }
            }
            if (dataSet.Tables.Contains("Routing"))
            {
                foreach (DataRow dataRow5 in dataSet.Tables["Routing"].Rows)
                {
                    bool flag4 = false;
                    if (this.Routes.ContainsPattern(dataRow5["Pattern"].ToString()) && (restoreFlags & RestoreFlags_enum.Replace) != (RestoreFlags_enum)0)
                    {
                        this.Routes.Remove(this.Routes.GetRouteByPattern(dataRow5["Pattern"].ToString()));
                        flag4 = true;
                    }
                    if (!this.Routes.ContainsPattern(dataRow5["Pattern"].ToString()) && (flag4 || (restoreFlags & RestoreFlags_enum.Add) != (RestoreFlags_enum)0))
                    {
                        RouteAction     routeAction_enum = (RouteAction)Convert.ToInt32(dataRow5["Action"]);
                        RouteActionBase action           = null;
                        if (routeAction_enum == RouteAction.RouteToEmail)
                        {
                            action = new RouteAction_RouteToEmail(Convert.FromBase64String(dataRow5["ActionData"].ToString()));
                        }
                        else if (routeAction_enum == RouteAction.RouteToHost)
                        {
                            action = new RouteAction_RouteToHost(Convert.FromBase64String(dataRow5["ActionData"].ToString()));
                        }
                        else if (routeAction_enum == RouteAction.RouteToMailbox)
                        {
                            action = new RouteAction_RouteToMailbox(Convert.FromBase64String(dataRow5["ActionData"].ToString()));
                        }
                        this.Routes.Add(dataRow5["Description"].ToString(), dataRow5["Pattern"].ToString(), ConvertEx.ToBoolean(dataRow5["Enabled"]), action);
                    }
                }
            }
            if (dataSet.Tables.Contains("GlobalMessageRules"))
            {
                IEnumerator enumerator;
                if ((restoreFlags & RestoreFlags_enum.Replace) != (RestoreFlags_enum)0)
                {
                    enumerator = this.GlobalMessageRules.GetEnumerator();
                    try
                    {
                        while (enumerator.MoveNext())
                        {
                            GlobalMessageRule rule2 = (GlobalMessageRule)enumerator.Current;
                            this.GlobalMessageRules.Remove(rule2);
                        }
                    }
                    finally
                    {
                        IDisposable disposable = enumerator as IDisposable;
                        if (disposable != null)
                        {
                            disposable.Dispose();
                        }
                    }
                }
                DataView dataView = new DataView(dataSet.Tables["GlobalMessageRules"]);
                enumerator = dataView.GetEnumerator();
                try
                {
                    while (enumerator.MoveNext())
                    {
                        DataRowView       dataRowView8      = (DataRowView)enumerator.Current;
                        GlobalMessageRule globalMessageRule = this.GlobalMessageRules.Add(ConvertEx.ToBoolean(dataRowView8["Enabled"]), dataRowView8["Description"].ToString(), dataRowView8["MatchExpression"].ToString(), (GlobalMessageRule_CheckNextRule)ConvertEx.ToInt32(dataRowView8["CheckNextRuleIf"]));
                        if (dataSet.Tables.Contains("GlobalMessageRuleActions"))
                        {
                            foreach (DataRowView dataRowView9 in new DataView(dataSet.Tables["GlobalMessageRuleActions"])
                            {
                                RowFilter = "RuleID='" + dataRowView8["RuleID"].ToString() + "'"
                            })
                            {
                                globalMessageRule.Actions.Add(dataRowView9["ActionID"].ToString(), dataRowView9["Description"].ToString(), (GlobalMessageRuleActionType)Convert.ToInt32(dataRowView9["ActionType"]), Convert.FromBase64String(dataRowView9["ActionData"].ToString()), true);
                            }
                        }
                    }
                }
                finally
                {
                    IDisposable disposable = enumerator as IDisposable;
                    if (disposable != null)
                    {
                        disposable.Dispose();
                    }
                }
            }
            if (dataSet.Tables.Contains("IP_Security"))
            {
                IPSecurity[] array4 = this.IpSecurity.ToArray();
                for (int i = 0; i < array4.Length; i++)
                {
                    IPSecurity entry = array4[i];
                    this.IpSecurity.Remove(entry);
                }
                foreach (DataRow dataRow6 in dataSet.Tables["IP_Security"].Rows)
                {
                    this.IpSecurity.Add(ConvertEx.ToBoolean(dataRow6["Enabled"]), dataRow6["Description"].ToString(), (ServiceKind)ConvertEx.ToInt32(dataRow6["Service"]), (IPSecurityAction)ConvertEx.ToInt32(dataRow6["Action"]), IPAddress.Parse(dataRow6["StartIP"].ToString()), IPAddress.Parse(dataRow6["EndIP"].ToString()));
                }
            }
            if (dataSet.Tables.Contains("Filters"))
            {
                Filter[] array5 = this.Filters.ToArray();
                for (int i = 0; i < array5.Length; i++)
                {
                    Filter filter = array5[i];
                    this.Filters.Remove(filter);
                }
                foreach (DataRow dataRow7 in dataSet.Tables["Filters"].Rows)
                {
                    this.Filters.Add(ConvertEx.ToBoolean(dataRow7["Enabled"]), dataRow7["Description"].ToString(), dataRow7["Assembly"].ToString(), dataRow7["ClassName"].ToString());
                }
            }
            if (dataSet.Tables.Contains("UsersDefaultFolders"))
            {
                foreach (DataRow dataRow8 in dataSet.Tables["UsersDefaultFolders"].Rows)
                {
                    if (this.UsersDefaultFolders.Contains(dataRow8["FolderName"].ToString()))
                    {
                        if ((restoreFlags & RestoreFlags_enum.Replace) != (RestoreFlags_enum)0)
                        {
                            this.UsersDefaultFolders.Remove(this.UsersDefaultFolders.GetFolderByName(dataRow8["FolderName"].ToString()));
                            this.UsersDefaultFolders.Add(dataRow8["FolderName"].ToString(), ConvertEx.ToBoolean(dataRow8["Permanent"]));
                        }
                    }
                    else if ((restoreFlags & RestoreFlags_enum.Add) != (RestoreFlags_enum)0)
                    {
                        this.UsersDefaultFolders.Add(dataRow8["FolderName"].ToString(), ConvertEx.ToBoolean(dataRow8["Permanent"]));
                    }
                }
            }
        }