/// <summary>
        /// Restores server from backup.(settings,users,...).
        /// </summary>
        /// <param name="data"></param>
        public void RestoreBackUp(byte[] data)
        {
            DataSet dsAll = new DataSet();
            dsAll.ReadXml(new MemoryStream(data));

            DB_Type dbType = (DB_Type)Enum.Parse(typeof(DB_Type),dsAll.Tables["Settings"].Rows[0]["DataBaseType"].ToString());

            switch(dbType)
            {
                #region DB_Type.XML

                    case DB_Type.XML:

                        if(dsAll.Tables.Contains("Domains")){
                            DataSet dsX = new DataSet();
                            dsX.Merge(dsAll.Tables["Domains"]);
                            dsX.WriteXml(m_DataPath + "Domains.xml",XmlWriteMode.IgnoreSchema);
                        }

                        if(dsAll.Tables.Contains("Users")){
                            DataSet dsX = new DataSet();
                            dsX.Merge(dsAll.Tables["Users"]);
                            dsX.WriteXml(m_DataPath + "Users.xml",XmlWriteMode.IgnoreSchema);
                        }

                        if(dsAll.Tables.Contains("Aliases")){
                            DataSet dsX = new DataSet();
                            dsX.Merge(dsAll.Tables["Aliases"]);
                            dsX.WriteXml(m_DataPath + "Aliases.xml",XmlWriteMode.IgnoreSchema);
                        }

                        if(dsAll.Tables.Contains("Routing")){
                            DataSet dsX = new DataSet();
                            dsX.Merge(dsAll.Tables["Routing"]);
                            dsX.WriteXml(m_DataPath + "Routing.xml",XmlWriteMode.IgnoreSchema);
                        }

                        if(dsAll.Tables.Contains("Settings")){
                            DataSet dsX = new DataSet();
                            dsX.Merge(dsAll.Tables["Settings"]);
                            dsX.WriteXml(m_DataPath + "Settings.xml",XmlWriteMode.IgnoreSchema);
                        }

                        if(dsAll.Tables.Contains("Security_List")){
                            DataSet dsX = new DataSet();
                            dsX.Merge(dsAll.Tables["Security_List"]);
                            dsX.WriteXml(m_DataPath + "Security.xml",XmlWriteMode.IgnoreSchema);
                        }
                        break;

                    #endregion

                #region DB_Type.MSSQL

                    case DB_Type.MSSQL:

                        #region Clear old settings

                        using(WSqlCommand sqlCmd = new WSqlCommand(m_ConStr,"lspr_TruncateSettings")){
                            DataSet ds = sqlCmd.Execute();
                        }

                        #endregion

                        #region Restore domains

                        if(dsAll.Tables.Contains("Domains"))
                        {
                            foreach(DataRow dr in dsAll.Tables["Domains"].Rows){
                                using(WSqlCommand sqlCmd = new WSqlCommand(m_ConStr,"lspr_AddDomain")){
                                    if(dr.Table.Columns.Contains("DomainName")){
                                        sqlCmd.AddParameter("@DomainName" ,SqlDbType.NVarChar,dr["DomainName"].ToString());
                                    }
                                    if(dr.Table.Columns.Contains("Description")){
                                        sqlCmd.AddParameter("@Description",SqlDbType.NVarChar,dr["Description"].ToString());
                                    }
                                    if(dr.Table.Columns.Contains("DomainID")){
                                        sqlCmd.AddParameter("@DomainID"   ,SqlDbType.NVarChar,dr["DomainID"].ToString());
                                    }

                                    DataSet ds = sqlCmd.Execute();
                                }
                            }
                        }

                        #endregion

                        #region Restore users

                        if(dsAll.Tables.Contains("Users")){
                            foreach(DataRow dr in dsAll.Tables["Users"].Rows){
                                using(WSqlCommand sqlCmd = new WSqlCommand(m_ConStr,"lspr_AddUser")){
                                    if(dr.Table.Columns.Contains("FULLNAME")){
                                        sqlCmd.AddParameter("@FullName"    ,SqlDbType.NVarChar,dr["FULLNAME"].ToString());
                                    }
                                    if(dr.Table.Columns.Contains("USERNAME")){
                                        sqlCmd.AddParameter("@UserName"    ,SqlDbType.NVarChar,dr["USERNAME"].ToString());
                                    }
                                    if(dr.Table.Columns.Contains("PASSWORD")){
                                        sqlCmd.AddParameter("@Password"    ,SqlDbType.NVarChar,dr["PASSWORD"].ToString());
                                    }
                                    if(dr.Table.Columns.Contains("Description")){
                                        sqlCmd.AddParameter("@Description" ,SqlDbType.NVarChar,dr["Description"].ToString());
                                    }
                                    if(dr.Table.Columns.Contains("Emails")){
                                        sqlCmd.AddParameter("@Emails"      ,SqlDbType.NVarChar,dr["Emails"].ToString());
                                    }
                                    if(dr.Table.Columns.Contains("Mailbox_Size")){
                                        sqlCmd.AddParameter("@MailboxSize" ,SqlDbType.NVarChar,dr["Mailbox_Size"].ToString());
                                    }
                                    if(dr.Table.Columns.Contains("DomainID")){
                                        sqlCmd.AddParameter("@DomainID"    ,SqlDbType.NVarChar,dr["DomainID"].ToString());
                                    }
                                    if(dr.Table.Columns.Contains("UserID")){
                                        sqlCmd.AddParameter("@UserID"      ,SqlDbType.NVarChar,dr["UserID"].ToString());
                                    }
                                    if(dr.Table.Columns.Contains("RemotePop3Servers")){
                                        sqlCmd.AddParameter("@RemotePop3Servers" ,SqlDbType.Image,(byte[])dr["RemotePop3Servers"]);
                                    }

                                    DataSet ds = sqlCmd.Execute();
                                }
                            }
                        }

                        #endregion

                        #region Restore aliases

                        if(dsAll.Tables.Contains("Aliases")){
                            foreach(DataRow dr in dsAll.Tables["Aliases"].Rows){
                                using(WSqlCommand sqlCmd = new WSqlCommand(m_ConStr,"lspr_AddAlias")){
                                    if(dr.Table.Columns.Contains("AliasName")){
                                        sqlCmd.AddParameter("@AliasName"   ,SqlDbType.NVarChar,dr["AliasName"].ToString());
                                    }
                                    if(dr.Table.Columns.Contains("Description")){
                                        sqlCmd.AddParameter("@Description" ,SqlDbType.NVarChar,dr["Description"].ToString());
                                    }
                                    if(dr.Table.Columns.Contains("AliasMembers")){
                                        sqlCmd.AddParameter("@Members"     ,SqlDbType.NVarChar,dr["AliasMembers"].ToString());
                                    }
                                    if(dr.Table.Columns.Contains("DomainID")){
                                        sqlCmd.AddParameter("@DomainID"    ,SqlDbType.UniqueIdentifier,dr["DomainID"].ToString());
                                    }
                                    if(dr.Table.Columns.Contains("AliasID")){
                                        sqlCmd.AddParameter("@AliasID"    ,SqlDbType.UniqueIdentifier,dr["AliasID"].ToString());
                                    }

                                    DataSet ds = sqlCmd.Execute();
                                }
                            }
                        }

                        #endregion

                        #region Restore routing

                        if(dsAll.Tables.Contains("Routing")){
                            foreach(DataRow dr in dsAll.Tables["Routing"].Rows){
                                using(WSqlCommand sqlCmd = new WSqlCommand(m_ConStr,"lspr_AddRoute")){
                                    if(dr.Table.Columns.Contains("Pattern")){
                                        sqlCmd.AddParameter("@Pattern"   ,SqlDbType.NVarChar,dr["Pattern"].ToString());
                                    }
                                    if(dr.Table.Columns.Contains("Mailbox")){
                                        sqlCmd.AddParameter("@Mailbox" ,SqlDbType.NVarChar,dr["Mailbox"].ToString());
                                    }
                                    if(dr.Table.Columns.Contains("Description")){
                                        sqlCmd.AddParameter("@Description"     ,SqlDbType.NVarChar,dr["Description"].ToString());
                                    }
                                    if(dr.Table.Columns.Contains("DomainID")){
                                        sqlCmd.AddParameter("@DomainID"    ,SqlDbType.UniqueIdentifier,dr["DomainID"].ToString());
                                    }
                                    if(dr.Table.Columns.Contains("AliasID")){
                                        sqlCmd.AddParameter("@RouteID"    ,SqlDbType.UniqueIdentifier,dr["RouteID"].ToString());
                                    }

                                    DataSet ds = sqlCmd.Execute();
                                }
                            }
                        }

                        #endregion

                        #region Restore settings

                        if(dsAll.Tables.Contains("Settings")){
                            DataSet dsX = new DataSet();
                            dsX.Merge(dsAll.Tables["Settings"]);
                            dsX.WriteXml(m_DataPath + "Settings.xml",XmlWriteMode.IgnoreSchema);
                        }

                        #endregion

                        #region Restore security

                        if(dsAll.Tables.Contains("Security_List"))
                        {
                            foreach(DataRow dr in dsAll.Tables["Security_List"].Rows){
                                using(WSqlCommand sqlCmd = new WSqlCommand(m_ConStr,"lspr_AddSecurityEntry")){
                                    if(dr.Table.Columns.Contains("Description")){
                                        sqlCmd.AddParameter("@Description" ,SqlDbType.NVarChar,dr["Description"].ToString());
                                    }
                                    if(dr.Table.Columns.Contains("Protocol")){
                                        sqlCmd.AddParameter("@Protocol"    ,SqlDbType.NVarChar,dr["Protocol"].ToString());
                                    }
                                    if(dr.Table.Columns.Contains("Type")){
                                        sqlCmd.AddParameter("@Type"        ,SqlDbType.NVarChar,dr["Type"].ToString());
                                    }
                                    if(dr.Table.Columns.Contains("Action")){
                                        sqlCmd.AddParameter("@Action"      ,SqlDbType.NVarChar,dr["Action"].ToString());
                                    }
                                    if(dr.Table.Columns.Contains("Content")){
                                        sqlCmd.AddParameter("@Content"     ,SqlDbType.NVarChar,dr["Content"].ToString());
                                    }
                                    if(dr.Table.Columns.Contains("StartIP")){
                                        sqlCmd.AddParameter("@StartIP"     ,SqlDbType.NVarChar,dr["StartIP"].ToString());
                                    }
                                    if(dr.Table.Columns.Contains("EndIP")){
                                        sqlCmd.AddParameter("@EndIP"       ,SqlDbType.NVarChar,dr["EndIP"].ToString());
                                    }
                                    if(dr.Table.Columns.Contains("SecurityID")){
                                        sqlCmd.AddParameter("@SecurityID"  ,SqlDbType.NVarChar,dr["SecurityID"].ToString());
                                    }

                                    DataSet ds = sqlCmd.Execute();
                                }
                            }
                        }

                        #endregion

                        break;

                    #endregion

                #region DB_Type.WebServices

                    case DB_Type.WebServices:
                        using(RemoteAdmin eng = new RemoteAdmin()){
                            _Core.InitWebService(m_WebServicesUrl,m_WebServicesPwd,m_WebServicesUser,eng);

                            eng.RestoreBackUp(data);
                        }
                        break;

                #endregion
            }
        }